{"diffoscope-json-version": 1, "source1": "/input1", "source2": "/input2", "unified_diff": null, "details": [{"source1": "zipinfo {}", "source2": "zipinfo {}", "unified_diff": "@@ -1,38 +1,38 @@\n-Zip file size: 109199 bytes, number of entries: 36\n+Zip file size: 111120 bytes, number of entries: 36\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/\n -rw----     2.0 fat    10117 bX stor 70-Jan-01 00:00 META-INF/DEPENDENCIES\n -rw----     2.0 fat    11358 bX stor 70-Jan-01 00:00 META-INF/LICENSE\n -rw----     2.0 fat       25 bX stor 70-Jan-01 00:00 META-INF/MANIFEST.MF\n -rw----     2.0 fat      177 bX stor 70-Jan-01 00:00 META-INF/NOTICE\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/dubbo/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/dubbo/internal/\n -rw----     2.0 fat       59 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.remoting.etcd.EtcdTransporter\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/maven/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/dubbo-remoting-etcd3/\n -rw----     2.0 fat        0 bX stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/dubbo-remoting-etcd3/pom.properties\n--rw----     2.0 fat     3689 bX stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/dubbo-remoting-etcd3/pom.xml\n+-rw----     2.0 fat     3585 bX stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/dubbo-remoting-etcd3/pom.xml\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/remoting/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/\n--rw----     2.0 fat     1578 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/AbstractRetryPolicy.java\n+-rw----     2.0 fat     1623 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/AbstractRetryPolicy.java\n -rw----     2.0 fat      988 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/ChildListener.java\n--rw----     2.0 fat     1737 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/Constants.java\n--rw----     2.0 fat     6379 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/EtcdClient.java\n--rw----     2.0 fat     1975 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/EtcdTransporter.java\n--rw----     2.0 fat     1243 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/RetryPolicy.java\n+-rw----     2.0 fat     1792 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/Constants.java\n+-rw----     2.0 fat     6570 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/EtcdClient.java\n+-rw----     2.0 fat     2022 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/EtcdTransporter.java\n+-rw----     2.0 fat     1274 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/RetryPolicy.java\n -rw----     2.0 fat      996 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/StateListener.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/jetcd/\n--rw----     2.0 fat     1132 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/jetcd/ConnectionStateListener.java\n--rw----     2.0 fat    16648 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/jetcd/JEtcdClient.java\n--rw----     2.0 fat    28360 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/jetcd/JEtcdClientWrapper.java\n--rw----     2.0 fat     1152 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/jetcd/JEtcdTransporter.java\n--rw----     2.0 fat     3433 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/jetcd/RetryLoops.java\n+-rw----     2.0 fat     1162 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/jetcd/ConnectionStateListener.java\n+-rw----     2.0 fat    17121 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/jetcd/JEtcdClient.java\n+-rw----     2.0 fat    29112 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/jetcd/JEtcdClientWrapper.java\n+-rw----     2.0 fat     1182 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/jetcd/JEtcdTransporter.java\n+-rw----     2.0 fat     3532 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/jetcd/RetryLoops.java\n -rw----     2.0 fat     1386 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/jetcd/RetryNTimes.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/option/\n--rw----     2.0 fat     2923 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/option/OptionUtil.java\n+-rw----     2.0 fat     3001 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/option/OptionUtil.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/support/\n--rw----     2.0 fat     7250 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/support/AbstractEtcdClient.java\n-36 files, 102605 bytes uncompressed, 102605 bytes compressed:  0.0%\n+-rw----     2.0 fat     7444 bX stor 70-Jan-01 00:00 org/apache/dubbo/remoting/etcd/support/AbstractEtcdClient.java\n+36 files, 104526 bytes uncompressed, 104526 bytes compressed:  0.0%\n"}, {"source1": "zipdetails --redact --scan --utc {}", "source2": "zipdetails --redact --scan --utc {}", "unified_diff": "@@ -312,1678 +312,1678 @@\n #\n 058DB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n 058DD   Length              0005 (5)\n 058DF   Flags               01 (1) 'Modification'\n 058E0   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n 058E4 PAYLOAD\n \n-0674D DATA DESCRIPTOR       08074B50 (134695760)\n-06751 CRC                   FACEEC94 (4207864980)\n-06755 Compressed Size       00000E69 (3689)\n-06759 Uncompressed Size     00000E69 (3689)\n-\n-0675D LOCAL HEADER #14      04034B50 (67324752)\n-06761 Extract Zip Spec      14 (20) '2.0'\n-06762 Extract OS            00 (0) 'MS-DOS'\n-06763 General Purpose Flag  0000 (0)\n-06765 Compression Method    0000 (0) 'Stored'\n-06767 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0676B CRC                   00000000 (0)\n-0676F Compressed Size       00000000 (0)\n-06773 Uncompressed Size     00000000 (0)\n-06777 Filename Length       0004 (4)\n-06779 Extra Length          0009 (9)\n-0677B Filename              'XXXX'\n-#\n-# WARNING: Offset 0x677B: Filename 'XXXX'\n-#          Zero length filename\n-#\n-0677F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-06781   Length              0005 (5)\n-06783   Flags               01 (1) 'Modification'\n-06784   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-06788 LOCAL HEADER #15      04034B50 (67324752)\n-0678C Extract Zip Spec      14 (20) '2.0'\n-0678D Extract OS            00 (0) 'MS-DOS'\n-0678E General Purpose Flag  0000 (0)\n-06790 Compression Method    0000 (0) 'Stored'\n-06792 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-06796 CRC                   00000000 (0)\n-0679A Compressed Size       00000000 (0)\n-0679E Uncompressed Size     00000000 (0)\n-067A2 Filename Length       000B (11)\n-067A4 Extra Length          0009 (9)\n-067A6 Filename              'XXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x67A6: Filename 'XXXXXXXXXXX'\n-#          Zero length filename\n-#\n-067B1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-067B3   Length              0005 (5)\n-067B5   Flags               01 (1) 'Modification'\n-067B6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-067BA LOCAL HEADER #16      04034B50 (67324752)\n-067BE Extract Zip Spec      14 (20) '2.0'\n-067BF Extract OS            00 (0) 'MS-DOS'\n-067C0 General Purpose Flag  0000 (0)\n-067C2 Compression Method    0000 (0) 'Stored'\n-067C4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-067C8 CRC                   00000000 (0)\n-067CC Compressed Size       00000000 (0)\n-067D0 Uncompressed Size     00000000 (0)\n-067D4 Filename Length       0011 (17)\n-067D6 Extra Length          0009 (9)\n-067D8 Filename              'XXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x67D8: Filename 'XXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-067E9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-067EB   Length              0005 (5)\n-067ED   Flags               01 (1) 'Modification'\n-067EE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-067F2 LOCAL HEADER #17      04034B50 (67324752)\n-067F6 Extract Zip Spec      14 (20) '2.0'\n-067F7 Extract OS            00 (0) 'MS-DOS'\n-067F8 General Purpose Flag  0000 (0)\n-067FA Compression Method    0000 (0) 'Stored'\n-067FC Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-06800 CRC                   00000000 (0)\n-06804 Compressed Size       00000000 (0)\n-06808 Uncompressed Size     00000000 (0)\n-0680C Filename Length       001A (26)\n-0680E Extra Length          0009 (9)\n-06810 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6810: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0682A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0682C   Length              0005 (5)\n-0682E   Flags               01 (1) 'Modification'\n-0682F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-06833 LOCAL HEADER #18      04034B50 (67324752)\n-06837 Extract Zip Spec      14 (20) '2.0'\n-06838 Extract OS            00 (0) 'MS-DOS'\n-06839 General Purpose Flag  0000 (0)\n-0683B Compression Method    0000 (0) 'Stored'\n-0683D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-06841 CRC                   00000000 (0)\n-06845 Compressed Size       00000000 (0)\n-06849 Uncompressed Size     00000000 (0)\n-0684D Filename Length       001F (31)\n-0684F Extra Length          0009 (9)\n-06851 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6851: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-06870 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-06872   Length              0005 (5)\n-06874   Flags               01 (1) 'Modification'\n-06875   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-06879 LOCAL HEADER #19      04034B50 (67324752)\n-0687D Extract Zip Spec      14 (20) '2.0'\n-0687E Extract OS            00 (0) 'MS-DOS'\n-0687F General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-06881 Compression Method    0000 (0) 'Stored'\n-06883 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-06887 CRC                   00000000 (0)\n-0688B Compressed Size       00000000 (0)\n-0688F Uncompressed Size     00000000 (0)\n-06893 Filename Length       0037 (55)\n-06895 Extra Length          0009 (9)\n-06897 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6897: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-068CE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-068D0   Length              0005 (5)\n-068D2   Flags               01 (1) 'Modification'\n-068D3   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-068D7 PAYLOAD\n-\n-06F01 DATA DESCRIPTOR       08074B50 (134695760)\n-06F05 CRC                   36F8F065 (922284133)\n-06F09 Compressed Size       0000062A (1578)\n-06F0D Uncompressed Size     0000062A (1578)\n-\n-06F11 LOCAL HEADER #20      04034B50 (67324752)\n-06F15 Extract Zip Spec      14 (20) '2.0'\n-06F16 Extract OS            00 (0) 'MS-DOS'\n-06F17 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-06F19 Compression Method    0000 (0) 'Stored'\n-06F1B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-06F1F CRC                   00000000 (0)\n-06F23 Compressed Size       00000000 (0)\n-06F27 Uncompressed Size     00000000 (0)\n-06F2B Filename Length       0031 (49)\n-06F2D Extra Length          0009 (9)\n-06F2F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6F2F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-06F60 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-06F62   Length              0005 (5)\n-06F64   Flags               01 (1) 'Modification'\n-06F65   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-06F69 PAYLOAD\n-\n-07345 DATA DESCRIPTOR       08074B50 (134695760)\n-07349 CRC                   CD8B51D1 (3448459729)\n-0734D Compressed Size       000003DC (988)\n-07351 Uncompressed Size     000003DC (988)\n-\n-07355 LOCAL HEADER #21      04034B50 (67324752)\n-07359 Extract Zip Spec      14 (20) '2.0'\n-0735A Extract OS            00 (0) 'MS-DOS'\n-0735B General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0735D Compression Method    0000 (0) 'Stored'\n-0735F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-07363 CRC                   00000000 (0)\n-07367 Compressed Size       00000000 (0)\n-0736B Uncompressed Size     00000000 (0)\n-0736F Filename Length       002D (45)\n-07371 Extra Length          0009 (9)\n-07373 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x7373: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-073A0 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-073A2   Length              0005 (5)\n-073A4   Flags               01 (1) 'Modification'\n-073A5   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-073A9 PAYLOAD\n-\n-07A72 DATA DESCRIPTOR       08074B50 (134695760)\n-07A76 CRC                   123318DF (305338591)\n-07A7A Compressed Size       000006C9 (1737)\n-07A7E Uncompressed Size     000006C9 (1737)\n-\n-07A82 LOCAL HEADER #22      04034B50 (67324752)\n-07A86 Extract Zip Spec      14 (20) '2.0'\n-07A87 Extract OS            00 (0) 'MS-DOS'\n-07A88 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-07A8A Compression Method    0000 (0) 'Stored'\n-07A8C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-07A90 CRC                   00000000 (0)\n-07A94 Compressed Size       00000000 (0)\n-07A98 Uncompressed Size     00000000 (0)\n-07A9C Filename Length       002E (46)\n-07A9E Extra Length          0009 (9)\n-07AA0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x7AA0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-07ACE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-07AD0   Length              0005 (5)\n-07AD2   Flags               01 (1) 'Modification'\n-07AD3   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-07AD7 PAYLOAD\n-\n-093C2 DATA DESCRIPTOR       08074B50 (134695760)\n-093C6 CRC                   6B994ABC (1805208252)\n-093CA Compressed Size       000018EB (6379)\n-093CE Uncompressed Size     000018EB (6379)\n-\n-093D2 LOCAL HEADER #23      04034B50 (67324752)\n-093D6 Extract Zip Spec      14 (20) '2.0'\n-093D7 Extract OS            00 (0) 'MS-DOS'\n-093D8 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-093DA Compression Method    0000 (0) 'Stored'\n-093DC Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-093E0 CRC                   00000000 (0)\n-093E4 Compressed Size       00000000 (0)\n-093E8 Uncompressed Size     00000000 (0)\n-093EC Filename Length       0033 (51)\n-093EE Extra Length          0009 (9)\n-093F0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x93F0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-09423 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-09425   Length              0005 (5)\n-09427   Flags               01 (1) 'Modification'\n-09428   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0942C PAYLOAD\n-\n-09BE3 DATA DESCRIPTOR       08074B50 (134695760)\n-09BE7 CRC                   387B0FF7 (947589111)\n-09BEB Compressed Size       000007B7 (1975)\n-09BEF Uncompressed Size     000007B7 (1975)\n-\n-09BF3 LOCAL HEADER #24      04034B50 (67324752)\n-09BF7 Extract Zip Spec      14 (20) '2.0'\n-09BF8 Extract OS            00 (0) 'MS-DOS'\n-09BF9 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-09BFB Compression Method    0000 (0) 'Stored'\n-09BFD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-09C01 CRC                   00000000 (0)\n-09C05 Compressed Size       00000000 (0)\n-09C09 Uncompressed Size     00000000 (0)\n-09C0D Filename Length       002F (47)\n-09C0F Extra Length          0009 (9)\n-09C11 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x9C11: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-09C40 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-09C42   Length              0005 (5)\n-09C44   Flags               01 (1) 'Modification'\n-09C45   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-09C49 PAYLOAD\n-\n-0A124 DATA DESCRIPTOR       08074B50 (134695760)\n-0A128 CRC                   0F6205B4 (258082228)\n-0A12C Compressed Size       000004DB (1243)\n-0A130 Uncompressed Size     000004DB (1243)\n-\n-0A134 LOCAL HEADER #25      04034B50 (67324752)\n-0A138 Extract Zip Spec      14 (20) '2.0'\n-0A139 Extract OS            00 (0) 'MS-DOS'\n-0A13A General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0A13C Compression Method    0000 (0) 'Stored'\n-0A13E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0A142 CRC                   00000000 (0)\n-0A146 Compressed Size       00000000 (0)\n-0A14A Uncompressed Size     00000000 (0)\n-0A14E Filename Length       0031 (49)\n-0A150 Extra Length          0009 (9)\n-0A152 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xA152: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0A183 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0A185   Length              0005 (5)\n-0A187   Flags               01 (1) 'Modification'\n-0A188   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0A18C PAYLOAD\n-\n-0A570 DATA DESCRIPTOR       08074B50 (134695760)\n-0A574 CRC                   6ADC9301 (1792840449)\n-0A578 Compressed Size       000003E4 (996)\n-0A57C Uncompressed Size     000003E4 (996)\n-\n-0A580 LOCAL HEADER #26      04034B50 (67324752)\n-0A584 Extract Zip Spec      14 (20) '2.0'\n-0A585 Extract OS            00 (0) 'MS-DOS'\n-0A586 General Purpose Flag  0000 (0)\n-0A588 Compression Method    0000 (0) 'Stored'\n-0A58A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0A58E CRC                   00000000 (0)\n-0A592 Compressed Size       00000000 (0)\n-0A596 Uncompressed Size     00000000 (0)\n-0A59A Filename Length       0025 (37)\n-0A59C Extra Length          0009 (9)\n-0A59E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xA59E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0A5C3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0A5C5   Length              0005 (5)\n-0A5C7   Flags               01 (1) 'Modification'\n-0A5C8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0A5CC LOCAL HEADER #27      04034B50 (67324752)\n-0A5D0 Extract Zip Spec      14 (20) '2.0'\n-0A5D1 Extract OS            00 (0) 'MS-DOS'\n-0A5D2 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0A5D4 Compression Method    0000 (0) 'Stored'\n-0A5D6 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0A5DA CRC                   00000000 (0)\n-0A5DE Compressed Size       00000000 (0)\n-0A5E2 Uncompressed Size     00000000 (0)\n-0A5E6 Filename Length       0041 (65)\n-0A5E8 Extra Length          0009 (9)\n-0A5EA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xA5EA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0A62B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0A62D   Length              0005 (5)\n-0A62F   Flags               01 (1) 'Modification'\n-0A630   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0A634 PAYLOAD\n-\n-0AAA0 DATA DESCRIPTOR       08074B50 (134695760)\n-0AAA4 CRC                   3F422686 (1061299846)\n-0AAA8 Compressed Size       0000046C (1132)\n-0AAAC Uncompressed Size     0000046C (1132)\n-\n-0AAB0 LOCAL HEADER #28      04034B50 (67324752)\n-0AAB4 Extract Zip Spec      14 (20) '2.0'\n-0AAB5 Extract OS            00 (0) 'MS-DOS'\n-0AAB6 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0AAB8 Compression Method    0000 (0) 'Stored'\n-0AABA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0AABE CRC                   00000000 (0)\n-0AAC2 Compressed Size       00000000 (0)\n-0AAC6 Uncompressed Size     00000000 (0)\n-0AACA Filename Length       0035 (53)\n-0AACC Extra Length          0009 (9)\n-0AACE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xAACE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0AB03 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0AB05   Length              0005 (5)\n-0AB07   Flags               01 (1) 'Modification'\n-0AB08   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0AB0C PAYLOAD\n-\n-0EC14 DATA DESCRIPTOR       08074B50 (134695760)\n-0EC18 CRC                   A75036DE (2807051998)\n-0EC1C Compressed Size       00004108 (16648)\n-0EC20 Uncompressed Size     00004108 (16648)\n-\n-0EC24 LOCAL HEADER #29      04034B50 (67324752)\n-0EC28 Extract Zip Spec      14 (20) '2.0'\n-0EC29 Extract OS            00 (0) 'MS-DOS'\n-0EC2A General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0EC2C Compression Method    0000 (0) 'Stored'\n-0EC2E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0EC32 CRC                   00000000 (0)\n-0EC36 Compressed Size       00000000 (0)\n-0EC3A Uncompressed Size     00000000 (0)\n-0EC3E Filename Length       003C (60)\n-0EC40 Extra Length          0009 (9)\n-0EC42 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xEC42: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0EC7E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0EC80   Length              0005 (5)\n-0EC82   Flags               01 (1) 'Modification'\n-0EC83   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0EC87 PAYLOAD\n-\n-15B4F DATA DESCRIPTOR       08074B50 (134695760)\n-15B53 CRC                   F1F2D150 (4059222352)\n-15B57 Compressed Size       00006EC8 (28360)\n-15B5B Uncompressed Size     00006EC8 (28360)\n-\n-15B5F LOCAL HEADER #30      04034B50 (67324752)\n-15B63 Extract Zip Spec      14 (20) '2.0'\n-15B64 Extract OS            00 (0) 'MS-DOS'\n-15B65 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-15B67 Compression Method    0000 (0) 'Stored'\n-15B69 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-15B6D CRC                   00000000 (0)\n-15B71 Compressed Size       00000000 (0)\n-15B75 Uncompressed Size     00000000 (0)\n-15B79 Filename Length       003A (58)\n-15B7B Extra Length          0009 (9)\n-15B7D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x15B7D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-15BB7 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-15BB9   Length              0005 (5)\n-15BBB   Flags               01 (1) 'Modification'\n-15BBC   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-15BC0 PAYLOAD\n-\n-16040 DATA DESCRIPTOR       08074B50 (134695760)\n-16044 CRC                   F823DAB1 (4163099313)\n-16048 Compressed Size       00000480 (1152)\n-1604C Uncompressed Size     00000480 (1152)\n-\n-16050 LOCAL HEADER #31      04034B50 (67324752)\n-16054 Extract Zip Spec      14 (20) '2.0'\n-16055 Extract OS            00 (0) 'MS-DOS'\n-16056 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-16058 Compression Method    0000 (0) 'Stored'\n-1605A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1605E CRC                   00000000 (0)\n-16062 Compressed Size       00000000 (0)\n-16066 Uncompressed Size     00000000 (0)\n-1606A Filename Length       0034 (52)\n-1606C Extra Length          0009 (9)\n-1606E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1606E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-160A2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-160A4   Length              0005 (5)\n-160A6   Flags               01 (1) 'Modification'\n-160A7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-160AB PAYLOAD\n-\n-16E14 DATA DESCRIPTOR       08074B50 (134695760)\n-16E18 CRC                   0B4932D9 (189346521)\n-16E1C Compressed Size       00000D69 (3433)\n-16E20 Uncompressed Size     00000D69 (3433)\n-\n-16E24 LOCAL HEADER #32      04034B50 (67324752)\n-16E28 Extract Zip Spec      14 (20) '2.0'\n-16E29 Extract OS            00 (0) 'MS-DOS'\n-16E2A General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-16E2C Compression Method    0000 (0) 'Stored'\n-16E2E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-16E32 CRC                   00000000 (0)\n-16E36 Compressed Size       00000000 (0)\n-16E3A Uncompressed Size     00000000 (0)\n-16E3E Filename Length       0035 (53)\n-16E40 Extra Length          0009 (9)\n-16E42 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x16E42: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-16E77 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-16E79   Length              0005 (5)\n-16E7B   Flags               01 (1) 'Modification'\n-16E7C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-16E80 PAYLOAD\n-\n-173EA DATA DESCRIPTOR       08074B50 (134695760)\n-173EE CRC                   117709A7 (293013927)\n-173F2 Compressed Size       0000056A (1386)\n-173F6 Uncompressed Size     0000056A (1386)\n-\n-173FA LOCAL HEADER #33      04034B50 (67324752)\n-173FE Extract Zip Spec      14 (20) '2.0'\n-173FF Extract OS            00 (0) 'MS-DOS'\n-17400 General Purpose Flag  0000 (0)\n-17402 Compression Method    0000 (0) 'Stored'\n-17404 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-17408 CRC                   00000000 (0)\n-1740C Compressed Size       00000000 (0)\n-17410 Uncompressed Size     00000000 (0)\n-17414 Filename Length       0026 (38)\n-17416 Extra Length          0009 (9)\n-17418 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x17418: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1743E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-17440   Length              0005 (5)\n-17442   Flags               01 (1) 'Modification'\n-17443   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-17447 LOCAL HEADER #34      04034B50 (67324752)\n-1744B Extract Zip Spec      14 (20) '2.0'\n-1744C Extract OS            00 (0) 'MS-DOS'\n-1744D General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1744F Compression Method    0000 (0) 'Stored'\n-17451 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-17455 CRC                   00000000 (0)\n-17459 Compressed Size       00000000 (0)\n-1745D Uncompressed Size     00000000 (0)\n-17461 Filename Length       0035 (53)\n-17463 Extra Length          0009 (9)\n-17465 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x17465: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1749A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1749C   Length              0005 (5)\n-1749E   Flags               01 (1) 'Modification'\n-1749F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-174A3 PAYLOAD\n-\n-1800E DATA DESCRIPTOR       08074B50 (134695760)\n-18012 CRC                   35D495FB (903124475)\n-18016 Compressed Size       00000B6B (2923)\n-1801A Uncompressed Size     00000B6B (2923)\n-\n-1801E LOCAL HEADER #35      04034B50 (67324752)\n-18022 Extract Zip Spec      14 (20) '2.0'\n-18023 Extract OS            00 (0) 'MS-DOS'\n-18024 General Purpose Flag  0000 (0)\n-18026 Compression Method    0000 (0) 'Stored'\n-18028 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1802C CRC                   00000000 (0)\n-18030 Compressed Size       00000000 (0)\n-18034 Uncompressed Size     00000000 (0)\n-18038 Filename Length       0027 (39)\n-1803A Extra Length          0009 (9)\n-1803C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1803C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-18063 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-18065   Length              0005 (5)\n-18067   Flags               01 (1) 'Modification'\n-18068   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1806C LOCAL HEADER #36      04034B50 (67324752)\n-18070 Extract Zip Spec      14 (20) '2.0'\n-18071 Extract OS            00 (0) 'MS-DOS'\n-18072 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-18074 Compression Method    0000 (0) 'Stored'\n-18076 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1807A CRC                   00000000 (0)\n-1807E Compressed Size       00000000 (0)\n-18082 Uncompressed Size     00000000 (0)\n-18086 Filename Length       003E (62)\n-18088 Extra Length          0009 (9)\n-1808A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1808A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-180C8 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-180CA   Length              0005 (5)\n-180CC   Flags               01 (1) 'Modification'\n-180CD   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-180D1 PAYLOAD\n-\n-19D23 DATA DESCRIPTOR       08074B50 (134695760)\n-19D27 CRC                   2FB39AE6 (800299750)\n-19D2B Compressed Size       00001C52 (7250)\n-19D2F Uncompressed Size     00001C52 (7250)\n-\n-19D33 CENTRAL HEADER #1     02014B50 (33639248)\n-19D37 Created Zip Spec      14 (20) '2.0'\n-19D38 Created OS            00 (0) 'MS-DOS'\n-19D39 Extract Zip Spec      14 (20) '2.0'\n-19D3A Extract OS            00 (0) 'MS-DOS'\n-19D3B General Purpose Flag  0000 (0)\n-19D3D Compression Method    0000 (0) 'Stored'\n-19D3F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-19D43 CRC                   00000000 (0)\n-19D47 Compressed Size       00000000 (0)\n-19D4B Uncompressed Size     00000000 (0)\n-19D4F Filename Length       0009 (9)\n-19D51 Extra Length          0009 (9)\n-19D53 Comment Length        0000 (0)\n-19D55 Disk Start            0000 (0)\n-19D57 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-19D59 Ext File Attributes   00000000 (0)\n-19D5D Local Header Offset   00000000 (0)\n-19D61 Filename              'XXXXXXXXX'\n-#\n-# WARNING: Offset 0x19D61: Filename 'XXXXXXXXX'\n-#          Zero length filename\n-#\n-19D6A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-19D6C   Length              0005 (5)\n-19D6E   Flags               01 (1) 'Modification'\n-19D6F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-19D73 CENTRAL HEADER #2     02014B50 (33639248)\n-19D77 Created Zip Spec      14 (20) '2.0'\n-19D78 Created OS            00 (0) 'MS-DOS'\n-19D79 Extract Zip Spec      14 (20) '2.0'\n-19D7A Extract OS            00 (0) 'MS-DOS'\n-19D7B General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-19D7D Compression Method    0000 (0) 'Stored'\n-19D7F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-19D83 CRC                   1A3FB9F4 (440383988)\n-19D87 Compressed Size       00002785 (10117)\n-19D8B Uncompressed Size     00002785 (10117)\n-19D8F Filename Length       0015 (21)\n-19D91 Extra Length          0009 (9)\n-19D93 Comment Length        0000 (0)\n-19D95 Disk Start            0000 (0)\n-19D97 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-19D99 Ext File Attributes   00000000 (0)\n-19D9D Local Header Offset   00000030 (48)\n-19DA1 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x19DA1: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-19DB6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-19DB8   Length              0005 (5)\n-19DBA   Flags               01 (1) 'Modification'\n-19DBB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-19DBF CENTRAL HEADER #3     02014B50 (33639248)\n-19DC3 Created Zip Spec      14 (20) '2.0'\n-19DC4 Created OS            00 (0) 'MS-DOS'\n-19DC5 Extract Zip Spec      14 (20) '2.0'\n-19DC6 Extract OS            00 (0) 'MS-DOS'\n-19DC7 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-19DC9 Compression Method    0000 (0) 'Stored'\n-19DCB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-19DCF CRC                   86E2B4B4 (2263004340)\n-19DD3 Compressed Size       00002C5E (11358)\n-19DD7 Uncompressed Size     00002C5E (11358)\n-19DDB Filename Length       0010 (16)\n-19DDD Extra Length          0009 (9)\n-19DDF Comment Length        0000 (0)\n-19DE1 Disk Start            0000 (0)\n-19DE3 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-19DE5 Ext File Attributes   00000000 (0)\n-19DE9 Local Header Offset   00002801 (10241)\n-19DED Filename              'XXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x19DED: Filename 'XXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-19DFD Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-19DFF   Length              0005 (5)\n-19E01   Flags               01 (1) 'Modification'\n-19E02   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-19E06 CENTRAL HEADER #4     02014B50 (33639248)\n-19E0A Created Zip Spec      14 (20) '2.0'\n-19E0B Created OS            00 (0) 'MS-DOS'\n-19E0C Extract Zip Spec      14 (20) '2.0'\n-19E0D Extract OS            00 (0) 'MS-DOS'\n-19E0E General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-19E10 Compression Method    0000 (0) 'Stored'\n-19E12 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-19E16 CRC                   EE027FB2 (3993141170)\n-19E1A Compressed Size       00000019 (25)\n-19E1E Uncompressed Size     00000019 (25)\n-19E22 Filename Length       0014 (20)\n-19E24 Extra Length          0009 (9)\n-19E26 Comment Length        0000 (0)\n-19E28 Disk Start            0000 (0)\n-19E2A Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-19E2C Ext File Attributes   00000000 (0)\n-19E30 Local Header Offset   000054A6 (21670)\n-19E34 Filename              'XXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x19E34: Filename 'XXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-19E48 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-19E4A   Length              0005 (5)\n-19E4C   Flags               01 (1) 'Modification'\n-19E4D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-19E51 CENTRAL HEADER #5     02014B50 (33639248)\n-19E55 Created Zip Spec      14 (20) '2.0'\n-19E56 Created OS            00 (0) 'MS-DOS'\n-19E57 Extract Zip Spec      14 (20) '2.0'\n-19E58 Extract OS            00 (0) 'MS-DOS'\n-19E59 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-19E5B Compression Method    0000 (0) 'Stored'\n-19E5D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-19E61 CRC                   B2802DB1 (2994744753)\n-19E65 Compressed Size       000000B1 (177)\n-19E69 Uncompressed Size     000000B1 (177)\n-19E6D Filename Length       000F (15)\n-19E6F Extra Length          0009 (9)\n-19E71 Comment Length        0000 (0)\n-19E73 Disk Start            0000 (0)\n-19E75 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-19E77 Ext File Attributes   00000000 (0)\n-19E7B Local Header Offset   0000550A (21770)\n-19E7F Filename              'XXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x19E7F: Filename 'XXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-19E8E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-19E90   Length              0005 (5)\n-19E92   Flags               01 (1) 'Modification'\n-19E93   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-19E97 CENTRAL HEADER #6     02014B50 (33639248)\n-19E9B Created Zip Spec      14 (20) '2.0'\n-19E9C Created OS            00 (0) 'MS-DOS'\n-19E9D Extract Zip Spec      14 (20) '2.0'\n-19E9E Extract OS            00 (0) 'MS-DOS'\n-19E9F General Purpose Flag  0000 (0)\n-19EA1 Compression Method    0000 (0) 'Stored'\n-19EA3 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-19EA7 CRC                   00000000 (0)\n-19EAB Compressed Size       00000000 (0)\n-19EAF Uncompressed Size     00000000 (0)\n-19EB3 Filename Length       000F (15)\n-19EB5 Extra Length          0009 (9)\n-19EB7 Comment Length        0000 (0)\n-19EB9 Disk Start            0000 (0)\n-19EBB Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-19EBD Ext File Attributes   00000000 (0)\n-19EC1 Local Header Offset   00005601 (22017)\n-19EC5 Filename              'XXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x19EC5: Filename 'XXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-19ED4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-19ED6   Length              0005 (5)\n-19ED8   Flags               01 (1) 'Modification'\n-19ED9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-19EDD CENTRAL HEADER #7     02014B50 (33639248)\n-19EE1 Created Zip Spec      14 (20) '2.0'\n-19EE2 Created OS            00 (0) 'MS-DOS'\n-19EE3 Extract Zip Spec      14 (20) '2.0'\n-19EE4 Extract OS            00 (0) 'MS-DOS'\n-19EE5 General Purpose Flag  0000 (0)\n-19EE7 Compression Method    0000 (0) 'Stored'\n-19EE9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-19EED CRC                   00000000 (0)\n-19EF1 Compressed Size       00000000 (0)\n-19EF5 Uncompressed Size     00000000 (0)\n-19EF9 Filename Length       0018 (24)\n-19EFB Extra Length          0009 (9)\n-19EFD Comment Length        0000 (0)\n-19EFF Disk Start            0000 (0)\n-19F01 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-19F03 Ext File Attributes   00000000 (0)\n-19F07 Local Header Offset   00005637 (22071)\n-19F0B Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x19F0B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-19F23 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-19F25   Length              0005 (5)\n-19F27   Flags               01 (1) 'Modification'\n-19F28   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-19F2C CENTRAL HEADER #8     02014B50 (33639248)\n-19F30 Created Zip Spec      14 (20) '2.0'\n-19F31 Created OS            00 (0) 'MS-DOS'\n-19F32 Extract Zip Spec      14 (20) '2.0'\n-19F33 Extract OS            00 (0) 'MS-DOS'\n-19F34 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-19F36 Compression Method    0000 (0) 'Stored'\n-19F38 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-19F3C CRC                   91BA560C (2444908044)\n-19F40 Compressed Size       0000003B (59)\n-19F44 Uncompressed Size     0000003B (59)\n-19F48 Filename Length       0046 (70)\n-19F4A Extra Length          0009 (9)\n-19F4C Comment Length        0000 (0)\n-19F4E Disk Start            0000 (0)\n-19F50 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-19F52 Ext File Attributes   00000000 (0)\n-19F56 Local Header Offset   00005676 (22134)\n-19F5A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x19F5A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-19FA0 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-19FA2   Length              0005 (5)\n-19FA4   Flags               01 (1) 'Modification'\n-19FA5   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-19FA9 CENTRAL HEADER #9     02014B50 (33639248)\n-19FAD Created Zip Spec      14 (20) '2.0'\n-19FAE Created OS            00 (0) 'MS-DOS'\n-19FAF Extract Zip Spec      14 (20) '2.0'\n-19FB0 Extract OS            00 (0) 'MS-DOS'\n-19FB1 General Purpose Flag  0000 (0)\n-19FB3 Compression Method    0000 (0) 'Stored'\n-19FB5 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-19FB9 CRC                   00000000 (0)\n-19FBD Compressed Size       00000000 (0)\n-19FC1 Uncompressed Size     00000000 (0)\n-19FC5 Filename Length       000F (15)\n-19FC7 Extra Length          0009 (9)\n-19FC9 Comment Length        0000 (0)\n-19FCB Disk Start            0000 (0)\n-19FCD Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-19FCF Ext File Attributes   00000000 (0)\n-19FD3 Local Header Offset   0000572E (22318)\n-19FD7 Filename              'XXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x19FD7: Filename 'XXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-19FE6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-19FE8   Length              0005 (5)\n-19FEA   Flags               01 (1) 'Modification'\n-19FEB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-19FEF CENTRAL HEADER #10    02014B50 (33639248)\n-19FF3 Created Zip Spec      14 (20) '2.0'\n-19FF4 Created OS            00 (0) 'MS-DOS'\n-19FF5 Extract Zip Spec      14 (20) '2.0'\n-19FF6 Extract OS            00 (0) 'MS-DOS'\n-19FF7 General Purpose Flag  0000 (0)\n-19FF9 Compression Method    0000 (0) 'Stored'\n-19FFB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-19FFF CRC                   00000000 (0)\n-1A003 Compressed Size       00000000 (0)\n-1A007 Uncompressed Size     00000000 (0)\n-1A00B Filename Length       0020 (32)\n-1A00D Extra Length          0009 (9)\n-1A00F Comment Length        0000 (0)\n-1A011 Disk Start            0000 (0)\n-1A013 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A015 Ext File Attributes   00000000 (0)\n-1A019 Local Header Offset   00005764 (22372)\n-1A01D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A01D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A03D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A03F   Length              0005 (5)\n-1A041   Flags               01 (1) 'Modification'\n-1A042   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A046 CENTRAL HEADER #11    02014B50 (33639248)\n-1A04A Created Zip Spec      14 (20) '2.0'\n-1A04B Created OS            00 (0) 'MS-DOS'\n-1A04C Extract Zip Spec      14 (20) '2.0'\n-1A04D Extract OS            00 (0) 'MS-DOS'\n-1A04E General Purpose Flag  0000 (0)\n-1A050 Compression Method    0000 (0) 'Stored'\n-1A052 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A056 CRC                   00000000 (0)\n-1A05A Compressed Size       00000000 (0)\n-1A05E Uncompressed Size     00000000 (0)\n-1A062 Filename Length       0035 (53)\n-1A064 Extra Length          0009 (9)\n-1A066 Comment Length        0000 (0)\n-1A068 Disk Start            0000 (0)\n-1A06A Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A06C Ext File Attributes   00000000 (0)\n-1A070 Local Header Offset   000057AB (22443)\n-1A074 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A074: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A0A9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A0AB   Length              0005 (5)\n-1A0AD   Flags               01 (1) 'Modification'\n-1A0AE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A0B2 CENTRAL HEADER #12    02014B50 (33639248)\n-1A0B6 Created Zip Spec      14 (20) '2.0'\n-1A0B7 Created OS            00 (0) 'MS-DOS'\n-1A0B8 Extract Zip Spec      14 (20) '2.0'\n-1A0B9 Extract OS            00 (0) 'MS-DOS'\n-1A0BA General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1A0BC Compression Method    0000 (0) 'Stored'\n-1A0BE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A0C2 CRC                   00000000 (0)\n-1A0C6 Compressed Size       00000000 (0)\n-1A0CA Uncompressed Size     00000000 (0)\n-1A0CE Filename Length       0043 (67)\n-1A0D0 Extra Length          0009 (9)\n-1A0D2 Comment Length        0000 (0)\n-1A0D4 Disk Start            0000 (0)\n-1A0D6 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A0D8 Ext File Attributes   00000000 (0)\n-1A0DC Local Header Offset   00005807 (22535)\n-1A0E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A0E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A123 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A125   Length              0005 (5)\n-1A127   Flags               01 (1) 'Modification'\n-1A128   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A12C CENTRAL HEADER #13    02014B50 (33639248)\n-1A130 Created Zip Spec      14 (20) '2.0'\n-1A131 Created OS            00 (0) 'MS-DOS'\n-1A132 Extract Zip Spec      14 (20) '2.0'\n-1A133 Extract OS            00 (0) 'MS-DOS'\n-1A134 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1A136 Compression Method    0000 (0) 'Stored'\n-1A138 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A13C CRC                   FACEEC94 (4207864980)\n-1A140 Compressed Size       00000E69 (3689)\n-1A144 Uncompressed Size     00000E69 (3689)\n-1A148 Filename Length       003C (60)\n-1A14A Extra Length          0009 (9)\n-1A14C Comment Length        0000 (0)\n-1A14E Disk Start            0000 (0)\n-1A150 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A152 Ext File Attributes   00000000 (0)\n-1A156 Local Header Offset   00005881 (22657)\n-1A15A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A15A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A196 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A198   Length              0005 (5)\n-1A19A   Flags               01 (1) 'Modification'\n-1A19B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A19F CENTRAL HEADER #14    02014B50 (33639248)\n-1A1A3 Created Zip Spec      14 (20) '2.0'\n-1A1A4 Created OS            00 (0) 'MS-DOS'\n-1A1A5 Extract Zip Spec      14 (20) '2.0'\n-1A1A6 Extract OS            00 (0) 'MS-DOS'\n-1A1A7 General Purpose Flag  0000 (0)\n-1A1A9 Compression Method    0000 (0) 'Stored'\n-1A1AB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A1AF CRC                   00000000 (0)\n-1A1B3 Compressed Size       00000000 (0)\n-1A1B7 Uncompressed Size     00000000 (0)\n-1A1BB Filename Length       0004 (4)\n-1A1BD Extra Length          0009 (9)\n-1A1BF Comment Length        0000 (0)\n-1A1C1 Disk Start            0000 (0)\n-1A1C3 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A1C5 Ext File Attributes   00000000 (0)\n-1A1C9 Local Header Offset   0000675D (26461)\n-1A1CD Filename              'XXXX'\n-#\n-# WARNING: Offset 0x1A1CD: Filename 'XXXX'\n-#          Zero length filename\n-#\n-1A1D1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A1D3   Length              0005 (5)\n-1A1D5   Flags               01 (1) 'Modification'\n-1A1D6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A1DA CENTRAL HEADER #15    02014B50 (33639248)\n-1A1DE Created Zip Spec      14 (20) '2.0'\n-1A1DF Created OS            00 (0) 'MS-DOS'\n-1A1E0 Extract Zip Spec      14 (20) '2.0'\n-1A1E1 Extract OS            00 (0) 'MS-DOS'\n-1A1E2 General Purpose Flag  0000 (0)\n-1A1E4 Compression Method    0000 (0) 'Stored'\n-1A1E6 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A1EA CRC                   00000000 (0)\n-1A1EE Compressed Size       00000000 (0)\n-1A1F2 Uncompressed Size     00000000 (0)\n-1A1F6 Filename Length       000B (11)\n-1A1F8 Extra Length          0009 (9)\n-1A1FA Comment Length        0000 (0)\n-1A1FC Disk Start            0000 (0)\n-1A1FE Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A200 Ext File Attributes   00000000 (0)\n-1A204 Local Header Offset   00006788 (26504)\n-1A208 Filename              'XXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A208: Filename 'XXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A213 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A215   Length              0005 (5)\n-1A217   Flags               01 (1) 'Modification'\n-1A218   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A21C CENTRAL HEADER #16    02014B50 (33639248)\n-1A220 Created Zip Spec      14 (20) '2.0'\n-1A221 Created OS            00 (0) 'MS-DOS'\n-1A222 Extract Zip Spec      14 (20) '2.0'\n-1A223 Extract OS            00 (0) 'MS-DOS'\n-1A224 General Purpose Flag  0000 (0)\n-1A226 Compression Method    0000 (0) 'Stored'\n-1A228 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A22C CRC                   00000000 (0)\n-1A230 Compressed Size       00000000 (0)\n-1A234 Uncompressed Size     00000000 (0)\n-1A238 Filename Length       0011 (17)\n-1A23A Extra Length          0009 (9)\n-1A23C Comment Length        0000 (0)\n-1A23E Disk Start            0000 (0)\n-1A240 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A242 Ext File Attributes   00000000 (0)\n-1A246 Local Header Offset   000067BA (26554)\n-1A24A Filename              'XXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A24A: Filename 'XXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A25B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A25D   Length              0005 (5)\n-1A25F   Flags               01 (1) 'Modification'\n-1A260   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A264 CENTRAL HEADER #17    02014B50 (33639248)\n-1A268 Created Zip Spec      14 (20) '2.0'\n-1A269 Created OS            00 (0) 'MS-DOS'\n-1A26A Extract Zip Spec      14 (20) '2.0'\n-1A26B Extract OS            00 (0) 'MS-DOS'\n-1A26C General Purpose Flag  0000 (0)\n-1A26E Compression Method    0000 (0) 'Stored'\n-1A270 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A274 CRC                   00000000 (0)\n-1A278 Compressed Size       00000000 (0)\n-1A27C Uncompressed Size     00000000 (0)\n-1A280 Filename Length       001A (26)\n-1A282 Extra Length          0009 (9)\n-1A284 Comment Length        0000 (0)\n-1A286 Disk Start            0000 (0)\n-1A288 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A28A Ext File Attributes   00000000 (0)\n-1A28E Local Header Offset   000067F2 (26610)\n-1A292 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A292: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A2AC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A2AE   Length              0005 (5)\n-1A2B0   Flags               01 (1) 'Modification'\n-1A2B1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A2B5 CENTRAL HEADER #18    02014B50 (33639248)\n-1A2B9 Created Zip Spec      14 (20) '2.0'\n-1A2BA Created OS            00 (0) 'MS-DOS'\n-1A2BB Extract Zip Spec      14 (20) '2.0'\n-1A2BC Extract OS            00 (0) 'MS-DOS'\n-1A2BD General Purpose Flag  0000 (0)\n-1A2BF Compression Method    0000 (0) 'Stored'\n-1A2C1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A2C5 CRC                   00000000 (0)\n-1A2C9 Compressed Size       00000000 (0)\n-1A2CD Uncompressed Size     00000000 (0)\n-1A2D1 Filename Length       001F (31)\n-1A2D3 Extra Length          0009 (9)\n-1A2D5 Comment Length        0000 (0)\n-1A2D7 Disk Start            0000 (0)\n-1A2D9 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A2DB Ext File Attributes   00000000 (0)\n-1A2DF Local Header Offset   00006833 (26675)\n-1A2E3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A2E3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A302 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A304   Length              0005 (5)\n-1A306   Flags               01 (1) 'Modification'\n-1A307   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A30B CENTRAL HEADER #19    02014B50 (33639248)\n-1A30F Created Zip Spec      14 (20) '2.0'\n-1A310 Created OS            00 (0) 'MS-DOS'\n-1A311 Extract Zip Spec      14 (20) '2.0'\n-1A312 Extract OS            00 (0) 'MS-DOS'\n-1A313 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1A315 Compression Method    0000 (0) 'Stored'\n-1A317 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A31B CRC                   36F8F065 (922284133)\n-1A31F Compressed Size       0000062A (1578)\n-1A323 Uncompressed Size     0000062A (1578)\n-1A327 Filename Length       0037 (55)\n-1A329 Extra Length          0009 (9)\n-1A32B Comment Length        0000 (0)\n-1A32D Disk Start            0000 (0)\n-1A32F Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A331 Ext File Attributes   00000000 (0)\n-1A335 Local Header Offset   00006879 (26745)\n-1A339 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A339: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A370 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A372   Length              0005 (5)\n-1A374   Flags               01 (1) 'Modification'\n-1A375   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A379 CENTRAL HEADER #20    02014B50 (33639248)\n-1A37D Created Zip Spec      14 (20) '2.0'\n-1A37E Created OS            00 (0) 'MS-DOS'\n-1A37F Extract Zip Spec      14 (20) '2.0'\n-1A380 Extract OS            00 (0) 'MS-DOS'\n-1A381 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1A383 Compression Method    0000 (0) 'Stored'\n-1A385 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A389 CRC                   CD8B51D1 (3448459729)\n-1A38D Compressed Size       000003DC (988)\n-1A391 Uncompressed Size     000003DC (988)\n-1A395 Filename Length       0031 (49)\n-1A397 Extra Length          0009 (9)\n-1A399 Comment Length        0000 (0)\n-1A39B Disk Start            0000 (0)\n-1A39D Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A39F Ext File Attributes   00000000 (0)\n-1A3A3 Local Header Offset   00006F11 (28433)\n-1A3A7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A3A7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A3D8 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A3DA   Length              0005 (5)\n-1A3DC   Flags               01 (1) 'Modification'\n-1A3DD   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A3E1 CENTRAL HEADER #21    02014B50 (33639248)\n-1A3E5 Created Zip Spec      14 (20) '2.0'\n-1A3E6 Created OS            00 (0) 'MS-DOS'\n-1A3E7 Extract Zip Spec      14 (20) '2.0'\n-1A3E8 Extract OS            00 (0) 'MS-DOS'\n-1A3E9 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1A3EB Compression Method    0000 (0) 'Stored'\n-1A3ED Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A3F1 CRC                   123318DF (305338591)\n-1A3F5 Compressed Size       000006C9 (1737)\n-1A3F9 Uncompressed Size     000006C9 (1737)\n-1A3FD Filename Length       002D (45)\n-1A3FF Extra Length          0009 (9)\n-1A401 Comment Length        0000 (0)\n-1A403 Disk Start            0000 (0)\n-1A405 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A407 Ext File Attributes   00000000 (0)\n-1A40B Local Header Offset   00007355 (29525)\n-1A40F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A40F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A43C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A43E   Length              0005 (5)\n-1A440   Flags               01 (1) 'Modification'\n-1A441   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A445 CENTRAL HEADER #22    02014B50 (33639248)\n-1A449 Created Zip Spec      14 (20) '2.0'\n-1A44A Created OS            00 (0) 'MS-DOS'\n-1A44B Extract Zip Spec      14 (20) '2.0'\n-1A44C Extract OS            00 (0) 'MS-DOS'\n-1A44D General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1A44F Compression Method    0000 (0) 'Stored'\n-1A451 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A455 CRC                   6B994ABC (1805208252)\n-1A459 Compressed Size       000018EB (6379)\n-1A45D Uncompressed Size     000018EB (6379)\n-1A461 Filename Length       002E (46)\n-1A463 Extra Length          0009 (9)\n-1A465 Comment Length        0000 (0)\n-1A467 Disk Start            0000 (0)\n-1A469 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A46B Ext File Attributes   00000000 (0)\n-1A46F Local Header Offset   00007A82 (31362)\n-1A473 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A473: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A4A1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A4A3   Length              0005 (5)\n-1A4A5   Flags               01 (1) 'Modification'\n-1A4A6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A4AA CENTRAL HEADER #23    02014B50 (33639248)\n-1A4AE Created Zip Spec      14 (20) '2.0'\n-1A4AF Created OS            00 (0) 'MS-DOS'\n-1A4B0 Extract Zip Spec      14 (20) '2.0'\n-1A4B1 Extract OS            00 (0) 'MS-DOS'\n-1A4B2 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1A4B4 Compression Method    0000 (0) 'Stored'\n-1A4B6 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A4BA CRC                   387B0FF7 (947589111)\n-1A4BE Compressed Size       000007B7 (1975)\n-1A4C2 Uncompressed Size     000007B7 (1975)\n-1A4C6 Filename Length       0033 (51)\n-1A4C8 Extra Length          0009 (9)\n-1A4CA Comment Length        0000 (0)\n-1A4CC Disk Start            0000 (0)\n-1A4CE Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A4D0 Ext File Attributes   00000000 (0)\n-1A4D4 Local Header Offset   000093D2 (37842)\n-1A4D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A4D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A50B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A50D   Length              0005 (5)\n-1A50F   Flags               01 (1) 'Modification'\n-1A510   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A514 CENTRAL HEADER #24    02014B50 (33639248)\n-1A518 Created Zip Spec      14 (20) '2.0'\n-1A519 Created OS            00 (0) 'MS-DOS'\n-1A51A Extract Zip Spec      14 (20) '2.0'\n-1A51B Extract OS            00 (0) 'MS-DOS'\n-1A51C General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1A51E Compression Method    0000 (0) 'Stored'\n-1A520 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A524 CRC                   0F6205B4 (258082228)\n-1A528 Compressed Size       000004DB (1243)\n-1A52C Uncompressed Size     000004DB (1243)\n-1A530 Filename Length       002F (47)\n-1A532 Extra Length          0009 (9)\n-1A534 Comment Length        0000 (0)\n-1A536 Disk Start            0000 (0)\n-1A538 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A53A Ext File Attributes   00000000 (0)\n-1A53E Local Header Offset   00009BF3 (39923)\n-1A542 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A542: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A571 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A573   Length              0005 (5)\n-1A575   Flags               01 (1) 'Modification'\n-1A576   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A57A CENTRAL HEADER #25    02014B50 (33639248)\n-1A57E Created Zip Spec      14 (20) '2.0'\n-1A57F Created OS            00 (0) 'MS-DOS'\n-1A580 Extract Zip Spec      14 (20) '2.0'\n-1A581 Extract OS            00 (0) 'MS-DOS'\n-1A582 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1A584 Compression Method    0000 (0) 'Stored'\n-1A586 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A58A CRC                   6ADC9301 (1792840449)\n-1A58E Compressed Size       000003E4 (996)\n-1A592 Uncompressed Size     000003E4 (996)\n-1A596 Filename Length       0031 (49)\n-1A598 Extra Length          0009 (9)\n-1A59A Comment Length        0000 (0)\n-1A59C Disk Start            0000 (0)\n-1A59E Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A5A0 Ext File Attributes   00000000 (0)\n-1A5A4 Local Header Offset   0000A134 (41268)\n-1A5A8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A5A8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A5D9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A5DB   Length              0005 (5)\n-1A5DD   Flags               01 (1) 'Modification'\n-1A5DE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A5E2 CENTRAL HEADER #26    02014B50 (33639248)\n-1A5E6 Created Zip Spec      14 (20) '2.0'\n-1A5E7 Created OS            00 (0) 'MS-DOS'\n-1A5E8 Extract Zip Spec      14 (20) '2.0'\n-1A5E9 Extract OS            00 (0) 'MS-DOS'\n-1A5EA General Purpose Flag  0000 (0)\n-1A5EC Compression Method    0000 (0) 'Stored'\n-1A5EE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A5F2 CRC                   00000000 (0)\n-1A5F6 Compressed Size       00000000 (0)\n-1A5FA Uncompressed Size     00000000 (0)\n-1A5FE Filename Length       0025 (37)\n-1A600 Extra Length          0009 (9)\n-1A602 Comment Length        0000 (0)\n-1A604 Disk Start            0000 (0)\n-1A606 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A608 Ext File Attributes   00000000 (0)\n-1A60C Local Header Offset   0000A580 (42368)\n-1A610 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A610: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A635 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A637   Length              0005 (5)\n-1A639   Flags               01 (1) 'Modification'\n-1A63A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A63E CENTRAL HEADER #27    02014B50 (33639248)\n-1A642 Created Zip Spec      14 (20) '2.0'\n-1A643 Created OS            00 (0) 'MS-DOS'\n-1A644 Extract Zip Spec      14 (20) '2.0'\n-1A645 Extract OS            00 (0) 'MS-DOS'\n-1A646 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1A648 Compression Method    0000 (0) 'Stored'\n-1A64A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A64E CRC                   3F422686 (1061299846)\n-1A652 Compressed Size       0000046C (1132)\n-1A656 Uncompressed Size     0000046C (1132)\n-1A65A Filename Length       0041 (65)\n-1A65C Extra Length          0009 (9)\n-1A65E Comment Length        0000 (0)\n-1A660 Disk Start            0000 (0)\n-1A662 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A664 Ext File Attributes   00000000 (0)\n-1A668 Local Header Offset   0000A5CC (42444)\n-1A66C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A66C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A6AD Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A6AF   Length              0005 (5)\n-1A6B1   Flags               01 (1) 'Modification'\n-1A6B2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A6B6 CENTRAL HEADER #28    02014B50 (33639248)\n-1A6BA Created Zip Spec      14 (20) '2.0'\n-1A6BB Created OS            00 (0) 'MS-DOS'\n-1A6BC Extract Zip Spec      14 (20) '2.0'\n-1A6BD Extract OS            00 (0) 'MS-DOS'\n-1A6BE General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1A6C0 Compression Method    0000 (0) 'Stored'\n-1A6C2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A6C6 CRC                   A75036DE (2807051998)\n-1A6CA Compressed Size       00004108 (16648)\n-1A6CE Uncompressed Size     00004108 (16648)\n-1A6D2 Filename Length       0035 (53)\n-1A6D4 Extra Length          0009 (9)\n-1A6D6 Comment Length        0000 (0)\n-1A6D8 Disk Start            0000 (0)\n-1A6DA Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A6DC Ext File Attributes   00000000 (0)\n-1A6E0 Local Header Offset   0000AAB0 (43696)\n-1A6E4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A6E4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A719 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A71B   Length              0005 (5)\n-1A71D   Flags               01 (1) 'Modification'\n-1A71E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A722 CENTRAL HEADER #29    02014B50 (33639248)\n-1A726 Created Zip Spec      14 (20) '2.0'\n-1A727 Created OS            00 (0) 'MS-DOS'\n-1A728 Extract Zip Spec      14 (20) '2.0'\n-1A729 Extract OS            00 (0) 'MS-DOS'\n-1A72A General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1A72C Compression Method    0000 (0) 'Stored'\n-1A72E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A732 CRC                   F1F2D150 (4059222352)\n-1A736 Compressed Size       00006EC8 (28360)\n-1A73A Uncompressed Size     00006EC8 (28360)\n-1A73E Filename Length       003C (60)\n-1A740 Extra Length          0009 (9)\n-1A742 Comment Length        0000 (0)\n-1A744 Disk Start            0000 (0)\n-1A746 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A748 Ext File Attributes   00000000 (0)\n-1A74C Local Header Offset   0000EC24 (60452)\n-1A750 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A750: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A78C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A78E   Length              0005 (5)\n-1A790   Flags               01 (1) 'Modification'\n-1A791   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A795 CENTRAL HEADER #30    02014B50 (33639248)\n-1A799 Created Zip Spec      14 (20) '2.0'\n-1A79A Created OS            00 (0) 'MS-DOS'\n-1A79B Extract Zip Spec      14 (20) '2.0'\n-1A79C Extract OS            00 (0) 'MS-DOS'\n-1A79D General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1A79F Compression Method    0000 (0) 'Stored'\n-1A7A1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A7A5 CRC                   F823DAB1 (4163099313)\n-1A7A9 Compressed Size       00000480 (1152)\n-1A7AD Uncompressed Size     00000480 (1152)\n-1A7B1 Filename Length       003A (58)\n-1A7B3 Extra Length          0009 (9)\n-1A7B5 Comment Length        0000 (0)\n-1A7B7 Disk Start            0000 (0)\n-1A7B9 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A7BB Ext File Attributes   00000000 (0)\n-1A7BF Local Header Offset   00015B5F (88927)\n-1A7C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A7C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A7FD Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A7FF   Length              0005 (5)\n-1A801   Flags               01 (1) 'Modification'\n-1A802   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A806 CENTRAL HEADER #31    02014B50 (33639248)\n-1A80A Created Zip Spec      14 (20) '2.0'\n-1A80B Created OS            00 (0) 'MS-DOS'\n-1A80C Extract Zip Spec      14 (20) '2.0'\n-1A80D Extract OS            00 (0) 'MS-DOS'\n-1A80E General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1A810 Compression Method    0000 (0) 'Stored'\n-1A812 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A816 CRC                   0B4932D9 (189346521)\n-1A81A Compressed Size       00000D69 (3433)\n-1A81E Uncompressed Size     00000D69 (3433)\n-1A822 Filename Length       0034 (52)\n-1A824 Extra Length          0009 (9)\n-1A826 Comment Length        0000 (0)\n-1A828 Disk Start            0000 (0)\n-1A82A Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A82C Ext File Attributes   00000000 (0)\n-1A830 Local Header Offset   00016050 (90192)\n-1A834 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A834: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A868 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A86A   Length              0005 (5)\n-1A86C   Flags               01 (1) 'Modification'\n-1A86D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A871 CENTRAL HEADER #32    02014B50 (33639248)\n-1A875 Created Zip Spec      14 (20) '2.0'\n-1A876 Created OS            00 (0) 'MS-DOS'\n-1A877 Extract Zip Spec      14 (20) '2.0'\n-1A878 Extract OS            00 (0) 'MS-DOS'\n-1A879 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1A87B Compression Method    0000 (0) 'Stored'\n-1A87D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A881 CRC                   117709A7 (293013927)\n-1A885 Compressed Size       0000056A (1386)\n-1A889 Uncompressed Size     0000056A (1386)\n-1A88D Filename Length       0035 (53)\n-1A88F Extra Length          0009 (9)\n-1A891 Comment Length        0000 (0)\n-1A893 Disk Start            0000 (0)\n-1A895 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A897 Ext File Attributes   00000000 (0)\n-1A89B Local Header Offset   00016E24 (93732)\n-1A89F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A89F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A8D4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A8D6   Length              0005 (5)\n-1A8D8   Flags               01 (1) 'Modification'\n-1A8D9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A8DD CENTRAL HEADER #33    02014B50 (33639248)\n-1A8E1 Created Zip Spec      14 (20) '2.0'\n-1A8E2 Created OS            00 (0) 'MS-DOS'\n-1A8E3 Extract Zip Spec      14 (20) '2.0'\n-1A8E4 Extract OS            00 (0) 'MS-DOS'\n-1A8E5 General Purpose Flag  0000 (0)\n-1A8E7 Compression Method    0000 (0) 'Stored'\n-1A8E9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A8ED CRC                   00000000 (0)\n-1A8F1 Compressed Size       00000000 (0)\n-1A8F5 Uncompressed Size     00000000 (0)\n-1A8F9 Filename Length       0026 (38)\n-1A8FB Extra Length          0009 (9)\n-1A8FD Comment Length        0000 (0)\n-1A8FF Disk Start            0000 (0)\n-1A901 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A903 Ext File Attributes   00000000 (0)\n-1A907 Local Header Offset   000173FA (95226)\n-1A90B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A90B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A931 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A933   Length              0005 (5)\n-1A935   Flags               01 (1) 'Modification'\n-1A936   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A93A CENTRAL HEADER #34    02014B50 (33639248)\n-1A93E Created Zip Spec      14 (20) '2.0'\n-1A93F Created OS            00 (0) 'MS-DOS'\n-1A940 Extract Zip Spec      14 (20) '2.0'\n-1A941 Extract OS            00 (0) 'MS-DOS'\n-1A942 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1A944 Compression Method    0000 (0) 'Stored'\n-1A946 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A94A CRC                   35D495FB (903124475)\n-1A94E Compressed Size       00000B6B (2923)\n-1A952 Uncompressed Size     00000B6B (2923)\n-1A956 Filename Length       0035 (53)\n-1A958 Extra Length          0009 (9)\n-1A95A Comment Length        0000 (0)\n-1A95C Disk Start            0000 (0)\n-1A95E Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A960 Ext File Attributes   00000000 (0)\n-1A964 Local Header Offset   00017447 (95303)\n-1A968 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A968: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A99D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A99F   Length              0005 (5)\n-1A9A1   Flags               01 (1) 'Modification'\n-1A9A2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1A9A6 CENTRAL HEADER #35    02014B50 (33639248)\n-1A9AA Created Zip Spec      14 (20) '2.0'\n-1A9AB Created OS            00 (0) 'MS-DOS'\n-1A9AC Extract Zip Spec      14 (20) '2.0'\n-1A9AD Extract OS            00 (0) 'MS-DOS'\n-1A9AE General Purpose Flag  0000 (0)\n-1A9B0 Compression Method    0000 (0) 'Stored'\n-1A9B2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1A9B6 CRC                   00000000 (0)\n-1A9BA Compressed Size       00000000 (0)\n-1A9BE Uncompressed Size     00000000 (0)\n-1A9C2 Filename Length       0027 (39)\n-1A9C4 Extra Length          0009 (9)\n-1A9C6 Comment Length        0000 (0)\n-1A9C8 Disk Start            0000 (0)\n-1A9CA Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1A9CC Ext File Attributes   00000000 (0)\n-1A9D0 Local Header Offset   0001801E (98334)\n-1A9D4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1A9D4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1A9FB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1A9FD   Length              0005 (5)\n-1A9FF   Flags               01 (1) 'Modification'\n-1AA00   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1AA04 CENTRAL HEADER #36    02014B50 (33639248)\n-1AA08 Created Zip Spec      14 (20) '2.0'\n-1AA09 Created OS            00 (0) 'MS-DOS'\n-1AA0A Extract Zip Spec      14 (20) '2.0'\n-1AA0B Extract OS            00 (0) 'MS-DOS'\n-1AA0C General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-1AA0E Compression Method    0000 (0) 'Stored'\n-1AA10 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1AA14 CRC                   2FB39AE6 (800299750)\n-1AA18 Compressed Size       00001C52 (7250)\n-1AA1C Uncompressed Size     00001C52 (7250)\n-1AA20 Filename Length       003E (62)\n-1AA22 Extra Length          0009 (9)\n-1AA24 Comment Length        0000 (0)\n-1AA26 Disk Start            0000 (0)\n-1AA28 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1AA2A Ext File Attributes   00000000 (0)\n-1AA2E Local Header Offset   0001806C (98412)\n-1AA32 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1AA32: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1AA70 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1AA72   Length              0005 (5)\n-1AA74   Flags               01 (1) 'Modification'\n-1AA75   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-1AA79 END CENTRAL HEADER    06054B50 (101010256)\n-1AA7D Number of this disk   0000 (0)\n-1AA7F Central Dir Disk no   0000 (0)\n-1AA81 Entries in this disk  0024 (36)\n-1AA83 Total Entries         0024 (36)\n-1AA85 Size of Central Dir   00000D46 (3398)\n-1AA89 Offset to Central Dir 00019D33 (105779)\n-1AA8D Comment Length        0000 (0)\n+066E5 DATA DESCRIPTOR       08074B50 (134695760)\n+066E9 CRC                   DB79C8F6 (3682191606)\n+066ED Compressed Size       00000E01 (3585)\n+066F1 Uncompressed Size     00000E01 (3585)\n+\n+066F5 LOCAL HEADER #14      04034B50 (67324752)\n+066F9 Extract Zip Spec      14 (20) '2.0'\n+066FA Extract OS            00 (0) 'MS-DOS'\n+066FB General Purpose Flag  0000 (0)\n+066FD Compression Method    0000 (0) 'Stored'\n+066FF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+06703 CRC                   00000000 (0)\n+06707 Compressed Size       00000000 (0)\n+0670B Uncompressed Size     00000000 (0)\n+0670F Filename Length       0004 (4)\n+06711 Extra Length          0009 (9)\n+06713 Filename              'XXXX'\n+#\n+# WARNING: Offset 0x6713: Filename 'XXXX'\n+#          Zero length filename\n+#\n+06717 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+06719   Length              0005 (5)\n+0671B   Flags               01 (1) 'Modification'\n+0671C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+06720 LOCAL HEADER #15      04034B50 (67324752)\n+06724 Extract Zip Spec      14 (20) '2.0'\n+06725 Extract OS            00 (0) 'MS-DOS'\n+06726 General Purpose Flag  0000 (0)\n+06728 Compression Method    0000 (0) 'Stored'\n+0672A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0672E CRC                   00000000 (0)\n+06732 Compressed Size       00000000 (0)\n+06736 Uncompressed Size     00000000 (0)\n+0673A Filename Length       000B (11)\n+0673C Extra Length          0009 (9)\n+0673E Filename              'XXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x673E: Filename 'XXXXXXXXXXX'\n+#          Zero length filename\n+#\n+06749 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0674B   Length              0005 (5)\n+0674D   Flags               01 (1) 'Modification'\n+0674E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+06752 LOCAL HEADER #16      04034B50 (67324752)\n+06756 Extract Zip Spec      14 (20) '2.0'\n+06757 Extract OS            00 (0) 'MS-DOS'\n+06758 General Purpose Flag  0000 (0)\n+0675A Compression Method    0000 (0) 'Stored'\n+0675C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+06760 CRC                   00000000 (0)\n+06764 Compressed Size       00000000 (0)\n+06768 Uncompressed Size     00000000 (0)\n+0676C Filename Length       0011 (17)\n+0676E Extra Length          0009 (9)\n+06770 Filename              'XXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6770: Filename 'XXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+06781 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+06783   Length              0005 (5)\n+06785   Flags               01 (1) 'Modification'\n+06786   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0678A LOCAL HEADER #17      04034B50 (67324752)\n+0678E Extract Zip Spec      14 (20) '2.0'\n+0678F Extract OS            00 (0) 'MS-DOS'\n+06790 General Purpose Flag  0000 (0)\n+06792 Compression Method    0000 (0) 'Stored'\n+06794 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+06798 CRC                   00000000 (0)\n+0679C Compressed Size       00000000 (0)\n+067A0 Uncompressed Size     00000000 (0)\n+067A4 Filename Length       001A (26)\n+067A6 Extra Length          0009 (9)\n+067A8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x67A8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+067C2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+067C4   Length              0005 (5)\n+067C6   Flags               01 (1) 'Modification'\n+067C7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+067CB LOCAL HEADER #18      04034B50 (67324752)\n+067CF Extract Zip Spec      14 (20) '2.0'\n+067D0 Extract OS            00 (0) 'MS-DOS'\n+067D1 General Purpose Flag  0000 (0)\n+067D3 Compression Method    0000 (0) 'Stored'\n+067D5 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+067D9 CRC                   00000000 (0)\n+067DD Compressed Size       00000000 (0)\n+067E1 Uncompressed Size     00000000 (0)\n+067E5 Filename Length       001F (31)\n+067E7 Extra Length          0009 (9)\n+067E9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x67E9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+06808 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0680A   Length              0005 (5)\n+0680C   Flags               01 (1) 'Modification'\n+0680D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+06811 LOCAL HEADER #19      04034B50 (67324752)\n+06815 Extract Zip Spec      14 (20) '2.0'\n+06816 Extract OS            00 (0) 'MS-DOS'\n+06817 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+06819 Compression Method    0000 (0) 'Stored'\n+0681B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0681F CRC                   00000000 (0)\n+06823 Compressed Size       00000000 (0)\n+06827 Uncompressed Size     00000000 (0)\n+0682B Filename Length       0037 (55)\n+0682D Extra Length          0009 (9)\n+0682F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x682F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+06866 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+06868   Length              0005 (5)\n+0686A   Flags               01 (1) 'Modification'\n+0686B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0686F PAYLOAD\n+\n+06EC6 DATA DESCRIPTOR       08074B50 (134695760)\n+06ECA CRC                   2526A8CF (623290575)\n+06ECE Compressed Size       00000657 (1623)\n+06ED2 Uncompressed Size     00000657 (1623)\n+\n+06ED6 LOCAL HEADER #20      04034B50 (67324752)\n+06EDA Extract Zip Spec      14 (20) '2.0'\n+06EDB Extract OS            00 (0) 'MS-DOS'\n+06EDC General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+06EDE Compression Method    0000 (0) 'Stored'\n+06EE0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+06EE4 CRC                   00000000 (0)\n+06EE8 Compressed Size       00000000 (0)\n+06EEC Uncompressed Size     00000000 (0)\n+06EF0 Filename Length       0031 (49)\n+06EF2 Extra Length          0009 (9)\n+06EF4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6EF4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+06F25 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+06F27   Length              0005 (5)\n+06F29   Flags               01 (1) 'Modification'\n+06F2A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+06F2E PAYLOAD\n+\n+0730A DATA DESCRIPTOR       08074B50 (134695760)\n+0730E CRC                   CD8B51D1 (3448459729)\n+07312 Compressed Size       000003DC (988)\n+07316 Uncompressed Size     000003DC (988)\n+\n+0731A LOCAL HEADER #21      04034B50 (67324752)\n+0731E Extract Zip Spec      14 (20) '2.0'\n+0731F Extract OS            00 (0) 'MS-DOS'\n+07320 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+07322 Compression Method    0000 (0) 'Stored'\n+07324 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+07328 CRC                   00000000 (0)\n+0732C Compressed Size       00000000 (0)\n+07330 Uncompressed Size     00000000 (0)\n+07334 Filename Length       002D (45)\n+07336 Extra Length          0009 (9)\n+07338 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x7338: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+07365 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+07367   Length              0005 (5)\n+07369   Flags               01 (1) 'Modification'\n+0736A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0736E PAYLOAD\n+\n+07A6E DATA DESCRIPTOR       08074B50 (134695760)\n+07A72 CRC                   322BAD20 (841723168)\n+07A76 Compressed Size       00000700 (1792)\n+07A7A Uncompressed Size     00000700 (1792)\n+\n+07A7E LOCAL HEADER #22      04034B50 (67324752)\n+07A82 Extract Zip Spec      14 (20) '2.0'\n+07A83 Extract OS            00 (0) 'MS-DOS'\n+07A84 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+07A86 Compression Method    0000 (0) 'Stored'\n+07A88 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+07A8C CRC                   00000000 (0)\n+07A90 Compressed Size       00000000 (0)\n+07A94 Uncompressed Size     00000000 (0)\n+07A98 Filename Length       002E (46)\n+07A9A Extra Length          0009 (9)\n+07A9C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x7A9C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+07ACA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+07ACC   Length              0005 (5)\n+07ACE   Flags               01 (1) 'Modification'\n+07ACF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+07AD3 PAYLOAD\n+\n+0947D DATA DESCRIPTOR       08074B50 (134695760)\n+09481 CRC                   9A56CC71 (2589379697)\n+09485 Compressed Size       000019AA (6570)\n+09489 Uncompressed Size     000019AA (6570)\n+\n+0948D LOCAL HEADER #23      04034B50 (67324752)\n+09491 Extract Zip Spec      14 (20) '2.0'\n+09492 Extract OS            00 (0) 'MS-DOS'\n+09493 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+09495 Compression Method    0000 (0) 'Stored'\n+09497 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0949B CRC                   00000000 (0)\n+0949F Compressed Size       00000000 (0)\n+094A3 Uncompressed Size     00000000 (0)\n+094A7 Filename Length       0033 (51)\n+094A9 Extra Length          0009 (9)\n+094AB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x94AB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+094DE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+094E0   Length              0005 (5)\n+094E2   Flags               01 (1) 'Modification'\n+094E3   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+094E7 PAYLOAD\n+\n+09CCD DATA DESCRIPTOR       08074B50 (134695760)\n+09CD1 CRC                   BBB4B4AC (3149182124)\n+09CD5 Compressed Size       000007E6 (2022)\n+09CD9 Uncompressed Size     000007E6 (2022)\n+\n+09CDD LOCAL HEADER #24      04034B50 (67324752)\n+09CE1 Extract Zip Spec      14 (20) '2.0'\n+09CE2 Extract OS            00 (0) 'MS-DOS'\n+09CE3 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+09CE5 Compression Method    0000 (0) 'Stored'\n+09CE7 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+09CEB CRC                   00000000 (0)\n+09CEF Compressed Size       00000000 (0)\n+09CF3 Uncompressed Size     00000000 (0)\n+09CF7 Filename Length       002F (47)\n+09CF9 Extra Length          0009 (9)\n+09CFB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x9CFB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+09D2A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+09D2C   Length              0005 (5)\n+09D2E   Flags               01 (1) 'Modification'\n+09D2F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+09D33 PAYLOAD\n+\n+0A22D DATA DESCRIPTOR       08074B50 (134695760)\n+0A231 CRC                   302E6CD8 (808348888)\n+0A235 Compressed Size       000004FA (1274)\n+0A239 Uncompressed Size     000004FA (1274)\n+\n+0A23D LOCAL HEADER #25      04034B50 (67324752)\n+0A241 Extract Zip Spec      14 (20) '2.0'\n+0A242 Extract OS            00 (0) 'MS-DOS'\n+0A243 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0A245 Compression Method    0000 (0) 'Stored'\n+0A247 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0A24B CRC                   00000000 (0)\n+0A24F Compressed Size       00000000 (0)\n+0A253 Uncompressed Size     00000000 (0)\n+0A257 Filename Length       0031 (49)\n+0A259 Extra Length          0009 (9)\n+0A25B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xA25B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0A28C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0A28E   Length              0005 (5)\n+0A290   Flags               01 (1) 'Modification'\n+0A291   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0A295 PAYLOAD\n+\n+0A679 DATA DESCRIPTOR       08074B50 (134695760)\n+0A67D CRC                   6ADC9301 (1792840449)\n+0A681 Compressed Size       000003E4 (996)\n+0A685 Uncompressed Size     000003E4 (996)\n+\n+0A689 LOCAL HEADER #26      04034B50 (67324752)\n+0A68D Extract Zip Spec      14 (20) '2.0'\n+0A68E Extract OS            00 (0) 'MS-DOS'\n+0A68F General Purpose Flag  0000 (0)\n+0A691 Compression Method    0000 (0) 'Stored'\n+0A693 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0A697 CRC                   00000000 (0)\n+0A69B Compressed Size       00000000 (0)\n+0A69F Uncompressed Size     00000000 (0)\n+0A6A3 Filename Length       0025 (37)\n+0A6A5 Extra Length          0009 (9)\n+0A6A7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xA6A7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0A6CC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0A6CE   Length              0005 (5)\n+0A6D0   Flags               01 (1) 'Modification'\n+0A6D1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0A6D5 LOCAL HEADER #27      04034B50 (67324752)\n+0A6D9 Extract Zip Spec      14 (20) '2.0'\n+0A6DA Extract OS            00 (0) 'MS-DOS'\n+0A6DB General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0A6DD Compression Method    0000 (0) 'Stored'\n+0A6DF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0A6E3 CRC                   00000000 (0)\n+0A6E7 Compressed Size       00000000 (0)\n+0A6EB Uncompressed Size     00000000 (0)\n+0A6EF Filename Length       0041 (65)\n+0A6F1 Extra Length          0009 (9)\n+0A6F3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xA6F3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0A734 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0A736   Length              0005 (5)\n+0A738   Flags               01 (1) 'Modification'\n+0A739   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0A73D PAYLOAD\n+\n+0ABC7 DATA DESCRIPTOR       08074B50 (134695760)\n+0ABCB CRC                   F69577E7 (4136990695)\n+0ABCF Compressed Size       0000048A (1162)\n+0ABD3 Uncompressed Size     0000048A (1162)\n+\n+0ABD7 LOCAL HEADER #28      04034B50 (67324752)\n+0ABDB Extract Zip Spec      14 (20) '2.0'\n+0ABDC Extract OS            00 (0) 'MS-DOS'\n+0ABDD General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0ABDF Compression Method    0000 (0) 'Stored'\n+0ABE1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0ABE5 CRC                   00000000 (0)\n+0ABE9 Compressed Size       00000000 (0)\n+0ABED Uncompressed Size     00000000 (0)\n+0ABF1 Filename Length       0035 (53)\n+0ABF3 Extra Length          0009 (9)\n+0ABF5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xABF5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0AC2A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0AC2C   Length              0005 (5)\n+0AC2E   Flags               01 (1) 'Modification'\n+0AC2F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0AC33 PAYLOAD\n+\n+0EF14 DATA DESCRIPTOR       08074B50 (134695760)\n+0EF18 CRC                   93092688 (2466850440)\n+0EF1C Compressed Size       000042E1 (17121)\n+0EF20 Uncompressed Size     000042E1 (17121)\n+\n+0EF24 LOCAL HEADER #29      04034B50 (67324752)\n+0EF28 Extract Zip Spec      14 (20) '2.0'\n+0EF29 Extract OS            00 (0) 'MS-DOS'\n+0EF2A General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0EF2C Compression Method    0000 (0) 'Stored'\n+0EF2E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0EF32 CRC                   00000000 (0)\n+0EF36 Compressed Size       00000000 (0)\n+0EF3A Uncompressed Size     00000000 (0)\n+0EF3E Filename Length       003C (60)\n+0EF40 Extra Length          0009 (9)\n+0EF42 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xEF42: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0EF7E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0EF80   Length              0005 (5)\n+0EF82   Flags               01 (1) 'Modification'\n+0EF83   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0EF87 PAYLOAD\n+\n+1613F DATA DESCRIPTOR       08074B50 (134695760)\n+16143 CRC                   29CC663D (701261373)\n+16147 Compressed Size       000071B8 (29112)\n+1614B Uncompressed Size     000071B8 (29112)\n+\n+1614F LOCAL HEADER #30      04034B50 (67324752)\n+16153 Extract Zip Spec      14 (20) '2.0'\n+16154 Extract OS            00 (0) 'MS-DOS'\n+16155 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+16157 Compression Method    0000 (0) 'Stored'\n+16159 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1615D CRC                   00000000 (0)\n+16161 Compressed Size       00000000 (0)\n+16165 Uncompressed Size     00000000 (0)\n+16169 Filename Length       003A (58)\n+1616B Extra Length          0009 (9)\n+1616D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1616D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+161A7 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+161A9   Length              0005 (5)\n+161AB   Flags               01 (1) 'Modification'\n+161AC   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+161B0 PAYLOAD\n+\n+1664E DATA DESCRIPTOR       08074B50 (134695760)\n+16652 CRC                   11BF3CA1 (297745569)\n+16656 Compressed Size       0000049E (1182)\n+1665A Uncompressed Size     0000049E (1182)\n+\n+1665E LOCAL HEADER #31      04034B50 (67324752)\n+16662 Extract Zip Spec      14 (20) '2.0'\n+16663 Extract OS            00 (0) 'MS-DOS'\n+16664 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+16666 Compression Method    0000 (0) 'Stored'\n+16668 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1666C CRC                   00000000 (0)\n+16670 Compressed Size       00000000 (0)\n+16674 Uncompressed Size     00000000 (0)\n+16678 Filename Length       0034 (52)\n+1667A Extra Length          0009 (9)\n+1667C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1667C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+166B0 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+166B2   Length              0005 (5)\n+166B4   Flags               01 (1) 'Modification'\n+166B5   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+166B9 PAYLOAD\n+\n+17485 DATA DESCRIPTOR       08074B50 (134695760)\n+17489 CRC                   8B7AC527 (2340078887)\n+1748D Compressed Size       00000DCC (3532)\n+17491 Uncompressed Size     00000DCC (3532)\n+\n+17495 LOCAL HEADER #32      04034B50 (67324752)\n+17499 Extract Zip Spec      14 (20) '2.0'\n+1749A Extract OS            00 (0) 'MS-DOS'\n+1749B General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1749D Compression Method    0000 (0) 'Stored'\n+1749F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+174A3 CRC                   00000000 (0)\n+174A7 Compressed Size       00000000 (0)\n+174AB Uncompressed Size     00000000 (0)\n+174AF Filename Length       0035 (53)\n+174B1 Extra Length          0009 (9)\n+174B3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x174B3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+174E8 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+174EA   Length              0005 (5)\n+174EC   Flags               01 (1) 'Modification'\n+174ED   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+174F1 PAYLOAD\n+\n+17A5B DATA DESCRIPTOR       08074B50 (134695760)\n+17A5F CRC                   117709A7 (293013927)\n+17A63 Compressed Size       0000056A (1386)\n+17A67 Uncompressed Size     0000056A (1386)\n+\n+17A6B LOCAL HEADER #33      04034B50 (67324752)\n+17A6F Extract Zip Spec      14 (20) '2.0'\n+17A70 Extract OS            00 (0) 'MS-DOS'\n+17A71 General Purpose Flag  0000 (0)\n+17A73 Compression Method    0000 (0) 'Stored'\n+17A75 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+17A79 CRC                   00000000 (0)\n+17A7D Compressed Size       00000000 (0)\n+17A81 Uncompressed Size     00000000 (0)\n+17A85 Filename Length       0026 (38)\n+17A87 Extra Length          0009 (9)\n+17A89 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x17A89: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+17AAF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+17AB1   Length              0005 (5)\n+17AB3   Flags               01 (1) 'Modification'\n+17AB4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+17AB8 LOCAL HEADER #34      04034B50 (67324752)\n+17ABC Extract Zip Spec      14 (20) '2.0'\n+17ABD Extract OS            00 (0) 'MS-DOS'\n+17ABE General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+17AC0 Compression Method    0000 (0) 'Stored'\n+17AC2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+17AC6 CRC                   00000000 (0)\n+17ACA Compressed Size       00000000 (0)\n+17ACE Uncompressed Size     00000000 (0)\n+17AD2 Filename Length       0035 (53)\n+17AD4 Extra Length          0009 (9)\n+17AD6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x17AD6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+17B0B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+17B0D   Length              0005 (5)\n+17B0F   Flags               01 (1) 'Modification'\n+17B10   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+17B14 PAYLOAD\n+\n+186CD DATA DESCRIPTOR       08074B50 (134695760)\n+186D1 CRC                   A1B16DDC (2712759772)\n+186D5 Compressed Size       00000BB9 (3001)\n+186D9 Uncompressed Size     00000BB9 (3001)\n+\n+186DD LOCAL HEADER #35      04034B50 (67324752)\n+186E1 Extract Zip Spec      14 (20) '2.0'\n+186E2 Extract OS            00 (0) 'MS-DOS'\n+186E3 General Purpose Flag  0000 (0)\n+186E5 Compression Method    0000 (0) 'Stored'\n+186E7 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+186EB CRC                   00000000 (0)\n+186EF Compressed Size       00000000 (0)\n+186F3 Uncompressed Size     00000000 (0)\n+186F7 Filename Length       0027 (39)\n+186F9 Extra Length          0009 (9)\n+186FB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x186FB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+18722 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+18724   Length              0005 (5)\n+18726   Flags               01 (1) 'Modification'\n+18727   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1872B LOCAL HEADER #36      04034B50 (67324752)\n+1872F Extract Zip Spec      14 (20) '2.0'\n+18730 Extract OS            00 (0) 'MS-DOS'\n+18731 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+18733 Compression Method    0000 (0) 'Stored'\n+18735 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+18739 CRC                   00000000 (0)\n+1873D Compressed Size       00000000 (0)\n+18741 Uncompressed Size     00000000 (0)\n+18745 Filename Length       003E (62)\n+18747 Extra Length          0009 (9)\n+18749 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x18749: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+18787 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+18789   Length              0005 (5)\n+1878B   Flags               01 (1) 'Modification'\n+1878C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+18790 PAYLOAD\n+\n+1A4A4 DATA DESCRIPTOR       08074B50 (134695760)\n+1A4A8 CRC                   43B8CAA4 (1136183972)\n+1A4AC Compressed Size       00001D14 (7444)\n+1A4B0 Uncompressed Size     00001D14 (7444)\n+\n+1A4B4 CENTRAL HEADER #1     02014B50 (33639248)\n+1A4B8 Created Zip Spec      14 (20) '2.0'\n+1A4B9 Created OS            00 (0) 'MS-DOS'\n+1A4BA Extract Zip Spec      14 (20) '2.0'\n+1A4BB Extract OS            00 (0) 'MS-DOS'\n+1A4BC General Purpose Flag  0000 (0)\n+1A4BE Compression Method    0000 (0) 'Stored'\n+1A4C0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1A4C4 CRC                   00000000 (0)\n+1A4C8 Compressed Size       00000000 (0)\n+1A4CC Uncompressed Size     00000000 (0)\n+1A4D0 Filename Length       0009 (9)\n+1A4D2 Extra Length          0009 (9)\n+1A4D4 Comment Length        0000 (0)\n+1A4D6 Disk Start            0000 (0)\n+1A4D8 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1A4DA Ext File Attributes   00000000 (0)\n+1A4DE Local Header Offset   00000000 (0)\n+1A4E2 Filename              'XXXXXXXXX'\n+#\n+# WARNING: Offset 0x1A4E2: Filename 'XXXXXXXXX'\n+#          Zero length filename\n+#\n+1A4EB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1A4ED   Length              0005 (5)\n+1A4EF   Flags               01 (1) 'Modification'\n+1A4F0   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1A4F4 CENTRAL HEADER #2     02014B50 (33639248)\n+1A4F8 Created Zip Spec      14 (20) '2.0'\n+1A4F9 Created OS            00 (0) 'MS-DOS'\n+1A4FA Extract Zip Spec      14 (20) '2.0'\n+1A4FB Extract OS            00 (0) 'MS-DOS'\n+1A4FC General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1A4FE Compression Method    0000 (0) 'Stored'\n+1A500 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1A504 CRC                   1A3FB9F4 (440383988)\n+1A508 Compressed Size       00002785 (10117)\n+1A50C Uncompressed Size     00002785 (10117)\n+1A510 Filename Length       0015 (21)\n+1A512 Extra Length          0009 (9)\n+1A514 Comment Length        0000 (0)\n+1A516 Disk Start            0000 (0)\n+1A518 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1A51A Ext File Attributes   00000000 (0)\n+1A51E Local Header Offset   00000030 (48)\n+1A522 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1A522: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1A537 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1A539   Length              0005 (5)\n+1A53B   Flags               01 (1) 'Modification'\n+1A53C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1A540 CENTRAL HEADER #3     02014B50 (33639248)\n+1A544 Created Zip Spec      14 (20) '2.0'\n+1A545 Created OS            00 (0) 'MS-DOS'\n+1A546 Extract Zip Spec      14 (20) '2.0'\n+1A547 Extract OS            00 (0) 'MS-DOS'\n+1A548 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1A54A Compression Method    0000 (0) 'Stored'\n+1A54C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1A550 CRC                   86E2B4B4 (2263004340)\n+1A554 Compressed Size       00002C5E (11358)\n+1A558 Uncompressed Size     00002C5E (11358)\n+1A55C Filename Length       0010 (16)\n+1A55E Extra Length          0009 (9)\n+1A560 Comment Length        0000 (0)\n+1A562 Disk Start            0000 (0)\n+1A564 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1A566 Ext File Attributes   00000000 (0)\n+1A56A Local Header Offset   00002801 (10241)\n+1A56E Filename              'XXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1A56E: Filename 'XXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1A57E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1A580   Length              0005 (5)\n+1A582   Flags               01 (1) 'Modification'\n+1A583   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1A587 CENTRAL HEADER #4     02014B50 (33639248)\n+1A58B Created Zip Spec      14 (20) '2.0'\n+1A58C Created OS            00 (0) 'MS-DOS'\n+1A58D Extract Zip Spec      14 (20) '2.0'\n+1A58E Extract OS            00 (0) 'MS-DOS'\n+1A58F General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1A591 Compression Method    0000 (0) 'Stored'\n+1A593 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1A597 CRC                   EE027FB2 (3993141170)\n+1A59B Compressed Size       00000019 (25)\n+1A59F Uncompressed Size     00000019 (25)\n+1A5A3 Filename Length       0014 (20)\n+1A5A5 Extra Length          0009 (9)\n+1A5A7 Comment Length        0000 (0)\n+1A5A9 Disk Start            0000 (0)\n+1A5AB Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1A5AD Ext File Attributes   00000000 (0)\n+1A5B1 Local Header Offset   000054A6 (21670)\n+1A5B5 Filename              'XXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1A5B5: Filename 'XXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1A5C9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1A5CB   Length              0005 (5)\n+1A5CD   Flags               01 (1) 'Modification'\n+1A5CE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1A5D2 CENTRAL HEADER #5     02014B50 (33639248)\n+1A5D6 Created Zip Spec      14 (20) '2.0'\n+1A5D7 Created OS            00 (0) 'MS-DOS'\n+1A5D8 Extract Zip Spec      14 (20) '2.0'\n+1A5D9 Extract OS            00 (0) 'MS-DOS'\n+1A5DA General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1A5DC Compression Method    0000 (0) 'Stored'\n+1A5DE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1A5E2 CRC                   B2802DB1 (2994744753)\n+1A5E6 Compressed Size       000000B1 (177)\n+1A5EA Uncompressed Size     000000B1 (177)\n+1A5EE Filename Length       000F (15)\n+1A5F0 Extra Length          0009 (9)\n+1A5F2 Comment Length        0000 (0)\n+1A5F4 Disk Start            0000 (0)\n+1A5F6 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1A5F8 Ext File Attributes   00000000 (0)\n+1A5FC Local Header Offset   0000550A (21770)\n+1A600 Filename              'XXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1A600: Filename 'XXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1A60F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1A611   Length              0005 (5)\n+1A613   Flags               01 (1) 'Modification'\n+1A614   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1A618 CENTRAL HEADER #6     02014B50 (33639248)\n+1A61C Created Zip Spec      14 (20) '2.0'\n+1A61D Created OS            00 (0) 'MS-DOS'\n+1A61E Extract Zip Spec      14 (20) '2.0'\n+1A61F Extract OS            00 (0) 'MS-DOS'\n+1A620 General Purpose Flag  0000 (0)\n+1A622 Compression Method    0000 (0) 'Stored'\n+1A624 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1A628 CRC                   00000000 (0)\n+1A62C Compressed Size       00000000 (0)\n+1A630 Uncompressed Size     00000000 (0)\n+1A634 Filename Length       000F (15)\n+1A636 Extra Length          0009 (9)\n+1A638 Comment Length        0000 (0)\n+1A63A Disk Start            0000 (0)\n+1A63C Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1A63E Ext File Attributes   00000000 (0)\n+1A642 Local Header Offset   00005601 (22017)\n+1A646 Filename              'XXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1A646: Filename 'XXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1A655 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1A657   Length              0005 (5)\n+1A659   Flags               01 (1) 'Modification'\n+1A65A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1A65E CENTRAL HEADER #7     02014B50 (33639248)\n+1A662 Created Zip Spec      14 (20) '2.0'\n+1A663 Created OS            00 (0) 'MS-DOS'\n+1A664 Extract Zip Spec      14 (20) '2.0'\n+1A665 Extract OS            00 (0) 'MS-DOS'\n+1A666 General Purpose Flag  0000 (0)\n+1A668 Compression Method    0000 (0) 'Stored'\n+1A66A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1A66E CRC                   00000000 (0)\n+1A672 Compressed Size       00000000 (0)\n+1A676 Uncompressed Size     00000000 (0)\n+1A67A Filename Length       0018 (24)\n+1A67C Extra Length          0009 (9)\n+1A67E Comment Length        0000 (0)\n+1A680 Disk Start            0000 (0)\n+1A682 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1A684 Ext File Attributes   00000000 (0)\n+1A688 Local Header Offset   00005637 (22071)\n+1A68C Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1A68C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1A6A4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1A6A6   Length              0005 (5)\n+1A6A8   Flags               01 (1) 'Modification'\n+1A6A9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1A6AD CENTRAL HEADER #8     02014B50 (33639248)\n+1A6B1 Created Zip Spec      14 (20) '2.0'\n+1A6B2 Created OS            00 (0) 'MS-DOS'\n+1A6B3 Extract Zip Spec      14 (20) '2.0'\n+1A6B4 Extract OS            00 (0) 'MS-DOS'\n+1A6B5 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1A6B7 Compression Method    0000 (0) 'Stored'\n+1A6B9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1A6BD CRC                   91BA560C (2444908044)\n+1A6C1 Compressed Size       0000003B (59)\n+1A6C5 Uncompressed Size     0000003B (59)\n+1A6C9 Filename Length       0046 (70)\n+1A6CB Extra Length          0009 (9)\n+1A6CD Comment Length        0000 (0)\n+1A6CF Disk Start            0000 (0)\n+1A6D1 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1A6D3 Ext File Attributes   00000000 (0)\n+1A6D7 Local Header Offset   00005676 (22134)\n+1A6DB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1A6DB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1A721 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1A723   Length              0005 (5)\n+1A725   Flags               01 (1) 'Modification'\n+1A726   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1A72A CENTRAL HEADER #9     02014B50 (33639248)\n+1A72E Created Zip Spec      14 (20) '2.0'\n+1A72F Created OS            00 (0) 'MS-DOS'\n+1A730 Extract Zip Spec      14 (20) '2.0'\n+1A731 Extract OS            00 (0) 'MS-DOS'\n+1A732 General Purpose Flag  0000 (0)\n+1A734 Compression Method    0000 (0) 'Stored'\n+1A736 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1A73A CRC                   00000000 (0)\n+1A73E Compressed Size       00000000 (0)\n+1A742 Uncompressed Size     00000000 (0)\n+1A746 Filename Length       000F (15)\n+1A748 Extra Length          0009 (9)\n+1A74A Comment Length        0000 (0)\n+1A74C Disk Start            0000 (0)\n+1A74E Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1A750 Ext File Attributes   00000000 (0)\n+1A754 Local Header Offset   0000572E (22318)\n+1A758 Filename              'XXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1A758: Filename 'XXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1A767 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1A769   Length              0005 (5)\n+1A76B   Flags               01 (1) 'Modification'\n+1A76C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1A770 CENTRAL HEADER #10    02014B50 (33639248)\n+1A774 Created Zip Spec      14 (20) '2.0'\n+1A775 Created OS            00 (0) 'MS-DOS'\n+1A776 Extract Zip Spec      14 (20) '2.0'\n+1A777 Extract OS            00 (0) 'MS-DOS'\n+1A778 General Purpose Flag  0000 (0)\n+1A77A Compression Method    0000 (0) 'Stored'\n+1A77C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1A780 CRC                   00000000 (0)\n+1A784 Compressed Size       00000000 (0)\n+1A788 Uncompressed Size     00000000 (0)\n+1A78C Filename Length       0020 (32)\n+1A78E Extra Length          0009 (9)\n+1A790 Comment Length        0000 (0)\n+1A792 Disk Start            0000 (0)\n+1A794 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1A796 Ext File Attributes   00000000 (0)\n+1A79A Local Header Offset   00005764 (22372)\n+1A79E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1A79E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1A7BE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1A7C0   Length              0005 (5)\n+1A7C2   Flags               01 (1) 'Modification'\n+1A7C3   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1A7C7 CENTRAL HEADER #11    02014B50 (33639248)\n+1A7CB Created Zip Spec      14 (20) '2.0'\n+1A7CC Created OS            00 (0) 'MS-DOS'\n+1A7CD Extract Zip Spec      14 (20) '2.0'\n+1A7CE Extract OS            00 (0) 'MS-DOS'\n+1A7CF General Purpose Flag  0000 (0)\n+1A7D1 Compression Method    0000 (0) 'Stored'\n+1A7D3 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1A7D7 CRC                   00000000 (0)\n+1A7DB Compressed Size       00000000 (0)\n+1A7DF Uncompressed Size     00000000 (0)\n+1A7E3 Filename Length       0035 (53)\n+1A7E5 Extra Length          0009 (9)\n+1A7E7 Comment Length        0000 (0)\n+1A7E9 Disk Start            0000 (0)\n+1A7EB Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1A7ED Ext File Attributes   00000000 (0)\n+1A7F1 Local Header Offset   000057AB (22443)\n+1A7F5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1A7F5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1A82A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1A82C   Length              0005 (5)\n+1A82E   Flags               01 (1) 'Modification'\n+1A82F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1A833 CENTRAL HEADER #12    02014B50 (33639248)\n+1A837 Created Zip Spec      14 (20) '2.0'\n+1A838 Created OS            00 (0) 'MS-DOS'\n+1A839 Extract Zip Spec      14 (20) '2.0'\n+1A83A Extract OS            00 (0) 'MS-DOS'\n+1A83B General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1A83D Compression Method    0000 (0) 'Stored'\n+1A83F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1A843 CRC                   00000000 (0)\n+1A847 Compressed Size       00000000 (0)\n+1A84B Uncompressed Size     00000000 (0)\n+1A84F Filename Length       0043 (67)\n+1A851 Extra Length          0009 (9)\n+1A853 Comment Length        0000 (0)\n+1A855 Disk Start            0000 (0)\n+1A857 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1A859 Ext File Attributes   00000000 (0)\n+1A85D Local Header Offset   00005807 (22535)\n+1A861 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1A861: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1A8A4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1A8A6   Length              0005 (5)\n+1A8A8   Flags               01 (1) 'Modification'\n+1A8A9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1A8AD CENTRAL HEADER #13    02014B50 (33639248)\n+1A8B1 Created Zip Spec      14 (20) '2.0'\n+1A8B2 Created OS            00 (0) 'MS-DOS'\n+1A8B3 Extract Zip Spec      14 (20) '2.0'\n+1A8B4 Extract OS            00 (0) 'MS-DOS'\n+1A8B5 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1A8B7 Compression Method    0000 (0) 'Stored'\n+1A8B9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1A8BD CRC                   DB79C8F6 (3682191606)\n+1A8C1 Compressed Size       00000E01 (3585)\n+1A8C5 Uncompressed Size     00000E01 (3585)\n+1A8C9 Filename Length       003C (60)\n+1A8CB Extra Length          0009 (9)\n+1A8CD Comment Length        0000 (0)\n+1A8CF Disk Start            0000 (0)\n+1A8D1 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1A8D3 Ext File Attributes   00000000 (0)\n+1A8D7 Local Header Offset   00005881 (22657)\n+1A8DB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1A8DB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1A917 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1A919   Length              0005 (5)\n+1A91B   Flags               01 (1) 'Modification'\n+1A91C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1A920 CENTRAL HEADER #14    02014B50 (33639248)\n+1A924 Created Zip Spec      14 (20) '2.0'\n+1A925 Created OS            00 (0) 'MS-DOS'\n+1A926 Extract Zip Spec      14 (20) '2.0'\n+1A927 Extract OS            00 (0) 'MS-DOS'\n+1A928 General Purpose Flag  0000 (0)\n+1A92A Compression Method    0000 (0) 'Stored'\n+1A92C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1A930 CRC                   00000000 (0)\n+1A934 Compressed Size       00000000 (0)\n+1A938 Uncompressed Size     00000000 (0)\n+1A93C Filename Length       0004 (4)\n+1A93E Extra Length          0009 (9)\n+1A940 Comment Length        0000 (0)\n+1A942 Disk Start            0000 (0)\n+1A944 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1A946 Ext File Attributes   00000000 (0)\n+1A94A Local Header Offset   000066F5 (26357)\n+1A94E Filename              'XXXX'\n+#\n+# WARNING: Offset 0x1A94E: Filename 'XXXX'\n+#          Zero length filename\n+#\n+1A952 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1A954   Length              0005 (5)\n+1A956   Flags               01 (1) 'Modification'\n+1A957   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1A95B CENTRAL HEADER #15    02014B50 (33639248)\n+1A95F Created Zip Spec      14 (20) '2.0'\n+1A960 Created OS            00 (0) 'MS-DOS'\n+1A961 Extract Zip Spec      14 (20) '2.0'\n+1A962 Extract OS            00 (0) 'MS-DOS'\n+1A963 General Purpose Flag  0000 (0)\n+1A965 Compression Method    0000 (0) 'Stored'\n+1A967 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1A96B CRC                   00000000 (0)\n+1A96F Compressed Size       00000000 (0)\n+1A973 Uncompressed Size     00000000 (0)\n+1A977 Filename Length       000B (11)\n+1A979 Extra Length          0009 (9)\n+1A97B Comment Length        0000 (0)\n+1A97D Disk Start            0000 (0)\n+1A97F Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1A981 Ext File Attributes   00000000 (0)\n+1A985 Local Header Offset   00006720 (26400)\n+1A989 Filename              'XXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1A989: Filename 'XXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1A994 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1A996   Length              0005 (5)\n+1A998   Flags               01 (1) 'Modification'\n+1A999   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1A99D CENTRAL HEADER #16    02014B50 (33639248)\n+1A9A1 Created Zip Spec      14 (20) '2.0'\n+1A9A2 Created OS            00 (0) 'MS-DOS'\n+1A9A3 Extract Zip Spec      14 (20) '2.0'\n+1A9A4 Extract OS            00 (0) 'MS-DOS'\n+1A9A5 General Purpose Flag  0000 (0)\n+1A9A7 Compression Method    0000 (0) 'Stored'\n+1A9A9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1A9AD CRC                   00000000 (0)\n+1A9B1 Compressed Size       00000000 (0)\n+1A9B5 Uncompressed Size     00000000 (0)\n+1A9B9 Filename Length       0011 (17)\n+1A9BB Extra Length          0009 (9)\n+1A9BD Comment Length        0000 (0)\n+1A9BF Disk Start            0000 (0)\n+1A9C1 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1A9C3 Ext File Attributes   00000000 (0)\n+1A9C7 Local Header Offset   00006752 (26450)\n+1A9CB Filename              'XXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1A9CB: Filename 'XXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1A9DC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1A9DE   Length              0005 (5)\n+1A9E0   Flags               01 (1) 'Modification'\n+1A9E1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1A9E5 CENTRAL HEADER #17    02014B50 (33639248)\n+1A9E9 Created Zip Spec      14 (20) '2.0'\n+1A9EA Created OS            00 (0) 'MS-DOS'\n+1A9EB Extract Zip Spec      14 (20) '2.0'\n+1A9EC Extract OS            00 (0) 'MS-DOS'\n+1A9ED General Purpose Flag  0000 (0)\n+1A9EF Compression Method    0000 (0) 'Stored'\n+1A9F1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1A9F5 CRC                   00000000 (0)\n+1A9F9 Compressed Size       00000000 (0)\n+1A9FD Uncompressed Size     00000000 (0)\n+1AA01 Filename Length       001A (26)\n+1AA03 Extra Length          0009 (9)\n+1AA05 Comment Length        0000 (0)\n+1AA07 Disk Start            0000 (0)\n+1AA09 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1AA0B Ext File Attributes   00000000 (0)\n+1AA0F Local Header Offset   0000678A (26506)\n+1AA13 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1AA13: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1AA2D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1AA2F   Length              0005 (5)\n+1AA31   Flags               01 (1) 'Modification'\n+1AA32   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1AA36 CENTRAL HEADER #18    02014B50 (33639248)\n+1AA3A Created Zip Spec      14 (20) '2.0'\n+1AA3B Created OS            00 (0) 'MS-DOS'\n+1AA3C Extract Zip Spec      14 (20) '2.0'\n+1AA3D Extract OS            00 (0) 'MS-DOS'\n+1AA3E General Purpose Flag  0000 (0)\n+1AA40 Compression Method    0000 (0) 'Stored'\n+1AA42 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1AA46 CRC                   00000000 (0)\n+1AA4A Compressed Size       00000000 (0)\n+1AA4E Uncompressed Size     00000000 (0)\n+1AA52 Filename Length       001F (31)\n+1AA54 Extra Length          0009 (9)\n+1AA56 Comment Length        0000 (0)\n+1AA58 Disk Start            0000 (0)\n+1AA5A Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1AA5C Ext File Attributes   00000000 (0)\n+1AA60 Local Header Offset   000067CB (26571)\n+1AA64 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1AA64: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1AA83 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1AA85   Length              0005 (5)\n+1AA87   Flags               01 (1) 'Modification'\n+1AA88   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1AA8C CENTRAL HEADER #19    02014B50 (33639248)\n+1AA90 Created Zip Spec      14 (20) '2.0'\n+1AA91 Created OS            00 (0) 'MS-DOS'\n+1AA92 Extract Zip Spec      14 (20) '2.0'\n+1AA93 Extract OS            00 (0) 'MS-DOS'\n+1AA94 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1AA96 Compression Method    0000 (0) 'Stored'\n+1AA98 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1AA9C CRC                   2526A8CF (623290575)\n+1AAA0 Compressed Size       00000657 (1623)\n+1AAA4 Uncompressed Size     00000657 (1623)\n+1AAA8 Filename Length       0037 (55)\n+1AAAA Extra Length          0009 (9)\n+1AAAC Comment Length        0000 (0)\n+1AAAE Disk Start            0000 (0)\n+1AAB0 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1AAB2 Ext File Attributes   00000000 (0)\n+1AAB6 Local Header Offset   00006811 (26641)\n+1AABA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1AABA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1AAF1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1AAF3   Length              0005 (5)\n+1AAF5   Flags               01 (1) 'Modification'\n+1AAF6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1AAFA CENTRAL HEADER #20    02014B50 (33639248)\n+1AAFE Created Zip Spec      14 (20) '2.0'\n+1AAFF Created OS            00 (0) 'MS-DOS'\n+1AB00 Extract Zip Spec      14 (20) '2.0'\n+1AB01 Extract OS            00 (0) 'MS-DOS'\n+1AB02 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1AB04 Compression Method    0000 (0) 'Stored'\n+1AB06 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1AB0A CRC                   CD8B51D1 (3448459729)\n+1AB0E Compressed Size       000003DC (988)\n+1AB12 Uncompressed Size     000003DC (988)\n+1AB16 Filename Length       0031 (49)\n+1AB18 Extra Length          0009 (9)\n+1AB1A Comment Length        0000 (0)\n+1AB1C Disk Start            0000 (0)\n+1AB1E Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1AB20 Ext File Attributes   00000000 (0)\n+1AB24 Local Header Offset   00006ED6 (28374)\n+1AB28 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1AB28: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1AB59 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1AB5B   Length              0005 (5)\n+1AB5D   Flags               01 (1) 'Modification'\n+1AB5E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1AB62 CENTRAL HEADER #21    02014B50 (33639248)\n+1AB66 Created Zip Spec      14 (20) '2.0'\n+1AB67 Created OS            00 (0) 'MS-DOS'\n+1AB68 Extract Zip Spec      14 (20) '2.0'\n+1AB69 Extract OS            00 (0) 'MS-DOS'\n+1AB6A General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1AB6C Compression Method    0000 (0) 'Stored'\n+1AB6E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1AB72 CRC                   322BAD20 (841723168)\n+1AB76 Compressed Size       00000700 (1792)\n+1AB7A Uncompressed Size     00000700 (1792)\n+1AB7E Filename Length       002D (45)\n+1AB80 Extra Length          0009 (9)\n+1AB82 Comment Length        0000 (0)\n+1AB84 Disk Start            0000 (0)\n+1AB86 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1AB88 Ext File Attributes   00000000 (0)\n+1AB8C Local Header Offset   0000731A (29466)\n+1AB90 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1AB90: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1ABBD Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1ABBF   Length              0005 (5)\n+1ABC1   Flags               01 (1) 'Modification'\n+1ABC2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1ABC6 CENTRAL HEADER #22    02014B50 (33639248)\n+1ABCA Created Zip Spec      14 (20) '2.0'\n+1ABCB Created OS            00 (0) 'MS-DOS'\n+1ABCC Extract Zip Spec      14 (20) '2.0'\n+1ABCD Extract OS            00 (0) 'MS-DOS'\n+1ABCE General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1ABD0 Compression Method    0000 (0) 'Stored'\n+1ABD2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1ABD6 CRC                   9A56CC71 (2589379697)\n+1ABDA Compressed Size       000019AA (6570)\n+1ABDE Uncompressed Size     000019AA (6570)\n+1ABE2 Filename Length       002E (46)\n+1ABE4 Extra Length          0009 (9)\n+1ABE6 Comment Length        0000 (0)\n+1ABE8 Disk Start            0000 (0)\n+1ABEA Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1ABEC Ext File Attributes   00000000 (0)\n+1ABF0 Local Header Offset   00007A7E (31358)\n+1ABF4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1ABF4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1AC22 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1AC24   Length              0005 (5)\n+1AC26   Flags               01 (1) 'Modification'\n+1AC27   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1AC2B CENTRAL HEADER #23    02014B50 (33639248)\n+1AC2F Created Zip Spec      14 (20) '2.0'\n+1AC30 Created OS            00 (0) 'MS-DOS'\n+1AC31 Extract Zip Spec      14 (20) '2.0'\n+1AC32 Extract OS            00 (0) 'MS-DOS'\n+1AC33 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1AC35 Compression Method    0000 (0) 'Stored'\n+1AC37 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1AC3B CRC                   BBB4B4AC (3149182124)\n+1AC3F Compressed Size       000007E6 (2022)\n+1AC43 Uncompressed Size     000007E6 (2022)\n+1AC47 Filename Length       0033 (51)\n+1AC49 Extra Length          0009 (9)\n+1AC4B Comment Length        0000 (0)\n+1AC4D Disk Start            0000 (0)\n+1AC4F Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1AC51 Ext File Attributes   00000000 (0)\n+1AC55 Local Header Offset   0000948D (38029)\n+1AC59 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1AC59: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1AC8C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1AC8E   Length              0005 (5)\n+1AC90   Flags               01 (1) 'Modification'\n+1AC91   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1AC95 CENTRAL HEADER #24    02014B50 (33639248)\n+1AC99 Created Zip Spec      14 (20) '2.0'\n+1AC9A Created OS            00 (0) 'MS-DOS'\n+1AC9B Extract Zip Spec      14 (20) '2.0'\n+1AC9C Extract OS            00 (0) 'MS-DOS'\n+1AC9D General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1AC9F Compression Method    0000 (0) 'Stored'\n+1ACA1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1ACA5 CRC                   302E6CD8 (808348888)\n+1ACA9 Compressed Size       000004FA (1274)\n+1ACAD Uncompressed Size     000004FA (1274)\n+1ACB1 Filename Length       002F (47)\n+1ACB3 Extra Length          0009 (9)\n+1ACB5 Comment Length        0000 (0)\n+1ACB7 Disk Start            0000 (0)\n+1ACB9 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1ACBB Ext File Attributes   00000000 (0)\n+1ACBF Local Header Offset   00009CDD (40157)\n+1ACC3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1ACC3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1ACF2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1ACF4   Length              0005 (5)\n+1ACF6   Flags               01 (1) 'Modification'\n+1ACF7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1ACFB CENTRAL HEADER #25    02014B50 (33639248)\n+1ACFF Created Zip Spec      14 (20) '2.0'\n+1AD00 Created OS            00 (0) 'MS-DOS'\n+1AD01 Extract Zip Spec      14 (20) '2.0'\n+1AD02 Extract OS            00 (0) 'MS-DOS'\n+1AD03 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1AD05 Compression Method    0000 (0) 'Stored'\n+1AD07 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1AD0B CRC                   6ADC9301 (1792840449)\n+1AD0F Compressed Size       000003E4 (996)\n+1AD13 Uncompressed Size     000003E4 (996)\n+1AD17 Filename Length       0031 (49)\n+1AD19 Extra Length          0009 (9)\n+1AD1B Comment Length        0000 (0)\n+1AD1D Disk Start            0000 (0)\n+1AD1F Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1AD21 Ext File Attributes   00000000 (0)\n+1AD25 Local Header Offset   0000A23D (41533)\n+1AD29 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1AD29: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1AD5A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1AD5C   Length              0005 (5)\n+1AD5E   Flags               01 (1) 'Modification'\n+1AD5F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1AD63 CENTRAL HEADER #26    02014B50 (33639248)\n+1AD67 Created Zip Spec      14 (20) '2.0'\n+1AD68 Created OS            00 (0) 'MS-DOS'\n+1AD69 Extract Zip Spec      14 (20) '2.0'\n+1AD6A Extract OS            00 (0) 'MS-DOS'\n+1AD6B General Purpose Flag  0000 (0)\n+1AD6D Compression Method    0000 (0) 'Stored'\n+1AD6F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1AD73 CRC                   00000000 (0)\n+1AD77 Compressed Size       00000000 (0)\n+1AD7B Uncompressed Size     00000000 (0)\n+1AD7F Filename Length       0025 (37)\n+1AD81 Extra Length          0009 (9)\n+1AD83 Comment Length        0000 (0)\n+1AD85 Disk Start            0000 (0)\n+1AD87 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1AD89 Ext File Attributes   00000000 (0)\n+1AD8D Local Header Offset   0000A689 (42633)\n+1AD91 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1AD91: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1ADB6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1ADB8   Length              0005 (5)\n+1ADBA   Flags               01 (1) 'Modification'\n+1ADBB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1ADBF CENTRAL HEADER #27    02014B50 (33639248)\n+1ADC3 Created Zip Spec      14 (20) '2.0'\n+1ADC4 Created OS            00 (0) 'MS-DOS'\n+1ADC5 Extract Zip Spec      14 (20) '2.0'\n+1ADC6 Extract OS            00 (0) 'MS-DOS'\n+1ADC7 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1ADC9 Compression Method    0000 (0) 'Stored'\n+1ADCB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1ADCF CRC                   F69577E7 (4136990695)\n+1ADD3 Compressed Size       0000048A (1162)\n+1ADD7 Uncompressed Size     0000048A (1162)\n+1ADDB Filename Length       0041 (65)\n+1ADDD Extra Length          0009 (9)\n+1ADDF Comment Length        0000 (0)\n+1ADE1 Disk Start            0000 (0)\n+1ADE3 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1ADE5 Ext File Attributes   00000000 (0)\n+1ADE9 Local Header Offset   0000A6D5 (42709)\n+1ADED Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1ADED: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1AE2E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1AE30   Length              0005 (5)\n+1AE32   Flags               01 (1) 'Modification'\n+1AE33   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1AE37 CENTRAL HEADER #28    02014B50 (33639248)\n+1AE3B Created Zip Spec      14 (20) '2.0'\n+1AE3C Created OS            00 (0) 'MS-DOS'\n+1AE3D Extract Zip Spec      14 (20) '2.0'\n+1AE3E Extract OS            00 (0) 'MS-DOS'\n+1AE3F General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1AE41 Compression Method    0000 (0) 'Stored'\n+1AE43 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1AE47 CRC                   93092688 (2466850440)\n+1AE4B Compressed Size       000042E1 (17121)\n+1AE4F Uncompressed Size     000042E1 (17121)\n+1AE53 Filename Length       0035 (53)\n+1AE55 Extra Length          0009 (9)\n+1AE57 Comment Length        0000 (0)\n+1AE59 Disk Start            0000 (0)\n+1AE5B Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1AE5D Ext File Attributes   00000000 (0)\n+1AE61 Local Header Offset   0000ABD7 (43991)\n+1AE65 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1AE65: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1AE9A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1AE9C   Length              0005 (5)\n+1AE9E   Flags               01 (1) 'Modification'\n+1AE9F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1AEA3 CENTRAL HEADER #29    02014B50 (33639248)\n+1AEA7 Created Zip Spec      14 (20) '2.0'\n+1AEA8 Created OS            00 (0) 'MS-DOS'\n+1AEA9 Extract Zip Spec      14 (20) '2.0'\n+1AEAA Extract OS            00 (0) 'MS-DOS'\n+1AEAB General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1AEAD Compression Method    0000 (0) 'Stored'\n+1AEAF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1AEB3 CRC                   29CC663D (701261373)\n+1AEB7 Compressed Size       000071B8 (29112)\n+1AEBB Uncompressed Size     000071B8 (29112)\n+1AEBF Filename Length       003C (60)\n+1AEC1 Extra Length          0009 (9)\n+1AEC3 Comment Length        0000 (0)\n+1AEC5 Disk Start            0000 (0)\n+1AEC7 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1AEC9 Ext File Attributes   00000000 (0)\n+1AECD Local Header Offset   0000EF24 (61220)\n+1AED1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1AED1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1AF0D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1AF0F   Length              0005 (5)\n+1AF11   Flags               01 (1) 'Modification'\n+1AF12   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1AF16 CENTRAL HEADER #30    02014B50 (33639248)\n+1AF1A Created Zip Spec      14 (20) '2.0'\n+1AF1B Created OS            00 (0) 'MS-DOS'\n+1AF1C Extract Zip Spec      14 (20) '2.0'\n+1AF1D Extract OS            00 (0) 'MS-DOS'\n+1AF1E General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1AF20 Compression Method    0000 (0) 'Stored'\n+1AF22 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1AF26 CRC                   11BF3CA1 (297745569)\n+1AF2A Compressed Size       0000049E (1182)\n+1AF2E Uncompressed Size     0000049E (1182)\n+1AF32 Filename Length       003A (58)\n+1AF34 Extra Length          0009 (9)\n+1AF36 Comment Length        0000 (0)\n+1AF38 Disk Start            0000 (0)\n+1AF3A Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1AF3C Ext File Attributes   00000000 (0)\n+1AF40 Local Header Offset   0001614F (90447)\n+1AF44 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1AF44: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1AF7E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1AF80   Length              0005 (5)\n+1AF82   Flags               01 (1) 'Modification'\n+1AF83   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1AF87 CENTRAL HEADER #31    02014B50 (33639248)\n+1AF8B Created Zip Spec      14 (20) '2.0'\n+1AF8C Created OS            00 (0) 'MS-DOS'\n+1AF8D Extract Zip Spec      14 (20) '2.0'\n+1AF8E Extract OS            00 (0) 'MS-DOS'\n+1AF8F General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1AF91 Compression Method    0000 (0) 'Stored'\n+1AF93 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1AF97 CRC                   8B7AC527 (2340078887)\n+1AF9B Compressed Size       00000DCC (3532)\n+1AF9F Uncompressed Size     00000DCC (3532)\n+1AFA3 Filename Length       0034 (52)\n+1AFA5 Extra Length          0009 (9)\n+1AFA7 Comment Length        0000 (0)\n+1AFA9 Disk Start            0000 (0)\n+1AFAB Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1AFAD Ext File Attributes   00000000 (0)\n+1AFB1 Local Header Offset   0001665E (91742)\n+1AFB5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1AFB5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1AFE9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1AFEB   Length              0005 (5)\n+1AFED   Flags               01 (1) 'Modification'\n+1AFEE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1AFF2 CENTRAL HEADER #32    02014B50 (33639248)\n+1AFF6 Created Zip Spec      14 (20) '2.0'\n+1AFF7 Created OS            00 (0) 'MS-DOS'\n+1AFF8 Extract Zip Spec      14 (20) '2.0'\n+1AFF9 Extract OS            00 (0) 'MS-DOS'\n+1AFFA General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1AFFC Compression Method    0000 (0) 'Stored'\n+1AFFE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1B002 CRC                   117709A7 (293013927)\n+1B006 Compressed Size       0000056A (1386)\n+1B00A Uncompressed Size     0000056A (1386)\n+1B00E Filename Length       0035 (53)\n+1B010 Extra Length          0009 (9)\n+1B012 Comment Length        0000 (0)\n+1B014 Disk Start            0000 (0)\n+1B016 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1B018 Ext File Attributes   00000000 (0)\n+1B01C Local Header Offset   00017495 (95381)\n+1B020 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1B020: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1B055 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1B057   Length              0005 (5)\n+1B059   Flags               01 (1) 'Modification'\n+1B05A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1B05E CENTRAL HEADER #33    02014B50 (33639248)\n+1B062 Created Zip Spec      14 (20) '2.0'\n+1B063 Created OS            00 (0) 'MS-DOS'\n+1B064 Extract Zip Spec      14 (20) '2.0'\n+1B065 Extract OS            00 (0) 'MS-DOS'\n+1B066 General Purpose Flag  0000 (0)\n+1B068 Compression Method    0000 (0) 'Stored'\n+1B06A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1B06E CRC                   00000000 (0)\n+1B072 Compressed Size       00000000 (0)\n+1B076 Uncompressed Size     00000000 (0)\n+1B07A Filename Length       0026 (38)\n+1B07C Extra Length          0009 (9)\n+1B07E Comment Length        0000 (0)\n+1B080 Disk Start            0000 (0)\n+1B082 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1B084 Ext File Attributes   00000000 (0)\n+1B088 Local Header Offset   00017A6B (96875)\n+1B08C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1B08C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1B0B2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1B0B4   Length              0005 (5)\n+1B0B6   Flags               01 (1) 'Modification'\n+1B0B7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1B0BB CENTRAL HEADER #34    02014B50 (33639248)\n+1B0BF Created Zip Spec      14 (20) '2.0'\n+1B0C0 Created OS            00 (0) 'MS-DOS'\n+1B0C1 Extract Zip Spec      14 (20) '2.0'\n+1B0C2 Extract OS            00 (0) 'MS-DOS'\n+1B0C3 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1B0C5 Compression Method    0000 (0) 'Stored'\n+1B0C7 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1B0CB CRC                   A1B16DDC (2712759772)\n+1B0CF Compressed Size       00000BB9 (3001)\n+1B0D3 Uncompressed Size     00000BB9 (3001)\n+1B0D7 Filename Length       0035 (53)\n+1B0D9 Extra Length          0009 (9)\n+1B0DB Comment Length        0000 (0)\n+1B0DD Disk Start            0000 (0)\n+1B0DF Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1B0E1 Ext File Attributes   00000000 (0)\n+1B0E5 Local Header Offset   00017AB8 (96952)\n+1B0E9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1B0E9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1B11E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1B120   Length              0005 (5)\n+1B122   Flags               01 (1) 'Modification'\n+1B123   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1B127 CENTRAL HEADER #35    02014B50 (33639248)\n+1B12B Created Zip Spec      14 (20) '2.0'\n+1B12C Created OS            00 (0) 'MS-DOS'\n+1B12D Extract Zip Spec      14 (20) '2.0'\n+1B12E Extract OS            00 (0) 'MS-DOS'\n+1B12F General Purpose Flag  0000 (0)\n+1B131 Compression Method    0000 (0) 'Stored'\n+1B133 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1B137 CRC                   00000000 (0)\n+1B13B Compressed Size       00000000 (0)\n+1B13F Uncompressed Size     00000000 (0)\n+1B143 Filename Length       0027 (39)\n+1B145 Extra Length          0009 (9)\n+1B147 Comment Length        0000 (0)\n+1B149 Disk Start            0000 (0)\n+1B14B Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1B14D Ext File Attributes   00000000 (0)\n+1B151 Local Header Offset   000186DD (100061)\n+1B155 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1B155: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1B17C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1B17E   Length              0005 (5)\n+1B180   Flags               01 (1) 'Modification'\n+1B181   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1B185 CENTRAL HEADER #36    02014B50 (33639248)\n+1B189 Created Zip Spec      14 (20) '2.0'\n+1B18A Created OS            00 (0) 'MS-DOS'\n+1B18B Extract Zip Spec      14 (20) '2.0'\n+1B18C Extract OS            00 (0) 'MS-DOS'\n+1B18D General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1B18F Compression Method    0000 (0) 'Stored'\n+1B191 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1B195 CRC                   43B8CAA4 (1136183972)\n+1B199 Compressed Size       00001D14 (7444)\n+1B19D Uncompressed Size     00001D14 (7444)\n+1B1A1 Filename Length       003E (62)\n+1B1A3 Extra Length          0009 (9)\n+1B1A5 Comment Length        0000 (0)\n+1B1A7 Disk Start            0000 (0)\n+1B1A9 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1B1AB Ext File Attributes   00000000 (0)\n+1B1AF Local Header Offset   0001872B (100139)\n+1B1B3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1B1B3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1B1F1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1B1F3   Length              0005 (5)\n+1B1F5   Flags               01 (1) 'Modification'\n+1B1F6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1B1FA END CENTRAL HEADER    06054B50 (101010256)\n+1B1FE Number of this disk   0000 (0)\n+1B200 Central Dir Disk no   0000 (0)\n+1B202 Entries in this disk  0024 (36)\n+1B204 Total Entries         0024 (36)\n+1B206 Size of Central Dir   00000D46 (3398)\n+1B20A Offset to Central Dir 0001A4B4 (107700)\n+1B20E Comment Length        0000 (0)\n #\n # Warning Count: 72\n #\n # Done\n"}, {"source1": "META-INF/maven/org.apache.dubbo/dubbo-remoting-etcd3/pom.xml", "source2": "META-INF/maven/org.apache.dubbo/dubbo-remoting-etcd3/pom.xml", "comments": ["Format-specific differences are supported for XML files but no file-specific differences were detected; falling back to a binary diff. file(1) reports: XML 1.0 document, ASCII text, with CRLF line terminators"], "has_internal_linenos": true, "unified_diff": "@@ -1,231 +1,225 @@\n 00000000: 3c3f 786d 6c20 7665 7273 696f 6e3d 2231  <?xml version=\"1\n 00000010: 2e30 2220 656e 636f 6469 6e67 3d22 5554  .0\" encoding=\"UT\n-00000020: 462d 3822 3f3e 0d0a 3c21 2d2d 0d0a 2020  F-8\"?>..<!--..  \n-00000030: 7e20 4c69 6365 6e73 6564 2074 6f20 7468  ~ Licensed to th\n-00000040: 6520 4170 6163 6865 2053 6f66 7477 6172  e Apache Softwar\n-00000050: 6520 466f 756e 6461 7469 6f6e 2028 4153  e Foundation (AS\n-00000060: 4629 2075 6e64 6572 206f 6e65 206f 7220  F) under one or \n-00000070: 6d6f 7265 0d0a 2020 7e20 636f 6e74 7269  more..  ~ contri\n-00000080: 6275 746f 7220 6c69 6365 6e73 6520 6167  butor license ag\n-00000090: 7265 656d 656e 7473 2e20 2053 6565 2074  reements.  See t\n-000000a0: 6865 204e 4f54 4943 4520 6669 6c65 2064  he NOTICE file d\n-000000b0: 6973 7472 6962 7574 6564 2077 6974 680d  istributed with.\n-000000c0: 0a20 207e 2074 6869 7320 776f 726b 2066  .  ~ this work f\n-000000d0: 6f72 2061 6464 6974 696f 6e61 6c20 696e  or additional in\n-000000e0: 666f 726d 6174 696f 6e20 7265 6761 7264  formation regard\n-000000f0: 696e 6720 636f 7079 7269 6768 7420 6f77  ing copyright ow\n-00000100: 6e65 7273 6869 702e 0d0a 2020 7e20 5468  nership...  ~ Th\n-00000110: 6520 4153 4620 6c69 6365 6e73 6573 2074  e ASF licenses t\n-00000120: 6869 7320 6669 6c65 2074 6f20 596f 7520  his file to You \n-00000130: 756e 6465 7220 7468 6520 4170 6163 6865  under the Apache\n-00000140: 204c 6963 656e 7365 2c20 5665 7273 696f   License, Versio\n-00000150: 6e20 322e 300d 0a20 207e 2028 7468 6520  n 2.0..  ~ (the \n-00000160: 224c 6963 656e 7365 2229 3b20 796f 7520  \"License\"); you \n-00000170: 6d61 7920 6e6f 7420 7573 6520 7468 6973  may not use this\n-00000180: 2066 696c 6520 6578 6365 7074 2069 6e20   file except in \n-00000190: 636f 6d70 6c69 616e 6365 2077 6974 680d  compliance with.\n-000001a0: 0a20 207e 2074 6865 204c 6963 656e 7365  .  ~ the License\n-000001b0: 2e20 2059 6f75 206d 6179 206f 6274 6169  .  You may obtai\n-000001c0: 6e20 6120 636f 7079 206f 6620 7468 6520  n a copy of the \n-000001d0: 4c69 6365 6e73 6520 6174 0d0a 2020 7e0d  License at..  ~.\n-000001e0: 0a20 207e 2020 2020 2068 7474 703a 2f2f  .  ~     http://\n-000001f0: 7777 772e 6170 6163 6865 2e6f 7267 2f6c  www.apache.org/l\n-00000200: 6963 656e 7365 732f 4c49 4345 4e53 452d  icenses/LICENSE-\n-00000210: 322e 300d 0a20 207e 0d0a 2020 7e20 556e  2.0..  ~..  ~ Un\n-00000220: 6c65 7373 2072 6571 7569 7265 6420 6279  less required by\n-00000230: 2061 7070 6c69 6361 626c 6520 6c61 7720   applicable law \n-00000240: 6f72 2061 6772 6565 6420 746f 2069 6e20  or agreed to in \n-00000250: 7772 6974 696e 672c 2073 6f66 7477 6172  writing, softwar\n-00000260: 650d 0a20 207e 2064 6973 7472 6962 7574  e..  ~ distribut\n-00000270: 6564 2075 6e64 6572 2074 6865 204c 6963  ed under the Lic\n-00000280: 656e 7365 2069 7320 6469 7374 7269 6275  ense is distribu\n-00000290: 7465 6420 6f6e 2061 6e20 2241 5320 4953  ted on an \"AS IS\n-000002a0: 2220 4241 5349 532c 0d0a 2020 7e20 5749  \" BASIS,..  ~ WI\n-000002b0: 5448 4f55 5420 5741 5252 414e 5449 4553  THOUT WARRANTIES\n-000002c0: 204f 5220 434f 4e44 4954 494f 4e53 204f   OR CONDITIONS O\n-000002d0: 4620 414e 5920 4b49 4e44 2c20 6569 7468  F ANY KIND, eith\n-000002e0: 6572 2065 7870 7265 7373 206f 7220 696d  er express or im\n-000002f0: 706c 6965 642e 0d0a 2020 7e20 5365 6520  plied...  ~ See \n-00000300: 7468 6520 4c69 6365 6e73 6520 666f 7220  the License for \n-00000310: 7468 6520 7370 6563 6966 6963 206c 616e  the specific lan\n-00000320: 6775 6167 6520 676f 7665 726e 696e 6720  guage governing \n-00000330: 7065 726d 6973 7369 6f6e 7320 616e 640d  permissions and.\n-00000340: 0a20 207e 206c 696d 6974 6174 696f 6e73  .  ~ limitations\n-00000350: 2075 6e64 6572 2074 6865 204c 6963 656e   under the Licen\n-00000360: 7365 2e0d 0a20 202d 2d3e 0d0a 3c70 726f  se...  -->..<pro\n-00000370: 6a65 6374 2078 7369 3a73 6368 656d 614c  ject xsi:schemaL\n-00000380: 6f63 6174 696f 6e3d 2268 7474 703a 2f2f  ocation=\"http://\n-00000390: 6d61 7665 6e2e 6170 6163 6865 2e6f 7267  maven.apache.org\n-000003a0: 2f50 4f4d 2f34 2e30 2e30 2068 7474 7073  /POM/4.0.0 https\n-000003b0: 3a2f 2f6d 6176 656e 2e61 7061 6368 652e  ://maven.apache.\n-000003c0: 6f72 672f 7873 642f 6d61 7665 6e2d 342e  org/xsd/maven-4.\n-000003d0: 302e 302e 7873 6422 2078 6d6c 6e73 3d22  0.0.xsd\" xmlns=\"\n-000003e0: 6874 7470 3a2f 2f6d 6176 656e 2e61 7061  http://maven.apa\n-000003f0: 6368 652e 6f72 672f 504f 4d2f 342e 302e  che.org/POM/4.0.\n-00000400: 3022 0d0a 2020 2020 786d 6c6e 733a 7873  0\"..    xmlns:xs\n-00000410: 693d 2268 7474 703a 2f2f 7777 772e 7733  i=\"http://www.w3\n-00000420: 2e6f 7267 2f32 3030 312f 584d 4c53 6368  .org/2001/XMLSch\n-00000430: 656d 612d 696e 7374 616e 6365 223e 0d0a  ema-instance\">..\n-00000440: 2020 3c6d 6f64 656c 5665 7273 696f 6e3e    <modelVersion>\n-00000450: 342e 302e 303c 2f6d 6f64 656c 5665 7273  4.0.0</modelVers\n-00000460: 696f 6e3e 0d0a 2020 3c70 6172 656e 743e  ion>..  <parent>\n-00000470: 0d0a 2020 2020 3c67 726f 7570 4964 3e6f  ..    <groupId>o\n-00000480: 7267 2e61 7061 6368 652e 6475 6262 6f3c  rg.apache.dubbo<\n-00000490: 2f67 726f 7570 4964 3e0d 0a20 2020 203c  /groupId>..    <\n-000004a0: 6172 7469 6661 6374 4964 3e64 7562 626f  artifactId>dubbo\n-000004b0: 2d72 656d 6f74 696e 673c 2f61 7274 6966  -remoting</artif\n-000004c0: 6163 7449 643e 0d0a 2020 2020 3c76 6572  actId>..    <ver\n-000004d0: 7369 6f6e 3e32 2e37 2e31 303c 2f76 6572  sion>2.7.10</ver\n-000004e0: 7369 6f6e 3e0d 0a20 203c 2f70 6172 656e  sion>..  </paren\n-000004f0: 743e 0d0a 2020 3c67 726f 7570 4964 3e6f  t>..  <groupId>o\n-00000500: 7267 2e61 7061 6368 652e 6475 6262 6f3c  rg.apache.dubbo<\n-00000510: 2f67 726f 7570 4964 3e0d 0a20 203c 6172  /groupId>..  <ar\n-00000520: 7469 6661 6374 4964 3e64 7562 626f 2d72  tifactId>dubbo-r\n-00000530: 656d 6f74 696e 672d 6574 6364 333c 2f61  emoting-etcd3</a\n-00000540: 7274 6966 6163 7449 643e 0d0a 2020 3c76  rtifactId>..  <v\n-00000550: 6572 7369 6f6e 3e32 2e37 2e31 303c 2f76  ersion>2.7.10</v\n-00000560: 6572 7369 6f6e 3e0d 0a20 203c 6e61 6d65  ersion>..  <name\n-00000570: 3e24 7b70 726f 6a65 6374 2e61 7274 6966  >${project.artif\n-00000580: 6163 7449 647d 3c2f 6e61 6d65 3e0d 0a20  actId}</name>.. \n-00000590: 203c 6465 7363 7269 7074 696f 6e3e 5468   <description>Th\n-000005a0: 6520 6574 6364 3320 7265 6d6f 7469 6e67  e etcd3 remoting\n-000005b0: 206d 6f64 756c 6520 6f66 2044 7562 626f   module of Dubbo\n-000005c0: 2070 726f 6a65 6374 3c2f 6465 7363 7269   project</descri\n-000005d0: 7074 696f 6e3e 0d0a 2020 3c6c 6963 656e  ption>..  <licen\n-000005e0: 7365 733e 0d0a 2020 2020 3c6c 6963 656e  ses>..    <licen\n-000005f0: 7365 3e0d 0a20 2020 2020 203c 6e61 6d65  se>..      <name\n-00000600: 3e41 7061 6368 6520 4c69 6365 6e73 652c  >Apache License,\n-00000610: 2056 6572 7369 6f6e 2032 2e30 3c2f 6e61   Version 2.0</na\n-00000620: 6d65 3e0d 0a20 2020 2020 203c 7572 6c3e  me>..      <url>\n-00000630: 6874 7470 3a2f 2f77 7777 2e61 7061 6368  http://www.apach\n-00000640: 652e 6f72 672f 6c69 6365 6e73 6573 2f4c  e.org/licenses/L\n-00000650: 4943 454e 5345 2d32 2e30 3c2f 7572 6c3e  ICENSE-2.0</url>\n-00000660: 0d0a 2020 2020 2020 3c64 6973 7472 6962  ..      <distrib\n-00000670: 7574 696f 6e3e 7265 706f 3c2f 6469 7374  ution>repo</dist\n-00000680: 7269 6275 7469 6f6e 3e0d 0a20 2020 203c  ribution>..    <\n-00000690: 2f6c 6963 656e 7365 3e0d 0a20 203c 2f6c  /license>..  </l\n-000006a0: 6963 656e 7365 733e 0d0a 2020 3c70 726f  icenses>..  <pro\n-000006b0: 7065 7274 6965 733e 0d0a 2020 2020 3c73  perties>..    <s\n-000006c0: 6b69 7049 6e74 6567 7261 7469 6f6e 5465  kipIntegrationTe\n-000006d0: 7374 733e 7472 7565 3c2f 736b 6970 496e  sts>true</skipIn\n-000006e0: 7465 6772 6174 696f 6e54 6573 7473 3e0d  tegrationTests>.\n-000006f0: 0a20 2020 203c 736b 6970 5f6d 6176 656e  .    <skip_maven\n-00000700: 5f64 6570 6c6f 793e 6661 6c73 653c 2f73  _deploy>false</s\n-00000710: 6b69 705f 6d61 7665 6e5f 6465 706c 6f79  kip_maven_deploy\n-00000720: 3e0d 0a20 2020 203c 6173 7365 7274 6a2e  >..    <assertj.\n-00000730: 7665 7273 696f 6e3e 332e 3133 2e32 3c2f  version>3.13.2</\n-00000740: 6173 7365 7274 6a2e 7665 7273 696f 6e3e  assertj.version>\n-00000750: 0d0a 2020 3c2f 7072 6f70 6572 7469 6573  ..  </properties\n-00000760: 3e0d 0a20 203c 6465 7065 6e64 656e 6369  >..  <dependenci\n-00000770: 6573 3e0d 0a20 2020 203c 6465 7065 6e64  es>..    <depend\n-00000780: 656e 6379 3e0d 0a20 2020 2020 203c 6772  ency>..      <gr\n-00000790: 6f75 7049 643e 6f72 672e 6170 6163 6865  oupId>org.apache\n-000007a0: 2e64 7562 626f 3c2f 6772 6f75 7049 643e  .dubbo</groupId>\n-000007b0: 0d0a 2020 2020 2020 3c61 7274 6966 6163  ..      <artifac\n-000007c0: 7449 643e 6475 6262 6f2d 7265 6d6f 7469  tId>dubbo-remoti\n-000007d0: 6e67 2d61 7069 3c2f 6172 7469 6661 6374  ng-api</artifact\n-000007e0: 4964 3e0d 0a20 2020 2020 203c 7665 7273  Id>..      <vers\n-000007f0: 696f 6e3e 247b 7072 6f6a 6563 742e 7061  ion>${project.pa\n-00000800: 7265 6e74 2e76 6572 7369 6f6e 7d3c 2f76  rent.version}</v\n-00000810: 6572 7369 6f6e 3e0d 0a20 2020 203c 2f64  ersion>..    </d\n-00000820: 6570 656e 6465 6e63 793e 0d0a 2020 2020  ependency>..    \n-00000830: 3c64 6570 656e 6465 6e63 793e 0d0a 2020  <dependency>..  \n-00000840: 2020 2020 3c67 726f 7570 4964 3e6f 7267      <groupId>org\n-00000850: 2e61 7061 6368 652e 6475 6262 6f3c 2f67  .apache.dubbo</g\n-00000860: 726f 7570 4964 3e0d 0a20 2020 2020 203c  roupId>..      <\n-00000870: 6172 7469 6661 6374 4964 3e64 7562 626f  artifactId>dubbo\n-00000880: 2d63 6f6d 6d6f 6e3c 2f61 7274 6966 6163  -common</artifac\n-00000890: 7449 643e 0d0a 2020 2020 2020 3c76 6572  tId>..      <ver\n-000008a0: 7369 6f6e 3e24 7b70 726f 6a65 6374 2e70  sion>${project.p\n-000008b0: 6172 656e 742e 7665 7273 696f 6e7d 3c2f  arent.version}</\n-000008c0: 7665 7273 696f 6e3e 0d0a 2020 2020 3c2f  version>..    </\n-000008d0: 6465 7065 6e64 656e 6379 3e0d 0a20 2020  dependency>..   \n-000008e0: 203c 6465 7065 6e64 656e 6379 3e0d 0a20   <dependency>.. \n-000008f0: 2020 2020 203c 6772 6f75 7049 643e 696f       <groupId>io\n-00000900: 2e65 7463 643c 2f67 726f 7570 4964 3e0d  .etcd</groupId>.\n-00000910: 0a20 2020 2020 203c 6172 7469 6661 6374  .      <artifact\n-00000920: 4964 3e6a 6574 6364 2d63 6f72 653c 2f61  Id>jetcd-core</a\n-00000930: 7274 6966 6163 7449 643e 0d0a 2020 2020  rtifactId>..    \n-00000940: 3c2f 6465 7065 6e64 656e 6379 3e0d 0a20  </dependency>.. \n-00000950: 2020 203c 6465 7065 6e64 656e 6379 3e0d     <dependency>.\n-00000960: 0a20 2020 2020 203c 6772 6f75 7049 643e  .      <groupId>\n-00000970: 696f 2e67 7270 633c 2f67 726f 7570 4964  io.grpc</groupId\n-00000980: 3e0d 0a20 2020 2020 203c 6172 7469 6661  >..      <artifa\n-00000990: 6374 4964 3e67 7270 632d 636f 7265 3c2f  ctId>grpc-core</\n-000009a0: 6172 7469 6661 6374 4964 3e0d 0a20 2020  artifactId>..   \n-000009b0: 203c 2f64 6570 656e 6465 6e63 793e 0d0a   </dependency>..\n-000009c0: 2020 2020 3c64 6570 656e 6465 6e63 793e      <dependency>\n-000009d0: 0d0a 2020 2020 2020 3c67 726f 7570 4964  ..      <groupId\n-000009e0: 3e69 6f2e 6772 7063 3c2f 6772 6f75 7049  >io.grpc</groupI\n-000009f0: 643e 0d0a 2020 2020 2020 3c61 7274 6966  d>..      <artif\n-00000a00: 6163 7449 643e 6772 7063 2d6e 6574 7479  actId>grpc-netty\n-00000a10: 3c2f 6172 7469 6661 6374 4964 3e0d 0a20  </artifactId>.. \n-00000a20: 2020 203c 2f64 6570 656e 6465 6e63 793e     </dependency>\n-00000a30: 0d0a 2020 2020 3c64 6570 656e 6465 6e63  ..    <dependenc\n-00000a40: 793e 0d0a 2020 2020 2020 3c67 726f 7570  y>..      <group\n-00000a50: 4964 3e69 6f2e 6772 7063 3c2f 6772 6f75  Id>io.grpc</grou\n-00000a60: 7049 643e 0d0a 2020 2020 2020 3c61 7274  pId>..      <art\n-00000a70: 6966 6163 7449 643e 6772 7063 2d70 726f  ifactId>grpc-pro\n-00000a80: 746f 6275 663c 2f61 7274 6966 6163 7449  tobuf</artifactI\n-00000a90: 643e 0d0a 2020 2020 3c2f 6465 7065 6e64  d>..    </depend\n-00000aa0: 656e 6379 3e0d 0a20 2020 203c 6465 7065  ency>..    <depe\n-00000ab0: 6e64 656e 6379 3e0d 0a20 2020 2020 203c  ndency>..      <\n-00000ac0: 6772 6f75 7049 643e 696f 2e67 7270 633c  groupId>io.grpc<\n-00000ad0: 2f67 726f 7570 4964 3e0d 0a20 2020 2020  /groupId>..     \n-00000ae0: 203c 6172 7469 6661 6374 4964 3e67 7270   <artifactId>grp\n-00000af0: 632d 7374 7562 3c2f 6172 7469 6661 6374  c-stub</artifact\n-00000b00: 4964 3e0d 0a20 2020 203c 2f64 6570 656e  Id>..    </depen\n-00000b10: 6465 6e63 793e 0d0a 2020 2020 3c64 6570  dency>..    <dep\n-00000b20: 656e 6465 6e63 793e 0d0a 2020 2020 2020  endency>..      \n-00000b30: 3c67 726f 7570 4964 3e69 6f2e 6772 7063  <groupId>io.grpc\n-00000b40: 3c2f 6772 6f75 7049 643e 0d0a 2020 2020  </groupId>..    \n-00000b50: 2020 3c61 7274 6966 6163 7449 643e 6772    <artifactId>gr\n-00000b60: 7063 2d67 7270 636c 623c 2f61 7274 6966  pc-grpclb</artif\n-00000b70: 6163 7449 643e 0d0a 2020 2020 3c2f 6465  actId>..    </de\n-00000b80: 7065 6e64 656e 6379 3e0d 0a20 2020 203c  pendency>..    <\n-00000b90: 6465 7065 6e64 656e 6379 3e0d 0a20 2020  dependency>..   \n-00000ba0: 2020 203c 6772 6f75 7049 643e 696f 2e65     <groupId>io.e\n-00000bb0: 7463 643c 2f67 726f 7570 4964 3e0d 0a20  tcd</groupId>.. \n-00000bc0: 2020 2020 203c 6172 7469 6661 6374 4964       <artifactId\n-00000bd0: 3e6a 6574 6364 2d6c 6175 6e63 6865 723c  >jetcd-launcher<\n-00000be0: 2f61 7274 6966 6163 7449 643e 0d0a 2020  /artifactId>..  \n-00000bf0: 2020 2020 3c73 636f 7065 3e74 6573 743c      <scope>test<\n-00000c00: 2f73 636f 7065 3e0d 0a20 2020 203c 2f64  /scope>..    </d\n-00000c10: 6570 656e 6465 6e63 793e 0d0a 2020 2020  ependency>..    \n-00000c20: 3c64 6570 656e 6465 6e63 793e 0d0a 2020  <dependency>..  \n-00000c30: 2020 2020 3c67 726f 7570 4964 3e69 6f2e      <groupId>io.\n-00000c40: 6e65 7474 793c 2f67 726f 7570 4964 3e0d  netty</groupId>.\n-00000c50: 0a20 2020 2020 203c 6172 7469 6661 6374  .      <artifact\n-00000c60: 4964 3e6e 6574 7479 2d61 6c6c 3c2f 6172  Id>netty-all</ar\n-00000c70: 7469 6661 6374 4964 3e0d 0a20 2020 203c  tifactId>..    <\n-00000c80: 2f64 6570 656e 6465 6e63 793e 0d0a 2020  /dependency>..  \n-00000c90: 2020 3c64 6570 656e 6465 6e63 793e 0d0a    <dependency>..\n-00000ca0: 2020 2020 2020 3c67 726f 7570 4964 3e6f        <groupId>o\n-00000cb0: 7267 2e61 7373 6572 746a 3c2f 6772 6f75  rg.assertj</grou\n-00000cc0: 7049 643e 0d0a 2020 2020 2020 3c61 7274  pId>..      <art\n-00000cd0: 6966 6163 7449 643e 6173 7365 7274 6a2d  ifactId>assertj-\n-00000ce0: 636f 7265 3c2f 6172 7469 6661 6374 4964  core</artifactId\n-00000cf0: 3e0d 0a20 2020 2020 203c 7665 7273 696f  >..      <versio\n-00000d00: 6e3e 247b 6173 7365 7274 6a2e 7665 7273  n>${assertj.vers\n-00000d10: 696f 6e7d 3c2f 7665 7273 696f 6e3e 0d0a  ion}</version>..\n-00000d20: 2020 2020 2020 3c73 636f 7065 3e74 6573        <scope>tes\n-00000d30: 743c 2f73 636f 7065 3e0d 0a20 2020 203c  t</scope>..    <\n-00000d40: 2f64 6570 656e 6465 6e63 793e 0d0a 2020  /dependency>..  \n-00000d50: 3c2f 6465 7065 6e64 656e 6369 6573 3e0d  </dependencies>.\n-00000d60: 0a20 203c 6275 696c 643e 0d0a 2020 2020  .  <build>..    \n-00000d70: 3c70 6c75 6769 6e73 3e0d 0a20 2020 2020  <plugins>..     \n-00000d80: 203c 706c 7567 696e 3e0d 0a20 2020 2020   <plugin>..     \n-00000d90: 2020 203c 6172 7469 6661 6374 4964 3e6d     <artifactId>m\n-00000da0: 6176 656e 2d73 7572 6566 6972 652d 706c  aven-surefire-pl\n-00000db0: 7567 696e 3c2f 6172 7469 6661 6374 4964  ugin</artifactId\n-00000dc0: 3e0d 0a20 2020 2020 2020 203c 636f 6e66  >..        <conf\n-00000dd0: 6967 7572 6174 696f 6e3e 0d0a 2020 2020  iguration>..    \n-00000de0: 2020 2020 2020 3c73 6b69 7054 6573 7473        <skipTests\n-00000df0: 3e24 7b73 6b69 7049 6e74 6567 7261 7469  >${skipIntegrati\n-00000e00: 6f6e 5465 7374 737d 3c2f 736b 6970 5465  onTests}</skipTe\n-00000e10: 7374 733e 0d0a 2020 2020 2020 2020 3c2f  sts>..        </\n-00000e20: 636f 6e66 6967 7572 6174 696f 6e3e 0d0a  configuration>..\n-00000e30: 2020 2020 2020 3c2f 706c 7567 696e 3e0d        </plugin>.\n-00000e40: 0a20 2020 203c 2f70 6c75 6769 6e73 3e0d  .    </plugins>.\n-00000e50: 0a20 203c 2f62 7569 6c64 3e0d 0a3c 2f70  .  </build>..</p\n-00000e60: 726f 6a65 6374 3e0d 0a                   roject>..\n+00000020: 462d 3822 3f3e 0a3c 212d 2d0a 2020 7e20  F-8\"?>.<!--.  ~ \n+00000030: 4c69 6365 6e73 6564 2074 6f20 7468 6520  Licensed to the \n+00000040: 4170 6163 6865 2053 6f66 7477 6172 6520  Apache Software \n+00000050: 466f 756e 6461 7469 6f6e 2028 4153 4629  Foundation (ASF)\n+00000060: 2075 6e64 6572 206f 6e65 206f 7220 6d6f   under one or mo\n+00000070: 7265 0a20 207e 2063 6f6e 7472 6962 7574  re.  ~ contribut\n+00000080: 6f72 206c 6963 656e 7365 2061 6772 6565  or license agree\n+00000090: 6d65 6e74 732e 2020 5365 6520 7468 6520  ments.  See the \n+000000a0: 4e4f 5449 4345 2066 696c 6520 6469 7374  NOTICE file dist\n+000000b0: 7269 6275 7465 6420 7769 7468 0a20 207e  ributed with.  ~\n+000000c0: 2074 6869 7320 776f 726b 2066 6f72 2061   this work for a\n+000000d0: 6464 6974 696f 6e61 6c20 696e 666f 726d  dditional inform\n+000000e0: 6174 696f 6e20 7265 6761 7264 696e 6720  ation regarding \n+000000f0: 636f 7079 7269 6768 7420 6f77 6e65 7273  copyright owners\n+00000100: 6869 702e 0a20 207e 2054 6865 2041 5346  hip..  ~ The ASF\n+00000110: 206c 6963 656e 7365 7320 7468 6973 2066   licenses this f\n+00000120: 696c 6520 746f 2059 6f75 2075 6e64 6572  ile to You under\n+00000130: 2074 6865 2041 7061 6368 6520 4c69 6365   the Apache Lice\n+00000140: 6e73 652c 2056 6572 7369 6f6e 2032 2e30  nse, Version 2.0\n+00000150: 0a20 207e 2028 7468 6520 224c 6963 656e  .  ~ (the \"Licen\n+00000160: 7365 2229 3b20 796f 7520 6d61 7920 6e6f  se\"); you may no\n+00000170: 7420 7573 6520 7468 6973 2066 696c 6520  t use this file \n+00000180: 6578 6365 7074 2069 6e20 636f 6d70 6c69  except in compli\n+00000190: 616e 6365 2077 6974 680a 2020 7e20 7468  ance with.  ~ th\n+000001a0: 6520 4c69 6365 6e73 652e 2020 596f 7520  e License.  You \n+000001b0: 6d61 7920 6f62 7461 696e 2061 2063 6f70  may obtain a cop\n+000001c0: 7920 6f66 2074 6865 204c 6963 656e 7365  y of the License\n+000001d0: 2061 740a 2020 7e0a 2020 7e20 2020 2020   at.  ~.  ~     \n+000001e0: 6874 7470 3a2f 2f77 7777 2e61 7061 6368  http://www.apach\n+000001f0: 652e 6f72 672f 6c69 6365 6e73 6573 2f4c  e.org/licenses/L\n+00000200: 4943 454e 5345 2d32 2e30 0a20 207e 0a20  ICENSE-2.0.  ~. \n+00000210: 207e 2055 6e6c 6573 7320 7265 7175 6972   ~ Unless requir\n+00000220: 6564 2062 7920 6170 706c 6963 6162 6c65  ed by applicable\n+00000230: 206c 6177 206f 7220 6167 7265 6564 2074   law or agreed t\n+00000240: 6f20 696e 2077 7269 7469 6e67 2c20 736f  o in writing, so\n+00000250: 6674 7761 7265 0a20 207e 2064 6973 7472  ftware.  ~ distr\n+00000260: 6962 7574 6564 2075 6e64 6572 2074 6865  ibuted under the\n+00000270: 204c 6963 656e 7365 2069 7320 6469 7374   License is dist\n+00000280: 7269 6275 7465 6420 6f6e 2061 6e20 2241  ributed on an \"A\n+00000290: 5320 4953 2220 4241 5349 532c 0a20 207e  S IS\" BASIS,.  ~\n+000002a0: 2057 4954 484f 5554 2057 4152 5241 4e54   WITHOUT WARRANT\n+000002b0: 4945 5320 4f52 2043 4f4e 4449 5449 4f4e  IES OR CONDITION\n+000002c0: 5320 4f46 2041 4e59 204b 494e 442c 2065  S OF ANY KIND, e\n+000002d0: 6974 6865 7220 6578 7072 6573 7320 6f72  ither express or\n+000002e0: 2069 6d70 6c69 6564 2e0a 2020 7e20 5365   implied..  ~ Se\n+000002f0: 6520 7468 6520 4c69 6365 6e73 6520 666f  e the License fo\n+00000300: 7220 7468 6520 7370 6563 6966 6963 206c  r the specific l\n+00000310: 616e 6775 6167 6520 676f 7665 726e 696e  anguage governin\n+00000320: 6720 7065 726d 6973 7369 6f6e 7320 616e  g permissions an\n+00000330: 640a 2020 7e20 6c69 6d69 7461 7469 6f6e  d.  ~ limitation\n+00000340: 7320 756e 6465 7220 7468 6520 4c69 6365  s under the Lice\n+00000350: 6e73 652e 0a20 202d 2d3e 0a3c 7072 6f6a  nse..  -->.<proj\n+00000360: 6563 7420 7873 693a 7363 6865 6d61 4c6f  ect xsi:schemaLo\n+00000370: 6361 7469 6f6e 3d22 6874 7470 3a2f 2f6d  cation=\"http://m\n+00000380: 6176 656e 2e61 7061 6368 652e 6f72 672f  aven.apache.org/\n+00000390: 504f 4d2f 342e 302e 3020 6874 7470 733a  POM/4.0.0 https:\n+000003a0: 2f2f 6d61 7665 6e2e 6170 6163 6865 2e6f  //maven.apache.o\n+000003b0: 7267 2f78 7364 2f6d 6176 656e 2d34 2e30  rg/xsd/maven-4.0\n+000003c0: 2e30 2e78 7364 2220 786d 6c6e 733d 2268  .0.xsd\" xmlns=\"h\n+000003d0: 7474 703a 2f2f 6d61 7665 6e2e 6170 6163  ttp://maven.apac\n+000003e0: 6865 2e6f 7267 2f50 4f4d 2f34 2e30 2e30  he.org/POM/4.0.0\n+000003f0: 220a 2020 2020 786d 6c6e 733a 7873 693d  \".    xmlns:xsi=\n+00000400: 2268 7474 703a 2f2f 7777 772e 7733 2e6f  \"http://www.w3.o\n+00000410: 7267 2f32 3030 312f 584d 4c53 6368 656d  rg/2001/XMLSchem\n+00000420: 612d 696e 7374 616e 6365 223e 0a20 203c  a-instance\">.  <\n+00000430: 6d6f 6465 6c56 6572 7369 6f6e 3e34 2e30  modelVersion>4.0\n+00000440: 2e30 3c2f 6d6f 6465 6c56 6572 7369 6f6e  .0</modelVersion\n+00000450: 3e0a 2020 3c70 6172 656e 743e 0a20 2020  >.  <parent>.   \n+00000460: 203c 6772 6f75 7049 643e 6f72 672e 6170   <groupId>org.ap\n+00000470: 6163 6865 2e64 7562 626f 3c2f 6772 6f75  ache.dubbo</grou\n+00000480: 7049 643e 0a20 2020 203c 6172 7469 6661  pId>.    <artifa\n+00000490: 6374 4964 3e64 7562 626f 2d72 656d 6f74  ctId>dubbo-remot\n+000004a0: 696e 673c 2f61 7274 6966 6163 7449 643e  ing</artifactId>\n+000004b0: 0a20 2020 203c 7665 7273 696f 6e3e 322e  .    <version>2.\n+000004c0: 372e 3130 3c2f 7665 7273 696f 6e3e 0a20  7.10</version>. \n+000004d0: 203c 2f70 6172 656e 743e 0a20 203c 6772   </parent>.  <gr\n+000004e0: 6f75 7049 643e 6f72 672e 6170 6163 6865  oupId>org.apache\n+000004f0: 2e64 7562 626f 3c2f 6772 6f75 7049 643e  .dubbo</groupId>\n+00000500: 0a20 203c 6172 7469 6661 6374 4964 3e64  .  <artifactId>d\n+00000510: 7562 626f 2d72 656d 6f74 696e 672d 6574  ubbo-remoting-et\n+00000520: 6364 333c 2f61 7274 6966 6163 7449 643e  cd3</artifactId>\n+00000530: 0a20 203c 7665 7273 696f 6e3e 322e 372e  .  <version>2.7.\n+00000540: 3130 3c2f 7665 7273 696f 6e3e 0a20 203c  10</version>.  <\n+00000550: 6e61 6d65 3e24 7b70 726f 6a65 6374 2e61  name>${project.a\n+00000560: 7274 6966 6163 7449 647d 3c2f 6e61 6d65  rtifactId}</name\n+00000570: 3e0a 2020 3c64 6573 6372 6970 7469 6f6e  >.  <description\n+00000580: 3e54 6865 2065 7463 6433 2072 656d 6f74  >The etcd3 remot\n+00000590: 696e 6720 6d6f 6475 6c65 206f 6620 4475  ing module of Du\n+000005a0: 6262 6f20 7072 6f6a 6563 743c 2f64 6573  bbo project</des\n+000005b0: 6372 6970 7469 6f6e 3e0a 2020 3c6c 6963  cription>.  <lic\n+000005c0: 656e 7365 733e 0a20 2020 203c 6c69 6365  enses>.    <lice\n+000005d0: 6e73 653e 0a20 2020 2020 203c 6e61 6d65  nse>.      <name\n+000005e0: 3e41 7061 6368 6520 4c69 6365 6e73 652c  >Apache License,\n+000005f0: 2056 6572 7369 6f6e 2032 2e30 3c2f 6e61   Version 2.0</na\n+00000600: 6d65 3e0a 2020 2020 2020 3c75 726c 3e68  me>.      <url>h\n+00000610: 7474 703a 2f2f 7777 772e 6170 6163 6865  ttp://www.apache\n+00000620: 2e6f 7267 2f6c 6963 656e 7365 732f 4c49  .org/licenses/LI\n+00000630: 4345 4e53 452d 322e 303c 2f75 726c 3e0a  CENSE-2.0</url>.\n+00000640: 2020 2020 2020 3c64 6973 7472 6962 7574        <distribut\n+00000650: 696f 6e3e 7265 706f 3c2f 6469 7374 7269  ion>repo</distri\n+00000660: 6275 7469 6f6e 3e0a 2020 2020 3c2f 6c69  bution>.    </li\n+00000670: 6365 6e73 653e 0a20 203c 2f6c 6963 656e  cense>.  </licen\n+00000680: 7365 733e 0a20 203c 7072 6f70 6572 7469  ses>.  <properti\n+00000690: 6573 3e0a 2020 2020 3c73 6b69 7049 6e74  es>.    <skipInt\n+000006a0: 6567 7261 7469 6f6e 5465 7374 733e 7472  egrationTests>tr\n+000006b0: 7565 3c2f 736b 6970 496e 7465 6772 6174  ue</skipIntegrat\n+000006c0: 696f 6e54 6573 7473 3e0a 2020 2020 3c73  ionTests>.    <s\n+000006d0: 6b69 705f 6d61 7665 6e5f 6465 706c 6f79  kip_maven_deploy\n+000006e0: 3e66 616c 7365 3c2f 736b 6970 5f6d 6176  >false</skip_mav\n+000006f0: 656e 5f64 6570 6c6f 793e 0a20 2020 203c  en_deploy>.    <\n+00000700: 6173 7365 7274 6a2e 7665 7273 696f 6e3e  assertj.version>\n+00000710: 332e 3133 2e32 3c2f 6173 7365 7274 6a2e  3.13.2</assertj.\n+00000720: 7665 7273 696f 6e3e 0a20 203c 2f70 726f  version>.  </pro\n+00000730: 7065 7274 6965 733e 0a20 203c 6465 7065  perties>.  <depe\n+00000740: 6e64 656e 6369 6573 3e0a 2020 2020 3c64  ndencies>.    <d\n+00000750: 6570 656e 6465 6e63 793e 0a20 2020 2020  ependency>.     \n+00000760: 203c 6772 6f75 7049 643e 6f72 672e 6170   <groupId>org.ap\n+00000770: 6163 6865 2e64 7562 626f 3c2f 6772 6f75  ache.dubbo</grou\n+00000780: 7049 643e 0a20 2020 2020 203c 6172 7469  pId>.      <arti\n+00000790: 6661 6374 4964 3e64 7562 626f 2d72 656d  factId>dubbo-rem\n+000007a0: 6f74 696e 672d 6170 693c 2f61 7274 6966  oting-api</artif\n+000007b0: 6163 7449 643e 0a20 2020 2020 203c 7665  actId>.      <ve\n+000007c0: 7273 696f 6e3e 247b 7072 6f6a 6563 742e  rsion>${project.\n+000007d0: 7061 7265 6e74 2e76 6572 7369 6f6e 7d3c  parent.version}<\n+000007e0: 2f76 6572 7369 6f6e 3e0a 2020 2020 3c2f  /version>.    </\n+000007f0: 6465 7065 6e64 656e 6379 3e0a 2020 2020  dependency>.    \n+00000800: 3c64 6570 656e 6465 6e63 793e 0a20 2020  <dependency>.   \n+00000810: 2020 203c 6772 6f75 7049 643e 6f72 672e     <groupId>org.\n+00000820: 6170 6163 6865 2e64 7562 626f 3c2f 6772  apache.dubbo</gr\n+00000830: 6f75 7049 643e 0a20 2020 2020 203c 6172  oupId>.      <ar\n+00000840: 7469 6661 6374 4964 3e64 7562 626f 2d63  tifactId>dubbo-c\n+00000850: 6f6d 6d6f 6e3c 2f61 7274 6966 6163 7449  ommon</artifactI\n+00000860: 643e 0a20 2020 2020 203c 7665 7273 696f  d>.      <versio\n+00000870: 6e3e 247b 7072 6f6a 6563 742e 7061 7265  n>${project.pare\n+00000880: 6e74 2e76 6572 7369 6f6e 7d3c 2f76 6572  nt.version}</ver\n+00000890: 7369 6f6e 3e0a 2020 2020 3c2f 6465 7065  sion>.    </depe\n+000008a0: 6e64 656e 6379 3e0a 2020 2020 3c64 6570  ndency>.    <dep\n+000008b0: 656e 6465 6e63 793e 0a20 2020 2020 203c  endency>.      <\n+000008c0: 6772 6f75 7049 643e 696f 2e65 7463 643c  groupId>io.etcd<\n+000008d0: 2f67 726f 7570 4964 3e0a 2020 2020 2020  /groupId>.      \n+000008e0: 3c61 7274 6966 6163 7449 643e 6a65 7463  <artifactId>jetc\n+000008f0: 642d 636f 7265 3c2f 6172 7469 6661 6374  d-core</artifact\n+00000900: 4964 3e0a 2020 2020 3c2f 6465 7065 6e64  Id>.    </depend\n+00000910: 656e 6379 3e0a 2020 2020 3c64 6570 656e  ency>.    <depen\n+00000920: 6465 6e63 793e 0a20 2020 2020 203c 6772  dency>.      <gr\n+00000930: 6f75 7049 643e 696f 2e67 7270 633c 2f67  oupId>io.grpc</g\n+00000940: 726f 7570 4964 3e0a 2020 2020 2020 3c61  roupId>.      <a\n+00000950: 7274 6966 6163 7449 643e 6772 7063 2d63  rtifactId>grpc-c\n+00000960: 6f72 653c 2f61 7274 6966 6163 7449 643e  ore</artifactId>\n+00000970: 0a20 2020 203c 2f64 6570 656e 6465 6e63  .    </dependenc\n+00000980: 793e 0a20 2020 203c 6465 7065 6e64 656e  y>.    <dependen\n+00000990: 6379 3e0a 2020 2020 2020 3c67 726f 7570  cy>.      <group\n+000009a0: 4964 3e69 6f2e 6772 7063 3c2f 6772 6f75  Id>io.grpc</grou\n+000009b0: 7049 643e 0a20 2020 2020 203c 6172 7469  pId>.      <arti\n+000009c0: 6661 6374 4964 3e67 7270 632d 6e65 7474  factId>grpc-nett\n+000009d0: 793c 2f61 7274 6966 6163 7449 643e 0a20  y</artifactId>. \n+000009e0: 2020 203c 2f64 6570 656e 6465 6e63 793e     </dependency>\n+000009f0: 0a20 2020 203c 6465 7065 6e64 656e 6379  .    <dependency\n+00000a00: 3e0a 2020 2020 2020 3c67 726f 7570 4964  >.      <groupId\n+00000a10: 3e69 6f2e 6772 7063 3c2f 6772 6f75 7049  >io.grpc</groupI\n+00000a20: 643e 0a20 2020 2020 203c 6172 7469 6661  d>.      <artifa\n+00000a30: 6374 4964 3e67 7270 632d 7072 6f74 6f62  ctId>grpc-protob\n+00000a40: 7566 3c2f 6172 7469 6661 6374 4964 3e0a  uf</artifactId>.\n+00000a50: 2020 2020 3c2f 6465 7065 6e64 656e 6379      </dependency\n+00000a60: 3e0a 2020 2020 3c64 6570 656e 6465 6e63  >.    <dependenc\n+00000a70: 793e 0a20 2020 2020 203c 6772 6f75 7049  y>.      <groupI\n+00000a80: 643e 696f 2e67 7270 633c 2f67 726f 7570  d>io.grpc</group\n+00000a90: 4964 3e0a 2020 2020 2020 3c61 7274 6966  Id>.      <artif\n+00000aa0: 6163 7449 643e 6772 7063 2d73 7475 623c  actId>grpc-stub<\n+00000ab0: 2f61 7274 6966 6163 7449 643e 0a20 2020  /artifactId>.   \n+00000ac0: 203c 2f64 6570 656e 6465 6e63 793e 0a20   </dependency>. \n+00000ad0: 2020 203c 6465 7065 6e64 656e 6379 3e0a     <dependency>.\n+00000ae0: 2020 2020 2020 3c67 726f 7570 4964 3e69        <groupId>i\n+00000af0: 6f2e 6772 7063 3c2f 6772 6f75 7049 643e  o.grpc</groupId>\n+00000b00: 0a20 2020 2020 203c 6172 7469 6661 6374  .      <artifact\n+00000b10: 4964 3e67 7270 632d 6772 7063 6c62 3c2f  Id>grpc-grpclb</\n+00000b20: 6172 7469 6661 6374 4964 3e0a 2020 2020  artifactId>.    \n+00000b30: 3c2f 6465 7065 6e64 656e 6379 3e0a 2020  </dependency>.  \n+00000b40: 2020 3c64 6570 656e 6465 6e63 793e 0a20    <dependency>. \n+00000b50: 2020 2020 203c 6772 6f75 7049 643e 696f       <groupId>io\n+00000b60: 2e65 7463 643c 2f67 726f 7570 4964 3e0a  .etcd</groupId>.\n+00000b70: 2020 2020 2020 3c61 7274 6966 6163 7449        <artifactI\n+00000b80: 643e 6a65 7463 642d 6c61 756e 6368 6572  d>jetcd-launcher\n+00000b90: 3c2f 6172 7469 6661 6374 4964 3e0a 2020  </artifactId>.  \n+00000ba0: 2020 2020 3c73 636f 7065 3e74 6573 743c      <scope>test<\n+00000bb0: 2f73 636f 7065 3e0a 2020 2020 3c2f 6465  /scope>.    </de\n+00000bc0: 7065 6e64 656e 6379 3e0a 2020 2020 3c64  pendency>.    <d\n+00000bd0: 6570 656e 6465 6e63 793e 0a20 2020 2020  ependency>.     \n+00000be0: 203c 6772 6f75 7049 643e 696f 2e6e 6574   <groupId>io.net\n+00000bf0: 7479 3c2f 6772 6f75 7049 643e 0a20 2020  ty</groupId>.   \n+00000c00: 2020 203c 6172 7469 6661 6374 4964 3e6e     <artifactId>n\n+00000c10: 6574 7479 2d61 6c6c 3c2f 6172 7469 6661  etty-all</artifa\n+00000c20: 6374 4964 3e0a 2020 2020 3c2f 6465 7065  ctId>.    </depe\n+00000c30: 6e64 656e 6379 3e0a 2020 2020 3c64 6570  ndency>.    <dep\n+00000c40: 656e 6465 6e63 793e 0a20 2020 2020 203c  endency>.      <\n+00000c50: 6772 6f75 7049 643e 6f72 672e 6173 7365  groupId>org.asse\n+00000c60: 7274 6a3c 2f67 726f 7570 4964 3e0a 2020  rtj</groupId>.  \n+00000c70: 2020 2020 3c61 7274 6966 6163 7449 643e      <artifactId>\n+00000c80: 6173 7365 7274 6a2d 636f 7265 3c2f 6172  assertj-core</ar\n+00000c90: 7469 6661 6374 4964 3e0a 2020 2020 2020  tifactId>.      \n+00000ca0: 3c76 6572 7369 6f6e 3e24 7b61 7373 6572  <version>${asser\n+00000cb0: 746a 2e76 6572 7369 6f6e 7d3c 2f76 6572  tj.version}</ver\n+00000cc0: 7369 6f6e 3e0a 2020 2020 2020 3c73 636f  sion>.      <sco\n+00000cd0: 7065 3e74 6573 743c 2f73 636f 7065 3e0a  pe>test</scope>.\n+00000ce0: 2020 2020 3c2f 6465 7065 6e64 656e 6379      </dependency\n+00000cf0: 3e0a 2020 3c2f 6465 7065 6e64 656e 6369  >.  </dependenci\n+00000d00: 6573 3e0a 2020 3c62 7569 6c64 3e0a 2020  es>.  <build>.  \n+00000d10: 2020 3c70 6c75 6769 6e73 3e0a 2020 2020    <plugins>.    \n+00000d20: 2020 3c70 6c75 6769 6e3e 0a20 2020 2020    <plugin>.     \n+00000d30: 2020 203c 6172 7469 6661 6374 4964 3e6d     <artifactId>m\n+00000d40: 6176 656e 2d73 7572 6566 6972 652d 706c  aven-surefire-pl\n+00000d50: 7567 696e 3c2f 6172 7469 6661 6374 4964  ugin</artifactId\n+00000d60: 3e0a 2020 2020 2020 2020 3c63 6f6e 6669  >.        <confi\n+00000d70: 6775 7261 7469 6f6e 3e0a 2020 2020 2020  guration>.      \n+00000d80: 2020 2020 3c73 6b69 7054 6573 7473 3e24      <skipTests>$\n+00000d90: 7b73 6b69 7049 6e74 6567 7261 7469 6f6e  {skipIntegration\n+00000da0: 5465 7374 737d 3c2f 736b 6970 5465 7374  Tests}</skipTest\n+00000db0: 733e 0a20 2020 2020 2020 203c 2f63 6f6e  s>.        </con\n+00000dc0: 6669 6775 7261 7469 6f6e 3e0a 2020 2020  figuration>.    \n+00000dd0: 2020 3c2f 706c 7567 696e 3e0a 2020 2020    </plugin>.    \n+00000de0: 3c2f 706c 7567 696e 733e 0a20 203c 2f62  </plugins>.  </b\n+00000df0: 7569 6c64 3e0a 3c2f 7072 6f6a 6563 743e  uild>.</project>\n+00000e00: 0a                                       .\n"}, {"source1": "org/apache/dubbo/remoting/etcd/AbstractRetryPolicy.java", "source2": "org/apache/dubbo/remoting/etcd/AbstractRetryPolicy.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,45 +1,45 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\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-package org.apache.dubbo.remoting.etcd;\n-\n-public abstract class AbstractRetryPolicy implements RetryPolicy {\n-\n-    private final int maxRetried;\n-\n-    protected AbstractRetryPolicy(int maxRetried) {\n-        this.maxRetried = maxRetried;\n-    }\n-\n-    @Override\n-    public boolean shouldRetry(int retried, long elapsed, boolean sleep) {\n-        if (retried < maxRetried) {\n-            try {\n-                if (sleep) {\n-                    Thread.sleep(getSleepTime(retried, elapsed));\n-                }\n-            } catch (InterruptedException e) {\n-                Thread.currentThread().interrupt();\n-                return false;\n-            }\n-            return true;\n-        }\n-        return false;\n-    }\n-\n-    protected abstract long getSleepTime(int retried, long elapsed);\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.remoting.etcd;\r\n+\r\n+public abstract class AbstractRetryPolicy implements RetryPolicy {\r\n+\r\n+    private final int maxRetried;\r\n+\r\n+    protected AbstractRetryPolicy(int maxRetried) {\r\n+        this.maxRetried = maxRetried;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean shouldRetry(int retried, long elapsed, boolean sleep) {\r\n+        if (retried < maxRetried) {\r\n+            try {\r\n+                if (sleep) {\r\n+                    Thread.sleep(getSleepTime(retried, elapsed));\r\n+                }\r\n+            } catch (InterruptedException e) {\r\n+                Thread.currentThread().interrupt();\r\n+                return false;\r\n+            }\r\n+            return true;\r\n+        }\r\n+        return false;\r\n+    }\r\n+\r\n+    protected abstract long getSleepTime(int retried, long elapsed);\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/remoting/etcd/Constants.java", "source2": "org/apache/dubbo/remoting/etcd/Constants.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,55 +1,55 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\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-\n-package org.apache.dubbo.remoting.etcd;\n-\n-import static org.apache.dubbo.remoting.Constants.DEFAULT_IO_THREADS;\n-\n-public interface Constants {\n-    String ETCD3_NOTIFY_MAXTHREADS_KEYS = \"etcd3.notify.maxthreads\";\n-\n-    int DEFAULT_ETCD3_NOTIFY_THREADS = DEFAULT_IO_THREADS;\n-\n-    String DEFAULT_ETCD3_NOTIFY_QUEUES_KEY = \"etcd3.notify.queues\";\n-\n-    int DEFAULT_GRPC_QUEUES = 300_0000;\n-\n-    String RETRY_PERIOD_KEY = \"retry.period\";\n-\n-    int DEFAULT_RETRY_PERIOD = 5 * 1000;\n-\n-    int DEFAULT_SESSION_TIMEOUT = 60 * 1000;\n-\n-    String HTTP_SUBFIX_KEY = \"://\";\n-\n-    String HTTP_KEY = \"http://\";\n-\n-    int DEFAULT_KEEPALIVE_TIMEOUT = DEFAULT_SESSION_TIMEOUT / 2;\n-\n-    String SESSION_TIMEOUT_KEY = \"session\";\n-\n-    int DEFAULT_RECONNECT_PERIOD = 3 * 1000;\n-\n-    String ROUTERS_CATEGORY = \"routers\";\n-\n-    String PROVIDERS_CATEGORY = \"providers\";\n-\n-    String CONSUMERS_CATEGORY = \"consumers\";\n-\n-    String CONFIGURATORS_CATEGORY = \"configurators\";\n-}\n-\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.remoting.etcd;\r\n+\r\n+import static org.apache.dubbo.remoting.Constants.DEFAULT_IO_THREADS;\r\n+\r\n+public interface Constants {\r\n+    String ETCD3_NOTIFY_MAXTHREADS_KEYS = \"etcd3.notify.maxthreads\";\r\n+\r\n+    int DEFAULT_ETCD3_NOTIFY_THREADS = DEFAULT_IO_THREADS;\r\n+\r\n+    String DEFAULT_ETCD3_NOTIFY_QUEUES_KEY = \"etcd3.notify.queues\";\r\n+\r\n+    int DEFAULT_GRPC_QUEUES = 300_0000;\r\n+\r\n+    String RETRY_PERIOD_KEY = \"retry.period\";\r\n+\r\n+    int DEFAULT_RETRY_PERIOD = 5 * 1000;\r\n+\r\n+    int DEFAULT_SESSION_TIMEOUT = 60 * 1000;\r\n+\r\n+    String HTTP_SUBFIX_KEY = \"://\";\r\n+\r\n+    String HTTP_KEY = \"http://\";\r\n+\r\n+    int DEFAULT_KEEPALIVE_TIMEOUT = DEFAULT_SESSION_TIMEOUT / 2;\r\n+\r\n+    String SESSION_TIMEOUT_KEY = \"session\";\r\n+\r\n+    int DEFAULT_RECONNECT_PERIOD = 3 * 1000;\r\n+\r\n+    String ROUTERS_CATEGORY = \"routers\";\r\n+\r\n+    String PROVIDERS_CATEGORY = \"providers\";\r\n+\r\n+    String CONSUMERS_CATEGORY = \"consumers\";\r\n+\r\n+    String CONFIGURATORS_CATEGORY = \"configurators\";\r\n+}\r\n+\r\n"}, {"source1": "org/apache/dubbo/remoting/etcd/EtcdClient.java", "source2": "org/apache/dubbo/remoting/etcd/EtcdClient.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,191 +1,191 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\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-\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\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-package org.apache.dubbo.remoting.etcd;\n-\n-import org.apache.dubbo.common.URL;\n-\n-import java.util.List;\n-import java.util.concurrent.CancellationException;\n-import java.util.concurrent.ExecutionException;\n-import java.util.concurrent.TimeUnit;\n-import java.util.concurrent.TimeoutException;\n-\n-public interface EtcdClient {\n-\n-    /**\n-     * save the specified path to the etcd registry.\n-     *\n-     * @param path the path to be saved\n-     */\n-    void create(String path);\n-\n-    /**\n-     * save the specified path to the etcd registry.\n-     * if node disconnect from etcd, it will be deleted\n-     * automatically by etcd when session timeout.\n-     *\n-     * @param path the path to be saved\n-     * @return the lease of current path.\n-     */\n-    long createEphemeral(String path);\n-\n-    /**\n-     * remove the specified  from etcd registry.\n-     *\n-     * @param path the path to be removed\n-     */\n-    void delete(String path);\n-\n-    /**\n-     * find direct children directory, excluding path self,\n-     * Never return null.\n-     *\n-     * @param path the path to be found direct children.\n-     * @return direct children directory, contains zero element\n-     * list if children directory not exists.\n-     */\n-    List<String> getChildren(String path);\n-\n-    /**\n-     * register children listener for specified path.\n-     *\n-     * @param path     the path to be watched when children is added, delete or update.\n-     * @param listener when children is changed , listener will be triggered.\n-     * @return direct children directory, contains zero element\n-     * list if children directory not exists.\n-     */\n-    List<String> addChildListener(String path, ChildListener listener);\n-\n-    /**\n-     * find watcher of the children listener for specified path.\n-     *\n-     * @param path     the path to be watched when children is added, delete or update.\n-     * @param listener when children is changed , listener will be triggered.\n-     * @return watcher if find else null\n-     */\n-    <T> T getChildListener(String path, ChildListener listener);\n-\n-    /**\n-     * unregister children lister for specified path.\n-     *\n-     * @param path     the path to be unwatched .\n-     * @param listener when children is changed , lister will be triggered.\n-     */\n-    void removeChildListener(String path, ChildListener listener);\n-\n-    /**\n-     * support connection notify if connection state was changed.\n-     *\n-     * @param listener if state changed, listener will be triggered.\n-     */\n-    void addStateListener(StateListener listener);\n-\n-    /**\n-     * remove connection notify if connection state was changed.\n-     *\n-     * @param listener remove already registered listener, if listener\n-     *                 not exists nothing happened.\n-     */\n-    void removeStateListener(StateListener listener);\n-\n-    /**\n-     * test if current client is active.\n-     *\n-     * @return true if connection is active else false.\n-     */\n-    boolean isConnected();\n-\n-    /**\n-     * close current client and release all resourses.\n-     */\n-    void close();\n-\n-    URL getUrl();\n-\n-    /***\n-     * create new lease from specified second ,it should be waiting if failed.<p>\n-     *\n-     * @param second lease time (support second only).\n-     * @return lease id from etcd\n-     */\n-    long createLease(long second);\n-\n-    /***\n-     * create new lease from specified ttl second before waiting specified timeout.<p>\n-     *\n-     * @param ttl lease time (support second only).\n-     * @param timeout the maximum time to wait\n-     * @param unit the time unit of the timeout argument\n-     * @throws CancellationException if this future was cancelled\n-     * @throws ExecutionException if this future completed exceptionally\n-     * @throws InterruptedException if the current thread was interrupted\n-     * while waiting\n-     * @throws TimeoutException if the wait timed out\n-     * @return lease id from etcd\n-     */\n-    long createLease(long ttl, long timeout, TimeUnit unit)\n-            throws InterruptedException, ExecutionException, TimeoutException;\n-\n-    /**\n-     * revoke specified lease, any associated path will removed automatically.\n-     *\n-     * @param lease to be removed lease\n-     */\n-    void revokeLease(long lease);\n-\n-\n-    /**\n-     * Get the value of the specified key.\n-     * @param key the specified key\n-     * @return null if the value is not found\n-     */\n-    String getKVValue(String key);\n-\n-    /**\n-     * Put the key value pair to etcd\n-     * @param key the specified key\n-     * @param value the paired value\n-     * @return true if put success\n-     */\n-    boolean put(String key, String value);\n-\n-    /**\n-     * Put the key value pair to etcd (Ephemeral)\n-     * @param key the specified key\n-     * @param value the paired value\n-     * @return true if put success\n-     */\n-    boolean putEphemeral(String key, String value);\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.remoting.etcd;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+\r\n+import java.util.List;\r\n+import java.util.concurrent.CancellationException;\r\n+import java.util.concurrent.ExecutionException;\r\n+import java.util.concurrent.TimeUnit;\r\n+import java.util.concurrent.TimeoutException;\r\n+\r\n+public interface EtcdClient {\r\n+\r\n+    /**\r\n+     * save the specified path to the etcd registry.\r\n+     *\r\n+     * @param path the path to be saved\r\n+     */\r\n+    void create(String path);\r\n+\r\n+    /**\r\n+     * save the specified path to the etcd registry.\r\n+     * if node disconnect from etcd, it will be deleted\r\n+     * automatically by etcd when session timeout.\r\n+     *\r\n+     * @param path the path to be saved\r\n+     * @return the lease of current path.\r\n+     */\r\n+    long createEphemeral(String path);\r\n+\r\n+    /**\r\n+     * remove the specified  from etcd registry.\r\n+     *\r\n+     * @param path the path to be removed\r\n+     */\r\n+    void delete(String path);\r\n+\r\n+    /**\r\n+     * find direct children directory, excluding path self,\r\n+     * Never return null.\r\n+     *\r\n+     * @param path the path to be found direct children.\r\n+     * @return direct children directory, contains zero element\r\n+     * list if children directory not exists.\r\n+     */\r\n+    List<String> getChildren(String path);\r\n+\r\n+    /**\r\n+     * register children listener for specified path.\r\n+     *\r\n+     * @param path     the path to be watched when children is added, delete or update.\r\n+     * @param listener when children is changed , listener will be triggered.\r\n+     * @return direct children directory, contains zero element\r\n+     * list if children directory not exists.\r\n+     */\r\n+    List<String> addChildListener(String path, ChildListener listener);\r\n+\r\n+    /**\r\n+     * find watcher of the children listener for specified path.\r\n+     *\r\n+     * @param path     the path to be watched when children is added, delete or update.\r\n+     * @param listener when children is changed , listener will be triggered.\r\n+     * @return watcher if find else null\r\n+     */\r\n+    <T> T getChildListener(String path, ChildListener listener);\r\n+\r\n+    /**\r\n+     * unregister children lister for specified path.\r\n+     *\r\n+     * @param path     the path to be unwatched .\r\n+     * @param listener when children is changed , lister will be triggered.\r\n+     */\r\n+    void removeChildListener(String path, ChildListener listener);\r\n+\r\n+    /**\r\n+     * support connection notify if connection state was changed.\r\n+     *\r\n+     * @param listener if state changed, listener will be triggered.\r\n+     */\r\n+    void addStateListener(StateListener listener);\r\n+\r\n+    /**\r\n+     * remove connection notify if connection state was changed.\r\n+     *\r\n+     * @param listener remove already registered listener, if listener\r\n+     *                 not exists nothing happened.\r\n+     */\r\n+    void removeStateListener(StateListener listener);\r\n+\r\n+    /**\r\n+     * test if current client is active.\r\n+     *\r\n+     * @return true if connection is active else false.\r\n+     */\r\n+    boolean isConnected();\r\n+\r\n+    /**\r\n+     * close current client and release all resourses.\r\n+     */\r\n+    void close();\r\n+\r\n+    URL getUrl();\r\n+\r\n+    /***\r\n+     * create new lease from specified second ,it should be waiting if failed.<p>\r\n+     *\r\n+     * @param second lease time (support second only).\r\n+     * @return lease id from etcd\r\n+     */\r\n+    long createLease(long second);\r\n+\r\n+    /***\r\n+     * create new lease from specified ttl second before waiting specified timeout.<p>\r\n+     *\r\n+     * @param ttl lease time (support second only).\r\n+     * @param timeout the maximum time to wait\r\n+     * @param unit the time unit of the timeout argument\r\n+     * @throws CancellationException if this future was cancelled\r\n+     * @throws ExecutionException if this future completed exceptionally\r\n+     * @throws InterruptedException if the current thread was interrupted\r\n+     * while waiting\r\n+     * @throws TimeoutException if the wait timed out\r\n+     * @return lease id from etcd\r\n+     */\r\n+    long createLease(long ttl, long timeout, TimeUnit unit)\r\n+            throws InterruptedException, ExecutionException, TimeoutException;\r\n+\r\n+    /**\r\n+     * revoke specified lease, any associated path will removed automatically.\r\n+     *\r\n+     * @param lease to be removed lease\r\n+     */\r\n+    void revokeLease(long lease);\r\n+\r\n+\r\n+    /**\r\n+     * Get the value of the specified key.\r\n+     * @param key the specified key\r\n+     * @return null if the value is not found\r\n+     */\r\n+    String getKVValue(String key);\r\n+\r\n+    /**\r\n+     * Put the key value pair to etcd\r\n+     * @param key the specified key\r\n+     * @param value the paired value\r\n+     * @return true if put success\r\n+     */\r\n+    boolean put(String key, String value);\r\n+\r\n+    /**\r\n+     * Put the key value pair to etcd (Ephemeral)\r\n+     * @param key the specified key\r\n+     * @param value the paired value\r\n+     * @return true if put success\r\n+     */\r\n+    boolean putEphemeral(String key, String value);\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/remoting/etcd/EtcdTransporter.java", "source2": "org/apache/dubbo/remoting/etcd/EtcdTransporter.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,47 +1,47 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\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-\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\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-package org.apache.dubbo.remoting.etcd;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.Adaptive;\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.remoting.Constants;\n-\n-@SPI(\"jetcd\")\n-public interface EtcdTransporter {\n-\n-    @Adaptive({Constants.CLIENT_KEY, Constants.TRANSPORTER_KEY})\n-    EtcdClient connect(URL url);\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.remoting.etcd;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.Adaptive;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.remoting.Constants;\r\n+\r\n+@SPI(\"jetcd\")\r\n+public interface EtcdTransporter {\r\n+\r\n+    @Adaptive({Constants.CLIENT_KEY, Constants.TRANSPORTER_KEY})\r\n+    EtcdClient connect(URL url);\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/remoting/etcd/RetryPolicy.java", "source2": "org/apache/dubbo/remoting/etcd/RetryPolicy.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,31 +1,31 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\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-package org.apache.dubbo.remoting.etcd;\n-\n-public interface RetryPolicy {\n-\n-    /**\n-     * Whether retry is supported when operation fails.\n-     *\n-     * @param retried the number of times retried so far\n-     * @param elapsed the elapsed time in millisecond since the operation was attempted\n-     * @param sleep   should be sleep\n-     * @return true should be retry\n-     */\n-    boolean shouldRetry(int retried, long elapsed, boolean sleep);\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.remoting.etcd;\r\n+\r\n+public interface RetryPolicy {\r\n+\r\n+    /**\r\n+     * Whether retry is supported when operation fails.\r\n+     *\r\n+     * @param retried the number of times retried so far\r\n+     * @param elapsed the elapsed time in millisecond since the operation was attempted\r\n+     * @param sleep   should be sleep\r\n+     * @return true should be retry\r\n+     */\r\n+    boolean shouldRetry(int retried, long elapsed, boolean sleep);\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/remoting/etcd/jetcd/ConnectionStateListener.java", "source2": "org/apache/dubbo/remoting/etcd/jetcd/ConnectionStateListener.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,31 +1,31 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\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-\n-package org.apache.dubbo.remoting.etcd.jetcd;\n-\n-import io.etcd.jetcd.Client;\n-\n-public interface ConnectionStateListener {\n-\n-    /**\n-     * Called when there is a state change in the connection\n-     *\n-     * @param client   the client\n-     * @param newState the new state\n-     */\n-    void stateChanged(Client client, int newState);\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.remoting.etcd.jetcd;\r\n+\r\n+import io.etcd.jetcd.Client;\r\n+\r\n+public interface ConnectionStateListener {\r\n+\r\n+    /**\r\n+     * Called when there is a state change in the connection\r\n+     *\r\n+     * @param client   the client\r\n+     * @param newState the new state\r\n+     */\r\n+    void stateChanged(Client client, int newState);\r\n }\n"}, {"source1": "org/apache/dubbo/remoting/etcd/jetcd/JEtcdClient.java", "source2": "org/apache/dubbo/remoting/etcd/jetcd/JEtcdClient.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,473 +1,473 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\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-\n-package org.apache.dubbo.remoting.etcd.jetcd;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.ExecutorUtil;\n-import org.apache.dubbo.common.utils.NamedThreadFactory;\n-import org.apache.dubbo.remoting.etcd.ChildListener;\n-import org.apache.dubbo.remoting.etcd.StateListener;\n-import org.apache.dubbo.remoting.etcd.option.OptionUtil;\n-import org.apache.dubbo.remoting.etcd.support.AbstractEtcdClient;\n-\n-import com.google.protobuf.ByteString;\n-import io.etcd.jetcd.ByteSequence;\n-import io.etcd.jetcd.api.Event;\n-import io.etcd.jetcd.api.KeyValue;\n-import io.etcd.jetcd.api.WatchCancelRequest;\n-import io.etcd.jetcd.api.WatchCreateRequest;\n-import io.etcd.jetcd.api.WatchGrpc;\n-import io.etcd.jetcd.api.WatchRequest;\n-import io.etcd.jetcd.api.WatchResponse;\n-import io.etcd.jetcd.common.exception.ClosedClientException;\n-import io.grpc.ManagedChannel;\n-import io.grpc.Status;\n-import io.grpc.stub.StreamObserver;\n-import io.netty.util.internal.ConcurrentSet;\n-\n-import java.util.ArrayList;\n-import java.util.Collections;\n-import java.util.Iterator;\n-import java.util.List;\n-import java.util.Random;\n-import java.util.Set;\n-import java.util.concurrent.ExecutionException;\n-import java.util.concurrent.ExecutorService;\n-import java.util.concurrent.Executors;\n-import java.util.concurrent.LinkedBlockingQueue;\n-import java.util.concurrent.ScheduledExecutorService;\n-import java.util.concurrent.ThreadPoolExecutor;\n-import java.util.concurrent.TimeUnit;\n-import java.util.concurrent.TimeoutException;\n-import java.util.concurrent.locks.ReentrantLock;\n-\n-import static java.util.stream.Collectors.toList;\n-import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;\n-import static org.apache.dubbo.remoting.etcd.Constants.DEFAULT_ETCD3_NOTIFY_QUEUES_KEY;\n-import static org.apache.dubbo.remoting.etcd.Constants.DEFAULT_ETCD3_NOTIFY_THREADS;\n-import static org.apache.dubbo.remoting.etcd.Constants.DEFAULT_GRPC_QUEUES;\n-import static org.apache.dubbo.remoting.etcd.Constants.DEFAULT_RETRY_PERIOD;\n-import static org.apache.dubbo.remoting.etcd.Constants.DEFAULT_SESSION_TIMEOUT;\n-import static org.apache.dubbo.remoting.etcd.Constants.ETCD3_NOTIFY_MAXTHREADS_KEYS;\n-import static org.apache.dubbo.remoting.etcd.Constants.RETRY_PERIOD_KEY;\n-import static org.apache.dubbo.remoting.etcd.jetcd.JEtcdClientWrapper.UTF_8;\n-\n-/**\n- * etcd3 client.\n- */\n-public class JEtcdClient extends AbstractEtcdClient<JEtcdClient.EtcdWatcher> {\n-\n-    private JEtcdClientWrapper clientWrapper;\n-    private ScheduledExecutorService reconnectSchedule;\n-\n-    private ExecutorService notifyExecutor;\n-\n-    private int delayPeriod;\n-    private Logger logger = LoggerFactory.getLogger(JEtcdClient.class);\n-\n-    public JEtcdClient(URL url) {\n-        super(url);\n-        try {\n-            clientWrapper = new JEtcdClientWrapper(url);\n-            clientWrapper.setConnectionStateListener((client, state) -> {\n-                if (state == StateListener.CONNECTED) {\n-                    JEtcdClient.this.stateChanged(StateListener.CONNECTED);\n-                } else if (state == StateListener.DISCONNECTED) {\n-                    JEtcdClient.this.stateChanged(StateListener.DISCONNECTED);\n-                }\n-            });\n-            delayPeriod = getUrl().getParameter(RETRY_PERIOD_KEY, DEFAULT_RETRY_PERIOD);\n-            reconnectSchedule = Executors.newScheduledThreadPool(1,\n-                    new NamedThreadFactory(\"etcd3-watch-auto-reconnect\"));\n-\n-            notifyExecutor = new ThreadPoolExecutor(\n-                    1\n-                    , url.getParameter(ETCD3_NOTIFY_MAXTHREADS_KEYS, DEFAULT_ETCD3_NOTIFY_THREADS)\n-                    , DEFAULT_SESSION_TIMEOUT\n-                    , TimeUnit.MILLISECONDS\n-                    , new LinkedBlockingQueue<Runnable>(url.getParameter(DEFAULT_ETCD3_NOTIFY_QUEUES_KEY, DEFAULT_GRPC_QUEUES * 3))\n-                    , new NamedThreadFactory(\"etcd3-notify\", true));\n-\n-            clientWrapper.start();\n-        } catch (Exception e) {\n-            throw new IllegalStateException(e.getMessage(), e);\n-        }\n-    }\n-\n-    @Override\n-    public void doCreatePersistent(String path) {\n-        clientWrapper.createPersistent(path);\n-    }\n-\n-    @Override\n-    public long doCreateEphemeral(String path) {\n-        return clientWrapper.createEphemeral(path);\n-    }\n-\n-    @Override\n-    public boolean checkExists(String path) {\n-        return clientWrapper.checkExists(path);\n-    }\n-\n-    @Override\n-    public EtcdWatcher createChildWatcherListener(String path, ChildListener listener) {\n-        return new EtcdWatcher(listener);\n-    }\n-\n-    @Override\n-    public List<String> addChildWatcherListener(String path, EtcdWatcher etcdWatcher) {\n-        return etcdWatcher.forPath(path);\n-    }\n-\n-    @Override\n-    public void removeChildWatcherListener(String path, EtcdWatcher etcdWatcher) {\n-        etcdWatcher.unwatch();\n-    }\n-\n-    @Override\n-    public List<String> getChildren(String path) {\n-        return clientWrapper.getChildren(path);\n-    }\n-\n-    @Override\n-    public boolean isConnected() {\n-        return clientWrapper.isConnected();\n-    }\n-\n-    @Override\n-    public long createLease(long second) {\n-        return clientWrapper.createLease(second);\n-    }\n-\n-    @Override\n-    public long createLease(long ttl, long timeout, TimeUnit unit)\n-            throws InterruptedException, ExecutionException, TimeoutException {\n-        return clientWrapper.createLease(ttl, timeout, unit);\n-    }\n-\n-    @Override\n-    public void delete(String path) {\n-        clientWrapper.delete(path);\n-    }\n-\n-    @Override\n-    public void revokeLease(long lease) {\n-        clientWrapper.revokeLease(lease);\n-    }\n-\n-    @Override\n-    public void doClose() {\n-        try {\n-            if (notifyExecutor != null) {\n-                ExecutorUtil.shutdownNow(notifyExecutor, 100);\n-            }\n-        } catch (Exception e) {\n-            logger.warn(e.getMessage(), e);\n-        }\n-\n-        try {\n-            if (reconnectSchedule != null) {\n-                ExecutorUtil.shutdownNow(reconnectSchedule, 100);\n-            }\n-        } catch (Exception e) {\n-            logger.warn(e.getMessage(), e);\n-        } finally {\n-            clientWrapper.doClose();\n-        }\n-    }\n-\n-    @Override\n-    public String getKVValue(String key) {\n-        return clientWrapper.getKVValue(key);\n-    }\n-\n-    @Override\n-    public boolean put(String key, String value) {\n-        return clientWrapper.put(key, value);\n-    }\n-\n-    @Override\n-    public boolean putEphemeral(String key, String value) {\n-        return clientWrapper.putEphemeral(key, value);\n-    }\n-\n-    public ManagedChannel getChannel() {\n-        return clientWrapper.getChannel();\n-    }\n-\n-    public class EtcdWatcher implements StreamObserver<WatchResponse> {\n-\n-        protected WatchGrpc.WatchStub watchStub;\n-        protected StreamObserver<WatchRequest> watchRequest;\n-        protected long watchId;\n-        protected String path;\n-        protected Throwable throwable;\n-        protected volatile Set<String> urls = new ConcurrentSet<>();\n-        private ChildListener listener;\n-\n-        protected ReentrantLock lock = new ReentrantLock(true);\n-\n-        public EtcdWatcher(ChildListener listener) {\n-            this.listener = listener;\n-        }\n-\n-        @Override\n-        public void onNext(WatchResponse response) {\n-\n-            // prevents grpc on sending watchResponse to a closed watch client.\n-            if (!isConnected()) {\n-                return;\n-            }\n-\n-            watchId = response.getWatchId();\n-\n-            if (listener != null) {\n-                int modified = 0;\n-                String service = null;\n-                Iterator<Event> iterator = response.getEventsList().iterator();\n-                while (iterator.hasNext()) {\n-                    Event event = iterator.next();\n-                    switch (event.getType()) {\n-                        case PUT: {\n-                            if (((service = find(event)) != null)\n-                                    && safeUpdate(service, true)) {\n-                                modified++;\n-                            }\n-                            break;\n-                        }\n-                        case DELETE: {\n-                            if (((service = find(event)) != null)\n-                                    && safeUpdate(service, false)) {\n-                                modified++;\n-                            }\n-                            break;\n-                        }\n-                        default:\n-                            break;\n-                    }\n-                }\n-                if (modified > 0) {\n-                    notifyExecutor.execute(() -> listener.childChanged(path, new ArrayList<>(urls)));\n-                }\n-\n-            }\n-        }\n-\n-        @Override\n-        public void onError(Throwable e) {\n-            tryReconnect(e);\n-        }\n-\n-        public void unwatch() {\n-\n-            // prevents grpc on sending watchResponse to a closed watch client.\n-            if (!isConnected()) {\n-                return;\n-            }\n-\n-            try {\n-                /**\n-                 * issue : https://github.com/apache/dubbo/issues/4115\n-                 *\n-                 * When the network is reconnected, the listener is empty\n-                 * and the data cannot be received.\n-                 */\n-                // this.listener = null;\n-\n-                if (watchRequest != null) {\n-                    WatchCancelRequest watchCancelRequest =\n-                            WatchCancelRequest.newBuilder().setWatchId(watchId).build();\n-                    WatchRequest cancelRequest = WatchRequest.newBuilder()\n-                            .setCancelRequest(watchCancelRequest).build();\n-                    this.watchRequest.onNext(cancelRequest);\n-                }\n-            } catch (Exception ignored) {\n-                logger.warn(\"Failed to cancel watch for path '\" + path + \"'\", ignored);\n-            }\n-        }\n-\n-        public List<String> forPath(String path) {\n-\n-            if (!isConnected()) {\n-                throw new ClosedClientException(\"watch client has been closed, path '\" + path + \"'\");\n-            }\n-            if (this.path != null) {\n-                unwatch();\n-            }\n-\n-            this.path = path;\n-\n-            lock.lock();\n-            try {\n-\n-                this.watchStub = WatchGrpc.newStub(clientWrapper.getChannel());\n-                this.watchRequest = watchStub.watch(this);\n-                this.watchRequest.onNext(nextRequest());\n-\n-                List<String> children = clientWrapper.getChildren(path);\n-                /**\n-                 * caching the current service\n-                 */\n-                if (!children.isEmpty()) {\n-                    this.urls.addAll(filterChildren(children));\n-                }\n-\n-                return new ArrayList<>(urls);\n-            } finally {\n-                lock.unlock();\n-            }\n-        }\n-\n-        private boolean safeUpdate(String service, boolean add) {\n-            lock.lock();\n-            try {\n-                /**\n-                 * If the collection already contains the specified service, do nothing\n-                 */\n-                return add ? this.urls.add(service) : this.urls.remove(service);\n-            } finally {\n-                lock.unlock();\n-            }\n-        }\n-\n-        private String find(Event event) {\n-            KeyValue keyValue = event.getKv();\n-            String key = keyValue.getKey().toStringUtf8();\n-\n-            int len = path.length(), index = len, count = 0;\n-            if (key.length() >= index) {\n-                for (; (index = key.indexOf(PATH_SEPARATOR, index)) != -1; ++index) {\n-                    if (count++ > 1) {\n-                        break;\n-                    }\n-                }\n-            }\n-\n-            /**\n-             * if children changed , we should refresh invokers\n-             */\n-            if (count == 1) {\n-                /**\n-                 * remove prefix\n-                 */\n-                return key.substring(len + 1);\n-            }\n-\n-            return null;\n-        }\n-\n-        private List<String> filterChildren(List<String> children) {\n-            if (children == null) {\n-                return Collections.emptyList();\n-            }\n-            if (children.size() <= 0) {\n-                return children;\n-            }\n-            final int len = path.length();\n-            return children.stream().parallel()\n-                    .filter(child -> {\n-                        int index = len, count = 0;\n-                        if (child.length() > len) {\n-                            for (; (index = child.indexOf(PATH_SEPARATOR, index)) != -1; ++index) {\n-                                if (count++ > 1) {\n-                                    break;\n-                                }\n-                            }\n-                        }\n-                        return count == 1;\n-                    })\n-                    .map(child -> child.substring(len + 1))\n-                    .collect(toList());\n-        }\n-\n-        /**\n-         * create new watching request for current path.\n-         */\n-        protected WatchRequest nextRequest() {\n-\n-            WatchCreateRequest.Builder builder = WatchCreateRequest.newBuilder()\n-                    .setKey(ByteString.copyFromUtf8(path))\n-                    .setRangeEnd(ByteString.copyFrom(\n-                            OptionUtil.prefixEndOf(ByteSequence.from(path, UTF_8)).getBytes()))\n-                    .setProgressNotify(true);\n-\n-            return WatchRequest.newBuilder().setCreateRequest(builder).build();\n-        }\n-\n-        public void tryReconnect(Throwable e) {\n-\n-            this.throwable = e;\n-\n-            logger.error(\"watcher client has error occurred, current path '\" + path + \"'\", e);\n-\n-            // prevents grpc on sending error to a closed watch client.\n-            if (!isConnected()) {\n-                return;\n-            }\n-\n-\n-            Status status = Status.fromThrowable(e);\n-            // system may be recover later, current connect won't be lost\n-            if (OptionUtil.isHaltError(status) || OptionUtil.isNoLeaderError(status)) {\n-                reconnectSchedule.schedule(this::reconnect, new Random().nextInt(delayPeriod), TimeUnit.MILLISECONDS);\n-                return;\n-            }\n-            // reconnect with a delay; avoiding immediate retry on a long connection downtime.\n-            reconnectSchedule.schedule(this::reconnect, new Random().nextInt(delayPeriod), TimeUnit.MILLISECONDS);\n-        }\n-\n-        protected synchronized void reconnect() {\n-            this.closeWatchRequest();\n-            this.recreateWatchRequest();\n-        }\n-\n-        protected void recreateWatchRequest() {\n-            if (watchRequest == null) {\n-                this.watchStub = WatchGrpc.newStub(clientWrapper.getChannel());\n-                this.watchRequest = watchStub.watch(this);\n-            }\n-            this.watchRequest.onNext(nextRequest());\n-            this.throwable = null;\n-            logger.warn(\"watch client retried connect for path '\" + path + \"', connection status : \" + isConnected());\n-        }\n-\n-        protected void closeWatchRequest() {\n-            if (this.watchRequest == null) {\n-                return;\n-            }\n-\n-            try {\n-                WatchCancelRequest watchCancelRequest =\n-                        WatchCancelRequest.newBuilder().setWatchId(watchId).build();\n-                WatchRequest cancelRequest = WatchRequest.newBuilder()\n-                        .setCancelRequest(watchCancelRequest).build();\n-                watchRequest.onNext(cancelRequest);\n-            } finally {\n-                this.watchRequest.onCompleted();\n-                this.watchRequest = null;\n-            }\n-        }\n-\n-        @Override\n-        public void onCompleted() {\n-            // do not touch this method, if you want terminate this stream.\n-        }\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.remoting.etcd.jetcd;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.ExecutorUtil;\r\n+import org.apache.dubbo.common.utils.NamedThreadFactory;\r\n+import org.apache.dubbo.remoting.etcd.ChildListener;\r\n+import org.apache.dubbo.remoting.etcd.StateListener;\r\n+import org.apache.dubbo.remoting.etcd.option.OptionUtil;\r\n+import org.apache.dubbo.remoting.etcd.support.AbstractEtcdClient;\r\n+\r\n+import com.google.protobuf.ByteString;\r\n+import io.etcd.jetcd.ByteSequence;\r\n+import io.etcd.jetcd.api.Event;\r\n+import io.etcd.jetcd.api.KeyValue;\r\n+import io.etcd.jetcd.api.WatchCancelRequest;\r\n+import io.etcd.jetcd.api.WatchCreateRequest;\r\n+import io.etcd.jetcd.api.WatchGrpc;\r\n+import io.etcd.jetcd.api.WatchRequest;\r\n+import io.etcd.jetcd.api.WatchResponse;\r\n+import io.etcd.jetcd.common.exception.ClosedClientException;\r\n+import io.grpc.ManagedChannel;\r\n+import io.grpc.Status;\r\n+import io.grpc.stub.StreamObserver;\r\n+import io.netty.util.internal.ConcurrentSet;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Collections;\r\n+import java.util.Iterator;\r\n+import java.util.List;\r\n+import java.util.Random;\r\n+import java.util.Set;\r\n+import java.util.concurrent.ExecutionException;\r\n+import java.util.concurrent.ExecutorService;\r\n+import java.util.concurrent.Executors;\r\n+import java.util.concurrent.LinkedBlockingQueue;\r\n+import java.util.concurrent.ScheduledExecutorService;\r\n+import java.util.concurrent.ThreadPoolExecutor;\r\n+import java.util.concurrent.TimeUnit;\r\n+import java.util.concurrent.TimeoutException;\r\n+import java.util.concurrent.locks.ReentrantLock;\r\n+\r\n+import static java.util.stream.Collectors.toList;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;\r\n+import static org.apache.dubbo.remoting.etcd.Constants.DEFAULT_ETCD3_NOTIFY_QUEUES_KEY;\r\n+import static org.apache.dubbo.remoting.etcd.Constants.DEFAULT_ETCD3_NOTIFY_THREADS;\r\n+import static org.apache.dubbo.remoting.etcd.Constants.DEFAULT_GRPC_QUEUES;\r\n+import static org.apache.dubbo.remoting.etcd.Constants.DEFAULT_RETRY_PERIOD;\r\n+import static org.apache.dubbo.remoting.etcd.Constants.DEFAULT_SESSION_TIMEOUT;\r\n+import static org.apache.dubbo.remoting.etcd.Constants.ETCD3_NOTIFY_MAXTHREADS_KEYS;\r\n+import static org.apache.dubbo.remoting.etcd.Constants.RETRY_PERIOD_KEY;\r\n+import static org.apache.dubbo.remoting.etcd.jetcd.JEtcdClientWrapper.UTF_8;\r\n+\r\n+/**\r\n+ * etcd3 client.\r\n+ */\r\n+public class JEtcdClient extends AbstractEtcdClient<JEtcdClient.EtcdWatcher> {\r\n+\r\n+    private JEtcdClientWrapper clientWrapper;\r\n+    private ScheduledExecutorService reconnectSchedule;\r\n+\r\n+    private ExecutorService notifyExecutor;\r\n+\r\n+    private int delayPeriod;\r\n+    private Logger logger = LoggerFactory.getLogger(JEtcdClient.class);\r\n+\r\n+    public JEtcdClient(URL url) {\r\n+        super(url);\r\n+        try {\r\n+            clientWrapper = new JEtcdClientWrapper(url);\r\n+            clientWrapper.setConnectionStateListener((client, state) -> {\r\n+                if (state == StateListener.CONNECTED) {\r\n+                    JEtcdClient.this.stateChanged(StateListener.CONNECTED);\r\n+                } else if (state == StateListener.DISCONNECTED) {\r\n+                    JEtcdClient.this.stateChanged(StateListener.DISCONNECTED);\r\n+                }\r\n+            });\r\n+            delayPeriod = getUrl().getParameter(RETRY_PERIOD_KEY, DEFAULT_RETRY_PERIOD);\r\n+            reconnectSchedule = Executors.newScheduledThreadPool(1,\r\n+                    new NamedThreadFactory(\"etcd3-watch-auto-reconnect\"));\r\n+\r\n+            notifyExecutor = new ThreadPoolExecutor(\r\n+                    1\r\n+                    , url.getParameter(ETCD3_NOTIFY_MAXTHREADS_KEYS, DEFAULT_ETCD3_NOTIFY_THREADS)\r\n+                    , DEFAULT_SESSION_TIMEOUT\r\n+                    , TimeUnit.MILLISECONDS\r\n+                    , new LinkedBlockingQueue<Runnable>(url.getParameter(DEFAULT_ETCD3_NOTIFY_QUEUES_KEY, DEFAULT_GRPC_QUEUES * 3))\r\n+                    , new NamedThreadFactory(\"etcd3-notify\", true));\r\n+\r\n+            clientWrapper.start();\r\n+        } catch (Exception e) {\r\n+            throw new IllegalStateException(e.getMessage(), e);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doCreatePersistent(String path) {\r\n+        clientWrapper.createPersistent(path);\r\n+    }\r\n+\r\n+    @Override\r\n+    public long doCreateEphemeral(String path) {\r\n+        return clientWrapper.createEphemeral(path);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean checkExists(String path) {\r\n+        return clientWrapper.checkExists(path);\r\n+    }\r\n+\r\n+    @Override\r\n+    public EtcdWatcher createChildWatcherListener(String path, ChildListener listener) {\r\n+        return new EtcdWatcher(listener);\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<String> addChildWatcherListener(String path, EtcdWatcher etcdWatcher) {\r\n+        return etcdWatcher.forPath(path);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void removeChildWatcherListener(String path, EtcdWatcher etcdWatcher) {\r\n+        etcdWatcher.unwatch();\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<String> getChildren(String path) {\r\n+        return clientWrapper.getChildren(path);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isConnected() {\r\n+        return clientWrapper.isConnected();\r\n+    }\r\n+\r\n+    @Override\r\n+    public long createLease(long second) {\r\n+        return clientWrapper.createLease(second);\r\n+    }\r\n+\r\n+    @Override\r\n+    public long createLease(long ttl, long timeout, TimeUnit unit)\r\n+            throws InterruptedException, ExecutionException, TimeoutException {\r\n+        return clientWrapper.createLease(ttl, timeout, unit);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void delete(String path) {\r\n+        clientWrapper.delete(path);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void revokeLease(long lease) {\r\n+        clientWrapper.revokeLease(lease);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doClose() {\r\n+        try {\r\n+            if (notifyExecutor != null) {\r\n+                ExecutorUtil.shutdownNow(notifyExecutor, 100);\r\n+            }\r\n+        } catch (Exception e) {\r\n+            logger.warn(e.getMessage(), e);\r\n+        }\r\n+\r\n+        try {\r\n+            if (reconnectSchedule != null) {\r\n+                ExecutorUtil.shutdownNow(reconnectSchedule, 100);\r\n+            }\r\n+        } catch (Exception e) {\r\n+            logger.warn(e.getMessage(), e);\r\n+        } finally {\r\n+            clientWrapper.doClose();\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getKVValue(String key) {\r\n+        return clientWrapper.getKVValue(key);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean put(String key, String value) {\r\n+        return clientWrapper.put(key, value);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean putEphemeral(String key, String value) {\r\n+        return clientWrapper.putEphemeral(key, value);\r\n+    }\r\n+\r\n+    public ManagedChannel getChannel() {\r\n+        return clientWrapper.getChannel();\r\n+    }\r\n+\r\n+    public class EtcdWatcher implements StreamObserver<WatchResponse> {\r\n+\r\n+        protected WatchGrpc.WatchStub watchStub;\r\n+        protected StreamObserver<WatchRequest> watchRequest;\r\n+        protected long watchId;\r\n+        protected String path;\r\n+        protected Throwable throwable;\r\n+        protected volatile Set<String> urls = new ConcurrentSet<>();\r\n+        private ChildListener listener;\r\n+\r\n+        protected ReentrantLock lock = new ReentrantLock(true);\r\n+\r\n+        public EtcdWatcher(ChildListener listener) {\r\n+            this.listener = listener;\r\n+        }\r\n+\r\n+        @Override\r\n+        public void onNext(WatchResponse response) {\r\n+\r\n+            // prevents grpc on sending watchResponse to a closed watch client.\r\n+            if (!isConnected()) {\r\n+                return;\r\n+            }\r\n+\r\n+            watchId = response.getWatchId();\r\n+\r\n+            if (listener != null) {\r\n+                int modified = 0;\r\n+                String service = null;\r\n+                Iterator<Event> iterator = response.getEventsList().iterator();\r\n+                while (iterator.hasNext()) {\r\n+                    Event event = iterator.next();\r\n+                    switch (event.getType()) {\r\n+                        case PUT: {\r\n+                            if (((service = find(event)) != null)\r\n+                                    && safeUpdate(service, true)) {\r\n+                                modified++;\r\n+                            }\r\n+                            break;\r\n+                        }\r\n+                        case DELETE: {\r\n+                            if (((service = find(event)) != null)\r\n+                                    && safeUpdate(service, false)) {\r\n+                                modified++;\r\n+                            }\r\n+                            break;\r\n+                        }\r\n+                        default:\r\n+                            break;\r\n+                    }\r\n+                }\r\n+                if (modified > 0) {\r\n+                    notifyExecutor.execute(() -> listener.childChanged(path, new ArrayList<>(urls)));\r\n+                }\r\n+\r\n+            }\r\n+        }\r\n+\r\n+        @Override\r\n+        public void onError(Throwable e) {\r\n+            tryReconnect(e);\r\n+        }\r\n+\r\n+        public void unwatch() {\r\n+\r\n+            // prevents grpc on sending watchResponse to a closed watch client.\r\n+            if (!isConnected()) {\r\n+                return;\r\n+            }\r\n+\r\n+            try {\r\n+                /**\r\n+                 * issue : https://github.com/apache/dubbo/issues/4115\r\n+                 *\r\n+                 * When the network is reconnected, the listener is empty\r\n+                 * and the data cannot be received.\r\n+                 */\r\n+                // this.listener = null;\r\n+\r\n+                if (watchRequest != null) {\r\n+                    WatchCancelRequest watchCancelRequest =\r\n+                            WatchCancelRequest.newBuilder().setWatchId(watchId).build();\r\n+                    WatchRequest cancelRequest = WatchRequest.newBuilder()\r\n+                            .setCancelRequest(watchCancelRequest).build();\r\n+                    this.watchRequest.onNext(cancelRequest);\r\n+                }\r\n+            } catch (Exception ignored) {\r\n+                logger.warn(\"Failed to cancel watch for path '\" + path + \"'\", ignored);\r\n+            }\r\n+        }\r\n+\r\n+        public List<String> forPath(String path) {\r\n+\r\n+            if (!isConnected()) {\r\n+                throw new ClosedClientException(\"watch client has been closed, path '\" + path + \"'\");\r\n+            }\r\n+            if (this.path != null) {\r\n+                unwatch();\r\n+            }\r\n+\r\n+            this.path = path;\r\n+\r\n+            lock.lock();\r\n+            try {\r\n+\r\n+                this.watchStub = WatchGrpc.newStub(clientWrapper.getChannel());\r\n+                this.watchRequest = watchStub.watch(this);\r\n+                this.watchRequest.onNext(nextRequest());\r\n+\r\n+                List<String> children = clientWrapper.getChildren(path);\r\n+                /**\r\n+                 * caching the current service\r\n+                 */\r\n+                if (!children.isEmpty()) {\r\n+                    this.urls.addAll(filterChildren(children));\r\n+                }\r\n+\r\n+                return new ArrayList<>(urls);\r\n+            } finally {\r\n+                lock.unlock();\r\n+            }\r\n+        }\r\n+\r\n+        private boolean safeUpdate(String service, boolean add) {\r\n+            lock.lock();\r\n+            try {\r\n+                /**\r\n+                 * If the collection already contains the specified service, do nothing\r\n+                 */\r\n+                return add ? this.urls.add(service) : this.urls.remove(service);\r\n+            } finally {\r\n+                lock.unlock();\r\n+            }\r\n+        }\r\n+\r\n+        private String find(Event event) {\r\n+            KeyValue keyValue = event.getKv();\r\n+            String key = keyValue.getKey().toStringUtf8();\r\n+\r\n+            int len = path.length(), index = len, count = 0;\r\n+            if (key.length() >= index) {\r\n+                for (; (index = key.indexOf(PATH_SEPARATOR, index)) != -1; ++index) {\r\n+                    if (count++ > 1) {\r\n+                        break;\r\n+                    }\r\n+                }\r\n+            }\r\n+\r\n+            /**\r\n+             * if children changed , we should refresh invokers\r\n+             */\r\n+            if (count == 1) {\r\n+                /**\r\n+                 * remove prefix\r\n+                 */\r\n+                return key.substring(len + 1);\r\n+            }\r\n+\r\n+            return null;\r\n+        }\r\n+\r\n+        private List<String> filterChildren(List<String> children) {\r\n+            if (children == null) {\r\n+                return Collections.emptyList();\r\n+            }\r\n+            if (children.size() <= 0) {\r\n+                return children;\r\n+            }\r\n+            final int len = path.length();\r\n+            return children.stream().parallel()\r\n+                    .filter(child -> {\r\n+                        int index = len, count = 0;\r\n+                        if (child.length() > len) {\r\n+                            for (; (index = child.indexOf(PATH_SEPARATOR, index)) != -1; ++index) {\r\n+                                if (count++ > 1) {\r\n+                                    break;\r\n+                                }\r\n+                            }\r\n+                        }\r\n+                        return count == 1;\r\n+                    })\r\n+                    .map(child -> child.substring(len + 1))\r\n+                    .collect(toList());\r\n+        }\r\n+\r\n+        /**\r\n+         * create new watching request for current path.\r\n+         */\r\n+        protected WatchRequest nextRequest() {\r\n+\r\n+            WatchCreateRequest.Builder builder = WatchCreateRequest.newBuilder()\r\n+                    .setKey(ByteString.copyFromUtf8(path))\r\n+                    .setRangeEnd(ByteString.copyFrom(\r\n+                            OptionUtil.prefixEndOf(ByteSequence.from(path, UTF_8)).getBytes()))\r\n+                    .setProgressNotify(true);\r\n+\r\n+            return WatchRequest.newBuilder().setCreateRequest(builder).build();\r\n+        }\r\n+\r\n+        public void tryReconnect(Throwable e) {\r\n+\r\n+            this.throwable = e;\r\n+\r\n+            logger.error(\"watcher client has error occurred, current path '\" + path + \"'\", e);\r\n+\r\n+            // prevents grpc on sending error to a closed watch client.\r\n+            if (!isConnected()) {\r\n+                return;\r\n+            }\r\n+\r\n+\r\n+            Status status = Status.fromThrowable(e);\r\n+            // system may be recover later, current connect won't be lost\r\n+            if (OptionUtil.isHaltError(status) || OptionUtil.isNoLeaderError(status)) {\r\n+                reconnectSchedule.schedule(this::reconnect, new Random().nextInt(delayPeriod), TimeUnit.MILLISECONDS);\r\n+                return;\r\n+            }\r\n+            // reconnect with a delay; avoiding immediate retry on a long connection downtime.\r\n+            reconnectSchedule.schedule(this::reconnect, new Random().nextInt(delayPeriod), TimeUnit.MILLISECONDS);\r\n+        }\r\n+\r\n+        protected synchronized void reconnect() {\r\n+            this.closeWatchRequest();\r\n+            this.recreateWatchRequest();\r\n+        }\r\n+\r\n+        protected void recreateWatchRequest() {\r\n+            if (watchRequest == null) {\r\n+                this.watchStub = WatchGrpc.newStub(clientWrapper.getChannel());\r\n+                this.watchRequest = watchStub.watch(this);\r\n+            }\r\n+            this.watchRequest.onNext(nextRequest());\r\n+            this.throwable = null;\r\n+            logger.warn(\"watch client retried connect for path '\" + path + \"', connection status : \" + isConnected());\r\n+        }\r\n+\r\n+        protected void closeWatchRequest() {\r\n+            if (this.watchRequest == null) {\r\n+                return;\r\n+            }\r\n+\r\n+            try {\r\n+                WatchCancelRequest watchCancelRequest =\r\n+                        WatchCancelRequest.newBuilder().setWatchId(watchId).build();\r\n+                WatchRequest cancelRequest = WatchRequest.newBuilder()\r\n+                        .setCancelRequest(watchCancelRequest).build();\r\n+                watchRequest.onNext(cancelRequest);\r\n+            } finally {\r\n+                this.watchRequest.onCompleted();\r\n+                this.watchRequest = null;\r\n+            }\r\n+        }\r\n+\r\n+        @Override\r\n+        public void onCompleted() {\r\n+            // do not touch this method, if you want terminate this stream.\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/remoting/etcd/jetcd/JEtcdClientWrapper.java", "source2": "org/apache/dubbo/remoting/etcd/jetcd/JEtcdClientWrapper.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,752 +1,752 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\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-\n-package org.apache.dubbo.remoting.etcd.jetcd;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.ConcurrentHashSet;\n-import org.apache.dubbo.common.utils.NamedThreadFactory;\n-import org.apache.dubbo.common.utils.ReflectUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.remoting.etcd.RetryPolicy;\n-import org.apache.dubbo.remoting.etcd.StateListener;\n-\n-import io.etcd.jetcd.ByteSequence;\n-import io.etcd.jetcd.Client;\n-import io.etcd.jetcd.ClientBuilder;\n-import io.etcd.jetcd.KeyValue;\n-import io.etcd.jetcd.common.exception.ErrorCode;\n-import io.etcd.jetcd.common.exception.EtcdException;\n-import io.etcd.jetcd.kv.GetResponse;\n-import io.etcd.jetcd.kv.PutResponse;\n-import io.etcd.jetcd.lease.LeaseKeepAliveResponse;\n-import io.etcd.jetcd.options.GetOption;\n-import io.etcd.jetcd.options.PutOption;\n-import io.etcd.jetcd.support.CloseableClient;\n-import io.etcd.jetcd.support.Observers;\n-import io.grpc.ConnectivityState;\n-import io.grpc.ManagedChannel;\n-import io.grpc.Status;\n-import io.grpc.stub.StreamObserver;\n-\n-import java.lang.reflect.Field;\n-import java.lang.reflect.Method;\n-import java.nio.charset.Charset;\n-import java.nio.charset.StandardCharsets;\n-import java.util.Arrays;\n-import java.util.Collections;\n-import java.util.HashSet;\n-import java.util.List;\n-import java.util.Set;\n-import java.util.concurrent.Callable;\n-import java.util.concurrent.CompletableFuture;\n-import java.util.concurrent.ExecutionException;\n-import java.util.concurrent.Executors;\n-import java.util.concurrent.ScheduledExecutorService;\n-import java.util.concurrent.ScheduledFuture;\n-import java.util.concurrent.TimeUnit;\n-import java.util.concurrent.TimeoutException;\n-import java.util.concurrent.atomic.AtomicReference;\n-import java.util.function.Consumer;\n-\n-import static java.util.stream.Collectors.toList;\n-import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR;\n-import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;\n-import static org.apache.dubbo.remoting.etcd.Constants.DEFAULT_KEEPALIVE_TIMEOUT;\n-import static org.apache.dubbo.remoting.etcd.Constants.DEFAULT_RECONNECT_PERIOD;\n-import static org.apache.dubbo.remoting.etcd.Constants.DEFAULT_RETRY_PERIOD;\n-import static org.apache.dubbo.remoting.etcd.Constants.HTTP_KEY;\n-import static org.apache.dubbo.remoting.etcd.Constants.HTTP_SUBFIX_KEY;\n-import static org.apache.dubbo.remoting.etcd.Constants.RETRY_PERIOD_KEY;\n-import static org.apache.dubbo.remoting.etcd.Constants.SESSION_TIMEOUT_KEY;\n-\n-public class JEtcdClientWrapper {\n-\n-    private Logger logger = LoggerFactory.getLogger(JEtcdClientWrapper.class);\n-\n-    private final URL url;\n-    private volatile Client client;\n-    private volatile boolean started = false;\n-    private volatile boolean connectState = false;\n-    private ScheduledFuture future;\n-    private ScheduledExecutorService reconnectNotify;\n-    private AtomicReference<ManagedChannel> channel;\n-\n-    private ConnectionStateListener connectionStateListener;\n-\n-    private long expirePeriod;\n-\n-    private CompletableFuture<Client> completableFuture;\n-\n-    private RetryPolicy retryPolicy;\n-\n-    private RuntimeException failed;\n-\n-    private final ScheduledFuture<?> retryFuture;\n-    private final ScheduledExecutorService retryExecutor = Executors.newScheduledThreadPool(1,\n-            new NamedThreadFactory(\"Etcd3RegistryKeepAliveFailedRetryTimer\", true));\n-\n-    private final Set<String> failedRegistered = new ConcurrentHashSet<String>();\n-\n-    private final Set<String> registeredPaths = new ConcurrentHashSet<>();\n-    private volatile CloseableClient keepAlive = null;\n-\n-    /**\n-     * Support temporary nodes to reuse the same lease\n-     */\n-    private volatile long globalLeaseId;\n-\n-    private volatile boolean cancelKeepAlive = false;\n-\n-    public static final Charset UTF_8 = StandardCharsets.UTF_8;\n-\n-    public JEtcdClientWrapper(URL url) {\n-        this.url = url;\n-        this.expirePeriod = url.getParameter(SESSION_TIMEOUT_KEY, DEFAULT_KEEPALIVE_TIMEOUT) / 1000;\n-        if (expirePeriod <= 0) {\n-            this.expirePeriod = DEFAULT_KEEPALIVE_TIMEOUT / 1000;\n-        }\n-        this.channel = new AtomicReference<>();\n-        this.completableFuture = CompletableFuture.supplyAsync(() -> prepareClient(url));\n-        this.reconnectNotify = Executors.newScheduledThreadPool(1,\n-                new NamedThreadFactory(\"reconnectNotify\", true));\n-        this.retryPolicy = new RetryNTimes(1, 1000, TimeUnit.MILLISECONDS);\n-\n-        this.failed = new IllegalStateException(\"Etcd3 registry is not connected yet, url:\" + url);\n-        int retryPeriod = url.getParameter(RETRY_PERIOD_KEY, DEFAULT_RETRY_PERIOD);\n-\n-        this.retryFuture = retryExecutor.scheduleWithFixedDelay(() -> {\n-            try {\n-                retry();\n-            } catch (Throwable t) {\n-                logger.error(\"Unexpected error occur at failed retry, cause: \" + t.getMessage(), t);\n-            }\n-        }, retryPeriod, retryPeriod, TimeUnit.MILLISECONDS);\n-    }\n-\n-    private Client prepareClient(URL url) {\n-\n-        int maxInboundSize = DEFAULT_INBOUND_SIZE;\n-        if (StringUtils.isNotEmpty(System.getProperty(GRPC_MAX_INBOUND_SIZE_KEY))) {\n-            maxInboundSize = Integer.valueOf(System.getProperty(GRPC_MAX_INBOUND_SIZE_KEY));\n-        }\n-\n-        // TODO, uses default pick-first round robin.\n-        ClientBuilder clientBuilder = Client.builder()\n-                .endpoints(endPoints(url.getBackupAddress()))\n-                .maxInboundMessageSize(maxInboundSize);\n-\n-        return clientBuilder.build();\n-    }\n-\n-    public Client getClient() {\n-        return client;\n-    }\n-\n-    /**\n-     * try to get current connected channel.\n-     *\n-     * @return connected channel.\n-     */\n-    public ManagedChannel getChannel() {\n-        if (channel.get() == null || (channel.get().isShutdown() || channel.get().isTerminated())) {\n-            channel.set(newChannel(client));\n-        }\n-        return channel.get();\n-    }\n-\n-    /**\n-     * find direct children directory, excluding path self,\n-     * Never return null.\n-     *\n-     * @param path the path to be found direct children.\n-     * @return direct children directory, contains zero element\n-     * list if children directory not exists.\n-     */\n-    public List<String> getChildren(String path) {\n-        try {\n-            return RetryLoops.invokeWithRetry(\n-                    () -> {\n-                        requiredNotNull(client, failed);\n-                        int len = path.length();\n-                        return client.getKVClient()\n-                                .get(ByteSequence.from(path, UTF_8),\n-                                        GetOption.newBuilder().withPrefix(ByteSequence.from(path, UTF_8)).build())\n-                                .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS)\n-                                .getKvs().stream().parallel()\n-                                .filter(pair -> {\n-                                    String key = pair.getKey().toString(UTF_8);\n-                                    int index = len, count = 0;\n-                                    if (key.length() > len) {\n-                                        for (; (index = key.indexOf(PATH_SEPARATOR, index)) != -1; ++index) {\n-                                            if (count++ > 1) {\n-                                                break;\n-                                            }\n-                                        }\n-                                    }\n-                                    return count == 1;\n-                                })\n-                                .map(pair -> pair.getKey().toString(UTF_8))\n-                                .collect(toList());\n-                    }, retryPolicy);\n-        } catch (Exception e) {\n-            throw new IllegalStateException(e.getMessage(), e);\n-        }\n-    }\n-\n-    public boolean isConnected() {\n-        return ConnectivityState.READY == (getChannel().getState(false))\n-                || ConnectivityState.IDLE == (getChannel().getState(false));\n-    }\n-\n-    public long createLease(long second) {\n-        try {\n-            return RetryLoops.invokeWithRetry(\n-                    () -> {\n-                        requiredNotNull(client, failed);\n-                        return client.getLeaseClient()\n-                                .grant(second)\n-                                .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS)\n-                                .getID();\n-                    }, retryPolicy);\n-        } catch (Exception e) {\n-            throw new IllegalStateException(e.getMessage(), e);\n-        }\n-    }\n-\n-    public void revokeLease(long lease) {\n-        try {\n-            RetryLoops.invokeWithRetry(\n-                    (Callable<Void>) () -> {\n-                        requiredNotNull(client, failed);\n-                        client.getLeaseClient()\n-                                .revoke(lease)\n-                                .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS);\n-                        return null;\n-                    }, retryPolicy);\n-        } catch (Exception e) {\n-            throw new IllegalStateException(e.getMessage(), e);\n-        }\n-    }\n-\n-    public long createLease(long ttl, long timeout, TimeUnit unit)\n-            throws InterruptedException, ExecutionException, TimeoutException {\n-\n-        if (timeout <= 0) {\n-            return createLease(ttl);\n-        }\n-\n-        requiredNotNull(client, failed);\n-        return client.getLeaseClient()\n-                .grant(ttl)\n-                .get(timeout, unit).getID();\n-    }\n-\n-\n-    /**\n-     * try to check if path exists.\n-     */\n-    public boolean checkExists(String path) {\n-        try {\n-            return RetryLoops.invokeWithRetry(\n-                    () -> {\n-                        requiredNotNull(client, failed);\n-                        return client.getKVClient()\n-                                .get(ByteSequence.from(path, UTF_8), GetOption.newBuilder().withCountOnly(true).build())\n-                                .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS)\n-                                .getCount() > 0;\n-                    }, retryPolicy);\n-        } catch (Exception e) {\n-            throw new IllegalStateException(e.getMessage(), e);\n-        }\n-    }\n-\n-    /**\n-     * only internal use only, maybe change in the future\n-     */\n-    protected Long find(String path) {\n-        try {\n-            return RetryLoops.invokeWithRetry(\n-                    () -> {\n-                        requiredNotNull(client, failed);\n-                        return client.getKVClient()\n-                                .get(ByteSequence.from(path, UTF_8))\n-                                .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS)\n-                                .getKvs().stream()\n-                                .mapToLong(keyValue -> Long.valueOf(keyValue.getValue().toString(UTF_8)))\n-                                .findFirst().getAsLong();\n-                    }, retryPolicy);\n-        } catch (Exception e) {\n-            throw new IllegalStateException(e.getMessage(), e);\n-        }\n-    }\n-\n-    public void createPersistent(String path) {\n-        try {\n-            RetryLoops.invokeWithRetry(\n-                    (Callable<Void>) () -> {\n-                        requiredNotNull(client, failed);\n-                        client.getKVClient()\n-                                .put(ByteSequence.from(path, UTF_8),\n-                                        ByteSequence.from(String.valueOf(path.hashCode()), UTF_8))\n-                                .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS);\n-                        return null;\n-                    }, retryPolicy);\n-        } catch (Exception e) {\n-            throw new IllegalStateException(e.getMessage(), e);\n-        }\n-    }\n-\n-    /**\n-     * create new ephemeral path save to etcd .\n-     * if node disconnect from etcd, it will be deleted\n-     * automatically by etcd when session timeout.\n-     *\n-     * @param path the path to be saved\n-     * @return the lease of current path.\n-     */\n-    public long createEphemeral(String path) {\n-        try {\n-            return RetryLoops.invokeWithRetry(\n-                    () -> {\n-                        requiredNotNull(client, failed);\n-\n-                        registeredPaths.add(path);\n-                        keepAlive();\n-                        final long leaseId = globalLeaseId;\n-                        client.getKVClient()\n-                                .put(ByteSequence.from(path, UTF_8)\n-                                        , ByteSequence.from(String.valueOf(leaseId), UTF_8)\n-                                        , PutOption.newBuilder().withLeaseId(leaseId).build())\n-                                .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS);\n-                        return leaseId;\n-                    }, retryPolicy);\n-        } catch (Exception e) {\n-            throw new IllegalStateException(e.getMessage(), e);\n-        }\n-    }\n-\n-    // easy for mock\n-    public void keepAlive(long lease) {\n-        this.keepAlive(lease, null);\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    private <T> void keepAlive(long lease, Consumer<T> onFailed) {\n-        final StreamObserver<LeaseKeepAliveResponse> observer = new Observers.Builder()\n-                .onError((e) -> {\n-                    if (e instanceof EtcdException) {\n-                        EtcdException error = (EtcdException) e;\n-                        /**\n-                         * ttl has expired\n-                         */\n-                        if (error.getErrorCode() == ErrorCode.NOT_FOUND) {\n-                            keepAlive0(onFailed);\n-                        }\n-                    }\n-                }).onCompleted(() -> {\n-                    /**\n-                     * deadline reached.\n-                     */\n-                    keepAlive0(onFailed);\n-                }).build();\n-\n-        /**\n-         * If there is already a keepalive, cancel first\n-         */\n-        cancelKeepAlive();\n-\n-        /**\n-         * create and set new keepAlive to globalKeepAliveRef\n-         */\n-        this.keepAlive = client.getLeaseClient().keepAlive(lease, observer);\n-    }\n-\n-    private void keepAlive() throws Exception {\n-        if (keepAlive == null) {\n-            synchronized (this) {\n-                if (keepAlive == null) {\n-                    this.globalLeaseId = client.getLeaseClient()\n-                            .grant(expirePeriod)\n-                            .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS)\n-                            .getID();\n-                    /**\n-                     * If the keepAlive expires, the registration will be re-attempted\n-                     */\n-                    keepAlive(globalLeaseId, (NULL) -> recovery());\n-                }\n-            }\n-        }\n-    }\n-\n-    private <T> void keepAlive0(Consumer<T> onFailed) {\n-        if (onFailed != null) {\n-\n-            /**\n-             * The following two scenarios will cause the keep-alive failure\uff1a\n-             *\n-             * 1. Service is offline\n-             * 2. Local deadline check expired\n-             *\n-             * The multiplex lease cannot update the local deadline,\n-             * causing the extreme scene service to be dropped.\n-             *\n-             */\n-            long leaseId = globalLeaseId;\n-            try {\n-                if (logger.isWarnEnabled()) {\n-                    logger.warn(\"Failed to keep alive for global lease '\" + leaseId + \"', waiting for retry again.\");\n-                }\n-                onFailed.accept(null);\n-            } catch (Exception ignored) {\n-                logger.warn(\"Failed to recover from global lease expired or lease deadline exceeded. lease '\" + leaseId + \"'\", ignored);\n-            }\n-        }\n-    }\n-\n-    private void recovery() {\n-\n-        try {\n-            /**\n-             * The client is processing reconnection\n-             */\n-            if (cancelKeepAlive) {\n-                return;\n-            }\n-\n-            cancelKeepAlive();\n-\n-            Set<String> ephemeralPaths = new HashSet<String>(registeredPaths);\n-            if (!ephemeralPaths.isEmpty()) {\n-                for (String path : ephemeralPaths) {\n-                    try {\n-\n-                        /**\n-                         * The client is processing reconnection,\n-                         * cancel remaining service registration\n-                         */\n-                        if (cancelKeepAlive) {\n-                            return;\n-                        }\n-\n-                        createEphemeral(path);\n-                        failedRegistered.remove(path);\n-                    } catch (Exception e) {\n-\n-                        /**\n-                         * waiting for retry again\n-                         */\n-                        failedRegistered.add(path);\n-\n-                        Status status = Status.fromThrowable(e);\n-                        if (status.getCode() == Status.Code.NOT_FOUND) {\n-                            cancelKeepAlive();\n-                        }\n-                    }\n-                }\n-            }\n-        } catch (Throwable t) {\n-            logger.warn(\"Unexpected error, failed to recover from global lease expired or deadline exceeded.\", t);\n-        }\n-    }\n-\n-    public void delete(String path) {\n-        try {\n-            RetryLoops.invokeWithRetry(\n-                    (Callable<Void>) () -> {\n-                        requiredNotNull(client, failed);\n-                        client.getKVClient()\n-                                .delete(ByteSequence.from(path, UTF_8))\n-                                .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS);\n-                        registeredPaths.remove(path);\n-                        return null;\n-                    }, retryPolicy);\n-        } catch (Exception e) {\n-            throw new IllegalStateException(e.getMessage(), e);\n-        } finally {\n-            /**\n-             * Cancel retry\n-             */\n-            failedRegistered.remove(path);\n-        }\n-    }\n-\n-    public String[] endPoints(String backupAddress) {\n-        String[] endpoints = backupAddress.split(COMMA_SEPARATOR);\n-        List<String> addresses = Arrays.stream(endpoints)\n-                .map(address -> address.contains(HTTP_SUBFIX_KEY)\n-                        ? address\n-                        : HTTP_KEY + address)\n-                .collect(toList());\n-        Collections.shuffle(addresses);\n-        return addresses.toArray(new String[0]);\n-    }\n-\n-    /**\n-     * because jetcd's connection change callback not supported yet, we must\n-     * loop to test if connect or disconnect event happened or not. It will be changed\n-     * in the future if we found better choice.\n-     */\n-    public void start() {\n-        if (!started) {\n-            try {\n-                this.client = completableFuture.get(expirePeriod, TimeUnit.SECONDS);\n-                this.connectState = isConnected();\n-                this.started = true;\n-            } catch (Throwable t) {\n-                logger.error(\"Timeout! etcd3 server can not be connected in : \" + expirePeriod + \" seconds! url: \" + url, t);\n-\n-                completableFuture.whenComplete((c, e) -> {\n-                    this.client = c;\n-                    if (e != null) {\n-                        logger.error(\"Got an exception when trying to create etcd3 instance, can not connect to etcd3 server, url: \" + url, e);\n-                    }\n-                });\n-\n-            }\n-\n-            try {\n-                this.future = reconnectNotify.scheduleWithFixedDelay(() -> {\n-                    boolean connected = isConnected();\n-                    if (connectState != connected) {\n-                        int notifyState = connected ? StateListener.CONNECTED : StateListener.DISCONNECTED;\n-                        if (connectionStateListener != null) {\n-                            try {\n-                                if (connected) {\n-                                    clearKeepAlive();\n-                                }\n-                                connectionStateListener.stateChanged(getClient(), notifyState);\n-                            } finally {\n-                                cancelKeepAlive = false;\n-                            }\n-                        }\n-                        connectState = connected;\n-                    }\n-                }, DEFAULT_RECONNECT_PERIOD, DEFAULT_RECONNECT_PERIOD, TimeUnit.MILLISECONDS);\n-            } catch (Throwable t) {\n-                logger.error(\"monitor reconnect status failed.\", t);\n-            }\n-        }\n-    }\n-\n-    private void cancelKeepAlive() {\n-        try {\n-            if (keepAlive != null) {\n-                keepAlive.close();\n-            }\n-        } finally {\n-            // help for gc\n-            keepAlive = null;\n-        }\n-    }\n-\n-    private void clearKeepAlive() {\n-        cancelKeepAlive = true;\n-        failedRegistered.clear();\n-        cancelKeepAlive();\n-    }\n-\n-    protected void doClose() {\n-\n-        try {\n-            cancelKeepAlive = true;\n-            if (globalLeaseId != 0) {\n-                revokeLease(this.globalLeaseId);\n-            }\n-        } catch (Exception e) {\n-            logger.warn(\"revoke global lease '\" + globalLeaseId + \"' failed, registry: \" + url, e);\n-        }\n-\n-        try {\n-            if (started && future != null) {\n-                started = false;\n-                future.cancel(true);\n-                reconnectNotify.shutdownNow();\n-            }\n-        } catch (Exception e) {\n-            logger.warn(\"stop reconnect Notify failed, registry: \" + url, e);\n-        }\n-\n-        try {\n-            retryFuture.cancel(true);\n-            retryExecutor.shutdownNow();\n-        } catch (Throwable t) {\n-            logger.warn(t.getMessage(), t);\n-        }\n-\n-        if (getClient() != null) {\n-            getClient().close();\n-        }\n-    }\n-\n-    /**\n-     * try get client's shared channel, because all fields is private on jetcd,\n-     * we must using it by reflect, in the future, jetcd may provider better tools.\n-     *\n-     * @param client get channel from current client\n-     * @return current connection channel\n-     */\n-    private ManagedChannel newChannel(Client client) {\n-        try {\n-            Field connectionField = client.getClass().getDeclaredField(\"connectionManager\");\n-            ReflectUtils.makeAccessible(connectionField);\n-            Object connection = connectionField.get(client);\n-            Method channel = connection.getClass().getDeclaredMethod(\"getChannel\");\n-            ReflectUtils.makeAccessible(channel);\n-            return (ManagedChannel) channel.invoke(connection);\n-        } catch (Exception e) {\n-            throw new RuntimeException(\"Failed to obtain connection channel from \" + url.getBackupAddress(), e);\n-        }\n-    }\n-\n-    public ConnectionStateListener getConnectionStateListener() {\n-        return connectionStateListener;\n-    }\n-\n-    public void setConnectionStateListener(ConnectionStateListener connectionStateListener) {\n-        this.connectionStateListener = connectionStateListener;\n-    }\n-\n-    public static void requiredNotNull(Object obj, RuntimeException exception) {\n-        if (obj == null) {\n-            throw exception;\n-        }\n-    }\n-\n-    public String getKVValue(String key) {\n-        if (null == key) {\n-            return null;\n-        }\n-\n-        CompletableFuture<GetResponse> responseFuture = this.client.getKVClient().get(ByteSequence.from(key, UTF_8));\n-\n-        try {\n-            List<KeyValue> result = responseFuture.get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS).getKvs();\n-            if (!result.isEmpty()) {\n-                return result.get(0).getValue().toString(UTF_8);\n-            }\n-        } catch (Exception e) {\n-            // ignore\n-        }\n-\n-        return null;\n-    }\n-\n-\n-    public boolean put(String key, String value) {\n-        if (key == null || value == null) {\n-            return false;\n-        }\n-        CompletableFuture<PutResponse> putFuture =\n-                this.client.getKVClient().put(ByteSequence.from(key, UTF_8), ByteSequence.from(value, UTF_8));\n-        try {\n-            putFuture.get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS);\n-            return true;\n-        } catch (Exception e) {\n-            // ignore\n-        }\n-        return false;\n-    }\n-\n-    public boolean putEphemeral(final String key, String value) {\n-        try {\n-            return RetryLoops.invokeWithRetry(\n-                    () -> {\n-                        requiredNotNull(client, failed);\n-                        // recovery an retry\n-                        keepAlive();\n-                        final long leaseId = globalLeaseId;\n-                        client.getKVClient()\n-                                .put(ByteSequence.from(key, UTF_8)\n-                                        , ByteSequence.from(String.valueOf(value), UTF_8)\n-                                        , PutOption.newBuilder().withLeaseId(leaseId).build())\n-                                .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS);\n-                        return true;\n-                    }, retryPolicy);\n-        } catch (Exception e) {\n-            throw new IllegalStateException(e.getMessage(), e);\n-        }\n-    }\n-\n-    private void retry() {\n-        if (!failedRegistered.isEmpty()) {\n-            Set<String> failed = new HashSet<String>(failedRegistered);\n-            if (!failed.isEmpty()) {\n-\n-                if (cancelKeepAlive) {\n-                    return;\n-                }\n-\n-                if (logger.isWarnEnabled()) {\n-                    logger.warn(\"Retry failed register(keep alive) for path '\" + failed\n-                            + \"', path size: \" + failed.size());\n-                }\n-                try {\n-                    for (String path : failed) {\n-                        try {\n-\n-                            /**\n-                             * Is it currently reconnecting ?\n-                             */\n-                            if (cancelKeepAlive) {\n-                                return;\n-                            }\n-\n-                            createEphemeral(path);\n-                            failedRegistered.remove(path);\n-                        } catch (Throwable e) {\n-\n-                            failedRegistered.add(path);\n-\n-                            Status status = Status.fromThrowable(e);\n-                            if (status.getCode() == Status.Code.NOT_FOUND) {\n-                                cancelKeepAlive();\n-                            }\n-\n-                            logger.warn(\"Failed to retry register(keep alive) for path '\" + path + \"', waiting for again, cause: \" + e.getMessage(), e);\n-                        }\n-                    }\n-                } catch (Throwable t) {\n-                    logger.warn(\"Failed to retry register(keep alive) for path '\" + failed + \"', waiting for again, cause: \" + t.getMessage(), t);\n-                }\n-            }\n-        }\n-    }\n-\n-    /**\n-     * default request timeout\n-     */\n-    public static final long DEFAULT_REQUEST_TIMEOUT = obtainRequestTimeout();\n-\n-    public static final int DEFAULT_INBOUND_SIZE = 100 * 1024 * 1024;\n-\n-    public static final String GRPC_MAX_INBOUND_SIZE_KEY = \"grpc.max.inbound.size\";\n-\n-    public static final String ETCD_REQUEST_TIMEOUT_KEY = \"etcd.request.timeout\";\n-\n-    private static int obtainRequestTimeout() {\n-        if (StringUtils.isNotEmpty(System.getProperty(ETCD_REQUEST_TIMEOUT_KEY))) {\n-            return Integer.valueOf(System.getProperty(ETCD_REQUEST_TIMEOUT_KEY));\n-        }\n-        /**\n-         * 10 seconds.\n-         */\n-        return 10 * 1000;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.remoting.etcd.jetcd;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.ConcurrentHashSet;\r\n+import org.apache.dubbo.common.utils.NamedThreadFactory;\r\n+import org.apache.dubbo.common.utils.ReflectUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.remoting.etcd.RetryPolicy;\r\n+import org.apache.dubbo.remoting.etcd.StateListener;\r\n+\r\n+import io.etcd.jetcd.ByteSequence;\r\n+import io.etcd.jetcd.Client;\r\n+import io.etcd.jetcd.ClientBuilder;\r\n+import io.etcd.jetcd.KeyValue;\r\n+import io.etcd.jetcd.common.exception.ErrorCode;\r\n+import io.etcd.jetcd.common.exception.EtcdException;\r\n+import io.etcd.jetcd.kv.GetResponse;\r\n+import io.etcd.jetcd.kv.PutResponse;\r\n+import io.etcd.jetcd.lease.LeaseKeepAliveResponse;\r\n+import io.etcd.jetcd.options.GetOption;\r\n+import io.etcd.jetcd.options.PutOption;\r\n+import io.etcd.jetcd.support.CloseableClient;\r\n+import io.etcd.jetcd.support.Observers;\r\n+import io.grpc.ConnectivityState;\r\n+import io.grpc.ManagedChannel;\r\n+import io.grpc.Status;\r\n+import io.grpc.stub.StreamObserver;\r\n+\r\n+import java.lang.reflect.Field;\r\n+import java.lang.reflect.Method;\r\n+import java.nio.charset.Charset;\r\n+import java.nio.charset.StandardCharsets;\r\n+import java.util.Arrays;\r\n+import java.util.Collections;\r\n+import java.util.HashSet;\r\n+import java.util.List;\r\n+import java.util.Set;\r\n+import java.util.concurrent.Callable;\r\n+import java.util.concurrent.CompletableFuture;\r\n+import java.util.concurrent.ExecutionException;\r\n+import java.util.concurrent.Executors;\r\n+import java.util.concurrent.ScheduledExecutorService;\r\n+import java.util.concurrent.ScheduledFuture;\r\n+import java.util.concurrent.TimeUnit;\r\n+import java.util.concurrent.TimeoutException;\r\n+import java.util.concurrent.atomic.AtomicReference;\r\n+import java.util.function.Consumer;\r\n+\r\n+import static java.util.stream.Collectors.toList;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;\r\n+import static org.apache.dubbo.remoting.etcd.Constants.DEFAULT_KEEPALIVE_TIMEOUT;\r\n+import static org.apache.dubbo.remoting.etcd.Constants.DEFAULT_RECONNECT_PERIOD;\r\n+import static org.apache.dubbo.remoting.etcd.Constants.DEFAULT_RETRY_PERIOD;\r\n+import static org.apache.dubbo.remoting.etcd.Constants.HTTP_KEY;\r\n+import static org.apache.dubbo.remoting.etcd.Constants.HTTP_SUBFIX_KEY;\r\n+import static org.apache.dubbo.remoting.etcd.Constants.RETRY_PERIOD_KEY;\r\n+import static org.apache.dubbo.remoting.etcd.Constants.SESSION_TIMEOUT_KEY;\r\n+\r\n+public class JEtcdClientWrapper {\r\n+\r\n+    private Logger logger = LoggerFactory.getLogger(JEtcdClientWrapper.class);\r\n+\r\n+    private final URL url;\r\n+    private volatile Client client;\r\n+    private volatile boolean started = false;\r\n+    private volatile boolean connectState = false;\r\n+    private ScheduledFuture future;\r\n+    private ScheduledExecutorService reconnectNotify;\r\n+    private AtomicReference<ManagedChannel> channel;\r\n+\r\n+    private ConnectionStateListener connectionStateListener;\r\n+\r\n+    private long expirePeriod;\r\n+\r\n+    private CompletableFuture<Client> completableFuture;\r\n+\r\n+    private RetryPolicy retryPolicy;\r\n+\r\n+    private RuntimeException failed;\r\n+\r\n+    private final ScheduledFuture<?> retryFuture;\r\n+    private final ScheduledExecutorService retryExecutor = Executors.newScheduledThreadPool(1,\r\n+            new NamedThreadFactory(\"Etcd3RegistryKeepAliveFailedRetryTimer\", true));\r\n+\r\n+    private final Set<String> failedRegistered = new ConcurrentHashSet<String>();\r\n+\r\n+    private final Set<String> registeredPaths = new ConcurrentHashSet<>();\r\n+    private volatile CloseableClient keepAlive = null;\r\n+\r\n+    /**\r\n+     * Support temporary nodes to reuse the same lease\r\n+     */\r\n+    private volatile long globalLeaseId;\r\n+\r\n+    private volatile boolean cancelKeepAlive = false;\r\n+\r\n+    public static final Charset UTF_8 = StandardCharsets.UTF_8;\r\n+\r\n+    public JEtcdClientWrapper(URL url) {\r\n+        this.url = url;\r\n+        this.expirePeriod = url.getParameter(SESSION_TIMEOUT_KEY, DEFAULT_KEEPALIVE_TIMEOUT) / 1000;\r\n+        if (expirePeriod <= 0) {\r\n+            this.expirePeriod = DEFAULT_KEEPALIVE_TIMEOUT / 1000;\r\n+        }\r\n+        this.channel = new AtomicReference<>();\r\n+        this.completableFuture = CompletableFuture.supplyAsync(() -> prepareClient(url));\r\n+        this.reconnectNotify = Executors.newScheduledThreadPool(1,\r\n+                new NamedThreadFactory(\"reconnectNotify\", true));\r\n+        this.retryPolicy = new RetryNTimes(1, 1000, TimeUnit.MILLISECONDS);\r\n+\r\n+        this.failed = new IllegalStateException(\"Etcd3 registry is not connected yet, url:\" + url);\r\n+        int retryPeriod = url.getParameter(RETRY_PERIOD_KEY, DEFAULT_RETRY_PERIOD);\r\n+\r\n+        this.retryFuture = retryExecutor.scheduleWithFixedDelay(() -> {\r\n+            try {\r\n+                retry();\r\n+            } catch (Throwable t) {\r\n+                logger.error(\"Unexpected error occur at failed retry, cause: \" + t.getMessage(), t);\r\n+            }\r\n+        }, retryPeriod, retryPeriod, TimeUnit.MILLISECONDS);\r\n+    }\r\n+\r\n+    private Client prepareClient(URL url) {\r\n+\r\n+        int maxInboundSize = DEFAULT_INBOUND_SIZE;\r\n+        if (StringUtils.isNotEmpty(System.getProperty(GRPC_MAX_INBOUND_SIZE_KEY))) {\r\n+            maxInboundSize = Integer.valueOf(System.getProperty(GRPC_MAX_INBOUND_SIZE_KEY));\r\n+        }\r\n+\r\n+        // TODO, uses default pick-first round robin.\r\n+        ClientBuilder clientBuilder = Client.builder()\r\n+                .endpoints(endPoints(url.getBackupAddress()))\r\n+                .maxInboundMessageSize(maxInboundSize);\r\n+\r\n+        return clientBuilder.build();\r\n+    }\r\n+\r\n+    public Client getClient() {\r\n+        return client;\r\n+    }\r\n+\r\n+    /**\r\n+     * try to get current connected channel.\r\n+     *\r\n+     * @return connected channel.\r\n+     */\r\n+    public ManagedChannel getChannel() {\r\n+        if (channel.get() == null || (channel.get().isShutdown() || channel.get().isTerminated())) {\r\n+            channel.set(newChannel(client));\r\n+        }\r\n+        return channel.get();\r\n+    }\r\n+\r\n+    /**\r\n+     * find direct children directory, excluding path self,\r\n+     * Never return null.\r\n+     *\r\n+     * @param path the path to be found direct children.\r\n+     * @return direct children directory, contains zero element\r\n+     * list if children directory not exists.\r\n+     */\r\n+    public List<String> getChildren(String path) {\r\n+        try {\r\n+            return RetryLoops.invokeWithRetry(\r\n+                    () -> {\r\n+                        requiredNotNull(client, failed);\r\n+                        int len = path.length();\r\n+                        return client.getKVClient()\r\n+                                .get(ByteSequence.from(path, UTF_8),\r\n+                                        GetOption.newBuilder().withPrefix(ByteSequence.from(path, UTF_8)).build())\r\n+                                .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS)\r\n+                                .getKvs().stream().parallel()\r\n+                                .filter(pair -> {\r\n+                                    String key = pair.getKey().toString(UTF_8);\r\n+                                    int index = len, count = 0;\r\n+                                    if (key.length() > len) {\r\n+                                        for (; (index = key.indexOf(PATH_SEPARATOR, index)) != -1; ++index) {\r\n+                                            if (count++ > 1) {\r\n+                                                break;\r\n+                                            }\r\n+                                        }\r\n+                                    }\r\n+                                    return count == 1;\r\n+                                })\r\n+                                .map(pair -> pair.getKey().toString(UTF_8))\r\n+                                .collect(toList());\r\n+                    }, retryPolicy);\r\n+        } catch (Exception e) {\r\n+            throw new IllegalStateException(e.getMessage(), e);\r\n+        }\r\n+    }\r\n+\r\n+    public boolean isConnected() {\r\n+        return ConnectivityState.READY == (getChannel().getState(false))\r\n+                || ConnectivityState.IDLE == (getChannel().getState(false));\r\n+    }\r\n+\r\n+    public long createLease(long second) {\r\n+        try {\r\n+            return RetryLoops.invokeWithRetry(\r\n+                    () -> {\r\n+                        requiredNotNull(client, failed);\r\n+                        return client.getLeaseClient()\r\n+                                .grant(second)\r\n+                                .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS)\r\n+                                .getID();\r\n+                    }, retryPolicy);\r\n+        } catch (Exception e) {\r\n+            throw new IllegalStateException(e.getMessage(), e);\r\n+        }\r\n+    }\r\n+\r\n+    public void revokeLease(long lease) {\r\n+        try {\r\n+            RetryLoops.invokeWithRetry(\r\n+                    (Callable<Void>) () -> {\r\n+                        requiredNotNull(client, failed);\r\n+                        client.getLeaseClient()\r\n+                                .revoke(lease)\r\n+                                .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS);\r\n+                        return null;\r\n+                    }, retryPolicy);\r\n+        } catch (Exception e) {\r\n+            throw new IllegalStateException(e.getMessage(), e);\r\n+        }\r\n+    }\r\n+\r\n+    public long createLease(long ttl, long timeout, TimeUnit unit)\r\n+            throws InterruptedException, ExecutionException, TimeoutException {\r\n+\r\n+        if (timeout <= 0) {\r\n+            return createLease(ttl);\r\n+        }\r\n+\r\n+        requiredNotNull(client, failed);\r\n+        return client.getLeaseClient()\r\n+                .grant(ttl)\r\n+                .get(timeout, unit).getID();\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * try to check if path exists.\r\n+     */\r\n+    public boolean checkExists(String path) {\r\n+        try {\r\n+            return RetryLoops.invokeWithRetry(\r\n+                    () -> {\r\n+                        requiredNotNull(client, failed);\r\n+                        return client.getKVClient()\r\n+                                .get(ByteSequence.from(path, UTF_8), GetOption.newBuilder().withCountOnly(true).build())\r\n+                                .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS)\r\n+                                .getCount() > 0;\r\n+                    }, retryPolicy);\r\n+        } catch (Exception e) {\r\n+            throw new IllegalStateException(e.getMessage(), e);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * only internal use only, maybe change in the future\r\n+     */\r\n+    protected Long find(String path) {\r\n+        try {\r\n+            return RetryLoops.invokeWithRetry(\r\n+                    () -> {\r\n+                        requiredNotNull(client, failed);\r\n+                        return client.getKVClient()\r\n+                                .get(ByteSequence.from(path, UTF_8))\r\n+                                .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS)\r\n+                                .getKvs().stream()\r\n+                                .mapToLong(keyValue -> Long.valueOf(keyValue.getValue().toString(UTF_8)))\r\n+                                .findFirst().getAsLong();\r\n+                    }, retryPolicy);\r\n+        } catch (Exception e) {\r\n+            throw new IllegalStateException(e.getMessage(), e);\r\n+        }\r\n+    }\r\n+\r\n+    public void createPersistent(String path) {\r\n+        try {\r\n+            RetryLoops.invokeWithRetry(\r\n+                    (Callable<Void>) () -> {\r\n+                        requiredNotNull(client, failed);\r\n+                        client.getKVClient()\r\n+                                .put(ByteSequence.from(path, UTF_8),\r\n+                                        ByteSequence.from(String.valueOf(path.hashCode()), UTF_8))\r\n+                                .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS);\r\n+                        return null;\r\n+                    }, retryPolicy);\r\n+        } catch (Exception e) {\r\n+            throw new IllegalStateException(e.getMessage(), e);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * create new ephemeral path save to etcd .\r\n+     * if node disconnect from etcd, it will be deleted\r\n+     * automatically by etcd when session timeout.\r\n+     *\r\n+     * @param path the path to be saved\r\n+     * @return the lease of current path.\r\n+     */\r\n+    public long createEphemeral(String path) {\r\n+        try {\r\n+            return RetryLoops.invokeWithRetry(\r\n+                    () -> {\r\n+                        requiredNotNull(client, failed);\r\n+\r\n+                        registeredPaths.add(path);\r\n+                        keepAlive();\r\n+                        final long leaseId = globalLeaseId;\r\n+                        client.getKVClient()\r\n+                                .put(ByteSequence.from(path, UTF_8)\r\n+                                        , ByteSequence.from(String.valueOf(leaseId), UTF_8)\r\n+                                        , PutOption.newBuilder().withLeaseId(leaseId).build())\r\n+                                .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS);\r\n+                        return leaseId;\r\n+                    }, retryPolicy);\r\n+        } catch (Exception e) {\r\n+            throw new IllegalStateException(e.getMessage(), e);\r\n+        }\r\n+    }\r\n+\r\n+    // easy for mock\r\n+    public void keepAlive(long lease) {\r\n+        this.keepAlive(lease, null);\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    private <T> void keepAlive(long lease, Consumer<T> onFailed) {\r\n+        final StreamObserver<LeaseKeepAliveResponse> observer = new Observers.Builder()\r\n+                .onError((e) -> {\r\n+                    if (e instanceof EtcdException) {\r\n+                        EtcdException error = (EtcdException) e;\r\n+                        /**\r\n+                         * ttl has expired\r\n+                         */\r\n+                        if (error.getErrorCode() == ErrorCode.NOT_FOUND) {\r\n+                            keepAlive0(onFailed);\r\n+                        }\r\n+                    }\r\n+                }).onCompleted(() -> {\r\n+                    /**\r\n+                     * deadline reached.\r\n+                     */\r\n+                    keepAlive0(onFailed);\r\n+                }).build();\r\n+\r\n+        /**\r\n+         * If there is already a keepalive, cancel first\r\n+         */\r\n+        cancelKeepAlive();\r\n+\r\n+        /**\r\n+         * create and set new keepAlive to globalKeepAliveRef\r\n+         */\r\n+        this.keepAlive = client.getLeaseClient().keepAlive(lease, observer);\r\n+    }\r\n+\r\n+    private void keepAlive() throws Exception {\r\n+        if (keepAlive == null) {\r\n+            synchronized (this) {\r\n+                if (keepAlive == null) {\r\n+                    this.globalLeaseId = client.getLeaseClient()\r\n+                            .grant(expirePeriod)\r\n+                            .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS)\r\n+                            .getID();\r\n+                    /**\r\n+                     * If the keepAlive expires, the registration will be re-attempted\r\n+                     */\r\n+                    keepAlive(globalLeaseId, (NULL) -> recovery());\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private <T> void keepAlive0(Consumer<T> onFailed) {\r\n+        if (onFailed != null) {\r\n+\r\n+            /**\r\n+             * The following two scenarios will cause the keep-alive failure\uff1a\r\n+             *\r\n+             * 1. Service is offline\r\n+             * 2. Local deadline check expired\r\n+             *\r\n+             * The multiplex lease cannot update the local deadline,\r\n+             * causing the extreme scene service to be dropped.\r\n+             *\r\n+             */\r\n+            long leaseId = globalLeaseId;\r\n+            try {\r\n+                if (logger.isWarnEnabled()) {\r\n+                    logger.warn(\"Failed to keep alive for global lease '\" + leaseId + \"', waiting for retry again.\");\r\n+                }\r\n+                onFailed.accept(null);\r\n+            } catch (Exception ignored) {\r\n+                logger.warn(\"Failed to recover from global lease expired or lease deadline exceeded. lease '\" + leaseId + \"'\", ignored);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private void recovery() {\r\n+\r\n+        try {\r\n+            /**\r\n+             * The client is processing reconnection\r\n+             */\r\n+            if (cancelKeepAlive) {\r\n+                return;\r\n+            }\r\n+\r\n+            cancelKeepAlive();\r\n+\r\n+            Set<String> ephemeralPaths = new HashSet<String>(registeredPaths);\r\n+            if (!ephemeralPaths.isEmpty()) {\r\n+                for (String path : ephemeralPaths) {\r\n+                    try {\r\n+\r\n+                        /**\r\n+                         * The client is processing reconnection,\r\n+                         * cancel remaining service registration\r\n+                         */\r\n+                        if (cancelKeepAlive) {\r\n+                            return;\r\n+                        }\r\n+\r\n+                        createEphemeral(path);\r\n+                        failedRegistered.remove(path);\r\n+                    } catch (Exception e) {\r\n+\r\n+                        /**\r\n+                         * waiting for retry again\r\n+                         */\r\n+                        failedRegistered.add(path);\r\n+\r\n+                        Status status = Status.fromThrowable(e);\r\n+                        if (status.getCode() == Status.Code.NOT_FOUND) {\r\n+                            cancelKeepAlive();\r\n+                        }\r\n+                    }\r\n+                }\r\n+            }\r\n+        } catch (Throwable t) {\r\n+            logger.warn(\"Unexpected error, failed to recover from global lease expired or deadline exceeded.\", t);\r\n+        }\r\n+    }\r\n+\r\n+    public void delete(String path) {\r\n+        try {\r\n+            RetryLoops.invokeWithRetry(\r\n+                    (Callable<Void>) () -> {\r\n+                        requiredNotNull(client, failed);\r\n+                        client.getKVClient()\r\n+                                .delete(ByteSequence.from(path, UTF_8))\r\n+                                .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS);\r\n+                        registeredPaths.remove(path);\r\n+                        return null;\r\n+                    }, retryPolicy);\r\n+        } catch (Exception e) {\r\n+            throw new IllegalStateException(e.getMessage(), e);\r\n+        } finally {\r\n+            /**\r\n+             * Cancel retry\r\n+             */\r\n+            failedRegistered.remove(path);\r\n+        }\r\n+    }\r\n+\r\n+    public String[] endPoints(String backupAddress) {\r\n+        String[] endpoints = backupAddress.split(COMMA_SEPARATOR);\r\n+        List<String> addresses = Arrays.stream(endpoints)\r\n+                .map(address -> address.contains(HTTP_SUBFIX_KEY)\r\n+                        ? address\r\n+                        : HTTP_KEY + address)\r\n+                .collect(toList());\r\n+        Collections.shuffle(addresses);\r\n+        return addresses.toArray(new String[0]);\r\n+    }\r\n+\r\n+    /**\r\n+     * because jetcd's connection change callback not supported yet, we must\r\n+     * loop to test if connect or disconnect event happened or not. It will be changed\r\n+     * in the future if we found better choice.\r\n+     */\r\n+    public void start() {\r\n+        if (!started) {\r\n+            try {\r\n+                this.client = completableFuture.get(expirePeriod, TimeUnit.SECONDS);\r\n+                this.connectState = isConnected();\r\n+                this.started = true;\r\n+            } catch (Throwable t) {\r\n+                logger.error(\"Timeout! etcd3 server can not be connected in : \" + expirePeriod + \" seconds! url: \" + url, t);\r\n+\r\n+                completableFuture.whenComplete((c, e) -> {\r\n+                    this.client = c;\r\n+                    if (e != null) {\r\n+                        logger.error(\"Got an exception when trying to create etcd3 instance, can not connect to etcd3 server, url: \" + url, e);\r\n+                    }\r\n+                });\r\n+\r\n+            }\r\n+\r\n+            try {\r\n+                this.future = reconnectNotify.scheduleWithFixedDelay(() -> {\r\n+                    boolean connected = isConnected();\r\n+                    if (connectState != connected) {\r\n+                        int notifyState = connected ? StateListener.CONNECTED : StateListener.DISCONNECTED;\r\n+                        if (connectionStateListener != null) {\r\n+                            try {\r\n+                                if (connected) {\r\n+                                    clearKeepAlive();\r\n+                                }\r\n+                                connectionStateListener.stateChanged(getClient(), notifyState);\r\n+                            } finally {\r\n+                                cancelKeepAlive = false;\r\n+                            }\r\n+                        }\r\n+                        connectState = connected;\r\n+                    }\r\n+                }, DEFAULT_RECONNECT_PERIOD, DEFAULT_RECONNECT_PERIOD, TimeUnit.MILLISECONDS);\r\n+            } catch (Throwable t) {\r\n+                logger.error(\"monitor reconnect status failed.\", t);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private void cancelKeepAlive() {\r\n+        try {\r\n+            if (keepAlive != null) {\r\n+                keepAlive.close();\r\n+            }\r\n+        } finally {\r\n+            // help for gc\r\n+            keepAlive = null;\r\n+        }\r\n+    }\r\n+\r\n+    private void clearKeepAlive() {\r\n+        cancelKeepAlive = true;\r\n+        failedRegistered.clear();\r\n+        cancelKeepAlive();\r\n+    }\r\n+\r\n+    protected void doClose() {\r\n+\r\n+        try {\r\n+            cancelKeepAlive = true;\r\n+            if (globalLeaseId != 0) {\r\n+                revokeLease(this.globalLeaseId);\r\n+            }\r\n+        } catch (Exception e) {\r\n+            logger.warn(\"revoke global lease '\" + globalLeaseId + \"' failed, registry: \" + url, e);\r\n+        }\r\n+\r\n+        try {\r\n+            if (started && future != null) {\r\n+                started = false;\r\n+                future.cancel(true);\r\n+                reconnectNotify.shutdownNow();\r\n+            }\r\n+        } catch (Exception e) {\r\n+            logger.warn(\"stop reconnect Notify failed, registry: \" + url, e);\r\n+        }\r\n+\r\n+        try {\r\n+            retryFuture.cancel(true);\r\n+            retryExecutor.shutdownNow();\r\n+        } catch (Throwable t) {\r\n+            logger.warn(t.getMessage(), t);\r\n+        }\r\n+\r\n+        if (getClient() != null) {\r\n+            getClient().close();\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * try get client's shared channel, because all fields is private on jetcd,\r\n+     * we must using it by reflect, in the future, jetcd may provider better tools.\r\n+     *\r\n+     * @param client get channel from current client\r\n+     * @return current connection channel\r\n+     */\r\n+    private ManagedChannel newChannel(Client client) {\r\n+        try {\r\n+            Field connectionField = client.getClass().getDeclaredField(\"connectionManager\");\r\n+            ReflectUtils.makeAccessible(connectionField);\r\n+            Object connection = connectionField.get(client);\r\n+            Method channel = connection.getClass().getDeclaredMethod(\"getChannel\");\r\n+            ReflectUtils.makeAccessible(channel);\r\n+            return (ManagedChannel) channel.invoke(connection);\r\n+        } catch (Exception e) {\r\n+            throw new RuntimeException(\"Failed to obtain connection channel from \" + url.getBackupAddress(), e);\r\n+        }\r\n+    }\r\n+\r\n+    public ConnectionStateListener getConnectionStateListener() {\r\n+        return connectionStateListener;\r\n+    }\r\n+\r\n+    public void setConnectionStateListener(ConnectionStateListener connectionStateListener) {\r\n+        this.connectionStateListener = connectionStateListener;\r\n+    }\r\n+\r\n+    public static void requiredNotNull(Object obj, RuntimeException exception) {\r\n+        if (obj == null) {\r\n+            throw exception;\r\n+        }\r\n+    }\r\n+\r\n+    public String getKVValue(String key) {\r\n+        if (null == key) {\r\n+            return null;\r\n+        }\r\n+\r\n+        CompletableFuture<GetResponse> responseFuture = this.client.getKVClient().get(ByteSequence.from(key, UTF_8));\r\n+\r\n+        try {\r\n+            List<KeyValue> result = responseFuture.get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS).getKvs();\r\n+            if (!result.isEmpty()) {\r\n+                return result.get(0).getValue().toString(UTF_8);\r\n+            }\r\n+        } catch (Exception e) {\r\n+            // ignore\r\n+        }\r\n+\r\n+        return null;\r\n+    }\r\n+\r\n+\r\n+    public boolean put(String key, String value) {\r\n+        if (key == null || value == null) {\r\n+            return false;\r\n+        }\r\n+        CompletableFuture<PutResponse> putFuture =\r\n+                this.client.getKVClient().put(ByteSequence.from(key, UTF_8), ByteSequence.from(value, UTF_8));\r\n+        try {\r\n+            putFuture.get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS);\r\n+            return true;\r\n+        } catch (Exception e) {\r\n+            // ignore\r\n+        }\r\n+        return false;\r\n+    }\r\n+\r\n+    public boolean putEphemeral(final String key, String value) {\r\n+        try {\r\n+            return RetryLoops.invokeWithRetry(\r\n+                    () -> {\r\n+                        requiredNotNull(client, failed);\r\n+                        // recovery an retry\r\n+                        keepAlive();\r\n+                        final long leaseId = globalLeaseId;\r\n+                        client.getKVClient()\r\n+                                .put(ByteSequence.from(key, UTF_8)\r\n+                                        , ByteSequence.from(String.valueOf(value), UTF_8)\r\n+                                        , PutOption.newBuilder().withLeaseId(leaseId).build())\r\n+                                .get(DEFAULT_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS);\r\n+                        return true;\r\n+                    }, retryPolicy);\r\n+        } catch (Exception e) {\r\n+            throw new IllegalStateException(e.getMessage(), e);\r\n+        }\r\n+    }\r\n+\r\n+    private void retry() {\r\n+        if (!failedRegistered.isEmpty()) {\r\n+            Set<String> failed = new HashSet<String>(failedRegistered);\r\n+            if (!failed.isEmpty()) {\r\n+\r\n+                if (cancelKeepAlive) {\r\n+                    return;\r\n+                }\r\n+\r\n+                if (logger.isWarnEnabled()) {\r\n+                    logger.warn(\"Retry failed register(keep alive) for path '\" + failed\r\n+                            + \"', path size: \" + failed.size());\r\n+                }\r\n+                try {\r\n+                    for (String path : failed) {\r\n+                        try {\r\n+\r\n+                            /**\r\n+                             * Is it currently reconnecting ?\r\n+                             */\r\n+                            if (cancelKeepAlive) {\r\n+                                return;\r\n+                            }\r\n+\r\n+                            createEphemeral(path);\r\n+                            failedRegistered.remove(path);\r\n+                        } catch (Throwable e) {\r\n+\r\n+                            failedRegistered.add(path);\r\n+\r\n+                            Status status = Status.fromThrowable(e);\r\n+                            if (status.getCode() == Status.Code.NOT_FOUND) {\r\n+                                cancelKeepAlive();\r\n+                            }\r\n+\r\n+                            logger.warn(\"Failed to retry register(keep alive) for path '\" + path + \"', waiting for again, cause: \" + e.getMessage(), e);\r\n+                        }\r\n+                    }\r\n+                } catch (Throwable t) {\r\n+                    logger.warn(\"Failed to retry register(keep alive) for path '\" + failed + \"', waiting for again, cause: \" + t.getMessage(), t);\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * default request timeout\r\n+     */\r\n+    public static final long DEFAULT_REQUEST_TIMEOUT = obtainRequestTimeout();\r\n+\r\n+    public static final int DEFAULT_INBOUND_SIZE = 100 * 1024 * 1024;\r\n+\r\n+    public static final String GRPC_MAX_INBOUND_SIZE_KEY = \"grpc.max.inbound.size\";\r\n+\r\n+    public static final String ETCD_REQUEST_TIMEOUT_KEY = \"etcd.request.timeout\";\r\n+\r\n+    private static int obtainRequestTimeout() {\r\n+        if (StringUtils.isNotEmpty(System.getProperty(ETCD_REQUEST_TIMEOUT_KEY))) {\r\n+            return Integer.valueOf(System.getProperty(ETCD_REQUEST_TIMEOUT_KEY));\r\n+        }\r\n+        /**\r\n+         * 10 seconds.\r\n+         */\r\n+        return 10 * 1000;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/remoting/etcd/jetcd/JEtcdTransporter.java", "source2": "org/apache/dubbo/remoting/etcd/jetcd/JEtcdTransporter.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,30 +1,30 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\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-package org.apache.dubbo.remoting.etcd.jetcd;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.remoting.etcd.EtcdClient;\n-import org.apache.dubbo.remoting.etcd.EtcdTransporter;\n-\n-public class JEtcdTransporter implements EtcdTransporter {\n-\n-    @Override\n-    public EtcdClient connect(URL url) {\n-        return new JEtcdClient(url);\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.remoting.etcd.jetcd;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.remoting.etcd.EtcdClient;\r\n+import org.apache.dubbo.remoting.etcd.EtcdTransporter;\r\n+\r\n+public class JEtcdTransporter implements EtcdTransporter {\r\n+\r\n+    @Override\r\n+    public EtcdClient connect(URL url) {\r\n+        return new JEtcdClient(url);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/remoting/etcd/jetcd/RetryLoops.java", "source2": "org/apache/dubbo/remoting/etcd/jetcd/RetryLoops.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,99 +1,99 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\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-\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\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-package org.apache.dubbo.remoting.etcd.jetcd;\n-\n-import io.grpc.Status;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.remoting.etcd.RetryPolicy;\n-import org.apache.dubbo.remoting.etcd.option.OptionUtil;\n-\n-import java.util.concurrent.Callable;\n-\n-public class RetryLoops {\n-\n-    private final long startTimeMs = System.currentTimeMillis();\n-    private boolean isDone = false;\n-    private int retriedCount = 0;\n-    private Logger logger = LoggerFactory.getLogger(RetryLoops.class);\n-\n-    public static <R> R invokeWithRetry(Callable<R> task, RetryPolicy retryPolicy) throws Exception {\n-        R result = null;\n-        RetryLoops retryLoop = new RetryLoops();\n-        while (retryLoop.shouldContinue()) {\n-            try {\n-                result = task.call();\n-                retryLoop.complete();\n-            } catch (Exception e) {\n-                retryLoop.fireException(e, retryPolicy);\n-            }\n-        }\n-        return result;\n-    }\n-\n-    public void fireException(Exception e, RetryPolicy retryPolicy) throws Exception {\n-\n-        if (e instanceof InterruptedException) {\n-            Thread.currentThread().interrupt();\n-        }\n-\n-        boolean rethrow = true;\n-        if (isRetryException(e)\n-                && retryPolicy.shouldRetry(retriedCount++, System.currentTimeMillis() - startTimeMs, true)) {\n-            rethrow = false;\n-        }\n-\n-        if (rethrow) {\n-            throw e;\n-        }\n-    }\n-\n-    private boolean isRetryException(Throwable e) {\n-        Status status = Status.fromThrowable(e);\n-        if (OptionUtil.isRecoverable(status)) {\n-            return true;\n-        }\n-\n-        return false;\n-    }\n-\n-    public boolean shouldContinue() {\n-        return !isDone;\n-    }\n-\n-    public void complete() {\n-        isDone = true;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.remoting.etcd.jetcd;\r\n+\r\n+import io.grpc.Status;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.remoting.etcd.RetryPolicy;\r\n+import org.apache.dubbo.remoting.etcd.option.OptionUtil;\r\n+\r\n+import java.util.concurrent.Callable;\r\n+\r\n+public class RetryLoops {\r\n+\r\n+    private final long startTimeMs = System.currentTimeMillis();\r\n+    private boolean isDone = false;\r\n+    private int retriedCount = 0;\r\n+    private Logger logger = LoggerFactory.getLogger(RetryLoops.class);\r\n+\r\n+    public static <R> R invokeWithRetry(Callable<R> task, RetryPolicy retryPolicy) throws Exception {\r\n+        R result = null;\r\n+        RetryLoops retryLoop = new RetryLoops();\r\n+        while (retryLoop.shouldContinue()) {\r\n+            try {\r\n+                result = task.call();\r\n+                retryLoop.complete();\r\n+            } catch (Exception e) {\r\n+                retryLoop.fireException(e, retryPolicy);\r\n+            }\r\n+        }\r\n+        return result;\r\n+    }\r\n+\r\n+    public void fireException(Exception e, RetryPolicy retryPolicy) throws Exception {\r\n+\r\n+        if (e instanceof InterruptedException) {\r\n+            Thread.currentThread().interrupt();\r\n+        }\r\n+\r\n+        boolean rethrow = true;\r\n+        if (isRetryException(e)\r\n+                && retryPolicy.shouldRetry(retriedCount++, System.currentTimeMillis() - startTimeMs, true)) {\r\n+            rethrow = false;\r\n+        }\r\n+\r\n+        if (rethrow) {\r\n+            throw e;\r\n+        }\r\n+    }\r\n+\r\n+    private boolean isRetryException(Throwable e) {\r\n+        Status status = Status.fromThrowable(e);\r\n+        if (OptionUtil.isRecoverable(status)) {\r\n+            return true;\r\n+        }\r\n+\r\n+        return false;\r\n+    }\r\n+\r\n+    public boolean shouldContinue() {\r\n+        return !isDone;\r\n+    }\r\n+\r\n+    public void complete() {\r\n+        isDone = true;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/remoting/etcd/option/OptionUtil.java", "source2": "org/apache/dubbo/remoting/etcd/option/OptionUtil.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,78 +1,78 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\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-package org.apache.dubbo.remoting.etcd.option;\n-\n-import io.etcd.jetcd.ByteSequence;\n-import io.grpc.Status;\n-import io.netty.handler.codec.http2.Http2Exception;\n-\n-import java.util.Arrays;\n-\n-public class OptionUtil {\n-\n-    public static final byte[] NO_PREFIX_END = {0};\n-\n-    public static final ByteSequence prefixEndOf(ByteSequence prefix) {\n-        byte[] endKey = prefix.getBytes().clone();\n-        for (int i = endKey.length - 1; i >= 0; i--) {\n-            if (endKey[i] < 0xff) {\n-                endKey[i] = (byte) (endKey[i] + 1);\n-                return ByteSequence.from(Arrays.copyOf(endKey, i + 1));\n-            }\n-        }\n-\n-        return ByteSequence.from(NO_PREFIX_END);\n-    }\n-\n-    public static boolean isRecoverable(Status status) {\n-        return isHaltError(status)\n-                || isNoLeaderError(status)\n-                // ephemeral is expired\n-                || status.getCode() == Status.Code.NOT_FOUND;\n-    }\n-\n-    public static boolean isHaltError(Status status) {\n-        // Unavailable codes mean the system will be right back.\n-        // (e.g., can't connect, lost leader)\n-        // Treat Internal codes as if something failed, leaving the\n-        // system in an inconsistent state, but retrying could make progress.\n-        // (e.g., failed in middle of send, corrupted frame)\n-        return status.getCode() != Status.Code.UNAVAILABLE && status.getCode() != Status.Code.INTERNAL;\n-    }\n-\n-    public static boolean isNoLeaderError(Status status) {\n-        return status.getCode() == Status.Code.UNAVAILABLE\n-                && \"etcdserver: no leader\".equals(status.getDescription());\n-    }\n-\n-    public static boolean isProtocolError(Throwable e) {\n-        if (e == null) {\n-            return false;\n-        }\n-        Throwable cause = e.getCause();\n-        while (cause != null) {\n-            if (cause instanceof Http2Exception) {\n-                Http2Exception t = (Http2Exception) cause;\n-                if (\"PROTOCOL_ERROR\".equals(t.error().name())) {\n-                    return true;\n-                }\n-            }\n-            cause = cause.getCause();\n-        }\n-        return false;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.remoting.etcd.option;\r\n+\r\n+import io.etcd.jetcd.ByteSequence;\r\n+import io.grpc.Status;\r\n+import io.netty.handler.codec.http2.Http2Exception;\r\n+\r\n+import java.util.Arrays;\r\n+\r\n+public class OptionUtil {\r\n+\r\n+    public static final byte[] NO_PREFIX_END = {0};\r\n+\r\n+    public static final ByteSequence prefixEndOf(ByteSequence prefix) {\r\n+        byte[] endKey = prefix.getBytes().clone();\r\n+        for (int i = endKey.length - 1; i >= 0; i--) {\r\n+            if (endKey[i] < 0xff) {\r\n+                endKey[i] = (byte) (endKey[i] + 1);\r\n+                return ByteSequence.from(Arrays.copyOf(endKey, i + 1));\r\n+            }\r\n+        }\r\n+\r\n+        return ByteSequence.from(NO_PREFIX_END);\r\n+    }\r\n+\r\n+    public static boolean isRecoverable(Status status) {\r\n+        return isHaltError(status)\r\n+                || isNoLeaderError(status)\r\n+                // ephemeral is expired\r\n+                || status.getCode() == Status.Code.NOT_FOUND;\r\n+    }\r\n+\r\n+    public static boolean isHaltError(Status status) {\r\n+        // Unavailable codes mean the system will be right back.\r\n+        // (e.g., can't connect, lost leader)\r\n+        // Treat Internal codes as if something failed, leaving the\r\n+        // system in an inconsistent state, but retrying could make progress.\r\n+        // (e.g., failed in middle of send, corrupted frame)\r\n+        return status.getCode() != Status.Code.UNAVAILABLE && status.getCode() != Status.Code.INTERNAL;\r\n+    }\r\n+\r\n+    public static boolean isNoLeaderError(Status status) {\r\n+        return status.getCode() == Status.Code.UNAVAILABLE\r\n+                && \"etcdserver: no leader\".equals(status.getDescription());\r\n+    }\r\n+\r\n+    public static boolean isProtocolError(Throwable e) {\r\n+        if (e == null) {\r\n+            return false;\r\n+        }\r\n+        Throwable cause = e.getCause();\r\n+        while (cause != null) {\r\n+            if (cause instanceof Http2Exception) {\r\n+                Http2Exception t = (Http2Exception) cause;\r\n+                if (\"PROTOCOL_ERROR\".equals(t.error().name())) {\r\n+                    return true;\r\n+                }\r\n+            }\r\n+            cause = cause.getCause();\r\n+        }\r\n+        return false;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/remoting/etcd/support/AbstractEtcdClient.java", "source2": "org/apache/dubbo/remoting/etcd/support/AbstractEtcdClient.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,194 +1,194 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\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-\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\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-package org.apache.dubbo.remoting.etcd.support;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.ConcurrentHashSet;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.remoting.etcd.ChildListener;\n-import org.apache.dubbo.remoting.etcd.EtcdClient;\n-import org.apache.dubbo.remoting.etcd.StateListener;\n-\n-import java.util.Arrays;\n-import java.util.List;\n-import java.util.Set;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;\n-import static org.apache.dubbo.remoting.etcd.Constants.CONFIGURATORS_CATEGORY;\n-import static org.apache.dubbo.remoting.etcd.Constants.CONSUMERS_CATEGORY;\n-import static org.apache.dubbo.remoting.etcd.Constants.PROVIDERS_CATEGORY;\n-import static org.apache.dubbo.remoting.etcd.Constants.ROUTERS_CATEGORY;\n-\n-public abstract class AbstractEtcdClient<WatcherListener> implements EtcdClient {\n-\n-    protected static final Logger logger = LoggerFactory.getLogger(AbstractEtcdClient.class);\n-\n-    private final URL url;\n-\n-    private final Set<StateListener> stateListeners = new ConcurrentHashSet<>();\n-\n-    private final ConcurrentMap<String, ConcurrentMap<ChildListener, WatcherListener>> childListeners = new ConcurrentHashMap<>();\n-    private final List<String> categories = Arrays.asList(PROVIDERS_CATEGORY, CONSUMERS_CATEGORY, ROUTERS_CATEGORY,\n-            CONFIGURATORS_CATEGORY);\n-    private volatile boolean closed = false;\n-\n-    public AbstractEtcdClient(URL url) {\n-        this.url = url;\n-    }\n-\n-    @Override\n-    public URL getUrl() {\n-        return url;\n-    }\n-\n-    @Override\n-    public void create(String path) {\n-        String fixedPath = fixNamespace(path);\n-        createParentIfAbsent(fixedPath);\n-        doCreatePersistent(fixedPath);\n-    }\n-\n-    @Override\n-    public long createEphemeral(String path) {\n-        String fixedPath = fixNamespace(path);\n-        createParentIfAbsent(fixedPath);\n-        return doCreateEphemeral(path);\n-    }\n-\n-    @Override\n-    public void addStateListener(StateListener listener) {\n-        stateListeners.add(listener);\n-    }\n-\n-    @Override\n-    public void removeStateListener(StateListener listener) {\n-        stateListeners.remove(listener);\n-    }\n-\n-    public Set<StateListener> getSessionListeners() {\n-        return stateListeners;\n-    }\n-\n-    @Override\n-    public List<String> addChildListener(String path, final ChildListener listener) {\n-        ConcurrentMap<ChildListener, WatcherListener> listeners = childListeners.computeIfAbsent(path, k -> new ConcurrentHashMap<>());\n-        WatcherListener targetListener = listeners.computeIfAbsent(listener, k -> createChildWatcherListener(path, k));\n-        return addChildWatcherListener(path, targetListener);\n-    }\n-\n-    @Override\n-    public WatcherListener getChildListener(String path, ChildListener listener) {\n-        ConcurrentMap<ChildListener, WatcherListener> listeners = childListeners.get(path);\n-        if (listeners == null) {\n-            return null;\n-        }\n-        return listeners.computeIfAbsent(listener, k -> createChildWatcherListener(path, k));\n-    }\n-\n-    @Override\n-    public void removeChildListener(String path, ChildListener listener) {\n-        ConcurrentMap<ChildListener, WatcherListener> listeners = childListeners.get(path);\n-        if (listeners != null) {\n-            WatcherListener targetListener = listeners.remove(listener);\n-            if (targetListener != null) {\n-                removeChildWatcherListener(path, targetListener);\n-            }\n-        }\n-    }\n-\n-    protected void stateChanged(int state) {\n-        for (StateListener sessionListener : getSessionListeners()) {\n-            sessionListener.stateChanged(state);\n-        }\n-    }\n-\n-    protected String fixNamespace(String path) {\n-        if (StringUtils.isEmpty(path)) {\n-            throw new IllegalArgumentException(\"path is required, actual null or ''\");\n-        }\n-        return (path.charAt(0) != '/') ? (PATH_SEPARATOR + path) : path;\n-    }\n-\n-    protected void createParentIfAbsent(String fixedPath) {\n-        int i = fixedPath.lastIndexOf('/');\n-        if (i > 0) {\n-            String parentPath = fixedPath.substring(0, i);\n-            if (categories.stream().anyMatch(c -> fixedPath.endsWith(c))) {\n-                if (!checkExists(parentPath)) {\n-                    this.doCreatePersistent(parentPath);\n-                }\n-            } else if (categories.stream().anyMatch(c -> parentPath.endsWith(c))) {\n-                String grandfather = parentPath.substring(0, parentPath.lastIndexOf('/'));\n-                if (!checkExists(grandfather)) {\n-                    this.doCreatePersistent(grandfather);\n-                }\n-            }\n-        }\n-    }\n-\n-    @Override\n-    public void close() {\n-        if (closed) {\n-            return;\n-        }\n-        closed = true;\n-        try {\n-            doClose();\n-        } catch (Throwable t) {\n-            logger.warn(t.getMessage(), t);\n-        }\n-    }\n-\n-    public abstract void doClose();\n-\n-    public abstract void doCreatePersistent(String path);\n-\n-    public abstract long doCreateEphemeral(String path);\n-\n-    @Override\n-    public abstract void delete(String path);\n-\n-    public abstract boolean checkExists(String path);\n-\n-    public abstract WatcherListener createChildWatcherListener(String path, ChildListener listener);\n-\n-    public abstract List<String> addChildWatcherListener(String path, WatcherListener listener);\n-\n-    public abstract void removeChildWatcherListener(String path, WatcherListener listener);\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.remoting.etcd.support;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.ConcurrentHashSet;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.remoting.etcd.ChildListener;\r\n+import org.apache.dubbo.remoting.etcd.EtcdClient;\r\n+import org.apache.dubbo.remoting.etcd.StateListener;\r\n+\r\n+import java.util.Arrays;\r\n+import java.util.List;\r\n+import java.util.Set;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;\r\n+import static org.apache.dubbo.remoting.etcd.Constants.CONFIGURATORS_CATEGORY;\r\n+import static org.apache.dubbo.remoting.etcd.Constants.CONSUMERS_CATEGORY;\r\n+import static org.apache.dubbo.remoting.etcd.Constants.PROVIDERS_CATEGORY;\r\n+import static org.apache.dubbo.remoting.etcd.Constants.ROUTERS_CATEGORY;\r\n+\r\n+public abstract class AbstractEtcdClient<WatcherListener> implements EtcdClient {\r\n+\r\n+    protected static final Logger logger = LoggerFactory.getLogger(AbstractEtcdClient.class);\r\n+\r\n+    private final URL url;\r\n+\r\n+    private final Set<StateListener> stateListeners = new ConcurrentHashSet<>();\r\n+\r\n+    private final ConcurrentMap<String, ConcurrentMap<ChildListener, WatcherListener>> childListeners = new ConcurrentHashMap<>();\r\n+    private final List<String> categories = Arrays.asList(PROVIDERS_CATEGORY, CONSUMERS_CATEGORY, ROUTERS_CATEGORY,\r\n+            CONFIGURATORS_CATEGORY);\r\n+    private volatile boolean closed = false;\r\n+\r\n+    public AbstractEtcdClient(URL url) {\r\n+        this.url = url;\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getUrl() {\r\n+        return url;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void create(String path) {\r\n+        String fixedPath = fixNamespace(path);\r\n+        createParentIfAbsent(fixedPath);\r\n+        doCreatePersistent(fixedPath);\r\n+    }\r\n+\r\n+    @Override\r\n+    public long createEphemeral(String path) {\r\n+        String fixedPath = fixNamespace(path);\r\n+        createParentIfAbsent(fixedPath);\r\n+        return doCreateEphemeral(path);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void addStateListener(StateListener listener) {\r\n+        stateListeners.add(listener);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void removeStateListener(StateListener listener) {\r\n+        stateListeners.remove(listener);\r\n+    }\r\n+\r\n+    public Set<StateListener> getSessionListeners() {\r\n+        return stateListeners;\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<String> addChildListener(String path, final ChildListener listener) {\r\n+        ConcurrentMap<ChildListener, WatcherListener> listeners = childListeners.computeIfAbsent(path, k -> new ConcurrentHashMap<>());\r\n+        WatcherListener targetListener = listeners.computeIfAbsent(listener, k -> createChildWatcherListener(path, k));\r\n+        return addChildWatcherListener(path, targetListener);\r\n+    }\r\n+\r\n+    @Override\r\n+    public WatcherListener getChildListener(String path, ChildListener listener) {\r\n+        ConcurrentMap<ChildListener, WatcherListener> listeners = childListeners.get(path);\r\n+        if (listeners == null) {\r\n+            return null;\r\n+        }\r\n+        return listeners.computeIfAbsent(listener, k -> createChildWatcherListener(path, k));\r\n+    }\r\n+\r\n+    @Override\r\n+    public void removeChildListener(String path, ChildListener listener) {\r\n+        ConcurrentMap<ChildListener, WatcherListener> listeners = childListeners.get(path);\r\n+        if (listeners != null) {\r\n+            WatcherListener targetListener = listeners.remove(listener);\r\n+            if (targetListener != null) {\r\n+                removeChildWatcherListener(path, targetListener);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    protected void stateChanged(int state) {\r\n+        for (StateListener sessionListener : getSessionListeners()) {\r\n+            sessionListener.stateChanged(state);\r\n+        }\r\n+    }\r\n+\r\n+    protected String fixNamespace(String path) {\r\n+        if (StringUtils.isEmpty(path)) {\r\n+            throw new IllegalArgumentException(\"path is required, actual null or ''\");\r\n+        }\r\n+        return (path.charAt(0) != '/') ? (PATH_SEPARATOR + path) : path;\r\n+    }\r\n+\r\n+    protected void createParentIfAbsent(String fixedPath) {\r\n+        int i = fixedPath.lastIndexOf('/');\r\n+        if (i > 0) {\r\n+            String parentPath = fixedPath.substring(0, i);\r\n+            if (categories.stream().anyMatch(c -> fixedPath.endsWith(c))) {\r\n+                if (!checkExists(parentPath)) {\r\n+                    this.doCreatePersistent(parentPath);\r\n+                }\r\n+            } else if (categories.stream().anyMatch(c -> parentPath.endsWith(c))) {\r\n+                String grandfather = parentPath.substring(0, parentPath.lastIndexOf('/'));\r\n+                if (!checkExists(grandfather)) {\r\n+                    this.doCreatePersistent(grandfather);\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void close() {\r\n+        if (closed) {\r\n+            return;\r\n+        }\r\n+        closed = true;\r\n+        try {\r\n+            doClose();\r\n+        } catch (Throwable t) {\r\n+            logger.warn(t.getMessage(), t);\r\n+        }\r\n+    }\r\n+\r\n+    public abstract void doClose();\r\n+\r\n+    public abstract void doCreatePersistent(String path);\r\n+\r\n+    public abstract long doCreateEphemeral(String path);\r\n+\r\n+    @Override\r\n+    public abstract void delete(String path);\r\n+\r\n+    public abstract boolean checkExists(String path);\r\n+\r\n+    public abstract WatcherListener createChildWatcherListener(String path, ChildListener listener);\r\n+\r\n+    public abstract List<String> addChildWatcherListener(String path, WatcherListener listener);\r\n+\r\n+    public abstract void removeChildWatcherListener(String path, WatcherListener listener);\r\n+\r\n+}\r\n"}]}
