velocious 1.0.408 → 1.0.410
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.
- package/README.md +18 -1
- package/build/src/background-jobs/worker.d.ts +44 -11
- package/build/src/background-jobs/worker.d.ts.map +1 -1
- package/build/src/background-jobs/worker.js +90 -25
- package/build/src/cli/commands/db/tenants/migrate.d.ts.map +1 -1
- package/build/src/cli/commands/db/tenants/migrate.js +3 -2
- package/build/src/configuration-types.d.ts +3 -2
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +2 -2
- package/build/src/database/migrator.d.ts +4 -2
- package/build/src/database/migrator.d.ts.map +1 -1
- package/build/src/database/migrator.js +11 -2
- package/build/src/database/pool/async-tracked-multi-connection.d.ts +16 -0
- package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
- package/build/src/database/pool/async-tracked-multi-connection.js +47 -5
- package/build/src/database/table-data/table-column.d.ts.map +1 -1
- package/build/src/database/table-data/table-column.js +5 -2
- package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.js +9 -1
- package/build/src/environment-handlers/node/cli/commands/background-jobs-worker.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/background-jobs-worker.js +24 -2
- package/build/src/frontend-models/base.d.ts +15 -12
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +96 -27
- package/build/src/frontend-models/query.d.ts +55 -3
- package/build/src/frontend-models/query.d.ts.map +1 -1
- package/build/src/frontend-models/query.js +157 -14
- package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-destroyed-event.js +19 -10
- package/build/src/frontend-models/use-model-class-event.d.ts +1 -1
- package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-model-class-event.js +26 -17
- package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-updated-event.js +16 -7
- package/build/src/frontend-models/websocket-channel.d.ts +46 -6
- package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-channel.js +163 -19
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +3 -4
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -1
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +12 -8
- package/package.json +6 -3
|
@@ -37,6 +37,22 @@ export default class VelociousDatabasePoolAsyncTrackedMultiConnection extends Ba
|
|
|
37
37
|
pendingCheckoutDrainPromise = undefined;
|
|
38
38
|
/** @type {ReturnType<typeof setTimeout> | undefined} */
|
|
39
39
|
idleConnectionReaperTimer = undefined;
|
|
40
|
+
/**
|
|
41
|
+
* In-flight connection-close promises. The idle reaper is armed on check-in
|
|
42
|
+
* and runs fire-and-forget when its timer fires, so a scheduled reap can be
|
|
43
|
+
* closing a connection while an explicit `reapIdleConnections()` (or
|
|
44
|
+
* `clearIdleConnectionReaperTimer()`) runs. Tracking the in-flight closes lets
|
|
45
|
+
* those callers await them, so once a reap resolves the connections it
|
|
46
|
+
* expired are fully closed instead of half-closed mid-`close()`.
|
|
47
|
+
* @type {Set<Promise<void>>}
|
|
48
|
+
*/
|
|
49
|
+
inflightConnectionCloses = new Set();
|
|
50
|
+
/**
|
|
51
|
+
* In-flight close promise per connection, so concurrent closes of the same
|
|
52
|
+
* connection await the same close rather than closing the driver handle twice.
|
|
53
|
+
* @type {WeakMap<object, Promise<void>>}
|
|
54
|
+
*/
|
|
55
|
+
connectionClosePromises = new WeakMap();
|
|
40
56
|
idSeq = 0;
|
|
41
57
|
/**
|
|
42
58
|
* @param {object} args - Options object.
|
|
@@ -447,6 +463,14 @@ export default class VelociousDatabasePoolAsyncTrackedMultiConnection extends Ba
|
|
|
447
463
|
for (const connection of expiredConnections) {
|
|
448
464
|
await this.closeConnection(connection);
|
|
449
465
|
}
|
|
466
|
+
// A concurrent fire-and-forget scheduled reap may already be closing
|
|
467
|
+
// connections this call did not expire itself (it may have removed them from
|
|
468
|
+
// `this.connections` first). Await those in-flight closes too so a caller
|
|
469
|
+
// that awaits `reapIdleConnections()` is guaranteed the pool's idle
|
|
470
|
+
// connections are fully closed, not mid-`close()`.
|
|
471
|
+
if (this.inflightConnectionCloses.size > 0) {
|
|
472
|
+
await Promise.allSettled([...this.inflightConnectionCloses]);
|
|
473
|
+
}
|
|
450
474
|
if (this.connections.length > 0) {
|
|
451
475
|
this.scheduleIdleConnectionReaper();
|
|
452
476
|
}
|
|
@@ -480,14 +504,32 @@ export default class VelociousDatabasePoolAsyncTrackedMultiConnection extends Ba
|
|
|
480
504
|
* @returns {Promise<void>} - Resolves when complete.
|
|
481
505
|
*/
|
|
482
506
|
async closeConnection(connection) {
|
|
507
|
+
// Idempotent: a fire-and-forget scheduled reap and an explicit reap can both
|
|
508
|
+
// target the same connection. Await the in-flight close instead of closing
|
|
509
|
+
// twice (which can throw on the driver) or returning while the underlying
|
|
510
|
+
// handle is still open.
|
|
511
|
+
const existingClose = this.connectionClosePromises.get(connection);
|
|
512
|
+
if (existingClose) {
|
|
513
|
+
return await existingClose;
|
|
514
|
+
}
|
|
483
515
|
const trackedConnection = /** @type {import("../drivers/base.js").default & {[CLOSED_CONNECTION]?: boolean, [IDLE_CONNECTION_CHECKED_IN_AT]?: number}} */ (connection);
|
|
484
516
|
trackedConnection[CLOSED_CONNECTION] = true;
|
|
485
517
|
delete trackedConnection[IDLE_CONNECTION_CHECKED_IN_AT];
|
|
486
|
-
|
|
487
|
-
|
|
518
|
+
const closePromise = (async () => {
|
|
519
|
+
if (typeof trackedConnection.close === "function") {
|
|
520
|
+
await trackedConnection.close();
|
|
521
|
+
}
|
|
522
|
+
else if (typeof trackedConnection.disconnect === "function") {
|
|
523
|
+
await trackedConnection.disconnect();
|
|
524
|
+
}
|
|
525
|
+
})();
|
|
526
|
+
this.connectionClosePromises.set(connection, closePromise);
|
|
527
|
+
this.inflightConnectionCloses.add(closePromise);
|
|
528
|
+
try {
|
|
529
|
+
await closePromise;
|
|
488
530
|
}
|
|
489
|
-
|
|
490
|
-
|
|
531
|
+
finally {
|
|
532
|
+
this.inflightConnectionCloses.delete(closePromise);
|
|
491
533
|
}
|
|
492
534
|
}
|
|
493
535
|
/** @returns {void} */
|
|
@@ -558,4 +600,4 @@ export default class VelociousDatabasePoolAsyncTrackedMultiConnection extends Ba
|
|
|
558
600
|
this.globalConnections.delete(configuration);
|
|
559
601
|
}
|
|
560
602
|
}
|
|
561
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtdHJhY2tlZC1tdWx0aS1jb25uZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3Bvb2wvYXN5bmMtdHJhY2tlZC1tdWx0aS1jb25uZWN0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDN0MsT0FBTyxRQUFRLEVBQUUsRUFBQyxzQkFBc0IsRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUUxRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtBQUNwRSxNQUFNLDZCQUE2QixHQUFHLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFBO0FBQ2xGLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxDQUFBO0FBRXhDOzs7Ozs7R0FNRztBQUVILE1BQU0sQ0FBQyxPQUFPLE9BQU8sZ0RBQWlELFNBQVEsUUFBUTtJQUNwRjs7O09BR0c7SUFDSCxNQUFNLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtJQUV4QyxpQkFBaUIsR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUE7SUFFM0M7Ozs7O09BS0c7SUFDSCxxQkFBcUIsR0FBRyxTQUFTLENBQUE7SUFFakMscURBQXFEO0lBQ3JELFdBQVcsR0FBRyxFQUFFLENBQUE7SUFFaEIsbUVBQW1FO0lBQ25FLGdCQUFnQixHQUFHLEVBQUUsQ0FBQTtJQUVyQixnQ0FBZ0M7SUFDaEMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFBO0lBRXJCLHFCQUFxQjtJQUNyQix1QkFBdUIsR0FBRyxDQUFDLENBQUE7SUFFM0Isd0NBQXdDO0lBQ3hDLDJCQUEyQixHQUFHLFNBQVMsQ0FBQTtJQUV2Qyx3REFBd0Q7SUFDeEQseUJBQXlCLEdBQUcsU0FBUyxDQUFBO0lBRXJDLEtBQUssR0FBRyxDQUFDLENBQUE7SUFFVDs7OztP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TTtRQUNSLENBQUM7UUFFRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxXQUFXLElBQUksRUFBRSxDQUFDLENBQUE7SUFDOUQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsc0JBQXNCLENBQUMsYUFBYTtRQUN6QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7WUFDdEMsT0FBTTtRQUNSLENBQUM7UUFFRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtBc3luY0xvY2FsU3RvcmFnZX0gZnJvbSBcImFzeW5jX2hvb2tzXCJcbmltcG9ydCBCYXNlUG9vbCwge1BPT0xfQ09ORklHVVJBVElPTl9LRVl9IGZyb20gXCIuL2Jhc2UuanNcIlxuXG5leHBvcnQgY29uc3QgQ0xPU0VEX0NPTk5FQ1RJT04gPSBTeW1ib2woXCJ2ZWxvY2lvdXNDbG9zZWRDb25uZWN0aW9uXCIpXG5jb25zdCBJRExFX0NPTk5FQ1RJT05fQ0hFQ0tFRF9JTl9BVCA9IFN5bWJvbChcInZlbG9jaW91c0lkbGVDb25uZWN0aW9uQ2hlY2tlZEluQXRcIilcbmNvbnN0IERFRkFVTFRfSURMRV9USU1FT1VUX01JTExJUyA9IDUwMDBcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQZW5kaW5nQ2hlY2tvdXRcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZyAtIFJlc29sdmVkIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24gbmVlZGVkIGJ5IHRoZSBjaGVja291dC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZXVzZUtleSAtIERhdGFiYXNlIGNvbmZpZ3VyYXRpb24gcmV1c2Uga2V5IG5lZWRlZCBieSB0aGUgY2hlY2tvdXQuXG4gKiBAcHJvcGVydHkgeyhjb25uZWN0aW9uOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCkgPT4gdm9pZH0gcmVzb2x2ZSAtIFJlc29sdmVzIHdpdGggYW4gYWN0aXZhdGVkIGNvbm5lY3Rpb24uXG4gKiBAcHJvcGVydHkgeyhlcnJvcjogRXJyb3IpID0+IHZvaWR9IHJlamVjdCAtIFJlamVjdHMgd2hlbiBjaGVja291dCBjYW5ub3QgY29tcGxldGUuXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzRGF0YWJhc2VQb29sQXN5bmNUcmFja2VkTXVsdGlDb25uZWN0aW9uIGV4dGVuZHMgQmFzZVBvb2wge1xuICAvKipcbiAgICogR2xvYmFsIGZhbGxiYWNrIGNvbm5lY3Rpb25zIGtleWVkIGJ5IGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UgYW5kIHBvb2wgaWRlbnRpZmllci5cbiAgICogQHR5cGUge1dlYWtNYXA8aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD4+fVxuICAgKi9cbiAgc3RhdGljIGdsb2JhbENvbm5lY3Rpb25zID0gbmV3IFdlYWtNYXAoKVxuXG4gIGFzeW5jTG9jYWxTdG9yYWdlID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKClcblxuICAvKipcbiAgICogV2hlbiBzZXQsIHJldHVybmVkIGJ5IGdldEN1cnJlbnRDb250ZXh0Q29ubmVjdGlvbiB3aGVuIG5vIGFzeW5jIGNvbnRleHQgZXhpc3RzLlxuICAgKiBVc2VkIGJ5IHRoZSB0ZXN0IHJ1bm5lciB0byBzaGFyZSBhIGNvbm5lY3Rpb24gYmV0d2VlbiB0ZXN0IGNvZGUgYW5kIEhUVFAgaGFuZGxlcnNcbiAgICogcnVubmluZyBpbiB0aGUgc2FtZSBwcm9jZXNzIChpbi1wcm9jZXNzIHRlc3Qgc2VydmVyIG1vZGUpLlxuICAgKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9XG4gICAqL1xuICBfdGVzdFNoYXJlZENvbm5lY3Rpb24gPSB1bmRlZmluZWRcblxuICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0W119ICovXG4gIGNvbm5lY3Rpb25zID0gW11cblxuICAvKiogQHR5cGUge1JlY29yZDxudW1iZXIsIGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn0gKi9cbiAgY29ubmVjdGlvbnNJblVzZSA9IHt9XG5cbiAgLyoqIEB0eXBlIHtQZW5kaW5nQ2hlY2tvdXRbXX0gKi9cbiAgcGVuZGluZ0NoZWNrb3V0cyA9IFtdXG5cbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gIGNvbm5lY3Rpb25zQmVpbmdTcGF3bmVkID0gMFxuXG4gIC8qKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZH0gKi9cbiAgcGVuZGluZ0NoZWNrb3V0RHJhaW5Qcm9taXNlID0gdW5kZWZpbmVkXG5cbiAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZH0gKi9cbiAgaWRsZUNvbm5lY3Rpb25SZWFwZXJUaW1lciA9IHVuZGVmaW5lZFxuXG4gIGlkU2VxID0gMFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuaWRlbnRpZmllciAtIElkZW50aWZpZXIuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgaWRlbnRpZmllcn0pIHtcbiAgICBzdXBlcih7Y29uZmlndXJhdGlvbiwgaWRlbnRpZmllcn0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIERhdGFiYXNlIGNvbm5lY3Rpb24gaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2hlY2tlZCBpbiBvciBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBjaGVja2luKGNvbm5lY3Rpb24pIHtcbiAgICBjb25zdCBpZCA9IGNvbm5lY3Rpb24uZ2V0SWRTZXEoKVxuXG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpZFNlcSBvbiBjb25uZWN0aW9uIHdhc24ndCBzZXQ/ICcke3R5cGVvZiBpZH0nID0gJHtpZH1gKVxuICAgIH1cblxuICAgIGlmIChpZCBpbiB0aGlzLmNvbm5lY3Rpb25zSW5Vc2UpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmNvbm5lY3Rpb25zSW5Vc2VbaWRdXG4gICAgfVxuXG4gICAgY29ubmVjdGlvbi5zZXRJZFNlcSh1bmRlZmluZWQpXG5cbiAgICBjb25zdCB0cmFja2VkQ29ubmVjdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgJiB7W0NMT1NFRF9DT05ORUNUSU9OXT86IGJvb2xlYW4sIFtJRExFX0NPTk5FQ1RJT05fQ0hFQ0tFRF9JTl9BVF0/OiBudW1iZXJ9fSAqLyAoY29ubmVjdGlvbilcblxuICAgIGlmICh0cmFja2VkQ29ubmVjdGlvbltDTE9TRURfQ09OTkVDVElPTl0pIHJldHVyblxuXG4gICAgYXdhaXQgdGhpcy5yb2xsYmFja0xlZnRPcGVuVHJhbnNhY3Rpb24oY29ubmVjdGlvbilcblxuICAgIHRyYWNrZWRDb25uZWN0aW9uW0lETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUXSA9IERhdGUubm93KClcbiAgICB0aGlzLmNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbilcbiAgICBhd2FpdCB0aGlzLmRyYWluUGVuZGluZ0NoZWNrb3V0cygpXG5cbiAgICBpZiAodGhpcy5pZGxlVGltZW91dE1pbGxpcygpID09PSAwKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlYXBJZGxlQ29ubmVjdGlvbnMoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjaGVkdWxlSWRsZUNvbm5lY3Rpb25SZWFwZXIoKVxuICAgIH1cblxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjaGVja291dC4gICovXG4gIGFzeW5jIGNoZWNrb3V0KCkge1xuICAgIGNvbnN0IGRhdGFiYXNlQ29uZmlnID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKClcbiAgICBjb25zdCByZXVzZUtleSA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KClcbiAgICBsZXQgY29ubmVjdGlvbiA9IHRoaXMudGFrZUlkbGVDb25uZWN0aW9uRm9yUmV1c2VLZXkocmV1c2VLZXkpXG5cbiAgICBpZiAoY29ubmVjdGlvbikgcmV0dXJuIHRoaXMuYWN0aXZhdGVDb25uZWN0aW9uKGNvbm5lY3Rpb24pXG5cbiAgICBhd2FpdCB0aGlzLnJlYXBJZGxlQ29ubmVjdGlvbnMoKVxuICAgIGNvbm5lY3Rpb24gPSB0aGlzLnRha2VJZGxlQ29ubmVjdGlvbkZvclJldXNlS2V5KHJldXNlS2V5KVxuXG4gICAgaWYgKGNvbm5lY3Rpb24pIHJldHVybiB0aGlzLmFjdGl2YXRlQ29ubmVjdGlvbihjb25uZWN0aW9uKVxuXG4gICAgaWYgKHRoaXMuY2FuU3Bhd25Db25uZWN0aW9uKCkpIHtcbiAgICAgIC8vIFNwYXduIHZpYSBzcGF3bkNvbm5lY3Rpb24oKSBzbyB0aGUgdGVuYW50LWF3YXJlIGNvbmZpZ3VyYXRpb24gaXMgcmVzb2x2ZWQgRlJFU0ggYXRcbiAgICAgIC8vIHNwYXduIHRpbWUgZm9yIHRoZSBjdXJyZW50IGNhbGxlci4gUmV1c2luZyB0aGUgZGF0YWJhc2VDb25maWcgY2FwdHVyZWQgYXQgdGhlIHRvcCBvZlxuICAgICAgLy8gY2hlY2tvdXQoKSBjb3VsZCBiaW5kIHRoZSBjb25uZWN0aW9uIHRvIGEgc3RhbGUgdGVuYW50L2RhdGFiYXNlLCB3aGljaCBicmVha3NcbiAgICAgIC8vIHBlci1yZXF1ZXN0IGlzb2xhdGlvbiAoZS5nLiB0ZXN0IHRydW5jYXRpb24gYXBwZWFyaW5nIG5vdCB0byB0YWtlIGVmZmVjdCkuIFRoZSBxdWV1ZWRcbiAgICAgIC8vIHBhdGggYmVsb3cga2VlcHMgdGhlIHdhaXRpbmcgY2FsbGVyJ3MgY2FwdHVyZWQgY29uZmlnIHZpYSB3YWl0Rm9yQ2hlY2tvdXQoKS5cbiAgICAgIGNvbm5lY3Rpb24gPSBhd2FpdCB0aGlzLnNwYXduQ29ubmVjdGlvbigpXG5cbiAgICAgIHJldHVybiB0aGlzLmFjdGl2YXRlQ29ubmVjdGlvbihjb25uZWN0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLndhaXRGb3JDaGVja291dChkYXRhYmFzZUNvbmZpZywgcmV1c2VLZXkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJldXNlS2V5IC0gRGF0YWJhc2UgY29uZmlndXJhdGlvbiByZXVzZSBrZXkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmluY2x1ZGVPcGVuVHJhbnNhY3Rpb25zXSAtIFdoZXRoZXIgY29ubmVjdGlvbnMgd2l0aCBvcGVuIHRyYW5zYWN0aW9ucyBtYXkgYmUgcmV0dXJuZWQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gLSBNYXRjaGluZyBpZGxlIGNvbm5lY3Rpb24uXG4gICAqL1xuICB0YWtlSWRsZUNvbm5lY3Rpb25Gb3JSZXVzZUtleShyZXVzZUtleSwge2luY2x1ZGVPcGVuVHJhbnNhY3Rpb25zID0gdHJ1ZX0gPSB7fSkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25JbmRleCA9IHRoaXMuY29ubmVjdGlvbnMuZmluZEluZGV4KChxdWV1ZWRDb25uZWN0aW9uKSA9PiB7XG4gICAgICBpZiAoIWluY2x1ZGVPcGVuVHJhbnNhY3Rpb25zICYmIHRoaXMuY29ubmVjdGlvbkhhc09wZW5UcmFuc2FjdGlvbihxdWV1ZWRDb25uZWN0aW9uKSkgcmV0dXJuIGZhbHNlXG5cbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25NYXRjaGVzUmV1c2VLZXkocXVldWVkQ29ubmVjdGlvbiwgcmV1c2VLZXkpXG4gICAgfSlcbiAgICBjb25zdCBjb25uZWN0aW9uID0gY29ubmVjdGlvbkluZGV4ID09PSAtMSA/IHVuZGVmaW5lZCA6IHRoaXMuY29ubmVjdGlvbnMuc3BsaWNlKGNvbm5lY3Rpb25JbmRleCwgMSlbMF1cblxuICAgIHJldHVybiBjb25uZWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIENvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXVzZUtleSAtIERhdGFiYXNlIGNvbmZpZ3VyYXRpb24gcmV1c2Uga2V5LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBjb25uZWN0aW9uIG1hdGNoZXMgdGhlIHJldXNlIGtleS5cbiAgICovXG4gIGNvbm5lY3Rpb25NYXRjaGVzUmV1c2VLZXkoY29ubmVjdGlvbiwgcmV1c2VLZXkpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uV2l0aFBvb2xLZXkgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0ICYge1tQT09MX0NPTkZJR1VSQVRJT05fS0VZXT86IHN0cmluZ319ICovIChjb25uZWN0aW9uKVxuXG4gICAgcmV0dXJuIGNvbm5lY3Rpb25XaXRoUG9vbEtleVtQT09MX0NPTkZJR1VSQVRJT05fS0VZXSA9PT0gcmV1c2VLZXlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gQ29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSAtIEFjdGl2YXRlZCBjb25uZWN0aW9uLlxuICAgKi9cbiAgYWN0aXZhdGVDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICBpZiAoY29ubmVjdGlvbi5nZXRJZFNlcSgpICE9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihgQ29ubmVjdGlvbiBhbHJlYWR5IGhhcyBhbiBJRC1zZXEgLSBpcyBpdCBpbiB1c2U/ICR7Y29ubmVjdGlvbi5nZXRJZFNlcSgpfWApXG5cbiAgICBjb25zdCBpZCA9IHRoaXMuaWRTZXErK1xuXG4gICAgY29uc3QgdHJhY2tlZENvbm5lY3Rpb24gPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0ICYge1tJRExFX0NPTk5FQ1RJT05fQ0hFQ0tFRF9JTl9BVF0/OiBudW1iZXJ9fSAqLyAoY29ubmVjdGlvbilcbiAgICBkZWxldGUgdHJhY2tlZENvbm5lY3Rpb25bSURMRV9DT05ORUNUSU9OX0NIRUNLRURfSU5fQVRdXG5cbiAgICBjb25uZWN0aW9uLnNldElkU2VxKGlkKVxuICAgIHRoaXMuY29ubmVjdGlvbnNJblVzZVtpZF0gPSBjb25uZWN0aW9uXG5cbiAgICByZXR1cm4gY29ubmVjdGlvblxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXIgfCB1bmRlZmluZWR9IC0gQ29uZmlndXJlZCBtYXggbGl2ZSBjb25uZWN0aW9ucy4gKi9cbiAgbWF4Q29ubmVjdGlvbnMoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5wb29sPy5tYXhcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSAmJiB2YWx1ZSA+PSAxKSByZXR1cm4gdmFsdWVcblxuICAgIHJldHVyblxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXJ9IC0gTnVtYmVyIG9mIGxpdmUgYW5kIGluLXByb2dyZXNzIGNvbm5lY3Rpb25zLiAqL1xuICBsaXZlQ29ubmVjdGlvbkNvdW50KCkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gbmV3IFNldChbXG4gICAgICAuLi50aGlzLmNvbm5lY3Rpb25zLFxuICAgICAgLi4uT2JqZWN0LnZhbHVlcyh0aGlzLmNvbm5lY3Rpb25zSW5Vc2UpLFxuICAgICAgdGhpcy5nZXRHbG9iYWxDb25uZWN0aW9uRm9ySWRlbnRpZmllcigpXG4gICAgXS5maWx0ZXIoQm9vbGVhbikpXG5cbiAgICByZXR1cm4gY29ubmVjdGlvbnMuc2l6ZSArIHRoaXMuY29ubmVjdGlvbnNCZWluZ1NwYXduZWRcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGEgbmV3IGNvbm5lY3Rpb24gY2FuIGJlIHNwYXduZWQuICovXG4gIGNhblNwYXduQ29ubmVjdGlvbigpIHtcbiAgICBjb25zdCBtYXhDb25uZWN0aW9ucyA9IHRoaXMubWF4Q29ubmVjdGlvbnMoKVxuXG4gICAgcmV0dXJuIG1heENvbm5lY3Rpb25zID09PSB1bmRlZmluZWQgfHwgdGhpcy5saXZlQ29ubmVjdGlvbkNvdW50KCkgPCBtYXhDb25uZWN0aW9uc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZyAtIFJlc29sdmVkIGRhdGFiYXNlIGNvbmZpZyBmb3IgdGhlIGNoZWNrb3V0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV1c2VLZXkgLSBEYXRhYmFzZSBjb25maWd1cmF0aW9uIHJldXNlIGtleSBmb3IgdGhlIGNoZWNrb3V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IC0gU3Bhd25lZCBjb25uZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgc3Bhd25Db25uZWN0aW9uRm9yQ2hlY2tvdXQoZGF0YWJhc2VDb25maWcsIHJldXNlS2V5KSB7XG4gICAgdGhpcy5jb25uZWN0aW9uc0JlaW5nU3Bhd25lZCsrXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuc3Bhd25Db25uZWN0aW9uV2l0aENvbmZpZ3VyYXRpb24oZGF0YWJhc2VDb25maWcpXG4gICAgICBjb25zdCBjb25uZWN0aW9uV2l0aFBvb2xLZXkgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0ICYge1tQT09MX0NPTkZJR1VSQVRJT05fS0VZXT86IHN0cmluZ319ICovIChjb25uZWN0aW9uKVxuXG4gICAgICBjb25uZWN0aW9uV2l0aFBvb2xLZXlbUE9PTF9DT05GSUdVUkFUSU9OX0tFWV0gPSByZXVzZUtleVxuICAgICAgY29ubmVjdGlvbi5zZXRTY2hlbWFDYWNoZUludmFsaWRhdG9yKCgpID0+IHRoaXMuY2xlYXJTY2hlbWFDYWNoZSgpKVxuXG4gICAgICByZXR1cm4gY29ubmVjdGlvblxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25zQmVpbmdTcGF3bmVkLS1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IGRhdGFiYXNlQ29uZmlnIC0gUmVzb2x2ZWQgZGF0YWJhc2UgY29uZmlnIGZvciB0aGUgY2hlY2tvdXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXVzZUtleSAtIERhdGFiYXNlIGNvbmZpZ3VyYXRpb24gcmV1c2Uga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IC0gUmVzb2x2ZXMgd2l0aCBhbiBhY3RpdmF0ZWQgY29ubmVjdGlvbi5cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JDaGVja291dChkYXRhYmFzZUNvbmZpZywgcmV1c2VLZXkpIHtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRzLnB1c2goe2RhdGFiYXNlQ29uZmlnLCByZWplY3QsIHJlc29sdmUsIHJldXNlS2V5fSlcbiAgICAgIHZvaWQgdGhpcy5kcmFpblBlbmRpbmdDaGVja291dHMoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc3QgY2hlY2tvdXRFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihcIkZhaWxlZCB0byBkcmFpbiBwZW5kaW5nIGRhdGFiYXNlIGNvbm5lY3Rpb24gY2hlY2tvdXRzLlwiLCB7Y2F1c2U6IGVycm9yfSlcblxuICAgICAgICB0aGlzLnJlamVjdFBlbmRpbmdDaGVja291dHMoY2hlY2tvdXRFcnJvcilcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHBlbmRpbmcgY2hlY2tvdXRzIGhhdmUgYmVlbiBkcmFpbmVkIGFzIGZhciBhcyBwb3NzaWJsZS4gKi9cbiAgYXN5bmMgZHJhaW5QZW5kaW5nQ2hlY2tvdXRzKCkge1xuICAgIGlmICh0aGlzLnBlbmRpbmdDaGVja291dERyYWluUHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5wZW5kaW5nQ2hlY2tvdXREcmFpblByb21pc2VcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0RHJhaW5Qcm9taXNlID0gdGhpcy5kcmFpblBlbmRpbmdDaGVja291dHNBY3R1YWwoKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucGVuZGluZ0NoZWNrb3V0RHJhaW5Qcm9taXNlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0RHJhaW5Qcm9taXNlID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gcGVuZGluZyBjaGVja291dHMgaGF2ZSBiZWVuIGRyYWluZWQgYXMgZmFyIGFzIHBvc3NpYmxlLiAqL1xuICBhc3luYyBkcmFpblBlbmRpbmdDaGVja291dHNBY3R1YWwoKSB7XG4gICAgd2hpbGUgKHRoaXMucGVuZGluZ0NoZWNrb3V0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGVja291dCA9IHRoaXMucGVuZGluZ0NoZWNrb3V0c1swXVxuICAgICAgbGV0IGNvbm5lY3Rpb24gPSB0aGlzLnRha2VJZGxlQ29ubmVjdGlvbkZvclJldXNlS2V5KGNoZWNrb3V0LnJldXNlS2V5LCB7aW5jbHVkZU9wZW5UcmFuc2FjdGlvbnM6IGZhbHNlfSlcblxuICAgICAgaWYgKCFjb25uZWN0aW9uKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVhcElkbGVDb25uZWN0aW9ucygpXG4gICAgICAgIGNvbm5lY3Rpb24gPSB0aGlzLnRha2VJZGxlQ29ubmVjdGlvbkZvclJldXNlS2V5KGNoZWNrb3V0LnJldXNlS2V5LCB7aW5jbHVkZU9wZW5UcmFuc2FjdGlvbnM6IGZhbHNlfSlcbiAgICAgIH1cblxuICAgICAgaWYgKCFjb25uZWN0aW9uICYmICF0aGlzLmNhblNwYXduQ29ubmVjdGlvbigpKSB7XG4gICAgICAgIGNvbnN0IGNsb3NlZENvbm5lY3Rpb24gPSBhd2FpdCB0aGlzLmNsb3NlT25lSWRsZUNvbm5lY3Rpb25Gb3JDYXBhY2l0eSgpXG5cbiAgICAgICAgaWYgKGNsb3NlZENvbm5lY3Rpb24pIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICghY29ubmVjdGlvbiAmJiB0aGlzLmNhblNwYXduQ29ubmVjdGlvbigpKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0cy5zaGlmdCgpXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy5zcGF3bkNvbm5lY3Rpb25Gb3JDaGVja291dChjaGVja291dC5kYXRhYmFzZUNvbmZpZywgY2hlY2tvdXQucmV1c2VLZXkpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY2hlY2tvdXQucmVqZWN0KGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihcIkZhaWxlZCB0byBzcGF3biBkYXRhYmFzZSBjb25uZWN0aW9uLlwiLCB7Y2F1c2U6IGVycm9yfSkpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNoZWNrb3V0LnJlc29sdmUodGhpcy5hY3RpdmF0ZUNvbm5lY3Rpb24oY29ubmVjdGlvbikpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICghY29ubmVjdGlvbikgcmV0dXJuXG5cbiAgICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0cy5zaGlmdCgpXG4gICAgICBjaGVja291dC5yZXNvbHZlKHRoaXMuYWN0aXZhdGVDb25uZWN0aW9uKGNvbm5lY3Rpb24pKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIGFuIGlkbGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIHRvIGZyZWUgY2FwYWNpdHkuICovXG4gIGFzeW5jIGNsb3NlT25lSWRsZUNvbm5lY3Rpb25Gb3JDYXBhY2l0eSgpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9ucy5maW5kKChjYW5kaWRhdGUpID0+ICF0aGlzLmNvbm5lY3Rpb25IYXNPcGVuVHJhbnNhY3Rpb24oY2FuZGlkYXRlKSlcblxuICAgIGlmICghY29ubmVjdGlvbikgcmV0dXJuIGZhbHNlXG5cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5jb25uZWN0aW9ucy5maWx0ZXIoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlICE9PSBjb25uZWN0aW9uKVxuICAgIGF3YWl0IHRoaXMuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3Rpb24pXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQpIDogUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byBpbnZva2Ugd2l0aCB0aGUgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgd2l0aENvbm5lY3Rpb24oY2FsbGJhY2spIHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy5jaGVja291dCgpXG4gICAgY29uc3QgaWQgPSBjb25uZWN0aW9uLmdldElkU2VxKClcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bihpZCwgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKGNvbm5lY3Rpb24pXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNraW4oY29ubmVjdGlvbilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gLSBUaGUgY3VycmVudCBjb25uZWN0aW9uLiAgKi9cbiAgZ2V0Q3VycmVudENvbm5lY3Rpb24oKSB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBmYWxsYmFja0Nvbm5lY3Rpb24gPSB0aGlzLmdldEdsb2JhbENvbm5lY3Rpb24oKVxuXG4gICAgICBpZiAoZmFsbGJhY2tDb25uZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxsYmFja0Nvbm5lY3Rpb25cbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSUQgaGFzbid0IGJlZW4gc2V0IGZvciB0aGlzIGFzeW5jIGNvbnRleHRcIilcbiAgICB9XG5cbiAgICBpZiAoIShpZCBpbiB0aGlzLmNvbm5lY3Rpb25zSW5Vc2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbm5lY3Rpb24gJHtpZH0gZG9lc24ndCBleGlzdCBhbnkgbW9yZSAtIGhhcyBpdCBiZWVuIGNoZWNrZWQgaW4gYWdhaW4/YClcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50Q29ubmVjdGlvbiA9IHRoaXMuY29ubmVjdGlvbnNJblVzZVtpZF1cblxuICAgIGlmICghY3VycmVudENvbm5lY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZ2V0IGN1cnJlbnQgY29ubmVjdGlvbiBmcm9tIHRoYXQgSUQ6ICR7aWR9YClcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudENvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBmYWxsYmFjayBjb25uZWN0aW9uIGZvciB0aGlzIHBvb2wgaWRlbnRpZmllciB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIG5vIGFzeW5jIGNvbnRleHQgaXMgYXZhaWxhYmxlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gQ29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0R2xvYmFsQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgY29uc3Qga2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBWZWxvY2lvdXNEYXRhYmFzZVBvb2xBc3luY1RyYWNrZWRNdWx0aUNvbm5lY3Rpb259ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICAgIGxldCBtYXBGb3JDb25maWd1cmF0aW9uID0ga2xhc3MuZ2xvYmFsQ29ubmVjdGlvbnMuZ2V0KHRoaXMuY29uZmlndXJhdGlvbilcblxuICAgIGlmICghbWFwRm9yQ29uZmlndXJhdGlvbikge1xuICAgICAgbWFwRm9yQ29uZmlndXJhdGlvbiA9IHt9XG4gICAgICBrbGFzcy5nbG9iYWxDb25uZWN0aW9ucy5zZXQodGhpcy5jb25maWd1cmF0aW9uLCBtYXBGb3JDb25maWd1cmF0aW9uKVxuICAgIH1cblxuICAgIG1hcEZvckNvbmZpZ3VyYXRpb25bdGhpcy5pZGVudGlmaWVyXSA9IGNvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIGEgZ2xvYmFsIGZhbGxiYWNrIGNvbm5lY3Rpb24gZXhpc3RzIGZvciB0aGlzIHBvb2wgaWRlbnRpZmllciBhbmQgcmV0dXJucyBpdC5cbiAgICogSWYgb25lIGlzIGFscmVhZHkgc2V0LCBpdCBpcyByZXR1cm5lZCBhbmQgYWxzbyBtYWRlIGF2YWlsYWJsZSBpbiB0aGUgcG9vbCBxdWV1ZS5cbiAgICogT3RoZXJ3aXNlIGEgbmV3IGNvbm5lY3Rpb24gaXMgc3Bhd25lZCwgcmVnaXN0ZXJlZCwgYW5kIHF1ZXVlZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+fSAtIFJlc29sdmVzIHdpdGggdGhlIGdsb2JhbCBjb25uZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlR2xvYmFsQ29ubmVjdGlvbigpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0R2xvYmFsQ29ubmVjdGlvbigpXG5cbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZ1xuXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuc3Bhd25Db25uZWN0aW9uKClcblxuICAgIHRoaXMuc2V0R2xvYmFsQ29ubmVjdGlvbihjb25uZWN0aW9uKVxuXG4gICAgcmV0dXJuIGNvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBzaGFyZWQgY29ubmVjdGlvbiBmb3IgdGVzdCBtb2RlIHNvIHRoYXQgSFRUUCBoYW5kbGVycyBydW5uaW5nXG4gICAqIGluIHRoZSBzYW1lIHByb2Nlc3MgY2FuIHJldXNlIHRoZSB0ZXN0IHJ1bm5lcidzIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBTaGFyZWQgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRUZXN0U2hhcmVkQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgdGhpcy5fdGVzdFNoYXJlZENvbm5lY3Rpb24gPSBjb25uZWN0aW9uXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIGNsZWFyVGVzdFNoYXJlZENvbm5lY3Rpb24oKSB7XG4gICAgdGhpcy5fdGVzdFNoYXJlZENvbm5lY3Rpb24gPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb25uZWN0aW9uIHRpZWQgdG8gdGhlIGN1cnJlbnQgYXN5bmMgY29udGV4dCwgaWYgYW55LlxuICAgKiBGYWxscyBiYWNrIHRvIHRoZSB0ZXN0IHNoYXJlZCBjb25uZWN0aW9uIHdoZW4gbm8gYXN5bmMgY29udGV4dCBleGlzdHMuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gLSBUaGUgY3VycmVudCBjb250ZXh0IGNvbm5lY3Rpb24uXG4gICAqL1xuICBnZXRDdXJyZW50Q29udGV4dENvbm5lY3Rpb24oKSB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5fdGVzdFNoYXJlZENvbm5lY3Rpb25cblxuICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRDb25uZWN0aW9uKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IC0gVGhlIGdsb2JhbCBjb25uZWN0aW9uLlxuICAgKi9cbiAgZ2V0R2xvYmFsQ29ubmVjdGlvbigpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5nZXRHbG9iYWxDb25uZWN0aW9uRm9ySWRlbnRpZmllcigpXG5cbiAgICBpZiAoIWNvbm5lY3Rpb24pIHJldHVyblxuICAgIGlmICghdGhpcy5jb25uZWN0aW9uTWF0Y2hlc0N1cnJlbnRDb25maWd1cmF0aW9uKGNvbm5lY3Rpb24pKSByZXR1cm5cblxuICAgIHJldHVybiBjb25uZWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAtIFRoZSBnbG9iYWwgY29ubmVjdGlvbiBmb3IgdGhpcyBwb29sIGlkZW50aWZpZXIuXG4gICAqL1xuICBnZXRHbG9iYWxDb25uZWN0aW9uRm9ySWRlbnRpZmllcigpIHtcbiAgICBjb25zdCBrbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIFZlbG9jaW91c0RhdGFiYXNlUG9vbEFzeW5jVHJhY2tlZE11bHRpQ29ubmVjdGlvbn0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgbWFwRm9yQ29uZmlndXJhdGlvbiA9IGtsYXNzLmdsb2JhbENvbm5lY3Rpb25zLmdldCh0aGlzLmNvbmZpZ3VyYXRpb24pXG5cbiAgICByZXR1cm4gbWFwRm9yQ29uZmlndXJhdGlvbj8uW3RoaXMuaWRlbnRpZmllcl1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgc2NoZW1hIG1ldGFkYXRhIGNhY2hlZCBieSBldmVyeSBsaXZlIGNvbm5lY3Rpb24gb3duZWQgYnkgdGhpcyBwb29sLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBjbGVhclNjaGVtYUNhY2hlKCkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gbmV3IFNldChbXG4gICAgICAuLi50aGlzLmNvbm5lY3Rpb25zLFxuICAgICAgLi4uT2JqZWN0LnZhbHVlcyh0aGlzLmNvbm5lY3Rpb25zSW5Vc2UpLFxuICAgICAgdGhpcy5nZXRHbG9iYWxDb25uZWN0aW9uKCksXG4gICAgICB0aGlzLl90ZXN0U2hhcmVkQ29ubmVjdGlvblxuICAgIF0uZmlsdGVyKEJvb2xlYW4pKVxuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSB7XG4gICAgICBpZiAoY29ubmVjdGlvbikgdGhpcy5fY2xlYXJDb25uZWN0aW9uU2NoZW1hQ2FjaGUoY29ubmVjdGlvbilcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge251bWJlciB8IG51bGx9IC0gSWRsZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgbnVsbCB3aGVuIGRpc2FibGVkLiAqL1xuICBpZGxlVGltZW91dE1pbGxpcygpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnBvb2w/LmlkbGVUaW1lb3V0TWlsbGlzXG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBudWxsXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID49IDApIHJldHVybiB2YWx1ZVxuXG4gICAgcmV0dXJuIERFRkFVTFRfSURMRV9USU1FT1VUX01JTExJU1xuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBzY2hlZHVsZUlkbGVDb25uZWN0aW9uUmVhcGVyKCkge1xuICAgIGlmICh0aGlzLmlkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIpIHJldHVyblxuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBpZGxlVGltZW91dE1pbGxpcyA9IHRoaXMuaWRsZVRpbWVvdXRNaWxsaXMoKVxuXG4gICAgaWYgKGlkbGVUaW1lb3V0TWlsbGlzID09PSBudWxsKSByZXR1cm5cblxuICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5uZXh0SWRsZUNvbm5lY3Rpb25SZWFwRGVsYXkoaWRsZVRpbWVvdXRNaWxsaXMpXG5cbiAgICB0aGlzLmlkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaWRsZUNvbm5lY3Rpb25SZWFwZXJUaW1lciA9IHVuZGVmaW5lZFxuICAgICAgdm9pZCB0aGlzLnJlYXBJZGxlQ29ubmVjdGlvbnMoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbXCJGYWlsZWQgdG8gcmVhcCBpZGxlIGRhdGFiYXNlIGNvbm5lY3Rpb25zOlwiLCBlcnJvcl0pXG4gICAgICB9KVxuICAgIH0sIGRlbGF5KVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmlkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIudW5yZWYgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5pZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyLnVucmVmKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkbGVUaW1lb3V0TWlsbGlzIC0gSWRsZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy5cbiAgICogQHJldHVybnMge251bWJlcn0gLSBEZWxheSBiZWZvcmUgdGhlIG5leHQgcmVhcC5cbiAgICovXG4gIG5leHRJZGxlQ29ubmVjdGlvblJlYXBEZWxheShpZGxlVGltZW91dE1pbGxpcykge1xuICAgIGxldCBkZWxheSA9IGlkbGVUaW1lb3V0TWlsbGlzXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuY29ubmVjdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25IYXNPcGVuVHJhbnNhY3Rpb24oY29ubmVjdGlvbikpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHRyYWNrZWRDb25uZWN0aW9uID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCAmIHtbSURMRV9DT05ORUNUSU9OX0NIRUNLRURfSU5fQVRdPzogbnVtYmVyfX0gKi8gKGNvbm5lY3Rpb24pXG4gICAgICBjb25zdCBjaGVja2VkSW5BdCA9IHRyYWNrZWRDb25uZWN0aW9uW0lETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUXVxuXG4gICAgICBpZiAodHlwZW9mIGNoZWNrZWRJbkF0ICE9PSBcIm51bWJlclwiKSBjb250aW51ZVxuXG4gICAgICBkZWxheSA9IE1hdGgubWluKGRlbGF5LCBNYXRoLm1heCgwLCBpZGxlVGltZW91dE1pbGxpcyAtIChub3cgLSBjaGVja2VkSW5BdCkpKVxuICAgIH1cblxuICAgIHJldHVybiBkZWxheVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyBpZGxlIGNoZWNrZWQtaW4gY29ubmVjdGlvbnMgdGhhdCBoYXZlIGV4Y2VlZGVkIHRoZSBjb25maWd1cmVkIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyByZWFwSWRsZUNvbm5lY3Rpb25zKCkge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBpZGxlVGltZW91dE1pbGxpcyA9IHRoaXMuaWRsZVRpbWVvdXRNaWxsaXMoKVxuXG4gICAgaWYgKGlkbGVUaW1lb3V0TWlsbGlzID09PSBudWxsKSByZXR1cm5cblxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0W119ICovXG4gICAgY29uc3Qga2VwdENvbm5lY3Rpb25zID0gW11cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0W119ICovXG4gICAgY29uc3QgZXhwaXJlZENvbm5lY3Rpb25zID0gW11cblxuICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLmNvbm5lY3Rpb25zKSB7XG4gICAgICBjb25zdCB0cmFja2VkQ29ubmVjdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgJiB7W0NMT1NFRF9DT05ORUNUSU9OXT86IGJvb2xlYW4sIFtJRExFX0NPTk5FQ1RJT05fQ0hFQ0tFRF9JTl9BVF0/OiBudW1iZXJ9fSAqLyAoY29ubmVjdGlvbilcblxuICAgICAgaWYgKHRyYWNrZWRDb25uZWN0aW9uW0NMT1NFRF9DT05ORUNUSU9OXSkgY29udGludWVcbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25IYXNPcGVuVHJhbnNhY3Rpb24oY29ubmVjdGlvbikpIHtcbiAgICAgICAga2VwdENvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbilcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hlY2tlZEluQXQgPSB0cmFja2VkQ29ubmVjdGlvbltJRExFX0NPTk5FQ1RJT05fQ0hFQ0tFRF9JTl9BVF1cbiAgICAgIGNvbnN0IGV4cGlyZWQgPSB0eXBlb2YgY2hlY2tlZEluQXQgPT09IFwibnVtYmVyXCIgJiYgbm93IC0gY2hlY2tlZEluQXQgPj0gaWRsZVRpbWVvdXRNaWxsaXNcblxuICAgICAgaWYgKGV4cGlyZWQpIHtcbiAgICAgICAgZXhwaXJlZENvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGtlcHRDb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb24pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IGtlcHRDb25uZWN0aW9uc1xuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGV4cGlyZWRDb25uZWN0aW9ucykge1xuICAgICAgYXdhaXQgdGhpcy5jbG9zZUNvbm5lY3Rpb24oY29ubmVjdGlvbilcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25uZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlSWRsZUNvbm5lY3Rpb25SZWFwZXIoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gQ29ubmVjdGlvbiB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBjb25uZWN0aW9uIGhhcyBhbiBvcGVuIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgY29ubmVjdGlvbkhhc09wZW5UcmFuc2FjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb24uX3RyYW5zYWN0aW9uc0NvdW50ID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIFJvbGxzIGJhY2sgYW55IHRyYW5zYWN0aW9uIGEgcHJldmlvdXMgaG9sZGVyIGxlZnQgb3BlbiBiZWZvcmUgYSBjb25uZWN0aW9uXG4gICAqIHJlLWVudGVycyB0aGUgaWRsZSBwb29sLiBBIGNvbm5lY3Rpb24gcmV0dXJuZWQgdG8gdGhlIHBvb2wgd2l0aCBhbiBvcGVuXG4gICAqIHRyYW5zYWN0aW9uIHdvdWxkIG90aGVyd2lzZSBiZSBoYW5kZWQgdG8gYW4gdW5yZWxhdGVkIGNoZWNrb3V0LCB3aG9zZVxuICAgKiBzdGFydFRyYW5zYWN0aW9uKCkgdGhlbiBmYWlscyB3aXRoIFwiQSB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5IHJ1bm5pbmdcIiBhbmRcbiAgICogcG9pc29ucyBldmVyeSBmb2xsb3dpbmcgY2FsbGVyIHRoYXQgcmV1c2VzIGl0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gQ29ubmVjdGlvbiBiZWluZyBjaGVja2VkIGluLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBjb25uZWN0aW9uIGhvbGRzIG5vIG9wZW4gdHJhbnNhY3Rpb24uXG4gICAqL1xuICBhc3luYyByb2xsYmFja0xlZnRPcGVuVHJhbnNhY3Rpb24oY29ubmVjdGlvbikge1xuICAgIGlmICghdGhpcy5jb25uZWN0aW9uSGFzT3BlblRyYW5zYWN0aW9uKGNvbm5lY3Rpb24pKSByZXR1cm5cblxuICAgIHRoaXMubG9nZ2VyLndhcm4oKCkgPT4gW2BSb2xsaW5nIGJhY2sgYSB0cmFuc2FjdGlvbiBsZWZ0IG9wZW4gb24gYSBjb25uZWN0aW9uIGJlaW5nIGNoZWNrZWQgaW4gKGlkZW50aWZpZXI9JHt0aGlzLmlkZW50aWZpZXJ9KS5gXSlcblxuICAgIHdoaWxlICh0aGlzLmNvbm5lY3Rpb25IYXNPcGVuVHJhbnNhY3Rpb24oY29ubmVjdGlvbikpIHtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24ucm9sbGJhY2tUcmFuc2FjdGlvbigpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBDb25uZWN0aW9uIHRvIGNsb3NlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgY2xvc2VDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICBjb25zdCB0cmFja2VkQ29ubmVjdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgJiB7W0NMT1NFRF9DT05ORUNUSU9OXT86IGJvb2xlYW4sIFtJRExFX0NPTk5FQ1RJT05fQ0hFQ0tFRF9JTl9BVF0/OiBudW1iZXJ9fSAqLyAoY29ubmVjdGlvbilcblxuICAgIHRyYWNrZWRDb25uZWN0aW9uW0NMT1NFRF9DT05ORUNUSU9OXSA9IHRydWVcbiAgICBkZWxldGUgdHJhY2tlZENvbm5lY3Rpb25bSURMRV9DT05ORUNUSU9OX0NIRUNLRURfSU5fQVRdXG5cbiAgICBpZiAodHlwZW9mIHRyYWNrZWRDb25uZWN0aW9uLmNsb3NlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGF3YWl0IHRyYWNrZWRDb25uZWN0aW9uLmNsb3NlKClcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0cmFja2VkQ29ubmVjdGlvbi5kaXNjb25uZWN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGF3YWl0IHRyYWNrZWRDb25uZWN0aW9uLmRpc2Nvbm5lY3QoKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgY2xlYXJJZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyKCkge1xuICAgIGlmICghdGhpcy5pZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyKSByZXR1cm5cblxuICAgIGNsZWFyVGltZW91dCh0aGlzLmlkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIpXG4gICAgdGhpcy5pZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGFsbCBhY3RpdmUgYW5kIGNhY2hlZCBjb25uZWN0aW9ucyBmb3IgdGhpcyBwb29sLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgY2xvc2VBbGwoKSB7XG4gICAgdGhpcy5jbGVhcklkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIoKVxuICAgIHRoaXMucmVqZWN0UGVuZGluZ0NoZWNrb3V0cyhuZXcgRXJyb3IoXCJEYXRhYmFzZSBwb29sIHdhcyBjbG9zZWQgYmVmb3JlIGNoZWNrb3V0IGNvbXBsZXRlZC5cIikpXG5cbiAgICBjb25zdCBjb25uZWN0aW9ucyA9IG5ldyBTZXQoW1xuICAgICAgLi4udGhpcy5jb25uZWN0aW9ucyxcbiAgICAgIC4uLk9iamVjdC52YWx1ZXModGhpcy5jb25uZWN0aW9uc0luVXNlKSxcbiAgICAgIHRoaXMuZ2V0R2xvYmFsQ29ubmVjdGlvbigpXG4gICAgXS5maWx0ZXIoQm9vbGVhbikpXG5cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gW11cbiAgICB0aGlzLmNvbm5lY3Rpb25zSW5Vc2UgPSB7fVxuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSB7XG4gICAgICBpZiAoIWNvbm5lY3Rpb24pIGNvbnRpbnVlXG5cbiAgICAgIGF3YWl0IHRoaXMuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3Rpb24pXG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBFcnJvciB0byByZWplY3QgcGVuZGluZyBjaGVja291dHMgd2l0aC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZWplY3RQZW5kaW5nQ2hlY2tvdXRzKGVycm9yKSB7XG4gICAgY29uc3QgcGVuZGluZ0NoZWNrb3V0cyA9IHRoaXMucGVuZGluZ0NoZWNrb3V0c1xuXG4gICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRzID0gW11cblxuICAgIGZvciAoY29uc3QgY2hlY2tvdXQgb2YgcGVuZGluZ0NoZWNrb3V0cykge1xuICAgICAgY2hlY2tvdXQucmVqZWN0KGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgZ2xvYmFsbHkgcmVnaXN0ZXJlZCBmYWxsYmFjayBjb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IFtjb25uZWN0aW9uc10gLSBDb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFtjb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBzZXRHbG9iYWxDb25uZWN0aW9ucyhjb25uZWN0aW9ucywgY29uZmlndXJhdGlvbikge1xuICAgIGlmICghY29ubmVjdGlvbnMgJiYgIWNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHRoaXMuZ2xvYmFsQ29ubmVjdGlvbnMgPSBuZXcgV2Vha01hcCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHRoaXMuZ2xvYmFsQ29ubmVjdGlvbnMgPSBuZXcgV2Vha01hcCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmdsb2JhbENvbm5lY3Rpb25zLnNldChjb25maWd1cmF0aW9uLCBjb25uZWN0aW9ucyB8fCB7fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgZ2xvYmFsbHkgcmVnaXN0ZXJlZCBmYWxsYmFjayBjb25uZWN0aW9ucyBmb3IgYWxsIGNvbmZpZ3VyYXRpb25zIG9yIGEgc2luZ2xlIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBbY29uZmlndXJhdGlvbl0gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzdGF0aWMgY2xlYXJHbG9iYWxDb25uZWN0aW9ucyhjb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB7XG4gICAgICB0aGlzLmdsb2JhbENvbm5lY3Rpb25zID0gbmV3IFdlYWtNYXAoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5nbG9iYWxDb25uZWN0aW9ucy5kZWxldGUoY29uZmlndXJhdGlvbilcbiAgfVxufVxuIl19
|
|
603
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtdHJhY2tlZC1tdWx0aS1jb25uZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3Bvb2wvYXN5bmMtdHJhY2tlZC1tdWx0aS1jb25uZWN0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDN0MsT0FBTyxRQUFRLEVBQUUsRUFBQyxzQkFBc0IsRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUUxRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtBQUNwRSxNQUFNLDZCQUE2QixHQUFHLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFBO0FBQ2xGLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxDQUFBO0FBRXhDOzs7Ozs7R0FNRztBQUVILE1BQU0sQ0FBQyxPQUFPLE9BQU8sZ0RBQWlELFNBQVEsUUFBUTtJQUNwRjs7O09BR0c7SUFDSCxNQUFNLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtJQUV4QyxpQkFBaUIsR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUE7SUFFM0M7Ozs7O09BS0c7SUFDSCxxQkFBcUIsR0FBRyxTQUFTLENBQUE7SUFFakMscURBQXFEO0lBQ3JELFdBQVcsR0FBRyxFQUFFLENBQUE7SUFFaEIsbUVBQW1FO0lBQ25FLGdCQUFnQixHQUFHLEVBQUUsQ0FBQTtJQUVyQixnQ0FBZ0M7SUFDaEMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFBO0lBRXJCLHFCQUFxQjtJQUNyQix1QkFBdUIsR0FBRyxDQUFDLENBQUE7SUFFM0Isd0NBQXdDO0lBQ3hDLDJCQUEyQixHQUFHLFNBQVMsQ0FBQTtJQUV2Qyx3REFBd0Q7SUFDeEQseUJBQXlCLEdBQUcsU0FBUyxDQUFBO0lBRXJDOzs7Ozs7OztPQVFHO0lBQ0gsd0JBQXdCLEdBQUcs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OztPQUlHO0lBQ0gsTUFBTSxDQUFDLHNCQUFzQixDQUFDLGFBQWE7UUFDekMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO1lBQ3RDLE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7QXN5bmNMb2NhbFN0b3JhZ2V9IGZyb20gXCJhc3luY19ob29rc1wiXG5pbXBvcnQgQmFzZVBvb2wsIHtQT09MX0NPTkZJR1VSQVRJT05fS0VZfSBmcm9tIFwiLi9iYXNlLmpzXCJcblxuZXhwb3J0IGNvbnN0IENMT1NFRF9DT05ORUNUSU9OID0gU3ltYm9sKFwidmVsb2Npb3VzQ2xvc2VkQ29ubmVjdGlvblwiKVxuY29uc3QgSURMRV9DT05ORUNUSU9OX0NIRUNLRURfSU5fQVQgPSBTeW1ib2woXCJ2ZWxvY2lvdXNJZGxlQ29ubmVjdGlvbkNoZWNrZWRJbkF0XCIpXG5jb25zdCBERUZBVUxUX0lETEVfVElNRU9VVF9NSUxMSVMgPSA1MDAwXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGVuZGluZ0NoZWNrb3V0XG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gZGF0YWJhc2VDb25maWcgLSBSZXNvbHZlZCBkYXRhYmFzZSBjb25maWd1cmF0aW9uIG5lZWRlZCBieSB0aGUgY2hlY2tvdXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmV1c2VLZXkgLSBEYXRhYmFzZSBjb25maWd1cmF0aW9uIHJldXNlIGtleSBuZWVkZWQgYnkgdGhlIGNoZWNrb3V0LlxuICogQHByb3BlcnR5IHsoY29ubmVjdGlvbjogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQpID0+IHZvaWR9IHJlc29sdmUgLSBSZXNvbHZlcyB3aXRoIGFuIGFjdGl2YXRlZCBjb25uZWN0aW9uLlxuICogQHByb3BlcnR5IHsoZXJyb3I6IEVycm9yKSA9PiB2b2lkfSByZWplY3QgLSBSZWplY3RzIHdoZW4gY2hlY2tvdXQgY2Fubm90IGNvbXBsZXRlLlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlUG9vbEFzeW5jVHJhY2tlZE11bHRpQ29ubmVjdGlvbiBleHRlbmRzIEJhc2VQb29sIHtcbiAgLyoqXG4gICAqIEdsb2JhbCBmYWxsYmFjayBjb25uZWN0aW9ucyBrZXllZCBieSBjb25maWd1cmF0aW9uIGluc3RhbmNlIGFuZCBwb29sIGlkZW50aWZpZXIuXG4gICAqIEB0eXBlIHtXZWFrTWFwPGltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgUmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+Pn1cbiAgICovXG4gIHN0YXRpYyBnbG9iYWxDb25uZWN0aW9ucyA9IG5ldyBXZWFrTWFwKClcblxuICBhc3luY0xvY2FsU3RvcmFnZSA9IG5ldyBBc3luY0xvY2FsU3RvcmFnZSgpXG5cbiAgLyoqXG4gICAqIFdoZW4gc2V0LCByZXR1cm5lZCBieSBnZXRDdXJyZW50Q29udGV4dENvbm5lY3Rpb24gd2hlbiBubyBhc3luYyBjb250ZXh0IGV4aXN0cy5cbiAgICogVXNlZCBieSB0aGUgdGVzdCBydW5uZXIgdG8gc2hhcmUgYSBjb25uZWN0aW9uIGJldHdlZW4gdGVzdCBjb2RlIGFuZCBIVFRQIGhhbmRsZXJzXG4gICAqIHJ1bm5pbmcgaW4gdGhlIHNhbWUgcHJvY2VzcyAoaW4tcHJvY2VzcyB0ZXN0IHNlcnZlciBtb2RlKS5cbiAgICogQHR5cGUge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgX3Rlc3RTaGFyZWRDb25uZWN0aW9uID0gdW5kZWZpbmVkXG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdFtdfSAqL1xuICBjb25uZWN0aW9ucyA9IFtdXG5cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59ICovXG4gIGNvbm5lY3Rpb25zSW5Vc2UgPSB7fVxuXG4gIC8qKiBAdHlwZSB7UGVuZGluZ0NoZWNrb3V0W119ICovXG4gIHBlbmRpbmdDaGVja291dHMgPSBbXVxuXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICBjb25uZWN0aW9uc0JlaW5nU3Bhd25lZCA9IDBcblxuICAvKiogQHR5cGUge1Byb21pc2U8dm9pZD4gfCB1bmRlZmluZWR9ICovXG4gIHBlbmRpbmdDaGVja291dERyYWluUHJvbWlzZSA9IHVuZGVmaW5lZFxuXG4gIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWR9ICovXG4gIGlkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogSW4tZmxpZ2h0IGNvbm5lY3Rpb24tY2xvc2UgcHJvbWlzZXMuIFRoZSBpZGxlIHJlYXBlciBpcyBhcm1lZCBvbiBjaGVjay1pblxuICAgKiBhbmQgcnVucyBmaXJlLWFuZC1mb3JnZXQgd2hlbiBpdHMgdGltZXIgZmlyZXMsIHNvIGEgc2NoZWR1bGVkIHJlYXAgY2FuIGJlXG4gICAqIGNsb3NpbmcgYSBjb25uZWN0aW9uIHdoaWxlIGFuIGV4cGxpY2l0IGByZWFwSWRsZUNvbm5lY3Rpb25zKClgIChvclxuICAgKiBgY2xlYXJJZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyKClgKSBydW5zLiBUcmFja2luZyB0aGUgaW4tZmxpZ2h0IGNsb3NlcyBsZXRzXG4gICAqIHRob3NlIGNhbGxlcnMgYXdhaXQgdGhlbSwgc28gb25jZSBhIHJlYXAgcmVzb2x2ZXMgdGhlIGNvbm5lY3Rpb25zIGl0XG4gICAqIGV4cGlyZWQgYXJlIGZ1bGx5IGNsb3NlZCBpbnN0ZWFkIG9mIGhhbGYtY2xvc2VkIG1pZC1gY2xvc2UoKWAuXG4gICAqIEB0eXBlIHtTZXQ8UHJvbWlzZTx2b2lkPj59XG4gICAqL1xuICBpbmZsaWdodENvbm5lY3Rpb25DbG9zZXMgPSBuZXcgU2V0KClcblxuICAvKipcbiAgICogSW4tZmxpZ2h0IGNsb3NlIHByb21pc2UgcGVyIGNvbm5lY3Rpb24sIHNvIGNvbmN1cnJlbnQgY2xvc2VzIG9mIHRoZSBzYW1lXG4gICAqIGNvbm5lY3Rpb24gYXdhaXQgdGhlIHNhbWUgY2xvc2UgcmF0aGVyIHRoYW4gY2xvc2luZyB0aGUgZHJpdmVyIGhhbmRsZSB0d2ljZS5cbiAgICogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBQcm9taXNlPHZvaWQ+Pn1cbiAgICovXG4gIGNvbm5lY3Rpb25DbG9zZVByb21pc2VzID0gbmV3IFdlYWtNYXAoKVxuXG4gIGlkU2VxID0gMFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuaWRlbnRpZmllciAtIElkZW50aWZpZXIuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgaWRlbnRpZmllcn0pIHtcbiAgICBzdXBlcih7Y29uZmlndXJhdGlvbiwgaWRlbnRpZmllcn0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIERhdGFiYXNlIGNvbm5lY3Rpb24gaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2hlY2tlZCBpbiBvciBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBjaGVja2luKGNvbm5lY3Rpb24pIHtcbiAgICBjb25zdCBpZCA9IGNvbm5lY3Rpb24uZ2V0SWRTZXEoKVxuXG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpZFNlcSBvbiBjb25uZWN0aW9uIHdhc24ndCBzZXQ/ICcke3R5cGVvZiBpZH0nID0gJHtpZH1gKVxuICAgIH1cblxuICAgIGlmIChpZCBpbiB0aGlzLmNvbm5lY3Rpb25zSW5Vc2UpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmNvbm5lY3Rpb25zSW5Vc2VbaWRdXG4gICAgfVxuXG4gICAgY29ubmVjdGlvbi5zZXRJZFNlcSh1bmRlZmluZWQpXG5cbiAgICBjb25zdCB0cmFja2VkQ29ubmVjdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgJiB7W0NMT1NFRF9DT05ORUNUSU9OXT86IGJvb2xlYW4sIFtJRExFX0NPTk5FQ1RJT05fQ0hFQ0tFRF9JTl9BVF0/OiBudW1iZXJ9fSAqLyAoY29ubmVjdGlvbilcblxuICAgIGlmICh0cmFja2VkQ29ubmVjdGlvbltDTE9TRURfQ09OTkVDVElPTl0pIHJldHVyblxuXG4gICAgYXdhaXQgdGhpcy5yb2xsYmFja0xlZnRPcGVuVHJhbnNhY3Rpb24oY29ubmVjdGlvbilcblxuICAgIHRyYWNrZWRDb25uZWN0aW9uW0lETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUXSA9IERhdGUubm93KClcbiAgICB0aGlzLmNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbilcbiAgICBhd2FpdCB0aGlzLmRyYWluUGVuZGluZ0NoZWNrb3V0cygpXG5cbiAgICBpZiAodGhpcy5pZGxlVGltZW91dE1pbGxpcygpID09PSAwKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlYXBJZGxlQ29ubmVjdGlvbnMoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjaGVkdWxlSWRsZUNvbm5lY3Rpb25SZWFwZXIoKVxuICAgIH1cblxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjaGVja291dC4gICovXG4gIGFzeW5jIGNoZWNrb3V0KCkge1xuICAgIGNvbnN0IGRhdGFiYXNlQ29uZmlnID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKClcbiAgICBjb25zdCByZXVzZUtleSA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KClcbiAgICBsZXQgY29ubmVjdGlvbiA9IHRoaXMudGFrZUlkbGVDb25uZWN0aW9uRm9yUmV1c2VLZXkocmV1c2VLZXkpXG5cbiAgICBpZiAoY29ubmVjdGlvbikgcmV0dXJuIHRoaXMuYWN0aXZhdGVDb25uZWN0aW9uKGNvbm5lY3Rpb24pXG5cbiAgICBhd2FpdCB0aGlzLnJlYXBJZGxlQ29ubmVjdGlvbnMoKVxuICAgIGNvbm5lY3Rpb24gPSB0aGlzLnRha2VJZGxlQ29ubmVjdGlvbkZvclJldXNlS2V5KHJldXNlS2V5KVxuXG4gICAgaWYgKGNvbm5lY3Rpb24pIHJldHVybiB0aGlzLmFjdGl2YXRlQ29ubmVjdGlvbihjb25uZWN0aW9uKVxuXG4gICAgaWYgKHRoaXMuY2FuU3Bhd25Db25uZWN0aW9uKCkpIHtcbiAgICAgIC8vIFNwYXduIHZpYSBzcGF3bkNvbm5lY3Rpb24oKSBzbyB0aGUgdGVuYW50LWF3YXJlIGNvbmZpZ3VyYXRpb24gaXMgcmVzb2x2ZWQgRlJFU0ggYXRcbiAgICAgIC8vIHNwYXduIHRpbWUgZm9yIHRoZSBjdXJyZW50IGNhbGxlci4gUmV1c2luZyB0aGUgZGF0YWJhc2VDb25maWcgY2FwdHVyZWQgYXQgdGhlIHRvcCBvZlxuICAgICAgLy8gY2hlY2tvdXQoKSBjb3VsZCBiaW5kIHRoZSBjb25uZWN0aW9uIHRvIGEgc3RhbGUgdGVuYW50L2RhdGFiYXNlLCB3aGljaCBicmVha3NcbiAgICAgIC8vIHBlci1yZXF1ZXN0IGlzb2xhdGlvbiAoZS5nLiB0ZXN0IHRydW5jYXRpb24gYXBwZWFyaW5nIG5vdCB0byB0YWtlIGVmZmVjdCkuIFRoZSBxdWV1ZWRcbiAgICAgIC8vIHBhdGggYmVsb3cga2VlcHMgdGhlIHdhaXRpbmcgY2FsbGVyJ3MgY2FwdHVyZWQgY29uZmlnIHZpYSB3YWl0Rm9yQ2hlY2tvdXQoKS5cbiAgICAgIGNvbm5lY3Rpb24gPSBhd2FpdCB0aGlzLnNwYXduQ29ubmVjdGlvbigpXG5cbiAgICAgIHJldHVybiB0aGlzLmFjdGl2YXRlQ29ubmVjdGlvbihjb25uZWN0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLndhaXRGb3JDaGVja291dChkYXRhYmFzZUNvbmZpZywgcmV1c2VLZXkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJldXNlS2V5IC0gRGF0YWJhc2UgY29uZmlndXJhdGlvbiByZXVzZSBrZXkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmluY2x1ZGVPcGVuVHJhbnNhY3Rpb25zXSAtIFdoZXRoZXIgY29ubmVjdGlvbnMgd2l0aCBvcGVuIHRyYW5zYWN0aW9ucyBtYXkgYmUgcmV0dXJuZWQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gLSBNYXRjaGluZyBpZGxlIGNvbm5lY3Rpb24uXG4gICAqL1xuICB0YWtlSWRsZUNvbm5lY3Rpb25Gb3JSZXVzZUtleShyZXVzZUtleSwge2luY2x1ZGVPcGVuVHJhbnNhY3Rpb25zID0gdHJ1ZX0gPSB7fSkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25JbmRleCA9IHRoaXMuY29ubmVjdGlvbnMuZmluZEluZGV4KChxdWV1ZWRDb25uZWN0aW9uKSA9PiB7XG4gICAgICBpZiAoIWluY2x1ZGVPcGVuVHJhbnNhY3Rpb25zICYmIHRoaXMuY29ubmVjdGlvbkhhc09wZW5UcmFuc2FjdGlvbihxdWV1ZWRDb25uZWN0aW9uKSkgcmV0dXJuIGZhbHNlXG5cbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25NYXRjaGVzUmV1c2VLZXkocXVldWVkQ29ubmVjdGlvbiwgcmV1c2VLZXkpXG4gICAgfSlcbiAgICBjb25zdCBjb25uZWN0aW9uID0gY29ubmVjdGlvbkluZGV4ID09PSAtMSA/IHVuZGVmaW5lZCA6IHRoaXMuY29ubmVjdGlvbnMuc3BsaWNlKGNvbm5lY3Rpb25JbmRleCwgMSlbMF1cblxuICAgIHJldHVybiBjb25uZWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIENvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXVzZUtleSAtIERhdGFiYXNlIGNvbmZpZ3VyYXRpb24gcmV1c2Uga2V5LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBjb25uZWN0aW9uIG1hdGNoZXMgdGhlIHJldXNlIGtleS5cbiAgICovXG4gIGNvbm5lY3Rpb25NYXRjaGVzUmV1c2VLZXkoY29ubmVjdGlvbiwgcmV1c2VLZXkpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uV2l0aFBvb2xLZXkgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0ICYge1tQT09MX0NPTkZJR1VSQVRJT05fS0VZXT86IHN0cmluZ319ICovIChjb25uZWN0aW9uKVxuXG4gICAgcmV0dXJuIGNvbm5lY3Rpb25XaXRoUG9vbEtleVtQT09MX0NPTkZJR1VSQVRJT05fS0VZXSA9PT0gcmV1c2VLZXlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gQ29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSAtIEFjdGl2YXRlZCBjb25uZWN0aW9uLlxuICAgKi9cbiAgYWN0aXZhdGVDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICBpZiAoY29ubmVjdGlvbi5nZXRJZFNlcSgpICE9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihgQ29ubmVjdGlvbiBhbHJlYWR5IGhhcyBhbiBJRC1zZXEgLSBpcyBpdCBpbiB1c2U/ICR7Y29ubmVjdGlvbi5nZXRJZFNlcSgpfWApXG5cbiAgICBjb25zdCBpZCA9IHRoaXMuaWRTZXErK1xuXG4gICAgY29uc3QgdHJhY2tlZENvbm5lY3Rpb24gPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0ICYge1tJRExFX0NPTk5FQ1RJT05fQ0hFQ0tFRF9JTl9BVF0/OiBudW1iZXJ9fSAqLyAoY29ubmVjdGlvbilcbiAgICBkZWxldGUgdHJhY2tlZENvbm5lY3Rpb25bSURMRV9DT05ORUNUSU9OX0NIRUNLRURfSU5fQVRdXG5cbiAgICBjb25uZWN0aW9uLnNldElkU2VxKGlkKVxuICAgIHRoaXMuY29ubmVjdGlvbnNJblVzZVtpZF0gPSBjb25uZWN0aW9uXG5cbiAgICByZXR1cm4gY29ubmVjdGlvblxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXIgfCB1bmRlZmluZWR9IC0gQ29uZmlndXJlZCBtYXggbGl2ZSBjb25uZWN0aW9ucy4gKi9cbiAgbWF4Q29ubmVjdGlvbnMoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5wb29sPy5tYXhcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSAmJiB2YWx1ZSA+PSAxKSByZXR1cm4gdmFsdWVcblxuICAgIHJldHVyblxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXJ9IC0gTnVtYmVyIG9mIGxpdmUgYW5kIGluLXByb2dyZXNzIGNvbm5lY3Rpb25zLiAqL1xuICBsaXZlQ29ubmVjdGlvbkNvdW50KCkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gbmV3IFNldChbXG4gICAgICAuLi50aGlzLmNvbm5lY3Rpb25zLFxuICAgICAgLi4uT2JqZWN0LnZhbHVlcyh0aGlzLmNvbm5lY3Rpb25zSW5Vc2UpLFxuICAgICAgdGhpcy5nZXRHbG9iYWxDb25uZWN0aW9uRm9ySWRlbnRpZmllcigpXG4gICAgXS5maWx0ZXIoQm9vbGVhbikpXG5cbiAgICByZXR1cm4gY29ubmVjdGlvbnMuc2l6ZSArIHRoaXMuY29ubmVjdGlvbnNCZWluZ1NwYXduZWRcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGEgbmV3IGNvbm5lY3Rpb24gY2FuIGJlIHNwYXduZWQuICovXG4gIGNhblNwYXduQ29ubmVjdGlvbigpIHtcbiAgICBjb25zdCBtYXhDb25uZWN0aW9ucyA9IHRoaXMubWF4Q29ubmVjdGlvbnMoKVxuXG4gICAgcmV0dXJuIG1heENvbm5lY3Rpb25zID09PSB1bmRlZmluZWQgfHwgdGhpcy5saXZlQ29ubmVjdGlvbkNvdW50KCkgPCBtYXhDb25uZWN0aW9uc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZyAtIFJlc29sdmVkIGRhdGFiYXNlIGNvbmZpZyBmb3IgdGhlIGNoZWNrb3V0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV1c2VLZXkgLSBEYXRhYmFzZSBjb25maWd1cmF0aW9uIHJldXNlIGtleSBmb3IgdGhlIGNoZWNrb3V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IC0gU3Bhd25lZCBjb25uZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgc3Bhd25Db25uZWN0aW9uRm9yQ2hlY2tvdXQoZGF0YWJhc2VDb25maWcsIHJldXNlS2V5KSB7XG4gICAgdGhpcy5jb25uZWN0aW9uc0JlaW5nU3Bhd25lZCsrXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuc3Bhd25Db25uZWN0aW9uV2l0aENvbmZpZ3VyYXRpb24oZGF0YWJhc2VDb25maWcpXG4gICAgICBjb25zdCBjb25uZWN0aW9uV2l0aFBvb2xLZXkgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0ICYge1tQT09MX0NPTkZJR1VSQVRJT05fS0VZXT86IHN0cmluZ319ICovIChjb25uZWN0aW9uKVxuXG4gICAgICBjb25uZWN0aW9uV2l0aFBvb2xLZXlbUE9PTF9DT05GSUdVUkFUSU9OX0tFWV0gPSByZXVzZUtleVxuICAgICAgY29ubmVjdGlvbi5zZXRTY2hlbWFDYWNoZUludmFsaWRhdG9yKCgpID0+IHRoaXMuY2xlYXJTY2hlbWFDYWNoZSgpKVxuXG4gICAgICByZXR1cm4gY29ubmVjdGlvblxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25zQmVpbmdTcGF3bmVkLS1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IGRhdGFiYXNlQ29uZmlnIC0gUmVzb2x2ZWQgZGF0YWJhc2UgY29uZmlnIGZvciB0aGUgY2hlY2tvdXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXVzZUtleSAtIERhdGFiYXNlIGNvbmZpZ3VyYXRpb24gcmV1c2Uga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IC0gUmVzb2x2ZXMgd2l0aCBhbiBhY3RpdmF0ZWQgY29ubmVjdGlvbi5cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JDaGVja291dChkYXRhYmFzZUNvbmZpZywgcmV1c2VLZXkpIHtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRzLnB1c2goe2RhdGFiYXNlQ29uZmlnLCByZWplY3QsIHJlc29sdmUsIHJldXNlS2V5fSlcbiAgICAgIHZvaWQgdGhpcy5kcmFpblBlbmRpbmdDaGVja291dHMoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc3QgY2hlY2tvdXRFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihcIkZhaWxlZCB0byBkcmFpbiBwZW5kaW5nIGRhdGFiYXNlIGNvbm5lY3Rpb24gY2hlY2tvdXRzLlwiLCB7Y2F1c2U6IGVycm9yfSlcblxuICAgICAgICB0aGlzLnJlamVjdFBlbmRpbmdDaGVja291dHMoY2hlY2tvdXRFcnJvcilcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHBlbmRpbmcgY2hlY2tvdXRzIGhhdmUgYmVlbiBkcmFpbmVkIGFzIGZhciBhcyBwb3NzaWJsZS4gKi9cbiAgYXN5bmMgZHJhaW5QZW5kaW5nQ2hlY2tvdXRzKCkge1xuICAgIGlmICh0aGlzLnBlbmRpbmdDaGVja291dERyYWluUHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5wZW5kaW5nQ2hlY2tvdXREcmFpblByb21pc2VcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0RHJhaW5Qcm9taXNlID0gdGhpcy5kcmFpblBlbmRpbmdDaGVja291dHNBY3R1YWwoKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucGVuZGluZ0NoZWNrb3V0RHJhaW5Qcm9taXNlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0RHJhaW5Qcm9taXNlID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gcGVuZGluZyBjaGVja291dHMgaGF2ZSBiZWVuIGRyYWluZWQgYXMgZmFyIGFzIHBvc3NpYmxlLiAqL1xuICBhc3luYyBkcmFpblBlbmRpbmdDaGVja291dHNBY3R1YWwoKSB7XG4gICAgd2hpbGUgKHRoaXMucGVuZGluZ0NoZWNrb3V0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGVja291dCA9IHRoaXMucGVuZGluZ0NoZWNrb3V0c1swXVxuICAgICAgbGV0IGNvbm5lY3Rpb24gPSB0aGlzLnRha2VJZGxlQ29ubmVjdGlvbkZvclJldXNlS2V5KGNoZWNrb3V0LnJldXNlS2V5LCB7aW5jbHVkZU9wZW5UcmFuc2FjdGlvbnM6IGZhbHNlfSlcblxuICAgICAgaWYgKCFjb25uZWN0aW9uKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVhcElkbGVDb25uZWN0aW9ucygpXG4gICAgICAgIGNvbm5lY3Rpb24gPSB0aGlzLnRha2VJZGxlQ29ubmVjdGlvbkZvclJldXNlS2V5KGNoZWNrb3V0LnJldXNlS2V5LCB7aW5jbHVkZU9wZW5UcmFuc2FjdGlvbnM6IGZhbHNlfSlcbiAgICAgIH1cblxuICAgICAgaWYgKCFjb25uZWN0aW9uICYmICF0aGlzLmNhblNwYXduQ29ubmVjdGlvbigpKSB7XG4gICAgICAgIGNvbnN0IGNsb3NlZENvbm5lY3Rpb24gPSBhd2FpdCB0aGlzLmNsb3NlT25lSWRsZUNvbm5lY3Rpb25Gb3JDYXBhY2l0eSgpXG5cbiAgICAgICAgaWYgKGNsb3NlZENvbm5lY3Rpb24pIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICghY29ubmVjdGlvbiAmJiB0aGlzLmNhblNwYXduQ29ubmVjdGlvbigpKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0cy5zaGlmdCgpXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy5zcGF3bkNvbm5lY3Rpb25Gb3JDaGVja291dChjaGVja291dC5kYXRhYmFzZUNvbmZpZywgY2hlY2tvdXQucmV1c2VLZXkpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY2hlY2tvdXQucmVqZWN0KGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihcIkZhaWxlZCB0byBzcGF3biBkYXRhYmFzZSBjb25uZWN0aW9uLlwiLCB7Y2F1c2U6IGVycm9yfSkpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNoZWNrb3V0LnJlc29sdmUodGhpcy5hY3RpdmF0ZUNvbm5lY3Rpb24oY29ubmVjdGlvbikpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICghY29ubmVjdGlvbikgcmV0dXJuXG5cbiAgICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0cy5zaGlmdCgpXG4gICAgICBjaGVja291dC5yZXNvbHZlKHRoaXMuYWN0aXZhdGVDb25uZWN0aW9uKGNvbm5lY3Rpb24pKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIGFuIGlkbGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIHRvIGZyZWUgY2FwYWNpdHkuICovXG4gIGFzeW5jIGNsb3NlT25lSWRsZUNvbm5lY3Rpb25Gb3JDYXBhY2l0eSgpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9ucy5maW5kKChjYW5kaWRhdGUpID0+ICF0aGlzLmNvbm5lY3Rpb25IYXNPcGVuVHJhbnNhY3Rpb24oY2FuZGlkYXRlKSlcblxuICAgIGlmICghY29ubmVjdGlvbikgcmV0dXJuIGZhbHNlXG5cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5jb25uZWN0aW9ucy5maWx0ZXIoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlICE9PSBjb25uZWN0aW9uKVxuICAgIGF3YWl0IHRoaXMuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3Rpb24pXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQpIDogUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byBpbnZva2Ugd2l0aCB0aGUgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgd2l0aENvbm5lY3Rpb24oY2FsbGJhY2spIHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy5jaGVja291dCgpXG4gICAgY29uc3QgaWQgPSBjb25uZWN0aW9uLmdldElkU2VxKClcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bihpZCwgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKGNvbm5lY3Rpb24pXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNraW4oY29ubmVjdGlvbilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gLSBUaGUgY3VycmVudCBjb25uZWN0aW9uLiAgKi9cbiAgZ2V0Q3VycmVudENvbm5lY3Rpb24oKSB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBmYWxsYmFja0Nvbm5lY3Rpb24gPSB0aGlzLmdldEdsb2JhbENvbm5lY3Rpb24oKVxuXG4gICAgICBpZiAoZmFsbGJhY2tDb25uZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxsYmFja0Nvbm5lY3Rpb25cbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSUQgaGFzbid0IGJlZW4gc2V0IGZvciB0aGlzIGFzeW5jIGNvbnRleHRcIilcbiAgICB9XG5cbiAgICBpZiAoIShpZCBpbiB0aGlzLmNvbm5lY3Rpb25zSW5Vc2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbm5lY3Rpb24gJHtpZH0gZG9lc24ndCBleGlzdCBhbnkgbW9yZSAtIGhhcyBpdCBiZWVuIGNoZWNrZWQgaW4gYWdhaW4/YClcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50Q29ubmVjdGlvbiA9IHRoaXMuY29ubmVjdGlvbnNJblVzZVtpZF1cblxuICAgIGlmICghY3VycmVudENvbm5lY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZ2V0IGN1cnJlbnQgY29ubmVjdGlvbiBmcm9tIHRoYXQgSUQ6ICR7aWR9YClcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudENvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBmYWxsYmFjayBjb25uZWN0aW9uIGZvciB0aGlzIHBvb2wgaWRlbnRpZmllciB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIG5vIGFzeW5jIGNvbnRleHQgaXMgYXZhaWxhYmxlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gQ29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0R2xvYmFsQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgY29uc3Qga2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBWZWxvY2lvdXNEYXRhYmFzZVBvb2xBc3luY1RyYWNrZWRNdWx0aUNvbm5lY3Rpb259ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICAgIGxldCBtYXBGb3JDb25maWd1cmF0aW9uID0ga2xhc3MuZ2xvYmFsQ29ubmVjdGlvbnMuZ2V0KHRoaXMuY29uZmlndXJhdGlvbilcblxuICAgIGlmICghbWFwRm9yQ29uZmlndXJhdGlvbikge1xuICAgICAgbWFwRm9yQ29uZmlndXJhdGlvbiA9IHt9XG4gICAgICBrbGFzcy5nbG9iYWxDb25uZWN0aW9ucy5zZXQodGhpcy5jb25maWd1cmF0aW9uLCBtYXBGb3JDb25maWd1cmF0aW9uKVxuICAgIH1cblxuICAgIG1hcEZvckNvbmZpZ3VyYXRpb25bdGhpcy5pZGVudGlmaWVyXSA9IGNvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIGEgZ2xvYmFsIGZhbGxiYWNrIGNvbm5lY3Rpb24gZXhpc3RzIGZvciB0aGlzIHBvb2wgaWRlbnRpZmllciBhbmQgcmV0dXJucyBpdC5cbiAgICogSWYgb25lIGlzIGFscmVhZHkgc2V0LCBpdCBpcyByZXR1cm5lZCBhbmQgYWxzbyBtYWRlIGF2YWlsYWJsZSBpbiB0aGUgcG9vbCBxdWV1ZS5cbiAgICogT3RoZXJ3aXNlIGEgbmV3IGNvbm5lY3Rpb24gaXMgc3Bhd25lZCwgcmVnaXN0ZXJlZCwgYW5kIHF1ZXVlZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+fSAtIFJlc29sdmVzIHdpdGggdGhlIGdsb2JhbCBjb25uZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlR2xvYmFsQ29ubmVjdGlvbigpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0R2xvYmFsQ29ubmVjdGlvbigpXG5cbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZ1xuXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuc3Bhd25Db25uZWN0aW9uKClcblxuICAgIHRoaXMuc2V0R2xvYmFsQ29ubmVjdGlvbihjb25uZWN0aW9uKVxuXG4gICAgcmV0dXJuIGNvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBzaGFyZWQgY29ubmVjdGlvbiBmb3IgdGVzdCBtb2RlIHNvIHRoYXQgSFRUUCBoYW5kbGVycyBydW5uaW5nXG4gICAqIGluIHRoZSBzYW1lIHByb2Nlc3MgY2FuIHJldXNlIHRoZSB0ZXN0IHJ1bm5lcidzIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBTaGFyZWQgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRUZXN0U2hhcmVkQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgdGhpcy5fdGVzdFNoYXJlZENvbm5lY3Rpb24gPSBjb25uZWN0aW9uXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIGNsZWFyVGVzdFNoYXJlZENvbm5lY3Rpb24oKSB7XG4gICAgdGhpcy5fdGVzdFNoYXJlZENvbm5lY3Rpb24gPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb25uZWN0aW9uIHRpZWQgdG8gdGhlIGN1cnJlbnQgYXN5bmMgY29udGV4dCwgaWYgYW55LlxuICAgKiBGYWxscyBiYWNrIHRvIHRoZSB0ZXN0IHNoYXJlZCBjb25uZWN0aW9uIHdoZW4gbm8gYXN5bmMgY29udGV4dCBleGlzdHMuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gLSBUaGUgY3VycmVudCBjb250ZXh0IGNvbm5lY3Rpb24uXG4gICAqL1xuICBnZXRDdXJyZW50Q29udGV4dENvbm5lY3Rpb24oKSB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5fdGVzdFNoYXJlZENvbm5lY3Rpb25cblxuICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRDb25uZWN0aW9uKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IC0gVGhlIGdsb2JhbCBjb25uZWN0aW9uLlxuICAgKi9cbiAgZ2V0R2xvYmFsQ29ubmVjdGlvbigpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5nZXRHbG9iYWxDb25uZWN0aW9uRm9ySWRlbnRpZmllcigpXG5cbiAgICBpZiAoIWNvbm5lY3Rpb24pIHJldHVyblxuICAgIGlmICghdGhpcy5jb25uZWN0aW9uTWF0Y2hlc0N1cnJlbnRDb25maWd1cmF0aW9uKGNvbm5lY3Rpb24pKSByZXR1cm5cblxuICAgIHJldHVybiBjb25uZWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAtIFRoZSBnbG9iYWwgY29ubmVjdGlvbiBmb3IgdGhpcyBwb29sIGlkZW50aWZpZXIuXG4gICAqL1xuICBnZXRHbG9iYWxDb25uZWN0aW9uRm9ySWRlbnRpZmllcigpIHtcbiAgICBjb25zdCBrbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIFZlbG9jaW91c0RhdGFiYXNlUG9vbEFzeW5jVHJhY2tlZE11bHRpQ29ubmVjdGlvbn0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgbWFwRm9yQ29uZmlndXJhdGlvbiA9IGtsYXNzLmdsb2JhbENvbm5lY3Rpb25zLmdldCh0aGlzLmNvbmZpZ3VyYXRpb24pXG5cbiAgICByZXR1cm4gbWFwRm9yQ29uZmlndXJhdGlvbj8uW3RoaXMuaWRlbnRpZmllcl1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgc2NoZW1hIG1ldGFkYXRhIGNhY2hlZCBieSBldmVyeSBsaXZlIGNvbm5lY3Rpb24gb3duZWQgYnkgdGhpcyBwb29sLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBjbGVhclNjaGVtYUNhY2hlKCkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gbmV3IFNldChbXG4gICAgICAuLi50aGlzLmNvbm5lY3Rpb25zLFxuICAgICAgLi4uT2JqZWN0LnZhbHVlcyh0aGlzLmNvbm5lY3Rpb25zSW5Vc2UpLFxuICAgICAgdGhpcy5nZXRHbG9iYWxDb25uZWN0aW9uKCksXG4gICAgICB0aGlzLl90ZXN0U2hhcmVkQ29ubmVjdGlvblxuICAgIF0uZmlsdGVyKEJvb2xlYW4pKVxuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSB7XG4gICAgICBpZiAoY29ubmVjdGlvbikgdGhpcy5fY2xlYXJDb25uZWN0aW9uU2NoZW1hQ2FjaGUoY29ubmVjdGlvbilcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge251bWJlciB8IG51bGx9IC0gSWRsZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgbnVsbCB3aGVuIGRpc2FibGVkLiAqL1xuICBpZGxlVGltZW91dE1pbGxpcygpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnBvb2w/LmlkbGVUaW1lb3V0TWlsbGlzXG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBudWxsXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID49IDApIHJldHVybiB2YWx1ZVxuXG4gICAgcmV0dXJuIERFRkFVTFRfSURMRV9USU1FT1VUX01JTExJU1xuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBzY2hlZHVsZUlkbGVDb25uZWN0aW9uUmVhcGVyKCkge1xuICAgIGlmICh0aGlzLmlkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIpIHJldHVyblxuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBpZGxlVGltZW91dE1pbGxpcyA9IHRoaXMuaWRsZVRpbWVvdXRNaWxsaXMoKVxuXG4gICAgaWYgKGlkbGVUaW1lb3V0TWlsbGlzID09PSBudWxsKSByZXR1cm5cblxuICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5uZXh0SWRsZUNvbm5lY3Rpb25SZWFwRGVsYXkoaWRsZVRpbWVvdXRNaWxsaXMpXG5cbiAgICB0aGlzLmlkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaWRsZUNvbm5lY3Rpb25SZWFwZXJUaW1lciA9IHVuZGVmaW5lZFxuICAgICAgdm9pZCB0aGlzLnJlYXBJZGxlQ29ubmVjdGlvbnMoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbXCJGYWlsZWQgdG8gcmVhcCBpZGxlIGRhdGFiYXNlIGNvbm5lY3Rpb25zOlwiLCBlcnJvcl0pXG4gICAgICB9KVxuICAgIH0sIGRlbGF5KVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmlkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIudW5yZWYgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5pZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyLnVucmVmKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkbGVUaW1lb3V0TWlsbGlzIC0gSWRsZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy5cbiAgICogQHJldHVybnMge251bWJlcn0gLSBEZWxheSBiZWZvcmUgdGhlIG5leHQgcmVhcC5cbiAgICovXG4gIG5leHRJZGxlQ29ubmVjdGlvblJlYXBEZWxheShpZGxlVGltZW91dE1pbGxpcykge1xuICAgIGxldCBkZWxheSA9IGlkbGVUaW1lb3V0TWlsbGlzXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuY29ubmVjdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25IYXNPcGVuVHJhbnNhY3Rpb24oY29ubmVjdGlvbikpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHRyYWNrZWRDb25uZWN0aW9uID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCAmIHtbSURMRV9DT05ORUNUSU9OX0NIRUNLRURfSU5fQVRdPzogbnVtYmVyfX0gKi8gKGNvbm5lY3Rpb24pXG4gICAgICBjb25zdCBjaGVja2VkSW5BdCA9IHRyYWNrZWRDb25uZWN0aW9uW0lETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUXVxuXG4gICAgICBpZiAodHlwZW9mIGNoZWNrZWRJbkF0ICE9PSBcIm51bWJlclwiKSBjb250aW51ZVxuXG4gICAgICBkZWxheSA9IE1hdGgubWluKGRlbGF5LCBNYXRoLm1heCgwLCBpZGxlVGltZW91dE1pbGxpcyAtIChub3cgLSBjaGVja2VkSW5BdCkpKVxuICAgIH1cblxuICAgIHJldHVybiBkZWxheVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyBpZGxlIGNoZWNrZWQtaW4gY29ubmVjdGlvbnMgdGhhdCBoYXZlIGV4Y2VlZGVkIHRoZSBjb25maWd1cmVkIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyByZWFwSWRsZUNvbm5lY3Rpb25zKCkge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBpZGxlVGltZW91dE1pbGxpcyA9IHRoaXMuaWRsZVRpbWVvdXRNaWxsaXMoKVxuXG4gICAgaWYgKGlkbGVUaW1lb3V0TWlsbGlzID09PSBudWxsKSByZXR1cm5cblxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0W119ICovXG4gICAgY29uc3Qga2VwdENvbm5lY3Rpb25zID0gW11cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0W119ICovXG4gICAgY29uc3QgZXhwaXJlZENvbm5lY3Rpb25zID0gW11cblxuICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLmNvbm5lY3Rpb25zKSB7XG4gICAgICBjb25zdCB0cmFja2VkQ29ubmVjdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgJiB7W0NMT1NFRF9DT05ORUNUSU9OXT86IGJvb2xlYW4sIFtJRExFX0NPTk5FQ1RJT05fQ0hFQ0tFRF9JTl9BVF0/OiBudW1iZXJ9fSAqLyAoY29ubmVjdGlvbilcblxuICAgICAgaWYgKHRyYWNrZWRDb25uZWN0aW9uW0NMT1NFRF9DT05ORUNUSU9OXSkgY29udGludWVcbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25IYXNPcGVuVHJhbnNhY3Rpb24oY29ubmVjdGlvbikpIHtcbiAgICAgICAga2VwdENvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbilcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hlY2tlZEluQXQgPSB0cmFja2VkQ29ubmVjdGlvbltJRExFX0NPTk5FQ1RJT05fQ0hFQ0tFRF9JTl9BVF1cbiAgICAgIGNvbnN0IGV4cGlyZWQgPSB0eXBlb2YgY2hlY2tlZEluQXQgPT09IFwibnVtYmVyXCIgJiYgbm93IC0gY2hlY2tlZEluQXQgPj0gaWRsZVRpbWVvdXRNaWxsaXNcblxuICAgICAgaWYgKGV4cGlyZWQpIHtcbiAgICAgICAgZXhwaXJlZENvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGtlcHRDb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb24pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IGtlcHRDb25uZWN0aW9uc1xuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGV4cGlyZWRDb25uZWN0aW9ucykge1xuICAgICAgYXdhaXQgdGhpcy5jbG9zZUNvbm5lY3Rpb24oY29ubmVjdGlvbilcbiAgICB9XG5cbiAgICAvLyBBIGNvbmN1cnJlbnQgZmlyZS1hbmQtZm9yZ2V0IHNjaGVkdWxlZCByZWFwIG1heSBhbHJlYWR5IGJlIGNsb3NpbmdcbiAgICAvLyBjb25uZWN0aW9ucyB0aGlzIGNhbGwgZGlkIG5vdCBleHBpcmUgaXRzZWxmIChpdCBtYXkgaGF2ZSByZW1vdmVkIHRoZW0gZnJvbVxuICAgIC8vIGB0aGlzLmNvbm5lY3Rpb25zYCBmaXJzdCkuIEF3YWl0IHRob3NlIGluLWZsaWdodCBjbG9zZXMgdG9vIHNvIGEgY2FsbGVyXG4gICAgLy8gdGhhdCBhd2FpdHMgYHJlYXBJZGxlQ29ubmVjdGlvbnMoKWAgaXMgZ3VhcmFudGVlZCB0aGUgcG9vbCdzIGlkbGVcbiAgICAvLyBjb25uZWN0aW9ucyBhcmUgZnVsbHkgY2xvc2VkLCBub3QgbWlkLWBjbG9zZSgpYC5cbiAgICBpZiAodGhpcy5pbmZsaWdodENvbm5lY3Rpb25DbG9zZXMuc2l6ZSA+IDApIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbLi4udGhpcy5pbmZsaWdodENvbm5lY3Rpb25DbG9zZXNdKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVJZGxlQ29ubmVjdGlvblJlYXBlcigpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBDb25uZWN0aW9uIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaGFzIGFuIG9wZW4gdHJhbnNhY3Rpb24uXG4gICAqL1xuICBjb25uZWN0aW9uSGFzT3BlblRyYW5zYWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICByZXR1cm4gY29ubmVjdGlvbi5fdHJhbnNhY3Rpb25zQ291bnQgPiAwXG4gIH1cblxuICAvKipcbiAgICogUm9sbHMgYmFjayBhbnkgdHJhbnNhY3Rpb24gYSBwcmV2aW91cyBob2xkZXIgbGVmdCBvcGVuIGJlZm9yZSBhIGNvbm5lY3Rpb25cbiAgICogcmUtZW50ZXJzIHRoZSBpZGxlIHBvb2wuIEEgY29ubmVjdGlvbiByZXR1cm5lZCB0byB0aGUgcG9vbCB3aXRoIGFuIG9wZW5cbiAgICogdHJhbnNhY3Rpb24gd291bGQgb3RoZXJ3aXNlIGJlIGhhbmRlZCB0byBhbiB1bnJlbGF0ZWQgY2hlY2tvdXQsIHdob3NlXG4gICAqIHN0YXJ0VHJhbnNhY3Rpb24oKSB0aGVuIGZhaWxzIHdpdGggXCJBIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgcnVubmluZ1wiIGFuZFxuICAgKiBwb2lzb25zIGV2ZXJ5IGZvbGxvd2luZyBjYWxsZXIgdGhhdCByZXVzZXMgaXQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBDb25uZWN0aW9uIGJlaW5nIGNoZWNrZWQgaW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaG9sZHMgbm8gb3BlbiB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIHJvbGxiYWNrTGVmdE9wZW5UcmFuc2FjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmNvbm5lY3Rpb25IYXNPcGVuVHJhbnNhY3Rpb24oY29ubmVjdGlvbikpIHJldHVyblxuXG4gICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbYFJvbGxpbmcgYmFjayBhIHRyYW5zYWN0aW9uIGxlZnQgb3BlbiBvbiBhIGNvbm5lY3Rpb24gYmVpbmcgY2hlY2tlZCBpbiAoaWRlbnRpZmllcj0ke3RoaXMuaWRlbnRpZmllcn0pLmBdKVxuXG4gICAgd2hpbGUgKHRoaXMuY29ubmVjdGlvbkhhc09wZW5UcmFuc2FjdGlvbihjb25uZWN0aW9uKSkge1xuICAgICAgYXdhaXQgY29ubmVjdGlvbi5yb2xsYmFja1RyYW5zYWN0aW9uKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIENvbm5lY3Rpb24gdG8gY2xvc2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBjbG9zZUNvbm5lY3Rpb24oY29ubmVjdGlvbikge1xuICAgIC8vIElkZW1wb3RlbnQ6IGEgZmlyZS1hbmQtZm9yZ2V0IHNjaGVkdWxlZCByZWFwIGFuZCBhbiBleHBsaWNpdCByZWFwIGNhbiBib3RoXG4gICAgLy8gdGFyZ2V0IHRoZSBzYW1lIGNvbm5lY3Rpb24uIEF3YWl0IHRoZSBpbi1mbGlnaHQgY2xvc2UgaW5zdGVhZCBvZiBjbG9zaW5nXG4gICAgLy8gdHdpY2UgKHdoaWNoIGNhbiB0aHJvdyBvbiB0aGUgZHJpdmVyKSBvciByZXR1cm5pbmcgd2hpbGUgdGhlIHVuZGVybHlpbmdcbiAgICAvLyBoYW5kbGUgaXMgc3RpbGwgb3Blbi5cbiAgICBjb25zdCBleGlzdGluZ0Nsb3NlID0gdGhpcy5jb25uZWN0aW9uQ2xvc2VQcm9taXNlcy5nZXQoY29ubmVjdGlvbilcblxuICAgIGlmIChleGlzdGluZ0Nsb3NlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXhpc3RpbmdDbG9zZVxuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrZWRDb25uZWN0aW9uID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCAmIHtbQ0xPU0VEX0NPTk5FQ1RJT05dPzogYm9vbGVhbiwgW0lETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUXT86IG51bWJlcn19ICovIChjb25uZWN0aW9uKVxuXG4gICAgdHJhY2tlZENvbm5lY3Rpb25bQ0xPU0VEX0NPTk5FQ1RJT05dID0gdHJ1ZVxuICAgIGRlbGV0ZSB0cmFja2VkQ29ubmVjdGlvbltJRExFX0NPTk5FQ1RJT05fQ0hFQ0tFRF9JTl9BVF1cblxuICAgIGNvbnN0IGNsb3NlUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHRyYWNrZWRDb25uZWN0aW9uLmNsb3NlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgYXdhaXQgdHJhY2tlZENvbm5lY3Rpb24uY2xvc2UoKVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdHJhY2tlZENvbm5lY3Rpb24uZGlzY29ubmVjdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGF3YWl0IHRyYWNrZWRDb25uZWN0aW9uLmRpc2Nvbm5lY3QoKVxuICAgICAgfVxuICAgIH0pKClcblxuICAgIHRoaXMuY29ubmVjdGlvbkNsb3NlUHJvbWlzZXMuc2V0KGNvbm5lY3Rpb24sIGNsb3NlUHJvbWlzZSlcbiAgICB0aGlzLmluZmxpZ2h0Q29ubmVjdGlvbkNsb3Nlcy5hZGQoY2xvc2VQcm9taXNlKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNsb3NlUHJvbWlzZVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmluZmxpZ2h0Q29ubmVjdGlvbkNsb3Nlcy5kZWxldGUoY2xvc2VQcm9taXNlKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgY2xlYXJJZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyKCkge1xuICAgIGlmICghdGhpcy5pZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyKSByZXR1cm5cblxuICAgIGNsZWFyVGltZW91dCh0aGlzLmlkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIpXG4gICAgdGhpcy5pZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGFsbCBhY3RpdmUgYW5kIGNhY2hlZCBjb25uZWN0aW9ucyBmb3IgdGhpcyBwb29sLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgY2xvc2VBbGwoKSB7XG4gICAgdGhpcy5jbGVhcklkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIoKVxuICAgIHRoaXMucmVqZWN0UGVuZGluZ0NoZWNrb3V0cyhuZXcgRXJyb3IoXCJEYXRhYmFzZSBwb29sIHdhcyBjbG9zZWQgYmVmb3JlIGNoZWNrb3V0IGNvbXBsZXRlZC5cIikpXG5cbiAgICBjb25zdCBjb25uZWN0aW9ucyA9IG5ldyBTZXQoW1xuICAgICAgLi4udGhpcy5jb25uZWN0aW9ucyxcbiAgICAgIC4uLk9iamVjdC52YWx1ZXModGhpcy5jb25uZWN0aW9uc0luVXNlKSxcbiAgICAgIHRoaXMuZ2V0R2xvYmFsQ29ubmVjdGlvbigpXG4gICAgXS5maWx0ZXIoQm9vbGVhbikpXG5cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gW11cbiAgICB0aGlzLmNvbm5lY3Rpb25zSW5Vc2UgPSB7fVxuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSB7XG4gICAgICBpZiAoIWNvbm5lY3Rpb24pIGNvbnRpbnVlXG5cbiAgICAgIGF3YWl0IHRoaXMuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3Rpb24pXG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBFcnJvciB0byByZWplY3QgcGVuZGluZyBjaGVja291dHMgd2l0aC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZWplY3RQZW5kaW5nQ2hlY2tvdXRzKGVycm9yKSB7XG4gICAgY29uc3QgcGVuZGluZ0NoZWNrb3V0cyA9IHRoaXMucGVuZGluZ0NoZWNrb3V0c1xuXG4gICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRzID0gW11cblxuICAgIGZvciAoY29uc3QgY2hlY2tvdXQgb2YgcGVuZGluZ0NoZWNrb3V0cykge1xuICAgICAgY2hlY2tvdXQucmVqZWN0KGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgZ2xvYmFsbHkgcmVnaXN0ZXJlZCBmYWxsYmFjayBjb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IFtjb25uZWN0aW9uc10gLSBDb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFtjb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBzZXRHbG9iYWxDb25uZWN0aW9ucyhjb25uZWN0aW9ucywgY29uZmlndXJhdGlvbikge1xuICAgIGlmICghY29ubmVjdGlvbnMgJiYgIWNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHRoaXMuZ2xvYmFsQ29ubmVjdGlvbnMgPSBuZXcgV2Vha01hcCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHRoaXMuZ2xvYmFsQ29ubmVjdGlvbnMgPSBuZXcgV2Vha01hcCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmdsb2JhbENvbm5lY3Rpb25zLnNldChjb25maWd1cmF0aW9uLCBjb25uZWN0aW9ucyB8fCB7fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgZ2xvYmFsbHkgcmVnaXN0ZXJlZCBmYWxsYmFjayBjb25uZWN0aW9ucyBmb3IgYWxsIGNvbmZpZ3VyYXRpb25zIG9yIGEgc2luZ2xlIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBbY29uZmlndXJhdGlvbl0gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzdGF0aWMgY2xlYXJHbG9iYWxDb25uZWN0aW9ucyhjb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB7XG4gICAgICB0aGlzLmdsb2JhbENvbm5lY3Rpb25zID0gbmV3IFdlYWtNYXAoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5nbG9iYWxDb25uZWN0aW9ucy5kZWxldGUoY29uZmlndXJhdGlvbilcbiAgfVxufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-column.d.ts","sourceRoot":"","sources":["../../../../src/database/table-data/table-column.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;GAiBG;AAEH;IACE;;;OAGG;IACH,kBAHW,MAAM,SACN,mBAAmB,EAwB7B;IAFC,0BAAsB;IACtB,aAAgB;IAGlB;;OAEG;IACH,WAFa,MAAM,CAEW;IAE9B;;OAEG;IACH,cAFa,MAAM,GAAG,SAAS,CAEM;IAErC;;;OAGG;IACH,oBAHW,MAAM,GACJ,IAAI,CAE8B;IAAzB,6BAAuB;IAE7C;;OAEG;IACH,iBAFa,MAAM,CAE2C;IAE9D;;OAEG;IACH,oBAFa,OAAO,CAE2C;IAE/D;;;OAGG;IACH,mCAHW,OAAO,GACL,IAAI,CAEgE;IAEjF;;OAEG;IACH,cAFa,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAEI;IAE1C;;;OAGG;IACH,uBAHW,GAAG,GACD,IAAI,CAEwC;IAEzD;;OAEG;IACH,iBAFa,OAAO,CAEqC;IAEzD;;OAEG;IACH,iBAFa,OAAO,GAAG,MAAM,GAAG,SAAS,CAEO;IAEhD;;;OAGG;IACH,6BAHW,OAAO,GAAG,MAAM,GAAG,SAAS,GAC1B,IAAI,CAEoD;IAErE;;OAEG;IACH,YAFa,OAAO,GAAC,YAAY,CAEc;IAE/C;;OAEG;IACH,gBAFa,YAAY,CAQxB;IAED,0BAMC;IAED;;;OAGG;IACH,mBAHW,OAAO,GAAC,YAAY,GAClB,IAAI,CAEgC;IAEjD;;OAEG;IACH,gBAFa,MAAM,GAAG,SAAS,CAEe;IAE9C;;;OAGG;IACH,2BAHW,MAAM,GAAG,SAAS,GAChB,IAAI,CAEgD;IAEjE;;OAEG;IACH,YAFa,MAAM,GAAG,SAAS,CAEO;IAEtC;;;OAGG;IACH,mBAHW,MAAM,GAAG,SAAS,GAChB,IAAI,CAEgC;IAEjD;;OAEG;IACH,WAFa,OAAO,GAAG,SAAS,CAEI;IAEpC;;;OAGG;IACH,kBAHW,OAAO,GACL,IAAI,CAE8B;IAE/C;;OAEG;IACH,gBAFa,MAAM,GAAG,SAAS,CAEe;IAE9C;;OAEG;IACH,iBAFa,OAAO,CAEqC;IAEzD;;;OAGG;IACH,6BAHW,OAAO,GACL,IAAI,CAEoD;IAErE;;OAEG;IACH,YAFa,MAAM,GAAG,SAAS,CAEO;IAEtC;;OAEG;IACH,WAFa,MAAM,GAAG,SAAS,CAEK;IAEpC;;;OAGG;IACH,iBAHW,MAAM,GAAG,SAAS,GAChB,IAAI,CAE4B;IAE7C;;OAEG;IACH,oBAFa,MAAM,GAAG,SAAS,CAI9B;IAED;;;OAGG;IACH,kCAHW,MAAM,GACJ,MAAM,GAAG,SAAS,CAM9B;IAED;;OAEG;IACH,eAFa,OAAO,CAEoC;IAExD;;;;;;OAMG;IACH,+DALG;QAAsB,aAAa,EAA3B,OAAO;QACoC,MAAM,EAAjD,OAAO,oBAAoB,EAAE,OAAO;QACrB,cAAc;KACrC,GAAU,MAAM,
|
|
1
|
+
{"version":3,"file":"table-column.d.ts","sourceRoot":"","sources":["../../../../src/database/table-data/table-column.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;GAiBG;AAEH;IACE;;;OAGG;IACH,kBAHW,MAAM,SACN,mBAAmB,EAwB7B;IAFC,0BAAsB;IACtB,aAAgB;IAGlB;;OAEG;IACH,WAFa,MAAM,CAEW;IAE9B;;OAEG;IACH,cAFa,MAAM,GAAG,SAAS,CAEM;IAErC;;;OAGG;IACH,oBAHW,MAAM,GACJ,IAAI,CAE8B;IAAzB,6BAAuB;IAE7C;;OAEG;IACH,iBAFa,MAAM,CAE2C;IAE9D;;OAEG;IACH,oBAFa,OAAO,CAE2C;IAE/D;;;OAGG;IACH,mCAHW,OAAO,GACL,IAAI,CAEgE;IAEjF;;OAEG;IACH,cAFa,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAEI;IAE1C;;;OAGG;IACH,uBAHW,GAAG,GACD,IAAI,CAEwC;IAEzD;;OAEG;IACH,iBAFa,OAAO,CAEqC;IAEzD;;OAEG;IACH,iBAFa,OAAO,GAAG,MAAM,GAAG,SAAS,CAEO;IAEhD;;;OAGG;IACH,6BAHW,OAAO,GAAG,MAAM,GAAG,SAAS,GAC1B,IAAI,CAEoD;IAErE;;OAEG;IACH,YAFa,OAAO,GAAC,YAAY,CAEc;IAE/C;;OAEG;IACH,gBAFa,YAAY,CAQxB;IAED,0BAMC;IAED;;;OAGG;IACH,mBAHW,OAAO,GAAC,YAAY,GAClB,IAAI,CAEgC;IAEjD;;OAEG;IACH,gBAFa,MAAM,GAAG,SAAS,CAEe;IAE9C;;;OAGG;IACH,2BAHW,MAAM,GAAG,SAAS,GAChB,IAAI,CAEgD;IAEjE;;OAEG;IACH,YAFa,MAAM,GAAG,SAAS,CAEO;IAEtC;;;OAGG;IACH,mBAHW,MAAM,GAAG,SAAS,GAChB,IAAI,CAEgC;IAEjD;;OAEG;IACH,WAFa,OAAO,GAAG,SAAS,CAEI;IAEpC;;;OAGG;IACH,kBAHW,OAAO,GACL,IAAI,CAE8B;IAE/C;;OAEG;IACH,gBAFa,MAAM,GAAG,SAAS,CAEe;IAE9C;;OAEG;IACH,iBAFa,OAAO,CAEqC;IAEzD;;;OAGG;IACH,6BAHW,OAAO,GACL,IAAI,CAEoD;IAErE;;OAEG;IACH,YAFa,MAAM,GAAG,SAAS,CAEO;IAEtC;;OAEG;IACH,WAFa,MAAM,GAAG,SAAS,CAEK;IAEpC;;;OAGG;IACH,iBAHW,MAAM,GAAG,SAAS,GAChB,IAAI,CAE4B;IAE7C;;OAEG;IACH,oBAFa,MAAM,GAAG,SAAS,CAI9B;IAED;;;OAGG;IACH,kCAHW,MAAM,GACJ,MAAM,GAAG,SAAS,CAM9B;IAED;;OAEG;IACH,eAFa,OAAO,CAEoC;IAExD;;;;;;OAMG;IACH,+DALG;QAAsB,aAAa,EAA3B,OAAO;QACoC,MAAM,EAAjD,OAAO,oBAAoB,EAAE,OAAO;QACrB,cAAc;KACrC,GAAU,MAAM,CA8IlB;CACF;2BA3XY;IAAC,MAAM,EAAE,OAAO,CAAA;CAAC;;;;;;;;;cAUhB,GAAG"}
|
|
@@ -303,7 +303,10 @@ export default class TableColumn {
|
|
|
303
303
|
}
|
|
304
304
|
sql += ")";
|
|
305
305
|
}
|
|
306
|
-
else if (defaultValue) {
|
|
306
|
+
else if (defaultValue !== undefined && defaultValue !== null) {
|
|
307
|
+
// Emit falsy defaults too (`0`, `false`, `""`). A truthiness check here
|
|
308
|
+
// silently dropped `default: 0`, leaving the column NOT NULL with no
|
|
309
|
+
// default so inserts that omit it fail in strict mode.
|
|
307
310
|
sql += ` DEFAULT ${options.quote(defaultValue)}`;
|
|
308
311
|
}
|
|
309
312
|
if (this.getPrimaryKey())
|
|
@@ -333,4 +336,4 @@ export default class TableColumn {
|
|
|
333
336
|
return sql;
|
|
334
337
|
}
|
|
335
338
|
}
|
|
336
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY29sdW1uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3RhYmxlLWRhdGEvdGFibGUtY29sdW1uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7R0FFRztBQUVILE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sYUFBYSxNQUFNLGdDQUFnQyxDQUFBO0FBQzFELE9BQU8sZUFBZSxNQUFNLHdCQUF3QixDQUFBO0FBRXBEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVILE1BQU0sQ0FBQyxPQUFPLE9BQU8sV0FBVztJQUM5Qjs7O09BR0c7SUFDSCxZQUFZLElBQUksRUFBRSxJQUFJO1FBQ3BCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxNQUFNLEVBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLFFBQVEsRUFBQyxHQUFHLElBQUksQ0FBQSxDQUFDLHFDQUFxQztZQUU3TyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUE7WUFDckMsQ0FBQztZQUVELGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUV2QiwwREFBMEQ7WUFDMUQsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxjQUFjLEdBQUcsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJ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QUFFLENBQUE7Z0JBQ3ZELGVBQWUsR0FBRyxVQUFVLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtZQUN2RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsVUFBVSxLQUFLLE9BQU8sVUFBVSxHQUFHLENBQUMsQ0FBQTtZQUN6RixDQUFDO1lBRUQsR0FBRyxJQUFJLGVBQWUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQTtRQUMvRyxDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAdHlwZWRlZiB7e3VuaXF1ZTogYm9vbGVhbn19IEluZGV4QXJnVHlwZVxuICovXG5cbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uLy4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5pbXBvcnQgVGFibGVGb3JlaWduS2V5IGZyb20gXCIuL3RhYmxlLWZvcmVpZ24ta2V5LmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUYWJsZUNvbHVtbkFyZ3NUeXBlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFthdXRvSW5jcmVtZW50XSAtIFdoZXRoZXIgdGhlIGNvbHVtbiBhdXRvLWluY3JlbWVudHMuXG4gKiBAcHJvcGVydHkge2FueX0gW2RlZmF1bHRdIC0gRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGNvbHVtbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Ryb3BDb2x1bW5dIC0gV2hldGhlciB0aGUgY29sdW1uIHNob3VsZCBiZSBkcm9wcGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufG9iamVjdH0gW2ZvcmVpZ25LZXldIC0gRm9yZWlnbiBrZXkgb3B0aW9ucyBvciBmbGFnLlxuICogQHByb3BlcnR5IHtib29sZWFufEluZGV4QXJnVHlwZX0gW2luZGV4XSAtIFdoZXRoZXIgdGhlIGNvbHVtbiBzaG91bGQgYmUgaW5kZXhlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lzTmV3Q29sdW1uXSAtIFdoZXRoZXIgdGhpcyBjb2x1bW4gaXMgYmVpbmcgYWRkZWQgaW4gYSBtaWdyYXRpb24uXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2xpbWl0XSAtIEFsaWFzIGZvciBtYXhMZW5ndGggKHZhcmNoYXIgbGVuZ3RoIGxpbWl0KS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4TGVuZ3RoXSAtIE1heGltdW0gbGVuZ3RoIGZvciB0aGUgY29sdW1uIHZhbHVlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub3Rlc10gLSBDb2x1bW4gbm90ZXMgb3IgY29tbWVudC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW251bGxdIC0gV2hldGhlciB0aGUgY29sdW1uIGFsbG93cyBudWxsIHZhbHVlcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3BvbHltb3JwaGljXSAtIFdoZXRoZXIgdGhlIGNvbHVtbiBpcyBwb2x5bW9ycGhpYy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcHJlY2lzaW9uXSAtIE51bWVyaWMgcHJlY2lzaW9uICh0b3RhbCBkaWdpdHMpIGZvciBkZWNpbWFsL251bWVyaWMgdHlwZXMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwcmltYXJ5S2V5XSAtIFdoZXRoZXIgdGhlIGNvbHVtbiBpcyBhIHByaW1hcnkga2V5LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtzY2FsZV0gLSBOdW1lcmljIHNjYWxlIChkaWdpdHMgYWZ0ZXIgZGVjaW1hbCBwb2ludCkgZm9yIGRlY2ltYWwvbnVtZXJpYyB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdHlwZV0gLSBDb2x1bW4gZGF0YSB0eXBlLlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRhYmxlQ29sdW1uIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTmFtZS5cbiAgICogQHBhcmFtIHtUYWJsZUNvbHVtbkFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWUsIGFyZ3MpIHtcbiAgICBpZiAoYXJncykge1xuICAgICAgY29uc3Qge2F1dG9JbmNyZW1lbnQsIGRlZmF1bHQ6IGNvbHVtbkRlZmF1bHQsIGRyb3BDb2x1bW4sIGZvcmVpZ25LZXksIGluZGV4LCBpc05ld0NvbHVtbiwgbGltaXQsIG1heExlbmd0aCwgbm90ZXMsIG51bGw6IGFyZ3NOdWxsLCBwb2x5bW9ycGhpYywgcHJlY2lzaW9uLCBwcmltYXJ5S2V5LCBzY2FsZSwgdHlwZSwgLi4ucmVzdEFyZ3N9ID0gYXJncyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cbiAgICAgIGlmIChPYmplY3Qua2V5cyhhcmdzKS5sZW5ndGggPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbXB0eSBhcmdzIGdpdmVuXCIpXG4gICAgICB9XG5cbiAgICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICAgIC8vIE5vcm1hbGl6ZSBsaW1pdCDihpIgbWF4TGVuZ3RoIGZvciBzdHJpbmctbGlrZSB0eXBlcyBvbmx5LlxuICAgICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgbWF4TGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0eXBlb2YgdHlwZSA9PT0gXCJzdHJpbmdcIiA/IHR5cGUudG9Mb3dlckNhc2UoKSA6IFwiXCJcblxuICAgICAgICBpZiAobm9ybWFsaXplZFR5cGUgPT09IFwic3RyaW5nXCIgfHwgbm9ybWFsaXplZFR5cGUgPT09IFwidGV4dFwiIHx8IG5vcm1hbGl6ZWRUeXBlID09PSBcInZhcmNoYXJcIiB8fCBub3JtYWxpemVkVHlwZSA9PT0gXCJudmFyY2hhclwiIHx8IG5vcm1hbGl6ZWRUeXBlID09PSBcImNoYXJcIikge1xuICAgICAgICAgIGFyZ3MubWF4TGVuZ3RoID0gbGltaXRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYXJncyA9IGFyZ3MgfHwge31cbiAgICB0aGlzLm5hbWUgPSBuYW1lXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZ2V0TmFtZSgpIHsgcmV0dXJuIHRoaXMubmFtZSB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVGhlIG5ldyBuYW1lLlxuICAgKi9cbiAgZ2V0TmV3TmFtZSgpIHsgcmV0dXJuIHRoaXMuX25ld05hbWUgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3TmFtZSAtIE5ldyBuYW1lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXROZXdOYW1lKG5ld05hbWUpIHsgdGhpcy5fbmV3TmFtZSA9IG5ld05hbWUgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBhY3R1YWwgbmFtZS5cbiAgICovXG4gIGdldEFjdHVhbE5hbWUoKSB7IHJldHVybiB0aGlzLmdldE5ld05hbWUoKSB8fCB0aGlzLmdldE5hbWUoKSB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgYXV0byBpbmNyZW1lbnQuXG4gICAqL1xuICBnZXRBdXRvSW5jcmVtZW50KCkgeyByZXR1cm4gdGhpcy5hcmdzPy5hdXRvSW5jcmVtZW50IHx8IGZhbHNlIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtib29sZWFufSBuZXdBdXRvSW5jcmVtZW50IC0gTmV3IGF1dG8gaW5jcmVtZW50LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRBdXRvSW5jcmVtZW50KG5ld0F1dG9JbmNyZW1lbnQpIHsgdGhpcy5hcmdzLmF1dG9JbmNyZW1lbnQgPSBuZXdBdXRvSW5jcmVtZW50IH1cblxuICAvKipcbiAgICogQHJldHVybnMge3Vua25vd24gfCAoKCkgPT4gdW5rbm93bil9IC0gVGhlIGRlZmF1bHQgdmFsdWUgb3IgZmFjdG9yeS5cbiAgICovXG4gIGdldERlZmF1bHQoKSB7IHJldHVybiB0aGlzLmFyZ3M/LmRlZmF1bHQgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gbmV3RGVmYXVsdCAtIE5ldyBkZWZhdWx0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXREZWZhdWx0KG5ld0RlZmF1bHQpIHsgdGhpcy5hcmdzLmRlZmF1bHQgPSBuZXdEZWZhdWx0IH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBkcm9wIGNvbHVtbi5cbiAgICovXG4gIGdldERyb3BDb2x1bW4oKSB7IHJldHVybiB0aGlzLmFyZ3M/LmRyb3BDb2x1bW4gfHwgZmFsc2UgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbiB8IG9iamVjdCB8IHVuZGVmaW5lZH0gLSBXaGV0aGVyIGZvcmVpZ24ga2V5LlxuICAgKi9cbiAgZ2V0Rm9yZWlnbktleSgpIHsgcmV0dXJuIHRoaXMuYXJncz8uZm9yZWlnbktleSB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB8IG9iamVjdCB8IHVuZGVmaW5lZH0gbmV3Rm9yZWlnbktleSAtIE5ldyBmb3JlaWduIGtleS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0Rm9yZWlnbktleShuZXdGb3JlaWduS2V5KSB7IHRoaXMuYXJncy5mb3JlaWduS2V5ID0gbmV3Rm9yZWlnbktleSB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufEluZGV4QXJnVHlwZX0gLSBXaGV0aGVyIGluZGV4LlxuICAgKi9cbiAgZ2V0SW5kZXgoKSB7IHJldHVybiB0aGlzLmFyZ3M/LmluZGV4IHx8IGZhbHNlIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0luZGV4QXJnVHlwZX0gLSBUaGUgaW5kZXggYXJncy5cbiAgICovXG4gIGdldEluZGV4QXJncygpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuYXJncz8uaW5kZXggPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHRoaXMuYXJncy5pbmRleFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge3VuaXF1ZTogZmFsc2V9XG4gICAgfVxuICB9XG5cbiAgZ2V0SW5kZXhVbmlxdWUoKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmFyZ3M/LmluZGV4XG5cbiAgICBpZiAodHlwZW9mIGluZGV4ID09IFwib2JqZWN0XCIgJiYgaW5kZXgudW5pcXVlID09PSB0cnVlKSByZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtib29sZWFufEluZGV4QXJnVHlwZX0gbmV3SW5kZXggLSBOZXcgaW5kZXguXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldEluZGV4KG5ld0luZGV4KSB7IHRoaXMuYXJncy5pbmRleCA9IG5ld0luZGV4IH1cblxuICAvKipcbiAgICogQHJldHVybnMge251bWJlciB8IHVuZGVmaW5lZH0gLSBUaGUgbWF4IGxlbmd0aC5cbiAgICovXG4gIGdldE1heExlbmd0aCgpIHsgcmV0dXJuIHRoaXMuYXJncz8ubWF4TGVuZ3RoIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXIgfCB1bmRlZmluZWR9IG5ld01heExlbmd0aCAtIE5ldyBtYXggbGVuZ3RoLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRNYXhMZW5ndGgobmV3TWF4TGVuZ3RoKSB7IHRoaXMuYXJncy5tYXhMZW5ndGggPSBuZXdNYXhMZW5ndGggfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFRoZSBub3Rlcy5cbiAgICovXG4gIGdldE5vdGVzKCkgeyByZXR1cm4gdGhpcy5hcmdzPy5ub3RlcyB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBuZXdOb3RlcyAtIE5ldyBub3Rlcy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0Tm90ZXMobmV3Tm90ZXMpIHsgdGhpcy5hcmdzLm5vdGVzID0gbmV3Tm90ZXMgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbiB8IHVuZGVmaW5lZH0gLSBXaGV0aGVyIG51bGwuXG4gICAqL1xuICBnZXROdWxsKCkgeyByZXR1cm4gdGhpcy5hcmdzPy5udWxsIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtib29sZWFufSBudWxsYWJsZSAtIFdoZXRoZXIgbnVsbGFibGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldE51bGwobnVsbGFibGUpIHsgdGhpcy5hcmdzLm51bGwgPSBudWxsYWJsZSB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtudW1iZXIgfCB1bmRlZmluZWR9IC0gTnVtZXJpYyBwcmVjaXNpb24gKHRvdGFsIGRpZ2l0cykuXG4gICAqL1xuICBnZXRQcmVjaXNpb24oKSB7IHJldHVybiB0aGlzLmFyZ3M/LnByZWNpc2lvbiB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgcHJpbWFyeSBrZXkuXG4gICAqL1xuICBnZXRQcmltYXJ5S2V5KCkgeyByZXR1cm4gdGhpcy5hcmdzPy5wcmltYXJ5S2V5IHx8IGZhbHNlIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtib29sZWFufSBuZXdQcmltYXJ5S2V5IC0gTmV3IHByaW1hcnkga2V5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRQcmltYXJ5S2V5KG5ld1ByaW1hcnlLZXkpIHsgdGhpcy5hcmdzLnByaW1hcnlLZXkgPSBuZXdQcmltYXJ5S2V5IH1cblxuICAvKipcbiAgICogQHJldHVybnMge251bWJlciB8IHVuZGVmaW5lZH0gLSBOdW1lcmljIHNjYWxlIChkaWdpdHMgYWZ0ZXIgZGVjaW1hbCBwb2ludCkuXG4gICAqL1xuICBnZXRTY2FsZSgpIHsgcmV0dXJuIHRoaXMuYXJncz8uc2NhbGUgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFRoZSB0eXBlLlxuICAgKi9cbiAgZ2V0VHlwZSgpIHsgcmV0dXJuIHRoaXMuYXJncz8udHlwZSB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBuZXdUeXBlIC0gTmV3IHR5cGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldFR5cGUobmV3VHlwZSkgeyB0aGlzLmFyZ3MudHlwZSA9IG5ld1R5cGUgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFRoZSB0eXBlIGhpbnQgbm90ZXMuXG4gICAqL1xuICBnZXRUeXBlSGludE5vdGVzKCkge1xuICAgIGlmICh0aGlzLmdldFR5cGUoKT8udG9Mb3dlckNhc2UoKSA9PSBcImJvb2xlYW5cIikgcmV0dXJuIFwidmVsb2Npb3VzOnR5cGU9Ym9vbGVhblwiXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlVHlwZSAtIERhdGFiYXNlIHR5cGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gTm90ZXMgZm9yIHRoZSBkYXRhYmFzZS5cbiAgICovXG4gIGdldE5vdGVzRm9yRGF0YWJhc2UoZGF0YWJhc2VUeXBlKSB7XG4gICAgaWYgKCFbXCJteXNxbFwiLCBcInBnc3FsXCJdLmluY2x1ZGVzKGRhdGFiYXNlVHlwZSkpIHJldHVyblxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0Tm90ZXMoKSB8fCB0aGlzLmdldFR5cGVIaW50Tm90ZXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgbmV3IGNvbHVtbi5cbiAgICovXG4gIGlzTmV3Q29sdW1uKCkgeyByZXR1cm4gdGhpcy5hcmdzPy5pc05ld0NvbHVtbiB8fCBmYWxzZSB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYXJncy5mb3JBbHRlclRhYmxlIC0gV2hldGhlciBmb3IgYWx0ZXIgdGFibGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MuZHJpdmVyIC0gRGF0YWJhc2UgZHJpdmVyIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnNraXBGb3JlaWduS2V5XSAtIFNraXAgZW1pdHRpbmcgdGhlIGlubGluZSBSRUZFUkVOQ0VTIGNsYXVzZSAodGhlIGNhbGxlciBlbWl0cyBhIHRhYmxlLWxldmVsIEZPUkVJR04gS0VZIGNvbnN0cmFpbnQgaW5zdGVhZCkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU1FMIHN0cmluZy5cbiAgICovXG4gIGdldFNRTCh7Zm9yQWx0ZXJUYWJsZSwgZHJpdmVyLCBza2lwRm9yZWlnbktleSwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGNvbnN0IGRhdGFiYXNlVHlwZSA9IGRyaXZlci5nZXRUeXBlKClcbiAgICBjb25zdCBvcHRpb25zID0gZHJpdmVyLm9wdGlvbnMoKVxuICAgIGxldCBtYXhsZW5ndGggPSB0aGlzLmdldE1heExlbmd0aCgpXG4gICAgbGV0IHR5cGUgPSB0aGlzLmdldFR5cGUoKT8udG9VcHBlckNhc2UoKVxuXG4gICAgaWYgKGRhdGFiYXNlVHlwZSA9PSBcInBnc3FsXCIpIHtcbiAgICAgIGlmICh0eXBlID09IFwiREFURVRJTUVcIikge1xuICAgICAgICB0eXBlID0gXCJUSU1FU1RBTVBcIlxuICAgICAgfSBlbHNlIGlmICh0eXBlID09IFwiVElOWUlOVFwiKSB7XG4gICAgICAgIHR5cGUgPSBcIlNNQUxMSU5UXCJcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcIkJMT0JcIikge1xuICAgICAgICB0eXBlID0gXCJCWVRFQVwiXG4gICAgICAgIG1heGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlID09IFwiU1RSSU5HXCIpIHtcbiAgICAgIHR5cGUgPSBkYXRhYmFzZVR5cGUgPT0gXCJtc3NxbFwiID8gXCJOVkFSQ0hBUlwiIDogXCJWQVJDSEFSXCJcbiAgICAgIG1heGxlbmd0aCB8fD0gMjU1XG4gICAgfVxuICAgIGlmIChkYXRhYmFzZVR5cGUgPT0gXCJteXNxbFwiICYmIHR5cGUgPT0gXCJCT09MRUFOXCIpIHtcbiAgICAgIHR5cGUgPSBcIlRJTllJTlRcIlxuICAgICAgbWF4bGVuZ3RoID0gMVxuICAgIH1cbiAgICBpZiAoZGF0YWJhc2VUeXBlID09IFwicGdzcWxcIiAmJiB0eXBlID09IFwiVElOWUlOVFwiKSB7XG4gICAgICB0eXBlID0gXCJTTUFMTElOVFwiXG4gICAgfVxuXG4gICAgaWYgKGRhdGFiYXNlVHlwZSA9PSBcIm1zc3FsXCIpIHtcbiAgICAgIGlmICh0eXBlID09IFwiQk9PTEVBTlwiKSB7XG4gICAgICAgIHR5cGUgPSBcIkJJVFwiXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJVVUlEXCIpIHtcbiAgICAgICAgdHlwZSA9IFwiVkFSQ0hBUlwiXG4gICAgICAgIG1heGxlbmd0aCB8fD0gMzZcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcIkpTT05cIikge1xuICAgICAgICB0eXBlID0gXCJOVkFSQ0hBUihNQVgpXCJcbiAgICAgICAgbWF4bGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJCTE9CXCIpIHtcbiAgICAgICAgdHlwZSA9IFwiVkFSQklOQVJZKE1BWClcIlxuICAgICAgICBtYXhsZW5ndGggPSB1bmRlZmluZWRcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcIlRFWFRcIikge1xuICAgICAgICB0eXBlID0gXCJOVkFSQ0hBUihNQVgpXCJcbiAgICAgICAgbWF4bGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRhdGFiYXNlVHlwZSA9PSBcInNxbGl0ZVwiICYmIHRoaXMuZ2V0QXV0b0luY3JlbWVudCgpICYmIHRoaXMuZ2V0UHJpbWFyeUtleSgpKSB7XG4gICAgICB0eXBlID0gXCJJTlRFR0VSXCJcbiAgICB9XG5cbiAgICBpZiAoZGF0YWJhc2VUeXBlID09IFwicGdzcWxcIiAmJiB0aGlzLmdldEF1dG9JbmNyZW1lbnQoKSAmJiB0aGlzLmdldFByaW1hcnlLZXkoKSkge1xuICAgICAgdHlwZSA9IFwiU0VSSUFMXCJcbiAgICB9XG5cbiAgICBsZXQgc3FsID0gYCR7b3B0aW9ucy5xdW90ZUNvbHVtbk5hbWUodGhpcy5nZXRBY3R1YWxOYW1lKCkpfSBgXG5cbiAgICBpZiAoZGF0YWJhc2VUeXBlID09IFwicGdzcWxcIiAmJiBmb3JBbHRlclRhYmxlKSBzcWwgKz0gXCJUWVBFIFwiXG4gICAgaWYgKHR5cGUpIHNxbCArPSB0eXBlXG5cbiAgICBjb25zdCBwcmVjaXNpb24gPSB0aGlzLmdldFByZWNpc2lvbigpXG4gICAgY29uc3Qgc2NhbGUgPSB0aGlzLmdldFNjYWxlKClcblxuICAgIGlmICgoc2NhbGUgIT09IHVuZGVmaW5lZCAmJiBzY2FsZSAhPT0gbnVsbCkgJiYgKHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkIHx8IHByZWNpc2lvbiA9PT0gbnVsbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uICcke3RoaXMuZ2V0QWN0dWFsTmFtZSgpfSc6IHNjYWxlIHJlcXVpcmVzIHByZWNpc2lvbiB0byBiZSBzZXRgKVxuICAgIH1cblxuICAgIGlmIChwcmVjaXNpb24gIT09IHVuZGVmaW5lZCAmJiBwcmVjaXNpb24gIT09IG51bGwpIHtcbiAgICAgIHNxbCArPSBzY2FsZSAhPT0gdW5kZWZpbmVkICYmIHNjYWxlICE9PSBudWxsID8gYCgke3ByZWNpc2lvbn0sICR7c2NhbGV9KWAgOiBgKCR7cHJlY2lzaW9ufSlgXG4gICAgfSBlbHNlIGlmICh0eXBlICYmIG1heGxlbmd0aCAhPT0gdW5kZWZpbmVkICYmIG1heGxlbmd0aCAhPT0gbnVsbCkge1xuICAgICAgc3FsICs9IGAoJHttYXhsZW5ndGh9KWBcbiAgICB9XG5cbiAgICBpZiAodGhpcy5nZXRBdXRvSW5jcmVtZW50KCkgJiYgZHJpdmVyLnNob3VsZFNldEF1dG9JbmNyZW1lbnRXaGVuUHJpbWFyeUtleSgpKSB7XG4gICAgICBpZiAoZGF0YWJhc2VUeXBlID09IFwibXNzcWxcIikge1xuICAgICAgICBzcWwgKz0gXCIgSURFTlRJVFlcIlxuICAgICAgfSBlbHNlIGlmIChkYXRhYmFzZVR5cGUgPT0gXCJwZ3NxbFwiKSB7XG4gICAgICAgIGlmICh0aGlzLmdldEF1dG9JbmNyZW1lbnQoKSAmJiB0aGlzLmdldFByaW1hcnlLZXkoKSkge1xuICAgICAgICAgIC8vIERvIG5vdGhpbmdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwZ3NxbCBhdXRvIGluY3JlbWVudCBtdXN0IGJlIHByaW1hcnkga2V5XCIpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNxbCArPSBcIiBBVVRPX0lOQ1JFTUVOVFwiXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5nZXREZWZhdWx0KClcblxuICAgIGlmICh0eXBlb2YgZGVmYXVsdFZhbHVlID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3QgZXZhbHVhdGVkRGVmYXVsdCA9IGRlZmF1bHRWYWx1ZSgpXG5cbiAgICAgIHNxbCArPSBgIERFRkFVTFQgKGBcblxuICAgICAgaWYgKGRhdGFiYXNlVHlwZSA9PSBcInBnc3FsXCIgJiYgZXZhbHVhdGVkRGVmYXVsdCA9PSBcIlVVSUQoKVwiKSB7XG4gICAgICAgIHNxbCArPSBcImdlbl9yYW5kb21fdXVpZCgpXCJcbiAgICAgIH0gZWxzZSBpZiAoZGF0YWJhc2VUeXBlID09IFwibXNzcWxcIiAmJiBldmFsdWF0ZWREZWZhdWx0ID09IFwiVVVJRCgpXCIpIHtcbiAgICAgICAgc3FsICs9IFwiTkVXSUQoKVwiXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcWwgKz0gZXZhbHVhdGVkRGVmYXVsdFxuICAgICAgfVxuXG4gICAgICBzcWwgKz0gXCIpXCJcbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgc3FsICs9IGAgREVGQVVMVCAke29wdGlvbnMucXVvdGUoZGVmYXVsdFZhbHVlKX1gXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2V0UHJpbWFyeUtleSgpKSBzcWwgKz0gXCIgUFJJTUFSWSBLRVlcIlxuICAgIGlmICh0aGlzLmdldE51bGwoKSA9PT0gZmFsc2UpIHNxbCArPSBcIiBOT1QgTlVMTFwiXG5cbiAgICBjb25zdCBub3RlcyA9IHRoaXMuZ2V0Tm90ZXNGb3JEYXRhYmFzZShkYXRhYmFzZVR5cGUpXG5cbiAgICBpZiAobm90ZXMgJiYgZGF0YWJhc2VUeXBlID09IFwibXlzcWxcIikge1xuICAgICAgc3FsICs9IGAgQ09NTUVOVCAke29wdGlvbnMucXVvdGUobm90ZXMpfWBcbiAgICB9XG5cbiAgICBjb25zdCBmb3JlaWduS2V5ID0gc2tpcEZvcmVpZ25LZXkgPyB1bmRlZmluZWQgOiB0aGlzLmdldEZvcmVpZ25LZXkoKVxuXG4gICAgaWYgKGZvcmVpZ25LZXkpIHtcbiAgICAgIGxldCBmb3JlaWduS2V5VGFibGUsIGZvcmVpZ25LZXlDb2x1bW5cblxuICAgICAgaWYgKGZvcmVpZ25LZXkgPT09IHRydWUpIHtcbiAgICAgICAgZm9yZWlnbktleUNvbHVtbiA9IFwiaWRcIlxuICAgICAgICBmb3JlaWduS2V5VGFibGUgPSBpbmZsZWN0aW9uLnBsdXJhbGl6ZSh0aGlzLmdldEFjdHVhbE5hbWUoKS5yZXBsYWNlKC9faWQkLywgXCJcIikpXG4gICAgICB9IGVsc2UgaWYgKGZvcmVpZ25LZXkgaW5zdGFuY2VvZiBUYWJsZUZvcmVpZ25LZXkpIHtcbiAgICAgICAgZm9yZWlnbktleUNvbHVtbiA9IGZvcmVpZ25LZXkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKVxuICAgICAgICBmb3JlaWduS2V5VGFibGUgPSBmb3JlaWduS2V5LmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZvcmVpZ24ga2V5IHR5cGUgZ2l2ZW46ICR7Zm9yZWlnbktleX0gKCR7dHlwZW9mIGZvcmVpZ25LZXl9KWApXG4gICAgICB9XG5cbiAgICAgIHNxbCArPSBgIFJFRkVSRU5DRVMgJHtvcHRpb25zLnF1b3RlVGFibGVOYW1lKGZvcmVpZ25LZXlUYWJsZSl9KCR7b3B0aW9ucy5xdW90ZUNvbHVtbk5hbWUoZm9yZWlnbktleUNvbHVtbil9KWBcbiAgICB9XG5cbiAgICByZXR1cm4gc3FsXG4gIH1cbn1cbiJdfQ==
|
|
339
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY29sdW1uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3RhYmxlLWRhdGEvdGFibGUtY29sdW1uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7R0FFRztBQUVILE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sYUFBYSxNQUFNLGdDQUFnQyxDQUFBO0FBQzFELE9BQU8sZUFBZSxNQUFNLHdCQUF3QixDQUFBO0FBRXBEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVILE1BQU0sQ0FBQyxPQUFPLE9BQU8sV0FBVztJQUM5Qjs7O09BR0c7SUFDSCxZQUFZLElBQUksRUFBRSxJQUFJO1FBQ3BCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxNQUFNLEVBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLFFBQVEsRUFBQyxHQUFHLElBQUksQ0FBQSxDQUFDLHFDQUFxQztZQUU3TyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUE7WUFDckMsQ0FBQztZQUVELGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUV2QiwwREFBMEQ7WUFDMUQsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxjQUFjLEdBQUcsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJ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TSxJQUFJLFVBQVUsWUFBWSxlQUFlLEVBQUUsQ0FBQztnQkFDakQsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLHVCQUF1QixFQUFFLENBQUE7Z0JBQ3ZELGVBQWUsR0FBRyxVQUFVLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtZQUN2RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsVUFBVSxLQUFLLE9BQU8sVUFBVSxHQUFHLENBQUMsQ0FBQTtZQUN6RixDQUFDO1lBRUQsR0FBRyxJQUFJLGVBQWUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQTtRQUMvRyxDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAdHlwZWRlZiB7e3VuaXF1ZTogYm9vbGVhbn19IEluZGV4QXJnVHlwZVxuICovXG5cbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uLy4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5pbXBvcnQgVGFibGVGb3JlaWduS2V5IGZyb20gXCIuL3RhYmxlLWZvcmVpZ24ta2V5LmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUYWJsZUNvbHVtbkFyZ3NUeXBlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFthdXRvSW5jcmVtZW50XSAtIFdoZXRoZXIgdGhlIGNvbHVtbiBhdXRvLWluY3JlbWVudHMuXG4gKiBAcHJvcGVydHkge2FueX0gW2RlZmF1bHRdIC0gRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGNvbHVtbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Ryb3BDb2x1bW5dIC0gV2hldGhlciB0aGUgY29sdW1uIHNob3VsZCBiZSBkcm9wcGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufG9iamVjdH0gW2ZvcmVpZ25LZXldIC0gRm9yZWlnbiBrZXkgb3B0aW9ucyBvciBmbGFnLlxuICogQHByb3BlcnR5IHtib29sZWFufEluZGV4QXJnVHlwZX0gW2luZGV4XSAtIFdoZXRoZXIgdGhlIGNvbHVtbiBzaG91bGQgYmUgaW5kZXhlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lzTmV3Q29sdW1uXSAtIFdoZXRoZXIgdGhpcyBjb2x1bW4gaXMgYmVpbmcgYWRkZWQgaW4gYSBtaWdyYXRpb24uXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2xpbWl0XSAtIEFsaWFzIGZvciBtYXhMZW5ndGggKHZhcmNoYXIgbGVuZ3RoIGxpbWl0KS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4TGVuZ3RoXSAtIE1heGltdW0gbGVuZ3RoIGZvciB0aGUgY29sdW1uIHZhbHVlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub3Rlc10gLSBDb2x1bW4gbm90ZXMgb3IgY29tbWVudC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW251bGxdIC0gV2hldGhlciB0aGUgY29sdW1uIGFsbG93cyBudWxsIHZhbHVlcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3BvbHltb3JwaGljXSAtIFdoZXRoZXIgdGhlIGNvbHVtbiBpcyBwb2x5bW9ycGhpYy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcHJlY2lzaW9uXSAtIE51bWVyaWMgcHJlY2lzaW9uICh0b3RhbCBkaWdpdHMpIGZvciBkZWNpbWFsL251bWVyaWMgdHlwZXMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwcmltYXJ5S2V5XSAtIFdoZXRoZXIgdGhlIGNvbHVtbiBpcyBhIHByaW1hcnkga2V5LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtzY2FsZV0gLSBOdW1lcmljIHNjYWxlIChkaWdpdHMgYWZ0ZXIgZGVjaW1hbCBwb2ludCkgZm9yIGRlY2ltYWwvbnVtZXJpYyB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdHlwZV0gLSBDb2x1bW4gZGF0YSB0eXBlLlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRhYmxlQ29sdW1uIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTmFtZS5cbiAgICogQHBhcmFtIHtUYWJsZUNvbHVtbkFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWUsIGFyZ3MpIHtcbiAgICBpZiAoYXJncykge1xuICAgICAgY29uc3Qge2F1dG9JbmNyZW1lbnQsIGRlZmF1bHQ6IGNvbHVtbkRlZmF1bHQsIGRyb3BDb2x1bW4sIGZvcmVpZ25LZXksIGluZGV4LCBpc05ld0NvbHVtbiwgbGltaXQsIG1heExlbmd0aCwgbm90ZXMsIG51bGw6IGFyZ3NOdWxsLCBwb2x5bW9ycGhpYywgcHJlY2lzaW9uLCBwcmltYXJ5S2V5LCBzY2FsZSwgdHlwZSwgLi4ucmVzdEFyZ3N9ID0gYXJncyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cbiAgICAgIGlmIChPYmplY3Qua2V5cyhhcmdzKS5sZW5ndGggPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbXB0eSBhcmdzIGdpdmVuXCIpXG4gICAgICB9XG5cbiAgICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICAgIC8vIE5vcm1hbGl6ZSBsaW1pdCDihpIgbWF4TGVuZ3RoIGZvciBzdHJpbmctbGlrZSB0eXBlcyBvbmx5LlxuICAgICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgbWF4TGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0eXBlb2YgdHlwZSA9PT0gXCJzdHJpbmdcIiA/IHR5cGUudG9Mb3dlckNhc2UoKSA6IFwiXCJcblxuICAgICAgICBpZiAobm9ybWFsaXplZFR5cGUgPT09IFwic3RyaW5nXCIgfHwgbm9ybWFsaXplZFR5cGUgPT09IFwidGV4dFwiIHx8IG5vcm1hbGl6ZWRUeXBlID09PSBcInZhcmNoYXJcIiB8fCBub3JtYWxpemVkVHlwZSA9PT0gXCJudmFyY2hhclwiIHx8IG5vcm1hbGl6ZWRUeXBlID09PSBcImNoYXJcIikge1xuICAgICAgICAgIGFyZ3MubWF4TGVuZ3RoID0gbGltaXRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYXJncyA9IGFyZ3MgfHwge31cbiAgICB0aGlzLm5hbWUgPSBuYW1lXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZ2V0TmFtZSgpIHsgcmV0dXJuIHRoaXMubmFtZSB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVGhlIG5ldyBuYW1lLlxuICAgKi9cbiAgZ2V0TmV3TmFtZSgpIHsgcmV0dXJuIHRoaXMuX25ld05hbWUgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3TmFtZSAtIE5ldyBuYW1lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXROZXdOYW1lKG5ld05hbWUpIHsgdGhpcy5fbmV3TmFtZSA9IG5ld05hbWUgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBhY3R1YWwgbmFtZS5cbiAgICovXG4gIGdldEFjdHVhbE5hbWUoKSB7IHJldHVybiB0aGlzLmdldE5ld05hbWUoKSB8fCB0aGlzLmdldE5hbWUoKSB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgYXV0byBpbmNyZW1lbnQuXG4gICAqL1xuICBnZXRBdXRvSW5jcmVtZW50KCkgeyByZXR1cm4gdGhpcy5hcmdzPy5hdXRvSW5jcmVtZW50IHx8IGZhbHNlIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtib29sZWFufSBuZXdBdXRvSW5jcmVtZW50IC0gTmV3IGF1dG8gaW5jcmVtZW50LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRBdXRvSW5jcmVtZW50KG5ld0F1dG9JbmNyZW1lbnQpIHsgdGhpcy5hcmdzLmF1dG9JbmNyZW1lbnQgPSBuZXdBdXRvSW5jcmVtZW50IH1cblxuICAvKipcbiAgICogQHJldHVybnMge3Vua25vd24gfCAoKCkgPT4gdW5rbm93bil9IC0gVGhlIGRlZmF1bHQgdmFsdWUgb3IgZmFjdG9yeS5cbiAgICovXG4gIGdldERlZmF1bHQoKSB7IHJldHVybiB0aGlzLmFyZ3M/LmRlZmF1bHQgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gbmV3RGVmYXVsdCAtIE5ldyBkZWZhdWx0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXREZWZhdWx0KG5ld0RlZmF1bHQpIHsgdGhpcy5hcmdzLmRlZmF1bHQgPSBuZXdEZWZhdWx0IH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBkcm9wIGNvbHVtbi5cbiAgICovXG4gIGdldERyb3BDb2x1bW4oKSB7IHJldHVybiB0aGlzLmFyZ3M/LmRyb3BDb2x1bW4gfHwgZmFsc2UgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbiB8IG9iamVjdCB8IHVuZGVmaW5lZH0gLSBXaGV0aGVyIGZvcmVpZ24ga2V5LlxuICAgKi9cbiAgZ2V0Rm9yZWlnbktleSgpIHsgcmV0dXJuIHRoaXMuYXJncz8uZm9yZWlnbktleSB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB8IG9iamVjdCB8IHVuZGVmaW5lZH0gbmV3Rm9yZWlnbktleSAtIE5ldyBmb3JlaWduIGtleS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0Rm9yZWlnbktleShuZXdGb3JlaWduS2V5KSB7IHRoaXMuYXJncy5mb3JlaWduS2V5ID0gbmV3Rm9yZWlnbktleSB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufEluZGV4QXJnVHlwZX0gLSBXaGV0aGVyIGluZGV4LlxuICAgKi9cbiAgZ2V0SW5kZXgoKSB7IHJldHVybiB0aGlzLmFyZ3M/LmluZGV4IHx8IGZhbHNlIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0luZGV4QXJnVHlwZX0gLSBUaGUgaW5kZXggYXJncy5cbiAgICovXG4gIGdldEluZGV4QXJncygpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuYXJncz8uaW5kZXggPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHRoaXMuYXJncy5pbmRleFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge3VuaXF1ZTogZmFsc2V9XG4gICAgfVxuICB9XG5cbiAgZ2V0SW5kZXhVbmlxdWUoKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmFyZ3M/LmluZGV4XG5cbiAgICBpZiAodHlwZW9mIGluZGV4ID09IFwib2JqZWN0XCIgJiYgaW5kZXgudW5pcXVlID09PSB0cnVlKSByZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtib29sZWFufEluZGV4QXJnVHlwZX0gbmV3SW5kZXggLSBOZXcgaW5kZXguXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldEluZGV4KG5ld0luZGV4KSB7IHRoaXMuYXJncy5pbmRleCA9IG5ld0luZGV4IH1cblxuICAvKipcbiAgICogQHJldHVybnMge251bWJlciB8IHVuZGVmaW5lZH0gLSBUaGUgbWF4IGxlbmd0aC5cbiAgICovXG4gIGdldE1heExlbmd0aCgpIHsgcmV0dXJuIHRoaXMuYXJncz8ubWF4TGVuZ3RoIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXIgfCB1bmRlZmluZWR9IG5ld01heExlbmd0aCAtIE5ldyBtYXggbGVuZ3RoLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRNYXhMZW5ndGgobmV3TWF4TGVuZ3RoKSB7IHRoaXMuYXJncy5tYXhMZW5ndGggPSBuZXdNYXhMZW5ndGggfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFRoZSBub3Rlcy5cbiAgICovXG4gIGdldE5vdGVzKCkgeyByZXR1cm4gdGhpcy5hcmdzPy5ub3RlcyB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBuZXdOb3RlcyAtIE5ldyBub3Rlcy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0Tm90ZXMobmV3Tm90ZXMpIHsgdGhpcy5hcmdzLm5vdGVzID0gbmV3Tm90ZXMgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbiB8IHVuZGVmaW5lZH0gLSBXaGV0aGVyIG51bGwuXG4gICAqL1xuICBnZXROdWxsKCkgeyByZXR1cm4gdGhpcy5hcmdzPy5udWxsIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtib29sZWFufSBudWxsYWJsZSAtIFdoZXRoZXIgbnVsbGFibGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldE51bGwobnVsbGFibGUpIHsgdGhpcy5hcmdzLm51bGwgPSBudWxsYWJsZSB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtudW1iZXIgfCB1bmRlZmluZWR9IC0gTnVtZXJpYyBwcmVjaXNpb24gKHRvdGFsIGRpZ2l0cykuXG4gICAqL1xuICBnZXRQcmVjaXNpb24oKSB7IHJldHVybiB0aGlzLmFyZ3M/LnByZWNpc2lvbiB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgcHJpbWFyeSBrZXkuXG4gICAqL1xuICBnZXRQcmltYXJ5S2V5KCkgeyByZXR1cm4gdGhpcy5hcmdzPy5wcmltYXJ5S2V5IHx8IGZhbHNlIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtib29sZWFufSBuZXdQcmltYXJ5S2V5IC0gTmV3IHByaW1hcnkga2V5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRQcmltYXJ5S2V5KG5ld1ByaW1hcnlLZXkpIHsgdGhpcy5hcmdzLnByaW1hcnlLZXkgPSBuZXdQcmltYXJ5S2V5IH1cblxuICAvKipcbiAgICogQHJldHVybnMge251bWJlciB8IHVuZGVmaW5lZH0gLSBOdW1lcmljIHNjYWxlIChkaWdpdHMgYWZ0ZXIgZGVjaW1hbCBwb2ludCkuXG4gICAqL1xuICBnZXRTY2FsZSgpIHsgcmV0dXJuIHRoaXMuYXJncz8uc2NhbGUgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFRoZSB0eXBlLlxuICAgKi9cbiAgZ2V0VHlwZSgpIHsgcmV0dXJuIHRoaXMuYXJncz8udHlwZSB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBuZXdUeXBlIC0gTmV3IHR5cGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldFR5cGUobmV3VHlwZSkgeyB0aGlzLmFyZ3MudHlwZSA9IG5ld1R5cGUgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFRoZSB0eXBlIGhpbnQgbm90ZXMuXG4gICAqL1xuICBnZXRUeXBlSGludE5vdGVzKCkge1xuICAgIGlmICh0aGlzLmdldFR5cGUoKT8udG9Mb3dlckNhc2UoKSA9PSBcImJvb2xlYW5cIikgcmV0dXJuIFwidmVsb2Npb3VzOnR5cGU9Ym9vbGVhblwiXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlVHlwZSAtIERhdGFiYXNlIHR5cGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gTm90ZXMgZm9yIHRoZSBkYXRhYmFzZS5cbiAgICovXG4gIGdldE5vdGVzRm9yRGF0YWJhc2UoZGF0YWJhc2VUeXBlKSB7XG4gICAgaWYgKCFbXCJteXNxbFwiLCBcInBnc3FsXCJdLmluY2x1ZGVzKGRhdGFiYXNlVHlwZSkpIHJldHVyblxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0Tm90ZXMoKSB8fCB0aGlzLmdldFR5cGVIaW50Tm90ZXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgbmV3IGNvbHVtbi5cbiAgICovXG4gIGlzTmV3Q29sdW1uKCkgeyByZXR1cm4gdGhpcy5hcmdzPy5pc05ld0NvbHVtbiB8fCBmYWxzZSB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYXJncy5mb3JBbHRlclRhYmxlIC0gV2hldGhlciBmb3IgYWx0ZXIgdGFibGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MuZHJpdmVyIC0gRGF0YWJhc2UgZHJpdmVyIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnNraXBGb3JlaWduS2V5XSAtIFNraXAgZW1pdHRpbmcgdGhlIGlubGluZSBSRUZFUkVOQ0VTIGNsYXVzZSAodGhlIGNhbGxlciBlbWl0cyBhIHRhYmxlLWxldmVsIEZPUkVJR04gS0VZIGNvbnN0cmFpbnQgaW5zdGVhZCkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU1FMIHN0cmluZy5cbiAgICovXG4gIGdldFNRTCh7Zm9yQWx0ZXJUYWJsZSwgZHJpdmVyLCBza2lwRm9yZWlnbktleSwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGNvbnN0IGRhdGFiYXNlVHlwZSA9IGRyaXZlci5nZXRUeXBlKClcbiAgICBjb25zdCBvcHRpb25zID0gZHJpdmVyLm9wdGlvbnMoKVxuICAgIGxldCBtYXhsZW5ndGggPSB0aGlzLmdldE1heExlbmd0aCgpXG4gICAgbGV0IHR5cGUgPSB0aGlzLmdldFR5cGUoKT8udG9VcHBlckNhc2UoKVxuXG4gICAgaWYgKGRhdGFiYXNlVHlwZSA9PSBcInBnc3FsXCIpIHtcbiAgICAgIGlmICh0eXBlID09IFwiREFURVRJTUVcIikge1xuICAgICAgICB0eXBlID0gXCJUSU1FU1RBTVBcIlxuICAgICAgfSBlbHNlIGlmICh0eXBlID09IFwiVElOWUlOVFwiKSB7XG4gICAgICAgIHR5cGUgPSBcIlNNQUxMSU5UXCJcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcIkJMT0JcIikge1xuICAgICAgICB0eXBlID0gXCJCWVRFQVwiXG4gICAgICAgIG1heGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlID09IFwiU1RSSU5HXCIpIHtcbiAgICAgIHR5cGUgPSBkYXRhYmFzZVR5cGUgPT0gXCJtc3NxbFwiID8gXCJOVkFSQ0hBUlwiIDogXCJWQVJDSEFSXCJcbiAgICAgIG1heGxlbmd0aCB8fD0gMjU1XG4gICAgfVxuICAgIGlmIChkYXRhYmFzZVR5cGUgPT0gXCJteXNxbFwiICYmIHR5cGUgPT0gXCJCT09MRUFOXCIpIHtcbiAgICAgIHR5cGUgPSBcIlRJTllJTlRcIlxuICAgICAgbWF4bGVuZ3RoID0gMVxuICAgIH1cbiAgICBpZiAoZGF0YWJhc2VUeXBlID09IFwicGdzcWxcIiAmJiB0eXBlID09IFwiVElOWUlOVFwiKSB7XG4gICAgICB0eXBlID0gXCJTTUFMTElOVFwiXG4gICAgfVxuXG4gICAgaWYgKGRhdGFiYXNlVHlwZSA9PSBcIm1zc3FsXCIpIHtcbiAgICAgIGlmICh0eXBlID09IFwiQk9PTEVBTlwiKSB7XG4gICAgICAgIHR5cGUgPSBcIkJJVFwiXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJVVUlEXCIpIHtcbiAgICAgICAgdHlwZSA9IFwiVkFSQ0hBUlwiXG4gICAgICAgIG1heGxlbmd0aCB8fD0gMzZcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcIkpTT05cIikge1xuICAgICAgICB0eXBlID0gXCJOVkFSQ0hBUihNQVgpXCJcbiAgICAgICAgbWF4bGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJCTE9CXCIpIHtcbiAgICAgICAgdHlwZSA9IFwiVkFSQklOQVJZKE1BWClcIlxuICAgICAgICBtYXhsZW5ndGggPSB1bmRlZmluZWRcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcIlRFWFRcIikge1xuICAgICAgICB0eXBlID0gXCJOVkFSQ0hBUihNQVgpXCJcbiAgICAgICAgbWF4bGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRhdGFiYXNlVHlwZSA9PSBcInNxbGl0ZVwiICYmIHRoaXMuZ2V0QXV0b0luY3JlbWVudCgpICYmIHRoaXMuZ2V0UHJpbWFyeUtleSgpKSB7XG4gICAgICB0eXBlID0gXCJJTlRFR0VSXCJcbiAgICB9XG5cbiAgICBpZiAoZGF0YWJhc2VUeXBlID09IFwicGdzcWxcIiAmJiB0aGlzLmdldEF1dG9JbmNyZW1lbnQoKSAmJiB0aGlzLmdldFByaW1hcnlLZXkoKSkge1xuICAgICAgdHlwZSA9IFwiU0VSSUFMXCJcbiAgICB9XG5cbiAgICBsZXQgc3FsID0gYCR7b3B0aW9ucy5xdW90ZUNvbHVtbk5hbWUodGhpcy5nZXRBY3R1YWxOYW1lKCkpfSBgXG5cbiAgICBpZiAoZGF0YWJhc2VUeXBlID09IFwicGdzcWxcIiAmJiBmb3JBbHRlclRhYmxlKSBzcWwgKz0gXCJUWVBFIFwiXG4gICAgaWYgKHR5cGUpIHNxbCArPSB0eXBlXG5cbiAgICBjb25zdCBwcmVjaXNpb24gPSB0aGlzLmdldFByZWNpc2lvbigpXG4gICAgY29uc3Qgc2NhbGUgPSB0aGlzLmdldFNjYWxlKClcblxuICAgIGlmICgoc2NhbGUgIT09IHVuZGVmaW5lZCAmJiBzY2FsZSAhPT0gbnVsbCkgJiYgKHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkIHx8IHByZWNpc2lvbiA9PT0gbnVsbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uICcke3RoaXMuZ2V0QWN0dWFsTmFtZSgpfSc6IHNjYWxlIHJlcXVpcmVzIHByZWNpc2lvbiB0byBiZSBzZXRgKVxuICAgIH1cblxuICAgIGlmIChwcmVjaXNpb24gIT09IHVuZGVmaW5lZCAmJiBwcmVjaXNpb24gIT09IG51bGwpIHtcbiAgICAgIHNxbCArPSBzY2FsZSAhPT0gdW5kZWZpbmVkICYmIHNjYWxlICE9PSBudWxsID8gYCgke3ByZWNpc2lvbn0sICR7c2NhbGV9KWAgOiBgKCR7cHJlY2lzaW9ufSlgXG4gICAgfSBlbHNlIGlmICh0eXBlICYmIG1heGxlbmd0aCAhPT0gdW5kZWZpbmVkICYmIG1heGxlbmd0aCAhPT0gbnVsbCkge1xuICAgICAgc3FsICs9IGAoJHttYXhsZW5ndGh9KWBcbiAgICB9XG5cbiAgICBpZiAodGhpcy5nZXRBdXRvSW5jcmVtZW50KCkgJiYgZHJpdmVyLnNob3VsZFNldEF1dG9JbmNyZW1lbnRXaGVuUHJpbWFyeUtleSgpKSB7XG4gICAgICBpZiAoZGF0YWJhc2VUeXBlID09IFwibXNzcWxcIikge1xuICAgICAgICBzcWwgKz0gXCIgSURFTlRJVFlcIlxuICAgICAgfSBlbHNlIGlmIChkYXRhYmFzZVR5cGUgPT0gXCJwZ3NxbFwiKSB7XG4gICAgICAgIGlmICh0aGlzLmdldEF1dG9JbmNyZW1lbnQoKSAmJiB0aGlzLmdldFByaW1hcnlLZXkoKSkge1xuICAgICAgICAgIC8vIERvIG5vdGhpbmdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwZ3NxbCBhdXRvIGluY3JlbWVudCBtdXN0IGJlIHByaW1hcnkga2V5XCIpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNxbCArPSBcIiBBVVRPX0lOQ1JFTUVOVFwiXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5nZXREZWZhdWx0KClcblxuICAgIGlmICh0eXBlb2YgZGVmYXVsdFZhbHVlID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3QgZXZhbHVhdGVkRGVmYXVsdCA9IGRlZmF1bHRWYWx1ZSgpXG5cbiAgICAgIHNxbCArPSBgIERFRkFVTFQgKGBcblxuICAgICAgaWYgKGRhdGFiYXNlVHlwZSA9PSBcInBnc3FsXCIgJiYgZXZhbHVhdGVkRGVmYXVsdCA9PSBcIlVVSUQoKVwiKSB7XG4gICAgICAgIHNxbCArPSBcImdlbl9yYW5kb21fdXVpZCgpXCJcbiAgICAgIH0gZWxzZSBpZiAoZGF0YWJhc2VUeXBlID09IFwibXNzcWxcIiAmJiBldmFsdWF0ZWREZWZhdWx0ID09IFwiVVVJRCgpXCIpIHtcbiAgICAgICAgc3FsICs9IFwiTkVXSUQoKVwiXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcWwgKz0gZXZhbHVhdGVkRGVmYXVsdFxuICAgICAgfVxuXG4gICAgICBzcWwgKz0gXCIpXCJcbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGRlZmF1bHRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gRW1pdCBmYWxzeSBkZWZhdWx0cyB0b28gKGAwYCwgYGZhbHNlYCwgYFwiXCJgKS4gQSB0cnV0aGluZXNzIGNoZWNrIGhlcmVcbiAgICAgIC8vIHNpbGVudGx5IGRyb3BwZWQgYGRlZmF1bHQ6IDBgLCBsZWF2aW5nIHRoZSBjb2x1bW4gTk9UIE5VTEwgd2l0aCBub1xuICAgICAgLy8gZGVmYXVsdCBzbyBpbnNlcnRzIHRoYXQgb21pdCBpdCBmYWlsIGluIHN0cmljdCBtb2RlLlxuICAgICAgc3FsICs9IGAgREVGQVVMVCAke29wdGlvbnMucXVvdGUoZGVmYXVsdFZhbHVlKX1gXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2V0UHJpbWFyeUtleSgpKSBzcWwgKz0gXCIgUFJJTUFSWSBLRVlcIlxuICAgIGlmICh0aGlzLmdldE51bGwoKSA9PT0gZmFsc2UpIHNxbCArPSBcIiBOT1QgTlVMTFwiXG5cbiAgICBjb25zdCBub3RlcyA9IHRoaXMuZ2V0Tm90ZXNGb3JEYXRhYmFzZShkYXRhYmFzZVR5cGUpXG5cbiAgICBpZiAobm90ZXMgJiYgZGF0YWJhc2VUeXBlID09IFwibXlzcWxcIikge1xuICAgICAgc3FsICs9IGAgQ09NTUVOVCAke29wdGlvbnMucXVvdGUobm90ZXMpfWBcbiAgICB9XG5cbiAgICBjb25zdCBmb3JlaWduS2V5ID0gc2tpcEZvcmVpZ25LZXkgPyB1bmRlZmluZWQgOiB0aGlzLmdldEZvcmVpZ25LZXkoKVxuXG4gICAgaWYgKGZvcmVpZ25LZXkpIHtcbiAgICAgIGxldCBmb3JlaWduS2V5VGFibGUsIGZvcmVpZ25LZXlDb2x1bW5cblxuICAgICAgaWYgKGZvcmVpZ25LZXkgPT09IHRydWUpIHtcbiAgICAgICAgZm9yZWlnbktleUNvbHVtbiA9IFwiaWRcIlxuICAgICAgICBmb3JlaWduS2V5VGFibGUgPSBpbmZsZWN0aW9uLnBsdXJhbGl6ZSh0aGlzLmdldEFjdHVhbE5hbWUoKS5yZXBsYWNlKC9faWQkLywgXCJcIikpXG4gICAgICB9IGVsc2UgaWYgKGZvcmVpZ25LZXkgaW5zdGFuY2VvZiBUYWJsZUZvcmVpZ25LZXkpIHtcbiAgICAgICAgZm9yZWlnbktleUNvbHVtbiA9IGZvcmVpZ25LZXkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKVxuICAgICAgICBmb3JlaWduS2V5VGFibGUgPSBmb3JlaWduS2V5LmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZvcmVpZ24ga2V5IHR5cGUgZ2l2ZW46ICR7Zm9yZWlnbktleX0gKCR7dHlwZW9mIGZvcmVpZ25LZXl9KWApXG4gICAgICB9XG5cbiAgICAgIHNxbCArPSBgIFJFRkVSRU5DRVMgJHtvcHRpb25zLnF1b3RlVGFibGVOYW1lKGZvcmVpZ25LZXlUYWJsZSl9KCR7b3B0aW9ucy5xdW90ZUNvbHVtbk5hbWUoZm9yZWlnbktleUNvbHVtbil9KWBcbiAgICB9XG5cbiAgICByZXR1cm4gc3FsXG4gIH1cbn1cbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"background-jobs-runner.d.ts","sourceRoot":"","sources":["../../../../../../src/environment-handlers/node/cli/commands/background-jobs-runner.js"],"names":[],"mappings":"AAGA;IACE,
|
|
1
|
+
{"version":3,"file":"background-jobs-runner.d.ts","sourceRoot":"","sources":["../../../../../../src/environment-handlers/node/cli/commands/background-jobs-runner.js"],"names":[],"mappings":"AAGA;IACE,yBAkBC;CACF;wBAvBuB,iCAAiC"}
|
|
@@ -5,9 +5,17 @@ export default class BackgroundJobsRunnerCommand extends BaseCommand {
|
|
|
5
5
|
const payload = process.env.VELOCIOUS_JOB_PAYLOAD;
|
|
6
6
|
if (!payload)
|
|
7
7
|
throw new Error("Missing VELOCIOUS_JOB_PAYLOAD");
|
|
8
|
+
// A graceful worker shutdown (e.g. a deploy draining the old release)
|
|
9
|
+
// SIGTERMs this forked runner to reap it. Exit promptly so it does not
|
|
10
|
+
// linger as an orphan running against deleted release code; the OS releases
|
|
11
|
+
// the runner's DB/beacon sockets on exit and main's orphan sweep reclaims
|
|
12
|
+
// the in-flight job.
|
|
13
|
+
for (const signal of ["SIGTERM", "SIGINT"]) {
|
|
14
|
+
process.once(signal, () => process.exit(0));
|
|
15
|
+
}
|
|
8
16
|
const decoded = Buffer.from(payload, "base64").toString("utf8");
|
|
9
17
|
const jobPayload = JSON.parse(decoded);
|
|
10
18
|
await runJobPayload(jobPayload);
|
|
11
19
|
}
|
|
12
20
|
}
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2dyb3VuZC1qb2JzLXJ1bm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9ub2RlL2NsaS9jb21tYW5kcy9iYWNrZ3JvdW5kLWpvYnMtcnVubmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sV0FBVyxNQUFNLGlDQUFpQyxDQUFBO0FBQ3pELE9BQU8sYUFBYSxNQUFNLDJDQUEyQyxDQUFBO0FBRXJFLE1BQU0sQ0FBQyxPQUFPLE9BQU8sMkJBQTRCLFNBQVEsV0FBVztJQUNsRSxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUE7UUFFakQsSUFBSSxDQUFDLE9BQU87WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUE7UUFFOUQsc0VBQXNFO1FBQ3RFLHVFQUF1RTtRQUN2RSw0RUFBNEU7UUFDNUUsMEVBQTBFO1FBQzFFLHFCQUFxQjtRQUNyQixLQUFLLE1BQU0sTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDM0MsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzdDLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDL0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUV0QyxNQUFNLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNqQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFzZUNvbW1hbmQgZnJvbSBcIi4uLy4uLy4uLy4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIlxuaW1wb3J0IHJ1bkpvYlBheWxvYWQgZnJvbSBcIi4uLy4uLy4uLy4uL2JhY2tncm91bmQtam9icy9qb2ItcnVubmVyLmpzXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFja2dyb3VuZEpvYnNSdW5uZXJDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQge1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGNvbnN0IHBheWxvYWQgPSBwcm9jZXNzLmVudi5WRUxPQ0lPVVNfSk9CX1BBWUxPQURcblxuICAgIGlmICghcGF5bG9hZCkgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBWRUxPQ0lPVVNfSk9CX1BBWUxPQURcIilcblxuICAgIC8vIEEgZ3JhY2VmdWwgd29ya2VyIHNodXRkb3duIChlLmcuIGEgZGVwbG95IGRyYWluaW5nIHRoZSBvbGQgcmVsZWFzZSlcbiAgICAvLyBTSUdURVJNcyB0aGlzIGZvcmtlZCBydW5uZXIgdG8gcmVhcCBpdC4gRXhpdCBwcm9tcHRseSBzbyBpdCBkb2VzIG5vdFxuICAgIC8vIGxpbmdlciBhcyBhbiBvcnBoYW4gcnVubmluZyBhZ2FpbnN0IGRlbGV0ZWQgcmVsZWFzZSBjb2RlOyB0aGUgT1MgcmVsZWFzZXNcbiAgICAvLyB0aGUgcnVubmVyJ3MgREIvYmVhY29uIHNvY2tldHMgb24gZXhpdCBhbmQgbWFpbidzIG9ycGhhbiBzd2VlcCByZWNsYWltc1xuICAgIC8vIHRoZSBpbi1mbGlnaHQgam9iLlxuICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIFtcIlNJR1RFUk1cIiwgXCJTSUdJTlRcIl0pIHtcbiAgICAgIHByb2Nlc3Mub25jZShzaWduYWwsICgpID0+IHByb2Nlc3MuZXhpdCgwKSlcbiAgICB9XG5cbiAgICBjb25zdCBkZWNvZGVkID0gQnVmZmVyLmZyb20ocGF5bG9hZCwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgY29uc3Qgam9iUGF5bG9hZCA9IEpTT04ucGFyc2UoZGVjb2RlZClcblxuICAgIGF3YWl0IHJ1bkpvYlBheWxvYWQoam9iUGF5bG9hZClcbiAgfVxufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"background-jobs-worker.d.ts","sourceRoot":"","sources":["../../../../../../src/environment-handlers/node/cli/commands/background-jobs-worker.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"background-jobs-worker.d.ts","sourceRoot":"","sources":["../../../../../../src/environment-handlers/node/cli/commands/background-jobs-worker.js"],"names":[],"mappings":"AA2BA;IACE,yBAiBC;CACF;wBA9CuB,iCAAiC"}
|
|
@@ -1,13 +1,35 @@
|
|
|
1
1
|
import BaseCommand from "../../../../cli/base-command.js";
|
|
2
2
|
import BackgroundJobsWorker from "../../../../background-jobs/worker.js";
|
|
3
|
+
/**
|
|
4
|
+
* Resolves the shutdown drain timeout from
|
|
5
|
+
* `VELOCIOUS_BACKGROUND_JOBS_WORKER_SHUTDOWN_TIMEOUT_MS`:
|
|
6
|
+
* - unset / "indefinite" / "0" → indefinite: wait for in-flight jobs to
|
|
7
|
+
* finish and never kill a forked runner. This is the default so a graceful
|
|
8
|
+
* stop (e.g. a deploy) does not interrupt long-running jobs such as builds.
|
|
9
|
+
* - positive integer → that many milliseconds, after which any forked runner
|
|
10
|
+
* still in flight is terminated (SIGTERM, then SIGKILL) instead of orphaned.
|
|
11
|
+
*
|
|
12
|
+
* When a finite cap is used it must be shorter than the supervisor's
|
|
13
|
+
* graceful-stop window so the worker reaps its own children before being
|
|
14
|
+
* force-killed.
|
|
15
|
+
* @returns {number | undefined} - Timeout in ms, or undefined for indefinite.
|
|
16
|
+
*/
|
|
17
|
+
function resolveShutdownTimeoutMs() {
|
|
18
|
+
const raw = (process.env.VELOCIOUS_BACKGROUND_JOBS_WORKER_SHUTDOWN_TIMEOUT_MS || "").trim().toLowerCase();
|
|
19
|
+
if (!raw || raw === "indefinite" || raw === "0")
|
|
20
|
+
return undefined;
|
|
21
|
+
const parsed = Number.parseInt(raw, 10);
|
|
22
|
+
return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined;
|
|
23
|
+
}
|
|
3
24
|
export default class BackgroundJobsWorkerCommand extends BaseCommand {
|
|
4
25
|
async execute() {
|
|
5
26
|
const worker = new BackgroundJobsWorker({ configuration: this.getConfiguration() });
|
|
6
27
|
await worker.start();
|
|
7
28
|
console.log("Background jobs worker connected");
|
|
29
|
+
const timeoutMs = resolveShutdownTimeoutMs();
|
|
8
30
|
await new Promise((resolve) => {
|
|
9
31
|
const shutdown = async () => {
|
|
10
|
-
await worker.stop();
|
|
32
|
+
await worker.stop({ timeoutMs });
|
|
11
33
|
resolve(undefined);
|
|
12
34
|
};
|
|
13
35
|
process.once("SIGINT", shutdown);
|
|
@@ -15,4 +37,4 @@ export default class BackgroundJobsWorkerCommand extends BaseCommand {
|
|
|
15
37
|
});
|
|
16
38
|
}
|
|
17
39
|
}
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2dyb3VuZC1qb2JzLXdvcmtlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9ub2RlL2NsaS9jb21tYW5kcy9iYWNrZ3JvdW5kLWpvYnMtd29ya2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sV0FBVyxNQUFNLGlDQUFpQyxDQUFBO0FBQ3pELE9BQU8sb0JBQW9CLE1BQU0sdUNBQXVDLENBQUE7QUFFeEU7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsd0JBQXdCO0lBQy9CLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvREFBb0QsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUV6RyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsS0FBSyxZQUFZLElBQUksR0FBRyxLQUFLLEdBQUc7UUFBRSxPQUFPLFNBQVMsQ0FBQTtJQUVqRSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUV2QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7QUFDcEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxPQUFPLE9BQU8sMkJBQTRCLFNBQVEsV0FBVztJQUNsRSxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sTUFBTSxHQUFHLElBQUksb0JBQW9CLENBQUMsRUFBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUMsQ0FBQyxDQUFBO1FBQ2pGLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBRXBCLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtRQUUvQyxNQUFNLFNBQVMsR0FBRyx3QkFBd0IsRUFBRSxDQUFBO1FBRTVDLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM1QixNQUFNLFFBQVEsR0FBRyxLQUFLLElBQUksRUFBRTtnQkFDMUIsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQTtnQkFDOUIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQ3BCLENBQUMsQ0FBQTtZQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBQ2hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ25DLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2VDb21tYW5kIGZyb20gXCIuLi8uLi8uLi8uLi9jbGkvYmFzZS1jb21tYW5kLmpzXCJcbmltcG9ydCBCYWNrZ3JvdW5kSm9ic1dvcmtlciBmcm9tIFwiLi4vLi4vLi4vLi4vYmFja2dyb3VuZC1qb2JzL3dvcmtlci5qc1wiXG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHNodXRkb3duIGRyYWluIHRpbWVvdXQgZnJvbVxuICogYFZFTE9DSU9VU19CQUNLR1JPVU5EX0pPQlNfV09SS0VSX1NIVVRET1dOX1RJTUVPVVRfTVNgOlxuICogICAtIHVuc2V0IC8gXCJpbmRlZmluaXRlXCIgLyBcIjBcIiDihpIgaW5kZWZpbml0ZTogd2FpdCBmb3IgaW4tZmxpZ2h0IGpvYnMgdG9cbiAqICAgICBmaW5pc2ggYW5kIG5ldmVyIGtpbGwgYSBmb3JrZWQgcnVubmVyLiBUaGlzIGlzIHRoZSBkZWZhdWx0IHNvIGEgZ3JhY2VmdWxcbiAqICAgICBzdG9wIChlLmcuIGEgZGVwbG95KSBkb2VzIG5vdCBpbnRlcnJ1cHQgbG9uZy1ydW5uaW5nIGpvYnMgc3VjaCBhcyBidWlsZHMuXG4gKiAgIC0gcG9zaXRpdmUgaW50ZWdlciDihpIgdGhhdCBtYW55IG1pbGxpc2Vjb25kcywgYWZ0ZXIgd2hpY2ggYW55IGZvcmtlZCBydW5uZXJcbiAqICAgICBzdGlsbCBpbiBmbGlnaHQgaXMgdGVybWluYXRlZCAoU0lHVEVSTSwgdGhlbiBTSUdLSUxMKSBpbnN0ZWFkIG9mIG9ycGhhbmVkLlxuICpcbiAqIFdoZW4gYSBmaW5pdGUgY2FwIGlzIHVzZWQgaXQgbXVzdCBiZSBzaG9ydGVyIHRoYW4gdGhlIHN1cGVydmlzb3Inc1xuICogZ3JhY2VmdWwtc3RvcCB3aW5kb3cgc28gdGhlIHdvcmtlciByZWFwcyBpdHMgb3duIGNoaWxkcmVuIGJlZm9yZSBiZWluZ1xuICogZm9yY2Uta2lsbGVkLlxuICogQHJldHVybnMge251bWJlciB8IHVuZGVmaW5lZH0gLSBUaW1lb3V0IGluIG1zLCBvciB1bmRlZmluZWQgZm9yIGluZGVmaW5pdGUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTaHV0ZG93blRpbWVvdXRNcygpIHtcbiAgY29uc3QgcmF3ID0gKHByb2Nlc3MuZW52LlZFTE9DSU9VU19CQUNLR1JPVU5EX0pPQlNfV09SS0VSX1NIVVRET1dOX1RJTUVPVVRfTVMgfHwgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKClcblxuICBpZiAoIXJhdyB8fCByYXcgPT09IFwiaW5kZWZpbml0ZVwiIHx8IHJhdyA9PT0gXCIwXCIpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIucGFyc2VJbnQocmF3LCAxMClcblxuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwYXJzZWQpICYmIHBhcnNlZCA+IDAgPyBwYXJzZWQgOiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFja2dyb3VuZEpvYnNXb3JrZXJDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQge1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGNvbnN0IHdvcmtlciA9IG5ldyBCYWNrZ3JvdW5kSm9ic1dvcmtlcih7Y29uZmlndXJhdGlvbjogdGhpcy5nZXRDb25maWd1cmF0aW9uKCl9KVxuICAgIGF3YWl0IHdvcmtlci5zdGFydCgpXG5cbiAgICBjb25zb2xlLmxvZyhcIkJhY2tncm91bmQgam9icyB3b3JrZXIgY29ubmVjdGVkXCIpXG5cbiAgICBjb25zdCB0aW1lb3V0TXMgPSByZXNvbHZlU2h1dGRvd25UaW1lb3V0TXMoKVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IHNodXRkb3duID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB3b3JrZXIuc3RvcCh7dGltZW91dE1zfSlcbiAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3Mub25jZShcIlNJR0lOVFwiLCBzaHV0ZG93bilcbiAgICAgIHByb2Nlc3Mub25jZShcIlNJR1RFUk1cIiwgc2h1dGRvd24pXG4gICAgfSlcbiAgfVxufVxuIl19
|