@shaxpir/squilt 1.0.0 → 1.1.0

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.
Files changed (68) hide show
  1. package/README.md +289 -1
  2. package/dist/ast/AlterTableQuery.d.ts +32 -0
  3. package/dist/ast/AlterTableQuery.js +60 -0
  4. package/dist/ast/BetweenExpression.d.ts +10 -0
  5. package/dist/ast/BetweenExpression.js +18 -0
  6. package/dist/ast/CastExpression.d.ts +13 -0
  7. package/dist/ast/CastExpression.js +25 -0
  8. package/dist/ast/CollateExpression.d.ts +18 -0
  9. package/dist/ast/CollateExpression.js +30 -0
  10. package/dist/ast/CreateIndexQuery.d.ts +25 -0
  11. package/dist/ast/CreateIndexQuery.js +64 -0
  12. package/dist/ast/CreateTableQuery.d.ts +57 -0
  13. package/dist/ast/CreateTableQuery.js +79 -0
  14. package/dist/ast/CreateViewQuery.d.ts +34 -0
  15. package/dist/ast/CreateViewQuery.js +61 -0
  16. package/dist/ast/CreateVirtualTableQuery.d.ts +32 -0
  17. package/dist/ast/CreateVirtualTableQuery.js +74 -0
  18. package/dist/ast/DeleteQuery.d.ts +17 -0
  19. package/dist/ast/DeleteQuery.js +43 -0
  20. package/dist/ast/DropIndexQuery.d.ts +14 -0
  21. package/dist/ast/DropIndexQuery.js +35 -0
  22. package/dist/ast/DropTableQuery.d.ts +14 -0
  23. package/dist/ast/DropTableQuery.js +35 -0
  24. package/dist/ast/DropViewQuery.d.ts +11 -0
  25. package/dist/ast/DropViewQuery.js +24 -0
  26. package/dist/ast/FunctionExpression.d.ts +21 -0
  27. package/dist/ast/FunctionExpression.js +40 -1
  28. package/dist/ast/FunctionName.d.ts +1 -1
  29. package/dist/ast/FunctionName.js +1 -1
  30. package/dist/ast/InsertQuery.d.ts +24 -1
  31. package/dist/ast/InsertQuery.js +49 -1
  32. package/dist/ast/Operator.d.ts +2 -0
  33. package/dist/ast/Operator.js +3 -1
  34. package/dist/ast/SelectQuery.d.ts +4 -0
  35. package/dist/ast/SelectQuery.js +11 -1
  36. package/dist/ast/SubqueryExpression.d.ts +18 -0
  37. package/dist/ast/SubqueryExpression.js +27 -0
  38. package/dist/ast/UpdateQuery.d.ts +24 -0
  39. package/dist/ast/UpdateQuery.js +51 -0
  40. package/dist/ast/WindowExpression.d.ts +51 -0
  41. package/dist/ast/WindowExpression.js +61 -0
  42. package/dist/ast/WindowSpecification.d.ts +46 -0
  43. package/dist/ast/WindowSpecification.js +60 -0
  44. package/dist/builder/QueryBuilder.d.ts +20 -0
  45. package/dist/builder/QueryBuilder.js +41 -1
  46. package/dist/builder/Shorthand.d.ts +51 -0
  47. package/dist/builder/Shorthand.js +125 -1
  48. package/dist/index.d.ts +17 -1
  49. package/dist/index.js +59 -3
  50. package/dist/renderer/CompactQueryRenderer.d.ts +34 -2
  51. package/dist/renderer/CompactQueryRenderer.js +272 -2
  52. package/dist/renderer/IndentedQueryRenderer.d.ts +34 -2
  53. package/dist/renderer/IndentedQueryRenderer.js +289 -3
  54. package/dist/renderer/QueryRenderer.d.ts +11 -1
  55. package/dist/renderer/QueryRenderer.js +1 -1
  56. package/dist/validate/CommonQueryValidator.d.ts +31 -1
  57. package/dist/validate/CommonQueryValidator.js +253 -4
  58. package/dist/validate/QueryValidator.d.ts +10 -1
  59. package/dist/validate/QueryValidator.js +1 -1
  60. package/dist/validate/SQLiteQueryValidator.d.ts +16 -1
  61. package/dist/validate/SQLiteQueryValidator.js +32 -3
  62. package/dist/visitor/ParamCollector.d.ts +30 -0
  63. package/dist/visitor/ParamCollector.js +109 -2
  64. package/dist/visitor/QueryIdentityTransformer.d.ts +30 -0
  65. package/dist/visitor/QueryIdentityTransformer.js +217 -2
  66. package/dist/visitor/SqlTreeNodeVisitor.d.ts +30 -0
  67. package/dist/visitor/SqlTreeNodeVisitor.js +1 -1
  68. package/package.json +4 -1
@@ -1,14 +1,29 @@
1
1
  import { AliasableExpression } from "../ast/Abstractions";
2
2
  import { Alias } from "../ast/Alias";
3
+ import { AlterTableQuery } from "../ast/AlterTableQuery";
4
+ import { BetweenExpression } from "../ast/BetweenExpression";
3
5
  import { BinaryExpression } from "../ast/BinaryExpression";
4
6
  import { CaseExpression } from "../ast/CaseExpression";
7
+ import { CastExpression } from "../ast/CastExpression";
8
+ import { CollateExpression } from "../ast/CollateExpression";
9
+ import { SubqueryExpression } from "../ast/SubqueryExpression";
10
+ import { WindowExpression } from "../ast/WindowExpression";
5
11
  import { Column } from "../ast/Column";
6
12
  import { Concat } from "../ast/Concat";
13
+ import { CreateIndexQuery } from "../ast/CreateIndexQuery";
14
+ import { CreateTableQuery } from "../ast/CreateTableQuery";
15
+ import { CreateVirtualTableQuery } from "../ast/CreateVirtualTableQuery";
16
+ import { CreateViewQuery } from "../ast/CreateViewQuery";
17
+ import { DeleteQuery } from "../ast/DeleteQuery";
18
+ import { DropIndexQuery } from "../ast/DropIndexQuery";
19
+ import { DropTableQuery } from "../ast/DropTableQuery";
20
+ import { DropViewQuery } from "../ast/DropViewQuery";
7
21
  import { ExistsExpression } from "../ast/ExistsExpression";
8
22
  import { From, JsonEachFrom, SubqueryFrom, TableFrom } from "../ast/From";
9
23
  import { FunctionExpression } from "../ast/FunctionExpression";
10
24
  import { InExpression } from "../ast/InExpression";
11
25
  import { InsertQuery } from "../ast/InsertQuery";
26
+ import { UpdateQuery } from "../ast/UpdateQuery";
12
27
  import { Join } from "../ast/Join";
13
28
  import { NullLiteral, NumberLiteral, Param, StringLiteral } from "../ast/Literals";
14
29
  import { OrderBy } from "../ast/OrderBy";
@@ -22,11 +37,21 @@ export declare class CommonQueryValidator implements QueryValidator, SqlTreeNode
22
37
  protected columnLikeAcceptor: ColumnLikeVisitorAcceptor<void>;
23
38
  private columnCount;
24
39
  private isGrouped;
25
- validate(query: SelectQuery | InsertQuery): void;
40
+ validate(query: SelectQuery | InsertQuery | UpdateQuery | DeleteQuery | CreateTableQuery | CreateVirtualTableQuery | CreateIndexQuery | CreateViewQuery | AlterTableQuery | DropTableQuery | DropIndexQuery | DropViewQuery): void;
26
41
  protected reset(): void;
27
42
  private validateAlias;
28
43
  private validateIdentifier;
29
44
  visitInsertQuery(node: InsertQuery): void;
45
+ visitDeleteQuery(node: DeleteQuery): void;
46
+ visitUpdateQuery(node: UpdateQuery): void;
47
+ visitDropTableQuery(node: DropTableQuery): void;
48
+ visitDropIndexQuery(node: DropIndexQuery): void;
49
+ visitDropViewQuery(node: DropViewQuery): void;
50
+ visitCreateViewQuery(node: CreateViewQuery): void;
51
+ visitCreateIndexQuery(node: CreateIndexQuery): void;
52
+ visitAlterTableQuery(node: AlterTableQuery): void;
53
+ visitCreateTableQuery(node: CreateTableQuery): void;
54
+ visitCreateVirtualTableQuery(node: CreateVirtualTableQuery): void;
30
55
  visitSelectQuery(node: SelectQuery): void;
31
56
  visitTableFrom(node: TableFrom): void;
32
57
  visitSubqueryFrom(node: SubqueryFrom): void;
@@ -37,10 +62,15 @@ export declare class CommonQueryValidator implements QueryValidator, SqlTreeNode
37
62
  visitOrderBy(node: OrderBy): void;
38
63
  visitWithClause(node: With): void;
39
64
  visitBinaryExpression(node: BinaryExpression): void;
65
+ visitBetweenExpression(node: BetweenExpression): void;
40
66
  visitUnaryExpression(node: UnaryExpression): void;
41
67
  visitInExpression(node: InExpression): void;
42
68
  visitConcat(node: Concat): void;
43
69
  visitCaseExpression(node: CaseExpression): void;
70
+ visitCastExpression(node: CastExpression): void;
71
+ visitCollateExpression(node: CollateExpression): void;
72
+ visitSubqueryExpression(node: SubqueryExpression): void;
73
+ visitWindowExpression(node: WindowExpression): void;
44
74
  visitFunctionExpression(node: FunctionExpression): void;
45
75
  visitParamExpression(_node: Param): void;
46
76
  visitStringLiteral(node: StringLiteral): void;
@@ -50,11 +50,195 @@ class CommonQueryValidator {
50
50
  if (node['_columns'].length === 0) {
51
51
  throw new Error('InsertQuery must specify at least one column');
52
52
  }
53
- if (node['_columns'].length !== node['_values'].length) {
54
- throw new Error('InsertQuery must have the same number of columns and values');
53
+ if (node['_fromSelect']) {
54
+ // INSERT ... SELECT - validate the subquery
55
+ if (node['_values'].length > 0) {
56
+ throw new Error('InsertQuery cannot have both VALUES and SELECT');
57
+ }
58
+ node['_fromSelect'].accept(this);
59
+ }
60
+ else {
61
+ // INSERT ... VALUES - validate column/value count match
62
+ if (node['_columns'].length !== node['_values'].length) {
63
+ throw new Error('InsertQuery must have the same number of columns and values');
64
+ }
65
+ node['_values'].forEach(val => val.accept(this));
55
66
  }
56
67
  node['_columns'].forEach(col => this.validateIdentifier(col, 'InsertQuery column'));
57
- node['_values'].forEach(val => val.accept(this));
68
+ // Validate ON CONFLICT clause
69
+ if (node['_onConflictColumns'].length > 0) {
70
+ // Cannot use both OR REPLACE and ON CONFLICT
71
+ if (node['_orReplace']) {
72
+ throw new Error('InsertQuery cannot use both OR REPLACE and ON CONFLICT');
73
+ }
74
+ // Must have either DO UPDATE or DO NOTHING
75
+ if (!node['_doNothing'] && node['_doUpdateSets'].length === 0) {
76
+ throw new Error('ON CONFLICT must specify either DO UPDATE or DO NOTHING');
77
+ }
78
+ // Cannot have both DO UPDATE and DO NOTHING
79
+ if (node['_doNothing'] && node['_doUpdateSets'].length > 0) {
80
+ throw new Error('ON CONFLICT cannot have both DO UPDATE and DO NOTHING');
81
+ }
82
+ node['_onConflictColumns'].forEach(col => this.validateIdentifier(col, 'ON CONFLICT column'));
83
+ node['_doUpdateSets'].forEach(s => {
84
+ this.validateIdentifier(s.column, 'DO UPDATE column');
85
+ s.value.accept(this);
86
+ });
87
+ if (node['_onConflictWhere']) {
88
+ node['_onConflictWhere'].accept(this);
89
+ }
90
+ }
91
+ else {
92
+ // If no conflict columns but has DO UPDATE or DO NOTHING, that's an error
93
+ if (node['_doNothing'] || node['_doUpdateSets'].length > 0) {
94
+ throw new Error('DO UPDATE or DO NOTHING requires ON CONFLICT columns');
95
+ }
96
+ }
97
+ node['_returning'].forEach(r => r.accept(this));
98
+ }
99
+ visitDeleteQuery(node) {
100
+ this.validateIdentifier(node['_tableName'], 'DeleteQuery');
101
+ if (node['_where']) {
102
+ node['_where'].accept(this);
103
+ }
104
+ node['_returning'].forEach(r => r.accept(this));
105
+ }
106
+ visitUpdateQuery(node) {
107
+ this.validateIdentifier(node['_tableName'], 'UpdateQuery');
108
+ if (node['_set'].length === 0) {
109
+ throw new Error('UpdateQuery must have at least one SET clause');
110
+ }
111
+ node['_set'].forEach(s => {
112
+ this.validateIdentifier(s.column, 'UpdateQuery column');
113
+ s.value.accept(this);
114
+ });
115
+ if (node['_where']) {
116
+ node['_where'].accept(this);
117
+ }
118
+ node['_returning'].forEach(r => r.accept(this));
119
+ }
120
+ visitDropTableQuery(node) {
121
+ this.validateIdentifier(node.tableName, 'DropTableQuery');
122
+ }
123
+ visitDropIndexQuery(node) {
124
+ this.validateIdentifier(node.indexName, 'DropIndexQuery');
125
+ }
126
+ visitDropViewQuery(node) {
127
+ this.validateIdentifier(node.viewName, 'DropViewQuery');
128
+ }
129
+ visitCreateViewQuery(node) {
130
+ this.validateIdentifier(node.viewName, 'CreateViewQuery view name');
131
+ for (const col of node.columns) {
132
+ this.validateIdentifier(col, 'CreateViewQuery column name');
133
+ }
134
+ if (!node.selectQuery) {
135
+ throw new Error('CreateViewQuery must have a SELECT query');
136
+ }
137
+ node.selectQuery.accept(this);
138
+ }
139
+ visitCreateIndexQuery(node) {
140
+ this.validateIdentifier(node.indexName, 'CreateIndexQuery index name');
141
+ this.validateIdentifier(node.tableName, 'CreateIndexQuery table name');
142
+ if (node.columns.length === 0) {
143
+ throw new Error('CreateIndexQuery must have at least one column');
144
+ }
145
+ for (const col of node.columns) {
146
+ this.validateIdentifier(col, 'CreateIndexQuery column');
147
+ }
148
+ if (node.whereExpression) {
149
+ node.whereExpression.accept(this);
150
+ }
151
+ }
152
+ visitAlterTableQuery(node) {
153
+ this.validateIdentifier(node.tableName, 'AlterTableQuery table name');
154
+ const op = node.operation;
155
+ if (!op) {
156
+ throw new Error('AlterTableQuery must have an operation');
157
+ }
158
+ switch (op.type) {
159
+ case 'ADD_COLUMN':
160
+ this.validateIdentifier(op.column.name, 'AlterTableQuery column name');
161
+ if (op.column.constraints.check) {
162
+ op.column.constraints.check.accept(this);
163
+ }
164
+ if (op.column.constraints.references) {
165
+ this.validateIdentifier(op.column.constraints.references.table, 'Foreign key reference table');
166
+ this.validateIdentifier(op.column.constraints.references.column, 'Foreign key reference column');
167
+ }
168
+ break;
169
+ case 'RENAME_COLUMN':
170
+ this.validateIdentifier(op.oldName, 'AlterTableQuery old column name');
171
+ this.validateIdentifier(op.newName, 'AlterTableQuery new column name');
172
+ break;
173
+ case 'DROP_COLUMN':
174
+ this.validateIdentifier(op.columnName, 'AlterTableQuery column name');
175
+ break;
176
+ case 'RENAME_TABLE':
177
+ this.validateIdentifier(op.newTableName, 'AlterTableQuery new table name');
178
+ break;
179
+ }
180
+ }
181
+ visitCreateTableQuery(node) {
182
+ this.validateIdentifier(node.tableName, 'CreateTableQuery');
183
+ if (node.columns.length === 0) {
184
+ throw new Error('CreateTableQuery must have at least one column');
185
+ }
186
+ const columnNames = new Set();
187
+ for (const col of node.columns) {
188
+ this.validateIdentifier(col.name, 'Column');
189
+ if (columnNames.has(col.name.toLowerCase())) {
190
+ throw new Error(`Duplicate column name '${col.name}' in CreateTableQuery`);
191
+ }
192
+ columnNames.add(col.name.toLowerCase());
193
+ // Validate check constraint expression
194
+ if (col.constraints.check) {
195
+ col.constraints.check.accept(this);
196
+ }
197
+ // Validate references table name
198
+ if (col.constraints.references) {
199
+ this.validateIdentifier(col.constraints.references.table, 'Foreign key reference table');
200
+ this.validateIdentifier(col.constraints.references.column, 'Foreign key reference column');
201
+ }
202
+ // Validate AUTOINCREMENT is only used with INTEGER PRIMARY KEY
203
+ if (col.constraints.autoIncrement && !col.constraints.primaryKey) {
204
+ throw new Error('AUTOINCREMENT can only be used with PRIMARY KEY');
205
+ }
206
+ if (col.constraints.autoIncrement && col.type !== 'INTEGER') {
207
+ throw new Error('AUTOINCREMENT can only be used with INTEGER type');
208
+ }
209
+ }
210
+ // Validate table constraints
211
+ for (const constraint of node.tableConstraints) {
212
+ if (constraint.name) {
213
+ this.validateIdentifier(constraint.name, 'Constraint name');
214
+ }
215
+ if (constraint.columns) {
216
+ for (const colName of constraint.columns) {
217
+ this.validateIdentifier(colName, 'Constraint column');
218
+ if (!columnNames.has(colName.toLowerCase())) {
219
+ throw new Error(`Constraint references unknown column '${colName}'`);
220
+ }
221
+ }
222
+ }
223
+ if (constraint.references) {
224
+ this.validateIdentifier(constraint.references.table, 'Foreign key reference table');
225
+ this.validateIdentifier(constraint.references.column, 'Foreign key reference column');
226
+ }
227
+ if (constraint.check) {
228
+ constraint.check.accept(this);
229
+ }
230
+ }
231
+ }
232
+ visitCreateVirtualTableQuery(node) {
233
+ this.validateIdentifier(node.tableName, 'CreateVirtualTableQuery');
234
+ // Virtual tables are database-specific, validated by dialect validators
235
+ // Basic validation: must have at least one column for FTS5
236
+ if (node.columns.length === 0) {
237
+ throw new Error('CreateVirtualTableQuery must have at least one column');
238
+ }
239
+ for (const col of node.columns) {
240
+ this.validateIdentifier(col, 'FTS5 column');
241
+ }
58
242
  }
59
243
  visitSelectQuery(node) {
60
244
  if (node['_columns'].length > 0 && node['_fromsAndJoins'].length === 0) {
@@ -94,6 +278,40 @@ class CommonQueryValidator {
94
278
  }
95
279
  }
96
280
  }
281
+ if (node['_intersect'].length > 0) {
282
+ if (node['_columns'].length === 0 && node['_fromsAndJoins'].length === 0) {
283
+ throw new Error("A query with INTERSECT subqueries must have columns and a FROM clause in the main query");
284
+ }
285
+ let columnCounts = [];
286
+ if (node['_columns'].length > 0) {
287
+ columnCounts.push(node['_columns'].length);
288
+ }
289
+ columnCounts = columnCounts.concat(node['_intersect'].map(i => i['_columns'].length || 1));
290
+ if (columnCounts.length > 1) {
291
+ const firstCount = columnCounts[0];
292
+ if (columnCounts.some(count => count !== firstCount)) {
293
+ throw new Error('INTERSECT queries must have the same number of columns');
294
+ }
295
+ }
296
+ node['_intersect'].forEach(i => i.accept(this));
297
+ }
298
+ if (node['_except'].length > 0) {
299
+ if (node['_columns'].length === 0 && node['_fromsAndJoins'].length === 0) {
300
+ throw new Error("A query with EXCEPT subqueries must have columns and a FROM clause in the main query");
301
+ }
302
+ let columnCounts = [];
303
+ if (node['_columns'].length > 0) {
304
+ columnCounts.push(node['_columns'].length);
305
+ }
306
+ columnCounts = columnCounts.concat(node['_except'].map(e => e['_columns'].length || 1));
307
+ if (columnCounts.length > 1) {
308
+ const firstCount = columnCounts[0];
309
+ if (columnCounts.some(count => count !== firstCount)) {
310
+ throw new Error('EXCEPT queries must have the same number of columns');
311
+ }
312
+ }
313
+ node['_except'].forEach(e => e.accept(this));
314
+ }
97
315
  node['_orderBy'].forEach(o => o.accept(this));
98
316
  if (node['_limit'] !== null && node['_limit'] !== undefined && node['_limit'] < 0) {
99
317
  throw new Error('LIMIT must be non-negative');
@@ -178,6 +396,20 @@ class CommonQueryValidator {
178
396
  node.left.accept(this);
179
397
  node.right.accept(this);
180
398
  }
399
+ visitBetweenExpression(node) {
400
+ if (!node.operand) {
401
+ throw new Error('BetweenExpression must have a valid operand');
402
+ }
403
+ if (!node.low) {
404
+ throw new Error('BetweenExpression must have a valid low bound');
405
+ }
406
+ if (!node.high) {
407
+ throw new Error('BetweenExpression must have a valid high bound');
408
+ }
409
+ node.operand.accept(this);
410
+ node.low.accept(this);
411
+ node.high.accept(this);
412
+ }
181
413
  visitUnaryExpression(node) {
182
414
  if (!node.operator) {
183
415
  throw new Error('UnaryExpression must have a valid operator');
@@ -225,6 +457,23 @@ class CommonQueryValidator {
225
457
  node.else.accept(this);
226
458
  }
227
459
  }
460
+ visitCastExpression(node) {
461
+ node.expression.accept(this);
462
+ }
463
+ visitCollateExpression(node) {
464
+ node.expression.accept(this);
465
+ }
466
+ visitSubqueryExpression(node) {
467
+ node.subquery.accept(this);
468
+ }
469
+ visitWindowExpression(node) {
470
+ // Validate the underlying function
471
+ node.function.accept(this);
472
+ // Validate partition by columns
473
+ node.windowSpec.partitionByColumns.forEach(c => c.accept(this));
474
+ // Validate order by clauses
475
+ node.windowSpec.orderByColumns.forEach(o => o.accept(this));
476
+ }
228
477
  visitFunctionExpression(node) {
229
478
  const noArgFunctions = ['RANDOM'];
230
479
  if (!noArgFunctions.includes(node.name) && node.args.length === 0) {
@@ -259,4 +508,4 @@ class CommonQueryValidator {
259
508
  }
260
509
  }
261
510
  exports.CommonQueryValidator = CommonQueryValidator;
262
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tbW9uUXVlcnlWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmFsaWRhdGUvQ29tbW9uUXVlcnlWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0RBQTBEO0FBSTFELDBDQUF1QztBQUd2QyxzQ0FBMEU7QUFJMUUsc0NBQW1DO0FBR25DLG9EQUFpRDtBQUdqRCxzRUFBOEg7QUFHOUgsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNoQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU87SUFDekUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUs7SUFDdEUsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTTtJQUN4RSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNO0lBQ3pFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUTtDQUNwRCxDQUFDLENBQUM7QUFFSCxNQUFhLG9CQUFvQjtJQUFqQztRQUNZLDRCQUF1QixHQUFHLElBQUksbURBQThCLEVBQVEsQ0FBQztRQUNyRSx1QkFBa0IsR0FBRyxJQUFJLDhDQUF5QixFQUFRLENBQUM7UUFFN0QsZ0JBQVcsR0FBa0IsSUFBSSxDQUFDO1FBQ2xDLGNBQVMsR0FBWSxLQUFLLENBQUM7SUFtUXJDLENBQUM7SUFqUVEsUUFBUSxDQUFDLEtBQWdDO1FBQzlDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FB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LENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLHFCQUFxQjtRQUM5QyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDLHVCQUF1QjtJQUN2RCxDQUFDO0NBQ0Y7QUF4UUQsb0RBd1FDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWxpYXNhYmxlRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvQWJzdHJhY3Rpb25zXCI7XG5pbXBvcnQgeyBBbGlhcyB9IGZyb20gXCIuLi9hc3QvQWxpYXNcIjtcbmltcG9ydCB7IEJpbmFyeUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0JpbmFyeUV4cHJlc3Npb25cIjtcbmltcG9ydCB7IENhc2VFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9DYXNlRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uL2FzdC9Db2x1bW5cIjtcbmltcG9ydCB7IENvbmNhdCB9IGZyb20gXCIuLi9hc3QvQ29uY2F0XCI7XG5pbXBvcnQgeyBFeGlzdHNFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9FeGlzdHNFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBGcm9tLCBKc29uRWFjaEZyb20sIFN1YnF1ZXJ5RnJvbSwgVGFibGVGcm9tIH0gZnJvbSBcIi4uL2FzdC9Gcm9tXCI7XG5pbXBvcnQgeyBGdW5jdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0Z1bmN0aW9uRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgSW5FeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9JbkV4cHJlc3Npb25cIjtcbmltcG9ydCB7IEluc2VydFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9JbnNlcnRRdWVyeVwiO1xuaW1wb3J0IHsgSm9pbiB9IGZyb20gXCIuLi9hc3QvSm9pblwiO1xuaW1wb3J0IHsgTnVsbExpdGVyYWwsIE51bWJlckxpdGVyYWwsIFBhcmFtLCBTdHJpbmdMaXRlcmFsIH0gZnJvbSBcIi4uL2FzdC9MaXRlcmFsc1wiO1xuaW1wb3J0IHsgT3JkZXJCeSB9IGZyb20gXCIuLi9hc3QvT3JkZXJCeVwiO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnkgfSBmcm9tIFwiLi4vYXN0L1NlbGVjdFF1ZXJ5XCI7XG5pbXBvcnQgeyBVbmFyeUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L1VuYXJ5RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgV2l0aCB9IGZyb20gXCIuLi9hc3QvV2l0aFwiO1xuaW1wb3J0IHsgQ29sdW1uTGlrZVZpc2l0b3JBY2NlcHRvciwgRnJvbUxpa2VBbmRKb2luVmlzaXRvckFjY2VwdG9yLCBTcWxUcmVlTm9kZVZpc2l0b3IgfSBmcm9tIFwiLi4vdmlzaXRvci9TcWxUcmVlTm9kZVZpc2l0b3JcIjtcbmltcG9ydCB7IFF1ZXJ5VmFsaWRhdG9yIH0gZnJvbSBcIi4vUXVlcnlWYWxpZGF0b3JcIjtcblxuY29uc3QgUkVTRVJWRURfS0VZV09SRFMgPSBuZXcgU2V0KFtcbiAgJ1NFTEVDVCcsICdGUk9NJywgJ1dIRVJFJywgJ0pPSU4nLCAnT04nLCAnR1JPVVAnLCAnQlknLCAnSEFWSU5HJywgJ1VOSU9OJyxcbiAgJ09SREVSJywgJ0xJTUlUJywgJ09GRlNFVCcsICdUQUJMRScsICdJTkRFWCcsICdWSUVXJywgJ1RSSUdHRVInLCAnS0VZJyxcbiAgJ0NPTFVNTicsICdDT05TVFJBSU5UJywgJ1BSSU1BUlknLCAnRk9SRUlHTicsICdDSEVDSycsICdERUZBVUxUJywgJ05VTEwnLFxuICAnTk9UJywgJ0FORCcsICdPUicsICdMSUtFJywgJ0lOJywgJ0lTJywgJ0JFVFdFRU4nLCAnQ0FTRScsICdXSEVOJywgJ1RIRU4nLFxuICAnRUxTRScsICdFTkQnLCAnSU5TRVJUJywgJ0lOVE8nLCAnVkFMVUVTJywgJ0VYSVNUUydcbl0pO1xuXG5leHBvcnQgY2xhc3MgQ29tbW9uUXVlcnlWYWxpZGF0b3IgaW1wbGVtZW50cyBRdWVyeVZhbGlkYXRvciwgU3FsVHJlZU5vZGVWaXNpdG9yPHZvaWQ+IHtcbiAgcHJvdGVjdGVkIGZyb21MaWtlQW5kSm9pbkFjY2VwdG9yID0gbmV3IEZyb21MaWtlQW5kSm9pblZpc2l0b3JBY2NlcHRvcjx2b2lkPigpO1xuICBwcm90ZWN0ZWQgY29sdW1uTGlrZUFjY2VwdG9yID0gbmV3IENvbHVtbkxpa2VWaXNpdG9yQWNjZXB0b3I8dm9pZD4oKTtcblxuICBwcml2YXRlIGNvbHVtbkNvdW50OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpc0dyb3VwZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgdmFsaWRhdGUocXVlcnk6IFNlbGVjdFF1ZXJ5IHwgSW5zZXJ0UXVlcnkpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgcXVlcnkuYWNjZXB0KHRoaXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuY29sdW1uQ291bnQgPSBudWxsO1xuICAgIHRoaXMuaXNHcm91cGVkID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlQWxpYXMoYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZCwgY29udGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGFsaWFzICYmICFhbGlhcy50cmltKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW1wdHkgYWxpYXMgaW4gJHtjb250ZXh0fWApO1xuICAgIH1cbiAgICBpZiAoYWxpYXMgJiYgUkVTRVJWRURfS0VZV09SRFMuaGFzKGFsaWFzLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFsaWFzICcke2FsaWFzfScgaW4gJHtjb250ZXh0fSBpcyBhIHJlc2VydmVkIFNRTGl0ZSBrZXl3b3JkYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUlkZW50aWZpZXIobmFtZTogc3RyaW5nLCBjb250ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIW5hbWUgfHwgIW5hbWUudHJpbSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Y29udGV4dH0gbmFtZSBjYW5ub3QgYmUgZW1wdHlgKTtcbiAgICB9XG4gICAgaWYgKFJFU0VSVkVEX0tFWVdPUkRTLmhhcyhuYW1lLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Y29udGV4dH0gbmFtZSAnJHtuYW1lfScgaXMgYSByZXNlcnZlZCBTUUxpdGUga2V5d29yZGApO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0SW5zZXJ0UXVlcnkobm9kZTogSW5zZXJ0UXVlcnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihub2RlWydfdGFibGVOYW1lJ10sICdJbnNlcnRRdWVyeScpO1xuICAgIGlmIChub2RlWydfY29sdW1ucyddLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnNlcnRRdWVyeSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIGNvbHVtbicpO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX2NvbHVtbnMnXS5sZW5ndGggIT09IG5vZGVbJ192YWx1ZXMnXS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW5zZXJ0UXVlcnkgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBjb2x1bW5zIGFuZCB2YWx1ZXMnKTtcbiAgICB9XG4gICAgbm9kZVsnX2NvbHVtbnMnXS5mb3JFYWNoKGNvbCA9PiB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihjb2wsICdJbnNlcnRRdWVyeSBjb2x1bW4nKSk7XG4gICAgbm9kZVsnX3ZhbHVlcyddLmZvckVhY2godmFsID0+IHZhbC5hY2NlcHQodGhpcykpO1xuICB9XG5cbiAgdmlzaXRTZWxlY3RRdWVyeShub2RlOiBTZWxlY3RRdWVyeSk6IHZvaWQge1xuICAgIGlmIChub2RlWydfY29sdW1ucyddLmxlbmd0aCA+IDAgJiYgbm9kZVsnX2Zyb21zQW5kSm9pbnMnXS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU0VMRUNUIHF1ZXJ5IHdpdGggY29sdW1ucyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIEZST00gY2xhdXNlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldkNvdW50ID0gdGhpcy5jb2x1bW5Db3VudDtcbiAgICB0aGlzLmNvbHVtbkNvdW50ID0gbm9kZVsnX2NvbHVtbnMnXS5sZW5ndGggPiAwID8gbm9kZVsnX2NvbHVtbnMnXS5sZW5ndGggOiAxO1xuXG4gICAgbm9kZVsnX3dpdGgnXS5mb3JFYWNoKHcgPT4gdy5hY2NlcHQodGhpcykpO1xuICAgIG5vZGVbJ19mcm9tc0FuZEpvaW5zJ10uZm9yRWFjaChpdGVtID0+IHRoaXMuZnJvbUxpa2VBbmRKb2luQWNjZXB0b3IuYWNjZXB0KHRoaXMsIGl0ZW0pKTtcbiAgICBub2RlWydfY29sdW1ucyddLmZvckVhY2goYyA9PiB0aGlzLmNvbHVtbkxpa2VBY2NlcHRvci5hY2NlcHQodGhpcywgYykpO1xuICAgIGlmIChub2RlWydfd2hlcmUnXSkge1xuICAgICAgbm9kZVsnX3doZXJlJ10uYWNjZXB0KHRoaXMpO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX2dyb3VwQnknXS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmlzR3JvdXBlZCA9IHRydWU7XG4gICAgICBub2RlWydfZ3JvdXBCeSddLmZvckVhY2goYyA9PiBjLmFjY2VwdCh0aGlzKSk7XG4gICAgfVxuICAgIGlmIChub2RlWydfaGF2aW5nJ10gJiYgIXRoaXMuaXNHcm91cGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hBVklORyBjbGF1c2UgcmVxdWlyZXMgR1JPVVAgQlknKTtcbiAgICB9XG4gICAgaWYgKG5vZGVbJ19oYXZpbmcnXSkge1xuICAgICAgbm9kZVsnX2hhdmluZyddLmFjY2VwdCh0aGlzKTtcbiAgICB9XG4gICAgaWYgKG5vZGVbJ191bmlvbiddLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChub2RlWydfY29sdW1ucyddLmxlbmd0aCA9PT0gMCAmJiBub2RlWydfZnJvbXNBbmRKb2lucyddLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIHF1ZXJ5IHdpdGggVU5JT04gc3VicXVlcmllcyBtdXN0IGhhdmUgY29sdW1ucyBhbmQgYSBGUk9NIGNsYXVzZSBpbiB0aGUgbWFpbiBxdWVyeVwiKTtcbiAgICAgIH1cbiAgICAgIGxldCBjb2x1bW5Db3VudHMgPSBbXTtcbiAgICAgIGlmIChub2RlWydfY29sdW1ucyddLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29sdW1uQ291bnRzLnB1c2gobm9kZVsnX2NvbHVtbnMnXS5sZW5ndGgpOyAvLyBJbmNsdWRlIG1haW4gcXVlcnlcbiAgICAgIH1cbiAgICAgIGNvbHVtbkNvdW50cyA9IGNvbHVtbkNvdW50cy5jb25jYXQobm9kZVsnX3VuaW9uJ10ubWFwKHUgPT4gdVsnX2NvbHVtbnMnXS5sZW5ndGggfHwgMSkpO1xuICAgICAgaWYgKGNvbHVtbkNvdW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0Q291bnQgPSBjb2x1bW5Db3VudHNbMF07XG4gICAgICAgIGlmIChjb2x1bW5Db3VudHMuc29tZShjb3VudCA9PiBjb3VudCAhPT0gZmlyc3RDb3VudCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VOSU9OIHF1ZXJpZXMgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBjb2x1bW5zJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZVsnX29yZGVyQnknXS5mb3JFYWNoKG8gPT4gby5hY2NlcHQodGhpcykpO1xuICAgIGlmIChub2RlWydfbGltaXQnXSAhPT0gbnVsbCAmJiBub2RlWydfbGltaXQnXSAhPT0gdW5kZWZpbmVkICYmIG5vZGVbJ19saW1pdCddIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMSU1JVCBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX29mZnNldCddICE9PSBudWxsICYmIG5vZGVbJ19vZmZzZXQnXSAhPT0gdW5kZWZpbmVkICYmIG5vZGVbJ19vZmZzZXQnXSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT0ZGU0VUIG11c3QgYmUgbm9uLW5lZ2F0aXZlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2x1bW5Db3VudCA9IHByZXZDb3VudDsgLy8gUmVzdG9yZSBwYXJlbnQgY29udGV4dCBpZiBuZXN0ZWRcbiAgfVxuXG4gIHZpc2l0VGFibGVGcm9tKG5vZGU6IFRhYmxlRnJvbSk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVJZGVudGlmaWVyKG5vZGUudGFibGVOYW1lLCAnVGFibGVGcm9tJyk7XG4gIH1cblxuICB2aXNpdFN1YnF1ZXJ5RnJvbShub2RlOiBTdWJxdWVyeUZyb20pOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2Q291bnQgPSB0aGlzLmNvbHVtbkNvdW50O1xuICAgIHRoaXMuY29sdW1uQ291bnQgPSBudWxsOyAvLyBSZXNldCBmb3Igc3VicXVlcnlcbiAgICBub2RlLnN1YnF1ZXJ5LmFjY2VwdCh0aGlzKTtcbiAgICB0aGlzLmNvbHVtbkNvdW50ID0gcHJldkNvdW50OyAvLyBSZXN0b3JlIHBhcmVudCBjb3VudFxuICB9XG5cbiAgdmlzaXRKc29uRWFjaEZyb20obm9kZTogSnNvbkVhY2hGcm9tKTogdm9pZCB7XG4gICAgbm9kZS5qc29uRXhwcmVzc2lvbi5hY2NlcHQodGhpcyk7XG4gICAgaWYgKG5vZGUuanNvblBhdGgpIHtcbiAgICAgIG5vZGUuanNvblBhdGguYWNjZXB0KHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0Q29sdW1uKG5vZGU6IENvbHVtbik6IHZvaWQge1xuICAgIGlmIChub2RlLmhhc1RhYmxlTmFtZSgpKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihub2RlLnRhYmxlTmFtZSBhcyBzdHJpbmcsICdDb2x1bW4nKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUlkZW50aWZpZXIobm9kZS5jb2x1bW5OYW1lLCAnQ29sdW1uJyk7XG4gIH1cblxuICB2aXNpdEFsaWFzKG5vZGU6IEFsaWFzPEZyb20gfCBBbGlhc2FibGVFeHByZXNzaW9uPik6IHZvaWQge1xuICAgIGlmICghbm9kZS5hbGlhcyB8fCAhbm9kZS5hbGlhcy50cmltKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWxpYXMgbXVzdCBoYXZlIGEgbm9uLWVtcHR5IG5hbWUnKTtcbiAgICB9XG4gICAgaWYgKG5vZGUucmVmZXJlbnQgaW5zdGFuY2VvZiBKb2luKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQWxpYXMobm9kZS5hbGlhcywgJ0pvaW4nKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUucmVmZXJlbnQgaW5zdGFuY2VvZiBDb2x1bW4pIHtcbiAgICAgIHRoaXMudmFsaWRhdGVBbGlhcyhub2RlLmFsaWFzLCAnQ29sdW1uJyk7XG4gICAgfSBlbHNlIGlmIChub2RlLnJlZmVyZW50IGluc3RhbmNlb2YgVGFibGVGcm9tKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQWxpYXMobm9kZS5hbGlhcywgJ1RhYmxlRnJvbScpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5yZWZlcmVudCBpbnN0YW5jZW9mIFN1YnF1ZXJ5RnJvbSkge1xuICAgICAgdGhpcy52YWxpZGF0ZUFsaWFzKG5vZGUuYWxpYXMsICdTdWJxdWVyeUZyb20nKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUucmVmZXJlbnQgaW5zdGFuY2VvZiBKc29uRWFjaEZyb20pIHtcbiAgICAgIHRoaXMudmFsaWRhdGVBbGlhcyhub2RlLmFsaWFzLCAnSnNvbkVhY2hGcm9tJyk7XG4gICAgfSBlbHNlIGlmIChub2RlLnJlZmVyZW50IGluc3RhbmNlb2YgQWxpYXNhYmxlRXhwcmVzc2lvbikge1xuICAgICAgdGhpcy52YWxpZGF0ZUFsaWFzKG5vZGUuYWxpYXMsICdFeHByZXNzaW9uJyk7XG4gICAgfVxuICAgIG5vZGUucmVmZXJlbnQuYWNjZXB0KHRoaXMpO1xuICB9XG5cbiAgdmlzaXRKb2luQ2xhdXNlKG5vZGU6IEpvaW4pOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihub2RlLnRhYmxlTmFtZSwgJ0pvaW5DbGF1c2UnKTtcbiAgICBpZiAoIW5vZGUub24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSm9pbkNsYXVzZSBtdXN0IGhhdmUgYW4gT04gY29uZGl0aW9uJyk7XG4gICAgfVxuICAgIG5vZGUub24uYWNjZXB0KHRoaXMpO1xuICB9XG5cbiAgdmlzaXRPcmRlckJ5KG5vZGU6IE9yZGVyQnkpOiB2b2lkIHtcbiAgICBub2RlLmNvbHVtbi5hY2NlcHQodGhpcyk7XG4gIH1cblxuICB2aXNpdFdpdGhDbGF1c2Uobm9kZTogV2l0aCk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVJZGVudGlmaWVyKG5vZGUubmFtZSwgJ1dpdGhDbGF1c2UnKTtcbiAgICBjb25zdCBwcmV2Q291bnQgPSB0aGlzLmNvbHVtbkNvdW50O1xuICAgIHRoaXMuY29sdW1uQ291bnQgPSBudWxsOyAvLyBSZXNldCBmb3Igc3VicXVlcnlcbiAgICBub2RlLnF1ZXJ5LmFjY2VwdCh0aGlzKTtcbiAgICB0aGlzLmNvbHVtbkNvdW50ID0gcHJldkNvdW50OyAvLyBSZXN0b3JlIHBhcmVudCBjb3VudFxuICB9XG5cbiAgdmlzaXRCaW5hcnlFeHByZXNzaW9uKG5vZGU6IEJpbmFyeUV4cHJlc3Npb24pOiB2b2lkIHtcbiAgICBpZiAoIW5vZGUub3BlcmF0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQmluYXJ5RXhwcmVzc2lvbiBtdXN0IGhhdmUgYSB2YWxpZCBvcGVyYXRvcicpO1xuICAgIH1cbiAgICBpZiAoIW5vZGUubGVmdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaW5hcnlFeHByZXNzaW9uIG11c3QgaGF2ZSBhIHZhbGlkIGxlZnQgb3BlcmFuZCcpO1xuICAgIH1cbiAgICBpZiAoIW5vZGUucmlnaHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQmluYXJ5RXhwcmVzc2lvbiBtdXN0IGhhdmUgYSB2YWxpZCByaWdodCBvcGVyYW5kJyk7XG4gICAgfVxuICAgIG5vZGUubGVmdC5hY2NlcHQodGhpcyk7XG4gICAgbm9kZS5yaWdodC5hY2NlcHQodGhpcyk7XG4gIH1cblxuICB2aXNpdFVuYXJ5RXhwcmVzc2lvbihub2RlOiBVbmFyeUV4cHJlc3Npb24pOiB2b2lkIHtcbiAgICBpZiAoIW5vZGUub3BlcmF0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hcnlFeHByZXNzaW9uIG11c3QgaGF2ZSBhIHZhbGlkIG9wZXJhdG9yJyk7XG4gICAgfVxuICAgIGlmICghbm9kZS5vcGVyYW5kKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYXJ5RXhwcmVzc2lvbiBtdXN0IGhhdmUgYSB2YWxpZCBvcGVyYW5kJyk7XG4gICAgfVxuICAgIG5vZGUub3BlcmFuZC5hY2NlcHQodGhpcyk7XG4gIH1cblxuICB2aXNpdEluRXhwcmVzc2lvbihub2RlOiBJbkV4cHJlc3Npb24pOiB2b2lkIHtcbiAgICBpZiAobm9kZS5sZWZ0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJTiBleHByZXNzaW9uIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbGVmdCBleHByZXNzaW9uJyk7XG4gICAgfVxuICAgIG5vZGUubGVmdC5mb3JFYWNoKGwgPT4gbC5hY2NlcHQodGhpcykpO1xuICAgIGlmIChub2RlLnZhbHVlcyBpbnN0YW5jZW9mIFNlbGVjdFF1ZXJ5KSB7XG4gICAgICBub2RlLnZhbHVlcy5hY2NlcHQodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChub2RlLnZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJTiBleHByZXNzaW9uIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgdmFsdWUgc2V0Jyk7XG4gICAgICB9XG4gICAgICBub2RlLnZhbHVlcy5mb3JFYWNoKHNldCA9PiB7XG4gICAgICAgIGlmIChzZXQubGVuZ3RoICE9PSBub2RlLmxlZnQubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBzZXRzIGluIElOIGV4cHJlc3Npb24gbXVzdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGxlZnQgZXhwcmVzc2lvbnMnKTtcbiAgICAgICAgfVxuICAgICAgICBzZXQuZm9yRWFjaCh2ID0+IHYuYWNjZXB0KHRoaXMpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0Q29uY2F0KG5vZGU6IENvbmNhdCk6IHZvaWQge1xuICAgIGlmIChub2RlLmV4cHJlc3Npb25zLmxlbmd0aCA8IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uY2F0IG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZXhwcmVzc2lvbnMnKTtcbiAgICB9XG4gICAgbm9kZS5leHByZXNzaW9ucy5mb3JFYWNoKGUgPT4gZS5hY2NlcHQodGhpcykpO1xuICB9XG5cbiAgdmlzaXRDYXNlRXhwcmVzc2lvbihub2RlOiBDYXNlRXhwcmVzc2lvbik6IHZvaWQge1xuICAgIGlmIChub2RlLmNhc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYXNlRXhwcmVzc2lvbiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIFdIRU4vVEhFTiBwYWlyJyk7XG4gICAgfVxuICAgIG5vZGUuY2FzZXMuZm9yRWFjaChjID0+IHtcbiAgICAgIGMud2hlbi5hY2NlcHQodGhpcyk7XG4gICAgICBjLnRoZW4uYWNjZXB0KHRoaXMpO1xuICAgIH0pO1xuICAgIGlmIChub2RlLmVsc2UpIHtcbiAgICAgIG5vZGUuZWxzZS5hY2NlcHQodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24obm9kZTogRnVuY3Rpb25FeHByZXNzaW9uKTogdm9pZCB7XG4gICAgY29uc3Qgbm9BcmdGdW5jdGlvbnMgPSBbJ1JBTkRPTSddO1xuICAgIGlmICghbm9BcmdGdW5jdGlvbnMuaW5jbHVkZXMobm9kZS5uYW1lKSAmJiBub2RlLmFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZ1bmN0aW9uICR7bm9kZS5uYW1lfSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgYXJndW1lbnRgKTtcbiAgICB9XG4gICAgbm9kZS5hcmdzLmZvckVhY2goYSA9PiBhLmFjY2VwdCh0aGlzKSk7XG4gIH1cblxuICB2aXNpdFBhcmFtRXhwcmVzc2lvbihfbm9kZTogUGFyYW0pOiB2b2lkIHtcbiAgICAvLyBObyBzcGVjaWZpYyB2YWxpZGF0aW9uIG5lZWRlZFxuICB9XG5cbiAgdmlzaXRTdHJpbmdMaXRlcmFsKG5vZGU6IFN0cmluZ0xpdGVyYWwpOiB2b2lkIHtcbiAgICBpZiAobm9kZS52YWx1ZSA9PT0gbnVsbCB8fCBub2RlLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3RyaW5nTGl0ZXJhbCB2YWx1ZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG4gIH1cblxuICB2aXNpdE51bWJlckxpdGVyYWwobm9kZTogTnVtYmVyTGl0ZXJhbCk6IHZvaWQge1xuICAgIGlmIChpc05hTihub2RlLnZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOdW1iZXJMaXRlcmFsIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBudW1iZXInKTtcbiAgICB9XG4gIH1cblxuICB2aXNpdE51bGxMaXRlcmFsKF9ub2RlOiBOdWxsTGl0ZXJhbCk6IHZvaWQge1xuICAgIC8vIE5vIHNwZWNpZmljIHZhbGlkYXRpb24gbmVlZGVkXG4gIH1cblxuICB2aXNpdEV4aXN0c0V4cHJlc3Npb24obm9kZTogRXhpc3RzRXhwcmVzc2lvbik6IHZvaWQge1xuICAgIGlmICghbm9kZS5zdWJxdWVyeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeGlzdHNFeHByZXNzaW9uIG11c3QgaGF2ZSBhIHZhbGlkIHN1YnF1ZXJ5Jyk7XG4gICAgfVxuICAgIGNvbnN0IHByZXZDb3VudCA9IHRoaXMuY29sdW1uQ291bnQ7XG4gICAgdGhpcy5jb2x1bW5Db3VudCA9IG51bGw7IC8vIFJlc2V0IGZvciBzdWJxdWVyeVxuICAgIG5vZGUuc3VicXVlcnkuYWNjZXB0KHRoaXMpO1xuICAgIHRoaXMuY29sdW1uQ291bnQgPSBwcmV2Q291bnQ7IC8vIFJlc3RvcmUgcGFyZW50IGNvdW50XG4gIH1cbn1cbiJdfQ==
511
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tbW9uUXVlcnlWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmFsaWRhdGUvQ29tbW9uUXVlcnlWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0RBQTBEO0FBVTFELDBDQUF1QztBQVd2QyxzQ0FBMEU7QUFLMUUsc0NBQW1DO0FBR25DLG9EQUFpRDtBQUdqRCxzRUFBOEg7QUFHOUgsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNoQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU87SUFDekUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUs7SUFDdEUsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTTtJQUN4RSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNO0lBQ3pFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUTtDQUNwRCxDQUFDLENBQUM7QUFFSCxNQUFhLG9CQUFvQjtJQUFqQztRQUNZLDRCQUF1QixHQUFHLElBQUksbURBQThCLEVBQVEsQ0FBQztRQUNyRSx1QkFBa0IsR0FBRyxJQUFJLDhDQUF5QixFQUFRLENBQUM7UUFFN0QsZ0JBQVcsR0FBa0IsSUFBSSxDQUFDO1FBQ2xDLGNBQVMsR0FBWSxLQUFLLENBQUM7SUEwaEJyQyxDQUFDO0lBeGhCUSxRQUFRLENBQUMsS0FBa047UUFDaE8sSUFBSSxDQUFDLEtBQUssRUFBRSxD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WUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUMscUJBQXFCO1FBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLENBQUMsdUJBQXVCO0lBQ3ZELENBQUM7Q0FDRjtBQS9oQkQsb0RBK2hCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFsaWFzYWJsZUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0Fic3RyYWN0aW9uc1wiO1xuaW1wb3J0IHsgQWxpYXMgfSBmcm9tIFwiLi4vYXN0L0FsaWFzXCI7XG5pbXBvcnQgeyBBbHRlclRhYmxlUXVlcnkgfSBmcm9tIFwiLi4vYXN0L0FsdGVyVGFibGVRdWVyeVwiO1xuaW1wb3J0IHsgQmV0d2VlbkV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0JldHdlZW5FeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBCaW5hcnlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9CaW5hcnlFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBDYXNlRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvQ2FzZUV4cHJlc3Npb25cIjtcbmltcG9ydCB7IENhc3RFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9DYXN0RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ29sbGF0ZUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0NvbGxhdGVFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBTdWJxdWVyeUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L1N1YnF1ZXJ5RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgV2luZG93RXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvV2luZG93RXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uL2FzdC9Db2x1bW5cIjtcbmltcG9ydCB7IENvbmNhdCB9IGZyb20gXCIuLi9hc3QvQ29uY2F0XCI7XG5pbXBvcnQgeyBDcmVhdGVJbmRleFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9DcmVhdGVJbmRleFF1ZXJ5XCI7XG5pbXBvcnQgeyBDcmVhdGVUYWJsZVF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9DcmVhdGVUYWJsZVF1ZXJ5XCI7XG5pbXBvcnQgeyBDcmVhdGVWaXJ0dWFsVGFibGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvQ3JlYXRlVmlydHVhbFRhYmxlUXVlcnlcIjtcbmltcG9ydCB7IENyZWF0ZVZpZXdRdWVyeSB9IGZyb20gXCIuLi9hc3QvQ3JlYXRlVmlld1F1ZXJ5XCI7XG5pbXBvcnQgeyBEZWxldGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvRGVsZXRlUXVlcnlcIjtcbmltcG9ydCB7IERyb3BJbmRleFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9Ecm9wSW5kZXhRdWVyeVwiO1xuaW1wb3J0IHsgRHJvcFRhYmxlUXVlcnkgfSBmcm9tIFwiLi4vYXN0L0Ryb3BUYWJsZVF1ZXJ5XCI7XG5pbXBvcnQgeyBEcm9wVmlld1F1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9Ecm9wVmlld1F1ZXJ5XCI7XG5pbXBvcnQgeyBFeGlzdHNFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9FeGlzdHNFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBGcm9tLCBKc29uRWFjaEZyb20sIFN1YnF1ZXJ5RnJvbSwgVGFibGVGcm9tIH0gZnJvbSBcIi4uL2FzdC9Gcm9tXCI7XG5pbXBvcnQgeyBGdW5jdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYXN0L0Z1bmN0aW9uRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgSW5FeHByZXNzaW9uIH0gZnJvbSBcIi4uL2FzdC9JbkV4cHJlc3Npb25cIjtcbmltcG9ydCB7IEluc2VydFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9JbnNlcnRRdWVyeVwiO1xuaW1wb3J0IHsgVXBkYXRlUXVlcnkgfSBmcm9tIFwiLi4vYXN0L1VwZGF0ZVF1ZXJ5XCI7XG5pbXBvcnQgeyBKb2luIH0gZnJvbSBcIi4uL2FzdC9Kb2luXCI7XG5pbXBvcnQgeyBOdWxsTGl0ZXJhbCwgTnVtYmVyTGl0ZXJhbCwgUGFyYW0sIFN0cmluZ0xpdGVyYWwgfSBmcm9tIFwiLi4vYXN0L0xpdGVyYWxzXCI7XG5pbXBvcnQgeyBPcmRlckJ5IH0gZnJvbSBcIi4uL2FzdC9PcmRlckJ5XCI7XG5pbXBvcnQgeyBTZWxlY3RRdWVyeSB9IGZyb20gXCIuLi9hc3QvU2VsZWN0UXVlcnlcIjtcbmltcG9ydCB7IFVuYXJ5RXhwcmVzc2lvbiB9IGZyb20gXCIuLi9hc3QvVW5hcnlFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBXaXRoIH0gZnJvbSBcIi4uL2FzdC9XaXRoXCI7XG5pbXBvcnQgeyBDb2x1bW5MaWtlVmlzaXRvckFjY2VwdG9yLCBGcm9tTGlrZUFuZEpvaW5WaXNpdG9yQWNjZXB0b3IsIFNxbFRyZWVOb2RlVmlzaXRvciB9IGZyb20gXCIuLi92aXNpdG9yL1NxbFRyZWVOb2RlVmlzaXRvclwiO1xuaW1wb3J0IHsgUXVlcnlWYWxpZGF0b3IgfSBmcm9tIFwiLi9RdWVyeVZhbGlkYXRvclwiO1xuXG5jb25zdCBSRVNFUlZFRF9LRVlXT1JEUyA9IG5ldyBTZXQoW1xuICAnU0VMRUNUJywgJ0ZST00nLCAnV0hFUkUnLCAnSk9JTicsICdPTicsICdHUk9VUCcsICdCWScsICdIQVZJTkcnLCAnVU5JT04nLFxuICAnT1JERVInLCAnTElNSVQnLCAnT0ZGU0VUJywgJ1RBQkxFJywgJ0lOREVYJywgJ1ZJRVcnLCAnVFJJR0dFUicsICdLRVknLFxuICAnQ09MVU1OJywgJ0NPTlNUUkFJTlQnLCAnUFJJTUFSWScsICdGT1JFSUdOJywgJ0NIRUNLJywgJ0RFRkFVTFQnLCAnTlVMTCcsXG4gICdOT1QnLCAnQU5EJywgJ09SJywgJ0xJS0UnLCAnSU4nLCAnSVMnLCAnQkVUV0VFTicsICdDQVNFJywgJ1dIRU4nLCAnVEhFTicsXG4gICdFTFNFJywgJ0VORCcsICdJTlNFUlQnLCAnSU5UTycsICdWQUxVRVMnLCAnRVhJU1RTJ1xuXSk7XG5cbmV4cG9ydCBjbGFzcyBDb21tb25RdWVyeVZhbGlkYXRvciBpbXBsZW1lbnRzIFF1ZXJ5VmFsaWRhdG9yLCBTcWxUcmVlTm9kZVZpc2l0b3I8dm9pZD4ge1xuICBwcm90ZWN0ZWQgZnJvbUxpa2VBbmRKb2luQWNjZXB0b3IgPSBuZXcgRnJvbUxpa2VBbmRKb2luVmlzaXRvckFjY2VwdG9yPHZvaWQ+KCk7XG4gIHByb3RlY3RlZCBjb2x1bW5MaWtlQWNjZXB0b3IgPSBuZXcgQ29sdW1uTGlrZVZpc2l0b3JBY2NlcHRvcjx2b2lkPigpO1xuXG4gIHByaXZhdGUgY29sdW1uQ291bnQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlzR3JvdXBlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyB2YWxpZGF0ZShxdWVyeTogU2VsZWN0UXVlcnkgfCBJbnNlcnRRdWVyeSB8IFVwZGF0ZVF1ZXJ5IHwgRGVsZXRlUXVlcnkgfCBDcmVhdGVUYWJsZVF1ZXJ5IHwgQ3JlYXRlVmlydHVhbFRhYmxlUXVlcnkgfCBDcmVhdGVJbmRleFF1ZXJ5IHwgQ3JlYXRlVmlld1F1ZXJ5IHwgQWx0ZXJUYWJsZVF1ZXJ5IHwgRHJvcFRhYmxlUXVlcnkgfCBEcm9wSW5kZXhRdWVyeSB8IERyb3BWaWV3UXVlcnkpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgcXVlcnkuYWNjZXB0KHRoaXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuY29sdW1uQ291bnQgPSBudWxsO1xuICAgIHRoaXMuaXNHcm91cGVkID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlQWxpYXMoYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZCwgY29udGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGFsaWFzICYmICFhbGlhcy50cmltKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW1wdHkgYWxpYXMgaW4gJHtjb250ZXh0fWApO1xuICAgIH1cbiAgICBpZiAoYWxpYXMgJiYgUkVTRVJWRURfS0VZV09SRFMuaGFzKGFsaWFzLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFsaWFzICcke2FsaWFzfScgaW4gJHtjb250ZXh0fSBpcyBhIHJlc2VydmVkIFNRTGl0ZSBrZXl3b3JkYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUlkZW50aWZpZXIobmFtZTogc3RyaW5nLCBjb250ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIW5hbWUgfHwgIW5hbWUudHJpbSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Y29udGV4dH0gbmFtZSBjYW5ub3QgYmUgZW1wdHlgKTtcbiAgICB9XG4gICAgaWYgKFJFU0VSVkVEX0tFWVdPUkRTLmhhcyhuYW1lLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Y29udGV4dH0gbmFtZSAnJHtuYW1lfScgaXMgYSByZXNlcnZlZCBTUUxpdGUga2V5d29yZGApO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0SW5zZXJ0UXVlcnkobm9kZTogSW5zZXJ0UXVlcnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihub2RlWydfdGFibGVOYW1lJ10sICdJbnNlcnRRdWVyeScpO1xuICAgIGlmIChub2RlWydfY29sdW1ucyddLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnNlcnRRdWVyeSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIGNvbHVtbicpO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX2Zyb21TZWxlY3QnXSkge1xuICAgICAgLy8gSU5TRVJUIC4uLiBTRUxFQ1QgLSB2YWxpZGF0ZSB0aGUgc3VicXVlcnlcbiAgICAgIGlmIChub2RlWydfdmFsdWVzJ10ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luc2VydFF1ZXJ5IGNhbm5vdCBoYXZlIGJvdGggVkFMVUVTIGFuZCBTRUxFQ1QnKTtcbiAgICAgIH1cbiAgICAgIG5vZGVbJ19mcm9tU2VsZWN0J10uYWNjZXB0KHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJTlNFUlQgLi4uIFZBTFVFUyAtIHZhbGlkYXRlIGNvbHVtbi92YWx1ZSBjb3VudCBtYXRjaFxuICAgICAgaWYgKG5vZGVbJ19jb2x1bW5zJ10ubGVuZ3RoICE9PSBub2RlWydfdmFsdWVzJ10ubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5zZXJ0UXVlcnkgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBjb2x1bW5zIGFuZCB2YWx1ZXMnKTtcbiAgICAgIH1cbiAgICAgIG5vZGVbJ192YWx1ZXMnXS5mb3JFYWNoKHZhbCA9PiB2YWwuYWNjZXB0KHRoaXMpKTtcbiAgICB9XG4gICAgbm9kZVsnX2NvbHVtbnMnXS5mb3JFYWNoKGNvbCA9PiB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihjb2wsICdJbnNlcnRRdWVyeSBjb2x1bW4nKSk7XG4gICAgLy8gVmFsaWRhdGUgT04gQ09ORkxJQ1QgY2xhdXNlXG4gICAgaWYgKG5vZGVbJ19vbkNvbmZsaWN0Q29sdW1ucyddLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENhbm5vdCB1c2UgYm90aCBPUiBSRVBMQUNFIGFuZCBPTiBDT05GTElDVFxuICAgICAgaWYgKG5vZGVbJ19vclJlcGxhY2UnXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luc2VydFF1ZXJ5IGNhbm5vdCB1c2UgYm90aCBPUiBSRVBMQUNFIGFuZCBPTiBDT05GTElDVCcpO1xuICAgICAgfVxuICAgICAgLy8gTXVzdCBoYXZlIGVpdGhlciBETyBVUERBVEUgb3IgRE8gTk9USElOR1xuICAgICAgaWYgKCFub2RlWydfZG9Ob3RoaW5nJ10gJiYgbm9kZVsnX2RvVXBkYXRlU2V0cyddLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ09OIENPTkZMSUNUIG11c3Qgc3BlY2lmeSBlaXRoZXIgRE8gVVBEQVRFIG9yIERPIE5PVEhJTkcnKTtcbiAgICAgIH1cbiAgICAgIC8vIENhbm5vdCBoYXZlIGJvdGggRE8gVVBEQVRFIGFuZCBETyBOT1RISU5HXG4gICAgICBpZiAobm9kZVsnX2RvTm90aGluZyddICYmIG5vZGVbJ19kb1VwZGF0ZVNldHMnXS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignT04gQ09ORkxJQ1QgY2Fubm90IGhhdmUgYm90aCBETyBVUERBVEUgYW5kIERPIE5PVEhJTkcnKTtcbiAgICAgIH1cbiAgICAgIG5vZGVbJ19vbkNvbmZsaWN0Q29sdW1ucyddLmZvckVhY2goY29sID0+IHRoaXMudmFsaWRhdGVJZGVudGlmaWVyKGNvbCwgJ09OIENPTkZMSUNUIGNvbHVtbicpKTtcbiAgICAgIG5vZGVbJ19kb1VwZGF0ZVNldHMnXS5mb3JFYWNoKHMgPT4ge1xuICAgICAgICB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihzLmNvbHVtbiwgJ0RPIFVQREFURSBjb2x1bW4nKTtcbiAgICAgICAgcy52YWx1ZS5hY2NlcHQodGhpcyk7XG4gICAgICB9KTtcbiAgICAgIGlmIChub2RlWydfb25Db25mbGljdFdoZXJlJ10pIHtcbiAgICAgICAgbm9kZVsnX29uQ29uZmxpY3RXaGVyZSddLmFjY2VwdCh0aGlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgbm8gY29uZmxpY3QgY29sdW1ucyBidXQgaGFzIERPIFVQREFURSBvciBETyBOT1RISU5HLCB0aGF0J3MgYW4gZXJyb3JcbiAgICAgIGlmIChub2RlWydfZG9Ob3RoaW5nJ10gfHwgbm9kZVsnX2RvVXBkYXRlU2V0cyddLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdETyBVUERBVEUgb3IgRE8gTk9USElORyByZXF1aXJlcyBPTiBDT05GTElDVCBjb2x1bW5zJyk7XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGVbJ19yZXR1cm5pbmcnXS5mb3JFYWNoKHIgPT4gci5hY2NlcHQodGhpcykpO1xuICB9XG5cbiAgdmlzaXREZWxldGVRdWVyeShub2RlOiBEZWxldGVRdWVyeSk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVJZGVudGlmaWVyKG5vZGVbJ190YWJsZU5hbWUnXSwgJ0RlbGV0ZVF1ZXJ5Jyk7XG4gICAgaWYgKG5vZGVbJ193aGVyZSddKSB7XG4gICAgICBub2RlWydfd2hlcmUnXS5hY2NlcHQodGhpcyk7XG4gICAgfVxuICAgIG5vZGVbJ19yZXR1cm5pbmcnXS5mb3JFYWNoKHIgPT4gci5hY2NlcHQodGhpcykpO1xuICB9XG5cbiAgdmlzaXRVcGRhdGVRdWVyeShub2RlOiBVcGRhdGVRdWVyeSk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVJZGVudGlmaWVyKG5vZGVbJ190YWJsZU5hbWUnXSwgJ1VwZGF0ZVF1ZXJ5Jyk7XG4gICAgaWYgKG5vZGVbJ19zZXQnXS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVXBkYXRlUXVlcnkgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBTRVQgY2xhdXNlJyk7XG4gICAgfVxuICAgIG5vZGVbJ19zZXQnXS5mb3JFYWNoKHMgPT4ge1xuICAgICAgdGhpcy52YWxpZGF0ZUlkZW50aWZpZXIocy5jb2x1bW4sICdVcGRhdGVRdWVyeSBjb2x1bW4nKTtcbiAgICAgIHMudmFsdWUuYWNjZXB0KHRoaXMpO1xuICAgIH0pO1xuICAgIGlmIChub2RlWydfd2hlcmUnXSkge1xuICAgICAgbm9kZVsnX3doZXJlJ10uYWNjZXB0KHRoaXMpO1xuICAgIH1cbiAgICBub2RlWydfcmV0dXJuaW5nJ10uZm9yRWFjaChyID0+IHIuYWNjZXB0KHRoaXMpKTtcbiAgfVxuXG4gIHZpc2l0RHJvcFRhYmxlUXVlcnkobm9kZTogRHJvcFRhYmxlUXVlcnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihub2RlLnRhYmxlTmFtZSwgJ0Ryb3BUYWJsZVF1ZXJ5Jyk7XG4gIH1cblxuICB2aXNpdERyb3BJbmRleFF1ZXJ5KG5vZGU6IERyb3BJbmRleFF1ZXJ5KTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0ZUlkZW50aWZpZXIobm9kZS5pbmRleE5hbWUsICdEcm9wSW5kZXhRdWVyeScpO1xuICB9XG5cbiAgdmlzaXREcm9wVmlld1F1ZXJ5KG5vZGU6IERyb3BWaWV3UXVlcnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihub2RlLnZpZXdOYW1lLCAnRHJvcFZpZXdRdWVyeScpO1xuICB9XG5cbiAgdmlzaXRDcmVhdGVWaWV3UXVlcnkobm9kZTogQ3JlYXRlVmlld1F1ZXJ5KTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0ZUlkZW50aWZpZXIobm9kZS52aWV3TmFtZSwgJ0NyZWF0ZVZpZXdRdWVyeSB2aWV3IG5hbWUnKTtcblxuICAgIGZvciAoY29uc3QgY29sIG9mIG5vZGUuY29sdW1ucykge1xuICAgICAgdGhpcy52YWxpZGF0ZUlkZW50aWZpZXIoY29sLCAnQ3JlYXRlVmlld1F1ZXJ5IGNvbHVtbiBuYW1lJyk7XG4gICAgfVxuXG4gICAgaWYgKCFub2RlLnNlbGVjdFF1ZXJ5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NyZWF0ZVZpZXdRdWVyeSBtdXN0IGhhdmUgYSBTRUxFQ1QgcXVlcnknKTtcbiAgICB9XG5cbiAgICBub2RlLnNlbGVjdFF1ZXJ5LmFjY2VwdCh0aGlzKTtcbiAgfVxuXG4gIHZpc2l0Q3JlYXRlSW5kZXhRdWVyeShub2RlOiBDcmVhdGVJbmRleFF1ZXJ5KTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0ZUlkZW50aWZpZXIobm9kZS5pbmRleE5hbWUsICdDcmVhdGVJbmRleFF1ZXJ5IGluZGV4IG5hbWUnKTtcbiAgICB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihub2RlLnRhYmxlTmFtZSwgJ0NyZWF0ZUluZGV4UXVlcnkgdGFibGUgbmFtZScpO1xuXG4gICAgaWYgKG5vZGUuY29sdW1ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ3JlYXRlSW5kZXhRdWVyeSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGNvbHVtbicpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY29sIG9mIG5vZGUuY29sdW1ucykge1xuICAgICAgdGhpcy52YWxpZGF0ZUlkZW50aWZpZXIoY29sLCAnQ3JlYXRlSW5kZXhRdWVyeSBjb2x1bW4nKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS53aGVyZUV4cHJlc3Npb24pIHtcbiAgICAgIG5vZGUud2hlcmVFeHByZXNzaW9uLmFjY2VwdCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICB2aXNpdEFsdGVyVGFibGVRdWVyeShub2RlOiBBbHRlclRhYmxlUXVlcnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihub2RlLnRhYmxlTmFtZSwgJ0FsdGVyVGFibGVRdWVyeSB0YWJsZSBuYW1lJyk7XG5cbiAgICBjb25zdCBvcCA9IG5vZGUub3BlcmF0aW9uO1xuICAgIGlmICghb3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWx0ZXJUYWJsZVF1ZXJ5IG11c3QgaGF2ZSBhbiBvcGVyYXRpb24nKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG9wLnR5cGUpIHtcbiAgICAgIGNhc2UgJ0FERF9DT0xVTU4nOlxuICAgICAgICB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihvcC5jb2x1bW4ubmFtZSwgJ0FsdGVyVGFibGVRdWVyeSBjb2x1bW4gbmFtZScpO1xuICAgICAgICBpZiAob3AuY29sdW1uLmNvbnN0cmFpbnRzLmNoZWNrKSB7XG4gICAgICAgICAgb3AuY29sdW1uLmNvbnN0cmFpbnRzLmNoZWNrLmFjY2VwdCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3AuY29sdW1uLmNvbnN0cmFpbnRzLnJlZmVyZW5jZXMpIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihvcC5jb2x1bW4uY29uc3RyYWludHMucmVmZXJlbmNlcy50YWJsZSwgJ0ZvcmVpZ24ga2V5IHJlZmVyZW5jZSB0YWJsZScpO1xuICAgICAgICAgIHRoaXMudmFsaWRhdGVJZGVudGlmaWVyKG9wLmNvbHVtbi5jb25zdHJhaW50cy5yZWZlcmVuY2VzLmNvbHVtbiwgJ0ZvcmVpZ24ga2V5IHJlZmVyZW5jZSBjb2x1bW4nKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1JFTkFNRV9DT0xVTU4nOlxuICAgICAgICB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihvcC5vbGROYW1lLCAnQWx0ZXJUYWJsZVF1ZXJ5IG9sZCBjb2x1bW4gbmFtZScpO1xuICAgICAgICB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihvcC5uZXdOYW1lLCAnQWx0ZXJUYWJsZVF1ZXJ5IG5ldyBjb2x1bW4gbmFtZScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0RST1BfQ09MVU1OJzpcbiAgICAgICAgdGhpcy52YWxpZGF0ZUlkZW50aWZpZXIob3AuY29sdW1uTmFtZSwgJ0FsdGVyVGFibGVRdWVyeSBjb2x1bW4gbmFtZScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1JFTkFNRV9UQUJMRSc6XG4gICAgICAgIHRoaXMudmFsaWRhdGVJZGVudGlmaWVyKG9wLm5ld1RhYmxlTmFtZSwgJ0FsdGVyVGFibGVRdWVyeSBuZXcgdGFibGUgbmFtZScpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2aXNpdENyZWF0ZVRhYmxlUXVlcnkobm9kZTogQ3JlYXRlVGFibGVRdWVyeSk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVJZGVudGlmaWVyKG5vZGUudGFibGVOYW1lLCAnQ3JlYXRlVGFibGVRdWVyeScpO1xuXG4gICAgaWYgKG5vZGUuY29sdW1ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ3JlYXRlVGFibGVRdWVyeSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGNvbHVtbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbk5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBjb2wgb2Ygbm9kZS5jb2x1bW5zKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihjb2wubmFtZSwgJ0NvbHVtbicpO1xuICAgICAgaWYgKGNvbHVtbk5hbWVzLmhhcyhjb2wubmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYER1cGxpY2F0ZSBjb2x1bW4gbmFtZSAnJHtjb2wubmFtZX0nIGluIENyZWF0ZVRhYmxlUXVlcnlgKTtcbiAgICAgIH1cbiAgICAgIGNvbHVtbk5hbWVzLmFkZChjb2wubmFtZS50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgLy8gVmFsaWRhdGUgY2hlY2sgY29uc3RyYWludCBleHByZXNzaW9uXG4gICAgICBpZiAoY29sLmNvbnN0cmFpbnRzLmNoZWNrKSB7XG4gICAgICAgIGNvbC5jb25zdHJhaW50cy5jaGVjay5hY2NlcHQodGhpcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIHJlZmVyZW5jZXMgdGFibGUgbmFtZVxuICAgICAgaWYgKGNvbC5jb25zdHJhaW50cy5yZWZlcmVuY2VzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVJZGVudGlmaWVyKGNvbC5jb25zdHJhaW50cy5yZWZlcmVuY2VzLnRhYmxlLCAnRm9yZWlnbiBrZXkgcmVmZXJlbmNlIHRhYmxlJyk7XG4gICAgICAgIHRoaXMudmFsaWRhdGVJZGVudGlmaWVyKGNvbC5jb25zdHJhaW50cy5yZWZlcmVuY2VzLmNvbHVtbiwgJ0ZvcmVpZ24ga2V5IHJlZmVyZW5jZSBjb2x1bW4nKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgQVVUT0lOQ1JFTUVOVCBpcyBvbmx5IHVzZWQgd2l0aCBJTlRFR0VSIFBSSU1BUlkgS0VZXG4gICAgICBpZiAoY29sLmNvbnN0cmFpbnRzLmF1dG9JbmNyZW1lbnQgJiYgIWNvbC5jb25zdHJhaW50cy5wcmltYXJ5S2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQVVUT0lOQ1JFTUVOVCBjYW4gb25seSBiZSB1c2VkIHdpdGggUFJJTUFSWSBLRVknKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb2wuY29uc3RyYWludHMuYXV0b0luY3JlbWVudCAmJiBjb2wudHlwZSAhPT0gJ0lOVEVHRVInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQVVUT0lOQ1JFTUVOVCBjYW4gb25seSBiZSB1c2VkIHdpdGggSU5URUdFUiB0eXBlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGFibGUgY29uc3RyYWludHNcbiAgICBmb3IgKGNvbnN0IGNvbnN0cmFpbnQgb2Ygbm9kZS50YWJsZUNvbnN0cmFpbnRzKSB7XG4gICAgICBpZiAoY29uc3RyYWludC5uYW1lKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVJZGVudGlmaWVyKGNvbnN0cmFpbnQubmFtZSwgJ0NvbnN0cmFpbnQgbmFtZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uc3RyYWludC5jb2x1bW5zKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29sTmFtZSBvZiBjb25zdHJhaW50LmNvbHVtbnMpIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihjb2xOYW1lLCAnQ29uc3RyYWludCBjb2x1bW4nKTtcbiAgICAgICAgICBpZiAoIWNvbHVtbk5hbWVzLmhhcyhjb2xOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbnN0cmFpbnQgcmVmZXJlbmNlcyB1bmtub3duIGNvbHVtbiAnJHtjb2xOYW1lfSdgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnN0cmFpbnQucmVmZXJlbmNlcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihjb25zdHJhaW50LnJlZmVyZW5jZXMudGFibGUsICdGb3JlaWduIGtleSByZWZlcmVuY2UgdGFibGUnKTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZUlkZW50aWZpZXIoY29uc3RyYWludC5yZWZlcmVuY2VzLmNvbHVtbiwgJ0ZvcmVpZ24ga2V5IHJlZmVyZW5jZSBjb2x1bW4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnN0cmFpbnQuY2hlY2spIHtcbiAgICAgICAgY29uc3RyYWludC5jaGVjay5hY2NlcHQodGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmlzaXRDcmVhdGVWaXJ0dWFsVGFibGVRdWVyeShub2RlOiBDcmVhdGVWaXJ0dWFsVGFibGVRdWVyeSk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVJZGVudGlmaWVyKG5vZGUudGFibGVOYW1lLCAnQ3JlYXRlVmlydHVhbFRhYmxlUXVlcnknKTtcbiAgICAvLyBWaXJ0dWFsIHRhYmxlcyBhcmUgZGF0YWJhc2Utc3BlY2lmaWMsIHZhbGlkYXRlZCBieSBkaWFsZWN0IHZhbGlkYXRvcnNcbiAgICAvLyBCYXNpYyB2YWxpZGF0aW9uOiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGNvbHVtbiBmb3IgRlRTNVxuICAgIGlmIChub2RlLmNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NyZWF0ZVZpcnR1YWxUYWJsZVF1ZXJ5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgY29sdW1uJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgY29sIG9mIG5vZGUuY29sdW1ucykge1xuICAgICAgdGhpcy52YWxpZGF0ZUlkZW50aWZpZXIoY29sLCAnRlRTNSBjb2x1bW4nKTtcbiAgICB9XG4gIH1cblxuICB2aXNpdFNlbGVjdFF1ZXJ5KG5vZGU6IFNlbGVjdFF1ZXJ5KTogdm9pZCB7XG4gICAgaWYgKG5vZGVbJ19jb2x1bW5zJ10ubGVuZ3RoID4gMCAmJiBub2RlWydfZnJvbXNBbmRKb2lucyddLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTRUxFQ1QgcXVlcnkgd2l0aCBjb2x1bW5zIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgRlJPTSBjbGF1c2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2Q291bnQgPSB0aGlzLmNvbHVtbkNvdW50O1xuICAgIHRoaXMuY29sdW1uQ291bnQgPSBub2RlWydfY29sdW1ucyddLmxlbmd0aCA+IDAgPyBub2RlWydfY29sdW1ucyddLmxlbmd0aCA6IDE7XG5cbiAgICBub2RlWydfd2l0aCddLmZvckVhY2godyA9PiB3LmFjY2VwdCh0aGlzKSk7XG4gICAgbm9kZVsnX2Zyb21zQW5kSm9pbnMnXS5mb3JFYWNoKGl0ZW0gPT4gdGhpcy5mcm9tTGlrZUFuZEpvaW5BY2NlcHRvci5hY2NlcHQodGhpcywgaXRlbSkpO1xuICAgIG5vZGVbJ19jb2x1bW5zJ10uZm9yRWFjaChjID0+IHRoaXMuY29sdW1uTGlrZUFjY2VwdG9yLmFjY2VwdCh0aGlzLCBjKSk7XG4gICAgaWYgKG5vZGVbJ193aGVyZSddKSB7XG4gICAgICBub2RlWydfd2hlcmUnXS5hY2NlcHQodGhpcyk7XG4gICAgfVxuICAgIGlmIChub2RlWydfZ3JvdXBCeSddLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuaXNHcm91cGVkID0gdHJ1ZTtcbiAgICAgIG5vZGVbJ19ncm91cEJ5J10uZm9yRWFjaChjID0+IGMuYWNjZXB0KHRoaXMpKTtcbiAgICB9XG4gICAgaWYgKG5vZGVbJ19oYXZpbmcnXSAmJiAhdGhpcy5pc0dyb3VwZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSEFWSU5HIGNsYXVzZSByZXF1aXJlcyBHUk9VUCBCWScpO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX2hhdmluZyddKSB7XG4gICAgICBub2RlWydfaGF2aW5nJ10uYWNjZXB0KHRoaXMpO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX3VuaW9uJ10ubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKG5vZGVbJ19jb2x1bW5zJ10ubGVuZ3RoID09PSAwICYmIG5vZGVbJ19mcm9tc0FuZEpvaW5zJ10ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgcXVlcnkgd2l0aCBVTklPTiBzdWJxdWVyaWVzIG11c3QgaGF2ZSBjb2x1bW5zIGFuZCBhIEZST00gY2xhdXNlIGluIHRoZSBtYWluIHF1ZXJ5XCIpO1xuICAgICAgfVxuICAgICAgbGV0IGNvbHVtbkNvdW50cyA9IFtdO1xuICAgICAgaWYgKG5vZGVbJ19jb2x1bW5zJ10ubGVuZ3RoID4gMCkge1xuICAgICAgICBjb2x1bW5Db3VudHMucHVzaChub2RlWydfY29sdW1ucyddLmxlbmd0aCk7IC8vIEluY2x1ZGUgbWFpbiBxdWVyeVxuICAgICAgfVxuICAgICAgY29sdW1uQ291bnRzID0gY29sdW1uQ291bnRzLmNvbmNhdChub2RlWydfdW5pb24nXS5tYXAodSA9PiB1WydfY29sdW1ucyddLmxlbmd0aCB8fCAxKSk7XG4gICAgICBpZiAoY29sdW1uQ291bnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc3QgZmlyc3RDb3VudCA9IGNvbHVtbkNvdW50c1swXTtcbiAgICAgICAgaWYgKGNvbHVtbkNvdW50cy5zb21lKGNvdW50ID0+IGNvdW50ICE9PSBmaXJzdENvdW50KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVU5JT04gcXVlcmllcyBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGNvbHVtbnMnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobm9kZVsnX2ludGVyc2VjdCddLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChub2RlWydfY29sdW1ucyddLmxlbmd0aCA9PT0gMCAmJiBub2RlWydfZnJvbXNBbmRKb2lucyddLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIHF1ZXJ5IHdpdGggSU5URVJTRUNUIHN1YnF1ZXJpZXMgbXVzdCBoYXZlIGNvbHVtbnMgYW5kIGEgRlJPTSBjbGF1c2UgaW4gdGhlIG1haW4gcXVlcnlcIik7XG4gICAgICB9XG4gICAgICBsZXQgY29sdW1uQ291bnRzID0gW107XG4gICAgICBpZiAobm9kZVsnX2NvbHVtbnMnXS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbHVtbkNvdW50cy5wdXNoKG5vZGVbJ19jb2x1bW5zJ10ubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGNvbHVtbkNvdW50cyA9IGNvbHVtbkNvdW50cy5jb25jYXQobm9kZVsnX2ludGVyc2VjdCddLm1hcChpID0+IGlbJ19jb2x1bW5zJ10ubGVuZ3RoIHx8IDEpKTtcbiAgICAgIGlmIChjb2x1bW5Db3VudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBmaXJzdENvdW50ID0gY29sdW1uQ291bnRzWzBdO1xuICAgICAgICBpZiAoY29sdW1uQ291bnRzLnNvbWUoY291bnQgPT4gY291bnQgIT09IGZpcnN0Q291bnQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJTlRFUlNFQ1QgcXVlcmllcyBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGNvbHVtbnMnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbm9kZVsnX2ludGVyc2VjdCddLmZvckVhY2goaSA9PiBpLmFjY2VwdCh0aGlzKSk7XG4gICAgfVxuICAgIGlmIChub2RlWydfZXhjZXB0J10ubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKG5vZGVbJ19jb2x1bW5zJ10ubGVuZ3RoID09PSAwICYmIG5vZGVbJ19mcm9tc0FuZEpvaW5zJ10ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgcXVlcnkgd2l0aCBFWENFUFQgc3VicXVlcmllcyBtdXN0IGhhdmUgY29sdW1ucyBhbmQgYSBGUk9NIGNsYXVzZSBpbiB0aGUgbWFpbiBxdWVyeVwiKTtcbiAgICAgIH1cbiAgICAgIGxldCBjb2x1bW5Db3VudHMgPSBbXTtcbiAgICAgIGlmIChub2RlWydfY29sdW1ucyddLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29sdW1uQ291bnRzLnB1c2gobm9kZVsnX2NvbHVtbnMnXS5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgY29sdW1uQ291bnRzID0gY29sdW1uQ291bnRzLmNvbmNhdChub2RlWydfZXhjZXB0J10ubWFwKGUgPT4gZVsnX2NvbHVtbnMnXS5sZW5ndGggfHwgMSkpO1xuICAgICAgaWYgKGNvbHVtbkNvdW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0Q291bnQgPSBjb2x1bW5Db3VudHNbMF07XG4gICAgICAgIGlmIChjb2x1bW5Db3VudHMuc29tZShjb3VudCA9PiBjb3VudCAhPT0gZmlyc3RDb3VudCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VYQ0VQVCBxdWVyaWVzIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgY29sdW1ucycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBub2RlWydfZXhjZXB0J10uZm9yRWFjaChlID0+IGUuYWNjZXB0KHRoaXMpKTtcbiAgICB9XG4gICAgbm9kZVsnX29yZGVyQnknXS5mb3JFYWNoKG8gPT4gby5hY2NlcHQodGhpcykpO1xuICAgIGlmIChub2RlWydfbGltaXQnXSAhPT0gbnVsbCAmJiBub2RlWydfbGltaXQnXSAhPT0gdW5kZWZpbmVkICYmIG5vZGVbJ19saW1pdCddIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMSU1JVCBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpO1xuICAgIH1cbiAgICBpZiAobm9kZVsnX29mZnNldCddICE9PSBudWxsICYmIG5vZGVbJ19vZmZzZXQnXSAhPT0gdW5kZWZpbmVkICYmIG5vZGVbJ19vZmZzZXQnXSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT0ZGU0VUIG11c3QgYmUgbm9uLW5lZ2F0aXZlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2x1bW5Db3VudCA9IHByZXZDb3VudDsgLy8gUmVzdG9yZSBwYXJlbnQgY29udGV4dCBpZiBuZXN0ZWRcbiAgfVxuXG4gIHZpc2l0VGFibGVGcm9tKG5vZGU6IFRhYmxlRnJvbSk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVJZGVudGlmaWVyKG5vZGUudGFibGVOYW1lLCAnVGFibGVGcm9tJyk7XG4gIH1cblxuICB2aXNpdFN1YnF1ZXJ5RnJvbShub2RlOiBTdWJxdWVyeUZyb20pOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2Q291bnQgPSB0aGlzLmNvbHVtbkNvdW50O1xuICAgIHRoaXMuY29sdW1uQ291bnQgPSBudWxsOyAvLyBSZXNldCBmb3Igc3VicXVlcnlcbiAgICBub2RlLnN1YnF1ZXJ5LmFjY2VwdCh0aGlzKTtcbiAgICB0aGlzLmNvbHVtbkNvdW50ID0gcHJldkNvdW50OyAvLyBSZXN0b3JlIHBhcmVudCBjb3VudFxuICB9XG5cbiAgdmlzaXRKc29uRWFjaEZyb20obm9kZTogSnNvbkVhY2hGcm9tKTogdm9pZCB7XG4gICAgbm9kZS5qc29uRXhwcmVzc2lvbi5hY2NlcHQodGhpcyk7XG4gICAgaWYgKG5vZGUuanNvblBhdGgpIHtcbiAgICAgIG5vZGUuanNvblBhdGguYWNjZXB0KHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0Q29sdW1uKG5vZGU6IENvbHVtbik6IHZvaWQge1xuICAgIGlmIChub2RlLmhhc1RhYmxlTmFtZSgpKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihub2RlLnRhYmxlTmFtZSBhcyBzdHJpbmcsICdDb2x1bW4nKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUlkZW50aWZpZXIobm9kZS5jb2x1bW5OYW1lLCAnQ29sdW1uJyk7XG4gIH1cblxuICB2aXNpdEFsaWFzKG5vZGU6IEFsaWFzPEZyb20gfCBBbGlhc2FibGVFeHByZXNzaW9uPik6IHZvaWQge1xuICAgIGlmICghbm9kZS5hbGlhcyB8fCAhbm9kZS5hbGlhcy50cmltKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWxpYXMgbXVzdCBoYXZlIGEgbm9uLWVtcHR5IG5hbWUnKTtcbiAgICB9XG4gICAgaWYgKG5vZGUucmVmZXJlbnQgaW5zdGFuY2VvZiBKb2luKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQWxpYXMobm9kZS5hbGlhcywgJ0pvaW4nKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUucmVmZXJlbnQgaW5zdGFuY2VvZiBDb2x1bW4pIHtcbiAgICAgIHRoaXMudmFsaWRhdGVBbGlhcyhub2RlLmFsaWFzLCAnQ29sdW1uJyk7XG4gICAgfSBlbHNlIGlmIChub2RlLnJlZmVyZW50IGluc3RhbmNlb2YgVGFibGVGcm9tKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQWxpYXMobm9kZS5hbGlhcywgJ1RhYmxlRnJvbScpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5yZWZlcmVudCBpbnN0YW5jZW9mIFN1YnF1ZXJ5RnJvbSkge1xuICAgICAgdGhpcy52YWxpZGF0ZUFsaWFzKG5vZGUuYWxpYXMsICdTdWJxdWVyeUZyb20nKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUucmVmZXJlbnQgaW5zdGFuY2VvZiBKc29uRWFjaEZyb20pIHtcbiAgICAgIHRoaXMudmFsaWRhdGVBbGlhcyhub2RlLmFsaWFzLCAnSnNvbkVhY2hGcm9tJyk7XG4gICAgfSBlbHNlIGlmIChub2RlLnJlZmVyZW50IGluc3RhbmNlb2YgQWxpYXNhYmxlRXhwcmVzc2lvbikge1xuICAgICAgdGhpcy52YWxpZGF0ZUFsaWFzKG5vZGUuYWxpYXMsICdFeHByZXNzaW9uJyk7XG4gICAgfVxuICAgIG5vZGUucmVmZXJlbnQuYWNjZXB0KHRoaXMpO1xuICB9XG5cbiAgdmlzaXRKb2luQ2xhdXNlKG5vZGU6IEpvaW4pOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlSWRlbnRpZmllcihub2RlLnRhYmxlTmFtZSwgJ0pvaW5DbGF1c2UnKTtcbiAgICBpZiAoIW5vZGUub24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSm9pbkNsYXVzZSBtdXN0IGhhdmUgYW4gT04gY29uZGl0aW9uJyk7XG4gICAgfVxuICAgIG5vZGUub24uYWNjZXB0KHRoaXMpO1xuICB9XG5cbiAgdmlzaXRPcmRlckJ5KG5vZGU6IE9yZGVyQnkpOiB2b2lkIHtcbiAgICBub2RlLmNvbHVtbi5hY2NlcHQodGhpcyk7XG4gIH1cblxuICB2aXNpdFdpdGhDbGF1c2Uobm9kZTogV2l0aCk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVJZGVudGlmaWVyKG5vZGUubmFtZSwgJ1dpdGhDbGF1c2UnKTtcbiAgICBjb25zdCBwcmV2Q291bnQgPSB0aGlzLmNvbHVtbkNvdW50O1xuICAgIHRoaXMuY29sdW1uQ291bnQgPSBudWxsOyAvLyBSZXNldCBmb3Igc3VicXVlcnlcbiAgICBub2RlLnF1ZXJ5LmFjY2VwdCh0aGlzKTtcbiAgICB0aGlzLmNvbHVtbkNvdW50ID0gcHJldkNvdW50OyAvLyBSZXN0b3JlIHBhcmVudCBjb3VudFxuICB9XG5cbiAgdmlzaXRCaW5hcnlFeHByZXNzaW9uKG5vZGU6IEJpbmFyeUV4cHJlc3Npb24pOiB2b2lkIHtcbiAgICBpZiAoIW5vZGUub3BlcmF0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQmluYXJ5RXhwcmVzc2lvbiBtdXN0IGhhdmUgYSB2YWxpZCBvcGVyYXRvcicpO1xuICAgIH1cbiAgICBpZiAoIW5vZGUubGVmdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaW5hcnlFeHByZXNzaW9uIG11c3QgaGF2ZSBhIHZhbGlkIGxlZnQgb3BlcmFuZCcpO1xuICAgIH1cbiAgICBpZiAoIW5vZGUucmlnaHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQmluYXJ5RXhwcmVzc2lvbiBtdXN0IGhhdmUgYSB2YWxpZCByaWdodCBvcGVyYW5kJyk7XG4gICAgfVxuICAgIG5vZGUubGVmdC5hY2NlcHQodGhpcyk7XG4gICAgbm9kZS5yaWdodC5hY2NlcHQodGhpcyk7XG4gIH1cblxuICB2aXNpdEJldHdlZW5FeHByZXNzaW9uKG5vZGU6IEJldHdlZW5FeHByZXNzaW9uKTogdm9pZCB7XG4gICAgaWYgKCFub2RlLm9wZXJhbmQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQmV0d2VlbkV4cHJlc3Npb24gbXVzdCBoYXZlIGEgdmFsaWQgb3BlcmFuZCcpO1xuICAgIH1cbiAgICBpZiAoIW5vZGUubG93KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JldHdlZW5FeHByZXNzaW9uIG11c3QgaGF2ZSBhIHZhbGlkIGxvdyBib3VuZCcpO1xuICAgIH1cbiAgICBpZiAoIW5vZGUuaGlnaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCZXR3ZWVuRXhwcmVzc2lvbiBtdXN0IGhhdmUgYSB2YWxpZCBoaWdoIGJvdW5kJyk7XG4gICAgfVxuICAgIG5vZGUub3BlcmFuZC5hY2NlcHQodGhpcyk7XG4gICAgbm9kZS5sb3cuYWNjZXB0KHRoaXMpO1xuICAgIG5vZGUuaGlnaC5hY2NlcHQodGhpcyk7XG4gIH1cblxuICB2aXNpdFVuYXJ5RXhwcmVzc2lvbihub2RlOiBVbmFyeUV4cHJlc3Npb24pOiB2b2lkIHtcbiAgICBpZiAoIW5vZGUub3BlcmF0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hcnlFeHByZXNzaW9uIG11c3QgaGF2ZSBhIHZhbGlkIG9wZXJhdG9yJyk7XG4gICAgfVxuICAgIGlmICghbm9kZS5vcGVyYW5kKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYXJ5RXhwcmVzc2lvbiBtdXN0IGhhdmUgYSB2YWxpZCBvcGVyYW5kJyk7XG4gICAgfVxuICAgIG5vZGUub3BlcmFuZC5hY2NlcHQodGhpcyk7XG4gIH1cblxuICB2aXNpdEluRXhwcmVzc2lvbihub2RlOiBJbkV4cHJlc3Npb24pOiB2b2lkIHtcbiAgICBpZiAobm9kZS5sZWZ0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJTiBleHByZXNzaW9uIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbGVmdCBleHByZXNzaW9uJyk7XG4gICAgfVxuICAgIG5vZGUubGVmdC5mb3JFYWNoKGwgPT4gbC5hY2NlcHQodGhpcykpO1xuICAgIGlmIChub2RlLnZhbHVlcyBpbnN0YW5jZW9mIFNlbGVjdFF1ZXJ5KSB7XG4gICAgICBub2RlLnZhbHVlcy5hY2NlcHQodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChub2RlLnZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJTiBleHByZXNzaW9uIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgdmFsdWUgc2V0Jyk7XG4gICAgICB9XG4gICAgICBub2RlLnZhbHVlcy5mb3JFYWNoKHNldCA9PiB7XG4gICAgICAgIGlmIChzZXQubGVuZ3RoICE9PSBub2RlLmxlZnQubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBzZXRzIGluIElOIGV4cHJlc3Npb24gbXVzdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGxlZnQgZXhwcmVzc2lvbnMnKTtcbiAgICAgICAgfVxuICAgICAgICBzZXQuZm9yRWFjaCh2ID0+IHYuYWNjZXB0KHRoaXMpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0Q29uY2F0KG5vZGU6IENvbmNhdCk6IHZvaWQge1xuICAgIGlmIChub2RlLmV4cHJlc3Npb25zLmxlbmd0aCA8IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uY2F0IG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZXhwcmVzc2lvbnMnKTtcbiAgICB9XG4gICAgbm9kZS5leHByZXNzaW9ucy5mb3JFYWNoKGUgPT4gZS5hY2NlcHQodGhpcykpO1xuICB9XG5cbiAgdmlzaXRDYXNlRXhwcmVzc2lvbihub2RlOiBDYXNlRXhwcmVzc2lvbik6IHZvaWQge1xuICAgIGlmIChub2RlLmNhc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYXNlRXhwcmVzc2lvbiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIFdIRU4vVEhFTiBwYWlyJyk7XG4gICAgfVxuICAgIG5vZGUuY2FzZXMuZm9yRWFjaChjID0+IHtcbiAgICAgIGMud2hlbi5hY2NlcHQodGhpcyk7XG4gICAgICBjLnRoZW4uYWNjZXB0KHRoaXMpO1xuICAgIH0pO1xuICAgIGlmIChub2RlLmVsc2UpIHtcbiAgICAgIG5vZGUuZWxzZS5hY2NlcHQodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgdmlzaXRDYXN0RXhwcmVzc2lvbihub2RlOiBDYXN0RXhwcmVzc2lvbik6IHZvaWQge1xuICAgIG5vZGUuZXhwcmVzc2lvbi5hY2NlcHQodGhpcyk7XG4gIH1cblxuICB2aXNpdENvbGxhdGVFeHByZXNzaW9uKG5vZGU6IENvbGxhdGVFeHByZXNzaW9uKTogdm9pZCB7XG4gICAgbm9kZS5leHByZXNzaW9uLmFjY2VwdCh0aGlzKTtcbiAgfVxuXG4gIHZpc2l0U3VicXVlcnlFeHByZXNzaW9uKG5vZGU6IFN1YnF1ZXJ5RXhwcmVzc2lvbik6IHZvaWQge1xuICAgIG5vZGUuc3VicXVlcnkuYWNjZXB0KHRoaXMpO1xuICB9XG5cbiAgdmlzaXRXaW5kb3dFeHByZXNzaW9uKG5vZGU6IFdpbmRvd0V4cHJlc3Npb24pOiB2b2lkIHtcbiAgICAvLyBWYWxpZGF0ZSB0aGUgdW5kZXJseWluZyBmdW5jdGlvblxuICAgIG5vZGUuZnVuY3Rpb24uYWNjZXB0KHRoaXMpO1xuICAgIC8vIFZhbGlkYXRlIHBhcnRpdGlvbiBieSBjb2x1bW5zXG4gICAgbm9kZS53aW5kb3dTcGVjLnBhcnRpdGlvbkJ5Q29sdW1ucy5mb3JFYWNoKGMgPT4gYy5hY2NlcHQodGhpcykpO1xuICAgIC8vIFZhbGlkYXRlIG9yZGVyIGJ5IGNsYXVzZXNcbiAgICBub2RlLndpbmRvd1NwZWMub3JkZXJCeUNvbHVtbnMuZm9yRWFjaChvID0+IG8uYWNjZXB0KHRoaXMpKTtcbiAgfVxuXG4gIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKG5vZGU6IEZ1bmN0aW9uRXhwcmVzc2lvbik6IHZvaWQge1xuICAgIGNvbnN0IG5vQXJnRnVuY3Rpb25zID0gWydSQU5ET00nXTtcbiAgICBpZiAoIW5vQXJnRnVuY3Rpb25zLmluY2x1ZGVzKG5vZGUubmFtZSkgJiYgbm9kZS5hcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGdW5jdGlvbiAke25vZGUubmFtZX0gcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50YCk7XG4gICAgfVxuICAgIG5vZGUuYXJncy5mb3JFYWNoKGEgPT4gYS5hY2NlcHQodGhpcykpO1xuICB9XG5cbiAgdmlzaXRQYXJhbUV4cHJlc3Npb24oX25vZGU6IFBhcmFtKTogdm9pZCB7XG4gICAgLy8gTm8gc3BlY2lmaWMgdmFsaWRhdGlvbiBuZWVkZWRcbiAgfVxuXG4gIHZpc2l0U3RyaW5nTGl0ZXJhbChub2RlOiBTdHJpbmdMaXRlcmFsKTogdm9pZCB7XG4gICAgaWYgKG5vZGUudmFsdWUgPT09IG51bGwgfHwgbm9kZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0cmluZ0xpdGVyYWwgdmFsdWUgY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICB9XG5cbiAgdmlzaXROdW1iZXJMaXRlcmFsKG5vZGU6IE51bWJlckxpdGVyYWwpOiB2b2lkIHtcbiAgICBpZiAoaXNOYU4obm9kZS52YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTnVtYmVyTGl0ZXJhbCB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgbnVtYmVyJyk7XG4gICAgfVxuICB9XG5cbiAgdmlzaXROdWxsTGl0ZXJhbChfbm9kZTogTnVsbExpdGVyYWwpOiB2b2lkIHtcbiAgICAvLyBObyBzcGVjaWZpYyB2YWxpZGF0aW9uIG5lZWRlZFxuICB9XG5cbiAgdmlzaXRFeGlzdHNFeHByZXNzaW9uKG5vZGU6IEV4aXN0c0V4cHJlc3Npb24pOiB2b2lkIHtcbiAgICBpZiAoIW5vZGUuc3VicXVlcnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhpc3RzRXhwcmVzc2lvbiBtdXN0IGhhdmUgYSB2YWxpZCBzdWJxdWVyeScpO1xuICAgIH1cbiAgICBjb25zdCBwcmV2Q291bnQgPSB0aGlzLmNvbHVtbkNvdW50O1xuICAgIHRoaXMuY29sdW1uQ291bnQgPSBudWxsOyAvLyBSZXNldCBmb3Igc3VicXVlcnlcbiAgICBub2RlLnN1YnF1ZXJ5LmFjY2VwdCh0aGlzKTtcbiAgICB0aGlzLmNvbHVtbkNvdW50ID0gcHJldkNvdW50OyAvLyBSZXN0b3JlIHBhcmVudCBjb3VudFxuICB9XG59XG4iXX0=
@@ -1,6 +1,15 @@
1
+ import { AlterTableQuery } from "../ast/AlterTableQuery";
2
+ import { CreateIndexQuery } from "../ast/CreateIndexQuery";
3
+ import { CreateTableQuery } from "../ast/CreateTableQuery";
4
+ import { CreateViewQuery } from "../ast/CreateViewQuery";
5
+ import { DeleteQuery } from "../ast/DeleteQuery";
6
+ import { DropIndexQuery } from "../ast/DropIndexQuery";
7
+ import { DropTableQuery } from "../ast/DropTableQuery";
8
+ import { DropViewQuery } from "../ast/DropViewQuery";
1
9
  import { InsertQuery } from "../ast/InsertQuery";
10
+ import { UpdateQuery } from "../ast/UpdateQuery";
2
11
  import { SelectQuery } from "../ast/SelectQuery";
3
12
  import { SqlTreeNodeVisitor } from "../visitor/SqlTreeNodeVisitor";
4
13
  export interface QueryValidator extends SqlTreeNodeVisitor<void> {
5
- validate(node: SelectQuery | InsertQuery): void;
14
+ validate(node: SelectQuery | InsertQuery | UpdateQuery | DeleteQuery | CreateTableQuery | CreateIndexQuery | CreateViewQuery | AlterTableQuery | DropTableQuery | DropIndexQuery | DropViewQuery): void;
6
15
  }
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVlcnlWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmFsaWRhdGUvUXVlcnlWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluc2VydFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9JbnNlcnRRdWVyeVwiO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnkgfSBmcm9tIFwiLi4vYXN0L1NlbGVjdFF1ZXJ5XCI7XG5pbXBvcnQgeyBTcWxUcmVlTm9kZVZpc2l0b3IgfSBmcm9tIFwiLi4vdmlzaXRvci9TcWxUcmVlTm9kZVZpc2l0b3JcIjtcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeVZhbGlkYXRvciBleHRlbmRzIFNxbFRyZWVOb2RlVmlzaXRvcjx2b2lkPiB7XG4gIHZhbGlkYXRlKG5vZGU6IFNlbGVjdFF1ZXJ5IHwgSW5zZXJ0UXVlcnkpOiB2b2lkO1xufVxuIl19
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVlcnlWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmFsaWRhdGUvUXVlcnlWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFsdGVyVGFibGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvQWx0ZXJUYWJsZVF1ZXJ5XCI7XG5pbXBvcnQgeyBDcmVhdGVJbmRleFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9DcmVhdGVJbmRleFF1ZXJ5XCI7XG5pbXBvcnQgeyBDcmVhdGVUYWJsZVF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9DcmVhdGVUYWJsZVF1ZXJ5XCI7XG5pbXBvcnQgeyBDcmVhdGVWaWV3UXVlcnkgfSBmcm9tIFwiLi4vYXN0L0NyZWF0ZVZpZXdRdWVyeVwiO1xuaW1wb3J0IHsgRGVsZXRlUXVlcnkgfSBmcm9tIFwiLi4vYXN0L0RlbGV0ZVF1ZXJ5XCI7XG5pbXBvcnQgeyBEcm9wSW5kZXhRdWVyeSB9IGZyb20gXCIuLi9hc3QvRHJvcEluZGV4UXVlcnlcIjtcbmltcG9ydCB7IERyb3BUYWJsZVF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9Ecm9wVGFibGVRdWVyeVwiO1xuaW1wb3J0IHsgRHJvcFZpZXdRdWVyeSB9IGZyb20gXCIuLi9hc3QvRHJvcFZpZXdRdWVyeVwiO1xuaW1wb3J0IHsgSW5zZXJ0UXVlcnkgfSBmcm9tIFwiLi4vYXN0L0luc2VydFF1ZXJ5XCI7XG5pbXBvcnQgeyBVcGRhdGVRdWVyeSB9IGZyb20gXCIuLi9hc3QvVXBkYXRlUXVlcnlcIjtcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5IH0gZnJvbSBcIi4uL2FzdC9TZWxlY3RRdWVyeVwiO1xuaW1wb3J0IHsgU3FsVHJlZU5vZGVWaXNpdG9yIH0gZnJvbSBcIi4uL3Zpc2l0b3IvU3FsVHJlZU5vZGVWaXNpdG9yXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlWYWxpZGF0b3IgZXh0ZW5kcyBTcWxUcmVlTm9kZVZpc2l0b3I8dm9pZD4ge1xuICB2YWxpZGF0ZShub2RlOiBTZWxlY3RRdWVyeSB8IEluc2VydFF1ZXJ5IHwgVXBkYXRlUXVlcnkgfCBEZWxldGVRdWVyeSB8IENyZWF0ZVRhYmxlUXVlcnkgfCBDcmVhdGVJbmRleFF1ZXJ5IHwgQ3JlYXRlVmlld1F1ZXJ5IHwgQWx0ZXJUYWJsZVF1ZXJ5IHwgRHJvcFRhYmxlUXVlcnkgfCBEcm9wSW5kZXhRdWVyeSB8IERyb3BWaWV3UXVlcnkpOiB2b2lkO1xufVxuIl19
@@ -1,4 +1,14 @@
1
+ import { AlterTableQuery } from "../ast/AlterTableQuery";
2
+ import { CreateIndexQuery } from "../ast/CreateIndexQuery";
3
+ import { CreateTableQuery } from "../ast/CreateTableQuery";
4
+ import { CreateVirtualTableQuery } from "../ast/CreateVirtualTableQuery";
5
+ import { CreateViewQuery } from "../ast/CreateViewQuery";
6
+ import { DeleteQuery } from "../ast/DeleteQuery";
7
+ import { DropIndexQuery } from "../ast/DropIndexQuery";
8
+ import { DropTableQuery } from "../ast/DropTableQuery";
9
+ import { DropViewQuery } from "../ast/DropViewQuery";
1
10
  import { JsonEachFrom, TableFrom } from "../ast/From";
11
+ import { UpdateQuery } from "../ast/UpdateQuery";
2
12
  import { FunctionExpression } from "../ast/FunctionExpression";
3
13
  import { InExpression } from "../ast/InExpression";
4
14
  import { InsertQuery } from "../ast/InsertQuery";
@@ -9,13 +19,16 @@ import { With } from "../ast/With";
9
19
  import { SqlTreeNodeVisitor } from "../visitor/SqlTreeNodeVisitor";
10
20
  import { CommonQueryValidator } from "./CommonQueryValidator";
11
21
  import { QueryValidator } from "./QueryValidator";
22
+ type ValidatableQuery = SelectQuery | InsertQuery | UpdateQuery | DeleteQuery | CreateTableQuery | CreateVirtualTableQuery | CreateIndexQuery | CreateViewQuery | AlterTableQuery | DropTableQuery | DropIndexQuery | DropViewQuery;
12
23
  export declare class SQLiteQueryValidator extends CommonQueryValidator implements QueryValidator, SqlTreeNodeVisitor<void> {
13
24
  private supportedFunctions;
14
25
  private supportedUnaryOperators;
15
26
  private isWithRecursive;
16
- validate(query: SelectQuery | InsertQuery): void;
27
+ validate(query: ValidatableQuery): void;
17
28
  protected reset(): void;
18
29
  visitInsertQuery(node: InsertQuery): void;
30
+ visitDeleteQuery(node: DeleteQuery): void;
31
+ visitUpdateQuery(node: UpdateQuery): void;
19
32
  visitSelectQuery(node: SelectQuery): void;
20
33
  visitJoinClause(node: Join): void;
21
34
  visitWithClause(node: With): void;
@@ -24,4 +37,6 @@ export declare class SQLiteQueryValidator extends CommonQueryValidator implement
24
37
  visitJsonEachFrom(node: JsonEachFrom): void;
25
38
  visitUnaryExpression(node: UnaryExpression): void;
26
39
  visitInExpression(node: InExpression): void;
40
+ visitCreateVirtualTableQuery(node: CreateVirtualTableQuery): void;
27
41
  }
42
+ export {};