velocious 1.0.566 → 1.0.568

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 (110) hide show
  1. package/README.md +31 -1
  2. package/bin/velocious.js +28 -1
  3. package/build/bin/velocious.js +28 -1
  4. package/build/database/drivers/base-table.js +4 -3
  5. package/build/database/drivers/base.js +28 -0
  6. package/build/database/drivers/index-metadata.js +28 -0
  7. package/build/database/drivers/mssql/column.js +2 -34
  8. package/build/database/drivers/mssql/columns-index.js +37 -0
  9. package/build/database/drivers/mssql/table.js +55 -11
  10. package/build/database/drivers/mysql/sql/alter-table.js +13 -0
  11. package/build/database/drivers/pgsql/column.js +2 -27
  12. package/build/database/drivers/pgsql/columns-index.js +37 -0
  13. package/build/database/drivers/pgsql/table.js +61 -10
  14. package/build/database/drivers/sqlite/sql/alter-table.js +18 -0
  15. package/build/database/migration/index.js +92 -3
  16. package/build/database/query/alter-table-base.js +20 -1
  17. package/build/database/record/attachments/normalize-input.js +38 -10
  18. package/build/database/record/attachments/storage-drivers/filesystem.js +33 -2
  19. package/build/database/record/attachments/storage-drivers/native.js +17 -2
  20. package/build/database/record/attachments/storage-drivers/s3.js +27 -7
  21. package/build/database/record/attachments/store.js +159 -43
  22. package/build/database/table-data/table-foreign-key.js +9 -1
  23. package/build/environment-handlers/base.js +1 -1
  24. package/build/environment-handlers/node/attachment-path-source.js +144 -0
  25. package/build/environment-handlers/node.js +28 -3
  26. package/build/src/database/drivers/base-table.d.ts.map +1 -1
  27. package/build/src/database/drivers/base-table.js +4 -3
  28. package/build/src/database/drivers/base.d.ts +7 -0
  29. package/build/src/database/drivers/base.d.ts.map +1 -1
  30. package/build/src/database/drivers/base.js +24 -1
  31. package/build/src/database/drivers/index-metadata.d.ts +41 -0
  32. package/build/src/database/drivers/index-metadata.d.ts.map +1 -0
  33. package/build/src/database/drivers/index-metadata.js +26 -0
  34. package/build/src/database/drivers/mssql/column.d.ts.map +1 -1
  35. package/build/src/database/drivers/mssql/column.js +3 -31
  36. package/build/src/database/drivers/mssql/columns-index.d.ts +41 -0
  37. package/build/src/database/drivers/mssql/columns-index.d.ts.map +1 -1
  38. package/build/src/database/drivers/mssql/columns-index.js +35 -1
  39. package/build/src/database/drivers/mssql/table.d.ts +42 -0
  40. package/build/src/database/drivers/mssql/table.d.ts.map +1 -1
  41. package/build/src/database/drivers/mssql/table.js +49 -12
  42. package/build/src/database/drivers/mysql/sql/alter-table.d.ts.map +1 -1
  43. package/build/src/database/drivers/mysql/sql/alter-table.js +12 -1
  44. package/build/src/database/drivers/pgsql/column.d.ts.map +1 -1
  45. package/build/src/database/drivers/pgsql/column.js +3 -24
  46. package/build/src/database/drivers/pgsql/columns-index.d.ts +41 -0
  47. package/build/src/database/drivers/pgsql/columns-index.d.ts.map +1 -1
  48. package/build/src/database/drivers/pgsql/columns-index.js +35 -1
  49. package/build/src/database/drivers/pgsql/table.d.ts +42 -0
  50. package/build/src/database/drivers/pgsql/table.d.ts.map +1 -1
  51. package/build/src/database/drivers/pgsql/table.js +54 -11
  52. package/build/src/database/drivers/sqlite/sql/alter-table.d.ts.map +1 -1
  53. package/build/src/database/drivers/sqlite/sql/alter-table.js +15 -1
  54. package/build/src/database/migration/index.d.ts +35 -1
  55. package/build/src/database/migration/index.d.ts.map +1 -1
  56. package/build/src/database/migration/index.js +78 -4
  57. package/build/src/database/query/alter-table-base.d.ts +6 -0
  58. package/build/src/database/query/alter-table-base.d.ts.map +1 -1
  59. package/build/src/database/query/alter-table-base.js +18 -2
  60. package/build/src/database/record/attachments/normalize-input.d.ts +33 -4
  61. package/build/src/database/record/attachments/normalize-input.d.ts.map +1 -1
  62. package/build/src/database/record/attachments/normalize-input.js +39 -11
  63. package/build/src/database/record/attachments/storage-drivers/filesystem.d.ts +2 -5
  64. package/build/src/database/record/attachments/storage-drivers/filesystem.d.ts.map +1 -1
  65. package/build/src/database/record/attachments/storage-drivers/filesystem.js +28 -3
  66. package/build/src/database/record/attachments/storage-drivers/native.d.ts +2 -6
  67. package/build/src/database/record/attachments/storage-drivers/native.d.ts.map +1 -1
  68. package/build/src/database/record/attachments/storage-drivers/native.js +14 -3
  69. package/build/src/database/record/attachments/storage-drivers/s3.d.ts +2 -6
  70. package/build/src/database/record/attachments/storage-drivers/s3.d.ts.map +1 -1
  71. package/build/src/database/record/attachments/storage-drivers/s3.js +29 -8
  72. package/build/src/database/record/attachments/store.d.ts +27 -0
  73. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  74. package/build/src/database/record/attachments/store.js +144 -44
  75. package/build/src/database/table-data/table-foreign-key.d.ts +9 -1
  76. package/build/src/database/table-data/table-foreign-key.d.ts.map +1 -1
  77. package/build/src/database/table-data/table-foreign-key.js +9 -2
  78. package/build/src/environment-handlers/base.d.ts +2 -5
  79. package/build/src/environment-handlers/base.d.ts.map +1 -1
  80. package/build/src/environment-handlers/base.js +2 -2
  81. package/build/src/environment-handlers/node/attachment-path-source.d.ts +64 -0
  82. package/build/src/environment-handlers/node/attachment-path-source.d.ts.map +1 -0
  83. package/build/src/environment-handlers/node/attachment-path-source.js +116 -0
  84. package/build/src/environment-handlers/node.d.ts +12 -0
  85. package/build/src/environment-handlers/node.d.ts.map +1 -1
  86. package/build/src/environment-handlers/node.js +24 -4
  87. package/build/tsconfig.tsbuildinfo +1 -1
  88. package/package.json +1 -1
  89. package/src/database/drivers/base-table.js +4 -3
  90. package/src/database/drivers/base.js +28 -0
  91. package/src/database/drivers/index-metadata.js +28 -0
  92. package/src/database/drivers/mssql/column.js +2 -34
  93. package/src/database/drivers/mssql/columns-index.js +37 -0
  94. package/src/database/drivers/mssql/table.js +55 -11
  95. package/src/database/drivers/mysql/sql/alter-table.js +13 -0
  96. package/src/database/drivers/pgsql/column.js +2 -27
  97. package/src/database/drivers/pgsql/columns-index.js +37 -0
  98. package/src/database/drivers/pgsql/table.js +61 -10
  99. package/src/database/drivers/sqlite/sql/alter-table.js +18 -0
  100. package/src/database/migration/index.js +92 -3
  101. package/src/database/query/alter-table-base.js +20 -1
  102. package/src/database/record/attachments/normalize-input.js +38 -10
  103. package/src/database/record/attachments/storage-drivers/filesystem.js +33 -2
  104. package/src/database/record/attachments/storage-drivers/native.js +17 -2
  105. package/src/database/record/attachments/storage-drivers/s3.js +27 -7
  106. package/src/database/record/attachments/store.js +159 -43
  107. package/src/database/table-data/table-foreign-key.js +9 -1
  108. package/src/environment-handlers/base.js +1 -1
  109. package/src/environment-handlers/node/attachment-path-source.js +144 -0
  110. package/src/environment-handlers/node.js +28 -3
@@ -230,6 +230,49 @@ export default class VelociousDatabaseMigration {
230
230
  name: resolvedName
231
231
  });
232
232
  }
233
+ /**
234
+ * RemoveForeignKeyArgsType type.
235
+ * @typedef {object} RemoveForeignKeyArgsType
236
+ * @property {string} [columnName] - Override the derived foreign-key column name.
237
+ */
238
+ /**
239
+ * Runs remove foreign key.
240
+ * @param {string} tableName - Table the foreign key lives on.
241
+ * @param {string} referenceName - Singular reference name used to derive the FK column.
242
+ * @param {RemoveForeignKeyArgsType} [args] - Optional overrides.
243
+ * @returns {Promise<void>} - Resolves when complete.
244
+ */
245
+ async removeForeignKey(tableName, referenceName, args = {}) {
246
+ const { columnName, ...restArgs } = args;
247
+ restArgsError(restArgs);
248
+ const resolvedColumnName = columnName || `${inflection.underscore(referenceName)}_id`;
249
+ const driver = this.getDriver();
250
+ let maximumRemovals = 0;
251
+ let previousMatchingCount = 0;
252
+ for (let removalAttempt = 0;; removalAttempt++) {
253
+ const table = await driver.getTableByName(tableName);
254
+ if (!table)
255
+ throw new Error(`Table ${tableName} does not exist`);
256
+ const foreignKeys = await table.getForeignKeys();
257
+ const matchingForeignKeys = foreignKeys.filter((foreignKey) => foreignKey.getColumnName() == resolvedColumnName);
258
+ if (matchingForeignKeys.length === 0) {
259
+ if (removalAttempt === 0)
260
+ throw new Error(`No foreign key on ${tableName}.${resolvedColumnName}`);
261
+ return;
262
+ }
263
+ if (removalAttempt === 0) {
264
+ maximumRemovals = matchingForeignKeys.length;
265
+ }
266
+ else if (matchingForeignKeys.length >= previousMatchingCount) {
267
+ throw new Error(`Foreign key removal did not reduce matches on ${tableName}.${resolvedColumnName}`);
268
+ }
269
+ if (removalAttempt >= maximumRemovals) {
270
+ throw new Error(`Foreign key removal exceeded expected matches on ${tableName}.${resolvedColumnName}`);
271
+ }
272
+ previousMatchingCount = matchingForeignKeys.length;
273
+ await driver.removeForeignKey(tableName, matchingForeignKeys[0]);
274
+ }
275
+ }
233
276
  /**
234
277
  * Runs add reference.
235
278
  * @param {string} tableName - Table name.
@@ -253,15 +296,46 @@ export default class VelociousDatabaseMigration {
253
296
  await this.addForeignKey(tableName, referenceName);
254
297
  }
255
298
  }
299
+ /**
300
+ * RemoveReferenceArgsType type.
301
+ * @typedef {object} RemoveReferenceArgsType
302
+ * @property {string} [columnName] - Override the derived reference column name.
303
+ * @property {string} [indexName] - Explicit generated index name to remove.
304
+ */
256
305
  /**
257
306
  * Runs remove reference.
258
307
  * @param {string} tableName - Table name.
259
308
  * @param {string} referenceName - Reference name.
309
+ * @param {RemoveReferenceArgsType} [args] - Optional overrides.
260
310
  * @returns {Promise<void>} - Resolves when complete.
261
311
  */
262
- async removeReference(tableName, referenceName) {
263
- const columnName = `${inflection.underscore(referenceName)}_id`;
264
- this.removeColumn(tableName, columnName);
312
+ async removeReference(tableName, referenceName, args = {}) {
313
+ const { columnName, indexName, ...restArgs } = args;
314
+ restArgsError(restArgs);
315
+ const resolvedColumnName = columnName || `${inflection.underscore(referenceName)}_id`;
316
+ const driver = this.getDriver();
317
+ const table = await driver.getTableByName(tableName);
318
+ if (!table)
319
+ throw new Error(`Table ${tableName} does not exist`);
320
+ const foreignKeys = await table.getForeignKeys();
321
+ for (const foreignKey of foreignKeys) {
322
+ if (foreignKey.getColumnName() != resolvedColumnName)
323
+ continue;
324
+ await driver.removeForeignKey(tableName, foreignKey);
325
+ }
326
+ const expectedIndexName = indexName || this._removeIndexName(tableName, [resolvedColumnName]);
327
+ const indexes = await table.getIndexes();
328
+ const generatedIndex = indexes.find((index) => {
329
+ const indexColumnNames = index.getColumnNames();
330
+ return !index.isPrimaryKey() &&
331
+ index.getName() == expectedIndexName &&
332
+ indexColumnNames.length == 1 &&
333
+ indexColumnNames[0] == resolvedColumnName;
334
+ });
335
+ if (generatedIndex) {
336
+ await this.removeIndex(tableName, generatedIndex.getName());
337
+ }
338
+ await this.removeColumn(tableName, resolvedColumnName);
265
339
  }
266
340
  /**
267
341
  * Runs change column null.
@@ -597,4 +671,4 @@ export function dedicatedAuditTableName(modelTableName) {
597
671
  }
598
672
  return `${modelTableName}_audits`;
599
673
  }
600
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvbWlncmF0aW9uL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7Ozs7Ozs7Ozs7R0FXRztBQUNIOzs7OztHQUtHO0FBQ0g7Ozs7O0dBS0c7QUFDSDs7O0dBR0c7QUFDSDs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUMzRSxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLGFBQWEsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUMxRCxPQUFPLGVBQWUsTUFBTSwrQkFBK0IsQ0FBQTtBQUMzRCxPQUFPLFNBQVMsTUFBTSx3QkFBd0IsQ0FBQTtBQUM5QyxNQUFNLG1CQUFvQixTQUFRLEtBQUs7Q0FBRztBQUUxQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsQ0FBQTtBQUU1QixNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qzs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUI7UUFDcEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG1CQUFtQixDQUFBO0lBQ2pELENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsc0JBQXNCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFBO0lBQ2xDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLGtCQUFrQixHQUFHLFNBQVMsRUFBRSxFQUFFLEVBQUM7UUFDN0QsSUFBSSxDQUFDLGtCQUFrQjtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQTtRQUN4RSxJQUFJLENBQUMsRUFBRTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUE7UUFFekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7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QUUsYUFBYSxFQUFFLElBQUk7UUFDL0MsTUFBTSxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxRQUFRLEVBQUMsR0FBRyxJQUFJLENBQUE7UUFDcEUsTUFBTSxVQUFVLEdBQUcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUE7UUFFL0QsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXZCLE1BQU0sVUFBVSxHQUFHLElBQUksSUFBSSxTQUFTLENBQUE7UUFDcEMsTUFBTSxVQUFVLEdBQUcsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtRQUV4RSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDbkUsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUMsTUFBTSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7UUFFOUQsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDcEQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLGFBQWE7UUFDNUMsTUFBTSxVQUFVLEdBQUcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUE7UUFFL0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDMUMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVE7UUFDcEQsTUFBTSxLQUFLLEdBQUcsTUFB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SUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBQyxFQUFFLEVBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2pELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUE7WUFFckQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO1lBQ3pELEtBQUssQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtZQUNqRSxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7WUFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNwQixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDcEIsQ0FBQyxDQUFDLENBQUE7UUFFRixPQUFPLFVBQVUsQ0FBQTtJQUNuQixDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLGNBQWM7SUFDcEQsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNoRCxDQUFDO0lBRUQsT0FBTyxHQUFHLGNBQWMsU0FBUyxDQUFBO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBBZGRDb2x1bW5BcmdzVHlwZSB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gQWRkQ29sdW1uQXJnc1R5cGVcbiAqIEBwcm9wZXJ0eSB7P30gW2RlZmF1bHRdIC0gRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGNvbHVtbi5cbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBbZm9yZWlnbktleV0gLSBGb3JlaWduIGtleSBkZWZpbml0aW9uIGZvciB0aGUgY29sdW1uLlxuICogQHByb3BlcnR5IHtib29sZWFuIHwge3VuaXF1ZTogYm9vbGVhbn19IFtpbmRleF0gLSBXaGV0aGVyIHRvIGFkZCBhbiBpbmRleCAob3B0aW9uYWxseSB1bmlxdWUpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtsaW1pdF0gLSBBbGlhcyBmb3IgbWF4TGVuZ3RoICh2YXJjaGFyIGxlbmd0aCBsaW1pdCkgb24gc3RyaW5nLWxpa2UgY29sdW1ucy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4TGVuZ3RoXSAtIE1heGltdW0gbGVuZ3RoIGZvciBzdHJpbmctbGlrZSBjb2x1bW5zIChlLmcuIHZhcmNoYXIgbGVuZ3RoKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW251bGxdIC0gV2hldGhlciB0aGUgY29sdW1uIGFsbG93cyBudWxsIHZhbHVlcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3ByaW1hcnlLZXldIC0gV2hldGhlciB0aGUgY29sdW1uIGlzIGEgcHJpbWFyeSBrZXkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1bmlxdWVdIC0gV2hldGhlciB0aGUgY29sdW1uIGVuZm9yY2VzIHVuaXF1ZW5lc3MuXG4gKi9cbi8qKlxuICogQ3JlYXRlVGFibGVJZEFyZ3NUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDcmVhdGVUYWJsZUlkQXJnc1R5cGVcbiAqIEBwcm9wZXJ0eSB7P30gW2RlZmF1bHRdIC0gRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIElEIGNvbHVtbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdHlwZV0gLSBDb2x1bW4gdHlwZSBmb3IgdGhlIElEIGNvbHVtbi5cbiAqL1xuLyoqXG4gKiBDcmVhdGVUYWJsZUFyZ3NUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDcmVhdGVUYWJsZUFyZ3NUeXBlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZk5vdEV4aXN0c10gLSBTa2lwIGNyZWF0aW9uIGlmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cy5cbiAqIEBwcm9wZXJ0eSB7Q3JlYXRlVGFibGVJZEFyZ3NUeXBlIHwgZmFsc2V9IFtpZF0gLSBJRCBjb2x1bW4gb3B0aW9ucyBvciBmYWxzZSB0byBza2lwIElELlxuICovXG4vKipcbiAqIENyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7KHRhYmxlOiBUYWJsZURhdGEpID0+IHZvaWR9IENyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlXG4gKi9cbi8qKlxuICogTGVnYWN5TG9jYWxEYXRlVGltZXNNaWdyYXRpb25BcmdzVHlwZSB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gTGVnYWN5TG9jYWxEYXRlVGltZXNNaWdyYXRpb25BcmdzVHlwZVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IFtjb2x1bW5zQnlUYWJsZV0gLSBFeHBsaWNpdCBkYXRldGltZSBjb2x1bW5zIGtleWVkIGJ5IHRhYmxlIG5hbWUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2xlZ2FjeUxvY2FsT2Zmc2V0TWludXRlc10gLSBVVEMtbWludXMtbG9jYWwgb2Zmc2V0IGluIG1pbnV0ZXMgZm9yIGxlZ2FjeSByb3dzLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3RhYmxlc10gLSBUYWJsZXMgdG8gbWlncmF0ZS4gRGVmYXVsdHMgdG8gYWxsIG5vbi1pbnRlcm5hbCB0YWJsZXMuXG4gKi9cblxuaW1wb3J0IHsgY29udmVydExlZ2FjeURhdGVWYWx1ZVRvVXRjU3RvcmFnZSB9IGZyb20gXCIuLi9kYXRldGltZS1zdG9yYWdlLmpzXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uLy4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5pbXBvcnQgQ3JlYXRlSW5kZXhCYXNlIGZyb20gXCIuLi9xdWVyeS9jcmVhdGUtaW5kZXgtYmFzZS5qc1wiXG5pbXBvcnQgVGFibGVEYXRhIGZyb20gXCIuLi90YWJsZS1kYXRhL2luZGV4LmpzXCJcbmNsYXNzIE5vdEltcGxlbWVudGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG5leHBvcnQge05vdEltcGxlbWVudGVkRXJyb3J9XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlTWlncmF0aW9uIHtcbiAgLyoqXG4gICAqIFJ1bnMgb24gZGF0YWJhc2VzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBkYXRhYmFzZUlkZW50aWZpZXJzIC0gRGF0YWJhc2UgaWRlbnRpZmllcnMuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBvbkRhdGFiYXNlcyhkYXRhYmFzZUlkZW50aWZpZXJzKSB7XG4gICAgdGhpcy5fZGF0YWJhc2VJZGVudGlmaWVycyA9IGRhdGFiYXNlSWRlbnRpZmllcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBkYXRhYmFzZSBpZGVudGlmaWVycy5cbiAgICogQHJldHVybnMge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSAtIFRoZSBkYXRhYmFzZSBpZGVudGlmaWVycy5cbiAgICovXG4gIHN0YXRpYyBnZXREYXRhYmFzZUlkZW50aWZpZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXJzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmRhdGFiYXNlSWRlbnRpZmllciAtIERhdGFiYXNlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MuZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIGRhdGFiYXNlSWRlbnRpZmllciA9IFwiZGVmYXVsdFwiLCBkYn0pIHtcbiAgICBpZiAoIWRhdGFiYXNlSWRlbnRpZmllcikgdGhyb3cgbmV3IEVycm9yKFwiTm8gZGF0YWJhc2UgaWRlbnRpZmllciBnaXZlblwiKVxuICAgIGlmICghZGIpIHRocm93IG5ldyBFcnJvcihcIk5vICdkYicgZ2l2ZW5cIilcblxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXIgPSBkYXRhYmFzZUlkZW50aWZpZXJcbiAgICB0aGlzLl9kYiA9IGRiXG4gIH1cblxuICBfZ2V0RGF0YWJhc2VJZGVudGlmaWVyKCkge1xuICAgIGlmICghdGhpcy5fZGF0YWJhc2VJZGVudGlmaWVyKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBkYXRhYmFzZSBpZGVudGlmaWVyIHNldFwiKVxuXG4gICAgcmV0dXJuIHRoaXMuX2RhdGFiYXNlSWRlbnRpZmllclxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGRyaXZlci5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSAtIFRoZSBkcml2ZXIuXG4gICAqL1xuICBnZXREcml2ZXIoKSB7IHJldHVybiB0aGlzLl9kYiB9XG4gIGNvbm5lY3Rpb24oKSB7IHJldHVybiB0aGlzLmdldERyaXZlcigpIH1cblxuICBhc3luYyBjaGFuZ2UoKSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCInY2hhbmdlJyBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIGFzeW5jIHVwKCkge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiJ2NoYW5nZScgbm90IGltcGxlbWVudGVkXCIpXG4gIH1cblxuICBhc3luYyBkb3duKCkge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiJ2NoYW5nZScgbm90IGltcGxlbWVudGVkXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBleGVjdXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsIC0gU1FMIHN0cmluZy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLlF1ZXJ5UmVzdWx0VHlwZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgZXhlY3V0ZS5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoc3FsKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdGlvbigpLnF1ZXJ5KHNxbClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBjb2x1bW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uTmFtZSAtIENvbHVtbiBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uVHlwZSAtIENvbHVtbiB0eXBlLlxuICAgKiBAcGFyYW0ge0FkZENvbHVtbkFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGFkZENvbHVtbih0YWJsZU5hbWUsIGNvbHVtbk5hbWUsIGNvbHVtblR5cGUsIGFyZ3MpIHtcbiAgICBpZiAoIWNvbHVtblR5cGUpIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbHVtbiB0eXBlIGdpdmVuXCIpXG5cbiAgICBjb25zdCB0YWJsZUNvbHVtbkFyZ3MgPSBPYmplY3QuYXNzaWduKHtpc05ld0NvbHVtbjogdHJ1ZSwgdHlwZTogY29sdW1uVHlwZX0sIGFyZ3MpXG4gICAgY29uc3QgdGFibGVEYXRhID0gbmV3IFRhYmxlRGF0YSh0YWJsZU5hbWUpXG5cbiAgICB0YWJsZURhdGEuYWRkQ29sdW1uKGNvbHVtbk5hbWUsIHRhYmxlQ29sdW1uQXJncylcblxuICAgIGNvbnN0IHNxbHMgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLmFsdGVyVGFibGVTUUxzKHRhYmxlRGF0YSlcblxuICAgIGZvciAoY29uc3Qgc3FsIG9mIHNxbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbW92ZSBjb2x1bW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uTmFtZSAtIENvbHVtbiBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlQ29sdW1uKHRhYmxlTmFtZSwgY29sdW1uTmFtZSkge1xuICAgIGNvbnN0IHRhYmxlQ29sdW1uQXJncyA9IE9iamVjdC5hc3NpZ24oe2Ryb3BDb2x1bW46IHRydWV9KVxuICAgIGNvbnN0IHRhYmxlRGF0YSA9IG5ldyBUYWJsZURhdGEodGFibGVOYW1lKVxuXG4gICAgdGFibGVEYXRhLmFkZENvbHVtbihjb2x1bW5OYW1lLCB0YWJsZUNvbHVtbkFyZ3MpXG5cbiAgICBjb25zdCBzcWxzID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5hbHRlclRhYmxlU1FMcyh0YWJsZURhdGEpXG5cbiAgICBmb3IgKGNvbnN0IHNxbCBvZiBzcWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLnF1ZXJ5KHNxbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkSW5kZXhBcmdzVHlwZSB0eXBlLlxuICAgKiBAdHlwZWRlZiB7b2JqZWN0fSBBZGRJbmRleEFyZ3NUeXBlXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lmTm90RXhpc3RzXSAtIFNraXAgY3JlYXRpb24gaWYgdGhlIGluZGV4IGFscmVhZHkgZXhpc3RzLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gRXhwbGljaXQgaW5kZXggbmFtZSB0byB1c2UuXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VuaXF1ZV0gLSBXaGV0aGVyIHRoZSBpbmRleCBzaG91bGQgYmUgdW5pcXVlLlxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGluZGV4LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBpbXBvcnQoXCIuLi90YWJsZS1kYXRhL3RhYmxlLWNvbHVtbi5qc1wiKS5kZWZhdWx0Pn0gY29sdW1ucyAtIENvbHVtbiBuYW1lIG9yIGFycmF5IG9mIGNvbHVtbiBuYW1lcy5cbiAgICogQHBhcmFtIHtBZGRJbmRleEFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGFkZEluZGV4KHRhYmxlTmFtZSwgY29sdW1ucywgYXJncykge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRDb2x1bW5zID0gdHlwZW9mIGNvbHVtbnMgPT09IFwic3RyaW5nXCIgPyBbY29sdW1uc10gOiBjb2x1bW5zXG4gICAgY29uc3QgY3JlYXRlSW5kZXhBcmdzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHtcbiAgICAgICAgY29sdW1uczogbm9ybWFsaXplZENvbHVtbnMsXG4gICAgICAgIHRhYmxlTmFtZVxuICAgICAgfSxcbiAgICAgIGFyZ3NcbiAgICApXG4gICAgY29uc3Qgc3FscyA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuY3JlYXRlSW5kZXhTUUxzKGNyZWF0ZUluZGV4QXJncylcblxuICAgIGZvciAoY29uc3Qgc3FsIG9mIHNxbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVJbmRleEFyZ3NUeXBlIHR5cGUuXG4gICAqIEB0eXBlZGVmIHtvYmplY3R9IFJlbW92ZUluZGV4QXJnc1R5cGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSAtIEV4cGxpY2l0IGluZGV4IG5hbWUgdG8gcmVtb3ZlLlxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgcmVtb3ZlIGluZGV4LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBpbXBvcnQoXCIuLi90YWJsZS1kYXRhL3RhYmxlLWNvbHVtbi5qc1wiKS5kZWZhdWx0Pn0gbmFtZU9yQ29sdW1ucyAtIEluZGV4IG5hbWUgb3IgY29sdW1ucyB3aG9zZSBkZWZhdWx0IGFkZEluZGV4IG5hbWUgc2hvdWxkIGJlIHJlbW92ZWQuXG4gICAqIEBwYXJhbSB7UmVtb3ZlSW5kZXhBcmdzVHlwZX0gW2FyZ3NdIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyByZW1vdmVJbmRleCh0YWJsZU5hbWUsIG5hbWVPckNvbHVtbnMsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtuYW1lLCAuLi5yZXN0QXJnc30gPSBhcmdzXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgY29uc3QgcmVtb3ZlSW5kZXhOYW1lID0gbmFtZSB8fCB0aGlzLl9yZW1vdmVJbmRleE5hbWUodGFibGVOYW1lLCBuYW1lT3JDb2x1bW5zKVxuICAgIGNvbnN0IHNxbHMgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLnJlbW92ZUluZGV4U1FMcyh7bmFtZTogcmVtb3ZlSW5kZXhOYW1lLCB0YWJsZU5hbWV9KVxuXG4gICAgZm9yIChjb25zdCBzcWwgb2Ygc3Fscykge1xuICAgICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5xdWVyeShzcWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVtb3ZlIGluZGV4IG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZyB8IGltcG9ydChcIi4uL3RhYmxlLWRhdGEvdGFibGUtY29sdW1uLmpzXCIpLmRlZmF1bHQ+fSBuYW1lT3JDb2x1bW5zIC0gSW5kZXggbmFtZSBvciBjb2x1bW5zLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBpbmRleCBuYW1lLlxuICAgKi9cbiAgX3JlbW92ZUluZGV4TmFtZSh0YWJsZU5hbWUsIG5hbWVPckNvbHVtbnMpIHtcbiAgICBpZiAodHlwZW9mIG5hbWVPckNvbHVtbnMgPT09IFwic3RyaW5nXCIpIHJldHVybiBuYW1lT3JDb2x1bW5zXG5cbiAgICBjb25zdCBjcmVhdGVJbmRleCA9IG5ldyBDcmVhdGVJbmRleEJhc2Uoe1xuICAgICAgY29sdW1uczogbmFtZU9yQ29sdW1ucyxcbiAgICAgIGRyaXZlcjogdGhpcy5nZXREcml2ZXIoKSxcbiAgICAgIHRhYmxlTmFtZVxuICAgIH0pXG5cbiAgICByZXR1cm4gY3JlYXRlSW5kZXguZ2VuZXJhdGVJbmRleE5hbWUoKVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZEZvcmVpZ25LZXlBcmdzVHlwZSB0eXBlLlxuICAgKiBAdHlwZWRlZiB7b2JqZWN0fSBBZGRGb3JlaWduS2V5QXJnc1R5cGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2x1bW5OYW1lXSAtIE92ZXJyaWRlIHRoZSBkZXJpdmVkIEZLIGNvbHVtbiBuYW1lIChkZWZhdWx0OiBgJHtyZWZlcmVuY2VfdW5kZXJzY29yZWR9X2lkYCkuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBPdmVycmlkZSB0aGUgZGVyaXZlZCBjb25zdHJhaW50IG5hbWUgKGRlZmF1bHQ6IGBma18ke3RhYmxlTmFtZX1fJHtyZWZlcmVuY2VOYW1lfWApLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3JlZmVyZW5jZWRDb2x1bW5OYW1lXSAtIE92ZXJyaWRlIHRoZSByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIChkZWZhdWx0OiBgaWRgKS5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtyZWZlcmVuY2VkVGFibGVOYW1lXSAtIE92ZXJyaWRlIHRoZSBkZXJpdmVkIHJlZmVyZW5jZWQgdGFibGUgKGRlZmF1bHQ6IHBsdXJhbGl6ZWQgYHJlZmVyZW5jZU5hbWVgKS5cbiAgICovXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBmb3JlaWduIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIHRoZSBGSyBsaXZlcyBvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZmVyZW5jZU5hbWUgLSBTaW5ndWxhciByZWZlcmVuY2UgbmFtZS4gRGVmYXVsdHMgZGVyaXZlXG4gICAqICAgdGhlIEZLIGNvbHVtbiBhcyBgJHtyZWZlcmVuY2V9X2lkYCwgdGhlIHJlZmVyZW5jZWQgdGFibGUgYnkgcGx1cmFsaXppbmdcbiAgICogICB0aGUgcmVmZXJlbmNlLCB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gYXMgYGlkYCwgYW5kIHRoZSBjb25zdHJhaW50IG5hbWVcbiAgICogICBhcyBgZmtfJHt0YWJsZU5hbWV9XyR7cmVmZXJlbmNlTmFtZX1gLiBPdmVycmlkZSBhbnkgb2YgdGhvc2UgdmlhIGBhcmdzYFxuICAgKiAgIHdoZW4gdGhlIHNjaGVtYSBkb2Vzbid0IGZvbGxvdyB0aGUgY29udmVudGlvbi5cbiAgICogQHBhcmFtIHtBZGRGb3JlaWduS2V5QXJnc1R5cGV9IFthcmdzXSAtIE9wdGlvbmFsIG92ZXJyaWRlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGFkZEZvcmVpZ25LZXkodGFibGVOYW1lLCByZWZlcmVuY2VOYW1lLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7Y29sdW1uTmFtZSwgbmFtZSwgcmVmZXJlbmNlZENvbHVtbk5hbWUsIHJlZmVyZW5jZWRUYWJsZU5hbWUsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBjb25zdCByZWZlcmVuY2VOYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShyZWZlcmVuY2VOYW1lKVxuICAgIGNvbnN0IHJlc29sdmVkUmVmZXJlbmNlZFRhYmxlTmFtZSA9IHJlZmVyZW5jZWRUYWJsZU5hbWUgfHwgaW5mbGVjdGlvbi5wbHVyYWxpemUocmVmZXJlbmNlTmFtZVVuZGVyc2NvcmUpXG4gICAgY29uc3QgcmVzb2x2ZWRDb2x1bW5OYW1lID0gY29sdW1uTmFtZSB8fCBgJHtyZWZlcmVuY2VOYW1lVW5kZXJzY29yZX1faWRgXG4gICAgY29uc3QgcmVzb2x2ZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHJlZmVyZW5jZWRDb2x1bW5OYW1lIHx8IFwiaWRcIlxuICAgIGNvbnN0IHJlc29sdmVkTmFtZSA9IG5hbWUgfHwgYGZrXyR7dGFibGVOYW1lfV8ke3JlZmVyZW5jZU5hbWV9YFxuXG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5hZGRGb3JlaWduS2V5KFxuICAgICAgdGFibGVOYW1lLFxuICAgICAgcmVzb2x2ZWRDb2x1bW5OYW1lLFxuICAgICAgcmVzb2x2ZWRSZWZlcmVuY2VkVGFibGVOYW1lLFxuICAgICAgcmVzb2x2ZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSxcbiAgICAgIHtcbiAgICAgICAgaXNOZXdGb3JlaWduS2V5OiB0cnVlLFxuICAgICAgICBuYW1lOiByZXNvbHZlZE5hbWVcbiAgICAgIH1cbiAgICApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZGQgcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZmVyZW5jZU5hbWUgLSBSZWZlcmVuY2UgbmFtZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5mb3JlaWduS2V5XSAtIFdoZXRoZXIgZm9yZWlnbiBrZXkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MubnVsbF0gLSBXaGV0aGVyIG51bGxhYmxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudHlwZV0gLSBUeXBlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MudW5pcXVlXSAtIFdoZXRoZXIgdW5pcXVlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgYWRkUmVmZXJlbmNlKHRhYmxlTmFtZSwgcmVmZXJlbmNlTmFtZSwgYXJncykge1xuICAgIGNvbnN0IHtmb3JlaWduS2V5LCBudWxsOiBudWxsYWJsZSwgdHlwZSwgdW5pcXVlLCAuLi5yZXN0QXJnc30gPSBhcmdzXG4gICAgY29uc3QgY29sdW1uTmFtZSA9IGAke2luZmxlY3Rpb24udW5kZXJzY29yZShyZWZlcmVuY2VOYW1lKX1faWRgXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgY29uc3QgY29sdW1uVHlwZSA9IHR5cGUgfHwgXCJpbnRlZ2VyXCJcbiAgICBjb25zdCBjb2x1bW5BcmdzID0gbnVsbGFibGUgIT09IHVuZGVmaW5lZCA/IHtudWxsOiBudWxsYWJsZX0gOiB1bmRlZmluZWRcblxuICAgIGF3YWl0IHRoaXMuYWRkQ29sdW1uKHRhYmxlTmFtZSwgY29sdW1uTmFtZSwgY29sdW1uVHlwZSwgY29sdW1uQXJncylcbiAgICBhd2FpdCB0aGlzLmFkZEluZGV4KHRhYmxlTmFtZSwgW2NvbHVtbk5hbWVdLCB7dW5pcXVlOiB1bmlxdWV9KVxuXG4gICAgaWYgKGZvcmVpZ25LZXkpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRkRm9yZWlnbktleSh0YWJsZU5hbWUsIHJlZmVyZW5jZU5hbWUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVtb3ZlIHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcmVuY2VOYW1lIC0gUmVmZXJlbmNlIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyByZW1vdmVSZWZlcmVuY2UodGFibGVOYW1lLCByZWZlcmVuY2VOYW1lKSB7XG4gICAgY29uc3QgY29sdW1uTmFtZSA9IGAke2luZmxlY3Rpb24udW5kZXJzY29yZShyZWZlcmVuY2VOYW1lKX1faWRgXG5cbiAgICB0aGlzLnJlbW92ZUNvbHVtbih0YWJsZU5hbWUsIGNvbHVtbk5hbWUpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjaGFuZ2UgY29sdW1uIG51bGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uTmFtZSAtIENvbHVtbiBuYW1lLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG51bGxhYmxlIC0gV2hldGhlciBudWxsYWJsZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGNoYW5nZUNvbHVtbk51bGwodGFibGVOYW1lLCBjb2x1bW5OYW1lLCBudWxsYWJsZSkge1xuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5nZXRUYWJsZUJ5TmFtZSh0YWJsZU5hbWUpXG5cbiAgICBpZiAoIXRhYmxlKSB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlICR7dGFibGVOYW1lfSBkb2VzIG5vdCBleGlzdGApXG5cbiAgICBjb25zdCBjb2x1bW4gPSBhd2FpdCB0YWJsZS5nZXRDb2x1bW5CeU5hbWUoY29sdW1uTmFtZSlcblxuICAgIGlmICghY29sdW1uKSB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAke2NvbHVtbk5hbWV9IGRvZXMgbm90IGV4aXN0IGluIHRhYmxlICR7dGFibGVOYW1lfWApXG5cbiAgICBhd2FpdCBjb2x1bW4uY2hhbmdlTnVsbGFibGUobnVsbGFibGUpXG4gIH1cblxuICAvKipcbiAgICogTWlncmF0ZXMgbGVnYWN5IHRpbWV6b25lLWxlc3MgbG9jYWwgZGF0ZXRpbWUgcm93cyBpbnRvIFVUQyBkYXRldGltZSBzdG9yYWdlLlxuICAgKiBOZXcgU1FMaXRlIFVUQyByb3dzIGluY2x1ZGUgYSB0aW1lem9uZSBzdWZmaXggYW5kIGFyZSBza2lwcGVkLlxuICAgKiBAcGFyYW0ge0xlZ2FjeUxvY2FsRGF0ZVRpbWVzTWlncmF0aW9uQXJnc1R5cGV9IFthcmdzXSAtIE1pZ3JhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgbWlncmF0ZUxlZ2FjeUxvY2FsRGF0ZVRpbWVzVG9VdGNTdG9yYWdlKGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtjb2x1bW5zQnlUYWJsZSwgbGVnYWN5TG9jYWxPZmZzZXRNaW51dGVzLCB0YWJsZXMsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBjb25zdCB0YWJsZU5hbWVzID0gYXdhaXQgdGhpcy5fbGVnYWN5TG9jYWxEYXRlVGltZXNUYWJsZU5hbWVzKHRhYmxlcylcblxuICAgIGZvciAoY29uc3QgdGFibGVOYW1lIG9mIHRhYmxlTmFtZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuX21pZ3JhdGVMZWdhY3lMb2NhbERhdGVUaW1lc1RhYmxlKHtcbiAgICAgICAgY29sdW1uc0J5VGFibGUsXG4gICAgICAgIGxlZ2FjeUxvY2FsT2Zmc2V0TWludXRlcyxcbiAgICAgICAgdGFibGVOYW1lXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0YWJsZSBuYW1lcyBmb3IgYSBsZWdhY3kgbG9jYWwgZGF0ZXRpbWUgbWlncmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSB0YWJsZXMgLSBFeHBsaWNpdCB0YWJsZSBuYW1lcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFRhYmxlIG5hbWVzLlxuICAgKi9cbiAgYXN5bmMgX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzVGFibGVOYW1lcyh0YWJsZXMpIHtcbiAgICBpZiAodGFibGVzKSByZXR1cm4gdGFibGVzXG5cbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuZ2V0VGFibGVzKCkpXG4gICAgICAubWFwKCh0YWJsZSkgPT4gdGFibGUuZ2V0TmFtZSgpKVxuICAgICAgLmZpbHRlcigodGFibGVOYW1lKSA9PiB0YWJsZU5hbWUgIT0gXCJzY2hlbWFfbWlncmF0aW9uc1wiICYmICF0YWJsZU5hbWUuc3RhcnRzV2l0aChcInNxbGl0ZV9cIikpXG4gIH1cblxuICAvKipcbiAgICogTWlncmF0ZXMgb25lIHRhYmxlJ3MgbGVnYWN5IGxvY2FsIGRhdGV0aW1lIHZhbHVlcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB8IHVuZGVmaW5lZH0gYXJncy5jb2x1bW5zQnlUYWJsZSAtIEV4cGxpY2l0IGNvbHVtbnMga2V5ZWQgYnkgdGFibGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBhcmdzLmxlZ2FjeUxvY2FsT2Zmc2V0TWludXRlcyAtIFVUQy1taW51cy1sb2NhbCBvZmZzZXQgaW4gbWludXRlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9taWdyYXRlTGVnYWN5TG9jYWxEYXRlVGltZXNUYWJsZSh7Y29sdW1uc0J5VGFibGUsIGxlZ2FjeUxvY2FsT2Zmc2V0TWludXRlcywgdGFibGVOYW1lfSkge1xuICAgIGNvbnN0IGRyaXZlciA9IHRoaXMuZ2V0RHJpdmVyKClcbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGRyaXZlci5nZXRUYWJsZUJ5TmFtZU9yRmFpbCh0YWJsZU5hbWUpXG4gICAgY29uc3QgY29sdW1ucyA9IGF3YWl0IHRoaXMuX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzQ29sdW1ucyh7Y29sdW1uc0J5VGFibGUsIHRhYmxlfSlcblxuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBwcmltYXJ5S2V5Q29sdW1uID0gYXdhaXQgdGhpcy5fbGVnYWN5TG9jYWxEYXRlVGltZXNQcmltYXJ5S2V5KHRhYmxlKVxuICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1ucyA9IFtwcmltYXJ5S2V5Q29sdW1uLCAuLi5jb2x1bW5zXVxuICAgIGNvbnN0IHNlbGVjdFNxbCA9IHNlbGVjdGVkQ29sdW1uc1xuICAgICAgLm1hcCgoY29sdW1uTmFtZSkgPT4gZHJpdmVyLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpKVxuICAgICAgLmpvaW4oXCIsIFwiKVxuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBkcml2ZXIucXVlcnkoYFNFTEVDVCAke3NlbGVjdFNxbH0gRlJPTSAke2RyaXZlci5xdW90ZVRhYmxlKHRhYmxlTmFtZSl9YClcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uTmFtZSBvZiBjb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93W2NvbHVtbk5hbWVdXG4gICAgICAgIGNvbnN0IGNvbnZlcnRlZFZhbHVlID0gY29udmVydExlZ2FjeURhdGVWYWx1ZVRvVXRjU3RvcmFnZSh2YWx1ZSwge1xuICAgICAgICAgIGRhdGFiYXNlVHlwZTogZHJpdmVyLmdldFR5cGUoKSxcbiAgICAgICAgICBsZWdhY3lMb2NhbE9mZnNldE1pbnV0ZXNcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoY29udmVydGVkVmFsdWUgPT09IHZhbHVlKSBjb250aW51ZVxuXG4gICAgICAgIGF3YWl0IGRyaXZlci5xdWVyeShgXG4gICAgICAgICAgVVBEQVRFICR7ZHJpdmVyLnF1b3RlVGFibGUodGFibGVOYW1lKX1cbiAgICAgICAgICBTRVQgJHtkcml2ZXIucXVvdGVDb2x1bW4oY29sdW1uTmFtZSl9ID0gJHtkcml2ZXIucXVvdGUoY29udmVydGVkVmFsdWUpfVxuICAgICAgICAgIFdIRVJFICR7ZHJpdmVyLnF1b3RlQ29sdW1uKHByaW1hcnlLZXlDb2x1bW4pfSA9ICR7ZHJpdmVyLnF1b3RlKHJvd1twcmltYXJ5S2V5Q29sdW1uXSl9XG4gICAgICAgIGApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGRhdGUtbGlrZSBjb2x1bW5zIGZvciBvbmUgdGFibGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gfCB1bmRlZmluZWR9IGFyZ3MuY29sdW1uc0J5VGFibGUgLSBFeHBsaWNpdCBjb2x1bW5zIGtleWVkIGJ5IHRhYmxlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS10YWJsZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnRhYmxlIC0gVGFibGUgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBEYXRlLWxpa2UgY29sdW1uIG5hbWVzLlxuICAgKi9cbiAgYXN5bmMgX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzQ29sdW1ucyh7Y29sdW1uc0J5VGFibGUsIHRhYmxlfSkge1xuICAgIGNvbnN0IGV4cGxpY2l0Q29sdW1ucyA9IGNvbHVtbnNCeVRhYmxlPy5bdGFibGUuZ2V0TmFtZSgpXVxuXG4gICAgaWYgKGV4cGxpY2l0Q29sdW1ucykgcmV0dXJuIGV4cGxpY2l0Q29sdW1uc1xuXG4gICAgcmV0dXJuIChhd2FpdCB0YWJsZS5nZXRDb2x1bW5zKCkpXG4gICAgICAuZmlsdGVyKChjb2x1bW4pID0+IHRoaXMuX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzQ29sdW1uSXNEYXRlTGlrZShjb2x1bW4pKVxuICAgICAgLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uZ2V0TmFtZSgpKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgY29sdW1uIHNob3VsZCBiZSBpbmNsdWRlZCBieSBkZWZhdWx0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdH0gY29sdW1uIC0gQ29sdW1uIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBjb2x1bW4gaXMgZGF0ZS1saWtlLlxuICAgKi9cbiAgX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzQ29sdW1uSXNEYXRlTGlrZShjb2x1bW4pIHtcbiAgICBjb25zdCBjb2x1bW5UeXBlID0gY29sdW1uLmdldFR5cGUoKS50b0xvd2VyQ2FzZSgpXG5cbiAgICByZXR1cm4gY29sdW1uVHlwZS5pbmNsdWRlcyhcImRhdGVcIikgfHwgY29sdW1uVHlwZS5pbmNsdWRlcyhcInRpbWVzdGFtcFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzaW5nbGUgcHJpbWFyeSBrZXkgY29sdW1uIGZvciByb3cgdXBkYXRlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtdGFibGUuanNcIikuZGVmYXVsdH0gdGFibGUgLSBUYWJsZSBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBQcmltYXJ5IGtleSBjb2x1bW4gbmFtZS5cbiAgICovXG4gIGFzeW5jIF9sZWdhY3lMb2NhbERhdGVUaW1lc1ByaW1hcnlLZXkodGFibGUpIHtcbiAgICBjb25zdCBwcmltYXJ5S2V5Q29sdW1ucyA9IChhd2FpdCB0YWJsZS5nZXRDb2x1bW5zKCkpLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uZ2V0UHJpbWFyeUtleSgpKVxuXG4gICAgaWYgKHByaW1hcnlLZXlDb2x1bW5zLmxlbmd0aCAhPSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgb25lIHByaW1hcnkga2V5IG9uICR7dGFibGUuZ2V0TmFtZSgpfSBidXQgZm91bmQgJHtwcmltYXJ5S2V5Q29sdW1ucy5sZW5ndGh9YClcbiAgICB9XG5cbiAgICByZXR1cm4gcHJpbWFyeUtleUNvbHVtbnNbMF0uZ2V0TmFtZSgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjb2x1bW4gZXhpc3RzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtbk5hbWUgLSBDb2x1bW4gbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gUmVzb2x2ZXMgd2l0aCBXaGV0aGVyIGNvbHVtbiBleGlzdHMuXG4gICAqL1xuICBhc3luYyBjb2x1bW5FeGlzdHModGFibGVOYW1lLCBjb2x1bW5OYW1lKSB7XG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLmdldFRhYmxlQnlOYW1lKHRhYmxlTmFtZSlcblxuICAgIGlmICh0YWJsZSkge1xuICAgICAgY29uc3QgY29sdW1uID0gYXdhaXQgdGFibGUuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbk5hbWUpXG5cbiAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQm9vbGVhbihmYWxzZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhbiBpbmRleCB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0cyBvbiBhIHRhYmxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGluZGV4TmFtZSAtIEluZGV4IG5hbWUgdG8gbG9vayBmb3IuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgdGhlIGluZGV4IGV4aXN0cyBvbiB0aGUgdGFibGUuXG4gICAqL1xuICBhc3luYyBpbmRleEV4aXN0cyh0YWJsZU5hbWUsIGluZGV4TmFtZSkge1xuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5nZXRUYWJsZUJ5TmFtZSh0YWJsZU5hbWUsIHt0aHJvd0Vycm9yOiBmYWxzZX0pXG5cbiAgICBpZiAodGFibGUpIHtcbiAgICAgIGZvciAoY29uc3QgaW5kZXggb2YgYXdhaXQgdGFibGUuZ2V0SW5kZXhlcygpKSB7XG4gICAgICAgIGlmIChpbmRleC5nZXROYW1lKCkgPT0gaW5kZXhOYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgdGhlIGRhdGFiYXNlIHNjaGVtYSBmb3IgYSBnYXAtbGVzcyBwb3NpdGlvbmFsIGxpc3QuIEFkZHMgdGhlXG4gICAqIHBvc2l0aW9uIGNvbHVtbiAoSU5UIE5PVCBOVUxMKSBpZiBhYnNlbnQgYW5kIGNyZWF0ZXMgYSBVTklRVUUgaW5kZXggb25cbiAgICogKHNjb3BlLCBwb3NpdGlvbikuIFRoaXMgaXMgdGhlIHNjaGVtYS1zaWRlIGNvdW50ZXJwYXJ0IG9mXG4gICAqIGBNb2RlbC5hY3RzQXNMaXN0KClgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBvc2l0aW9uQ29sdW1uIC0gQ29sdW1uIG5hbWUgZm9yIHRoZSBwb3NpdGlvbiAoZS5nLiBcInJvd19udW1iZXJcIikuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuc2NvcGUgLSBDb2x1bW4gbmFtZSBmb3IgdGhlIHNjb3BlIChlLmcuIFwiYm9hcmRfY29sdW1uX2lkXCIpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGFkZEFjdHNBc0xpc3QodGFibGVOYW1lLCBwb3NpdGlvbkNvbHVtbiwge3Njb3BlfSkge1xuICAgIGlmICghKGF3YWl0IHRoaXMuY29sdW1uRXhpc3RzKHRhYmxlTmFtZSwgcG9zaXRpb25Db2x1bW4pKSkge1xuICAgICAgYXdhaXQgdGhpcy5hZGRDb2x1bW4odGFibGVOYW1lLCBwb3NpdGlvbkNvbHVtbiwgXCJpbnRlZ2VyXCIsIHtudWxsOiBmYWxzZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuY2hhbmdlQ29sdW1uTnVsbCh0YWJsZU5hbWUsIHBvc2l0aW9uQ29sdW1uLCBmYWxzZSlcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmFkZEluZGV4KHRhYmxlTmFtZSwgW3Njb3BlLCBwb3NpdGlvbkNvbHVtbl0sIHt1bmlxdWU6IHRydWV9KVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0YWJsZSB3aXRoIGRlZmF1bHQgb3B0aW9ucy5cbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge0NyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlfSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0YWJsZSB3aXRoIGV4cGxpY2l0IG9wdGlvbnMuXG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtDcmVhdGVUYWJsZUFyZ3NUeXBlfSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7Q3JlYXRlVGFibGVDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICAvKipcbiAgICogUnVucyBjcmVhdGUgdGFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge0NyZWF0ZVRhYmxlQXJnc1R5cGUgfCBDcmVhdGVUYWJsZUNhbGxiYWNrVHlwZX0gYXJnMSAtIEFyZzEuXG4gICAqIEBwYXJhbSB7Q3JlYXRlVGFibGVDYWxsYmFja1R5cGUgfCB1bmRlZmluZWR9IFthcmcyXSAtIEFyZzIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBjcmVhdGVUYWJsZSh0YWJsZU5hbWUsIGFyZzEsIGFyZzIpIHtcbiAgICBsZXQgYXJnc1xuICAgIGxldCBjYWxsYmFja1xuXG4gICAgaWYgKHR5cGVvZiBhcmcxID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgYXJncyA9IHt9XG4gICAgICBjYWxsYmFjayA9IGFyZzFcbiAgICB9IGVsc2Uge1xuICAgICAgYXJncyA9IGFyZzFcbiAgICAgIGNhbGxiYWNrID0gYXJnMlxuICAgIH1cblxuICAgIGNvbnN0IHtpZCA9IHt9LCBpZk5vdEV4aXN0cyA9IGZhbHNlLCAuLi5yZXN0QXJnc30gPSBhcmdzXG4gICAgY29uc3QgZHJpdmVyID0gdGhpcy5nZXREcml2ZXIoKVxuICAgIGNvbnN0IGRlZmF1bHRQcmltYXJ5S2V5VHlwZSA9IGRyaXZlci5wcmltYXJ5S2V5VHlwZSgpXG4gICAgbGV0IGlkRGVmYXVsdCwgaWRUeXBlLCByZXN0QXJnc0lkXG5cbiAgICBpZiAoaWQgIT09IGZhbHNlKSB7XG4gICAgICAoe2RlZmF1bHQ6IGlkRGVmYXVsdCwgdHlwZTogaWRUeXBlLCAuLi5yZXN0QXJnc0lkfSA9IGlkKVxuXG4gICAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzSWQpXG4gICAgfVxuXG4gICAgaWYgKCFpZFR5cGUpIHtcbiAgICAgIGlkVHlwZSA9IGRlZmF1bHRQcmltYXJ5S2V5VHlwZVxuICAgIH1cbiAgICBjb25zdCBkcml2ZXJTdXBwb3J0c0RlZmF1bHRVVUlEID0gZHJpdmVyLnN1cHBvcnRzRGVmYXVsdFByaW1hcnlLZXlVVUlEPy4oKVxuICAgIGNvbnN0IGxvd2VySWRUeXBlID0gaWRUeXBlPy50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3QgaXNVVUlEUHJpbWFyeUtleSA9IGxvd2VySWRUeXBlID09IFwidXVpZFwiXG4gICAgY29uc3QgbnVtZXJpY0F1dG9JbmNyZW1lbnRUeXBlcyA9IFtcImludFwiLCBcImludGVnZXJcIiwgXCJiaWdpbnRcIiwgXCJzbWFsbGludFwiLCBcInRpbnlpbnRcIl1cbiAgICBsZXQgaWRBdXRvSW5jcmVtZW50ID0gbnVtZXJpY0F1dG9JbmNyZW1lbnRUeXBlcy5pbmNsdWRlcyhsb3dlcklkVHlwZSB8fCBcIlwiKVxuXG4gICAgaWYgKGlzVVVJRFByaW1hcnlLZXkpIHtcbiAgICAgIGlkQXV0b0luY3JlbWVudCA9IGZhbHNlXG5cbiAgICAgIGlmIChkcml2ZXJTdXBwb3J0c0RlZmF1bHRVVUlEKSB7XG4gICAgICAgIGlmIChpZERlZmF1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlkRGVmYXVsdCA9ICgpID0+IFwiVVVJRCgpXCJcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpZERlZmF1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBMZXQgYXBwbGljYXRpb24gY29kZSBhc3NpZ24gVVVJRHMgKHNlZSBEYXRhYmFzZVJlY29yZC5pbnNlcnQpIHdoZW4gdGhlIGRyaXZlciBjYW4ndCBkbyBpdC5cbiAgICAgICAgaWREZWZhdWx0ID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgICAvLyBJZiBkcml2ZXIgZG9lc24ndCBzdXBwb3J0IFVVSUQoKSBidXQgdGhlIGNhbGxlciBleHBsaWNpdGx5IHNldCBhIGRlZmF1bHQsIHJlc3BlY3QgaXQuXG4gICAgfVxuXG4gICAgY29uc3QgdGFibGVEYXRhID0gbmV3IFRhYmxlRGF0YSh0YWJsZU5hbWUsIHtpZk5vdEV4aXN0cywgcHJpbWFyeUtleVR5cGU6IGRlZmF1bHRQcmltYXJ5S2V5VHlwZX0pXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgaWYgKCEoaWRUeXBlIGluIHRhYmxlRGF0YSkpIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcHJpbWFyeSBrZXkgdHlwZTogJHtpZFR5cGV9YClcblxuICAgIGlmIChpZCAhPT0gZmFsc2UpIHtcbiAgICAgIHRhYmxlRGF0YS5hZGRDb2x1bW4oXCJpZFwiLCB7YXV0b0luY3JlbWVudDogaWRBdXRvSW5jcmVtZW50LCBkZWZhdWx0OiBpZERlZmF1bHQsIG51bGw6IGZhbHNlLCBwcmltYXJ5S2V5OiB0cnVlLCB0eXBlOiBpZFR5cGV9KVxuICAgIH1cblxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2sodGFibGVEYXRhKVxuICAgIH1cblxuICAgIGNvbnN0IHNxbHMgPSBhd2FpdCBkcml2ZXIuY3JlYXRlVGFibGVTcWwodGFibGVEYXRhKVxuXG4gICAgZm9yIChjb25zdCBzcWwgb2Ygc3Fscykge1xuICAgICAgYXdhaXQgdGhpcy5fZGIucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRyb3AgdGFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgZHJvcFRhYmxlKHRhYmxlTmFtZSkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuZHJvcFRhYmxlKHRhYmxlTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbmFtZSBjb2x1bW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2xkQ29sdW1uTmFtZSAtIFByZXZpb3VzIGNvbHVtbiBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3Q29sdW1uTmFtZSAtIE5ldyBjb2x1bW4gbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHJlbmFtZUNvbHVtbih0YWJsZU5hbWUsIG9sZENvbHVtbk5hbWUsIG5ld0NvbHVtbk5hbWUpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLnJlbmFtZUNvbHVtbih0YWJsZU5hbWUsIG9sZENvbHVtbk5hbWUsIG5ld0NvbHVtbk5hbWUpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0YWJsZSBleGlzdHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBSZXNvbHZlcyB3aXRoIFdoZXRoZXIgdGFibGUgZXhpc3RzLlxuICAgKi9cbiAgYXN5bmMgdGFibGVFeGlzdHModGFibGVOYW1lKSB7XG4gICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS50YWJsZUV4aXN0cyh0YWJsZU5hbWUpXG5cbiAgICByZXR1cm4gZXhpc3RzXG4gIH1cblxuICAvKipcbiAgICogSGVscGVyOiBjcmVhdGVzIHRoZSBzaGFyZWQgYXVkaXQgdGFibGVzIChgYXVkaXRfYWN0aW9uc2AsXG4gICAqIGBhdWRpdF9hdWRpdGFibGVfdHlwZXNgLCBgYXVkaXRzYCkuIENhbGwgZnJvbSBgdXAoKWAgaW4gYSBtaWdyYXRpb24uXG4gICAqIEBwYXJhbSB7e2lkPzoge3R5cGU/OiBzdHJpbmd9fX0gW29wdGlvbnNdIC0gSUQgY29sdW1uIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlU2hhcmVkQXVkaXRUYWJsZXMob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgaWQgPSBvcHRpb25zLmlkIHx8IHt9XG5cbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKFwiYXVkaXRfYWN0aW9uc1wiLCB7aWR9LCAodGFibGUpID0+IHtcbiAgICAgIHRhYmxlLnN0cmluZyhcImFjdGlvblwiLCB7aW5kZXg6IHt1bmlxdWU6IHRydWV9LCBudWxsOiBmYWxzZX0pXG4gICAgICB0YWJsZS50aW1lc3RhbXBzKClcbiAgICB9KVxuXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVUYWJsZShcImF1ZGl0X2F1ZGl0YWJsZV90eXBlc1wiLCB7aWR9LCAodGFibGUpID0+IHtcbiAgICAgIHRhYmxlLnN0cmluZyhcIm5hbWVcIiwge2luZGV4OiB7dW5pcXVlOiB0cnVlfSwgbnVsbDogZmFsc2V9KVxuICAgICAgdGFibGUudGltZXN0YW1wcygpXG4gICAgfSlcblxuICAgIGF3YWl0IHRoaXMuY3JlYXRlVGFibGUoXCJhdWRpdHNcIiwge2lkfSwgKHRhYmxlKSA9PiB7XG4gICAgICB0YWJsZS5yZWZlcmVuY2VzKFwiYXVkaXRfYWN0aW9uXCIsIHtmb3JlaWduS2V5OiB0cnVlLCBudWxsOiBmYWxzZX0pXG4gICAgICB0YWJsZS5yZWZlcmVuY2VzKFwiYXVkaXRfYXVkaXRhYmxlX3R5cGVcIiwge2ZvcmVpZ25LZXk6IHRydWUsIG51bGw6IGZhbHNlfSlcbiAgICAgIHRhYmxlLnJlZmVyZW5jZXMoXCJhdWRpdGFibGVcIiwge251bGw6IGZhbHNlLCBwb2x5bW9ycGhpYzogdHJ1ZX0pXG4gICAgICB0YWJsZS5qc29uKFwiYXVkaXRlZF9jaGFuZ2VzXCIpXG4gICAgICB0YWJsZS5qc29uKFwicGFyYW1zXCIpXG4gICAgICB0YWJsZS50aW1lc3RhbXBzKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlcjogY3JlYXRlcyBhIGRlZGljYXRlZCBhdWRpdCB0YWJsZSBmb3IgYSBtb2RlbCAoZS5nLlxuICAgKiBgcHJvamVjdF9hdWRpdHNgIGZvciB0aGUgYHByb2plY3RzYCB0YWJsZSkuIENhbGwgZnJvbSBgdXAoKWBcbiAgICogaW4gYSBtaWdyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbFRhYmxlTmFtZSAtIE1vZGVsIHRhYmxlIG5hbWUgKGUuZy4gXCJwcm9qZWN0c1wiKS5cbiAgICogQHBhcmFtIHt7aWQ/OiB7dHlwZT86IHN0cmluZ319fSBbb3B0aW9uc10gLSBJRCBjb2x1bW4gb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gVGhlIGNyZWF0ZWQgYXVkaXQgdGFibGUgbmFtZS5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZURlZGljYXRlZEF1ZGl0VGFibGUobW9kZWxUYWJsZU5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGF1ZGl0VGFibGUgPSBkZWRpY2F0ZWRBdWRpdFRhYmxlTmFtZShtb2RlbFRhYmxlTmFtZSlcbiAgICBjb25zdCBpZCA9IG9wdGlvbnMuaWQgfHwge31cblxuICAgIGF3YWl0IHRoaXMuY3JlYXRlVGFibGUoYXVkaXRUYWJsZSwge2lkfSwgKHRhYmxlKSA9PiB7XG4gICAgICBjb25zdCByZWZLZXkgPSBpbmZsZWN0aW9uLnNpbmd1bGFyaXplKG1vZGVsVGFibGVOYW1lKVxuXG4gICAgICB0YWJsZS5yZWZlcmVuY2VzKHJlZktleSwge2ZvcmVpZ25LZXk6IHRydWUsIG51bGw6IGZhbHNlfSlcbiAgICAgIHRhYmxlLnJlZmVyZW5jZXMoXCJhdWRpdF9hY3Rpb25cIiwge2ZvcmVpZ25LZXk6IHRydWUsIG51bGw6IGZhbHNlfSlcbiAgICAgIHRhYmxlLmpzb24oXCJhdWRpdGVkX2NoYW5nZXNcIilcbiAgICAgIHRhYmxlLmpzb24oXCJwYXJhbXNcIilcbiAgICAgIHRhYmxlLnRpbWVzdGFtcHMoKVxuICAgIH0pXG5cbiAgICByZXR1cm4gYXVkaXRUYWJsZVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGVkaWNhdGVkIGF1ZGl0IHRhYmxlIG5hbWUgZm9yIGEgbW9kZWwgdGFibGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxUYWJsZU5hbWUgLSBNb2RlbCB0YWJsZSBuYW1lIChlLmcuIFwicHJvamVjdHNcIikuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBEZWRpY2F0ZWQgYXVkaXQgdGFibGUgbmFtZSAoZS5nLiBcInByb2plY3RfYXVkaXRzXCIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVkaWNhdGVkQXVkaXRUYWJsZU5hbWUobW9kZWxUYWJsZU5hbWUpIHtcbiAgaWYgKG1vZGVsVGFibGVOYW1lLmVuZHNXaXRoKFwic1wiKSkge1xuICAgIHJldHVybiBgJHttb2RlbFRhYmxlTmFtZS5zbGljZSgwLCAtMSl9X2F1ZGl0c2BcbiAgfVxuXG4gIHJldHVybiBgJHttb2RlbFRhYmxlTmFtZX1fYXVkaXRzYFxufVxuIl19
674
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvbWlncmF0aW9uL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7Ozs7Ozs7Ozs7R0FXRztBQUNIOzs7OztHQUtHO0FBQ0g7Ozs7O0dBS0c7QUFDSDs7O0dBR0c7QUFDSDs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUMzRSxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLGFBQWEsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUMxRCxPQUFPLGVBQWUsTUFBTSwrQkFBK0IsQ0FBQTtBQUMzRCxPQUFPLFNBQVMsTUFBTSx3QkFBd0IsQ0FBQTtBQUM5QyxNQUFNLG1CQUFvQixTQUFRLEtBQUs7Q0FBRztBQUUxQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsQ0FBQTtBQUU1QixNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qzs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUI7UUFDcEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG1CQUFtQixDQUFBO0lBQ2pELENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsc0JBQXNCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFBO0lBQ2xDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLGtCQUFrQixHQUFHLFNBQVMsRUFBRSxFQUFFLEVBQUM7UUFDN0QsSUFBSSxDQUFDLGtCQUFrQjtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQTtRQUN4RSxJQUFJLENBQUMsRUFBRTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUE7UUFFekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7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RUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO1lBQ2pFLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtZQUM3QixLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3BCLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUNwQixDQUFDLENBQUMsQ0FBQTtRQUVGLE9BQU8sVUFBVSxDQUFBO0lBQ25CLENBQUM7Q0FDRjtBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsY0FBYztJQUNwRCxJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNqQyxPQUFPLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBQ2hELENBQUM7SUFFRCxPQUFPLEdBQUcsY0FBYyxTQUFTLENBQUE7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEFkZENvbHVtbkFyZ3NUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBZGRDb2x1bW5BcmdzVHlwZVxuICogQHByb3BlcnR5IHs/fSBbZGVmYXVsdF0gLSBEZWZhdWx0IHZhbHVlIGZvciB0aGUgY29sdW1uLlxuICogQHByb3BlcnR5IHtvYmplY3R9IFtmb3JlaWduS2V5XSAtIEZvcmVpZ24ga2V5IGRlZmluaXRpb24gZm9yIHRoZSBjb2x1bW4uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4gfCB7dW5pcXVlOiBib29sZWFufX0gW2luZGV4XSAtIFdoZXRoZXIgdG8gYWRkIGFuIGluZGV4IChvcHRpb25hbGx5IHVuaXF1ZSkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2xpbWl0XSAtIEFsaWFzIGZvciBtYXhMZW5ndGggKHZhcmNoYXIgbGVuZ3RoIGxpbWl0KSBvbiBzdHJpbmctbGlrZSBjb2x1bW5zLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhMZW5ndGhdIC0gTWF4aW11bSBsZW5ndGggZm9yIHN0cmluZy1saWtlIGNvbHVtbnMgKGUuZy4gdmFyY2hhciBsZW5ndGgpLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbnVsbF0gLSBXaGV0aGVyIHRoZSBjb2x1bW4gYWxsb3dzIG51bGwgdmFsdWVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbcHJpbWFyeUtleV0gLSBXaGV0aGVyIHRoZSBjb2x1bW4gaXMgYSBwcmltYXJ5IGtleS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VuaXF1ZV0gLSBXaGV0aGVyIHRoZSBjb2x1bW4gZW5mb3JjZXMgdW5pcXVlbmVzcy5cbiAqL1xuLyoqXG4gKiBDcmVhdGVUYWJsZUlkQXJnc1R5cGUgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IENyZWF0ZVRhYmxlSWRBcmdzVHlwZVxuICogQHByb3BlcnR5IHs/fSBbZGVmYXVsdF0gLSBEZWZhdWx0IHZhbHVlIGZvciB0aGUgSUQgY29sdW1uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0eXBlXSAtIENvbHVtbiB0eXBlIGZvciB0aGUgSUQgY29sdW1uLlxuICovXG4vKipcbiAqIENyZWF0ZVRhYmxlQXJnc1R5cGUgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IENyZWF0ZVRhYmxlQXJnc1R5cGVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lmTm90RXhpc3RzXSAtIFNraXAgY3JlYXRpb24gaWYgdGhlIHRhYmxlIGFscmVhZHkgZXhpc3RzLlxuICogQHByb3BlcnR5IHtDcmVhdGVUYWJsZUlkQXJnc1R5cGUgfCBmYWxzZX0gW2lkXSAtIElEIGNvbHVtbiBvcHRpb25zIG9yIGZhbHNlIHRvIHNraXAgSUQuXG4gKi9cbi8qKlxuICogQ3JlYXRlVGFibGVDYWxsYmFja1R5cGUgdHlwZS5cbiAqIEB0eXBlZGVmIHsodGFibGU6IFRhYmxlRGF0YSkgPT4gdm9pZH0gQ3JlYXRlVGFibGVDYWxsYmFja1R5cGVcbiAqL1xuLyoqXG4gKiBMZWdhY3lMb2NhbERhdGVUaW1lc01pZ3JhdGlvbkFyZ3NUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMZWdhY3lMb2NhbERhdGVUaW1lc01pZ3JhdGlvbkFyZ3NUeXBlXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gW2NvbHVtbnNCeVRhYmxlXSAtIEV4cGxpY2l0IGRhdGV0aW1lIGNvbHVtbnMga2V5ZWQgYnkgdGFibGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbGVnYWN5TG9jYWxPZmZzZXRNaW51dGVzXSAtIFVUQy1taW51cy1sb2NhbCBvZmZzZXQgaW4gbWludXRlcyBmb3IgbGVnYWN5IHJvd3MuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbdGFibGVzXSAtIFRhYmxlcyB0byBtaWdyYXRlLiBEZWZhdWx0cyB0byBhbGwgbm9uLWludGVybmFsIHRhYmxlcy5cbiAqL1xuXG5pbXBvcnQgeyBjb252ZXJ0TGVnYWN5RGF0ZVZhbHVlVG9VdGNTdG9yYWdlIH0gZnJvbSBcIi4uL2RhdGV0aW1lLXN0b3JhZ2UuanNcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcbmltcG9ydCBDcmVhdGVJbmRleEJhc2UgZnJvbSBcIi4uL3F1ZXJ5L2NyZWF0ZS1pbmRleC1iYXNlLmpzXCJcbmltcG9ydCBUYWJsZURhdGEgZnJvbSBcIi4uL3RhYmxlLWRhdGEvaW5kZXguanNcIlxuY2xhc3MgTm90SW1wbGVtZW50ZWRFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbmV4cG9ydCB7Tm90SW1wbGVtZW50ZWRFcnJvcn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzRGF0YWJhc2VNaWdyYXRpb24ge1xuICAvKipcbiAgICogUnVucyBvbiBkYXRhYmFzZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGRhdGFiYXNlSWRlbnRpZmllcnMgLSBEYXRhYmFzZSBpZGVudGlmaWVycy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc3RhdGljIG9uRGF0YWJhc2VzKGRhdGFiYXNlSWRlbnRpZmllcnMpIHtcbiAgICB0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXJzID0gZGF0YWJhc2VJZGVudGlmaWVyc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGRhdGFiYXNlIGlkZW50aWZpZXJzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW10gfCB1bmRlZmluZWR9IC0gVGhlIGRhdGFiYXNlIGlkZW50aWZpZXJzLlxuICAgKi9cbiAgc3RhdGljIGdldERhdGFiYXNlSWRlbnRpZmllcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFiYXNlSWRlbnRpZmllcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZGF0YWJhc2VJZGVudGlmaWVyIC0gRGF0YWJhc2UgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gYXJncy5kYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgZGF0YWJhc2VJZGVudGlmaWVyID0gXCJkZWZhdWx0XCIsIGRifSkge1xuICAgIGlmICghZGF0YWJhc2VJZGVudGlmaWVyKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBkYXRhYmFzZSBpZGVudGlmaWVyIGdpdmVuXCIpXG4gICAgaWYgKCFkYikgdGhyb3cgbmV3IEVycm9yKFwiTm8gJ2RiJyBnaXZlblwiKVxuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMuX2RhdGFiYXNlSWRlbnRpZmllciA9IGRhdGFiYXNlSWRlbnRpZmllclxuICAgIHRoaXMuX2RiID0gZGJcbiAgfVxuXG4gIF9nZXREYXRhYmFzZUlkZW50aWZpZXIoKSB7XG4gICAgaWYgKCF0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXIpIHRocm93IG5ldyBFcnJvcihcIk5vIGRhdGFiYXNlIGlkZW50aWZpZXIgc2V0XCIpXG5cbiAgICByZXR1cm4gdGhpcy5fZGF0YWJhc2VJZGVudGlmaWVyXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgZHJpdmVyLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IC0gVGhlIGRyaXZlci5cbiAgICovXG4gIGdldERyaXZlcigpIHsgcmV0dXJuIHRoaXMuX2RiIH1cbiAgY29ubmVjdGlvbigpIHsgcmV0dXJuIHRoaXMuZ2V0RHJpdmVyKCkgfVxuXG4gIGFzeW5jIGNoYW5nZSgpIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIidjaGFuZ2UnIG5vdCBpbXBsZW1lbnRlZFwiKVxuICB9XG5cbiAgYXN5bmMgdXAoKSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCInY2hhbmdlJyBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIGFzeW5jIGRvd24oKSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCInY2hhbmdlJyBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV4ZWN1dGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBTUUwgc3RyaW5nLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuUXVlcnlSZXN1bHRUeXBlPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBleGVjdXRlLlxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShzcWwpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25uZWN0aW9uKCkucXVlcnkoc3FsKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGNvbHVtbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gQ29sdW1uIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5UeXBlIC0gQ29sdW1uIHR5cGUuXG4gICAqIEBwYXJhbSB7QWRkQ29sdW1uQXJnc1R5cGV9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgYWRkQ29sdW1uKHRhYmxlTmFtZSwgY29sdW1uTmFtZSwgY29sdW1uVHlwZSwgYXJncykge1xuICAgIGlmICghY29sdW1uVHlwZSkgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29sdW1uIHR5cGUgZ2l2ZW5cIilcblxuICAgIGNvbnN0IHRhYmxlQ29sdW1uQXJncyA9IE9iamVjdC5hc3NpZ24oe2lzTmV3Q29sdW1uOiB0cnVlLCB0eXBlOiBjb2x1bW5UeXBlfSwgYXJncylcbiAgICBjb25zdCB0YWJsZURhdGEgPSBuZXcgVGFibGVEYXRhKHRhYmxlTmFtZSlcblxuICAgIHRhYmxlRGF0YS5hZGRDb2x1bW4oY29sdW1uTmFtZSwgdGFibGVDb2x1bW5BcmdzKVxuXG4gICAgY29uc3Qgc3FscyA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuYWx0ZXJUYWJsZVNRTHModGFibGVEYXRhKVxuXG4gICAgZm9yIChjb25zdCBzcWwgb2Ygc3Fscykge1xuICAgICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5xdWVyeShzcWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVtb3ZlIGNvbHVtbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gQ29sdW1uIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyByZW1vdmVDb2x1bW4odGFibGVOYW1lLCBjb2x1bW5OYW1lKSB7XG4gICAgY29uc3QgdGFibGVDb2x1bW5BcmdzID0gT2JqZWN0LmFzc2lnbih7ZHJvcENvbHVtbjogdHJ1ZX0pXG4gICAgY29uc3QgdGFibGVEYXRhID0gbmV3IFRhYmxlRGF0YSh0YWJsZU5hbWUpXG5cbiAgICB0YWJsZURhdGEuYWRkQ29sdW1uKGNvbHVtbk5hbWUsIHRhYmxlQ29sdW1uQXJncylcblxuICAgIGNvbnN0IHNxbHMgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLmFsdGVyVGFibGVTUUxzKHRhYmxlRGF0YSlcblxuICAgIGZvciAoY29uc3Qgc3FsIG9mIHNxbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRJbmRleEFyZ3NUeXBlIHR5cGUuXG4gICAqIEB0eXBlZGVmIHtvYmplY3R9IEFkZEluZGV4QXJnc1R5cGVcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbaWZOb3RFeGlzdHNdIC0gU2tpcCBjcmVhdGlvbiBpZiB0aGUgaW5kZXggYWxyZWFkeSBleGlzdHMuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBFeHBsaWNpdCBpbmRleCBuYW1lIHRvIHVzZS5cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbdW5pcXVlXSAtIFdoZXRoZXIgdGhlIGluZGV4IHNob3VsZCBiZSB1bmlxdWUuXG4gICAqL1xuICAvKipcbiAgICogUnVucyBhZGQgaW5kZXguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZyB8IGltcG9ydChcIi4uL3RhYmxlLWRhdGEvdGFibGUtY29sdW1uLmpzXCIpLmRlZmF1bHQ+fSBjb2x1bW5zIC0gQ29sdW1uIG5hbWUgb3IgYXJyYXkgb2YgY29sdW1uIG5hbWVzLlxuICAgKiBAcGFyYW0ge0FkZEluZGV4QXJnc1R5cGV9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgYWRkSW5kZXgodGFibGVOYW1lLCBjb2x1bW5zLCBhcmdzKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENvbHVtbnMgPSB0eXBlb2YgY29sdW1ucyA9PT0gXCJzdHJpbmdcIiA/IFtjb2x1bW5zXSA6IGNvbHVtbnNcbiAgICBjb25zdCBjcmVhdGVJbmRleEFyZ3MgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICBjb2x1bW5zOiBub3JtYWxpemVkQ29sdW1ucyxcbiAgICAgICAgdGFibGVOYW1lXG4gICAgICB9LFxuICAgICAgYXJnc1xuICAgIClcbiAgICBjb25zdCBzcWxzID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5jcmVhdGVJbmRleFNRTHMoY3JlYXRlSW5kZXhBcmdzKVxuXG4gICAgZm9yIChjb25zdCBzcWwgb2Ygc3Fscykge1xuICAgICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5xdWVyeShzcWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZUluZGV4QXJnc1R5cGUgdHlwZS5cbiAgICogQHR5cGVkZWYge29iamVjdH0gUmVtb3ZlSW5kZXhBcmdzVHlwZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gRXhwbGljaXQgaW5kZXggbmFtZSB0byByZW1vdmUuXG4gICAqL1xuICAvKipcbiAgICogUnVucyByZW1vdmUgaW5kZXguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZyB8IGltcG9ydChcIi4uL3RhYmxlLWRhdGEvdGFibGUtY29sdW1uLmpzXCIpLmRlZmF1bHQ+fSBuYW1lT3JDb2x1bW5zIC0gSW5kZXggbmFtZSBvciBjb2x1bW5zIHdob3NlIGRlZmF1bHQgYWRkSW5kZXggbmFtZSBzaG91bGQgYmUgcmVtb3ZlZC5cbiAgICogQHBhcmFtIHtSZW1vdmVJbmRleEFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHJlbW92ZUluZGV4KHRhYmxlTmFtZSwgbmFtZU9yQ29sdW1ucywgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge25hbWUsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBjb25zdCByZW1vdmVJbmRleE5hbWUgPSBuYW1lIHx8IHRoaXMuX3JlbW92ZUluZGV4TmFtZSh0YWJsZU5hbWUsIG5hbWVPckNvbHVtbnMpXG4gICAgY29uc3Qgc3FscyA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkucmVtb3ZlSW5kZXhTUUxzKHtuYW1lOiByZW1vdmVJbmRleE5hbWUsIHRhYmxlTmFtZX0pXG5cbiAgICBmb3IgKGNvbnN0IHNxbCBvZiBzcWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLnF1ZXJ5KHNxbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZW1vdmUgaW5kZXggbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgaW1wb3J0KFwiLi4vdGFibGUtZGF0YS90YWJsZS1jb2x1bW4uanNcIikuZGVmYXVsdD59IG5hbWVPckNvbHVtbnMgLSBJbmRleCBuYW1lIG9yIGNvbHVtbnMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGluZGV4IG5hbWUuXG4gICAqL1xuICBfcmVtb3ZlSW5kZXhOYW1lKHRhYmxlTmFtZSwgbmFtZU9yQ29sdW1ucykge1xuICAgIGlmICh0eXBlb2YgbmFtZU9yQ29sdW1ucyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIG5hbWVPckNvbHVtbnNcblxuICAgIGNvbnN0IGNyZWF0ZUluZGV4ID0gbmV3IENyZWF0ZUluZGV4QmFzZSh7XG4gICAgICBjb2x1bW5zOiBuYW1lT3JDb2x1bW5zLFxuICAgICAgZHJpdmVyOiB0aGlzLmdldERyaXZlcigpLFxuICAgICAgdGFibGVOYW1lXG4gICAgfSlcblxuICAgIHJldHVybiBjcmVhdGVJbmRleC5nZW5lcmF0ZUluZGV4TmFtZSgpXG4gIH1cblxuICAvKipcbiAgICogQWRkRm9yZWlnbktleUFyZ3NUeXBlIHR5cGUuXG4gICAqIEB0eXBlZGVmIHtvYmplY3R9IEFkZEZvcmVpZ25LZXlBcmdzVHlwZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbHVtbk5hbWVdIC0gT3ZlcnJpZGUgdGhlIGRlcml2ZWQgRksgY29sdW1uIG5hbWUgKGRlZmF1bHQ6IGAke3JlZmVyZW5jZV91bmRlcnNjb3JlZH1faWRgKS5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSAtIE92ZXJyaWRlIHRoZSBkZXJpdmVkIGNvbnN0cmFpbnQgbmFtZSAoZGVmYXVsdDogYGZrXyR7dGFibGVOYW1lfV8ke3JlZmVyZW5jZU5hbWV9YCkuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmVmZXJlbmNlZENvbHVtbk5hbWVdIC0gT3ZlcnJpZGUgdGhlIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgKGRlZmF1bHQ6IGBpZGApLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3JlZmVyZW5jZWRUYWJsZU5hbWVdIC0gT3ZlcnJpZGUgdGhlIGRlcml2ZWQgcmVmZXJlbmNlZCB0YWJsZSAoZGVmYXVsdDogcGx1cmFsaXplZCBgcmVmZXJlbmNlTmFtZWApLlxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGZvcmVpZ24ga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgdGhlIEZLIGxpdmVzIG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmZXJlbmNlTmFtZSAtIFNpbmd1bGFyIHJlZmVyZW5jZSBuYW1lLiBEZWZhdWx0cyBkZXJpdmVcbiAgICogICB0aGUgRksgY29sdW1uIGFzIGAke3JlZmVyZW5jZX1faWRgLCB0aGUgcmVmZXJlbmNlZCB0YWJsZSBieSBwbHVyYWxpemluZ1xuICAgKiAgIHRoZSByZWZlcmVuY2UsIHRoZSByZWZlcmVuY2VkIGNvbHVtbiBhcyBgaWRgLCBhbmQgdGhlIGNvbnN0cmFpbnQgbmFtZVxuICAgKiAgIGFzIGBma18ke3RhYmxlTmFtZX1fJHtyZWZlcmVuY2VOYW1lfWAuIE92ZXJyaWRlIGFueSBvZiB0aG9zZSB2aWEgYGFyZ3NgXG4gICAqICAgd2hlbiB0aGUgc2NoZW1hIGRvZXNuJ3QgZm9sbG93IHRoZSBjb252ZW50aW9uLlxuICAgKiBAcGFyYW0ge0FkZEZvcmVpZ25LZXlBcmdzVHlwZX0gW2FyZ3NdIC0gT3B0aW9uYWwgb3ZlcnJpZGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgYWRkRm9yZWlnbktleSh0YWJsZU5hbWUsIHJlZmVyZW5jZU5hbWUsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtjb2x1bW5OYW1lLCBuYW1lLCByZWZlcmVuY2VkQ29sdW1uTmFtZSwgcmVmZXJlbmNlZFRhYmxlTmFtZSwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGNvbnN0IHJlZmVyZW5jZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKHJlZmVyZW5jZU5hbWUpXG4gICAgY29uc3QgcmVzb2x2ZWRSZWZlcmVuY2VkVGFibGVOYW1lID0gcmVmZXJlbmNlZFRhYmxlTmFtZSB8fCBpbmZsZWN0aW9uLnBsdXJhbGl6ZShyZWZlcmVuY2VOYW1lVW5kZXJzY29yZSlcbiAgICBjb25zdCByZXNvbHZlZENvbHVtbk5hbWUgPSBjb2x1bW5OYW1lIHx8IGAke3JlZmVyZW5jZU5hbWVVbmRlcnNjb3JlfV9pZGBcbiAgICBjb25zdCByZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gcmVmZXJlbmNlZENvbHVtbk5hbWUgfHwgXCJpZFwiXG4gICAgY29uc3QgcmVzb2x2ZWROYW1lID0gbmFtZSB8fCBgZmtfJHt0YWJsZU5hbWV9XyR7cmVmZXJlbmNlTmFtZX1gXG5cbiAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLmFkZEZvcmVpZ25LZXkoXG4gICAgICB0YWJsZU5hbWUsXG4gICAgICByZXNvbHZlZENvbHVtbk5hbWUsXG4gICAgICByZXNvbHZlZFJlZmVyZW5jZWRUYWJsZU5hbWUsXG4gICAgICByZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lLFxuICAgICAge1xuICAgICAgICBpc05ld0ZvcmVpZ25LZXk6IHRydWUsXG4gICAgICAgIG5hbWU6IHJlc29sdmVkTmFtZVxuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVGb3JlaWduS2V5QXJnc1R5cGUgdHlwZS5cbiAgICogQHR5cGVkZWYge29iamVjdH0gUmVtb3ZlRm9yZWlnbktleUFyZ3NUeXBlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29sdW1uTmFtZV0gLSBPdmVycmlkZSB0aGUgZGVyaXZlZCBmb3JlaWduLWtleSBjb2x1bW4gbmFtZS5cbiAgICovXG4gIC8qKlxuICAgKiBSdW5zIHJlbW92ZSBmb3JlaWduIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIHRoZSBmb3JlaWduIGtleSBsaXZlcyBvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZmVyZW5jZU5hbWUgLSBTaW5ndWxhciByZWZlcmVuY2UgbmFtZSB1c2VkIHRvIGRlcml2ZSB0aGUgRksgY29sdW1uLlxuICAgKiBAcGFyYW0ge1JlbW92ZUZvcmVpZ25LZXlBcmdzVHlwZX0gW2FyZ3NdIC0gT3B0aW9uYWwgb3ZlcnJpZGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlRm9yZWlnbktleSh0YWJsZU5hbWUsIHJlZmVyZW5jZU5hbWUsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtjb2x1bW5OYW1lLCAuLi5yZXN0QXJnc30gPSBhcmdzXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgY29uc3QgcmVzb2x2ZWRDb2x1bW5OYW1lID0gY29sdW1uTmFtZSB8fCBgJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUocmVmZXJlbmNlTmFtZSl9X2lkYFxuICAgIGNvbnN0IGRyaXZlciA9IHRoaXMuZ2V0RHJpdmVyKClcbiAgICBsZXQgbWF4aW11bVJlbW92YWxzID0gMFxuICAgIGxldCBwcmV2aW91c01hdGNoaW5nQ291bnQgPSAwXG5cbiAgICBmb3IgKGxldCByZW1vdmFsQXR0ZW1wdCA9IDA7IDsgcmVtb3ZhbEF0dGVtcHQrKykge1xuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBkcml2ZXIuZ2V0VGFibGVCeU5hbWUodGFibGVOYW1lKVxuXG4gICAgICBpZiAoIXRhYmxlKSB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlICR7dGFibGVOYW1lfSBkb2VzIG5vdCBleGlzdGApXG5cbiAgICAgIGNvbnN0IGZvcmVpZ25LZXlzID0gYXdhaXQgdGFibGUuZ2V0Rm9yZWlnbktleXMoKVxuICAgICAgY29uc3QgbWF0Y2hpbmdGb3JlaWduS2V5cyA9IGZvcmVpZ25LZXlzLmZpbHRlcigoZm9yZWlnbktleSkgPT4gZm9yZWlnbktleS5nZXRDb2x1bW5OYW1lKCkgPT0gcmVzb2x2ZWRDb2x1bW5OYW1lKVxuXG4gICAgICBpZiAobWF0Y2hpbmdGb3JlaWduS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYgKHJlbW92YWxBdHRlbXB0ID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoYE5vIGZvcmVpZ24ga2V5IG9uICR7dGFibGVOYW1lfS4ke3Jlc29sdmVkQ29sdW1uTmFtZX1gKVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAocmVtb3ZhbEF0dGVtcHQgPT09IDApIHtcbiAgICAgICAgbWF4aW11bVJlbW92YWxzID0gbWF0Y2hpbmdGb3JlaWduS2V5cy5sZW5ndGhcbiAgICAgIH0gZWxzZSBpZiAobWF0Y2hpbmdGb3JlaWduS2V5cy5sZW5ndGggPj0gcHJldmlvdXNNYXRjaGluZ0NvdW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRm9yZWlnbiBrZXkgcmVtb3ZhbCBkaWQgbm90IHJlZHVjZSBtYXRjaGVzIG9uICR7dGFibGVOYW1lfS4ke3Jlc29sdmVkQ29sdW1uTmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBpZiAocmVtb3ZhbEF0dGVtcHQgPj0gbWF4aW11bVJlbW92YWxzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRm9yZWlnbiBrZXkgcmVtb3ZhbCBleGNlZWRlZCBleHBlY3RlZCBtYXRjaGVzIG9uICR7dGFibGVOYW1lfS4ke3Jlc29sdmVkQ29sdW1uTmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBwcmV2aW91c01hdGNoaW5nQ291bnQgPSBtYXRjaGluZ0ZvcmVpZ25LZXlzLmxlbmd0aFxuICAgICAgYXdhaXQgZHJpdmVyLnJlbW92ZUZvcmVpZ25LZXkodGFibGVOYW1lLCBtYXRjaGluZ0ZvcmVpZ25LZXlzWzBdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmZXJlbmNlTmFtZSAtIFJlZmVyZW5jZSBuYW1lLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmZvcmVpZ25LZXldIC0gV2hldGhlciBmb3JlaWduIGtleS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5udWxsXSAtIFdoZXRoZXIgbnVsbGFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy50eXBlXSAtIFR5cGUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy51bmlxdWVdIC0gV2hldGhlciB1bmlxdWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBhZGRSZWZlcmVuY2UodGFibGVOYW1lLCByZWZlcmVuY2VOYW1lLCBhcmdzKSB7XG4gICAgY29uc3Qge2ZvcmVpZ25LZXksIG51bGw6IG51bGxhYmxlLCB0eXBlLCB1bmlxdWUsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcbiAgICBjb25zdCBjb2x1bW5OYW1lID0gYCR7aW5mbGVjdGlvbi51bmRlcnNjb3JlKHJlZmVyZW5jZU5hbWUpfV9pZGBcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBjb25zdCBjb2x1bW5UeXBlID0gdHlwZSB8fCBcImludGVnZXJcIlxuICAgIGNvbnN0IGNvbHVtbkFyZ3MgPSBudWxsYWJsZSAhPT0gdW5kZWZpbmVkID8ge251bGw6IG51bGxhYmxlfSA6IHVuZGVmaW5lZFxuXG4gICAgYXdhaXQgdGhpcy5hZGRDb2x1bW4odGFibGVOYW1lLCBjb2x1bW5OYW1lLCBjb2x1bW5UeXBlLCBjb2x1bW5BcmdzKVxuICAgIGF3YWl0IHRoaXMuYWRkSW5kZXgodGFibGVOYW1lLCBbY29sdW1uTmFtZV0sIHt1bmlxdWU6IHVuaXF1ZX0pXG5cbiAgICBpZiAoZm9yZWlnbktleSkge1xuICAgICAgYXdhaXQgdGhpcy5hZGRGb3JlaWduS2V5KHRhYmxlTmFtZSwgcmVmZXJlbmNlTmFtZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlUmVmZXJlbmNlQXJnc1R5cGUgdHlwZS5cbiAgICogQHR5cGVkZWYge29iamVjdH0gUmVtb3ZlUmVmZXJlbmNlQXJnc1R5cGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2x1bW5OYW1lXSAtIE92ZXJyaWRlIHRoZSBkZXJpdmVkIHJlZmVyZW5jZSBjb2x1bW4gbmFtZS5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtpbmRleE5hbWVdIC0gRXhwbGljaXQgZ2VuZXJhdGVkIGluZGV4IG5hbWUgdG8gcmVtb3ZlLlxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgcmVtb3ZlIHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcmVuY2VOYW1lIC0gUmVmZXJlbmNlIG5hbWUuXG4gICAqIEBwYXJhbSB7UmVtb3ZlUmVmZXJlbmNlQXJnc1R5cGV9IFthcmdzXSAtIE9wdGlvbmFsIG92ZXJyaWRlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHJlbW92ZVJlZmVyZW5jZSh0YWJsZU5hbWUsIHJlZmVyZW5jZU5hbWUsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtjb2x1bW5OYW1lLCBpbmRleE5hbWUsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBjb25zdCByZXNvbHZlZENvbHVtbk5hbWUgPSBjb2x1bW5OYW1lIHx8IGAke2luZmxlY3Rpb24udW5kZXJzY29yZShyZWZlcmVuY2VOYW1lKX1faWRgXG4gICAgY29uc3QgZHJpdmVyID0gdGhpcy5nZXREcml2ZXIoKVxuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgZHJpdmVyLmdldFRhYmxlQnlOYW1lKHRhYmxlTmFtZSlcblxuICAgIGlmICghdGFibGUpIHRocm93IG5ldyBFcnJvcihgVGFibGUgJHt0YWJsZU5hbWV9IGRvZXMgbm90IGV4aXN0YClcblxuICAgIGNvbnN0IGZvcmVpZ25LZXlzID0gYXdhaXQgdGFibGUuZ2V0Rm9yZWlnbktleXMoKVxuXG4gICAgZm9yIChjb25zdCBmb3JlaWduS2V5IG9mIGZvcmVpZ25LZXlzKSB7XG4gICAgICBpZiAoZm9yZWlnbktleS5nZXRDb2x1bW5OYW1lKCkgIT0gcmVzb2x2ZWRDb2x1bW5OYW1lKSBjb250aW51ZVxuXG4gICAgICBhd2FpdCBkcml2ZXIucmVtb3ZlRm9yZWlnbktleSh0YWJsZU5hbWUsIGZvcmVpZ25LZXkpXG4gICAgfVxuXG4gICAgY29uc3QgZXhwZWN0ZWRJbmRleE5hbWUgPSBpbmRleE5hbWUgfHwgdGhpcy5fcmVtb3ZlSW5kZXhOYW1lKHRhYmxlTmFtZSwgW3Jlc29sdmVkQ29sdW1uTmFtZV0pXG4gICAgY29uc3QgaW5kZXhlcyA9IGF3YWl0IHRhYmxlLmdldEluZGV4ZXMoKVxuICAgIGNvbnN0IGdlbmVyYXRlZEluZGV4ID0gaW5kZXhlcy5maW5kKChpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaW5kZXhDb2x1bW5OYW1lcyA9IGluZGV4LmdldENvbHVtbk5hbWVzKClcblxuICAgICAgcmV0dXJuICFpbmRleC5pc1ByaW1hcnlLZXkoKSAmJlxuICAgICAgICBpbmRleC5nZXROYW1lKCkgPT0gZXhwZWN0ZWRJbmRleE5hbWUgJiZcbiAgICAgICAgaW5kZXhDb2x1bW5OYW1lcy5sZW5ndGggPT0gMSAmJlxuICAgICAgICBpbmRleENvbHVtbk5hbWVzWzBdID09IHJlc29sdmVkQ29sdW1uTmFtZVxuICAgIH0pXG5cbiAgICBpZiAoZ2VuZXJhdGVkSW5kZXgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVtb3ZlSW5kZXgodGFibGVOYW1lLCBnZW5lcmF0ZWRJbmRleC5nZXROYW1lKCkpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5yZW1vdmVDb2x1bW4odGFibGVOYW1lLCByZXNvbHZlZENvbHVtbk5hbWUpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjaGFuZ2UgY29sdW1uIG51bGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uTmFtZSAtIENvbHVtbiBuYW1lLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG51bGxhYmxlIC0gV2hldGhlciBudWxsYWJsZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGNoYW5nZUNvbHVtbk51bGwodGFibGVOYW1lLCBjb2x1bW5OYW1lLCBudWxsYWJsZSkge1xuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5nZXRUYWJsZUJ5TmFtZSh0YWJsZU5hbWUpXG5cbiAgICBpZiAoIXRhYmxlKSB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlICR7dGFibGVOYW1lfSBkb2VzIG5vdCBleGlzdGApXG5cbiAgICBjb25zdCBjb2x1bW4gPSBhd2FpdCB0YWJsZS5nZXRDb2x1bW5CeU5hbWUoY29sdW1uTmFtZSlcblxuICAgIGlmICghY29sdW1uKSB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAke2NvbHVtbk5hbWV9IGRvZXMgbm90IGV4aXN0IGluIHRhYmxlICR7dGFibGVOYW1lfWApXG5cbiAgICBhd2FpdCBjb2x1bW4uY2hhbmdlTnVsbGFibGUobnVsbGFibGUpXG4gIH1cblxuICAvKipcbiAgICogTWlncmF0ZXMgbGVnYWN5IHRpbWV6b25lLWxlc3MgbG9jYWwgZGF0ZXRpbWUgcm93cyBpbnRvIFVUQyBkYXRldGltZSBzdG9yYWdlLlxuICAgKiBOZXcgU1FMaXRlIFVUQyByb3dzIGluY2x1ZGUgYSB0aW1lem9uZSBzdWZmaXggYW5kIGFyZSBza2lwcGVkLlxuICAgKiBAcGFyYW0ge0xlZ2FjeUxvY2FsRGF0ZVRpbWVzTWlncmF0aW9uQXJnc1R5cGV9IFthcmdzXSAtIE1pZ3JhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgbWlncmF0ZUxlZ2FjeUxvY2FsRGF0ZVRpbWVzVG9VdGNTdG9yYWdlKGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtjb2x1bW5zQnlUYWJsZSwgbGVnYWN5TG9jYWxPZmZzZXRNaW51dGVzLCB0YWJsZXMsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBjb25zdCB0YWJsZU5hbWVzID0gYXdhaXQgdGhpcy5fbGVnYWN5TG9jYWxEYXRlVGltZXNUYWJsZU5hbWVzKHRhYmxlcylcblxuICAgIGZvciAoY29uc3QgdGFibGVOYW1lIG9mIHRhYmxlTmFtZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuX21pZ3JhdGVMZWdhY3lMb2NhbERhdGVUaW1lc1RhYmxlKHtcbiAgICAgICAgY29sdW1uc0J5VGFibGUsXG4gICAgICAgIGxlZ2FjeUxvY2FsT2Zmc2V0TWludXRlcyxcbiAgICAgICAgdGFibGVOYW1lXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0YWJsZSBuYW1lcyBmb3IgYSBsZWdhY3kgbG9jYWwgZGF0ZXRpbWUgbWlncmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSB0YWJsZXMgLSBFeHBsaWNpdCB0YWJsZSBuYW1lcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFRhYmxlIG5hbWVzLlxuICAgKi9cbiAgYXN5bmMgX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzVGFibGVOYW1lcyh0YWJsZXMpIHtcbiAgICBpZiAodGFibGVzKSByZXR1cm4gdGFibGVzXG5cbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuZ2V0VGFibGVzKCkpXG4gICAgICAubWFwKCh0YWJsZSkgPT4gdGFibGUuZ2V0TmFtZSgpKVxuICAgICAgLmZpbHRlcigodGFibGVOYW1lKSA9PiB0YWJsZU5hbWUgIT0gXCJzY2hlbWFfbWlncmF0aW9uc1wiICYmICF0YWJsZU5hbWUuc3RhcnRzV2l0aChcInNxbGl0ZV9cIikpXG4gIH1cblxuICAvKipcbiAgICogTWlncmF0ZXMgb25lIHRhYmxlJ3MgbGVnYWN5IGxvY2FsIGRhdGV0aW1lIHZhbHVlcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB8IHVuZGVmaW5lZH0gYXJncy5jb2x1bW5zQnlUYWJsZSAtIEV4cGxpY2l0IGNvbHVtbnMga2V5ZWQgYnkgdGFibGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBhcmdzLmxlZ2FjeUxvY2FsT2Zmc2V0TWludXRlcyAtIFVUQy1taW51cy1sb2NhbCBvZmZzZXQgaW4gbWludXRlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9taWdyYXRlTGVnYWN5TG9jYWxEYXRlVGltZXNUYWJsZSh7Y29sdW1uc0J5VGFibGUsIGxlZ2FjeUxvY2FsT2Zmc2V0TWludXRlcywgdGFibGVOYW1lfSkge1xuICAgIGNvbnN0IGRyaXZlciA9IHRoaXMuZ2V0RHJpdmVyKClcbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGRyaXZlci5nZXRUYWJsZUJ5TmFtZU9yRmFpbCh0YWJsZU5hbWUpXG4gICAgY29uc3QgY29sdW1ucyA9IGF3YWl0IHRoaXMuX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzQ29sdW1ucyh7Y29sdW1uc0J5VGFibGUsIHRhYmxlfSlcblxuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBwcmltYXJ5S2V5Q29sdW1uID0gYXdhaXQgdGhpcy5fbGVnYWN5TG9jYWxEYXRlVGltZXNQcmltYXJ5S2V5KHRhYmxlKVxuICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1ucyA9IFtwcmltYXJ5S2V5Q29sdW1uLCAuLi5jb2x1bW5zXVxuICAgIGNvbnN0IHNlbGVjdFNxbCA9IHNlbGVjdGVkQ29sdW1uc1xuICAgICAgLm1hcCgoY29sdW1uTmFtZSkgPT4gZHJpdmVyLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpKVxuICAgICAgLmpvaW4oXCIsIFwiKVxuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBkcml2ZXIucXVlcnkoYFNFTEVDVCAke3NlbGVjdFNxbH0gRlJPTSAke2RyaXZlci5xdW90ZVRhYmxlKHRhYmxlTmFtZSl9YClcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uTmFtZSBvZiBjb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93W2NvbHVtbk5hbWVdXG4gICAgICAgIGNvbnN0IGNvbnZlcnRlZFZhbHVlID0gY29udmVydExlZ2FjeURhdGVWYWx1ZVRvVXRjU3RvcmFnZSh2YWx1ZSwge1xuICAgICAgICAgIGRhdGFiYXNlVHlwZTogZHJpdmVyLmdldFR5cGUoKSxcbiAgICAgICAgICBsZWdhY3lMb2NhbE9mZnNldE1pbnV0ZXNcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoY29udmVydGVkVmFsdWUgPT09IHZhbHVlKSBjb250aW51ZVxuXG4gICAgICAgIGF3YWl0IGRyaXZlci5xdWVyeShgXG4gICAgICAgICAgVVBEQVRFICR7ZHJpdmVyLnF1b3RlVGFibGUodGFibGVOYW1lKX1cbiAgICAgICAgICBTRVQgJHtkcml2ZXIucXVvdGVDb2x1bW4oY29sdW1uTmFtZSl9ID0gJHtkcml2ZXIucXVvdGUoY29udmVydGVkVmFsdWUpfVxuICAgICAgICAgIFdIRVJFICR7ZHJpdmVyLnF1b3RlQ29sdW1uKHByaW1hcnlLZXlDb2x1bW4pfSA9ICR7ZHJpdmVyLnF1b3RlKHJvd1twcmltYXJ5S2V5Q29sdW1uXSl9XG4gICAgICAgIGApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGRhdGUtbGlrZSBjb2x1bW5zIGZvciBvbmUgdGFibGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gfCB1bmRlZmluZWR9IGFyZ3MuY29sdW1uc0J5VGFibGUgLSBFeHBsaWNpdCBjb2x1bW5zIGtleWVkIGJ5IHRhYmxlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS10YWJsZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnRhYmxlIC0gVGFibGUgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBEYXRlLWxpa2UgY29sdW1uIG5hbWVzLlxuICAgKi9cbiAgYXN5bmMgX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzQ29sdW1ucyh7Y29sdW1uc0J5VGFibGUsIHRhYmxlfSkge1xuICAgIGNvbnN0IGV4cGxpY2l0Q29sdW1ucyA9IGNvbHVtbnNCeVRhYmxlPy5bdGFibGUuZ2V0TmFtZSgpXVxuXG4gICAgaWYgKGV4cGxpY2l0Q29sdW1ucykgcmV0dXJuIGV4cGxpY2l0Q29sdW1uc1xuXG4gICAgcmV0dXJuIChhd2FpdCB0YWJsZS5nZXRDb2x1bW5zKCkpXG4gICAgICAuZmlsdGVyKChjb2x1bW4pID0+IHRoaXMuX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzQ29sdW1uSXNEYXRlTGlrZShjb2x1bW4pKVxuICAgICAgLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uZ2V0TmFtZSgpKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgY29sdW1uIHNob3VsZCBiZSBpbmNsdWRlZCBieSBkZWZhdWx0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdH0gY29sdW1uIC0gQ29sdW1uIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBjb2x1bW4gaXMgZGF0ZS1saWtlLlxuICAgKi9cbiAgX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzQ29sdW1uSXNEYXRlTGlrZShjb2x1bW4pIHtcbiAgICBjb25zdCBjb2x1bW5UeXBlID0gY29sdW1uLmdldFR5cGUoKS50b0xvd2VyQ2FzZSgpXG5cbiAgICByZXR1cm4gY29sdW1uVHlwZS5pbmNsdWRlcyhcImRhdGVcIikgfHwgY29sdW1uVHlwZS5pbmNsdWRlcyhcInRpbWVzdGFtcFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzaW5nbGUgcHJpbWFyeSBrZXkgY29sdW1uIGZvciByb3cgdXBkYXRlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtdGFibGUuanNcIikuZGVmYXVsdH0gdGFibGUgLSBUYWJsZSBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBQcmltYXJ5IGtleSBjb2x1bW4gbmFtZS5cbiAgICovXG4gIGFzeW5jIF9sZWdhY3lMb2NhbERhdGVUaW1lc1ByaW1hcnlLZXkodGFibGUpIHtcbiAgICBjb25zdCBwcmltYXJ5S2V5Q29sdW1ucyA9IChhd2FpdCB0YWJsZS5nZXRDb2x1bW5zKCkpLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uZ2V0UHJpbWFyeUtleSgpKVxuXG4gICAgaWYgKHByaW1hcnlLZXlDb2x1bW5zLmxlbmd0aCAhPSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgb25lIHByaW1hcnkga2V5IG9uICR7dGFibGUuZ2V0TmFtZSgpfSBidXQgZm91bmQgJHtwcmltYXJ5S2V5Q29sdW1ucy5sZW5ndGh9YClcbiAgICB9XG5cbiAgICByZXR1cm4gcHJpbWFyeUtleUNvbHVtbnNbMF0uZ2V0TmFtZSgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjb2x1bW4gZXhpc3RzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtbk5hbWUgLSBDb2x1bW4gbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gUmVzb2x2ZXMgd2l0aCBXaGV0aGVyIGNvbHVtbiBleGlzdHMuXG4gICAqL1xuICBhc3luYyBjb2x1bW5FeGlzdHModGFibGVOYW1lLCBjb2x1bW5OYW1lKSB7XG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLmdldFRhYmxlQnlOYW1lKHRhYmxlTmFtZSlcblxuICAgIGlmICh0YWJsZSkge1xuICAgICAgY29uc3QgY29sdW1uID0gYXdhaXQgdGFibGUuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbk5hbWUpXG5cbiAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQm9vbGVhbihmYWxzZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhbiBpbmRleCB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0cyBvbiBhIHRhYmxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGluZGV4TmFtZSAtIEluZGV4IG5hbWUgdG8gbG9vayBmb3IuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgdGhlIGluZGV4IGV4aXN0cyBvbiB0aGUgdGFibGUuXG4gICAqL1xuICBhc3luYyBpbmRleEV4aXN0cyh0YWJsZU5hbWUsIGluZGV4TmFtZSkge1xuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5nZXRUYWJsZUJ5TmFtZSh0YWJsZU5hbWUsIHt0aHJvd0Vycm9yOiBmYWxzZX0pXG5cbiAgICBpZiAodGFibGUpIHtcbiAgICAgIGZvciAoY29uc3QgaW5kZXggb2YgYXdhaXQgdGFibGUuZ2V0SW5kZXhlcygpKSB7XG4gICAgICAgIGlmIChpbmRleC5nZXROYW1lKCkgPT0gaW5kZXhOYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgdGhlIGRhdGFiYXNlIHNjaGVtYSBmb3IgYSBnYXAtbGVzcyBwb3NpdGlvbmFsIGxpc3QuIEFkZHMgdGhlXG4gICAqIHBvc2l0aW9uIGNvbHVtbiAoSU5UIE5PVCBOVUxMKSBpZiBhYnNlbnQgYW5kIGNyZWF0ZXMgYSBVTklRVUUgaW5kZXggb25cbiAgICogKHNjb3BlLCBwb3NpdGlvbikuIFRoaXMgaXMgdGhlIHNjaGVtYS1zaWRlIGNvdW50ZXJwYXJ0IG9mXG4gICAqIGBNb2RlbC5hY3RzQXNMaXN0KClgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBvc2l0aW9uQ29sdW1uIC0gQ29sdW1uIG5hbWUgZm9yIHRoZSBwb3NpdGlvbiAoZS5nLiBcInJvd19udW1iZXJcIikuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuc2NvcGUgLSBDb2x1bW4gbmFtZSBmb3IgdGhlIHNjb3BlIChlLmcuIFwiYm9hcmRfY29sdW1uX2lkXCIpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGFkZEFjdHNBc0xpc3QodGFibGVOYW1lLCBwb3NpdGlvbkNvbHVtbiwge3Njb3BlfSkge1xuICAgIGlmICghKGF3YWl0IHRoaXMuY29sdW1uRXhpc3RzKHRhYmxlTmFtZSwgcG9zaXRpb25Db2x1bW4pKSkge1xuICAgICAgYXdhaXQgdGhpcy5hZGRDb2x1bW4odGFibGVOYW1lLCBwb3NpdGlvbkNvbHVtbiwgXCJpbnRlZ2VyXCIsIHtudWxsOiBmYWxzZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuY2hhbmdlQ29sdW1uTnVsbCh0YWJsZU5hbWUsIHBvc2l0aW9uQ29sdW1uLCBmYWxzZSlcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmFkZEluZGV4KHRhYmxlTmFtZSwgW3Njb3BlLCBwb3NpdGlvbkNvbHVtbl0sIHt1bmlxdWU6IHRydWV9KVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0YWJsZSB3aXRoIGRlZmF1bHQgb3B0aW9ucy5cbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge0NyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlfSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0YWJsZSB3aXRoIGV4cGxpY2l0IG9wdGlvbnMuXG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtDcmVhdGVUYWJsZUFyZ3NUeXBlfSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7Q3JlYXRlVGFibGVDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICAvKipcbiAgICogUnVucyBjcmVhdGUgdGFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge0NyZWF0ZVRhYmxlQXJnc1R5cGUgfCBDcmVhdGVUYWJsZUNhbGxiYWNrVHlwZX0gYXJnMSAtIEFyZzEuXG4gICAqIEBwYXJhbSB7Q3JlYXRlVGFibGVDYWxsYmFja1R5cGUgfCB1bmRlZmluZWR9IFthcmcyXSAtIEFyZzIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBjcmVhdGVUYWJsZSh0YWJsZU5hbWUsIGFyZzEsIGFyZzIpIHtcbiAgICBsZXQgYXJnc1xuICAgIGxldCBjYWxsYmFja1xuXG4gICAgaWYgKHR5cGVvZiBhcmcxID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgYXJncyA9IHt9XG4gICAgICBjYWxsYmFjayA9IGFyZzFcbiAgICB9IGVsc2Uge1xuICAgICAgYXJncyA9IGFyZzFcbiAgICAgIGNhbGxiYWNrID0gYXJnMlxuICAgIH1cblxuICAgIGNvbnN0IHtpZCA9IHt9LCBpZk5vdEV4aXN0cyA9IGZhbHNlLCAuLi5yZXN0QXJnc30gPSBhcmdzXG4gICAgY29uc3QgZHJpdmVyID0gdGhpcy5nZXREcml2ZXIoKVxuICAgIGNvbnN0IGRlZmF1bHRQcmltYXJ5S2V5VHlwZSA9IGRyaXZlci5wcmltYXJ5S2V5VHlwZSgpXG4gICAgbGV0IGlkRGVmYXVsdCwgaWRUeXBlLCByZXN0QXJnc0lkXG5cbiAgICBpZiAoaWQgIT09IGZhbHNlKSB7XG4gICAgICAoe2RlZmF1bHQ6IGlkRGVmYXVsdCwgdHlwZTogaWRUeXBlLCAuLi5yZXN0QXJnc0lkfSA9IGlkKVxuXG4gICAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzSWQpXG4gICAgfVxuXG4gICAgaWYgKCFpZFR5cGUpIHtcbiAgICAgIGlkVHlwZSA9IGRlZmF1bHRQcmltYXJ5S2V5VHlwZVxuICAgIH1cbiAgICBjb25zdCBkcml2ZXJTdXBwb3J0c0RlZmF1bHRVVUlEID0gZHJpdmVyLnN1cHBvcnRzRGVmYXVsdFByaW1hcnlLZXlVVUlEPy4oKVxuICAgIGNvbnN0IGxvd2VySWRUeXBlID0gaWRUeXBlPy50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3QgaXNVVUlEUHJpbWFyeUtleSA9IGxvd2VySWRUeXBlID09IFwidXVpZFwiXG4gICAgY29uc3QgbnVtZXJpY0F1dG9JbmNyZW1lbnRUeXBlcyA9IFtcImludFwiLCBcImludGVnZXJcIiwgXCJiaWdpbnRcIiwgXCJzbWFsbGludFwiLCBcInRpbnlpbnRcIl1cbiAgICBsZXQgaWRBdXRvSW5jcmVtZW50ID0gbnVtZXJpY0F1dG9JbmNyZW1lbnRUeXBlcy5pbmNsdWRlcyhsb3dlcklkVHlwZSB8fCBcIlwiKVxuXG4gICAgaWYgKGlzVVVJRFByaW1hcnlLZXkpIHtcbiAgICAgIGlkQXV0b0luY3JlbWVudCA9IGZhbHNlXG5cbiAgICAgIGlmIChkcml2ZXJTdXBwb3J0c0RlZmF1bHRVVUlEKSB7XG4gICAgICAgIGlmIChpZERlZmF1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlkRGVmYXVsdCA9ICgpID0+IFwiVVVJRCgpXCJcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpZERlZmF1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBMZXQgYXBwbGljYXRpb24gY29kZSBhc3NpZ24gVVVJRHMgKHNlZSBEYXRhYmFzZVJlY29yZC5pbnNlcnQpIHdoZW4gdGhlIGRyaXZlciBjYW4ndCBkbyBpdC5cbiAgICAgICAgaWREZWZhdWx0ID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgICAvLyBJZiBkcml2ZXIgZG9lc24ndCBzdXBwb3J0IFVVSUQoKSBidXQgdGhlIGNhbGxlciBleHBsaWNpdGx5IHNldCBhIGRlZmF1bHQsIHJlc3BlY3QgaXQuXG4gICAgfVxuXG4gICAgY29uc3QgdGFibGVEYXRhID0gbmV3IFRhYmxlRGF0YSh0YWJsZU5hbWUsIHtpZk5vdEV4aXN0cywgcHJpbWFyeUtleVR5cGU6IGRlZmF1bHRQcmltYXJ5S2V5VHlwZX0pXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgaWYgKCEoaWRUeXBlIGluIHRhYmxlRGF0YSkpIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcHJpbWFyeSBrZXkgdHlwZTogJHtpZFR5cGV9YClcblxuICAgIGlmIChpZCAhPT0gZmFsc2UpIHtcbiAgICAgIHRhYmxlRGF0YS5hZGRDb2x1bW4oXCJpZFwiLCB7YXV0b0luY3JlbWVudDogaWRBdXRvSW5jcmVtZW50LCBkZWZhdWx0OiBpZERlZmF1bHQsIG51bGw6IGZhbHNlLCBwcmltYXJ5S2V5OiB0cnVlLCB0eXBlOiBpZFR5cGV9KVxuICAgIH1cblxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2sodGFibGVEYXRhKVxuICAgIH1cblxuICAgIGNvbnN0IHNxbHMgPSBhd2FpdCBkcml2ZXIuY3JlYXRlVGFibGVTcWwodGFibGVEYXRhKVxuXG4gICAgZm9yIChjb25zdCBzcWwgb2Ygc3Fscykge1xuICAgICAgYXdhaXQgdGhpcy5fZGIucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRyb3AgdGFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgZHJvcFRhYmxlKHRhYmxlTmFtZSkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuZHJvcFRhYmxlKHRhYmxlTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbmFtZSBjb2x1bW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2xkQ29sdW1uTmFtZSAtIFByZXZpb3VzIGNvbHVtbiBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3Q29sdW1uTmFtZSAtIE5ldyBjb2x1bW4gbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHJlbmFtZUNvbHVtbih0YWJsZU5hbWUsIG9sZENvbHVtbk5hbWUsIG5ld0NvbHVtbk5hbWUpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLnJlbmFtZUNvbHVtbih0YWJsZU5hbWUsIG9sZENvbHVtbk5hbWUsIG5ld0NvbHVtbk5hbWUpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0YWJsZSBleGlzdHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBSZXNvbHZlcyB3aXRoIFdoZXRoZXIgdGFibGUgZXhpc3RzLlxuICAgKi9cbiAgYXN5bmMgdGFibGVFeGlzdHModGFibGVOYW1lKSB7XG4gICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS50YWJsZUV4aXN0cyh0YWJsZU5hbWUpXG5cbiAgICByZXR1cm4gZXhpc3RzXG4gIH1cblxuICAvKipcbiAgICogSGVscGVyOiBjcmVhdGVzIHRoZSBzaGFyZWQgYXVkaXQgdGFibGVzIChgYXVkaXRfYWN0aW9uc2AsXG4gICAqIGBhdWRpdF9hdWRpdGFibGVfdHlwZXNgLCBgYXVkaXRzYCkuIENhbGwgZnJvbSBgdXAoKWAgaW4gYSBtaWdyYXRpb24uXG4gICAqIEBwYXJhbSB7e2lkPzoge3R5cGU/OiBzdHJpbmd9fX0gW29wdGlvbnNdIC0gSUQgY29sdW1uIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlU2hhcmVkQXVkaXRUYWJsZXMob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgaWQgPSBvcHRpb25zLmlkIHx8IHt9XG5cbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKFwiYXVkaXRfYWN0aW9uc1wiLCB7aWR9LCAodGFibGUpID0+IHtcbiAgICAgIHRhYmxlLnN0cmluZyhcImFjdGlvblwiLCB7aW5kZXg6IHt1bmlxdWU6IHRydWV9LCBudWxsOiBmYWxzZX0pXG4gICAgICB0YWJsZS50aW1lc3RhbXBzKClcbiAgICB9KVxuXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVUYWJsZShcImF1ZGl0X2F1ZGl0YWJsZV90eXBlc1wiLCB7aWR9LCAodGFibGUpID0+IHtcbiAgICAgIHRhYmxlLnN0cmluZyhcIm5hbWVcIiwge2luZGV4OiB7dW5pcXVlOiB0cnVlfSwgbnVsbDogZmFsc2V9KVxuICAgICAgdGFibGUudGltZXN0YW1wcygpXG4gICAgfSlcblxuICAgIGF3YWl0IHRoaXMuY3JlYXRlVGFibGUoXCJhdWRpdHNcIiwge2lkfSwgKHRhYmxlKSA9PiB7XG4gICAgICB0YWJsZS5yZWZlcmVuY2VzKFwiYXVkaXRfYWN0aW9uXCIsIHtmb3JlaWduS2V5OiB0cnVlLCBudWxsOiBmYWxzZX0pXG4gICAgICB0YWJsZS5yZWZlcmVuY2VzKFwiYXVkaXRfYXVkaXRhYmxlX3R5cGVcIiwge2ZvcmVpZ25LZXk6IHRydWUsIG51bGw6IGZhbHNlfSlcbiAgICAgIHRhYmxlLnJlZmVyZW5jZXMoXCJhdWRpdGFibGVcIiwge251bGw6IGZhbHNlLCBwb2x5bW9ycGhpYzogdHJ1ZX0pXG4gICAgICB0YWJsZS5qc29uKFwiYXVkaXRlZF9jaGFuZ2VzXCIpXG4gICAgICB0YWJsZS5qc29uKFwicGFyYW1zXCIpXG4gICAgICB0YWJsZS50aW1lc3RhbXBzKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlcjogY3JlYXRlcyBhIGRlZGljYXRlZCBhdWRpdCB0YWJsZSBmb3IgYSBtb2RlbCAoZS5nLlxuICAgKiBgcHJvamVjdF9hdWRpdHNgIGZvciB0aGUgYHByb2plY3RzYCB0YWJsZSkuIENhbGwgZnJvbSBgdXAoKWBcbiAgICogaW4gYSBtaWdyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbFRhYmxlTmFtZSAtIE1vZGVsIHRhYmxlIG5hbWUgKGUuZy4gXCJwcm9qZWN0c1wiKS5cbiAgICogQHBhcmFtIHt7aWQ/OiB7dHlwZT86IHN0cmluZ319fSBbb3B0aW9uc10gLSBJRCBjb2x1bW4gb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gVGhlIGNyZWF0ZWQgYXVkaXQgdGFibGUgbmFtZS5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZURlZGljYXRlZEF1ZGl0VGFibGUobW9kZWxUYWJsZU5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGF1ZGl0VGFibGUgPSBkZWRpY2F0ZWRBdWRpdFRhYmxlTmFtZShtb2RlbFRhYmxlTmFtZSlcbiAgICBjb25zdCBpZCA9IG9wdGlvbnMuaWQgfHwge31cblxuICAgIGF3YWl0IHRoaXMuY3JlYXRlVGFibGUoYXVkaXRUYWJsZSwge2lkfSwgKHRhYmxlKSA9PiB7XG4gICAgICBjb25zdCByZWZLZXkgPSBpbmZsZWN0aW9uLnNpbmd1bGFyaXplKG1vZGVsVGFibGVOYW1lKVxuXG4gICAgICB0YWJsZS5yZWZlcmVuY2VzKHJlZktleSwge2ZvcmVpZ25LZXk6IHRydWUsIG51bGw6IGZhbHNlfSlcbiAgICAgIHRhYmxlLnJlZmVyZW5jZXMoXCJhdWRpdF9hY3Rpb25cIiwge2ZvcmVpZ25LZXk6IHRydWUsIG51bGw6IGZhbHNlfSlcbiAgICAgIHRhYmxlLmpzb24oXCJhdWRpdGVkX2NoYW5nZXNcIilcbiAgICAgIHRhYmxlLmpzb24oXCJwYXJhbXNcIilcbiAgICAgIHRhYmxlLnRpbWVzdGFtcHMoKVxuICAgIH0pXG5cbiAgICByZXR1cm4gYXVkaXRUYWJsZVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGVkaWNhdGVkIGF1ZGl0IHRhYmxlIG5hbWUgZm9yIGEgbW9kZWwgdGFibGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxUYWJsZU5hbWUgLSBNb2RlbCB0YWJsZSBuYW1lIChlLmcuIFwicHJvamVjdHNcIikuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBEZWRpY2F0ZWQgYXVkaXQgdGFibGUgbmFtZSAoZS5nLiBcInByb2plY3RfYXVkaXRzXCIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVkaWNhdGVkQXVkaXRUYWJsZU5hbWUobW9kZWxUYWJsZU5hbWUpIHtcbiAgaWYgKG1vZGVsVGFibGVOYW1lLmVuZHNXaXRoKFwic1wiKSkge1xuICAgIHJldHVybiBgJHttb2RlbFRhYmxlTmFtZS5zbGljZSgwLCAtMSl9X2F1ZGl0c2BcbiAgfVxuXG4gIHJldHVybiBgJHttb2RlbFRhYmxlTmFtZX1fYXVkaXRzYFxufVxuIl19
@@ -10,6 +10,12 @@ export default class VelociousDatabaseQueryAlterTableBase extends QueryBase {
10
10
  tableData: TableData;
11
11
  });
12
12
  tableData: TableData;
13
+ /**
14
+ * Runs get drop foreign key sql.
15
+ * @param {import("../table-data/table-foreign-key.js").default} foreignKey - Foreign key to drop.
16
+ * @returns {string} - SQL fragment that removes the foreign key.
17
+ */
18
+ getDropForeignKeySQL(foreignKey: import("../table-data/table-foreign-key.js").default): string;
13
19
  }
14
20
  import QueryBase from "./base.js";
15
21
  import TableData from "../table-data/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"alter-table-base.d.ts","sourceRoot":"","sources":["../../../../src/database/query/alter-table-base.js"],"names":[],"mappings":"AAMA;IACE;;;;;OAKG;IACH,gDAHG;QAAmD,MAAM,EAAjD,OAAO,oBAAoB,EAAE,OAAO;QACpB,SAAS,EAAzB,SAAS;KACnB,EAQA;IADC,qBAA0B;CAoF7B;sBArGqB,WAAW;sBAEX,wBAAwB"}
1
+ {"version":3,"file":"alter-table-base.d.ts","sourceRoot":"","sources":["../../../../src/database/query/alter-table-base.js"],"names":[],"mappings":"AAMA;IACE;;;;;OAKG;IACH,gDAHG;QAAmD,MAAM,EAAjD,OAAO,oBAAoB,EAAE,OAAO;QACpB,SAAS,EAAzB,SAAS;KACnB,EAQA;IADC,qBAA0B;IA2F5B;;;;OAIG;IACH,iCAHW,OAAO,oCAAoC,EAAE,OAAO,GAClD,MAAM,CAQlB;CACF;sBAxHqB,WAAW;sBAEX,wBAAwB"}
@@ -57,10 +57,15 @@ export default class VelociousDatabaseQueryAlterTableBase extends QueryBase {
57
57
  // SQLite's ALTER TABLE does not support adding constraints; the SQLite driver overrides
58
58
  // alterTableSQLs entirely (via TableRebuilder) so this base path is never invoked there.
59
59
  for (const foreignKey of tableData.getForeignKeys()) {
60
- if (!foreignKey.getIsNewForeignKey())
60
+ if (!foreignKey.getIsNewForeignKey() && !foreignKey.getDropForeignKey())
61
61
  continue;
62
62
  if (actionCount > 0)
63
63
  sql += ", ";
64
+ if (foreignKey.getDropForeignKey()) {
65
+ sql += this.getDropForeignKeySQL(foreignKey);
66
+ actionCount++;
67
+ continue;
68
+ }
64
69
  sql += "ADD";
65
70
  if (foreignKey.getName()) {
66
71
  sql += ` CONSTRAINT ${options.quoteIndexName(foreignKey.getName())}`;
@@ -85,5 +90,16 @@ export default class VelociousDatabaseQueryAlterTableBase extends QueryBase {
85
90
  }
86
91
  return sqls;
87
92
  }
93
+ /**
94
+ * Runs get drop foreign key sql.
95
+ * @param {import("../table-data/table-foreign-key.js").default} foreignKey - Foreign key to drop.
96
+ * @returns {string} - SQL fragment that removes the foreign key.
97
+ */
98
+ getDropForeignKeySQL(foreignKey) {
99
+ const name = foreignKey.getName();
100
+ if (!name)
101
+ throw new Error(`Cannot remove unnamed foreign key on ${foreignKey.getTableName()}.${foreignKey.getColumnName()}`);
102
+ return `DROP CONSTRAINT ${this.getOptions().quoteIndexName(name)}`;
103
+ }
88
104
  }
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWx0ZXItdGFibGUtYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeS9hbHRlci10YWJsZS1iYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFNBQVMsTUFBTSxXQUFXLENBQUE7QUFDakMsT0FBTyxhQUFhLE1BQU0sZ0NBQWdDLENBQUE7QUFDMUQsT0FBTyxTQUFTLE1BQU0sd0JBQXdCLENBQUE7QUFFOUMsTUFBTSxDQUFDLE9BQU8sT0FBTyxvQ0FBcUMsU0FBUSxTQUFTO0lBQ3pFOzs7OztPQUtHO0lBQ0gsWUFBWSxFQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxRQUFRLEVBQUM7UUFDMUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXZCLElBQUksQ0FBQyxDQUFDLFNBQVMsWUFBWSxTQUFTLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUE7UUFFdEYsS0FBSyxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO0lBQzVCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsTUFBTTtRQUNWLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUMvQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUE7UUFDZixNQUFNLEVBQUMsU0FBUyxFQUFDLEdBQUcsSUFBSSxDQUFBO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUVqQyxJQUFJLEdBQUcsR0FBRyxlQUFlLE9BQU8sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQTtRQUN2RSxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUE7UUFFbkIsS0FBSyxNQUFNLE1B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RSxFQUFFLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRTtvQkFBRSxTQUFRO2dCQUU3RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLENBQUE7Z0JBQ3RELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQTtnQkFFekMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFVBQVU7b0JBQUUsU0FBUTtnQkFFbkMsSUFBSSxDQUFDLElBQUksQ0FDUCxxQkFBcUIsT0FBTyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDckksQ0FBQTtZQUNELENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IFF1ZXJ5QmFzZSBmcm9tIFwiLi9iYXNlLmpzXCJcbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi8uLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuaW1wb3J0IFRhYmxlRGF0YSBmcm9tIFwiLi4vdGFibGUtZGF0YS9pbmRleC5qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlUXVlcnlBbHRlclRhYmxlQmFzZSBleHRlbmRzIFF1ZXJ5QmFzZSB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBhcmdzLmRyaXZlciAtIERhdGFiYXNlIGRyaXZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtUYWJsZURhdGF9IGFyZ3MudGFibGVEYXRhIC0gVGFibGUgZGF0YS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtkcml2ZXIsIHRhYmxlRGF0YSwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGlmICghKHRhYmxlRGF0YSBpbnN0YW5jZW9mIFRhYmxlRGF0YSkpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdGFibGUgZGF0YSB3YXMgZ2l2ZW5cIilcblxuICAgIHN1cGVyKHtkcml2ZXJ9KVxuICAgIHRoaXMudGFibGVEYXRhID0gdGFibGVEYXRhXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byBzcWxzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gUmVzb2x2ZXMgd2l0aCBTUUwgc3RhdGVtZW50cy5cbiAgICovXG4gIGFzeW5jIHRvU1FMcygpIHtcbiAgICBjb25zdCBkYXRhYmFzZVR5cGUgPSB0aGlzLmdldERyaXZlcigpLmdldFR5cGUoKVxuICAgIGNvbnN0IHNxbHMgPSBbXVxuICAgIGNvbnN0IHt0YWJsZURhdGF9ID0gdGhpc1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoKVxuXG4gICAgbGV0IHNxbCA9IGBBTFRFUiBUQUJMRSAke29wdGlvbnMucXVvdGVUYWJsZU5hbWUodGFibGVEYXRhLmdldE5hbWUoKSl9IGBcbiAgICBsZXQgYWN0aW9uQ291bnQgPSAwXG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0YWJsZURhdGEuZ2V0Q29sdW1ucygpKSB7XG4gICAgICBpZiAoYWN0aW9uQ291bnQgPiAwKSBzcWwgKz0gXCIsIFwiXG5cbiAgICAgIGlmIChjb2x1bW4uaXNOZXdDb2x1bW4oKSkge1xuICAgICAgICBzcWwgKz0gZGF0YWJhc2VUeXBlID09IFwibXNzcWxcIiA/IFwiQUREIFwiIDogXCJBREQgQ09MVU1OIFwiXG4gICAgICAgIHNxbCArPSBjb2x1bW4uZ2V0U1FMKHtkcml2ZXI6IHRoaXMuZ2V0RHJpdmVyKCksIGZvckFsdGVyVGFibGU6IGZhbHNlfSlcbiAgICAgIH0gZWxzZSBpZiAoY29sdW1uLmdldE5ld05hbWUoKSkge1xuICAgICAgICBjb25zdCBuZXdDb2x1bW5OYW1lID0gY29sdW1uLmdldE5ld05hbWUoKVxuXG4gICAgICAgIGlmICghbmV3Q29sdW1uTmFtZSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBuZXcgY29sdW1uIG5hbWUgZm9yICR7Y29sdW1uLmdldE5hbWUoKX1gKVxuXG4gICAgICAgIHNxbCArPSBgUkVOQU1FIENPTFVNTiAke29wdGlvbnMucXVvdGVDb2x1bW5OYW1lKGNvbHVtbi5nZXROYW1lKCkpfSBUTyAke29wdGlvbnMucXVvdGVDb2x1bW5OYW1lKG5ld0NvbHVtbk5hbWUpfWBcbiAgICAgIH0gZWxzZSBpZiAoY29sdW1uLmdldERyb3BDb2x1bW4oKSkge1xuICAgICAgICBzcWwgKz0gYERST1AgQ09MVU1OICR7b3B0aW9ucy5xdW90ZUNvbHVtbk5hbWUoY29sdW1uLmdldE5hbWUoKSl9YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRhdGFiYXNlVHlwZSA9PSBcIm1zc3FsXCIgfHwgZGF0YWJhc2VUeXBlID09IFwicGdzcWxcIikge1xuICAgICAgICAgIHNxbCArPSBcIkFMVEVSIENPTFVNTiBcIlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNxbCArPSBcIk1PRElGWSBcIlxuICAgICAgICB9XG5cbiAgICAgICAgc3FsICs9IGNvbHVtbi5nZXRTUUwoe2RyaXZlcjogdGhpcy5nZXREcml2ZXIoKSwgZm9yQWx0ZXJUYWJsZTogdHJ1ZX0pXG4gICAgICB9XG5cblxuICAgICAgYWN0aW9uQ291bnQrK1xuICAgIH1cblxuICAgIC8vIFNRTGl0ZSdzIEFMVEVSIFRBQkxFIGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nIGNvbnN0cmFpbnRzOyB0aGUgU1FMaXRlIGRyaXZlciBvdmVycmlkZXNcbiAgICAvLyBhbHRlclRhYmxlU1FMcyBlbnRpcmVseSAodmlhIFRhYmxlUmVidWlsZGVyKSBzbyB0aGlzIGJhc2UgcGF0aCBpcyBuZXZlciBpbnZva2VkIHRoZXJlLlxuICAgIGZvciAoY29uc3QgZm9yZWlnbktleSBvZiB0YWJsZURhdGEuZ2V0Rm9yZWlnbktleXMoKSkge1xuICAgICAgaWYgKCFmb3JlaWduS2V5LmdldElzTmV3Rm9yZWlnbktleSgpKSBjb250aW51ZVxuXG4gICAgICBpZiAoYWN0aW9uQ291bnQgPiAwKSBzcWwgKz0gXCIsIFwiXG5cbiAgICAgIHNxbCArPSBcIkFERFwiXG5cbiAgICAgIGlmIChmb3JlaWduS2V5LmdldE5hbWUoKSkge1xuICAgICAgICBzcWwgKz0gYCBDT05TVFJBSU5UICR7b3B0aW9ucy5xdW90ZUluZGV4TmFtZShmb3JlaWduS2V5LmdldE5hbWUoKSl9YFxuICAgICAgfVxuXG4gICAgICBzcWwgKz0gYCBGT1JFSUdOIEtFWSAoJHtvcHRpb25zLnF1b3RlQ29sdW1uTmFtZShmb3JlaWduS2V5LmdldENvbHVtbk5hbWUoKSl9KWBcbiAgICAgIHNxbCArPSBgIFJFRkVSRU5DRVMgJHtvcHRpb25zLnF1b3RlVGFibGVOYW1lKGZvcmVpZ25LZXkuZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpKX0gKCR7b3B0aW9ucy5xdW90ZUNvbHVtbk5hbWUoZm9yZWlnbktleS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKX0pYFxuXG4gICAgICBhY3Rpb25Db3VudCsrXG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbkNvdW50ID4gMCkge1xuICAgICAgc3Fscy5wdXNoKHNxbClcbiAgICB9XG5cbiAgICBpZiAoZGF0YWJhc2VUeXBlID09IFwicGdzcWxcIikge1xuICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgdGFibGVEYXRhLmdldENvbHVtbnMoKSkge1xuICAgICAgaWYgKCFjb2x1bW4uaXNOZXdDb2x1bW4oKSB8fCBjb2x1bW4uZ2V0RHJvcENvbHVtbigpKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBub3RlcyA9IGNvbHVtbi5nZXROb3Rlc0ZvckRhdGFiYXNlKGRhdGFiYXNlVHlwZSlcbiAgICAgIGNvbnN0IGFjdHVhbE5hbWUgPSBjb2x1bW4uZ2V0QWN0dWFsTmFtZSgpXG5cbiAgICAgIGlmICghbm90ZXMgfHwgIWFjdHVhbE5hbWUpIGNvbnRpbnVlXG5cbiAgICAgIHNxbHMucHVzaChcbiAgICAgICAgYENPTU1FTlQgT04gQ09MVU1OICR7b3B0aW9ucy5xdW90ZVRhYmxlTmFtZSh0YWJsZURhdGEuZ2V0TmFtZSgpKX0uJHtvcHRpb25zLnF1b3RlQ29sdW1uTmFtZShhY3R1YWxOYW1lKX0gSVMgJHtvcHRpb25zLnF1b3RlKG5vdGVzKX1gXG4gICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNxbHNcbiAgfVxufVxuIl19
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWx0ZXItdGFibGUtYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeS9hbHRlci10YWJsZS1iYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFNBQVMsTUFBTSxXQUFXLENBQUE7QUFDakMsT0FBTyxhQUFhLE1BQU0sZ0NBQWdDLENBQUE7QUFDMUQsT0FBTyxTQUFTLE1BQU0sd0JBQXdCLENBQUE7QUFFOUMsTUFBTSxDQUFDLE9BQU8sT0FBTyxvQ0FBcUMsU0FBUSxTQUFTO0lBQ3pFOzs7OztPQUtHO0lBQ0gsWUFBWSxFQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxRQUFRLEVBQUM7UUFDMUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXZCLElBQUksQ0FBQyxDQUFDLFNBQVMsWUFBWSxTQUFTLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUE7UUFFdEYsS0FBSyxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO0lBQzVCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsTUFBTTtRQUNWLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUMvQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUE7UUFDZixNQUFNLEVBQUMsU0FBUyxFQUFDLEdBQUcsSUFBSSxDQUFBO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUVqQyxJQUFJLEdBQUcsR0FBRyxlQUFlLE9BQU8sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQTtRQUN2RSxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUE7UUFFbkIsS0FBSyxNQUFNLE1B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QUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgUXVlcnlCYXNlIGZyb20gXCIuL2Jhc2UuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uLy4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5pbXBvcnQgVGFibGVEYXRhIGZyb20gXCIuLi90YWJsZS1kYXRhL2luZGV4LmpzXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzRGF0YWJhc2VRdWVyeUFsdGVyVGFibGVCYXNlIGV4dGVuZHMgUXVlcnlCYXNlIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MuZHJpdmVyIC0gRGF0YWJhc2UgZHJpdmVyIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge1RhYmxlRGF0YX0gYXJncy50YWJsZURhdGEgLSBUYWJsZSBkYXRhLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2RyaXZlciwgdGFibGVEYXRhLCAuLi5yZXN0QXJnc30pIHtcbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgaWYgKCEodGFibGVEYXRhIGluc3RhbmNlb2YgVGFibGVEYXRhKSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0YWJsZSBkYXRhIHdhcyBnaXZlblwiKVxuXG4gICAgc3VwZXIoe2RyaXZlcn0pXG4gICAgdGhpcy50YWJsZURhdGEgPSB0YWJsZURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIHNxbHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgYXN5bmMgdG9TUUxzKCkge1xuICAgIGNvbnN0IGRhdGFiYXNlVHlwZSA9IHRoaXMuZ2V0RHJpdmVyKCkuZ2V0VHlwZSgpXG4gICAgY29uc3Qgc3FscyA9IFtdXG4gICAgY29uc3Qge3RhYmxlRGF0YX0gPSB0aGlzXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucygpXG5cbiAgICBsZXQgc3FsID0gYEFMVEVSIFRBQkxFICR7b3B0aW9ucy5xdW90ZVRhYmxlTmFtZSh0YWJsZURhdGEuZ2V0TmFtZSgpKX0gYFxuICAgIGxldCBhY3Rpb25Db3VudCA9IDBcblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRhYmxlRGF0YS5nZXRDb2x1bW5zKCkpIHtcbiAgICAgIGlmIChhY3Rpb25Db3VudCA+IDApIHNxbCArPSBcIiwgXCJcblxuICAgICAgaWYgKGNvbHVtbi5pc05ld0NvbHVtbigpKSB7XG4gICAgICAgIHNxbCArPSBkYXRhYmFzZVR5cGUgPT0gXCJtc3NxbFwiID8gXCJBREQgXCIgOiBcIkFERCBDT0xVTU4gXCJcbiAgICAgICAgc3FsICs9IGNvbHVtbi5nZXRTUUwoe2RyaXZlcjogdGhpcy5nZXREcml2ZXIoKSwgZm9yQWx0ZXJUYWJsZTogZmFsc2V9KVxuICAgICAgfSBlbHNlIGlmIChjb2x1bW4uZ2V0TmV3TmFtZSgpKSB7XG4gICAgICAgIGNvbnN0IG5ld0NvbHVtbk5hbWUgPSBjb2x1bW4uZ2V0TmV3TmFtZSgpXG5cbiAgICAgICAgaWYgKCFuZXdDb2x1bW5OYW1lKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5ldyBjb2x1bW4gbmFtZSBmb3IgJHtjb2x1bW4uZ2V0TmFtZSgpfWApXG5cbiAgICAgICAgc3FsICs9IGBSRU5BTUUgQ09MVU1OICR7b3B0aW9ucy5xdW90ZUNvbHVtbk5hbWUoY29sdW1uLmdldE5hbWUoKSl9IFRPICR7b3B0aW9ucy5xdW90ZUNvbHVtbk5hbWUobmV3Q29sdW1uTmFtZSl9YFxuICAgICAgfSBlbHNlIGlmIChjb2x1bW4uZ2V0RHJvcENvbHVtbigpKSB7XG4gICAgICAgIHNxbCArPSBgRFJPUCBDT0xVTU4gJHtvcHRpb25zLnF1b3RlQ29sdW1uTmFtZShjb2x1bW4uZ2V0TmFtZSgpKX1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZGF0YWJhc2VUeXBlID09IFwibXNzcWxcIiB8fCBkYXRhYmFzZVR5cGUgPT0gXCJwZ3NxbFwiKSB7XG4gICAgICAgICAgc3FsICs9IFwiQUxURVIgQ09MVU1OIFwiXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3FsICs9IFwiTU9ESUZZIFwiXG4gICAgICAgIH1cblxuICAgICAgICBzcWwgKz0gY29sdW1uLmdldFNRTCh7ZHJpdmVyOiB0aGlzLmdldERyaXZlcigpLCBmb3JBbHRlclRhYmxlOiB0cnVlfSlcbiAgICAgIH1cblxuXG4gICAgICBhY3Rpb25Db3VudCsrXG4gICAgfVxuXG4gICAgLy8gU1FMaXRlJ3MgQUxURVIgVEFCTEUgZG9lcyBub3Qgc3VwcG9ydCBhZGRpbmcgY29uc3RyYWludHM7IHRoZSBTUUxpdGUgZHJpdmVyIG92ZXJyaWRlc1xuICAgIC8vIGFsdGVyVGFibGVTUUxzIGVudGlyZWx5ICh2aWEgVGFibGVSZWJ1aWxkZXIpIHNvIHRoaXMgYmFzZSBwYXRoIGlzIG5ldmVyIGludm9rZWQgdGhlcmUuXG4gICAgZm9yIChjb25zdCBmb3JlaWduS2V5IG9mIHRhYmxlRGF0YS5nZXRGb3JlaWduS2V5cygpKSB7XG4gICAgICBpZiAoIWZvcmVpZ25LZXkuZ2V0SXNOZXdGb3JlaWduS2V5KCkgJiYgIWZvcmVpZ25LZXkuZ2V0RHJvcEZvcmVpZ25LZXkoKSkgY29udGludWVcblxuICAgICAgaWYgKGFjdGlvbkNvdW50ID4gMCkgc3FsICs9IFwiLCBcIlxuXG4gICAgICBpZiAoZm9yZWlnbktleS5nZXREcm9wRm9yZWlnbktleSgpKSB7XG4gICAgICAgIHNxbCArPSB0aGlzLmdldERyb3BGb3JlaWduS2V5U1FMKGZvcmVpZ25LZXkpXG4gICAgICAgIGFjdGlvbkNvdW50KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgc3FsICs9IFwiQUREXCJcblxuICAgICAgaWYgKGZvcmVpZ25LZXkuZ2V0TmFtZSgpKSB7XG4gICAgICAgIHNxbCArPSBgIENPTlNUUkFJTlQgJHtvcHRpb25zLnF1b3RlSW5kZXhOYW1lKGZvcmVpZ25LZXkuZ2V0TmFtZSgpKX1gXG4gICAgICB9XG5cbiAgICAgIHNxbCArPSBgIEZPUkVJR04gS0VZICgke29wdGlvbnMucXVvdGVDb2x1bW5OYW1lKGZvcmVpZ25LZXkuZ2V0Q29sdW1uTmFtZSgpKX0pYFxuICAgICAgc3FsICs9IGAgUkVGRVJFTkNFUyAke29wdGlvbnMucXVvdGVUYWJsZU5hbWUoZm9yZWlnbktleS5nZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkpfSAoJHtvcHRpb25zLnF1b3RlQ29sdW1uTmFtZShmb3JlaWduS2V5LmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpfSlgXG5cbiAgICAgIGFjdGlvbkNvdW50KytcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uQ291bnQgPiAwKSB7XG4gICAgICBzcWxzLnB1c2goc3FsKVxuICAgIH1cblxuICAgIGlmIChkYXRhYmFzZVR5cGUgPT0gXCJwZ3NxbFwiKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0YWJsZURhdGEuZ2V0Q29sdW1ucygpKSB7XG4gICAgICBpZiAoIWNvbHVtbi5pc05ld0NvbHVtbigpIHx8IGNvbHVtbi5nZXREcm9wQ29sdW1uKCkpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IG5vdGVzID0gY29sdW1uLmdldE5vdGVzRm9yRGF0YWJhc2UoZGF0YWJhc2VUeXBlKVxuICAgICAgY29uc3QgYWN0dWFsTmFtZSA9IGNvbHVtbi5nZXRBY3R1YWxOYW1lKClcblxuICAgICAgaWYgKCFub3RlcyB8fCAhYWN0dWFsTmFtZSkgY29udGludWVcblxuICAgICAgc3Fscy5wdXNoKFxuICAgICAgICBgQ09NTUVOVCBPTiBDT0xVTU4gJHtvcHRpb25zLnF1b3RlVGFibGVOYW1lKHRhYmxlRGF0YS5nZXROYW1lKCkpfS4ke29wdGlvbnMucXVvdGVDb2x1bW5OYW1lKGFjdHVhbE5hbWUpfSBJUyAke29wdGlvbnMucXVvdGUobm90ZXMpfWBcbiAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3Fsc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGRyb3AgZm9yZWlnbiBrZXkgc3FsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3RhYmxlLWRhdGEvdGFibGUtZm9yZWlnbi1rZXkuanNcIikuZGVmYXVsdH0gZm9yZWlnbktleSAtIEZvcmVpZ24ga2V5IHRvIGRyb3AuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU1FMIGZyYWdtZW50IHRoYXQgcmVtb3ZlcyB0aGUgZm9yZWlnbiBrZXkuXG4gICAqL1xuICBnZXREcm9wRm9yZWlnbktleVNRTChmb3JlaWduS2V5KSB7XG4gICAgY29uc3QgbmFtZSA9IGZvcmVpZ25LZXkuZ2V0TmFtZSgpXG5cbiAgICBpZiAoIW5hbWUpIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlbW92ZSB1bm5hbWVkIGZvcmVpZ24ga2V5IG9uICR7Zm9yZWlnbktleS5nZXRUYWJsZU5hbWUoKX0uJHtmb3JlaWduS2V5LmdldENvbHVtbk5hbWUoKX1gKVxuXG4gICAgcmV0dXJuIGBEUk9QIENPTlNUUkFJTlQgJHt0aGlzLmdldE9wdGlvbnMoKS5xdW90ZUluZGV4TmFtZShuYW1lKX1gXG4gIH1cbn1cbiJdfQ==
@@ -14,6 +14,31 @@ export default function normalizeRecordAttachmentInput(input: unknown, args?: {
14
14
  defaultFilename?: string | undefined;
15
15
  environmentHandler?: import("../../../environment-handlers/base.js").default | undefined;
16
16
  }): Promise<NormalizedAttachmentInput>;
17
+ /**
18
+ * AttachmentPathSource type.
19
+ */
20
+ export type AttachmentPathSource = {
21
+ /**
22
+ * - Opened file snapshot size.
23
+ */
24
+ byteSize: number;
25
+ /**
26
+ * - Validated source path for metadata only.
27
+ */
28
+ filePath: string;
29
+ /**
30
+ * - Creates a bounded snapshot stream.
31
+ */
32
+ createReadStream: () => Promise<import("node:stream").Readable>;
33
+ /**
34
+ * - Reads snapshot bytes for compatibility callers.
35
+ */
36
+ readBuffer: () => Promise<Buffer>;
37
+ /**
38
+ * - Closes the owned source.
39
+ */
40
+ close: () => Promise<void>;
41
+ };
17
42
  /**
18
43
  * NormalizedAttachmentInput type.
19
44
  */
@@ -23,13 +48,13 @@ export type NormalizedAttachmentInput = {
23
48
  */
24
49
  byteSize: number;
25
50
  /**
26
- * - Raw content bytes.
51
+ * - Raw in-memory content bytes.
27
52
  */
28
- contentBuffer: Buffer;
53
+ contentBuffer: Buffer | null;
29
54
  /**
30
- * - Base64 encoded content.
55
+ * - Base64 encoded in-memory content.
31
56
  */
32
- contentBase64: string;
57
+ contentBase64: string | null;
33
58
  /**
34
59
  * - Content type.
35
60
  */
@@ -38,5 +63,9 @@ export type NormalizedAttachmentInput = {
38
63
  * - Filename.
39
64
  */
40
65
  filename: string;
66
+ /**
67
+ * - Environment-owned opened path source.
68
+ */
69
+ pathSource: AttachmentPathSource | null;
41
70
  };
42
71
  //# sourceMappingURL=normalize-input.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"normalize-input.d.ts","sourceRoot":"","sources":["../../../../../src/database/record/attachments/normalize-input.js"],"names":[],"mappings":"AA2GA;;;;;;;;;GASG;AACH,8DARW,OAAC,SAET;IAAuB,cAAc;IACb,mBAAmB;IACrB,eAAe;IACkC,kBAAkB;CACzF,GAAU,OAAO,CAAC,yBAAyB,CAAC,CA8E9C;;;;;;;;cA1La,MAAM;;;;mBACN,MAAM;;;;mBACN,MAAM;;;;iBACN,MAAM,GAAG,IAAI;;;;cACb,MAAM"}
1
+ {"version":3,"file":"normalize-input.d.ts","sourceRoot":"","sources":["../../../../../src/database/record/attachments/normalize-input.js"],"names":[],"mappings":"AAqHA;;;;;;;;;GASG;AACH,8DARW,OAAC,SAET;IAAuB,cAAc;IACb,mBAAmB;IACrB,eAAe;IACkC,kBAAkB;CACzF,GAAU,OAAO,CAAC,yBAAyB,CAAC,CAgG9C;;;;;;;;cAtNa,MAAM;;;;cACN,MAAM;;;;sBACN,MAAM,OAAO,CAAC,OAAO,aAAa,EAAE,QAAQ,CAAC;;;;gBAC7C,MAAM,OAAO,CAAC,MAAM,CAAC;;;;WACrB,MAAM,OAAO,CAAC,IAAI,CAAC;;;;;;;;;cAKnB,MAAM;;;;mBACN,MAAM,GAAG,IAAI;;;;mBACb,MAAM,GAAG,IAAI;;;;iBACb,MAAM,GAAG,IAAI;;;;cACb,MAAM;;;;gBACN,oBAAoB,GAAG,IAAI"}