@sochdb/sochdb 0.4.0 → 0.4.1

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 (69) hide show
  1. package/README.md +220 -33
  2. package/_bin/aarch64-apple-darwin/libsochdb_storage.dylib +0 -0
  3. package/_bin/aarch64-apple-darwin/sochdb-bulk +0 -0
  4. package/_bin/aarch64-apple-darwin/sochdb-grpc-server +0 -0
  5. package/_bin/aarch64-apple-darwin/sochdb-server +0 -0
  6. package/_bin/x86_64-pc-windows-msvc/sochdb-bulk.exe +0 -0
  7. package/_bin/x86_64-pc-windows-msvc/sochdb-grpc-server.exe +0 -0
  8. package/_bin/x86_64-pc-windows-msvc/sochdb_storage.dll +0 -0
  9. package/_bin/x86_64-unknown-linux-gnu/libsochdb_storage.so +0 -0
  10. package/_bin/x86_64-unknown-linux-gnu/sochdb-bulk +0 -0
  11. package/_bin/x86_64-unknown-linux-gnu/sochdb-grpc-server +0 -0
  12. package/_bin/x86_64-unknown-linux-gnu/sochdb-server +0 -0
  13. package/bin/sochdb-bulk.js +1 -1
  14. package/bin/sochdb-grpc-server.js +1 -1
  15. package/bin/sochdb-server.js +1 -1
  16. package/dist/cjs/context-builder.js +280 -0
  17. package/dist/cjs/database.js +2 -2
  18. package/dist/cjs/embedded/database.js +2 -2
  19. package/dist/cjs/errors.js +99 -7
  20. package/dist/cjs/index.js +40 -3
  21. package/dist/cjs/ipc-client.js +2 -2
  22. package/dist/cjs/memory/consolidation.js +202 -0
  23. package/dist/cjs/memory/extraction.js +181 -0
  24. package/dist/cjs/memory/index.js +26 -0
  25. package/dist/cjs/memory/retrieval.js +232 -0
  26. package/dist/cjs/memory/types.js +69 -0
  27. package/dist/cjs/namespace.js +255 -0
  28. package/dist/cjs/queue.js +289 -0
  29. package/dist/cjs/semantic-cache.js +220 -0
  30. package/dist/esm/context-builder.js +280 -0
  31. package/dist/esm/database.js +2 -2
  32. package/dist/esm/embedded/database.js +2 -2
  33. package/dist/esm/errors.js +107 -7
  34. package/dist/esm/index.js +40 -3
  35. package/dist/esm/ipc-client.js +2 -2
  36. package/dist/esm/memory/consolidation.js +206 -0
  37. package/dist/esm/memory/extraction.js +185 -0
  38. package/dist/esm/memory/index.js +26 -0
  39. package/dist/esm/memory/retrieval.js +243 -0
  40. package/dist/esm/memory/types.js +72 -0
  41. package/dist/esm/namespace.js +262 -0
  42. package/dist/esm/queue.js +291 -0
  43. package/dist/esm/semantic-cache.js +223 -0
  44. package/dist/types/context-builder.d.ts +97 -0
  45. package/dist/types/context-builder.d.ts.map +1 -0
  46. package/dist/types/database.d.ts +1 -1
  47. package/dist/types/embedded/database.d.ts +1 -1
  48. package/dist/types/errors.d.ts +57 -1
  49. package/dist/types/errors.d.ts.map +1 -1
  50. package/dist/types/index.d.ts +12 -2
  51. package/dist/types/index.d.ts.map +1 -1
  52. package/dist/types/ipc-client.d.ts +1 -1
  53. package/dist/types/memory/consolidation.d.ts +66 -0
  54. package/dist/types/memory/consolidation.d.ts.map +1 -0
  55. package/dist/types/memory/extraction.d.ts +82 -0
  56. package/dist/types/memory/extraction.d.ts.map +1 -0
  57. package/dist/types/memory/index.d.ts +10 -0
  58. package/dist/types/memory/index.d.ts.map +1 -0
  59. package/dist/types/memory/retrieval.d.ts +46 -0
  60. package/dist/types/memory/retrieval.d.ts.map +1 -0
  61. package/dist/types/memory/types.d.ts +147 -0
  62. package/dist/types/memory/types.d.ts.map +1 -0
  63. package/dist/types/namespace.d.ts +129 -0
  64. package/dist/types/namespace.d.ts.map +1 -0
  65. package/dist/types/queue.d.ts +120 -0
  66. package/dist/types/queue.d.ts.map +1 -0
  67. package/dist/types/semantic-cache.d.ts +84 -0
  68. package/dist/types/semantic-cache.d.ts.map +1 -0
  69. package/package.json +1 -1
@@ -167,7 +167,7 @@ exports.Transaction = Transaction;
167
167
  *
168
168
  * @example
169
169
  * ```typescript
170
- * import { Database } from '@sushanth/sochdb';
170
+ * import { Database } from '@sochdb/sochdb';
171
171
  *
172
172
  * // Open a database
173
173
  * const db = await Database.open('./my_database');
@@ -928,4 +928,4 @@ class Database {
928
928
  }
929
929
  }
930
930
  exports.Database = Database;
931
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7O0dBT0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDBEQUEwRDtBQUMxRCxFQUFFO0FBQ0Ysa0VBQWtFO0FBQ2xFLG1FQUFtRTtBQUNuRSwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLGlEQUFpRDtBQUVqRCx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLHFDQUEyRDtBQUMzRCw2Q0FBeUM7QUFDekMsbUNBQWdDO0FBQ2hDLHFEQUEyRTtBQW1DM0U7O0dBRUc7QUFDSCxNQUFhLFdBQVc7SUFDZCxHQUFHLENBQVc7SUFDZCxNQUFNLEdBQWtCLElBQUksQ0FBQztJQUM3QixVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQ25CLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFekIsWUFBWSxFQUFZO1FBQ3RCLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsS0FBSztRQUNULElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQW9CO1FBQzVCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBb0IsRUFBRSxLQUFzQjtRQUNwRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFvQjtRQUMvQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUF1QixFQUFFLEdBQXFCO1FBQ3hELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixxQ0FBcUM7UUFDckMsa0VBQWtFO1FBQ2xFLElBQUksS0FBSyxFQUFFLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBZTtRQUMzQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQWUsRUFBRSxLQUFzQjtRQUNuRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxNQUFNO1FBQ1YsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEQscUVBQXFFO1lBQ3JFLGlFQUFpRTtZQUNqRSxnRUFBZ0U7WUFDaEUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzlCLENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsS0FBSztRQUNULElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDN0MsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLHlCQUFnQixDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSx5QkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQzVELENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUE5R0Qsa0NBOEdDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHO0FBQ0gsTUFBYSxRQUFRO0lBQ1gsT0FBTyxHQUFxQixJQUFJLENBQUM7SUFDakMsT0FBTyxDQUFpQjtJQUN4QixPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLHNCQUFzQixHQUFHLEtBQUssQ0FBQztJQUV2QyxZQUFvQixNQUFzQjtRQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsZUFBZSxFQUFFLElBQUk7WUFDckIsVUFBVSxFQUFFLElBQUk7WUFDaEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsaUJBQWlCLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJO1lBQ25DLFFBQVEsRUFBRSxJQUFJLEVBQUcsMkJBQTJCO1lBQzVDLEdBQUcsTUFBTTtTQUNWLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXdCRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQXFDO1FBQ3JELE1BQU0sTUFBTSxHQUNWLE9BQU8sWUFBWSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUUzRSxtQ0FBbUM7UUFDbkMsSUFBSSxNQUFNLENBQUMsZUFBZSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNqRCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sRUFBRSxHQUFHLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWhDLHNEQUFzRDtRQUN0RCxJQUFJLFVBQWtCLENBQUM7UUFDdkIsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNsQyw0Q0FBNEM7WUFDNUMsVUFBVSxHQUFHLE1BQU0sSUFBQSxvQ0FBbUIsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEQsRUFBRSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztRQUNuQyxDQUFDO2FBQU0sQ0FBQztZQUNOLG9DQUFvQztZQUNwQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFFRCxFQUFFLENBQUMsT0FBTyxHQUFHLE1BQU0sc0JBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFakQsMkRBQTJEO1FBQzNELElBQUksQ0FBQztZQUNILE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDN0QsTUFBTSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxnREFBZ0Q7UUFDbEQsQ0FBQztRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFvQjtRQUM1QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsTUFBTSxNQUFNLEdBQUcsT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDaEUsT0FBTyxJQUFJLENBQUMsT0FBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQW9CLEVBQUUsS0FBc0I7UUFDcEQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLE1BQU0sTUFBTSxHQUFHLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ2hFLE1BQU0sUUFBUSxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLE9BQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFvQjtRQUMvQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsTUFBTSxNQUFNLEdBQUcsT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDaEUsT0FBTyxJQUFJLENBQUMsT0FBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQWU7UUFDM0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE9BQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFlLEVBQUUsS0FBc0I7UUFDbkQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLE1BQU0sUUFBUSxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLE9BQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsS0FBSyxDQUFDLFVBQWtCO1FBQ3RCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixPQUFPLElBQUksYUFBSyxDQUFDLElBQUksQ0FBQyxPQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFjO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILEtBQUssQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUF1QixFQUFFLEdBQXFCO1FBQ2pFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixNQUFNLFNBQVMsR0FBRyxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUM1RSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRXBGLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDL0QsS0FBSyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ3JDLHFDQUFxQztZQUNyQyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDL0MsTUFBTTtZQUNSLENBQUM7WUFDRCxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FBSSxFQUFvQztRQUMzRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0IsTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsV0FBVztRQUNmLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxVQUFVO1FBQ2QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE9BQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsS0FBSztRQUtULElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpQ0c7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQVc7UUFDdkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRW5CLDBCQUEwQjtRQUMxQixNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUV4RCxpREFBaUQ7UUFDakQsTUFBTSxTQUFTLEdBQUc7WUFDaEIsR0FBRyxFQUFFLENBQUMsR0FBb0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDNUMsR0FBRyxFQUFFLENBQUMsR0FBb0IsRUFBRSxLQUFzQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUM7WUFDM0UsTUFBTSxFQUFFLENBQUMsR0FBb0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7WUFDbEQsSUFBSSxFQUFFLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUM1QyxDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsSUFBSSxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUMsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsK0JBQStCO0lBQy9CLDRFQUE0RTtJQUU1RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FvQkc7SUFDSCxNQUFNLENBQUMsTUFBTSxDQUNYLFNBQWlCLEVBQ2pCLE9BQW1DLEVBQ25DLE1BQWlCO1FBRWpCLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxPQUFPLEdBQUcsU0FBUyxRQUFRLENBQUM7UUFDOUIsQ0FBQztRQUVELHNEQUFzRDtRQUN0RCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVwRCxpREFBaUQ7UUFDakQsTUFBTSxNQUFNLEdBQUcsR0FBRyxTQUFTLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFFMUUsc0NBQXNDO1FBQ3RDLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBTSxFQUFVLEVBQUU7WUFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMzRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDbEIsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDO1FBRUYsOENBQThDO1FBQzlDLE1BQU0sSUFBSSxHQUFHLE9BQU87YUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN6RCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFYixPQUFPLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bc0JHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FDWCxTQUFpQixFQUNqQixPQUFtQyxFQUNuQyxNQUFpQixFQUNqQixVQUFtQixJQUFJO1FBRXZCLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELDZCQUE2QjtRQUM3QixNQUFNLGVBQWUsR0FBRyxNQUFNO1lBQzVCLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNoQixNQUFNLFFBQVEsR0FBd0IsRUFBRSxDQUFDO2dCQUN6QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUN2QixRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixDQUFDO2dCQUNELE9BQU8sUUFBUSxDQUFDO1lBQ2xCLENBQUMsQ0FBQztZQUNGLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFFWixNQUFNLE1BQU0sR0FBRztZQUNiLEtBQUssRUFBRSxTQUFTO1lBQ2hCLEtBQUssRUFBRSxlQUFlLENBQUMsTUFBTTtZQUM3QixPQUFPLEVBQUUsZUFBZTtTQUN6QixDQUFDO1FBRUYsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQWU7UUFLN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLFNBQVMsQ0FBQztRQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNuQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRWpFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsMkJBQTJCO0lBQzNCLDRFQUE0RTtJQUU1RTs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FDWCxTQUFpQixFQUNqQixNQUFjLEVBQ2QsUUFBZ0IsRUFDaEIsVUFBbUM7UUFFbkMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRW5CLE1BQU0sR0FBRyxHQUFHLFVBQVUsU0FBUyxVQUFVLE1BQU0sRUFBRSxDQUFDO1FBQ2xELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDM0IsRUFBRSxFQUFFLE1BQU07WUFDVixTQUFTLEVBQUUsUUFBUTtZQUNuQixVQUFVLEVBQUUsVUFBVSxJQUFJLEVBQUU7U0FDN0IsQ0FBQyxDQUFDO1FBRUgsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQ1gsU0FBaUIsRUFDakIsTUFBYyxFQUNkLFFBQWdCLEVBQ2hCLElBQVksRUFDWixVQUFtQztRQUVuQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFbkIsTUFBTSxHQUFHLEdBQUcsVUFBVSxTQUFTLFVBQVUsTUFBTSxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN0RSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQzNCLE9BQU8sRUFBRSxNQUFNO1lBQ2YsU0FBUyxFQUFFLFFBQVE7WUFDbkIsS0FBSyxFQUFFLElBQUk7WUFDWCxVQUFVLEVBQUUsVUFBVSxJQUFJLEVBQUU7U0FDN0IsQ0FBQyxDQUFDO1FBRUgsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQ1osU0FBaUIsRUFDakIsU0FBaUIsRUFDakIsV0FBbUIsRUFBRSxFQUNyQixRQUF1QixLQUFLO1FBRTVCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVuQixNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ2xDLE1BQU0sS0FBSyxHQUFVLEVBQUUsQ0FBQztRQUN4QixNQUFNLEtBQUssR0FBVSxFQUFFLENBQUM7UUFDeEIsTUFBTSxRQUFRLEdBQTRCLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUzRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0IsTUFBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsR0FBRyxLQUFLLEtBQUssS0FBSztnQkFDMUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUc7Z0JBQ25CLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFHLENBQUM7WUFFcEIsSUFBSSxLQUFLLEdBQUcsUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDakQsU0FBUztZQUNYLENBQUM7WUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXpCLGdCQUFnQjtZQUNoQixNQUFNLE9BQU8sR0FBRyxVQUFVLFNBQVMsVUFBVSxXQUFXLEVBQUUsQ0FBQztZQUMzRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3RELElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsQ0FBQztZQUVELHFCQUFxQjtZQUNyQixNQUFNLFVBQVUsR0FBRyxVQUFVLFNBQVMsVUFBVSxXQUFXLEdBQUcsQ0FBQztZQUMvRCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDaEQsS0FBSyxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQzFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRWpCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUM3QixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLDRCQUE0QjtJQUM1Qiw0RUFBNEU7SUFFNUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkc7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUNaLFNBQWlCLEVBQ2pCLEdBQVcsRUFDWCxLQUFhLEVBQ2IsU0FBbUIsRUFDbkIsYUFBcUIsQ0FBQztRQUV0QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFbkIsMkJBQTJCO1FBQzNCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUQsTUFBTSxRQUFRLEdBQUcsVUFBVSxTQUFTLElBQUksT0FBTyxFQUFFLENBQUM7UUFFbEQsTUFBTSxTQUFTLEdBQUcsVUFBVSxHQUFHLENBQUM7WUFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLFVBQVU7WUFDNUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVOLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDaEMsR0FBRztZQUNILEtBQUs7WUFDTCxTQUFTO1lBQ1QsVUFBVSxFQUFFLFNBQVM7U0FDdEIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW1CRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQ1osU0FBaUIsRUFDakIsY0FBd0IsRUFDeEIsWUFBb0IsSUFBSTtRQUV4QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFbkIsTUFBTSxNQUFNLEdBQUcsVUFBVSxTQUFTLEdBQUcsQ0FBQztRQUN0QyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFeEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDMUMsSUFBSSxTQUFTLEdBQWlELElBQUksQ0FBQztRQUVuRSxLQUFLLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNoQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBRTNDLGVBQWU7WUFDZixJQUFJLEtBQUssQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ25ELFNBQVM7WUFDWCxDQUFDO1lBRUQsNEJBQTRCO1lBQzVCLElBQUksS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3hFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMzRSxJQUFJLFVBQVUsSUFBSSxTQUFTLEVBQUUsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLFNBQVMsSUFBSSxVQUFVLEdBQUcsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO3dCQUNwRCxTQUFTLEdBQUcsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDakQsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLFNBQVMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDO0lBQ2xDLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxDQUFXLEVBQUUsQ0FBVztRQUNoRCxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbEMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUNELEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sS0FBSyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLG1DQUFtQztJQUNuQyw0RUFBNEU7SUFFNUU7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFZO1FBQzNCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVuQixNQUFNLE9BQU8sR0FBRyxTQUFTLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDN0YsTUFBTSxNQUFNLEdBQUcsUUFBUSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzNGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxlQUFlO1FBRTlDLGNBQWM7UUFDZCxNQUFNLFFBQVEsR0FBRyxXQUFXLE9BQU8sRUFBRSxDQUFDO1FBQ3RDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDaEMsUUFBUSxFQUFFLE9BQU87WUFDakIsSUFBSTtZQUNKLFFBQVEsRUFBRSxHQUFHO1lBQ2IsWUFBWSxFQUFFLE1BQU07U0FDckIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBRS9ELGtCQUFrQjtRQUNsQixNQUFNLE9BQU8sR0FBRyxXQUFXLE9BQU8sVUFBVSxNQUFNLEVBQUUsQ0FBQztRQUNyRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQy9CLE9BQU8sRUFBRSxNQUFNO1lBQ2YsSUFBSTtZQUNKLFFBQVEsRUFBRSxHQUFHO1lBQ2IsY0FBYyxFQUFFLElBQUk7WUFDcEIsTUFBTSxFQUFFLFFBQVE7U0FDakIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRTdELE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUNiLE9BQWUsRUFDZixZQUFvQixFQUNwQixJQUFZO1FBRVosSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRW5CLE1BQU0sTUFBTSxHQUFHLFFBQVEsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUMzRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBRTlCLE1BQU0sT0FBTyxHQUFHLFdBQVcsT0FBTyxVQUFVLE1BQU0sRUFBRSxDQUFDO1FBQ3JELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDL0IsT0FBTyxFQUFFLE1BQU07WUFDZixJQUFJO1lBQ0osUUFBUSxFQUFFLEdBQUc7WUFDYixjQUFjLEVBQUUsWUFBWTtZQUM1QixNQUFNLEVBQUUsUUFBUTtTQUNqQixDQUFDLENBQUM7UUFDSCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFN0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUNYLE9BQWUsRUFDZixNQUFjLEVBQ2QsU0FBbUMsSUFBSTtRQUV2QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFbkIsTUFBTSxPQUFPLEdBQUcsV0FBVyxPQUFPLFVBQVUsTUFBTSxFQUFFLENBQUM7UUFDckQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUV0RCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksc0JBQWEsQ0FBQyxtQkFBbUIsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUM3QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQzlCLE1BQU0sUUFBUSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRXJDLE1BQU0sV0FBVyxHQUFHO1lBQ2xCLEdBQUcsSUFBSTtZQUNQLE1BQU07WUFDTixNQUFNLEVBQUUsR0FBRztZQUNYLFdBQVcsRUFBRSxRQUFRO1NBQ3RCLENBQUM7UUFDRixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRS9FLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsS0FBSztRQUNULElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQ3pCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUN0QixDQUFDO1FBQ0Qsd0NBQXdDO1FBQ3hDLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFBLG1DQUFrQixFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQztJQUVELDhDQUE4QztJQUN0QyxLQUFLLENBQUMsaUJBQWlCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLE9BQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFTyxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBYTtRQUM1QyxPQUFPLElBQUksQ0FBQyxPQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVPLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFhO1FBQzNDLE9BQU8sSUFBSSxDQUFDLE9BQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU8sV0FBVztRQUNqQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksc0JBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxzQkFBYSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXgyQkQsNEJBdzJCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU29jaERCIEVtYmVkZGVkIERhdGFiYXNlXG4gKlxuICogRGlyZWN0IGRhdGFiYXNlIGFjY2VzcyB2aWEgSVBDIHRvIHRoZSBTb2NoREIgc2VydmVyLlxuICogVGhpcyBwcm92aWRlcyB0aGUgc2FtZSBBUEkgYXMgdGhlIFB5dGhvbiBTREsncyBEYXRhYmFzZSBjbGFzcy5cbiAqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuXG4vLyBDb3B5cmlnaHQgMjAyNSBTdXNoYW50aCAoaHR0cHM6Ly9naXRodWIuY29tL3N1c2hhbnRocHkpXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IERhdGFiYXNlRXJyb3IsIFRyYW5zYWN0aW9uRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBJcGNDbGllbnQgfSBmcm9tICcuL2lwYy1jbGllbnQnO1xuaW1wb3J0IHsgUXVlcnkgfSBmcm9tICcuL3F1ZXJ5JztcbmltcG9ydCB7IHN0YXJ0RW1iZWRkZWRTZXJ2ZXIsIHN0b3BFbWJlZGRlZFNlcnZlciB9IGZyb20gJy4vc2VydmVyLW1hbmFnZXInO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGFiYXNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlQ29uZmlnIHtcbiAgLyoqIFBhdGggdG8gdGhlIGRhdGFiYXNlIGRpcmVjdG9yeSAqL1xuICBwYXRoOiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRvIGNyZWF0ZSB0aGUgZGF0YWJhc2UgaWYgaXQgZG9lc24ndCBleGlzdCAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgY3JlYXRlSWZNaXNzaW5nPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBXQUwgKFdyaXRlLUFoZWFkIExvZ2dpbmcpIGZvciBkdXJhYmlsaXR5IChkZWZhdWx0OiB0cnVlKSAqL1xuICB3YWxFbmFibGVkPzogYm9vbGVhbjtcbiAgLyoqIFN5bmMgbW9kZTogJ2Z1bGwnIHwgJ25vcm1hbCcgfCAnb2ZmJyAoZGVmYXVsdDogJ25vcm1hbCcpICovXG4gIHN5bmNNb2RlPzogJ2Z1bGwnIHwgJ25vcm1hbCcgfCAnb2ZmJztcbiAgLyoqIE1heGltdW0gc2l6ZSBvZiB0aGUgbWVtdGFibGUgYmVmb3JlIGZsdXNoaW5nIChkZWZhdWx0OiA2NE1CKSAqL1xuICBtZW10YWJsZVNpemVCeXRlcz86IG51bWJlcjtcbiAgLyoqIFxuICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgc3RhcnQgYW4gZW1iZWRkZWQgc2VydmVyIChkZWZhdWx0OiB0cnVlKVxuICAgKiBTZXQgdG8gZmFsc2UgaWYgY29ubmVjdGluZyB0byBhbiBleGlzdGluZyBleHRlcm5hbCBzZXJ2ZXJcbiAgICovXG4gIGVtYmVkZGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYSBTUUwgcXVlcnkgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNRTFF1ZXJ5UmVzdWx0IHtcbiAgLyoqIFJlc3VsdCByb3dzICovXG4gIHJvd3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+O1xuICAvKiogQ29sdW1uIG5hbWVzICovXG4gIGNvbHVtbnM6IHN0cmluZ1tdO1xuICAvKiogTnVtYmVyIG9mIHJvd3MgYWZmZWN0ZWQgKGZvciBJTlNFUlQvVVBEQVRFL0RFTEVURSkgKi9cbiAgcm93c0FmZmVjdGVkOiBudW1iZXI7XG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gaGFuZGxlIGZvciBhdG9taWMgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIHtcbiAgcHJpdmF0ZSBfZGI6IERhdGFiYXNlO1xuICBwcml2YXRlIF90eG5JZDogYmlnaW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2NvbW1pdHRlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9hYm9ydGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoZGI6IERhdGFiYXNlKSB7XG4gICAgdGhpcy5fZGIgPSBkYjtcbiAgfVxuXG4gIC8qKlxuICAgKiBCZWdpbiB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgYXN5bmMgYmVnaW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fdHhuSWQgPSBhd2FpdCB0aGlzLl9kYlsnX2JlZ2luVHJhbnNhY3Rpb24nXSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHZhbHVlIGJ5IGtleSB3aXRoaW4gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIGdldChrZXk6IEJ1ZmZlciB8IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgIHRoaXMuX2Vuc3VyZUFjdGl2ZSgpO1xuICAgIHJldHVybiB0aGlzLl9kYi5nZXQoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgYSBrZXktdmFsdWUgcGFpciB3aXRoaW4gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIHB1dChrZXk6IEJ1ZmZlciB8IHN0cmluZywgdmFsdWU6IEJ1ZmZlciB8IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2Vuc3VyZUFjdGl2ZSgpO1xuICAgIHJldHVybiB0aGlzLl9kYi5wdXQoa2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEga2V5IHdpdGhpbiB0aGlzIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGtleTogQnVmZmVyIHwgc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fZW5zdXJlQWN0aXZlKCk7XG4gICAgcmV0dXJuIHRoaXMuX2RiLmRlbGV0ZShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYW4ga2V5cyB3aXRoIGEgcHJlZml4IHdpdGhpbiB0aGlzIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gcHJlZml4IC0gVGhlIHByZWZpeCB0byBzY2FuIGZvclxuICAgKiBAcGFyYW0gZW5kIC0gT3B0aW9uYWwgZW5kIGJvdW5kYXJ5IChleGNsdXNpdmUpXG4gICAqL1xuICBhc3luYyAqc2NhbihwcmVmaXg6IHN0cmluZyB8IEJ1ZmZlciwgZW5kPzogc3RyaW5nIHwgQnVmZmVyKTogQXN5bmNHZW5lcmF0b3I8W0J1ZmZlciwgQnVmZmVyXT4ge1xuICAgIHRoaXMuX2Vuc3VyZUFjdGl2ZSgpO1xuICAgIC8vIERlbGVnYXRlIHRvIGRhdGFiYXNlJ3Mgc2NhbiBtZXRob2RcbiAgICAvLyBUcmFuc2FjdGlvbmFsIGlzb2xhdGlvbiBpcyBtYWludGFpbmVkIGJ5IHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2VcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGVudHJ5IG9mIHRoaXMuX2RiLnNjYW5HZW5lcmF0b3IocHJlZml4LCBlbmQpKSB7XG4gICAgICB5aWVsZCBlbnRyeTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdmFsdWUgYnkgcGF0aCB3aXRoaW4gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIGdldFBhdGgocGF0aFN0cjogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgdGhpcy5fZW5zdXJlQWN0aXZlKCk7XG4gICAgcmV0dXJuIHRoaXMuX2RiLmdldFBhdGgocGF0aFN0cik7XG4gIH1cblxuICAvKipcbiAgICogUHV0IGEgdmFsdWUgYXQgYSBwYXRoIHdpdGhpbiB0aGlzIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgcHV0UGF0aChwYXRoU3RyOiBzdHJpbmcsIHZhbHVlOiBCdWZmZXIgfCBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9lbnN1cmVBY3RpdmUoKTtcbiAgICByZXR1cm4gdGhpcy5fZGIucHV0UGF0aChwYXRoU3RyLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0IHRoZSB0cmFuc2FjdGlvbi5cbiAgICogXG4gICAqIEFmdGVyIGNvbW1pdHRpbmcsIGFuIG9wdGlvbmFsIGNoZWNrcG9pbnQgaXMgdHJpZ2dlcmVkIHRvIGVuc3VyZSB3cml0ZXNcbiAgICogYXJlIGR1cmFibGUuIFRoaXMgcHJldmVudHMgcmFjZSBjb25kaXRpb25zIHdoZXJlIHN1YnNlcXVlbnQgcmVhZHMgbWlnaHRcbiAgICogbm90IHNlZSBjb21taXR0ZWQgZGF0YSBkdWUgdG8gYXN5bmMgZmx1c2ggdGltaW5nLlxuICAgKi9cbiAgYXN5bmMgY29tbWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2Vuc3VyZUFjdGl2ZSgpO1xuICAgIGlmICh0aGlzLl90eG5JZCAhPT0gbnVsbCkge1xuICAgICAgYXdhaXQgdGhpcy5fZGJbJ19jb21taXRUcmFuc2FjdGlvbiddKHRoaXMuX3R4bklkKTtcbiAgICAgIC8vIFRyaWdnZXIgY2hlY2twb2ludCB0byBlbnN1cmUgZHVyYWJpbGl0eSAoYWRkcmVzc2VzIHJhY2UgY29uZGl0aW9uKVxuICAgICAgLy8gTm90ZTogVGhpcyBpcyBhIHRyYWRlLW9mZiBiZXR3ZWVuIGNvbnNpc3RlbmN5IGFuZCBwZXJmb3JtYW5jZS5cbiAgICAgIC8vIEZvciBoaWdoLXRocm91Z2hwdXQgc2NlbmFyaW9zLCBjb25zaWRlciBiYXRjaGluZyBjaGVja3BvaW50cy5cbiAgICAgIGF3YWl0IHRoaXMuX2RiLmNoZWNrcG9pbnQoKTtcbiAgICB9XG4gICAgdGhpcy5fY29tbWl0dGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydC9yb2xsYmFjayB0aGUgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBhc3luYyBhYm9ydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fY29tbWl0dGVkIHx8IHRoaXMuX2Fib3J0ZWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5fdHhuSWQgIT09IG51bGwpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2RiWydfYWJvcnRUcmFuc2FjdGlvbiddKHRoaXMuX3R4bklkKTtcbiAgICB9XG4gICAgdGhpcy5fYWJvcnRlZCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIF9lbnN1cmVBY3RpdmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NvbW1pdHRlZCkge1xuICAgICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIGFscmVhZHkgY29tbWl0dGVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9hYm9ydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gYWxyZWFkeSBhYm9ydGVkJyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU29jaERCIERhdGFiYXNlIGNsaWVudC5cbiAqXG4gKiBQcm92aWRlcyBhY2Nlc3MgdG8gU29jaERCIHdpdGggZnVsbCB0cmFuc2FjdGlvbiBzdXBwb3J0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBEYXRhYmFzZSB9IGZyb20gJ0BzdXNoYW50aC9zb2NoZGInO1xuICpcbiAqIC8vIE9wZW4gYSBkYXRhYmFzZVxuICogY29uc3QgZGIgPSBhd2FpdCBEYXRhYmFzZS5vcGVuKCcuL215X2RhdGFiYXNlJyk7XG4gKlxuICogLy8gU2ltcGxlIGtleS12YWx1ZSBvcGVyYXRpb25zXG4gKiBhd2FpdCBkYi5wdXQoQnVmZmVyLmZyb20oJ3VzZXI6MTIzJyksIEJ1ZmZlci5mcm9tKCd7XCJuYW1lXCI6IFwiQWxpY2VcIn0nKSk7XG4gKiBjb25zdCB2YWx1ZSA9IGF3YWl0IGRiLmdldChCdWZmZXIuZnJvbSgndXNlcjoxMjMnKSk7XG4gKlxuICogLy8gUGF0aC1uYXRpdmUgQVBJXG4gKiBhd2FpdCBkYi5wdXRQYXRoKCd1c2Vycy9hbGljZS9lbWFpbCcsIEJ1ZmZlci5mcm9tKCdhbGljZUBleGFtcGxlLmNvbScpKTtcbiAqIGNvbnN0IGVtYWlsID0gYXdhaXQgZGIuZ2V0UGF0aCgndXNlcnMvYWxpY2UvZW1haWwnKTtcbiAqXG4gKiAvLyBUcmFuc2FjdGlvbnNcbiAqIGF3YWl0IGRiLndpdGhUcmFuc2FjdGlvbihhc3luYyAodHhuKSA9PiB7XG4gKiAgIGF3YWl0IHR4bi5wdXQoQnVmZmVyLmZyb20oJ2tleTEnKSwgQnVmZmVyLmZyb20oJ3ZhbHVlMScpKTtcbiAqICAgYXdhaXQgdHhuLnB1dChCdWZmZXIuZnJvbSgna2V5MicpLCBCdWZmZXIuZnJvbSgndmFsdWUyJykpO1xuICogfSk7XG4gKlxuICogLy8gQ2xlYW4gdXBcbiAqIGF3YWl0IGRiLmNsb3NlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFiYXNlIHtcbiAgcHJpdmF0ZSBfY2xpZW50OiBJcGNDbGllbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfY29uZmlnOiBEYXRhYmFzZUNvbmZpZztcbiAgcHJpdmF0ZSBfY2xvc2VkID0gZmFsc2U7XG4gIHByaXZhdGUgX2VtYmVkZGVkU2VydmVyU3RhcnRlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoY29uZmlnOiBEYXRhYmFzZUNvbmZpZykge1xuICAgIHRoaXMuX2NvbmZpZyA9IHtcbiAgICAgIGNyZWF0ZUlmTWlzc2luZzogdHJ1ZSxcbiAgICAgIHdhbEVuYWJsZWQ6IHRydWUsXG4gICAgICBzeW5jTW9kZTogJ25vcm1hbCcsXG4gICAgICBtZW10YWJsZVNpemVCeXRlczogNjQgKiAxMDI0ICogMTAyNCxcbiAgICAgIGVtYmVkZGVkOiB0cnVlLCAgLy8gRGVmYXVsdCB0byBlbWJlZGRlZCBtb2RlXG4gICAgICAuLi5jb25maWcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGEgZGF0YWJhc2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yQ29uZmlnIC0gUGF0aCB0byB0aGUgZGF0YWJhc2UgZGlyZWN0b3J5IG9yIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAqIEByZXR1cm5zIEEgbmV3IERhdGFiYXNlIGluc3RhbmNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gU2ltcGxlIHVzYWdlIChlbWJlZGRlZCBtb2RlIC0gc3RhcnRzIHNlcnZlciBhdXRvbWF0aWNhbGx5KVxuICAgKiBjb25zdCBkYiA9IGF3YWl0IERhdGFiYXNlLm9wZW4oJy4vbXlfZGF0YWJhc2UnKTtcbiAgICpcbiAgICogLy8gV2l0aCBjb25maWd1cmF0aW9uXG4gICAqIGNvbnN0IGRiID0gYXdhaXQgRGF0YWJhc2Uub3Blbih7XG4gICAqICAgcGF0aDogJy4vbXlfZGF0YWJhc2UnLFxuICAgKiAgIHdhbEVuYWJsZWQ6IHRydWUsXG4gICAqICAgc3luY01vZGU6ICdmdWxsJyxcbiAgICogfSk7XG4gICAqIFxuICAgKiAvLyBDb25uZWN0IHRvIGV4aXN0aW5nIGV4dGVybmFsIHNlcnZlclxuICAgKiBjb25zdCBkYiA9IGF3YWl0IERhdGFiYXNlLm9wZW4oe1xuICAgKiAgIHBhdGg6ICcuL215X2RhdGFiYXNlJyxcbiAgICogICBlbWJlZGRlZDogZmFsc2UsICAvLyBEb24ndCBzdGFydCBlbWJlZGRlZCBzZXJ2ZXJcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIG9wZW4ocGF0aE9yQ29uZmlnOiBzdHJpbmcgfCBEYXRhYmFzZUNvbmZpZyk6IFByb21pc2U8RGF0YWJhc2U+IHtcbiAgICBjb25zdCBjb25maWc6IERhdGFiYXNlQ29uZmlnID1cbiAgICAgIHR5cGVvZiBwYXRoT3JDb25maWcgPT09ICdzdHJpbmcnID8geyBwYXRoOiBwYXRoT3JDb25maWcgfSA6IHBhdGhPckNvbmZpZztcblxuICAgIC8vIEVuc3VyZSBkYXRhYmFzZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKGNvbmZpZy5jcmVhdGVJZk1pc3NpbmcgIT09IGZhbHNlKSB7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnLnBhdGgpKSB7XG4gICAgICAgIGZzLm1rZGlyU3luYyhjb25maWcucGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGIgPSBuZXcgRGF0YWJhc2UoY29uZmlnKTtcblxuICAgIC8vIFN0YXJ0IGVtYmVkZGVkIHNlcnZlciBpZiBjb25maWd1cmVkIChkZWZhdWx0OiB0cnVlKVxuICAgIGxldCBzb2NrZXRQYXRoOiBzdHJpbmc7XG4gICAgaWYgKGRiLl9jb25maWcuZW1iZWRkZWQgIT09IGZhbHNlKSB7XG4gICAgICAvLyBTdGFydCBlbWJlZGRlZCBzZXJ2ZXIgYW5kIGdldCBzb2NrZXQgcGF0aFxuICAgICAgc29ja2V0UGF0aCA9IGF3YWl0IHN0YXJ0RW1iZWRkZWRTZXJ2ZXIoY29uZmlnLnBhdGgpO1xuICAgICAgZGIuX2VtYmVkZGVkU2VydmVyU3RhcnRlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbm5lY3QgdG8gZXhpc3Rpbmcgc2VydmVyIHNvY2tldFxuICAgICAgc29ja2V0UGF0aCA9IHBhdGguam9pbihjb25maWcucGF0aCwgJ3NvY2hkYi5zb2NrJyk7XG4gICAgfVxuXG4gICAgZGIuX2NsaWVudCA9IGF3YWl0IElwY0NsaWVudC5jb25uZWN0KHNvY2tldFBhdGgpO1xuXG4gICAgLy8gVHJhY2sgZGF0YWJhc2Ugb3BlbiBldmVudCAob25seSBhbmFseXRpY3MgZXZlbnQgd2Ugc2VuZClcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyB0cmFja0RhdGFiYXNlT3BlbiB9ID0gYXdhaXQgaW1wb3J0KCcuL2FuYWx5dGljcy5qcycpO1xuICAgICAgYXdhaXQgdHJhY2tEYXRhYmFzZU9wZW4oY29uZmlnLnBhdGgsICdlbWJlZGRlZCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTmV2ZXIgbGV0IGFuYWx5dGljcyBicmVhayBkYXRhYmFzZSBvcGVyYXRpb25zXG4gICAgfVxuXG4gICAgcmV0dXJuIGRiO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHZhbHVlIGJ5IGtleS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gbG9vayB1cCAoQnVmZmVyIG9yIHN0cmluZylcbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGFzIGEgQnVmZmVyLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgYXN5bmMgZ2V0KGtleTogQnVmZmVyIHwgc3RyaW5nKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgdGhpcy5fZW5zdXJlT3BlbigpO1xuICAgIGNvbnN0IGtleUJ1ZiA9IHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnID8gQnVmZmVyLmZyb20oa2V5KSA6IGtleTtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50IS5nZXQoa2V5QnVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgYSBrZXktdmFsdWUgcGFpci5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgKEJ1ZmZlciBvciBzdHJpbmcpXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSAoQnVmZmVyIG9yIHN0cmluZylcbiAgICovXG4gIGFzeW5jIHB1dChrZXk6IEJ1ZmZlciB8IHN0cmluZywgdmFsdWU6IEJ1ZmZlciB8IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2Vuc3VyZU9wZW4oKTtcbiAgICBjb25zdCBrZXlCdWYgPSB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyA/IEJ1ZmZlci5mcm9tKGtleSkgOiBrZXk7XG4gICAgY29uc3QgdmFsdWVCdWYgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gQnVmZmVyLmZyb20odmFsdWUpIDogdmFsdWU7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudCEucHV0KGtleUJ1ZiwgdmFsdWVCdWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gZGVsZXRlIChCdWZmZXIgb3Igc3RyaW5nKVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGtleTogQnVmZmVyIHwgc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fZW5zdXJlT3BlbigpO1xuICAgIGNvbnN0IGtleUJ1ZiA9IHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnID8gQnVmZmVyLmZyb20oa2V5KSA6IGtleTtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50IS5kZWxldGUoa2V5QnVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB2YWx1ZSBieSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aFN0ciAtIFRoZSBwYXRoIChlLmcuLCBcInVzZXJzL2FsaWNlL2VtYWlsXCIpXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBhcyBhIEJ1ZmZlciwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICovXG4gIGFzeW5jIGdldFBhdGgocGF0aFN0cjogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgdGhpcy5fZW5zdXJlT3BlbigpO1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQhLmdldFBhdGgocGF0aFN0cik7XG4gIH1cblxuICAvKipcbiAgICogUHV0IGEgdmFsdWUgYXQgYSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aFN0ciAtIFRoZSBwYXRoIChlLmcuLCBcInVzZXJzL2FsaWNlL2VtYWlsXCIpXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSAoQnVmZmVyIG9yIHN0cmluZylcbiAgICovXG4gIGFzeW5jIHB1dFBhdGgocGF0aFN0cjogc3RyaW5nLCB2YWx1ZTogQnVmZmVyIHwgc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fZW5zdXJlT3BlbigpO1xuICAgIGNvbnN0IHZhbHVlQnVmID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IEJ1ZmZlci5mcm9tKHZhbHVlKSA6IHZhbHVlO1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQhLnB1dFBhdGgocGF0aFN0ciwgdmFsdWVCdWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHF1ZXJ5IGJ1aWxkZXIgZm9yIHRoZSBnaXZlbiBwYXRoIHByZWZpeC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhQcmVmaXggLSBUaGUgcGF0aCBwcmVmaXggdG8gcXVlcnkgKGUuZy4sIFwidXNlcnMvXCIpXG4gICAqIEByZXR1cm5zIEEgUXVlcnkgYnVpbGRlciBpbnN0YW5jZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBkYi5xdWVyeSgndXNlcnMvJylcbiAgICogICAubGltaXQoMTApXG4gICAqICAgLnNlbGVjdChbJ25hbWUnLCAnZW1haWwnXSlcbiAgICogICAuZXhlY3V0ZSgpO1xuICAgKiBgYGBcbiAgICovXG4gIHF1ZXJ5KHBhdGhQcmVmaXg6IHN0cmluZyk6IFF1ZXJ5IHtcbiAgICB0aGlzLl9lbnN1cmVPcGVuKCk7XG4gICAgcmV0dXJuIG5ldyBRdWVyeSh0aGlzLl9jbGllbnQhLCBwYXRoUHJlZml4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FuIGZvciBrZXlzIHdpdGggYSBwcmVmaXgsIHJldHVybmluZyBrZXktdmFsdWUgcGFpcnMuXG4gICAqIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBtZXRob2QgZm9yIHNpbXBsZSBwcmVmaXgtYmFzZWQgaXRlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcHJlZml4IC0gVGhlIHByZWZpeCB0byBzY2FuIGZvciAoZS5nLiwgXCJ1c2Vycy9cIiwgXCJ0ZW5hbnRzL3RlbmFudDEvXCIpXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGtleS12YWx1ZSBwYWlyc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBkYi5zY2FuKCd0ZW5hbnRzL3RlbmFudDEvJyk7XG4gICAqIGZvciAoY29uc3QgeyBrZXksIHZhbHVlIH0gb2YgcmVzdWx0cykge1xuICAgKiAgIGNvbnNvbGUubG9nKGAke2tleS50b1N0cmluZygpfTogJHt2YWx1ZS50b1N0cmluZygpfWApO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgc2NhbihwcmVmaXg6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8eyBrZXk6IEJ1ZmZlcjsgdmFsdWU6IEJ1ZmZlciB9Pj4ge1xuICAgIHRoaXMuX2Vuc3VyZU9wZW4oKTtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50IS5zY2FuKHByZWZpeCk7XG4gIH1cblxuICAvKipcbiAgICogU2NhbiBmb3Iga2V5cyB3aXRoIGEgcHJlZml4IHVzaW5nIGFuIGFzeW5jIGdlbmVyYXRvci5cbiAgICogVGhpcyBhbGxvd3MgZm9yIG1lbW9yeS1lZmZpY2llbnQgaXRlcmF0aW9uIG92ZXIgbGFyZ2UgcmVzdWx0IHNldHMuXG4gICAqXG4gICAqIEBwYXJhbSBwcmVmaXggLSBUaGUgcHJlZml4IHRvIHNjYW4gZm9yXG4gICAqIEBwYXJhbSBlbmQgLSBPcHRpb25hbCBlbmQgYm91bmRhcnkgKGV4Y2x1c2l2ZSlcbiAgICogQHJldHVybnMgQXN5bmMgZ2VuZXJhdG9yIHlpZWxkaW5nIFtrZXksIHZhbHVlXSB0dXBsZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBmb3IgYXdhaXQgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYi5zY2FuR2VuZXJhdG9yKCd1c2Vycy8nKSkge1xuICAgKiAgIGNvbnNvbGUubG9nKGAke2tleS50b1N0cmluZygpfTogJHt2YWx1ZS50b1N0cmluZygpfWApO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgKnNjYW5HZW5lcmF0b3IocHJlZml4OiBzdHJpbmcgfCBCdWZmZXIsIGVuZD86IHN0cmluZyB8IEJ1ZmZlcik6IEFzeW5jR2VuZXJhdG9yPFtCdWZmZXIsIEJ1ZmZlcl0+IHtcbiAgICB0aGlzLl9lbnN1cmVPcGVuKCk7XG4gICAgY29uc3QgcHJlZml4QnVmID0gdHlwZW9mIHByZWZpeCA9PT0gJ3N0cmluZycgPyBCdWZmZXIuZnJvbShwcmVmaXgpIDogcHJlZml4O1xuICAgIGNvbnN0IGVuZEJ1ZiA9IGVuZCA/ICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJyA/IEJ1ZmZlci5mcm9tKGVuZCkgOiBlbmQpIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuX2NsaWVudCEuc2NhbihwcmVmaXhCdWYudG9TdHJpbmcoKSk7XG4gICAgZm9yIChjb25zdCB7IGtleSwgdmFsdWUgfSBvZiByZXN1bHRzKSB7XG4gICAgICAvLyBGaWx0ZXIgYnkgZW5kIGJvdW5kYXJ5IGlmIHByb3ZpZGVkXG4gICAgICBpZiAoZW5kQnVmICYmIEJ1ZmZlci5jb21wYXJlKGtleSwgZW5kQnVmKSA+PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgeWllbGQgW2tleSwgdmFsdWVdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIG9wZXJhdGlvbnMgd2l0aGluIGEgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFRoZSB0cmFuc2FjdGlvbiBhdXRvbWF0aWNhbGx5IGNvbW1pdHMgb24gc3VjY2VzcyBvciBhYm9ydHMgb24gZXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBmbiAtIEFzeW5jIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYSBUcmFuc2FjdGlvbiBvYmplY3RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCBkYi53aXRoVHJhbnNhY3Rpb24oYXN5bmMgKHR4bikgPT4ge1xuICAgKiAgIGF3YWl0IHR4bi5wdXQoQnVmZmVyLmZyb20oJ2tleTEnKSwgQnVmZmVyLmZyb20oJ3ZhbHVlMScpKTtcbiAgICogICBhd2FpdCB0eG4ucHV0KEJ1ZmZlci5mcm9tKCdrZXkyJyksIEJ1ZmZlci5mcm9tKCd2YWx1ZTInKSk7XG4gICAqICAgLy8gQXV0b21hdGljYWxseSBjb21taXRzXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHdpdGhUcmFuc2FjdGlvbjxUPihmbjogKHR4bjogVHJhbnNhY3Rpb24pID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICB0aGlzLl9lbnN1cmVPcGVuKCk7XG4gICAgY29uc3QgdHhuID0gbmV3IFRyYW5zYWN0aW9uKHRoaXMpO1xuICAgIGF3YWl0IHR4bi5iZWdpbigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbih0eG4pO1xuICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIG5ldyBUcmFuc2FjdGlvbiBpbnN0YW5jZVxuICAgKiBAZGVwcmVjYXRlZCBVc2Ugd2l0aFRyYW5zYWN0aW9uKCkgZm9yIGF1dG9tYXRpYyBjb21taXQvYWJvcnQgaGFuZGxpbmdcbiAgICovXG4gIGFzeW5jIHRyYW5zYWN0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICB0aGlzLl9lbnN1cmVPcGVuKCk7XG4gICAgY29uc3QgdHhuID0gbmV3IFRyYW5zYWN0aW9uKHRoaXMpO1xuICAgIGF3YWl0IHR4bi5iZWdpbigpO1xuICAgIHJldHVybiB0eG47XG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgYSBjaGVja3BvaW50IHRvIHBlcnNpc3QgbWVtdGFibGUgdG8gZGlzay5cbiAgICovXG4gIGFzeW5jIGNoZWNrcG9pbnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fZW5zdXJlT3BlbigpO1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQhLmNoZWNrcG9pbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc3RvcmFnZSBzdGF0aXN0aWNzLlxuICAgKi9cbiAgYXN5bmMgc3RhdHMoKTogUHJvbWlzZTx7XG4gICAgbWVtdGFibGVTaXplQnl0ZXM6IG51bWJlcjtcbiAgICB3YWxTaXplQnl0ZXM6IG51bWJlcjtcbiAgICBhY3RpdmVUcmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgfT4ge1xuICAgIHRoaXMuX2Vuc3VyZU9wZW4oKTtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50IS5zdGF0cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBTUUwgcXVlcnkuXG4gICAqIFxuICAgKiBTb2NoREIgc3VwcG9ydHMgYSBzdWJzZXQgb2YgU1FMIGZvciByZWxhdGlvbmFsIGRhdGEgc3RvcmVkIG9uIHRvcCBvZiBcbiAgICogdGhlIGtleS12YWx1ZSBlbmdpbmUuIFRhYmxlcyBhbmQgcm93cyBhcmUgc3RvcmVkIGFzOlxuICAgKiAtIFNjaGVtYTogX3NxbC90YWJsZXMve3RhYmxlX25hbWV9L3NjaGVtYVxuICAgKiAtIFJvd3M6IF9zcWwvdGFibGVzL3t0YWJsZV9uYW1lfS9yb3dzL3tyb3dfaWR9XG4gICAqIFxuICAgKiBTdXBwb3J0ZWQgU1FMOlxuICAgKiAtIENSRUFURSBUQUJMRSB0YWJsZV9uYW1lIChjb2wxIFRZUEUsIGNvbDIgVFlQRSwgLi4uKVxuICAgKiAtIERST1AgVEFCTEUgdGFibGVfbmFtZVxuICAgKiAtIElOU0VSVCBJTlRPIHRhYmxlX25hbWUgKGNvbHMpIFZBTFVFUyAodmFscylcbiAgICogLSBTRUxFQ1QgY29scyBGUk9NIHRhYmxlX25hbWUgW1dIRVJFIC4uLl0gW09SREVSIEJZIC4uLl0gW0xJTUlUIC4uLl1cbiAgICogLSBVUERBVEUgdGFibGVfbmFtZSBTRVQgY29sPXZhbCBbV0hFUkUgLi4uXVxuICAgKiAtIERFTEVURSBGUk9NIHRhYmxlX25hbWUgW1dIRVJFIC4uLl1cbiAgICogXG4gICAqIFN1cHBvcnRlZCB0eXBlczogSU5ULCBURVhULCBGTE9BVCwgQk9PTCwgQkxPQlxuICAgKiBcbiAgICogQHBhcmFtIHNxbCAtIFNRTCBxdWVyeSBzdHJpbmdcbiAgICogQHJldHVybnMgU1FMUXVlcnlSZXN1bHQgd2l0aCByb3dzIGFuZCBtZXRhZGF0YVxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBDcmVhdGUgYSB0YWJsZVxuICAgKiBhd2FpdCBkYi5leGVjdXRlKFwiQ1JFQVRFIFRBQkxFIHVzZXJzIChpZCBJTlQgUFJJTUFSWSBLRVksIG5hbWUgVEVYVCwgYWdlIElOVClcIik7XG4gICAqIFxuICAgKiAvLyBJbnNlcnQgZGF0YVxuICAgKiBhd2FpdCBkYi5leGVjdXRlKFwiSU5TRVJUIElOVE8gdXNlcnMgKGlkLCBuYW1lLCBhZ2UpIFZBTFVFUyAoMSwgJ0FsaWNlJywgMzApXCIpO1xuICAgKiBcbiAgICogLy8gUXVlcnkgZGF0YVxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi5leGVjdXRlKFwiU0VMRUNUICogRlJPTSB1c2VycyBXSEVSRSBhZ2UgPiAyNlwiKTtcbiAgICogcmVzdWx0LnJvd3MuZm9yRWFjaChyb3cgPT4gY29uc29sZS5sb2cocm93KSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShzcWw6IHN0cmluZyk6IFByb21pc2U8U1FMUXVlcnlSZXN1bHQ+IHtcbiAgICB0aGlzLl9lbnN1cmVPcGVuKCk7XG5cbiAgICAvLyBJbXBvcnQgdGhlIFNRTCBleGVjdXRvclxuICAgIGNvbnN0IHsgU1FMRXhlY3V0b3IgfSA9IGF3YWl0IGltcG9ydCgnLi9zcWwtZW5naW5lLmpzJyk7XG5cbiAgICAvLyBDcmVhdGUgYSBkYXRhYmFzZSBhZGFwdGVyIGZvciB0aGUgU1FMIGV4ZWN1dG9yXG4gICAgY29uc3QgZGJBZGFwdGVyID0ge1xuICAgICAgZ2V0OiAoa2V5OiBCdWZmZXIgfCBzdHJpbmcpID0+IHRoaXMuZ2V0KGtleSksXG4gICAgICBwdXQ6IChrZXk6IEJ1ZmZlciB8IHN0cmluZywgdmFsdWU6IEJ1ZmZlciB8IHN0cmluZykgPT4gdGhpcy5wdXQoa2V5LCB2YWx1ZSksXG4gICAgICBkZWxldGU6IChrZXk6IEJ1ZmZlciB8IHN0cmluZykgPT4gdGhpcy5kZWxldGUoa2V5KSxcbiAgICAgIHNjYW46IChwcmVmaXg6IHN0cmluZykgPT4gdGhpcy5zY2FuKHByZWZpeCksXG4gICAgfTtcblxuICAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IFNRTEV4ZWN1dG9yKGRiQWRhcHRlcik7XG4gICAgcmV0dXJuIGV4ZWN1dG9yLmV4ZWN1dGUoc3FsKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU3RhdGljIFNlcmlhbGl6YXRpb24gTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgcmVjb3JkcyB0byBUT09OIGZvcm1hdCBmb3IgdG9rZW4tZWZmaWNpZW50IExMTSBjb250ZXh0LlxuICAgKiBcbiAgICogVE9PTiBmb3JtYXQgYWNoaWV2ZXMgNDAtNjYlIHRva2VuIHJlZHVjdGlvbiBjb21wYXJlZCB0byBKU09OIGJ5IHVzaW5nXG4gICAqIGEgY29sdW1uYXIgdGV4dCBmb3JtYXQgd2l0aCBtaW5pbWFsIHN5bnRheC5cbiAgICogXG4gICAqIEBwYXJhbSB0YWJsZU5hbWUgLSBOYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSByZWNvcmRzIC0gQXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHRoZSBkYXRhXG4gICAqIEBwYXJhbSBmaWVsZHMgLSBPcHRpb25hbCBhcnJheSBvZiBmaWVsZCBuYW1lcyB0byBpbmNsdWRlXG4gICAqIEByZXR1cm5zIFRPT04tZm9ybWF0dGVkIHN0cmluZ1xuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZWNvcmRzID0gW1xuICAgKiAgIHsgaWQ6IDEsIG5hbWU6ICdBbGljZScsIGVtYWlsOiAnYWxpY2VAZXguY29tJyB9LFxuICAgKiAgIHsgaWQ6IDIsIG5hbWU6ICdCb2InLCBlbWFpbDogJ2JvYkBleC5jb20nIH1cbiAgICogXTtcbiAgICogY29uc29sZS5sb2coRGF0YWJhc2UudG9Ub29uKCd1c2VycycsIHJlY29yZHMsIFsnbmFtZScsICdlbWFpbCddKSk7XG4gICAqIC8vIHVzZXJzWzJde25hbWUsZW1haWx9OkFsaWNlLGFsaWNlQGV4LmNvbTtCb2IsYm9iQGV4LmNvbVxuICAgKiBgYGBcbiAgICovXG4gIHN0YXRpYyB0b1Rvb24oXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgcmVjb3JkczogQXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4sXG4gICAgZmllbGRzPzogc3RyaW5nW11cbiAgKTogc3RyaW5nIHtcbiAgICBpZiAoIXJlY29yZHMgfHwgcmVjb3Jkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBgJHt0YWJsZU5hbWV9WzBde306YDtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgZmllbGRzIGZyb20gZmlyc3QgcmVjb3JkIGlmIG5vdCBzcGVjaWZpZWRcbiAgICBjb25zdCB1c2VGaWVsZHMgPSBmaWVsZHMgPz8gT2JqZWN0LmtleXMocmVjb3Jkc1swXSk7XG5cbiAgICAvLyBCdWlsZCBoZWFkZXI6IHRhYmxlW2NvdW50XXtmaWVsZDEsZmllbGQyLC4uLn06XG4gICAgY29uc3QgaGVhZGVyID0gYCR7dGFibGVOYW1lfVske3JlY29yZHMubGVuZ3RofV17JHt1c2VGaWVsZHMuam9pbignLCcpfX06YDtcblxuICAgIC8vIEVzY2FwZSB2YWx1ZXMgY29udGFpbmluZyBkZWxpbWl0ZXJzXG4gICAgY29uc3QgZXNjYXBlVmFsdWUgPSAodjogYW55KTogc3RyaW5nID0+IHtcbiAgICAgIGNvbnN0IHMgPSB2ICE9IG51bGwgPyBTdHJpbmcodikgOiAnJztcbiAgICAgIGlmIChzLmluY2x1ZGVzKCcsJykgfHwgcy5pbmNsdWRlcygnOycpIHx8IHMuaW5jbHVkZXMoJ1xcbicpKSB7XG4gICAgICAgIHJldHVybiBgXCIke3N9XCJgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfTtcblxuICAgIC8vIEJ1aWxkIHJvd3M6IHZhbHVlMSx2YWx1ZTI7dmFsdWUxLHZhbHVlMjsuLi5cbiAgICBjb25zdCByb3dzID0gcmVjb3Jkc1xuICAgICAgLm1hcChyID0+IHVzZUZpZWxkcy5tYXAoZiA9PiBlc2NhcGVWYWx1ZShyW2ZdKSkuam9pbignLCcpKVxuICAgICAgLmpvaW4oJzsnKTtcblxuICAgIHJldHVybiBoZWFkZXIgKyByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgcmVjb3JkcyB0byBKU09OIGZvcm1hdCBmb3IgZWFzeSBhcHBsaWNhdGlvbiBkZWNvZGluZy5cbiAgICogXG4gICAqIFdoaWxlIFRPT04gZm9ybWF0IGlzIG9wdGltaXplZCBmb3IgTExNIGNvbnRleHQgKDQwLTY2JSB0b2tlbiByZWR1Y3Rpb24pLFxuICAgKiBKU09OIGlzIG9mdGVuIGVhc2llciBmb3IgYXBwbGljYXRpb25zIHRvIHBhcnNlLiBVc2UgdGhpcyBtZXRob2Qgd2hlblxuICAgKiB0aGUgb3V0cHV0IHdpbGwgYmUgY29uc3VtZWQgYnkgYXBwbGljYXRpb24gY29kZSByYXRoZXIgdGhhbiBMTE1zLlxuICAgKiBcbiAgICogQHBhcmFtIHRhYmxlTmFtZSAtIE5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHJlY29yZHMgLSBBcnJheSBvZiBvYmplY3RzIHdpdGggdGhlIGRhdGFcbiAgICogQHBhcmFtIGZpZWxkcyAtIE9wdGlvbmFsIGFycmF5IG9mIGZpZWxkIG5hbWVzIHRvIGluY2x1ZGVcbiAgICogQHBhcmFtIGNvbXBhY3QgLSBJZiB0cnVlIChkZWZhdWx0KSwgb3V0cHV0cyBtaW5pZmllZCBKU09OXG4gICAqIEByZXR1cm5zIEpTT04tZm9ybWF0dGVkIHN0cmluZ1xuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZWNvcmRzID0gW1xuICAgKiAgIHsgaWQ6IDEsIG5hbWU6ICdBbGljZScgfSxcbiAgICogICB7IGlkOiAyLCBuYW1lOiAnQm9iJyB9XG4gICAqIF07XG4gICAqIGNvbnNvbGUubG9nKERhdGFiYXNlLnRvSnNvbigndXNlcnMnLCByZWNvcmRzKSk7XG4gICAqIC8vIHtcInRhYmxlXCI6XCJ1c2Vyc1wiLFwiY291bnRcIjoyLFwicmVjb3Jkc1wiOlt7XCJpZFwiOjEsXCJuYW1lXCI6XCJBbGljZVwifSx7XCJpZFwiOjIsXCJuYW1lXCI6XCJCb2JcIn1dfVxuICAgKiBgYGBcbiAgICovXG4gIHN0YXRpYyB0b0pzb24oXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgcmVjb3JkczogQXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4sXG4gICAgZmllbGRzPzogc3RyaW5nW10sXG4gICAgY29tcGFjdDogYm9vbGVhbiA9IHRydWVcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAoIXJlY29yZHMgfHwgcmVjb3Jkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHRhYmxlOiB0YWJsZU5hbWUsIGNvdW50OiAwLCByZWNvcmRzOiBbXSB9KTtcbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgZmllbGRzIGlmIHNwZWNpZmllZFxuICAgIGNvbnN0IGZpbHRlcmVkUmVjb3JkcyA9IGZpZWxkc1xuICAgICAgPyByZWNvcmRzLm1hcChyID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIGZpZWxkcykge1xuICAgICAgICAgIGZpbHRlcmVkW2ZdID0gcltmXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsdGVyZWQ7XG4gICAgICB9KVxuICAgICAgOiByZWNvcmRzO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgdGFibGU6IHRhYmxlTmFtZSxcbiAgICAgIGNvdW50OiBmaWx0ZXJlZFJlY29yZHMubGVuZ3RoLFxuICAgICAgcmVjb3JkczogZmlsdGVyZWRSZWNvcmRzLFxuICAgIH07XG5cbiAgICByZXR1cm4gY29tcGFjdCA/IEpTT04uc3RyaW5naWZ5KG91dHB1dCkgOiBKU09OLnN0cmluZ2lmeShvdXRwdXQsIG51bGwsIDIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGEgSlNPTiBmb3JtYXQgc3RyaW5nIGJhY2sgdG8gc3RydWN0dXJlZCBkYXRhLlxuICAgKiBcbiAgICogQHBhcmFtIGpzb25TdHIgLSBKU09OLWZvcm1hdHRlZCBzdHJpbmcgKGZyb20gdG9Kc29uKVxuICAgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCB0YWJsZSwgZmllbGRzLCBhbmQgcmVjb3Jkc1xuICAgKi9cbiAgc3RhdGljIGZyb21Kc29uKGpzb25TdHI6IHN0cmluZyk6IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIGZpZWxkczogc3RyaW5nW107XG4gICAgcmVjb3JkczogQXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj47XG4gIH0ge1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGpzb25TdHIpO1xuICAgIGNvbnN0IHRhYmxlID0gZGF0YS50YWJsZSA/PyAndW5rbm93bic7XG4gICAgY29uc3QgcmVjb3JkcyA9IGRhdGEucmVjb3JkcyA/PyBbXTtcbiAgICBjb25zdCBmaWVsZHMgPSByZWNvcmRzLmxlbmd0aCA+IDAgPyBPYmplY3Qua2V5cyhyZWNvcmRzWzBdKSA6IFtdO1xuXG4gICAgcmV0dXJuIHsgdGFibGUsIGZpZWxkcywgcmVjb3JkcyB9O1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBHcmFwaCBPdmVybGF5IE9wZXJhdGlvbnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBBZGQgYSBub2RlIHRvIHRoZSBncmFwaCBvdmVybGF5LlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gTmFtZXNwYWNlIGZvciB0aGUgZ3JhcGhcbiAgICogQHBhcmFtIG5vZGVJZCAtIFVuaXF1ZSBub2RlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIG5vZGVUeXBlIC0gVHlwZSBvZiBub2RlIChlLmcuLCBcInBlcnNvblwiLCBcImRvY3VtZW50XCIsIFwiY29uY2VwdFwiKVxuICAgKiBAcGFyYW0gcHJvcGVydGllcyAtIE9wdGlvbmFsIG5vZGUgcHJvcGVydGllc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IGRiLmFkZE5vZGUoJ2RlZmF1bHQnLCAnYWxpY2UnLCAncGVyc29uJywgeyByb2xlOiAnZW5naW5lZXInIH0pO1xuICAgKiBhd2FpdCBkYi5hZGROb2RlKCdkZWZhdWx0JywgJ3Byb2plY3RfeCcsICdwcm9qZWN0JywgeyBzdGF0dXM6ICdhY3RpdmUnIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGFkZE5vZGUoXG4gICAgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgbm9kZUlkOiBzdHJpbmcsXG4gICAgbm9kZVR5cGU6IHN0cmluZyxcbiAgICBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9lbnN1cmVPcGVuKCk7XG5cbiAgICBjb25zdCBrZXkgPSBgX2dyYXBoLyR7bmFtZXNwYWNlfS9ub2Rlcy8ke25vZGVJZH1gO1xuICAgIGNvbnN0IHZhbHVlID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgIG5vZGVfdHlwZTogbm9kZVR5cGUsXG4gICAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzIHx8IHt9LFxuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5wdXQoQnVmZmVyLmZyb20oa2V5KSwgQnVmZmVyLmZyb20odmFsdWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZWRnZSBiZXR3ZWVuIG5vZGVzIGluIHRoZSBncmFwaCBvdmVybGF5LlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gTmFtZXNwYWNlIGZvciB0aGUgZ3JhcGhcbiAgICogQHBhcmFtIGZyb21JZCAtIFNvdXJjZSBub2RlIElEXG4gICAqIEBwYXJhbSBlZGdlVHlwZSAtIFR5cGUgb2YgcmVsYXRpb25zaGlwXG4gICAqIEBwYXJhbSB0b0lkIC0gVGFyZ2V0IG5vZGUgSURcbiAgICogQHBhcmFtIHByb3BlcnRpZXMgLSBPcHRpb25hbCBlZGdlIHByb3BlcnRpZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCBkYi5hZGRFZGdlKCdkZWZhdWx0JywgJ2FsaWNlJywgJ3dvcmtzX29uJywgJ3Byb2plY3RfeCcpO1xuICAgKiBhd2FpdCBkYi5hZGRFZGdlKCdkZWZhdWx0JywgJ2FsaWNlJywgJ2tub3dzJywgJ2JvYicsIHsgc2luY2U6ICcyMDIwJyB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBhZGRFZGdlKFxuICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgIGZyb21JZDogc3RyaW5nLFxuICAgIGVkZ2VUeXBlOiBzdHJpbmcsXG4gICAgdG9JZDogc3RyaW5nLFxuICAgIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2Vuc3VyZU9wZW4oKTtcblxuICAgIGNvbnN0IGtleSA9IGBfZ3JhcGgvJHtuYW1lc3BhY2V9L2VkZ2VzLyR7ZnJvbUlkfS8ke2VkZ2VUeXBlfS8ke3RvSWR9YDtcbiAgICBjb25zdCB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGZyb21faWQ6IGZyb21JZCxcbiAgICAgIGVkZ2VfdHlwZTogZWRnZVR5cGUsXG4gICAgICB0b19pZDogdG9JZCxcbiAgICAgIHByb3BlcnRpZXM6IHByb3BlcnRpZXMgfHwge30sXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLnB1dChCdWZmZXIuZnJvbShrZXkpLCBCdWZmZXIuZnJvbSh2YWx1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYXZlcnNlIHRoZSBncmFwaCBmcm9tIGEgc3RhcnRpbmcgbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWVzcGFjZSAtIE5hbWVzcGFjZSBmb3IgdGhlIGdyYXBoXG4gICAqIEBwYXJhbSBzdGFydE5vZGUgLSBOb2RlIElEIHRvIHN0YXJ0IHRyYXZlcnNhbCBmcm9tXG4gICAqIEBwYXJhbSBtYXhEZXB0aCAtIE1heGltdW0gdHJhdmVyc2FsIGRlcHRoIChkZWZhdWx0OiAxMClcbiAgICogQHBhcmFtIG9yZGVyIC0gXCJiZnNcIiBmb3IgYnJlYWR0aC1maXJzdCwgXCJkZnNcIiBmb3IgZGVwdGgtZmlyc3RcbiAgICogQHJldHVybnMgT2JqZWN0IHdpdGggbm9kZXMgYW5kIGVkZ2VzIGFycmF5c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgbm9kZXMsIGVkZ2VzIH0gPSBhd2FpdCBkYi50cmF2ZXJzZSgnZGVmYXVsdCcsICdhbGljZScsIDIpO1xuICAgKiBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICogICBjb25zb2xlLmxvZyhgTm9kZTogJHtub2RlLmlkfSAoJHtub2RlLm5vZGVfdHlwZX0pYCk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB0cmF2ZXJzZShcbiAgICBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICBzdGFydE5vZGU6IHN0cmluZyxcbiAgICBtYXhEZXB0aDogbnVtYmVyID0gMTAsXG4gICAgb3JkZXI6ICdiZnMnIHwgJ2RmcycgPSAnYmZzJ1xuICApOiBQcm9taXNlPHsgbm9kZXM6IGFueVtdOyBlZGdlczogYW55W10gfT4ge1xuICAgIHRoaXMuX2Vuc3VyZU9wZW4oKTtcblxuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBub2RlczogYW55W10gPSBbXTtcbiAgICBjb25zdCBlZGdlczogYW55W10gPSBbXTtcbiAgICBjb25zdCBmcm9udGllcjogQXJyYXk8W3N0cmluZywgbnVtYmVyXT4gPSBbW3N0YXJ0Tm9kZSwgMF1dO1xuXG4gICAgd2hpbGUgKGZyb250aWVyLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IFtjdXJyZW50Tm9kZSwgZGVwdGhdID0gb3JkZXIgPT09ICdiZnMnXG4gICAgICAgID8gZnJvbnRpZXIuc2hpZnQoKSFcbiAgICAgICAgOiBmcm9udGllci5wb3AoKSE7XG5cbiAgICAgIGlmIChkZXB0aCA+IG1heERlcHRoIHx8IHZpc2l0ZWQuaGFzKGN1cnJlbnROb2RlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZpc2l0ZWQuYWRkKGN1cnJlbnROb2RlKTtcblxuICAgICAgLy8gR2V0IG5vZGUgZGF0YVxuICAgICAgY29uc3Qgbm9kZUtleSA9IGBfZ3JhcGgvJHtuYW1lc3BhY2V9L25vZGVzLyR7Y3VycmVudE5vZGV9YDtcbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gYXdhaXQgdGhpcy5nZXQoQnVmZmVyLmZyb20obm9kZUtleSkpO1xuICAgICAgaWYgKG5vZGVEYXRhKSB7XG4gICAgICAgIG5vZGVzLnB1c2goSlNPTi5wYXJzZShub2RlRGF0YS50b1N0cmluZygpKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBvdXRnb2luZyBlZGdlc1xuICAgICAgY29uc3QgZWRnZVByZWZpeCA9IGBfZ3JhcGgvJHtuYW1lc3BhY2V9L2VkZ2VzLyR7Y3VycmVudE5vZGV9L2A7XG4gICAgICBjb25zdCBlZGdlUmVzdWx0cyA9IGF3YWl0IHRoaXMuc2NhbihlZGdlUHJlZml4KTtcbiAgICAgIGZvciAoY29uc3QgeyB2YWx1ZSB9IG9mIGVkZ2VSZXN1bHRzKSB7XG4gICAgICAgIGNvbnN0IGVkZ2UgPSBKU09OLnBhcnNlKHZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICBlZGdlcy5wdXNoKGVkZ2UpO1xuXG4gICAgICAgIGlmICghdmlzaXRlZC5oYXMoZWRnZS50b19pZCkpIHtcbiAgICAgICAgICBmcm9udGllci5wdXNoKFtlZGdlLnRvX2lkLCBkZXB0aCArIDFdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IG5vZGVzLCBlZGdlcyB9O1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTZW1hbnRpYyBDYWNoZSBPcGVyYXRpb25zXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogU3RvcmUgYSB2YWx1ZSBpbiB0aGUgc2VtYW50aWMgY2FjaGUgd2l0aCBpdHMgZW1iZWRkaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FjaGVOYW1lIC0gTmFtZSBvZiB0aGUgY2FjaGVcbiAgICogQHBhcmFtIGtleSAtIENhY2hlIGtleSAoZm9yIGRpc3BsYXkvZGVidWdnaW5nKVxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBjYWNoZVxuICAgKiBAcGFyYW0gZW1iZWRkaW5nIC0gRW1iZWRkaW5nIHZlY3RvciBmb3Igc2ltaWxhcml0eSBtYXRjaGluZ1xuICAgKiBAcGFyYW0gdHRsU2Vjb25kcyAtIFRpbWUtdG8tbGl2ZSBpbiBzZWNvbmRzICgwID0gbm8gZXhwaXJ5KVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IGRiLmNhY2hlUHV0KFxuICAgKiAgICdsbG1fcmVzcG9uc2VzJyxcbiAgICogICAnV2hhdCBpcyBQeXRob24/JyxcbiAgICogICAnUHl0aG9uIGlzIGEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuLi4nLFxuICAgKiAgIFswLjEsIDAuMiwgMC4zLCAuLi5dLCAgLy8gMzg0LWRpbVxuICAgKiAgIDM2MDBcbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBjYWNoZVB1dChcbiAgICBjYWNoZU5hbWU6IHN0cmluZyxcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIGVtYmVkZGluZzogbnVtYmVyW10sXG4gICAgdHRsU2Vjb25kczogbnVtYmVyID0gMFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9lbnN1cmVPcGVuKCk7XG5cbiAgICAvLyBIYXNoIHRoZSBrZXkgZm9yIHN0b3JhZ2VcbiAgICBjb25zdCBrZXlIYXNoID0gQnVmZmVyLmZyb20oa2V5KS50b1N0cmluZygnaGV4Jykuc2xpY2UoMCwgMTYpO1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYF9jYWNoZS8ke2NhY2hlTmFtZX0vJHtrZXlIYXNofWA7XG5cbiAgICBjb25zdCBleHBpcmVzQXQgPSB0dGxTZWNvbmRzID4gMFxuICAgICAgPyBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSArIHR0bFNlY29uZHNcbiAgICAgIDogMDtcblxuICAgIGNvbnN0IGNhY2hlVmFsdWUgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBrZXksXG4gICAgICB2YWx1ZSxcbiAgICAgIGVtYmVkZGluZyxcbiAgICAgIGV4cGlyZXNfYXQ6IGV4cGlyZXNBdCxcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMucHV0KEJ1ZmZlci5mcm9tKGNhY2hlS2V5KSwgQnVmZmVyLmZyb20oY2FjaGVWYWx1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvb2sgdXAgYSB2YWx1ZSBpbiB0aGUgc2VtYW50aWMgY2FjaGUgYnkgZW1iZWRkaW5nIHNpbWlsYXJpdHkuXG4gICAqXG4gICAqIEBwYXJhbSBjYWNoZU5hbWUgLSBOYW1lIG9mIHRoZSBjYWNoZVxuICAgKiBAcGFyYW0gcXVlcnlFbWJlZGRpbmcgLSBRdWVyeSBlbWJlZGRpbmcgdG8gbWF0Y2ggYWdhaW5zdFxuICAgKiBAcGFyYW0gdGhyZXNob2xkIC0gTWluaW11bSBjb3NpbmUgc2ltaWxhcml0eSB0aHJlc2hvbGQgKDAuMCB0byAxLjApXG4gICAqIEByZXR1cm5zIENhY2hlZCB2YWx1ZSBpZiBzaW1pbGFyaXR5ID49IHRocmVzaG9sZCwgbnVsbCBvdGhlcndpc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi5jYWNoZUdldChcbiAgICogICAnbGxtX3Jlc3BvbnNlcycsXG4gICAqICAgWzAuMTIsIDAuMTgsIC4uLl0sICAvLyBTaW1pbGFyIHRvIFwiV2hhdCBpcyBQeXRob24/XCJcbiAgICogICAwLjg1XG4gICAqICk7XG4gICAqIGlmIChyZXN1bHQpIHtcbiAgICogICBjb25zb2xlLmxvZyhgQ2FjaGUgaGl0OiAke3Jlc3VsdH1gKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNhY2hlR2V0KFxuICAgIGNhY2hlTmFtZTogc3RyaW5nLFxuICAgIHF1ZXJ5RW1iZWRkaW5nOiBudW1iZXJbXSxcbiAgICB0aHJlc2hvbGQ6IG51bWJlciA9IDAuODVcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgdGhpcy5fZW5zdXJlT3BlbigpO1xuXG4gICAgY29uc3QgcHJlZml4ID0gYF9jYWNoZS8ke2NhY2hlTmFtZX0vYDtcbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5zY2FuKHByZWZpeCk7XG5cbiAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICBsZXQgYmVzdE1hdGNoOiB7IHNpbWlsYXJpdHk6IG51bWJlcjsgdmFsdWU6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IHsgdmFsdWUgfSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IEpTT04ucGFyc2UodmFsdWUudG9TdHJpbmcoKSk7XG5cbiAgICAgIC8vIENoZWNrIGV4cGlyeVxuICAgICAgaWYgKGVudHJ5LmV4cGlyZXNfYXQgPiAwICYmIG5vdyA+IGVudHJ5LmV4cGlyZXNfYXQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbXB1dGUgY29zaW5lIHNpbWlsYXJpdHlcbiAgICAgIGlmIChlbnRyeS5lbWJlZGRpbmcgJiYgZW50cnkuZW1iZWRkaW5nLmxlbmd0aCA9PT0gcXVlcnlFbWJlZGRpbmcubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHNpbWlsYXJpdHkgPSB0aGlzLl9jb3NpbmVTaW1pbGFyaXR5KHF1ZXJ5RW1iZWRkaW5nLCBlbnRyeS5lbWJlZGRpbmcpO1xuICAgICAgICBpZiAoc2ltaWxhcml0eSA+PSB0aHJlc2hvbGQpIHtcbiAgICAgICAgICBpZiAoIWJlc3RNYXRjaCB8fCBzaW1pbGFyaXR5ID4gYmVzdE1hdGNoLnNpbWlsYXJpdHkpIHtcbiAgICAgICAgICAgIGJlc3RNYXRjaCA9IHsgc2ltaWxhcml0eSwgdmFsdWU6IGVudHJ5LnZhbHVlIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlc3RNYXRjaD8udmFsdWUgPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2Nvc2luZVNpbWlsYXJpdHkoYTogbnVtYmVyW10sIGI6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgICBsZXQgZG90ID0gMCwgbm9ybUEgPSAwLCBub3JtQiA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkb3QgKz0gYVtpXSAqIGJbaV07XG4gICAgICBub3JtQSArPSBhW2ldICogYVtpXTtcbiAgICAgIG5vcm1CICs9IGJbaV0gKiBiW2ldO1xuICAgIH1cbiAgICBub3JtQSA9IE1hdGguc3FydChub3JtQSk7XG4gICAgbm9ybUIgPSBNYXRoLnNxcnQobm9ybUIpO1xuICAgIHJldHVybiBub3JtQSA9PT0gMCB8fCBub3JtQiA9PT0gMCA/IDAgOiBkb3QgLyAobm9ybUEgKiBub3JtQik7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRyYWNlIE9wZXJhdGlvbnMgKE9ic2VydmFiaWxpdHkpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogU3RhcnQgYSBuZXcgdHJhY2UuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gTmFtZSBvZiB0aGUgdHJhY2UgKGUuZy4sIFwidXNlcl9yZXF1ZXN0XCIsIFwiYmF0Y2hfam9iXCIpXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHRyYWNlSWQgYW5kIHJvb3RTcGFuSWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB7IHRyYWNlSWQsIHJvb3RTcGFuSWQgfSA9IGF3YWl0IGRiLnN0YXJ0VHJhY2UoJ3VzZXJfcXVlcnknKTtcbiAgICogLy8gLi4uIGRvIHdvcmsgLi4uXG4gICAqIGF3YWl0IGRiLmVuZFNwYW4odHJhY2VJZCwgcm9vdFNwYW5JZCwgJ29rJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgc3RhcnRUcmFjZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgdHJhY2VJZDogc3RyaW5nOyByb290U3BhbklkOiBzdHJpbmcgfT4ge1xuICAgIHRoaXMuX2Vuc3VyZU9wZW4oKTtcblxuICAgIGNvbnN0IHRyYWNlSWQgPSBgdHJhY2VfJHtEYXRlLm5vdygpLnRvU3RyaW5nKDE2KX0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpLnNsaWNlKDIsIDEwKX1gO1xuICAgIGNvbnN0IHNwYW5JZCA9IGBzcGFuXyR7RGF0ZS5ub3coKS50b1N0cmluZygxNil9JHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zbGljZSgyLCAxMCl9YDtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpICogMTAwMDsgLy8gbWljcm9zZWNvbmRzXG5cbiAgICAvLyBTdG9yZSB0cmFjZVxuICAgIGNvbnN0IHRyYWNlS2V5ID0gYF90cmFjZXMvJHt0cmFjZUlkfWA7XG4gICAgY29uc3QgdHJhY2VWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHRyYWNlX2lkOiB0cmFjZUlkLFxuICAgICAgbmFtZSxcbiAgICAgIHN0YXJ0X3VzOiBub3csXG4gICAgICByb290X3NwYW5faWQ6IHNwYW5JZCxcbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLnB1dChCdWZmZXIuZnJvbSh0cmFjZUtleSksIEJ1ZmZlci5mcm9tKHRyYWNlVmFsdWUpKTtcblxuICAgIC8vIFN0b3JlIHJvb3Qgc3BhblxuICAgIGNvbnN0IHNwYW5LZXkgPSBgX3RyYWNlcy8ke3RyYWNlSWR9L3NwYW5zLyR7c3BhbklkfWA7XG4gICAgY29uc3Qgc3BhblZhbHVlID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgc3Bhbl9pZDogc3BhbklkLFxuICAgICAgbmFtZSxcbiAgICAgIHN0YXJ0X3VzOiBub3csXG4gICAgICBwYXJlbnRfc3Bhbl9pZDogbnVsbCxcbiAgICAgIHN0YXR1czogJ2FjdGl2ZScsXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5wdXQoQnVmZmVyLmZyb20oc3BhbktleSksIEJ1ZmZlci5mcm9tKHNwYW5WYWx1ZSkpO1xuXG4gICAgcmV0dXJuIHsgdHJhY2VJZCwgcm9vdFNwYW5JZDogc3BhbklkIH07XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgYSBjaGlsZCBzcGFuIHdpdGhpbiBhIHRyYWNlLlxuICAgKlxuICAgKiBAcGFyYW0gdHJhY2VJZCAtIElEIG9mIHRoZSBwYXJlbnQgdHJhY2VcbiAgICogQHBhcmFtIHBhcmVudFNwYW5JZCAtIElEIG9mIHRoZSBwYXJlbnQgc3BhblxuICAgKiBAcGFyYW0gbmFtZSAtIE5hbWUgb2YgdGhpcyBzcGFuXG4gICAqIEByZXR1cm5zIFRoZSBuZXcgc3BhbiBJRFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgdHJhY2VJZCwgcm9vdFNwYW5JZCB9ID0gYXdhaXQgZGIuc3RhcnRUcmFjZSgndXNlcl9xdWVyeScpO1xuICAgKiBjb25zdCBkYlNwYW4gPSBhd2FpdCBkYi5zdGFydFNwYW4odHJhY2VJZCwgcm9vdFNwYW5JZCwgJ2RhdGFiYXNlX2xvb2t1cCcpO1xuICAgKiAvLyAuLi4gZG8gZGF0YWJhc2Ugd29yayAuLi5cbiAgICogY29uc3QgZHVyYXRpb24gPSBhd2FpdCBkYi5lbmRTcGFuKHRyYWNlSWQsIGRiU3BhbiwgJ29rJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgc3RhcnRTcGFuKFxuICAgIHRyYWNlSWQ6IHN0cmluZyxcbiAgICBwYXJlbnRTcGFuSWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLl9lbnN1cmVPcGVuKCk7XG5cbiAgICBjb25zdCBzcGFuSWQgPSBgc3Bhbl8ke0RhdGUubm93KCkudG9TdHJpbmcoMTYpfSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMiwgMTApfWA7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKSAqIDEwMDA7XG5cbiAgICBjb25zdCBzcGFuS2V5ID0gYF90cmFjZXMvJHt0cmFjZUlkfS9zcGFucy8ke3NwYW5JZH1gO1xuICAgIGNvbnN0IHNwYW5WYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHNwYW5faWQ6IHNwYW5JZCxcbiAgICAgIG5hbWUsXG4gICAgICBzdGFydF91czogbm93LFxuICAgICAgcGFyZW50X3NwYW5faWQ6IHBhcmVudFNwYW5JZCxcbiAgICAgIHN0YXR1czogJ2FjdGl2ZScsXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5wdXQoQnVmZmVyLmZyb20oc3BhbktleSksIEJ1ZmZlci5mcm9tKHNwYW5WYWx1ZSkpO1xuXG4gICAgcmV0dXJuIHNwYW5JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmQgYSBzcGFuIGFuZCByZWNvcmQgaXRzIGR1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdHJhY2VJZCAtIElEIG9mIHRoZSB0cmFjZVxuICAgKiBAcGFyYW0gc3BhbklkIC0gSUQgb2YgdGhlIHNwYW4gdG8gZW5kXG4gICAqIEBwYXJhbSBzdGF0dXMgLSBcIm9rXCIsIFwiZXJyb3JcIiwgb3IgXCJ1bnNldFwiXG4gICAqIEByZXR1cm5zIER1cmF0aW9uIGluIG1pY3Jvc2Vjb25kc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGR1cmF0aW9uID0gYXdhaXQgZGIuZW5kU3Bhbih0cmFjZUlkLCBzcGFuSWQsICdvaycpO1xuICAgKiBjb25zb2xlLmxvZyhgT3BlcmF0aW9uIHRvb2sgJHtkdXJhdGlvbn3CtXNgKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBlbmRTcGFuKFxuICAgIHRyYWNlSWQ6IHN0cmluZyxcbiAgICBzcGFuSWQ6IHN0cmluZyxcbiAgICBzdGF0dXM6ICdvaycgfCAnZXJyb3InIHwgJ3Vuc2V0JyA9ICdvaydcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICB0aGlzLl9lbnN1cmVPcGVuKCk7XG5cbiAgICBjb25zdCBzcGFuS2V5ID0gYF90cmFjZXMvJHt0cmFjZUlkfS9zcGFucy8ke3NwYW5JZH1gO1xuICAgIGNvbnN0IHNwYW5EYXRhID0gYXdhaXQgdGhpcy5nZXQoQnVmZmVyLmZyb20oc3BhbktleSkpO1xuXG4gICAgaWYgKCFzcGFuRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoYFNwYW4gbm90IGZvdW5kOiAke3NwYW5JZH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFuID0gSlNPTi5wYXJzZShzcGFuRGF0YS50b1N0cmluZygpKTtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpICogMTAwMDtcbiAgICBjb25zdCBkdXJhdGlvbiA9IG5vdyAtIHNwYW4uc3RhcnRfdXM7XG5cbiAgICBjb25zdCB1cGRhdGVkU3BhbiA9IHtcbiAgICAgIC4uLnNwYW4sXG4gICAgICBzdGF0dXMsXG4gICAgICBlbmRfdXM6IG5vdyxcbiAgICAgIGR1cmF0aW9uX3VzOiBkdXJhdGlvbixcbiAgICB9O1xuICAgIGF3YWl0IHRoaXMucHV0KEJ1ZmZlci5mcm9tKHNwYW5LZXkpLCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh1cGRhdGVkU3BhbikpKTtcblxuICAgIHJldHVybiBkdXJhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogSWYgcnVubmluZyBpbiBlbWJlZGRlZCBtb2RlLCBhbHNvIHN0b3BzIHRoZSBlbWJlZGRlZCBzZXJ2ZXIuXG4gICAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fY2xvc2VkKSByZXR1cm47XG4gICAgaWYgKHRoaXMuX2NsaWVudCkge1xuICAgICAgYXdhaXQgdGhpcy5fY2xpZW50LmNsb3NlKCk7XG4gICAgICB0aGlzLl9jbGllbnQgPSBudWxsO1xuICAgIH1cbiAgICAvLyBTdG9wIGVtYmVkZGVkIHNlcnZlciBpZiB3ZSBzdGFydGVkIGl0XG4gICAgaWYgKHRoaXMuX2VtYmVkZGVkU2VydmVyU3RhcnRlZCkge1xuICAgICAgYXdhaXQgc3RvcEVtYmVkZGVkU2VydmVyKHRoaXMuX2NvbmZpZy5wYXRoKTtcbiAgICAgIHRoaXMuX2VtYmVkZGVkU2VydmVyU3RhcnRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9jbG9zZWQgPSB0cnVlO1xuICB9XG5cbiAgLy8gSW50ZXJuYWwgbWV0aG9kcyBmb3IgdHJhbnNhY3Rpb24gbWFuYWdlbWVudFxuICBwcml2YXRlIGFzeW5jIF9iZWdpblRyYW5zYWN0aW9uKCk6IFByb21pc2U8YmlnaW50PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudCEuYmVnaW5UcmFuc2FjdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfY29tbWl0VHJhbnNhY3Rpb24odHhuSWQ6IGJpZ2ludCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQhLmNvbW1pdFRyYW5zYWN0aW9uKHR4bklkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2Fib3J0VHJhbnNhY3Rpb24odHhuSWQ6IGJpZ2ludCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQhLmFib3J0VHJhbnNhY3Rpb24odHhuSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZW5zdXJlT3BlbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY2xvc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcignRGF0YWJhc2UgaXMgY2xvc2VkJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fY2xpZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcignRGF0YWJhc2Ugbm90IGNvbm5lY3RlZCcpO1xuICAgIH1cbiAgfVxufVxuIl19
931
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7O0dBT0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDBEQUEwRDtBQUMxRCxFQUFFO0FBQ0Ysa0VBQWtFO0FBQ2xFLG1FQUFtRTtBQUNuRSwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLGlEQUFpRDtBQUVqRCx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLHFDQUEyRDtBQUMzRCw2Q0FBeUM7QUFDekMsbUNBQWdDO0FBQ2hDLHFEQUEyRTtBQW1DM0U7O0dBRUc7QUFDSCxNQUFhLFdBQVc7SUFDZCxHQUFHLENBQVc7SUFDZCxNQUFNLEdBQWtCLElBQUksQ0FBQztJQUM3QixVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQ25CLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFekIsWUFBWSxFQUFZO1FBQ3RCLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsS0FBSztRQUNULElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQW9CO1FBQzVCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBb0IsRUFBRSxLQUFzQjtRQUNwRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FB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QUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxzQkFBYSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXgyQkQsNEJBdzJCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU29jaERCIEVtYmVkZGVkIERhdGFiYXNlXG4gKlxuICogRGlyZWN0IGRhdGFiYXNlIGFjY2VzcyB2aWEgSVBDIHRvIHRoZSBTb2NoREIgc2VydmVyLlxuICogVGhpcyBwcm92aWRlcyB0aGUgc2FtZSBBUEkgYXMgdGhlIFB5dGhvbiBTREsncyBEYXRhYmFzZSBjbGFzcy5cbiAqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuXG4vLyBDb3B5cmlnaHQgMjAyNSBTdXNoYW50aCAoaHR0cHM6Ly9naXRodWIuY29tL3N1c2hhbnRocHkpXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IERhdGFiYXNlRXJyb3IsIFRyYW5zYWN0aW9uRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBJcGNDbGllbnQgfSBmcm9tICcuL2lwYy1jbGllbnQnO1xuaW1wb3J0IHsgUXVlcnkgfSBmcm9tICcuL3F1ZXJ5JztcbmltcG9ydCB7IHN0YXJ0RW1iZWRkZWRTZXJ2ZXIsIHN0b3BFbWJlZGRlZFNlcnZlciB9IGZyb20gJy4vc2VydmVyLW1hbmFnZXInO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGFiYXNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlQ29uZmlnIHtcbiAgLyoqIFBhdGggdG8gdGhlIGRhdGFiYXNlIGRpcmVjdG9yeSAqL1xuICBwYXRoOiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRvIGNyZWF0ZSB0aGUgZGF0YWJhc2UgaWYgaXQgZG9lc24ndCBleGlzdCAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgY3JlYXRlSWZNaXNzaW5nPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBXQUwgKFdyaXRlLUFoZWFkIExvZ2dpbmcpIGZvciBkdXJhYmlsaXR5IChkZWZhdWx0OiB0cnVlKSAqL1xuICB3YWxFbmFibGVkPzogYm9vbGVhbjtcbiAgLyoqIFN5bmMgbW9kZTogJ2Z1bGwnIHwgJ25vcm1hbCcgfCAnb2ZmJyAoZGVmYXVsdDogJ25vcm1hbCcpICovXG4gIHN5bmNNb2RlPzogJ2Z1bGwnIHwgJ25vcm1hbCcgfCAnb2ZmJztcbiAgLyoqIE1heGltdW0gc2l6ZSBvZiB0aGUgbWVtdGFibGUgYmVmb3JlIGZsdXNoaW5nIChkZWZhdWx0OiA2NE1CKSAqL1xuICBtZW10YWJsZVNpemVCeXRlcz86IG51bWJlcjtcbiAgLyoqIFxuICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgc3RhcnQgYW4gZW1iZWRkZWQgc2VydmVyIChkZWZhdWx0OiB0cnVlKVxuICAgKiBTZXQgdG8gZmFsc2UgaWYgY29ubmVjdGluZyB0byBhbiBleGlzdGluZyBleHRlcm5hbCBzZXJ2ZXJcbiAgICovXG4gIGVtYmVkZGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYSBTUUwgcXVlcnkgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNRTFF1ZXJ5UmVzdWx0IHtcbiAgLyoqIFJlc3VsdCByb3dzICovXG4gIHJvd3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+O1xuICAvKiogQ29sdW1uIG5hbWVzICovXG4gIGNvbHVtbnM6IHN0cmluZ1tdO1xuICAvKiogTnVtYmVyIG9mIHJvd3MgYWZmZWN0ZWQgKGZvciBJTlNFUlQvVVBEQVRFL0RFTEVURSkgKi9cbiAgcm93c0FmZmVjdGVkOiBudW1iZXI7XG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gaGFuZGxlIGZvciBhdG9taWMgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIHtcbiAgcHJpdmF0ZSBfZGI6IERhdGFiYXNlO1xuICBwcml2YXRlIF90eG5JZDogYmlnaW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2NvbW1pdHRlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9hYm9ydGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoZGI6IERhdGFiYXNlKSB7XG4gICAgdGhpcy5fZGIgPSBkYjtcbiAgfVxuXG4gIC8qKlxuICAgKiBCZWdpbiB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgYXN5bmMgYmVnaW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fdHhuSWQgPSBhd2FpdCB0aGlzLl9kYlsnX2JlZ2luVHJhbnNhY3Rpb24nXSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHZhbHVlIGJ5IGtleSB3aXRoaW4gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIGdldChrZXk6IEJ1ZmZlciB8IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgIHRoaXMuX2Vuc3VyZUFjdGl2ZSgpO1xuICAgIHJldHVybiB0aGlzLl9kYi5nZXQoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgYSBrZXktdmFsdWUgcGFpciB3aXRoaW4gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIHB1dChrZXk6IEJ1ZmZlciB8IHN0cmluZywgdmFsdWU6IEJ1ZmZlciB8IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2Vuc3VyZUFjdGl2ZSgpO1xuICAgIHJldHVybiB0aGlzLl9kYi5wdXQoa2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEga2V5IHdpdGhpbiB0aGlzIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGtleTogQnVmZmVyIHwgc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fZW5zdXJlQWN0aXZlKCk7XG4gICAgcmV0dXJuIHRoaXMuX2RiLmRlbGV0ZShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYW4ga2V5cyB3aXRoIGEgcHJlZml4IHdpdGhpbiB0aGlzIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gcHJlZml4IC0gVGhlIHByZWZpeCB0byBzY2FuIGZvclxuICAgKiBAcGFyYW0gZW5kIC0gT3B0aW9uYWwgZW5kIGJvdW5kYXJ5IChleGNsdXNpdmUpXG4gICAqL1xuICBhc3luYyAqc2NhbihwcmVmaXg6IHN0cmluZyB8IEJ1ZmZlciwgZW5kPzogc3RyaW5nIHwgQnVmZmVyKTogQXN5bmNHZW5lcmF0b3I8W0J1ZmZlciwgQnVmZmVyXT4ge1xuICAgIHRoaXMuX2Vuc3VyZUFjdGl2ZSgpO1xuICAgIC8vIERlbGVnYXRlIHRvIGRhdGFiYXNlJ3Mgc2NhbiBtZXRob2RcbiAgICAvLyBUcmFuc2FjdGlvbmFsIGlzb2xhdGlvbiBpcyBtYWludGFpbmVkIGJ5IHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2VcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGVudHJ5IG9mIHRoaXMuX2RiLnNjYW5HZW5lcmF0b3IocHJlZml4LCBlbmQpKSB7XG4gICAgICB5aWVsZCBlbnRyeTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdmFsdWUgYnkgcGF0aCB3aXRoaW4gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIGdldFBhdGgocGF0aFN0cjogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgdGhpcy5fZW5zdXJlQWN0aXZlKCk7XG4gICAgcmV0dXJuIHRoaXMuX2RiLmdldFBhdGgocGF0aFN0cik7XG4gIH1cblxuICAvKipcbiAgICogUHV0IGEgdmFsdWUgYXQgYSBwYXRoIHdpdGhpbiB0aGlzIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgcHV0UGF0aChwYXRoU3RyOiBzdHJpbmcsIHZhbHVlOiBCdWZmZXIgfCBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9lbnN1cmVBY3RpdmUoKTtcbiAgICByZXR1cm4gdGhpcy5fZGIucHV0UGF0aChwYXRoU3RyLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0IHRoZSB0cmFuc2FjdGlvbi5cbiAgICogXG4gICAqIEFmdGVyIGNvbW1pdHRpbmcsIGFuIG9wdGlvbmFsIGNoZWNrcG9pbnQgaXMgdHJpZ2dlcmVkIHRvIGVuc3VyZSB3cml0ZXNcbiAgICogYXJlIGR1cmFibGUuIFRoaXMgcHJldmVudHMgcmFjZSBjb25kaXRpb25zIHdoZXJlIHN1YnNlcXVlbnQgcmVhZHMgbWlnaHRcbiAgICogbm90IHNlZSBjb21taXR0ZWQgZGF0YSBkdWUgdG8gYXN5bmMgZmx1c2ggdGltaW5nLlxuICAgKi9cbiAgYXN5bmMgY29tbWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2Vuc3VyZUFjdGl2ZSgpO1xuICAgIGlmICh0aGlzLl90eG5JZCAhPT0gbnVsbCkge1xuICAgICAgYXdhaXQgdGhpcy5fZGJbJ19jb21taXRUcmFuc2FjdGlvbiddKHRoaXMuX3R4bklkKTtcbiAgICAgIC8vIFRyaWdnZXIgY2hlY2twb2ludCB0byBlbnN1cmUgZHVyYWJpbGl0eSAoYWRkcmVzc2VzIHJhY2UgY29uZGl0aW9uKVxuICAgICAgLy8gTm90ZTogVGhpcyBpcyBhIHRyYWRlLW9mZiBiZXR3ZWVuIGNvbnNpc3RlbmN5IGFuZCBwZXJmb3JtYW5jZS5cbiAgICAgIC8vIEZvciBoaWdoLXRocm91Z2hwdXQgc2NlbmFyaW9zLCBjb25zaWRlciBiYXRjaGluZyBjaGVja3BvaW50cy5cbiAgICAgIGF3YWl0IHRoaXMuX2RiLmNoZWNrcG9pbnQoKTtcbiAgICB9XG4gICAgdGhpcy5fY29tbWl0dGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydC9yb2xsYmFjayB0aGUgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBhc3luYyBhYm9ydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fY29tbWl0dGVkIHx8IHRoaXMuX2Fib3J0ZWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5fdHhuSWQgIT09IG51bGwpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2RiWydfYWJvcnRUcmFuc2FjdGlvbiddKHRoaXMuX3R4bklkKTtcbiAgICB9XG4gICAgdGhpcy5fYWJvcnRlZCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIF9lbnN1cmVBY3RpdmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NvbW1pdHRlZCkge1xuICAgICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIGFscmVhZHkgY29tbWl0dGVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9hYm9ydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gYWxyZWFkeSBhYm9ydGVkJyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU29jaERCIERhdGFiYXNlIGNsaWVudC5cbiAqXG4gKiBQcm92aWRlcyBhY2Nlc3MgdG8gU29jaERCIHdpdGggZnVsbCB0cmFuc2FjdGlvbiBzdXBwb3J0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBEYXRhYmFzZSB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqXG4gKiAvLyBPcGVuIGEgZGF0YWJhc2VcbiAqIGNvbnN0IGRiID0gYXdhaXQgRGF0YWJhc2Uub3BlbignLi9teV9kYXRhYmFzZScpO1xuICpcbiAqIC8vIFNpbXBsZSBrZXktdmFsdWUgb3BlcmF0aW9uc1xuICogYXdhaXQgZGIucHV0KEJ1ZmZlci5mcm9tKCd1c2VyOjEyMycpLCBCdWZmZXIuZnJvbSgne1wibmFtZVwiOiBcIkFsaWNlXCJ9JykpO1xuICogY29uc3QgdmFsdWUgPSBhd2FpdCBkYi5nZXQoQnVmZmVyLmZyb20oJ3VzZXI6MTIzJykpO1xuICpcbiAqIC8vIFBhdGgtbmF0aXZlIEFQSVxuICogYXdhaXQgZGIucHV0UGF0aCgndXNlcnMvYWxpY2UvZW1haWwnLCBCdWZmZXIuZnJvbSgnYWxpY2VAZXhhbXBsZS5jb20nKSk7XG4gKiBjb25zdCBlbWFpbCA9IGF3YWl0IGRiLmdldFBhdGgoJ3VzZXJzL2FsaWNlL2VtYWlsJyk7XG4gKlxuICogLy8gVHJhbnNhY3Rpb25zXG4gKiBhd2FpdCBkYi53aXRoVHJhbnNhY3Rpb24oYXN5bmMgKHR4bikgPT4ge1xuICogICBhd2FpdCB0eG4ucHV0KEJ1ZmZlci5mcm9tKCdrZXkxJyksIEJ1ZmZlci5mcm9tKCd2YWx1ZTEnKSk7XG4gKiAgIGF3YWl0IHR4bi5wdXQoQnVmZmVyLmZyb20oJ2tleTInKSwgQnVmZmVyLmZyb20oJ3ZhbHVlMicpKTtcbiAqIH0pO1xuICpcbiAqIC8vIENsZWFuIHVwXG4gKiBhd2FpdCBkYi5jbG9zZSgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZSB7XG4gIHByaXZhdGUgX2NsaWVudDogSXBjQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2NvbmZpZzogRGF0YWJhc2VDb25maWc7XG4gIHByaXZhdGUgX2Nsb3NlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9lbWJlZGRlZFNlcnZlclN0YXJ0ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGNvbmZpZzogRGF0YWJhc2VDb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSB7XG4gICAgICBjcmVhdGVJZk1pc3Npbmc6IHRydWUsXG4gICAgICB3YWxFbmFibGVkOiB0cnVlLFxuICAgICAgc3luY01vZGU6ICdub3JtYWwnLFxuICAgICAgbWVtdGFibGVTaXplQnl0ZXM6IDY0ICogMTAyNCAqIDEwMjQsXG4gICAgICBlbWJlZGRlZDogdHJ1ZSwgIC8vIERlZmF1bHQgdG8gZW1iZWRkZWQgbW9kZVxuICAgICAgLi4uY29uZmlnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogT3BlbiBhIGRhdGFiYXNlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckNvbmZpZyAtIFBhdGggdG8gdGhlIGRhdGFiYXNlIGRpcmVjdG9yeSBvciBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyBBIG5ldyBEYXRhYmFzZSBpbnN0YW5jZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFNpbXBsZSB1c2FnZSAoZW1iZWRkZWQgbW9kZSAtIHN0YXJ0cyBzZXJ2ZXIgYXV0b21hdGljYWxseSlcbiAgICogY29uc3QgZGIgPSBhd2FpdCBEYXRhYmFzZS5vcGVuKCcuL215X2RhdGFiYXNlJyk7XG4gICAqXG4gICAqIC8vIFdpdGggY29uZmlndXJhdGlvblxuICAgKiBjb25zdCBkYiA9IGF3YWl0IERhdGFiYXNlLm9wZW4oe1xuICAgKiAgIHBhdGg6ICcuL215X2RhdGFiYXNlJyxcbiAgICogICB3YWxFbmFibGVkOiB0cnVlLFxuICAgKiAgIHN5bmNNb2RlOiAnZnVsbCcsXG4gICAqIH0pO1xuICAgKiBcbiAgICogLy8gQ29ubmVjdCB0byBleGlzdGluZyBleHRlcm5hbCBzZXJ2ZXJcbiAgICogY29uc3QgZGIgPSBhd2FpdCBEYXRhYmFzZS5vcGVuKHtcbiAgICogICBwYXRoOiAnLi9teV9kYXRhYmFzZScsXG4gICAqICAgZW1iZWRkZWQ6IGZhbHNlLCAgLy8gRG9uJ3Qgc3RhcnQgZW1iZWRkZWQgc2VydmVyXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHN0YXRpYyBhc3luYyBvcGVuKHBhdGhPckNvbmZpZzogc3RyaW5nIHwgRGF0YWJhc2VDb25maWcpOiBQcm9taXNlPERhdGFiYXNlPiB7XG4gICAgY29uc3QgY29uZmlnOiBEYXRhYmFzZUNvbmZpZyA9XG4gICAgICB0eXBlb2YgcGF0aE9yQ29uZmlnID09PSAnc3RyaW5nJyA/IHsgcGF0aDogcGF0aE9yQ29uZmlnIH0gOiBwYXRoT3JDb25maWc7XG5cbiAgICAvLyBFbnN1cmUgZGF0YWJhc2UgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmIChjb25maWcuY3JlYXRlSWZNaXNzaW5nICE9PSBmYWxzZSkge1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZy5wYXRoKSkge1xuICAgICAgICBmcy5ta2RpclN5bmMoY29uZmlnLnBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRiID0gbmV3IERhdGFiYXNlKGNvbmZpZyk7XG5cbiAgICAvLyBTdGFydCBlbWJlZGRlZCBzZXJ2ZXIgaWYgY29uZmlndXJlZCAoZGVmYXVsdDogdHJ1ZSlcbiAgICBsZXQgc29ja2V0UGF0aDogc3RyaW5nO1xuICAgIGlmIChkYi5fY29uZmlnLmVtYmVkZGVkICE9PSBmYWxzZSkge1xuICAgICAgLy8gU3RhcnQgZW1iZWRkZWQgc2VydmVyIGFuZCBnZXQgc29ja2V0IHBhdGhcbiAgICAgIHNvY2tldFBhdGggPSBhd2FpdCBzdGFydEVtYmVkZGVkU2VydmVyKGNvbmZpZy5wYXRoKTtcbiAgICAgIGRiLl9lbWJlZGRlZFNlcnZlclN0YXJ0ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb25uZWN0IHRvIGV4aXN0aW5nIHNlcnZlciBzb2NrZXRcbiAgICAgIHNvY2tldFBhdGggPSBwYXRoLmpvaW4oY29uZmlnLnBhdGgsICdzb2NoZGIuc29jaycpO1xuICAgIH1cblxuICAgIGRiLl9jbGllbnQgPSBhd2FpdCBJcGNDbGllbnQuY29ubmVjdChzb2NrZXRQYXRoKTtcblxuICAgIC8vIFRyYWNrIGRhdGFiYXNlIG9wZW4gZXZlbnQgKG9ubHkgYW5hbHl0aWNzIGV2ZW50IHdlIHNlbmQpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdHJhY2tEYXRhYmFzZU9wZW4gfSA9IGF3YWl0IGltcG9ydCgnLi9hbmFseXRpY3MuanMnKTtcbiAgICAgIGF3YWl0IHRyYWNrRGF0YWJhc2VPcGVuKGNvbmZpZy5wYXRoLCAnZW1iZWRkZWQnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE5ldmVyIGxldCBhbmFseXRpY3MgYnJlYWsgZGF0YWJhc2Ugb3BlcmF0aW9uc1xuICAgIH1cblxuICAgIHJldHVybiBkYjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB2YWx1ZSBieSBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IHRvIGxvb2sgdXAgKEJ1ZmZlciBvciBzdHJpbmcpXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBhcyBhIEJ1ZmZlciwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICovXG4gIGFzeW5jIGdldChrZXk6IEJ1ZmZlciB8IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgIHRoaXMuX2Vuc3VyZU9wZW4oKTtcbiAgICBjb25zdCBrZXlCdWYgPSB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyA/IEJ1ZmZlci5mcm9tKGtleSkgOiBrZXk7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudCEuZ2V0KGtleUJ1Zik7XG4gIH1cblxuICAvKipcbiAgICogUHV0IGEga2V5LXZhbHVlIHBhaXIuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IChCdWZmZXIgb3Igc3RyaW5nKVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgKEJ1ZmZlciBvciBzdHJpbmcpXG4gICAqL1xuICBhc3luYyBwdXQoa2V5OiBCdWZmZXIgfCBzdHJpbmcsIHZhbHVlOiBCdWZmZXIgfCBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9lbnN1cmVPcGVuKCk7XG4gICAgY29uc3Qga2V5QnVmID0gdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgPyBCdWZmZXIuZnJvbShrZXkpIDoga2V5O1xuICAgIGNvbnN0IHZhbHVlQnVmID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IEJ1ZmZlci5mcm9tKHZhbHVlKSA6IHZhbHVlO1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQhLnB1dChrZXlCdWYsIHZhbHVlQnVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IHRvIGRlbGV0ZSAoQnVmZmVyIG9yIHN0cmluZylcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShrZXk6IEJ1ZmZlciB8IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2Vuc3VyZU9wZW4oKTtcbiAgICBjb25zdCBrZXlCdWYgPSB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyA/IEJ1ZmZlci5mcm9tKGtleSkgOiBrZXk7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudCEuZGVsZXRlKGtleUJ1Zik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdmFsdWUgYnkgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhTdHIgLSBUaGUgcGF0aCAoZS5nLiwgXCJ1c2Vycy9hbGljZS9lbWFpbFwiKVxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgYXMgYSBCdWZmZXIsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAqL1xuICBhc3luYyBnZXRQYXRoKHBhdGhTdHI6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgIHRoaXMuX2Vuc3VyZU9wZW4oKTtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50IS5nZXRQYXRoKHBhdGhTdHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1dCBhIHZhbHVlIGF0IGEgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhTdHIgLSBUaGUgcGF0aCAoZS5nLiwgXCJ1c2Vycy9hbGljZS9lbWFpbFwiKVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgKEJ1ZmZlciBvciBzdHJpbmcpXG4gICAqL1xuICBhc3luYyBwdXRQYXRoKHBhdGhTdHI6IHN0cmluZywgdmFsdWU6IEJ1ZmZlciB8IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2Vuc3VyZU9wZW4oKTtcbiAgICBjb25zdCB2YWx1ZUJ1ZiA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBCdWZmZXIuZnJvbSh2YWx1ZSkgOiB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50IS5wdXRQYXRoKHBhdGhTdHIsIHZhbHVlQnVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBxdWVyeSBidWlsZGVyIGZvciB0aGUgZ2l2ZW4gcGF0aCBwcmVmaXguXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoUHJlZml4IC0gVGhlIHBhdGggcHJlZml4IHRvIHF1ZXJ5IChlLmcuLCBcInVzZXJzL1wiKVxuICAgKiBAcmV0dXJucyBBIFF1ZXJ5IGJ1aWxkZXIgaW5zdGFuY2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHRzID0gYXdhaXQgZGIucXVlcnkoJ3VzZXJzLycpXG4gICAqICAgLmxpbWl0KDEwKVxuICAgKiAgIC5zZWxlY3QoWyduYW1lJywgJ2VtYWlsJ10pXG4gICAqICAgLmV4ZWN1dGUoKTtcbiAgICogYGBgXG4gICAqL1xuICBxdWVyeShwYXRoUHJlZml4OiBzdHJpbmcpOiBRdWVyeSB7XG4gICAgdGhpcy5fZW5zdXJlT3BlbigpO1xuICAgIHJldHVybiBuZXcgUXVlcnkodGhpcy5fY2xpZW50ISwgcGF0aFByZWZpeCk7XG4gIH1cblxuICAvKipcbiAgICogU2NhbiBmb3Iga2V5cyB3aXRoIGEgcHJlZml4LCByZXR1cm5pbmcga2V5LXZhbHVlIHBhaXJzLlxuICAgKiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kIGZvciBzaW1wbGUgcHJlZml4LWJhc2VkIGl0ZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHByZWZpeCAtIFRoZSBwcmVmaXggdG8gc2NhbiBmb3IgKGUuZy4sIFwidXNlcnMvXCIsIFwidGVuYW50cy90ZW5hbnQxL1wiKVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBrZXktdmFsdWUgcGFpcnNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHRzID0gYXdhaXQgZGIuc2NhbigndGVuYW50cy90ZW5hbnQxLycpO1xuICAgKiBmb3IgKGNvbnN0IHsga2V5LCB2YWx1ZSB9IG9mIHJlc3VsdHMpIHtcbiAgICogICBjb25zb2xlLmxvZyhgJHtrZXkudG9TdHJpbmcoKX06ICR7dmFsdWUudG9TdHJpbmcoKX1gKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNjYW4ocHJlZml4OiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PHsga2V5OiBCdWZmZXI7IHZhbHVlOiBCdWZmZXIgfT4+IHtcbiAgICB0aGlzLl9lbnN1cmVPcGVuKCk7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudCEuc2NhbihwcmVmaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYW4gZm9yIGtleXMgd2l0aCBhIHByZWZpeCB1c2luZyBhbiBhc3luYyBnZW5lcmF0b3IuXG4gICAqIFRoaXMgYWxsb3dzIGZvciBtZW1vcnktZWZmaWNpZW50IGl0ZXJhdGlvbiBvdmVyIGxhcmdlIHJlc3VsdCBzZXRzLlxuICAgKlxuICAgKiBAcGFyYW0gcHJlZml4IC0gVGhlIHByZWZpeCB0byBzY2FuIGZvclxuICAgKiBAcGFyYW0gZW5kIC0gT3B0aW9uYWwgZW5kIGJvdW5kYXJ5IChleGNsdXNpdmUpXG4gICAqIEByZXR1cm5zIEFzeW5jIGdlbmVyYXRvciB5aWVsZGluZyBba2V5LCB2YWx1ZV0gdHVwbGVzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogZm9yIGF3YWl0IChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZGIuc2NhbkdlbmVyYXRvcigndXNlcnMvJykpIHtcbiAgICogICBjb25zb2xlLmxvZyhgJHtrZXkudG9TdHJpbmcoKX06ICR7dmFsdWUudG9TdHJpbmcoKX1gKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jICpzY2FuR2VuZXJhdG9yKHByZWZpeDogc3RyaW5nIHwgQnVmZmVyLCBlbmQ/OiBzdHJpbmcgfCBCdWZmZXIpOiBBc3luY0dlbmVyYXRvcjxbQnVmZmVyLCBCdWZmZXJdPiB7XG4gICAgdGhpcy5fZW5zdXJlT3BlbigpO1xuICAgIGNvbnN0IHByZWZpeEJ1ZiA9IHR5cGVvZiBwcmVmaXggPT09ICdzdHJpbmcnID8gQnVmZmVyLmZyb20ocHJlZml4KSA6IHByZWZpeDtcbiAgICBjb25zdCBlbmRCdWYgPSBlbmQgPyAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycgPyBCdWZmZXIuZnJvbShlbmQpIDogZW5kKSA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLl9jbGllbnQhLnNjYW4ocHJlZml4QnVmLnRvU3RyaW5nKCkpO1xuICAgIGZvciAoY29uc3QgeyBrZXksIHZhbHVlIH0gb2YgcmVzdWx0cykge1xuICAgICAgLy8gRmlsdGVyIGJ5IGVuZCBib3VuZGFyeSBpZiBwcm92aWRlZFxuICAgICAgaWYgKGVuZEJ1ZiAmJiBCdWZmZXIuY29tcGFyZShrZXksIGVuZEJ1ZikgPj0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHlpZWxkIFtrZXksIHZhbHVlXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBvcGVyYXRpb25zIHdpdGhpbiBhIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBUaGUgdHJhbnNhY3Rpb24gYXV0b21hdGljYWxseSBjb21taXRzIG9uIHN1Y2Nlc3Mgb3IgYWJvcnRzIG9uIGVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gZm4gLSBBc3luYyBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGEgVHJhbnNhY3Rpb24gb2JqZWN0XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgZGIud2l0aFRyYW5zYWN0aW9uKGFzeW5jICh0eG4pID0+IHtcbiAgICogICBhd2FpdCB0eG4ucHV0KEJ1ZmZlci5mcm9tKCdrZXkxJyksIEJ1ZmZlci5mcm9tKCd2YWx1ZTEnKSk7XG4gICAqICAgYXdhaXQgdHhuLnB1dChCdWZmZXIuZnJvbSgna2V5MicpLCBCdWZmZXIuZnJvbSgndmFsdWUyJykpO1xuICAgKiAgIC8vIEF1dG9tYXRpY2FsbHkgY29tbWl0c1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB3aXRoVHJhbnNhY3Rpb248VD4oZm46ICh0eG46IFRyYW5zYWN0aW9uKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgdGhpcy5fZW5zdXJlT3BlbigpO1xuICAgIGNvbnN0IHR4biA9IG5ldyBUcmFuc2FjdGlvbih0aGlzKTtcbiAgICBhd2FpdCB0eG4uYmVnaW4oKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4odHhuKTtcbiAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgQSBuZXcgVHJhbnNhY3Rpb24gaW5zdGFuY2VcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHdpdGhUcmFuc2FjdGlvbigpIGZvciBhdXRvbWF0aWMgY29tbWl0L2Fib3J0IGhhbmRsaW5nXG4gICAqL1xuICBhc3luYyB0cmFuc2FjdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgdGhpcy5fZW5zdXJlT3BlbigpO1xuICAgIGNvbnN0IHR4biA9IG5ldyBUcmFuc2FjdGlvbih0aGlzKTtcbiAgICBhd2FpdCB0eG4uYmVnaW4oKTtcbiAgICByZXR1cm4gdHhuO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIGEgY2hlY2twb2ludCB0byBwZXJzaXN0IG1lbXRhYmxlIHRvIGRpc2suXG4gICAqL1xuICBhc3luYyBjaGVja3BvaW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2Vuc3VyZU9wZW4oKTtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50IS5jaGVja3BvaW50KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHN0b3JhZ2Ugc3RhdGlzdGljcy5cbiAgICovXG4gIGFzeW5jIHN0YXRzKCk6IFByb21pc2U8e1xuICAgIG1lbXRhYmxlU2l6ZUJ5dGVzOiBudW1iZXI7XG4gICAgd2FsU2l6ZUJ5dGVzOiBudW1iZXI7XG4gICAgYWN0aXZlVHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gIH0+IHtcbiAgICB0aGlzLl9lbnN1cmVPcGVuKCk7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudCEuc3RhdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgU1FMIHF1ZXJ5LlxuICAgKiBcbiAgICogU29jaERCIHN1cHBvcnRzIGEgc3Vic2V0IG9mIFNRTCBmb3IgcmVsYXRpb25hbCBkYXRhIHN0b3JlZCBvbiB0b3Agb2YgXG4gICAqIHRoZSBrZXktdmFsdWUgZW5naW5lLiBUYWJsZXMgYW5kIHJvd3MgYXJlIHN0b3JlZCBhczpcbiAgICogLSBTY2hlbWE6IF9zcWwvdGFibGVzL3t0YWJsZV9uYW1lfS9zY2hlbWFcbiAgICogLSBSb3dzOiBfc3FsL3RhYmxlcy97dGFibGVfbmFtZX0vcm93cy97cm93X2lkfVxuICAgKiBcbiAgICogU3VwcG9ydGVkIFNRTDpcbiAgICogLSBDUkVBVEUgVEFCTEUgdGFibGVfbmFtZSAoY29sMSBUWVBFLCBjb2wyIFRZUEUsIC4uLilcbiAgICogLSBEUk9QIFRBQkxFIHRhYmxlX25hbWVcbiAgICogLSBJTlNFUlQgSU5UTyB0YWJsZV9uYW1lIChjb2xzKSBWQUxVRVMgKHZhbHMpXG4gICAqIC0gU0VMRUNUIGNvbHMgRlJPTSB0YWJsZV9uYW1lIFtXSEVSRSAuLi5dIFtPUkRFUiBCWSAuLi5dIFtMSU1JVCAuLi5dXG4gICAqIC0gVVBEQVRFIHRhYmxlX25hbWUgU0VUIGNvbD12YWwgW1dIRVJFIC4uLl1cbiAgICogLSBERUxFVEUgRlJPTSB0YWJsZV9uYW1lIFtXSEVSRSAuLi5dXG4gICAqIFxuICAgKiBTdXBwb3J0ZWQgdHlwZXM6IElOVCwgVEVYVCwgRkxPQVQsIEJPT0wsIEJMT0JcbiAgICogXG4gICAqIEBwYXJhbSBzcWwgLSBTUUwgcXVlcnkgc3RyaW5nXG4gICAqIEByZXR1cm5zIFNRTFF1ZXJ5UmVzdWx0IHdpdGggcm93cyBhbmQgbWV0YWRhdGFcbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQ3JlYXRlIGEgdGFibGVcbiAgICogYXdhaXQgZGIuZXhlY3V0ZShcIkNSRUFURSBUQUJMRSB1c2VycyAoaWQgSU5UIFBSSU1BUlkgS0VZLCBuYW1lIFRFWFQsIGFnZSBJTlQpXCIpO1xuICAgKiBcbiAgICogLy8gSW5zZXJ0IGRhdGFcbiAgICogYXdhaXQgZGIuZXhlY3V0ZShcIklOU0VSVCBJTlRPIHVzZXJzIChpZCwgbmFtZSwgYWdlKSBWQUxVRVMgKDEsICdBbGljZScsIDMwKVwiKTtcbiAgICogXG4gICAqIC8vIFF1ZXJ5IGRhdGFcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIuZXhlY3V0ZShcIlNFTEVDVCAqIEZST00gdXNlcnMgV0hFUkUgYWdlID4gMjZcIik7XG4gICAqIHJlc3VsdC5yb3dzLmZvckVhY2gocm93ID0+IGNvbnNvbGUubG9nKHJvdykpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoc3FsOiBzdHJpbmcpOiBQcm9taXNlPFNRTFF1ZXJ5UmVzdWx0PiB7XG4gICAgdGhpcy5fZW5zdXJlT3BlbigpO1xuXG4gICAgLy8gSW1wb3J0IHRoZSBTUUwgZXhlY3V0b3JcbiAgICBjb25zdCB7IFNRTEV4ZWN1dG9yIH0gPSBhd2FpdCBpbXBvcnQoJy4vc3FsLWVuZ2luZS5qcycpO1xuXG4gICAgLy8gQ3JlYXRlIGEgZGF0YWJhc2UgYWRhcHRlciBmb3IgdGhlIFNRTCBleGVjdXRvclxuICAgIGNvbnN0IGRiQWRhcHRlciA9IHtcbiAgICAgIGdldDogKGtleTogQnVmZmVyIHwgc3RyaW5nKSA9PiB0aGlzLmdldChrZXkpLFxuICAgICAgcHV0OiAoa2V5OiBCdWZmZXIgfCBzdHJpbmcsIHZhbHVlOiBCdWZmZXIgfCBzdHJpbmcpID0+IHRoaXMucHV0KGtleSwgdmFsdWUpLFxuICAgICAgZGVsZXRlOiAoa2V5OiBCdWZmZXIgfCBzdHJpbmcpID0+IHRoaXMuZGVsZXRlKGtleSksXG4gICAgICBzY2FuOiAocHJlZml4OiBzdHJpbmcpID0+IHRoaXMuc2NhbihwcmVmaXgpLFxuICAgIH07XG5cbiAgICBjb25zdCBleGVjdXRvciA9IG5ldyBTUUxFeGVjdXRvcihkYkFkYXB0ZXIpO1xuICAgIHJldHVybiBleGVjdXRvci5leGVjdXRlKHNxbCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFN0YXRpYyBTZXJpYWxpemF0aW9uIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHJlY29yZHMgdG8gVE9PTiBmb3JtYXQgZm9yIHRva2VuLWVmZmljaWVudCBMTE0gY29udGV4dC5cbiAgICogXG4gICAqIFRPT04gZm9ybWF0IGFjaGlldmVzIDQwLTY2JSB0b2tlbiByZWR1Y3Rpb24gY29tcGFyZWQgdG8gSlNPTiBieSB1c2luZ1xuICAgKiBhIGNvbHVtbmFyIHRleHQgZm9ybWF0IHdpdGggbWluaW1hbCBzeW50YXguXG4gICAqIFxuICAgKiBAcGFyYW0gdGFibGVOYW1lIC0gTmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0gcmVjb3JkcyAtIEFycmF5IG9mIG9iamVjdHMgd2l0aCB0aGUgZGF0YVxuICAgKiBAcGFyYW0gZmllbGRzIC0gT3B0aW9uYWwgYXJyYXkgb2YgZmllbGQgbmFtZXMgdG8gaW5jbHVkZVxuICAgKiBAcmV0dXJucyBUT09OLWZvcm1hdHRlZCBzdHJpbmdcbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVjb3JkcyA9IFtcbiAgICogICB7IGlkOiAxLCBuYW1lOiAnQWxpY2UnLCBlbWFpbDogJ2FsaWNlQGV4LmNvbScgfSxcbiAgICogICB7IGlkOiAyLCBuYW1lOiAnQm9iJywgZW1haWw6ICdib2JAZXguY29tJyB9XG4gICAqIF07XG4gICAqIGNvbnNvbGUubG9nKERhdGFiYXNlLnRvVG9vbigndXNlcnMnLCByZWNvcmRzLCBbJ25hbWUnLCAnZW1haWwnXSkpO1xuICAgKiAvLyB1c2Vyc1syXXtuYW1lLGVtYWlsfTpBbGljZSxhbGljZUBleC5jb207Qm9iLGJvYkBleC5jb21cbiAgICogYGBgXG4gICAqL1xuICBzdGF0aWMgdG9Ub29uKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIHJlY29yZHM6IEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+LFxuICAgIGZpZWxkcz86IHN0cmluZ1tdXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKCFyZWNvcmRzIHx8IHJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYCR7dGFibGVOYW1lfVswXXt9OmA7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIGZpZWxkcyBmcm9tIGZpcnN0IHJlY29yZCBpZiBub3Qgc3BlY2lmaWVkXG4gICAgY29uc3QgdXNlRmllbGRzID0gZmllbGRzID8/IE9iamVjdC5rZXlzKHJlY29yZHNbMF0pO1xuXG4gICAgLy8gQnVpbGQgaGVhZGVyOiB0YWJsZVtjb3VudF17ZmllbGQxLGZpZWxkMiwuLi59OlxuICAgIGNvbnN0IGhlYWRlciA9IGAke3RhYmxlTmFtZX1bJHtyZWNvcmRzLmxlbmd0aH1deyR7dXNlRmllbGRzLmpvaW4oJywnKX19OmA7XG5cbiAgICAvLyBFc2NhcGUgdmFsdWVzIGNvbnRhaW5pbmcgZGVsaW1pdGVyc1xuICAgIGNvbnN0IGVzY2FwZVZhbHVlID0gKHY6IGFueSk6IHN0cmluZyA9PiB7XG4gICAgICBjb25zdCBzID0gdiAhPSBudWxsID8gU3RyaW5nKHYpIDogJyc7XG4gICAgICBpZiAocy5pbmNsdWRlcygnLCcpIHx8IHMuaW5jbHVkZXMoJzsnKSB8fCBzLmluY2x1ZGVzKCdcXG4nKSkge1xuICAgICAgICByZXR1cm4gYFwiJHtzfVwiYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzO1xuICAgIH07XG5cbiAgICAvLyBCdWlsZCByb3dzOiB2YWx1ZTEsdmFsdWUyO3ZhbHVlMSx2YWx1ZTI7Li4uXG4gICAgY29uc3Qgcm93cyA9IHJlY29yZHNcbiAgICAgIC5tYXAociA9PiB1c2VGaWVsZHMubWFwKGYgPT4gZXNjYXBlVmFsdWUocltmXSkpLmpvaW4oJywnKSlcbiAgICAgIC5qb2luKCc7Jyk7XG5cbiAgICByZXR1cm4gaGVhZGVyICsgcm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHJlY29yZHMgdG8gSlNPTiBmb3JtYXQgZm9yIGVhc3kgYXBwbGljYXRpb24gZGVjb2RpbmcuXG4gICAqIFxuICAgKiBXaGlsZSBUT09OIGZvcm1hdCBpcyBvcHRpbWl6ZWQgZm9yIExMTSBjb250ZXh0ICg0MC02NiUgdG9rZW4gcmVkdWN0aW9uKSxcbiAgICogSlNPTiBpcyBvZnRlbiBlYXNpZXIgZm9yIGFwcGxpY2F0aW9ucyB0byBwYXJzZS4gVXNlIHRoaXMgbWV0aG9kIHdoZW5cbiAgICogdGhlIG91dHB1dCB3aWxsIGJlIGNvbnN1bWVkIGJ5IGFwcGxpY2F0aW9uIGNvZGUgcmF0aGVyIHRoYW4gTExNcy5cbiAgICogXG4gICAqIEBwYXJhbSB0YWJsZU5hbWUgLSBOYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSByZWNvcmRzIC0gQXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHRoZSBkYXRhXG4gICAqIEBwYXJhbSBmaWVsZHMgLSBPcHRpb25hbCBhcnJheSBvZiBmaWVsZCBuYW1lcyB0byBpbmNsdWRlXG4gICAqIEBwYXJhbSBjb21wYWN0IC0gSWYgdHJ1ZSAoZGVmYXVsdCksIG91dHB1dHMgbWluaWZpZWQgSlNPTlxuICAgKiBAcmV0dXJucyBKU09OLWZvcm1hdHRlZCBzdHJpbmdcbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVjb3JkcyA9IFtcbiAgICogICB7IGlkOiAxLCBuYW1lOiAnQWxpY2UnIH0sXG4gICAqICAgeyBpZDogMiwgbmFtZTogJ0JvYicgfVxuICAgKiBdO1xuICAgKiBjb25zb2xlLmxvZyhEYXRhYmFzZS50b0pzb24oJ3VzZXJzJywgcmVjb3JkcykpO1xuICAgKiAvLyB7XCJ0YWJsZVwiOlwidXNlcnNcIixcImNvdW50XCI6MixcInJlY29yZHNcIjpbe1wiaWRcIjoxLFwibmFtZVwiOlwiQWxpY2VcIn0se1wiaWRcIjoyLFwibmFtZVwiOlwiQm9iXCJ9XX1cbiAgICogYGBgXG4gICAqL1xuICBzdGF0aWMgdG9Kc29uKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIHJlY29yZHM6IEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+LFxuICAgIGZpZWxkcz86IHN0cmluZ1tdLFxuICAgIGNvbXBhY3Q6IGJvb2xlYW4gPSB0cnVlXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKCFyZWNvcmRzIHx8IHJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB0YWJsZTogdGFibGVOYW1lLCBjb3VudDogMCwgcmVjb3JkczogW10gfSk7XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIGZpZWxkcyBpZiBzcGVjaWZpZWRcbiAgICBjb25zdCBmaWx0ZXJlZFJlY29yZHMgPSBmaWVsZHNcbiAgICAgID8gcmVjb3Jkcy5tYXAociA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBmaWVsZHMpIHtcbiAgICAgICAgICBmaWx0ZXJlZFtmXSA9IHJbZl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkO1xuICAgICAgfSlcbiAgICAgIDogcmVjb3JkcztcblxuICAgIGNvbnN0IG91dHB1dCA9IHtcbiAgICAgIHRhYmxlOiB0YWJsZU5hbWUsXG4gICAgICBjb3VudDogZmlsdGVyZWRSZWNvcmRzLmxlbmd0aCxcbiAgICAgIHJlY29yZHM6IGZpbHRlcmVkUmVjb3JkcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbXBhY3QgPyBKU09OLnN0cmluZ2lmeShvdXRwdXQpIDogSlNPTi5zdHJpbmdpZnkob3V0cHV0LCBudWxsLCAyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhIEpTT04gZm9ybWF0IHN0cmluZyBiYWNrIHRvIHN0cnVjdHVyZWQgZGF0YS5cbiAgICogXG4gICAqIEBwYXJhbSBqc29uU3RyIC0gSlNPTi1mb3JtYXR0ZWQgc3RyaW5nIChmcm9tIHRvSnNvbilcbiAgICogQHJldHVybnMgT2JqZWN0IHdpdGggdGFibGUsIGZpZWxkcywgYW5kIHJlY29yZHNcbiAgICovXG4gIHN0YXRpYyBmcm9tSnNvbihqc29uU3RyOiBzdHJpbmcpOiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICBmaWVsZHM6IHN0cmluZ1tdO1xuICAgIHJlY29yZHM6IEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+O1xuICB9IHtcbiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShqc29uU3RyKTtcbiAgICBjb25zdCB0YWJsZSA9IGRhdGEudGFibGUgPz8gJ3Vua25vd24nO1xuICAgIGNvbnN0IHJlY29yZHMgPSBkYXRhLnJlY29yZHMgPz8gW107XG4gICAgY29uc3QgZmllbGRzID0gcmVjb3Jkcy5sZW5ndGggPiAwID8gT2JqZWN0LmtleXMocmVjb3Jkc1swXSkgOiBbXTtcblxuICAgIHJldHVybiB7IHRhYmxlLCBmaWVsZHMsIHJlY29yZHMgfTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gR3JhcGggT3ZlcmxheSBPcGVyYXRpb25zXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQWRkIGEgbm9kZSB0byB0aGUgZ3JhcGggb3ZlcmxheS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWVzcGFjZSAtIE5hbWVzcGFjZSBmb3IgdGhlIGdyYXBoXG4gICAqIEBwYXJhbSBub2RlSWQgLSBVbmlxdWUgbm9kZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSBub2RlVHlwZSAtIFR5cGUgb2Ygbm9kZSAoZS5nLiwgXCJwZXJzb25cIiwgXCJkb2N1bWVudFwiLCBcImNvbmNlcHRcIilcbiAgICogQHBhcmFtIHByb3BlcnRpZXMgLSBPcHRpb25hbCBub2RlIHByb3BlcnRpZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCBkYi5hZGROb2RlKCdkZWZhdWx0JywgJ2FsaWNlJywgJ3BlcnNvbicsIHsgcm9sZTogJ2VuZ2luZWVyJyB9KTtcbiAgICogYXdhaXQgZGIuYWRkTm9kZSgnZGVmYXVsdCcsICdwcm9qZWN0X3gnLCAncHJvamVjdCcsIHsgc3RhdHVzOiAnYWN0aXZlJyB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBhZGROb2RlKFxuICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgIG5vZGVJZDogc3RyaW5nLFxuICAgIG5vZGVUeXBlOiBzdHJpbmcsXG4gICAgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fZW5zdXJlT3BlbigpO1xuXG4gICAgY29uc3Qga2V5ID0gYF9ncmFwaC8ke25hbWVzcGFjZX0vbm9kZXMvJHtub2RlSWR9YDtcbiAgICBjb25zdCB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGlkOiBub2RlSWQsXG4gICAgICBub2RlX3R5cGU6IG5vZGVUeXBlLFxuICAgICAgcHJvcGVydGllczogcHJvcGVydGllcyB8fCB7fSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMucHV0KEJ1ZmZlci5mcm9tKGtleSksIEJ1ZmZlci5mcm9tKHZhbHVlKSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGVkZ2UgYmV0d2VlbiBub2RlcyBpbiB0aGUgZ3JhcGggb3ZlcmxheS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWVzcGFjZSAtIE5hbWVzcGFjZSBmb3IgdGhlIGdyYXBoXG4gICAqIEBwYXJhbSBmcm9tSWQgLSBTb3VyY2Ugbm9kZSBJRFxuICAgKiBAcGFyYW0gZWRnZVR5cGUgLSBUeXBlIG9mIHJlbGF0aW9uc2hpcFxuICAgKiBAcGFyYW0gdG9JZCAtIFRhcmdldCBub2RlIElEXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIC0gT3B0aW9uYWwgZWRnZSBwcm9wZXJ0aWVzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgZGIuYWRkRWRnZSgnZGVmYXVsdCcsICdhbGljZScsICd3b3Jrc19vbicsICdwcm9qZWN0X3gnKTtcbiAgICogYXdhaXQgZGIuYWRkRWRnZSgnZGVmYXVsdCcsICdhbGljZScsICdrbm93cycsICdib2InLCB7IHNpbmNlOiAnMjAyMCcgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgYWRkRWRnZShcbiAgICBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICBmcm9tSWQ6IHN0cmluZyxcbiAgICBlZGdlVHlwZTogc3RyaW5nLFxuICAgIHRvSWQ6IHN0cmluZyxcbiAgICBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9lbnN1cmVPcGVuKCk7XG5cbiAgICBjb25zdCBrZXkgPSBgX2dyYXBoLyR7bmFtZXNwYWNlfS9lZGdlcy8ke2Zyb21JZH0vJHtlZGdlVHlwZX0vJHt0b0lkfWA7XG4gICAgY29uc3QgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBmcm9tX2lkOiBmcm9tSWQsXG4gICAgICBlZGdlX3R5cGU6IGVkZ2VUeXBlLFxuICAgICAgdG9faWQ6IHRvSWQsXG4gICAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzIHx8IHt9LFxuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5wdXQoQnVmZmVyLmZyb20oa2V5KSwgQnVmZmVyLmZyb20odmFsdWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmF2ZXJzZSB0aGUgZ3JhcGggZnJvbSBhIHN0YXJ0aW5nIG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lc3BhY2UgLSBOYW1lc3BhY2UgZm9yIHRoZSBncmFwaFxuICAgKiBAcGFyYW0gc3RhcnROb2RlIC0gTm9kZSBJRCB0byBzdGFydCB0cmF2ZXJzYWwgZnJvbVxuICAgKiBAcGFyYW0gbWF4RGVwdGggLSBNYXhpbXVtIHRyYXZlcnNhbCBkZXB0aCAoZGVmYXVsdDogMTApXG4gICAqIEBwYXJhbSBvcmRlciAtIFwiYmZzXCIgZm9yIGJyZWFkdGgtZmlyc3QsIFwiZGZzXCIgZm9yIGRlcHRoLWZpcnN0XG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIG5vZGVzIGFuZCBlZGdlcyBhcnJheXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB7IG5vZGVzLCBlZGdlcyB9ID0gYXdhaXQgZGIudHJhdmVyc2UoJ2RlZmF1bHQnLCAnYWxpY2UnLCAyKTtcbiAgICogZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAqICAgY29uc29sZS5sb2coYE5vZGU6ICR7bm9kZS5pZH0gKCR7bm9kZS5ub2RlX3R5cGV9KWApO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdHJhdmVyc2UoXG4gICAgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgc3RhcnROb2RlOiBzdHJpbmcsXG4gICAgbWF4RGVwdGg6IG51bWJlciA9IDEwLFxuICAgIG9yZGVyOiAnYmZzJyB8ICdkZnMnID0gJ2JmcydcbiAgKTogUHJvbWlzZTx7IG5vZGVzOiBhbnlbXTsgZWRnZXM6IGFueVtdIH0+IHtcbiAgICB0aGlzLl9lbnN1cmVPcGVuKCk7XG5cbiAgICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qgbm9kZXM6IGFueVtdID0gW107XG4gICAgY29uc3QgZWRnZXM6IGFueVtdID0gW107XG4gICAgY29uc3QgZnJvbnRpZXI6IEFycmF5PFtzdHJpbmcsIG51bWJlcl0+ID0gW1tzdGFydE5vZGUsIDBdXTtcblxuICAgIHdoaWxlIChmcm9udGllci5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBbY3VycmVudE5vZGUsIGRlcHRoXSA9IG9yZGVyID09PSAnYmZzJ1xuICAgICAgICA/IGZyb250aWVyLnNoaWZ0KCkhXG4gICAgICAgIDogZnJvbnRpZXIucG9wKCkhO1xuXG4gICAgICBpZiAoZGVwdGggPiBtYXhEZXB0aCB8fCB2aXNpdGVkLmhhcyhjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2aXNpdGVkLmFkZChjdXJyZW50Tm9kZSk7XG5cbiAgICAgIC8vIEdldCBub2RlIGRhdGFcbiAgICAgIGNvbnN0IG5vZGVLZXkgPSBgX2dyYXBoLyR7bmFtZXNwYWNlfS9ub2Rlcy8ke2N1cnJlbnROb2RlfWA7XG4gICAgICBjb25zdCBub2RlRGF0YSA9IGF3YWl0IHRoaXMuZ2V0KEJ1ZmZlci5mcm9tKG5vZGVLZXkpKTtcbiAgICAgIGlmIChub2RlRGF0YSkge1xuICAgICAgICBub2Rlcy5wdXNoKEpTT04ucGFyc2Uobm9kZURhdGEudG9TdHJpbmcoKSkpO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgb3V0Z29pbmcgZWRnZXNcbiAgICAgIGNvbnN0IGVkZ2VQcmVmaXggPSBgX2dyYXBoLyR7bmFtZXNwYWNlfS9lZGdlcy8ke2N1cnJlbnROb2RlfS9gO1xuICAgICAgY29uc3QgZWRnZVJlc3VsdHMgPSBhd2FpdCB0aGlzLnNjYW4oZWRnZVByZWZpeCk7XG4gICAgICBmb3IgKGNvbnN0IHsgdmFsdWUgfSBvZiBlZGdlUmVzdWx0cykge1xuICAgICAgICBjb25zdCBlZGdlID0gSlNPTi5wYXJzZSh2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgZWRnZXMucHVzaChlZGdlKTtcblxuICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzKGVkZ2UudG9faWQpKSB7XG4gICAgICAgICAgZnJvbnRpZXIucHVzaChbZWRnZS50b19pZCwgZGVwdGggKyAxXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBub2RlcywgZWRnZXMgfTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU2VtYW50aWMgQ2FjaGUgT3BlcmF0aW9uc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFN0b3JlIGEgdmFsdWUgaW4gdGhlIHNlbWFudGljIGNhY2hlIHdpdGggaXRzIGVtYmVkZGluZy5cbiAgICpcbiAgICogQHBhcmFtIGNhY2hlTmFtZSAtIE5hbWUgb2YgdGhlIGNhY2hlXG4gICAqIEBwYXJhbSBrZXkgLSBDYWNoZSBrZXkgKGZvciBkaXNwbGF5L2RlYnVnZ2luZylcbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gY2FjaGVcbiAgICogQHBhcmFtIGVtYmVkZGluZyAtIEVtYmVkZGluZyB2ZWN0b3IgZm9yIHNpbWlsYXJpdHkgbWF0Y2hpbmdcbiAgICogQHBhcmFtIHR0bFNlY29uZHMgLSBUaW1lLXRvLWxpdmUgaW4gc2Vjb25kcyAoMCA9IG5vIGV4cGlyeSlcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCBkYi5jYWNoZVB1dChcbiAgICogICAnbGxtX3Jlc3BvbnNlcycsXG4gICAqICAgJ1doYXQgaXMgUHl0aG9uPycsXG4gICAqICAgJ1B5dGhvbiBpcyBhIHByb2dyYW1taW5nIGxhbmd1YWdlLi4uJyxcbiAgICogICBbMC4xLCAwLjIsIDAuMywgLi4uXSwgIC8vIDM4NC1kaW1cbiAgICogICAzNjAwXG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgY2FjaGVQdXQoXG4gICAgY2FjaGVOYW1lOiBzdHJpbmcsXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBlbWJlZGRpbmc6IG51bWJlcltdLFxuICAgIHR0bFNlY29uZHM6IG51bWJlciA9IDBcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fZW5zdXJlT3BlbigpO1xuXG4gICAgLy8gSGFzaCB0aGUga2V5IGZvciBzdG9yYWdlXG4gICAgY29uc3Qga2V5SGFzaCA9IEJ1ZmZlci5mcm9tKGtleSkudG9TdHJpbmcoJ2hleCcpLnNsaWNlKDAsIDE2KTtcbiAgICBjb25zdCBjYWNoZUtleSA9IGBfY2FjaGUvJHtjYWNoZU5hbWV9LyR7a2V5SGFzaH1gO1xuXG4gICAgY29uc3QgZXhwaXJlc0F0ID0gdHRsU2Vjb25kcyA+IDBcbiAgICAgID8gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkgKyB0dGxTZWNvbmRzXG4gICAgICA6IDA7XG5cbiAgICBjb25zdCBjYWNoZVZhbHVlID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAga2V5LFxuICAgICAgdmFsdWUsXG4gICAgICBlbWJlZGRpbmcsXG4gICAgICBleHBpcmVzX2F0OiBleHBpcmVzQXQsXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLnB1dChCdWZmZXIuZnJvbShjYWNoZUtleSksIEJ1ZmZlci5mcm9tKGNhY2hlVmFsdWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rIHVwIGEgdmFsdWUgaW4gdGhlIHNlbWFudGljIGNhY2hlIGJ5IGVtYmVkZGluZyBzaW1pbGFyaXR5LlxuICAgKlxuICAgKiBAcGFyYW0gY2FjaGVOYW1lIC0gTmFtZSBvZiB0aGUgY2FjaGVcbiAgICogQHBhcmFtIHF1ZXJ5RW1iZWRkaW5nIC0gUXVlcnkgZW1iZWRkaW5nIHRvIG1hdGNoIGFnYWluc3RcbiAgICogQHBhcmFtIHRocmVzaG9sZCAtIE1pbmltdW0gY29zaW5lIHNpbWlsYXJpdHkgdGhyZXNob2xkICgwLjAgdG8gMS4wKVxuICAgKiBAcmV0dXJucyBDYWNoZWQgdmFsdWUgaWYgc2ltaWxhcml0eSA+PSB0aHJlc2hvbGQsIG51bGwgb3RoZXJ3aXNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIuY2FjaGVHZXQoXG4gICAqICAgJ2xsbV9yZXNwb25zZXMnLFxuICAgKiAgIFswLjEyLCAwLjE4LCAuLi5dLCAgLy8gU2ltaWxhciB0byBcIldoYXQgaXMgUHl0aG9uP1wiXG4gICAqICAgMC44NVxuICAgKiApO1xuICAgKiBpZiAocmVzdWx0KSB7XG4gICAqICAgY29uc29sZS5sb2coYENhY2hlIGhpdDogJHtyZXN1bHR9YCk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBjYWNoZUdldChcbiAgICBjYWNoZU5hbWU6IHN0cmluZyxcbiAgICBxdWVyeUVtYmVkZGluZzogbnVtYmVyW10sXG4gICAgdGhyZXNob2xkOiBudW1iZXIgPSAwLjg1XG4gICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHRoaXMuX2Vuc3VyZU9wZW4oKTtcblxuICAgIGNvbnN0IHByZWZpeCA9IGBfY2FjaGUvJHtjYWNoZU5hbWV9L2A7XG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuc2NhbihwcmVmaXgpO1xuXG4gICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgbGV0IGJlc3RNYXRjaDogeyBzaW1pbGFyaXR5OiBudW1iZXI7IHZhbHVlOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCB7IHZhbHVlIH0gb2YgZW50cmllcykge1xuICAgICAgY29uc3QgZW50cnkgPSBKU09OLnBhcnNlKHZhbHVlLnRvU3RyaW5nKCkpO1xuXG4gICAgICAvLyBDaGVjayBleHBpcnlcbiAgICAgIGlmIChlbnRyeS5leHBpcmVzX2F0ID4gMCAmJiBub3cgPiBlbnRyeS5leHBpcmVzX2F0KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb21wdXRlIGNvc2luZSBzaW1pbGFyaXR5XG4gICAgICBpZiAoZW50cnkuZW1iZWRkaW5nICYmIGVudHJ5LmVtYmVkZGluZy5sZW5ndGggPT09IHF1ZXJ5RW1iZWRkaW5nLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBzaW1pbGFyaXR5ID0gdGhpcy5fY29zaW5lU2ltaWxhcml0eShxdWVyeUVtYmVkZGluZywgZW50cnkuZW1iZWRkaW5nKTtcbiAgICAgICAgaWYgKHNpbWlsYXJpdHkgPj0gdGhyZXNob2xkKSB7XG4gICAgICAgICAgaWYgKCFiZXN0TWF0Y2ggfHwgc2ltaWxhcml0eSA+IGJlc3RNYXRjaC5zaW1pbGFyaXR5KSB7XG4gICAgICAgICAgICBiZXN0TWF0Y2ggPSB7IHNpbWlsYXJpdHksIHZhbHVlOiBlbnRyeS52YWx1ZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiZXN0TWF0Y2g/LnZhbHVlID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9jb3NpbmVTaW1pbGFyaXR5KGE6IG51bWJlcltdLCBiOiBudW1iZXJbXSk6IG51bWJlciB7XG4gICAgbGV0IGRvdCA9IDAsIG5vcm1BID0gMCwgbm9ybUIgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgZG90ICs9IGFbaV0gKiBiW2ldO1xuICAgICAgbm9ybUEgKz0gYVtpXSAqIGFbaV07XG4gICAgICBub3JtQiArPSBiW2ldICogYltpXTtcbiAgICB9XG4gICAgbm9ybUEgPSBNYXRoLnNxcnQobm9ybUEpO1xuICAgIG5vcm1CID0gTWF0aC5zcXJ0KG5vcm1CKTtcbiAgICByZXR1cm4gbm9ybUEgPT09IDAgfHwgbm9ybUIgPT09IDAgPyAwIDogZG90IC8gKG5vcm1BICogbm9ybUIpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBUcmFjZSBPcGVyYXRpb25zIChPYnNlcnZhYmlsaXR5KVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgbmV3IHRyYWNlLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIE5hbWUgb2YgdGhlIHRyYWNlIChlLmcuLCBcInVzZXJfcmVxdWVzdFwiLCBcImJhdGNoX2pvYlwiKVxuICAgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCB0cmFjZUlkIGFuZCByb290U3BhbklkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyB0cmFjZUlkLCByb290U3BhbklkIH0gPSBhd2FpdCBkYi5zdGFydFRyYWNlKCd1c2VyX3F1ZXJ5Jyk7XG4gICAqIC8vIC4uLiBkbyB3b3JrIC4uLlxuICAgKiBhd2FpdCBkYi5lbmRTcGFuKHRyYWNlSWQsIHJvb3RTcGFuSWQsICdvaycpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHN0YXJ0VHJhY2UobmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IHRyYWNlSWQ6IHN0cmluZzsgcm9vdFNwYW5JZDogc3RyaW5nIH0+IHtcbiAgICB0aGlzLl9lbnN1cmVPcGVuKCk7XG5cbiAgICBjb25zdCB0cmFjZUlkID0gYHRyYWNlXyR7RGF0ZS5ub3coKS50b1N0cmluZygxNil9JHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zbGljZSgyLCAxMCl9YDtcbiAgICBjb25zdCBzcGFuSWQgPSBgc3Bhbl8ke0RhdGUubm93KCkudG9TdHJpbmcoMTYpfSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMiwgMTApfWA7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKSAqIDEwMDA7IC8vIG1pY3Jvc2Vjb25kc1xuXG4gICAgLy8gU3RvcmUgdHJhY2VcbiAgICBjb25zdCB0cmFjZUtleSA9IGBfdHJhY2VzLyR7dHJhY2VJZH1gO1xuICAgIGNvbnN0IHRyYWNlVmFsdWUgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB0cmFjZV9pZDogdHJhY2VJZCxcbiAgICAgIG5hbWUsXG4gICAgICBzdGFydF91czogbm93LFxuICAgICAgcm9vdF9zcGFuX2lkOiBzcGFuSWQsXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5wdXQoQnVmZmVyLmZyb20odHJhY2VLZXkpLCBCdWZmZXIuZnJvbSh0cmFjZVZhbHVlKSk7XG5cbiAgICAvLyBTdG9yZSByb290IHNwYW5cbiAgICBjb25zdCBzcGFuS2V5ID0gYF90cmFjZXMvJHt0cmFjZUlkfS9zcGFucy8ke3NwYW5JZH1gO1xuICAgIGNvbnN0IHNwYW5WYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHNwYW5faWQ6IHNwYW5JZCxcbiAgICAgIG5hbWUsXG4gICAgICBzdGFydF91czogbm93LFxuICAgICAgcGFyZW50X3NwYW5faWQ6IG51bGwsXG4gICAgICBzdGF0dXM6ICdhY3RpdmUnLFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMucHV0KEJ1ZmZlci5mcm9tKHNwYW5LZXkpLCBCdWZmZXIuZnJvbShzcGFuVmFsdWUpKTtcblxuICAgIHJldHVybiB7IHRyYWNlSWQsIHJvb3RTcGFuSWQ6IHNwYW5JZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgY2hpbGQgc3BhbiB3aXRoaW4gYSB0cmFjZS5cbiAgICpcbiAgICogQHBhcmFtIHRyYWNlSWQgLSBJRCBvZiB0aGUgcGFyZW50IHRyYWNlXG4gICAqIEBwYXJhbSBwYXJlbnRTcGFuSWQgLSBJRCBvZiB0aGUgcGFyZW50IHNwYW5cbiAgICogQHBhcmFtIG5hbWUgLSBOYW1lIG9mIHRoaXMgc3BhblxuICAgKiBAcmV0dXJucyBUaGUgbmV3IHNwYW4gSURcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB7IHRyYWNlSWQsIHJvb3RTcGFuSWQgfSA9IGF3YWl0IGRiLnN0YXJ0VHJhY2UoJ3VzZXJfcXVlcnknKTtcbiAgICogY29uc3QgZGJTcGFuID0gYXdhaXQgZGIuc3RhcnRTcGFuKHRyYWNlSWQsIHJvb3RTcGFuSWQsICdkYXRhYmFzZV9sb29rdXAnKTtcbiAgICogLy8gLi4uIGRvIGRhdGFiYXNlIHdvcmsgLi4uXG4gICAqIGNvbnN0IGR1cmF0aW9uID0gYXdhaXQgZGIuZW5kU3Bhbih0cmFjZUlkLCBkYlNwYW4sICdvaycpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHN0YXJ0U3BhbihcbiAgICB0cmFjZUlkOiBzdHJpbmcsXG4gICAgcGFyZW50U3BhbklkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy5fZW5zdXJlT3BlbigpO1xuXG4gICAgY29uc3Qgc3BhbklkID0gYHNwYW5fJHtEYXRlLm5vdygpLnRvU3RyaW5nKDE2KX0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpLnNsaWNlKDIsIDEwKX1gO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCkgKiAxMDAwO1xuXG4gICAgY29uc3Qgc3BhbktleSA9IGBfdHJhY2VzLyR7dHJhY2VJZH0vc3BhbnMvJHtzcGFuSWR9YDtcbiAgICBjb25zdCBzcGFuVmFsdWUgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBzcGFuX2lkOiBzcGFuSWQsXG4gICAgICBuYW1lLFxuICAgICAgc3RhcnRfdXM6IG5vdyxcbiAgICAgIHBhcmVudF9zcGFuX2lkOiBwYXJlbnRTcGFuSWQsXG4gICAgICBzdGF0dXM6ICdhY3RpdmUnLFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMucHV0KEJ1ZmZlci5mcm9tKHNwYW5LZXkpLCBCdWZmZXIuZnJvbShzcGFuVmFsdWUpKTtcblxuICAgIHJldHVybiBzcGFuSWQ7XG4gIH1cblxuICAvKipcbiAgICogRW5kIGEgc3BhbiBhbmQgcmVjb3JkIGl0cyBkdXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHRyYWNlSWQgLSBJRCBvZiB0aGUgdHJhY2VcbiAgICogQHBhcmFtIHNwYW5JZCAtIElEIG9mIHRoZSBzcGFuIHRvIGVuZFxuICAgKiBAcGFyYW0gc3RhdHVzIC0gXCJva1wiLCBcImVycm9yXCIsIG9yIFwidW5zZXRcIlxuICAgKiBAcmV0dXJucyBEdXJhdGlvbiBpbiBtaWNyb3NlY29uZHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBkdXJhdGlvbiA9IGF3YWl0IGRiLmVuZFNwYW4odHJhY2VJZCwgc3BhbklkLCAnb2snKTtcbiAgICogY29uc29sZS5sb2coYE9wZXJhdGlvbiB0b29rICR7ZHVyYXRpb259wrVzYCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZW5kU3BhbihcbiAgICB0cmFjZUlkOiBzdHJpbmcsXG4gICAgc3BhbklkOiBzdHJpbmcsXG4gICAgc3RhdHVzOiAnb2snIHwgJ2Vycm9yJyB8ICd1bnNldCcgPSAnb2snXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgdGhpcy5fZW5zdXJlT3BlbigpO1xuXG4gICAgY29uc3Qgc3BhbktleSA9IGBfdHJhY2VzLyR7dHJhY2VJZH0vc3BhbnMvJHtzcGFuSWR9YDtcbiAgICBjb25zdCBzcGFuRGF0YSA9IGF3YWl0IHRoaXMuZ2V0KEJ1ZmZlci5mcm9tKHNwYW5LZXkpKTtcblxuICAgIGlmICghc3BhbkRhdGEpIHtcbiAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKGBTcGFuIG5vdCBmb3VuZDogJHtzcGFuSWR9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3BhbiA9IEpTT04ucGFyc2Uoc3BhbkRhdGEudG9TdHJpbmcoKSk7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKSAqIDEwMDA7XG4gICAgY29uc3QgZHVyYXRpb24gPSBub3cgLSBzcGFuLnN0YXJ0X3VzO1xuXG4gICAgY29uc3QgdXBkYXRlZFNwYW4gPSB7XG4gICAgICAuLi5zcGFuLFxuICAgICAgc3RhdHVzLFxuICAgICAgZW5kX3VzOiBub3csXG4gICAgICBkdXJhdGlvbl91czogZHVyYXRpb24sXG4gICAgfTtcbiAgICBhd2FpdCB0aGlzLnB1dChCdWZmZXIuZnJvbShzcGFuS2V5KSwgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodXBkYXRlZFNwYW4pKSk7XG5cbiAgICByZXR1cm4gZHVyYXRpb247XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIElmIHJ1bm5pbmcgaW4gZW1iZWRkZWQgbW9kZSwgYWxzbyBzdG9wcyB0aGUgZW1iZWRkZWQgc2VydmVyLlxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX2Nsb3NlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLl9jbGllbnQpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2NsaWVudC5jbG9zZSgpO1xuICAgICAgdGhpcy5fY2xpZW50ID0gbnVsbDtcbiAgICB9XG4gICAgLy8gU3RvcCBlbWJlZGRlZCBzZXJ2ZXIgaWYgd2Ugc3RhcnRlZCBpdFxuICAgIGlmICh0aGlzLl9lbWJlZGRlZFNlcnZlclN0YXJ0ZWQpIHtcbiAgICAgIGF3YWl0IHN0b3BFbWJlZGRlZFNlcnZlcih0aGlzLl9jb25maWcucGF0aCk7XG4gICAgICB0aGlzLl9lbWJlZGRlZFNlcnZlclN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5fY2xvc2VkID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIEludGVybmFsIG1ldGhvZHMgZm9yIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnRcbiAgcHJpdmF0ZSBhc3luYyBfYmVnaW5UcmFuc2FjdGlvbigpOiBQcm9taXNlPGJpZ2ludD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQhLmJlZ2luVHJhbnNhY3Rpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2NvbW1pdFRyYW5zYWN0aW9uKHR4bklkOiBiaWdpbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50IS5jb21taXRUcmFuc2FjdGlvbih0eG5JZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9hYm9ydFRyYW5zYWN0aW9uKHR4bklkOiBiaWdpbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50IS5hYm9ydFRyYW5zYWN0aW9uKHR4bklkKTtcbiAgfVxuXG4gIHByaXZhdGUgX2Vuc3VyZU9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2Nsb3NlZCkge1xuICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoJ0RhdGFiYXNlIGlzIGNsb3NlZCcpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2NsaWVudCkge1xuICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoJ0RhdGFiYXNlIG5vdCBjb25uZWN0ZWQnKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -15,7 +15,7 @@ const transaction_1 = require("./transaction");
15
15
  *
16
16
  * @example
17
17
  * ```typescript
18
- * import { EmbeddedDatabase } from '@sushanth/sochdb';
18
+ * import { EmbeddedDatabase } from '@sochdb/sochdb';
19
19
  *
20
20
  * const db = await EmbeddedDatabase.open('./mydb');
21
21
  * await db.put(Buffer.from('key'), Buffer.from('value'));
@@ -236,4 +236,4 @@ class EmbeddedDatabase {
236
236
  }
237
237
  }
238
238
  exports.EmbeddedDatabase = EmbeddedDatabase;
239
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW1iZWRkZWQvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFFSCxzQ0FBMEM7QUFDMUMsNkNBQWdEO0FBQ2hELCtDQUFvRDtBQVdwRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLGdCQUFnQjtJQUNqQixNQUFNLENBQU07SUFDWixRQUFRLENBQWlCO0lBQ3pCLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDZixJQUFJLENBQVM7SUFFckIsWUFBb0IsSUFBWSxFQUFFLE1BQVc7UUFDekMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyx5QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQVksRUFBRSxNQUErQjtRQUNyRCxNQUFNLFFBQVEsR0FBRyx5QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlDLElBQUksTUFBTSxDQUFDO1FBRVgsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNULE1BQU0sT0FBTyxHQUFHO2dCQUNaLFdBQVcsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLEtBQUs7Z0JBQ3ZDLGVBQWUsRUFBRSxNQUFNLENBQUMsVUFBVSxLQUFLLFNBQVM7Z0JBQ2hELFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEYsYUFBYSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUztnQkFD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Q0FBQztZQUNwRCxZQUFZLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFDMUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtZQUM3QyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1lBQ3BELGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7U0FDdkQsQ0FBQztRQUVGLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7SUFDTCxDQUFDO0lBRU8sVUFBVTtRQUNkLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLHNCQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILFNBQVM7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVc7UUFDUCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQztDQUNKO0FBOU9ELDRDQThPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW1iZWRkZWQgRGF0YWJhc2UgLSBGRkkgTW9kZVxuICogXG4gKiBEaXJlY3QgRkZJIGFjY2VzcyB0byBTb2NoREIgbmF0aXZlIGxpYnJhcnkuXG4gKiBObyBzZXJ2ZXIgcmVxdWlyZWQgLSBzaW1pbGFyIHRvIFB5dGhvbiBTREsncyBEYXRhYmFzZSBjbGFzcy5cbiAqL1xuXG5pbXBvcnQgeyBEYXRhYmFzZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IE5hdGl2ZUJpbmRpbmdzIH0gZnJvbSAnLi9mZmkvYmluZGluZ3MnO1xuaW1wb3J0IHsgRW1iZWRkZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0ICogYXMga29mZmkgZnJvbSAna29mZmknO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVtYmVkZGVkRGF0YWJhc2VDb25maWcge1xuICAgIHdhbEVuYWJsZWQ/OiBib29sZWFuO1xuICAgIHN5bmNNb2RlPzogJ2Z1bGwnIHwgJ25vcm1hbCcgfCAnb2ZmJztcbiAgICBtZW10YWJsZVNpemVCeXRlcz86IG51bWJlcjtcbiAgICBncm91cENvbW1pdD86IGJvb2xlYW47XG4gICAgaW5kZXhQb2xpY3k/OiAnd3JpdGVfb3B0aW1pemVkJyB8ICdiYWxhbmNlZCcgfCAnc2Nhbl9vcHRpbWl6ZWQnIHwgJ2FwcGVuZF9vbmx5Jztcbn1cblxuLyoqXG4gKiBFbWJlZGRlZCBEYXRhYmFzZSB1c2luZyBkaXJlY3QgRkZJXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBFbWJlZGRlZERhdGFiYXNlIH0gZnJvbSAnQHN1c2hhbnRoL3NvY2hkYic7XG4gKiBcbiAqIGNvbnN0IGRiID0gYXdhaXQgRW1iZWRkZWREYXRhYmFzZS5vcGVuKCcuL215ZGInKTtcbiAqIGF3YWl0IGRiLnB1dChCdWZmZXIuZnJvbSgna2V5JyksIEJ1ZmZlci5mcm9tKCd2YWx1ZScpKTtcbiAqIGNvbnN0IHZhbHVlID0gYXdhaXQgZGIuZ2V0KEJ1ZmZlci5mcm9tKCdrZXknKSk7XG4gKiBhd2FpdCBkYi5jbG9zZSgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBFbWJlZGRlZERhdGFiYXNlIHtcbiAgICBwcml2YXRlIGhhbmRsZTogYW55O1xuICAgIHByaXZhdGUgYmluZGluZ3M6IE5hdGl2ZUJpbmRpbmdzO1xuICAgIHByaXZhdGUgY2xvc2VkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBwYXRoOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZywgaGFuZGxlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5oYW5kbGUgPSBoYW5kbGU7XG4gICAgICAgIHRoaXMuYmluZGluZ3MgPSBOYXRpdmVCaW5kaW5ncy5nZXRJbnN0YW5jZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW4gYSBkYXRhYmFzZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGhcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gcGF0aCAtIFBhdGggdG8gZGF0YWJhc2UgZGlyZWN0b3J5XG4gICAgICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAcmV0dXJucyBFbWJlZGRlZERhdGFiYXNlIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIG9wZW4ocGF0aDogc3RyaW5nLCBjb25maWc/OiBFbWJlZGRlZERhdGFiYXNlQ29uZmlnKTogRW1iZWRkZWREYXRhYmFzZSB7XG4gICAgICAgIGNvbnN0IGJpbmRpbmdzID0gTmF0aXZlQmluZGluZ3MuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgbGV0IGhhbmRsZTtcblxuICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICBjb25zdCBjQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIHdhbF9lbmFibGVkOiBjb25maWcud2FsRW5hYmxlZCA/PyBmYWxzZSxcbiAgICAgICAgICAgICAgICB3YWxfZW5hYmxlZF9zZXQ6IGNvbmZpZy53YWxFbmFibGVkICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc3luY19tb2RlOiBjb25maWcuc3luY01vZGUgPT09ICdmdWxsJyA/IDIgOiAoY29uZmlnLnN5bmNNb2RlID09PSAnbm9ybWFsJyA/IDEgOiAwKSxcbiAgICAgICAgICAgICAgICBzeW5jX21vZGVfc2V0OiBjb25maWcuc3luY01vZGUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBtZW10YWJsZV9zaXplX2J5dGVzOiBCaWdJbnQoY29uZmlnLm1lbXRhYmxlU2l6ZUJ5dGVzID8/IDApLFxuICAgICAgICAgICAgICAgIGdyb3VwX2NvbW1pdDogY29uZmlnLmdyb3VwQ29tbWl0ID8/IGZhbHNlLFxuICAgICAgICAgICAgICAgIGdyb3VwX2NvbW1pdF9zZXQ6IGNvbmZpZy5ncm91cENvbW1pdCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRfaW5kZXhfcG9saWN5OiAxLCAvLyBEZWZhdWx0IHRvIEJhbGFuY2VkXG4gICAgICAgICAgICAgICAgZGVmYXVsdF9pbmRleF9wb2xpY3lfc2V0OiBmYWxzZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGhhbmRsZSA9IGJpbmRpbmdzLnNvY2hkYl9vcGVuX3dpdGhfY29uZmlnKHBhdGgsIGNDb25maWcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlID0gYmluZGluZ3Muc29jaGRiX29wZW4ocGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoYEZhaWxlZCB0byBvcGVuIGRhdGFiYXNlIGF0ICR7cGF0aH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRW1iZWRkZWREYXRhYmFzZShwYXRoLCBoYW5kbGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1dCBhIGtleS12YWx1ZSBwYWlyIChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIHB1dChrZXk6IEJ1ZmZlciwgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4ucHV0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHZhbHVlIGJ5IGtleSAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBnZXQoa2V5OiBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlciB8IG51bGw+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0eG4uZ2V0KGtleSk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGEga2V5IChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZShrZXk6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uZGVsZXRlKGtleSk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHV0IHZhbHVlIGF0IHBhdGggKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgcHV0UGF0aChwYXRoOiBzdHJpbmcsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdHhuLnB1dFBhdGgocGF0aCwgdmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB2YWx1ZSBhdCBwYXRoIChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIGdldFBhdGgocGF0aDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdHhuLmdldFBhdGgocGF0aCk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2NhbiBrZXlzIHdpdGggcHJlZml4XG4gICAgICovXG4gICAgYXN5bmMgKnNjYW5QcmVmaXgocHJlZml4OiBCdWZmZXIpOiBBc3luY0dlbmVyYXRvcjxbQnVmZmVyLCBCdWZmZXJdPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgZW50cnkgb2YgdHhuLnNjYW5QcmVmaXgocHJlZml4KSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJlZ2luIGEgdHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbigpOiBFbWJlZGRlZFRyYW5zYWN0aW9uIHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuSGFuZGxlID0gdGhpcy5iaW5kaW5ncy5zb2NoZGJfYmVnaW5fdHhuKHRoaXMuaGFuZGxlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbWJlZGRlZFRyYW5zYWN0aW9uKHRoaXMsIHRoaXMuaGFuZGxlLCB0eG5IYW5kbGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgb3BlcmF0aW9ucyB3aXRoaW4gYSB0cmFuc2FjdGlvbiAod2l0aCBhdXRvLWNvbW1pdC9hYm9ydClcbiAgICAgKi9cbiAgICBhc3luYyB3aXRoVHJhbnNhY3Rpb248VD4oZm46ICh0eG46IEVtYmVkZGVkVHJhbnNhY3Rpb24pID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4odHhuKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yY2UgYSBjaGVja3BvaW50XG4gICAgICovXG4gICAgYXN5bmMgY2hlY2twb2ludCgpOiBQcm9taXNlPGJpZ2ludD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcbiAgICAgICAgY29uc3QgbHNuID0gdGhpcy5iaW5kaW5ncy5zb2NoZGJfY2hlY2twb2ludCh0aGlzLmhhbmRsZSk7XG4gICAgICAgIHJldHVybiBCaWdJbnQobHNuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc3RvcmFnZSBzdGF0aXN0aWNzXG4gICAgICovXG4gICAgYXN5bmMgc3RhdHMoKTogUHJvbWlzZTx7XG4gICAgICAgIG1lbXRhYmxlU2l6ZUJ5dGVzOiBiaWdpbnQ7XG4gICAgICAgIHdhbFNpemVCeXRlczogYmlnaW50O1xuICAgICAgICBhY3RpdmVUcmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAgICAgbWluQWN0aXZlU25hcHNob3Q6IGJpZ2ludDtcbiAgICAgICAgbGFzdENoZWNrcG9pbnRMc246IGJpZ2ludDtcbiAgICB9PiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIC8vIFJldHVybnMgc3RydWN0IGJ5IHZhbHVlIChhdXRvbWF0aWNhbGx5IGRlY29kZWQpXG4gICAgICAgIGNvbnN0IHN0YXRzID0gdGhpcy5iaW5kaW5ncy5zb2NoZGJfc3RhdHModGhpcy5oYW5kbGUpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG1lbXRhYmxlU2l6ZUJ5dGVzOiBCaWdJbnQoc3RhdHMubWVtdGFibGVfc2l6ZV9ieXRlcyksXG4gICAgICAgICAgICB3YWxTaXplQnl0ZXM6IEJpZ0ludChzdGF0cy53YWxfc2l6ZV9ieXRlcyksXG4gICAgICAgICAgICBhY3RpdmVUcmFuc2FjdGlvbnM6IHN0YXRzLmFjdGl2ZV90cmFuc2FjdGlvbnMsXG4gICAgICAgICAgICBtaW5BY3RpdmVTbmFwc2hvdDogQmlnSW50KHN0YXRzLm1pbl9hY3RpdmVfc25hcHNob3QpLFxuICAgICAgICAgICAgbGFzdENoZWNrcG9pbnRMc246IEJpZ0ludChzdGF0cy5sYXN0X2NoZWNrcG9pbnRfbHNuKSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBkYXRhYmFzZVxuICAgICAqL1xuICAgIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRpbmdzLnNvY2hkYl9jbG9zZSh0aGlzLmhhbmRsZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGVuc3VyZU9wZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoJ0RhdGFiYXNlIGlzIGNsb3NlZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGludGVybmFsIGhhbmRsZSAoZm9yIHRyYW5zYWN0aW9ucylcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRIYW5kbGUoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBiaW5kaW5ncyBpbnN0YW5jZSAoZm9yIHRyYW5zYWN0aW9ucylcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRCaW5kaW5ncygpOiBOYXRpdmVCaW5kaW5ncyB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmRpbmdzO1xuICAgIH1cbn1cbiJdfQ==
239
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW1iZWRkZWQvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFFSCxzQ0FBMEM7QUFDMUMsNkNBQWdEO0FBQ2hELCtDQUFvRDtBQVdwRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLGdCQUFnQjtJQUNqQixNQUFNLENBQU07SUFDWixRQUFRLENBQWlCO0lBQ3pCLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDZixJQUFJLENBQVM7SUFFckIsWUFBb0IsSUFBWSxFQUFFLE1BQVc7UUFDekMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyx5QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQVksRUFBRSxNQUErQjtRQUNyRCxNQUFNLFFBQVEsR0FBRyx5QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlDLElBQUksTUFBTSxDQUFDO1FBRVgsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNULE1BQU0sT0FBTyxHQUFHO2dCQUNaLFdBQVcsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLEtBQUs7Z0JBQ3ZDLGVBQWUsRUFBRSxNQUFNLENBQUMsVUFBVSxLQUFLLFNBQVM7Z0JBQ2hELFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEYsYUFBYSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUztnQkFD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Q0FBQztZQUNwRCxZQUFZLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFDMUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtZQUM3QyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1lBQ3BELGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7U0FDdkQsQ0FBQztRQUVGLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7SUFDTCxDQUFDO0lBRU8sVUFBVTtRQUNkLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLHNCQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILFNBQVM7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVc7UUFDUCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQztDQUNKO0FBOU9ELDRDQThPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW1iZWRkZWQgRGF0YWJhc2UgLSBGRkkgTW9kZVxuICogXG4gKiBEaXJlY3QgRkZJIGFjY2VzcyB0byBTb2NoREIgbmF0aXZlIGxpYnJhcnkuXG4gKiBObyBzZXJ2ZXIgcmVxdWlyZWQgLSBzaW1pbGFyIHRvIFB5dGhvbiBTREsncyBEYXRhYmFzZSBjbGFzcy5cbiAqL1xuXG5pbXBvcnQgeyBEYXRhYmFzZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IE5hdGl2ZUJpbmRpbmdzIH0gZnJvbSAnLi9mZmkvYmluZGluZ3MnO1xuaW1wb3J0IHsgRW1iZWRkZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0ICogYXMga29mZmkgZnJvbSAna29mZmknO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVtYmVkZGVkRGF0YWJhc2VDb25maWcge1xuICAgIHdhbEVuYWJsZWQ/OiBib29sZWFuO1xuICAgIHN5bmNNb2RlPzogJ2Z1bGwnIHwgJ25vcm1hbCcgfCAnb2ZmJztcbiAgICBtZW10YWJsZVNpemVCeXRlcz86IG51bWJlcjtcbiAgICBncm91cENvbW1pdD86IGJvb2xlYW47XG4gICAgaW5kZXhQb2xpY3k/OiAnd3JpdGVfb3B0aW1pemVkJyB8ICdiYWxhbmNlZCcgfCAnc2Nhbl9vcHRpbWl6ZWQnIHwgJ2FwcGVuZF9vbmx5Jztcbn1cblxuLyoqXG4gKiBFbWJlZGRlZCBEYXRhYmFzZSB1c2luZyBkaXJlY3QgRkZJXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBFbWJlZGRlZERhdGFiYXNlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICogXG4gKiBjb25zdCBkYiA9IGF3YWl0IEVtYmVkZGVkRGF0YWJhc2Uub3BlbignLi9teWRiJyk7XG4gKiBhd2FpdCBkYi5wdXQoQnVmZmVyLmZyb20oJ2tleScpLCBCdWZmZXIuZnJvbSgndmFsdWUnKSk7XG4gKiBjb25zdCB2YWx1ZSA9IGF3YWl0IGRiLmdldChCdWZmZXIuZnJvbSgna2V5JykpO1xuICogYXdhaXQgZGIuY2xvc2UoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRW1iZWRkZWREYXRhYmFzZSB7XG4gICAgcHJpdmF0ZSBoYW5kbGU6IGFueTtcbiAgICBwcml2YXRlIGJpbmRpbmdzOiBOYXRpdmVCaW5kaW5ncztcbiAgICBwcml2YXRlIGNsb3NlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgcGF0aDogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwYXRoOiBzdHJpbmcsIGhhbmRsZTogYW55KSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuaGFuZGxlID0gaGFuZGxlO1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0gTmF0aXZlQmluZGluZ3MuZ2V0SW5zdGFuY2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVuIGEgZGF0YWJhc2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoXG4gICAgICogXG4gICAgICogQHBhcmFtIHBhdGggLSBQYXRoIHRvIGRhdGFiYXNlIGRpcmVjdG9yeVxuICAgICAqIEBwYXJhbSBjb25maWcgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uXG4gICAgICogQHJldHVybnMgRW1iZWRkZWREYXRhYmFzZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBvcGVuKHBhdGg6IHN0cmluZywgY29uZmlnPzogRW1iZWRkZWREYXRhYmFzZUNvbmZpZyk6IEVtYmVkZGVkRGF0YWJhc2Uge1xuICAgICAgICBjb25zdCBiaW5kaW5ncyA9IE5hdGl2ZUJpbmRpbmdzLmdldEluc3RhbmNlKCk7XG4gICAgICAgIGxldCBoYW5kbGU7XG5cbiAgICAgICAgaWYgKGNvbmZpZykge1xuICAgICAgICAgICAgY29uc3QgY0NvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICB3YWxfZW5hYmxlZDogY29uZmlnLndhbEVuYWJsZWQgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgd2FsX2VuYWJsZWRfc2V0OiBjb25maWcud2FsRW5hYmxlZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHN5bmNfbW9kZTogY29uZmlnLnN5bmNNb2RlID09PSAnZnVsbCcgPyAyIDogKGNvbmZpZy5zeW5jTW9kZSA9PT0gJ25vcm1hbCcgPyAxIDogMCksXG4gICAgICAgICAgICAgICAgc3luY19tb2RlX3NldDogY29uZmlnLnN5bmNNb2RlICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbWVtdGFibGVfc2l6ZV9ieXRlczogQmlnSW50KGNvbmZpZy5tZW10YWJsZVNpemVCeXRlcyA/PyAwKSxcbiAgICAgICAgICAgICAgICBncm91cF9jb21taXQ6IGNvbmZpZy5ncm91cENvbW1pdCA/PyBmYWxzZSxcbiAgICAgICAgICAgICAgICBncm91cF9jb21taXRfc2V0OiBjb25maWcuZ3JvdXBDb21taXQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBkZWZhdWx0X2luZGV4X3BvbGljeTogMSwgLy8gRGVmYXVsdCB0byBCYWxhbmNlZFxuICAgICAgICAgICAgICAgIGRlZmF1bHRfaW5kZXhfcG9saWN5X3NldDogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBoYW5kbGUgPSBiaW5kaW5ncy5zb2NoZGJfb3Blbl93aXRoX2NvbmZpZyhwYXRoLCBjQ29uZmlnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhhbmRsZSA9IGJpbmRpbmdzLnNvY2hkYl9vcGVuKHBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKGBGYWlsZWQgdG8gb3BlbiBkYXRhYmFzZSBhdCAke3BhdGh9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEVtYmVkZGVkRGF0YWJhc2UocGF0aCwgaGFuZGxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQdXQgYSBrZXktdmFsdWUgcGFpciAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBwdXQoa2V5OiBCdWZmZXIsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdHhuLnB1dChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSB2YWx1ZSBieSBrZXkgKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgZ2V0KGtleTogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdHhuLmdldChrZXkpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhIGtleSAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGUoa2V5OiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1dCB2YWx1ZSBhdCBwYXRoIChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIHB1dFBhdGgocGF0aDogc3RyaW5nLCB2YWx1ZTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5wdXRQYXRoKHBhdGgsIHZhbHVlKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdmFsdWUgYXQgcGF0aCAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBnZXRQYXRoKHBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHR4bi5nZXRQYXRoKHBhdGgpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNjYW4ga2V5cyB3aXRoIHByZWZpeFxuICAgICAqL1xuICAgIGFzeW5jICpzY2FuUHJlZml4KHByZWZpeDogQnVmZmVyKTogQXN5bmNHZW5lcmF0b3I8W0J1ZmZlciwgQnVmZmVyXT4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGVudHJ5IG9mIHR4bi5zY2FuUHJlZml4KHByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBlbnRyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCZWdpbiBhIHRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb24oKTogRW1iZWRkZWRUcmFuc2FjdGlvbiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4bkhhbmRsZSA9IHRoaXMuYmluZGluZ3Muc29jaGRiX2JlZ2luX3R4bih0aGlzLmhhbmRsZSk7XG4gICAgICAgIHJldHVybiBuZXcgRW1iZWRkZWRUcmFuc2FjdGlvbih0aGlzLCB0aGlzLmhhbmRsZSwgdHhuSGFuZGxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIG9wZXJhdGlvbnMgd2l0aGluIGEgdHJhbnNhY3Rpb24gKHdpdGggYXV0by1jb21taXQvYWJvcnQpXG4gICAgICovXG4gICAgYXN5bmMgd2l0aFRyYW5zYWN0aW9uPFQ+KGZuOiAodHhuOiBFbWJlZGRlZFRyYW5zYWN0aW9uKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKHR4bik7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcmNlIGEgY2hlY2twb2ludFxuICAgICAqL1xuICAgIGFzeW5jIGNoZWNrcG9pbnQoKTogUHJvbWlzZTxiaWdpbnQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgICAgIGNvbnN0IGxzbiA9IHRoaXMuYmluZGluZ3Muc29jaGRiX2NoZWNrcG9pbnQodGhpcy5oYW5kbGUpO1xuICAgICAgICByZXR1cm4gQmlnSW50KGxzbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHN0b3JhZ2Ugc3RhdGlzdGljc1xuICAgICAqL1xuICAgIGFzeW5jIHN0YXRzKCk6IFByb21pc2U8e1xuICAgICAgICBtZW10YWJsZVNpemVCeXRlczogYmlnaW50O1xuICAgICAgICB3YWxTaXplQnl0ZXM6IGJpZ2ludDtcbiAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgICAgIG1pbkFjdGl2ZVNuYXBzaG90OiBiaWdpbnQ7XG4gICAgICAgIGxhc3RDaGVja3BvaW50THNuOiBiaWdpbnQ7XG4gICAgfT4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICAvLyBSZXR1cm5zIHN0cnVjdCBieSB2YWx1ZSAoYXV0b21hdGljYWxseSBkZWNvZGVkKVxuICAgICAgICBjb25zdCBzdGF0cyA9IHRoaXMuYmluZGluZ3Muc29jaGRiX3N0YXRzKHRoaXMuaGFuZGxlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBtZW10YWJsZVNpemVCeXRlczogQmlnSW50KHN0YXRzLm1lbXRhYmxlX3NpemVfYnl0ZXMpLFxuICAgICAgICAgICAgd2FsU2l6ZUJ5dGVzOiBCaWdJbnQoc3RhdHMud2FsX3NpemVfYnl0ZXMpLFxuICAgICAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb25zOiBzdGF0cy5hY3RpdmVfdHJhbnNhY3Rpb25zLFxuICAgICAgICAgICAgbWluQWN0aXZlU25hcHNob3Q6IEJpZ0ludChzdGF0cy5taW5fYWN0aXZlX3NuYXBzaG90KSxcbiAgICAgICAgICAgIGxhc3RDaGVja3BvaW50THNuOiBCaWdJbnQoc3RhdHMubGFzdF9jaGVja3BvaW50X2xzbiksXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZSB0aGUgZGF0YWJhc2VcbiAgICAgKi9cbiAgICBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5iaW5kaW5ncy5zb2NoZGJfY2xvc2UodGhpcy5oYW5kbGUpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbnN1cmVPcGVuKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKCdEYXRhYmFzZSBpcyBjbG9zZWQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBpbnRlcm5hbCBoYW5kbGUgKGZvciB0cmFuc2FjdGlvbnMpXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0SGFuZGxlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYmluZGluZ3MgaW5zdGFuY2UgKGZvciB0cmFuc2FjdGlvbnMpXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0QmluZGluZ3MoKTogTmF0aXZlQmluZGluZ3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5kaW5ncztcbiAgICB9XG59XG4iXX0=
@@ -5,7 +5,7 @@
5
5
  * @packageDocumentation
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.DatabaseError = exports.ProtocolError = exports.TransactionError = exports.ConnectionError = exports.SochDBError = void 0;
8
+ exports.SplitBrainError = exports.EpochMismatchError = exports.LockTimeoutError = exports.DatabaseLockedError = exports.LockError = exports.DatabaseError = exports.ProtocolError = exports.TransactionError = exports.ConnectionError = exports.SochDBError = exports.ErrorCode = void 0;
9
9
  // Copyright 2025 Sushanth (https://github.com/sushanthpy)
10
10
  //
11
11
  // Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,13 +13,40 @@ exports.DatabaseError = exports.ProtocolError = exports.TransactionError = expor
13
13
  // You may obtain a copy of the License at
14
14
  //
15
15
  // http://www.apache.org/licenses/LICENSE-2.0
16
+ /**
17
+ * Error codes matching Rust error codes.
18
+ */
19
+ var ErrorCode;
20
+ (function (ErrorCode) {
21
+ // Connection errors (1xxx)
22
+ ErrorCode[ErrorCode["CONNECTION_FAILED"] = 1001] = "CONNECTION_FAILED";
23
+ ErrorCode[ErrorCode["CONNECTION_TIMEOUT"] = 1002] = "CONNECTION_TIMEOUT";
24
+ ErrorCode[ErrorCode["CONNECTION_CLOSED"] = 1003] = "CONNECTION_CLOSED";
25
+ ErrorCode[ErrorCode["PROTOCOL_ERROR"] = 1004] = "PROTOCOL_ERROR";
26
+ // Transaction errors (2xxx)
27
+ ErrorCode[ErrorCode["TRANSACTION_ABORTED"] = 2001] = "TRANSACTION_ABORTED";
28
+ ErrorCode[ErrorCode["TRANSACTION_CONFLICT"] = 2002] = "TRANSACTION_CONFLICT";
29
+ // Internal errors (9xxx)
30
+ ErrorCode[ErrorCode["INTERNAL_ERROR"] = 9001] = "INTERNAL_ERROR";
31
+ ErrorCode[ErrorCode["STORAGE_ERROR"] = 9003] = "STORAGE_ERROR";
32
+ // Lock/Concurrency errors (10xxx) - v0.4.1
33
+ ErrorCode[ErrorCode["DATABASE_LOCKED"] = 10001] = "DATABASE_LOCKED";
34
+ ErrorCode[ErrorCode["LOCK_TIMEOUT"] = 10002] = "LOCK_TIMEOUT";
35
+ ErrorCode[ErrorCode["EPOCH_MISMATCH"] = 10003] = "EPOCH_MISMATCH";
36
+ ErrorCode[ErrorCode["SPLIT_BRAIN"] = 10004] = "SPLIT_BRAIN";
37
+ ErrorCode[ErrorCode["STALE_LOCK"] = 10005] = "STALE_LOCK";
38
+ })(ErrorCode || (exports.ErrorCode = ErrorCode = {}));
16
39
  /**
17
40
  * Base error class for all SochDB errors.
18
41
  */
19
42
  class SochDBError extends Error {
20
- constructor(message) {
43
+ code;
44
+ remediation;
45
+ constructor(message, code = ErrorCode.INTERNAL_ERROR, remediation) {
21
46
  super(message);
22
47
  this.name = 'SochDBError';
48
+ this.code = code;
49
+ this.remediation = remediation;
23
50
  Object.setPrototypeOf(this, SochDBError.prototype);
24
51
  }
25
52
  }
@@ -29,7 +56,7 @@ exports.SochDBError = SochDBError;
29
56
  */
30
57
  class ConnectionError extends SochDBError {
31
58
  constructor(message) {
32
- super(message);
59
+ super(message, ErrorCode.CONNECTION_FAILED);
33
60
  this.name = 'ConnectionError';
34
61
  Object.setPrototypeOf(this, ConnectionError.prototype);
35
62
  }
@@ -40,7 +67,7 @@ exports.ConnectionError = ConnectionError;
40
67
  */
41
68
  class TransactionError extends SochDBError {
42
69
  constructor(message) {
43
- super(message);
70
+ super(message, ErrorCode.TRANSACTION_ABORTED);
44
71
  this.name = 'TransactionError';
45
72
  Object.setPrototypeOf(this, TransactionError.prototype);
46
73
  }
@@ -51,7 +78,7 @@ exports.TransactionError = TransactionError;
51
78
  */
52
79
  class ProtocolError extends SochDBError {
53
80
  constructor(message) {
54
- super(message);
81
+ super(message, ErrorCode.PROTOCOL_ERROR);
55
82
  this.name = 'ProtocolError';
56
83
  Object.setPrototypeOf(this, ProtocolError.prototype);
57
84
  }
@@ -62,10 +89,83 @@ exports.ProtocolError = ProtocolError;
62
89
  */
63
90
  class DatabaseError extends SochDBError {
64
91
  constructor(message) {
65
- super(message);
92
+ super(message, ErrorCode.STORAGE_ERROR);
66
93
  this.name = 'DatabaseError';
67
94
  Object.setPrototypeOf(this, DatabaseError.prototype);
68
95
  }
69
96
  }
70
97
  exports.DatabaseError = DatabaseError;
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBRUgsMERBQTBEO0FBQzFELEVBQUU7QUFDRixrRUFBa0U7QUFDbEUsbUVBQW1FO0FBQ25FLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0YsaURBQWlEO0FBRWpEOztHQUVHO0FBQ0gsTUFBYSxXQUFZLFNBQVEsS0FBSztJQUNwQyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7UUFDMUIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7Q0FDRjtBQU5ELGtDQU1DO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLGVBQWdCLFNBQVEsV0FBVztJQUM5QyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztRQUM5QixNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekQsQ0FBQztDQUNGO0FBTkQsMENBTUM7QUFFRDs7R0FFRztBQUNILE1BQWEsZ0JBQWlCLFNBQVEsV0FBVztJQUMvQyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQztRQUMvQixNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxRCxDQUFDO0NBQ0Y7QUFORCw0Q0FNQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxhQUFjLFNBQVEsV0FBVztJQUM1QyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7UUFDNUIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7Q0FDRjtBQU5ELHNDQU1DO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLGFBQWMsU0FBUSxXQUFXO0lBQzVDLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQztRQUM1QixNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkQsQ0FBQztDQUNGO0FBTkQsc0NBTUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNvY2hEQiBFcnJvciBDbGFzc2VzXG4gKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi9cblxuLy8gQ29weXJpZ2h0IDIwMjUgU3VzaGFudGggKGh0dHBzOi8vZ2l0aHViLmNvbS9zdXNoYW50aHB5KVxuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbi8qKlxuICogQmFzZSBlcnJvciBjbGFzcyBmb3IgYWxsIFNvY2hEQiBlcnJvcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTb2NoREJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1NvY2hEQkVycm9yJztcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgU29jaERCRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlIGZhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgU29jaERCRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29ubmVjdGlvbkVycm9yJztcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgQ29ubmVjdGlvbkVycm9yLnByb3RvdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBhIHRyYW5zYWN0aW9uIG9wZXJhdGlvbiBmYWlscy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uRXJyb3IgZXh0ZW5kcyBTb2NoREJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdUcmFuc2FjdGlvbkVycm9yJztcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgVHJhbnNhY3Rpb25FcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlcmUncyBhIHByb3RvY29sIGVycm9yIGluIElQQyBjb21tdW5pY2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUHJvdG9jb2xFcnJvciBleHRlbmRzIFNvY2hEQkVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1Byb3RvY29sRXJyb3InO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBQcm90b2NvbEVycm9yLnByb3RvdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBhIGRhdGFiYXNlIG9wZXJhdGlvbiBmYWlscy5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFiYXNlRXJyb3IgZXh0ZW5kcyBTb2NoREJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdEYXRhYmFzZUVycm9yJztcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgRGF0YWJhc2VFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG4iXX0=
98
+ // ============================================================================
99
+ // Lock/Concurrency Errors (v0.4.1)
100
+ // ============================================================================
101
+ /**
102
+ * Base class for lock-related errors.
103
+ */
104
+ class LockError extends SochDBError {
105
+ constructor(message, code = ErrorCode.DATABASE_LOCKED, remediation) {
106
+ super(message, code, remediation);
107
+ this.name = 'LockError';
108
+ Object.setPrototypeOf(this, LockError.prototype);
109
+ }
110
+ }
111
+ exports.LockError = LockError;
112
+ /**
113
+ * Error thrown when database is locked by another process.
114
+ */
115
+ class DatabaseLockedError extends LockError {
116
+ path;
117
+ holderPid;
118
+ constructor(path, holderPid) {
119
+ const msg = holderPid
120
+ ? `Database at '${path}' is locked by process ${holderPid}`
121
+ : `Database at '${path}' is locked`;
122
+ super(msg, ErrorCode.DATABASE_LOCKED, 'Close the other process or wait for the lock to be released');
123
+ this.name = 'DatabaseLockedError';
124
+ this.path = path;
125
+ this.holderPid = holderPid;
126
+ Object.setPrototypeOf(this, DatabaseLockedError.prototype);
127
+ }
128
+ }
129
+ exports.DatabaseLockedError = DatabaseLockedError;
130
+ /**
131
+ * Error thrown when timed out waiting for database lock.
132
+ */
133
+ class LockTimeoutError extends LockError {
134
+ path;
135
+ timeoutSecs;
136
+ constructor(path, timeoutSecs) {
137
+ super(`Timed out after ${timeoutSecs}s waiting for lock on '${path}'`, ErrorCode.LOCK_TIMEOUT, 'Increase timeout or check for deadlocks');
138
+ this.name = 'LockTimeoutError';
139
+ this.path = path;
140
+ this.timeoutSecs = timeoutSecs;
141
+ Object.setPrototypeOf(this, LockTimeoutError.prototype);
142
+ }
143
+ }
144
+ exports.LockTimeoutError = LockTimeoutError;
145
+ /**
146
+ * Error thrown when WAL epoch mismatch detected (stale writer).
147
+ */
148
+ class EpochMismatchError extends LockError {
149
+ expected;
150
+ actual;
151
+ constructor(expected, actual) {
152
+ super(`Epoch mismatch: expected ${expected}, found ${actual}`, ErrorCode.EPOCH_MISMATCH, 'Another writer has taken over. Re-open the database.');
153
+ this.name = 'EpochMismatchError';
154
+ this.expected = expected;
155
+ this.actual = actual;
156
+ Object.setPrototypeOf(this, EpochMismatchError.prototype);
157
+ }
158
+ }
159
+ exports.EpochMismatchError = EpochMismatchError;
160
+ /**
161
+ * Error thrown when split-brain condition detected (multiple writers).
162
+ */
163
+ class SplitBrainError extends LockError {
164
+ constructor(message = 'Split-brain detected: multiple active writers') {
165
+ super(message, ErrorCode.SPLIT_BRAIN, 'Stop all writers, verify data integrity, then restart with single writer');
166
+ this.name = 'SplitBrainError';
167
+ Object.setPrototypeOf(this, SplitBrainError.prototype);
168
+ }
169
+ }
170
+ exports.SplitBrainError = SplitBrainError;
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBRUgsMERBQTBEO0FBQzFELEVBQUU7QUFDRixrRUFBa0U7QUFDbEUsbUVBQW1FO0FBQ25FLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0YsaURBQWlEO0FBRWpEOztHQUVHO0FBQ0gsSUFBWSxTQXFCWDtBQXJCRCxXQUFZLFNBQVM7SUFDbkIsMkJBQTJCO0lBQzNCLHNFQUF3QixDQUFBO0lBQ3hCLHdFQUF5QixDQUFBO0lBQ3pCLHNFQUF3QixDQUFBO0lBQ3hCLGdFQUFxQixDQUFBO0lBRXJCLDRCQUE0QjtJQUM1QiwwRUFBMEIsQ0FBQTtJQUMxQiw0RUFBMkIsQ0FBQTtJQUUzQix5QkFBeUI7SUFDekIsZ0VBQXFCLENBQUE7SUFDckIsOERBQW9CLENBQUE7SUFFcEIsMkNBQTJDO0lBQzNDLG1FQUF1QixDQUFBO0lBQ3ZCLDZEQUFvQixDQUFBO0lBQ3BCLGlFQUFzQixDQUFBO0lBQ3RCLDJEQUFtQixDQUFBO0lBQ25CLHlEQUFrQixDQUFBO0FBQ3BCLENBQUMsRUFyQlcsU0FBUyx5QkFBVCxTQUFTLFFBcUJwQjtBQUVEOztHQUVHO0FBQ0gsTUFBYSxXQUFZLFNBQVEsS0FBSztJQUNwQixJQUFJLENBQVk7SUFDaEIsV0FBVyxDQUFVO0lBRXJDLFlBQVksT0FBZSxFQUFFLE9BQWtCLFNBQVMsQ0FBQyxjQUFjLEVBQUUsV0FBb0I7UUFDM0YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JE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QyxDQUFDO0lBQ3pELENBQUM7Q0FDRjtBQVZELDBDQVVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTb2NoREIgRXJyb3IgQ2xhc3Nlc1xuICpcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbi8vIENvcHlyaWdodCAyMDI1IFN1c2hhbnRoIChodHRwczovL2dpdGh1Yi5jb20vc3VzaGFudGhweSlcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4vKipcbiAqIEVycm9yIGNvZGVzIG1hdGNoaW5nIFJ1c3QgZXJyb3IgY29kZXMuXG4gKi9cbmV4cG9ydCBlbnVtIEVycm9yQ29kZSB7XG4gIC8vIENvbm5lY3Rpb24gZXJyb3JzICgxeHh4KVxuICBDT05ORUNUSU9OX0ZBSUxFRCA9IDEwMDEsXG4gIENPTk5FQ1RJT05fVElNRU9VVCA9IDEwMDIsXG4gIENPTk5FQ1RJT05fQ0xPU0VEID0gMTAwMyxcbiAgUFJPVE9DT0xfRVJST1IgPSAxMDA0LFxuICBcbiAgLy8gVHJhbnNhY3Rpb24gZXJyb3JzICgyeHh4KVxuICBUUkFOU0FDVElPTl9BQk9SVEVEID0gMjAwMSxcbiAgVFJBTlNBQ1RJT05fQ09ORkxJQ1QgPSAyMDAyLFxuICBcbiAgLy8gSW50ZXJuYWwgZXJyb3JzICg5eHh4KVxuICBJTlRFUk5BTF9FUlJPUiA9IDkwMDEsXG4gIFNUT1JBR0VfRVJST1IgPSA5MDAzLFxuICBcbiAgLy8gTG9jay9Db25jdXJyZW5jeSBlcnJvcnMgKDEweHh4KSAtIHYwLjQuMVxuICBEQVRBQkFTRV9MT0NLRUQgPSAxMDAwMSxcbiAgTE9DS19USU1FT1VUID0gMTAwMDIsXG4gIEVQT0NIX01JU01BVENIID0gMTAwMDMsXG4gIFNQTElUX0JSQUlOID0gMTAwMDQsXG4gIFNUQUxFX0xPQ0sgPSAxMDAwNSxcbn1cblxuLyoqXG4gKiBCYXNlIGVycm9yIGNsYXNzIGZvciBhbGwgU29jaERCIGVycm9ycy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNvY2hEQkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY29kZTogRXJyb3JDb2RlO1xuICBwdWJsaWMgcmVhZG9ubHkgcmVtZWRpYXRpb24/OiBzdHJpbmc7XG4gIFxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGNvZGU6IEVycm9yQ29kZSA9IEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiwgcmVtZWRpYXRpb24/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnU29jaERCRXJyb3InO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgdGhpcy5yZW1lZGlhdGlvbiA9IHJlbWVkaWF0aW9uO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBTb2NoREJFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgZmFpbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uRXJyb3IgZXh0ZW5kcyBTb2NoREJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIEVycm9yQ29kZS5DT05ORUNUSU9OX0ZBSUxFRCk7XG4gICAgdGhpcy5uYW1lID0gJ0Nvbm5lY3Rpb25FcnJvcic7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIENvbm5lY3Rpb25FcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYSB0cmFuc2FjdGlvbiBvcGVyYXRpb24gZmFpbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkVycm9yIGV4dGVuZHMgU29jaERCRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFcnJvckNvZGUuVFJBTlNBQ1RJT05fQUJPUlRFRCk7XG4gICAgdGhpcy5uYW1lID0gJ1RyYW5zYWN0aW9uRXJyb3InO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBUcmFuc2FjdGlvbkVycm9yLnByb3RvdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0aGVyZSdzIGEgcHJvdG9jb2wgZXJyb3IgaW4gSVBDIGNvbW11bmljYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm90b2NvbEVycm9yIGV4dGVuZHMgU29jaERCRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFcnJvckNvZGUuUFJPVE9DT0xfRVJST1IpO1xuICAgIHRoaXMubmFtZSA9ICdQcm90b2NvbEVycm9yJztcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgUHJvdG9jb2xFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYSBkYXRhYmFzZSBvcGVyYXRpb24gZmFpbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZUVycm9yIGV4dGVuZHMgU29jaERCRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFcnJvckNvZGUuU1RPUkFHRV9FUlJPUik7XG4gICAgdGhpcy5uYW1lID0gJ0RhdGFiYXNlRXJyb3InO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBEYXRhYmFzZUVycm9yLnByb3RvdHlwZSk7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTG9jay9Db25jdXJyZW5jeSBFcnJvcnMgKHYwLjQuMSlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBsb2NrLXJlbGF0ZWQgZXJyb3JzLlxuICovXG5leHBvcnQgY2xhc3MgTG9ja0Vycm9yIGV4dGVuZHMgU29jaERCRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGNvZGU6IEVycm9yQ29kZSA9IEVycm9yQ29kZS5EQVRBQkFTRV9MT0NLRUQsIHJlbWVkaWF0aW9uPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY29kZSwgcmVtZWRpYXRpb24pO1xuICAgIHRoaXMubmFtZSA9ICdMb2NrRXJyb3InO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBMb2NrRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGRhdGFiYXNlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZUxvY2tlZEVycm9yIGV4dGVuZHMgTG9ja0Vycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGhvbGRlclBpZD86IG51bWJlcjtcbiAgXG4gIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZywgaG9sZGVyUGlkPzogbnVtYmVyKSB7XG4gICAgY29uc3QgbXNnID0gaG9sZGVyUGlkIFxuICAgICAgPyBgRGF0YWJhc2UgYXQgJyR7cGF0aH0nIGlzIGxvY2tlZCBieSBwcm9jZXNzICR7aG9sZGVyUGlkfWBcbiAgICAgIDogYERhdGFiYXNlIGF0ICcke3BhdGh9JyBpcyBsb2NrZWRgO1xuICAgIHN1cGVyKG1zZywgRXJyb3JDb2RlLkRBVEFCQVNFX0xPQ0tFRCwgJ0Nsb3NlIHRoZSBvdGhlciBwcm9jZXNzIG9yIHdhaXQgZm9yIHRoZSBsb2NrIHRvIGJlIHJlbGVhc2VkJyk7XG4gICAgdGhpcy5uYW1lID0gJ0RhdGFiYXNlTG9ja2VkRXJyb3InO1xuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgdGhpcy5ob2xkZXJQaWQgPSBob2xkZXJQaWQ7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIERhdGFiYXNlTG9ja2VkRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHRpbWVkIG91dCB3YWl0aW5nIGZvciBkYXRhYmFzZSBsb2NrLlxuICovXG5leHBvcnQgY2xhc3MgTG9ja1RpbWVvdXRFcnJvciBleHRlbmRzIExvY2tFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0aW1lb3V0U2VjczogbnVtYmVyO1xuICBcbiAgY29uc3RydWN0b3IocGF0aDogc3RyaW5nLCB0aW1lb3V0U2VjczogbnVtYmVyKSB7XG4gICAgc3VwZXIoXG4gICAgICBgVGltZWQgb3V0IGFmdGVyICR7dGltZW91dFNlY3N9cyB3YWl0aW5nIGZvciBsb2NrIG9uICcke3BhdGh9J2AsXG4gICAgICBFcnJvckNvZGUuTE9DS19USU1FT1VULFxuICAgICAgJ0luY3JlYXNlIHRpbWVvdXQgb3IgY2hlY2sgZm9yIGRlYWRsb2NrcydcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdMb2NrVGltZW91dEVycm9yJztcbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIHRoaXMudGltZW91dFNlY3MgPSB0aW1lb3V0U2VjcztcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTG9ja1RpbWVvdXRFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gV0FMIGVwb2NoIG1pc21hdGNoIGRldGVjdGVkIChzdGFsZSB3cml0ZXIpLlxuICovXG5leHBvcnQgY2xhc3MgRXBvY2hNaXNtYXRjaEVycm9yIGV4dGVuZHMgTG9ja0Vycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IGV4cGVjdGVkOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBhY3R1YWw6IG51bWJlcjtcbiAgXG4gIGNvbnN0cnVjdG9yKGV4cGVjdGVkOiBudW1iZXIsIGFjdHVhbDogbnVtYmVyKSB7XG4gICAgc3VwZXIoXG4gICAgICBgRXBvY2ggbWlzbWF0Y2g6IGV4cGVjdGVkICR7ZXhwZWN0ZWR9LCBmb3VuZCAke2FjdHVhbH1gLFxuICAgICAgRXJyb3JDb2RlLkVQT0NIX01JU01BVENILFxuICAgICAgJ0Fub3RoZXIgd3JpdGVyIGhhcyB0YWtlbiBvdmVyLiBSZS1vcGVuIHRoZSBkYXRhYmFzZS4nXG4gICAgKTtcbiAgICB0aGlzLm5hbWUgPSAnRXBvY2hNaXNtYXRjaEVycm9yJztcbiAgICB0aGlzLmV4cGVjdGVkID0gZXhwZWN0ZWQ7XG4gICAgdGhpcy5hY3R1YWwgPSBhY3R1YWw7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEVwb2NoTWlzbWF0Y2hFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gc3BsaXQtYnJhaW4gY29uZGl0aW9uIGRldGVjdGVkIChtdWx0aXBsZSB3cml0ZXJzKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNwbGl0QnJhaW5FcnJvciBleHRlbmRzIExvY2tFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9ICdTcGxpdC1icmFpbiBkZXRlY3RlZDogbXVsdGlwbGUgYWN0aXZlIHdyaXRlcnMnKSB7XG4gICAgc3VwZXIoXG4gICAgICBtZXNzYWdlLFxuICAgICAgRXJyb3JDb2RlLlNQTElUX0JSQUlOLFxuICAgICAgJ1N0b3AgYWxsIHdyaXRlcnMsIHZlcmlmeSBkYXRhIGludGVncml0eSwgdGhlbiByZXN0YXJ0IHdpdGggc2luZ2xlIHdyaXRlcidcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdTcGxpdEJyYWluRXJyb3InO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBTcGxpdEJyYWluRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuIl19