wangzhibo
2023-10-31 86070cd00485c47a2c5c3ffa4a9bae6648dd05c6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
/**
 * table-core
 *
 * Copyright (c) TanStack
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE.md file in the root directory of this source tree.
 *
 * @license MIT
 */
// Is this type a tuple?
 
// If this type is a tuple, what indices are allowed?
 
///
 
function functionalUpdate(updater, input) {
  return typeof updater === 'function' ? updater(input) : updater;
}
function noop() {
  //
}
function makeStateUpdater(key, instance) {
  return updater => {
    instance.setState(old => {
      return {
        ...old,
        [key]: functionalUpdate(updater, old[key])
      };
    });
  };
}
function isFunction(d) {
  return d instanceof Function;
}
function isNumberArray(d) {
  return Array.isArray(d) && d.every(val => typeof val === 'number');
}
function flattenBy(arr, getChildren) {
  const flat = [];
  const recurse = subArr => {
    subArr.forEach(item => {
      flat.push(item);
      const children = getChildren(item);
      if (children != null && children.length) {
        recurse(children);
      }
    });
  };
  recurse(arr);
  return flat;
}
function memo(getDeps, fn, opts) {
  let deps = [];
  let result;
  return () => {
    let depTime;
    if (opts.key && opts.debug) depTime = Date.now();
    const newDeps = getDeps();
    const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);
    if (!depsChanged) {
      return result;
    }
    deps = newDeps;
    let resultTime;
    if (opts.key && opts.debug) resultTime = Date.now();
    result = fn(...newDeps);
    opts == null || opts.onChange == null || opts.onChange(result);
    if (opts.key && opts.debug) {
      if (opts != null && opts.debug()) {
        const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;
        const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;
        const resultFpsPercentage = resultEndTime / 16;
        const pad = (str, num) => {
          str = String(str);
          while (str.length < num) {
            str = ' ' + str;
          }
          return str;
        };
        console.info(`%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`, `
            font-size: .6rem;
            font-weight: bold;
            color: hsl(${Math.max(0, Math.min(120 - 120 * resultFpsPercentage, 120))}deg 100% 31%);`, opts == null ? void 0 : opts.key);
      }
    }
    return result;
  };
}
 
function createColumn(table, columnDef, depth, parent) {
  var _ref, _resolvedColumnDef$id;
  const defaultColumn = table._getDefaultColumnDef();
  const resolvedColumnDef = {
    ...defaultColumn,
    ...columnDef
  };
  const accessorKey = resolvedColumnDef.accessorKey;
  let id = (_ref = (_resolvedColumnDef$id = resolvedColumnDef.id) != null ? _resolvedColumnDef$id : accessorKey ? accessorKey.replace('.', '_') : undefined) != null ? _ref : typeof resolvedColumnDef.header === 'string' ? resolvedColumnDef.header : undefined;
  let accessorFn;
  if (resolvedColumnDef.accessorFn) {
    accessorFn = resolvedColumnDef.accessorFn;
  } else if (accessorKey) {
    // Support deep accessor keys
    if (accessorKey.includes('.')) {
      accessorFn = originalRow => {
        let result = originalRow;
        for (const key of accessorKey.split('.')) {
          var _result;
          result = (_result = result) == null ? void 0 : _result[key];
          if ("development" !== 'production' && result === undefined) {
            console.warn(`"${key}" in deeply nested key "${accessorKey}" returned undefined.`);
          }
        }
        return result;
      };
    } else {
      accessorFn = originalRow => originalRow[resolvedColumnDef.accessorKey];
    }
  }
  if (!id) {
    if ("development" !== 'production') {
      throw new Error(resolvedColumnDef.accessorFn ? `Columns require an id when using an accessorFn` : `Columns require an id when using a non-string header`);
    }
    throw new Error();
  }
  let column = {
    id: `${String(id)}`,
    accessorFn,
    parent: parent,
    depth,
    columnDef: resolvedColumnDef,
    columns: [],
    getFlatColumns: memo(() => [true], () => {
      var _column$columns;
      return [column, ...((_column$columns = column.columns) == null ? void 0 : _column$columns.flatMap(d => d.getFlatColumns()))];
    }, {
      key: "development" === 'production' && 'column.getFlatColumns',
      debug: () => {
        var _table$options$debugA;
        return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugColumns;
      }
    }),
    getLeafColumns: memo(() => [table._getOrderColumnsFn()], orderColumns => {
      var _column$columns2;
      if ((_column$columns2 = column.columns) != null && _column$columns2.length) {
        let leafColumns = column.columns.flatMap(column => column.getLeafColumns());
        return orderColumns(leafColumns);
      }
      return [column];
    }, {
      key: "development" === 'production' && 'column.getLeafColumns',
      debug: () => {
        var _table$options$debugA2;
        return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugColumns;
      }
    })
  };
  for (const feature of table._features) {
    feature.createColumn == null || feature.createColumn(column, table);
  }
 
  // Yes, we have to convert table to uknown, because we know more than the compiler here.
  return column;
}
 
//
 
function createHeader(table, column, options) {
  var _options$id;
  const id = (_options$id = options.id) != null ? _options$id : column.id;
  let header = {
    id,
    column,
    index: options.index,
    isPlaceholder: !!options.isPlaceholder,
    placeholderId: options.placeholderId,
    depth: options.depth,
    subHeaders: [],
    colSpan: 0,
    rowSpan: 0,
    headerGroup: null,
    getLeafHeaders: () => {
      const leafHeaders = [];
      const recurseHeader = h => {
        if (h.subHeaders && h.subHeaders.length) {
          h.subHeaders.map(recurseHeader);
        }
        leafHeaders.push(h);
      };
      recurseHeader(header);
      return leafHeaders;
    },
    getContext: () => ({
      table,
      header: header,
      column
    })
  };
  table._features.forEach(feature => {
    feature.createHeader == null || feature.createHeader(header, table);
  });
  return header;
}
const Headers = {
  createTable: table => {
    // Header Groups
 
    table.getHeaderGroups = memo(() => [table.getAllColumns(), table.getVisibleLeafColumns(), table.getState().columnPinning.left, table.getState().columnPinning.right], (allColumns, leafColumns, left, right) => {
      var _left$map$filter, _right$map$filter;
      const leftColumns = (_left$map$filter = left == null ? void 0 : left.map(columnId => leafColumns.find(d => d.id === columnId)).filter(Boolean)) != null ? _left$map$filter : [];
      const rightColumns = (_right$map$filter = right == null ? void 0 : right.map(columnId => leafColumns.find(d => d.id === columnId)).filter(Boolean)) != null ? _right$map$filter : [];
      const centerColumns = leafColumns.filter(column => !(left != null && left.includes(column.id)) && !(right != null && right.includes(column.id)));
      const headerGroups = buildHeaderGroups(allColumns, [...leftColumns, ...centerColumns, ...rightColumns], table);
      return headerGroups;
    }, {
      key: "development" === 'development' && 'getHeaderGroups',
      debug: () => {
        var _table$options$debugA;
        return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugHeaders;
      }
    });
    table.getCenterHeaderGroups = memo(() => [table.getAllColumns(), table.getVisibleLeafColumns(), table.getState().columnPinning.left, table.getState().columnPinning.right], (allColumns, leafColumns, left, right) => {
      leafColumns = leafColumns.filter(column => !(left != null && left.includes(column.id)) && !(right != null && right.includes(column.id)));
      return buildHeaderGroups(allColumns, leafColumns, table, 'center');
    }, {
      key: "development" === 'development' && 'getCenterHeaderGroups',
      debug: () => {
        var _table$options$debugA2;
        return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugHeaders;
      }
    });
    table.getLeftHeaderGroups = memo(() => [table.getAllColumns(), table.getVisibleLeafColumns(), table.getState().columnPinning.left], (allColumns, leafColumns, left) => {
      var _left$map$filter2;
      const orderedLeafColumns = (_left$map$filter2 = left == null ? void 0 : left.map(columnId => leafColumns.find(d => d.id === columnId)).filter(Boolean)) != null ? _left$map$filter2 : [];
      return buildHeaderGroups(allColumns, orderedLeafColumns, table, 'left');
    }, {
      key: "development" === 'development' && 'getLeftHeaderGroups',
      debug: () => {
        var _table$options$debugA3;
        return (_table$options$debugA3 = table.options.debugAll) != null ? _table$options$debugA3 : table.options.debugHeaders;
      }
    });
    table.getRightHeaderGroups = memo(() => [table.getAllColumns(), table.getVisibleLeafColumns(), table.getState().columnPinning.right], (allColumns, leafColumns, right) => {
      var _right$map$filter2;
      const orderedLeafColumns = (_right$map$filter2 = right == null ? void 0 : right.map(columnId => leafColumns.find(d => d.id === columnId)).filter(Boolean)) != null ? _right$map$filter2 : [];
      return buildHeaderGroups(allColumns, orderedLeafColumns, table, 'right');
    }, {
      key: "development" === 'development' && 'getRightHeaderGroups',
      debug: () => {
        var _table$options$debugA4;
        return (_table$options$debugA4 = table.options.debugAll) != null ? _table$options$debugA4 : table.options.debugHeaders;
      }
    });
 
    // Footer Groups
 
    table.getFooterGroups = memo(() => [table.getHeaderGroups()], headerGroups => {
      return [...headerGroups].reverse();
    }, {
      key: "development" === 'development' && 'getFooterGroups',
      debug: () => {
        var _table$options$debugA5;
        return (_table$options$debugA5 = table.options.debugAll) != null ? _table$options$debugA5 : table.options.debugHeaders;
      }
    });
    table.getLeftFooterGroups = memo(() => [table.getLeftHeaderGroups()], headerGroups => {
      return [...headerGroups].reverse();
    }, {
      key: "development" === 'development' && 'getLeftFooterGroups',
      debug: () => {
        var _table$options$debugA6;
        return (_table$options$debugA6 = table.options.debugAll) != null ? _table$options$debugA6 : table.options.debugHeaders;
      }
    });
    table.getCenterFooterGroups = memo(() => [table.getCenterHeaderGroups()], headerGroups => {
      return [...headerGroups].reverse();
    }, {
      key: "development" === 'development' && 'getCenterFooterGroups',
      debug: () => {
        var _table$options$debugA7;
        return (_table$options$debugA7 = table.options.debugAll) != null ? _table$options$debugA7 : table.options.debugHeaders;
      }
    });
    table.getRightFooterGroups = memo(() => [table.getRightHeaderGroups()], headerGroups => {
      return [...headerGroups].reverse();
    }, {
      key: "development" === 'development' && 'getRightFooterGroups',
      debug: () => {
        var _table$options$debugA8;
        return (_table$options$debugA8 = table.options.debugAll) != null ? _table$options$debugA8 : table.options.debugHeaders;
      }
    });
 
    // Flat Headers
 
    table.getFlatHeaders = memo(() => [table.getHeaderGroups()], headerGroups => {
      return headerGroups.map(headerGroup => {
        return headerGroup.headers;
      }).flat();
    }, {
      key: "development" === 'development' && 'getFlatHeaders',
      debug: () => {
        var _table$options$debugA9;
        return (_table$options$debugA9 = table.options.debugAll) != null ? _table$options$debugA9 : table.options.debugHeaders;
      }
    });
    table.getLeftFlatHeaders = memo(() => [table.getLeftHeaderGroups()], left => {
      return left.map(headerGroup => {
        return headerGroup.headers;
      }).flat();
    }, {
      key: "development" === 'development' && 'getLeftFlatHeaders',
      debug: () => {
        var _table$options$debugA10;
        return (_table$options$debugA10 = table.options.debugAll) != null ? _table$options$debugA10 : table.options.debugHeaders;
      }
    });
    table.getCenterFlatHeaders = memo(() => [table.getCenterHeaderGroups()], left => {
      return left.map(headerGroup => {
        return headerGroup.headers;
      }).flat();
    }, {
      key: "development" === 'development' && 'getCenterFlatHeaders',
      debug: () => {
        var _table$options$debugA11;
        return (_table$options$debugA11 = table.options.debugAll) != null ? _table$options$debugA11 : table.options.debugHeaders;
      }
    });
    table.getRightFlatHeaders = memo(() => [table.getRightHeaderGroups()], left => {
      return left.map(headerGroup => {
        return headerGroup.headers;
      }).flat();
    }, {
      key: "development" === 'development' && 'getRightFlatHeaders',
      debug: () => {
        var _table$options$debugA12;
        return (_table$options$debugA12 = table.options.debugAll) != null ? _table$options$debugA12 : table.options.debugHeaders;
      }
    });
 
    // Leaf Headers
 
    table.getCenterLeafHeaders = memo(() => [table.getCenterFlatHeaders()], flatHeaders => {
      return flatHeaders.filter(header => {
        var _header$subHeaders;
        return !((_header$subHeaders = header.subHeaders) != null && _header$subHeaders.length);
      });
    }, {
      key: "development" === 'development' && 'getCenterLeafHeaders',
      debug: () => {
        var _table$options$debugA13;
        return (_table$options$debugA13 = table.options.debugAll) != null ? _table$options$debugA13 : table.options.debugHeaders;
      }
    });
    table.getLeftLeafHeaders = memo(() => [table.getLeftFlatHeaders()], flatHeaders => {
      return flatHeaders.filter(header => {
        var _header$subHeaders2;
        return !((_header$subHeaders2 = header.subHeaders) != null && _header$subHeaders2.length);
      });
    }, {
      key: "development" === 'development' && 'getLeftLeafHeaders',
      debug: () => {
        var _table$options$debugA14;
        return (_table$options$debugA14 = table.options.debugAll) != null ? _table$options$debugA14 : table.options.debugHeaders;
      }
    });
    table.getRightLeafHeaders = memo(() => [table.getRightFlatHeaders()], flatHeaders => {
      return flatHeaders.filter(header => {
        var _header$subHeaders3;
        return !((_header$subHeaders3 = header.subHeaders) != null && _header$subHeaders3.length);
      });
    }, {
      key: "development" === 'development' && 'getRightLeafHeaders',
      debug: () => {
        var _table$options$debugA15;
        return (_table$options$debugA15 = table.options.debugAll) != null ? _table$options$debugA15 : table.options.debugHeaders;
      }
    });
    table.getLeafHeaders = memo(() => [table.getLeftHeaderGroups(), table.getCenterHeaderGroups(), table.getRightHeaderGroups()], (left, center, right) => {
      var _left$0$headers, _left$, _center$0$headers, _center$, _right$0$headers, _right$;
      return [...((_left$0$headers = (_left$ = left[0]) == null ? void 0 : _left$.headers) != null ? _left$0$headers : []), ...((_center$0$headers = (_center$ = center[0]) == null ? void 0 : _center$.headers) != null ? _center$0$headers : []), ...((_right$0$headers = (_right$ = right[0]) == null ? void 0 : _right$.headers) != null ? _right$0$headers : [])].map(header => {
        return header.getLeafHeaders();
      }).flat();
    }, {
      key: "development" === 'development' && 'getLeafHeaders',
      debug: () => {
        var _table$options$debugA16;
        return (_table$options$debugA16 = table.options.debugAll) != null ? _table$options$debugA16 : table.options.debugHeaders;
      }
    });
  }
};
function buildHeaderGroups(allColumns, columnsToGroup, table, headerFamily) {
  var _headerGroups$0$heade, _headerGroups$;
  // Find the max depth of the columns:
  // build the leaf column row
  // build each buffer row going up
  //    placeholder for non-existent level
  //    real column for existing level
 
  let maxDepth = 0;
  const findMaxDepth = function (columns, depth) {
    if (depth === void 0) {
      depth = 1;
    }
    maxDepth = Math.max(maxDepth, depth);
    columns.filter(column => column.getIsVisible()).forEach(column => {
      var _column$columns;
      if ((_column$columns = column.columns) != null && _column$columns.length) {
        findMaxDepth(column.columns, depth + 1);
      }
    }, 0);
  };
  findMaxDepth(allColumns);
  let headerGroups = [];
  const createHeaderGroup = (headersToGroup, depth) => {
    // The header group we are creating
    const headerGroup = {
      depth,
      id: [headerFamily, `${depth}`].filter(Boolean).join('_'),
      headers: []
    };
 
    // The parent columns we're going to scan next
    const pendingParentHeaders = [];
 
    // Scan each column for parents
    headersToGroup.forEach(headerToGroup => {
      // What is the latest (last) parent column?
 
      const latestPendingParentHeader = [...pendingParentHeaders].reverse()[0];
      const isLeafHeader = headerToGroup.column.depth === headerGroup.depth;
      let column;
      let isPlaceholder = false;
      if (isLeafHeader && headerToGroup.column.parent) {
        // The parent header is new
        column = headerToGroup.column.parent;
      } else {
        // The parent header is repeated
        column = headerToGroup.column;
        isPlaceholder = true;
      }
      if (latestPendingParentHeader && (latestPendingParentHeader == null ? void 0 : latestPendingParentHeader.column) === column) {
        // This column is repeated. Add it as a sub header to the next batch
        latestPendingParentHeader.subHeaders.push(headerToGroup);
      } else {
        // This is a new header. Let's create it
        const header = createHeader(table, column, {
          id: [headerFamily, depth, column.id, headerToGroup == null ? void 0 : headerToGroup.id].filter(Boolean).join('_'),
          isPlaceholder,
          placeholderId: isPlaceholder ? `${pendingParentHeaders.filter(d => d.column === column).length}` : undefined,
          depth,
          index: pendingParentHeaders.length
        });
 
        // Add the headerToGroup as a subHeader of the new header
        header.subHeaders.push(headerToGroup);
        // Add the new header to the pendingParentHeaders to get grouped
        // in the next batch
        pendingParentHeaders.push(header);
      }
      headerGroup.headers.push(headerToGroup);
      headerToGroup.headerGroup = headerGroup;
    });
    headerGroups.push(headerGroup);
    if (depth > 0) {
      createHeaderGroup(pendingParentHeaders, depth - 1);
    }
  };
  const bottomHeaders = columnsToGroup.map((column, index) => createHeader(table, column, {
    depth: maxDepth,
    index
  }));
  createHeaderGroup(bottomHeaders, maxDepth - 1);
  headerGroups.reverse();
 
  // headerGroups = headerGroups.filter(headerGroup => {
  //   return !headerGroup.headers.every(header => header.isPlaceholder)
  // })
 
  const recurseHeadersForSpans = headers => {
    const filteredHeaders = headers.filter(header => header.column.getIsVisible());
    return filteredHeaders.map(header => {
      let colSpan = 0;
      let rowSpan = 0;
      let childRowSpans = [0];
      if (header.subHeaders && header.subHeaders.length) {
        childRowSpans = [];
        recurseHeadersForSpans(header.subHeaders).forEach(_ref => {
          let {
            colSpan: childColSpan,
            rowSpan: childRowSpan
          } = _ref;
          colSpan += childColSpan;
          childRowSpans.push(childRowSpan);
        });
      } else {
        colSpan = 1;
      }
      const minChildRowSpan = Math.min(...childRowSpans);
      rowSpan = rowSpan + minChildRowSpan;
      header.colSpan = colSpan;
      header.rowSpan = rowSpan;
      return {
        colSpan,
        rowSpan
      };
    });
  };
  recurseHeadersForSpans((_headerGroups$0$heade = (_headerGroups$ = headerGroups[0]) == null ? void 0 : _headerGroups$.headers) != null ? _headerGroups$0$heade : []);
  return headerGroups;
}
 
//
 
//
 
const defaultColumnSizing = {
  size: 150,
  minSize: 20,
  maxSize: Number.MAX_SAFE_INTEGER
};
const getDefaultColumnSizingInfoState = () => ({
  startOffset: null,
  startSize: null,
  deltaOffset: null,
  deltaPercentage: null,
  isResizingColumn: false,
  columnSizingStart: []
});
const ColumnSizing = {
  getDefaultColumnDef: () => {
    return defaultColumnSizing;
  },
  getInitialState: state => {
    return {
      columnSizing: {},
      columnSizingInfo: getDefaultColumnSizingInfoState(),
      ...state
    };
  },
  getDefaultOptions: table => {
    return {
      columnResizeMode: 'onEnd',
      onColumnSizingChange: makeStateUpdater('columnSizing', table),
      onColumnSizingInfoChange: makeStateUpdater('columnSizingInfo', table)
    };
  },
  createColumn: (column, table) => {
    column.getSize = () => {
      var _column$columnDef$min, _ref, _column$columnDef$max;
      const columnSize = table.getState().columnSizing[column.id];
      return Math.min(Math.max((_column$columnDef$min = column.columnDef.minSize) != null ? _column$columnDef$min : defaultColumnSizing.minSize, (_ref = columnSize != null ? columnSize : column.columnDef.size) != null ? _ref : defaultColumnSizing.size), (_column$columnDef$max = column.columnDef.maxSize) != null ? _column$columnDef$max : defaultColumnSizing.maxSize);
    };
    column.getStart = position => {
      const columns = !position ? table.getVisibleLeafColumns() : position === 'left' ? table.getLeftVisibleLeafColumns() : table.getRightVisibleLeafColumns();
      const index = columns.findIndex(d => d.id === column.id);
      if (index > 0) {
        const prevSiblingColumn = columns[index - 1];
        return prevSiblingColumn.getStart(position) + prevSiblingColumn.getSize();
      }
      return 0;
    };
    column.resetSize = () => {
      table.setColumnSizing(_ref2 => {
        let {
          [column.id]: _,
          ...rest
        } = _ref2;
        return rest;
      });
    };
    column.getCanResize = () => {
      var _column$columnDef$ena, _table$options$enable;
      return ((_column$columnDef$ena = column.columnDef.enableResizing) != null ? _column$columnDef$ena : true) && ((_table$options$enable = table.options.enableColumnResizing) != null ? _table$options$enable : true);
    };
    column.getIsResizing = () => {
      return table.getState().columnSizingInfo.isResizingColumn === column.id;
    };
  },
  createHeader: (header, table) => {
    header.getSize = () => {
      let sum = 0;
      const recurse = header => {
        if (header.subHeaders.length) {
          header.subHeaders.forEach(recurse);
        } else {
          var _header$column$getSiz;
          sum += (_header$column$getSiz = header.column.getSize()) != null ? _header$column$getSiz : 0;
        }
      };
      recurse(header);
      return sum;
    };
    header.getStart = () => {
      if (header.index > 0) {
        const prevSiblingHeader = header.headerGroup.headers[header.index - 1];
        return prevSiblingHeader.getStart() + prevSiblingHeader.getSize();
      }
      return 0;
    };
    header.getResizeHandler = () => {
      const column = table.getColumn(header.column.id);
      const canResize = column == null ? void 0 : column.getCanResize();
      return e => {
        if (!column || !canResize) {
          return;
        }
        e.persist == null || e.persist();
        if (isTouchStartEvent(e)) {
          // lets not respond to multiple touches (e.g. 2 or 3 fingers)
          if (e.touches && e.touches.length > 1) {
            return;
          }
        }
        const startSize = header.getSize();
        const columnSizingStart = header ? header.getLeafHeaders().map(d => [d.column.id, d.column.getSize()]) : [[column.id, column.getSize()]];
        const clientX = isTouchStartEvent(e) ? Math.round(e.touches[0].clientX) : e.clientX;
        const newColumnSizing = {};
        const updateOffset = (eventType, clientXPos) => {
          if (typeof clientXPos !== 'number') {
            return;
          }
          table.setColumnSizingInfo(old => {
            var _old$startOffset, _old$startSize;
            const deltaOffset = clientXPos - ((_old$startOffset = old == null ? void 0 : old.startOffset) != null ? _old$startOffset : 0);
            const deltaPercentage = Math.max(deltaOffset / ((_old$startSize = old == null ? void 0 : old.startSize) != null ? _old$startSize : 0), -0.999999);
            old.columnSizingStart.forEach(_ref3 => {
              let [columnId, headerSize] = _ref3;
              newColumnSizing[columnId] = Math.round(Math.max(headerSize + headerSize * deltaPercentage, 0) * 100) / 100;
            });
            return {
              ...old,
              deltaOffset,
              deltaPercentage
            };
          });
          if (table.options.columnResizeMode === 'onChange' || eventType === 'end') {
            table.setColumnSizing(old => ({
              ...old,
              ...newColumnSizing
            }));
          }
        };
        const onMove = clientXPos => updateOffset('move', clientXPos);
        const onEnd = clientXPos => {
          updateOffset('end', clientXPos);
          table.setColumnSizingInfo(old => ({
            ...old,
            isResizingColumn: false,
            startOffset: null,
            startSize: null,
            deltaOffset: null,
            deltaPercentage: null,
            columnSizingStart: []
          }));
        };
        const mouseEvents = {
          moveHandler: e => onMove(e.clientX),
          upHandler: e => {
            document.removeEventListener('mousemove', mouseEvents.moveHandler);
            document.removeEventListener('mouseup', mouseEvents.upHandler);
            onEnd(e.clientX);
          }
        };
        const touchEvents = {
          moveHandler: e => {
            if (e.cancelable) {
              e.preventDefault();
              e.stopPropagation();
            }
            onMove(e.touches[0].clientX);
            return false;
          },
          upHandler: e => {
            var _e$touches$;
            document.removeEventListener('touchmove', touchEvents.moveHandler);
            document.removeEventListener('touchend', touchEvents.upHandler);
            if (e.cancelable) {
              e.preventDefault();
              e.stopPropagation();
            }
            onEnd((_e$touches$ = e.touches[0]) == null ? void 0 : _e$touches$.clientX);
          }
        };
        const passiveIfSupported = passiveEventSupported() ? {
          passive: false
        } : false;
        if (isTouchStartEvent(e)) {
          document.addEventListener('touchmove', touchEvents.moveHandler, passiveIfSupported);
          document.addEventListener('touchend', touchEvents.upHandler, passiveIfSupported);
        } else {
          document.addEventListener('mousemove', mouseEvents.moveHandler, passiveIfSupported);
          document.addEventListener('mouseup', mouseEvents.upHandler, passiveIfSupported);
        }
        table.setColumnSizingInfo(old => ({
          ...old,
          startOffset: clientX,
          startSize,
          deltaOffset: 0,
          deltaPercentage: 0,
          columnSizingStart,
          isResizingColumn: column.id
        }));
      };
    };
  },
  createTable: table => {
    table.setColumnSizing = updater => table.options.onColumnSizingChange == null ? void 0 : table.options.onColumnSizingChange(updater);
    table.setColumnSizingInfo = updater => table.options.onColumnSizingInfoChange == null ? void 0 : table.options.onColumnSizingInfoChange(updater);
    table.resetColumnSizing = defaultState => {
      var _table$initialState$c;
      table.setColumnSizing(defaultState ? {} : (_table$initialState$c = table.initialState.columnSizing) != null ? _table$initialState$c : {});
    };
    table.resetHeaderSizeInfo = defaultState => {
      var _table$initialState$c2;
      table.setColumnSizingInfo(defaultState ? getDefaultColumnSizingInfoState() : (_table$initialState$c2 = table.initialState.columnSizingInfo) != null ? _table$initialState$c2 : getDefaultColumnSizingInfoState());
    };
    table.getTotalSize = () => {
      var _table$getHeaderGroup, _table$getHeaderGroup2;
      return (_table$getHeaderGroup = (_table$getHeaderGroup2 = table.getHeaderGroups()[0]) == null ? void 0 : _table$getHeaderGroup2.headers.reduce((sum, header) => {
        return sum + header.getSize();
      }, 0)) != null ? _table$getHeaderGroup : 0;
    };
    table.getLeftTotalSize = () => {
      var _table$getLeftHeaderG, _table$getLeftHeaderG2;
      return (_table$getLeftHeaderG = (_table$getLeftHeaderG2 = table.getLeftHeaderGroups()[0]) == null ? void 0 : _table$getLeftHeaderG2.headers.reduce((sum, header) => {
        return sum + header.getSize();
      }, 0)) != null ? _table$getLeftHeaderG : 0;
    };
    table.getCenterTotalSize = () => {
      var _table$getCenterHeade, _table$getCenterHeade2;
      return (_table$getCenterHeade = (_table$getCenterHeade2 = table.getCenterHeaderGroups()[0]) == null ? void 0 : _table$getCenterHeade2.headers.reduce((sum, header) => {
        return sum + header.getSize();
      }, 0)) != null ? _table$getCenterHeade : 0;
    };
    table.getRightTotalSize = () => {
      var _table$getRightHeader, _table$getRightHeader2;
      return (_table$getRightHeader = (_table$getRightHeader2 = table.getRightHeaderGroups()[0]) == null ? void 0 : _table$getRightHeader2.headers.reduce((sum, header) => {
        return sum + header.getSize();
      }, 0)) != null ? _table$getRightHeader : 0;
    };
  }
};
let passiveSupported = null;
function passiveEventSupported() {
  if (typeof passiveSupported === 'boolean') return passiveSupported;
  let supported = false;
  try {
    const options = {
      get passive() {
        supported = true;
        return false;
      }
    };
    const noop = () => {};
    window.addEventListener('test', noop, options);
    window.removeEventListener('test', noop);
  } catch (err) {
    supported = false;
  }
  passiveSupported = supported;
  return passiveSupported;
}
function isTouchStartEvent(e) {
  return e.type === 'touchstart';
}
 
//
 
const Expanding = {
  getInitialState: state => {
    return {
      expanded: {},
      ...state
    };
  },
  getDefaultOptions: table => {
    return {
      onExpandedChange: makeStateUpdater('expanded', table),
      paginateExpandedRows: true
    };
  },
  createTable: table => {
    let registered = false;
    let queued = false;
    table._autoResetExpanded = () => {
      var _ref, _table$options$autoRe;
      if (!registered) {
        table._queue(() => {
          registered = true;
        });
        return;
      }
      if ((_ref = (_table$options$autoRe = table.options.autoResetAll) != null ? _table$options$autoRe : table.options.autoResetExpanded) != null ? _ref : !table.options.manualExpanding) {
        if (queued) return;
        queued = true;
        table._queue(() => {
          table.resetExpanded();
          queued = false;
        });
      }
    };
    table.setExpanded = updater => table.options.onExpandedChange == null ? void 0 : table.options.onExpandedChange(updater);
    table.toggleAllRowsExpanded = expanded => {
      if (expanded != null ? expanded : !table.getIsAllRowsExpanded()) {
        table.setExpanded(true);
      } else {
        table.setExpanded({});
      }
    };
    table.resetExpanded = defaultState => {
      var _table$initialState$e, _table$initialState;
      table.setExpanded(defaultState ? {} : (_table$initialState$e = (_table$initialState = table.initialState) == null ? void 0 : _table$initialState.expanded) != null ? _table$initialState$e : {});
    };
    table.getCanSomeRowsExpand = () => {
      return table.getPrePaginationRowModel().flatRows.some(row => row.getCanExpand());
    };
    table.getToggleAllRowsExpandedHandler = () => {
      return e => {
        e.persist == null || e.persist();
        table.toggleAllRowsExpanded();
      };
    };
    table.getIsSomeRowsExpanded = () => {
      const expanded = table.getState().expanded;
      return expanded === true || Object.values(expanded).some(Boolean);
    };
    table.getIsAllRowsExpanded = () => {
      const expanded = table.getState().expanded;
 
      // If expanded is true, save some cycles and return true
      if (typeof expanded === 'boolean') {
        return expanded === true;
      }
      if (!Object.keys(expanded).length) {
        return false;
      }
 
      // If any row is not expanded, return false
      if (table.getRowModel().flatRows.some(row => !row.getIsExpanded())) {
        return false;
      }
 
      // They must all be expanded :shrug:
      return true;
    };
    table.getExpandedDepth = () => {
      let maxDepth = 0;
      const rowIds = table.getState().expanded === true ? Object.keys(table.getRowModel().rowsById) : Object.keys(table.getState().expanded);
      rowIds.forEach(id => {
        const splitId = id.split('.');
        maxDepth = Math.max(maxDepth, splitId.length);
      });
      return maxDepth;
    };
    table.getPreExpandedRowModel = () => table.getSortedRowModel();
    table.getExpandedRowModel = () => {
      if (!table._getExpandedRowModel && table.options.getExpandedRowModel) {
        table._getExpandedRowModel = table.options.getExpandedRowModel(table);
      }
      if (table.options.manualExpanding || !table._getExpandedRowModel) {
        return table.getPreExpandedRowModel();
      }
      return table._getExpandedRowModel();
    };
  },
  createRow: (row, table) => {
    row.toggleExpanded = expanded => {
      table.setExpanded(old => {
        var _expanded;
        const exists = old === true ? true : !!(old != null && old[row.id]);
        let oldExpanded = {};
        if (old === true) {
          Object.keys(table.getRowModel().rowsById).forEach(rowId => {
            oldExpanded[rowId] = true;
          });
        } else {
          oldExpanded = old;
        }
        expanded = (_expanded = expanded) != null ? _expanded : !exists;
        if (!exists && expanded) {
          return {
            ...oldExpanded,
            [row.id]: true
          };
        }
        if (exists && !expanded) {
          const {
            [row.id]: _,
            ...rest
          } = oldExpanded;
          return rest;
        }
        return old;
      });
    };
    row.getIsExpanded = () => {
      var _table$options$getIsR;
      const expanded = table.getState().expanded;
      return !!((_table$options$getIsR = table.options.getIsRowExpanded == null ? void 0 : table.options.getIsRowExpanded(row)) != null ? _table$options$getIsR : expanded === true || (expanded == null ? void 0 : expanded[row.id]));
    };
    row.getCanExpand = () => {
      var _table$options$getRow, _table$options$enable, _row$subRows;
      return (_table$options$getRow = table.options.getRowCanExpand == null ? void 0 : table.options.getRowCanExpand(row)) != null ? _table$options$getRow : ((_table$options$enable = table.options.enableExpanding) != null ? _table$options$enable : true) && !!((_row$subRows = row.subRows) != null && _row$subRows.length);
    };
    row.getIsAllParentsExpanded = () => {
      let isFullyExpanded = true;
      let currentRow = row;
      while (isFullyExpanded && currentRow.parentId) {
        currentRow = table.getRow(currentRow.parentId, true);
        isFullyExpanded = currentRow.getIsExpanded();
      }
      return isFullyExpanded;
    };
    row.getToggleExpandedHandler = () => {
      const canExpand = row.getCanExpand();
      return () => {
        if (!canExpand) return;
        row.toggleExpanded();
      };
    };
  }
};
 
const includesString = (row, columnId, filterValue) => {
  var _row$getValue;
  const search = filterValue.toLowerCase();
  return Boolean((_row$getValue = row.getValue(columnId)) == null || (_row$getValue = _row$getValue.toString()) == null || (_row$getValue = _row$getValue.toLowerCase()) == null ? void 0 : _row$getValue.includes(search));
};
includesString.autoRemove = val => testFalsey(val);
const includesStringSensitive = (row, columnId, filterValue) => {
  var _row$getValue2;
  return Boolean((_row$getValue2 = row.getValue(columnId)) == null || (_row$getValue2 = _row$getValue2.toString()) == null ? void 0 : _row$getValue2.includes(filterValue));
};
includesStringSensitive.autoRemove = val => testFalsey(val);
const equalsString = (row, columnId, filterValue) => {
  var _row$getValue3;
  return ((_row$getValue3 = row.getValue(columnId)) == null || (_row$getValue3 = _row$getValue3.toString()) == null ? void 0 : _row$getValue3.toLowerCase()) === (filterValue == null ? void 0 : filterValue.toLowerCase());
};
equalsString.autoRemove = val => testFalsey(val);
const arrIncludes = (row, columnId, filterValue) => {
  var _row$getValue4;
  return (_row$getValue4 = row.getValue(columnId)) == null ? void 0 : _row$getValue4.includes(filterValue);
};
arrIncludes.autoRemove = val => testFalsey(val) || !(val != null && val.length);
const arrIncludesAll = (row, columnId, filterValue) => {
  return !filterValue.some(val => {
    var _row$getValue5;
    return !((_row$getValue5 = row.getValue(columnId)) != null && _row$getValue5.includes(val));
  });
};
arrIncludesAll.autoRemove = val => testFalsey(val) || !(val != null && val.length);
const arrIncludesSome = (row, columnId, filterValue) => {
  return filterValue.some(val => {
    var _row$getValue6;
    return (_row$getValue6 = row.getValue(columnId)) == null ? void 0 : _row$getValue6.includes(val);
  });
};
arrIncludesSome.autoRemove = val => testFalsey(val) || !(val != null && val.length);
const equals = (row, columnId, filterValue) => {
  return row.getValue(columnId) === filterValue;
};
equals.autoRemove = val => testFalsey(val);
const weakEquals = (row, columnId, filterValue) => {
  return row.getValue(columnId) == filterValue;
};
weakEquals.autoRemove = val => testFalsey(val);
const inNumberRange = (row, columnId, filterValue) => {
  let [min, max] = filterValue;
  const rowValue = row.getValue(columnId);
  return rowValue >= min && rowValue <= max;
};
inNumberRange.resolveFilterValue = val => {
  let [unsafeMin, unsafeMax] = val;
  let parsedMin = typeof unsafeMin !== 'number' ? parseFloat(unsafeMin) : unsafeMin;
  let parsedMax = typeof unsafeMax !== 'number' ? parseFloat(unsafeMax) : unsafeMax;
  let min = unsafeMin === null || Number.isNaN(parsedMin) ? -Infinity : parsedMin;
  let max = unsafeMax === null || Number.isNaN(parsedMax) ? Infinity : parsedMax;
  if (min > max) {
    const temp = min;
    min = max;
    max = temp;
  }
  return [min, max];
};
inNumberRange.autoRemove = val => testFalsey(val) || testFalsey(val[0]) && testFalsey(val[1]);
 
// Export
 
const filterFns = {
  includesString,
  includesStringSensitive,
  equalsString,
  arrIncludes,
  arrIncludesAll,
  arrIncludesSome,
  equals,
  weakEquals,
  inNumberRange
};
// Utils
 
function testFalsey(val) {
  return val === undefined || val === null || val === '';
}
 
//
 
const Filters = {
  getDefaultColumnDef: () => {
    return {
      filterFn: 'auto'
    };
  },
  getInitialState: state => {
    return {
      columnFilters: [],
      globalFilter: undefined,
      // filtersProgress: 1,
      // facetProgress: {},
      ...state
    };
  },
  getDefaultOptions: table => {
    return {
      onColumnFiltersChange: makeStateUpdater('columnFilters', table),
      onGlobalFilterChange: makeStateUpdater('globalFilter', table),
      filterFromLeafRows: false,
      maxLeafRowFilterDepth: 100,
      globalFilterFn: 'auto',
      getColumnCanGlobalFilter: column => {
        var _table$getCoreRowMode;
        const value = (_table$getCoreRowMode = table.getCoreRowModel().flatRows[0]) == null || (_table$getCoreRowMode = _table$getCoreRowMode._getAllCellsByColumnId()[column.id]) == null ? void 0 : _table$getCoreRowMode.getValue();
        return typeof value === 'string' || typeof value === 'number';
      }
    };
  },
  createColumn: (column, table) => {
    column.getAutoFilterFn = () => {
      const firstRow = table.getCoreRowModel().flatRows[0];
      const value = firstRow == null ? void 0 : firstRow.getValue(column.id);
      if (typeof value === 'string') {
        return filterFns.includesString;
      }
      if (typeof value === 'number') {
        return filterFns.inNumberRange;
      }
      if (typeof value === 'boolean') {
        return filterFns.equals;
      }
      if (value !== null && typeof value === 'object') {
        return filterFns.equals;
      }
      if (Array.isArray(value)) {
        return filterFns.arrIncludes;
      }
      return filterFns.weakEquals;
    };
    column.getFilterFn = () => {
      var _table$options$filter, _table$options$filter2;
      return isFunction(column.columnDef.filterFn) ? column.columnDef.filterFn : column.columnDef.filterFn === 'auto' ? column.getAutoFilterFn() : // @ts-ignore
      (_table$options$filter = (_table$options$filter2 = table.options.filterFns) == null ? void 0 : _table$options$filter2[column.columnDef.filterFn]) != null ? _table$options$filter : filterFns[column.columnDef.filterFn];
    };
    column.getCanFilter = () => {
      var _column$columnDef$ena, _table$options$enable, _table$options$enable2;
      return ((_column$columnDef$ena = column.columnDef.enableColumnFilter) != null ? _column$columnDef$ena : true) && ((_table$options$enable = table.options.enableColumnFilters) != null ? _table$options$enable : true) && ((_table$options$enable2 = table.options.enableFilters) != null ? _table$options$enable2 : true) && !!column.accessorFn;
    };
    column.getCanGlobalFilter = () => {
      var _column$columnDef$ena2, _table$options$enable3, _table$options$enable4, _table$options$getCol;
      return ((_column$columnDef$ena2 = column.columnDef.enableGlobalFilter) != null ? _column$columnDef$ena2 : true) && ((_table$options$enable3 = table.options.enableGlobalFilter) != null ? _table$options$enable3 : true) && ((_table$options$enable4 = table.options.enableFilters) != null ? _table$options$enable4 : true) && ((_table$options$getCol = table.options.getColumnCanGlobalFilter == null ? void 0 : table.options.getColumnCanGlobalFilter(column)) != null ? _table$options$getCol : true) && !!column.accessorFn;
    };
    column.getIsFiltered = () => column.getFilterIndex() > -1;
    column.getFilterValue = () => {
      var _table$getState$colum;
      return (_table$getState$colum = table.getState().columnFilters) == null || (_table$getState$colum = _table$getState$colum.find(d => d.id === column.id)) == null ? void 0 : _table$getState$colum.value;
    };
    column.getFilterIndex = () => {
      var _table$getState$colum2, _table$getState$colum3;
      return (_table$getState$colum2 = (_table$getState$colum3 = table.getState().columnFilters) == null ? void 0 : _table$getState$colum3.findIndex(d => d.id === column.id)) != null ? _table$getState$colum2 : -1;
    };
    column.setFilterValue = value => {
      table.setColumnFilters(old => {
        const filterFn = column.getFilterFn();
        const previousfilter = old == null ? void 0 : old.find(d => d.id === column.id);
        const newFilter = functionalUpdate(value, previousfilter ? previousfilter.value : undefined);
 
        //
        if (shouldAutoRemoveFilter(filterFn, newFilter, column)) {
          var _old$filter;
          return (_old$filter = old == null ? void 0 : old.filter(d => d.id !== column.id)) != null ? _old$filter : [];
        }
        const newFilterObj = {
          id: column.id,
          value: newFilter
        };
        if (previousfilter) {
          var _old$map;
          return (_old$map = old == null ? void 0 : old.map(d => {
            if (d.id === column.id) {
              return newFilterObj;
            }
            return d;
          })) != null ? _old$map : [];
        }
        if (old != null && old.length) {
          return [...old, newFilterObj];
        }
        return [newFilterObj];
      });
    };
    column._getFacetedRowModel = table.options.getFacetedRowModel && table.options.getFacetedRowModel(table, column.id);
    column.getFacetedRowModel = () => {
      if (!column._getFacetedRowModel) {
        return table.getPreFilteredRowModel();
      }
      return column._getFacetedRowModel();
    };
    column._getFacetedUniqueValues = table.options.getFacetedUniqueValues && table.options.getFacetedUniqueValues(table, column.id);
    column.getFacetedUniqueValues = () => {
      if (!column._getFacetedUniqueValues) {
        return new Map();
      }
      return column._getFacetedUniqueValues();
    };
    column._getFacetedMinMaxValues = table.options.getFacetedMinMaxValues && table.options.getFacetedMinMaxValues(table, column.id);
    column.getFacetedMinMaxValues = () => {
      if (!column._getFacetedMinMaxValues) {
        return undefined;
      }
      return column._getFacetedMinMaxValues();
    };
    // () => [column.getFacetedRowModel()],
    // facetedRowModel => getRowModelMinMaxValues(facetedRowModel, column.id),
  },
 
  createRow: (row, table) => {
    row.columnFilters = {};
    row.columnFiltersMeta = {};
  },
  createTable: table => {
    table.getGlobalAutoFilterFn = () => {
      return filterFns.includesString;
    };
    table.getGlobalFilterFn = () => {
      var _table$options$filter3, _table$options$filter4;
      const {
        globalFilterFn: globalFilterFn
      } = table.options;
      return isFunction(globalFilterFn) ? globalFilterFn : globalFilterFn === 'auto' ? table.getGlobalAutoFilterFn() : // @ts-ignore
      (_table$options$filter3 = (_table$options$filter4 = table.options.filterFns) == null ? void 0 : _table$options$filter4[globalFilterFn]) != null ? _table$options$filter3 : filterFns[globalFilterFn];
    };
    table.setColumnFilters = updater => {
      const leafColumns = table.getAllLeafColumns();
      const updateFn = old => {
        var _functionalUpdate;
        return (_functionalUpdate = functionalUpdate(updater, old)) == null ? void 0 : _functionalUpdate.filter(filter => {
          const column = leafColumns.find(d => d.id === filter.id);
          if (column) {
            const filterFn = column.getFilterFn();
            if (shouldAutoRemoveFilter(filterFn, filter.value, column)) {
              return false;
            }
          }
          return true;
        });
      };
      table.options.onColumnFiltersChange == null || table.options.onColumnFiltersChange(updateFn);
    };
    table.setGlobalFilter = updater => {
      table.options.onGlobalFilterChange == null || table.options.onGlobalFilterChange(updater);
    };
    table.resetGlobalFilter = defaultState => {
      table.setGlobalFilter(defaultState ? undefined : table.initialState.globalFilter);
    };
    table.resetColumnFilters = defaultState => {
      var _table$initialState$c, _table$initialState;
      table.setColumnFilters(defaultState ? [] : (_table$initialState$c = (_table$initialState = table.initialState) == null ? void 0 : _table$initialState.columnFilters) != null ? _table$initialState$c : []);
    };
    table.getPreFilteredRowModel = () => table.getCoreRowModel();
    table.getFilteredRowModel = () => {
      if (!table._getFilteredRowModel && table.options.getFilteredRowModel) {
        table._getFilteredRowModel = table.options.getFilteredRowModel(table);
      }
      if (table.options.manualFiltering || !table._getFilteredRowModel) {
        return table.getPreFilteredRowModel();
      }
      return table._getFilteredRowModel();
    };
    table._getGlobalFacetedRowModel = table.options.getFacetedRowModel && table.options.getFacetedRowModel(table, '__global__');
    table.getGlobalFacetedRowModel = () => {
      if (table.options.manualFiltering || !table._getGlobalFacetedRowModel) {
        return table.getPreFilteredRowModel();
      }
      return table._getGlobalFacetedRowModel();
    };
    table._getGlobalFacetedUniqueValues = table.options.getFacetedUniqueValues && table.options.getFacetedUniqueValues(table, '__global__');
    table.getGlobalFacetedUniqueValues = () => {
      if (!table._getGlobalFacetedUniqueValues) {
        return new Map();
      }
      return table._getGlobalFacetedUniqueValues();
    };
    table._getGlobalFacetedMinMaxValues = table.options.getFacetedMinMaxValues && table.options.getFacetedMinMaxValues(table, '__global__');
    table.getGlobalFacetedMinMaxValues = () => {
      if (!table._getGlobalFacetedMinMaxValues) {
        return;
      }
      return table._getGlobalFacetedMinMaxValues();
    };
  }
};
function shouldAutoRemoveFilter(filterFn, value, column) {
  return (filterFn && filterFn.autoRemove ? filterFn.autoRemove(value, column) : false) || typeof value === 'undefined' || typeof value === 'string' && !value;
}
 
const sum = (columnId, _leafRows, childRows) => {
  // It's faster to just add the aggregations together instead of
  // process leaf nodes individually
  return childRows.reduce((sum, next) => {
    const nextValue = next.getValue(columnId);
    return sum + (typeof nextValue === 'number' ? nextValue : 0);
  }, 0);
};
const min = (columnId, _leafRows, childRows) => {
  let min;
  childRows.forEach(row => {
    const value = row.getValue(columnId);
    if (value != null && (min > value || min === undefined && value >= value)) {
      min = value;
    }
  });
  return min;
};
const max = (columnId, _leafRows, childRows) => {
  let max;
  childRows.forEach(row => {
    const value = row.getValue(columnId);
    if (value != null && (max < value || max === undefined && value >= value)) {
      max = value;
    }
  });
  return max;
};
const extent = (columnId, _leafRows, childRows) => {
  let min;
  let max;
  childRows.forEach(row => {
    const value = row.getValue(columnId);
    if (value != null) {
      if (min === undefined) {
        if (value >= value) min = max = value;
      } else {
        if (min > value) min = value;
        if (max < value) max = value;
      }
    }
  });
  return [min, max];
};
const mean = (columnId, leafRows) => {
  let count = 0;
  let sum = 0;
  leafRows.forEach(row => {
    let value = row.getValue(columnId);
    if (value != null && (value = +value) >= value) {
      ++count, sum += value;
    }
  });
  if (count) return sum / count;
  return;
};
const median = (columnId, leafRows) => {
  if (!leafRows.length) {
    return;
  }
  const values = leafRows.map(row => row.getValue(columnId));
  if (!isNumberArray(values)) {
    return;
  }
  if (values.length === 1) {
    return values[0];
  }
  const mid = Math.floor(values.length / 2);
  const nums = values.sort((a, b) => a - b);
  return values.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2;
};
const unique = (columnId, leafRows) => {
  return Array.from(new Set(leafRows.map(d => d.getValue(columnId))).values());
};
const uniqueCount = (columnId, leafRows) => {
  return new Set(leafRows.map(d => d.getValue(columnId))).size;
};
const count = (_columnId, leafRows) => {
  return leafRows.length;
};
const aggregationFns = {
  sum,
  min,
  max,
  extent,
  mean,
  median,
  unique,
  uniqueCount,
  count
};
 
//
 
const Grouping = {
  getDefaultColumnDef: () => {
    return {
      aggregatedCell: props => {
        var _toString, _props$getValue;
        return (_toString = (_props$getValue = props.getValue()) == null || _props$getValue.toString == null ? void 0 : _props$getValue.toString()) != null ? _toString : null;
      },
      aggregationFn: 'auto'
    };
  },
  getInitialState: state => {
    return {
      grouping: [],
      ...state
    };
  },
  getDefaultOptions: table => {
    return {
      onGroupingChange: makeStateUpdater('grouping', table),
      groupedColumnMode: 'reorder'
    };
  },
  createColumn: (column, table) => {
    column.toggleGrouping = () => {
      table.setGrouping(old => {
        // Find any existing grouping for this column
        if (old != null && old.includes(column.id)) {
          return old.filter(d => d !== column.id);
        }
        return [...(old != null ? old : []), column.id];
      });
    };
    column.getCanGroup = () => {
      var _ref, _ref2, _ref3, _column$columnDef$ena;
      return (_ref = (_ref2 = (_ref3 = (_column$columnDef$ena = column.columnDef.enableGrouping) != null ? _column$columnDef$ena : true) != null ? _ref3 : table.options.enableGrouping) != null ? _ref2 : true) != null ? _ref : !!column.accessorFn;
    };
    column.getIsGrouped = () => {
      var _table$getState$group;
      return (_table$getState$group = table.getState().grouping) == null ? void 0 : _table$getState$group.includes(column.id);
    };
    column.getGroupedIndex = () => {
      var _table$getState$group2;
      return (_table$getState$group2 = table.getState().grouping) == null ? void 0 : _table$getState$group2.indexOf(column.id);
    };
    column.getToggleGroupingHandler = () => {
      const canGroup = column.getCanGroup();
      return () => {
        if (!canGroup) return;
        column.toggleGrouping();
      };
    };
    column.getAutoAggregationFn = () => {
      const firstRow = table.getCoreRowModel().flatRows[0];
      const value = firstRow == null ? void 0 : firstRow.getValue(column.id);
      if (typeof value === 'number') {
        return aggregationFns.sum;
      }
      if (Object.prototype.toString.call(value) === '[object Date]') {
        return aggregationFns.extent;
      }
    };
    column.getAggregationFn = () => {
      var _table$options$aggreg, _table$options$aggreg2;
      if (!column) {
        throw new Error();
      }
      return isFunction(column.columnDef.aggregationFn) ? column.columnDef.aggregationFn : column.columnDef.aggregationFn === 'auto' ? column.getAutoAggregationFn() : (_table$options$aggreg = (_table$options$aggreg2 = table.options.aggregationFns) == null ? void 0 : _table$options$aggreg2[column.columnDef.aggregationFn]) != null ? _table$options$aggreg : aggregationFns[column.columnDef.aggregationFn];
    };
  },
  createTable: table => {
    table.setGrouping = updater => table.options.onGroupingChange == null ? void 0 : table.options.onGroupingChange(updater);
    table.resetGrouping = defaultState => {
      var _table$initialState$g, _table$initialState;
      table.setGrouping(defaultState ? [] : (_table$initialState$g = (_table$initialState = table.initialState) == null ? void 0 : _table$initialState.grouping) != null ? _table$initialState$g : []);
    };
    table.getPreGroupedRowModel = () => table.getFilteredRowModel();
    table.getGroupedRowModel = () => {
      if (!table._getGroupedRowModel && table.options.getGroupedRowModel) {
        table._getGroupedRowModel = table.options.getGroupedRowModel(table);
      }
      if (table.options.manualGrouping || !table._getGroupedRowModel) {
        return table.getPreGroupedRowModel();
      }
      return table._getGroupedRowModel();
    };
  },
  createRow: (row, table) => {
    row.getIsGrouped = () => !!row.groupingColumnId;
    row.getGroupingValue = columnId => {
      if (row._groupingValuesCache.hasOwnProperty(columnId)) {
        return row._groupingValuesCache[columnId];
      }
      const column = table.getColumn(columnId);
      if (!(column != null && column.columnDef.getGroupingValue)) {
        return row.getValue(columnId);
      }
      row._groupingValuesCache[columnId] = column.columnDef.getGroupingValue(row.original);
      return row._groupingValuesCache[columnId];
    };
    row._groupingValuesCache = {};
  },
  createCell: (cell, column, row, table) => {
    cell.getIsGrouped = () => column.getIsGrouped() && column.id === row.groupingColumnId;
    cell.getIsPlaceholder = () => !cell.getIsGrouped() && column.getIsGrouped();
    cell.getIsAggregated = () => {
      var _row$subRows;
      return !cell.getIsGrouped() && !cell.getIsPlaceholder() && !!((_row$subRows = row.subRows) != null && _row$subRows.length);
    };
  }
};
function orderColumns(leafColumns, grouping, groupedColumnMode) {
  if (!(grouping != null && grouping.length) || !groupedColumnMode) {
    return leafColumns;
  }
  const nonGroupingColumns = leafColumns.filter(col => !grouping.includes(col.id));
  if (groupedColumnMode === 'remove') {
    return nonGroupingColumns;
  }
  const groupingColumns = grouping.map(g => leafColumns.find(col => col.id === g)).filter(Boolean);
  return [...groupingColumns, ...nonGroupingColumns];
}
 
//
 
const Ordering = {
  getInitialState: state => {
    return {
      columnOrder: [],
      ...state
    };
  },
  getDefaultOptions: table => {
    return {
      onColumnOrderChange: makeStateUpdater('columnOrder', table)
    };
  },
  createTable: table => {
    table.setColumnOrder = updater => table.options.onColumnOrderChange == null ? void 0 : table.options.onColumnOrderChange(updater);
    table.resetColumnOrder = defaultState => {
      var _table$initialState$c;
      table.setColumnOrder(defaultState ? [] : (_table$initialState$c = table.initialState.columnOrder) != null ? _table$initialState$c : []);
    };
    table._getOrderColumnsFn = memo(() => [table.getState().columnOrder, table.getState().grouping, table.options.groupedColumnMode], (columnOrder, grouping, groupedColumnMode) => columns => {
      // Sort grouped columns to the start of the column list
      // before the headers are built
      let orderedColumns = [];
 
      // If there is no order, return the normal columns
      if (!(columnOrder != null && columnOrder.length)) {
        orderedColumns = columns;
      } else {
        const columnOrderCopy = [...columnOrder];
 
        // If there is an order, make a copy of the columns
        const columnsCopy = [...columns];
 
        // And make a new ordered array of the columns
 
        // Loop over the columns and place them in order into the new array
        while (columnsCopy.length && columnOrderCopy.length) {
          const targetColumnId = columnOrderCopy.shift();
          const foundIndex = columnsCopy.findIndex(d => d.id === targetColumnId);
          if (foundIndex > -1) {
            orderedColumns.push(columnsCopy.splice(foundIndex, 1)[0]);
          }
        }
 
        // If there are any columns left, add them to the end
        orderedColumns = [...orderedColumns, ...columnsCopy];
      }
      return orderColumns(orderedColumns, grouping, groupedColumnMode);
    }, {
      key: "development" === 'development' && 'getOrderColumnsFn'
      // debug: () => table.options.debugAll ?? table.options.debugTable,
    });
  }
};
 
//
 
const defaultPageIndex = 0;
const defaultPageSize = 10;
const getDefaultPaginationState = () => ({
  pageIndex: defaultPageIndex,
  pageSize: defaultPageSize
});
const Pagination = {
  getInitialState: state => {
    return {
      ...state,
      pagination: {
        ...getDefaultPaginationState(),
        ...(state == null ? void 0 : state.pagination)
      }
    };
  },
  getDefaultOptions: table => {
    return {
      onPaginationChange: makeStateUpdater('pagination', table)
    };
  },
  createTable: table => {
    let registered = false;
    let queued = false;
    table._autoResetPageIndex = () => {
      var _ref, _table$options$autoRe;
      if (!registered) {
        table._queue(() => {
          registered = true;
        });
        return;
      }
      if ((_ref = (_table$options$autoRe = table.options.autoResetAll) != null ? _table$options$autoRe : table.options.autoResetPageIndex) != null ? _ref : !table.options.manualPagination) {
        if (queued) return;
        queued = true;
        table._queue(() => {
          table.resetPageIndex();
          queued = false;
        });
      }
    };
    table.setPagination = updater => {
      const safeUpdater = old => {
        let newState = functionalUpdate(updater, old);
        return newState;
      };
      return table.options.onPaginationChange == null ? void 0 : table.options.onPaginationChange(safeUpdater);
    };
    table.resetPagination = defaultState => {
      var _table$initialState$p;
      table.setPagination(defaultState ? getDefaultPaginationState() : (_table$initialState$p = table.initialState.pagination) != null ? _table$initialState$p : getDefaultPaginationState());
    };
    table.setPageIndex = updater => {
      table.setPagination(old => {
        let pageIndex = functionalUpdate(updater, old.pageIndex);
        const maxPageIndex = typeof table.options.pageCount === 'undefined' || table.options.pageCount === -1 ? Number.MAX_SAFE_INTEGER : table.options.pageCount - 1;
        pageIndex = Math.max(0, Math.min(pageIndex, maxPageIndex));
        return {
          ...old,
          pageIndex
        };
      });
    };
    table.resetPageIndex = defaultState => {
      var _table$initialState$p2, _table$initialState;
      table.setPageIndex(defaultState ? defaultPageIndex : (_table$initialState$p2 = (_table$initialState = table.initialState) == null || (_table$initialState = _table$initialState.pagination) == null ? void 0 : _table$initialState.pageIndex) != null ? _table$initialState$p2 : defaultPageIndex);
    };
    table.resetPageSize = defaultState => {
      var _table$initialState$p3, _table$initialState2;
      table.setPageSize(defaultState ? defaultPageSize : (_table$initialState$p3 = (_table$initialState2 = table.initialState) == null || (_table$initialState2 = _table$initialState2.pagination) == null ? void 0 : _table$initialState2.pageSize) != null ? _table$initialState$p3 : defaultPageSize);
    };
    table.setPageSize = updater => {
      table.setPagination(old => {
        const pageSize = Math.max(1, functionalUpdate(updater, old.pageSize));
        const topRowIndex = old.pageSize * old.pageIndex;
        const pageIndex = Math.floor(topRowIndex / pageSize);
        return {
          ...old,
          pageIndex,
          pageSize
        };
      });
    };
    table.setPageCount = updater => table.setPagination(old => {
      var _table$options$pageCo;
      let newPageCount = functionalUpdate(updater, (_table$options$pageCo = table.options.pageCount) != null ? _table$options$pageCo : -1);
      if (typeof newPageCount === 'number') {
        newPageCount = Math.max(-1, newPageCount);
      }
      return {
        ...old,
        pageCount: newPageCount
      };
    });
    table.getPageOptions = memo(() => [table.getPageCount()], pageCount => {
      let pageOptions = [];
      if (pageCount && pageCount > 0) {
        pageOptions = [...new Array(pageCount)].fill(null).map((_, i) => i);
      }
      return pageOptions;
    }, {
      key: "development" === 'development' && 'getPageOptions',
      debug: () => {
        var _table$options$debugA;
        return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
      }
    });
    table.getCanPreviousPage = () => table.getState().pagination.pageIndex > 0;
    table.getCanNextPage = () => {
      const {
        pageIndex
      } = table.getState().pagination;
      const pageCount = table.getPageCount();
      if (pageCount === -1) {
        return true;
      }
      if (pageCount === 0) {
        return false;
      }
      return pageIndex < pageCount - 1;
    };
    table.previousPage = () => {
      return table.setPageIndex(old => old - 1);
    };
    table.nextPage = () => {
      return table.setPageIndex(old => {
        return old + 1;
      });
    };
    table.getPrePaginationRowModel = () => table.getExpandedRowModel();
    table.getPaginationRowModel = () => {
      if (!table._getPaginationRowModel && table.options.getPaginationRowModel) {
        table._getPaginationRowModel = table.options.getPaginationRowModel(table);
      }
      if (table.options.manualPagination || !table._getPaginationRowModel) {
        return table.getPrePaginationRowModel();
      }
      return table._getPaginationRowModel();
    };
    table.getPageCount = () => {
      var _table$options$pageCo2;
      return (_table$options$pageCo2 = table.options.pageCount) != null ? _table$options$pageCo2 : Math.ceil(table.getPrePaginationRowModel().rows.length / table.getState().pagination.pageSize);
    };
  }
};
 
//
 
const getDefaultColumnPinningState = () => ({
  left: [],
  right: []
});
const getDefaultRowPinningState = () => ({
  top: [],
  bottom: []
});
const Pinning = {
  getInitialState: state => {
    return {
      columnPinning: getDefaultColumnPinningState(),
      rowPinning: getDefaultRowPinningState(),
      ...state
    };
  },
  getDefaultOptions: table => {
    return {
      onColumnPinningChange: makeStateUpdater('columnPinning', table),
      onRowPinningChange: makeStateUpdater('rowPinning', table)
    };
  },
  createColumn: (column, table) => {
    column.pin = position => {
      const columnIds = column.getLeafColumns().map(d => d.id).filter(Boolean);
      table.setColumnPinning(old => {
        var _old$left3, _old$right3;
        if (position === 'right') {
          var _old$left, _old$right;
          return {
            left: ((_old$left = old == null ? void 0 : old.left) != null ? _old$left : []).filter(d => !(columnIds != null && columnIds.includes(d))),
            right: [...((_old$right = old == null ? void 0 : old.right) != null ? _old$right : []).filter(d => !(columnIds != null && columnIds.includes(d))), ...columnIds]
          };
        }
        if (position === 'left') {
          var _old$left2, _old$right2;
          return {
            left: [...((_old$left2 = old == null ? void 0 : old.left) != null ? _old$left2 : []).filter(d => !(columnIds != null && columnIds.includes(d))), ...columnIds],
            right: ((_old$right2 = old == null ? void 0 : old.right) != null ? _old$right2 : []).filter(d => !(columnIds != null && columnIds.includes(d)))
          };
        }
        return {
          left: ((_old$left3 = old == null ? void 0 : old.left) != null ? _old$left3 : []).filter(d => !(columnIds != null && columnIds.includes(d))),
          right: ((_old$right3 = old == null ? void 0 : old.right) != null ? _old$right3 : []).filter(d => !(columnIds != null && columnIds.includes(d)))
        };
      });
    };
    column.getCanPin = () => {
      const leafColumns = column.getLeafColumns();
      return leafColumns.some(d => {
        var _d$columnDef$enablePi, _ref, _table$options$enable;
        return ((_d$columnDef$enablePi = d.columnDef.enablePinning) != null ? _d$columnDef$enablePi : true) && ((_ref = (_table$options$enable = table.options.enableColumnPinning) != null ? _table$options$enable : table.options.enablePinning) != null ? _ref : true);
      });
    };
    column.getIsPinned = () => {
      const leafColumnIds = column.getLeafColumns().map(d => d.id);
      const {
        left,
        right
      } = table.getState().columnPinning;
      const isLeft = leafColumnIds.some(d => left == null ? void 0 : left.includes(d));
      const isRight = leafColumnIds.some(d => right == null ? void 0 : right.includes(d));
      return isLeft ? 'left' : isRight ? 'right' : false;
    };
    column.getPinnedIndex = () => {
      var _table$getState$colum, _table$getState$colum2;
      const position = column.getIsPinned();
      return position ? (_table$getState$colum = (_table$getState$colum2 = table.getState().columnPinning) == null || (_table$getState$colum2 = _table$getState$colum2[position]) == null ? void 0 : _table$getState$colum2.indexOf(column.id)) != null ? _table$getState$colum : -1 : 0;
    };
  },
  createRow: (row, table) => {
    row.pin = (position, includeLeafRows, includeParentRows) => {
      const leafRowIds = includeLeafRows ? row.getLeafRows().map(_ref2 => {
        let {
          id
        } = _ref2;
        return id;
      }) : [];
      const parentRowIds = includeParentRows ? row.getParentRows().map(_ref3 => {
        let {
          id
        } = _ref3;
        return id;
      }) : [];
      const rowIds = new Set([...parentRowIds, row.id, ...leafRowIds]);
      table.setRowPinning(old => {
        var _old$top3, _old$bottom3;
        if (position === 'bottom') {
          var _old$top, _old$bottom;
          return {
            top: ((_old$top = old == null ? void 0 : old.top) != null ? _old$top : []).filter(d => !(rowIds != null && rowIds.has(d))),
            bottom: [...((_old$bottom = old == null ? void 0 : old.bottom) != null ? _old$bottom : []).filter(d => !(rowIds != null && rowIds.has(d))), ...Array.from(rowIds)]
          };
        }
        if (position === 'top') {
          var _old$top2, _old$bottom2;
          return {
            top: [...((_old$top2 = old == null ? void 0 : old.top) != null ? _old$top2 : []).filter(d => !(rowIds != null && rowIds.has(d))), ...Array.from(rowIds)],
            bottom: ((_old$bottom2 = old == null ? void 0 : old.bottom) != null ? _old$bottom2 : []).filter(d => !(rowIds != null && rowIds.has(d)))
          };
        }
        return {
          top: ((_old$top3 = old == null ? void 0 : old.top) != null ? _old$top3 : []).filter(d => !(rowIds != null && rowIds.has(d))),
          bottom: ((_old$bottom3 = old == null ? void 0 : old.bottom) != null ? _old$bottom3 : []).filter(d => !(rowIds != null && rowIds.has(d)))
        };
      });
    };
    row.getCanPin = () => {
      var _ref4;
      const {
        enableRowPinning,
        enablePinning
      } = table.options;
      if (typeof enableRowPinning === 'function') {
        return enableRowPinning(row);
      }
      return (_ref4 = enableRowPinning != null ? enableRowPinning : enablePinning) != null ? _ref4 : true;
    };
    row.getIsPinned = () => {
      const rowIds = [row.id];
      const {
        top,
        bottom
      } = table.getState().rowPinning;
      const isTop = rowIds.some(d => top == null ? void 0 : top.includes(d));
      const isBottom = rowIds.some(d => bottom == null ? void 0 : bottom.includes(d));
      return isTop ? 'top' : isBottom ? 'bottom' : false;
    };
    row.getPinnedIndex = () => {
      var _table$_getPinnedRows, _visiblePinnedRowIds$;
      const position = row.getIsPinned();
      if (!position) return -1;
      const visiblePinnedRowIds = (_table$_getPinnedRows = table._getPinnedRows(position)) == null ? void 0 : _table$_getPinnedRows.map(_ref5 => {
        let {
          id
        } = _ref5;
        return id;
      });
      return (_visiblePinnedRowIds$ = visiblePinnedRowIds == null ? void 0 : visiblePinnedRowIds.indexOf(row.id)) != null ? _visiblePinnedRowIds$ : -1;
    };
    row.getCenterVisibleCells = memo(() => [row._getAllVisibleCells(), table.getState().columnPinning.left, table.getState().columnPinning.right], (allCells, left, right) => {
      const leftAndRight = [...(left != null ? left : []), ...(right != null ? right : [])];
      return allCells.filter(d => !leftAndRight.includes(d.column.id));
    }, {
      key: "development" === 'development' && 'row.getCenterVisibleCells',
      debug: () => {
        var _table$options$debugA;
        return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugRows;
      }
    });
    row.getLeftVisibleCells = memo(() => [row._getAllVisibleCells(), table.getState().columnPinning.left,,], (allCells, left) => {
      const cells = (left != null ? left : []).map(columnId => allCells.find(cell => cell.column.id === columnId)).filter(Boolean).map(d => ({
        ...d,
        position: 'left'
      }));
      return cells;
    }, {
      key: "development" === 'development' && 'row.getLeftVisibleCells',
      debug: () => {
        var _table$options$debugA2;
        return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugRows;
      }
    });
    row.getRightVisibleCells = memo(() => [row._getAllVisibleCells(), table.getState().columnPinning.right], (allCells, right) => {
      const cells = (right != null ? right : []).map(columnId => allCells.find(cell => cell.column.id === columnId)).filter(Boolean).map(d => ({
        ...d,
        position: 'right'
      }));
      return cells;
    }, {
      key: "development" === 'development' && 'row.getRightVisibleCells',
      debug: () => {
        var _table$options$debugA3;
        return (_table$options$debugA3 = table.options.debugAll) != null ? _table$options$debugA3 : table.options.debugRows;
      }
    });
  },
  createTable: table => {
    table.setColumnPinning = updater => table.options.onColumnPinningChange == null ? void 0 : table.options.onColumnPinningChange(updater);
    table.resetColumnPinning = defaultState => {
      var _table$initialState$c, _table$initialState;
      return table.setColumnPinning(defaultState ? getDefaultColumnPinningState() : (_table$initialState$c = (_table$initialState = table.initialState) == null ? void 0 : _table$initialState.columnPinning) != null ? _table$initialState$c : getDefaultColumnPinningState());
    };
    table.getIsSomeColumnsPinned = position => {
      var _pinningState$positio;
      const pinningState = table.getState().columnPinning;
      if (!position) {
        var _pinningState$left, _pinningState$right;
        return Boolean(((_pinningState$left = pinningState.left) == null ? void 0 : _pinningState$left.length) || ((_pinningState$right = pinningState.right) == null ? void 0 : _pinningState$right.length));
      }
      return Boolean((_pinningState$positio = pinningState[position]) == null ? void 0 : _pinningState$positio.length);
    };
    table.getLeftLeafColumns = memo(() => [table.getAllLeafColumns(), table.getState().columnPinning.left], (allColumns, left) => {
      return (left != null ? left : []).map(columnId => allColumns.find(column => column.id === columnId)).filter(Boolean);
    }, {
      key: "development" === 'development' && 'getLeftLeafColumns',
      debug: () => {
        var _table$options$debugA4;
        return (_table$options$debugA4 = table.options.debugAll) != null ? _table$options$debugA4 : table.options.debugColumns;
      }
    });
    table.getRightLeafColumns = memo(() => [table.getAllLeafColumns(), table.getState().columnPinning.right], (allColumns, right) => {
      return (right != null ? right : []).map(columnId => allColumns.find(column => column.id === columnId)).filter(Boolean);
    }, {
      key: "development" === 'development' && 'getRightLeafColumns',
      debug: () => {
        var _table$options$debugA5;
        return (_table$options$debugA5 = table.options.debugAll) != null ? _table$options$debugA5 : table.options.debugColumns;
      }
    });
    table.getCenterLeafColumns = memo(() => [table.getAllLeafColumns(), table.getState().columnPinning.left, table.getState().columnPinning.right], (allColumns, left, right) => {
      const leftAndRight = [...(left != null ? left : []), ...(right != null ? right : [])];
      return allColumns.filter(d => !leftAndRight.includes(d.id));
    }, {
      key: "development" === 'development' && 'getCenterLeafColumns',
      debug: () => {
        var _table$options$debugA6;
        return (_table$options$debugA6 = table.options.debugAll) != null ? _table$options$debugA6 : table.options.debugColumns;
      }
    });
    table.setRowPinning = updater => table.options.onRowPinningChange == null ? void 0 : table.options.onRowPinningChange(updater);
    table.resetRowPinning = defaultState => {
      var _table$initialState$r, _table$initialState2;
      return table.setRowPinning(defaultState ? getDefaultRowPinningState() : (_table$initialState$r = (_table$initialState2 = table.initialState) == null ? void 0 : _table$initialState2.rowPinning) != null ? _table$initialState$r : getDefaultRowPinningState());
    };
    table.getIsSomeRowsPinned = position => {
      var _pinningState$positio2;
      const pinningState = table.getState().rowPinning;
      if (!position) {
        var _pinningState$top, _pinningState$bottom;
        return Boolean(((_pinningState$top = pinningState.top) == null ? void 0 : _pinningState$top.length) || ((_pinningState$bottom = pinningState.bottom) == null ? void 0 : _pinningState$bottom.length));
      }
      return Boolean((_pinningState$positio2 = pinningState[position]) == null ? void 0 : _pinningState$positio2.length);
    };
    table._getPinnedRows = position => memo(() => [table.getRowModel().rows, table.getState().rowPinning[position]], (visibleRows, pinnedRowIds) => {
      var _table$options$keepPi;
      const rows = ((_table$options$keepPi = table.options.keepPinnedRows) != null ? _table$options$keepPi : true) ?
      //get all rows that are pinned even if they would not be otherwise visible
      //account for expanded parent rows, but not pagination or filtering
      (pinnedRowIds != null ? pinnedRowIds : []).map(rowId => {
        const row = table.getRow(rowId, true);
        return row.getIsAllParentsExpanded() ? row : null;
      }) :
      //else get only visible rows that are pinned
      (pinnedRowIds != null ? pinnedRowIds : []).map(rowId => visibleRows.find(row => row.id === rowId));
      return rows.filter(Boolean).map(d => ({
        ...d,
        position
      }));
    }, {
      key: "development" === 'development' && `row.get${position === 'top' ? 'Top' : 'Bottom'}Rows`,
      debug: () => {
        var _table$options$debugA7;
        return (_table$options$debugA7 = table.options.debugAll) != null ? _table$options$debugA7 : table.options.debugRows;
      }
    })();
    table.getTopRows = () => table._getPinnedRows('top');
    table.getBottomRows = () => table._getPinnedRows('bottom');
    table.getCenterRows = memo(() => [table.getRowModel().rows, table.getState().rowPinning.top, table.getState().rowPinning.bottom], (allRows, top, bottom) => {
      const topAndBottom = new Set([...(top != null ? top : []), ...(bottom != null ? bottom : [])]);
      return allRows.filter(d => !topAndBottom.has(d.id));
    }, {
      key: "development" === 'development' && 'row.getCenterRows',
      debug: () => {
        var _table$options$debugA8;
        return (_table$options$debugA8 = table.options.debugAll) != null ? _table$options$debugA8 : table.options.debugRows;
      }
    });
  }
};
 
//
 
const RowSelection = {
  getInitialState: state => {
    return {
      rowSelection: {},
      ...state
    };
  },
  getDefaultOptions: table => {
    return {
      onRowSelectionChange: makeStateUpdater('rowSelection', table),
      enableRowSelection: true,
      enableMultiRowSelection: true,
      enableSubRowSelection: true
      // enableGroupingRowSelection: false,
      // isAdditiveSelectEvent: (e: unknown) => !!e.metaKey,
      // isInclusiveSelectEvent: (e: unknown) => !!e.shiftKey,
    };
  },
 
  createTable: table => {
    table.setRowSelection = updater => table.options.onRowSelectionChange == null ? void 0 : table.options.onRowSelectionChange(updater);
    table.resetRowSelection = defaultState => {
      var _table$initialState$r;
      return table.setRowSelection(defaultState ? {} : (_table$initialState$r = table.initialState.rowSelection) != null ? _table$initialState$r : {});
    };
    table.toggleAllRowsSelected = value => {
      table.setRowSelection(old => {
        value = typeof value !== 'undefined' ? value : !table.getIsAllRowsSelected();
        const rowSelection = {
          ...old
        };
        const preGroupedFlatRows = table.getPreGroupedRowModel().flatRows;
 
        // We don't use `mutateRowIsSelected` here for performance reasons.
        // All of the rows are flat already, so it wouldn't be worth it
        if (value) {
          preGroupedFlatRows.forEach(row => {
            if (!row.getCanSelect()) {
              return;
            }
            rowSelection[row.id] = true;
          });
        } else {
          preGroupedFlatRows.forEach(row => {
            delete rowSelection[row.id];
          });
        }
        return rowSelection;
      });
    };
    table.toggleAllPageRowsSelected = value => table.setRowSelection(old => {
      const resolvedValue = typeof value !== 'undefined' ? value : !table.getIsAllPageRowsSelected();
      const rowSelection = {
        ...old
      };
      table.getRowModel().rows.forEach(row => {
        mutateRowIsSelected(rowSelection, row.id, resolvedValue, true, table);
      });
      return rowSelection;
    });
 
    // addRowSelectionRange: rowId => {
    //   const {
    //     rows,
    //     rowsById,
    //     options: { selectGroupingRows, selectSubRows },
    //   } = table
 
    //   const findSelectedRow = (rows: Row[]) => {
    //     let found
    //     rows.find(d => {
    //       if (d.getIsSelected()) {
    //         found = d
    //         return true
    //       }
    //       const subFound = findSelectedRow(d.subRows || [])
    //       if (subFound) {
    //         found = subFound
    //         return true
    //       }
    //       return false
    //     })
    //     return found
    //   }
 
    //   const firstRow = findSelectedRow(rows) || rows[0]
    //   const lastRow = rowsById[rowId]
 
    //   let include = false
    //   const selectedRowIds = {}
 
    //   const addRow = (row: Row) => {
    //     mutateRowIsSelected(selectedRowIds, row.id, true, {
    //       rowsById,
    //       selectGroupingRows: selectGroupingRows!,
    //       selectSubRows: selectSubRows!,
    //     })
    //   }
 
    //   table.rows.forEach(row => {
    //     const isFirstRow = row.id === firstRow.id
    //     const isLastRow = row.id === lastRow.id
 
    //     if (isFirstRow || isLastRow) {
    //       if (!include) {
    //         include = true
    //       } else if (include) {
    //         addRow(row)
    //         include = false
    //       }
    //     }
 
    //     if (include) {
    //       addRow(row)
    //     }
    //   })
 
    //   table.setRowSelection(selectedRowIds)
    // },
    table.getPreSelectedRowModel = () => table.getCoreRowModel();
    table.getSelectedRowModel = memo(() => [table.getState().rowSelection, table.getCoreRowModel()], (rowSelection, rowModel) => {
      if (!Object.keys(rowSelection).length) {
        return {
          rows: [],
          flatRows: [],
          rowsById: {}
        };
      }
      return selectRowsFn(table, rowModel);
    }, {
      key: "development" === 'development' && 'getSelectedRowModel',
      debug: () => {
        var _table$options$debugA;
        return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
      }
    });
    table.getFilteredSelectedRowModel = memo(() => [table.getState().rowSelection, table.getFilteredRowModel()], (rowSelection, rowModel) => {
      if (!Object.keys(rowSelection).length) {
        return {
          rows: [],
          flatRows: [],
          rowsById: {}
        };
      }
      return selectRowsFn(table, rowModel);
    }, {
      key: "development" === 'production' && 'getFilteredSelectedRowModel',
      debug: () => {
        var _table$options$debugA2;
        return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugTable;
      }
    });
    table.getGroupedSelectedRowModel = memo(() => [table.getState().rowSelection, table.getSortedRowModel()], (rowSelection, rowModel) => {
      if (!Object.keys(rowSelection).length) {
        return {
          rows: [],
          flatRows: [],
          rowsById: {}
        };
      }
      return selectRowsFn(table, rowModel);
    }, {
      key: "development" === 'production' && 'getGroupedSelectedRowModel',
      debug: () => {
        var _table$options$debugA3;
        return (_table$options$debugA3 = table.options.debugAll) != null ? _table$options$debugA3 : table.options.debugTable;
      }
    });
 
    ///
 
    // getGroupingRowCanSelect: rowId => {
    //   const row = table.getRow(rowId)
 
    //   if (!row) {
    //     throw new Error()
    //   }
 
    //   if (typeof table.options.enableGroupingRowSelection === 'function') {
    //     return table.options.enableGroupingRowSelection(row)
    //   }
 
    //   return table.options.enableGroupingRowSelection ?? false
    // },
 
    table.getIsAllRowsSelected = () => {
      const preGroupedFlatRows = table.getFilteredRowModel().flatRows;
      const {
        rowSelection
      } = table.getState();
      let isAllRowsSelected = Boolean(preGroupedFlatRows.length && Object.keys(rowSelection).length);
      if (isAllRowsSelected) {
        if (preGroupedFlatRows.some(row => row.getCanSelect() && !rowSelection[row.id])) {
          isAllRowsSelected = false;
        }
      }
      return isAllRowsSelected;
    };
    table.getIsAllPageRowsSelected = () => {
      const paginationFlatRows = table.getPaginationRowModel().flatRows.filter(row => row.getCanSelect());
      const {
        rowSelection
      } = table.getState();
      let isAllPageRowsSelected = !!paginationFlatRows.length;
      if (isAllPageRowsSelected && paginationFlatRows.some(row => !rowSelection[row.id])) {
        isAllPageRowsSelected = false;
      }
      return isAllPageRowsSelected;
    };
    table.getIsSomeRowsSelected = () => {
      var _table$getState$rowSe;
      const totalSelected = Object.keys((_table$getState$rowSe = table.getState().rowSelection) != null ? _table$getState$rowSe : {}).length;
      return totalSelected > 0 && totalSelected < table.getFilteredRowModel().flatRows.length;
    };
    table.getIsSomePageRowsSelected = () => {
      const paginationFlatRows = table.getPaginationRowModel().flatRows;
      return table.getIsAllPageRowsSelected() ? false : paginationFlatRows.filter(row => row.getCanSelect()).some(d => d.getIsSelected() || d.getIsSomeSelected());
    };
    table.getToggleAllRowsSelectedHandler = () => {
      return e => {
        table.toggleAllRowsSelected(e.target.checked);
      };
    };
    table.getToggleAllPageRowsSelectedHandler = () => {
      return e => {
        table.toggleAllPageRowsSelected(e.target.checked);
      };
    };
  },
  createRow: (row, table) => {
    row.toggleSelected = (value, opts) => {
      const isSelected = row.getIsSelected();
      table.setRowSelection(old => {
        var _opts$selectChildren;
        value = typeof value !== 'undefined' ? value : !isSelected;
        if (row.getCanSelect() && isSelected === value) {
          return old;
        }
        const selectedRowIds = {
          ...old
        };
        mutateRowIsSelected(selectedRowIds, row.id, value, (_opts$selectChildren = opts == null ? void 0 : opts.selectChildren) != null ? _opts$selectChildren : true, table);
        return selectedRowIds;
      });
    };
    row.getIsSelected = () => {
      const {
        rowSelection
      } = table.getState();
      return isRowSelected(row, rowSelection);
    };
    row.getIsSomeSelected = () => {
      const {
        rowSelection
      } = table.getState();
      return isSubRowSelected(row, rowSelection) === 'some';
    };
    row.getIsAllSubRowsSelected = () => {
      const {
        rowSelection
      } = table.getState();
      return isSubRowSelected(row, rowSelection) === 'all';
    };
    row.getCanSelect = () => {
      var _table$options$enable;
      if (typeof table.options.enableRowSelection === 'function') {
        return table.options.enableRowSelection(row);
      }
      return (_table$options$enable = table.options.enableRowSelection) != null ? _table$options$enable : true;
    };
    row.getCanSelectSubRows = () => {
      var _table$options$enable2;
      if (typeof table.options.enableSubRowSelection === 'function') {
        return table.options.enableSubRowSelection(row);
      }
      return (_table$options$enable2 = table.options.enableSubRowSelection) != null ? _table$options$enable2 : true;
    };
    row.getCanMultiSelect = () => {
      var _table$options$enable3;
      if (typeof table.options.enableMultiRowSelection === 'function') {
        return table.options.enableMultiRowSelection(row);
      }
      return (_table$options$enable3 = table.options.enableMultiRowSelection) != null ? _table$options$enable3 : true;
    };
    row.getToggleSelectedHandler = () => {
      const canSelect = row.getCanSelect();
      return e => {
        var _target;
        if (!canSelect) return;
        row.toggleSelected((_target = e.target) == null ? void 0 : _target.checked);
      };
    };
  }
};
const mutateRowIsSelected = (selectedRowIds, id, value, includeChildren, table) => {
  var _row$subRows;
  const row = table.getRow(id);
 
  // const isGrouped = row.getIsGrouped()
 
  // if ( // TODO: enforce grouping row selection rules
  //   !isGrouped ||
  //   (isGrouped && table.options.enableGroupingRowSelection)
  // ) {
  if (value) {
    if (!row.getCanMultiSelect()) {
      Object.keys(selectedRowIds).forEach(key => delete selectedRowIds[key]);
    }
    if (row.getCanSelect()) {
      selectedRowIds[id] = true;
    }
  } else {
    delete selectedRowIds[id];
  }
  // }
 
  if (includeChildren && (_row$subRows = row.subRows) != null && _row$subRows.length && row.getCanSelectSubRows()) {
    row.subRows.forEach(row => mutateRowIsSelected(selectedRowIds, row.id, value, includeChildren, table));
  }
};
function selectRowsFn(table, rowModel) {
  const rowSelection = table.getState().rowSelection;
  const newSelectedFlatRows = [];
  const newSelectedRowsById = {};
 
  // Filters top level and nested rows
  const recurseRows = function (rows, depth) {
    return rows.map(row => {
      var _row$subRows2;
      const isSelected = isRowSelected(row, rowSelection);
      if (isSelected) {
        newSelectedFlatRows.push(row);
        newSelectedRowsById[row.id] = row;
      }
      if ((_row$subRows2 = row.subRows) != null && _row$subRows2.length) {
        row = {
          ...row,
          subRows: recurseRows(row.subRows)
        };
      }
      if (isSelected) {
        return row;
      }
    }).filter(Boolean);
  };
  return {
    rows: recurseRows(rowModel.rows),
    flatRows: newSelectedFlatRows,
    rowsById: newSelectedRowsById
  };
}
function isRowSelected(row, selection) {
  var _selection$row$id;
  return (_selection$row$id = selection[row.id]) != null ? _selection$row$id : false;
}
function isSubRowSelected(row, selection, table) {
  var _row$subRows3;
  if (!((_row$subRows3 = row.subRows) != null && _row$subRows3.length)) return false;
  let allChildrenSelected = true;
  let someSelected = false;
  row.subRows.forEach(subRow => {
    // Bail out early if we know both of these
    if (someSelected && !allChildrenSelected) {
      return;
    }
    if (subRow.getCanSelect()) {
      if (isRowSelected(subRow, selection)) {
        someSelected = true;
      } else {
        allChildrenSelected = false;
      }
    }
 
    // Check row selection of nested subrows
    if (subRow.subRows && subRow.subRows.length) {
      const subRowChildrenSelected = isSubRowSelected(subRow, selection);
      if (subRowChildrenSelected === 'all') {
        someSelected = true;
      } else if (subRowChildrenSelected === 'some') {
        someSelected = true;
        allChildrenSelected = false;
      } else {
        allChildrenSelected = false;
      }
    }
  });
  return allChildrenSelected ? 'all' : someSelected ? 'some' : false;
}
 
const reSplitAlphaNumeric = /([0-9]+)/gm;
const alphanumeric = (rowA, rowB, columnId) => {
  return compareAlphanumeric(toString(rowA.getValue(columnId)).toLowerCase(), toString(rowB.getValue(columnId)).toLowerCase());
};
const alphanumericCaseSensitive = (rowA, rowB, columnId) => {
  return compareAlphanumeric(toString(rowA.getValue(columnId)), toString(rowB.getValue(columnId)));
};
 
// The text filter is more basic (less numeric support)
// but is much faster
const text = (rowA, rowB, columnId) => {
  return compareBasic(toString(rowA.getValue(columnId)).toLowerCase(), toString(rowB.getValue(columnId)).toLowerCase());
};
 
// The text filter is more basic (less numeric support)
// but is much faster
const textCaseSensitive = (rowA, rowB, columnId) => {
  return compareBasic(toString(rowA.getValue(columnId)), toString(rowB.getValue(columnId)));
};
const datetime = (rowA, rowB, columnId) => {
  const a = rowA.getValue(columnId);
  const b = rowB.getValue(columnId);
 
  // Can handle nullish values
  // Use > and < because == (and ===) doesn't work with
  // Date objects (would require calling getTime()).
  return a > b ? 1 : a < b ? -1 : 0;
};
const basic = (rowA, rowB, columnId) => {
  return compareBasic(rowA.getValue(columnId), rowB.getValue(columnId));
};
 
// Utils
 
function compareBasic(a, b) {
  return a === b ? 0 : a > b ? 1 : -1;
}
function toString(a) {
  if (typeof a === 'number') {
    if (isNaN(a) || a === Infinity || a === -Infinity) {
      return '';
    }
    return String(a);
  }
  if (typeof a === 'string') {
    return a;
  }
  return '';
}
 
// Mixed sorting is slow, but very inclusive of many edge cases.
// It handles numbers, mixed alphanumeric combinations, and even
// null, undefined, and Infinity
function compareAlphanumeric(aStr, bStr) {
  // Split on number groups, but keep the delimiter
  // Then remove falsey split values
  const a = aStr.split(reSplitAlphaNumeric).filter(Boolean);
  const b = bStr.split(reSplitAlphaNumeric).filter(Boolean);
 
  // While
  while (a.length && b.length) {
    const aa = a.shift();
    const bb = b.shift();
    const an = parseInt(aa, 10);
    const bn = parseInt(bb, 10);
    const combo = [an, bn].sort();
 
    // Both are string
    if (isNaN(combo[0])) {
      if (aa > bb) {
        return 1;
      }
      if (bb > aa) {
        return -1;
      }
      continue;
    }
 
    // One is a string, one is a number
    if (isNaN(combo[1])) {
      return isNaN(an) ? -1 : 1;
    }
 
    // Both are numbers
    if (an > bn) {
      return 1;
    }
    if (bn > an) {
      return -1;
    }
  }
  return a.length - b.length;
}
 
// Exports
 
const sortingFns = {
  alphanumeric,
  alphanumericCaseSensitive,
  text,
  textCaseSensitive,
  datetime,
  basic
};
 
//
 
const Sorting = {
  getInitialState: state => {
    return {
      sorting: [],
      ...state
    };
  },
  getDefaultColumnDef: () => {
    return {
      sortingFn: 'auto',
      sortUndefined: 1
    };
  },
  getDefaultOptions: table => {
    return {
      onSortingChange: makeStateUpdater('sorting', table),
      isMultiSortEvent: e => {
        return e.shiftKey;
      }
    };
  },
  createColumn: (column, table) => {
    column.getAutoSortingFn = () => {
      const firstRows = table.getFilteredRowModel().flatRows.slice(10);
      let isString = false;
      for (const row of firstRows) {
        const value = row == null ? void 0 : row.getValue(column.id);
        if (Object.prototype.toString.call(value) === '[object Date]') {
          return sortingFns.datetime;
        }
        if (typeof value === 'string') {
          isString = true;
          if (value.split(reSplitAlphaNumeric).length > 1) {
            return sortingFns.alphanumeric;
          }
        }
      }
      if (isString) {
        return sortingFns.text;
      }
      return sortingFns.basic;
    };
    column.getAutoSortDir = () => {
      const firstRow = table.getFilteredRowModel().flatRows[0];
      const value = firstRow == null ? void 0 : firstRow.getValue(column.id);
      if (typeof value === 'string') {
        return 'asc';
      }
      return 'desc';
    };
    column.getSortingFn = () => {
      var _table$options$sortin, _table$options$sortin2;
      if (!column) {
        throw new Error();
      }
      return isFunction(column.columnDef.sortingFn) ? column.columnDef.sortingFn : column.columnDef.sortingFn === 'auto' ? column.getAutoSortingFn() : (_table$options$sortin = (_table$options$sortin2 = table.options.sortingFns) == null ? void 0 : _table$options$sortin2[column.columnDef.sortingFn]) != null ? _table$options$sortin : sortingFns[column.columnDef.sortingFn];
    };
    column.toggleSorting = (desc, multi) => {
      // if (column.columns.length) {
      //   column.columns.forEach((c, i) => {
      //     if (c.id) {
      //       table.toggleColumnSorting(c.id, undefined, multi || !!i)
      //     }
      //   })
      //   return
      // }
 
      // this needs to be outside of table.setSorting to be in sync with rerender
      const nextSortingOrder = column.getNextSortingOrder();
      const hasManualValue = typeof desc !== 'undefined' && desc !== null;
      table.setSorting(old => {
        // Find any existing sorting for this column
        const existingSorting = old == null ? void 0 : old.find(d => d.id === column.id);
        const existingIndex = old == null ? void 0 : old.findIndex(d => d.id === column.id);
        let newSorting = [];
 
        // What should we do with this sort action?
        let sortAction;
        let nextDesc = hasManualValue ? desc : nextSortingOrder === 'desc';
 
        // Multi-mode
        if (old != null && old.length && column.getCanMultiSort() && multi) {
          if (existingSorting) {
            sortAction = 'toggle';
          } else {
            sortAction = 'add';
          }
        } else {
          // Normal mode
          if (old != null && old.length && existingIndex !== old.length - 1) {
            sortAction = 'replace';
          } else if (existingSorting) {
            sortAction = 'toggle';
          } else {
            sortAction = 'replace';
          }
        }
 
        // Handle toggle states that will remove the sorting
        if (sortAction === 'toggle') {
          // If we are "actually" toggling (not a manual set value), should we remove the sorting?
          if (!hasManualValue) {
            // Is our intention to remove?
            if (!nextSortingOrder) {
              sortAction = 'remove';
            }
          }
        }
        if (sortAction === 'add') {
          var _table$options$maxMul;
          newSorting = [...old, {
            id: column.id,
            desc: nextDesc
          }];
          // Take latest n columns
          newSorting.splice(0, newSorting.length - ((_table$options$maxMul = table.options.maxMultiSortColCount) != null ? _table$options$maxMul : Number.MAX_SAFE_INTEGER));
        } else if (sortAction === 'toggle') {
          // This flips (or sets) the
          newSorting = old.map(d => {
            if (d.id === column.id) {
              return {
                ...d,
                desc: nextDesc
              };
            }
            return d;
          });
        } else if (sortAction === 'remove') {
          newSorting = old.filter(d => d.id !== column.id);
        } else {
          newSorting = [{
            id: column.id,
            desc: nextDesc
          }];
        }
        return newSorting;
      });
    };
    column.getFirstSortDir = () => {
      var _ref, _column$columnDef$sor;
      const sortDescFirst = (_ref = (_column$columnDef$sor = column.columnDef.sortDescFirst) != null ? _column$columnDef$sor : table.options.sortDescFirst) != null ? _ref : column.getAutoSortDir() === 'desc';
      return sortDescFirst ? 'desc' : 'asc';
    };
    column.getNextSortingOrder = multi => {
      var _table$options$enable, _table$options$enable2;
      const firstSortDirection = column.getFirstSortDir();
      const isSorted = column.getIsSorted();
      if (!isSorted) {
        return firstSortDirection;
      }
      if (isSorted !== firstSortDirection && ((_table$options$enable = table.options.enableSortingRemoval) != null ? _table$options$enable : true) && (
      // If enableSortRemove, enable in general
      multi ? (_table$options$enable2 = table.options.enableMultiRemove) != null ? _table$options$enable2 : true : true) // If multi, don't allow if enableMultiRemove))
      ) {
        return false;
      }
      return isSorted === 'desc' ? 'asc' : 'desc';
    };
    column.getCanSort = () => {
      var _column$columnDef$ena, _table$options$enable3;
      return ((_column$columnDef$ena = column.columnDef.enableSorting) != null ? _column$columnDef$ena : true) && ((_table$options$enable3 = table.options.enableSorting) != null ? _table$options$enable3 : true) && !!column.accessorFn;
    };
    column.getCanMultiSort = () => {
      var _ref2, _column$columnDef$ena2;
      return (_ref2 = (_column$columnDef$ena2 = column.columnDef.enableMultiSort) != null ? _column$columnDef$ena2 : table.options.enableMultiSort) != null ? _ref2 : !!column.accessorFn;
    };
    column.getIsSorted = () => {
      var _table$getState$sorti;
      const columnSort = (_table$getState$sorti = table.getState().sorting) == null ? void 0 : _table$getState$sorti.find(d => d.id === column.id);
      return !columnSort ? false : columnSort.desc ? 'desc' : 'asc';
    };
    column.getSortIndex = () => {
      var _table$getState$sorti2, _table$getState$sorti3;
      return (_table$getState$sorti2 = (_table$getState$sorti3 = table.getState().sorting) == null ? void 0 : _table$getState$sorti3.findIndex(d => d.id === column.id)) != null ? _table$getState$sorti2 : -1;
    };
    column.clearSorting = () => {
      //clear sorting for just 1 column
      table.setSorting(old => old != null && old.length ? old.filter(d => d.id !== column.id) : []);
    };
    column.getToggleSortingHandler = () => {
      const canSort = column.getCanSort();
      return e => {
        if (!canSort) return;
        e.persist == null || e.persist();
        column.toggleSorting == null || column.toggleSorting(undefined, column.getCanMultiSort() ? table.options.isMultiSortEvent == null ? void 0 : table.options.isMultiSortEvent(e) : false);
      };
    };
  },
  createTable: table => {
    table.setSorting = updater => table.options.onSortingChange == null ? void 0 : table.options.onSortingChange(updater);
    table.resetSorting = defaultState => {
      var _table$initialState$s, _table$initialState;
      table.setSorting(defaultState ? [] : (_table$initialState$s = (_table$initialState = table.initialState) == null ? void 0 : _table$initialState.sorting) != null ? _table$initialState$s : []);
    };
    table.getPreSortedRowModel = () => table.getGroupedRowModel();
    table.getSortedRowModel = () => {
      if (!table._getSortedRowModel && table.options.getSortedRowModel) {
        table._getSortedRowModel = table.options.getSortedRowModel(table);
      }
      if (table.options.manualSorting || !table._getSortedRowModel) {
        return table.getPreSortedRowModel();
      }
      return table._getSortedRowModel();
    };
  }
};
 
//
 
const Visibility = {
  getInitialState: state => {
    return {
      columnVisibility: {},
      ...state
    };
  },
  getDefaultOptions: table => {
    return {
      onColumnVisibilityChange: makeStateUpdater('columnVisibility', table)
    };
  },
  createColumn: (column, table) => {
    column.toggleVisibility = value => {
      if (column.getCanHide()) {
        table.setColumnVisibility(old => ({
          ...old,
          [column.id]: value != null ? value : !column.getIsVisible()
        }));
      }
    };
    column.getIsVisible = () => {
      var _table$getState$colum, _table$getState$colum2;
      return (_table$getState$colum = (_table$getState$colum2 = table.getState().columnVisibility) == null ? void 0 : _table$getState$colum2[column.id]) != null ? _table$getState$colum : true;
    };
    column.getCanHide = () => {
      var _column$columnDef$ena, _table$options$enable;
      return ((_column$columnDef$ena = column.columnDef.enableHiding) != null ? _column$columnDef$ena : true) && ((_table$options$enable = table.options.enableHiding) != null ? _table$options$enable : true);
    };
    column.getToggleVisibilityHandler = () => {
      return e => {
        column.toggleVisibility == null || column.toggleVisibility(e.target.checked);
      };
    };
  },
  createRow: (row, table) => {
    row._getAllVisibleCells = memo(() => [row.getAllCells(), table.getState().columnVisibility], cells => {
      return cells.filter(cell => cell.column.getIsVisible());
    }, {
      key: "development" === 'production' && 'row._getAllVisibleCells',
      debug: () => {
        var _table$options$debugA;
        return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugRows;
      }
    });
    row.getVisibleCells = memo(() => [row.getLeftVisibleCells(), row.getCenterVisibleCells(), row.getRightVisibleCells()], (left, center, right) => [...left, ...center, ...right], {
      key: "development" === 'development' && 'row.getVisibleCells',
      debug: () => {
        var _table$options$debugA2;
        return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugRows;
      }
    });
  },
  createTable: table => {
    const makeVisibleColumnsMethod = (key, getColumns) => {
      return memo(() => [getColumns(), getColumns().filter(d => d.getIsVisible()).map(d => d.id).join('_')], columns => {
        return columns.filter(d => d.getIsVisible == null ? void 0 : d.getIsVisible());
      }, {
        key,
        debug: () => {
          var _table$options$debugA3;
          return (_table$options$debugA3 = table.options.debugAll) != null ? _table$options$debugA3 : table.options.debugColumns;
        }
      });
    };
    table.getVisibleFlatColumns = makeVisibleColumnsMethod('getVisibleFlatColumns', () => table.getAllFlatColumns());
    table.getVisibleLeafColumns = makeVisibleColumnsMethod('getVisibleLeafColumns', () => table.getAllLeafColumns());
    table.getLeftVisibleLeafColumns = makeVisibleColumnsMethod('getLeftVisibleLeafColumns', () => table.getLeftLeafColumns());
    table.getRightVisibleLeafColumns = makeVisibleColumnsMethod('getRightVisibleLeafColumns', () => table.getRightLeafColumns());
    table.getCenterVisibleLeafColumns = makeVisibleColumnsMethod('getCenterVisibleLeafColumns', () => table.getCenterLeafColumns());
    table.setColumnVisibility = updater => table.options.onColumnVisibilityChange == null ? void 0 : table.options.onColumnVisibilityChange(updater);
    table.resetColumnVisibility = defaultState => {
      var _table$initialState$c;
      table.setColumnVisibility(defaultState ? {} : (_table$initialState$c = table.initialState.columnVisibility) != null ? _table$initialState$c : {});
    };
    table.toggleAllColumnsVisible = value => {
      var _value;
      value = (_value = value) != null ? _value : !table.getIsAllColumnsVisible();
      table.setColumnVisibility(table.getAllLeafColumns().reduce((obj, column) => ({
        ...obj,
        [column.id]: !value ? !(column.getCanHide != null && column.getCanHide()) : value
      }), {}));
    };
    table.getIsAllColumnsVisible = () => !table.getAllLeafColumns().some(column => !(column.getIsVisible != null && column.getIsVisible()));
    table.getIsSomeColumnsVisible = () => table.getAllLeafColumns().some(column => column.getIsVisible == null ? void 0 : column.getIsVisible());
    table.getToggleAllColumnsVisibilityHandler = () => {
      return e => {
        var _target;
        table.toggleAllColumnsVisible((_target = e.target) == null ? void 0 : _target.checked);
      };
    };
  }
};
 
const features = [Headers, Visibility, Ordering, Pinning, Filters, Sorting, Grouping, Expanding, Pagination, RowSelection, ColumnSizing];
 
//
 
function createTable(options) {
  var _options$initialState;
  if (options.debugAll || options.debugTable) {
    console.info('Creating Table Instance...');
  }
  let table = {
    _features: features
  };
  const defaultOptions = table._features.reduce((obj, feature) => {
    return Object.assign(obj, feature.getDefaultOptions == null ? void 0 : feature.getDefaultOptions(table));
  }, {});
  const mergeOptions = options => {
    if (table.options.mergeOptions) {
      return table.options.mergeOptions(defaultOptions, options);
    }
    return {
      ...defaultOptions,
      ...options
    };
  };
  const coreInitialState = {};
  let initialState = {
    ...coreInitialState,
    ...((_options$initialState = options.initialState) != null ? _options$initialState : {})
  };
  table._features.forEach(feature => {
    var _feature$getInitialSt;
    initialState = (_feature$getInitialSt = feature.getInitialState == null ? void 0 : feature.getInitialState(initialState)) != null ? _feature$getInitialSt : initialState;
  });
  const queued = [];
  let queuedTimeout = false;
  const coreInstance = {
    _features: features,
    options: {
      ...defaultOptions,
      ...options
    },
    initialState,
    _queue: cb => {
      queued.push(cb);
      if (!queuedTimeout) {
        queuedTimeout = true;
 
        // Schedule a microtask to run the queued callbacks after
        // the current call stack (render, etc) has finished.
        Promise.resolve().then(() => {
          while (queued.length) {
            queued.shift()();
          }
          queuedTimeout = false;
        }).catch(error => setTimeout(() => {
          throw error;
        }));
      }
    },
    reset: () => {
      table.setState(table.initialState);
    },
    setOptions: updater => {
      const newOptions = functionalUpdate(updater, table.options);
      table.options = mergeOptions(newOptions);
    },
    getState: () => {
      return table.options.state;
    },
    setState: updater => {
      table.options.onStateChange == null || table.options.onStateChange(updater);
    },
    _getRowId: (row, index, parent) => {
      var _table$options$getRow;
      return (_table$options$getRow = table.options.getRowId == null ? void 0 : table.options.getRowId(row, index, parent)) != null ? _table$options$getRow : `${parent ? [parent.id, index].join('.') : index}`;
    },
    getCoreRowModel: () => {
      if (!table._getCoreRowModel) {
        table._getCoreRowModel = table.options.getCoreRowModel(table);
      }
      return table._getCoreRowModel();
    },
    // The final calls start at the bottom of the model,
    // expanded rows, which then work their way up
 
    getRowModel: () => {
      return table.getPaginationRowModel();
    },
    getRow: (id, searchAll) => {
      const row = (searchAll ? table.getCoreRowModel() : table.getRowModel()).rowsById[id];
      if (!row) {
        if ("development" !== 'production') {
          throw new Error(`getRow expected an ID, but got ${id}`);
        }
        throw new Error();
      }
      return row;
    },
    _getDefaultColumnDef: memo(() => [table.options.defaultColumn], defaultColumn => {
      var _defaultColumn;
      defaultColumn = (_defaultColumn = defaultColumn) != null ? _defaultColumn : {};
      return {
        header: props => {
          const resolvedColumnDef = props.header.column.columnDef;
          if (resolvedColumnDef.accessorKey) {
            return resolvedColumnDef.accessorKey;
          }
          if (resolvedColumnDef.accessorFn) {
            return resolvedColumnDef.id;
          }
          return null;
        },
        // footer: props => props.header.column.id,
        cell: props => {
          var _props$renderValue$to, _props$renderValue;
          return (_props$renderValue$to = (_props$renderValue = props.renderValue()) == null || _props$renderValue.toString == null ? void 0 : _props$renderValue.toString()) != null ? _props$renderValue$to : null;
        },
        ...table._features.reduce((obj, feature) => {
          return Object.assign(obj, feature.getDefaultColumnDef == null ? void 0 : feature.getDefaultColumnDef());
        }, {}),
        ...defaultColumn
      };
    }, {
      debug: () => {
        var _table$options$debugA;
        return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugColumns;
      },
      key: "development" === 'development' && 'getDefaultColumnDef'
    }),
    _getColumnDefs: () => table.options.columns,
    getAllColumns: memo(() => [table._getColumnDefs()], columnDefs => {
      const recurseColumns = function (columnDefs, parent, depth) {
        if (depth === void 0) {
          depth = 0;
        }
        return columnDefs.map(columnDef => {
          const column = createColumn(table, columnDef, depth, parent);
          const groupingColumnDef = columnDef;
          column.columns = groupingColumnDef.columns ? recurseColumns(groupingColumnDef.columns, column, depth + 1) : [];
          return column;
        });
      };
      return recurseColumns(columnDefs);
    }, {
      key: "development" === 'development' && 'getAllColumns',
      debug: () => {
        var _table$options$debugA2;
        return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugColumns;
      }
    }),
    getAllFlatColumns: memo(() => [table.getAllColumns()], allColumns => {
      return allColumns.flatMap(column => {
        return column.getFlatColumns();
      });
    }, {
      key: "development" === 'development' && 'getAllFlatColumns',
      debug: () => {
        var _table$options$debugA3;
        return (_table$options$debugA3 = table.options.debugAll) != null ? _table$options$debugA3 : table.options.debugColumns;
      }
    }),
    _getAllFlatColumnsById: memo(() => [table.getAllFlatColumns()], flatColumns => {
      return flatColumns.reduce((acc, column) => {
        acc[column.id] = column;
        return acc;
      }, {});
    }, {
      key: "development" === 'development' && 'getAllFlatColumnsById',
      debug: () => {
        var _table$options$debugA4;
        return (_table$options$debugA4 = table.options.debugAll) != null ? _table$options$debugA4 : table.options.debugColumns;
      }
    }),
    getAllLeafColumns: memo(() => [table.getAllColumns(), table._getOrderColumnsFn()], (allColumns, orderColumns) => {
      let leafColumns = allColumns.flatMap(column => column.getLeafColumns());
      return orderColumns(leafColumns);
    }, {
      key: "development" === 'development' && 'getAllLeafColumns',
      debug: () => {
        var _table$options$debugA5;
        return (_table$options$debugA5 = table.options.debugAll) != null ? _table$options$debugA5 : table.options.debugColumns;
      }
    }),
    getColumn: columnId => {
      const column = table._getAllFlatColumnsById()[columnId];
      if ("development" !== 'production' && !column) {
        console.error(`[Table] Column with id '${columnId}' does not exist.`);
      }
      return column;
    }
  };
  Object.assign(table, coreInstance);
  for (let index = 0; index < table._features.length; index++) {
    const feature = table._features[index];
    feature == null || feature.createTable == null || feature.createTable(table);
  }
  return table;
}
 
function createCell(table, row, column, columnId) {
  const getRenderValue = () => {
    var _cell$getValue;
    return (_cell$getValue = cell.getValue()) != null ? _cell$getValue : table.options.renderFallbackValue;
  };
  const cell = {
    id: `${row.id}_${column.id}`,
    row,
    column,
    getValue: () => row.getValue(columnId),
    renderValue: getRenderValue,
    getContext: memo(() => [table, column, row, cell], (table, column, row, cell) => ({
      table,
      column,
      row,
      cell: cell,
      getValue: cell.getValue,
      renderValue: cell.renderValue
    }), {
      key: "development" === 'development' && 'cell.getContext',
      debug: () => table.options.debugAll
    })
  };
  table._features.forEach(feature => {
    feature.createCell == null || feature.createCell(cell, column, row, table);
  }, {});
  return cell;
}
 
const createRow = (table, id, original, rowIndex, depth, subRows, parentId) => {
  let row = {
    id,
    index: rowIndex,
    original,
    depth,
    parentId,
    _valuesCache: {},
    _uniqueValuesCache: {},
    getValue: columnId => {
      if (row._valuesCache.hasOwnProperty(columnId)) {
        return row._valuesCache[columnId];
      }
      const column = table.getColumn(columnId);
      if (!(column != null && column.accessorFn)) {
        return undefined;
      }
      row._valuesCache[columnId] = column.accessorFn(row.original, rowIndex);
      return row._valuesCache[columnId];
    },
    getUniqueValues: columnId => {
      if (row._uniqueValuesCache.hasOwnProperty(columnId)) {
        return row._uniqueValuesCache[columnId];
      }
      const column = table.getColumn(columnId);
      if (!(column != null && column.accessorFn)) {
        return undefined;
      }
      if (!column.columnDef.getUniqueValues) {
        row._uniqueValuesCache[columnId] = [row.getValue(columnId)];
        return row._uniqueValuesCache[columnId];
      }
      row._uniqueValuesCache[columnId] = column.columnDef.getUniqueValues(row.original, rowIndex);
      return row._uniqueValuesCache[columnId];
    },
    renderValue: columnId => {
      var _row$getValue;
      return (_row$getValue = row.getValue(columnId)) != null ? _row$getValue : table.options.renderFallbackValue;
    },
    subRows: subRows != null ? subRows : [],
    getLeafRows: () => flattenBy(row.subRows, d => d.subRows),
    getParentRow: () => row.parentId ? table.getRow(row.parentId, true) : undefined,
    getParentRows: () => {
      let parentRows = [];
      let currentRow = row;
      while (true) {
        const parentRow = currentRow.getParentRow();
        if (!parentRow) break;
        parentRows.push(parentRow);
        currentRow = parentRow;
      }
      return parentRows.reverse();
    },
    getAllCells: memo(() => [table.getAllLeafColumns()], leafColumns => {
      return leafColumns.map(column => {
        return createCell(table, row, column, column.id);
      });
    }, {
      key: "development" === 'development' && 'row.getAllCells',
      debug: () => {
        var _table$options$debugA;
        return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugRows;
      }
    }),
    _getAllCellsByColumnId: memo(() => [row.getAllCells()], allCells => {
      return allCells.reduce((acc, cell) => {
        acc[cell.column.id] = cell;
        return acc;
      }, {});
    }, {
      key: "development" === 'production' && 'row.getAllCellsByColumnId',
      debug: () => {
        var _table$options$debugA2;
        return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugRows;
      }
    })
  };
  for (let i = 0; i < table._features.length; i++) {
    const feature = table._features[i];
    feature == null || feature.createRow == null || feature.createRow(row, table);
  }
  return row;
};
 
// type Person = {
//   firstName: string
//   lastName: string
//   age: number
//   visits: number
//   status: string
//   progress: number
//   createdAt: Date
//   nested: {
//     foo: [
//       {
//         bar: 'bar'
//       }
//     ]
//     bar: { subBar: boolean }[]
//     baz: {
//       foo: 'foo'
//       bar: {
//         baz: 'baz'
//       }
//     }
//   }
// }
 
// const test: DeepKeys<Person> = 'nested.foo.0.bar'
// const test2: DeepKeys<Person> = 'nested.bar'
 
// const helper = createColumnHelper<Person>()
 
// helper.accessor('nested.foo', {
//   cell: info => info.getValue(),
// })
 
// helper.accessor('nested.foo.0.bar', {
//   cell: info => info.getValue(),
// })
 
// helper.accessor('nested.bar', {
//   cell: info => info.getValue(),
// })
function createColumnHelper() {
  return {
    accessor: (accessor, column) => {
      return typeof accessor === 'function' ? {
        ...column,
        accessorFn: accessor
      } : {
        ...column,
        accessorKey: accessor
      };
    },
    display: column => column,
    group: column => column
  };
}
 
function getCoreRowModel() {
  return table => memo(() => [table.options.data], data => {
    const rowModel = {
      rows: [],
      flatRows: [],
      rowsById: {}
    };
    const accessRows = function (originalRows, depth, parentRow) {
      if (depth === void 0) {
        depth = 0;
      }
      const rows = [];
      for (let i = 0; i < originalRows.length; i++) {
        // This could be an expensive check at scale, so we should move it somewhere else, but where?
        // if (!id) {
        //   if ("development" !== 'production') {
        //     throw new Error(`getRowId expected an ID, but got ${id}`)
        //   }
        // }
 
        // Make the row
        const row = createRow(table, table._getRowId(originalRows[i], i, parentRow), originalRows[i], i, depth, undefined, parentRow == null ? void 0 : parentRow.id);
 
        // Keep track of every row in a flat array
        rowModel.flatRows.push(row);
        // Also keep track of every row by its ID
        rowModel.rowsById[row.id] = row;
        // Push table row into parent
        rows.push(row);
 
        // Get the original subrows
        if (table.options.getSubRows) {
          var _row$originalSubRows;
          row.originalSubRows = table.options.getSubRows(originalRows[i], i);
 
          // Then recursively access them
          if ((_row$originalSubRows = row.originalSubRows) != null && _row$originalSubRows.length) {
            row.subRows = accessRows(row.originalSubRows, depth + 1, row);
          }
        }
      }
      return rows;
    };
    rowModel.rows = accessRows(data);
    return rowModel;
  }, {
    key: "development" === 'development' && 'getRowModel',
    debug: () => {
      var _table$options$debugA;
      return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
    },
    onChange: () => {
      table._autoResetPageIndex();
    }
  });
}
 
function filterRows(rows, filterRowImpl, table) {
  if (table.options.filterFromLeafRows) {
    return filterRowModelFromLeafs(rows, filterRowImpl, table);
  }
  return filterRowModelFromRoot(rows, filterRowImpl, table);
}
function filterRowModelFromLeafs(rowsToFilter, filterRow, table) {
  var _table$options$maxLea;
  const newFilteredFlatRows = [];
  const newFilteredRowsById = {};
  const maxDepth = (_table$options$maxLea = table.options.maxLeafRowFilterDepth) != null ? _table$options$maxLea : 100;
  const recurseFilterRows = function (rowsToFilter, depth) {
    if (depth === void 0) {
      depth = 0;
    }
    const rows = [];
 
    // Filter from children up first
    for (let i = 0; i < rowsToFilter.length; i++) {
      var _row$subRows;
      let row = rowsToFilter[i];
      const newRow = createRow(table, row.id, row.original, row.index, row.depth, undefined, row.parentId);
      newRow.columnFilters = row.columnFilters;
      if ((_row$subRows = row.subRows) != null && _row$subRows.length && depth < maxDepth) {
        newRow.subRows = recurseFilterRows(row.subRows, depth + 1);
        row = newRow;
        if (filterRow(row) && !newRow.subRows.length) {
          rows.push(row);
          newFilteredRowsById[row.id] = row;
          newFilteredFlatRows.push(row);
          continue;
        }
        if (filterRow(row) || newRow.subRows.length) {
          rows.push(row);
          newFilteredRowsById[row.id] = row;
          newFilteredFlatRows.push(row);
          continue;
        }
      } else {
        row = newRow;
        if (filterRow(row)) {
          rows.push(row);
          newFilteredRowsById[row.id] = row;
          newFilteredFlatRows.push(row);
        }
      }
    }
    return rows;
  };
  return {
    rows: recurseFilterRows(rowsToFilter),
    flatRows: newFilteredFlatRows,
    rowsById: newFilteredRowsById
  };
}
function filterRowModelFromRoot(rowsToFilter, filterRow, table) {
  var _table$options$maxLea2;
  const newFilteredFlatRows = [];
  const newFilteredRowsById = {};
  const maxDepth = (_table$options$maxLea2 = table.options.maxLeafRowFilterDepth) != null ? _table$options$maxLea2 : 100;
 
  // Filters top level and nested rows
  const recurseFilterRows = function (rowsToFilter, depth) {
    if (depth === void 0) {
      depth = 0;
    }
    // Filter from parents downward first
 
    const rows = [];
 
    // Apply the filter to any subRows
    for (let i = 0; i < rowsToFilter.length; i++) {
      let row = rowsToFilter[i];
      const pass = filterRow(row);
      if (pass) {
        var _row$subRows2;
        if ((_row$subRows2 = row.subRows) != null && _row$subRows2.length && depth < maxDepth) {
          const newRow = createRow(table, row.id, row.original, row.index, row.depth, undefined, row.parentId);
          newRow.subRows = recurseFilterRows(row.subRows, depth + 1);
          row = newRow;
        }
        rows.push(row);
        newFilteredFlatRows.push(row);
        newFilteredRowsById[row.id] = row;
      }
    }
    return rows;
  };
  return {
    rows: recurseFilterRows(rowsToFilter),
    flatRows: newFilteredFlatRows,
    rowsById: newFilteredRowsById
  };
}
 
function getFilteredRowModel() {
  return table => memo(() => [table.getPreFilteredRowModel(), table.getState().columnFilters, table.getState().globalFilter], (rowModel, columnFilters, globalFilter) => {
    if (!rowModel.rows.length || !(columnFilters != null && columnFilters.length) && !globalFilter) {
      for (let i = 0; i < rowModel.flatRows.length; i++) {
        rowModel.flatRows[i].columnFilters = {};
        rowModel.flatRows[i].columnFiltersMeta = {};
      }
      return rowModel;
    }
    const resolvedColumnFilters = [];
    const resolvedGlobalFilters = [];
    (columnFilters != null ? columnFilters : []).forEach(d => {
      var _filterFn$resolveFilt;
      const column = table.getColumn(d.id);
      if (!column) {
        return;
      }
      const filterFn = column.getFilterFn();
      if (!filterFn) {
        if ("development" !== 'production') {
          console.warn(`Could not find a valid 'column.filterFn' for column with the ID: ${column.id}.`);
        }
        return;
      }
      resolvedColumnFilters.push({
        id: d.id,
        filterFn,
        resolvedValue: (_filterFn$resolveFilt = filterFn.resolveFilterValue == null ? void 0 : filterFn.resolveFilterValue(d.value)) != null ? _filterFn$resolveFilt : d.value
      });
    });
    const filterableIds = columnFilters.map(d => d.id);
    const globalFilterFn = table.getGlobalFilterFn();
    const globallyFilterableColumns = table.getAllLeafColumns().filter(column => column.getCanGlobalFilter());
    if (globalFilter && globalFilterFn && globallyFilterableColumns.length) {
      filterableIds.push('__global__');
      globallyFilterableColumns.forEach(column => {
        var _globalFilterFn$resol;
        resolvedGlobalFilters.push({
          id: column.id,
          filterFn: globalFilterFn,
          resolvedValue: (_globalFilterFn$resol = globalFilterFn.resolveFilterValue == null ? void 0 : globalFilterFn.resolveFilterValue(globalFilter)) != null ? _globalFilterFn$resol : globalFilter
        });
      });
    }
    let currentColumnFilter;
    let currentGlobalFilter;
 
    // Flag the prefiltered row model with each filter state
    for (let j = 0; j < rowModel.flatRows.length; j++) {
      const row = rowModel.flatRows[j];
      row.columnFilters = {};
      if (resolvedColumnFilters.length) {
        for (let i = 0; i < resolvedColumnFilters.length; i++) {
          currentColumnFilter = resolvedColumnFilters[i];
          const id = currentColumnFilter.id;
 
          // Tag the row with the column filter state
          row.columnFilters[id] = currentColumnFilter.filterFn(row, id, currentColumnFilter.resolvedValue, filterMeta => {
            row.columnFiltersMeta[id] = filterMeta;
          });
        }
      }
      if (resolvedGlobalFilters.length) {
        for (let i = 0; i < resolvedGlobalFilters.length; i++) {
          currentGlobalFilter = resolvedGlobalFilters[i];
          const id = currentGlobalFilter.id;
          // Tag the row with the first truthy global filter state
          if (currentGlobalFilter.filterFn(row, id, currentGlobalFilter.resolvedValue, filterMeta => {
            row.columnFiltersMeta[id] = filterMeta;
          })) {
            row.columnFilters.__global__ = true;
            break;
          }
        }
        if (row.columnFilters.__global__ !== true) {
          row.columnFilters.__global__ = false;
        }
      }
    }
    const filterRowsImpl = row => {
      // Horizontally filter rows through each column
      for (let i = 0; i < filterableIds.length; i++) {
        if (row.columnFilters[filterableIds[i]] === false) {
          return false;
        }
      }
      return true;
    };
 
    // Filter final rows using all of the active filters
    return filterRows(rowModel.rows, filterRowsImpl, table);
  }, {
    key: "development" === 'development' && 'getFilteredRowModel',
    debug: () => {
      var _table$options$debugA;
      return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
    },
    onChange: () => {
      table._autoResetPageIndex();
    }
  });
}
 
function getFacetedRowModel() {
  return (table, columnId) => memo(() => [table.getPreFilteredRowModel(), table.getState().columnFilters, table.getState().globalFilter, table.getFilteredRowModel()], (preRowModel, columnFilters, globalFilter) => {
    if (!preRowModel.rows.length || !(columnFilters != null && columnFilters.length) && !globalFilter) {
      return preRowModel;
    }
    const filterableIds = [...columnFilters.map(d => d.id).filter(d => d !== columnId), globalFilter ? '__global__' : undefined].filter(Boolean);
    const filterRowsImpl = row => {
      // Horizontally filter rows through each column
      for (let i = 0; i < filterableIds.length; i++) {
        if (row.columnFilters[filterableIds[i]] === false) {
          return false;
        }
      }
      return true;
    };
    return filterRows(preRowModel.rows, filterRowsImpl, table);
  }, {
    key: "development" === 'development' && 'getFacetedRowModel_' + columnId,
    debug: () => {
      var _table$options$debugA;
      return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
    },
    onChange: () => {}
  });
}
 
function getFacetedUniqueValues() {
  return (table, columnId) => memo(() => {
    var _table$getColumn;
    return [(_table$getColumn = table.getColumn(columnId)) == null ? void 0 : _table$getColumn.getFacetedRowModel()];
  }, facetedRowModel => {
    if (!facetedRowModel) return new Map();
    let facetedUniqueValues = new Map();
    for (let i = 0; i < facetedRowModel.flatRows.length; i++) {
      const values = facetedRowModel.flatRows[i].getUniqueValues(columnId);
      for (let j = 0; j < values.length; j++) {
        const value = values[j];
        if (facetedUniqueValues.has(value)) {
          var _facetedUniqueValues$;
          facetedUniqueValues.set(value, ((_facetedUniqueValues$ = facetedUniqueValues.get(value)) != null ? _facetedUniqueValues$ : 0) + 1);
        } else {
          facetedUniqueValues.set(value, 1);
        }
      }
    }
    return facetedUniqueValues;
  }, {
    key: "development" === 'development' && 'getFacetedUniqueValues_' + columnId,
    debug: () => {
      var _table$options$debugA;
      return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
    },
    onChange: () => {}
  });
}
 
function getFacetedMinMaxValues() {
  return (table, columnId) => memo(() => {
    var _table$getColumn;
    return [(_table$getColumn = table.getColumn(columnId)) == null ? void 0 : _table$getColumn.getFacetedRowModel()];
  }, facetedRowModel => {
    var _facetedRowModel$flat;
    if (!facetedRowModel) return undefined;
    const firstValue = (_facetedRowModel$flat = facetedRowModel.flatRows[0]) == null ? void 0 : _facetedRowModel$flat.getUniqueValues(columnId);
    if (typeof firstValue === 'undefined') {
      return undefined;
    }
    let facetedMinMaxValues = [firstValue, firstValue];
    for (let i = 0; i < facetedRowModel.flatRows.length; i++) {
      const values = facetedRowModel.flatRows[i].getUniqueValues(columnId);
      for (let j = 0; j < values.length; j++) {
        const value = values[j];
        if (value < facetedMinMaxValues[0]) {
          facetedMinMaxValues[0] = value;
        } else if (value > facetedMinMaxValues[1]) {
          facetedMinMaxValues[1] = value;
        }
      }
    }
    return facetedMinMaxValues;
  }, {
    key: "development" === 'development' && 'getFacetedMinMaxValues_' + columnId,
    debug: () => {
      var _table$options$debugA;
      return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
    },
    onChange: () => {}
  });
}
 
function getSortedRowModel() {
  return table => memo(() => [table.getState().sorting, table.getPreSortedRowModel()], (sorting, rowModel) => {
    if (!rowModel.rows.length || !(sorting != null && sorting.length)) {
      return rowModel;
    }
    const sortingState = table.getState().sorting;
    const sortedFlatRows = [];
 
    // Filter out sortings that correspond to non existing columns
    const availableSorting = sortingState.filter(sort => {
      var _table$getColumn;
      return (_table$getColumn = table.getColumn(sort.id)) == null ? void 0 : _table$getColumn.getCanSort();
    });
    const columnInfoById = {};
    availableSorting.forEach(sortEntry => {
      const column = table.getColumn(sortEntry.id);
      if (!column) return;
      columnInfoById[sortEntry.id] = {
        sortUndefined: column.columnDef.sortUndefined,
        invertSorting: column.columnDef.invertSorting,
        sortingFn: column.getSortingFn()
      };
    });
    const sortData = rows => {
      // This will also perform a stable sorting using the row index
      // if needed.
      const sortedData = rows.map(row => ({
        ...row
      }));
      sortedData.sort((rowA, rowB) => {
        for (let i = 0; i < availableSorting.length; i += 1) {
          var _sortEntry$desc;
          const sortEntry = availableSorting[i];
          const columnInfo = columnInfoById[sortEntry.id];
          const isDesc = (_sortEntry$desc = sortEntry == null ? void 0 : sortEntry.desc) != null ? _sortEntry$desc : false;
          let sortInt = 0;
 
          // All sorting ints should always return in ascending order
          if (columnInfo.sortUndefined) {
            const aValue = rowA.getValue(sortEntry.id);
            const bValue = rowB.getValue(sortEntry.id);
            const aUndefined = aValue === undefined;
            const bUndefined = bValue === undefined;
            if (aUndefined || bUndefined) {
              sortInt = aUndefined && bUndefined ? 0 : aUndefined ? columnInfo.sortUndefined : -columnInfo.sortUndefined;
            }
          }
          if (sortInt === 0) {
            sortInt = columnInfo.sortingFn(rowA, rowB, sortEntry.id);
          }
 
          // If sorting is non-zero, take care of desc and inversion
          if (sortInt !== 0) {
            if (isDesc) {
              sortInt *= -1;
            }
            if (columnInfo.invertSorting) {
              sortInt *= -1;
            }
            return sortInt;
          }
        }
        return rowA.index - rowB.index;
      });
 
      // If there are sub-rows, sort them
      sortedData.forEach(row => {
        var _row$subRows;
        sortedFlatRows.push(row);
        if ((_row$subRows = row.subRows) != null && _row$subRows.length) {
          row.subRows = sortData(row.subRows);
        }
      });
      return sortedData;
    };
    return {
      rows: sortData(rowModel.rows),
      flatRows: sortedFlatRows,
      rowsById: rowModel.rowsById
    };
  }, {
    key: "development" === 'development' && 'getSortedRowModel',
    debug: () => {
      var _table$options$debugA;
      return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
    },
    onChange: () => {
      table._autoResetPageIndex();
    }
  });
}
 
function getGroupedRowModel() {
  return table => memo(() => [table.getState().grouping, table.getPreGroupedRowModel()], (grouping, rowModel) => {
    if (!rowModel.rows.length || !grouping.length) {
      return rowModel;
    }
 
    // Filter the grouping list down to columns that exist
    const existingGrouping = grouping.filter(columnId => table.getColumn(columnId));
    const groupedFlatRows = [];
    const groupedRowsById = {};
    // const onlyGroupedFlatRows: Row[] = [];
    // const onlyGroupedRowsById: Record<RowId, Row> = {};
    // const nonGroupedFlatRows: Row[] = [];
    // const nonGroupedRowsById: Record<RowId, Row> = {};
 
    // Recursively group the data
    const groupUpRecursively = function (rows, depth, parentId) {
      if (depth === void 0) {
        depth = 0;
      }
      // Grouping depth has been been met
      // Stop grouping and simply rewrite thd depth and row relationships
      if (depth >= existingGrouping.length) {
        return rows.map(row => {
          row.depth = depth;
          groupedFlatRows.push(row);
          groupedRowsById[row.id] = row;
          if (row.subRows) {
            row.subRows = groupUpRecursively(row.subRows, depth + 1, row.id);
          }
          return row;
        });
      }
      const columnId = existingGrouping[depth];
 
      // Group the rows together for this level
      const rowGroupsMap = groupBy(rows, columnId);
 
      // Peform aggregations for each group
      const aggregatedGroupedRows = Array.from(rowGroupsMap.entries()).map((_ref, index) => {
        let [groupingValue, groupedRows] = _ref;
        let id = `${columnId}:${groupingValue}`;
        id = parentId ? `${parentId}>${id}` : id;
 
        // First, Recurse to group sub rows before aggregation
        const subRows = groupUpRecursively(groupedRows, depth + 1, id);
 
        // Flatten the leaf rows of the rows in this group
        const leafRows = depth ? flattenBy(groupedRows, row => row.subRows) : groupedRows;
        const row = createRow(table, id, leafRows[0].original, index, depth, undefined, parentId);
        Object.assign(row, {
          groupingColumnId: columnId,
          groupingValue,
          subRows,
          leafRows,
          getValue: columnId => {
            // Don't aggregate columns that are in the grouping
            if (existingGrouping.includes(columnId)) {
              if (row._valuesCache.hasOwnProperty(columnId)) {
                return row._valuesCache[columnId];
              }
              if (groupedRows[0]) {
                var _groupedRows$0$getVal;
                row._valuesCache[columnId] = (_groupedRows$0$getVal = groupedRows[0].getValue(columnId)) != null ? _groupedRows$0$getVal : undefined;
              }
              return row._valuesCache[columnId];
            }
            if (row._groupingValuesCache.hasOwnProperty(columnId)) {
              return row._groupingValuesCache[columnId];
            }
 
            // Aggregate the values
            const column = table.getColumn(columnId);
            const aggregateFn = column == null ? void 0 : column.getAggregationFn();
            if (aggregateFn) {
              row._groupingValuesCache[columnId] = aggregateFn(columnId, leafRows, groupedRows);
              return row._groupingValuesCache[columnId];
            }
          }
        });
        subRows.forEach(subRow => {
          groupedFlatRows.push(subRow);
          groupedRowsById[subRow.id] = subRow;
          // if (subRow.getIsGrouped?.()) {
          //   onlyGroupedFlatRows.push(subRow);
          //   onlyGroupedRowsById[subRow.id] = subRow;
          // } else {
          //   nonGroupedFlatRows.push(subRow);
          //   nonGroupedRowsById[subRow.id] = subRow;
          // }
        });
 
        return row;
      });
      return aggregatedGroupedRows;
    };
    const groupedRows = groupUpRecursively(rowModel.rows, 0);
    groupedRows.forEach(subRow => {
      groupedFlatRows.push(subRow);
      groupedRowsById[subRow.id] = subRow;
      // if (subRow.getIsGrouped?.()) {
      //   onlyGroupedFlatRows.push(subRow);
      //   onlyGroupedRowsById[subRow.id] = subRow;
      // } else {
      //   nonGroupedFlatRows.push(subRow);
      //   nonGroupedRowsById[subRow.id] = subRow;
      // }
    });
 
    return {
      rows: groupedRows,
      flatRows: groupedFlatRows,
      rowsById: groupedRowsById
    };
  }, {
    key: "development" === 'development' && 'getGroupedRowModel',
    debug: () => {
      var _table$options$debugA;
      return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
    },
    onChange: () => {
      table._queue(() => {
        table._autoResetExpanded();
        table._autoResetPageIndex();
      });
    }
  });
}
function groupBy(rows, columnId) {
  const groupMap = new Map();
  return rows.reduce((map, row) => {
    const resKey = `${row.getGroupingValue(columnId)}`;
    const previous = map.get(resKey);
    if (!previous) {
      map.set(resKey, [row]);
    } else {
      previous.push(row);
    }
    return map;
  }, groupMap);
}
 
function getExpandedRowModel() {
  return table => memo(() => [table.getState().expanded, table.getPreExpandedRowModel(), table.options.paginateExpandedRows], (expanded, rowModel, paginateExpandedRows) => {
    if (!rowModel.rows.length || expanded !== true && !Object.keys(expanded != null ? expanded : {}).length) {
      return rowModel;
    }
    if (!paginateExpandedRows) {
      // Only expand rows at this point if they are being paginated
      return rowModel;
    }
    return expandRows(rowModel);
  }, {
    key: "development" === 'development' && 'getExpandedRowModel',
    debug: () => {
      var _table$options$debugA;
      return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
    }
  });
}
function expandRows(rowModel) {
  const expandedRows = [];
  const handleRow = row => {
    var _row$subRows;
    expandedRows.push(row);
    if ((_row$subRows = row.subRows) != null && _row$subRows.length && row.getIsExpanded()) {
      row.subRows.forEach(handleRow);
    }
  };
  rowModel.rows.forEach(handleRow);
  return {
    rows: expandedRows,
    flatRows: rowModel.flatRows,
    rowsById: rowModel.rowsById
  };
}
 
function getPaginationRowModel(opts) {
  return table => memo(() => [table.getState().pagination, table.getPrePaginationRowModel(), table.options.paginateExpandedRows ? undefined : table.getState().expanded], (pagination, rowModel) => {
    if (!rowModel.rows.length) {
      return rowModel;
    }
    const {
      pageSize,
      pageIndex
    } = pagination;
    let {
      rows,
      flatRows,
      rowsById
    } = rowModel;
    const pageStart = pageSize * pageIndex;
    const pageEnd = pageStart + pageSize;
    rows = rows.slice(pageStart, pageEnd);
    let paginatedRowModel;
    if (!table.options.paginateExpandedRows) {
      paginatedRowModel = expandRows({
        rows,
        flatRows,
        rowsById
      });
    } else {
      paginatedRowModel = {
        rows,
        flatRows,
        rowsById
      };
    }
    paginatedRowModel.flatRows = [];
    const handleRow = row => {
      paginatedRowModel.flatRows.push(row);
      if (row.subRows.length) {
        row.subRows.forEach(handleRow);
      }
    };
    paginatedRowModel.rows.forEach(handleRow);
    return paginatedRowModel;
  }, {
    key: "development" === 'development' && 'getPaginationRowModel',
    debug: () => {
      var _table$options$debugA;
      return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
    }
  });
}
 
export { ColumnSizing, Expanding, Filters, Grouping, Headers, Ordering, Pagination, Pinning, RowSelection, Sorting, Visibility, aggregationFns, buildHeaderGroups, createCell, createColumn, createColumnHelper, createRow, createTable, defaultColumnSizing, expandRows, filterFns, flattenBy, functionalUpdate, getCoreRowModel, getExpandedRowModel, getFacetedMinMaxValues, getFacetedRowModel, getFacetedUniqueValues, getFilteredRowModel, getGroupedRowModel, getPaginationRowModel, getSortedRowModel, isFunction, isNumberArray, isRowSelected, isSubRowSelected, makeStateUpdater, memo, noop, orderColumns, passiveEventSupported, reSplitAlphaNumeric, selectRowsFn, shouldAutoRemoveFilter, sortingFns };
                                  
 
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMudHMiLCIuLi8uLi9zcmMvY29yZS9jb2x1bW4udHMiLCIuLi8uLi9zcmMvY29yZS9oZWFkZXJzLnRzIiwiLi4vLi4vc3JjL2ZlYXR1cmVzL0NvbHVtblNpemluZy50cyIsIi4uLy4uL3NyYy9mZWF0dXJlcy9FeHBhbmRpbmcudHMiLCIuLi8uLi9zcmMvZmlsdGVyRm5zLnRzIiwiLi4vLi4vc3JjL2ZlYXR1cmVzL0ZpbHRlcnMudHMiLCIuLi8uLi9zcmMvYWdncmVnYXRpb25GbnMudHMiLCIuLi8uLi9zcmMvZmVhdHVyZXMvR3JvdXBpbmcudHMiLCIuLi8uLi9zcmMvZmVhdHVyZXMvT3JkZXJpbmcudHMiLCIuLi8uLi9zcmMvZmVhdHVyZXMvUGFnaW5hdGlvbi50cyIsIi4uLy4uL3NyYy9mZWF0dXJlcy9QaW5uaW5nLnRzIiwiLi4vLi4vc3JjL2ZlYXR1cmVzL1Jvd1NlbGVjdGlvbi50cyIsIi4uLy4uL3NyYy9zb3J0aW5nRm5zLnRzIiwiLi4vLi4vc3JjL2ZlYXR1cmVzL1NvcnRpbmcudHMiLCIuLi8uLi9zcmMvZmVhdHVyZXMvVmlzaWJpbGl0eS50cyIsIi4uLy4uL3NyYy9jb3JlL3RhYmxlLnRzIiwiLi4vLi4vc3JjL2NvcmUvY2VsbC50cyIsIi4uLy4uL3NyYy9jb3JlL3Jvdy50cyIsIi4uLy4uL3NyYy9jb2x1bW5IZWxwZXIudHMiLCIuLi8uLi9zcmMvdXRpbHMvZ2V0Q29yZVJvd01vZGVsLnRzIiwiLi4vLi4vc3JjL3V0aWxzL2ZpbHRlclJvd3NVdGlscy50cyIsIi4uLy4uL3NyYy91dGlscy9nZXRGaWx0ZXJlZFJvd01vZGVsLnRzIiwiLi4vLi4vc3JjL3V0aWxzL2dldEZhY2V0ZWRSb3dNb2RlbC50cyIsIi4uLy4uL3NyYy91dGlscy9nZXRGYWNldGVkVW5pcXVlVmFsdWVzLnRzIiwiLi4vLi4vc3JjL3V0aWxzL2dldEZhY2V0ZWRNaW5NYXhWYWx1ZXMudHMiLCIuLi8uLi9zcmMvdXRpbHMvZ2V0U29ydGVkUm93TW9kZWwudHMiLCIuLi8uLi9zcmMvdXRpbHMvZ2V0R3JvdXBlZFJvd01vZGVsLnRzIiwiLi4vLi4vc3JjL3V0aWxzL2dldEV4cGFuZGVkUm93TW9kZWwudHMiLCIuLi8uLi9zcmMvdXRpbHMvZ2V0UGFnaW5hdGlvblJvd01vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRhYmxlU3RhdGUsIFVwZGF0ZXIgfSBmcm9tICcuL3R5cGVzJ1xuXG5leHBvcnQgdHlwZSBQYXJ0aWFsS2V5czxULCBLIGV4dGVuZHMga2V5b2YgVD4gPSBPbWl0PFQsIEs+ICYgUGFydGlhbDxQaWNrPFQsIEs+PlxuZXhwb3J0IHR5cGUgUmVxdWlyZWRLZXlzPFQsIEsgZXh0ZW5kcyBrZXlvZiBUPiA9IE9taXQ8VCwgSz4gJlxuICBSZXF1aXJlZDxQaWNrPFQsIEs+PlxuZXhwb3J0IHR5cGUgT3ZlcndyaXRlPFQsIFUgZXh0ZW5kcyB7IFtUS2V5IGluIGtleW9mIFRdPzogYW55IH0+ID0gT21pdDxcbiAgVCxcbiAga2V5b2YgVVxuPiAmXG4gIFVcblxuZXhwb3J0IHR5cGUgVW5pb25Ub0ludGVyc2VjdGlvbjxUPiA9IChcbiAgVCBleHRlbmRzIGFueSA/ICh4OiBUKSA9PiBhbnkgOiBuZXZlclxuKSBleHRlbmRzICh4OiBpbmZlciBSKSA9PiBhbnlcbiAgPyBSXG4gIDogbmV2ZXJcblxuZXhwb3J0IHR5cGUgSXNBbnk8VCwgWSwgTj4gPSAxIGV4dGVuZHMgMCAmIFQgPyBZIDogTlxuZXhwb3J0IHR5cGUgSXNLbm93bjxULCBZLCBOPiA9IHVua25vd24gZXh0ZW5kcyBUID8gTiA6IFlcblxudHlwZSBDb21wdXRlUmFuZ2U8XG4gIE4gZXh0ZW5kcyBudW1iZXIsXG4gIFJlc3VsdCBleHRlbmRzIEFycmF5PHVua25vd24+ID0gW10sXG4+ID0gUmVzdWx0WydsZW5ndGgnXSBleHRlbmRzIE5cbiAgPyBSZXN1bHRcbiAgOiBDb21wdXRlUmFuZ2U8TiwgWy4uLlJlc3VsdCwgUmVzdWx0WydsZW5ndGgnXV0+XG50eXBlIEluZGV4NDAgPSBDb21wdXRlUmFuZ2U8NDA+W251bWJlcl1cblxuLy8gSXMgdGhpcyB0eXBlIGEgdHVwbGU/XG50eXBlIElzVHVwbGU8VD4gPSBUIGV4dGVuZHMgcmVhZG9ubHkgYW55W10gJiB7IGxlbmd0aDogaW5mZXIgTGVuZ3RoIH1cbiAgPyBMZW5ndGggZXh0ZW5kcyBJbmRleDQwXG4gICAgPyBUXG4gICAgOiBuZXZlclxuICA6IG5ldmVyXG5cbi8vIElmIHRoaXMgdHlwZSBpcyBhIHR1cGxlLCB3aGF0IGluZGljZXMgYXJlIGFsbG93ZWQ/XG50eXBlIEFsbG93ZWRJbmRleGVzPFxuICBUdXBsZSBleHRlbmRzIFJlYWRvbmx5QXJyYXk8YW55PixcbiAgS2V5cyBleHRlbmRzIG51bWJlciA9IG5ldmVyLFxuPiA9IFR1cGxlIGV4dGVuZHMgcmVhZG9ubHkgW11cbiAgPyBLZXlzXG4gIDogVHVwbGUgZXh0ZW5kcyByZWFkb25seSBbaW5mZXIgXywgLi4uaW5mZXIgVGFpbF1cbiAgPyBBbGxvd2VkSW5kZXhlczxUYWlsLCBLZXlzIHwgVGFpbFsnbGVuZ3RoJ10+XG4gIDogS2V5c1xuXG5leHBvcnQgdHlwZSBEZWVwS2V5czxULCBURGVwdGggZXh0ZW5kcyBhbnlbXSA9IFtdPiA9IFREZXB0aFsnbGVuZ3RoJ10gZXh0ZW5kcyA1XG4gID8gbmV2ZXJcbiAgOiB1bmtub3duIGV4dGVuZHMgVFxuICA/IHN0cmluZ1xuICA6IG9iamVjdCBleHRlbmRzIFRcbiAgPyBzdHJpbmdcbiAgOiBUIGV4dGVuZHMgcmVhZG9ubHkgYW55W10gJiBJc1R1cGxlPFQ+XG4gID8gQWxsb3dlZEluZGV4ZXM8VD4gfCBEZWVwS2V5c1ByZWZpeDxULCBBbGxvd2VkSW5kZXhlczxUPiwgVERlcHRoPlxuICA6IFQgZXh0ZW5kcyBhbnlbXVxuICA/IERlZXBLZXlzPFRbbnVtYmVyXSwgWy4uLlREZXB0aCwgYW55XT5cbiAgOiBUIGV4dGVuZHMgRGF0ZVxuICA/IG5ldmVyXG4gIDogVCBleHRlbmRzIG9iamVjdFxuICA/IChrZXlvZiBUICYgc3RyaW5nKSB8IERlZXBLZXlzUHJlZml4PFQsIGtleW9mIFQsIFREZXB0aD5cbiAgOiBuZXZlclxuXG50eXBlIERlZXBLZXlzUHJlZml4PFxuICBULFxuICBUUHJlZml4LFxuICBURGVwdGggZXh0ZW5kcyBhbnlbXSxcbj4gPSBUUHJlZml4IGV4dGVuZHMga2V5b2YgVCAmIChudW1iZXIgfCBzdHJpbmcpXG4gID8gYCR7VFByZWZpeH0uJHtEZWVwS2V5czxUW1RQcmVmaXhdLCBbLi4uVERlcHRoLCBhbnldPiAmIHN0cmluZ31gXG4gIDogbmV2ZXJcblxuZXhwb3J0IHR5cGUgRGVlcFZhbHVlPFQsIFRQcm9wPiA9IFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCBhbnk+XG4gID8gVFByb3AgZXh0ZW5kcyBgJHtpbmZlciBUQnJhbmNofS4ke2luZmVyIFREZWVwUHJvcH1gXG4gICAgPyBEZWVwVmFsdWU8VFtUQnJhbmNoXSwgVERlZXBQcm9wPlxuICAgIDogVFtUUHJvcCAmIHN0cmluZ11cbiAgOiBuZXZlclxuXG5leHBvcnQgdHlwZSBOb0luZmVyPFQ+ID0gW1RdW1QgZXh0ZW5kcyBhbnkgPyAwIDogbmV2ZXJdXG5cbmV4cG9ydCB0eXBlIEdldHRlcjxUVmFsdWU+ID0gPFRUVmFsdWUgPSBUVmFsdWU+KCkgPT4gTm9JbmZlcjxUVFZhbHVlPlxuXG4vLy9cblxuZXhwb3J0IGZ1bmN0aW9uIGZ1bmN0aW9uYWxVcGRhdGU8VD4odXBkYXRlcjogVXBkYXRlcjxUPiwgaW5wdXQ6IFQpOiBUIHtcbiAgcmV0dXJuIHR5cGVvZiB1cGRhdGVyID09PSAnZnVuY3Rpb24nXG4gICAgPyAodXBkYXRlciBhcyAoaW5wdXQ6IFQpID0+IFQpKGlucHV0KVxuICAgIDogdXBkYXRlclxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9vcCgpIHtcbiAgLy9cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VTdGF0ZVVwZGF0ZXI8SyBleHRlbmRzIGtleW9mIFRhYmxlU3RhdGU+KFxuICBrZXk6IEssXG4gIGluc3RhbmNlOiB1bmtub3duXG4pIHtcbiAgcmV0dXJuICh1cGRhdGVyOiBVcGRhdGVyPFRhYmxlU3RhdGVbS10+KSA9PiB7XG4gICAgOyhpbnN0YW5jZSBhcyBhbnkpLnNldFN0YXRlKDxUVGFibGVTdGF0ZT4ob2xkOiBUVGFibGVTdGF0ZSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ub2xkLFxuICAgICAgICBba2V5XTogZnVuY3Rpb25hbFVwZGF0ZSh1cGRhdGVyLCAob2xkIGFzIGFueSlba2V5XSksXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG50eXBlIEFueUZ1bmN0aW9uID0gKC4uLmFyZ3M6IGFueSkgPT4gYW55XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uPFQgZXh0ZW5kcyBBbnlGdW5jdGlvbj4oZDogYW55KTogZCBpcyBUIHtcbiAgcmV0dXJuIGQgaW5zdGFuY2VvZiBGdW5jdGlvblxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJBcnJheShkOiBhbnkpOiBkIGlzIG51bWJlcltdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZCkgJiYgZC5ldmVyeSh2YWwgPT4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuQnk8VE5vZGU+KFxuICBhcnI6IFROb2RlW10sXG4gIGdldENoaWxkcmVuOiAoaXRlbTogVE5vZGUpID0+IFROb2RlW11cbikge1xuICBjb25zdCBmbGF0OiBUTm9kZVtdID0gW11cblxuICBjb25zdCByZWN1cnNlID0gKHN1YkFycjogVE5vZGVbXSkgPT4ge1xuICAgIHN1YkFyci5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgZmxhdC5wdXNoKGl0ZW0pXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGl0ZW0pXG4gICAgICBpZiAoY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICByZWN1cnNlKGNoaWxkcmVuKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICByZWN1cnNlKGFycilcblxuICByZXR1cm4gZmxhdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVtbzxURGVwcyBleHRlbmRzIHJlYWRvbmx5IGFueVtdLCBUUmVzdWx0PihcbiAgZ2V0RGVwczogKCkgPT4gWy4uLlREZXBzXSxcbiAgZm46ICguLi5hcmdzOiBOb0luZmVyPFsuLi5URGVwc10+KSA9PiBUUmVzdWx0LFxuICBvcHRzOiB7XG4gICAga2V5OiBhbnlcbiAgICBkZWJ1Zz86ICgpID0+IGFueVxuICAgIG9uQ2hhbmdlPzogKHJlc3VsdDogVFJlc3VsdCkgPT4gdm9pZFxuICB9XG4pOiAoKSA9PiBUUmVzdWx0IHtcbiAgbGV0IGRlcHM6IGFueVtdID0gW11cbiAgbGV0IHJlc3VsdDogVFJlc3VsdCB8IHVuZGVmaW5lZFxuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgbGV0IGRlcFRpbWU6IG51bWJlclxuICAgIGlmIChvcHRzLmtleSAmJiBvcHRzLmRlYnVnKSBkZXBUaW1lID0gRGF0ZS5ub3coKVxuXG4gICAgY29uc3QgbmV3RGVwcyA9IGdldERlcHMoKVxuXG4gICAgY29uc3QgZGVwc0NoYW5nZWQgPVxuICAgICAgbmV3RGVwcy5sZW5ndGggIT09IGRlcHMubGVuZ3RoIHx8XG4gICAgICBuZXdEZXBzLnNvbWUoKGRlcDogYW55LCBpbmRleDogbnVtYmVyKSA9PiBkZXBzW2luZGV4XSAhPT0gZGVwKVxuXG4gICAgaWYgKCFkZXBzQ2hhbmdlZCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCFcbiAgICB9XG5cbiAgICBkZXBzID0gbmV3RGVwc1xuXG4gICAgbGV0IHJlc3VsdFRpbWU6IG51bWJlclxuICAgIGlmIChvcHRzLmtleSAmJiBvcHRzLmRlYnVnKSByZXN1bHRUaW1lID0gRGF0ZS5ub3coKVxuXG4gICAgcmVzdWx0ID0gZm4oLi4ubmV3RGVwcylcbiAgICBvcHRzPy5vbkNoYW5nZT8uKHJlc3VsdClcblxuICAgIGlmIChvcHRzLmtleSAmJiBvcHRzLmRlYnVnKSB7XG4gICAgICBpZiAob3B0cz8uZGVidWcoKSkge1xuICAgICAgICBjb25zdCBkZXBFbmRUaW1lID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAtIGRlcFRpbWUhKSAqIDEwMCkgLyAxMDBcbiAgICAgICAgY29uc3QgcmVzdWx0RW5kVGltZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLSByZXN1bHRUaW1lISkgKiAxMDApIC8gMTAwXG4gICAgICAgIGNvbnN0IHJlc3VsdEZwc1BlcmNlbnRhZ2UgPSByZXN1bHRFbmRUaW1lIC8gMTZcblxuICAgICAgICBjb25zdCBwYWQgPSAoc3RyOiBudW1iZXIgfCBzdHJpbmcsIG51bTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgc3RyID0gU3RyaW5nKHN0cilcbiAgICAgICAgICB3aGlsZSAoc3RyLmxlbmd0aCA8IG51bSkge1xuICAgICAgICAgICAgc3RyID0gJyAnICsgc3RyXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzdHJcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBgJWPij7EgJHtwYWQocmVzdWx0RW5kVGltZSwgNSl9IC8ke3BhZChkZXBFbmRUaW1lLCA1KX0gbXNgLFxuICAgICAgICAgIGBcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogLjZyZW07XG4gICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICAgICAgICAgIGNvbG9yOiBoc2woJHtNYXRoLm1heChcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgTWF0aC5taW4oMTIwIC0gMTIwICogcmVzdWx0RnBzUGVyY2VudGFnZSwgMTIwKVxuICAgICAgICAgICAgKX1kZWcgMTAwJSAzMSUpO2AsXG4gICAgICAgICAgb3B0cz8ua2V5XG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0IVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb2x1bW4sXG4gIFRhYmxlLFxuICBBY2Nlc3NvckZuLFxuICBDb2x1bW5EZWYsXG4gIFJvd0RhdGEsXG4gIENvbHVtbkRlZlJlc29sdmVkLFxufSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IG1lbW8gfSBmcm9tICcuLi91dGlscydcblxuZXhwb3J0IGludGVyZmFjZSBDb3JlQ29sdW1uPFREYXRhIGV4dGVuZHMgUm93RGF0YSwgVFZhbHVlPiB7XG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgYWNjZXNzb3IgZnVuY3Rpb24gdG8gdXNlIHdoZW4gZXh0cmFjdGluZyB0aGUgdmFsdWUgZm9yIHRoZSBjb2x1bW4gZnJvbSBlYWNoIHJvdy4gV2lsbCBvbmx5IGJlIGRlZmluZWQgaWYgdGhlIGNvbHVtbiBkZWYgaGFzIGEgdmFsaWQgYWNjZXNzb3Iga2V5IG9yIGZ1bmN0aW9uIGRlZmluZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9jb2x1bW4jYWNjZXNzb3JmbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1kZWZzKVxuICAgKi9cbiAgYWNjZXNzb3JGbj86IEFjY2Vzc29yRm48VERhdGEsIFRWYWx1ZT5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBjb2x1bW4gZGVmIHVzZWQgdG8gY3JlYXRlIHRoZSBjb2x1bW4uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9jb2x1bW4jY29sdW1uZGVmKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLWRlZnMpXG4gICAqL1xuICBjb2x1bW5EZWY6IENvbHVtbkRlZjxURGF0YSwgVFZhbHVlPlxuICAvKipcbiAgICogVGhlIGNoaWxkIGNvbHVtbiAoaWYgdGhlIGNvbHVtbiBpcyBhIGdyb3VwIGNvbHVtbikuIFdpbGwgYmUgYW4gZW1wdHkgYXJyYXkgaWYgdGhlIGNvbHVtbiBpcyBub3QgYSBncm91cCBjb2x1bW4uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9jb2x1bW4jY29sdW1ucylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1kZWZzKVxuICAgKi9cbiAgY29sdW1uczogQ29sdW1uPFREYXRhLCBUVmFsdWU+W11cbiAgLyoqXG4gICAqIFRoZSBkZXB0aCBvZiB0aGUgY29sdW1uIChpZiBncm91cGVkKSByZWxhdGl2ZSB0byB0aGUgcm9vdCBjb2x1bW4gZGVmIGFycmF5LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvY29sdW1uI2RlcHRoKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLWRlZnMpXG4gICAqL1xuICBkZXB0aDogbnVtYmVyXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmbGF0dGVuZWQgYXJyYXkgb2YgdGhpcyBjb2x1bW4gYW5kIGFsbCBjaGlsZC9ncmFuZC1jaGlsZCBjb2x1bW5zIGZvciB0aGlzIGNvbHVtbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2NvbHVtbiNnZXRmbGF0Y29sdW1ucylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1kZWZzKVxuICAgKi9cbiAgZ2V0RmxhdENvbHVtbnM6ICgpID0+IENvbHVtbjxURGF0YSwgVFZhbHVlPltdXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBsZWFmLW5vZGUgY29sdW1ucyBmb3IgdGhpcyBjb2x1bW4uIElmIGEgY29sdW1uIGhhcyBubyBjaGlsZHJlbiwgaXQgaXMgY29uc2lkZXJlZCB0aGUgb25seSBsZWFmLW5vZGUgY29sdW1uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvY29sdW1uI2dldGxlYWZjb2x1bW5zKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLWRlZnMpXG4gICAqL1xuICBnZXRMZWFmQ29sdW1uczogKCkgPT4gQ29sdW1uPFREYXRhLCBUVmFsdWU+W11cbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbHVtbiByZXNvbHZlZCBpbiB0aGlzIHByaW9yaXR5OlxuICAgICAgLSBBIG1hbnVhbCBgaWRgIHByb3BlcnR5IGZyb20gdGhlIGNvbHVtbiBkZWZcbiAgICAgIC0gVGhlIGFjY2Vzc29yIGtleSBmcm9tIHRoZSBjb2x1bW4gZGVmXG4gICAgICAtIFRoZSBoZWFkZXIgc3RyaW5nIGZyb20gdGhlIGNvbHVtbiBkZWZcbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2NvbHVtbiNpZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1kZWZzKVxuICAgKi9cbiAgaWQ6IHN0cmluZ1xuICAvKipcbiAgICogVGhlIHBhcmVudCBjb2x1bW4gZm9yIHRoaXMgY29sdW1uLiBXaWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIGlzIGEgcm9vdCBjb2x1bW4uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9jb2x1bW4jcGFyZW50KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLWRlZnMpXG4gICAqL1xuICBwYXJlbnQ/OiBDb2x1bW48VERhdGEsIFRWYWx1ZT5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbHVtbjxURGF0YSBleHRlbmRzIFJvd0RhdGEsIFRWYWx1ZT4oXG4gIHRhYmxlOiBUYWJsZTxURGF0YT4sXG4gIGNvbHVtbkRlZjogQ29sdW1uRGVmPFREYXRhLCBUVmFsdWU+LFxuICBkZXB0aDogbnVtYmVyLFxuICBwYXJlbnQ/OiBDb2x1bW48VERhdGEsIFRWYWx1ZT5cbik6IENvbHVtbjxURGF0YSwgVFZhbHVlPiB7XG4gIGNvbnN0IGRlZmF1bHRDb2x1bW4gPSB0YWJsZS5fZ2V0RGVmYXVsdENvbHVtbkRlZigpXG5cbiAgY29uc3QgcmVzb2x2ZWRDb2x1bW5EZWYgPSB7XG4gICAgLi4uZGVmYXVsdENvbHVtbixcbiAgICAuLi5jb2x1bW5EZWYsXG4gIH0gYXMgQ29sdW1uRGVmUmVzb2x2ZWQ8VERhdGE+XG5cbiAgY29uc3QgYWNjZXNzb3JLZXkgPSByZXNvbHZlZENvbHVtbkRlZi5hY2Nlc3NvcktleVxuXG4gIGxldCBpZCA9XG4gICAgcmVzb2x2ZWRDb2x1bW5EZWYuaWQgPz9cbiAgICAoYWNjZXNzb3JLZXkgPyBhY2Nlc3NvcktleS5yZXBsYWNlKCcuJywgJ18nKSA6IHVuZGVmaW5lZCkgPz9cbiAgICAodHlwZW9mIHJlc29sdmVkQ29sdW1uRGVmLmhlYWRlciA9PT0gJ3N0cmluZydcbiAgICAgID8gcmVzb2x2ZWRDb2x1bW5EZWYuaGVhZGVyXG4gICAgICA6IHVuZGVmaW5lZClcblxuICBsZXQgYWNjZXNzb3JGbjogQWNjZXNzb3JGbjxURGF0YT4gfCB1bmRlZmluZWRcblxuICBpZiAocmVzb2x2ZWRDb2x1bW5EZWYuYWNjZXNzb3JGbikge1xuICAgIGFjY2Vzc29yRm4gPSByZXNvbHZlZENvbHVtbkRlZi5hY2Nlc3NvckZuXG4gIH0gZWxzZSBpZiAoYWNjZXNzb3JLZXkpIHtcbiAgICAvLyBTdXBwb3J0IGRlZXAgYWNjZXNzb3Iga2V5c1xuICAgIGlmIChhY2Nlc3NvcktleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICBhY2Nlc3NvckZuID0gKG9yaWdpbmFsUm93OiBURGF0YSkgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gb3JpZ2luYWxSb3cgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGFjY2Vzc29yS2V5LnNwbGl0KCcuJykpIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQ/LltrZXldXG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgcmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYFwiJHtrZXl9XCIgaW4gZGVlcGx5IG5lc3RlZCBrZXkgXCIke2FjY2Vzc29yS2V5fVwiIHJldHVybmVkIHVuZGVmaW5lZC5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhY2Nlc3NvckZuID0gKG9yaWdpbmFsUm93OiBURGF0YSkgPT5cbiAgICAgICAgKG9yaWdpbmFsUm93IGFzIGFueSlbcmVzb2x2ZWRDb2x1bW5EZWYuYWNjZXNzb3JLZXldXG4gICAgfVxuICB9XG5cbiAgaWYgKCFpZCkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHJlc29sdmVkQ29sdW1uRGVmLmFjY2Vzc29yRm5cbiAgICAgICAgICA/IGBDb2x1bW5zIHJlcXVpcmUgYW4gaWQgd2hlbiB1c2luZyBhbiBhY2Nlc3NvckZuYFxuICAgICAgICAgIDogYENvbHVtbnMgcmVxdWlyZSBhbiBpZCB3aGVuIHVzaW5nIGEgbm9uLXN0cmluZyBoZWFkZXJgXG4gICAgICApXG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcigpXG4gIH1cblxuICBsZXQgY29sdW1uOiBDb3JlQ29sdW1uPFREYXRhLCBhbnk+ID0ge1xuICAgIGlkOiBgJHtTdHJpbmcoaWQpfWAsXG4gICAgYWNjZXNzb3JGbixcbiAgICBwYXJlbnQ6IHBhcmVudCBhcyBhbnksXG4gICAgZGVwdGgsXG4gICAgY29sdW1uRGVmOiByZXNvbHZlZENvbHVtbkRlZiBhcyBDb2x1bW5EZWY8VERhdGEsIGFueT4sXG4gICAgY29sdW1uczogW10sXG4gICAgZ2V0RmxhdENvbHVtbnM6IG1lbW8oXG4gICAgICAoKSA9PiBbdHJ1ZV0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgY29sdW1uIGFzIENvbHVtbjxURGF0YSwgVFZhbHVlPixcbiAgICAgICAgICAuLi5jb2x1bW4uY29sdW1ucz8uZmxhdE1hcChkID0+IGQuZ2V0RmxhdENvbHVtbnMoKSksXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJyAmJiAnY29sdW1uLmdldEZsYXRDb2x1bW5zJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0NvbHVtbnMsXG4gICAgICB9XG4gICAgKSxcbiAgICBnZXRMZWFmQ29sdW1uczogbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5fZ2V0T3JkZXJDb2x1bW5zRm4oKV0sXG4gICAgICBvcmRlckNvbHVtbnMgPT4ge1xuICAgICAgICBpZiAoY29sdW1uLmNvbHVtbnM/Lmxlbmd0aCkge1xuICAgICAgICAgIGxldCBsZWFmQ29sdW1ucyA9IGNvbHVtbi5jb2x1bW5zLmZsYXRNYXAoY29sdW1uID0+XG4gICAgICAgICAgICBjb2x1bW4uZ2V0TGVhZkNvbHVtbnMoKVxuICAgICAgICAgIClcblxuICAgICAgICAgIHJldHVybiBvcmRlckNvbHVtbnMobGVhZkNvbHVtbnMpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW2NvbHVtbiBhcyBDb2x1bW48VERhdGEsIFRWYWx1ZT5dXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicgJiYgJ2NvbHVtbi5nZXRMZWFmQ29sdW1ucycsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdDb2x1bW5zLFxuICAgICAgfVxuICAgICksXG4gIH1cblxuICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgdGFibGUuX2ZlYXR1cmVzKSB7XG4gICAgZmVhdHVyZS5jcmVhdGVDb2x1bW4/Lihjb2x1bW4sIHRhYmxlKVxuICB9XG5cbiAgLy8gWWVzLCB3ZSBoYXZlIHRvIGNvbnZlcnQgdGFibGUgdG8gdWtub3duLCBiZWNhdXNlIHdlIGtub3cgbW9yZSB0aGFuIHRoZSBjb21waWxlciBoZXJlLlxuICByZXR1cm4gY29sdW1uIGFzIENvbHVtbjxURGF0YSwgVFZhbHVlPlxufVxuIiwiaW1wb3J0IHsgUm93RGF0YSwgQ29sdW1uLCBIZWFkZXIsIEhlYWRlckdyb3VwLCBUYWJsZSB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgbWVtbyB9IGZyb20gJy4uL3V0aWxzJ1xuaW1wb3J0IHsgVGFibGVGZWF0dXJlIH0gZnJvbSAnLi90YWJsZSdcblxuZXhwb3J0IGludGVyZmFjZSBDb3JlSGVhZGVyR3JvdXA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiB7XG4gIGRlcHRoOiBudW1iZXJcbiAgaGVhZGVyczogSGVhZGVyPFREYXRhLCB1bmtub3duPltdXG4gIGlkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIZWFkZXJDb250ZXh0PFREYXRhLCBUVmFsdWU+IHtcbiAgLyoqXG4gICAqIEFuIGluc3RhbmNlIG9mIGEgY29sdW1uLlxuICAgKi9cbiAgY29sdW1uOiBDb2x1bW48VERhdGEsIFRWYWx1ZT5cbiAgLyoqXG4gICAqIEFuIGluc3RhbmNlIG9mIGEgaGVhZGVyLlxuICAgKi9cbiAgaGVhZGVyOiBIZWFkZXI8VERhdGEsIFRWYWx1ZT5cbiAgLyoqXG4gICAqIFRoZSB0YWJsZSBpbnN0YW5jZS5cbiAgICovXG4gIHRhYmxlOiBUYWJsZTxURGF0YT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb3JlSGVhZGVyPFREYXRhIGV4dGVuZHMgUm93RGF0YSwgVFZhbHVlPiB7XG4gIC8qKlxuICAgKiBUaGUgY29sLXNwYW4gZm9yIHRoZSBoZWFkZXIuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXIjY29sc3BhbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2hlYWRlcnMpXG4gICAqL1xuICBjb2xTcGFuOiBudW1iZXJcbiAgLyoqXG4gICAqIFRoZSBoZWFkZXIncyBhc3NvY2lhdGVkIGNvbHVtbiBvYmplY3QuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXIjY29sdW1uKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIGNvbHVtbjogQ29sdW1uPFREYXRhLCBUVmFsdWU+XG4gIC8qKlxuICAgKiBUaGUgZGVwdGggb2YgdGhlIGhlYWRlciwgemVyby1pbmRleGVkIGJhc2VkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvaGVhZGVyI2RlcHRoKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIGRlcHRoOiBudW1iZXJcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlbmRlcmluZyBjb250ZXh0IChvciBwcm9wcykgZm9yIGNvbHVtbi1iYXNlZCBjb21wb25lbnRzIGxpa2UgaGVhZGVycywgZm9vdGVycyBhbmQgZmlsdGVycy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2hlYWRlciNnZXRjb250ZXh0KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIGdldENvbnRleHQ6ICgpID0+IEhlYWRlckNvbnRleHQ8VERhdGEsIFRWYWx1ZT5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxlYWYgaGVhZGVycyBoaWVyYXJjaGljYWxseSBuZXN0ZWQgdW5kZXIgdGhpcyBoZWFkZXIuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXIjZ2V0bGVhZmhlYWRlcnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9oZWFkZXJzKVxuICAgKi9cbiAgZ2V0TGVhZkhlYWRlcnM6ICgpID0+IEhlYWRlcjxURGF0YSwgdW5rbm93bj5bXVxuICAvKipcbiAgICogVGhlIGhlYWRlcidzIGFzc29jaWF0ZWQgaGVhZGVyIGdyb3VwIG9iamVjdC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2hlYWRlciNoZWFkZXJncm91cClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2hlYWRlcnMpXG4gICAqL1xuICBoZWFkZXJHcm91cDogSGVhZGVyR3JvdXA8VERhdGE+XG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBoZWFkZXIuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXIjaWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9oZWFkZXJzKVxuICAgKi9cbiAgaWQ6IHN0cmluZ1xuICAvKipcbiAgICogVGhlIGluZGV4IGZvciB0aGUgaGVhZGVyIHdpdGhpbiB0aGUgaGVhZGVyIGdyb3VwLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvaGVhZGVyI2luZGV4KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIGluZGV4OiBudW1iZXJcbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBkZW5vdGluZyBpZiB0aGUgaGVhZGVyIGlzIGEgcGxhY2Vob2xkZXIgaGVhZGVyLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvaGVhZGVyI2lzcGxhY2Vob2xkZXIpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9oZWFkZXJzKVxuICAgKi9cbiAgaXNQbGFjZWhvbGRlcjogYm9vbGVhblxuICAvKipcbiAgICogSWYgdGhlIGhlYWRlciBpcyBhIHBsYWNlaG9sZGVyIGhlYWRlciwgdGhpcyB3aWxsIGJlIGEgdW5pcXVlIGhlYWRlciBJRCB0aGF0IGRvZXMgbm90IGNvbmZsaWN0IHdpdGggYW55IG90aGVyIGhlYWRlcnMgYWNyb3NzIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2hlYWRlciNwbGFjZWhvbGRlcmlkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIHBsYWNlaG9sZGVySWQ/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFRoZSByb3ctc3BhbiBmb3IgdGhlIGhlYWRlci5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2hlYWRlciNyb3dzcGFuKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIHJvd1NwYW46IG51bWJlclxuICAvKipcbiAgICogVGhlIGhlYWRlcidzIGhpZXJhcmNoaWNhbCBzdWIvY2hpbGQgaGVhZGVycy4gV2lsbCBiZSBlbXB0eSBpZiB0aGUgaGVhZGVyJ3MgYXNzb2NpYXRlZCBjb2x1bW4gaXMgYSBsZWFmLWNvbHVtbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2hlYWRlciNzdWJoZWFkZXJzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIHN1YkhlYWRlcnM6IEhlYWRlcjxURGF0YSwgVFZhbHVlPltdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyc0luc3RhbmNlPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICAvKipcbiAgICogUmV0dXJucyBhbGwgaGVhZGVyIGdyb3VwcyBmb3IgdGhlIHRhYmxlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvaGVhZGVycyNnZXRoZWFkZXJncm91cHMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9oZWFkZXJzKVxuICAgKi9cbiAgZ2V0SGVhZGVyR3JvdXBzOiAoKSA9PiBIZWFkZXJHcm91cDxURGF0YT5bXVxuICAvKipcbiAgICogSWYgcGlubmluZywgcmV0dXJucyB0aGUgaGVhZGVyIGdyb3VwcyBmb3IgdGhlIGxlZnQgcGlubmVkIGNvbHVtbnMuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXJzI2dldGxlZnRoZWFkZXJncm91cHMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9oZWFkZXJzKVxuICAgKi9cbiAgZ2V0TGVmdEhlYWRlckdyb3VwczogKCkgPT4gSGVhZGVyR3JvdXA8VERhdGE+W11cbiAgLyoqXG4gICAqIElmIHBpbm5pbmcsIHJldHVybnMgdGhlIGhlYWRlciBncm91cHMgZm9yIGNvbHVtbnMgdGhhdCBhcmUgbm90IHBpbm5lZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2hlYWRlcnMjZ2V0Y2VudGVyaGVhZGVyZ3JvdXBzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIGdldENlbnRlckhlYWRlckdyb3VwczogKCkgPT4gSGVhZGVyR3JvdXA8VERhdGE+W11cbiAgLyoqXG4gICAqIElmIHBpbm5pbmcsIHJldHVybnMgdGhlIGhlYWRlciBncm91cHMgZm9yIHRoZSByaWdodCBwaW5uZWQgY29sdW1ucy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2hlYWRlcnMjZ2V0cmlnaHRoZWFkZXJncm91cHMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9oZWFkZXJzKVxuICAgKi9cbiAgZ2V0UmlnaHRIZWFkZXJHcm91cHM6ICgpID0+IEhlYWRlckdyb3VwPFREYXRhPltdXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZvb3RlciBncm91cHMgZm9yIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2hlYWRlcnMjZ2V0Zm9vdGVyZ3JvdXBzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIGdldEZvb3Rlckdyb3VwczogKCkgPT4gSGVhZGVyR3JvdXA8VERhdGE+W11cbiAgLyoqXG4gICAqIElmIHBpbm5pbmcsIHJldHVybnMgdGhlIGZvb3RlciBncm91cHMgZm9yIHRoZSBsZWZ0IHBpbm5lZCBjb2x1bW5zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvaGVhZGVycyNnZXRsZWZ0Zm9vdGVyZ3JvdXBzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIGdldExlZnRGb290ZXJHcm91cHM6ICgpID0+IEhlYWRlckdyb3VwPFREYXRhPltdXG4gIC8qKlxuICAgKiBJZiBwaW5uaW5nLCByZXR1cm5zIHRoZSBmb290ZXIgZ3JvdXBzIGZvciBjb2x1bW5zIHRoYXQgYXJlIG5vdCBwaW5uZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXJzI2dldGNlbnRlcmZvb3Rlcmdyb3VwcylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2hlYWRlcnMpXG4gICAqL1xuICBnZXRDZW50ZXJGb290ZXJHcm91cHM6ICgpID0+IEhlYWRlckdyb3VwPFREYXRhPltdXG4gIC8qKlxuICAgKiBJZiBwaW5uaW5nLCByZXR1cm5zIHRoZSBmb290ZXIgZ3JvdXBzIGZvciB0aGUgcmlnaHQgcGlubmVkIGNvbHVtbnMuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXJzI2dldHJpZ2h0Zm9vdGVyZ3JvdXBzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIGdldFJpZ2h0Rm9vdGVyR3JvdXBzOiAoKSA9PiBIZWFkZXJHcm91cDxURGF0YT5bXVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGhlYWRlcnMgZm9yIGFsbCBjb2x1bW5zIGluIHRoZSB0YWJsZSwgaW5jbHVkaW5nIHBhcmVudCBoZWFkZXJzLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvaGVhZGVycyNnZXRmbGF0aGVhZGVycylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2hlYWRlcnMpXG4gICAqL1xuICBnZXRGbGF0SGVhZGVyczogKCkgPT4gSGVhZGVyPFREYXRhLCB1bmtub3duPltdXG4gIC8qKlxuICAgKiBJZiBwaW5uaW5nLCByZXR1cm5zIGhlYWRlcnMgZm9yIGFsbCBsZWZ0IHBpbm5lZCBjb2x1bW5zIGluIHRoZSB0YWJsZSwgaW5jbHVkaW5nIHBhcmVudCBoZWFkZXJzLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvaGVhZGVycyNnZXRsZWZ0ZmxhdGhlYWRlcnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9oZWFkZXJzKVxuICAgKi9cbiAgZ2V0TGVmdEZsYXRIZWFkZXJzOiAoKSA9PiBIZWFkZXI8VERhdGEsIHVua25vd24+W11cbiAgLyoqXG4gICAqIElmIHBpbm5pbmcsIHJldHVybnMgaGVhZGVycyBmb3IgYWxsIGNvbHVtbnMgdGhhdCBhcmUgbm90IHBpbm5lZCwgaW5jbHVkaW5nIHBhcmVudCBoZWFkZXJzLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvaGVhZGVycyNnZXRjZW50ZXJmbGF0aGVhZGVycylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2hlYWRlcnMpXG4gICAqL1xuICBnZXRDZW50ZXJGbGF0SGVhZGVyczogKCkgPT4gSGVhZGVyPFREYXRhLCB1bmtub3duPltdXG4gIC8qKlxuICAgKiBJZiBwaW5uaW5nLCByZXR1cm5zIGhlYWRlcnMgZm9yIGFsbCByaWdodCBwaW5uZWQgY29sdW1ucyBpbiB0aGUgdGFibGUsIGluY2x1ZGluZyBwYXJlbnQgaGVhZGVycy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2hlYWRlcnMjZ2V0cmlnaHRmbGF0aGVhZGVycylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2hlYWRlcnMpXG4gICAqL1xuICBnZXRSaWdodEZsYXRIZWFkZXJzOiAoKSA9PiBIZWFkZXI8VERhdGEsIHVua25vd24+W11cblxuICAvKipcbiAgICogUmV0dXJucyBoZWFkZXJzIGZvciBhbGwgbGVhZiBjb2x1bW5zIGluIHRoZSB0YWJsZSwgKG5vdCBpbmNsdWRpbmcgcGFyZW50IGhlYWRlcnMpLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvaGVhZGVycyNnZXRsZWFmaGVhZGVycylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2hlYWRlcnMpXG4gICAqL1xuICBnZXRMZWFmSGVhZGVyczogKCkgPT4gSGVhZGVyPFREYXRhLCB1bmtub3duPltdXG4gIC8qKlxuICAgKiBJZiBwaW5uaW5nLCByZXR1cm5zIGhlYWRlcnMgZm9yIGFsbCBsZWZ0IHBpbm5lZCBsZWFmIGNvbHVtbnMgaW4gdGhlIHRhYmxlLCAobm90IGluY2x1ZGluZyBwYXJlbnQgaGVhZGVycykuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXJzI2dldGxlZnRsZWFmaGVhZGVycylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2hlYWRlcnMpXG4gICAqL1xuICBnZXRMZWZ0TGVhZkhlYWRlcnM6ICgpID0+IEhlYWRlcjxURGF0YSwgdW5rbm93bj5bXVxuICAvKipcbiAgICogSWYgcGlubmluZywgcmV0dXJucyBoZWFkZXJzIGZvciBhbGwgY29sdW1ucyB0aGF0IGFyZSBub3QgcGlubmVkLCAobm90IGluY2x1ZGluZyBwYXJlbnQgaGVhZGVycykuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXJzI2dldGNlbnRlcmxlYWZoZWFkZXJzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIGdldENlbnRlckxlYWZIZWFkZXJzOiAoKSA9PiBIZWFkZXI8VERhdGEsIHVua25vd24+W11cbiAgLyoqXG4gICAqIElmIHBpbm5pbmcsIHJldHVybnMgaGVhZGVycyBmb3IgYWxsIHJpZ2h0IHBpbm5lZCBsZWFmIGNvbHVtbnMgaW4gdGhlIHRhYmxlLCAobm90IGluY2x1ZGluZyBwYXJlbnQgaGVhZGVycykuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXJzI2dldHJpZ2h0bGVhZmhlYWRlcnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9oZWFkZXJzKVxuICAgKi9cbiAgZ2V0UmlnaHRMZWFmSGVhZGVyczogKCkgPT4gSGVhZGVyPFREYXRhLCB1bmtub3duPltdXG59XG5cbi8vXG5cbmZ1bmN0aW9uIGNyZWF0ZUhlYWRlcjxURGF0YSBleHRlbmRzIFJvd0RhdGEsIFRWYWx1ZT4oXG4gIHRhYmxlOiBUYWJsZTxURGF0YT4sXG4gIGNvbHVtbjogQ29sdW1uPFREYXRhLCBUVmFsdWU+LFxuICBvcHRpb25zOiB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICBpc1BsYWNlaG9sZGVyPzogYm9vbGVhblxuICAgIHBsYWNlaG9sZGVySWQ/OiBzdHJpbmdcbiAgICBpbmRleDogbnVtYmVyXG4gICAgZGVwdGg6IG51bWJlclxuICB9XG4pOiBIZWFkZXI8VERhdGEsIFRWYWx1ZT4ge1xuICBjb25zdCBpZCA9IG9wdGlvbnMuaWQgPz8gY29sdW1uLmlkXG5cbiAgbGV0IGhlYWRlcjogQ29yZUhlYWRlcjxURGF0YSwgVFZhbHVlPiA9IHtcbiAgICBpZCxcbiAgICBjb2x1bW4sXG4gICAgaW5kZXg6IG9wdGlvbnMuaW5kZXgsXG4gICAgaXNQbGFjZWhvbGRlcjogISFvcHRpb25zLmlzUGxhY2Vob2xkZXIsXG4gICAgcGxhY2Vob2xkZXJJZDogb3B0aW9ucy5wbGFjZWhvbGRlcklkLFxuICAgIGRlcHRoOiBvcHRpb25zLmRlcHRoLFxuICAgIHN1YkhlYWRlcnM6IFtdLFxuICAgIGNvbFNwYW46IDAsXG4gICAgcm93U3BhbjogMCxcbiAgICBoZWFkZXJHcm91cDogbnVsbCEsXG4gICAgZ2V0TGVhZkhlYWRlcnM6ICgpOiBIZWFkZXI8VERhdGEsIHVua25vd24+W10gPT4ge1xuICAgICAgY29uc3QgbGVhZkhlYWRlcnM6IEhlYWRlcjxURGF0YSwgdW5rbm93bj5bXSA9IFtdXG5cbiAgICAgIGNvbnN0IHJlY3Vyc2VIZWFkZXIgPSAoaDogQ29yZUhlYWRlcjxURGF0YSwgYW55PikgPT4ge1xuICAgICAgICBpZiAoaC5zdWJIZWFkZXJzICYmIGguc3ViSGVhZGVycy5sZW5ndGgpIHtcbiAgICAgICAgICBoLnN1YkhlYWRlcnMubWFwKHJlY3Vyc2VIZWFkZXIpXG4gICAgICAgIH1cbiAgICAgICAgbGVhZkhlYWRlcnMucHVzaChoIGFzIEhlYWRlcjxURGF0YSwgdW5rbm93bj4pXG4gICAgICB9XG5cbiAgICAgIHJlY3Vyc2VIZWFkZXIoaGVhZGVyKVxuXG4gICAgICByZXR1cm4gbGVhZkhlYWRlcnNcbiAgICB9LFxuICAgIGdldENvbnRleHQ6ICgpID0+ICh7XG4gICAgICB0YWJsZSxcbiAgICAgIGhlYWRlcjogaGVhZGVyIGFzIEhlYWRlcjxURGF0YSwgVFZhbHVlPixcbiAgICAgIGNvbHVtbixcbiAgICB9KSxcbiAgfVxuXG4gIHRhYmxlLl9mZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgIGZlYXR1cmUuY3JlYXRlSGVhZGVyPy4oaGVhZGVyLCB0YWJsZSlcbiAgfSlcblxuICByZXR1cm4gaGVhZGVyIGFzIEhlYWRlcjxURGF0YSwgVFZhbHVlPlxufVxuXG5leHBvcnQgY29uc3QgSGVhZGVyczogVGFibGVGZWF0dXJlID0ge1xuICBjcmVhdGVUYWJsZTogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4odGFibGU6IFRhYmxlPFREYXRhPik6IHZvaWQgPT4ge1xuICAgIC8vIEhlYWRlciBHcm91cHNcblxuICAgIHRhYmxlLmdldEhlYWRlckdyb3VwcyA9IG1lbW8oXG4gICAgICAoKSA9PiBbXG4gICAgICAgIHRhYmxlLmdldEFsbENvbHVtbnMoKSxcbiAgICAgICAgdGFibGUuZ2V0VmlzaWJsZUxlYWZDb2x1bW5zKCksXG4gICAgICAgIHRhYmxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5sZWZ0LFxuICAgICAgICB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHQsXG4gICAgICBdLFxuICAgICAgKGFsbENvbHVtbnMsIGxlYWZDb2x1bW5zLCBsZWZ0LCByaWdodCkgPT4ge1xuICAgICAgICBjb25zdCBsZWZ0Q29sdW1ucyA9XG4gICAgICAgICAgbGVmdFxuICAgICAgICAgICAgPy5tYXAoY29sdW1uSWQgPT4gbGVhZkNvbHVtbnMuZmluZChkID0+IGQuaWQgPT09IGNvbHVtbklkKSEpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pID8/IFtdXG5cbiAgICAgICAgY29uc3QgcmlnaHRDb2x1bW5zID1cbiAgICAgICAgICByaWdodFxuICAgICAgICAgICAgPy5tYXAoY29sdW1uSWQgPT4gbGVhZkNvbHVtbnMuZmluZChkID0+IGQuaWQgPT09IGNvbHVtbklkKSEpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pID8/IFtdXG5cbiAgICAgICAgY29uc3QgY2VudGVyQ29sdW1ucyA9IGxlYWZDb2x1bW5zLmZpbHRlcihcbiAgICAgICAgICBjb2x1bW4gPT4gIWxlZnQ/LmluY2x1ZGVzKGNvbHVtbi5pZCkgJiYgIXJpZ2h0Py5pbmNsdWRlcyhjb2x1bW4uaWQpXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCBoZWFkZXJHcm91cHMgPSBidWlsZEhlYWRlckdyb3VwcyhcbiAgICAgICAgICBhbGxDb2x1bW5zLFxuICAgICAgICAgIFsuLi5sZWZ0Q29sdW1ucywgLi4uY2VudGVyQ29sdW1ucywgLi4ucmlnaHRDb2x1bW5zXSxcbiAgICAgICAgICB0YWJsZVxuICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIGhlYWRlckdyb3Vwc1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAnZ2V0SGVhZGVyR3JvdXBzJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0hlYWRlcnMsXG4gICAgICB9XG4gICAgKVxuXG4gICAgdGFibGUuZ2V0Q2VudGVySGVhZGVyR3JvdXBzID0gbWVtbyhcbiAgICAgICgpID0+IFtcbiAgICAgICAgdGFibGUuZ2V0QWxsQ29sdW1ucygpLFxuICAgICAgICB0YWJsZS5nZXRWaXNpYmxlTGVhZkNvbHVtbnMoKSxcbiAgICAgICAgdGFibGUuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLmxlZnQsXG4gICAgICAgIHRhYmxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5yaWdodCxcbiAgICAgIF0sXG4gICAgICAoYWxsQ29sdW1ucywgbGVhZkNvbHVtbnMsIGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgICAgIGxlYWZDb2x1bW5zID0gbGVhZkNvbHVtbnMuZmlsdGVyKFxuICAgICAgICAgIGNvbHVtbiA9PiAhbGVmdD8uaW5jbHVkZXMoY29sdW1uLmlkKSAmJiAhcmlnaHQ/LmluY2x1ZGVzKGNvbHVtbi5pZClcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gYnVpbGRIZWFkZXJHcm91cHMoYWxsQ29sdW1ucywgbGVhZkNvbHVtbnMsIHRhYmxlLCAnY2VudGVyJylcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldENlbnRlckhlYWRlckdyb3VwcycsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdIZWFkZXJzLFxuICAgICAgfVxuICAgIClcblxuICAgIHRhYmxlLmdldExlZnRIZWFkZXJHcm91cHMgPSBtZW1vKFxuICAgICAgKCkgPT4gW1xuICAgICAgICB0YWJsZS5nZXRBbGxDb2x1bW5zKCksXG4gICAgICAgIHRhYmxlLmdldFZpc2libGVMZWFmQ29sdW1ucygpLFxuICAgICAgICB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcubGVmdCxcbiAgICAgIF0sXG4gICAgICAoYWxsQ29sdW1ucywgbGVhZkNvbHVtbnMsIGxlZnQpID0+IHtcbiAgICAgICAgY29uc3Qgb3JkZXJlZExlYWZDb2x1bW5zID1cbiAgICAgICAgICBsZWZ0XG4gICAgICAgICAgICA/Lm1hcChjb2x1bW5JZCA9PiBsZWFmQ29sdW1ucy5maW5kKGQgPT4gZC5pZCA9PT0gY29sdW1uSWQpISlcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgPz8gW11cblxuICAgICAgICByZXR1cm4gYnVpbGRIZWFkZXJHcm91cHMoYWxsQ29sdW1ucywgb3JkZXJlZExlYWZDb2x1bW5zLCB0YWJsZSwgJ2xlZnQnKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAnZ2V0TGVmdEhlYWRlckdyb3VwcycsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdIZWFkZXJzLFxuICAgICAgfVxuICAgIClcblxuICAgIHRhYmxlLmdldFJpZ2h0SGVhZGVyR3JvdXBzID0gbWVtbyhcbiAgICAgICgpID0+IFtcbiAgICAgICAgdGFibGUuZ2V0QWxsQ29sdW1ucygpLFxuICAgICAgICB0YWJsZS5nZXRWaXNpYmxlTGVhZkNvbHVtbnMoKSxcbiAgICAgICAgdGFibGUuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLnJpZ2h0LFxuICAgICAgXSxcbiAgICAgIChhbGxDb2x1bW5zLCBsZWFmQ29sdW1ucywgcmlnaHQpID0+IHtcbiAgICAgICAgY29uc3Qgb3JkZXJlZExlYWZDb2x1bW5zID1cbiAgICAgICAgICByaWdodFxuICAgICAgICAgICAgPy5tYXAoY29sdW1uSWQgPT4gbGVhZkNvbHVtbnMuZmluZChkID0+IGQuaWQgPT09IGNvbHVtbklkKSEpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pID8/IFtdXG5cbiAgICAgICAgcmV0dXJuIGJ1aWxkSGVhZGVyR3JvdXBzKGFsbENvbHVtbnMsIG9yZGVyZWRMZWFmQ29sdW1ucywgdGFibGUsICdyaWdodCcpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRSaWdodEhlYWRlckdyb3VwcycsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdIZWFkZXJzLFxuICAgICAgfVxuICAgIClcblxuICAgIC8vIEZvb3RlciBHcm91cHNcblxuICAgIHRhYmxlLmdldEZvb3Rlckdyb3VwcyA9IG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUuZ2V0SGVhZGVyR3JvdXBzKCldLFxuICAgICAgaGVhZGVyR3JvdXBzID0+IHtcbiAgICAgICAgcmV0dXJuIFsuLi5oZWFkZXJHcm91cHNdLnJldmVyc2UoKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAnZ2V0Rm9vdGVyR3JvdXBzJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0hlYWRlcnMsXG4gICAgICB9XG4gICAgKVxuXG4gICAgdGFibGUuZ2V0TGVmdEZvb3Rlckdyb3VwcyA9IG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUuZ2V0TGVmdEhlYWRlckdyb3VwcygpXSxcbiAgICAgIGhlYWRlckdyb3VwcyA9PiB7XG4gICAgICAgIHJldHVybiBbLi4uaGVhZGVyR3JvdXBzXS5yZXZlcnNlKClcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldExlZnRGb290ZXJHcm91cHMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnSGVhZGVycyxcbiAgICAgIH1cbiAgICApXG5cbiAgICB0YWJsZS5nZXRDZW50ZXJGb290ZXJHcm91cHMgPSBtZW1vKFxuICAgICAgKCkgPT4gW3RhYmxlLmdldENlbnRlckhlYWRlckdyb3VwcygpXSxcbiAgICAgIGhlYWRlckdyb3VwcyA9PiB7XG4gICAgICAgIHJldHVybiBbLi4uaGVhZGVyR3JvdXBzXS5yZXZlcnNlKClcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldENlbnRlckZvb3Rlckdyb3VwcycsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdIZWFkZXJzLFxuICAgICAgfVxuICAgIClcblxuICAgIHRhYmxlLmdldFJpZ2h0Rm9vdGVyR3JvdXBzID0gbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5nZXRSaWdodEhlYWRlckdyb3VwcygpXSxcbiAgICAgIGhlYWRlckdyb3VwcyA9PiB7XG4gICAgICAgIHJldHVybiBbLi4uaGVhZGVyR3JvdXBzXS5yZXZlcnNlKClcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldFJpZ2h0Rm9vdGVyR3JvdXBzJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0hlYWRlcnMsXG4gICAgICB9XG4gICAgKVxuXG4gICAgLy8gRmxhdCBIZWFkZXJzXG5cbiAgICB0YWJsZS5nZXRGbGF0SGVhZGVycyA9IG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUuZ2V0SGVhZGVyR3JvdXBzKCldLFxuICAgICAgaGVhZGVyR3JvdXBzID0+IHtcbiAgICAgICAgcmV0dXJuIGhlYWRlckdyb3Vwc1xuICAgICAgICAgIC5tYXAoaGVhZGVyR3JvdXAgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGhlYWRlckdyb3VwLmhlYWRlcnNcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5mbGF0KClcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldEZsYXRIZWFkZXJzJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0hlYWRlcnMsXG4gICAgICB9XG4gICAgKVxuXG4gICAgdGFibGUuZ2V0TGVmdEZsYXRIZWFkZXJzID0gbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5nZXRMZWZ0SGVhZGVyR3JvdXBzKCldLFxuICAgICAgbGVmdCA9PiB7XG4gICAgICAgIHJldHVybiBsZWZ0XG4gICAgICAgICAgLm1hcChoZWFkZXJHcm91cCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaGVhZGVyR3JvdXAuaGVhZGVyc1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZsYXQoKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAnZ2V0TGVmdEZsYXRIZWFkZXJzJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0hlYWRlcnMsXG4gICAgICB9XG4gICAgKVxuXG4gICAgdGFibGUuZ2V0Q2VudGVyRmxhdEhlYWRlcnMgPSBtZW1vKFxuICAgICAgKCkgPT4gW3RhYmxlLmdldENlbnRlckhlYWRlckdyb3VwcygpXSxcbiAgICAgIGxlZnQgPT4ge1xuICAgICAgICByZXR1cm4gbGVmdFxuICAgICAgICAgIC5tYXAoaGVhZGVyR3JvdXAgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGhlYWRlckdyb3VwLmhlYWRlcnNcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5mbGF0KClcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldENlbnRlckZsYXRIZWFkZXJzJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0hlYWRlcnMsXG4gICAgICB9XG4gICAgKVxuXG4gICAgdGFibGUuZ2V0UmlnaHRGbGF0SGVhZGVycyA9IG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUuZ2V0UmlnaHRIZWFkZXJHcm91cHMoKV0sXG4gICAgICBsZWZ0ID0+IHtcbiAgICAgICAgcmV0dXJuIGxlZnRcbiAgICAgICAgICAubWFwKGhlYWRlckdyb3VwID0+IHtcbiAgICAgICAgICAgIHJldHVybiBoZWFkZXJHcm91cC5oZWFkZXJzXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmxhdCgpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRSaWdodEZsYXRIZWFkZXJzJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0hlYWRlcnMsXG4gICAgICB9XG4gICAgKVxuXG4gICAgLy8gTGVhZiBIZWFkZXJzXG5cbiAgICB0YWJsZS5nZXRDZW50ZXJMZWFmSGVhZGVycyA9IG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUuZ2V0Q2VudGVyRmxhdEhlYWRlcnMoKV0sXG4gICAgICBmbGF0SGVhZGVycyA9PiB7XG4gICAgICAgIHJldHVybiBmbGF0SGVhZGVycy5maWx0ZXIoaGVhZGVyID0+ICFoZWFkZXIuc3ViSGVhZGVycz8ubGVuZ3RoKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAnZ2V0Q2VudGVyTGVhZkhlYWRlcnMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnSGVhZGVycyxcbiAgICAgIH1cbiAgICApXG5cbiAgICB0YWJsZS5nZXRMZWZ0TGVhZkhlYWRlcnMgPSBtZW1vKFxuICAgICAgKCkgPT4gW3RhYmxlLmdldExlZnRGbGF0SGVhZGVycygpXSxcbiAgICAgIGZsYXRIZWFkZXJzID0+IHtcbiAgICAgICAgcmV0dXJuIGZsYXRIZWFkZXJzLmZpbHRlcihoZWFkZXIgPT4gIWhlYWRlci5zdWJIZWFkZXJzPy5sZW5ndGgpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRMZWZ0TGVhZkhlYWRlcnMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnSGVhZGVycyxcbiAgICAgIH1cbiAgICApXG5cbiAgICB0YWJsZS5nZXRSaWdodExlYWZIZWFkZXJzID0gbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5nZXRSaWdodEZsYXRIZWFkZXJzKCldLFxuICAgICAgZmxhdEhlYWRlcnMgPT4ge1xuICAgICAgICByZXR1cm4gZmxhdEhlYWRlcnMuZmlsdGVyKGhlYWRlciA9PiAhaGVhZGVyLnN1YkhlYWRlcnM/Lmxlbmd0aClcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldFJpZ2h0TGVhZkhlYWRlcnMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnSGVhZGVycyxcbiAgICAgIH1cbiAgICApXG5cbiAgICB0YWJsZS5nZXRMZWFmSGVhZGVycyA9IG1lbW8oXG4gICAgICAoKSA9PiBbXG4gICAgICAgIHRhYmxlLmdldExlZnRIZWFkZXJHcm91cHMoKSxcbiAgICAgICAgdGFibGUuZ2V0Q2VudGVySGVhZGVyR3JvdXBzKCksXG4gICAgICAgIHRhYmxlLmdldFJpZ2h0SGVhZGVyR3JvdXBzKCksXG4gICAgICBdLFxuICAgICAgKGxlZnQsIGNlbnRlciwgcmlnaHQpID0+IHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAuLi4obGVmdFswXT8uaGVhZGVycyA/PyBbXSksXG4gICAgICAgICAgLi4uKGNlbnRlclswXT8uaGVhZGVycyA/PyBbXSksXG4gICAgICAgICAgLi4uKHJpZ2h0WzBdPy5oZWFkZXJzID8/IFtdKSxcbiAgICAgICAgXVxuICAgICAgICAgIC5tYXAoaGVhZGVyID0+IHtcbiAgICAgICAgICAgIHJldHVybiBoZWFkZXIuZ2V0TGVhZkhlYWRlcnMoKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZsYXQoKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAnZ2V0TGVhZkhlYWRlcnMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnSGVhZGVycyxcbiAgICAgIH1cbiAgICApXG4gIH0sXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEhlYWRlckdyb3VwczxURGF0YSBleHRlbmRzIFJvd0RhdGE+KFxuICBhbGxDb2x1bW5zOiBDb2x1bW48VERhdGEsIHVua25vd24+W10sXG4gIGNvbHVtbnNUb0dyb3VwOiBDb2x1bW48VERhdGEsIHVua25vd24+W10sXG4gIHRhYmxlOiBUYWJsZTxURGF0YT4sXG4gIGhlYWRlckZhbWlseT86ICdjZW50ZXInIHwgJ2xlZnQnIHwgJ3JpZ2h0J1xuKSB7XG4gIC8vIEZpbmQgdGhlIG1heCBkZXB0aCBvZiB0aGUgY29sdW1uczpcbiAgLy8gYnVpbGQgdGhlIGxlYWYgY29sdW1uIHJvd1xuICAvLyBidWlsZCBlYWNoIGJ1ZmZlciByb3cgZ29pbmcgdXBcbiAgLy8gICAgcGxhY2Vob2xkZXIgZm9yIG5vbi1leGlzdGVudCBsZXZlbFxuICAvLyAgICByZWFsIGNvbHVtbiBmb3IgZXhpc3RpbmcgbGV2ZWxcblxuICBsZXQgbWF4RGVwdGggPSAwXG5cbiAgY29uc3QgZmluZE1heERlcHRoID0gKGNvbHVtbnM6IENvbHVtbjxURGF0YSwgdW5rbm93bj5bXSwgZGVwdGggPSAxKSA9PiB7XG4gICAgbWF4RGVwdGggPSBNYXRoLm1heChtYXhEZXB0aCwgZGVwdGgpXG5cbiAgICBjb2x1bW5zXG4gICAgICAuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uZ2V0SXNWaXNpYmxlKCkpXG4gICAgICAuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgICAgICBpZiAoY29sdW1uLmNvbHVtbnM/Lmxlbmd0aCkge1xuICAgICAgICAgIGZpbmRNYXhEZXB0aChjb2x1bW4uY29sdW1ucywgZGVwdGggKyAxKVxuICAgICAgICB9XG4gICAgICB9LCAwKVxuICB9XG5cbiAgZmluZE1heERlcHRoKGFsbENvbHVtbnMpXG5cbiAgbGV0IGhlYWRlckdyb3VwczogSGVhZGVyR3JvdXA8VERhdGE+W10gPSBbXVxuXG4gIGNvbnN0IGNyZWF0ZUhlYWRlckdyb3VwID0gKFxuICAgIGhlYWRlcnNUb0dyb3VwOiBIZWFkZXI8VERhdGEsIHVua25vd24+W10sXG4gICAgZGVwdGg6IG51bWJlclxuICApID0+IHtcbiAgICAvLyBUaGUgaGVhZGVyIGdyb3VwIHdlIGFyZSBjcmVhdGluZ1xuICAgIGNvbnN0IGhlYWRlckdyb3VwOiBIZWFkZXJHcm91cDxURGF0YT4gPSB7XG4gICAgICBkZXB0aCxcbiAgICAgIGlkOiBbaGVhZGVyRmFtaWx5LCBgJHtkZXB0aH1gXS5maWx0ZXIoQm9vbGVhbikuam9pbignXycpLFxuICAgICAgaGVhZGVyczogW10sXG4gICAgfVxuXG4gICAgLy8gVGhlIHBhcmVudCBjb2x1bW5zIHdlJ3JlIGdvaW5nIHRvIHNjYW4gbmV4dFxuICAgIGNvbnN0IHBlbmRpbmdQYXJlbnRIZWFkZXJzOiBIZWFkZXI8VERhdGEsIHVua25vd24+W10gPSBbXVxuXG4gICAgLy8gU2NhbiBlYWNoIGNvbHVtbiBmb3IgcGFyZW50c1xuICAgIGhlYWRlcnNUb0dyb3VwLmZvckVhY2goaGVhZGVyVG9Hcm91cCA9PiB7XG4gICAgICAvLyBXaGF0IGlzIHRoZSBsYXRlc3QgKGxhc3QpIHBhcmVudCBjb2x1bW4/XG5cbiAgICAgIGNvbnN0IGxhdGVzdFBlbmRpbmdQYXJlbnRIZWFkZXIgPSBbLi4ucGVuZGluZ1BhcmVudEhlYWRlcnNdLnJldmVyc2UoKVswXVxuXG4gICAgICBjb25zdCBpc0xlYWZIZWFkZXIgPSBoZWFkZXJUb0dyb3VwLmNvbHVtbi5kZXB0aCA9PT0gaGVhZGVyR3JvdXAuZGVwdGhcblxuICAgICAgbGV0IGNvbHVtbjogQ29sdW1uPFREYXRhLCB1bmtub3duPlxuICAgICAgbGV0IGlzUGxhY2Vob2xkZXIgPSBmYWxzZVxuXG4gICAgICBpZiAoaXNMZWFmSGVhZGVyICYmIGhlYWRlclRvR3JvdXAuY29sdW1uLnBhcmVudCkge1xuICAgICAgICAvLyBUaGUgcGFyZW50IGhlYWRlciBpcyBuZXdcbiAgICAgICAgY29sdW1uID0gaGVhZGVyVG9Hcm91cC5jb2x1bW4ucGFyZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGUgcGFyZW50IGhlYWRlciBpcyByZXBlYXRlZFxuICAgICAgICBjb2x1bW4gPSBoZWFkZXJUb0dyb3VwLmNvbHVtblxuICAgICAgICBpc1BsYWNlaG9sZGVyID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGxhdGVzdFBlbmRpbmdQYXJlbnRIZWFkZXIgJiZcbiAgICAgICAgbGF0ZXN0UGVuZGluZ1BhcmVudEhlYWRlcj8uY29sdW1uID09PSBjb2x1bW5cbiAgICAgICkge1xuICAgICAgICAvLyBUaGlzIGNvbHVtbiBpcyByZXBlYXRlZC4gQWRkIGl0IGFzIGEgc3ViIGhlYWRlciB0byB0aGUgbmV4dCBiYXRjaFxuICAgICAgICBsYXRlc3RQZW5kaW5nUGFyZW50SGVhZGVyLnN1YkhlYWRlcnMucHVzaChoZWFkZXJUb0dyb3VwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBoZWFkZXIuIExldCdzIGNyZWF0ZSBpdFxuICAgICAgICBjb25zdCBoZWFkZXIgPSBjcmVhdGVIZWFkZXIodGFibGUsIGNvbHVtbiwge1xuICAgICAgICAgIGlkOiBbaGVhZGVyRmFtaWx5LCBkZXB0aCwgY29sdW1uLmlkLCBoZWFkZXJUb0dyb3VwPy5pZF1cbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgIC5qb2luKCdfJyksXG4gICAgICAgICAgaXNQbGFjZWhvbGRlcixcbiAgICAgICAgICBwbGFjZWhvbGRlcklkOiBpc1BsYWNlaG9sZGVyXG4gICAgICAgICAgICA/IGAke3BlbmRpbmdQYXJlbnRIZWFkZXJzLmZpbHRlcihkID0+IGQuY29sdW1uID09PSBjb2x1bW4pLmxlbmd0aH1gXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICBpbmRleDogcGVuZGluZ1BhcmVudEhlYWRlcnMubGVuZ3RoLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIEFkZCB0aGUgaGVhZGVyVG9Hcm91cCBhcyBhIHN1YkhlYWRlciBvZiB0aGUgbmV3IGhlYWRlclxuICAgICAgICBoZWFkZXIuc3ViSGVhZGVycy5wdXNoKGhlYWRlclRvR3JvdXApXG4gICAgICAgIC8vIEFkZCB0aGUgbmV3IGhlYWRlciB0byB0aGUgcGVuZGluZ1BhcmVudEhlYWRlcnMgdG8gZ2V0IGdyb3VwZWRcbiAgICAgICAgLy8gaW4gdGhlIG5leHQgYmF0Y2hcbiAgICAgICAgcGVuZGluZ1BhcmVudEhlYWRlcnMucHVzaChoZWFkZXIpXG4gICAgICB9XG5cbiAgICAgIGhlYWRlckdyb3VwLmhlYWRlcnMucHVzaChoZWFkZXJUb0dyb3VwKVxuICAgICAgaGVhZGVyVG9Hcm91cC5oZWFkZXJHcm91cCA9IGhlYWRlckdyb3VwXG4gICAgfSlcblxuICAgIGhlYWRlckdyb3Vwcy5wdXNoKGhlYWRlckdyb3VwKVxuXG4gICAgaWYgKGRlcHRoID4gMCkge1xuICAgICAgY3JlYXRlSGVhZGVyR3JvdXAocGVuZGluZ1BhcmVudEhlYWRlcnMsIGRlcHRoIC0gMSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBib3R0b21IZWFkZXJzID0gY29sdW1uc1RvR3JvdXAubWFwKChjb2x1bW4sIGluZGV4KSA9PlxuICAgIGNyZWF0ZUhlYWRlcih0YWJsZSwgY29sdW1uLCB7XG4gICAgICBkZXB0aDogbWF4RGVwdGgsXG4gICAgICBpbmRleCxcbiAgICB9KVxuICApXG5cbiAgY3JlYXRlSGVhZGVyR3JvdXAoYm90dG9tSGVhZGVycywgbWF4RGVwdGggLSAxKVxuXG4gIGhlYWRlckdyb3Vwcy5yZXZlcnNlKClcblxuICAvLyBoZWFkZXJHcm91cHMgPSBoZWFkZXJHcm91cHMuZmlsdGVyKGhlYWRlckdyb3VwID0+IHtcbiAgLy8gICByZXR1cm4gIWhlYWRlckdyb3VwLmhlYWRlcnMuZXZlcnkoaGVhZGVyID0+IGhlYWRlci5pc1BsYWNlaG9sZGVyKVxuICAvLyB9KVxuXG4gIGNvbnN0IHJlY3Vyc2VIZWFkZXJzRm9yU3BhbnMgPSAoXG4gICAgaGVhZGVyczogSGVhZGVyPFREYXRhLCB1bmtub3duPltdXG4gICk6IHsgY29sU3BhbjogbnVtYmVyOyByb3dTcGFuOiBudW1iZXIgfVtdID0+IHtcbiAgICBjb25zdCBmaWx0ZXJlZEhlYWRlcnMgPSBoZWFkZXJzLmZpbHRlcihoZWFkZXIgPT5cbiAgICAgIGhlYWRlci5jb2x1bW4uZ2V0SXNWaXNpYmxlKClcbiAgICApXG5cbiAgICByZXR1cm4gZmlsdGVyZWRIZWFkZXJzLm1hcChoZWFkZXIgPT4ge1xuICAgICAgbGV0IGNvbFNwYW4gPSAwXG4gICAgICBsZXQgcm93U3BhbiA9IDBcbiAgICAgIGxldCBjaGlsZFJvd1NwYW5zID0gWzBdXG5cbiAgICAgIGlmIChoZWFkZXIuc3ViSGVhZGVycyAmJiBoZWFkZXIuc3ViSGVhZGVycy5sZW5ndGgpIHtcbiAgICAgICAgY2hpbGRSb3dTcGFucyA9IFtdXG5cbiAgICAgICAgcmVjdXJzZUhlYWRlcnNGb3JTcGFucyhoZWFkZXIuc3ViSGVhZGVycykuZm9yRWFjaChcbiAgICAgICAgICAoeyBjb2xTcGFuOiBjaGlsZENvbFNwYW4sIHJvd1NwYW46IGNoaWxkUm93U3BhbiB9KSA9PiB7XG4gICAgICAgICAgICBjb2xTcGFuICs9IGNoaWxkQ29sU3BhblxuICAgICAgICAgICAgY2hpbGRSb3dTcGFucy5wdXNoKGNoaWxkUm93U3BhbilcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbFNwYW4gPSAxXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1pbkNoaWxkUm93U3BhbiA9IE1hdGgubWluKC4uLmNoaWxkUm93U3BhbnMpXG4gICAgICByb3dTcGFuID0gcm93U3BhbiArIG1pbkNoaWxkUm93U3BhblxuXG4gICAgICBoZWFkZXIuY29sU3BhbiA9IGNvbFNwYW5cbiAgICAgIGhlYWRlci5yb3dTcGFuID0gcm93U3BhblxuXG4gICAgICByZXR1cm4geyBjb2xTcGFuLCByb3dTcGFuIH1cbiAgICB9KVxuICB9XG5cbiAgcmVjdXJzZUhlYWRlcnNGb3JTcGFucyhoZWFkZXJHcm91cHNbMF0/LmhlYWRlcnMgPz8gW10pXG5cbiAgcmV0dXJuIGhlYWRlckdyb3Vwc1xufVxuIiwiaW1wb3J0IHsgVGFibGVGZWF0dXJlIH0gZnJvbSAnLi4vY29yZS90YWJsZSdcbmltcG9ydCB7IFJvd0RhdGEsIENvbHVtbiwgSGVhZGVyLCBPbkNoYW5nZUZuLCBUYWJsZSwgVXBkYXRlciB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgbWFrZVN0YXRlVXBkYXRlciB9IGZyb20gJy4uL3V0aWxzJ1xuaW1wb3J0IHsgQ29sdW1uUGlubmluZ1Bvc2l0aW9uIH0gZnJvbSAnLi9QaW5uaW5nJ1xuXG4vL1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtblNpemluZ1RhYmxlU3RhdGUge1xuICBjb2x1bW5TaXppbmc6IENvbHVtblNpemluZ1N0YXRlXG4gIGNvbHVtblNpemluZ0luZm86IENvbHVtblNpemluZ0luZm9TdGF0ZVxufVxuXG5leHBvcnQgdHlwZSBDb2x1bW5TaXppbmdTdGF0ZSA9IFJlY29yZDxzdHJpbmcsIG51bWJlcj5cblxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5TaXppbmdJbmZvU3RhdGUge1xuICBjb2x1bW5TaXppbmdTdGFydDogW3N0cmluZywgbnVtYmVyXVtdXG4gIGRlbHRhT2Zmc2V0OiBudWxsIHwgbnVtYmVyXG4gIGRlbHRhUGVyY2VudGFnZTogbnVsbCB8IG51bWJlclxuICBpc1Jlc2l6aW5nQ29sdW1uOiBmYWxzZSB8IHN0cmluZ1xuICBzdGFydE9mZnNldDogbnVsbCB8IG51bWJlclxuICBzdGFydFNpemU6IG51bGwgfCBudW1iZXJcbn1cblxuZXhwb3J0IHR5cGUgQ29sdW1uUmVzaXplTW9kZSA9ICdvbkNoYW5nZScgfCAnb25FbmQnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uU2l6aW5nT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZW4gdGhlIGNvbHVtblNpemluZyBzdGF0ZSBpcyB1cGRhdGVkLiBgb25DaGFuZ2VgIHVwZGF0ZXMgdGhlIHN0YXRlIHdoZW4gdGhlIHVzZXIgaXMgZHJhZ2dpbmcgdGhlIHJlc2l6ZSBoYW5kbGUuIGBvbkVuZGAgdXBkYXRlcyB0aGUgc3RhdGUgd2hlbiB0aGUgdXNlciByZWxlYXNlcyB0aGUgcmVzaXplIGhhbmRsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tc2l6aW5nI2NvbHVtbnJlc2l6ZW1vZGUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgY29sdW1uUmVzaXplTW9kZT86IENvbHVtblJlc2l6ZU1vZGVcbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgY29sdW1uIHJlc2l6aW5nIGZvciB0aGUgY29sdW1uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjZW5hYmxlY29sdW1ucmVzaXppbmcpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgZW5hYmxlQ29sdW1uUmVzaXppbmc/OiBib29sZWFuXG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGB1cGRhdGVyRm5gIHdoZW4gYHN0YXRlLmNvbHVtblNpemluZ2AgY2hhbmdlcy4gVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgaW50ZXJuYWwgc3RhdGUgbWFuYWdlbWVudCwgc28geW91IHdpbGwgYWxzbyBuZWVkIHRvIHN1cHBseSBgc3RhdGUuY29sdW1uU2l6aW5nYCBmcm9tIHlvdXIgb3duIG1hbmFnZWQgc3RhdGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXNpemluZyNvbmNvbHVtbnNpemluZ2NoYW5nZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1zaXppbmcpXG4gICAqL1xuICBvbkNvbHVtblNpemluZ0NoYW5nZT86IE9uQ2hhbmdlRm48Q29sdW1uU2l6aW5nU3RhdGU+XG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGB1cGRhdGVyRm5gIHdoZW4gYHN0YXRlLmNvbHVtblNpemluZ0luZm9gIGNoYW5nZXMuIFRoaXMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGludGVybmFsIHN0YXRlIG1hbmFnZW1lbnQsIHNvIHlvdSB3aWxsIGFsc28gbmVlZCB0byBzdXBwbHkgYHN0YXRlLmNvbHVtblNpemluZ0luZm9gIGZyb20geW91ciBvd24gbWFuYWdlZCBzdGF0ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tc2l6aW5nI29uY29sdW1uc2l6aW5naW5mb2NoYW5nZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1zaXppbmcpXG4gICAqL1xuICBvbkNvbHVtblNpemluZ0luZm9DaGFuZ2U/OiBPbkNoYW5nZUZuPENvbHVtblNpemluZ0luZm9TdGF0ZT5cbn1cblxuZXhwb3J0IHR5cGUgQ29sdW1uU2l6aW5nRGVmYXVsdE9wdGlvbnMgPSBQaWNrPFxuICBDb2x1bW5TaXppbmdPcHRpb25zLFxuICAnY29sdW1uUmVzaXplTW9kZScgfCAnb25Db2x1bW5TaXppbmdDaGFuZ2UnIHwgJ29uQ29sdW1uU2l6aW5nSW5mb0NoYW5nZSdcbj5cblxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5TaXppbmdJbnN0YW5jZSB7XG4gIC8qKlxuICAgKiBJZiBwaW5uaW5nLCByZXR1cm5zIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBjZW50ZXIgcG9ydGlvbiBvZiB0aGUgdGFibGUgYnkgY2FsY3VsYXRpbmcgdGhlIHN1bSBvZiB0aGUgc2l6ZXMgb2YgYWxsIHVucGlubmVkL2NlbnRlciBsZWFmLWNvbHVtbnMuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXNpemluZyNnZXRjZW50ZXJ0b3RhbHNpemUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgZ2V0Q2VudGVyVG90YWxTaXplOiAoKSA9PiBudW1iZXJcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGxlZnQgcG9ydGlvbiBvZiB0aGUgdGFibGUgYnkgY2FsY3VsYXRpbmcgdGhlIHN1bSBvZiB0aGUgc2l6ZXMgb2YgYWxsIGxlZnQgbGVhZi1jb2x1bW5zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjZ2V0bGVmdHRvdGFsc2l6ZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1zaXppbmcpXG4gICAqL1xuICBnZXRMZWZ0VG90YWxTaXplOiAoKSA9PiBudW1iZXJcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIHJpZ2h0IHBvcnRpb24gb2YgdGhlIHRhYmxlIGJ5IGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgdGhlIHNpemVzIG9mIGFsbCByaWdodCBsZWFmLWNvbHVtbnMuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXNpemluZyNnZXRyaWdodHRvdGFsc2l6ZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1zaXppbmcpXG4gICAqL1xuICBnZXRSaWdodFRvdGFsU2l6ZTogKCkgPT4gbnVtYmVyXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0b3RhbCBzaXplIG9mIHRoZSB0YWJsZSBieSBjYWxjdWxhdGluZyB0aGUgc3VtIG9mIHRoZSBzaXplcyBvZiBhbGwgbGVhZi1jb2x1bW5zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjZ2V0dG90YWxzaXplKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXNpemluZylcbiAgICovXG4gIGdldFRvdGFsU2l6ZTogKCkgPT4gbnVtYmVyXG4gIC8qKlxuICAgKiBSZXNldHMgY29sdW1uIHNpemluZyB0byBpdHMgaW5pdGlhbCBzdGF0ZS4gSWYgYGRlZmF1bHRTdGF0ZWAgaXMgYHRydWVgLCB0aGUgZGVmYXVsdCBzdGF0ZSBmb3IgdGhlIHRhYmxlIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBpbml0aWFsVmFsdWUgcHJvdmlkZWQgdG8gdGhlIHRhYmxlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjcmVzZXRjb2x1bW5zaXppbmcpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgcmVzZXRDb2x1bW5TaXppbmc6IChkZWZhdWx0U3RhdGU/OiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBSZXNldHMgY29sdW1uIHNpemluZyBpbmZvIHRvIGl0cyBpbml0aWFsIHN0YXRlLiBJZiBgZGVmYXVsdFN0YXRlYCBpcyBgdHJ1ZWAsIHRoZSBkZWZhdWx0IHN0YXRlIGZvciB0aGUgdGFibGUgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGluaXRpYWxWYWx1ZSBwcm92aWRlZCB0byB0aGUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXNpemluZyNyZXNldGhlYWRlcnNpemVpbmZvKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXNpemluZylcbiAgICovXG4gIHJlc2V0SGVhZGVyU2l6ZUluZm86IChkZWZhdWx0U3RhdGU/OiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjb2x1bW4gc2l6aW5nIHN0YXRlIHVzaW5nIGFuIHVwZGF0ZXIgZnVuY3Rpb24gb3IgYSB2YWx1ZS4gVGhpcyB3aWxsIHRyaWdnZXIgdGhlIHVuZGVybHlpbmcgYG9uQ29sdW1uU2l6aW5nQ2hhbmdlYCBmdW5jdGlvbiBpZiBvbmUgaXMgcGFzc2VkIHRvIHRoZSB0YWJsZSBvcHRpb25zLCBvdGhlcndpc2UgdGhlIHN0YXRlIHdpbGwgYmUgbWFuYWdlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tc2l6aW5nI3NldGNvbHVtbnNpemluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1zaXppbmcpXG4gICAqL1xuICBzZXRDb2x1bW5TaXppbmc6ICh1cGRhdGVyOiBVcGRhdGVyPENvbHVtblNpemluZ1N0YXRlPikgPT4gdm9pZFxuICAvKipcbiAgICogU2V0cyB0aGUgY29sdW1uIHNpemluZyBpbmZvIHN0YXRlIHVzaW5nIGFuIHVwZGF0ZXIgZnVuY3Rpb24gb3IgYSB2YWx1ZS4gVGhpcyB3aWxsIHRyaWdnZXIgdGhlIHVuZGVybHlpbmcgYG9uQ29sdW1uU2l6aW5nSW5mb0NoYW5nZWAgZnVuY3Rpb24gaWYgb25lIGlzIHBhc3NlZCB0byB0aGUgdGFibGUgb3B0aW9ucywgb3RoZXJ3aXNlIHRoZSBzdGF0ZSB3aWxsIGJlIG1hbmFnZWQgYXV0b21hdGljYWxseSBieSB0aGUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXNpemluZyNzZXRjb2x1bW5zaXppbmdpbmZvKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXNpemluZylcbiAgICovXG4gIHNldENvbHVtblNpemluZ0luZm86ICh1cGRhdGVyOiBVcGRhdGVyPENvbHVtblNpemluZ0luZm9TdGF0ZT4pID0+IHZvaWRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5TaXppbmdDb2x1bW5EZWYge1xuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBjb2x1bW4gcmVzaXppbmcgZm9yIHRoZSBjb2x1bW4uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXNpemluZyNlbmFibGVyZXNpemluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1zaXppbmcpXG4gICAqL1xuICBlbmFibGVSZXNpemluZz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGFsbG93ZWQgc2l6ZSBmb3IgdGhlIGNvbHVtblxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjbWF4c2l6ZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1zaXppbmcpXG4gICAqL1xuICBtYXhTaXplPzogbnVtYmVyXG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBhbGxvd2VkIHNpemUgZm9yIHRoZSBjb2x1bW5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tc2l6aW5nI21pbnNpemUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgbWluU2l6ZT86IG51bWJlclxuICAvKipcbiAgICogVGhlIGRlc2lyZWQgc2l6ZSBmb3IgdGhlIGNvbHVtblxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjc2l6ZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1zaXppbmcpXG4gICAqL1xuICBzaXplPzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uU2l6aW5nQ29sdW1uIHtcbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBjb2x1bW4gY2FuIGJlIHJlc2l6ZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXNpemluZyNnZXRjYW5yZXNpemUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgZ2V0Q2FuUmVzaXplOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgY29sdW1uIGlzIGN1cnJlbnRseSBiZWluZyByZXNpemVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjZ2V0aXNyZXNpemluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1zaXppbmcpXG4gICAqL1xuICBnZXRJc1Jlc2l6aW5nOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbHVtbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tc2l6aW5nI2dldHNpemUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgZ2V0U2l6ZTogKCkgPT4gbnVtYmVyXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQgbWVhc3VyZW1lbnQgYWxvbmcgdGhlIHJvdy1heGlzICh1c3VhbGx5IHRoZSB4LWF4aXMgZm9yIHN0YW5kYXJkIHRhYmxlcykgZm9yIHRoZSBoZWFkZXIuIFRoaXMgaXMgZWZmZWN0aXZlbHkgYSBzdW0gb2YgdGhlIG9mZnNldCBtZWFzdXJlbWVudHMgb2YgYWxsIHByZWNlZGluZyBoZWFkZXJzLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjZ2V0c3RhcnQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgZ2V0U3RhcnQ6IChwb3NpdGlvbj86IENvbHVtblBpbm5pbmdQb3NpdGlvbikgPT4gbnVtYmVyXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGNvbHVtbiB0byBpdHMgaW5pdGlhbCBzaXplLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjcmVzZXRzaXplKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXNpemluZylcbiAgICovXG4gIHJlc2V0U2l6ZTogKCkgPT4gdm9pZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtblNpemluZ0hlYWRlciB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byByZXNpemUgdGhlIGhlYWRlci4gSXQgY2FuIGJlIHVzZWQgYXMgYW46XG4gICAqIC0gYG9uTW91c2VEb3duYCBoYW5kbGVyXG4gICAqIC0gYG9uVG91Y2hTdGFydGAgaGFuZGxlclxuICAgKlxuICAgKiBUaGUgZHJhZ2dpbmcgYW5kIHJlbGVhc2UgZXZlbnRzIGFyZSBhdXRvbWF0aWNhbGx5IGhhbmRsZWQgZm9yIHlvdS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tc2l6aW5nI2dldHJlc2l6ZWhhbmRsZXIpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgZ2V0UmVzaXplSGFuZGxlcjogKCkgPT4gKGV2ZW50OiB1bmtub3duKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGhlYWRlci5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tc2l6aW5nI2dldHNpemUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgZ2V0U2l6ZTogKCkgPT4gbnVtYmVyXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQgbWVhc3VyZW1lbnQgYWxvbmcgdGhlIHJvdy1heGlzICh1c3VhbGx5IHRoZSB4LWF4aXMgZm9yIHN0YW5kYXJkIHRhYmxlcykgZm9yIHRoZSBoZWFkZXIuIFRoaXMgaXMgZWZmZWN0aXZlbHkgYSBzdW0gb2YgdGhlIG9mZnNldCBtZWFzdXJlbWVudHMgb2YgYWxsIHByZWNlZGluZyBoZWFkZXJzLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjZ2V0c3RhcnQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgZ2V0U3RhcnQ6IChwb3NpdGlvbj86IENvbHVtblBpbm5pbmdQb3NpdGlvbikgPT4gbnVtYmVyXG59XG5cbi8vXG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29sdW1uU2l6aW5nID0ge1xuICBzaXplOiAxNTAsXG4gIG1pblNpemU6IDIwLFxuICBtYXhTaXplOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbn1cblxuY29uc3QgZ2V0RGVmYXVsdENvbHVtblNpemluZ0luZm9TdGF0ZSA9ICgpOiBDb2x1bW5TaXppbmdJbmZvU3RhdGUgPT4gKHtcbiAgc3RhcnRPZmZzZXQ6IG51bGwsXG4gIHN0YXJ0U2l6ZTogbnVsbCxcbiAgZGVsdGFPZmZzZXQ6IG51bGwsXG4gIGRlbHRhUGVyY2VudGFnZTogbnVsbCxcbiAgaXNSZXNpemluZ0NvbHVtbjogZmFsc2UsXG4gIGNvbHVtblNpemluZ1N0YXJ0OiBbXSxcbn0pXG5cbmV4cG9ydCBjb25zdCBDb2x1bW5TaXppbmc6IFRhYmxlRmVhdHVyZSA9IHtcbiAgZ2V0RGVmYXVsdENvbHVtbkRlZjogKCk6IENvbHVtblNpemluZ0NvbHVtbkRlZiA9PiB7XG4gICAgcmV0dXJuIGRlZmF1bHRDb2x1bW5TaXppbmdcbiAgfSxcbiAgZ2V0SW5pdGlhbFN0YXRlOiAoc3RhdGUpOiBDb2x1bW5TaXppbmdUYWJsZVN0YXRlID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uU2l6aW5nOiB7fSxcbiAgICAgIGNvbHVtblNpemluZ0luZm86IGdldERlZmF1bHRDb2x1bW5TaXppbmdJbmZvU3RhdGUoKSxcbiAgICAgIC4uLnN0YXRlLFxuICAgIH1cbiAgfSxcblxuICBnZXREZWZhdWx0T3B0aW9uczogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiBDb2x1bW5TaXppbmdEZWZhdWx0T3B0aW9ucyA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbHVtblJlc2l6ZU1vZGU6ICdvbkVuZCcsXG4gICAgICBvbkNvbHVtblNpemluZ0NoYW5nZTogbWFrZVN0YXRlVXBkYXRlcignY29sdW1uU2l6aW5nJywgdGFibGUpLFxuICAgICAgb25Db2x1bW5TaXppbmdJbmZvQ2hhbmdlOiBtYWtlU3RhdGVVcGRhdGVyKCdjb2x1bW5TaXppbmdJbmZvJywgdGFibGUpLFxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVDb2x1bW46IDxURGF0YSBleHRlbmRzIFJvd0RhdGEsIFRWYWx1ZT4oXG4gICAgY29sdW1uOiBDb2x1bW48VERhdGEsIFRWYWx1ZT4sXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiB2b2lkID0+IHtcbiAgICBjb2x1bW4uZ2V0U2l6ZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtblNpemUgPSB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtblNpemluZ1tjb2x1bW4uaWRdXG5cbiAgICAgIHJldHVybiBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5tYXgoXG4gICAgICAgICAgY29sdW1uLmNvbHVtbkRlZi5taW5TaXplID8/IGRlZmF1bHRDb2x1bW5TaXppbmcubWluU2l6ZSxcbiAgICAgICAgICBjb2x1bW5TaXplID8/IGNvbHVtbi5jb2x1bW5EZWYuc2l6ZSA/PyBkZWZhdWx0Q29sdW1uU2l6aW5nLnNpemVcbiAgICAgICAgKSxcbiAgICAgICAgY29sdW1uLmNvbHVtbkRlZi5tYXhTaXplID8/IGRlZmF1bHRDb2x1bW5TaXppbmcubWF4U2l6ZVxuICAgICAgKVxuICAgIH1cbiAgICBjb2x1bW4uZ2V0U3RhcnQgPSBwb3NpdGlvbiA9PiB7XG4gICAgICBjb25zdCBjb2x1bW5zID0gIXBvc2l0aW9uXG4gICAgICAgID8gdGFibGUuZ2V0VmlzaWJsZUxlYWZDb2x1bW5zKClcbiAgICAgICAgOiBwb3NpdGlvbiA9PT0gJ2xlZnQnXG4gICAgICAgID8gdGFibGUuZ2V0TGVmdFZpc2libGVMZWFmQ29sdW1ucygpXG4gICAgICAgIDogdGFibGUuZ2V0UmlnaHRWaXNpYmxlTGVhZkNvbHVtbnMoKVxuXG4gICAgICBjb25zdCBpbmRleCA9IGNvbHVtbnMuZmluZEluZGV4KGQgPT4gZC5pZCA9PT0gY29sdW1uLmlkKVxuXG4gICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnN0IHByZXZTaWJsaW5nQ29sdW1uID0gY29sdW1uc1tpbmRleCAtIDFdIVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgcHJldlNpYmxpbmdDb2x1bW4uZ2V0U3RhcnQocG9zaXRpb24pICsgcHJldlNpYmxpbmdDb2x1bW4uZ2V0U2l6ZSgpXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDBcbiAgICB9XG4gICAgY29sdW1uLnJlc2V0U2l6ZSA9ICgpID0+IHtcbiAgICAgIHRhYmxlLnNldENvbHVtblNpemluZygoeyBbY29sdW1uLmlkXTogXywgLi4ucmVzdCB9KSA9PiB7XG4gICAgICAgIHJldHVybiByZXN0XG4gICAgICB9KVxuICAgIH1cbiAgICBjb2x1bW4uZ2V0Q2FuUmVzaXplID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGNvbHVtbi5jb2x1bW5EZWYuZW5hYmxlUmVzaXppbmcgPz8gdHJ1ZSkgJiZcbiAgICAgICAgKHRhYmxlLm9wdGlvbnMuZW5hYmxlQ29sdW1uUmVzaXppbmcgPz8gdHJ1ZSlcbiAgICAgIClcbiAgICB9XG4gICAgY29sdW1uLmdldElzUmVzaXppbmcgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gdGFibGUuZ2V0U3RhdGUoKS5jb2x1bW5TaXppbmdJbmZvLmlzUmVzaXppbmdDb2x1bW4gPT09IGNvbHVtbi5pZFxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVIZWFkZXI6IDxURGF0YSBleHRlbmRzIFJvd0RhdGEsIFRWYWx1ZT4oXG4gICAgaGVhZGVyOiBIZWFkZXI8VERhdGEsIFRWYWx1ZT4sXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiB2b2lkID0+IHtcbiAgICBoZWFkZXIuZ2V0U2l6ZSA9ICgpID0+IHtcbiAgICAgIGxldCBzdW0gPSAwXG5cbiAgICAgIGNvbnN0IHJlY3Vyc2UgPSAoaGVhZGVyOiBIZWFkZXI8VERhdGEsIFRWYWx1ZT4pID0+IHtcbiAgICAgICAgaWYgKGhlYWRlci5zdWJIZWFkZXJzLmxlbmd0aCkge1xuICAgICAgICAgIGhlYWRlci5zdWJIZWFkZXJzLmZvckVhY2gocmVjdXJzZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdW0gKz0gaGVhZGVyLmNvbHVtbi5nZXRTaXplKCkgPz8gMFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlY3Vyc2UoaGVhZGVyKVxuXG4gICAgICByZXR1cm4gc3VtXG4gICAgfVxuICAgIGhlYWRlci5nZXRTdGFydCA9ICgpID0+IHtcbiAgICAgIGlmIChoZWFkZXIuaW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnN0IHByZXZTaWJsaW5nSGVhZGVyID0gaGVhZGVyLmhlYWRlckdyb3VwLmhlYWRlcnNbaGVhZGVyLmluZGV4IC0gMV0hXG4gICAgICAgIHJldHVybiBwcmV2U2libGluZ0hlYWRlci5nZXRTdGFydCgpICsgcHJldlNpYmxpbmdIZWFkZXIuZ2V0U2l6ZSgpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwXG4gICAgfVxuICAgIGhlYWRlci5nZXRSZXNpemVIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKGhlYWRlci5jb2x1bW4uaWQpXG4gICAgICBjb25zdCBjYW5SZXNpemUgPSBjb2x1bW4/LmdldENhblJlc2l6ZSgpXG5cbiAgICAgIHJldHVybiAoZTogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAoIWNvbHVtbiB8fCAhY2FuUmVzaXplKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICA7KGUgYXMgYW55KS5wZXJzaXN0Py4oKVxuXG4gICAgICAgIGlmIChpc1RvdWNoU3RhcnRFdmVudChlKSkge1xuICAgICAgICAgIC8vIGxldHMgbm90IHJlc3BvbmQgdG8gbXVsdGlwbGUgdG91Y2hlcyAoZS5nLiAyIG9yIDMgZmluZ2VycylcbiAgICAgICAgICBpZiAoZS50b3VjaGVzICYmIGUudG91Y2hlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGFydFNpemUgPSBoZWFkZXIuZ2V0U2l6ZSgpXG5cbiAgICAgICAgY29uc3QgY29sdW1uU2l6aW5nU3RhcnQ6IFtzdHJpbmcsIG51bWJlcl1bXSA9IGhlYWRlclxuICAgICAgICAgID8gaGVhZGVyLmdldExlYWZIZWFkZXJzKCkubWFwKGQgPT4gW2QuY29sdW1uLmlkLCBkLmNvbHVtbi5nZXRTaXplKCldKVxuICAgICAgICAgIDogW1tjb2x1bW4uaWQsIGNvbHVtbi5nZXRTaXplKCldXVxuXG4gICAgICAgIGNvbnN0IGNsaWVudFggPSBpc1RvdWNoU3RhcnRFdmVudChlKVxuICAgICAgICAgID8gTWF0aC5yb3VuZChlLnRvdWNoZXNbMF0hLmNsaWVudFgpXG4gICAgICAgICAgOiAoZSBhcyBNb3VzZUV2ZW50KS5jbGllbnRYXG5cbiAgICAgICAgY29uc3QgbmV3Q29sdW1uU2l6aW5nOiBDb2x1bW5TaXppbmdTdGF0ZSA9IHt9XG5cbiAgICAgICAgY29uc3QgdXBkYXRlT2Zmc2V0ID0gKFxuICAgICAgICAgIGV2ZW50VHlwZTogJ21vdmUnIHwgJ2VuZCcsXG4gICAgICAgICAgY2xpZW50WFBvcz86IG51bWJlclxuICAgICAgICApID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNsaWVudFhQb3MgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0YWJsZS5zZXRDb2x1bW5TaXppbmdJbmZvKG9sZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZWx0YU9mZnNldCA9IGNsaWVudFhQb3MgLSAob2xkPy5zdGFydE9mZnNldCA/PyAwKVxuICAgICAgICAgICAgY29uc3QgZGVsdGFQZXJjZW50YWdlID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgIGRlbHRhT2Zmc2V0IC8gKG9sZD8uc3RhcnRTaXplID8/IDApLFxuICAgICAgICAgICAgICAtMC45OTk5OTlcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgb2xkLmNvbHVtblNpemluZ1N0YXJ0LmZvckVhY2goKFtjb2x1bW5JZCwgaGVhZGVyU2l6ZV0pID0+IHtcbiAgICAgICAgICAgICAgbmV3Q29sdW1uU2l6aW5nW2NvbHVtbklkXSA9XG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICAgIE1hdGgubWF4KGhlYWRlclNpemUgKyBoZWFkZXJTaXplICogZGVsdGFQZXJjZW50YWdlLCAwKSAqIDEwMFxuICAgICAgICAgICAgICAgICkgLyAxMDBcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLm9sZCxcbiAgICAgICAgICAgICAgZGVsdGFPZmZzZXQsXG4gICAgICAgICAgICAgIGRlbHRhUGVyY2VudGFnZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGFibGUub3B0aW9ucy5jb2x1bW5SZXNpemVNb2RlID09PSAnb25DaGFuZ2UnIHx8XG4gICAgICAgICAgICBldmVudFR5cGUgPT09ICdlbmQnXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0YWJsZS5zZXRDb2x1bW5TaXppbmcob2xkID0+ICh7XG4gICAgICAgICAgICAgIC4uLm9sZCxcbiAgICAgICAgICAgICAgLi4ubmV3Q29sdW1uU2l6aW5nLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb25Nb3ZlID0gKGNsaWVudFhQb3M/OiBudW1iZXIpID0+IHVwZGF0ZU9mZnNldCgnbW92ZScsIGNsaWVudFhQb3MpXG5cbiAgICAgICAgY29uc3Qgb25FbmQgPSAoY2xpZW50WFBvcz86IG51bWJlcikgPT4ge1xuICAgICAgICAgIHVwZGF0ZU9mZnNldCgnZW5kJywgY2xpZW50WFBvcylcblxuICAgICAgICAgIHRhYmxlLnNldENvbHVtblNpemluZ0luZm8ob2xkID0+ICh7XG4gICAgICAgICAgICAuLi5vbGQsXG4gICAgICAgICAgICBpc1Jlc2l6aW5nQ29sdW1uOiBmYWxzZSxcbiAgICAgICAgICAgIHN0YXJ0T2Zmc2V0OiBudWxsLFxuICAgICAgICAgICAgc3RhcnRTaXplOiBudWxsLFxuICAgICAgICAgICAgZGVsdGFPZmZzZXQ6IG51bGwsXG4gICAgICAgICAgICBkZWx0YVBlcmNlbnRhZ2U6IG51bGwsXG4gICAgICAgICAgICBjb2x1bW5TaXppbmdTdGFydDogW10sXG4gICAgICAgICAgfSkpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb3VzZUV2ZW50cyA9IHtcbiAgICAgICAgICBtb3ZlSGFuZGxlcjogKGU6IE1vdXNlRXZlbnQpID0+IG9uTW92ZShlLmNsaWVudFgpLFxuICAgICAgICAgIHVwSGFuZGxlcjogKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdXNlRXZlbnRzLm1vdmVIYW5kbGVyKVxuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG1vdXNlRXZlbnRzLnVwSGFuZGxlcilcbiAgICAgICAgICAgIG9uRW5kKGUuY2xpZW50WClcbiAgICAgICAgICB9LFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG91Y2hFdmVudHMgPSB7XG4gICAgICAgICAgbW92ZUhhbmRsZXI6IChlOiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvbk1vdmUoZS50b3VjaGVzWzBdIS5jbGllbnRYKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1cEhhbmRsZXI6IChlOiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0b3VjaEV2ZW50cy5tb3ZlSGFuZGxlcilcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdG91Y2hFdmVudHMudXBIYW5kbGVyKVxuICAgICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25FbmQoZS50b3VjaGVzWzBdPy5jbGllbnRYKVxuICAgICAgICAgIH0sXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXNzaXZlSWZTdXBwb3J0ZWQgPSBwYXNzaXZlRXZlbnRTdXBwb3J0ZWQoKVxuICAgICAgICAgID8geyBwYXNzaXZlOiBmYWxzZSB9XG4gICAgICAgICAgOiBmYWxzZVxuXG4gICAgICAgIGlmIChpc1RvdWNoU3RhcnRFdmVudChlKSkge1xuICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAndG91Y2htb3ZlJyxcbiAgICAgICAgICAgIHRvdWNoRXZlbnRzLm1vdmVIYW5kbGVyLFxuICAgICAgICAgICAgcGFzc2l2ZUlmU3VwcG9ydGVkXG4gICAgICAgICAgKVxuICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAndG91Y2hlbmQnLFxuICAgICAgICAgICAgdG91Y2hFdmVudHMudXBIYW5kbGVyLFxuICAgICAgICAgICAgcGFzc2l2ZUlmU3VwcG9ydGVkXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAnbW91c2Vtb3ZlJyxcbiAgICAgICAgICAgIG1vdXNlRXZlbnRzLm1vdmVIYW5kbGVyLFxuICAgICAgICAgICAgcGFzc2l2ZUlmU3VwcG9ydGVkXG4gICAgICAgICAgKVxuICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAnbW91c2V1cCcsXG4gICAgICAgICAgICBtb3VzZUV2ZW50cy51cEhhbmRsZXIsXG4gICAgICAgICAgICBwYXNzaXZlSWZTdXBwb3J0ZWRcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICB0YWJsZS5zZXRDb2x1bW5TaXppbmdJbmZvKG9sZCA9PiAoe1xuICAgICAgICAgIC4uLm9sZCxcbiAgICAgICAgICBzdGFydE9mZnNldDogY2xpZW50WCxcbiAgICAgICAgICBzdGFydFNpemUsXG4gICAgICAgICAgZGVsdGFPZmZzZXQ6IDAsXG4gICAgICAgICAgZGVsdGFQZXJjZW50YWdlOiAwLFxuICAgICAgICAgIGNvbHVtblNpemluZ1N0YXJ0LFxuICAgICAgICAgIGlzUmVzaXppbmdDb2x1bW46IGNvbHVtbi5pZCxcbiAgICAgICAgfSkpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZVRhYmxlOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPih0YWJsZTogVGFibGU8VERhdGE+KTogdm9pZCA9PiB7XG4gICAgdGFibGUuc2V0Q29sdW1uU2l6aW5nID0gdXBkYXRlciA9PlxuICAgICAgdGFibGUub3B0aW9ucy5vbkNvbHVtblNpemluZ0NoYW5nZT8uKHVwZGF0ZXIpXG4gICAgdGFibGUuc2V0Q29sdW1uU2l6aW5nSW5mbyA9IHVwZGF0ZXIgPT5cbiAgICAgIHRhYmxlLm9wdGlvbnMub25Db2x1bW5TaXppbmdJbmZvQ2hhbmdlPy4odXBkYXRlcilcbiAgICB0YWJsZS5yZXNldENvbHVtblNpemluZyA9IGRlZmF1bHRTdGF0ZSA9PiB7XG4gICAgICB0YWJsZS5zZXRDb2x1bW5TaXppbmcoXG4gICAgICAgIGRlZmF1bHRTdGF0ZSA/IHt9IDogdGFibGUuaW5pdGlhbFN0YXRlLmNvbHVtblNpemluZyA/PyB7fVxuICAgICAgKVxuICAgIH1cbiAgICB0YWJsZS5yZXNldEhlYWRlclNpemVJbmZvID0gZGVmYXVsdFN0YXRlID0+IHtcbiAgICAgIHRhYmxlLnNldENvbHVtblNpemluZ0luZm8oXG4gICAgICAgIGRlZmF1bHRTdGF0ZVxuICAgICAgICAgID8gZ2V0RGVmYXVsdENvbHVtblNpemluZ0luZm9TdGF0ZSgpXG4gICAgICAgICAgOiB0YWJsZS5pbml0aWFsU3RhdGUuY29sdW1uU2l6aW5nSW5mbyA/P1xuICAgICAgICAgICAgICBnZXREZWZhdWx0Q29sdW1uU2l6aW5nSW5mb1N0YXRlKClcbiAgICAgIClcbiAgICB9XG4gICAgdGFibGUuZ2V0VG90YWxTaXplID0gKCkgPT5cbiAgICAgIHRhYmxlLmdldEhlYWRlckdyb3VwcygpWzBdPy5oZWFkZXJzLnJlZHVjZSgoc3VtLCBoZWFkZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIHN1bSArIGhlYWRlci5nZXRTaXplKClcbiAgICAgIH0sIDApID8/IDBcbiAgICB0YWJsZS5nZXRMZWZ0VG90YWxTaXplID0gKCkgPT5cbiAgICAgIHRhYmxlLmdldExlZnRIZWFkZXJHcm91cHMoKVswXT8uaGVhZGVycy5yZWR1Y2UoKHN1bSwgaGVhZGVyKSA9PiB7XG4gICAgICAgIHJldHVybiBzdW0gKyBoZWFkZXIuZ2V0U2l6ZSgpXG4gICAgICB9LCAwKSA/PyAwXG4gICAgdGFibGUuZ2V0Q2VudGVyVG90YWxTaXplID0gKCkgPT5cbiAgICAgIHRhYmxlLmdldENlbnRlckhlYWRlckdyb3VwcygpWzBdPy5oZWFkZXJzLnJlZHVjZSgoc3VtLCBoZWFkZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIHN1bSArIGhlYWRlci5nZXRTaXplKClcbiAgICAgIH0sIDApID8/IDBcbiAgICB0YWJsZS5nZXRSaWdodFRvdGFsU2l6ZSA9ICgpID0+XG4gICAgICB0YWJsZS5nZXRSaWdodEhlYWRlckdyb3VwcygpWzBdPy5oZWFkZXJzLnJlZHVjZSgoc3VtLCBoZWFkZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIHN1bSArIGhlYWRlci5nZXRTaXplKClcbiAgICAgIH0sIDApID8/IDBcbiAgfSxcbn1cblxubGV0IHBhc3NpdmVTdXBwb3J0ZWQ6IGJvb2xlYW4gfCBudWxsID0gbnVsbFxuZXhwb3J0IGZ1bmN0aW9uIHBhc3NpdmVFdmVudFN1cHBvcnRlZCgpIHtcbiAgaWYgKHR5cGVvZiBwYXNzaXZlU3VwcG9ydGVkID09PSAnYm9vbGVhbicpIHJldHVybiBwYXNzaXZlU3VwcG9ydGVkXG5cbiAgbGV0IHN1cHBvcnRlZCA9IGZhbHNlXG4gIHRyeSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGdldCBwYXNzaXZlKCkge1xuICAgICAgICBzdXBwb3J0ZWQgPSB0cnVlXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCBub29wID0gKCkgPT4ge31cblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0Jywgbm9vcCwgb3B0aW9ucylcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG5vb3ApXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHN1cHBvcnRlZCA9IGZhbHNlXG4gIH1cbiAgcGFzc2l2ZVN1cHBvcnRlZCA9IHN1cHBvcnRlZFxuICByZXR1cm4gcGFzc2l2ZVN1cHBvcnRlZFxufVxuXG5mdW5jdGlvbiBpc1RvdWNoU3RhcnRFdmVudChlOiB1bmtub3duKTogZSBpcyBUb3VjaEV2ZW50IHtcbiAgcmV0dXJuIChlIGFzIFRvdWNoRXZlbnQpLnR5cGUgPT09ICd0b3VjaHN0YXJ0J1xufVxuIiwiaW1wb3J0IHsgUm93TW9kZWwgfSBmcm9tICcuLidcbmltcG9ydCB7IFRhYmxlRmVhdHVyZSB9IGZyb20gJy4uL2NvcmUvdGFibGUnXG5pbXBvcnQgeyBPbkNoYW5nZUZuLCBUYWJsZSwgUm93LCBVcGRhdGVyLCBSb3dEYXRhIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBtYWtlU3RhdGVVcGRhdGVyIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCB0eXBlIEV4cGFuZGVkU3RhdGVMaXN0ID0gUmVjb3JkPHN0cmluZywgYm9vbGVhbj5cbmV4cG9ydCB0eXBlIEV4cGFuZGVkU3RhdGUgPSB0cnVlIHwgUmVjb3JkPHN0cmluZywgYm9vbGVhbj5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwYW5kZWRUYWJsZVN0YXRlIHtcbiAgZXhwYW5kZWQ6IEV4cGFuZGVkU3RhdGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBhbmRlZFJvdyB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJvdyBjYW4gYmUgZXhwYW5kZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZXhwYW5kaW5nI2dldGNhbmV4cGFuZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2V4cGFuZGluZylcbiAgICovXG4gIGdldENhbkV4cGFuZDogKCkgPT4gYm9vbGVhblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIGFsbCBwYXJlbnQgcm93cyBvZiB0aGUgcm93IGFyZSBleHBhbmRlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9leHBhbmRpbmcjZ2V0aXNhbGxwYXJlbnRzZXhwYW5kZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9leHBhbmRpbmcpXG4gICAqL1xuICBnZXRJc0FsbFBhcmVudHNFeHBhbmRlZDogKCkgPT4gYm9vbGVhblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSByb3cgaXMgZXhwYW5kZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZXhwYW5kaW5nI2dldGlzZXhwYW5kZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9leHBhbmRpbmcpXG4gICAqL1xuICBnZXRJc0V4cGFuZGVkOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byB0b2dnbGUgdGhlIGV4cGFuZGVkIHN0YXRlIG9mIHRoZSByb3cuIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYmluZCB0byBhbiBldmVudCBoYW5kbGVyIHRvIGEgYnV0dG9uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2V4cGFuZGluZyNnZXR0b2dnbGVleHBhbmRlZGhhbmRsZXIpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9leHBhbmRpbmcpXG4gICAqL1xuICBnZXRUb2dnbGVFeHBhbmRlZEhhbmRsZXI6ICgpID0+ICgpID0+IHZvaWRcbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIGV4cGFuZGVkIHN0YXRlIChvciBzZXRzIGl0IGlmIGBleHBhbmRlZGAgaXMgcHJvdmlkZWQpIGZvciB0aGUgcm93LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2V4cGFuZGluZyN0b2dnbGVleHBhbmRlZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2V4cGFuZGluZylcbiAgICovXG4gIHRvZ2dsZUV4cGFuZGVkOiAoZXhwYW5kZWQ/OiBib29sZWFuKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwYW5kZWRPcHRpb25zPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICAvKipcbiAgICogRW5hYmxlIHRoaXMgc2V0dGluZyB0byBhdXRvbWF0aWNhbGx5IHJlc2V0IHRoZSBleHBhbmRlZCBzdGF0ZSBvZiB0aGUgdGFibGUgd2hlbiBleHBhbmRpbmcgc3RhdGUgY2hhbmdlcy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9leHBhbmRpbmcjYXV0b3Jlc2V0ZXhwYW5kZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9leHBhbmRpbmcpXG4gICAqL1xuICBhdXRvUmVzZXRFeHBhbmRlZD86IGJvb2xlYW5cbiAgLyoqXG4gICAqIEVuYWJsZS9kaXNhYmxlIGV4cGFuZGluZyBmb3IgYWxsIHJvd3MuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZXhwYW5kaW5nI2VuYWJsZWV4cGFuZGluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2V4cGFuZGluZylcbiAgICovXG4gIGVuYWJsZUV4cGFuZGluZz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJldHVybmluZyB0aGUgZXhwYW5kZWQgcm93IG1vZGVsLiBJZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBwcm92aWRlZCwgdGhlIHRhYmxlIHdpbGwgbm90IGV4cGFuZCByb3dzLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCBleHBvcnRlZCBgZ2V0RXhwYW5kZWRSb3dNb2RlbGAgZnVuY3Rpb24gdG8gZ2V0IHRoZSBleHBhbmRlZCByb3cgbW9kZWwgb3IgaW1wbGVtZW50IHlvdXIgb3duLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2V4cGFuZGluZyNnZXRleHBhbmRlZHJvd21vZGVsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZXhwYW5kaW5nKVxuICAgKi9cbiAgZ2V0RXhwYW5kZWRSb3dNb2RlbD86ICh0YWJsZTogVGFibGU8YW55PikgPT4gKCkgPT4gUm93TW9kZWw8YW55PlxuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgZGV0ZXJtaW5pbmcgd2hldGhlciBhIHJvdyBpcyBjdXJyZW50bHkgZXhwYW5kZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZXhwYW5kaW5nI2dldGlzcm93ZXhwYW5kZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9leHBhbmRpbmcpXG4gICAqL1xuICBnZXRJc1Jvd0V4cGFuZGVkPzogKHJvdzogUm93PFREYXRhPikgPT4gYm9vbGVhblxuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgZGV0ZXJtaW5pbmcgd2hldGhlciBhIHJvdyBjYW4gYmUgZXhwYW5kZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZXhwYW5kaW5nI2dldHJvd2NhbmV4cGFuZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2V4cGFuZGluZylcbiAgICovXG4gIGdldFJvd0NhbkV4cGFuZD86IChyb3c6IFJvdzxURGF0YT4pID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIEVuYWJsZXMgbWFudWFsIHJvdyBleHBhbnNpb24uIElmIHRoaXMgaXMgc2V0IHRvIGB0cnVlYCwgYGdldEV4cGFuZGVkUm93TW9kZWxgIHdpbGwgbm90IGJlIHVzZWQgdG8gZXhwYW5kIHJvd3MgYW5kIHlvdSB3b3VsZCBiZSBleHBlY3RlZCB0byBwZXJmb3JtIHRoZSBleHBhbnNpb24gaW4geW91ciBvd24gZGF0YSBtb2RlbC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGFyZSBkb2luZyBzZXJ2ZXItc2lkZSBleHBhbnNpb24uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZXhwYW5kaW5nI21hbnVhbGV4cGFuZGluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2V4cGFuZGluZylcbiAgICovXG4gIG1hbnVhbEV4cGFuZGluZz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGBleHBhbmRlZGAgdGFibGUgc3RhdGUgY2hhbmdlcy4gSWYgYSBmdW5jdGlvbiBpcyBwcm92aWRlZCwgeW91IHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoaXMgc3RhdGUgb24geW91ciBvd24uIFRvIHBhc3MgdGhlIG1hbmFnZWQgc3RhdGUgYmFjayB0byB0aGUgdGFibGUsIHVzZSB0aGUgYHRhYmxlT3B0aW9ucy5zdGF0ZS5leHBhbmRlZGAgb3B0aW9uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2V4cGFuZGluZyNvbmV4cGFuZGVkY2hhbmdlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZXhwYW5kaW5nKVxuICAgKi9cbiAgb25FeHBhbmRlZENoYW5nZT86IE9uQ2hhbmdlRm48RXhwYW5kZWRTdGF0ZT5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCBleHBhbmRlZCByb3dzIHdpbGwgYmUgcGFnaW5hdGVkIGFsb25nIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHRhYmxlICh3aGljaCBtZWFucyBleHBhbmRlZCByb3dzIG1heSBzcGFuIG11bHRpcGxlIHBhZ2VzKS4gSWYgYGZhbHNlYCBleHBhbmRlZCByb3dzIHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgZm9yIHBhZ2luYXRpb24gKHdoaWNoIG1lYW5zIGV4cGFuZGVkIHJvd3Mgd2lsbCBhbHdheXMgcmVuZGVyIG9uIHRoZWlyIHBhcmVudHMgcGFnZS4gVGhpcyBhbHNvIG1lYW5zIG1vcmUgcm93cyB3aWxsIGJlIHJlbmRlcmVkIHRoYW4gdGhlIHNldCBwYWdlIHNpemUpXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZXhwYW5kaW5nI3BhZ2luYXRlZXhwYW5kZWRyb3dzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZXhwYW5kaW5nKVxuICAgKi9cbiAgcGFnaW5hdGVFeHBhbmRlZFJvd3M/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwYW5kZWRJbnN0YW5jZTxURGF0YSBleHRlbmRzIFJvd0RhdGE+IHtcbiAgX2F1dG9SZXNldEV4cGFuZGVkOiAoKSA9PiB2b2lkXG4gIF9nZXRFeHBhbmRlZFJvd01vZGVsPzogKCkgPT4gUm93TW9kZWw8VERhdGE+XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByb3dzIHRoYXQgY2FuIGJlIGV4cGFuZGVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2V4cGFuZGluZyNnZXRjYW5zb21lcm93c2V4cGFuZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2V4cGFuZGluZylcbiAgICovXG4gIGdldENhblNvbWVSb3dzRXhwYW5kOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGRlcHRoIG9mIHRoZSBleHBhbmRlZCByb3dzLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2V4cGFuZGluZyNnZXRleHBhbmRlZGRlcHRoKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZXhwYW5kaW5nKVxuICAgKi9cbiAgZ2V0RXhwYW5kZWREZXB0aDogKCkgPT4gbnVtYmVyXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByb3cgbW9kZWwgYWZ0ZXIgZXhwYW5zaW9uIGhhcyBiZWVuIGFwcGxpZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZXhwYW5kaW5nI2dldGV4cGFuZGVkcm93bW9kZWwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9leHBhbmRpbmcpXG4gICAqL1xuICBnZXRFeHBhbmRlZFJvd01vZGVsOiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBhbGwgcm93cyBhcmUgY3VycmVudGx5IGV4cGFuZGVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2V4cGFuZGluZyNnZXRpc2FsbHJvd3NleHBhbmRlZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2V4cGFuZGluZylcbiAgICovXG4gIGdldElzQWxsUm93c0V4cGFuZGVkOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByb3dzIHRoYXQgYXJlIGN1cnJlbnRseSBleHBhbmRlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9leHBhbmRpbmcjZ2V0aXNzb21lcm93c2V4cGFuZGVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZXhwYW5kaW5nKVxuICAgKi9cbiAgZ2V0SXNTb21lUm93c0V4cGFuZGVkOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByb3cgbW9kZWwgYmVmb3JlIGV4cGFuc2lvbiBoYXMgYmVlbiBhcHBsaWVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2V4cGFuZGluZyNnZXRwcmVleHBhbmRlZHJvd21vZGVsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZXhwYW5kaW5nKVxuICAgKi9cbiAgZ2V0UHJlRXhwYW5kZWRSb3dNb2RlbDogKCkgPT4gUm93TW9kZWw8VERhdGE+XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgaGFuZGxlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHRvZ2dsZSB0aGUgZXhwYW5kZWQgc3RhdGUgb2YgYWxsIHJvd3MuIFRoaXMgaGFuZGxlciBpcyBtZWFudCB0byBiZSB1c2VkIHdpdGggYW4gYGlucHV0W3R5cGU9Y2hlY2tib3hdYCBlbGVtZW50LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2V4cGFuZGluZyNnZXR0b2dnbGVhbGxyb3dzZXhwYW5kZWRoYW5kbGVyKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZXhwYW5kaW5nKVxuICAgKi9cbiAgZ2V0VG9nZ2xlQWxsUm93c0V4cGFuZGVkSGFuZGxlcjogKCkgPT4gKGV2ZW50OiB1bmtub3duKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGV4cGFuZGVkIHN0YXRlIG9mIHRoZSB0YWJsZSB0byB0aGUgaW5pdGlhbCBzdGF0ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9leHBhbmRpbmcjcmVzZXRleHBhbmRlZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2V4cGFuZGluZylcbiAgICovXG4gIHJlc2V0RXhwYW5kZWQ6IChkZWZhdWx0U3RhdGU/OiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBleHBhbmRlZCBzdGF0ZSBvZiB0aGUgdGFibGUgdmlhIGFuIHVwZGF0ZSBmdW5jdGlvbiBvciB2YWx1ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9leHBhbmRpbmcjc2V0ZXhwYW5kZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9leHBhbmRpbmcpXG4gICAqL1xuICBzZXRFeHBhbmRlZDogKHVwZGF0ZXI6IFVwZGF0ZXI8RXhwYW5kZWRTdGF0ZT4pID0+IHZvaWRcbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIGV4cGFuZGVkIHN0YXRlIGZvciBhbGwgcm93cy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9leHBhbmRpbmcjdG9nZ2xlYWxscm93c2V4cGFuZGVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZXhwYW5kaW5nKVxuICAgKi9cbiAgdG9nZ2xlQWxsUm93c0V4cGFuZGVkOiAoZXhwYW5kZWQ/OiBib29sZWFuKSA9PiB2b2lkXG59XG5cbi8vXG5cbmV4cG9ydCBjb25zdCBFeHBhbmRpbmc6IFRhYmxlRmVhdHVyZSA9IHtcbiAgZ2V0SW5pdGlhbFN0YXRlOiAoc3RhdGUpOiBFeHBhbmRlZFRhYmxlU3RhdGUgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBleHBhbmRlZDoge30sXG4gICAgICAuLi5zdGF0ZSxcbiAgICB9XG4gIH0sXG5cbiAgZ2V0RGVmYXVsdE9wdGlvbnM6IDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KFxuICAgIHRhYmxlOiBUYWJsZTxURGF0YT5cbiAgKTogRXhwYW5kZWRPcHRpb25zPFREYXRhPiA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uRXhwYW5kZWRDaGFuZ2U6IG1ha2VTdGF0ZVVwZGF0ZXIoJ2V4cGFuZGVkJywgdGFibGUpLFxuICAgICAgcGFnaW5hdGVFeHBhbmRlZFJvd3M6IHRydWUsXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZVRhYmxlOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPih0YWJsZTogVGFibGU8VERhdGE+KTogdm9pZCA9PiB7XG4gICAgbGV0IHJlZ2lzdGVyZWQgPSBmYWxzZVxuICAgIGxldCBxdWV1ZWQgPSBmYWxzZVxuXG4gICAgdGFibGUuX2F1dG9SZXNldEV4cGFuZGVkID0gKCkgPT4ge1xuICAgICAgaWYgKCFyZWdpc3RlcmVkKSB7XG4gICAgICAgIHRhYmxlLl9xdWV1ZSgoKSA9PiB7XG4gICAgICAgICAgcmVnaXN0ZXJlZCA9IHRydWVcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGFibGUub3B0aW9ucy5hdXRvUmVzZXRBbGwgPz9cbiAgICAgICAgdGFibGUub3B0aW9ucy5hdXRvUmVzZXRFeHBhbmRlZCA/P1xuICAgICAgICAhdGFibGUub3B0aW9ucy5tYW51YWxFeHBhbmRpbmdcbiAgICAgICkge1xuICAgICAgICBpZiAocXVldWVkKSByZXR1cm5cbiAgICAgICAgcXVldWVkID0gdHJ1ZVxuICAgICAgICB0YWJsZS5fcXVldWUoKCkgPT4ge1xuICAgICAgICAgIHRhYmxlLnJlc2V0RXhwYW5kZWQoKVxuICAgICAgICAgIHF1ZXVlZCA9IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICAgIHRhYmxlLnNldEV4cGFuZGVkID0gdXBkYXRlciA9PiB0YWJsZS5vcHRpb25zLm9uRXhwYW5kZWRDaGFuZ2U/Lih1cGRhdGVyKVxuICAgIHRhYmxlLnRvZ2dsZUFsbFJvd3NFeHBhbmRlZCA9IGV4cGFuZGVkID0+IHtcbiAgICAgIGlmIChleHBhbmRlZCA/PyAhdGFibGUuZ2V0SXNBbGxSb3dzRXhwYW5kZWQoKSkge1xuICAgICAgICB0YWJsZS5zZXRFeHBhbmRlZCh0cnVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFibGUuc2V0RXhwYW5kZWQoe30pXG4gICAgICB9XG4gICAgfVxuICAgIHRhYmxlLnJlc2V0RXhwYW5kZWQgPSBkZWZhdWx0U3RhdGUgPT4ge1xuICAgICAgdGFibGUuc2V0RXhwYW5kZWQoZGVmYXVsdFN0YXRlID8ge30gOiB0YWJsZS5pbml0aWFsU3RhdGU/LmV4cGFuZGVkID8/IHt9KVxuICAgIH1cbiAgICB0YWJsZS5nZXRDYW5Tb21lUm93c0V4cGFuZCA9ICgpID0+IHtcbiAgICAgIHJldHVybiB0YWJsZVxuICAgICAgICAuZ2V0UHJlUGFnaW5hdGlvblJvd01vZGVsKClcbiAgICAgICAgLmZsYXRSb3dzLnNvbWUocm93ID0+IHJvdy5nZXRDYW5FeHBhbmQoKSlcbiAgICB9XG4gICAgdGFibGUuZ2V0VG9nZ2xlQWxsUm93c0V4cGFuZGVkSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHJldHVybiAoZTogdW5rbm93bikgPT4ge1xuICAgICAgICA7KGUgYXMgYW55KS5wZXJzaXN0Py4oKVxuICAgICAgICB0YWJsZS50b2dnbGVBbGxSb3dzRXhwYW5kZWQoKVxuICAgICAgfVxuICAgIH1cbiAgICB0YWJsZS5nZXRJc1NvbWVSb3dzRXhwYW5kZWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBleHBhbmRlZCA9IHRhYmxlLmdldFN0YXRlKCkuZXhwYW5kZWRcbiAgICAgIHJldHVybiBleHBhbmRlZCA9PT0gdHJ1ZSB8fCBPYmplY3QudmFsdWVzKGV4cGFuZGVkKS5zb21lKEJvb2xlYW4pXG4gICAgfVxuICAgIHRhYmxlLmdldElzQWxsUm93c0V4cGFuZGVkID0gKCkgPT4ge1xuICAgICAgY29uc3QgZXhwYW5kZWQgPSB0YWJsZS5nZXRTdGF0ZSgpLmV4cGFuZGVkXG5cbiAgICAgIC8vIElmIGV4cGFuZGVkIGlzIHRydWUsIHNhdmUgc29tZSBjeWNsZXMgYW5kIHJldHVybiB0cnVlXG4gICAgICBpZiAodHlwZW9mIGV4cGFuZGVkID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIGV4cGFuZGVkID09PSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmICghT2JqZWN0LmtleXMoZXhwYW5kZWQpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gSWYgYW55IHJvdyBpcyBub3QgZXhwYW5kZWQsIHJldHVybiBmYWxzZVxuICAgICAgaWYgKHRhYmxlLmdldFJvd01vZGVsKCkuZmxhdFJvd3Muc29tZShyb3cgPT4gIXJvdy5nZXRJc0V4cGFuZGVkKCkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBUaGV5IG11c3QgYWxsIGJlIGV4cGFuZGVkIDpzaHJ1ZzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHRhYmxlLmdldEV4cGFuZGVkRGVwdGggPSAoKSA9PiB7XG4gICAgICBsZXQgbWF4RGVwdGggPSAwXG5cbiAgICAgIGNvbnN0IHJvd0lkcyA9XG4gICAgICAgIHRhYmxlLmdldFN0YXRlKCkuZXhwYW5kZWQgPT09IHRydWVcbiAgICAgICAgICA/IE9iamVjdC5rZXlzKHRhYmxlLmdldFJvd01vZGVsKCkucm93c0J5SWQpXG4gICAgICAgICAgOiBPYmplY3Qua2V5cyh0YWJsZS5nZXRTdGF0ZSgpLmV4cGFuZGVkKVxuXG4gICAgICByb3dJZHMuZm9yRWFjaChpZCA9PiB7XG4gICAgICAgIGNvbnN0IHNwbGl0SWQgPSBpZC5zcGxpdCgnLicpXG4gICAgICAgIG1heERlcHRoID0gTWF0aC5tYXgobWF4RGVwdGgsIHNwbGl0SWQubGVuZ3RoKVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIG1heERlcHRoXG4gICAgfVxuICAgIHRhYmxlLmdldFByZUV4cGFuZGVkUm93TW9kZWwgPSAoKSA9PiB0YWJsZS5nZXRTb3J0ZWRSb3dNb2RlbCgpXG4gICAgdGFibGUuZ2V0RXhwYW5kZWRSb3dNb2RlbCA9ICgpID0+IHtcbiAgICAgIGlmICghdGFibGUuX2dldEV4cGFuZGVkUm93TW9kZWwgJiYgdGFibGUub3B0aW9ucy5nZXRFeHBhbmRlZFJvd01vZGVsKSB7XG4gICAgICAgIHRhYmxlLl9nZXRFeHBhbmRlZFJvd01vZGVsID0gdGFibGUub3B0aW9ucy5nZXRFeHBhbmRlZFJvd01vZGVsKHRhYmxlKVxuICAgICAgfVxuXG4gICAgICBpZiAodGFibGUub3B0aW9ucy5tYW51YWxFeHBhbmRpbmcgfHwgIXRhYmxlLl9nZXRFeHBhbmRlZFJvd01vZGVsKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS5nZXRQcmVFeHBhbmRlZFJvd01vZGVsKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlLl9nZXRFeHBhbmRlZFJvd01vZGVsKClcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlUm93OiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgICByb3c6IFJvdzxURGF0YT4sXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiB2b2lkID0+IHtcbiAgICByb3cudG9nZ2xlRXhwYW5kZWQgPSBleHBhbmRlZCA9PiB7XG4gICAgICB0YWJsZS5zZXRFeHBhbmRlZChvbGQgPT4ge1xuICAgICAgICBjb25zdCBleGlzdHMgPSBvbGQgPT09IHRydWUgPyB0cnVlIDogISFvbGQ/Lltyb3cuaWRdXG5cbiAgICAgICAgbGV0IG9sZEV4cGFuZGVkOiBFeHBhbmRlZFN0YXRlTGlzdCA9IHt9XG5cbiAgICAgICAgaWYgKG9sZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIE9iamVjdC5rZXlzKHRhYmxlLmdldFJvd01vZGVsKCkucm93c0J5SWQpLmZvckVhY2gocm93SWQgPT4ge1xuICAgICAgICAgICAgb2xkRXhwYW5kZWRbcm93SWRdID0gdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2xkRXhwYW5kZWQgPSBvbGRcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cGFuZGVkID0gZXhwYW5kZWQgPz8gIWV4aXN0c1xuXG4gICAgICAgIGlmICghZXhpc3RzICYmIGV4cGFuZGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLm9sZEV4cGFuZGVkLFxuICAgICAgICAgICAgW3Jvdy5pZF06IHRydWUsXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4aXN0cyAmJiAhZXhwYW5kZWQpIHtcbiAgICAgICAgICBjb25zdCB7IFtyb3cuaWRdOiBfLCAuLi5yZXN0IH0gPSBvbGRFeHBhbmRlZFxuICAgICAgICAgIHJldHVybiByZXN0XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2xkXG4gICAgICB9KVxuICAgIH1cbiAgICByb3cuZ2V0SXNFeHBhbmRlZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGV4cGFuZGVkID0gdGFibGUuZ2V0U3RhdGUoKS5leHBhbmRlZFxuXG4gICAgICByZXR1cm4gISEoXG4gICAgICAgIHRhYmxlLm9wdGlvbnMuZ2V0SXNSb3dFeHBhbmRlZD8uKHJvdykgPz9cbiAgICAgICAgKGV4cGFuZGVkID09PSB0cnVlIHx8IGV4cGFuZGVkPy5bcm93LmlkXSlcbiAgICAgIClcbiAgICB9XG4gICAgcm93LmdldENhbkV4cGFuZCA9ICgpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRhYmxlLm9wdGlvbnMuZ2V0Um93Q2FuRXhwYW5kPy4ocm93KSA/P1xuICAgICAgICAoKHRhYmxlLm9wdGlvbnMuZW5hYmxlRXhwYW5kaW5nID8/IHRydWUpICYmICEhcm93LnN1YlJvd3M/Lmxlbmd0aClcbiAgICAgIClcbiAgICB9XG4gICAgcm93LmdldElzQWxsUGFyZW50c0V4cGFuZGVkID0gKCkgPT4ge1xuICAgICAgbGV0IGlzRnVsbHlFeHBhbmRlZCA9IHRydWVcbiAgICAgIGxldCBjdXJyZW50Um93ID0gcm93XG5cbiAgICAgIHdoaWxlIChpc0Z1bGx5RXhwYW5kZWQgJiYgY3VycmVudFJvdy5wYXJlbnRJZCkge1xuICAgICAgICBjdXJyZW50Um93ID0gdGFibGUuZ2V0Um93KGN1cnJlbnRSb3cucGFyZW50SWQsIHRydWUpXG4gICAgICAgIGlzRnVsbHlFeHBhbmRlZCA9IGN1cnJlbnRSb3cuZ2V0SXNFeHBhbmRlZCgpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpc0Z1bGx5RXhwYW5kZWRcbiAgICB9XG4gICAgcm93LmdldFRvZ2dsZUV4cGFuZGVkSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNhbkV4cGFuZCA9IHJvdy5nZXRDYW5FeHBhbmQoKVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoIWNhbkV4cGFuZCkgcmV0dXJuXG4gICAgICAgIHJvdy50b2dnbGVFeHBhbmRlZCgpXG4gICAgICB9XG4gICAgfVxuICB9LFxufVxuIiwiaW1wb3J0IHsgRmlsdGVyRm4gfSBmcm9tICcuL2ZlYXR1cmVzL0ZpbHRlcnMnXG5cbmNvbnN0IGluY2x1ZGVzU3RyaW5nOiBGaWx0ZXJGbjxhbnk+ID0gKFxuICByb3csXG4gIGNvbHVtbklkOiBzdHJpbmcsXG4gIGZpbHRlclZhbHVlOiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBzZWFyY2ggPSBmaWx0ZXJWYWx1ZS50b0xvd2VyQ2FzZSgpXG4gIHJldHVybiBCb29sZWFuKFxuICAgIHJvd1xuICAgICAgLmdldFZhbHVlPHN0cmluZyB8IG51bGw+KGNvbHVtbklkKVxuICAgICAgPy50b1N0cmluZygpXG4gICAgICA/LnRvTG93ZXJDYXNlKClcbiAgICAgID8uaW5jbHVkZXMoc2VhcmNoKVxuICApXG59XG5cbmluY2x1ZGVzU3RyaW5nLmF1dG9SZW1vdmUgPSAodmFsOiBhbnkpID0+IHRlc3RGYWxzZXkodmFsKVxuXG5jb25zdCBpbmNsdWRlc1N0cmluZ1NlbnNpdGl2ZTogRmlsdGVyRm48YW55PiA9IChcbiAgcm93LFxuICBjb2x1bW5JZDogc3RyaW5nLFxuICBmaWx0ZXJWYWx1ZTogc3RyaW5nXG4pID0+IHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgcm93LmdldFZhbHVlPHN0cmluZyB8IG51bGw+KGNvbHVtbklkKT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoZmlsdGVyVmFsdWUpXG4gIClcbn1cblxuaW5jbHVkZXNTdHJpbmdTZW5zaXRpdmUuYXV0b1JlbW92ZSA9ICh2YWw6IGFueSkgPT4gdGVzdEZhbHNleSh2YWwpXG5cbmNvbnN0IGVxdWFsc1N0cmluZzogRmlsdGVyRm48YW55PiA9IChcbiAgcm93LFxuICBjb2x1bW5JZDogc3RyaW5nLFxuICBmaWx0ZXJWYWx1ZTogc3RyaW5nXG4pID0+IHtcbiAgcmV0dXJuIChcbiAgICByb3cuZ2V0VmFsdWU8c3RyaW5nIHwgbnVsbD4oY29sdW1uSWQpPy50b1N0cmluZygpPy50b0xvd2VyQ2FzZSgpID09PVxuICAgIGZpbHRlclZhbHVlPy50b0xvd2VyQ2FzZSgpXG4gIClcbn1cblxuZXF1YWxzU3RyaW5nLmF1dG9SZW1vdmUgPSAodmFsOiBhbnkpID0+IHRlc3RGYWxzZXkodmFsKVxuXG5jb25zdCBhcnJJbmNsdWRlczogRmlsdGVyRm48YW55PiA9IChcbiAgcm93LFxuICBjb2x1bW5JZDogc3RyaW5nLFxuICBmaWx0ZXJWYWx1ZTogdW5rbm93blxuKSA9PiB7XG4gIHJldHVybiByb3cuZ2V0VmFsdWU8dW5rbm93bltdPihjb2x1bW5JZCk/LmluY2x1ZGVzKGZpbHRlclZhbHVlKVxufVxuXG5hcnJJbmNsdWRlcy5hdXRvUmVtb3ZlID0gKHZhbDogYW55KSA9PiB0ZXN0RmFsc2V5KHZhbCkgfHwgIXZhbD8ubGVuZ3RoXG5cbmNvbnN0IGFyckluY2x1ZGVzQWxsOiBGaWx0ZXJGbjxhbnk+ID0gKFxuICByb3csXG4gIGNvbHVtbklkOiBzdHJpbmcsXG4gIGZpbHRlclZhbHVlOiB1bmtub3duW11cbikgPT4ge1xuICByZXR1cm4gIWZpbHRlclZhbHVlLnNvbWUoXG4gICAgdmFsID0+ICFyb3cuZ2V0VmFsdWU8dW5rbm93bltdPihjb2x1bW5JZCk/LmluY2x1ZGVzKHZhbClcbiAgKVxufVxuXG5hcnJJbmNsdWRlc0FsbC5hdXRvUmVtb3ZlID0gKHZhbDogYW55KSA9PiB0ZXN0RmFsc2V5KHZhbCkgfHwgIXZhbD8ubGVuZ3RoXG5cbmNvbnN0IGFyckluY2x1ZGVzU29tZTogRmlsdGVyRm48YW55PiA9IChcbiAgcm93LFxuICBjb2x1bW5JZDogc3RyaW5nLFxuICBmaWx0ZXJWYWx1ZTogdW5rbm93bltdXG4pID0+IHtcbiAgcmV0dXJuIGZpbHRlclZhbHVlLnNvbWUoXG4gICAgdmFsID0+IHJvdy5nZXRWYWx1ZTx1bmtub3duW10+KGNvbHVtbklkKT8uaW5jbHVkZXModmFsKVxuICApXG59XG5cbmFyckluY2x1ZGVzU29tZS5hdXRvUmVtb3ZlID0gKHZhbDogYW55KSA9PiB0ZXN0RmFsc2V5KHZhbCkgfHwgIXZhbD8ubGVuZ3RoXG5cbmNvbnN0IGVxdWFsczogRmlsdGVyRm48YW55PiA9IChyb3csIGNvbHVtbklkOiBzdHJpbmcsIGZpbHRlclZhbHVlOiB1bmtub3duKSA9PiB7XG4gIHJldHVybiByb3cuZ2V0VmFsdWUoY29sdW1uSWQpID09PSBmaWx0ZXJWYWx1ZVxufVxuXG5lcXVhbHMuYXV0b1JlbW92ZSA9ICh2YWw6IGFueSkgPT4gdGVzdEZhbHNleSh2YWwpXG5cbmNvbnN0IHdlYWtFcXVhbHM6IEZpbHRlckZuPGFueT4gPSAoXG4gIHJvdyxcbiAgY29sdW1uSWQ6IHN0cmluZyxcbiAgZmlsdGVyVmFsdWU6IHVua25vd25cbikgPT4ge1xuICByZXR1cm4gcm93LmdldFZhbHVlKGNvbHVtbklkKSA9PSBmaWx0ZXJWYWx1ZVxufVxuXG53ZWFrRXF1YWxzLmF1dG9SZW1vdmUgPSAodmFsOiBhbnkpID0+IHRlc3RGYWxzZXkodmFsKVxuXG5jb25zdCBpbk51bWJlclJhbmdlOiBGaWx0ZXJGbjxhbnk+ID0gKFxuICByb3csXG4gIGNvbHVtbklkOiBzdHJpbmcsXG4gIGZpbHRlclZhbHVlOiBbbnVtYmVyLCBudW1iZXJdXG4pID0+IHtcbiAgbGV0IFttaW4sIG1heF0gPSBmaWx0ZXJWYWx1ZVxuXG4gIGNvbnN0IHJvd1ZhbHVlID0gcm93LmdldFZhbHVlPG51bWJlcj4oY29sdW1uSWQpXG4gIHJldHVybiByb3dWYWx1ZSA+PSBtaW4gJiYgcm93VmFsdWUgPD0gbWF4XG59XG5cbmluTnVtYmVyUmFuZ2UucmVzb2x2ZUZpbHRlclZhbHVlID0gKHZhbDogW2FueSwgYW55XSkgPT4ge1xuICBsZXQgW3Vuc2FmZU1pbiwgdW5zYWZlTWF4XSA9IHZhbFxuXG4gIGxldCBwYXJzZWRNaW4gPVxuICAgIHR5cGVvZiB1bnNhZmVNaW4gIT09ICdudW1iZXInID8gcGFyc2VGbG9hdCh1bnNhZmVNaW4gYXMgc3RyaW5nKSA6IHVuc2FmZU1pblxuICBsZXQgcGFyc2VkTWF4ID1cbiAgICB0eXBlb2YgdW5zYWZlTWF4ICE9PSAnbnVtYmVyJyA/IHBhcnNlRmxvYXQodW5zYWZlTWF4IGFzIHN0cmluZykgOiB1bnNhZmVNYXhcblxuICBsZXQgbWluID1cbiAgICB1bnNhZmVNaW4gPT09IG51bGwgfHwgTnVtYmVyLmlzTmFOKHBhcnNlZE1pbikgPyAtSW5maW5pdHkgOiBwYXJzZWRNaW5cbiAgbGV0IG1heCA9IHVuc2FmZU1heCA9PT0gbnVsbCB8fCBOdW1iZXIuaXNOYU4ocGFyc2VkTWF4KSA/IEluZmluaXR5IDogcGFyc2VkTWF4XG5cbiAgaWYgKG1pbiA+IG1heCkge1xuICAgIGNvbnN0IHRlbXAgPSBtaW5cbiAgICBtaW4gPSBtYXhcbiAgICBtYXggPSB0ZW1wXG4gIH1cblxuICByZXR1cm4gW21pbiwgbWF4XSBhcyBjb25zdFxufVxuXG5pbk51bWJlclJhbmdlLmF1dG9SZW1vdmUgPSAodmFsOiBhbnkpID0+XG4gIHRlc3RGYWxzZXkodmFsKSB8fCAodGVzdEZhbHNleSh2YWxbMF0pICYmIHRlc3RGYWxzZXkodmFsWzFdKSlcblxuLy8gRXhwb3J0XG5cbmV4cG9ydCBjb25zdCBmaWx0ZXJGbnMgPSB7XG4gIGluY2x1ZGVzU3RyaW5nLFxuICBpbmNsdWRlc1N0cmluZ1NlbnNpdGl2ZSxcbiAgZXF1YWxzU3RyaW5nLFxuICBhcnJJbmNsdWRlcyxcbiAgYXJySW5jbHVkZXNBbGwsXG4gIGFyckluY2x1ZGVzU29tZSxcbiAgZXF1YWxzLFxuICB3ZWFrRXF1YWxzLFxuICBpbk51bWJlclJhbmdlLFxufVxuXG5leHBvcnQgdHlwZSBCdWlsdEluRmlsdGVyRm4gPSBrZXlvZiB0eXBlb2YgZmlsdGVyRm5zXG5cbi8vIFV0aWxzXG5cbmZ1bmN0aW9uIHRlc3RGYWxzZXkodmFsOiBhbnkpIHtcbiAgcmV0dXJuIHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09ICcnXG59XG4iLCJpbXBvcnQgeyBSb3dNb2RlbCB9IGZyb20gJy4uJ1xuaW1wb3J0IHsgVGFibGVGZWF0dXJlIH0gZnJvbSAnLi4vY29yZS90YWJsZSdcbmltcG9ydCB7IEJ1aWx0SW5GaWx0ZXJGbiwgZmlsdGVyRm5zIH0gZnJvbSAnLi4vZmlsdGVyRm5zJ1xuaW1wb3J0IHtcbiAgQ29sdW1uLFxuICBPbkNoYW5nZUZuLFxuICBUYWJsZSxcbiAgUm93LFxuICBVcGRhdGVyLFxuICBSb3dEYXRhLFxuICBGaWx0ZXJNZXRhLFxuICBGaWx0ZXJGbnMsXG59IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgZnVuY3Rpb25hbFVwZGF0ZSwgaXNGdW5jdGlvbiwgbWFrZVN0YXRlVXBkYXRlciB9IGZyb20gJy4uL3V0aWxzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlcnNUYWJsZVN0YXRlIHtcbiAgY29sdW1uRmlsdGVyczogQ29sdW1uRmlsdGVyc1N0YXRlXG4gIGdsb2JhbEZpbHRlcjogYW55XG59XG5cbmV4cG9ydCB0eXBlIENvbHVtbkZpbHRlcnNTdGF0ZSA9IENvbHVtbkZpbHRlcltdXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uRmlsdGVyIHtcbiAgaWQ6IHN0cmluZ1xuICB2YWx1ZTogdW5rbm93blxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkQ29sdW1uRmlsdGVyPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICBpZDogc3RyaW5nXG4gIHJlc29sdmVkVmFsdWU6IHVua25vd25cbiAgZmlsdGVyRm46IEZpbHRlckZuPFREYXRhPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckZuPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICAoXG4gICAgcm93OiBSb3c8VERhdGE+LFxuICAgIGNvbHVtbklkOiBzdHJpbmcsXG4gICAgZmlsdGVyVmFsdWU6IGFueSxcbiAgICBhZGRNZXRhOiAobWV0YTogRmlsdGVyTWV0YSkgPT4gdm9pZFxuICApOiBib29sZWFuXG5cbiAgcmVzb2x2ZUZpbHRlclZhbHVlPzogVHJhbnNmb3JtRmlsdGVyVmFsdWVGbjxURGF0YT5cbiAgYXV0b1JlbW92ZT86IENvbHVtbkZpbHRlckF1dG9SZW1vdmVUZXN0Rm48VERhdGE+XG59XG5cbmV4cG9ydCB0eXBlIFRyYW5zZm9ybUZpbHRlclZhbHVlRm48VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiA9IChcbiAgdmFsdWU6IGFueSxcbiAgY29sdW1uPzogQ29sdW1uPFREYXRhLCB1bmtub3duPlxuKSA9PiB1bmtub3duXG5cbmV4cG9ydCB0eXBlIENvbHVtbkZpbHRlckF1dG9SZW1vdmVUZXN0Rm48VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiA9IChcbiAgdmFsdWU6IGFueSxcbiAgY29sdW1uPzogQ29sdW1uPFREYXRhLCB1bmtub3duPlxuKSA9PiBib29sZWFuXG5cbmV4cG9ydCB0eXBlIEN1c3RvbUZpbHRlckZuczxURGF0YSBleHRlbmRzIFJvd0RhdGE+ID0gUmVjb3JkPFxuICBzdHJpbmcsXG4gIEZpbHRlckZuPFREYXRhPlxuPlxuXG5leHBvcnQgdHlwZSBGaWx0ZXJGbk9wdGlvbjxURGF0YSBleHRlbmRzIFJvd0RhdGE+ID1cbiAgfCAnYXV0bydcbiAgfCBCdWlsdEluRmlsdGVyRm5cbiAgfCBrZXlvZiBGaWx0ZXJGbnNcbiAgfCBGaWx0ZXJGbjxURGF0YT5cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJzQ29sdW1uRGVmPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICAvKipcbiAgICogVGhlIGZpbHRlciBmdW5jdGlvbiB0byB1c2Ugd2l0aCB0aGlzIGNvbHVtbi4gQ2FuIGJlIHRoZSBuYW1lIG9mIGEgYnVpbHQtaW4gZmlsdGVyIGZ1bmN0aW9uIG9yIGEgY3VzdG9tIGZpbHRlciBmdW5jdGlvbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2ZpbHRlcmZuKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGZpbHRlckZuPzogRmlsdGVyRm5PcHRpb248VERhdGE+XG4gIC8qKlxuICAgKiBFbmFibGVzL2Rpc2FibGVzIHRoZSAqKmNvbHVtbioqIGZpbHRlciBmb3IgdGhpcyBjb2x1bW4uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNlbmFibGVjb2x1bW5maWx0ZXIpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgZW5hYmxlQ29sdW1uRmlsdGVyPzogYm9vbGVhblxuICAvKipcbiAgICogRW5hYmxlcy9kaXNhYmxlcyB0aGUgKipnbG9iYWwqKiBmaWx0ZXIgZm9yIHRoaXMgY29sdW1uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2ZpbHRlcnMjZW5hYmxlZ2xvYmFsZmlsdGVyKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGVuYWJsZUdsb2JhbEZpbHRlcj86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJzQ29sdW1uPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICBfZ2V0RmFjZXRlZE1pbk1heFZhbHVlcz86ICgpID0+IHVuZGVmaW5lZCB8IFtudW1iZXIsIG51bWJlcl1cbiAgX2dldEZhY2V0ZWRSb3dNb2RlbD86ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICBfZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcz86ICgpID0+IE1hcDxhbnksIG51bWJlcj5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGZpbHRlciBmdW5jdGlvbiBmb3IgdGhlIGNvbHVtbiBiYXNlZCBvZmYgb2YgdGhlIGNvbHVtbnMgZmlyc3Qga25vd24gdmFsdWUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNnZXRhdXRvZmlsdGVyZm4pXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgZ2V0QXV0b0ZpbHRlckZuOiAoKSA9PiBGaWx0ZXJGbjxURGF0YT4gfCB1bmRlZmluZWRcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNvbHVtbiBjYW4gYmUgKipjb2x1bW4qKiBmaWx0ZXJlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dldGNhbmZpbHRlcilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBnZXRDYW5GaWx0ZXI6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNvbHVtbiBjYW4gYmUgKipnbG9iYWxseSoqIGZpbHRlcmVkLiBTZXQgdG8gYGZhbHNlYCB0byBkaXNhYmxlIGEgY29sdW1uIGZyb20gYmVpbmcgc2Nhbm5lZCBkdXJpbmcgZ2xvYmFsIGZpbHRlcmluZy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dldGNhbmdsb2JhbGZpbHRlcilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBnZXRDYW5HbG9iYWxGaWx0ZXI6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCAqKmNvbXB1dGVzIGFuZCByZXR1cm5zKiogYSBtaW4vbWF4IHR1cGxlIGRlcml2ZWQgZnJvbSBgY29sdW1uLmdldEZhY2V0ZWRSb3dNb2RlbGAuIFVzZWZ1bCBmb3IgZGlzcGxheWluZyBmYWNldGVkIHJlc3VsdCB2YWx1ZXMuXG4gICAqID4g4pqg77iPIFJlcXVpcmVzIHRoYXQgeW91IHBhc3MgYSB2YWxpZCBgZ2V0RmFjZXRlZE1pbk1heFZhbHVlc2AgZnVuY3Rpb24gdG8gYG9wdGlvbnMuZ2V0RmFjZXRlZE1pbk1heFZhbHVlc2AuIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZCB2aWEgdGhlIGV4cG9ydGVkIGBnZXRGYWNldGVkTWluTWF4VmFsdWVzYCBmdW5jdGlvbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dldGZhY2V0ZWRtaW5tYXh2YWx1ZXMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgZ2V0RmFjZXRlZE1pbk1heFZhbHVlczogKCkgPT4gdW5kZWZpbmVkIHwgW251bWJlciwgbnVtYmVyXVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93IG1vZGVsIHdpdGggYWxsIG90aGVyIGNvbHVtbiBmaWx0ZXJzIGFwcGxpZWQsIGV4Y2x1ZGluZyBpdHMgb3duIGZpbHRlci4gVXNlZnVsIGZvciBkaXNwbGF5aW5nIGZhY2V0ZWQgcmVzdWx0IGNvdW50cy5cbiAgICogPiDimqDvuI8gUmVxdWlyZXMgdGhhdCB5b3UgcGFzcyBhIHZhbGlkIGBnZXRGYWNldGVkUm93TW9kZWxgIGZ1bmN0aW9uIHRvIGBvcHRpb25zLmZhY2V0ZWRSb3dNb2RlbGAuIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZCB2aWEgdGhlIGV4cG9ydGVkIGBnZXRGYWNldGVkUm93TW9kZWxgIGZ1bmN0aW9uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2ZpbHRlcnMjZ2V0ZmFjZXRlZHJvd21vZGVsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGdldEZhY2V0ZWRSb3dNb2RlbDogKCkgPT4gUm93TW9kZWw8VERhdGE+XG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgKipjb21wdXRlcyBhbmQgcmV0dXJucyoqIGEgYE1hcGAgb2YgdW5pcXVlIHZhbHVlcyBhbmQgdGhlaXIgb2NjdXJyZW5jZXMgZGVyaXZlZCBmcm9tIGBjb2x1bW4uZ2V0RmFjZXRlZFJvd01vZGVsYC4gVXNlZnVsIGZvciBkaXNwbGF5aW5nIGZhY2V0ZWQgcmVzdWx0IHZhbHVlcy5cbiAgICogPiDimqDvuI8gUmVxdWlyZXMgdGhhdCB5b3UgcGFzcyBhIHZhbGlkIGBnZXRGYWNldGVkVW5pcXVlVmFsdWVzYCBmdW5jdGlvbiB0byBgb3B0aW9ucy5nZXRGYWNldGVkVW5pcXVlVmFsdWVzYC4gQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkIHZpYSB0aGUgZXhwb3J0ZWQgYGdldEZhY2V0ZWRVbmlxdWVWYWx1ZXNgIGZ1bmN0aW9uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2ZpbHRlcnMjZ2V0ZmFjZXRlZHVuaXF1ZXZhbHVlcylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBnZXRGYWNldGVkVW5pcXVlVmFsdWVzOiAoKSA9PiBNYXA8YW55LCBudW1iZXI+XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaWx0ZXIgZnVuY3Rpb24gKGVpdGhlciB1c2VyLWRlZmluZWQgb3IgYXV0b21hdGljLCBkZXBlbmRpbmcgb24gY29uZmlndXJhdGlvbikgZm9yIHRoZSBjb2x1bW5JZCBzcGVjaWZpZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNnZXRmaWx0ZXJmbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBnZXRGaWx0ZXJGbjogKCkgPT4gRmlsdGVyRm48VERhdGE+IHwgdW5kZWZpbmVkXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpbmRleCAoaW5jbHVkaW5nIGAtMWApIG9mIHRoZSBjb2x1bW4gZmlsdGVyIGluIHRoZSB0YWJsZSdzIGBzdGF0ZS5jb2x1bW5GaWx0ZXJzYCBhcnJheS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dldGZpbHRlcmluZGV4KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGdldEZpbHRlckluZGV4OiAoKSA9PiBudW1iZXJcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZmlsdGVyIHZhbHVlIGZvciB0aGUgY29sdW1uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2ZpbHRlcnMjZ2V0ZmlsdGVydmFsdWUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgZ2V0RmlsdGVyVmFsdWU6ICgpID0+IHVua25vd25cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNvbHVtbiBpcyBjdXJyZW50bHkgZmlsdGVyZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNnZXRpc2ZpbHRlcmVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGdldElzRmlsdGVyZWQ6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCBzZXRzIHRoZSBjdXJyZW50IGZpbHRlciB2YWx1ZSBmb3IgdGhlIGNvbHVtbi4gWW91IGNhbiBwYXNzIGl0IGEgdmFsdWUgb3IgYW4gdXBkYXRlciBmdW5jdGlvbiBmb3IgaW1tdXRhYmlsaXR5LXNhZmUgb3BlcmF0aW9ucyBvbiBleGlzdGluZyB2YWx1ZXMuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNzZXRmaWx0ZXJ2YWx1ZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBzZXRGaWx0ZXJWYWx1ZTogKHVwZGF0ZXI6IFVwZGF0ZXI8YW55PikgPT4gdm9pZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlcnNSb3c8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiB7XG4gIC8qKlxuICAgKiBUaGUgY29sdW1uIGZpbHRlcnMgbWFwIGZvciB0aGUgcm93LiBUaGlzIG9iamVjdCB0cmFja3Mgd2hldGhlciBhIHJvdyBpcyBwYXNzaW5nL2ZhaWxpbmcgc3BlY2lmaWMgZmlsdGVycyBieSB0aGVpciBjb2x1bW4gSUQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNjb2x1bW5maWx0ZXJzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGNvbHVtbkZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+XG4gIC8qKlxuICAgKiBUaGUgY29sdW1uIGZpbHRlcnMgbWV0YSBtYXAgZm9yIHRoZSByb3cuIFRoaXMgb2JqZWN0IHRyYWNrcyBhbnkgZmlsdGVyIG1ldGEgZm9yIGEgcm93IGFzIG9wdGlvbmFsbHkgcHJvdmlkZWQgZHVyaW5nIHRoZSBmaWx0ZXJpbmcgcHJvY2Vzcy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2NvbHVtbmZpbHRlcnNtZXRhKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGNvbHVtbkZpbHRlcnNNZXRhOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJNZXRhPlxufVxuXG5pbnRlcmZhY2UgRmlsdGVyc09wdGlvbnNCYXNlPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICAvKipcbiAgICogRW5hYmxlcy9kaXNhYmxlcyBhbGwgZmlsdGVyaW5nIGZvciB0aGUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNlbmFibGVmaWx0ZXJzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGVuYWJsZUZpbHRlcnM/OiBib29sZWFuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCBmaWx0ZXJpbmcgaXMgZG9uZSBmcm9tIHBhcmVudCByb3dzIGRvd24gKHNvIGlmIGEgcGFyZW50IHJvdyBpcyBmaWx0ZXJlZCBvdXQsIGFsbCBvZiBpdHMgY2hpbGRyZW4gd2lsbCBiZSBmaWx0ZXJlZCBvdXQgYXMgd2VsbCkuIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gYHRydWVgIHdpbGwgY2F1c2UgZmlsdGVyaW5nIHRvIGJlIGRvbmUgZnJvbSBsZWFmIHJvd3MgdXAgKHdoaWNoIG1lYW5zIHBhcmVudCByb3dzIHdpbGwgYmUgaW5jbHVkZWQgc28gbG9uZyBhcyBvbmUgb2YgdGhlaXIgY2hpbGQgb3IgZ3JhbmQtY2hpbGQgcm93cyBpcyBhbHNvIGluY2x1ZGVkKS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2ZpbHRlcmZyb21sZWFmcm93cylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBmaWx0ZXJGcm9tTGVhZlJvd3M/OiBib29sZWFuXG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgKipvbmNlKiogcGVyIHRhYmxlIGFuZCBzaG91bGQgcmV0dXJuIGEgKipuZXcgZnVuY3Rpb24qKiB3aGljaCB3aWxsIGNhbGN1bGF0ZSBhbmQgcmV0dXJuIHRoZSByb3cgbW9kZWwgZm9yIHRoZSB0YWJsZSB3aGVuIGl0J3MgZmlsdGVyZWQuXG4gICAqIC0gRm9yIHNlcnZlci1zaWRlIGZpbHRlcmluZywgdGhpcyBmdW5jdGlvbiBpcyB1bm5lY2Vzc2FyeSBhbmQgY2FuIGJlIGlnbm9yZWQgc2luY2UgdGhlIHNlcnZlciBzaG91bGQgYWxyZWFkeSByZXR1cm4gdGhlIGZpbHRlcmVkIHJvdyBtb2RlbC5cbiAgICogLSBGb3IgY2xpZW50LXNpZGUgZmlsdGVyaW5nLCB0aGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkLiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQgdmlhIGFueSB0YWJsZSBhZGFwdGVyJ3MgYHsgZ2V0RmlsdGVyZWRSb3dNb2RlbCB9YCBleHBvcnQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNnZXRmaWx0ZXJlZHJvd21vZGVsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGdldEZpbHRlcmVkUm93TW9kZWw/OiAodGFibGU6IFRhYmxlPGFueT4pID0+ICgpID0+IFJvd01vZGVsPGFueT5cbiAgLyoqXG4gICAqIERpc2FibGVzIHRoZSBgZ2V0RmlsdGVyZWRSb3dNb2RlbGAgZnJvbSBiZWluZyB1c2VkIHRvIGZpbHRlciBkYXRhLiBUaGlzIG1heSBiZSB1c2VmdWwgaWYgeW91ciB0YWJsZSBuZWVkcyB0byBkeW5hbWljYWxseSBzdXBwb3J0IGJvdGggY2xpZW50LXNpZGUgYW5kIHNlcnZlci1zaWRlIGZpbHRlcmluZy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI21hbnVhbGZpbHRlcmluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBtYW51YWxGaWx0ZXJpbmc/OiBib29sZWFuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCBmaWx0ZXJpbmcgaXMgZG9uZSBmb3IgYWxsIHJvd3MgKG1heCBkZXB0aCBvZiAxMDApLCBubyBtYXR0ZXIgaWYgdGhleSBhcmUgcm9vdCBsZXZlbCBwYXJlbnQgcm93cyBvciB0aGUgY2hpbGQgbGVhZiByb3dzIG9mIGEgcGFyZW50IHJvdy4gU2V0dGluZyB0aGlzIG9wdGlvbiB0byBgMGAgd2lsbCBjYXVzZSBmaWx0ZXJpbmcgdG8gb25seSBiZSBhcHBsaWVkIHRvIHRoZSByb290IGxldmVsIHBhcmVudCByb3dzLCB3aXRoIGFsbCBzdWItcm93cyByZW1haW5pbmcgdW5maWx0ZXJlZC4gU2ltaWxhcmx5LCBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGAxYCB3aWxsIGNhdXNlIGZpbHRlcmluZyB0byBvbmx5IGJlIGFwcGxpZWQgdG8gY2hpbGQgbGVhZiByb3dzIDEgbGV2ZWwgZGVlcCwgYW5kIHNvIG9uLlxuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBzaXR1YXRpb25zIHdoZXJlIHlvdSB3YW50IGEgcm93J3MgZW50aXJlIGNoaWxkIGhpZXJhcmNoeSB0byBiZSB2aXNpYmxlIHJlZ2FyZGxlc3Mgb2YgdGhlIGFwcGxpZWQgZmlsdGVyLlxuICAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI21heGxlYWZyb3dmaWx0ZXJkZXB0aClcbiAgICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgbWF4TGVhZlJvd0ZpbHRlckRlcHRoPzogbnVtYmVyXG5cbiAgLy8gQ29sdW1uXG4gIC8qKlxuICAgKiBFbmFibGVzL2Rpc2FibGVzICoqY29sdW1uKiogZmlsdGVyaW5nIGZvciBhbGwgY29sdW1ucy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2VuYWJsZWNvbHVtbmZpbHRlcnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgZW5hYmxlQ29sdW1uRmlsdGVycz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggYW4gYHVwZGF0ZXJGbmAgd2hlbiBgc3RhdGUuY29sdW1uRmlsdGVyc2AgY2hhbmdlcy4gVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgaW50ZXJuYWwgc3RhdGUgbWFuYWdlbWVudCwgc28geW91IHdpbGwgbmVlZCB0byBwZXJzaXN0IHRoZSBzdGF0ZSBjaGFuZ2UgZWl0aGVyIGZ1bGx5IG9yIHBhcnRpYWxseSBvdXRzaWRlIG9mIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI29uY29sdW1uZmlsdGVyc2NoYW5nZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBvbkNvbHVtbkZpbHRlcnNDaGFuZ2U/OiBPbkNoYW5nZUZuPENvbHVtbkZpbHRlcnNTdGF0ZT5cblxuICAvLyBHbG9iYWxcbiAgLyoqXG4gICAqIEVuYWJsZXMvZGlzYWJsZXMgKipnbG9iYWwqKiBmaWx0ZXJpbmcgZm9yIGFsbCBjb2x1bW5zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2ZpbHRlcnMjZW5hYmxlZ2xvYmFsZmlsdGVyKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGVuYWJsZUdsb2JhbEZpbHRlcj86IGJvb2xlYW5cbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGNvbHVtbiBhbmQgc2hvdWxkIHJldHVybiBgdHJ1ZWAgb3IgYGZhbHNlYCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoaXMgY29sdW1uIHNob3VsZCBiZSB1c2VkIGZvciBnbG9iYWwgZmlsdGVyaW5nLlxuICAgKiBcbiAgICogVGhpcyBpcyB1c2VmdWwgaWYgdGhlIGNvbHVtbiBjYW4gY29udGFpbiBkYXRhIHRoYXQgaXMgbm90IGBzdHJpbmdgIG9yIGBudW1iZXJgIChpLmUuIGB1bmRlZmluZWRgKS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dldGNvbHVtbmNhbmdsb2JhbGZpbHRlcilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBnZXRDb2x1bW5DYW5HbG9iYWxGaWx0ZXI/OiAoY29sdW1uOiBDb2x1bW48VERhdGEsIHVua25vd24+KSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBUaGUgZmlsdGVyIGZ1bmN0aW9uIHRvIHVzZSBmb3IgZ2xvYmFsIGZpbHRlcmluZy5cbiAgICogLSBBIGBzdHJpbmdgIHJlZmVyZW5jaW5nIGEgYnVpbHQtaW4gZmlsdGVyIGZ1bmN0aW9uXG4gICAqIC0gQSBgc3RyaW5nYCB0aGF0IHJlZmVyZW5jZXMgYSBjdXN0b20gZmlsdGVyIGZ1bmN0aW9ucyBwcm92aWRlZCB2aWEgdGhlIGB0YWJsZU9wdGlvbnMuZmlsdGVyRm5zYCBvcHRpb25cbiAgICogLSBBIGN1c3RvbSBmaWx0ZXIgZnVuY3Rpb25cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dsb2JhbGZpbHRlcmZuKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGdsb2JhbEZpbHRlckZuPzogRmlsdGVyRm5PcHRpb248VERhdGE+XG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGB1cGRhdGVyRm5gIHdoZW4gYHN0YXRlLmdsb2JhbEZpbHRlcmAgY2hhbmdlcy4gVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgaW50ZXJuYWwgc3RhdGUgbWFuYWdlbWVudCwgc28geW91IHdpbGwgbmVlZCB0byBwZXJzaXN0IHRoZSBzdGF0ZSBjaGFuZ2UgZWl0aGVyIGZ1bGx5IG9yIHBhcnRpYWxseSBvdXRzaWRlIG9mIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI29uZ2xvYmFsZmlsdGVyY2hhbmdlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIG9uR2xvYmFsRmlsdGVyQ2hhbmdlPzogT25DaGFuZ2VGbjxhbnk+XG5cbiAgLy8gRmFjZXRpbmdcbiAgZ2V0RmFjZXRlZFJvd01vZGVsPzogKFxuICAgIHRhYmxlOiBUYWJsZTxURGF0YT4sXG4gICAgY29sdW1uSWQ6IHN0cmluZ1xuICApID0+ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICBnZXRGYWNldGVkVW5pcXVlVmFsdWVzPzogKFxuICAgIHRhYmxlOiBUYWJsZTxURGF0YT4sXG4gICAgY29sdW1uSWQ6IHN0cmluZ1xuICApID0+ICgpID0+IE1hcDxhbnksIG51bWJlcj5cbiAgZ2V0RmFjZXRlZE1pbk1heFZhbHVlcz86IChcbiAgICB0YWJsZTogVGFibGU8VERhdGE+LFxuICAgIGNvbHVtbklkOiBzdHJpbmdcbiAgKSA9PiAoKSA9PiB1bmRlZmluZWQgfCBbbnVtYmVyLCBudW1iZXJdXG59XG5cbnR5cGUgUmVzb2x2ZWRGaWx0ZXJGbnMgPSBrZXlvZiBGaWx0ZXJGbnMgZXh0ZW5kcyBuZXZlclxuICA/IHtcbiAgICAgIGZpbHRlckZucz86IFJlY29yZDxzdHJpbmcsIEZpbHRlckZuPGFueT4+XG4gICAgfVxuICA6IHtcbiAgICAgIGZpbHRlckZuczogUmVjb3JkPGtleW9mIEZpbHRlckZucywgRmlsdGVyRm48YW55Pj5cbiAgICB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyc09wdGlvbnM8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPlxuICBleHRlbmRzIEZpbHRlcnNPcHRpb25zQmFzZTxURGF0YT4sXG4gICAgUmVzb2x2ZWRGaWx0ZXJGbnMge31cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJzSW5zdGFuY2U8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiB7XG4gIC8qKlxuICAgKiBTZXRzIG9yIHVwZGF0ZXMgdGhlIGBzdGF0ZS5jb2x1bW5GaWx0ZXJzYCBzdGF0ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI3NldGNvbHVtbmZpbHRlcnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgc2V0Q29sdW1uRmlsdGVyczogKHVwZGF0ZXI6IFVwZGF0ZXI8Q29sdW1uRmlsdGVyc1N0YXRlPikgPT4gdm9pZFxuICAvKipcbiAgICogUmVzZXRzIHRoZSAqKmNvbHVtbkZpbHRlcnMqKiBzdGF0ZSB0byBgaW5pdGlhbFN0YXRlLmNvbHVtbkZpbHRlcnNgLCBvciBgdHJ1ZWAgY2FuIGJlIHBhc3NlZCB0byBmb3JjZSBhIGRlZmF1bHQgYmxhbmsgc3RhdGUgcmVzZXQgdG8gYFtdYC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI3Jlc2V0Y29sdW1uZmlsdGVycylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICByZXNldENvbHVtbkZpbHRlcnM6IChkZWZhdWx0U3RhdGU/OiBib29sZWFuKSA9PiB2b2lkXG5cbiAgLy8gQ29sdW1uIEZpbHRlcnNcbiAgX2dldEZpbHRlcmVkUm93TW9kZWw/OiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJvdyBtb2RlbCBmb3IgdGhlIHRhYmxlIGFmdGVyICoqY29sdW1uKiogZmlsdGVyaW5nIGhhcyBiZWVuIGFwcGxpZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNnZXRmaWx0ZXJlZHJvd21vZGVsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGdldEZpbHRlcmVkUm93TW9kZWw6ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93IG1vZGVsIGZvciB0aGUgdGFibGUgYmVmb3JlIGFueSAqKmNvbHVtbioqIGZpbHRlcmluZyBoYXMgYmVlbiBhcHBsaWVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2ZpbHRlcnMjZ2V0cHJlZmlsdGVyZWRyb3dtb2RlbClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBnZXRQcmVGaWx0ZXJlZFJvd01vZGVsOiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cblxuICAvLyBHbG9iYWwgRmlsdGVyc1xuICBfZ2V0R2xvYmFsRmFjZXRlZE1pbk1heFZhbHVlcz86ICgpID0+IHVuZGVmaW5lZCB8IFtudW1iZXIsIG51bWJlcl1cbiAgX2dldEdsb2JhbEZhY2V0ZWRSb3dNb2RlbD86ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICBfZ2V0R2xvYmFsRmFjZXRlZFVuaXF1ZVZhbHVlcz86ICgpID0+IE1hcDxhbnksIG51bWJlcj5cbiAgLyoqXG4gICAqIEN1cnJlbnRseSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBidWlsdC1pbiBgaW5jbHVkZXNTdHJpbmdgIGZpbHRlciBmdW5jdGlvbi4gSW4gZnV0dXJlIHJlbGVhc2VzLCBpdCBtYXkgcmV0dXJuIG1vcmUgZHluYW1pYyBmaWx0ZXIgZnVuY3Rpb25zIGJhc2VkIG9uIHRoZSBuYXR1cmUgb2YgdGhlIGRhdGEgcHJvdmlkZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNnZXRnbG9iYWxhdXRvZmlsdGVyZm4pXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgZ2V0R2xvYmFsQXV0b0ZpbHRlckZuOiAoKSA9PiBGaWx0ZXJGbjxURGF0YT4gfCB1bmRlZmluZWRcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZhY2V0ZWQgbWluIGFuZCBtYXggdmFsdWVzIGZvciB0aGUgZ2xvYmFsIGZpbHRlci5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dldGdsb2JhbGZhY2V0ZWRtaW5tYXh2YWx1ZXMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgZ2V0R2xvYmFsRmFjZXRlZE1pbk1heFZhbHVlczogKCkgPT4gdW5kZWZpbmVkIHwgW251bWJlciwgbnVtYmVyXVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93IG1vZGVsIGZvciB0aGUgdGFibGUgYWZ0ZXIgKipnbG9iYWwqKiBmaWx0ZXJpbmcgaGFzIGJlZW4gYXBwbGllZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dldGdsb2JhbGZhY2V0ZWRyb3dtb2RlbClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBnZXRHbG9iYWxGYWNldGVkUm93TW9kZWw6ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmFjZXRlZCB1bmlxdWUgdmFsdWVzIGZvciB0aGUgZ2xvYmFsIGZpbHRlci5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dldGdsb2JhbGZhY2V0ZWR1bmlxdWV2YWx1ZXMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgZ2V0R2xvYmFsRmFjZXRlZFVuaXF1ZVZhbHVlczogKCkgPT4gTWFwPGFueSwgbnVtYmVyPlxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmlsdGVyIGZ1bmN0aW9uIChlaXRoZXIgdXNlci1kZWZpbmVkIG9yIGF1dG9tYXRpYywgZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24pIGZvciB0aGUgZ2xvYmFsIGZpbHRlci5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dldGdsb2JhbGZpbHRlcmZuKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGdldEdsb2JhbEZpbHRlckZuOiAoKSA9PiBGaWx0ZXJGbjxURGF0YT4gfCB1bmRlZmluZWRcbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgKipnbG9iYWxGaWx0ZXIqKiBzdGF0ZSB0byBgaW5pdGlhbFN0YXRlLmdsb2JhbEZpbHRlcmAsIG9yIGB0cnVlYCBjYW4gYmUgcGFzc2VkIHRvIGZvcmNlIGEgZGVmYXVsdCBibGFuayBzdGF0ZSByZXNldCB0byBgdW5kZWZpbmVkYC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI3Jlc2V0Z2xvYmFsZmlsdGVyKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIHJlc2V0R2xvYmFsRmlsdGVyOiAoZGVmYXVsdFN0YXRlPzogYm9vbGVhbikgPT4gdm9pZFxuICAvKipcbiAgICogU2V0cyBvciB1cGRhdGVzIHRoZSBgc3RhdGUuZ2xvYmFsRmlsdGVyYCBzdGF0ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI3NldGdsb2JhbGZpbHRlcilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBzZXRHbG9iYWxGaWx0ZXI6ICh1cGRhdGVyOiBVcGRhdGVyPGFueT4pID0+IHZvaWRcbn1cblxuLy9cblxuZXhwb3J0IGNvbnN0IEZpbHRlcnM6IFRhYmxlRmVhdHVyZSA9IHtcbiAgZ2V0RGVmYXVsdENvbHVtbkRlZjogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oKTogRmlsdGVyc0NvbHVtbkRlZjxURGF0YT4gPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBmaWx0ZXJGbjogJ2F1dG8nLFxuICAgIH1cbiAgfSxcblxuICBnZXRJbml0aWFsU3RhdGU6IChzdGF0ZSk6IEZpbHRlcnNUYWJsZVN0YXRlID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uRmlsdGVyczogW10sXG4gICAgICBnbG9iYWxGaWx0ZXI6IHVuZGVmaW5lZCxcbiAgICAgIC8vIGZpbHRlcnNQcm9ncmVzczogMSxcbiAgICAgIC8vIGZhY2V0UHJvZ3Jlc3M6IHt9LFxuICAgICAgLi4uc3RhdGUsXG4gICAgfVxuICB9LFxuXG4gIGdldERlZmF1bHRPcHRpb25zOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgICB0YWJsZTogVGFibGU8VERhdGE+XG4gICk6IEZpbHRlcnNPcHRpb25zPFREYXRhPiA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uQ29sdW1uRmlsdGVyc0NoYW5nZTogbWFrZVN0YXRlVXBkYXRlcignY29sdW1uRmlsdGVycycsIHRhYmxlKSxcbiAgICAgIG9uR2xvYmFsRmlsdGVyQ2hhbmdlOiBtYWtlU3RhdGVVcGRhdGVyKCdnbG9iYWxGaWx0ZXInLCB0YWJsZSksXG4gICAgICBmaWx0ZXJGcm9tTGVhZlJvd3M6IGZhbHNlLFxuICAgICAgbWF4TGVhZlJvd0ZpbHRlckRlcHRoOiAxMDAsXG4gICAgICBnbG9iYWxGaWx0ZXJGbjogJ2F1dG8nLFxuICAgICAgZ2V0Q29sdW1uQ2FuR2xvYmFsRmlsdGVyOiBjb2x1bW4gPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRhYmxlXG4gICAgICAgICAgLmdldENvcmVSb3dNb2RlbCgpXG4gICAgICAgICAgLmZsYXRSb3dzWzBdPy5fZ2V0QWxsQ2VsbHNCeUNvbHVtbklkKClcbiAgICAgICAgICBbY29sdW1uLmlkXT8uZ2V0VmFsdWUoKVxuXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcidcbiAgICAgIH0sXG4gICAgfSBhcyBGaWx0ZXJzT3B0aW9uczxURGF0YT5cbiAgfSxcblxuICBjcmVhdGVDb2x1bW46IDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KFxuICAgIGNvbHVtbjogQ29sdW1uPFREYXRhLCB1bmtub3duPixcbiAgICB0YWJsZTogVGFibGU8VERhdGE+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbHVtbi5nZXRBdXRvRmlsdGVyRm4gPSAoKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdFJvdyA9IHRhYmxlLmdldENvcmVSb3dNb2RlbCgpLmZsYXRSb3dzWzBdXG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZmlyc3RSb3c/LmdldFZhbHVlKGNvbHVtbi5pZClcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlckZucy5pbmNsdWRlc1N0cmluZ1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gZmlsdGVyRm5zLmluTnVtYmVyUmFuZ2VcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJGbnMuZXF1YWxzXG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJGbnMuZXF1YWxzXG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmlsdGVyRm5zLmFyckluY2x1ZGVzXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWx0ZXJGbnMud2Vha0VxdWFsc1xuICAgIH1cbiAgICBjb2x1bW4uZ2V0RmlsdGVyRm4gPSAoKSA9PiB7XG4gICAgICByZXR1cm4gaXNGdW5jdGlvbihjb2x1bW4uY29sdW1uRGVmLmZpbHRlckZuKVxuICAgICAgICA/IGNvbHVtbi5jb2x1bW5EZWYuZmlsdGVyRm5cbiAgICAgICAgOiBjb2x1bW4uY29sdW1uRGVmLmZpbHRlckZuID09PSAnYXV0bydcbiAgICAgICAgPyBjb2x1bW4uZ2V0QXV0b0ZpbHRlckZuKClcbiAgICAgICAgOiAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgdGFibGUub3B0aW9ucy5maWx0ZXJGbnM/Lltjb2x1bW4uY29sdW1uRGVmLmZpbHRlckZuIGFzIHN0cmluZ10gPz9cbiAgICAgICAgICBmaWx0ZXJGbnNbY29sdW1uLmNvbHVtbkRlZi5maWx0ZXJGbiBhcyBCdWlsdEluRmlsdGVyRm5dXG4gICAgfVxuICAgIGNvbHVtbi5nZXRDYW5GaWx0ZXIgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoY29sdW1uLmNvbHVtbkRlZi5lbmFibGVDb2x1bW5GaWx0ZXIgPz8gdHJ1ZSkgJiZcbiAgICAgICAgKHRhYmxlLm9wdGlvbnMuZW5hYmxlQ29sdW1uRmlsdGVycyA/PyB0cnVlKSAmJlxuICAgICAgICAodGFibGUub3B0aW9ucy5lbmFibGVGaWx0ZXJzID8/IHRydWUpICYmXG4gICAgICAgICEhY29sdW1uLmFjY2Vzc29yRm5cbiAgICAgIClcbiAgICB9XG5cbiAgICBjb2x1bW4uZ2V0Q2FuR2xvYmFsRmlsdGVyID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGNvbHVtbi5jb2x1bW5EZWYuZW5hYmxlR2xvYmFsRmlsdGVyID8/IHRydWUpICYmXG4gICAgICAgICh0YWJsZS5vcHRpb25zLmVuYWJsZUdsb2JhbEZpbHRlciA/PyB0cnVlKSAmJlxuICAgICAgICAodGFibGUub3B0aW9ucy5lbmFibGVGaWx0ZXJzID8/IHRydWUpICYmXG4gICAgICAgICh0YWJsZS5vcHRpb25zLmdldENvbHVtbkNhbkdsb2JhbEZpbHRlcj8uKGNvbHVtbikgPz8gdHJ1ZSkgJiZcbiAgICAgICAgISFjb2x1bW4uYWNjZXNzb3JGblxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbHVtbi5nZXRJc0ZpbHRlcmVkID0gKCkgPT4gY29sdW1uLmdldEZpbHRlckluZGV4KCkgPiAtMVxuXG4gICAgY29sdW1uLmdldEZpbHRlclZhbHVlID0gKCkgPT5cbiAgICAgIHRhYmxlLmdldFN0YXRlKCkuY29sdW1uRmlsdGVycz8uZmluZChkID0+IGQuaWQgPT09IGNvbHVtbi5pZCk/LnZhbHVlXG5cbiAgICBjb2x1bW4uZ2V0RmlsdGVySW5kZXggPSAoKSA9PlxuICAgICAgdGFibGUuZ2V0U3RhdGUoKS5jb2x1bW5GaWx0ZXJzPy5maW5kSW5kZXgoZCA9PiBkLmlkID09PSBjb2x1bW4uaWQpID8/IC0xXG5cbiAgICBjb2x1bW4uc2V0RmlsdGVyVmFsdWUgPSB2YWx1ZSA9PiB7XG4gICAgICB0YWJsZS5zZXRDb2x1bW5GaWx0ZXJzKG9sZCA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlckZuID0gY29sdW1uLmdldEZpbHRlckZuKClcbiAgICAgICAgY29uc3QgcHJldmlvdXNmaWx0ZXIgPSBvbGQ/LmZpbmQoZCA9PiBkLmlkID09PSBjb2x1bW4uaWQpXG5cbiAgICAgICAgY29uc3QgbmV3RmlsdGVyID0gZnVuY3Rpb25hbFVwZGF0ZShcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBwcmV2aW91c2ZpbHRlciA/IHByZXZpb3VzZmlsdGVyLnZhbHVlIDogdW5kZWZpbmVkXG4gICAgICAgIClcblxuICAgICAgICAvL1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc2hvdWxkQXV0b1JlbW92ZUZpbHRlcihmaWx0ZXJGbiBhcyBGaWx0ZXJGbjxURGF0YT4sIG5ld0ZpbHRlciwgY29sdW1uKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gb2xkPy5maWx0ZXIoZCA9PiBkLmlkICE9PSBjb2x1bW4uaWQpID8/IFtdXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdGaWx0ZXJPYmogPSB7IGlkOiBjb2x1bW4uaWQsIHZhbHVlOiBuZXdGaWx0ZXIgfVxuXG4gICAgICAgIGlmIChwcmV2aW91c2ZpbHRlcikge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBvbGQ/Lm1hcChkID0+IHtcbiAgICAgICAgICAgICAgaWYgKGQuaWQgPT09IGNvbHVtbi5pZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXdGaWx0ZXJPYmpcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZFxuICAgICAgICAgICAgfSkgPz8gW11cbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2xkPy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gWy4uLm9sZCwgbmV3RmlsdGVyT2JqXVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtuZXdGaWx0ZXJPYmpdXG4gICAgICB9KVxuICAgIH1cbiAgICBjb2x1bW4uX2dldEZhY2V0ZWRSb3dNb2RlbCA9XG4gICAgICB0YWJsZS5vcHRpb25zLmdldEZhY2V0ZWRSb3dNb2RlbCAmJlxuICAgICAgdGFibGUub3B0aW9ucy5nZXRGYWNldGVkUm93TW9kZWwodGFibGUsIGNvbHVtbi5pZClcbiAgICBjb2x1bW4uZ2V0RmFjZXRlZFJvd01vZGVsID0gKCkgPT4ge1xuICAgICAgaWYgKCFjb2x1bW4uX2dldEZhY2V0ZWRSb3dNb2RlbCkge1xuICAgICAgICByZXR1cm4gdGFibGUuZ2V0UHJlRmlsdGVyZWRSb3dNb2RlbCgpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb2x1bW4uX2dldEZhY2V0ZWRSb3dNb2RlbCgpXG4gICAgfVxuICAgIGNvbHVtbi5fZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcyA9XG4gICAgICB0YWJsZS5vcHRpb25zLmdldEZhY2V0ZWRVbmlxdWVWYWx1ZXMgJiZcbiAgICAgIHRhYmxlLm9wdGlvbnMuZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcyh0YWJsZSwgY29sdW1uLmlkKVxuICAgIGNvbHVtbi5nZXRGYWNldGVkVW5pcXVlVmFsdWVzID0gKCkgPT4ge1xuICAgICAgaWYgKCFjb2x1bW4uX2dldEZhY2V0ZWRVbmlxdWVWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXAoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29sdW1uLl9nZXRGYWNldGVkVW5pcXVlVmFsdWVzKClcbiAgICB9XG4gICAgY29sdW1uLl9nZXRGYWNldGVkTWluTWF4VmFsdWVzID1cbiAgICAgIHRhYmxlLm9wdGlvbnMuZ2V0RmFjZXRlZE1pbk1heFZhbHVlcyAmJlxuICAgICAgdGFibGUub3B0aW9ucy5nZXRGYWNldGVkTWluTWF4VmFsdWVzKHRhYmxlLCBjb2x1bW4uaWQpXG4gICAgY29sdW1uLmdldEZhY2V0ZWRNaW5NYXhWYWx1ZXMgPSAoKSA9PiB7XG4gICAgICBpZiAoIWNvbHVtbi5fZ2V0RmFjZXRlZE1pbk1heFZhbHVlcykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb2x1bW4uX2dldEZhY2V0ZWRNaW5NYXhWYWx1ZXMoKVxuICAgIH1cbiAgICAvLyAoKSA9PiBbY29sdW1uLmdldEZhY2V0ZWRSb3dNb2RlbCgpXSxcbiAgICAvLyBmYWNldGVkUm93TW9kZWwgPT4gZ2V0Um93TW9kZWxNaW5NYXhWYWx1ZXMoZmFjZXRlZFJvd01vZGVsLCBjb2x1bW4uaWQpLFxuICB9LFxuXG4gIGNyZWF0ZVJvdzogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oXG4gICAgcm93OiBSb3c8VERhdGE+LFxuICAgIHRhYmxlOiBUYWJsZTxURGF0YT5cbiAgKTogdm9pZCA9PiB7XG4gICAgcm93LmNvbHVtbkZpbHRlcnMgPSB7fVxuICAgIHJvdy5jb2x1bW5GaWx0ZXJzTWV0YSA9IHt9XG4gIH0sXG5cbiAgY3JlYXRlVGFibGU6IDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KHRhYmxlOiBUYWJsZTxURGF0YT4pOiB2b2lkID0+IHtcbiAgICB0YWJsZS5nZXRHbG9iYWxBdXRvRmlsdGVyRm4gPSAoKSA9PiB7XG4gICAgICByZXR1cm4gZmlsdGVyRm5zLmluY2x1ZGVzU3RyaW5nXG4gICAgfVxuXG4gICAgdGFibGUuZ2V0R2xvYmFsRmlsdGVyRm4gPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdsb2JhbEZpbHRlckZuOiBnbG9iYWxGaWx0ZXJGbiB9ID0gdGFibGUub3B0aW9uc1xuXG4gICAgICByZXR1cm4gaXNGdW5jdGlvbihnbG9iYWxGaWx0ZXJGbilcbiAgICAgICAgPyBnbG9iYWxGaWx0ZXJGblxuICAgICAgICA6IGdsb2JhbEZpbHRlckZuID09PSAnYXV0bydcbiAgICAgICAgPyB0YWJsZS5nZXRHbG9iYWxBdXRvRmlsdGVyRm4oKVxuICAgICAgICA6IC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICB0YWJsZS5vcHRpb25zLmZpbHRlckZucz8uW2dsb2JhbEZpbHRlckZuIGFzIHN0cmluZ10gPz9cbiAgICAgICAgICBmaWx0ZXJGbnNbZ2xvYmFsRmlsdGVyRm4gYXMgQnVpbHRJbkZpbHRlckZuXVxuICAgIH1cblxuICAgIHRhYmxlLnNldENvbHVtbkZpbHRlcnMgPSAodXBkYXRlcjogVXBkYXRlcjxDb2x1bW5GaWx0ZXJzU3RhdGU+KSA9PiB7XG4gICAgICBjb25zdCBsZWFmQ29sdW1ucyA9IHRhYmxlLmdldEFsbExlYWZDb2x1bW5zKClcblxuICAgICAgY29uc3QgdXBkYXRlRm4gPSAob2xkOiBDb2x1bW5GaWx0ZXJzU3RhdGUpID0+IHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uYWxVcGRhdGUodXBkYXRlciwgb2xkKT8uZmlsdGVyKGZpbHRlciA9PiB7XG4gICAgICAgICAgY29uc3QgY29sdW1uID0gbGVhZkNvbHVtbnMuZmluZChkID0+IGQuaWQgPT09IGZpbHRlci5pZClcblxuICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckZuID0gY29sdW1uLmdldEZpbHRlckZuKClcblxuICAgICAgICAgICAgaWYgKHNob3VsZEF1dG9SZW1vdmVGaWx0ZXIoZmlsdGVyRm4sIGZpbHRlci52YWx1ZSwgY29sdW1uKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICB0YWJsZS5vcHRpb25zLm9uQ29sdW1uRmlsdGVyc0NoYW5nZT8uKHVwZGF0ZUZuKVxuICAgIH1cblxuICAgIHRhYmxlLnNldEdsb2JhbEZpbHRlciA9IHVwZGF0ZXIgPT4ge1xuICAgICAgdGFibGUub3B0aW9ucy5vbkdsb2JhbEZpbHRlckNoYW5nZT8uKHVwZGF0ZXIpXG4gICAgfVxuXG4gICAgdGFibGUucmVzZXRHbG9iYWxGaWx0ZXIgPSBkZWZhdWx0U3RhdGUgPT4ge1xuICAgICAgdGFibGUuc2V0R2xvYmFsRmlsdGVyKFxuICAgICAgICBkZWZhdWx0U3RhdGUgPyB1bmRlZmluZWQgOiB0YWJsZS5pbml0aWFsU3RhdGUuZ2xvYmFsRmlsdGVyXG4gICAgICApXG4gICAgfVxuXG4gICAgdGFibGUucmVzZXRDb2x1bW5GaWx0ZXJzID0gZGVmYXVsdFN0YXRlID0+IHtcbiAgICAgIHRhYmxlLnNldENvbHVtbkZpbHRlcnMoXG4gICAgICAgIGRlZmF1bHRTdGF0ZSA/IFtdIDogdGFibGUuaW5pdGlhbFN0YXRlPy5jb2x1bW5GaWx0ZXJzID8/IFtdXG4gICAgICApXG4gICAgfVxuXG4gICAgdGFibGUuZ2V0UHJlRmlsdGVyZWRSb3dNb2RlbCA9ICgpID0+IHRhYmxlLmdldENvcmVSb3dNb2RlbCgpXG4gICAgdGFibGUuZ2V0RmlsdGVyZWRSb3dNb2RlbCA9ICgpID0+IHtcbiAgICAgIGlmICghdGFibGUuX2dldEZpbHRlcmVkUm93TW9kZWwgJiYgdGFibGUub3B0aW9ucy5nZXRGaWx0ZXJlZFJvd01vZGVsKSB7XG4gICAgICAgIHRhYmxlLl9nZXRGaWx0ZXJlZFJvd01vZGVsID0gdGFibGUub3B0aW9ucy5nZXRGaWx0ZXJlZFJvd01vZGVsKHRhYmxlKVxuICAgICAgfVxuXG4gICAgICBpZiAodGFibGUub3B0aW9ucy5tYW51YWxGaWx0ZXJpbmcgfHwgIXRhYmxlLl9nZXRGaWx0ZXJlZFJvd01vZGVsKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS5nZXRQcmVGaWx0ZXJlZFJvd01vZGVsKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlLl9nZXRGaWx0ZXJlZFJvd01vZGVsKClcbiAgICB9XG5cbiAgICB0YWJsZS5fZ2V0R2xvYmFsRmFjZXRlZFJvd01vZGVsID1cbiAgICAgIHRhYmxlLm9wdGlvbnMuZ2V0RmFjZXRlZFJvd01vZGVsICYmXG4gICAgICB0YWJsZS5vcHRpb25zLmdldEZhY2V0ZWRSb3dNb2RlbCh0YWJsZSwgJ19fZ2xvYmFsX18nKVxuXG4gICAgdGFibGUuZ2V0R2xvYmFsRmFjZXRlZFJvd01vZGVsID0gKCkgPT4ge1xuICAgICAgaWYgKHRhYmxlLm9wdGlvbnMubWFudWFsRmlsdGVyaW5nIHx8ICF0YWJsZS5fZ2V0R2xvYmFsRmFjZXRlZFJvd01vZGVsKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS5nZXRQcmVGaWx0ZXJlZFJvd01vZGVsKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlLl9nZXRHbG9iYWxGYWNldGVkUm93TW9kZWwoKVxuICAgIH1cblxuICAgIHRhYmxlLl9nZXRHbG9iYWxGYWNldGVkVW5pcXVlVmFsdWVzID1cbiAgICAgIHRhYmxlLm9wdGlvbnMuZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcyAmJlxuICAgICAgdGFibGUub3B0aW9ucy5nZXRGYWNldGVkVW5pcXVlVmFsdWVzKHRhYmxlLCAnX19nbG9iYWxfXycpXG4gICAgdGFibGUuZ2V0R2xvYmFsRmFjZXRlZFVuaXF1ZVZhbHVlcyA9ICgpID0+IHtcbiAgICAgIGlmICghdGFibGUuX2dldEdsb2JhbEZhY2V0ZWRVbmlxdWVWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXAoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFibGUuX2dldEdsb2JhbEZhY2V0ZWRVbmlxdWVWYWx1ZXMoKVxuICAgIH1cblxuICAgIHRhYmxlLl9nZXRHbG9iYWxGYWNldGVkTWluTWF4VmFsdWVzID1cbiAgICAgIHRhYmxlLm9wdGlvbnMuZ2V0RmFjZXRlZE1pbk1heFZhbHVlcyAmJlxuICAgICAgdGFibGUub3B0aW9ucy5nZXRGYWNldGVkTWluTWF4VmFsdWVzKHRhYmxlLCAnX19nbG9iYWxfXycpXG4gICAgdGFibGUuZ2V0R2xvYmFsRmFjZXRlZE1pbk1heFZhbHVlcyA9ICgpID0+IHtcbiAgICAgIGlmICghdGFibGUuX2dldEdsb2JhbEZhY2V0ZWRNaW5NYXhWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZS5fZ2V0R2xvYmFsRmFjZXRlZE1pbk1heFZhbHVlcygpXG4gICAgfVxuICB9LFxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkQXV0b1JlbW92ZUZpbHRlcjxURGF0YSBleHRlbmRzIFJvd0RhdGE+KFxuICBmaWx0ZXJGbj86IEZpbHRlckZuPFREYXRhPixcbiAgdmFsdWU/OiBhbnksXG4gIGNvbHVtbj86IENvbHVtbjxURGF0YSwgdW5rbm93bj5cbikge1xuICByZXR1cm4gKFxuICAgIChmaWx0ZXJGbiAmJiBmaWx0ZXJGbi5hdXRvUmVtb3ZlXG4gICAgICA/IGZpbHRlckZuLmF1dG9SZW1vdmUodmFsdWUsIGNvbHVtbilcbiAgICAgIDogZmFsc2UpIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fFxuICAgICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICF2YWx1ZSlcbiAgKVxufVxuIiwiaW1wb3J0IHsgQWdncmVnYXRpb25GbiB9IGZyb20gJy4vZmVhdHVyZXMvR3JvdXBpbmcnXG5pbXBvcnQgeyBpc051bWJlckFycmF5IH0gZnJvbSAnLi91dGlscydcblxuY29uc3Qgc3VtOiBBZ2dyZWdhdGlvbkZuPGFueT4gPSAoY29sdW1uSWQsIF9sZWFmUm93cywgY2hpbGRSb3dzKSA9PiB7XG4gIC8vIEl0J3MgZmFzdGVyIHRvIGp1c3QgYWRkIHRoZSBhZ2dyZWdhdGlvbnMgdG9nZXRoZXIgaW5zdGVhZCBvZlxuICAvLyBwcm9jZXNzIGxlYWYgbm9kZXMgaW5kaXZpZHVhbGx5XG4gIHJldHVybiBjaGlsZFJvd3MucmVkdWNlKChzdW0sIG5leHQpID0+IHtcbiAgICBjb25zdCBuZXh0VmFsdWUgPSBuZXh0LmdldFZhbHVlKGNvbHVtbklkKVxuICAgIHJldHVybiBzdW0gKyAodHlwZW9mIG5leHRWYWx1ZSA9PT0gJ251bWJlcicgPyBuZXh0VmFsdWUgOiAwKVxuICB9LCAwKVxufVxuXG5jb25zdCBtaW46IEFnZ3JlZ2F0aW9uRm48YW55PiA9IChjb2x1bW5JZCwgX2xlYWZSb3dzLCBjaGlsZFJvd3MpID0+IHtcbiAgbGV0IG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkXG5cbiAgY2hpbGRSb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHJvdy5nZXRWYWx1ZTxudW1iZXI+KGNvbHVtbklkKVxuXG4gICAgaWYgKFxuICAgICAgdmFsdWUgIT0gbnVsbCAmJlxuICAgICAgKG1pbiEgPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKVxuICAgICkge1xuICAgICAgbWluID0gdmFsdWVcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIG1pblxufVxuXG5jb25zdCBtYXg6IEFnZ3JlZ2F0aW9uRm48YW55PiA9IChjb2x1bW5JZCwgX2xlYWZSb3dzLCBjaGlsZFJvd3MpID0+IHtcbiAgbGV0IG1heDogbnVtYmVyIHwgdW5kZWZpbmVkXG5cbiAgY2hpbGRSb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHJvdy5nZXRWYWx1ZTxudW1iZXI+KGNvbHVtbklkKVxuICAgIGlmIChcbiAgICAgIHZhbHVlICE9IG51bGwgJiZcbiAgICAgIChtYXghIDwgdmFsdWUgfHwgKG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSlcbiAgICApIHtcbiAgICAgIG1heCA9IHZhbHVlXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBtYXhcbn1cblxuY29uc3QgZXh0ZW50OiBBZ2dyZWdhdGlvbkZuPGFueT4gPSAoY29sdW1uSWQsIF9sZWFmUm93cywgY2hpbGRSb3dzKSA9PiB7XG4gIGxldCBtaW46IG51bWJlciB8IHVuZGVmaW5lZFxuICBsZXQgbWF4OiBudW1iZXIgfCB1bmRlZmluZWRcblxuICBjaGlsZFJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gcm93LmdldFZhbHVlPG51bWJlcj4oY29sdW1uSWQpXG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmIChtaW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodmFsdWUgPj0gdmFsdWUpIG1pbiA9IG1heCA9IHZhbHVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobWluID4gdmFsdWUpIG1pbiA9IHZhbHVlXG4gICAgICAgIGlmIChtYXghIDwgdmFsdWUpIG1heCA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBbbWluLCBtYXhdXG59XG5cbmNvbnN0IG1lYW46IEFnZ3JlZ2F0aW9uRm48YW55PiA9IChjb2x1bW5JZCwgbGVhZlJvd3MpID0+IHtcbiAgbGV0IGNvdW50ID0gMFxuICBsZXQgc3VtID0gMFxuXG4gIGxlYWZSb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICBsZXQgdmFsdWUgPSByb3cuZ2V0VmFsdWU8bnVtYmVyPihjb2x1bW5JZClcbiAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICArK2NvdW50LCAoc3VtICs9IHZhbHVlKVxuICAgIH1cbiAgfSlcblxuICBpZiAoY291bnQpIHJldHVybiBzdW0gLyBjb3VudFxuXG4gIHJldHVyblxufVxuXG5jb25zdCBtZWRpYW46IEFnZ3JlZ2F0aW9uRm48YW55PiA9IChjb2x1bW5JZCwgbGVhZlJvd3MpID0+IHtcbiAgaWYgKCFsZWFmUm93cy5sZW5ndGgpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHZhbHVlcyA9IGxlYWZSb3dzLm1hcChyb3cgPT4gcm93LmdldFZhbHVlKGNvbHVtbklkKSlcbiAgaWYgKCFpc051bWJlckFycmF5KHZhbHVlcykpIHtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB2YWx1ZXNbMF1cbiAgfVxuXG4gIGNvbnN0IG1pZCA9IE1hdGguZmxvb3IodmFsdWVzLmxlbmd0aCAvIDIpXG4gIGNvbnN0IG51bXMgPSB2YWx1ZXMuc29ydCgoYSwgYikgPT4gYSAtIGIpXG4gIHJldHVybiB2YWx1ZXMubGVuZ3RoICUgMiAhPT0gMCA/IG51bXNbbWlkXSA6IChudW1zW21pZCAtIDFdISArIG51bXNbbWlkXSEpIC8gMlxufVxuXG5jb25zdCB1bmlxdWU6IEFnZ3JlZ2F0aW9uRm48YW55PiA9IChjb2x1bW5JZCwgbGVhZlJvd3MpID0+IHtcbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChsZWFmUm93cy5tYXAoZCA9PiBkLmdldFZhbHVlKGNvbHVtbklkKSkpLnZhbHVlcygpKVxufVxuXG5jb25zdCB1bmlxdWVDb3VudDogQWdncmVnYXRpb25Gbjxhbnk+ID0gKGNvbHVtbklkLCBsZWFmUm93cykgPT4ge1xuICByZXR1cm4gbmV3IFNldChsZWFmUm93cy5tYXAoZCA9PiBkLmdldFZhbHVlKGNvbHVtbklkKSkpLnNpemVcbn1cblxuY29uc3QgY291bnQ6IEFnZ3JlZ2F0aW9uRm48YW55PiA9IChfY29sdW1uSWQsIGxlYWZSb3dzKSA9PiB7XG4gIHJldHVybiBsZWFmUm93cy5sZW5ndGhcbn1cblxuZXhwb3J0IGNvbnN0IGFnZ3JlZ2F0aW9uRm5zID0ge1xuICBzdW0sXG4gIG1pbixcbiAgbWF4LFxuICBleHRlbnQsXG4gIG1lYW4sXG4gIG1lZGlhbixcbiAgdW5pcXVlLFxuICB1bmlxdWVDb3VudCxcbiAgY291bnQsXG59XG5cbmV4cG9ydCB0eXBlIEJ1aWx0SW5BZ2dyZWdhdGlvbkZuID0ga2V5b2YgdHlwZW9mIGFnZ3JlZ2F0aW9uRm5zXG4iLCJpbXBvcnQgeyBSb3dNb2RlbCB9IGZyb20gJy4uJ1xuaW1wb3J0IHsgQnVpbHRJbkFnZ3JlZ2F0aW9uRm4sIGFnZ3JlZ2F0aW9uRm5zIH0gZnJvbSAnLi4vYWdncmVnYXRpb25GbnMnXG5pbXBvcnQgeyBUYWJsZUZlYXR1cmUgfSBmcm9tICcuLi9jb3JlL3RhYmxlJ1xuaW1wb3J0IHtcbiAgQ2VsbCxcbiAgQ29sdW1uLFxuICBPbkNoYW5nZUZuLFxuICBUYWJsZSxcbiAgUm93LFxuICBVcGRhdGVyLFxuICBDb2x1bW5EZWZUZW1wbGF0ZSxcbiAgUm93RGF0YSxcbiAgQWdncmVnYXRpb25GbnMsXG59IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgaXNGdW5jdGlvbiwgbWFrZVN0YXRlVXBkYXRlciB9IGZyb20gJy4uL3V0aWxzJ1xuXG5leHBvcnQgdHlwZSBHcm91cGluZ1N0YXRlID0gc3RyaW5nW11cblxuZXhwb3J0IGludGVyZmFjZSBHcm91cGluZ1RhYmxlU3RhdGUge1xuICBncm91cGluZzogR3JvdXBpbmdTdGF0ZVxufVxuXG5leHBvcnQgdHlwZSBBZ2dyZWdhdGlvbkZuPFREYXRhIGV4dGVuZHMgUm93RGF0YT4gPSAoXG4gIGNvbHVtbklkOiBzdHJpbmcsXG4gIGxlYWZSb3dzOiBSb3c8VERhdGE+W10sXG4gIGNoaWxkUm93czogUm93PFREYXRhPltdXG4pID0+IGFueVxuXG5leHBvcnQgdHlwZSBDdXN0b21BZ2dyZWdhdGlvbkZucyA9IFJlY29yZDxzdHJpbmcsIEFnZ3JlZ2F0aW9uRm48YW55Pj5cblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25Gbk9wdGlvbjxURGF0YSBleHRlbmRzIFJvd0RhdGE+ID1cbiAgfCAnYXV0bydcbiAgfCBrZXlvZiBBZ2dyZWdhdGlvbkZuc1xuICB8IEJ1aWx0SW5BZ2dyZWdhdGlvbkZuXG4gIHwgQWdncmVnYXRpb25GbjxURGF0YT5cblxuZXhwb3J0IGludGVyZmFjZSBHcm91cGluZ0NvbHVtbkRlZjxURGF0YSBleHRlbmRzIFJvd0RhdGEsIFRWYWx1ZT4ge1xuICAvKipcbiAgICogVGhlIGNlbGwgdG8gZGlzcGxheSBlYWNoIHJvdyBmb3IgdGhlIGNvbHVtbiBpZiB0aGUgY2VsbCBpcyBhbiBhZ2dyZWdhdGUuIElmIGEgZnVuY3Rpb24gaXMgcGFzc2VkLCBpdCB3aWxsIGJlIHBhc3NlZCBhIHByb3BzIG9iamVjdCB3aXRoIHRoZSBjb250ZXh0IG9mIHRoZSBjZWxsIGFuZCBzaG91bGQgcmV0dXJuIHRoZSBwcm9wZXJ0eSB0eXBlIGZvciB5b3VyIGFkYXB0ZXIgKHRoZSBleGFjdCB0eXBlIGRlcGVuZHMgb24gdGhlIGFkYXB0ZXIgYmVpbmcgdXNlZCkuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZ3JvdXBpbmcjYWdncmVnYXRlZGNlbGwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIGFnZ3JlZ2F0ZWRDZWxsPzogQ29sdW1uRGVmVGVtcGxhdGU8XG4gICAgUmV0dXJuVHlwZTxDZWxsPFREYXRhLCBUVmFsdWU+WydnZXRDb250ZXh0J10+XG4gID5cbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCBhZ2dyZWdhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGNvbHVtbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9ncm91cGluZyNhZ2dyZWdhdGlvbmZuKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICBhZ2dyZWdhdGlvbkZuPzogQWdncmVnYXRpb25Gbk9wdGlvbjxURGF0YT5cbiAgLyoqXG4gICAqIEVuYWJsZXMvZGlzYWJsZXMgZ3JvdXBpbmcgZm9yIHRoaXMgY29sdW1uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI2VuYWJsZWdyb3VwaW5nKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICBlbmFibGVHcm91cGluZz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSB2YWx1ZSB0byBiZSB1c2VkIGZvciBncm91cGluZyByb3dzIG9uIHRoaXMgY29sdW1uLiBJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgdmFsdWUgZGVyaXZlZCBmcm9tIGBhY2Nlc3NvcktleWAgLyBgYWNjZXNzb3JGbmAgd2lsbCBiZSB1c2VkIGluc3RlYWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZ3JvdXBpbmcjZ2V0Z3JvdXBpbmd2YWx1ZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2dyb3VwaW5nKVxuICAgKi9cbiAgZ2V0R3JvdXBpbmdWYWx1ZT86IChyb3c6IFREYXRhKSA9PiBhbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcm91cGluZ0NvbHVtbjxURGF0YSBleHRlbmRzIFJvd0RhdGE+IHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgY29sdW1uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI2dldGFnZ3JlZ2F0aW9uZm4pXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIGdldEFnZ3JlZ2F0aW9uRm46ICgpID0+IEFnZ3JlZ2F0aW9uRm48VERhdGE+IHwgdW5kZWZpbmVkXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhdXRvbWF0aWNhbGx5IGluZmVycmVkIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgY29sdW1uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI2dldGF1dG9hZ2dyZWdhdGlvbmZuKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICBnZXRBdXRvQWdncmVnYXRpb25GbjogKCkgPT4gQWdncmVnYXRpb25GbjxURGF0YT4gfCB1bmRlZmluZWRcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNvbHVtbiBjYW4gYmUgZ3JvdXBlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9ncm91cGluZyNnZXRjYW5ncm91cClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2dyb3VwaW5nKVxuICAgKi9cbiAgZ2V0Q2FuR3JvdXA6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gaW4gdGhlIGdyb3VwaW5nIHN0YXRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI2dldGdyb3VwZWRpbmRleClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2dyb3VwaW5nKVxuICAgKi9cbiAgZ2V0R3JvdXBlZEluZGV4OiAoKSA9PiBudW1iZXJcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNvbHVtbiBpcyBjdXJyZW50bHkgZ3JvdXBlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9ncm91cGluZyNnZXRpc2dyb3VwZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIGdldElzR3JvdXBlZDogKCkgPT4gYm9vbGVhblxuICAvKipcbiAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdG9nZ2xlcyB0aGUgZ3JvdXBpbmcgc3RhdGUgb2YgdGhlIGNvbHVtbi4gVGhpcyBpcyB1c2VmdWwgZm9yIHBhc3NpbmcgdG8gdGhlIGBvbkNsaWNrYCBwcm9wIG9mIGEgYnV0dG9uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI2dldHRvZ2dsZWdyb3VwaW5naGFuZGxlcilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2dyb3VwaW5nKVxuICAgKi9cbiAgZ2V0VG9nZ2xlR3JvdXBpbmdIYW5kbGVyOiAoKSA9PiAoKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBncm91cGluZyBzdGF0ZSBvZiB0aGUgY29sdW1uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI3RvZ2dsZWdyb3VwaW5nKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICB0b2dnbGVHcm91cGluZzogKCkgPT4gdm9pZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyb3VwaW5nUm93IHtcbiAgX2dyb3VwaW5nVmFsdWVzQ2FjaGU6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGdyb3VwaW5nIHZhbHVlIGZvciBhbnkgcm93IGFuZCBjb2x1bW4gKGluY2x1ZGluZyBsZWFmIHJvd3MpLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI2dldGdyb3VwaW5ndmFsdWUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIGdldEdyb3VwaW5nVmFsdWU6IChjb2x1bW5JZDogc3RyaW5nKSA9PiB1bmtub3duXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSByb3cgaXMgY3VycmVudGx5IGdyb3VwZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZ3JvdXBpbmcjZ2V0aXNncm91cGVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICBnZXRJc0dyb3VwZWQ6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIElmIHRoaXMgcm93IGlzIGdyb3VwZWQsIHRoaXMgaXMgdGhlIGlkIG9mIHRoZSBjb2x1bW4gdGhhdCB0aGlzIHJvdyBpcyBncm91cGVkIGJ5LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI2dyb3VwaW5nY29sdW1uaWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIGdyb3VwaW5nQ29sdW1uSWQ/OiBzdHJpbmdcbiAgLyoqXG4gICAqIElmIHRoaXMgcm93IGlzIGdyb3VwZWQsIHRoaXMgaXMgdGhlIHVuaXF1ZS9zaGFyZWQgdmFsdWUgZm9yIHRoZSBgZ3JvdXBpbmdDb2x1bW5JZGAgZm9yIGFsbCBvZiB0aGUgcm93cyBpbiB0aGlzIGdyb3VwLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI2dyb3VwaW5ndmFsdWUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIGdyb3VwaW5nVmFsdWU/OiB1bmtub3duXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JvdXBpbmdDZWxsIHtcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNlbGwgaXMgY3VycmVudGx5IGFnZ3JlZ2F0ZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZ3JvdXBpbmcjZ2V0aXNhZ2dyZWdhdGVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICBnZXRJc0FnZ3JlZ2F0ZWQ6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNlbGwgaXMgY3VycmVudGx5IGdyb3VwZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZ3JvdXBpbmcjZ2V0aXNncm91cGVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICBnZXRJc0dyb3VwZWQ6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNlbGwgaXMgY3VycmVudGx5IGEgcGxhY2Vob2xkZXIgY2VsbC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9ncm91cGluZyNnZXRpc3BsYWNlaG9sZGVyKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICBnZXRJc1BsYWNlaG9sZGVyOiAoKSA9PiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uRGVmYXVsdE9wdGlvbnMge1xuICBlbmFibGVHcm91cGluZzogYm9vbGVhblxuICBvbkdyb3VwaW5nQ2hhbmdlOiBPbkNoYW5nZUZuPEdyb3VwaW5nU3RhdGU+XG59XG5cbmludGVyZmFjZSBHcm91cGluZ09wdGlvbnNCYXNlIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMvZGlzYWJsZXMgZ3JvdXBpbmcgZm9yIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9ncm91cGluZyNlbmFibGVncm91cGluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2dyb3VwaW5nKVxuICAgKi9cbiAgZW5hYmxlR3JvdXBpbmc/OiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByb3cgbW9kZWwgYWZ0ZXIgZ3JvdXBpbmcgaGFzIHRha2VuIHBsYWNlLCBidXQgbm8gZnVydGhlci5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9ncm91cGluZyNnZXRncm91cGVkcm93bW9kZWwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIGdldEdyb3VwZWRSb3dNb2RlbD86ICh0YWJsZTogVGFibGU8YW55PikgPT4gKCkgPT4gUm93TW9kZWw8YW55PlxuICAvKipcbiAgICogR3JvdXBpbmcgY29sdW1ucyBhcmUgYXV0b21hdGljYWxseSByZW9yZGVyZWQgYnkgZGVmYXVsdCB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbHVtbnMgbGlzdC4gSWYgeW91IHdvdWxkIHJhdGhlciByZW1vdmUgdGhlbSBvciBsZWF2ZSB0aGVtIGFzLWlzLCBzZXQgdGhlIGFwcHJvcHJpYXRlIG1vZGUgaGVyZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9ncm91cGluZyNncm91cGVkY29sdW1ubW9kZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2dyb3VwaW5nKVxuICAgKi9cbiAgZ3JvdXBlZENvbHVtbk1vZGU/OiBmYWxzZSB8ICdyZW9yZGVyJyB8ICdyZW1vdmUnXG4gIC8qKlxuICAgKiBFbmFibGVzIG1hbnVhbCBncm91cGluZy4gSWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIGB0cnVlYCwgdGhlIHRhYmxlIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgZ3JvdXAgcm93cyB1c2luZyBgZ2V0R3JvdXBlZFJvd01vZGVsKClgIGFuZCBpbnN0ZWFkIHdpbGwgZXhwZWN0IHlvdSB0byBtYW51YWxseSBncm91cCB0aGUgcm93cyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSB0YWJsZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGFyZSBkb2luZyBzZXJ2ZXItc2lkZSBncm91cGluZyBhbmQgYWdncmVnYXRpb24uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZ3JvdXBpbmcjbWFudWFsZ3JvdXBpbmcpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIG1hbnVhbEdyb3VwaW5nPzogYm9vbGVhblxuICAvKipcbiAgICogSWYgdGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgZ3JvdXBpbmcgc3RhdGUgY2hhbmdlcyBhbmQgeW91IHdpbGwgYmUgZXhwZWN0ZWQgdG8gbWFuYWdlIHRoZSBzdGF0ZSB5b3Vyc2VsZi4gWW91IGNhbiBwYXNzIHRoZSBtYW5hZ2VkIHN0YXRlIGJhY2sgdG8gdGhlIHRhYmxlIHZpYSB0aGUgYHRhYmxlT3B0aW9ucy5zdGF0ZS5ncm91cGluZ2Agb3B0aW9uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI29uZ3JvdXBpbmdjaGFuZ2UpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIG9uR3JvdXBpbmdDaGFuZ2U/OiBPbkNoYW5nZUZuPEdyb3VwaW5nU3RhdGU+XG59XG5cbnR5cGUgUmVzb2x2ZWRBZ2dyZWdhdGlvbkZucyA9IGtleW9mIEFnZ3JlZ2F0aW9uRm5zIGV4dGVuZHMgbmV2ZXJcbiAgPyB7XG4gICAgICBhZ2dyZWdhdGlvbkZucz86IFJlY29yZDxzdHJpbmcsIEFnZ3JlZ2F0aW9uRm48YW55Pj5cbiAgICB9XG4gIDoge1xuICAgICAgYWdncmVnYXRpb25GbnM6IFJlY29yZDxrZXlvZiBBZ2dyZWdhdGlvbkZucywgQWdncmVnYXRpb25Gbjxhbnk+PlxuICAgIH1cblxuZXhwb3J0IGludGVyZmFjZSBHcm91cGluZ09wdGlvbnNcbiAgZXh0ZW5kcyBHcm91cGluZ09wdGlvbnNCYXNlLFxuICAgIFJlc29sdmVkQWdncmVnYXRpb25GbnMge31cblxuZXhwb3J0IHR5cGUgR3JvdXBpbmdDb2x1bW5Nb2RlID0gZmFsc2UgfCAncmVvcmRlcicgfCAncmVtb3ZlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEdyb3VwaW5nSW5zdGFuY2U8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiB7XG4gIF9nZXRHcm91cGVkUm93TW9kZWw/OiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJvdyBtb2RlbCBmb3IgdGhlIHRhYmxlIGFmdGVyIGdyb3VwaW5nIGhhcyBiZWVuIGFwcGxpZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZ3JvdXBpbmcjZ2V0Z3JvdXBlZHJvd21vZGVsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICBnZXRHcm91cGVkUm93TW9kZWw6ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93IG1vZGVsIGZvciB0aGUgdGFibGUgYmVmb3JlIGFueSBncm91cGluZyBoYXMgYmVlbiBhcHBsaWVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI2dldHByZWdyb3VwZWRyb3dtb2RlbClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2dyb3VwaW5nKVxuICAgKi9cbiAgZ2V0UHJlR3JvdXBlZFJvd01vZGVsOiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgKipncm91cGluZyoqIHN0YXRlIHRvIGBpbml0aWFsU3RhdGUuZ3JvdXBpbmdgLCBvciBgdHJ1ZWAgY2FuIGJlIHBhc3NlZCB0byBmb3JjZSBhIGRlZmF1bHQgYmxhbmsgc3RhdGUgcmVzZXQgdG8gYFtdYC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9ncm91cGluZyNyZXNldGdyb3VwaW5nKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICByZXNldEdyb3VwaW5nOiAoZGVmYXVsdFN0YXRlPzogYm9vbGVhbikgPT4gdm9pZFxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZ3JvdXBpbmcgc3RhdGUgb2YgdGhlIHRhYmxlIHZpYSBhbiB1cGRhdGUgZnVuY3Rpb24gb3IgdmFsdWUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZ3JvdXBpbmcjc2V0Z3JvdXBpbmcpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIHNldEdyb3VwaW5nOiAodXBkYXRlcjogVXBkYXRlcjxHcm91cGluZ1N0YXRlPikgPT4gdm9pZFxufVxuXG4vL1xuXG5leHBvcnQgY29uc3QgR3JvdXBpbmc6IFRhYmxlRmVhdHVyZSA9IHtcbiAgZ2V0RGVmYXVsdENvbHVtbkRlZjogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oKTogR3JvdXBpbmdDb2x1bW5EZWY8XG4gICAgVERhdGEsXG4gICAgdW5rbm93blxuICA+ID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYWdncmVnYXRlZENlbGw6IHByb3BzID0+IChwcm9wcy5nZXRWYWx1ZSgpIGFzIGFueSk/LnRvU3RyaW5nPy4oKSA/PyBudWxsLFxuICAgICAgYWdncmVnYXRpb25GbjogJ2F1dG8nLFxuICAgIH1cbiAgfSxcblxuICBnZXRJbml0aWFsU3RhdGU6IChzdGF0ZSk6IEdyb3VwaW5nVGFibGVTdGF0ZSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdyb3VwaW5nOiBbXSxcbiAgICAgIC4uLnN0YXRlLFxuICAgIH1cbiAgfSxcblxuICBnZXREZWZhdWx0T3B0aW9uczogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiBHcm91cGluZ09wdGlvbnMgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBvbkdyb3VwaW5nQ2hhbmdlOiBtYWtlU3RhdGVVcGRhdGVyKCdncm91cGluZycsIHRhYmxlKSxcbiAgICAgIGdyb3VwZWRDb2x1bW5Nb2RlOiAncmVvcmRlcicsXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZUNvbHVtbjogPFREYXRhIGV4dGVuZHMgUm93RGF0YSwgVFZhbHVlPihcbiAgICBjb2x1bW46IENvbHVtbjxURGF0YSwgVFZhbHVlPixcbiAgICB0YWJsZTogVGFibGU8VERhdGE+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbHVtbi50b2dnbGVHcm91cGluZyA9ICgpID0+IHtcbiAgICAgIHRhYmxlLnNldEdyb3VwaW5nKG9sZCA9PiB7XG4gICAgICAgIC8vIEZpbmQgYW55IGV4aXN0aW5nIGdyb3VwaW5nIGZvciB0aGlzIGNvbHVtblxuICAgICAgICBpZiAob2xkPy5pbmNsdWRlcyhjb2x1bW4uaWQpKSB7XG4gICAgICAgICAgcmV0dXJuIG9sZC5maWx0ZXIoZCA9PiBkICE9PSBjb2x1bW4uaWQpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gWy4uLihvbGQgPz8gW10pLCBjb2x1bW4uaWRdXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbHVtbi5nZXRDYW5Hcm91cCA9ICgpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbHVtbi5jb2x1bW5EZWYuZW5hYmxlR3JvdXBpbmcgPz9cbiAgICAgICAgdHJ1ZSA/P1xuICAgICAgICB0YWJsZS5vcHRpb25zLmVuYWJsZUdyb3VwaW5nID8/XG4gICAgICAgIHRydWUgPz9cbiAgICAgICAgISFjb2x1bW4uYWNjZXNzb3JGblxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbHVtbi5nZXRJc0dyb3VwZWQgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gdGFibGUuZ2V0U3RhdGUoKS5ncm91cGluZz8uaW5jbHVkZXMoY29sdW1uLmlkKVxuICAgIH1cblxuICAgIGNvbHVtbi5nZXRHcm91cGVkSW5kZXggPSAoKSA9PiB0YWJsZS5nZXRTdGF0ZSgpLmdyb3VwaW5nPy5pbmRleE9mKGNvbHVtbi5pZClcblxuICAgIGNvbHVtbi5nZXRUb2dnbGVHcm91cGluZ0hhbmRsZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjYW5Hcm91cCA9IGNvbHVtbi5nZXRDYW5Hcm91cCgpXG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmICghY2FuR3JvdXApIHJldHVyblxuICAgICAgICBjb2x1bW4udG9nZ2xlR3JvdXBpbmcoKVxuICAgICAgfVxuICAgIH1cbiAgICBjb2x1bW4uZ2V0QXV0b0FnZ3JlZ2F0aW9uRm4gPSAoKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdFJvdyA9IHRhYmxlLmdldENvcmVSb3dNb2RlbCgpLmZsYXRSb3dzWzBdXG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZmlyc3RSb3c/LmdldFZhbHVlKGNvbHVtbi5pZClcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIGFnZ3JlZ2F0aW9uRm5zLnN1bVxuICAgICAgfVxuXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRGF0ZV0nKSB7XG4gICAgICAgIHJldHVybiBhZ2dyZWdhdGlvbkZucy5leHRlbnRcbiAgICAgIH1cbiAgICB9XG4gICAgY29sdW1uLmdldEFnZ3JlZ2F0aW9uRm4gPSAoKSA9PiB7XG4gICAgICBpZiAoIWNvbHVtbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXNGdW5jdGlvbihjb2x1bW4uY29sdW1uRGVmLmFnZ3JlZ2F0aW9uRm4pXG4gICAgICAgID8gY29sdW1uLmNvbHVtbkRlZi5hZ2dyZWdhdGlvbkZuXG4gICAgICAgIDogY29sdW1uLmNvbHVtbkRlZi5hZ2dyZWdhdGlvbkZuID09PSAnYXV0bydcbiAgICAgICAgPyBjb2x1bW4uZ2V0QXV0b0FnZ3JlZ2F0aW9uRm4oKVxuICAgICAgICA6IHRhYmxlLm9wdGlvbnMuYWdncmVnYXRpb25GbnM/LltcbiAgICAgICAgICAgIGNvbHVtbi5jb2x1bW5EZWYuYWdncmVnYXRpb25GbiBhcyBzdHJpbmdcbiAgICAgICAgICBdID8/XG4gICAgICAgICAgYWdncmVnYXRpb25GbnNbY29sdW1uLmNvbHVtbkRlZi5hZ2dyZWdhdGlvbkZuIGFzIEJ1aWx0SW5BZ2dyZWdhdGlvbkZuXVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVUYWJsZTogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4odGFibGU6IFRhYmxlPFREYXRhPik6IHZvaWQgPT4ge1xuICAgIHRhYmxlLnNldEdyb3VwaW5nID0gdXBkYXRlciA9PiB0YWJsZS5vcHRpb25zLm9uR3JvdXBpbmdDaGFuZ2U/Lih1cGRhdGVyKVxuXG4gICAgdGFibGUucmVzZXRHcm91cGluZyA9IGRlZmF1bHRTdGF0ZSA9PiB7XG4gICAgICB0YWJsZS5zZXRHcm91cGluZyhkZWZhdWx0U3RhdGUgPyBbXSA6IHRhYmxlLmluaXRpYWxTdGF0ZT8uZ3JvdXBpbmcgPz8gW10pXG4gICAgfVxuXG4gICAgdGFibGUuZ2V0UHJlR3JvdXBlZFJvd01vZGVsID0gKCkgPT4gdGFibGUuZ2V0RmlsdGVyZWRSb3dNb2RlbCgpXG4gICAgdGFibGUuZ2V0R3JvdXBlZFJvd01vZGVsID0gKCkgPT4ge1xuICAgICAgaWYgKCF0YWJsZS5fZ2V0R3JvdXBlZFJvd01vZGVsICYmIHRhYmxlLm9wdGlvbnMuZ2V0R3JvdXBlZFJvd01vZGVsKSB7XG4gICAgICAgIHRhYmxlLl9nZXRHcm91cGVkUm93TW9kZWwgPSB0YWJsZS5vcHRpb25zLmdldEdyb3VwZWRSb3dNb2RlbCh0YWJsZSlcbiAgICAgIH1cblxuICAgICAgaWYgKHRhYmxlLm9wdGlvbnMubWFudWFsR3JvdXBpbmcgfHwgIXRhYmxlLl9nZXRHcm91cGVkUm93TW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIHRhYmxlLmdldFByZUdyb3VwZWRSb3dNb2RlbCgpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZS5fZ2V0R3JvdXBlZFJvd01vZGVsKClcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlUm93OiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgICByb3c6IFJvdzxURGF0YT4sXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiB2b2lkID0+IHtcbiAgICByb3cuZ2V0SXNHcm91cGVkID0gKCkgPT4gISFyb3cuZ3JvdXBpbmdDb2x1bW5JZFxuICAgIHJvdy5nZXRHcm91cGluZ1ZhbHVlID0gY29sdW1uSWQgPT4ge1xuICAgICAgaWYgKHJvdy5fZ3JvdXBpbmdWYWx1ZXNDYWNoZS5oYXNPd25Qcm9wZXJ0eShjb2x1bW5JZCkpIHtcbiAgICAgICAgcmV0dXJuIHJvdy5fZ3JvdXBpbmdWYWx1ZXNDYWNoZVtjb2x1bW5JZF1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKGNvbHVtbklkKVxuXG4gICAgICBpZiAoIWNvbHVtbj8uY29sdW1uRGVmLmdldEdyb3VwaW5nVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHJvdy5nZXRWYWx1ZShjb2x1bW5JZClcbiAgICAgIH1cblxuICAgICAgcm93Ll9ncm91cGluZ1ZhbHVlc0NhY2hlW2NvbHVtbklkXSA9IGNvbHVtbi5jb2x1bW5EZWYuZ2V0R3JvdXBpbmdWYWx1ZShcbiAgICAgICAgcm93Lm9yaWdpbmFsXG4gICAgICApXG5cbiAgICAgIHJldHVybiByb3cuX2dyb3VwaW5nVmFsdWVzQ2FjaGVbY29sdW1uSWRdXG4gICAgfVxuICAgIHJvdy5fZ3JvdXBpbmdWYWx1ZXNDYWNoZSA9IHt9XG4gIH0sXG5cbiAgY3JlYXRlQ2VsbDogPFREYXRhIGV4dGVuZHMgUm93RGF0YSwgVFZhbHVlPihcbiAgICBjZWxsOiBDZWxsPFREYXRhLCBUVmFsdWU+LFxuICAgIGNvbHVtbjogQ29sdW1uPFREYXRhLCBUVmFsdWU+LFxuICAgIHJvdzogUm93PFREYXRhPixcbiAgICB0YWJsZTogVGFibGU8VERhdGE+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGdldFJlbmRlclZhbHVlID0gKCkgPT5cbiAgICAgIGNlbGwuZ2V0VmFsdWUoKSA/PyB0YWJsZS5vcHRpb25zLnJlbmRlckZhbGxiYWNrVmFsdWVcblxuICAgIGNlbGwuZ2V0SXNHcm91cGVkID0gKCkgPT5cbiAgICAgIGNvbHVtbi5nZXRJc0dyb3VwZWQoKSAmJiBjb2x1bW4uaWQgPT09IHJvdy5ncm91cGluZ0NvbHVtbklkXG4gICAgY2VsbC5nZXRJc1BsYWNlaG9sZGVyID0gKCkgPT4gIWNlbGwuZ2V0SXNHcm91cGVkKCkgJiYgY29sdW1uLmdldElzR3JvdXBlZCgpXG4gICAgY2VsbC5nZXRJc0FnZ3JlZ2F0ZWQgPSAoKSA9PlxuICAgICAgIWNlbGwuZ2V0SXNHcm91cGVkKCkgJiYgIWNlbGwuZ2V0SXNQbGFjZWhvbGRlcigpICYmICEhcm93LnN1YlJvd3M/Lmxlbmd0aFxuICB9LFxufVxuXG5leHBvcnQgZnVuY3Rpb24gb3JkZXJDb2x1bW5zPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oXG4gIGxlYWZDb2x1bW5zOiBDb2x1bW48VERhdGEsIHVua25vd24+W10sXG4gIGdyb3VwaW5nOiBzdHJpbmdbXSxcbiAgZ3JvdXBlZENvbHVtbk1vZGU/OiBHcm91cGluZ0NvbHVtbk1vZGVcbikge1xuICBpZiAoIWdyb3VwaW5nPy5sZW5ndGggfHwgIWdyb3VwZWRDb2x1bW5Nb2RlKSB7XG4gICAgcmV0dXJuIGxlYWZDb2x1bW5zXG4gIH1cblxuICBjb25zdCBub25Hcm91cGluZ0NvbHVtbnMgPSBsZWFmQ29sdW1ucy5maWx0ZXIoXG4gICAgY29sID0+ICFncm91cGluZy5pbmNsdWRlcyhjb2wuaWQpXG4gIClcblxuICBpZiAoZ3JvdXBlZENvbHVtbk1vZGUgPT09ICdyZW1vdmUnKSB7XG4gICAgcmV0dXJuIG5vbkdyb3VwaW5nQ29sdW1uc1xuICB9XG5cbiAgY29uc3QgZ3JvdXBpbmdDb2x1bW5zID0gZ3JvdXBpbmdcbiAgICAubWFwKGcgPT4gbGVhZkNvbHVtbnMuZmluZChjb2wgPT4gY29sLmlkID09PSBnKSEpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuXG4gIHJldHVybiBbLi4uZ3JvdXBpbmdDb2x1bW5zLCAuLi5ub25Hcm91cGluZ0NvbHVtbnNdXG59XG4iLCJpbXBvcnQgeyBtYWtlU3RhdGVVcGRhdGVyLCBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmltcG9ydCB7IFRhYmxlLCBPbkNoYW5nZUZuLCBVcGRhdGVyLCBDb2x1bW4sIFJvd0RhdGEgfSBmcm9tICcuLi90eXBlcydcblxuaW1wb3J0IHsgb3JkZXJDb2x1bW5zIH0gZnJvbSAnLi9Hcm91cGluZydcbmltcG9ydCB7IFRhYmxlRmVhdHVyZSB9IGZyb20gJy4uL2NvcmUvdGFibGUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uT3JkZXJUYWJsZVN0YXRlIHtcbiAgY29sdW1uT3JkZXI6IENvbHVtbk9yZGVyU3RhdGVcbn1cblxuZXhwb3J0IHR5cGUgQ29sdW1uT3JkZXJTdGF0ZSA9IHN0cmluZ1tdXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uT3JkZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggYW4gYHVwZGF0ZXJGbmAgd2hlbiBgc3RhdGUuY29sdW1uT3JkZXJgIGNoYW5nZXMuIFRoaXMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGludGVybmFsIHN0YXRlIG1hbmFnZW1lbnQsIHNvIHlvdSB3aWxsIG5lZWQgdG8gcGVyc2lzdCB0aGUgc3RhdGUgY2hhbmdlIGVpdGhlciBmdWxseSBvciBwYXJ0aWFsbHkgb3V0c2lkZSBvZiB0aGUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLW9yZGVyaW5nI29uY29sdW1ub3JkZXJjaGFuZ2UpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tb3JkZXJpbmcpXG4gICAqL1xuICBvbkNvbHVtbk9yZGVyQ2hhbmdlPzogT25DaGFuZ2VGbjxDb2x1bW5PcmRlclN0YXRlPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbk9yZGVyRGVmYXVsdE9wdGlvbnMge1xuICBvbkNvbHVtbk9yZGVyQ2hhbmdlOiBPbkNoYW5nZUZuPENvbHVtbk9yZGVyU3RhdGU+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uT3JkZXJJbnN0YW5jZTxURGF0YSBleHRlbmRzIFJvd0RhdGE+IHtcbiAgX2dldE9yZGVyQ29sdW1uc0ZuOiAoKSA9PiAoXG4gICAgY29sdW1uczogQ29sdW1uPFREYXRhLCB1bmtub3duPltdXG4gICkgPT4gQ29sdW1uPFREYXRhLCB1bmtub3duPltdXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlICoqY29sdW1uT3JkZXIqKiBzdGF0ZSB0byBgaW5pdGlhbFN0YXRlLmNvbHVtbk9yZGVyYCwgb3IgYHRydWVgIGNhbiBiZSBwYXNzZWQgdG8gZm9yY2UgYSBkZWZhdWx0IGJsYW5rIHN0YXRlIHJlc2V0IHRvIGBbXWAuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLW9yZGVyaW5nI3Jlc2V0Y29sdW1ub3JkZXIpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tb3JkZXJpbmcpXG4gICAqL1xuICByZXNldENvbHVtbk9yZGVyOiAoZGVmYXVsdFN0YXRlPzogYm9vbGVhbikgPT4gdm9pZFxuICAvKipcbiAgICogU2V0cyBvciB1cGRhdGVzIHRoZSBgc3RhdGUuY29sdW1uT3JkZXJgIHN0YXRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1vcmRlcmluZyNzZXRjb2x1bW5vcmRlcilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1vcmRlcmluZylcbiAgICovXG4gIHNldENvbHVtbk9yZGVyOiAodXBkYXRlcjogVXBkYXRlcjxDb2x1bW5PcmRlclN0YXRlPikgPT4gdm9pZFxufVxuXG4vL1xuXG5leHBvcnQgY29uc3QgT3JkZXJpbmc6IFRhYmxlRmVhdHVyZSA9IHtcbiAgZ2V0SW5pdGlhbFN0YXRlOiAoc3RhdGUpOiBDb2x1bW5PcmRlclRhYmxlU3RhdGUgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBjb2x1bW5PcmRlcjogW10sXG4gICAgICAuLi5zdGF0ZSxcbiAgICB9XG4gIH0sXG5cbiAgZ2V0RGVmYXVsdE9wdGlvbnM6IDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KFxuICAgIHRhYmxlOiBUYWJsZTxURGF0YT5cbiAgKTogQ29sdW1uT3JkZXJEZWZhdWx0T3B0aW9ucyA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uQ29sdW1uT3JkZXJDaGFuZ2U6IG1ha2VTdGF0ZVVwZGF0ZXIoJ2NvbHVtbk9yZGVyJywgdGFibGUpLFxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVUYWJsZTogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4odGFibGU6IFRhYmxlPFREYXRhPik6IHZvaWQgPT4ge1xuICAgIHRhYmxlLnNldENvbHVtbk9yZGVyID0gdXBkYXRlciA9PlxuICAgICAgdGFibGUub3B0aW9ucy5vbkNvbHVtbk9yZGVyQ2hhbmdlPy4odXBkYXRlcilcbiAgICB0YWJsZS5yZXNldENvbHVtbk9yZGVyID0gZGVmYXVsdFN0YXRlID0+IHtcbiAgICAgIHRhYmxlLnNldENvbHVtbk9yZGVyKFxuICAgICAgICBkZWZhdWx0U3RhdGUgPyBbXSA6IHRhYmxlLmluaXRpYWxTdGF0ZS5jb2x1bW5PcmRlciA/PyBbXVxuICAgICAgKVxuICAgIH1cbiAgICB0YWJsZS5fZ2V0T3JkZXJDb2x1bW5zRm4gPSBtZW1vKFxuICAgICAgKCkgPT4gW1xuICAgICAgICB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtbk9yZGVyLFxuICAgICAgICB0YWJsZS5nZXRTdGF0ZSgpLmdyb3VwaW5nLFxuICAgICAgICB0YWJsZS5vcHRpb25zLmdyb3VwZWRDb2x1bW5Nb2RlLFxuICAgICAgXSxcbiAgICAgIChjb2x1bW5PcmRlciwgZ3JvdXBpbmcsIGdyb3VwZWRDb2x1bW5Nb2RlKSA9PiBjb2x1bW5zID0+IHtcbiAgICAgICAgLy8gU29ydCBncm91cGVkIGNvbHVtbnMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb2x1bW4gbGlzdFxuICAgICAgICAvLyBiZWZvcmUgdGhlIGhlYWRlcnMgYXJlIGJ1aWx0XG4gICAgICAgIGxldCBvcmRlcmVkQ29sdW1uczogQ29sdW1uPFREYXRhLCB1bmtub3duPltdID0gW11cblxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBvcmRlciwgcmV0dXJuIHRoZSBub3JtYWwgY29sdW1uc1xuICAgICAgICBpZiAoIWNvbHVtbk9yZGVyPy5sZW5ndGgpIHtcbiAgICAgICAgICBvcmRlcmVkQ29sdW1ucyA9IGNvbHVtbnNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBjb2x1bW5PcmRlckNvcHkgPSBbLi4uY29sdW1uT3JkZXJdXG5cbiAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbiBvcmRlciwgbWFrZSBhIGNvcHkgb2YgdGhlIGNvbHVtbnNcbiAgICAgICAgICBjb25zdCBjb2x1bW5zQ29weSA9IFsuLi5jb2x1bW5zXVxuXG4gICAgICAgICAgLy8gQW5kIG1ha2UgYSBuZXcgb3JkZXJlZCBhcnJheSBvZiB0aGUgY29sdW1uc1xuXG4gICAgICAgICAgLy8gTG9vcCBvdmVyIHRoZSBjb2x1bW5zIGFuZCBwbGFjZSB0aGVtIGluIG9yZGVyIGludG8gdGhlIG5ldyBhcnJheVxuICAgICAgICAgIHdoaWxlIChjb2x1bW5zQ29weS5sZW5ndGggJiYgY29sdW1uT3JkZXJDb3B5Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0Q29sdW1uSWQgPSBjb2x1bW5PcmRlckNvcHkuc2hpZnQoKVxuICAgICAgICAgICAgY29uc3QgZm91bmRJbmRleCA9IGNvbHVtbnNDb3B5LmZpbmRJbmRleChcbiAgICAgICAgICAgICAgZCA9PiBkLmlkID09PSB0YXJnZXRDb2x1bW5JZFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKGZvdW5kSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICBvcmRlcmVkQ29sdW1ucy5wdXNoKGNvbHVtbnNDb3B5LnNwbGljZShmb3VuZEluZGV4LCAxKVswXSEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIGFueSBjb2x1bW5zIGxlZnQsIGFkZCB0aGVtIHRvIHRoZSBlbmRcbiAgICAgICAgICBvcmRlcmVkQ29sdW1ucyA9IFsuLi5vcmRlcmVkQ29sdW1ucywgLi4uY29sdW1uc0NvcHldXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3JkZXJDb2x1bW5zKG9yZGVyZWRDb2x1bW5zLCBncm91cGluZywgZ3JvdXBlZENvbHVtbk1vZGUpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRPcmRlckNvbHVtbnNGbicsXG4gICAgICAgIC8vIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdUYWJsZSxcbiAgICAgIH1cbiAgICApXG4gIH0sXG59XG4iLCJpbXBvcnQgeyBUYWJsZUZlYXR1cmUgfSBmcm9tICcuLi9jb3JlL3RhYmxlJ1xuaW1wb3J0IHsgT25DaGFuZ2VGbiwgVGFibGUsIFJvd01vZGVsLCBVcGRhdGVyLCBSb3dEYXRhIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBmdW5jdGlvbmFsVXBkYXRlLCBtYWtlU3RhdGVVcGRhdGVyLCBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvblN0YXRlIHtcbiAgcGFnZUluZGV4OiBudW1iZXJcbiAgcGFnZVNpemU6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRpb25UYWJsZVN0YXRlIHtcbiAgcGFnaW5hdGlvbjogUGFnaW5hdGlvblN0YXRlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvbkluaXRpYWxUYWJsZVN0YXRlIHtcbiAgcGFnaW5hdGlvbj86IFBhcnRpYWw8UGFnaW5hdGlvblN0YXRlPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHNldCB0byBgdHJ1ZWAsIHBhZ2luYXRpb24gd2lsbCBiZSByZXNldCB0byB0aGUgZmlyc3QgcGFnZSB3aGVuIHBhZ2UtYWx0ZXJpbmcgc3RhdGUgY2hhbmdlcyBlZy4gYGRhdGFgIGlzIHVwZGF0ZWQsIGZpbHRlcnMgY2hhbmdlLCBncm91cGluZyBjaGFuZ2VzLCBldGMuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGFnaW5hdGlvbiNhdXRvcmVzZXRwYWdlaW5kZXgpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9wYWdpbmF0aW9uKVxuICAgKi9cbiAgYXV0b1Jlc2V0UGFnZUluZGV4PzogYm9vbGVhblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93IG1vZGVsIGFmdGVyIHBhZ2luYXRpb24gaGFzIHRha2VuIHBsYWNlLCBidXQgbm8gZnVydGhlci5cbiAgICpcbiAgICogUGFnaW5hdGlvbiBjb2x1bW5zIGFyZSBhdXRvbWF0aWNhbGx5IHJlb3JkZXJlZCBieSBkZWZhdWx0IHRvIHRoZSBzdGFydCBvZiB0aGUgY29sdW1ucyBsaXN0LiBJZiB5b3Ugd291bGQgcmF0aGVyIHJlbW92ZSB0aGVtIG9yIGxlYXZlIHRoZW0gYXMtaXMsIHNldCB0aGUgYXBwcm9wcmlhdGUgbW9kZSBoZXJlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3BhZ2luYXRpb24jZ2V0cGFnaW5hdGlvbnJvd21vZGVsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGFnaW5hdGlvbilcbiAgICovXG4gIGdldFBhZ2luYXRpb25Sb3dNb2RlbD86ICh0YWJsZTogVGFibGU8YW55PikgPT4gKCkgPT4gUm93TW9kZWw8YW55PlxuICAvKipcbiAgICogRW5hYmxlcyBtYW51YWwgcGFnaW5hdGlvbi4gSWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIGB0cnVlYCwgdGhlIHRhYmxlIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgcGFnaW5hdGUgcm93cyB1c2luZyBgZ2V0UGFnaW5hdGlvblJvd01vZGVsKClgIGFuZCBpbnN0ZWFkIHdpbGwgZXhwZWN0IHlvdSB0byBtYW51YWxseSBwYWdpbmF0ZSB0aGUgcm93cyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSB0YWJsZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGFyZSBkb2luZyBzZXJ2ZXItc2lkZSBwYWdpbmF0aW9uIGFuZCBhZ2dyZWdhdGlvbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9wYWdpbmF0aW9uI21hbnVhbHBhZ2luYXRpb24pXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9wYWdpbmF0aW9uKVxuICAgKi9cbiAgbWFudWFsUGFnaW5hdGlvbj86IGJvb2xlYW5cbiAgLyoqXG4gICAqIElmIHRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHBhZ2luYXRpb24gc3RhdGUgY2hhbmdlcyBhbmQgeW91IHdpbGwgYmUgZXhwZWN0ZWQgdG8gbWFuYWdlIHRoZSBzdGF0ZSB5b3Vyc2VsZi4gWW91IGNhbiBwYXNzIHRoZSBtYW5hZ2VkIHN0YXRlIGJhY2sgdG8gdGhlIHRhYmxlIHZpYSB0aGUgYHRhYmxlT3B0aW9ucy5zdGF0ZS5wYWdpbmF0aW9uYCBvcHRpb24uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGFnaW5hdGlvbiNvbnBhZ2luYXRpb25jaGFuZ2UpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9wYWdpbmF0aW9uKVxuICAgKi9cbiAgb25QYWdpbmF0aW9uQ2hhbmdlPzogT25DaGFuZ2VGbjxQYWdpbmF0aW9uU3RhdGU+XG4gIC8qKlxuICAgKiBXaGVuIG1hbnVhbGx5IGNvbnRyb2xsaW5nIHBhZ2luYXRpb24sIHlvdSBzaG91bGQgc3VwcGx5IGEgdG90YWwgYHBhZ2VDb3VudGAgdmFsdWUgdG8gdGhlIHRhYmxlIGlmIHlvdSBrbm93IGl0LiBJZiB5b3UgZG8gbm90IGtub3cgaG93IG1hbnkgcGFnZXMgdGhlcmUgYXJlLCB5b3UgY2FuIHNldCB0aGlzIHRvIGAtMWAuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGFnaW5hdGlvbiNwYWdlY291bnQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9wYWdpbmF0aW9uKVxuICAgKi9cbiAgcGFnZUNvdW50PzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvbkRlZmF1bHRPcHRpb25zIHtcbiAgb25QYWdpbmF0aW9uQ2hhbmdlOiBPbkNoYW5nZUZuPFBhZ2luYXRpb25TdGF0ZT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0aW9uSW5zdGFuY2U8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiB7XG4gIF9hdXRvUmVzZXRQYWdlSW5kZXg6ICgpID0+IHZvaWRcbiAgX2dldFBhZ2luYXRpb25Sb3dNb2RlbD86ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSB0YWJsZSBjYW4gZ28gdG8gdGhlIG5leHQgcGFnZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9wYWdpbmF0aW9uI2dldGNhbm5leHRwYWdlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGFnaW5hdGlvbilcbiAgICovXG4gIGdldENhbk5leHRQYWdlOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRhYmxlIGNhbiBnbyB0byB0aGUgcHJldmlvdXMgcGFnZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9wYWdpbmF0aW9uI2dldGNhbnByZXZpb3VzcGFnZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3BhZ2luYXRpb24pXG4gICAqL1xuICBnZXRDYW5QcmV2aW91c1BhZ2U6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBhZ2UgY291bnQuIElmIG1hbnVhbGx5IHBhZ2luYXRpbmcgb3IgY29udHJvbGxpbmcgdGhlIHBhZ2luYXRpb24gc3RhdGUsIHRoaXMgd2lsbCBjb21lIGRpcmVjdGx5IGZyb20gdGhlIGBvcHRpb25zLnBhZ2VDb3VudGAgdGFibGUgb3B0aW9uLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBjYWxjdWxhdGVkIGZyb20gdGhlIHRhYmxlIGRhdGEgdXNpbmcgdGhlIHRvdGFsIHJvdyBjb3VudCBhbmQgY3VycmVudCBwYWdlIHNpemUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGFnaW5hdGlvbiNnZXRwYWdlY291bnQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9wYWdpbmF0aW9uKVxuICAgKi9cbiAgZ2V0UGFnZUNvdW50OiAoKSA9PiBudW1iZXJcbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgcGFnZSBvcHRpb25zICh6ZXJvLWluZGV4LWJhc2VkKSBmb3IgdGhlIGN1cnJlbnQgcGFnZSBzaXplLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3BhZ2luYXRpb24jZ2V0cGFnZW9wdGlvbnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9wYWdpbmF0aW9uKVxuICAgKi9cbiAgZ2V0UGFnZU9wdGlvbnM6ICgpID0+IG51bWJlcltdXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByb3cgbW9kZWwgZm9yIHRoZSB0YWJsZSBhZnRlciBwYWdpbmF0aW9uIGhhcyBiZWVuIGFwcGxpZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGFnaW5hdGlvbiNnZXRwYWdpbmF0aW9ucm93bW9kZWwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9wYWdpbmF0aW9uKVxuICAgKi9cbiAgZ2V0UGFnaW5hdGlvblJvd01vZGVsOiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJvdyBtb2RlbCBmb3IgdGhlIHRhYmxlIGJlZm9yZSBhbnkgcGFnaW5hdGlvbiBoYXMgYmVlbiBhcHBsaWVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3BhZ2luYXRpb24jZ2V0cHJlcGFnaW5hdGlvbnJvd21vZGVsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGFnaW5hdGlvbilcbiAgICovXG4gIGdldFByZVBhZ2luYXRpb25Sb3dNb2RlbDogKCkgPT4gUm93TW9kZWw8VERhdGE+XG4gIC8qKlxuICAgKiBJbmNyZW1lbnRzIHRoZSBwYWdlIGluZGV4IGJ5IG9uZSwgaWYgcG9zc2libGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGFnaW5hdGlvbiNuZXh0cGFnZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3BhZ2luYXRpb24pXG4gICAqL1xuICBuZXh0UGFnZTogKCkgPT4gdm9pZFxuICAvKipcbiAgICogRGVjcmVtZW50cyB0aGUgcGFnZSBpbmRleCBieSBvbmUsIGlmIHBvc3NpYmxlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3BhZ2luYXRpb24jcHJldmlvdXNwYWdlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGFnaW5hdGlvbilcbiAgICovXG4gIHByZXZpb3VzUGFnZTogKCkgPT4gdm9pZFxuICAvKipcbiAgICogUmVzZXRzIHRoZSBwYWdlIGluZGV4IHRvIGl0cyBpbml0aWFsIHN0YXRlLiBJZiBgZGVmYXVsdFN0YXRlYCBpcyBgdHJ1ZWAsIHRoZSBwYWdlIGluZGV4IHdpbGwgYmUgcmVzZXQgdG8gYDBgIHJlZ2FyZGxlc3Mgb2YgaW5pdGlhbCBzdGF0ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9wYWdpbmF0aW9uI3Jlc2V0cGFnZWluZGV4KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGFnaW5hdGlvbilcbiAgICovXG4gIHJlc2V0UGFnZUluZGV4OiAoZGVmYXVsdFN0YXRlPzogYm9vbGVhbikgPT4gdm9pZFxuICAvKipcbiAgICogUmVzZXRzIHRoZSBwYWdlIHNpemUgdG8gaXRzIGluaXRpYWwgc3RhdGUuIElmIGBkZWZhdWx0U3RhdGVgIGlzIGB0cnVlYCwgdGhlIHBhZ2Ugc2l6ZSB3aWxsIGJlIHJlc2V0IHRvIGAxMGAgcmVnYXJkbGVzcyBvZiBpbml0aWFsIHN0YXRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3BhZ2luYXRpb24jcmVzZXRwYWdlc2l6ZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3BhZ2luYXRpb24pXG4gICAqL1xuICByZXNldFBhZ2VTaXplOiAoZGVmYXVsdFN0YXRlPzogYm9vbGVhbikgPT4gdm9pZFxuICAvKipcbiAgICogUmVzZXRzIHRoZSAqKnBhZ2luYXRpb24qKiBzdGF0ZSB0byBgaW5pdGlhbFN0YXRlLnBhZ2luYXRpb25gLCBvciBgdHJ1ZWAgY2FuIGJlIHBhc3NlZCB0byBmb3JjZSBhIGRlZmF1bHQgYmxhbmsgc3RhdGUgcmVzZXQgdG8gYFtdYC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9wYWdpbmF0aW9uI3Jlc2V0cGFnaW5hdGlvbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3BhZ2luYXRpb24pXG4gICAqL1xuICByZXNldFBhZ2luYXRpb246IChkZWZhdWx0U3RhdGU/OiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBwYWdlIGNvdW50IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvciB2YWx1ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9wYWdpbmF0aW9uI3NldHBhZ2Vjb3VudClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3BhZ2luYXRpb24pXG4gICAqL1xuICBzZXRQYWdlQ291bnQ6ICh1cGRhdGVyOiBVcGRhdGVyPG51bWJlcj4pID0+IHZvaWRcbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHBhZ2UgaW5kZXggdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9yIHZhbHVlIGluIHRoZSBgc3RhdGUucGFnaW5hdGlvbi5wYWdlSW5kZXhgIHN0YXRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3BhZ2luYXRpb24jc2V0cGFnZWluZGV4KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGFnaW5hdGlvbilcbiAgICovXG4gIHNldFBhZ2VJbmRleDogKHVwZGF0ZXI6IFVwZGF0ZXI8bnVtYmVyPikgPT4gdm9pZFxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcGFnZSBzaXplIHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvciB2YWx1ZSBpbiB0aGUgYHN0YXRlLnBhZ2luYXRpb24ucGFnZVNpemVgIHN0YXRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3BhZ2luYXRpb24jc2V0cGFnZXNpemUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9wYWdpbmF0aW9uKVxuICAgKi9cbiAgc2V0UGFnZVNpemU6ICh1cGRhdGVyOiBVcGRhdGVyPG51bWJlcj4pID0+IHZvaWRcbiAgLyoqXG4gICAqIFNldHMgb3IgdXBkYXRlcyB0aGUgYHN0YXRlLnBhZ2luYXRpb25gIHN0YXRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3BhZ2luYXRpb24jc2V0cGFnaW5hdGlvbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3BhZ2luYXRpb24pXG4gICAqL1xuICBzZXRQYWdpbmF0aW9uOiAodXBkYXRlcjogVXBkYXRlcjxQYWdpbmF0aW9uU3RhdGU+KSA9PiB2b2lkXG59XG5cbi8vXG5cbmNvbnN0IGRlZmF1bHRQYWdlSW5kZXggPSAwXG5jb25zdCBkZWZhdWx0UGFnZVNpemUgPSAxMFxuXG5jb25zdCBnZXREZWZhdWx0UGFnaW5hdGlvblN0YXRlID0gKCk6IFBhZ2luYXRpb25TdGF0ZSA9PiAoe1xuICBwYWdlSW5kZXg6IGRlZmF1bHRQYWdlSW5kZXgsXG4gIHBhZ2VTaXplOiBkZWZhdWx0UGFnZVNpemUsXG59KVxuXG5leHBvcnQgY29uc3QgUGFnaW5hdGlvbjogVGFibGVGZWF0dXJlID0ge1xuICBnZXRJbml0aWFsU3RhdGU6IChzdGF0ZSk6IFBhZ2luYXRpb25UYWJsZVN0YXRlID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIC4uLmdldERlZmF1bHRQYWdpbmF0aW9uU3RhdGUoKSxcbiAgICAgICAgLi4uc3RhdGU/LnBhZ2luYXRpb24sXG4gICAgICB9LFxuICAgIH1cbiAgfSxcblxuICBnZXREZWZhdWx0T3B0aW9uczogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiBQYWdpbmF0aW9uRGVmYXVsdE9wdGlvbnMgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBvblBhZ2luYXRpb25DaGFuZ2U6IG1ha2VTdGF0ZVVwZGF0ZXIoJ3BhZ2luYXRpb24nLCB0YWJsZSksXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZVRhYmxlOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPih0YWJsZTogVGFibGU8VERhdGE+KTogdm9pZCA9PiB7XG4gICAgbGV0IHJlZ2lzdGVyZWQgPSBmYWxzZVxuICAgIGxldCBxdWV1ZWQgPSBmYWxzZVxuXG4gICAgdGFibGUuX2F1dG9SZXNldFBhZ2VJbmRleCA9ICgpID0+IHtcbiAgICAgIGlmICghcmVnaXN0ZXJlZCkge1xuICAgICAgICB0YWJsZS5fcXVldWUoKCkgPT4ge1xuICAgICAgICAgIHJlZ2lzdGVyZWQgPSB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHRhYmxlLm9wdGlvbnMuYXV0b1Jlc2V0QWxsID8/XG4gICAgICAgIHRhYmxlLm9wdGlvbnMuYXV0b1Jlc2V0UGFnZUluZGV4ID8/XG4gICAgICAgICF0YWJsZS5vcHRpb25zLm1hbnVhbFBhZ2luYXRpb25cbiAgICAgICkge1xuICAgICAgICBpZiAocXVldWVkKSByZXR1cm5cbiAgICAgICAgcXVldWVkID0gdHJ1ZVxuICAgICAgICB0YWJsZS5fcXVldWUoKCkgPT4ge1xuICAgICAgICAgIHRhYmxlLnJlc2V0UGFnZUluZGV4KClcbiAgICAgICAgICBxdWV1ZWQgPSBmYWxzZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgICB0YWJsZS5zZXRQYWdpbmF0aW9uID0gdXBkYXRlciA9PiB7XG4gICAgICBjb25zdCBzYWZlVXBkYXRlcjogVXBkYXRlcjxQYWdpbmF0aW9uU3RhdGU+ID0gb2xkID0+IHtcbiAgICAgICAgbGV0IG5ld1N0YXRlID0gZnVuY3Rpb25hbFVwZGF0ZSh1cGRhdGVyLCBvbGQpXG5cbiAgICAgICAgcmV0dXJuIG5ld1N0YXRlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZS5vcHRpb25zLm9uUGFnaW5hdGlvbkNoYW5nZT8uKHNhZmVVcGRhdGVyKVxuICAgIH1cbiAgICB0YWJsZS5yZXNldFBhZ2luYXRpb24gPSBkZWZhdWx0U3RhdGUgPT4ge1xuICAgICAgdGFibGUuc2V0UGFnaW5hdGlvbihcbiAgICAgICAgZGVmYXVsdFN0YXRlXG4gICAgICAgICAgPyBnZXREZWZhdWx0UGFnaW5hdGlvblN0YXRlKClcbiAgICAgICAgICA6IHRhYmxlLmluaXRpYWxTdGF0ZS5wYWdpbmF0aW9uID8/IGdldERlZmF1bHRQYWdpbmF0aW9uU3RhdGUoKVxuICAgICAgKVxuICAgIH1cbiAgICB0YWJsZS5zZXRQYWdlSW5kZXggPSB1cGRhdGVyID0+IHtcbiAgICAgIHRhYmxlLnNldFBhZ2luYXRpb24ob2xkID0+IHtcbiAgICAgICAgbGV0IHBhZ2VJbmRleCA9IGZ1bmN0aW9uYWxVcGRhdGUodXBkYXRlciwgb2xkLnBhZ2VJbmRleClcblxuICAgICAgICBjb25zdCBtYXhQYWdlSW5kZXggPVxuICAgICAgICAgIHR5cGVvZiB0YWJsZS5vcHRpb25zLnBhZ2VDb3VudCA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICB0YWJsZS5vcHRpb25zLnBhZ2VDb3VudCA9PT0gLTFcbiAgICAgICAgICAgID8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcbiAgICAgICAgICAgIDogdGFibGUub3B0aW9ucy5wYWdlQ291bnQgLSAxXG5cbiAgICAgICAgcGFnZUluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocGFnZUluZGV4LCBtYXhQYWdlSW5kZXgpKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ub2xkLFxuICAgICAgICAgIHBhZ2VJbmRleCxcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgdGFibGUucmVzZXRQYWdlSW5kZXggPSBkZWZhdWx0U3RhdGUgPT4ge1xuICAgICAgdGFibGUuc2V0UGFnZUluZGV4KFxuICAgICAgICBkZWZhdWx0U3RhdGVcbiAgICAgICAgICA/IGRlZmF1bHRQYWdlSW5kZXhcbiAgICAgICAgICA6IHRhYmxlLmluaXRpYWxTdGF0ZT8ucGFnaW5hdGlvbj8ucGFnZUluZGV4ID8/IGRlZmF1bHRQYWdlSW5kZXhcbiAgICAgIClcbiAgICB9XG4gICAgdGFibGUucmVzZXRQYWdlU2l6ZSA9IGRlZmF1bHRTdGF0ZSA9PiB7XG4gICAgICB0YWJsZS5zZXRQYWdlU2l6ZShcbiAgICAgICAgZGVmYXVsdFN0YXRlXG4gICAgICAgICAgPyBkZWZhdWx0UGFnZVNpemVcbiAgICAgICAgICA6IHRhYmxlLmluaXRpYWxTdGF0ZT8ucGFnaW5hdGlvbj8ucGFnZVNpemUgPz8gZGVmYXVsdFBhZ2VTaXplXG4gICAgICApXG4gICAgfVxuICAgIHRhYmxlLnNldFBhZ2VTaXplID0gdXBkYXRlciA9PiB7XG4gICAgICB0YWJsZS5zZXRQYWdpbmF0aW9uKG9sZCA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VTaXplID0gTWF0aC5tYXgoMSwgZnVuY3Rpb25hbFVwZGF0ZSh1cGRhdGVyLCBvbGQucGFnZVNpemUpKVxuICAgICAgICBjb25zdCB0b3BSb3dJbmRleCA9IG9sZC5wYWdlU2l6ZSAqIG9sZC5wYWdlSW5kZXghXG4gICAgICAgIGNvbnN0IHBhZ2VJbmRleCA9IE1hdGguZmxvb3IodG9wUm93SW5kZXggLyBwYWdlU2l6ZSlcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLm9sZCxcbiAgICAgICAgICBwYWdlSW5kZXgsXG4gICAgICAgICAgcGFnZVNpemUsXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHRhYmxlLnNldFBhZ2VDb3VudCA9IHVwZGF0ZXIgPT5cbiAgICAgIHRhYmxlLnNldFBhZ2luYXRpb24ob2xkID0+IHtcbiAgICAgICAgbGV0IG5ld1BhZ2VDb3VudCA9IGZ1bmN0aW9uYWxVcGRhdGUoXG4gICAgICAgICAgdXBkYXRlcixcbiAgICAgICAgICB0YWJsZS5vcHRpb25zLnBhZ2VDb3VudCA/PyAtMVxuICAgICAgICApXG5cbiAgICAgICAgaWYgKHR5cGVvZiBuZXdQYWdlQ291bnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbmV3UGFnZUNvdW50ID0gTWF0aC5tYXgoLTEsIG5ld1BhZ2VDb3VudClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ub2xkLFxuICAgICAgICAgIHBhZ2VDb3VudDogbmV3UGFnZUNvdW50LFxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgdGFibGUuZ2V0UGFnZU9wdGlvbnMgPSBtZW1vKFxuICAgICAgKCkgPT4gW3RhYmxlLmdldFBhZ2VDb3VudCgpXSxcbiAgICAgIHBhZ2VDb3VudCA9PiB7XG4gICAgICAgIGxldCBwYWdlT3B0aW9uczogbnVtYmVyW10gPSBbXVxuICAgICAgICBpZiAocGFnZUNvdW50ICYmIHBhZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICBwYWdlT3B0aW9ucyA9IFsuLi5uZXcgQXJyYXkocGFnZUNvdW50KV0uZmlsbChudWxsKS5tYXAoKF8sIGkpID0+IGkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZ2VPcHRpb25zXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRQYWdlT3B0aW9ucycsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdUYWJsZSxcbiAgICAgIH1cbiAgICApXG5cbiAgICB0YWJsZS5nZXRDYW5QcmV2aW91c1BhZ2UgPSAoKSA9PiB0YWJsZS5nZXRTdGF0ZSgpLnBhZ2luYXRpb24ucGFnZUluZGV4ID4gMFxuXG4gICAgdGFibGUuZ2V0Q2FuTmV4dFBhZ2UgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IHBhZ2VJbmRleCB9ID0gdGFibGUuZ2V0U3RhdGUoKS5wYWdpbmF0aW9uXG5cbiAgICAgIGNvbnN0IHBhZ2VDb3VudCA9IHRhYmxlLmdldFBhZ2VDb3VudCgpXG5cbiAgICAgIGlmIChwYWdlQ291bnQgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChwYWdlQ291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYWdlSW5kZXggPCBwYWdlQ291bnQgLSAxXG4gICAgfVxuXG4gICAgdGFibGUucHJldmlvdXNQYWdlID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIHRhYmxlLnNldFBhZ2VJbmRleChvbGQgPT4gb2xkIC0gMSlcbiAgICB9XG5cbiAgICB0YWJsZS5uZXh0UGFnZSA9ICgpID0+IHtcbiAgICAgIHJldHVybiB0YWJsZS5zZXRQYWdlSW5kZXgob2xkID0+IHtcbiAgICAgICAgcmV0dXJuIG9sZCArIDFcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGFibGUuZ2V0UHJlUGFnaW5hdGlvblJvd01vZGVsID0gKCkgPT4gdGFibGUuZ2V0RXhwYW5kZWRSb3dNb2RlbCgpXG4gICAgdGFibGUuZ2V0UGFnaW5hdGlvblJvd01vZGVsID0gKCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhdGFibGUuX2dldFBhZ2luYXRpb25Sb3dNb2RlbCAmJlxuICAgICAgICB0YWJsZS5vcHRpb25zLmdldFBhZ2luYXRpb25Sb3dNb2RlbFxuICAgICAgKSB7XG4gICAgICAgIHRhYmxlLl9nZXRQYWdpbmF0aW9uUm93TW9kZWwgPVxuICAgICAgICAgIHRhYmxlLm9wdGlvbnMuZ2V0UGFnaW5hdGlvblJvd01vZGVsKHRhYmxlKVxuICAgICAgfVxuXG4gICAgICBpZiAodGFibGUub3B0aW9ucy5tYW51YWxQYWdpbmF0aW9uIHx8ICF0YWJsZS5fZ2V0UGFnaW5hdGlvblJvd01vZGVsKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS5nZXRQcmVQYWdpbmF0aW9uUm93TW9kZWwoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFibGUuX2dldFBhZ2luYXRpb25Sb3dNb2RlbCgpXG4gICAgfVxuXG4gICAgdGFibGUuZ2V0UGFnZUNvdW50ID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGFibGUub3B0aW9ucy5wYWdlQ291bnQgPz9cbiAgICAgICAgTWF0aC5jZWlsKFxuICAgICAgICAgIHRhYmxlLmdldFByZVBhZ2luYXRpb25Sb3dNb2RlbCgpLnJvd3MubGVuZ3RoIC9cbiAgICAgICAgICAgIHRhYmxlLmdldFN0YXRlKCkucGFnaW5hdGlvbi5wYWdlU2l6ZVxuICAgICAgICApXG4gICAgICApXG4gICAgfVxuICB9LFxufVxuIiwiaW1wb3J0IHsgVGFibGVGZWF0dXJlIH0gZnJvbSAnLi4vY29yZS90YWJsZSdcbmltcG9ydCB7XG4gIE9uQ2hhbmdlRm4sXG4gIFVwZGF0ZXIsXG4gIFRhYmxlLFxuICBDb2x1bW4sXG4gIFJvdyxcbiAgQ2VsbCxcbiAgUm93RGF0YSxcbn0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBtYWtlU3RhdGVVcGRhdGVyLCBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCB0eXBlIENvbHVtblBpbm5pbmdQb3NpdGlvbiA9IGZhbHNlIHwgJ2xlZnQnIHwgJ3JpZ2h0J1xuZXhwb3J0IHR5cGUgUm93UGlubmluZ1Bvc2l0aW9uID0gZmFsc2UgfCAndG9wJyB8ICdib3R0b20nXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uUGlubmluZ1N0YXRlIHtcbiAgbGVmdD86IHN0cmluZ1tdXG4gIHJpZ2h0Pzogc3RyaW5nW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb3dQaW5uaW5nU3RhdGUge1xuICBib3R0b20/OiBzdHJpbmdbXVxuICB0b3A/OiBzdHJpbmdbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtblBpbm5pbmdUYWJsZVN0YXRlIHtcbiAgY29sdW1uUGlubmluZzogQ29sdW1uUGlubmluZ1N0YXRlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm93UGlubmluZ1RhYmxlU3RhdGUge1xuICByb3dQaW5uaW5nOiBSb3dQaW5uaW5nU3RhdGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5QaW5uaW5nT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFbmFibGVzL2Rpc2FibGVzIGNvbHVtbiBwaW5uaW5nIGZvciB0aGUgdGFibGUuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9waW5uaW5nI2VuYWJsZWNvbHVtbnBpbm5pbmcpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9waW5uaW5nKVxuICAgKi9cbiAgZW5hYmxlQ29sdW1uUGlubmluZz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIEVuYWJsZXMvZGlzYWJsZXMgYWxsIHBpbm5pbmcgZm9yIHRoZSB0YWJsZS4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Bpbm5pbmcjZW5hYmxlcGlubmluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBlbmFibGVQaW5uaW5nPzogYm9vbGVhblxuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCBhbiBgdXBkYXRlckZuYCB3aGVuIGBzdGF0ZS5jb2x1bW5QaW5uaW5nYCBjaGFuZ2VzLiBUaGlzIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBpbnRlcm5hbCBzdGF0ZSBtYW5hZ2VtZW50LCBzbyB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gc3VwcGx5IGBzdGF0ZS5jb2x1bW5QaW5uaW5nYCBmcm9tIHlvdXIgb3duIG1hbmFnZWQgc3RhdGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNvbmNvbHVtbnBpbm5pbmdjaGFuZ2UpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9vbmNvbHVtbnBpbm5pbmdjaGFuZ2UpXG4gICAqL1xuICBvbkNvbHVtblBpbm5pbmdDaGFuZ2U/OiBPbkNoYW5nZUZuPENvbHVtblBpbm5pbmdTdGF0ZT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb3dQaW5uaW5nT3B0aW9uczxURGF0YSBleHRlbmRzIFJvd0RhdGE+IHtcbiAgLyoqXG4gICAqIEVuYWJsZXMvZGlzYWJsZXMgcm93IHBpbm5pbmcgZm9yIHRoZSB0YWJsZS4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Bpbm5pbmcjZW5hYmxlcm93cGlubmluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBlbmFibGVSb3dQaW5uaW5nPzogYm9vbGVhbiB8ICgocm93OiBSb3c8VERhdGE+KSA9PiBib29sZWFuKVxuICAvKipcbiAgICogV2hlbiBgZmFsc2VgLCBwaW5uZWQgcm93cyB3aWxsIG5vdCBiZSB2aXNpYmxlIGlmIHRoZXkgYXJlIGZpbHRlcmVkIG9yIHBhZ2luYXRlZCBvdXQgb2YgdGhlIHRhYmxlLiBXaGVuIGB0cnVlYCwgcGlubmVkIHJvd3Mgd2lsbCBhbHdheXMgYmUgdmlzaWJsZSByZWdhcmRsZXNzIG9mIGZpbHRlcmluZyBvciBwYWdpbmF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNrZWVwcGlubmVkcm93cylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBrZWVwUGlubmVkUm93cz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggYW4gYHVwZGF0ZXJGbmAgd2hlbiBgc3RhdGUucm93UGlubmluZ2AgY2hhbmdlcy4gVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgaW50ZXJuYWwgc3RhdGUgbWFuYWdlbWVudCwgc28geW91IHdpbGwgYWxzbyBuZWVkIHRvIHN1cHBseSBgc3RhdGUucm93UGlubmluZ2AgZnJvbSB5b3VyIG93biBtYW5hZ2VkIHN0YXRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Bpbm5pbmcjb25yb3dwaW5uaW5nY2hhbmdlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvb25yb3dwaW5uaW5nY2hhbmdlKVxuICAgKi9cbiAgb25Sb3dQaW5uaW5nQ2hhbmdlPzogT25DaGFuZ2VGbjxSb3dQaW5uaW5nU3RhdGU+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uUGlubmluZ0RlZmF1bHRPcHRpb25zIHtcbiAgb25Db2x1bW5QaW5uaW5nQ2hhbmdlOiBPbkNoYW5nZUZuPENvbHVtblBpbm5pbmdTdGF0ZT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb3dQaW5uaW5nRGVmYXVsdE9wdGlvbnMge1xuICBvblJvd1Bpbm5pbmdDaGFuZ2U6IE9uQ2hhbmdlRm48Um93UGlubmluZ1N0YXRlPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtblBpbm5pbmdDb2x1bW5EZWYge1xuICAvKipcbiAgICogRW5hYmxlcy9kaXNhYmxlcyBjb2x1bW4gcGlubmluZyBmb3IgdGhpcyBjb2x1bW4uIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9waW5uaW5nI2VuYWJsZXBpbm5pbmctMSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBlbmFibGVQaW5uaW5nPzogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtblBpbm5pbmdDb2x1bW4ge1xuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgY29sdW1uIGNhbiBiZSBwaW5uZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNnZXRjYW5waW4pXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9waW5uaW5nKVxuICAgKi9cbiAgZ2V0Q2FuUGluOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwaW5uZWQgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4gKGAnbGVmdCdgLCBgJ3JpZ2h0J2Agb3IgYGZhbHNlYClcbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9waW5uaW5nI2dldGlzcGlubmVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIGdldElzUGlubmVkOiAoKSA9PiBDb2x1bW5QaW5uaW5nUG9zaXRpb25cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWVyaWMgcGlubmVkIGluZGV4IG9mIHRoZSBjb2x1bW4gd2l0aGluIGEgcGlubmVkIGNvbHVtbiBncm91cC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9waW5uaW5nI2dldHBpbm5lZGluZGV4KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIGdldFBpbm5lZEluZGV4OiAoKSA9PiBudW1iZXJcbiAgLyoqXG4gICAqIFBpbnMgYSBjb2x1bW4gdG8gdGhlIGAnbGVmdCdgIG9yIGAncmlnaHQnYCwgb3IgdW5waW5zIHRoZSBjb2x1bW4gdG8gdGhlIGNlbnRlciBpZiBgZmFsc2VgIGlzIHBhc3NlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9waW5uaW5nI3BpbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBwaW46IChwb3NpdGlvbjogQ29sdW1uUGlubmluZ1Bvc2l0aW9uKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uUGlubmluZ1JvdzxURGF0YSBleHRlbmRzIFJvd0RhdGE+IHtcbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGNlbnRlciBwaW5uZWQgKHVucGlubmVkKSBsZWFmIGNlbGxzIGluIHRoZSByb3cuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNnZXRjZW50ZXJ2aXNpYmxlY2VsbHMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9waW5uaW5nKVxuICAgKi9cbiAgZ2V0Q2VudGVyVmlzaWJsZUNlbGxzOiAoKSA9PiBDZWxsPFREYXRhLCB1bmtub3duPltdXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBsZWZ0IHBpbm5lZCBsZWFmIGNlbGxzIGluIHRoZSByb3cuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNnZXRsZWZ0dmlzaWJsZWNlbGxzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIGdldExlZnRWaXNpYmxlQ2VsbHM6ICgpID0+IENlbGw8VERhdGEsIHVua25vd24+W11cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIHJpZ2h0IHBpbm5lZCBsZWFmIGNlbGxzIGluIHRoZSByb3cuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNnZXRyaWdodHZpc2libGVjZWxscylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBnZXRSaWdodFZpc2libGVDZWxsczogKCkgPT4gQ2VsbDxURGF0YSwgdW5rbm93bj5bXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvd1Bpbm5pbmdSb3cge1xuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcm93IGNhbiBiZSBwaW5uZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNnZXRjYW5waW4tMSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBnZXRDYW5QaW46ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBpbm5lZCBwb3NpdGlvbiBvZiB0aGUgcm93LiAoYCd0b3AnYCwgYCdib3R0b20nYCBvciBgZmFsc2VgKVxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Bpbm5pbmcjZ2V0aXNwaW5uZWQtMSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBnZXRJc1Bpbm5lZDogKCkgPT4gUm93UGlubmluZ1Bvc2l0aW9uXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1lcmljIHBpbm5lZCBpbmRleCBvZiB0aGUgcm93IHdpdGhpbiBhIHBpbm5lZCByb3cgZ3JvdXAuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNnZXRwaW5uZWRpbmRleC0xKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIGdldFBpbm5lZEluZGV4OiAoKSA9PiBudW1iZXJcbiAgLyoqXG4gICAqIFBpbnMgYSByb3cgdG8gdGhlIGAndG9wJ2Agb3IgYCdib3R0b20nYCwgb3IgdW5waW5zIHRoZSByb3cgdG8gdGhlIGNlbnRlciBpZiBgZmFsc2VgIGlzIHBhc3NlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9waW5uaW5nI3Bpbi0xKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIHBpbjogKFxuICAgIHBvc2l0aW9uOiBSb3dQaW5uaW5nUG9zaXRpb24sXG4gICAgaW5jbHVkZUxlYWZSb3dzPzogYm9vbGVhbixcbiAgICBpbmNsdWRlUGFyZW50Um93cz86IGJvb2xlYW5cbiAgKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uUGlubmluZ0luc3RhbmNlPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICAvKipcbiAgICogUmV0dXJucyBhbGwgY2VudGVyIHBpbm5lZCAodW5waW5uZWQpIGxlYWYgY29sdW1ucy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9waW5uaW5nI2dldGNlbnRlcmxlYWZjb2x1bW5zKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIGdldENlbnRlckxlYWZDb2x1bW5zOiAoKSA9PiBDb2x1bW48VERhdGEsIHVua25vd24+W11cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgYW55IGNvbHVtbnMgYXJlIHBpbm5lZC4gT3B0aW9uYWxseSBzcGVjaWZ5IHRvIG9ubHkgY2hlY2sgZm9yIHBpbm5lZCBjb2x1bW5zIGluIGVpdGhlciB0aGUgYGxlZnRgIG9yIGByaWdodGAgcG9zaXRpb24uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNnZXRpc3NvbWVjb2x1bW5zcGlubmVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIGdldElzU29tZUNvbHVtbnNQaW5uZWQ6IChwb3NpdGlvbj86IENvbHVtblBpbm5pbmdQb3NpdGlvbikgPT4gYm9vbGVhblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgbGVmdCBwaW5uZWQgbGVhZiBjb2x1bW5zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Bpbm5pbmcjZ2V0bGVmdGxlYWZjb2x1bW5zKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIGdldExlZnRMZWFmQ29sdW1uczogKCkgPT4gQ29sdW1uPFREYXRhLCB1bmtub3duPltdXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCByaWdodCBwaW5uZWQgbGVhZiBjb2x1bW5zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Bpbm5pbmcjZ2V0cmlnaHRsZWFmY29sdW1ucylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBnZXRSaWdodExlYWZDb2x1bW5zOiAoKSA9PiBDb2x1bW48VERhdGEsIHVua25vd24+W11cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgKipjb2x1bW5QaW5uaW5nKiogc3RhdGUgdG8gYGluaXRpYWxTdGF0ZS5jb2x1bW5QaW5uaW5nYCwgb3IgYHRydWVgIGNhbiBiZSBwYXNzZWQgdG8gZm9yY2UgYSBkZWZhdWx0IGJsYW5rIHN0YXRlIHJlc2V0IHRvIGB7IGxlZnQ6IFtdLCByaWdodDogW10sIH1gLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Bpbm5pbmcjcmVzZXRjb2x1bW5waW5uaW5nKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIHJlc2V0Q29sdW1uUGlubmluZzogKGRlZmF1bHRTdGF0ZT86IGJvb2xlYW4pID0+IHZvaWRcbiAgLyoqXG4gICAqIFNldHMgb3IgdXBkYXRlcyB0aGUgYHN0YXRlLmNvbHVtblBpbm5pbmdgIHN0YXRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Bpbm5pbmcjc2V0Y29sdW1ucGlubmluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBzZXRDb2x1bW5QaW5uaW5nOiAodXBkYXRlcjogVXBkYXRlcjxDb2x1bW5QaW5uaW5nU3RhdGU+KSA9PiB2b2lkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm93UGlubmluZ0luc3RhbmNlPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICBfZ2V0UGlubmVkUm93czogKHBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nKSA9PiBSb3c8VERhdGE+W11cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGJvdHRvbSBwaW5uZWQgcm93cy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9waW5uaW5nI2dldGJvdHRvbXJvd3MpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9waW5uaW5nKVxuICAgKi9cbiAgZ2V0Qm90dG9tUm93czogKCkgPT4gUm93PFREYXRhPltdXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCByb3dzIHRoYXQgYXJlIG5vdCBwaW5uZWQgdG8gdGhlIHRvcCBvciBib3R0b20uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNnZXRjZW50ZXJyb3dzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIGdldENlbnRlclJvd3M6ICgpID0+IFJvdzxURGF0YT5bXVxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhbnkgcm93cyBhcmUgcGlubmVkLiBPcHRpb25hbGx5IHNwZWNpZnkgdG8gb25seSBjaGVjayBmb3IgcGlubmVkIHJvd3MgaW4gZWl0aGVyIHRoZSBgdG9wYCBvciBgYm90dG9tYCBwb3NpdGlvbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9waW5uaW5nI2dldGlzc29tZXJvd3NwaW5uZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9waW5uaW5nKVxuICAgKi9cbiAgZ2V0SXNTb21lUm93c1Bpbm5lZDogKHBvc2l0aW9uPzogUm93UGlubmluZ1Bvc2l0aW9uKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCB0b3AgcGlubmVkIHJvd3MuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNnZXR0b3Byb3dzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIGdldFRvcFJvd3M6ICgpID0+IFJvdzxURGF0YT5bXVxuICAvKipcbiAgICogUmVzZXRzIHRoZSAqKnJvd1Bpbm5pbmcqKiBzdGF0ZSB0byBgaW5pdGlhbFN0YXRlLnJvd1Bpbm5pbmdgLCBvciBgdHJ1ZWAgY2FuIGJlIHBhc3NlZCB0byBmb3JjZSBhIGRlZmF1bHQgYmxhbmsgc3RhdGUgcmVzZXQgdG8gYHsgdG9wOiBbXSwgYm90dG9tOiBbXSwgfWAuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNyZXNldHJvd3Bpbm5pbmcpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9waW5uaW5nKVxuICAgKi9cbiAgcmVzZXRSb3dQaW5uaW5nOiAoZGVmYXVsdFN0YXRlPzogYm9vbGVhbikgPT4gdm9pZFxuICAvKipcbiAgICogU2V0cyBvciB1cGRhdGVzIHRoZSBgc3RhdGUucm93UGlubmluZ2Agc3RhdGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNzZXRyb3dwaW5uaW5nKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIHNldFJvd1Bpbm5pbmc6ICh1cGRhdGVyOiBVcGRhdGVyPFJvd1Bpbm5pbmdTdGF0ZT4pID0+IHZvaWRcbn1cblxuLy9cblxuY29uc3QgZ2V0RGVmYXVsdENvbHVtblBpbm5pbmdTdGF0ZSA9ICgpOiBDb2x1bW5QaW5uaW5nU3RhdGUgPT4gKHtcbiAgbGVmdDogW10sXG4gIHJpZ2h0OiBbXSxcbn0pXG5cbmNvbnN0IGdldERlZmF1bHRSb3dQaW5uaW5nU3RhdGUgPSAoKTogUm93UGlubmluZ1N0YXRlID0+ICh7XG4gIHRvcDogW10sXG4gIGJvdHRvbTogW10sXG59KVxuXG5leHBvcnQgY29uc3QgUGlubmluZzogVGFibGVGZWF0dXJlID0ge1xuICBnZXRJbml0aWFsU3RhdGU6IChzdGF0ZSk6IENvbHVtblBpbm5pbmdUYWJsZVN0YXRlICYgUm93UGlubmluZ1N0YXRlID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uUGlubmluZzogZ2V0RGVmYXVsdENvbHVtblBpbm5pbmdTdGF0ZSgpLFxuICAgICAgcm93UGlubmluZzogZ2V0RGVmYXVsdFJvd1Bpbm5pbmdTdGF0ZSgpLFxuICAgICAgLi4uc3RhdGUsXG4gICAgfVxuICB9LFxuXG4gIGdldERlZmF1bHRPcHRpb25zOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgICB0YWJsZTogVGFibGU8VERhdGE+XG4gICk6IENvbHVtblBpbm5pbmdEZWZhdWx0T3B0aW9ucyAmIFJvd1Bpbm5pbmdEZWZhdWx0T3B0aW9ucyA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uQ29sdW1uUGlubmluZ0NoYW5nZTogbWFrZVN0YXRlVXBkYXRlcignY29sdW1uUGlubmluZycsIHRhYmxlKSxcbiAgICAgIG9uUm93UGlubmluZ0NoYW5nZTogbWFrZVN0YXRlVXBkYXRlcigncm93UGlubmluZycsIHRhYmxlKSxcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlQ29sdW1uOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhLCBUVmFsdWU+KFxuICAgIGNvbHVtbjogQ29sdW1uPFREYXRhLCBUVmFsdWU+LFxuICAgIHRhYmxlOiBUYWJsZTxURGF0YT5cbiAgKTogdm9pZCA9PiB7XG4gICAgY29sdW1uLnBpbiA9IHBvc2l0aW9uID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbklkcyA9IGNvbHVtblxuICAgICAgICAuZ2V0TGVhZkNvbHVtbnMoKVxuICAgICAgICAubWFwKGQgPT4gZC5pZClcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBzdHJpbmdbXVxuXG4gICAgICB0YWJsZS5zZXRDb2x1bW5QaW5uaW5nKG9sZCA9PiB7XG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0OiAob2xkPy5sZWZ0ID8/IFtdKS5maWx0ZXIoZCA9PiAhY29sdW1uSWRzPy5pbmNsdWRlcyhkKSksXG4gICAgICAgICAgICByaWdodDogW1xuICAgICAgICAgICAgICAuLi4ob2xkPy5yaWdodCA/PyBbXSkuZmlsdGVyKGQgPT4gIWNvbHVtbklkcz8uaW5jbHVkZXMoZCkpLFxuICAgICAgICAgICAgICAuLi5jb2x1bW5JZHMsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlZnQ6IFtcbiAgICAgICAgICAgICAgLi4uKG9sZD8ubGVmdCA/PyBbXSkuZmlsdGVyKGQgPT4gIWNvbHVtbklkcz8uaW5jbHVkZXMoZCkpLFxuICAgICAgICAgICAgICAuLi5jb2x1bW5JZHMsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmlnaHQ6IChvbGQ/LnJpZ2h0ID8/IFtdKS5maWx0ZXIoZCA9PiAhY29sdW1uSWRzPy5pbmNsdWRlcyhkKSksXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsZWZ0OiAob2xkPy5sZWZ0ID8/IFtdKS5maWx0ZXIoZCA9PiAhY29sdW1uSWRzPy5pbmNsdWRlcyhkKSksXG4gICAgICAgICAgcmlnaHQ6IChvbGQ/LnJpZ2h0ID8/IFtdKS5maWx0ZXIoZCA9PiAhY29sdW1uSWRzPy5pbmNsdWRlcyhkKSksXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29sdW1uLmdldENhblBpbiA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGxlYWZDb2x1bW5zID0gY29sdW1uLmdldExlYWZDb2x1bW5zKClcblxuICAgICAgcmV0dXJuIGxlYWZDb2x1bW5zLnNvbWUoXG4gICAgICAgIGQgPT5cbiAgICAgICAgICAoZC5jb2x1bW5EZWYuZW5hYmxlUGlubmluZyA/PyB0cnVlKSAmJlxuICAgICAgICAgICh0YWJsZS5vcHRpb25zLmVuYWJsZUNvbHVtblBpbm5pbmcgPz9cbiAgICAgICAgICAgIHRhYmxlLm9wdGlvbnMuZW5hYmxlUGlubmluZyA/P1xuICAgICAgICAgICAgdHJ1ZSlcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb2x1bW4uZ2V0SXNQaW5uZWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBsZWFmQ29sdW1uSWRzID0gY29sdW1uLmdldExlYWZDb2x1bW5zKCkubWFwKGQgPT4gZC5pZClcblxuICAgICAgY29uc3QgeyBsZWZ0LCByaWdodCB9ID0gdGFibGUuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nXG5cbiAgICAgIGNvbnN0IGlzTGVmdCA9IGxlYWZDb2x1bW5JZHMuc29tZShkID0+IGxlZnQ/LmluY2x1ZGVzKGQpKVxuICAgICAgY29uc3QgaXNSaWdodCA9IGxlYWZDb2x1bW5JZHMuc29tZShkID0+IHJpZ2h0Py5pbmNsdWRlcyhkKSlcblxuICAgICAgcmV0dXJuIGlzTGVmdCA/ICdsZWZ0JyA6IGlzUmlnaHQgPyAncmlnaHQnIDogZmFsc2VcbiAgICB9XG5cbiAgICBjb2x1bW4uZ2V0UGlubmVkSW5kZXggPSAoKSA9PiB7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IGNvbHVtbi5nZXRJc1Bpbm5lZCgpXG5cbiAgICAgIHJldHVybiBwb3NpdGlvblxuICAgICAgICA/IHRhYmxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZz8uW3Bvc2l0aW9uXT8uaW5kZXhPZihjb2x1bW4uaWQpID8/IC0xXG4gICAgICAgIDogMFxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVSb3c6IDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KFxuICAgIHJvdzogUm93PFREYXRhPixcbiAgICB0YWJsZTogVGFibGU8VERhdGE+XG4gICk6IHZvaWQgPT4ge1xuICAgIHJvdy5waW4gPSAocG9zaXRpb24sIGluY2x1ZGVMZWFmUm93cywgaW5jbHVkZVBhcmVudFJvd3MpID0+IHtcbiAgICAgIGNvbnN0IGxlYWZSb3dJZHMgPSBpbmNsdWRlTGVhZlJvd3NcbiAgICAgICAgPyByb3cuZ2V0TGVhZlJvd3MoKS5tYXAoKHsgaWQgfSkgPT4gaWQpXG4gICAgICAgIDogW11cbiAgICAgIGNvbnN0IHBhcmVudFJvd0lkcyA9IGluY2x1ZGVQYXJlbnRSb3dzXG4gICAgICAgID8gcm93LmdldFBhcmVudFJvd3MoKS5tYXAoKHsgaWQgfSkgPT4gaWQpXG4gICAgICAgIDogW11cbiAgICAgIGNvbnN0IHJvd0lkcyA9IG5ldyBTZXQoWy4uLnBhcmVudFJvd0lkcywgcm93LmlkLCAuLi5sZWFmUm93SWRzXSlcblxuICAgICAgdGFibGUuc2V0Um93UGlubmluZyhvbGQgPT4ge1xuICAgICAgICBpZiAocG9zaXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvcDogKG9sZD8udG9wID8/IFtdKS5maWx0ZXIoZCA9PiAhcm93SWRzPy5oYXMoZCkpLFxuICAgICAgICAgICAgYm90dG9tOiBbXG4gICAgICAgICAgICAgIC4uLihvbGQ/LmJvdHRvbSA/PyBbXSkuZmlsdGVyKGQgPT4gIXJvd0lkcz8uaGFzKGQpKSxcbiAgICAgICAgICAgICAgLi4uQXJyYXkuZnJvbShyb3dJZHMpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPT09ICd0b3AnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvcDogW1xuICAgICAgICAgICAgICAuLi4ob2xkPy50b3AgPz8gW10pLmZpbHRlcihkID0+ICFyb3dJZHM/LmhhcyhkKSksXG4gICAgICAgICAgICAgIC4uLkFycmF5LmZyb20ocm93SWRzKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBib3R0b206IChvbGQ/LmJvdHRvbSA/PyBbXSkuZmlsdGVyKGQgPT4gIXJvd0lkcz8uaGFzKGQpKSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRvcDogKG9sZD8udG9wID8/IFtdKS5maWx0ZXIoZCA9PiAhcm93SWRzPy5oYXMoZCkpLFxuICAgICAgICAgIGJvdHRvbTogKG9sZD8uYm90dG9tID8/IFtdKS5maWx0ZXIoZCA9PiAhcm93SWRzPy5oYXMoZCkpLFxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByb3cuZ2V0Q2FuUGluID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyBlbmFibGVSb3dQaW5uaW5nLCBlbmFibGVQaW5uaW5nIH0gPSB0YWJsZS5vcHRpb25zXG4gICAgICBpZiAodHlwZW9mIGVuYWJsZVJvd1Bpbm5pbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGVuYWJsZVJvd1Bpbm5pbmcocm93KVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVuYWJsZVJvd1Bpbm5pbmcgPz8gZW5hYmxlUGlubmluZyA/PyB0cnVlXG4gICAgfVxuICAgIHJvdy5nZXRJc1Bpbm5lZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHJvd0lkcyA9IFtyb3cuaWRdXG5cbiAgICAgIGNvbnN0IHsgdG9wLCBib3R0b20gfSA9IHRhYmxlLmdldFN0YXRlKCkucm93UGlubmluZ1xuXG4gICAgICBjb25zdCBpc1RvcCA9IHJvd0lkcy5zb21lKGQgPT4gdG9wPy5pbmNsdWRlcyhkKSlcbiAgICAgIGNvbnN0IGlzQm90dG9tID0gcm93SWRzLnNvbWUoZCA9PiBib3R0b20/LmluY2x1ZGVzKGQpKVxuXG4gICAgICByZXR1cm4gaXNUb3AgPyAndG9wJyA6IGlzQm90dG9tID8gJ2JvdHRvbScgOiBmYWxzZVxuICAgIH1cbiAgICByb3cuZ2V0UGlubmVkSW5kZXggPSAoKSA9PiB7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IHJvdy5nZXRJc1Bpbm5lZCgpXG4gICAgICBpZiAoIXBvc2l0aW9uKSByZXR1cm4gLTFcblxuICAgICAgY29uc3QgdmlzaWJsZVBpbm5lZFJvd0lkcyA9IHRhYmxlXG4gICAgICAgIC5fZ2V0UGlubmVkUm93cyhwb3NpdGlvbilcbiAgICAgICAgPy5tYXAoKHsgaWQgfSkgPT4gaWQpXG5cbiAgICAgIHJldHVybiB2aXNpYmxlUGlubmVkUm93SWRzPy5pbmRleE9mKHJvdy5pZCkgPz8gLTFcbiAgICB9XG4gICAgcm93LmdldENlbnRlclZpc2libGVDZWxscyA9IG1lbW8oXG4gICAgICAoKSA9PiBbXG4gICAgICAgIHJvdy5fZ2V0QWxsVmlzaWJsZUNlbGxzKCksXG4gICAgICAgIHRhYmxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5sZWZ0LFxuICAgICAgICB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHQsXG4gICAgICBdLFxuICAgICAgKGFsbENlbGxzLCBsZWZ0LCByaWdodCkgPT4ge1xuICAgICAgICBjb25zdCBsZWZ0QW5kUmlnaHQ6IHN0cmluZ1tdID0gWy4uLihsZWZ0ID8/IFtdKSwgLi4uKHJpZ2h0ID8/IFtdKV1cblxuICAgICAgICByZXR1cm4gYWxsQ2VsbHMuZmlsdGVyKGQgPT4gIWxlZnRBbmRSaWdodC5pbmNsdWRlcyhkLmNvbHVtbi5pZCkpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ3Jvdy5nZXRDZW50ZXJWaXNpYmxlQ2VsbHMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnUm93cyxcbiAgICAgIH1cbiAgICApXG4gICAgcm93LmdldExlZnRWaXNpYmxlQ2VsbHMgPSBtZW1vKFxuICAgICAgKCkgPT4gW3Jvdy5fZ2V0QWxsVmlzaWJsZUNlbGxzKCksIHRhYmxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5sZWZ0LCAsXSxcbiAgICAgIChhbGxDZWxscywgbGVmdCkgPT4ge1xuICAgICAgICBjb25zdCBjZWxscyA9IChsZWZ0ID8/IFtdKVxuICAgICAgICAgIC5tYXAoY29sdW1uSWQgPT4gYWxsQ2VsbHMuZmluZChjZWxsID0+IGNlbGwuY29sdW1uLmlkID09PSBjb2x1bW5JZCkhKVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAubWFwKGQgPT4gKHsgLi4uZCwgcG9zaXRpb246ICdsZWZ0JyB9KSBhcyBDZWxsPFREYXRhLCB1bmtub3duPilcblxuICAgICAgICByZXR1cm4gY2VsbHNcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTpcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAncm93LmdldExlZnRWaXNpYmxlQ2VsbHMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnUm93cyxcbiAgICAgIH1cbiAgICApXG4gICAgcm93LmdldFJpZ2h0VmlzaWJsZUNlbGxzID0gbWVtbyhcbiAgICAgICgpID0+IFtyb3cuX2dldEFsbFZpc2libGVDZWxscygpLCB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHRdLFxuICAgICAgKGFsbENlbGxzLCByaWdodCkgPT4ge1xuICAgICAgICBjb25zdCBjZWxscyA9IChyaWdodCA/PyBbXSlcbiAgICAgICAgICAubWFwKGNvbHVtbklkID0+IGFsbENlbGxzLmZpbmQoY2VsbCA9PiBjZWxsLmNvbHVtbi5pZCA9PT0gY29sdW1uSWQpISlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgLm1hcChkID0+ICh7IC4uLmQsIHBvc2l0aW9uOiAncmlnaHQnIH0pIGFzIENlbGw8VERhdGEsIHVua25vd24+KVxuXG4gICAgICAgIHJldHVybiBjZWxsc1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OlxuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdyb3cuZ2V0UmlnaHRWaXNpYmxlQ2VsbHMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnUm93cyxcbiAgICAgIH1cbiAgICApXG4gIH0sXG5cbiAgY3JlYXRlVGFibGU6IDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KHRhYmxlOiBUYWJsZTxURGF0YT4pOiB2b2lkID0+IHtcbiAgICB0YWJsZS5zZXRDb2x1bW5QaW5uaW5nID0gdXBkYXRlciA9PlxuICAgICAgdGFibGUub3B0aW9ucy5vbkNvbHVtblBpbm5pbmdDaGFuZ2U/Lih1cGRhdGVyKVxuXG4gICAgdGFibGUucmVzZXRDb2x1bW5QaW5uaW5nID0gZGVmYXVsdFN0YXRlID0+XG4gICAgICB0YWJsZS5zZXRDb2x1bW5QaW5uaW5nKFxuICAgICAgICBkZWZhdWx0U3RhdGVcbiAgICAgICAgICA/IGdldERlZmF1bHRDb2x1bW5QaW5uaW5nU3RhdGUoKVxuICAgICAgICAgIDogdGFibGUuaW5pdGlhbFN0YXRlPy5jb2x1bW5QaW5uaW5nID8/IGdldERlZmF1bHRDb2x1bW5QaW5uaW5nU3RhdGUoKVxuICAgICAgKVxuXG4gICAgdGFibGUuZ2V0SXNTb21lQ29sdW1uc1Bpbm5lZCA9IHBvc2l0aW9uID0+IHtcbiAgICAgIGNvbnN0IHBpbm5pbmdTdGF0ZSA9IHRhYmxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZ1xuXG4gICAgICBpZiAoIXBvc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHBpbm5pbmdTdGF0ZS5sZWZ0Py5sZW5ndGggfHwgcGlubmluZ1N0YXRlLnJpZ2h0Py5sZW5ndGgpXG4gICAgICB9XG4gICAgICByZXR1cm4gQm9vbGVhbihwaW5uaW5nU3RhdGVbcG9zaXRpb25dPy5sZW5ndGgpXG4gICAgfVxuXG4gICAgdGFibGUuZ2V0TGVmdExlYWZDb2x1bW5zID0gbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5nZXRBbGxMZWFmQ29sdW1ucygpLCB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcubGVmdF0sXG4gICAgICAoYWxsQ29sdW1ucywgbGVmdCkgPT4ge1xuICAgICAgICByZXR1cm4gKGxlZnQgPz8gW10pXG4gICAgICAgICAgLm1hcChjb2x1bW5JZCA9PiBhbGxDb2x1bW5zLmZpbmQoY29sdW1uID0+IGNvbHVtbi5pZCA9PT0gY29sdW1uSWQpISlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRMZWZ0TGVhZkNvbHVtbnMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnQ29sdW1ucyxcbiAgICAgIH1cbiAgICApXG5cbiAgICB0YWJsZS5nZXRSaWdodExlYWZDb2x1bW5zID0gbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5nZXRBbGxMZWFmQ29sdW1ucygpLCB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHRdLFxuICAgICAgKGFsbENvbHVtbnMsIHJpZ2h0KSA9PiB7XG4gICAgICAgIHJldHVybiAocmlnaHQgPz8gW10pXG4gICAgICAgICAgLm1hcChjb2x1bW5JZCA9PiBhbGxDb2x1bW5zLmZpbmQoY29sdW1uID0+IGNvbHVtbi5pZCA9PT0gY29sdW1uSWQpISlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRSaWdodExlYWZDb2x1bW5zJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0NvbHVtbnMsXG4gICAgICB9XG4gICAgKVxuXG4gICAgdGFibGUuZ2V0Q2VudGVyTGVhZkNvbHVtbnMgPSBtZW1vKFxuICAgICAgKCkgPT4gW1xuICAgICAgICB0YWJsZS5nZXRBbGxMZWFmQ29sdW1ucygpLFxuICAgICAgICB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcubGVmdCxcbiAgICAgICAgdGFibGUuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLnJpZ2h0LFxuICAgICAgXSxcbiAgICAgIChhbGxDb2x1bW5zLCBsZWZ0LCByaWdodCkgPT4ge1xuICAgICAgICBjb25zdCBsZWZ0QW5kUmlnaHQ6IHN0cmluZ1tdID0gWy4uLihsZWZ0ID8/IFtdKSwgLi4uKHJpZ2h0ID8/IFtdKV1cblxuICAgICAgICByZXR1cm4gYWxsQ29sdW1ucy5maWx0ZXIoZCA9PiAhbGVmdEFuZFJpZ2h0LmluY2x1ZGVzKGQuaWQpKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAnZ2V0Q2VudGVyTGVhZkNvbHVtbnMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnQ29sdW1ucyxcbiAgICAgIH1cbiAgICApXG5cbiAgICB0YWJsZS5zZXRSb3dQaW5uaW5nID0gdXBkYXRlciA9PiB0YWJsZS5vcHRpb25zLm9uUm93UGlubmluZ0NoYW5nZT8uKHVwZGF0ZXIpXG5cbiAgICB0YWJsZS5yZXNldFJvd1Bpbm5pbmcgPSBkZWZhdWx0U3RhdGUgPT5cbiAgICAgIHRhYmxlLnNldFJvd1Bpbm5pbmcoXG4gICAgICAgIGRlZmF1bHRTdGF0ZVxuICAgICAgICAgID8gZ2V0RGVmYXVsdFJvd1Bpbm5pbmdTdGF0ZSgpXG4gICAgICAgICAgOiB0YWJsZS5pbml0aWFsU3RhdGU/LnJvd1Bpbm5pbmcgPz8gZ2V0RGVmYXVsdFJvd1Bpbm5pbmdTdGF0ZSgpXG4gICAgICApXG5cbiAgICB0YWJsZS5nZXRJc1NvbWVSb3dzUGlubmVkID0gcG9zaXRpb24gPT4ge1xuICAgICAgY29uc3QgcGlubmluZ1N0YXRlID0gdGFibGUuZ2V0U3RhdGUoKS5yb3dQaW5uaW5nXG5cbiAgICAgIGlmICghcG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4ocGlubmluZ1N0YXRlLnRvcD8ubGVuZ3RoIHx8IHBpbm5pbmdTdGF0ZS5ib3R0b20/Lmxlbmd0aClcbiAgICAgIH1cbiAgICAgIHJldHVybiBCb29sZWFuKHBpbm5pbmdTdGF0ZVtwb3NpdGlvbl0/Lmxlbmd0aClcbiAgICB9XG5cbiAgICB0YWJsZS5fZ2V0UGlubmVkUm93cyA9IChwb3NpdGlvbjogJ3RvcCcgfCAnYm90dG9tJykgPT5cbiAgICAgIG1lbW8oXG4gICAgICAgICgpID0+IFt0YWJsZS5nZXRSb3dNb2RlbCgpLnJvd3MsIHRhYmxlLmdldFN0YXRlKCkucm93UGlubmluZ1twb3NpdGlvbl1dLFxuICAgICAgICAodmlzaWJsZVJvd3MsIHBpbm5lZFJvd0lkcykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJvd3MgPVxuICAgICAgICAgICAgdGFibGUub3B0aW9ucy5rZWVwUGlubmVkUm93cyA/PyB0cnVlXG4gICAgICAgICAgICAgID8gLy9nZXQgYWxsIHJvd3MgdGhhdCBhcmUgcGlubmVkIGV2ZW4gaWYgdGhleSB3b3VsZCBub3QgYmUgb3RoZXJ3aXNlIHZpc2libGVcbiAgICAgICAgICAgICAgICAvL2FjY291bnQgZm9yIGV4cGFuZGVkIHBhcmVudCByb3dzLCBidXQgbm90IHBhZ2luYXRpb24gb3IgZmlsdGVyaW5nXG4gICAgICAgICAgICAgICAgKHBpbm5lZFJvd0lkcyA/PyBbXSkubWFwKHJvd0lkID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHRhYmxlLmdldFJvdyhyb3dJZCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiByb3cuZ2V0SXNBbGxQYXJlbnRzRXhwYW5kZWQoKSA/IHJvdyA6IG51bGxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICA6IC8vZWxzZSBnZXQgb25seSB2aXNpYmxlIHJvd3MgdGhhdCBhcmUgcGlubmVkXG4gICAgICAgICAgICAgICAgKHBpbm5lZFJvd0lkcyA/PyBbXSkubWFwKFxuICAgICAgICAgICAgICAgICAgcm93SWQgPT4gdmlzaWJsZVJvd3MuZmluZChyb3cgPT4gcm93LmlkID09PSByb3dJZCkhXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgcmV0dXJuIHJvd3NcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgIC5tYXAoZCA9PiAoeyAuLi5kLCBwb3NpdGlvbiB9KSkgYXMgUm93PFREYXRhPltdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJlxuICAgICAgICAgICAgYHJvdy5nZXQke3Bvc2l0aW9uID09PSAndG9wJyA/ICdUb3AnIDogJ0JvdHRvbSd9Um93c2AsXG4gICAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z1Jvd3MsXG4gICAgICAgIH1cbiAgICAgICkoKVxuXG4gICAgdGFibGUuZ2V0VG9wUm93cyA9ICgpID0+IHRhYmxlLl9nZXRQaW5uZWRSb3dzKCd0b3AnKVxuXG4gICAgdGFibGUuZ2V0Qm90dG9tUm93cyA9ICgpID0+IHRhYmxlLl9nZXRQaW5uZWRSb3dzKCdib3R0b20nKVxuXG4gICAgdGFibGUuZ2V0Q2VudGVyUm93cyA9IG1lbW8oXG4gICAgICAoKSA9PiBbXG4gICAgICAgIHRhYmxlLmdldFJvd01vZGVsKCkucm93cyxcbiAgICAgICAgdGFibGUuZ2V0U3RhdGUoKS5yb3dQaW5uaW5nLnRvcCxcbiAgICAgICAgdGFibGUuZ2V0U3RhdGUoKS5yb3dQaW5uaW5nLmJvdHRvbSxcbiAgICAgIF0sXG4gICAgICAoYWxsUm93cywgdG9wLCBib3R0b20pID0+IHtcbiAgICAgICAgY29uc3QgdG9wQW5kQm90dG9tID0gbmV3IFNldChbLi4uKHRvcCA/PyBbXSksIC4uLihib3R0b20gPz8gW10pXSlcbiAgICAgICAgcmV0dXJuIGFsbFJvd3MuZmlsdGVyKGQgPT4gIXRvcEFuZEJvdHRvbS5oYXMoZC5pZCkpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdyb3cuZ2V0Q2VudGVyUm93cycsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdSb3dzLFxuICAgICAgfVxuICAgIClcbiAgfSxcbn1cbiIsImltcG9ydCB7IFRhYmxlRmVhdHVyZSB9IGZyb20gJy4uL2NvcmUvdGFibGUnXG5pbXBvcnQgeyBPbkNoYW5nZUZuLCBUYWJsZSwgUm93LCBSb3dNb2RlbCwgVXBkYXRlciwgUm93RGF0YSB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgbWFrZVN0YXRlVXBkYXRlciwgbWVtbyB9IGZyb20gJy4uL3V0aWxzJ1xuXG5leHBvcnQgdHlwZSBSb3dTZWxlY3Rpb25TdGF0ZSA9IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm93U2VsZWN0aW9uVGFibGVTdGF0ZSB7XG4gIHJvd1NlbGVjdGlvbjogUm93U2VsZWN0aW9uU3RhdGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb3dTZWxlY3Rpb25PcHRpb25zPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICAvKipcbiAgICogLSBFbmFibGVzL2Rpc2FibGVzIG11bHRpcGxlIHJvdyBzZWxlY3Rpb24gZm9yIGFsbCByb3dzIGluIHRoZSB0YWJsZSBPUlxuICAgKiAtIEEgZnVuY3Rpb24gdGhhdCBnaXZlbiBhIHJvdywgcmV0dXJucyB3aGV0aGVyIHRvIGVuYWJsZS9kaXNhYmxlIG11bHRpcGxlIHJvdyBzZWxlY3Rpb24gZm9yIHRoYXQgcm93J3MgY2hpbGRyZW4vZ3JhbmRjaGlsZHJlblxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jZW5hYmxlbXVsdGlyb3dzZWxlY3Rpb24pXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgZW5hYmxlTXVsdGlSb3dTZWxlY3Rpb24/OiBib29sZWFuIHwgKChyb3c6IFJvdzxURGF0YT4pID0+IGJvb2xlYW4pXG4gIC8qKlxuICAgKiAtIEVuYWJsZXMvZGlzYWJsZXMgcm93IHNlbGVjdGlvbiBmb3IgYWxsIHJvd3MgaW4gdGhlIHRhYmxlIE9SXG4gICAqIC0gQSBmdW5jdGlvbiB0aGF0IGdpdmVuIGEgcm93LCByZXR1cm5zIHdoZXRoZXIgdG8gZW5hYmxlL2Rpc2FibGUgcm93IHNlbGVjdGlvbiBmb3IgdGhhdCByb3dcbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI2VuYWJsZXJvd3NlbGVjdGlvbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvdy1zZWxlY3Rpb24pXG4gICAqL1xuICBlbmFibGVSb3dTZWxlY3Rpb24/OiBib29sZWFuIHwgKChyb3c6IFJvdzxURGF0YT4pID0+IGJvb2xlYW4pXG4gIC8qKlxuICAgKiBFbmFibGVzL2Rpc2FibGVzIGF1dG9tYXRpYyBzdWItcm93IHNlbGVjdGlvbiB3aGVuIGEgcGFyZW50IHJvdyBpcyBzZWxlY3RlZCwgb3IgYSBmdW5jdGlvbiB0aGF0IGVuYWJsZXMvZGlzYWJsZXMgYXV0b21hdGljIHN1Yi1yb3cgc2VsZWN0aW9uIGZvciBlYWNoIHJvdy5cbiAgICogKFVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIGV4cGFuZGluZyBvciBncm91cGluZyBmZWF0dXJlcylcbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI2VuYWJsZXN1YnJvd3NlbGVjdGlvbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvdy1zZWxlY3Rpb24pXG4gICAqL1xuICBlbmFibGVTdWJSb3dTZWxlY3Rpb24/OiBib29sZWFuIHwgKChyb3c6IFJvdzxURGF0YT4pID0+IGJvb2xlYW4pXG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGB1cGRhdGVyRm5gIHdoZW4gYHN0YXRlLnJvd1NlbGVjdGlvbmAgY2hhbmdlcy4gVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgaW50ZXJuYWwgc3RhdGUgbWFuYWdlbWVudCwgc28geW91IHdpbGwgbmVlZCB0byBwZXJzaXN0IHRoZSBzdGF0ZSBjaGFuZ2UgZWl0aGVyIGZ1bGx5IG9yIHBhcnRpYWxseSBvdXRzaWRlIG9mIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI29ucm93c2VsZWN0aW9uY2hhbmdlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93LXNlbGVjdGlvbilcbiAgICovXG4gIG9uUm93U2VsZWN0aW9uQ2hhbmdlPzogT25DaGFuZ2VGbjxSb3dTZWxlY3Rpb25TdGF0ZT5cbiAgLy8gZW5hYmxlR3JvdXBpbmdSb3dTZWxlY3Rpb24/OlxuICAvLyAgIHwgYm9vbGVhblxuICAvLyAgIHwgKChcbiAgLy8gICAgICAgcm93OiBSb3c8VERhdGE+XG4gIC8vICAgICApID0+IGJvb2xlYW4pXG4gIC8vIGlzQWRkaXRpdmVTZWxlY3RFdmVudD86IChlOiB1bmtub3duKSA9PiBib29sZWFuXG4gIC8vIGlzSW5jbHVzaXZlU2VsZWN0RXZlbnQ/OiAoZTogdW5rbm93bikgPT4gYm9vbGVhblxuICAvLyBzZWxlY3RSb3dzRm4/OiAoXG4gIC8vICAgdGFibGU6IFRhYmxlPFREYXRhPixcbiAgLy8gICByb3dNb2RlbDogUm93TW9kZWw8VERhdGE+XG4gIC8vICkgPT4gUm93TW9kZWw8VERhdGE+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm93U2VsZWN0aW9uUm93IHtcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHJvdyBjYW4gbXVsdGktc2VsZWN0LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jZ2V0Y2FubXVsdGlzZWxlY3QpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgZ2V0Q2FuTXVsdGlTZWxlY3Q6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHJvdyBjYW4gYmUgc2VsZWN0ZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcm93LXNlbGVjdGlvbiNnZXRjYW5zZWxlY3QpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgZ2V0Q2FuU2VsZWN0OiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSByb3cgY2FuIHNlbGVjdCBzdWIgcm93cyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHBhcmVudCByb3cgaXMgc2VsZWN0ZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcm93LXNlbGVjdGlvbiNnZXRjYW5zZWxlY3RzdWJyb3dzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93LXNlbGVjdGlvbilcbiAgICovXG4gIGdldENhblNlbGVjdFN1YlJvd3M6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgYWxsIG9mIHRoZSByb3cncyBzdWIgcm93cyBhcmUgc2VsZWN0ZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcm93LXNlbGVjdGlvbiNnZXRpc2FsbHN1YnJvd3NzZWxlY3RlZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvdy1zZWxlY3Rpb24pXG4gICAqL1xuICBnZXRJc0FsbFN1YlJvd3NTZWxlY3RlZDogKCkgPT4gYm9vbGVhblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcm93IGlzIHNlbGVjdGVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jZ2V0aXNzZWxlY3RlZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvdy1zZWxlY3Rpb24pXG4gICAqL1xuICBnZXRJc1NlbGVjdGVkOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHNvbWUgb2YgdGhlIHJvdydzIHN1YiByb3dzIGFyZSBzZWxlY3RlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI2dldGlzc29tZXNlbGVjdGVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93LXNlbGVjdGlvbilcbiAgICovXG4gIGdldElzU29tZVNlbGVjdGVkOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgaGFuZGxlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHRvZ2dsZSB0aGUgcm93LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jZ2V0dG9nZ2xlc2VsZWN0ZWRoYW5kbGVyKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93LXNlbGVjdGlvbilcbiAgICovXG4gIGdldFRvZ2dsZVNlbGVjdGVkSGFuZGxlcjogKCkgPT4gKGV2ZW50OiB1bmtub3duKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBTZWxlY3RzL2Rlc2VsZWN0cyB0aGUgcm93LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jdG9nZ2xlc2VsZWN0ZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgdG9nZ2xlU2VsZWN0ZWQ6ICh2YWx1ZT86IGJvb2xlYW4sIG9wdHM/OiB7IHNlbGVjdENoaWxkcmVuPzogYm9vbGVhbiB9KSA9PiB2b2lkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm93U2VsZWN0aW9uSW5zdGFuY2U8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByb3cgbW9kZWwgb2YgYWxsIHJvd3MgdGhhdCBhcmUgc2VsZWN0ZWQgYWZ0ZXIgZmlsdGVyaW5nIGhhcyBiZWVuIGFwcGxpZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcm93LXNlbGVjdGlvbiNnZXRmaWx0ZXJlZHNlbGVjdGVkcm93bW9kZWwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgZ2V0RmlsdGVyZWRTZWxlY3RlZFJvd01vZGVsOiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJvdyBtb2RlbCBvZiBhbGwgcm93cyB0aGF0IGFyZSBzZWxlY3RlZCBhZnRlciBncm91cGluZyBoYXMgYmVlbiBhcHBsaWVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jZ2V0Z3JvdXBlZHNlbGVjdGVkcm93bW9kZWwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgZ2V0R3JvdXBlZFNlbGVjdGVkUm93TW9kZWw6ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhbGwgcm93cyBvbiB0aGUgY3VycmVudCBwYWdlIGFyZSBzZWxlY3RlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI2dldGlzYWxscGFnZXJvd3NzZWxlY3RlZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvdy1zZWxlY3Rpb24pXG4gICAqL1xuICBnZXRJc0FsbFBhZ2VSb3dzU2VsZWN0ZWQ6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgYWxsIHJvd3MgaW4gdGhlIHRhYmxlIGFyZSBzZWxlY3RlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI2dldGlzYWxscm93c3NlbGVjdGVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93LXNlbGVjdGlvbilcbiAgICovXG4gIGdldElzQWxsUm93c1NlbGVjdGVkOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGFsbCByb3dzIG9uIHRoZSBjdXJyZW50IHBhZ2UgYXJlIHNlbGVjdGVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jZ2V0aXNzb21lcGFnZXJvd3NzZWxlY3RlZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvdy1zZWxlY3Rpb24pXG4gICAqL1xuICBnZXRJc1NvbWVQYWdlUm93c1NlbGVjdGVkOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGFsbCByb3dzIGluIHRoZSB0YWJsZSBhcmUgc2VsZWN0ZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcm93LXNlbGVjdGlvbiNnZXRpc3NvbWVyb3dzc2VsZWN0ZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgZ2V0SXNTb21lUm93c1NlbGVjdGVkOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb3JlIHJvdyBtb2RlbCBvZiBhbGwgcm93cyBiZWZvcmUgcm93IHNlbGVjdGlvbiBoYXMgYmVlbiBhcHBsaWVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jZ2V0cHJlc2VsZWN0ZWRyb3dtb2RlbClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvdy1zZWxlY3Rpb24pXG4gICAqL1xuICBnZXRQcmVTZWxlY3RlZFJvd01vZGVsOiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJvdyBtb2RlbCBvZiBhbGwgcm93cyB0aGF0IGFyZSBzZWxlY3RlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI2dldHNlbGVjdGVkcm93bW9kZWwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgZ2V0U2VsZWN0ZWRSb3dNb2RlbDogKCkgPT4gUm93TW9kZWw8VERhdGE+XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgaGFuZGxlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHRvZ2dsZSBhbGwgcm93cyBvbiB0aGUgY3VycmVudCBwYWdlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jZ2V0dG9nZ2xlYWxscGFnZXJvd3NzZWxlY3RlZGhhbmRsZXIpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgZ2V0VG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZEhhbmRsZXI6ICgpID0+IChldmVudDogdW5rbm93bikgPT4gdm9pZFxuICAvKipcbiAgICogUmV0dXJucyBhIGhhbmRsZXIgdGhhdCBjYW4gYmUgdXNlZCB0byB0b2dnbGUgYWxsIHJvd3MgaW4gdGhlIHRhYmxlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jZ2V0dG9nZ2xlYWxscm93c3NlbGVjdGVkaGFuZGxlcilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvdy1zZWxlY3Rpb24pXG4gICAqL1xuICBnZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRIYW5kbGVyOiAoKSA9PiAoZXZlbnQ6IHVua25vd24pID0+IHZvaWRcbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgKipyb3dTZWxlY3Rpb24qKiBzdGF0ZSB0byB0aGUgYGluaXRpYWxTdGF0ZS5yb3dTZWxlY3Rpb25gLCBvciBgdHJ1ZWAgY2FuIGJlIHBhc3NlZCB0byBmb3JjZSBhIGRlZmF1bHQgYmxhbmsgc3RhdGUgcmVzZXQgdG8gYHt9YC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI3Jlc2V0cm93c2VsZWN0aW9uKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93LXNlbGVjdGlvbilcbiAgICovXG4gIHJlc2V0Um93U2VsZWN0aW9uOiAoZGVmYXVsdFN0YXRlPzogYm9vbGVhbikgPT4gdm9pZFxuICAvKipcbiAgICogU2V0cyBvciB1cGRhdGVzIHRoZSBgc3RhdGUucm93U2VsZWN0aW9uYCBzdGF0ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI3NldHJvd3NlbGVjdGlvbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvdy1zZWxlY3Rpb24pXG4gICAqL1xuICBzZXRSb3dTZWxlY3Rpb246ICh1cGRhdGVyOiBVcGRhdGVyPFJvd1NlbGVjdGlvblN0YXRlPikgPT4gdm9pZFxuICAvKipcbiAgICogU2VsZWN0cy9kZXNlbGVjdHMgYWxsIHJvd3Mgb24gdGhlIGN1cnJlbnQgcGFnZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI3RvZ2dsZWFsbHBhZ2Vyb3dzc2VsZWN0ZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgdG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZDogKHZhbHVlPzogYm9vbGVhbikgPT4gdm9pZFxuICAvKipcbiAgICogU2VsZWN0cy9kZXNlbGVjdHMgYWxsIHJvd3MgaW4gdGhlIHRhYmxlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jdG9nZ2xlYWxscm93c3NlbGVjdGVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93LXNlbGVjdGlvbilcbiAgICovXG4gIHRvZ2dsZUFsbFJvd3NTZWxlY3RlZDogKHZhbHVlPzogYm9vbGVhbikgPT4gdm9pZFxufVxuXG4vL1xuXG5leHBvcnQgY29uc3QgUm93U2VsZWN0aW9uOiBUYWJsZUZlYXR1cmUgPSB7XG4gIGdldEluaXRpYWxTdGF0ZTogKHN0YXRlKTogUm93U2VsZWN0aW9uVGFibGVTdGF0ZSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJvd1NlbGVjdGlvbjoge30sXG4gICAgICAuLi5zdGF0ZSxcbiAgICB9XG4gIH0sXG5cbiAgZ2V0RGVmYXVsdE9wdGlvbnM6IDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KFxuICAgIHRhYmxlOiBUYWJsZTxURGF0YT5cbiAgKTogUm93U2VsZWN0aW9uT3B0aW9uczxURGF0YT4gPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBvblJvd1NlbGVjdGlvbkNoYW5nZTogbWFrZVN0YXRlVXBkYXRlcigncm93U2VsZWN0aW9uJywgdGFibGUpLFxuICAgICAgZW5hYmxlUm93U2VsZWN0aW9uOiB0cnVlLFxuICAgICAgZW5hYmxlTXVsdGlSb3dTZWxlY3Rpb246IHRydWUsXG4gICAgICBlbmFibGVTdWJSb3dTZWxlY3Rpb246IHRydWUsXG4gICAgICAvLyBlbmFibGVHcm91cGluZ1Jvd1NlbGVjdGlvbjogZmFsc2UsXG4gICAgICAvLyBpc0FkZGl0aXZlU2VsZWN0RXZlbnQ6IChlOiB1bmtub3duKSA9PiAhIWUubWV0YUtleSxcbiAgICAgIC8vIGlzSW5jbHVzaXZlU2VsZWN0RXZlbnQ6IChlOiB1bmtub3duKSA9PiAhIWUuc2hpZnRLZXksXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZVRhYmxlOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPih0YWJsZTogVGFibGU8VERhdGE+KTogdm9pZCA9PiB7XG4gICAgdGFibGUuc2V0Um93U2VsZWN0aW9uID0gdXBkYXRlciA9PlxuICAgICAgdGFibGUub3B0aW9ucy5vblJvd1NlbGVjdGlvbkNoYW5nZT8uKHVwZGF0ZXIpXG4gICAgdGFibGUucmVzZXRSb3dTZWxlY3Rpb24gPSBkZWZhdWx0U3RhdGUgPT5cbiAgICAgIHRhYmxlLnNldFJvd1NlbGVjdGlvbihcbiAgICAgICAgZGVmYXVsdFN0YXRlID8ge30gOiB0YWJsZS5pbml0aWFsU3RhdGUucm93U2VsZWN0aW9uID8/IHt9XG4gICAgICApXG4gICAgdGFibGUudG9nZ2xlQWxsUm93c1NlbGVjdGVkID0gdmFsdWUgPT4ge1xuICAgICAgdGFibGUuc2V0Um93U2VsZWN0aW9uKG9sZCA9PiB7XG4gICAgICAgIHZhbHVlID1cbiAgICAgICAgICB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnID8gdmFsdWUgOiAhdGFibGUuZ2V0SXNBbGxSb3dzU2VsZWN0ZWQoKVxuXG4gICAgICAgIGNvbnN0IHJvd1NlbGVjdGlvbiA9IHsgLi4ub2xkIH1cblxuICAgICAgICBjb25zdCBwcmVHcm91cGVkRmxhdFJvd3MgPSB0YWJsZS5nZXRQcmVHcm91cGVkUm93TW9kZWwoKS5mbGF0Um93c1xuXG4gICAgICAgIC8vIFdlIGRvbid0IHVzZSBgbXV0YXRlUm93SXNTZWxlY3RlZGAgaGVyZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICAgICAgLy8gQWxsIG9mIHRoZSByb3dzIGFyZSBmbGF0IGFscmVhZHksIHNvIGl0IHdvdWxkbid0IGJlIHdvcnRoIGl0XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHByZUdyb3VwZWRGbGF0Um93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgICBpZiAoIXJvdy5nZXRDYW5TZWxlY3QoKSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJvd1NlbGVjdGlvbltyb3cuaWRdID0gdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJlR3JvdXBlZEZsYXRSb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSByb3dTZWxlY3Rpb25bcm93LmlkXVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcm93U2VsZWN0aW9uXG4gICAgICB9KVxuICAgIH1cbiAgICB0YWJsZS50b2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkID0gdmFsdWUgPT5cbiAgICAgIHRhYmxlLnNldFJvd1NlbGVjdGlvbihvbGQgPT4ge1xuICAgICAgICBjb25zdCByZXNvbHZlZFZhbHVlID1cbiAgICAgICAgICB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgICA6ICF0YWJsZS5nZXRJc0FsbFBhZ2VSb3dzU2VsZWN0ZWQoKVxuXG4gICAgICAgIGNvbnN0IHJvd1NlbGVjdGlvbjogUm93U2VsZWN0aW9uU3RhdGUgPSB7IC4uLm9sZCB9XG5cbiAgICAgICAgdGFibGUuZ2V0Um93TW9kZWwoKS5yb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICBtdXRhdGVSb3dJc1NlbGVjdGVkKHJvd1NlbGVjdGlvbiwgcm93LmlkLCByZXNvbHZlZFZhbHVlLCB0cnVlLCB0YWJsZSlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gcm93U2VsZWN0aW9uXG4gICAgICB9KVxuXG4gICAgLy8gYWRkUm93U2VsZWN0aW9uUmFuZ2U6IHJvd0lkID0+IHtcbiAgICAvLyAgIGNvbnN0IHtcbiAgICAvLyAgICAgcm93cyxcbiAgICAvLyAgICAgcm93c0J5SWQsXG4gICAgLy8gICAgIG9wdGlvbnM6IHsgc2VsZWN0R3JvdXBpbmdSb3dzLCBzZWxlY3RTdWJSb3dzIH0sXG4gICAgLy8gICB9ID0gdGFibGVcblxuICAgIC8vICAgY29uc3QgZmluZFNlbGVjdGVkUm93ID0gKHJvd3M6IFJvd1tdKSA9PiB7XG4gICAgLy8gICAgIGxldCBmb3VuZFxuICAgIC8vICAgICByb3dzLmZpbmQoZCA9PiB7XG4gICAgLy8gICAgICAgaWYgKGQuZ2V0SXNTZWxlY3RlZCgpKSB7XG4gICAgLy8gICAgICAgICBmb3VuZCA9IGRcbiAgICAvLyAgICAgICAgIHJldHVybiB0cnVlXG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICAgIGNvbnN0IHN1YkZvdW5kID0gZmluZFNlbGVjdGVkUm93KGQuc3ViUm93cyB8fCBbXSlcbiAgICAvLyAgICAgICBpZiAoc3ViRm91bmQpIHtcbiAgICAvLyAgICAgICAgIGZvdW5kID0gc3ViRm91bmRcbiAgICAvLyAgICAgICAgIHJldHVybiB0cnVlXG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICAgIHJldHVybiBmYWxzZVxuICAgIC8vICAgICB9KVxuICAgIC8vICAgICByZXR1cm4gZm91bmRcbiAgICAvLyAgIH1cblxuICAgIC8vICAgY29uc3QgZmlyc3RSb3cgPSBmaW5kU2VsZWN0ZWRSb3cocm93cykgfHwgcm93c1swXVxuICAgIC8vICAgY29uc3QgbGFzdFJvdyA9IHJvd3NCeUlkW3Jvd0lkXVxuXG4gICAgLy8gICBsZXQgaW5jbHVkZSA9IGZhbHNlXG4gICAgLy8gICBjb25zdCBzZWxlY3RlZFJvd0lkcyA9IHt9XG5cbiAgICAvLyAgIGNvbnN0IGFkZFJvdyA9IChyb3c6IFJvdykgPT4ge1xuICAgIC8vICAgICBtdXRhdGVSb3dJc1NlbGVjdGVkKHNlbGVjdGVkUm93SWRzLCByb3cuaWQsIHRydWUsIHtcbiAgICAvLyAgICAgICByb3dzQnlJZCxcbiAgICAvLyAgICAgICBzZWxlY3RHcm91cGluZ1Jvd3M6IHNlbGVjdEdyb3VwaW5nUm93cyEsXG4gICAgLy8gICAgICAgc2VsZWN0U3ViUm93czogc2VsZWN0U3ViUm93cyEsXG4gICAgLy8gICAgIH0pXG4gICAgLy8gICB9XG5cbiAgICAvLyAgIHRhYmxlLnJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgIC8vICAgICBjb25zdCBpc0ZpcnN0Um93ID0gcm93LmlkID09PSBmaXJzdFJvdy5pZFxuICAgIC8vICAgICBjb25zdCBpc0xhc3RSb3cgPSByb3cuaWQgPT09IGxhc3RSb3cuaWRcblxuICAgIC8vICAgICBpZiAoaXNGaXJzdFJvdyB8fCBpc0xhc3RSb3cpIHtcbiAgICAvLyAgICAgICBpZiAoIWluY2x1ZGUpIHtcbiAgICAvLyAgICAgICAgIGluY2x1ZGUgPSB0cnVlXG4gICAgLy8gICAgICAgfSBlbHNlIGlmIChpbmNsdWRlKSB7XG4gICAgLy8gICAgICAgICBhZGRSb3cocm93KVxuICAgIC8vICAgICAgICAgaW5jbHVkZSA9IGZhbHNlXG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgaWYgKGluY2x1ZGUpIHtcbiAgICAvLyAgICAgICBhZGRSb3cocm93KVxuICAgIC8vICAgICB9XG4gICAgLy8gICB9KVxuXG4gICAgLy8gICB0YWJsZS5zZXRSb3dTZWxlY3Rpb24oc2VsZWN0ZWRSb3dJZHMpXG4gICAgLy8gfSxcbiAgICB0YWJsZS5nZXRQcmVTZWxlY3RlZFJvd01vZGVsID0gKCkgPT4gdGFibGUuZ2V0Q29yZVJvd01vZGVsKClcbiAgICB0YWJsZS5nZXRTZWxlY3RlZFJvd01vZGVsID0gbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5nZXRTdGF0ZSgpLnJvd1NlbGVjdGlvbiwgdGFibGUuZ2V0Q29yZVJvd01vZGVsKCldLFxuICAgICAgKHJvd1NlbGVjdGlvbiwgcm93TW9kZWwpID0+IHtcbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhyb3dTZWxlY3Rpb24pLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByb3dzOiBbXSxcbiAgICAgICAgICAgIGZsYXRSb3dzOiBbXSxcbiAgICAgICAgICAgIHJvd3NCeUlkOiB7fSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2VsZWN0Um93c0ZuKHRhYmxlLCByb3dNb2RlbClcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldFNlbGVjdGVkUm93TW9kZWwnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnVGFibGUsXG4gICAgICB9XG4gICAgKVxuXG4gICAgdGFibGUuZ2V0RmlsdGVyZWRTZWxlY3RlZFJvd01vZGVsID0gbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5nZXRTdGF0ZSgpLnJvd1NlbGVjdGlvbiwgdGFibGUuZ2V0RmlsdGVyZWRSb3dNb2RlbCgpXSxcbiAgICAgIChyb3dTZWxlY3Rpb24sIHJvd01vZGVsKSA9PiB7XG4gICAgICAgIGlmICghT2JqZWN0LmtleXMocm93U2VsZWN0aW9uKS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcm93czogW10sXG4gICAgICAgICAgICBmbGF0Um93czogW10sXG4gICAgICAgICAgICByb3dzQnlJZDoge30sXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlbGVjdFJvd3NGbih0YWJsZSwgcm93TW9kZWwpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgICAgICdnZXRGaWx0ZXJlZFNlbGVjdGVkUm93TW9kZWwnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnVGFibGUsXG4gICAgICB9XG4gICAgKVxuXG4gICAgdGFibGUuZ2V0R3JvdXBlZFNlbGVjdGVkUm93TW9kZWwgPSBtZW1vKFxuICAgICAgKCkgPT4gW3RhYmxlLmdldFN0YXRlKCkucm93U2VsZWN0aW9uLCB0YWJsZS5nZXRTb3J0ZWRSb3dNb2RlbCgpXSxcbiAgICAgIChyb3dTZWxlY3Rpb24sIHJvd01vZGVsKSA9PiB7XG4gICAgICAgIGlmICghT2JqZWN0LmtleXMocm93U2VsZWN0aW9uKS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcm93czogW10sXG4gICAgICAgICAgICBmbGF0Um93czogW10sXG4gICAgICAgICAgICByb3dzQnlJZDoge30sXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlbGVjdFJvd3NGbih0YWJsZSwgcm93TW9kZWwpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJyAmJiAnZ2V0R3JvdXBlZFNlbGVjdGVkUm93TW9kZWwnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnVGFibGUsXG4gICAgICB9XG4gICAgKVxuXG4gICAgLy8vXG5cbiAgICAvLyBnZXRHcm91cGluZ1Jvd0NhblNlbGVjdDogcm93SWQgPT4ge1xuICAgIC8vICAgY29uc3Qgcm93ID0gdGFibGUuZ2V0Um93KHJvd0lkKVxuXG4gICAgLy8gICBpZiAoIXJvdykge1xuICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICAgIC8vICAgfVxuXG4gICAgLy8gICBpZiAodHlwZW9mIHRhYmxlLm9wdGlvbnMuZW5hYmxlR3JvdXBpbmdSb3dTZWxlY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyAgICAgcmV0dXJuIHRhYmxlLm9wdGlvbnMuZW5hYmxlR3JvdXBpbmdSb3dTZWxlY3Rpb24ocm93KVxuICAgIC8vICAgfVxuXG4gICAgLy8gICByZXR1cm4gdGFibGUub3B0aW9ucy5lbmFibGVHcm91cGluZ1Jvd1NlbGVjdGlvbiA/PyBmYWxzZVxuICAgIC8vIH0sXG5cbiAgICB0YWJsZS5nZXRJc0FsbFJvd3NTZWxlY3RlZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHByZUdyb3VwZWRGbGF0Um93cyA9IHRhYmxlLmdldEZpbHRlcmVkUm93TW9kZWwoKS5mbGF0Um93c1xuICAgICAgY29uc3QgeyByb3dTZWxlY3Rpb24gfSA9IHRhYmxlLmdldFN0YXRlKClcblxuICAgICAgbGV0IGlzQWxsUm93c1NlbGVjdGVkID0gQm9vbGVhbihcbiAgICAgICAgcHJlR3JvdXBlZEZsYXRSb3dzLmxlbmd0aCAmJiBPYmplY3Qua2V5cyhyb3dTZWxlY3Rpb24pLmxlbmd0aFxuICAgICAgKVxuXG4gICAgICBpZiAoaXNBbGxSb3dzU2VsZWN0ZWQpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZUdyb3VwZWRGbGF0Um93cy5zb21lKFxuICAgICAgICAgICAgcm93ID0+IHJvdy5nZXRDYW5TZWxlY3QoKSAmJiAhcm93U2VsZWN0aW9uW3Jvdy5pZF1cbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGlzQWxsUm93c1NlbGVjdGVkID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXNBbGxSb3dzU2VsZWN0ZWRcbiAgICB9XG5cbiAgICB0YWJsZS5nZXRJc0FsbFBhZ2VSb3dzU2VsZWN0ZWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBwYWdpbmF0aW9uRmxhdFJvd3MgPSB0YWJsZVxuICAgICAgICAuZ2V0UGFnaW5hdGlvblJvd01vZGVsKClcbiAgICAgICAgLmZsYXRSb3dzLmZpbHRlcihyb3cgPT4gcm93LmdldENhblNlbGVjdCgpKVxuICAgICAgY29uc3QgeyByb3dTZWxlY3Rpb24gfSA9IHRhYmxlLmdldFN0YXRlKClcblxuICAgICAgbGV0IGlzQWxsUGFnZVJvd3NTZWxlY3RlZCA9ICEhcGFnaW5hdGlvbkZsYXRSb3dzLmxlbmd0aFxuXG4gICAgICBpZiAoXG4gICAgICAgIGlzQWxsUGFnZVJvd3NTZWxlY3RlZCAmJlxuICAgICAgICBwYWdpbmF0aW9uRmxhdFJvd3Muc29tZShyb3cgPT4gIXJvd1NlbGVjdGlvbltyb3cuaWRdKVxuICAgICAgKSB7XG4gICAgICAgIGlzQWxsUGFnZVJvd3NTZWxlY3RlZCA9IGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpc0FsbFBhZ2VSb3dzU2VsZWN0ZWRcbiAgICB9XG5cbiAgICB0YWJsZS5nZXRJc1NvbWVSb3dzU2VsZWN0ZWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCB0b3RhbFNlbGVjdGVkID0gT2JqZWN0LmtleXMoXG4gICAgICAgIHRhYmxlLmdldFN0YXRlKCkucm93U2VsZWN0aW9uID8/IHt9XG4gICAgICApLmxlbmd0aFxuICAgICAgcmV0dXJuIChcbiAgICAgICAgdG90YWxTZWxlY3RlZCA+IDAgJiZcbiAgICAgICAgdG90YWxTZWxlY3RlZCA8IHRhYmxlLmdldEZpbHRlcmVkUm93TW9kZWwoKS5mbGF0Um93cy5sZW5ndGhcbiAgICAgIClcbiAgICB9XG5cbiAgICB0YWJsZS5nZXRJc1NvbWVQYWdlUm93c1NlbGVjdGVkID0gKCkgPT4ge1xuICAgICAgY29uc3QgcGFnaW5hdGlvbkZsYXRSb3dzID0gdGFibGUuZ2V0UGFnaW5hdGlvblJvd01vZGVsKCkuZmxhdFJvd3NcbiAgICAgIHJldHVybiB0YWJsZS5nZXRJc0FsbFBhZ2VSb3dzU2VsZWN0ZWQoKVxuICAgICAgICA/IGZhbHNlXG4gICAgICAgIDogcGFnaW5hdGlvbkZsYXRSb3dzXG4gICAgICAgICAgICAuZmlsdGVyKHJvdyA9PiByb3cuZ2V0Q2FuU2VsZWN0KCkpXG4gICAgICAgICAgICAuc29tZShkID0+IGQuZ2V0SXNTZWxlY3RlZCgpIHx8IGQuZ2V0SXNTb21lU2VsZWN0ZWQoKSlcbiAgICB9XG5cbiAgICB0YWJsZS5nZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIChlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIHRhYmxlLnRvZ2dsZUFsbFJvd3NTZWxlY3RlZChcbiAgICAgICAgICAoKGUgYXMgTW91c2VFdmVudCkudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWRcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRhYmxlLmdldFRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIChlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIHRhYmxlLnRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWQoXG4gICAgICAgICAgKChlIGFzIE1vdXNlRXZlbnQpLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlUm93OiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgICByb3c6IFJvdzxURGF0YT4sXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiB2b2lkID0+IHtcbiAgICByb3cudG9nZ2xlU2VsZWN0ZWQgPSAodmFsdWUsIG9wdHMpID0+IHtcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSByb3cuZ2V0SXNTZWxlY3RlZCgpXG5cbiAgICAgIHRhYmxlLnNldFJvd1NlbGVjdGlvbihvbGQgPT4ge1xuICAgICAgICB2YWx1ZSA9IHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyB2YWx1ZSA6ICFpc1NlbGVjdGVkXG5cbiAgICAgICAgaWYgKHJvdy5nZXRDYW5TZWxlY3QoKSAmJiBpc1NlbGVjdGVkID09PSB2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBvbGRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUm93SWRzID0geyAuLi5vbGQgfVxuXG4gICAgICAgIG11dGF0ZVJvd0lzU2VsZWN0ZWQoXG4gICAgICAgICAgc2VsZWN0ZWRSb3dJZHMsXG4gICAgICAgICAgcm93LmlkLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIG9wdHM/LnNlbGVjdENoaWxkcmVuID8/IHRydWUsXG4gICAgICAgICAgdGFibGVcbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiBzZWxlY3RlZFJvd0lkc1xuICAgICAgfSlcbiAgICB9XG4gICAgcm93LmdldElzU2VsZWN0ZWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IHJvd1NlbGVjdGlvbiB9ID0gdGFibGUuZ2V0U3RhdGUoKVxuICAgICAgcmV0dXJuIGlzUm93U2VsZWN0ZWQocm93LCByb3dTZWxlY3Rpb24pXG4gICAgfVxuXG4gICAgcm93LmdldElzU29tZVNlbGVjdGVkID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyByb3dTZWxlY3Rpb24gfSA9IHRhYmxlLmdldFN0YXRlKClcbiAgICAgIHJldHVybiBpc1N1YlJvd1NlbGVjdGVkKHJvdywgcm93U2VsZWN0aW9uLCB0YWJsZSkgPT09ICdzb21lJ1xuICAgIH1cblxuICAgIHJvdy5nZXRJc0FsbFN1YlJvd3NTZWxlY3RlZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcm93U2VsZWN0aW9uIH0gPSB0YWJsZS5nZXRTdGF0ZSgpXG4gICAgICByZXR1cm4gaXNTdWJSb3dTZWxlY3RlZChyb3csIHJvd1NlbGVjdGlvbiwgdGFibGUpID09PSAnYWxsJ1xuICAgIH1cblxuICAgIHJvdy5nZXRDYW5TZWxlY3QgPSAoKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHRhYmxlLm9wdGlvbnMuZW5hYmxlUm93U2VsZWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS5vcHRpb25zLmVuYWJsZVJvd1NlbGVjdGlvbihyb3cpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZS5vcHRpb25zLmVuYWJsZVJvd1NlbGVjdGlvbiA/PyB0cnVlXG4gICAgfVxuXG4gICAgcm93LmdldENhblNlbGVjdFN1YlJvd3MgPSAoKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHRhYmxlLm9wdGlvbnMuZW5hYmxlU3ViUm93U2VsZWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS5vcHRpb25zLmVuYWJsZVN1YlJvd1NlbGVjdGlvbihyb3cpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZS5vcHRpb25zLmVuYWJsZVN1YlJvd1NlbGVjdGlvbiA/PyB0cnVlXG4gICAgfVxuXG4gICAgcm93LmdldENhbk11bHRpU2VsZWN0ID0gKCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB0YWJsZS5vcHRpb25zLmVuYWJsZU11bHRpUm93U2VsZWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS5vcHRpb25zLmVuYWJsZU11bHRpUm93U2VsZWN0aW9uKHJvdylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlLm9wdGlvbnMuZW5hYmxlTXVsdGlSb3dTZWxlY3Rpb24gPz8gdHJ1ZVxuICAgIH1cbiAgICByb3cuZ2V0VG9nZ2xlU2VsZWN0ZWRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgY29uc3QgY2FuU2VsZWN0ID0gcm93LmdldENhblNlbGVjdCgpXG5cbiAgICAgIHJldHVybiAoZTogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAoIWNhblNlbGVjdCkgcmV0dXJuXG4gICAgICAgIHJvdy50b2dnbGVTZWxlY3RlZChcbiAgICAgICAgICAoKGUgYXMgTW91c2VFdmVudCkudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpPy5jaGVja2VkXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59XG5cbmNvbnN0IG11dGF0ZVJvd0lzU2VsZWN0ZWQgPSA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgc2VsZWN0ZWRSb3dJZHM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+LFxuICBpZDogc3RyaW5nLFxuICB2YWx1ZTogYm9vbGVhbixcbiAgaW5jbHVkZUNoaWxkcmVuOiBib29sZWFuLFxuICB0YWJsZTogVGFibGU8VERhdGE+XG4pID0+IHtcbiAgY29uc3Qgcm93ID0gdGFibGUuZ2V0Um93KGlkKVxuXG4gIC8vIGNvbnN0IGlzR3JvdXBlZCA9IHJvdy5nZXRJc0dyb3VwZWQoKVxuXG4gIC8vIGlmICggLy8gVE9ETzogZW5mb3JjZSBncm91cGluZyByb3cgc2VsZWN0aW9uIHJ1bGVzXG4gIC8vICAgIWlzR3JvdXBlZCB8fFxuICAvLyAgIChpc0dyb3VwZWQgJiYgdGFibGUub3B0aW9ucy5lbmFibGVHcm91cGluZ1Jvd1NlbGVjdGlvbilcbiAgLy8gKSB7XG4gIGlmICh2YWx1ZSkge1xuICAgIGlmICghcm93LmdldENhbk11bHRpU2VsZWN0KCkpIHtcbiAgICAgIE9iamVjdC5rZXlzKHNlbGVjdGVkUm93SWRzKS5mb3JFYWNoKGtleSA9PiBkZWxldGUgc2VsZWN0ZWRSb3dJZHNba2V5XSlcbiAgICB9XG4gICAgaWYgKHJvdy5nZXRDYW5TZWxlY3QoKSkge1xuICAgICAgc2VsZWN0ZWRSb3dJZHNbaWRdID0gdHJ1ZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgc2VsZWN0ZWRSb3dJZHNbaWRdXG4gIH1cbiAgLy8gfVxuXG4gIGlmIChpbmNsdWRlQ2hpbGRyZW4gJiYgcm93LnN1YlJvd3M/Lmxlbmd0aCAmJiByb3cuZ2V0Q2FuU2VsZWN0U3ViUm93cygpKSB7XG4gICAgcm93LnN1YlJvd3MuZm9yRWFjaChyb3cgPT5cbiAgICAgIG11dGF0ZVJvd0lzU2VsZWN0ZWQoc2VsZWN0ZWRSb3dJZHMsIHJvdy5pZCwgdmFsdWUsIGluY2x1ZGVDaGlsZHJlbiwgdGFibGUpXG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RSb3dzRm48VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgdGFibGU6IFRhYmxlPFREYXRhPixcbiAgcm93TW9kZWw6IFJvd01vZGVsPFREYXRhPlxuKTogUm93TW9kZWw8VERhdGE+IHtcbiAgY29uc3Qgcm93U2VsZWN0aW9uID0gdGFibGUuZ2V0U3RhdGUoKS5yb3dTZWxlY3Rpb25cblxuICBjb25zdCBuZXdTZWxlY3RlZEZsYXRSb3dzOiBSb3c8VERhdGE+W10gPSBbXVxuICBjb25zdCBuZXdTZWxlY3RlZFJvd3NCeUlkOiBSZWNvcmQ8c3RyaW5nLCBSb3c8VERhdGE+PiA9IHt9XG5cbiAgLy8gRmlsdGVycyB0b3AgbGV2ZWwgYW5kIG5lc3RlZCByb3dzXG4gIGNvbnN0IHJlY3Vyc2VSb3dzID0gKHJvd3M6IFJvdzxURGF0YT5bXSwgZGVwdGggPSAwKTogUm93PFREYXRhPltdID0+IHtcbiAgICByZXR1cm4gcm93c1xuICAgICAgLm1hcChyb3cgPT4ge1xuICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gaXNSb3dTZWxlY3RlZChyb3csIHJvd1NlbGVjdGlvbilcblxuICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgIG5ld1NlbGVjdGVkRmxhdFJvd3MucHVzaChyb3cpXG4gICAgICAgICAgbmV3U2VsZWN0ZWRSb3dzQnlJZFtyb3cuaWRdID0gcm93XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm93LnN1YlJvd3M/Lmxlbmd0aCkge1xuICAgICAgICAgIHJvdyA9IHtcbiAgICAgICAgICAgIC4uLnJvdyxcbiAgICAgICAgICAgIHN1YlJvd3M6IHJlY3Vyc2VSb3dzKHJvdy5zdWJSb3dzLCBkZXB0aCArIDEpLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHJvd1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBSb3c8VERhdGE+W11cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcm93czogcmVjdXJzZVJvd3Mocm93TW9kZWwucm93cyksXG4gICAgZmxhdFJvd3M6IG5ld1NlbGVjdGVkRmxhdFJvd3MsXG4gICAgcm93c0J5SWQ6IG5ld1NlbGVjdGVkUm93c0J5SWQsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUm93U2VsZWN0ZWQ8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgcm93OiBSb3c8VERhdGE+LFxuICBzZWxlY3Rpb246IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIHNlbGVjdGlvbltyb3cuaWRdID8/IGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N1YlJvd1NlbGVjdGVkPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oXG4gIHJvdzogUm93PFREYXRhPixcbiAgc2VsZWN0aW9uOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPixcbiAgdGFibGU6IFRhYmxlPFREYXRhPlxuKTogYm9vbGVhbiB8ICdzb21lJyB8ICdhbGwnIHtcbiAgaWYgKCFyb3cuc3ViUm93cz8ubGVuZ3RoKSByZXR1cm4gZmFsc2VcblxuICBsZXQgYWxsQ2hpbGRyZW5TZWxlY3RlZCA9IHRydWVcbiAgbGV0IHNvbWVTZWxlY3RlZCA9IGZhbHNlXG5cbiAgcm93LnN1YlJvd3MuZm9yRWFjaChzdWJSb3cgPT4ge1xuICAgIC8vIEJhaWwgb3V0IGVhcmx5IGlmIHdlIGtub3cgYm90aCBvZiB0aGVzZVxuICAgIGlmIChzb21lU2VsZWN0ZWQgJiYgIWFsbENoaWxkcmVuU2VsZWN0ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzdWJSb3cuZ2V0Q2FuU2VsZWN0KCkpIHtcbiAgICAgIGlmIChpc1Jvd1NlbGVjdGVkKHN1YlJvdywgc2VsZWN0aW9uKSkge1xuICAgICAgICBzb21lU2VsZWN0ZWQgPSB0cnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGxDaGlsZHJlblNlbGVjdGVkID0gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayByb3cgc2VsZWN0aW9uIG9mIG5lc3RlZCBzdWJyb3dzXG4gICAgaWYgKHN1YlJvdy5zdWJSb3dzICYmIHN1YlJvdy5zdWJSb3dzLmxlbmd0aCkge1xuICAgICAgY29uc3Qgc3ViUm93Q2hpbGRyZW5TZWxlY3RlZCA9IGlzU3ViUm93U2VsZWN0ZWQoc3ViUm93LCBzZWxlY3Rpb24sIHRhYmxlKVxuICAgICAgaWYgKHN1YlJvd0NoaWxkcmVuU2VsZWN0ZWQgPT09ICdhbGwnKSB7XG4gICAgICAgIHNvbWVTZWxlY3RlZCA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3ViUm93Q2hpbGRyZW5TZWxlY3RlZCA9PT0gJ3NvbWUnKSB7XG4gICAgICAgIHNvbWVTZWxlY3RlZCA9IHRydWVcbiAgICAgICAgYWxsQ2hpbGRyZW5TZWxlY3RlZCA9IGZhbHNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGxDaGlsZHJlblNlbGVjdGVkID0gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGFsbENoaWxkcmVuU2VsZWN0ZWQgPyAnYWxsJyA6IHNvbWVTZWxlY3RlZCA/ICdzb21lJyA6IGZhbHNlXG59XG4iLCJpbXBvcnQgeyBTb3J0aW5nRm4gfSBmcm9tICcuL2ZlYXR1cmVzL1NvcnRpbmcnXG5cbmV4cG9ydCBjb25zdCByZVNwbGl0QWxwaGFOdW1lcmljID0gLyhbMC05XSspL2dtXG5cbmNvbnN0IGFscGhhbnVtZXJpYzogU29ydGluZ0ZuPGFueT4gPSAocm93QSwgcm93QiwgY29sdW1uSWQpID0+IHtcbiAgcmV0dXJuIGNvbXBhcmVBbHBoYW51bWVyaWMoXG4gICAgdG9TdHJpbmcocm93QS5nZXRWYWx1ZShjb2x1bW5JZCkpLnRvTG93ZXJDYXNlKCksXG4gICAgdG9TdHJpbmcocm93Qi5nZXRWYWx1ZShjb2x1bW5JZCkpLnRvTG93ZXJDYXNlKClcbiAgKVxufVxuXG5jb25zdCBhbHBoYW51bWVyaWNDYXNlU2Vuc2l0aXZlOiBTb3J0aW5nRm48YW55PiA9IChyb3dBLCByb3dCLCBjb2x1bW5JZCkgPT4ge1xuICByZXR1cm4gY29tcGFyZUFscGhhbnVtZXJpYyhcbiAgICB0b1N0cmluZyhyb3dBLmdldFZhbHVlKGNvbHVtbklkKSksXG4gICAgdG9TdHJpbmcocm93Qi5nZXRWYWx1ZShjb2x1bW5JZCkpXG4gIClcbn1cblxuLy8gVGhlIHRleHQgZmlsdGVyIGlzIG1vcmUgYmFzaWMgKGxlc3MgbnVtZXJpYyBzdXBwb3J0KVxuLy8gYnV0IGlzIG11Y2ggZmFzdGVyXG5jb25zdCB0ZXh0OiBTb3J0aW5nRm48YW55PiA9IChyb3dBLCByb3dCLCBjb2x1bW5JZCkgPT4ge1xuICByZXR1cm4gY29tcGFyZUJhc2ljKFxuICAgIHRvU3RyaW5nKHJvd0EuZ2V0VmFsdWUoY29sdW1uSWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgIHRvU3RyaW5nKHJvd0IuZ2V0VmFsdWUoY29sdW1uSWQpKS50b0xvd2VyQ2FzZSgpXG4gIClcbn1cblxuLy8gVGhlIHRleHQgZmlsdGVyIGlzIG1vcmUgYmFzaWMgKGxlc3MgbnVtZXJpYyBzdXBwb3J0KVxuLy8gYnV0IGlzIG11Y2ggZmFzdGVyXG5jb25zdCB0ZXh0Q2FzZVNlbnNpdGl2ZTogU29ydGluZ0ZuPGFueT4gPSAocm93QSwgcm93QiwgY29sdW1uSWQpID0+IHtcbiAgcmV0dXJuIGNvbXBhcmVCYXNpYyhcbiAgICB0b1N0cmluZyhyb3dBLmdldFZhbHVlKGNvbHVtbklkKSksXG4gICAgdG9TdHJpbmcocm93Qi5nZXRWYWx1ZShjb2x1bW5JZCkpXG4gIClcbn1cblxuY29uc3QgZGF0ZXRpbWU6IFNvcnRpbmdGbjxhbnk+ID0gKHJvd0EsIHJvd0IsIGNvbHVtbklkKSA9PiB7XG4gIGNvbnN0IGEgPSByb3dBLmdldFZhbHVlPERhdGU+KGNvbHVtbklkKVxuICBjb25zdCBiID0gcm93Qi5nZXRWYWx1ZTxEYXRlPihjb2x1bW5JZClcblxuICAvLyBDYW4gaGFuZGxlIG51bGxpc2ggdmFsdWVzXG4gIC8vIFVzZSA+IGFuZCA8IGJlY2F1c2UgPT0gKGFuZCA9PT0pIGRvZXNuJ3Qgd29yayB3aXRoXG4gIC8vIERhdGUgb2JqZWN0cyAod291bGQgcmVxdWlyZSBjYWxsaW5nIGdldFRpbWUoKSkuXG4gIHJldHVybiBhID4gYiA/IDEgOiBhIDwgYiA/IC0xIDogMFxufVxuXG5jb25zdCBiYXNpYzogU29ydGluZ0ZuPGFueT4gPSAocm93QSwgcm93QiwgY29sdW1uSWQpID0+IHtcbiAgcmV0dXJuIGNvbXBhcmVCYXNpYyhyb3dBLmdldFZhbHVlKGNvbHVtbklkKSwgcm93Qi5nZXRWYWx1ZShjb2x1bW5JZCkpXG59XG5cbi8vIFV0aWxzXG5cbmZ1bmN0aW9uIGNvbXBhcmVCYXNpYyhhOiBhbnksIGI6IGFueSkge1xuICByZXR1cm4gYSA9PT0gYiA/IDAgOiBhID4gYiA/IDEgOiAtMVxufVxuXG5mdW5jdGlvbiB0b1N0cmluZyhhOiBhbnkpIHtcbiAgaWYgKHR5cGVvZiBhID09PSAnbnVtYmVyJykge1xuICAgIGlmIChpc05hTihhKSB8fCBhID09PSBJbmZpbml0eSB8fCBhID09PSAtSW5maW5pdHkpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKGEpXG4gIH1cbiAgaWYgKHR5cGVvZiBhID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBhXG4gIH1cbiAgcmV0dXJuICcnXG59XG5cbi8vIE1peGVkIHNvcnRpbmcgaXMgc2xvdywgYnV0IHZlcnkgaW5jbHVzaXZlIG9mIG1hbnkgZWRnZSBjYXNlcy5cbi8vIEl0IGhhbmRsZXMgbnVtYmVycywgbWl4ZWQgYWxwaGFudW1lcmljIGNvbWJpbmF0aW9ucywgYW5kIGV2ZW5cbi8vIG51bGwsIHVuZGVmaW5lZCwgYW5kIEluZmluaXR5XG5mdW5jdGlvbiBjb21wYXJlQWxwaGFudW1lcmljKGFTdHI6IHN0cmluZywgYlN0cjogc3RyaW5nKSB7XG4gIC8vIFNwbGl0IG9uIG51bWJlciBncm91cHMsIGJ1dCBrZWVwIHRoZSBkZWxpbWl0ZXJcbiAgLy8gVGhlbiByZW1vdmUgZmFsc2V5IHNwbGl0IHZhbHVlc1xuICBjb25zdCBhID0gYVN0ci5zcGxpdChyZVNwbGl0QWxwaGFOdW1lcmljKS5maWx0ZXIoQm9vbGVhbilcbiAgY29uc3QgYiA9IGJTdHIuc3BsaXQocmVTcGxpdEFscGhhTnVtZXJpYykuZmlsdGVyKEJvb2xlYW4pXG5cbiAgLy8gV2hpbGVcbiAgd2hpbGUgKGEubGVuZ3RoICYmIGIubGVuZ3RoKSB7XG4gICAgY29uc3QgYWEgPSBhLnNoaWZ0KCkhXG4gICAgY29uc3QgYmIgPSBiLnNoaWZ0KCkhXG5cbiAgICBjb25zdCBhbiA9IHBhcnNlSW50KGFhLCAxMClcbiAgICBjb25zdCBibiA9IHBhcnNlSW50KGJiLCAxMClcblxuICAgIGNvbnN0IGNvbWJvID0gW2FuLCBibl0uc29ydCgpXG5cbiAgICAvLyBCb3RoIGFyZSBzdHJpbmdcbiAgICBpZiAoaXNOYU4oY29tYm9bMF0hKSkge1xuICAgICAgaWYgKGFhID4gYmIpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH1cbiAgICAgIGlmIChiYiA+IGFhKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBPbmUgaXMgYSBzdHJpbmcsIG9uZSBpcyBhIG51bWJlclxuICAgIGlmIChpc05hTihjb21ib1sxXSEpKSB7XG4gICAgICByZXR1cm4gaXNOYU4oYW4pID8gLTEgOiAxXG4gICAgfVxuXG4gICAgLy8gQm90aCBhcmUgbnVtYmVyc1xuICAgIGlmIChhbiA+IGJuKSB7XG4gICAgICByZXR1cm4gMVxuICAgIH1cbiAgICBpZiAoYm4gPiBhbikge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGEubGVuZ3RoIC0gYi5sZW5ndGhcbn1cblxuLy8gRXhwb3J0c1xuXG5leHBvcnQgY29uc3Qgc29ydGluZ0ZucyA9IHtcbiAgYWxwaGFudW1lcmljLFxuICBhbHBoYW51bWVyaWNDYXNlU2Vuc2l0aXZlLFxuICB0ZXh0LFxuICB0ZXh0Q2FzZVNlbnNpdGl2ZSxcbiAgZGF0ZXRpbWUsXG4gIGJhc2ljLFxufVxuXG5leHBvcnQgdHlwZSBCdWlsdEluU29ydGluZ0ZuID0ga2V5b2YgdHlwZW9mIHNvcnRpbmdGbnNcbiIsImltcG9ydCB7IFJvd01vZGVsIH0gZnJvbSAnLi4nXG5pbXBvcnQgeyBUYWJsZUZlYXR1cmUgfSBmcm9tICcuLi9jb3JlL3RhYmxlJ1xuaW1wb3J0IHtcbiAgQnVpbHRJblNvcnRpbmdGbixcbiAgcmVTcGxpdEFscGhhTnVtZXJpYyxcbiAgc29ydGluZ0Zucyxcbn0gZnJvbSAnLi4vc29ydGluZ0ZucydcblxuaW1wb3J0IHtcbiAgQ29sdW1uLFxuICBPbkNoYW5nZUZuLFxuICBUYWJsZSxcbiAgUm93LFxuICBVcGRhdGVyLFxuICBSb3dEYXRhLFxuICBTb3J0aW5nRm5zLFxufSBmcm9tICcuLi90eXBlcydcblxuaW1wb3J0IHsgaXNGdW5jdGlvbiwgbWFrZVN0YXRlVXBkYXRlciB9IGZyb20gJy4uL3V0aWxzJ1xuXG5leHBvcnQgdHlwZSBTb3J0RGlyZWN0aW9uID0gJ2FzYycgfCAnZGVzYydcblxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5Tb3J0IHtcbiAgZGVzYzogYm9vbGVhblxuICBpZDogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIFNvcnRpbmdTdGF0ZSA9IENvbHVtblNvcnRbXVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRpbmdUYWJsZVN0YXRlIHtcbiAgc29ydGluZzogU29ydGluZ1N0YXRlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ydGluZ0ZuPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICAocm93QTogUm93PFREYXRhPiwgcm93QjogUm93PFREYXRhPiwgY29sdW1uSWQ6IHN0cmluZyk6IG51bWJlclxufVxuXG5leHBvcnQgdHlwZSBDdXN0b21Tb3J0aW5nRm5zPFREYXRhIGV4dGVuZHMgUm93RGF0YT4gPSBSZWNvcmQ8XG4gIHN0cmluZyxcbiAgU29ydGluZ0ZuPFREYXRhPlxuPlxuXG5leHBvcnQgdHlwZSBTb3J0aW5nRm5PcHRpb248VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiA9XG4gIHwgJ2F1dG8nXG4gIHwga2V5b2YgU29ydGluZ0Zuc1xuICB8IEJ1aWx0SW5Tb3J0aW5nRm5cbiAgfCBTb3J0aW5nRm48VERhdGE+XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ydGluZ0NvbHVtbkRlZjxURGF0YSBleHRlbmRzIFJvd0RhdGE+IHtcbiAgLyoqXG4gICAqIEVuYWJsZXMvRGlzYWJsZXMgbXVsdGktc29ydGluZyBmb3IgdGhpcyBjb2x1bW4uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNlbmFibGVtdWx0aXNvcnQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgZW5hYmxlTXVsdGlTb3J0PzogYm9vbGVhblxuICAvKipcbiAgICogRW5hYmxlcy9EaXNhYmxlcyBzb3J0aW5nIGZvciB0aGlzIGNvbHVtbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9zb3J0aW5nI2VuYWJsZXNvcnRpbmcpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgZW5hYmxlU29ydGluZz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIEludmVydHMgdGhlIG9yZGVyIG9mIHRoZSBzb3J0aW5nIGZvciB0aGlzIGNvbHVtbi4gVGhpcyBpcyB1c2VmdWwgZm9yIHZhbHVlcyB0aGF0IGhhdmUgYW4gaW52ZXJ0ZWQgYmVzdC93b3JzdCBzY2FsZSB3aGVyZSBsb3dlciBudW1iZXJzIGFyZSBiZXR0ZXIsIGVnLiBhIHJhbmtpbmcgKDFzdCwgMm5kLCAzcmQpIG9yIGdvbGYtbGlrZSBzY29yaW5nXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNpbnZlcnRzb3J0aW5nKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIGludmVydFNvcnRpbmc/OiBib29sZWFuXG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBzb3J0aW5nIHRvZ2dsZXMgb24gdGhpcyBjb2x1bW4gdG8gc3RhcnQgaW4gdGhlIGRlc2NlbmRpbmcgZGlyZWN0aW9uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjc29ydGRlc2NmaXJzdClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICBzb3J0RGVzY0ZpcnN0PzogYm9vbGVhblxuICAvKipcbiAgICogVGhlIHNvcnRpbmcgZnVuY3Rpb24gdG8gdXNlIHdpdGggdGhpcyBjb2x1bW4uXG4gICAqIC0gQSBgc3RyaW5nYCByZWZlcmVuY2luZyBhIGJ1aWx0LWluIHNvcnRpbmcgZnVuY3Rpb25cbiAgICogLSBBIGN1c3RvbSBzb3J0aW5nIGZ1bmN0aW9uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNzb3J0aW5nZm4pXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgc29ydGluZ0ZuPzogU29ydGluZ0ZuT3B0aW9uPFREYXRhPlxuICAvKipcbiAgICogLSBgZmFsc2VgXG4gICAqICAgLSBVbmRlZmluZWQgdmFsdWVzIHdpbGwgYmUgY29uc2lkZXJlZCB0aWVkIGFuZCBuZWVkIHRvIGJlIHNvcnRlZCBieSB0aGUgbmV4dCBjb2x1bW4gZmlsdGVyIG9yIG9yaWdpbmFsIGluZGV4ICh3aGljaGV2ZXIgYXBwbGllcylcbiAgICogLSBgLTFgXG4gICAqICAgLSBVbmRlZmluZWQgdmFsdWVzIHdpbGwgYmUgc29ydGVkIHdpdGggaGlnaGVyIHByaW9yaXR5IChhc2NlbmRpbmcpIChpZiBhc2NlbmRpbmcsIHVuZGVmaW5lZCB3aWxsIGFwcGVhciBvbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0KVxuICAgKiAtIGAxYFxuICAgKiAgIC0gVW5kZWZpbmVkIHZhbHVlcyB3aWxsIGJlIHNvcnRlZCB3aXRoIGxvd2VyIHByaW9yaXR5IChkZXNjZW5kaW5nKSAoaWYgYXNjZW5kaW5nLCB1bmRlZmluZWQgd2lsbCBhcHBlYXIgb24gdGhlIGVuZCBvZiB0aGUgbGlzdClcbiAgICovXG4gIHNvcnRVbmRlZmluZWQ/OiBmYWxzZSB8IC0xIHwgMVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRpbmdDb2x1bW48VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiB7XG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoaXMgY29sdW1uIGZyb20gdGhlIHRhYmxlJ3Mgc29ydGluZyBzdGF0ZVxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjY2xlYXJzb3J0aW5nKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIGNsZWFyU29ydGluZzogKCkgPT4gdm9pZFxuICAvKipcbiAgICogUmV0dXJucyBhIHNvcnQgZGlyZWN0aW9uIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgYmFzZWQgb24gdGhlIGNvbHVtbnMgdmFsdWVzLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjZ2V0YXV0b3NvcnRkaXIpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgZ2V0QXV0b1NvcnREaXI6ICgpID0+IFNvcnREaXJlY3Rpb25cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzb3J0aW5nIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgYmFzZWQgb24gdGhlIGNvbHVtbnMgdmFsdWVzLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjZ2V0YXV0b3NvcnRpbmdmbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICBnZXRBdXRvU29ydGluZ0ZuOiAoKSA9PiBTb3J0aW5nRm48VERhdGE+XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb2x1bW4gY2FuIGJlIG11bHRpLXNvcnRlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9zb3J0aW5nI2dldGNhbm11bHRpc29ydClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICBnZXRDYW5NdWx0aVNvcnQ6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbHVtbiBjYW4gYmUgc29ydGVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjZ2V0Y2Fuc29ydClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICBnZXRDYW5Tb3J0OiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBkaXJlY3Rpb24gdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHNvcnRpbmcgdGhpcyBjb2x1bW4uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNnZXRmaXJzdHNvcnRkaXIpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgZ2V0Rmlyc3RTb3J0RGlyOiAoKSA9PiBTb3J0RGlyZWN0aW9uXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNvcnQgZGlyZWN0aW9uIG9mIHRoaXMgY29sdW1uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjZ2V0aXNzb3J0ZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgZ2V0SXNTb3J0ZWQ6ICgpID0+IGZhbHNlIHwgU29ydERpcmVjdGlvblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbmV4dCBzb3J0aW5nIG9yZGVyLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjZ2V0bmV4dHNvcnRpbmdvcmRlcilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICBnZXROZXh0U29ydGluZ09yZGVyOiAoKSA9PiBTb3J0RGlyZWN0aW9uIHwgZmFsc2VcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGluZGV4IHBvc2l0aW9uIG9mIHRoaXMgY29sdW1uJ3Mgc29ydGluZyB3aXRoaW4gdGhlIHNvcnRpbmcgc3RhdGVcbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9zb3J0aW5nI2dldHNvcnRpbmRleClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICBnZXRTb3J0SW5kZXg6ICgpID0+IG51bWJlclxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgc29ydGluZyBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciB0aGlzIGNvbHVtblxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjZ2V0c29ydGluZ2ZuKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIGdldFNvcnRpbmdGbjogKCkgPT4gU29ydGluZ0ZuPFREYXRhPlxuICAvKipcbiAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gdG9nZ2xlIHRoaXMgY29sdW1uJ3Mgc29ydGluZyBzdGF0ZS4gVGhpcyBpcyB1c2VmdWwgZm9yIGF0dGFjaGluZyBhIGNsaWNrIGhhbmRsZXIgdG8gdGhlIGNvbHVtbiBoZWFkZXIuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNnZXR0b2dnbGVzb3J0aW5naGFuZGxlcilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICBnZXRUb2dnbGVTb3J0aW5nSGFuZGxlcjogKCkgPT4gdW5kZWZpbmVkIHwgKChldmVudDogdW5rbm93bikgPT4gdm9pZClcbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhpcyBjb2x1bW5zIHNvcnRpbmcgc3RhdGUuIElmIGBkZXNjYCBpcyBwcm92aWRlZCwgaXQgd2lsbCBmb3JjZSB0aGUgc29ydCBkaXJlY3Rpb24gdG8gdGhhdCB2YWx1ZS4gSWYgYGlzTXVsdGlgIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGFkZGl0aXZpdHkgbXVsdGktc29ydCB0aGUgY29sdW1uIChvciB0b2dnbGUgaXQgaWYgaXQgaXMgYWxyZWFkeSBzb3J0ZWQpLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjdG9nZ2xlc29ydGluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICB0b2dnbGVTb3J0aW5nOiAoZGVzYz86IGJvb2xlYW4sIGlzTXVsdGk/OiBib29sZWFuKSA9PiB2b2lkXG59XG5cbmludGVyZmFjZSBTb3J0aW5nT3B0aW9uc0Jhc2Uge1xuICAvKipcbiAgICogRW5hYmxlcy9kaXNhYmxlcyB0aGUgYWJpbGl0eSB0byByZW1vdmUgbXVsdGktc29ydHNcbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9zb3J0aW5nI2VuYWJsZW11bHRpcmVtb3ZlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIGVuYWJsZU11bHRpUmVtb3ZlPzogYm9vbGVhblxuICAvKipcbiAgICogRW5hYmxlcy9EaXNhYmxlcyBtdWx0aS1zb3J0aW5nIGZvciB0aGUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNlbmFibGVtdWx0aXNvcnQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgZW5hYmxlTXVsdGlTb3J0PzogYm9vbGVhblxuICAvKipcbiAgICogRW5hYmxlcy9EaXNhYmxlcyBzb3J0aW5nIGZvciB0aGUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNlbmFibGVzb3J0aW5nKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIGVuYWJsZVNvcnRpbmc/OiBib29sZWFuXG4gIC8qKlxuICAgKiBFbmFibGVzL0Rpc2FibGVzIHRoZSBhYmlsaXR5IHRvIHJlbW92ZSBzb3J0aW5nIGZvciB0aGUgdGFibGUuXG4gICAqIC0gSWYgYHRydWVgIHRoZW4gY2hhbmdpbmcgc29ydCBvcmRlciB3aWxsIGNpcmNsZSBsaWtlOiAnbm9uZScgLT4gJ2Rlc2MnIC0+ICdhc2MnIC0+ICdub25lJyAtPiAuLi5cbiAgICogLSBJZiBgZmFsc2VgIHRoZW4gY2hhbmdpbmcgc29ydCBvcmRlciB3aWxsIGNpcmNsZSBsaWtlOiAnbm9uZScgLT4gJ2Rlc2MnIC0+ICdhc2MnIC0+ICdkZXNjJyAtPiAnYXNjJyAtPiAuLi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9zb3J0aW5nI2VuYWJsZXNvcnRpbmdyZW1vdmFsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIGVuYWJsZVNvcnRpbmdSZW1vdmFsPzogYm9vbGVhblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBzb3J0ZWQgcm93IG1vZGVsLiBJZiB1c2luZyBzZXJ2ZXItc2lkZSBzb3J0aW5nLCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCByZXF1aXJlZC4gVG8gdXNlIGNsaWVudC1zaWRlIHNvcnRpbmcsIHBhc3MgdGhlIGV4cG9ydGVkIGBnZXRTb3J0ZWRSb3dNb2RlbCgpYCBmcm9tIHlvdXIgYWRhcHRlciB0byB5b3VyIHRhYmxlIG9yIGltcGxlbWVudCB5b3VyIG93bi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9zb3J0aW5nI2dldHNvcnRlZHJvd21vZGVsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIGdldFNvcnRlZFJvd01vZGVsPzogKHRhYmxlOiBUYWJsZTxhbnk+KSA9PiAoKSA9PiBSb3dNb2RlbDxhbnk+XG4gIC8qKlxuICAgKiBQYXNzIGEgY3VzdG9tIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSBpZiBhIG11bHRpLXNvcnQgZXZlbnQgc2hvdWxkIGJlIHRyaWdnZXJlZC4gSXQgaXMgcGFzc2VkIHRoZSBldmVudCBmcm9tIHRoZSBzb3J0IHRvZ2dsZSBoYW5kbGVyIGFuZCBzaG91bGQgcmV0dXJuIGB0cnVlYCBpZiB0aGUgZXZlbnQgc2hvdWxkIHRyaWdnZXIgYSBtdWx0aS1zb3J0LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjaXNtdWx0aXNvcnRldmVudClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICBpc011bHRpU29ydEV2ZW50PzogKGU6IHVua25vd24pID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIEVuYWJsZXMgbWFudWFsIHNvcnRpbmcgZm9yIHRoZSB0YWJsZS4gSWYgdGhpcyBpcyBgdHJ1ZWAsIHlvdSB3aWxsIGJlIGV4cGVjdGVkIHRvIHNvcnQgeW91ciBkYXRhIGJlZm9yZSBpdCBpcyBwYXNzZWQgdG8gdGhlIHRhYmxlLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIGRvaW5nIHNlcnZlci1zaWRlIHNvcnRpbmcuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNtYW51YWxzb3J0aW5nKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIG1hbnVhbFNvcnRpbmc/OiBib29sZWFuXG4gIC8qKlxuICAgKiBTZXQgYSBtYXhpbXVtIG51bWJlciBvZiBjb2x1bW5zIHRoYXQgY2FuIGJlIG11bHRpLXNvcnRlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9zb3J0aW5nI21heG11bHRpc29ydGNvbGNvdW50KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIG1heE11bHRpU29ydENvbENvdW50PzogbnVtYmVyXG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGB1cGRhdGVyRm5gIHdoZW4gYHN0YXRlLnNvcnRpbmdgIGNoYW5nZXMuIFRoaXMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGludGVybmFsIHN0YXRlIG1hbmFnZW1lbnQsIHNvIHlvdSB3aWxsIG5lZWQgdG8gcGVyc2lzdCB0aGUgc3RhdGUgY2hhbmdlIGVpdGhlciBmdWxseSBvciBwYXJ0aWFsbHkgb3V0c2lkZSBvZiB0aGUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNvbnNvcnRpbmdjaGFuZ2UpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgb25Tb3J0aW5nQ2hhbmdlPzogT25DaGFuZ2VGbjxTb3J0aW5nU3RhdGU+XG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGFsbCBzb3J0cyB3aWxsIGRlZmF1bHQgdG8gZGVzY2VuZGluZyBhcyB0aGVpciBmaXJzdCB0b2dnbGUgc3RhdGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNzb3J0ZGVzY2ZpcnN0KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIHNvcnREZXNjRmlyc3Q/OiBib29sZWFuXG59XG5cbnR5cGUgUmVzb2x2ZWRTb3J0aW5nRm5zID0ga2V5b2YgU29ydGluZ0ZucyBleHRlbmRzIG5ldmVyXG4gID8ge1xuICAgICAgc29ydGluZ0Zucz86IFJlY29yZDxzdHJpbmcsIFNvcnRpbmdGbjxhbnk+PlxuICAgIH1cbiAgOiB7XG4gICAgICBzb3J0aW5nRm5zOiBSZWNvcmQ8a2V5b2YgU29ydGluZ0ZucywgU29ydGluZ0ZuPGFueT4+XG4gICAgfVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRpbmdPcHRpb25zPFREYXRhIGV4dGVuZHMgUm93RGF0YT5cbiAgZXh0ZW5kcyBTb3J0aW5nT3B0aW9uc0Jhc2UsXG4gICAgUmVzb2x2ZWRTb3J0aW5nRm5zIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ydGluZ0luc3RhbmNlPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICBfZ2V0U29ydGVkUm93TW9kZWw/OiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJvdyBtb2RlbCBmb3IgdGhlIHRhYmxlIGJlZm9yZSBhbnkgc29ydGluZyBoYXMgYmVlbiBhcHBsaWVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjZ2V0cHJlc29ydGVkcm93bW9kZWwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgZ2V0UHJlU29ydGVkUm93TW9kZWw6ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93IG1vZGVsIGZvciB0aGUgdGFibGUgYWZ0ZXIgc29ydGluZyBoYXMgYmVlbiBhcHBsaWVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjZ2V0c29ydGVkcm93bW9kZWwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgZ2V0U29ydGVkUm93TW9kZWw6ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICAvKipcbiAgICogUmVzZXRzIHRoZSAqKnNvcnRpbmcqKiBzdGF0ZSB0byBgaW5pdGlhbFN0YXRlLnNvcnRpbmdgLCBvciBgdHJ1ZWAgY2FuIGJlIHBhc3NlZCB0byBmb3JjZSBhIGRlZmF1bHQgYmxhbmsgc3RhdGUgcmVzZXQgdG8gYFtdYC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9zb3J0aW5nI3Jlc2V0c29ydGluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICByZXNldFNvcnRpbmc6IChkZWZhdWx0U3RhdGU/OiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBTZXRzIG9yIHVwZGF0ZXMgdGhlIGBzdGF0ZS5zb3J0aW5nYCBzdGF0ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9zb3J0aW5nI3NldHNvcnRpbmcpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgc2V0U29ydGluZzogKHVwZGF0ZXI6IFVwZGF0ZXI8U29ydGluZ1N0YXRlPikgPT4gdm9pZFxufVxuXG4vL1xuXG5leHBvcnQgY29uc3QgU29ydGluZzogVGFibGVGZWF0dXJlID0ge1xuICBnZXRJbml0aWFsU3RhdGU6IChzdGF0ZSk6IFNvcnRpbmdUYWJsZVN0YXRlID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgc29ydGluZzogW10sXG4gICAgICAuLi5zdGF0ZSxcbiAgICB9XG4gIH0sXG5cbiAgZ2V0RGVmYXVsdENvbHVtbkRlZjogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oKTogU29ydGluZ0NvbHVtbkRlZjxURGF0YT4gPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBzb3J0aW5nRm46ICdhdXRvJyxcbiAgICAgIHNvcnRVbmRlZmluZWQ6IDEsXG4gICAgfVxuICB9LFxuXG4gIGdldERlZmF1bHRPcHRpb25zOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgICB0YWJsZTogVGFibGU8VERhdGE+XG4gICk6IFNvcnRpbmdPcHRpb25zPFREYXRhPiA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uU29ydGluZ0NoYW5nZTogbWFrZVN0YXRlVXBkYXRlcignc29ydGluZycsIHRhYmxlKSxcbiAgICAgIGlzTXVsdGlTb3J0RXZlbnQ6IChlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIHJldHVybiAoZSBhcyBNb3VzZUV2ZW50KS5zaGlmdEtleVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlQ29sdW1uOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhLCBUVmFsdWU+KFxuICAgIGNvbHVtbjogQ29sdW1uPFREYXRhLCBUVmFsdWU+LFxuICAgIHRhYmxlOiBUYWJsZTxURGF0YT5cbiAgKTogdm9pZCA9PiB7XG4gICAgY29sdW1uLmdldEF1dG9Tb3J0aW5nRm4gPSAoKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdFJvd3MgPSB0YWJsZS5nZXRGaWx0ZXJlZFJvd01vZGVsKCkuZmxhdFJvd3Muc2xpY2UoMTApXG5cbiAgICAgIGxldCBpc1N0cmluZyA9IGZhbHNlXG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGZpcnN0Um93cykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJvdz8uZ2V0VmFsdWUoY29sdW1uLmlkKVxuXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICAgICAgICByZXR1cm4gc29ydGluZ0Zucy5kYXRldGltZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpc1N0cmluZyA9IHRydWVcblxuICAgICAgICAgIGlmICh2YWx1ZS5zcGxpdChyZVNwbGl0QWxwaGFOdW1lcmljKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gc29ydGluZ0Zucy5hbHBoYW51bWVyaWNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzU3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBzb3J0aW5nRm5zLnRleHRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNvcnRpbmdGbnMuYmFzaWNcbiAgICB9XG4gICAgY29sdW1uLmdldEF1dG9Tb3J0RGlyID0gKCkgPT4ge1xuICAgICAgY29uc3QgZmlyc3RSb3cgPSB0YWJsZS5nZXRGaWx0ZXJlZFJvd01vZGVsKCkuZmxhdFJvd3NbMF1cblxuICAgICAgY29uc3QgdmFsdWUgPSBmaXJzdFJvdz8uZ2V0VmFsdWUoY29sdW1uLmlkKVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gJ2FzYydcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdkZXNjJ1xuICAgIH1cbiAgICBjb2x1bW4uZ2V0U29ydGluZ0ZuID0gKCkgPT4ge1xuICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oY29sdW1uLmNvbHVtbkRlZi5zb3J0aW5nRm4pXG4gICAgICAgID8gY29sdW1uLmNvbHVtbkRlZi5zb3J0aW5nRm5cbiAgICAgICAgOiBjb2x1bW4uY29sdW1uRGVmLnNvcnRpbmdGbiA9PT0gJ2F1dG8nXG4gICAgICAgID8gY29sdW1uLmdldEF1dG9Tb3J0aW5nRm4oKVxuICAgICAgICA6IHRhYmxlLm9wdGlvbnMuc29ydGluZ0Zucz8uW2NvbHVtbi5jb2x1bW5EZWYuc29ydGluZ0ZuIGFzIHN0cmluZ10gPz9cbiAgICAgICAgICBzb3J0aW5nRm5zW2NvbHVtbi5jb2x1bW5EZWYuc29ydGluZ0ZuIGFzIEJ1aWx0SW5Tb3J0aW5nRm5dXG4gICAgfVxuICAgIGNvbHVtbi50b2dnbGVTb3J0aW5nID0gKGRlc2MsIG11bHRpKSA9PiB7XG4gICAgICAvLyBpZiAoY29sdW1uLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAvLyAgIGNvbHVtbi5jb2x1bW5zLmZvckVhY2goKGMsIGkpID0+IHtcbiAgICAgIC8vICAgICBpZiAoYy5pZCkge1xuICAgICAgLy8gICAgICAgdGFibGUudG9nZ2xlQ29sdW1uU29ydGluZyhjLmlkLCB1bmRlZmluZWQsIG11bHRpIHx8ICEhaSlcbiAgICAgIC8vICAgICB9XG4gICAgICAvLyAgIH0pXG4gICAgICAvLyAgIHJldHVyblxuICAgICAgLy8gfVxuXG4gICAgICAvLyB0aGlzIG5lZWRzIHRvIGJlIG91dHNpZGUgb2YgdGFibGUuc2V0U29ydGluZyB0byBiZSBpbiBzeW5jIHdpdGggcmVyZW5kZXJcbiAgICAgIGNvbnN0IG5leHRTb3J0aW5nT3JkZXIgPSBjb2x1bW4uZ2V0TmV4dFNvcnRpbmdPcmRlcigpXG4gICAgICBjb25zdCBoYXNNYW51YWxWYWx1ZSA9IHR5cGVvZiBkZXNjICE9PSAndW5kZWZpbmVkJyAmJiBkZXNjICE9PSBudWxsXG5cbiAgICAgIHRhYmxlLnNldFNvcnRpbmcob2xkID0+IHtcbiAgICAgICAgLy8gRmluZCBhbnkgZXhpc3Rpbmcgc29ydGluZyBmb3IgdGhpcyBjb2x1bW5cbiAgICAgICAgY29uc3QgZXhpc3RpbmdTb3J0aW5nID0gb2xkPy5maW5kKGQgPT4gZC5pZCA9PT0gY29sdW1uLmlkKVxuICAgICAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gb2xkPy5maW5kSW5kZXgoZCA9PiBkLmlkID09PSBjb2x1bW4uaWQpXG5cbiAgICAgICAgbGV0IG5ld1NvcnRpbmc6IFNvcnRpbmdTdGF0ZSA9IFtdXG5cbiAgICAgICAgLy8gV2hhdCBzaG91bGQgd2UgZG8gd2l0aCB0aGlzIHNvcnQgYWN0aW9uP1xuICAgICAgICBsZXQgc29ydEFjdGlvbjogJ2FkZCcgfCAncmVtb3ZlJyB8ICd0b2dnbGUnIHwgJ3JlcGxhY2UnXG4gICAgICAgIGxldCBuZXh0RGVzYyA9IGhhc01hbnVhbFZhbHVlID8gZGVzYyA6IG5leHRTb3J0aW5nT3JkZXIgPT09ICdkZXNjJ1xuXG4gICAgICAgIC8vIE11bHRpLW1vZGVcbiAgICAgICAgaWYgKG9sZD8ubGVuZ3RoICYmIGNvbHVtbi5nZXRDYW5NdWx0aVNvcnQoKSAmJiBtdWx0aSkge1xuICAgICAgICAgIGlmIChleGlzdGluZ1NvcnRpbmcpIHtcbiAgICAgICAgICAgIHNvcnRBY3Rpb24gPSAndG9nZ2xlJ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzb3J0QWN0aW9uID0gJ2FkZCdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm9ybWFsIG1vZGVcbiAgICAgICAgICBpZiAob2xkPy5sZW5ndGggJiYgZXhpc3RpbmdJbmRleCAhPT0gb2xkLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHNvcnRBY3Rpb24gPSAncmVwbGFjZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGV4aXN0aW5nU29ydGluZykge1xuICAgICAgICAgICAgc29ydEFjdGlvbiA9ICd0b2dnbGUnXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNvcnRBY3Rpb24gPSAncmVwbGFjZSdcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgdG9nZ2xlIHN0YXRlcyB0aGF0IHdpbGwgcmVtb3ZlIHRoZSBzb3J0aW5nXG4gICAgICAgIGlmIChzb3J0QWN0aW9uID09PSAndG9nZ2xlJykge1xuICAgICAgICAgIC8vIElmIHdlIGFyZSBcImFjdHVhbGx5XCIgdG9nZ2xpbmcgKG5vdCBhIG1hbnVhbCBzZXQgdmFsdWUpLCBzaG91bGQgd2UgcmVtb3ZlIHRoZSBzb3J0aW5nP1xuICAgICAgICAgIGlmICghaGFzTWFudWFsVmFsdWUpIHtcbiAgICAgICAgICAgIC8vIElzIG91ciBpbnRlbnRpb24gdG8gcmVtb3ZlP1xuICAgICAgICAgICAgaWYgKCFuZXh0U29ydGluZ09yZGVyKSB7XG4gICAgICAgICAgICAgIHNvcnRBY3Rpb24gPSAncmVtb3ZlJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzb3J0QWN0aW9uID09PSAnYWRkJykge1xuICAgICAgICAgIG5ld1NvcnRpbmcgPSBbXG4gICAgICAgICAgICAuLi5vbGQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiBjb2x1bW4uaWQsXG4gICAgICAgICAgICAgIGRlc2M6IG5leHREZXNjLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdXG4gICAgICAgICAgLy8gVGFrZSBsYXRlc3QgbiBjb2x1bW5zXG4gICAgICAgICAgbmV3U29ydGluZy5zcGxpY2UoXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgbmV3U29ydGluZy5sZW5ndGggLVxuICAgICAgICAgICAgICAodGFibGUub3B0aW9ucy5tYXhNdWx0aVNvcnRDb2xDb3VudCA/PyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUilcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAoc29ydEFjdGlvbiA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgICAvLyBUaGlzIGZsaXBzIChvciBzZXRzKSB0aGVcbiAgICAgICAgICBuZXdTb3J0aW5nID0gb2xkLm1hcChkID0+IHtcbiAgICAgICAgICAgIGlmIChkLmlkID09PSBjb2x1bW4uaWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5kLFxuICAgICAgICAgICAgICAgIGRlc2M6IG5leHREZXNjLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAoc29ydEFjdGlvbiA9PT0gJ3JlbW92ZScpIHtcbiAgICAgICAgICBuZXdTb3J0aW5nID0gb2xkLmZpbHRlcihkID0+IGQuaWQgIT09IGNvbHVtbi5pZClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdTb3J0aW5nID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogY29sdW1uLmlkLFxuICAgICAgICAgICAgICBkZXNjOiBuZXh0RGVzYyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ld1NvcnRpbmdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29sdW1uLmdldEZpcnN0U29ydERpciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHNvcnREZXNjRmlyc3QgPVxuICAgICAgICBjb2x1bW4uY29sdW1uRGVmLnNvcnREZXNjRmlyc3QgPz9cbiAgICAgICAgdGFibGUub3B0aW9ucy5zb3J0RGVzY0ZpcnN0ID8/XG4gICAgICAgIGNvbHVtbi5nZXRBdXRvU29ydERpcigpID09PSAnZGVzYydcbiAgICAgIHJldHVybiBzb3J0RGVzY0ZpcnN0ID8gJ2Rlc2MnIDogJ2FzYydcbiAgICB9XG5cbiAgICBjb2x1bW4uZ2V0TmV4dFNvcnRpbmdPcmRlciA9IChtdWx0aT86IGJvb2xlYW4pID0+IHtcbiAgICAgIGNvbnN0IGZpcnN0U29ydERpcmVjdGlvbiA9IGNvbHVtbi5nZXRGaXJzdFNvcnREaXIoKVxuICAgICAgY29uc3QgaXNTb3J0ZWQgPSBjb2x1bW4uZ2V0SXNTb3J0ZWQoKVxuXG4gICAgICBpZiAoIWlzU29ydGVkKSB7XG4gICAgICAgIHJldHVybiBmaXJzdFNvcnREaXJlY3Rpb25cbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBpc1NvcnRlZCAhPT0gZmlyc3RTb3J0RGlyZWN0aW9uICYmXG4gICAgICAgICh0YWJsZS5vcHRpb25zLmVuYWJsZVNvcnRpbmdSZW1vdmFsID8/IHRydWUpICYmIC8vIElmIGVuYWJsZVNvcnRSZW1vdmUsIGVuYWJsZSBpbiBnZW5lcmFsXG4gICAgICAgIChtdWx0aSA/IHRhYmxlLm9wdGlvbnMuZW5hYmxlTXVsdGlSZW1vdmUgPz8gdHJ1ZSA6IHRydWUpIC8vIElmIG11bHRpLCBkb24ndCBhbGxvdyBpZiBlbmFibGVNdWx0aVJlbW92ZSkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICByZXR1cm4gaXNTb3J0ZWQgPT09ICdkZXNjJyA/ICdhc2MnIDogJ2Rlc2MnXG4gICAgfVxuXG4gICAgY29sdW1uLmdldENhblNvcnQgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoY29sdW1uLmNvbHVtbkRlZi5lbmFibGVTb3J0aW5nID8/IHRydWUpICYmXG4gICAgICAgICh0YWJsZS5vcHRpb25zLmVuYWJsZVNvcnRpbmcgPz8gdHJ1ZSkgJiZcbiAgICAgICAgISFjb2x1bW4uYWNjZXNzb3JGblxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbHVtbi5nZXRDYW5NdWx0aVNvcnQgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb2x1bW4uY29sdW1uRGVmLmVuYWJsZU11bHRpU29ydCA/P1xuICAgICAgICB0YWJsZS5vcHRpb25zLmVuYWJsZU11bHRpU29ydCA/P1xuICAgICAgICAhIWNvbHVtbi5hY2Nlc3NvckZuXG4gICAgICApXG4gICAgfVxuXG4gICAgY29sdW1uLmdldElzU29ydGVkID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29sdW1uU29ydCA9IHRhYmxlLmdldFN0YXRlKCkuc29ydGluZz8uZmluZChkID0+IGQuaWQgPT09IGNvbHVtbi5pZClcblxuICAgICAgcmV0dXJuICFjb2x1bW5Tb3J0ID8gZmFsc2UgOiBjb2x1bW5Tb3J0LmRlc2MgPyAnZGVzYycgOiAnYXNjJ1xuICAgIH1cblxuICAgIGNvbHVtbi5nZXRTb3J0SW5kZXggPSAoKSA9PlxuICAgICAgdGFibGUuZ2V0U3RhdGUoKS5zb3J0aW5nPy5maW5kSW5kZXgoZCA9PiBkLmlkID09PSBjb2x1bW4uaWQpID8/IC0xXG5cbiAgICBjb2x1bW4uY2xlYXJTb3J0aW5nID0gKCkgPT4ge1xuICAgICAgLy9jbGVhciBzb3J0aW5nIGZvciBqdXN0IDEgY29sdW1uXG4gICAgICB0YWJsZS5zZXRTb3J0aW5nKG9sZCA9PlxuICAgICAgICBvbGQ/Lmxlbmd0aCA/IG9sZC5maWx0ZXIoZCA9PiBkLmlkICE9PSBjb2x1bW4uaWQpIDogW11cbiAgICAgIClcbiAgICB9XG5cbiAgICBjb2x1bW4uZ2V0VG9nZ2xlU29ydGluZ0hhbmRsZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjYW5Tb3J0ID0gY29sdW1uLmdldENhblNvcnQoKVxuXG4gICAgICByZXR1cm4gKGU6IHVua25vd24pID0+IHtcbiAgICAgICAgaWYgKCFjYW5Tb3J0KSByZXR1cm5cbiAgICAgICAgOyhlIGFzIGFueSkucGVyc2lzdD8uKClcbiAgICAgICAgY29sdW1uLnRvZ2dsZVNvcnRpbmc/LihcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgY29sdW1uLmdldENhbk11bHRpU29ydCgpID8gdGFibGUub3B0aW9ucy5pc011bHRpU29ydEV2ZW50Py4oZSkgOiBmYWxzZVxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZVRhYmxlOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPih0YWJsZTogVGFibGU8VERhdGE+KTogdm9pZCA9PiB7XG4gICAgdGFibGUuc2V0U29ydGluZyA9IHVwZGF0ZXIgPT4gdGFibGUub3B0aW9ucy5vblNvcnRpbmdDaGFuZ2U/Lih1cGRhdGVyKVxuICAgIHRhYmxlLnJlc2V0U29ydGluZyA9IGRlZmF1bHRTdGF0ZSA9PiB7XG4gICAgICB0YWJsZS5zZXRTb3J0aW5nKGRlZmF1bHRTdGF0ZSA/IFtdIDogdGFibGUuaW5pdGlhbFN0YXRlPy5zb3J0aW5nID8/IFtdKVxuICAgIH1cbiAgICB0YWJsZS5nZXRQcmVTb3J0ZWRSb3dNb2RlbCA9ICgpID0+IHRhYmxlLmdldEdyb3VwZWRSb3dNb2RlbCgpXG4gICAgdGFibGUuZ2V0U29ydGVkUm93TW9kZWwgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRhYmxlLl9nZXRTb3J0ZWRSb3dNb2RlbCAmJiB0YWJsZS5vcHRpb25zLmdldFNvcnRlZFJvd01vZGVsKSB7XG4gICAgICAgIHRhYmxlLl9nZXRTb3J0ZWRSb3dNb2RlbCA9IHRhYmxlLm9wdGlvbnMuZ2V0U29ydGVkUm93TW9kZWwodGFibGUpXG4gICAgICB9XG5cbiAgICAgIGlmICh0YWJsZS5vcHRpb25zLm1hbnVhbFNvcnRpbmcgfHwgIXRhYmxlLl9nZXRTb3J0ZWRSb3dNb2RlbCkge1xuICAgICAgICByZXR1cm4gdGFibGUuZ2V0UHJlU29ydGVkUm93TW9kZWwoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFibGUuX2dldFNvcnRlZFJvd01vZGVsKClcbiAgICB9XG4gIH0sXG59XG4iLCJpbXBvcnQgeyBUYWJsZUZlYXR1cmUgfSBmcm9tICcuLi9jb3JlL3RhYmxlJ1xuaW1wb3J0IHtcbiAgQ2VsbCxcbiAgQ29sdW1uLFxuICBPbkNoYW5nZUZuLFxuICBUYWJsZSxcbiAgVXBkYXRlcixcbiAgUm93LFxuICBSb3dEYXRhLFxufSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IG1ha2VTdGF0ZVVwZGF0ZXIsIG1lbW8gfSBmcm9tICcuLi91dGlscydcblxuZXhwb3J0IHR5cGUgVmlzaWJpbGl0eVN0YXRlID0gUmVjb3JkPHN0cmluZywgYm9vbGVhbj5cblxuZXhwb3J0IGludGVyZmFjZSBWaXNpYmlsaXR5VGFibGVTdGF0ZSB7XG4gIGNvbHVtblZpc2liaWxpdHk6IFZpc2liaWxpdHlTdGF0ZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZpc2liaWxpdHlPcHRpb25zIHtcbiAgZW5hYmxlSGlkaW5nPzogYm9vbGVhblxuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCBhbiBgdXBkYXRlckZuYCB3aGVuIGBzdGF0ZS5jb2x1bW5WaXNpYmlsaXR5YCBjaGFuZ2VzLiBUaGlzIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBpbnRlcm5hbCBzdGF0ZSBtYW5hZ2VtZW50LCBzbyB5b3Ugd2lsbCBuZWVkIHRvIHBlcnNpc3QgdGhlIHN0YXRlIGNoYW5nZSBlaXRoZXIgZnVsbHkgb3IgcGFydGlhbGx5IG91dHNpZGUgb2YgdGhlIHRhYmxlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi12aXNpYmlsaXR5I29uY29sdW1udmlzaWJpbGl0eWNoYW5nZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi12aXNpYmlsaXR5KVxuICAgKi9cbiAgb25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlPzogT25DaGFuZ2VGbjxWaXNpYmlsaXR5U3RhdGU+XG59XG5cbmV4cG9ydCB0eXBlIFZpc2liaWxpdHlEZWZhdWx0T3B0aW9ucyA9IFBpY2s8XG4gIFZpc2liaWxpdHlPcHRpb25zLFxuICAnb25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlJ1xuPlxuXG5leHBvcnQgaW50ZXJmYWNlIFZpc2liaWxpdHlJbnN0YW5jZTxURGF0YSBleHRlbmRzIFJvd0RhdGE+IHtcbiAgLyoqXG4gICAqIElmIGNvbHVtbiBwaW5uaW5nLCByZXR1cm5zIGEgZmxhdCBhcnJheSBvZiBsZWFmLW5vZGUgY29sdW1ucyB0aGF0IGFyZSB2aXNpYmxlIGluIHRoZSB1bnBpbm5lZC9jZW50ZXIgcG9ydGlvbiBvZiB0aGUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXZpc2liaWxpdHkjZ2V0Y2VudGVydmlzaWJsZWxlYWZjb2x1bW5zKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXZpc2liaWxpdHkpXG4gICAqL1xuICBnZXRDZW50ZXJWaXNpYmxlTGVhZkNvbHVtbnM6ICgpID0+IENvbHVtbjxURGF0YSwgdW5rbm93bj5bXVxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIGFsbCBjb2x1bW5zIGFyZSB2aXNpYmxlXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXZpc2liaWxpdHkjZ2V0aXNhbGxjb2x1bW5zdmlzaWJsZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi12aXNpYmlsaXR5KVxuICAgKi9cbiAgZ2V0SXNBbGxDb2x1bW5zVmlzaWJsZTogKCkgPT4gYm9vbGVhblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIGFueSBjb2x1bW5zIGFyZSB2aXNpYmxlXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXZpc2liaWxpdHkjZ2V0aXNzb21lY29sdW1uc3Zpc2libGUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tdmlzaWJpbGl0eSlcbiAgICovXG4gIGdldElzU29tZUNvbHVtbnNWaXNpYmxlOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBJZiBjb2x1bW4gcGlubmluZywgcmV0dXJucyBhIGZsYXQgYXJyYXkgb2YgbGVhZi1ub2RlIGNvbHVtbnMgdGhhdCBhcmUgdmlzaWJsZSBpbiB0aGUgbGVmdCBwb3J0aW9uIG9mIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tdmlzaWJpbGl0eSNnZXRsZWZ0dmlzaWJsZWxlYWZjb2x1bW5zKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXZpc2liaWxpdHkpXG4gICAqL1xuICBnZXRMZWZ0VmlzaWJsZUxlYWZDb2x1bW5zOiAoKSA9PiBDb2x1bW48VERhdGEsIHVua25vd24+W11cbiAgLyoqXG4gICAqIElmIGNvbHVtbiBwaW5uaW5nLCByZXR1cm5zIGEgZmxhdCBhcnJheSBvZiBsZWFmLW5vZGUgY29sdW1ucyB0aGF0IGFyZSB2aXNpYmxlIGluIHRoZSByaWdodCBwb3J0aW9uIG9mIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tdmlzaWJpbGl0eSNnZXRyaWdodHZpc2libGVsZWFmY29sdW1ucylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi12aXNpYmlsaXR5KVxuICAgKi9cbiAgZ2V0UmlnaHRWaXNpYmxlTGVhZkNvbHVtbnM6ICgpID0+IENvbHVtbjxURGF0YSwgdW5rbm93bj5bXVxuICAvKipcbiAgICogUmV0dXJucyBhIGhhbmRsZXIgZm9yIHRvZ2dsaW5nIHRoZSB2aXNpYmlsaXR5IG9mIGFsbCBjb2x1bW5zLCBtZWFudCB0byBiZSBib3VuZCB0byBhIGBpbnB1dFt0eXBlPWNoZWNrYm94XWAgZWxlbWVudC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tdmlzaWJpbGl0eSNnZXR0b2dnbGVhbGxjb2x1bW5zdmlzaWJpbGl0eWhhbmRsZXIpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tdmlzaWJpbGl0eSlcbiAgICovXG4gIGdldFRvZ2dsZUFsbENvbHVtbnNWaXNpYmlsaXR5SGFuZGxlcjogKCkgPT4gKGV2ZW50OiB1bmtub3duKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZmxhdCBhcnJheSBvZiBjb2x1bW5zIHRoYXQgYXJlIHZpc2libGUsIGluY2x1ZGluZyBwYXJlbnQgY29sdW1ucy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tdmlzaWJpbGl0eSNnZXR2aXNpYmxlZmxhdGNvbHVtbnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tdmlzaWJpbGl0eSlcbiAgICovXG4gIGdldFZpc2libGVGbGF0Q29sdW1uczogKCkgPT4gQ29sdW1uPFREYXRhLCB1bmtub3duPltdXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZmxhdCBhcnJheSBvZiBsZWFmLW5vZGUgY29sdW1ucyB0aGF0IGFyZSB2aXNpYmxlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi12aXNpYmlsaXR5I2dldHZpc2libGVsZWFmY29sdW1ucylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi12aXNpYmlsaXR5KVxuICAgKi9cbiAgZ2V0VmlzaWJsZUxlYWZDb2x1bW5zOiAoKSA9PiBDb2x1bW48VERhdGEsIHVua25vd24+W11cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgY29sdW1uIHZpc2liaWxpdHkgc3RhdGUgdG8gdGhlIGluaXRpYWwgc3RhdGUuIElmIGBkZWZhdWx0U3RhdGVgIGlzIHByb3ZpZGVkLCB0aGUgc3RhdGUgd2lsbCBiZSByZXNldCB0byBge31gXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXZpc2liaWxpdHkjcmVzZXRjb2x1bW52aXNpYmlsaXR5KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXZpc2liaWxpdHkpXG4gICAqL1xuICByZXNldENvbHVtblZpc2liaWxpdHk6IChkZWZhdWx0U3RhdGU/OiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBTZXRzIG9yIHVwZGF0ZXMgdGhlIGBzdGF0ZS5jb2x1bW5WaXNpYmlsaXR5YCBzdGF0ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tdmlzaWJpbGl0eSNzZXRjb2x1bW52aXNpYmlsaXR5KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXZpc2liaWxpdHkpXG4gICAqL1xuICBzZXRDb2x1bW5WaXNpYmlsaXR5OiAodXBkYXRlcjogVXBkYXRlcjxWaXNpYmlsaXR5U3RhdGU+KSA9PiB2b2lkXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSB2aXNpYmlsaXR5IG9mIGFsbCBjb2x1bW5zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi12aXNpYmlsaXR5I3RvZ2dsZWFsbGNvbHVtbnN2aXNpYmxlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXZpc2liaWxpdHkpXG4gICAqL1xuICB0b2dnbGVBbGxDb2x1bW5zVmlzaWJsZTogKHZhbHVlPzogYm9vbGVhbikgPT4gdm9pZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZpc2liaWxpdHlDb2x1bW5EZWYge1xuICBlbmFibGVIaWRpbmc/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlzaWJpbGl0eVJvdzxURGF0YSBleHRlbmRzIFJvd0RhdGE+IHtcbiAgX2dldEFsbFZpc2libGVDZWxsczogKCkgPT4gQ2VsbDxURGF0YSwgdW5rbm93bj5bXVxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBjZWxscyB0aGF0IGFjY291bnQgZm9yIGNvbHVtbiB2aXNpYmlsaXR5IGZvciB0aGUgcm93LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi12aXNpYmlsaXR5I2dldHZpc2libGVjZWxscylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi12aXNpYmlsaXR5KVxuICAgKi9cbiAgZ2V0VmlzaWJsZUNlbGxzOiAoKSA9PiBDZWxsPFREYXRhLCB1bmtub3duPltdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlzaWJpbGl0eUNvbHVtbiB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbHVtbiBjYW4gYmUgaGlkZGVuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXZpc2liaWxpdHkjZ2V0Y2FuaGlkZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi12aXNpYmlsaXR5KVxuICAgKi9cbiAgZ2V0Q2FuSGlkZTogKCkgPT4gYm9vbGVhblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgdmlzaWJsZVxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi12aXNpYmlsaXR5I2dldGlzdmlzaWJsZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi12aXNpYmlsaXR5KVxuICAgKi9cbiAgZ2V0SXNWaXNpYmxlOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byB0b2dnbGUgdGhlIGNvbHVtbiB2aXNpYmlsaXR5LiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGJpbmQgdG8gYW4gZXZlbnQgaGFuZGxlciB0byBhIGNoZWNrYm94LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi12aXNpYmlsaXR5I2dldHRvZ2dsZXZpc2liaWxpdHloYW5kbGVyKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXZpc2liaWxpdHkpXG4gICAqL1xuICBnZXRUb2dnbGVWaXNpYmlsaXR5SGFuZGxlcjogKCkgPT4gKGV2ZW50OiB1bmtub3duKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjb2x1bW4uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXZpc2liaWxpdHkjdG9nZ2xldmlzaWJpbGl0eSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi12aXNpYmlsaXR5KVxuICAgKi9cbiAgdG9nZ2xlVmlzaWJpbGl0eTogKHZhbHVlPzogYm9vbGVhbikgPT4gdm9pZFxufVxuXG4vL1xuXG5leHBvcnQgY29uc3QgVmlzaWJpbGl0eTogVGFibGVGZWF0dXJlID0ge1xuICBnZXRJbml0aWFsU3RhdGU6IChzdGF0ZSk6IFZpc2liaWxpdHlUYWJsZVN0YXRlID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uVmlzaWJpbGl0eToge30sXG4gICAgICAuLi5zdGF0ZSxcbiAgICB9XG4gIH0sXG5cbiAgZ2V0RGVmYXVsdE9wdGlvbnM6IDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KFxuICAgIHRhYmxlOiBUYWJsZTxURGF0YT5cbiAgKTogVmlzaWJpbGl0eURlZmF1bHRPcHRpb25zID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgb25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlOiBtYWtlU3RhdGVVcGRhdGVyKCdjb2x1bW5WaXNpYmlsaXR5JywgdGFibGUpLFxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVDb2x1bW46IDxURGF0YSBleHRlbmRzIFJvd0RhdGEsIFRWYWx1ZT4oXG4gICAgY29sdW1uOiBDb2x1bW48VERhdGEsIFRWYWx1ZT4sXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiB2b2lkID0+IHtcbiAgICBjb2x1bW4udG9nZ2xlVmlzaWJpbGl0eSA9IHZhbHVlID0+IHtcbiAgICAgIGlmIChjb2x1bW4uZ2V0Q2FuSGlkZSgpKSB7XG4gICAgICAgIHRhYmxlLnNldENvbHVtblZpc2liaWxpdHkob2xkID0+ICh7XG4gICAgICAgICAgLi4ub2xkLFxuICAgICAgICAgIFtjb2x1bW4uaWRdOiB2YWx1ZSA/PyAhY29sdW1uLmdldElzVmlzaWJsZSgpLFxuICAgICAgICB9KSlcbiAgICAgIH1cbiAgICB9XG4gICAgY29sdW1uLmdldElzVmlzaWJsZSA9ICgpID0+IHtcbiAgICAgIHJldHVybiB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtblZpc2liaWxpdHk/Lltjb2x1bW4uaWRdID8/IHRydWVcbiAgICB9XG5cbiAgICBjb2x1bW4uZ2V0Q2FuSGlkZSA9ICgpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChjb2x1bW4uY29sdW1uRGVmLmVuYWJsZUhpZGluZyA/PyB0cnVlKSAmJlxuICAgICAgICAodGFibGUub3B0aW9ucy5lbmFibGVIaWRpbmcgPz8gdHJ1ZSlcbiAgICAgIClcbiAgICB9XG4gICAgY29sdW1uLmdldFRvZ2dsZVZpc2liaWxpdHlIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIChlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbHVtbi50b2dnbGVWaXNpYmlsaXR5Py4oXG4gICAgICAgICAgKChlIGFzIE1vdXNlRXZlbnQpLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlUm93OiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgICByb3c6IFJvdzxURGF0YT4sXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiB2b2lkID0+IHtcbiAgICByb3cuX2dldEFsbFZpc2libGVDZWxscyA9IG1lbW8oXG4gICAgICAoKSA9PiBbcm93LmdldEFsbENlbGxzKCksIHRhYmxlLmdldFN0YXRlKCkuY29sdW1uVmlzaWJpbGl0eV0sXG4gICAgICBjZWxscyA9PiB7XG4gICAgICAgIHJldHVybiBjZWxscy5maWx0ZXIoY2VsbCA9PiBjZWxsLmNvbHVtbi5nZXRJc1Zpc2libGUoKSlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJyAmJiAncm93Ll9nZXRBbGxWaXNpYmxlQ2VsbHMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnUm93cyxcbiAgICAgIH1cbiAgICApXG4gICAgcm93LmdldFZpc2libGVDZWxscyA9IG1lbW8oXG4gICAgICAoKSA9PiBbXG4gICAgICAgIHJvdy5nZXRMZWZ0VmlzaWJsZUNlbGxzKCksXG4gICAgICAgIHJvdy5nZXRDZW50ZXJWaXNpYmxlQ2VsbHMoKSxcbiAgICAgICAgcm93LmdldFJpZ2h0VmlzaWJsZUNlbGxzKCksXG4gICAgICBdLFxuICAgICAgKGxlZnQsIGNlbnRlciwgcmlnaHQpID0+IFsuLi5sZWZ0LCAuLi5jZW50ZXIsIC4uLnJpZ2h0XSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAncm93LmdldFZpc2libGVDZWxscycsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdSb3dzLFxuICAgICAgfVxuICAgIClcbiAgfSxcblxuICBjcmVhdGVUYWJsZTogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4odGFibGU6IFRhYmxlPFREYXRhPik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG1ha2VWaXNpYmxlQ29sdW1uc01ldGhvZCA9IChcbiAgICAgIGtleTogc3RyaW5nLFxuICAgICAgZ2V0Q29sdW1uczogKCkgPT4gQ29sdW1uPFREYXRhLCB1bmtub3duPltdXG4gICAgKTogKCgpID0+IENvbHVtbjxURGF0YSwgdW5rbm93bj5bXSkgPT4ge1xuICAgICAgcmV0dXJuIG1lbW8oXG4gICAgICAgICgpID0+IFtcbiAgICAgICAgICBnZXRDb2x1bW5zKCksXG4gICAgICAgICAgZ2V0Q29sdW1ucygpXG4gICAgICAgICAgICAuZmlsdGVyKGQgPT4gZC5nZXRJc1Zpc2libGUoKSlcbiAgICAgICAgICAgIC5tYXAoZCA9PiBkLmlkKVxuICAgICAgICAgICAgLmpvaW4oJ18nKSxcbiAgICAgICAgXSxcbiAgICAgICAgY29sdW1ucyA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbHVtbnMuZmlsdGVyKGQgPT4gZC5nZXRJc1Zpc2libGU/LigpKVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdDb2x1bW5zLFxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuXG4gICAgdGFibGUuZ2V0VmlzaWJsZUZsYXRDb2x1bW5zID0gbWFrZVZpc2libGVDb2x1bW5zTWV0aG9kKFxuICAgICAgJ2dldFZpc2libGVGbGF0Q29sdW1ucycsXG4gICAgICAoKSA9PiB0YWJsZS5nZXRBbGxGbGF0Q29sdW1ucygpXG4gICAgKVxuICAgIHRhYmxlLmdldFZpc2libGVMZWFmQ29sdW1ucyA9IG1ha2VWaXNpYmxlQ29sdW1uc01ldGhvZChcbiAgICAgICdnZXRWaXNpYmxlTGVhZkNvbHVtbnMnLFxuICAgICAgKCkgPT4gdGFibGUuZ2V0QWxsTGVhZkNvbHVtbnMoKVxuICAgIClcbiAgICB0YWJsZS5nZXRMZWZ0VmlzaWJsZUxlYWZDb2x1bW5zID0gbWFrZVZpc2libGVDb2x1bW5zTWV0aG9kKFxuICAgICAgJ2dldExlZnRWaXNpYmxlTGVhZkNvbHVtbnMnLFxuICAgICAgKCkgPT4gdGFibGUuZ2V0TGVmdExlYWZDb2x1bW5zKClcbiAgICApXG4gICAgdGFibGUuZ2V0UmlnaHRWaXNpYmxlTGVhZkNvbHVtbnMgPSBtYWtlVmlzaWJsZUNvbHVtbnNNZXRob2QoXG4gICAgICAnZ2V0UmlnaHRWaXNpYmxlTGVhZkNvbHVtbnMnLFxuICAgICAgKCkgPT4gdGFibGUuZ2V0UmlnaHRMZWFmQ29sdW1ucygpXG4gICAgKVxuICAgIHRhYmxlLmdldENlbnRlclZpc2libGVMZWFmQ29sdW1ucyA9IG1ha2VWaXNpYmxlQ29sdW1uc01ldGhvZChcbiAgICAgICdnZXRDZW50ZXJWaXNpYmxlTGVhZkNvbHVtbnMnLFxuICAgICAgKCkgPT4gdGFibGUuZ2V0Q2VudGVyTGVhZkNvbHVtbnMoKVxuICAgIClcblxuICAgIHRhYmxlLnNldENvbHVtblZpc2liaWxpdHkgPSB1cGRhdGVyID0+XG4gICAgICB0YWJsZS5vcHRpb25zLm9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZT8uKHVwZGF0ZXIpXG5cbiAgICB0YWJsZS5yZXNldENvbHVtblZpc2liaWxpdHkgPSBkZWZhdWx0U3RhdGUgPT4ge1xuICAgICAgdGFibGUuc2V0Q29sdW1uVmlzaWJpbGl0eShcbiAgICAgICAgZGVmYXVsdFN0YXRlID8ge30gOiB0YWJsZS5pbml0aWFsU3RhdGUuY29sdW1uVmlzaWJpbGl0eSA/PyB7fVxuICAgICAgKVxuICAgIH1cblxuICAgIHRhYmxlLnRvZ2dsZUFsbENvbHVtbnNWaXNpYmxlID0gdmFsdWUgPT4ge1xuICAgICAgdmFsdWUgPSB2YWx1ZSA/PyAhdGFibGUuZ2V0SXNBbGxDb2x1bW5zVmlzaWJsZSgpXG5cbiAgICAgIHRhYmxlLnNldENvbHVtblZpc2liaWxpdHkoXG4gICAgICAgIHRhYmxlLmdldEFsbExlYWZDb2x1bW5zKCkucmVkdWNlKFxuICAgICAgICAgIChvYmosIGNvbHVtbikgPT4gKHtcbiAgICAgICAgICAgIC4uLm9iaixcbiAgICAgICAgICAgIFtjb2x1bW4uaWRdOiAhdmFsdWUgPyAhY29sdW1uLmdldENhbkhpZGU/LigpIDogdmFsdWUsXG4gICAgICAgICAgfSksXG4gICAgICAgICAge31cbiAgICAgICAgKVxuICAgICAgKVxuICAgIH1cblxuICAgIHRhYmxlLmdldElzQWxsQ29sdW1uc1Zpc2libGUgPSAoKSA9PlxuICAgICAgIXRhYmxlLmdldEFsbExlYWZDb2x1bW5zKCkuc29tZShjb2x1bW4gPT4gIWNvbHVtbi5nZXRJc1Zpc2libGU/LigpKVxuXG4gICAgdGFibGUuZ2V0SXNTb21lQ29sdW1uc1Zpc2libGUgPSAoKSA9PlxuICAgICAgdGFibGUuZ2V0QWxsTGVhZkNvbHVtbnMoKS5zb21lKGNvbHVtbiA9PiBjb2x1bW4uZ2V0SXNWaXNpYmxlPy4oKSlcblxuICAgIHRhYmxlLmdldFRvZ2dsZUFsbENvbHVtbnNWaXNpYmlsaXR5SGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHJldHVybiAoZTogdW5rbm93bikgPT4ge1xuICAgICAgICB0YWJsZS50b2dnbGVBbGxDb2x1bW5zVmlzaWJsZShcbiAgICAgICAgICAoKGUgYXMgTW91c2VFdmVudCkudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpPy5jaGVja2VkXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59XG4iLCJpbXBvcnQgeyBmdW5jdGlvbmFsVXBkYXRlLCBtZW1vLCBSZXF1aXJlZEtleXMgfSBmcm9tICcuLi91dGlscydcblxuaW1wb3J0IHtcbiAgVXBkYXRlcixcbiAgVGFibGVPcHRpb25zUmVzb2x2ZWQsXG4gIFRhYmxlU3RhdGUsXG4gIFRhYmxlLFxuICBJbml0aWFsVGFibGVTdGF0ZSxcbiAgUm93LFxuICBDb2x1bW4sXG4gIFJvd01vZGVsLFxuICBDb2x1bW5EZWYsXG4gIFRhYmxlT3B0aW9ucyxcbiAgUm93RGF0YSxcbiAgVGFibGVNZXRhLFxuICBDb2x1bW5EZWZSZXNvbHZlZCxcbiAgR3JvdXBDb2x1bW5EZWYsXG59IGZyb20gJy4uL3R5cGVzJ1xuXG4vL1xuaW1wb3J0IHsgY3JlYXRlQ29sdW1uIH0gZnJvbSAnLi9jb2x1bW4nXG5pbXBvcnQgeyBIZWFkZXJzIH0gZnJvbSAnLi9oZWFkZXJzJ1xuLy9cblxuaW1wb3J0IHsgQ29sdW1uU2l6aW5nIH0gZnJvbSAnLi4vZmVhdHVyZXMvQ29sdW1uU2l6aW5nJ1xuaW1wb3J0IHsgRXhwYW5kaW5nIH0gZnJvbSAnLi4vZmVhdHVyZXMvRXhwYW5kaW5nJ1xuaW1wb3J0IHsgRmlsdGVycyB9IGZyb20gJy4uL2ZlYXR1cmVzL0ZpbHRlcnMnXG5pbXBvcnQgeyBHcm91cGluZyB9IGZyb20gJy4uL2ZlYXR1cmVzL0dyb3VwaW5nJ1xuaW1wb3J0IHsgT3JkZXJpbmcgfSBmcm9tICcuLi9mZWF0dXJlcy9PcmRlcmluZydcbmltcG9ydCB7IFBhZ2luYXRpb24gfSBmcm9tICcuLi9mZWF0dXJlcy9QYWdpbmF0aW9uJ1xuaW1wb3J0IHsgUGlubmluZyB9IGZyb20gJy4uL2ZlYXR1cmVzL1Bpbm5pbmcnXG5pbXBvcnQgeyBSb3dTZWxlY3Rpb24gfSBmcm9tICcuLi9mZWF0dXJlcy9Sb3dTZWxlY3Rpb24nXG5pbXBvcnQgeyBTb3J0aW5nIH0gZnJvbSAnLi4vZmVhdHVyZXMvU29ydGluZydcbmltcG9ydCB7IFZpc2liaWxpdHkgfSBmcm9tICcuLi9mZWF0dXJlcy9WaXNpYmlsaXR5J1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlRmVhdHVyZSB7XG4gIGNyZWF0ZUNlbGw/OiAoY2VsbDogYW55LCBjb2x1bW46IGFueSwgcm93OiBhbnksIHRhYmxlOiBhbnkpID0+IGFueVxuICBjcmVhdGVDb2x1bW4/OiAoY29sdW1uOiBhbnksIHRhYmxlOiBhbnkpID0+IGFueVxuICBjcmVhdGVIZWFkZXI/OiAoY29sdW1uOiBhbnksIHRhYmxlOiBhbnkpID0+IGFueVxuICBjcmVhdGVSb3c/OiAocm93OiBhbnksIHRhYmxlOiBhbnkpID0+IGFueVxuICBjcmVhdGVUYWJsZT86ICh0YWJsZTogYW55KSA9PiBhbnlcbiAgZ2V0RGVmYXVsdENvbHVtbkRlZj86ICgpID0+IGFueVxuICBnZXREZWZhdWx0T3B0aW9ucz86ICh0YWJsZTogYW55KSA9PiBhbnlcbiAgZ2V0SW5pdGlhbFN0YXRlPzogKGluaXRpYWxTdGF0ZT86IEluaXRpYWxUYWJsZVN0YXRlKSA9PiBhbnlcbn1cblxuY29uc3QgZmVhdHVyZXMgPSBbXG4gIEhlYWRlcnMsXG4gIFZpc2liaWxpdHksXG4gIE9yZGVyaW5nLFxuICBQaW5uaW5nLFxuICBGaWx0ZXJzLFxuICBTb3J0aW5nLFxuICBHcm91cGluZyxcbiAgRXhwYW5kaW5nLFxuICBQYWdpbmF0aW9uLFxuICBSb3dTZWxlY3Rpb24sXG4gIENvbHVtblNpemluZyxcbl0gYXMgY29uc3RcblxuLy9cblxuZXhwb3J0IGludGVyZmFjZSBDb3JlVGFibGVTdGF0ZSB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIENvcmVPcHRpb25zPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICAvKipcbiAgICogU2V0IHRoaXMgb3B0aW9uIHRvIG92ZXJyaWRlIGFueSBvZiB0aGUgYGF1dG9SZXNldC4uLmAgZmVhdHVyZSBvcHRpb25zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjYXV0b3Jlc2V0YWxsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvdGFibGVzKVxuICAgKi9cbiAgYXV0b1Jlc2V0QWxsPzogYm9vbGVhblxuICAvKipcbiAgICogVGhlIGFycmF5IG9mIGNvbHVtbiBkZWZzIHRvIHVzZSBmb3IgdGhlIHRhYmxlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjY29sdW1ucylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIGNvbHVtbnM6IENvbHVtbkRlZjxURGF0YSwgYW55PltdXG4gIC8qKlxuICAgKiBUaGUgZGF0YSBmb3IgdGhlIHRhYmxlIHRvIGRpc3BsYXkuIFRoaXMgYXJyYXkgc2hvdWxkIG1hdGNoIHRoZSB0eXBlIHlvdSBwcm92aWRlZCB0byBgdGFibGUuc2V0Um93VHlwZTwuLi4+YC4gQ29sdW1ucyBjYW4gYWNjZXNzIHRoaXMgZGF0YSB2aWEgc3RyaW5nL2luZGV4IG9yIGEgZnVuY3Rpb25hbCBhY2Nlc3Nvci4gV2hlbiB0aGUgYGRhdGFgIG9wdGlvbiBjaGFuZ2VzIHJlZmVyZW5jZSwgdGhlIHRhYmxlIHdpbGwgcmVwcm9jZXNzIHRoZSBkYXRhLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjZGF0YSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIGRhdGE6IFREYXRhW11cbiAgLyoqXG4gICAqIFNldCB0aGlzIG9wdGlvbiB0byBgdHJ1ZWAgdG8gb3V0cHV0IGFsbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNkZWJ1Z2FsbClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIGRlYnVnQWxsPzogYm9vbGVhblxuICAvKipcbiAgICogU2V0IHRoaXMgb3B0aW9uIHRvIGB0cnVlYCB0byBvdXRwdXQgY29sdW1uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byB0aGUgY29uc29sZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3RhYmxlI2RlYnVnY29sdW1ucylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIGRlYnVnQ29sdW1ucz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFNldCB0aGlzIG9wdGlvbiB0byBgdHJ1ZWAgdG8gb3V0cHV0IGhlYWRlciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNkZWJ1Z2hlYWRlcnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBkZWJ1Z0hlYWRlcnM/OiBib29sZWFuXG4gIC8qKlxuICAgKiBTZXQgdGhpcyBvcHRpb24gdG8gYHRydWVgIHRvIG91dHB1dCByb3cgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIHRoZSBjb25zb2xlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjZGVidWdyb3dzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvdGFibGVzKVxuICAgKi9cbiAgZGVidWdSb3dzPzogYm9vbGVhblxuICAvKipcbiAgICogU2V0IHRoaXMgb3B0aW9uIHRvIGB0cnVlYCB0byBvdXRwdXQgdGFibGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIHRoZSBjb25zb2xlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjZGVidWd0YWJsZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIGRlYnVnVGFibGU/OiBib29sZWFuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGNvbHVtbiBvcHRpb25zIHRvIHVzZSBmb3IgYWxsIGNvbHVtbiBkZWZzIHN1cHBsaWVkIHRvIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3RhYmxlI2RlZmF1bHRjb2x1bW4pXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBkZWZhdWx0Q29sdW1uPzogUGFydGlhbDxDb2x1bW5EZWY8VERhdGEsIHVua25vd24+PlxuICAvKipcbiAgICogVGhpcyByZXF1aXJlZCBvcHRpb24gaXMgYSBmYWN0b3J5IGZvciBhIGZ1bmN0aW9uIHRoYXQgY29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIGNvcmUgcm93IG1vZGVsIGZvciB0aGUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNnZXRjb3Jlcm93bW9kZWwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBnZXRDb3JlUm93TW9kZWw6ICh0YWJsZTogVGFibGU8YW55PikgPT4gKCkgPT4gUm93TW9kZWw8YW55PlxuICAvKipcbiAgICogVGhpcyBvcHRpb25hbCBmdW5jdGlvbiBpcyB1c2VkIHRvIGRlcml2ZSBhIHVuaXF1ZSBJRCBmb3IgYW55IGdpdmVuIHJvdy4gSWYgbm90IHByb3ZpZGVkIHRoZSByb3dzIGluZGV4IGlzIHVzZWQgKG5lc3RlZCByb3dzIGpvaW4gdG9nZXRoZXIgd2l0aCBgLmAgdXNpbmcgdGhlaXIgZ3JhbmRwYXJlbnRzJyBpbmRleCBlZy4gYGluZGV4LmluZGV4LmluZGV4YCkuIElmIHlvdSBuZWVkIHRvIGlkZW50aWZ5IGluZGl2aWR1YWwgcm93cyB0aGF0IGFyZSBvcmlnaW5hdGluZyBmcm9tIGFueSBzZXJ2ZXItc2lkZSBvcGVyYXRpb25zLCBpdCdzIHN1Z2dlc3RlZCB5b3UgdXNlIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIGFuIElEIHRoYXQgbWFrZXMgc2Vuc2UgcmVnYXJkbGVzcyBvZiBuZXR3b3JrIElPL2FtYmlndWl0eSBlZy4gYSB1c2VySWQsIHRhc2tJZCwgZGF0YWJhc2UgSUQgZmllbGQsIGV0Yy5cbiAgICogQGV4YW1wbGUgZ2V0Um93SWQ6IHJvdyA9PiByb3cudXNlcklkXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNnZXRyb3dpZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIGdldFJvd0lkPzogKG9yaWdpbmFsUm93OiBURGF0YSwgaW5kZXg6IG51bWJlciwgcGFyZW50PzogUm93PFREYXRhPikgPT4gc3RyaW5nXG4gIC8qKlxuICAgKiBUaGlzIG9wdGlvbmFsIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWNjZXNzIHRoZSBzdWIgcm93cyBmb3IgYW55IGdpdmVuIHJvdy4gSWYgeW91IGFyZSB1c2luZyBuZXN0ZWQgcm93cywgeW91IHdpbGwgbmVlZCB0byB1c2UgdGhpcyBmdW5jdGlvbiB0byByZXR1cm4gdGhlIHN1YiByb3dzIG9iamVjdCAob3IgdW5kZWZpbmVkKSBmcm9tIHRoZSByb3cuXG4gICAqIEBleGFtcGxlIGdldFN1YlJvd3M6IHJvdyA9PiByb3cuc3ViUm93c1xuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjZ2V0c3Vicm93cylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIGdldFN1YlJvd3M/OiAob3JpZ2luYWxSb3c6IFREYXRhLCBpbmRleDogbnVtYmVyKSA9PiB1bmRlZmluZWQgfCBURGF0YVtdXG4gIC8qKlxuICAgKiBVc2UgdGhpcyBvcHRpb24gdG8gb3B0aW9uYWxseSBwYXNzIGluaXRpYWwgc3RhdGUgdG8gdGhlIHRhYmxlLiBUaGlzIHN0YXRlIHdpbGwgYmUgdXNlZCB3aGVuIHJlc2V0dGluZyB2YXJpb3VzIHRhYmxlIHN0YXRlcyBlaXRoZXIgYXV0b21hdGljYWxseSBieSB0aGUgdGFibGUgKGVnLiBgb3B0aW9ucy5hdXRvUmVzZXRQYWdlSW5kZXhgKSBvciB2aWEgZnVuY3Rpb25zIGxpa2UgYHRhYmxlLnJlc2V0Um93U2VsZWN0aW9uKClgLiBNb3N0IHJlc2V0IGZ1bmN0aW9uIGFsbG93IHlvdSBvcHRpb25hbGx5IHBhc3MgYSBmbGFnIHRvIHJlc2V0IHRvIGEgYmxhbmsvZGVmYXVsdCBzdGF0ZSBpbnN0ZWFkIG9mIHRoZSBpbml0aWFsIHN0YXRlLlxuICAgKlxuICAgKiBUYWJsZSBzdGF0ZSB3aWxsIG5vdCBiZSByZXNldCB3aGVuIHRoaXMgb2JqZWN0IGNoYW5nZXMsIHdoaWNoIGFsc28gbWVhbnMgdGhhdCB0aGUgaW5pdGlhbCBzdGF0ZSBvYmplY3QgZG9lcyBub3QgbmVlZCB0byBiZSBzdGFibGUuXG4gICAqXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNpbml0aWFsc3RhdGUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBpbml0aWFsU3RhdGU/OiBJbml0aWFsVGFibGVTdGF0ZVxuICAvKipcbiAgICogVGhpcyBvcHRpb24gaXMgdXNlZCB0byBvcHRpb25hbGx5IGltcGxlbWVudCB0aGUgbWVyZ2luZyBvZiB0YWJsZSBvcHRpb25zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjbWVyZ2VvcHRpb25zKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvdGFibGVzKVxuICAgKi9cbiAgbWVyZ2VPcHRpb25zPzogKFxuICAgIGRlZmF1bHRPcHRpb25zOiBUYWJsZU9wdGlvbnM8VERhdGE+LFxuICAgIG9wdGlvbnM6IFBhcnRpYWw8VGFibGVPcHRpb25zPFREYXRhPj5cbiAgKSA9PiBUYWJsZU9wdGlvbnM8VERhdGE+XG4gIC8qKlxuICAgKiBZb3UgY2FuIHBhc3MgYW55IG9iamVjdCB0byBgb3B0aW9ucy5tZXRhYCBhbmQgYWNjZXNzIGl0IGFueXdoZXJlIHRoZSBgdGFibGVgIGlzIGF2YWlsYWJsZSB2aWEgYHRhYmxlLm9wdGlvbnMubWV0YWAuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNtZXRhKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvdGFibGVzKVxuICAgKi9cbiAgbWV0YT86IFRhYmxlTWV0YTxURGF0YT5cbiAgLyoqXG4gICAqIFRoZSBgb25TdGF0ZUNoYW5nZWAgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIG9wdGlvbmFsbHkgbGlzdGVuIHRvIHN0YXRlIGNoYW5nZXMgd2l0aGluIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3RhYmxlI29uc3RhdGVjaGFuZ2UpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBvblN0YXRlQ2hhbmdlOiAodXBkYXRlcjogVXBkYXRlcjxUYWJsZVN0YXRlPikgPT4gdm9pZFxuICAvKipcbiAgICogVmFsdWUgdXNlZCB3aGVuIHRoZSBkZXNpcmVkIHZhbHVlIGlzIG5vdCBmb3VuZCBpbiB0aGUgZGF0YS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3RhYmxlI3JlbmRlcmZhbGxiYWNrdmFsdWUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICByZW5kZXJGYWxsYmFja1ZhbHVlOiBhbnlcbiAgLyoqXG4gICAqIFRoZSBgc3RhdGVgIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBvcHRpb25hbGx5IF9jb250cm9sXyBwYXJ0IG9yIGFsbCBvZiB0aGUgdGFibGUgc3RhdGUuIFRoZSBzdGF0ZSB5b3UgcGFzcyBoZXJlIHdpbGwgbWVyZ2Ugd2l0aCBhbmQgb3ZlcndyaXRlIHRoZSBpbnRlcm5hbCBhdXRvbWF0aWNhbGx5LW1hbmFnZWQgc3RhdGUgdG8gcHJvZHVjZSB0aGUgZmluYWwgc3RhdGUgZm9yIHRoZSB0YWJsZS4gWW91IGNhbiBhbHNvIGxpc3RlbiB0byBzdGF0ZSBjaGFuZ2VzIHZpYSB0aGUgYG9uU3RhdGVDaGFuZ2VgIG9wdGlvbi5cbiAgICogPiBOb3RlOiBBbnkgc3RhdGUgcGFzc2VkIGluIGhlcmUgd2lsbCBvdmVycmlkZSBib3RoIHRoZSBpbnRlcm5hbCBzdGF0ZSBhbmQgYW55IG90aGVyIGBpbml0aWFsU3RhdGVgIHlvdSBwcm92aWRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjc3RhdGUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBzdGF0ZTogUGFydGlhbDxUYWJsZVN0YXRlPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvcmVJbnN0YW5jZTxURGF0YSBleHRlbmRzIFJvd0RhdGE+IHtcbiAgX2ZlYXR1cmVzOiByZWFkb25seSBUYWJsZUZlYXR1cmVbXVxuICBfZ2V0QWxsRmxhdENvbHVtbnNCeUlkOiAoKSA9PiBSZWNvcmQ8c3RyaW5nLCBDb2x1bW48VERhdGEsIHVua25vd24+PlxuICBfZ2V0Q29sdW1uRGVmczogKCkgPT4gQ29sdW1uRGVmPFREYXRhLCB1bmtub3duPltdXG4gIF9nZXRDb3JlUm93TW9kZWw/OiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgX2dldERlZmF1bHRDb2x1bW5EZWY6ICgpID0+IFBhcnRpYWw8Q29sdW1uRGVmPFREYXRhLCB1bmtub3duPj5cbiAgX2dldFJvd0lkOiAoXzogVERhdGEsIGluZGV4OiBudW1iZXIsIHBhcmVudD86IFJvdzxURGF0YT4pID0+IHN0cmluZ1xuICBfcXVldWU6IChjYjogKCkgPT4gdm9pZCkgPT4gdm9pZFxuICAvKipcbiAgICogUmV0dXJucyBhbGwgY29sdW1ucyBpbiB0aGUgdGFibGUgaW4gdGhlaXIgbm9ybWFsaXplZCBhbmQgbmVzdGVkIGhpZXJhcmNoeS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3RhYmxlI2dldGFsbGNvbHVtbnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBnZXRBbGxDb2x1bW5zOiAoKSA9PiBDb2x1bW48VERhdGEsIHVua25vd24+W11cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGNvbHVtbnMgaW4gdGhlIHRhYmxlIGZsYXR0ZW5lZCB0byBhIHNpbmdsZSBsZXZlbC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3RhYmxlI2dldGFsbGZsYXRjb2x1bW5zKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvdGFibGVzKVxuICAgKi9cbiAgZ2V0QWxsRmxhdENvbHVtbnM6ICgpID0+IENvbHVtbjxURGF0YSwgdW5rbm93bj5bXVxuICAvKipcbiAgICogUmV0dXJucyBhbGwgbGVhZi1ub2RlIGNvbHVtbnMgaW4gdGhlIHRhYmxlIGZsYXR0ZW5lZCB0byBhIHNpbmdsZSBsZXZlbC4gVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHBhcmVudCBjb2x1bW5zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjZ2V0YWxsbGVhZmNvbHVtbnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBnZXRBbGxMZWFmQ29sdW1uczogKCkgPT4gQ29sdW1uPFREYXRhLCB1bmtub3duPltdXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc2luZ2xlIGNvbHVtbiBieSBpdHMgSUQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNnZXRjb2x1bW4pXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBnZXRDb2x1bW46IChjb2x1bW5JZDogc3RyaW5nKSA9PiBDb2x1bW48VERhdGEsIHVua25vd24+IHwgdW5kZWZpbmVkXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb3JlIHJvdyBtb2RlbCBiZWZvcmUgYW55IHByb2Nlc3NpbmcgaGFzIGJlZW4gYXBwbGllZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3RhYmxlI2dldGNvcmVyb3dtb2RlbClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIGdldENvcmVSb3dNb2RlbDogKCkgPT4gUm93TW9kZWw8VERhdGE+XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByb3cgd2l0aCB0aGUgZ2l2ZW4gSUQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNnZXRyb3cpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBnZXRSb3c6IChpZDogc3RyaW5nLCBzZWFyY2hBbGw/OiBib29sZWFuKSA9PiBSb3c8VERhdGE+XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaW5hbCBtb2RlbCBhZnRlciBhbGwgcHJvY2Vzc2luZyBmcm9tIG90aGVyIHVzZWQgZmVhdHVyZXMgaGFzIGJlZW4gYXBwbGllZC4gVGhpcyBpcyB0aGUgcm93IG1vZGVsIHRoYXQgaXMgbW9zdCBjb21tb25seSB1c2VkIGZvciByZW5kZXJpbmcuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNnZXRyb3dtb2RlbClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIGdldFJvd01vZGVsOiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byBnZXQgdGhlIHRhYmxlJ3MgY3VycmVudCBzdGF0ZS4gSXQncyByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBmdW5jdGlvbiBhbmQgaXRzIHN0YXRlLCBlc3BlY2lhbGx5IHdoZW4gbWFuYWdpbmcgdGhlIHRhYmxlIHN0YXRlIG1hbnVhbGx5LiBJdCBpcyB0aGUgZXhhY3Qgc2FtZSBzdGF0ZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIHRhYmxlIGZvciBldmVyeSBmZWF0dXJlIGFuZCBmdW5jdGlvbiBpdCBwcm92aWRlcy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3RhYmxlI2dldHN0YXRlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvdGFibGVzKVxuICAgKi9cbiAgZ2V0U3RhdGU6ICgpID0+IFRhYmxlU3RhdGVcbiAgLyoqXG4gICAqIFRoaXMgaXMgdGhlIHJlc29sdmVkIGluaXRpYWwgc3RhdGUgb2YgdGhlIHRhYmxlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjaW5pdGlhbHN0YXRlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvdGFibGVzKVxuICAgKi9cbiAgaW5pdGlhbFN0YXRlOiBUYWJsZVN0YXRlXG4gIC8qKlxuICAgKiBBIHJlYWQtb25seSByZWZlcmVuY2UgdG8gdGhlIHRhYmxlJ3MgY3VycmVudCBvcHRpb25zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjb3B0aW9ucylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIG9wdGlvbnM6IFJlcXVpcmVkS2V5czxUYWJsZU9wdGlvbnNSZXNvbHZlZDxURGF0YT4sICdzdGF0ZSc+XG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gcmVzZXQgdGhlIHRhYmxlIHN0YXRlIHRvIHRoZSBpbml0aWFsIHN0YXRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjcmVzZXQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICByZXNldDogKCkgPT4gdm9pZFxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB1cGRhdGUgdGhlIHRhYmxlIG9wdGlvbnMuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNzZXRvcHRpb25zKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvdGFibGVzKVxuICAgKi9cbiAgc2V0T3B0aW9uczogKG5ld09wdGlvbnM6IFVwZGF0ZXI8VGFibGVPcHRpb25zUmVzb2x2ZWQ8VERhdGE+PikgPT4gdm9pZFxuICAvKipcbiAgICogQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgdGFibGUgc3RhdGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNzZXRzdGF0ZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIHNldFN0YXRlOiAodXBkYXRlcjogVXBkYXRlcjxUYWJsZVN0YXRlPikgPT4gdm9pZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFibGU8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgb3B0aW9uczogVGFibGVPcHRpb25zUmVzb2x2ZWQ8VERhdGE+XG4pOiBUYWJsZTxURGF0YT4ge1xuICBpZiAob3B0aW9ucy5kZWJ1Z0FsbCB8fCBvcHRpb25zLmRlYnVnVGFibGUpIHtcbiAgICBjb25zb2xlLmluZm8oJ0NyZWF0aW5nIFRhYmxlIEluc3RhbmNlLi4uJylcbiAgfVxuXG4gIGxldCB0YWJsZSA9IHsgX2ZlYXR1cmVzOiBmZWF0dXJlcyB9IGFzIHVua25vd24gYXMgVGFibGU8VERhdGE+XG5cbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB0YWJsZS5fZmVhdHVyZXMucmVkdWNlKChvYmosIGZlYXR1cmUpID0+IHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihvYmosIGZlYXR1cmUuZ2V0RGVmYXVsdE9wdGlvbnM/Lih0YWJsZSkpXG4gIH0sIHt9KSBhcyBUYWJsZU9wdGlvbnNSZXNvbHZlZDxURGF0YT5cblxuICBjb25zdCBtZXJnZU9wdGlvbnMgPSAob3B0aW9uczogVGFibGVPcHRpb25zUmVzb2x2ZWQ8VERhdGE+KSA9PiB7XG4gICAgaWYgKHRhYmxlLm9wdGlvbnMubWVyZ2VPcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGFibGUub3B0aW9ucy5tZXJnZU9wdGlvbnMoZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb3JlSW5pdGlhbFN0YXRlOiBDb3JlVGFibGVTdGF0ZSA9IHt9XG5cbiAgbGV0IGluaXRpYWxTdGF0ZSA9IHtcbiAgICAuLi5jb3JlSW5pdGlhbFN0YXRlLFxuICAgIC4uLihvcHRpb25zLmluaXRpYWxTdGF0ZSA/PyB7fSksXG4gIH0gYXMgVGFibGVTdGF0ZVxuXG4gIHRhYmxlLl9mZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgIGluaXRpYWxTdGF0ZSA9IGZlYXR1cmUuZ2V0SW5pdGlhbFN0YXRlPy4oaW5pdGlhbFN0YXRlKSA/PyBpbml0aWFsU3RhdGVcbiAgfSlcblxuICBjb25zdCBxdWV1ZWQ6ICgoKSA9PiB2b2lkKVtdID0gW11cbiAgbGV0IHF1ZXVlZFRpbWVvdXQgPSBmYWxzZVxuXG4gIGNvbnN0IGNvcmVJbnN0YW5jZTogQ29yZUluc3RhbmNlPFREYXRhPiA9IHtcbiAgICBfZmVhdHVyZXM6IGZlYXR1cmVzLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9LFxuICAgIGluaXRpYWxTdGF0ZSxcbiAgICBfcXVldWU6IGNiID0+IHtcbiAgICAgIHF1ZXVlZC5wdXNoKGNiKVxuXG4gICAgICBpZiAoIXF1ZXVlZFRpbWVvdXQpIHtcbiAgICAgICAgcXVldWVkVGltZW91dCA9IHRydWVcblxuICAgICAgICAvLyBTY2hlZHVsZSBhIG1pY3JvdGFzayB0byBydW4gdGhlIHF1ZXVlZCBjYWxsYmFja3MgYWZ0ZXJcbiAgICAgICAgLy8gdGhlIGN1cnJlbnQgY2FsbCBzdGFjayAocmVuZGVyLCBldGMpIGhhcyBmaW5pc2hlZC5cbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB3aGlsZSAocXVldWVkLmxlbmd0aCkge1xuICAgICAgICAgICAgICBxdWV1ZWQuc2hpZnQoKSEoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVldWVkVGltZW91dCA9IGZhbHNlXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goZXJyb3IgPT5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICB9XG4gICAgfSxcbiAgICByZXNldDogKCkgPT4ge1xuICAgICAgdGFibGUuc2V0U3RhdGUodGFibGUuaW5pdGlhbFN0YXRlKVxuICAgIH0sXG4gICAgc2V0T3B0aW9uczogdXBkYXRlciA9PiB7XG4gICAgICBjb25zdCBuZXdPcHRpb25zID0gZnVuY3Rpb25hbFVwZGF0ZSh1cGRhdGVyLCB0YWJsZS5vcHRpb25zKVxuICAgICAgdGFibGUub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhuZXdPcHRpb25zKSBhcyBSZXF1aXJlZEtleXM8XG4gICAgICAgIFRhYmxlT3B0aW9uc1Jlc29sdmVkPFREYXRhPixcbiAgICAgICAgJ3N0YXRlJ1xuICAgICAgPlxuICAgIH0sXG5cbiAgICBnZXRTdGF0ZTogKCkgPT4ge1xuICAgICAgcmV0dXJuIHRhYmxlLm9wdGlvbnMuc3RhdGUgYXMgVGFibGVTdGF0ZVxuICAgIH0sXG5cbiAgICBzZXRTdGF0ZTogKHVwZGF0ZXI6IFVwZGF0ZXI8VGFibGVTdGF0ZT4pID0+IHtcbiAgICAgIHRhYmxlLm9wdGlvbnMub25TdGF0ZUNoYW5nZT8uKHVwZGF0ZXIpXG4gICAgfSxcblxuICAgIF9nZXRSb3dJZDogKHJvdzogVERhdGEsIGluZGV4OiBudW1iZXIsIHBhcmVudD86IFJvdzxURGF0YT4pID0+XG4gICAgICB0YWJsZS5vcHRpb25zLmdldFJvd0lkPy4ocm93LCBpbmRleCwgcGFyZW50KSA/P1xuICAgICAgYCR7cGFyZW50ID8gW3BhcmVudC5pZCwgaW5kZXhdLmpvaW4oJy4nKSA6IGluZGV4fWAsXG5cbiAgICBnZXRDb3JlUm93TW9kZWw6ICgpID0+IHtcbiAgICAgIGlmICghdGFibGUuX2dldENvcmVSb3dNb2RlbCkge1xuICAgICAgICB0YWJsZS5fZ2V0Q29yZVJvd01vZGVsID0gdGFibGUub3B0aW9ucy5nZXRDb3JlUm93TW9kZWwodGFibGUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZS5fZ2V0Q29yZVJvd01vZGVsISgpXG4gICAgfSxcblxuICAgIC8vIFRoZSBmaW5hbCBjYWxscyBzdGFydCBhdCB0aGUgYm90dG9tIG9mIHRoZSBtb2RlbCxcbiAgICAvLyBleHBhbmRlZCByb3dzLCB3aGljaCB0aGVuIHdvcmsgdGhlaXIgd2F5IHVwXG5cbiAgICBnZXRSb3dNb2RlbDogKCkgPT4ge1xuICAgICAgcmV0dXJuIHRhYmxlLmdldFBhZ2luYXRpb25Sb3dNb2RlbCgpXG4gICAgfSxcbiAgICBnZXRSb3c6IChpZDogc3RyaW5nLCBzZWFyY2hBbGw/OiBib29sZWFuKSA9PiB7XG4gICAgICBjb25zdCByb3cgPSAoc2VhcmNoQWxsID8gdGFibGUuZ2V0Q29yZVJvd01vZGVsKCkgOiB0YWJsZS5nZXRSb3dNb2RlbCgpKVxuICAgICAgICAucm93c0J5SWRbaWRdXG5cbiAgICAgIGlmICghcm93KSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBnZXRSb3cgZXhwZWN0ZWQgYW4gSUQsIGJ1dCBnb3QgJHtpZH1gKVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByb3dcbiAgICB9LFxuICAgIF9nZXREZWZhdWx0Q29sdW1uRGVmOiBtZW1vKFxuICAgICAgKCkgPT4gW3RhYmxlLm9wdGlvbnMuZGVmYXVsdENvbHVtbl0sXG4gICAgICBkZWZhdWx0Q29sdW1uID0+IHtcbiAgICAgICAgZGVmYXVsdENvbHVtbiA9IChkZWZhdWx0Q29sdW1uID8/IHt9KSBhcyBQYXJ0aWFsPFxuICAgICAgICAgIENvbHVtbkRlZjxURGF0YSwgdW5rbm93bj5cbiAgICAgICAgPlxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaGVhZGVyOiBwcm9wcyA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbHVtbkRlZiA9IHByb3BzLmhlYWRlci5jb2x1bW5cbiAgICAgICAgICAgICAgLmNvbHVtbkRlZiBhcyBDb2x1bW5EZWZSZXNvbHZlZDxURGF0YT5cblxuICAgICAgICAgICAgaWYgKHJlc29sdmVkQ29sdW1uRGVmLmFjY2Vzc29yS2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZENvbHVtbkRlZi5hY2Nlc3NvcktleVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVzb2x2ZWRDb2x1bW5EZWYuYWNjZXNzb3JGbikge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWRDb2x1bW5EZWYuaWRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIGZvb3RlcjogcHJvcHMgPT4gcHJvcHMuaGVhZGVyLmNvbHVtbi5pZCxcbiAgICAgICAgICBjZWxsOiBwcm9wcyA9PiBwcm9wcy5yZW5kZXJWYWx1ZTxhbnk+KCk/LnRvU3RyaW5nPy4oKSA/PyBudWxsLFxuICAgICAgICAgIC4uLnRhYmxlLl9mZWF0dXJlcy5yZWR1Y2UoKG9iaiwgZmVhdHVyZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ob2JqLCBmZWF0dXJlLmdldERlZmF1bHRDb2x1bW5EZWY/LigpKVxuICAgICAgICAgIH0sIHt9KSxcbiAgICAgICAgICAuLi5kZWZhdWx0Q29sdW1uLFxuICAgICAgICB9IGFzIFBhcnRpYWw8Q29sdW1uRGVmPFREYXRhLCB1bmtub3duPj5cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdDb2x1bW5zLFxuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXREZWZhdWx0Q29sdW1uRGVmJyxcbiAgICAgIH1cbiAgICApLFxuXG4gICAgX2dldENvbHVtbkRlZnM6ICgpID0+IHRhYmxlLm9wdGlvbnMuY29sdW1ucyxcblxuICAgIGdldEFsbENvbHVtbnM6IG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUuX2dldENvbHVtbkRlZnMoKV0sXG4gICAgICBjb2x1bW5EZWZzID0+IHtcbiAgICAgICAgY29uc3QgcmVjdXJzZUNvbHVtbnMgPSAoXG4gICAgICAgICAgY29sdW1uRGVmczogQ29sdW1uRGVmPFREYXRhLCB1bmtub3duPltdLFxuICAgICAgICAgIHBhcmVudD86IENvbHVtbjxURGF0YSwgdW5rbm93bj4sXG4gICAgICAgICAgZGVwdGggPSAwXG4gICAgICAgICk6IENvbHVtbjxURGF0YSwgdW5rbm93bj5bXSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbHVtbkRlZnMubWFwKGNvbHVtbkRlZiA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSBjcmVhdGVDb2x1bW4odGFibGUsIGNvbHVtbkRlZiwgZGVwdGgsIHBhcmVudClcblxuICAgICAgICAgICAgY29uc3QgZ3JvdXBpbmdDb2x1bW5EZWYgPSBjb2x1bW5EZWYgYXMgR3JvdXBDb2x1bW5EZWY8XG4gICAgICAgICAgICAgIFREYXRhLFxuICAgICAgICAgICAgICB1bmtub3duXG4gICAgICAgICAgICA+XG5cbiAgICAgICAgICAgIGNvbHVtbi5jb2x1bW5zID0gZ3JvdXBpbmdDb2x1bW5EZWYuY29sdW1uc1xuICAgICAgICAgICAgICA/IHJlY3Vyc2VDb2x1bW5zKGdyb3VwaW5nQ29sdW1uRGVmLmNvbHVtbnMsIGNvbHVtbiwgZGVwdGggKyAxKVxuICAgICAgICAgICAgICA6IFtdXG5cbiAgICAgICAgICAgIHJldHVybiBjb2x1bW5cbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlY3Vyc2VDb2x1bW5zKGNvbHVtbkRlZnMpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRBbGxDb2x1bW5zJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0NvbHVtbnMsXG4gICAgICB9XG4gICAgKSxcblxuICAgIGdldEFsbEZsYXRDb2x1bW5zOiBtZW1vKFxuICAgICAgKCkgPT4gW3RhYmxlLmdldEFsbENvbHVtbnMoKV0sXG4gICAgICBhbGxDb2x1bW5zID0+IHtcbiAgICAgICAgcmV0dXJuIGFsbENvbHVtbnMuZmxhdE1hcChjb2x1bW4gPT4ge1xuICAgICAgICAgIHJldHVybiBjb2x1bW4uZ2V0RmxhdENvbHVtbnMoKVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAnZ2V0QWxsRmxhdENvbHVtbnMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnQ29sdW1ucyxcbiAgICAgIH1cbiAgICApLFxuXG4gICAgX2dldEFsbEZsYXRDb2x1bW5zQnlJZDogbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5nZXRBbGxGbGF0Q29sdW1ucygpXSxcbiAgICAgIGZsYXRDb2x1bW5zID0+IHtcbiAgICAgICAgcmV0dXJuIGZsYXRDb2x1bW5zLnJlZHVjZShcbiAgICAgICAgICAoYWNjLCBjb2x1bW4pID0+IHtcbiAgICAgICAgICAgIGFjY1tjb2x1bW4uaWRdID0gY29sdW1uXG4gICAgICAgICAgICByZXR1cm4gYWNjXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBDb2x1bW48VERhdGEsIHVua25vd24+PlxuICAgICAgICApXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRBbGxGbGF0Q29sdW1uc0J5SWQnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnQ29sdW1ucyxcbiAgICAgIH1cbiAgICApLFxuXG4gICAgZ2V0QWxsTGVhZkNvbHVtbnM6IG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUuZ2V0QWxsQ29sdW1ucygpLCB0YWJsZS5fZ2V0T3JkZXJDb2x1bW5zRm4oKV0sXG4gICAgICAoYWxsQ29sdW1ucywgb3JkZXJDb2x1bW5zKSA9PiB7XG4gICAgICAgIGxldCBsZWFmQ29sdW1ucyA9IGFsbENvbHVtbnMuZmxhdE1hcChjb2x1bW4gPT4gY29sdW1uLmdldExlYWZDb2x1bW5zKCkpXG4gICAgICAgIHJldHVybiBvcmRlckNvbHVtbnMobGVhZkNvbHVtbnMpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRBbGxMZWFmQ29sdW1ucycsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdDb2x1bW5zLFxuICAgICAgfVxuICAgICksXG5cbiAgICBnZXRDb2x1bW46IGNvbHVtbklkID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IHRhYmxlLl9nZXRBbGxGbGF0Q29sdW1uc0J5SWQoKVtjb2x1bW5JZF1cblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWNvbHVtbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbVGFibGVdIENvbHVtbiB3aXRoIGlkICcke2NvbHVtbklkfScgZG9lcyBub3QgZXhpc3QuYClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbHVtblxuICAgIH0sXG4gIH1cblxuICBPYmplY3QuYXNzaWduKHRhYmxlLCBjb3JlSW5zdGFuY2UpXG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRhYmxlLl9mZWF0dXJlcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBmZWF0dXJlID0gdGFibGUuX2ZlYXR1cmVzW2luZGV4XVxuICAgIGZlYXR1cmU/LmNyZWF0ZVRhYmxlPy4odGFibGUpXG4gIH1cblxuICByZXR1cm4gdGFibGVcbn1cbiIsImltcG9ydCB7IFJvd0RhdGEsIENlbGwsIENvbHVtbiwgUm93LCBUYWJsZSB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgR2V0dGVyLCBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2VsbENvbnRleHQ8VERhdGEgZXh0ZW5kcyBSb3dEYXRhLCBUVmFsdWU+IHtcbiAgY2VsbDogQ2VsbDxURGF0YSwgVFZhbHVlPlxuICBjb2x1bW46IENvbHVtbjxURGF0YSwgVFZhbHVlPlxuICBnZXRWYWx1ZTogR2V0dGVyPFRWYWx1ZT5cbiAgcmVuZGVyVmFsdWU6IEdldHRlcjxUVmFsdWUgfCBudWxsPlxuICByb3c6IFJvdzxURGF0YT5cbiAgdGFibGU6IFRhYmxlPFREYXRhPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvcmVDZWxsPFREYXRhIGV4dGVuZHMgUm93RGF0YSwgVFZhbHVlPiB7XG4gIC8qKlxuICAgKiBUaGUgYXNzb2NpYXRlZCBDb2x1bW4gb2JqZWN0IGZvciB0aGUgY2VsbC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2NlbGwjY29sdW1uKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY2VsbHMpXG4gICAqL1xuICBjb2x1bW46IENvbHVtbjxURGF0YSwgVFZhbHVlPlxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcmVuZGVyaW5nIGNvbnRleHQgKG9yIHByb3BzKSBmb3IgY2VsbC1iYXNlZCBjb21wb25lbnRzIGxpa2UgY2VsbHMgYW5kIGFnZ3JlZ2F0ZWQgY2VsbHMuIFVzZSB0aGVzZSBwcm9wcyB3aXRoIHlvdXIgZnJhbWV3b3JrJ3MgYGZsZXhSZW5kZXJgIHV0aWxpdHkgdG8gcmVuZGVyIHRoZXNlIHVzaW5nIHRoZSB0ZW1wbGF0ZSBvZiB5b3VyIGNob2ljZTpcbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2NlbGwjZ2V0Y29udGV4dClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NlbGxzKVxuICAgKi9cbiAgZ2V0Q29udGV4dDogKCkgPT4gQ2VsbENvbnRleHQ8VERhdGEsIFRWYWx1ZT5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgY2VsbCwgYWNjZXNzZWQgdmlhIHRoZSBhc3NvY2lhdGVkIGNvbHVtbidzIGFjY2Vzc29yIGtleSBvciBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2NlbGwjZ2V0dmFsdWUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jZWxscylcbiAgICovXG4gIGdldFZhbHVlOiBDZWxsQ29udGV4dDxURGF0YSwgVFZhbHVlPlsnZ2V0VmFsdWUnXVxuICAvKipcbiAgICogVGhlIHVuaXF1ZSBJRCBmb3IgdGhlIGNlbGwgYWNyb3NzIHRoZSBlbnRpcmUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9jZWxsI2lkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY2VsbHMpXG4gICAqL1xuICBpZDogc3RyaW5nXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSB2YWx1ZSBmb3IgYSBjZWxsIHRoZSBzYW1lIGFzIGBnZXRWYWx1ZWAsIGJ1dCB3aWxsIHJldHVybiB0aGUgYHJlbmRlckZhbGxiYWNrVmFsdWVgIGlmIG5vIHZhbHVlIGlzIGZvdW5kLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvY2VsbCNyZW5kZXJ2YWx1ZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NlbGxzKVxuICAgKi9cbiAgcmVuZGVyVmFsdWU6IENlbGxDb250ZXh0PFREYXRhLCBUVmFsdWU+WydyZW5kZXJWYWx1ZSddXG4gIC8qKlxuICAgKiBUaGUgYXNzb2NpYXRlZCBSb3cgb2JqZWN0IGZvciB0aGUgY2VsbC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2NlbGwjcm93KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY2VsbHMpXG4gICAqL1xuICByb3c6IFJvdzxURGF0YT5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNlbGw8VERhdGEgZXh0ZW5kcyBSb3dEYXRhLCBUVmFsdWU+KFxuICB0YWJsZTogVGFibGU8VERhdGE+LFxuICByb3c6IFJvdzxURGF0YT4sXG4gIGNvbHVtbjogQ29sdW1uPFREYXRhLCBUVmFsdWU+LFxuICBjb2x1bW5JZDogc3RyaW5nXG4pOiBDZWxsPFREYXRhLCBUVmFsdWU+IHtcbiAgY29uc3QgZ2V0UmVuZGVyVmFsdWUgPSAoKSA9PlxuICAgIGNlbGwuZ2V0VmFsdWUoKSA/PyB0YWJsZS5vcHRpb25zLnJlbmRlckZhbGxiYWNrVmFsdWVcblxuICBjb25zdCBjZWxsOiBDb3JlQ2VsbDxURGF0YSwgVFZhbHVlPiA9IHtcbiAgICBpZDogYCR7cm93LmlkfV8ke2NvbHVtbi5pZH1gLFxuICAgIHJvdyxcbiAgICBjb2x1bW4sXG4gICAgZ2V0VmFsdWU6ICgpID0+IHJvdy5nZXRWYWx1ZShjb2x1bW5JZCksXG4gICAgcmVuZGVyVmFsdWU6IGdldFJlbmRlclZhbHVlLFxuICAgIGdldENvbnRleHQ6IG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUsIGNvbHVtbiwgcm93LCBjZWxsXSxcbiAgICAgICh0YWJsZSwgY29sdW1uLCByb3csIGNlbGwpID0+ICh7XG4gICAgICAgIHRhYmxlLFxuICAgICAgICBjb2x1bW4sXG4gICAgICAgIHJvdyxcbiAgICAgICAgY2VsbDogY2VsbCBhcyBDZWxsPFREYXRhLCBUVmFsdWU+LFxuICAgICAgICBnZXRWYWx1ZTogY2VsbC5nZXRWYWx1ZSxcbiAgICAgICAgcmVuZGVyVmFsdWU6IGNlbGwucmVuZGVyVmFsdWUsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAnY2VsbC5nZXRDb250ZXh0JyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwsXG4gICAgICB9XG4gICAgKSxcbiAgfVxuXG4gIHRhYmxlLl9mZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgIGZlYXR1cmUuY3JlYXRlQ2VsbD8uKFxuICAgICAgY2VsbCBhcyBDZWxsPFREYXRhLCBUVmFsdWU+LFxuICAgICAgY29sdW1uLFxuICAgICAgcm93IGFzIFJvdzxURGF0YT4sXG4gICAgICB0YWJsZVxuICAgIClcbiAgfSwge30pXG5cbiAgcmV0dXJuIGNlbGwgYXMgQ2VsbDxURGF0YSwgVFZhbHVlPlxufVxuIiwiaW1wb3J0IHsgUm93RGF0YSwgQ2VsbCwgUm93LCBUYWJsZSB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgZmxhdHRlbkJ5LCBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBjcmVhdGVDZWxsIH0gZnJvbSAnLi9jZWxsJ1xuXG5leHBvcnQgaW50ZXJmYWNlIENvcmVSb3c8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiB7XG4gIF9nZXRBbGxDZWxsc0J5Q29sdW1uSWQ6ICgpID0+IFJlY29yZDxzdHJpbmcsIENlbGw8VERhdGEsIHVua25vd24+PlxuICBfdW5pcXVlVmFsdWVzQ2FjaGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIF92YWx1ZXNDYWNoZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgLyoqXG4gICAqIFRoZSBkZXB0aCBvZiB0aGUgcm93IChpZiBuZXN0ZWQgb3IgZ3JvdXBlZCkgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgcm93IGFycmF5LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvcm93I2RlcHRoKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93cylcbiAgICovXG4gIGRlcHRoOiBudW1iZXJcbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIG9mIHRoZSBjZWxscyBmb3IgdGhlIHJvdy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3JvdyNnZXRhbGxjZWxscylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvd3MpXG4gICAqL1xuICBnZXRBbGxDZWxsczogKCkgPT4gQ2VsbDxURGF0YSwgdW5rbm93bj5bXVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGVhZiByb3dzIGZvciB0aGUgcm93LCBub3QgaW5jbHVkaW5nIGFueSBwYXJlbnQgcm93cy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3JvdyNnZXRsZWFmcm93cylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvd3MpXG4gICAqL1xuICBnZXRMZWFmUm93czogKCkgPT4gUm93PFREYXRhPltdXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgcm93IGZvciB0aGUgcm93LCBpZiBpdCBleGlzdHMuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9yb3cjZ2V0cGFyZW50cm93KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93cylcbiAgICovXG4gIGdldFBhcmVudFJvdzogKCkgPT4gUm93PFREYXRhPiB8IHVuZGVmaW5lZFxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcGFyZW50IHJvd3MgZm9yIHRoZSByb3csIGFsbCB0aGUgd2F5IHVwIHRvIGEgcm9vdCByb3cuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9yb3cjZ2V0cGFyZW50cm93cylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvd3MpXG4gICAqL1xuICBnZXRQYXJlbnRSb3dzOiAoKSA9PiBSb3c8VERhdGE+W11cbiAgLyoqXG4gICAqIFJldHVybnMgYSB1bmlxdWUgYXJyYXkgb2YgdmFsdWVzIGZyb20gdGhlIHJvdyBmb3IgYSBnaXZlbiBjb2x1bW5JZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3JvdyNnZXR1bmlxdWV2YWx1ZXMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3dzKVxuICAgKi9cbiAgZ2V0VW5pcXVlVmFsdWVzOiA8VFZhbHVlPihjb2x1bW5JZDogc3RyaW5nKSA9PiBUVmFsdWVbXVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsdWUgZnJvbSB0aGUgcm93IGZvciBhIGdpdmVuIGNvbHVtbklkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvcm93I2dldHZhbHVlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93cylcbiAgICovXG4gIGdldFZhbHVlOiA8VFZhbHVlPihjb2x1bW5JZDogc3RyaW5nKSA9PiBUVmFsdWVcbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJvdyByZXNvbHZlZCB2aWEgdGhlIGBvcHRpb25zLmdldFJvd0lkYCBvcHRpb24uIERlZmF1bHRzIHRvIHRoZSByb3cncyBpbmRleCAob3IgcmVsYXRpdmUgaW5kZXggaWYgaXQgaXMgYSBzdWJSb3cpLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvcm93I2lkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93cylcbiAgICovXG4gIGlkOiBzdHJpbmdcbiAgLyoqXG4gICAqIFRoZSBpbmRleCBvZiB0aGUgcm93IHdpdGhpbiBpdHMgcGFyZW50IGFycmF5IChvciB0aGUgcm9vdCBkYXRhIGFycmF5KS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3JvdyNpbmRleClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvd3MpXG4gICAqL1xuICBpbmRleDogbnVtYmVyXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgcm93IG9iamVjdCBwcm92aWRlZCB0byB0aGUgdGFibGUuIElmIHRoZSByb3cgaXMgYSBncm91cGVkIHJvdywgdGhlIG9yaWdpbmFsIHJvdyBvYmplY3Qgd2lsbCBiZSB0aGUgZmlyc3Qgb3JpZ2luYWwgaW4gdGhlIGdyb3VwLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvcm93I29yaWdpbmFsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93cylcbiAgICovXG4gIG9yaWdpbmFsOiBURGF0YVxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgdGhlIG9yaWdpbmFsIHN1YlJvd3MgYXMgcmV0dXJuZWQgYnkgdGhlIGBvcHRpb25zLmdldFN1YlJvd3NgIG9wdGlvbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3JvdyNvcmlnaW5hbHN1YnJvd3MpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3dzKVxuICAgKi9cbiAgb3JpZ2luYWxTdWJSb3dzPzogVERhdGFbXVxuICAvKipcbiAgICogSWYgbmVzdGVkLCB0aGlzIHJvdydzIHBhcmVudCByb3cgaWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9yb3cjcGFyZW50aWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3dzKVxuICAgKi9cbiAgcGFyZW50SWQ/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHZhbHVlIGZvciB0aGUgcm93IGluIGEgZ2l2ZW4gY29sdW1uSWQgdGhlIHNhbWUgYXMgYGdldFZhbHVlYCwgYnV0IHdpbGwgcmV0dXJuIHRoZSBgcmVuZGVyRmFsbGJhY2tWYWx1ZWAgaWYgbm8gdmFsdWUgaXMgZm91bmQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9yb3cjcmVuZGVydmFsdWUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3dzKVxuICAgKi9cbiAgcmVuZGVyVmFsdWU6IDxUVmFsdWU+KGNvbHVtbklkOiBzdHJpbmcpID0+IFRWYWx1ZVxuICAvKipcbiAgICogQW4gYXJyYXkgb2Ygc3ViUm93cyBmb3IgdGhlIHJvdyBhcyByZXR1cm5lZCBhbmQgY3JlYXRlZCBieSB0aGUgYG9wdGlvbnMuZ2V0U3ViUm93c2Agb3B0aW9uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvcm93I3N1YnJvd3MpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3dzKVxuICAgKi9cbiAgc3ViUm93czogUm93PFREYXRhPltdXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSb3cgPSA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgdGFibGU6IFRhYmxlPFREYXRhPixcbiAgaWQ6IHN0cmluZyxcbiAgb3JpZ2luYWw6IFREYXRhLFxuICByb3dJbmRleDogbnVtYmVyLFxuICBkZXB0aDogbnVtYmVyLFxuICBzdWJSb3dzPzogUm93PFREYXRhPltdLFxuICBwYXJlbnRJZD86IHN0cmluZ1xuKTogUm93PFREYXRhPiA9PiB7XG4gIGxldCByb3c6IENvcmVSb3c8VERhdGE+ID0ge1xuICAgIGlkLFxuICAgIGluZGV4OiByb3dJbmRleCxcbiAgICBvcmlnaW5hbCxcbiAgICBkZXB0aCxcbiAgICBwYXJlbnRJZCxcbiAgICBfdmFsdWVzQ2FjaGU6IHt9LFxuICAgIF91bmlxdWVWYWx1ZXNDYWNoZToge30sXG4gICAgZ2V0VmFsdWU6IGNvbHVtbklkID0+IHtcbiAgICAgIGlmIChyb3cuX3ZhbHVlc0NhY2hlLmhhc093blByb3BlcnR5KGNvbHVtbklkKSkge1xuICAgICAgICByZXR1cm4gcm93Ll92YWx1ZXNDYWNoZVtjb2x1bW5JZF1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKGNvbHVtbklkKVxuXG4gICAgICBpZiAoIWNvbHVtbj8uYWNjZXNzb3JGbikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIHJvdy5fdmFsdWVzQ2FjaGVbY29sdW1uSWRdID0gY29sdW1uLmFjY2Vzc29yRm4oXG4gICAgICAgIHJvdy5vcmlnaW5hbCBhcyBURGF0YSxcbiAgICAgICAgcm93SW5kZXhcbiAgICAgIClcblxuICAgICAgcmV0dXJuIHJvdy5fdmFsdWVzQ2FjaGVbY29sdW1uSWRdIGFzIGFueVxuICAgIH0sXG4gICAgZ2V0VW5pcXVlVmFsdWVzOiBjb2x1bW5JZCA9PiB7XG4gICAgICBpZiAocm93Ll91bmlxdWVWYWx1ZXNDYWNoZS5oYXNPd25Qcm9wZXJ0eShjb2x1bW5JZCkpIHtcbiAgICAgICAgcmV0dXJuIHJvdy5fdW5pcXVlVmFsdWVzQ2FjaGVbY29sdW1uSWRdXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbHVtbiA9IHRhYmxlLmdldENvbHVtbihjb2x1bW5JZClcblxuICAgICAgaWYgKCFjb2x1bW4/LmFjY2Vzc29yRm4pIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBpZiAoIWNvbHVtbi5jb2x1bW5EZWYuZ2V0VW5pcXVlVmFsdWVzKSB7XG4gICAgICAgIHJvdy5fdW5pcXVlVmFsdWVzQ2FjaGVbY29sdW1uSWRdID0gW3Jvdy5nZXRWYWx1ZShjb2x1bW5JZCldXG4gICAgICAgIHJldHVybiByb3cuX3VuaXF1ZVZhbHVlc0NhY2hlW2NvbHVtbklkXVxuICAgICAgfVxuXG4gICAgICByb3cuX3VuaXF1ZVZhbHVlc0NhY2hlW2NvbHVtbklkXSA9IGNvbHVtbi5jb2x1bW5EZWYuZ2V0VW5pcXVlVmFsdWVzKFxuICAgICAgICByb3cub3JpZ2luYWwgYXMgVERhdGEsXG4gICAgICAgIHJvd0luZGV4XG4gICAgICApXG5cbiAgICAgIHJldHVybiByb3cuX3VuaXF1ZVZhbHVlc0NhY2hlW2NvbHVtbklkXSBhcyBhbnlcbiAgICB9LFxuICAgIHJlbmRlclZhbHVlOiBjb2x1bW5JZCA9PlxuICAgICAgcm93LmdldFZhbHVlKGNvbHVtbklkKSA/PyB0YWJsZS5vcHRpb25zLnJlbmRlckZhbGxiYWNrVmFsdWUsXG4gICAgc3ViUm93czogc3ViUm93cyA/PyBbXSxcbiAgICBnZXRMZWFmUm93czogKCkgPT4gZmxhdHRlbkJ5KHJvdy5zdWJSb3dzLCBkID0+IGQuc3ViUm93cyksXG4gICAgZ2V0UGFyZW50Um93OiAoKSA9PiAocm93LnBhcmVudElkID8gdGFibGUuZ2V0Um93KHJvdy5wYXJlbnRJZCwgdHJ1ZSkgOiB1bmRlZmluZWQpLFxuICAgIGdldFBhcmVudFJvd3M6ICgpID0+IHtcbiAgICAgIGxldCBwYXJlbnRSb3dzOiBSb3c8VERhdGE+W10gPSBbXVxuICAgICAgbGV0IGN1cnJlbnRSb3cgPSByb3dcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFJvdyA9IGN1cnJlbnRSb3cuZ2V0UGFyZW50Um93KClcbiAgICAgICAgaWYgKCFwYXJlbnRSb3cpIGJyZWFrXG4gICAgICAgIHBhcmVudFJvd3MucHVzaChwYXJlbnRSb3cpXG4gICAgICAgIGN1cnJlbnRSb3cgPSBwYXJlbnRSb3dcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJlbnRSb3dzLnJldmVyc2UoKVxuICAgIH0sXG4gICAgZ2V0QWxsQ2VsbHM6IG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUuZ2V0QWxsTGVhZkNvbHVtbnMoKV0sXG4gICAgICBsZWFmQ29sdW1ucyA9PiB7XG4gICAgICAgIHJldHVybiBsZWFmQ29sdW1ucy5tYXAoY29sdW1uID0+IHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQ2VsbCh0YWJsZSwgcm93IGFzIFJvdzxURGF0YT4sIGNvbHVtbiwgY29sdW1uLmlkKVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAncm93LmdldEFsbENlbGxzJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z1Jvd3MsXG4gICAgICB9XG4gICAgKSxcblxuICAgIF9nZXRBbGxDZWxsc0J5Q29sdW1uSWQ6IG1lbW8oXG4gICAgICAoKSA9PiBbcm93LmdldEFsbENlbGxzKCldLFxuICAgICAgYWxsQ2VsbHMgPT4ge1xuICAgICAgICByZXR1cm4gYWxsQ2VsbHMucmVkdWNlKFxuICAgICAgICAgIChhY2MsIGNlbGwpID0+IHtcbiAgICAgICAgICAgIGFjY1tjZWxsLmNvbHVtbi5pZF0gPSBjZWxsXG4gICAgICAgICAgICByZXR1cm4gYWNjXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBDZWxsPFREYXRhLCB1bmtub3duPj5cbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OlxuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicgJiYgJ3Jvdy5nZXRBbGxDZWxsc0J5Q29sdW1uSWQnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnUm93cyxcbiAgICAgIH1cbiAgICApLFxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5fZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBmZWF0dXJlID0gdGFibGUuX2ZlYXR1cmVzW2ldXG4gICAgZmVhdHVyZT8uY3JlYXRlUm93Py4ocm93LCB0YWJsZSlcbiAgfVxuXG4gIHJldHVybiByb3cgYXMgUm93PFREYXRhPlxufVxuIiwiaW1wb3J0IHtcbiAgQWNjZXNzb3JGbixcbiAgQ29sdW1uRGVmLFxuICBEaXNwbGF5Q29sdW1uRGVmLFxuICBHcm91cENvbHVtbkRlZixcbiAgSWRlbnRpZmllZENvbHVtbkRlZixcbiAgUm93RGF0YSxcbn0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IERlZXBLZXlzLCBEZWVwVmFsdWUsIFJlcXVpcmVkS2V5cyB9IGZyb20gJy4vdXRpbHMnXG5cbi8vIHR5cGUgUGVyc29uID0ge1xuLy8gICBmaXJzdE5hbWU6IHN0cmluZ1xuLy8gICBsYXN0TmFtZTogc3RyaW5nXG4vLyAgIGFnZTogbnVtYmVyXG4vLyAgIHZpc2l0czogbnVtYmVyXG4vLyAgIHN0YXR1czogc3RyaW5nXG4vLyAgIHByb2dyZXNzOiBudW1iZXJcbi8vICAgY3JlYXRlZEF0OiBEYXRlXG4vLyAgIG5lc3RlZDoge1xuLy8gICAgIGZvbzogW1xuLy8gICAgICAge1xuLy8gICAgICAgICBiYXI6ICdiYXInXG4vLyAgICAgICB9XG4vLyAgICAgXVxuLy8gICAgIGJhcjogeyBzdWJCYXI6IGJvb2xlYW4gfVtdXG4vLyAgICAgYmF6OiB7XG4vLyAgICAgICBmb286ICdmb28nXG4vLyAgICAgICBiYXI6IHtcbi8vICAgICAgICAgYmF6OiAnYmF6J1xuLy8gICAgICAgfVxuLy8gICAgIH1cbi8vICAgfVxuLy8gfVxuXG4vLyBjb25zdCB0ZXN0OiBEZWVwS2V5czxQZXJzb24+ID0gJ25lc3RlZC5mb28uMC5iYXInXG4vLyBjb25zdCB0ZXN0MjogRGVlcEtleXM8UGVyc29uPiA9ICduZXN0ZWQuYmFyJ1xuXG4vLyBjb25zdCBoZWxwZXIgPSBjcmVhdGVDb2x1bW5IZWxwZXI8UGVyc29uPigpXG5cbi8vIGhlbHBlci5hY2Nlc3NvcignbmVzdGVkLmZvbycsIHtcbi8vICAgY2VsbDogaW5mbyA9PiBpbmZvLmdldFZhbHVlKCksXG4vLyB9KVxuXG4vLyBoZWxwZXIuYWNjZXNzb3IoJ25lc3RlZC5mb28uMC5iYXInLCB7XG4vLyAgIGNlbGw6IGluZm8gPT4gaW5mby5nZXRWYWx1ZSgpLFxuLy8gfSlcblxuLy8gaGVscGVyLmFjY2Vzc29yKCduZXN0ZWQuYmFyJywge1xuLy8gICBjZWxsOiBpbmZvID0+IGluZm8uZ2V0VmFsdWUoKSxcbi8vIH0pXG5cbmV4cG9ydCB0eXBlIENvbHVtbkhlbHBlcjxURGF0YSBleHRlbmRzIFJvd0RhdGE+ID0ge1xuICBhY2Nlc3NvcjogPFxuICAgIFRBY2Nlc3NvciBleHRlbmRzIEFjY2Vzc29yRm48VERhdGE+IHwgRGVlcEtleXM8VERhdGE+LFxuICAgIFRWYWx1ZSBleHRlbmRzIFRBY2Nlc3NvciBleHRlbmRzIEFjY2Vzc29yRm48VERhdGEsIGluZmVyIFRSZXR1cm4+XG4gICAgICA/IFRSZXR1cm5cbiAgICAgIDogVEFjY2Vzc29yIGV4dGVuZHMgRGVlcEtleXM8VERhdGE+XG4gICAgICA/IERlZXBWYWx1ZTxURGF0YSwgVEFjY2Vzc29yPlxuICAgICAgOiBuZXZlcixcbiAgPihcbiAgICBhY2Nlc3NvcjogVEFjY2Vzc29yLFxuICAgIGNvbHVtbjogVEFjY2Vzc29yIGV4dGVuZHMgQWNjZXNzb3JGbjxURGF0YT5cbiAgICAgID8gRGlzcGxheUNvbHVtbkRlZjxURGF0YSwgVFZhbHVlPlxuICAgICAgOiBJZGVudGlmaWVkQ29sdW1uRGVmPFREYXRhLCBUVmFsdWU+XG4gICkgPT4gQ29sdW1uRGVmPFREYXRhLCBUVmFsdWU+XG4gIGRpc3BsYXk6IChjb2x1bW46IERpc3BsYXlDb2x1bW5EZWY8VERhdGE+KSA9PiBDb2x1bW5EZWY8VERhdGEsIHVua25vd24+XG4gIGdyb3VwOiAoY29sdW1uOiBHcm91cENvbHVtbkRlZjxURGF0YT4pID0+IENvbHVtbkRlZjxURGF0YSwgdW5rbm93bj5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbHVtbkhlbHBlcjxcbiAgVERhdGEgZXh0ZW5kcyBSb3dEYXRhLFxuPigpOiBDb2x1bW5IZWxwZXI8VERhdGE+IHtcbiAgcmV0dXJuIHtcbiAgICBhY2Nlc3NvcjogKGFjY2Vzc29yLCBjb2x1bW4pID0+IHtcbiAgICAgIHJldHVybiB0eXBlb2YgYWNjZXNzb3IgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyAoe1xuICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgYWNjZXNzb3JGbjogYWNjZXNzb3IsXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgIDoge1xuICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgYWNjZXNzb3JLZXk6IGFjY2Vzc29yLFxuICAgICAgICAgIH1cbiAgICB9LFxuICAgIGRpc3BsYXk6IGNvbHVtbiA9PiBjb2x1bW4gYXMgQ29sdW1uRGVmPFREYXRhLCB1bmtub3duPixcbiAgICBncm91cDogY29sdW1uID0+IGNvbHVtbiBhcyBDb2x1bW5EZWY8VERhdGEsIHVua25vd24+LFxuICB9XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVSb3cgfSBmcm9tICcuLi9jb3JlL3JvdydcbmltcG9ydCB7IFRhYmxlLCBSb3csIFJvd01vZGVsLCBSb3dEYXRhIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb3JlUm93TW9kZWw8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPigpOiAoXG4gIHRhYmxlOiBUYWJsZTxURGF0YT5cbikgPT4gKCkgPT4gUm93TW9kZWw8VERhdGE+IHtcbiAgcmV0dXJuIHRhYmxlID0+XG4gICAgbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5vcHRpb25zLmRhdGFdLFxuICAgICAgKFxuICAgICAgICBkYXRhXG4gICAgICApOiB7XG4gICAgICAgIHJvd3M6IFJvdzxURGF0YT5bXVxuICAgICAgICBmbGF0Um93czogUm93PFREYXRhPltdXG4gICAgICAgIHJvd3NCeUlkOiBSZWNvcmQ8c3RyaW5nLCBSb3c8VERhdGE+PlxuICAgICAgfSA9PiB7XG4gICAgICAgIGNvbnN0IHJvd01vZGVsOiBSb3dNb2RlbDxURGF0YT4gPSB7XG4gICAgICAgICAgcm93czogW10sXG4gICAgICAgICAgZmxhdFJvd3M6IFtdLFxuICAgICAgICAgIHJvd3NCeUlkOiB7fSxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjY2Vzc1Jvd3MgPSAoXG4gICAgICAgICAgb3JpZ2luYWxSb3dzOiBURGF0YVtdLFxuICAgICAgICAgIGRlcHRoID0gMCxcbiAgICAgICAgICBwYXJlbnRSb3c/OiBSb3c8VERhdGE+XG4gICAgICAgICk6IFJvdzxURGF0YT5bXSA9PiB7XG4gICAgICAgICAgY29uc3Qgcm93cyA9IFtdIGFzIFJvdzxURGF0YT5bXVxuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmlnaW5hbFJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIFRoaXMgY291bGQgYmUgYW4gZXhwZW5zaXZlIGNoZWNrIGF0IHNjYWxlLCBzbyB3ZSBzaG91bGQgbW92ZSBpdCBzb21ld2hlcmUgZWxzZSwgYnV0IHdoZXJlP1xuICAgICAgICAgICAgLy8gaWYgKCFpZCkge1xuICAgICAgICAgICAgLy8gICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihgZ2V0Um93SWQgZXhwZWN0ZWQgYW4gSUQsIGJ1dCBnb3QgJHtpZH1gKVxuICAgICAgICAgICAgLy8gICB9XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIC8vIE1ha2UgdGhlIHJvd1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gY3JlYXRlUm93KFxuICAgICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICAgICAgdGFibGUuX2dldFJvd0lkKG9yaWdpbmFsUm93c1tpXSEsIGksIHBhcmVudFJvdyksXG4gICAgICAgICAgICAgIG9yaWdpbmFsUm93c1tpXSEsXG4gICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHBhcmVudFJvdz8uaWRcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBldmVyeSByb3cgaW4gYSBmbGF0IGFycmF5XG4gICAgICAgICAgICByb3dNb2RlbC5mbGF0Um93cy5wdXNoKHJvdylcbiAgICAgICAgICAgIC8vIEFsc28ga2VlcCB0cmFjayBvZiBldmVyeSByb3cgYnkgaXRzIElEXG4gICAgICAgICAgICByb3dNb2RlbC5yb3dzQnlJZFtyb3cuaWRdID0gcm93XG4gICAgICAgICAgICAvLyBQdXNoIHRhYmxlIHJvdyBpbnRvIHBhcmVudFxuICAgICAgICAgICAgcm93cy5wdXNoKHJvdylcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBvcmlnaW5hbCBzdWJyb3dzXG4gICAgICAgICAgICBpZiAodGFibGUub3B0aW9ucy5nZXRTdWJSb3dzKSB7XG4gICAgICAgICAgICAgIHJvdy5vcmlnaW5hbFN1YlJvd3MgPSB0YWJsZS5vcHRpb25zLmdldFN1YlJvd3MoXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxSb3dzW2ldISxcbiAgICAgICAgICAgICAgICBpXG4gICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAvLyBUaGVuIHJlY3Vyc2l2ZWx5IGFjY2VzcyB0aGVtXG4gICAgICAgICAgICAgIGlmIChyb3cub3JpZ2luYWxTdWJSb3dzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByb3cuc3ViUm93cyA9IGFjY2Vzc1Jvd3Mocm93Lm9yaWdpbmFsU3ViUm93cywgZGVwdGggKyAxLCByb3cpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcm93c1xuICAgICAgICB9XG5cbiAgICAgICAgcm93TW9kZWwucm93cyA9IGFjY2Vzc1Jvd3MoZGF0YSlcblxuICAgICAgICByZXR1cm4gcm93TW9kZWxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldFJvd01vZGVsJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z1RhYmxlLFxuICAgICAgICBvbkNoYW5nZTogKCkgPT4ge1xuICAgICAgICAgIHRhYmxlLl9hdXRvUmVzZXRQYWdlSW5kZXgoKVxuICAgICAgICB9LFxuICAgICAgfVxuICAgIClcbn1cbiIsImltcG9ydCB7IGNyZWF0ZVJvdyB9IGZyb20gJy4uL2NvcmUvcm93J1xuaW1wb3J0IHsgUm93LCBSb3dNb2RlbCwgVGFibGUsIFJvd0RhdGEgfSBmcm9tICcuLi90eXBlcydcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclJvd3M8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgcm93czogUm93PFREYXRhPltdLFxuICBmaWx0ZXJSb3dJbXBsOiAocm93OiBSb3c8VERhdGE+KSA9PiBhbnksXG4gIHRhYmxlOiBUYWJsZTxURGF0YT5cbikge1xuICBpZiAodGFibGUub3B0aW9ucy5maWx0ZXJGcm9tTGVhZlJvd3MpIHtcbiAgICByZXR1cm4gZmlsdGVyUm93TW9kZWxGcm9tTGVhZnMocm93cywgZmlsdGVyUm93SW1wbCwgdGFibGUpXG4gIH1cblxuICByZXR1cm4gZmlsdGVyUm93TW9kZWxGcm9tUm9vdChyb3dzLCBmaWx0ZXJSb3dJbXBsLCB0YWJsZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclJvd01vZGVsRnJvbUxlYWZzPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oXG4gIHJvd3NUb0ZpbHRlcjogUm93PFREYXRhPltdLFxuICBmaWx0ZXJSb3c6IChyb3c6IFJvdzxURGF0YT4pID0+IFJvdzxURGF0YT5bXSxcbiAgdGFibGU6IFRhYmxlPFREYXRhPlxuKTogUm93TW9kZWw8VERhdGE+IHtcbiAgY29uc3QgbmV3RmlsdGVyZWRGbGF0Um93czogUm93PFREYXRhPltdID0gW11cbiAgY29uc3QgbmV3RmlsdGVyZWRSb3dzQnlJZDogUmVjb3JkPHN0cmluZywgUm93PFREYXRhPj4gPSB7fVxuICBjb25zdCBtYXhEZXB0aCA9IHRhYmxlLm9wdGlvbnMubWF4TGVhZlJvd0ZpbHRlckRlcHRoID8/IDEwMFxuXG4gIGNvbnN0IHJlY3Vyc2VGaWx0ZXJSb3dzID0gKHJvd3NUb0ZpbHRlcjogUm93PFREYXRhPltdLCBkZXB0aCA9IDApID0+IHtcbiAgICBjb25zdCByb3dzOiBSb3c8VERhdGE+W10gPSBbXVxuXG4gICAgLy8gRmlsdGVyIGZyb20gY2hpbGRyZW4gdXAgZmlyc3RcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd3NUb0ZpbHRlci5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHJvdyA9IHJvd3NUb0ZpbHRlcltpXSFcblxuICAgICAgY29uc3QgbmV3Um93ID0gY3JlYXRlUm93KFxuICAgICAgICB0YWJsZSxcbiAgICAgICAgcm93LmlkLFxuICAgICAgICByb3cub3JpZ2luYWwsXG4gICAgICAgIHJvdy5pbmRleCxcbiAgICAgICAgcm93LmRlcHRoLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHJvdy5wYXJlbnRJZFxuICAgICAgKVxuICAgICAgbmV3Um93LmNvbHVtbkZpbHRlcnMgPSByb3cuY29sdW1uRmlsdGVyc1xuXG4gICAgICBpZiAocm93LnN1YlJvd3M/Lmxlbmd0aCAmJiBkZXB0aCA8IG1heERlcHRoKSB7XG4gICAgICAgIG5ld1Jvdy5zdWJSb3dzID0gcmVjdXJzZUZpbHRlclJvd3Mocm93LnN1YlJvd3MsIGRlcHRoICsgMSlcbiAgICAgICAgcm93ID0gbmV3Um93XG5cbiAgICAgICAgaWYgKGZpbHRlclJvdyhyb3cpICYmICFuZXdSb3cuc3ViUm93cy5sZW5ndGgpIHtcbiAgICAgICAgICByb3dzLnB1c2gocm93KVxuICAgICAgICAgIG5ld0ZpbHRlcmVkUm93c0J5SWRbcm93LmlkXSA9IHJvd1xuICAgICAgICAgIG5ld0ZpbHRlcmVkRmxhdFJvd3MucHVzaChyb3cpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXJSb3cocm93KSB8fCBuZXdSb3cuc3ViUm93cy5sZW5ndGgpIHtcbiAgICAgICAgICByb3dzLnB1c2gocm93KVxuICAgICAgICAgIG5ld0ZpbHRlcmVkUm93c0J5SWRbcm93LmlkXSA9IHJvd1xuICAgICAgICAgIG5ld0ZpbHRlcmVkRmxhdFJvd3MucHVzaChyb3cpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm93ID0gbmV3Um93XG4gICAgICAgIGlmIChmaWx0ZXJSb3cocm93KSkge1xuICAgICAgICAgIHJvd3MucHVzaChyb3cpXG4gICAgICAgICAgbmV3RmlsdGVyZWRSb3dzQnlJZFtyb3cuaWRdID0gcm93XG4gICAgICAgICAgbmV3RmlsdGVyZWRGbGF0Um93cy5wdXNoKHJvdylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByb3dzXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJvd3M6IHJlY3Vyc2VGaWx0ZXJSb3dzKHJvd3NUb0ZpbHRlciksXG4gICAgZmxhdFJvd3M6IG5ld0ZpbHRlcmVkRmxhdFJvd3MsXG4gICAgcm93c0J5SWQ6IG5ld0ZpbHRlcmVkUm93c0J5SWQsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclJvd01vZGVsRnJvbVJvb3Q8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgcm93c1RvRmlsdGVyOiBSb3c8VERhdGE+W10sXG4gIGZpbHRlclJvdzogKHJvdzogUm93PFREYXRhPikgPT4gYW55LFxuICB0YWJsZTogVGFibGU8VERhdGE+XG4pOiBSb3dNb2RlbDxURGF0YT4ge1xuICBjb25zdCBuZXdGaWx0ZXJlZEZsYXRSb3dzOiBSb3c8VERhdGE+W10gPSBbXVxuICBjb25zdCBuZXdGaWx0ZXJlZFJvd3NCeUlkOiBSZWNvcmQ8c3RyaW5nLCBSb3c8VERhdGE+PiA9IHt9XG4gIGNvbnN0IG1heERlcHRoID0gdGFibGUub3B0aW9ucy5tYXhMZWFmUm93RmlsdGVyRGVwdGggPz8gMTAwXG5cbiAgLy8gRmlsdGVycyB0b3AgbGV2ZWwgYW5kIG5lc3RlZCByb3dzXG4gIGNvbnN0IHJlY3Vyc2VGaWx0ZXJSb3dzID0gKHJvd3NUb0ZpbHRlcjogUm93PFREYXRhPltdLCBkZXB0aCA9IDApID0+IHtcbiAgICAvLyBGaWx0ZXIgZnJvbSBwYXJlbnRzIGRvd253YXJkIGZpcnN0XG5cbiAgICBjb25zdCByb3dzOiBSb3c8VERhdGE+W10gPSBbXVxuXG4gICAgLy8gQXBwbHkgdGhlIGZpbHRlciB0byBhbnkgc3ViUm93c1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93c1RvRmlsdGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgcm93ID0gcm93c1RvRmlsdGVyW2ldIVxuXG4gICAgICBjb25zdCBwYXNzID0gZmlsdGVyUm93KHJvdylcblxuICAgICAgaWYgKHBhc3MpIHtcbiAgICAgICAgaWYgKHJvdy5zdWJSb3dzPy5sZW5ndGggJiYgZGVwdGggPCBtYXhEZXB0aCkge1xuICAgICAgICAgIGNvbnN0IG5ld1JvdyA9IGNyZWF0ZVJvdyhcbiAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgcm93LmlkLFxuICAgICAgICAgICAgcm93Lm9yaWdpbmFsLFxuICAgICAgICAgICAgcm93LmluZGV4LFxuICAgICAgICAgICAgcm93LmRlcHRoLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgcm93LnBhcmVudElkXG4gICAgICAgICAgKVxuICAgICAgICAgIG5ld1Jvdy5zdWJSb3dzID0gcmVjdXJzZUZpbHRlclJvd3Mocm93LnN1YlJvd3MsIGRlcHRoICsgMSlcbiAgICAgICAgICByb3cgPSBuZXdSb3dcbiAgICAgICAgfVxuXG4gICAgICAgIHJvd3MucHVzaChyb3cpXG4gICAgICAgIG5ld0ZpbHRlcmVkRmxhdFJvd3MucHVzaChyb3cpXG4gICAgICAgIG5ld0ZpbHRlcmVkUm93c0J5SWRbcm93LmlkXSA9IHJvd1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByb3dzXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJvd3M6IHJlY3Vyc2VGaWx0ZXJSb3dzKHJvd3NUb0ZpbHRlciksXG4gICAgZmxhdFJvd3M6IG5ld0ZpbHRlcmVkRmxhdFJvd3MsXG4gICAgcm93c0J5SWQ6IG5ld0ZpbHRlcmVkUm93c0J5SWQsXG4gIH1cbn1cbiIsImltcG9ydCB7IFJlc29sdmVkQ29sdW1uRmlsdGVyIH0gZnJvbSAnLi4vZmVhdHVyZXMvRmlsdGVycydcbmltcG9ydCB7IFRhYmxlLCBSb3dNb2RlbCwgUm93LCBSb3dEYXRhIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBmaWx0ZXJSb3dzIH0gZnJvbSAnLi9maWx0ZXJSb3dzVXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWx0ZXJlZFJvd01vZGVsPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oKTogKFxuICB0YWJsZTogVGFibGU8VERhdGE+XG4pID0+ICgpID0+IFJvd01vZGVsPFREYXRhPiB7XG4gIHJldHVybiB0YWJsZSA9PlxuICAgIG1lbW8oXG4gICAgICAoKSA9PiBbXG4gICAgICAgIHRhYmxlLmdldFByZUZpbHRlcmVkUm93TW9kZWwoKSxcbiAgICAgICAgdGFibGUuZ2V0U3RhdGUoKS5jb2x1bW5GaWx0ZXJzLFxuICAgICAgICB0YWJsZS5nZXRTdGF0ZSgpLmdsb2JhbEZpbHRlcixcbiAgICAgIF0sXG4gICAgICAocm93TW9kZWwsIGNvbHVtbkZpbHRlcnMsIGdsb2JhbEZpbHRlcikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXJvd01vZGVsLnJvd3MubGVuZ3RoIHx8XG4gICAgICAgICAgKCFjb2x1bW5GaWx0ZXJzPy5sZW5ndGggJiYgIWdsb2JhbEZpbHRlcilcbiAgICAgICAgKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dNb2RlbC5mbGF0Um93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcm93TW9kZWwuZmxhdFJvd3NbaV0hLmNvbHVtbkZpbHRlcnMgPSB7fVxuICAgICAgICAgICAgcm93TW9kZWwuZmxhdFJvd3NbaV0hLmNvbHVtbkZpbHRlcnNNZXRhID0ge31cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJvd01vZGVsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvbHZlZENvbHVtbkZpbHRlcnM6IFJlc29sdmVkQ29sdW1uRmlsdGVyPFREYXRhPltdID0gW11cbiAgICAgICAgY29uc3QgcmVzb2x2ZWRHbG9iYWxGaWx0ZXJzOiBSZXNvbHZlZENvbHVtbkZpbHRlcjxURGF0YT5bXSA9IFtdXG5cbiAgICAgICAgOyhjb2x1bW5GaWx0ZXJzID8/IFtdKS5mb3JFYWNoKGQgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRhYmxlLmdldENvbHVtbihkLmlkKVxuXG4gICAgICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpbHRlckZuID0gY29sdW1uLmdldEZpbHRlckZuKClcblxuICAgICAgICAgIGlmICghZmlsdGVyRm4pIHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICBgQ291bGQgbm90IGZpbmQgYSB2YWxpZCAnY29sdW1uLmZpbHRlckZuJyBmb3IgY29sdW1uIHdpdGggdGhlIElEOiAke2NvbHVtbi5pZH0uYFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlZENvbHVtbkZpbHRlcnMucHVzaCh7XG4gICAgICAgICAgICBpZDogZC5pZCxcbiAgICAgICAgICAgIGZpbHRlckZuLFxuICAgICAgICAgICAgcmVzb2x2ZWRWYWx1ZTogZmlsdGVyRm4ucmVzb2x2ZUZpbHRlclZhbHVlPy4oZC52YWx1ZSkgPz8gZC52YWx1ZSxcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGZpbHRlcmFibGVJZHMgPSBjb2x1bW5GaWx0ZXJzLm1hcChkID0+IGQuaWQpXG5cbiAgICAgICAgY29uc3QgZ2xvYmFsRmlsdGVyRm4gPSB0YWJsZS5nZXRHbG9iYWxGaWx0ZXJGbigpXG5cbiAgICAgICAgY29uc3QgZ2xvYmFsbHlGaWx0ZXJhYmxlQ29sdW1ucyA9IHRhYmxlXG4gICAgICAgICAgLmdldEFsbExlYWZDb2x1bW5zKClcbiAgICAgICAgICAuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uZ2V0Q2FuR2xvYmFsRmlsdGVyKCkpXG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGdsb2JhbEZpbHRlciAmJlxuICAgICAgICAgIGdsb2JhbEZpbHRlckZuICYmXG4gICAgICAgICAgZ2xvYmFsbHlGaWx0ZXJhYmxlQ29sdW1ucy5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgZmlsdGVyYWJsZUlkcy5wdXNoKCdfX2dsb2JhbF9fJylcblxuICAgICAgICAgIGdsb2JhbGx5RmlsdGVyYWJsZUNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZWRHbG9iYWxGaWx0ZXJzLnB1c2goe1xuICAgICAgICAgICAgICBpZDogY29sdW1uLmlkLFxuICAgICAgICAgICAgICBmaWx0ZXJGbjogZ2xvYmFsRmlsdGVyRm4sXG4gICAgICAgICAgICAgIHJlc29sdmVkVmFsdWU6XG4gICAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyRm4ucmVzb2x2ZUZpbHRlclZhbHVlPy4oZ2xvYmFsRmlsdGVyKSA/P1xuICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlcixcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjdXJyZW50Q29sdW1uRmlsdGVyXG4gICAgICAgIGxldCBjdXJyZW50R2xvYmFsRmlsdGVyXG5cbiAgICAgICAgLy8gRmxhZyB0aGUgcHJlZmlsdGVyZWQgcm93IG1vZGVsIHdpdGggZWFjaCBmaWx0ZXIgc3RhdGVcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb3dNb2RlbC5mbGF0Um93cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGNvbnN0IHJvdyA9IHJvd01vZGVsLmZsYXRSb3dzW2pdIVxuXG4gICAgICAgICAgcm93LmNvbHVtbkZpbHRlcnMgPSB7fVxuXG4gICAgICAgICAgaWYgKHJlc29sdmVkQ29sdW1uRmlsdGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzb2x2ZWRDb2x1bW5GaWx0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRDb2x1bW5GaWx0ZXIgPSByZXNvbHZlZENvbHVtbkZpbHRlcnNbaV0hXG4gICAgICAgICAgICAgIGNvbnN0IGlkID0gY3VycmVudENvbHVtbkZpbHRlci5pZFxuXG4gICAgICAgICAgICAgIC8vIFRhZyB0aGUgcm93IHdpdGggdGhlIGNvbHVtbiBmaWx0ZXIgc3RhdGVcbiAgICAgICAgICAgICAgcm93LmNvbHVtbkZpbHRlcnNbaWRdID0gY3VycmVudENvbHVtbkZpbHRlci5maWx0ZXJGbihcbiAgICAgICAgICAgICAgICByb3csXG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgY3VycmVudENvbHVtbkZpbHRlci5yZXNvbHZlZFZhbHVlLFxuICAgICAgICAgICAgICAgIGZpbHRlck1ldGEgPT4ge1xuICAgICAgICAgICAgICAgICAgcm93LmNvbHVtbkZpbHRlcnNNZXRhW2lkXSA9IGZpbHRlck1ldGFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2ZWRHbG9iYWxGaWx0ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNvbHZlZEdsb2JhbEZpbHRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY3VycmVudEdsb2JhbEZpbHRlciA9IHJlc29sdmVkR2xvYmFsRmlsdGVyc1tpXSFcbiAgICAgICAgICAgICAgY29uc3QgaWQgPSBjdXJyZW50R2xvYmFsRmlsdGVyLmlkXG4gICAgICAgICAgICAgIC8vIFRhZyB0aGUgcm93IHdpdGggdGhlIGZpcnN0IHRydXRoeSBnbG9iYWwgZmlsdGVyIHN0YXRlXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjdXJyZW50R2xvYmFsRmlsdGVyLmZpbHRlckZuKFxuICAgICAgICAgICAgICAgICAgcm93LFxuICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50R2xvYmFsRmlsdGVyLnJlc29sdmVkVmFsdWUsXG4gICAgICAgICAgICAgICAgICBmaWx0ZXJNZXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcm93LmNvbHVtbkZpbHRlcnNNZXRhW2lkXSA9IGZpbHRlck1ldGFcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJvdy5jb2x1bW5GaWx0ZXJzLl9fZ2xvYmFsX18gPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocm93LmNvbHVtbkZpbHRlcnMuX19nbG9iYWxfXyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICByb3cuY29sdW1uRmlsdGVycy5fX2dsb2JhbF9fID0gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWx0ZXJSb3dzSW1wbCA9IChyb3c6IFJvdzxURGF0YT4pID0+IHtcbiAgICAgICAgICAvLyBIb3Jpem9udGFsbHkgZmlsdGVyIHJvd3MgdGhyb3VnaCBlYWNoIGNvbHVtblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVyYWJsZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHJvdy5jb2x1bW5GaWx0ZXJzW2ZpbHRlcmFibGVJZHNbaV0hXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaWx0ZXIgZmluYWwgcm93cyB1c2luZyBhbGwgb2YgdGhlIGFjdGl2ZSBmaWx0ZXJzXG4gICAgICAgIHJldHVybiBmaWx0ZXJSb3dzKHJvd01vZGVsLnJvd3MsIGZpbHRlclJvd3NJbXBsLCB0YWJsZSlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldEZpbHRlcmVkUm93TW9kZWwnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnVGFibGUsXG4gICAgICAgIG9uQ2hhbmdlOiAoKSA9PiB7XG4gICAgICAgICAgdGFibGUuX2F1dG9SZXNldFBhZ2VJbmRleCgpXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKVxufVxuIiwiaW1wb3J0IHsgVGFibGUsIFJvd01vZGVsLCBSb3csIFJvd0RhdGEgfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IG1lbW8gfSBmcm9tICcuLi91dGlscydcbmltcG9ydCB7IGZpbHRlclJvd3MgfSBmcm9tICcuL2ZpbHRlclJvd3NVdGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZhY2V0ZWRSb3dNb2RlbDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KCk6IChcbiAgdGFibGU6IFRhYmxlPFREYXRhPixcbiAgY29sdW1uSWQ6IHN0cmluZ1xuKSA9PiAoKSA9PiBSb3dNb2RlbDxURGF0YT4ge1xuICByZXR1cm4gKHRhYmxlLCBjb2x1bW5JZCkgPT5cbiAgICBtZW1vKFxuICAgICAgKCkgPT4gW1xuICAgICAgICB0YWJsZS5nZXRQcmVGaWx0ZXJlZFJvd01vZGVsKCksXG4gICAgICAgIHRhYmxlLmdldFN0YXRlKCkuY29sdW1uRmlsdGVycyxcbiAgICAgICAgdGFibGUuZ2V0U3RhdGUoKS5nbG9iYWxGaWx0ZXIsXG4gICAgICAgIHRhYmxlLmdldEZpbHRlcmVkUm93TW9kZWwoKSxcbiAgICAgIF0sXG4gICAgICAocHJlUm93TW9kZWwsIGNvbHVtbkZpbHRlcnMsIGdsb2JhbEZpbHRlcikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXByZVJvd01vZGVsLnJvd3MubGVuZ3RoIHx8XG4gICAgICAgICAgKCFjb2x1bW5GaWx0ZXJzPy5sZW5ndGggJiYgIWdsb2JhbEZpbHRlcilcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHByZVJvd01vZGVsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWx0ZXJhYmxlSWRzID0gW1xuICAgICAgICAgIC4uLmNvbHVtbkZpbHRlcnMubWFwKGQgPT4gZC5pZCkuZmlsdGVyKGQgPT4gZCAhPT0gY29sdW1uSWQpLFxuICAgICAgICAgIGdsb2JhbEZpbHRlciA/ICdfX2dsb2JhbF9fJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgXS5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW11cblxuICAgICAgICBjb25zdCBmaWx0ZXJSb3dzSW1wbCA9IChyb3c6IFJvdzxURGF0YT4pID0+IHtcbiAgICAgICAgICAvLyBIb3Jpem9udGFsbHkgZmlsdGVyIHJvd3MgdGhyb3VnaCBlYWNoIGNvbHVtblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVyYWJsZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHJvdy5jb2x1bW5GaWx0ZXJzW2ZpbHRlcmFibGVJZHNbaV0hXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmlsdGVyUm93cyhwcmVSb3dNb2RlbC5yb3dzLCBmaWx0ZXJSb3dzSW1wbCwgdGFibGUpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiZcbiAgICAgICAgICAnZ2V0RmFjZXRlZFJvd01vZGVsXycgKyBjb2x1bW5JZCxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z1RhYmxlLFxuICAgICAgICBvbkNoYW5nZTogKCkgPT4ge30sXG4gICAgICB9XG4gICAgKVxufVxuIiwiaW1wb3J0IHsgVGFibGUsIFJvd0RhdGEgfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IG1lbW8gfSBmcm9tICcuLi91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZhY2V0ZWRVbmlxdWVWYWx1ZXM8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPigpOiAoXG4gIHRhYmxlOiBUYWJsZTxURGF0YT4sXG4gIGNvbHVtbklkOiBzdHJpbmdcbikgPT4gKCkgPT4gTWFwPGFueSwgbnVtYmVyPiB7XG4gIHJldHVybiAodGFibGUsIGNvbHVtbklkKSA9PlxuICAgIG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUuZ2V0Q29sdW1uKGNvbHVtbklkKT8uZ2V0RmFjZXRlZFJvd01vZGVsKCldLFxuICAgICAgZmFjZXRlZFJvd01vZGVsID0+IHtcbiAgICAgICAgaWYgKCFmYWNldGVkUm93TW9kZWwpIHJldHVybiBuZXcgTWFwKClcblxuICAgICAgICBsZXQgZmFjZXRlZFVuaXF1ZVZhbHVlcyA9IG5ldyBNYXA8YW55LCBudW1iZXI+KClcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZhY2V0ZWRSb3dNb2RlbC5mbGF0Um93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9XG4gICAgICAgICAgICBmYWNldGVkUm93TW9kZWwuZmxhdFJvd3NbaV0hLmdldFVuaXF1ZVZhbHVlczxudW1iZXI+KGNvbHVtbklkKVxuXG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2pdIVxuXG4gICAgICAgICAgICBpZiAoZmFjZXRlZFVuaXF1ZVZhbHVlcy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgICAgIGZhY2V0ZWRVbmlxdWVWYWx1ZXMuc2V0KFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIChmYWNldGVkVW5pcXVlVmFsdWVzLmdldCh2YWx1ZSkgPz8gMCkgKyAxXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZhY2V0ZWRVbmlxdWVWYWx1ZXMuc2V0KHZhbHVlLCAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWNldGVkVW5pcXVlVmFsdWVzXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiZcbiAgICAgICAgICAnZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlc18nICsgY29sdW1uSWQsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdUYWJsZSxcbiAgICAgICAgb25DaGFuZ2U6ICgpID0+IHt9LFxuICAgICAgfVxuICAgIClcbn1cbiIsImltcG9ydCB7IFRhYmxlLCBSb3dEYXRhIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGYWNldGVkTWluTWF4VmFsdWVzPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oKTogKFxuICB0YWJsZTogVGFibGU8VERhdGE+LFxuICBjb2x1bW5JZDogc3RyaW5nXG4pID0+ICgpID0+IHVuZGVmaW5lZCB8IFtudW1iZXIsIG51bWJlcl0ge1xuICByZXR1cm4gKHRhYmxlLCBjb2x1bW5JZCkgPT5cbiAgICBtZW1vKFxuICAgICAgKCkgPT4gW3RhYmxlLmdldENvbHVtbihjb2x1bW5JZCk/LmdldEZhY2V0ZWRSb3dNb2RlbCgpXSxcbiAgICAgIGZhY2V0ZWRSb3dNb2RlbCA9PiB7XG4gICAgICAgIGlmICghZmFjZXRlZFJvd01vZGVsKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9XG4gICAgICAgICAgZmFjZXRlZFJvd01vZGVsLmZsYXRSb3dzWzBdPy5nZXRVbmlxdWVWYWx1ZXMoY29sdW1uSWQpXG5cbiAgICAgICAgaWYgKHR5cGVvZiBmaXJzdFZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmYWNldGVkTWluTWF4VmFsdWVzOiBbYW55LCBhbnldID0gW2ZpcnN0VmFsdWUsIGZpcnN0VmFsdWVdXG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmYWNldGVkUm93TW9kZWwuZmxhdFJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZXMgPVxuICAgICAgICAgICAgZmFjZXRlZFJvd01vZGVsLmZsYXRSb3dzW2ldIS5nZXRVbmlxdWVWYWx1ZXM8bnVtYmVyPihjb2x1bW5JZClcblxuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdmFsdWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tqXSFcblxuICAgICAgICAgICAgaWYgKHZhbHVlIDwgZmFjZXRlZE1pbk1heFZhbHVlc1swXSkge1xuICAgICAgICAgICAgICBmYWNldGVkTWluTWF4VmFsdWVzWzBdID0gdmFsdWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPiBmYWNldGVkTWluTWF4VmFsdWVzWzFdKSB7XG4gICAgICAgICAgICAgIGZhY2V0ZWRNaW5NYXhWYWx1ZXNbMV0gPSB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWNldGVkTWluTWF4VmFsdWVzXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiZcbiAgICAgICAgICAnZ2V0RmFjZXRlZE1pbk1heFZhbHVlc18nICsgY29sdW1uSWQsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdUYWJsZSxcbiAgICAgICAgb25DaGFuZ2U6ICgpID0+IHt9LFxuICAgICAgfVxuICAgIClcbn1cbiIsImltcG9ydCB7IFRhYmxlLCBSb3csIFJvd01vZGVsLCBSb3dEYXRhIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBTb3J0aW5nRm4gfSBmcm9tICcuLi9mZWF0dXJlcy9Tb3J0aW5nJ1xuaW1wb3J0IHsgbWVtbyB9IGZyb20gJy4uL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U29ydGVkUm93TW9kZWw8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPigpOiAoXG4gIHRhYmxlOiBUYWJsZTxURGF0YT5cbikgPT4gKCkgPT4gUm93TW9kZWw8VERhdGE+IHtcbiAgcmV0dXJuIHRhYmxlID0+XG4gICAgbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5nZXRTdGF0ZSgpLnNvcnRpbmcsIHRhYmxlLmdldFByZVNvcnRlZFJvd01vZGVsKCldLFxuICAgICAgKHNvcnRpbmcsIHJvd01vZGVsKSA9PiB7XG4gICAgICAgIGlmICghcm93TW9kZWwucm93cy5sZW5ndGggfHwgIXNvcnRpbmc/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiByb3dNb2RlbFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc29ydGluZ1N0YXRlID0gdGFibGUuZ2V0U3RhdGUoKS5zb3J0aW5nXG5cbiAgICAgICAgY29uc3Qgc29ydGVkRmxhdFJvd3M6IFJvdzxURGF0YT5bXSA9IFtdXG5cbiAgICAgICAgLy8gRmlsdGVyIG91dCBzb3J0aW5ncyB0aGF0IGNvcnJlc3BvbmQgdG8gbm9uIGV4aXN0aW5nIGNvbHVtbnNcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlU29ydGluZyA9IHNvcnRpbmdTdGF0ZS5maWx0ZXIoc29ydCA9PlxuICAgICAgICAgIHRhYmxlLmdldENvbHVtbihzb3J0LmlkKT8uZ2V0Q2FuU29ydCgpXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCBjb2x1bW5JbmZvQnlJZDogUmVjb3JkPFxuICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzb3J0VW5kZWZpbmVkPzogZmFsc2UgfCAtMSB8IDFcbiAgICAgICAgICAgIGludmVydFNvcnRpbmc/OiBib29sZWFuXG4gICAgICAgICAgICBzb3J0aW5nRm46IFNvcnRpbmdGbjxURGF0YT5cbiAgICAgICAgICB9XG4gICAgICAgID4gPSB7fVxuXG4gICAgICAgIGF2YWlsYWJsZVNvcnRpbmcuZm9yRWFjaChzb3J0RW50cnkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRhYmxlLmdldENvbHVtbihzb3J0RW50cnkuaWQpXG4gICAgICAgICAgaWYgKCFjb2x1bW4pIHJldHVyblxuXG4gICAgICAgICAgY29sdW1uSW5mb0J5SWRbc29ydEVudHJ5LmlkXSA9IHtcbiAgICAgICAgICAgIHNvcnRVbmRlZmluZWQ6IGNvbHVtbi5jb2x1bW5EZWYuc29ydFVuZGVmaW5lZCxcbiAgICAgICAgICAgIGludmVydFNvcnRpbmc6IGNvbHVtbi5jb2x1bW5EZWYuaW52ZXJ0U29ydGluZyxcbiAgICAgICAgICAgIHNvcnRpbmdGbjogY29sdW1uLmdldFNvcnRpbmdGbigpLFxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBzb3J0RGF0YSA9IChyb3dzOiBSb3c8VERhdGE+W10pID0+IHtcbiAgICAgICAgICAvLyBUaGlzIHdpbGwgYWxzbyBwZXJmb3JtIGEgc3RhYmxlIHNvcnRpbmcgdXNpbmcgdGhlIHJvdyBpbmRleFxuICAgICAgICAgIC8vIGlmIG5lZWRlZC5cbiAgICAgICAgICBjb25zdCBzb3J0ZWREYXRhID0gcm93cy5tYXAocm93ID0+ICh7Li4ucm93fSkpXG5cbiAgICAgICAgICBzb3J0ZWREYXRhLnNvcnQoKHJvd0EsIHJvd0IpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXZhaWxhYmxlU29ydGluZy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICBjb25zdCBzb3J0RW50cnkgPSBhdmFpbGFibGVTb3J0aW5nW2ldIVxuICAgICAgICAgICAgICBjb25zdCBjb2x1bW5JbmZvID0gY29sdW1uSW5mb0J5SWRbc29ydEVudHJ5LmlkXSFcbiAgICAgICAgICAgICAgY29uc3QgaXNEZXNjID0gc29ydEVudHJ5Py5kZXNjID8/IGZhbHNlXG5cbiAgICAgICAgICAgICAgbGV0IHNvcnRJbnQgPSAwXG5cbiAgICAgICAgICAgICAgLy8gQWxsIHNvcnRpbmcgaW50cyBzaG91bGQgYWx3YXlzIHJldHVybiBpbiBhc2NlbmRpbmcgb3JkZXJcbiAgICAgICAgICAgICAgaWYgKGNvbHVtbkluZm8uc29ydFVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFWYWx1ZSA9IHJvd0EuZ2V0VmFsdWUoc29ydEVudHJ5LmlkKVxuICAgICAgICAgICAgICAgIGNvbnN0IGJWYWx1ZSA9IHJvd0IuZ2V0VmFsdWUoc29ydEVudHJ5LmlkKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgYVVuZGVmaW5lZCA9IGFWYWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgY29uc3QgYlVuZGVmaW5lZCA9IGJWYWx1ZSA9PT0gdW5kZWZpbmVkXG5cbiAgICAgICAgICAgICAgICBpZiAoYVVuZGVmaW5lZCB8fCBiVW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBzb3J0SW50ID1cbiAgICAgICAgICAgICAgICAgICAgYVVuZGVmaW5lZCAmJiBiVW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgICAgICAgOiBhVW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgPyBjb2x1bW5JbmZvLnNvcnRVbmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICA6IC1jb2x1bW5JbmZvLnNvcnRVbmRlZmluZWRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoc29ydEludCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHNvcnRJbnQgPSBjb2x1bW5JbmZvLnNvcnRpbmdGbihyb3dBLCByb3dCLCBzb3J0RW50cnkuaWQpXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBJZiBzb3J0aW5nIGlzIG5vbi16ZXJvLCB0YWtlIGNhcmUgb2YgZGVzYyBhbmQgaW52ZXJzaW9uXG4gICAgICAgICAgICAgIGlmIChzb3J0SW50ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzRGVzYykge1xuICAgICAgICAgICAgICAgICAgc29ydEludCAqPSAtMVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5JbmZvLmludmVydFNvcnRpbmcpIHtcbiAgICAgICAgICAgICAgICAgIHNvcnRJbnQgKj0gLTFcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc29ydEludFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByb3dBLmluZGV4IC0gcm93Qi5pbmRleFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgc3ViLXJvd3MsIHNvcnQgdGhlbVxuICAgICAgICAgIHNvcnRlZERhdGEuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICAgICAgc29ydGVkRmxhdFJvd3MucHVzaChyb3cpXG4gICAgICAgICAgICBpZiAocm93LnN1YlJvd3M/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICByb3cuc3ViUm93cyA9IHNvcnREYXRhKHJvdy5zdWJSb3dzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm4gc29ydGVkRGF0YVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByb3dzOiBzb3J0RGF0YShyb3dNb2RlbC5yb3dzKSxcbiAgICAgICAgICBmbGF0Um93czogc29ydGVkRmxhdFJvd3MsXG4gICAgICAgICAgcm93c0J5SWQ6IHJvd01vZGVsLnJvd3NCeUlkLFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRTb3J0ZWRSb3dNb2RlbCcsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdUYWJsZSxcbiAgICAgICAgb25DaGFuZ2U6ICgpID0+IHtcbiAgICAgICAgICB0YWJsZS5fYXV0b1Jlc2V0UGFnZUluZGV4KClcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApXG59XG4iLCJpbXBvcnQgeyBjcmVhdGVSb3cgfSBmcm9tICcuLi9jb3JlL3JvdydcbmltcG9ydCB7IFRhYmxlLCBSb3csIFJvd01vZGVsLCBSb3dEYXRhIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBmbGF0dGVuQnksIG1lbW8gfSBmcm9tICcuLi91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdyb3VwZWRSb3dNb2RlbDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KCk6IChcbiAgdGFibGU6IFRhYmxlPFREYXRhPlxuKSA9PiAoKSA9PiBSb3dNb2RlbDxURGF0YT4ge1xuICByZXR1cm4gdGFibGUgPT5cbiAgICBtZW1vKFxuICAgICAgKCkgPT4gW3RhYmxlLmdldFN0YXRlKCkuZ3JvdXBpbmcsIHRhYmxlLmdldFByZUdyb3VwZWRSb3dNb2RlbCgpXSxcbiAgICAgIChncm91cGluZywgcm93TW9kZWwpID0+IHtcbiAgICAgICAgaWYgKCFyb3dNb2RlbC5yb3dzLmxlbmd0aCB8fCAhZ3JvdXBpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHJvd01vZGVsXG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaWx0ZXIgdGhlIGdyb3VwaW5nIGxpc3QgZG93biB0byBjb2x1bW5zIHRoYXQgZXhpc3RcbiAgICAgICAgY29uc3QgZXhpc3RpbmdHcm91cGluZyA9IGdyb3VwaW5nLmZpbHRlcihjb2x1bW5JZCA9PlxuICAgICAgICAgIHRhYmxlLmdldENvbHVtbihjb2x1bW5JZClcbiAgICAgICAgKVxuXG4gICAgICAgIGNvbnN0IGdyb3VwZWRGbGF0Um93czogUm93PFREYXRhPltdID0gW11cbiAgICAgICAgY29uc3QgZ3JvdXBlZFJvd3NCeUlkOiBSZWNvcmQ8c3RyaW5nLCBSb3c8VERhdGE+PiA9IHt9XG4gICAgICAgIC8vIGNvbnN0IG9ubHlHcm91cGVkRmxhdFJvd3M6IFJvd1tdID0gW107XG4gICAgICAgIC8vIGNvbnN0IG9ubHlHcm91cGVkUm93c0J5SWQ6IFJlY29yZDxSb3dJZCwgUm93PiA9IHt9O1xuICAgICAgICAvLyBjb25zdCBub25Hcm91cGVkRmxhdFJvd3M6IFJvd1tdID0gW107XG4gICAgICAgIC8vIGNvbnN0IG5vbkdyb3VwZWRSb3dzQnlJZDogUmVjb3JkPFJvd0lkLCBSb3c+ID0ge307XG5cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgZ3JvdXAgdGhlIGRhdGFcbiAgICAgICAgY29uc3QgZ3JvdXBVcFJlY3Vyc2l2ZWx5ID0gKFxuICAgICAgICAgIHJvd3M6IFJvdzxURGF0YT5bXSxcbiAgICAgICAgICBkZXB0aCA9IDAsXG4gICAgICAgICAgcGFyZW50SWQ/OiBzdHJpbmdcbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgLy8gR3JvdXBpbmcgZGVwdGggaGFzIGJlZW4gYmVlbiBtZXRcbiAgICAgICAgICAvLyBTdG9wIGdyb3VwaW5nIGFuZCBzaW1wbHkgcmV3cml0ZSB0aGQgZGVwdGggYW5kIHJvdyByZWxhdGlvbnNoaXBzXG4gICAgICAgICAgaWYgKGRlcHRoID49IGV4aXN0aW5nR3JvdXBpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gcm93cy5tYXAocm93ID0+IHtcbiAgICAgICAgICAgICAgcm93LmRlcHRoID0gZGVwdGhcblxuICAgICAgICAgICAgICBncm91cGVkRmxhdFJvd3MucHVzaChyb3cpXG4gICAgICAgICAgICAgIGdyb3VwZWRSb3dzQnlJZFtyb3cuaWRdID0gcm93XG5cbiAgICAgICAgICAgICAgaWYgKHJvdy5zdWJSb3dzKSB7XG4gICAgICAgICAgICAgICAgcm93LnN1YlJvd3MgPSBncm91cFVwUmVjdXJzaXZlbHkocm93LnN1YlJvd3MsIGRlcHRoICsgMSwgcm93LmlkKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHJvd1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb2x1bW5JZDogc3RyaW5nID0gZXhpc3RpbmdHcm91cGluZ1tkZXB0aF0hXG5cbiAgICAgICAgICAvLyBHcm91cCB0aGUgcm93cyB0b2dldGhlciBmb3IgdGhpcyBsZXZlbFxuICAgICAgICAgIGNvbnN0IHJvd0dyb3Vwc01hcCA9IGdyb3VwQnkocm93cywgY29sdW1uSWQpXG5cbiAgICAgICAgICAvLyBQZWZvcm0gYWdncmVnYXRpb25zIGZvciBlYWNoIGdyb3VwXG4gICAgICAgICAgY29uc3QgYWdncmVnYXRlZEdyb3VwZWRSb3dzID0gQXJyYXkuZnJvbShyb3dHcm91cHNNYXAuZW50cmllcygpKS5tYXAoXG4gICAgICAgICAgICAoW2dyb3VwaW5nVmFsdWUsIGdyb3VwZWRSb3dzXSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgbGV0IGlkID0gYCR7Y29sdW1uSWR9OiR7Z3JvdXBpbmdWYWx1ZX1gXG4gICAgICAgICAgICAgIGlkID0gcGFyZW50SWQgPyBgJHtwYXJlbnRJZH0+JHtpZH1gIDogaWRcblxuICAgICAgICAgICAgICAvLyBGaXJzdCwgUmVjdXJzZSB0byBncm91cCBzdWIgcm93cyBiZWZvcmUgYWdncmVnYXRpb25cbiAgICAgICAgICAgICAgY29uc3Qgc3ViUm93cyA9IGdyb3VwVXBSZWN1cnNpdmVseShncm91cGVkUm93cywgZGVwdGggKyAxLCBpZClcblxuICAgICAgICAgICAgICAvLyBGbGF0dGVuIHRoZSBsZWFmIHJvd3Mgb2YgdGhlIHJvd3MgaW4gdGhpcyBncm91cFxuICAgICAgICAgICAgICBjb25zdCBsZWFmUm93cyA9IGRlcHRoXG4gICAgICAgICAgICAgICAgPyBmbGF0dGVuQnkoZ3JvdXBlZFJvd3MsIHJvdyA9PiByb3cuc3ViUm93cylcbiAgICAgICAgICAgICAgICA6IGdyb3VwZWRSb3dzXG5cbiAgICAgICAgICAgICAgY29uc3Qgcm93ID0gY3JlYXRlUm93KFxuICAgICAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIGxlYWZSb3dzWzBdIS5vcmlnaW5hbCxcbiAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcGFyZW50SWRcbiAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocm93LCB7XG4gICAgICAgICAgICAgICAgZ3JvdXBpbmdDb2x1bW5JZDogY29sdW1uSWQsXG4gICAgICAgICAgICAgICAgZ3JvdXBpbmdWYWx1ZSxcbiAgICAgICAgICAgICAgICBzdWJSb3dzLFxuICAgICAgICAgICAgICAgIGxlYWZSb3dzLFxuICAgICAgICAgICAgICAgIGdldFZhbHVlOiAoY29sdW1uSWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWdncmVnYXRlIGNvbHVtbnMgdGhhdCBhcmUgaW4gdGhlIGdyb3VwaW5nXG4gICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdHcm91cGluZy5pbmNsdWRlcyhjb2x1bW5JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdy5fdmFsdWVzQ2FjaGUuaGFzT3duUHJvcGVydHkoY29sdW1uSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdy5fdmFsdWVzQ2FjaGVbY29sdW1uSWRdXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBlZFJvd3NbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICByb3cuX3ZhbHVlc0NhY2hlW2NvbHVtbklkXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUm93c1swXS5nZXRWYWx1ZShjb2x1bW5JZCkgPz8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93Ll92YWx1ZXNDYWNoZVtjb2x1bW5JZF1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgaWYgKHJvdy5fZ3JvdXBpbmdWYWx1ZXNDYWNoZS5oYXNPd25Qcm9wZXJ0eShjb2x1bW5JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdy5fZ3JvdXBpbmdWYWx1ZXNDYWNoZVtjb2x1bW5JZF1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gQWdncmVnYXRlIHRoZSB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRhYmxlLmdldENvbHVtbihjb2x1bW5JZClcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFnZ3JlZ2F0ZUZuID0gY29sdW1uPy5nZXRBZ2dyZWdhdGlvbkZuKClcblxuICAgICAgICAgICAgICAgICAgaWYgKGFnZ3JlZ2F0ZUZuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdy5fZ3JvdXBpbmdWYWx1ZXNDYWNoZVtjb2x1bW5JZF0gPSBhZ2dyZWdhdGVGbihcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICBsZWFmUm93cyxcbiAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUm93c1xuICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdy5fZ3JvdXBpbmdWYWx1ZXNDYWNoZVtjb2x1bW5JZF1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIHN1YlJvd3MuZm9yRWFjaChzdWJSb3cgPT4ge1xuICAgICAgICAgICAgICAgIGdyb3VwZWRGbGF0Um93cy5wdXNoKHN1YlJvdylcbiAgICAgICAgICAgICAgICBncm91cGVkUm93c0J5SWRbc3ViUm93LmlkXSA9IHN1YlJvd1xuICAgICAgICAgICAgICAgIC8vIGlmIChzdWJSb3cuZ2V0SXNHcm91cGVkPy4oKSkge1xuICAgICAgICAgICAgICAgIC8vICAgb25seUdyb3VwZWRGbGF0Um93cy5wdXNoKHN1YlJvdyk7XG4gICAgICAgICAgICAgICAgLy8gICBvbmx5R3JvdXBlZFJvd3NCeUlkW3N1YlJvdy5pZF0gPSBzdWJSb3c7XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgIG5vbkdyb3VwZWRGbGF0Um93cy5wdXNoKHN1YlJvdyk7XG4gICAgICAgICAgICAgICAgLy8gICBub25Hcm91cGVkUm93c0J5SWRbc3ViUm93LmlkXSA9IHN1YlJvdztcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgcmV0dXJuIHJvd1xuICAgICAgICAgICAgfVxuICAgICAgICAgIClcblxuICAgICAgICAgIHJldHVybiBhZ2dyZWdhdGVkR3JvdXBlZFJvd3NcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdyb3VwZWRSb3dzID0gZ3JvdXBVcFJlY3Vyc2l2ZWx5KHJvd01vZGVsLnJvd3MsIDApXG5cbiAgICAgICAgZ3JvdXBlZFJvd3MuZm9yRWFjaChzdWJSb3cgPT4ge1xuICAgICAgICAgIGdyb3VwZWRGbGF0Um93cy5wdXNoKHN1YlJvdylcbiAgICAgICAgICBncm91cGVkUm93c0J5SWRbc3ViUm93LmlkXSA9IHN1YlJvd1xuICAgICAgICAgIC8vIGlmIChzdWJSb3cuZ2V0SXNHcm91cGVkPy4oKSkge1xuICAgICAgICAgIC8vICAgb25seUdyb3VwZWRGbGF0Um93cy5wdXNoKHN1YlJvdyk7XG4gICAgICAgICAgLy8gICBvbmx5R3JvdXBlZFJvd3NCeUlkW3N1YlJvdy5pZF0gPSBzdWJSb3c7XG4gICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAvLyAgIG5vbkdyb3VwZWRGbGF0Um93cy5wdXNoKHN1YlJvdyk7XG4gICAgICAgICAgLy8gICBub25Hcm91cGVkUm93c0J5SWRbc3ViUm93LmlkXSA9IHN1YlJvdztcbiAgICAgICAgICAvLyB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByb3dzOiBncm91cGVkUm93cyxcbiAgICAgICAgICBmbGF0Um93czogZ3JvdXBlZEZsYXRSb3dzLFxuICAgICAgICAgIHJvd3NCeUlkOiBncm91cGVkUm93c0J5SWQsXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldEdyb3VwZWRSb3dNb2RlbCcsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdUYWJsZSxcbiAgICAgICAgb25DaGFuZ2U6ICgpID0+IHtcbiAgICAgICAgICB0YWJsZS5fcXVldWUoKCkgPT4ge1xuICAgICAgICAgICAgdGFibGUuX2F1dG9SZXNldEV4cGFuZGVkKClcbiAgICAgICAgICAgIHRhYmxlLl9hdXRvUmVzZXRQYWdlSW5kZXgoKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKVxufVxuXG5mdW5jdGlvbiBncm91cEJ5PFREYXRhIGV4dGVuZHMgUm93RGF0YT4ocm93czogUm93PFREYXRhPltdLCBjb2x1bW5JZDogc3RyaW5nKSB7XG4gIGNvbnN0IGdyb3VwTWFwID0gbmV3IE1hcDxhbnksIFJvdzxURGF0YT5bXT4oKVxuXG4gIHJldHVybiByb3dzLnJlZHVjZSgobWFwLCByb3cpID0+IHtcbiAgICBjb25zdCByZXNLZXkgPSBgJHtyb3cuZ2V0R3JvdXBpbmdWYWx1ZShjb2x1bW5JZCl9YFxuICAgIGNvbnN0IHByZXZpb3VzID0gbWFwLmdldChyZXNLZXkpXG4gICAgaWYgKCFwcmV2aW91cykge1xuICAgICAgbWFwLnNldChyZXNLZXksIFtyb3ddKVxuICAgIH0gZWxzZSB7XG4gICAgICBwcmV2aW91cy5wdXNoKHJvdylcbiAgICB9XG4gICAgcmV0dXJuIG1hcFxuICB9LCBncm91cE1hcClcbn1cbiIsImltcG9ydCB7IFRhYmxlLCBSb3csIFJvd01vZGVsLCBSb3dEYXRhIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBhbmRlZFJvd01vZGVsPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oKTogKFxuICB0YWJsZTogVGFibGU8VERhdGE+XG4pID0+ICgpID0+IFJvd01vZGVsPFREYXRhPiB7XG4gIHJldHVybiB0YWJsZSA9PlxuICAgIG1lbW8oXG4gICAgICAoKSA9PiBbXG4gICAgICAgIHRhYmxlLmdldFN0YXRlKCkuZXhwYW5kZWQsXG4gICAgICAgIHRhYmxlLmdldFByZUV4cGFuZGVkUm93TW9kZWwoKSxcbiAgICAgICAgdGFibGUub3B0aW9ucy5wYWdpbmF0ZUV4cGFuZGVkUm93cyxcbiAgICAgIF0sXG4gICAgICAoZXhwYW5kZWQsIHJvd01vZGVsLCBwYWdpbmF0ZUV4cGFuZGVkUm93cykgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXJvd01vZGVsLnJvd3MubGVuZ3RoIHx8XG4gICAgICAgICAgKGV4cGFuZGVkICE9PSB0cnVlICYmICFPYmplY3Qua2V5cyhleHBhbmRlZCA/PyB7fSkubGVuZ3RoKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gcm93TW9kZWxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFnaW5hdGVFeHBhbmRlZFJvd3MpIHtcbiAgICAgICAgICAvLyBPbmx5IGV4cGFuZCByb3dzIGF0IHRoaXMgcG9pbnQgaWYgdGhleSBhcmUgYmVpbmcgcGFnaW5hdGVkXG4gICAgICAgICAgcmV0dXJuIHJvd01vZGVsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhwYW5kUm93cyhyb3dNb2RlbClcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldEV4cGFuZGVkUm93TW9kZWwnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnVGFibGUsXG4gICAgICB9XG4gICAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kUm93czxURGF0YSBleHRlbmRzIFJvd0RhdGE+KHJvd01vZGVsOiBSb3dNb2RlbDxURGF0YT4pIHtcbiAgY29uc3QgZXhwYW5kZWRSb3dzOiBSb3c8VERhdGE+W10gPSBbXVxuXG4gIGNvbnN0IGhhbmRsZVJvdyA9IChyb3c6IFJvdzxURGF0YT4pID0+IHtcbiAgICBleHBhbmRlZFJvd3MucHVzaChyb3cpXG5cbiAgICBpZiAocm93LnN1YlJvd3M/Lmxlbmd0aCAmJiByb3cuZ2V0SXNFeHBhbmRlZCgpKSB7XG4gICAgICByb3cuc3ViUm93cy5mb3JFYWNoKGhhbmRsZVJvdylcbiAgICB9XG4gIH1cblxuICByb3dNb2RlbC5yb3dzLmZvckVhY2goaGFuZGxlUm93KVxuXG4gIHJldHVybiB7XG4gICAgcm93czogZXhwYW5kZWRSb3dzLFxuICAgIGZsYXRSb3dzOiByb3dNb2RlbC5mbGF0Um93cyxcbiAgICByb3dzQnlJZDogcm93TW9kZWwucm93c0J5SWQsXG4gIH1cbn1cbiIsImltcG9ydCB7IFRhYmxlLCBSb3dNb2RlbCwgUm93LCBSb3dEYXRhIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBleHBhbmRSb3dzIH0gZnJvbSAnLi9nZXRFeHBhbmRlZFJvd01vZGVsJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFnaW5hdGlvblJvd01vZGVsPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ob3B0cz86IHtcbiAgaW5pdGlhbFN5bmM6IGJvb2xlYW5cbn0pOiAodGFibGU6IFRhYmxlPFREYXRhPikgPT4gKCkgPT4gUm93TW9kZWw8VERhdGE+IHtcbiAgcmV0dXJuIHRhYmxlID0+XG4gICAgbWVtbyhcbiAgICAgICgpID0+IFtcbiAgICAgICAgdGFibGUuZ2V0U3RhdGUoKS5wYWdpbmF0aW9uLFxuICAgICAgICB0YWJsZS5nZXRQcmVQYWdpbmF0aW9uUm93TW9kZWwoKSxcbiAgICAgICAgdGFibGUub3B0aW9ucy5wYWdpbmF0ZUV4cGFuZGVkUm93c1xuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiB0YWJsZS5nZXRTdGF0ZSgpLmV4cGFuZGVkLFxuICAgICAgXSxcbiAgICAgIChwYWdpbmF0aW9uLCByb3dNb2RlbCkgPT4ge1xuICAgICAgICBpZiAoIXJvd01vZGVsLnJvd3MubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHJvd01vZGVsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHBhZ2VTaXplLCBwYWdlSW5kZXggfSA9IHBhZ2luYXRpb25cbiAgICAgICAgbGV0IHsgcm93cywgZmxhdFJvd3MsIHJvd3NCeUlkIH0gPSByb3dNb2RlbFxuICAgICAgICBjb25zdCBwYWdlU3RhcnQgPSBwYWdlU2l6ZSAqIHBhZ2VJbmRleFxuICAgICAgICBjb25zdCBwYWdlRW5kID0gcGFnZVN0YXJ0ICsgcGFnZVNpemVcblxuICAgICAgICByb3dzID0gcm93cy5zbGljZShwYWdlU3RhcnQsIHBhZ2VFbmQpXG5cbiAgICAgICAgbGV0IHBhZ2luYXRlZFJvd01vZGVsOiBSb3dNb2RlbDxURGF0YT5cblxuICAgICAgICBpZiAoIXRhYmxlLm9wdGlvbnMucGFnaW5hdGVFeHBhbmRlZFJvd3MpIHtcbiAgICAgICAgICBwYWdpbmF0ZWRSb3dNb2RlbCA9IGV4cGFuZFJvd3Moe1xuICAgICAgICAgICAgcm93cyxcbiAgICAgICAgICAgIGZsYXRSb3dzLFxuICAgICAgICAgICAgcm93c0J5SWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYWdpbmF0ZWRSb3dNb2RlbCA9IHtcbiAgICAgICAgICAgIHJvd3MsXG4gICAgICAgICAgICBmbGF0Um93cyxcbiAgICAgICAgICAgIHJvd3NCeUlkLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHBhZ2luYXRlZFJvd01vZGVsLmZsYXRSb3dzID0gW11cblxuICAgICAgICBjb25zdCBoYW5kbGVSb3cgPSAocm93OiBSb3c8VERhdGE+KSA9PiB7XG4gICAgICAgICAgcGFnaW5hdGVkUm93TW9kZWwuZmxhdFJvd3MucHVzaChyb3cpXG4gICAgICAgICAgaWYgKHJvdy5zdWJSb3dzLmxlbmd0aCkge1xuICAgICAgICAgICAgcm93LnN1YlJvd3MuZm9yRWFjaChoYW5kbGVSb3cpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcGFnaW5hdGVkUm93TW9kZWwucm93cy5mb3JFYWNoKGhhbmRsZVJvdylcblxuICAgICAgICByZXR1cm4gcGFnaW5hdGVkUm93TW9kZWxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldFBhZ2luYXRpb25Sb3dNb2RlbCcsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdUYWJsZSxcbiAgICAgIH1cbiAgICApXG59XG4iXSwibmFtZXMiOlsiZnVuY3Rpb25hbFVwZGF0ZSIsInVwZGF0ZXIiLCJpbnB1dCIsIm5vb3AiLCJtYWtlU3RhdGVVcGRhdGVyIiwia2V5IiwiaW5zdGFuY2UiLCJzZXRTdGF0ZSIsIm9sZCIsImlzRnVuY3Rpb24iLCJkIiwiRnVuY3Rpb24iLCJpc051bWJlckFycmF5IiwiQXJyYXkiLCJpc0FycmF5IiwiZXZlcnkiLCJ2YWwiLCJmbGF0dGVuQnkiLCJhcnIiLCJnZXRDaGlsZHJlbiIsImZsYXQiLCJyZWN1cnNlIiwic3ViQXJyIiwiZm9yRWFjaCIsIml0ZW0iLCJwdXNoIiwiY2hpbGRyZW4iLCJsZW5ndGgiLCJtZW1vIiwiZ2V0RGVwcyIsImZuIiwib3B0cyIsImRlcHMiLCJyZXN1bHQiLCJkZXBUaW1lIiwiZGVidWciLCJEYXRlIiwibm93IiwibmV3RGVwcyIsImRlcHNDaGFuZ2VkIiwic29tZSIsImRlcCIsImluZGV4IiwicmVzdWx0VGltZSIsIm9uQ2hhbmdlIiwiZGVwRW5kVGltZSIsIk1hdGgiLCJyb3VuZCIsInJlc3VsdEVuZFRpbWUiLCJyZXN1bHRGcHNQZXJjZW50YWdlIiwicGFkIiwic3RyIiwibnVtIiwiU3RyaW5nIiwiY29uc29sZSIsImluZm8iLCJtYXgiLCJtaW4iLCJjcmVhdGVDb2x1bW4iLCJ0YWJsZSIsImNvbHVtbkRlZiIsImRlcHRoIiwicGFyZW50IiwiX3JlZiIsIl9yZXNvbHZlZENvbHVtbkRlZiRpZCIsImRlZmF1bHRDb2x1bW4iLCJfZ2V0RGVmYXVsdENvbHVtbkRlZiIsInJlc29sdmVkQ29sdW1uRGVmIiwiYWNjZXNzb3JLZXkiLCJpZCIsInJlcGxhY2UiLCJ1bmRlZmluZWQiLCJoZWFkZXIiLCJhY2Nlc3NvckZuIiwiaW5jbHVkZXMiLCJvcmlnaW5hbFJvdyIsInNwbGl0IiwiX3Jlc3VsdCIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsIndhcm4iLCJFcnJvciIsImNvbHVtbiIsImNvbHVtbnMiLCJnZXRGbGF0Q29sdW1ucyIsIl9jb2x1bW4kY29sdW1ucyIsImZsYXRNYXAiLCJfdGFibGUkb3B0aW9ucyRkZWJ1Z0EiLCJvcHRpb25zIiwiZGVidWdBbGwiLCJkZWJ1Z0NvbHVtbnMiLCJnZXRMZWFmQ29sdW1ucyIsIl9nZXRPcmRlckNvbHVtbnNGbiIsIm9yZGVyQ29sdW1ucyIsIl9jb2x1bW4kY29sdW1uczIiLCJsZWFmQ29sdW1ucyIsIl90YWJsZSRvcHRpb25zJGRlYnVnQTIiLCJmZWF0dXJlIiwiX2ZlYXR1cmVzIiwiY3JlYXRlSGVhZGVyIiwiX29wdGlvbnMkaWQiLCJpc1BsYWNlaG9sZGVyIiwicGxhY2Vob2xkZXJJZCIsInN1YkhlYWRlcnMiLCJjb2xTcGFuIiwicm93U3BhbiIsImhlYWRlckdyb3VwIiwiZ2V0TGVhZkhlYWRlcnMiLCJsZWFmSGVhZGVycyIsInJlY3Vyc2VIZWFkZXIiLCJoIiwibWFwIiwiZ2V0Q29udGV4dCIsIkhlYWRlcnMiLCJjcmVhdGVUYWJsZSIsImdldEhlYWRlckdyb3VwcyIsImdldEFsbENvbHVtbnMiLCJnZXRWaXNpYmxlTGVhZkNvbHVtbnMiLCJnZXRTdGF0ZSIsImNvbHVtblBpbm5pbmciLCJsZWZ0IiwicmlnaHQiLCJhbGxDb2x1bW5zIiwiX2xlZnQkbWFwJGZpbHRlciIsIl9yaWdodCRtYXAkZmlsdGVyIiwibGVmdENvbHVtbnMiLCJjb2x1bW5JZCIsImZpbmQiLCJmaWx0ZXIiLCJCb29sZWFuIiwicmlnaHRDb2x1bW5zIiwiY2VudGVyQ29sdW1ucyIsImhlYWRlckdyb3VwcyIsImJ1aWxkSGVhZGVyR3JvdXBzIiwiZGVidWdIZWFkZXJzIiwiZ2V0Q2VudGVySGVhZGVyR3JvdXBzIiwiZ2V0TGVmdEhlYWRlckdyb3VwcyIsIl9sZWZ0JG1hcCRmaWx0ZXIyIiwib3JkZXJlZExlYWZDb2x1bW5zIiwiX3RhYmxlJG9wdGlvbnMkZGVidWdBMyIsImdldFJpZ2h0SGVhZGVyR3JvdXBzIiwiX3JpZ2h0JG1hcCRmaWx0ZXIyIiwiX3RhYmxlJG9wdGlvbnMkZGVidWdBNCIsImdldEZvb3Rlckdyb3VwcyIsInJldmVyc2UiLCJfdGFibGUkb3B0aW9ucyRkZWJ1Z0E1IiwiZ2V0TGVmdEZvb3Rlckdyb3VwcyIsIl90YWJsZSRvcHRpb25zJGRlYnVnQTYiLCJnZXRDZW50ZXJGb290ZXJHcm91cHMiLCJfdGFibGUkb3B0aW9ucyRkZWJ1Z0E3IiwiZ2V0UmlnaHRGb290ZXJHcm91cHMiLCJfdGFibGUkb3B0aW9ucyRkZWJ1Z0E4IiwiZ2V0RmxhdEhlYWRlcnMiLCJoZWFkZXJzIiwiX3RhYmxlJG9wdGlvbnMkZGVidWdBOSIsImdldExlZnRGbGF0SGVhZGVycyIsIl90YWJsZSRvcHRpb25zJGRlYnVnQTEwIiwiZ2V0Q2VudGVyRmxhdEhlYWRlcnMiLCJfdGFibGUkb3B0aW9ucyRkZWJ1Z0ExMSIsImdldFJpZ2h0RmxhdEhlYWRlcnMiLCJfdGFibGUkb3B0aW9ucyRkZWJ1Z0ExMiIsImdldENlbnRlckxlYWZIZWFkZXJzIiwiZmxhdEhlYWRlcnMiLCJfaGVhZGVyJHN1YkhlYWRlcnMiLCJfdGFibGUkb3B0aW9ucyRkZWJ1Z0ExMyIsImdldExlZnRMZWFmSGVhZGVycyIsIl9oZWFkZXIkc3ViSGVhZGVyczIiLCJfdGFibGUkb3B0aW9ucyRkZWJ1Z0ExNCIsImdldFJpZ2h0TGVhZkhlYWRlcnMiLCJfaGVhZGVyJHN1YkhlYWRlcnMzIiwiX3RhYmxlJG9wdGlvbnMkZGVidWdBMTUiLCJjZW50ZXIiLCJfbGVmdCQwJGhlYWRlcnMiLCJfbGVmdCQiLCJfY2VudGVyJDAkaGVhZGVycyIsIl9jZW50ZXIkIiwiX3JpZ2h0JDAkaGVhZGVycyIsIl9yaWdodCQiLCJfdGFibGUkb3B0aW9ucyRkZWJ1Z0ExNiIsImNvbHVtbnNUb0dyb3VwIiwiaGVhZGVyRmFtaWx5IiwiX2hlYWRlckdyb3VwcyQwJGhlYWRlIiwiX2hlYWRlckdyb3VwcyQiLCJtYXhEZXB0aCIsImZpbmRNYXhEZXB0aCIsImdldElzVmlzaWJsZSIsImNyZWF0ZUhlYWRlckdyb3VwIiwiaGVhZGVyc1RvR3JvdXAiLCJqb2luIiwicGVuZGluZ1BhcmVudEhlYWRlcnMiLCJoZWFkZXJUb0dyb3VwIiwibGF0ZXN0UGVuZGluZ1BhcmVudEhlYWRlciIsImlzTGVhZkhlYWRlciIsImJvdHRvbUhlYWRlcnMiLCJyZWN1cnNlSGVhZGVyc0ZvclNwYW5zIiwiZmlsdGVyZWRIZWFkZXJzIiwiY2hpbGRSb3dTcGFucyIsImNoaWxkQ29sU3BhbiIsImNoaWxkUm93U3BhbiIsIm1pbkNoaWxkUm93U3BhbiIsImRlZmF1bHRDb2x1bW5TaXppbmciLCJzaXplIiwibWluU2l6ZSIsIm1heFNpemUiLCJOdW1iZXIiLCJNQVhfU0FGRV9JTlRFR0VSIiwiZ2V0RGVmYXVsdENvbHVtblNpemluZ0luZm9TdGF0ZSIsInN0YXJ0T2Zmc2V0Iiwic3RhcnRTaXplIiwiZGVsdGFPZmZzZXQiLCJkZWx0YVBlcmNlbnRhZ2UiLCJpc1Jlc2l6aW5nQ29sdW1uIiwiY29sdW1uU2l6aW5nU3RhcnQiLCJDb2x1bW5TaXppbmciLCJnZXREZWZhdWx0Q29sdW1uRGVmIiwiZ2V0SW5pdGlhbFN0YXRlIiwic3RhdGUiLCJjb2x1bW5TaXppbmciLCJjb2x1bW5TaXppbmdJbmZvIiwiZ2V0RGVmYXVsdE9wdGlvbnMiLCJjb2x1bW5SZXNpemVNb2RlIiwib25Db2x1bW5TaXppbmdDaGFuZ2UiLCJvbkNvbHVtblNpemluZ0luZm9DaGFuZ2UiLCJnZXRTaXplIiwiX2NvbHVtbiRjb2x1bW5EZWYkbWluIiwiX2NvbHVtbiRjb2x1bW5EZWYkbWF4IiwiY29sdW1uU2l6ZSIsImdldFN0YXJ0IiwicG9zaXRpb24iLCJnZXRMZWZ0VmlzaWJsZUxlYWZDb2x1bW5zIiwiZ2V0UmlnaHRWaXNpYmxlTGVhZkNvbHVtbnMiLCJmaW5kSW5kZXgiLCJwcmV2U2libGluZ0NvbHVtbiIsInJlc2V0U2l6ZSIsInNldENvbHVtblNpemluZyIsIl9yZWYyIiwiXyIsInJlc3QiLCJnZXRDYW5SZXNpemUiLCJfY29sdW1uJGNvbHVtbkRlZiRlbmEiLCJfdGFibGUkb3B0aW9ucyRlbmFibGUiLCJlbmFibGVSZXNpemluZyIsImVuYWJsZUNvbHVtblJlc2l6aW5nIiwiZ2V0SXNSZXNpemluZyIsInN1bSIsIl9oZWFkZXIkY29sdW1uJGdldFNpeiIsInByZXZTaWJsaW5nSGVhZGVyIiwiZ2V0UmVzaXplSGFuZGxlciIsImdldENvbHVtbiIsImNhblJlc2l6ZSIsImUiLCJwZXJzaXN0IiwiaXNUb3VjaFN0YXJ0RXZlbnQiLCJ0b3VjaGVzIiwiY2xpZW50WCIsIm5ld0NvbHVtblNpemluZyIsInVwZGF0ZU9mZnNldCIsImV2ZW50VHlwZSIsImNsaWVudFhQb3MiLCJzZXRDb2x1bW5TaXppbmdJbmZvIiwiX29sZCRzdGFydE9mZnNldCIsIl9vbGQkc3RhcnRTaXplIiwiX3JlZjMiLCJoZWFkZXJTaXplIiwib25Nb3ZlIiwib25FbmQiLCJtb3VzZUV2ZW50cyIsIm1vdmVIYW5kbGVyIiwidXBIYW5kbGVyIiwiZG9jdW1lbnQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwidG91Y2hFdmVudHMiLCJjYW5jZWxhYmxlIiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJfZSR0b3VjaGVzJCIsInBhc3NpdmVJZlN1cHBvcnRlZCIsInBhc3NpdmVFdmVudFN1cHBvcnRlZCIsInBhc3NpdmUiLCJhZGRFdmVudExpc3RlbmVyIiwicmVzZXRDb2x1bW5TaXppbmciLCJkZWZhdWx0U3RhdGUiLCJfdGFibGUkaW5pdGlhbFN0YXRlJGMiLCJpbml0aWFsU3RhdGUiLCJyZXNldEhlYWRlclNpemVJbmZvIiwiX3RhYmxlJGluaXRpYWxTdGF0ZSRjMiIsImdldFRvdGFsU2l6ZSIsIl90YWJsZSRnZXRIZWFkZXJHcm91cCIsIl90YWJsZSRnZXRIZWFkZXJHcm91cDIiLCJyZWR1Y2UiLCJnZXRMZWZ0VG90YWxTaXplIiwiX3RhYmxlJGdldExlZnRIZWFkZXJHIiwiX3RhYmxlJGdldExlZnRIZWFkZXJHMiIsImdldENlbnRlclRvdGFsU2l6ZSIsIl90YWJsZSRnZXRDZW50ZXJIZWFkZSIsIl90YWJsZSRnZXRDZW50ZXJIZWFkZTIiLCJnZXRSaWdodFRvdGFsU2l6ZSIsIl90YWJsZSRnZXRSaWdodEhlYWRlciIsIl90YWJsZSRnZXRSaWdodEhlYWRlcjIiLCJwYXNzaXZlU3VwcG9ydGVkIiwic3VwcG9ydGVkIiwid2luZG93IiwiZXJyIiwidHlwZSIsIkV4cGFuZGluZyIsImV4cGFuZGVkIiwib25FeHBhbmRlZENoYW5nZSIsInBhZ2luYXRlRXhwYW5kZWRSb3dzIiwicmVnaXN0ZXJlZCIsInF1ZXVlZCIsIl9hdXRvUmVzZXRFeHBhbmRlZCIsIl90YWJsZSRvcHRpb25zJGF1dG9SZSIsIl9xdWV1ZSIsImF1dG9SZXNldEFsbCIsImF1dG9SZXNldEV4cGFuZGVkIiwibWFudWFsRXhwYW5kaW5nIiwicmVzZXRFeHBhbmRlZCIsInNldEV4cGFuZGVkIiwidG9nZ2xlQWxsUm93c0V4cGFuZGVkIiwiZ2V0SXNBbGxSb3dzRXhwYW5kZWQiLCJfdGFibGUkaW5pdGlhbFN0YXRlJGUiLCJfdGFibGUkaW5pdGlhbFN0YXRlIiwiZ2V0Q2FuU29tZVJvd3NFeHBhbmQiLCJnZXRQcmVQYWdpbmF0aW9uUm93TW9kZWwiLCJmbGF0Um93cyIsInJvdyIsImdldENhbkV4cGFuZCIsImdldFRvZ2dsZUFsbFJvd3NFeHBhbmRlZEhhbmRsZXIiLCJnZXRJc1NvbWVSb3dzRXhwYW5kZWQiLCJPYmplY3QiLCJ2YWx1ZXMiLCJrZXlzIiwiZ2V0Um93TW9kZWwiLCJnZXRJc0V4cGFuZGVkIiwiZ2V0RXhwYW5kZWREZXB0aCIsInJvd0lkcyIsInJvd3NCeUlkIiwic3BsaXRJZCIsImdldFByZUV4cGFuZGVkUm93TW9kZWwiLCJnZXRTb3J0ZWRSb3dNb2RlbCIsImdldEV4cGFuZGVkUm93TW9kZWwiLCJfZ2V0RXhwYW5kZWRSb3dNb2RlbCIsImNyZWF0ZVJvdyIsInRvZ2dsZUV4cGFuZGVkIiwiX2V4cGFuZGVkIiwiZXhpc3RzIiwib2xkRXhwYW5kZWQiLCJyb3dJZCIsIl90YWJsZSRvcHRpb25zJGdldElzUiIsImdldElzUm93RXhwYW5kZWQiLCJfdGFibGUkb3B0aW9ucyRnZXRSb3ciLCJfcm93JHN1YlJvd3MiLCJnZXRSb3dDYW5FeHBhbmQiLCJlbmFibGVFeHBhbmRpbmciLCJzdWJSb3dzIiwiZ2V0SXNBbGxQYXJlbnRzRXhwYW5kZWQiLCJpc0Z1bGx5RXhwYW5kZWQiLCJjdXJyZW50Um93IiwicGFyZW50SWQiLCJnZXRSb3ciLCJnZXRUb2dnbGVFeHBhbmRlZEhhbmRsZXIiLCJjYW5FeHBhbmQiLCJpbmNsdWRlc1N0cmluZyIsImZpbHRlclZhbHVlIiwiX3JvdyRnZXRWYWx1ZSIsInNlYXJjaCIsInRvTG93ZXJDYXNlIiwiZ2V0VmFsdWUiLCJ0b1N0cmluZyIsImF1dG9SZW1vdmUiLCJ0ZXN0RmFsc2V5IiwiaW5jbHVkZXNTdHJpbmdTZW5zaXRpdmUiLCJfcm93JGdldFZhbHVlMiIsImVxdWFsc1N0cmluZyIsIl9yb3ckZ2V0VmFsdWUzIiwiYXJySW5jbHVkZXMiLCJfcm93JGdldFZhbHVlNCIsImFyckluY2x1ZGVzQWxsIiwiX3JvdyRnZXRWYWx1ZTUiLCJhcnJJbmNsdWRlc1NvbWUiLCJfcm93JGdldFZhbHVlNiIsImVxdWFscyIsIndlYWtFcXVhbHMiLCJpbk51bWJlclJhbmdlIiwicm93VmFsdWUiLCJyZXNvbHZlRmlsdGVyVmFsdWUiLCJ1bnNhZmVNaW4iLCJ1bnNhZmVNYXgiLCJwYXJzZWRNaW4iLCJwYXJzZUZsb2F0IiwicGFyc2VkTWF4IiwiaXNOYU4iLCJJbmZpbml0eSIsInRlbXAiLCJmaWx0ZXJGbnMiLCJGaWx0ZXJzIiwiZmlsdGVyRm4iLCJjb2x1bW5GaWx0ZXJzIiwiZ2xvYmFsRmlsdGVyIiwib25Db2x1bW5GaWx0ZXJzQ2hhbmdlIiwib25HbG9iYWxGaWx0ZXJDaGFuZ2UiLCJmaWx0ZXJGcm9tTGVhZlJvd3MiLCJtYXhMZWFmUm93RmlsdGVyRGVwdGgiLCJnbG9iYWxGaWx0ZXJGbiIsImdldENvbHVtbkNhbkdsb2JhbEZpbHRlciIsIl90YWJsZSRnZXRDb3JlUm93TW9kZSIsInZhbHVlIiwiZ2V0Q29yZVJvd01vZGVsIiwiX2dldEFsbENlbGxzQnlDb2x1bW5JZCIsImdldEF1dG9GaWx0ZXJGbiIsImZpcnN0Um93IiwiZ2V0RmlsdGVyRm4iLCJfdGFibGUkb3B0aW9ucyRmaWx0ZXIiLCJfdGFibGUkb3B0aW9ucyRmaWx0ZXIyIiwiZ2V0Q2FuRmlsdGVyIiwiX3RhYmxlJG9wdGlvbnMkZW5hYmxlMiIsImVuYWJsZUNvbHVtbkZpbHRlciIsImVuYWJsZUNvbHVtbkZpbHRlcnMiLCJlbmFibGVGaWx0ZXJzIiwiZ2V0Q2FuR2xvYmFsRmlsdGVyIiwiX2NvbHVtbiRjb2x1bW5EZWYkZW5hMiIsIl90YWJsZSRvcHRpb25zJGVuYWJsZTMiLCJfdGFibGUkb3B0aW9ucyRlbmFibGU0IiwiX3RhYmxlJG9wdGlvbnMkZ2V0Q29sIiwiZW5hYmxlR2xvYmFsRmlsdGVyIiwiZ2V0SXNGaWx0ZXJlZCIsImdldEZpbHRlckluZGV4IiwiZ2V0RmlsdGVyVmFsdWUiLCJfdGFibGUkZ2V0U3RhdGUkY29sdW0iLCJfdGFibGUkZ2V0U3RhdGUkY29sdW0yIiwiX3RhYmxlJGdldFN0YXRlJGNvbHVtMyIsInNldEZpbHRlclZhbHVlIiwic2V0Q29sdW1uRmlsdGVycyIsInByZXZpb3VzZmlsdGVyIiwibmV3RmlsdGVyIiwic2hvdWxkQXV0b1JlbW92ZUZpbHRlciIsIl9vbGQkZmlsdGVyIiwibmV3RmlsdGVyT2JqIiwiX29sZCRtYXAiLCJfZ2V0RmFjZXRlZFJvd01vZGVsIiwiZ2V0RmFjZXRlZFJvd01vZGVsIiwiZ2V0UHJlRmlsdGVyZWRSb3dNb2RlbCIsIl9nZXRGYWNldGVkVW5pcXVlVmFsdWVzIiwiZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcyIsIk1hcCIsIl9nZXRGYWNldGVkTWluTWF4VmFsdWVzIiwiZ2V0RmFjZXRlZE1pbk1heFZhbHVlcyIsImNvbHVtbkZpbHRlcnNNZXRhIiwiZ2V0R2xvYmFsQXV0b0ZpbHRlckZuIiwiZ2V0R2xvYmFsRmlsdGVyRm4iLCJfdGFibGUkb3B0aW9ucyRmaWx0ZXIzIiwiX3RhYmxlJG9wdGlvbnMkZmlsdGVyNCIsImdldEFsbExlYWZDb2x1bW5zIiwidXBkYXRlRm4iLCJfZnVuY3Rpb25hbFVwZGF0ZSIsInNldEdsb2JhbEZpbHRlciIsInJlc2V0R2xvYmFsRmlsdGVyIiwicmVzZXRDb2x1bW5GaWx0ZXJzIiwiZ2V0RmlsdGVyZWRSb3dNb2RlbCIsIl9nZXRGaWx0ZXJlZFJvd01vZGVsIiwibWFudWFsRmlsdGVyaW5nIiwiX2dldEdsb2JhbEZhY2V0ZWRSb3dNb2RlbCIsImdldEdsb2JhbEZhY2V0ZWRSb3dNb2RlbCIsIl9nZXRHbG9iYWxGYWNldGVkVW5pcXVlVmFsdWVzIiwiZ2V0R2xvYmFsRmFjZXRlZFVuaXF1ZVZhbHVlcyIsIl9nZXRHbG9iYWxGYWNldGVkTWluTWF4VmFsdWVzIiwiZ2V0R2xvYmFsRmFjZXRlZE1pbk1heFZhbHVlcyIsIl9sZWFmUm93cyIsImNoaWxkUm93cyIsIm5leHQiLCJuZXh0VmFsdWUiLCJleHRlbnQiLCJtZWFuIiwibGVhZlJvd3MiLCJjb3VudCIsIm1lZGlhbiIsIm1pZCIsImZsb29yIiwibnVtcyIsInNvcnQiLCJhIiwiYiIsInVuaXF1ZSIsImZyb20iLCJTZXQiLCJ1bmlxdWVDb3VudCIsIl9jb2x1bW5JZCIsImFnZ3JlZ2F0aW9uRm5zIiwiR3JvdXBpbmciLCJhZ2dyZWdhdGVkQ2VsbCIsInByb3BzIiwiX3RvU3RyaW5nIiwiX3Byb3BzJGdldFZhbHVlIiwiYWdncmVnYXRpb25GbiIsImdyb3VwaW5nIiwib25Hcm91cGluZ0NoYW5nZSIsImdyb3VwZWRDb2x1bW5Nb2RlIiwidG9nZ2xlR3JvdXBpbmciLCJzZXRHcm91cGluZyIsImdldENhbkdyb3VwIiwiZW5hYmxlR3JvdXBpbmciLCJnZXRJc0dyb3VwZWQiLCJfdGFibGUkZ2V0U3RhdGUkZ3JvdXAiLCJnZXRHcm91cGVkSW5kZXgiLCJfdGFibGUkZ2V0U3RhdGUkZ3JvdXAyIiwiaW5kZXhPZiIsImdldFRvZ2dsZUdyb3VwaW5nSGFuZGxlciIsImNhbkdyb3VwIiwiZ2V0QXV0b0FnZ3JlZ2F0aW9uRm4iLCJwcm90b3R5cGUiLCJjYWxsIiwiZ2V0QWdncmVnYXRpb25GbiIsIl90YWJsZSRvcHRpb25zJGFnZ3JlZyIsIl90YWJsZSRvcHRpb25zJGFnZ3JlZzIiLCJyZXNldEdyb3VwaW5nIiwiX3RhYmxlJGluaXRpYWxTdGF0ZSRnIiwiZ2V0UHJlR3JvdXBlZFJvd01vZGVsIiwiZ2V0R3JvdXBlZFJvd01vZGVsIiwiX2dldEdyb3VwZWRSb3dNb2RlbCIsIm1hbnVhbEdyb3VwaW5nIiwiZ3JvdXBpbmdDb2x1bW5JZCIsImdldEdyb3VwaW5nVmFsdWUiLCJfZ3JvdXBpbmdWYWx1ZXNDYWNoZSIsImhhc093blByb3BlcnR5Iiwib3JpZ2luYWwiLCJjcmVhdGVDZWxsIiwiY2VsbCIsImdldElzUGxhY2Vob2xkZXIiLCJnZXRJc0FnZ3JlZ2F0ZWQiLCJub25Hcm91cGluZ0NvbHVtbnMiLCJjb2wiLCJncm91cGluZ0NvbHVtbnMiLCJnIiwiT3JkZXJpbmciLCJjb2x1bW5PcmRlciIsIm9uQ29sdW1uT3JkZXJDaGFuZ2UiLCJzZXRDb2x1bW5PcmRlciIsInJlc2V0Q29sdW1uT3JkZXIiLCJvcmRlcmVkQ29sdW1ucyIsImNvbHVtbk9yZGVyQ29weSIsImNvbHVtbnNDb3B5IiwidGFyZ2V0Q29sdW1uSWQiLCJzaGlmdCIsImZvdW5kSW5kZXgiLCJzcGxpY2UiLCJkZWZhdWx0UGFnZUluZGV4IiwiZGVmYXVsdFBhZ2VTaXplIiwiZ2V0RGVmYXVsdFBhZ2luYXRpb25TdGF0ZSIsInBhZ2VJbmRleCIsInBhZ2VTaXplIiwiUGFnaW5hdGlvbiIsInBhZ2luYXRpb24iLCJvblBhZ2luYXRpb25DaGFuZ2UiLCJfYXV0b1Jlc2V0UGFnZUluZGV4IiwiYXV0b1Jlc2V0UGFnZUluZGV4IiwibWFudWFsUGFnaW5hdGlvbiIsInJlc2V0UGFnZUluZGV4Iiwic2V0UGFnaW5hdGlvbiIsInNhZmVVcGRhdGVyIiwibmV3U3RhdGUiLCJyZXNldFBhZ2luYXRpb24iLCJfdGFibGUkaW5pdGlhbFN0YXRlJHAiLCJzZXRQYWdlSW5kZXgiLCJtYXhQYWdlSW5kZXgiLCJwYWdlQ291bnQiLCJfdGFibGUkaW5pdGlhbFN0YXRlJHAyIiwicmVzZXRQYWdlU2l6ZSIsIl90YWJsZSRpbml0aWFsU3RhdGUkcDMiLCJfdGFibGUkaW5pdGlhbFN0YXRlMiIsInNldFBhZ2VTaXplIiwidG9wUm93SW5kZXgiLCJzZXRQYWdlQ291bnQiLCJfdGFibGUkb3B0aW9ucyRwYWdlQ28iLCJuZXdQYWdlQ291bnQiLCJnZXRQYWdlT3B0aW9ucyIsImdldFBhZ2VDb3VudCIsInBhZ2VPcHRpb25zIiwiZmlsbCIsImkiLCJkZWJ1Z1RhYmxlIiwiZ2V0Q2FuUHJldmlvdXNQYWdlIiwiZ2V0Q2FuTmV4dFBhZ2UiLCJwcmV2aW91c1BhZ2UiLCJuZXh0UGFnZSIsImdldFBhZ2luYXRpb25Sb3dNb2RlbCIsIl9nZXRQYWdpbmF0aW9uUm93TW9kZWwiLCJfdGFibGUkb3B0aW9ucyRwYWdlQ28yIiwiY2VpbCIsInJvd3MiLCJnZXREZWZhdWx0Q29sdW1uUGlubmluZ1N0YXRlIiwiZ2V0RGVmYXVsdFJvd1Bpbm5pbmdTdGF0ZSIsInRvcCIsImJvdHRvbSIsIlBpbm5pbmciLCJyb3dQaW5uaW5nIiwib25Db2x1bW5QaW5uaW5nQ2hhbmdlIiwib25Sb3dQaW5uaW5nQ2hhbmdlIiwicGluIiwiY29sdW1uSWRzIiwic2V0Q29sdW1uUGlubmluZyIsIl9vbGQkbGVmdDMiLCJfb2xkJHJpZ2h0MyIsIl9vbGQkbGVmdCIsIl9vbGQkcmlnaHQiLCJfb2xkJGxlZnQyIiwiX29sZCRyaWdodDIiLCJnZXRDYW5QaW4iLCJfZCRjb2x1bW5EZWYkZW5hYmxlUGkiLCJlbmFibGVQaW5uaW5nIiwiZW5hYmxlQ29sdW1uUGlubmluZyIsImdldElzUGlubmVkIiwibGVhZkNvbHVtbklkcyIsImlzTGVmdCIsImlzUmlnaHQiLCJnZXRQaW5uZWRJbmRleCIsImluY2x1ZGVMZWFmUm93cyIsImluY2x1ZGVQYXJlbnRSb3dzIiwibGVhZlJvd0lkcyIsImdldExlYWZSb3dzIiwicGFyZW50Um93SWRzIiwiZ2V0UGFyZW50Um93cyIsInNldFJvd1Bpbm5pbmciLCJfb2xkJHRvcDMiLCJfb2xkJGJvdHRvbTMiLCJfb2xkJHRvcCIsIl9vbGQkYm90dG9tIiwiaGFzIiwiX29sZCR0b3AyIiwiX29sZCRib3R0b20yIiwiX3JlZjQiLCJlbmFibGVSb3dQaW5uaW5nIiwiaXNUb3AiLCJpc0JvdHRvbSIsIl90YWJsZSRfZ2V0UGlubmVkUm93cyIsIl92aXNpYmxlUGlubmVkUm93SWRzJCIsInZpc2libGVQaW5uZWRSb3dJZHMiLCJfZ2V0UGlubmVkUm93cyIsIl9yZWY1IiwiZ2V0Q2VudGVyVmlzaWJsZUNlbGxzIiwiX2dldEFsbFZpc2libGVDZWxscyIsImFsbENlbGxzIiwibGVmdEFuZFJpZ2h0IiwiZGVidWdSb3dzIiwiZ2V0TGVmdFZpc2libGVDZWxscyIsImNlbGxzIiwiZ2V0UmlnaHRWaXNpYmxlQ2VsbHMiLCJyZXNldENvbHVtblBpbm5pbmciLCJnZXRJc1NvbWVDb2x1bW5zUGlubmVkIiwiX3Bpbm5pbmdTdGF0ZSRwb3NpdGlvIiwicGlubmluZ1N0YXRlIiwiX3Bpbm5pbmdTdGF0ZSRsZWZ0IiwiX3Bpbm5pbmdTdGF0ZSRyaWdodCIsImdldExlZnRMZWFmQ29sdW1ucyIsImdldFJpZ2h0TGVhZkNvbHVtbnMiLCJnZXRDZW50ZXJMZWFmQ29sdW1ucyIsInJlc2V0Um93UGlubmluZyIsIl90YWJsZSRpbml0aWFsU3RhdGUkciIsImdldElzU29tZVJvd3NQaW5uZWQiLCJfcGlubmluZ1N0YXRlJHBvc2l0aW8yIiwiX3Bpbm5pbmdTdGF0ZSR0b3AiLCJfcGlubmluZ1N0YXRlJGJvdHRvbSIsInZpc2libGVSb3dzIiwicGlubmVkUm93SWRzIiwiX3RhYmxlJG9wdGlvbnMka2VlcFBpIiwia2VlcFBpbm5lZFJvd3MiLCJnZXRUb3BSb3dzIiwiZ2V0Qm90dG9tUm93cyIsImdldENlbnRlclJvd3MiLCJhbGxSb3dzIiwidG9wQW5kQm90dG9tIiwiUm93U2VsZWN0aW9uIiwicm93U2VsZWN0aW9uIiwib25Sb3dTZWxlY3Rpb25DaGFuZ2UiLCJlbmFibGVSb3dTZWxlY3Rpb24iLCJlbmFibGVNdWx0aVJvd1NlbGVjdGlvbiIsImVuYWJsZVN1YlJvd1NlbGVjdGlvbiIsInNldFJvd1NlbGVjdGlvbiIsInJlc2V0Um93U2VsZWN0aW9uIiwidG9nZ2xlQWxsUm93c1NlbGVjdGVkIiwiZ2V0SXNBbGxSb3dzU2VsZWN0ZWQiLCJwcmVHcm91cGVkRmxhdFJvd3MiLCJnZXRDYW5TZWxlY3QiLCJ0b2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkIiwicmVzb2x2ZWRWYWx1ZSIsImdldElzQWxsUGFnZVJvd3NTZWxlY3RlZCIsIm11dGF0ZVJvd0lzU2VsZWN0ZWQiLCJnZXRQcmVTZWxlY3RlZFJvd01vZGVsIiwiZ2V0U2VsZWN0ZWRSb3dNb2RlbCIsInJvd01vZGVsIiwic2VsZWN0Um93c0ZuIiwiZ2V0RmlsdGVyZWRTZWxlY3RlZFJvd01vZGVsIiwiZ2V0R3JvdXBlZFNlbGVjdGVkUm93TW9kZWwiLCJpc0FsbFJvd3NTZWxlY3RlZCIsInBhZ2luYXRpb25GbGF0Um93cyIsImlzQWxsUGFnZVJvd3NTZWxlY3RlZCIsImdldElzU29tZVJvd3NTZWxlY3RlZCIsIl90YWJsZSRnZXRTdGF0ZSRyb3dTZSIsInRvdGFsU2VsZWN0ZWQiLCJnZXRJc1NvbWVQYWdlUm93c1NlbGVjdGVkIiwiZ2V0SXNTZWxlY3RlZCIsImdldElzU29tZVNlbGVjdGVkIiwiZ2V0VG9nZ2xlQWxsUm93c1NlbGVjdGVkSGFuZGxlciIsInRhcmdldCIsImNoZWNrZWQiLCJnZXRUb2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkSGFuZGxlciIsInRvZ2dsZVNlbGVjdGVkIiwiaXNTZWxlY3RlZCIsIl9vcHRzJHNlbGVjdENoaWxkcmVuIiwic2VsZWN0ZWRSb3dJZHMiLCJzZWxlY3RDaGlsZHJlbiIsImlzUm93U2VsZWN0ZWQiLCJpc1N1YlJvd1NlbGVjdGVkIiwiZ2V0SXNBbGxTdWJSb3dzU2VsZWN0ZWQiLCJnZXRDYW5TZWxlY3RTdWJSb3dzIiwiZ2V0Q2FuTXVsdGlTZWxlY3QiLCJnZXRUb2dnbGVTZWxlY3RlZEhhbmRsZXIiLCJjYW5TZWxlY3QiLCJfdGFyZ2V0IiwiaW5jbHVkZUNoaWxkcmVuIiwibmV3U2VsZWN0ZWRGbGF0Um93cyIsIm5ld1NlbGVjdGVkUm93c0J5SWQiLCJyZWN1cnNlUm93cyIsIl9yb3ckc3ViUm93czIiLCJzZWxlY3Rpb24iLCJfc2VsZWN0aW9uJHJvdyRpZCIsIl9yb3ckc3ViUm93czMiLCJhbGxDaGlsZHJlblNlbGVjdGVkIiwic29tZVNlbGVjdGVkIiwic3ViUm93Iiwic3ViUm93Q2hpbGRyZW5TZWxlY3RlZCIsInJlU3BsaXRBbHBoYU51bWVyaWMiLCJhbHBoYW51bWVyaWMiLCJyb3dBIiwicm93QiIsImNvbXBhcmVBbHBoYW51bWVyaWMiLCJhbHBoYW51bWVyaWNDYXNlU2Vuc2l0aXZlIiwidGV4dCIsImNvbXBhcmVCYXNpYyIsInRleHRDYXNlU2Vuc2l0aXZlIiwiZGF0ZXRpbWUiLCJiYXNpYyIsImFTdHIiLCJiU3RyIiwiYWEiLCJiYiIsImFuIiwicGFyc2VJbnQiLCJibiIsImNvbWJvIiwic29ydGluZ0ZucyIsIlNvcnRpbmciLCJzb3J0aW5nIiwic29ydGluZ0ZuIiwic29ydFVuZGVmaW5lZCIsIm9uU29ydGluZ0NoYW5nZSIsImlzTXVsdGlTb3J0RXZlbnQiLCJzaGlmdEtleSIsImdldEF1dG9Tb3J0aW5nRm4iLCJmaXJzdFJvd3MiLCJzbGljZSIsImlzU3RyaW5nIiwiZ2V0QXV0b1NvcnREaXIiLCJnZXRTb3J0aW5nRm4iLCJfdGFibGUkb3B0aW9ucyRzb3J0aW4iLCJfdGFibGUkb3B0aW9ucyRzb3J0aW4yIiwidG9nZ2xlU29ydGluZyIsImRlc2MiLCJtdWx0aSIsIm5leHRTb3J0aW5nT3JkZXIiLCJnZXROZXh0U29ydGluZ09yZGVyIiwiaGFzTWFudWFsVmFsdWUiLCJzZXRTb3J0aW5nIiwiZXhpc3RpbmdTb3J0aW5nIiwiZXhpc3RpbmdJbmRleCIsIm5ld1NvcnRpbmciLCJzb3J0QWN0aW9uIiwibmV4dERlc2MiLCJnZXRDYW5NdWx0aVNvcnQiLCJfdGFibGUkb3B0aW9ucyRtYXhNdWwiLCJtYXhNdWx0aVNvcnRDb2xDb3VudCIsImdldEZpcnN0U29ydERpciIsIl9jb2x1bW4kY29sdW1uRGVmJHNvciIsInNvcnREZXNjRmlyc3QiLCJmaXJzdFNvcnREaXJlY3Rpb24iLCJpc1NvcnRlZCIsImdldElzU29ydGVkIiwiZW5hYmxlU29ydGluZ1JlbW92YWwiLCJlbmFibGVNdWx0aVJlbW92ZSIsImdldENhblNvcnQiLCJlbmFibGVTb3J0aW5nIiwiZW5hYmxlTXVsdGlTb3J0IiwiX3RhYmxlJGdldFN0YXRlJHNvcnRpIiwiY29sdW1uU29ydCIsImdldFNvcnRJbmRleCIsIl90YWJsZSRnZXRTdGF0ZSRzb3J0aTIiLCJfdGFibGUkZ2V0U3RhdGUkc29ydGkzIiwiY2xlYXJTb3J0aW5nIiwiZ2V0VG9nZ2xlU29ydGluZ0hhbmRsZXIiLCJjYW5Tb3J0IiwicmVzZXRTb3J0aW5nIiwiX3RhYmxlJGluaXRpYWxTdGF0ZSRzIiwiZ2V0UHJlU29ydGVkUm93TW9kZWwiLCJfZ2V0U29ydGVkUm93TW9kZWwiLCJtYW51YWxTb3J0aW5nIiwiVmlzaWJpbGl0eSIsImNvbHVtblZpc2liaWxpdHkiLCJvbkNvbHVtblZpc2liaWxpdHlDaGFuZ2UiLCJ0b2dnbGVWaXNpYmlsaXR5IiwiZ2V0Q2FuSGlkZSIsInNldENvbHVtblZpc2liaWxpdHkiLCJlbmFibGVIaWRpbmciLCJnZXRUb2dnbGVWaXNpYmlsaXR5SGFuZGxlciIsImdldEFsbENlbGxzIiwiZ2V0VmlzaWJsZUNlbGxzIiwibWFrZVZpc2libGVDb2x1bW5zTWV0aG9kIiwiZ2V0Q29sdW1ucyIsImdldFZpc2libGVGbGF0Q29sdW1ucyIsImdldEFsbEZsYXRDb2x1bW5zIiwiZ2V0Q2VudGVyVmlzaWJsZUxlYWZDb2x1bW5zIiwicmVzZXRDb2x1bW5WaXNpYmlsaXR5IiwidG9nZ2xlQWxsQ29sdW1uc1Zpc2libGUiLCJfdmFsdWUiLCJnZXRJc0FsbENvbHVtbnNWaXNpYmxlIiwib2JqIiwiZ2V0SXNTb21lQ29sdW1uc1Zpc2libGUiLCJnZXRUb2dnbGVBbGxDb2x1bW5zVmlzaWJpbGl0eUhhbmRsZXIiLCJmZWF0dXJlcyIsIl9vcHRpb25zJGluaXRpYWxTdGF0ZSIsImRlZmF1bHRPcHRpb25zIiwiYXNzaWduIiwibWVyZ2VPcHRpb25zIiwiY29yZUluaXRpYWxTdGF0ZSIsIl9mZWF0dXJlJGdldEluaXRpYWxTdCIsInF1ZXVlZFRpbWVvdXQiLCJjb3JlSW5zdGFuY2UiLCJjYiIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsImNhdGNoIiwiZXJyb3IiLCJzZXRUaW1lb3V0IiwicmVzZXQiLCJzZXRPcHRpb25zIiwibmV3T3B0aW9ucyIsIm9uU3RhdGVDaGFuZ2UiLCJfZ2V0Um93SWQiLCJnZXRSb3dJZCIsIl9nZXRDb3JlUm93TW9kZWwiLCJzZWFyY2hBbGwiLCJfZGVmYXVsdENvbHVtbiIsIl9wcm9wcyRyZW5kZXJWYWx1ZSR0byIsIl9wcm9wcyRyZW5kZXJWYWx1ZSIsInJlbmRlclZhbHVlIiwiX2dldENvbHVtbkRlZnMiLCJjb2x1bW5EZWZzIiwicmVjdXJzZUNvbHVtbnMiLCJncm91cGluZ0NvbHVtbkRlZiIsIl9nZXRBbGxGbGF0Q29sdW1uc0J5SWQiLCJmbGF0Q29sdW1ucyIsImFjYyIsImdldFJlbmRlclZhbHVlIiwiX2NlbGwkZ2V0VmFsdWUiLCJyZW5kZXJGYWxsYmFja1ZhbHVlIiwicm93SW5kZXgiLCJfdmFsdWVzQ2FjaGUiLCJfdW5pcXVlVmFsdWVzQ2FjaGUiLCJnZXRVbmlxdWVWYWx1ZXMiLCJnZXRQYXJlbnRSb3ciLCJwYXJlbnRSb3dzIiwicGFyZW50Um93IiwiY3JlYXRlQ29sdW1uSGVscGVyIiwiYWNjZXNzb3IiLCJkaXNwbGF5IiwiZ3JvdXAiLCJkYXRhIiwiYWNjZXNzUm93cyIsIm9yaWdpbmFsUm93cyIsImdldFN1YlJvd3MiLCJfcm93JG9yaWdpbmFsU3ViUm93cyIsIm9yaWdpbmFsU3ViUm93cyIsImZpbHRlclJvd3MiLCJmaWx0ZXJSb3dJbXBsIiwiZmlsdGVyUm93TW9kZWxGcm9tTGVhZnMiLCJmaWx0ZXJSb3dNb2RlbEZyb21Sb290Iiwicm93c1RvRmlsdGVyIiwiZmlsdGVyUm93IiwiX3RhYmxlJG9wdGlvbnMkbWF4TGVhIiwibmV3RmlsdGVyZWRGbGF0Um93cyIsIm5ld0ZpbHRlcmVkUm93c0J5SWQiLCJyZWN1cnNlRmlsdGVyUm93cyIsIm5ld1JvdyIsIl90YWJsZSRvcHRpb25zJG1heExlYTIiLCJwYXNzIiwicmVzb2x2ZWRDb2x1bW5GaWx0ZXJzIiwicmVzb2x2ZWRHbG9iYWxGaWx0ZXJzIiwiX2ZpbHRlckZuJHJlc29sdmVGaWx0IiwiZmlsdGVyYWJsZUlkcyIsImdsb2JhbGx5RmlsdGVyYWJsZUNvbHVtbnMiLCJfZ2xvYmFsRmlsdGVyRm4kcmVzb2wiLCJjdXJyZW50Q29sdW1uRmlsdGVyIiwiY3VycmVudEdsb2JhbEZpbHRlciIsImoiLCJmaWx0ZXJNZXRhIiwiX19nbG9iYWxfXyIsImZpbHRlclJvd3NJbXBsIiwicHJlUm93TW9kZWwiLCJfdGFibGUkZ2V0Q29sdW1uIiwiZmFjZXRlZFJvd01vZGVsIiwiZmFjZXRlZFVuaXF1ZVZhbHVlcyIsIl9mYWNldGVkVW5pcXVlVmFsdWVzJCIsInNldCIsImdldCIsIl9mYWNldGVkUm93TW9kZWwkZmxhdCIsImZpcnN0VmFsdWUiLCJmYWNldGVkTWluTWF4VmFsdWVzIiwic29ydGluZ1N0YXRlIiwic29ydGVkRmxhdFJvd3MiLCJhdmFpbGFibGVTb3J0aW5nIiwiY29sdW1uSW5mb0J5SWQiLCJzb3J0RW50cnkiLCJpbnZlcnRTb3J0aW5nIiwic29ydERhdGEiLCJzb3J0ZWREYXRhIiwiX3NvcnRFbnRyeSRkZXNjIiwiY29sdW1uSW5mbyIsImlzRGVzYyIsInNvcnRJbnQiLCJhVmFsdWUiLCJiVmFsdWUiLCJhVW5kZWZpbmVkIiwiYlVuZGVmaW5lZCIsImV4aXN0aW5nR3JvdXBpbmciLCJncm91cGVkRmxhdFJvd3MiLCJncm91cGVkUm93c0J5SWQiLCJncm91cFVwUmVjdXJzaXZlbHkiLCJyb3dHcm91cHNNYXAiLCJncm91cEJ5IiwiYWdncmVnYXRlZEdyb3VwZWRSb3dzIiwiZW50cmllcyIsImdyb3VwaW5nVmFsdWUiLCJncm91cGVkUm93cyIsIl9ncm91cGVkUm93cyQwJGdldFZhbCIsImFnZ3JlZ2F0ZUZuIiwiZ3JvdXBNYXAiLCJyZXNLZXkiLCJwcmV2aW91cyIsImV4cGFuZFJvd3MiLCJleHBhbmRlZFJvd3MiLCJoYW5kbGVSb3ciLCJwYWdlU3RhcnQiLCJwYWdlRW5kIiwicGFnaW5hdGVkUm93TW9kZWwiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUE0QkE7O0FBT0E7O0FBNENBOztBQUVPLFNBQVNBLGdCQUFnQkEsQ0FBSUMsT0FBbUIsRUFBRUMsS0FBUSxFQUFLO0VBQ3BFLE9BQU8sT0FBT0QsT0FBTyxLQUFLLFVBQVUsR0FDL0JBLE9BQU8sQ0FBcUJDLEtBQUssQ0FBQyxHQUNuQ0QsT0FBTyxDQUFBO0FBQ2IsQ0FBQTtBQUVPLFNBQVNFLElBQUlBLEdBQUc7QUFDckI7QUFBQSxDQUFBO0FBR0ssU0FBU0MsZ0JBQWdCQSxDQUM5QkMsR0FBTSxFQUNOQyxRQUFpQixFQUNqQjtBQUNBLEVBQUEsT0FBUUwsT0FBK0IsSUFBSztBQUN4Q0ssSUFBQUEsUUFB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R0FBR2dXLFFBQVEsQ0FBQTtBQUMzQyxJQUFBLE1BQU1zUSxTQUFTLEdBQUdqWixRQUFRLEdBQUdELFNBQVMsQ0FBQTtBQUN0QyxJQUFBLE1BQU1tWixPQUFPLEdBQUdELFNBQVMsR0FBR2paLFFBQVEsQ0FBQTtJQUVwQ3VDLElBQUksR0FBR0EsSUFBSSxDQUFDMkssS0FBSyxDQUFDK0wsU0FBUyxFQUFFQyxPQUFPLENBQUMsQ0FBQTtBQUVyQyxJQUFBLElBQUlDLGlCQUFrQyxDQUFBO0FBRXRDLElBQUEsSUFBSSxDQUFDOTNCLEtBQUssQ0FBQzhCLE9BQU8sQ0FBQzJOLG9CQUFvQixFQUFFO01BQ3ZDcW9CLGlCQUFpQixHQUFHTCxVQUFVLENBQUM7UUFDN0J2VyxJQUFJO1FBQ0p4USxRQUFRO0FBQ1JZLFFBQUFBLFFBQUFBO0FBQ0YsT0FBQyxDQUFDLENBQUE7QUFDSixLQUFDLE1BQU07QUFDTHdtQixNQUFBQSxpQkFBaUIsR0FBRztRQUNsQjVXLElBQUk7UUFDSnhRLFFBQVE7QUFDUlksUUFBQUEsUUFBQUE7T0FDRCxDQUFBO0FBQ0gsS0FBQTtJQUVBd21CLGlCQUFpQixDQUFDcG5CLFFBQVEsR0FBRyxFQUFFLENBQUE7SUFFL0IsTUFBTWluQixTQUFTLEdBQUlobkIsR0FBZSxJQUFLO0FBQ3JDbW5CLE1BQUFBLGlCQUFpQixDQUFDcG5CLFFBQVEsQ0FBQzVTLElBQUksQ0FBQzZTLEdBQUcsQ0FBQyxDQUFBO0FBQ3BDLE1BQUEsSUFBSUEsR0FBRyxDQUFDNkIsT0FBTyxDQUFDeFUsTUFBTSxFQUFFO0FBQ3RCMlMsUUFBQUEsR0FBRyxDQUFDNkIsT0FBTyxDQUFDNVUsT0FBTyxDQUFDKzVCLFNBQVMsQ0FBQyxDQUFBO0FBQ2hDLE9BQUE7S0FDRCxDQUFBO0FBRURHLElBQUFBLGlCQUFpQixDQUFDNVcsSUFBSSxDQUFDdGpCLE9BQU8sQ0FBQys1QixTQUFTLENBQUMsQ0FBQTtBQUV6QyxJQUFBLE9BQU9HLGlCQUFpQixDQUFBO0FBQzFCLEdBQUMsRUFDRDtJQUNFcDdCLEdBQUcsRUFBRXlFLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDQyxRQUFRLEtBQUssYUFBYSxJQUFJLHVCQUF1QjtBQUN0RTdDLElBQUFBLEtBQUssRUFBRUEsTUFBQTtBQUFBLE1BQUEsSUFBQXFELHFCQUFBLENBQUE7QUFBQSxNQUFBLE9BQUEsQ0FBQUEscUJBQUEsR0FBTTdCLEtBQUssQ0FBQzhCLE9BQU8sQ0FBQ0MsUUFBUSxLQUFBRixJQUFBQSxHQUFBQSxxQkFBQSxHQUFJN0IsS0FBSyxDQUFDOEIsT0FBTyxDQUFDMmUsVUFBVSxDQUFBO0FBQUEsS0FBQTtBQUNqRSxHQUNGLENBQUMsQ0FBQTtBQUNMOzs7OyIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5XX0=