velocious 1.0.340 → 1.0.342
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/build/src/background-jobs/job-runner.d.ts.map +1 -1
- package/build/src/background-jobs/job-runner.js +4 -2
- package/build/src/background-jobs/worker.d.ts.map +1 -1
- package/build/src/background-jobs/worker.js +4 -2
- package/build/src/http-client/websocket-client.d.ts +21 -0
- package/build/src/http-client/websocket-client.d.ts.map +1 -1
- package/build/src/http-client/websocket-client.js +101 -15
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"job-runner.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/job-runner.js"],"names":[],"mappings":"AAMA;;;GAGG;AACH,+CAHW,OAAO,YAAY,EAAE,oBAAoB,GACvC,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"job-runner.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/job-runner.js"],"names":[],"mappings":"AAMA;;;GAGG;AACH,+CAHW,OAAO,YAAY,EAAE,oBAAoB,GACvC,OAAO,CAAC,IAAI,CAAC,CA2CzB"}
|
|
@@ -18,7 +18,9 @@ export default async function runJobPayload(payload) {
|
|
|
18
18
|
/** @type {(...args: any[]) => Promise<void>} */
|
|
19
19
|
const perform = jobInstance.perform;
|
|
20
20
|
try {
|
|
21
|
-
await
|
|
21
|
+
await configuration.withConnections(async () => {
|
|
22
|
+
await perform.apply(jobInstance, payload.args || []);
|
|
23
|
+
});
|
|
22
24
|
if (payload.id) {
|
|
23
25
|
await reporter.reportWithRetry({
|
|
24
26
|
jobId: payload.id,
|
|
@@ -43,4 +45,4 @@ export default async function runJobPayload(payload) {
|
|
|
43
45
|
throw error;
|
|
44
46
|
}
|
|
45
47
|
}
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLXJ1bm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZ3JvdW5kLWpvYnMvam9iLXJ1bm5lci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxxQkFBcUIsTUFBTSw4QkFBOEIsQ0FBQTtBQUNoRSxPQUFPLHFCQUFxQixNQUFNLG1CQUFtQixDQUFBO0FBQ3JELE9BQU8sNEJBQTRCLE1BQU0sc0JBQXNCLENBQUE7QUFFL0Q7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUFDLE9BQU87SUFDakQsTUFBTSxhQUFhLEdBQUcsTUFBTSxxQkFBcUIsRUFBRSxDQUFBO0lBQ25ELGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUMxQixNQUFNLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBQyxJQUFJLEVBQUUsd0JBQXdCLEVBQUMsQ0FBQyxDQUFBO0lBQ2hFLE1BQU0sUUFBUSxHQUFHLElBQUksNEJBQTRCLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFBO0lBRWxFLE1BQU0sUUFBUSxHQUFHLElBQUkscUJBQXFCLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFBO0lBQzNELE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3JCLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3ZELE1BQU0sV0FBVyxHQUFHLElBQUksUUFBUSxFQUFFLENBQUE7SUFDbEMsZ0RBQWdEO0lBQ2hELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUE7SUFFbkMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxhQUFhLENBQUMsZUFBZSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQzdDLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUN0RCxDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2YsTUFBTSxRQUFRLENBQUMsZUFBZSxDQUFDO2dCQUM3QixLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQ2pCLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7Z0JBQzFCLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYTtnQkFDcEMsYUFBYSxFQUFFLEtBQUs7YUFDckIsQ0FBQyxDQUFBO1FBQ0osQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDZixNQUFNLFFBQVEsQ0FBQyxlQUFlLENBQUM7Z0JBQzdCLEtBQUssRUFBRSxPQUFPLENBQUMsRUFBRTtnQkFDakIsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLEtBQUs7Z0JBQ0wsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO2dCQUMxQixhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7Z0JBQ3BDLGFBQWEsRUFBRSxLQUFLO2FBQ3JCLENBQUMsQ0FBQTtRQUNKLENBQUM7UUFFRCxNQUFNLEtBQUssQ0FBQTtJQUNiLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBjb25maWd1cmF0aW9uUmVzb2x2ZXIgZnJvbSBcIi4uL2NvbmZpZ3VyYXRpb24tcmVzb2x2ZXIuanNcIlxuaW1wb3J0IEJhY2tncm91bmRKb2JSZWdpc3RyeSBmcm9tIFwiLi9qb2ItcmVnaXN0cnkuanNcIlxuaW1wb3J0IEJhY2tncm91bmRKb2JzU3RhdHVzUmVwb3J0ZXIgZnJvbSBcIi4vc3RhdHVzLXJlcG9ydGVyLmpzXCJcblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYlBheWxvYWR9IHBheWxvYWQgLSBQYXlsb2FkLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gcnVuSm9iUGF5bG9hZChwYXlsb2FkKSB7XG4gIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBhd2FpdCBjb25maWd1cmF0aW9uUmVzb2x2ZXIoKVxuICBjb25maWd1cmF0aW9uLnNldEN1cnJlbnQoKVxuICBhd2FpdCBjb25maWd1cmF0aW9uLmluaXRpYWxpemUoe3R5cGU6IFwiYmFja2dyb3VuZC1qb2JzLXJ1bm5lclwifSlcbiAgY29uc3QgcmVwb3J0ZXIgPSBuZXcgQmFja2dyb3VuZEpvYnNTdGF0dXNSZXBvcnRlcih7Y29uZmlndXJhdGlvbn0pXG5cbiAgY29uc3QgcmVnaXN0cnkgPSBuZXcgQmFja2dyb3VuZEpvYlJlZ2lzdHJ5KHtjb25maWd1cmF0aW9ufSlcbiAgYXdhaXQgcmVnaXN0cnkubG9hZCgpXG4gIGNvbnN0IEpvYkNsYXNzID0gcmVnaXN0cnkuZ2V0Sm9iQnlOYW1lKHBheWxvYWQuam9iTmFtZSlcbiAgY29uc3Qgam9iSW5zdGFuY2UgPSBuZXcgSm9iQ2xhc3MoKVxuICAvKiogQHR5cGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTx2b2lkPn0gKi9cbiAgY29uc3QgcGVyZm9ybSA9IGpvYkluc3RhbmNlLnBlcmZvcm1cblxuICB0cnkge1xuICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24ud2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHBlcmZvcm0uYXBwbHkoam9iSW5zdGFuY2UsIHBheWxvYWQuYXJncyB8fCBbXSlcbiAgICB9KVxuXG4gICAgaWYgKHBheWxvYWQuaWQpIHtcbiAgICAgIGF3YWl0IHJlcG9ydGVyLnJlcG9ydFdpdGhSZXRyeSh7XG4gICAgICAgIGpvYklkOiBwYXlsb2FkLmlkLFxuICAgICAgICBzdGF0dXM6IFwiY29tcGxldGVkXCIsXG4gICAgICAgIHdvcmtlcklkOiBwYXlsb2FkLndvcmtlcklkLFxuICAgICAgICBoYW5kZWRPZmZBdE1zOiBwYXlsb2FkLmhhbmRlZE9mZkF0TXMsXG4gICAgICAgIG1heER1cmF0aW9uTXM6IDMwMDAwXG4gICAgICB9KVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAocGF5bG9hZC5pZCkge1xuICAgICAgYXdhaXQgcmVwb3J0ZXIucmVwb3J0V2l0aFJldHJ5KHtcbiAgICAgICAgam9iSWQ6IHBheWxvYWQuaWQsXG4gICAgICAgIHN0YXR1czogXCJmYWlsZWRcIixcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHdvcmtlcklkOiBwYXlsb2FkLndvcmtlcklkLFxuICAgICAgICBoYW5kZWRPZmZBdE1zOiBwYXlsb2FkLmhhbmRlZE9mZkF0TXMsXG4gICAgICAgIG1heER1cmF0aW9uTXM6IDMwMDAwXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/worker.js"],"names":[],"mappings":"AAUA;IACE;;;;;OAKG;IACH,4CAJG;QAAqD,aAAa;QAC5C,IAAI;QACJ,IAAI;KAC5B,EAcA;IAZC,6DAA6D;IAC7D,sBADW,OAAO,CAAC,OAAO,qBAAqB,EAAE,OAAO,CAAC,CAC2C;IACpG,gEAAgE;IAChE,eADW,OAAO,qBAAqB,EAAE,OAAO,GAAG,SAAS,CAC9B;IAC9B,yBAAgB;IAChB,yBAAgB;IAChB,oBAAuB;IACvB,8DAA4B;IAC5B,qCAAqC;IACrC,YADW,UAAU,GAAG,SAAS,CACN;IAC3B,uDAAuD;IACvD,gBADW,4BAA4B,GAAG,SAAS,CACpB;IAGjC;;OAEG;IACH,SAFa,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;OAEG;IACH,QAFa,OAAO,CAAC,IAAI,CAAC,CAKzB;IAED,0BA+BC;IAED;;;OAGG;IACH,oBAHW,OAAO,YAAY,EAAE,oBAAoB,GACvC,OAAO,CAAC,IAAI,CAAC,CAgCzB;IAED;;;OAGG;IACH,uBAHW,OAAO,YAAY,EAAE,oBAAoB,GACvC,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/worker.js"],"names":[],"mappings":"AAUA;IACE;;;;;OAKG;IACH,4CAJG;QAAqD,aAAa;QAC5C,IAAI;QACJ,IAAI;KAC5B,EAcA;IAZC,6DAA6D;IAC7D,sBADW,OAAO,CAAC,OAAO,qBAAqB,EAAE,OAAO,CAAC,CAC2C;IACpG,gEAAgE;IAChE,eADW,OAAO,qBAAqB,EAAE,OAAO,GAAG,SAAS,CAC9B;IAC9B,yBAAgB;IAChB,yBAAgB;IAChB,oBAAuB;IACvB,8DAA4B;IAC5B,qCAAqC;IACrC,YADW,UAAU,GAAG,SAAS,CACN;IAC3B,uDAAuD;IACvD,gBADW,4BAA4B,GAAG,SAAS,CACpB;IAGjC;;OAEG;IACH,SAFa,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;OAEG;IACH,QAFa,OAAO,CAAC,IAAI,CAAC,CAKzB;IAED,0BA+BC;IAED;;;OAGG;IACH,oBAHW,OAAO,YAAY,EAAE,oBAAoB,GACvC,OAAO,CAAC,IAAI,CAAC,CAgCzB;IAED;;;OAGG;IACH,uBAHW,OAAO,YAAY,EAAE,oBAAoB,GACvC,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;OAGG;IACH,2BAHW,OAAO,YAAY,EAAE,oBAAoB,GACvC,OAAO,CAAC,IAAI,CAAC,CAuBzB;IAED;;;;;;;;OAQG;IACH,oEAPG;QAAqB,KAAK,EAAlB,MAAM;QACuB,MAAM,EAAnC,WAAW,GAAG,QAAQ;QACP,KAAK,GAApB,OAAO;QACO,aAAa;QACb,QAAQ;KAC9B,GAAU,OAAO,CAAC,IAAI,CAAC,CAUzB;CACF;uBAzLsB,kBAAkB;yCAGA,sBAAsB"}
|
|
@@ -126,7 +126,9 @@ export default class BackgroundJobsWorker {
|
|
|
126
126
|
const jobInstance = new JobClass();
|
|
127
127
|
/** @type {(...args: any[]) => Promise<void>} */
|
|
128
128
|
const perform = jobInstance.perform;
|
|
129
|
-
await
|
|
129
|
+
await configuration.withConnections(async () => {
|
|
130
|
+
await perform.apply(jobInstance, payload.args || []);
|
|
131
|
+
});
|
|
130
132
|
}
|
|
131
133
|
/**
|
|
132
134
|
* @param {import("./types.js").BackgroundJobPayload} payload - Payload.
|
|
@@ -173,4 +175,4 @@ export default class BackgroundJobsWorker {
|
|
|
173
175
|
}
|
|
174
176
|
}
|
|
175
177
|
}
|
|
176
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tncm91bmQtam9icy93b3JrZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQTtBQUNyQixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDeEMsT0FBTyxVQUFVLE1BQU0sa0JBQWtCLENBQUE7QUFDekMsT0FBTyxxQkFBcUIsTUFBTSxtQkFBbUIsQ0FBQTtBQUNyRCxPQUFPLHFCQUFxQixNQUFNLDhCQUE4QixDQUFBO0FBQ2hFLE9BQU8sNEJBQTRCLE1BQU0sc0JBQXNCLENBQUE7QUFDL0QsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFFBQVEsQ0FBQTtBQUVqQyxNQUFNLENBQUMsT0FBTyxPQUFPLG9CQUFvQjtJQUN2Qzs7Ozs7T0FLRztJQUNILFlBQVksRUFBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxHQUFHLEVBQUU7UUFDMUMsNkRBQTZEO1FBQzdELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixFQUFFLENBQUE7UUFDcEcsZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFBO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO1FBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO1FBQ2hCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxFQUFFLENBQUE7UUFDNUIscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFBO1FBQzNCLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsY0FBYyxHQUFHLFNB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QUUsV0FBVyxDQUFDLENBQUE7UUFDdkUsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgbmV0IGZyb20gXCJuZXRcIlxuaW1wb3J0IHtzcGF3bn0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiXG5pbXBvcnQgSnNvblNvY2tldCBmcm9tIFwiLi9qc29uLXNvY2tldC5qc1wiXG5pbXBvcnQgQmFja2dyb3VuZEpvYlJlZ2lzdHJ5IGZyb20gXCIuL2pvYi1yZWdpc3RyeS5qc1wiXG5pbXBvcnQgY29uZmlndXJhdGlvblJlc29sdmVyIGZyb20gXCIuLi9jb25maWd1cmF0aW9uLXJlc29sdmVyLmpzXCJcbmltcG9ydCBCYWNrZ3JvdW5kSm9ic1N0YXR1c1JlcG9ydGVyIGZyb20gXCIuL3N0YXR1cy1yZXBvcnRlci5qc1wiXG5pbXBvcnQge3JhbmRvbVVVSUR9IGZyb20gXCJjcnlwdG9cIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYWNrZ3JvdW5kSm9ic1dvcmtlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLmNvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmhvc3RdIC0gSG9zdG5hbWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5wb3J0XSAtIFBvcnQuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgaG9zdCwgcG9ydH0gPSB7fSkge1xuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTxpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQ+fSAqL1xuICAgIHRoaXMuY29uZmlndXJhdGlvblByb21pc2UgPSBjb25maWd1cmF0aW9uID8gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZ3VyYXRpb24pIDogY29uZmlndXJhdGlvblJlc29sdmVyKClcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gKi9cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWRcbiAgICB0aGlzLmhvc3QgPSBob3N0XG4gICAgdGhpcy5wb3J0ID0gcG9ydFxuICAgIHRoaXMuc2hvdWxkU3RvcCA9IGZhbHNlXG4gICAgdGhpcy53b3JrZXJJZCA9IHJhbmRvbVVVSUQoKVxuICAgIC8qKiBAdHlwZSB7SnNvblNvY2tldCB8IHVuZGVmaW5lZH0gKi9cbiAgICB0aGlzLmpzb25Tb2NrZXQgPSB1bmRlZmluZWRcbiAgICAvKiogQHR5cGUge0JhY2tncm91bmRKb2JzU3RhdHVzUmVwb3J0ZXIgfCB1bmRlZmluZWR9ICovXG4gICAgdGhpcy5zdGF0dXNSZXBvcnRlciA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29ubmVjdGVkLlxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uUHJvbWlzZVxuICAgIHRoaXMuY29uZmlndXJhdGlvbi5zZXRDdXJyZW50KClcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uaW5pdGlhbGl6ZSh7dHlwZTogXCJiYWNrZ3JvdW5kLWpvYnMtd29ya2VyXCJ9KVxuICAgIHRoaXMuc3RhdHVzUmVwb3J0ZXIgPSBuZXcgQmFja2dyb3VuZEpvYnNTdGF0dXNSZXBvcnRlcih7XG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICBob3N0OiB0aGlzLmhvc3QsXG4gICAgICBwb3J0OiB0aGlzLnBvcnRcbiAgICB9KVxuICAgIGF3YWl0IHRoaXMuX2Nvbm5lY3QoKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gc3RvcHBlZC5cbiAgICovXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdGhpcy5zaG91bGRTdG9wID0gdHJ1ZVxuICAgIGlmICh0aGlzLmpzb25Tb2NrZXQpIHRoaXMuanNvblNvY2tldC5jbG9zZSgpXG4gIH1cblxuICBhc3luYyBfY29ubmVjdCgpIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5jb25maWd1cmF0aW9uXG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJCYWNrZ3JvdW5kIGpvYnMgd29ya2VyIGNvbmZpZ3VyYXRpb24gbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICBjb25zdCBjb25maWcgPSBjb25maWd1cmF0aW9uLmdldEJhY2tncm91bmRKb2JzQ29uZmlnKClcbiAgICBjb25zdCBob3N0ID0gdGhpcy5ob3N0IHx8IGNvbmZpZy5ob3N0XG4gICAgY29uc3QgcG9ydCA9IHR5cGVvZiB0aGlzLnBvcnQgPT09IFwibnVtYmVyXCIgPyB0aGlzLnBvcnQgOiBjb25maWcucG9ydFxuICAgIGNvbnN0IHNvY2tldCA9IG5ldC5jcmVhdGVDb25uZWN0aW9uKHtob3N0LCBwb3J0fSlcbiAgICBjb25zdCBqc29uU29ja2V0ID0gbmV3IEpzb25Tb2NrZXQoc29ja2V0KVxuICAgIHRoaXMuanNvblNvY2tldCA9IGpzb25Tb2NrZXRcblxuICAgIC8qKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYlNvY2tldE1lc3NhZ2V9IG1lc3NhZ2UgLSBTb2NrZXQgbWVzc2FnZS4gKi9cbiAgICBqc29uU29ja2V0Lm9uKFwibWVzc2FnZVwiLCBhc3luYyAobWVzc2FnZSkgPT4ge1xuICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwiam9iXCIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5faGFuZGxlSm9iKG1lc3NhZ2UucGF5bG9hZClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAganNvblNvY2tldC5vbihcImVycm9yXCIsIChlcnJvcikgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihcIkJhY2tncm91bmQgam9icyB3b3JrZXIgc29ja2V0IGVycm9yOlwiLCBlcnJvcilcbiAgICB9KVxuXG4gICAganNvblNvY2tldC5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFN0b3ApIHJldHVyblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHZvaWQgdGhpcy5fY29ubmVjdCgpIH0sIDEwMDApXG4gICAgfSlcblxuICAgIHNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAganNvblNvY2tldC5zZW5kKHt0eXBlOiBcImhlbGxvXCIsIHJvbGU6IFwid29ya2VyXCIsIHdvcmtlcklkOiB0aGlzLndvcmtlcklkfSlcbiAgICAgIGpzb25Tb2NrZXQuc2VuZCh7dHlwZTogXCJyZWFkeVwifSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iUGF5bG9hZH0gcGF5bG9hZCAtIFBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gZG9uZS5cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVKb2IocGF5bG9hZCkge1xuICAgIGlmICghcGF5bG9hZC5pZCkgdGhyb3cgbmV3IEVycm9yKFwiQmFja2dyb3VuZCBqb2IgcGF5bG9hZCBtaXNzaW5nIGlkXCIpXG5cbiAgICBjb25zdCBvcHRpb25zID0gcGF5bG9hZC5vcHRpb25zIHx8IHt9XG4gICAgY29uc3Qgc2hvdWxkRm9yayA9IG9wdGlvbnMuZm9ya2VkICE9PSBmYWxzZVxuXG4gICAgaWYgKHNob3VsZEZvcmspIHtcbiAgICAgIGF3YWl0IHRoaXMuX3NwYXduRGV0YWNoZWRKb2IocGF5bG9hZClcbiAgICAgIHRoaXMuanNvblNvY2tldD8uc2VuZCh7dHlwZTogXCJyZWFkeVwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9ydW5Kb2JJbmxpbmUocGF5bG9hZClcbiAgICAgIHZvaWQgdGhpcy5fcmVwb3J0Sm9iUmVzdWx0KHtcbiAgICAgICAgam9iSWQ6IHBheWxvYWQuaWQsXG4gICAgICAgIHN0YXR1czogXCJjb21wbGV0ZWRcIixcbiAgICAgICAgaGFuZGVkT2ZmQXRNczogcGF5bG9hZC5oYW5kZWRPZmZBdE1zLFxuICAgICAgICB3b3JrZXJJZDogcGF5bG9hZC53b3JrZXJJZCB8fCB0aGlzLndvcmtlcklkXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB2b2lkIHRoaXMuX3JlcG9ydEpvYlJlc3VsdCh7XG4gICAgICAgIGpvYklkOiBwYXlsb2FkLmlkLFxuICAgICAgICBzdGF0dXM6IFwiZmFpbGVkXCIsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBoYW5kZWRPZmZBdE1zOiBwYXlsb2FkLmhhbmRlZE9mZkF0TXMsXG4gICAgICAgIHdvcmtlcklkOiBwYXlsb2FkLndvcmtlcklkIHx8IHRoaXMud29ya2VySWRcbiAgICAgIH0pXG4gICAgfVxuICAgIHRoaXMuanNvblNvY2tldD8uc2VuZCh7dHlwZTogXCJyZWFkeVwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYlBheWxvYWR9IHBheWxvYWQgLSBQYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGRvbmUuXG4gICAqL1xuICBhc3luYyBfcnVuSm9iSW5saW5lKHBheWxvYWQpIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5jb25maWd1cmF0aW9uXG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJCYWNrZ3JvdW5kIGpvYnMgd29ya2VyIGNvbmZpZ3VyYXRpb24gbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICBjb25zdCByZWdpc3RyeSA9IG5ldyBCYWNrZ3JvdW5kSm9iUmVnaXN0cnkoe2NvbmZpZ3VyYXRpb259KVxuICAgIGF3YWl0IHJlZ2lzdHJ5LmxvYWQoKVxuICAgIGNvbnN0IEpvYkNsYXNzID0gcmVnaXN0cnkuZ2V0Sm9iQnlOYW1lKHBheWxvYWQuam9iTmFtZSlcbiAgICBjb25zdCBqb2JJbnN0YW5jZSA9IG5ldyBKb2JDbGFzcygpXG4gICAgLyoqIEB0eXBlIHsoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8dm9pZD59ICovXG4gICAgY29uc3QgcGVyZm9ybSA9IGpvYkluc3RhbmNlLnBlcmZvcm1cblxuICAgIGF3YWl0IHBlcmZvcm0uYXBwbHkoam9iSW5zdGFuY2UsIHBheWxvYWQuYXJncyB8fCBbXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYlBheWxvYWR9IHBheWxvYWQgLSBQYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHNwYXduZWQuXG4gICAqL1xuICBhc3luYyBfc3Bhd25EZXRhY2hlZEpvYihwYXlsb2FkKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuY29uZmlndXJhdGlvblxuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiQmFja2dyb3VuZCBqb2JzIHdvcmtlciBjb25maWd1cmF0aW9uIG5vdCBpbml0aWFsaXplZFwiKVxuXG4gICAgY29uc3QgZGlyZWN0b3J5ID0gY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKVxuICAgIGNvbnN0IGFyZ3ZDb21tYW5kID0gcHJvY2Vzcy5hcmd2WzFdXG4gICAgY29uc3QgY29tbWFuZCA9IGFyZ3ZDb21tYW5kID8gYXJndkNvbW1hbmQgOiBgJHtkaXJlY3Rvcnl9L2Jpbi92ZWxvY2lvdXMuanNgXG4gICAgY29uc3QgZW5jb2RlZFBheWxvYWQgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShwYXlsb2FkKSkudG9TdHJpbmcoXCJiYXNlNjRcIilcbiAgICBjb25zdCBiYWNrZ3JvdW5kSm9ic0NvbmZpZyA9IGNvbmZpZ3VyYXRpb24uZ2V0QmFja2dyb3VuZEpvYnNDb25maWcoKVxuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24ocHJvY2Vzcy5leGVjUGF0aCwgW2NvbW1hbmQsIFwiYmFja2dyb3VuZC1qb2JzLXJ1bm5lclwiXSwge1xuICAgICAgY3dkOiBkaXJlY3RvcnksXG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiBcImlnbm9yZVwiLFxuICAgICAgZW52OiBPYmplY3QuYXNzaWduKHt9LCBwcm9jZXNzLmVudiwge1xuICAgICAgICBWRUxPQ0lPVVNfQkFDS0dST1VORF9KT0JTX0hPU1Q6IGJhY2tncm91bmRKb2JzQ29uZmlnLmhvc3QsXG4gICAgICAgIFZFTE9DSU9VU19CQUNLR1JPVU5EX0pPQlNfUE9SVDogYCR7YmFja2dyb3VuZEpvYnNDb25maWcucG9ydH1gLFxuICAgICAgICBWRUxPQ0lPVVNfSk9CX1BBWUxPQUQ6IGVuY29kZWRQYXlsb2FkXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBjaGlsZC51bnJlZigpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5qb2JJZCAtIEpvYiBpZC5cbiAgICogQHBhcmFtIHtcImNvbXBsZXRlZFwiIHwgXCJmYWlsZWRcIn0gYXJncy5zdGF0dXMgLSBTdGF0dXMuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gW2FyZ3MuZXJyb3JdIC0gRXJyb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5oYW5kZWRPZmZBdE1zXSAtIEhhbmRlZCBvZmYgdGltZXN0YW1wLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3Mud29ya2VySWRdIC0gV29ya2VyIGlkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHJlcG9ydGVkLlxuICAgKi9cbiAgYXN5bmMgX3JlcG9ydEpvYlJlc3VsdCh7am9iSWQsIHN0YXR1cywgZXJyb3IsIGhhbmRlZE9mZkF0TXMsIHdvcmtlcklkfSkge1xuICAgIGlmICghdGhpcy5zdGF0dXNSZXBvcnRlcikgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zdGF0dXNSZXBvcnRlci5yZXBvcnRXaXRoUmV0cnkoe2pvYklkLCBzdGF0dXMsIGVycm9yLCBoYW5kZWRPZmZBdE1zLCB3b3JrZXJJZH0pXG4gICAgfSBjYXRjaCAocmVwb3J0RXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJCYWNrZ3JvdW5kIGpvYiBzdGF0dXMgcmVwb3J0aW5nIGZhaWxlZDpcIiwgcmVwb3J0RXJyb3IpXG4gICAgfVxuICB9XG59XG4iXX0=
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tncm91bmQtam9icy93b3JrZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQTtBQUNyQixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDeEMsT0FBTyxVQUFVLE1BQU0sa0JBQWtCLENBQUE7QUFDekMsT0FBTyxxQkFBcUIsTUFBTSxtQkFBbUIsQ0FBQTtBQUNyRCxPQUFPLHFCQUFxQixNQUFNLDhCQUE4QixDQUFBO0FBQ2hFLE9BQU8sNEJBQTRCLE1BQU0sc0JBQXNCLENBQUE7QUFDL0QsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFFBQVEsQ0FBQTtBQUVqQyxNQUFNLENBQUMsT0FBTyxPQUFPLG9CQUFvQjtJQUN2Qzs7Ozs7T0FLRztJQUNILFlBQVksRUFBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxHQUFHLEVBQUU7UUFDMUMsNkRBQTZEO1FBQzdELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixFQUFFLENBQUE7UUFDcEcsZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFBO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO1FBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO1FBQ2hCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxFQUFFLENBQUE7UUFDNUIscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFBO1FBQzNCLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsY0FBYyxHQUFHLFNB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LENBQUM7UUFBQyxPQUFPLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxLQUFLLENBQUMseUNBQXlDLEVBQUUsV0FBVyxDQUFDLENBQUE7UUFDdkUsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgbmV0IGZyb20gXCJuZXRcIlxuaW1wb3J0IHtzcGF3bn0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiXG5pbXBvcnQgSnNvblNvY2tldCBmcm9tIFwiLi9qc29uLXNvY2tldC5qc1wiXG5pbXBvcnQgQmFja2dyb3VuZEpvYlJlZ2lzdHJ5IGZyb20gXCIuL2pvYi1yZWdpc3RyeS5qc1wiXG5pbXBvcnQgY29uZmlndXJhdGlvblJlc29sdmVyIGZyb20gXCIuLi9jb25maWd1cmF0aW9uLXJlc29sdmVyLmpzXCJcbmltcG9ydCBCYWNrZ3JvdW5kSm9ic1N0YXR1c1JlcG9ydGVyIGZyb20gXCIuL3N0YXR1cy1yZXBvcnRlci5qc1wiXG5pbXBvcnQge3JhbmRvbVVVSUR9IGZyb20gXCJjcnlwdG9cIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYWNrZ3JvdW5kSm9ic1dvcmtlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLmNvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmhvc3RdIC0gSG9zdG5hbWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5wb3J0XSAtIFBvcnQuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgaG9zdCwgcG9ydH0gPSB7fSkge1xuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTxpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQ+fSAqL1xuICAgIHRoaXMuY29uZmlndXJhdGlvblByb21pc2UgPSBjb25maWd1cmF0aW9uID8gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZ3VyYXRpb24pIDogY29uZmlndXJhdGlvblJlc29sdmVyKClcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gKi9cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWRcbiAgICB0aGlzLmhvc3QgPSBob3N0XG4gICAgdGhpcy5wb3J0ID0gcG9ydFxuICAgIHRoaXMuc2hvdWxkU3RvcCA9IGZhbHNlXG4gICAgdGhpcy53b3JrZXJJZCA9IHJhbmRvbVVVSUQoKVxuICAgIC8qKiBAdHlwZSB7SnNvblNvY2tldCB8IHVuZGVmaW5lZH0gKi9cbiAgICB0aGlzLmpzb25Tb2NrZXQgPSB1bmRlZmluZWRcbiAgICAvKiogQHR5cGUge0JhY2tncm91bmRKb2JzU3RhdHVzUmVwb3J0ZXIgfCB1bmRlZmluZWR9ICovXG4gICAgdGhpcy5zdGF0dXNSZXBvcnRlciA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29ubmVjdGVkLlxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uUHJvbWlzZVxuICAgIHRoaXMuY29uZmlndXJhdGlvbi5zZXRDdXJyZW50KClcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uaW5pdGlhbGl6ZSh7dHlwZTogXCJiYWNrZ3JvdW5kLWpvYnMtd29ya2VyXCJ9KVxuICAgIHRoaXMuc3RhdHVzUmVwb3J0ZXIgPSBuZXcgQmFja2dyb3VuZEpvYnNTdGF0dXNSZXBvcnRlcih7XG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICBob3N0OiB0aGlzLmhvc3QsXG4gICAgICBwb3J0OiB0aGlzLnBvcnRcbiAgICB9KVxuICAgIGF3YWl0IHRoaXMuX2Nvbm5lY3QoKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gc3RvcHBlZC5cbiAgICovXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdGhpcy5zaG91bGRTdG9wID0gdHJ1ZVxuICAgIGlmICh0aGlzLmpzb25Tb2NrZXQpIHRoaXMuanNvblNvY2tldC5jbG9zZSgpXG4gIH1cblxuICBhc3luYyBfY29ubmVjdCgpIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5jb25maWd1cmF0aW9uXG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJCYWNrZ3JvdW5kIGpvYnMgd29ya2VyIGNvbmZpZ3VyYXRpb24gbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICBjb25zdCBjb25maWcgPSBjb25maWd1cmF0aW9uLmdldEJhY2tncm91bmRKb2JzQ29uZmlnKClcbiAgICBjb25zdCBob3N0ID0gdGhpcy5ob3N0IHx8IGNvbmZpZy5ob3N0XG4gICAgY29uc3QgcG9ydCA9IHR5cGVvZiB0aGlzLnBvcnQgPT09IFwibnVtYmVyXCIgPyB0aGlzLnBvcnQgOiBjb25maWcucG9ydFxuICAgIGNvbnN0IHNvY2tldCA9IG5ldC5jcmVhdGVDb25uZWN0aW9uKHtob3N0LCBwb3J0fSlcbiAgICBjb25zdCBqc29uU29ja2V0ID0gbmV3IEpzb25Tb2NrZXQoc29ja2V0KVxuICAgIHRoaXMuanNvblNvY2tldCA9IGpzb25Tb2NrZXRcblxuICAgIC8qKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYlNvY2tldE1lc3NhZ2V9IG1lc3NhZ2UgLSBTb2NrZXQgbWVzc2FnZS4gKi9cbiAgICBqc29uU29ja2V0Lm9uKFwibWVzc2FnZVwiLCBhc3luYyAobWVzc2FnZSkgPT4ge1xuICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwiam9iXCIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5faGFuZGxlSm9iKG1lc3NhZ2UucGF5bG9hZClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAganNvblNvY2tldC5vbihcImVycm9yXCIsIChlcnJvcikgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihcIkJhY2tncm91bmQgam9icyB3b3JrZXIgc29ja2V0IGVycm9yOlwiLCBlcnJvcilcbiAgICB9KVxuXG4gICAganNvblNvY2tldC5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFN0b3ApIHJldHVyblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHZvaWQgdGhpcy5fY29ubmVjdCgpIH0sIDEwMDApXG4gICAgfSlcblxuICAgIHNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAganNvblNvY2tldC5zZW5kKHt0eXBlOiBcImhlbGxvXCIsIHJvbGU6IFwid29ya2VyXCIsIHdvcmtlcklkOiB0aGlzLndvcmtlcklkfSlcbiAgICAgIGpzb25Tb2NrZXQuc2VuZCh7dHlwZTogXCJyZWFkeVwifSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iUGF5bG9hZH0gcGF5bG9hZCAtIFBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gZG9uZS5cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVKb2IocGF5bG9hZCkge1xuICAgIGlmICghcGF5bG9hZC5pZCkgdGhyb3cgbmV3IEVycm9yKFwiQmFja2dyb3VuZCBqb2IgcGF5bG9hZCBtaXNzaW5nIGlkXCIpXG5cbiAgICBjb25zdCBvcHRpb25zID0gcGF5bG9hZC5vcHRpb25zIHx8IHt9XG4gICAgY29uc3Qgc2hvdWxkRm9yayA9IG9wdGlvbnMuZm9ya2VkICE9PSBmYWxzZVxuXG4gICAgaWYgKHNob3VsZEZvcmspIHtcbiAgICAgIGF3YWl0IHRoaXMuX3NwYXduRGV0YWNoZWRKb2IocGF5bG9hZClcbiAgICAgIHRoaXMuanNvblNvY2tldD8uc2VuZCh7dHlwZTogXCJyZWFkeVwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9ydW5Kb2JJbmxpbmUocGF5bG9hZClcbiAgICAgIHZvaWQgdGhpcy5fcmVwb3J0Sm9iUmVzdWx0KHtcbiAgICAgICAgam9iSWQ6IHBheWxvYWQuaWQsXG4gICAgICAgIHN0YXR1czogXCJjb21wbGV0ZWRcIixcbiAgICAgICAgaGFuZGVkT2ZmQXRNczogcGF5bG9hZC5oYW5kZWRPZmZBdE1zLFxuICAgICAgICB3b3JrZXJJZDogcGF5bG9hZC53b3JrZXJJZCB8fCB0aGlzLndvcmtlcklkXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB2b2lkIHRoaXMuX3JlcG9ydEpvYlJlc3VsdCh7XG4gICAgICAgIGpvYklkOiBwYXlsb2FkLmlkLFxuICAgICAgICBzdGF0dXM6IFwiZmFpbGVkXCIsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBoYW5kZWRPZmZBdE1zOiBwYXlsb2FkLmhhbmRlZE9mZkF0TXMsXG4gICAgICAgIHdvcmtlcklkOiBwYXlsb2FkLndvcmtlcklkIHx8IHRoaXMud29ya2VySWRcbiAgICAgIH0pXG4gICAgfVxuICAgIHRoaXMuanNvblNvY2tldD8uc2VuZCh7dHlwZTogXCJyZWFkeVwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYlBheWxvYWR9IHBheWxvYWQgLSBQYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGRvbmUuXG4gICAqL1xuICBhc3luYyBfcnVuSm9iSW5saW5lKHBheWxvYWQpIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5jb25maWd1cmF0aW9uXG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJCYWNrZ3JvdW5kIGpvYnMgd29ya2VyIGNvbmZpZ3VyYXRpb24gbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICBjb25zdCByZWdpc3RyeSA9IG5ldyBCYWNrZ3JvdW5kSm9iUmVnaXN0cnkoe2NvbmZpZ3VyYXRpb259KVxuICAgIGF3YWl0IHJlZ2lzdHJ5LmxvYWQoKVxuICAgIGNvbnN0IEpvYkNsYXNzID0gcmVnaXN0cnkuZ2V0Sm9iQnlOYW1lKHBheWxvYWQuam9iTmFtZSlcbiAgICBjb25zdCBqb2JJbnN0YW5jZSA9IG5ldyBKb2JDbGFzcygpXG4gICAgLyoqIEB0eXBlIHsoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8dm9pZD59ICovXG4gICAgY29uc3QgcGVyZm9ybSA9IGpvYkluc3RhbmNlLnBlcmZvcm1cblxuICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24ud2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHBlcmZvcm0uYXBwbHkoam9iSW5zdGFuY2UsIHBheWxvYWQuYXJncyB8fCBbXSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iUGF5bG9hZH0gcGF5bG9hZCAtIFBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gc3Bhd25lZC5cbiAgICovXG4gIGFzeW5jIF9zcGF3bkRldGFjaGVkSm9iKHBheWxvYWQpIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5jb25maWd1cmF0aW9uXG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJCYWNrZ3JvdW5kIGpvYnMgd29ya2VyIGNvbmZpZ3VyYXRpb24gbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICBjb25zdCBkaXJlY3RvcnkgPSBjb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpXG4gICAgY29uc3QgYXJndkNvbW1hbmQgPSBwcm9jZXNzLmFyZ3ZbMV1cbiAgICBjb25zdCBjb21tYW5kID0gYXJndkNvbW1hbmQgPyBhcmd2Q29tbWFuZCA6IGAke2RpcmVjdG9yeX0vYmluL3ZlbG9jaW91cy5qc2BcbiAgICBjb25zdCBlbmNvZGVkUGF5bG9hZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKS50b1N0cmluZyhcImJhc2U2NFwiKVxuICAgIGNvbnN0IGJhY2tncm91bmRKb2JzQ29uZmlnID0gY29uZmlndXJhdGlvbi5nZXRCYWNrZ3JvdW5kSm9ic0NvbmZpZygpXG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihwcm9jZXNzLmV4ZWNQYXRoLCBbY29tbWFuZCwgXCJiYWNrZ3JvdW5kLWpvYnMtcnVubmVyXCJdLCB7XG4gICAgICBjd2Q6IGRpcmVjdG9yeSxcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc3RkaW86IFwiaWdub3JlXCIsXG4gICAgICBlbnY6IE9iamVjdC5hc3NpZ24oe30sIHByb2Nlc3MuZW52LCB7XG4gICAgICAgIFZFTE9DSU9VU19CQUNLR1JPVU5EX0pPQlNfSE9TVDogYmFja2dyb3VuZEpvYnNDb25maWcuaG9zdCxcbiAgICAgICAgVkVMT0NJT1VTX0JBQ0tHUk9VTkRfSk9CU19QT1JUOiBgJHtiYWNrZ3JvdW5kSm9ic0NvbmZpZy5wb3J0fWAsXG4gICAgICAgIFZFTE9DSU9VU19KT0JfUEFZTE9BRDogZW5jb2RlZFBheWxvYWRcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGNoaWxkLnVucmVmKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmpvYklkIC0gSm9iIGlkLlxuICAgKiBAcGFyYW0ge1wiY29tcGxldGVkXCIgfCBcImZhaWxlZFwifSBhcmdzLnN0YXR1cyAtIFN0YXR1cy5cbiAgICogQHBhcmFtIHt1bmtub3dufSBbYXJncy5lcnJvcl0gLSBFcnJvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmhhbmRlZE9mZkF0TXNdIC0gSGFuZGVkIG9mZiB0aW1lc3RhbXAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy53b3JrZXJJZF0gLSBXb3JrZXIgaWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gcmVwb3J0ZWQuXG4gICAqL1xuICBhc3luYyBfcmVwb3J0Sm9iUmVzdWx0KHtqb2JJZCwgc3RhdHVzLCBlcnJvciwgaGFuZGVkT2ZmQXRNcywgd29ya2VySWR9KSB7XG4gICAgaWYgKCF0aGlzLnN0YXR1c1JlcG9ydGVyKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnN0YXR1c1JlcG9ydGVyLnJlcG9ydFdpdGhSZXRyeSh7am9iSWQsIHN0YXR1cywgZXJyb3IsIGhhbmRlZE9mZkF0TXMsIHdvcmtlcklkfSlcbiAgICB9IGNhdGNoIChyZXBvcnRFcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkJhY2tncm91bmQgam9iIHN0YXR1cyByZXBvcnRpbmcgZmFpbGVkOlwiLCByZXBvcnRFcnJvcilcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -75,6 +75,16 @@ export default class VelociousWebsocketClient {
|
|
|
75
75
|
_sessionId: string | null;
|
|
76
76
|
/** @type {boolean} - true between a reconnect and the session-resumed / session-gone reply. */
|
|
77
77
|
_awaitingResume: boolean;
|
|
78
|
+
/** @type {boolean} - true once the current socket has an active session ready for app messages. */
|
|
79
|
+
_sessionReady: boolean;
|
|
80
|
+
/** @type {string | null} - provisional session id announced before a resume attempt finishes. */
|
|
81
|
+
_pendingSessionId: string | null;
|
|
82
|
+
/** @type {Promise<void> | null} */
|
|
83
|
+
_sessionReadyPromise: Promise<void> | null;
|
|
84
|
+
/** @type {(() => void) | null} */
|
|
85
|
+
_resolveSessionReady: (() => void) | null;
|
|
86
|
+
/** @type {unknown | null} */
|
|
87
|
+
_sessionReadyError: unknown | null;
|
|
78
88
|
/** @type {{get: () => string | null | undefined | Promise<string | null | undefined>, set: (sessionId: string) => void | Promise<void>, clear: () => void | Promise<void>} | undefined} */
|
|
79
89
|
_sessionStore: {
|
|
80
90
|
get: () => string | null | undefined | Promise<string | null | undefined>;
|
|
@@ -98,6 +108,8 @@ export default class VelociousWebsocketClient {
|
|
|
98
108
|
_waitingForOnline: boolean;
|
|
99
109
|
/** @returns {boolean} */
|
|
100
110
|
isOpen(): boolean;
|
|
111
|
+
/** @returns {boolean} */
|
|
112
|
+
isSessionReady(): boolean;
|
|
101
113
|
/**
|
|
102
114
|
* Opens a 1:1 `WebsocketConnection` of the given type against the
|
|
103
115
|
* server. Requires the socket to already be connected (call
|
|
@@ -323,6 +335,15 @@ export default class VelociousWebsocketClient {
|
|
|
323
335
|
* @returns {void}
|
|
324
336
|
*/
|
|
325
337
|
private _clearPersistedSessionId;
|
|
338
|
+
/** @returns {Promise<void>} */
|
|
339
|
+
_waitForSessionReady(): Promise<void>;
|
|
340
|
+
/** @returns {void} */
|
|
341
|
+
_markSessionReady(): void;
|
|
342
|
+
/**
|
|
343
|
+
* @param {unknown} [error]
|
|
344
|
+
* @returns {void}
|
|
345
|
+
*/
|
|
346
|
+
_resetSessionReadyState(error?: unknown): void;
|
|
326
347
|
}
|
|
327
348
|
declare class VelociousWebsocketResponse {
|
|
328
349
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-client.d.ts","sourceRoot":"","sources":["../../../src/http-client/websocket-client.js"],"names":[],"mappings":"AAQA;;;GAGG;AACH;IAQE;;;;;;;;OAQG;IACH,2FAPG;QAAuB,aAAa;QACb,KAAK;QACgI,cAAc;0BAAnJ,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;wBAAc,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG;gBAAC,MAAM,EAAE,MAAM,IAAI,CAAA;aAAC;;QAC3H,eAAe;QACyI,YAAY;iBAA9K,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;iBAAO,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;mBAAS,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;;QACjJ,GAAG;KAC3B,
|
|
1
|
+
{"version":3,"file":"websocket-client.d.ts","sourceRoot":"","sources":["../../../src/http-client/websocket-client.js"],"names":[],"mappings":"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"}
|
|
@@ -58,6 +58,16 @@ export default class VelociousWebsocketClient {
|
|
|
58
58
|
this._sessionId = null;
|
|
59
59
|
/** @type {boolean} - true between a reconnect and the session-resumed / session-gone reply. */
|
|
60
60
|
this._awaitingResume = false;
|
|
61
|
+
/** @type {boolean} - true once the current socket has an active session ready for app messages. */
|
|
62
|
+
this._sessionReady = false;
|
|
63
|
+
/** @type {string | null} - provisional session id announced before a resume attempt finishes. */
|
|
64
|
+
this._pendingSessionId = null;
|
|
65
|
+
/** @type {Promise<void> | null} */
|
|
66
|
+
this._sessionReadyPromise = null;
|
|
67
|
+
/** @type {(() => void) | null} */
|
|
68
|
+
this._resolveSessionReady = null;
|
|
69
|
+
/** @type {unknown | null} */
|
|
70
|
+
this._sessionReadyError = null;
|
|
61
71
|
/** @type {{get: () => string | null | undefined | Promise<string | null | undefined>, set: (sessionId: string) => void | Promise<void>, clear: () => void | Promise<void>} | undefined} */
|
|
62
72
|
this._sessionStore = sessionStore;
|
|
63
73
|
/** @type {boolean} - true once the sessionStore has been consulted for a restored id. */
|
|
@@ -73,6 +83,10 @@ export default class VelociousWebsocketClient {
|
|
|
73
83
|
isOpen() {
|
|
74
84
|
return Boolean(this.socket && this.socket.readyState === this.socket.OPEN);
|
|
75
85
|
}
|
|
86
|
+
/** @returns {boolean} */
|
|
87
|
+
isSessionReady() {
|
|
88
|
+
return this._sessionReady;
|
|
89
|
+
}
|
|
76
90
|
/**
|
|
77
91
|
* Opens a 1:1 `WebsocketConnection` of the given type against the
|
|
78
92
|
* server. Requires the socket to already be connected (call
|
|
@@ -155,16 +169,37 @@ export default class VelociousWebsocketClient {
|
|
|
155
169
|
* @returns {void}
|
|
156
170
|
*/
|
|
157
171
|
_sendChannelSubscribe(subscription) {
|
|
158
|
-
if (!this.isOpen() || !subscription._needsSubscribe())
|
|
172
|
+
if (!this.isOpen() || !this.isSessionReady() || !subscription._needsSubscribe())
|
|
159
173
|
return;
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
174
|
+
// Send first and only mark as sent on success. If the socket
|
|
175
|
+
// closes between `isOpen()` and `send()` and `_sendMessage` throws,
|
|
176
|
+
// `_subscribeSent` must stay false so the reconnect path's
|
|
177
|
+
// `_sendPendingChannelSubscriptions()` can retry.
|
|
178
|
+
try {
|
|
179
|
+
this._sendMessage({
|
|
180
|
+
type: "channel-subscribe",
|
|
181
|
+
subscriptionId: subscription.subscriptionId,
|
|
182
|
+
channelType: subscription.channelType,
|
|
183
|
+
params: subscription.params,
|
|
184
|
+
...(subscription.lastEventId ? { lastEventId: subscription.lastEventId } : {})
|
|
185
|
+
});
|
|
186
|
+
subscription._markSubscribeSent();
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
// Transient closed-socket race: leave the subscription
|
|
190
|
+
// retryable so `_sendPendingChannelSubscriptions()` can resend
|
|
191
|
+
// after reconnect. Rethrow so callers that expect throws on a
|
|
192
|
+
// dead socket still see them.
|
|
193
|
+
if (!this.isOpen())
|
|
194
|
+
throw error;
|
|
195
|
+
// Non-recoverable send failure on an open socket (e.g.
|
|
196
|
+
// `JSON.stringify` failing on BigInt/cyclic params). Close the
|
|
197
|
+
// subscription and remove it from the registry so it cannot
|
|
198
|
+
// poison future `_sendPendingChannelSubscriptions()` loops by
|
|
199
|
+
// throwing on every attempt and aborting later subscriptions.
|
|
200
|
+
this._channelSubscriptions.delete(subscription.subscriptionId);
|
|
201
|
+
subscription._handleClosed(`send_failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
202
|
+
}
|
|
168
203
|
}
|
|
169
204
|
/** @returns {void} */
|
|
170
205
|
_sendPendingChannelSubscriptions() {
|
|
@@ -279,6 +314,7 @@ export default class VelociousWebsocketClient {
|
|
|
279
314
|
return;
|
|
280
315
|
if (this.connectPromise)
|
|
281
316
|
return this.connectPromise;
|
|
317
|
+
this._resetSessionReadyState();
|
|
282
318
|
this._waitingForOnline = false;
|
|
283
319
|
this.connectionAttempts += 1;
|
|
284
320
|
this.connectPromise = new Promise((resolve, reject) => {
|
|
@@ -336,9 +372,7 @@ export default class VelociousWebsocketClient {
|
|
|
336
372
|
if (Object.keys(this._metadata).length > 0) {
|
|
337
373
|
this._sendMessage({ type: "metadata", data: { ...this._metadata } });
|
|
338
374
|
}
|
|
339
|
-
|
|
340
|
-
this._sendPendingChannelSubscriptions();
|
|
341
|
-
}
|
|
375
|
+
await this._waitForSessionReady();
|
|
342
376
|
this.disconnectedSince = null;
|
|
343
377
|
}
|
|
344
378
|
/**
|
|
@@ -355,6 +389,7 @@ export default class VelociousWebsocketClient {
|
|
|
355
389
|
if (this.socket.readyState === this.socket.CLOSED) {
|
|
356
390
|
this.socket = undefined;
|
|
357
391
|
this.connectPromise = undefined;
|
|
392
|
+
this._resetSessionReadyState();
|
|
358
393
|
return;
|
|
359
394
|
}
|
|
360
395
|
await new Promise((resolve) => {
|
|
@@ -363,6 +398,7 @@ export default class VelociousWebsocketClient {
|
|
|
363
398
|
});
|
|
364
399
|
this.socket = undefined;
|
|
365
400
|
this.connectPromise = undefined;
|
|
401
|
+
this._resetSessionReadyState();
|
|
366
402
|
}
|
|
367
403
|
/**
|
|
368
404
|
* Disable auto-reconnect and close the websocket.
|
|
@@ -384,6 +420,7 @@ export default class VelociousWebsocketClient {
|
|
|
384
420
|
this.socket?.close();
|
|
385
421
|
});
|
|
386
422
|
this.connectPromise = undefined;
|
|
423
|
+
this._resetSessionReadyState();
|
|
387
424
|
}
|
|
388
425
|
/**
|
|
389
426
|
* Perform a POST request over the websocket.
|
|
@@ -614,16 +651,23 @@ export default class VelociousWebsocketClient {
|
|
|
614
651
|
}
|
|
615
652
|
}
|
|
616
653
|
else if (type === "session-established") {
|
|
654
|
+
this._pendingSessionId = typeof message.sessionId === "string" ? message.sessionId : null;
|
|
617
655
|
// First connect: cache sessionId for future resume attempts.
|
|
618
656
|
if (!this._awaitingResume) {
|
|
619
|
-
this._sessionId =
|
|
620
|
-
this.
|
|
657
|
+
this._sessionId = this._pendingSessionId;
|
|
658
|
+
if (this._sessionId) {
|
|
659
|
+
this._persistSessionId(this._sessionId);
|
|
660
|
+
}
|
|
661
|
+
this._markSessionReady();
|
|
662
|
+
this._sendPendingChannelSubscriptions();
|
|
621
663
|
}
|
|
622
664
|
}
|
|
623
665
|
else if (type === "session-resumed") {
|
|
624
666
|
this._awaitingResume = false;
|
|
667
|
+
this._pendingSessionId = null;
|
|
625
668
|
this._sessionId = message.sessionId;
|
|
626
669
|
this._persistSessionId(message.sessionId);
|
|
670
|
+
this._markSessionReady();
|
|
627
671
|
this._sendPendingChannelSubscriptions();
|
|
628
672
|
// Fire onResume on every live handle so user code knows the
|
|
629
673
|
// session came back with state intact.
|
|
@@ -635,6 +679,7 @@ export default class VelociousWebsocketClient {
|
|
|
635
679
|
else if (type === "session-gone") {
|
|
636
680
|
this._awaitingResume = false;
|
|
637
681
|
this._sessionId = null;
|
|
682
|
+
this._pendingSessionId = null;
|
|
638
683
|
this._clearPersistedSessionId();
|
|
639
684
|
// Tear down every live handle — their server-side counterparts
|
|
640
685
|
// are gone and nothing can bring them back.
|
|
@@ -646,6 +691,7 @@ export default class VelociousWebsocketClient {
|
|
|
646
691
|
this._channelSubscriptions.clear();
|
|
647
692
|
for (const subscription of subs)
|
|
648
693
|
subscription._handleClosed("session_gone");
|
|
694
|
+
this._markSessionReady();
|
|
649
695
|
}
|
|
650
696
|
else if (type === "error" && message.id) {
|
|
651
697
|
const pending = this.pendingRequests.get(message.id);
|
|
@@ -670,6 +716,7 @@ export default class VelociousWebsocketClient {
|
|
|
670
716
|
*/
|
|
671
717
|
onClose = () => {
|
|
672
718
|
this.disconnectedSince ||= Date.now();
|
|
719
|
+
this._resetSessionReadyState();
|
|
673
720
|
for (const [id, { reject }] of this.pendingRequests.entries()) {
|
|
674
721
|
reject(new Error(`Websocket closed before response for ${id}`));
|
|
675
722
|
}
|
|
@@ -827,6 +874,45 @@ export default class VelociousWebsocketClient {
|
|
|
827
874
|
this._debug("sessionStore.clear failed", error);
|
|
828
875
|
}
|
|
829
876
|
}
|
|
877
|
+
/** @returns {Promise<void>} */
|
|
878
|
+
_waitForSessionReady() {
|
|
879
|
+
if (this._sessionReady)
|
|
880
|
+
return Promise.resolve();
|
|
881
|
+
if (!this._sessionReadyPromise || !this._resolveSessionReady) {
|
|
882
|
+
this._sessionReadyPromise = new Promise((resolve) => {
|
|
883
|
+
this._resolveSessionReady = resolve;
|
|
884
|
+
});
|
|
885
|
+
}
|
|
886
|
+
return this._sessionReadyPromise.then(() => {
|
|
887
|
+
if (this._sessionReadyError) {
|
|
888
|
+
const error = this._sessionReadyError;
|
|
889
|
+
this._sessionReadyError = null;
|
|
890
|
+
throw error;
|
|
891
|
+
}
|
|
892
|
+
});
|
|
893
|
+
}
|
|
894
|
+
/** @returns {void} */
|
|
895
|
+
_markSessionReady() {
|
|
896
|
+
if (this._sessionReady)
|
|
897
|
+
return;
|
|
898
|
+
this._sessionReady = true;
|
|
899
|
+
this._sessionReadyError = null;
|
|
900
|
+
this._resolveSessionReady?.();
|
|
901
|
+
this._resolveSessionReady = null;
|
|
902
|
+
this._sessionReadyPromise = null;
|
|
903
|
+
}
|
|
904
|
+
/**
|
|
905
|
+
* @param {unknown} [error]
|
|
906
|
+
* @returns {void}
|
|
907
|
+
*/
|
|
908
|
+
_resetSessionReadyState(error = new Error("Websocket session readiness was reset")) {
|
|
909
|
+
this._sessionReady = false;
|
|
910
|
+
this._pendingSessionId = null;
|
|
911
|
+
this._sessionReadyError = error;
|
|
912
|
+
this._resolveSessionReady?.();
|
|
913
|
+
this._sessionReadyPromise = null;
|
|
914
|
+
this._resolveSessionReady = null;
|
|
915
|
+
}
|
|
830
916
|
}
|
|
831
917
|
class VelociousWebsocketResponse {
|
|
832
918
|
/**
|
|
@@ -849,4 +935,4 @@ class VelociousWebsocketResponse {
|
|
|
849
935
|
return deserializeFrontendModelTransportValue(JSON.parse(this.body));
|
|
850
936
|
}
|
|
851
937
|
}
|
|
852
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9odHRwLWNsaWVudC93ZWJzb2NrZXQtY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGtDQUFrQyxNQUFNLDJCQUEyQixDQUFBO0FBQzFFLE9BQU8sb0NBQW9DLE1BQU0sd0JBQXdCLENBQUE7QUFDekUsT0FBTyxFQUFDLHNDQUFzQyxFQUFDLE1BQU0sK0NBQStDLENBQUE7QUFFcEcsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUVoRTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLHdCQUF3QjtJQUMzQyx1SEFBdUg7SUFDdkgsZUFBZSxDQUFBO0lBQ2YsK0ZBQStGO0lBQy9GLG9CQUFvQixDQUFBO0lBQ3BCLG9KQUFvSjtJQUNwSixTQUFTLENBQUE7SUFFVDs7Ozs7Ozs7T0FRRztJQUNILFlBQVksRUFBQyxhQUFhLEdBQUcsSUFBSSxFQUFFLEtBQUssR0FBRyxLQUFLLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFDLEdBQUcsRUFBRTtRQUN4RyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUE7UUFFL0Usc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1FBQ2xCLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFBO1FBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUNoQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQUUs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R0FBRyxlQUFlLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQTtRQUNuRCxJQUFJLENBQUMsYUFBYSxHQUFHLGVBQWUsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFBO1FBQzFELElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQTtJQUNsQyxDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLElBQUk7UUFDRixJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUE7UUFDbEQsQ0FBQztRQUVELE9BQU8sc0NBQXNDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUN0RSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IFZlbG9jaW91c1dlYnNvY2tldENsaWVudENvbm5lY3Rpb24gZnJvbSBcIi4vd2Vic29ja2V0LWNvbm5lY3Rpb24uanNcIlxuaW1wb3J0IFZlbG9jaW91c1dlYnNvY2tldENsaWVudFN1YnNjcmlwdGlvbiBmcm9tIFwiLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiXG5pbXBvcnQge2Rlc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlfSBmcm9tIFwiLi4vZnJvbnRlbmQtbW9kZWxzL3RyYW5zcG9ydC1zZXJpYWxpemF0aW9uLmpzXCJcblxuY29uc3QgREVGQVVMVF9SRUNPTk5FQ1RfREVMQVlTID0gWzEwMDAsIDIwMDAsIDQwMDAsIDgwMDAsIDE1MDAwXVxuXG4vKipcbiAqIEEgc21hbGwgd2Vic29ja2V0IGNsaWVudCB0aGF0IG1pcnJvcnMgc2ltcGxlIEhUVFAtc3R5bGUgY2FsbHMgYW5kIGNoYW5uZWwgc3Vic2NyaXB0aW9ucy5cbiAqIFN1cHBvcnRzIG9wdGlvbmFsIGF1dG8tcmVjb25uZWN0IHdpdGggZXhwb25lbnRpYWwgYmFja29mZiBhbmQgbGlzdGVuZXIgcmUtc3Vic2NyaXB0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnQge1xuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHtyZWplY3Q6IChlcnJvcjogdW5rbm93bikgPT4gdm9pZCwgcmVzb2x2ZTogKHJlc3BvbnNlOiBWZWxvY2lvdXNXZWJzb2NrZXRSZXNwb25zZSkgPT4gdm9pZH0+fSAqL1xuICBwZW5kaW5nUmVxdWVzdHNcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB7cmVqZWN0OiAoZXJyb3I6IHVua25vd24pID0+IHZvaWQsIHJlc29sdmU6ICh2YWx1ZT86IHZvaWQpID0+IHZvaWR9Pn0gKi9cbiAgcGVuZGluZ1N1YnNjcmlwdGlvbnNcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB7Y2FsbGJhY2tzOiBTZXQ8KHBheWxvYWQ6IGFueSkgPT4gdm9pZD4sIGNoYW5uZWw6IHN0cmluZywgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkLCByZWFkeTogUHJvbWlzZTx2b2lkPn0+fSAqL1xuICBsaXN0ZW5lcnNcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmF1dG9SZWNvbm5lY3RdIC0gRW5hYmxlIGF1dG8tcmVjb25uZWN0IHdpdGggZXhwb25lbnRpYWwgYmFja29mZi5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5kZWJ1Z10gLSBXaGV0aGVyIGRlYnVnLlxuICAgKiBAcGFyYW0ge3tnZXRJc09ubGluZT86ICgpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+LCBzdWJzY3JpYmU/OiAoY2FsbGJhY2s6IChpc09ubGluZTogYm9vbGVhbikgPT4gdm9pZCkgPT4gKCgpID0+IHZvaWQpIHwge3JlbW92ZTogKCkgPT4gdm9pZH19fSBbYXJncy5uZXR3b3JrTW9uaXRvcl0gLSBPcHRpb25hbCBvbmxpbmUtc3RhdGUgYWRhcHRlci4gV2hlbiBwcm92aWRlZCwgYXV0by1yZWNvbm5lY3QgY2FuIHdhaXQgZm9yIHRoZSBuZXR3b3JrIHRvIHJlcG9ydCBvbmxpbmUgYmVmb3JlIHJlY29ubmVjdGluZywgYW5kIG9wZW4gc29ja2V0cyBhcmUgY2xvc2VkIHdoZW4gdGhlIG1vbml0b3IgcmVwb3J0cyBvZmZsaW5lLlxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbYXJncy5yZWNvbm5lY3REZWxheXNdIC0gQmFja29mZiBkZWxheXMgaW4gbXMgKGRlZmF1bHQ6IFsxMDAwLCAyMDAwLCA0MDAwLCA4MDAwLCAxNTAwMF0pLlxuICAgKiBAcGFyYW0ge3tnZXQ6ICgpID0+IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgfCBQcm9taXNlPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+LCBzZXQ6IChzZXNzaW9uSWQ6IHN0cmluZykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4sIGNsZWFyOiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPn19IFthcmdzLnNlc3Npb25TdG9yZV0gLSBPcHRpb25hbCBzZXNzaW9uSWQgcGVyc2lzdGVuY2UgaG9vay4gV2hlbiBwcm92aWRlZCwgdGhlIGNsaWVudCB3cml0ZXMgZXZlcnkgYHNlc3Npb24tZXN0YWJsaXNoZWRgIC8gYHNlc3Npb24tcmVzdW1lZGAgaWQgdmlhIGBzdG9yZS5zZXQoaWQpYCBhbmQgY2xlYXJzIGl0IG9uIGBzZXNzaW9uLWdvbmVgLiBCZWZvcmUgdGhlIGZpcnN0IGBjb25uZWN0KClgLCB0aGUgY2xpZW50IHJlYWRzIGFueSBwZXJzaXN0ZWQgaWQgdmlhIGBzdG9yZS5nZXQoKWAgYW5kIGF0dGVtcHRzIHJlc3VtcHRpb24uIEFwcHMgc2hvdWxkIGJhY2sgdGhpcyBieSB3aGF0ZXZlciBwZXJzaXN0ZW5jZSBsYXllciBzdXJ2aXZlcyBwYWdlIHJlbG9hZHMgKGxvY2FsU3RvcmFnZSwgYSBjb29raWUsIFNRTGl0ZSwgZXRjLikuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy51cmxdIEZ1bGwgd2Vic29ja2V0IFVSTCAoZGVmYXVsdDogd3M6Ly8xMjcuMC4wLjE6MzAwNi93ZWJzb2NrZXQpXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7YXV0b1JlY29ubmVjdCA9IHRydWUsIGRlYnVnID0gZmFsc2UsIG5ldHdvcmtNb25pdG9yLCByZWNvbm5lY3REZWxheXMsIHNlc3Npb25TdG9yZSwgdXJsfSA9IHt9KSB7XG4gICAgaWYgKCFnbG9iYWxUaGlzLldlYlNvY2tldCkgdGhyb3cgbmV3IEVycm9yKFwiV2ViU29ja2V0IGdsb2JhbCBpcyBub3QgYXZhaWxhYmxlXCIpXG5cbiAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgdGhpcy5hdXRvUmVjb25uZWN0ID0gYXV0b1JlY29ubmVjdFxuICAgIHRoaXMuZGVidWcgPSBkZWJ1Z1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyIHwgbnVsbH0gKi9cbiAgICB0aGlzLmRpc2Nvbm5lY3RlZFNpbmNlID0gbnVsbFxuICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucyA9IG5ldyBNYXAoKVxuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCA9IDBcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLmNvbm5lY3Rpb25BdHRlbXB0cyA9IDBcbiAgICAvKiogQHR5cGUge251bWJlcltdfSAqL1xuICAgIHRoaXMucmVjb25uZWN0RGVsYXlzID0gcmVjb25uZWN0RGVsYXlzIHx8IERFRkFVTFRfUkVDT05ORUNUX0RFTEFZU1xuICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsfSAqL1xuICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBudWxsXG4gICAgdGhpcy51cmwgPSB1cmwgfHwgXCJ3czovLzEyNy4wLjAuMTozMDA2L3dlYnNvY2tldFwiXG4gICAgdGhpcy5saXN0ZW5lcnMgPSBuZXcgTWFwKClcbiAgICB0aGlzLm5leHRJRCA9IDFcbiAgICAvKiogQHR5cGUgeygoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgfCBudWxsfSAqL1xuICAgIHRoaXMub25SZWNvbm5lY3QgPSBudWxsXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgdGhpcy5fbWV0YWRhdGEgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRDb25uZWN0aW9uPn0gKi9cbiAgICB0aGlzLl9jb25uZWN0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRTdWJzY3JpcHRpb24+fSAqL1xuICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zID0gbmV3IE1hcCgpXG5cbiAgICB0aGlzLl9uZXh0Q29ubmVjdGlvbklkU2VxID0gMVxuICAgIHRoaXMuX25leHRTdWJzY3JpcHRpb25JZFNlcSA9IDFcblxuICAgIC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVsbH0gLSBzZXNzaW9uSWQgcmVjZWl2ZWQgZnJvbSBgc2Vzc2lvbi1lc3RhYmxpc2hlZGA7IHNlbnQgb24gcmVjb25uZWN0IGZvciByZXN1bXB0aW9uLiAqL1xuICAgIHRoaXMuX3Nlc3Npb25JZCA9IG51bGxcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gLSB0cnVlIGJldHdlZW4gYSByZWNvbm5lY3QgYW5kIHRoZSBzZXNzaW9uLXJlc3VtZWQgLyBzZXNzaW9uLWdvbmUgcmVwbHkuICovXG4gICAgdGhpcy5fYXdhaXRpbmdSZXN1bWUgPSBmYWxzZVxuXG4gICAgLyoqIEB0eXBlIHt7Z2V0OiAoKSA9PiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPiwgc2V0OiAoc2Vzc2lvbklkOiBzdHJpbmcpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+LCBjbGVhcjogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD59IHwgdW5kZWZpbmVkfSAqL1xuICAgIHRoaXMuX3Nlc3Npb25TdG9yZSA9IHNlc3Npb25TdG9yZVxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gLSB0cnVlIG9uY2UgdGhlIHNlc3Npb25TdG9yZSBoYXMgYmVlbiBjb25zdWx0ZWQgZm9yIGEgcmVzdG9yZWQgaWQuICovXG4gICAgdGhpcy5fc2Vzc2lvblN0b3JlUmVzdG9yZWQgPSBmYWxzZVxuXG4gICAgLyoqIEB0eXBlIHt7Z2V0SXNPbmxpbmU/OiAoKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiwgc3Vic2NyaWJlPzogKGNhbGxiYWNrOiAoaXNPbmxpbmU6IGJvb2xlYW4pID0+IHZvaWQpID0+ICgoKSA9PiB2b2lkKSB8IHtyZW1vdmU6ICgpID0+IHZvaWR9fSB8IHVuZGVmaW5lZH0gKi9cbiAgICB0aGlzLl9uZXR3b3JrTW9uaXRvciA9IG5ldHdvcmtNb25pdG9yXG5cbiAgICAvKiogQHR5cGUge251bGwgfCAoKCkgPT4gdm9pZCkgfCB7cmVtb3ZlOiAoKSA9PiB2b2lkfX0gKi9cbiAgICB0aGlzLl9uZXR3b3JrTW9uaXRvclN1YnNjcmlwdGlvbiA9IG51bGxcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLl93YWl0aW5nRm9yT25saW5lID0gZmFsc2VcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgaXNPcGVuKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IHRoaXMuc29ja2V0Lk9QRU4pXG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYSAxOjEgYFdlYnNvY2tldENvbm5lY3Rpb25gIG9mIHRoZSBnaXZlbiB0eXBlIGFnYWluc3QgdGhlXG4gICAqIHNlcnZlci4gUmVxdWlyZXMgdGhlIHNvY2tldCB0byBhbHJlYWR5IGJlIGNvbm5lY3RlZCAoY2FsbFxuICAgKiBgY29ubmVjdCgpYCBmaXJzdCkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb25uZWN0aW9uVHlwZSAtIE5hbWUgdGhlIHNlcnZlciByZWdpc3RlcmVkIHRoZSBjbGFzcyB1bmRlci5cbiAgICogQHBhcmFtIHt7cGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Piwgb25Db25uZWN0PzogKCkgPT4gdm9pZCwgb25NZXNzYWdlPzogKGJvZHk6IGFueSkgPT4gdm9pZCwgb25EaXNjb25uZWN0PzogKCkgPT4gdm9pZCwgb25SZXN1bWU/OiAoKSA9PiB2b2lkLCBvbkNsb3NlPzogKHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkfX0gW29wdGlvbnNdXG4gICAqIEByZXR1cm5zIHtWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRDb25uZWN0aW9ufVxuICAgKi9cbiAgb3BlbkNvbm5lY3Rpb24oY29ubmVjdGlvblR5cGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc09wZW4oKSkgdGhyb3cgbmV3IEVycm9yKFwiV2Vic29ja2V0IGlzIG5vdCBvcGVuOyBjYWxsIGNvbm5lY3QoKSBmaXJzdFwiKVxuXG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gYGMke3RoaXMuX25leHRDb25uZWN0aW9uSWRTZXErK31gXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRDb25uZWN0aW9uKHtcbiAgICAgIGNsaWVudDogdGhpcyxcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIGNvbm5lY3Rpb25UeXBlLFxuICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyxcbiAgICAgIG9uQ29ubmVjdDogb3B0aW9ucy5vbkNvbm5lY3QsXG4gICAgICBvbk1lc3NhZ2U6IG9wdGlvbnMub25NZXNzYWdlLFxuICAgICAgb25EaXNjb25uZWN0OiBvcHRpb25zLm9uRGlzY29ubmVjdCxcbiAgICAgIG9uUmVzdW1lOiBvcHRpb25zLm9uUmVzdW1lLFxuICAgICAgb25DbG9zZTogb3B0aW9ucy5vbkNsb3NlXG4gICAgfSlcblxuICAgIHRoaXMuX2Nvbm5lY3Rpb25zLnNldChjb25uZWN0aW9uSWQsIGNvbm5lY3Rpb24pXG4gICAgdGhpcy5fc2VuZE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJjb25uZWN0aW9uLW9wZW5cIixcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIGNvbm5lY3Rpb25UeXBlLFxuICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyB8fCB7fVxuICAgIH0pXG5cbiAgICByZXR1cm4gY29ubmVjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIERyb3BzIGEgY29ubmVjdGlvbiBoYW5kbGUgZnJvbSB0aGUgcmVnaXN0cnkuIENhbGxlZCBieVxuICAgKiBgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50Q29ubmVjdGlvbi5jbG9zZSgpYCBhZnRlciBpdCBub3RpZmllc1xuICAgKiB0aGUgc2VydmVyLCBhbmQgYnkgdGhlIHNlc3Npb24tZGVzdHJveWVkIGNsZWFudXAgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbm5lY3Rpb25JZFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZW1vdmVDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCkge1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25zLmRlbGV0ZShjb25uZWN0aW9uSWQpXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byBhIG5hbWVkIFdlYnNvY2tldENoYW5uZWwuIElmIHRoZSBzb2NrZXQgaXMgbm90IHlldFxuICAgKiBvcGVuLCB0aGUgc3Vic2NyaXB0aW9uIGlzIHF1ZXVlZCBhbmQgc2VudCBvbmNlIGEgY29ubmVjdGlvbiBpc1xuICAgKiBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWxUeXBlIC0gTmFtZSB0aGUgc2VydmVyIHJlZ2lzdGVyZWQgdGhlIGNoYW5uZWwgdW5kZXIuXG4gICAqIEBwYXJhbSB7e3BhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIGxhc3RFdmVudElkPzogc3RyaW5nLCBvbk1lc3NhZ2U/OiAoYm9keTogYW55KSA9PiB2b2lkLCBvbkRpc2Nvbm5lY3Q/OiAoKSA9PiB2b2lkLCBvblJlc3VtZT86ICgpID0+IHZvaWQsIG9uQ2xvc2U/OiAocmVhc29uOiBzdHJpbmcpID0+IHZvaWR9fSBbb3B0aW9uc11cbiAgICogQHJldHVybnMge1ZlbG9jaW91c1dlYnNvY2tldENsaWVudFN1YnNjcmlwdGlvbn1cbiAgICovXG4gIHN1YnNjcmliZUNoYW5uZWwoY2hhbm5lbFR5cGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbklkID0gYHMke3RoaXMuX25leHRTdWJzY3JpcHRpb25JZFNlcSsrfWBcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBuZXcgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50U3Vic2NyaXB0aW9uKHtcbiAgICAgIGNsaWVudDogdGhpcyxcbiAgICAgIHN1YnNjcmlwdGlvbklkLFxuICAgICAgY2hhbm5lbFR5cGUsXG4gICAgICBsYXN0RXZlbnRJZDogb3B0aW9ucy5sYXN0RXZlbnRJZCxcbiAgICAgIHBhcmFtczogb3B0aW9ucy5wYXJhbXMsXG4gICAgICBvbk1lc3NhZ2U6IG9wdGlvbnMub25NZXNzYWdlLFxuICAgICAgb25EaXNjb25uZWN0OiBvcHRpb25zLm9uRGlzY29ubmVjdCxcbiAgICAgIG9uUmVzdW1lOiBvcHRpb25zLm9uUmVzdW1lLFxuICAgICAgb25DbG9zZTogb3B0aW9ucy5vbkNsb3NlXG4gICAgfSlcblxuICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnNldChzdWJzY3JpcHRpb25JZCwgc3Vic2NyaXB0aW9uKVxuICAgIHRoaXMuX3NlbmRDaGFubmVsU3Vic2NyaWJlKHN1YnNjcmlwdGlvbilcblxuICAgIHJldHVybiBzdWJzY3JpcHRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3Vic2NyaXB0aW9uSWRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVtb3ZlQ2hhbm5lbFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb25JZCkge1xuICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmRlbGV0ZShzdWJzY3JpcHRpb25JZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1ZlbG9jaW91c1dlYnNvY2tldENsaWVudFN1YnNjcmlwdGlvbn0gc3Vic2NyaXB0aW9uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3NlbmRDaGFubmVsU3Vic2NyaWJlKHN1YnNjcmlwdGlvbikge1xuICAgIGlmICghdGhpcy5pc09wZW4oKSB8fCAhc3Vic2NyaXB0aW9uLl9uZWVkc1N1YnNjcmliZSgpKSByZXR1cm5cblxuICAgIHN1YnNjcmlwdGlvbi5fbWFya1N1YnNjcmliZVNlbnQoKVxuICAgIHRoaXMuX3NlbmRNZXNzYWdlKHtcbiAgICAgIHR5cGU6IFwiY2hhbm5lbC1zdWJzY3JpYmVcIixcbiAgICAgIHN1YnNjcmlwdGlvbklkOiBzdWJzY3JpcHRpb24uc3Vic2NyaXB0aW9uSWQsXG4gICAgICBjaGFubmVsVHlwZTogc3Vic2NyaXB0aW9uLmNoYW5uZWxUeXBlLFxuICAgICAgcGFyYW1zOiBzdWJzY3JpcHRpb24ucGFyYW1zLFxuICAgICAgLi4uKHN1YnNjcmlwdGlvbi5sYXN0RXZlbnRJZCA/IHtsYXN0RXZlbnRJZDogc3Vic2NyaXB0aW9uLmxhc3RFdmVudElkfSA6IHt9KVxuICAgIH0pXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIF9zZW5kUGVuZGluZ0NoYW5uZWxTdWJzY3JpcHRpb25zKCkge1xuICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLl9zZW5kQ2hhbm5lbFN1YnNjcmliZShzdWJzY3JpcHRpb24pXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAqL1xuICBhc3luYyBfaXNPbmxpbmUoKSB7XG4gICAgaWYgKCF0aGlzLl9uZXR3b3JrTW9uaXRvcj8uZ2V0SXNPbmxpbmUpIHJldHVybiB0cnVlXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX25ldHdvcmtNb25pdG9yLmdldElzT25saW5lKCkgIT09IGZhbHNlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwibmV0d29ya01vbml0b3IuZ2V0SXNPbmxpbmUgZmFpbGVkXCIsIGVycm9yKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59ICovXG4gIGFzeW5jIF9zaG91bGRXYWl0Rm9yT25saW5lKCkge1xuICAgIGlmICghdGhpcy5fbmV0d29ya01vbml0b3IpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgaXNPbmxpbmUgPSBhd2FpdCB0aGlzLl9pc09ubGluZSgpXG4gICAgaWYgKGlzT25saW5lKSByZXR1cm4gZmFsc2VcblxuICAgIHRoaXMuX3dhaXRpbmdGb3JPbmxpbmUgPSB0cnVlXG4gICAgdGhpcy5fY2FuY2VsUGVuZGluZ1JlY29ubmVjdCgpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX2Vuc3VyZU5ldHdvcmtNb25pdG9yU3Vic2NyaXB0aW9uKCkge1xuICAgIGlmICghdGhpcy5fbmV0d29ya01vbml0b3I/LnN1YnNjcmliZSB8fCB0aGlzLl9uZXR3b3JrTW9uaXRvclN1YnNjcmlwdGlvbikgcmV0dXJuXG5cbiAgICB0aGlzLl9uZXR3b3JrTW9uaXRvclN1YnNjcmlwdGlvbiA9IHRoaXMuX25ldHdvcmtNb25pdG9yLnN1YnNjcmliZSgoaXNPbmxpbmUpID0+IHtcbiAgICAgIGlmICghdGhpcy5hdXRvUmVjb25uZWN0KSByZXR1cm5cblxuICAgICAgaWYgKGlzT25saW5lKSB7XG4gICAgICAgIGlmICghdGhpcy5fd2FpdGluZ0Zvck9ubGluZSkgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5fd2FpdGluZ0Zvck9ubGluZSA9IGZhbHNlXG4gICAgICAgIHZvaWQgdGhpcy5fYXR0ZW1wdFJlY29ubmVjdCgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLl93YWl0aW5nRm9yT25saW5lID0gdHJ1ZVxuICAgICAgdGhpcy5fY2FuY2VsUGVuZGluZ1JlY29ubmVjdCgpXG5cbiAgICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICAgIHZvaWQgdGhpcy5kcm9wQ29ubmVjdGlvbigpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX3RlYXJkb3duTmV0d29ya01vbml0b3JTdWJzY3JpcHRpb24oKSB7XG4gICAgaWYgKCF0aGlzLl9uZXR3b3JrTW9uaXRvclN1YnNjcmlwdGlvbikgcmV0dXJuXG5cbiAgICBpZiAodHlwZW9mIHRoaXMuX25ldHdvcmtNb25pdG9yU3Vic2NyaXB0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMuX25ldHdvcmtNb25pdG9yU3Vic2NyaXB0aW9uKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbmV0d29ya01vbml0b3JTdWJzY3JpcHRpb24ucmVtb3ZlKClcbiAgICB9XG5cbiAgICB0aGlzLl9uZXR3b3JrTW9uaXRvclN1YnNjcmlwdGlvbiA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgZ2xvYmFsIG1ldGFkYXRhIHZhbHVlIHRoYXQgaXMgc2VudCB0byB0aGUgc2VydmVyLlxuICAgKiBGb3IgV2ViU29ja2V0IGNvbm5lY3Rpb25zLCBhIG1ldGFkYXRhIHVwZGF0ZSBtZXNzYWdlIGlzIHNlbnQgaW1tZWRpYXRlbHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBNZXRhZGF0YSBrZXkuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIE1ldGFkYXRhIHZhbHVlIChudWxsIHRvIGNsZWFyKS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRNZXRhZGF0YShrZXksIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9tZXRhZGF0YVtrZXldXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX21ldGFkYXRhW2tleV0gPSB2YWx1ZVxuICAgIH1cblxuICAgIGlmICh0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSB0aGlzLnNvY2tldC5PUEVOKSB7XG4gICAgICB0aGlzLl9zZW5kTWVzc2FnZSh7dHlwZTogXCJtZXRhZGF0YVwiLCBkYXRhOiB7Li4udGhpcy5fbWV0YWRhdGF9fSlcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gQ3VycmVudCBtZXRhZGF0YS4gKi9cbiAgZ2V0TWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHsuLi50aGlzLl9tZXRhZGF0YX1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgYSB3ZWJzb2NrZXQgY29ubmVjdGlvbiBpcyBvcGVuLlxuICAgKiBBdXRvLXJlY29ubmVjdCBhbmQgb25saW5lIGdhdGluZyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LlxuICAgKiBQYXNzIGBhdXRvUmVjb25uZWN0OiBmYWxzZWAgb3IgYHdhaXRGb3JPbmxpbmU6IGZhbHNlYCBvbmx5IHdoZW4gYSBjYWxsZXJcbiAgICogZXhwbGljaXRseSBuZWVkcyBsb3dlci1sZXZlbCBiZWhhdmlvci5cbiAgICogQHBhcmFtIHt7YXV0b1JlY29ubmVjdD86IGJvb2xlYW4sIHdhaXRGb3JPbmxpbmU/OiBib29sZWFuLCByZXNldFJlY29ubmVjdFN0YXRlPzogYm9vbGVhbn19IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgY29ubmVjdCh7YXV0b1JlY29ubmVjdCA9IHRoaXMuYXV0b1JlY29ubmVjdCwgd2FpdEZvck9ubGluZSA9IHRydWUsIHJlc2V0UmVjb25uZWN0U3RhdGUgPSB0cnVlfSA9IHt9KSB7XG4gICAgdGhpcy5hdXRvUmVjb25uZWN0ID0gYXV0b1JlY29ubmVjdFxuXG4gICAgaWYgKHRoaXMuYXV0b1JlY29ubmVjdCkge1xuICAgICAgdGhpcy5fZW5zdXJlTmV0d29ya01vbml0b3JTdWJzY3JpcHRpb24oKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl93YWl0aW5nRm9yT25saW5lID0gZmFsc2VcbiAgICAgIHRoaXMuX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKVxuICAgICAgdGhpcy5fdGVhcmRvd25OZXR3b3JrTW9uaXRvclN1YnNjcmlwdGlvbigpXG4gICAgfVxuXG4gICAgaWYgKHdhaXRGb3JPbmxpbmUgJiYgdGhpcy5hdXRvUmVjb25uZWN0ICYmICFhd2FpdCB0aGlzLl9pc09ubGluZSgpKSB7XG4gICAgICB0aGlzLl93YWl0aW5nRm9yT25saW5lID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHJlc2V0UmVjb25uZWN0U3RhdGUpIHtcbiAgICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCA9IDBcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuT1BFTikgcmV0dXJuXG4gICAgaWYgKHRoaXMuY29ubmVjdFByb21pc2UpIHJldHVybiB0aGlzLmNvbm5lY3RQcm9taXNlXG5cbiAgICB0aGlzLl93YWl0aW5nRm9yT25saW5lID0gZmFsc2VcbiAgICB0aGlzLmNvbm5lY3Rpb25BdHRlbXB0cyArPSAxXG5cbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KHRoaXMudXJsKVxuXG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9wZW5cIiwgb25PcGVuKVxuICAgICAgICB0aGlzLnNvY2tldD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uRXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uT3BlbiA9ICgpID0+IHtcbiAgICAgICAgY2xlYW51cCgpXG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb25FcnJvciA9ICgvKiogQHR5cGUge0V2ZW50ICYge2Vycm9yPzogdW5rbm93bn19ICovIGV2ZW50KSA9PiB7XG4gICAgICAgIGNsZWFudXAoKVxuICAgICAgICBjb25zdCBlcnJvciA9IGV2ZW50Py5lcnJvciB8fCBuZXcgRXJyb3IoXCJXZWJzb2NrZXQgY29ubmVjdGlvbiBlcnJvclwiKVxuICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJvcGVuXCIsIG9uT3BlbilcbiAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbkVycm9yKVxuICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5vbk1lc3NhZ2UpXG4gICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgdGhpcy5vbkNsb3NlKVxuICAgIH0pXG5cbiAgICBhd2FpdCB0aGlzLmNvbm5lY3RQcm9taXNlXG5cbiAgICAvLyBDb2xkIHJlc3RvcmUgZnJvbSBleHRlcm5hbCBwZXJzaXN0ZW5jZSAoc2Vzc2lvblN0b3JlKSBvbiB0aGVcbiAgICAvLyB2ZXJ5IGZpcnN0IGNvbm5lY3Q6IGFwcHMgd2lyZSB0aGlzIHVwIHRvIHN1cnZpdmUgYSBmdWxsIHBhZ2VcbiAgICAvLyByZWxvYWQuIEFmdGVyIHRoZSBmaXJzdCByZXN0b3JlIGF0dGVtcHQgdGhlIGluLW1lbW9yeSBjYWNoZVxuICAgIC8vIHRha2VzIG92ZXIuXG4gICAgaWYgKCF0aGlzLl9zZXNzaW9uSWQgJiYgIXRoaXMuX3Nlc3Npb25TdG9yZVJlc3RvcmVkICYmIHRoaXMuX3Nlc3Npb25TdG9yZSkge1xuICAgICAgdGhpcy5fc2Vzc2lvblN0b3JlUmVzdG9yZWQgPSB0cnVlXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0b3JlZElkID0gYXdhaXQgdGhpcy5fc2Vzc2lvblN0b3JlLmdldCgpXG5cbiAgICAgICAgaWYgKHR5cGVvZiBzdG9yZWRJZCA9PT0gXCJzdHJpbmdcIiAmJiBzdG9yZWRJZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbklkID0gc3RvcmVkSWRcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fZGVidWcoXCJzZXNzaW9uU3RvcmUuZ2V0IGZhaWxlZFwiLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGEgY2FjaGVkIHNlc3Npb25JZCBmcm9tIGEgcHJpb3IgY29ubmVjdCwgYXNrIHRoZVxuICAgIC8vIHNlcnZlciB0byByZXN1bWUgaXQuIFRoZSBzZXJ2ZXIgcmVwbGllcyB3aXRoIGVpdGhlclxuICAgIC8vIGBzZXNzaW9uLXJlc3VtZWRgIChzdGF0ZSBwcmVzZXJ2ZWQpIG9yIGBzZXNzaW9uLWdvbmVgIChjbGllbnRcbiAgICAvLyBtdXN0IHN0YXJ0IGZyZXNoKTsgdGhlIG1lc3NhZ2UgZGlzcGF0Y2hlciBmaXJlcyB0aGUgYXBwcm9wcmlhdGVcbiAgICAvLyBsaWZlY3ljbGUgaG9va3Mgb24gbGl2ZSBDb25uZWN0aW9uIC8gQ2hhbm5lbCBoYW5kbGVzLlxuICAgIGlmICh0aGlzLl9zZXNzaW9uSWQpIHtcbiAgICAgIHRoaXMuX2F3YWl0aW5nUmVzdW1lID0gdHJ1ZVxuICAgICAgdGhpcy5fc2VuZE1lc3NhZ2Uoe3R5cGU6IFwic2Vzc2lvbi1yZXN1bWVcIiwgc2Vzc2lvbklkOiB0aGlzLl9zZXNzaW9uSWR9KVxuICAgICAgLy8gRmlyZSBvbkRpc2Nvbm5lY3Qgb24gbGl2ZSBoYW5kbGVzIHNvIGFwcHMgY2FuIHBhdXNlIFVJIHdvcmtcbiAgICAgIC8vIHVudGlsIHNlc3Npb24tcmVzdW1lZCAvIHNlc3Npb24tZ29uZSBhcnJpdmVzLlxuICAgICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuX2Nvbm5lY3Rpb25zLnZhbHVlcygpKSBjb25uZWN0aW9uLl9oYW5kbGVEaXNjb25uZWN0ZWQoKVxuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHN1YnNjcmlwdGlvbi5faGFuZGxlRGlzY29ubmVjdGVkKClcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fbWV0YWRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX3NlbmRNZXNzYWdlKHt0eXBlOiBcIm1ldGFkYXRhXCIsIGRhdGE6IHsuLi50aGlzLl9tZXRhZGF0YX19KVxuICAgIH1cblxuICAgIGlmICghdGhpcy5fYXdhaXRpbmdSZXN1bWUpIHtcbiAgICAgIHRoaXMuX3NlbmRQZW5kaW5nQ2hhbm5lbFN1YnNjcmlwdGlvbnMoKVxuICAgIH1cbiAgICB0aGlzLmRpc2Nvbm5lY3RlZFNpbmNlID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSB3ZWJzb2NrZXQgYW5kIGNsZWFyIHBlbmRpbmcgc3RhdGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBjbG9zZSgpIHtcbiAgICB0aGlzLmF1dG9SZWNvbm5lY3QgPSBmYWxzZVxuICAgIHRoaXMuX3dhaXRpbmdGb3JPbmxpbmUgPSBmYWxzZVxuICAgIHRoaXMuX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKVxuICAgIHRoaXMuX3RlYXJkb3duTmV0d29ya01vbml0b3JTdWJzY3JpcHRpb24oKVxuXG4gICAgaWYgKCF0aGlzLnNvY2tldCkgcmV0dXJuXG5cbiAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuQ0xPU0VEKSB7XG4gICAgICB0aGlzLnNvY2tldCA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0Py5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKVxuICAgICAgdGhpcy5zb2NrZXQ/LmNsb3NlKClcbiAgICB9KVxuXG4gICAgdGhpcy5zb2NrZXQgPSB1bmRlZmluZWRcbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBhdXRvLXJlY29ubmVjdCBhbmQgY2xvc2UgdGhlIHdlYnNvY2tldC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBkaXNjb25uZWN0QW5kU3RvcFJlY29ubmVjdCgpIHtcbiAgICBhd2FpdCB0aGlzLmNsb3NlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgcmF3IHNvY2tldCB3aXRob3V0IGRpc2FibGluZyBhdXRvLXJlY29ubmVjdC4gVXNlZCBieSB0ZXN0cyB0b1xuICAgKiBzaW11bGF0ZSBhbiB1bmV4cGVjdGVkIG5ldHdvcmsgZHJvcCBhbmQgdmVyaWZ5IHJlY29ubmVjdGlvbiBiZWhhdmlvci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgc29ja2V0IGhhcyBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBkcm9wQ29ubmVjdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuc29ja2V0KSByZXR1cm5cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnNvY2tldD8uYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsICgpID0+IHJlc29sdmUodW5kZWZpbmVkKSlcbiAgICAgIHRoaXMuc29ja2V0Py5jbG9zZSgpXG4gICAgfSlcblxuICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgUE9TVCByZXF1ZXN0IG92ZXIgdGhlIHdlYnNvY2tldC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICAgKiBAcGFyYW0ge2FueX0gW2JvZHldIC0gUmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0ge3toZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPn19IFtvcHRpb25zXSAtIFJlcXVlc3Qgb3B0aW9ucyBzdWNoIGFzIGhlYWRlcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBwb3N0LlxuICAgKi9cbiAgYXN5bmMgcG9zdChwYXRoLCBib2R5LCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KFwiUE9TVFwiLCBwYXRoLCB7Li4ub3B0aW9ucywgYm9keX0pXG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhIEdFVCByZXF1ZXN0IG92ZXIgdGhlIHdlYnNvY2tldC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICAgKiBAcGFyYW0ge3toZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPn19IFtvcHRpb25zXSAtIFJlcXVlc3Qgb3B0aW9ucyBzdWNoIGFzIGhlYWRlcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBnZXQuXG4gICAqL1xuICBhc3luYyBnZXQocGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucmVxdWVzdChcIkdFVFwiLCBwYXRoLCBvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBhIGNoYW5uZWwgZm9yIHNlcnZlci1zZW50IGV2ZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IGFueSkgPT4gdm9pZH0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMgeygpID0+IHZvaWR9IHVuc3Vic2NyaWJlIGZ1bmN0aW9uXG4gICAqL1xuICBvbihjaGFubmVsLCBjYWxsYmFjaykge1xuICAgIHJldHVybiB0aGlzLnN1YnNjcmliZShjaGFubmVsLCB7fSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHNuYXBzaG90IG9mIHRoZSBjbGllbnQncyBjb25uZWN0aW9uIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7e2Rpc2Nvbm5lY3RlZFNpbmNlOiBudW1iZXIgfCBudWxsLCBpc09wZW46IGJvb2xlYW4sIGxpc3RlbmVyQ291bnQ6IG51bWJlcn19XG4gICAqL1xuICBzdGF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzY29ubmVjdGVkU2luY2U6IHRoaXMuZGlzY29ubmVjdGVkU2luY2UsXG4gICAgICBpc09wZW46ICEhdGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuT1BFTixcbiAgICAgIGxpc3RlbmVyQ291bnQ6IHRoaXMubGlzdGVuZXJzLnNpemUgKyB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5zaXplXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBhIGNoYW5uZWwgZm9yIHNlcnZlci1zZW50IGV2ZW50cyB3aXRoIG9wdGlvbmFsIHBhcmFtcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7e2xhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gb3B0aW9ucyAtIFN1YnNjcmlwdGlvbiBvcHRpb25zLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiBhbnksIG1lc3NhZ2U/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB2b2lkfSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyB7KCgpID0+IHZvaWQpICYge3JlYWR5OiBQcm9taXNlPHZvaWQ+fX0gLSBVbnN1YnNjcmliZSBmdW5jdGlvbiB3aXRoIHJlYWRpbmVzcyBwcm9taXNlLlxuICAgKi9cbiAgc3Vic2NyaWJlKGNoYW5uZWwsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcGFyYW1zID0gb3B0aW9ucz8ucGFyYW1zXG4gICAgY29uc3QgbGFzdEV2ZW50SWQgPSBvcHRpb25zPy5sYXN0RXZlbnRJZFxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbktleSA9IHRoaXMuX3N1YnNjcmlwdGlvbktleShjaGFubmVsLCBwYXJhbXMpXG5cbiAgICBpZiAoIXRoaXMubGlzdGVuZXJzLmhhcyhzdWJzY3JpcHRpb25LZXkpKSB7XG4gICAgICAvKiogQHR5cGUgeygoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIC8qKiBAdHlwZSB7KCh2YWx1ZT86IHZvaWQpID0+IHZvaWQpIHwgdW5kZWZpbmVkfSAqL1xuICAgICAgbGV0IHJlc29sdmVSZWFkeVxuICAgICAgLyoqIEB0eXBlIHsoKGVycm9yOiB1bmtub3duKSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIGxldCByZWplY3RSZWFkeVxuICAgICAgY29uc3QgcmVhZHkgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHJlc29sdmVSZWFkeSA9IHJlc29sdmVcbiAgICAgICAgcmVqZWN0UmVhZHkgPSByZWplY3RcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubGlzdGVuZXJzLnNldChzdWJzY3JpcHRpb25LZXksIHtcbiAgICAgICAgY2FsbGJhY2tzOiBuZXcgU2V0KCksXG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgcmVhZHlcbiAgICAgIH0pXG4gICAgICB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zLnNldChzdWJzY3JpcHRpb25LZXksIHtcbiAgICAgICAgcmVqZWN0OiByZWplY3RSZWFkeSB8fCAoKCkgPT4ge30pLFxuICAgICAgICByZXNvbHZlOiByZXNvbHZlUmVhZHkgfHwgKCgpID0+IHt9KVxuICAgICAgfSlcblxuICAgICAgdm9pZCB0aGlzLmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5fc2VuZE1lc3NhZ2Uoe2NoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXMsIHR5cGU6IFwic3Vic2NyaWJlXCJ9KVxuICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB0aGlzLl9kZWJ1ZyhcIlN1YnNjcmliZSBmYWlsZWRcIiwgZXJyb3IpKVxuICAgIH1cblxuICAgIGNvbnN0IGxpc3RlbmVyRW50cnkgPSB0aGlzLmxpc3RlbmVycy5nZXQoc3Vic2NyaXB0aW9uS2V5KVxuXG4gICAgaWYgKCFsaXN0ZW5lckVudHJ5KSB0aHJvdyBuZXcgRXJyb3IoXCJMaXN0ZW5lcnMgbWFwIG5vdCBpbml0aWFsaXplZFwiKVxuXG4gICAgbGlzdGVuZXJFbnRyeS5jYWxsYmFja3MuYWRkKGNhbGxiYWNrKVxuXG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgICBsaXN0ZW5lckVudHJ5LmNhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spXG5cbiAgICAgIGlmIChsaXN0ZW5lckVudHJ5LmNhbGxiYWNrcy5zaXplID09PSAwKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLmRlbGV0ZShzdWJzY3JpcHRpb25LZXkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdW5zdWJzY3JpYmUucmVhZHkgPSBsaXN0ZW5lckVudHJ5LnJlYWR5XG5cbiAgICByZXR1cm4gdW5zdWJzY3JpYmVcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYSBjaGFubmVsIGFuZCB3YWl0IHVudGlsIHRoZSBzZXJ2ZXIgYWNrbm93bGVkZ2VzIHRoZSBzdWJzY3JpcHRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3tsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Pn19IG9wdGlvbnMgLSBTdWJzY3JpcHRpb24gb3B0aW9ucy5cbiAgICogQHBhcmFtIHsocGF5bG9hZDogYW55LCBtZXNzYWdlPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gdm9pZH0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8KCgpID0+IHZvaWQpICYge3JlYWR5OiBQcm9taXNlPHZvaWQ+fT59IC0gUmVhZHkgdW5zdWJzY3JpYmUgaGFuZGxlLlxuICAgKi9cbiAgYXN5bmMgc3Vic2NyaWJlQW5kV2FpdChjaGFubmVsLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gdGhpcy5zdWJzY3JpYmUoY2hhbm5lbCwgb3B0aW9ucywgY2FsbGJhY2spXG5cbiAgICBhd2FpdCB1bnN1YnNjcmliZS5yZWFkeVxuXG4gICAgcmV0dXJuIHVuc3Vic2NyaWJlXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIEhUVFAgbWV0aG9kLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFBhdGguXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHthbnl9IFtvcHRpb25zLmJvZHldIC0gUmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFtvcHRpb25zLmhlYWRlcnNdIC0gSGVhZGVyIGxpc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdChtZXRob2QsIHBhdGgsIHtib2R5LCBoZWFkZXJzfSA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5jb25uZWN0KClcblxuICAgIGNvbnN0IGlkID0gYHdzLSR7dGhpcy5uZXh0SUQrK31gXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGJvZHksXG4gICAgICBoZWFkZXJzLFxuICAgICAgaWQsXG4gICAgICBtZXRob2QsXG4gICAgICBwYXRoLFxuICAgICAgdHlwZTogXCJyZXF1ZXN0XCJcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuc2V0KGlkLCB7cmVzb2x2ZSwgcmVqZWN0fSlcbiAgICAgIHRoaXMuX3NlbmRNZXNzYWdlKHBheWxvYWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge01lc3NhZ2VFdmVudDxhbnk+fSBldmVudCAtIEV2ZW50IHBheWxvYWQuXG4gICAqL1xuICBvbk1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCByYXcgPSB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiA/IGV2ZW50LmRhdGEgOiBldmVudC5kYXRhPy50b1N0cmluZz8uKClcblxuICAgIGlmICghcmF3KSByZXR1cm5cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBsZXQgbWVzc2FnZVxuXG4gICAgdHJ5IHtcbiAgICAgIG1lc3NhZ2UgPSBKU09OLnBhcnNlKHJhdylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fZGVidWcoXCJGYWlsZWQgdG8gcGFyc2Ugd2Vic29ja2V0IG1lc3NhZ2VcIiwgZXJyb3IpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB7dHlwZX0gPSBtZXNzYWdlXG5cbiAgICBpZiAodHlwZSA9PT0gXCJyZXNwb25zZVwiKSB7XG4gICAgICBjb25zdCB7aWR9ID0gbWVzc2FnZVxuICAgICAgY29uc3QgcGVuZGluZyA9IGlkID8gdGhpcy5wZW5kaW5nUmVxdWVzdHMuZ2V0KGlkKSA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAocGVuZGluZykge1xuICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5kZWxldGUoaWQpXG4gICAgICAgIHBlbmRpbmcucmVzb2x2ZShuZXcgVmVsb2Npb3VzV2Vic29ja2V0UmVzcG9uc2UobWVzc2FnZSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9kZWJ1ZyhgTm8gcGVuZGluZyByZXF1ZXN0IGZvciByZXNwb25zZSBpZCAke2lkfWApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcInN1YnNjcmliZWRcIikge1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uS2V5ID0gdGhpcy5fc3Vic2NyaXB0aW9uS2V5KG1lc3NhZ2UuY2hhbm5lbCwgbWVzc2FnZS5wYXJhbXMpXG4gICAgICBjb25zdCBwZW5kaW5nU3Vic2NyaXB0aW9uID0gdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy5nZXQoc3Vic2NyaXB0aW9uS2V5KVxuXG4gICAgICBpZiAocGVuZGluZ1N1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zLmRlbGV0ZShzdWJzY3JpcHRpb25LZXkpXG4gICAgICAgIHBlbmRpbmdTdWJzY3JpcHRpb24ucmVzb2x2ZSgpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImV2ZW50XCIpIHtcbiAgICAgIGNvbnN0IHtjaGFubmVsLCBwYXlsb2FkfSA9IG1lc3NhZ2VcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXJFbnRyeSBvZiB0aGlzLmxpc3RlbmVycy52YWx1ZXMoKSkge1xuICAgICAgICBpZiAobGlzdGVuZXJFbnRyeS5jaGFubmVsICE9PSBjaGFubmVsKSBjb250aW51ZVxuXG4gICAgICAgIGxpc3RlbmVyRW50cnkuY2FsbGJhY2tzLmZvckVhY2goKC8qKiBAdHlwZSB7KHBheWxvYWQ6IGFueSwgbWVzc2FnZT86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHZvaWR9ICovIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHBheWxvYWQsIG1lc3NhZ2UpXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKFwiTGlzdGVuZXIgZXJyb3JcIiwgZXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJyZXBsYXktZ2FwXCIpIHtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbktleSA9IHRoaXMuX3N1YnNjcmlwdGlvbktleShtZXNzYWdlLmNoYW5uZWwsIG1lc3NhZ2UucGFyYW1zKVxuICAgICAgY29uc3QgcGVuZGluZ1N1YnNjcmlwdGlvbiA9IHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMuZ2V0KHN1YnNjcmlwdGlvbktleSlcblxuICAgICAgaWYgKHBlbmRpbmdTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uS2V5KVxuICAgICAgICBwZW5kaW5nU3Vic2NyaXB0aW9uLnJlamVjdChuZXcgRXJyb3IoYFJlcGxheSBnYXAgZm9yICR7bWVzc2FnZS5jaGFubmVsfWApKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJjb25uZWN0aW9uLW9wZW5lZFwiKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbnMuZ2V0KG1lc3NhZ2UuY29ubmVjdGlvbklkKVxuXG4gICAgICBjb25uZWN0aW9uPy5faGFuZGxlT3BlbmVkKClcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiY29ubmVjdGlvbi1tZXNzYWdlXCIpIHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLl9jb25uZWN0aW9ucy5nZXQobWVzc2FnZS5jb25uZWN0aW9uSWQpXG5cbiAgICAgIGNvbm5lY3Rpb24/Ll9oYW5kbGVNZXNzYWdlKG1lc3NhZ2UuYm9keSlcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiY29ubmVjdGlvbi1jbG9zZWRcIikge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuX2Nvbm5lY3Rpb25zLmdldChtZXNzYWdlLmNvbm5lY3Rpb25JZClcblxuICAgICAgaWYgKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fY29ubmVjdGlvbnMuZGVsZXRlKG1lc3NhZ2UuY29ubmVjdGlvbklkKVxuICAgICAgICBjb25uZWN0aW9uLl9oYW5kbGVDbG9zZWQobWVzc2FnZS5yZWFzb24gfHwgXCJzZXJ2ZXJfY2xvc2VcIilcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiY29ubmVjdGlvbi1lcnJvclwiKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbnMuZ2V0KG1lc3NhZ2UuY29ubmVjdGlvbklkKVxuXG4gICAgICBpZiAoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLl9jb25uZWN0aW9ucy5kZWxldGUobWVzc2FnZS5jb25uZWN0aW9uSWQpXG4gICAgICAgIGNvbm5lY3Rpb24uX2hhbmRsZUNsb3NlZChgZXJyb3I6ICR7bWVzc2FnZS5tZXNzYWdlIHx8IFwiY29ubmVjdGlvbi1lcnJvclwifWApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImNoYW5uZWwtc3Vic2NyaWJlZFwiKSB7XG4gICAgICBjb25zdCBzdWIgPSB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5nZXQobWVzc2FnZS5zdWJzY3JpcHRpb25JZClcblxuICAgICAgc3ViPy5faGFuZGxlU3Vic2NyaWJlZCgpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImNoYW5uZWwtbWVzc2FnZVwiKSB7XG4gICAgICBjb25zdCBzdWIgPSB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5nZXQobWVzc2FnZS5zdWJzY3JpcHRpb25JZClcblxuICAgICAgc3ViPy5faGFuZGxlTWVzc2FnZShtZXNzYWdlLmJvZHkpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImNoYW5uZWwtdW5zdWJzY3JpYmVkXCIpIHtcbiAgICAgIGNvbnN0IHN1YiA9IHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmdldChtZXNzYWdlLnN1YnNjcmlwdGlvbklkKVxuXG4gICAgICBpZiAoc3ViKSB7XG4gICAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmRlbGV0ZShtZXNzYWdlLnN1YnNjcmlwdGlvbklkKVxuICAgICAgICBzdWIuX2hhbmRsZUNsb3NlZChcInNlcnZlcl91bnN1YnNjcmliZVwiKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJjaGFubmVsLWVycm9yXCIpIHtcbiAgICAgIGNvbnN0IHN1YiA9IHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmdldChtZXNzYWdlLnN1YnNjcmlwdGlvbklkKVxuXG4gICAgICBpZiAoc3ViKSB7XG4gICAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmRlbGV0ZShtZXNzYWdlLnN1YnNjcmlwdGlvbklkKVxuICAgICAgICBzdWIuX2hhbmRsZUNsb3NlZChgZXJyb3I6ICR7bWVzc2FnZS5tZXNzYWdlIHx8IFwiY2hhbm5lbC1lcnJvclwifWApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcInNlc3Npb24tZXN0YWJsaXNoZWRcIikge1xuICAgICAgLy8gRmlyc3QgY29ubmVjdDogY2FjaGUgc2Vzc2lvbklkIGZvciBmdXR1cmUgcmVzdW1lIGF0dGVtcHRzLlxuICAgICAgaWYgKCF0aGlzLl9hd2FpdGluZ1Jlc3VtZSkge1xuICAgICAgICB0aGlzLl9zZXNzaW9uSWQgPSBtZXNzYWdlLnNlc3Npb25JZFxuICAgICAgICB0aGlzLl9wZXJzaXN0U2Vzc2lvbklkKG1lc3NhZ2Uuc2Vzc2lvbklkKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJzZXNzaW9uLXJlc3VtZWRcIikge1xuICAgICAgdGhpcy5fYXdhaXRpbmdSZXN1bWUgPSBmYWxzZVxuICAgICAgdGhpcy5fc2Vzc2lvbklkID0gbWVzc2FnZS5zZXNzaW9uSWRcbiAgICAgIHRoaXMuX3BlcnNpc3RTZXNzaW9uSWQobWVzc2FnZS5zZXNzaW9uSWQpXG4gICAgICB0aGlzLl9zZW5kUGVuZGluZ0NoYW5uZWxTdWJzY3JpcHRpb25zKClcbiAgICAgIC8vIEZpcmUgb25SZXN1bWUgb24gZXZlcnkgbGl2ZSBoYW5kbGUgc28gdXNlciBjb2RlIGtub3dzIHRoZVxuICAgICAgLy8gc2Vzc2lvbiBjYW1lIGJhY2sgd2l0aCBzdGF0ZSBpbnRhY3QuXG4gICAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCkpIGNvbm5lY3Rpb24uX2hhbmRsZVJlc3VtZWQoKVxuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHN1YnNjcmlwdGlvbi5faGFuZGxlUmVzdW1lZCgpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcInNlc3Npb24tZ29uZVwiKSB7XG4gICAgICB0aGlzLl9hd2FpdGluZ1Jlc3VtZSA9IGZhbHNlXG4gICAgICB0aGlzLl9zZXNzaW9uSWQgPSBudWxsXG4gICAgICB0aGlzLl9jbGVhclBlcnNpc3RlZFNlc3Npb25JZCgpXG4gICAgICAvLyBUZWFyIGRvd24gZXZlcnkgbGl2ZSBoYW5kbGUg4oCUIHRoZWlyIHNlcnZlci1zaWRlIGNvdW50ZXJwYXJ0c1xuICAgICAgLy8gYXJlIGdvbmUgYW5kIG5vdGhpbmcgY2FuIGJyaW5nIHRoZW0gYmFjay5cbiAgICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gWy4uLnRoaXMuX2Nvbm5lY3Rpb25zLnZhbHVlcygpXVxuICAgICAgdGhpcy5fY29ubmVjdGlvbnMuY2xlYXIoKVxuICAgICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSBjb25uZWN0aW9uLl9oYW5kbGVDbG9zZWQoXCJzZXNzaW9uX2dvbmVcIilcblxuICAgICAgY29uc3Qgc3VicyA9IFsuLi50aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKV1cbiAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmNsZWFyKClcbiAgICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mIHN1YnMpIHN1YnNjcmlwdGlvbi5faGFuZGxlQ2xvc2VkKFwic2Vzc2lvbl9nb25lXCIpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImVycm9yXCIgJiYgbWVzc2FnZS5pZCkge1xuICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1JlcXVlc3RzLmdldChtZXNzYWdlLmlkKVxuXG4gICAgICBpZiAocGVuZGluZykge1xuICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5kZWxldGUobWVzc2FnZS5pZClcbiAgICAgICAgcGVuZGluZy5yZWplY3QobmV3IEVycm9yKG1lc3NhZ2UuZXJyb3IgfHwgXCJVbmtub3duIHdlYnNvY2tldCBlcnJvclwiKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZH0gcGFyYW1zIC0gU3Vic2NyaXB0aW9uIHBhcmFtcy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTdGFibGUgc3Vic2NyaXB0aW9uIGtleS5cbiAgICovXG4gIF9zdWJzY3JpcHRpb25LZXkoY2hhbm5lbCwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFtjaGFubmVsLCBwYXJhbXMgfHwgbnVsbF0pXG4gIH1cblxuICAvKipcbiAgICogUmVqZWN0IGFsbCBwZW5kaW5nIHJlcXVlc3RzIHdoZW4gdGhlIHNvY2tldCBjbG9zZXMuIFNjaGVkdWxlcyByZWNvbm5lY3QgaWYgZW5hYmxlZC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIG9uQ2xvc2UgPSAoKSA9PiB7XG4gICAgdGhpcy5kaXNjb25uZWN0ZWRTaW5jZSB8fD0gRGF0ZS5ub3coKVxuXG4gICAgZm9yIChjb25zdCBbaWQsIHtyZWplY3R9XSBvZiB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5lbnRyaWVzKCkpIHtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoYFdlYnNvY2tldCBjbG9zZWQgYmVmb3JlIHJlc3BvbnNlIGZvciAke2lkfWApKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qge3JlamVjdH0gb2YgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIldlYnNvY2tldCBjbG9zZWQgYmVmb3JlIHN1YnNjcmlwdGlvbiBhY2tub3dsZWRnZW1lbnRcIikpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3Nlc3Npb25JZCAmJiB0aGlzLmF1dG9SZWNvbm5lY3QpIHtcbiAgICAgIC8vIFNlc3Npb24gbWF5IHJlc3VtZSB3aGVuIHdlIHJlY29ubmVjdCDigJQga2VlcCB0aGUgaGFuZGxlcyBhbGl2ZVxuICAgICAgLy8gYW5kIGZpcmUgb25EaXNjb25uZWN0IHNvIHVzZXIgY29kZSBjYW4gcGF1c2UgVUkgd29yay5cbiAgICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKSkgY29ubmVjdGlvbi5faGFuZGxlRGlzY29ubmVjdGVkKClcbiAgICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpKSBzdWJzY3JpcHRpb24uX2hhbmRsZURpc2Nvbm5lY3RlZCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIHJlc3VtZSBwYXRoOiB0ZWFyIGRvd24gZXZlcnkgbGl2ZSBDb25uZWN0aW9uIC8gQ2hhbm5lbCBzdWIuXG4gICAgICBjb25zdCBjb25uZWN0aW9ucyA9IFsuLi50aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKV1cbiAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zLmNsZWFyKClcbiAgICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiBjb25uZWN0aW9ucykge1xuICAgICAgICBjb25uZWN0aW9uLl9oYW5kbGVDbG9zZWQoXCJzZXNzaW9uX2Rlc3Ryb3llZFwiKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGFubmVsU3VicyA9IFsuLi50aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKV1cbiAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmNsZWFyKClcbiAgICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mIGNoYW5uZWxTdWJzKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbi5faGFuZGxlQ2xvc2VkKFwic2Vzc2lvbl9kZXN0cm95ZWRcIilcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2Vzc2lvbklkID0gbnVsbFxuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzLmNsZWFyKClcbiAgICB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zLmNsZWFyKClcbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gdW5kZWZpbmVkXG5cbiAgICBpZiAoIXRoaXMuYXV0b1JlY29ubmVjdCkgcmV0dXJuXG5cbiAgICB2b2lkIHRoaXMuX3Nob3VsZFdhaXRGb3JPbmxpbmUoKS50aGVuKChzaG91bGRXYWl0Rm9yT25saW5lKSA9PiB7XG4gICAgICBpZiAoIXNob3VsZFdhaXRGb3JPbmxpbmUpIHtcbiAgICAgICAgdGhpcy5fc2NoZWR1bGVSZWNvbm5lY3QoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwYXlsb2FkIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9zZW5kTWVzc2FnZShwYXlsb2FkKSB7XG4gICAgaWYgKCF0aGlzLnNvY2tldCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSB0aGlzLnNvY2tldC5PUEVOKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXZWJzb2NrZXQgaXMgbm90IG9wZW5cIilcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcblxuICAgIHRoaXMuX2RlYnVnKFwiU2VuZGluZ1wiLCBqc29uKVxuICAgIHRoaXMuc29ja2V0LnNlbmQoanNvbilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKSB7XG4gICAgaWYgKHRoaXMucmVjb25uZWN0VGltZXIpIHtcbiAgICAgIGdsb2JhbFRoaXMuY2xlYXJUaW1lb3V0KHRoaXMucmVjb25uZWN0VGltZXIpXG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX3NjaGVkdWxlUmVjb25uZWN0KCkge1xuICAgIHRoaXMuX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKVxuXG4gICAgY29uc3QgZGVsYXkgPSB0aGlzLnJlY29ubmVjdERlbGF5c1tNYXRoLm1pbih0aGlzLnJlY29ubmVjdEF0dGVtcHQsIHRoaXMucmVjb25uZWN0RGVsYXlzLmxlbmd0aCAtIDEpXVxuXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IGdsb2JhbFRoaXMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbFxuICAgICAgdm9pZCB0aGlzLl9hdHRlbXB0UmVjb25uZWN0KClcbiAgICB9LCBkZWxheSlcblxuICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCArPSAxXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIF9hdHRlbXB0UmVjb25uZWN0KCkge1xuICAgIGlmICghdGhpcy5hdXRvUmVjb25uZWN0KSByZXR1cm5cblxuICAgIGlmICghYXdhaXQgdGhpcy5faXNPbmxpbmUoKSkge1xuICAgICAgdGhpcy5fd2FpdGluZ0Zvck9ubGluZSA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLl93YWl0aW5nRm9yT25saW5lID0gZmFsc2VcbiAgICAgIHRoaXMuY29ubmVjdGlvbkF0dGVtcHRzICs9IDFcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCh7YXV0b1JlY29ubmVjdDogdGhpcy5hdXRvUmVjb25uZWN0LCByZXNldFJlY29ubmVjdFN0YXRlOiBmYWxzZSwgd2FpdEZvck9ubGluZTogZmFsc2V9KVxuICAgICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0ID0gMFxuICAgICAgdGhpcy5kaXNjb25uZWN0ZWRTaW5jZSA9IG51bGxcbiAgICAgIHRoaXMuX3Jlc3Vic2NyaWJlQWN0aXZlTGlzdGVuZXJzKClcblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9uUmVjb25uZWN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5vblJlY29ubmVjdCgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwiUmVjb25uZWN0IGF0dGVtcHQgZmFpbGVkOlwiLCBlcnJvcilcblxuICAgICAgaWYgKHRoaXMuYXV0b1JlY29ubmVjdCkge1xuICAgICAgICB0aGlzLl9zY2hlZHVsZVJlY29ubmVjdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLXNlbmRzIHN1YnNjcmliZSBtZXNzYWdlcyBmb3IgYWxsIGFjdGl2ZSBsaXN0ZW5lcnMgYWZ0ZXIgcmVjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZXN1YnNjcmliZUFjdGl2ZUxpc3RlbmVycygpIHtcbiAgICBmb3IgKGNvbnN0IFssIGxpc3RlbmVyRW50cnldIG9mIHRoaXMubGlzdGVuZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9zZW5kTWVzc2FnZSh7XG4gICAgICAgICAgY2hhbm5lbDogbGlzdGVuZXJFbnRyeS5jaGFubmVsLFxuICAgICAgICAgIHBhcmFtczogbGlzdGVuZXJFbnRyeS5wYXJhbXMsXG4gICAgICAgICAgdHlwZTogXCJzdWJzY3JpYmVcIlxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fZGVidWcoXCJSZS1zdWJzY3JpYmUgZmFpbGVkOlwiLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9kZWJ1ZyguLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLmRlYnVnKSByZXR1cm5cblxuICAgIGNvbnNvbGUuZGVidWcoXCJbVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50XVwiLCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWQgLSBJZCB0byBwZXJzaXN0IHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgc2Vzc2lvblN0b3JlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9wZXJzaXN0U2Vzc2lvbklkKHNlc3Npb25JZCkge1xuICAgIGlmICghdGhpcy5fc2Vzc2lvblN0b3JlKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9zZXNzaW9uU3RvcmUuc2V0KHNlc3Npb25JZClcblxuICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXN1bHQuY2F0Y2goKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gZXJyb3IpID0+IHRoaXMuX2RlYnVnKFwic2Vzc2lvblN0b3JlLnNldCBmYWlsZWRcIiwgZXJyb3IpKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9kZWJ1ZyhcInNlc3Npb25TdG9yZS5zZXQgZmFpbGVkXCIsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9jbGVhclBlcnNpc3RlZFNlc3Npb25JZCgpIHtcbiAgICBpZiAoIXRoaXMuX3Nlc3Npb25TdG9yZSkgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc2Vzc2lvblN0b3JlLmNsZWFyKClcblxuICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXN1bHQuY2F0Y2goKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gZXJyb3IpID0+IHRoaXMuX2RlYnVnKFwic2Vzc2lvblN0b3JlLmNsZWFyIGZhaWxlZFwiLCBlcnJvcikpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwic2Vzc2lvblN0b3JlLmNsZWFyIGZhaWxlZFwiLCBlcnJvcilcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgVmVsb2Npb3VzV2Vic29ja2V0UmVzcG9uc2Uge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IG1lc3NhZ2UgLSBNZXNzYWdlIHRleHQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgY29uc3QgcmVzcG9uc2VNZXNzYWdlID0gLyoqIEB0eXBlIHt7Ym9keT86IGFueSwgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIGFueT4sIGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCwgc3RhdHVzQ29kZT86IG51bWJlciwgc3RhdHVzTWVzc2FnZT86IHN0cmluZywgdHlwZT86IHN0cmluZ319ICovIChtZXNzYWdlKVxuXG4gICAgdGhpcy5ib2R5ID0gcmVzcG9uc2VNZXNzYWdlLmJvZHlcbiAgICB0aGlzLmhlYWRlcnMgPSByZXNwb25zZU1lc3NhZ2UuaGVhZGVycyB8fCB7fVxuICAgIHRoaXMuaWQgPSByZXNwb25zZU1lc3NhZ2UuaWRcbiAgICB0aGlzLnN0YXR1c0NvZGUgPSByZXNwb25zZU1lc3NhZ2Uuc3RhdHVzQ29kZSB8fCAyMDBcbiAgICB0aGlzLnN0YXR1c01lc3NhZ2UgPSByZXNwb25zZU1lc3NhZ2Uuc3RhdHVzTWVzc2FnZSB8fCBcIk9LXCJcbiAgICB0aGlzLnR5cGUgPSByZXNwb25zZU1lc3NhZ2UudHlwZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHthbnl9IC0gVGhlIGpzb24uICAqL1xuICBqc29uKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5ib2R5ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNwb25zZSBib2R5IGlzIG5vdCBhIHN0cmluZ1wiKVxuICAgIH1cblxuICAgIHJldHVybiBkZXNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZShKU09OLnBhcnNlKHRoaXMuYm9keSkpXG4gIH1cbn1cbiJdfQ==
|
|
938
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9odHRwLWNsaWVudC93ZWJzb2NrZXQtY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGtDQUFrQyxNQUFNLDJCQUEyQixDQUFBO0FBQzFFLE9BQU8sb0NBQW9DLE1BQU0sd0JBQXdCLENBQUE7QUFDekUsT0FBTyxFQUFDLHNDQUFzQyxFQUFDLE1BQU0sK0NBQStDLENBQUE7QUFFcEcsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUVoRTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLHdCQUF3QjtJQUMzQyx1SEFBdUg7SUFDdkgsZUFBZSxDQUFBO0lBQ2YsK0ZBQStGO0lBQy9GLG9CQUFvQixDQUFBO0lBQ3BCLG9KQUFvSjtJQUNwSixTQUFTLENBQUE7SUFFVDs7Ozs7Ozs7T0FRRztJQUNILFlBQVksRUFBQyxhQUFhLEdBQUcsSUFBSSxFQUFFLEtBQUssR0FBRyxLQUFLLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFDLEdBQUcsRUFBRTtRQUN4RyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUE7UUFFL0Usc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1FBQ2xCLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFBO1FBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUNoQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQUUs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QUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDdEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRDb25uZWN0aW9uIGZyb20gXCIuL3dlYnNvY2tldC1jb25uZWN0aW9uLmpzXCJcbmltcG9ydCBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRTdWJzY3JpcHRpb24gZnJvbSBcIi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIlxuaW1wb3J0IHtkZXNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZX0gZnJvbSBcIi4uL2Zyb250ZW5kLW1vZGVscy90cmFuc3BvcnQtc2VyaWFsaXphdGlvbi5qc1wiXG5cbmNvbnN0IERFRkFVTFRfUkVDT05ORUNUX0RFTEFZUyA9IFsxMDAwLCAyMDAwLCA0MDAwLCA4MDAwLCAxNTAwMF1cblxuLyoqXG4gKiBBIHNtYWxsIHdlYnNvY2tldCBjbGllbnQgdGhhdCBtaXJyb3JzIHNpbXBsZSBIVFRQLXN0eWxlIGNhbGxzIGFuZCBjaGFubmVsIHN1YnNjcmlwdGlvbnMuXG4gKiBTdXBwb3J0cyBvcHRpb25hbCBhdXRvLXJlY29ubmVjdCB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYgYW5kIGxpc3RlbmVyIHJlLXN1YnNjcmlwdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50IHtcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB7cmVqZWN0OiAoZXJyb3I6IHVua25vd24pID0+IHZvaWQsIHJlc29sdmU6IChyZXNwb25zZTogVmVsb2Npb3VzV2Vic29ja2V0UmVzcG9uc2UpID0+IHZvaWR9Pn0gKi9cbiAgcGVuZGluZ1JlcXVlc3RzXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywge3JlamVjdDogKGVycm9yOiB1bmtub3duKSA9PiB2b2lkLCByZXNvbHZlOiAodmFsdWU/OiB2b2lkKSA9PiB2b2lkfT59ICovXG4gIHBlbmRpbmdTdWJzY3JpcHRpb25zXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywge2NhbGxiYWNrczogU2V0PChwYXlsb2FkOiBhbnkpID0+IHZvaWQ+LCBjaGFubmVsOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCwgcmVhZHk6IFByb21pc2U8dm9pZD59Pn0gKi9cbiAgbGlzdGVuZXJzXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5hdXRvUmVjb25uZWN0XSAtIEVuYWJsZSBhdXRvLXJlY29ubmVjdCB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZGVidWddIC0gV2hldGhlciBkZWJ1Zy5cbiAgICogQHBhcmFtIHt7Z2V0SXNPbmxpbmU/OiAoKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiwgc3Vic2NyaWJlPzogKGNhbGxiYWNrOiAoaXNPbmxpbmU6IGJvb2xlYW4pID0+IHZvaWQpID0+ICgoKSA9PiB2b2lkKSB8IHtyZW1vdmU6ICgpID0+IHZvaWR9fX0gW2FyZ3MubmV0d29ya01vbml0b3JdIC0gT3B0aW9uYWwgb25saW5lLXN0YXRlIGFkYXB0ZXIuIFdoZW4gcHJvdmlkZWQsIGF1dG8tcmVjb25uZWN0IGNhbiB3YWl0IGZvciB0aGUgbmV0d29yayB0byByZXBvcnQgb25saW5lIGJlZm9yZSByZWNvbm5lY3RpbmcsIGFuZCBvcGVuIHNvY2tldHMgYXJlIGNsb3NlZCB3aGVuIHRoZSBtb25pdG9yIHJlcG9ydHMgb2ZmbGluZS5cbiAgICogQHBhcmFtIHtudW1iZXJbXX0gW2FyZ3MucmVjb25uZWN0RGVsYXlzXSAtIEJhY2tvZmYgZGVsYXlzIGluIG1zIChkZWZhdWx0OiBbMTAwMCwgMjAwMCwgNDAwMCwgODAwMCwgMTUwMDBdKS5cbiAgICogQHBhcmFtIHt7Z2V0OiAoKSA9PiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPiwgc2V0OiAoc2Vzc2lvbklkOiBzdHJpbmcpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+LCBjbGVhcjogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD59fSBbYXJncy5zZXNzaW9uU3RvcmVdIC0gT3B0aW9uYWwgc2Vzc2lvbklkIHBlcnNpc3RlbmNlIGhvb2suIFdoZW4gcHJvdmlkZWQsIHRoZSBjbGllbnQgd3JpdGVzIGV2ZXJ5IGBzZXNzaW9uLWVzdGFibGlzaGVkYCAvIGBzZXNzaW9uLXJlc3VtZWRgIGlkIHZpYSBgc3RvcmUuc2V0KGlkKWAgYW5kIGNsZWFycyBpdCBvbiBgc2Vzc2lvbi1nb25lYC4gQmVmb3JlIHRoZSBmaXJzdCBgY29ubmVjdCgpYCwgdGhlIGNsaWVudCByZWFkcyBhbnkgcGVyc2lzdGVkIGlkIHZpYSBgc3RvcmUuZ2V0KClgIGFuZCBhdHRlbXB0cyByZXN1bXB0aW9uLiBBcHBzIHNob3VsZCBiYWNrIHRoaXMgYnkgd2hhdGV2ZXIgcGVyc2lzdGVuY2UgbGF5ZXIgc3Vydml2ZXMgcGFnZSByZWxvYWRzIChsb2NhbFN0b3JhZ2UsIGEgY29va2llLCBTUUxpdGUsIGV0Yy4pLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudXJsXSBGdWxsIHdlYnNvY2tldCBVUkwgKGRlZmF1bHQ6IHdzOi8vMTI3LjAuMC4xOjMwMDYvd2Vic29ja2V0KVxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2F1dG9SZWNvbm5lY3QgPSB0cnVlLCBkZWJ1ZyA9IGZhbHNlLCBuZXR3b3JrTW9uaXRvciwgcmVjb25uZWN0RGVsYXlzLCBzZXNzaW9uU3RvcmUsIHVybH0gPSB7fSkge1xuICAgIGlmICghZ2xvYmFsVGhpcy5XZWJTb2NrZXQpIHRocm93IG5ldyBFcnJvcihcIldlYlNvY2tldCBnbG9iYWwgaXMgbm90IGF2YWlsYWJsZVwiKVxuXG4gICAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICAgIHRoaXMuYXV0b1JlY29ubmVjdCA9IGF1dG9SZWNvbm5lY3RcbiAgICB0aGlzLmRlYnVnID0gZGVidWdcbiAgICAvKiogQHR5cGUge251bWJlciB8IG51bGx9ICovXG4gICAgdGhpcy5kaXNjb25uZWN0ZWRTaW5jZSA9IG51bGxcbiAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cyA9IG5ldyBNYXAoKVxuICAgIHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMgPSBuZXcgTWFwKClcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLnJlY29ubmVjdEF0dGVtcHQgPSAwXG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5jb25uZWN0aW9uQXR0ZW1wdHMgPSAwXG4gICAgLyoqIEB0eXBlIHtudW1iZXJbXX0gKi9cbiAgICB0aGlzLnJlY29ubmVjdERlbGF5cyA9IHJlY29ubmVjdERlbGF5cyB8fCBERUZBVUxUX1JFQ09OTkVDVF9ERUxBWVNcbiAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbH0gKi9cbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbFxuICAgIHRoaXMudXJsID0gdXJsIHx8IFwid3M6Ly8xMjcuMC4wLjE6MzAwNi93ZWJzb2NrZXRcIlxuICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5uZXh0SUQgPSAxXG4gICAgLyoqIEB0eXBlIHsoKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHwgbnVsbH0gKi9cbiAgICB0aGlzLm9uUmVjb25uZWN0ID0gbnVsbFxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIHRoaXMuX21ldGFkYXRhID0ge31cblxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50Q29ubmVjdGlvbj59ICovXG4gICAgdGhpcy5fY29ubmVjdGlvbnMgPSBuZXcgTWFwKClcblxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50U3Vic2NyaXB0aW9uPn0gKi9cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgdGhpcy5fbmV4dENvbm5lY3Rpb25JZFNlcSA9IDFcbiAgICB0aGlzLl9uZXh0U3Vic2NyaXB0aW9uSWRTZXEgPSAxXG5cbiAgICAvKiogQHR5cGUge3N0cmluZyB8IG51bGx9IC0gc2Vzc2lvbklkIHJlY2VpdmVkIGZyb20gYHNlc3Npb24tZXN0YWJsaXNoZWRgOyBzZW50IG9uIHJlY29ubmVjdCBmb3IgcmVzdW1wdGlvbi4gKi9cbiAgICB0aGlzLl9zZXNzaW9uSWQgPSBudWxsXG5cbiAgICAvKiogQHR5cGUge2Jvb2xlYW59IC0gdHJ1ZSBiZXR3ZWVuIGEgcmVjb25uZWN0IGFuZCB0aGUgc2Vzc2lvbi1yZXN1bWVkIC8gc2Vzc2lvbi1nb25lIHJlcGx5LiAqL1xuICAgIHRoaXMuX2F3YWl0aW5nUmVzdW1lID0gZmFsc2VcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gLSB0cnVlIG9uY2UgdGhlIGN1cnJlbnQgc29ja2V0IGhhcyBhbiBhY3RpdmUgc2Vzc2lvbiByZWFkeSBmb3IgYXBwIG1lc3NhZ2VzLiAqL1xuICAgIHRoaXMuX3Nlc3Npb25SZWFkeSA9IGZhbHNlXG5cbiAgICAvKiogQHR5cGUge3N0cmluZyB8IG51bGx9IC0gcHJvdmlzaW9uYWwgc2Vzc2lvbiBpZCBhbm5vdW5jZWQgYmVmb3JlIGEgcmVzdW1lIGF0dGVtcHQgZmluaXNoZXMuICovXG4gICAgdGhpcy5fcGVuZGluZ1Nlc3Npb25JZCA9IG51bGxcblxuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IG51bGx9ICovXG4gICAgdGhpcy5fc2Vzc2lvblJlYWR5UHJvbWlzZSA9IG51bGxcblxuICAgIC8qKiBAdHlwZSB7KCgpID0+IHZvaWQpIHwgbnVsbH0gKi9cbiAgICB0aGlzLl9yZXNvbHZlU2Vzc2lvblJlYWR5ID0gbnVsbFxuXG4gICAgLyoqIEB0eXBlIHt1bmtub3duIHwgbnVsbH0gKi9cbiAgICB0aGlzLl9zZXNzaW9uUmVhZHlFcnJvciA9IG51bGxcblxuICAgIC8qKiBAdHlwZSB7e2dldDogKCkgPT4gc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB8IFByb21pc2U8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4sIHNldDogKHNlc3Npb25JZDogc3RyaW5nKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPiwgY2xlYXI6ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+fSB8IHVuZGVmaW5lZH0gKi9cbiAgICB0aGlzLl9zZXNzaW9uU3RvcmUgPSBzZXNzaW9uU3RvcmVcbiAgICAvKiogQHR5cGUge2Jvb2xlYW59IC0gdHJ1ZSBvbmNlIHRoZSBzZXNzaW9uU3RvcmUgaGFzIGJlZW4gY29uc3VsdGVkIGZvciBhIHJlc3RvcmVkIGlkLiAqL1xuICAgIHRoaXMuX3Nlc3Npb25TdG9yZVJlc3RvcmVkID0gZmFsc2VcblxuICAgIC8qKiBAdHlwZSB7e2dldElzT25saW5lPzogKCkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4sIHN1YnNjcmliZT86IChjYWxsYmFjazogKGlzT25saW5lOiBib29sZWFuKSA9PiB2b2lkKSA9PiAoKCkgPT4gdm9pZCkgfCB7cmVtb3ZlOiAoKSA9PiB2b2lkfX0gfCB1bmRlZmluZWR9ICovXG4gICAgdGhpcy5fbmV0d29ya01vbml0b3IgPSBuZXR3b3JrTW9uaXRvclxuXG4gICAgLyoqIEB0eXBlIHtudWxsIHwgKCgpID0+IHZvaWQpIHwge3JlbW92ZTogKCkgPT4gdm9pZH19ICovXG4gICAgdGhpcy5fbmV0d29ya01vbml0b3JTdWJzY3JpcHRpb24gPSBudWxsXG5cbiAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgdGhpcy5fd2FpdGluZ0Zvck9ubGluZSA9IGZhbHNlXG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIGlzT3BlbigpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSB0aGlzLnNvY2tldC5PUEVOKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSAqL1xuICBpc1Nlc3Npb25SZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvblJlYWR5XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYSAxOjEgYFdlYnNvY2tldENvbm5lY3Rpb25gIG9mIHRoZSBnaXZlbiB0eXBlIGFnYWluc3QgdGhlXG4gICAqIHNlcnZlci4gUmVxdWlyZXMgdGhlIHNvY2tldCB0byBhbHJlYWR5IGJlIGNvbm5lY3RlZCAoY2FsbFxuICAgKiBgY29ubmVjdCgpYCBmaXJzdCkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb25uZWN0aW9uVHlwZSAtIE5hbWUgdGhlIHNlcnZlciByZWdpc3RlcmVkIHRoZSBjbGFzcyB1bmRlci5cbiAgICogQHBhcmFtIHt7cGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Piwgb25Db25uZWN0PzogKCkgPT4gdm9pZCwgb25NZXNzYWdlPzogKGJvZHk6IGFueSkgPT4gdm9pZCwgb25EaXNjb25uZWN0PzogKCkgPT4gdm9pZCwgb25SZXN1bWU/OiAoKSA9PiB2b2lkLCBvbkNsb3NlPzogKHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkfX0gW29wdGlvbnNdXG4gICAqIEByZXR1cm5zIHtWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRDb25uZWN0aW9ufVxuICAgKi9cbiAgb3BlbkNvbm5lY3Rpb24oY29ubmVjdGlvblR5cGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc09wZW4oKSkgdGhyb3cgbmV3IEVycm9yKFwiV2Vic29ja2V0IGlzIG5vdCBvcGVuOyBjYWxsIGNvbm5lY3QoKSBmaXJzdFwiKVxuXG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gYGMke3RoaXMuX25leHRDb25uZWN0aW9uSWRTZXErK31gXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRDb25uZWN0aW9uKHtcbiAgICAgIGNsaWVudDogdGhpcyxcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIGNvbm5lY3Rpb25UeXBlLFxuICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyxcbiAgICAgIG9uQ29ubmVjdDogb3B0aW9ucy5vbkNvbm5lY3QsXG4gICAgICBvbk1lc3NhZ2U6IG9wdGlvbnMub25NZXNzYWdlLFxuICAgICAgb25EaXNjb25uZWN0OiBvcHRpb25zLm9uRGlzY29ubmVjdCxcbiAgICAgIG9uUmVzdW1lOiBvcHRpb25zLm9uUmVzdW1lLFxuICAgICAgb25DbG9zZTogb3B0aW9ucy5vbkNsb3NlXG4gICAgfSlcblxuICAgIHRoaXMuX2Nvbm5lY3Rpb25zLnNldChjb25uZWN0aW9uSWQsIGNvbm5lY3Rpb24pXG4gICAgdGhpcy5fc2VuZE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJjb25uZWN0aW9uLW9wZW5cIixcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIGNvbm5lY3Rpb25UeXBlLFxuICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyB8fCB7fVxuICAgIH0pXG5cbiAgICByZXR1cm4gY29ubmVjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIERyb3BzIGEgY29ubmVjdGlvbiBoYW5kbGUgZnJvbSB0aGUgcmVnaXN0cnkuIENhbGxlZCBieVxuICAgKiBgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50Q29ubmVjdGlvbi5jbG9zZSgpYCBhZnRlciBpdCBub3RpZmllc1xuICAgKiB0aGUgc2VydmVyLCBhbmQgYnkgdGhlIHNlc3Npb24tZGVzdHJveWVkIGNsZWFudXAgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbm5lY3Rpb25JZFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZW1vdmVDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCkge1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25zLmRlbGV0ZShjb25uZWN0aW9uSWQpXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byBhIG5hbWVkIFdlYnNvY2tldENoYW5uZWwuIElmIHRoZSBzb2NrZXQgaXMgbm90IHlldFxuICAgKiBvcGVuLCB0aGUgc3Vic2NyaXB0aW9uIGlzIHF1ZXVlZCBhbmQgc2VudCBvbmNlIGEgY29ubmVjdGlvbiBpc1xuICAgKiBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWxUeXBlIC0gTmFtZSB0aGUgc2VydmVyIHJlZ2lzdGVyZWQgdGhlIGNoYW5uZWwgdW5kZXIuXG4gICAqIEBwYXJhbSB7e3BhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIGxhc3RFdmVudElkPzogc3RyaW5nLCBvbk1lc3NhZ2U/OiAoYm9keTogYW55KSA9PiB2b2lkLCBvbkRpc2Nvbm5lY3Q/OiAoKSA9PiB2b2lkLCBvblJlc3VtZT86ICgpID0+IHZvaWQsIG9uQ2xvc2U/OiAocmVhc29uOiBzdHJpbmcpID0+IHZvaWR9fSBbb3B0aW9uc11cbiAgICogQHJldHVybnMge1ZlbG9jaW91c1dlYnNvY2tldENsaWVudFN1YnNjcmlwdGlvbn1cbiAgICovXG4gIHN1YnNjcmliZUNoYW5uZWwoY2hhbm5lbFR5cGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbklkID0gYHMke3RoaXMuX25leHRTdWJzY3JpcHRpb25JZFNlcSsrfWBcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBuZXcgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50U3Vic2NyaXB0aW9uKHtcbiAgICAgIGNsaWVudDogdGhpcyxcbiAgICAgIHN1YnNjcmlwdGlvbklkLFxuICAgICAgY2hhbm5lbFR5cGUsXG4gICAgICBsYXN0RXZlbnRJZDogb3B0aW9ucy5sYXN0RXZlbnRJZCxcbiAgICAgIHBhcmFtczogb3B0aW9ucy5wYXJhbXMsXG4gICAgICBvbk1lc3NhZ2U6IG9wdGlvbnMub25NZXNzYWdlLFxuICAgICAgb25EaXNjb25uZWN0OiBvcHRpb25zLm9uRGlzY29ubmVjdCxcbiAgICAgIG9uUmVzdW1lOiBvcHRpb25zLm9uUmVzdW1lLFxuICAgICAgb25DbG9zZTogb3B0aW9ucy5vbkNsb3NlXG4gICAgfSlcblxuICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnNldChzdWJzY3JpcHRpb25JZCwgc3Vic2NyaXB0aW9uKVxuICAgIHRoaXMuX3NlbmRDaGFubmVsU3Vic2NyaWJlKHN1YnNjcmlwdGlvbilcblxuICAgIHJldHVybiBzdWJzY3JpcHRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3Vic2NyaXB0aW9uSWRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVtb3ZlQ2hhbm5lbFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb25JZCkge1xuICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmRlbGV0ZShzdWJzY3JpcHRpb25JZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1ZlbG9jaW91c1dlYnNvY2tldENsaWVudFN1YnNjcmlwdGlvbn0gc3Vic2NyaXB0aW9uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3NlbmRDaGFubmVsU3Vic2NyaWJlKHN1YnNjcmlwdGlvbikge1xuICAgIGlmICghdGhpcy5pc09wZW4oKSB8fCAhdGhpcy5pc1Nlc3Npb25SZWFkeSgpIHx8ICFzdWJzY3JpcHRpb24uX25lZWRzU3Vic2NyaWJlKCkpIHJldHVyblxuXG4gICAgLy8gU2VuZCBmaXJzdCBhbmQgb25seSBtYXJrIGFzIHNlbnQgb24gc3VjY2Vzcy4gSWYgdGhlIHNvY2tldFxuICAgIC8vIGNsb3NlcyBiZXR3ZWVuIGBpc09wZW4oKWAgYW5kIGBzZW5kKClgIGFuZCBgX3NlbmRNZXNzYWdlYCB0aHJvd3MsXG4gICAgLy8gYF9zdWJzY3JpYmVTZW50YCBtdXN0IHN0YXkgZmFsc2Ugc28gdGhlIHJlY29ubmVjdCBwYXRoJ3NcbiAgICAvLyBgX3NlbmRQZW5kaW5nQ2hhbm5lbFN1YnNjcmlwdGlvbnMoKWAgY2FuIHJldHJ5LlxuICAgIHRyeSB7XG4gICAgICB0aGlzLl9zZW5kTWVzc2FnZSh7XG4gICAgICAgIHR5cGU6IFwiY2hhbm5lbC1zdWJzY3JpYmVcIixcbiAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHN1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25JZCxcbiAgICAgICAgY2hhbm5lbFR5cGU6IHN1YnNjcmlwdGlvbi5jaGFubmVsVHlwZSxcbiAgICAgICAgcGFyYW1zOiBzdWJzY3JpcHRpb24ucGFyYW1zLFxuICAgICAgICAuLi4oc3Vic2NyaXB0aW9uLmxhc3RFdmVudElkID8ge2xhc3RFdmVudElkOiBzdWJzY3JpcHRpb24ubGFzdEV2ZW50SWR9IDoge30pXG4gICAgICB9KVxuICAgICAgc3Vic2NyaXB0aW9uLl9tYXJrU3Vic2NyaWJlU2VudCgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFRyYW5zaWVudCBjbG9zZWQtc29ja2V0IHJhY2U6IGxlYXZlIHRoZSBzdWJzY3JpcHRpb25cbiAgICAgIC8vIHJldHJ5YWJsZSBzbyBgX3NlbmRQZW5kaW5nQ2hhbm5lbFN1YnNjcmlwdGlvbnMoKWAgY2FuIHJlc2VuZFxuICAgICAgLy8gYWZ0ZXIgcmVjb25uZWN0LiBSZXRocm93IHNvIGNhbGxlcnMgdGhhdCBleHBlY3QgdGhyb3dzIG9uIGFcbiAgICAgIC8vIGRlYWQgc29ja2V0IHN0aWxsIHNlZSB0aGVtLlxuICAgICAgaWYgKCF0aGlzLmlzT3BlbigpKSB0aHJvdyBlcnJvclxuXG4gICAgICAvLyBOb24tcmVjb3ZlcmFibGUgc2VuZCBmYWlsdXJlIG9uIGFuIG9wZW4gc29ja2V0IChlLmcuXG4gICAgICAvLyBgSlNPTi5zdHJpbmdpZnlgIGZhaWxpbmcgb24gQmlnSW50L2N5Y2xpYyBwYXJhbXMpLiBDbG9zZSB0aGVcbiAgICAgIC8vIHN1YnNjcmlwdGlvbiBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHJlZ2lzdHJ5IHNvIGl0IGNhbm5vdFxuICAgICAgLy8gcG9pc29uIGZ1dHVyZSBgX3NlbmRQZW5kaW5nQ2hhbm5lbFN1YnNjcmlwdGlvbnMoKWAgbG9vcHMgYnlcbiAgICAgIC8vIHRocm93aW5nIG9uIGV2ZXJ5IGF0dGVtcHQgYW5kIGFib3J0aW5nIGxhdGVyIHN1YnNjcmlwdGlvbnMuXG4gICAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uLnN1YnNjcmlwdGlvbklkKVxuICAgICAgc3Vic2NyaXB0aW9uLl9oYW5kbGVDbG9zZWQoYHNlbmRfZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX3NlbmRQZW5kaW5nQ2hhbm5lbFN1YnNjcmlwdGlvbnMoKSB7XG4gICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIHRoaXMuX3NlbmRDaGFubmVsU3Vic2NyaWJlKHN1YnNjcmlwdGlvbilcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59ICovXG4gIGFzeW5jIF9pc09ubGluZSgpIHtcbiAgICBpZiAoIXRoaXMuX25ldHdvcmtNb25pdG9yPy5nZXRJc09ubGluZSkgcmV0dXJuIHRydWVcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fbmV0d29ya01vbml0b3IuZ2V0SXNPbmxpbmUoKSAhPT0gZmFsc2VcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fZGVidWcoXCJuZXR3b3JrTW9uaXRvci5nZXRJc09ubGluZSBmYWlsZWRcIiwgZXJyb3IpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gKi9cbiAgYXN5bmMgX3Nob3VsZFdhaXRGb3JPbmxpbmUoKSB7XG4gICAgaWYgKCF0aGlzLl9uZXR3b3JrTW9uaXRvcikgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBpc09ubGluZSA9IGF3YWl0IHRoaXMuX2lzT25saW5lKClcbiAgICBpZiAoaXNPbmxpbmUpIHJldHVybiBmYWxzZVxuXG4gICAgdGhpcy5fd2FpdGluZ0Zvck9ubGluZSA9IHRydWVcbiAgICB0aGlzLl9jYW5jZWxQZW5kaW5nUmVjb25uZWN0KClcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBfZW5zdXJlTmV0d29ya01vbml0b3JTdWJzY3JpcHRpb24oKSB7XG4gICAgaWYgKCF0aGlzLl9uZXR3b3JrTW9uaXRvcj8uc3Vic2NyaWJlIHx8IHRoaXMuX25ldHdvcmtNb25pdG9yU3Vic2NyaXB0aW9uKSByZXR1cm5cblxuICAgIHRoaXMuX25ldHdvcmtNb25pdG9yU3Vic2NyaXB0aW9uID0gdGhpcy5fbmV0d29ya01vbml0b3Iuc3Vic2NyaWJlKChpc09ubGluZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmF1dG9SZWNvbm5lY3QpIHJldHVyblxuXG4gICAgICBpZiAoaXNPbmxpbmUpIHtcbiAgICAgICAgaWYgKCF0aGlzLl93YWl0aW5nRm9yT25saW5lKSByZXR1cm5cblxuICAgICAgICB0aGlzLl93YWl0aW5nRm9yT25saW5lID0gZmFsc2VcbiAgICAgICAgdm9pZCB0aGlzLl9hdHRlbXB0UmVjb25uZWN0KClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3dhaXRpbmdGb3JPbmxpbmUgPSB0cnVlXG4gICAgICB0aGlzLl9jYW5jZWxQZW5kaW5nUmVjb25uZWN0KClcblxuICAgICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgICAgdm9pZCB0aGlzLmRyb3BDb25uZWN0aW9uKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBfdGVhcmRvd25OZXR3b3JrTW9uaXRvclN1YnNjcmlwdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuX25ldHdvcmtNb25pdG9yU3Vic2NyaXB0aW9uKSByZXR1cm5cblxuICAgIGlmICh0eXBlb2YgdGhpcy5fbmV0d29ya01vbml0b3JTdWJzY3JpcHRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5fbmV0d29ya01vbml0b3JTdWJzY3JpcHRpb24oKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9uZXR3b3JrTW9uaXRvclN1YnNjcmlwdGlvbi5yZW1vdmUoKVxuICAgIH1cblxuICAgIHRoaXMuX25ldHdvcmtNb25pdG9yU3Vic2NyaXB0aW9uID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBnbG9iYWwgbWV0YWRhdGEgdmFsdWUgdGhhdCBpcyBzZW50IHRvIHRoZSBzZXJ2ZXIuXG4gICAqIEZvciBXZWJTb2NrZXQgY29ubmVjdGlvbnMsIGEgbWV0YWRhdGEgdXBkYXRlIG1lc3NhZ2UgaXMgc2VudCBpbW1lZGlhdGVseS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIE1ldGFkYXRhIGtleS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gTWV0YWRhdGEgdmFsdWUgKG51bGwgdG8gY2xlYXIpLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldE1ldGFkYXRhKGtleSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVsZXRlIHRoaXMuX21ldGFkYXRhW2tleV1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbWV0YWRhdGFba2V5XSA9IHZhbHVlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IHRoaXMuc29ja2V0Lk9QRU4pIHtcbiAgICAgIHRoaXMuX3NlbmRNZXNzYWdlKHt0eXBlOiBcIm1ldGFkYXRhXCIsIGRhdGE6IHsuLi50aGlzLl9tZXRhZGF0YX19KVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBDdXJyZW50IG1ldGFkYXRhLiAqL1xuICBnZXRNZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gey4uLnRoaXMuX21ldGFkYXRhfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBhIHdlYnNvY2tldCBjb25uZWN0aW9uIGlzIG9wZW4uXG4gICAqIEF1dG8tcmVjb25uZWN0IGFuZCBvbmxpbmUgZ2F0aW5nIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuXG4gICAqIFBhc3MgYGF1dG9SZWNvbm5lY3Q6IGZhbHNlYCBvciBgd2FpdEZvck9ubGluZTogZmFsc2VgIG9ubHkgd2hlbiBhIGNhbGxlclxuICAgKiBleHBsaWNpdGx5IG5lZWRzIGxvd2VyLWxldmVsIGJlaGF2aW9yLlxuICAgKiBAcGFyYW0ge3thdXRvUmVjb25uZWN0PzogYm9vbGVhbiwgd2FpdEZvck9ubGluZT86IGJvb2xlYW4sIHJlc2V0UmVjb25uZWN0U3RhdGU/OiBib29sZWFufX0gW29wdGlvbnNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBjb25uZWN0KHthdXRvUmVjb25uZWN0ID0gdGhpcy5hdXRvUmVjb25uZWN0LCB3YWl0Rm9yT25saW5lID0gdHJ1ZSwgcmVzZXRSZWNvbm5lY3RTdGF0ZSA9IHRydWV9ID0ge30pIHtcbiAgICB0aGlzLmF1dG9SZWNvbm5lY3QgPSBhdXRvUmVjb25uZWN0XG5cbiAgICBpZiAodGhpcy5hdXRvUmVjb25uZWN0KSB7XG4gICAgICB0aGlzLl9lbnN1cmVOZXR3b3JrTW9uaXRvclN1YnNjcmlwdGlvbigpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3dhaXRpbmdGb3JPbmxpbmUgPSBmYWxzZVxuICAgICAgdGhpcy5fY2FuY2VsUGVuZGluZ1JlY29ubmVjdCgpXG4gICAgICB0aGlzLl90ZWFyZG93bk5ldHdvcmtNb25pdG9yU3Vic2NyaXB0aW9uKClcbiAgICB9XG5cbiAgICBpZiAod2FpdEZvck9ubGluZSAmJiB0aGlzLmF1dG9SZWNvbm5lY3QgJiYgIWF3YWl0IHRoaXMuX2lzT25saW5lKCkpIHtcbiAgICAgIHRoaXMuX3dhaXRpbmdGb3JPbmxpbmUgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAocmVzZXRSZWNvbm5lY3RTdGF0ZSkge1xuICAgICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0ID0gMFxuICAgIH1cblxuICAgIGlmICh0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSB0aGlzLnNvY2tldC5PUEVOKSByZXR1cm5cbiAgICBpZiAodGhpcy5jb25uZWN0UHJvbWlzZSkgcmV0dXJuIHRoaXMuY29ubmVjdFByb21pc2VcblxuICAgIHRoaXMuX3Jlc2V0U2Vzc2lvblJlYWR5U3RhdGUoKVxuICAgIHRoaXMuX3dhaXRpbmdGb3JPbmxpbmUgPSBmYWxzZVxuICAgIHRoaXMuY29ubmVjdGlvbkF0dGVtcHRzICs9IDFcblxuICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQodGhpcy51cmwpXG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc29ja2V0Py5yZW1vdmVFdmVudExpc3RlbmVyKFwib3BlblwiLCBvbk9wZW4pXG4gICAgICAgIHRoaXMuc29ja2V0Py5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25FcnJvcilcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb25PcGVuID0gKCkgPT4ge1xuICAgICAgICBjbGVhbnVwKClcbiAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICB9XG4gICAgICBjb25zdCBvbkVycm9yID0gKC8qKiBAdHlwZSB7RXZlbnQgJiB7ZXJyb3I/OiB1bmtub3dufX0gKi8gZXZlbnQpID0+IHtcbiAgICAgICAgY2xlYW51cCgpXG4gICAgICAgIGNvbnN0IGVycm9yID0gZXZlbnQ/LmVycm9yIHx8IG5ldyBFcnJvcihcIldlYnNvY2tldCBjb25uZWN0aW9uIGVycm9yXCIpXG4gICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm9wZW5cIiwgb25PcGVuKVxuICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uRXJyb3IpXG4gICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLm9uTWVzc2FnZSlcbiAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCB0aGlzLm9uQ2xvc2UpXG4gICAgfSlcblxuICAgIGF3YWl0IHRoaXMuY29ubmVjdFByb21pc2VcblxuICAgIC8vIENvbGQgcmVzdG9yZSBmcm9tIGV4dGVybmFsIHBlcnNpc3RlbmNlIChzZXNzaW9uU3RvcmUpIG9uIHRoZVxuICAgIC8vIHZlcnkgZmlyc3QgY29ubmVjdDogYXBwcyB3aXJlIHRoaXMgdXAgdG8gc3Vydml2ZSBhIGZ1bGwgcGFnZVxuICAgIC8vIHJlbG9hZC4gQWZ0ZXIgdGhlIGZpcnN0IHJlc3RvcmUgYXR0ZW1wdCB0aGUgaW4tbWVtb3J5IGNhY2hlXG4gICAgLy8gdGFrZXMgb3Zlci5cbiAgICBpZiAoIXRoaXMuX3Nlc3Npb25JZCAmJiAhdGhpcy5fc2Vzc2lvblN0b3JlUmVzdG9yZWQgJiYgdGhpcy5fc2Vzc2lvblN0b3JlKSB7XG4gICAgICB0aGlzLl9zZXNzaW9uU3RvcmVSZXN0b3JlZCA9IHRydWVcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RvcmVkSWQgPSBhd2FpdCB0aGlzLl9zZXNzaW9uU3RvcmUuZ2V0KClcblxuICAgICAgICBpZiAodHlwZW9mIHN0b3JlZElkID09PSBcInN0cmluZ1wiICYmIHN0b3JlZElkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLl9zZXNzaW9uSWQgPSBzdG9yZWRJZFxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9kZWJ1ZyhcInNlc3Npb25TdG9yZS5nZXQgZmFpbGVkXCIsIGVycm9yKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgYSBjYWNoZWQgc2Vzc2lvbklkIGZyb20gYSBwcmlvciBjb25uZWN0LCBhc2sgdGhlXG4gICAgLy8gc2VydmVyIHRvIHJlc3VtZSBpdC4gVGhlIHNlcnZlciByZXBsaWVzIHdpdGggZWl0aGVyXG4gICAgLy8gYHNlc3Npb24tcmVzdW1lZGAgKHN0YXRlIHByZXNlcnZlZCkgb3IgYHNlc3Npb24tZ29uZWAgKGNsaWVudFxuICAgIC8vIG11c3Qgc3RhcnQgZnJlc2gpOyB0aGUgbWVzc2FnZSBkaXNwYXRjaGVyIGZpcmVzIHRoZSBhcHByb3ByaWF0ZVxuICAgIC8vIGxpZmVjeWNsZSBob29rcyBvbiBsaXZlIENvbm5lY3Rpb24gLyBDaGFubmVsIGhhbmRsZXMuXG4gICAgaWYgKHRoaXMuX3Nlc3Npb25JZCkge1xuICAgICAgdGhpcy5fYXdhaXRpbmdSZXN1bWUgPSB0cnVlXG4gICAgICB0aGlzLl9zZW5kTWVzc2FnZSh7dHlwZTogXCJzZXNzaW9uLXJlc3VtZVwiLCBzZXNzaW9uSWQ6IHRoaXMuX3Nlc3Npb25JZH0pXG4gICAgICAvLyBGaXJlIG9uRGlzY29ubmVjdCBvbiBsaXZlIGhhbmRsZXMgc28gYXBwcyBjYW4gcGF1c2UgVUkgd29ya1xuICAgICAgLy8gdW50aWwgc2Vzc2lvbi1yZXN1bWVkIC8gc2Vzc2lvbi1nb25lIGFycml2ZXMuXG4gICAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCkpIGNvbm5lY3Rpb24uX2hhbmRsZURpc2Nvbm5lY3RlZCgpXG4gICAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKSkgc3Vic2NyaXB0aW9uLl9oYW5kbGVEaXNjb25uZWN0ZWQoKVxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9tZXRhZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fc2VuZE1lc3NhZ2Uoe3R5cGU6IFwibWV0YWRhdGFcIiwgZGF0YTogey4uLnRoaXMuX21ldGFkYXRhfX0pXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5fd2FpdEZvclNlc3Npb25SZWFkeSgpXG4gICAgdGhpcy5kaXNjb25uZWN0ZWRTaW5jZSA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgd2Vic29ja2V0IGFuZCBjbGVhciBwZW5kaW5nIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgdGhpcy5hdXRvUmVjb25uZWN0ID0gZmFsc2VcbiAgICB0aGlzLl93YWl0aW5nRm9yT25saW5lID0gZmFsc2VcbiAgICB0aGlzLl9jYW5jZWxQZW5kaW5nUmVjb25uZWN0KClcbiAgICB0aGlzLl90ZWFyZG93bk5ldHdvcmtNb25pdG9yU3Vic2NyaXB0aW9uKClcblxuICAgIGlmICghdGhpcy5zb2NrZXQpIHJldHVyblxuXG4gICAgaWYgKHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IHRoaXMuc29ja2V0LkNMT1NFRCkge1xuICAgICAgdGhpcy5zb2NrZXQgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMuX3Jlc2V0U2Vzc2lvblJlYWR5U3RhdGUoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0Py5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKVxuICAgICAgdGhpcy5zb2NrZXQ/LmNsb3NlKClcbiAgICB9KVxuXG4gICAgdGhpcy5zb2NrZXQgPSB1bmRlZmluZWRcbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgdGhpcy5fcmVzZXRTZXNzaW9uUmVhZHlTdGF0ZSgpXG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBhdXRvLXJlY29ubmVjdCBhbmQgY2xvc2UgdGhlIHdlYnNvY2tldC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBkaXNjb25uZWN0QW5kU3RvcFJlY29ubmVjdCgpIHtcbiAgICBhd2FpdCB0aGlzLmNsb3NlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgcmF3IHNvY2tldCB3aXRob3V0IGRpc2FibGluZyBhdXRvLXJlY29ubmVjdC4gVXNlZCBieSB0ZXN0cyB0b1xuICAgKiBzaW11bGF0ZSBhbiB1bmV4cGVjdGVkIG5ldHdvcmsgZHJvcCBhbmQgdmVyaWZ5IHJlY29ubmVjdGlvbiBiZWhhdmlvci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgc29ja2V0IGhhcyBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBkcm9wQ29ubmVjdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuc29ja2V0KSByZXR1cm5cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnNvY2tldD8uYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsICgpID0+IHJlc29sdmUodW5kZWZpbmVkKSlcbiAgICAgIHRoaXMuc29ja2V0Py5jbG9zZSgpXG4gICAgfSlcblxuICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSB1bmRlZmluZWRcbiAgICB0aGlzLl9yZXNldFNlc3Npb25SZWFkeVN0YXRlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgUE9TVCByZXF1ZXN0IG92ZXIgdGhlIHdlYnNvY2tldC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICAgKiBAcGFyYW0ge2FueX0gW2JvZHldIC0gUmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0ge3toZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPn19IFtvcHRpb25zXSAtIFJlcXVlc3Qgb3B0aW9ucyBzdWNoIGFzIGhlYWRlcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBwb3N0LlxuICAgKi9cbiAgYXN5bmMgcG9zdChwYXRoLCBib2R5LCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KFwiUE9TVFwiLCBwYXRoLCB7Li4ub3B0aW9ucywgYm9keX0pXG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhIEdFVCByZXF1ZXN0IG92ZXIgdGhlIHdlYnNvY2tldC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICAgKiBAcGFyYW0ge3toZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPn19IFtvcHRpb25zXSAtIFJlcXVlc3Qgb3B0aW9ucyBzdWNoIGFzIGhlYWRlcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBnZXQuXG4gICAqL1xuICBhc3luYyBnZXQocGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucmVxdWVzdChcIkdFVFwiLCBwYXRoLCBvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBhIGNoYW5uZWwgZm9yIHNlcnZlci1zZW50IGV2ZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IGFueSkgPT4gdm9pZH0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMgeygpID0+IHZvaWR9IHVuc3Vic2NyaWJlIGZ1bmN0aW9uXG4gICAqL1xuICBvbihjaGFubmVsLCBjYWxsYmFjaykge1xuICAgIHJldHVybiB0aGlzLnN1YnNjcmliZShjaGFubmVsLCB7fSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHNuYXBzaG90IG9mIHRoZSBjbGllbnQncyBjb25uZWN0aW9uIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7e2Rpc2Nvbm5lY3RlZFNpbmNlOiBudW1iZXIgfCBudWxsLCBpc09wZW46IGJvb2xlYW4sIGxpc3RlbmVyQ291bnQ6IG51bWJlcn19XG4gICAqL1xuICBzdGF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzY29ubmVjdGVkU2luY2U6IHRoaXMuZGlzY29ubmVjdGVkU2luY2UsXG4gICAgICBpc09wZW46ICEhdGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuT1BFTixcbiAgICAgIGxpc3RlbmVyQ291bnQ6IHRoaXMubGlzdGVuZXJzLnNpemUgKyB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5zaXplXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBhIGNoYW5uZWwgZm9yIHNlcnZlci1zZW50IGV2ZW50cyB3aXRoIG9wdGlvbmFsIHBhcmFtcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7e2xhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gb3B0aW9ucyAtIFN1YnNjcmlwdGlvbiBvcHRpb25zLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiBhbnksIG1lc3NhZ2U/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB2b2lkfSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyB7KCgpID0+IHZvaWQpICYge3JlYWR5OiBQcm9taXNlPHZvaWQ+fX0gLSBVbnN1YnNjcmliZSBmdW5jdGlvbiB3aXRoIHJlYWRpbmVzcyBwcm9taXNlLlxuICAgKi9cbiAgc3Vic2NyaWJlKGNoYW5uZWwsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcGFyYW1zID0gb3B0aW9ucz8ucGFyYW1zXG4gICAgY29uc3QgbGFzdEV2ZW50SWQgPSBvcHRpb25zPy5sYXN0RXZlbnRJZFxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbktleSA9IHRoaXMuX3N1YnNjcmlwdGlvbktleShjaGFubmVsLCBwYXJhbXMpXG5cbiAgICBpZiAoIXRoaXMubGlzdGVuZXJzLmhhcyhzdWJzY3JpcHRpb25LZXkpKSB7XG4gICAgICAvKiogQHR5cGUgeygoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIC8qKiBAdHlwZSB7KCh2YWx1ZT86IHZvaWQpID0+IHZvaWQpIHwgdW5kZWZpbmVkfSAqL1xuICAgICAgbGV0IHJlc29sdmVSZWFkeVxuICAgICAgLyoqIEB0eXBlIHsoKGVycm9yOiB1bmtub3duKSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIGxldCByZWplY3RSZWFkeVxuICAgICAgY29uc3QgcmVhZHkgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHJlc29sdmVSZWFkeSA9IHJlc29sdmVcbiAgICAgICAgcmVqZWN0UmVhZHkgPSByZWplY3RcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubGlzdGVuZXJzLnNldChzdWJzY3JpcHRpb25LZXksIHtcbiAgICAgICAgY2FsbGJhY2tzOiBuZXcgU2V0KCksXG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgcmVhZHlcbiAgICAgIH0pXG4gICAgICB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zLnNldChzdWJzY3JpcHRpb25LZXksIHtcbiAgICAgICAgcmVqZWN0OiByZWplY3RSZWFkeSB8fCAoKCkgPT4ge30pLFxuICAgICAgICByZXNvbHZlOiByZXNvbHZlUmVhZHkgfHwgKCgpID0+IHt9KVxuICAgICAgfSlcblxuICAgICAgdm9pZCB0aGlzLmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5fc2VuZE1lc3NhZ2Uoe2NoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXMsIHR5cGU6IFwic3Vic2NyaWJlXCJ9KVxuICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB0aGlzLl9kZWJ1ZyhcIlN1YnNjcmliZSBmYWlsZWRcIiwgZXJyb3IpKVxuICAgIH1cblxuICAgIGNvbnN0IGxpc3RlbmVyRW50cnkgPSB0aGlzLmxpc3RlbmVycy5nZXQoc3Vic2NyaXB0aW9uS2V5KVxuXG4gICAgaWYgKCFsaXN0ZW5lckVudHJ5KSB0aHJvdyBuZXcgRXJyb3IoXCJMaXN0ZW5lcnMgbWFwIG5vdCBpbml0aWFsaXplZFwiKVxuXG4gICAgbGlzdGVuZXJFbnRyeS5jYWxsYmFja3MuYWRkKGNhbGxiYWNrKVxuXG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgICBsaXN0ZW5lckVudHJ5LmNhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spXG5cbiAgICAgIGlmIChsaXN0ZW5lckVudHJ5LmNhbGxiYWNrcy5zaXplID09PSAwKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLmRlbGV0ZShzdWJzY3JpcHRpb25LZXkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdW5zdWJzY3JpYmUucmVhZHkgPSBsaXN0ZW5lckVudHJ5LnJlYWR5XG5cbiAgICByZXR1cm4gdW5zdWJzY3JpYmVcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYSBjaGFubmVsIGFuZCB3YWl0IHVudGlsIHRoZSBzZXJ2ZXIgYWNrbm93bGVkZ2VzIHRoZSBzdWJzY3JpcHRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3tsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Pn19IG9wdGlvbnMgLSBTdWJzY3JpcHRpb24gb3B0aW9ucy5cbiAgICogQHBhcmFtIHsocGF5bG9hZDogYW55LCBtZXNzYWdlPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gdm9pZH0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8KCgpID0+IHZvaWQpICYge3JlYWR5OiBQcm9taXNlPHZvaWQ+fT59IC0gUmVhZHkgdW5zdWJzY3JpYmUgaGFuZGxlLlxuICAgKi9cbiAgYXN5bmMgc3Vic2NyaWJlQW5kV2FpdChjaGFubmVsLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gdGhpcy5zdWJzY3JpYmUoY2hhbm5lbCwgb3B0aW9ucywgY2FsbGJhY2spXG5cbiAgICBhd2FpdCB1bnN1YnNjcmliZS5yZWFkeVxuXG4gICAgcmV0dXJuIHVuc3Vic2NyaWJlXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIEhUVFAgbWV0aG9kLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFBhdGguXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHthbnl9IFtvcHRpb25zLmJvZHldIC0gUmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFtvcHRpb25zLmhlYWRlcnNdIC0gSGVhZGVyIGxpc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdChtZXRob2QsIHBhdGgsIHtib2R5LCBoZWFkZXJzfSA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5jb25uZWN0KClcblxuICAgIGNvbnN0IGlkID0gYHdzLSR7dGhpcy5uZXh0SUQrK31gXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGJvZHksXG4gICAgICBoZWFkZXJzLFxuICAgICAgaWQsXG4gICAgICBtZXRob2QsXG4gICAgICBwYXRoLFxuICAgICAgdHlwZTogXCJyZXF1ZXN0XCJcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuc2V0KGlkLCB7cmVzb2x2ZSwgcmVqZWN0fSlcbiAgICAgIHRoaXMuX3NlbmRNZXNzYWdlKHBheWxvYWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge01lc3NhZ2VFdmVudDxhbnk+fSBldmVudCAtIEV2ZW50IHBheWxvYWQuXG4gICAqL1xuICBvbk1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCByYXcgPSB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiA/IGV2ZW50LmRhdGEgOiBldmVudC5kYXRhPy50b1N0cmluZz8uKClcblxuICAgIGlmICghcmF3KSByZXR1cm5cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBsZXQgbWVzc2FnZVxuXG4gICAgdHJ5IHtcbiAgICAgIG1lc3NhZ2UgPSBKU09OLnBhcnNlKHJhdylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fZGVidWcoXCJGYWlsZWQgdG8gcGFyc2Ugd2Vic29ja2V0IG1lc3NhZ2VcIiwgZXJyb3IpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB7dHlwZX0gPSBtZXNzYWdlXG5cbiAgICBpZiAodHlwZSA9PT0gXCJyZXNwb25zZVwiKSB7XG4gICAgICBjb25zdCB7aWR9ID0gbWVzc2FnZVxuICAgICAgY29uc3QgcGVuZGluZyA9IGlkID8gdGhpcy5wZW5kaW5nUmVxdWVzdHMuZ2V0KGlkKSA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAocGVuZGluZykge1xuICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5kZWxldGUoaWQpXG4gICAgICAgIHBlbmRpbmcucmVzb2x2ZShuZXcgVmVsb2Npb3VzV2Vic29ja2V0UmVzcG9uc2UobWVzc2FnZSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9kZWJ1ZyhgTm8gcGVuZGluZyByZXF1ZXN0IGZvciByZXNwb25zZSBpZCAke2lkfWApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcInN1YnNjcmliZWRcIikge1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uS2V5ID0gdGhpcy5fc3Vic2NyaXB0aW9uS2V5KG1lc3NhZ2UuY2hhbm5lbCwgbWVzc2FnZS5wYXJhbXMpXG4gICAgICBjb25zdCBwZW5kaW5nU3Vic2NyaXB0aW9uID0gdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy5nZXQoc3Vic2NyaXB0aW9uS2V5KVxuXG4gICAgICBpZiAocGVuZGluZ1N1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zLmRlbGV0ZShzdWJzY3JpcHRpb25LZXkpXG4gICAgICAgIHBlbmRpbmdTdWJzY3JpcHRpb24ucmVzb2x2ZSgpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImV2ZW50XCIpIHtcbiAgICAgIGNvbnN0IHtjaGFubmVsLCBwYXlsb2FkfSA9IG1lc3NhZ2VcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXJFbnRyeSBvZiB0aGlzLmxpc3RlbmVycy52YWx1ZXMoKSkge1xuICAgICAgICBpZiAobGlzdGVuZXJFbnRyeS5jaGFubmVsICE9PSBjaGFubmVsKSBjb250aW51ZVxuXG4gICAgICAgIGxpc3RlbmVyRW50cnkuY2FsbGJhY2tzLmZvckVhY2goKC8qKiBAdHlwZSB7KHBheWxvYWQ6IGFueSwgbWVzc2FnZT86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHZvaWR9ICovIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHBheWxvYWQsIG1lc3NhZ2UpXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKFwiTGlzdGVuZXIgZXJyb3JcIiwgZXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJyZXBsYXktZ2FwXCIpIHtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbktleSA9IHRoaXMuX3N1YnNjcmlwdGlvbktleShtZXNzYWdlLmNoYW5uZWwsIG1lc3NhZ2UucGFyYW1zKVxuICAgICAgY29uc3QgcGVuZGluZ1N1YnNjcmlwdGlvbiA9IHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMuZ2V0KHN1YnNjcmlwdGlvbktleSlcblxuICAgICAgaWYgKHBlbmRpbmdTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uS2V5KVxuICAgICAgICBwZW5kaW5nU3Vic2NyaXB0aW9uLnJlamVjdChuZXcgRXJyb3IoYFJlcGxheSBnYXAgZm9yICR7bWVzc2FnZS5jaGFubmVsfWApKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJjb25uZWN0aW9uLW9wZW5lZFwiKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbnMuZ2V0KG1lc3NhZ2UuY29ubmVjdGlvbklkKVxuXG4gICAgICBjb25uZWN0aW9uPy5faGFuZGxlT3BlbmVkKClcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiY29ubmVjdGlvbi1tZXNzYWdlXCIpIHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLl9jb25uZWN0aW9ucy5nZXQobWVzc2FnZS5jb25uZWN0aW9uSWQpXG5cbiAgICAgIGNvbm5lY3Rpb24/Ll9oYW5kbGVNZXNzYWdlKG1lc3NhZ2UuYm9keSlcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiY29ubmVjdGlvbi1jbG9zZWRcIikge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuX2Nvbm5lY3Rpb25zLmdldChtZXNzYWdlLmNvbm5lY3Rpb25JZClcblxuICAgICAgaWYgKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fY29ubmVjdGlvbnMuZGVsZXRlKG1lc3NhZ2UuY29ubmVjdGlvbklkKVxuICAgICAgICBjb25uZWN0aW9uLl9oYW5kbGVDbG9zZWQobWVzc2FnZS5yZWFzb24gfHwgXCJzZXJ2ZXJfY2xvc2VcIilcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiY29ubmVjdGlvbi1lcnJvclwiKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbnMuZ2V0KG1lc3NhZ2UuY29ubmVjdGlvbklkKVxuXG4gICAgICBpZiAoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLl9jb25uZWN0aW9ucy5kZWxldGUobWVzc2FnZS5jb25uZWN0aW9uSWQpXG4gICAgICAgIGNvbm5lY3Rpb24uX2hhbmRsZUNsb3NlZChgZXJyb3I6ICR7bWVzc2FnZS5tZXNzYWdlIHx8IFwiY29ubmVjdGlvbi1lcnJvclwifWApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImNoYW5uZWwtc3Vic2NyaWJlZFwiKSB7XG4gICAgICBjb25zdCBzdWIgPSB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5nZXQobWVzc2FnZS5zdWJzY3JpcHRpb25JZClcblxuICAgICAgc3ViPy5faGFuZGxlU3Vic2NyaWJlZCgpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImNoYW5uZWwtbWVzc2FnZVwiKSB7XG4gICAgICBjb25zdCBzdWIgPSB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5nZXQobWVzc2FnZS5zdWJzY3JpcHRpb25JZClcblxuICAgICAgc3ViPy5faGFuZGxlTWVzc2FnZShtZXNzYWdlLmJvZHkpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImNoYW5uZWwtdW5zdWJzY3JpYmVkXCIpIHtcbiAgICAgIGNvbnN0IHN1YiA9IHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmdldChtZXNzYWdlLnN1YnNjcmlwdGlvbklkKVxuXG4gICAgICBpZiAoc3ViKSB7XG4gICAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmRlbGV0ZShtZXNzYWdlLnN1YnNjcmlwdGlvbklkKVxuICAgICAgICBzdWIuX2hhbmRsZUNsb3NlZChcInNlcnZlcl91bnN1YnNjcmliZVwiKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJjaGFubmVsLWVycm9yXCIpIHtcbiAgICAgIGNvbnN0IHN1YiA9IHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmdldChtZXNzYWdlLnN1YnNjcmlwdGlvbklkKVxuXG4gICAgICBpZiAoc3ViKSB7XG4gICAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmRlbGV0ZShtZXNzYWdlLnN1YnNjcmlwdGlvbklkKVxuICAgICAgICBzdWIuX2hhbmRsZUNsb3NlZChgZXJyb3I6ICR7bWVzc2FnZS5tZXNzYWdlIHx8IFwiY2hhbm5lbC1lcnJvclwifWApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcInNlc3Npb24tZXN0YWJsaXNoZWRcIikge1xuICAgICAgdGhpcy5fcGVuZGluZ1Nlc3Npb25JZCA9IHR5cGVvZiBtZXNzYWdlLnNlc3Npb25JZCA9PT0gXCJzdHJpbmdcIiA/IG1lc3NhZ2Uuc2Vzc2lvbklkIDogbnVsbFxuXG4gICAgICAvLyBGaXJzdCBjb25uZWN0OiBjYWNoZSBzZXNzaW9uSWQgZm9yIGZ1dHVyZSByZXN1bWUgYXR0ZW1wdHMuXG4gICAgICBpZiAoIXRoaXMuX2F3YWl0aW5nUmVzdW1lKSB7XG4gICAgICAgIHRoaXMuX3Nlc3Npb25JZCA9IHRoaXMuX3BlbmRpbmdTZXNzaW9uSWRcbiAgICAgICAgaWYgKHRoaXMuX3Nlc3Npb25JZCkge1xuICAgICAgICAgIHRoaXMuX3BlcnNpc3RTZXNzaW9uSWQodGhpcy5fc2Vzc2lvbklkKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbWFya1Nlc3Npb25SZWFkeSgpXG4gICAgICAgIHRoaXMuX3NlbmRQZW5kaW5nQ2hhbm5lbFN1YnNjcmlwdGlvbnMoKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJzZXNzaW9uLXJlc3VtZWRcIikge1xuICAgICAgdGhpcy5fYXdhaXRpbmdSZXN1bWUgPSBmYWxzZVxuICAgICAgdGhpcy5fcGVuZGluZ1Nlc3Npb25JZCA9IG51bGxcbiAgICAgIHRoaXMuX3Nlc3Npb25JZCA9IG1lc3NhZ2Uuc2Vzc2lvbklkXG4gICAgICB0aGlzLl9wZXJzaXN0U2Vzc2lvbklkKG1lc3NhZ2Uuc2Vzc2lvbklkKVxuICAgICAgdGhpcy5fbWFya1Nlc3Npb25SZWFkeSgpXG4gICAgICB0aGlzLl9zZW5kUGVuZGluZ0NoYW5uZWxTdWJzY3JpcHRpb25zKClcbiAgICAgIC8vIEZpcmUgb25SZXN1bWUgb24gZXZlcnkgbGl2ZSBoYW5kbGUgc28gdXNlciBjb2RlIGtub3dzIHRoZVxuICAgICAgLy8gc2Vzc2lvbiBjYW1lIGJhY2sgd2l0aCBzdGF0ZSBpbnRhY3QuXG4gICAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCkpIGNvbm5lY3Rpb24uX2hhbmRsZVJlc3VtZWQoKVxuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHN1YnNjcmlwdGlvbi5faGFuZGxlUmVzdW1lZCgpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcInNlc3Npb24tZ29uZVwiKSB7XG4gICAgICB0aGlzLl9hd2FpdGluZ1Jlc3VtZSA9IGZhbHNlXG4gICAgICB0aGlzLl9zZXNzaW9uSWQgPSBudWxsXG4gICAgICB0aGlzLl9wZW5kaW5nU2Vzc2lvbklkID0gbnVsbFxuICAgICAgdGhpcy5fY2xlYXJQZXJzaXN0ZWRTZXNzaW9uSWQoKVxuXG4gICAgICAvLyBUZWFyIGRvd24gZXZlcnkgbGl2ZSBoYW5kbGUg4oCUIHRoZWlyIHNlcnZlci1zaWRlIGNvdW50ZXJwYXJ0c1xuICAgICAgLy8gYXJlIGdvbmUgYW5kIG5vdGhpbmcgY2FuIGJyaW5nIHRoZW0gYmFjay5cbiAgICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gWy4uLnRoaXMuX2Nvbm5lY3Rpb25zLnZhbHVlcygpXVxuICAgICAgdGhpcy5fY29ubmVjdGlvbnMuY2xlYXIoKVxuICAgICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSBjb25uZWN0aW9uLl9oYW5kbGVDbG9zZWQoXCJzZXNzaW9uX2dvbmVcIilcblxuICAgICAgY29uc3Qgc3VicyA9IFsuLi50aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKV1cbiAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmNsZWFyKClcbiAgICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mIHN1YnMpIHN1YnNjcmlwdGlvbi5faGFuZGxlQ2xvc2VkKFwic2Vzc2lvbl9nb25lXCIpXG5cbiAgICAgIHRoaXMuX21hcmtTZXNzaW9uUmVhZHkoKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJlcnJvclwiICYmIG1lc3NhZ2UuaWQpIHtcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5nZXQobWVzc2FnZS5pZClcblxuICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuZGVsZXRlKG1lc3NhZ2UuaWQpXG4gICAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlLmVycm9yIHx8IFwiVW5rbm93biB3ZWJzb2NrZXQgZXJyb3JcIikpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWR9IHBhcmFtcyAtIFN1YnNjcmlwdGlvbiBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RhYmxlIHN1YnNjcmlwdGlvbiBrZXkuXG4gICAqL1xuICBfc3Vic2NyaXB0aW9uS2V5KGNoYW5uZWwsIHBhcmFtcykge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShbY2hhbm5lbCwgcGFyYW1zIHx8IG51bGxdKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlamVjdCBhbGwgcGVuZGluZyByZXF1ZXN0cyB3aGVuIHRoZSBzb2NrZXQgY2xvc2VzLiBTY2hlZHVsZXMgcmVjb25uZWN0IGlmIGVuYWJsZWQuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBvbkNsb3NlID0gKCkgPT4ge1xuICAgIHRoaXMuZGlzY29ubmVjdGVkU2luY2UgfHw9IERhdGUubm93KClcbiAgICB0aGlzLl9yZXNldFNlc3Npb25SZWFkeVN0YXRlKClcblxuICAgIGZvciAoY29uc3QgW2lkLCB7cmVqZWN0fV0gb2YgdGhpcy5wZW5kaW5nUmVxdWVzdHMuZW50cmllcygpKSB7XG4gICAgICByZWplY3QobmV3IEVycm9yKGBXZWJzb2NrZXQgY2xvc2VkIGJlZm9yZSByZXNwb25zZSBmb3IgJHtpZH1gKSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHtyZWplY3R9IG9mIHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJXZWJzb2NrZXQgY2xvc2VkIGJlZm9yZSBzdWJzY3JpcHRpb24gYWNrbm93bGVkZ2VtZW50XCIpKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9zZXNzaW9uSWQgJiYgdGhpcy5hdXRvUmVjb25uZWN0KSB7XG4gICAgICAvLyBTZXNzaW9uIG1heSByZXN1bWUgd2hlbiB3ZSByZWNvbm5lY3Qg4oCUIGtlZXAgdGhlIGhhbmRsZXMgYWxpdmVcbiAgICAgIC8vIGFuZCBmaXJlIG9uRGlzY29ubmVjdCBzbyB1c2VyIGNvZGUgY2FuIHBhdXNlIFVJIHdvcmsuXG4gICAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCkpIGNvbm5lY3Rpb24uX2hhbmRsZURpc2Nvbm5lY3RlZCgpXG4gICAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKSkgc3Vic2NyaXB0aW9uLl9oYW5kbGVEaXNjb25uZWN0ZWQoKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyByZXN1bWUgcGF0aDogdGVhciBkb3duIGV2ZXJ5IGxpdmUgQ29ubmVjdGlvbiAvIENoYW5uZWwgc3ViLlxuICAgICAgY29uc3QgY29ubmVjdGlvbnMgPSBbLi4udGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCldXG4gICAgICB0aGlzLl9jb25uZWN0aW9ucy5jbGVhcigpXG4gICAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgY29ubmVjdGlvbnMpIHtcbiAgICAgICAgY29ubmVjdGlvbi5faGFuZGxlQ2xvc2VkKFwic2Vzc2lvbl9kZXN0cm95ZWRcIilcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hhbm5lbFN1YnMgPSBbLi4udGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCldXG4gICAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5jbGVhcigpXG4gICAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiBjaGFubmVsU3Vicykge1xuICAgICAgICBzdWJzY3JpcHRpb24uX2hhbmRsZUNsb3NlZChcInNlc3Npb25fZGVzdHJveWVkXCIpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3Nlc3Npb25JZCA9IG51bGxcbiAgICB9XG5cbiAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5jbGVhcigpXG4gICAgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy5jbGVhcigpXG4gICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9IHVuZGVmaW5lZFxuXG4gICAgaWYgKCF0aGlzLmF1dG9SZWNvbm5lY3QpIHJldHVyblxuXG4gICAgdm9pZCB0aGlzLl9zaG91bGRXYWl0Rm9yT25saW5lKCkudGhlbigoc2hvdWxkV2FpdEZvck9ubGluZSkgPT4ge1xuICAgICAgaWYgKCFzaG91bGRXYWl0Rm9yT25saW5lKSB7XG4gICAgICAgIHRoaXMuX3NjaGVkdWxlUmVjb25uZWN0KClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfc2VuZE1lc3NhZ2UocGF5bG9hZCkge1xuICAgIGlmICghdGhpcy5zb2NrZXQgfHwgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPT0gdGhpcy5zb2NrZXQuT1BFTikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV2Vic29ja2V0IGlzIG5vdCBvcGVuXCIpXG4gICAgfVxuXG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpXG5cbiAgICB0aGlzLl9kZWJ1ZyhcIlNlbmRpbmdcIiwganNvbilcbiAgICB0aGlzLnNvY2tldC5zZW5kKGpzb24pXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIF9jYW5jZWxQZW5kaW5nUmVjb25uZWN0KCkge1xuICAgIGlmICh0aGlzLnJlY29ubmVjdFRpbWVyKSB7XG4gICAgICBnbG9iYWxUaGlzLmNsZWFyVGltZW91dCh0aGlzLnJlY29ubmVjdFRpbWVyKVxuICAgICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIF9zY2hlZHVsZVJlY29ubmVjdCgpIHtcbiAgICB0aGlzLl9jYW5jZWxQZW5kaW5nUmVjb25uZWN0KClcblxuICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5yZWNvbm5lY3REZWxheXNbTWF0aC5taW4odGhpcy5yZWNvbm5lY3RBdHRlbXB0LCB0aGlzLnJlY29ubmVjdERlbGF5cy5sZW5ndGggLSAxKV1cblxuICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IG51bGxcbiAgICAgIHZvaWQgdGhpcy5fYXR0ZW1wdFJlY29ubmVjdCgpXG4gICAgfSwgZGVsYXkpXG5cbiAgICB0aGlzLnJlY29ubmVjdEF0dGVtcHQgKz0gMVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBfYXR0ZW1wdFJlY29ubmVjdCgpIHtcbiAgICBpZiAoIXRoaXMuYXV0b1JlY29ubmVjdCkgcmV0dXJuXG5cbiAgICBpZiAoIWF3YWl0IHRoaXMuX2lzT25saW5lKCkpIHtcbiAgICAgIHRoaXMuX3dhaXRpbmdGb3JPbmxpbmUgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5fd2FpdGluZ0Zvck9ubGluZSA9IGZhbHNlXG4gICAgICB0aGlzLmNvbm5lY3Rpb25BdHRlbXB0cyArPSAxXG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3Qoe2F1dG9SZWNvbm5lY3Q6IHRoaXMuYXV0b1JlY29ubmVjdCwgcmVzZXRSZWNvbm5lY3RTdGF0ZTogZmFsc2UsIHdhaXRGb3JPbmxpbmU6IGZhbHNlfSlcbiAgICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCA9IDBcbiAgICAgIHRoaXMuZGlzY29ubmVjdGVkU2luY2UgPSBudWxsXG4gICAgICB0aGlzLl9yZXN1YnNjcmliZUFjdGl2ZUxpc3RlbmVycygpXG5cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5vblJlY29ubmVjdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25SZWNvbm5lY3QoKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9kZWJ1ZyhcIlJlY29ubmVjdCBhdHRlbXB0IGZhaWxlZDpcIiwgZXJyb3IpXG5cbiAgICAgIGlmICh0aGlzLmF1dG9SZWNvbm5lY3QpIHtcbiAgICAgICAgdGhpcy5fc2NoZWR1bGVSZWNvbm5lY3QoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1zZW5kcyBzdWJzY3JpYmUgbWVzc2FnZXMgZm9yIGFsbCBhY3RpdmUgbGlzdGVuZXJzIGFmdGVyIHJlY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVzdWJzY3JpYmVBY3RpdmVMaXN0ZW5lcnMoKSB7XG4gICAgZm9yIChjb25zdCBbLCBsaXN0ZW5lckVudHJ5XSBvZiB0aGlzLmxpc3RlbmVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fc2VuZE1lc3NhZ2Uoe1xuICAgICAgICAgIGNoYW5uZWw6IGxpc3RlbmVyRW50cnkuY2hhbm5lbCxcbiAgICAgICAgICBwYXJhbXM6IGxpc3RlbmVyRW50cnkucGFyYW1zLFxuICAgICAgICAgIHR5cGU6IFwic3Vic2NyaWJlXCJcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2RlYnVnKFwiUmUtc3Vic2NyaWJlIGZhaWxlZDpcIiwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBfZGVidWcoLi4uYXJncykge1xuICAgIGlmICghdGhpcy5kZWJ1ZykgcmV0dXJuXG5cbiAgICBjb25zb2xlLmRlYnVnKFwiW1ZlbG9jaW91c1dlYnNvY2tldENsaWVudF1cIiwgLi4uYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvbklkIC0gSWQgdG8gcGVyc2lzdCB0aHJvdWdoIHRoZSBjb25maWd1cmVkIHNlc3Npb25TdG9yZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcGVyc2lzdFNlc3Npb25JZChzZXNzaW9uSWQpIHtcbiAgICBpZiAoIXRoaXMuX3Nlc3Npb25TdG9yZSkgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc2Vzc2lvblN0b3JlLnNldChzZXNzaW9uSWQpXG5cbiAgICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdC50aGVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmVzdWx0LmNhdGNoKCgvKiogQHR5cGUge3Vua25vd259ICovIGVycm9yKSA9PiB0aGlzLl9kZWJ1ZyhcInNlc3Npb25TdG9yZS5zZXQgZmFpbGVkXCIsIGVycm9yKSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fZGVidWcoXCJzZXNzaW9uU3RvcmUuc2V0IGZhaWxlZFwiLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfY2xlYXJQZXJzaXN0ZWRTZXNzaW9uSWQoKSB7XG4gICAgaWYgKCF0aGlzLl9zZXNzaW9uU3RvcmUpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3Nlc3Npb25TdG9yZS5jbGVhcigpXG5cbiAgICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdC50aGVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmVzdWx0LmNhdGNoKCgvKiogQHR5cGUge3Vua25vd259ICovIGVycm9yKSA9PiB0aGlzLl9kZWJ1ZyhcInNlc3Npb25TdG9yZS5jbGVhciBmYWlsZWRcIiwgZXJyb3IpKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9kZWJ1ZyhcInNlc3Npb25TdG9yZS5jbGVhciBmYWlsZWRcIiwgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBfd2FpdEZvclNlc3Npb25SZWFkeSgpIHtcbiAgICBpZiAodGhpcy5fc2Vzc2lvblJlYWR5KSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcblxuICAgIGlmICghdGhpcy5fc2Vzc2lvblJlYWR5UHJvbWlzZSB8fCAhdGhpcy5fcmVzb2x2ZVNlc3Npb25SZWFkeSkge1xuICAgICAgdGhpcy5fc2Vzc2lvblJlYWR5UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRoaXMuX3Jlc29sdmVTZXNzaW9uUmVhZHkgPSByZXNvbHZlXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uUmVhZHlQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX3Nlc3Npb25SZWFkeUVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fc2Vzc2lvblJlYWR5RXJyb3JcbiAgICAgICAgdGhpcy5fc2Vzc2lvblJlYWR5RXJyb3IgPSBudWxsXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX21hcmtTZXNzaW9uUmVhZHkoKSB7XG4gICAgaWYgKHRoaXMuX3Nlc3Npb25SZWFkeSkgcmV0dXJuXG5cbiAgICB0aGlzLl9zZXNzaW9uUmVhZHkgPSB0cnVlXG4gICAgdGhpcy5fc2Vzc2lvblJlYWR5RXJyb3IgPSBudWxsXG4gICAgdGhpcy5fcmVzb2x2ZVNlc3Npb25SZWFkeT8uKClcbiAgICB0aGlzLl9yZXNvbHZlU2Vzc2lvblJlYWR5ID0gbnVsbFxuICAgIHRoaXMuX3Nlc3Npb25SZWFkeVByb21pc2UgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt1bmtub3dufSBbZXJyb3JdXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3Jlc2V0U2Vzc2lvblJlYWR5U3RhdGUoZXJyb3IgPSBuZXcgRXJyb3IoXCJXZWJzb2NrZXQgc2Vzc2lvbiByZWFkaW5lc3Mgd2FzIHJlc2V0XCIpKSB7XG4gICAgdGhpcy5fc2Vzc2lvblJlYWR5ID0gZmFsc2VcbiAgICB0aGlzLl9wZW5kaW5nU2Vzc2lvbklkID0gbnVsbFxuICAgIHRoaXMuX3Nlc3Npb25SZWFkeUVycm9yID0gZXJyb3JcbiAgICB0aGlzLl9yZXNvbHZlU2Vzc2lvblJlYWR5Py4oKVxuICAgIHRoaXMuX3Nlc3Npb25SZWFkeVByb21pc2UgPSBudWxsXG4gICAgdGhpcy5fcmVzb2x2ZVNlc3Npb25SZWFkeSA9IG51bGxcbiAgfVxufVxuXG5jbGFzcyBWZWxvY2lvdXNXZWJzb2NrZXRSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gbWVzc2FnZSAtIE1lc3NhZ2UgdGV4dC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSAvKiogQHR5cGUge3tib2R5PzogYW55LCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgYW55PiwgaWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsLCBzdGF0dXNDb2RlPzogbnVtYmVyLCBzdGF0dXNNZXNzYWdlPzogc3RyaW5nLCB0eXBlPzogc3RyaW5nfX0gKi8gKG1lc3NhZ2UpXG5cbiAgICB0aGlzLmJvZHkgPSByZXNwb25zZU1lc3NhZ2UuYm9keVxuICAgIHRoaXMuaGVhZGVycyA9IHJlc3BvbnNlTWVzc2FnZS5oZWFkZXJzIHx8IHt9XG4gICAgdGhpcy5pZCA9IHJlc3BvbnNlTWVzc2FnZS5pZFxuICAgIHRoaXMuc3RhdHVzQ29kZSA9IHJlc3BvbnNlTWVzc2FnZS5zdGF0dXNDb2RlIHx8IDIwMFxuICAgIHRoaXMuc3RhdHVzTWVzc2FnZSA9IHJlc3BvbnNlTWVzc2FnZS5zdGF0dXNNZXNzYWdlIHx8IFwiT0tcIlxuICAgIHRoaXMudHlwZSA9IHJlc3BvbnNlTWVzc2FnZS50eXBlXG4gIH1cblxuICAvKiogQHJldHVybnMge2FueX0gLSBUaGUganNvbi4gICovXG4gIGpzb24oKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmJvZHkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlc3BvbnNlIGJvZHkgaXMgbm90IGEgc3RyaW5nXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIGRlc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKEpTT04ucGFyc2UodGhpcy5ib2R5KSlcbiAgfVxufVxuIl19
|