@uql/core 0.4.95 → 1.0.2

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 (54) hide show
  1. package/README.md +4 -1
  2. package/dialect/abstractSqlDialect.js +55 -56
  3. package/dialect/index.d.ts +4 -4
  4. package/dialect/index.js +5 -8
  5. package/dialect/mysqlDialect.d.ts +2 -2
  6. package/dialect/mysqlDialect.js +5 -9
  7. package/dialect/postgresDialect.d.ts +1 -1
  8. package/dialect/postgresDialect.js +6 -10
  9. package/dialect/sqliteDialect.d.ts +1 -1
  10. package/dialect/sqliteDialect.js +3 -7
  11. package/entity/decorator/definition.js +18 -28
  12. package/entity/decorator/entity.js +4 -8
  13. package/entity/decorator/field.js +4 -8
  14. package/entity/decorator/id.js +4 -8
  15. package/entity/decorator/index.d.ts +5 -5
  16. package/entity/decorator/index.js +6 -12
  17. package/entity/decorator/relation.js +7 -14
  18. package/entity/index.d.ts +1 -1
  19. package/entity/index.js +2 -5
  20. package/index.d.ts +1 -1
  21. package/index.js +2 -5
  22. package/options.js +7 -14
  23. package/package.json +4 -3
  24. package/querier/abstractQuerier.js +19 -23
  25. package/querier/abstractSqlQuerier.d.ts +1 -1
  26. package/querier/abstractSqlQuerier.js +13 -16
  27. package/querier/decorator/index.js +3 -6
  28. package/querier/decorator/injectQuerier.js +3 -8
  29. package/querier/decorator/transactional.js +6 -10
  30. package/querier/index.js +4 -7
  31. package/repository/genericRepository.js +4 -6
  32. package/repository/index.js +2 -5
  33. package/type/entity.d.ts +2 -2
  34. package/type/entity.js +2 -5
  35. package/type/index.d.ts +7 -7
  36. package/type/index.js +8 -11
  37. package/type/querier.d.ts +5 -5
  38. package/type/querier.js +2 -3
  39. package/type/querierPool.d.ts +1 -1
  40. package/type/querierPool.js +2 -3
  41. package/type/query.d.ts +2 -2
  42. package/type/query.js +4 -6
  43. package/type/repository.d.ts +3 -3
  44. package/type/repository.js +2 -3
  45. package/type/universalQuerier.d.ts +4 -4
  46. package/type/universalQuerier.js +2 -3
  47. package/type/utility.js +1 -2
  48. package/util/dialect.util.js +19 -33
  49. package/util/index.d.ts +5 -5
  50. package/util/index.js +6 -9
  51. package/util/object.util.js +4 -10
  52. package/util/raw.js +4 -8
  53. package/util/sql.util.js +7 -12
  54. package/util/string.util.js +4 -10
package/README.md CHANGED
@@ -21,6 +21,9 @@ The `uql` queries can be safely written in the frontend (browser/mobile) and sen
21
21
 
22
22
  ### <a name="installation"></a> Installation
23
23
 
24
+ This package is a [Pure ESM package](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c):
25
+ Node 12+ is needed to use it and it must be `import`ed instead of `require`d.
26
+
24
27
  1. Install the core package:
25
28
 
26
29
  ```sh
@@ -155,7 +158,7 @@ export class MeasureUnit {
155
158
 
156
159
  ```ts
157
160
  import { getQuerier } from '@uql/core';
158
- import { User } from './entity';
161
+ import { User } from './entity.js';
159
162
 
160
163
  const querier = await getQuerier();
161
164
 
@@ -1,19 +1,19 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AbstractSqlDialect = void 0;
4
- const sqlstring_1 = require("sqlstring");
5
- const entity_1 = require("@uql/core/entity");
6
- const util_1 = require("@uql/core/util");
7
- const type_1 = require("@uql/core/type");
8
- class AbstractSqlDialect {
1
+ import { escape } from 'sqlstring';
2
+ import { getMeta } from '@uql/core/entity';
3
+ import { getPersistable, getProjectRelationKeys, getPersistables, isProjectingRelations, getKeys, hasKeys, buildSortMap, flatObject, getRawValue, raw, getQueryFilterAsMap, getFieldCallbackValue, } from '@uql/core/util';
4
+ import { QueryRaw, } from '@uql/core/type';
5
+ export class AbstractSqlDialect {
6
+ escapeIdChar;
7
+ beginTransactionCommand;
8
+ escapeIdRegex;
9
9
  constructor(escapeIdChar, beginTransactionCommand) {
10
10
  this.escapeIdChar = escapeIdChar;
11
11
  this.beginTransactionCommand = beginTransactionCommand;
12
12
  this.escapeIdRegex = RegExp(escapeIdChar, 'g');
13
13
  }
14
14
  criteria(entity, qm, opts = {}) {
15
- const meta = (0, entity_1.getMeta)(entity);
16
- const prefix = opts.prefix ?? (opts.autoPrefix || (0, util_1.isProjectingRelations)(meta, qm.$project)) ? meta.name : undefined;
15
+ const meta = getMeta(entity);
16
+ const prefix = opts.prefix ?? (opts.autoPrefix || isProjectingRelations(meta, qm.$project)) ? meta.name : undefined;
17
17
  const where = this.where(entity, qm.$filter, { ...opts, prefix });
18
18
  const group = this.group(entity, qm.$group, { ...opts, prefix });
19
19
  const having = this.where(entity, qm.$having, { ...opts, prefix, clause: 'HAVING' });
@@ -22,7 +22,7 @@ class AbstractSqlDialect {
22
22
  return where + group + having + sort + pager;
23
23
  }
24
24
  projectFields(entity, project, opts = {}) {
25
- const meta = (0, entity_1.getMeta)(entity);
25
+ const meta = getMeta(entity);
26
26
  const prefix = opts.prefix ? opts.prefix + '.' : '';
27
27
  const escapedPrefix = this.escapeId(opts.prefix, true, true);
28
28
  let fields;
@@ -31,29 +31,29 @@ class AbstractSqlDialect {
31
31
  fields = project;
32
32
  }
33
33
  else {
34
- const positiveProjectKeys = (0, util_1.getKeys)(project).filter((key) => project[key]);
34
+ const positiveProjectKeys = getKeys(project).filter((key) => project[key]);
35
35
  fields = positiveProjectKeys.length
36
36
  ? positiveProjectKeys.map((key) => {
37
37
  const val = project[key];
38
- if (val instanceof type_1.QueryRaw) {
39
- return (0, util_1.raw)(val.value, key);
38
+ if (val instanceof QueryRaw) {
39
+ return raw(val.value, key);
40
40
  }
41
41
  return key;
42
42
  })
43
- : (0, util_1.getKeys)(meta.fields).filter((key) => !(key in project));
43
+ : getKeys(meta.fields).filter((key) => !(key in project));
44
44
  }
45
- fields = fields.filter((key) => key instanceof type_1.QueryRaw || meta.fields[key]);
45
+ fields = fields.filter((key) => key instanceof QueryRaw || meta.fields[key]);
46
46
  if (!fields.length || (opts.prefix && !fields.includes(meta.id))) {
47
47
  fields = [meta.id, ...fields];
48
48
  }
49
49
  }
50
50
  else {
51
- fields = (0, util_1.getKeys)(meta.fields);
51
+ fields = getKeys(meta.fields);
52
52
  }
53
53
  return fields
54
54
  .map((key) => {
55
- if (key instanceof type_1.QueryRaw) {
56
- return (0, util_1.getRawValue)({
55
+ if (key instanceof QueryRaw) {
56
+ return getRawValue({
57
57
  value: key,
58
58
  dialect: this,
59
59
  prefix,
@@ -63,8 +63,8 @@ class AbstractSqlDialect {
63
63
  }
64
64
  const field = meta.fields[key];
65
65
  if (field.virtual) {
66
- return (0, util_1.getRawValue)({
67
- value: (0, util_1.raw)(field.virtual.value, key),
66
+ return getRawValue({
67
+ value: raw(field.virtual.value, key),
68
68
  dialect: this,
69
69
  prefix,
70
70
  escapedPrefix,
@@ -78,8 +78,8 @@ class AbstractSqlDialect {
78
78
  .join(', ');
79
79
  }
80
80
  projectRelations(entity, project = {}, { prefix } = {}) {
81
- const meta = (0, entity_1.getMeta)(entity);
82
- const relations = (0, util_1.getProjectRelationKeys)(meta, project);
81
+ const meta = getMeta(entity);
82
+ const relations = getProjectRelationKeys(meta, project);
83
83
  const isProjectArray = Array.isArray(project);
84
84
  let fields = '';
85
85
  let tables = '';
@@ -102,7 +102,7 @@ class AbstractSqlDialect {
102
102
  prefix: joinRelAlias,
103
103
  });
104
104
  fields += subColumns;
105
- const relMeta = (0, entity_1.getMeta)(relEntity);
105
+ const relMeta = getMeta(relEntity);
106
106
  const relEntityName = this.escapeId(relMeta.name);
107
107
  const relPath = prefix ? this.escapeId(prefix, true) : this.escapeId(meta.name);
108
108
  const joinType = relQuery.$required ? 'INNER' : 'LEFT';
@@ -118,16 +118,16 @@ class AbstractSqlDialect {
118
118
  return { fields, tables };
119
119
  }
120
120
  select(entity, qm, opts = {}) {
121
- const meta = (0, entity_1.getMeta)(entity);
122
- const prefix = opts.prefix ?? (opts.autoPrefix || (0, util_1.isProjectingRelations)(meta, qm.$project)) ? meta.name : undefined;
121
+ const meta = getMeta(entity);
122
+ const prefix = opts.prefix ?? (opts.autoPrefix || isProjectingRelations(meta, qm.$project)) ? meta.name : undefined;
123
123
  const fields = this.projectFields(entity, qm.$project, { prefix });
124
124
  const { fields: relationFields, tables } = this.projectRelations(entity, qm.$project);
125
125
  return `SELECT ${fields}${relationFields} FROM ${this.escapeId(meta.name)}${tables}`;
126
126
  }
127
127
  where(entity, filter = {}, opts = {}) {
128
- const meta = (0, entity_1.getMeta)(entity);
128
+ const meta = getMeta(entity);
129
129
  const { usePrecedence, clause = 'WHERE', softDelete } = opts;
130
- filter = (0, util_1.getQueryFilterAsMap)(meta, filter);
130
+ filter = getQueryFilterAsMap(meta, filter);
131
131
  if (meta.softDelete && (softDelete || softDelete === undefined) && clause !== 'HAVING' && !filter[meta.softDelete]) {
132
132
  filter[meta.softDelete] = null;
133
133
  }
@@ -143,11 +143,11 @@ class AbstractSqlDialect {
143
143
  return clause ? ` ${clause} ${sql}` : sql;
144
144
  }
145
145
  compare(entity, key, val, opts) {
146
- const meta = (0, entity_1.getMeta)(entity);
147
- if (val instanceof type_1.QueryRaw) {
146
+ const meta = getMeta(entity);
147
+ if (val instanceof QueryRaw) {
148
148
  if (key === '$exists' || key === '$nexists') {
149
149
  const value = val;
150
- const query = (0, util_1.getRawValue)({
150
+ const query = getRawValue({
151
151
  value,
152
152
  dialect: this,
153
153
  prefix: meta.name,
@@ -174,8 +174,8 @@ class AbstractSqlDialect {
174
174
  const hasManyItems = values.length > 1;
175
175
  const logicalComparison = values
176
176
  .map((filterEntry) => {
177
- if (filterEntry instanceof type_1.QueryRaw) {
178
- return (0, util_1.getRawValue)({
177
+ if (filterEntry instanceof QueryRaw) {
178
+ return getRawValue({
179
179
  value: filterEntry,
180
180
  dialect: this,
181
181
  prefix: opts.prefix,
@@ -184,7 +184,7 @@ class AbstractSqlDialect {
184
184
  }
185
185
  return this.where(entity, filterEntry, {
186
186
  prefix: opts.prefix,
187
- usePrecedence: hasManyItems && !Array.isArray(filterEntry) && (0, util_1.getKeys)(filterEntry).length > 1,
187
+ usePrecedence: hasManyItems && !Array.isArray(filterEntry) && getKeys(filterEntry).length > 1,
188
188
  clause: false,
189
189
  });
190
190
  })
@@ -192,7 +192,7 @@ class AbstractSqlDialect {
192
192
  return (opts.usePrecedence || negate) && hasManyItems ? `${negate}(${logicalComparison})` : `${negate}${logicalComparison}`;
193
193
  }
194
194
  const value = Array.isArray(val) ? { $in: val } : typeof val === 'object' && val !== null ? val : { $eq: val };
195
- const operators = (0, util_1.getKeys)(value);
195
+ const operators = getKeys(value);
196
196
  const comparisons = operators.map((op) => this.compareFieldOperator(entity, key, op, value[op], opts)).join(' AND ');
197
197
  return operators.length > 1 ? `(${comparisons})` : comparisons;
198
198
  }
@@ -240,11 +240,11 @@ class AbstractSqlDialect {
240
240
  }
241
241
  }
242
242
  getComparisonKey(entity, key, { prefix } = {}) {
243
- const meta = (0, entity_1.getMeta)(entity);
243
+ const meta = getMeta(entity);
244
244
  const escapedPrefix = this.escapeId(prefix, true, true);
245
245
  const field = meta.fields[key];
246
246
  if (field?.virtual) {
247
- return (0, util_1.getRawValue)({
247
+ return getRawValue({
248
248
  value: field.virtual,
249
249
  dialect: this,
250
250
  prefix,
@@ -257,17 +257,17 @@ class AbstractSqlDialect {
257
257
  if (!fields?.length) {
258
258
  return '';
259
259
  }
260
- const meta = (0, entity_1.getMeta)(entity);
260
+ const meta = getMeta(entity);
261
261
  const names = fields.map((key) => this.escapeId(meta.fields[key]?.name ?? key)).join(', ');
262
262
  return ` GROUP BY ${names}`;
263
263
  }
264
264
  sort(entity, sort, { prefix } = {}) {
265
- const sortMap = (0, util_1.buildSortMap)(sort);
266
- if (!(0, util_1.hasKeys)(sortMap)) {
265
+ const sortMap = buildSortMap(sort);
266
+ if (!hasKeys(sortMap)) {
267
267
  return '';
268
268
  }
269
- const meta = (0, entity_1.getMeta)(entity);
270
- const flattenedSort = (0, util_1.flatObject)(sortMap, prefix);
269
+ const meta = getMeta(entity);
270
+ const flattenedSort = flatObject(sortMap, prefix);
271
271
  const directionMap = { 1: '', asc: '', '-1': ' DESC', desc: ' DESC' };
272
272
  const order = Object.entries(flattenedSort)
273
273
  .map(([key, sort]) => {
@@ -291,7 +291,7 @@ class AbstractSqlDialect {
291
291
  count(entity, qm, opts) {
292
292
  const search = {
293
293
  ...qm,
294
- $project: [(0, util_1.raw)('COUNT(*)', 'count')],
294
+ $project: [raw('COUNT(*)', 'count')],
295
295
  };
296
296
  delete search.$sort;
297
297
  delete search.$skip;
@@ -306,27 +306,27 @@ class AbstractSqlDialect {
306
306
  return select + criteria;
307
307
  }
308
308
  insert(entity, payload) {
309
- const meta = (0, entity_1.getMeta)(entity);
310
- const records = (0, util_1.getPersistables)(meta, payload, 'onInsert');
311
- const keys = (0, util_1.getKeys)(records[0]);
309
+ const meta = getMeta(entity);
310
+ const records = getPersistables(meta, payload, 'onInsert');
311
+ const keys = getKeys(records[0]);
312
312
  const columns = keys.map((key) => this.escapeId(meta.fields[key].name));
313
313
  const values = records.map((record) => keys.map((key) => this.escape(record[key])).join(', ')).join('), (');
314
314
  return `INSERT INTO ${this.escapeId(meta.name)} (${columns.join(', ')}) VALUES (${values})`;
315
315
  }
316
316
  update(entity, qm, payload, opts) {
317
- const meta = (0, entity_1.getMeta)(entity);
318
- const record = (0, util_1.getPersistable)(meta, payload, 'onUpdate');
319
- const keys = (0, util_1.getKeys)(record);
317
+ const meta = getMeta(entity);
318
+ const record = getPersistable(meta, payload, 'onUpdate');
319
+ const keys = getKeys(record);
320
320
  const entries = keys.map((key) => `${this.escapeId(key)} = ${this.escape(payload[key])}`).join(', ');
321
321
  const criteria = this.criteria(entity, qm, opts);
322
322
  return `UPDATE ${this.escapeId(meta.name)} SET ${entries}${criteria}`;
323
323
  }
324
324
  delete(entity, qm, opts = {}) {
325
- const meta = (0, entity_1.getMeta)(entity);
325
+ const meta = getMeta(entity);
326
326
  if (opts.softDelete || opts.softDelete === undefined) {
327
327
  if (meta.softDelete) {
328
328
  const criteria = this.criteria(entity, qm, opts);
329
- const value = (0, util_1.getFieldCallbackValue)(meta.fields[meta.softDelete].onDelete);
329
+ const value = getFieldCallbackValue(meta.fields[meta.softDelete].onDelete);
330
330
  return `UPDATE ${this.escapeId(meta.name)} SET ${this.escapeId(meta.softDelete)} = ${this.escape(value)}${criteria}`;
331
331
  }
332
332
  else if (opts.softDelete) {
@@ -352,11 +352,10 @@ class AbstractSqlDialect {
352
352
  return escaped + suffix;
353
353
  }
354
354
  escape(value) {
355
- if (value instanceof type_1.QueryRaw) {
356
- return (0, util_1.getRawValue)({ value, dialect: this });
355
+ if (value instanceof QueryRaw) {
356
+ return getRawValue({ value, dialect: this });
357
357
  }
358
- return (0, sqlstring_1.escape)(value);
358
+ return escape(value);
359
359
  }
360
360
  }
361
- exports.AbstractSqlDialect = AbstractSqlDialect;
362
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RTcWxEaWFsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpYWxlY3QvYWJzdHJhY3RTcWxEaWFsZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUFtQztBQUNuQyw2Q0FBMkM7QUFDM0MseUNBYXdCO0FBRXhCLHlDQXVCd0I7QUFFeEIsTUFBc0Isa0JBQWtCO0lBR3RDLFlBQXFCLFlBQXVCLEVBQVcsdUJBQStCO1FBQWpFLGlCQUFZLEdBQVosWUFBWSxDQUFXO1FBQVcsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUFRO1FBQ3BGLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsUUFBUSxDQUFJLE1BQWUsRUFBRSxFQUFZLEVBQUUsT0FBcUIsRUFBRTtRQUNoRSxNQUFNLElBQUksR0FBRyxJQUFBLGdCQUFPLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBQSw0QkFBcUIsRUFBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNwSCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFJLE1BQU0sRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNyRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFJLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNwRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxD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UUFFakMsT0FBTyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQzFCLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBVTtRQUNmLElBQUksS0FBSyxZQUFZLGVBQVEsRUFBRTtZQUM3QixPQUFPLElBQUEsa0JBQVcsRUFBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUM5QztRQUNELE9BQU8sSUFBQSxrQkFBTSxFQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7Q0FDRjtBQXRhRCxnREFzYUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlc2NhcGUgfSBmcm9tICdzcWxzdHJpbmcnO1xuaW1wb3J0IHsgZ2V0TWV0YSB9IGZyb20gJ0B1cWwvY29yZS9lbnRpdHknO1xuaW1wb3J0IHtcbiAgZ2V0UGVyc2lzdGFibGUsXG4gIGdldFByb2plY3RSZWxhdGlvbktleXMsXG4gIGdldFBlcnNpc3RhYmxlcyxcbiAgaXNQcm9qZWN0aW5nUmVsYXRpb25zLFxuICBnZXRLZXlzLFxuICBoYXNLZXlzLFxuICBidWlsZFNvcnRNYXAsXG4gIGZsYXRPYmplY3QsXG4gIGdldFJhd1ZhbHVlLFxuICByYXcsXG4gIGdldFF1ZXJ5RmlsdGVyQXNNYXAsXG4gIGdldEZpZWxkQ2FsbGJhY2tWYWx1ZSxcbn0gZnJvbSAnQHVxbC9jb3JlL3V0aWwnO1xuXG5pbXBvcnQge1xuICBRdWVyeUZpbHRlcixcbiAgUXVlcnksXG4gIFNjYWxhcixcbiAgUXVlcnlGaWx0ZXJGaWVsZE9wZXJhdG9yTWFwLFxuICBRdWVyeVNvcnQsXG4gIFF1ZXJ5UGFnZXIsXG4gIFF1ZXJ5VGV4dFNlYXJjaE9wdGlvbnMsXG4gIEZpZWxkS2V5LFxuICBRdWVyeVByb2plY3QsXG4gIFR5cGUsXG4gIFF1ZXJ5Q3JpdGVyaWEsXG4gIFF1ZXJ5UHJvamVjdEFycmF5LFxuICBRdWVyeU9wdGlvbnMsXG4gIFF1ZXJ5RGlhbGVjdCxcbiAgUXVlcnlGaWx0ZXJPcHRpb25zLFxuICBRdWVyeUNvbXBhcmlzb25PcHRpb25zLFxuICBRdWVyeUZpbHRlck1hcCxcbiAgUXVlcnlTZWFyY2gsXG4gIFF1ZXJ5UHJvamVjdE9wdGlvbnMsXG4gIFF1ZXJ5U29ydERpcmVjdGlvbixcbiAgUXVlcnlGaWx0ZXJMb2dpY2FsLFxuICBRdWVyeVJhdyxcbn0gZnJvbSAnQHVxbC9jb3JlL3R5cGUnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTcWxEaWFsZWN0IGltcGxlbWVudHMgUXVlcnlEaWFsZWN0IHtcbiAgcmVhZG9ubHkgZXNjYXBlSWRSZWdleDogUmVnRXhwO1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGVzY2FwZUlkQ2hhcjogJ2AnIHwgJ1wiJywgcmVhZG9ubHkgYmVnaW5UcmFuc2FjdGlvbkNvbW1hbmQ6IHN0cmluZykge1xuICAgIHRoaXMuZXNjYXBlSWRSZWdleCA9IFJlZ0V4cChlc2NhcGVJZENoYXIsICdnJyk7XG4gIH1cblxuICBjcml0ZXJpYTxFPihlbnRpdHk6IFR5cGU8RT4sIHFtOiBRdWVyeTxFPiwgb3B0czogUXVlcnlPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG4gICAgY29uc3QgcHJlZml4ID0gb3B0cy5wcmVmaXggPz8gKG9wdHMuYXV0b1ByZWZpeCB8fCBpc1Byb2plY3RpbmdSZWxhdGlvbnMobWV0YSwgcW0uJHByb2plY3QpKSA/IG1ldGEubmFtZSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCB3aGVyZSA9IHRoaXMud2hlcmU8RT4oZW50aXR5LCBxbS4kZmlsdGVyLCB7IC4uLm9wdHMsIHByZWZpeCB9KTtcbiAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXA8RT4oZW50aXR5LCBxbS4kZ3JvdXAsIHsgLi4ub3B0cywgcHJlZml4IH0pO1xuICAgIGNvbnN0IGhhdmluZyA9IHRoaXMud2hlcmU8RT4oZW50aXR5LCBxbS4kaGF2aW5nLCB7IC4uLm9wdHMsIHByZWZpeCwgY2xhdXNlOiAnSEFWSU5HJyB9KTtcbiAgICBjb25zdCBzb3J0ID0gdGhpcy5zb3J0PEU+KGVudGl0eSwgcW0uJHNvcnQsIHsgLi4ub3B0cywgcHJlZml4IH0pO1xuICAgIGNvbnN0IHBhZ2VyID0gdGhpcy5wYWdlcihxbSk7XG4gICAgcmV0dXJuIHdoZXJlICsgZ3JvdXAgKyBoYXZpbmcgKyBzb3J0ICsgcGFnZXI7XG4gIH1cblxuICBwcm9qZWN0RmllbGRzPEU+KGVudGl0eTogVHlwZTxFPiwgcHJvamVjdDogUXVlcnlQcm9qZWN0PEU+LCBvcHRzOiBRdWVyeVByb2plY3RPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG4gICAgY29uc3QgcHJlZml4ID0gb3B0cy5wcmVmaXggPyBvcHRzLnByZWZpeCArICcuJyA6ICcnO1xuICAgIGNvbnN0IGVzY2FwZWRQcmVmaXggPSB0aGlzLmVzY2FwZUlkKG9wdHMucHJlZml4LCB0cnVlLCB0cnVlKTtcblxuICAgIGxldCBmaWVsZHM6IFF1ZXJ5UHJvamVjdEFycmF5PEU+O1xuXG4gICAgaWYgKHByb2plY3QpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb2plY3QpKSB7XG4gICAgICAgIGZpZWxkcyA9IHByb2plY3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwb3NpdGl2ZVByb2plY3RLZXlzID0gZ2V0S2V5cyhwcm9qZWN0KS5maWx0ZXIoKGtleSkgPT4gcHJvamVjdFtrZXldKTtcbiAgICAgICAgZmllbGRzID0gcG9zaXRpdmVQcm9qZWN0S2V5cy5sZW5ndGhcbiAgICAgICAgICA/IHBvc2l0aXZlUHJvamVjdEtleXMubWFwKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsID0gcHJvamVjdFtrZXldO1xuICAgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgUXVlcnlSYXcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmF3KHZhbC52YWx1ZSwga2V5KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4ga2V5IGFzIEZpZWxkS2V5PEU+O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IChnZXRLZXlzKG1ldGEuZmllbGRzKS5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gcHJvamVjdCkpIGFzIEZpZWxkS2V5PEU+W10pO1xuICAgICAgfVxuICAgICAgZmllbGRzID0gZmllbGRzLmZpbHRlcigoa2V5KSA9PiBrZXkgaW5zdGFuY2VvZiBRdWVyeVJhdyB8fCBtZXRhLmZpZWxkc1trZXkgYXMgRmllbGRLZXk8RT5dKTtcbiAgICAgIGlmICghZmllbGRzLmxlbmd0aCB8fCAob3B0cy5wcmVmaXggJiYgIWZpZWxkcy5pbmNsdWRlcyhtZXRhLmlkKSkpIHtcbiAgICAgICAgZmllbGRzID0gW21ldGEuaWQsIC4uLmZpZWxkc107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpZWxkcyA9IGdldEtleXMobWV0YS5maWVsZHMpIGFzIEZpZWxkS2V5PEU+W107XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpZWxkc1xuICAgICAgLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBRdWVyeVJhdykge1xuICAgICAgICAgIHJldHVybiBnZXRSYXdWYWx1ZSh7XG4gICAgICAgICAgICB2YWx1ZToga2V5LFxuICAgICAgICAgICAgZGlhbGVjdDogdGhpcyxcbiAgICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICAgIGVzY2FwZWRQcmVmaXgsXG4gICAgICAgICAgICBhdXRvUHJlZml4QWxpYXM6IG9wdHMuYXV0b1ByZWZpeEFsaWFzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmllbGQgPSBtZXRhLmZpZWxkc1trZXkgYXMgRmllbGRLZXk8RT5dO1xuXG4gICAgICAgIGlmIChmaWVsZC52aXJ0dWFsKSB7XG4gICAgICAgICAgcmV0dXJuIGdldFJhd1ZhbHVlKHtcbiAgICAgICAgICAgIHZhbHVlOiByYXcoZmllbGQudmlydHVhbC52YWx1ZSwga2V5KSxcbiAgICAgICAgICAgIGRpYWxlY3Q6IHRoaXMsXG4gICAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgICBlc2NhcGVkUHJlZml4LFxuICAgICAgICAgICAgYXV0b1ByZWZpeEFsaWFzOiBvcHRzLmF1dG9QcmVmaXhBbGlhcyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5hbWUgPSBmaWVsZD8ubmFtZSA/PyAoa2V5IGFzIEZpZWxkS2V5PEU+KTtcbiAgICAgICAgY29uc3QgZmllbGRQYXRoID0gYCR7ZXNjYXBlZFByZWZpeH0ke3RoaXMuZXNjYXBlSWQobmFtZSl9YDtcblxuICAgICAgICByZXR1cm4gIW9wdHMuYXV0b1ByZWZpeEFsaWFzICYmIChuYW1lID09PSBrZXkgfHwgIWZpZWxkKSA/IGZpZWxkUGF0aCA6IGAke2ZpZWxkUGF0aH0gJHt0aGlzLmVzY2FwZUlkKChwcmVmaXggKyBrZXkpIGFzIEZpZWxkS2V5PEU+LCB0cnVlKX1gO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCcsICcpO1xuICB9XG5cbiAgcHJvamVjdFJlbGF0aW9uczxFPihlbnRpdHk6IFR5cGU8RT4sIHByb2plY3Q6IFF1ZXJ5UHJvamVjdDxFPiA9IHt9LCB7IHByZWZpeCB9OiB7IHByZWZpeD86IHN0cmluZyB9ID0ge30pOiB7IGZpZWxkczogc3RyaW5nOyB0YWJsZXM6IHN0cmluZyB9IHtcbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YShlbnRpdHkpO1xuICAgIGNvbnN0IHJlbGF0aW9ucyA9IGdldFByb2plY3RSZWxhdGlvbktleXMobWV0YSwgcHJvamVjdCk7XG4gICAgY29uc3QgaXNQcm9qZWN0QXJyYXkgPSBBcnJheS5pc0FycmF5KHByb2plY3QpO1xuICAgIGxldCBmaWVsZHMgPSAnJztcbiAgICBsZXQgdGFibGVzID0gJyc7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZWxhdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlbE9wdHMgPSBtZXRhLnJlbGF0aW9uc1trZXldO1xuXG4gICAgICBpZiAocmVsT3B0cy5jYXJkaW5hbGl0eSA9PT0gJzFtJyB8fCByZWxPcHRzLmNhcmRpbmFsaXR5ID09PSAnbW0nKSB7XG4gICAgICAgIC8vICcxbScgYW5kICdtbScgc2hvdWxkIGJlIHJlc29sdmVkIGluIGEgaGlnaGVyIGxheWVyIGJlY2F1c2UgdGhleSB3aWxsIG5lZWQgbXVsdGlwbGUgcXVlcmllc1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgam9pblJlbEFsaWFzID0gcHJlZml4ID8gcHJlZml4ICsgJy4nICsga2V5IDoga2V5O1xuICAgICAgY29uc3QgcmVsRW50aXR5ID0gcmVsT3B0cy5lbnRpdHkoKTtcbiAgICAgIGNvbnN0IHJlbFByb2plY3QgPSBwcm9qZWN0W2tleSBhcyBzdHJpbmddO1xuICAgICAgY29uc3QgcmVsUXVlcnkgPSBpc1Byb2plY3RBcnJheSA/IHt9IDogQXJyYXkuaXNBcnJheShyZWxQcm9qZWN0KSA/IHsgJHByb2plY3Q6IHJlbFByb2plY3QgfSA6IHJlbFByb2plY3Q7XG5cbiAgICAgIGNvbnN0IHJlbENvbHVtbnMgPSB0aGlzLnByb2plY3RGaWVsZHMocmVsRW50aXR5LCByZWxRdWVyeS4kcHJvamVjdCwge1xuICAgICAgICBwcmVmaXg6IGpvaW5SZWxBbGlhcyxcbiAgICAgICAgYXV0b1ByZWZpeEFsaWFzOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGZpZWxkcyArPSAnLCAnICsgcmVsQ29sdW1ucztcblxuICAgICAgY29uc3QgeyBmaWVsZHM6IHN1YkNvbHVtbnMsIHRhYmxlczogc3ViVGFibGVzIH0gPSB0aGlzLnByb2plY3RSZWxhdGlvbnMocmVsRW50aXR5LCByZWxRdWVyeS4kcHJvamVjdCwge1xuICAgICAgICBwcmVmaXg6IGpvaW5SZWxBbGlhcyxcbiAgICAgIH0pO1xuXG4gICAgICBmaWVsZHMgKz0gc3ViQ29sdW1ucztcblxuICAgICAgY29uc3QgcmVsTWV0YSA9IGdldE1ldGEocmVsRW50aXR5KTtcbiAgICAgIGNvbnN0IHJlbEVudGl0eU5hbWUgPSB0aGlzLmVzY2FwZUlkKHJlbE1ldGEubmFtZSk7XG4gICAgICBjb25zdCByZWxQYXRoID0gcHJlZml4ID8gdGhpcy5lc2NhcGVJZChwcmVmaXgsIHRydWUpIDogdGhpcy5lc2NhcGVJZChtZXRhLm5hbWUpO1xuICAgICAgY29uc3Qgam9pblR5cGUgPSByZWxRdWVyeS4kcmVxdWlyZWQgPyAnSU5ORVInIDogJ0xFRlQnO1xuICAgICAgY29uc3Qgam9pbkFsaWFzID0gdGhpcy5lc2NhcGVJZChqb2luUmVsQWxpYXMsIHRydWUpO1xuXG4gICAgICB0YWJsZXMgKz0gYCAke2pvaW5UeXBlfSBKT0lOICR7cmVsRW50aXR5TmFtZX0gJHtqb2luQWxpYXN9IE9OIGA7XG4gICAgICB0YWJsZXMgKz0gcmVsT3B0cy5yZWZlcmVuY2VzLm1hcCgoaXQpID0+IGAke2pvaW5BbGlhc30uJHt0aGlzLmVzY2FwZUlkKGl0LmZvcmVpZ24pfSA9ICR7cmVsUGF0aH0uJHt0aGlzLmVzY2FwZUlkKGl0LmxvY2FsKX1gKS5qb2luKCcgQU5EICcpO1xuXG4gICAgICBpZiAocmVsUXVlcnkuJGZpbHRlcikge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLndoZXJlKHJlbEVudGl0eSwgcmVsUXVlcnkuJGZpbHRlciwgeyBwcmVmaXg6IGtleSwgY2xhdXNlOiBmYWxzZSB9KTtcbiAgICAgICAgdGFibGVzICs9IGAgQU5EICR7ZmlsdGVyfWA7XG4gICAgICB9XG5cbiAgICAgIHRhYmxlcyArPSBzdWJUYWJsZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZmllbGRzLCB0YWJsZXMgfTtcbiAgfVxuXG4gIHNlbGVjdDxFPihlbnRpdHk6IFR5cGU8RT4sIHFtOiBRdWVyeTxFPiwgb3B0czogUXVlcnlPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG4gICAgY29uc3QgcHJlZml4ID0gb3B0cy5wcmVmaXggPz8gKG9wdHMuYXV0b1ByZWZpeCB8fCBpc1Byb2plY3RpbmdSZWxhdGlvbnMobWV0YSwgcW0uJHByb2plY3QpKSA/IG1ldGEubmFtZSA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMucHJvamVjdEZpZWxkcyhlbnRpdHksIHFtLiRwcm9qZWN0LCB7IHByZWZpeCB9KTtcbiAgICBjb25zdCB7IGZpZWxkczogcmVsYXRpb25GaWVsZHMsIHRhYmxlcyB9ID0gdGhpcy5wcm9qZWN0UmVsYXRpb25zKGVudGl0eSwgcW0uJHByb2plY3QpO1xuXG4gICAgcmV0dXJuIGBTRUxFQ1QgJHtmaWVsZHN9JHtyZWxhdGlvbkZpZWxkc30gRlJPTSAke3RoaXMuZXNjYXBlSWQobWV0YS5uYW1lKX0ke3RhYmxlc31gO1xuICB9XG5cbiAgd2hlcmU8RT4oZW50aXR5OiBUeXBlPEU+LCBmaWx0ZXI6IFF1ZXJ5RmlsdGVyPEU+ID0ge30sIG9wdHM6IFF1ZXJ5RmlsdGVyT3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YShlbnRpdHkpO1xuICAgIGNvbnN0IHsgdXNlUHJlY2VkZW5jZSwgY2xhdXNlID0gJ1dIRVJFJywgc29mdERlbGV0ZSB9ID0gb3B0cztcblxuICAgIGZpbHRlciA9IGdldFF1ZXJ5RmlsdGVyQXNNYXAobWV0YSwgZmlsdGVyKTtcblxuICAgIGlmIChtZXRhLnNvZnREZWxldGUgJiYgKHNvZnREZWxldGUgfHwgc29mdERlbGV0ZSA9PT0gdW5kZWZpbmVkKSAmJiBjbGF1c2UgIT09ICdIQVZJTkcnICYmICFmaWx0ZXJbbWV0YS5zb2Z0RGVsZXRlIGFzIHN0cmluZ10pIHtcbiAgICAgIGZpbHRlclttZXRhLnNvZnREZWxldGUgYXMgc3RyaW5nXSA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGZpbHRlcik7XG5cbiAgICBpZiAoIWVudHJpZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4ub3B0cywgdXNlUHJlY2VkZW5jZTogZW50cmllcy5sZW5ndGggPiAxIH07XG5cbiAgICBsZXQgc3FsID0gZW50cmllcy5tYXAoKFtrZXksIHZhbF0pID0+IHRoaXMuY29tcGFyZShlbnRpdHksIGtleSBhcyBrZXlvZiBRdWVyeUZpbHRlck1hcDxFPiwgdmFsIGFzIGFueSwgb3B0aW9ucykpLmpvaW4oYCBBTkQgYCk7XG5cbiAgICBpZiAodXNlUHJlY2VkZW5jZSkge1xuICAgICAgc3FsID0gYCgke3NxbH0pYDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xhdXNlID8gYCAke2NsYXVzZX0gJHtzcWx9YCA6IHNxbDtcbiAgfVxuXG4gIGNvbXBhcmU8RSwgSyBleHRlbmRzIGtleW9mIFF1ZXJ5RmlsdGVyTWFwPEU+PihlbnRpdHk6IFR5cGU8RT4sIGtleTogSywgdmFsOiBRdWVyeUZpbHRlck1hcDxFPltLXSwgb3B0cz86IFF1ZXJ5Q29tcGFyaXNvbk9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG5cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgUXVlcnlSYXcpIHtcbiAgICAgIGlmIChrZXkgPT09ICckZXhpc3RzJyB8fCBrZXkgPT09ICckbmV4aXN0cycpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWwgYXMgUXVlcnlSYXc7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gZ2V0UmF3VmFsdWUoe1xuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIGRpYWxlY3Q6IHRoaXMsXG4gICAgICAgICAgcHJlZml4OiBtZXRhLm5hbWUsXG4gICAgICAgICAgZXNjYXBlZFByZWZpeDogdGhpcy5lc2NhcGVJZChtZXRhLm5hbWUsIGZhbHNlLCB0cnVlKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBgJHtrZXkgPT09ICckZXhpc3RzJyA/ICdFWElTVFMnIDogJ05PVCBFWElTVFMnfSAoJHtxdWVyeX0pYDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbXBhcmlzb25LZXkgPSB0aGlzLmdldENvbXBhcmlzb25LZXkoZW50aXR5LCBrZXkgYXMgRmllbGRLZXk8RT4sIG9wdHMpO1xuICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9ID0gJHt2YWwudmFsdWV9YDtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnJHRleHQnKSB7XG4gICAgICBjb25zdCBzZWFyY2ggPSB2YWwgYXMgUXVlcnlUZXh0U2VhcmNoT3B0aW9uczxFPjtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IHNlYXJjaC4kZmllbGRzLm1hcCgoZmllbGQpID0+IHRoaXMuZXNjYXBlSWQobWV0YS5maWVsZHNbZmllbGRdPy5uYW1lID8/IGZpZWxkKSk7XG4gICAgICByZXR1cm4gYCR7dGhpcy5lc2NhcGVJZChtZXRhLm5hbWUpfSBNQVRDSCB7JHtmaWVsZHMuam9pbignICcpfX0gOiAke3RoaXMuZXNjYXBlKHNlYXJjaC4kdmFsdWUpfWA7XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gJyRhbmQnIHx8IGtleSA9PT0gJyRvcicgfHwga2V5ID09PSAnJG5vdCcgfHwga2V5ID09PSAnJG5vcicpIHtcbiAgICAgIGNvbnN0IG5lZ2F0ZU9wZXJhdG9yTWFwID0ge1xuICAgICAgICAkbm90OiAnJGFuZCcsXG4gICAgICAgICRub3I6ICckb3InLFxuICAgICAgfSBhcyBjb25zdDtcblxuICAgICAgY29uc3Qgb3A6ICckYW5kJyB8ICckb3InID0gbmVnYXRlT3BlcmF0b3JNYXBba2V5IGFzIHN0cmluZ10gPz8ga2V5O1xuICAgICAgY29uc3QgbmVnYXRlID0ga2V5IGluIG5lZ2F0ZU9wZXJhdG9yTWFwID8gJ05PVCAnIDogJyc7XG5cbiAgICAgIGNvbnN0IHZhbHVlcyA9IHZhbCBhcyBRdWVyeUZpbHRlckxvZ2ljYWw8RT47XG4gICAgICBjb25zdCBoYXNNYW55SXRlbXMgPSB2YWx1ZXMubGVuZ3RoID4gMTtcbiAgICAgIGNvbnN0IGxvZ2ljYWxDb21wYXJpc29uID0gdmFsdWVzXG4gICAgICAgIC5tYXAoKGZpbHRlckVudHJ5KSA9PiB7XG4gICAgICAgICAgaWYgKGZpbHRlckVudHJ5IGluc3RhbmNlb2YgUXVlcnlSYXcpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRSYXdWYWx1ZSh7XG4gICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJFbnRyeSxcbiAgICAgICAgICAgICAgZGlhbGVjdDogdGhpcyxcbiAgICAgICAgICAgICAgcHJlZml4OiBvcHRzLnByZWZpeCxcbiAgICAgICAgICAgICAgZXNjYXBlZFByZWZpeDogdGhpcy5lc2NhcGVJZChvcHRzLnByZWZpeCwgdHJ1ZSwgdHJ1ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMud2hlcmUoZW50aXR5LCBmaWx0ZXJFbnRyeSwge1xuICAgICAgICAgICAgcHJlZml4OiBvcHRzLnByZWZpeCxcbiAgICAgICAgICAgIHVzZVByZWNlZGVuY2U6IGhhc01hbnlJdGVtcyAmJiAhQXJyYXkuaXNBcnJheShmaWx0ZXJFbnRyeSkgJiYgZ2V0S2V5cyhmaWx0ZXJFbnRyeSkubGVuZ3RoID4gMSxcbiAgICAgICAgICAgIGNsYXVzZTogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKG9wID09PSAnJG9yJyA/ICcgT1IgJyA6ICcgQU5EICcpO1xuXG4gICAgICByZXR1cm4gKG9wdHMudXNlUHJlY2VkZW5jZSB8fCBuZWdhdGUpICYmIGhhc01hbnlJdGVtcyA/IGAke25lZ2F0ZX0oJHtsb2dpY2FsQ29tcGFyaXNvbn0pYCA6IGAke25lZ2F0ZX0ke2xvZ2ljYWxDb21wYXJpc29ufWA7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbCkgPyB7ICRpbjogdmFsIH0gOiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgPyB2YWwgOiB7ICRlcTogdmFsIH07XG4gICAgY29uc3Qgb3BlcmF0b3JzID0gZ2V0S2V5cyh2YWx1ZSkgYXMgKGtleW9mIFF1ZXJ5RmlsdGVyRmllbGRPcGVyYXRvck1hcDxFPilbXTtcbiAgICBjb25zdCBjb21wYXJpc29ucyA9IG9wZXJhdG9ycy5tYXAoKG9wKSA9PiB0aGlzLmNvbXBhcmVGaWVsZE9wZXJhdG9yKGVudGl0eSwga2V5IGFzIEZpZWxkS2V5PEU+LCBvcCwgdmFsdWVbb3BdLCBvcHRzKSkuam9pbignIEFORCAnKTtcblxuICAgIHJldHVybiBvcGVyYXRvcnMubGVuZ3RoID4gMSA/IGAoJHtjb21wYXJpc29uc30pYCA6IGNvbXBhcmlzb25zO1xuICB9XG5cbiAgY29tcGFyZUZpZWxkT3BlcmF0b3I8RSwgSyBleHRlbmRzIGtleW9mIFF1ZXJ5RmlsdGVyRmllbGRPcGVyYXRvck1hcDxFPj4oXG4gICAgZW50aXR5OiBUeXBlPEU+LFxuICAgIGtleTogRmllbGRLZXk8RT4sXG4gICAgb3A6IEssXG4gICAgdmFsOiBRdWVyeUZpbHRlckZpZWxkT3BlcmF0b3JNYXA8RT5bS10sXG4gICAgb3B0cz86IFF1ZXJ5T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbXBhcmlzb25LZXkgPSB0aGlzLmdldENvbXBhcmlzb25LZXkoZW50aXR5LCBrZXksIG9wdHMpO1xuICAgIHN3aXRjaCAob3ApIHtcbiAgICAgIGNhc2UgJyRlcSc6XG4gICAgICAgIHJldHVybiB2YWwgPT09IG51bGwgPyBgJHtjb21wYXJpc29uS2V5fSBJUyBOVUxMYCA6IGAke2NvbXBhcmlzb25LZXl9ID0gJHt0aGlzLmVzY2FwZSh2YWwpfWA7XG4gICAgICBjYXNlICckbmUnOlxuICAgICAgICByZXR1cm4gdmFsID09PSBudWxsID8gYCR7Y29tcGFyaXNvbktleX0gSVMgTk9UIE5VTExgIDogYCR7Y29tcGFyaXNvbktleX0gPD4gJHt0aGlzLmVzY2FwZSh2YWwpfWA7XG4gICAgICBjYXNlICckbm90JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShlbnRpdHksICckbm90JywgW3sgW2tleV06IHZhbCB9XSBhcyBhbnksIG9wdHMpO1xuICAgICAgY2FzZSAnJGd0JzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9ID4gJHt0aGlzLmVzY2FwZSh2YWwpfWA7XG4gICAgICBjYXNlICckZ3RlJzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9ID49ICR7dGhpcy5lc2NhcGUodmFsKX1gO1xuICAgICAgY2FzZSAnJGx0JzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9IDwgJHt0aGlzLmVzY2FwZSh2YWwpfWA7XG4gICAgICBjYXNlICckbHRlJzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9IDw9ICR7dGhpcy5lc2NhcGUodmFsKX1gO1xuICAgICAgY2FzZSAnJHN0YXJ0c1dpdGgnOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gTElLRSAke3RoaXMuZXNjYXBlKGAke3ZhbH0lYCl9YDtcbiAgICAgIGNhc2UgJyRpc3RhcnRzV2l0aCc6XG4gICAgICAgIHJldHVybiBgTE9XRVIoJHtjb21wYXJpc29uS2V5fSkgTElLRSAke3RoaXMuZXNjYXBlKCh2YWwgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpICsgJyUnKX1gO1xuICAgICAgY2FzZSAnJGVuZHNXaXRoJzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9IExJS0UgJHt0aGlzLmVzY2FwZShgJSR7dmFsfWApfWA7XG4gICAgICBjYXNlICckaWVuZHNXaXRoJzpcbiAgICAgICAgcmV0dXJuIGBMT1dFUigke2NvbXBhcmlzb25LZXl9KSBMSUtFICR7dGhpcy5lc2NhcGUoJyUnICsgKHZhbCBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkpfWA7XG4gICAgICBjYXNlICckaW5jbHVkZXMnOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gTElLRSAke3RoaXMuZXNjYXBlKGAlJHt2YWx9JWApfWA7XG4gICAgICBjYXNlICckaWluY2x1ZGVzJzpcbiAgICAgICAgcmV0dXJuIGBMT1dFUigke2NvbXBhcmlzb25LZXl9KSBMSUtFICR7dGhpcy5lc2NhcGUoJyUnICsgKHZhbCBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkgKyAnJScpfWA7XG4gICAgICBjYXNlICckaWxpa2UnOlxuICAgICAgICByZXR1cm4gYExPV0VSKCR7Y29tcGFyaXNvbktleX0pIExJS0UgJHt0aGlzLmVzY2FwZSgodmFsIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKSl9YDtcbiAgICAgIGNhc2UgJyRsaWtlJzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9IExJS0UgJHt0aGlzLmVzY2FwZSh2YWwpfWA7XG4gICAgICBjYXNlICckaW4nOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gSU4gKCR7dGhpcy5lc2NhcGUodmFsKX0pYDtcbiAgICAgIGNhc2UgJyRuaW4nOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gTk9UIElOICgke3RoaXMuZXNjYXBlKHZhbCl9KWA7XG4gICAgICBjYXNlICckcmVnZXgnOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gUkVHRVhQICR7dGhpcy5lc2NhcGUodmFsKX1gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKGB1bmtub3duIG9wZXJhdG9yOiAke29wfWApO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbXBhcmlzb25LZXk8RT4oZW50aXR5OiBUeXBlPEU+LCBrZXk6IEZpZWxkS2V5PEU+LCB7IHByZWZpeCB9OiBRdWVyeU9wdGlvbnMgPSB7fSk6IFNjYWxhciB7XG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcbiAgICBjb25zdCBlc2NhcGVkUHJlZml4ID0gdGhpcy5lc2NhcGVJZChwcmVmaXgsIHRydWUsIHRydWUpO1xuICAgIGNvbnN0IGZpZWxkID0gbWV0YS5maWVsZHNba2V5XTtcblxuICAgIGlmIChmaWVsZD8udmlydHVhbCkge1xuICAgICAgcmV0dXJuIGdldFJhd1ZhbHVlKHtcbiAgICAgICAgdmFsdWU6IGZpZWxkLnZpcnR1YWwsXG4gICAgICAgIGRpYWxlY3Q6IHRoaXMsXG4gICAgICAgIHByZWZpeCxcbiAgICAgICAgZXNjYXBlZFByZWZpeCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBlc2NhcGVkUHJlZml4ICsgdGhpcy5lc2NhcGVJZChmaWVsZD8ubmFtZSA/PyBrZXkpO1xuICB9XG5cbiAgZ3JvdXA8RT4oZW50aXR5OiBUeXBlPEU+LCBmaWVsZHM6IHJlYWRvbmx5IEZpZWxkS2V5PEU+W10sIG9wdHM6IFF1ZXJ5T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICBpZiAoIWZpZWxkcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG4gICAgY29uc3QgbmFtZXMgPSBmaWVsZHMubWFwKChrZXkpID0+IHRoaXMuZXNjYXBlSWQobWV0YS5maWVsZHNba2V5XT8ubmFtZSA/PyBrZXkpKS5qb2luKCcsICcpO1xuICAgIHJldHVybiBgIEdST1VQIEJZICR7bmFtZXN9YDtcbiAgfVxuXG4gIHNvcnQ8RT4oZW50aXR5OiBUeXBlPEU+LCBzb3J0OiBRdWVyeVNvcnQ8RT4sIHsgcHJlZml4IH06IFF1ZXJ5T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICBjb25zdCBzb3J0TWFwID0gYnVpbGRTb3J0TWFwKHNvcnQpO1xuICAgIGlmICghaGFzS2V5cyhzb3J0TWFwKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YShlbnRpdHkpO1xuICAgIGNvbnN0IGZsYXR0ZW5lZFNvcnQgPSBmbGF0T2JqZWN0KHNvcnRNYXAsIHByZWZpeCk7XG4gICAgY29uc3QgZGlyZWN0aW9uTWFwID0geyAxOiAnJywgYXNjOiAnJywgJy0xJzogJyBERVNDJywgZGVzYzogJyBERVNDJyB9IGFzIGNvbnN0O1xuICAgIGNvbnN0IG9yZGVyID0gT2JqZWN0LmVudHJpZXMoZmxhdHRlbmVkU29ydClcbiAgICAgIC5tYXAoKFtrZXksIHNvcnRdKSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBtZXRhLmZpZWxkc1trZXldPy5uYW1lID8/IGtleTtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gZGlyZWN0aW9uTWFwW3NvcnQgYXMgUXVlcnlTb3J0RGlyZWN0aW9uXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXNjYXBlSWQobmFtZSkgKyBkaXJlY3Rpb247XG4gICAgICB9KVxuICAgICAgLmpvaW4oJywgJyk7XG4gICAgcmV0dXJuIGAgT1JERVIgQlkgJHtvcmRlcn1gO1xuICB9XG5cbiAgcGFnZXIob3B0czogUXVlcnlQYWdlcik6IHN0cmluZyB7XG4gICAgbGV0IHNxbCA9ICcnO1xuICAgIGlmIChvcHRzLiRsaW1pdCkge1xuICAgICAgc3FsICs9IGAgTElNSVQgJHtOdW1iZXIob3B0cy4kbGltaXQpfWA7XG4gICAgfVxuICAgIGlmIChvcHRzLiRza2lwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNxbCArPSBgIE9GRlNFVCAke051bWJlcihvcHRzLiRza2lwKX1gO1xuICAgIH1cbiAgICByZXR1cm4gc3FsO1xuICB9XG5cbiAgY291bnQ8RT4oZW50aXR5OiBUeXBlPEU+LCBxbTogUXVlcnlTZWFyY2g8RT4sIG9wdHM/OiBRdWVyeU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNlYXJjaDogUXVlcnk8RT4gPSB7XG4gICAgICAuLi5xbSxcbiAgICAgICRwcm9qZWN0OiBbcmF3KCdDT1VOVCgqKScsICdjb3VudCcpXSxcbiAgICB9O1xuXG4gICAgZGVsZXRlIHNlYXJjaC4kc29ydDtcbiAgICBkZWxldGUgc2VhcmNoLiRza2lwO1xuICAgIGRlbGV0ZSBzZWFyY2guJGxpbWl0O1xuXG4gICAgY29uc3Qgc2VsZWN0ID0gdGhpcy5zZWxlY3Q8RT4oZW50aXR5LCBzZWFyY2gpO1xuICAgIGNvbnN0IGNyaXRlcmlhID0gdGhpcy5jcml0ZXJpYShlbnRpdHksIHNlYXJjaCwgb3B0cyk7XG5cbiAgICByZXR1cm4gc2VsZWN0ICsgY3JpdGVyaWE7XG4gIH1cblxuICBmaW5kPEU+KGVudGl0eTogVHlwZTxFPiwgcW06IFF1ZXJ5PEU+LCBvcHRzPzogUXVlcnlPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWxlY3QgPSB0aGlzLnNlbGVjdDxFPihlbnRpdHksIHFtLCBvcHRzKTtcbiAgICBjb25zdCBjcml0ZXJpYSA9IHRoaXMuY3JpdGVyaWEoZW50aXR5LCBxbSwgb3B0cyk7XG4gICAgcmV0dXJuIHNlbGVjdCArIGNyaXRlcmlhO1xuICB9XG5cbiAgaW5zZXJ0PEU+KGVudGl0eTogVHlwZTxFPiwgcGF5bG9hZDogRSB8IEVbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcbiAgICBjb25zdCByZWNvcmRzID0gZ2V0UGVyc2lzdGFibGVzKG1ldGEsIHBheWxvYWQsICdvbkluc2VydCcpO1xuICAgIGNvbnN0IGtleXMgPSBnZXRLZXlzKHJlY29yZHNbMF0pO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBrZXlzLm1hcCgoa2V5KSA9PiB0aGlzLmVzY2FwZUlkKG1ldGEuZmllbGRzW2tleV0ubmFtZSkpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHJlY29yZHMubWFwKChyZWNvcmQpID0+IGtleXMubWFwKChrZXkpID0+IHRoaXMuZXNjYXBlKHJlY29yZFtrZXldKSkuam9pbignLCAnKSkuam9pbignKSwgKCcpO1xuICAgIHJldHVybiBgSU5TRVJUIElOVE8gJHt0aGlzLmVzY2FwZUlkKG1ldGEubmFtZSl9ICgke2NvbHVtbnMuam9pbignLCAnKX0pIFZBTFVFUyAoJHt2YWx1ZXN9KWA7XG4gIH1cblxuICB1cGRhdGU8RT4oZW50aXR5OiBUeXBlPEU+LCBxbTogUXVlcnlDcml0ZXJpYTxFPiwgcGF5bG9hZDogRSwgb3B0cz86IFF1ZXJ5T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcbiAgICBjb25zdCByZWNvcmQgPSBnZXRQZXJzaXN0YWJsZShtZXRhLCBwYXlsb2FkLCAnb25VcGRhdGUnKTtcbiAgICBjb25zdCBrZXlzID0gZ2V0S2V5cyhyZWNvcmQpO1xuICAgIGNvbnN0IGVudHJpZXMgPSBrZXlzLm1hcCgoa2V5KSA9PiBgJHt0aGlzLmVzY2FwZUlkKGtleSl9ID0gJHt0aGlzLmVzY2FwZShwYXlsb2FkW2tleV0pfWApLmpvaW4oJywgJyk7XG4gICAgY29uc3QgY3JpdGVyaWEgPSB0aGlzLmNyaXRlcmlhKGVudGl0eSwgcW0sIG9wdHMpO1xuICAgIHJldHVybiBgVVBEQVRFICR7dGhpcy5lc2NhcGVJZChtZXRhLm5hbWUpfSBTRVQgJHtlbnRyaWVzfSR7Y3JpdGVyaWF9YDtcbiAgfVxuXG4gIGRlbGV0ZTxFPihlbnRpdHk6IFR5cGU8RT4sIHFtOiBRdWVyeUNyaXRlcmlhPEU+LCBvcHRzOiBRdWVyeU9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcblxuICAgIGlmIChvcHRzLnNvZnREZWxldGUgfHwgb3B0cy5zb2Z0RGVsZXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChtZXRhLnNvZnREZWxldGUpIHtcbiAgICAgICAgY29uc3QgY3JpdGVyaWEgPSB0aGlzLmNyaXRlcmlhKGVudGl0eSwgcW0sIG9wdHMpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEZpZWxkQ2FsbGJhY2tWYWx1ZShtZXRhLmZpZWxkc1ttZXRhLnNvZnREZWxldGVdLm9uRGVsZXRlKTtcbiAgICAgICAgcmV0dXJuIGBVUERBVEUgJHt0aGlzLmVzY2FwZUlkKG1ldGEubmFtZSl9IFNFVCAke3RoaXMuZXNjYXBlSWQobWV0YS5zb2Z0RGVsZXRlKX0gPSAke3RoaXMuZXNjYXBlKHZhbHVlKX0ke2NyaXRlcmlhfWA7XG4gICAgICB9IGVsc2UgaWYgKG9wdHMuc29mdERlbGV0ZSkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYCcke21ldGEubmFtZX0nIGhhcyBub3QgZW5hYmxlZCAnc29mdERlbGV0ZSdgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjcml0ZXJpYSA9IHRoaXMuY3JpdGVyaWEoZW50aXR5LCBxbSwgb3B0cyk7XG5cbiAgICByZXR1cm4gYERFTEVURSBGUk9NICR7dGhpcy5lc2NhcGVJZChtZXRhLm5hbWUpfSR7Y3JpdGVyaWF9YDtcbiAgfVxuXG4gIGVzY2FwZUlkKHZhbDogc3RyaW5nLCBmb3JiaWRRdWFsaWZpZWQ/OiBib29sZWFuLCBhZGREb3Q/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmICghZm9yYmlkUXVhbGlmaWVkICYmIHZhbC5pbmNsdWRlcygnLicpKSB7XG4gICAgICByZXR1cm4gdmFsXG4gICAgICAgIC5zcGxpdCgnLicpXG4gICAgICAgIC5tYXAoKGl0KSA9PiB0aGlzLmVzY2FwZUlkKGl0KSlcbiAgICAgICAgLmpvaW4oJy4nKTtcbiAgICB9XG5cbiAgICAvLyBzb3VyY2VkIGZyb20gJ2VzY2FwZUlkJyBmdW5jdGlvbiBoZXJlIGh0dHBzOi8vZ2l0aHViLmNvbS9teXNxbGpzL3NxbHN0cmluZy9ibG9iL21hc3Rlci9saWIvU3FsU3RyaW5nLmpzXG4gICAgY29uc3QgZXNjYXBlZCA9IHRoaXMuZXNjYXBlSWRDaGFyICsgdmFsLnJlcGxhY2UodGhpcy5lc2NhcGVJZFJlZ2V4LCB0aGlzLmVzY2FwZUlkQ2hhciArIHRoaXMuZXNjYXBlSWRDaGFyKSArIHRoaXMuZXNjYXBlSWRDaGFyO1xuXG4gICAgY29uc3Qgc3VmZml4ID0gYWRkRG90ID8gJy4nIDogJyc7XG5cbiAgICByZXR1cm4gZXNjYXBlZCArIHN1ZmZpeDtcbiAgfVxuXG4gIGVzY2FwZSh2YWx1ZTogYW55KTogU2NhbGFyIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBRdWVyeVJhdykge1xuICAgICAgcmV0dXJuIGdldFJhd1ZhbHVlKHsgdmFsdWUsIGRpYWxlY3Q6IHRoaXMgfSk7XG4gICAgfVxuICAgIHJldHVybiBlc2NhcGUodmFsdWUpO1xuICB9XG59XG4iXX0=
361
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RTcWxEaWFsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpYWxlY3QvYWJzdHJhY3RTcWxEaWFsZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNDLE9BQU8sRUFDTCxjQUFjLEVBQ2Qsc0JBQXNCLEVBQ3RCLGVBQWUsRUFDZixxQkFBcUIsRUFDckIsT0FBTyxFQUNQLE9BQU8sRUFDUCxZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxHQUFHLEVBQ0gsbUJBQW1CLEVBQ25CLHFCQUFxQixHQUN0QixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFzQkwsUUFBUSxHQUNULE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsTUFBTSxPQUFnQixrQkFBa0I7SUFHakI7SUFBa0M7SUFGOUMsYUFBYSxDQUFTO0lBRS9CLFlBQXFCLFlBQXVCLEVBQVcsdUJBQStCO1FBQWpFLGlCQUFZLEdBQVosWUFBWSxDQUFXO1FBQVcsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUFRO1FBQ3BGLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsUUFBUSxDQUFJLE1BQWUsRUFBRSxFQUFZLEVBQUUsT0FBcUIsRUFBRTtRQUNoRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUkscUJBQXFCLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7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QU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRWpDLE9BQU8sT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUMxQixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQVU7UUFDZixJQUFJLEtBQUssWUFBWSxRQUFRLEVBQUU7WUFDN0IsT0FBTyxXQUFXLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7U0FDOUM7UUFDRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlc2NhcGUgfSBmcm9tICdzcWxzdHJpbmcnO1xuaW1wb3J0IHsgZ2V0TWV0YSB9IGZyb20gJ0B1cWwvY29yZS9lbnRpdHknO1xuaW1wb3J0IHtcbiAgZ2V0UGVyc2lzdGFibGUsXG4gIGdldFByb2plY3RSZWxhdGlvbktleXMsXG4gIGdldFBlcnNpc3RhYmxlcyxcbiAgaXNQcm9qZWN0aW5nUmVsYXRpb25zLFxuICBnZXRLZXlzLFxuICBoYXNLZXlzLFxuICBidWlsZFNvcnRNYXAsXG4gIGZsYXRPYmplY3QsXG4gIGdldFJhd1ZhbHVlLFxuICByYXcsXG4gIGdldFF1ZXJ5RmlsdGVyQXNNYXAsXG4gIGdldEZpZWxkQ2FsbGJhY2tWYWx1ZSxcbn0gZnJvbSAnQHVxbC9jb3JlL3V0aWwnO1xuXG5pbXBvcnQge1xuICBRdWVyeUZpbHRlcixcbiAgUXVlcnksXG4gIFNjYWxhcixcbiAgUXVlcnlGaWx0ZXJGaWVsZE9wZXJhdG9yTWFwLFxuICBRdWVyeVNvcnQsXG4gIFF1ZXJ5UGFnZXIsXG4gIFF1ZXJ5VGV4dFNlYXJjaE9wdGlvbnMsXG4gIEZpZWxkS2V5LFxuICBRdWVyeVByb2plY3QsXG4gIFR5cGUsXG4gIFF1ZXJ5Q3JpdGVyaWEsXG4gIFF1ZXJ5UHJvamVjdEFycmF5LFxuICBRdWVyeU9wdGlvbnMsXG4gIFF1ZXJ5RGlhbGVjdCxcbiAgUXVlcnlGaWx0ZXJPcHRpb25zLFxuICBRdWVyeUNvbXBhcmlzb25PcHRpb25zLFxuICBRdWVyeUZpbHRlck1hcCxcbiAgUXVlcnlTZWFyY2gsXG4gIFF1ZXJ5UHJvamVjdE9wdGlvbnMsXG4gIFF1ZXJ5U29ydERpcmVjdGlvbixcbiAgUXVlcnlGaWx0ZXJMb2dpY2FsLFxuICBRdWVyeVJhdyxcbn0gZnJvbSAnQHVxbC9jb3JlL3R5cGUnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTcWxEaWFsZWN0IGltcGxlbWVudHMgUXVlcnlEaWFsZWN0IHtcbiAgcmVhZG9ubHkgZXNjYXBlSWRSZWdleDogUmVnRXhwO1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGVzY2FwZUlkQ2hhcjogJ2AnIHwgJ1wiJywgcmVhZG9ubHkgYmVnaW5UcmFuc2FjdGlvbkNvbW1hbmQ6IHN0cmluZykge1xuICAgIHRoaXMuZXNjYXBlSWRSZWdleCA9IFJlZ0V4cChlc2NhcGVJZENoYXIsICdnJyk7XG4gIH1cblxuICBjcml0ZXJpYTxFPihlbnRpdHk6IFR5cGU8RT4sIHFtOiBRdWVyeTxFPiwgb3B0czogUXVlcnlPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG4gICAgY29uc3QgcHJlZml4ID0gb3B0cy5wcmVmaXggPz8gKG9wdHMuYXV0b1ByZWZpeCB8fCBpc1Byb2plY3RpbmdSZWxhdGlvbnMobWV0YSwgcW0uJHByb2plY3QpKSA/IG1ldGEubmFtZSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCB3aGVyZSA9IHRoaXMud2hlcmU8RT4oZW50aXR5LCBxbS4kZmlsdGVyLCB7IC4uLm9wdHMsIHByZWZpeCB9KTtcbiAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXA8RT4oZW50aXR5LCBxbS4kZ3JvdXAsIHsgLi4ub3B0cywgcHJlZml4IH0pO1xuICAgIGNvbnN0IGhhdmluZyA9IHRoaXMud2hlcmU8RT4oZW50aXR5LCBxbS4kaGF2aW5nLCB7IC4uLm9wdHMsIHByZWZpeCwgY2xhdXNlOiAnSEFWSU5HJyB9KTtcbiAgICBjb25zdCBzb3J0ID0gdGhpcy5zb3J0PEU+KGVudGl0eSwgcW0uJHNvcnQsIHsgLi4ub3B0cywgcHJlZml4IH0pO1xuICAgIGNvbnN0IHBhZ2VyID0gdGhpcy5wYWdlcihxbSk7XG4gICAgcmV0dXJuIHdoZXJlICsgZ3JvdXAgKyBoYXZpbmcgKyBzb3J0ICsgcGFnZXI7XG4gIH1cblxuICBwcm9qZWN0RmllbGRzPEU+KGVudGl0eTogVHlwZTxFPiwgcHJvamVjdDogUXVlcnlQcm9qZWN0PEU+LCBvcHRzOiBRdWVyeVByb2plY3RPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG4gICAgY29uc3QgcHJlZml4ID0gb3B0cy5wcmVmaXggPyBvcHRzLnByZWZpeCArICcuJyA6ICcnO1xuICAgIGNvbnN0IGVzY2FwZWRQcmVmaXggPSB0aGlzLmVzY2FwZUlkKG9wdHMucHJlZml4LCB0cnVlLCB0cnVlKTtcblxuICAgIGxldCBmaWVsZHM6IFF1ZXJ5UHJvamVjdEFycmF5PEU+O1xuXG4gICAgaWYgKHByb2plY3QpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb2plY3QpKSB7XG4gICAgICAgIGZpZWxkcyA9IHByb2plY3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwb3NpdGl2ZVByb2plY3RLZXlzID0gZ2V0S2V5cyhwcm9qZWN0KS5maWx0ZXIoKGtleSkgPT4gcHJvamVjdFtrZXldKTtcbiAgICAgICAgZmllbGRzID0gcG9zaXRpdmVQcm9qZWN0S2V5cy5sZW5ndGhcbiAgICAgICAgICA/IHBvc2l0aXZlUHJvamVjdEtleXMubWFwKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsID0gcHJvamVjdFtrZXldO1xuICAgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgUXVlcnlSYXcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmF3KHZhbC52YWx1ZSwga2V5KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4ga2V5IGFzIEZpZWxkS2V5PEU+O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IChnZXRLZXlzKG1ldGEuZmllbGRzKS5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gcHJvamVjdCkpIGFzIEZpZWxkS2V5PEU+W10pO1xuICAgICAgfVxuICAgICAgZmllbGRzID0gZmllbGRzLmZpbHRlcigoa2V5KSA9PiBrZXkgaW5zdGFuY2VvZiBRdWVyeVJhdyB8fCBtZXRhLmZpZWxkc1trZXkgYXMgRmllbGRLZXk8RT5dKTtcbiAgICAgIGlmICghZmllbGRzLmxlbmd0aCB8fCAob3B0cy5wcmVmaXggJiYgIWZpZWxkcy5pbmNsdWRlcyhtZXRhLmlkKSkpIHtcbiAgICAgICAgZmllbGRzID0gW21ldGEuaWQsIC4uLmZpZWxkc107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpZWxkcyA9IGdldEtleXMobWV0YS5maWVsZHMpIGFzIEZpZWxkS2V5PEU+W107XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpZWxkc1xuICAgICAgLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBRdWVyeVJhdykge1xuICAgICAgICAgIHJldHVybiBnZXRSYXdWYWx1ZSh7XG4gICAgICAgICAgICB2YWx1ZToga2V5LFxuICAgICAgICAgICAgZGlhbGVjdDogdGhpcyxcbiAgICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICAgIGVzY2FwZWRQcmVmaXgsXG4gICAgICAgICAgICBhdXRvUHJlZml4QWxpYXM6IG9wdHMuYXV0b1ByZWZpeEFsaWFzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmllbGQgPSBtZXRhLmZpZWxkc1trZXkgYXMgRmllbGRLZXk8RT5dO1xuXG4gICAgICAgIGlmIChmaWVsZC52aXJ0dWFsKSB7XG4gICAgICAgICAgcmV0dXJuIGdldFJhd1ZhbHVlKHtcbiAgICAgICAgICAgIHZhbHVlOiByYXcoZmllbGQudmlydHVhbC52YWx1ZSwga2V5KSxcbiAgICAgICAgICAgIGRpYWxlY3Q6IHRoaXMsXG4gICAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgICBlc2NhcGVkUHJlZml4LFxuICAgICAgICAgICAgYXV0b1ByZWZpeEFsaWFzOiBvcHRzLmF1dG9QcmVmaXhBbGlhcyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5hbWUgPSBmaWVsZD8ubmFtZSA/PyAoa2V5IGFzIEZpZWxkS2V5PEU+KTtcbiAgICAgICAgY29uc3QgZmllbGRQYXRoID0gYCR7ZXNjYXBlZFByZWZpeH0ke3RoaXMuZXNjYXBlSWQobmFtZSl9YDtcblxuICAgICAgICByZXR1cm4gIW9wdHMuYXV0b1ByZWZpeEFsaWFzICYmIChuYW1lID09PSBrZXkgfHwgIWZpZWxkKSA/IGZpZWxkUGF0aCA6IGAke2ZpZWxkUGF0aH0gJHt0aGlzLmVzY2FwZUlkKChwcmVmaXggKyBrZXkpIGFzIEZpZWxkS2V5PEU+LCB0cnVlKX1gO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCcsICcpO1xuICB9XG5cbiAgcHJvamVjdFJlbGF0aW9uczxFPihlbnRpdHk6IFR5cGU8RT4sIHByb2plY3Q6IFF1ZXJ5UHJvamVjdDxFPiA9IHt9LCB7IHByZWZpeCB9OiB7IHByZWZpeD86IHN0cmluZyB9ID0ge30pOiB7IGZpZWxkczogc3RyaW5nOyB0YWJsZXM6IHN0cmluZyB9IHtcbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YShlbnRpdHkpO1xuICAgIGNvbnN0IHJlbGF0aW9ucyA9IGdldFByb2plY3RSZWxhdGlvbktleXMobWV0YSwgcHJvamVjdCk7XG4gICAgY29uc3QgaXNQcm9qZWN0QXJyYXkgPSBBcnJheS5pc0FycmF5KHByb2plY3QpO1xuICAgIGxldCBmaWVsZHMgPSAnJztcbiAgICBsZXQgdGFibGVzID0gJyc7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZWxhdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlbE9wdHMgPSBtZXRhLnJlbGF0aW9uc1trZXldO1xuXG4gICAgICBpZiAocmVsT3B0cy5jYXJkaW5hbGl0eSA9PT0gJzFtJyB8fCByZWxPcHRzLmNhcmRpbmFsaXR5ID09PSAnbW0nKSB7XG4gICAgICAgIC8vICcxbScgYW5kICdtbScgc2hvdWxkIGJlIHJlc29sdmVkIGluIGEgaGlnaGVyIGxheWVyIGJlY2F1c2UgdGhleSB3aWxsIG5lZWQgbXVsdGlwbGUgcXVlcmllc1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgam9pblJlbEFsaWFzID0gcHJlZml4ID8gcHJlZml4ICsgJy4nICsga2V5IDoga2V5O1xuICAgICAgY29uc3QgcmVsRW50aXR5ID0gcmVsT3B0cy5lbnRpdHkoKTtcbiAgICAgIGNvbnN0IHJlbFByb2plY3QgPSBwcm9qZWN0W2tleSBhcyBzdHJpbmddO1xuICAgICAgY29uc3QgcmVsUXVlcnkgPSBpc1Byb2plY3RBcnJheSA/IHt9IDogQXJyYXkuaXNBcnJheShyZWxQcm9qZWN0KSA/IHsgJHByb2plY3Q6IHJlbFByb2plY3QgfSA6IHJlbFByb2plY3Q7XG5cbiAgICAgIGNvbnN0IHJlbENvbHVtbnMgPSB0aGlzLnByb2plY3RGaWVsZHMocmVsRW50aXR5LCByZWxRdWVyeS4kcHJvamVjdCwge1xuICAgICAgICBwcmVmaXg6IGpvaW5SZWxBbGlhcyxcbiAgICAgICAgYXV0b1ByZWZpeEFsaWFzOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGZpZWxkcyArPSAnLCAnICsgcmVsQ29sdW1ucztcblxuICAgICAgY29uc3QgeyBmaWVsZHM6IHN1YkNvbHVtbnMsIHRhYmxlczogc3ViVGFibGVzIH0gPSB0aGlzLnByb2plY3RSZWxhdGlvbnMocmVsRW50aXR5LCByZWxRdWVyeS4kcHJvamVjdCwge1xuICAgICAgICBwcmVmaXg6IGpvaW5SZWxBbGlhcyxcbiAgICAgIH0pO1xuXG4gICAgICBmaWVsZHMgKz0gc3ViQ29sdW1ucztcblxuICAgICAgY29uc3QgcmVsTWV0YSA9IGdldE1ldGEocmVsRW50aXR5KTtcbiAgICAgIGNvbnN0IHJlbEVudGl0eU5hbWUgPSB0aGlzLmVzY2FwZUlkKHJlbE1ldGEubmFtZSk7XG4gICAgICBjb25zdCByZWxQYXRoID0gcHJlZml4ID8gdGhpcy5lc2NhcGVJZChwcmVmaXgsIHRydWUpIDogdGhpcy5lc2NhcGVJZChtZXRhLm5hbWUpO1xuICAgICAgY29uc3Qgam9pblR5cGUgPSByZWxRdWVyeS4kcmVxdWlyZWQgPyAnSU5ORVInIDogJ0xFRlQnO1xuICAgICAgY29uc3Qgam9pbkFsaWFzID0gdGhpcy5lc2NhcGVJZChqb2luUmVsQWxpYXMsIHRydWUpO1xuXG4gICAgICB0YWJsZXMgKz0gYCAke2pvaW5UeXBlfSBKT0lOICR7cmVsRW50aXR5TmFtZX0gJHtqb2luQWxpYXN9IE9OIGA7XG4gICAgICB0YWJsZXMgKz0gcmVsT3B0cy5yZWZlcmVuY2VzLm1hcCgoaXQpID0+IGAke2pvaW5BbGlhc30uJHt0aGlzLmVzY2FwZUlkKGl0LmZvcmVpZ24pfSA9ICR7cmVsUGF0aH0uJHt0aGlzLmVzY2FwZUlkKGl0LmxvY2FsKX1gKS5qb2luKCcgQU5EICcpO1xuXG4gICAgICBpZiAocmVsUXVlcnkuJGZpbHRlcikge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLndoZXJlKHJlbEVudGl0eSwgcmVsUXVlcnkuJGZpbHRlciwgeyBwcmVmaXg6IGtleSwgY2xhdXNlOiBmYWxzZSB9KTtcbiAgICAgICAgdGFibGVzICs9IGAgQU5EICR7ZmlsdGVyfWA7XG4gICAgICB9XG5cbiAgICAgIHRhYmxlcyArPSBzdWJUYWJsZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZmllbGRzLCB0YWJsZXMgfTtcbiAgfVxuXG4gIHNlbGVjdDxFPihlbnRpdHk6IFR5cGU8RT4sIHFtOiBRdWVyeTxFPiwgb3B0czogUXVlcnlPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG4gICAgY29uc3QgcHJlZml4ID0gb3B0cy5wcmVmaXggPz8gKG9wdHMuYXV0b1ByZWZpeCB8fCBpc1Byb2plY3RpbmdSZWxhdGlvbnMobWV0YSwgcW0uJHByb2plY3QpKSA/IG1ldGEubmFtZSA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMucHJvamVjdEZpZWxkcyhlbnRpdHksIHFtLiRwcm9qZWN0LCB7IHByZWZpeCB9KTtcbiAgICBjb25zdCB7IGZpZWxkczogcmVsYXRpb25GaWVsZHMsIHRhYmxlcyB9ID0gdGhpcy5wcm9qZWN0UmVsYXRpb25zKGVudGl0eSwgcW0uJHByb2plY3QpO1xuXG4gICAgcmV0dXJuIGBTRUxFQ1QgJHtmaWVsZHN9JHtyZWxhdGlvbkZpZWxkc30gRlJPTSAke3RoaXMuZXNjYXBlSWQobWV0YS5uYW1lKX0ke3RhYmxlc31gO1xuICB9XG5cbiAgd2hlcmU8RT4oZW50aXR5OiBUeXBlPEU+LCBmaWx0ZXI6IFF1ZXJ5RmlsdGVyPEU+ID0ge30sIG9wdHM6IFF1ZXJ5RmlsdGVyT3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YShlbnRpdHkpO1xuICAgIGNvbnN0IHsgdXNlUHJlY2VkZW5jZSwgY2xhdXNlID0gJ1dIRVJFJywgc29mdERlbGV0ZSB9ID0gb3B0cztcblxuICAgIGZpbHRlciA9IGdldFF1ZXJ5RmlsdGVyQXNNYXAobWV0YSwgZmlsdGVyKTtcblxuICAgIGlmIChtZXRhLnNvZnREZWxldGUgJiYgKHNvZnREZWxldGUgfHwgc29mdERlbGV0ZSA9PT0gdW5kZWZpbmVkKSAmJiBjbGF1c2UgIT09ICdIQVZJTkcnICYmICFmaWx0ZXJbbWV0YS5zb2Z0RGVsZXRlIGFzIHN0cmluZ10pIHtcbiAgICAgIGZpbHRlclttZXRhLnNvZnREZWxldGUgYXMgc3RyaW5nXSA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGZpbHRlcik7XG5cbiAgICBpZiAoIWVudHJpZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4ub3B0cywgdXNlUHJlY2VkZW5jZTogZW50cmllcy5sZW5ndGggPiAxIH07XG5cbiAgICBsZXQgc3FsID0gZW50cmllcy5tYXAoKFtrZXksIHZhbF0pID0+IHRoaXMuY29tcGFyZShlbnRpdHksIGtleSBhcyBrZXlvZiBRdWVyeUZpbHRlck1hcDxFPiwgdmFsIGFzIGFueSwgb3B0aW9ucykpLmpvaW4oYCBBTkQgYCk7XG5cbiAgICBpZiAodXNlUHJlY2VkZW5jZSkge1xuICAgICAgc3FsID0gYCgke3NxbH0pYDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xhdXNlID8gYCAke2NsYXVzZX0gJHtzcWx9YCA6IHNxbDtcbiAgfVxuXG4gIGNvbXBhcmU8RSwgSyBleHRlbmRzIGtleW9mIFF1ZXJ5RmlsdGVyTWFwPEU+PihlbnRpdHk6IFR5cGU8RT4sIGtleTogSywgdmFsOiBRdWVyeUZpbHRlck1hcDxFPltLXSwgb3B0cz86IFF1ZXJ5Q29tcGFyaXNvbk9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG5cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgUXVlcnlSYXcpIHtcbiAgICAgIGlmIChrZXkgPT09ICckZXhpc3RzJyB8fCBrZXkgPT09ICckbmV4aXN0cycpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWwgYXMgUXVlcnlSYXc7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gZ2V0UmF3VmFsdWUoe1xuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIGRpYWxlY3Q6IHRoaXMsXG4gICAgICAgICAgcHJlZml4OiBtZXRhLm5hbWUsXG4gICAgICAgICAgZXNjYXBlZFByZWZpeDogdGhpcy5lc2NhcGVJZChtZXRhLm5hbWUsIGZhbHNlLCB0cnVlKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBgJHtrZXkgPT09ICckZXhpc3RzJyA/ICdFWElTVFMnIDogJ05PVCBFWElTVFMnfSAoJHtxdWVyeX0pYDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbXBhcmlzb25LZXkgPSB0aGlzLmdldENvbXBhcmlzb25LZXkoZW50aXR5LCBrZXkgYXMgRmllbGRLZXk8RT4sIG9wdHMpO1xuICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9ID0gJHt2YWwudmFsdWV9YDtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnJHRleHQnKSB7XG4gICAgICBjb25zdCBzZWFyY2ggPSB2YWwgYXMgUXVlcnlUZXh0U2VhcmNoT3B0aW9uczxFPjtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IHNlYXJjaC4kZmllbGRzLm1hcCgoZmllbGQpID0+IHRoaXMuZXNjYXBlSWQobWV0YS5maWVsZHNbZmllbGRdPy5uYW1lID8/IGZpZWxkKSk7XG4gICAgICByZXR1cm4gYCR7dGhpcy5lc2NhcGVJZChtZXRhLm5hbWUpfSBNQVRDSCB7JHtmaWVsZHMuam9pbignICcpfX0gOiAke3RoaXMuZXNjYXBlKHNlYXJjaC4kdmFsdWUpfWA7XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gJyRhbmQnIHx8IGtleSA9PT0gJyRvcicgfHwga2V5ID09PSAnJG5vdCcgfHwga2V5ID09PSAnJG5vcicpIHtcbiAgICAgIGNvbnN0IG5lZ2F0ZU9wZXJhdG9yTWFwID0ge1xuICAgICAgICAkbm90OiAnJGFuZCcsXG4gICAgICAgICRub3I6ICckb3InLFxuICAgICAgfSBhcyBjb25zdDtcblxuICAgICAgY29uc3Qgb3A6ICckYW5kJyB8ICckb3InID0gbmVnYXRlT3BlcmF0b3JNYXBba2V5IGFzIHN0cmluZ10gPz8ga2V5O1xuICAgICAgY29uc3QgbmVnYXRlID0ga2V5IGluIG5lZ2F0ZU9wZXJhdG9yTWFwID8gJ05PVCAnIDogJyc7XG5cbiAgICAgIGNvbnN0IHZhbHVlcyA9IHZhbCBhcyBRdWVyeUZpbHRlckxvZ2ljYWw8RT47XG4gICAgICBjb25zdCBoYXNNYW55SXRlbXMgPSB2YWx1ZXMubGVuZ3RoID4gMTtcbiAgICAgIGNvbnN0IGxvZ2ljYWxDb21wYXJpc29uID0gdmFsdWVzXG4gICAgICAgIC5tYXAoKGZpbHRlckVudHJ5KSA9PiB7XG4gICAgICAgICAgaWYgKGZpbHRlckVudHJ5IGluc3RhbmNlb2YgUXVlcnlSYXcpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRSYXdWYWx1ZSh7XG4gICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJFbnRyeSxcbiAgICAgICAgICAgICAgZGlhbGVjdDogdGhpcyxcbiAgICAgICAgICAgICAgcHJlZml4OiBvcHRzLnByZWZpeCxcbiAgICAgICAgICAgICAgZXNjYXBlZFByZWZpeDogdGhpcy5lc2NhcGVJZChvcHRzLnByZWZpeCwgdHJ1ZSwgdHJ1ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMud2hlcmUoZW50aXR5LCBmaWx0ZXJFbnRyeSwge1xuICAgICAgICAgICAgcHJlZml4OiBvcHRzLnByZWZpeCxcbiAgICAgICAgICAgIHVzZVByZWNlZGVuY2U6IGhhc01hbnlJdGVtcyAmJiAhQXJyYXkuaXNBcnJheShmaWx0ZXJFbnRyeSkgJiYgZ2V0S2V5cyhmaWx0ZXJFbnRyeSkubGVuZ3RoID4gMSxcbiAgICAgICAgICAgIGNsYXVzZTogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKG9wID09PSAnJG9yJyA/ICcgT1IgJyA6ICcgQU5EICcpO1xuXG4gICAgICByZXR1cm4gKG9wdHMudXNlUHJlY2VkZW5jZSB8fCBuZWdhdGUpICYmIGhhc01hbnlJdGVtcyA/IGAke25lZ2F0ZX0oJHtsb2dpY2FsQ29tcGFyaXNvbn0pYCA6IGAke25lZ2F0ZX0ke2xvZ2ljYWxDb21wYXJpc29ufWA7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbCkgPyB7ICRpbjogdmFsIH0gOiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgPyB2YWwgOiB7ICRlcTogdmFsIH07XG4gICAgY29uc3Qgb3BlcmF0b3JzID0gZ2V0S2V5cyh2YWx1ZSkgYXMgKGtleW9mIFF1ZXJ5RmlsdGVyRmllbGRPcGVyYXRvck1hcDxFPilbXTtcbiAgICBjb25zdCBjb21wYXJpc29ucyA9IG9wZXJhdG9ycy5tYXAoKG9wKSA9PiB0aGlzLmNvbXBhcmVGaWVsZE9wZXJhdG9yKGVudGl0eSwga2V5IGFzIEZpZWxkS2V5PEU+LCBvcCwgdmFsdWVbb3BdLCBvcHRzKSkuam9pbignIEFORCAnKTtcblxuICAgIHJldHVybiBvcGVyYXRvcnMubGVuZ3RoID4gMSA/IGAoJHtjb21wYXJpc29uc30pYCA6IGNvbXBhcmlzb25zO1xuICB9XG5cbiAgY29tcGFyZUZpZWxkT3BlcmF0b3I8RSwgSyBleHRlbmRzIGtleW9mIFF1ZXJ5RmlsdGVyRmllbGRPcGVyYXRvck1hcDxFPj4oXG4gICAgZW50aXR5OiBUeXBlPEU+LFxuICAgIGtleTogRmllbGRLZXk8RT4sXG4gICAgb3A6IEssXG4gICAgdmFsOiBRdWVyeUZpbHRlckZpZWxkT3BlcmF0b3JNYXA8RT5bS10sXG4gICAgb3B0cz86IFF1ZXJ5T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbXBhcmlzb25LZXkgPSB0aGlzLmdldENvbXBhcmlzb25LZXkoZW50aXR5LCBrZXksIG9wdHMpO1xuICAgIHN3aXRjaCAob3ApIHtcbiAgICAgIGNhc2UgJyRlcSc6XG4gICAgICAgIHJldHVybiB2YWwgPT09IG51bGwgPyBgJHtjb21wYXJpc29uS2V5fSBJUyBOVUxMYCA6IGAke2NvbXBhcmlzb25LZXl9ID0gJHt0aGlzLmVzY2FwZSh2YWwpfWA7XG4gICAgICBjYXNlICckbmUnOlxuICAgICAgICByZXR1cm4gdmFsID09PSBudWxsID8gYCR7Y29tcGFyaXNvbktleX0gSVMgTk9UIE5VTExgIDogYCR7Y29tcGFyaXNvbktleX0gPD4gJHt0aGlzLmVzY2FwZSh2YWwpfWA7XG4gICAgICBjYXNlICckbm90JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShlbnRpdHksICckbm90JywgW3sgW2tleV06IHZhbCB9XSBhcyBhbnksIG9wdHMpO1xuICAgICAgY2FzZSAnJGd0JzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9ID4gJHt0aGlzLmVzY2FwZSh2YWwpfWA7XG4gICAgICBjYXNlICckZ3RlJzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9ID49ICR7dGhpcy5lc2NhcGUodmFsKX1gO1xuICAgICAgY2FzZSAnJGx0JzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9IDwgJHt0aGlzLmVzY2FwZSh2YWwpfWA7XG4gICAgICBjYXNlICckbHRlJzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9IDw9ICR7dGhpcy5lc2NhcGUodmFsKX1gO1xuICAgICAgY2FzZSAnJHN0YXJ0c1dpdGgnOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gTElLRSAke3RoaXMuZXNjYXBlKGAke3ZhbH0lYCl9YDtcbiAgICAgIGNhc2UgJyRpc3RhcnRzV2l0aCc6XG4gICAgICAgIHJldHVybiBgTE9XRVIoJHtjb21wYXJpc29uS2V5fSkgTElLRSAke3RoaXMuZXNjYXBlKCh2YWwgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpICsgJyUnKX1gO1xuICAgICAgY2FzZSAnJGVuZHNXaXRoJzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9IExJS0UgJHt0aGlzLmVzY2FwZShgJSR7dmFsfWApfWA7XG4gICAgICBjYXNlICckaWVuZHNXaXRoJzpcbiAgICAgICAgcmV0dXJuIGBMT1dFUigke2NvbXBhcmlzb25LZXl9KSBMSUtFICR7dGhpcy5lc2NhcGUoJyUnICsgKHZhbCBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkpfWA7XG4gICAgICBjYXNlICckaW5jbHVkZXMnOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gTElLRSAke3RoaXMuZXNjYXBlKGAlJHt2YWx9JWApfWA7XG4gICAgICBjYXNlICckaWluY2x1ZGVzJzpcbiAgICAgICAgcmV0dXJuIGBMT1dFUigke2NvbXBhcmlzb25LZXl9KSBMSUtFICR7dGhpcy5lc2NhcGUoJyUnICsgKHZhbCBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkgKyAnJScpfWA7XG4gICAgICBjYXNlICckaWxpa2UnOlxuICAgICAgICByZXR1cm4gYExPV0VSKCR7Y29tcGFyaXNvbktleX0pIExJS0UgJHt0aGlzLmVzY2FwZSgodmFsIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKSl9YDtcbiAgICAgIGNhc2UgJyRsaWtlJzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9IExJS0UgJHt0aGlzLmVzY2FwZSh2YWwpfWA7XG4gICAgICBjYXNlICckaW4nOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gSU4gKCR7dGhpcy5lc2NhcGUodmFsKX0pYDtcbiAgICAgIGNhc2UgJyRuaW4nOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gTk9UIElOICgke3RoaXMuZXNjYXBlKHZhbCl9KWA7XG4gICAgICBjYXNlICckcmVnZXgnOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gUkVHRVhQICR7dGhpcy5lc2NhcGUodmFsKX1gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKGB1bmtub3duIG9wZXJhdG9yOiAke29wfWApO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbXBhcmlzb25LZXk8RT4oZW50aXR5OiBUeXBlPEU+LCBrZXk6IEZpZWxkS2V5PEU+LCB7IHByZWZpeCB9OiBRdWVyeU9wdGlvbnMgPSB7fSk6IFNjYWxhciB7XG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcbiAgICBjb25zdCBlc2NhcGVkUHJlZml4ID0gdGhpcy5lc2NhcGVJZChwcmVmaXgsIHRydWUsIHRydWUpO1xuICAgIGNvbnN0IGZpZWxkID0gbWV0YS5maWVsZHNba2V5XTtcblxuICAgIGlmIChmaWVsZD8udmlydHVhbCkge1xuICAgICAgcmV0dXJuIGdldFJhd1ZhbHVlKHtcbiAgICAgICAgdmFsdWU6IGZpZWxkLnZpcnR1YWwsXG4gICAgICAgIGRpYWxlY3Q6IHRoaXMsXG4gICAgICAgIHByZWZpeCxcbiAgICAgICAgZXNjYXBlZFByZWZpeCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBlc2NhcGVkUHJlZml4ICsgdGhpcy5lc2NhcGVJZChmaWVsZD8ubmFtZSA/PyBrZXkpO1xuICB9XG5cbiAgZ3JvdXA8RT4oZW50aXR5OiBUeXBlPEU+LCBmaWVsZHM6IHJlYWRvbmx5IEZpZWxkS2V5PEU+W10sIG9wdHM6IFF1ZXJ5T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICBpZiAoIWZpZWxkcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG4gICAgY29uc3QgbmFtZXMgPSBmaWVsZHMubWFwKChrZXkpID0+IHRoaXMuZXNjYXBlSWQobWV0YS5maWVsZHNba2V5XT8ubmFtZSA/PyBrZXkpKS5qb2luKCcsICcpO1xuICAgIHJldHVybiBgIEdST1VQIEJZICR7bmFtZXN9YDtcbiAgfVxuXG4gIHNvcnQ8RT4oZW50aXR5OiBUeXBlPEU+LCBzb3J0OiBRdWVyeVNvcnQ8RT4sIHsgcHJlZml4IH06IFF1ZXJ5T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICBjb25zdCBzb3J0TWFwID0gYnVpbGRTb3J0TWFwKHNvcnQpO1xuICAgIGlmICghaGFzS2V5cyhzb3J0TWFwKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YShlbnRpdHkpO1xuICAgIGNvbnN0IGZsYXR0ZW5lZFNvcnQgPSBmbGF0T2JqZWN0KHNvcnRNYXAsIHByZWZpeCk7XG4gICAgY29uc3QgZGlyZWN0aW9uTWFwID0geyAxOiAnJywgYXNjOiAnJywgJy0xJzogJyBERVNDJywgZGVzYzogJyBERVNDJyB9IGFzIGNvbnN0O1xuICAgIGNvbnN0IG9yZGVyID0gT2JqZWN0LmVudHJpZXMoZmxhdHRlbmVkU29ydClcbiAgICAgIC5tYXAoKFtrZXksIHNvcnRdKSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBtZXRhLmZpZWxkc1trZXldPy5uYW1lID8/IGtleTtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gZGlyZWN0aW9uTWFwW3NvcnQgYXMgUXVlcnlTb3J0RGlyZWN0aW9uXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXNjYXBlSWQobmFtZSkgKyBkaXJlY3Rpb247XG4gICAgICB9KVxuICAgICAgLmpvaW4oJywgJyk7XG4gICAgcmV0dXJuIGAgT1JERVIgQlkgJHtvcmRlcn1gO1xuICB9XG5cbiAgcGFnZXIob3B0czogUXVlcnlQYWdlcik6IHN0cmluZyB7XG4gICAgbGV0IHNxbCA9ICcnO1xuICAgIGlmIChvcHRzLiRsaW1pdCkge1xuICAgICAgc3FsICs9IGAgTElNSVQgJHtOdW1iZXIob3B0cy4kbGltaXQpfWA7XG4gICAgfVxuICAgIGlmIChvcHRzLiRza2lwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNxbCArPSBgIE9GRlNFVCAke051bWJlcihvcHRzLiRza2lwKX1gO1xuICAgIH1cbiAgICByZXR1cm4gc3FsO1xuICB9XG5cbiAgY291bnQ8RT4oZW50aXR5OiBUeXBlPEU+LCBxbTogUXVlcnlTZWFyY2g8RT4sIG9wdHM/OiBRdWVyeU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNlYXJjaDogUXVlcnk8RT4gPSB7XG4gICAgICAuLi5xbSxcbiAgICAgICRwcm9qZWN0OiBbcmF3KCdDT1VOVCgqKScsICdjb3VudCcpXSxcbiAgICB9O1xuXG4gICAgZGVsZXRlIHNlYXJjaC4kc29ydDtcbiAgICBkZWxldGUgc2VhcmNoLiRza2lwO1xuICAgIGRlbGV0ZSBzZWFyY2guJGxpbWl0O1xuXG4gICAgY29uc3Qgc2VsZWN0ID0gdGhpcy5zZWxlY3Q8RT4oZW50aXR5LCBzZWFyY2gpO1xuICAgIGNvbnN0IGNyaXRlcmlhID0gdGhpcy5jcml0ZXJpYShlbnRpdHksIHNlYXJjaCwgb3B0cyk7XG5cbiAgICByZXR1cm4gc2VsZWN0ICsgY3JpdGVyaWE7XG4gIH1cblxuICBmaW5kPEU+KGVudGl0eTogVHlwZTxFPiwgcW06IFF1ZXJ5PEU+LCBvcHRzPzogUXVlcnlPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWxlY3QgPSB0aGlzLnNlbGVjdDxFPihlbnRpdHksIHFtLCBvcHRzKTtcbiAgICBjb25zdCBjcml0ZXJpYSA9IHRoaXMuY3JpdGVyaWEoZW50aXR5LCBxbSwgb3B0cyk7XG4gICAgcmV0dXJuIHNlbGVjdCArIGNyaXRlcmlhO1xuICB9XG5cbiAgaW5zZXJ0PEU+KGVudGl0eTogVHlwZTxFPiwgcGF5bG9hZDogRSB8IEVbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcbiAgICBjb25zdCByZWNvcmRzID0gZ2V0UGVyc2lzdGFibGVzKG1ldGEsIHBheWxvYWQsICdvbkluc2VydCcpO1xuICAgIGNvbnN0IGtleXMgPSBnZXRLZXlzKHJlY29yZHNbMF0pO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBrZXlzLm1hcCgoa2V5KSA9PiB0aGlzLmVzY2FwZUlkKG1ldGEuZmllbGRzW2tleV0ubmFtZSkpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHJlY29yZHMubWFwKChyZWNvcmQpID0+IGtleXMubWFwKChrZXkpID0+IHRoaXMuZXNjYXBlKHJlY29yZFtrZXldKSkuam9pbignLCAnKSkuam9pbignKSwgKCcpO1xuICAgIHJldHVybiBgSU5TRVJUIElOVE8gJHt0aGlzLmVzY2FwZUlkKG1ldGEubmFtZSl9ICgke2NvbHVtbnMuam9pbignLCAnKX0pIFZBTFVFUyAoJHt2YWx1ZXN9KWA7XG4gIH1cblxuICB1cGRhdGU8RT4oZW50aXR5OiBUeXBlPEU+LCBxbTogUXVlcnlDcml0ZXJpYTxFPiwgcGF5bG9hZDogRSwgb3B0cz86IFF1ZXJ5T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcbiAgICBjb25zdCByZWNvcmQgPSBnZXRQZXJzaXN0YWJsZShtZXRhLCBwYXlsb2FkLCAnb25VcGRhdGUnKTtcbiAgICBjb25zdCBrZXlzID0gZ2V0S2V5cyhyZWNvcmQpO1xuICAgIGNvbnN0IGVudHJpZXMgPSBrZXlzLm1hcCgoa2V5KSA9PiBgJHt0aGlzLmVzY2FwZUlkKGtleSl9ID0gJHt0aGlzLmVzY2FwZShwYXlsb2FkW2tleV0pfWApLmpvaW4oJywgJyk7XG4gICAgY29uc3QgY3JpdGVyaWEgPSB0aGlzLmNyaXRlcmlhKGVudGl0eSwgcW0sIG9wdHMpO1xuICAgIHJldHVybiBgVVBEQVRFICR7dGhpcy5lc2NhcGVJZChtZXRhLm5hbWUpfSBTRVQgJHtlbnRyaWVzfSR7Y3JpdGVyaWF9YDtcbiAgfVxuXG4gIGRlbGV0ZTxFPihlbnRpdHk6IFR5cGU8RT4sIHFtOiBRdWVyeUNyaXRlcmlhPEU+LCBvcHRzOiBRdWVyeU9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcblxuICAgIGlmIChvcHRzLnNvZnREZWxldGUgfHwgb3B0cy5zb2Z0RGVsZXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChtZXRhLnNvZnREZWxldGUpIHtcbiAgICAgICAgY29uc3QgY3JpdGVyaWEgPSB0aGlzLmNyaXRlcmlhKGVudGl0eSwgcW0sIG9wdHMpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEZpZWxkQ2FsbGJhY2tWYWx1ZShtZXRhLmZpZWxkc1ttZXRhLnNvZnREZWxldGVdLm9uRGVsZXRlKTtcbiAgICAgICAgcmV0dXJuIGBVUERBVEUgJHt0aGlzLmVzY2FwZUlkKG1ldGEubmFtZSl9IFNFVCAke3RoaXMuZXNjYXBlSWQobWV0YS5zb2Z0RGVsZXRlKX0gPSAke3RoaXMuZXNjYXBlKHZhbHVlKX0ke2NyaXRlcmlhfWA7XG4gICAgICB9IGVsc2UgaWYgKG9wdHMuc29mdERlbGV0ZSkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYCcke21ldGEubmFtZX0nIGhhcyBub3QgZW5hYmxlZCAnc29mdERlbGV0ZSdgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjcml0ZXJpYSA9IHRoaXMuY3JpdGVyaWEoZW50aXR5LCBxbSwgb3B0cyk7XG5cbiAgICByZXR1cm4gYERFTEVURSBGUk9NICR7dGhpcy5lc2NhcGVJZChtZXRhLm5hbWUpfSR7Y3JpdGVyaWF9YDtcbiAgfVxuXG4gIGVzY2FwZUlkKHZhbDogc3RyaW5nLCBmb3JiaWRRdWFsaWZpZWQ/OiBib29sZWFuLCBhZGREb3Q/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmICghZm9yYmlkUXVhbGlmaWVkICYmIHZhbC5pbmNsdWRlcygnLicpKSB7XG4gICAgICByZXR1cm4gdmFsXG4gICAgICAgIC5zcGxpdCgnLicpXG4gICAgICAgIC5tYXAoKGl0KSA9PiB0aGlzLmVzY2FwZUlkKGl0KSlcbiAgICAgICAgLmpvaW4oJy4nKTtcbiAgICB9XG5cbiAgICAvLyBzb3VyY2VkIGZyb20gJ2VzY2FwZUlkJyBmdW5jdGlvbiBoZXJlIGh0dHBzOi8vZ2l0aHViLmNvbS9teXNxbGpzL3NxbHN0cmluZy9ibG9iL21hc3Rlci9saWIvU3FsU3RyaW5nLmpzXG4gICAgY29uc3QgZXNjYXBlZCA9IHRoaXMuZXNjYXBlSWRDaGFyICsgdmFsLnJlcGxhY2UodGhpcy5lc2NhcGVJZFJlZ2V4LCB0aGlzLmVzY2FwZUlkQ2hhciArIHRoaXMuZXNjYXBlSWRDaGFyKSArIHRoaXMuZXNjYXBlSWRDaGFyO1xuXG4gICAgY29uc3Qgc3VmZml4ID0gYWRkRG90ID8gJy4nIDogJyc7XG5cbiAgICByZXR1cm4gZXNjYXBlZCArIHN1ZmZpeDtcbiAgfVxuXG4gIGVzY2FwZSh2YWx1ZTogYW55KTogU2NhbGFyIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBRdWVyeVJhdykge1xuICAgICAgcmV0dXJuIGdldFJhd1ZhbHVlKHsgdmFsdWUsIGRpYWxlY3Q6IHRoaXMgfSk7XG4gICAgfVxuICAgIHJldHVybiBlc2NhcGUodmFsdWUpO1xuICB9XG59XG4iXX0=
@@ -1,4 +1,4 @@
1
- export * from './abstractSqlDialect';
2
- export * from './mysqlDialect';
3
- export * from './postgresDialect';
4
- export * from './sqliteDialect';
1
+ export * from './abstractSqlDialect.js';
2
+ export * from './mysqlDialect.js';
3
+ export * from './postgresDialect.js';
4
+ export * from './sqliteDialect.js';
package/dialect/index.js CHANGED
@@ -1,8 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- tslib_1.__exportStar(require("./abstractSqlDialect"), exports);
5
- tslib_1.__exportStar(require("./mysqlDialect"), exports);
6
- tslib_1.__exportStar(require("./postgresDialect"), exports);
7
- tslib_1.__exportStar(require("./sqliteDialect"), exports);
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGlhbGVjdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrREFBcUM7QUFDckMseURBQStCO0FBQy9CLDREQUFrQztBQUNsQywwREFBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Fic3RyYWN0U3FsRGlhbGVjdCc7XG5leHBvcnQgKiBmcm9tICcuL215c3FsRGlhbGVjdCc7XG5leHBvcnQgKiBmcm9tICcuL3Bvc3RncmVzRGlhbGVjdCc7XG5leHBvcnQgKiBmcm9tICcuL3NxbGl0ZURpYWxlY3QnO1xuIl19
1
+ export * from './abstractSqlDialect.js';
2
+ export * from './mysqlDialect.js';
3
+ export * from './postgresDialect.js';
4
+ export * from './sqliteDialect.js';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGlhbGVjdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hYnN0cmFjdFNxbERpYWxlY3QuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9teXNxbERpYWxlY3QuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9wb3N0Z3Jlc0RpYWxlY3QuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zcWxpdGVEaWFsZWN0LmpzJztcbiJdfQ==
@@ -1,5 +1,5 @@
1
- import { QueryComparisonOptions, QueryFilterMap, Type } from '../type';
2
- import { AbstractSqlDialect } from './abstractSqlDialect';
1
+ import { QueryComparisonOptions, QueryFilterMap, Type } from '../type/index.js';
2
+ import { AbstractSqlDialect } from './abstractSqlDialect.js';
3
3
  export declare class MySqlDialect extends AbstractSqlDialect {
4
4
  constructor();
5
5
  compare<E, K extends keyof QueryFilterMap<E>>(entity: Type<E>, key: K, val: QueryFilterMap<E>[K], opts?: QueryComparisonOptions): string;
@@ -1,15 +1,12 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MySqlDialect = void 0;
4
- const entity_1 = require("../entity");
5
- const abstractSqlDialect_1 = require("./abstractSqlDialect");
6
- class MySqlDialect extends abstractSqlDialect_1.AbstractSqlDialect {
1
+ import { getMeta } from '../entity/index.js';
2
+ import { AbstractSqlDialect } from './abstractSqlDialect.js';
3
+ export class MySqlDialect extends AbstractSqlDialect {
7
4
  constructor() {
8
5
  super('`', 'START TRANSACTION');
9
6
  }
10
7
  compare(entity, key, val, opts) {
11
8
  if (key === '$text') {
12
- const meta = (0, entity_1.getMeta)(entity);
9
+ const meta = getMeta(entity);
13
10
  const search = val;
14
11
  const fields = search.$fields.map((field) => this.escapeId(meta.fields[field]?.name ?? field));
15
12
  return `MATCH(${fields.join(', ')}) AGAINST(${this.escape(search.$value)})`;
@@ -17,5 +14,4 @@ class MySqlDialect extends abstractSqlDialect_1.AbstractSqlDialect {
17
14
  return super.compare(entity, key, val, opts);
18
15
  }
19
16
  }
20
- exports.MySqlDialect = MySqlDialect;
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXlzcWxEaWFsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpYWxlY3QvbXlzcWxEaWFsZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNDQUFvQztBQUVwQyw2REFBMEQ7QUFFMUQsTUFBYSxZQUFhLFNBQVEsdUNBQWtCO0lBQ2xEO1FBQ0UsS0FBSyxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFUSxPQUFPLENBQXVDLE1BQWUsRUFBRSxHQUFNLEVBQUUsR0FBeUIsRUFBRSxJQUE2QjtRQUN0SSxJQUFJLEdBQUcsS0FBSyxPQUFPLEVBQUU7WUFDbkIsTUFBTSxJQUFJLEdBQUcsSUFBQSxnQkFBTyxFQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdCLE1BQU0sTUFBTSxHQUFHLEdBQWdDLENBQUM7WUFDaEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMvRixPQUFPLFNBQVMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1NBQzdFO1FBQ0QsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9DLENBQUM7Q0FDRjtBQWRELG9DQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0TWV0YSB9IGZyb20gJy4uL2VudGl0eSc7XG5pbXBvcnQgeyBRdWVyeUNvbXBhcmlzb25PcHRpb25zLCBRdWVyeUZpbHRlck1hcCwgUXVlcnlUZXh0U2VhcmNoT3B0aW9ucywgVHlwZSB9IGZyb20gJy4uL3R5cGUnO1xuaW1wb3J0IHsgQWJzdHJhY3RTcWxEaWFsZWN0IH0gZnJvbSAnLi9hYnN0cmFjdFNxbERpYWxlY3QnO1xuXG5leHBvcnQgY2xhc3MgTXlTcWxEaWFsZWN0IGV4dGVuZHMgQWJzdHJhY3RTcWxEaWFsZWN0IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ2AnLCAnU1RBUlQgVFJBTlNBQ1RJT04nKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbXBhcmU8RSwgSyBleHRlbmRzIGtleW9mIFF1ZXJ5RmlsdGVyTWFwPEU+PihlbnRpdHk6IFR5cGU8RT4sIGtleTogSywgdmFsOiBRdWVyeUZpbHRlck1hcDxFPltLXSwgb3B0cz86IFF1ZXJ5Q29tcGFyaXNvbk9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGlmIChrZXkgPT09ICckdGV4dCcpIHtcbiAgICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG4gICAgICBjb25zdCBzZWFyY2ggPSB2YWwgYXMgUXVlcnlUZXh0U2VhcmNoT3B0aW9uczxFPjtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IHNlYXJjaC4kZmllbGRzLm1hcCgoZmllbGQpID0+IHRoaXMuZXNjYXBlSWQobWV0YS5maWVsZHNbZmllbGRdPy5uYW1lID8/IGZpZWxkKSk7XG4gICAgICByZXR1cm4gYE1BVENIKCR7ZmllbGRzLmpvaW4oJywgJyl9KSBBR0FJTlNUKCR7dGhpcy5lc2NhcGUoc2VhcmNoLiR2YWx1ZSl9KWA7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5jb21wYXJlKGVudGl0eSwga2V5LCB2YWwsIG9wdHMpO1xuICB9XG59XG4iXX0=
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXlzcWxEaWFsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpYWxlY3QvbXlzcWxEaWFsZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU3RCxNQUFNLE9BQU8sWUFBYSxTQUFRLGtCQUFrQjtJQUNsRDtRQUNFLEtBQUssQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRVEsT0FBTyxDQUF1QyxNQUFlLEVBQUUsR0FBTSxFQUFFLEdBQXlCLEVBQUUsSUFBNkI7UUFDdEksSUFBSSxHQUFHLEtBQUssT0FBTyxFQUFFO1lBQ25CLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QixNQUFNLE1BQU0sR0FBRyxHQUFnQyxDQUFDO1lBQ2hELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDL0YsT0FBTyxTQUFTLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztTQUM3RTtRQUNELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMvQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRNZXRhIH0gZnJvbSAnLi4vZW50aXR5L2luZGV4LmpzJztcbmltcG9ydCB7IFF1ZXJ5Q29tcGFyaXNvbk9wdGlvbnMsIFF1ZXJ5RmlsdGVyTWFwLCBRdWVyeVRleHRTZWFyY2hPcHRpb25zLCBUeXBlIH0gZnJvbSAnLi4vdHlwZS9pbmRleC5qcyc7XG5pbXBvcnQgeyBBYnN0cmFjdFNxbERpYWxlY3QgfSBmcm9tICcuL2Fic3RyYWN0U3FsRGlhbGVjdC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBNeVNxbERpYWxlY3QgZXh0ZW5kcyBBYnN0cmFjdFNxbERpYWxlY3Qge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignYCcsICdTVEFSVCBUUkFOU0FDVElPTicpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29tcGFyZTxFLCBLIGV4dGVuZHMga2V5b2YgUXVlcnlGaWx0ZXJNYXA8RT4+KGVudGl0eTogVHlwZTxFPiwga2V5OiBLLCB2YWw6IFF1ZXJ5RmlsdGVyTWFwPEU+W0tdLCBvcHRzPzogUXVlcnlDb21wYXJpc29uT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgaWYgKGtleSA9PT0gJyR0ZXh0Jykge1xuICAgICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcbiAgICAgIGNvbnN0IHNlYXJjaCA9IHZhbCBhcyBRdWVyeVRleHRTZWFyY2hPcHRpb25zPEU+O1xuICAgICAgY29uc3QgZmllbGRzID0gc2VhcmNoLiRmaWVsZHMubWFwKChmaWVsZCkgPT4gdGhpcy5lc2NhcGVJZChtZXRhLmZpZWxkc1tmaWVsZF0/Lm5hbWUgPz8gZmllbGQpKTtcbiAgICAgIHJldHVybiBgTUFUQ0goJHtmaWVsZHMuam9pbignLCAnKX0pIEFHQUlOU1QoJHt0aGlzLmVzY2FwZShzZWFyY2guJHZhbHVlKX0pYDtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLmNvbXBhcmUoZW50aXR5LCBrZXksIHZhbCwgb3B0cyk7XG4gIH1cbn1cbiJdfQ==
@@ -1,5 +1,5 @@
1
1
  import { QueryComparisonOptions, QueryFilterMap, QueryOptions, QueryFilterFieldOperatorMap, Type, FieldKey } from '@uql/core/type';
2
- import { AbstractSqlDialect } from './abstractSqlDialect';
2
+ import { AbstractSqlDialect } from './abstractSqlDialect.js';
3
3
  export declare class PostgresDialect extends AbstractSqlDialect {
4
4
  constructor();
5
5
  insert<E>(entity: Type<E>, payload: E | E[]): string;