@rljson/io 0.0.35 → 0.0.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,47 @@
1
1
  {
2
- "_hash": "oaiqP8PNizeUP47zdXDXRe",
2
+ "_hash": "O6ctI717FuhDeecsczUYLn",
3
3
  "tableCfgs": {
4
4
  "_data": [
5
+ {
6
+ "key": "revisions",
7
+ "type": "ingredients",
8
+ "isHead": true,
9
+ "isRoot": true,
10
+ "isShared": false,
11
+ "columns": [
12
+ {
13
+ "key": "_hash",
14
+ "type": "string",
15
+ "_hash": "df4oYftB-71Njv9FprRCeg"
16
+ },
17
+ {
18
+ "key": "table",
19
+ "type": "string",
20
+ "_hash": "FmsYjsit04XJi02Sihdwl-"
21
+ },
22
+ {
23
+ "key": "predecessor",
24
+ "type": "string",
25
+ "_hash": "RlAk7Lj-lZf2KDlUk5fekZ"
26
+ },
27
+ {
28
+ "key": "successor",
29
+ "type": "string",
30
+ "_hash": "MJlFtQVty5oUJKVzzj5hyB"
31
+ },
32
+ {
33
+ "key": "timestamp",
34
+ "type": "number",
35
+ "_hash": "XpKYGh23thW6vONgQuoMHf"
36
+ },
37
+ {
38
+ "key": "id",
39
+ "type": "string",
40
+ "_hash": "eq2P3RIaSgy81i7PomNUvn"
41
+ }
42
+ ],
43
+ "_hash": "CubBZQUGTMLa5wMqqzHLXz"
44
+ },
5
45
  {
6
46
  "_hash": "oS4O57K1hbZY9hQzRID9nO",
7
47
  "key": "tableCfgs",
@@ -52,50 +92,10 @@
52
92
  "_hash": "aPmGTcNng9E1RvlEj1LtxB"
53
93
  }
54
94
  ]
55
- },
56
- {
57
- "key": "revisions",
58
- "type": "ingredients",
59
- "isHead": true,
60
- "isRoot": true,
61
- "isShared": false,
62
- "columns": [
63
- {
64
- "key": "_hash",
65
- "type": "string",
66
- "_hash": "df4oYftB-71Njv9FprRCeg"
67
- },
68
- {
69
- "key": "table",
70
- "type": "string",
71
- "_hash": "FmsYjsit04XJi02Sihdwl-"
72
- },
73
- {
74
- "key": "predecessor",
75
- "type": "string",
76
- "_hash": "RlAk7Lj-lZf2KDlUk5fekZ"
77
- },
78
- {
79
- "key": "successor",
80
- "type": "string",
81
- "_hash": "MJlFtQVty5oUJKVzzj5hyB"
82
- },
83
- {
84
- "key": "timestamp",
85
- "type": "number",
86
- "_hash": "XpKYGh23thW6vONgQuoMHf"
87
- },
88
- {
89
- "key": "id",
90
- "type": "string",
91
- "_hash": "eq2P3RIaSgy81i7PomNUvn"
92
- }
93
- ],
94
- "_hash": "CubBZQUGTMLa5wMqqzHLXz"
95
95
  }
96
96
  ],
97
97
  "_tableCfg": "oS4O57K1hbZY9hQzRID9nO",
98
- "_hash": "Yd82KsMDBGtpbGxISEZQ-n"
98
+ "_hash": "Rq-oDdFCeBCeW3HTiFMhhN"
99
99
  },
100
100
  "revisions": {
101
101
  "_data": [],
@@ -1,58 +1,7 @@
1
1
  {
2
- "_hash": "Q2Vn-Ek8tdD_hFzDUe8Dql",
2
+ "_hash": "YqwSqooi7GRv1Fnl7zWaV9",
3
3
  "tableCfgs": {
4
4
  "_data": [
5
- {
6
- "_hash": "oS4O57K1hbZY9hQzRID9nO",
7
- "key": "tableCfgs",
8
- "type": "ingredients",
9
- "isHead": false,
10
- "isRoot": false,
11
- "isShared": true,
12
- "previous": "",
13
- "columns": [
14
- {
15
- "key": "_hash",
16
- "type": "string",
17
- "_hash": "df4oYftB-71Njv9FprRCeg"
18
- },
19
- {
20
- "key": "key",
21
- "type": "string",
22
- "_hash": "tapEY-QdaJwWhz1PPZoG35"
23
- },
24
- {
25
- "key": "type",
26
- "type": "string",
27
- "_hash": "zE7ALsNzu5JPgDD4AxeRCh"
28
- },
29
- {
30
- "key": "isHead",
31
- "type": "boolean",
32
- "_hash": "ar8Hajt2UZDn-F21QLMyC_"
33
- },
34
- {
35
- "key": "isRoot",
36
- "type": "boolean",
37
- "_hash": "hedsCm_HtiiTuzJyTeMqhm"
38
- },
39
- {
40
- "key": "isShared",
41
- "type": "boolean",
42
- "_hash": "pxXOf3-3qCo9Z3FzC9JXSH"
43
- },
44
- {
45
- "key": "previous",
46
- "type": "string",
47
- "_hash": "e0TEeDmSvJcLEMtrVxc0oW"
48
- },
49
- {
50
- "key": "columns",
51
- "type": "jsonArray",
52
- "_hash": "aPmGTcNng9E1RvlEj1LtxB"
53
- }
54
- ]
55
- },
56
5
  {
57
6
  "key": "revisions",
58
7
  "type": "ingredients",
@@ -94,7 +43,7 @@
94
43
  "_hash": "CubBZQUGTMLa5wMqqzHLXz"
95
44
  },
96
45
  {
97
- "key": "table1",
46
+ "key": "table2",
98
47
  "columns": [
99
48
  {
100
49
  "key": "_hash",
@@ -116,10 +65,10 @@
116
65
  "isHead": true,
117
66
  "isRoot": true,
118
67
  "isShared": false,
119
- "_hash": "LM5fm8eNChH3kE3D38X0Fa"
68
+ "_hash": "GGPEyV5H-4C3fZr_emK8iC"
120
69
  },
121
70
  {
122
- "key": "table2",
71
+ "key": "table1",
123
72
  "columns": [
124
73
  {
125
74
  "key": "_hash",
@@ -141,11 +90,62 @@
141
90
  "isHead": true,
142
91
  "isRoot": true,
143
92
  "isShared": false,
144
- "_hash": "GGPEyV5H-4C3fZr_emK8iC"
93
+ "_hash": "LM5fm8eNChH3kE3D38X0Fa"
94
+ },
95
+ {
96
+ "_hash": "oS4O57K1hbZY9hQzRID9nO",
97
+ "key": "tableCfgs",
98
+ "type": "ingredients",
99
+ "isHead": false,
100
+ "isRoot": false,
101
+ "isShared": true,
102
+ "previous": "",
103
+ "columns": [
104
+ {
105
+ "key": "_hash",
106
+ "type": "string",
107
+ "_hash": "df4oYftB-71Njv9FprRCeg"
108
+ },
109
+ {
110
+ "key": "key",
111
+ "type": "string",
112
+ "_hash": "tapEY-QdaJwWhz1PPZoG35"
113
+ },
114
+ {
115
+ "key": "type",
116
+ "type": "string",
117
+ "_hash": "zE7ALsNzu5JPgDD4AxeRCh"
118
+ },
119
+ {
120
+ "key": "isHead",
121
+ "type": "boolean",
122
+ "_hash": "ar8Hajt2UZDn-F21QLMyC_"
123
+ },
124
+ {
125
+ "key": "isRoot",
126
+ "type": "boolean",
127
+ "_hash": "hedsCm_HtiiTuzJyTeMqhm"
128
+ },
129
+ {
130
+ "key": "isShared",
131
+ "type": "boolean",
132
+ "_hash": "pxXOf3-3qCo9Z3FzC9JXSH"
133
+ },
134
+ {
135
+ "key": "previous",
136
+ "type": "string",
137
+ "_hash": "e0TEeDmSvJcLEMtrVxc0oW"
138
+ },
139
+ {
140
+ "key": "columns",
141
+ "type": "jsonArray",
142
+ "_hash": "aPmGTcNng9E1RvlEj1LtxB"
143
+ }
144
+ ]
145
145
  }
146
146
  ],
147
147
  "_tableCfg": "oS4O57K1hbZY9hQzRID9nO",
148
- "_hash": "vdQgUbSErXgVaD6cFsPoSk"
148
+ "_hash": "hiWhWYx-PreD9EvDuG64rT"
149
149
  },
150
150
  "revisions": {
151
151
  "_data": [],
@@ -0,0 +1,123 @@
1
+ [
2
+ {
3
+ "key": "revisions",
4
+ "type": "ingredients",
5
+ "isHead": true,
6
+ "isRoot": true,
7
+ "isShared": false,
8
+ "columns": [
9
+ {
10
+ "key": "_hash",
11
+ "type": "string",
12
+ "_hash": "df4oYftB-71Njv9FprRCeg"
13
+ },
14
+ {
15
+ "key": "table",
16
+ "type": "string",
17
+ "_hash": "FmsYjsit04XJi02Sihdwl-"
18
+ },
19
+ {
20
+ "key": "predecessor",
21
+ "type": "string",
22
+ "_hash": "RlAk7Lj-lZf2KDlUk5fekZ"
23
+ },
24
+ {
25
+ "key": "successor",
26
+ "type": "string",
27
+ "_hash": "MJlFtQVty5oUJKVzzj5hyB"
28
+ },
29
+ {
30
+ "key": "timestamp",
31
+ "type": "number",
32
+ "_hash": "XpKYGh23thW6vONgQuoMHf"
33
+ },
34
+ {
35
+ "key": "id",
36
+ "type": "string",
37
+ "_hash": "eq2P3RIaSgy81i7PomNUvn"
38
+ }
39
+ ],
40
+ "_hash": "CubBZQUGTMLa5wMqqzHLXz"
41
+ },
42
+ {
43
+ "key": "table0",
44
+ "type": "ingredients",
45
+ "isHead": false,
46
+ "isRoot": false,
47
+ "isShared": true,
48
+ "columns": [
49
+ {
50
+ "key": "_hash",
51
+ "type": "string",
52
+ "_hash": "df4oYftB-71Njv9FprRCeg"
53
+ },
54
+ {
55
+ "key": "col0",
56
+ "type": "string",
57
+ "_hash": "LyqWPAOnRnSAofi4I1aMIv"
58
+ },
59
+ {
60
+ "key": "col1",
61
+ "type": "string",
62
+ "_hash": "aD2OJziZ76JeLyPuV4ioKe"
63
+ },
64
+ {
65
+ "key": "col2",
66
+ "type": "string",
67
+ "_hash": "yd4AdprM2Z0vqKieWOibX5"
68
+ }
69
+ ],
70
+ "_hash": "SmI9Z47zQXdHKsZYDCLRVN"
71
+ },
72
+ {
73
+ "_hash": "oS4O57K1hbZY9hQzRID9nO",
74
+ "key": "tableCfgs",
75
+ "type": "ingredients",
76
+ "isHead": false,
77
+ "isRoot": false,
78
+ "isShared": true,
79
+ "previous": "",
80
+ "columns": [
81
+ {
82
+ "key": "_hash",
83
+ "type": "string",
84
+ "_hash": "df4oYftB-71Njv9FprRCeg"
85
+ },
86
+ {
87
+ "key": "key",
88
+ "type": "string",
89
+ "_hash": "tapEY-QdaJwWhz1PPZoG35"
90
+ },
91
+ {
92
+ "key": "type",
93
+ "type": "string",
94
+ "_hash": "zE7ALsNzu5JPgDD4AxeRCh"
95
+ },
96
+ {
97
+ "key": "isHead",
98
+ "type": "boolean",
99
+ "_hash": "ar8Hajt2UZDn-F21QLMyC_"
100
+ },
101
+ {
102
+ "key": "isRoot",
103
+ "type": "boolean",
104
+ "_hash": "hedsCm_HtiiTuzJyTeMqhm"
105
+ },
106
+ {
107
+ "key": "isShared",
108
+ "type": "boolean",
109
+ "_hash": "pxXOf3-3qCo9Z3FzC9JXSH"
110
+ },
111
+ {
112
+ "key": "previous",
113
+ "type": "string",
114
+ "_hash": "e0TEeDmSvJcLEMtrVxc0oW"
115
+ },
116
+ {
117
+ "key": "columns",
118
+ "type": "jsonArray",
119
+ "_hash": "aPmGTcNng9E1RvlEj1LtxB"
120
+ }
121
+ ]
122
+ }
123
+ ]
@@ -1,6 +1,46 @@
1
1
  {
2
2
  "tableCfgs": {
3
3
  "_data": [
4
+ {
5
+ "key": "revisions",
6
+ "type": "ingredients",
7
+ "isHead": true,
8
+ "isRoot": true,
9
+ "isShared": false,
10
+ "columns": [
11
+ {
12
+ "key": "_hash",
13
+ "type": "string",
14
+ "_hash": "df4oYftB-71Njv9FprRCeg"
15
+ },
16
+ {
17
+ "key": "table",
18
+ "type": "string",
19
+ "_hash": "FmsYjsit04XJi02Sihdwl-"
20
+ },
21
+ {
22
+ "key": "predecessor",
23
+ "type": "string",
24
+ "_hash": "RlAk7Lj-lZf2KDlUk5fekZ"
25
+ },
26
+ {
27
+ "key": "successor",
28
+ "type": "string",
29
+ "_hash": "MJlFtQVty5oUJKVzzj5hyB"
30
+ },
31
+ {
32
+ "key": "timestamp",
33
+ "type": "number",
34
+ "_hash": "XpKYGh23thW6vONgQuoMHf"
35
+ },
36
+ {
37
+ "key": "id",
38
+ "type": "string",
39
+ "_hash": "eq2P3RIaSgy81i7PomNUvn"
40
+ }
41
+ ],
42
+ "_hash": "CubBZQUGTMLa5wMqqzHLXz"
43
+ },
4
44
  {
5
45
  "_hash": "oS4O57K1hbZY9hQzRID9nO",
6
46
  "key": "tableCfgs",
@@ -51,49 +91,9 @@
51
91
  "_hash": "aPmGTcNng9E1RvlEj1LtxB"
52
92
  }
53
93
  ]
54
- },
55
- {
56
- "key": "revisions",
57
- "type": "ingredients",
58
- "isHead": true,
59
- "isRoot": true,
60
- "isShared": false,
61
- "columns": [
62
- {
63
- "key": "_hash",
64
- "type": "string",
65
- "_hash": "df4oYftB-71Njv9FprRCeg"
66
- },
67
- {
68
- "key": "table",
69
- "type": "string",
70
- "_hash": "FmsYjsit04XJi02Sihdwl-"
71
- },
72
- {
73
- "key": "predecessor",
74
- "type": "string",
75
- "_hash": "RlAk7Lj-lZf2KDlUk5fekZ"
76
- },
77
- {
78
- "key": "successor",
79
- "type": "string",
80
- "_hash": "MJlFtQVty5oUJKVzzj5hyB"
81
- },
82
- {
83
- "key": "timestamp",
84
- "type": "number",
85
- "_hash": "XpKYGh23thW6vONgQuoMHf"
86
- },
87
- {
88
- "key": "id",
89
- "type": "string",
90
- "_hash": "eq2P3RIaSgy81i7PomNUvn"
91
- }
92
- ],
93
- "_hash": "CubBZQUGTMLa5wMqqzHLXz"
94
94
  }
95
95
  ],
96
96
  "_tableCfg": "oS4O57K1hbZY9hQzRID9nO",
97
- "_hash": "Yd82KsMDBGtpbGxISEZQ-n"
97
+ "_hash": "Rq-oDdFCeBCeW3HTiFMhhN"
98
98
  }
99
99
  }
@@ -19,7 +19,6 @@ import { hip, hsh, rmhsh } from '@rljson/hash';
19
19
  import {
20
20
  addColumnsToTableCfg,
21
21
  exampleTableCfg,
22
- IngredientsTable,
23
22
  Rljson,
24
23
  TableCfg,
25
24
  TableType,
@@ -123,13 +122,11 @@ export const runIoConformanceTests = () => {
123
122
  await io.createOrExtendTable({ tableCfg: tableV2 });
124
123
 
125
124
  // Check the tableCfgs
126
- const actualTableCfgs = (await io.tableCfgs()).tableCfgs
127
- ._data as unknown as TableCfg[];
125
+ const actualTableCfgs = await ioTools.tableCfgs();
128
126
 
129
- expect(actualTableCfgs.length).toBe(3);
130
- expect((actualTableCfgs[0] as TableCfg).key).toBe('tableCfgs');
131
- expect((actualTableCfgs[1] as TableCfg).key).toBe('revisions');
132
- expect((actualTableCfgs[2] as TableCfg).key).toBe('table0');
127
+ await expectGolden('io-conformance/tableCfgs-1.json', ego).toBe(
128
+ actualTableCfgs,
129
+ );
133
130
  });
134
131
  });
135
132
 
@@ -259,10 +256,8 @@ export const runIoConformanceTests = () => {
259
256
 
260
257
  it('should add a table and a table config', async () => {
261
258
  const tablesFromConfig = async () => {
262
- const tables = (await io.tableCfgs())
263
- .tableCfgs as IngredientsTable<TableCfg>;
264
-
265
- return tables._data.map((e) => e.key);
259
+ const tables = await ioTools.tableCfgs();
260
+ return tables.map((e) => e.key);
266
261
  };
267
262
 
268
263
  const physicalTables = async () => await ioTools.allTableKeys();
@@ -271,33 +266,33 @@ export const runIoConformanceTests = () => {
271
266
  await createExampleTable('table1');
272
267
 
273
268
  expect(await tablesFromConfig()).toEqual([
274
- 'tableCfgs',
275
269
  'revisions',
276
270
  'table',
277
271
  'table1',
272
+ 'tableCfgs',
278
273
  ]);
279
274
  expect(await physicalTables()).toEqual([
280
- 'tableCfgs',
281
275
  'revisions',
282
276
  'table',
283
277
  'table1',
278
+ 'tableCfgs',
284
279
  ]);
285
280
 
286
281
  // Create a second table
287
282
  await createExampleTable('table2');
288
283
  expect(await tablesFromConfig()).toEqual([
289
- 'tableCfgs',
290
284
  'revisions',
291
285
  'table',
292
286
  'table1',
293
287
  'table2',
288
+ 'tableCfgs',
294
289
  ]);
295
290
  expect(await physicalTables()).toEqual([
296
- 'tableCfgs',
297
291
  'revisions',
298
292
  'table',
299
293
  'table1',
300
294
  'table2',
295
+ 'tableCfgs',
301
296
  ]);
302
297
  });
303
298
 
@@ -664,16 +659,16 @@ export const runIoConformanceTests = () => {
664
659
  {
665
660
  array: [1, 2, { a: 10 }],
666
661
  boolean: true,
667
- number: 5,
668
- object: { a: 1, b: { c: 3 } },
669
- string: 'hello',
662
+ number: 6,
663
+ object: { a: 1, b: 2 },
664
+ string: 'world',
670
665
  },
671
666
  {
672
667
  array: [1, 2, { a: 10 }],
673
668
  boolean: true,
674
- number: 6,
675
- object: { a: 1, b: 2 },
676
- string: 'world',
669
+ number: 5,
670
+ object: { a: 1, b: { c: 3 } },
671
+ string: 'hello',
677
672
  },
678
673
  ],
679
674
  },
@@ -694,16 +689,16 @@ export const runIoConformanceTests = () => {
694
689
  {
695
690
  array: [1, 2, { a: 10 }],
696
691
  boolean: true,
697
- number: 5,
698
- object: { a: 1, b: { c: 3 } },
699
- string: 'hello',
692
+ number: 6,
693
+ object: { a: 1, b: 2 },
694
+ string: 'world',
700
695
  },
701
696
  {
702
697
  array: [1, 2, { a: 10 }],
703
698
  boolean: true,
704
- number: 6,
705
- object: { a: 1, b: 2 },
706
- string: 'world',
699
+ number: 5,
700
+ object: { a: 1, b: { c: 3 } },
701
+ string: 'hello',
707
702
  },
708
703
  ],
709
704
  },
@@ -727,16 +722,16 @@ export const runIoConformanceTests = () => {
727
722
  {
728
723
  array: [1, 2, { a: 10 }],
729
724
  boolean: true,
730
- number: 5,
731
- object: { a: 1, b: { c: 3 } },
732
- string: 'hello',
725
+ number: 6,
726
+ object: { a: 1, b: 2 },
727
+ string: 'world',
733
728
  },
734
729
  {
735
730
  array: [1, 2, { a: 10 }],
736
731
  boolean: true,
737
- number: 6,
738
- object: { a: 1, b: 2 },
739
- string: 'world',
732
+ number: 5,
733
+ object: { a: 1, b: { c: 3 } },
734
+ string: 'hello',
740
735
  },
741
736
  ],
742
737
  },
package/dist/io-mem.d.ts CHANGED
@@ -5,7 +5,6 @@ import { Io } from './io.ts';
5
5
  * In-Memory implementation of the Rljson Io interface.
6
6
  */
7
7
  export declare class IoMem implements Io {
8
- constructor();
9
8
  init(): Promise<void>;
10
9
  close(): Promise<void>;
11
10
  get isOpen(): boolean;
@@ -29,7 +28,7 @@ export declare class IoMem implements Io {
29
28
  createOrExtendTable(request: {
30
29
  tableCfg: TableCfg;
31
30
  }): Promise<void>;
32
- tableCfgs(): Promise<Rljson>;
31
+ rawTableCfgs(): Promise<TableCfg[]>;
33
32
  private _ioTools;
34
33
  private _isReady;
35
34
  private _isOpen;
@@ -1,4 +1,4 @@
1
- import { Rljson, TableCfg, TableKey } from '@rljson/rljson';
1
+ import { Rljson, TableCfg, TableKey, TableType } from '@rljson/rljson';
2
2
  import { Io } from './io.ts';
3
3
  /**
4
4
  * Provides utility functions for the Io interface.
@@ -32,6 +32,11 @@ export declare class IoTools {
32
32
  * @param rljson - The Rljson object to check
33
33
  */
34
34
  throwWhenTablesDoNotExist(rljson: Rljson): Promise<void>;
35
+ /**
36
+ * Returns the current table cfgs of all tables
37
+ * @returns The table configuration of all tables
38
+ */
39
+ tableCfgs(): Promise<TableCfg[]>;
35
40
  /**
36
41
  * Returns a list with all table names
37
42
  */
@@ -64,4 +69,8 @@ export declare class IoTools {
64
69
  * Throws if the data in the table do not match the table configuration
65
70
  */
66
71
  throwWhenTableDataDoesNotMatchCfg(data: Rljson): Promise<void>;
72
+ /**
73
+ * Sorts the data of a table by the hash and updates the table hash in place
74
+ */
75
+ sortTableDataAndUpdateHash(table: TableType): void;
67
76
  }
package/dist/io.d.ts CHANGED
@@ -35,7 +35,7 @@ export interface Io {
35
35
  /**
36
36
  * Returns a json structure returning current table configurations
37
37
  */
38
- tableCfgs(): Promise<Rljson>;
38
+ rawTableCfgs(): Promise<TableCfg[]>;
39
39
  /** Writes Rljson data into the database */
40
40
  write(request: {
41
41
  data: Rljson;
package/dist/io.js CHANGED
@@ -88,13 +88,36 @@ const _IoTools = class _IoTools {
88
88
  );
89
89
  }
90
90
  }
91
+ /**
92
+ * Returns the current table cfgs of all tables
93
+ * @returns The table configuration of all tables
94
+ */
95
+ async tableCfgs() {
96
+ const tables = await this.io.rawTableCfgs();
97
+ const newestVersion = {};
98
+ for (let i = tables.length - 1; i >= 0; i--) {
99
+ const table = tables[i];
100
+ const existing = newestVersion[table.key];
101
+ if (!existing || existing.columns.length < table.columns.length) {
102
+ newestVersion[table.key] = table;
103
+ }
104
+ }
105
+ const resultData = Object.values(newestVersion).sort((a, b) => {
106
+ if (a.key < b.key) {
107
+ return -1;
108
+ }
109
+ if (a.key > b.key) {
110
+ return 1;
111
+ }
112
+ return 0;
113
+ });
114
+ return resultData;
115
+ }
91
116
  /**
92
117
  * Returns a list with all table names
93
118
  */
94
119
  async allTableKeys() {
95
- const result = (await this.io.tableCfgs()).tableCfgs._data.map(
96
- (e) => e.key
97
- );
120
+ const result = (await this.tableCfgs()).map((e) => e.key);
98
121
  return result;
99
122
  }
100
123
  /**
@@ -112,8 +135,8 @@ const _IoTools = class _IoTools {
112
135
 
113
136
  */
114
137
  async tableCfgOrNull(table) {
115
- const tableCfgs = await this.io.tableCfgs();
116
- const tableCfg = tableCfgs.tableCfgs._data.find((e) => e.key === table);
138
+ const tableCfgs = await this.tableCfgs();
139
+ const tableCfg = tableCfgs.find((e) => e.key === table);
117
140
  return tableCfg ?? null;
118
141
  }
119
142
  /**
@@ -203,6 +226,27 @@ ${errors.map((e) => `- ${e}`).join("\n")}`
203
226
  );
204
227
  }
205
228
  }
229
+ /**
230
+ * Sorts the data of a table by the hash and updates the table hash in place
231
+ */
232
+ sortTableDataAndUpdateHash(table) {
233
+ table._data.sort((a, b) => {
234
+ const hashA = a._hash;
235
+ const hashB = b._hash;
236
+ if (hashA < hashB) {
237
+ return -1;
238
+ }
239
+ if (hashA > hashB) {
240
+ return 1;
241
+ }
242
+ return 0;
243
+ });
244
+ table._hash = "";
245
+ hip(table, {
246
+ updateExistingHashes: false,
247
+ throwOnWrongHashes: false
248
+ });
249
+ }
206
250
  };
207
251
  /**
208
252
  * Example object for test purposes
@@ -217,8 +261,6 @@ __publicField(_IoTools, "example", async () => {
217
261
  let IoTools = _IoTools;
218
262
  // @license
219
263
  const _IoMem = class _IoMem {
220
- // ...........................................................................
221
- // Constructor & example
222
264
  constructor() {
223
265
  // ######################
224
266
  // Private
@@ -236,6 +278,8 @@ const _IoMem = class _IoMem {
236
278
  });
237
279
  });
238
280
  }
281
+ // ...........................................................................
282
+ // Constructor & example
239
283
  init() {
240
284
  this._isOpen = true;
241
285
  return this._init();
@@ -286,22 +330,9 @@ const _IoMem = class _IoMem {
286
330
  createOrExtendTable(request) {
287
331
  return this._createOrExtendTable(request);
288
332
  }
289
- async tableCfgs() {
333
+ async rawTableCfgs() {
290
334
  const tables = this._mem.tableCfgs._data;
291
- const newestVersion = {};
292
- for (let i = tables.length - 1; i >= 0; i--) {
293
- const table = tables[i];
294
- const existing = newestVersion[table.key];
295
- if (!existing) {
296
- newestVersion[table.key] = table;
297
- }
298
- }
299
- const resultData = Object.values(newestVersion).reverse();
300
- return hip({
301
- tableCfgs: {
302
- _data: resultData
303
- }
304
- });
335
+ return tables;
305
336
  }
306
337
  // ...........................................................................
307
338
  async _init() {
@@ -343,7 +374,7 @@ const _IoMem = class _IoMem {
343
374
  var _a;
344
375
  newConfig = hsh(newConfig);
345
376
  this._mem.tableCfgs._data.push(newConfig);
346
- this._updateTableHash("tableCfgs");
377
+ this._ioTools.sortTableDataAndUpdateHash(this._mem.tableCfgs);
347
378
  const table = {
348
379
  _data: [],
349
380
  _tableCfg: newConfig._hash
@@ -359,9 +390,9 @@ const _IoMem = class _IoMem {
359
390
  }
360
391
  newConfig = hsh(newConfig);
361
392
  this._mem.tableCfgs._data.push(newConfig);
393
+ this._ioTools.sortTableDataAndUpdateHash(this._mem.tableCfgs);
362
394
  const table = this._mem[newConfig.key];
363
395
  table._tableCfg = newConfig._hash;
364
- this._updateTableHash("tableCfgs");
365
396
  this._updateTableHash(newConfig.key);
366
397
  this._updateGlobalHash();
367
398
  }
@@ -398,7 +429,7 @@ const _IoMem = class _IoMem {
398
429
  oldTable._data.push(item);
399
430
  }
400
431
  }
401
- this._updateTableHash(table);
432
+ this._ioTools.sortTableDataAndUpdateHash(oldTable);
402
433
  }
403
434
  this._updateGlobalHash();
404
435
  }
@@ -567,4 +598,4 @@ export {
567
598
  exampleIo,
568
599
  exampleTestSetup
569
600
  };
570
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pby10b29scy50cyIsIi4uL3NyYy9pby1tZW0udHMiLCIuLi9zcmMvaW8tdGVzdC1zZXR1cC50cyIsIi4uL3NyYy9pby50cyIsIi4uL3NyYy9yZXZlcnNlLXJlZi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcbmltcG9ydCB7XG4gIGl0ZXJhdGVUYWJsZXMsXG4gIFJsanNvbixcbiAgVGFibGVDZmcsXG4gIFRhYmxlS2V5LFxuICB0aHJvd09uSW52YWxpZFRhYmxlQ2ZnLFxuICB2YWxpZGF0ZVJsanNvbkFnYWluc3RUYWJsZUNmZyxcbn0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG5pbXBvcnQgeyBJb01lbSB9IGZyb20gJy4vaW8tbWVtLnRzJztcbmltcG9ydCB7IElvIH0gZnJvbSAnLi9pby50cyc7XG5cbi8qKlxuICogUHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRoZSBJbyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb1Rvb2xzIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBpbyBUaGUgSW8gaW50ZXJmYWNlIHRvIHVzZVxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGlvOiBJbykge31cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFibGUgY29uZmlndXJhdGlvbiBvZiB0aGUgdGFibGVDZmdzIHRhYmxlLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZUNmZ3NUYWJsZUNmZygpIHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGhpcDxUYWJsZUNmZz4oe1xuICAgICAgX2hhc2g6ICcnLFxuICAgICAga2V5OiAndGFibGVDZmdzJyxcbiAgICAgIHR5cGU6ICdpbmdyZWRpZW50cycsXG4gICAgICBpc0hlYWQ6IGZhbHNlLFxuICAgICAgaXNSb290OiBmYWxzZSxcbiAgICAgIGlzU2hhcmVkOiB0cnVlLFxuICAgICAgcHJldmlvdXM6ICcnLFxuXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHsga2V5OiAnX2hhc2gnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ2tleScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAndHlwZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAnaXNIZWFkJywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAgIHsga2V5OiAnaXNSb290JywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAgIHsga2V5OiAnaXNTaGFyZWQnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgeyBrZXk6ICdwcmV2aW91cycsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAnY29sdW1ucycsIHR5cGU6ICdqc29uQXJyYXknIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRhYmxlQ2ZnO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSByZXZpc2lvbnMgdGFibGUuXG4gICAqL1xuICBpbml0UmV2aXNpb25zVGFibGUgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGVDZmc6IFRhYmxlQ2ZnID0ge1xuICAgICAga2V5OiAncmV2aXNpb25zJyxcbiAgICAgIHR5cGU6ICdpbmdyZWRpZW50cycsXG4gICAgICBpc0hlYWQ6IHRydWUsXG4gICAgICBpc1Jvb3Q6IHRydWUsXG4gICAgICBpc1NoYXJlZDogZmFsc2UsXG5cbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBrZXk6ICdfaGFzaCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAndGFibGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3ByZWRlY2Vzc29yJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdzdWNjZXNzb3InLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3RpbWVzdGFtcCcsIHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgIHsga2V5OiAnaWQnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgXSxcbiAgICB9O1xuXG4gICAgYXdhaXQgdGhpcy5pby5jcmVhdGVPckV4dGVuZFRhYmxlKHsgdGFibGVDZmcgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEV4YW1wbGUgb2JqZWN0IGZvciB0ZXN0IHB1cnBvc2VzXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIGlvIHRvb2xzXG4gICAqL1xuICBzdGF0aWMgZXhhbXBsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbyA9IGF3YWl0IElvTWVtLmV4YW1wbGUoKTtcbiAgICBhd2FpdCBpby5pbml0KCk7XG4gICAgYXdhaXQgaW8uaXNSZWFkeSgpO1xuICAgIHJldHVybiBuZXcgSW9Ub29scyhpbyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRocm93cyBpZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3RcbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlRG9lc05vdEV4aXN0KHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuaW8udGFibGVFeGlzdHModGFibGUpO1xuICAgIGlmICghZXhpc3RzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGlmIGFueSBvZiB0aGUgdGFibGVzIGluIHJsanNvbiBkbyBub3QgZXhpc3RcbiAgICogQHBhcmFtIHJsanNvbiAtIFRoZSBSbGpzb24gb2JqZWN0IHRvIGNoZWNrXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJsanNvbjogUmxqc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGl0ZXJhdGVUYWJsZXMocmxqc29uLCBhc3luYyAodGFibGVLZXkpID0+IHtcbiAgICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5pby50YWJsZUV4aXN0cyh0YWJsZUtleSk7XG4gICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGVLZXl9XCIgbm90IGZvdW5kYCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IG1pc3NpbmdUYWJsZXMgPSAoZSBhcyBBcnJheTxhbnk+KS5tYXAoKGUpID0+IGUudGFibGVLZXkpO1xuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgZm9sbG93aW5nIHRhYmxlcyBkbyBub3QgZXhpc3Q6ICR7bWlzc2luZ1RhYmxlcy5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCB3aXRoIGFsbCB0YWJsZSBuYW1lc1xuICAgKi9cbiAgYXN5bmMgYWxsVGFibGVLZXlzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgdGhpcy5pby50YWJsZUNmZ3MoKSkudGFibGVDZmdzLl9kYXRhLm1hcChcbiAgICAgIChlKSA9PiBlLmtleSxcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIGdpdmVuIHRhYmxlXG4gICAqL1xuICBhc3luYyB0YWJsZUNmZyh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPFRhYmxlQ2ZnPiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnT3JOdWxsKHRhYmxlKTtcbiAgICBpZiAoIXRhYmxlQ2ZnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFibGVDZmchO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBnaXZlbiB0YWJsZSBvciBudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuXG4gICAqL1xuICBhc3luYyB0YWJsZUNmZ09yTnVsbCh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPFRhYmxlQ2ZnIHwgbnVsbD4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZncyA9IGF3YWl0IHRoaXMuaW8udGFibGVDZmdzKCk7XG4gICAgY29uc3QgdGFibGVDZmcgPSB0YWJsZUNmZ3MudGFibGVDZmdzLl9kYXRhLmZpbmQoKGUpID0+IGUua2V5ID09PSB0YWJsZSk7XG4gICAgcmV0dXJuIHRhYmxlQ2ZnID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGNvbHVtbiBuYW1lcyBvZiBhIGdpdmVuIHRhYmxlXG4gICAqL1xuICBhc3luYyBhbGxDb2x1bW5LZXlzKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRhYmxlQ2ZnLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIHdoZW4gYSBjb2x1bW4gZG9lcyBub3QgZXhpc3QgaW4gYSBnaXZlbiB0YWJsZVxuICAgKiBAcGFyYW0gdGFibGUgLSBUaGUgdGFibGUgdG8gY2hlY2tcbiAgICogQHBhcmFtIGNvbHVtbnMgLSBUaGUgY29sdW1uIHRvIGNoZWNrXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5Db2x1bW5Eb2VzTm90RXhpc3QoXG4gICAgdGFibGU6IFRhYmxlS2V5LFxuICAgIGNvbHVtbnM6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGUpO1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSB0YWJsZUNmZy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KTtcbiAgICBjb25zdCBtaXNzaW5nQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKFxuICAgICAgKGNvbHVtbikgPT4gIWNvbHVtbktleXMuaW5jbHVkZXMoY29sdW1uKSxcbiAgICApO1xuICAgIGlmIChtaXNzaW5nQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgZm9sbG93aW5nIGNvbHVtbnMgZG8gbm90IGV4aXN0IGluIHRhYmxlIFwiJHt0YWJsZX1cIjogJHttaXNzaW5nQ29sdW1ucy5qb2luKFxuICAgICAgICAgICcsICcsXG4gICAgICAgICl9LmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3Mgd2hlbiBhIHRhYmxlIHVwZGF0ZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHRhYmxlXG4gICAqIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh1cGRhdGU6IFRhYmxlQ2ZnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJlZml4ID0gYEludmFsaWQgdXBkYXRlIG9mIHRhYmxlIGFibGUgXCIke3VwZGF0ZS5rZXl9XCJgO1xuXG4gICAgdGhyb3dPbkludmFsaWRUYWJsZUNmZyh1cGRhdGUpO1xuXG4gICAgLy8gQ2hlY2sgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnT3JOdWxsKHVwZGF0ZS5rZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgLy8gSGF2ZSBjb2x1bW5zIGJlZW4gZGVsZXRlZD9cbiAgICAgIGlmIChleGlzdGluZy5jb2x1bW5zLmxlbmd0aCA+IHVwZGF0ZS5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkZWxldGVkQ29sdW1uS2V5cyA9IGV4aXN0aW5nLmNvbHVtbnNcbiAgICAgICAgICAubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChrZXkpID0+ICF1cGRhdGUuY29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5rZXkgPT09IGtleSksXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKGRlbGV0ZWRDb2x1bW5LZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBkZWxldGVkQ29sdW1ucyA9IGRlbGV0ZWRDb2x1bW5LZXlzLmpvaW4oJywgJyk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7cHJlZml4fTogQ29sdW1ucyBtdXN0IG5vdCBiZSBkZWxldGVkLiBgICtcbiAgICAgICAgICAgICAgYERlbGV0ZWQgY29sdW1uczogJHtkZWxldGVkQ29sdW1uc319YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhdmUgY29sdW1uIGtleXMgY2hhbmdlZD9cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmcuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBiZWZvcmUgPSBleGlzdGluZy5jb2x1bW5zW2ldLmtleTtcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSB1cGRhdGUuY29sdW1uc1tpXS5rZXk7XG4gICAgICAgIGlmIChiZWZvcmUgIT09IGFmdGVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7cHJlZml4fTogYCArXG4gICAgICAgICAgICAgIGBDb2x1bW4ga2V5cyBtdXN0IG5vdCBjaGFuZ2UhIGAgK1xuICAgICAgICAgICAgICBgQ29sdW1uIFwiJHtiZWZvcmV9XCIgd2FzIHJlbmFtZWQgaW50byBcIiR7YWZ0ZXJ9XCIuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhdmUgY29sdW1uIHR5cGVzIGNoYW5nZWQ/XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4aXN0aW5nLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gZXhpc3RpbmcuY29sdW1uc1tpXS5rZXk7XG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IGV4aXN0aW5nLmNvbHVtbnNbaV0udHlwZTtcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSB1cGRhdGUuY29sdW1uc1tpXS50eXBlO1xuICAgICAgICBpZiAoYmVmb3JlICE9PSBhZnRlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGAke3ByZWZpeH06IGAgK1xuICAgICAgICAgICAgICBgQ29sdW1uIHR5cGVzIG11c3Qgbm90IGNoYW5nZSEgYCArXG4gICAgICAgICAgICAgIGBUeXBlIG9mIGNvbHVtbiBcIiR7Y29sdW1ufVwiIHdhcyBjaGFuZ2VkIGZyb20gXCIke2JlZm9yZX1cIiB0byAke2FmdGVyfS5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGlmIHRoZSBkYXRhIGluIHRoZSB0YWJsZSBkbyBub3QgbWF0Y2ggdGhlIHRhYmxlIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlRGF0YURvZXNOb3RNYXRjaENmZyhkYXRhOiBSbGpzb24pIHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBhd2FpdCBpdGVyYXRlVGFibGVzKGRhdGEsIGFzeW5jICh0YWJsZUtleSkgPT4ge1xuICAgICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnKHRhYmxlS2V5KTtcbiAgICAgIGNvbnN0IHRhYmxlID0gZGF0YVt0YWJsZUtleV07XG4gICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVJsanNvbkFnYWluc3RUYWJsZUNmZyh0YWJsZS5fZGF0YSwgdGFibGVDZmcpKTtcbiAgICB9KTtcblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGFibGUgZGF0YSBkb2VzIG5vdCBtYXRjaCB0aGUgY29uZmlndXJhdGlvbi5cXG5cXG5FcnJvcnM6XFxuJHtlcnJvcnNcbiAgICAgICAgICAubWFwKChlKSA9PiBgLSAke2V9YClcbiAgICAgICAgICAuam9pbignXFxuJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwLCBoc2ggfSBmcm9tICdAcmxqc29uL2hhc2gnO1xuaW1wb3J0IHsgSXNSZWFkeSB9IGZyb20gJ0BybGpzb24vaXMtcmVhZHknO1xuaW1wb3J0IHsgY29weSwgZXF1YWxzLCBKc29uVmFsdWUgfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHtcbiAgaXRlcmF0ZVRhYmxlc1N5bmMsXG4gIFJsanNvbixcbiAgVGFibGVDZmcsXG4gIFRhYmxlS2V5LFxuICBUYWJsZVR5cGUsXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuaW1wb3J0IHsgSW9Ub29scyB9IGZyb20gJy4vaW8tdG9vbHMudHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcblxuLyoqXG4gKiBJbi1NZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJsanNvbiBJbyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb01lbSBpbXBsZW1lbnRzIElvIHtcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIENvbnN0cnVjdG9yICYgZXhhbXBsZVxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9pc09wZW4gPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLl9pbml0KCk7XG4gIH1cblxuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9pc09wZW4gPSBmYWxzZTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc09wZW47XG4gIH1cblxuICBzdGF0aWMgZXhhbXBsZSA9IGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4gbmV3IElvTWVtKCk7XG4gIH07XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYWxcbiAgaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZWFkeS5wcm9taXNlO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIER1bXBcblxuICBkdW1wKCk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2R1bXAoKTtcbiAgfVxuXG4gIGFzeW5jIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2R1bXBUYWJsZShyZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBSb3dzXG5cbiAgcmVhZFJvd3MocmVxdWVzdDoge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgd2hlcmU6IHsgW2NvbHVtbjogc3RyaW5nXTogSnNvblZhbHVlIH07XG4gIH0pOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiB0aGlzLl9yZWFkUm93cyhyZXF1ZXN0KTtcbiAgfVxuXG4gIGFzeW5jIHJvd0NvdW50KHRhYmxlOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHRhYmxlRGF0YSA9IHRoaXMuX21lbVt0YWJsZV0gYXMgVGFibGVUeXBlO1xuICAgIGlmICghdGFibGVEYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0YWJsZURhdGEuX2RhdGEubGVuZ3RoKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBXcml0ZVxuXG4gIHdyaXRlKHJlcXVlc3Q6IHsgZGF0YTogUmxqc29uIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGUocmVxdWVzdCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gVGFibGUgbWFuYWdlbWVudFxuICBhc3luYyB0YWJsZUV4aXN0cyh0YWJsZUtleTogVGFibGVLZXkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVt0YWJsZUtleV0gYXMgVGFibGVUeXBlO1xuICAgIHJldHVybiB0YWJsZSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIGNyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdDogeyB0YWJsZUNmZzogVGFibGVDZmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3QpO1xuICB9XG5cbiAgYXN5bmMgdGFibGVDZmdzKCk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgY29uc3QgdGFibGVzID0gdGhpcy5fbWVtLnRhYmxlQ2Zncy5fZGF0YSBhcyBUYWJsZUNmZ1tdO1xuXG4gICAgLy8gVGFrZSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZWFjaCB0eXBlIGtleVxuICAgIGNvbnN0IG5ld2VzdFZlcnNpb246IFJlY29yZDxUYWJsZUtleSwgVGFibGVDZmc+ID0ge307XG4gICAgZm9yIChsZXQgaSA9IHRhYmxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgdGFibGUgPSB0YWJsZXNbaV07XG4gICAgICBjb25zdCBleGlzdGluZyA9IG5ld2VzdFZlcnNpb25bdGFibGUua2V5XTtcbiAgICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgICAgbmV3ZXN0VmVyc2lvblt0YWJsZS5rZXldID0gdGFibGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0RGF0YSA9IE9iamVjdC52YWx1ZXMobmV3ZXN0VmVyc2lvbikucmV2ZXJzZSgpO1xuXG4gICAgcmV0dXJuIGhpcCh7XG4gICAgICB0YWJsZUNmZ3M6IHtcbiAgICAgICAgX2RhdGE6IHJlc3VsdERhdGEsXG4gICAgICB9LFxuICAgIH0gYXMgUmxqc29uKTtcbiAgfVxuXG4gIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiAgLy8gUHJpdmF0ZVxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgcHJpdmF0ZSBfaW9Ub29scyE6IElvVG9vbHM7XG5cbiAgcHJpdmF0ZSBfaXNSZWFkeSA9IG5ldyBJc1JlYWR5KCk7XG4gIHByaXZhdGUgX2lzT3BlbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX21lbTogUmxqc29uID0gaGlwKHt9IGFzIFJsanNvbik7XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2luaXQoKSB7XG4gICAgdGhpcy5faW9Ub29scyA9IG5ldyBJb1Rvb2xzKHRoaXMpO1xuICAgIHRoaXMuX2luaXRUYWJsZUNmZ3MoKTtcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy5pbml0UmV2aXNpb25zVGFibGUoKTtcbiAgICBoc2godGhpcy5fbWVtKTtcblxuICAgIHRoaXMuX2lzUmVhZHkucmVzb2x2ZSgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2luaXRUYWJsZUNmZ3MgPSAoKSA9PiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBJb1Rvb2xzLnRhYmxlQ2Znc1RhYmxlQ2ZnO1xuXG4gICAgdGhpcy5fbWVtLnRhYmxlQ2ZncyA9IGhpcCh7XG4gICAgICBfZGF0YTogW3RhYmxlQ2ZnXSxcbiAgICAgIF90YWJsZUNmZzogdGFibGVDZmcuX2hhc2ggYXMgc3RyaW5nLFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF91cGRhdGVHbG9iYWxIYXNoKCkge1xuICAgICh0aGlzLl9tZW0gYXMgYW55KS5faGFzaCA9ICcnO1xuICAgIGhpcCh0aGlzLl9tZW0sIHtcbiAgICAgIHVwZGF0ZUV4aXN0aW5nSGFzaGVzOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF91cGRhdGVUYWJsZUhhc2godGFibGVLZXk6IFRhYmxlS2V5KSB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcbiAgICB0YWJsZS5faGFzaCA9ICcnO1xuICAgIGhpcCh0YWJsZSwgeyB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7XG4gICAgdGFibGVDZmc6IFRhYmxlQ2ZnO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHRhYmxlIGNvbmZpZyBpcyBjb21wYXRpYmxlXG4gICAgLy8gd2l0aCBhbiBwb3RlbnRpYWwgZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCB0YWJsZUNmZyA9IHJlcXVlc3QudGFibGVDZmc7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh0YWJsZUNmZyk7XG5cbiAgICBjb25zdCB7IGtleSB9ID0gdGFibGVDZmc7XG5cbiAgICAvLyBSZWNyZWF0ZSBoYXNoZXMgaW4gdGhlIGNhc2UgdGhlIGV4aXN0aW5nIGhhc2hlcyBhcmUgd3JvbmdcbiAgICBjb25zdCBuZXdDb25maWcgPSBoc2godGFibGVDZmcpO1xuXG4gICAgLy8gRmluZCBhbiBleGlzdGluZyB0YWJsZSBjb25maWcgd2l0aCB0aGUgc2FtZSBoYXNoXG4gICAgY29uc3QgZXhpc3RpbmdDb25maWcgPSBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRhYmxlQ2ZnT3JOdWxsKGtleSk7XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIGlmICghZXhpc3RpbmdDb25maWcpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVRhYmxlKG5ld0NvbmZpZywga2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZXh0ZW5kVGFibGUoZXhpc3RpbmdDb25maWcsIG5ld0NvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2NyZWF0ZVRhYmxlKG5ld0NvbmZpZzogVGFibGVDZmcsIHRhYmxlS2V5OiBUYWJsZUtleSkge1xuICAgIC8vIFdyaXRlIHRoZSB0YWJsZSBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBuZXdDb25maWcgPSBoc2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhLnB1c2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl91cGRhdGVUYWJsZUhhc2goJ3RhYmxlQ2ZncycpO1xuXG4gICAgLy8gQ3JlYXRlIGEgdGFibGUgYW5kIHdyaXRlIGl0IGludG8gdGhlIGRhdGFiYXNlXG4gICAgY29uc3QgdGFibGU6IFRhYmxlVHlwZSA9IHtcbiAgICAgIF9kYXRhOiBbXSxcbiAgICAgIF90YWJsZUNmZzogbmV3Q29uZmlnLl9oYXNoIGFzIHN0cmluZyxcbiAgICB9O1xuXG4gICAgdGhpcy5fbWVtW3RhYmxlS2V5XSA/Pz0gaGlwKHRhYmxlKTtcblxuICAgIC8vIFVwZGF0ZSBoYXNoZXNcbiAgICB0aGlzLl91cGRhdGVUYWJsZUhhc2godGFibGVLZXkpO1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9leHRlbmRUYWJsZShleGlzdGluZ0NvbmZpZzogVGFibGVDZmcsIG5ld0NvbmZpZzogVGFibGVDZmcpIHtcbiAgICAvLyBObyBjb2x1bW5zIGFkZGVkPyBSZXR1cm4uXG4gICAgaWYgKGV4aXN0aW5nQ29uZmlnLmNvbHVtbnMubGVuZ3RoID09PSBuZXdDb25maWcuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IHRhYmxlIGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIG5ld0NvbmZpZyA9IGhzaChuZXdDb25maWcpO1xuICAgIHRoaXMuX21lbS50YWJsZUNmZ3MuX2RhdGEucHVzaChuZXdDb25maWcpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb25maWcgb2YgdGhlIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bbmV3Q29uZmlnLmtleV0gYXMgVGFibGVUeXBlO1xuICAgIHRhYmxlLl90YWJsZUNmZyA9IG5ld0NvbmZpZy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGhhc2hlc1xuICAgIHRoaXMuX3VwZGF0ZVRhYmxlSGFzaCgndGFibGVDZmdzJyk7XG4gICAgdGhpcy5fdXBkYXRlVGFibGVIYXNoKG5ld0NvbmZpZy5rZXkpO1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuXG4gIHByaXZhdGUgYXN5bmMgX2R1bXAoKTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gY29weSh0aGlzLl9tZW0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2R1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcblxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgIHJldHVybiB7XG4gICAgICBbcmVxdWVzdC50YWJsZV06IGNvcHkodGFibGUpLFxuICAgIH07XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFkZGVkRGF0YSA9IGhzaChyZXF1ZXN0LmRhdGEpO1xuICAgIHRoaXMuX3JlbW92ZU51bGxWYWx1ZXMoYWRkZWREYXRhKTtcbiAgICBjb25zdCB0YWJsZXMgPSBPYmplY3Qua2V5cyhhZGRlZERhdGEpO1xuICAgIGhzaChhZGRlZERhdGEpO1xuXG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJlcXVlc3QuZGF0YSk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURhdGFEb2VzTm90TWF0Y2hDZmcocmVxdWVzdC5kYXRhKTtcblxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgdGFibGVzKSB7XG4gICAgICBpZiAodGFibGUuc3RhcnRzV2l0aCgnXycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvbGRUYWJsZSA9IHRoaXMuX21lbVt0YWJsZV0gYXMgVGFibGVUeXBlO1xuICAgICAgY29uc3QgbmV3VGFibGUgPSBhZGRlZERhdGFbdGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgICAgLy8gVGFibGUgZXhpc3RzLiBNZXJnZSBkYXRhXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbmV3VGFibGUuX2RhdGEpIHtcbiAgICAgICAgY29uc3QgaGFzaCA9IGl0ZW0uX2hhc2g7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IG9sZFRhYmxlLl9kYXRhLmZpbmQoKGkpID0+IGkuX2hhc2ggPT09IGhhc2gpO1xuICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgIG9sZFRhYmxlLl9kYXRhLnB1c2goaXRlbSBhcyBhbnkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3VwZGF0ZVRhYmxlSGFzaCh0YWJsZSk7XG4gICAgfVxuXG4gICAgLy8gUmVjYWxjIG1haW4gaGFzaGVzXG4gICAgdGhpcy5fdXBkYXRlR2xvYmFsSGFzaCgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX3JlYWRSb3dzKHJlcXVlc3Q6IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIHdoZXJlOiB7IFtjb2x1bW46IHN0cmluZ106IEpzb25WYWx1ZSB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRocm93V2hlblRhYmxlRG9lc05vdEV4aXN0KHJlcXVlc3QudGFibGUpO1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuQ29sdW1uRG9lc05vdEV4aXN0KFxuICAgICAgcmVxdWVzdC50YWJsZSxcbiAgICAgIE9iamVjdC5rZXlzKHJlcXVlc3Qud2hlcmUpLFxuICAgICk7XG5cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtyZXF1ZXN0LnRhYmxlXSBhcyBUYWJsZVR5cGU7XG5cbiAgICBjb25zdCByZXN1bHQ6IFJsanNvbiA9IHtcbiAgICAgIFtyZXF1ZXN0LnRhYmxlXToge1xuICAgICAgICBfZGF0YTogdGFibGUuX2RhdGEuZmlsdGVyKChyb3cpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBpbiByZXF1ZXN0LndoZXJlKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gcm93W2NvbHVtbl07XG4gICAgICAgICAgICBjb25zdCBiID0gcmVxdWVzdC53aGVyZVtjb2x1bW5dO1xuICAgICAgICAgICAgaWYgKGIgPT09IG51bGwgJiYgYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWVxdWFscyhhLCBiKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSBhcyBhbnk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgX3JlbW92ZU51bGxWYWx1ZXMocmxqc29uOiBSbGpzb24pIHtcbiAgICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sICh0YWJsZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHJsanNvblt0YWJsZV0uX2RhdGE7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGRhdGEpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcm93KSB7XG4gICAgICAgICAgaWYgKHJvd1trZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBkZWxldGUgcm93W2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBJbywgSW9NZW0gfSBmcm9tICcuL2luZGV4LnRzJztcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogSW8gaW1wbGVtZW50YXRpb24gbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gYmUgdXNlZCBpblxuICogY29uZm9ybWFuY2UgdGVzdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW9UZXN0U2V0dXAge1xuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcmV0dXJucyBUaGUgaW8gaW1wbGVtZW50YXRpb24uXG4gICAqL1xuICBpbml0OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUZWFycyBkb3duIHRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHJldHVybnMgVGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKi9cbiAgdGVhckRvd246ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSBpbyBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkIGluIHRoZSBjb25mb3JtYW5jZSB0ZXN0cy5cbiAgICovXG4gIGlvOiBJbztcbn1cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8vIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIElvVGVzdFNldHVwIGludGVyZmFjZVxuZXhwb3J0IGNvbnN0IGV4YW1wbGVUZXN0U2V0dXAgPSAoKTogSW9UZXN0U2V0dXAgPT4ge1xuICByZXR1cm4ge1xuICAgIGlvOiBuZXcgSW9NZW0oKSxcbiAgICBpbml0OiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBpbyBpbXBsZW1lbnRhdGlvblxuICAgIH0sXG4gICAgdGVhckRvd246IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFRlYXIgZG93biB0aGUgaW8gaW1wbGVtZW50YXRpb25cbiAgICB9LFxuICB9O1xufTtcbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBKc29uVmFsdWUgfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHsgUmxqc29uLCBUYWJsZUNmZywgVGFibGVLZXkgfSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5leHBvcnQgaW50ZXJmYWNlIElvIHtcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYWxcblxuICAvKiogU3RhcnRzIHRoZSBpbml0aWFsaXphdGlvbiAqL1xuICBpbml0KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqIENsb3NlcyB0aGUgaW8gKi9cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKiogUmV0dXJucyB0cnVlIGlmIGlvIGlzIG9wZW5lZCAqL1xuICBpc09wZW46IGJvb2xlYW47XG5cbiAgLyoqIEEgcHJvbWlzZSByZXNvbHZpbmcgb25jZSB0aGUgSW8gaW50ZXJmYWNlIGlzIHJlYWR5XG4gICAqXG4gICAqIPCfkqEgVXNlIEBybGpzb24vaXMtcmVhZHlcbiAgICovXG4gIGlzUmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gRHVtcFxuXG4gIC8qKiBSZXR1cm5zIHRoZSBjb21wbGV0ZSBkYiBjb250ZW50IGFzIFJsanNvbiAqL1xuICBkdW1wKCk6IFByb21pc2U8Umxqc29uPjtcblxuICAvKiogUmV0dXJucyB0aGUgZHVtcCBvZiBhIGNvbXBsZXRlIHRhYmxlICovXG4gIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gVGFibGVzXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGFibGUgZXhpc3RzXG4gICAqL1xuICB0YWJsZUV4aXN0cyh0YWJsZUtleTogVGFibGVLZXkpOiBQcm9taXNlPGJvb2xlYW4+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdGFibGUgd2l0aCBhIGdpdmVuIGNvbmZpZy5cbiAgICogSWYgdGhlIHRhYmxlIGFscmVhZHkgZXhpc3RzLCBuZXcgY29sdW1ucyBhcmUgYWRkZWQgdG8gdGhlIGV4aXN0aW5nIHRhYmxlLlxuICAgKiBJZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29uZmlnLlxuICAgKiBJZiB0aGUgdGFibGUgZXhpc3RzIGFuZCBjb2x1bW5zIGFyZSByZW1vdmVkLCBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAqIElmIHRoZSB0YWJsZSBleGlzdHMgYW5kIHRoZSBjb2x1bW4gdHlwZSBpcyBjaGFuZ2VkLCBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAqL1xuICBjcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3Q6IHsgdGFibGVDZmc6IFRhYmxlQ2ZnIH0pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEganNvbiBzdHJ1Y3R1cmUgcmV0dXJuaW5nIGN1cnJlbnQgdGFibGUgY29uZmlndXJhdGlvbnNcbiAgICovXG4gIHRhYmxlQ2ZncygpOiBQcm9taXNlPFJsanNvbj47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFdyaXRlXG5cbiAgLyoqIFdyaXRlcyBSbGpzb24gZGF0YSBpbnRvIHRoZSBkYXRhYmFzZSAqL1xuICB3cml0ZShyZXF1ZXN0OiB7IGRhdGE6IFJsanNvbiB9KTogUHJvbWlzZTx2b2lkPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUmVhZCByb3dzXG5cbiAgLyoqIFF1ZXJpZXMgYSBsaXN0IG9mIHJvd3MgKi9cbiAgcmVhZFJvd3MocmVxdWVzdDoge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgd2hlcmU6IHsgW2NvbHVtbjogc3RyaW5nXTogSnNvblZhbHVlIHwgbnVsbCB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+O1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgZ2l2ZW4gdGFibGUgKi9cbiAgcm93Q291bnQodGFibGU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmV4cG9ydCBjb25zdCBleGFtcGxlSW8gPVxuICAnQ2hlY2tvdXQgQHJsanNvbi9pby1tZW0gZm9yIGFuIGV4YW1wbGUgaW1wbGVtZW50YXRpb24nO1xuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IEpzb24gfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHtcbiAgQnVmZmV0LFxuICBDYWtlLFxuICBpdGVyYXRlVGFibGVzU3luYyxcbiAgTGF5ZXIsXG4gIFJlZixcbiAgUmxqc29uLFxuICBUYWJsZUtleSxcbn0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBEZXNjcmliZXMgYSByb3cgdGhhdCByZWZlcmVuY2VzIGEgY2hpbGQgdGFibGUgcm93XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyZW50UmVmIHtcbiAgLyoqXG4gICAqIFRoZSBwYXJlbnQgdGFibGUgdGhhdCByZWZlcmVuY2VzIHRoZSBjaGlsZCB0YWJsZVxuICAgKi9cbiAgW3BhcmVudFRhYmxlOiBUYWJsZUtleV06IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFyZW50IHJvdyB0aGF0IHJlZmVyZW5jZXMgdGhlIGNoaWxkIHJvd1xuICAgICAqL1xuICAgIFtwYXJlbnRSb3c6IFJlZl06IHtcbiAgICAgIC8qKlxuICAgICAgICogRGV0YWlscyBhYm91dCB0aGUgcmVmZXJlbmNlLCBlLmcuIGFuIGFycmF5IGluZGV4IGV0Yy5cbiAgICAgICAqL1xuICAgICAgZGV0YWlscz86IEpzb247XG4gICAgfTtcbiAgfTtcbn1cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBwYXJlbnQgdGFibGUgcm93cyByZWZlcmVuY2luZyBhIGNoaWxkIHRhYmxlIHJvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldmVyc2VSZWZzIHtcbiAgLyoqXG4gICAqIFRoZSBjaGlsZCB0YWJsZSB3ZSBuZWVkIHRoZSByZWZlcmVuY2luZyByb3dzIGZvclxuICAgKi9cbiAgW2NoaWxkVGFibGU6IFRhYmxlS2V5XToge1xuICAgIC8qKlxuICAgICAqIFRoZSByb3cgaGFzaHdlIG5lZWQgdGhlIHJlZmVyZW5jaW5nIHJvd3MgZm9yXG4gICAgICovXG4gICAgW2NoaWxkUm93OiBSZWZdOiBQYXJlbnRSZWY7XG4gIH07XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAqL1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSByZXZlcnNlIHJlZmVyZW5jZXMgZm9yIGEgZ2l2ZW4gcmxqc29uIG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgY2FsY1JldmVyc2VSZWZzID0gKHJsanNvbjogUmxqc29uKTogUmV2ZXJzZVJlZnMgPT4ge1xuICBjb25zdCByZXN1bHQ6IFJldmVyc2VSZWZzID0ge307XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBQcmVwYXJlIGRhdGEgc3RydWN0dXJlXG4gIGl0ZXJhdGVUYWJsZXNTeW5jKHJsanNvbiwgKGNoaWxkVGFibGVLZXksIHRhYmxlKSA9PiB7XG4gICAgY29uc3QgY2hpbGRUYWJsZTogeyBbY2hpbGRSb3dIYXNoOiBzdHJpbmddOiBQYXJlbnRSZWYgfSA9IHt9O1xuICAgIHJlc3VsdFtjaGlsZFRhYmxlS2V5XSA9IGNoaWxkVGFibGU7XG4gICAgZm9yIChjb25zdCBjaGlsZFJvdyBvZiB0YWJsZS5fZGF0YSkge1xuICAgICAgY2hpbGRUYWJsZVtjaGlsZFJvdy5faGFzaF0gPSB7fTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gR2VuZXJhdGUgcmV2ZXJzZSByZWZlcmVuY2VzXG4gIGl0ZXJhdGVUYWJsZXNTeW5jKHJsanNvbiwgKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZSkgPT4ge1xuICAgIC8vIEl0ZXJhdGUgYWxsIHJvd3Mgb2YgZWFjaCB0YWJsZVxuICAgIGZvciAoY29uc3QgcGFyZW50VGFibGVSb3cgb2YgcGFyZW50VGFibGUuX2RhdGEpIHtcbiAgICAgIC8vIEZpbmQgb3V0IHdoZSBvdGhlciB0YWJsZXMgJiByb3dzIGFyZSByZWZlcmVuY2VkIGJ5IHRoaXMgcm93XG4gICAgICAvLyBXcml0ZSB0aGVzZSBpbmZvcm1hdGlvbiBpbnR0byByZXN1bHRcbiAgICAgIHN3aXRjaCAocGFyZW50VGFibGUuX3R5cGUpIHtcbiAgICAgICAgY2FzZSAnaW5ncmVkaWVudHMnOlxuICAgICAgICAgIF93cml0ZUluZ3JlZGllbnRSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdsYXllcnMnOiB7XG4gICAgICAgICAgX3dyaXRlTGF5ZXJSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3NsaWNlSWRzJzoge1xuICAgICAgICAgIC8vIFNsaWNlIGlkcyBkbyBub3QgcmVmZXJlbmNlIG90aGVyIHRhYmxlc1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnY2FrZXMnOiB7XG4gICAgICAgICAgX3dyaXRlQ2FrZVJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnYnVmZmV0cyc6IHtcbiAgICAgICAgICBfd3JpdGVCdWZmZXRSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qIHY4IGlnbm9yZSBlbmQgKi9cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUluZ3JlZGllbnRSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IEpzb24sXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBwYXJlbnRDb2x1bW5OYW1lIGluIHBhcmVudFJvdykge1xuICAgIGlmIChwYXJlbnRDb2x1bW5OYW1lLnN0YXJ0c1dpdGgoJ18nKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnRDb2x1bW5OYW1lLmVuZHNXaXRoKCdSZWYnKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBwYXJlbnRDb2x1bW5OYW1lLnNsaWNlKDAsIC0zKTtcbiAgICBjb25zdCBjaGlsZFJvd0hhc2ggPSBwYXJlbnRSb3dbcGFyZW50Q29sdW1uTmFtZV0gYXMgc3RyaW5nO1xuXG4gICAgX3dyaXRlKFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRUYWJsZU5hbWUsXG4gICAgICBjaGlsZFJvd0hhc2gsXG4gICAgICBwYXJlbnRUYWJsZU5hbWUsXG4gICAgICBwYXJlbnRSb3dIYXNoLFxuICAgICk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVMYXllclJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogTGF5ZXIsXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBwYXJlbnRSb3cuaW5ncmVkaWVudHNUYWJsZTtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBzbGljZUlkIGluIHBhcmVudFJvdy5hc3NpZ24pIHtcbiAgICBpZiAoc2xpY2VJZC5zdGFydHNXaXRoKCdfJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNsaWNlSGFzaCA9IHBhcmVudFJvdy5hc3NpZ25bc2xpY2VJZF0gYXMgc3RyaW5nO1xuXG4gICAgX3dyaXRlKHJlc3VsdCwgY2hpbGRUYWJsZU5hbWUsIHNsaWNlSGFzaCwgcGFyZW50VGFibGVOYW1lLCBwYXJlbnRSb3dIYXNoKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUNha2VSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IENha2UsXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBsYXllciBpbiBwYXJlbnRSb3cubGF5ZXJzKSB7XG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBwYXJlbnRSb3cubGF5ZXJzVGFibGU7XG4gICAgY29uc3QgY2hpbGRSb3dIYXNoID0gcGFyZW50Um93LmxheWVyc1tsYXllcl0gYXMgc3RyaW5nO1xuICAgIF93cml0ZShcbiAgICAgIHJlc3VsdCxcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxuICAgICAgY2hpbGRSb3dIYXNoLFxuICAgICAgcGFyZW50VGFibGVOYW1lLFxuICAgICAgcGFyZW50Um93SGFzaCxcbiAgICApO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlQnVmZmV0UmVmcyA9IChcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcbiAgcGFyZW50Um93OiBCdWZmZXQsXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBpdGVtIG9mIHBhcmVudFJvdy5pdGVtcykge1xuICAgIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gaXRlbS50YWJsZTtcbiAgICBjb25zdCBjaGlsZFJvd0hhc2ggPSBpdGVtLnJlZjtcbiAgICBfd3JpdGUoXG4gICAgICByZXN1bHQsXG4gICAgICBjaGlsZFRhYmxlTmFtZSxcbiAgICAgIGNoaWxkUm93SGFzaCxcbiAgICAgIHBhcmVudFRhYmxlTmFtZSxcbiAgICAgIHBhcmVudFJvd0hhc2gsXG4gICAgKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZSA9IChcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbiAgY2hpbGRUYWJsZU5hbWU6IHN0cmluZyxcbiAgY2hpbGRSb3dIYXNoOiBzdHJpbmcsXG4gIHBhcmVudFRhYmxlTmFtZTogc3RyaW5nLFxuICBwYXJlbnRSb3dIYXNoOiBzdHJpbmcsXG4pID0+IHtcbiAgY29uc3QgcmVmZXJlbmNlc0ZvckNoaWxkVGFibGUgPSAocmVzdWx0W2NoaWxkVGFibGVOYW1lXSA/Pz0ge30pO1xuICBjb25zdCByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVJvdyA9IChyZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVtjaGlsZFJvd0hhc2hdID8/PVxuICAgIHt9KTtcblxuICByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVJvd1twYXJlbnRUYWJsZU5hbWVdID8/PSB7fTtcbiAgcmVmZXJlbmNlc0ZvckNoaWxkVGFibGVSb3dbcGFyZW50VGFibGVOYW1lXVtwYXJlbnRSb3dIYXNoXSA/Pz0ge307XG59O1xuIl0sIm5hbWVzIjpbImUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQXNCTyxNQUFNLFdBQU4sTUFBTSxTQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtuQixZQUE0QixJQUFRO0FBaUNwQztBQUFBO0FBQUE7QUFBQSw4Q0FBcUIsWUFBWTtBQUMvQixZQUFNLFdBQXFCO0FBQUEsUUFDekIsS0FBSztBQUFBLFFBQ0wsTUFBTTtBQUFBLFFBQ04sUUFBUTtBQUFBLFFBQ1IsUUFBUTtBQUFBLFFBQ1IsVUFBVTtBQUFBLFFBRVYsU0FBUztBQUFBLFVBQ1AsRUFBRSxLQUFLLFNBQVMsTUFBTSxTQUFTO0FBQUEsVUFDL0IsRUFBRSxLQUFLLFNBQVMsTUFBTSxTQUFTO0FBQUEs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
601
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pby10b29scy50cyIsIi4uL3NyYy9pby1tZW0udHMiLCIuLi9zcmMvaW8tdGVzdC1zZXR1cC50cyIsIi4uL3NyYy9pby50cyIsIi4uL3NyYy9yZXZlcnNlLXJlZi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcbmltcG9ydCB7XG4gIGl0ZXJhdGVUYWJsZXMsXG4gIFJsanNvbixcbiAgVGFibGVDZmcsXG4gIFRhYmxlS2V5LFxuICBUYWJsZVR5cGUsXG4gIHRocm93T25JbnZhbGlkVGFibGVDZmcsXG4gIHZhbGlkYXRlUmxqc29uQWdhaW5zdFRhYmxlQ2ZnLFxufSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbmltcG9ydCB7IElvTWVtIH0gZnJvbSAnLi9pby1tZW0udHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcblxuLyoqXG4gKiBQcm92aWRlcyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGhlIElvIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIElvVG9vbHMge1xuICAvKipcbiAgICogQ29uc3RydWN0b3JcbiAgICogQHBhcmFtIGlvIFRoZSBJbyBpbnRlcmZhY2UgdG8gdXNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgaW86IElvKSB7fVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0YWJsZSBjb25maWd1cmF0aW9uIG9mIHRoZSB0YWJsZUNmZ3MgdGFibGUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlQ2Znc1RhYmxlQ2ZnKCkge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gaGlwPFRhYmxlQ2ZnPih7XG4gICAgICBfaGFzaDogJycsXG4gICAgICBrZXk6ICd0YWJsZUNmZ3MnLFxuICAgICAgdHlwZTogJ2luZ3JlZGllbnRzJyxcbiAgICAgIGlzSGVhZDogZmFsc2UsXG4gICAgICBpc1Jvb3Q6IGZhbHNlLFxuICAgICAgaXNTaGFyZWQ6IHRydWUsXG4gICAgICBwcmV2aW91czogJycsXG5cbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBrZXk6ICdfaGFzaCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAna2V5JywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICd0eXBlJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdpc0hlYWQnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgeyBrZXk6ICdpc1Jvb3QnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgeyBrZXk6ICdpc1NoYXJlZCcsIHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgICB7IGtleTogJ3ByZXZpb3VzJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdjb2x1bW5zJywgdHlwZTogJ2pzb25BcnJheScgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGFibGVDZmc7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHJldmlzaW9ucyB0YWJsZS5cbiAgICovXG4gIGluaXRSZXZpc2lvbnNUYWJsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZUNmZzogVGFibGVDZmcgPSB7XG4gICAgICBrZXk6ICdyZXZpc2lvbnMnLFxuICAgICAgdHlwZTogJ2luZ3JlZGllbnRzJyxcbiAgICAgIGlzSGVhZDogdHJ1ZSxcbiAgICAgIGlzUm9vdDogdHJ1ZSxcbiAgICAgIGlzU2hhcmVkOiBmYWxzZSxcblxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7IGtleTogJ19oYXNoJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICd0YWJsZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAncHJlZGVjZXNzb3InLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3N1Y2Nlc3NvcicsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAndGltZXN0YW1wJywgdHlwZTogJ251bWJlcicgfSxcbiAgICAgICAgeyBrZXk6ICdpZCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICBhd2FpdCB0aGlzLmlvLmNyZWF0ZU9yRXh0ZW5kVGFibGUoeyB0YWJsZUNmZyB9KTtcbiAgfTtcblxuICAvKipcbiAgICogRXhhbXBsZSBvYmplY3QgZm9yIHRlc3QgcHVycG9zZXNcbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgaW8gdG9vbHNcbiAgICovXG4gIHN0YXRpYyBleGFtcGxlID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlvID0gYXdhaXQgSW9NZW0uZXhhbXBsZSgpO1xuICAgIGF3YWl0IGlvLmluaXQoKTtcbiAgICBhd2FpdCBpby5pc1JlYWR5KCk7XG4gICAgcmV0dXJuIG5ldyBJb1Rvb2xzKGlvKTtcbiAgfTtcblxuICAvKipcbiAgICogVGhyb3dzIGlmIHRoZSB0YWJsZSBkb2VzIG5vdCBleGlzdFxuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QodGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5pby50YWJsZUV4aXN0cyh0YWJsZSk7XG4gICAgaWYgKCFleGlzdHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgaWYgYW55IG9mIHRoZSB0YWJsZXMgaW4gcmxqc29uIGRvIG5vdCBleGlzdFxuICAgKiBAcGFyYW0gcmxqc29uIC0gVGhlIFJsanNvbiBvYmplY3QgdG8gY2hlY2tcbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlc0RvTm90RXhpc3Qocmxqc29uOiBSbGpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgaXRlcmF0ZVRhYmxlcyhybGpzb24sIGFzeW5jICh0YWJsZUtleSkgPT4ge1xuICAgICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCB0aGlzLmlvLnRhYmxlRXhpc3RzKHRhYmxlS2V5KTtcbiAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZUtleX1cIiBub3QgZm91bmRgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgbWlzc2luZ1RhYmxlcyA9IChlIGFzIEFycmF5PGFueT4pLm1hcCgoZSkgPT4gZS50YWJsZUtleSk7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgdGFibGVzIGRvIG5vdCBleGlzdDogJHttaXNzaW5nVGFibGVzLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGFibGUgY2ZncyBvZiBhbGwgdGFibGVzXG4gICAqIEByZXR1cm5zIFRoZSB0YWJsZSBjb25maWd1cmF0aW9uIG9mIGFsbCB0YWJsZXNcbiAgICovXG4gIGFzeW5jIHRhYmxlQ2ZncygpOiBQcm9taXNlPFRhYmxlQ2ZnW10+IHtcbiAgICBjb25zdCB0YWJsZXMgPSBhd2FpdCB0aGlzLmlvLnJhd1RhYmxlQ2ZncygpO1xuXG4gICAgLy8gVGFrZSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZWFjaCB0eXBlIGtleVxuICAgIGNvbnN0IG5ld2VzdFZlcnNpb246IFJlY29yZDxUYWJsZUtleSwgVGFibGVDZmc+ID0ge307XG4gICAgZm9yIChsZXQgaSA9IHRhYmxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgdGFibGUgPSB0YWJsZXNbaV07XG4gICAgICBjb25zdCBleGlzdGluZyA9IG5ld2VzdFZlcnNpb25bdGFibGUua2V5XTtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgaWYgKCFleGlzdGluZyB8fCBleGlzdGluZy5jb2x1bW5zLmxlbmd0aCA8IHRhYmxlLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgIG5ld2VzdFZlcnNpb25bdGFibGUua2V5XSA9IHRhYmxlO1xuICAgICAgfVxuICAgICAgLyogdjggaWdub3JlIGVuZCAqL1xuICAgIH1cblxuICAgIC8vIFNvcnQgdGhlIHRhYmxlcyBieSBrZXlcbiAgICBjb25zdCByZXN1bHREYXRhID0gT2JqZWN0LnZhbHVlcyhuZXdlc3RWZXJzaW9uKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBpZiAoYS5rZXkgPCBiLmtleSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICBpZiAoYS5rZXkgPiBiLmtleSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgLyogdjggaWdub3JlIHN0YXJ0ICovXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgICAgLyogdjggaWdub3JlIGVuZCAqL1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHREYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IHdpdGggYWxsIHRhYmxlIG5hbWVzXG4gICAqL1xuICBhc3luYyBhbGxUYWJsZUtleXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCB0aGlzLnRhYmxlQ2ZncygpKS5tYXAoKGUpID0+IGUua2V5KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBnaXZlbiB0YWJsZVxuICAgKi9cbiAgYXN5bmMgdGFibGVDZmcodGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTxUYWJsZUNmZz4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZ09yTnVsbCh0YWJsZSk7XG4gICAgaWYgKCF0YWJsZUNmZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGV9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlQ2ZnITtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgZ2l2ZW4gdGFibGUgb3IgbnVsbCBpZiBpdCBkb2VzIG5vdCBleGlzdC5cblxuICAgKi9cbiAgYXN5bmMgdGFibGVDZmdPck51bGwodGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTxUYWJsZUNmZyB8IG51bGw+IHtcbiAgICBjb25zdCB0YWJsZUNmZ3MgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZncygpO1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gdGFibGVDZmdzLmZpbmQoKGUpID0+IGUua2V5ID09PSB0YWJsZSk7XG4gICAgcmV0dXJuIHRhYmxlQ2ZnID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGNvbHVtbiBuYW1lcyBvZiBhIGdpdmVuIHRhYmxlXG4gICAqL1xuICBhc3luYyBhbGxDb2x1bW5LZXlzKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRhYmxlQ2ZnLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIHdoZW4gYSBjb2x1bW4gZG9lcyBub3QgZXhpc3QgaW4gYSBnaXZlbiB0YWJsZVxuICAgKiBAcGFyYW0gdGFibGUgLSBUaGUgdGFibGUgdG8gY2hlY2tcbiAgICogQHBhcmFtIGNvbHVtbnMgLSBUaGUgY29sdW1uIHRvIGNoZWNrXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5Db2x1bW5Eb2VzTm90RXhpc3QoXG4gICAgdGFibGU6IFRhYmxlS2V5LFxuICAgIGNvbHVtbnM6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGUpO1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSB0YWJsZUNmZy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KTtcbiAgICBjb25zdCBtaXNzaW5nQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKFxuICAgICAgKGNvbHVtbikgPT4gIWNvbHVtbktleXMuaW5jbHVkZXMoY29sdW1uKSxcbiAgICApO1xuICAgIGlmIChtaXNzaW5nQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgZm9sbG93aW5nIGNvbHVtbnMgZG8gbm90IGV4aXN0IGluIHRhYmxlIFwiJHt0YWJsZX1cIjogJHttaXNzaW5nQ29sdW1ucy5qb2luKFxuICAgICAgICAgICcsICcsXG4gICAgICAgICl9LmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3Mgd2hlbiBhIHRhYmxlIHVwZGF0ZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHRhYmxlXG4gICAqIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh1cGRhdGU6IFRhYmxlQ2ZnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJlZml4ID0gYEludmFsaWQgdXBkYXRlIG9mIHRhYmxlIGFibGUgXCIke3VwZGF0ZS5rZXl9XCJgO1xuXG4gICAgdGhyb3dPbkludmFsaWRUYWJsZUNmZyh1cGRhdGUpO1xuXG4gICAgLy8gQ2hlY2sgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnT3JOdWxsKHVwZGF0ZS5rZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgLy8gSGF2ZSBjb2x1bW5zIGJlZW4gZGVsZXRlZD9cbiAgICAgIGlmIChleGlzdGluZy5jb2x1bW5zLmxlbmd0aCA+IHVwZGF0ZS5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkZWxldGVkQ29sdW1uS2V5cyA9IGV4aXN0aW5nLmNvbHVtbnNcbiAgICAgICAgICAubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChrZXkpID0+ICF1cGRhdGUuY29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5rZXkgPT09IGtleSksXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKGRlbGV0ZWRDb2x1bW5LZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBkZWxldGVkQ29sdW1ucyA9IGRlbGV0ZWRDb2x1bW5LZXlzLmpvaW4oJywgJyk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7cHJlZml4fTogQ29sdW1ucyBtdXN0IG5vdCBiZSBkZWxldGVkLiBgICtcbiAgICAgICAgICAgICAgYERlbGV0ZWQgY29sdW1uczogJHtkZWxldGVkQ29sdW1uc319YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhdmUgY29sdW1uIGtleXMgY2hhbmdlZD9cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmcuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBiZWZvcmUgPSBleGlzdGluZy5jb2x1bW5zW2ldLmtleTtcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSB1cGRhdGUuY29sdW1uc1tpXS5rZXk7XG4gICAgICAgIGlmIChiZWZvcmUgIT09IGFmdGVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7cHJlZml4fTogYCArXG4gICAgICAgICAgICAgIGBDb2x1bW4ga2V5cyBtdXN0IG5vdCBjaGFuZ2UhIGAgK1xuICAgICAgICAgICAgICBgQ29sdW1uIFwiJHtiZWZvcmV9XCIgd2FzIHJlbmFtZWQgaW50byBcIiR7YWZ0ZXJ9XCIuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhdmUgY29sdW1uIHR5cGVzIGNoYW5nZWQ/XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4aXN0aW5nLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gZXhpc3RpbmcuY29sdW1uc1tpXS5rZXk7XG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IGV4aXN0aW5nLmNvbHVtbnNbaV0udHlwZTtcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSB1cGRhdGUuY29sdW1uc1tpXS50eXBlO1xuICAgICAgICBpZiAoYmVmb3JlICE9PSBhZnRlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGAke3ByZWZpeH06IGAgK1xuICAgICAgICAgICAgICBgQ29sdW1uIHR5cGVzIG11c3Qgbm90IGNoYW5nZSEgYCArXG4gICAgICAgICAgICAgIGBUeXBlIG9mIGNvbHVtbiBcIiR7Y29sdW1ufVwiIHdhcyBjaGFuZ2VkIGZyb20gXCIke2JlZm9yZX1cIiB0byAke2FmdGVyfS5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGlmIHRoZSBkYXRhIGluIHRoZSB0YWJsZSBkbyBub3QgbWF0Y2ggdGhlIHRhYmxlIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlRGF0YURvZXNOb3RNYXRjaENmZyhkYXRhOiBSbGpzb24pIHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBhd2FpdCBpdGVyYXRlVGFibGVzKGRhdGEsIGFzeW5jICh0YWJsZUtleSkgPT4ge1xuICAgICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnKHRhYmxlS2V5KTtcbiAgICAgIGNvbnN0IHRhYmxlID0gZGF0YVt0YWJsZUtleV07XG4gICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVJsanNvbkFnYWluc3RUYWJsZUNmZyh0YWJsZS5fZGF0YSwgdGFibGVDZmcpKTtcbiAgICB9KTtcblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGFibGUgZGF0YSBkb2VzIG5vdCBtYXRjaCB0aGUgY29uZmlndXJhdGlvbi5cXG5cXG5FcnJvcnM6XFxuJHtlcnJvcnNcbiAgICAgICAgICAubWFwKChlKSA9PiBgLSAke2V9YClcbiAgICAgICAgICAuam9pbignXFxuJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNvcnRzIHRoZSBkYXRhIG9mIGEgdGFibGUgYnkgdGhlIGhhc2ggYW5kIHVwZGF0ZXMgdGhlIHRhYmxlIGhhc2ggaW4gcGxhY2VcbiAgICovXG4gIHNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKHRhYmxlOiBUYWJsZVR5cGUpOiB2b2lkIHtcbiAgICB0YWJsZS5fZGF0YS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBoYXNoQSA9IGEuX2hhc2ggYXMgc3RyaW5nO1xuICAgICAgY29uc3QgaGFzaEIgPSBiLl9oYXNoIGFzIHN0cmluZztcbiAgICAgIGlmIChoYXNoQSA8IGhhc2hCKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNoQSA+IGhhc2hCKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDA7XG4gICAgICAvKiB2OCBpZ25vcmUgZW5kICovXG4gICAgfSk7XG5cbiAgICB0YWJsZS5faGFzaCA9ICcnO1xuICAgIGhpcCh0YWJsZSwge1xuICAgICAgdXBkYXRlRXhpc3RpbmdIYXNoZXM6IGZhbHNlLFxuICAgICAgdGhyb3dPbldyb25nSGFzaGVzOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxufVxuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IGhpcCwgaHNoIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcbmltcG9ydCB7IElzUmVhZHkgfSBmcm9tICdAcmxqc29uL2lzLXJlYWR5JztcbmltcG9ydCB7IGNvcHksIGVxdWFscywgSnNvblZhbHVlIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7XG4gIGl0ZXJhdGVUYWJsZXNTeW5jLFxuICBSbGpzb24sXG4gIFRhYmxlQ2ZnLFxuICBUYWJsZUtleSxcbiAgVGFibGVUeXBlLFxufSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbmltcG9ydCB7IElvVG9vbHMgfSBmcm9tICcuL2lvLXRvb2xzLnRzJztcbmltcG9ydCB7IElvIH0gZnJvbSAnLi9pby50cyc7XG5cbi8qKlxuICogSW4tTWVtb3J5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBSbGpzb24gSW8gaW50ZXJmYWNlLlxuICovXG5leHBvcnQgY2xhc3MgSW9NZW0gaW1wbGVtZW50cyBJbyB7XG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBDb25zdHJ1Y3RvciAmIGV4YW1wbGVcblxuICBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2lzT3BlbiA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXMuX2luaXQoKTtcbiAgfVxuXG4gIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2lzT3BlbiA9IGZhbHNlO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIGdldCBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzT3BlbjtcbiAgfVxuXG4gIHN0YXRpYyBleGFtcGxlID0gYXN5bmMgKCkgPT4ge1xuICAgIHJldHVybiBuZXcgSW9NZW0oKTtcbiAgfTtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gR2VuZXJhbFxuICBpc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLl9pc1JlYWR5LnByb21pc2U7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gRHVtcFxuXG4gIGR1bXAoKTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gdGhpcy5fZHVtcCgpO1xuICB9XG5cbiAgYXN5bmMgZHVtcFRhYmxlKHJlcXVlc3Q6IHsgdGFibGU6IHN0cmluZyB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gdGhpcy5fZHVtcFRhYmxlKHJlcXVlc3QpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFJvd3NcblxuICByZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRSb3dzKHJlcXVlc3QpO1xuICB9XG5cbiAgYXN5bmMgcm93Q291bnQodGFibGU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgdGFibGVEYXRhID0gdGhpcy5fbWVtW3RhYmxlXSBhcyBUYWJsZVR5cGU7XG4gICAgaWYgKCF0YWJsZURhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRhYmxlRGF0YS5fZGF0YS5sZW5ndGgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFdyaXRlXG5cbiAgd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93cml0ZShyZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBUYWJsZSBtYW5hZ2VtZW50XG4gIGFzeW5jIHRhYmxlRXhpc3RzKHRhYmxlS2V5OiBUYWJsZUtleSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3RhYmxlS2V5XSBhcyBUYWJsZVR5cGU7XG4gICAgcmV0dXJuIHRhYmxlID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7IHRhYmxlQ2ZnOiBUYWJsZUNmZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdCk7XG4gIH1cblxuICBhc3luYyByYXdUYWJsZUNmZ3MoKTogUHJvbWlzZTxUYWJsZUNmZ1tdPiB7XG4gICAgY29uc3QgdGFibGVzID0gdGhpcy5fbWVtLnRhYmxlQ2Zncy5fZGF0YSBhcyBUYWJsZUNmZ1tdO1xuICAgIHJldHVybiB0YWJsZXM7XG4gIH1cblxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4gIC8vIFByaXZhdGVcbiAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG4gIHByaXZhdGUgX2lvVG9vbHMhOiBJb1Rvb2xzO1xuXG4gIHByaXZhdGUgX2lzUmVhZHkgPSBuZXcgSXNSZWFkeSgpO1xuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcblxuICBwcml2YXRlIF9tZW06IFJsanNvbiA9IGhpcCh7fSBhcyBSbGpzb24pO1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9pbml0KCkge1xuICAgIHRoaXMuX2lvVG9vbHMgPSBuZXcgSW9Ub29scyh0aGlzKTtcbiAgICB0aGlzLl9pbml0VGFibGVDZmdzKCk7XG4gICAgdGhpcy5fdXBkYXRlR2xvYmFsSGFzaCgpO1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMuaW5pdFJldmlzaW9uc1RhYmxlKCk7XG4gICAgaHNoKHRoaXMuX21lbSk7XG5cbiAgICB0aGlzLl9pc1JlYWR5LnJlc29sdmUoKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9pbml0VGFibGVDZmdzID0gKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gSW9Ub29scy50YWJsZUNmZ3NUYWJsZUNmZztcblxuICAgIHRoaXMuX21lbS50YWJsZUNmZ3MgPSBoaXAoe1xuICAgICAgX2RhdGE6IFt0YWJsZUNmZ10sXG4gICAgICBfdGFibGVDZmc6IHRhYmxlQ2ZnLl9oYXNoIGFzIHN0cmluZyxcbiAgICB9KTtcbiAgfTtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBfdXBkYXRlR2xvYmFsSGFzaCgpIHtcbiAgICAodGhpcy5fbWVtIGFzIGFueSkuX2hhc2ggPSAnJztcbiAgICBoaXAodGhpcy5fbWVtLCB7XG4gICAgICB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBfdXBkYXRlVGFibGVIYXNoKHRhYmxlS2V5OiBUYWJsZUtleSkge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3RhYmxlS2V5XSBhcyBUYWJsZVR5cGU7XG4gICAgdGFibGUuX2hhc2ggPSAnJztcbiAgICBoaXAodGFibGUsIHsgdXBkYXRlRXhpc3RpbmdIYXNoZXM6IGZhbHNlIH0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2NyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdDoge1xuICAgIHRhYmxlQ2ZnOiBUYWJsZUNmZztcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSB0YWJsZSBjb25maWcgaXMgY29tcGF0aWJsZVxuICAgIC8vIHdpdGggYW4gcG90ZW50aWFsIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgdGFibGVDZmcgPSByZXF1ZXN0LnRhYmxlQ2ZnO1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVJc05vdENvbXBhdGlibGUodGFibGVDZmcpO1xuXG4gICAgY29uc3QgeyBrZXkgfSA9IHRhYmxlQ2ZnO1xuXG4gICAgLy8gUmVjcmVhdGUgaGFzaGVzIGluIHRoZSBjYXNlIHRoZSBleGlzdGluZyBoYXNoZXMgYXJlIHdyb25nXG4gICAgY29uc3QgbmV3Q29uZmlnID0gaHNoKHRhYmxlQ2ZnKTtcblxuICAgIC8vIEZpbmQgYW4gZXhpc3RpbmcgdGFibGUgY29uZmlnIHdpdGggdGhlIHNhbWUgaGFzaFxuICAgIGNvbnN0IGV4aXN0aW5nQ29uZmlnID0gYXdhaXQgdGhpcy5faW9Ub29scy50YWJsZUNmZ09yTnVsbChrZXkpO1xuXG4gICAgLy8gV3JpdGUgdGhlIG5ldyBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBpZiAoIWV4aXN0aW5nQ29uZmlnKSB7XG4gICAgICB0aGlzLl9jcmVhdGVUYWJsZShuZXdDb25maWcsIGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2V4dGVuZFRhYmxlKGV4aXN0aW5nQ29uZmlnLCBuZXdDb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9jcmVhdGVUYWJsZShuZXdDb25maWc6IFRhYmxlQ2ZnLCB0YWJsZUtleTogVGFibGVLZXkpIHtcbiAgICAvLyBXcml0ZSB0aGUgdGFibGUgY29uZmlnIGludG8gdGhlIGRhdGFiYXNlXG4gICAgbmV3Q29uZmlnID0gaHNoKG5ld0NvbmZpZyk7XG4gICAgdGhpcy5fbWVtLnRhYmxlQ2Zncy5fZGF0YS5wdXNoKG5ld0NvbmZpZyk7XG4gICAgdGhpcy5faW9Ub29scy5zb3J0VGFibGVEYXRhQW5kVXBkYXRlSGFzaCh0aGlzLl9tZW0udGFibGVDZmdzKTtcblxuICAgIC8vIENyZWF0ZSBhIHRhYmxlIGFuZCB3cml0ZSBpdCBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIGNvbnN0IHRhYmxlOiBUYWJsZVR5cGUgPSB7XG4gICAgICBfZGF0YTogW10sXG4gICAgICBfdGFibGVDZmc6IG5ld0NvbmZpZy5faGFzaCBhcyBzdHJpbmcsXG4gICAgfTtcblxuICAgIHRoaXMuX21lbVt0YWJsZUtleV0gPz89IGhpcCh0YWJsZSk7XG5cbiAgICAvLyBVcGRhdGUgaGFzaGVzXG4gICAgdGhpcy5fdXBkYXRlVGFibGVIYXNoKHRhYmxlS2V5KTtcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBfZXh0ZW5kVGFibGUoZXhpc3RpbmdDb25maWc6IFRhYmxlQ2ZnLCBuZXdDb25maWc6IFRhYmxlQ2ZnKSB7XG4gICAgLy8gTm8gY29sdW1ucyBhZGRlZD8gUmV0dXJuLlxuICAgIGlmIChleGlzdGluZ0NvbmZpZy5jb2x1bW5zLmxlbmd0aCA9PT0gbmV3Q29uZmlnLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV3JpdGUgdGhlIG5ldyB0YWJsZSBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBuZXdDb25maWcgPSBoc2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhLnB1c2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9pb1Rvb2xzLnNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKHRoaXMuX21lbS50YWJsZUNmZ3MpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb25maWcgb2YgdGhlIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bbmV3Q29uZmlnLmtleV0gYXMgVGFibGVUeXBlO1xuICAgIHRhYmxlLl90YWJsZUNmZyA9IG5ld0NvbmZpZy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGhhc2hlc1xuICAgIHRoaXMuX3VwZGF0ZVRhYmxlSGFzaChuZXdDb25maWcua2V5KTtcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cblxuICBwcml2YXRlIGFzeW5jIF9kdW1wKCk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIGNvcHkodGhpcy5fbWVtKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9kdW1wVGFibGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QocmVxdWVzdC50YWJsZSk7XG5cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtyZXF1ZXN0LnRhYmxlXSBhcyBUYWJsZVR5cGU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgW3JlcXVlc3QudGFibGVdOiBjb3B5KHRhYmxlKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX3dyaXRlKHJlcXVlc3Q6IHsgZGF0YTogUmxqc29uIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhZGRlZERhdGEgPSBoc2gocmVxdWVzdC5kYXRhKTtcbiAgICB0aGlzLl9yZW1vdmVOdWxsVmFsdWVzKGFkZGVkRGF0YSk7XG4gICAgY29uc3QgdGFibGVzID0gT2JqZWN0LmtleXMoYWRkZWREYXRhKTtcbiAgICBoc2goYWRkZWREYXRhKTtcblxuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVzRG9Ob3RFeGlzdChyZXF1ZXN0LmRhdGEpO1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVEYXRhRG9lc05vdE1hdGNoQ2ZnKHJlcXVlc3QuZGF0YSk7XG5cbiAgICBmb3IgKGNvbnN0IHRhYmxlIG9mIHRhYmxlcykge1xuICAgICAgaWYgKHRhYmxlLnN0YXJ0c1dpdGgoJ18nKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2xkVGFibGUgPSB0aGlzLl9tZW1bdGFibGVdIGFzIFRhYmxlVHlwZTtcbiAgICAgIGNvbnN0IG5ld1RhYmxlID0gYWRkZWREYXRhW3RhYmxlXSBhcyBUYWJsZVR5cGU7XG5cbiAgICAgIC8vIFRhYmxlIGV4aXN0cy4gTWVyZ2UgZGF0YVxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG5ld1RhYmxlLl9kYXRhKSB7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBpdGVtLl9oYXNoO1xuICAgICAgICBjb25zdCBleGlzdHMgPSBvbGRUYWJsZS5fZGF0YS5maW5kKChpKSA9PiBpLl9oYXNoID09PSBoYXNoKTtcbiAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICBvbGRUYWJsZS5fZGF0YS5wdXNoKGl0ZW0gYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9pb1Rvb2xzLnNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKG9sZFRhYmxlKTtcbiAgICB9XG5cbiAgICAvLyBSZWNhbGMgbWFpbiBoYXNoZXNcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfcmVhZFJvd3MocmVxdWVzdDoge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgd2hlcmU6IHsgW2NvbHVtbjogc3RyaW5nXTogSnNvblZhbHVlIH07XG4gIH0pOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QocmVxdWVzdC50YWJsZSk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5Db2x1bW5Eb2VzTm90RXhpc3QoXG4gICAgICByZXF1ZXN0LnRhYmxlLFxuICAgICAgT2JqZWN0LmtleXMocmVxdWVzdC53aGVyZSksXG4gICAgKTtcblxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgIGNvbnN0IHJlc3VsdDogUmxqc29uID0ge1xuICAgICAgW3JlcXVlc3QudGFibGVdOiB7XG4gICAgICAgIF9kYXRhOiB0YWJsZS5fZGF0YS5maWx0ZXIoKHJvdykgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3QgY29sdW1uIGluIHJlcXVlc3Qud2hlcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSByb3dbY29sdW1uXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSByZXF1ZXN0LndoZXJlW2NvbHVtbl07XG4gICAgICAgICAgICBpZiAoYiA9PT0gbnVsbCAmJiBhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZXF1YWxzKGEsIGIpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9IGFzIGFueTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBfcmVtb3ZlTnVsbFZhbHVlcyhybGpzb246IFJsanNvbikge1xuICAgIGl0ZXJhdGVUYWJsZXNTeW5jKHJsanNvbiwgKHRhYmxlKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gcmxqc29uW3RhYmxlXS5fZGF0YTtcblxuICAgICAgZm9yIChjb25zdCByb3cgb2YgZGF0YSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiByb3cpIHtcbiAgICAgICAgICBpZiAocm93W2tleV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIGRlbGV0ZSByb3dba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IElvLCBJb01lbSB9IGZyb20gJy4vaW5kZXgudHMnO1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBJbyBpbXBsZW1lbnRhdGlvbiBuZWVkIHRvIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSB0byBiZSB1c2VkIGluXG4gKiBjb25mb3JtYW5jZSB0ZXN0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJb1Rlc3RTZXR1cCB7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgaW8gaW1wbGVtZW50YXRpb24uXG4gICAqIEByZXR1cm5zIFRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICovXG4gIGluaXQ6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRlYXJzIGRvd24gdGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcmV0dXJucyBUaGUgaW8gaW1wbGVtZW50YXRpb24uXG4gICAqL1xuICB0ZWFyRG93bjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGlvIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQgaW4gdGhlIGNvbmZvcm1hbmNlIHRlc3RzLlxuICAgKi9cbiAgaW86IElvO1xufVxuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLy8gRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSW9UZXN0U2V0dXAgaW50ZXJmYWNlXG5leHBvcnQgY29uc3QgZXhhbXBsZVRlc3RTZXR1cCA9ICgpOiBJb1Rlc3RTZXR1cCA9PiB7XG4gIHJldHVybiB7XG4gICAgaW86IG5ldyBJb01lbSgpLFxuICAgIGluaXQ6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIGlvIGltcGxlbWVudGF0aW9uXG4gICAgfSxcbiAgICB0ZWFyRG93bjogYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gVGVhciBkb3duIHRoZSBpbyBpbXBsZW1lbnRhdGlvblxuICAgIH0sXG4gIH07XG59O1xuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IEpzb25WYWx1ZSB9IGZyb20gJ0BybGpzb24vanNvbic7XG5pbXBvcnQgeyBSbGpzb24sIFRhYmxlQ2ZnLCBUYWJsZUtleSB9IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmV4cG9ydCBpbnRlcmZhY2UgSW8ge1xuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gR2VuZXJhbFxuXG4gIC8qKiBTdGFydHMgdGhlIGluaXRpYWxpemF0aW9uICovXG4gIGluaXQoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKiogQ2xvc2VzIHRoZSBpbyAqL1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgaW8gaXMgb3BlbmVkICovXG4gIGlzT3BlbjogYm9vbGVhbjtcblxuICAvKiogQSBwcm9taXNlIHJlc29sdmluZyBvbmNlIHRoZSBJbyBpbnRlcmZhY2UgaXMgcmVhZHlcbiAgICpcbiAgICog8J+SoSBVc2UgQHJsanNvbi9pcy1yZWFkeVxuICAgKi9cbiAgaXNSZWFkeSgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBEdW1wXG5cbiAgLyoqIFJldHVybnMgdGhlIGNvbXBsZXRlIGRiIGNvbnRlbnQgYXMgUmxqc29uICovXG4gIGR1bXAoKTogUHJvbWlzZTxSbGpzb24+O1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBkdW1wIG9mIGEgY29tcGxldGUgdGFibGUgKi9cbiAgZHVtcFRhYmxlKHJlcXVlc3Q6IHsgdGFibGU6IHN0cmluZyB9KTogUHJvbWlzZTxSbGpzb24+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBUYWJsZXNcblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0YWJsZSBleGlzdHNcbiAgICovXG4gIHRhYmxlRXhpc3RzKHRhYmxlS2V5OiBUYWJsZUtleSk6IFByb21pc2U8Ym9vbGVhbj47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0YWJsZSB3aXRoIGEgZ2l2ZW4gY29uZmlnLlxuICAgKiBJZiB0aGUgdGFibGUgYWxyZWFkeSBleGlzdHMsIG5ldyBjb2x1bW5zIGFyZSBhZGRlZCB0byB0aGUgZXhpc3RpbmcgdGFibGUuXG4gICAqIElmIHRoZSB0YWJsZSBkb2VzIG5vdCBleGlzdCwgaXQgaXMgY3JlYXRlZCB3aXRoIHRoZSBnaXZlbiBjb25maWcuXG4gICAqIElmIHRoZSB0YWJsZSBleGlzdHMgYW5kIGNvbHVtbnMgYXJlIHJlbW92ZWQsIGFuIGVycm9yIGlzIHRocm93bi5cbiAgICogSWYgdGhlIHRhYmxlIGV4aXN0cyBhbmQgdGhlIGNvbHVtbiB0eXBlIGlzIGNoYW5nZWQsIGFuIGVycm9yIGlzIHRocm93bi5cbiAgICovXG4gIGNyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdDogeyB0YWJsZUNmZzogVGFibGVDZmcgfSk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBqc29uIHN0cnVjdHVyZSByZXR1cm5pbmcgY3VycmVudCB0YWJsZSBjb25maWd1cmF0aW9uc1xuICAgKi9cbiAgcmF3VGFibGVDZmdzKCk6IFByb21pc2U8VGFibGVDZmdbXT47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFdyaXRlXG5cbiAgLyoqIFdyaXRlcyBSbGpzb24gZGF0YSBpbnRvIHRoZSBkYXRhYmFzZSAqL1xuICB3cml0ZShyZXF1ZXN0OiB7IGRhdGE6IFJsanNvbiB9KTogUHJvbWlzZTx2b2lkPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUmVhZCByb3dzXG5cbiAgLyoqIFF1ZXJpZXMgYSBsaXN0IG9mIHJvd3MgKi9cbiAgcmVhZFJvd3MocmVxdWVzdDoge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgd2hlcmU6IHsgW2NvbHVtbjogc3RyaW5nXTogSnNvblZhbHVlIHwgbnVsbCB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+O1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgZ2l2ZW4gdGFibGUgKi9cbiAgcm93Q291bnQodGFibGU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmV4cG9ydCBjb25zdCBleGFtcGxlSW8gPVxuICAnQ2hlY2tvdXQgQHJsanNvbi9pby1tZW0gZm9yIGFuIGV4YW1wbGUgaW1wbGVtZW50YXRpb24nO1xuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IEpzb24gfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHtcbiAgQnVmZmV0LFxuICBDYWtlLFxuICBpdGVyYXRlVGFibGVzU3luYyxcbiAgTGF5ZXIsXG4gIFJlZixcbiAgUmxqc29uLFxuICBUYWJsZUtleSxcbn0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBEZXNjcmliZXMgYSByb3cgdGhhdCByZWZlcmVuY2VzIGEgY2hpbGQgdGFibGUgcm93XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyZW50UmVmIHtcbiAgLyoqXG4gICAqIFRoZSBwYXJlbnQgdGFibGUgdGhhdCByZWZlcmVuY2VzIHRoZSBjaGlsZCB0YWJsZVxuICAgKi9cbiAgW3BhcmVudFRhYmxlOiBUYWJsZUtleV06IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFyZW50IHJvdyB0aGF0IHJlZmVyZW5jZXMgdGhlIGNoaWxkIHJvd1xuICAgICAqL1xuICAgIFtwYXJlbnRSb3c6IFJlZl06IHtcbiAgICAgIC8qKlxuICAgICAgICogRGV0YWlscyBhYm91dCB0aGUgcmVmZXJlbmNlLCBlLmcuIGFuIGFycmF5IGluZGV4IGV0Yy5cbiAgICAgICAqL1xuICAgICAgZGV0YWlscz86IEpzb247XG4gICAgfTtcbiAgfTtcbn1cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBwYXJlbnQgdGFibGUgcm93cyByZWZlcmVuY2luZyBhIGNoaWxkIHRhYmxlIHJvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldmVyc2VSZWZzIHtcbiAgLyoqXG4gICAqIFRoZSBjaGlsZCB0YWJsZSB3ZSBuZWVkIHRoZSByZWZlcmVuY2luZyByb3dzIGZvclxuICAgKi9cbiAgW2NoaWxkVGFibGU6IFRhYmxlS2V5XToge1xuICAgIC8qKlxuICAgICAqIFRoZSByb3cgaGFzaHdlIG5lZWQgdGhlIHJlZmVyZW5jaW5nIHJvd3MgZm9yXG4gICAgICovXG4gICAgW2NoaWxkUm93OiBSZWZdOiBQYXJlbnRSZWY7XG4gIH07XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAqL1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSByZXZlcnNlIHJlZmVyZW5jZXMgZm9yIGEgZ2l2ZW4gcmxqc29uIG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgY2FsY1JldmVyc2VSZWZzID0gKHJsanNvbjogUmxqc29uKTogUmV2ZXJzZVJlZnMgPT4ge1xuICBjb25zdCByZXN1bHQ6IFJldmVyc2VSZWZzID0ge307XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBQcmVwYXJlIGRhdGEgc3RydWN0dXJlXG4gIGl0ZXJhdGVUYWJsZXNTeW5jKHJsanNvbiwgKGNoaWxkVGFibGVLZXksIHRhYmxlKSA9PiB7XG4gICAgY29uc3QgY2hpbGRUYWJsZTogeyBbY2hpbGRSb3dIYXNoOiBzdHJpbmddOiBQYXJlbnRSZWYgfSA9IHt9O1xuICAgIHJlc3VsdFtjaGlsZFRhYmxlS2V5XSA9IGNoaWxkVGFibGU7XG4gICAgZm9yIChjb25zdCBjaGlsZFJvdyBvZiB0YWJsZS5fZGF0YSkge1xuICAgICAgY2hpbGRUYWJsZVtjaGlsZFJvdy5faGFzaF0gPSB7fTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gR2VuZXJhdGUgcmV2ZXJzZSByZWZlcmVuY2VzXG4gIGl0ZXJhdGVUYWJsZXNTeW5jKHJsanNvbiwgKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZSkgPT4ge1xuICAgIC8vIEl0ZXJhdGUgYWxsIHJvd3Mgb2YgZWFjaCB0YWJsZVxuICAgIGZvciAoY29uc3QgcGFyZW50VGFibGVSb3cgb2YgcGFyZW50VGFibGUuX2RhdGEpIHtcbiAgICAgIC8vIEZpbmQgb3V0IHdoZSBvdGhlciB0YWJsZXMgJiByb3dzIGFyZSByZWZlcmVuY2VkIGJ5IHRoaXMgcm93XG4gICAgICAvLyBXcml0ZSB0aGVzZSBpbmZvcm1hdGlvbiBpbnR0byByZXN1bHRcbiAgICAgIHN3aXRjaCAocGFyZW50VGFibGUuX3R5cGUpIHtcbiAgICAgICAgY2FzZSAnaW5ncmVkaWVudHMnOlxuICAgICAgICAgIF93cml0ZUluZ3JlZGllbnRSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdsYXllcnMnOiB7XG4gICAgICAgICAgX3dyaXRlTGF5ZXJSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3NsaWNlSWRzJzoge1xuICAgICAgICAgIC8vIFNsaWNlIGlkcyBkbyBub3QgcmVmZXJlbmNlIG90aGVyIHRhYmxlc1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnY2FrZXMnOiB7XG4gICAgICAgICAgX3dyaXRlQ2FrZVJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnYnVmZmV0cyc6IHtcbiAgICAgICAgICBfd3JpdGVCdWZmZXRSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qIHY4IGlnbm9yZSBlbmQgKi9cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUluZ3JlZGllbnRSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IEpzb24sXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBwYXJlbnRDb2x1bW5OYW1lIGluIHBhcmVudFJvdykge1xuICAgIGlmIChwYXJlbnRDb2x1bW5OYW1lLnN0YXJ0c1dpdGgoJ18nKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnRDb2x1bW5OYW1lLmVuZHNXaXRoKCdSZWYnKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBwYXJlbnRDb2x1bW5OYW1lLnNsaWNlKDAsIC0zKTtcbiAgICBjb25zdCBjaGlsZFJvd0hhc2ggPSBwYXJlbnRSb3dbcGFyZW50Q29sdW1uTmFtZV0gYXMgc3RyaW5nO1xuXG4gICAgX3dyaXRlKFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRUYWJsZU5hbWUsXG4gICAgICBjaGlsZFJvd0hhc2gsXG4gICAgICBwYXJlbnRUYWJsZU5hbWUsXG4gICAgICBwYXJlbnRSb3dIYXNoLFxuICAgICk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVMYXllclJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogTGF5ZXIsXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBwYXJlbnRSb3cuaW5ncmVkaWVudHNUYWJsZTtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBzbGljZUlkIGluIHBhcmVudFJvdy5hc3NpZ24pIHtcbiAgICBpZiAoc2xpY2VJZC5zdGFydHNXaXRoKCdfJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNsaWNlSGFzaCA9IHBhcmVudFJvdy5hc3NpZ25bc2xpY2VJZF0gYXMgc3RyaW5nO1xuXG4gICAgX3dyaXRlKHJlc3VsdCwgY2hpbGRUYWJsZU5hbWUsIHNsaWNlSGFzaCwgcGFyZW50VGFibGVOYW1lLCBwYXJlbnRSb3dIYXNoKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUNha2VSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IENha2UsXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBsYXllciBpbiBwYXJlbnRSb3cubGF5ZXJzKSB7XG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBwYXJlbnRSb3cubGF5ZXJzVGFibGU7XG4gICAgY29uc3QgY2hpbGRSb3dIYXNoID0gcGFyZW50Um93LmxheWVyc1tsYXllcl0gYXMgc3RyaW5nO1xuICAgIF93cml0ZShcbiAgICAgIHJlc3VsdCxcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxuICAgICAgY2hpbGRSb3dIYXNoLFxuICAgICAgcGFyZW50VGFibGVOYW1lLFxuICAgICAgcGFyZW50Um93SGFzaCxcbiAgICApO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlQnVmZmV0UmVmcyA9IChcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcbiAgcGFyZW50Um93OiBCdWZmZXQsXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBpdGVtIG9mIHBhcmVudFJvdy5pdGVtcykge1xuICAgIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gaXRlbS50YWJsZTtcbiAgICBjb25zdCBjaGlsZFJvd0hhc2ggPSBpdGVtLnJlZjtcbiAgICBfd3JpdGUoXG4gICAgICByZXN1bHQsXG4gICAgICBjaGlsZFRhYmxlTmFtZSxcbiAgICAgIGNoaWxkUm93SGFzaCxcbiAgICAgIHBhcmVudFRhYmxlTmFtZSxcbiAgICAgIHBhcmVudFJvd0hhc2gsXG4gICAgKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZSA9IChcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbiAgY2hpbGRUYWJsZU5hbWU6IHN0cmluZyxcbiAgY2hpbGRSb3dIYXNoOiBzdHJpbmcsXG4gIHBhcmVudFRhYmxlTmFtZTogc3RyaW5nLFxuICBwYXJlbnRSb3dIYXNoOiBzdHJpbmcsXG4pID0+IHtcbiAgY29uc3QgcmVmZXJlbmNlc0ZvckNoaWxkVGFibGUgPSAocmVzdWx0W2NoaWxkVGFibGVOYW1lXSA/Pz0ge30pO1xuICBjb25zdCByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVJvdyA9IChyZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVtjaGlsZFJvd0hhc2hdID8/PVxuICAgIHt9KTtcblxuICByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVJvd1twYXJlbnRUYWJsZU5hbWVdID8/PSB7fTtcbiAgcmVmZXJlbmNlc0ZvckNoaWxkVGFibGVSb3dbcGFyZW50VGFibGVOYW1lXVtwYXJlbnRSb3dIYXNoXSA/Pz0ge307XG59O1xuIl0sIm5hbWVzIjpbImUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQXVCTyxNQUFNLFdBQU4sTUFBTSxTQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtu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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rljson/io",
3
- "version": "0.0.35",
3
+ "version": "0.0.37",
4
4
  "packageManager": "pnpm@10.9.0",
5
5
  "description": "Low level interface for reading and writing RLJSON data",
6
6
  "homepage": "https://github.com/rljson/io",
@@ -35,7 +35,7 @@
35
35
  "@vitest/coverage-v8": "^3.1.3",
36
36
  "cross-env": "^7.0.3",
37
37
  "eslint": "^9.26.0",
38
- "eslint-plugin-jsdoc": "^50.6.14",
38
+ "eslint-plugin-jsdoc": "^50.6.17",
39
39
  "eslint-plugin-tsdoc": "^0.4.0",
40
40
  "globals": "^16.1.0",
41
41
  "jsdoc": "^4.0.4",