velocious 1.0.601 → 1.0.603
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 -7
- package/build/database/drivers/base.js +191 -39
- package/build/database/drivers/mysql/deadlock-diagnostic-parser.js +227 -0
- package/build/database/drivers/mysql/index.js +21 -30
- package/build/database/live-query.js +4 -1
- package/build/database/operation.js +9 -0
- package/build/database/pool/async-tracked-multi-connection.js +10 -15
- package/build/database/pool/base.js +19 -2
- package/build/database/record/index.js +50 -2
- package/build/database/record-changes.js +18 -4
- package/build/src/database/drivers/base.d.ts +110 -3
- package/build/src/database/drivers/base.d.ts.map +1 -1
- package/build/src/database/drivers/base.js +175 -37
- package/build/src/database/drivers/mysql/deadlock-diagnostic-parser.d.ts +80 -0
- package/build/src/database/drivers/mysql/deadlock-diagnostic-parser.d.ts.map +1 -0
- package/build/src/database/drivers/mysql/deadlock-diagnostic-parser.js +196 -0
- package/build/src/database/drivers/mysql/index.d.ts +21 -2
- package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/index.js +19 -28
- package/build/src/database/live-query.d.ts +5 -0
- package/build/src/database/live-query.d.ts.map +1 -1
- package/build/src/database/live-query.js +4 -2
- package/build/src/database/operation.d.ts +5 -0
- package/build/src/database/operation.d.ts.map +1 -1
- package/build/src/database/operation.js +9 -1
- package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
- package/build/src/database/pool/async-tracked-multi-connection.js +11 -16
- package/build/src/database/pool/base.d.ts +7 -0
- package/build/src/database/pool/base.d.ts.map +1 -1
- package/build/src/database/pool/base.js +17 -2
- package/build/src/database/record/index.d.ts +36 -0
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +43 -3
- package/build/src/database/record-changes.d.ts +9 -1
- package/build/src/database/record-changes.d.ts.map +1 -1
- package/build/src/database/record-changes.js +18 -5
- package/build/src/sync/local-mutation-log.d.ts +7 -0
- package/build/src/sync/local-mutation-log.d.ts.map +1 -1
- package/build/src/sync/local-mutation-log.js +17 -1
- package/build/src/sync/sync-api-client-types.d.ts +8 -4
- package/build/src/sync/sync-api-client-types.d.ts.map +1 -1
- package/build/src/sync/sync-api-client-types.js +3 -3
- package/build/src/sync/sync-client-types.d.ts +25 -0
- package/build/src/sync/sync-client-types.d.ts.map +1 -1
- package/build/src/sync/sync-client-types.js +6 -1
- package/build/src/sync/sync-client.d.ts +43 -1
- package/build/src/sync/sync-client.d.ts.map +1 -1
- package/build/src/sync/sync-client.js +187 -37
- package/build/src/sync/sync-realtime-bridge.js +2 -2
- package/build/src/sync/sync-scope-store.d.ts +15 -1
- package/build/src/sync/sync-scope-store.d.ts.map +1 -1
- package/build/src/sync/sync-scope-store.js +31 -4
- package/build/src/tenants/tenant-handle.d.ts +81 -0
- package/build/src/tenants/tenant-handle.d.ts.map +1 -1
- package/build/src/tenants/tenant-handle.js +143 -1
- package/build/sync/local-mutation-log.js +17 -0
- package/build/sync/sync-api-client-types.js +2 -2
- package/build/sync/sync-client-types.js +5 -0
- package/build/sync/sync-client.js +198 -38
- package/build/sync/sync-realtime-bridge.js +1 -1
- package/build/sync/sync-scope-store.js +32 -3
- package/build/tenants/tenant-handle.js +165 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/database/drivers/base.js +191 -39
- package/src/database/drivers/mysql/deadlock-diagnostic-parser.js +227 -0
- package/src/database/drivers/mysql/index.js +21 -30
- package/src/database/live-query.js +4 -1
- package/src/database/operation.js +9 -0
- package/src/database/pool/async-tracked-multi-connection.js +10 -15
- package/src/database/pool/base.js +19 -2
- package/src/database/record/index.js +50 -2
- package/src/database/record-changes.js +18 -4
- package/src/sync/local-mutation-log.js +17 -0
- package/src/sync/sync-api-client-types.js +2 -2
- package/src/sync/sync-client-types.js +5 -0
- package/src/sync/sync-client.js +198 -38
- package/src/sync/sync-realtime-bridge.js +1 -1
- package/src/sync/sync-scope-store.js +32 -3
- package/src/tenants/tenant-handle.js +165 -0
|
@@ -20,6 +20,7 @@ import Table from "./table.js";
|
|
|
20
20
|
import StructureSql from "./structure-sql.js";
|
|
21
21
|
import Upsert from "./sql/upsert.js";
|
|
22
22
|
import Update from "./sql/update.js";
|
|
23
|
+
import parseInnodbDeadlockSummary from "./deadlock-diagnostic-parser.js";
|
|
23
24
|
/**
|
|
24
25
|
* Sentinel timeout (in seconds) used as the "block forever" value when a
|
|
25
26
|
* caller asks for an indefinite advisory lock acquire. MySQL historically
|
|
@@ -316,12 +317,11 @@ export default class VelociousDatabaseDriversMysql extends Base {
|
|
|
316
317
|
// A deadlock or lock-wait-timeout aborts the whole transaction; it must be retried at the
|
|
317
318
|
// transaction level (re-running the callback), not the query level, so flag it as such and
|
|
318
319
|
// keep `retry` false so an in-transaction query does not retry against the dead transaction.
|
|
319
|
-
if (errorCode == "ER_LOCK_DEADLOCK" ||
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
return { retry: false, reconnect: false, deadlock: true, waitMs: 50 };
|
|
320
|
+
if (errorCode == "ER_LOCK_DEADLOCK" || message.includes("ER_LOCK_DEADLOCK") || message.includes("Deadlock found")) {
|
|
321
|
+
return { retry: false, reconnect: false, deadlock: true, contentionKind: "deadlock", waitMs: 50 };
|
|
322
|
+
}
|
|
323
|
+
if (errorCode == "ER_LOCK_WAIT_TIMEOUT" || message.includes("Lock wait timeout exceeded")) {
|
|
324
|
+
return { retry: false, reconnect: false, deadlock: true, contentionKind: "lock-wait-timeout", waitMs: 50 };
|
|
325
325
|
}
|
|
326
326
|
shouldReconnect ||= (errorCode == "ECONNREFUSED" ||
|
|
327
327
|
message.includes("ECONNREFUSED") ||
|
|
@@ -340,19 +340,23 @@ export default class VelociousDatabaseDriversMysql extends Base {
|
|
|
340
340
|
* Adds a redacted, bounded excerpt from MySQL's latest InnoDB deadlock report. Capture uses a
|
|
341
341
|
* separate short-lived connection so it cannot queue ahead of rollback or the next retry on this
|
|
342
342
|
* driver's single-connection pool.
|
|
343
|
+
* @param {import("../base.js").DeadlockRetryDiagnosticSnapshot} snapshot - Immutable retry snapshot.
|
|
343
344
|
* @returns {Promise<Record<string, ReturnType<typeof JSON.parse>>>} - Safe diagnostic context.
|
|
344
345
|
*/
|
|
345
|
-
async _deadlockDiagnosticContext() {
|
|
346
|
+
async _deadlockDiagnosticContext(snapshot) {
|
|
347
|
+
if (snapshot.contentionKind == "lock-wait-timeout")
|
|
348
|
+
return { statusCapture: "not-applicable" };
|
|
349
|
+
let status;
|
|
346
350
|
try {
|
|
347
|
-
|
|
348
|
-
return {
|
|
349
|
-
innodbDeadlockSummary: this._innodbDeadlockSummary(status),
|
|
350
|
-
statusCapture: "captured"
|
|
351
|
-
};
|
|
351
|
+
status = await this._captureInnodbDeadlockStatus();
|
|
352
352
|
}
|
|
353
353
|
catch {
|
|
354
354
|
return { statusCapture: "failed" };
|
|
355
355
|
}
|
|
356
|
+
return {
|
|
357
|
+
innodbDeadlockSummary: this._innodbDeadlockSummary(status),
|
|
358
|
+
statusCapture: "captured"
|
|
359
|
+
};
|
|
356
360
|
}
|
|
357
361
|
/**
|
|
358
362
|
* Captures SHOW ENGINE INNODB STATUS on a bounded throwaway connection.
|
|
@@ -407,23 +411,10 @@ export default class VelociousDatabaseDriversMysql extends Base {
|
|
|
407
411
|
* Extracts only fixed-format deadlock counters. The server report contains raw SQL, identifiers,
|
|
408
412
|
* and physical record data, so no source text is ever included in an application diagnostic.
|
|
409
413
|
* @param {string} status - SHOW ENGINE INNODB STATUS text.
|
|
410
|
-
* @returns {{transactions: number, victimTransaction: number | null}} - Structural deadlock summary.
|
|
414
|
+
* @returns {{lockRecordsTruncated: boolean, sectionTruncated: boolean, transactionNodes: Array<{conflictingLocks: Array<{indexFingerprint: string, lockMode: string, state: string, tableFingerprint: string}>, locks: Array<{indexFingerprint: string, lockMode: string, state: string, tableFingerprint: string}>, ordinal: number}>, transactionNodesTruncated: boolean, transactions: number, victimTransaction: number | null}} - Structural deadlock summary.
|
|
411
415
|
*/
|
|
412
416
|
_innodbDeadlockSummary(status) {
|
|
413
|
-
|
|
414
|
-
const candidate = deadlockStart >= 0 ? status.slice(deadlockStart) : status;
|
|
415
|
-
let transactions = 0;
|
|
416
|
-
/** @type {number | null} */
|
|
417
|
-
let victimTransaction = null;
|
|
418
|
-
for (const line of candidate.split(/\r?\n/)) {
|
|
419
|
-
const trimmed = line.trim();
|
|
420
|
-
if (/^\*\*\* \(\d+\) TRANSACTION:$/.test(trimmed))
|
|
421
|
-
transactions++;
|
|
422
|
-
const victimMatch = /^\*\*\* WE ROLL BACK TRANSACTION \((\d+)\)$/.exec(trimmed);
|
|
423
|
-
if (victimMatch)
|
|
424
|
-
victimTransaction = Number(victimMatch[1]);
|
|
425
|
-
}
|
|
426
|
-
return { transactions, victimTransaction };
|
|
417
|
+
return parseInnodbDeadlockSummary(status);
|
|
427
418
|
}
|
|
428
419
|
/**
|
|
429
420
|
* Runs query actual.
|
|
@@ -716,4 +707,4 @@ export default class VelociousDatabaseDriversMysql extends Base {
|
|
|
716
707
|
return holder !== null && holder !== undefined;
|
|
717
708
|
}
|
|
718
709
|
}
|
|
719
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvZHJpdmVycy9teXNxbC9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxVQUFVLE1BQU0sc0JBQXNCLENBQUE7QUFDN0MsT0FBTyxJQUFJLE1BQU0sWUFBWSxDQUFBO0FBQzdCLE9BQU8sY0FBYyxNQUFNLDBCQUEwQixDQUFBO0FBQ3JELE9BQU8sV0FBVyxNQUFNLHVCQUF1QixDQUFBO0FBQy9DLE9BQU8sV0FBVyxNQUFNLHVCQUF1QixDQUFBO0FBQy9DLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxZQUFZLE1BQU0sd0JBQXdCLENBQUE7QUFDakQsT0FBTyxTQUFTLE1BQU0scUJBQXFCLENBQUE7QUFDM0MsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFDcEMsT0FBTyxPQUFPLE1BQU0sY0FBYyxDQUFBO0FBQ2xDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUN6QixPQUFPLEtBQUssTUFBTSxZQUFZLENBQUE7QUFDOUIsT0FBTyxpQkFBaUIsTUFBTSw4QkFBOEIsQ0FBQTtBQUM1RCxPQUFPLFdBQVcsTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLFdBQVcsTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQTtBQUMvQyxPQUFPLEtBQUssTUFBTSxZQUFZLENBQUE7QUFDOUIsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUE7QUFDN0MsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFDcEMsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFFcEM7Ozs7Ozs7R0FPRztBQUNILE1BQU0scUNBQXFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFF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QUFNLEtBQUssU0FBUyxDQUFBO0lBQ2hELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQWx0ZXJUYWJsZSBmcm9tIFwiLi9zcWwvYWx0ZXItdGFibGUuanNcIlxuaW1wb3J0IEJhc2UgZnJvbSBcIi4uL2Jhc2UuanNcIlxuaW1wb3J0IENyZWF0ZURhdGFiYXNlIGZyb20gXCIuL3NxbC9jcmVhdGUtZGF0YWJhc2UuanNcIlxuaW1wb3J0IENyZWF0ZUluZGV4IGZyb20gXCIuL3NxbC9jcmVhdGUtaW5kZXguanNcIlxuaW1wb3J0IENyZWF0ZVRhYmxlIGZyb20gXCIuL3NxbC9jcmVhdGUtdGFibGUuanNcIlxuaW1wb3J0IERlbGV0ZSBmcm9tIFwiLi9zcWwvZGVsZXRlLmpzXCJcbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQgRHJvcERhdGFiYXNlIGZyb20gXCIuL3NxbC9kcm9wLWRhdGFiYXNlLmpzXCJcbmltcG9ydCBEcm9wVGFibGUgZnJvbSBcIi4vc3FsL2Ryb3AtdGFibGUuanNcIlxuaW1wb3J0IEluc2VydCBmcm9tIFwiLi9zcWwvaW5zZXJ0LmpzXCJcbmltcG9ydCBPcHRpb25zIGZyb20gXCIuL29wdGlvbnMuanNcIlxuaW1wb3J0IG15c3FsIGZyb20gXCJteXNxbFwiXG5pbXBvcnQgcXVlcnkgZnJvbSBcIi4vcXVlcnkuanNcIlxuaW1wb3J0IFF1ZXJ5QWJvcnRlZEVycm9yIGZyb20gXCIuLi8uLi9xdWVyeS1hYm9ydGVkLWVycm9yLmpzXCJcbmltcG9ydCBRdWVyeVBhcnNlciBmcm9tIFwiLi9xdWVyeS1wYXJzZXIuanNcIlxuaW1wb3J0IHN0cmVhbVF1ZXJ5IGZyb20gXCIuL3F1ZXJ5LXN0cmVhbS5qc1wiXG5pbXBvcnQgUmVtb3ZlSW5kZXggZnJvbSBcIi4vc3FsL3JlbW92ZS1pbmRleC5qc1wiXG5pbXBvcnQgVGFibGUgZnJvbSBcIi4vdGFibGUuanNcIlxuaW1wb3J0IFN0cnVjdHVyZVNxbCBmcm9tIFwiLi9zdHJ1Y3R1cmUtc3FsLmpzXCJcbmltcG9ydCBVcHNlcnQgZnJvbSBcIi4vc3FsL3Vwc2VydC5qc1wiXG5pbXBvcnQgVXBkYXRlIGZyb20gXCIuL3NxbC91cGRhdGUuanNcIlxuXG4vKipcbiAqIFNlbnRpbmVsIHRpbWVvdXQgKGluIHNlY29uZHMpIHVzZWQgYXMgdGhlIFwiYmxvY2sgZm9yZXZlclwiIHZhbHVlIHdoZW4gYVxuICogY2FsbGVyIGFza3MgZm9yIGFuIGluZGVmaW5pdGUgYWR2aXNvcnkgbG9jayBhY3F1aXJlLiBNeVNRTCBoaXN0b3JpY2FsbHlcbiAqIGFjY2VwdGVkIG5lZ2F0aXZlIHRpbWVvdXRzIGFzIFwiaW5maW5pdGVcIiwgYnV0IE1hcmlhREIgMTArIHNpbGVudGx5XG4gKiByZXR1cm5zIE5VTEwgZnJvbSBgR0VUX0xPQ0tgIHdoZW4gdGhlIHRpbWVvdXQgaXMgbmVnYXRpdmUsIHNvIHRoZVxuICogZHJpdmVyIGNsYW1wcyB0byBhIGNvbWZvcnRhYmx5IGxhcmdlIHBvc2l0aXZlIHZhbHVlICgxIHllYXIg4omrIGFueVxuICogcmVhbGlzdGljIGNyaXRpY2FsIHNlY3Rpb24pIGluc3RlYWQuXG4gKi9cbmNvbnN0IE1ZU1FMX0lOREVGSU5JVEVfTE9DS19USU1FT1VUX1NFQ09ORFMgPSA2MCAqIDYwICogMjQgKiAzNjVcbmNvbnN0IElOTk9EQl9ERUFETE9DS19DQVBUVVJFX1RJTUVPVVRfTVMgPSAyNTBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzRGF0YWJhc2VEcml2ZXJzTXlzcWwgZXh0ZW5kcyBCYXNle1xuICAvKiogQHR5cGUge2ltcG9ydChcIm15c3FsXCIpLlBvb2wgfCB1bmRlZmluZWR9ICovXG4gIHBvb2wgPSB1bmRlZmluZWRcblxuICAvKiogQHR5cGUge3N0cmluZyB8IG51bGx9ICovXG4gIF9kZXNpcmVkU2Vzc2lvblRpbWVab25lID0gXCIrMDA6MDBcIlxuXG4gIC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVsbH0gKi9cbiAgX2N1cnJlbnRTZXNzaW9uVGltZVpvbmUgPSBudWxsXG5cbiAgLyoqXG4gICAqIFJ1bnMgY29ubmVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGNvbm5lY3QoKSB7XG4gICAgdGhpcy5yZXNldEN1cnJlbnRTZXNzaW9uVGltZVpvbmUoKVxuICAgIHRoaXMucG9vbCA9IG15c3FsLmNyZWF0ZVBvb2woT2JqZWN0LmFzc2lnbih7Y29ubmVjdGlvbkxpbWl0OiAxfSwgdGhpcy5jb25uZWN0QXJncygpKSlcbiAgICB0aGlzLnBvb2wub24oXCJlcnJvclwiLCB0aGlzLm9uUG9vbEVycm9yKVxuICB9XG5cbiAgLyoqXG4gICAqIE9uIHBvb2wgZXJyb3IuXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gRXJyb3IgZnJvbSB0aGUgY29ubmVjdGlvbiBhdHRlbXB0LlxuICAgKi9cbiAgb25Qb29sRXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiVmVsb2Npb3VzIC8gTXlTUUwgZHJpdmVyIC8gUG9vbCBlcnJvclwiLCBlcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsb3NlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2Nsb3NlKCkge1xuICAgIGNvbnN0IHBvb2wgPSB0aGlzLnBvb2xcblxuICAgIGlmICghcG9vbCkgcmV0dXJuXG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBwb29sLmVuZCgoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy5wb29sID0gdW5kZWZpbmVkXG4gICAgdGhpcy5yZXNldEN1cnJlbnRTZXNzaW9uVGltZVpvbmUoKVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBwaHlzaWNhbCBNeVNRTCBzZXNzaW9uIGFmdGVyIGVhY2ggbG9naWNhbCBwb29sIGNoZWNrb3V0LlxuICAgKiBNeVNRTCBleHBvc2VzIG9wZW4tZW5kZWQgc2Vzc2lvbiBzdGF0ZSwgc28gcmVjb25uZWN0aW5nIGlzIHNhZmVyIHRoYW4gdHJ5aW5nXG4gICAqIHRvIGVudW1lcmF0ZSBhbmQgcmVzZXQgdmFyaWFibGVzLCB0ZW1wb3JhcnkgdGFibGVzLCBwcmVwYXJlZCBzdGF0ZW1lbnRzLFxuICAgKiBTUUwgbW9kZXMsIGFuZCBvdGhlciBjYWxsZXItY29udHJvbGxlZCBzdGF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgdGhlIHBoeXNpY2FsIHNlc3Npb24gaXMgY2xvc2VkLlxuICAgKi9cbiAgYXN5bmMgY2xlYW51cFNlc3Npb25TdGF0ZUFmdGVyQ2hlY2tvdXQoKSB7XG4gICAgYXdhaXQgdGhpcy5fY2xvc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IGNvbm5lY3Rpb24gY2hlY2tvdXQgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IG5hbWUgLSBIdW1hbi1yZWFkYWJsZSBuYW1lIGZvciB0aGlzIGFjdGl2ZSBjaGVja291dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHNldENvbm5lY3Rpb25DaGVja291dE5hbWUobmFtZSkge1xuICAgIGNvbnN0IHByZXZpb3VzTmFtZSA9IHRoaXMuX2Nvbm5lY3Rpb25DaGVja291dE5hbWVcblxuICAgIGF3YWl0IHN1cGVyLnNldENvbm5lY3Rpb25DaGVja291dE5hbWUobmFtZSlcblxuICAgIGlmIChuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChwcmV2aW91c05hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5KFwiU0VUIEB2ZWxvY2lvdXNfY29ubmVjdGlvbl9jaGVja291dF9uYW1lID0gTlVMTFwiLCB7bG9nTmFtZTogXCJDbGVhciBDb25uZWN0aW9uIENoZWNrb3V0IE5hbWVcIiwgcHJvY2Vzc0xpc3RDb21tZW50OiBmYWxzZSwgc2Vzc2lvblRpbWVab25lOiBmYWxzZX0pXG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucXVlcnkoYFNFVCBAdmVsb2Npb3VzX2Nvbm5lY3Rpb25fY2hlY2tvdXRfbmFtZSA9ICR7dGhpcy5xdW90ZShuYW1lKX1gLCB7bG9nTmFtZTogXCJTZXQgQ29ubmVjdGlvbiBDaGVja291dCBOYW1lXCIsIHByb2Nlc3NMaXN0Q29tbWVudDogZmFsc2UsIHNlc3Npb25UaW1lWm9uZTogZmFsc2V9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xlYXIgY29ubmVjdGlvbiBjaGVja291dCBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgY2xlYXJDb25uZWN0aW9uQ2hlY2tvdXROYW1lKCkge1xuICAgIGlmICh0aGlzLl9jb25uZWN0aW9uQ2hlY2tvdXROYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMucXVlcnkoXCJTRVQgQHZlbG9jaW91c19jb25uZWN0aW9uX2NoZWNrb3V0X25hbWUgPSBOVUxMXCIsIHtsb2dOYW1lOiBcIkNsZWFyIENvbm5lY3Rpb24gQ2hlY2tvdXQgTmFtZVwiLCBwcm9jZXNzTGlzdENvbW1lbnQ6IGZhbHNlLCBzZXNzaW9uVGltZVpvbmU6IGZhbHNlfSlcbiAgICB9XG5cbiAgICBhd2FpdCBzdXBlci5jbGVhckNvbm5lY3Rpb25DaGVja291dE5hbWUoKVxuICB9XG5cbiAgLyoqXG4gICAqIEhvb2sgYmVmb3JlIGV2ZXJ5IHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gX3NxbCAtIFNRTCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5RdWVyeU9wdGlvbnN9IG9wdGlvbnMgLSBRdWVyeSBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgYmVmb3JlUXVlcnkoX3NxbCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnNlc3Npb25UaW1lWm9uZSAhPT0gZmFsc2UpIGF3YWl0IHRoaXMuZW5zdXJlU2Vzc2lvblRpbWVab25lKClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkZXNpcmVkIGRhdGFiYXNlIHNlc3Npb24gdGltZSB6b25lIGZvciB0aGlzIGNvbm5lY3Rpb24gY29udGV4dC5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gRGVzaXJlZCBzZXNzaW9uIHRpbWUgem9uZS5cbiAgICovXG4gIGdldERlc2lyZWRTZXNzaW9uVGltZVpvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc2lyZWRTZXNzaW9uVGltZVpvbmVcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkZXNpcmVkIGRhdGFiYXNlIHNlc3Npb24gdGltZSB6b25lIHdpdGhvdXQgcXVlcnlpbmcgTXlTUUwgaW1tZWRpYXRlbHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gdGltZVpvbmUgLSBEZXNpcmVkIHNlc3Npb24gdGltZSB6b25lLlxuICAgKi9cbiAgc2V0RGVzaXJlZFNlc3Npb25UaW1lWm9uZSh0aW1lWm9uZSkge1xuICAgIHRoaXMuX2Rlc2lyZWRTZXNzaW9uVGltZVpvbmUgPSB0aW1lWm9uZVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGRhdGFiYXNlIHNlc3Npb24gdGltZSB6b25lIGxhc3QgY29uZmlybWVkIHRocm91Z2ggU0VUIHRpbWVfem9uZS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gQ3VycmVudCBrbm93biBzZXNzaW9uIHRpbWUgem9uZS5cbiAgICovXG4gIGdldEN1cnJlbnRTZXNzaW9uVGltZVpvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTZXNzaW9uVGltZVpvbmVcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGN1cnJlbnQga25vd24gZGF0YWJhc2Ugc2Vzc2lvbiB0aW1lIHpvbmUgd2hlbiB0aGUgcGh5c2ljYWwgY29ubmVjdGlvbiBjaGFuZ2VzLlxuICAgKi9cbiAgcmVzZXRDdXJyZW50U2Vzc2lvblRpbWVab25lKCkge1xuICAgIHRoaXMuX2N1cnJlbnRTZXNzaW9uVGltZVpvbmUgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyBNeVNRTCBoYXMgdGhlIGRlc2lyZWQgc2Vzc2lvbiB0aW1lIHpvbmUgYmVmb3JlIHVzZXIgU1FMIHJ1bnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFRydWUgd2hlbiBTRVQgdGltZV96b25lIHdhcyBleGVjdXRlZC5cbiAgICovXG4gIGFzeW5jIGVuc3VyZVNlc3Npb25UaW1lWm9uZSgpIHtcbiAgICBjb25zdCBkZXNpcmVkU2Vzc2lvblRpbWVab25lID0gdGhpcy5nZXREZXNpcmVkU2Vzc2lvblRpbWVab25lKClcblxuICAgIGlmIChkZXNpcmVkU2Vzc2lvblRpbWVab25lID09PSBudWxsIHx8IHRoaXMuZ2V0Q3VycmVudFNlc3Npb25UaW1lWm9uZSgpID09PSBkZXNpcmVkU2Vzc2lvblRpbWVab25lKSByZXR1cm4gZmFsc2VcblxuICAgIGF3YWl0IHRoaXMuc2V0U2Vzc2lvblRpbWVab25lKGRlc2lyZWRTZXNzaW9uVGltZVpvbmUpXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGRhdGFiYXNlIHNlc3Npb24gdGltZSB6b25lIGlmIGl0IGNoYW5nZWQgZnJvbSB0aGUgbGFzdCBjb25maXJtZWQgdmFsdWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lWm9uZSAtIFNlc3Npb24gdGltZSB6b25lIHZhbHVlIGFjY2VwdGVkIGJ5IE15U1FMLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBUcnVlIHdoZW4gU0VUIHRpbWVfem9uZSB3YXMgZXhlY3V0ZWQuXG4gICAqL1xuICBhc3luYyBzZXRTZXNzaW9uVGltZVpvbmUodGltZVpvbmUpIHtcbiAgICBpZiAodGhpcy5nZXRDdXJyZW50U2Vzc2lvblRpbWVab25lKCkgPT09IHRpbWVab25lKSByZXR1cm4gZmFsc2VcblxuICAgIGF3YWl0IHRoaXMuX3F1ZXJ5QWN0dWFsKGBTRVQgdGltZV96b25lID0gJHt0aGlzLnF1b3RlKHRpbWVab25lKX1gKVxuICAgIHRoaXMuX2N1cnJlbnRTZXNzaW9uVGltZVpvbmUgPSB0aW1lWm9uZVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbm5lY3QgYXJncy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBUaGUgY29ubmVjdCBhcmdzLlxuICAgKi9cbiAgY29ubmVjdEFyZ3MoKSB7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuZ2V0QXJncygpXG4gICAgY29uc3QgZm9yd2FyZCA9IFtcImRhdGFiYXNlXCIsIFwiaG9zdFwiLCBcInBhc3N3b3JkXCIsIFwicG9ydFwiXVxuXG4gICAgLyoqXG4gICAgICogQ29ubmVjdCBhcmdzLlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovXG4gICAgY29uc3QgY29ubmVjdEFyZ3MgPSB7Y2hhcnNldDogXCJ1dGY4bWI0XCIsIHRpbWV6b25lOiBcIlpcIn1cblxuICAgIGZvciAoY29uc3QgZm9yd2FyZFZhbHVlIG9mIGZvcndhcmQpIHtcbiAgICAgIGlmIChmb3J3YXJkVmFsdWUgaW4gYXJncykgY29ubmVjdEFyZ3NbZm9yd2FyZFZhbHVlXSA9IGRpZ2coYXJncywgZm9yd2FyZFZhbHVlKVxuICAgIH1cblxuICAgIGlmIChcInVzZXJuYW1lXCIgaW4gYXJncykgY29ubmVjdEFyZ3NbXCJ1c2VyXCJdID0gYXJnc1tcInVzZXJuYW1lXCJdXG4gICAgaWYgKFwiY2hhcnNldFwiIGluIGFyZ3MpIGNvbm5lY3RBcmdzW1wiY2hhcnNldFwiXSA9IGFyZ3NbXCJjaGFyc2V0XCJdXG4gICAgLy8gT3B0LWluIG9ubHkuIExldHMgYSB3aG9sZSBzdHJ1Y3R1cmUgU1FMIGR1bXAgcnVuIGluIG9uZSByb3VuZC10cmlwIHZpYVxuICAgIC8vIHtAbGluayBleGVjU3RydWN0dXJlU2NyaXB0fTsgb2ZmIGJ5IGRlZmF1bHQgc28gb3JkaW5hcnkgcXVlcmllcyBrZWVwIHJlamVjdGluZ1xuICAgIC8vIHN0YWNrZWQgc3RhdGVtZW50cy5cbiAgICBpZiAoXCJtdWx0aXBsZVN0YXRlbWVudHNcIiBpbiBhcmdzKSBjb25uZWN0QXJnc1tcIm11bHRpcGxlU3RhdGVtZW50c1wiXSA9IEJvb2xlYW4oZGlnZyhhcmdzLCBcIm11bHRpcGxlU3RhdGVtZW50c1wiKSlcblxuICAgIHJldHVybiBjb25uZWN0QXJnc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWx0ZXIgdGFibGUgc3Fscy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi90YWJsZS1kYXRhL2luZGV4LmpzXCIpLmRlZmF1bHR9IHRhYmxlRGF0YSAtIFRhYmxlIGRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgYXN5bmMgYWx0ZXJUYWJsZVNRTHModGFibGVEYXRhKSB7XG4gICAgY29uc3QgYWx0ZXJBcmdzID0ge3RhYmxlRGF0YSwgZHJpdmVyOiB0aGlzfVxuICAgIGNvbnN0IGFsdGVyVGFibGUgPSBuZXcgQWx0ZXJUYWJsZShhbHRlckFyZ3MpXG5cbiAgICByZXR1cm4gYXdhaXQgYWx0ZXJUYWJsZS50b1NRTHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY3JlYXRlIGRhdGFiYXNlIHNxbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlTmFtZSAtIERhdGFiYXNlIG5hbWUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5pZk5vdEV4aXN0c10gLSBXaGV0aGVyIGlmIG5vdCBleGlzdHMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBTUUwgc3RhdGVtZW50cy5cbiAgICovXG4gIGNyZWF0ZURhdGFiYXNlU3FsKGRhdGFiYXNlTmFtZSwgYXJncykge1xuICAgIGNvbnN0IGNyZWF0ZUFyZ3MgPSBPYmplY3QuYXNzaWduKHtkYXRhYmFzZU5hbWUsIGRyaXZlcjogdGhpc30sIGFyZ3MpXG4gICAgY29uc3QgY3JlYXRlRGF0YWJhc2UgPSBuZXcgQ3JlYXRlRGF0YWJhc2UoY3JlYXRlQXJncylcblxuICAgIHJldHVybiBjcmVhdGVEYXRhYmFzZS50b1NxbCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBkcm9wIGRhdGFiYXNlIHNxbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlTmFtZSAtIERhdGFiYXNlIG5hbWUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5pZkV4aXN0c10gLSBXaGV0aGVyIGlmIGV4aXN0cy5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfSAtIFNRTCBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgZHJvcERhdGFiYXNlU3FsKGRhdGFiYXNlTmFtZSwgYXJncykge1xuICAgIGNvbnN0IGRyb3BBcmdzID0gT2JqZWN0LmFzc2lnbih7ZGF0YWJhc2VOYW1lLCBkcml2ZXI6IHRoaXN9LCBhcmdzKVxuICAgIGNvbnN0IGRyb3BEYXRhYmFzZSA9IG5ldyBEcm9wRGF0YWJhc2UoZHJvcEFyZ3MpXG5cbiAgICByZXR1cm4gZHJvcERhdGFiYXNlLnRvU3FsKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNyZWF0ZSBpbmRleCBzcWxzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuQ3JlYXRlSW5kZXhTcWxBcmdzfSBpbmRleERhdGEgLSBJbmRleCBkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gUmVzb2x2ZXMgd2l0aCBTUUwgc3RhdGVtZW50cy5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUluZGV4U1FMcyhpbmRleERhdGEpIHtcbiAgICBjb25zdCBjcmVhdGVBcmdzID0gT2JqZWN0LmFzc2lnbih7ZHJpdmVyOiB0aGlzfSwgaW5kZXhEYXRhKVxuICAgIGNvbnN0IGNyZWF0ZUluZGV4ID0gbmV3IENyZWF0ZUluZGV4KGNyZWF0ZUFyZ3MpXG5cbiAgICByZXR1cm4gYXdhaXQgY3JlYXRlSW5kZXgudG9TUUxzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbW92ZSBpbmRleCBzcWxzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuUmVtb3ZlSW5kZXhTcWxBcmdzfSBpbmRleERhdGEgLSBJbmRleCBkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gUmVzb2x2ZXMgd2l0aCBTUUwgc3RhdGVtZW50cy5cbiAgICovXG4gIGFzeW5jIHJlbW92ZUluZGV4U1FMcyhpbmRleERhdGEpIHtcbiAgICBjb25zdCByZW1vdmVBcmdzID0gT2JqZWN0LmFzc2lnbih7ZHJpdmVyOiB0aGlzfSwgaW5kZXhEYXRhKVxuICAgIGNvbnN0IHJlbW92ZUluZGV4ID0gbmV3IFJlbW92ZUluZGV4KHJlbW92ZUFyZ3MpXG5cbiAgICByZXR1cm4gYXdhaXQgcmVtb3ZlSW5kZXgudG9TUUxzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNyZWF0ZSB0YWJsZSBzcWwuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vdGFibGUtZGF0YS9pbmRleC5qc1wiKS5kZWZhdWx0fSB0YWJsZURhdGEgLSBUYWJsZSBkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gUmVzb2x2ZXMgd2l0aCBTUUwgc3RhdGVtZW50cy5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVRhYmxlU3FsKHRhYmxlRGF0YSkge1xuICAgIGNvbnN0IGNyZWF0ZUFyZ3MgPSB7dGFibGVEYXRhLCBkcml2ZXI6IHRoaXN9XG4gICAgY29uc3QgY3JlYXRlVGFibGUgPSBuZXcgQ3JlYXRlVGFibGUoY3JlYXRlQXJncylcblxuICAgIHJldHVybiBjcmVhdGVUYWJsZS50b1NxbCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjdXJyZW50IGRhdGFiYXNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIFJlc29sdmVzIHdpdGggdGhlIGN1cnJlbnQgZGF0YWJhc2UuXG4gICAqL1xuICBhc3luYyBjdXJyZW50RGF0YWJhc2UoKSB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMucXVlcnkoXCJTRUxFQ1QgREFUQUJBU0UoKSBBUyBkYl9uYW1lXCIpXG5cbiAgICByZXR1cm4gZGlnZyhyb3dzLCAwLCBcImRiX25hbWVcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRpc2FibGUgZm9yZWlnbiBrZXlzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgZGlzYWJsZUZvcmVpZ25LZXlzKCkge1xuICAgIGF3YWl0IHRoaXMucXVlcnkoXCJTRVQgRk9SRUlHTl9LRVlfQ0hFQ0tTID0gMFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZW5hYmxlIGZvcmVpZ24ga2V5cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGVuYWJsZUZvcmVpZ25LZXlzKCkge1xuICAgIGF3YWl0IHRoaXMucXVlcnkoXCJTRVQgRk9SRUlHTl9LRVlfQ0hFQ0tTID0gMVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZHJvcCB0YWJsZSBzcWxzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLkRyb3BUYWJsZVNxbEFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFJlc29sdmVzIHdpdGggU1FMIHN0YXRlbWVudHMuXG4gICAqL1xuICBhc3luYyBkcm9wVGFibGVTUUxzKHRhYmxlTmFtZSwgYXJncyA9IHt9KSB7XG4gICAgY29uc3QgZHJvcEFyZ3MgPSBPYmplY3QuYXNzaWduKHt0YWJsZU5hbWUsIGRyaXZlcjogdGhpc30sIGFyZ3MpXG4gICAgY29uc3QgZHJvcFRhYmxlID0gbmV3IERyb3BUYWJsZShkcm9wQXJncylcblxuICAgIHJldHVybiBhd2FpdCBkcm9wVGFibGUudG9TUUxzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCB0eXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSB0eXBlLlxuICAgKi9cbiAgZ2V0VHlwZSgpIHsgcmV0dXJuIFwibXlzcWxcIiB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmV0cnlhYmxlIGRhdGFiYXNlIGVycm9yLlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEVycm9yIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5SZXRyeWFibGVEYXRhYmFzZUVycm9yUmVzdWx0fSAtIFJldHJ5IGluZm8uXG4gICAqL1xuICByZXRyeWFibGVEYXRhYmFzZUVycm9yKGVycm9yKSB7XG4gICAgLyoqIEB0eXBlIHtFcnJvciB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgY3VycmVudEVycm9yID0gZXJyb3JcbiAgICBsZXQgc2hvdWxkUmVjb25uZWN0ID0gZmFsc2VcblxuICAgIHdoaWxlIChjdXJyZW50RXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yQ29kZSA9IFwiY29kZVwiIGluIGN1cnJlbnRFcnJvciAmJiB0eXBlb2YgY3VycmVudEVycm9yLmNvZGUgPT0gXCJzdHJpbmdcIiA/IGN1cnJlbnRFcnJvci5jb2RlIDogdW5kZWZpbmVkXG4gICAgICBjb25zdCBtZXNzYWdlID0gY3VycmVudEVycm9yLm1lc3NhZ2UgfHwgXCJcIlxuXG4gICAgICBpZiAoZXJyb3JDb2RlID09IFwiRVJfQ0hFQ0tSRUFEXCIgfHwgbWVzc2FnZS5pbmNsdWRlcyhcIlJlY29yZCBoYXMgY2hhbmdlZCBzaW5jZSBsYXN0IHJlYWRcIikpIHtcbiAgICAgICAgcmV0dXJuIHtyZXRyeTogdHJ1ZSwgcmVjb25uZWN0OiBmYWxzZSwgd2FpdE1zOiA1MH1cbiAgICAgIH1cblxuICAgICAgLy8gQSBkZWFkbG9jayBvciBsb2NrLXdhaXQtdGltZW91dCBhYm9ydHMgdGhlIHdob2xlIHRyYW5zYWN0aW9uOyBpdCBtdXN0IGJlIHJldHJpZWQgYXQgdGhlXG4gICAgICAvLyB0cmFuc2FjdGlvbiBsZXZlbCAocmUtcnVubmluZyB0aGUgY2FsbGJhY2spLCBub3QgdGhlIHF1ZXJ5IGxldmVsLCBzbyBmbGFnIGl0IGFzIHN1Y2ggYW5kXG4gICAgICAvLyBrZWVwIGByZXRyeWAgZmFsc2Ugc28gYW4gaW4tdHJhbnNhY3Rpb24gcXVlcnkgZG9lcyBub3QgcmV0cnkgYWdhaW5zdCB0aGUgZGVhZCB0cmFuc2FjdGlvbi5cbiAgICAgIGlmIChcbiAgICAgICAgZXJyb3JDb2RlID09IFwiRVJfTE9DS19ERUFETE9DS1wiIHx8XG4gICAgICAgIGVycm9yQ29kZSA9PSBcIkVSX0xPQ0tfV0FJVF9USU1FT1VUXCIgfHxcbiAgICAgICAgbWVzc2FnZS5pbmNsdWRlcyhcIkVSX0xPQ0tfREVBRExPQ0tcIikgfHxcbiAgICAgICAgbWVzc2FnZS5pbmNsdWRlcyhcIkRlYWRsb2NrIGZvdW5kXCIpIHx8XG4gICAgICAgIG1lc3NhZ2UuaW5jbHVkZXMoXCJMb2NrIHdhaXQgdGltZW91dCBleGNlZWRlZFwiKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB7cmV0cnk6IGZhbHNlLCByZWNvbm5lY3Q6IGZhbHNlLCBkZWFkbG9jazogdHJ1ZSwgd2FpdE1zOiA1MH1cbiAgICAgIH1cblxuICAgICAgc2hvdWxkUmVjb25uZWN0IHx8PSAoXG4gICAgICAgIGVycm9yQ29kZSA9PSBcIkVDT05OUkVGVVNFRFwiIHx8XG4gICAgICAgIG1lc3NhZ2UuaW5jbHVkZXMoXCJFQ09OTlJFRlVTRURcIikgfHxcbiAgICAgICAgbWVzc2FnZS5pbmNsdWRlcyhcImNvbm5lY3QgRUNPTk5SRUZVU0VEXCIpIHx8XG4gICAgICAgIG1lc3NhZ2UuaW5jbHVkZXMoXCJQUk9UT0NPTF9DT05ORUNUSU9OX0xPU1RcIikgfHxcbiAgICAgICAgbWVzc2FnZS5pbmNsdWRlcyhcIkNvbm5lY3Rpb24gbG9zdFwiKVxuICAgICAgKVxuXG4gICAgICBjdXJyZW50RXJyb3IgPSBjdXJyZW50RXJyb3IuY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGN1cnJlbnRFcnJvci5jYXVzZSA6IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZXRyeTogc2hvdWxkUmVjb25uZWN0LFxuICAgICAgcmVjb25uZWN0OiBzaG91bGRSZWNvbm5lY3QsXG4gICAgICB3YWl0TXM6IDUwXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZWRhY3RlZCwgYm91bmRlZCBleGNlcnB0IGZyb20gTXlTUUwncyBsYXRlc3QgSW5ub0RCIGRlYWRsb2NrIHJlcG9ydC4gQ2FwdHVyZSB1c2VzIGFcbiAgICogc2VwYXJhdGUgc2hvcnQtbGl2ZWQgY29ubmVjdGlvbiBzbyBpdCBjYW5ub3QgcXVldWUgYWhlYWQgb2Ygcm9sbGJhY2sgb3IgdGhlIG5leHQgcmV0cnkgb24gdGhpc1xuICAgKiBkcml2ZXIncyBzaW5nbGUtY29ubmVjdGlvbiBwb29sLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSAtIFNhZmUgZGlhZ25vc3RpYyBjb250ZXh0LlxuICAgKi9cbiAgYXN5bmMgX2RlYWRsb2NrRGlhZ25vc3RpY0NvbnRleHQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuX2NhcHR1cmVJbm5vZGJEZWFkbG9ja1N0YXR1cygpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlubm9kYkRlYWRsb2NrU3VtbWFyeTogdGhpcy5faW5ub2RiRGVhZGxvY2tTdW1tYXJ5KHN0YXR1cyksXG4gICAgICAgIHN0YXR1c0NhcHR1cmU6IFwiY2FwdHVyZWRcIlxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHtzdGF0dXNDYXB0dXJlOiBcImZhaWxlZFwifVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYXB0dXJlcyBTSE9XIEVOR0lORSBJTk5PREIgU1RBVFVTIG9uIGEgYm91bmRlZCB0aHJvd2F3YXkgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBSYXcgc2VydmVyIHN0YXR1cywgcmV0YWluZWQgb25seSBpbnNpZGUgdGhlIHJlZGFjdGlvbiBwYXRoLlxuICAgKi9cbiAgYXN5bmMgX2NhcHR1cmVJbm5vZGJEZWFkbG9ja1N0YXR1cygpIHtcbiAgICBjb25zdCBwb29sV2l0aENvbmZpZyA9IC8qKiBAdHlwZSB7e2NvbmZpZz86IHtjb25uZWN0aW9uQ29uZmlnPzogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59fSB8IHVuZGVmaW5lZH0gKi8gKHRoaXMucG9vbClcbiAgICBjb25zdCBjb25uZWN0aW9uQ29uZmlnID0gcG9vbFdpdGhDb25maWc/LmNvbmZpZz8uY29ubmVjdGlvbkNvbmZpZ1xuICAgIGNvbnN0IGNhcHR1cmVDb25maWcgPSBjb25uZWN0aW9uQ29uZmlnIHx8IHRoaXMuY29ubmVjdEFyZ3MoKVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwibXlzcWxcIikuQ29ubmVjdGlvbiB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIGxldCBjb25uZWN0aW9uXG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlXG4gICAgICAvKipcbiAgICAgICAqIEZpbmlzaGVzIHRoZSBzdGF0dXMgY2FwdHVyZSBvbmNlIGFuZCBkZXN0cm95cyBpdHMgdGVtcG9yYXJ5IGNvbm5lY3Rpb24uXG4gICAgICAgKiBAcGFyYW0ge0Vycm9yIHwgdW5kZWZpbmVkfSBlcnJvciAtIENhcHR1cmUgZXJyb3IsIHdoZW4gcHJlc2VudC5cbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RhdHVzXSAtIENhcHR1cmVkIHN0YXR1cy5cbiAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAgICovXG4gICAgICBjb25zdCBmaW5pc2ggPSAoZXJyb3IsIHN0YXR1cyA9IFwiXCIpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVyblxuICAgICAgICBzZXR0bGVkID0gdHJ1ZVxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24pIGNvbm5lY3Rpb24uZGVzdHJveSgpXG4gICAgICAgIGlmIChlcnJvcikgcmVqZWN0KGVycm9yKVxuICAgICAgICBlbHNlIHJlc29sdmUoc3RhdHVzKVxuICAgICAgfVxuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gZmluaXNoKG5ldyBFcnJvcihcIklubm9EQiBzdGF0dXMgY2FwdHVyZSB0aW1lZCBvdXRcIikpLCBJTk5PREJfREVBRExPQ0tfQ0FQVFVSRV9USU1FT1VUX01TKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25uZWN0aW9uID0gbXlzcWwuY3JlYXRlQ29ubmVjdGlvbihjYXB0dXJlQ29uZmlnKVxuICAgICAgICBjb25uZWN0aW9uLm9uKFwiZXJyb3JcIiwgKGVycm9yKSA9PiBmaW5pc2goZXJyb3IpKVxuICAgICAgICBjb25uZWN0aW9uLnF1ZXJ5KFwiU0hPVyBFTkdJTkUgSU5OT0RCIFNUQVRVU1wiLCAoZXJyb3IsIHJvd3MpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGZpbmlzaChlcnJvcilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpcnN0Um93ID0gQXJyYXkuaXNBcnJheShyb3dzKSA/IHJvd3NbMF0gOiB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBzdGF0dXMgPSBmaXJzdFJvdyAmJiB0eXBlb2YgZmlyc3RSb3cuU3RhdHVzID09IFwic3RyaW5nXCIgPyBmaXJzdFJvdy5TdGF0dXMgOiBcIlwiXG5cbiAgICAgICAgICBmaW5pc2godW5kZWZpbmVkLCBzdGF0dXMpXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBmaW5pc2goZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFwiSW5ub0RCIHN0YXR1cyBjYXB0dXJlIGZhaWxlZFwiKSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIG9ubHkgZml4ZWQtZm9ybWF0IGRlYWRsb2NrIGNvdW50ZXJzLiBUaGUgc2VydmVyIHJlcG9ydCBjb250YWlucyByYXcgU1FMLCBpZGVudGlmaWVycyxcbiAgICogYW5kIHBoeXNpY2FsIHJlY29yZCBkYXRhLCBzbyBubyBzb3VyY2UgdGV4dCBpcyBldmVyIGluY2x1ZGVkIGluIGFuIGFwcGxpY2F0aW9uIGRpYWdub3N0aWMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0dXMgLSBTSE9XIEVOR0lORSBJTk5PREIgU1RBVFVTIHRleHQuXG4gICAqIEByZXR1cm5zIHt7dHJhbnNhY3Rpb25zOiBudW1iZXIsIHZpY3RpbVRyYW5zYWN0aW9uOiBudW1iZXIgfCBudWxsfX0gLSBTdHJ1Y3R1cmFsIGRlYWRsb2NrIHN1bW1hcnkuXG4gICAqL1xuICBfaW5ub2RiRGVhZGxvY2tTdW1tYXJ5KHN0YXR1cykge1xuICAgIGNvbnN0IGRlYWRsb2NrU3RhcnQgPSBzdGF0dXMuaW5kZXhPZihcIkxBVEVTVCBERVRFQ1RFRCBERUFETE9DS1wiKVxuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGRlYWRsb2NrU3RhcnQgPj0gMCA/IHN0YXR1cy5zbGljZShkZWFkbG9ja1N0YXJ0KSA6IHN0YXR1c1xuICAgIGxldCB0cmFuc2FjdGlvbnMgPSAwXG4gICAgLyoqIEB0eXBlIHtudW1iZXIgfCBudWxsfSAqL1xuICAgIGxldCB2aWN0aW1UcmFuc2FjdGlvbiA9IG51bGxcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBjYW5kaWRhdGUuc3BsaXQoL1xccj9cXG4vKSkge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpXG4gICAgICBpZiAoL15cXCpcXCpcXCogXFwoXFxkK1xcKSBUUkFOU0FDVElPTjokLy50ZXN0KHRyaW1tZWQpKSB0cmFuc2FjdGlvbnMrK1xuICAgICAgY29uc3QgdmljdGltTWF0Y2ggPSAvXlxcKlxcKlxcKiBXRSBST0xMIEJBQ0sgVFJBTlNBQ1RJT04gXFwoKFxcZCspXFwpJC8uZXhlYyh0cmltbWVkKVxuICAgICAgaWYgKHZpY3RpbU1hdGNoKSB2aWN0aW1UcmFuc2FjdGlvbiA9IE51bWJlcih2aWN0aW1NYXRjaFsxXSlcbiAgICB9XG5cbiAgICByZXR1cm4ge3RyYW5zYWN0aW9ucywgdmljdGltVHJhbnNhY3Rpb259XG4gIH1cblxuICAvKipcbiAgICogUnVucyBxdWVyeSBhY3R1YWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBTUUwgc3RyaW5nLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuUXVlcnlPcHRpb25zfSBbb3B0aW9uc10gLSBRdWVyeSBvcHRpb25zIChjYXJyaWVzIHRoZSBvcHRpb25hbCBhYm9ydCBzaWduYWwpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5UmVzdWx0VHlwZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcXVlcnkgYWN0dWFsLlxuICAgKi9cbiAgYXN5bmMgX3F1ZXJ5QWN0dWFsKHNxbCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLnBvb2wpIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgaWYgKCF0aGlzLnBvb2wpIHRocm93IG5ldyBFcnJvcihcIk15U1FMIHBvb2wgZmFpbGVkIHRvIGluaXRpYWxpemVcIilcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcXVlcnkodGhpcy5wb29sLCBzcWwsIHtzaWduYWw6IG9wdGlvbnMuc2lnbmFsfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gUHJlc2VydmUgYW4gYWJvcnQgYXMtaXMgc28gdGhlIHJldHJ5IGxvb3AgY2FuIHJlY29nbmlzZSBpdCBhcyB0ZXJtaW5hbFxuICAgICAgLy8gKHdyYXBwaW5nIGl0IGluIGEgcGxhaW4gRXJyb3Igd291bGQgbG9zZSB0aGUgUXVlcnlBYm9ydGVkRXJyb3IgdHlwZSkuXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBRdWVyeUFib3J0ZWRFcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IuY29ubmVjdGlvbkRlc3Ryb3llZCkgdGhpcy5yZXNldEN1cnJlbnRTZXNzaW9uVGltZVpvbmUoKVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuXG4gICAgICAvLyBSZS10aHJvdyB0byB1bi1jb3JydXB0IHN0YWNrdHJhY2VcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVlcnkgZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YCwge2NhdXNlOiBlcnJvcn0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1ZXJ5IGZhaWxlZDogJHtlcnJvcn1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RyZWFtcyB0aGUgcm93cyBvZiBgc3FsYCBmcm9tIGEgZGVkaWNhdGVkIHBvb2xlZCBjb25uZWN0aW9uIHVzaW5nIHRoZSBNeVNRTCBjdXJzb3IsIHNvIGFcbiAgICogbGFyZ2UgcmVzdWx0IHNldCBpcyByZWFkIGluY3JlbWVudGFsbHkgaW5zdGVhZCBvZiBiZWluZyBidWZmZXJlZC4gT3ZlcnJpZGVzIHRoZSBiYXNlXG4gICAqIGJ1ZmZlcmVkIGZhbGxiYWNrIHdpdGggdHJ1ZSBzZXJ2ZXItc2lkZSBzdHJlYW1pbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBTUUwgc3RyaW5nIHRvIHN0cmVhbS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5T3B0aW9uc30gW29wdGlvbnNdIC0gUXVlcnkgb3duZXJzaGlwIG9wdGlvbnMuXG4gICAqIEB5aWVsZHMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAtIFRoZSByZXN1bHQgcm93cywgb25lIGF0IGEgdGltZS5cbiAgICovXG4gIGFzeW5jICpxdWVyeVN0cmVhbShzcWwsIG9wdGlvbnMgPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuX3dhaXRGb3JPcGVyYXRpb25MZWFzZShvcHRpb25zLm9wZXJhdGlvbk93bmVyKVxuXG4gICAgaWYgKCF0aGlzLnBvb2wpIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgaWYgKCF0aGlzLnBvb2wpIHRocm93IG5ldyBFcnJvcihcIk15U1FMIHBvb2wgZmFpbGVkIHRvIGluaXRpYWxpemVcIilcblxuICAgIHlpZWxkKiBzdHJlYW1RdWVyeSh0aGlzLnBvb2wsIHNxbClcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIG11dGF0aW9uIHdpdGggYWZmZWN0ZWQtcm93IG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsIC0gTXV0YXRpb24gU1FMLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSAtIEFmZmVjdGVkIHJvdyBjb3VudC5cbiAgICovXG4gIGFzeW5jIF9hZmZlY3RlZFJvd3NBY3R1YWwoc3FsKSB7XG4gICAgaWYgKCF0aGlzLnBvb2wpIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgaWYgKCF0aGlzLnBvb2wpIHRocm93IG5ldyBFcnJvcihcIk15U1FMIHBvb2wgZmFpbGVkIHRvIGluaXRpYWxpemVcIilcbiAgICBjb25zdCBwb29sID0gdGhpcy5wb29sXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcG9vbC5xdWVyeShzcWwsIChlcnJvciwgcmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikgcmVqZWN0KGVycm9yKVxuICAgICAgICBlbHNlIHJlc29sdmUoXCJhZmZlY3RlZFJvd3NcIiBpbiByZXN1bHQgPyByZXN1bHQuYWZmZWN0ZWRSb3dzIDogMClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGZ1bGwgbXVsdGktc3RhdGVtZW50IHN0cnVjdHVyZSBTUUwgc2NyaXB0IGluIG9uZSByb3VuZC10cmlwIHdoZW4gdGhlXG4gICAqIGNvbm5lY3Rpb24gd2FzIGNvbmZpZ3VyZWQgd2l0aCBgbXVsdGlwbGVTdGF0ZW1lbnRzOiB0cnVlYC4gUnVucyBvbiB0aGUgcG9vbGVkXG4gICAqIGNvbm5lY3Rpb24gc28gdGhlIGNhbGxlcidzIGBTRVQgRk9SRUlHTl9LRVlfQ0hFQ0tTID0gMGAgYXBwbGllcy4gUmV0dXJucyBmYWxzZSBzb1xuICAgKiB0aGUgY2FsbGVyIHJ1bnMgc3RhdGVtZW50cyBpbmRpdmlkdWFsbHkgd2hlbiBtdWx0aS1zdGF0ZW1lbnQgcXVlcmllcyBhcmUgb2ZmLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RydWN0dXJlU3FsIC0gRnVsbCBtdWx0aS1zdGF0ZW1lbnQgc3RydWN0dXJlIFNRTC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgc2NyaXB0IHdhcyBleGVjdXRlZCBhcyBvbmUgYmF0Y2guXG4gICAqL1xuICBhc3luYyBleGVjU3RydWN0dXJlU2NyaXB0KHN0cnVjdHVyZVNxbCkge1xuICAgIGlmICghdGhpcy5nZXRBcmdzKCkubXVsdGlwbGVTdGF0ZW1lbnRzKSByZXR1cm4gZmFsc2VcblxuICAgIC8vIFRoZSBiYXRjaGVkIHBvb2wgY2FsbCBiZWxvdyBieXBhc3NlcyBCYXNlI3F1ZXJ5LCBzbyByZS1ydW4gdGhlIHNhbWUgcmVhZC1vbmx5XG4gICAgLy8gd3JpdGUgZ3VhcmQgdGhlIHBlci1zdGF0ZW1lbnQgcGF0aCBhcHBsaWVzIGJlZm9yZSBleGVjdXRpbmcgdGhlIGR1bXAuXG4gICAgdGhpcy5fYXNzZXJ0V3JpdGFibGVRdWVyeShzdHJ1Y3R1cmVTcWwpXG5cbiAgICBpZiAoIXRoaXMucG9vbCkgYXdhaXQgdGhpcy5jb25uZWN0KClcbiAgICBpZiAoIXRoaXMucG9vbCkgdGhyb3cgbmV3IEVycm9yKFwiTXlTUUwgcG9vbCBmYWlsZWQgdG8gaW5pdGlhbGl6ZVwiKVxuXG4gICAgY29uc3QgcG9vbCA9IHRoaXMucG9vbFxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcG9vbC5xdWVyeShzdHJ1Y3R1cmVTcWwsIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHJlamVjdChlcnJvcilcbiAgICAgICAgZWxzZSByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogVXNlcyBvbmUgbXVsdGktc3RhdGVtZW50IHJlcXVlc3Qgb25seSB3aGVuIHRoZSBleGlzdGluZyBjb25uZWN0aW9uIG9wdGlvblxuICAgKiBleHBsaWNpdGx5IGFsbG93cyBpdDsgb3RoZXJ3aXNlIHJldGFpbnMgdGhlIGJhc2Ugc2VxdWVudGlhbCBiZWhhdmlvci5cbiAgICogQHBhcmFtIHtBcnJheTxpbXBvcnQoXCIuLi9iYXNlLXRhYmxlLmpzXCIpLmRlZmF1bHQ+fSB0YWJsZXMgLSBFbGlnaWJsZSB0YWJsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gZXZlcnkgdGFibGUgaGFzIGJlZW4gdHJ1bmNhdGVkLlxuICAgKi9cbiAgYXN5bmMgdHJ1bmNhdGVUYWJsZXModGFibGVzKSB7XG4gICAgaWYgKCF0aGlzLmdldEFyZ3MoKS5tdWx0aXBsZVN0YXRlbWVudHMpIHtcbiAgICAgIGF3YWl0IHN1cGVyLnRydW5jYXRlVGFibGVzKHRhYmxlcylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlbWVudHMgPSB0YWJsZXMubWFwKCh0YWJsZSkgPT4gYFRSVU5DQVRFIFRBQkxFICR7dGhpcy5xdW90ZVRhYmxlKHRhYmxlLmdldE5hbWUoKSl9YClcblxuICAgIGF3YWl0IHRoaXMucXVlcnkoc3RhdGVtZW50cy5qb2luKFwiO1xcblwiKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHF1ZXJ5IHRvIHNxbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9xdWVyeS9pbmRleC5qc1wiKS5kZWZhdWx0fSBxdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNRTCBzdHJpbmcuXG4gICAqL1xuICBxdWVyeVRvU3FsKHF1ZXJ5KSB7IHJldHVybiBuZXcgUXVlcnlQYXJzZXIoe3F1ZXJ5fSkudG9TcWwoKSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2hvdWxkIHNldCBhdXRvIGluY3JlbWVudCB3aGVuIHByaW1hcnkga2V5LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHNldCBhdXRvIGluY3JlbWVudCB3aGVuIHByaW1hcnkga2V5LlxuICAgKi9cbiAgc2hvdWxkU2V0QXV0b0luY3JlbWVudFdoZW5QcmltYXJ5S2V5KCkgeyByZXR1cm4gdHJ1ZSB9XG4gIHN1cHBvcnRzRGVmYXVsdFByaW1hcnlLZXlVVUlEKCkgeyByZXR1cm4gZmFsc2UgfVxuICBzdXBwb3J0c0Nyb3NzRGF0YWJhc2VSZWZlcmVuY2VzKCkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZXNjYXBlLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFZhbHVlIHRvIHVzZS5cbiAgICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAtIFRoZSBlc2NhcGUuXG4gICAqL1xuICBlc2NhcGUodmFsdWUpIHtcbiAgICBjb25zdCBlc2NhcGVkVmFsdWVXaXRoUXVvdGVzID0gdGhpcy5wb29sXG4gICAgICA/IHRoaXMucG9vbC5lc2NhcGUodGhpcy5fY29udmVydFZhbHVlKHZhbHVlKSlcbiAgICAgIDogbXlzcWwuZXNjYXBlKHRoaXMuX2NvbnZlcnRWYWx1ZSh2YWx1ZSkpXG5cbiAgICByZXR1cm4gZXNjYXBlZFZhbHVlV2l0aFF1b3Rlcy5zbGljZSgxLCBlc2NhcGVkVmFsdWVXaXRoUXVvdGVzLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBxdW90ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBxdW90ZS5cbiAgICovXG4gIHF1b3RlKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMucG9vbCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9vbC5lc2NhcGUodGhpcy5fY29udmVydFZhbHVlKHZhbHVlKSlcbiAgICB9XG5cbiAgICByZXR1cm4gbXlzcWwuZXNjYXBlKHRoaXMuX2NvbnZlcnRWYWx1ZSh2YWx1ZSkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBkZWxldGUgc3FsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuRGVsZXRlU3FsQXJnc1R5cGV9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTUUwgc3RyaW5nLlxuICAgKi9cbiAgZGVsZXRlU3FsKHt0YWJsZU5hbWUsIGNvbmRpdGlvbnN9KSB7XG4gICAgY29uc3QgZGVsZXRlSW5zdHJ1Y3Rpb24gPSBuZXcgRGVsZXRlKHtjb25kaXRpb25zLCBkcml2ZXI6IHRoaXMsIHRhYmxlTmFtZX0pXG5cbiAgICByZXR1cm4gZGVsZXRlSW5zdHJ1Y3Rpb24udG9TcWwoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW5zZXJ0IHNxbC5cbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5JbnNlcnRTcWxBcmdzVHlwZX0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNRTCBzdHJpbmcuXG4gICAqL1xuICBpbnNlcnRTcWwoYXJncykge1xuICAgIGNvbnN0IGluc2VydEFyZ3MgPSBPYmplY3QuYXNzaWduKHtkcml2ZXI6IHRoaXN9LCBhcmdzKVxuICAgIGNvbnN0IGluc2VydCA9IG5ldyBJbnNlcnQoaW5zZXJ0QXJncylcblxuICAgIHJldHVybiBpbnNlcnQudG9TcWwoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHRhYmxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8aW1wb3J0KFwiLi4vYmFzZS10YWJsZS5qc1wiKS5kZWZhdWx0Pj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgdGFibGVzLlxuICAgKi9cbiAgYXN5bmMgZ2V0VGFibGVzKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jYWNoZWRTY2hlbWFNZXRhZGF0YShcInRhYmxlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnF1ZXJ5KFwiU0hPVyBGVUxMIFRBQkxFU1wiKVxuICAgICAgY29uc3QgdGFibGVzID0gW11cblxuICAgICAgZm9yIChjb25zdCByb3cgb2YgcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlKHRoaXMsIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi8gKHJvdykpXG5cbiAgICAgICAgdGFibGVzLnB1c2godGFibGUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZXNcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3RydWN0dXJlIHNxbC5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbD59IC0gUmVzb2x2ZXMgd2l0aCBTUUwgc3RyaW5nLlxuICAgKi9cbiAgYXN5bmMgc3RydWN0dXJlU3FsKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jYWNoZWRTY2hlbWFNZXRhZGF0YShcInN0cnVjdHVyZVNxbFwiLCBhc3luYyAoKSA9PiBhd2FpdCBuZXcgU3RydWN0dXJlU3FsKHtkcml2ZXI6IHRoaXN9KS50b1NxbCgpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbGFzdCBpbnNlcnQgaWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5RdWVyeU9wdGlvbnN9IFtvcHRpb25zXSAtIFF1ZXJ5IG93bmVyc2hpcCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSAtIFJlc29sdmVzIHdpdGggdGhlIGxhc3QgaW5zZXJ0IGlkLlxuICAgKi9cbiAgYXN5bmMgbGFzdEluc2VydElEKG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucXVlcnkoXCJTRUxFQ1QgTEFTVF9JTlNFUlRfSUQoKSBBUyBsYXN0X2luc2VydF9pZFwiLCBvcHRpb25zKVxuXG4gICAgcmV0dXJuIGRpZ2cocmVzdWx0LCAwLCBcImxhc3RfaW5zZXJ0X2lkXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7T3B0aW9uc30gLSBUaGUgb3B0aW9ucyBvcHRpb25zLlxuICAgKi9cbiAgb3B0aW9ucygpIHtcbiAgICBpZiAoIXRoaXMuX29wdGlvbnMpIHRoaXMuX29wdGlvbnMgPSBuZXcgT3B0aW9ucyh7ZHJpdmVyOiB0aGlzfSlcblxuICAgIHJldHVybiB0aGlzLl9vcHRpb25zXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdGFydCB0cmFuc2FjdGlvbiBhY3Rpb24uXG4gICAqIEBwYXJhbSB7UGljazxpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5T3B0aW9ucywgXCJvcGVyYXRpb25Pd25lclwiPn0gW29wdGlvbnNdIC0gVHJhbnNhY3Rpb24gb3duZXJzaGlwLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3N0YXJ0VHJhbnNhY3Rpb25BY3Rpb24ob3B0aW9ucyA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5xdWVyeShcIlNUQVJUIFRSQU5TQUNUSU9OXCIsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB1cGRhdGUgc3FsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuVXBkYXRlU3FsQXJnc1R5cGV9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTUUwgc3RyaW5nLlxuICAgKi9cbiAgdXBkYXRlU3FsKHtjb25kaXRpb25zLCBkYXRhLCB0YWJsZU5hbWV9KSB7XG4gICAgY29uc3QgdXBkYXRlID0gbmV3IFVwZGF0ZSh7Y29uZGl0aW9ucywgZGF0YSwgZHJpdmVyOiB0aGlzLCB0YWJsZU5hbWV9KVxuXG4gICAgcmV0dXJuIHVwZGF0ZS50b1NxbCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB1cHNlcnQgc3FsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuVXBzZXJ0U3FsQXJnc1R5cGV9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTUUwgc3RyaW5nLlxuICAgKi9cbiAgdXBzZXJ0U3FsKGFyZ3MpIHtcbiAgICBjb25zdCB1cHNlcnQgPSBuZXcgVXBzZXJ0KHsuLi5hcmdzLCBkcml2ZXI6IHRoaXN9KVxuXG4gICAgcmV0dXJuIHVwc2VydC50b1NxbCgpXG4gIH1cblxuICAvKipcbiAgICogQmxvY2tzIHVudGlsIGEgTXlTUUwvTWFyaWFEQiB1c2VyLWxldmVsIGxvY2sgaXMgYWNxdWlyZWQgb24gdGhpc1xuICAgKiBjb25uZWN0aW9uLiBJbXBsZW1lbnRlZCB2aWEgYEdFVF9MT0NLKG5hbWUsIHRpbWVvdXQpYCwgd2hlcmUgdGhlXG4gICAqIHRpbWVvdXQgaXMgaW4gc2Vjb25kcy5cbiAgICpcbiAgICogTXlTUUwgaGlzdG9yaWNhbGx5IGRvY3VtZW50ZWQgYSBuZWdhdGl2ZSB0aW1lb3V0IGFzIFwiaW5maW5pdGVcIixcbiAgICogYnV0IE1hcmlhREIgMTArIHNpbGVudGx5IHJlamVjdHMgbmVnYXRpdmUgdGltZW91dHMgYW5kIHJldHVybnNcbiAgICogYE5VTExgIGZyb20gYEdFVF9MT0NLYC4gVG8gbWFrZSB0aGUgaGVscGVyIHBvcnRhYmxlIGFjcm9zcyBNeVNRTFxuICAgKiBhbmQgTWFyaWFEQiB0aGUgXCJpbmRlZmluaXRlXCIgY2FzZSBpcyBlbmNvZGVkIGFzIGEgbGFyZ2UgcG9zaXRpdmVcbiAgICogdGltZW91dCAob25lIHllYXIpLCB3aGljaCBpcyBjb21mb3J0YWJseSBsb25nZXIgdGhhbiBhbnlcbiAgICogcmVhbGlzdGljIGNyaXRpY2FsIHNlY3Rpb24gYW5kIHdvcmtzIG9uIGV2ZXJ5IHN1cHBvcnRlZCB2ZXJzaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHBhcmFtIHt7dGltZW91dE1zPzogbnVtYmVyIHwgbnVsbH19IFthcmdzXSAtIE9wdGlvbmFsIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzOyBgbnVsbGAsIGB1bmRlZmluZWRgLCBvciBuZWdhdGl2ZSBibG9ja3MgZm9yIGBNWVNRTF9JTkRFRklOSVRFX0xPQ0tfVElNRU9VVF9TRUNPTkRTYC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gVHJ1ZSBpZiBhY3F1aXJlZCwgZmFsc2UgaWYgdGhlIHRpbWVvdXQgZWxhcHNlZC5cbiAgICovXG4gIGFzeW5jIF9hY3F1aXJlQWR2aXNvcnlMb2NrKG5hbWUsIHt0aW1lb3V0TXN9ID0ge30pIHtcbiAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IHR5cGVvZiB0aW1lb3V0TXMgPT09IFwibnVtYmVyXCIgJiYgdGltZW91dE1zID49IDBcbiAgICAgID8gTWF0aC5jZWlsKHRpbWVvdXRNcyAvIDEwMDApXG4gICAgICA6IE1ZU1FMX0lOREVGSU5JVEVfTE9DS19USU1FT1VUX1NFQ09ORFNcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5xdWVyeShgU0VMRUNUIEdFVF9MT0NLKCR7dGhpcy5xdW90ZShuYW1lKX0sICR7dGltZW91dFNlY29uZHN9KSBBUyB2ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19yZXN1bHRgKVxuICAgIGNvbnN0IHJlc3VsdCA9IHJvd3M/LlswXT8udmVsb2Npb3VzX2Fkdmlzb3J5X2xvY2tfcmVzdWx0XG5cbiAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEdFVF9MT0NLIHJldHVybmVkIE5VTEwgZm9yIGFkdmlzb3J5IGxvY2sgJHtKU09OLnN0cmluZ2lmeShuYW1lKX0gKHR5cGljYWxseSBhbiBvdXQtb2YtbWVtb3J5IG9yIHRocmVhZC1raWxsZWQgY29uZGl0aW9uKWApXG4gICAgfVxuXG4gICAgcmV0dXJuIE51bWJlcihyZXN1bHQpID09PSAxXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0cnkgYWNxdWlyZSBhZHZpc29yeSBsb2NrLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gVHJ1ZSBpZiB0aGUgbG9jayB3YXMgYWNxdWlyZWQsIGZhbHNlIGlmIGl0IHdhcyBhbHJlYWR5IGhlbGQuXG4gICAqL1xuICBhc3luYyBfdHJ5QWNxdWlyZUFkdmlzb3J5TG9jayhuYW1lKSB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMucXVlcnkoYFNFTEVDVCBHRVRfTE9DSygke3RoaXMucXVvdGUobmFtZSl9LCAwKSBBUyB2ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19yZXN1bHRgKVxuICAgIGNvbnN0IHJlc3VsdCA9IHJvd3M/LlswXT8udmVsb2Npb3VzX2Fkdmlzb3J5X2xvY2tfcmVzdWx0XG5cbiAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEdFVF9MT0NLIHJldHVybmVkIE5VTEwgZm9yIGFkdmlzb3J5IGxvY2sgJHtKU09OLnN0cmluZ2lmeShuYW1lKX0gKHR5cGljYWxseSBhbiBvdXQtb2YtbWVtb3J5IG9yIHRocmVhZC1raWxsZWQgY29uZGl0aW9uKWApXG4gICAgfVxuXG4gICAgcmV0dXJuIE51bWJlcihyZXN1bHQpID09PSAxXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZWxlYXNlIGFkdmlzb3J5IGxvY2suXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBUcnVlIGlmIHRoZSBsb2NrIHdhcyBoZWxkIGJ5IHRoaXMgc2Vzc2lvbiBhbmQgaGFzIG5vdyBiZWVuIHJlbGVhc2VkLlxuICAgKi9cbiAgYXN5bmMgX3JlbGVhc2VBZHZpc29yeUxvY2sobmFtZSkge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLnF1ZXJ5KGBTRUxFQ1QgUkVMRUFTRV9MT0NLKCR7dGhpcy5xdW90ZShuYW1lKX0pIEFTIHZlbG9jaW91c19hZHZpc29yeV9sb2NrX3Jlc3VsdGAsIHtyZXRyeTogZmFsc2V9KVxuICAgIGNvbnN0IHJlc3VsdCA9IHJvd3M/LlswXT8udmVsb2Npb3VzX2Fkdmlzb3J5X2xvY2tfcmVzdWx0XG5cbiAgICByZXR1cm4gTnVtYmVyKHJlc3VsdCkgPT09IDFcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIGFkdmlzb3J5IGxvY2sgaGVsZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFRydWUgaWYgYW55IHNlc3Npb24gY3VycmVudGx5IGhvbGRzIHRoZSBsb2NrLlxuICAgKi9cbiAgYXN5bmMgaXNBZHZpc29yeUxvY2tIZWxkKG5hbWUpIHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5xdWVyeShgU0VMRUNUIElTX1VTRURfTE9DSygke3RoaXMucXVvdGUobmFtZSl9KSBBUyB2ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19ob2xkZXJgKVxuICAgIGNvbnN0IGhvbGRlciA9IHJvd3M/LlswXT8udmVsb2Npb3VzX2Fkdmlzb3J5X2xvY2tfaG9sZGVyXG5cbiAgICByZXR1cm4gaG9sZGVyICE9PSBudWxsICYmIGhvbGRlciAhPT0gdW5kZWZpbmVkXG4gIH1cbn1cbiJdfQ==
|
|
710
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvZHJpdmVycy9teXNxbC9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxVQUFVLE1BQU0sc0JBQXNCLENBQUE7QUFDN0MsT0FBTyxJQUFJLE1BQU0sWUFBWSxDQUFBO0FBQzdCLE9BQU8sY0FBYyxNQUFNLDBCQUEwQixDQUFBO0FBQ3JELE9BQU8sV0FBVyxNQUFNLHVCQUF1QixDQUFBO0FBQy9DLE9BQU8sV0FBVyxNQUFNLHVCQUF1QixDQUFBO0FBQy9DLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxZQUFZLE1BQU0sd0JBQXdCLENBQUE7QUFDakQsT0FBTyxTQUFTLE1BQU0scUJBQXFCLENBQUE7QUFDM0MsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFDcEMsT0FBTyxPQUFPLE1BQU0sY0FBYyxDQUFBO0FBQ2xDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUN6QixPQUFPLEtBQUssTUFBTSxZQUFZLENBQUE7QUFDOUIsT0FBTyxpQkFBaUIsTUFBTSw4QkFBOEIsQ0FBQTtBQUM1RCxPQUFPLFdBQVcsTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLFdBQVcsTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQTtBQUMvQyxPQUFPLEtBQUssTUFBTSxZQUFZLENBQUE7QUFDOUIsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUE7QUFDN0MsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFDcEMsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFDcEMsT0FBTywwQkFBMEIsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV4RTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxx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QVMsQ0FBQyxJQUFJLENBQUMsMERBQTBELENBQUMsQ0FBQTtRQUM3SSxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzdCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUk7UUFDN0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsRUFBRSxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO1FBQzNILE1BQU0sTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLDhCQUE4QixDQUFBO1FBRXhELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM3QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJO1FBQzNCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMscUNBQXFDLENBQUMsQ0FBQTtRQUMzRyxNQUFNLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSw4QkFBOEIsQ0FBQTtRQUV4RCxPQUFPLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLFNBQVMsQ0FBQTtJQUNoRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IEFsdGVyVGFibGUgZnJvbSBcIi4vc3FsL2FsdGVyLXRhYmxlLmpzXCJcbmltcG9ydCBCYXNlIGZyb20gXCIuLi9iYXNlLmpzXCJcbmltcG9ydCBDcmVhdGVEYXRhYmFzZSBmcm9tIFwiLi9zcWwvY3JlYXRlLWRhdGFiYXNlLmpzXCJcbmltcG9ydCBDcmVhdGVJbmRleCBmcm9tIFwiLi9zcWwvY3JlYXRlLWluZGV4LmpzXCJcbmltcG9ydCBDcmVhdGVUYWJsZSBmcm9tIFwiLi9zcWwvY3JlYXRlLXRhYmxlLmpzXCJcbmltcG9ydCBEZWxldGUgZnJvbSBcIi4vc3FsL2RlbGV0ZS5qc1wiXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IERyb3BEYXRhYmFzZSBmcm9tIFwiLi9zcWwvZHJvcC1kYXRhYmFzZS5qc1wiXG5pbXBvcnQgRHJvcFRhYmxlIGZyb20gXCIuL3NxbC9kcm9wLXRhYmxlLmpzXCJcbmltcG9ydCBJbnNlcnQgZnJvbSBcIi4vc3FsL2luc2VydC5qc1wiXG5pbXBvcnQgT3B0aW9ucyBmcm9tIFwiLi9vcHRpb25zLmpzXCJcbmltcG9ydCBteXNxbCBmcm9tIFwibXlzcWxcIlxuaW1wb3J0IHF1ZXJ5IGZyb20gXCIuL3F1ZXJ5LmpzXCJcbmltcG9ydCBRdWVyeUFib3J0ZWRFcnJvciBmcm9tIFwiLi4vLi4vcXVlcnktYWJvcnRlZC1lcnJvci5qc1wiXG5pbXBvcnQgUXVlcnlQYXJzZXIgZnJvbSBcIi4vcXVlcnktcGFyc2VyLmpzXCJcbmltcG9ydCBzdHJlYW1RdWVyeSBmcm9tIFwiLi9xdWVyeS1zdHJlYW0uanNcIlxuaW1wb3J0IFJlbW92ZUluZGV4IGZyb20gXCIuL3NxbC9yZW1vdmUtaW5kZXguanNcIlxuaW1wb3J0IFRhYmxlIGZyb20gXCIuL3RhYmxlLmpzXCJcbmltcG9ydCBTdHJ1Y3R1cmVTcWwgZnJvbSBcIi4vc3RydWN0dXJlLXNxbC5qc1wiXG5pbXBvcnQgVXBzZXJ0IGZyb20gXCIuL3NxbC91cHNlcnQuanNcIlxuaW1wb3J0IFVwZGF0ZSBmcm9tIFwiLi9zcWwvdXBkYXRlLmpzXCJcbmltcG9ydCBwYXJzZUlubm9kYkRlYWRsb2NrU3VtbWFyeSBmcm9tIFwiLi9kZWFkbG9jay1kaWFnbm9zdGljLXBhcnNlci5qc1wiXG5cbi8qKlxuICogU2VudGluZWwgdGltZW91dCAoaW4gc2Vjb25kcykgdXNlZCBhcyB0aGUgXCJibG9jayBmb3JldmVyXCIgdmFsdWUgd2hlbiBhXG4gKiBjYWxsZXIgYXNrcyBmb3IgYW4gaW5kZWZpbml0ZSBhZHZpc29yeSBsb2NrIGFjcXVpcmUuIE15U1FMIGhpc3RvcmljYWxseVxuICogYWNjZXB0ZWQgbmVnYXRpdmUgdGltZW91dHMgYXMgXCJpbmZpbml0ZVwiLCBidXQgTWFyaWFEQiAxMCsgc2lsZW50bHlcbiAqIHJldHVybnMgTlVMTCBmcm9tIGBHRVRfTE9DS2Agd2hlbiB0aGUgdGltZW91dCBpcyBuZWdhdGl2ZSwgc28gdGhlXG4gKiBkcml2ZXIgY2xhbXBzIHRvIGEgY29tZm9ydGFibHkgbGFyZ2UgcG9zaXRpdmUgdmFsdWUgKDEgeWVhciDiiasgYW55XG4gKiByZWFsaXN0aWMgY3JpdGljYWwgc2VjdGlvbikgaW5zdGVhZC5cbiAqL1xuY29uc3QgTVlTUUxfSU5ERUZJTklURV9MT0NLX1RJTUVPVVRfU0VDT05EUyA9IDYwICogNjAgKiAyNCAqIDM2NVxuY29uc3QgSU5OT0RCX0RFQURMT0NLX0NBUFRVUkVfVElNRU9VVF9NUyA9IDI1MFxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNEYXRhYmFzZURyaXZlcnNNeXNxbCBleHRlbmRzIEJhc2V7XG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwibXlzcWxcIikuUG9vbCB8IHVuZGVmaW5lZH0gKi9cbiAgcG9vbCA9IHVuZGVmaW5lZFxuXG4gIC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVsbH0gKi9cbiAgX2Rlc2lyZWRTZXNzaW9uVGltZVpvbmUgPSBcIiswMDowMFwiXG5cbiAgLyoqIEB0eXBlIHtzdHJpbmcgfCBudWxsfSAqL1xuICBfY3VycmVudFNlc3Npb25UaW1lWm9uZSA9IG51bGxcblxuICAvKipcbiAgICogUnVucyBjb25uZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgY29ubmVjdCgpIHtcbiAgICB0aGlzLnJlc2V0Q3VycmVudFNlc3Npb25UaW1lWm9uZSgpXG4gICAgdGhpcy5wb29sID0gbXlzcWwuY3JlYXRlUG9vbChPYmplY3QuYXNzaWduKHtjb25uZWN0aW9uTGltaXQ6IDF9LCB0aGlzLmNvbm5lY3RBcmdzKCkpKVxuICAgIHRoaXMucG9vbC5vbihcImVycm9yXCIsIHRoaXMub25Qb29sRXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogT24gcG9vbCBlcnJvci5cbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBFcnJvciBmcm9tIHRoZSBjb25uZWN0aW9uIGF0dGVtcHQuXG4gICAqL1xuICBvblBvb2xFcnJvciA9IChlcnJvcikgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJWZWxvY2lvdXMgLyBNeVNRTCBkcml2ZXIgLyBQb29sIGVycm9yXCIsIGVycm9yKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xvc2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfY2xvc2UoKSB7XG4gICAgY29uc3QgcG9vbCA9IHRoaXMucG9vbFxuXG4gICAgaWYgKCFwb29sKSByZXR1cm5cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHBvb2wuZW5kKChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgICB0aGlzLnBvb2wgPSB1bmRlZmluZWRcbiAgICB0aGlzLnJlc2V0Q3VycmVudFNlc3Npb25UaW1lWm9uZSgpXG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZXMgdGhlIHBoeXNpY2FsIE15U1FMIHNlc3Npb24gYWZ0ZXIgZWFjaCBsb2dpY2FsIHBvb2wgY2hlY2tvdXQuXG4gICAqIE15U1FMIGV4cG9zZXMgb3Blbi1lbmRlZCBzZXNzaW9uIHN0YXRlLCBzbyByZWNvbm5lY3RpbmcgaXMgc2FmZXIgdGhhbiB0cnlpbmdcbiAgICogdG8gZW51bWVyYXRlIGFuZCByZXNldCB2YXJpYWJsZXMsIHRlbXBvcmFyeSB0YWJsZXMsIHByZXBhcmVkIHN0YXRlbWVudHMsXG4gICAqIFNRTCBtb2RlcywgYW5kIG90aGVyIGNhbGxlci1jb250cm9sbGVkIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciB0aGUgcGh5c2ljYWwgc2Vzc2lvbiBpcyBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBjbGVhbnVwU2Vzc2lvblN0YXRlQWZ0ZXJDaGVja291dCgpIHtcbiAgICBhd2FpdCB0aGlzLl9jbG9zZSgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgY29ubmVjdGlvbiBjaGVja291dCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gbmFtZSAtIEh1bWFuLXJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgYWN0aXZlIGNoZWNrb3V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgc2V0Q29ubmVjdGlvbkNoZWNrb3V0TmFtZShuYW1lKSB7XG4gICAgY29uc3QgcHJldmlvdXNOYW1lID0gdGhpcy5fY29ubmVjdGlvbkNoZWNrb3V0TmFtZVxuXG4gICAgYXdhaXQgc3VwZXIuc2V0Q29ubmVjdGlvbkNoZWNrb3V0TmFtZShuYW1lKVxuXG4gICAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHByZXZpb3VzTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucXVlcnkoXCJTRVQgQHZlbG9jaW91c19jb25uZWN0aW9uX2NoZWNrb3V0X25hbWUgPSBOVUxMXCIsIHtsb2dOYW1lOiBcIkNsZWFyIENvbm5lY3Rpb24gQ2hlY2tvdXQgTmFtZVwiLCBwcm9jZXNzTGlzdENvbW1lbnQ6IGZhbHNlLCBzZXNzaW9uVGltZVpvbmU6IGZhbHNlfSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5xdWVyeShgU0VUIEB2ZWxvY2lvdXNfY29ubmVjdGlvbl9jaGVja291dF9uYW1lID0gJHt0aGlzLnF1b3RlKG5hbWUpfWAsIHtsb2dOYW1lOiBcIlNldCBDb25uZWN0aW9uIENoZWNrb3V0IE5hbWVcIiwgcHJvY2Vzc0xpc3RDb21tZW50OiBmYWxzZSwgc2Vzc2lvblRpbWVab25lOiBmYWxzZX0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGVhciBjb25uZWN0aW9uIGNoZWNrb3V0IG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBjbGVhckNvbm5lY3Rpb25DaGVja291dE5hbWUoKSB7XG4gICAgaWYgKHRoaXMuX2Nvbm5lY3Rpb25DaGVja291dE5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXdhaXQgdGhpcy5xdWVyeShcIlNFVCBAdmVsb2Npb3VzX2Nvbm5lY3Rpb25fY2hlY2tvdXRfbmFtZSA9IE5VTExcIiwge2xvZ05hbWU6IFwiQ2xlYXIgQ29ubmVjdGlvbiBDaGVja291dCBOYW1lXCIsIHByb2Nlc3NMaXN0Q29tbWVudDogZmFsc2UsIHNlc3Npb25UaW1lWm9uZTogZmFsc2V9KVxuICAgIH1cblxuICAgIGF3YWl0IHN1cGVyLmNsZWFyQ29ubmVjdGlvbkNoZWNrb3V0TmFtZSgpXG4gIH1cblxuICAvKipcbiAgICogSG9vayBiZWZvcmUgZXZlcnkgcXVlcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfc3FsIC0gU1FMIHN0cmluZy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5T3B0aW9uc30gb3B0aW9ucyAtIFF1ZXJ5IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBiZWZvcmVRdWVyeShfc3FsLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuc2Vzc2lvblRpbWVab25lICE9PSBmYWxzZSkgYXdhaXQgdGhpcy5lbnN1cmVTZXNzaW9uVGltZVpvbmUoKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGRlc2lyZWQgZGF0YWJhc2Ugc2Vzc2lvbiB0aW1lIHpvbmUgZm9yIHRoaXMgY29ubmVjdGlvbiBjb250ZXh0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBEZXNpcmVkIHNlc3Npb24gdGltZSB6b25lLlxuICAgKi9cbiAgZ2V0RGVzaXJlZFNlc3Npb25UaW1lWm9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVzaXJlZFNlc3Npb25UaW1lWm9uZVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGRlc2lyZWQgZGF0YWJhc2Ugc2Vzc2lvbiB0aW1lIHpvbmUgd2l0aG91dCBxdWVyeWluZyBNeVNRTCBpbW1lZGlhdGVseS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSB0aW1lWm9uZSAtIERlc2lyZWQgc2Vzc2lvbiB0aW1lIHpvbmUuXG4gICAqL1xuICBzZXREZXNpcmVkU2Vzc2lvblRpbWVab25lKHRpbWVab25lKSB7XG4gICAgdGhpcy5fZGVzaXJlZFNlc3Npb25UaW1lWm9uZSA9IHRpbWVab25lXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZGF0YWJhc2Ugc2Vzc2lvbiB0aW1lIHpvbmUgbGFzdCBjb25maXJtZWQgdGhyb3VnaCBTRVQgdGltZV96b25lLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBDdXJyZW50IGtub3duIHNlc3Npb24gdGltZSB6b25lLlxuICAgKi9cbiAgZ2V0Q3VycmVudFNlc3Npb25UaW1lWm9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFNlc3Npb25UaW1lWm9uZVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgY3VycmVudCBrbm93biBkYXRhYmFzZSBzZXNzaW9uIHRpbWUgem9uZSB3aGVuIHRoZSBwaHlzaWNhbCBjb25uZWN0aW9uIGNoYW5nZXMuXG4gICAqL1xuICByZXNldEN1cnJlbnRTZXNzaW9uVGltZVpvbmUoKSB7XG4gICAgdGhpcy5fY3VycmVudFNlc3Npb25UaW1lWm9uZSA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIE15U1FMIGhhcyB0aGUgZGVzaXJlZCBzZXNzaW9uIHRpbWUgem9uZSBiZWZvcmUgdXNlciBTUUwgcnVucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gVHJ1ZSB3aGVuIFNFVCB0aW1lX3pvbmUgd2FzIGV4ZWN1dGVkLlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlU2Vzc2lvblRpbWVab25lKCkge1xuICAgIGNvbnN0IGRlc2lyZWRTZXNzaW9uVGltZVpvbmUgPSB0aGlzLmdldERlc2lyZWRTZXNzaW9uVGltZVpvbmUoKVxuXG4gICAgaWYgKGRlc2lyZWRTZXNzaW9uVGltZVpvbmUgPT09IG51bGwgfHwgdGhpcy5nZXRDdXJyZW50U2Vzc2lvblRpbWVab25lKCkgPT09IGRlc2lyZWRTZXNzaW9uVGltZVpvbmUpIHJldHVybiBmYWxzZVxuXG4gICAgYXdhaXQgdGhpcy5zZXRTZXNzaW9uVGltZVpvbmUoZGVzaXJlZFNlc3Npb25UaW1lWm9uZSlcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZGF0YWJhc2Ugc2Vzc2lvbiB0aW1lIHpvbmUgaWYgaXQgY2hhbmdlZCBmcm9tIHRoZSBsYXN0IGNvbmZpcm1lZCB2YWx1ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVab25lIC0gU2Vzc2lvbiB0aW1lIHpvbmUgdmFsdWUgYWNjZXB0ZWQgYnkgTXlTUUwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFRydWUgd2hlbiBTRVQgdGltZV96b25lIHdhcyBleGVjdXRlZC5cbiAgICovXG4gIGFzeW5jIHNldFNlc3Npb25UaW1lWm9uZSh0aW1lWm9uZSkge1xuICAgIGlmICh0aGlzLmdldEN1cnJlbnRTZXNzaW9uVGltZVpvbmUoKSA9PT0gdGltZVpvbmUpIHJldHVybiBmYWxzZVxuXG4gICAgYXdhaXQgdGhpcy5fcXVlcnlBY3R1YWwoYFNFVCB0aW1lX3pvbmUgPSAke3RoaXMucXVvdGUodGltZVpvbmUpfWApXG4gICAgdGhpcy5fY3VycmVudFNlc3Npb25UaW1lWm9uZSA9IHRpbWVab25lXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY29ubmVjdCBhcmdzLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIFRoZSBjb25uZWN0IGFyZ3MuXG4gICAqL1xuICBjb25uZWN0QXJncygpIHtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5nZXRBcmdzKClcbiAgICBjb25zdCBmb3J3YXJkID0gW1wiZGF0YWJhc2VcIiwgXCJob3N0XCIsIFwicGFzc3dvcmRcIiwgXCJwb3J0XCJdXG5cbiAgICAvKipcbiAgICAgKiBDb25uZWN0IGFyZ3MuXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi9cbiAgICBjb25zdCBjb25uZWN0QXJncyA9IHtjaGFyc2V0OiBcInV0ZjhtYjRcIiwgdGltZXpvbmU6IFwiWlwifVxuXG4gICAgZm9yIChjb25zdCBmb3J3YXJkVmFsdWUgb2YgZm9yd2FyZCkge1xuICAgICAgaWYgKGZvcndhcmRWYWx1ZSBpbiBhcmdzKSBjb25uZWN0QXJnc1tmb3J3YXJkVmFsdWVdID0gZGlnZyhhcmdzLCBmb3J3YXJkVmFsdWUpXG4gICAgfVxuXG4gICAgaWYgKFwidXNlcm5hbWVcIiBpbiBhcmdzKSBjb25uZWN0QXJnc1tcInVzZXJcIl0gPSBhcmdzW1widXNlcm5hbWVcIl1cbiAgICBpZiAoXCJjaGFyc2V0XCIgaW4gYXJncykgY29ubmVjdEFyZ3NbXCJjaGFyc2V0XCJdID0gYXJnc1tcImNoYXJzZXRcIl1cbiAgICAvLyBPcHQtaW4gb25seS4gTGV0cyBhIHdob2xlIHN0cnVjdHVyZSBTUUwgZHVtcCBydW4gaW4gb25lIHJvdW5kLXRyaXAgdmlhXG4gICAgLy8ge0BsaW5rIGV4ZWNTdHJ1Y3R1cmVTY3JpcHR9OyBvZmYgYnkgZGVmYXVsdCBzbyBvcmRpbmFyeSBxdWVyaWVzIGtlZXAgcmVqZWN0aW5nXG4gICAgLy8gc3RhY2tlZCBzdGF0ZW1lbnRzLlxuICAgIGlmIChcIm11bHRpcGxlU3RhdGVtZW50c1wiIGluIGFyZ3MpIGNvbm5lY3RBcmdzW1wibXVsdGlwbGVTdGF0ZW1lbnRzXCJdID0gQm9vbGVhbihkaWdnKGFyZ3MsIFwibXVsdGlwbGVTdGF0ZW1lbnRzXCIpKVxuXG4gICAgcmV0dXJuIGNvbm5lY3RBcmdzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhbHRlciB0YWJsZSBzcWxzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL3RhYmxlLWRhdGEvaW5kZXguanNcIikuZGVmYXVsdH0gdGFibGVEYXRhIC0gVGFibGUgZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFJlc29sdmVzIHdpdGggU1FMIHN0YXRlbWVudHMuXG4gICAqL1xuICBhc3luYyBhbHRlclRhYmxlU1FMcyh0YWJsZURhdGEpIHtcbiAgICBjb25zdCBhbHRlckFyZ3MgPSB7dGFibGVEYXRhLCBkcml2ZXI6IHRoaXN9XG4gICAgY29uc3QgYWx0ZXJUYWJsZSA9IG5ldyBBbHRlclRhYmxlKGFsdGVyQXJncylcblxuICAgIHJldHVybiBhd2FpdCBhbHRlclRhYmxlLnRvU1FMcygpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjcmVhdGUgZGF0YWJhc2Ugc3FsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VOYW1lIC0gRGF0YWJhc2UgbmFtZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmlmTm90RXhpc3RzXSAtIFdoZXRoZXIgaWYgbm90IGV4aXN0cy5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfSAtIFNRTCBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgY3JlYXRlRGF0YWJhc2VTcWwoZGF0YWJhc2VOYW1lLCBhcmdzKSB7XG4gICAgY29uc3QgY3JlYXRlQXJncyA9IE9iamVjdC5hc3NpZ24oe2RhdGFiYXNlTmFtZSwgZHJpdmVyOiB0aGlzfSwgYXJncylcbiAgICBjb25zdCBjcmVhdGVEYXRhYmFzZSA9IG5ldyBDcmVhdGVEYXRhYmFzZShjcmVhdGVBcmdzKVxuXG4gICAgcmV0dXJuIGNyZWF0ZURhdGFiYXNlLnRvU3FsKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRyb3AgZGF0YWJhc2Ugc3FsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VOYW1lIC0gRGF0YWJhc2UgbmFtZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmlmRXhpc3RzXSAtIFdoZXRoZXIgaWYgZXhpc3RzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IC0gU1FMIHN0YXRlbWVudHMuXG4gICAqL1xuICBkcm9wRGF0YWJhc2VTcWwoZGF0YWJhc2VOYW1lLCBhcmdzKSB7XG4gICAgY29uc3QgZHJvcEFyZ3MgPSBPYmplY3QuYXNzaWduKHtkYXRhYmFzZU5hbWUsIGRyaXZlcjogdGhpc30sIGFyZ3MpXG4gICAgY29uc3QgZHJvcERhdGFiYXNlID0gbmV3IERyb3BEYXRhYmFzZShkcm9wQXJncylcblxuICAgIHJldHVybiBkcm9wRGF0YWJhc2UudG9TcWwoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY3JlYXRlIGluZGV4IHNxbHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5DcmVhdGVJbmRleFNxbEFyZ3N9IGluZGV4RGF0YSAtIEluZGV4IGRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlSW5kZXhTUUxzKGluZGV4RGF0YSkge1xuICAgIGNvbnN0IGNyZWF0ZUFyZ3MgPSBPYmplY3QuYXNzaWduKHtkcml2ZXI6IHRoaXN9LCBpbmRleERhdGEpXG4gICAgY29uc3QgY3JlYXRlSW5kZXggPSBuZXcgQ3JlYXRlSW5kZXgoY3JlYXRlQXJncylcblxuICAgIHJldHVybiBhd2FpdCBjcmVhdGVJbmRleC50b1NRTHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVtb3ZlIGluZGV4IHNxbHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5SZW1vdmVJbmRleFNxbEFyZ3N9IGluZGV4RGF0YSAtIEluZGV4IGRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlSW5kZXhTUUxzKGluZGV4RGF0YSkge1xuICAgIGNvbnN0IHJlbW92ZUFyZ3MgPSBPYmplY3QuYXNzaWduKHtkcml2ZXI6IHRoaXN9LCBpbmRleERhdGEpXG4gICAgY29uc3QgcmVtb3ZlSW5kZXggPSBuZXcgUmVtb3ZlSW5kZXgocmVtb3ZlQXJncylcblxuICAgIHJldHVybiBhd2FpdCByZW1vdmVJbmRleC50b1NRTHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY3JlYXRlIHRhYmxlIHNxbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi90YWJsZS1kYXRhL2luZGV4LmpzXCIpLmRlZmF1bHR9IHRhYmxlRGF0YSAtIFRhYmxlIGRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlVGFibGVTcWwodGFibGVEYXRhKSB7XG4gICAgY29uc3QgY3JlYXRlQXJncyA9IHt0YWJsZURhdGEsIGRyaXZlcjogdGhpc31cbiAgICBjb25zdCBjcmVhdGVUYWJsZSA9IG5ldyBDcmVhdGVUYWJsZShjcmVhdGVBcmdzKVxuXG4gICAgcmV0dXJuIGNyZWF0ZVRhYmxlLnRvU3FsKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGN1cnJlbnQgZGF0YWJhc2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY3VycmVudCBkYXRhYmFzZS5cbiAgICovXG4gIGFzeW5jIGN1cnJlbnREYXRhYmFzZSgpIHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5xdWVyeShcIlNFTEVDVCBEQVRBQkFTRSgpIEFTIGRiX25hbWVcIilcblxuICAgIHJldHVybiBkaWdnKHJvd3MsIDAsIFwiZGJfbmFtZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGlzYWJsZSBmb3JlaWduIGtleXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBkaXNhYmxlRm9yZWlnbktleXMoKSB7XG4gICAgYXdhaXQgdGhpcy5xdWVyeShcIlNFVCBGT1JFSUdOX0tFWV9DSEVDS1MgPSAwXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBlbmFibGUgZm9yZWlnbiBrZXlzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgZW5hYmxlRm9yZWlnbktleXMoKSB7XG4gICAgYXdhaXQgdGhpcy5xdWVyeShcIlNFVCBGT1JFSUdOX0tFWV9DSEVDS1MgPSAxXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBkcm9wIHRhYmxlIHNxbHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuRHJvcFRhYmxlU3FsQXJnc1R5cGV9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gUmVzb2x2ZXMgd2l0aCBTUUwgc3RhdGVtZW50cy5cbiAgICovXG4gIGFzeW5jIGRyb3BUYWJsZVNRTHModGFibGVOYW1lLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCBkcm9wQXJncyA9IE9iamVjdC5hc3NpZ24oe3RhYmxlTmFtZSwgZHJpdmVyOiB0aGlzfSwgYXJncylcbiAgICBjb25zdCBkcm9wVGFibGUgPSBuZXcgRHJvcFRhYmxlKGRyb3BBcmdzKVxuXG4gICAgcmV0dXJuIGF3YWl0IGRyb3BUYWJsZS50b1NRTHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHR5cGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHR5cGUuXG4gICAqL1xuICBnZXRUeXBlKCkgeyByZXR1cm4gXCJteXNxbFwiIH1cblxuICAvKipcbiAgICogUnVucyByZXRyeWFibGUgZGF0YWJhc2UgZXJyb3IuXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gRXJyb3IgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlJldHJ5YWJsZURhdGFiYXNlRXJyb3JSZXN1bHR9IC0gUmV0cnkgaW5mby5cbiAgICovXG4gIHJldHJ5YWJsZURhdGFiYXNlRXJyb3IoZXJyb3IpIHtcbiAgICAvKiogQHR5cGUge0Vycm9yIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBjdXJyZW50RXJyb3IgPSBlcnJvclxuICAgIGxldCBzaG91bGRSZWNvbm5lY3QgPSBmYWxzZVxuXG4gICAgd2hpbGUgKGN1cnJlbnRFcnJvcikge1xuICAgICAgY29uc3QgZXJyb3JDb2RlID0gXCJjb2RlXCIgaW4gY3VycmVudEVycm9yICYmIHR5cGVvZiBjdXJyZW50RXJyb3IuY29kZSA9PSBcInN0cmluZ1wiID8gY3VycmVudEVycm9yLmNvZGUgOiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjdXJyZW50RXJyb3IubWVzc2FnZSB8fCBcIlwiXG5cbiAgICAgIGlmIChlcnJvckNvZGUgPT0gXCJFUl9DSEVDS1JFQURcIiB8fCBtZXNzYWdlLmluY2x1ZGVzKFwiUmVjb3JkIGhhcyBjaGFuZ2VkIHNpbmNlIGxhc3QgcmVhZFwiKSkge1xuICAgICAgICByZXR1cm4ge3JldHJ5OiB0cnVlLCByZWNvbm5lY3Q6IGZhbHNlLCB3YWl0TXM6IDUwfVxuICAgICAgfVxuXG4gICAgICAvLyBBIGRlYWRsb2NrIG9yIGxvY2std2FpdC10aW1lb3V0IGFib3J0cyB0aGUgd2hvbGUgdHJhbnNhY3Rpb247IGl0IG11c3QgYmUgcmV0cmllZCBhdCB0aGVcbiAgICAgIC8vIHRyYW5zYWN0aW9uIGxldmVsIChyZS1ydW5uaW5nIHRoZSBjYWxsYmFjayksIG5vdCB0aGUgcXVlcnkgbGV2ZWwsIHNvIGZsYWcgaXQgYXMgc3VjaCBhbmRcbiAgICAgIC8vIGtlZXAgYHJldHJ5YCBmYWxzZSBzbyBhbiBpbi10cmFuc2FjdGlvbiBxdWVyeSBkb2VzIG5vdCByZXRyeSBhZ2FpbnN0IHRoZSBkZWFkIHRyYW5zYWN0aW9uLlxuICAgICAgaWYgKGVycm9yQ29kZSA9PSBcIkVSX0xPQ0tfREVBRExPQ0tcIiB8fCBtZXNzYWdlLmluY2x1ZGVzKFwiRVJfTE9DS19ERUFETE9DS1wiKSB8fCBtZXNzYWdlLmluY2x1ZGVzKFwiRGVhZGxvY2sgZm91bmRcIikpIHtcbiAgICAgICAgcmV0dXJuIHtyZXRyeTogZmFsc2UsIHJlY29ubmVjdDogZmFsc2UsIGRlYWRsb2NrOiB0cnVlLCBjb250ZW50aW9uS2luZDogXCJkZWFkbG9ja1wiLCB3YWl0TXM6IDUwfVxuICAgICAgfVxuXG4gICAgICBpZiAoZXJyb3JDb2RlID09IFwiRVJfTE9DS19XQUlUX1RJTUVPVVRcIiB8fCBtZXNzYWdlLmluY2x1ZGVzKFwiTG9jayB3YWl0IHRpbWVvdXQgZXhjZWVkZWRcIikpIHtcbiAgICAgICAgcmV0dXJuIHtyZXRyeTogZmFsc2UsIHJlY29ubmVjdDogZmFsc2UsIGRlYWRsb2NrOiB0cnVlLCBjb250ZW50aW9uS2luZDogXCJsb2NrLXdhaXQtdGltZW91dFwiLCB3YWl0TXM6IDUwfVxuICAgICAgfVxuXG4gICAgICBzaG91bGRSZWNvbm5lY3QgfHw9IChcbiAgICAgICAgZXJyb3JDb2RlID09IFwiRUNPTk5SRUZVU0VEXCIgfHxcbiAgICAgICAgbWVzc2FnZS5pbmNsdWRlcyhcIkVDT05OUkVGVVNFRFwiKSB8fFxuICAgICAgICBtZXNzYWdlLmluY2x1ZGVzKFwiY29ubmVjdCBFQ09OTlJFRlVTRURcIikgfHxcbiAgICAgICAgbWVzc2FnZS5pbmNsdWRlcyhcIlBST1RPQ09MX0NPTk5FQ1RJT05fTE9TVFwiKSB8fFxuICAgICAgICBtZXNzYWdlLmluY2x1ZGVzKFwiQ29ubmVjdGlvbiBsb3N0XCIpXG4gICAgICApXG5cbiAgICAgIGN1cnJlbnRFcnJvciA9IGN1cnJlbnRFcnJvci5jYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gY3VycmVudEVycm9yLmNhdXNlIDogdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJldHJ5OiBzaG91bGRSZWNvbm5lY3QsXG4gICAgICByZWNvbm5lY3Q6IHNob3VsZFJlY29ubmVjdCxcbiAgICAgIHdhaXRNczogNTBcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlZGFjdGVkLCBib3VuZGVkIGV4Y2VycHQgZnJvbSBNeVNRTCdzIGxhdGVzdCBJbm5vREIgZGVhZGxvY2sgcmVwb3J0LiBDYXB0dXJlIHVzZXMgYVxuICAgKiBzZXBhcmF0ZSBzaG9ydC1saXZlZCBjb25uZWN0aW9uIHNvIGl0IGNhbm5vdCBxdWV1ZSBhaGVhZCBvZiByb2xsYmFjayBvciB0aGUgbmV4dCByZXRyeSBvbiB0aGlzXG4gICAqIGRyaXZlcidzIHNpbmdsZS1jb25uZWN0aW9uIHBvb2wuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5EZWFkbG9ja1JldHJ5RGlhZ25vc3RpY1NuYXBzaG90fSBzbmFwc2hvdCAtIEltbXV0YWJsZSByZXRyeSBzbmFwc2hvdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gLSBTYWZlIGRpYWdub3N0aWMgY29udGV4dC5cbiAgICovXG4gIGFzeW5jIF9kZWFkbG9ja0RpYWdub3N0aWNDb250ZXh0KHNuYXBzaG90KSB7XG4gICAgaWYgKHNuYXBzaG90LmNvbnRlbnRpb25LaW5kID09IFwibG9jay13YWl0LXRpbWVvdXRcIikgcmV0dXJuIHtzdGF0dXNDYXB0dXJlOiBcIm5vdC1hcHBsaWNhYmxlXCJ9XG5cbiAgICBsZXQgc3RhdHVzXG5cbiAgICB0cnkge1xuICAgICAgc3RhdHVzID0gYXdhaXQgdGhpcy5fY2FwdHVyZUlubm9kYkRlYWRsb2NrU3RhdHVzKClcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7c3RhdHVzQ2FwdHVyZTogXCJmYWlsZWRcIn1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW5ub2RiRGVhZGxvY2tTdW1tYXJ5OiB0aGlzLl9pbm5vZGJEZWFkbG9ja1N1bW1hcnkoc3RhdHVzKSxcbiAgICAgIHN0YXR1c0NhcHR1cmU6IFwiY2FwdHVyZWRcIlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYXB0dXJlcyBTSE9XIEVOR0lORSBJTk5PREIgU1RBVFVTIG9uIGEgYm91bmRlZCB0aHJvd2F3YXkgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBSYXcgc2VydmVyIHN0YXR1cywgcmV0YWluZWQgb25seSBpbnNpZGUgdGhlIHJlZGFjdGlvbiBwYXRoLlxuICAgKi9cbiAgYXN5bmMgX2NhcHR1cmVJbm5vZGJEZWFkbG9ja1N0YXR1cygpIHtcbiAgICBjb25zdCBwb29sV2l0aENvbmZpZyA9IC8qKiBAdHlwZSB7e2NvbmZpZz86IHtjb25uZWN0aW9uQ29uZmlnPzogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59fSB8IHVuZGVmaW5lZH0gKi8gKHRoaXMucG9vbClcbiAgICBjb25zdCBjb25uZWN0aW9uQ29uZmlnID0gcG9vbFdpdGhDb25maWc/LmNvbmZpZz8uY29ubmVjdGlvbkNvbmZpZ1xuICAgIGNvbnN0IGNhcHR1cmVDb25maWcgPSBjb25uZWN0aW9uQ29uZmlnIHx8IHRoaXMuY29ubmVjdEFyZ3MoKVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwibXlzcWxcIikuQ29ubmVjdGlvbiB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIGxldCBjb25uZWN0aW9uXG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlXG4gICAgICAvKipcbiAgICAgICAqIEZpbmlzaGVzIHRoZSBzdGF0dXMgY2FwdHVyZSBvbmNlIGFuZCBkZXN0cm95cyBpdHMgdGVtcG9yYXJ5IGNvbm5lY3Rpb24uXG4gICAgICAgKiBAcGFyYW0ge0Vycm9yIHwgdW5kZWZpbmVkfSBlcnJvciAtIENhcHR1cmUgZXJyb3IsIHdoZW4gcHJlc2VudC5cbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RhdHVzXSAtIENhcHR1cmVkIHN0YXR1cy5cbiAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAgICovXG4gICAgICBjb25zdCBmaW5pc2ggPSAoZXJyb3IsIHN0YXR1cyA9IFwiXCIpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVyblxuICAgICAgICBzZXR0bGVkID0gdHJ1ZVxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24pIGNvbm5lY3Rpb24uZGVzdHJveSgpXG4gICAgICAgIGlmIChlcnJvcikgcmVqZWN0KGVycm9yKVxuICAgICAgICBlbHNlIHJlc29sdmUoc3RhdHVzKVxuICAgICAgfVxuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gZmluaXNoKG5ldyBFcnJvcihcIklubm9EQiBzdGF0dXMgY2FwdHVyZSB0aW1lZCBvdXRcIikpLCBJTk5PREJfREVBRExPQ0tfQ0FQVFVSRV9USU1FT1VUX01TKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25uZWN0aW9uID0gbXlzcWwuY3JlYXRlQ29ubmVjdGlvbihjYXB0dXJlQ29uZmlnKVxuICAgICAgICBjb25uZWN0aW9uLm9uKFwiZXJyb3JcIiwgKGVycm9yKSA9PiBmaW5pc2goZXJyb3IpKVxuICAgICAgICBjb25uZWN0aW9uLnF1ZXJ5KFwiU0hPVyBFTkdJTkUgSU5OT0RCIFNUQVRVU1wiLCAoZXJyb3IsIHJvd3MpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGZpbmlzaChlcnJvcilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpcnN0Um93ID0gQXJyYXkuaXNBcnJheShyb3dzKSA/IHJvd3NbMF0gOiB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBzdGF0dXMgPSBmaXJzdFJvdyAmJiB0eXBlb2YgZmlyc3RSb3cuU3RhdHVzID09IFwic3RyaW5nXCIgPyBmaXJzdFJvdy5TdGF0dXMgOiBcIlwiXG5cbiAgICAgICAgICBmaW5pc2godW5kZWZpbmVkLCBzdGF0dXMpXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBmaW5pc2goZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFwiSW5ub0RCIHN0YXR1cyBjYXB0dXJlIGZhaWxlZFwiKSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIG9ubHkgZml4ZWQtZm9ybWF0IGRlYWRsb2NrIGNvdW50ZXJzLiBUaGUgc2VydmVyIHJlcG9ydCBjb250YWlucyByYXcgU1FMLCBpZGVudGlmaWVycyxcbiAgICogYW5kIHBoeXNpY2FsIHJlY29yZCBkYXRhLCBzbyBubyBzb3VyY2UgdGV4dCBpcyBldmVyIGluY2x1ZGVkIGluIGFuIGFwcGxpY2F0aW9uIGRpYWdub3N0aWMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0dXMgLSBTSE9XIEVOR0lORSBJTk5PREIgU1RBVFVTIHRleHQuXG4gICAqIEByZXR1cm5zIHt7bG9ja1JlY29yZHNUcnVuY2F0ZWQ6IGJvb2xlYW4sIHNlY3Rpb25UcnVuY2F0ZWQ6IGJvb2xlYW4sIHRyYW5zYWN0aW9uTm9kZXM6IEFycmF5PHtjb25mbGljdGluZ0xvY2tzOiBBcnJheTx7aW5kZXhGaW5nZXJwcmludDogc3RyaW5nLCBsb2NrTW9kZTogc3RyaW5nLCBzdGF0ZTogc3RyaW5nLCB0YWJsZUZpbmdlcnByaW50OiBzdHJpbmd9PiwgbG9ja3M6IEFycmF5PHtpbmRleEZpbmdlcnByaW50OiBzdHJpbmcsIGxvY2tNb2RlOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcsIHRhYmxlRmluZ2VycHJpbnQ6IHN0cmluZ30+LCBvcmRpbmFsOiBudW1iZXJ9PiwgdHJhbnNhY3Rpb25Ob2Rlc1RydW5jYXRlZDogYm9vbGVhbiwgdHJhbnNhY3Rpb25zOiBudW1iZXIsIHZpY3RpbVRyYW5zYWN0aW9uOiBudW1iZXIgfCBudWxsfX0gLSBTdHJ1Y3R1cmFsIGRlYWRsb2NrIHN1bW1hcnkuXG4gICAqL1xuICBfaW5ub2RiRGVhZGxvY2tTdW1tYXJ5KHN0YXR1cykge1xuICAgIHJldHVybiBwYXJzZUlubm9kYkRlYWRsb2NrU3VtbWFyeShzdGF0dXMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBxdWVyeSBhY3R1YWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBTUUwgc3RyaW5nLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuUXVlcnlPcHRpb25zfSBbb3B0aW9uc10gLSBRdWVyeSBvcHRpb25zIChjYXJyaWVzIHRoZSBvcHRpb25hbCBhYm9ydCBzaWduYWwpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5UmVzdWx0VHlwZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcXVlcnkgYWN0dWFsLlxuICAgKi9cbiAgYXN5bmMgX3F1ZXJ5QWN0dWFsKHNxbCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLnBvb2wpIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgaWYgKCF0aGlzLnBvb2wpIHRocm93IG5ldyBFcnJvcihcIk15U1FMIHBvb2wgZmFpbGVkIHRvIGluaXRpYWxpemVcIilcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcXVlcnkodGhpcy5wb29sLCBzcWwsIHtzaWduYWw6IG9wdGlvbnMuc2lnbmFsfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gUHJlc2VydmUgYW4gYWJvcnQgYXMtaXMgc28gdGhlIHJldHJ5IGxvb3AgY2FuIHJlY29nbmlzZSBpdCBhcyB0ZXJtaW5hbFxuICAgICAgLy8gKHdyYXBwaW5nIGl0IGluIGEgcGxhaW4gRXJyb3Igd291bGQgbG9zZSB0aGUgUXVlcnlBYm9ydGVkRXJyb3IgdHlwZSkuXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBRdWVyeUFib3J0ZWRFcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IuY29ubmVjdGlvbkRlc3Ryb3llZCkgdGhpcy5yZXNldEN1cnJlbnRTZXNzaW9uVGltZVpvbmUoKVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuXG4gICAgICAvLyBSZS10aHJvdyB0byB1bi1jb3JydXB0IHN0YWNrdHJhY2VcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVlcnkgZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YCwge2NhdXNlOiBlcnJvcn0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1ZXJ5IGZhaWxlZDogJHtlcnJvcn1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RyZWFtcyB0aGUgcm93cyBvZiBgc3FsYCBmcm9tIGEgZGVkaWNhdGVkIHBvb2xlZCBjb25uZWN0aW9uIHVzaW5nIHRoZSBNeVNRTCBjdXJzb3IsIHNvIGFcbiAgICogbGFyZ2UgcmVzdWx0IHNldCBpcyByZWFkIGluY3JlbWVudGFsbHkgaW5zdGVhZCBvZiBiZWluZyBidWZmZXJlZC4gT3ZlcnJpZGVzIHRoZSBiYXNlXG4gICAqIGJ1ZmZlcmVkIGZhbGxiYWNrIHdpdGggdHJ1ZSBzZXJ2ZXItc2lkZSBzdHJlYW1pbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBTUUwgc3RyaW5nIHRvIHN0cmVhbS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5T3B0aW9uc30gW29wdGlvbnNdIC0gUXVlcnkgb3duZXJzaGlwIG9wdGlvbnMuXG4gICAqIEB5aWVsZHMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAtIFRoZSByZXN1bHQgcm93cywgb25lIGF0IGEgdGltZS5cbiAgICovXG4gIGFzeW5jICpxdWVyeVN0cmVhbShzcWwsIG9wdGlvbnMgPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuX3dhaXRGb3JPcGVyYXRpb25MZWFzZShvcHRpb25zLm9wZXJhdGlvbk93bmVyKVxuXG4gICAgaWYgKCF0aGlzLnBvb2wpIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgaWYgKCF0aGlzLnBvb2wpIHRocm93IG5ldyBFcnJvcihcIk15U1FMIHBvb2wgZmFpbGVkIHRvIGluaXRpYWxpemVcIilcblxuICAgIHlpZWxkKiBzdHJlYW1RdWVyeSh0aGlzLnBvb2wsIHNxbClcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIG11dGF0aW9uIHdpdGggYWZmZWN0ZWQtcm93IG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsIC0gTXV0YXRpb24gU1FMLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSAtIEFmZmVjdGVkIHJvdyBjb3VudC5cbiAgICovXG4gIGFzeW5jIF9hZmZlY3RlZFJvd3NBY3R1YWwoc3FsKSB7XG4gICAgaWYgKCF0aGlzLnBvb2wpIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgaWYgKCF0aGlzLnBvb2wpIHRocm93IG5ldyBFcnJvcihcIk15U1FMIHBvb2wgZmFpbGVkIHRvIGluaXRpYWxpemVcIilcbiAgICBjb25zdCBwb29sID0gdGhpcy5wb29sXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcG9vbC5xdWVyeShzcWwsIChlcnJvciwgcmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikgcmVqZWN0KGVycm9yKVxuICAgICAgICBlbHNlIHJlc29sdmUoXCJhZmZlY3RlZFJvd3NcIiBpbiByZXN1bHQgPyByZXN1bHQuYWZmZWN0ZWRSb3dzIDogMClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGZ1bGwgbXVsdGktc3RhdGVtZW50IHN0cnVjdHVyZSBTUUwgc2NyaXB0IGluIG9uZSByb3VuZC10cmlwIHdoZW4gdGhlXG4gICAqIGNvbm5lY3Rpb24gd2FzIGNvbmZpZ3VyZWQgd2l0aCBgbXVsdGlwbGVTdGF0ZW1lbnRzOiB0cnVlYC4gUnVucyBvbiB0aGUgcG9vbGVkXG4gICAqIGNvbm5lY3Rpb24gc28gdGhlIGNhbGxlcidzIGBTRVQgRk9SRUlHTl9LRVlfQ0hFQ0tTID0gMGAgYXBwbGllcy4gUmV0dXJucyBmYWxzZSBzb1xuICAgKiB0aGUgY2FsbGVyIHJ1bnMgc3RhdGVtZW50cyBpbmRpdmlkdWFsbHkgd2hlbiBtdWx0aS1zdGF0ZW1lbnQgcXVlcmllcyBhcmUgb2ZmLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RydWN0dXJlU3FsIC0gRnVsbCBtdWx0aS1zdGF0ZW1lbnQgc3RydWN0dXJlIFNRTC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgc2NyaXB0IHdhcyBleGVjdXRlZCBhcyBvbmUgYmF0Y2guXG4gICAqL1xuICBhc3luYyBleGVjU3RydWN0dXJlU2NyaXB0KHN0cnVjdHVyZVNxbCkge1xuICAgIGlmICghdGhpcy5nZXRBcmdzKCkubXVsdGlwbGVTdGF0ZW1lbnRzKSByZXR1cm4gZmFsc2VcblxuICAgIC8vIFRoZSBiYXRjaGVkIHBvb2wgY2FsbCBiZWxvdyBieXBhc3NlcyBCYXNlI3F1ZXJ5LCBzbyByZS1ydW4gdGhlIHNhbWUgcmVhZC1vbmx5XG4gICAgLy8gd3JpdGUgZ3VhcmQgdGhlIHBlci1zdGF0ZW1lbnQgcGF0aCBhcHBsaWVzIGJlZm9yZSBleGVjdXRpbmcgdGhlIGR1bXAuXG4gICAgdGhpcy5fYXNzZXJ0V3JpdGFibGVRdWVyeShzdHJ1Y3R1cmVTcWwpXG5cbiAgICBpZiAoIXRoaXMucG9vbCkgYXdhaXQgdGhpcy5jb25uZWN0KClcbiAgICBpZiAoIXRoaXMucG9vbCkgdGhyb3cgbmV3IEVycm9yKFwiTXlTUUwgcG9vbCBmYWlsZWQgdG8gaW5pdGlhbGl6ZVwiKVxuXG4gICAgY29uc3QgcG9vbCA9IHRoaXMucG9vbFxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcG9vbC5xdWVyeShzdHJ1Y3R1cmVTcWwsIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHJlamVjdChlcnJvcilcbiAgICAgICAgZWxzZSByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogVXNlcyBvbmUgbXVsdGktc3RhdGVtZW50IHJlcXVlc3Qgb25seSB3aGVuIHRoZSBleGlzdGluZyBjb25uZWN0aW9uIG9wdGlvblxuICAgKiBleHBsaWNpdGx5IGFsbG93cyBpdDsgb3RoZXJ3aXNlIHJldGFpbnMgdGhlIGJhc2Ugc2VxdWVudGlhbCBiZWhhdmlvci5cbiAgICogQHBhcmFtIHtBcnJheTxpbXBvcnQoXCIuLi9iYXNlLXRhYmxlLmpzXCIpLmRlZmF1bHQ+fSB0YWJsZXMgLSBFbGlnaWJsZSB0YWJsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gZXZlcnkgdGFibGUgaGFzIGJlZW4gdHJ1bmNhdGVkLlxuICAgKi9cbiAgYXN5bmMgdHJ1bmNhdGVUYWJsZXModGFibGVzKSB7XG4gICAgaWYgKCF0aGlzLmdldEFyZ3MoKS5tdWx0aXBsZVN0YXRlbWVudHMpIHtcbiAgICAgIGF3YWl0IHN1cGVyLnRydW5jYXRlVGFibGVzKHRhYmxlcylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlbWVudHMgPSB0YWJsZXMubWFwKCh0YWJsZSkgPT4gYFRSVU5DQVRFIFRBQkxFICR7dGhpcy5xdW90ZVRhYmxlKHRhYmxlLmdldE5hbWUoKSl9YClcblxuICAgIGF3YWl0IHRoaXMucXVlcnkoc3RhdGVtZW50cy5qb2luKFwiO1xcblwiKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHF1ZXJ5IHRvIHNxbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9xdWVyeS9pbmRleC5qc1wiKS5kZWZhdWx0fSBxdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNRTCBzdHJpbmcuXG4gICAqL1xuICBxdWVyeVRvU3FsKHF1ZXJ5KSB7IHJldHVybiBuZXcgUXVlcnlQYXJzZXIoe3F1ZXJ5fSkudG9TcWwoKSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2hvdWxkIHNldCBhdXRvIGluY3JlbWVudCB3aGVuIHByaW1hcnkga2V5LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHNldCBhdXRvIGluY3JlbWVudCB3aGVuIHByaW1hcnkga2V5LlxuICAgKi9cbiAgc2hvdWxkU2V0QXV0b0luY3JlbWVudFdoZW5QcmltYXJ5S2V5KCkgeyByZXR1cm4gdHJ1ZSB9XG4gIHN1cHBvcnRzRGVmYXVsdFByaW1hcnlLZXlVVUlEKCkgeyByZXR1cm4gZmFsc2UgfVxuICBzdXBwb3J0c0Nyb3NzRGF0YWJhc2VSZWZlcmVuY2VzKCkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZXNjYXBlLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFZhbHVlIHRvIHVzZS5cbiAgICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAtIFRoZSBlc2NhcGUuXG4gICAqL1xuICBlc2NhcGUodmFsdWUpIHtcbiAgICBjb25zdCBlc2NhcGVkVmFsdWVXaXRoUXVvdGVzID0gdGhpcy5wb29sXG4gICAgICA/IHRoaXMucG9vbC5lc2NhcGUodGhpcy5fY29udmVydFZhbHVlKHZhbHVlKSlcbiAgICAgIDogbXlzcWwuZXNjYXBlKHRoaXMuX2NvbnZlcnRWYWx1ZSh2YWx1ZSkpXG5cbiAgICByZXR1cm4gZXNjYXBlZFZhbHVlV2l0aFF1b3Rlcy5zbGljZSgxLCBlc2NhcGVkVmFsdWVXaXRoUXVvdGVzLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBxdW90ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBxdW90ZS5cbiAgICovXG4gIHF1b3RlKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMucG9vbCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9vbC5lc2NhcGUodGhpcy5fY29udmVydFZhbHVlKHZhbHVlKSlcbiAgICB9XG5cbiAgICByZXR1cm4gbXlzcWwuZXNjYXBlKHRoaXMuX2NvbnZlcnRWYWx1ZSh2YWx1ZSkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBkZWxldGUgc3FsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuRGVsZXRlU3FsQXJnc1R5cGV9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTUUwgc3RyaW5nLlxuICAgKi9cbiAgZGVsZXRlU3FsKHt0YWJsZU5hbWUsIGNvbmRpdGlvbnN9KSB7XG4gICAgY29uc3QgZGVsZXRlSW5zdHJ1Y3Rpb24gPSBuZXcgRGVsZXRlKHtjb25kaXRpb25zLCBkcml2ZXI6IHRoaXMsIHRhYmxlTmFtZX0pXG5cbiAgICByZXR1cm4gZGVsZXRlSW5zdHJ1Y3Rpb24udG9TcWwoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW5zZXJ0IHNxbC5cbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5JbnNlcnRTcWxBcmdzVHlwZX0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNRTCBzdHJpbmcuXG4gICAqL1xuICBpbnNlcnRTcWwoYXJncykge1xuICAgIGNvbnN0IGluc2VydEFyZ3MgPSBPYmplY3QuYXNzaWduKHtkcml2ZXI6IHRoaXN9LCBhcmdzKVxuICAgIGNvbnN0IGluc2VydCA9IG5ldyBJbnNlcnQoaW5zZXJ0QXJncylcblxuICAgIHJldHVybiBpbnNlcnQudG9TcWwoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHRhYmxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8aW1wb3J0KFwiLi4vYmFzZS10YWJsZS5qc1wiKS5kZWZhdWx0Pj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgdGFibGVzLlxuICAgKi9cbiAgYXN5bmMgZ2V0VGFibGVzKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jYWNoZWRTY2hlbWFNZXRhZGF0YShcInRhYmxlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnF1ZXJ5KFwiU0hPVyBGVUxMIFRBQkxFU1wiKVxuICAgICAgY29uc3QgdGFibGVzID0gW11cblxuICAgICAgZm9yIChjb25zdCByb3cgb2YgcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlKHRoaXMsIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi8gKHJvdykpXG5cbiAgICAgICAgdGFibGVzLnB1c2godGFibGUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZXNcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3RydWN0dXJlIHNxbC5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbD59IC0gUmVzb2x2ZXMgd2l0aCBTUUwgc3RyaW5nLlxuICAgKi9cbiAgYXN5bmMgc3RydWN0dXJlU3FsKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jYWNoZWRTY2hlbWFNZXRhZGF0YShcInN0cnVjdHVyZVNxbFwiLCBhc3luYyAoKSA9PiBhd2FpdCBuZXcgU3RydWN0dXJlU3FsKHtkcml2ZXI6IHRoaXN9KS50b1NxbCgpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbGFzdCBpbnNlcnQgaWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5RdWVyeU9wdGlvbnN9IFtvcHRpb25zXSAtIFF1ZXJ5IG93bmVyc2hpcCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSAtIFJlc29sdmVzIHdpdGggdGhlIGxhc3QgaW5zZXJ0IGlkLlxuICAgKi9cbiAgYXN5bmMgbGFzdEluc2VydElEKG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucXVlcnkoXCJTRUxFQ1QgTEFTVF9JTlNFUlRfSUQoKSBBUyBsYXN0X2luc2VydF9pZFwiLCBvcHRpb25zKVxuXG4gICAgcmV0dXJuIGRpZ2cocmVzdWx0LCAwLCBcImxhc3RfaW5zZXJ0X2lkXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7T3B0aW9uc30gLSBUaGUgb3B0aW9ucyBvcHRpb25zLlxuICAgKi9cbiAgb3B0aW9ucygpIHtcbiAgICBpZiAoIXRoaXMuX29wdGlvbnMpIHRoaXMuX29wdGlvbnMgPSBuZXcgT3B0aW9ucyh7ZHJpdmVyOiB0aGlzfSlcblxuICAgIHJldHVybiB0aGlzLl9vcHRpb25zXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdGFydCB0cmFuc2FjdGlvbiBhY3Rpb24uXG4gICAqIEBwYXJhbSB7UGljazxpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5T3B0aW9ucywgXCJvcGVyYXRpb25Pd25lclwiPn0gW29wdGlvbnNdIC0gVHJhbnNhY3Rpb24gb3duZXJzaGlwLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3N0YXJ0VHJhbnNhY3Rpb25BY3Rpb24ob3B0aW9ucyA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5xdWVyeShcIlNUQVJUIFRSQU5TQUNUSU9OXCIsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB1cGRhdGUgc3FsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuVXBkYXRlU3FsQXJnc1R5cGV9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTUUwgc3RyaW5nLlxuICAgKi9cbiAgdXBkYXRlU3FsKHtjb25kaXRpb25zLCBkYXRhLCB0YWJsZU5hbWV9KSB7XG4gICAgY29uc3QgdXBkYXRlID0gbmV3IFVwZGF0ZSh7Y29uZGl0aW9ucywgZGF0YSwgZHJpdmVyOiB0aGlzLCB0YWJsZU5hbWV9KVxuXG4gICAgcmV0dXJuIHVwZGF0ZS50b1NxbCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB1cHNlcnQgc3FsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuVXBzZXJ0U3FsQXJnc1R5cGV9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTUUwgc3RyaW5nLlxuICAgKi9cbiAgdXBzZXJ0U3FsKGFyZ3MpIHtcbiAgICBjb25zdCB1cHNlcnQgPSBuZXcgVXBzZXJ0KHsuLi5hcmdzLCBkcml2ZXI6IHRoaXN9KVxuXG4gICAgcmV0dXJuIHVwc2VydC50b1NxbCgpXG4gIH1cblxuICAvKipcbiAgICogQmxvY2tzIHVudGlsIGEgTXlTUUwvTWFyaWFEQiB1c2VyLWxldmVsIGxvY2sgaXMgYWNxdWlyZWQgb24gdGhpc1xuICAgKiBjb25uZWN0aW9uLiBJbXBsZW1lbnRlZCB2aWEgYEdFVF9MT0NLKG5hbWUsIHRpbWVvdXQpYCwgd2hlcmUgdGhlXG4gICAqIHRpbWVvdXQgaXMgaW4gc2Vjb25kcy5cbiAgICpcbiAgICogTXlTUUwgaGlzdG9yaWNhbGx5IGRvY3VtZW50ZWQgYSBuZWdhdGl2ZSB0aW1lb3V0IGFzIFwiaW5maW5pdGVcIixcbiAgICogYnV0IE1hcmlhREIgMTArIHNpbGVudGx5IHJlamVjdHMgbmVnYXRpdmUgdGltZW91dHMgYW5kIHJldHVybnNcbiAgICogYE5VTExgIGZyb20gYEdFVF9MT0NLYC4gVG8gbWFrZSB0aGUgaGVscGVyIHBvcnRhYmxlIGFjcm9zcyBNeVNRTFxuICAgKiBhbmQgTWFyaWFEQiB0aGUgXCJpbmRlZmluaXRlXCIgY2FzZSBpcyBlbmNvZGVkIGFzIGEgbGFyZ2UgcG9zaXRpdmVcbiAgICogdGltZW91dCAob25lIHllYXIpLCB3aGljaCBpcyBjb21mb3J0YWJseSBsb25nZXIgdGhhbiBhbnlcbiAgICogcmVhbGlzdGljIGNyaXRpY2FsIHNlY3Rpb24gYW5kIHdvcmtzIG9uIGV2ZXJ5IHN1cHBvcnRlZCB2ZXJzaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHBhcmFtIHt7dGltZW91dE1zPzogbnVtYmVyIHwgbnVsbH19IFthcmdzXSAtIE9wdGlvbmFsIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzOyBgbnVsbGAsIGB1bmRlZmluZWRgLCBvciBuZWdhdGl2ZSBibG9ja3MgZm9yIGBNWVNRTF9JTkRFRklOSVRFX0xPQ0tfVElNRU9VVF9TRUNPTkRTYC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gVHJ1ZSBpZiBhY3F1aXJlZCwgZmFsc2UgaWYgdGhlIHRpbWVvdXQgZWxhcHNlZC5cbiAgICovXG4gIGFzeW5jIF9hY3F1aXJlQWR2aXNvcnlMb2NrKG5hbWUsIHt0aW1lb3V0TXN9ID0ge30pIHtcbiAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IHR5cGVvZiB0aW1lb3V0TXMgPT09IFwibnVtYmVyXCIgJiYgdGltZW91dE1zID49IDBcbiAgICAgID8gTWF0aC5jZWlsKHRpbWVvdXRNcyAvIDEwMDApXG4gICAgICA6IE1ZU1FMX0lOREVGSU5JVEVfTE9DS19USU1FT1VUX1NFQ09ORFNcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5xdWVyeShgU0VMRUNUIEdFVF9MT0NLKCR7dGhpcy5xdW90ZShuYW1lKX0sICR7dGltZW91dFNlY29uZHN9KSBBUyB2ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19yZXN1bHRgKVxuICAgIGNvbnN0IHJlc3VsdCA9IHJvd3M/LlswXT8udmVsb2Npb3VzX2Fkdmlzb3J5X2xvY2tfcmVzdWx0XG5cbiAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEdFVF9MT0NLIHJldHVybmVkIE5VTEwgZm9yIGFkdmlzb3J5IGxvY2sgJHtKU09OLnN0cmluZ2lmeShuYW1lKX0gKHR5cGljYWxseSBhbiBvdXQtb2YtbWVtb3J5IG9yIHRocmVhZC1raWxsZWQgY29uZGl0aW9uKWApXG4gICAgfVxuXG4gICAgcmV0dXJuIE51bWJlcihyZXN1bHQpID09PSAxXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0cnkgYWNxdWlyZSBhZHZpc29yeSBsb2NrLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gVHJ1ZSBpZiB0aGUgbG9jayB3YXMgYWNxdWlyZWQsIGZhbHNlIGlmIGl0IHdhcyBhbHJlYWR5IGhlbGQuXG4gICAqL1xuICBhc3luYyBfdHJ5QWNxdWlyZUFkdmlzb3J5TG9jayhuYW1lKSB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMucXVlcnkoYFNFTEVDVCBHRVRfTE9DSygke3RoaXMucXVvdGUobmFtZSl9LCAwKSBBUyB2ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19yZXN1bHRgKVxuICAgIGNvbnN0IHJlc3VsdCA9IHJvd3M/LlswXT8udmVsb2Npb3VzX2Fkdmlzb3J5X2xvY2tfcmVzdWx0XG5cbiAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEdFVF9MT0NLIHJldHVybmVkIE5VTEwgZm9yIGFkdmlzb3J5IGxvY2sgJHtKU09OLnN0cmluZ2lmeShuYW1lKX0gKHR5cGljYWxseSBhbiBvdXQtb2YtbWVtb3J5IG9yIHRocmVhZC1raWxsZWQgY29uZGl0aW9uKWApXG4gICAgfVxuXG4gICAgcmV0dXJuIE51bWJlcihyZXN1bHQpID09PSAxXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZWxlYXNlIGFkdmlzb3J5IGxvY2suXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBUcnVlIGlmIHRoZSBsb2NrIHdhcyBoZWxkIGJ5IHRoaXMgc2Vzc2lvbiBhbmQgaGFzIG5vdyBiZWVuIHJlbGVhc2VkLlxuICAgKi9cbiAgYXN5bmMgX3JlbGVhc2VBZHZpc29yeUxvY2sobmFtZSkge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLnF1ZXJ5KGBTRUxFQ1QgUkVMRUFTRV9MT0NLKCR7dGhpcy5xdW90ZShuYW1lKX0pIEFTIHZlbG9jaW91c19hZHZpc29yeV9sb2NrX3Jlc3VsdGAsIHtyZXRyeTogZmFsc2V9KVxuICAgIGNvbnN0IHJlc3VsdCA9IHJvd3M/LlswXT8udmVsb2Npb3VzX2Fkdmlzb3J5X2xvY2tfcmVzdWx0XG5cbiAgICByZXR1cm4gTnVtYmVyKHJlc3VsdCkgPT09IDFcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIGFkdmlzb3J5IGxvY2sgaGVsZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFRydWUgaWYgYW55IHNlc3Npb24gY3VycmVudGx5IGhvbGRzIHRoZSBsb2NrLlxuICAgKi9cbiAgYXN5bmMgaXNBZHZpc29yeUxvY2tIZWxkKG5hbWUpIHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5xdWVyeShgU0VMRUNUIElTX1VTRURfTE9DSygke3RoaXMucXVvdGUobmFtZSl9KSBBUyB2ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19ob2xkZXJgKVxuICAgIGNvbnN0IGhvbGRlciA9IHJvd3M/LlswXT8udmVsb2Npb3VzX2Fkdmlzb3J5X2xvY2tfaG9sZGVyXG5cbiAgICByZXR1cm4gaG9sZGVyICE9PSBudWxsICYmIGhvbGRlciAhPT0gdW5kZWZpbmVkXG4gIH1cbn1cbiJdfQ==
|
|
@@ -4,6 +4,10 @@ export type LiveQuerySource<T> = {
|
|
|
4
4
|
* - Root model class the query reads.
|
|
5
5
|
*/
|
|
6
6
|
getModelClass: () => RecordModelClass;
|
|
7
|
+
/**
|
|
8
|
+
* - Captured physical identity for an observed model.
|
|
9
|
+
*/
|
|
10
|
+
databaseIdentityForModel?: (modelClass: RecordModelClass) => string;
|
|
7
11
|
/**
|
|
8
12
|
* - Runs the query and resolves the current rows.
|
|
9
13
|
*/
|
|
@@ -33,6 +37,7 @@ export type LiveQueryState<T> = {
|
|
|
33
37
|
* @template T
|
|
34
38
|
* @typedef {object} LiveQuerySource
|
|
35
39
|
* @property {() => RecordModelClass} getModelClass - Root model class the query reads.
|
|
40
|
+
* @property {(modelClass: RecordModelClass) => string} [databaseIdentityForModel] - Captured physical identity for an observed model.
|
|
36
41
|
* @property {() => Promise<T[]>} toArray - Runs the query and resolves the current rows.
|
|
37
42
|
*/
|
|
38
43
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-query.d.ts","sourceRoot":"","sources":["../../../src/database/live-query.js"],"names":[],"mappings":"AASG,YAAsD,gBAAgB,GAA5D,cAAc,mBAAmB,EAAE,OAAO,CAAkB;AAOtE,YAAkB,eAAe,CADvB,CAAC,IAEX;;;;IAAmC,aAAa,EAArC,MAAM,gBAAgB,CACjC;;;;IAA+B,OAAO,EAA3B,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,CAC/B;CAAA,CAAA;AAKE,YAAkB,cAAc,CADtB,CAAC,IAEX;;;;IAAgB,OAAO,EAAZ,CAAC,EAAE,CACd;;;;IAAoB,OAAO,EAAhB,OAAO,CAClB;;;;IAAyB,KAAK,EAAnB,KAAK,GAAG,IAAI,CACzB;CAAA,CAAA;
|
|
1
|
+
{"version":3,"file":"live-query.d.ts","sourceRoot":"","sources":["../../../src/database/live-query.js"],"names":[],"mappings":"AASG,YAAsD,gBAAgB,GAA5D,cAAc,mBAAmB,EAAE,OAAO,CAAkB;AAOtE,YAAkB,eAAe,CADvB,CAAC,IAEX;;;;IAAmC,aAAa,EAArC,MAAM,gBAAgB,CACjC;;;;IAAsD,wBAAwB,AAA9E,CACA,EADW,CAAC,UAAU,EAAE,gBAAgB,KAAK,MAAM,CACnD;;;;IAA+B,OAAO,EAA3B,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,CAC/B;CAAA,CAAA;AAKE,YAAkB,cAAc,CADtB,CAAC,IAEX;;;;IAAgB,OAAO,EAAZ,CAAC,EAAE,CACd;;;;IAAoB,OAAO,EAAhB,OAAO,CAClB;;;;IAAyB,KAAK,EAAnB,KAAK,GAAG,IAAI,CACzB;CAAA,CAAA;AAtBD;;4EAE4E;AAE5E;;;;;;;;;GASG;AAEH;;;;;;;GAOG;AAEH;;;;;;;;;;;;GAYG;AACH,cAAM,SAAS,CAFF,CAAC;IAiBV,iCAAiC;IAC5B,MAAM,EADA,eAAe,CAAC,CAAC,CAAC;IAG7B,iCAAiC;IAC5B,aAAa,EADP,gBAAgB,EAAE;IAG7B,gCAAgC;IAC3B,MAAM,EADA,cAAc,CAAC,CAAC,CAAC;IAG5B;;iCAE6B;IACxB,UAAU,EADL,GAAG,CAAC,MAAM,IAAI,CAAC;IAGzB;;mCAE+B;IAC1B,aAAa,EADR,KAAK,CAAC,MAAM,IAAI,CAAC;IAG3B,qBAAqB;IAChB,UAAU,EADJ,MAAM;IAGjB,sBAAsB;IACjB,OAAO,EADD,OAAO;IAGlB,sBAAsB;IACjB,QAAQ,EADF,OAAO;IAGlB,sBAAsB;IACjB,aAAa,EADP,OAAO;IAGlB;;sCAEkC;IAC7B,eAAe,EADV,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAG9B;;qDAEiD;IAC5C,YAAY,EADP,CAAC,MAAM,IAAI,CAAC,GAAG;QAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;KAAC;IAK7C;;4BAEwB;IACnB,eAAe,EADV,MAAM,IAAI;IA3DtB;;;;;;OAMG;IACH,YAAY,EAAC,KAAK,EAAE,GAAG,QAAQ,EAAC,EAJ7B;QAAiC,KAAK,EAA9B,eAAe,CAAC,CAAC,CAAC,CAC1B;QAAkC,MAAM,AAAxC,CACA,EADQ,gBAAgB,EAAE,CAC1B;QAAsB,QAAQ,AAA9B,CACF,EADU,MAAM,CAChB;KAC+B,EAwD/B;IAED;;;OAGG;IACH,KAAK,IAFQ,IAAI,CAchB;IAED;;;;OAIG;IACH,QAAQ,IAFK,cAAc,CAAC,CAAC,CAAC,CAI7B;IAED;;;;OAIG;IACH,SAAS,CAAC,QAAQ,EAHP,MAAM,IAGC,GAFL,MAAM,IAAI,CAQtB;IAED;;;OAGG;IACH,KAAK,IAFQ,IAAI,CAehB;IAED;;;;OAIG;IACG,WAAW,IAFJ,OAAO,CAAC,IAAI,CAAC,CAWzB;IAED;;;;OAIG;IACH,qBAAqB,IAFR,IAAI,CAYhB;IAED;;;;;OAKG;IACH,IAAI,IAFS,OAAO,CAAC,IAAI,CAAC,CAwBzB;IAED;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAHJ,cAAc,CAAC,CAAC,CAGZ,GAFF,IAAI,CAQhB;CACF;eAEc,SAAS"}
|
|
@@ -12,6 +12,7 @@ import restArgsError from "../utils/rest-args-error.js";
|
|
|
12
12
|
* @template T
|
|
13
13
|
* @typedef {object} LiveQuerySource
|
|
14
14
|
* @property {() => RecordModelClass} getModelClass - Root model class the query reads.
|
|
15
|
+
* @property {(modelClass: RecordModelClass) => string} [databaseIdentityForModel] - Captured physical identity for an observed model.
|
|
15
16
|
* @property {() => Promise<T[]>} toArray - Runs the query and resolves the current rows.
|
|
16
17
|
*/
|
|
17
18
|
/**
|
|
@@ -97,7 +98,8 @@ class LiveQuery {
|
|
|
97
98
|
return;
|
|
98
99
|
this._started = true;
|
|
99
100
|
for (const modelClass of this._modelClasses) {
|
|
100
|
-
this.
|
|
101
|
+
const databaseIdentity = this._query.databaseIdentityForModel?.(modelClass);
|
|
102
|
+
this._unsubscribes.push(recordChanges.subscribe(modelClass, this._onRecordChange, { databaseIdentity }));
|
|
101
103
|
}
|
|
102
104
|
this._run();
|
|
103
105
|
}
|
|
@@ -208,4 +210,4 @@ class LiveQuery {
|
|
|
208
210
|
}
|
|
209
211
|
}
|
|
210
212
|
export default LiveQuery;
|
|
211
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZS1xdWVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhYmFzZS9saXZlLXF1ZXJ5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGdCQUFnQixNQUFNLFVBQVUsQ0FBQTtBQUV2QyxPQUFPLGFBQWEsTUFBTSxxQkFBcUIsQ0FBQTtBQUMvQyxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUV2RDs7NEVBRTRFO0FBRTVFOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sU0FBUztJQUNiOzs7Ozs7T0FNRztJQUNILFlBQVksRUFBQyxLQUFLLEVBQUUsR0FBRyxRQUFRLEVBQUM7UUFDOUIsTUFBTSxFQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxXQUFXLEVBQUMsR0FBRyxRQUFRLENBQUE7UUFFbkQsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRTFCLElBQUksQ0FBQyxLQUFLO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO1FBRTFELGlDQUFpQztRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtRQUVuQixpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQTtRQUV0RCxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFDLENBQUE7UUFFdkQ7O3FDQUU2QjtRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFFM0I7O3VDQUUrQjtRQUMvQixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQTtRQUV2QixxQkFBcUI7UUFD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Q0FBQTtZQUNyRyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUVKLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFBO1FBQ3JDLEtBQUssY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDNUIsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLGNBQWM7Z0JBQUUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUE7UUFDMUUsQ0FBQyxDQUFDLENBQUE7UUFFRixPQUFPLGNBQWMsQ0FBQTtJQUN2QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsQ0FBQyxLQUFLO1FBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUE7UUFFbkIsS0FBSyxNQUFNLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ25ELFFBQVEsRUFBRSxDQUFBO1FBQ1osQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVELGVBQWUsU0FBUyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBkZWJvdW5jZUZ1bmN0aW9uIGZyb20gXCJkZWJvdW5jZVwiXG5cbmltcG9ydCByZWNvcmRDaGFuZ2VzIGZyb20gXCIuL3JlY29yZC1jaGFuZ2VzLmpzXCJcbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuXG4vKipcbiAqIFJlY29yZE1vZGVsQ2xhc3MgdHlwZS5cbiAqIEB0eXBlZGVmIHt0eXBlb2YgaW1wb3J0KFwiLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gUmVjb3JkTW9kZWxDbGFzcyAqL1xuXG4vKipcbiAqIFRoZSBtaW5pbWFsIHF1ZXJ5IGNvbnRyYWN0IGEgbGl2ZSBxdWVyeSBuZWVkczogYSByb290IG1vZGVsIGNsYXNzIHRvIG9ic2VydmVcbiAqIGZvciBjb21taXR0ZWQgY2hhbmdlcyBhbmQgYSB3YXkgdG8gcnVuIHRoZSBxdWVyeSBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHJvd3MuXG4gKiBgTW9kZWwud2hlcmUoey4uLn0pYCAoYSBtb2RlbC1jbGFzcyBxdWVyeSkgc2F0aXNmaWVzIHRoaXMgZGlyZWN0bHkuXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gTGl2ZVF1ZXJ5U291cmNlXG4gKiBAcHJvcGVydHkgeygpID0+IFJlY29yZE1vZGVsQ2xhc3N9IGdldE1vZGVsQ2xhc3MgLSBSb290IG1vZGVsIGNsYXNzIHRoZSBxdWVyeSByZWFkcy5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxUW10+fSB0b0FycmF5IC0gUnVucyB0aGUgcXVlcnkgYW5kIHJlc29sdmVzIHRoZSBjdXJyZW50IHJvd3MuXG4gKi9cblxuLyoqXG4gKiBMaXZlUXVlcnlTdGF0ZSB0eXBlLlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExpdmVRdWVyeVN0YXRlXG4gKiBAcHJvcGVydHkge1RbXX0gcmVzdWx0cyAtIEN1cnJlbnQgcXVlcnkgcmVzdWx0cy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbG9hZGluZyAtIFdoZXRoZXIgdGhlIGluaXRpYWwgcmVzdWx0cyBhcmUgc3RpbGwgbG9hZGluZy5cbiAqIEBwcm9wZXJ0eSB7RXJyb3IgfCBudWxsfSBlcnJvciAtIFRoZSBsYXN0IHJ1biBlcnJvciwgb3IgbnVsbCB3aGVuIHRoZSBsYXN0IHJ1biBzdWNjZWVkZWQuXG4gKi9cblxuLyoqXG4gKiBBIHJlYWN0aXZlIHF1ZXJ5IGNvbnRyb2xsZXI6IGZldGNoZXMgb25jZSwgc3Vic2NyaWJlcyB0byBjb21taXR0ZWQgY2hhbmdlcyBvZlxuICogaXRzIG1vZGVsIGNsYXNzKGVzKSwgYW5kIHJlLXJ1bnMgd2hlbmV2ZXIgYSB3YXRjaGVkIG1vZGVsIGNoYW5nZXMuIFJlLXJ1bnMgYXJlXG4gKiBjb2FsZXNjZWQgKG1pY3JvdGFzayBieSBkZWZhdWx0LCBvciBhIHRyYWlsaW5nIGRlYm91bmNlKSBhbmQgcHJvdGVjdGVkIGFnYWluc3RcbiAqIHN0YWxlIHJlc3BvbnNlcyBieSBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyByZXF1ZXN0IGlkLCBzbyBhbiBpbi1mbGlnaHQgcnVuXG4gKiBzdXBlcnNlZGVkIGJ5IGEgbmV3ZXIgY2hhbmdlIG5ldmVyIG92ZXJ3cml0ZXMgZnJlc2hlciByZXN1bHRzLiBGcmFtZXdvcmstbGV2ZWxcbiAqIGFuZCBSZWFjdC1mcmVlIHNvIGl0IGNhbiBiZSB1bml0IHRlc3RlZCBhbmQgd3JhcHBlZCBieSBgdXNlTGl2ZVF1ZXJ5YC5cbiAqXG4gKiBDb3N0IG1vZGVsOiBpbnZhbGlkYXRpb24gaXMgYnkgbW9kZWwgY2xhc3MuIEEgY2hhbmdlIHRvIG1vZGVsIE0gc2NoZWR1bGVzIG9uZVxuICogcmUtcnVuIG9mIGV2ZXJ5IGxpdmUgcXVlcnkgb2JzZXJ2aW5nIE0gKG5vIHBlci1jb25kaXRpb24gbWF0Y2hpbmcpOyBhIGJhdGNoIG9mXG4gKiBjaGFuZ2VzIGNvYWxlc2NlcyBpbnRvIGEgc2luZ2xlIHJlLXJ1bi5cbiAqIEB0ZW1wbGF0ZSBUXG4gKi9cbmNsYXNzIExpdmVRdWVyeSB7XG4gIC8qKlxuICAgKiBCdWlsZHMgYSBsaXZlIHF1ZXJ5IGNvbnRyb2xsZXIgZm9yIGEgcXVlcnkgc291cmNlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7TGl2ZVF1ZXJ5U291cmNlPFQ+fSBhcmdzLnF1ZXJ5IC0gUXVlcnkgc291cmNlIHByb3ZpZGluZyBtb2RlbCBjbGFzcyBhbmQgYHRvQXJyYXlgLlxuICAgKiBAcGFyYW0ge1JlY29yZE1vZGVsQ2xhc3NbXX0gW2FyZ3MubW9kZWxzXSAtIE1vZGVsIGNsYXNzZXMgdG8gb2JzZXJ2ZS4gRGVmYXVsdHMgdG8gYFtxdWVyeS5nZXRNb2RlbENsYXNzKCldYDsgcGFzcyB0aGlzIHRvIGFsc28gcmVhY3QgdG8gam9pbmVkIG1vZGVscy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmRlYm91bmNlXSAtIFRyYWlsaW5nIGRlYm91bmNlIGluIG1zIGZvciByZS1ydW5zLiBEZWZhdWx0cyB0byBtaWNyb3Rhc2sgY29hbGVzY2luZy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtxdWVyeSwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgY29uc3Qge2RlYm91bmNlLCBtb2RlbHMsIC4uLnVua25vd25BcmdzfSA9IHJlc3RBcmdzXG5cbiAgICByZXN0QXJnc0Vycm9yKHVua25vd25BcmdzKVxuXG4gICAgaWYgKCFxdWVyeSkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcXVlcnkgZ2l2ZW4gdG8gTGl2ZVF1ZXJ5XCIpXG5cbiAgICAvKiogQHR5cGUge0xpdmVRdWVyeVNvdXJjZTxUPn0gKi9cbiAgICB0aGlzLl9xdWVyeSA9IHF1ZXJ5XG5cbiAgICAvKiogQHR5cGUge1JlY29yZE1vZGVsQ2xhc3NbXX0gKi9cbiAgICB0aGlzLl9tb2RlbENsYXNzZXMgPSBtb2RlbHMgPz8gW3F1ZXJ5LmdldE1vZGVsQ2xhc3MoKV1cblxuICAgIC8qKiBAdHlwZSB7TGl2ZVF1ZXJ5U3RhdGU8VD59ICovXG4gICAgdGhpcy5fc3RhdGUgPSB7ZXJyb3I6IG51bGwsIGxvYWRpbmc6IHRydWUsIHJlc3VsdHM6IFtdfVxuXG4gICAgLyoqXG4gICAgICogU3RhdGUtY2hhbmdlIGxpc3RlbmVycyBub3RpZmllZCBhZnRlciBldmVyeSBzdGF0ZSB0cmFuc2l0aW9uLlxuICAgICAqIEB0eXBlIHtTZXQ8KCkgPT4gdm9pZD59ICovXG4gICAgdGhpcy5fbGlzdGVuZXJzID0gbmV3IFNldCgpXG5cbiAgICAvKipcbiAgICAgKiBSZWNvcmQtY2hhbmdlIHVuc3Vic2NyaWJlIGNhbGxiYWNrcyByZWdpc3RlcmVkIG9uIGBzdGFydGAuXG4gICAgICogQHR5cGUge0FycmF5PCgpID0+IHZvaWQ+fSAqL1xuICAgIHRoaXMuX3Vuc3Vic2NyaWJlcyA9IFtdXG5cbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLl9yZXF1ZXN0SWQgPSAwXG5cbiAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgdGhpcy5fY2xvc2VkID0gZmFsc2VcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLl9zdGFydGVkID0gZmFsc2VcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLl9ydW5TY2hlZHVsZWQgPSBmYWxzZVxuXG4gICAgLyoqXG4gICAgICogUHJvbWlzZSBmb3IgdGhlIGN1cnJlbnRseSBpbi1mbGlnaHQgcnVuLCBvciBudWxsIHdoZW4gaWRsZS5cbiAgICAgKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IG51bGx9ICovXG4gICAgdGhpcy5fcnVubmluZ1Byb21pc2UgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBTY2hlZHVsZXMgYSBjb2FsZXNjZWQgcmUtcnVuOiBhIHRyYWlsaW5nIGRlYm91bmNlIHdoZW4gY29uZmlndXJlZCwgZWxzZSBtaWNyb3Rhc2sgY29hbGVzY2luZy5cbiAgICAgKiBAdHlwZSB7KCgpID0+IHZvaWQpICYge2NsZWFyPzogKCkgPT4gdm9pZH19ICovXG4gICAgdGhpcy5fc2NoZWR1bGVSdW4gPSB0eXBlb2YgZGVib3VuY2UgPT09IFwibnVtYmVyXCJcbiAgICAgID8gZGVib3VuY2VGdW5jdGlvbigoKSA9PiB0aGlzLl9ydW4oKSwgZGVib3VuY2UpXG4gICAgICA6ICgpID0+IHRoaXMuX3NjaGVkdWxlTWljcm90YXNrUnVuKClcblxuICAgIC8qKlxuICAgICAqIFJlY29yZC1jaGFuZ2UgbGlzdGVuZXIgc2NoZWR1bGluZyBhIHJlLXJ1biB3aGlsZSB0aGUgY29udHJvbGxlciBpcyBvcGVuLlxuICAgICAqIEB0eXBlIHsoKSA9PiB2b2lkfSAqL1xuICAgIHRoaXMuX29uUmVjb3JkQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jbG9zZWQpIHRoaXMuX3NjaGVkdWxlUnVuKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byByZWNvcmQgY2hhbmdlcyBhbmQgcnVucyB0aGUgaW5pdGlhbCBxdWVyeS4gSWRlbXBvdGVudC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5fY2xvc2VkIHx8IHRoaXMuX3N0YXJ0ZWQpIHJldHVyblxuXG4gICAgdGhpcy5fc3RhcnRlZCA9IHRydWVcblxuICAgIGZvciAoY29uc3QgbW9kZWxDbGFzcyBvZiB0aGlzLl9tb2RlbENsYXNzZXMpIHtcbiAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlcy5wdXNoKHJlY29yZENoYW5nZXMuc3Vic2NyaWJlKG1vZGVsQ2xhc3MsIHRoaXMuX29uUmVjb3JkQ2hhbmdlKSlcbiAgICB9XG5cbiAgICB0aGlzLl9ydW4oKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUuIFRoZSByZWZlcmVuY2Ugb25seSBjaGFuZ2VzIHdoZW4gdGhlIHN0YXRlIGNoYW5nZXMsXG4gICAqIHNvIGl0IGlzIHNhZmUgdG8gdXNlIGFzIGEgUmVhY3QgZXh0ZXJuYWwtc3RvcmUgc25hcHNob3QuXG4gICAqIEByZXR1cm5zIHtMaXZlUXVlcnlTdGF0ZTxUPn0gQ3VycmVudCBsaXZlLXF1ZXJ5IHN0YXRlLlxuICAgKi9cbiAgZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyBhIGxpc3RlbmVyIG5vdGlmaWVkIGFmdGVyIGV2ZXJ5IHN0YXRlIGNoYW5nZS5cbiAgICogQHBhcmFtIHsoKSA9PiB2b2lkfSBsaXN0ZW5lciAtIFN0YXRlLWNoYW5nZSBsaXN0ZW5lci5cbiAgICogQHJldHVybnMgeygpID0+IHZvaWR9IFVuc3Vic2NyaWJlIGNhbGxiYWNrLlxuICAgKi9cbiAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fbGlzdGVuZXJzLmFkZChsaXN0ZW5lcilcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgZnJvbSByZWNvcmQgY2hhbmdlcywgZHJvcHMgbGlzdGVuZXJzLCBhbmQgcHJldmVudHMgZnVydGhlciBydW5zLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLl9jbG9zZWQpIHJldHVyblxuXG4gICAgdGhpcy5fY2xvc2VkID0gdHJ1ZVxuXG4gICAgZm9yIChjb25zdCB1bnN1YnNjcmliZSBvZiB0aGlzLl91bnN1YnNjcmliZXMpIHtcbiAgICAgIHVuc3Vic2NyaWJlKClcbiAgICB9XG5cbiAgICB0aGlzLl91bnN1YnNjcmliZXMgPSBbXVxuICAgIHRoaXMuX2xpc3RlbmVycy5jbGVhcigpXG5cbiAgICBpZiAodGhpcy5fc2NoZWR1bGVSdW4uY2xlYXIpIHRoaXMuX3NjaGVkdWxlUnVuLmNsZWFyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBd2FpdHMgYW55IHNjaGVkdWxlZCBvciBpbi1mbGlnaHQgcnVuIHNvIGNhbGxlcnMgKHRlc3RzKSBjYW4gb2JzZXJ2ZSBzZXR0bGVkXG4gICAqIHJlc3VsdHMuIEJvdW5kZWQgc28gYSBjb250aW51b3VzIGNoYW5nZSBzdHJlYW0gY2Fubm90IGxvb3AgZm9yZXZlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3aGVuU2V0dGxlZCgpIHtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IDEwMDsgYXR0ZW1wdCsrKSB7XG4gICAgICBpZiAodGhpcy5fY2xvc2VkKSByZXR1cm5cbiAgICAgIGlmICghdGhpcy5fcnVuU2NoZWR1bGVkICYmICF0aGlzLl9ydW5uaW5nUHJvbWlzZSkgcmV0dXJuXG5cbiAgICAgIGlmICh0aGlzLl9ydW5uaW5nUHJvbWlzZSkgYXdhaXQgdGhpcy5fcnVubmluZ1Byb21pc2VcblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHF1ZXVlTWljcm90YXNrKCgpID0+IHJlc29sdmUodW5kZWZpbmVkKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlcyBhIG1pY3JvdGFzay1jb2FsZXNjZWQgcmUtcnVuLCBjb2xsYXBzaW5nIGEgc3luY2hyb25vdXMgYnVyc3Qgb2ZcbiAgICogY2hhbmdlIGV2ZW50cyBpbnRvIGEgc2luZ2xlIHJ1bi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfc2NoZWR1bGVNaWNyb3Rhc2tSdW4oKSB7XG4gICAgaWYgKHRoaXMuX3J1blNjaGVkdWxlZCkgcmV0dXJuXG5cbiAgICB0aGlzLl9ydW5TY2hlZHVsZWQgPSB0cnVlXG5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB0aGlzLl9ydW5TY2hlZHVsZWQgPSBmYWxzZVxuXG4gICAgICBpZiAoIXRoaXMuX2Nsb3NlZCkgdGhpcy5fcnVuKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHF1ZXJ5IGFuZCBhcHBsaWVzIGl0cyByZXN1bHRzIHVubGVzcyBhIG5ld2VyIHJ1biBzdXBlcnNlZGVkIGl0IG9yIHRoZVxuICAgKiBjb250cm9sbGVyIHdhcyBjbG9zZWQuIEEgcnVuIGVycm9yIHN1cmZhY2VzIGluIHN0YXRlICh3aXRoIHRoZSBwcmV2aW91c1xuICAgKiByZXN1bHRzIGtlcHQpIHJhdGhlciB0aGFuIHJlamVjdGluZyBhIGJhY2tncm91bmQgcHJvbWlzZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBfcnVuKCkge1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9ICsrdGhpcy5fcmVxdWVzdElkXG4gICAgY29uc3QgcnVubmluZ1Byb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuX3F1ZXJ5LnRvQXJyYXkoKVxuXG4gICAgICAgIGlmICh0aGlzLl9jbG9zZWQgfHwgcmVxdWVzdElkICE9PSB0aGlzLl9yZXF1ZXN0SWQpIHJldHVyblxuXG4gICAgICAgIHRoaXMuX3NldFN0YXRlKHtlcnJvcjogbnVsbCwgbG9hZGluZzogZmFsc2UsIHJlc3VsdHN9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Nsb3NlZCB8fCByZXF1ZXN0SWQgIT09IHRoaXMuX3JlcXVlc3RJZCkgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5fc2V0U3RhdGUoe2Vycm9yOiAvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpLCBsb2FkaW5nOiBmYWxzZSwgcmVzdWx0czogdGhpcy5fc3RhdGUucmVzdWx0c30pXG4gICAgICB9XG4gICAgfSkoKVxuXG4gICAgdGhpcy5fcnVubmluZ1Byb21pc2UgPSBydW5uaW5nUHJvbWlzZVxuICAgIHZvaWQgcnVubmluZ1Byb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fcnVubmluZ1Byb21pc2UgPT09IHJ1bm5pbmdQcm9taXNlKSB0aGlzLl9ydW5uaW5nUHJvbWlzZSA9IG51bGxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHJ1bm5pbmdQcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgdGhlIHN0YXRlIGFuZCBub3RpZmllcyBsaXN0ZW5lcnMuXG4gICAqIEBwYXJhbSB7TGl2ZVF1ZXJ5U3RhdGU8VD59IHN0YXRlIC0gTmV4dCBzdGF0ZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfc2V0U3RhdGUoc3RhdGUpIHtcbiAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlXG5cbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIEFycmF5LmZyb20odGhpcy5fbGlzdGVuZXJzKSkge1xuICAgICAgbGlzdGVuZXIoKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaXZlUXVlcnlcbiJdfQ==
|
|
213
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZS1xdWVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhYmFzZS9saXZlLXF1ZXJ5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGdCQUFnQixNQUFNLFVBQVUsQ0FBQTtBQUV2QyxPQUFPLGFBQWEsTUFBTSxxQkFBcUIsQ0FBQTtBQUMvQyxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUV2RDs7NEVBRTRFO0FBRTVFOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFNBQVM7SUFDYjs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsS0FBSyxFQUFFLEdBQUcsUUFBUSxFQUFDO1FBQzlCLE1BQU0sRUFBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsV0FBVyxFQUFDLEdBQUcsUUFBUSxDQUFBO1FBRW5ELGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUUxQixJQUFJLENBQUMsS0FBSztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtRQUUxRCxpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUE7UUFFbkIsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUE7UUFFdEQsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBQyxDQUFBO1FBRXZEOztxQ0FFNkI7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRTNCOzt1Q0FFK0I7UUFDL0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUE7UUFFdkIscUJBQXFCO1FB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LG9CQUFvQixDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUMsQ0FBQyxDQUFBO1lBQ3JHLENBQUM7UUFDSCxDQUFDLENBQUMsRUFBRSxDQUFBO1FBRUosSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUE7UUFDckMsS0FBSyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUM1QixJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssY0FBYztnQkFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQTtRQUMxRSxDQUFDLENBQUMsQ0FBQTtRQUVGLE9BQU8sY0FBYyxDQUFBO0lBQ3ZCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUyxDQUFDLEtBQUs7UUFDYixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtRQUVuQixLQUFLLE1BQU0sUUFBUSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDbkQsUUFBUSxFQUFFLENBQUE7UUFDWixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRUQsZUFBZSxTQUFTLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGRlYm91bmNlRnVuY3Rpb24gZnJvbSBcImRlYm91bmNlXCJcblxuaW1wb3J0IHJlY29yZENoYW5nZXMgZnJvbSBcIi4vcmVjb3JkLWNoYW5nZXMuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5cbi8qKlxuICogUmVjb3JkTW9kZWxDbGFzcyB0eXBlLlxuICogQHR5cGVkZWYge3R5cGVvZiBpbXBvcnQoXCIuL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBSZWNvcmRNb2RlbENsYXNzICovXG5cbi8qKlxuICogVGhlIG1pbmltYWwgcXVlcnkgY29udHJhY3QgYSBsaXZlIHF1ZXJ5IG5lZWRzOiBhIHJvb3QgbW9kZWwgY2xhc3MgdG8gb2JzZXJ2ZVxuICogZm9yIGNvbW1pdHRlZCBjaGFuZ2VzIGFuZCBhIHdheSB0byBydW4gdGhlIHF1ZXJ5IGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgcm93cy5cbiAqIGBNb2RlbC53aGVyZSh7Li4ufSlgIChhIG1vZGVsLWNsYXNzIHF1ZXJ5KSBzYXRpc2ZpZXMgdGhpcyBkaXJlY3RseS5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMaXZlUXVlcnlTb3VyY2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUmVjb3JkTW9kZWxDbGFzc30gZ2V0TW9kZWxDbGFzcyAtIFJvb3QgbW9kZWwgY2xhc3MgdGhlIHF1ZXJ5IHJlYWRzLlxuICogQHByb3BlcnR5IHsobW9kZWxDbGFzczogUmVjb3JkTW9kZWxDbGFzcykgPT4gc3RyaW5nfSBbZGF0YWJhc2VJZGVudGl0eUZvck1vZGVsXSAtIENhcHR1cmVkIHBoeXNpY2FsIGlkZW50aXR5IGZvciBhbiBvYnNlcnZlZCBtb2RlbC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxUW10+fSB0b0FycmF5IC0gUnVucyB0aGUgcXVlcnkgYW5kIHJlc29sdmVzIHRoZSBjdXJyZW50IHJvd3MuXG4gKi9cblxuLyoqXG4gKiBMaXZlUXVlcnlTdGF0ZSB0eXBlLlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExpdmVRdWVyeVN0YXRlXG4gKiBAcHJvcGVydHkge1RbXX0gcmVzdWx0cyAtIEN1cnJlbnQgcXVlcnkgcmVzdWx0cy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbG9hZGluZyAtIFdoZXRoZXIgdGhlIGluaXRpYWwgcmVzdWx0cyBhcmUgc3RpbGwgbG9hZGluZy5cbiAqIEBwcm9wZXJ0eSB7RXJyb3IgfCBudWxsfSBlcnJvciAtIFRoZSBsYXN0IHJ1biBlcnJvciwgb3IgbnVsbCB3aGVuIHRoZSBsYXN0IHJ1biBzdWNjZWVkZWQuXG4gKi9cblxuLyoqXG4gKiBBIHJlYWN0aXZlIHF1ZXJ5IGNvbnRyb2xsZXI6IGZldGNoZXMgb25jZSwgc3Vic2NyaWJlcyB0byBjb21taXR0ZWQgY2hhbmdlcyBvZlxuICogaXRzIG1vZGVsIGNsYXNzKGVzKSwgYW5kIHJlLXJ1bnMgd2hlbmV2ZXIgYSB3YXRjaGVkIG1vZGVsIGNoYW5nZXMuIFJlLXJ1bnMgYXJlXG4gKiBjb2FsZXNjZWQgKG1pY3JvdGFzayBieSBkZWZhdWx0LCBvciBhIHRyYWlsaW5nIGRlYm91bmNlKSBhbmQgcHJvdGVjdGVkIGFnYWluc3RcbiAqIHN0YWxlIHJlc3BvbnNlcyBieSBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyByZXF1ZXN0IGlkLCBzbyBhbiBpbi1mbGlnaHQgcnVuXG4gKiBzdXBlcnNlZGVkIGJ5IGEgbmV3ZXIgY2hhbmdlIG5ldmVyIG92ZXJ3cml0ZXMgZnJlc2hlciByZXN1bHRzLiBGcmFtZXdvcmstbGV2ZWxcbiAqIGFuZCBSZWFjdC1mcmVlIHNvIGl0IGNhbiBiZSB1bml0IHRlc3RlZCBhbmQgd3JhcHBlZCBieSBgdXNlTGl2ZVF1ZXJ5YC5cbiAqXG4gKiBDb3N0IG1vZGVsOiBpbnZhbGlkYXRpb24gaXMgYnkgbW9kZWwgY2xhc3MuIEEgY2hhbmdlIHRvIG1vZGVsIE0gc2NoZWR1bGVzIG9uZVxuICogcmUtcnVuIG9mIGV2ZXJ5IGxpdmUgcXVlcnkgb2JzZXJ2aW5nIE0gKG5vIHBlci1jb25kaXRpb24gbWF0Y2hpbmcpOyBhIGJhdGNoIG9mXG4gKiBjaGFuZ2VzIGNvYWxlc2NlcyBpbnRvIGEgc2luZ2xlIHJlLXJ1bi5cbiAqIEB0ZW1wbGF0ZSBUXG4gKi9cbmNsYXNzIExpdmVRdWVyeSB7XG4gIC8qKlxuICAgKiBCdWlsZHMgYSBsaXZlIHF1ZXJ5IGNvbnRyb2xsZXIgZm9yIGEgcXVlcnkgc291cmNlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7TGl2ZVF1ZXJ5U291cmNlPFQ+fSBhcmdzLnF1ZXJ5IC0gUXVlcnkgc291cmNlIHByb3ZpZGluZyBtb2RlbCBjbGFzcyBhbmQgYHRvQXJyYXlgLlxuICAgKiBAcGFyYW0ge1JlY29yZE1vZGVsQ2xhc3NbXX0gW2FyZ3MubW9kZWxzXSAtIE1vZGVsIGNsYXNzZXMgdG8gb2JzZXJ2ZS4gRGVmYXVsdHMgdG8gYFtxdWVyeS5nZXRNb2RlbENsYXNzKCldYDsgcGFzcyB0aGlzIHRvIGFsc28gcmVhY3QgdG8gam9pbmVkIG1vZGVscy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmRlYm91bmNlXSAtIFRyYWlsaW5nIGRlYm91bmNlIGluIG1zIGZvciByZS1ydW5zLiBEZWZhdWx0cyB0byBtaWNyb3Rhc2sgY29hbGVzY2luZy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtxdWVyeSwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgY29uc3Qge2RlYm91bmNlLCBtb2RlbHMsIC4uLnVua25vd25BcmdzfSA9IHJlc3RBcmdzXG5cbiAgICByZXN0QXJnc0Vycm9yKHVua25vd25BcmdzKVxuXG4gICAgaWYgKCFxdWVyeSkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcXVlcnkgZ2l2ZW4gdG8gTGl2ZVF1ZXJ5XCIpXG5cbiAgICAvKiogQHR5cGUge0xpdmVRdWVyeVNvdXJjZTxUPn0gKi9cbiAgICB0aGlzLl9xdWVyeSA9IHF1ZXJ5XG5cbiAgICAvKiogQHR5cGUge1JlY29yZE1vZGVsQ2xhc3NbXX0gKi9cbiAgICB0aGlzLl9tb2RlbENsYXNzZXMgPSBtb2RlbHMgPz8gW3F1ZXJ5LmdldE1vZGVsQ2xhc3MoKV1cblxuICAgIC8qKiBAdHlwZSB7TGl2ZVF1ZXJ5U3RhdGU8VD59ICovXG4gICAgdGhpcy5fc3RhdGUgPSB7ZXJyb3I6IG51bGwsIGxvYWRpbmc6IHRydWUsIHJlc3VsdHM6IFtdfVxuXG4gICAgLyoqXG4gICAgICogU3RhdGUtY2hhbmdlIGxpc3RlbmVycyBub3RpZmllZCBhZnRlciBldmVyeSBzdGF0ZSB0cmFuc2l0aW9uLlxuICAgICAqIEB0eXBlIHtTZXQ8KCkgPT4gdm9pZD59ICovXG4gICAgdGhpcy5fbGlzdGVuZXJzID0gbmV3IFNldCgpXG5cbiAgICAvKipcbiAgICAgKiBSZWNvcmQtY2hhbmdlIHVuc3Vic2NyaWJlIGNhbGxiYWNrcyByZWdpc3RlcmVkIG9uIGBzdGFydGAuXG4gICAgICogQHR5cGUge0FycmF5PCgpID0+IHZvaWQ+fSAqL1xuICAgIHRoaXMuX3Vuc3Vic2NyaWJlcyA9IFtdXG5cbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLl9yZXF1ZXN0SWQgPSAwXG5cbiAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgdGhpcy5fY2xvc2VkID0gZmFsc2VcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLl9zdGFydGVkID0gZmFsc2VcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLl9ydW5TY2hlZHVsZWQgPSBmYWxzZVxuXG4gICAgLyoqXG4gICAgICogUHJvbWlzZSBmb3IgdGhlIGN1cnJlbnRseSBpbi1mbGlnaHQgcnVuLCBvciBudWxsIHdoZW4gaWRsZS5cbiAgICAgKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IG51bGx9ICovXG4gICAgdGhpcy5fcnVubmluZ1Byb21pc2UgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBTY2hlZHVsZXMgYSBjb2FsZXNjZWQgcmUtcnVuOiBhIHRyYWlsaW5nIGRlYm91bmNlIHdoZW4gY29uZmlndXJlZCwgZWxzZSBtaWNyb3Rhc2sgY29hbGVzY2luZy5cbiAgICAgKiBAdHlwZSB7KCgpID0+IHZvaWQpICYge2NsZWFyPzogKCkgPT4gdm9pZH19ICovXG4gICAgdGhpcy5fc2NoZWR1bGVSdW4gPSB0eXBlb2YgZGVib3VuY2UgPT09IFwibnVtYmVyXCJcbiAgICAgID8gZGVib3VuY2VGdW5jdGlvbigoKSA9PiB0aGlzLl9ydW4oKSwgZGVib3VuY2UpXG4gICAgICA6ICgpID0+IHRoaXMuX3NjaGVkdWxlTWljcm90YXNrUnVuKClcblxuICAgIC8qKlxuICAgICAqIFJlY29yZC1jaGFuZ2UgbGlzdGVuZXIgc2NoZWR1bGluZyBhIHJlLXJ1biB3aGlsZSB0aGUgY29udHJvbGxlciBpcyBvcGVuLlxuICAgICAqIEB0eXBlIHsoKSA9PiB2b2lkfSAqL1xuICAgIHRoaXMuX29uUmVjb3JkQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jbG9zZWQpIHRoaXMuX3NjaGVkdWxlUnVuKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byByZWNvcmQgY2hhbmdlcyBhbmQgcnVucyB0aGUgaW5pdGlhbCBxdWVyeS4gSWRlbXBvdGVudC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5fY2xvc2VkIHx8IHRoaXMuX3N0YXJ0ZWQpIHJldHVyblxuXG4gICAgdGhpcy5fc3RhcnRlZCA9IHRydWVcblxuICAgIGZvciAoY29uc3QgbW9kZWxDbGFzcyBvZiB0aGlzLl9tb2RlbENsYXNzZXMpIHtcbiAgICAgIGNvbnN0IGRhdGFiYXNlSWRlbnRpdHkgPSB0aGlzLl9xdWVyeS5kYXRhYmFzZUlkZW50aXR5Rm9yTW9kZWw/Lihtb2RlbENsYXNzKVxuXG4gICAgICB0aGlzLl91bnN1YnNjcmliZXMucHVzaChyZWNvcmRDaGFuZ2VzLnN1YnNjcmliZShtb2RlbENsYXNzLCB0aGlzLl9vblJlY29yZENoYW5nZSwge2RhdGFiYXNlSWRlbnRpdHl9KSlcbiAgICB9XG5cbiAgICB0aGlzLl9ydW4oKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUuIFRoZSByZWZlcmVuY2Ugb25seSBjaGFuZ2VzIHdoZW4gdGhlIHN0YXRlIGNoYW5nZXMsXG4gICAqIHNvIGl0IGlzIHNhZmUgdG8gdXNlIGFzIGEgUmVhY3QgZXh0ZXJuYWwtc3RvcmUgc25hcHNob3QuXG4gICAqIEByZXR1cm5zIHtMaXZlUXVlcnlTdGF0ZTxUPn0gQ3VycmVudCBsaXZlLXF1ZXJ5IHN0YXRlLlxuICAgKi9cbiAgZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyBhIGxpc3RlbmVyIG5vdGlmaWVkIGFmdGVyIGV2ZXJ5IHN0YXRlIGNoYW5nZS5cbiAgICogQHBhcmFtIHsoKSA9PiB2b2lkfSBsaXN0ZW5lciAtIFN0YXRlLWNoYW5nZSBsaXN0ZW5lci5cbiAgICogQHJldHVybnMgeygpID0+IHZvaWR9IFVuc3Vic2NyaWJlIGNhbGxiYWNrLlxuICAgKi9cbiAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fbGlzdGVuZXJzLmFkZChsaXN0ZW5lcilcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgZnJvbSByZWNvcmQgY2hhbmdlcywgZHJvcHMgbGlzdGVuZXJzLCBhbmQgcHJldmVudHMgZnVydGhlciBydW5zLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLl9jbG9zZWQpIHJldHVyblxuXG4gICAgdGhpcy5fY2xvc2VkID0gdHJ1ZVxuXG4gICAgZm9yIChjb25zdCB1bnN1YnNjcmliZSBvZiB0aGlzLl91bnN1YnNjcmliZXMpIHtcbiAgICAgIHVuc3Vic2NyaWJlKClcbiAgICB9XG5cbiAgICB0aGlzLl91bnN1YnNjcmliZXMgPSBbXVxuICAgIHRoaXMuX2xpc3RlbmVycy5jbGVhcigpXG5cbiAgICBpZiAodGhpcy5fc2NoZWR1bGVSdW4uY2xlYXIpIHRoaXMuX3NjaGVkdWxlUnVuLmNsZWFyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBd2FpdHMgYW55IHNjaGVkdWxlZCBvciBpbi1mbGlnaHQgcnVuIHNvIGNhbGxlcnMgKHRlc3RzKSBjYW4gb2JzZXJ2ZSBzZXR0bGVkXG4gICAqIHJlc3VsdHMuIEJvdW5kZWQgc28gYSBjb250aW51b3VzIGNoYW5nZSBzdHJlYW0gY2Fubm90IGxvb3AgZm9yZXZlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3aGVuU2V0dGxlZCgpIHtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IDEwMDsgYXR0ZW1wdCsrKSB7XG4gICAgICBpZiAodGhpcy5fY2xvc2VkKSByZXR1cm5cbiAgICAgIGlmICghdGhpcy5fcnVuU2NoZWR1bGVkICYmICF0aGlzLl9ydW5uaW5nUHJvbWlzZSkgcmV0dXJuXG5cbiAgICAgIGlmICh0aGlzLl9ydW5uaW5nUHJvbWlzZSkgYXdhaXQgdGhpcy5fcnVubmluZ1Byb21pc2VcblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHF1ZXVlTWljcm90YXNrKCgpID0+IHJlc29sdmUodW5kZWZpbmVkKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlcyBhIG1pY3JvdGFzay1jb2FsZXNjZWQgcmUtcnVuLCBjb2xsYXBzaW5nIGEgc3luY2hyb25vdXMgYnVyc3Qgb2ZcbiAgICogY2hhbmdlIGV2ZW50cyBpbnRvIGEgc2luZ2xlIHJ1bi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfc2NoZWR1bGVNaWNyb3Rhc2tSdW4oKSB7XG4gICAgaWYgKHRoaXMuX3J1blNjaGVkdWxlZCkgcmV0dXJuXG5cbiAgICB0aGlzLl9ydW5TY2hlZHVsZWQgPSB0cnVlXG5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB0aGlzLl9ydW5TY2hlZHVsZWQgPSBmYWxzZVxuXG4gICAgICBpZiAoIXRoaXMuX2Nsb3NlZCkgdGhpcy5fcnVuKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHF1ZXJ5IGFuZCBhcHBsaWVzIGl0cyByZXN1bHRzIHVubGVzcyBhIG5ld2VyIHJ1biBzdXBlcnNlZGVkIGl0IG9yIHRoZVxuICAgKiBjb250cm9sbGVyIHdhcyBjbG9zZWQuIEEgcnVuIGVycm9yIHN1cmZhY2VzIGluIHN0YXRlICh3aXRoIHRoZSBwcmV2aW91c1xuICAgKiByZXN1bHRzIGtlcHQpIHJhdGhlciB0aGFuIHJlamVjdGluZyBhIGJhY2tncm91bmQgcHJvbWlzZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBfcnVuKCkge1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9ICsrdGhpcy5fcmVxdWVzdElkXG4gICAgY29uc3QgcnVubmluZ1Byb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuX3F1ZXJ5LnRvQXJyYXkoKVxuXG4gICAgICAgIGlmICh0aGlzLl9jbG9zZWQgfHwgcmVxdWVzdElkICE9PSB0aGlzLl9yZXF1ZXN0SWQpIHJldHVyblxuXG4gICAgICAgIHRoaXMuX3NldFN0YXRlKHtlcnJvcjogbnVsbCwgbG9hZGluZzogZmFsc2UsIHJlc3VsdHN9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Nsb3NlZCB8fCByZXF1ZXN0SWQgIT09IHRoaXMuX3JlcXVlc3RJZCkgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5fc2V0U3RhdGUoe2Vycm9yOiAvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpLCBsb2FkaW5nOiBmYWxzZSwgcmVzdWx0czogdGhpcy5fc3RhdGUucmVzdWx0c30pXG4gICAgICB9XG4gICAgfSkoKVxuXG4gICAgdGhpcy5fcnVubmluZ1Byb21pc2UgPSBydW5uaW5nUHJvbWlzZVxuICAgIHZvaWQgcnVubmluZ1Byb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fcnVubmluZ1Byb21pc2UgPT09IHJ1bm5pbmdQcm9taXNlKSB0aGlzLl9ydW5uaW5nUHJvbWlzZSA9IG51bGxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHJ1bm5pbmdQcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgdGhlIHN0YXRlIGFuZCBub3RpZmllcyBsaXN0ZW5lcnMuXG4gICAqIEBwYXJhbSB7TGl2ZVF1ZXJ5U3RhdGU8VD59IHN0YXRlIC0gTmV4dCBzdGF0ZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfc2V0U3RhdGUoc3RhdGUpIHtcbiAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlXG5cbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIEFycmF5LmZyb20odGhpcy5fbGlzdGVuZXJzKSkge1xuICAgICAgbGlzdGVuZXIoKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaXZlUXVlcnlcbiJdfQ==
|
|
@@ -110,6 +110,11 @@ export default class VelociousDatabaseOperation {
|
|
|
110
110
|
* @returns {string} - Physical database identity.
|
|
111
111
|
*/
|
|
112
112
|
databaseIdentity(): string;
|
|
113
|
+
/**
|
|
114
|
+
* Returns the tenant schema generation captured when this operation started.
|
|
115
|
+
* @returns {string | undefined} - Captured schema generation.
|
|
116
|
+
*/
|
|
117
|
+
schemaGeneration(): string | undefined;
|
|
113
118
|
/**
|
|
114
119
|
* Initializes a model through this operation's captured connection.
|
|
115
120
|
* @param {typeof import("./record/index.js").default} ModelClass - Model class.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../../src/database/operation.js"],"names":[],"mappings":"AAEA,OAAO,mBAAmB,MAAM,2BAA2B,CAAA;AAE3D;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,0BAA0B;IAetC,OAAO;IACP,cAAc;IACd,sBAAsB;IACtB,sBAAsB;IACtB,mBAAmB;IACnB,6BAA6B;IAC7B,mBAAmB;IACnB,iBAAiB;IACjB,OAAO;IACZ,8GAA8G;IACzG,kBAAkB,EADZ,OAAO,CAAC,cAAc,mBAAmB,EAAE,OAAO,EAAE,cAAc,mBAAmB,EAAE,OAAO,CAAC;IAErG,WAAW;IAzBlB;;;;;;;;;;;;OAYG;IACH,YAAY,EAAC,aAAa,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,UAAU,EAAE,kBAAkB,EAAE,4BAAmC,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAC,EAV5K;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO,CAC7C;QAAuB,4BAA4B,AAAnD,CACA,EADQ,OAAO,CACf;QAA6E,qBAAqB,AAAlG,CACA,EADQ,OAAO,2BAA2B,EAAE,yBAAyB,CACrE;QAAqB,qBAAqB,EAAlC,MAAM,CACd;QAAkD,UAAU,EAApD,OAAO,mBAAmB,EAAE,OAAO,CAC3C;QAAqB,kBAAkB,EAA/B,MAAM,CACd;QAAqB,KAAK,EAAlB,MAAM,CACd;QAAsB,gBAAgB,AAAtC,CACA,EADQ,MAAM,CACd;QAAiC,MAAM,EAA/B,MAAM,GAAG,SAAS,CAC5B;KAC8K,EAiB9K;IAED;;;;;OAKG;IACH,QAAQ,CAJkD,EAAE,SAA9C,cAAc,mBAAmB,EAAE,OAAW,EAInD,UAAU,EAHR,EAGQ,GAFN,OAAO,8BAA8B,EAAE,OAAO,CAAC,EAAE,CAAC,CAU9D;IAED;;;;;;;OAOG;IACH,UAAU,CAJgD,EAAE,SAA9C,cAAc,mBAAmB,EAAE,OAAW,EAIjD,UAAU,EAHV,EAGU,GAFR,EAAE,CAqCd;IAED;;;;OAIG;IACH,WAAW,CAAC,UAAU,EAHX,cAAc,mBAAmB,EAAE,OAGxB,GAFT,IAAI,CAYhB;IAED;;;;;OAKG;IACH,UAAU,CAJyC,KAAK,SAA1C,OAAO,mBAAmB,EAAE,OAAc,EAI7C,MAAM,EAHN,KAGM,GAFJ,KAAK,
|
|
1
|
+
{"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../../src/database/operation.js"],"names":[],"mappings":"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"}
|