velocious 1.0.718 → 1.0.720
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 +2 -0
- package/build/configuration.js +20 -2
- package/build/database/advisory-lock-file-backend.js +21 -3
- package/build/database/advisory-lock-lock-server-backend.js +12 -2
- package/build/database/advisory-lock-runner.js +91 -1
- package/build/database/migrator.js +5 -5
- package/build/src/configuration.d.ts +18 -1
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +20 -3
- package/build/src/database/advisory-lock-file-backend.d.ts +2 -1
- package/build/src/database/advisory-lock-file-backend.d.ts.map +1 -1
- package/build/src/database/advisory-lock-file-backend.js +18 -5
- package/build/src/database/advisory-lock-lock-server-backend.d.ts +5 -1
- package/build/src/database/advisory-lock-lock-server-backend.d.ts.map +1 -1
- package/build/src/database/advisory-lock-lock-server-backend.js +11 -3
- package/build/src/database/advisory-lock-runner.d.ts +42 -0
- package/build/src/database/advisory-lock-runner.d.ts.map +1 -1
- package/build/src/database/advisory-lock-runner.js +82 -2
- package/build/src/database/migrator.js +6 -6
- package/package.json +1 -1
- package/src/configuration.js +20 -2
- package/src/database/advisory-lock-file-backend.js +21 -3
- package/src/database/advisory-lock-lock-server-backend.js +12 -2
- package/src/database/advisory-lock-runner.js +91 -1
- package/src/database/migrator.js +5 -5
|
@@ -69,8 +69,9 @@ export default class AdvisoryLockFileBackend {
|
|
|
69
69
|
pathStyle: "hashed" | "plain";
|
|
70
70
|
pollIntervalMs: number;
|
|
71
71
|
holderId: string;
|
|
72
|
-
/** @type {Map<string, {timer: ReturnType<typeof setInterval>}>} */
|
|
72
|
+
/** @type {Map<string, {depth: number, timer: ReturnType<typeof setInterval>}>} */
|
|
73
73
|
holdsByName: Map<string, {
|
|
74
|
+
depth: number;
|
|
74
75
|
timer: ReturnType<typeof setInterval>;
|
|
75
76
|
}>;
|
|
76
77
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advisory-lock-file-backend.d.ts","sourceRoot":"","sources":["../../../src/database/advisory-lock-file-backend.js"],"names":[],"mappings":"AAUG,YAAkB,qBAAqB,GACvC;;;;IAAmB,GAAG,EAAX,MAAM,CACjB;;;;IAAmB,QAAQ,EAAhB,MAAM,CACjB;;;;IAAmB,QAAQ,EAAhB,MAAM,CACjB;;;;IAAmB,UAAU,EAAlB,MAAM,CACjB;;;;IAAmB,cAAc,EAAtB,MAAM,CACjB;;;;IAAoB,IAAI,AAAxB,CACA,EADW,MAAM,CACjB;;;;IAAoB,IAAI,AAAxB,CACF,EADa,MAAM,CACnB;CAAA,CAAA;AAVD;;;;;;;;;;GAUG;AAEH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAuB;IAYnC,SAAS;IACT,gBAAgB;IAChB,OAAO;IACP,eAAe;IACf,SAAS;IACT,cAAc;IACd,QAAQ;IACb,
|
|
1
|
+
{"version":3,"file":"advisory-lock-file-backend.d.ts","sourceRoot":"","sources":["../../../src/database/advisory-lock-file-backend.js"],"names":[],"mappings":"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"}
|
|
@@ -56,7 +56,7 @@ export default class AdvisoryLockFileBackend {
|
|
|
56
56
|
this.pathStyle = pathStyle;
|
|
57
57
|
this.pollIntervalMs = pollIntervalMs;
|
|
58
58
|
this.holderId = `${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
|
|
59
|
-
/** @type {Map<string, {timer: ReturnType<typeof setInterval>}>} */
|
|
59
|
+
/** @type {Map<string, {depth: number, timer: ReturnType<typeof setInterval>}>} */
|
|
60
60
|
this.holdsByName = new Map();
|
|
61
61
|
}
|
|
62
62
|
/**
|
|
@@ -104,8 +104,15 @@ export default class AdvisoryLockFileBackend {
|
|
|
104
104
|
* @returns {Promise<boolean>} - True when this backend became the lock owner.
|
|
105
105
|
*/
|
|
106
106
|
async tryAcquire(name) {
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
// Already held by this backend instance: a re-entrant acquisition
|
|
108
|
+
// (`Monitor` semantics) adds a level instead of contending with itself.
|
|
109
|
+
// Refusing it made a nested hold time out on this tier while the same
|
|
110
|
+
// nesting worked on the database tiers.
|
|
111
|
+
const existingHold = this.holdsByName.get(name);
|
|
112
|
+
if (existingHold) {
|
|
113
|
+
existingHold.depth += 1;
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
109
116
|
await this.ensureDirectory();
|
|
110
117
|
const lockPath = this.lockPathFor(name);
|
|
111
118
|
if (await this.publishLockDirectory(lockPath))
|
|
@@ -127,6 +134,12 @@ export default class AdvisoryLockFileBackend {
|
|
|
127
134
|
const hold = this.holdsByName.get(name);
|
|
128
135
|
if (!hold)
|
|
129
136
|
return false;
|
|
137
|
+
// One release per acquisition: a re-entrant hold keeps the lock until its
|
|
138
|
+
// outermost level releases, exactly like the database tiers.
|
|
139
|
+
if (hold.depth > 1) {
|
|
140
|
+
hold.depth -= 1;
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
130
143
|
this.clearHold(name);
|
|
131
144
|
const owner = await this.readOwner(this.lockPathFor(name));
|
|
132
145
|
if (!owner || owner.holderId !== this.holderId)
|
|
@@ -212,7 +225,7 @@ export default class AdvisoryLockFileBackend {
|
|
|
212
225
|
}, this.renewIntervalMs);
|
|
213
226
|
if (typeof timer.unref === "function")
|
|
214
227
|
timer.unref();
|
|
215
|
-
this.holdsByName.set(name, { timer });
|
|
228
|
+
this.holdsByName.set(name, { depth: 1, timer });
|
|
216
229
|
return true;
|
|
217
230
|
}
|
|
218
231
|
/**
|
|
@@ -310,4 +323,4 @@ export default class AdvisoryLockFileBackend {
|
|
|
310
323
|
}
|
|
311
324
|
}
|
|
312
325
|
}
|
|
313
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2aXNvcnktbG9jay1maWxlLWJhY2tlbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YWJhc2UvYWR2aXNvcnktbG9jay1maWxlLWJhY2tlbmQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDdEMsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDakMsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3hCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLElBQUksTUFBTSx3QkFBd0IsQ0FBQTtBQUV6Qzs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sdUJBQXVCO0lBQzFDOzs7Ozs7Ozs7T0FTRztJQUNILFlBQVksRUFBQyxTQUFTLEVBQUUsZ0JBQWdCLEdBQUcsRUFBRSxFQUFFLE9BQU8sR0FBRyxNQUFNLEVBQUUsZUFBZSxHQUFHLE1BQU0sRUFBRSxTQUFTLEdBQUcsUUFBUSxFQUFFLGNBQWMsR0FBRyxFQUFFLEVBQUM7UUFDbkksSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7UUFDMUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFBO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO1FBQ3RCLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFBO1FBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO1FBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFBO1FBQ3BDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUs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QUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2NyZWF0ZUhhc2h9IGZyb20gXCJub2RlOmNyeXB0b1wiXG5pbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHdhaXQgZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3dhaXQuanNcIlxuXG4vKipcbiAqIE93bmVyIG1ldGFkYXRhIHdyaXR0ZW4gaW5zaWRlIG9uZSBmaWxlLWxvY2sgZGlyZWN0b3J5LlxuICogQHR5cGVkZWYge29iamVjdH0gQWR2aXNvcnlMb2NrRmlsZU93bmVyXG4gKiBAcHJvcGVydHkge251bWJlcn0gcGlkIC0gUElEIG9mIHRoZSBob2xkaW5nIHByb2Nlc3MuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaG9zdG5hbWUgLSBIb3N0IG9mIHRoZSBob2xkaW5nIHByb2Nlc3MuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaG9sZGVySWQgLSBVbmlxdWUgaWQgb2YgdGhlIGFjcXVpcmluZyBiYWNrZW5kIGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjcXVpcmVkQXQgLSBJU08gdGltZXN0YW1wIG9mIGFjcXVpc2l0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxlYXNlRXhwaXJlc0F0IC0gSVNPIHRpbWVzdGFtcCB3aGVuIHRoZSBjdXJyZW50IGxlYXNlIGV4cGlyZXMgd2l0aG91dCByZW5ld2FsLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtob3N0XSAtIEV4dHJhIG93bmVyIGZpZWxkOiBIVFRQIGhvc3QgKHNlcnZlciBsb2NrIG9ubHkpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb3J0XSAtIEV4dHJhIG93bmVyIGZpZWxkOiBIVFRQIHBvcnQgKHNlcnZlciBsb2NrIG9ubHkpLlxuICovXG5cbi8qKlxuICogRGlyZWN0b3J5LWJhc2VkIGFkdmlzb3J5LWxvY2sgYmFja2VuZCBmb3IgdGhlIFNUQy0yMTAgYGZpbGVgIHRpZXJcbiAqIChgZG9jcy9hZHZpc29yeS1sb2NrLWJhY2tlbmRzLm1kYCB0aWVyIChkKSkuIFRoaXMgZ2VuZXJhbGl6ZXMgdGhlIHBhdHRlcm5cbiAqIGFscmVhZHkgdXNlZCBieSBgc3JjL2h0dHAtc2VydmVyL3NlcnZlci1sb2NrLmpzYCBhbmQgdGhlIE5vZGUgU1FMaXRlXG4gKiBkcml2ZXIncyBmaWxlc3lzdGVtIGxheWVyIGludG8gb25lIHJldXNhYmxlIGJhY2tlbmQgYmVoaW5kIHRoZSBzaGFyZWRcbiAqIGFkdmlzb3J5LWxvY2sgc2VhbTpcbiAqXG4gKiAtIEF0b21pYyBwdWJsaWNhdGlvbjogYSBsb2NrIGlzIGNsYWltZWQgYnkgYGZzLm1rZHRlbXBgICsgYGZzLnJlbmFtZWAgb250b1xuICogICB0aGUgc3RhYmxlIGxvY2sgcGF0aCwgc28gYSBsb3NpbmcgY2FuZGlkYXRlIG5ldmVyIG9ic2VydmVzIG9yIGRlbGV0ZXMgYVxuICogICBoYWxmLXdyaXR0ZW4gb3duZXIgcmVjb3JkLlxuICogLSBMZWFzZSArIHJlbmV3YWw6IGVhY2ggaG9sZCBjYXJyaWVzIGEgYGxlYXNlTXNgIGxlYXNlIHJlbmV3ZWQgb25cbiAqICAgYHJlbmV3SW50ZXJ2YWxNc2Agd2hpbGUgaGVsZCwgc28gYSBob2xkZXIgdGhhdCBkaWVzIHdpdGhvdXQgcmVsZWFzaW5nXG4gKiAgIChvciB3aG9zZSBQSUQgd2FzIHJlY3ljbGVkKSBpcyByZWNsYWltYWJsZSBvbmNlIHRoZSBsZWFzZSBleHBpcmVzLlxuICogLSBTdGFsZW5lc3M6IGEgbG9jayBkaXJlY3RvcnkgaXMgc3RhbGUgd2hlbiBpdHMgb3duZXIgbWV0YWRhdGEgaXNcbiAqICAgdW5yZWFkYWJsZSwgaXRzIGxlYXNlIGV4cGlyZWQsIG9yIGl0cyBvd25lciBpcyBhIGRlYWQgbG9jYWwgcHJvY2Vzc1xuICogICAoYGtpbGwocGlkLCAwKWAg4oaSIGBFU1JDSGApLiBDcm9zcy1ob3N0IG93bmVycyBhcmUgb25seSByZWNsYWltYWJsZSB2aWFcbiAqICAgbGVhc2UgZXhwaXJ5IGJlY2F1c2UgUElEIGxpdmVuZXNzIGNhbm5vdCBiZSBwcm9iZWQgcmVtb3RlbHkuXG4gKlxuICogVGhpcyB0aWVyIHByb3ZpZGVzIG5vIGZlbmNpbmcgdG9rZW5zIChkZXNpZ24gwqc4OiBhIGZpbGUgbG9jayBoYXMgbm9cbiAqIG1vbm90b25pYyBhdXRob3JpdHkgYSBwYXJ0aXRpb25lZCBob2xkZXIgY2FuIGJlIGNoZWNrZWQgYWdhaW5zdCksIHNvXG4gKiBhY3F1aXNpdGlvbnMgcmVwb3J0IGBmZW5jaW5nU3VwcG9ydGVkOiBmYWxzZWAgaW5zdGVhZCBvZiBwcmV0ZW5kaW5nLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBZHZpc29yeUxvY2tGaWxlQmFja2VuZCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIG9uZSBmaWxlLWxvY2sgYmFja2VuZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBCYWNrZW5kIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmRpcmVjdG9yeSAtIERpcmVjdG9yeSB0aGF0IGhvbGRzIHRoZSBsb2NrIGRpcmVjdG9yaWVzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj59IFthcmdzLmV4dHJhT3duZXJGaWVsZHNdIC0gRXh0cmEgZmllbGRzIG1lcmdlZCBpbnRvIGV2ZXJ5IG93bmVyIG1ldGFkYXRhIHJlY29yZCAoZS5nLiB0aGUgSFRUUCBzZXJ2ZXIgbG9jaydzIGhvc3QvcG9ydCkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5sZWFzZU1zXSAtIExlYXNlIGR1cmF0aW9uIGZvciBvbmUgaG9sZDsgZXhwaXJlZCBsZWFzZXMgbWFrZSBhIGxvY2sgc3RhbGUuIERlZmF1bHRzIHRvIDMwMDAwLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MucmVuZXdJbnRlcnZhbE1zXSAtIFJlbmV3YWwgY2FkZW5jZSB3aGlsZSBob2xkaW5nOyBtdXN0IHN0YXkgYmVsb3cgYGxlYXNlTXNgLiBEZWZhdWx0cyB0byAxMDAwMC5cbiAgICogQHBhcmFtIHtcImhhc2hlZFwiIHwgXCJwbGFpblwifSBbYXJncy5wYXRoU3R5bGVdIC0gYGhhc2hlZGAgZGVyaXZlcyBgPHNhZmVOYW1lPi08aGFzaD4ubG9ja2AgbmFtZXMgKGFkdmlzb3J5LWxvY2sgdGllcik7IGBwbGFpbmAgdXNlcyBgPG5hbWU+LmxvY2tgIChIVFRQIHNlcnZlciBsb2NrKS4gRGVmYXVsdHMgdG8gYGhhc2hlZGAuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5wb2xsSW50ZXJ2YWxNc10gLSBXYWl0IGJldHdlZW4gYWNxdWlzaXRpb24gcmV0cmllcy4gRGVmYXVsdHMgdG8gNTAuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7ZGlyZWN0b3J5LCBleHRyYU93bmVyRmllbGRzID0ge30sIGxlYXNlTXMgPSAzMF8wMDAsIHJlbmV3SW50ZXJ2YWxNcyA9IDEwXzAwMCwgcGF0aFN0eWxlID0gXCJoYXNoZWRcIiwgcG9sbEludGVydmFsTXMgPSA1MH0pIHtcbiAgICB0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeVxuICAgIHRoaXMuZXh0cmFPd25lckZpZWxkcyA9IGV4dHJhT3duZXJGaWVsZHNcbiAgICB0aGlzLmxlYXNlTXMgPSBsZWFzZU1zXG4gICAgdGhpcy5yZW5ld0ludGVydmFsTXMgPSByZW5ld0ludGVydmFsTXNcbiAgICB0aGlzLnBhdGhTdHlsZSA9IHBhdGhTdHlsZVxuICAgIHRoaXMucG9sbEludGVydmFsTXMgPSBwb2xsSW50ZXJ2YWxNc1xuICAgIHRoaXMuaG9sZGVySWQgPSBgJHtwcm9jZXNzLnBpZH0tJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEwKX1gXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB7dGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPn0+fSAqL1xuICAgIHRoaXMuaG9sZHNCeU5hbWUgPSBuZXcgTWFwKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgc3RhYmxlIGxvY2sgZGlyZWN0b3J5IHBhdGggZm9yIG9uZSBsb2NrIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZpbGVzeXN0ZW0gcGF0aCBmb3IgdGhlIGxvY2sgZGlyZWN0b3J5LlxuICAgKi9cbiAgbG9ja1BhdGhGb3IobmFtZSkge1xuICAgIGlmICh0aGlzLnBhdGhTdHlsZSA9PT0gXCJwbGFpblwiKSByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCBgJHtuYW1lfS5sb2NrYClcblxuICAgIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShuYW1lKS5kaWdlc3QoXCJoZXhcIikuc2xpY2UoMCwgMTYpXG4gICAgY29uc3Qgc2FmZU5hbWUgPSBuYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Ll8tXS9nLCBcIl9cIikuc2xpY2UoMCwgNjQpXG5cbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCBgJHtzYWZlTmFtZX0tJHtoYXNofS5sb2NrYClcbiAgfVxuXG4gIC8qKlxuICAgKiBCbG9ja3MgdW50aWwgdGhlIG5hbWVkIGxvY2sgaXMgYWNxdWlyZWQgb3IgYHRpbWVvdXRNc2AgZWxhcHNlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEBwYXJhbSB7e3RpbWVvdXRNcz86IG51bWJlciB8IG51bGx9fSBbYXJnc10gLSBUaW1lb3V0IGFyZ3M7IGBudWxsYCwgYHVuZGVmaW5lZGAsIG9yIG5lZ2F0aXZlIHdhaXRzIGluZGVmaW5pdGVseS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gVHJ1ZSB3aGVuIGFjcXVpcmVkLCBmYWxzZSB3aGVuIHRoZSB0aW1lb3V0IGVsYXBzZWQuXG4gICAqL1xuICBhc3luYyBhY3F1aXJlKG5hbWUsIHt0aW1lb3V0TXN9ID0ge30pIHtcbiAgICBjb25zdCBkZWFkbGluZSA9IHR5cGVvZiB0aW1lb3V0TXMgPT09IFwibnVtYmVyXCIgJiYgdGltZW91dE1zID49IDAgPyBEYXRlLm5vdygpICsgdGltZW91dE1zIDogbnVsbFxuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVEaXJlY3RvcnkoKVxuXG4gICAgLy8gSW50ZW50aW9uYWxseSBsb29waW5nIHdpdGhvdXQgYSBmaXhlZCBpdGVyYXRpb24gY2FwIOKAlCBlaXRoZXIgdGhlXG4gICAgLy8gcHVibGljYXRpb24gc3VjY2VlZHMsIHRoZSBkZWFkbGluZSBlbGFwc2VzLCBvciBhbiB1bmV4cGVjdGVkIGVycm9yIGlzXG4gICAgLy8gcmUtdGhyb3duLlxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy50cnlBY3F1aXJlKG5hbWUpKSByZXR1cm4gdHJ1ZVxuXG4gICAgICBpZiAoZGVhZGxpbmUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcmVtYWluaW5nID0gZGVhZGxpbmUgLSBEYXRlLm5vdygpXG5cbiAgICAgICAgaWYgKHJlbWFpbmluZyA8PSAwKSByZXR1cm4gZmFsc2VcblxuICAgICAgICBhd2FpdCB3YWl0KE1hdGgubWluKHRoaXMucG9sbEludGVydmFsTXMsIHJlbWFpbmluZykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB3YWl0KHRoaXMucG9sbEludGVydmFsTXMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIGFjcXVpcmUgdGhlIG5hbWVkIGxvY2sgd2l0aG91dCB3YWl0aW5nLCByZWNsYWltaW5nIGEgc3RhbGVcbiAgICogbG9jayBkaXJlY3Rvcnkgd2hlbiBvbmUgaXMgZm91bmQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBUcnVlIHdoZW4gdGhpcyBiYWNrZW5kIGJlY2FtZSB0aGUgbG9jayBvd25lci5cbiAgICovXG4gIGFzeW5jIHRyeUFjcXVpcmUobmFtZSkge1xuICAgIGlmICh0aGlzLmhvbGRzQnlOYW1lLmhhcyhuYW1lKSkgcmV0dXJuIGZhbHNlXG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZURpcmVjdG9yeSgpXG5cbiAgICBjb25zdCBsb2NrUGF0aCA9IHRoaXMubG9ja1BhdGhGb3IobmFtZSlcblxuICAgIGlmIChhd2FpdCB0aGlzLnB1Ymxpc2hMb2NrRGlyZWN0b3J5KGxvY2tQYXRoKSkgcmV0dXJuIHRoaXMuc3RhcnRIb2xkKG5hbWUpXG5cbiAgICBpZiAoYXdhaXQgdGhpcy5pc1N0YWxlKGxvY2tQYXRoKSkge1xuICAgICAgYXdhaXQgZnMucm0obG9ja1BhdGgsIHtyZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlfSlcblxuICAgICAgaWYgKGF3YWl0IHRoaXMucHVibGlzaExvY2tEaXJlY3RvcnkobG9ja1BhdGgpKSByZXR1cm4gdGhpcy5zdGFydEhvbGQobmFtZSlcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyB0aGUgbG9jayBvbmx5IHdoZW4gdGhpcyBiYWNrZW5kIGluc3RhbmNlIG93bnMgaXQsIG1pcnJvcmluZyB0aGVcbiAgICogXCJ5b3UgY2FuIG9ubHkgcmVsZWFzZSBsb2NrcyB5b3Ugb3duXCIgY29udHJhY3Qgb2YgdGhlIGRhdGFiYXNlIHRpZXJzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gVHJ1ZSB3aGVuIHRoZSBoZWxkIGxvY2sgd2FzIHJlbGVhc2VkLlxuICAgKi9cbiAgYXN5bmMgcmVsZWFzZShuYW1lKSB7XG4gICAgY29uc3QgaG9sZCA9IHRoaXMuaG9sZHNCeU5hbWUuZ2V0KG5hbWUpXG5cbiAgICBpZiAoIWhvbGQpIHJldHVybiBmYWxzZVxuXG4gICAgdGhpcy5jbGVhckhvbGQobmFtZSlcblxuICAgIGNvbnN0IG93bmVyID0gYXdhaXQgdGhpcy5yZWFkT3duZXIodGhpcy5sb2NrUGF0aEZvcihuYW1lKSlcblxuICAgIGlmICghb3duZXIgfHwgb3duZXIuaG9sZGVySWQgIT09IHRoaXMuaG9sZGVySWQpIHJldHVybiBmYWxzZVxuXG4gICAgYXdhaXQgZnMucm0odGhpcy5sb2NrUGF0aEZvcihuYW1lKSwge3JlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWV9KVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIGhlbGQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBsb2NrIGlzIGN1cnJlbnRseSBoZWxkIGJ5IGEgbGl2ZSwgdW5leHBpcmVkIG93bmVyLlxuICAgKi9cbiAgYXN5bmMgaXNIZWxkKG5hbWUpIHtcbiAgICBjb25zdCBsb2NrUGF0aCA9IHRoaXMubG9ja1BhdGhGb3IobmFtZSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5zdGF0KGxvY2tQYXRoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuICFhd2FpdCB0aGlzLmlzU3RhbGUobG9ja1BhdGgpXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGN1cnJlbnQgb3duZXIgbWV0YWRhdGEgZm9yIGRpYWdub3N0aWNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8QWR2aXNvcnlMb2NrRmlsZU93bmVyIHwgbnVsbD59IC0gUGFyc2VkIG93bmVyIG1ldGFkYXRhLCB3aGVuIGEgbG9jayBkaXJlY3RvcnkgZXhpc3RzLlxuICAgKi9cbiAgYXN5bmMgaG9sZGVySW5mbyhuYW1lKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucmVhZE93bmVyKHRoaXMubG9ja1BhdGhGb3IobmFtZSkpXG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgZXZlcnkgbG9jayB0aGlzIGJhY2tlbmQgaW5zdGFuY2UgY3VycmVudGx5IGhvbGRzIChzaHV0ZG93biBwYXRoKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgYmVzdC1lZmZvcnQgcmVsZWFzZSBvZiBhbGwgaG9sZHMuXG4gICAqL1xuICBhc3luYyByZWxlYXNlQWxsSGVsZCgpIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgWy4uLnRoaXMuaG9sZHNCeU5hbWUua2V5cygpXSkge1xuICAgICAgYXdhaXQgdGhpcy5yZWxlYXNlKG5hbWUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIHBhcmVudCBsb2NrIGRpcmVjdG9yeSBleGlzdHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHRoZSBkaXJlY3RvcnkgZXhpc3RzLlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlRGlyZWN0b3J5KCkge1xuICAgIGF3YWl0IGZzLm1rZGlyKHRoaXMuZGlyZWN0b3J5LCB7cmVjdXJzaXZlOiB0cnVlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYSBmdWxseSBpbml0aWFsaXplZCBsb2NrIGRpcmVjdG9yeSB3aXRoIG9uZSBhdG9taWMgcmVuYW1lIHNvXG4gICAqIGNvbmN1cnJlbnQgY2FuZGlkYXRlcyBjYW5ub3Qgb2JzZXJ2ZSBhIGhhbGYtd3JpdHRlbiBvd25lciByZWNvcmQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NrUGF0aCAtIFN0YWJsZSBsb2NrIGRpcmVjdG9yeSBwYXRoLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoaXMgY2FuZGlkYXRlIGJlY2FtZSB0aGUgbG9jayBvd25lci5cbiAgICovXG4gIGFzeW5jIHB1Ymxpc2hMb2NrRGlyZWN0b3J5KGxvY2tQYXRoKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlUGF0aCA9IGF3YWl0IGZzLm1rZHRlbXAoYCR7bG9ja1BhdGh9LnBlbmRpbmctYClcbiAgICBsZXQgcHVibGlzaGVkID0gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLndyaXRlT3duZXIoY2FuZGlkYXRlUGF0aClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMucmVuYW1lKGNhbmRpZGF0ZVBhdGgsIGxvY2tQYXRoKVxuICAgICAgICBwdWJsaXNoZWQgPSB0cnVlXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBjb2RlID0gLyoqIEB0eXBlIHtFcnJvciAmIHtjb2RlPzogc3RyaW5nfX0gKi8gKGVycm9yKT8uY29kZVxuXG4gICAgICAgIGlmIChjb2RlID09PSBcIkVFWElTVFwiIHx8IGNvZGUgPT09IFwiRU5PVEVNUFRZXCIpIHJldHVybiBmYWxzZVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoIXB1Ymxpc2hlZCkgYXdhaXQgZnMucm0oY2FuZGlkYXRlUGF0aCwge3JlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWV9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgbGVhc2UgcmVuZXdhbCBmb3IgYSBmcmVzaGx5IGFjcXVpcmVkIGhvbGQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7dHJ1ZX0gLSBBbHdheXMgdHJ1ZTsgdGhlIGhvbGQgaXMgbm93IHRyYWNrZWQuXG4gICAqL1xuICBzdGFydEhvbGQobmFtZSkge1xuICAgIGNvbnN0IHRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdm9pZCB0aGlzLnJlbmV3SG9sZChuYW1lKVxuICAgIH0sIHRoaXMucmVuZXdJbnRlcnZhbE1zKVxuXG4gICAgaWYgKHR5cGVvZiB0aW1lci51bnJlZiA9PT0gXCJmdW5jdGlvblwiKSB0aW1lci51bnJlZigpXG5cbiAgICB0aGlzLmhvbGRzQnlOYW1lLnNldChuYW1lLCB7dGltZXJ9KVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRlbmRzIHRoaXMgaW5zdGFuY2UncyBsZWFzZSBvbiBvbmUgaGVsZCBsb2NrOyBzdG9wcyByZW5ld2luZyB3aGVuIHRoZVxuICAgKiBkaXJlY3RvcnkgaXMgbm8gbG9uZ2VyIG91cnMgKHRoZSBsb2NrIHdhcyByZWNsYWltZWQpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgdGhlIHJlbmV3YWwgYXR0ZW1wdC5cbiAgICovXG4gIGFzeW5jIHJlbmV3SG9sZChuYW1lKSB7XG4gICAgY29uc3QgaG9sZCA9IHRoaXMuaG9sZHNCeU5hbWUuZ2V0KG5hbWUpXG5cbiAgICBpZiAoIWhvbGQpIHJldHVyblxuXG4gICAgY29uc3Qgb3duZXIgPSBhd2FpdCB0aGlzLnJlYWRPd25lcih0aGlzLmxvY2tQYXRoRm9yKG5hbWUpKVxuXG4gICAgaWYgKCFvd25lciB8fCBvd25lci5ob2xkZXJJZCAhPT0gdGhpcy5ob2xkZXJJZCkge1xuICAgICAgdGhpcy5jbGVhckhvbGQobmFtZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud3JpdGVPd25lcih0aGlzLmxvY2tQYXRoRm9yKG5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgcmVuZXdhbCB0aW1lciBmb3Igb25lIGhvbGQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGNsZWFySG9sZChuYW1lKSB7XG4gICAgY29uc3QgaG9sZCA9IHRoaXMuaG9sZHNCeU5hbWUuZ2V0KG5hbWUpXG5cbiAgICBpZiAoIWhvbGQpIHJldHVyblxuXG4gICAgY2xlYXJJbnRlcnZhbChob2xkLnRpbWVyKVxuICAgIHRoaXMuaG9sZHNCeU5hbWUuZGVsZXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIG93bmVyICsgbGVhc2UgbWV0YWRhdGEgaW50byBhIGxvY2sgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9ja0RpclBhdGggLSBMb2NrIGRpcmVjdG9yeSB0byB3cml0ZSBtZXRhZGF0YSBpbnRvLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBtZXRhZGF0YSBpcyB3cml0dGVuLlxuICAgKi9cbiAgYXN5bmMgd3JpdGVPd25lcihsb2NrRGlyUGF0aCkge1xuICAgIC8qKiBAdHlwZSB7QWR2aXNvcnlMb2NrRmlsZU93bmVyfSAqL1xuICAgIGNvbnN0IG93bmVyID0ge1xuICAgICAgYWNxdWlyZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgaG9sZGVySWQ6IHRoaXMuaG9sZGVySWQsXG4gICAgICBob3N0bmFtZTogb3MuaG9zdG5hbWUoKSxcbiAgICAgIGxlYXNlRXhwaXJlc0F0OiBuZXcgRGF0ZShEYXRlLm5vdygpICsgdGhpcy5sZWFzZU1zKS50b0lTT1N0cmluZygpLFxuICAgICAgcGlkOiBwcm9jZXNzLnBpZCxcbiAgICAgIC4uLnRoaXMuZXh0cmFPd25lckZpZWxkc1xuICAgIH1cblxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4obG9ja0RpclBhdGgsIFwib3duZXIuanNvblwiKSwgSlNPTi5zdHJpbmdpZnkob3duZXIpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIG93bmVyIG1ldGFkYXRhIGZyb20gYSBsb2NrIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2tQYXRoIC0gTG9jayBkaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMge1Byb21pc2U8QWR2aXNvcnlMb2NrRmlsZU93bmVyIHwgbnVsbD59IC0gUGFyc2VkIG93bmVyIG1ldGFkYXRhLCB3aGVuIHJlYWRhYmxlLlxuICAgKi9cbiAgYXN5bmMgcmVhZE93bmVyKGxvY2tQYXRoKSB7XG4gICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgbGV0IHJhd093bmVyXG5cbiAgICB0cnkge1xuICAgICAgcmF3T3duZXIgPSBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4obG9ja1BhdGgsIFwib3duZXIuanNvblwiKSwgXCJ1dGY4XCIpXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtBZHZpc29yeUxvY2tGaWxlT3duZXJ9ICovIChKU09OLnBhcnNlKHJhd093bmVyKSlcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgbG9jayBkaXJlY3RvcnkgaXMgc3RhbGUgd2hlbiBpdHMgbWV0YWRhdGEgaXMgdW5yZWFkYWJsZSwgaXRzIGxlYXNlIGhhc1xuICAgKiBleHBpcmVkLCBvciBpdHMgb3duZXIgaXMgYSBkZWFkIHByb2Nlc3Mgb24gdGhpcyBob3N0LiBDcm9zcy1ob3N0IG93bmVyc1xuICAgKiBhcmUgb25seSByZWNsYWltYWJsZSB2aWEgbGVhc2UgZXhwaXJ5IOKAlCBQSUQgcHJvYmluZyBpcyB1bnJlbGlhYmxlIGJleW9uZFxuICAgKiBvbmUgaG9zdCwgd2hpY2ggaXMgZXhhY3RseSB3aHkgdGhpcyB0aWVyIGlzIHRoZSBvcHQtaW4gc2luZ2xlLWhvc3QgbGFzdFxuICAgKiByZXNvcnQgKGRlc2lnbiDCpzQvwqc4KS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2tQYXRoIC0gTG9jayBkaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgbG9jayBjYW4gYmUgcmVjbGFpbWVkLlxuICAgKi9cbiAgYXN5bmMgaXNTdGFsZShsb2NrUGF0aCkge1xuICAgIGNvbnN0IG93bmVyID0gYXdhaXQgdGhpcy5yZWFkT3duZXIobG9ja1BhdGgpXG5cbiAgICBpZiAoIW93bmVyIHx8IHR5cGVvZiBvd25lci5waWQgIT09IFwibnVtYmVyXCIpIHJldHVybiB0cnVlXG5cbiAgICBpZiAob3duZXIubGVhc2VFeHBpcmVzQXQgJiYgbmV3IERhdGUob3duZXIubGVhc2VFeHBpcmVzQXQpLmdldFRpbWUoKSA8PSBEYXRlLm5vdygpKSByZXR1cm4gdHJ1ZVxuXG4gICAgaWYgKG93bmVyLmhvc3RuYW1lICYmIG93bmVyLmhvc3RuYW1lICE9PSBvcy5ob3N0bmFtZSgpKSByZXR1cm4gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICAvLyBga2lsbChwaWQsIDApYCBpcyBhIG5vLW9wIHNpZ25hbCB0aGF0IGZhaWxzIHdpdGggRVNSQ0ggd2hlbiB0aGVcbiAgICAgIC8vIHByb2Nlc3MgaXMgZ29uZTsgcGVybWlzc2lvbiBlcnJvcnMgc3RpbGwgcHJvdmUgdGhlIHByb2Nlc3MgZXhpc3RzLlxuICAgICAgcHJvY2Vzcy5raWxsKG93bmVyLnBpZCwgMClcblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge0Vycm9yICYge2NvZGU/OiBzdHJpbmd9fSAqLyAoZXJyb3IpLmNvZGUgPT09IFwiRVNSQ0hcIlxuICAgIH1cbiAgfVxufVxuIl19
|
|
326
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2aXNvcnktbG9jay1maWxlLWJhY2tlbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YWJhc2UvYWR2aXNvcnktbG9jay1maWxlLWJhY2tlbmQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDdEMsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDakMsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3hCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLElBQUksTUFBTSx3QkFBd0IsQ0FBQTtBQUV6Qzs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sdUJBQXVCO0lBQzFDOzs7Ozs7Ozs7T0FTRztJQUNILFlBQVksRUFBQyxTQUFTLEVBQUUsZ0JBQWdCLEdBQUcsRUFBRSxFQUFFLE9BQU8sR0FBRyxNQUFNLEVBQUUsZUFBZSxHQUFHLE1BQU0sRUFBRSxTQUFTLEdBQUcsUUFBUSxFQUFFLGNBQWMsR0FBRyxFQUFFLEVBQUM7UUFDbkksSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7UUFDMUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFBO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO1FBQ3RCLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFBO1FBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO1FBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFBO1FBQ3BDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUs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QUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFBO1FBRXBFLElBQUksQ0FBQztZQUNILGtFQUFrRTtZQUNsRSxxRUFBcUU7WUFDckUsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBRTFCLE9BQU8sS0FBSyxDQUFBO1FBQ2QsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLHNDQUFzQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQTtRQUN4RSxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Y3JlYXRlSGFzaH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCJcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgb3MgZnJvbSBcIm5vZGU6b3NcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgd2FpdCBmcm9tIFwiYXdhaXRlcnkvYnVpbGQvd2FpdC5qc1wiXG5cbi8qKlxuICogT3duZXIgbWV0YWRhdGEgd3JpdHRlbiBpbnNpZGUgb25lIGZpbGUtbG9jayBkaXJlY3RvcnkuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBZHZpc29yeUxvY2tGaWxlT3duZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwaWQgLSBQSUQgb2YgdGhlIGhvbGRpbmcgcHJvY2Vzcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBob3N0bmFtZSAtIEhvc3Qgb2YgdGhlIGhvbGRpbmcgcHJvY2Vzcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBob2xkZXJJZCAtIFVuaXF1ZSBpZCBvZiB0aGUgYWNxdWlyaW5nIGJhY2tlbmQgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWNxdWlyZWRBdCAtIElTTyB0aW1lc3RhbXAgb2YgYWNxdWlzaXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbGVhc2VFeHBpcmVzQXQgLSBJU08gdGltZXN0YW1wIHdoZW4gdGhlIGN1cnJlbnQgbGVhc2UgZXhwaXJlcyB3aXRob3V0IHJlbmV3YWwuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hvc3RdIC0gRXh0cmEgb3duZXIgZmllbGQ6IEhUVFAgaG9zdCAoc2VydmVyIGxvY2sgb25seSkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvcnRdIC0gRXh0cmEgb3duZXIgZmllbGQ6IEhUVFAgcG9ydCAoc2VydmVyIGxvY2sgb25seSkuXG4gKi9cblxuLyoqXG4gKiBEaXJlY3RvcnktYmFzZWQgYWR2aXNvcnktbG9jayBiYWNrZW5kIGZvciB0aGUgU1RDLTIxMCBgZmlsZWAgdGllclxuICogKGBkb2NzL2Fkdmlzb3J5LWxvY2stYmFja2VuZHMubWRgIHRpZXIgKGQpKS4gVGhpcyBnZW5lcmFsaXplcyB0aGUgcGF0dGVyblxuICogYWxyZWFkeSB1c2VkIGJ5IGBzcmMvaHR0cC1zZXJ2ZXIvc2VydmVyLWxvY2suanNgIGFuZCB0aGUgTm9kZSBTUUxpdGVcbiAqIGRyaXZlcidzIGZpbGVzeXN0ZW0gbGF5ZXIgaW50byBvbmUgcmV1c2FibGUgYmFja2VuZCBiZWhpbmQgdGhlIHNoYXJlZFxuICogYWR2aXNvcnktbG9jayBzZWFtOlxuICpcbiAqIC0gQXRvbWljIHB1YmxpY2F0aW9uOiBhIGxvY2sgaXMgY2xhaW1lZCBieSBgZnMubWtkdGVtcGAgKyBgZnMucmVuYW1lYCBvbnRvXG4gKiAgIHRoZSBzdGFibGUgbG9jayBwYXRoLCBzbyBhIGxvc2luZyBjYW5kaWRhdGUgbmV2ZXIgb2JzZXJ2ZXMgb3IgZGVsZXRlcyBhXG4gKiAgIGhhbGYtd3JpdHRlbiBvd25lciByZWNvcmQuXG4gKiAtIExlYXNlICsgcmVuZXdhbDogZWFjaCBob2xkIGNhcnJpZXMgYSBgbGVhc2VNc2AgbGVhc2UgcmVuZXdlZCBvblxuICogICBgcmVuZXdJbnRlcnZhbE1zYCB3aGlsZSBoZWxkLCBzbyBhIGhvbGRlciB0aGF0IGRpZXMgd2l0aG91dCByZWxlYXNpbmdcbiAqICAgKG9yIHdob3NlIFBJRCB3YXMgcmVjeWNsZWQpIGlzIHJlY2xhaW1hYmxlIG9uY2UgdGhlIGxlYXNlIGV4cGlyZXMuXG4gKiAtIFN0YWxlbmVzczogYSBsb2NrIGRpcmVjdG9yeSBpcyBzdGFsZSB3aGVuIGl0cyBvd25lciBtZXRhZGF0YSBpc1xuICogICB1bnJlYWRhYmxlLCBpdHMgbGVhc2UgZXhwaXJlZCwgb3IgaXRzIG93bmVyIGlzIGEgZGVhZCBsb2NhbCBwcm9jZXNzXG4gKiAgIChga2lsbChwaWQsIDApYCDihpIgYEVTUkNIYCkuIENyb3NzLWhvc3Qgb3duZXJzIGFyZSBvbmx5IHJlY2xhaW1hYmxlIHZpYVxuICogICBsZWFzZSBleHBpcnkgYmVjYXVzZSBQSUQgbGl2ZW5lc3MgY2Fubm90IGJlIHByb2JlZCByZW1vdGVseS5cbiAqXG4gKiBUaGlzIHRpZXIgcHJvdmlkZXMgbm8gZmVuY2luZyB0b2tlbnMgKGRlc2lnbiDCpzg6IGEgZmlsZSBsb2NrIGhhcyBub1xuICogbW9ub3RvbmljIGF1dGhvcml0eSBhIHBhcnRpdGlvbmVkIGhvbGRlciBjYW4gYmUgY2hlY2tlZCBhZ2FpbnN0KSwgc29cbiAqIGFjcXVpc2l0aW9ucyByZXBvcnQgYGZlbmNpbmdTdXBwb3J0ZWQ6IGZhbHNlYCBpbnN0ZWFkIG9mIHByZXRlbmRpbmcuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFkdmlzb3J5TG9ja0ZpbGVCYWNrZW5kIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgb25lIGZpbGUtbG9jayBiYWNrZW5kLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEJhY2tlbmQgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZGlyZWN0b3J5IC0gRGlyZWN0b3J5IHRoYXQgaG9sZHMgdGhlIGxvY2sgZGlyZWN0b3JpZXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPn0gW2FyZ3MuZXh0cmFPd25lckZpZWxkc10gLSBFeHRyYSBmaWVsZHMgbWVyZ2VkIGludG8gZXZlcnkgb3duZXIgbWV0YWRhdGEgcmVjb3JkIChlLmcuIHRoZSBIVFRQIHNlcnZlciBsb2NrJ3MgaG9zdC9wb3J0KS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmxlYXNlTXNdIC0gTGVhc2UgZHVyYXRpb24gZm9yIG9uZSBob2xkOyBleHBpcmVkIGxlYXNlcyBtYWtlIGEgbG9jayBzdGFsZS4gRGVmYXVsdHMgdG8gMzAwMDAuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5yZW5ld0ludGVydmFsTXNdIC0gUmVuZXdhbCBjYWRlbmNlIHdoaWxlIGhvbGRpbmc7IG11c3Qgc3RheSBiZWxvdyBgbGVhc2VNc2AuIERlZmF1bHRzIHRvIDEwMDAwLlxuICAgKiBAcGFyYW0ge1wiaGFzaGVkXCIgfCBcInBsYWluXCJ9IFthcmdzLnBhdGhTdHlsZV0gLSBgaGFzaGVkYCBkZXJpdmVzIGA8c2FmZU5hbWU+LTxoYXNoPi5sb2NrYCBuYW1lcyAoYWR2aXNvcnktbG9jayB0aWVyKTsgYHBsYWluYCB1c2VzIGA8bmFtZT4ubG9ja2AgKEhUVFAgc2VydmVyIGxvY2spLiBEZWZhdWx0cyB0byBgaGFzaGVkYC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnBvbGxJbnRlcnZhbE1zXSAtIFdhaXQgYmV0d2VlbiBhY3F1aXNpdGlvbiByZXRyaWVzLiBEZWZhdWx0cyB0byA1MC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtkaXJlY3RvcnksIGV4dHJhT3duZXJGaWVsZHMgPSB7fSwgbGVhc2VNcyA9IDMwXzAwMCwgcmVuZXdJbnRlcnZhbE1zID0gMTBfMDAwLCBwYXRoU3R5bGUgPSBcImhhc2hlZFwiLCBwb2xsSW50ZXJ2YWxNcyA9IDUwfSkge1xuICAgIHRoaXMuZGlyZWN0b3J5ID0gZGlyZWN0b3J5XG4gICAgdGhpcy5leHRyYU93bmVyRmllbGRzID0gZXh0cmFPd25lckZpZWxkc1xuICAgIHRoaXMubGVhc2VNcyA9IGxlYXNlTXNcbiAgICB0aGlzLnJlbmV3SW50ZXJ2YWxNcyA9IHJlbmV3SW50ZXJ2YWxNc1xuICAgIHRoaXMucGF0aFN0eWxlID0gcGF0aFN0eWxlXG4gICAgdGhpcy5wb2xsSW50ZXJ2YWxNcyA9IHBvbGxJbnRlcnZhbE1zXG4gICAgdGhpcy5ob2xkZXJJZCA9IGAke3Byb2Nlc3MucGlkfS0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApfWBcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHtkZXB0aDogbnVtYmVyLCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+fT59ICovXG4gICAgdGhpcy5ob2xkc0J5TmFtZSA9IG5ldyBNYXAoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzdGFibGUgbG9jayBkaXJlY3RvcnkgcGF0aCBmb3Igb25lIGxvY2sgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRmlsZXN5c3RlbSBwYXRoIGZvciB0aGUgbG9jayBkaXJlY3RvcnkuXG4gICAqL1xuICBsb2NrUGF0aEZvcihuYW1lKSB7XG4gICAgaWYgKHRoaXMucGF0aFN0eWxlID09PSBcInBsYWluXCIpIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksIGAke25hbWV9LmxvY2tgKVxuXG4gICAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKG5hbWUpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCAxNilcbiAgICBjb25zdCBzYWZlTmFtZSA9IG5hbWUucmVwbGFjZSgvW15hLXpBLVowLTkuXy1dL2csIFwiX1wiKS5zbGljZSgwLCA2NClcblxuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksIGAke3NhZmVOYW1lfS0ke2hhc2h9LmxvY2tgKVxuICB9XG5cbiAgLyoqXG4gICAqIEJsb2NrcyB1bnRpbCB0aGUgbmFtZWQgbG9jayBpcyBhY3F1aXJlZCBvciBgdGltZW91dE1zYCBlbGFwc2VzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHBhcmFtIHt7dGltZW91dE1zPzogbnVtYmVyIHwgbnVsbH19IFthcmdzXSAtIFRpbWVvdXQgYXJnczsgYG51bGxgLCBgdW5kZWZpbmVkYCwgb3IgbmVnYXRpdmUgd2FpdHMgaW5kZWZpbml0ZWx5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBUcnVlIHdoZW4gYWNxdWlyZWQsIGZhbHNlIHdoZW4gdGhlIHRpbWVvdXQgZWxhcHNlZC5cbiAgICovXG4gIGFzeW5jIGFjcXVpcmUobmFtZSwge3RpbWVvdXRNc30gPSB7fSkge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gdHlwZW9mIHRpbWVvdXRNcyA9PT0gXCJudW1iZXJcIiAmJiB0aW1lb3V0TXMgPj0gMCA/IERhdGUubm93KCkgKyB0aW1lb3V0TXMgOiBudWxsXG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZURpcmVjdG9yeSgpXG5cbiAgICAvLyBJbnRlbnRpb25hbGx5IGxvb3Bpbmcgd2l0aG91dCBhIGZpeGVkIGl0ZXJhdGlvbiBjYXAg4oCUIGVpdGhlciB0aGVcbiAgICAvLyBwdWJsaWNhdGlvbiBzdWNjZWVkcywgdGhlIGRlYWRsaW5lIGVsYXBzZXMsIG9yIGFuIHVuZXhwZWN0ZWQgZXJyb3IgaXNcbiAgICAvLyByZS10aHJvd24uXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnRyeUFjcXVpcmUobmFtZSkpIHJldHVybiB0cnVlXG5cbiAgICAgIGlmIChkZWFkbGluZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCByZW1haW5pbmcgPSBkZWFkbGluZSAtIERhdGUubm93KClcblxuICAgICAgICBpZiAocmVtYWluaW5nIDw9IDApIHJldHVybiBmYWxzZVxuXG4gICAgICAgIGF3YWl0IHdhaXQoTWF0aC5taW4odGhpcy5wb2xsSW50ZXJ2YWxNcywgcmVtYWluaW5nKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHdhaXQodGhpcy5wb2xsSW50ZXJ2YWxNcylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdHMgdG8gYWNxdWlyZSB0aGUgbmFtZWQgbG9jayB3aXRob3V0IHdhaXRpbmcsIHJlY2xhaW1pbmcgYSBzdGFsZVxuICAgKiBsb2NrIGRpcmVjdG9yeSB3aGVuIG9uZSBpcyBmb3VuZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFRydWUgd2hlbiB0aGlzIGJhY2tlbmQgYmVjYW1lIHRoZSBsb2NrIG93bmVyLlxuICAgKi9cbiAgYXN5bmMgdHJ5QWNxdWlyZShuYW1lKSB7XG4gICAgLy8gQWxyZWFkeSBoZWxkIGJ5IHRoaXMgYmFja2VuZCBpbnN0YW5jZTogYSByZS1lbnRyYW50IGFjcXVpc2l0aW9uXG4gICAgLy8gKGBNb25pdG9yYCBzZW1hbnRpY3MpIGFkZHMgYSBsZXZlbCBpbnN0ZWFkIG9mIGNvbnRlbmRpbmcgd2l0aCBpdHNlbGYuXG4gICAgLy8gUmVmdXNpbmcgaXQgbWFkZSBhIG5lc3RlZCBob2xkIHRpbWUgb3V0IG9uIHRoaXMgdGllciB3aGlsZSB0aGUgc2FtZVxuICAgIC8vIG5lc3Rpbmcgd29ya2VkIG9uIHRoZSBkYXRhYmFzZSB0aWVycy5cbiAgICBjb25zdCBleGlzdGluZ0hvbGQgPSB0aGlzLmhvbGRzQnlOYW1lLmdldChuYW1lKVxuXG4gICAgaWYgKGV4aXN0aW5nSG9sZCkge1xuICAgICAgZXhpc3RpbmdIb2xkLmRlcHRoICs9IDFcblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZURpcmVjdG9yeSgpXG5cbiAgICBjb25zdCBsb2NrUGF0aCA9IHRoaXMubG9ja1BhdGhGb3IobmFtZSlcblxuICAgIGlmIChhd2FpdCB0aGlzLnB1Ymxpc2hMb2NrRGlyZWN0b3J5KGxvY2tQYXRoKSkgcmV0dXJuIHRoaXMuc3RhcnRIb2xkKG5hbWUpXG5cbiAgICBpZiAoYXdhaXQgdGhpcy5pc1N0YWxlKGxvY2tQYXRoKSkge1xuICAgICAgYXdhaXQgZnMucm0obG9ja1BhdGgsIHtyZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlfSlcblxuICAgICAgaWYgKGF3YWl0IHRoaXMucHVibGlzaExvY2tEaXJlY3RvcnkobG9ja1BhdGgpKSByZXR1cm4gdGhpcy5zdGFydEhvbGQobmFtZSlcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyB0aGUgbG9jayBvbmx5IHdoZW4gdGhpcyBiYWNrZW5kIGluc3RhbmNlIG93bnMgaXQsIG1pcnJvcmluZyB0aGVcbiAgICogXCJ5b3UgY2FuIG9ubHkgcmVsZWFzZSBsb2NrcyB5b3Ugb3duXCIgY29udHJhY3Qgb2YgdGhlIGRhdGFiYXNlIHRpZXJzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gVHJ1ZSB3aGVuIHRoZSBoZWxkIGxvY2sgd2FzIHJlbGVhc2VkLlxuICAgKi9cbiAgYXN5bmMgcmVsZWFzZShuYW1lKSB7XG4gICAgY29uc3QgaG9sZCA9IHRoaXMuaG9sZHNCeU5hbWUuZ2V0KG5hbWUpXG5cbiAgICBpZiAoIWhvbGQpIHJldHVybiBmYWxzZVxuXG4gICAgLy8gT25lIHJlbGVhc2UgcGVyIGFjcXVpc2l0aW9uOiBhIHJlLWVudHJhbnQgaG9sZCBrZWVwcyB0aGUgbG9jayB1bnRpbCBpdHNcbiAgICAvLyBvdXRlcm1vc3QgbGV2ZWwgcmVsZWFzZXMsIGV4YWN0bHkgbGlrZSB0aGUgZGF0YWJhc2UgdGllcnMuXG4gICAgaWYgKGhvbGQuZGVwdGggPiAxKSB7XG4gICAgICBob2xkLmRlcHRoIC09IDFcblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICB0aGlzLmNsZWFySG9sZChuYW1lKVxuXG4gICAgY29uc3Qgb3duZXIgPSBhd2FpdCB0aGlzLnJlYWRPd25lcih0aGlzLmxvY2tQYXRoRm9yKG5hbWUpKVxuXG4gICAgaWYgKCFvd25lciB8fCBvd25lci5ob2xkZXJJZCAhPT0gdGhpcy5ob2xkZXJJZCkgcmV0dXJuIGZhbHNlXG5cbiAgICBhd2FpdCBmcy5ybSh0aGlzLmxvY2tQYXRoRm9yKG5hbWUpLCB7cmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZX0pXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaXMgaGVsZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgdGhlIGxvY2sgaXMgY3VycmVudGx5IGhlbGQgYnkgYSBsaXZlLCB1bmV4cGlyZWQgb3duZXIuXG4gICAqL1xuICBhc3luYyBpc0hlbGQobmFtZSkge1xuICAgIGNvbnN0IGxvY2tQYXRoID0gdGhpcy5sb2NrUGF0aEZvcihuYW1lKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLnN0YXQobG9ja1BhdGgpXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gIWF3YWl0IHRoaXMuaXNTdGFsZShsb2NrUGF0aClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgY3VycmVudCBvd25lciBtZXRhZGF0YSBmb3IgZGlhZ25vc3RpY3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBZHZpc29yeUxvY2tGaWxlT3duZXIgfCBudWxsPn0gLSBQYXJzZWQgb3duZXIgbWV0YWRhdGEsIHdoZW4gYSBsb2NrIGRpcmVjdG9yeSBleGlzdHMuXG4gICAqL1xuICBhc3luYyBob2xkZXJJbmZvKG5hbWUpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWFkT3duZXIodGhpcy5sb2NrUGF0aEZvcihuYW1lKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyBldmVyeSBsb2NrIHRoaXMgYmFja2VuZCBpbnN0YW5jZSBjdXJyZW50bHkgaG9sZHMgKHNodXRkb3duIHBhdGgpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBiZXN0LWVmZm9ydCByZWxlYXNlIG9mIGFsbCBob2xkcy5cbiAgICovXG4gIGFzeW5jIHJlbGVhc2VBbGxIZWxkKCkge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBbLi4udGhpcy5ob2xkc0J5TmFtZS5rZXlzKCldKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbGVhc2UobmFtZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGUgcGFyZW50IGxvY2sgZGlyZWN0b3J5IGV4aXN0cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgdGhlIGRpcmVjdG9yeSBleGlzdHMuXG4gICAqL1xuICBhc3luYyBlbnN1cmVEaXJlY3RvcnkoKSB7XG4gICAgYXdhaXQgZnMubWtkaXIodGhpcy5kaXJlY3RvcnksIHtyZWN1cnNpdmU6IHRydWV9KVxuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBhIGZ1bGx5IGluaXRpYWxpemVkIGxvY2sgZGlyZWN0b3J5IHdpdGggb25lIGF0b21pYyByZW5hbWUgc29cbiAgICogY29uY3VycmVudCBjYW5kaWRhdGVzIGNhbm5vdCBvYnNlcnZlIGEgaGFsZi13cml0dGVuIG93bmVyIHJlY29yZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2tQYXRoIC0gU3RhYmxlIGxvY2sgZGlyZWN0b3J5IHBhdGguXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgdGhpcyBjYW5kaWRhdGUgYmVjYW1lIHRoZSBsb2NrIG93bmVyLlxuICAgKi9cbiAgYXN5bmMgcHVibGlzaExvY2tEaXJlY3RvcnkobG9ja1BhdGgpIHtcbiAgICBjb25zdCBjYW5kaWRhdGVQYXRoID0gYXdhaXQgZnMubWtkdGVtcChgJHtsb2NrUGF0aH0ucGVuZGluZy1gKVxuICAgIGxldCBwdWJsaXNoZWQgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGVPd25lcihjYW5kaWRhdGVQYXRoKVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5yZW5hbWUoY2FuZGlkYXRlUGF0aCwgbG9ja1BhdGgpXG4gICAgICAgIHB1Ymxpc2hlZCA9IHRydWVcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSAvKiogQHR5cGUge0Vycm9yICYge2NvZGU/OiBzdHJpbmd9fSAqLyAoZXJyb3IpPy5jb2RlXG5cbiAgICAgICAgaWYgKGNvZGUgPT09IFwiRUVYSVNUXCIgfHwgY29kZSA9PT0gXCJFTk9URU1QVFlcIikgcmV0dXJuIGZhbHNlXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICghcHVibGlzaGVkKSBhd2FpdCBmcy5ybShjYW5kaWRhdGVQYXRoLCB7cmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZX0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBsZWFzZSByZW5ld2FsIGZvciBhIGZyZXNobHkgYWNxdWlyZWQgaG9sZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHt0cnVlfSAtIEFsd2F5cyB0cnVlOyB0aGUgaG9sZCBpcyBub3cgdHJhY2tlZC5cbiAgICovXG4gIHN0YXJ0SG9sZChuYW1lKSB7XG4gICAgY29uc3QgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB2b2lkIHRoaXMucmVuZXdIb2xkKG5hbWUpXG4gICAgfSwgdGhpcy5yZW5ld0ludGVydmFsTXMpXG5cbiAgICBpZiAodHlwZW9mIHRpbWVyLnVucmVmID09PSBcImZ1bmN0aW9uXCIpIHRpbWVyLnVucmVmKClcblxuICAgIHRoaXMuaG9sZHNCeU5hbWUuc2V0KG5hbWUsIHtkZXB0aDogMSwgdGltZXJ9KVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRlbmRzIHRoaXMgaW5zdGFuY2UncyBsZWFzZSBvbiBvbmUgaGVsZCBsb2NrOyBzdG9wcyByZW5ld2luZyB3aGVuIHRoZVxuICAgKiBkaXJlY3RvcnkgaXMgbm8gbG9uZ2VyIG91cnMgKHRoZSBsb2NrIHdhcyByZWNsYWltZWQpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgdGhlIHJlbmV3YWwgYXR0ZW1wdC5cbiAgICovXG4gIGFzeW5jIHJlbmV3SG9sZChuYW1lKSB7XG4gICAgY29uc3QgaG9sZCA9IHRoaXMuaG9sZHNCeU5hbWUuZ2V0KG5hbWUpXG5cbiAgICBpZiAoIWhvbGQpIHJldHVyblxuXG4gICAgY29uc3Qgb3duZXIgPSBhd2FpdCB0aGlzLnJlYWRPd25lcih0aGlzLmxvY2tQYXRoRm9yKG5hbWUpKVxuXG4gICAgaWYgKCFvd25lciB8fCBvd25lci5ob2xkZXJJZCAhPT0gdGhpcy5ob2xkZXJJZCkge1xuICAgICAgdGhpcy5jbGVhckhvbGQobmFtZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud3JpdGVPd25lcih0aGlzLmxvY2tQYXRoRm9yKG5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgcmVuZXdhbCB0aW1lciBmb3Igb25lIGhvbGQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGNsZWFySG9sZChuYW1lKSB7XG4gICAgY29uc3QgaG9sZCA9IHRoaXMuaG9sZHNCeU5hbWUuZ2V0KG5hbWUpXG5cbiAgICBpZiAoIWhvbGQpIHJldHVyblxuXG4gICAgY2xlYXJJbnRlcnZhbChob2xkLnRpbWVyKVxuICAgIHRoaXMuaG9sZHNCeU5hbWUuZGVsZXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIG93bmVyICsgbGVhc2UgbWV0YWRhdGEgaW50byBhIGxvY2sgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9ja0RpclBhdGggLSBMb2NrIGRpcmVjdG9yeSB0byB3cml0ZSBtZXRhZGF0YSBpbnRvLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBtZXRhZGF0YSBpcyB3cml0dGVuLlxuICAgKi9cbiAgYXN5bmMgd3JpdGVPd25lcihsb2NrRGlyUGF0aCkge1xuICAgIC8qKiBAdHlwZSB7QWR2aXNvcnlMb2NrRmlsZU93bmVyfSAqL1xuICAgIGNvbnN0IG93bmVyID0ge1xuICAgICAgYWNxdWlyZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgaG9sZGVySWQ6IHRoaXMuaG9sZGVySWQsXG4gICAgICBob3N0bmFtZTogb3MuaG9zdG5hbWUoKSxcbiAgICAgIGxlYXNlRXhwaXJlc0F0OiBuZXcgRGF0ZShEYXRlLm5vdygpICsgdGhpcy5sZWFzZU1zKS50b0lTT1N0cmluZygpLFxuICAgICAgcGlkOiBwcm9jZXNzLnBpZCxcbiAgICAgIC4uLnRoaXMuZXh0cmFPd25lckZpZWxkc1xuICAgIH1cblxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4obG9ja0RpclBhdGgsIFwib3duZXIuanNvblwiKSwgSlNPTi5zdHJpbmdpZnkob3duZXIpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIG93bmVyIG1ldGFkYXRhIGZyb20gYSBsb2NrIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2tQYXRoIC0gTG9jayBkaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMge1Byb21pc2U8QWR2aXNvcnlMb2NrRmlsZU93bmVyIHwgbnVsbD59IC0gUGFyc2VkIG93bmVyIG1ldGFkYXRhLCB3aGVuIHJlYWRhYmxlLlxuICAgKi9cbiAgYXN5bmMgcmVhZE93bmVyKGxvY2tQYXRoKSB7XG4gICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgbGV0IHJhd093bmVyXG5cbiAgICB0cnkge1xuICAgICAgcmF3T3duZXIgPSBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4obG9ja1BhdGgsIFwib3duZXIuanNvblwiKSwgXCJ1dGY4XCIpXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtBZHZpc29yeUxvY2tGaWxlT3duZXJ9ICovIChKU09OLnBhcnNlKHJhd093bmVyKSlcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgbG9jayBkaXJlY3RvcnkgaXMgc3RhbGUgd2hlbiBpdHMgbWV0YWRhdGEgaXMgdW5yZWFkYWJsZSwgaXRzIGxlYXNlIGhhc1xuICAgKiBleHBpcmVkLCBvciBpdHMgb3duZXIgaXMgYSBkZWFkIHByb2Nlc3Mgb24gdGhpcyBob3N0LiBDcm9zcy1ob3N0IG93bmVyc1xuICAgKiBhcmUgb25seSByZWNsYWltYWJsZSB2aWEgbGVhc2UgZXhwaXJ5IOKAlCBQSUQgcHJvYmluZyBpcyB1bnJlbGlhYmxlIGJleW9uZFxuICAgKiBvbmUgaG9zdCwgd2hpY2ggaXMgZXhhY3RseSB3aHkgdGhpcyB0aWVyIGlzIHRoZSBvcHQtaW4gc2luZ2xlLWhvc3QgbGFzdFxuICAgKiByZXNvcnQgKGRlc2lnbiDCpzQvwqc4KS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2tQYXRoIC0gTG9jayBkaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgbG9jayBjYW4gYmUgcmVjbGFpbWVkLlxuICAgKi9cbiAgYXN5bmMgaXNTdGFsZShsb2NrUGF0aCkge1xuICAgIGNvbnN0IG93bmVyID0gYXdhaXQgdGhpcy5yZWFkT3duZXIobG9ja1BhdGgpXG5cbiAgICBpZiAoIW93bmVyIHx8IHR5cGVvZiBvd25lci5waWQgIT09IFwibnVtYmVyXCIpIHJldHVybiB0cnVlXG5cbiAgICBpZiAob3duZXIubGVhc2VFeHBpcmVzQXQgJiYgbmV3IERhdGUob3duZXIubGVhc2VFeHBpcmVzQXQpLmdldFRpbWUoKSA8PSBEYXRlLm5vdygpKSByZXR1cm4gdHJ1ZVxuXG4gICAgaWYgKG93bmVyLmhvc3RuYW1lICYmIG93bmVyLmhvc3RuYW1lICE9PSBvcy5ob3N0bmFtZSgpKSByZXR1cm4gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICAvLyBga2lsbChwaWQsIDApYCBpcyBhIG5vLW9wIHNpZ25hbCB0aGF0IGZhaWxzIHdpdGggRVNSQ0ggd2hlbiB0aGVcbiAgICAgIC8vIHByb2Nlc3MgaXMgZ29uZTsgcGVybWlzc2lvbiBlcnJvcnMgc3RpbGwgcHJvdmUgdGhlIHByb2Nlc3MgZXhpc3RzLlxuICAgICAgcHJvY2Vzcy5raWxsKG93bmVyLnBpZCwgMClcblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge0Vycm9yICYge2NvZGU/OiBzdHJpbmd9fSAqLyAoZXJyb3IpLmNvZGUgPT09IFwiRVNSQ0hcIlxuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -40,6 +40,10 @@ export type LockServerAcquireResult = {
|
|
|
40
40
|
status: "acquired";
|
|
41
41
|
epoch: number;
|
|
42
42
|
leaseExpiresAt: number;
|
|
43
|
+
} | {
|
|
44
|
+
status: "already-held";
|
|
45
|
+
epoch: number;
|
|
46
|
+
leaseExpiresAt: number;
|
|
43
47
|
} | {
|
|
44
48
|
status: "busy";
|
|
45
49
|
} | {
|
|
@@ -55,7 +59,7 @@ export type LockServerAcquireResult = {
|
|
|
55
59
|
* @property {(type: string, args: {onMessage: (body: Record<string, unknown>) => void, params: Record<string, unknown>, timeoutMs: number}) => LockServerConnectionLike} openConnection - Opens the 1:1 connection.
|
|
56
60
|
* @property {() => Promise<void> | void} [close] - Closes the transport.
|
|
57
61
|
* @typedef {{epoch: number, name: string, timer: ReturnType<typeof setInterval>, leaseExpiresAt: number}} LockServerHold
|
|
58
|
-
* @typedef {{status: "acquired", epoch: number, leaseExpiresAt: number} | {status: "busy"} | {status: "timeout"}} LockServerAcquireResult
|
|
62
|
+
* @typedef {{status: "acquired", epoch: number, leaseExpiresAt: number} | {status: "already-held", epoch: number, leaseExpiresAt: number} | {status: "busy"} | {status: "timeout"}} LockServerAcquireResult
|
|
59
63
|
*/
|
|
60
64
|
/** Protocol version spoken by the centralized lock server (consens-lock v2). */
|
|
61
65
|
export declare const LOCK_SERVER_PROTOCOL_VERSION = 2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advisory-lock-lock-server-backend.d.ts","sourceRoot":"","sources":["../../../src/database/advisory-lock-lock-server-backend.js"],"names":[],"mappings":"AAQG,YAAkB,wBAAwB,GAC1C;;;;IAA0B,KAAK,EAApB,OAAO,CAAC,IAAI,CAAC,CACxB;;;;IAAoD,WAAW,EAApD,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAClD;;;;IAAwB,KAAK,AAA7B,CACA,EADW,MAAM,IAAI,CACrB;CAAA,CAAA;AAAA,YAAkB,oBAAoB,GACtC;;;;IAAgC,OAAO,EAA5B,MAAM,OAAO,CAAC,IAAI,CAAC,CAC9B;;;;IAAuK,cAAc,EAA1K,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;QAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAC,KAAK,wBAAwB,CACrK;;;;IAAwC,KAAK,AAA7C,CACA,EADW,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CACrC;CAAA,CAAA;AAAA,YAAwG,cAAc,GAA5G;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAC,CAAgB;AACtH,
|
|
1
|
+
{"version":3,"file":"advisory-lock-lock-server-backend.d.ts","sourceRoot":"","sources":["../../../src/database/advisory-lock-lock-server-backend.js"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ import { AdvisoryLockServiceUnavailableError } from "./advisory-lock-errors.js";
|
|
|
12
12
|
* @property {(type: string, args: {onMessage: (body: Record<string, unknown>) => void, params: Record<string, unknown>, timeoutMs: number}) => LockServerConnectionLike} openConnection - Opens the 1:1 connection.
|
|
13
13
|
* @property {() => Promise<void> | void} [close] - Closes the transport.
|
|
14
14
|
* @typedef {{epoch: number, name: string, timer: ReturnType<typeof setInterval>, leaseExpiresAt: number}} LockServerHold
|
|
15
|
-
* @typedef {{status: "acquired", epoch: number, leaseExpiresAt: number} | {status: "busy"} | {status: "timeout"}} LockServerAcquireResult
|
|
15
|
+
* @typedef {{status: "acquired", epoch: number, leaseExpiresAt: number} | {status: "already-held", epoch: number, leaseExpiresAt: number} | {status: "busy"} | {status: "timeout"}} LockServerAcquireResult
|
|
16
16
|
*/
|
|
17
17
|
/** Protocol version spoken by the centralized lock server (consens-lock v2). */
|
|
18
18
|
export const LOCK_SERVER_PROTOCOL_VERSION = 2;
|
|
@@ -152,6 +152,14 @@ export default class AdvisoryLockLockServerBackend {
|
|
|
152
152
|
this.startRenewal(name, result.epoch);
|
|
153
153
|
return true;
|
|
154
154
|
}
|
|
155
|
+
// `already-held` means the server says *this connection* already owns the
|
|
156
|
+
// lease: a re-entrant acquisition (`Monitor` semantics), not contention.
|
|
157
|
+
// Reporting it as "not acquired" is what turned every nested hold into a
|
|
158
|
+
// timeout once a name moved to this tier.
|
|
159
|
+
if (result.status === "already-held") {
|
|
160
|
+
this.startRenewal(name, result.epoch);
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
155
163
|
if (result.status === "busy")
|
|
156
164
|
return false;
|
|
157
165
|
return false;
|
|
@@ -165,7 +173,7 @@ export default class AdvisoryLockLockServerBackend {
|
|
|
165
173
|
await this.ensureConnected(name);
|
|
166
174
|
/** @type {LockServerAcquireResult} */
|
|
167
175
|
const result = /** @type {LockServerAcquireResult} */ (await this.request("try-acquire", { name }));
|
|
168
|
-
if (result.status !== "acquired")
|
|
176
|
+
if (result.status !== "acquired" && result.status !== "already-held")
|
|
169
177
|
return false;
|
|
170
178
|
this.startRenewal(name, result.epoch);
|
|
171
179
|
return true;
|
|
@@ -471,4 +479,4 @@ function defaultClientFactory({ url }) {
|
|
|
471
479
|
webSocketImplementation
|
|
472
480
|
})));
|
|
473
481
|
}
|
|
474
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2aXNvcnktbG9jay1sb2NrLXNlcnZlci1iYWNrZW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RhdGFiYXNlL2Fkdmlzb3J5LWxvY2stbG9jay1zZXJ2ZXItYmFja2VuZC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxTQUFTLE1BQU0sSUFBSSxDQUFBO0FBRTFCLE9BQU8sd0JBQXdCLE1BQU0sb0NBQW9DLENBQUE7QUFDekUsT0FBTyxFQUFDLG1DQUFtQyxFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFFN0U7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxnRkFBZ0Y7QUFDaEYsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxDQUFBO0FBRTdDLHFEQUFxRDtBQUNyRCxNQUFNLDJCQUEyQixHQUFHLE1BQU0sQ0FBQTtBQUUxQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sNkJBQTZCO0lBQ2hEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsWUFBWSxFQUFDLFNBQVMsR0FBRyxFQUFFLEVBQUUsYUFBYSxHQUFHLG9CQUFvQixFQUFFLGdCQUFnQixHQUFHLElBQUksRUFBRSxPQUFPLEdBQUcsTUFBTSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFDO1FBQ25KLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFBO1FBQ2QsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7UUFDMUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDbEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFBO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO1FBQ3RCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQTtRQUMxQyww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QUFDO0NBQ0Y7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsb0JBQW9CLENBQUMsRUFBQyxHQUFHLEVBQUM7SUFDakMsK0VBQStFO0lBQy9FLHFEQUFxRDtJQUNyRCxNQUFNLHVCQUF1QixHQUFHLDBDQUEwQyxDQUFDLEVBQUMsc0JBQXVCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtJQUUvRyxPQUFPLG1DQUFtQyxDQUFDLEVBQUMsc0JBQXVCLENBQUMsSUFBSSx3QkFBd0IsQ0FBQztRQUMvRixtQkFBbUIsRUFBRSxNQUFNO1FBQzNCLEdBQUc7UUFDSCx1QkFBdUI7S0FDeEIsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IFdlYlNvY2tldCBmcm9tIFwid3NcIlxuXG5pbXBvcnQgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50IGZyb20gXCIuLi9odHRwLWNsaWVudC93ZWJzb2NrZXQtY2xpZW50LmpzXCJcbmltcG9ydCB7QWR2aXNvcnlMb2NrU2VydmljZVVuYXZhaWxhYmxlRXJyb3J9IGZyb20gXCIuL2Fkdmlzb3J5LWxvY2stZXJyb3JzLmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2NrU2VydmVyQ29ubmVjdGlvbkxpa2VcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTx2b2lkPn0gcmVhZHkgLSBSZXNvbHZlcyB3aGVuIHRoZSBzZXJ2ZXIgYWNjZXB0ZWQgdGhlIDE6MSBjb25uZWN0aW9uLlxuICogQHByb3BlcnR5IHsoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWR9IHNlbmRNZXNzYWdlIC0gU2VuZHMgb25lIGNvbm5lY3Rpb24gbWVzc2FnZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gW2Nsb3NlXSAtIENsb3NlcyB0aGUgY29ubmVjdGlvbi5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IExvY2tTZXJ2ZXJDbGllbnRMaWtlXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8dm9pZD59IGNvbm5lY3QgLSBPcGVucyB0aGUgdHJhbnNwb3J0LlxuICogQHByb3BlcnR5IHsodHlwZTogc3RyaW5nLCBhcmdzOiB7b25NZXNzYWdlOiAoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHRpbWVvdXRNczogbnVtYmVyfSkgPT4gTG9ja1NlcnZlckNvbm5lY3Rpb25MaWtlfSBvcGVuQ29ubmVjdGlvbiAtIE9wZW5zIHRoZSAxOjEgY29ubmVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWR9IFtjbG9zZV0gLSBDbG9zZXMgdGhlIHRyYW5zcG9ydC5cbiAqIEB0eXBlZGVmIHt7ZXBvY2g6IG51bWJlciwgbmFtZTogc3RyaW5nLCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+LCBsZWFzZUV4cGlyZXNBdDogbnVtYmVyfX0gTG9ja1NlcnZlckhvbGRcbiAqIEB0eXBlZGVmIHt7c3RhdHVzOiBcImFjcXVpcmVkXCIsIGVwb2NoOiBudW1iZXIsIGxlYXNlRXhwaXJlc0F0OiBudW1iZXJ9IHwge3N0YXR1czogXCJidXN5XCJ9IHwge3N0YXR1czogXCJ0aW1lb3V0XCJ9fSBMb2NrU2VydmVyQWNxdWlyZVJlc3VsdFxuICovXG5cbi8qKiBQcm90b2NvbCB2ZXJzaW9uIHNwb2tlbiBieSB0aGUgY2VudHJhbGl6ZWQgbG9jayBzZXJ2ZXIgKGNvbnNlbnMtbG9jayB2MikuICovXG5leHBvcnQgY29uc3QgTE9DS19TRVJWRVJfUFJPVE9DT0xfVkVSU0lPTiA9IDJcblxuLyoqIENvbm5lY3Rpb24gcm9sZSByZWdpc3RlcmVkIG9uIHRoZSBsb2NrIHNlcnZlci4gKi9cbmNvbnN0IExPQ0tfU0VSVkVSX0NPTk5FQ1RJT05fVFlQRSA9IFwibG9ja1wiXG5cbi8qKlxuICogVGllciAoYikgYmFja2VuZDogdGhlIGNlbnRyYWxpemVkIGxvY2sgc2VydmVyIChgY29uc2Vucy1sb2NrYCwgcHJvdG9jb2wgdjIpLlxuICpcbiAqIFRoZSBzZXJ2ZXIgaG9sZHMgZXZlcnkgbG9jayBpbiBpdHMgb3duIHByb2Nlc3MgbWVtb3J5LCBzbyBhIGhlbGQgbG9jayBuZXZlclxuICogcGlucyBhIGRhdGFiYXNlIGNvbm5lY3Rpb24g4oCUIHRoYXQgaXMgdGhlIHdob2xlIHBvaW50IG9mIHRoaXMgdGllci4gT3duZXJzaGlwXG4gKiBpcyBib3VuZCB0byB0aGlzIHByb2Nlc3MncyBjb25uZWN0aW9uOiB0aGUgc2VydmVyIG1pbnRzIHRoZSBgaG9sZGVySWRgLCBzbyBhXG4gKiBjbGllbnQgY2FuIG9ubHkgcmVuZXcgb3IgcmVsZWFzZSBpdHMgb3duIGxlYXNlcywgYW5kIGEgZHJvcHBlZCBjb25uZWN0aW9uXG4gKiByZWxlYXNlcyBhbGwgb2YgdGhlbSBpbW1lZGlhdGVseS5cbiAqXG4gKiBIb2xkcyBhcmUgbGVhc2VzIHJlbmV3ZWQgZXZlcnkgdGhpcmQgb2YgdGhlIGxlYXNlIHdpbmRvdy4gQSBmZW5jZWQgbGVhc2VcbiAqICh0aGUgc2VydmVyIGdyYW50ZWQgdGhlIG5hbWUgdG8gYW5vdGhlciBob2xkZXIgYWZ0ZXIgYW4gZXhwaXJ5IG9yIHBhcnRpdGlvbilcbiAqIGlzIHJlY29yZGVkIHBlciBsb2NrIG5hbWUgYW5kIHN1cmZhY2VkIGJ5IHRoZSBydW5uZXIgYXNcbiAqIGBBZHZpc29yeUxvY2tMb3N0RXJyb3JgIGFmdGVyIHRoZSBjcml0aWNhbCBzZWN0aW9uIHNldHRsZXMuXG4gKlxuICogVW5hdmFpbGFiaWxpdHkgaXMgY2FjaGVkIGZvciBgcmVwcm9iZUNvb2xkb3duTXNgIHNvIGEgZmxhcHBpbmcgc2VydmVyIGNhbm5vdFxuICogdHVybiBldmVyeSB3YWl0aW5nIGNhbGxlciBpbnRvIGEgY29ubmVjdGlvbiBhdHRlbXB0IChkZXNpZ24gwqcyKS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWR2aXNvcnlMb2NrTG9ja1NlcnZlckJhY2tlbmQge1xuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgbG9jay1zZXJ2ZXIgYmFja2VuZC4gVGhlIHRyYW5zcG9ydCBpcyBjcmVhdGVkIG9uIGZpcnN0IHVzZSwgc29cbiAgICogY29uc3RydWN0aW5nIHRoaXMgb2JqZWN0IG5ldmVyIHBlcmZvcm1zIEkvTy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBCYWNrZW5kIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5hdXRoVG9rZW5dIC0gU2hhcmVkIHNlY3JldDsgdGhlIHNlcnZlciBmYWlscyBjbG9zZWQgd2l0aG91dCBhIG1hdGNoaW5nIHRva2VuLlxuICAgKiBAcGFyYW0geyhhcmdzOiB7YXV0aFRva2VuOiBzdHJpbmcsIHVybDogc3RyaW5nfSkgPT4gTG9ja1NlcnZlckNsaWVudExpa2V9IFthcmdzLmNsaWVudEZhY3RvcnldIC0gVHJhbnNwb3J0IGZhY3RvcnkgKHRlc3RzIGluamVjdCBhIGZha2UpLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuY29ubmVjdFRpbWVvdXRNc10gLSBIYW5kc2hha2UgdGltZW91dC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmxlYXNlTXNdIC0gTGVhc2UgZHVyYXRpb24gdXNlZCB1bnRpbCB0aGUgc2VydmVyIGFkdmVydGlzZXMgaXRzIG93bi5cbiAgICogQHBhcmFtIHsoZXJyb3I6IEVycm9yKSA9PiB2b2lkfSBbYXJncy5vbkVycm9yXSAtIEFzeW5jIGVycm9yIHJlcG9ydGVyLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MucmVwcm9iZUNvb2xkb3duTXNdIC0gSG93IGxvbmcgYW4gdW5hdmFpbGFibGUgc2VydmVyIGlzIG5vdCByZS1wcm9iZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnVybCAtIExvY2stc2VydmVyIHdlYnNvY2tldCBVUkwuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7YXV0aFRva2VuID0gXCJcIiwgY2xpZW50RmFjdG9yeSA9IGRlZmF1bHRDbGllbnRGYWN0b3J5LCBjb25uZWN0VGltZW91dE1zID0gMzAwMCwgbGVhc2VNcyA9IDMwXzAwMCwgb25FcnJvciwgcmVwcm9iZUNvb2xkb3duTXMgPSA1MDAwLCB1cmx9KSB7XG4gICAgdGhpcy51cmwgPSB1cmxcbiAgICB0aGlzLmF1dGhUb2tlbiA9IGF1dGhUb2tlblxuICAgIHRoaXMuY2xpZW50RmFjdG9yeSA9IGNsaWVudEZhY3RvcnlcbiAgICB0aGlzLmNvbm5lY3RUaW1lb3V0TXMgPSBjb25uZWN0VGltZW91dE1zXG4gICAgdGhpcy5sZWFzZU1zID0gbGVhc2VNc1xuICAgIHRoaXMub25FcnJvciA9IG9uRXJyb3JcbiAgICB0aGlzLnJlcHJvYmVDb29sZG93bk1zID0gcmVwcm9iZUNvb2xkb3duTXNcbiAgICAvKiogQHR5cGUge0xvY2tTZXJ2ZXJDbGllbnRMaWtlIHwgbnVsbH0gKi9cbiAgICB0aGlzLmNsaWVudCA9IG51bGxcbiAgICAvKiogQHR5cGUge0xvY2tTZXJ2ZXJDb25uZWN0aW9uTGlrZSB8IG51bGx9ICovXG4gICAgdGhpcy5jb25uZWN0aW9uID0gbnVsbFxuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IG51bGx9ICovXG4gICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9IG51bGxcbiAgICAvKiogQHR5cGUge3tyZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQsIHJlc29sdmU6ICgpID0+IHZvaWQsIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGx9IHwgbnVsbH0gKi9cbiAgICB0aGlzLmhlbGxvV2FpdGVyID0gbnVsbFxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywge2Vwb2NoOiBudW1iZXIsIG5hbWU6IHN0cmluZywgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiwgbGVhc2VFeHBpcmVzQXQ6IG51bWJlcn0+fSAqL1xuICAgIHRoaXMuaG9sZHMgPSBuZXcgTWFwKClcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHtjdXJyZW50RXBvY2g6IG51bWJlciB8IG51bGwsIGVwb2NoOiBudW1iZXIgfCBudWxsfT59ICovXG4gICAgdGhpcy5mZW5jZWRIb2xkcyA9IG5ldyBNYXAoKVxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywge3JlamVjdDogKGVycm9yOiBFcnJvcikgPT4gdm9pZCwgcmVzb2x2ZTogKG1lc3NhZ2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkLCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsfT59ICovXG4gICAgdGhpcy5wZW5kaW5nID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHt7bGFzdEVycm9yOiBzdHJpbmcgfCBudWxsLCBsYXN0UHJvYmVBdDogc3RyaW5nIHwgbnVsbCwgdW5hdmFpbGFibGVVbnRpbDogbnVtYmVyfX0gKi9cbiAgICB0aGlzLnN0YXR1cyA9IHtsYXN0RXJyb3I6IG51bGwsIGxhc3RQcm9iZUF0OiBudWxsLCB1bmF2YWlsYWJsZVVudGlsOiAwfVxuICAgIHRoaXMucmVxdWVzdENvdW50ZXIgPSAwXG4gICAgdGhpcy5jbG9zZWQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoZSBjb25uZWN0aW9uIGlmIG5lZWRlZCwgaG9ub3JpbmcgdGhlIHJlLXByb2JlIGNvb2xkb3duLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9ja05hbWUgLSBMb2NrIG5hbWUsIGZvciBlcnJvciBtZXNzYWdlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb25uZWN0ZWQuXG4gICAqL1xuICBhc3luYyBlbnN1cmVDb25uZWN0ZWQobG9ja05hbWUpIHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHRocm93IG5ldyBBZHZpc29yeUxvY2tTZXJ2aWNlVW5hdmFpbGFibGVFcnJvcihcIkxvY2sgc2VydmVyIGJhY2tlbmQgaXMgY2xvc2VkXCIsIHtsb2NrTmFtZSwgcmVhc29uOiBcImNsb3NlZFwifSlcbiAgICBpZiAodGhpcy5jb25uZWN0aW9uKSByZXR1cm5cbiAgICBpZiAodGhpcy5jb25uZWN0UHJvbWlzZSkgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdFByb21pc2VcblxuICAgIGlmIChEYXRlLm5vdygpIDwgdGhpcy5zdGF0dXMudW5hdmFpbGFibGVVbnRpbCkge1xuICAgICAgdGhyb3cgbmV3IEFkdmlzb3J5TG9ja1NlcnZpY2VVbmF2YWlsYWJsZUVycm9yKFxuICAgICAgICBgTG9jayBzZXJ2ZXIgJHt0aGlzLnVybH0gaXMgbWFya2VkIHVuYXZhaWxhYmxlOiAke1N0cmluZyh0aGlzLnN0YXR1cy5sYXN0RXJyb3IpfWAsXG4gICAgICAgIHtsb2NrTmFtZSwgcmVhc29uOiBcImNvb2xkb3duXCJ9XG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9IHRoaXMub3BlbkNvbm5lY3Rpb24obG9ja05hbWUpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jb25uZWN0UHJvbWlzZVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGFuZCBjb21wbGV0ZXMgdGhlIGhlbGxvIGhhbmRzaGFrZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2tOYW1lIC0gTG9jayBuYW1lLCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gdGhlIGhhbmRzaGFrZSBjb21wbGV0ZWQuXG4gICAqL1xuICBhc3luYyBvcGVuQ29ubmVjdGlvbihsb2NrTmFtZSkge1xuICAgIHRoaXMuc3RhdHVzLmxhc3RQcm9iZUF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY2xpZW50ID0gdGhpcy5jbGllbnRGYWN0b3J5KHthdXRoVG9rZW46IHRoaXMuYXV0aFRva2VuLCB1cmw6IHRoaXMudXJsfSlcblxuICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnRcbiAgICAgIGF3YWl0IGNsaWVudC5jb25uZWN0KClcblxuICAgICAgLyoqIEB0eXBlIHtQcm9taXNlPHZvaWQ+fSAqL1xuICAgICAgY29uc3QgaGVsbG9Qcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHJlamVjdChuZXcgQWR2aXNvcnlMb2NrU2VydmljZVVuYXZhaWxhYmxlRXJyb3IoXG4gICAgICAgICAgICBgTG9jayBzZXJ2ZXIgJHt0aGlzLnVybH0gZGlkIG5vdCBhbnN3ZXIgdGhlIGhhbmRzaGFrZSB3aXRoaW4gJHt0aGlzLmNvbm5lY3RUaW1lb3V0TXN9bXNgLFxuICAgICAgICAgICAge2xvY2tOYW1lLCByZWFzb246IFwiaGFuZHNoYWtlLXRpbWVvdXRcIn1cbiAgICAgICAgICApKVxuICAgICAgICB9LCB0aGlzLmNvbm5lY3RUaW1lb3V0TXMpXG5cbiAgICAgICAgdGltZXIudW5yZWY/LigpXG4gICAgICAgIHRoaXMuaGVsbG9XYWl0ZXIgPSB7cmVqZWN0LCByZXNvbHZlLCB0aW1lcn1cbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjbGllbnQub3BlbkNvbm5lY3Rpb24oTE9DS19TRVJWRVJfQ09OTkVDVElPTl9UWVBFLCB7XG4gICAgICAgIG9uTWVzc2FnZTogKGJvZHkpID0+IHRoaXMuaGFuZGxlTWVzc2FnZShib2R5KSxcbiAgICAgICAgcGFyYW1zOiB7YXV0aFRva2VuOiB0aGlzLmF1dGhUb2tlbiwgcHJvdG9jb2xWZXJzaW9uOiBMT0NLX1NFUlZFUl9QUk9UT0NPTF9WRVJTSU9OfSxcbiAgICAgICAgdGltZW91dE1zOiB0aGlzLmNvbm5lY3RUaW1lb3V0TXNcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb25cbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24ucmVhZHlcbiAgICAgIGF3YWl0IGhlbGxvUHJvbWlzZVxuXG4gICAgICB0aGlzLnN0YXR1cy5sYXN0RXJyb3IgPSBudWxsXG4gICAgICB0aGlzLnN0YXR1cy51bmF2YWlsYWJsZVVudGlsID0gMFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpXG5cbiAgICAgIHRoaXMubWFya1VuYXZhaWxhYmxlKG5vcm1hbGl6ZWQpXG4gICAgICB0aGlzLnRlYXJkb3duKClcblxuICAgICAgdGhyb3cgbmV3IEFkdmlzb3J5TG9ja1NlcnZpY2VVbmF2YWlsYWJsZUVycm9yKFxuICAgICAgICBgTG9jayBzZXJ2ZXIgJHt0aGlzLnVybH0gaXMgdW5hdmFpbGFibGU6ICR7bm9ybWFsaXplZC5tZXNzYWdlfWAsXG4gICAgICAgIHtsb2NrTmFtZSwgcmVhc29uOiBcImNvbm5lY3QtZmFpbGVkXCJ9XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciBhIGxvY2sgdGhyb3VnaCB0aGUgc2VydmVyJ3MgRklGTyBxdWV1ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEBwYXJhbSB7e3RpbWVvdXRNcz86IG51bWJlciB8IG51bGx9fSBbYXJnc10gLSBCb3VuZGVkIHdhaXQ7IHRoZSBzZXJ2ZXIgZGVmYXVsdHMgdG8gMzBzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBUcnVlIHdoZW4gdGhlIGxlYXNlIHdhcyBncmFudGVkLCBmYWxzZSBvbiB0aW1lb3V0LlxuICAgKi9cbiAgYXN5bmMgYWNxdWlyZShuYW1lLCB7dGltZW91dE1zfSA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0ZWQobmFtZSlcblxuICAgIC8qKiBAdHlwZSB7TG9ja1NlcnZlckFjcXVpcmVSZXN1bHR9ICovXG4gICAgY29uc3QgcmVzdWx0ID0gLyoqIEB0eXBlIHtMb2NrU2VydmVyQWNxdWlyZVJlc3VsdH0gKi8gKGF3YWl0IHRoaXMucmVxdWVzdChcImFjcXVpcmVcIiwge1xuICAgICAgbmFtZSxcbiAgICAgIHRpbWVvdXRNczogdHlwZW9mIHRpbWVvdXRNcyA9PT0gXCJudW1iZXJcIiAmJiB0aW1lb3V0TXMgPiAwID8gdGltZW91dE1zIDogdW5kZWZpbmVkXG4gICAgfSwgdHlwZW9mIHRpbWVvdXRNcyA9PT0gXCJudW1iZXJcIiA/IHRpbWVvdXRNcyArIHRoaXMuY29ubmVjdFRpbWVvdXRNcyA6IG51bGwpKVxuXG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiYWNxdWlyZWRcIikge1xuICAgICAgdGhpcy5zdGFydFJlbmV3YWwobmFtZSwgcmVzdWx0LmVwb2NoKVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcImJ1c3lcIikgcmV0dXJuIGZhbHNlXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBhIGxvY2sgb25seSBpZiB0aGUgc2VydmVyIGdyYW50cyBpdCBpbW1lZGlhdGVseS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFRydWUgd2hlbiBncmFudGVkLlxuICAgKi9cbiAgYXN5bmMgdHJ5QWNxdWlyZShuYW1lKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0ZWQobmFtZSlcblxuICAgIC8qKiBAdHlwZSB7TG9ja1NlcnZlckFjcXVpcmVSZXN1bHR9ICovXG4gICAgY29uc3QgcmVzdWx0ID0gLyoqIEB0eXBlIHtMb2NrU2VydmVyQWNxdWlyZVJlc3VsdH0gKi8gKGF3YWl0IHRoaXMucmVxdWVzdChcInRyeS1hY3F1aXJlXCIsIHtuYW1lfSkpXG5cbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gXCJhY3F1aXJlZFwiKSByZXR1cm4gZmFsc2VcblxuICAgIHRoaXMuc3RhcnRSZW5ld2FsKG5hbWUsIHJlc3VsdC5lcG9jaClcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgYSBoZWxkIGxlYXNlIGFuZCBzdG9wcyBpdHMgcmVuZXdhbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gcmVsZWFzZWQgKG9yIHdoZW4gdGhlIHRyYW5zcG9ydCBpcyBnb25lKS5cbiAgICovXG4gIGFzeW5jIHJlbGVhc2UobmFtZSkge1xuICAgIGNvbnN0IGhvbGQgPSB0aGlzLmhvbGRzLmdldChuYW1lKVxuXG4gICAgaWYgKCFob2xkKSByZXR1cm5cblxuICAgIHRoaXMuaG9sZHMuZGVsZXRlKG5hbWUpXG4gICAgY2xlYXJJbnRlcnZhbChob2xkLnRpbWVyKVxuXG4gICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24pIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucmVxdWVzdChcInJlbGVhc2VcIiwge2Vwb2NoOiBob2xkLmVwb2NoLCBuYW1lfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBBZHZpc29yeUxvY2tTZXJ2aWNlVW5hdmFpbGFibGVFcnJvcikpIHRocm93IGVycm9yXG4gICAgICAvLyBUaGUgc2VydmVyIHJlbGVhc2VzIGV2ZXJ5IGxlYXNlIG9mIGEgY2xvc2VkIGNvbm5lY3Rpb24sIGFuZCB0aGUgbGVhc2VcbiAgICAgIC8vIGV4cGlyZXMgb3RoZXJ3aXNlOyBib3RoIHBhdGhzIHJlY2xhaW0gdGhlIG5hbWUuXG4gICAgICB0aGlzLnJlcG9ydEVycm9yKGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyBldmVyeSBsZWFzZSB0aGlzIHByb2Nlc3MgaG9sZHMgKHNodXRkb3duIHBhdGgpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGV2ZXJ5IGxlYXNlIHdhcyByZWxlYXNlZC5cbiAgICovXG4gIGFzeW5jIHJlbGVhc2VBbGxIZWxkKCkge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBbLi4udGhpcy5ob2xkcy5rZXlzKCldKSBhd2FpdCB0aGlzLnJlbGVhc2UobmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBzZXJ2ZXIncyBsaXZlIGhvbGRlciBsaXN0IChkaWFnbm9zdGljcykuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+fSAtIExpdmUgaG9sZGVycy5cbiAgICovXG4gIGFzeW5jIGxpc3QoKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVlc3QoXCJsaXN0XCIsIHt9KVxuICAgIGNvbnN0IGhvbGRlcnMgPSByZXNwb25zZS5ob2xkZXJzXG5cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdfSAqLyAoQXJyYXkuaXNBcnJheShob2xkZXJzKSA/IGhvbGRlcnMgOiBbXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdoby1ob2xkcyBmb3Igb25lIG5hbWUgKGRpYWdub3N0aWNzKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbD59IC0gSG9sZGVyLCBvciBudWxsLlxuICAgKi9cbiAgYXN5bmMgd2hvSG9sZHMobmFtZSkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0KFwid2hvLWhvbGRzXCIsIHtuYW1lfSlcbiAgICBjb25zdCBob2xkZXIgPSByZXNwb25zZS5ob2xkZXJcblxuICAgIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbH0gKi8gKGhvbGRlciAmJiB0eXBlb2YgaG9sZGVyID09PSBcIm9iamVjdFwiID8gaG9sZGVyIDogbnVsbClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBmZW5jaW5nIGVwb2NoIGdyYW50ZWQgZm9yIG9uZSBoZWxkIGxlYXNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge251bWJlciB8IG51bGx9IC0gR3JhbnRlZCBlcG9jaCwgb3IgbnVsbCB3aGVuIHRoZSBsZWFzZSBpcyBub3QgKG9yIG5vIGxvbmdlcikgaGVsZC5cbiAgICovXG4gIGdldEhvbGRFcG9jaChuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuaG9sZHMuZ2V0KG5hbWUpPy5lcG9jaCA/PyBudWxsXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGhvbGQgd2FzIGZlbmNlZCBvciBsb3N0IGR1cmluZyBpdHMgY3JpdGljYWwgc2VjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbH0gZXBvY2ggLSBFcG9jaCB0aGUgaG9sZCB3YXMgZ3JhbnRlZC5cbiAgICogQHJldHVybnMge3tjdXJyZW50RXBvY2g6IG51bWJlciB8IG51bGwsIGVwb2NoOiBudW1iZXIgfCBudWxsfSB8IG51bGx9IC0gRmVuY2luZyBkZXRhaWxzIHdoZW4gbG9zdC5cbiAgICovXG4gIHRha2VMb3NzKG5hbWUsIGVwb2NoKSB7XG4gICAgY29uc3QgbG9zcyA9IHRoaXMuZmVuY2VkSG9sZHMuZ2V0KG5hbWUpXG5cbiAgICBpZiAobG9zcykge1xuICAgICAgdGhpcy5mZW5jZWRIb2xkcy5kZWxldGUobmFtZSlcblxuICAgICAgcmV0dXJuIGxvc3NcbiAgICB9XG5cbiAgICBjb25zdCBob2xkID0gdGhpcy5ob2xkcy5nZXQobmFtZSlcblxuICAgIGlmIChob2xkICYmIGhvbGQuZXBvY2ggIT09IGVwb2NoKSByZXR1cm4ge2N1cnJlbnRFcG9jaDogaG9sZC5lcG9jaCwgZXBvY2h9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgY29ubmVjdGlvbiBzdGF0ZSBhbmQgdGhlIG5hbWVzIGN1cnJlbnRseSBsZWFzZWQgdGhyb3VnaCB0aGlzXG4gICAqIHByb2Nlc3MsIGZvciBgZ2V0QWR2aXNvcnlMb2NrQmFja2VuZFN0YXR1cygpYC5cbiAgICogQHJldHVybnMge3tjb25uZWN0ZWQ6IGJvb2xlYW4sIGxhc3RFcnJvcjogc3RyaW5nIHwgbnVsbCwgbGFzdFByb2JlQXQ6IHN0cmluZyB8IG51bGwsIGxlYXNlZE5hbWVzOiBzdHJpbmdbXX19IC0gQmFja2VuZCBzdGF0dXMgZm9yIGRpYWdub3N0aWNzLlxuICAgKi9cbiAgZ2V0U3RhdHVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb25uZWN0ZWQ6IEJvb2xlYW4odGhpcy5jb25uZWN0aW9uKSxcbiAgICAgIGxhc3RFcnJvcjogdGhpcy5zdGF0dXMubGFzdEVycm9yLFxuICAgICAgbGFzdFByb2JlQXQ6IHRoaXMuc3RhdHVzLmxhc3RQcm9iZUF0LFxuICAgICAgbGVhc2VkTmFtZXM6IFsuLi50aGlzLmhvbGRzLmtleXMoKV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBiYWNrZW5kOiBleHBsaWNpdCByZWxlYXNlIGZpcnN0LCB0aGVuIHRoZSB0cmFuc3BvcnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY2xvc2VkLlxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgdGhpcy5jbG9zZWQgPSB0cnVlXG4gICAgYXdhaXQgdGhpcy5yZWxlYXNlQWxsSGVsZCgpXG5cbiAgICB0aGlzLnRlYXJkb3duKClcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIG9uZSBzZXJ2ZXIgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gYm9keSAtIFNlcnZlciBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGhhbmRsZU1lc3NhZ2UoYm9keSkge1xuICAgIGlmICghYm9keSB8fCB0eXBlb2YgYm9keSAhPT0gXCJvYmplY3RcIikgcmV0dXJuXG5cbiAgICBpZiAoYm9keS50eXBlID09PSBcImhlbGxvLWFja1wiKSB7XG4gICAgICBjb25zdCBhZHZlcnRpc2VkTGVhc2VNcyA9IE51bWJlcihib2R5LmxlYXNlTXMpXG5cbiAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoYWR2ZXJ0aXNlZExlYXNlTXMpICYmIGFkdmVydGlzZWRMZWFzZU1zID4gMCkgdGhpcy5sZWFzZU1zID0gYWR2ZXJ0aXNlZExlYXNlTXNcblxuICAgICAgY29uc3QgaGVsbG9XYWl0ZXIgPSB0aGlzLmhlbGxvV2FpdGVyXG5cbiAgICAgIHRoaXMuaGVsbG9XYWl0ZXIgPSBudWxsXG4gICAgICBpZiAoaGVsbG9XYWl0ZXIpIHtcbiAgICAgICAgaWYgKGhlbGxvV2FpdGVyLnRpbWVyKSBjbGVhclRpbWVvdXQoaGVsbG9XYWl0ZXIudGltZXIpXG4gICAgICAgIGhlbGxvV2FpdGVyLnJlc29sdmUoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoYm9keS50eXBlID09PSBcImxvc3RcIikge1xuICAgICAgY29uc3QgbmFtZSA9IFN0cmluZyhib2R5Lm5hbWUgPz8gXCJcIilcbiAgICAgIGNvbnN0IGhvbGQgPSB0aGlzLmhvbGRzLmdldChuYW1lKVxuXG4gICAgICBpZiAoIWhvbGQpIHJldHVyblxuXG4gICAgICB0aGlzLmhvbGRzLmRlbGV0ZShuYW1lKVxuICAgICAgY2xlYXJJbnRlcnZhbChob2xkLnRpbWVyKVxuICAgICAgdGhpcy5mZW5jZWRIb2xkcy5zZXQobmFtZSwge2N1cnJlbnRFcG9jaDogTnVtYmVyKGJvZHkuZXBvY2ggPz8gMCksIGVwb2NoOiBob2xkLmVwb2NofSlcblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGJvZHkudHlwZSAhPT0gXCJyZXNwb25zZVwiIHx8IHR5cGVvZiBib2R5LmNvcnJlbGF0aW9uSWQgIT09IFwic3RyaW5nXCIpIHJldHVyblxuXG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZy5nZXQoYm9keS5jb3JyZWxhdGlvbklkKVxuXG4gICAgaWYgKCFwZW5kaW5nKSByZXR1cm5cblxuICAgIHRoaXMucGVuZGluZy5kZWxldGUoYm9keS5jb3JyZWxhdGlvbklkKVxuICAgIGlmIChwZW5kaW5nLnRpbWVyKSBjbGVhclRpbWVvdXQocGVuZGluZy50aW1lcilcblxuICAgIGlmIChib2R5LnN0YXR1cyA9PT0gXCJlcnJvclwiKSB7XG4gICAgICBwZW5kaW5nLnJlamVjdChuZXcgRXJyb3IoU3RyaW5nKGJvZHkuZXJyb3IgfHwgXCJMb2NrIHNlcnZlciBlcnJvclwiKSkpXG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHBlbmRpbmcucmVzb2x2ZShib2R5KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIG9uZSByZXF1ZXN0IGFuZCBhd2FpdHMgaXRzIGNvcnJlbGF0ZWQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gUmVxdWVzdCB0eXBlLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBwYXlsb2FkIC0gUmVxdWVzdCBmaWVsZHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbH0gW3RpbWVvdXRNc10gLSBSZXNwb25zZSB0aW1lb3V0OyBudWxsIHdhaXRzIGZvciB0aGUgc2VydmVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj59IC0gUmVzcG9uc2UgYm9keS5cbiAgICovXG4gIGFzeW5jIHJlcXVlc3QodHlwZSwgcGF5bG9hZCwgdGltZW91dE1zID0gbnVsbCkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmNvbm5lY3Rpb25cblxuICAgIGlmICghY29ubmVjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEFkdmlzb3J5TG9ja1NlcnZpY2VVbmF2YWlsYWJsZUVycm9yKFwiTG9jayBzZXJ2ZXIgY29ubmVjdGlvbiBpcyBub3Qgb3BlblwiLCB7bG9ja05hbWU6IFN0cmluZyhwYXlsb2FkLm5hbWUgPz8gXCJcIiksIHJlYXNvbjogXCJub3QtY29ubmVjdGVkXCJ9KVxuICAgIH1cblxuICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSBgcmVxLSR7Kyt0aGlzLnJlcXVlc3RDb3VudGVyfWBcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0aW1lciA9IHR5cGVvZiB0aW1lb3V0TXMgPT09IFwibnVtYmVyXCIgJiYgdGltZW91dE1zID4gMFxuICAgICAgICA/IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucGVuZGluZy5kZWxldGUoY29ycmVsYXRpb25JZClcbiAgICAgICAgICByZWplY3QobmV3IEFkdmlzb3J5TG9ja1NlcnZpY2VVbmF2YWlsYWJsZUVycm9yKFxuICAgICAgICAgICAgYExvY2sgc2VydmVyIHJlcXVlc3QgdGltZWQgb3V0OiAke3R5cGV9ICR7U3RyaW5nKHBheWxvYWQubmFtZSA/PyBcIlwiKX1gLFxuICAgICAgICAgICAge2xvY2tOYW1lOiBTdHJpbmcocGF5bG9hZC5uYW1lID8/IFwiXCIpLCByZWFzb246IFwicmVxdWVzdC10aW1lb3V0XCJ9XG4gICAgICAgICAgKSlcbiAgICAgICAgfSwgdGltZW91dE1zKVxuICAgICAgICA6IG51bGxcblxuICAgICAgdGltZXI/LnVucmVmPy4oKVxuICAgICAgdGhpcy5wZW5kaW5nLnNldChjb3JyZWxhdGlvbklkLCB7cmVqZWN0LCByZXNvbHZlLCB0aW1lcn0pXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbm5lY3Rpb24uc2VuZE1lc3NhZ2Uoey4uLnBheWxvYWQsIGNvcnJlbGF0aW9uSWQsIHR5cGV9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nLmRlbGV0ZShjb3JyZWxhdGlvbklkKVxuICAgICAgICBpZiAodGltZXIpIGNsZWFyVGltZW91dCh0aW1lcilcbiAgICAgICAgdGhpcy5tYXJrVW5hdmFpbGFibGUoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKVxuICAgICAgICByZWplY3QobmV3IEFkdmlzb3J5TG9ja1NlcnZpY2VVbmF2YWlsYWJsZUVycm9yKFxuICAgICAgICAgIGBMb2NrIHNlcnZlciBzZW5kIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgICB7bG9ja05hbWU6IFN0cmluZyhwYXlsb2FkLm5hbWUgPz8gXCJcIiksIHJlYXNvbjogXCJzZW5kLWZhaWxlZFwifVxuICAgICAgICApKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIGxlYXNlIHJlbmV3YWwgZm9yIGEgZ3JhbnRlZCBsb2NrLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGVwb2NoIC0gR3JhbnRlZCBlcG9jaC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGFydFJlbmV3YWwobmFtZSwgZXBvY2gpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuaG9sZHMuZ2V0KG5hbWUpXG5cbiAgICBpZiAoZXhpc3RpbmcpIGNsZWFySW50ZXJ2YWwoZXhpc3RpbmcudGltZXIpXG5cbiAgICBjb25zdCBpbnRlcnZhbE1zID0gTWF0aC5tYXgoMjUwLCBNYXRoLmZsb29yKHRoaXMubGVhc2VNcyAvIDMpKVxuICAgIGNvbnN0IHRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdm9pZCB0aGlzLnJlbmV3KG5hbWUsIGVwb2NoKVxuICAgIH0sIGludGVydmFsTXMpXG5cbiAgICB0aW1lci51bnJlZj8uKClcbiAgICB0aGlzLmhvbGRzLnNldChuYW1lLCB7ZXBvY2gsIGxlYXNlRXhwaXJlc0F0OiBEYXRlLm5vdygpICsgdGhpcy5sZWFzZU1zLCBuYW1lLCB0aW1lcn0pXG4gIH1cblxuICAvKipcbiAgICogUmVuZXdzIG9uZSBsZWFzZTsgYSBmZW5jZWQgbGVhc2UgaXMgcmVjb3JkZWQgZm9yIHRoZSBydW5uZXIgdG8gc3VyZmFjZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBlcG9jaCAtIEVwb2NoIHRoZSBob2xkIGJlbGlldmVzIGl0IG93bnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHRoZSByZW5ld2FsIHJvdW5kLXRyaXAuXG4gICAqL1xuICBhc3luYyByZW5ldyhuYW1lLCBlcG9jaCkge1xuICAgIGNvbnN0IGhvbGQgPSB0aGlzLmhvbGRzLmdldChuYW1lKVxuXG4gICAgaWYgKCFob2xkIHx8ICF0aGlzLmNvbm5lY3Rpb24pIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0KFwicmVuZXdcIiwge2Vwb2NoLCBuYW1lfSwgdGhpcy5jb25uZWN0VGltZW91dE1zICogMilcbiAgICAgIGNvbnN0IHN0YXR1cyA9IFN0cmluZyhyZXNwb25zZS5zdGF0dXMpXG5cbiAgICAgIGlmIChzdGF0dXMgPT09IFwicmVuZXdlZFwiKSB7XG4gICAgICAgIGhvbGQubGVhc2VFeHBpcmVzQXQgPSBOdW1iZXIocmVzcG9uc2UubGVhc2VFeHBpcmVzQXQpXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0dXMgPT09IFwibG9zdFwiIHx8IHN0YXR1cyA9PT0gXCJub3QtZm91bmRcIikge1xuICAgICAgICB0aGlzLmhvbGRzLmRlbGV0ZShuYW1lKVxuICAgICAgICBjbGVhckludGVydmFsKGhvbGQudGltZXIpXG4gICAgICAgIHRoaXMuZmVuY2VkSG9sZHMuc2V0KG5hbWUsIHtjdXJyZW50RXBvY2g6IE51bWJlcihyZXNwb25zZS5jdXJyZW50RXBvY2ggPz8gMCksIGVwb2NofSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBBZHZpc29yeUxvY2tTZXJ2aWNlVW5hdmFpbGFibGVFcnJvcikpIHRocm93IGVycm9yXG5cbiAgICAgIC8vIEEgbGVhc2UgdGhhdCBjYW5ub3QgYmUgcmVuZXdlZCBjYW4gbm8gbG9uZ2VyIGJlIHByb3ZlbiB0byBiZSBvdXJzOiB0aGVcbiAgICAgIC8vIHNlcnZlciBtYXkgaGF2ZSBmZW5jZWQgaXQgd2hpbGUgdGhlIHRyYW5zcG9ydCB3YXMgZmFpbGluZy4gUmVjb3JkaW5nIGl0XG4gICAgICAvLyBhcyBsb3N0IGlzIHRoZSBvbmx5IGhvbmVzdCBhbnN3ZXIsIGFuZCBzdG9wcyB0aGUgcmVuZXdhbCBsb29wLlxuICAgICAgdGhpcy5tYXJrVW5hdmFpbGFibGUoZXJyb3IpXG4gICAgICB0aGlzLmhvbGRzLmRlbGV0ZShuYW1lKVxuICAgICAgY2xlYXJJbnRlcnZhbChob2xkLnRpbWVyKVxuICAgICAgdGhpcy5mZW5jZWRIb2xkcy5zZXQobmFtZSwge2N1cnJlbnRFcG9jaDogbnVsbCwgZXBvY2h9KVxuICAgICAgdGhpcy5yZXBvcnRFcnJvcihlcnJvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyB0aGF0IHRoZSBsb2NrIHNlcnZlciBpcyB1bnJlYWNoYWJsZSBhbmQgc3RhcnRzIHRoZSByZS1wcm9iZSBjb29sZG93bi5cbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBGYWlsdXJlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG1hcmtVbmF2YWlsYWJsZShlcnJvcikge1xuICAgIHRoaXMuc3RhdHVzLmxhc3RFcnJvciA9IGVycm9yLm1lc3NhZ2VcbiAgICB0aGlzLnN0YXR1cy5sYXN0UHJvYmVBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgIHRoaXMuc3RhdHVzLnVuYXZhaWxhYmxlVW50aWwgPSBEYXRlLm5vdygpICsgdGhpcy5yZXByb2JlQ29vbGRvd25Nc1xuICB9XG5cbiAgLyoqXG4gICAqIERyb3BzIHRyYW5zcG9ydCBzdGF0ZSBhbmQgbWFya3MgZXZlcnkgb3V0c3RhbmRpbmcgaG9sZCBsb3N0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHRlYXJkb3duKCkge1xuICAgIGZvciAoY29uc3QgW25hbWUsIGhvbGRdIG9mIHRoaXMuaG9sZHMpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaG9sZC50aW1lcilcbiAgICAgIHRoaXMuZmVuY2VkSG9sZHMuc2V0KG5hbWUsIHtjdXJyZW50RXBvY2g6IG51bGwsIGVwb2NoOiBob2xkLmVwb2NofSlcbiAgICB9XG5cbiAgICB0aGlzLmhvbGRzLmNsZWFyKClcblxuICAgIGZvciAoY29uc3QgcGVuZGluZyBvZiB0aGlzLnBlbmRpbmcudmFsdWVzKCkpIHtcbiAgICAgIGlmIChwZW5kaW5nLnRpbWVyKSBjbGVhclRpbWVvdXQocGVuZGluZy50aW1lcilcbiAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBBZHZpc29yeUxvY2tTZXJ2aWNlVW5hdmFpbGFibGVFcnJvcihcIkxvY2sgc2VydmVyIGNvbm5lY3Rpb24gZHJvcHBlZFwiLCB7bG9ja05hbWU6IFwiXCIsIHJlYXNvbjogXCJjb25uZWN0aW9uLWRyb3BwZWRcIn0pKVxuICAgIH1cblxuICAgIHRoaXMucGVuZGluZy5jbGVhcigpXG5cbiAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9uXG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy5jbGllbnRcblxuICAgIHRoaXMuY29ubmVjdGlvbiA9IG51bGxcbiAgICB0aGlzLmNsaWVudCA9IG51bGxcblxuICAgIHRyeSB7XG4gICAgICBjb25uZWN0aW9uPy5jbG9zZT8uKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5yZXBvcnRFcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHZvaWQgY2xpZW50Py5jbG9zZT8uKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5yZXBvcnRFcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgYSB0cmFuc3BvcnQtc2lkZSBmYWlsdXJlIHdpdGhvdXQgYnJlYWtpbmcgbG9jayBoYW5kbGluZy5cbiAgICogQHBhcmFtIHt1bmtub3dufSBlcnJvciAtIEZhaWx1cmUgdG8gcmVwb3J0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJlcG9ydEVycm9yKGVycm9yKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKVxuXG4gICAgdGhpcy5zdGF0dXMubGFzdEVycm9yID0gbm9ybWFsaXplZC5tZXNzYWdlXG5cbiAgICBpZiAodGhpcy5vbkVycm9yKSB0aGlzLm9uRXJyb3Iobm9ybWFsaXplZClcbiAgfVxufVxuXG4vKipcbiAqIERlZmF1bHQgdHJhbnNwb3J0IGZhY3Rvcnk6IHRoZSBmcmFtZXdvcmsgd2Vic29ja2V0IGNsaWVudCB3aXRoIHRoZSBOb2RlXG4gKiBgd3NgIGltcGxlbWVudGF0aW9uIGJvdW5kIGV4cGxpY2l0bHkgKG5vIGdsb2JhbCBtdXRhdGlvbikuXG4gKiBAcGFyYW0ge3thdXRoVG9rZW46IHN0cmluZywgdXJsOiBzdHJpbmd9fSBhcmdzIC0gQ29ubmVjdGlvbiBhcmdzLlxuICogQHJldHVybnMge0xvY2tTZXJ2ZXJDbGllbnRMaWtlfSAtIFdlYnNvY2tldCBjbGllbnQuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRDbGllbnRGYWN0b3J5KHt1cmx9KSB7XG4gIC8vIE5vZGUncyBnbG9iYWwgV2ViU29ja2V0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGV4aXN0LCBzbyB0aGUgaW1wbGVtZW50YXRpb24gaXNcbiAgLy8gYm91bmQgZXhwbGljaXRseSBpbnN0ZWFkIG9mIG11dGF0aW5nIGBnbG9iYWxUaGlzYC5cbiAgY29uc3Qgd2ViU29ja2V0SW1wbGVtZW50YXRpb24gPSAvKiogQHR5cGUge3R5cGVvZiBnbG9iYWxUaGlzLldlYlNvY2tldH0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKFdlYlNvY2tldCkpXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7TG9ja1NlcnZlckNsaWVudExpa2V9ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChuZXcgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50KHtcbiAgICBoZWFydGJlYXRJbnRlcnZhbE1zOiAxMF8wMDAsXG4gICAgdXJsLFxuICAgIHdlYlNvY2tldEltcGxlbWVudGF0aW9uXG4gIH0pKSlcbn1cbiJdfQ==
|
|
482
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2aXNvcnktbG9jay1sb2NrLXNlcnZlci1iYWNrZW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RhdGFiYXNlL2Fkdmlzb3J5LWxvY2stbG9jay1zZXJ2ZXItYmFja2VuZC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxTQUFTLE1BQU0sSUFBSSxDQUFBO0FBRTFCLE9BQU8sd0JBQXdCLE1BQU0sb0NBQW9DLENBQUE7QUFDekUsT0FBTyxFQUFDLG1DQUFtQyxFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFFN0U7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxnRkFBZ0Y7QUFDaEYsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxDQUFBO0FBRTdDLHFEQUFxRDtBQUNyRCxNQUFNLDJCQUEyQixHQUFHLE1BQU0sQ0FBQTtBQUUxQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sNkJBQTZCO0lBQ2hEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsWUFBWSxFQUFDLFNBQVMsR0FBRyxFQUFFLEVBQUUsYUFBYSxHQUFHLG9CQUFvQixFQUFFLGdCQUFnQixHQUFHLElBQUksRUFBRSxPQUFPLEdBQUcsTUFBTSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFDO1FBQ25KLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFBO1FBQ2QsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7UUFDMUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDbEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFBO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO1FBQ3RCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQTtRQUMxQyww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WUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFFNUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQTtRQUUxQyxJQUFJLElBQUksQ0FBQyxPQUFPO1lBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUM1QyxDQUFDO0NBQ0Y7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsb0JBQW9CLENBQUMsRUFBQyxHQUFHLEVBQUM7SUFDakMsK0VBQStFO0lBQy9FLHFEQUFxRDtJQUNyRCxNQUFNLHVCQUF1QixHQUFHLDBDQUEwQyxDQUFDLEVBQUMsc0JBQXVCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtJQUUvRyxPQUFPLG1DQUFtQyxDQUFDLEVBQUMsc0JBQXVCLENBQUMsSUFBSSx3QkFBd0IsQ0FBQztRQUMvRixtQkFBbUIsRUFBRSxNQUFNO1FBQzNCLEdBQUc7UUFDSCx1QkFBdUI7S0FDeEIsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IFdlYlNvY2tldCBmcm9tIFwid3NcIlxuXG5pbXBvcnQgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50IGZyb20gXCIuLi9odHRwLWNsaWVudC93ZWJzb2NrZXQtY2xpZW50LmpzXCJcbmltcG9ydCB7QWR2aXNvcnlMb2NrU2VydmljZVVuYXZhaWxhYmxlRXJyb3J9IGZyb20gXCIuL2Fkdmlzb3J5LWxvY2stZXJyb3JzLmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2NrU2VydmVyQ29ubmVjdGlvbkxpa2VcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTx2b2lkPn0gcmVhZHkgLSBSZXNvbHZlcyB3aGVuIHRoZSBzZXJ2ZXIgYWNjZXB0ZWQgdGhlIDE6MSBjb25uZWN0aW9uLlxuICogQHByb3BlcnR5IHsoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWR9IHNlbmRNZXNzYWdlIC0gU2VuZHMgb25lIGNvbm5lY3Rpb24gbWVzc2FnZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gW2Nsb3NlXSAtIENsb3NlcyB0aGUgY29ubmVjdGlvbi5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IExvY2tTZXJ2ZXJDbGllbnRMaWtlXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8dm9pZD59IGNvbm5lY3QgLSBPcGVucyB0aGUgdHJhbnNwb3J0LlxuICogQHByb3BlcnR5IHsodHlwZTogc3RyaW5nLCBhcmdzOiB7b25NZXNzYWdlOiAoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHRpbWVvdXRNczogbnVtYmVyfSkgPT4gTG9ja1NlcnZlckNvbm5lY3Rpb25MaWtlfSBvcGVuQ29ubmVjdGlvbiAtIE9wZW5zIHRoZSAxOjEgY29ubmVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWR9IFtjbG9zZV0gLSBDbG9zZXMgdGhlIHRyYW5zcG9ydC5cbiAqIEB0eXBlZGVmIHt7ZXBvY2g6IG51bWJlciwgbmFtZTogc3RyaW5nLCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+LCBsZWFzZUV4cGlyZXNBdDogbnVtYmVyfX0gTG9ja1NlcnZlckhvbGRcbiAqIEB0eXBlZGVmIHt7c3RhdHVzOiBcImFjcXVpcmVkXCIsIGVwb2NoOiBudW1iZXIsIGxlYXNlRXhwaXJlc0F0OiBudW1iZXJ9IHwge3N0YXR1czogXCJhbHJlYWR5LWhlbGRcIiwgZXBvY2g6IG51bWJlciwgbGVhc2VFeHBpcmVzQXQ6IG51bWJlcn0gfCB7c3RhdHVzOiBcImJ1c3lcIn0gfCB7c3RhdHVzOiBcInRpbWVvdXRcIn19IExvY2tTZXJ2ZXJBY3F1aXJlUmVzdWx0XG4gKi9cblxuLyoqIFByb3RvY29sIHZlcnNpb24gc3Bva2VuIGJ5IHRoZSBjZW50cmFsaXplZCBsb2NrIHNlcnZlciAoY29uc2Vucy1sb2NrIHYyKS4gKi9cbmV4cG9ydCBjb25zdCBMT0NLX1NFUlZFUl9QUk9UT0NPTF9WRVJTSU9OID0gMlxuXG4vKiogQ29ubmVjdGlvbiByb2xlIHJlZ2lzdGVyZWQgb24gdGhlIGxvY2sgc2VydmVyLiAqL1xuY29uc3QgTE9DS19TRVJWRVJfQ09OTkVDVElPTl9UWVBFID0gXCJsb2NrXCJcblxuLyoqXG4gKiBUaWVyIChiKSBiYWNrZW5kOiB0aGUgY2VudHJhbGl6ZWQgbG9jayBzZXJ2ZXIgKGBjb25zZW5zLWxvY2tgLCBwcm90b2NvbCB2MikuXG4gKlxuICogVGhlIHNlcnZlciBob2xkcyBldmVyeSBsb2NrIGluIGl0cyBvd24gcHJvY2VzcyBtZW1vcnksIHNvIGEgaGVsZCBsb2NrIG5ldmVyXG4gKiBwaW5zIGEgZGF0YWJhc2UgY29ubmVjdGlvbiDigJQgdGhhdCBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyB0aWVyLiBPd25lcnNoaXBcbiAqIGlzIGJvdW5kIHRvIHRoaXMgcHJvY2VzcydzIGNvbm5lY3Rpb246IHRoZSBzZXJ2ZXIgbWludHMgdGhlIGBob2xkZXJJZGAsIHNvIGFcbiAqIGNsaWVudCBjYW4gb25seSByZW5ldyBvciByZWxlYXNlIGl0cyBvd24gbGVhc2VzLCBhbmQgYSBkcm9wcGVkIGNvbm5lY3Rpb25cbiAqIHJlbGVhc2VzIGFsbCBvZiB0aGVtIGltbWVkaWF0ZWx5LlxuICpcbiAqIEhvbGRzIGFyZSBsZWFzZXMgcmVuZXdlZCBldmVyeSB0aGlyZCBvZiB0aGUgbGVhc2Ugd2luZG93LiBBIGZlbmNlZCBsZWFzZVxuICogKHRoZSBzZXJ2ZXIgZ3JhbnRlZCB0aGUgbmFtZSB0byBhbm90aGVyIGhvbGRlciBhZnRlciBhbiBleHBpcnkgb3IgcGFydGl0aW9uKVxuICogaXMgcmVjb3JkZWQgcGVyIGxvY2sgbmFtZSBhbmQgc3VyZmFjZWQgYnkgdGhlIHJ1bm5lciBhc1xuICogYEFkdmlzb3J5TG9ja0xvc3RFcnJvcmAgYWZ0ZXIgdGhlIGNyaXRpY2FsIHNlY3Rpb24gc2V0dGxlcy5cbiAqXG4gKiBVbmF2YWlsYWJpbGl0eSBpcyBjYWNoZWQgZm9yIGByZXByb2JlQ29vbGRvd25Nc2Agc28gYSBmbGFwcGluZyBzZXJ2ZXIgY2Fubm90XG4gKiB0dXJuIGV2ZXJ5IHdhaXRpbmcgY2FsbGVyIGludG8gYSBjb25uZWN0aW9uIGF0dGVtcHQgKGRlc2lnbiDCpzIpLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBZHZpc29yeUxvY2tMb2NrU2VydmVyQmFja2VuZCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBsb2NrLXNlcnZlciBiYWNrZW5kLiBUaGUgdHJhbnNwb3J0IGlzIGNyZWF0ZWQgb24gZmlyc3QgdXNlLCBzb1xuICAgKiBjb25zdHJ1Y3RpbmcgdGhpcyBvYmplY3QgbmV2ZXIgcGVyZm9ybXMgSS9PLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEJhY2tlbmQgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmF1dGhUb2tlbl0gLSBTaGFyZWQgc2VjcmV0OyB0aGUgc2VydmVyIGZhaWxzIGNsb3NlZCB3aXRob3V0IGEgbWF0Y2hpbmcgdG9rZW4uXG4gICAqIEBwYXJhbSB7KGFyZ3M6IHthdXRoVG9rZW46IHN0cmluZywgdXJsOiBzdHJpbmd9KSA9PiBMb2NrU2VydmVyQ2xpZW50TGlrZX0gW2FyZ3MuY2xpZW50RmFjdG9yeV0gLSBUcmFuc3BvcnQgZmFjdG9yeSAodGVzdHMgaW5qZWN0IGEgZmFrZSkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5jb25uZWN0VGltZW91dE1zXSAtIEhhbmRzaGFrZSB0aW1lb3V0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MubGVhc2VNc10gLSBMZWFzZSBkdXJhdGlvbiB1c2VkIHVudGlsIHRoZSBzZXJ2ZXIgYWR2ZXJ0aXNlcyBpdHMgb3duLlxuICAgKiBAcGFyYW0geyhlcnJvcjogRXJyb3IpID0+IHZvaWR9IFthcmdzLm9uRXJyb3JdIC0gQXN5bmMgZXJyb3IgcmVwb3J0ZXIuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5yZXByb2JlQ29vbGRvd25Nc10gLSBIb3cgbG9uZyBhbiB1bmF2YWlsYWJsZSBzZXJ2ZXIgaXMgbm90IHJlLXByb2JlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudXJsIC0gTG9jay1zZXJ2ZXIgd2Vic29ja2V0IFVSTC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHthdXRoVG9rZW4gPSBcIlwiLCBjbGllbnRGYWN0b3J5ID0gZGVmYXVsdENsaWVudEZhY3RvcnksIGNvbm5lY3RUaW1lb3V0TXMgPSAzMDAwLCBsZWFzZU1zID0gMzBfMDAwLCBvbkVycm9yLCByZXByb2JlQ29vbGRvd25NcyA9IDUwMDAsIHVybH0pIHtcbiAgICB0aGlzLnVybCA9IHVybFxuICAgIHRoaXMuYXV0aFRva2VuID0gYXV0aFRva2VuXG4gICAgdGhpcy5jbGllbnRGYWN0b3J5ID0gY2xpZW50RmFjdG9yeVxuICAgIHRoaXMuY29ubmVjdFRpbWVvdXRNcyA9IGNvbm5lY3RUaW1lb3V0TXNcbiAgICB0aGlzLmxlYXNlTXMgPSBsZWFzZU1zXG4gICAgdGhpcy5vbkVycm9yID0gb25FcnJvclxuICAgIHRoaXMucmVwcm9iZUNvb2xkb3duTXMgPSByZXByb2JlQ29vbGRvd25Nc1xuICAgIC8qKiBAdHlwZSB7TG9ja1NlcnZlckNsaWVudExpa2UgfCBudWxsfSAqL1xuICAgIHRoaXMuY2xpZW50ID0gbnVsbFxuICAgIC8qKiBAdHlwZSB7TG9ja1NlcnZlckNvbm5lY3Rpb25MaWtlIHwgbnVsbH0gKi9cbiAgICB0aGlzLmNvbm5lY3Rpb24gPSBudWxsXG4gICAgLyoqIEB0eXBlIHtQcm9taXNlPHZvaWQ+IHwgbnVsbH0gKi9cbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gbnVsbFxuICAgIC8qKiBAdHlwZSB7e3JlamVjdDogKGVycm9yOiBFcnJvcikgPT4gdm9pZCwgcmVzb2x2ZTogKCkgPT4gdm9pZCwgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbH0gfCBudWxsfSAqL1xuICAgIHRoaXMuaGVsbG9XYWl0ZXIgPSBudWxsXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB7ZXBvY2g6IG51bWJlciwgbmFtZTogc3RyaW5nLCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+LCBsZWFzZUV4cGlyZXNBdDogbnVtYmVyfT59ICovXG4gICAgdGhpcy5ob2xkcyA9IG5ldyBNYXAoKVxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywge2N1cnJlbnRFcG9jaDogbnVtYmVyIHwgbnVsbCwgZXBvY2g6IG51bWJlciB8IG51bGx9Pn0gKi9cbiAgICB0aGlzLmZlbmNlZEhvbGRzID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB7cmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkLCByZXNvbHZlOiAobWVzc2FnZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQsIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGx9Pn0gKi9cbiAgICB0aGlzLnBlbmRpbmcgPSBuZXcgTWFwKClcbiAgICAvKiogQHR5cGUge3tsYXN0RXJyb3I6IHN0cmluZyB8IG51bGwsIGxhc3RQcm9iZUF0OiBzdHJpbmcgfCBudWxsLCB1bmF2YWlsYWJsZVVudGlsOiBudW1iZXJ9fSAqL1xuICAgIHRoaXMuc3RhdHVzID0ge2xhc3RFcnJvcjogbnVsbCwgbGFzdFByb2JlQXQ6IG51bGwsIHVuYXZhaWxhYmxlVW50aWw6IDB9XG4gICAgdGhpcy5yZXF1ZXN0Q291bnRlciA9IDBcbiAgICB0aGlzLmNsb3NlZCA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgdGhlIGNvbm5lY3Rpb24gaWYgbmVlZGVkLCBob25vcmluZyB0aGUgcmUtcHJvYmUgY29vbGRvd24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NrTmFtZSAtIExvY2sgbmFtZSwgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbm5lY3RlZC5cbiAgICovXG4gIGFzeW5jIGVuc3VyZUNvbm5lY3RlZChsb2NrTmFtZSkge1xuICAgIGlmICh0aGlzLmNsb3NlZCkgdGhyb3cgbmV3IEFkdmlzb3J5TG9ja1NlcnZpY2VVbmF2YWlsYWJsZUVycm9yKFwiTG9jayBzZXJ2ZXIgYmFja2VuZCBpcyBjbG9zZWRcIiwge2xvY2tOYW1lLCByZWFzb246IFwiY2xvc2VkXCJ9KVxuICAgIGlmICh0aGlzLmNvbm5lY3Rpb24pIHJldHVyblxuICAgIGlmICh0aGlzLmNvbm5lY3RQcm9taXNlKSByZXR1cm4gYXdhaXQgdGhpcy5jb25uZWN0UHJvbWlzZVxuXG4gICAgaWYgKERhdGUubm93KCkgPCB0aGlzLnN0YXR1cy51bmF2YWlsYWJsZVVudGlsKSB7XG4gICAgICB0aHJvdyBuZXcgQWR2aXNvcnlMb2NrU2VydmljZVVuYXZhaWxhYmxlRXJyb3IoXG4gICAgICAgIGBMb2NrIHNlcnZlciAke3RoaXMudXJsfSBpcyBtYXJrZWQgdW5hdmFpbGFibGU6ICR7U3RyaW5nKHRoaXMuc3RhdHVzLmxhc3RFcnJvcil9YCxcbiAgICAgICAge2xvY2tOYW1lLCByZWFzb246IFwiY29vbGRvd25cIn1cbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gdGhpcy5vcGVuQ29ubmVjdGlvbihsb2NrTmFtZSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3RQcm9taXNlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgYW5kIGNvbXBsZXRlcyB0aGUgaGVsbG8gaGFuZHNoYWtlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9ja05hbWUgLSBMb2NrIG5hbWUsIGZvciBlcnJvciBtZXNzYWdlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgaGFuZHNoYWtlIGNvbXBsZXRlZC5cbiAgICovXG4gIGFzeW5jIG9wZW5Db25uZWN0aW9uKGxvY2tOYW1lKSB7XG4gICAgdGhpcy5zdGF0dXMubGFzdFByb2JlQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNsaWVudEZhY3Rvcnkoe2F1dGhUb2tlbjogdGhpcy5hdXRoVG9rZW4sIHVybDogdGhpcy51cmx9KVxuXG4gICAgICB0aGlzLmNsaWVudCA9IGNsaWVudFxuICAgICAgYXdhaXQgY2xpZW50LmNvbm5lY3QoKVxuXG4gICAgICAvKiogQHR5cGUge1Byb21pc2U8dm9pZD59ICovXG4gICAgICBjb25zdCBoZWxsb1Byb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBBZHZpc29yeUxvY2tTZXJ2aWNlVW5hdmFpbGFibGVFcnJvcihcbiAgICAgICAgICAgIGBMb2NrIHNlcnZlciAke3RoaXMudXJsfSBkaWQgbm90IGFuc3dlciB0aGUgaGFuZHNoYWtlIHdpdGhpbiAke3RoaXMuY29ubmVjdFRpbWVvdXRNc31tc2AsXG4gICAgICAgICAgICB7bG9ja05hbWUsIHJlYXNvbjogXCJoYW5kc2hha2UtdGltZW91dFwifVxuICAgICAgICAgICkpXG4gICAgICAgIH0sIHRoaXMuY29ubmVjdFRpbWVvdXRNcylcblxuICAgICAgICB0aW1lci51bnJlZj8uKClcbiAgICAgICAgdGhpcy5oZWxsb1dhaXRlciA9IHtyZWplY3QsIHJlc29sdmUsIHRpbWVyfVxuICAgICAgfSlcblxuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGNsaWVudC5vcGVuQ29ubmVjdGlvbihMT0NLX1NFUlZFUl9DT05ORUNUSU9OX1RZUEUsIHtcbiAgICAgICAgb25NZXNzYWdlOiAoYm9keSkgPT4gdGhpcy5oYW5kbGVNZXNzYWdlKGJvZHkpLFxuICAgICAgICBwYXJhbXM6IHthdXRoVG9rZW46IHRoaXMuYXV0aFRva2VuLCBwcm90b2NvbFZlcnNpb246IExPQ0tfU0VSVkVSX1BST1RPQ09MX1ZFUlNJT059LFxuICAgICAgICB0aW1lb3V0TXM6IHRoaXMuY29ubmVjdFRpbWVvdXRNc1xuICAgICAgfSlcblxuICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvblxuICAgICAgYXdhaXQgY29ubmVjdGlvbi5yZWFkeVxuICAgICAgYXdhaXQgaGVsbG9Qcm9taXNlXG5cbiAgICAgIHRoaXMuc3RhdHVzLmxhc3RFcnJvciA9IG51bGxcbiAgICAgIHRoaXMuc3RhdHVzLnVuYXZhaWxhYmxlVW50aWwgPSAwXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSlcblxuICAgICAgdGhpcy5tYXJrVW5hdmFpbGFibGUobm9ybWFsaXplZClcbiAgICAgIHRoaXMudGVhcmRvd24oKVxuXG4gICAgICB0aHJvdyBuZXcgQWR2aXNvcnlMb2NrU2VydmljZVVuYXZhaWxhYmxlRXJyb3IoXG4gICAgICAgIGBMb2NrIHNlcnZlciAke3RoaXMudXJsfSBpcyB1bmF2YWlsYWJsZTogJHtub3JtYWxpemVkLm1lc3NhZ2V9YCxcbiAgICAgICAge2xvY2tOYW1lLCByZWFzb246IFwiY29ubmVjdC1mYWlsZWRcIn1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIGEgbG9jayB0aHJvdWdoIHRoZSBzZXJ2ZXIncyBGSUZPIHF1ZXVlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHBhcmFtIHt7dGltZW91dE1zPzogbnVtYmVyIHwgbnVsbH19IFthcmdzXSAtIEJvdW5kZWQgd2FpdDsgdGhlIHNlcnZlciBkZWZhdWx0cyB0byAzMHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFRydWUgd2hlbiB0aGUgbGVhc2Ugd2FzIGdyYW50ZWQsIGZhbHNlIG9uIHRpbWVvdXQuXG4gICAqL1xuICBhc3luYyBhY3F1aXJlKG5hbWUsIHt0aW1lb3V0TXN9ID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUNvbm5lY3RlZChuYW1lKVxuXG4gICAgLyoqIEB0eXBlIHtMb2NrU2VydmVyQWNxdWlyZVJlc3VsdH0gKi9cbiAgICBjb25zdCByZXN1bHQgPSAvKiogQHR5cGUge0xvY2tTZXJ2ZXJBY3F1aXJlUmVzdWx0fSAqLyAoYXdhaXQgdGhpcy5yZXF1ZXN0KFwiYWNxdWlyZVwiLCB7XG4gICAgICBuYW1lLFxuICAgICAgdGltZW91dE1zOiB0eXBlb2YgdGltZW91dE1zID09PSBcIm51bWJlclwiICYmIHRpbWVvdXRNcyA+IDAgPyB0aW1lb3V0TXMgOiB1bmRlZmluZWRcbiAgICB9LCB0eXBlb2YgdGltZW91dE1zID09PSBcIm51bWJlclwiID8gdGltZW91dE1zICsgdGhpcy5jb25uZWN0VGltZW91dE1zIDogbnVsbCkpXG5cbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJhY3F1aXJlZFwiKSB7XG4gICAgICB0aGlzLnN0YXJ0UmVuZXdhbChuYW1lLCByZXN1bHQuZXBvY2gpXG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy8gYGFscmVhZHktaGVsZGAgbWVhbnMgdGhlIHNlcnZlciBzYXlzICp0aGlzIGNvbm5lY3Rpb24qIGFscmVhZHkgb3ducyB0aGVcbiAgICAvLyBsZWFzZTogYSByZS1lbnRyYW50IGFjcXVpc2l0aW9uIChgTW9uaXRvcmAgc2VtYW50aWNzKSwgbm90IGNvbnRlbnRpb24uXG4gICAgLy8gUmVwb3J0aW5nIGl0IGFzIFwibm90IGFjcXVpcmVkXCIgaXMgd2hhdCB0dXJuZWQgZXZlcnkgbmVzdGVkIGhvbGQgaW50byBhXG4gICAgLy8gdGltZW91dCBvbmNlIGEgbmFtZSBtb3ZlZCB0byB0aGlzIHRpZXIuXG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiYWxyZWFkeS1oZWxkXCIpIHtcbiAgICAgIHRoaXMuc3RhcnRSZW5ld2FsKG5hbWUsIHJlc3VsdC5lcG9jaClcblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJidXN5XCIpIHJldHVybiBmYWxzZVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYSBsb2NrIG9ubHkgaWYgdGhlIHNlcnZlciBncmFudHMgaXQgaW1tZWRpYXRlbHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBUcnVlIHdoZW4gZ3JhbnRlZC5cbiAgICovXG4gIGFzeW5jIHRyeUFjcXVpcmUobmFtZSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlQ29ubmVjdGVkKG5hbWUpXG5cbiAgICAvKiogQHR5cGUge0xvY2tTZXJ2ZXJBY3F1aXJlUmVzdWx0fSAqL1xuICAgIGNvbnN0IHJlc3VsdCA9IC8qKiBAdHlwZSB7TG9ja1NlcnZlckFjcXVpcmVSZXN1bHR9ICovIChhd2FpdCB0aGlzLnJlcXVlc3QoXCJ0cnktYWNxdWlyZVwiLCB7bmFtZX0pKVxuXG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IFwiYWNxdWlyZWRcIiAmJiByZXN1bHQuc3RhdHVzICE9PSBcImFscmVhZHktaGVsZFwiKSByZXR1cm4gZmFsc2VcblxuICAgIHRoaXMuc3RhcnRSZW5ld2FsKG5hbWUsIHJlc3VsdC5lcG9jaClcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgYSBoZWxkIGxlYXNlIGFuZCBzdG9wcyBpdHMgcmVuZXdhbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gcmVsZWFzZWQgKG9yIHdoZW4gdGhlIHRyYW5zcG9ydCBpcyBnb25lKS5cbiAgICovXG4gIGFzeW5jIHJlbGVhc2UobmFtZSkge1xuICAgIGNvbnN0IGhvbGQgPSB0aGlzLmhvbGRzLmdldChuYW1lKVxuXG4gICAgaWYgKCFob2xkKSByZXR1cm5cblxuICAgIHRoaXMuaG9sZHMuZGVsZXRlKG5hbWUpXG4gICAgY2xlYXJJbnRlcnZhbChob2xkLnRpbWVyKVxuXG4gICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24pIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucmVxdWVzdChcInJlbGVhc2VcIiwge2Vwb2NoOiBob2xkLmVwb2NoLCBuYW1lfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBBZHZpc29yeUxvY2tTZXJ2aWNlVW5hdmFpbGFibGVFcnJvcikpIHRocm93IGVycm9yXG4gICAgICAvLyBUaGUgc2VydmVyIHJlbGVhc2VzIGV2ZXJ5IGxlYXNlIG9mIGEgY2xvc2VkIGNvbm5lY3Rpb24sIGFuZCB0aGUgbGVhc2VcbiAgICAgIC8vIGV4cGlyZXMgb3RoZXJ3aXNlOyBib3RoIHBhdGhzIHJlY2xhaW0gdGhlIG5hbWUuXG4gICAgICB0aGlzLnJlcG9ydEVycm9yKGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyBldmVyeSBsZWFzZSB0aGlzIHByb2Nlc3MgaG9sZHMgKHNodXRkb3duIHBhdGgpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGV2ZXJ5IGxlYXNlIHdhcyByZWxlYXNlZC5cbiAgICovXG4gIGFzeW5jIHJlbGVhc2VBbGxIZWxkKCkge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBbLi4udGhpcy5ob2xkcy5rZXlzKCldKSBhd2FpdCB0aGlzLnJlbGVhc2UobmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBzZXJ2ZXIncyBsaXZlIGhvbGRlciBsaXN0IChkaWFnbm9zdGljcykuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+fSAtIExpdmUgaG9sZGVycy5cbiAgICovXG4gIGFzeW5jIGxpc3QoKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVlc3QoXCJsaXN0XCIsIHt9KVxuICAgIGNvbnN0IGhvbGRlcnMgPSByZXNwb25zZS5ob2xkZXJzXG5cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdfSAqLyAoQXJyYXkuaXNBcnJheShob2xkZXJzKSA/IGhvbGRlcnMgOiBbXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdoby1ob2xkcyBmb3Igb25lIG5hbWUgKGRpYWdub3N0aWNzKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbD59IC0gSG9sZGVyLCBvciBudWxsLlxuICAgKi9cbiAgYXN5bmMgd2hvSG9sZHMobmFtZSkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0KFwid2hvLWhvbGRzXCIsIHtuYW1lfSlcbiAgICBjb25zdCBob2xkZXIgPSByZXNwb25zZS5ob2xkZXJcblxuICAgIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbH0gKi8gKGhvbGRlciAmJiB0eXBlb2YgaG9sZGVyID09PSBcIm9iamVjdFwiID8gaG9sZGVyIDogbnVsbClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBmZW5jaW5nIGVwb2NoIGdyYW50ZWQgZm9yIG9uZSBoZWxkIGxlYXNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge251bWJlciB8IG51bGx9IC0gR3JhbnRlZCBlcG9jaCwgb3IgbnVsbCB3aGVuIHRoZSBsZWFzZSBpcyBub3QgKG9yIG5vIGxvbmdlcikgaGVsZC5cbiAgICovXG4gIGdldEhvbGRFcG9jaChuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuaG9sZHMuZ2V0KG5hbWUpPy5lcG9jaCA/PyBudWxsXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGhvbGQgd2FzIGZlbmNlZCBvciBsb3N0IGR1cmluZyBpdHMgY3JpdGljYWwgc2VjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbH0gZXBvY2ggLSBFcG9jaCB0aGUgaG9sZCB3YXMgZ3JhbnRlZC5cbiAgICogQHJldHVybnMge3tjdXJyZW50RXBvY2g6IG51bWJlciB8IG51bGwsIGVwb2NoOiBudW1iZXIgfCBudWxsfSB8IG51bGx9IC0gRmVuY2luZyBkZXRhaWxzIHdoZW4gbG9zdC5cbiAgICovXG4gIHRha2VMb3NzKG5hbWUsIGVwb2NoKSB7XG4gICAgY29uc3QgbG9zcyA9IHRoaXMuZmVuY2VkSG9sZHMuZ2V0KG5hbWUpXG5cbiAgICBpZiAobG9zcykge1xuICAgICAgdGhpcy5mZW5jZWRIb2xkcy5kZWxldGUobmFtZSlcblxuICAgICAgcmV0dXJuIGxvc3NcbiAgICB9XG5cbiAgICBjb25zdCBob2xkID0gdGhpcy5ob2xkcy5nZXQobmFtZSlcblxuICAgIGlmIChob2xkICYmIGhvbGQuZXBvY2ggIT09IGVwb2NoKSByZXR1cm4ge2N1cnJlbnRFcG9jaDogaG9sZC5lcG9jaCwgZXBvY2h9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgY29ubmVjdGlvbiBzdGF0ZSBhbmQgdGhlIG5hbWVzIGN1cnJlbnRseSBsZWFzZWQgdGhyb3VnaCB0aGlzXG4gICAqIHByb2Nlc3MsIGZvciBgZ2V0QWR2aXNvcnlMb2NrQmFja2VuZFN0YXR1cygpYC5cbiAgICogQHJldHVybnMge3tjb25uZWN0ZWQ6IGJvb2xlYW4sIGxhc3RFcnJvcjogc3RyaW5nIHwgbnVsbCwgbGFzdFByb2JlQXQ6IHN0cmluZyB8IG51bGwsIGxlYXNlZE5hbWVzOiBzdHJpbmdbXX19IC0gQmFja2VuZCBzdGF0dXMgZm9yIGRpYWdub3N0aWNzLlxuICAgKi9cbiAgZ2V0U3RhdHVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb25uZWN0ZWQ6IEJvb2xlYW4odGhpcy5jb25uZWN0aW9uKSxcbiAgICAgIGxhc3RFcnJvcjogdGhpcy5zdGF0dXMubGFzdEVycm9yLFxuICAgICAgbGFzdFByb2JlQXQ6IHRoaXMuc3RhdHVzLmxhc3RQcm9iZUF0LFxuICAgICAgbGVhc2VkTmFtZXM6IFsuLi50aGlzLmhvbGRzLmtleXMoKV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBiYWNrZW5kOiBleHBsaWNpdCByZWxlYXNlIGZpcnN0LCB0aGVuIHRoZSB0cmFuc3BvcnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY2xvc2VkLlxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgdGhpcy5jbG9zZWQgPSB0cnVlXG4gICAgYXdhaXQgdGhpcy5yZWxlYXNlQWxsSGVsZCgpXG5cbiAgICB0aGlzLnRlYXJkb3duKClcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIG9uZSBzZXJ2ZXIgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gYm9keSAtIFNlcnZlciBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGhhbmRsZU1lc3NhZ2UoYm9keSkge1xuICAgIGlmICghYm9keSB8fCB0eXBlb2YgYm9keSAhPT0gXCJvYmplY3RcIikgcmV0dXJuXG5cbiAgICBpZiAoYm9keS50eXBlID09PSBcImhlbGxvLWFja1wiKSB7XG4gICAgICBjb25zdCBhZHZlcnRpc2VkTGVhc2VNcyA9IE51bWJlcihib2R5LmxlYXNlTXMpXG5cbiAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoYWR2ZXJ0aXNlZExlYXNlTXMpICYmIGFkdmVydGlzZWRMZWFzZU1zID4gMCkgdGhpcy5sZWFzZU1zID0gYWR2ZXJ0aXNlZExlYXNlTXNcblxuICAgICAgY29uc3QgaGVsbG9XYWl0ZXIgPSB0aGlzLmhlbGxvV2FpdGVyXG5cbiAgICAgIHRoaXMuaGVsbG9XYWl0ZXIgPSBudWxsXG4gICAgICBpZiAoaGVsbG9XYWl0ZXIpIHtcbiAgICAgICAgaWYgKGhlbGxvV2FpdGVyLnRpbWVyKSBjbGVhclRpbWVvdXQoaGVsbG9XYWl0ZXIudGltZXIpXG4gICAgICAgIGhlbGxvV2FpdGVyLnJlc29sdmUoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoYm9keS50eXBlID09PSBcImxvc3RcIikge1xuICAgICAgY29uc3QgbmFtZSA9IFN0cmluZyhib2R5Lm5hbWUgPz8gXCJcIilcbiAgICAgIGNvbnN0IGhvbGQgPSB0aGlzLmhvbGRzLmdldChuYW1lKVxuXG4gICAgICBpZiAoIWhvbGQpIHJldHVyblxuXG4gICAgICB0aGlzLmhvbGRzLmRlbGV0ZShuYW1lKVxuICAgICAgY2xlYXJJbnRlcnZhbChob2xkLnRpbWVyKVxuICAgICAgdGhpcy5mZW5jZWRIb2xkcy5zZXQobmFtZSwge2N1cnJlbnRFcG9jaDogTnVtYmVyKGJvZHkuZXBvY2ggPz8gMCksIGVwb2NoOiBob2xkLmVwb2NofSlcblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGJvZHkudHlwZSAhPT0gXCJyZXNwb25zZVwiIHx8IHR5cGVvZiBib2R5LmNvcnJlbGF0aW9uSWQgIT09IFwic3RyaW5nXCIpIHJldHVyblxuXG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZy5nZXQoYm9keS5jb3JyZWxhdGlvbklkKVxuXG4gICAgaWYgKCFwZW5kaW5nKSByZXR1cm5cblxuICAgIHRoaXMucGVuZGluZy5kZWxldGUoYm9keS5jb3JyZWxhdGlvbklkKVxuICAgIGlmIChwZW5kaW5nLnRpbWVyKSBjbGVhclRpbWVvdXQocGVuZGluZy50aW1lcilcblxuICAgIGlmIChib2R5LnN0YXR1cyA9PT0gXCJlcnJvclwiKSB7XG4gICAgICBwZW5kaW5nLnJlamVjdChuZXcgRXJyb3IoU3RyaW5nKGJvZHkuZXJyb3IgfHwgXCJMb2NrIHNlcnZlciBlcnJvclwiKSkpXG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHBlbmRpbmcucmVzb2x2ZShib2R5KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIG9uZSByZXF1ZXN0IGFuZCBhd2FpdHMgaXRzIGNvcnJlbGF0ZWQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gUmVxdWVzdCB0eXBlLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBwYXlsb2FkIC0gUmVxdWVzdCBmaWVsZHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbH0gW3RpbWVvdXRNc10gLSBSZXNwb25zZSB0aW1lb3V0OyBudWxsIHdhaXRzIGZvciB0aGUgc2VydmVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj59IC0gUmVzcG9uc2UgYm9keS5cbiAgICovXG4gIGFzeW5jIHJlcXVlc3QodHlwZSwgcGF5bG9hZCwgdGltZW91dE1zID0gbnVsbCkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmNvbm5lY3Rpb25cblxuICAgIGlmICghY29ubmVjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEFkdmlzb3J5TG9ja1NlcnZpY2VVbmF2YWlsYWJsZUVycm9yKFwiTG9jayBzZXJ2ZXIgY29ubmVjdGlvbiBpcyBub3Qgb3BlblwiLCB7bG9ja05hbWU6IFN0cmluZyhwYXlsb2FkLm5hbWUgPz8gXCJcIiksIHJlYXNvbjogXCJub3QtY29ubmVjdGVkXCJ9KVxuICAgIH1cblxuICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSBgcmVxLSR7Kyt0aGlzLnJlcXVlc3RDb3VudGVyfWBcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0aW1lciA9IHR5cGVvZiB0aW1lb3V0TXMgPT09IFwibnVtYmVyXCIgJiYgdGltZW91dE1zID4gMFxuICAgICAgICA/IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucGVuZGluZy5kZWxldGUoY29ycmVsYXRpb25JZClcbiAgICAgICAgICByZWplY3QobmV3IEFkdmlzb3J5TG9ja1NlcnZpY2VVbmF2YWlsYWJsZUVycm9yKFxuICAgICAgICAgICAgYExvY2sgc2VydmVyIHJlcXVlc3QgdGltZWQgb3V0OiAke3R5cGV9ICR7U3RyaW5nKHBheWxvYWQubmFtZSA/PyBcIlwiKX1gLFxuICAgICAgICAgICAge2xvY2tOYW1lOiBTdHJpbmcocGF5bG9hZC5uYW1lID8/IFwiXCIpLCByZWFzb246IFwicmVxdWVzdC10aW1lb3V0XCJ9XG4gICAgICAgICAgKSlcbiAgICAgICAgfSwgdGltZW91dE1zKVxuICAgICAgICA6IG51bGxcblxuICAgICAgdGltZXI/LnVucmVmPy4oKVxuICAgICAgdGhpcy5wZW5kaW5nLnNldChjb3JyZWxhdGlvbklkLCB7cmVqZWN0LCByZXNvbHZlLCB0aW1lcn0pXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbm5lY3Rpb24uc2VuZE1lc3NhZ2Uoey4uLnBheWxvYWQsIGNvcnJlbGF0aW9uSWQsIHR5cGV9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nLmRlbGV0ZShjb3JyZWxhdGlvbklkKVxuICAgICAgICBpZiAodGltZXIpIGNsZWFyVGltZW91dCh0aW1lcilcbiAgICAgICAgdGhpcy5tYXJrVW5hdmFpbGFibGUoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKVxuICAgICAgICByZWplY3QobmV3IEFkdmlzb3J5TG9ja1NlcnZpY2VVbmF2YWlsYWJsZUVycm9yKFxuICAgICAgICAgIGBMb2NrIHNlcnZlciBzZW5kIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgICB7bG9ja05hbWU6IFN0cmluZyhwYXlsb2FkLm5hbWUgPz8gXCJcIiksIHJlYXNvbjogXCJzZW5kLWZhaWxlZFwifVxuICAgICAgICApKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIGxlYXNlIHJlbmV3YWwgZm9yIGEgZ3JhbnRlZCBsb2NrLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGVwb2NoIC0gR3JhbnRlZCBlcG9jaC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGFydFJlbmV3YWwobmFtZSwgZXBvY2gpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuaG9sZHMuZ2V0KG5hbWUpXG5cbiAgICBpZiAoZXhpc3RpbmcpIGNsZWFySW50ZXJ2YWwoZXhpc3RpbmcudGltZXIpXG5cbiAgICBjb25zdCBpbnRlcnZhbE1zID0gTWF0aC5tYXgoMjUwLCBNYXRoLmZsb29yKHRoaXMubGVhc2VNcyAvIDMpKVxuICAgIGNvbnN0IHRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdm9pZCB0aGlzLnJlbmV3KG5hbWUsIGVwb2NoKVxuICAgIH0sIGludGVydmFsTXMpXG5cbiAgICB0aW1lci51bnJlZj8uKClcbiAgICB0aGlzLmhvbGRzLnNldChuYW1lLCB7ZXBvY2gsIGxlYXNlRXhwaXJlc0F0OiBEYXRlLm5vdygpICsgdGhpcy5sZWFzZU1zLCBuYW1lLCB0aW1lcn0pXG4gIH1cblxuICAvKipcbiAgICogUmVuZXdzIG9uZSBsZWFzZTsgYSBmZW5jZWQgbGVhc2UgaXMgcmVjb3JkZWQgZm9yIHRoZSBydW5uZXIgdG8gc3VyZmFjZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBlcG9jaCAtIEVwb2NoIHRoZSBob2xkIGJlbGlldmVzIGl0IG93bnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHRoZSByZW5ld2FsIHJvdW5kLXRyaXAuXG4gICAqL1xuICBhc3luYyByZW5ldyhuYW1lLCBlcG9jaCkge1xuICAgIGNvbnN0IGhvbGQgPSB0aGlzLmhvbGRzLmdldChuYW1lKVxuXG4gICAgaWYgKCFob2xkIHx8ICF0aGlzLmNvbm5lY3Rpb24pIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0KFwicmVuZXdcIiwge2Vwb2NoLCBuYW1lfSwgdGhpcy5jb25uZWN0VGltZW91dE1zICogMilcbiAgICAgIGNvbnN0IHN0YXR1cyA9IFN0cmluZyhyZXNwb25zZS5zdGF0dXMpXG5cbiAgICAgIGlmIChzdGF0dXMgPT09IFwicmVuZXdlZFwiKSB7XG4gICAgICAgIGhvbGQubGVhc2VFeHBpcmVzQXQgPSBOdW1iZXIocmVzcG9uc2UubGVhc2VFeHBpcmVzQXQpXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0dXMgPT09IFwibG9zdFwiIHx8IHN0YXR1cyA9PT0gXCJub3QtZm91bmRcIikge1xuICAgICAgICB0aGlzLmhvbGRzLmRlbGV0ZShuYW1lKVxuICAgICAgICBjbGVhckludGVydmFsKGhvbGQudGltZXIpXG4gICAgICAgIHRoaXMuZmVuY2VkSG9sZHMuc2V0KG5hbWUsIHtjdXJyZW50RXBvY2g6IE51bWJlcihyZXNwb25zZS5jdXJyZW50RXBvY2ggPz8gMCksIGVwb2NofSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBBZHZpc29yeUxvY2tTZXJ2aWNlVW5hdmFpbGFibGVFcnJvcikpIHRocm93IGVycm9yXG5cbiAgICAgIC8vIEEgbGVhc2UgdGhhdCBjYW5ub3QgYmUgcmVuZXdlZCBjYW4gbm8gbG9uZ2VyIGJlIHByb3ZlbiB0byBiZSBvdXJzOiB0aGVcbiAgICAgIC8vIHNlcnZlciBtYXkgaGF2ZSBmZW5jZWQgaXQgd2hpbGUgdGhlIHRyYW5zcG9ydCB3YXMgZmFpbGluZy4gUmVjb3JkaW5nIGl0XG4gICAgICAvLyBhcyBsb3N0IGlzIHRoZSBvbmx5IGhvbmVzdCBhbnN3ZXIsIGFuZCBzdG9wcyB0aGUgcmVuZXdhbCBsb29wLlxuICAgICAgdGhpcy5tYXJrVW5hdmFpbGFibGUoZXJyb3IpXG4gICAgICB0aGlzLmhvbGRzLmRlbGV0ZShuYW1lKVxuICAgICAgY2xlYXJJbnRlcnZhbChob2xkLnRpbWVyKVxuICAgICAgdGhpcy5mZW5jZWRIb2xkcy5zZXQobmFtZSwge2N1cnJlbnRFcG9jaDogbnVsbCwgZXBvY2h9KVxuICAgICAgdGhpcy5yZXBvcnRFcnJvcihlcnJvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyB0aGF0IHRoZSBsb2NrIHNlcnZlciBpcyB1bnJlYWNoYWJsZSBhbmQgc3RhcnRzIHRoZSByZS1wcm9iZSBjb29sZG93bi5cbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBGYWlsdXJlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG1hcmtVbmF2YWlsYWJsZShlcnJvcikge1xuICAgIHRoaXMuc3RhdHVzLmxhc3RFcnJvciA9IGVycm9yLm1lc3NhZ2VcbiAgICB0aGlzLnN0YXR1cy5sYXN0UHJvYmVBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgIHRoaXMuc3RhdHVzLnVuYXZhaWxhYmxlVW50aWwgPSBEYXRlLm5vdygpICsgdGhpcy5yZXByb2JlQ29vbGRvd25Nc1xuICB9XG5cbiAgLyoqXG4gICAqIERyb3BzIHRyYW5zcG9ydCBzdGF0ZSBhbmQgbWFya3MgZXZlcnkgb3V0c3RhbmRpbmcgaG9sZCBsb3N0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHRlYXJkb3duKCkge1xuICAgIGZvciAoY29uc3QgW25hbWUsIGhvbGRdIG9mIHRoaXMuaG9sZHMpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaG9sZC50aW1lcilcbiAgICAgIHRoaXMuZmVuY2VkSG9sZHMuc2V0KG5hbWUsIHtjdXJyZW50RXBvY2g6IG51bGwsIGVwb2NoOiBob2xkLmVwb2NofSlcbiAgICB9XG5cbiAgICB0aGlzLmhvbGRzLmNsZWFyKClcblxuICAgIGZvciAoY29uc3QgcGVuZGluZyBvZiB0aGlzLnBlbmRpbmcudmFsdWVzKCkpIHtcbiAgICAgIGlmIChwZW5kaW5nLnRpbWVyKSBjbGVhclRpbWVvdXQocGVuZGluZy50aW1lcilcbiAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBBZHZpc29yeUxvY2tTZXJ2aWNlVW5hdmFpbGFibGVFcnJvcihcIkxvY2sgc2VydmVyIGNvbm5lY3Rpb24gZHJvcHBlZFwiLCB7bG9ja05hbWU6IFwiXCIsIHJlYXNvbjogXCJjb25uZWN0aW9uLWRyb3BwZWRcIn0pKVxuICAgIH1cblxuICAgIHRoaXMucGVuZGluZy5jbGVhcigpXG5cbiAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9uXG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy5jbGllbnRcblxuICAgIHRoaXMuY29ubmVjdGlvbiA9IG51bGxcbiAgICB0aGlzLmNsaWVudCA9IG51bGxcblxuICAgIHRyeSB7XG4gICAgICBjb25uZWN0aW9uPy5jbG9zZT8uKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5yZXBvcnRFcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHZvaWQgY2xpZW50Py5jbG9zZT8uKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5yZXBvcnRFcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgYSB0cmFuc3BvcnQtc2lkZSBmYWlsdXJlIHdpdGhvdXQgYnJlYWtpbmcgbG9jayBoYW5kbGluZy5cbiAgICogQHBhcmFtIHt1bmtub3dufSBlcnJvciAtIEZhaWx1cmUgdG8gcmVwb3J0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJlcG9ydEVycm9yKGVycm9yKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKVxuXG4gICAgdGhpcy5zdGF0dXMubGFzdEVycm9yID0gbm9ybWFsaXplZC5tZXNzYWdlXG5cbiAgICBpZiAodGhpcy5vbkVycm9yKSB0aGlzLm9uRXJyb3Iobm9ybWFsaXplZClcbiAgfVxufVxuXG4vKipcbiAqIERlZmF1bHQgdHJhbnNwb3J0IGZhY3Rvcnk6IHRoZSBmcmFtZXdvcmsgd2Vic29ja2V0IGNsaWVudCB3aXRoIHRoZSBOb2RlXG4gKiBgd3NgIGltcGxlbWVudGF0aW9uIGJvdW5kIGV4cGxpY2l0bHkgKG5vIGdsb2JhbCBtdXRhdGlvbikuXG4gKiBAcGFyYW0ge3thdXRoVG9rZW46IHN0cmluZywgdXJsOiBzdHJpbmd9fSBhcmdzIC0gQ29ubmVjdGlvbiBhcmdzLlxuICogQHJldHVybnMge0xvY2tTZXJ2ZXJDbGllbnRMaWtlfSAtIFdlYnNvY2tldCBjbGllbnQuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRDbGllbnRGYWN0b3J5KHt1cmx9KSB7XG4gIC8vIE5vZGUncyBnbG9iYWwgV2ViU29ja2V0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGV4aXN0LCBzbyB0aGUgaW1wbGVtZW50YXRpb24gaXNcbiAgLy8gYm91bmQgZXhwbGljaXRseSBpbnN0ZWFkIG9mIG11dGF0aW5nIGBnbG9iYWxUaGlzYC5cbiAgY29uc3Qgd2ViU29ja2V0SW1wbGVtZW50YXRpb24gPSAvKiogQHR5cGUge3R5cGVvZiBnbG9iYWxUaGlzLldlYlNvY2tldH0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKFdlYlNvY2tldCkpXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7TG9ja1NlcnZlckNsaWVudExpa2V9ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChuZXcgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50KHtcbiAgICBoZWFydGJlYXRJbnRlcnZhbE1zOiAxMF8wMDAsXG4gICAgdXJsLFxuICAgIHdlYlNvY2tldEltcGxlbWVudGF0aW9uXG4gIH0pKSlcbn1cbiJdfQ==
|
|
@@ -189,6 +189,48 @@ export default class AdvisoryLockRunner {
|
|
|
189
189
|
name: string;
|
|
190
190
|
release: () => Promise<unknown>;
|
|
191
191
|
}): Promise<T>;
|
|
192
|
+
/**
|
|
193
|
+
* Returns the held entry when this async context already holds the lock.
|
|
194
|
+
* @param {string} name - Lock name.
|
|
195
|
+
* @returns {{depth: number, lockBackend: AdvisoryLockBackendProvenance} | null} - The held entry, or null when this context does not hold the lock.
|
|
196
|
+
*/
|
|
197
|
+
heldEntryFor(name: string): {
|
|
198
|
+
depth: number;
|
|
199
|
+
lockBackend: AdvisoryLockBackendProvenance;
|
|
200
|
+
} | null;
|
|
201
|
+
/**
|
|
202
|
+
* Runs a callback as a re-entry of a lock this async context already holds.
|
|
203
|
+
*
|
|
204
|
+
* The re-entry adds no backend round trip and cannot fail on contention: the
|
|
205
|
+
* outer hold already owns the lock, so mutual exclusion is unchanged. The
|
|
206
|
+
* outer hold owns the hold timeout and the lease; a re-entry does not start a
|
|
207
|
+
* second one, and the callback therefore receives the outer provenance without
|
|
208
|
+
* a `control`.
|
|
209
|
+
* @template T
|
|
210
|
+
* @param {{callback: (args?: {control?: import("awaitery/build/timeout.js").TimeoutControl, lockBackend: AdvisoryLockBackendProvenance}) => Promise<T>, entry: {depth: number, lockBackend: AdvisoryLockBackendProvenance}, name: string}} args - Re-entry request.
|
|
211
|
+
* @returns {Promise<T>} - Callback result.
|
|
212
|
+
*/
|
|
213
|
+
runReentrantCallback<T>({ callback, entry, name }: {
|
|
214
|
+
callback: (args?: {
|
|
215
|
+
control?: import("awaitery/build/timeout.js").TimeoutControl;
|
|
216
|
+
lockBackend: AdvisoryLockBackendProvenance;
|
|
217
|
+
}) => Promise<T>;
|
|
218
|
+
entry: {
|
|
219
|
+
depth: number;
|
|
220
|
+
lockBackend: AdvisoryLockBackendProvenance;
|
|
221
|
+
};
|
|
222
|
+
name: string;
|
|
223
|
+
}): Promise<T>;
|
|
224
|
+
/**
|
|
225
|
+
* Builds the async-context storage key for one lock name.
|
|
226
|
+
*
|
|
227
|
+
* The database identifier is part of the key because it is part of the lock's
|
|
228
|
+
* identity: two tenant databases reusing one name hold two different locks,
|
|
229
|
+
* and a nested call in the other database is not a re-entry.
|
|
230
|
+
* @param {string} name - Lock name.
|
|
231
|
+
* @returns {string} - Storage key for the held-entry map.
|
|
232
|
+
*/
|
|
233
|
+
lockStorageKey(name: string): string;
|
|
192
234
|
/**
|
|
193
235
|
* Serves one acquisition on the lock-server tier when the lock name prefers
|
|
194
236
|
* it (design §1/§9), falling *upward* to the driver path when the server is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advisory-lock-runner.d.ts","sourceRoot":"","sources":["../../../src/database/advisory-lock-runner.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"advisory-lock-runner.d.ts","sourceRoot":"","sources":["../../../src/database/advisory-lock-runner.js"],"names":[],"mappings":"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"}
|