sliftutils 1.7.88 → 1.7.90

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 (126) hide show
  1. package/.claude/settings.local.json +3 -1
  2. package/dist/treeSummary.ts.cache +2 -2
  3. package/index.d.ts +679 -300
  4. package/misc/dist/environment.ts.cache +2 -2
  5. package/misc/dist/getSecret.ts.cache +2 -2
  6. package/misc/dist/strings.ts.cache +2 -2
  7. package/misc/dist/zip.ts.cache +2 -2
  8. package/misc/https/dist/certs.ts.cache +2 -2
  9. package/misc/https/dist/cloudflareHelpers.ts.cache +2 -2
  10. package/misc/https/dist/dns.ts.cache +2 -2
  11. package/misc/https/dist/hostServer.ts.cache +49 -21
  12. package/misc/https/dist/hostsFile.ts.cache +82 -0
  13. package/misc/https/dist/httpsCerts.ts.cache +2 -2
  14. package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
  15. package/misc/https/hostServer.d.ts +6 -2
  16. package/misc/https/hostServer.ts +52 -19
  17. package/misc/https/hostsFile.d.ts +7 -0
  18. package/misc/https/hostsFile.ts +66 -0
  19. package/package.json +1 -1
  20. package/render-utils/dist/observer.tsx.cache +2 -2
  21. package/storage/ArchivesDisk.d.ts +3 -6
  22. package/storage/ArchivesDisk.ts +26 -2
  23. package/storage/BulkDatabase2/BulkDatabaseReader.ts +1 -1
  24. package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +2 -2
  25. package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +2 -2
  26. package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +2 -2
  27. package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +3 -3
  28. package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +2 -2
  29. package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +2 -2
  30. package/storage/BulkDatabase2/dist/blockCache.ts.cache +2 -2
  31. package/storage/BulkDatabase2/dist/mergeLock.ts.cache +2 -2
  32. package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +2 -2
  33. package/storage/BulkDatabase2/dist/streamLog.ts.cache +2 -2
  34. package/storage/BulkDatabase2/dist/syncClient.ts.cache +2 -2
  35. package/storage/IArchives.d.ts +37 -24
  36. package/storage/IArchives.ts +47 -62
  37. package/storage/LogMap.d.ts +56 -0
  38. package/storage/LogMap.ts +220 -0
  39. package/storage/archiveHelpers.d.ts +36 -0
  40. package/storage/archiveHelpers.ts +103 -0
  41. package/storage/backblaze.d.ts +7 -12
  42. package/storage/backblaze.ts +53 -48
  43. package/storage/dist/ArchivesDisk.ts.cache +29 -3
  44. package/storage/dist/FileFolderAPI.tsx.cache +2 -2
  45. package/storage/dist/IArchives.ts.cache +17 -53
  46. package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
  47. package/storage/dist/JSONStorage.ts.cache +2 -2
  48. package/storage/dist/LogMap.ts.cache +212 -0
  49. package/storage/dist/PendingManager.tsx.cache +2 -2
  50. package/storage/dist/TransactionStorage.ts.cache +2 -2
  51. package/storage/dist/archiveHelpers.ts.cache +87 -0
  52. package/storage/dist/backblaze.ts.cache +59 -45
  53. package/storage/dist/fileSystemPointer.ts.cache +2 -2
  54. package/storage/dist/remoteFileStorage.ts.cache +2 -2
  55. package/storage/remoteStorage/ArchivesDelayed.d.ts +66 -0
  56. package/storage/remoteStorage/ArchivesDelayed.ts +237 -0
  57. package/storage/remoteStorage/ArchivesRemote.d.ts +5 -6
  58. package/storage/remoteStorage/ArchivesRemote.ts +26 -5
  59. package/storage/remoteStorage/ArchivesUrl.d.ts +2 -5
  60. package/storage/remoteStorage/ArchivesUrl.ts +2 -2
  61. package/storage/remoteStorage/accessPage.tsx +12 -0
  62. package/storage/remoteStorage/blobStore.d.ts +162 -189
  63. package/storage/remoteStorage/blobStore.ts +495 -952
  64. package/storage/remoteStorage/bucketDisk.d.ts +24 -3
  65. package/storage/remoteStorage/bucketDisk.ts +56 -22
  66. package/storage/remoteStorage/certTrustModal.d.ts +1 -0
  67. package/storage/remoteStorage/certTrustModal.tsx +48 -0
  68. package/storage/remoteStorage/cliArgs.d.ts +2 -0
  69. package/storage/remoteStorage/cliArgs.ts +5 -0
  70. package/storage/remoteStorage/createArchives.d.ts +8 -7
  71. package/storage/remoteStorage/createArchives.ts +65 -26
  72. package/storage/remoteStorage/deployTakeover.ts +1 -1
  73. package/storage/remoteStorage/dist/ArchivesDelayed.ts.cache +220 -0
  74. package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +26 -6
  75. package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +3 -3
  76. package/storage/remoteStorage/dist/accessPage.tsx.cache +13 -3
  77. package/storage/remoteStorage/dist/accessStats.ts.cache +2 -2
  78. package/storage/remoteStorage/dist/blobStore.ts.cache +484 -966
  79. package/storage/remoteStorage/dist/bucketDisk.ts.cache +60 -29
  80. package/storage/remoteStorage/dist/certTrustModal.tsx.cache +55 -0
  81. package/storage/remoteStorage/dist/cliArgs.ts.cache +9 -4
  82. package/storage/remoteStorage/dist/createArchives.ts.cache +64 -27
  83. package/storage/remoteStorage/dist/deployTakeover.ts.cache +5 -5
  84. package/storage/remoteStorage/dist/intermediateManagement.ts.cache +286 -0
  85. package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
  86. package/storage/remoteStorage/dist/remoteConfig.ts.cache +122 -56
  87. package/storage/remoteStorage/dist/serverConfig.ts.cache +4 -4
  88. package/storage/remoteStorage/dist/sourceWrapper.ts.cache +7 -11
  89. package/storage/remoteStorage/dist/sourcesList.ts.cache +3 -6
  90. package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
  91. package/storage/remoteStorage/dist/storageController.ts.cache +33 -36
  92. package/storage/remoteStorage/dist/storageServer.ts.cache +27 -7
  93. package/storage/remoteStorage/dist/storageServerCli.ts.cache +7 -3
  94. package/storage/remoteStorage/dist/storageServerState.ts.cache +138 -707
  95. package/storage/remoteStorage/dist/storeConfig.ts.cache +52 -0
  96. package/storage/remoteStorage/dist/storePlan.ts.cache +110 -81
  97. package/storage/remoteStorage/dist/storeSources.ts.cache +51 -0
  98. package/storage/remoteStorage/dist/storeSync.ts.cache +651 -0
  99. package/storage/remoteStorage/dist/validation.ts.cache +14 -4
  100. package/storage/remoteStorage/intermediateManagement.d.ts +12 -0
  101. package/storage/remoteStorage/intermediateManagement.ts +264 -0
  102. package/storage/remoteStorage/remoteConfig.d.ts +32 -0
  103. package/storage/remoteStorage/remoteConfig.ts +115 -50
  104. package/storage/remoteStorage/serverConfig.d.ts +1 -1
  105. package/storage/remoteStorage/serverConfig.ts +1 -1
  106. package/storage/remoteStorage/sourceWrapper.ts +4 -8
  107. package/storage/remoteStorage/sourcesList.d.ts +0 -2
  108. package/storage/remoteStorage/sourcesList.ts +0 -3
  109. package/storage/remoteStorage/spec.md +18 -4
  110. package/storage/remoteStorage/storageController.d.ts +10 -0
  111. package/storage/remoteStorage/storageController.ts +37 -41
  112. package/storage/remoteStorage/storageServer.d.ts +2 -0
  113. package/storage/remoteStorage/storageServer.ts +28 -4
  114. package/storage/remoteStorage/storageServerCli.ts +5 -1
  115. package/storage/remoteStorage/storageServerState.d.ts +39 -26
  116. package/storage/remoteStorage/storageServerState.ts +149 -669
  117. package/storage/remoteStorage/storeConfig.d.ts +30 -0
  118. package/storage/remoteStorage/storeConfig.ts +62 -0
  119. package/storage/remoteStorage/storePlan.d.ts +29 -17
  120. package/storage/remoteStorage/storePlan.ts +112 -85
  121. package/storage/remoteStorage/storeSources.d.ts +11 -0
  122. package/storage/remoteStorage/storeSources.ts +47 -0
  123. package/storage/remoteStorage/storeSync.d.ts +53 -0
  124. package/storage/remoteStorage/storeSync.ts +632 -0
  125. package/storage/remoteStorage/validation.d.ts +2 -0
  126. package/storage/remoteStorage/validation.ts +10 -0
@@ -248,7 +248,8 @@ class RemoteStorageControllerBase {
248
248
  // Copied because the wire hands us a plain Uint8Array view, not a real Buffer
249
249
  let data = Buffer.from(config.data);
250
250
  if (config.path === remoteConfig_1.ROUTING_FILE) {
251
- return await (0, storageServerState_1.queueRoutingConfigWrite)(config.account, config.bucketName, data, config);
251
+ // The store the caller selected owns this file: it applies it, enforces the version rule, and its peers pull it from there
252
+ return await (0, storageServerState_1.writeRoutingConfig)(config.account, config.bucketName, config.sourceConfig.name, data, config);
252
253
  }
253
254
  await withStore(config, store => store.set({ ...config, data }));
254
255
  }
@@ -256,6 +257,13 @@ class RemoteStorageControllerBase {
256
257
  (0, serverConfig_1.assertWritesAllowed)();
257
258
  await withStore(config, store => store.del(config));
258
259
  }
260
+ async move(config) {
261
+ (0, serverConfig_1.assertWritesAllowed)();
262
+ // assertValidArgs only knows the well-known `path` field, so the two paths of a move are validated here
263
+ (0, validation_1.assertValidPath)(config.fromPath);
264
+ (0, validation_1.assertValidPath)(config.toPath);
265
+ await withStore(config, store => store.move(config));
266
+ }
259
267
  async getInfo(config) {
260
268
  if (config.path === remoteConfig_1.ROUTING_FILE) {
261
269
  let result = await (0, bucketDisk_1.getRoutingFileResult)(config.account, config.bucketName);
@@ -275,7 +283,7 @@ class RemoteStorageControllerBase {
275
283
  async listBuckets(config) {
276
284
  let start = Date.now();
277
285
  try {
278
- return await (0, storageServerState_1.listAccountBuckets)(config.account);
286
+ return await (0, storageServerState_1.debugListAccountBuckets)(config.account);
279
287
  }
280
288
  finally {
281
289
  // The access hook (and the storage it initializes) runs before this, so a large gap between this and the caller's timing is the hook
@@ -284,7 +292,7 @@ class RemoteStorageControllerBase {
284
292
  }
285
293
  /** The live, in-memory state of one bucket, or a string saying why it is unavailable. Answered without touching the disk, so it is cheap - but only works while the bucket is loaded here. */
286
294
  async getActiveBucket(config) {
287
- return await (0, storageServerState_1.getActiveBucket)(config.account, config.bucketName);
295
+ return await (0, storageServerState_1.debugGetActiveBucket)(config.account, config.bucketName);
288
296
  }
289
297
  /** Loads a bucket that exists on this server into memory (starting its synchronization) and returns its live state, or a string saying why it could not be loaded. */
290
298
  async activateBucket(config) {
@@ -293,7 +301,7 @@ class RemoteStorageControllerBase {
293
301
  /** Zeroes the write statistics listBuckets reports and the in-memory access statistics, for every bucket in the account. */
294
302
  async clearWriteStats(config) {
295
303
  (0, accessStats_1.clearAccountAccessStats)(config.account);
296
- return { clearedBuckets: (0, storageServerState_1.clearAccountWriteStats)(config.account) };
304
+ return { clearedBuckets: (0, storageServerState_1.debugClearAccountWriteStats)(config.account) };
297
305
  }
298
306
  /** In-memory totals per operation type since startup (or the last clearWriteStats). */
299
307
  async getAccessStats(config) {
@@ -304,17 +312,19 @@ class RemoteStorageControllerBase {
304
312
  return (0, accessStats_1.readAccessSummaries)(config);
305
313
  }
306
314
  async getIndexInfo(config) {
307
- return await (0, storageServerState_1.bucketIndexTotals)(await (0, storageServerState_1.requireBucket)(config.account, config.bucketName));
315
+ return await (0, storageServerState_1.debugBucketIndexTotals)(await (0, storageServerState_1.requireBucket)(config.account, config.bucketName));
308
316
  }
309
317
  async getSyncStatus(config) {
310
318
  return await (0, storageServerState_1.bucketSyncStatus)(await (0, storageServerState_1.requireBucket)(config.account, config.bucketName));
311
319
  }
312
320
  async startLargeFile(config) {
313
321
  (0, serverConfig_1.assertWritesAllowed)();
314
- let target = await (0, storageServerState_1.findBucketStore)(config.account, config.bucketName, config.sourceConfig);
315
- let id = await target.store.startLargeUpload({ path: config.path, lastModified: config.lastModified });
316
- // routeKey pins the upload's parts and finish to the same store the start picked (in-flight uploads survive a bucket rebuild: the part data lives in the store's folder, which a rebuilt store still sees)
317
- largeUploadInfo.set(id, { account: config.account, bucketName: config.bucketName, path: config.path, lastModified: config.lastModified, routeKey: target.routeKey });
322
+ let store = (0, storageServerState_1.findBucketStore)(config.account, config.bucketName, config.sourceConfig);
323
+ // The store validates the write here, before any bytes move (see BlobStore.startLargeUpload) - a large file is a set, and its SetConfig decides whether it is even allowed
324
+ let write = { path: config.path, lastModified: config.lastModified, forceSetImmutable: config.forceSetImmutable, noChecks: config.noChecks, internal: config.internal };
325
+ let id = await store.startLargeUpload(write);
326
+ // The store name pins the upload's parts and finish to the same store the start picked (in-flight uploads survive a bucket rebuild: the part data lives in that store's folder, which a rebuilt store still opens)
327
+ largeUploadInfo.set(id, { ...write, account: config.account, bucketName: config.bucketName, storeName: config.sourceConfig.name });
318
328
  return id;
319
329
  }
320
330
  async uploadPart(config) {
@@ -323,8 +333,7 @@ class RemoteStorageControllerBase {
323
333
  if (!info)
324
334
  throw new Error(`Unknown large upload ${config.uploadId}`);
325
335
  (0, accessStats_1.trackAccess)({ account: info.account, operation: "uploadPart", path: `${info.bucketName}/${info.path}`, size: config.data.length });
326
- let target = await findUploadStore(info);
327
- await target.store.appendLargeUpload({ id: config.uploadId, data: Buffer.from(config.data) });
336
+ await (0, storageServerState_1.getStore)(info.account, info.bucketName, info.storeName).appendLargeUpload({ id: config.uploadId, data: Buffer.from(config.data) });
328
337
  }
329
338
  async finishLargeFile(config) {
330
339
  (0, serverConfig_1.assertWritesAllowed)();
@@ -332,23 +341,15 @@ class RemoteStorageControllerBase {
332
341
  if (!info)
333
342
  throw new Error(`Unknown large upload ${config.uploadId}`);
334
343
  largeUploadInfo.delete(config.uploadId);
335
- let target = await findUploadStore(info);
336
- await target.store.finishLargeUpload({ id: config.uploadId, path: info.path, lastModified: info.lastModified });
344
+ await (0, storageServerState_1.getStore)(info.account, info.bucketName, info.storeName).finishLargeUpload({ id: config.uploadId, path: info.path, lastModified: info.lastModified, forceSetImmutable: info.forceSetImmutable, noChecks: info.noChecks, internal: info.internal });
337
345
  }
338
- /** Best-effort cleanup: an upload whose bucket or store has since vanished has nothing left to cancel. */
346
+ /** Best-effort cleanup: an unknown upload has nothing left to cancel. */
339
347
  async cancelLargeFile(config) {
340
348
  let info = largeUploadInfo.get(config.uploadId);
341
349
  if (!info)
342
350
  return;
343
351
  largeUploadInfo.delete(config.uploadId);
344
- let bucket = await (0, storageServerState_1.getLoadedBucket)(info.account, info.bucketName);
345
- if (!bucket)
346
- return;
347
- const routeKey = info.routeKey;
348
- let target = bucket.stores.find(x => x.routeKey === routeKey);
349
- if (!target)
350
- return;
351
- await target.store.cancelLargeUpload({ id: config.uploadId });
352
+ await (0, storageServerState_1.getStore)(info.account, info.bucketName, info.storeName).cancelLargeUpload({ id: config.uploadId });
352
353
  }
353
354
  // IMPORTANT: We can never expose enumeration (listing, prefix search, changes feeds) over this public HTTP endpoint - only exact-key reads. Enumeration would be a massive security risk (public buckets rely on unguessable keys staying unguessable), and could also crash the client by sending them too much data. Listings exist only on the authenticated API (findInfo etc, behind accountAccess).
354
355
  async httpEntry(config) {
@@ -386,7 +387,7 @@ class RemoteStorageControllerBase {
386
387
  let info;
387
388
  if (filePath !== remoteConfig_1.ROUTING_FILE) {
388
389
  let route = (0, remoteConfig_1.getRoute)(filePath);
389
- httpStore = bucket.stores.find(s => (0, remoteConfig_1.routeContains)(s.route, route));
390
+ httpStore = bucket.stores.find(s => s.entries.some(e => (0, remoteConfig_1.routeContains)(e.route, route)));
390
391
  info = httpStore && await httpStore.store.getInfo({ path: filePath }) || undefined;
391
392
  }
392
393
  else {
@@ -472,6 +473,10 @@ __decorate([
472
473
  validation_1.assertValidArgs,
473
474
  (0, accessStats_1.trackAccessCall)("del")
474
475
  ], RemoteStorageControllerBase.prototype, "del", null);
476
+ __decorate([
477
+ validation_1.assertValidArgs,
478
+ (0, accessStats_1.trackAccessCall)("move")
479
+ ], RemoteStorageControllerBase.prototype, "move", null);
475
480
  __decorate([
476
481
  validation_1.assertValidArgs,
477
482
  (0, accessStats_1.trackAccessCall)("getInfo")
@@ -514,20 +519,11 @@ __decorate([
514
519
  __decorate([
515
520
  validation_1.assertValidArgs
516
521
  ], RemoteStorageControllerBase.prototype, "startLargeFile", null);
517
- /** The one resolution every data call does: the client's selected sourceConfig maps to exactly one store (loading the bucket - and so instantiating its stores - if needed), and fn runs on it. findBucketStore throws for missing buckets and unmatched configs. */
522
+ /** The one resolution every data call does: the client's selected sourceConfig NAMES exactly one store (created on first use), and fn runs on it. */
518
523
  async function withStore(config, fn) {
519
- let target = await (0, storageServerState_1.findBucketStore)(config.account, config.bucketName, config.sourceConfig);
520
- return await fn(target.store);
524
+ return await fn((0, storageServerState_1.findBucketStore)(config.account, config.bucketName, config.sourceConfig));
521
525
  }
522
526
  const largeUploadInfo = new Map();
523
- async function findUploadStore(info) {
524
- let bucket = await (0, storageServerState_1.requireBucket)(info.account, info.bucketName);
525
- let target = bucket.stores.find(x => x.routeKey === info.routeKey);
526
- if (!target) {
527
- throw new Error(`The store (route ${info.routeKey}) this upload targets no longer exists on bucket ${info.account}/${info.bucketName} (available: ${JSON.stringify(bucket.stores.map(x => x.routeKey))})`);
528
- }
529
- return target;
530
- }
531
527
  const accountAccess = async (context) => {
532
528
  let start = Date.now();
533
529
  let config = context.call.args[0];
@@ -560,6 +556,7 @@ exports.RemoteStorageController = SocketFunction_1.SocketFunction.register(expor
560
556
  get2: { hooks: [accountAccess] },
561
557
  set: { hooks: [accountAccess] },
562
558
  del: { hooks: [accountAccess] },
559
+ move: { hooks: [accountAccess] },
563
560
  getInfo: { hooks: [accountAccess] },
564
561
  findInfo: { hooks: [accountAccess] },
565
562
  getChangesAfter2: { hooks: [accountAccess] },
@@ -581,5 +578,5 @@ exports.RemoteStorageController = SocketFunction_1.SocketFunction.register(expor
581
578
  noClientHooks: true,
582
579
  noDefaultHooks: true,
583
580
  }));
584
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZUNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdG9yYWdlQ29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxtRUFBZ0U7QUFFaEUsNkRBQTREO0FBQzVELHlFQUFrRztBQUNsRyxpRUFBbUU7QUFDbkUsaUZBQThFO0FBQzlFLG1EQUF3RDtBQUN4RCxrREFBa0k7QUFDbEksNENBQW1JO0FBQ25JLGlEQUF1RTtBQUN2RSw2REFLOEI7QUFDOUIsaURBQW9HO0FBRXBHLDZDQUFvRDtBQUNwRCx1RUFBb0U7QUFDcEUsK0NBQThKO0FBQzlKLDZDQUFpRjtBQUdwRSxRQUFBLHlCQUF5QixHQUFHLGtDQUFrQyxDQUFDO0FBQy9ELFFBQUEsb0JBQW9CLEdBQUcsc0JBQXNCLENBQUM7QUFDOUMsUUFBQSx5QkFBeUIsR0FBRywyQ0FBMkMsQ0FBQztBQUN4RSxRQUFBLHFCQUFxQixHQUFHLHVDQUF1QyxDQUFDO0FBRTdFLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQVksR0FBRyxFQUFFLENBQUM7QUFDM0MsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7QUFDbEMsTUFBTSxZQUFZLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztBQUNoQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztBQWlDL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7QUFFM0Msd1pBQXdaO0FBQ3haLE1BQU0sYUFBYSxHQUE4QjtJQUM3QyxHQUFHLEVBQUUseUJBQXlCLEVBQUUsSUFBSSxFQUFFLGlDQUFpQztJQUN2RSxHQUFHLEVBQUUsMkJBQTJCLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFdBQVc7SUFDM0csSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxZQUFZO0lBQ3hELEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsaUJBQWlCO0NBQzlELENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFDM0MsU0FBUyxXQUFXO0lBQ2hCLElBQUksTUFBTSxHQUFHLCtCQUFjLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDO0lBQy9DLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU87SUFDekMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLCtCQUFjLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtRQUN6QyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQsU0FBZ0IsdUJBQXVCO0lBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMseUNBQXlDLGdCQUFnQixDQUFDLElBQUksb0JBQW9CLENBQUMsQ0FBQztJQUNoRyxLQUFLLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7UUFDdkMsS0FBSyxpREFBdUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkYsQ0FBQztBQUNMLENBQUM7QUFMRCwwREFLQztBQUVELFNBQVMsa0JBQWtCO0lBQ3ZCLElBQUksTUFBTSxHQUFHLCtCQUFjLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDeEMsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLGlDQUF5Qix3Q0FBd0MsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDMUcsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ3JCLENBQUM7QUFDRCxTQUFTLFdBQVc7SUFDaEIsT0FBTyxJQUFBLHVCQUFXLEVBQUMsK0JBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBQ0QsU0FBUyxPQUFPLENBQUMsU0FBaUI7SUFDOUIsT0FBTyxTQUFTLEtBQUssSUFBQSx1QkFBZSxFQUFDLElBQUEscUNBQXNCLEdBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBQ0QsU0FBUyxZQUFZO0lBQ2pCLElBQUksU0FBUyxHQUFHLGtCQUFrQixFQUFFLENBQUM7SUFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyw2QkFBcUIsK0VBQStFLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDekksQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ3JCLENBQUM7QUFDRCxLQUFLLFVBQVUsYUFBYSxDQUFDLE9BQWU7SUFDeEMsSUFBQSw0QkFBZSxFQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNwQyxJQUFJLFNBQVMsR0FBRyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3JDLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3pDLElBQUksS0FBSyxHQUFHLE1BQU0sSUFBQSx1QkFBUSxHQUFFLENBQUM7SUFDN0IsSUFBSSxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDekQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ1gsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFBLHFDQUFzQixHQUFFLENBQUM7UUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLDZCQUFxQixZQUFZLFNBQVMsNkJBQTZCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLG1CQUFtQixNQUFNLElBQUksSUFBSSxJQUFJLE9BQU8sMkJBQTJCLENBQUMsQ0FBQztJQUM5TCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDckIsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsU0FBaUI7SUFDNUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsR0FBRyxJQUFBLHFDQUFzQixHQUFFLENBQUM7SUFDNUQsT0FBTyxPQUFPLFNBQVMsS0FBSyxhQUFhLGdCQUFnQixTQUFTLEdBQUcsQ0FBQztBQUMxRSxDQUFDO0FBRUQsTUFBTSwyQkFBMkI7SUFDN0IsS0FBSyxDQUFDLElBQUk7UUFDTixXQUFXLEVBQUUsQ0FBQztRQUNkLE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBZ0I7UUFDL0IsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFBLHFDQUFzQixHQUFFLENBQUM7UUFDaEQsSUFBSSxNQUFNLEdBQUcsK0JBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN4QyxJQUFBLGNBQU0sRUFBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25ELElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDM0MsSUFBSSxPQUFPLEtBQUssNEJBQW9CLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLElBQUksQ0FBQyxTQUFTLENBQUMsNEJBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUgsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztZQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxJQUFJLFlBQVksSUFBSSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDO1FBQ2xKLENBQUM7UUFDRCxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksV0FBVyxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLHdCQUF3QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JJLENBQUM7UUFDRCxJQUFJLFNBQVMsR0FBRyxJQUFBLHFCQUFhLEVBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsSUFBQSxtQ0FBMkIsRUFBQyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBQSwyQkFBbUIsRUFBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDN0YsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFBLHFCQUFhLEVBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDN0gsQ0FBQztRQUNELFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2QyxPQUFPLFFBQVEsQ0FBQyxJQUFJLEdBQUcsWUFBWSxFQUFFLENBQUM7WUFDbEMsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztZQUMxQyxJQUFJLE1BQU0sS0FBSyxTQUFTO2dCQUFFLE1BQU07WUFDaEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBR0ssQUFBTixLQUFLLENBQUMsYUFBYSxDQUFDLE1BQTJCO1FBQzNDLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDN0IsSUFBSSxTQUFTLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztRQUNyQyxJQUFJLEVBQUUsR0FBRyxXQUFXLEVBQUUsQ0FBQztRQUN2QixJQUFJLGVBQWUsR0FBRyxNQUFNLElBQUEsMEJBQVcsR0FBRSxDQUFDO1FBQzFDLElBQUksUUFBUSxHQUFHLE1BQU0sZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkQsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUM7UUFDdEYsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQy9CLENBQUM7YUFBTSxDQUFDO1lBQ0osUUFBUSxHQUFHO2dCQUNQLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNsRCxPQUFPO2dCQUNQLFNBQVM7Z0JBQ1QsRUFBRTtnQkFDRixJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTthQUNuQixDQUFDO1lBQ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUMsTUFBTSxHQUFHLG1CQUFtQjtZQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvRCxNQUFNLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO0lBQzNILENBQUM7SUFHSyxBQUFOLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBMkI7UUFDNUMsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUM3QixJQUFJLFNBQVMsR0FBRyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3JDLElBQUksRUFBRSxHQUFHLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksS0FBSyxHQUFHLE1BQU0sSUFBQSx1QkFBUSxHQUFFLENBQUM7UUFDN0IsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLElBQUksU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNuRixJQUFJLE1BQU0sR0FBZ0IsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNiLElBQUksUUFBUSxHQUFHLE1BQU0sSUFBQSwwQkFBVyxHQUFFLENBQUM7WUFDbkMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQztZQUM5RyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUUsQ0FBQztZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUM7UUFFRCxJQUFJLGVBQWUsR0FBa0IsRUFBRSxDQUFDO1FBQ3hDLEtBQUssSUFBSSxHQUFHLElBQUksTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDO2dCQUFFLFNBQVM7WUFDN0MsSUFBSSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLElBQUksTUFBTTtnQkFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxNQUFNLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztRQUN6QyxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQXVDO1FBQzNELElBQUksUUFBUSxHQUFHLE1BQU0sSUFBQSwwQkFBVyxHQUFFLENBQUM7UUFDbkMsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBNkI7UUFDM0MsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUNqQyxJQUFJLGVBQWUsR0FBRyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNDLElBQUksS0FBSyxHQUFHLE1BQU0sSUFBQSx1QkFBUSxHQUFFLENBQUM7UUFDN0IsSUFBSSxRQUFRLEdBQUcsTUFBTSxJQUFBLDBCQUFXLEdBQUUsQ0FBQztRQUNuQyxLQUFLLElBQUksRUFBRSxJQUFJLE1BQU0sUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDdEMsS0FBSyxJQUFJLE9BQU8sSUFBSSxNQUFNLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQy9DLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTO29CQUFFLFNBQVM7Z0JBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDekYsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLDZCQUFxQixZQUFZLGVBQWUsNkJBQTZCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdkksQ0FBQztnQkFDRCxJQUFJLE1BQU0sR0FBZ0I7b0JBQ3RCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztvQkFDeEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO29CQUM1QixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7b0JBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7aUJBQ25CLENBQUM7Z0JBQ0YsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ25FLE9BQU8sTUFBTSxDQUFDO1lBQ2xCLENBQUM7UUFDTCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsZ0RBQWdELENBQUMsQ0FBQztJQUNsSSxDQUFDO0lBRUQsNE9BQTRPO0lBQzVPLEtBQUssQ0FBQyxzQkFBc0I7UUFDeEIsT0FBTyxJQUFBLHdDQUFtQixHQUFFLENBQUM7SUFDakMsQ0FBQztJQUNELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFzQjtRQUMxQyxJQUFJLFFBQVEsR0FBRyxNQUFNLElBQUEsMEJBQVcsR0FBRSxDQUFDO1FBQ25DLE9BQU8sTUFBTSxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUNELEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUE2QjtRQUNoRCxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ2pDLElBQUksS0FBSyxHQUFHLE1BQU0sSUFBQSx1QkFBUSxHQUFFLENBQUM7UUFDN0IsSUFBSSxRQUFRLEdBQUcsTUFBTSxJQUFBLDBCQUFXLEdBQUUsQ0FBQztRQUNuQyxLQUFLLElBQUksRUFBRSxJQUFJLE1BQU0sUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDdEMsS0FBSyxJQUFJLE9BQU8sSUFBSSxNQUFNLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQy9DLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTO29CQUFFLFNBQVM7Z0JBQzlDLElBQUksTUFBTSxHQUFnQjtvQkFDdEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO29CQUN4QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7b0JBQzVCLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtvQkFDZCxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtpQkFDbkIsQ0FBQztnQkFDRixNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDbkUsT0FBTyxNQUFNLENBQUM7WUFDbEIsQ0FBQztRQUNMLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0lBQ2xJLENBQUM7SUFJSyxBQUFOLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBa0w7UUFDekwsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLDJCQUFZLEVBQUUsQ0FBQztZQUMvQiwyTEFBMkw7WUFDM0wsT0FBTyxNQUFNLElBQUEsaUNBQW9CLEVBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLE9BQU8sTUFBTSxJQUFBLHVDQUFrQixFQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBQ0QsT0FBTyxNQUFNLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUdLLEFBQU4sS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUErSztRQUNyTCxJQUFBLGtDQUFtQixHQUFFLENBQUM7UUFDdEIsOEVBQThFO1FBQzlFLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSywyQkFBWSxFQUFFLENBQUM7WUFDL0IsT0FBTyxNQUFNLElBQUEsNENBQXVCLEVBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBQ0QsTUFBTSxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBR0ssQUFBTixLQUFLLENBQUMsR0FBRyxDQUFDLE1BQW9JO1FBQzFJLElBQUEsa0NBQW1CLEdBQUUsQ0FBQztRQUN0QixNQUFNLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUdLLEFBQU4sS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFzSDtRQUNoSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssMkJBQVksRUFBRSxDQUFDO1lBQy9CLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBQSxpQ0FBb0IsRUFBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzRSxPQUFPLE1BQU0sSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksU0FBUyxDQUFDO1FBQ3JGLENBQUM7UUFDRCxPQUFPLE1BQU0sU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBR0ssQUFBTixLQUFLLENBQUMsUUFBUSxDQUFDLE1BQXdHO1FBQ25ILE9BQU8sTUFBTSxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFHSyxBQUFOLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFzSDtRQUN6SSxPQUFPLE1BQU0sU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFSyxBQUFOLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUErQztRQUNuRSxPQUFPLElBQUEsb0NBQWUsRUFBQyxNQUFNLElBQUEsa0NBQWEsRUFBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFSyxBQUFOLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBMkI7UUFDekMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQztZQUNELE9BQU8sTUFBTSxJQUFBLHVDQUFrQixFQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwRCxDQUFDO2dCQUFTLENBQUM7WUFDUCxxSUFBcUk7WUFDckksT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLE1BQU0sQ0FBQyxPQUFPLG9CQUFvQixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUN6RixDQUFDO0lBQ0wsQ0FBQztJQUNELDhMQUE4TDtJQUV4TCxBQUFOLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBK0M7UUFDakUsT0FBTyxNQUFNLElBQUEsb0NBQWUsRUFBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBQ0Qsc0tBQXNLO0lBRWhLLEFBQU4sS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUErQztRQUNoRSxPQUFPLE1BQU0sSUFBQSxtQ0FBYyxFQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDRCw0SEFBNEg7SUFFdEgsQUFBTixLQUFLLENBQUMsZUFBZSxDQUFDLE1BQTJCO1FBQzdDLElBQUEscUNBQXVCLEVBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sRUFBRSxjQUFjLEVBQUUsSUFBQSwyQ0FBc0IsRUFBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsdUZBQXVGO0lBRWpGLEFBQU4sS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUEyQjtRQUM1QyxPQUFPLElBQUEsNkJBQWUsRUFBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELCtPQUErTztJQUV6TyxBQUFOLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUF3RjtRQUM3RyxPQUFPLElBQUEsaUNBQW1CLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVLLEFBQU4sS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUErQztRQUM5RCxPQUFPLE1BQU0sSUFBQSxzQ0FBaUIsRUFBQyxNQUFNLElBQUEsa0NBQWEsRUFBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFFSyxBQUFOLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBK0M7UUFDL0QsT0FBTyxNQUFNLElBQUEscUNBQWdCLEVBQUMsTUFBTSxJQUFBLGtDQUFhLEVBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBR0ssQUFBTixLQUFLLENBQUMsY0FBYyxDQUFDLE1BQWdIO1FBQ2pJLElBQUEsa0NBQW1CLEdBQUUsQ0FBQztRQUN0QixJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUEsb0NBQWUsRUFBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzNGLElBQUksRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN2RywyTUFBMk07UUFDM00sZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDckssT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBQ0QsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUEwQztRQUN2RCxJQUFBLGtDQUFtQixHQUFFLENBQUM7UUFDdEIsSUFBSSxJQUFJLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN0RSxJQUFBLHlCQUFXLEVBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbkksSUFBSSxNQUFNLEdBQUcsTUFBTSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBQ0QsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUE0QjtRQUM5QyxJQUFBLGtDQUFtQixHQUFFLENBQUM7UUFDdEIsSUFBSSxJQUFJLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN0RSxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QyxJQUFJLE1BQU0sR0FBRyxNQUFNLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDcEgsQ0FBQztJQUNELDBHQUEwRztJQUMxRyxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQTRCO1FBQzlDLElBQUksSUFBSSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQixlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QyxJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUEsb0NBQWUsRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDcEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ3BCLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsMFlBQTBZO0lBQzFZLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBd0Q7O1FBQ3BFLElBQUksTUFBTSxHQUFHLCtCQUFjLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDeEMsSUFBSSxPQUFPLEdBQUcsSUFBQSx1Q0FBcUIsR0FBRSxDQUFDO1FBQ3RDLElBQUksUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEdBQUcsS0FBSSxHQUFHLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDMUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxJQUFJLElBQUksR0FBRyxNQUFNLElBQUEsOEJBQWdCLEVBQUM7Z0JBQzlCLE1BQU07Z0JBQ04sSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLHFDQUFpQixDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2FBQ3hILENBQVcsQ0FBQztZQUNiLGlJQUFpSTtZQUNqSSxPQUFPLElBQUEsc0NBQW9CLEVBQUMsSUFBSSxFQUFFLEVBQUUsY0FBYyxFQUFFLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBQ0QsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN2RSxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2QyxPQUFPLElBQUEsc0NBQW9CLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFDRCxJQUFBLDRCQUFlLEVBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLElBQUEsNEJBQWUsRUFBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDM0MsSUFBQSw0QkFBZSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFCLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBQSxvQ0FBZSxFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDVixPQUFPLElBQUEsc0NBQW9CLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFDRCxJQUFJLENBQUMsQ0FBQSxNQUFBLE1BQU0sQ0FBQyxJQUFJLDBDQUFFLE1BQU0sQ0FBQSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLE9BQU8sSUFBSSxVQUFVLDZEQUE2RCxDQUFDLENBQUM7UUFDbEgsQ0FBQztRQUNELDZMQUE2TDtRQUM3TCxJQUFJLFNBQWtDLENBQUM7UUFDdkMsSUFBSSxJQUFxRCxDQUFDO1FBQzFELElBQUksUUFBUSxLQUFLLDJCQUFZLEVBQUUsQ0FBQztZQUM1QixJQUFJLEtBQUssR0FBRyxJQUFBLHVCQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0IsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBQSw0QkFBYSxFQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNuRSxJQUFJLEdBQUcsU0FBUyxJQUFJLE1BQU0sU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsSUFBSSxTQUFTLENBQUM7UUFDdkYsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLEdBQUcsTUFBTSxJQUFBLGlDQUFvQixFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QixJQUFBLHlCQUFXLEVBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxVQUFVLElBQUksUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDM0YsT0FBTyxJQUFBLHNDQUFvQixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBQ0QsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDMUMsSUFBSSxPQUFPLEdBQWlDO1lBQ3hDLGNBQWMsRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksMEJBQTBCO1lBQzlFLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxFQUFFO1lBQ3ZELGVBQWUsRUFBRSxPQUFPO1NBQzNCLENBQUM7UUFDRixJQUFJLE1BQUEsTUFBTSxDQUFDLElBQUksMENBQUUsU0FBUyxFQUFFLENBQUM7WUFDekIsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLFdBQVcsZ0NBQW9CLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDeEUsQ0FBQztRQUNELElBQUksZUFBZSxHQUFHLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUM1RCxJQUFJLE9BQU8sZUFBZSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3RDLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hELElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQzdELE9BQU8sSUFBQSxzQ0FBb0IsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDaEYsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLEtBQWlELENBQUM7UUFDdEQsSUFBSSxXQUFXLEdBQUcsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QyxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLElBQUksS0FBSyxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMzRCxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLEtBQWEsQ0FBQztnQkFDbEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDWixLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxDQUFDO3FCQUFNLENBQUM7b0JBQ0osS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNsQixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUNYLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ3RELENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssR0FBRyxZQUFZLEVBQUUsQ0FBQztvQkFDN0MsT0FBTyxJQUFBLHNDQUFvQixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxlQUFlLEVBQUUsV0FBVyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ3pILENBQUM7Z0JBQ0QsS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0MsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLE1BQXFFLENBQUM7UUFDMUUsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxHQUFHLE1BQU0sSUFBQSxpQ0FBb0IsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDekQsSUFBSSxNQUFNLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0ksQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFBLHlCQUFXLEVBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxVQUFVLElBQUksUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNILElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNWLE9BQU8sSUFBQSxzQ0FBb0IsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUNELElBQUksS0FBSyxFQUFFLENBQUM7WUFDUixPQUFPLElBQUEsc0NBQW9CLEVBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ25KLENBQUM7UUFDRCxPQUFPLElBQUEsc0NBQW9CLEVBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0o7QUF0VlM7SUFETCw0QkFBZTtnRUF1QmY7QUFHSztJQURMLDRCQUFlO2lFQXlCZjtBQTZESztJQUZMLDRCQUFlO0lBQ2YsSUFBQSw2QkFBZSxFQUFDLEtBQUssQ0FBQzt1REFVdEI7QUFHSztJQUZMLDRCQUFlO0lBQ2YsSUFBQSw2QkFBZSxFQUFDLEtBQUssQ0FBQztzREFTdEI7QUFHSztJQUZMLDRCQUFlO0lBQ2YsSUFBQSw2QkFBZSxFQUFDLEtBQUssQ0FBQztzREFJdEI7QUFHSztJQUZMLDRCQUFlO0lBQ2YsSUFBQSw2QkFBZSxFQUFDLFNBQVMsQ0FBQzswREFPMUI7QUFHSztJQUZMLDRCQUFlO0lBQ2YsSUFBQSw2QkFBZSxFQUFDLFVBQVUsQ0FBQzsyREFHM0I7QUFHSztJQUZMLDRCQUFlO0lBQ2YsSUFBQSw2QkFBZSxFQUFDLGlCQUFpQixDQUFDO21FQUdsQztBQUVLO0lBREwsNEJBQWU7b0VBR2Y7QUFFSztJQURMLDRCQUFlOzhEQVNmO0FBR0s7SUFETCw0QkFBZTtrRUFHZjtBQUdLO0lBREwsNEJBQWU7aUVBR2Y7QUFHSztJQURMLDRCQUFlO2tFQUlmO0FBR0s7SUFETCw0QkFBZTtpRUFHZjtBQUdLO0lBREwsNEJBQWU7cUVBR2Y7QUFFSztJQURMLDRCQUFlOytEQUdmO0FBRUs7SUFETCw0QkFBZTtnRUFHZjtBQUdLO0lBREwsNEJBQWU7aUVBUWY7QUFtSUwscVFBQXFRO0FBQ3JRLEtBQUssVUFBVSxTQUFTLENBQUksTUFBMkUsRUFBRSxFQUF1QztJQUM1SSxJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUEsb0NBQWUsRUFBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNGLE9BQU8sTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRCxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBMEcsQ0FBQztBQUUxSSxLQUFLLFVBQVUsZUFBZSxDQUFDLElBQStEO0lBQzFGLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBQSxrQ0FBYSxFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLFFBQVEsb0RBQW9ELElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL00sQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxNQUFNLGFBQWEsR0FBdUIsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ3hELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QixJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQXFDLENBQUM7SUFDdEUsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzdDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFDbEMsSUFBSSxRQUFRLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztRQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksU0FBUyxRQUFRLElBQUksQ0FBQyxDQUFDO0lBQ3BGLENBQUM7QUFDTCxDQUFDLENBQUM7QUFDRixNQUFNLFlBQVksR0FBdUIsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ3ZELElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBc0MsQ0FBQztJQUN2RSxJQUFJLElBQUksR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN6RCxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU87SUFDbEIsTUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3RDLENBQUMsQ0FBQztBQUNGLE1BQU0sV0FBVyxHQUF1QixLQUFLLElBQUksRUFBRTtJQUMvQyxZQUFZLEVBQUUsQ0FBQztBQUNuQixDQUFDLENBQUM7QUFFVyxRQUFBLHVCQUF1QixHQUFHLCtCQUFjLENBQUMsUUFBUSxDQUMxRCxpQ0FBeUIsRUFDekIsSUFBSSwyQkFBMkIsRUFBRSxFQUNqQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxFQUFFLEVBQUU7SUFDUixZQUFZLEVBQUUsRUFBRTtJQUNoQixhQUFhLEVBQUUsRUFBRTtJQUNqQixjQUFjLEVBQUUsRUFBRTtJQUNsQixpQkFBaUIsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQzdDLFdBQVcsRUFBRSxFQUFFO0lBQ2YsaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRTtJQUMzQyxzQkFBc0IsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFO0lBQ2hELGdCQUFnQixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUU7SUFDMUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDaEMsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDL0IsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDL0IsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDbkMsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDcEMsZ0JBQWdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRTtJQUM1QyxpQkFBaUIsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQzdDLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQ3hDLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQ3ZDLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQzNDLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQzFDLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQzNDLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQzFDLGtCQUFrQixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDOUMsYUFBYSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDekMsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDMUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUU7SUFDckMsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUU7SUFDMUMsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUU7SUFDMUMsU0FBUyxFQUFFLEVBQUU7Q0FDaEIsQ0FBQyxFQUNGLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDSCxhQUFhLEVBQUUsSUFBSTtJQUNuQixjQUFjLEVBQUUsSUFBSTtDQUN2QixDQUFDLENBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNvY2tldEZ1bmN0aW9uIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9Tb2NrZXRGdW5jdGlvblwiO1xuaW1wb3J0IHsgU29ja2V0RnVuY3Rpb25Ib29rIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9Tb2NrZXRGdW5jdGlvblR5cGVzXCI7XG5pbXBvcnQgeyBnZXROb2RlSWRJUCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL25vZGVDYWNoZVwiO1xuaW1wb3J0IHsgc2V0SFRUUFJlc3VsdEhlYWRlcnMsIGdldEN1cnJlbnRIVFRQUmVxdWVzdCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhbGxIVFRQSGFuZGxlclwiO1xuaW1wb3J0IHsgcGVyZm9ybUxvY2FsQ2FsbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhbGxNYW5hZ2VyXCI7XG5pbXBvcnQgeyBSZXF1aXJlQ29udHJvbGxlciB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vcmVxdWlyZS9SZXF1aXJlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgdGltZUluTWludXRlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZ2V0Q29tbW9uTmFtZSwgZ2V0UHVibGljSWRlbnRpZmllciwgZ2V0T3duTWFjaGluZUlkLCB2ZXJpZnksIHZlcmlmeU1hY2hpbmVJZEZvclB1YmxpY0tleSB9IGZyb20gXCIuLi8uLi9taXNjL2h0dHBzL2NlcnRzXCI7XG5pbXBvcnQgeyBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzQ29uZmlnLCBBcmNoaXZlc1N5bmNTdGF0dXMsIEZpbmRDb25maWcsIFNvdXJjZUNvbmZpZywgSU1NVVRBQkxFX0NBQ0hFX1RJTUUgfSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBST1VUSU5HX0ZJTEUsIGdldFJvdXRlLCByb3V0ZUNvbnRhaW5zIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQge1xuICAgIGdldExvYWRlZEJ1Y2tldCwgcmVxdWlyZUJ1Y2tldCwgZmluZEJ1Y2tldFN0b3JlLCByZWFkQnVja2V0SW50ZXJuYWwsIHF1ZXVlUm91dGluZ0NvbmZpZ1dyaXRlLFxuICAgIGdldEJ1Y2tldENvbmZpZywgYnVja2V0U3luY1N0YXR1cywgYnVja2V0SW5kZXhUb3RhbHMsIExvYWRlZFN0b3JlLCBBY3RpdmVCdWNrZXRJbmZvLFxuICAgIGxpc3RBY2NvdW50QnVja2V0cywgU2VydmVyQnVja2V0SW5mbywgY2xlYXJBY2NvdW50V3JpdGVTdGF0cyxcbiAgICBnZXRBY3RpdmVCdWNrZXQsIGFjdGl2YXRlQnVja2V0LCBnZXRBY3RpdmVCdWNrZXRLZXlzLFxufSBmcm9tIFwiLi9zdG9yYWdlU2VydmVyU3RhdGVcIjtcbmltcG9ydCB7IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcsIGdldFRydXN0LCBnZXRSZXF1ZXN0cywgYXNzZXJ0V3JpdGVzQWxsb3dlZCB9IGZyb20gXCIuL3NlcnZlckNvbmZpZ1wiO1xuaW1wb3J0IHsgSUJ1Y2tldFN0b3JlIH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQgeyBnZXRSb3V0aW5nRmlsZVJlc3VsdCB9IGZyb20gXCIuL2J1Y2tldERpc2tcIjtcbmltcG9ydCB7IFN0b3JhZ2VDbGllbnRDb250cm9sbGVyIH0gZnJvbSBcIi4vc3RvcmFnZUNsaWVudENvbnRyb2xsZXJcIjtcbmltcG9ydCB7IHRyYWNrQWNjZXNzLCB0cmFja0FjY2Vzc0NhbGwsIGdldEFjY2Vzc1RvdGFscywgcmVhZEFjY2Vzc1N1bW1hcmllcywgY2xlYXJBY2NvdW50QWNjZXNzU3RhdHMsIEFjY2Vzc1RvdGFscywgQWNjZXNzU3VtbWFyeVN0YXRlIH0gZnJvbSBcIi4vYWNjZXNzU3RhdHNcIjtcbmltcG9ydCB7IGFzc2VydFZhbGlkTmFtZSwgYXNzZXJ0VmFsaWRQYXRoLCBhc3NlcnRWYWxpZEFyZ3MgfSBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IFN1bW1hcnlFbnRyeSB9IGZyb20gXCIuLi8uLi90cmVlU3VtbWFyeVwiO1xuXG5leHBvcnQgY29uc3QgUkVNT1RFX1NUT1JBR0VfQ0xBU1NfR1VJRCA9IFwiUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXItYjdlNDJhOTFcIjtcbmV4cG9ydCBjb25zdCBTVE9SQUdFX0FVVEhfUFVSUE9TRSA9IFwicmVtb3RlU3RvcmFnZS1hdXRoLTFcIjtcbmV4cG9ydCBjb25zdCBTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEID0gXCJSRU1PVEVfU1RPUkFHRV9OT1RfQVVUSEVOVElDQVRFRF9jZjJmN2IxZVwiO1xuZXhwb3J0IGNvbnN0IFNUT1JBR0VfQUNDRVNTX0RFTklFRCA9IFwiUkVNT1RFX1NUT1JBR0VfQUNDRVNTX0RFTklFRF85ZDgxYTRjMFwiO1xuXG5jb25zdCBBVVRIX1RJTUVfV0lORE9XID0gdGltZUluTWludXRlICogMTA7XG5jb25zdCBBQ0NFU1NfQ0hFQ0tfU0xPV19USU1FID0gNTA7XG5jb25zdCBNQVhfU0VTU0lPTlMgPSAxMDAgKiAxMDAwO1xuY29uc3QgTUFYX1JFUVVFU1RTX1BFUl9JUCA9IDUwO1xuXG5leHBvcnQgdHlwZSBBdXRoVG9rZW5EYXRhID0ge1xuICAgIHB1cnBvc2U6IHN0cmluZztcbiAgICB0aW1lOiBudW1iZXI7XG4gICAgc2VydmVyOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgQXV0aFRva2VuID0ge1xuICAgIGNlcnRQZW06IHN0cmluZztcbiAgICBzaWduYXR1cmU6IHN0cmluZztcbiAgICBkYXRhOiBBdXRoVG9rZW5EYXRhO1xufTtcbmV4cG9ydCB0eXBlIEFjY2Vzc1JlcXVlc3QgPSB7XG4gICAgcmVxdWVzdElkOiBzdHJpbmc7XG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIG1hY2hpbmVJZDogc3RyaW5nO1xuICAgIGlwOiBzdHJpbmc7XG4gICAgdGltZTogbnVtYmVyO1xufTtcbmV4cG9ydCB0eXBlIFRydXN0UmVjb3JkID0ge1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBpcDogc3RyaW5nO1xuICAgIHRpbWU6IG51bWJlcjtcbn07XG5leHBvcnQgdHlwZSBBY2Nlc3NTdGF0ZSA9IHtcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBpcDogc3RyaW5nO1xuICAgIGhhc0FjY2VzczogYm9vbGVhbjtcbiAgICBncmFudEFjY2Vzc0NvbW1hbmQ/OiBzdHJpbmc7XG4gICAgdHJ1c3RlZE1hY2hpbmVzPzogVHJ1c3RSZWNvcmRbXTtcbn07XG5cbmNvbnN0IHNlc3Npb25zID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuLy8gV2UgbXVzdCBuZXZlciBzZXJ2ZSBhbnl0aGluZyB0aGF0IGNhbiBiZSBldmFsdWF0ZWQgYXMgY29kZSAoaHRtbCwganMgLSBhbmQgc3ZnLCB3aGljaCBjYW4gZW1iZWQgPHNjcmlwdD4gYW5kIHJ1bnMgaXQgd2hlbiB2aXNpdGVkIGFzIGEgZG9jdW1lbnQpLiBPdGhlcndpc2UgYSB1c2VyIGNvdWxkIGhvc3QgYSBmaWxlIGFuZCwgYnkgdmlzaXRpbmcgaXQsIHJ1biBpdCBvbiBvdXIgZG9tYWluIC0gZ2l2aW5nIHRoZW0gYWNjZXNzIHRvIGFsbCBvZiBvdXIga2V5cyBhbmQgY29va2llcy4gUERGIHN0YXlzOiBicm93c2VyIFBERiB2aWV3ZXJzIHJ1biBhbnkgZW1iZWRkZWQgUERGIHNjcmlwdGluZyBpbiBhIHNhbmRib3ggd2l0aCBubyBhY2Nlc3MgdG8gdGhlIHNlcnZpbmcgb3JpZ2luJ3MgY29va2llcyBvciBET00uXG5jb25zdCBDT05URU5UX1RZUEVTOiB7IFtleHQ6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIGNzczogXCJ0ZXh0L2NzczsgY2hhcnNldD11dGYtOFwiLCBqc29uOiBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIixcbiAgICB0eHQ6IFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiLCBwbmc6IFwiaW1hZ2UvcG5nXCIsIGpwZzogXCJpbWFnZS9qcGVnXCIsIGpwZWc6IFwiaW1hZ2UvanBlZ1wiLCBnaWY6IFwiaW1hZ2UvZ2lmXCIsXG4gICAgd2VicDogXCJpbWFnZS93ZWJwXCIsIG1wNDogXCJ2aWRlby9tcDRcIiwgd2VibTogXCJ2aWRlby93ZWJtXCIsXG4gICAgbXAzOiBcImF1ZGlvL21wZWdcIiwgd2F2OiBcImF1ZGlvL3dhdlwiLCBwZGY6IFwiYXBwbGljYXRpb24vcGRmXCIsXG59O1xuXG5jb25zdCBjb25uZWN0ZWRDbGllbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5mdW5jdGlvbiB0cmFja0NhbGxlcigpOiB2b2lkIHtcbiAgICBsZXQgbm9kZUlkID0gU29ja2V0RnVuY3Rpb24uZ2V0Q2FsbGVyKCkubm9kZUlkO1xuICAgIGlmIChjb25uZWN0ZWRDbGllbnRzLmhhcyhub2RlSWQpKSByZXR1cm47XG4gICAgY29ubmVjdGVkQ2xpZW50cy5hZGQobm9kZUlkKTtcbiAgICBTb2NrZXRGdW5jdGlvbi5vbk5leHREaXNjb25uZWN0KG5vZGVJZCwgKCkgPT4ge1xuICAgICAgICBjb25uZWN0ZWRDbGllbnRzLmRlbGV0ZShub2RlSWQpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coYEJyb2FkY2FzdGluZyByb3V0aW5nIGNvbmZpZyBjaGFuZ2UgdG8gJHtjb25uZWN0ZWRDbGllbnRzLnNpemV9IGNvbm5lY3RlZCBjbGllbnRzYCk7XG4gICAgZm9yIChsZXQgbm9kZUlkIG9mIFsuLi5jb25uZWN0ZWRDbGllbnRzXSkge1xuICAgICAgICB2b2lkIFN0b3JhZ2VDbGllbnRDb250cm9sbGVyLm5vZGVzW25vZGVJZF0ucm91dGluZ0NvbmZpZ0NoYW5nZWQoKS5jYXRjaCgoKSA9PiB7IH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q2FsbGVyTWFjaGluZUlkKCk6IHN0cmluZyB7XG4gICAgbGV0IGNhbGxlciA9IFNvY2tldEZ1bmN0aW9uLmdldENhbGxlcigpO1xuICAgIGxldCBtYWNoaW5lSWQgPSBzZXNzaW9ucy5nZXQoY2FsbGVyLm5vZGVJZCk7XG4gICAgaWYgKCFtYWNoaW5lSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUR9IENhbGwgYXV0aGVudGljYXRlIGZpcnN0IChjb25uZWN0aW9uICR7Y2FsbGVyLm5vZGVJZH0pYCk7XG4gICAgfVxuICAgIHJldHVybiBtYWNoaW5lSWQ7XG59XG5mdW5jdGlvbiBnZXRDYWxsZXJJUCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXROb2RlSWRJUChTb2NrZXRGdW5jdGlvbi5nZXRDYWxsZXIoKS5ub2RlSWQpO1xufVxuZnVuY3Rpb24gaXNBZG1pbihtYWNoaW5lSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBtYWNoaW5lSWQgPT09IGdldE93bk1hY2hpbmVJZChnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCkucm9vdERvbWFpbik7XG59XG5mdW5jdGlvbiByZXF1aXJlQWRtaW4oKTogc3RyaW5nIHtcbiAgICBsZXQgbWFjaGluZUlkID0gZ2V0Q2FsbGVyTWFjaGluZUlkKCk7XG4gICAgaWYgKCFpc0FkbWluKG1hY2hpbmVJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfQUNDRVNTX0RFTklFRH0gQWRtaW4gY29tbWFuZHMgbXVzdCBiZSBydW4gZnJvbSB0aGUgc3RvcmFnZSBtYWNoaW5lIGl0c2VsZiAoY2FsbGVyIG1hY2hpbmUgJHttYWNoaW5lSWR9KWApO1xuICAgIH1cbiAgICByZXR1cm4gbWFjaGluZUlkO1xufVxuYXN5bmMgZnVuY3Rpb24gcmVxdWlyZUFjY2VzcyhhY2NvdW50OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGFzc2VydFZhbGlkTmFtZShhY2NvdW50LCBcImFjY291bnRcIik7XG4gICAgbGV0IG1hY2hpbmVJZCA9IGdldENhbGxlck1hY2hpbmVJZCgpO1xuICAgIGlmIChpc0FkbWluKG1hY2hpbmVJZCkpIHJldHVybiBtYWNoaW5lSWQ7XG4gICAgbGV0IHRydXN0ID0gYXdhaXQgZ2V0VHJ1c3QoKTtcbiAgICBsZXQgdHJ1c3RlZCA9IGF3YWl0IHRydXN0LmdldChgJHthY2NvdW50fXwke21hY2hpbmVJZH1gKTtcbiAgICBpZiAoIXRydXN0ZWQpIHtcbiAgICAgICAgbGV0IHsgZG9tYWluLCBwb3J0IH0gPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX0FDQ0VTU19ERU5JRUR9IE1hY2hpbmUgJHttYWNoaW5lSWR9IGhhcyBubyBhY2Nlc3MgdG8gYWNjb3VudCAke0pTT04uc3RyaW5naWZ5KGFjY291bnQpfS4gVmlzaXQgaHR0cHM6Ly8ke2RvbWFpbn06JHtwb3J0fS8ke2FjY291bnR9IGZvciBhY2Nlc3MgaW5zdHJ1Y3Rpb25zLmApO1xuICAgIH1cbiAgICByZXR1cm4gbWFjaGluZUlkO1xufVxuXG5mdW5jdGlvbiBnZXRHcmFudEFjY2Vzc0NvbW1hbmQocmVxdWVzdElkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCB7IHNzaFRhcmdldCwgc2VydmVyQ29tbWFuZCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgIHJldHVybiBgc3NoICR7c3NoVGFyZ2V0fSAnJHtzZXJ2ZXJDb21tYW5kfSAtLXJlcXVlc3RJZCAke3JlcXVlc3RJZH0nYDtcbn1cblxuY2xhc3MgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXJCYXNlIHtcbiAgICBhc3luYyBwaW5nKCk6IFByb21pc2U8e30+IHtcbiAgICAgICAgdHJhY2tDYWxsZXIoKTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGFzeW5jIGF1dGhlbnRpY2F0ZSh0b2tlbjogQXV0aFRva2VuKTogUHJvbWlzZTx7IG1hY2hpbmVJZDogc3RyaW5nOyBpcDogc3RyaW5nIH0+IHtcbiAgICAgICAgbGV0IHsgZG9tYWluLCBwb3J0IH0gPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk7XG4gICAgICAgIGxldCBjYWxsZXIgPSBTb2NrZXRGdW5jdGlvbi5nZXRDYWxsZXIoKTtcbiAgICAgICAgdmVyaWZ5KHRva2VuLmNlcnRQZW0sIHRva2VuLnNpZ25hdHVyZSwgdG9rZW4uZGF0YSk7XG4gICAgICAgIGxldCB7IHB1cnBvc2UsIHRpbWUsIHNlcnZlciB9ID0gdG9rZW4uZGF0YTtcbiAgICAgICAgaWYgKHB1cnBvc2UgIT09IFNUT1JBR0VfQVVUSF9QVVJQT1NFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF1dGggdG9rZW4gcHVycG9zZSBpcyAke0pTT04uc3RyaW5naWZ5KHB1cnBvc2UpfSwgZXhwZWN0ZWQgJHtKU09OLnN0cmluZ2lmeShTVE9SQUdFX0FVVEhfUFVSUE9TRSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE1hdGguYWJzKERhdGUubm93KCkgLSB0aW1lKSA+IEFVVEhfVElNRV9XSU5ET1cpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXV0aCB0b2tlbiB0aW1lIGlzIHRvbyBmYXIgZnJvbSB0aGUgc2VydmVyIHRpbWUgKHRva2VuICR7dGltZX0sIHNlcnZlciAke0RhdGUubm93KCl9LCBhbGxvd2VkIGRyaWZ0ICR7QVVUSF9USU1FX1dJTkRPV31tcylgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdG9rZW5Eb21haW4gPSBzZXJ2ZXIuc3BsaXQoXCI6XCIpWzBdO1xuICAgICAgICBpZiAodG9rZW5Eb21haW4gIT09IGRvbWFpbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdXRoIHRva2VuIGlzIGZvciBzZXJ2ZXIgJHtKU09OLnN0cmluZ2lmeShzZXJ2ZXIpfSwgYnV0IHRoaXMgc2VydmVyIGlzICR7SlNPTi5zdHJpbmdpZnkoYCR7ZG9tYWlufToke3BvcnR9YCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hY2hpbmVJZCA9IGdldENvbW1vbk5hbWUodG9rZW4uY2VydFBlbSkuc3BsaXQoXCIuXCIpWzBdO1xuICAgICAgICBpZiAoIXZlcmlmeU1hY2hpbmVJZEZvclB1YmxpY0tleSh7IG1hY2hpbmVJZCwgcHVibGljS2V5OiBnZXRQdWJsaWNJZGVudGlmaWVyKHRva2VuLmNlcnRQZW0pIH0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENlcnRpZmljYXRlIGNvbW1vbiBuYW1lICR7SlNPTi5zdHJpbmdpZnkoZ2V0Q29tbW9uTmFtZSh0b2tlbi5jZXJ0UGVtKSl9IGRvZXMgbm90IG1hdGNoIGl0cyBwdWJsaWMga2V5YCk7XG4gICAgICAgIH1cbiAgICAgICAgc2Vzc2lvbnMuc2V0KGNhbGxlci5ub2RlSWQsIG1hY2hpbmVJZCk7XG4gICAgICAgIHdoaWxlIChzZXNzaW9ucy5zaXplID4gTUFYX1NFU1NJT05TKSB7XG4gICAgICAgICAgICBsZXQgb2xkZXN0ID0gc2Vzc2lvbnMua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgICAgIGlmIChvbGRlc3QgPT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICAgICAgICBzZXNzaW9ucy5kZWxldGUob2xkZXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBtYWNoaW5lSWQsIGlwOiBnZXRDYWxsZXJJUCgpIH07XG4gICAgfVxuXG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIHJlcXVlc3RBY2Nlc3MoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZyB9KTogUHJvbWlzZTx7IG1hY2hpbmVJZDogc3RyaW5nOyBpcDogc3RyaW5nOyByZXF1ZXN0SWQ6IHN0cmluZzsgZ3JhbnRBY2Nlc3NDb21tYW5kOiBzdHJpbmcgfT4ge1xuICAgICAgICBsZXQgYWNjb3VudCA9IGNvbmZpZy5hY2NvdW50O1xuICAgICAgICBsZXQgbWFjaGluZUlkID0gZ2V0Q2FsbGVyTWFjaGluZUlkKCk7XG4gICAgICAgIGxldCBpcCA9IGdldENhbGxlcklQKCk7XG4gICAgICAgIGxldCByZXF1ZXN0c1N0b3JhZ2UgPSBhd2FpdCBnZXRSZXF1ZXN0cygpO1xuICAgICAgICBsZXQgcmVxdWVzdHMgPSBhd2FpdCByZXF1ZXN0c1N0b3JhZ2UuZ2V0KGlwKSB8fCBbXTtcbiAgICAgICAgbGV0IGV4aXN0aW5nID0gcmVxdWVzdHMuZmluZCh4ID0+IHguYWNjb3VudCA9PT0gYWNjb3VudCAmJiB4Lm1hY2hpbmVJZCA9PT0gbWFjaGluZUlkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICBleGlzdGluZy50aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4aXN0aW5nID0ge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApLFxuICAgICAgICAgICAgICAgIGFjY291bnQsXG4gICAgICAgICAgICAgICAgbWFjaGluZUlkLFxuICAgICAgICAgICAgICAgIGlwLFxuICAgICAgICAgICAgICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVxdWVzdHMucHVzaChleGlzdGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHJlcXVlc3RzLmxlbmd0aCA+IE1BWF9SRVFVRVNUU19QRVJfSVApIHJlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICAgIGF3YWl0IHJlcXVlc3RzU3RvcmFnZS5zZXQoaXAsIHJlcXVlc3RzKTtcbiAgICAgICAgcmV0dXJuIHsgbWFjaGluZUlkLCBpcCwgcmVxdWVzdElkOiBleGlzdGluZy5yZXF1ZXN0SWQsIGdyYW50QWNjZXNzQ29tbWFuZDogZ2V0R3JhbnRBY2Nlc3NDb21tYW5kKGV4aXN0aW5nLnJlcXVlc3RJZCkgfTtcbiAgICB9XG5cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgZ2V0QWNjZXNzU3RhdGUoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZyB9KTogUHJvbWlzZTxBY2Nlc3NTdGF0ZT4ge1xuICAgICAgICBsZXQgYWNjb3VudCA9IGNvbmZpZy5hY2NvdW50O1xuICAgICAgICBsZXQgbWFjaGluZUlkID0gZ2V0Q2FsbGVyTWFjaGluZUlkKCk7XG4gICAgICAgIGxldCBpcCA9IGdldENhbGxlcklQKCk7XG4gICAgICAgIGxldCB0cnVzdCA9IGF3YWl0IGdldFRydXN0KCk7XG4gICAgICAgIGxldCBoYXNBY2Nlc3MgPSBpc0FkbWluKG1hY2hpbmVJZCkgfHwgISFhd2FpdCB0cnVzdC5nZXQoYCR7YWNjb3VudH18JHttYWNoaW5lSWR9YCk7XG4gICAgICAgIGxldCByZXN1bHQ6IEFjY2Vzc1N0YXRlID0geyBtYWNoaW5lSWQsIGlwLCBoYXNBY2Nlc3MgfTtcbiAgICAgICAgaWYgKCFoYXNBY2Nlc3MpIHtcbiAgICAgICAgICAgIGxldCByZXF1ZXN0cyA9IGF3YWl0IGdldFJlcXVlc3RzKCk7XG4gICAgICAgICAgICBsZXQgb3duUmVxdWVzdCA9IChhd2FpdCByZXF1ZXN0cy5nZXQoaXApIHx8IFtdKS5maW5kKHggPT4geC5hY2NvdW50ID09PSBhY2NvdW50ICYmIHgubWFjaGluZUlkID09PSBtYWNoaW5lSWQpO1xuICAgICAgICAgICAgaWYgKG93blJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZ3JhbnRBY2Nlc3NDb21tYW5kID0gZ2V0R3JhbnRBY2Nlc3NDb21tYW5kKG93blJlcXVlc3QucmVxdWVzdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHJ1c3RlZE1hY2hpbmVzOiBUcnVzdFJlY29yZFtdID0gW107XG4gICAgICAgIGZvciAobGV0IGtleSBvZiBhd2FpdCB0cnVzdC5nZXRLZXlzKCkpIHtcbiAgICAgICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoYCR7YWNjb3VudH18YCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHJlY29yZCA9IGF3YWl0IHRydXN0LmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKHJlY29yZCkgdHJ1c3RlZE1hY2hpbmVzLnB1c2gocmVjb3JkKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQudHJ1c3RlZE1hY2hpbmVzID0gdHJ1c3RlZE1hY2hpbmVzO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGFzeW5jIGxpc3RSZXF1ZXN0c0ZvcklQKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGlwOiBzdHJpbmcgfSk6IFByb21pc2U8QWNjZXNzUmVxdWVzdFtdPiB7XG4gICAgICAgIGxldCByZXF1ZXN0cyA9IGF3YWl0IGdldFJlcXVlc3RzKCk7XG4gICAgICAgIHJldHVybiAoYXdhaXQgcmVxdWVzdHMuZ2V0KGNvbmZpZy5pcCkgfHwgW10pLmZpbHRlcih4ID0+IHguYWNjb3VudCA9PT0gY29uZmlnLmFjY291bnQpO1xuICAgIH1cblxuICAgIGFzeW5jIGdyYW50QWNjZXNzKGNvbmZpZzogeyByZXF1ZXN0SWQ6IHN0cmluZyB9KTogUHJvbWlzZTxUcnVzdFJlY29yZD4ge1xuICAgICAgICBsZXQgcmVxdWVzdElkID0gY29uZmlnLnJlcXVlc3RJZDtcbiAgICAgICAgbGV0IGNhbGxlck1hY2hpbmVJZCA9IGdldENhbGxlck1hY2hpbmVJZCgpO1xuICAgICAgICBsZXQgdHJ1c3QgPSBhd2FpdCBnZXRUcnVzdCgpO1xuICAgICAgICBsZXQgcmVxdWVzdHMgPSBhd2FpdCBnZXRSZXF1ZXN0cygpO1xuICAgICAgICBmb3IgKGxldCBpcCBvZiBhd2FpdCByZXF1ZXN0cy5nZXRLZXlzKCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHJlcXVlc3Qgb2YgYXdhaXQgcmVxdWVzdHMuZ2V0KGlwKSB8fCBbXSkge1xuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3RJZCAhPT0gcmVxdWVzdElkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQWRtaW4oY2FsbGVyTWFjaGluZUlkKSAmJiAhYXdhaXQgdHJ1c3QuZ2V0KGAke3JlcXVlc3QuYWNjb3VudH18JHtjYWxsZXJNYWNoaW5lSWR9YCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfQUNDRVNTX0RFTklFRH0gTWFjaGluZSAke2NhbGxlck1hY2hpbmVJZH0gaGFzIG5vIGFjY2VzcyB0byBhY2NvdW50ICR7SlNPTi5zdHJpbmdpZnkocmVxdWVzdC5hY2NvdW50KX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlY29yZDogVHJ1c3RSZWNvcmQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnQ6IHJlcXVlc3QuYWNjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgbWFjaGluZUlkOiByZXF1ZXN0Lm1hY2hpbmVJZCxcbiAgICAgICAgICAgICAgICAgICAgaXA6IHJlcXVlc3QuaXAsXG4gICAgICAgICAgICAgICAgICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0cnVzdC5zZXQoYCR7cmVxdWVzdC5hY2NvdW50fXwke3JlcXVlc3QubWFjaGluZUlkfWAsIHJlY29yZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGFjY2VzcyByZXF1ZXN0IGZvdW5kIHdpdGggaWQgJHtKU09OLnN0cmluZ2lmeShyZXF1ZXN0SWQpfS4gSXQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGdyYW50ZWQgb3IgZXhwaXJlZC5gKTtcbiAgICB9XG5cbiAgICAvKiogQWRtaW4gKHNvIG9ubHkgdGhpcyBtYWNoaW5lJ3Mgb3duIHByb2Nlc3NlcyBjYW4gY2FsbCBpdCk6IHRoZSBidWNrZXRzIHRoaXMgcHJvY2VzcyBoYXMgbG9hZGVkLiBBIGRlcGxveSBzdWNjZXNzb3IgYXNrcyBpdHMgcHJlZGVjZXNzb3IgZm9yIHRoaXMsIHNvIGl0IGFjdGl2YXRlcyBleGFjdGx5IHRoZSBidWNrZXRzIHRoYXQgYXJlIGluIHVzZSBpbnN0ZWFkIG9mIGV2ZXJ5IGJ1Y2tldCBvbiBkaXNrLiAqL1xuICAgIGFzeW5jIGFkbWluTGlzdEFjdGl2ZUJ1Y2tldHMoKTogUHJvbWlzZTx7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH1bXT4ge1xuICAgICAgICByZXR1cm4gZ2V0QWN0aXZlQnVja2V0S2V5cygpO1xuICAgIH1cbiAgICBhc3luYyBhZG1pbkxpc3RSZXF1ZXN0cyhjb25maWc6IHsgaXA6IHN0cmluZyB9KTogUHJvbWlzZTxBY2Nlc3NSZXF1ZXN0W10+IHtcbiAgICAgICAgbGV0IHJlcXVlc3RzID0gYXdhaXQgZ2V0UmVxdWVzdHMoKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlcXVlc3RzLmdldChjb25maWcuaXApIHx8IFtdO1xuICAgIH1cbiAgICBhc3luYyBhZG1pbkdyYW50QWNjZXNzKGNvbmZpZzogeyByZXF1ZXN0SWQ6IHN0cmluZyB9KTogUHJvbWlzZTxUcnVzdFJlY29yZD4ge1xuICAgICAgICBsZXQgcmVxdWVzdElkID0gY29uZmlnLnJlcXVlc3RJZDtcbiAgICAgICAgbGV0IHRydXN0ID0gYXdhaXQgZ2V0VHJ1c3QoKTtcbiAgICAgICAgbGV0IHJlcXVlc3RzID0gYXdhaXQgZ2V0UmVxdWVzdHMoKTtcbiAgICAgICAgZm9yIChsZXQgaXAgb2YgYXdhaXQgcmVxdWVzdHMuZ2V0S2V5cygpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByZXF1ZXN0IG9mIGF3YWl0IHJlcXVlc3RzLmdldChpcCkgfHwgW10pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0SWQgIT09IHJlcXVlc3RJZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHJlY29yZDogVHJ1c3RSZWNvcmQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnQ6IHJlcXVlc3QuYWNjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgbWFjaGluZUlkOiByZXF1ZXN0Lm1hY2hpbmVJZCxcbiAgICAgICAgICAgICAgICAgICAgaXA6IHJlcXVlc3QuaXAsXG4gICAgICAgICAgICAgICAgICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0cnVzdC5zZXQoYCR7cmVxdWVzdC5hY2NvdW50fXwke3JlcXVlc3QubWFjaGluZUlkfWAsIHJlY29yZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGFjY2VzcyByZXF1ZXN0IGZvdW5kIHdpdGggaWQgJHtKU09OLnN0cmluZ2lmeShyZXF1ZXN0SWQpfS4gSXQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGdyYW50ZWQgb3IgZXhwaXJlZC5gKTtcbiAgICB9XG5cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgQHRyYWNrQWNjZXNzQ2FsbChcImdldFwiKVxuICAgIGFzeW5jIGdldDIoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnOyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTsgaW50ZXJuYWw/OiBib29sZWFuOyBpbmNsdWRlVG9tYnN0b25lcz86IGJvb2xlYW4gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoY29uZmlnLnBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBsaXZlcyBvdXRzaWRlIGV2ZXJ5IHN0b3JlIGFuZCBldmVuIG91dHNpZGUgdGhlIGJ1Y2tldCAoaXQgaXMgd2hhdCBDUkVBVEVTIGl0KSwgc28gaXQgaXMgcmVhZCBzdHJhaWdodCBvZmYgdGhlIGRpc2sgLSBhYnNlbnQgbWVhbnMgdW5kZWZpbmVkLCBleGFjdGx5IGxpa2UgYW55IGZpbGUgcmVhZFxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGdldFJvdXRpbmdGaWxlUmVzdWx0KGNvbmZpZy5hY2NvdW50LCBjb25maWcuYnVja2V0TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5pbnRlcm5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlYWRCdWNrZXRJbnRlcm5hbChjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHdpdGhTdG9yZShjb25maWcsIHN0b3JlID0+IHN0b3JlLmdldDIoY29uZmlnKSk7XG4gICAgfVxuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBAdHJhY2tBY2Nlc3NDYWxsKFwic2V0XCIpXG4gICAgYXN5bmMgc2V0KGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBkYXRhOiBCdWZmZXI7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICAvLyBDb3BpZWQgYmVjYXVzZSB0aGUgd2lyZSBoYW5kcyB1cyBhIHBsYWluIFVpbnQ4QXJyYXkgdmlldywgbm90IGEgcmVhbCBCdWZmZXJcbiAgICAgICAgbGV0IGRhdGEgPSBCdWZmZXIuZnJvbShjb25maWcuZGF0YSk7XG4gICAgICAgIGlmIChjb25maWcucGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcXVldWVSb3V0aW5nQ29uZmlnV3JpdGUoY29uZmlnLmFjY291bnQsIGNvbmZpZy5idWNrZXROYW1lLCBkYXRhLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHdpdGhTdG9yZShjb25maWcsIHN0b3JlID0+IHN0b3JlLnNldCh7IC4uLmNvbmZpZywgZGF0YSB9KSk7XG4gICAgfVxuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBAdHJhY2tBY2Nlc3NDYWxsKFwiZGVsXCIpXG4gICAgYXN5bmMgZGVsKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZzsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBpbnRlcm5hbD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhc3NlcnRXcml0ZXNBbGxvd2VkKCk7XG4gICAgICAgIGF3YWl0IHdpdGhTdG9yZShjb25maWcsIHN0b3JlID0+IHN0b3JlLmRlbChjb25maWcpKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIEB0cmFja0FjY2Vzc0NhbGwoXCJnZXRJbmZvXCIpXG4gICAgYXN5bmMgZ2V0SW5mbyhjb25maWc6IHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWc7IGluY2x1ZGVUb21ic3RvbmVzPzogYm9vbGVhbiB9KTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoY29uZmlnLnBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGdldFJvdXRpbmdGaWxlUmVzdWx0KGNvbmZpZy5hY2NvdW50LCBjb25maWcuYnVja2V0TmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHsgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuc2l6ZSB9IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgd2l0aFN0b3JlKGNvbmZpZywgc3RvcmUgPT4gc3RvcmUuZ2V0SW5mbyhjb25maWcpKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIEB0cmFja0FjY2Vzc0NhbGwoXCJmaW5kSW5mb1wiKVxuICAgIGFzeW5jIGZpbmRJbmZvKGNvbmZpZzogRmluZENvbmZpZyAmIHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmc7IHByZWZpeDogc3RyaW5nOyBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZyB9KTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2l0aFN0b3JlKGNvbmZpZywgc3RvcmUgPT4gc3RvcmUuZmluZEluZm8oY29uZmlnKSk7XG4gICAgfVxuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBAdHJhY2tBY2Nlc3NDYWxsKFwiZ2V0Q2hhbmdlc0FmdGVyXCIpXG4gICAgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyMihjb25maWc6IHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmc7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnOyB0aW1lOiBudW1iZXI7IHJvdXRlcz86IFtudW1iZXIsIG51bWJlcl1bXSB9KTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2l0aFN0b3JlKGNvbmZpZywgc3RvcmUgPT4gc3RvcmUuZ2V0Q2hhbmdlc0FmdGVyMihjb25maWcpKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGdldEFyY2hpdmVzQ29uZmlnKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9KTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgICAgICByZXR1cm4gZ2V0QnVja2V0Q29uZmlnKGF3YWl0IHJlcXVpcmVCdWNrZXQoY29uZmlnLmFjY291bnQsIGNvbmZpZy5idWNrZXROYW1lKSk7XG4gICAgfVxuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBhc3luYyBsaXN0QnVja2V0cyhjb25maWc6IHsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPFNlcnZlckJ1Y2tldEluZm9bXT4ge1xuICAgICAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGxpc3RBY2NvdW50QnVja2V0cyhjb25maWcuYWNjb3VudCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAvLyBUaGUgYWNjZXNzIGhvb2sgKGFuZCB0aGUgc3RvcmFnZSBpdCBpbml0aWFsaXplcykgcnVucyBiZWZvcmUgdGhpcywgc28gYSBsYXJnZSBnYXAgYmV0d2VlbiB0aGlzIGFuZCB0aGUgY2FsbGVyJ3MgdGltaW5nIGlzIHRoZSBob29rXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgbGlzdEJ1Y2tldHMoJHtjb25maWcuYWNjb3VudH0pIGNhbGwgYm9keSB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIFRoZSBsaXZlLCBpbi1tZW1vcnkgc3RhdGUgb2Ygb25lIGJ1Y2tldCwgb3IgYSBzdHJpbmcgc2F5aW5nIHdoeSBpdCBpcyB1bmF2YWlsYWJsZS4gQW5zd2VyZWQgd2l0aG91dCB0b3VjaGluZyB0aGUgZGlzaywgc28gaXQgaXMgY2hlYXAgLSBidXQgb25seSB3b3JrcyB3aGlsZSB0aGUgYnVja2V0IGlzIGxvYWRlZCBoZXJlLiAqL1xuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBhc3luYyBnZXRBY3RpdmVCdWNrZXQoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFjdGl2ZUJ1Y2tldEluZm8gfCBzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldEFjdGl2ZUJ1Y2tldChjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICAvKiogTG9hZHMgYSBidWNrZXQgdGhhdCBleGlzdHMgb24gdGhpcyBzZXJ2ZXIgaW50byBtZW1vcnkgKHN0YXJ0aW5nIGl0cyBzeW5jaHJvbml6YXRpb24pIGFuZCByZXR1cm5zIGl0cyBsaXZlIHN0YXRlLCBvciBhIHN0cmluZyBzYXlpbmcgd2h5IGl0IGNvdWxkIG5vdCBiZSBsb2FkZWQuICovXG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGFjdGl2YXRlQnVja2V0KGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9KTogUHJvbWlzZTxBY3RpdmVCdWNrZXRJbmZvIHwgc3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBhY3RpdmF0ZUJ1Y2tldChjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICAvKiogWmVyb2VzIHRoZSB3cml0ZSBzdGF0aXN0aWNzIGxpc3RCdWNrZXRzIHJlcG9ydHMgYW5kIHRoZSBpbi1tZW1vcnkgYWNjZXNzIHN0YXRpc3RpY3MsIGZvciBldmVyeSBidWNrZXQgaW4gdGhlIGFjY291bnQuICovXG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGNsZWFyV3JpdGVTdGF0cyhjb25maWc6IHsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPHsgY2xlYXJlZEJ1Y2tldHM6IG51bWJlciB9PiB7XG4gICAgICAgIGNsZWFyQWNjb3VudEFjY2Vzc1N0YXRzKGNvbmZpZy5hY2NvdW50KTtcbiAgICAgICAgcmV0dXJuIHsgY2xlYXJlZEJ1Y2tldHM6IGNsZWFyQWNjb3VudFdyaXRlU3RhdHMoY29uZmlnLmFjY291bnQpIH07XG4gICAgfVxuICAgIC8qKiBJbi1tZW1vcnkgdG90YWxzIHBlciBvcGVyYXRpb24gdHlwZSBzaW5jZSBzdGFydHVwIChvciB0aGUgbGFzdCBjbGVhcldyaXRlU3RhdHMpLiAqL1xuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBhc3luYyBnZXRBY2Nlc3NTdGF0cyhjb25maWc6IHsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPEFjY2Vzc1RvdGFscz4ge1xuICAgICAgICByZXR1cm4gZ2V0QWNjZXNzVG90YWxzKGNvbmZpZy5hY2NvdW50KTtcbiAgICB9XG4gICAgLyoqIEEgcGF0aCBicmVha2Rvd24gb2Ygb25lIG9wZXJhdGlvbidzIGFjY2Vzc2VzIChvcGVyYXRpb24gbmFtZXMgY29tZSBmcm9tIGdldEFjY2Vzc1N0YXRzKS4gbWF4Q291bnQgaXMgcGFzc2VkIHN0cmFpZ2h0IHRvIFRyZWVTdW1tYXJ5LmdldFN1bW1hcmllcy4gd2VpZ2h0QnlTaXplIGlzIGlnbm9yZWQgZm9yIGNvdW50LW9ubHkgb3BlcmF0aW9ucywgd2hpY2ggcmV0dXJuIHRoZWlyIGNvdW50IGJyZWFrZG93bi4gKi9cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgZ2V0QWNjZXNzU3VtbWFyaWVzKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IG9wZXJhdGlvbjogc3RyaW5nOyBtYXhDb3VudDogbnVtYmVyOyB3ZWlnaHRCeVNpemU/OiBib29sZWFuIH0pOiBQcm9taXNlPFN1bW1hcnlFbnRyeTxBY2Nlc3NTdW1tYXJ5U3RhdGU+W10+IHtcbiAgICAgICAgcmV0dXJuIHJlYWRBY2Nlc3NTdW1tYXJpZXMoY29uZmlnKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGdldEluZGV4SW5mbyhjb25maWc6IHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmcgfSk6IFByb21pc2U8eyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXI7IHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W10gfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0SW5kZXhUb3RhbHMoYXdhaXQgcmVxdWlyZUJ1Y2tldChjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUpKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGdldFN5bmNTdGF0dXMoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0U3luY1N0YXR1cyhhd2FpdCByZXF1aXJlQnVja2V0KGNvbmZpZy5hY2NvdW50LCBjb25maWcuYnVja2V0TmFtZSkpO1xuICAgIH1cblxuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBhc3luYyBzdGFydExhcmdlRmlsZShjb25maWc6IHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWc7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICBsZXQgdGFyZ2V0ID0gYXdhaXQgZmluZEJ1Y2tldFN0b3JlKGNvbmZpZy5hY2NvdW50LCBjb25maWcuYnVja2V0TmFtZSwgY29uZmlnLnNvdXJjZUNvbmZpZyk7XG4gICAgICAgIGxldCBpZCA9IGF3YWl0IHRhcmdldC5zdG9yZS5zdGFydExhcmdlVXBsb2FkKHsgcGF0aDogY29uZmlnLnBhdGgsIGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCB9KTtcbiAgICAgICAgLy8gcm91dGVLZXkgcGlucyB0aGUgdXBsb2FkJ3MgcGFydHMgYW5kIGZpbmlzaCB0byB0aGUgc2FtZSBzdG9yZSB0aGUgc3RhcnQgcGlja2VkIChpbi1mbGlnaHQgdXBsb2FkcyBzdXJ2aXZlIGEgYnVja2V0IHJlYnVpbGQ6IHRoZSBwYXJ0IGRhdGEgbGl2ZXMgaW4gdGhlIHN0b3JlJ3MgZm9sZGVyLCB3aGljaCBhIHJlYnVpbHQgc3RvcmUgc3RpbGwgc2VlcylcbiAgICAgICAgbGFyZ2VVcGxvYWRJbmZvLnNldChpZCwgeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgYnVja2V0TmFtZTogY29uZmlnLmJ1Y2tldE5hbWUsIHBhdGg6IGNvbmZpZy5wYXRoLCBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIHJvdXRlS2V5OiB0YXJnZXQucm91dGVLZXkgfSk7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gICAgYXN5bmMgdXBsb2FkUGFydChjb25maWc6IHsgdXBsb2FkSWQ6IHN0cmluZzsgZGF0YTogQnVmZmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICBsZXQgaW5mbyA9IGxhcmdlVXBsb2FkSW5mby5nZXQoY29uZmlnLnVwbG9hZElkKTtcbiAgICAgICAgaWYgKCFpbmZvKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbGFyZ2UgdXBsb2FkICR7Y29uZmlnLnVwbG9hZElkfWApO1xuICAgICAgICB0cmFja0FjY2Vzcyh7IGFjY291bnQ6IGluZm8uYWNjb3VudCwgb3BlcmF0aW9uOiBcInVwbG9hZFBhcnRcIiwgcGF0aDogYCR7aW5mby5idWNrZXROYW1lfS8ke2luZm8ucGF0aH1gLCBzaXplOiBjb25maWcuZGF0YS5sZW5ndGggfSk7XG4gICAgICAgIGxldCB0YXJnZXQgPSBhd2FpdCBmaW5kVXBsb2FkU3RvcmUoaW5mbyk7XG4gICAgICAgIGF3YWl0IHRhcmdldC5zdG9yZS5hcHBlbmRMYXJnZVVwbG9hZCh7IGlkOiBjb25maWcudXBsb2FkSWQsIGRhdGE6IEJ1ZmZlci5mcm9tKGNvbmZpZy5kYXRhKSB9KTtcbiAgICB9XG4gICAgYXN5bmMgZmluaXNoTGFyZ2VGaWxlKGNvbmZpZzogeyB1cGxvYWRJZDogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICBsZXQgaW5mbyA9IGxhcmdlVXBsb2FkSW5mby5nZXQoY29uZmlnLnVwbG9hZElkKTtcbiAgICAgICAgaWYgKCFpbmZvKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbGFyZ2UgdXBsb2FkICR7Y29uZmlnLnVwbG9hZElkfWApO1xuICAgICAgICBsYXJnZVVwbG9hZEluZm8uZGVsZXRlKGNvbmZpZy51cGxvYWRJZCk7XG4gICAgICAgIGxldCB0YXJnZXQgPSBhd2FpdCBmaW5kVXBsb2FkU3RvcmUoaW5mbyk7XG4gICAgICAgIGF3YWl0IHRhcmdldC5zdG9yZS5maW5pc2hMYXJnZVVwbG9hZCh7IGlkOiBjb25maWcudXBsb2FkSWQsIHBhdGg6IGluZm8ucGF0aCwgbGFzdE1vZGlmaWVkOiBpbmZvLmxhc3RNb2RpZmllZCB9KTtcbiAgICB9XG4gICAgLyoqIEJlc3QtZWZmb3J0IGNsZWFudXA6IGFuIHVwbG9hZCB3aG9zZSBidWNrZXQgb3Igc3RvcmUgaGFzIHNpbmNlIHZhbmlzaGVkIGhhcyBub3RoaW5nIGxlZnQgdG8gY2FuY2VsLiAqL1xuICAgIGFzeW5jIGNhbmNlbExhcmdlRmlsZShjb25maWc6IHsgdXBsb2FkSWQ6IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBpbmZvID0gbGFyZ2VVcGxvYWRJbmZvLmdldChjb25maWcudXBsb2FkSWQpO1xuICAgICAgICBpZiAoIWluZm8pIHJldHVybjtcbiAgICAgICAgbGFyZ2VVcGxvYWRJbmZvLmRlbGV0ZShjb25maWcudXBsb2FkSWQpO1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGluZm8uYWNjb3VudCwgaW5mby5idWNrZXROYW1lKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybjtcbiAgICAgICAgY29uc3Qgcm91dGVLZXkgPSBpbmZvLnJvdXRlS2V5O1xuICAgICAgICBsZXQgdGFyZ2V0ID0gYnVja2V0LnN0b3Jlcy5maW5kKHggPT4geC5yb3V0ZUtleSA9PT0gcm91dGVLZXkpO1xuICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuICAgICAgICBhd2FpdCB0YXJnZXQuc3RvcmUuY2FuY2VsTGFyZ2VVcGxvYWQoeyBpZDogY29uZmlnLnVwbG9hZElkIH0pO1xuICAgIH1cblxuICAgIC8vIElNUE9SVEFOVDogV2UgY2FuIG5ldmVyIGV4cG9zZSBlbnVtZXJhdGlvbiAobGlzdGluZywgcHJlZml4IHNlYXJjaCwgY2hhbmdlcyBmZWVkcykgb3ZlciB0aGlzIHB1YmxpYyBIVFRQIGVuZHBvaW50IC0gb25seSBleGFjdC1rZXkgcmVhZHMuIEVudW1lcmF0aW9uIHdvdWxkIGJlIGEgbWFzc2l2ZSBzZWN1cml0eSByaXNrIChwdWJsaWMgYnVja2V0cyByZWx5IG9uIHVuZ3Vlc3NhYmxlIGtleXMgc3RheWluZyB1bmd1ZXNzYWJsZSksIGFuZCBjb3VsZCBhbHNvIGNyYXNoIHRoZSBjbGllbnQgYnkgc2VuZGluZyB0aGVtIHRvbyBtdWNoIGRhdGEuIExpc3RpbmdzIGV4aXN0IG9ubHkgb24gdGhlIGF1dGhlbnRpY2F0ZWQgQVBJIChmaW5kSW5mbyBldGMsIGJlaGluZCBhY2NvdW50QWNjZXNzKS5cbiAgICBhc3luYyBodHRwRW50cnkoY29uZmlnPzogeyByZXF1aXJlQ2FsbHM/OiBzdHJpbmdbXTsgY2FjaGVUaW1lPzogbnVtYmVyIH0pOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgICAgICBsZXQgY2FsbGVyID0gU29ja2V0RnVuY3Rpb24uZ2V0Q2FsbGVyKCk7XG4gICAgICAgIGxldCByZXF1ZXN0ID0gZ2V0Q3VycmVudEhUVFBSZXF1ZXN0KCk7XG4gICAgICAgIGxldCBwYXRobmFtZSA9IG5ldyBVUkwocmVxdWVzdD8udXJsIHx8IFwiL1wiLCBcImh0dHBzOi8vbG9jYWxob3N0XCIpLnBhdGhuYW1lO1xuICAgICAgICBpZiAoIXBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvZmlsZS9cIikpIHtcbiAgICAgICAgICAgIGxldCBodG1sID0gYXdhaXQgcGVyZm9ybUxvY2FsQ2FsbCh7XG4gICAgICAgICAgICAgICAgY2FsbGVyLFxuICAgICAgICAgICAgICAgIGNhbGw6IHsgbm9kZUlkOiBjYWxsZXIubm9kZUlkLCBjbGFzc0d1aWQ6IFJlcXVpcmVDb250cm9sbGVyLl9jbGFzc0d1aWQsIGZ1bmN0aW9uTmFtZTogXCJyZXF1aXJlSFRNTFwiLCBhcmdzOiBbY29uZmlnXSB9LFxuICAgICAgICAgICAgfSkgYXMgQnVmZmVyO1xuICAgICAgICAgICAgLy8gV2l0aG91dCB0aGlzIHRoZSBhY2Nlc3MgcGFnZSBpcyBzZXJ2ZWQgd2l0aCBubyBjb250ZW50IHR5cGUsIGFuZCBhIGJyb3dzZXIgdGhhdCBpcyB0b2xkIG5vdCB0byBzbmlmZiBzaW1wbHkgd2lsbCBub3QgcmVuZGVyIGl0XG4gICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMoaHRtbCwgeyBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvaHRtbDsgY2hhcnNldD11dGYtOFwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXJ0cyA9IHBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoeCA9PiB4KS5tYXAoZGVjb2RlVVJJQ29tcG9uZW50KTtcbiAgICAgICAgbGV0IGFjY291bnQgPSBwYXJ0c1sxXTtcbiAgICAgICAgbGV0IGJ1Y2tldE5hbWUgPSBwYXJ0c1syXTtcbiAgICAgICAgbGV0IGZpbGVQYXRoID0gcGFydHMuc2xpY2UoMykuam9pbihcIi9cIik7XG4gICAgICAgIGlmICghYWNjb3VudCB8fCAhYnVja2V0TmFtZSB8fCAhZmlsZVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhCdWZmZXIuZnJvbShcIlwiKSwgeyBzdGF0dXM6IFwiNDA0XCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0VmFsaWROYW1lKGFjY291bnQsIFwiYWNjb3VudFwiKTtcbiAgICAgICAgYXNzZXJ0VmFsaWROYW1lKGJ1Y2tldE5hbWUsIFwiYnVja2V0IG5hbWVcIik7XG4gICAgICAgIGFzc2VydFZhbGlkUGF0aChmaWxlUGF0aCk7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMoQnVmZmVyLmZyb20oXCJcIiksIHsgc3RhdHVzOiBcIjQwNFwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYnVja2V0LnNlbGY/LnB1YmxpYykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IGlzIG5vdCBwdWJsaWMsIHNvIGl0cyBmaWxlcyBjYW5ub3QgYmUgcmVhZCBvdmVyIHBsYWluIFVSTHNgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbm9ueW1vdXMgVVJMIHJlYWRzIGNhcnJ5IG5vIHNvdXJjZSBzZWxlY3Rpb24gLSB0aGUgZmlsZSdzIHJvdXRlIHBpY2tzIHRoZSBzdG9yZSwgYW5kIGEgcm91dGUgbm8gc3RvcmUgaGVyZSBjb3ZlcnMgaXMgc2ltcGx5IG5vdCBmb3VuZCAodGhlIHJvdXRpbmcgZmlsZSBpdHNlbGYgbGl2ZXMgb3V0c2lkZSBldmVyeSBzdG9yZSlcbiAgICAgICAgbGV0IGh0dHBTdG9yZTogTG9hZGVkU3RvcmUgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBpbmZvOiB7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGZpbGVQYXRoICE9PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGZpbGVQYXRoKTtcbiAgICAgICAgICAgIGh0dHBTdG9yZSA9IGJ1Y2tldC5zdG9yZXMuZmluZChzID0+IHJvdXRlQ29udGFpbnMocy5yb3V0ZSwgcm91dGUpKTtcbiAgICAgICAgICAgIGluZm8gPSBodHRwU3RvcmUgJiYgYXdhaXQgaHR0cFN0b3JlLnN0b3JlLmdldEluZm8oeyBwYXRoOiBmaWxlUGF0aCB9KSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbmZvID0gYXdhaXQgZ2V0Um91dGluZ0ZpbGVSZXN1bHQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbmZvIHx8ICFpbmZvLnNpemUpIHtcbiAgICAgICAgICAgIHRyYWNrQWNjZXNzKHsgYWNjb3VudCwgb3BlcmF0aW9uOiBcImh0dHBHZXRcIiwgcGF0aDogYCR7YnVja2V0TmFtZX0vJHtmaWxlUGF0aH1gLCBzaXplOiAwIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHNldEhUVFBSZXN1bHRIZWFkZXJzKEJ1ZmZlci5mcm9tKFwiXCIpLCB7IHN0YXR1czogXCI0MDRcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZXh0ID0gZmlsZVBhdGguc3BsaXQoXCIuXCIpLnBvcCgpIHx8IFwiXCI7XG4gICAgICAgIGxldCBoZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogQ09OVEVOVF9UWVBFU1tleHQudG9Mb3dlckNhc2UoKV0gfHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIixcbiAgICAgICAgICAgIFwiTGFzdC1Nb2RpZmllZFwiOiBuZXcgRGF0ZShpbmZvLndyaXRlVGltZSkudG9VVENTdHJpbmcoKSxcbiAgICAgICAgICAgIFwiQWNjZXB0LVJhbmdlc1wiOiBcImJ5dGVzXCIsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChidWNrZXQuc2VsZj8uaW1tdXRhYmxlKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiQ2FjaGUtQ29udHJvbFwiXSA9IGBtYXgtYWdlPSR7SU1NVVRBQkxFX0NBQ0hFX1RJTUUgLyAxMDAwfWA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlmTW9kaWZpZWRTaW5jZSA9IHJlcXVlc3Q/LmhlYWRlcnNbXCJpZi1tb2RpZmllZC1zaW5jZVwiXTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZk1vZGlmaWVkU2luY2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBzaW5jZSA9IG5ldyBEYXRlKGlmTW9kaWZpZWRTaW5jZSkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgaWYgKHNpbmNlICYmIE1hdGguZmxvb3IoaW5mby53cml0ZVRpbWUgLyAxMDAwKSAqIDEwMDAgPD0gc2luY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMoQnVmZmVyLmZyb20oXCJcIiksIHsgLi4uaGVhZGVycywgc3RhdHVzOiBcIjMwNFwiIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgcmFuZ2VIZWFkZXIgPSByZXF1ZXN0Py5oZWFkZXJzW1wicmFuZ2VcIl07XG4gICAgICAgIGlmICh0eXBlb2YgcmFuZ2VIZWFkZXIgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IC9eYnl0ZXM9KFxcZCopLShcXGQqKSQvLmV4ZWMocmFuZ2VIZWFkZXIudHJpbSgpKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCAmJiAobWF0Y2hbMV0gfHwgbWF0Y2hbMl0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0OiBudW1iZXI7XG4gICAgICAgICAgICAgICAgbGV0IGVuZEluY2x1c2l2ZSA9IGluZm8uc2l6ZSAtIDE7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaFsxXSkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IE1hdGgubWF4KDAsIGluZm8uc2l6ZSAtICttYXRjaFsyXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSArbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kSW5jbHVzaXZlID0gTWF0aC5taW4oK21hdGNoWzJdLCBpbmZvLnNpemUgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gaW5mby5zaXplIHx8IHN0YXJ0ID4gZW5kSW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhCdWZmZXIuZnJvbShcIlwiKSwgeyAuLi5oZWFkZXJzLCBcIkNvbnRlbnQtUmFuZ2VcIjogYGJ5dGVzICovJHtpbmZvLnNpemV9YCwgc3RhdHVzOiBcIjQxNlwiIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByYW5nZSA9IHsgc3RhcnQsIGVuZDogZW5kSW5jbHVzaXZlICsgMSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQ6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChodHRwU3RvcmUpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGh0dHBTdG9yZS5zdG9yZS5nZXQyKHsgcGF0aDogZmlsZVBhdGgsIHJhbmdlIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgZ2V0Um91dGluZ0ZpbGVSZXN1bHQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmIHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0geyAuLi5yZXN1bHQsIGRhdGE6IHJlc3VsdC5kYXRhLnN1YmFycmF5KE1hdGgubWluKHJhbmdlLnN0YXJ0LCByZXN1bHQuZGF0YS5sZW5ndGgpLCBNYXRoLm1pbihyYW5nZS5lbmQsIHJlc3VsdC5kYXRhLmxlbmd0aCkpIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2tBY2Nlc3MoeyBhY2NvdW50LCBvcGVyYXRpb246IFwiaHR0cEdldFwiLCBwYXRoOiBgJHtidWNrZXROYW1lfS8ke2ZpbGVQYXRofWAsIHNpemU6IHJlc3VsdCAmJiByZXN1bHQuZGF0YS5sZW5ndGggfHwgMCB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhCdWZmZXIuZnJvbShcIlwiKSwgeyBzdGF0dXM6IFwiNDA0XCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMocmVzdWx0LmRhdGEsIHsgLi4uaGVhZGVycywgXCJDb250ZW50LVJhbmdlXCI6IGBieXRlcyAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZCAtIDF9LyR7aW5mby5zaXplfWAsIHN0YXR1czogXCIyMDZcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMocmVzdWx0LmRhdGEsIGhlYWRlcnMpO1xuICAgIH1cbn1cblxuLyoqIFRoZSBvbmUgcmVzb2x1dGlvbiBldmVyeSBkYXRhIGNhbGwgZG9lczogdGhlIGNsaWVudCdzIHNlbGVjdGVkIHNvdXJjZUNvbmZpZyBtYXBzIHRvIGV4YWN0bHkgb25lIHN0b3JlIChsb2FkaW5nIHRoZSBidWNrZXQgLSBhbmQgc28gaW5zdGFudGlhdGluZyBpdHMgc3RvcmVzIC0gaWYgbmVlZGVkKSwgYW5kIGZuIHJ1bnMgb24gaXQuIGZpbmRCdWNrZXRTdG9yZSB0aHJvd3MgZm9yIG1pc3NpbmcgYnVja2V0cyBhbmQgdW5tYXRjaGVkIGNvbmZpZ3MuICovXG5hc3luYyBmdW5jdGlvbiB3aXRoU3RvcmU8VD4oY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nOyBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZyB9LCBmbjogKHN0b3JlOiBJQnVja2V0U3RvcmUpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBsZXQgdGFyZ2V0ID0gYXdhaXQgZmluZEJ1Y2tldFN0b3JlKGNvbmZpZy5hY2NvdW50LCBjb25maWcuYnVja2V0TmFtZSwgY29uZmlnLnNvdXJjZUNvbmZpZyk7XG4gICAgcmV0dXJuIGF3YWl0IGZuKHRhcmdldC5zdG9yZSk7XG59XG5cbmNvbnN0IGxhcmdlVXBsb2FkSW5mbyA9IG5ldyBNYXA8c3RyaW5nLCB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgcm91dGVLZXk6IHN0cmluZyB9PigpO1xuXG5hc3luYyBmdW5jdGlvbiBmaW5kVXBsb2FkU3RvcmUoaW5mbzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgcm91dGVLZXk6IHN0cmluZyB9KTogUHJvbWlzZTxMb2FkZWRTdG9yZT4ge1xuICAgIGxldCBidWNrZXQgPSBhd2FpdCByZXF1aXJlQnVja2V0KGluZm8uYWNjb3VudCwgaW5mby5idWNrZXROYW1lKTtcbiAgICBsZXQgdGFyZ2V0ID0gYnVja2V0LnN0b3Jlcy5maW5kKHggPT4geC5yb3V0ZUtleSA9PT0gaW5mby5yb3V0ZUtleSk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc3RvcmUgKHJvdXRlICR7aW5mby5yb3V0ZUtleX0pIHRoaXMgdXBsb2FkIHRhcmdldHMgbm8gbG9uZ2VyIGV4aXN0cyBvbiBidWNrZXQgJHtpbmZvLmFjY291bnR9LyR7aW5mby5idWNrZXROYW1lfSAoYXZhaWxhYmxlOiAke0pTT04uc3RyaW5naWZ5KGJ1Y2tldC5zdG9yZXMubWFwKHggPT4geC5yb3V0ZUtleSkpfSlgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cblxuY29uc3QgYWNjb3VudEFjY2VzczogU29ja2V0RnVuY3Rpb25Ib29rID0gYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGxldCBjb25maWcgPSBjb250ZXh0LmNhbGwuYXJnc1swXSBhcyB7IGFjY291bnQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBhd2FpdCByZXF1aXJlQWNjZXNzKFN0cmluZyhjb25maWc/LmFjY291bnQpKTtcbiAgICBsZXQgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnQ7XG4gICAgaWYgKGR1cmF0aW9uID4gQUNDRVNTX0NIRUNLX1NMT1dfVElNRSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQWNjZXNzIGNoZWNrIGZvciAke2NvbnRleHQuY2FsbC5mdW5jdGlvbk5hbWV9IHRvb2sgJHtkdXJhdGlvbn1tc2ApO1xuICAgIH1cbn07XG5jb25zdCB1cGxvYWRBY2Nlc3M6IFNvY2tldEZ1bmN0aW9uSG9vayA9IGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgbGV0IGNvbmZpZyA9IGNvbnRleHQuY2FsbC5hcmdzWzBdIGFzIHsgdXBsb2FkSWQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaW5mbyA9IGxhcmdlVXBsb2FkSW5mby5nZXQoU3RyaW5nKGNvbmZpZz8udXBsb2FkSWQpKTtcbiAgICBpZiAoIWluZm8pIHJldHVybjtcbiAgICBhd2FpdCByZXF1aXJlQWNjZXNzKGluZm8uYWNjb3VudCk7XG59O1xuY29uc3QgYWRtaW5BY2Nlc3M6IFNvY2tldEZ1bmN0aW9uSG9vayA9IGFzeW5jICgpID0+IHtcbiAgICByZXF1aXJlQWRtaW4oKTtcbn07XG5cbmV4cG9ydCBjb25zdCBSZW1vdGVTdG9yYWdlQ29udHJvbGxlciA9IFNvY2tldEZ1bmN0aW9uLnJlZ2lzdGVyKFxuICAgIFJFTU9URV9TVE9SQUdFX0NMQVNTX0dVSUQsXG4gICAgbmV3IFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyQmFzZSgpLFxuICAgICgpID0+ICh7XG4gICAgICAgIHBpbmc6IHt9LFxuICAgICAgICBhdXRoZW50aWNhdGU6IHt9LFxuICAgICAgICByZXF1ZXN0QWNjZXNzOiB7fSxcbiAgICAgICAgZ2V0QWNjZXNzU3RhdGU6IHt9LFxuICAgICAgICBsaXN0UmVxdWVzdHNGb3JJUDogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGdyYW50QWNjZXNzOiB7fSxcbiAgICAgICAgYWRtaW5MaXN0UmVxdWVzdHM6IHsgaG9va3M6IFthZG1pbkFjY2Vzc10gfSxcbiAgICAgICAgYWRtaW5MaXN0QWN0aXZlQnVja2V0czogeyBob29rczogW2FkbWluQWNjZXNzXSB9LFxuICAgICAgICBhZG1pbkdyYW50QWNjZXNzOiB7IGhvb2tzOiBbYWRtaW5BY2Nlc3NdIH0sXG4gICAgICAgIGdldDI6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBzZXQ6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBkZWw6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXRJbmZvOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZmluZEluZm86IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXRDaGFuZ2VzQWZ0ZXIyOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0QXJjaGl2ZXNDb25maWc6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXRJbmRleEluZm86IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBsaXN0QnVja2V0czogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGdldEFjdGl2ZUJ1Y2tldDogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGFjdGl2YXRlQnVja2V0OiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgY2xlYXJXcml0ZVN0YXRzOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0QWNjZXNzU3RhdHM6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXRBY2Nlc3NTdW1tYXJpZXM6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXRTeW5jU3RhdHVzOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgc3RhcnRMYXJnZUZpbGU6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICB1cGxvYWRQYXJ0OiB7IGhvb2tzOiBbdXBsb2FkQWNjZXNzXSB9LFxuICAgICAgICBmaW5pc2hMYXJnZUZpbGU6IHsgaG9va3M6IFt1cGxvYWRBY2Nlc3NdIH0sXG4gICAgICAgIGNhbmNlbExhcmdlRmlsZTogeyBob29rczogW3VwbG9hZEFjY2Vzc10gfSxcbiAgICAgICAgaHR0cEVudHJ5OiB7fSxcbiAgICB9KSxcbiAgICAoKSA9PiAoe1xuICAgICAgICBub0NsaWVudEhvb2tzOiB0cnVlLFxuICAgICAgICBub0RlZmF1bHRIb29rczogdHJ1ZSxcbiAgICB9KVxuKTtcbiJdfQ==
585
- /* _JS_SOURCE_HASH = "a507ae8ec075e14fd02bbe1b2e2870228406e05afc57436b9a93fbb395998e21"; */
581
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZUNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdG9yYWdlQ29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxtRUFBZ0U7QUFFaEUsNkRBQTREO0FBQzVELHlFQUFrRztBQUNsRyxpRUFBbUU7QUFDbkUsaUZBQThFO0FBQzlFLG1EQUF3RDtBQUN4RCxrREFBa0k7QUFDbEksNENBQW1JO0FBQ25JLGlEQUF1RTtBQUN2RSw2REFLOEI7QUFDOUIsaURBQW9HO0FBRXBHLDZDQUFvRDtBQUNwRCx1RUFBb0U7QUFDcEUsK0NBQThKO0FBQzlKLDZDQUFpRjtBQUdwRSxRQUFBLHlCQUF5QixHQUFHLGtDQUFrQyxDQUFDO0FBQy9ELFFBQUEsb0JBQW9CLEdBQUcsc0JBQXNCLENBQUM7QUFDOUMsUUFBQSx5QkFBeUIsR0FBRywyQ0FBMkMsQ0FBQztBQUN4RSxRQUFBLHFCQUFxQixHQUFHLHVDQUF1QyxDQUFDO0FBRTdFLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQVksR0FBRyxFQUFFLENBQUM7QUFDM0MsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7QUFDbEMsTUFBTSxZQUFZLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztBQUNoQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztBQWlDL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7QUFFM0Msd1pBQXdaO0FBQ3haLE1BQU0sYUFBYSxHQUE4QjtJQUM3QyxHQUFHLEVBQUUseUJBQXlCLEVBQUUsSUFBSSxFQUFFLGlDQUFpQztJQUN2RSxHQUFHLEVBQUUsMkJBQTJCLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFdBQVc7SUFDM0csSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxZQUFZO0lB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LGlCQUFpQixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDN0MsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDeEMsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDdkMsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDM0MsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDMUMsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDM0MsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDMUMsa0JBQWtCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRTtJQUM5QyxhQUFhLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRTtJQUN6QyxjQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRTtJQUMxQyxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRTtJQUNyQyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRTtJQUMxQyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRTtJQUMxQyxTQUFTLEVBQUUsRUFBRTtDQUNoQixDQUFDLEVBQ0YsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNILGFBQWEsRUFBRSxJQUFJO0lBQ25CLGNBQWMsRUFBRSxJQUFJO0NBQ3ZCLENBQUMsQ0FDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU29ja2V0RnVuY3Rpb24gfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL1NvY2tldEZ1bmN0aW9uXCI7XG5pbXBvcnQgeyBTb2NrZXRGdW5jdGlvbkhvb2sgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL1NvY2tldEZ1bmN0aW9uVHlwZXNcIjtcbmltcG9ydCB7IGdldE5vZGVJZElQIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbm9kZUNhY2hlXCI7XG5pbXBvcnQgeyBzZXRIVFRQUmVzdWx0SGVhZGVycywgZ2V0Q3VycmVudEhUVFBSZXF1ZXN0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FsbEhUVFBIYW5kbGVyXCI7XG5pbXBvcnQgeyBwZXJmb3JtTG9jYWxDYWxsIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FsbE1hbmFnZXJcIjtcbmltcG9ydCB7IFJlcXVpcmVDb250cm9sbGVyIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9yZXF1aXJlL1JlcXVpcmVDb250cm9sbGVyXCI7XG5pbXBvcnQgeyB0aW1lSW5NaW51dGUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBnZXRDb21tb25OYW1lLCBnZXRQdWJsaWNJZGVudGlmaWVyLCBnZXRPd25NYWNoaW5lSWQsIHZlcmlmeSwgdmVyaWZ5TWFjaGluZUlkRm9yUHVibGljS2V5IH0gZnJvbSBcIi4uLy4uL21pc2MvaHR0cHMvY2VydHNcIjtcbmltcG9ydCB7IEFyY2hpdmVGaWxlSW5mbywgQXJjaGl2ZXNDb25maWcsIEFyY2hpdmVzU3luY1N0YXR1cywgRmluZENvbmZpZywgU291cmNlQ29uZmlnLCBJTU1VVEFCTEVfQ0FDSEVfVElNRSB9IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgZ2V0Um91dGUsIHJvdXRlQ29udGFpbnMgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7XG4gICAgZ2V0TG9hZGVkQnVja2V0LCByZXF1aXJlQnVja2V0LCBmaW5kQnVja2V0U3RvcmUsIGdldFN0b3JlLCByZWFkQnVja2V0SW50ZXJuYWwsIHdyaXRlUm91dGluZ0NvbmZpZyxcbiAgICBnZXRCdWNrZXRDb25maWcsIGJ1Y2tldFN5bmNTdGF0dXMsIGRlYnVnQnVja2V0SW5kZXhUb3RhbHMsIExvYWRlZFN0b3JlLCBBY3RpdmVCdWNrZXRJbmZvLFxuICAgIGRlYnVnTGlzdEFjY291bnRCdWNrZXRzLCBTZXJ2ZXJCdWNrZXRJbmZvLCBkZWJ1Z0NsZWFyQWNjb3VudFdyaXRlU3RhdHMsXG4gICAgZGVidWdHZXRBY3RpdmVCdWNrZXQsIGFjdGl2YXRlQnVja2V0LCBnZXRBY3RpdmVCdWNrZXRLZXlzLFxufSBmcm9tIFwiLi9zdG9yYWdlU2VydmVyU3RhdGVcIjtcbmltcG9ydCB7IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcsIGdldFRydXN0LCBnZXRSZXF1ZXN0cywgYXNzZXJ0V3JpdGVzQWxsb3dlZCB9IGZyb20gXCIuL3NlcnZlckNvbmZpZ1wiO1xuaW1wb3J0IHsgQmxvYlN0b3JlIH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQgeyBnZXRSb3V0aW5nRmlsZVJlc3VsdCB9IGZyb20gXCIuL2J1Y2tldERpc2tcIjtcbmltcG9ydCB7IFN0b3JhZ2VDbGllbnRDb250cm9sbGVyIH0gZnJvbSBcIi4vc3RvcmFnZUNsaWVudENvbnRyb2xsZXJcIjtcbmltcG9ydCB7IHRyYWNrQWNjZXNzLCB0cmFja0FjY2Vzc0NhbGwsIGdldEFjY2Vzc1RvdGFscywgcmVhZEFjY2Vzc1N1bW1hcmllcywgY2xlYXJBY2NvdW50QWNjZXNzU3RhdHMsIEFjY2Vzc1RvdGFscywgQWNjZXNzU3VtbWFyeVN0YXRlIH0gZnJvbSBcIi4vYWNjZXNzU3RhdHNcIjtcbmltcG9ydCB7IGFzc2VydFZhbGlkTmFtZSwgYXNzZXJ0VmFsaWRQYXRoLCBhc3NlcnRWYWxpZEFyZ3MgfSBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IFN1bW1hcnlFbnRyeSB9IGZyb20gXCIuLi8uLi90cmVlU3VtbWFyeVwiO1xuXG5leHBvcnQgY29uc3QgUkVNT1RFX1NUT1JBR0VfQ0xBU1NfR1VJRCA9IFwiUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXItYjdlNDJhOTFcIjtcbmV4cG9ydCBjb25zdCBTVE9SQUdFX0FVVEhfUFVSUE9TRSA9IFwicmVtb3RlU3RvcmFnZS1hdXRoLTFcIjtcbmV4cG9ydCBjb25zdCBTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEID0gXCJSRU1PVEVfU1RPUkFHRV9OT1RfQVVUSEVOVElDQVRFRF9jZjJmN2IxZVwiO1xuZXhwb3J0IGNvbnN0IFNUT1JBR0VfQUNDRVNTX0RFTklFRCA9IFwiUkVNT1RFX1NUT1JBR0VfQUNDRVNTX0RFTklFRF85ZDgxYTRjMFwiO1xuXG5jb25zdCBBVVRIX1RJTUVfV0lORE9XID0gdGltZUluTWludXRlICogMTA7XG5jb25zdCBBQ0NFU1NfQ0hFQ0tfU0xPV19USU1FID0gNTA7XG5jb25zdCBNQVhfU0VTU0lPTlMgPSAxMDAgKiAxMDAwO1xuY29uc3QgTUFYX1JFUVVFU1RTX1BFUl9JUCA9IDUwO1xuXG5leHBvcnQgdHlwZSBBdXRoVG9rZW5EYXRhID0ge1xuICAgIHB1cnBvc2U6IHN0cmluZztcbiAgICB0aW1lOiBudW1iZXI7XG4gICAgc2VydmVyOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgQXV0aFRva2VuID0ge1xuICAgIGNlcnRQZW06IHN0cmluZztcbiAgICBzaWduYXR1cmU6IHN0cmluZztcbiAgICBkYXRhOiBBdXRoVG9rZW5EYXRhO1xufTtcbmV4cG9ydCB0eXBlIEFjY2Vzc1JlcXVlc3QgPSB7XG4gICAgcmVxdWVzdElkOiBzdHJpbmc7XG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIG1hY2hpbmVJZDogc3RyaW5nO1xuICAgIGlwOiBzdHJpbmc7XG4gICAgdGltZTogbnVtYmVyO1xufTtcbmV4cG9ydCB0eXBlIFRydXN0UmVjb3JkID0ge1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBpcDogc3RyaW5nO1xuICAgIHRpbWU6IG51bWJlcjtcbn07XG5leHBvcnQgdHlwZSBBY2Nlc3NTdGF0ZSA9IHtcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBpcDogc3RyaW5nO1xuICAgIGhhc0FjY2VzczogYm9vbGVhbjtcbiAgICBncmFudEFjY2Vzc0NvbW1hbmQ/OiBzdHJpbmc7XG4gICAgdHJ1c3RlZE1hY2hpbmVzPzogVHJ1c3RSZWNvcmRbXTtcbn07XG5cbmNvbnN0IHNlc3Npb25zID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuLy8gV2UgbXVzdCBuZXZlciBzZXJ2ZSBhbnl0aGluZyB0aGF0IGNhbiBiZSBldmFsdWF0ZWQgYXMgY29kZSAoaHRtbCwganMgLSBhbmQgc3ZnLCB3aGljaCBjYW4gZW1iZWQgPHNjcmlwdD4gYW5kIHJ1bnMgaXQgd2hlbiB2aXNpdGVkIGFzIGEgZG9jdW1lbnQpLiBPdGhlcndpc2UgYSB1c2VyIGNvdWxkIGhvc3QgYSBmaWxlIGFuZCwgYnkgdmlzaXRpbmcgaXQsIHJ1biBpdCBvbiBvdXIgZG9tYWluIC0gZ2l2aW5nIHRoZW0gYWNjZXNzIHRvIGFsbCBvZiBvdXIga2V5cyBhbmQgY29va2llcy4gUERGIHN0YXlzOiBicm93c2VyIFBERiB2aWV3ZXJzIHJ1biBhbnkgZW1iZWRkZWQgUERGIHNjcmlwdGluZyBpbiBhIHNhbmRib3ggd2l0aCBubyBhY2Nlc3MgdG8gdGhlIHNlcnZpbmcgb3JpZ2luJ3MgY29va2llcyBvciBET00uXG5jb25zdCBDT05URU5UX1RZUEVTOiB7IFtleHQ6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIGNzczogXCJ0ZXh0L2NzczsgY2hhcnNldD11dGYtOFwiLCBqc29uOiBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIixcbiAgICB0eHQ6IFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiLCBwbmc6IFwiaW1hZ2UvcG5nXCIsIGpwZzogXCJpbWFnZS9qcGVnXCIsIGpwZWc6IFwiaW1hZ2UvanBlZ1wiLCBnaWY6IFwiaW1hZ2UvZ2lmXCIsXG4gICAgd2VicDogXCJpbWFnZS93ZWJwXCIsIG1wNDogXCJ2aWRlby9tcDRcIiwgd2VibTogXCJ2aWRlby93ZWJtXCIsXG4gICAgbXAzOiBcImF1ZGlvL21wZWdcIiwgd2F2OiBcImF1ZGlvL3dhdlwiLCBwZGY6IFwiYXBwbGljYXRpb24vcGRmXCIsXG59O1xuXG5jb25zdCBjb25uZWN0ZWRDbGllbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5mdW5jdGlvbiB0cmFja0NhbGxlcigpOiB2b2lkIHtcbiAgICBsZXQgbm9kZUlkID0gU29ja2V0RnVuY3Rpb24uZ2V0Q2FsbGVyKCkubm9kZUlkO1xuICAgIGlmIChjb25uZWN0ZWRDbGllbnRzLmhhcyhub2RlSWQpKSByZXR1cm47XG4gICAgY29ubmVjdGVkQ2xpZW50cy5hZGQobm9kZUlkKTtcbiAgICBTb2NrZXRGdW5jdGlvbi5vbk5leHREaXNjb25uZWN0KG5vZGVJZCwgKCkgPT4ge1xuICAgICAgICBjb25uZWN0ZWRDbGllbnRzLmRlbGV0ZShub2RlSWQpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coYEJyb2FkY2FzdGluZyByb3V0aW5nIGNvbmZpZyBjaGFuZ2UgdG8gJHtjb25uZWN0ZWRDbGllbnRzLnNpemV9IGNvbm5lY3RlZCBjbGllbnRzYCk7XG4gICAgZm9yIChsZXQgbm9kZUlkIG9mIFsuLi5jb25uZWN0ZWRDbGllbnRzXSkge1xuICAgICAgICB2b2lkIFN0b3JhZ2VDbGllbnRDb250cm9sbGVyLm5vZGVzW25vZGVJZF0ucm91dGluZ0NvbmZpZ0NoYW5nZWQoKS5jYXRjaCgoKSA9PiB7IH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q2FsbGVyTWFjaGluZUlkKCk6IHN0cmluZyB7XG4gICAgbGV0IGNhbGxlciA9IFNvY2tldEZ1bmN0aW9uLmdldENhbGxlcigpO1xuICAgIGxldCBtYWNoaW5lSWQgPSBzZXNzaW9ucy5nZXQoY2FsbGVyLm5vZGVJZCk7XG4gICAgaWYgKCFtYWNoaW5lSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUR9IENhbGwgYXV0aGVudGljYXRlIGZpcnN0IChjb25uZWN0aW9uICR7Y2FsbGVyLm5vZGVJZH0pYCk7XG4gICAgfVxuICAgIHJldHVybiBtYWNoaW5lSWQ7XG59XG5mdW5jdGlvbiBnZXRDYWxsZXJJUCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXROb2RlSWRJUChTb2NrZXRGdW5jdGlvbi5nZXRDYWxsZXIoKS5ub2RlSWQpO1xufVxuZnVuY3Rpb24gaXNBZG1pbihtYWNoaW5lSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBtYWNoaW5lSWQgPT09IGdldE93bk1hY2hpbmVJZChnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCkucm9vdERvbWFpbik7XG59XG5mdW5jdGlvbiByZXF1aXJlQWRtaW4oKTogc3RyaW5nIHtcbiAgICBsZXQgbWFjaGluZUlkID0gZ2V0Q2FsbGVyTWFjaGluZUlkKCk7XG4gICAgaWYgKCFpc0FkbWluKG1hY2hpbmVJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfQUNDRVNTX0RFTklFRH0gQWRtaW4gY29tbWFuZHMgbXVzdCBiZSBydW4gZnJvbSB0aGUgc3RvcmFnZSBtYWNoaW5lIGl0c2VsZiAoY2FsbGVyIG1hY2hpbmUgJHttYWNoaW5lSWR9KWApO1xuICAgIH1cbiAgICByZXR1cm4gbWFjaGluZUlkO1xufVxuYXN5bmMgZnVuY3Rpb24gcmVxdWlyZUFjY2VzcyhhY2NvdW50OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGFzc2VydFZhbGlkTmFtZShhY2NvdW50LCBcImFjY291bnRcIik7XG4gICAgbGV0IG1hY2hpbmVJZCA9IGdldENhbGxlck1hY2hpbmVJZCgpO1xuICAgIGlmIChpc0FkbWluKG1hY2hpbmVJZCkpIHJldHVybiBtYWNoaW5lSWQ7XG4gICAgbGV0IHRydXN0ID0gYXdhaXQgZ2V0VHJ1c3QoKTtcbiAgICBsZXQgdHJ1c3RlZCA9IGF3YWl0IHRydXN0LmdldChgJHthY2NvdW50fXwke21hY2hpbmVJZH1gKTtcbiAgICBpZiAoIXRydXN0ZWQpIHtcbiAgICAgICAgbGV0IHsgZG9tYWluLCBwb3J0IH0gPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX0FDQ0VTU19ERU5JRUR9IE1hY2hpbmUgJHttYWNoaW5lSWR9IGhhcyBubyBhY2Nlc3MgdG8gYWNjb3VudCAke0pTT04uc3RyaW5naWZ5KGFjY291bnQpfS4gVmlzaXQgaHR0cHM6Ly8ke2RvbWFpbn06JHtwb3J0fS8ke2FjY291bnR9IGZvciBhY2Nlc3MgaW5zdHJ1Y3Rpb25zLmApO1xuICAgIH1cbiAgICByZXR1cm4gbWFjaGluZUlkO1xufVxuXG5mdW5jdGlvbiBnZXRHcmFudEFjY2Vzc0NvbW1hbmQocmVxdWVzdElkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCB7IHNzaFRhcmdldCwgc2VydmVyQ29tbWFuZCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgIHJldHVybiBgc3NoICR7c3NoVGFyZ2V0fSAnJHtzZXJ2ZXJDb21tYW5kfSAtLXJlcXVlc3RJZCAke3JlcXVlc3RJZH0nYDtcbn1cblxuY2xhc3MgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXJCYXNlIHtcbiAgICBhc3luYyBwaW5nKCk6IFByb21pc2U8e30+IHtcbiAgICAgICAgdHJhY2tDYWxsZXIoKTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGFzeW5jIGF1dGhlbnRpY2F0ZSh0b2tlbjogQXV0aFRva2VuKTogUHJvbWlzZTx7IG1hY2hpbmVJZDogc3RyaW5nOyBpcDogc3RyaW5nIH0+IHtcbiAgICAgICAgbGV0IHsgZG9tYWluLCBwb3J0IH0gPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk7XG4gICAgICAgIGxldCBjYWxsZXIgPSBTb2NrZXRGdW5jdGlvbi5nZXRDYWxsZXIoKTtcbiAgICAgICAgdmVyaWZ5KHRva2VuLmNlcnRQZW0sIHRva2VuLnNpZ25hdHVyZSwgdG9rZW4uZGF0YSk7XG4gICAgICAgIGxldCB7IHB1cnBvc2UsIHRpbWUsIHNlcnZlciB9ID0gdG9rZW4uZGF0YTtcbiAgICAgICAgaWYgKHB1cnBvc2UgIT09IFNUT1JBR0VfQVVUSF9QVVJQT1NFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF1dGggdG9rZW4gcHVycG9zZSBpcyAke0pTT04uc3RyaW5naWZ5KHB1cnBvc2UpfSwgZXhwZWN0ZWQgJHtKU09OLnN0cmluZ2lmeShTVE9SQUdFX0FVVEhfUFVSUE9TRSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE1hdGguYWJzKERhdGUubm93KCkgLSB0aW1lKSA+IEFVVEhfVElNRV9XSU5ET1cpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXV0aCB0b2tlbiB0aW1lIGlzIHRvbyBmYXIgZnJvbSB0aGUgc2VydmVyIHRpbWUgKHRva2VuICR7dGltZX0sIHNlcnZlciAke0RhdGUubm93KCl9LCBhbGxvd2VkIGRyaWZ0ICR7QVVUSF9USU1FX1dJTkRPV31tcylgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdG9rZW5Eb21haW4gPSBzZXJ2ZXIuc3BsaXQoXCI6XCIpWzBdO1xuICAgICAgICBpZiAodG9rZW5Eb21haW4gIT09IGRvbWFpbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdXRoIHRva2VuIGlzIGZvciBzZXJ2ZXIgJHtKU09OLnN0cmluZ2lmeShzZXJ2ZXIpfSwgYnV0IHRoaXMgc2VydmVyIGlzICR7SlNPTi5zdHJpbmdpZnkoYCR7ZG9tYWlufToke3BvcnR9YCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hY2hpbmVJZCA9IGdldENvbW1vbk5hbWUodG9rZW4uY2VydFBlbSkuc3BsaXQoXCIuXCIpWzBdO1xuICAgICAgICBpZiAoIXZlcmlmeU1hY2hpbmVJZEZvclB1YmxpY0tleSh7IG1hY2hpbmVJZCwgcHVibGljS2V5OiBnZXRQdWJsaWNJZGVudGlmaWVyKHRva2VuLmNlcnRQZW0pIH0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENlcnRpZmljYXRlIGNvbW1vbiBuYW1lICR7SlNPTi5zdHJpbmdpZnkoZ2V0Q29tbW9uTmFtZSh0b2tlbi5jZXJ0UGVtKSl9IGRvZXMgbm90IG1hdGNoIGl0cyBwdWJsaWMga2V5YCk7XG4gICAgICAgIH1cbiAgICAgICAgc2Vzc2lvbnMuc2V0KGNhbGxlci5ub2RlSWQsIG1hY2hpbmVJZCk7XG4gICAgICAgIHdoaWxlIChzZXNzaW9ucy5zaXplID4gTUFYX1NFU1NJT05TKSB7XG4gICAgICAgICAgICBsZXQgb2xkZXN0ID0gc2Vzc2lvbnMua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgICAgIGlmIChvbGRlc3QgPT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICAgICAgICBzZXNzaW9ucy5kZWxldGUob2xkZXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBtYWNoaW5lSWQsIGlwOiBnZXRDYWxsZXJJUCgpIH07XG4gICAgfVxuXG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIHJlcXVlc3RBY2Nlc3MoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZyB9KTogUHJvbWlzZTx7IG1hY2hpbmVJZDogc3RyaW5nOyBpcDogc3RyaW5nOyByZXF1ZXN0SWQ6IHN0cmluZzsgZ3JhbnRBY2Nlc3NDb21tYW5kOiBzdHJpbmcgfT4ge1xuICAgICAgICBsZXQgYWNjb3VudCA9IGNvbmZpZy5hY2NvdW50O1xuICAgICAgICBsZXQgbWFjaGluZUlkID0gZ2V0Q2FsbGVyTWFjaGluZUlkKCk7XG4gICAgICAgIGxldCBpcCA9IGdldENhbGxlcklQKCk7XG4gICAgICAgIGxldCByZXF1ZXN0c1N0b3JhZ2UgPSBhd2FpdCBnZXRSZXF1ZXN0cygpO1xuICAgICAgICBsZXQgcmVxdWVzdHMgPSBhd2FpdCByZXF1ZXN0c1N0b3JhZ2UuZ2V0KGlwKSB8fCBbXTtcbiAgICAgICAgbGV0IGV4aXN0aW5nID0gcmVxdWVzdHMuZmluZCh4ID0+IHguYWNjb3VudCA9PT0gYWNjb3VudCAmJiB4Lm1hY2hpbmVJZCA9PT0gbWFjaGluZUlkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICBleGlzdGluZy50aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4aXN0aW5nID0ge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApLFxuICAgICAgICAgICAgICAgIGFjY291bnQsXG4gICAgICAgICAgICAgICAgbWFjaGluZUlkLFxuICAgICAgICAgICAgICAgIGlwLFxuICAgICAgICAgICAgICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVxdWVzdHMucHVzaChleGlzdGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHJlcXVlc3RzLmxlbmd0aCA+IE1BWF9SRVFVRVNUU19QRVJfSVApIHJlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICAgIGF3YWl0IHJlcXVlc3RzU3RvcmFnZS5zZXQoaXAsIHJlcXVlc3RzKTtcbiAgICAgICAgcmV0dXJuIHsgbWFjaGluZUlkLCBpcCwgcmVxdWVzdElkOiBleGlzdGluZy5yZXF1ZXN0SWQsIGdyYW50QWNjZXNzQ29tbWFuZDogZ2V0R3JhbnRBY2Nlc3NDb21tYW5kKGV4aXN0aW5nLnJlcXVlc3RJZCkgfTtcbiAgICB9XG5cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgZ2V0QWNjZXNzU3RhdGUoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZyB9KTogUHJvbWlzZTxBY2Nlc3NTdGF0ZT4ge1xuICAgICAgICBsZXQgYWNjb3VudCA9IGNvbmZpZy5hY2NvdW50O1xuICAgICAgICBsZXQgbWFjaGluZUlkID0gZ2V0Q2FsbGVyTWFjaGluZUlkKCk7XG4gICAgICAgIGxldCBpcCA9IGdldENhbGxlcklQKCk7XG4gICAgICAgIGxldCB0cnVzdCA9IGF3YWl0IGdldFRydXN0KCk7XG4gICAgICAgIGxldCBoYXNBY2Nlc3MgPSBpc0FkbWluKG1hY2hpbmVJZCkgfHwgISFhd2FpdCB0cnVzdC5nZXQoYCR7YWNjb3VudH18JHttYWNoaW5lSWR9YCk7XG4gICAgICAgIGxldCByZXN1bHQ6IEFjY2Vzc1N0YXRlID0geyBtYWNoaW5lSWQsIGlwLCBoYXNBY2Nlc3MgfTtcbiAgICAgICAgaWYgKCFoYXNBY2Nlc3MpIHtcbiAgICAgICAgICAgIGxldCByZXF1ZXN0cyA9IGF3YWl0IGdldFJlcXVlc3RzKCk7XG4gICAgICAgICAgICBsZXQgb3duUmVxdWVzdCA9IChhd2FpdCByZXF1ZXN0cy5nZXQoaXApIHx8IFtdKS5maW5kKHggPT4geC5hY2NvdW50ID09PSBhY2NvdW50ICYmIHgubWFjaGluZUlkID09PSBtYWNoaW5lSWQpO1xuICAgICAgICAgICAgaWYgKG93blJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZ3JhbnRBY2Nlc3NDb21tYW5kID0gZ2V0R3JhbnRBY2Nlc3NDb21tYW5kKG93blJlcXVlc3QucmVxdWVzdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHJ1c3RlZE1hY2hpbmVzOiBUcnVzdFJlY29yZFtdID0gW107XG4gICAgICAgIGZvciAobGV0IGtleSBvZiBhd2FpdCB0cnVzdC5nZXRLZXlzKCkpIHtcbiAgICAgICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoYCR7YWNjb3VudH18YCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHJlY29yZCA9IGF3YWl0IHRydXN0LmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKHJlY29yZCkgdHJ1c3RlZE1hY2hpbmVzLnB1c2gocmVjb3JkKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQudHJ1c3RlZE1hY2hpbmVzID0gdHJ1c3RlZE1hY2hpbmVzO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGFzeW5jIGxpc3RSZXF1ZXN0c0ZvcklQKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGlwOiBzdHJpbmcgfSk6IFByb21pc2U8QWNjZXNzUmVxdWVzdFtdPiB7XG4gICAgICAgIGxldCByZXF1ZXN0cyA9IGF3YWl0IGdldFJlcXVlc3RzKCk7XG4gICAgICAgIHJldHVybiAoYXdhaXQgcmVxdWVzdHMuZ2V0KGNvbmZpZy5pcCkgfHwgW10pLmZpbHRlcih4ID0+IHguYWNjb3VudCA9PT0gY29uZmlnLmFjY291bnQpO1xuICAgIH1cblxuICAgIGFzeW5jIGdyYW50QWNjZXNzKGNvbmZpZzogeyByZXF1ZXN0SWQ6IHN0cmluZyB9KTogUHJvbWlzZTxUcnVzdFJlY29yZD4ge1xuICAgICAgICBsZXQgcmVxdWVzdElkID0gY29uZmlnLnJlcXVlc3RJZDtcbiAgICAgICAgbGV0IGNhbGxlck1hY2hpbmVJZCA9IGdldENhbGxlck1hY2hpbmVJZCgpO1xuICAgICAgICBsZXQgdHJ1c3QgPSBhd2FpdCBnZXRUcnVzdCgpO1xuICAgICAgICBsZXQgcmVxdWVzdHMgPSBhd2FpdCBnZXRSZXF1ZXN0cygpO1xuICAgICAgICBmb3IgKGxldCBpcCBvZiBhd2FpdCByZXF1ZXN0cy5nZXRLZXlzKCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHJlcXVlc3Qgb2YgYXdhaXQgcmVxdWVzdHMuZ2V0KGlwKSB8fCBbXSkge1xuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3RJZCAhPT0gcmVxdWVzdElkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQWRtaW4oY2FsbGVyTWFjaGluZUlkKSAmJiAhYXdhaXQgdHJ1c3QuZ2V0KGAke3JlcXVlc3QuYWNjb3VudH18JHtjYWxsZXJNYWNoaW5lSWR9YCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfQUNDRVNTX0RFTklFRH0gTWFjaGluZSAke2NhbGxlck1hY2hpbmVJZH0gaGFzIG5vIGFjY2VzcyB0byBhY2NvdW50ICR7SlNPTi5zdHJpbmdpZnkocmVxdWVzdC5hY2NvdW50KX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlY29yZDogVHJ1c3RSZWNvcmQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnQ6IHJlcXVlc3QuYWNjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgbWFjaGluZUlkOiByZXF1ZXN0Lm1hY2hpbmVJZCxcbiAgICAgICAgICAgICAgICAgICAgaXA6IHJlcXVlc3QuaXAsXG4gICAgICAgICAgICAgICAgICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0cnVzdC5zZXQoYCR7cmVxdWVzdC5hY2NvdW50fXwke3JlcXVlc3QubWFjaGluZUlkfWAsIHJlY29yZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGFjY2VzcyByZXF1ZXN0IGZvdW5kIHdpdGggaWQgJHtKU09OLnN0cmluZ2lmeShyZXF1ZXN0SWQpfS4gSXQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGdyYW50ZWQgb3IgZXhwaXJlZC5gKTtcbiAgICB9XG5cbiAgICAvKiogQWRtaW4gKHNvIG9ubHkgdGhpcyBtYWNoaW5lJ3Mgb3duIHByb2Nlc3NlcyBjYW4gY2FsbCBpdCk6IHRoZSBidWNrZXRzIHRoaXMgcHJvY2VzcyBoYXMgbG9hZGVkLiBBIGRlcGxveSBzdWNjZXNzb3IgYXNrcyBpdHMgcHJlZGVjZXNzb3IgZm9yIHRoaXMsIHNvIGl0IGFjdGl2YXRlcyBleGFjdGx5IHRoZSBidWNrZXRzIHRoYXQgYXJlIGluIHVzZSBpbnN0ZWFkIG9mIGV2ZXJ5IGJ1Y2tldCBvbiBkaXNrLiAqL1xuICAgIGFzeW5jIGFkbWluTGlzdEFjdGl2ZUJ1Y2tldHMoKTogUHJvbWlzZTx7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH1bXT4ge1xuICAgICAgICByZXR1cm4gZ2V0QWN0aXZlQnVja2V0S2V5cygpO1xuICAgIH1cbiAgICBhc3luYyBhZG1pbkxpc3RSZXF1ZXN0cyhjb25maWc6IHsgaXA6IHN0cmluZyB9KTogUHJvbWlzZTxBY2Nlc3NSZXF1ZXN0W10+IHtcbiAgICAgICAgbGV0IHJlcXVlc3RzID0gYXdhaXQgZ2V0UmVxdWVzdHMoKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlcXVlc3RzLmdldChjb25maWcuaXApIHx8IFtdO1xuICAgIH1cbiAgICBhc3luYyBhZG1pbkdyYW50QWNjZXNzKGNvbmZpZzogeyByZXF1ZXN0SWQ6IHN0cmluZyB9KTogUHJvbWlzZTxUcnVzdFJlY29yZD4ge1xuICAgICAgICBsZXQgcmVxdWVzdElkID0gY29uZmlnLnJlcXVlc3RJZDtcbiAgICAgICAgbGV0IHRydXN0ID0gYXdhaXQgZ2V0VHJ1c3QoKTtcbiAgICAgICAgbGV0IHJlcXVlc3RzID0gYXdhaXQgZ2V0UmVxdWVzdHMoKTtcbiAgICAgICAgZm9yIChsZXQgaXAgb2YgYXdhaXQgcmVxdWVzdHMuZ2V0S2V5cygpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByZXF1ZXN0IG9mIGF3YWl0IHJlcXVlc3RzLmdldChpcCkgfHwgW10pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0SWQgIT09IHJlcXVlc3RJZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHJlY29yZDogVHJ1c3RSZWNvcmQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnQ6IHJlcXVlc3QuYWNjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgbWFjaGluZUlkOiByZXF1ZXN0Lm1hY2hpbmVJZCxcbiAgICAgICAgICAgICAgICAgICAgaXA6IHJlcXVlc3QuaXAsXG4gICAgICAgICAgICAgICAgICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0cnVzdC5zZXQoYCR7cmVxdWVzdC5hY2NvdW50fXwke3JlcXVlc3QubWFjaGluZUlkfWAsIHJlY29yZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGFjY2VzcyByZXF1ZXN0IGZvdW5kIHdpdGggaWQgJHtKU09OLnN0cmluZ2lmeShyZXF1ZXN0SWQpfS4gSXQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGdyYW50ZWQgb3IgZXhwaXJlZC5gKTtcbiAgICB9XG5cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgQHRyYWNrQWNjZXNzQ2FsbChcImdldFwiKVxuICAgIGFzeW5jIGdldDIoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnOyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTsgaW50ZXJuYWw/OiBib29sZWFuOyBpbmNsdWRlVG9tYnN0b25lcz86IGJvb2xlYW4gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoY29uZmlnLnBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBsaXZlcyBvdXRzaWRlIGV2ZXJ5IHN0b3JlIGFuZCBldmVuIG91dHNpZGUgdGhlIGJ1Y2tldCAoaXQgaXMgd2hhdCBDUkVBVEVTIGl0KSwgc28gaXQgaXMgcmVhZCBzdHJhaWdodCBvZmYgdGhlIGRpc2sgLSBhYnNlbnQgbWVhbnMgdW5kZWZpbmVkLCBleGFjdGx5IGxpa2UgYW55IGZpbGUgcmVhZFxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGdldFJvdXRpbmdGaWxlUmVzdWx0KGNvbmZpZy5hY2NvdW50LCBjb25maWcuYnVja2V0TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5pbnRlcm5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlYWRCdWNrZXRJbnRlcm5hbChjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHdpdGhTdG9yZShjb25maWcsIHN0b3JlID0+IHN0b3JlLmdldDIoY29uZmlnKSk7XG4gICAgfVxuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBAdHJhY2tBY2Nlc3NDYWxsKFwic2V0XCIpXG4gICAgYXN5bmMgc2V0KGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBkYXRhOiBCdWZmZXI7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICAvLyBDb3BpZWQgYmVjYXVzZSB0aGUgd2lyZSBoYW5kcyB1cyBhIHBsYWluIFVpbnQ4QXJyYXkgdmlldywgbm90IGEgcmVhbCBCdWZmZXJcbiAgICAgICAgbGV0IGRhdGEgPSBCdWZmZXIuZnJvbShjb25maWcuZGF0YSk7XG4gICAgICAgIGlmIChjb25maWcucGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAvLyBUaGUgc3RvcmUgdGhlIGNhbGxlciBzZWxlY3RlZCBvd25zIHRoaXMgZmlsZTogaXQgYXBwbGllcyBpdCwgZW5mb3JjZXMgdGhlIHZlcnNpb24gcnVsZSwgYW5kIGl0cyBwZWVycyBwdWxsIGl0IGZyb20gdGhlcmVcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB3cml0ZVJvdXRpbmdDb25maWcoY29uZmlnLmFjY291bnQsIGNvbmZpZy5idWNrZXROYW1lLCBjb25maWcuc291cmNlQ29uZmlnLm5hbWUsIGRhdGEsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgd2l0aFN0b3JlKGNvbmZpZywgc3RvcmUgPT4gc3RvcmUuc2V0KHsgLi4uY29uZmlnLCBkYXRhIH0pKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIEB0cmFja0FjY2Vzc0NhbGwoXCJkZWxcIilcbiAgICBhc3luYyBkZWwoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGludGVybmFsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICAgICAgYXdhaXQgd2l0aFN0b3JlKGNvbmZpZywgc3RvcmUgPT4gc3RvcmUuZGVsKGNvbmZpZykpO1xuICAgIH1cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgQHRyYWNrQWNjZXNzQ2FsbChcIm1vdmVcIilcbiAgICBhc3luYyBtb3ZlKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgZnJvbVBhdGg6IHN0cmluZzsgdG9QYXRoOiBzdHJpbmc7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICAvLyBhc3NlcnRWYWxpZEFyZ3Mgb25seSBrbm93cyB0aGUgd2VsbC1rbm93biBgcGF0aGAgZmllbGQsIHNvIHRoZSB0d28gcGF0aHMgb2YgYSBtb3ZlIGFyZSB2YWxpZGF0ZWQgaGVyZVxuICAgICAgICBhc3NlcnRWYWxpZFBhdGgoY29uZmlnLmZyb21QYXRoKTtcbiAgICAgICAgYXNzZXJ0VmFsaWRQYXRoKGNvbmZpZy50b1BhdGgpO1xuICAgICAgICBhd2FpdCB3aXRoU3RvcmUoY29uZmlnLCBzdG9yZSA9PiBzdG9yZS5tb3ZlKGNvbmZpZykpO1xuICAgIH1cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgQHRyYWNrQWNjZXNzQ2FsbChcImdldEluZm9cIilcbiAgICBhc3luYyBnZXRJbmZvKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZzsgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuIH0pOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGlmIChjb25maWcucGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgZ2V0Um91dGluZ0ZpbGVSZXN1bHQoY29uZmlnLmFjY291bnQsIGNvbmZpZy5idWNrZXROYW1lKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgJiYgeyB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5zaXplIH0gfHwgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoU3RvcmUoY29uZmlnLCBzdG9yZSA9PiBzdG9yZS5nZXRJbmZvKGNvbmZpZykpO1xuICAgIH1cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgQHRyYWNrQWNjZXNzQ2FsbChcImZpbmRJbmZvXCIpXG4gICAgYXN5bmMgZmluZEluZm8oY29uZmlnOiBGaW5kQ29uZmlnICYgeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgcHJlZml4OiBzdHJpbmc7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoU3RvcmUoY29uZmlnLCBzdG9yZSA9PiBzdG9yZS5maW5kSW5mbyhjb25maWcpKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIEB0cmFja0FjY2Vzc0NhbGwoXCJnZXRDaGFuZ2VzQWZ0ZXJcIilcbiAgICBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWc7IHRpbWU6IG51bWJlcjsgcm91dGVzPzogW251bWJlciwgbnVtYmVyXVtdIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoU3RvcmUoY29uZmlnLCBzdG9yZSA9PiBzdG9yZS5nZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZykpO1xuICAgIH1cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgZ2V0QXJjaGl2ZXNDb25maWcoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgICAgIHJldHVybiBnZXRCdWNrZXRDb25maWcoYXdhaXQgcmVxdWlyZUJ1Y2tldChjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUpKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGxpc3RCdWNrZXRzKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmcgfSk6IFByb21pc2U8U2VydmVyQnVja2V0SW5mb1tdPiB7XG4gICAgICAgIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZGVidWdMaXN0QWNjb3VudEJ1Y2tldHMoY29uZmlnLmFjY291bnQpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgLy8gVGhlIGFjY2VzcyBob29rIChhbmQgdGhlIHN0b3JhZ2UgaXQgaW5pdGlhbGl6ZXMpIHJ1bnMgYmVmb3JlIHRoaXMsIHNvIGEgbGFyZ2UgZ2FwIGJldHdlZW4gdGhpcyBhbmQgdGhlIGNhbGxlcidzIHRpbWluZyBpcyB0aGUgaG9va1xuICAgICAgICAgICAgY29uc29sZS5sb2coYGxpc3RCdWNrZXRzKCR7Y29uZmlnLmFjY291bnR9KSBjYWxsIGJvZHkgdG9vayAke0RhdGUubm93KCkgLSBzdGFydH1tc2ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBUaGUgbGl2ZSwgaW4tbWVtb3J5IHN0YXRlIG9mIG9uZSBidWNrZXQsIG9yIGEgc3RyaW5nIHNheWluZyB3aHkgaXQgaXMgdW5hdmFpbGFibGUuIEFuc3dlcmVkIHdpdGhvdXQgdG91Y2hpbmcgdGhlIGRpc2ssIHNvIGl0IGlzIGNoZWFwIC0gYnV0IG9ubHkgd29ya3Mgd2hpbGUgdGhlIGJ1Y2tldCBpcyBsb2FkZWQgaGVyZS4gKi9cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgZ2V0QWN0aXZlQnVja2V0KGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9KTogUHJvbWlzZTxBY3RpdmVCdWNrZXRJbmZvIHwgc3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBkZWJ1Z0dldEFjdGl2ZUJ1Y2tldChjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICAvKiogTG9hZHMgYSBidWNrZXQgdGhhdCBleGlzdHMgb24gdGhpcyBzZXJ2ZXIgaW50byBtZW1vcnkgKHN0YXJ0aW5nIGl0cyBzeW5jaHJvbml6YXRpb24pIGFuZCByZXR1cm5zIGl0cyBsaXZlIHN0YXRlLCBvciBhIHN0cmluZyBzYXlpbmcgd2h5IGl0IGNvdWxkIG5vdCBiZSBsb2FkZWQuICovXG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGFjdGl2YXRlQnVja2V0KGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9KTogUHJvbWlzZTxBY3RpdmVCdWNrZXRJbmZvIHwgc3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBhY3RpdmF0ZUJ1Y2tldChjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICAvKiogWmVyb2VzIHRoZSB3cml0ZSBzdGF0aXN0aWNzIGxpc3RCdWNrZXRzIHJlcG9ydHMgYW5kIHRoZSBpbi1tZW1vcnkgYWNjZXNzIHN0YXRpc3RpY3MsIGZvciBldmVyeSBidWNrZXQgaW4gdGhlIGFjY291bnQuICovXG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGNsZWFyV3JpdGVTdGF0cyhjb25maWc6IHsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPHsgY2xlYXJlZEJ1Y2tldHM6IG51bWJlciB9PiB7XG4gICAgICAgIGNsZWFyQWNjb3VudEFjY2Vzc1N0YXRzKGNvbmZpZy5hY2NvdW50KTtcbiAgICAgICAgcmV0dXJuIHsgY2xlYXJlZEJ1Y2tldHM6IGRlYnVnQ2xlYXJBY2NvdW50V3JpdGVTdGF0cyhjb25maWcuYWNjb3VudCkgfTtcbiAgICB9XG4gICAgLyoqIEluLW1lbW9yeSB0b3RhbHMgcGVyIG9wZXJhdGlvbiB0eXBlIHNpbmNlIHN0YXJ0dXAgKG9yIHRoZSBsYXN0IGNsZWFyV3JpdGVTdGF0cykuICovXG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGdldEFjY2Vzc1N0YXRzKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmcgfSk6IFByb21pc2U8QWNjZXNzVG90YWxzPiB7XG4gICAgICAgIHJldHVybiBnZXRBY2Nlc3NUb3RhbHMoY29uZmlnLmFjY291bnQpO1xuICAgIH1cbiAgICAvKiogQSBwYXRoIGJyZWFrZG93biBvZiBvbmUgb3BlcmF0aW9uJ3MgYWNjZXNzZXMgKG9wZXJhdGlvbiBuYW1lcyBjb21lIGZyb20gZ2V0QWNjZXNzU3RhdHMpLiBtYXhDb3VudCBpcyBwYXNzZWQgc3RyYWlnaHQgdG8gVHJlZVN1bW1hcnkuZ2V0U3VtbWFyaWVzLiB3ZWlnaHRCeVNpemUgaXMgaWdub3JlZCBmb3IgY291bnQtb25seSBvcGVyYXRpb25zLCB3aGljaCByZXR1cm4gdGhlaXIgY291bnQgYnJlYWtkb3duLiAqL1xuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBhc3luYyBnZXRBY2Nlc3NTdW1tYXJpZXMoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgb3BlcmF0aW9uOiBzdHJpbmc7IG1heENvdW50OiBudW1iZXI7IHdlaWdodEJ5U2l6ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8U3VtbWFyeUVudHJ5PEFjY2Vzc1N1bW1hcnlTdGF0ZT5bXT4ge1xuICAgICAgICByZXR1cm4gcmVhZEFjY2Vzc1N1bW1hcmllcyhjb25maWcpO1xuICAgIH1cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgZ2V0SW5kZXhJbmZvKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9KTogUHJvbWlzZTx7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlcjsgc291cmNlczogeyBkZWJ1Z05hbWU6IHN0cmluZzsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH1bXSB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBkZWJ1Z0J1Y2tldEluZGV4VG90YWxzKGF3YWl0IHJlcXVpcmVCdWNrZXQoY29uZmlnLmFjY291bnQsIGNvbmZpZy5idWNrZXROYW1lKSk7XG4gICAgfVxuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBhc3luYyBnZXRTeW5jU3RhdHVzKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9KTogUHJvbWlzZTxBcmNoaXZlc1N5bmNTdGF0dXM+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1Y2tldFN5bmNTdGF0dXMoYXdhaXQgcmVxdWlyZUJ1Y2tldChjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUpKTtcbiAgICB9XG5cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgc3RhcnRMYXJnZUZpbGUoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjsgbm9DaGVja3M/OiBib29sZWFuOyBpbnRlcm5hbD86IGJvb2xlYW4gfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICAgICAgbGV0IHN0b3JlID0gZmluZEJ1Y2tldFN0b3JlKGNvbmZpZy5hY2NvdW50LCBjb25maWcuYnVja2V0TmFtZSwgY29uZmlnLnNvdXJjZUNvbmZpZyk7XG4gICAgICAgIC8vIFRoZSBzdG9yZSB2YWxpZGF0ZXMgdGhlIHdyaXRlIGhlcmUsIGJlZm9yZSBhbnkgYnl0ZXMgbW92ZSAoc2VlIEJsb2JTdG9yZS5zdGFydExhcmdlVXBsb2FkKSAtIGEgbGFyZ2UgZmlsZSBpcyBhIHNldCwgYW5kIGl0cyBTZXRDb25maWcgZGVjaWRlcyB3aGV0aGVyIGl0IGlzIGV2ZW4gYWxsb3dlZFxuICAgICAgICBsZXQgd3JpdGUgPSB7IHBhdGg6IGNvbmZpZy5wYXRoLCBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIGZvcmNlU2V0SW1tdXRhYmxlOiBjb25maWcuZm9yY2VTZXRJbW11dGFibGUsIG5vQ2hlY2tzOiBjb25maWcubm9DaGVja3MsIGludGVybmFsOiBjb25maWcuaW50ZXJuYWwgfTtcbiAgICAgICAgbGV0IGlkID0gYXdhaXQgc3RvcmUuc3RhcnRMYXJnZVVwbG9hZCh3cml0ZSk7XG4gICAgICAgIC8vIFRoZSBzdG9yZSBuYW1lIHBpbnMgdGhlIHVwbG9hZCdzIHBhcnRzIGFuZCBmaW5pc2ggdG8gdGhlIHNhbWUgc3RvcmUgdGhlIHN0YXJ0IHBpY2tlZCAoaW4tZmxpZ2h0IHVwbG9hZHMgc3Vydml2ZSBhIGJ1Y2tldCByZWJ1aWxkOiB0aGUgcGFydCBkYXRhIGxpdmVzIGluIHRoYXQgc3RvcmUncyBmb2xkZXIsIHdoaWNoIGEgcmVidWlsdCBzdG9yZSBzdGlsbCBvcGVucylcbiAgICAgICAgbGFyZ2VVcGxvYWRJbmZvLnNldChpZCwgeyAuLi53cml0ZSwgYWNjb3VudDogY29uZmlnLmFjY291bnQsIGJ1Y2tldE5hbWU6IGNvbmZpZy5idWNrZXROYW1lLCBzdG9yZU5hbWU6IGNvbmZpZy5zb3VyY2VDb25maWcubmFtZSB9KTtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgICBhc3luYyB1cGxvYWRQYXJ0KGNvbmZpZzogeyB1cGxvYWRJZDogc3RyaW5nOyBkYXRhOiBCdWZmZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhc3NlcnRXcml0ZXNBbGxvd2VkKCk7XG4gICAgICAgIGxldCBpbmZvID0gbGFyZ2VVcGxvYWRJbmZvLmdldChjb25maWcudXBsb2FkSWQpO1xuICAgICAgICBpZiAoIWluZm8pIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBsYXJnZSB1cGxvYWQgJHtjb25maWcudXBsb2FkSWR9YCk7XG4gICAgICAgIHRyYWNrQWNjZXNzKHsgYWNjb3VudDogaW5mby5hY2NvdW50LCBvcGVyYXRpb246IFwidXBsb2FkUGFydFwiLCBwYXRoOiBgJHtpbmZvLmJ1Y2tldE5hbWV9LyR7aW5mby5wYXRofWAsIHNpemU6IGNvbmZpZy5kYXRhLmxlbmd0aCB9KTtcbiAgICAgICAgYXdhaXQgZ2V0U3RvcmUoaW5mby5hY2NvdW50LCBpbmZvLmJ1Y2tldE5hbWUsIGluZm8uc3RvcmVOYW1lKS5hcHBlbmRMYXJnZVVwbG9hZCh7IGlkOiBjb25maWcudXBsb2FkSWQsIGRhdGE6IEJ1ZmZlci5mcm9tKGNvbmZpZy5kYXRhKSB9KTtcbiAgICB9XG4gICAgYXN5bmMgZmluaXNoTGFyZ2VGaWxlKGNvbmZpZzogeyB1cGxvYWRJZDogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICBsZXQgaW5mbyA9IGxhcmdlVXBsb2FkSW5mby5nZXQoY29uZmlnLnVwbG9hZElkKTtcbiAgICAgICAgaWYgKCFpbmZvKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbGFyZ2UgdXBsb2FkICR7Y29uZmlnLnVwbG9hZElkfWApO1xuICAgICAgICBsYXJnZVVwbG9hZEluZm8uZGVsZXRlKGNvbmZpZy51cGxvYWRJZCk7XG4gICAgICAgIGF3YWl0IGdldFN0b3JlKGluZm8uYWNjb3VudCwgaW5mby5idWNrZXROYW1lLCBpbmZvLnN0b3JlTmFtZSkuZmluaXNoTGFyZ2VVcGxvYWQoeyBpZDogY29uZmlnLnVwbG9hZElkLCBwYXRoOiBpbmZvLnBhdGgsIGxhc3RNb2RpZmllZDogaW5mby5sYXN0TW9kaWZpZWQsIGZvcmNlU2V0SW1tdXRhYmxlOiBpbmZvLmZvcmNlU2V0SW1tdXRhYmxlLCBub0NoZWNrczogaW5mby5ub0NoZWNrcywgaW50ZXJuYWw6IGluZm8uaW50ZXJuYWwgfSk7XG4gICAgfVxuICAgIC8qKiBCZXN0LWVmZm9ydCBjbGVhbnVwOiBhbiB1bmtub3duIHVwbG9hZCBoYXMgbm90aGluZyBsZWZ0IHRvIGNhbmNlbC4gKi9cbiAgICBhc3luYyBjYW5jZWxMYXJnZUZpbGUoY29uZmlnOiB7IHVwbG9hZElkOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgaW5mbyA9IGxhcmdlVXBsb2FkSW5mby5nZXQoY29uZmlnLnVwbG9hZElkKTtcbiAgICAgICAgaWYgKCFpbmZvKSByZXR1cm47XG4gICAgICAgIGxhcmdlVXBsb2FkSW5mby5kZWxldGUoY29uZmlnLnVwbG9hZElkKTtcbiAgICAgICAgYXdhaXQgZ2V0U3RvcmUoaW5mby5hY2NvdW50LCBpbmZvLmJ1Y2tldE5hbWUsIGluZm8uc3RvcmVOYW1lKS5jYW5jZWxMYXJnZVVwbG9hZCh7IGlkOiBjb25maWcudXBsb2FkSWQgfSk7XG4gICAgfVxuXG4gICAgLy8gSU1QT1JUQU5UOiBXZSBjYW4gbmV2ZXIgZXhwb3NlIGVudW1lcmF0aW9uIChsaXN0aW5nLCBwcmVmaXggc2VhcmNoLCBjaGFuZ2VzIGZlZWRzKSBvdmVyIHRoaXMgcHVibGljIEhUVFAgZW5kcG9pbnQgLSBvbmx5IGV4YWN0LWtleSByZWFkcy4gRW51bWVyYXRpb24gd291bGQgYmUgYSBtYXNzaXZlIHNlY3VyaXR5IHJpc2sgKHB1YmxpYyBidWNrZXRzIHJlbHkgb24gdW5ndWVzc2FibGUga2V5cyBzdGF5aW5nIHVuZ3Vlc3NhYmxlKSwgYW5kIGNvdWxkIGFsc28gY3Jhc2ggdGhlIGNsaWVudCBieSBzZW5kaW5nIHRoZW0gdG9vIG11Y2ggZGF0YS4gTGlzdGluZ3MgZXhpc3Qgb25seSBvbiB0aGUgYXV0aGVudGljYXRlZCBBUEkgKGZpbmRJbmZvIGV0YywgYmVoaW5kIGFjY291bnRBY2Nlc3MpLlxuICAgIGFzeW5jIGh0dHBFbnRyeShjb25maWc/OiB7IHJlcXVpcmVDYWxscz86IHN0cmluZ1tdOyBjYWNoZVRpbWU/OiBudW1iZXIgfSk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgICAgIGxldCBjYWxsZXIgPSBTb2NrZXRGdW5jdGlvbi5nZXRDYWxsZXIoKTtcbiAgICAgICAgbGV0IHJlcXVlc3QgPSBnZXRDdXJyZW50SFRUUFJlcXVlc3QoKTtcbiAgICAgICAgbGV0IHBhdGhuYW1lID0gbmV3IFVSTChyZXF1ZXN0Py51cmwgfHwgXCIvXCIsIFwiaHR0cHM6Ly9sb2NhbGhvc3RcIikucGF0aG5hbWU7XG4gICAgICAgIGlmICghcGF0aG5hbWUuc3RhcnRzV2l0aChcIi9maWxlL1wiKSkge1xuICAgICAgICAgICAgbGV0IGh0bWwgPSBhd2FpdCBwZXJmb3JtTG9jYWxDYWxsKHtcbiAgICAgICAgICAgICAgICBjYWxsZXIsXG4gICAgICAgICAgICAgICAgY2FsbDogeyBub2RlSWQ6IGNhbGxlci5ub2RlSWQsIGNsYXNzR3VpZDogUmVxdWlyZUNvbnRyb2xsZXIuX2NsYXNzR3VpZCwgZnVuY3Rpb25OYW1lOiBcInJlcXVpcmVIVE1MXCIsIGFyZ3M6IFtjb25maWddIH0sXG4gICAgICAgICAgICB9KSBhcyBCdWZmZXI7XG4gICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMgdGhlIGFjY2VzcyBwYWdlIGlzIHNlcnZlZCB3aXRoIG5vIGNvbnRlbnQgdHlwZSwgYW5kIGEgYnJvd3NlciB0aGF0IGlzIHRvbGQgbm90IHRvIHNuaWZmIHNpbXBseSB3aWxsIG5vdCByZW5kZXIgaXRcbiAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhodG1sLCB7IFwiQ29udGVudC1UeXBlXCI6IFwidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04XCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhcnRzID0gcGF0aG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcih4ID0+IHgpLm1hcChkZWNvZGVVUklDb21wb25lbnQpO1xuICAgICAgICBsZXQgYWNjb3VudCA9IHBhcnRzWzFdO1xuICAgICAgICBsZXQgYnVja2V0TmFtZSA9IHBhcnRzWzJdO1xuICAgICAgICBsZXQgZmlsZVBhdGggPSBwYXJ0cy5zbGljZSgzKS5qb2luKFwiL1wiKTtcbiAgICAgICAgaWYgKCFhY2NvdW50IHx8ICFidWNrZXROYW1lIHx8ICFmaWxlUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHNldEhUVFBSZXN1bHRIZWFkZXJzKEJ1ZmZlci5mcm9tKFwiXCIpLCB7IHN0YXR1czogXCI0MDRcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRWYWxpZE5hbWUoYWNjb3VudCwgXCJhY2NvdW50XCIpO1xuICAgICAgICBhc3NlcnRWYWxpZE5hbWUoYnVja2V0TmFtZSwgXCJidWNrZXQgbmFtZVwiKTtcbiAgICAgICAgYXNzZXJ0VmFsaWRQYXRoKGZpbGVQYXRoKTtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IGdldExvYWRlZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhCdWZmZXIuZnJvbShcIlwiKSwgeyBzdGF0dXM6IFwiNDA0XCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFidWNrZXQuc2VsZj8ucHVibGljKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gaXMgbm90IHB1YmxpYywgc28gaXRzIGZpbGVzIGNhbm5vdCBiZSByZWFkIG92ZXIgcGxhaW4gVVJMc2ApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFub255bW91cyBVUkwgcmVhZHMgY2Fycnkgbm8gc291cmNlIHNlbGVjdGlvbiAtIHRoZSBmaWxlJ3Mgcm91dGUgcGlja3MgdGhlIHN0b3JlLCBhbmQgYSByb3V0ZSBubyBzdG9yZSBoZXJlIGNvdmVycyBpcyBzaW1wbHkgbm90IGZvdW5kICh0aGUgcm91dGluZyBmaWxlIGl0c2VsZiBsaXZlcyBvdXRzaWRlIGV2ZXJ5IHN0b3JlKVxuICAgICAgICBsZXQgaHR0cFN0b3JlOiBMb2FkZWRTdG9yZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGluZm86IHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZmlsZVBhdGggIT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUoZmlsZVBhdGgpO1xuICAgICAgICAgICAgaHR0cFN0b3JlID0gYnVja2V0LnN0b3Jlcy5maW5kKHMgPT4gcy5lbnRyaWVzLnNvbWUoZSA9PiByb3V0ZUNvbnRhaW5zKGUucm91dGUsIHJvdXRlKSkpO1xuICAgICAgICAgICAgaW5mbyA9IGh0dHBTdG9yZSAmJiBhd2FpdCBodHRwU3RvcmUuc3RvcmUuZ2V0SW5mbyh7IHBhdGg6IGZpbGVQYXRoIH0pIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluZm8gPSBhd2FpdCBnZXRSb3V0aW5nRmlsZVJlc3VsdChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWluZm8gfHwgIWluZm8uc2l6ZSkge1xuICAgICAgICAgICAgdHJhY2tBY2Nlc3MoeyBhY2NvdW50LCBvcGVyYXRpb246IFwiaHR0cEdldFwiLCBwYXRoOiBgJHtidWNrZXROYW1lfS8ke2ZpbGVQYXRofWAsIHNpemU6IDAgfSk7XG4gICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMoQnVmZmVyLmZyb20oXCJcIiksIHsgc3RhdHVzOiBcIjQwNFwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBleHQgPSBmaWxlUGF0aC5zcGxpdChcIi5cIikucG9wKCkgfHwgXCJcIjtcbiAgICAgICAgbGV0IGhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBDT05URU5UX1RZUEVTW2V4dC50b0xvd2VyQ2FzZSgpXSB8fCBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICAgICAgICAgICAgXCJMYXN0LU1vZGlmaWVkXCI6IG5ldyBEYXRlKGluZm8ud3JpdGVUaW1lKS50b1VUQ1N0cmluZygpLFxuICAgICAgICAgICAgXCJBY2NlcHQtUmFuZ2VzXCI6IFwiYnl0ZXNcIixcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGJ1Y2tldC5zZWxmPy5pbW11dGFibGUpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJDYWNoZS1Db250cm9sXCJdID0gYG1heC1hZ2U9JHtJTU1VVEFCTEVfQ0FDSEVfVElNRSAvIDEwMDB9YDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaWZNb2RpZmllZFNpbmNlID0gcmVxdWVzdD8uaGVhZGVyc1tcImlmLW1vZGlmaWVkLXNpbmNlXCJdO1xuICAgICAgICBpZiAodHlwZW9mIGlmTW9kaWZpZWRTaW5jZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IHNpbmNlID0gbmV3IERhdGUoaWZNb2RpZmllZFNpbmNlKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICBpZiAoc2luY2UgJiYgTWF0aC5mbG9vcihpbmZvLndyaXRlVGltZSAvIDEwMDApICogMTAwMCA8PSBzaW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhCdWZmZXIuZnJvbShcIlwiKSwgeyAuLi5oZWFkZXJzLCBzdGF0dXM6IFwiMzA0XCIgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCByYW5nZUhlYWRlciA9IHJlcXVlc3Q/LmhlYWRlcnNbXCJyYW5nZVwiXTtcbiAgICAgICAgaWYgKHR5cGVvZiByYW5nZUhlYWRlciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IG1hdGNoID0gL15ieXRlcz0oXFxkKiktKFxcZCopJC8uZXhlYyhyYW5nZUhlYWRlci50cmltKCkpO1xuICAgICAgICAgICAgaWYgKG1hdGNoICYmIChtYXRjaFsxXSB8fCBtYXRjaFsyXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnQ6IG51bWJlcjtcbiAgICAgICAgICAgICAgICBsZXQgZW5kSW5jbHVzaXZlID0gaW5mby5zaXplIC0gMTtcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoMCwgaW5mby5zaXplIC0gK21hdGNoWzJdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdGFydCA9ICttYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRJbmNsdXNpdmUgPSBNYXRoLm1pbigrbWF0Y2hbMl0sIGluZm8uc2l6ZSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzdGFydCA+PSBpbmZvLnNpemUgfHwgc3RhcnQgPiBlbmRJbmNsdXNpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEhUVFBSZXN1bHRIZWFkZXJzKEJ1ZmZlci5mcm9tKFwiXCIpLCB7IC4uLmhlYWRlcnMsIFwiQ29udGVudC1SYW5nZVwiOiBgYnl0ZXMgKi8ke2luZm8uc2l6ZX1gLCBzdGF0dXM6IFwiNDE2XCIgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJhbmdlID0geyBzdGFydCwgZW5kOiBlbmRJbmNsdXNpdmUgKyAxIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdDogeyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGh0dHBTdG9yZSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgaHR0cFN0b3JlLnN0b3JlLmdldDIoeyBwYXRoOiBmaWxlUGF0aCwgcmFuZ2UgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBnZXRSb3V0aW5nRmlsZVJlc3VsdChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgcmFuZ2UpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7IC4uLnJlc3VsdCwgZGF0YTogcmVzdWx0LmRhdGEuc3ViYXJyYXkoTWF0aC5taW4ocmFuZ2Uuc3RhcnQsIHJlc3VsdC5kYXRhLmxlbmd0aCksIE1hdGgubWluKHJhbmdlLmVuZCwgcmVzdWx0LmRhdGEubGVuZ3RoKSkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cmFja0FjY2Vzcyh7IGFjY291bnQsIG9wZXJhdGlvbjogXCJodHRwR2V0XCIsIHBhdGg6IGAke2J1Y2tldE5hbWV9LyR7ZmlsZVBhdGh9YCwgc2l6ZTogcmVzdWx0ICYmIHJlc3VsdC5kYXRhLmxlbmd0aCB8fCAwIH0pO1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHNldEhUVFBSZXN1bHRIZWFkZXJzKEJ1ZmZlci5mcm9tKFwiXCIpLCB7IHN0YXR1czogXCI0MDRcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhyZXN1bHQuZGF0YSwgeyAuLi5oZWFkZXJzLCBcIkNvbnRlbnQtUmFuZ2VcIjogYGJ5dGVzICR7cmFuZ2Uuc3RhcnR9LSR7cmFuZ2UuZW5kIC0gMX0vJHtpbmZvLnNpemV9YCwgc3RhdHVzOiBcIjIwNlwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhyZXN1bHQuZGF0YSwgaGVhZGVycyk7XG4gICAgfVxufVxuXG4vKiogVGhlIG9uZSByZXNvbHV0aW9uIGV2ZXJ5IGRhdGEgY2FsbCBkb2VzOiB0aGUgY2xpZW50J3Mgc2VsZWN0ZWQgc291cmNlQ29uZmlnIE5BTUVTIGV4YWN0bHkgb25lIHN0b3JlIChjcmVhdGVkIG9uIGZpcnN0IHVzZSksIGFuZCBmbiBydW5zIG9uIGl0LiAqL1xuYXN5bmMgZnVuY3Rpb24gd2l0aFN0b3JlPFQ+KGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWcgfSwgZm46IChzdG9yZTogQmxvYlN0b3JlKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKGZpbmRCdWNrZXRTdG9yZShjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUsIGNvbmZpZy5zb3VyY2VDb25maWcpKTtcbn1cblxuY29uc3QgbGFyZ2VVcGxvYWRJbmZvID0gbmV3IE1hcDxzdHJpbmcsIHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBmb3JjZVNldEltbXV0YWJsZT86IGJvb2xlYW47IG5vQ2hlY2tzPzogYm9vbGVhbjsgaW50ZXJuYWw/OiBib29sZWFuOyBzdG9yZU5hbWU6IHN0cmluZyB9PigpO1xuXG5jb25zdCBhY2NvdW50QWNjZXNzOiBTb2NrZXRGdW5jdGlvbkhvb2sgPSBhc3luYyAoY29udGV4dCkgPT4ge1xuICAgIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgbGV0IGNvbmZpZyA9IGNvbnRleHQuY2FsbC5hcmdzWzBdIGFzIHsgYWNjb3VudD86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgIGF3YWl0IHJlcXVpcmVBY2Nlc3MoU3RyaW5nKGNvbmZpZz8uYWNjb3VudCkpO1xuICAgIGxldCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydDtcbiAgICBpZiAoZHVyYXRpb24gPiBBQ0NFU1NfQ0hFQ0tfU0xPV19USU1FKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBBY2Nlc3MgY2hlY2sgZm9yICR7Y29udGV4dC5jYWxsLmZ1bmN0aW9uTmFtZX0gdG9vayAke2R1cmF0aW9ufW1zYCk7XG4gICAgfVxufTtcbmNvbnN0IHVwbG9hZEFjY2VzczogU29ja2V0RnVuY3Rpb25Ib29rID0gYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICBsZXQgY29uZmlnID0gY29udGV4dC5jYWxsLmFyZ3NbMF0gYXMgeyB1cGxvYWRJZD86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgIGxldCBpbmZvID0gbGFyZ2VVcGxvYWRJbmZvLmdldChTdHJpbmcoY29uZmlnPy51cGxvYWRJZCkpO1xuICAgIGlmICghaW5mbykgcmV0dXJuO1xuICAgIGF3YWl0IHJlcXVpcmVBY2Nlc3MoaW5mby5hY2NvdW50KTtcbn07XG5jb25zdCBhZG1pbkFjY2VzczogU29ja2V0RnVuY3Rpb25Ib29rID0gYXN5bmMgKCkgPT4ge1xuICAgIHJlcXVpcmVBZG1pbigpO1xufTtcblxuZXhwb3J0IGNvbnN0IFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyID0gU29ja2V0RnVuY3Rpb24ucmVnaXN0ZXIoXG4gICAgUkVNT1RFX1NUT1JBR0VfQ0xBU1NfR1VJRCxcbiAgICBuZXcgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXJCYXNlKCksXG4gICAgKCkgPT4gKHtcbiAgICAgICAgcGluZzoge30sXG4gICAgICAgIGF1dGhlbnRpY2F0ZToge30sXG4gICAgICAgIHJlcXVlc3RBY2Nlc3M6IHt9LFxuICAgICAgICBnZXRBY2Nlc3NTdGF0ZToge30sXG4gICAgICAgIGxpc3RSZXF1ZXN0c0ZvcklQOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ3JhbnRBY2Nlc3M6IHt9LFxuICAgICAgICBhZG1pbkxpc3RSZXF1ZXN0czogeyBob29rczogW2FkbWluQWNjZXNzXSB9LFxuICAgICAgICBhZG1pbkxpc3RBY3RpdmVCdWNrZXRzOiB7IGhvb2tzOiBbYWRtaW5BY2Nlc3NdIH0sXG4gICAgICAgIGFkbWluR3JhbnRBY2Nlc3M6IHsgaG9va3M6IFthZG1pbkFjY2Vzc10gfSxcbiAgICAgICAgZ2V0MjogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIHNldDogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGRlbDogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIG1vdmU6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXRJbmZvOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZmluZEluZm86IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXRDaGFuZ2VzQWZ0ZXIyOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0QXJjaGl2ZXNDb25maWc6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXRJbmRleEluZm86IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBsaXN0QnVja2V0czogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGdldEFjdGl2ZUJ1Y2tldDogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGFjdGl2YXRlQnVja2V0OiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgY2xlYXJXcml0ZVN0YXRzOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0QWNjZXNzU3RhdHM6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXRBY2Nlc3NTdW1tYXJpZXM6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXRTeW5jU3RhdHVzOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgc3RhcnRMYXJnZUZpbGU6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICB1cGxvYWRQYXJ0OiB7IGhvb2tzOiBbdXBsb2FkQWNjZXNzXSB9LFxuICAgICAgICBmaW5pc2hMYXJnZUZpbGU6IHsgaG9va3M6IFt1cGxvYWRBY2Nlc3NdIH0sXG4gICAgICAgIGNhbmNlbExhcmdlRmlsZTogeyBob29rczogW3VwbG9hZEFjY2Vzc10gfSxcbiAgICAgICAgaHR0cEVudHJ5OiB7fSxcbiAgICB9KSxcbiAgICAoKSA9PiAoe1xuICAgICAgICBub0NsaWVudEhvb2tzOiB0cnVlLFxuICAgICAgICBub0RlZmF1bHRIb29rczogdHJ1ZSxcbiAgICB9KVxuKTtcbiJdfQ==
582
+ /* _JS_SOURCE_HASH = "13e53221565b501cc7ee17f58dd08791b1c3e877a4019ae40bac6f0ec2037357"; */