velocious 1.0.591 → 1.0.593
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -1
- package/build/configuration-types.js +1 -1
- package/build/database/drivers/base.js +53 -34
- package/build/database/drivers/mssql/index.js +32 -0
- package/build/database/drivers/mysql/index.js +17 -0
- package/build/database/drivers/pgsql/index.js +11 -0
- package/build/database/drivers/sqlite/base.js +12 -0
- package/build/database/drivers/sqlite/connection-sql-js.js +3 -2
- package/build/database/drivers/sqlite/index.js +7 -1
- package/build/database/drivers/sqlite/index.native.js +9 -3
- package/build/database/drivers/sqlite/index.web.js +6 -3
- package/build/environment-handlers/base.js +18 -0
- package/build/environment-handlers/node.js +32 -0
- package/build/src/configuration-types.d.ts +2 -2
- package/build/src/configuration-types.js +2 -2
- package/build/src/database/drivers/base.d.ts +11 -0
- package/build/src/database/drivers/base.d.ts.map +1 -1
- package/build/src/database/drivers/base.js +54 -37
- package/build/src/database/drivers/mssql/index.d.ts +7 -0
- package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/index.js +15 -1
- package/build/src/database/drivers/mysql/index.d.ts +7 -0
- package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/index.js +15 -1
- package/build/src/database/drivers/pgsql/index.d.ts +6 -0
- package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/index.js +10 -1
- package/build/src/database/drivers/sqlite/base.d.ts +7 -0
- package/build/src/database/drivers/sqlite/base.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/base.js +11 -1
- package/build/src/database/drivers/sqlite/connection-sql-js.d.ts +4 -1
- package/build/src/database/drivers/sqlite/connection-sql-js.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/connection-sql-js.js +4 -3
- package/build/src/database/drivers/sqlite/index.d.ts +2 -1
- package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.js +7 -2
- package/build/src/database/drivers/sqlite/index.native.d.ts +2 -1
- package/build/src/database/drivers/sqlite/index.native.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.native.js +9 -4
- package/build/src/database/drivers/sqlite/index.web.d.ts +2 -1
- package/build/src/database/drivers/sqlite/index.web.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.web.js +7 -4
- package/build/src/environment-handlers/base.d.ts +16 -0
- package/build/src/environment-handlers/base.d.ts.map +1 -1
- package/build/src/environment-handlers/base.js +17 -1
- package/build/src/environment-handlers/node.d.ts +20 -0
- package/build/src/environment-handlers/node.d.ts.map +1 -1
- package/build/src/environment-handlers/node.js +29 -1
- package/build/src/sync/conflict-strategy.d.ts.map +1 -1
- package/build/src/sync/conflict-strategy.js +7 -1
- package/build/src/sync/local-mutation-log.d.ts +10 -0
- package/build/src/sync/local-mutation-log.d.ts.map +1 -1
- package/build/src/sync/local-mutation-log.js +21 -1
- package/build/src/sync/sync-api-client-types.d.ts +15 -0
- package/build/src/sync/sync-api-client-types.d.ts.map +1 -1
- package/build/src/sync/sync-api-client-types.js +4 -1
- package/build/src/sync/sync-api-client.d.ts +91 -0
- package/build/src/sync/sync-api-client.d.ts.map +1 -1
- package/build/src/sync/sync-api-client.js +184 -1
- package/build/src/sync/sync-client-types.d.ts +57 -0
- package/build/src/sync/sync-client-types.d.ts.map +1 -1
- package/build/src/sync/sync-client-types.js +16 -1
- package/build/src/sync/sync-client.d.ts +56 -7
- package/build/src/sync/sync-client.d.ts.map +1 -1
- package/build/src/sync/sync-client.js +180 -15
- package/build/src/sync/sync-envelope-replay-service.d.ts +31 -2
- package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
- package/build/src/sync/sync-envelope-replay-service.js +98 -16
- package/build/src/sync/sync-model-change-feed-service.d.ts.map +1 -1
- package/build/src/sync/sync-model-change-feed-service.js +3 -4
- package/build/src/sync/sync-replay-persisted-data.d.ts +26 -0
- package/build/src/sync/sync-replay-persisted-data.d.ts.map +1 -0
- package/build/src/sync/sync-replay-persisted-data.js +43 -0
- package/build/src/testing/shared-transaction-broker.d.ts +14 -0
- package/build/src/testing/shared-transaction-broker.d.ts.map +1 -1
- package/build/src/testing/shared-transaction-broker.js +44 -7
- package/build/src/testing/shared-transaction-connection-coordinator.d.ts +5 -4
- package/build/src/testing/shared-transaction-connection-coordinator.d.ts.map +1 -1
- package/build/src/testing/shared-transaction-connection-coordinator.js +21 -10
- package/build/sync/conflict-strategy.js +3 -0
- package/build/sync/local-mutation-log.js +24 -0
- package/build/sync/sync-api-client-types.js +3 -0
- package/build/sync/sync-api-client.js +203 -0
- package/build/sync/sync-client-types.js +16 -0
- package/build/sync/sync-client.js +198 -14
- package/build/sync/sync-envelope-replay-service.js +109 -12
- package/build/sync/sync-model-change-feed-service.js +2 -4
- package/build/sync/sync-replay-persisted-data.js +50 -0
- package/build/testing/shared-transaction-broker.js +48 -7
- package/build/testing/shared-transaction-connection-coordinator.js +23 -9
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/scripts/browser-test-session.js +489 -0
- package/scripts/prewarm-chromedriver.js +3 -22
- package/scripts/test-browser.js +47 -15
- package/src/configuration-types.js +1 -1
- package/src/database/drivers/base.js +53 -34
- package/src/database/drivers/mssql/index.js +32 -0
- package/src/database/drivers/mysql/index.js +17 -0
- package/src/database/drivers/pgsql/index.js +11 -0
- package/src/database/drivers/sqlite/base.js +12 -0
- package/src/database/drivers/sqlite/connection-sql-js.js +3 -2
- package/src/database/drivers/sqlite/index.js +7 -1
- package/src/database/drivers/sqlite/index.native.js +9 -3
- package/src/database/drivers/sqlite/index.web.js +6 -3
- package/src/environment-handlers/base.js +18 -0
- package/src/environment-handlers/node.js +32 -0
- package/src/sync/conflict-strategy.js +3 -0
- package/src/sync/local-mutation-log.js +24 -0
- package/src/sync/sync-api-client-types.js +3 -0
- package/src/sync/sync-api-client.js +203 -0
- package/src/sync/sync-client-types.js +16 -0
- package/src/sync/sync-client.js +198 -14
- package/src/sync/sync-envelope-replay-service.js +109 -12
- package/src/sync/sync-model-change-feed-service.js +2 -4
- package/src/sync/sync-replay-persisted-data.js +50 -0
- package/src/testing/shared-transaction-broker.js +48 -7
- package/src/testing/shared-transaction-connection-coordinator.js +23 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-model-change-feed-service.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-model-change-feed-service.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sync-model-change-feed-service.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-model-change-feed-service.js"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
import VelociousError from "../velocious-error.js";
|
|
3
3
|
import { declaredSyncScopeAttributes } from "./sync-scope-attributes.js";
|
|
4
|
+
import { decodeReplayPersistedData } from "./sync-replay-persisted-data.js";
|
|
4
5
|
/**
|
|
5
6
|
* Generic cursor-paginated change feed over an app-owned sync/change model.
|
|
6
7
|
*
|
|
@@ -212,9 +213,7 @@ export default class SyncModelChangeFeedService {
|
|
|
212
213
|
const data = this.recordValue(record, "data");
|
|
213
214
|
if (data === "" || data === null || data === undefined)
|
|
214
215
|
return null;
|
|
215
|
-
|
|
216
|
-
return data;
|
|
217
|
-
return JSON.parse(data);
|
|
216
|
+
return decodeReplayPersistedData(data).payload;
|
|
218
217
|
}
|
|
219
218
|
/**
|
|
220
219
|
* Reads a value from either a record accessor method or plain property.
|
|
@@ -247,4 +246,4 @@ export default class SyncModelChangeFeedService {
|
|
|
247
246
|
return date.toISOString();
|
|
248
247
|
}
|
|
249
248
|
}
|
|
250
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUVsRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQTtBQUV0RTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qzs7Ozs7Ozs7O09BU0c7SUFDSCxZQUFZLEVBQUMsWUFBWSxHQUFHLElBQUksRUFBRSxRQUFRLEdBQUcsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBQztRQUNqRyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUE7UUFDcEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDN0YsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFFakQsSUFBSSxDQUFDLFVB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QUFDLElBQUksRUFBRSwwQkFBMEIsRUFBQyxDQUFDLENBQUE7UUFDcEgsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQzNCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgVmVsb2Npb3VzRXJyb3IgZnJvbSBcIi4uL3ZlbG9jaW91cy1lcnJvci5qc1wiXG5cbmltcG9ydCB7ZGVjbGFyZWRTeW5jU2NvcGVBdHRyaWJ1dGVzfSBmcm9tIFwiLi9zeW5jLXNjb3BlLWF0dHJpYnV0ZXMuanNcIlxuXG4vKipcbiAqIEdlbmVyaWMgY3Vyc29yLXBhZ2luYXRlZCBjaGFuZ2UgZmVlZCBvdmVyIGFuIGFwcC1vd25lZCBzeW5jL2NoYW5nZSBtb2RlbC5cbiAqXG4gKiBBcHBzIHByb3ZpZGUgdGhlIG1vZGVsIGFuZCBvcHRpb25hbCBzY29waW5nL3NlcmlhbGl6YXRpb24gaG9va3MuIFZlbG9jaW91cyBvd25zXG4gKiBjdXJzb3IgcGFyc2luZywgc25hcHNob3QgaGlnaC13YXRlciByZXNvbHV0aW9uLCBzdGFibGUgb3JkZXJpbmcsIHBhZ2UgbGltaXRzLFxuICogYW5kIHJlc3BvbnNlIHNoYXBlIGZvciBgL3ZlbG9jaW91cy9zeW5jL2NoYW5nZXNgIHN0eWxlIGVuZHBvaW50cy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3luY01vZGVsQ2hhbmdlRmVlZFNlcnZpY2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGdlbmVyaWMgc3luYy1tb2RlbCBjaGFuZ2UtZmVlZCBzZXJ2aWNlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFNlcnZpY2UgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbENsYXNzIC0gU3luYy9jaGFuZ2UgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGFyZ3MucGFyYW1zIC0gUmVxdWVzdCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5kZWZhdWx0TGltaXRdIC0gRGVmYXVsdCBwYWdlIHNpemUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5tYXhMaW1pdF0gLSBNYXhpbXVtIHBhZ2Ugc2l6ZS5cbiAgICogQHBhcmFtIHsocmVjb3JkOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPikgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj59IFthcmdzLnNlcmlhbGl6ZVJlY29yZF0gLSBSZWNvcmQgc2VyaWFsaXplci5cbiAgICogQHBhcmFtIHsoYXJnczoge3F1ZXJ5OiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSkgPT4gdm9pZH0gW2FyZ3Muc2NvcGVRdWVyeV0gLSBBcHBsaWVzIGFwcC1vd25lZCB2aXNpYmlsaXR5IHNjb3BlLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2RlZmF1bHRMaW1pdCA9IDEwMDAsIG1heExpbWl0ID0gMTAwMCwgbW9kZWxDbGFzcywgcGFyYW1zLCBzY29wZVF1ZXJ5LCBzZXJpYWxpemVSZWNvcmR9KSB7XG4gICAgdGhpcy5kZWZhdWx0TGltaXQgPSBkZWZhdWx0TGltaXRcbiAgICB0aGlzLm1heExpbWl0ID0gbWF4TGltaXRcbiAgICB0aGlzLm1vZGVsQ2xhc3MgPSBtb2RlbENsYXNzXG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXNcbiAgICB0aGlzLnNjb3BlUXVlcnkgPSBzY29wZVF1ZXJ5IHx8IG51bGxcbiAgICB0aGlzLnNlcmlhbGl6ZVJlY29yZCA9IHNlcmlhbGl6ZVJlY29yZCB8fCAoKHJlY29yZCkgPT4gdGhpcy5kZWZhdWx0U2VyaWFsaXplUmVjb3JkKHJlY29yZCkpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc3RhYmxlIGNoYW5nZS1mZWVkIHBhZ2UuIFRoZSBhZGRpdGl2ZSBgdG90YWxgIGlzIHRoZSBzY29wZSdzIHBlbmRpbmdcbiAgICogY2hhbmdlIGNvdW50IGZyb20gdGhlIHJlcXVlc3QgY3Vyc29yIHRvIHRoZSBzbmFwc2hvdCBib3VuZCAoYSBDT1VOVCwgbm90IGFcbiAgICogbWF0ZXJpYWxpemVkIHJlYWQpLCBzbyBhIGNsaWVudCBjYW4gcmVuZGVyIGEgXCJzeW5jZWQgb2YgdG90YWxcIiBwcm9ncmVzcyBiYXI7XG4gICAqIG9sZGVyIGNsaWVudHMgaWdub3JlIGl0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7c3RhdHVzOiBzdHJpbmcsIG5leHRDdXJzb3I6IHtpZDogc3RyaW5nLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyLCB1cGRhdGVkQXQ6IHN0cmluZ30gfCBudWxsLCBzeW5jczogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LCB0b3RhbDogbnVtYmVyLCB1cFRvQ3Vyc29yOiB7aWQ6IHN0cmluZywgc2VydmVyU2VxdWVuY2U6IG51bWJlciwgdXBkYXRlZEF0OiBzdHJpbmd9IHwgbnVsbH0+fSBDaGFuZ2UtZmVlZCBwYWdlIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNoYW5nZXMoKSB7XG4gICAgY29uc3QgbGltaXQgPSB0aGlzLm5vcm1hbGl6ZWRMaW1pdCh0aGlzLnBhcmFtcy5saW1pdClcbiAgICBjb25zdCB1cFRvQ3Vyc29yID0gYXdhaXQgdGhpcy5yZXNvbHZlVXBUb0N1cnNvcigpXG5cbiAgICBpZiAoIXVwVG9DdXJzb3IpIHJldHVybiB7c3RhdHVzOiBcInN1Y2Nlc3NcIiwgbmV4dEN1cnNvcjogbnVsbCwgc3luY3M6IFtdLCB0b3RhbDogMCwgdXBUb0N1cnNvcjogbnVsbH1cblxuICAgIGNvbnN0IHRvdGFsID0gYXdhaXQgdGhpcy50b3RhbFBlbmRpbmdDaGFuZ2VzKHt1cFRvQ3Vyc29yfSlcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMucGFnZVF1ZXJ5KHtsaW1pdCwgdXBUb0N1cnNvcn0pXG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHF1ZXJ5LnRvQXJyYXkoKVxuICAgIGNvbnN0IG5leHRDdXJzb3IgPSByZWNvcmRzLmxlbmd0aCA+IDAgPyB0aGlzLmN1cnNvckZvclJlY29yZChyZWNvcmRzW3JlY29yZHMubGVuZ3RoIC0gMV0pIDogdXBUb0N1cnNvclxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogXCJzdWNjZXNzXCIsXG4gICAgICBuZXh0Q3Vyc29yLFxuICAgICAgc3luY3M6IHJlY29yZHMubWFwKChyZWNvcmQpID0+IHRoaXMuc2VyaWFsaXplUmVjb3JkKHJlY29yZCkpLFxuICAgICAgdG90YWwsXG4gICAgICB1cFRvQ3Vyc29yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgdGhlIHJlcXVlc3RlZCBwYWdlIGxpbWl0LlxuICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmF3IGxpbWl0IHBhcmFtLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBOb3JtYWxpemVkIHBhZ2UgbGltaXQuXG4gICAqL1xuICBub3JtYWxpemVkTGltaXQodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIHRoaXMuZGVmYXVsdExpbWl0XG5cbiAgICBjb25zdCBsaW1pdCA9IE51bWJlcih2YWx1ZSlcblxuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIobGltaXQpIHx8IGxpbWl0IDw9IDApIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoXCJTeW5jIGNoYW5nZXMgbGltaXQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuXCIsIHtjb2RlOiBcInN5bmMtaW52YWxpZC1jaGFuZ2VzLWxpbWl0XCJ9KVxuICAgIH1cblxuICAgIHJldHVybiBNYXRoLm1pbihsaW1pdCwgdGhpcy5tYXhMaW1pdClcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gb3B0aW9uYWwgcG9zaXRpdmUgaW50ZWdlciBjdXJzb3IgZmllbGQuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgaW50ZWdlciBwYXJhbS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBQYXJhbSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcy5cbiAgICogQHJldHVybnMge251bWJlciB8IG51bGx9IFBvc2l0aXZlIGludGVnZXIgdmFsdWUsIG9yIG51bGwgd2hlbiBvbWl0dGVkLlxuICAgKi9cbiAgb3B0aW9uYWxQb3NpdGl2ZUludGVnZXJQYXJhbSh2YWx1ZSwgbmFtZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgaW50ZWdlciA9IE51bWJlcih2YWx1ZSlcblxuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoaW50ZWdlcikgfHwgaW50ZWdlciA8PSAwKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKGAke25hbWV9IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLmAsIHtjb2RlOiBcInN5bmMtaW52YWxpZC1jaGFuZ2VzLWN1cnNvclwifSlcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZWdlclxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBoaWdoLXdhdGVyIGN1cnNvciB0aGF0IGJvdW5kcyB0aGUgY3VycmVudCBmZWVkIHBhZ2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtpZDogc3RyaW5nLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyLCB1cGRhdGVkQXQ6IHN0cmluZ30gfCBudWxsPn0gU25hcHNob3QgdXBwZXItYm91bmQgY3Vyc29yLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZVVwVG9DdXJzb3IoKSB7XG4gICAgY29uc3QgdXBUb1NlcnZlclNlcXVlbmNlID0gdGhpcy5vcHRpb25hbFBvc2l0aXZlSW50ZWdlclBhcmFtKHRoaXMucGFyYW1zLnVwVG9TZXJ2ZXJTZXF1ZW5jZSwgXCJ1cFRvU2VydmVyU2VxdWVuY2VcIilcblxuICAgIGlmICh1cFRvU2VydmVyU2VxdWVuY2UgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMucGFyYW1zLnVwVG9VcGRhdGVkQXQgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHRoaXMucGFyYW1zLnVwVG9JZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHtpZDogdGhpcy5wYXJhbXMudXBUb0lkLCBzZXJ2ZXJTZXF1ZW5jZTogdXBUb1NlcnZlclNlcXVlbmNlLCB1cGRhdGVkQXQ6IHRoaXMucGFyYW1zLnVwVG9VcGRhdGVkQXR9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvVXBkYXRlZEF0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvSWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IHVwVG9SZWNvcmQgPSBhd2FpdCB0aGlzLm1vZGVsQ2xhc3MuZmluZEJ5KHtpZDogdGhpcy5wYXJhbXMudXBUb0lkfSlcblxuICAgICAgaWYgKHVwVG9SZWNvcmQpIHJldHVybiB0aGlzLmN1cnNvckZvclJlY29yZCh1cFRvUmVjb3JkKVxuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zY29wZWRRdWVyeSgpXG4gICAgY29uc3QgdGFibGUgPSBxdWVyeS5kcml2ZXIucXVvdGVUYWJsZSh0aGlzLm1vZGVsQ2xhc3MudGFibGVOYW1lKCkpXG4gICAgY29uc3Qgc2VydmVyU2VxdWVuY2VDb2x1bW4gPSBxdWVyeS5kcml2ZXIucXVvdGVDb2x1bW4oXCJzZXJ2ZXJfc2VxdWVuY2VcIilcbiAgICBjb25zdCBsYXRlc3RSZWNvcmRzID0gYXdhaXQgcXVlcnlcbiAgICAgIC5vcmRlcihgJHt0YWJsZX0uJHtzZXJ2ZXJTZXF1ZW5jZUNvbHVtbn0gREVTQ2ApXG4gICAgICAubGltaXQoMSlcbiAgICAgIC50b0FycmF5KClcblxuICAgIGlmIChsYXRlc3RSZWNvcmRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiB0aGlzLmN1cnNvckZvclJlY29yZChsYXRlc3RSZWNvcmRzWzBdKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgb3JkZXJlZCBhbmQgY3Vyc29yLWZpbHRlcmVkIHBhZ2UgcXVlcnkuXG4gICAqIEBwYXJhbSB7e2xpbWl0OiBudW1iZXIsIHVwVG9DdXJzb3I6IHtpZDogc3RyaW5nLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyLCB1cGRhdGVkQXQ6IHN0cmluZ319fSBhcmdzIC0gUGFnZSBxdWVyeSBhcmdzLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gUGFnZSBxdWVyeS5cbiAgICovXG4gIHBhZ2VRdWVyeSh7bGltaXQsIHVwVG9DdXJzb3J9KSB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLmN1cnNvckZpbHRlcmVkUXVlcnkoe3VwVG9DdXJzb3J9KVxuICAgIGNvbnN0IGRyaXZlciA9IHF1ZXJ5LmRyaXZlclxuICAgIGNvbnN0IHNlcnZlclNlcXVlbmNlQ29sdW1uID0gYCR7ZHJpdmVyLnF1b3RlVGFibGUodGhpcy5tb2RlbENsYXNzLnRhYmxlTmFtZSgpKX0uJHtkcml2ZXIucXVvdGVDb2x1bW4oXCJzZXJ2ZXJfc2VxdWVuY2VcIil9YFxuXG4gICAgcmV0dXJuIHF1ZXJ5XG4gICAgICAub3JkZXIoYCR7c2VydmVyU2VxdWVuY2VDb2x1bW59IEFTQ2ApXG4gICAgICAubGltaXQobGltaXQpXG4gIH1cblxuICAvKipcbiAgICogQ291bnRzIHRoZSBzY29wZSdzIHBlbmRpbmcgY2hhbmdlIHJvd3MgZnJvbSB0aGUgcmVxdWVzdCBjdXJzb3IgdG8gdGhlIHNuYXBzaG90XG4gICAqIGJvdW5kIHdpdGhvdXQgbWF0ZXJpYWxpemluZyB0aGVtLCBzbyB0aGUgY2xpZW50IGNhbiByZW5kZXIgYSBzdGFibGUgXCJvZiBZXCJcbiAgICogcHJvZ3Jlc3MgZGVub21pbmF0b3IuXG4gICAqIEBwYXJhbSB7e3VwVG9DdXJzb3I6IHtpZDogc3RyaW5nLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyLCB1cGRhdGVkQXQ6IHN0cmluZ319fSBhcmdzIC0gQ291bnQgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gUGVuZGluZyBjaGFuZ2UgY291bnQgZnJvbSB0aGUgcmVxdWVzdCBjdXJzb3IuXG4gICAqL1xuICBhc3luYyB0b3RhbFBlbmRpbmdDaGFuZ2VzKHt1cFRvQ3Vyc29yfSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmN1cnNvckZpbHRlcmVkUXVlcnkoe3VwVG9DdXJzb3J9KS5jb3VudCgpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc2NvcGVkIHF1ZXJ5IHdpdGggdGhlIHNuYXBzaG90IHVwcGVyIGJvdW5kIGFuZCBhZnRlci1jdXJzb3IgZmlsdGVyc1xuICAgKiBhcHBsaWVkLCBidXQgd2l0aG91dCBvcmRlcmluZyBvciBhIHBhZ2UgbGltaXQuIFNoYXJlZCBieSB0aGUgcGFnZSByZWFkIGFuZCB0aGVcbiAgICogdG90YWwtY291bnQgc28gYm90aCBjb3VudCB0aGUgc2FtZSBzZXQgb2Ygcm93cy5cbiAgICogQHBhcmFtIHt7dXBUb0N1cnNvcjoge2lkOiBzdHJpbmcsIHNlcnZlclNlcXVlbmNlOiBudW1iZXIsIHVwZGF0ZWRBdDogc3RyaW5nfX19IGFyZ3MgLSBGaWx0ZXIgYXJncy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IEN1cnNvci1maWx0ZXJlZCBxdWVyeS5cbiAgICovXG4gIGN1cnNvckZpbHRlcmVkUXVlcnkoe3VwVG9DdXJzb3J9KSB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNjb3BlZFF1ZXJ5KClcbiAgICBjb25zdCBkcml2ZXIgPSBxdWVyeS5kcml2ZXJcbiAgICBjb25zdCB0YWJsZSA9IGRyaXZlci5xdW90ZVRhYmxlKHRoaXMubW9kZWxDbGFzcy50YWJsZU5hbWUoKSlcbiAgICBjb25zdCBzZXJ2ZXJTZXF1ZW5jZUNvbHVtbiA9IGAke3RhYmxlfS4ke2RyaXZlci5xdW90ZUNvbHVtbihcInNlcnZlcl9zZXF1ZW5jZVwiKX1gXG4gICAgY29uc3QgdXBkYXRlZEF0Q29sdW1uID0gYCR7dGFibGV9LiR7ZHJpdmVyLnF1b3RlQ29sdW1uKFwidXBkYXRlZF9hdFwiKX1gXG4gICAgY29uc3QgaWRDb2x1bW4gPSBgJHt0YWJsZX0uJHtkcml2ZXIucXVvdGVDb2x1bW4oXCJpZFwiKX1gXG5cbiAgICBxdWVyeS53aGVyZShgJHtzZXJ2ZXJTZXF1ZW5jZUNvbHVtbn0gPD0gJHtkcml2ZXIucXVvdGUodXBUb0N1cnNvci5zZXJ2ZXJTZXF1ZW5jZSl9YClcblxuICAgIGNvbnN0IGFmdGVyU2VydmVyU2VxdWVuY2UgPSB0aGlzLm9wdGlvbmFsUG9zaXRpdmVJbnRlZ2VyUGFyYW0odGhpcy5wYXJhbXMuYWZ0ZXJTZXJ2ZXJTZXF1ZW5jZSwgXCJhZnRlclNlcnZlclNlcXVlbmNlXCIpXG5cbiAgICBpZiAoYWZ0ZXJTZXJ2ZXJTZXF1ZW5jZSAhPT0gbnVsbCkge1xuICAgICAgcXVlcnkud2hlcmUoYCR7c2VydmVyU2VxdWVuY2VDb2x1bW59ID4gJHtkcml2ZXIucXVvdGUoYWZ0ZXJTZXJ2ZXJTZXF1ZW5jZSl9YClcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLnBhcmFtcy5hZnRlclVwZGF0ZWRBdCA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLnBhcmFtcy5hZnRlclVwZGF0ZWRBdCAhPT0gXCJcIikge1xuICAgICAgY29uc3QgaXNQYWdpbmdFeGlzdGluZ1NuYXBzaG90ID0gdHlwZW9mIHRoaXMucGFyYW1zLnVwVG9VcGRhdGVkQXQgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5wYXJhbXMudXBUb1VwZGF0ZWRBdCAhPT0gXCJcIiAmJiB0eXBlb2YgdGhpcy5wYXJhbXMudXBUb0lkID09PSBcInN0cmluZ1wiICYmIHRoaXMucGFyYW1zLnVwVG9JZCAhPT0gXCJcIlxuXG4gICAgICBpZiAoaXNQYWdpbmdFeGlzdGluZ1NuYXBzaG90ICYmIHR5cGVvZiB0aGlzLnBhcmFtcy5hZnRlcklkID09PSBcInN0cmluZ1wiICYmIHRoaXMucGFyYW1zLmFmdGVySWQgIT09IFwiXCIpIHtcbiAgICAgICAgcXVlcnkud2hlcmUoYCgke3VwZGF0ZWRBdENvbHVtbn0gPiAke2RyaXZlci5xdW90ZSh0aGlzLnBhcmFtcy5hZnRlclVwZGF0ZWRBdCl9IE9SICgke3VwZGF0ZWRBdENvbHVtbn0gPSAke2RyaXZlci5xdW90ZSh0aGlzLnBhcmFtcy5hZnRlclVwZGF0ZWRBdCl9IEFORCAke2lkQ29sdW1ufSA+ICR7ZHJpdmVyLnF1b3RlKHRoaXMucGFyYW1zLmFmdGVySWQpfSkpYClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlKGAke3VwZGF0ZWRBdENvbHVtbn0gPj0gJHtkcml2ZXIucXVvdGUodGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQpfWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXJ5XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgYmFzZSBxdWVyeSB3aXRoIGFwcC1vd25lZCBzY29wZSBhcHBsaWVkLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gU2NvcGVkIGJhc2UgcXVlcnkuXG4gICAqL1xuICBzY29wZWRRdWVyeSgpIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMubW9kZWxDbGFzcy53aGVyZSh7fSlcblxuICAgIGlmICh0aGlzLnNjb3BlUXVlcnkpIHRoaXMuc2NvcGVRdWVyeSh7cXVlcnl9KVxuXG4gICAgcmV0dXJuIHF1ZXJ5XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIHJlY29yZCBpbnRvIGEgdHJhbnNwb3J0IGN1cnNvci5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcmVjb3JkIC0gU3luYy9jaGFuZ2UgcmVjb3JkLlxuICAgKiBAcmV0dXJucyB7e2lkOiBzdHJpbmcsIHNlcnZlclNlcXVlbmNlOiBudW1iZXIsIHVwZGF0ZWRBdDogc3RyaW5nfX0gQ3Vyc29yIGZvciByb3cuXG4gICAqL1xuICBjdXJzb3JGb3JSZWNvcmQocmVjb3JkKSB7XG4gICAgcmV0dXJuIHtpZDogU3RyaW5nKHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcImlkXCIpKSwgc2VydmVyU2VxdWVuY2U6IE51bWJlcih0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJzZXJ2ZXJTZXF1ZW5jZVwiKSksIHVwZGF0ZWRBdDogdGhpcy5pc29EYXRlKHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInVwZGF0ZWRBdFwiKSl9XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIHJlY29yZCB1c2luZyB0aGUgc3RhbmRhcmQgc3luYyBlbnZlbG9wZSBzaGFwZSBwbHVzIHRoZSBzeW5jXG4gICAqIG1vZGVsJ3MgZGVjbGFyZWQgc2NvcGUtcGFydGl0aW9uIGF0dHJpYnV0ZXMgKGBzdGF0aWMgc3luY1Njb3BlQXR0cmlidXRlc2ApLFxuICAgKiBlYWNoIGVtaXR0ZWQgdW5kZXIgaXRzIG93biBhdHRyaWJ1dGUgbmFtZS4gTW9kZWxzIGRlY2xhcmluZyBubyBzY29wZVxuICAgKiBhdHRyaWJ1dGVzIGtlZXAgdGhlIGRlcHJlY2F0ZWQgMS4wLjUwMyB3aXJlIGFuZCBlbWl0IGBldmVudElkYC4gS2V5cyBhcmVcbiAgICogc29ydGVkIHNvIGEgZGVjbGFyZWQgYFtcImV2ZW50SWRcIl1gIHBhcnRpdGlvbiBzdGF5cyBieXRlLWlkZW50aWNhbCB3aXRoIHRoZVxuICAgKiAxLjAuNTAzIHdpcmUuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHJlY29yZCAtIFN5bmMvY2hhbmdlIHJlY29yZC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBEZWZhdWx0IHNlcmlhbGl6ZWQgcm93LlxuICAgKi9cbiAgZGVmYXVsdFNlcmlhbGl6ZVJlY29yZChyZWNvcmQpIHtcbiAgICBjb25zdCBzY29wZUF0dHJpYnV0ZXMgPSBkZWNsYXJlZFN5bmNTY29wZUF0dHJpYnV0ZXModGhpcy5tb2RlbENsYXNzKVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovXG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IHtcbiAgICAgIGRhdGE6IHRoaXMucmVjb3JkRGF0YShyZWNvcmQpLFxuICAgICAgaWQ6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcImlkXCIpLFxuICAgICAgcmVzb3VyY2VJZDogdGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIFwicmVzb3VyY2VJZFwiKSxcbiAgICAgIHJlc291cmNlVHlwZTogdGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIFwicmVzb3VyY2VUeXBlXCIpLFxuICAgICAgc2VydmVyU2VxdWVuY2U6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInNlcnZlclNlcXVlbmNlXCIpLFxuICAgICAgc3luY1R5cGU6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInN5bmNUeXBlXCIpLFxuICAgICAgdXBkYXRlZEF0OiB0aGlzLmlzb0RhdGUodGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIFwidXBkYXRlZEF0XCIpKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2NvcGVBdHRyaWJ1dGUgb2Ygc2NvcGVBdHRyaWJ1dGVzIHx8IFtcImV2ZW50SWRcIl0pIHtcbiAgICAgIHNlcmlhbGl6ZWRbc2NvcGVBdHRyaWJ1dGVdID0gdGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIHNjb3BlQXR0cmlidXRlKVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoc2VyaWFsaXplZCkuc29ydCgoW2xlZnRLZXldLCBbcmlnaHRLZXldKSA9PiBsZWZ0S2V5LmxvY2FsZUNvbXBhcmUocmlnaHRLZXkpKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbmQgcGFyc2VzIHRoZSByZWNvcmQgZGF0YSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSByZWNvcmQgLSBTeW5jL2NoYW5nZSByZWNvcmQuXG4gICAqIEByZXR1cm5zIHt1bmtub3dufSBQYXJzZWQgZGF0YSB2YWx1ZS5cbiAgICovXG4gIHJlY29yZERhdGEocmVjb3JkKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcImRhdGFcIilcblxuICAgIGlmIChkYXRhID09PSBcIlwiIHx8IGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbFxuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGRhdGFcblxuICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYSB2YWx1ZSBmcm9tIGVpdGhlciBhIHJlY29yZCBhY2Nlc3NvciBtZXRob2Qgb3IgcGxhaW4gcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHJlY29yZCAtIFN5bmMvY2hhbmdlIHJlY29yZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBDYW1lbC1jYXNlZCB2YWx1ZS9tZXRob2QgbmFtZS5cbiAgICogQHJldHVybnMge3Vua25vd259IFJlY29yZCB2YWx1ZS5cbiAgICovXG4gIHJlY29yZFZhbHVlKHJlY29yZCwgbmFtZSkge1xuICAgIGlmICghcmVjb3JkIHx8IHR5cGVvZiByZWNvcmQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmMgY2hhbmdlcyByb3cgbXVzdCBiZSBhbiBvYmplY3QuXCIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVjb3JkT2JqZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChyZWNvcmQpXG4gICAgY29uc3QgbWV0aG9kID0gcmVjb3JkT2JqZWN0W25hbWVdXG4gICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgbWV0aG9kID09PSBcImZ1bmN0aW9uXCIgPyBtZXRob2QuY2FsbChyZWNvcmQpIDogbWV0aG9kXG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jIGNoYW5nZXMgcm93IGlzIG1pc3NpbmcgJHtuYW1lfS5gKVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgZGF0ZS1saWtlIHZhbHVlIHRvIGFuIElTTyBzdHJpbmcuXG4gICAqIEBwYXJhbSB7RGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgfCB1bmtub3dufSB2YWx1ZSAtIERhdGUgdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IElTTyBkYXRlLlxuICAgKi9cbiAgaXNvRGF0ZSh2YWx1ZSkge1xuICAgIGNvbnN0IGRhdGUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyB2YWx1ZSA6IDApXG5cbiAgICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShcIlN5bmMgY2hhbmdlcyByb3cgaGFzIGFuIGludmFsaWQgdXBkYXRlZF9hdCB2YWx1ZS5cIiwge2NvZGU6IFwic3luYy1pbnZhbGlkLWNoYW5nZXMtcm93XCJ9KVxuICAgIH1cblxuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcbiAgfVxufVxuXG4iXX0=
|
|
249
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUVsRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQTtBQUN0RSxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV6RTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qzs7Ozs7Ozs7O09BU0c7SUFDSCxZQUFZLEVBQUMsWUFBWSxHQUFHLElBQUksRUFBRSxRQUFRLEdBQUcsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBQztRQUNqRyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUE7UUFDcEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDN0YsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JELE1BQU0sVUFBVSxHQUFHLE1BQU0s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SUFBSSxFQUFFLDBCQUEwQixFQUFDLENBQUMsQ0FBQTtRQUNwSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDM0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBWZWxvY2lvdXNFcnJvciBmcm9tIFwiLi4vdmVsb2Npb3VzLWVycm9yLmpzXCJcblxuaW1wb3J0IHtkZWNsYXJlZFN5bmNTY29wZUF0dHJpYnV0ZXN9IGZyb20gXCIuL3N5bmMtc2NvcGUtYXR0cmlidXRlcy5qc1wiXG5pbXBvcnQge2RlY29kZVJlcGxheVBlcnNpc3RlZERhdGF9IGZyb20gXCIuL3N5bmMtcmVwbGF5LXBlcnNpc3RlZC1kYXRhLmpzXCJcblxuLyoqXG4gKiBHZW5lcmljIGN1cnNvci1wYWdpbmF0ZWQgY2hhbmdlIGZlZWQgb3ZlciBhbiBhcHAtb3duZWQgc3luYy9jaGFuZ2UgbW9kZWwuXG4gKlxuICogQXBwcyBwcm92aWRlIHRoZSBtb2RlbCBhbmQgb3B0aW9uYWwgc2NvcGluZy9zZXJpYWxpemF0aW9uIGhvb2tzLiBWZWxvY2lvdXMgb3duc1xuICogY3Vyc29yIHBhcnNpbmcsIHNuYXBzaG90IGhpZ2gtd2F0ZXIgcmVzb2x1dGlvbiwgc3RhYmxlIG9yZGVyaW5nLCBwYWdlIGxpbWl0cyxcbiAqIGFuZCByZXNwb25zZSBzaGFwZSBmb3IgYC92ZWxvY2lvdXMvc3luYy9jaGFuZ2VzYCBzdHlsZSBlbmRwb2ludHMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bmNNb2RlbENoYW5nZUZlZWRTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBnZW5lcmljIHN5bmMtbW9kZWwgY2hhbmdlLWZlZWQgc2VydmljZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBTZXJ2aWNlIGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MubW9kZWxDbGFzcyAtIFN5bmMvY2hhbmdlIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBhcmdzLnBhcmFtcyAtIFJlcXVlc3QgcGFyYW1zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuZGVmYXVsdExpbWl0XSAtIERlZmF1bHQgcGFnZSBzaXplLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MubWF4TGltaXRdIC0gTWF4aW11bSBwYWdlIHNpemUuXG4gICAqIEBwYXJhbSB7KHJlY29yZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4pID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBbYXJncy5zZXJpYWxpemVSZWNvcmRdIC0gUmVjb3JkIHNlcmlhbGl6ZXIuXG4gICAqIEBwYXJhbSB7KGFyZ3M6IHtxdWVyeTogaW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0pID0+IHZvaWR9IFthcmdzLnNjb3BlUXVlcnldIC0gQXBwbGllcyBhcHAtb3duZWQgdmlzaWJpbGl0eSBzY29wZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtkZWZhdWx0TGltaXQgPSAxMDAwLCBtYXhMaW1pdCA9IDEwMDAsIG1vZGVsQ2xhc3MsIHBhcmFtcywgc2NvcGVRdWVyeSwgc2VyaWFsaXplUmVjb3JkfSkge1xuICAgIHRoaXMuZGVmYXVsdExpbWl0ID0gZGVmYXVsdExpbWl0XG4gICAgdGhpcy5tYXhMaW1pdCA9IG1heExpbWl0XG4gICAgdGhpcy5tb2RlbENsYXNzID0gbW9kZWxDbGFzc1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zXG4gICAgdGhpcy5zY29wZVF1ZXJ5ID0gc2NvcGVRdWVyeSB8fCBudWxsXG4gICAgdGhpcy5zZXJpYWxpemVSZWNvcmQgPSBzZXJpYWxpemVSZWNvcmQgfHwgKChyZWNvcmQpID0+IHRoaXMuZGVmYXVsdFNlcmlhbGl6ZVJlY29yZChyZWNvcmQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHN0YWJsZSBjaGFuZ2UtZmVlZCBwYWdlLiBUaGUgYWRkaXRpdmUgYHRvdGFsYCBpcyB0aGUgc2NvcGUncyBwZW5kaW5nXG4gICAqIGNoYW5nZSBjb3VudCBmcm9tIHRoZSByZXF1ZXN0IGN1cnNvciB0byB0aGUgc25hcHNob3QgYm91bmQgKGEgQ09VTlQsIG5vdCBhXG4gICAqIG1hdGVyaWFsaXplZCByZWFkKSwgc28gYSBjbGllbnQgY2FuIHJlbmRlciBhIFwic3luY2VkIG9mIHRvdGFsXCIgcHJvZ3Jlc3MgYmFyO1xuICAgKiBvbGRlciBjbGllbnRzIGlnbm9yZSBpdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8e3N0YXR1czogc3RyaW5nLCBuZXh0Q3Vyc29yOiB7aWQ6IHN0cmluZywgc2VydmVyU2VxdWVuY2U6IG51bWJlciwgdXBkYXRlZEF0OiBzdHJpbmd9IHwgbnVsbCwgc3luY3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiwgdG90YWw6IG51bWJlciwgdXBUb0N1cnNvcjoge2lkOiBzdHJpbmcsIHNlcnZlclNlcXVlbmNlOiBudW1iZXIsIHVwZGF0ZWRBdDogc3RyaW5nfSB8IG51bGx9Pn0gQ2hhbmdlLWZlZWQgcGFnZSByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjaGFuZ2VzKCkge1xuICAgIGNvbnN0IGxpbWl0ID0gdGhpcy5ub3JtYWxpemVkTGltaXQodGhpcy5wYXJhbXMubGltaXQpXG4gICAgY29uc3QgdXBUb0N1cnNvciA9IGF3YWl0IHRoaXMucmVzb2x2ZVVwVG9DdXJzb3IoKVxuXG4gICAgaWYgKCF1cFRvQ3Vyc29yKSByZXR1cm4ge3N0YXR1czogXCJzdWNjZXNzXCIsIG5leHRDdXJzb3I6IG51bGwsIHN5bmNzOiBbXSwgdG90YWw6IDAsIHVwVG9DdXJzb3I6IG51bGx9XG5cbiAgICBjb25zdCB0b3RhbCA9IGF3YWl0IHRoaXMudG90YWxQZW5kaW5nQ2hhbmdlcyh7dXBUb0N1cnNvcn0pXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnBhZ2VRdWVyeSh7bGltaXQsIHVwVG9DdXJzb3J9KVxuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBxdWVyeS50b0FycmF5KClcbiAgICBjb25zdCBuZXh0Q3Vyc29yID0gcmVjb3Jkcy5sZW5ndGggPiAwID8gdGhpcy5jdXJzb3JGb3JSZWNvcmQocmVjb3Jkc1tyZWNvcmRzLmxlbmd0aCAtIDFdKSA6IHVwVG9DdXJzb3JcblxuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxuICAgICAgbmV4dEN1cnNvcixcbiAgICAgIHN5bmNzOiByZWNvcmRzLm1hcCgocmVjb3JkKSA9PiB0aGlzLnNlcmlhbGl6ZVJlY29yZChyZWNvcmQpKSxcbiAgICAgIHRvdGFsLFxuICAgICAgdXBUb0N1cnNvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIHRoZSByZXF1ZXN0ZWQgcGFnZSBsaW1pdC5cbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFJhdyBsaW1pdCBwYXJhbS5cbiAgICogQHJldHVybnMge251bWJlcn0gTm9ybWFsaXplZCBwYWdlIGxpbWl0LlxuICAgKi9cbiAgbm9ybWFsaXplZExpbWl0KHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHJldHVybiB0aGlzLmRlZmF1bHRMaW1pdFxuXG4gICAgY29uc3QgbGltaXQgPSBOdW1iZXIodmFsdWUpXG5cbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGxpbWl0KSB8fCBsaW1pdCA8PSAwKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKFwiU3luYyBjaGFuZ2VzIGxpbWl0IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLlwiLCB7Y29kZTogXCJzeW5jLWludmFsaWQtY2hhbmdlcy1saW1pdFwifSlcbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5taW4obGltaXQsIHRoaXMubWF4TGltaXQpXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGFuIG9wdGlvbmFsIHBvc2l0aXZlIGludGVnZXIgY3Vyc29yIGZpZWxkLlxuICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmF3IGludGVnZXIgcGFyYW0uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gUGFyYW0gbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gICAqIEByZXR1cm5zIHtudW1iZXIgfCBudWxsfSBQb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlLCBvciBudWxsIHdoZW4gb21pdHRlZC5cbiAgICovXG4gIG9wdGlvbmFsUG9zaXRpdmVJbnRlZ2VyUGFyYW0odmFsdWUsIG5hbWUpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGludGVnZXIgPSBOdW1iZXIodmFsdWUpXG5cbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGludGVnZXIpIHx8IGludGVnZXIgPD0gMCkge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShgJHtuYW1lfSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci5gLCB7Y29kZTogXCJzeW5jLWludmFsaWQtY2hhbmdlcy1jdXJzb3JcIn0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVnZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgaGlnaC13YXRlciBjdXJzb3IgdGhhdCBib3VuZHMgdGhlIGN1cnJlbnQgZmVlZCBwYWdlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7aWQ6IHN0cmluZywgc2VydmVyU2VxdWVuY2U6IG51bWJlciwgdXBkYXRlZEF0OiBzdHJpbmd9IHwgbnVsbD59IFNuYXBzaG90IHVwcGVyLWJvdW5kIGN1cnNvci5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVVcFRvQ3Vyc29yKCkge1xuICAgIGNvbnN0IHVwVG9TZXJ2ZXJTZXF1ZW5jZSA9IHRoaXMub3B0aW9uYWxQb3NpdGl2ZUludGVnZXJQYXJhbSh0aGlzLnBhcmFtcy51cFRvU2VydmVyU2VxdWVuY2UsIFwidXBUb1NlcnZlclNlcXVlbmNlXCIpXG5cbiAgICBpZiAodXBUb1NlcnZlclNlcXVlbmNlICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvVXBkYXRlZEF0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvSWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7aWQ6IHRoaXMucGFyYW1zLnVwVG9JZCwgc2VydmVyU2VxdWVuY2U6IHVwVG9TZXJ2ZXJTZXF1ZW5jZSwgdXBkYXRlZEF0OiB0aGlzLnBhcmFtcy51cFRvVXBkYXRlZEF0fVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5wYXJhbXMudXBUb1VwZGF0ZWRBdCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgdGhpcy5wYXJhbXMudXBUb0lkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCB1cFRvUmVjb3JkID0gYXdhaXQgdGhpcy5tb2RlbENsYXNzLmZpbmRCeSh7aWQ6IHRoaXMucGFyYW1zLnVwVG9JZH0pXG5cbiAgICAgIGlmICh1cFRvUmVjb3JkKSByZXR1cm4gdGhpcy5jdXJzb3JGb3JSZWNvcmQodXBUb1JlY29yZClcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2NvcGVkUXVlcnkoKVxuICAgIGNvbnN0IHRhYmxlID0gcXVlcnkuZHJpdmVyLnF1b3RlVGFibGUodGhpcy5tb2RlbENsYXNzLnRhYmxlTmFtZSgpKVxuICAgIGNvbnN0IHNlcnZlclNlcXVlbmNlQ29sdW1uID0gcXVlcnkuZHJpdmVyLnF1b3RlQ29sdW1uKFwic2VydmVyX3NlcXVlbmNlXCIpXG4gICAgY29uc3QgbGF0ZXN0UmVjb3JkcyA9IGF3YWl0IHF1ZXJ5XG4gICAgICAub3JkZXIoYCR7dGFibGV9LiR7c2VydmVyU2VxdWVuY2VDb2x1bW59IERFU0NgKVxuICAgICAgLmxpbWl0KDEpXG4gICAgICAudG9BcnJheSgpXG5cbiAgICBpZiAobGF0ZXN0UmVjb3Jkcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4gdGhpcy5jdXJzb3JGb3JSZWNvcmQobGF0ZXN0UmVjb3Jkc1swXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG9yZGVyZWQgYW5kIGN1cnNvci1maWx0ZXJlZCBwYWdlIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3tsaW1pdDogbnVtYmVyLCB1cFRvQ3Vyc29yOiB7aWQ6IHN0cmluZywgc2VydmVyU2VxdWVuY2U6IG51bWJlciwgdXBkYXRlZEF0OiBzdHJpbmd9fX0gYXJncyAtIFBhZ2UgcXVlcnkgYXJncy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IFBhZ2UgcXVlcnkuXG4gICAqL1xuICBwYWdlUXVlcnkoe2xpbWl0LCB1cFRvQ3Vyc29yfSkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5jdXJzb3JGaWx0ZXJlZFF1ZXJ5KHt1cFRvQ3Vyc29yfSlcbiAgICBjb25zdCBkcml2ZXIgPSBxdWVyeS5kcml2ZXJcbiAgICBjb25zdCBzZXJ2ZXJTZXF1ZW5jZUNvbHVtbiA9IGAke2RyaXZlci5xdW90ZVRhYmxlKHRoaXMubW9kZWxDbGFzcy50YWJsZU5hbWUoKSl9LiR7ZHJpdmVyLnF1b3RlQ29sdW1uKFwic2VydmVyX3NlcXVlbmNlXCIpfWBcblxuICAgIHJldHVybiBxdWVyeVxuICAgICAgLm9yZGVyKGAke3NlcnZlclNlcXVlbmNlQ29sdW1ufSBBU0NgKVxuICAgICAgLmxpbWl0KGxpbWl0KVxuICB9XG5cbiAgLyoqXG4gICAqIENvdW50cyB0aGUgc2NvcGUncyBwZW5kaW5nIGNoYW5nZSByb3dzIGZyb20gdGhlIHJlcXVlc3QgY3Vyc29yIHRvIHRoZSBzbmFwc2hvdFxuICAgKiBib3VuZCB3aXRob3V0IG1hdGVyaWFsaXppbmcgdGhlbSwgc28gdGhlIGNsaWVudCBjYW4gcmVuZGVyIGEgc3RhYmxlIFwib2YgWVwiXG4gICAqIHByb2dyZXNzIGRlbm9taW5hdG9yLlxuICAgKiBAcGFyYW0ge3t1cFRvQ3Vyc29yOiB7aWQ6IHN0cmluZywgc2VydmVyU2VxdWVuY2U6IG51bWJlciwgdXBkYXRlZEF0OiBzdHJpbmd9fX0gYXJncyAtIENvdW50IGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IFBlbmRpbmcgY2hhbmdlIGNvdW50IGZyb20gdGhlIHJlcXVlc3QgY3Vyc29yLlxuICAgKi9cbiAgYXN5bmMgdG90YWxQZW5kaW5nQ2hhbmdlcyh7dXBUb0N1cnNvcn0pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jdXJzb3JGaWx0ZXJlZFF1ZXJ5KHt1cFRvQ3Vyc29yfSkuY291bnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNjb3BlZCBxdWVyeSB3aXRoIHRoZSBzbmFwc2hvdCB1cHBlciBib3VuZCBhbmQgYWZ0ZXItY3Vyc29yIGZpbHRlcnNcbiAgICogYXBwbGllZCwgYnV0IHdpdGhvdXQgb3JkZXJpbmcgb3IgYSBwYWdlIGxpbWl0LiBTaGFyZWQgYnkgdGhlIHBhZ2UgcmVhZCBhbmQgdGhlXG4gICAqIHRvdGFsLWNvdW50IHNvIGJvdGggY291bnQgdGhlIHNhbWUgc2V0IG9mIHJvd3MuXG4gICAqIEBwYXJhbSB7e3VwVG9DdXJzb3I6IHtpZDogc3RyaW5nLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyLCB1cGRhdGVkQXQ6IHN0cmluZ319fSBhcmdzIC0gRmlsdGVyIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBDdXJzb3ItZmlsdGVyZWQgcXVlcnkuXG4gICAqL1xuICBjdXJzb3JGaWx0ZXJlZFF1ZXJ5KHt1cFRvQ3Vyc29yfSkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zY29wZWRRdWVyeSgpXG4gICAgY29uc3QgZHJpdmVyID0gcXVlcnkuZHJpdmVyXG4gICAgY29uc3QgdGFibGUgPSBkcml2ZXIucXVvdGVUYWJsZSh0aGlzLm1vZGVsQ2xhc3MudGFibGVOYW1lKCkpXG4gICAgY29uc3Qgc2VydmVyU2VxdWVuY2VDb2x1bW4gPSBgJHt0YWJsZX0uJHtkcml2ZXIucXVvdGVDb2x1bW4oXCJzZXJ2ZXJfc2VxdWVuY2VcIil9YFxuICAgIGNvbnN0IHVwZGF0ZWRBdENvbHVtbiA9IGAke3RhYmxlfS4ke2RyaXZlci5xdW90ZUNvbHVtbihcInVwZGF0ZWRfYXRcIil9YFxuICAgIGNvbnN0IGlkQ29sdW1uID0gYCR7dGFibGV9LiR7ZHJpdmVyLnF1b3RlQ29sdW1uKFwiaWRcIil9YFxuXG4gICAgcXVlcnkud2hlcmUoYCR7c2VydmVyU2VxdWVuY2VDb2x1bW59IDw9ICR7ZHJpdmVyLnF1b3RlKHVwVG9DdXJzb3Iuc2VydmVyU2VxdWVuY2UpfWApXG5cbiAgICBjb25zdCBhZnRlclNlcnZlclNlcXVlbmNlID0gdGhpcy5vcHRpb25hbFBvc2l0aXZlSW50ZWdlclBhcmFtKHRoaXMucGFyYW1zLmFmdGVyU2VydmVyU2VxdWVuY2UsIFwiYWZ0ZXJTZXJ2ZXJTZXF1ZW5jZVwiKVxuXG4gICAgaWYgKGFmdGVyU2VydmVyU2VxdWVuY2UgIT09IG51bGwpIHtcbiAgICAgIHF1ZXJ5LndoZXJlKGAke3NlcnZlclNlcXVlbmNlQ29sdW1ufSA+ICR7ZHJpdmVyLnF1b3RlKGFmdGVyU2VydmVyU2VxdWVuY2UpfWApXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQgIT09IFwiXCIpIHtcbiAgICAgIGNvbnN0IGlzUGFnaW5nRXhpc3RpbmdTbmFwc2hvdCA9IHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvVXBkYXRlZEF0ID09PSBcInN0cmluZ1wiICYmIHRoaXMucGFyYW1zLnVwVG9VcGRhdGVkQXQgIT09IFwiXCIgJiYgdHlwZW9mIHRoaXMucGFyYW1zLnVwVG9JZCA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLnBhcmFtcy51cFRvSWQgIT09IFwiXCJcblxuICAgICAgaWYgKGlzUGFnaW5nRXhpc3RpbmdTbmFwc2hvdCAmJiB0eXBlb2YgdGhpcy5wYXJhbXMuYWZ0ZXJJZCA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLnBhcmFtcy5hZnRlcklkICE9PSBcIlwiKSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlKGAoJHt1cGRhdGVkQXRDb2x1bW59ID4gJHtkcml2ZXIucXVvdGUodGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQpfSBPUiAoJHt1cGRhdGVkQXRDb2x1bW59ID0gJHtkcml2ZXIucXVvdGUodGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQpfSBBTkQgJHtpZENvbHVtbn0gPiAke2RyaXZlci5xdW90ZSh0aGlzLnBhcmFtcy5hZnRlcklkKX0pKWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeS53aGVyZShgJHt1cGRhdGVkQXRDb2x1bW59ID49ICR7ZHJpdmVyLnF1b3RlKHRoaXMucGFyYW1zLmFmdGVyVXBkYXRlZEF0KX1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWVyeVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIGJhc2UgcXVlcnkgd2l0aCBhcHAtb3duZWQgc2NvcGUgYXBwbGllZC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IFNjb3BlZCBiYXNlIHF1ZXJ5LlxuICAgKi9cbiAgc2NvcGVkUXVlcnkoKSB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLm1vZGVsQ2xhc3Mud2hlcmUoe30pXG5cbiAgICBpZiAodGhpcy5zY29wZVF1ZXJ5KSB0aGlzLnNjb3BlUXVlcnkoe3F1ZXJ5fSlcblxuICAgIHJldHVybiBxdWVyeVxuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSByZWNvcmQgaW50byBhIHRyYW5zcG9ydCBjdXJzb3IuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHJlY29yZCAtIFN5bmMvY2hhbmdlIHJlY29yZC5cbiAgICogQHJldHVybnMge3tpZDogc3RyaW5nLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyLCB1cGRhdGVkQXQ6IHN0cmluZ319IEN1cnNvciBmb3Igcm93LlxuICAgKi9cbiAgY3Vyc29yRm9yUmVjb3JkKHJlY29yZCkge1xuICAgIHJldHVybiB7aWQ6IFN0cmluZyh0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJpZFwiKSksIHNlcnZlclNlcXVlbmNlOiBOdW1iZXIodGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIFwic2VydmVyU2VxdWVuY2VcIikpLCB1cGRhdGVkQXQ6IHRoaXMuaXNvRGF0ZSh0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJ1cGRhdGVkQXRcIikpfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSByZWNvcmQgdXNpbmcgdGhlIHN0YW5kYXJkIHN5bmMgZW52ZWxvcGUgc2hhcGUgcGx1cyB0aGUgc3luY1xuICAgKiBtb2RlbCdzIGRlY2xhcmVkIHNjb3BlLXBhcnRpdGlvbiBhdHRyaWJ1dGVzIChgc3RhdGljIHN5bmNTY29wZUF0dHJpYnV0ZXNgKSxcbiAgICogZWFjaCBlbWl0dGVkIHVuZGVyIGl0cyBvd24gYXR0cmlidXRlIG5hbWUuIE1vZGVscyBkZWNsYXJpbmcgbm8gc2NvcGVcbiAgICogYXR0cmlidXRlcyBrZWVwIHRoZSBkZXByZWNhdGVkIDEuMC41MDMgd2lyZSBhbmQgZW1pdCBgZXZlbnRJZGAuIEtleXMgYXJlXG4gICAqIHNvcnRlZCBzbyBhIGRlY2xhcmVkIGBbXCJldmVudElkXCJdYCBwYXJ0aXRpb24gc3RheXMgYnl0ZS1pZGVudGljYWwgd2l0aCB0aGVcbiAgICogMS4wLjUwMyB3aXJlLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSByZWNvcmQgLSBTeW5jL2NoYW5nZSByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gRGVmYXVsdCBzZXJpYWxpemVkIHJvdy5cbiAgICovXG4gIGRlZmF1bHRTZXJpYWxpemVSZWNvcmQocmVjb3JkKSB7XG4gICAgY29uc3Qgc2NvcGVBdHRyaWJ1dGVzID0gZGVjbGFyZWRTeW5jU2NvcGVBdHRyaWJ1dGVzKHRoaXMubW9kZWxDbGFzcylcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqL1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB7XG4gICAgICBkYXRhOiB0aGlzLnJlY29yZERhdGEocmVjb3JkKSxcbiAgICAgIGlkOiB0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJpZFwiKSxcbiAgICAgIHJlc291cmNlSWQ6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInJlc291cmNlSWRcIiksXG4gICAgICByZXNvdXJjZVR5cGU6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInJlc291cmNlVHlwZVwiKSxcbiAgICAgIHNlcnZlclNlcXVlbmNlOiB0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJzZXJ2ZXJTZXF1ZW5jZVwiKSxcbiAgICAgIHN5bmNUeXBlOiB0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJzeW5jVHlwZVwiKSxcbiAgICAgIHVwZGF0ZWRBdDogdGhpcy5pc29EYXRlKHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInVwZGF0ZWRBdFwiKSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNjb3BlQXR0cmlidXRlIG9mIHNjb3BlQXR0cmlidXRlcyB8fCBbXCJldmVudElkXCJdKSB7XG4gICAgICBzZXJpYWxpemVkW3Njb3BlQXR0cmlidXRlXSA9IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBzY29wZUF0dHJpYnV0ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHNlcmlhbGl6ZWQpLnNvcnQoKFtsZWZ0S2V5XSwgW3JpZ2h0S2V5XSkgPT4gbGVmdEtleS5sb2NhbGVDb21wYXJlKHJpZ2h0S2V5KSkpXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW5kIHBhcnNlcyB0aGUgcmVjb3JkIGRhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcmVjb3JkIC0gU3luYy9jaGFuZ2UgcmVjb3JkLlxuICAgKiBAcmV0dXJucyB7dW5rbm93bn0gUGFyc2VkIGRhdGEgdmFsdWUuXG4gICAqL1xuICByZWNvcmREYXRhKHJlY29yZCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJkYXRhXCIpXG5cbiAgICBpZiAoZGF0YSA9PT0gXCJcIiB8fCBkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGxcbiAgICByZXR1cm4gZGVjb2RlUmVwbGF5UGVyc2lzdGVkRGF0YShkYXRhKS5wYXlsb2FkXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYSB2YWx1ZSBmcm9tIGVpdGhlciBhIHJlY29yZCBhY2Nlc3NvciBtZXRob2Qgb3IgcGxhaW4gcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHJlY29yZCAtIFN5bmMvY2hhbmdlIHJlY29yZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBDYW1lbC1jYXNlZCB2YWx1ZS9tZXRob2QgbmFtZS5cbiAgICogQHJldHVybnMge3Vua25vd259IFJlY29yZCB2YWx1ZS5cbiAgICovXG4gIHJlY29yZFZhbHVlKHJlY29yZCwgbmFtZSkge1xuICAgIGlmICghcmVjb3JkIHx8IHR5cGVvZiByZWNvcmQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmMgY2hhbmdlcyByb3cgbXVzdCBiZSBhbiBvYmplY3QuXCIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVjb3JkT2JqZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChyZWNvcmQpXG4gICAgY29uc3QgbWV0aG9kID0gcmVjb3JkT2JqZWN0W25hbWVdXG4gICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgbWV0aG9kID09PSBcImZ1bmN0aW9uXCIgPyBtZXRob2QuY2FsbChyZWNvcmQpIDogbWV0aG9kXG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jIGNoYW5nZXMgcm93IGlzIG1pc3NpbmcgJHtuYW1lfS5gKVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgZGF0ZS1saWtlIHZhbHVlIHRvIGFuIElTTyBzdHJpbmcuXG4gICAqIEBwYXJhbSB7RGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgfCB1bmtub3dufSB2YWx1ZSAtIERhdGUgdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IElTTyBkYXRlLlxuICAgKi9cbiAgaXNvRGF0ZSh2YWx1ZSkge1xuICAgIGNvbnN0IGRhdGUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyB2YWx1ZSA6IDApXG5cbiAgICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShcIlN5bmMgY2hhbmdlcyByb3cgaGFzIGFuIGludmFsaWQgdXBkYXRlZF9hdCB2YWx1ZS5cIiwge2NvZGU6IFwic3luYy1pbnZhbGlkLWNoYW5nZXMtcm93XCJ9KVxuICAgIH1cblxuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps change-feed data with replay acknowledgement metadata in the existing
|
|
3
|
+
* durable sync-row data column.
|
|
4
|
+
* @param {{acknowledgementVersion: string | number | null, clientMutationId: string, payload: ReturnType<typeof JSON.parse>, payloadFingerprint: string}} args - Durable replay metadata and public payload.
|
|
5
|
+
* @returns {string} Serialized durable value.
|
|
6
|
+
*/
|
|
7
|
+
export declare function serializeReplayPersistedData({ acknowledgementVersion, clientMutationId, payload, payloadFingerprint }: {
|
|
8
|
+
acknowledgementVersion: string | number | null;
|
|
9
|
+
clientMutationId: string;
|
|
10
|
+
payload: ReturnType<typeof JSON.parse>;
|
|
11
|
+
payloadFingerprint: string;
|
|
12
|
+
}): string;
|
|
13
|
+
/**
|
|
14
|
+
* Decodes framework-owned replay metadata while leaving ordinary sync data unchanged.
|
|
15
|
+
* @param {ReturnType<typeof JSON.parse>} value - Parsed or serialized sync-row data.
|
|
16
|
+
* @returns {{metadata: {acknowledgementVersion: string | number | null, clientMutationId: string, payloadFingerprint: string} | null, payload: ReturnType<typeof JSON.parse>}} Decoded metadata and public payload.
|
|
17
|
+
*/
|
|
18
|
+
export declare function decodeReplayPersistedData(value: ReturnType<typeof JSON.parse>): {
|
|
19
|
+
metadata: {
|
|
20
|
+
acknowledgementVersion: string | number | null;
|
|
21
|
+
clientMutationId: string;
|
|
22
|
+
payloadFingerprint: string;
|
|
23
|
+
} | null;
|
|
24
|
+
payload: ReturnType<typeof JSON.parse>;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=sync-replay-persisted-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-replay-persisted-data.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-replay-persisted-data.js"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,EAAC,sBAAsB,EAAE,gBAAgB,EAAE,OAAO,EAAE,kBAAkB,EAAC,EAHzG;IAAC,sBAAsB,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAGpC,GAFvG,MAAM,CAOlB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAHpC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAGQ,GAFlC;IAAC,QAAQ,EAAE;QAAC,sBAAsB,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAA;CAAC,CA4B7K"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
const METADATA_KEY = "$velociousReplay";
|
|
3
|
+
const PAYLOAD_KEY = "payload";
|
|
4
|
+
/**
|
|
5
|
+
* Wraps change-feed data with replay acknowledgement metadata in the existing
|
|
6
|
+
* durable sync-row data column.
|
|
7
|
+
* @param {{acknowledgementVersion: string | number | null, clientMutationId: string, payload: ReturnType<typeof JSON.parse>, payloadFingerprint: string}} args - Durable replay metadata and public payload.
|
|
8
|
+
* @returns {string} Serialized durable value.
|
|
9
|
+
*/
|
|
10
|
+
export function serializeReplayPersistedData({ acknowledgementVersion, clientMutationId, payload, payloadFingerprint }) {
|
|
11
|
+
return JSON.stringify({
|
|
12
|
+
[METADATA_KEY]: { acknowledgementVersion, clientMutationId, payloadFingerprint },
|
|
13
|
+
[PAYLOAD_KEY]: payload
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Decodes framework-owned replay metadata while leaving ordinary sync data unchanged.
|
|
18
|
+
* @param {ReturnType<typeof JSON.parse>} value - Parsed or serialized sync-row data.
|
|
19
|
+
* @returns {{metadata: {acknowledgementVersion: string | number | null, clientMutationId: string, payloadFingerprint: string} | null, payload: ReturnType<typeof JSON.parse>}} Decoded metadata and public payload.
|
|
20
|
+
*/
|
|
21
|
+
export function decodeReplayPersistedData(value) {
|
|
22
|
+
const parsed = typeof value === "string" ? JSON.parse(value) : value;
|
|
23
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
24
|
+
return { metadata: null, payload: parsed };
|
|
25
|
+
const record = /** @type {Record<string, ReturnType<typeof JSON.parse>>} */ (parsed);
|
|
26
|
+
const metadata = record[METADATA_KEY];
|
|
27
|
+
if (!metadata || typeof metadata !== "object" || Array.isArray(metadata) || !Object.hasOwn(record, PAYLOAD_KEY)) {
|
|
28
|
+
return { metadata: null, payload: parsed };
|
|
29
|
+
}
|
|
30
|
+
const metadataRecord = /** @type {Record<string, ReturnType<typeof JSON.parse>>} */ (metadata);
|
|
31
|
+
if (typeof metadataRecord.clientMutationId !== "string" || typeof metadataRecord.payloadFingerprint !== "string") {
|
|
32
|
+
return { metadata: null, payload: parsed };
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
metadata: {
|
|
36
|
+
acknowledgementVersion: metadataRecord.acknowledgementVersion,
|
|
37
|
+
clientMutationId: metadataRecord.clientMutationId,
|
|
38
|
+
payloadFingerprint: metadataRecord.payloadFingerprint
|
|
39
|
+
},
|
|
40
|
+
payload: record[PAYLOAD_KEY]
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1yZXBsYXktcGVyc2lzdGVkLWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9zeW5jLXJlcGxheS1wZXJzaXN0ZWQtZGF0YS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUE7QUFDdkMsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFBO0FBRTdCOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLDRCQUE0QixDQUFDLEVBQUMsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFDO0lBQ2xILE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNwQixDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUMsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUM7UUFDOUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPO0tBQ3ZCLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUFDLEtBQUs7SUFDN0MsTUFBTSxNQUFNLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7SUFFcEUsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFDLENBQUE7SUFFNUcsTUFBTSxNQUFNLEdBQUcsNERBQTRELENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNwRixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7SUFFckMsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDaEgsT0FBTyxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBQyxDQUFBO0lBQzFDLENBQUM7SUFFRCxNQUFNLGNBQWMsR0FBRyw0REFBNEQsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRTlGLElBQUksT0FBTyxjQUFjLENBQUMsZ0JBQWdCLEtBQUssUUFBUSxJQUFJLE9BQU8sY0FBYyxDQUFDLGtCQUFrQixLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2pILE9BQU8sRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUMsQ0FBQTtJQUMxQyxDQUFDO0lBRUQsT0FBTztRQUNMLFFBQVEsRUFBRTtZQUNSLHNCQUFzQixFQUFFLGNBQWMsQ0FBQyxzQkFBc0I7WUFDN0QsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLGdCQUFnQjtZQUNqRCxrQkFBa0IsRUFBRSxjQUFjLENBQUMsa0JBQWtCO1NBQ3REO1FBQ0QsT0FBTyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUM7S0FDN0IsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuY29uc3QgTUVUQURBVEFfS0VZID0gXCIkdmVsb2Npb3VzUmVwbGF5XCJcbmNvbnN0IFBBWUxPQURfS0VZID0gXCJwYXlsb2FkXCJcblxuLyoqXG4gKiBXcmFwcyBjaGFuZ2UtZmVlZCBkYXRhIHdpdGggcmVwbGF5IGFja25vd2xlZGdlbWVudCBtZXRhZGF0YSBpbiB0aGUgZXhpc3RpbmdcbiAqIGR1cmFibGUgc3luYy1yb3cgZGF0YSBjb2x1bW4uXG4gKiBAcGFyYW0ge3thY2tub3dsZWRnZW1lbnRWZXJzaW9uOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsLCBjbGllbnRNdXRhdGlvbklkOiBzdHJpbmcsIHBheWxvYWQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBwYXlsb2FkRmluZ2VycHJpbnQ6IHN0cmluZ319IGFyZ3MgLSBEdXJhYmxlIHJlcGxheSBtZXRhZGF0YSBhbmQgcHVibGljIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTZXJpYWxpemVkIGR1cmFibGUgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVSZXBsYXlQZXJzaXN0ZWREYXRhKHthY2tub3dsZWRnZW1lbnRWZXJzaW9uLCBjbGllbnRNdXRhdGlvbklkLCBwYXlsb2FkLCBwYXlsb2FkRmluZ2VycHJpbnR9KSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgW01FVEFEQVRBX0tFWV06IHthY2tub3dsZWRnZW1lbnRWZXJzaW9uLCBjbGllbnRNdXRhdGlvbklkLCBwYXlsb2FkRmluZ2VycHJpbnR9LFxuICAgIFtQQVlMT0FEX0tFWV06IHBheWxvYWRcbiAgfSlcbn1cblxuLyoqXG4gKiBEZWNvZGVzIGZyYW1ld29yay1vd25lZCByZXBsYXkgbWV0YWRhdGEgd2hpbGUgbGVhdmluZyBvcmRpbmFyeSBzeW5jIGRhdGEgdW5jaGFuZ2VkLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBQYXJzZWQgb3Igc2VyaWFsaXplZCBzeW5jLXJvdyBkYXRhLlxuICogQHJldHVybnMge3ttZXRhZGF0YToge2Fja25vd2xlZGdlbWVudFZlcnNpb246IHN0cmluZyB8IG51bWJlciB8IG51bGwsIGNsaWVudE11dGF0aW9uSWQ6IHN0cmluZywgcGF5bG9hZEZpbmdlcnByaW50OiBzdHJpbmd9IHwgbnVsbCwgcGF5bG9hZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59fSBEZWNvZGVkIG1ldGFkYXRhIGFuZCBwdWJsaWMgcGF5bG9hZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVJlcGxheVBlcnNpc3RlZERhdGEodmFsdWUpIHtcbiAgY29uc3QgcGFyc2VkID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZSh2YWx1ZSkgOiB2YWx1ZVxuXG4gIGlmICghcGFyc2VkIHx8IHR5cGVvZiBwYXJzZWQgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShwYXJzZWQpKSByZXR1cm4ge21ldGFkYXRhOiBudWxsLCBwYXlsb2FkOiBwYXJzZWR9XG5cbiAgY29uc3QgcmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChwYXJzZWQpXG4gIGNvbnN0IG1ldGFkYXRhID0gcmVjb3JkW01FVEFEQVRBX0tFWV1cblxuICBpZiAoIW1ldGFkYXRhIHx8IHR5cGVvZiBtZXRhZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhKSB8fCAhT2JqZWN0Lmhhc093bihyZWNvcmQsIFBBWUxPQURfS0VZKSkge1xuICAgIHJldHVybiB7bWV0YWRhdGE6IG51bGwsIHBheWxvYWQ6IHBhcnNlZH1cbiAgfVxuXG4gIGNvbnN0IG1ldGFkYXRhUmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChtZXRhZGF0YSlcblxuICBpZiAodHlwZW9mIG1ldGFkYXRhUmVjb3JkLmNsaWVudE11dGF0aW9uSWQgIT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIG1ldGFkYXRhUmVjb3JkLnBheWxvYWRGaW5nZXJwcmludCAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB7bWV0YWRhdGE6IG51bGwsIHBheWxvYWQ6IHBhcnNlZH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWV0YWRhdGE6IHtcbiAgICAgIGFja25vd2xlZGdlbWVudFZlcnNpb246IG1ldGFkYXRhUmVjb3JkLmFja25vd2xlZGdlbWVudFZlcnNpb24sXG4gICAgICBjbGllbnRNdXRhdGlvbklkOiBtZXRhZGF0YVJlY29yZC5jbGllbnRNdXRhdGlvbklkLFxuICAgICAgcGF5bG9hZEZpbmdlcnByaW50OiBtZXRhZGF0YVJlY29yZC5wYXlsb2FkRmluZ2VycHJpbnRcbiAgICB9LFxuICAgIHBheWxvYWQ6IHJlY29yZFtQQVlMT0FEX0tFWV1cbiAgfVxufVxuIl19
|
|
@@ -25,6 +25,8 @@ export default class SharedTransactionBroker extends EventEmitter {
|
|
|
25
25
|
closePromise: Promise<void> | undefined;
|
|
26
26
|
/** @type {Map<object, (callback: () => Promise<ReturnType<typeof JSON.parse>>) => Promise<ReturnType<typeof JSON.parse>>>} */
|
|
27
27
|
connectionCoordinators: Map<object, (callback: () => Promise<ReturnType<typeof JSON.parse>>) => Promise<ReturnType<typeof JSON.parse>>>;
|
|
28
|
+
/** @type {Map<object, symbol>} */
|
|
29
|
+
connectionCoordinatorOwners: Map<object, symbol>;
|
|
28
30
|
httpServer: import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>;
|
|
29
31
|
websocketServer: import("ws").Server<typeof import("ws").WebSocket, typeof import("node:http").IncomingMessage>;
|
|
30
32
|
/**
|
|
@@ -59,6 +61,18 @@ export default class SharedTransactionBroker extends EventEmitter {
|
|
|
59
61
|
* @returns {Promise<void>} - Resolves after responding.
|
|
60
62
|
*/
|
|
61
63
|
handleRequest(socket: import("ws").WebSocket, serialized: string): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Adds the broker owner to public driver methods that re-enter coordinated query work.
|
|
66
|
+
* @param {{args: Array<ReturnType<typeof JSON.parse>>, connection: object, method: string}} args - Physical invocation.
|
|
67
|
+
* @returns {Array<ReturnType<typeof JSON.parse> | {operationOwner: symbol}>} - Owned method arguments.
|
|
68
|
+
*/
|
|
69
|
+
ownedMethodArgs({ args, connection, method }: {
|
|
70
|
+
args: Array<ReturnType<typeof JSON.parse>>;
|
|
71
|
+
connection: object;
|
|
72
|
+
method: string;
|
|
73
|
+
}): Array<ReturnType<typeof JSON.parse> | {
|
|
74
|
+
operationOwner: symbol;
|
|
75
|
+
}>;
|
|
62
76
|
/**
|
|
63
77
|
* Gets mutable serialization state for one physical connection.
|
|
64
78
|
* @param {object} connection - Physical connection.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-transaction-broker.d.ts","sourceRoot":"","sources":["../../../src/testing/shared-transaction-broker.js"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAKtC,YAA8L,eAAe,GAAnM;IAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,YAAY,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,SAAS,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE;QAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,IAAI,EAAE,SAAS,CAAA;KAAC,CAAA;CAAC,CAAiB;
|
|
1
|
+
{"version":3,"file":"shared-transaction-broker.d.ts","sourceRoot":"","sources":["../../../src/testing/shared-transaction-broker.js"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,21 @@ function capabilityMatches(provided, expected) {
|
|
|
33
33
|
const expectedBytes = Buffer.from(expected);
|
|
34
34
|
return providedBytes.length === expectedBytes.length && timingSafeEqual(providedBytes, expectedBytes);
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Adds broker ownership to decoded driver options.
|
|
38
|
+
* @param {ReturnType<typeof JSON.parse>} value - Decoded options.
|
|
39
|
+
* @param {symbol} operationOwner - Broker coordinator owner.
|
|
40
|
+
* @returns {Record<string, ReturnType<typeof JSON.parse>> & {operationOwner: symbol}} - Owned options.
|
|
41
|
+
*/
|
|
42
|
+
function ownedOperationOptions(value, operationOwner) {
|
|
43
|
+
if (value === undefined)
|
|
44
|
+
return { operationOwner };
|
|
45
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
46
|
+
throw new TypeError("Shared transaction broker driver options must be an object");
|
|
47
|
+
}
|
|
48
|
+
const options = /** @type {Record<string, ReturnType<typeof JSON.parse>>} */ (value);
|
|
49
|
+
return { ...options, operationOwner };
|
|
50
|
+
}
|
|
36
51
|
export default class SharedTransactionBroker extends EventEmitter {
|
|
37
52
|
/**
|
|
38
53
|
* Creates a broker around parent-owned physical connections.
|
|
@@ -55,6 +70,8 @@ export default class SharedTransactionBroker extends EventEmitter {
|
|
|
55
70
|
this.closePromise = undefined;
|
|
56
71
|
/** @type {Map<object, (callback: () => Promise<ReturnType<typeof JSON.parse>>) => Promise<ReturnType<typeof JSON.parse>>>} */
|
|
57
72
|
this.connectionCoordinators = new Map();
|
|
73
|
+
/** @type {Map<object, symbol>} */
|
|
74
|
+
this.connectionCoordinatorOwners = new Map();
|
|
58
75
|
for (const connection of new Set(Object.values(connections))) {
|
|
59
76
|
/**
|
|
60
77
|
* Serializes parent operations with child broker traffic.
|
|
@@ -63,7 +80,7 @@ export default class SharedTransactionBroker extends EventEmitter {
|
|
|
63
80
|
*/
|
|
64
81
|
const coordinator = async (callback) => await this.serialize(this.connectionState(connection), callback);
|
|
65
82
|
this.connectionCoordinators.set(connection, coordinator);
|
|
66
|
-
setSharedTransactionCoordinator(connection, coordinator);
|
|
83
|
+
this.connectionCoordinatorOwners.set(connection, setSharedTransactionCoordinator(connection, coordinator));
|
|
67
84
|
}
|
|
68
85
|
this.httpServer = createServer();
|
|
69
86
|
this.websocketServer = new WebSocketServer({ server: this.httpServer, maxPayload: 16 * 1024 * 1024 });
|
|
@@ -142,11 +159,11 @@ export default class SharedTransactionBroker extends EventEmitter {
|
|
|
142
159
|
: request.method === "rootTransactionRollback"
|
|
143
160
|
? "rollbackSavePoint"
|
|
144
161
|
: request.method;
|
|
145
|
-
const connectionMethods = /** @type {Record<string, (...methodArgs: Array<ReturnType<typeof JSON.parse
|
|
162
|
+
const connectionMethods = /** @type {Record<string, (...methodArgs: Array<ReturnType<typeof JSON.parse> | {operationOwner: symbol}>) => ReturnType<typeof JSON.parse>>} */ (connection);
|
|
146
163
|
const method = connectionMethods[physicalMethod];
|
|
147
164
|
if (typeof method !== "function")
|
|
148
165
|
throw new Error(`Connection does not support shared transaction method: ${request.method}`);
|
|
149
|
-
return await method.apply(connection, args);
|
|
166
|
+
return await method.apply(connection, this.ownedMethodArgs({ args, connection, method: physicalMethod }));
|
|
150
167
|
});
|
|
151
168
|
if (socket.readyState === socket.OPEN)
|
|
152
169
|
socket.send(JSON.stringify({ requestId, result: encodeBrokerValue(result) }));
|
|
@@ -157,6 +174,23 @@ export default class SharedTransactionBroker extends EventEmitter {
|
|
|
157
174
|
socket.send(JSON.stringify({ requestId, error: encodeBrokerValue(normalized) }));
|
|
158
175
|
}
|
|
159
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* Adds the broker owner to public driver methods that re-enter coordinated query work.
|
|
179
|
+
* @param {{args: Array<ReturnType<typeof JSON.parse>>, connection: object, method: string}} args - Physical invocation.
|
|
180
|
+
* @returns {Array<ReturnType<typeof JSON.parse> | {operationOwner: symbol}>} - Owned method arguments.
|
|
181
|
+
*/
|
|
182
|
+
ownedMethodArgs({ args, connection, method }) {
|
|
183
|
+
const operationOwner = this.connectionCoordinatorOwners.get(connection);
|
|
184
|
+
if (!operationOwner)
|
|
185
|
+
throw new Error("Shared transaction broker connection owner is missing");
|
|
186
|
+
if (["_startTransactionAction", "_commitTransactionAction", "_rollbackTransactionAction"].includes(method)) {
|
|
187
|
+
return [ownedOperationOptions(args[0], operationOwner)];
|
|
188
|
+
}
|
|
189
|
+
if (["query", "affectedRows", "startSavePoint", "releaseSavePoint", "rollbackSavePoint"].includes(method)) {
|
|
190
|
+
return [args[0], ownedOperationOptions(args[1], operationOwner)];
|
|
191
|
+
}
|
|
192
|
+
return args;
|
|
193
|
+
}
|
|
160
194
|
/**
|
|
161
195
|
* Gets mutable serialization state for one physical connection.
|
|
162
196
|
* @param {object} connection - Physical connection.
|
|
@@ -334,17 +368,20 @@ export default class SharedTransactionBroker extends EventEmitter {
|
|
|
334
368
|
* @returns {Promise<void>} - Resolves after rollback and release.
|
|
335
369
|
*/
|
|
336
370
|
async rollbackRootSavePoint(connection, savePointName) {
|
|
337
|
-
const methods = /** @type {{releaseSavePoint: (name: string) => Promise<void>, rollbackSavePoint: (name: string) => Promise<void>}} */ (connection);
|
|
371
|
+
const methods = /** @type {{releaseSavePoint: (name: string, options?: {operationOwner?: symbol}) => Promise<void>, rollbackSavePoint: (name: string, options?: {operationOwner?: symbol}) => Promise<void>}} */ (connection);
|
|
372
|
+
const operationOwner = this.connectionCoordinatorOwners.get(connection);
|
|
373
|
+
if (!operationOwner)
|
|
374
|
+
throw new Error("Shared transaction broker connection owner is missing");
|
|
338
375
|
/** @type {Array<Error>} */
|
|
339
376
|
const errors = [];
|
|
340
377
|
try {
|
|
341
|
-
await methods.rollbackSavePoint(savePointName);
|
|
378
|
+
await methods.rollbackSavePoint(savePointName, { operationOwner });
|
|
342
379
|
}
|
|
343
380
|
catch (error) {
|
|
344
381
|
errors.push(error instanceof Error ? error : new Error(String(error)));
|
|
345
382
|
}
|
|
346
383
|
try {
|
|
347
|
-
await methods.releaseSavePoint(savePointName);
|
|
384
|
+
await methods.releaseSavePoint(savePointName, { operationOwner });
|
|
348
385
|
}
|
|
349
386
|
catch (error) {
|
|
350
387
|
errors.push(error instanceof Error ? error : new Error(String(error)));
|
|
@@ -411,4 +448,4 @@ export default class SharedTransactionBroker extends EventEmitter {
|
|
|
411
448
|
}
|
|
412
449
|
}
|
|
413
450
|
}
|
|
414
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLXRyYW5zYWN0aW9uLWJyb2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3NoYXJlZC10cmFuc2FjdGlvbi1icm9rZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBQ3BGLE9BQU8sRUFBQyxpQ0FBaUMsRUFBRSwrQkFBK0IsRUFBQyxNQUFNLGdEQUFnRCxDQUFBO0FBRWpJLG9OQUFvTjtBQUVwTixNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUM5QixPQUFPO0lBQ1AsY0FBYztJQUNkLGNBQWM7SUFDZCxxQkFBcUI7SUFDckIseUJBQXlCO0lBQ3pCLDBCQUEwQjtJQUMxQiw0QkFBNEI7SUFDNUIsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsMEJBQTBCO0lBQzFCLHNCQUFzQjtJQUN0Qix3QkFBd0I7SUFDeEIseUJBQXlCO0NBQzFCLENBQUMsQ0FBQTtBQUVGOzs7OztHQUtHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsUUFBUTtJQUMzQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzNDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDM0MsT0FBTyxhQUFhLENBQUMsTUFBTSxLQUFLLGFBQWEsQ0FBQyxNQUFNLElB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RyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3BGLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDL0UsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0QsS0FBSyxNQUFNLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ3BFLGlDQUFpQyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUM1RCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsNkNBQTZDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMxSixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7IHJhbmRvbUJ5dGVzLCB0aW1pbmdTYWZlRXF1YWwgfSBmcm9tIFwibm9kZTpjcnlwdG9cIlxuaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSBcIm5vZGU6aHR0cFwiXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwibm9kZTpldmVudHNcIlxuaW1wb3J0IHsgV2ViU29ja2V0U2VydmVyIH0gZnJvbSBcIndzXCJcbmltcG9ydCB7IGRlY29kZUJyb2tlclZhbHVlLCBlbmNvZGVCcm9rZXJWYWx1ZSB9IGZyb20gXCIuL3NoYXJlZC10cmFuc2FjdGlvbi1jb2RlYy5qc1wiXG5pbXBvcnQge2NsZWFyU2hhcmVkVHJhbnNhY3Rpb25Db29yZGluYXRvciwgc2V0U2hhcmVkVHJhbnNhY3Rpb25Db29yZGluYXRvcn0gZnJvbSBcIi4vc2hhcmVkLXRyYW5zYWN0aW9uLWNvbm5lY3Rpb24tY29vcmRpbmF0b3IuanNcIlxuXG4vKiogQHR5cGVkZWYge3txdWV1ZTogUHJvbWlzZTx2b2lkPiwgcm9vdFNlc3Npb25zOiBTZXQ8aW1wb3J0KFwid3NcIikuV2ViU29ja2V0PiwgbGVhc2U/OiB7b3BlcmF0aW9uczogUHJvbWlzZTx2b2lkPiwgcmVsZWFzZTogKCkgPT4gdm9pZCwgc2F2ZVBvaW50TmFtZTogc3RyaW5nLCBzb2NrZXQ6IGltcG9ydChcIndzXCIpLldlYlNvY2tldH19fSBDb25uZWN0aW9uU3RhdGUgKi9cblxuY29uc3QgQUxMT1dFRF9NRVRIT0RTID0gbmV3IFNldChbXG4gIFwicXVlcnlcIixcbiAgXCJhZmZlY3RlZFJvd3NcIixcbiAgXCJfcXVlcnlBY3R1YWxcIixcbiAgXCJfYWZmZWN0ZWRSb3dzQWN0dWFsXCIsXG4gIFwiX3N0YXJ0VHJhbnNhY3Rpb25BY3Rpb25cIixcbiAgXCJfY29tbWl0VHJhbnNhY3Rpb25BY3Rpb25cIixcbiAgXCJfcm9sbGJhY2tUcmFuc2FjdGlvbkFjdGlvblwiLFxuICBcInN0YXJ0U2F2ZVBvaW50XCIsXG4gIFwicmVsZWFzZVNhdmVQb2ludFwiLFxuICBcInJvbGxiYWNrU2F2ZVBvaW50XCIsXG4gIFwiZ2V0Q29ubmVjdGlvblNjb3BlZFZhbHVlXCIsXG4gIFwicm9vdFRyYW5zYWN0aW9uU3RhcnRcIixcbiAgXCJyb290VHJhbnNhY3Rpb25SZWxlYXNlXCIsXG4gIFwicm9vdFRyYW5zYWN0aW9uUm9sbGJhY2tcIlxuXSlcblxuLyoqXG4gKiBDb21wYXJlcyBhIHByZXNlbnRlZCBjYXBhYmlsaXR5IHdpdGhvdXQgbGVha2luZyBtYXRjaGluZyBwcmVmaXggdGltaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVkIC0gUHJlc2VudGVkIGNhcGFiaWxpdHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWQgLSBBY3RpdmUgY2FwYWJpbGl0eS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNhcGFiaWxpdGllcyBtYXRjaC5cbiAqL1xuZnVuY3Rpb24gY2FwYWJpbGl0eU1hdGNoZXMocHJvdmlkZWQsIGV4cGVjdGVkKSB7XG4gIGNvbnN0IHByb3ZpZGVkQnl0ZXMgPSBCdWZmZXIuZnJvbShwcm92aWRlZClcbiAgY29uc3QgZXhwZWN0ZWRCeXRlcyA9IEJ1ZmZlci5mcm9tKGV4cGVjdGVkKVxuICByZXR1cm4gcHJvdmlkZWRCeXRlcy5sZW5ndGggPT09IGV4cGVjdGVkQnl0ZXMubGVuZ3RoICYmIHRpbWluZ1NhZmVFcXVhbChwcm92aWRlZEJ5dGVzLCBleHBlY3RlZEJ5dGVzKVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGFyZWRUcmFuc2FjdGlvbkJyb2tlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYnJva2VyIGFyb3VuZCBwYXJlbnQtb3duZWQgcGh5c2ljYWwgY29ubmVjdGlvbnMuXG4gICAqIEBwYXJhbSB7e2Nvbm5lY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+fX0gYXJncyAtIFBhcmVudC1vd25lZCBwaHlzaWNhbCBjb25uZWN0aW9ucy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25uZWN0aW9uc30pIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25zXG4gICAgdGhpcy5zZWNyZXQgPSByYW5kb21CeXRlcygzMikudG9TdHJpbmcoXCJiYXNlNjR1cmxcIilcbiAgICB0aGlzLmFjY2VwdGluZyA9IHRydWVcbiAgICAvKiogQHR5cGUge01hcDxvYmplY3QsIENvbm5lY3Rpb25TdGF0ZT59ICovXG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdGVzID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtTZXQ8aW1wb3J0KFwid3NcIikuV2ViU29ja2V0Pn0gKi9cbiAgICB0aGlzLnNlc3Npb25zID0gbmV3IFNldCgpXG4gICAgLyoqIEB0eXBlIHtNYXA8aW1wb3J0KFwid3NcIikuV2ViU29ja2V0LCBQcm9taXNlPHZvaWQ+Pn0gKi9cbiAgICB0aGlzLnNlc3Npb25DbGVhbnVwID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtBcnJheTxFcnJvcj59ICovXG4gICAgdGhpcy5jbGVhbnVwRXJyb3JzID0gW11cbiAgICAvKiogQHR5cGUge1Byb21pc2U8dm9pZD4gfCB1bmRlZmluZWR9ICovXG4gICAgdGhpcy5jbG9zZVByb21pc2UgPSB1bmRlZmluZWRcbiAgICAvKiogQHR5cGUge01hcDxvYmplY3QsIChjYWxsYmFjazogKCkgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4pID0+IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gKi9cbiAgICB0aGlzLmNvbm5lY3Rpb25Db29yZGluYXRvcnMgPSBuZXcgTWFwKClcbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgbmV3IFNldChPYmplY3QudmFsdWVzKGNvbm5lY3Rpb25zKSkpIHtcbiAgICAgIC8qKlxuICAgICAgICogU2VyaWFsaXplcyBwYXJlbnQgb3BlcmF0aW9ucyB3aXRoIGNoaWxkIGJyb2tlciB0cmFmZmljLlxuICAgICAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPHVua25vd24+fSBjYWxsYmFjayAtIFBhcmVudCBvcGVyYXRpb24uXG4gICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn0gLSBPcGVyYXRpb24gcmVzdWx0LlxuICAgICAgICovXG4gICAgICBjb25zdCBjb29yZGluYXRvciA9IGFzeW5jIChjYWxsYmFjaykgPT4gYXdhaXQgdGhpcy5zZXJpYWxpemUodGhpcy5jb25uZWN0aW9uU3RhdGUoY29ubmVjdGlvbiksIGNhbGxiYWNrKVxuICAgICAgdGhpcy5jb25uZWN0aW9uQ29vcmRpbmF0b3JzLnNldChjb25uZWN0aW9uLCBjb29yZGluYXRvcilcbiAgICAgIHNldFNoYXJlZFRyYW5zYWN0aW9uQ29vcmRpbmF0b3IoY29ubmVjdGlvbiwgY29vcmRpbmF0b3IpXG4gICAgfVxuICAgIHRoaXMuaHR0cFNlcnZlciA9IGNyZWF0ZVNlcnZlcigpXG4gICAgdGhpcy53ZWJzb2NrZXRTZXJ2ZXIgPSBuZXcgV2ViU29ja2V0U2VydmVyKHtzZXJ2ZXI6IHRoaXMuaHR0cFNlcnZlciwgbWF4UGF5bG9hZDogMTYgKiAxMDI0ICogMTAyNH0pXG4gICAgdGhpcy53ZWJzb2NrZXRTZXJ2ZXIub24oXCJjb25uZWN0aW9uXCIsIChzb2NrZXQpID0+IHtcbiAgICAgIHRoaXMuc2Vzc2lvbnMuYWRkKHNvY2tldClcbiAgICAgIHNvY2tldC5vbmNlKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgICB0aGlzLnNlc3Npb25zLmRlbGV0ZShzb2NrZXQpXG4gICAgICAgIHRoaXMuc2NoZWR1bGVTZXNzaW9uQ2xlYW51cChzb2NrZXQpXG4gICAgICB9KVxuICAgICAgc29ja2V0Lm9uKFwibWVzc2FnZVwiLCAoZGF0YSkgPT4gdm9pZCB0aGlzLmhhbmRsZVJlcXVlc3Qoc29ja2V0LCBgJHtkYXRhfWApKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIGEgYnJva2VyIG9uIGFuIGVwaGVtZXJhbCBsb29wYmFjayBwb3J0LlxuICAgKiBAcGFyYW0ge3tjb25uZWN0aW9uczogUmVjb3JkPHN0cmluZywgb2JqZWN0Pn19IGFyZ3MgLSBQYXJlbnQtb3duZWQgcGh5c2ljYWwgY29ubmVjdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNoYXJlZFRyYW5zYWN0aW9uQnJva2VyPn0gLSBMaXN0ZW5pbmcgYnJva2VyLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHN0YXJ0KGFyZ3MpIHtcbiAgICBjb25zdCBicm9rZXIgPSBuZXcgU2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXIoYXJncylcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBicm9rZXIuaHR0cFNlcnZlci5vbmNlKFwiZXJyb3JcIiwgcmVqZWN0KVxuICAgICAgYnJva2VyLmh0dHBTZXJ2ZXIubGlzdGVuKHtob3N0OiBcIjEyNy4wLjAuMVwiLCBwb3J0OiAwfSwgKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKVxuICAgIH0pXG4gICAgcmV0dXJuIGJyb2tlclxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxvb3BiYWNrIHdlYnNvY2tldCBhZGRyZXNzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIExvb3BiYWNrIHdlYnNvY2tldCBhZGRyZXNzLlxuICAgKi9cbiAgYWRkcmVzcygpIHtcbiAgICBjb25zdCBhZGRyZXNzID0gdGhpcy5odHRwU2VydmVyLmFkZHJlc3MoKVxuICAgIGlmICghYWRkcmVzcyB8fCB0eXBlb2YgYWRkcmVzcyA9PT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBpcyBub3QgbGlzdGVuaW5nXCIpXG4gICAgcmV0dXJuIGB3czovLzEyNy4wLjAuMToke2FkZHJlc3MucG9ydH1gXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcGVyLWF0dGVtcHQgdW5ndWVzc2FibGUgY2FwYWJpbGl0eS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBQZXItYXR0ZW1wdCB1bmd1ZXNzYWJsZSBjYXBhYmlsaXR5LlxuICAgKi9cbiAgY2FwYWJpbGl0eSgpIHsgcmV0dXJuIHRoaXMuc2VjcmV0IH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFuZCBoYW5kbGVzIG9uZSByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIndzXCIpLldlYlNvY2tldH0gc29ja2V0IC0gQ2FsbGluZyBzZXNzaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VyaWFsaXplZCAtIFJlcXVlc3QgSlNPTi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgcmVzcG9uZGluZy5cbiAgICovXG4gIGFzeW5jIGhhbmRsZVJlcXVlc3Qoc29ja2V0LCBzZXJpYWxpemVkKSB7XG4gICAgbGV0IHJlcXVlc3RJZCA9IDBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IC8qKiBAdHlwZSB7e3JlcXVlc3RJZDogbnVtYmVyLCBjYXBhYmlsaXR5OiBzdHJpbmcsIGRhdGFiYXNlSWRlbnRpZmllcjogc3RyaW5nLCBtZXRob2Q6IHN0cmluZywgYXJnczogaW1wb3J0KFwiLi9zaGFyZWQtdHJhbnNhY3Rpb24tY29kZWMuanNcIikuRW5jb2RlZEJyb2tlclZhbHVlfX0gKi8gKEpTT04ucGFyc2Uoc2VyaWFsaXplZCkpXG4gICAgICByZXF1ZXN0SWQgPSByZXF1ZXN0LnJlcXVlc3RJZFxuICAgICAgaWYgKCF0aGlzLmFjY2VwdGluZykgdGhyb3cgbmV3IEVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBjYXBhYmlsaXR5IGhhcyBiZWVuIHJldm9rZWRcIilcbiAgICAgIGlmICghY2FwYWJpbGl0eU1hdGNoZXMocmVxdWVzdC5jYXBhYmlsaXR5LCB0aGlzLnNlY3JldCkpIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gc2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBjYXBhYmlsaXR5XCIpXG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9uc1tyZXF1ZXN0LmRhdGFiYXNlSWRlbnRpZmllcl1cbiAgICAgIGlmICghY29ubmVjdGlvbikgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHNoYXJlZCB0cmFuc2FjdGlvbiBkYXRhYmFzZSBpZGVudGlmaWVyOiAke3JlcXVlc3QuZGF0YWJhc2VJZGVudGlmaWVyfWApXG4gICAgICBpZiAoIUFMTE9XRURfTUVUSE9EUy5oYXMocmVxdWVzdC5tZXRob2QpKSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgbWV0aG9kOiAke3JlcXVlc3QubWV0aG9kfWApXG4gICAgICBjb25zdCBhcmdzID0gZGVjb2RlQnJva2VyVmFsdWUocmVxdWVzdC5hcmdzKVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFyZ3MpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBhcmd1bWVudHMgbXVzdCBiZSBhbiBhcnJheVwiKVxuICAgICAgdGhpcy5lbWl0KFwid29yay1xdWV1ZWRcIiwge2Nvbm5lY3Rpb24sIGRhdGFiYXNlSWRlbnRpZmllcjogcmVxdWVzdC5kYXRhYmFzZUlkZW50aWZpZXIsIG1ldGhvZDogcmVxdWVzdC5tZXRob2R9KVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5Db25uZWN0aW9uUmVxdWVzdCh7Y29ubmVjdGlvbiwgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCwgc2F2ZVBvaW50TmFtZTogdHlwZW9mIGFyZ3NbMF0gPT09IFwic3RyaW5nXCIgPyBhcmdzWzBdIDogdW5kZWZpbmVkLCBzb2NrZXR9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hY2NlcHRpbmcpIHRocm93IG5ldyBFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgY2FwYWJpbGl0eSBoYXMgYmVlbiByZXZva2VkXCIpXG4gICAgICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCA9PT0gXCJyb290VHJhbnNhY3Rpb25Sb2xsYmFja1wiKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5yb2xsYmFja1Jvb3RTYXZlUG9pbnQoY29ubmVjdGlvbiwgLyoqIEB0eXBlIHtzdHJpbmd9ICovIChhcmdzWzBdKSlcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGh5c2ljYWxNZXRob2QgPSByZXF1ZXN0Lm1ldGhvZCA9PT0gXCJyb290VHJhbnNhY3Rpb25TdGFydFwiXG4gICAgICAgICAgPyBcInN0YXJ0U2F2ZVBvaW50XCJcbiAgICAgICAgICA6IHJlcXVlc3QubWV0aG9kID09PSBcInJvb3RUcmFuc2FjdGlvblJlbGVhc2VcIlxuICAgICAgICAgICAgPyBcInJlbGVhc2VTYXZlUG9pbnRcIlxuICAgICAgICAgICAgOiByZXF1ZXN0Lm1ldGhvZCA9PT0gXCJyb290VHJhbnNhY3Rpb25Sb2xsYmFja1wiXG4gICAgICAgICAgICAgID8gXCJyb2xsYmFja1NhdmVQb2ludFwiXG4gICAgICAgICAgICAgIDogcmVxdWVzdC5tZXRob2RcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbk1ldGhvZHMgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsICguLi5tZXRob2RBcmdzOiBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4pID0+IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKGNvbm5lY3Rpb24pXG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IGNvbm5lY3Rpb25NZXRob2RzW3BoeXNpY2FsTWV0aG9kXVxuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoYENvbm5lY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgdHJhbnNhY3Rpb24gbWV0aG9kOiAke3JlcXVlc3QubWV0aG9kfWApXG4gICAgICAgIHJldHVybiBhd2FpdCBtZXRob2QuYXBwbHkoY29ubmVjdGlvbiwgYXJncylcbiAgICAgIH0pXG4gICAgICBpZiAoc29ja2V0LnJlYWR5U3RhdGUgPT09IHNvY2tldC5PUEVOKSBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7cmVxdWVzdElkLCByZXN1bHQ6IGVuY29kZUJyb2tlclZhbHVlKHJlc3VsdCl9KSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKVxuICAgICAgaWYgKHNvY2tldC5yZWFkeVN0YXRlID09PSBzb2NrZXQuT1BFTikgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe3JlcXVlc3RJZCwgZXJyb3I6IGVuY29kZUJyb2tlclZhbHVlKG5vcm1hbGl6ZWQpfSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbXV0YWJsZSBzZXJpYWxpemF0aW9uIHN0YXRlIGZvciBvbmUgcGh5c2ljYWwgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbm5lY3Rpb24gLSBQaHlzaWNhbCBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7Q29ubmVjdGlvblN0YXRlfSAtIENvbm5lY3Rpb24gc3RhdGUuXG4gICAqL1xuICBjb25uZWN0aW9uU3RhdGUoY29ubmVjdGlvbikge1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuY29ubmVjdGlvblN0YXRlcy5nZXQoY29ubmVjdGlvbilcbiAgICBpZiAoIXN0YXRlKSB7XG4gICAgICBzdGF0ZSA9IHtxdWV1ZTogUHJvbWlzZS5yZXNvbHZlKCksIHJvb3RTZXNzaW9uczogbmV3IFNldCgpfVxuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdGVzLnNldChjb25uZWN0aW9uLCBzdGF0ZSlcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIHZhbGlkYXRlZCByZXF1ZXN0IHdpdGggcm9vdCB0cmFuc2FjdGlvbiBsZWFzZSBzZW1hbnRpY3MuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7e2Nvbm5lY3Rpb246IG9iamVjdCwgbWV0aG9kOiBzdHJpbmcsIHNhdmVQb2ludE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgc29ja2V0OiBpbXBvcnQoXCJ3c1wiKS5XZWJTb2NrZXR9fSBhcmdzIC0gUmVxdWVzdCBpZGVudGl0eS5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIFBoeXNpY2FsIG9wZXJhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gT3BlcmF0aW9uIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHJ1bkNvbm5lY3Rpb25SZXF1ZXN0KHtjb25uZWN0aW9uLCBtZXRob2QsIHNhdmVQb2ludE5hbWUsIHNvY2tldH0sIGNhbGxiYWNrKSB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmNvbm5lY3Rpb25TdGF0ZShjb25uZWN0aW9uKVxuICAgIGlmIChtZXRob2QgPT09IFwicm9vdFRyYW5zYWN0aW9uU3RhcnRcIikge1xuICAgICAgaWYgKCFzYXZlUG9pbnROYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIHJvb3QgdHJhbnNhY3Rpb24gcmVxdWlyZXMgYSBzYXZlcG9pbnQgbmFtZVwiKVxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3RhcnRSb290TGVhc2Uoe2NhbGxiYWNrLCBzYXZlUG9pbnROYW1lLCBzdGF0ZSwgc29ja2V0fSlcbiAgICB9XG4gICAgaWYgKG1ldGhvZCA9PT0gXCJyb290VHJhbnNhY3Rpb25SZWxlYXNlXCIgfHwgbWV0aG9kID09PSBcInJvb3RUcmFuc2FjdGlvblJvbGxiYWNrXCIpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmlzaFJvb3RMZWFzZSh7Y2FsbGJhY2ssIHNhdmVQb2ludE5hbWUsIHN0YXRlLCBzb2NrZXR9KVxuICAgIH1cbiAgICBpZiAoc3RhdGUubGVhc2U/LnNvY2tldCA9PT0gc29ja2V0KSByZXR1cm4gYXdhaXQgdGhpcy5zZXJpYWxpemVMZWFzZShzdGF0ZS5sZWFzZSwgY2FsbGJhY2spXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VyaWFsaXplKHN0YXRlLCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlcyB0aGUgRklGTyBwaHlzaWNhbCBjb25uZWN0aW9uIGxlYXNlIGFuZCBob2xkcyB0aGUgcXVldWUgdW50aWwgZW5kLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge3tjYWxsYmFjazogKCkgPT4gUHJvbWlzZTxUPiwgc2F2ZVBvaW50TmFtZTogc3RyaW5nLCBzdGF0ZTogQ29ubmVjdGlvblN0YXRlLCBzb2NrZXQ6IGltcG9ydChcIndzXCIpLldlYlNvY2tldH19IGFyZ3MgLSBMZWFzZSByZXF1ZXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBSb290IHNhdmVwb2ludCBzdGFydCByZXN1bHQuXG4gICAqL1xuICBhc3luYyBzdGFydFJvb3RMZWFzZSh7Y2FsbGJhY2ssIHNhdmVQb2ludE5hbWUsIHN0YXRlLCBzb2NrZXR9KSB7XG4gICAgaWYgKHN0YXRlLnJvb3RTZXNzaW9ucy5oYXMoc29ja2V0KSkgdGhyb3cgbmV3IEVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciByb290IHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgYWN0aXZlIGZvciB0aGlzIHNlc3Npb25cIilcbiAgICBzdGF0ZS5yb290U2Vzc2lvbnMuYWRkKHNvY2tldClcbiAgICBjb25zdCBwcmV2aW91cyA9IHN0YXRlLnF1ZXVlXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgdGhlIHN0YXJ0IHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHsodmFsdWU6IFQpID0+IHZvaWR9XG4gICAgICovXG4gICAgbGV0IHJlc29sdmVTdGFydGVkID0gKCkgPT4ge31cbiAgICAvKipcbiAgICAgKiBSZWplY3RzIHRoZSBzdGFydCByZXNwb25zZS5cbiAgICAgKiBAdHlwZSB7KGVycm9yOiBFcnJvcikgPT4gdm9pZH1cbiAgICAgKi9cbiAgICBsZXQgcmVqZWN0U3RhcnRlZCA9ICgpID0+IHt9XG4gICAgY29uc3Qgc3RhcnRlZCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsgcmVzb2x2ZVN0YXJ0ZWQgPSByZXNvbHZlOyByZWplY3RTdGFydGVkID0gcmVqZWN0IH0pXG4gICAgLyoqXG4gICAgICogUmVsZWFzZXMgdGhlIGhlbGQgY29ubmVjdGlvbiBxdWV1ZS5cbiAgICAgKiBAdHlwZSB7KHZhbHVlPzogdm9pZCkgPT4gdm9pZH1cbiAgICAgKi9cbiAgICBsZXQgcmVsZWFzZSA9ICgpID0+IHt9XG4gICAgY29uc3QgaGVsZCA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7IHJlbGVhc2UgPSByZXNvbHZlIH0pXG5cbiAgICBzdGF0ZS5xdWV1ZSA9IHByZXZpb3VzLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCF0aGlzLmFjY2VwdGluZyB8fCBzb2NrZXQucmVhZHlTdGF0ZSAhPT0gc29ja2V0Lk9QRU4pIHRocm93IG5ldyBFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgcm9vdCB0cmFuc2FjdGlvbiBzZXNzaW9uIGNsb3NlZCBiZWZvcmUgbGVhc2UgYWNxdWlzaXRpb25cIilcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2FsbGJhY2soKVxuICAgICAgICBzdGF0ZS5sZWFzZSA9IHtvcGVyYXRpb25zOiBQcm9taXNlLnJlc29sdmUoKSwgcmVsZWFzZSwgc2F2ZVBvaW50TmFtZSwgc29ja2V0fVxuICAgICAgICByZXNvbHZlU3RhcnRlZChyZXN1bHQpXG4gICAgICAgIGF3YWl0IGhlbGRcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHN0YXRlLnJvb3RTZXNzaW9ucy5kZWxldGUoc29ja2V0KVxuICAgICAgICByZWplY3RTdGFydGVkKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBhd2FpdCBzdGFydGVkXG4gIH1cblxuICAvKipcbiAgICogRmluaXNoZXMgdGhlIGNhbGxpbmcgc2Vzc2lvbidzIHJvb3QgbGVhc2UuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7e2NhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFQ+LCBzYXZlUG9pbnROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0YXRlOiBDb25uZWN0aW9uU3RhdGUsIHNvY2tldDogaW1wb3J0KFwid3NcIikuV2ViU29ja2V0fX0gYXJncyAtIExlYXNlIGVuZCByZXF1ZXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBTYXZlcG9pbnQgZW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGZpbmlzaFJvb3RMZWFzZSh7Y2FsbGJhY2ssIHNhdmVQb2ludE5hbWUsIHN0YXRlLCBzb2NrZXR9KSB7XG4gICAgY29uc3QgbGVhc2UgPSBzdGF0ZS5sZWFzZVxuICAgIGlmICghbGVhc2UgfHwgbGVhc2Uuc29ja2V0ICE9PSBzb2NrZXQpIHRocm93IG5ldyBFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgc2Vzc2lvbiBkb2VzIG5vdCBvd24gdGhlIHJvb3QgdHJhbnNhY3Rpb24gbGVhc2VcIilcbiAgICBpZiAoc2F2ZVBvaW50TmFtZSAhPT0gbGVhc2Uuc2F2ZVBvaW50TmFtZSkgdGhyb3cgbmV3IEVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciByb290IHRyYW5zYWN0aW9uIHNhdmVwb2ludCBkb2VzIG5vdCBtYXRjaCBpdHMgbGVhc2VcIilcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VyaWFsaXplTGVhc2UobGVhc2UsIGNhbGxiYWNrKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzdGF0ZS5sZWFzZSA9IHVuZGVmaW5lZFxuICAgICAgc3RhdGUucm9vdFNlc3Npb25zLmRlbGV0ZShzb2NrZXQpXG4gICAgICBsZWFzZS5yZWxlYXNlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBvcGVyYXRpb25zIGJlbG9uZ2luZyB0byB0aGUgYWN0aXZlIGxlYXNlIGhvbGRlci5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHt7b3BlcmF0aW9uczogUHJvbWlzZTx2b2lkPn19IGxlYXNlIC0gQWN0aXZlIGxlYXNlLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gT3BlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBSZXN1bHQuXG4gICAqL1xuICBhc3luYyBzZXJpYWxpemVMZWFzZShsZWFzZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IGxlYXNlLm9wZXJhdGlvbnNcbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyB0aGUgaG9sZGVyIG9wZXJhdGlvbiBxdWV1ZS5cbiAgICAgKiBAdHlwZSB7KHZhbHVlPzogdm9pZCkgPT4gdm9pZH1cbiAgICAgKi9cbiAgICBsZXQgcmVsZWFzZSA9ICgpID0+IHt9XG4gICAgY29uc3QgY3VycmVudCA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7IHJlbGVhc2UgPSByZXNvbHZlIH0pXG4gICAgbGVhc2Uub3BlcmF0aW9ucyA9IHByZXZpb3VzLnRoZW4oKCkgPT4gY3VycmVudClcbiAgICBhd2FpdCBwcmV2aW91c1xuICAgIHRyeSB7IHJldHVybiBhd2FpdCBjYWxsYmFjaygpIH0gZmluYWxseSB7IHJlbGVhc2UoKSB9XG4gIH1cblxuICAvKipcbiAgICogUm9sbHMgYmFjayBsZWFzZXMgYWJhbmRvbmVkIGJ5IGEgZGlzY29ubmVjdGVkIHNlc3Npb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwid3NcIikuV2ViU29ja2V0fSBzb2NrZXQgLSBEaXNjb25uZWN0ZWQgc2Vzc2lvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgYWxsIG93bmVkIGxlYXNlcyByZWxlYXNlLlxuICAgKi9cbiAgYXN5bmMgcmVsZWFzZURpc2Nvbm5lY3RlZExlYXNlcyhzb2NrZXQpIHtcbiAgICAvKiogQHR5cGUge0FycmF5PEVycm9yPn0gKi9cbiAgICBjb25zdCBlcnJvcnMgPSBbXVxuICAgIGZvciAoY29uc3QgW2Nvbm5lY3Rpb24sIHN0YXRlXSBvZiB0aGlzLmNvbm5lY3Rpb25TdGF0ZXMpIHtcbiAgICAgIGNvbnN0IGxlYXNlID0gc3RhdGUubGVhc2VcbiAgICAgIGlmICghbGVhc2UgfHwgbGVhc2Uuc29ja2V0ICE9PSBzb2NrZXQpIGNvbnRpbnVlXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnNlcmlhbGl6ZUxlYXNlKGxlYXNlLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5yb2xsYmFja1Jvb3RTYXZlUG9pbnQoY29ubmVjdGlvbiwgbGVhc2Uuc2F2ZVBvaW50TmFtZSlcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSlcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHN0YXRlLmxlYXNlID0gdW5kZWZpbmVkXG4gICAgICAgIHN0YXRlLnJvb3RTZXNzaW9ucy5kZWxldGUoc29ja2V0KVxuICAgICAgICBsZWFzZS5yZWxlYXNlKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBgU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBsZWFzZSBjbGVhbnVwIGZhaWxlZDogJHtlcnJvcnMubWFwKChlcnJvcikgPT4gZXJyb3IubWVzc2FnZSkuam9pbihcIjsgXCIpfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyBkZXRhY2hlZCBzb2NrZXQgY2xlYW51cCBhbmQgcmVjb3JkcyBpdHMgZmFpbHVyZSBmb3IgY2xvc2UoKS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJ3c1wiKS5XZWJTb2NrZXR9IHNvY2tldCAtIENsb3NlZCBzZXNzaW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBTZXR0bGVkIHRyYWNrZWQgY2xlYW51cC5cbiAgICovXG4gIHNjaGVkdWxlU2Vzc2lvbkNsZWFudXAoc29ja2V0KSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnNlc3Npb25DbGVhbnVwLmdldChzb2NrZXQpXG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3RpbmdcbiAgICBjb25zdCBjbGVhbnVwID0gdGhpcy5yZWxlYXNlRGlzY29ubmVjdGVkTGVhc2VzKHNvY2tldClcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5jbGVhbnVwRXJyb3JzLnB1c2goZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKVxuICAgICAgfSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMuc2Vzc2lvbkNsZWFudXAuZGVsZXRlKHNvY2tldCkpXG4gICAgdGhpcy5zZXNzaW9uQ2xlYW51cC5zZXQoc29ja2V0LCBjbGVhbnVwKVxuICAgIHJldHVybiBjbGVhbnVwXG4gIH1cblxuICAvKipcbiAgICogUm9sbHMgYmFjayBhbmQgcmVtb3ZlcyBhIHJvb3Qgc2F2ZXBvaW50IHNvIGl0IGNhbm5vdCByZW1haW4gYmVuZWF0aCB0aGUgbmV4dCBsZWFzZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbm5lY3Rpb24gLSBQYXJlbnQgcGh5c2ljYWwgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNhdmVQb2ludE5hbWUgLSBSb290IHNhdmVwb2ludCBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciByb2xsYmFjayBhbmQgcmVsZWFzZS5cbiAgICovXG4gIGFzeW5jIHJvbGxiYWNrUm9vdFNhdmVQb2ludChjb25uZWN0aW9uLCBzYXZlUG9pbnROYW1lKSB7XG4gICAgY29uc3QgbWV0aG9kcyA9IC8qKiBAdHlwZSB7e3JlbGVhc2VTYXZlUG9pbnQ6IChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD4sIHJvbGxiYWNrU2F2ZVBvaW50OiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fX0gKi8gKGNvbm5lY3Rpb24pXG4gICAgLyoqIEB0eXBlIHtBcnJheTxFcnJvcj59ICovXG4gICAgY29uc3QgZXJyb3JzID0gW11cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbWV0aG9kcy5yb2xsYmFja1NhdmVQb2ludChzYXZlUG9pbnROYW1lKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvcnMucHVzaChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBtZXRob2RzLnJlbGVhc2VTYXZlUG9pbnQoc2F2ZVBvaW50TmFtZSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JzLnB1c2goZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKVxuICAgIH1cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIGBTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIGNvdWxkIG5vdCBjbGVhbiByb290IHNhdmVwb2ludCAke3NhdmVQb2ludE5hbWV9OiAke2Vycm9ycy5tYXAoKGVycm9yKSA9PiBlcnJvci5tZXNzYWdlKS5qb2luKFwiOyBcIil9YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBvcmRpbmFyeSBub24taG9sZGVyIHdvcmsgdGhyb3VnaCB0aGUgY29ubmVjdGlvbiBGSUZPLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0Nvbm5lY3Rpb25TdGF0ZX0gc3RhdGUgLSBDb25uZWN0aW9uIHN0YXRlLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gV29yay5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gV29yayByZXN1bHQuXG4gICAqL1xuICBhc3luYyBzZXJpYWxpemUoc3RhdGUsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcHJldmlvdXMgPSBzdGF0ZS5xdWV1ZVxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIHRoZSBjdXJyZW50IHF1ZXVlIGVudHJ5LlxuICAgICAqIEB0eXBlIHsodmFsdWU/OiB2b2lkKSA9PiB2b2lkfVxuICAgICAqL1xuICAgIGxldCByZWxlYXNlID0gKCkgPT4ge31cbiAgICBjb25zdCBjdXJyZW50ID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsgcmVsZWFzZSA9IHJlc29sdmUgfSlcbiAgICBjb25zdCBxdWV1ZWQgPSBwcmV2aW91cy50aGVuKCgpID0+IGN1cnJlbnQpXG4gICAgc3RhdGUucXVldWUgPSBxdWV1ZWRcbiAgICBhd2FpdCBwcmV2aW91c1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH0gZmluYWxseSB7XG4gICAgICByZWxlYXNlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgYWRtaXNzaW9uLCByZXZva2VzIGNhcGFiaWxpdHksIHJlamVjdHMgY2xpZW50cywgYW5kIGRyYWlucyBhY3RpdmUgd29yay5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgdHJhbnNwb3J0IHNodXRkb3duLlxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VQcm9taXNlKSByZXR1cm4gYXdhaXQgdGhpcy5jbG9zZVByb21pc2VcbiAgICB0aGlzLmNsb3NlUHJvbWlzZSA9IHRoaXMuY2xvc2VUcmFuc3BvcnQoKVxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNsb3NlUHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGRldGVybWluaXN0aWMgdHJhbnNwb3J0IHNodXRkb3duIGFuZCByZXBvcnRzIGNsZWFudXAgZmFpbHVyZXMgbGFzdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgc2h1dGRvd24gb3IgcmVqZWN0cyB3aXRoIGNsZWFudXAgZXJyb3JzLlxuICAgKi9cbiAgYXN5bmMgY2xvc2VUcmFuc3BvcnQoKSB7XG4gICAgdGhpcy5hY2NlcHRpbmcgPSBmYWxzZVxuICAgIHRoaXMuc2VjcmV0ID0gcmFuZG9tQnl0ZXMoMzIpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpXG4gICAgY29uc3QgY2xvc2luZ1Nlc3Npb25zID0gQXJyYXkuZnJvbSh0aGlzLnNlc3Npb25zKVxuICAgIGF3YWl0IFByb21pc2UuYWxsKGNsb3NpbmdTZXNzaW9ucy5tYXAoYXN5bmMgKHNvY2tldCkgPT4gYXdhaXQgdGhpcy5zY2hlZHVsZVNlc3Npb25DbGVhbnVwKHNvY2tldCkpKVxuICAgIGZvciAoY29uc3Qgc29ja2V0IG9mIGNsb3NpbmdTZXNzaW9ucykgc29ja2V0LmNsb3NlKDEwMDEsIFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBjbG9zZWRcIilcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoQXJyYXkuZnJvbSh0aGlzLmNvbm5lY3Rpb25TdGF0ZXMudmFsdWVzKCkpLm1hcCgoc3RhdGUpID0+IHN0YXRlLnF1ZXVlKSlcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gdGhpcy53ZWJzb2NrZXRTZXJ2ZXIuY2xvc2UoKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKSlcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gdGhpcy5odHRwU2VydmVyLmNsb3NlKCgpID0+IHJlc29sdmUodW5kZWZpbmVkKSkpXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh0aGlzLnNlc3Npb25DbGVhbnVwLnZhbHVlcygpKSlcbiAgICBmb3IgKGNvbnN0IFtjb25uZWN0aW9uLCBjb29yZGluYXRvcl0gb2YgdGhpcy5jb25uZWN0aW9uQ29vcmRpbmF0b3JzKSB7XG4gICAgICBjbGVhclNoYXJlZFRyYW5zYWN0aW9uQ29vcmRpbmF0b3IoY29ubmVjdGlvbiwgY29vcmRpbmF0b3IpXG4gICAgfVxuICAgIGlmICh0aGlzLmNsZWFudXBFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKHRoaXMuY2xlYW51cEVycm9ycywgYFNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgY2xlYW51cCBmYWlsZWQ6ICR7dGhpcy5jbGVhbnVwRXJyb3JzLm1hcCgoZXJyb3IpID0+IGVycm9yLm1lc3NhZ2UpLmpvaW4oXCI7IFwiKX1gKVxuICAgIH1cbiAgfVxufVxuIl19
|
|
451
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLXRyYW5zYWN0aW9uLWJyb2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3NoYXJlZC10cmFuc2FjdGlvbi1icm9rZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBQ3BGLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFBO0FBRW5JLG9OQUFvTjtBQUVwTixNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUM5QixPQUFPO0lBQ1AsY0FBYztJQUNkLGNBQWM7SUFDZCxxQkFBcUI7SUFDckIseUJBQXlCO0lBQ3pCLDBCQUEwQjtJQUMxQiw0QkFBNEI7SUFDNUIsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsMEJBQTBCO0lBQzFCLHNCQUFzQjtJQUN0Qix3QkFBd0I7SUFDeEIseUJBQXlCO0NBQzFCLENBQUMsQ0FBQTtBQUVGOzs7OztHQUtHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsUUFBUTtJQUMzQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzNDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDM0MsT0FBTyxhQUFhLENBQUMsTUFBTSxLQUFLLGFBQWEsQ0FBQyxNQUFNLElB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LElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLDZDQUE2QyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDMUosQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgeyByYW5kb21CeXRlcywgdGltaW5nU2FmZUVxdWFsIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCJcbmltcG9ydCB7IGNyZWF0ZVNlcnZlciB9IGZyb20gXCJub2RlOmh0dHBcIlxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcIm5vZGU6ZXZlbnRzXCJcbmltcG9ydCB7IFdlYlNvY2tldFNlcnZlciB9IGZyb20gXCJ3c1wiXG5pbXBvcnQgeyBkZWNvZGVCcm9rZXJWYWx1ZSwgZW5jb2RlQnJva2VyVmFsdWUgfSBmcm9tIFwiLi9zaGFyZWQtdHJhbnNhY3Rpb24tY29kZWMuanNcIlxuaW1wb3J0IHsgY2xlYXJTaGFyZWRUcmFuc2FjdGlvbkNvb3JkaW5hdG9yLCBzZXRTaGFyZWRUcmFuc2FjdGlvbkNvb3JkaW5hdG9yIH0gZnJvbSBcIi4vc2hhcmVkLXRyYW5zYWN0aW9uLWNvbm5lY3Rpb24tY29vcmRpbmF0b3IuanNcIlxuXG4vKiogQHR5cGVkZWYge3txdWV1ZTogUHJvbWlzZTx2b2lkPiwgcm9vdFNlc3Npb25zOiBTZXQ8aW1wb3J0KFwid3NcIikuV2ViU29ja2V0PiwgbGVhc2U/OiB7b3BlcmF0aW9uczogUHJvbWlzZTx2b2lkPiwgcmVsZWFzZTogKCkgPT4gdm9pZCwgc2F2ZVBvaW50TmFtZTogc3RyaW5nLCBzb2NrZXQ6IGltcG9ydChcIndzXCIpLldlYlNvY2tldH19fSBDb25uZWN0aW9uU3RhdGUgKi9cblxuY29uc3QgQUxMT1dFRF9NRVRIT0RTID0gbmV3IFNldChbXG4gIFwicXVlcnlcIixcbiAgXCJhZmZlY3RlZFJvd3NcIixcbiAgXCJfcXVlcnlBY3R1YWxcIixcbiAgXCJfYWZmZWN0ZWRSb3dzQWN0dWFsXCIsXG4gIFwiX3N0YXJ0VHJhbnNhY3Rpb25BY3Rpb25cIixcbiAgXCJfY29tbWl0VHJhbnNhY3Rpb25BY3Rpb25cIixcbiAgXCJfcm9sbGJhY2tUcmFuc2FjdGlvbkFjdGlvblwiLFxuICBcInN0YXJ0U2F2ZVBvaW50XCIsXG4gIFwicmVsZWFzZVNhdmVQb2ludFwiLFxuICBcInJvbGxiYWNrU2F2ZVBvaW50XCIsXG4gIFwiZ2V0Q29ubmVjdGlvblNjb3BlZFZhbHVlXCIsXG4gIFwicm9vdFRyYW5zYWN0aW9uU3RhcnRcIixcbiAgXCJyb290VHJhbnNhY3Rpb25SZWxlYXNlXCIsXG4gIFwicm9vdFRyYW5zYWN0aW9uUm9sbGJhY2tcIlxuXSlcblxuLyoqXG4gKiBDb21wYXJlcyBhIHByZXNlbnRlZCBjYXBhYmlsaXR5IHdpdGhvdXQgbGVha2luZyBtYXRjaGluZyBwcmVmaXggdGltaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVkIC0gUHJlc2VudGVkIGNhcGFiaWxpdHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWQgLSBBY3RpdmUgY2FwYWJpbGl0eS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNhcGFiaWxpdGllcyBtYXRjaC5cbiAqL1xuZnVuY3Rpb24gY2FwYWJpbGl0eU1hdGNoZXMocHJvdmlkZWQsIGV4cGVjdGVkKSB7XG4gIGNvbnN0IHByb3ZpZGVkQnl0ZXMgPSBCdWZmZXIuZnJvbShwcm92aWRlZClcbiAgY29uc3QgZXhwZWN0ZWRCeXRlcyA9IEJ1ZmZlci5mcm9tKGV4cGVjdGVkKVxuICByZXR1cm4gcHJvdmlkZWRCeXRlcy5sZW5ndGggPT09IGV4cGVjdGVkQnl0ZXMubGVuZ3RoICYmIHRpbWluZ1NhZmVFcXVhbChwcm92aWRlZEJ5dGVzLCBleHBlY3RlZEJ5dGVzKVxufVxuXG4vKipcbiAqIEFkZHMgYnJva2VyIG93bmVyc2hpcCB0byBkZWNvZGVkIGRyaXZlciBvcHRpb25zLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBEZWNvZGVkIG9wdGlvbnMuXG4gKiBAcGFyYW0ge3N5bWJvbH0gb3BlcmF0aW9uT3duZXIgLSBCcm9rZXIgY29vcmRpbmF0b3Igb3duZXIuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+ICYge29wZXJhdGlvbk93bmVyOiBzeW1ib2x9fSAtIE93bmVkIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIG93bmVkT3BlcmF0aW9uT3B0aW9ucyh2YWx1ZSwgb3BlcmF0aW9uT3duZXIpIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB7b3BlcmF0aW9uT3duZXJ9XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgZHJpdmVyIG9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3RcIilcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnMgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKHZhbHVlKVxuXG4gIHJldHVybiB7Li4ub3B0aW9ucywgb3BlcmF0aW9uT3duZXJ9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoYXJlZFRyYW5zYWN0aW9uQnJva2VyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBicm9rZXIgYXJvdW5kIHBhcmVudC1vd25lZCBwaHlzaWNhbCBjb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHt7Y29ubmVjdGlvbnM6IFJlY29yZDxzdHJpbmcsIG9iamVjdD59fSBhcmdzIC0gUGFyZW50LW93bmVkIHBoeXNpY2FsIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2Nvbm5lY3Rpb25zfSkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gY29ubmVjdGlvbnNcbiAgICB0aGlzLnNlY3JldCA9IHJhbmRvbUJ5dGVzKDMyKS50b1N0cmluZyhcImJhc2U2NHVybFwiKVxuICAgIHRoaXMuYWNjZXB0aW5nID0gdHJ1ZVxuICAgIC8qKiBAdHlwZSB7TWFwPG9iamVjdCwgQ29ubmVjdGlvblN0YXRlPn0gKi9cbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZXMgPSBuZXcgTWFwKClcbiAgICAvKiogQHR5cGUge1NldDxpbXBvcnQoXCJ3c1wiKS5XZWJTb2NrZXQ+fSAqL1xuICAgIHRoaXMuc2Vzc2lvbnMgPSBuZXcgU2V0KClcbiAgICAvKiogQHR5cGUge01hcDxpbXBvcnQoXCJ3c1wiKS5XZWJTb2NrZXQsIFByb21pc2U8dm9pZD4+fSAqL1xuICAgIHRoaXMuc2Vzc2lvbkNsZWFudXAgPSBuZXcgTWFwKClcbiAgICAvKiogQHR5cGUge0FycmF5PEVycm9yPn0gKi9cbiAgICB0aGlzLmNsZWFudXBFcnJvcnMgPSBbXVxuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZH0gKi9cbiAgICB0aGlzLmNsb3NlUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgIC8qKiBAdHlwZSB7TWFwPG9iamVjdCwgKGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PikgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSAqL1xuICAgIHRoaXMuY29ubmVjdGlvbkNvb3JkaW5hdG9ycyA9IG5ldyBNYXAoKVxuICAgIC8qKiBAdHlwZSB7TWFwPG9iamVjdCwgc3ltYm9sPn0gKi9cbiAgICB0aGlzLmNvbm5lY3Rpb25Db29yZGluYXRvck93bmVycyA9IG5ldyBNYXAoKVxuICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiBuZXcgU2V0KE9iamVjdC52YWx1ZXMoY29ubmVjdGlvbnMpKSkge1xuICAgICAgLyoqXG4gICAgICAgKiBTZXJpYWxpemVzIHBhcmVudCBvcGVyYXRpb25zIHdpdGggY2hpbGQgYnJva2VyIHRyYWZmaWMuXG4gICAgICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8dW5rbm93bj59IGNhbGxiYWNrIC0gUGFyZW50IG9wZXJhdGlvbi5cbiAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHVua25vd24+fSAtIE9wZXJhdGlvbiByZXN1bHQuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGNvb3JkaW5hdG9yID0gYXN5bmMgKGNhbGxiYWNrKSA9PiBhd2FpdCB0aGlzLnNlcmlhbGl6ZSh0aGlzLmNvbm5lY3Rpb25TdGF0ZShjb25uZWN0aW9uKSwgY2FsbGJhY2spXG4gICAgICB0aGlzLmNvbm5lY3Rpb25Db29yZGluYXRvcnMuc2V0KGNvbm5lY3Rpb24sIGNvb3JkaW5hdG9yKVxuICAgICAgdGhpcy5jb25uZWN0aW9uQ29vcmRpbmF0b3JPd25lcnMuc2V0KGNvbm5lY3Rpb24sIHNldFNoYXJlZFRyYW5zYWN0aW9uQ29vcmRpbmF0b3IoY29ubmVjdGlvbiwgY29vcmRpbmF0b3IpKVxuICAgIH1cbiAgICB0aGlzLmh0dHBTZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKVxuICAgIHRoaXMud2Vic29ja2V0U2VydmVyID0gbmV3IFdlYlNvY2tldFNlcnZlcih7c2VydmVyOiB0aGlzLmh0dHBTZXJ2ZXIsIG1heFBheWxvYWQ6IDE2ICogMTAyNCAqIDEwMjR9KVxuICAgIHRoaXMud2Vic29ja2V0U2VydmVyLm9uKFwiY29ubmVjdGlvblwiLCAoc29ja2V0KSA9PiB7XG4gICAgICB0aGlzLnNlc3Npb25zLmFkZChzb2NrZXQpXG4gICAgICBzb2NrZXQub25jZShcImNsb3NlXCIsICgpID0+IHtcbiAgICAgICAgdGhpcy5zZXNzaW9ucy5kZWxldGUoc29ja2V0KVxuICAgICAgICB0aGlzLnNjaGVkdWxlU2Vzc2lvbkNsZWFudXAoc29ja2V0KVxuICAgICAgfSlcbiAgICAgIHNvY2tldC5vbihcIm1lc3NhZ2VcIiwgKGRhdGEpID0+IHZvaWQgdGhpcy5oYW5kbGVSZXF1ZXN0KHNvY2tldCwgYCR7ZGF0YX1gKSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBhIGJyb2tlciBvbiBhbiBlcGhlbWVyYWwgbG9vcGJhY2sgcG9ydC5cbiAgICogQHBhcmFtIHt7Y29ubmVjdGlvbnM6IFJlY29yZDxzdHJpbmcsIG9iamVjdD59fSBhcmdzIC0gUGFyZW50LW93bmVkIHBoeXNpY2FsIGNvbm5lY3Rpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTaGFyZWRUcmFuc2FjdGlvbkJyb2tlcj59IC0gTGlzdGVuaW5nIGJyb2tlci5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBzdGFydChhcmdzKSB7XG4gICAgY29uc3QgYnJva2VyID0gbmV3IFNoYXJlZFRyYW5zYWN0aW9uQnJva2VyKGFyZ3MpXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgYnJva2VyLmh0dHBTZXJ2ZXIub25jZShcImVycm9yXCIsIHJlamVjdClcbiAgICAgIGJyb2tlci5odHRwU2VydmVyLmxpc3Rlbih7aG9zdDogXCIxMjcuMC4wLjFcIiwgcG9ydDogMH0sICgpID0+IHJlc29sdmUodW5kZWZpbmVkKSlcbiAgICB9KVxuICAgIHJldHVybiBicm9rZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsb29wYmFjayB3ZWJzb2NrZXQgYWRkcmVzcy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBMb29wYmFjayB3ZWJzb2NrZXQgYWRkcmVzcy5cbiAgICovXG4gIGFkZHJlc3MoKSB7XG4gICAgY29uc3QgYWRkcmVzcyA9IHRoaXMuaHR0cFNlcnZlci5hZGRyZXNzKClcbiAgICBpZiAoIWFkZHJlc3MgfHwgdHlwZW9mIGFkZHJlc3MgPT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgaXMgbm90IGxpc3RlbmluZ1wiKVxuICAgIHJldHVybiBgd3M6Ly8xMjcuMC4wLjE6JHthZGRyZXNzLnBvcnR9YFxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHBlci1hdHRlbXB0IHVuZ3Vlc3NhYmxlIGNhcGFiaWxpdHkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUGVyLWF0dGVtcHQgdW5ndWVzc2FibGUgY2FwYWJpbGl0eS5cbiAgICovXG4gIGNhcGFiaWxpdHkoKSB7IHJldHVybiB0aGlzLnNlY3JldCB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbmQgaGFuZGxlcyBvbmUgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJ3c1wiKS5XZWJTb2NrZXR9IHNvY2tldCAtIENhbGxpbmcgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlcmlhbGl6ZWQgLSBSZXF1ZXN0IEpTT04uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHJlc3BvbmRpbmcuXG4gICAqL1xuICBhc3luYyBoYW5kbGVSZXF1ZXN0KHNvY2tldCwgc2VyaWFsaXplZCkge1xuICAgIGxldCByZXF1ZXN0SWQgPSAwXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSAvKiogQHR5cGUge3tyZXF1ZXN0SWQ6IG51bWJlciwgY2FwYWJpbGl0eTogc3RyaW5nLCBkYXRhYmFzZUlkZW50aWZpZXI6IHN0cmluZywgbWV0aG9kOiBzdHJpbmcsIGFyZ3M6IGltcG9ydChcIi4vc2hhcmVkLXRyYW5zYWN0aW9uLWNvZGVjLmpzXCIpLkVuY29kZWRCcm9rZXJWYWx1ZX19ICovIChKU09OLnBhcnNlKHNlcmlhbGl6ZWQpKVxuICAgICAgcmVxdWVzdElkID0gcmVxdWVzdC5yZXF1ZXN0SWRcbiAgICAgIGlmICghdGhpcy5hY2NlcHRpbmcpIHRocm93IG5ldyBFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgY2FwYWJpbGl0eSBoYXMgYmVlbiByZXZva2VkXCIpXG4gICAgICBpZiAoIWNhcGFiaWxpdHlNYXRjaGVzKHJlcXVlc3QuY2FwYWJpbGl0eSwgdGhpcy5zZWNyZXQpKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgY2FwYWJpbGl0eVwiKVxuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuY29ubmVjdGlvbnNbcmVxdWVzdC5kYXRhYmFzZUlkZW50aWZpZXJdXG4gICAgICBpZiAoIWNvbm5lY3Rpb24pIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzaGFyZWQgdHJhbnNhY3Rpb24gZGF0YWJhc2UgaWRlbnRpZmllcjogJHtyZXF1ZXN0LmRhdGFiYXNlSWRlbnRpZmllcn1gKVxuICAgICAgaWYgKCFBTExPV0VEX01FVEhPRFMuaGFzKHJlcXVlc3QubWV0aG9kKSkgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIG1ldGhvZDogJHtyZXF1ZXN0Lm1ldGhvZH1gKVxuICAgICAgY29uc3QgYXJncyA9IGRlY29kZUJyb2tlclZhbHVlKHJlcXVlc3QuYXJncylcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcmdzKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgYXJndW1lbnRzIG11c3QgYmUgYW4gYXJyYXlcIilcbiAgICAgIHRoaXMuZW1pdChcIndvcmstcXVldWVkXCIsIHtjb25uZWN0aW9uLCBkYXRhYmFzZUlkZW50aWZpZXI6IHJlcXVlc3QuZGF0YWJhc2VJZGVudGlmaWVyLCBtZXRob2Q6IHJlcXVlc3QubWV0aG9kfSlcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuQ29ubmVjdGlvblJlcXVlc3Qoe2Nvbm5lY3Rpb24sIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsIHNhdmVQb2ludE5hbWU6IHR5cGVvZiBhcmdzWzBdID09PSBcInN0cmluZ1wiID8gYXJnc1swXSA6IHVuZGVmaW5lZCwgc29ja2V0fSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuYWNjZXB0aW5nKSB0aHJvdyBuZXcgRXJyb3IoXCJTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIGNhcGFiaWxpdHkgaGFzIGJlZW4gcmV2b2tlZFwiKVxuICAgICAgICBpZiAocmVxdWVzdC5tZXRob2QgPT09IFwicm9vdFRyYW5zYWN0aW9uUm9sbGJhY2tcIikge1xuICAgICAgICAgIGF3YWl0IHRoaXMucm9sbGJhY2tSb290U2F2ZVBvaW50KGNvbm5lY3Rpb24sIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoYXJnc1swXSkpXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBoeXNpY2FsTWV0aG9kID0gcmVxdWVzdC5tZXRob2QgPT09IFwicm9vdFRyYW5zYWN0aW9uU3RhcnRcIlxuICAgICAgICAgID8gXCJzdGFydFNhdmVQb2ludFwiXG4gICAgICAgICAgOiByZXF1ZXN0Lm1ldGhvZCA9PT0gXCJyb290VHJhbnNhY3Rpb25SZWxlYXNlXCJcbiAgICAgICAgICAgID8gXCJyZWxlYXNlU2F2ZVBvaW50XCJcbiAgICAgICAgICAgIDogcmVxdWVzdC5tZXRob2QgPT09IFwicm9vdFRyYW5zYWN0aW9uUm9sbGJhY2tcIlxuICAgICAgICAgICAgICA/IFwicm9sbGJhY2tTYXZlUG9pbnRcIlxuICAgICAgICAgICAgICA6IHJlcXVlc3QubWV0aG9kXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25NZXRob2RzID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCAoLi4ubWV0aG9kQXJnczogQXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4gfCB7b3BlcmF0aW9uT3duZXI6IHN5bWJvbH0+KSA9PiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChjb25uZWN0aW9uKVxuICAgICAgICBjb25zdCBtZXRob2QgPSBjb25uZWN0aW9uTWV0aG9kc1twaHlzaWNhbE1ldGhvZF1cbiAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKGBDb25uZWN0aW9uIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIHRyYW5zYWN0aW9uIG1ldGhvZDogJHtyZXF1ZXN0Lm1ldGhvZH1gKVxuICAgICAgICByZXR1cm4gYXdhaXQgbWV0aG9kLmFwcGx5KGNvbm5lY3Rpb24sIHRoaXMub3duZWRNZXRob2RBcmdzKHthcmdzLCBjb25uZWN0aW9uLCBtZXRob2Q6IHBoeXNpY2FsTWV0aG9kfSkpXG4gICAgICB9KVxuICAgICAgaWYgKHNvY2tldC5yZWFkeVN0YXRlID09PSBzb2NrZXQuT1BFTikgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe3JlcXVlc3RJZCwgcmVzdWx0OiBlbmNvZGVCcm9rZXJWYWx1ZShyZXN1bHQpfSkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSlcbiAgICAgIGlmIChzb2NrZXQucmVhZHlTdGF0ZSA9PT0gc29ja2V0Lk9QRU4pIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtyZXF1ZXN0SWQsIGVycm9yOiBlbmNvZGVCcm9rZXJWYWx1ZShub3JtYWxpemVkKX0pKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBicm9rZXIgb3duZXIgdG8gcHVibGljIGRyaXZlciBtZXRob2RzIHRoYXQgcmUtZW50ZXIgY29vcmRpbmF0ZWQgcXVlcnkgd29yay5cbiAgICogQHBhcmFtIHt7YXJnczogQXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBjb25uZWN0aW9uOiBvYmplY3QsIG1ldGhvZDogc3RyaW5nfX0gYXJncyAtIFBoeXNpY2FsIGludm9jYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiB8IHtvcGVyYXRpb25Pd25lcjogc3ltYm9sfT59IC0gT3duZWQgbWV0aG9kIGFyZ3VtZW50cy5cbiAgICovXG4gIG93bmVkTWV0aG9kQXJncyh7YXJncywgY29ubmVjdGlvbiwgbWV0aG9kfSkge1xuICAgIGNvbnN0IG9wZXJhdGlvbk93bmVyID0gdGhpcy5jb25uZWN0aW9uQ29vcmRpbmF0b3JPd25lcnMuZ2V0KGNvbm5lY3Rpb24pXG5cbiAgICBpZiAoIW9wZXJhdGlvbk93bmVyKSB0aHJvdyBuZXcgRXJyb3IoXCJTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIGNvbm5lY3Rpb24gb3duZXIgaXMgbWlzc2luZ1wiKVxuICAgIGlmIChbXCJfc3RhcnRUcmFuc2FjdGlvbkFjdGlvblwiLCBcIl9jb21taXRUcmFuc2FjdGlvbkFjdGlvblwiLCBcIl9yb2xsYmFja1RyYW5zYWN0aW9uQWN0aW9uXCJdLmluY2x1ZGVzKG1ldGhvZCkpIHtcbiAgICAgIHJldHVybiBbb3duZWRPcGVyYXRpb25PcHRpb25zKGFyZ3NbMF0sIG9wZXJhdGlvbk93bmVyKV1cbiAgICB9XG4gICAgaWYgKFtcInF1ZXJ5XCIsIFwiYWZmZWN0ZWRSb3dzXCIsIFwic3RhcnRTYXZlUG9pbnRcIiwgXCJyZWxlYXNlU2F2ZVBvaW50XCIsIFwicm9sbGJhY2tTYXZlUG9pbnRcIl0uaW5jbHVkZXMobWV0aG9kKSkge1xuICAgICAgcmV0dXJuIFthcmdzWzBdLCBvd25lZE9wZXJhdGlvbk9wdGlvbnMoYXJnc1sxXSwgb3BlcmF0aW9uT3duZXIpXVxuICAgIH1cblxuICAgIHJldHVybiBhcmdzXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBtdXRhYmxlIHNlcmlhbGl6YXRpb24gc3RhdGUgZm9yIG9uZSBwaHlzaWNhbCBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29ubmVjdGlvbiAtIFBoeXNpY2FsIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtDb25uZWN0aW9uU3RhdGV9IC0gQ29ubmVjdGlvbiBzdGF0ZS5cbiAgICovXG4gIGNvbm5lY3Rpb25TdGF0ZShjb25uZWN0aW9uKSB7XG4gICAgbGV0IHN0YXRlID0gdGhpcy5jb25uZWN0aW9uU3RhdGVzLmdldChjb25uZWN0aW9uKVxuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIHN0YXRlID0ge3F1ZXVlOiBQcm9taXNlLnJlc29sdmUoKSwgcm9vdFNlc3Npb25zOiBuZXcgU2V0KCl9XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZXMuc2V0KGNvbm5lY3Rpb24sIHN0YXRlKVxuICAgIH1cbiAgICByZXR1cm4gc3RhdGVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgdmFsaWRhdGVkIHJlcXVlc3Qgd2l0aCByb290IHRyYW5zYWN0aW9uIGxlYXNlIHNlbWFudGljcy5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHt7Y29ubmVjdGlvbjogb2JqZWN0LCBtZXRob2Q6IHN0cmluZywgc2F2ZVBvaW50TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzb2NrZXQ6IGltcG9ydChcIndzXCIpLldlYlNvY2tldH19IGFyZ3MgLSBSZXF1ZXN0IGlkZW50aXR5LlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gUGh5c2ljYWwgb3BlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBPcGVyYXRpb24gcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgcnVuQ29ubmVjdGlvblJlcXVlc3Qoe2Nvbm5lY3Rpb24sIG1ldGhvZCwgc2F2ZVBvaW50TmFtZSwgc29ja2V0fSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuY29ubmVjdGlvblN0YXRlKGNvbm5lY3Rpb24pXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJyb290VHJhbnNhY3Rpb25TdGFydFwiKSB7XG4gICAgICBpZiAoIXNhdmVQb2ludE5hbWUpIHRocm93IG5ldyBFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgcm9vdCB0cmFuc2FjdGlvbiByZXF1aXJlcyBhIHNhdmVwb2ludCBuYW1lXCIpXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdGFydFJvb3RMZWFzZSh7Y2FsbGJhY2ssIHNhdmVQb2ludE5hbWUsIHN0YXRlLCBzb2NrZXR9KVxuICAgIH1cbiAgICBpZiAobWV0aG9kID09PSBcInJvb3RUcmFuc2FjdGlvblJlbGVhc2VcIiB8fCBtZXRob2QgPT09IFwicm9vdFRyYW5zYWN0aW9uUm9sbGJhY2tcIikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluaXNoUm9vdExlYXNlKHtjYWxsYmFjaywgc2F2ZVBvaW50TmFtZSwgc3RhdGUsIHNvY2tldH0pXG4gICAgfVxuICAgIGlmIChzdGF0ZS5sZWFzZT8uc29ja2V0ID09PSBzb2NrZXQpIHJldHVybiBhd2FpdCB0aGlzLnNlcmlhbGl6ZUxlYXNlKHN0YXRlLmxlYXNlLCBjYWxsYmFjaylcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXJpYWxpemUoc3RhdGUsIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmVzIHRoZSBGSUZPIHBoeXNpY2FsIGNvbm5lY3Rpb24gbGVhc2UgYW5kIGhvbGRzIHRoZSBxdWV1ZSB1bnRpbCBlbmQuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7e2NhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFQ+LCBzYXZlUG9pbnROYW1lOiBzdHJpbmcsIHN0YXRlOiBDb25uZWN0aW9uU3RhdGUsIHNvY2tldDogaW1wb3J0KFwid3NcIikuV2ViU29ja2V0fX0gYXJncyAtIExlYXNlIHJlcXVlc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIFJvb3Qgc2F2ZXBvaW50IHN0YXJ0IHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHN0YXJ0Um9vdExlYXNlKHtjYWxsYmFjaywgc2F2ZVBvaW50TmFtZSwgc3RhdGUsIHNvY2tldH0pIHtcbiAgICBpZiAoc3RhdGUucm9vdFNlc3Npb25zLmhhcyhzb2NrZXQpKSB0aHJvdyBuZXcgRXJyb3IoXCJTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIHJvb3QgdHJhbnNhY3Rpb24gaXMgYWxyZWFkeSBhY3RpdmUgZm9yIHRoaXMgc2Vzc2lvblwiKVxuICAgIHN0YXRlLnJvb3RTZXNzaW9ucy5hZGQoc29ja2V0KVxuICAgIGNvbnN0IHByZXZpb3VzID0gc3RhdGUucXVldWVcbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgc3RhcnQgcmVzcG9uc2UuXG4gICAgICogQHR5cGUgeyh2YWx1ZTogVCkgPT4gdm9pZH1cbiAgICAgKi9cbiAgICBsZXQgcmVzb2x2ZVN0YXJ0ZWQgPSAoKSA9PiB7fVxuICAgIC8qKlxuICAgICAqIFJlamVjdHMgdGhlIHN0YXJ0IHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHsoZXJyb3I6IEVycm9yKSA9PiB2b2lkfVxuICAgICAqL1xuICAgIGxldCByZWplY3RTdGFydGVkID0gKCkgPT4ge31cbiAgICBjb25zdCBzdGFydGVkID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyByZXNvbHZlU3RhcnRlZCA9IHJlc29sdmU7IHJlamVjdFN0YXJ0ZWQgPSByZWplY3QgfSlcbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyB0aGUgaGVsZCBjb25uZWN0aW9uIHF1ZXVlLlxuICAgICAqIEB0eXBlIHsodmFsdWU/OiB2b2lkKSA9PiB2b2lkfVxuICAgICAqL1xuICAgIGxldCByZWxlYXNlID0gKCkgPT4ge31cbiAgICBjb25zdCBoZWxkID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsgcmVsZWFzZSA9IHJlc29sdmUgfSlcblxuICAgIHN0YXRlLnF1ZXVlID0gcHJldmlvdXMudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXRoaXMuYWNjZXB0aW5nIHx8IHNvY2tldC5yZWFkeVN0YXRlICE9PSBzb2NrZXQuT1BFTikgdGhyb3cgbmV3IEVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciByb290IHRyYW5zYWN0aW9uIHNlc3Npb24gY2xvc2VkIGJlZm9yZSBsZWFzZSBhY3F1aXNpdGlvblwiKVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjYWxsYmFjaygpXG4gICAgICAgIHN0YXRlLmxlYXNlID0ge29wZXJhdGlvbnM6IFByb21pc2UucmVzb2x2ZSgpLCByZWxlYXNlLCBzYXZlUG9pbnROYW1lLCBzb2NrZXR9XG4gICAgICAgIHJlc29sdmVTdGFydGVkKHJlc3VsdClcbiAgICAgICAgYXdhaXQgaGVsZFxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc3RhdGUucm9vdFNlc3Npb25zLmRlbGV0ZShzb2NrZXQpXG4gICAgICAgIHJlamVjdFN0YXJ0ZWQoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGF3YWl0IHN0YXJ0ZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5pc2hlcyB0aGUgY2FsbGluZyBzZXNzaW9uJ3Mgcm9vdCBsZWFzZS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHt7Y2FsbGJhY2s6ICgpID0+IFByb21pc2U8VD4sIHNhdmVQb2ludE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3RhdGU6IENvbm5lY3Rpb25TdGF0ZSwgc29ja2V0OiBpbXBvcnQoXCJ3c1wiKS5XZWJTb2NrZXR9fSBhcmdzIC0gTGVhc2UgZW5kIHJlcXVlc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIFNhdmVwb2ludCBlbmQgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgZmluaXNoUm9vdExlYXNlKHtjYWxsYmFjaywgc2F2ZVBvaW50TmFtZSwgc3RhdGUsIHNvY2tldH0pIHtcbiAgICBjb25zdCBsZWFzZSA9IHN0YXRlLmxlYXNlXG4gICAgaWYgKCFsZWFzZSB8fCBsZWFzZS5zb2NrZXQgIT09IHNvY2tldCkgdGhyb3cgbmV3IEVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBzZXNzaW9uIGRvZXMgbm90IG93biB0aGUgcm9vdCB0cmFuc2FjdGlvbiBsZWFzZVwiKVxuICAgIGlmIChzYXZlUG9pbnROYW1lICE9PSBsZWFzZS5zYXZlUG9pbnROYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIHJvb3QgdHJhbnNhY3Rpb24gc2F2ZXBvaW50IGRvZXMgbm90IG1hdGNoIGl0cyBsZWFzZVwiKVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXJpYWxpemVMZWFzZShsZWFzZSwgY2FsbGJhY2spXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHN0YXRlLmxlYXNlID0gdW5kZWZpbmVkXG4gICAgICBzdGF0ZS5yb290U2Vzc2lvbnMuZGVsZXRlKHNvY2tldClcbiAgICAgIGxlYXNlLnJlbGVhc2UoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIG9wZXJhdGlvbnMgYmVsb25naW5nIHRvIHRoZSBhY3RpdmUgbGVhc2UgaG9sZGVyLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge3tvcGVyYXRpb25zOiBQcm9taXNlPHZvaWQ+fX0gbGVhc2UgLSBBY3RpdmUgbGVhc2UuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBPcGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIFJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHNlcmlhbGl6ZUxlYXNlKGxlYXNlLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHByZXZpb3VzID0gbGVhc2Uub3BlcmF0aW9uc1xuICAgIC8qKlxuICAgICAqIFJlbGVhc2VzIHRoZSBob2xkZXIgb3BlcmF0aW9uIHF1ZXVlLlxuICAgICAqIEB0eXBlIHsodmFsdWU/OiB2b2lkKSA9PiB2b2lkfVxuICAgICAqL1xuICAgIGxldCByZWxlYXNlID0gKCkgPT4ge31cbiAgICBjb25zdCBjdXJyZW50ID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsgcmVsZWFzZSA9IHJlc29sdmUgfSlcbiAgICBsZWFzZS5vcGVyYXRpb25zID0gcHJldmlvdXMudGhlbigoKSA9PiBjdXJyZW50KVxuICAgIGF3YWl0IHByZXZpb3VzXG4gICAgdHJ5IHsgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKCkgfSBmaW5hbGx5IHsgcmVsZWFzZSgpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSb2xscyBiYWNrIGxlYXNlcyBhYmFuZG9uZWQgYnkgYSBkaXNjb25uZWN0ZWQgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJ3c1wiKS5XZWJTb2NrZXR9IHNvY2tldCAtIERpc2Nvbm5lY3RlZCBzZXNzaW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBhbGwgb3duZWQgbGVhc2VzIHJlbGVhc2UuXG4gICAqL1xuICBhc3luYyByZWxlYXNlRGlzY29ubmVjdGVkTGVhc2VzKHNvY2tldCkge1xuICAgIC8qKiBAdHlwZSB7QXJyYXk8RXJyb3I+fSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IFtdXG4gICAgZm9yIChjb25zdCBbY29ubmVjdGlvbiwgc3RhdGVdIG9mIHRoaXMuY29ubmVjdGlvblN0YXRlcykge1xuICAgICAgY29uc3QgbGVhc2UgPSBzdGF0ZS5sZWFzZVxuICAgICAgaWYgKCFsZWFzZSB8fCBsZWFzZS5zb2NrZXQgIT09IHNvY2tldCkgY29udGludWVcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VyaWFsaXplTGVhc2UobGVhc2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJvbGxiYWNrUm9vdFNhdmVQb2ludChjb25uZWN0aW9uLCBsZWFzZS5zYXZlUG9pbnROYW1lKVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc3RhdGUubGVhc2UgPSB1bmRlZmluZWRcbiAgICAgICAgc3RhdGUucm9vdFNlc3Npb25zLmRlbGV0ZShzb2NrZXQpXG4gICAgICAgIGxlYXNlLnJlbGVhc2UoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIGBTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIGxlYXNlIGNsZWFudXAgZmFpbGVkOiAke2Vycm9ycy5tYXAoKGVycm9yKSA9PiBlcnJvci5tZXNzYWdlKS5qb2luKFwiOyBcIil9YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJhY2tzIGRldGFjaGVkIHNvY2tldCBjbGVhbnVwIGFuZCByZWNvcmRzIGl0cyBmYWlsdXJlIGZvciBjbG9zZSgpLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIndzXCIpLldlYlNvY2tldH0gc29ja2V0IC0gQ2xvc2VkIHNlc3Npb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFNldHRsZWQgdHJhY2tlZCBjbGVhbnVwLlxuICAgKi9cbiAgc2NoZWR1bGVTZXNzaW9uQ2xlYW51cChzb2NrZXQpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuc2Vzc2lvbkNsZWFudXAuZ2V0KHNvY2tldClcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZ1xuICAgIGNvbnN0IGNsZWFudXAgPSB0aGlzLnJlbGVhc2VEaXNjb25uZWN0ZWRMZWFzZXMoc29ja2V0KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmNsZWFudXBFcnJvcnMucHVzaChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpXG4gICAgICB9KVxuICAgICAgLmZpbmFsbHkoKCkgPT4gdGhpcy5zZXNzaW9uQ2xlYW51cC5kZWxldGUoc29ja2V0KSlcbiAgICB0aGlzLnNlc3Npb25DbGVhbnVwLnNldChzb2NrZXQsIGNsZWFudXApXG4gICAgcmV0dXJuIGNsZWFudXBcbiAgfVxuXG4gIC8qKlxuICAgKiBSb2xscyBiYWNrIGFuZCByZW1vdmVzIGEgcm9vdCBzYXZlcG9pbnQgc28gaXQgY2Fubm90IHJlbWFpbiBiZW5lYXRoIHRoZSBuZXh0IGxlYXNlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29ubmVjdGlvbiAtIFBhcmVudCBwaHlzaWNhbCBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2F2ZVBvaW50TmFtZSAtIFJvb3Qgc2F2ZXBvaW50IG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHJvbGxiYWNrIGFuZCByZWxlYXNlLlxuICAgKi9cbiAgYXN5bmMgcm9sbGJhY2tSb290U2F2ZVBvaW50KGNvbm5lY3Rpb24sIHNhdmVQb2ludE5hbWUpIHtcbiAgICBjb25zdCBtZXRob2RzID0gLyoqIEB0eXBlIHt7cmVsZWFzZVNhdmVQb2ludDogKG5hbWU6IHN0cmluZywgb3B0aW9ucz86IHtvcGVyYXRpb25Pd25lcj86IHN5bWJvbH0pID0+IFByb21pc2U8dm9pZD4sIHJvbGxiYWNrU2F2ZVBvaW50OiAobmFtZTogc3RyaW5nLCBvcHRpb25zPzoge29wZXJhdGlvbk93bmVyPzogc3ltYm9sfSkgPT4gUHJvbWlzZTx2b2lkPn19ICovIChjb25uZWN0aW9uKVxuICAgIGNvbnN0IG9wZXJhdGlvbk93bmVyID0gdGhpcy5jb25uZWN0aW9uQ29vcmRpbmF0b3JPd25lcnMuZ2V0KGNvbm5lY3Rpb24pXG5cbiAgICBpZiAoIW9wZXJhdGlvbk93bmVyKSB0aHJvdyBuZXcgRXJyb3IoXCJTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIGNvbm5lY3Rpb24gb3duZXIgaXMgbWlzc2luZ1wiKVxuICAgIC8qKiBAdHlwZSB7QXJyYXk8RXJyb3I+fSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IFtdXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1ldGhvZHMucm9sbGJhY2tTYXZlUG9pbnQoc2F2ZVBvaW50TmFtZSwge29wZXJhdGlvbk93bmVyfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JzLnB1c2goZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbWV0aG9kcy5yZWxlYXNlU2F2ZVBvaW50KHNhdmVQb2ludE5hbWUsIHtvcGVyYXRpb25Pd25lcn0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGVycm9ycy5wdXNoKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSlcbiAgICB9XG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBgU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBjb3VsZCBub3QgY2xlYW4gcm9vdCBzYXZlcG9pbnQgJHtzYXZlUG9pbnROYW1lfTogJHtlcnJvcnMubWFwKChlcnJvcikgPT4gZXJyb3IubWVzc2FnZSkuam9pbihcIjsgXCIpfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgb3JkaW5hcnkgbm9uLWhvbGRlciB3b3JrIHRocm91Z2ggdGhlIGNvbm5lY3Rpb24gRklGTy5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtDb25uZWN0aW9uU3RhdGV9IHN0YXRlIC0gQ29ubmVjdGlvbiBzdGF0ZS5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIFdvcmsuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIFdvcmsgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgc2VyaWFsaXplKHN0YXRlLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHByZXZpb3VzID0gc3RhdGUucXVldWVcbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgY3VycmVudCBxdWV1ZSBlbnRyeS5cbiAgICAgKiBAdHlwZSB7KHZhbHVlPzogdm9pZCkgPT4gdm9pZH1cbiAgICAgKi9cbiAgICBsZXQgcmVsZWFzZSA9ICgpID0+IHt9XG4gICAgY29uc3QgY3VycmVudCA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7IHJlbGVhc2UgPSByZXNvbHZlIH0pXG4gICAgY29uc3QgcXVldWVkID0gcHJldmlvdXMudGhlbigoKSA9PiBjdXJyZW50KVxuICAgIHN0YXRlLnF1ZXVlID0gcXVldWVkXG4gICAgYXdhaXQgcHJldmlvdXNcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVsZWFzZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIGFkbWlzc2lvbiwgcmV2b2tlcyBjYXBhYmlsaXR5LCByZWplY3RzIGNsaWVudHMsIGFuZCBkcmFpbnMgYWN0aXZlIHdvcmsuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHRyYW5zcG9ydCBzaHV0ZG93bi5cbiAgICovXG4gIGFzeW5jIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLmNsb3NlUHJvbWlzZSkgcmV0dXJuIGF3YWl0IHRoaXMuY2xvc2VQcm9taXNlXG4gICAgdGhpcy5jbG9zZVByb21pc2UgPSB0aGlzLmNsb3NlVHJhbnNwb3J0KClcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jbG9zZVByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBkZXRlcm1pbmlzdGljIHRyYW5zcG9ydCBzaHV0ZG93biBhbmQgcmVwb3J0cyBjbGVhbnVwIGZhaWx1cmVzIGxhc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHNodXRkb3duIG9yIHJlamVjdHMgd2l0aCBjbGVhbnVwIGVycm9ycy5cbiAgICovXG4gIGFzeW5jIGNsb3NlVHJhbnNwb3J0KCkge1xuICAgIHRoaXMuYWNjZXB0aW5nID0gZmFsc2VcbiAgICB0aGlzLnNlY3JldCA9IHJhbmRvbUJ5dGVzKDMyKS50b1N0cmluZyhcImJhc2U2NHVybFwiKVxuICAgIGNvbnN0IGNsb3NpbmdTZXNzaW9ucyA9IEFycmF5LmZyb20odGhpcy5zZXNzaW9ucylcbiAgICBhd2FpdCBQcm9taXNlLmFsbChjbG9zaW5nU2Vzc2lvbnMubWFwKGFzeW5jIChzb2NrZXQpID0+IGF3YWl0IHRoaXMuc2NoZWR1bGVTZXNzaW9uQ2xlYW51cChzb2NrZXQpKSlcbiAgICBmb3IgKGNvbnN0IHNvY2tldCBvZiBjbG9zaW5nU2Vzc2lvbnMpIHNvY2tldC5jbG9zZSgxMDAxLCBcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgY2xvc2VkXCIpXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKEFycmF5LmZyb20odGhpcy5jb25uZWN0aW9uU3RhdGVzLnZhbHVlcygpKS5tYXAoKHN0YXRlKSA9PiBzdGF0ZS5xdWV1ZSkpXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHRoaXMud2Vic29ja2V0U2VydmVyLmNsb3NlKCgpID0+IHJlc29sdmUodW5kZWZpbmVkKSkpXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHRoaXMuaHR0cFNlcnZlci5jbG9zZSgoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpKVxuICAgIGF3YWl0IFByb21pc2UuYWxsKEFycmF5LmZyb20odGhpcy5zZXNzaW9uQ2xlYW51cC52YWx1ZXMoKSkpXG4gICAgZm9yIChjb25zdCBbY29ubmVjdGlvbiwgY29vcmRpbmF0b3JdIG9mIHRoaXMuY29ubmVjdGlvbkNvb3JkaW5hdG9ycykge1xuICAgICAgY2xlYXJTaGFyZWRUcmFuc2FjdGlvbkNvb3JkaW5hdG9yKGNvbm5lY3Rpb24sIGNvb3JkaW5hdG9yKVxuICAgIH1cbiAgICBpZiAodGhpcy5jbGVhbnVwRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcih0aGlzLmNsZWFudXBFcnJvcnMsIGBTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIGNsZWFudXAgZmFpbGVkOiAke3RoaXMuY2xlYW51cEVycm9ycy5tYXAoKGVycm9yKSA9PiBlcnJvci5tZXNzYWdlKS5qb2luKFwiOyBcIil9YClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|