velocious 1.0.562 → 1.0.564
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 +5 -1
- package/build/background-jobs/cron-expression.js +12 -13
- package/build/background-jobs/main.js +6 -6
- package/build/background-jobs/runner-graceful-shutdown.js +2 -3
- package/build/background-jobs/scheduler.js +3 -3
- package/build/background-jobs/worker.js +8 -9
- package/build/beacon/client.js +3 -4
- package/build/configuration-types.js +1 -0
- package/build/configuration.js +44 -3
- package/build/database/drivers/sqlite/web-persistence.js +2 -5
- package/build/database/pool/async-tracked-multi-connection.js +65 -15
- package/build/database/pool/base.js +23 -7
- package/build/database/query/index.js +21 -22
- package/build/database/query/model-class-query.js +5 -6
- package/build/database/record/attachments/normalize-input.js +9 -10
- package/build/database/record/attachments/store.js +2 -2
- package/build/database/record/auditing.js +7 -8
- package/build/database/record/index.js +4 -5
- package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +1 -2
- package/build/frontend-model-controller.js +49 -56
- package/build/frontend-models/base.js +17 -19
- package/build/frontend-models/outgoing-event-buffer.js +3 -4
- package/build/frontend-models/query.js +40 -44
- package/build/frontend-models/resource-definition.js +7 -8
- package/build/frontend-models/transport-serialization.js +10 -12
- package/build/frontend-models/websocket-channel.js +12 -13
- package/build/http-server/client/websocket-session.js +7 -8
- package/build/http-server/client-delivery-queue.js +167 -0
- package/build/http-server/server-client.js +9 -0
- package/build/http-server/websocket-event-log-store.js +4 -6
- package/build/http-server/websocket-events-host.js +42 -12
- package/build/http-server/worker-handler/in-process.js +53 -14
- package/build/http-server/worker-handler/index.js +88 -18
- package/build/http-server/worker-handler/worker-thread.js +2 -2
- package/build/plugins/sqljs-wasm-route.js +3 -5
- package/build/src/background-jobs/cron-expression.d.ts +0 -12
- package/build/src/background-jobs/cron-expression.d.ts.map +1 -1
- package/build/src/background-jobs/cron-expression.js +13 -13
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +7 -7
- package/build/src/background-jobs/runner-graceful-shutdown.d.ts +0 -6
- package/build/src/background-jobs/runner-graceful-shutdown.d.ts.map +1 -1
- package/build/src/background-jobs/runner-graceful-shutdown.js +3 -3
- package/build/src/background-jobs/scheduler.d.ts +0 -3
- package/build/src/background-jobs/scheduler.d.ts.map +1 -1
- package/build/src/background-jobs/scheduler.js +4 -4
- package/build/src/background-jobs/worker.d.ts +0 -8
- package/build/src/background-jobs/worker.d.ts.map +1 -1
- package/build/src/background-jobs/worker.js +9 -9
- package/build/src/beacon/client.d.ts +0 -4
- package/build/src/beacon/client.d.ts.map +1 -1
- package/build/src/beacon/client.js +4 -4
- package/build/src/configuration-types.d.ts +8 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +2 -1
- package/build/src/configuration.d.ts +34 -1
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +40 -4
- package/build/src/database/drivers/sqlite/web-persistence.d.ts +0 -14
- package/build/src/database/drivers/sqlite/web-persistence.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/web-persistence.js +3 -3
- package/build/src/database/pool/async-tracked-multi-connection.d.ts +29 -1
- package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
- package/build/src/database/pool/async-tracked-multi-connection.js +57 -15
- package/build/src/database/pool/base.d.ts +53 -4
- package/build/src/database/pool/base.d.ts.map +1 -1
- package/build/src/database/pool/base.js +23 -6
- package/build/src/database/query/index.d.ts +18 -39
- package/build/src/database/query/index.d.ts.map +1 -1
- package/build/src/database/query/index.js +22 -22
- package/build/src/database/query/model-class-query.d.ts +0 -5
- package/build/src/database/query/model-class-query.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.js +6 -6
- package/build/src/database/record/attachments/normalize-input.d.ts +0 -9
- package/build/src/database/record/attachments/normalize-input.d.ts.map +1 -1
- package/build/src/database/record/attachments/normalize-input.js +10 -10
- package/build/src/database/record/attachments/store.d.ts.map +1 -1
- package/build/src/database/record/attachments/store.js +2 -2
- package/build/src/database/record/auditing.d.ts +17 -24
- package/build/src/database/record/auditing.d.ts.map +1 -1
- package/build/src/database/record/auditing.js +8 -8
- package/build/src/database/record/index.d.ts +4 -4
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +5 -5
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +0 -39
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +2 -2
- package/build/src/frontend-model-controller.d.ts +1 -1
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +50 -50
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +18 -18
- package/build/src/frontend-models/outgoing-event-buffer.d.ts.map +1 -1
- package/build/src/frontend-models/outgoing-event-buffer.js +3 -3
- package/build/src/frontend-models/query.d.ts +56 -37
- package/build/src/frontend-models/query.d.ts.map +1 -1
- package/build/src/frontend-models/query.js +39 -39
- package/build/src/frontend-models/resource-definition.d.ts +0 -7
- package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
- package/build/src/frontend-models/resource-definition.js +8 -8
- package/build/src/frontend-models/transport-serialization.d.ts +0 -10
- package/build/src/frontend-models/transport-serialization.d.ts.map +1 -1
- package/build/src/frontend-models/transport-serialization.js +11 -11
- package/build/src/frontend-models/websocket-channel.d.ts +0 -12
- package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-channel.js +13 -13
- package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-session.js +8 -8
- package/build/src/http-server/client-delivery-queue.d.ts +121 -0
- package/build/src/http-server/client-delivery-queue.d.ts.map +1 -0
- package/build/src/http-server/client-delivery-queue.js +152 -0
- package/build/src/http-server/server-client.d.ts +6 -0
- package/build/src/http-server/server-client.d.ts.map +1 -1
- package/build/src/http-server/server-client.js +10 -1
- package/build/src/http-server/websocket-event-log-store.d.ts +0 -14
- package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -1
- package/build/src/http-server/websocket-event-log-store.js +5 -5
- package/build/src/http-server/websocket-events-host.d.ts +15 -4
- package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
- package/build/src/http-server/websocket-events-host.js +39 -13
- package/build/src/http-server/worker-handler/in-process.d.ts +19 -1
- package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/in-process.js +50 -14
- package/build/src/http-server/worker-handler/index.d.ts +36 -4
- package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/index.js +82 -18
- package/build/src/http-server/worker-handler/worker-thread.js +3 -3
- package/build/src/plugins/sqljs-wasm-route.d.ts.map +1 -1
- package/build/src/plugins/sqljs-wasm-route.js +4 -4
- package/build/src/sync/conflict-strategy.d.ts +0 -15
- package/build/src/sync/conflict-strategy.d.ts.map +1 -1
- package/build/src/sync/conflict-strategy.js +3 -3
- package/build/src/sync/device-identity.d.ts +0 -45
- package/build/src/sync/device-identity.d.ts.map +1 -1
- package/build/src/sync/device-identity.js +4 -4
- package/build/src/sync/local-mutation-log.d.ts +0 -41
- package/build/src/sync/local-mutation-log.d.ts.map +1 -1
- package/build/src/sync/local-mutation-log.js +9 -9
- package/build/src/sync/offline-grant.d.ts +0 -26
- package/build/src/sync/offline-grant.d.ts.map +1 -1
- package/build/src/sync/offline-grant.js +4 -4
- package/build/src/sync/peer-mutation-bundle.d.ts +0 -14
- package/build/src/sync/peer-mutation-bundle.d.ts.map +1 -1
- package/build/src/sync/peer-mutation-bundle.js +3 -3
- package/build/src/sync/server-change-feed.d.ts.map +1 -1
- package/build/src/sync/server-change-feed.js +33 -33
- package/build/src/sync/sync-api-client.d.ts +0 -9
- package/build/src/sync/sync-api-client.d.ts.map +1 -1
- package/build/src/sync/sync-api-client.js +2 -2
- package/build/src/sync/sync-envelope-replay-service.d.ts +38 -21
- package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
- package/build/src/sync/sync-envelope-replay-service.js +18 -18
- package/build/src/sync/sync-resource-base.d.ts +0 -7
- package/build/src/sync/sync-resource-base.d.ts.map +1 -1
- package/build/src/sync/sync-resource-base.js +2 -2
- package/build/src/sync/sync-scope-store.d.ts +0 -9
- package/build/src/sync/sync-scope-store.d.ts.map +1 -1
- package/build/src/sync/sync-scope-store.js +10 -10
- package/build/src/testing/test-filter-parser.d.ts +0 -10
- package/build/src/testing/test-filter-parser.d.ts.map +1 -1
- package/build/src/testing/test-filter-parser.js +11 -11
- package/build/src/testing/test-runner.d.ts +25 -91
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +113 -98
- package/build/src/testing/test.d.ts +8 -0
- package/build/src/testing/test.d.ts.map +1 -1
- package/build/src/testing/test.js +9 -9
- package/build/src/utils/backtrace-cleaner.d.ts.map +1 -1
- package/build/src/utils/backtrace-cleaner.js +9 -9
- package/build/src/utils/model-scope.d.ts +0 -8
- package/build/src/utils/model-scope.d.ts.map +1 -1
- package/build/src/utils/model-scope.js +3 -3
- package/build/src/utils/ransack.d.ts +52 -19
- package/build/src/utils/ransack.d.ts.map +1 -1
- package/build/src/utils/ransack.js +26 -26
- package/build/sync/conflict-strategy.js +3 -6
- package/build/sync/device-identity.js +4 -9
- package/build/sync/local-mutation-log.js +9 -14
- package/build/sync/offline-grant.js +4 -7
- package/build/sync/peer-mutation-bundle.js +2 -4
- package/build/sync/server-change-feed.js +32 -34
- package/build/sync/sync-api-client.js +1 -2
- package/build/sync/sync-envelope-replay-service.js +17 -19
- package/build/sync/sync-resource-base.js +1 -2
- package/build/sync/sync-scope-store.js +9 -10
- package/build/testing/test-filter-parser.js +10 -11
- package/build/testing/test-runner.js +116 -108
- package/build/testing/test.js +8 -9
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/utils/backtrace-cleaner.js +8 -9
- package/build/utils/model-scope.js +3 -4
- package/build/utils/ransack.js +27 -34
- package/package.json +3 -1
- package/scripts/eslint-rules/typedefs-first.js +67 -0
- package/scripts/prewarm-chromedriver.js +26 -0
- package/src/background-jobs/cron-expression.js +12 -13
- package/src/background-jobs/main.js +6 -6
- package/src/background-jobs/runner-graceful-shutdown.js +2 -3
- package/src/background-jobs/scheduler.js +3 -3
- package/src/background-jobs/worker.js +8 -9
- package/src/beacon/client.js +3 -4
- package/src/configuration-types.js +1 -0
- package/src/configuration.js +44 -3
- package/src/database/drivers/sqlite/web-persistence.js +2 -5
- package/src/database/pool/async-tracked-multi-connection.js +65 -15
- package/src/database/pool/base.js +23 -7
- package/src/database/query/index.js +21 -22
- package/src/database/query/model-class-query.js +5 -6
- package/src/database/record/attachments/normalize-input.js +9 -10
- package/src/database/record/attachments/store.js +2 -2
- package/src/database/record/auditing.js +7 -8
- package/src/database/record/index.js +4 -5
- package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +1 -2
- package/src/frontend-model-controller.js +49 -56
- package/src/frontend-models/base.js +17 -19
- package/src/frontend-models/outgoing-event-buffer.js +3 -4
- package/src/frontend-models/query.js +40 -44
- package/src/frontend-models/resource-definition.js +7 -8
- package/src/frontend-models/transport-serialization.js +10 -12
- package/src/frontend-models/websocket-channel.js +12 -13
- package/src/http-server/client/websocket-session.js +7 -8
- package/src/http-server/client-delivery-queue.js +167 -0
- package/src/http-server/server-client.js +9 -0
- package/src/http-server/websocket-event-log-store.js +4 -6
- package/src/http-server/websocket-events-host.js +42 -12
- package/src/http-server/worker-handler/in-process.js +53 -14
- package/src/http-server/worker-handler/index.js +88 -18
- package/src/http-server/worker-handler/worker-thread.js +2 -2
- package/src/plugins/sqljs-wasm-route.js +3 -5
- package/src/sync/conflict-strategy.js +3 -6
- package/src/sync/device-identity.js +4 -9
- package/src/sync/local-mutation-log.js +9 -14
- package/src/sync/offline-grant.js +4 -7
- package/src/sync/peer-mutation-bundle.js +2 -4
- package/src/sync/server-change-feed.js +32 -34
- package/src/sync/sync-api-client.js +1 -2
- package/src/sync/sync-envelope-replay-service.js +17 -19
- package/src/sync/sync-resource-base.js +1 -2
- package/src/sync/sync-scope-store.js +9 -10
- package/src/testing/test-filter-parser.js +10 -11
- package/src/testing/test-runner.js +116 -108
- package/src/testing/test.js +8 -9
- package/src/utils/backtrace-cleaner.js +8 -9
- package/src/utils/model-scope.js +3 -4
- package/src/utils/ransack.js +27 -34
|
@@ -5,6 +5,23 @@ import { resolveFrontendModelResourceClass } from "../frontend-models/resource-d
|
|
|
5
5
|
import SyncReplayUpsertApplier from "./sync-replay-upsert-applier.js";
|
|
6
6
|
import { ValidationError } from "../database/record/index.js";
|
|
7
7
|
import VelociousError from "../velocious-error.js";
|
|
8
|
+
/**
|
|
9
|
+
* Resolved routed-resource registration for one replay resource type.
|
|
10
|
+
* @typedef {object} SyncReplayResourceRegistration
|
|
11
|
+
* @property {string} modelName - Effective frontend model name.
|
|
12
|
+
* @property {import("../configuration-types.js").FrontendModelResourceClassType} resourceClass - Routed resource class.
|
|
13
|
+
* @property {import("../configuration-types.js").NormalizedFrontendModelResourceConfiguration | null} resourceConfiguration - Normalized resource configuration when registry-resolved.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* @typedef {object} SyncReplayMutation
|
|
17
|
+
* @property {Date} clientUpdatedAt - Client-side mutation timestamp.
|
|
18
|
+
* @property {Record<string, ?>} data - Parsed mutation payload.
|
|
19
|
+
* @property {?} id - Client sync row id for per-sync responses.
|
|
20
|
+
* @property {string} resourceId - Resource id as a string.
|
|
21
|
+
* @property {string} resourceType - Resource/model name.
|
|
22
|
+
* @property {string} serializedData - JSON serialized mutation payload.
|
|
23
|
+
* @property {string} syncType - Sync operation type.
|
|
24
|
+
*/
|
|
8
25
|
/**
|
|
9
26
|
* One declarative broadcast fanned out after a mutation applies.
|
|
10
27
|
* @typedef {object} SyncReplayBroadcast
|
|
@@ -679,21 +696,4 @@ export default class SyncEnvelopeReplayService {
|
|
|
679
696
|
await deliverDeclaredBroadcasts({ args, broadcaster: this.broadcaster, broadcasts: this.broadcasts });
|
|
680
697
|
}
|
|
681
698
|
}
|
|
682
|
-
/**
|
|
683
|
-
* Resolved routed-resource registration for one replay resource type.
|
|
684
|
-
* @typedef {object} SyncReplayResourceRegistration
|
|
685
|
-
* @property {string} modelName - Effective frontend model name.
|
|
686
|
-
* @property {import("../configuration-types.js").FrontendModelResourceClassType} resourceClass - Routed resource class.
|
|
687
|
-
* @property {import("../configuration-types.js").NormalizedFrontendModelResourceConfiguration | null} resourceConfiguration - Normalized resource configuration when registry-resolved.
|
|
688
|
-
*/
|
|
689
|
-
/**
|
|
690
|
-
* @typedef {object} SyncReplayMutation
|
|
691
|
-
* @property {Date} clientUpdatedAt - Client-side mutation timestamp.
|
|
692
|
-
* @property {Record<string, ?>} data - Parsed mutation payload.
|
|
693
|
-
* @property {?} id - Client sync row id for per-sync responses.
|
|
694
|
-
* @property {string} resourceId - Resource id as a string.
|
|
695
|
-
* @property {string} resourceType - Resource/model name.
|
|
696
|
-
* @property {string} serializedData - JSON serialized mutation payload.
|
|
697
|
-
* @property {string} syncType - Sync operation type.
|
|
698
|
-
*/
|
|
699
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zeW5jL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyx5QkFBeUIsRUFBRSxhQUFhLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUNoRixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sK0JBQStCLENBQUE7QUFDN0QsT0FBTyxFQUFDLGlDQUFpQyxFQUFDLE1BQU0sMkNBQTJDLENBQUE7QUFDM0YsT0FBTyx1QkFBdUIsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNyRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDM0QsT0FBTyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFFbEQ7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyx5QkFBeUI7SUFDNUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BMEJHO0lBQ0gsWUFBWSxJQUFJLEdBQUcsRUFBRTtRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFBO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUE7UUFDdkMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsSUFBSSx5QkFBeUIsQ0FBQTtRQUNwRixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixJQUFJLElBQUksQ0FBQTtRQUNyRSxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixJQUFJLE9BQU8sQ0FBQTtRQUMxRSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixJQUFJLHFCQUFxQixDQUFBO1FBQ3RGLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLElBQUksSUFBSSxDQUFBO1FBQ2pFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFBO1FBQy9ELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUE7UUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQTtRQUN6QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtRQUM1RixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFBO1FBQy9DLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFBO1FBQy9ELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUE7UUFDbkMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQTtRQUNqRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFBO1FBQ2pDLGlFQUFpRTtRQUNqRSxJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUU3QyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxxQkFBcUIsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzFJLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDakgsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLG1GQUFtRixDQUFDLENBQUE7UUFDdEcsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsa0JBQWtCLENBQUMsYUFBYTtRQUM5QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFO1lBQ3RGLElBQUksT0FBTyxPQUFPLEtBQUssVUFBVTtnQkFBRSxPQUFPLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBRWpFLE1BQU0sT0FBTyxHQUFHLElBQUksdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUE7WUFFcEQsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLGdDQUFnQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNwSCxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU07UUFDakIsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMvQixPQUFPO2dCQUNMLEtBQUssRUFBRSxFQUFFO2dCQUNULE1BQU0sRUFBRSxPQUFPO2dCQUNmLFNBQVMsRUFBRSxXQUFXLENBQUMsU0FBUztnQkFDaEMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxZQUFZO2FBQ3ZDLENBQUE7UUFDSCxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFBO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQUVqRixLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMvQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUUxRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3pCLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBQzdDLFNBQVE7WUFDVixDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFBO1lBQzFDLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLEVBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7WUFFdEcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDMUIsYUFBYSxDQUFDLElBQUksQ0FBQztvQkFDakIsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFO29CQUNmLFNBQVMsRUFBRSxRQUFRO29CQUNuQixNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU0sSUFBSSxlQUFlO2lCQUMvQyxDQUFDLENBQUE7Z0JBQ0YsU0FBUTtZQUNWLENBQUM7WUFFRCxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO1lBQ3JHLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLEVBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO1lBRXJILGdCQUFnQjtZQUNoQixJQUFJLFdBQVcsQ0FBQTtZQUVmLElBQUksQ0FBQztnQkFDSCxXQUFXLEdBQUcsV0FBVztvQkFDdkIsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUMsQ0FBQztvQkFDN0YsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO1lBQ25HLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLG1FQUFtRTtnQkFDbkUsb0VBQW9FO2dCQUNwRSw0REFBNEQ7Z0JBQzVELElBQUksS0FBSyxZQUFZLGNBQWMsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQzFELGFBQWEsQ0FBQyxJQUFJLENBQUM7d0JBQ2pCLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRTt3QkFDZixTQUFTLEVBQUUsUUFBUTt3QkFDbkIsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksY0FBYzt3QkFDcEMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO3FCQUN2QixDQUFDLENBQUE7b0JBQ0YsU0FBUTtnQkFDVixDQUFDO2dCQUVELE1BQU0sS0FBSyxDQUFBO1lBQ2IsQ0FBQztZQUVELE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBQyxDQUFDLENBQUE7WUFDdkgsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtZQUVySCxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBQyxDQUFDLENBQUE7UUFDaEUsQ0FBQztRQUVELE9BQU8sRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFDLENBQUE7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsa0JBQWtCLENBQUMsTUFBTTtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQywwR0FBMEcsQ0FBQyxDQUFBO1FBQzdILENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUE7UUFFbkQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxFQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLDhCQUE4QixFQUFFLFlBQVksRUFBRSw4QkFBOEIsRUFBQyxDQUFBO1FBQ3hILENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsRUFBQyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7UUFFbkcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxFQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLDhCQUE4QixFQUFFLFlBQVksRUFBRSw4QkFBOEIsRUFBQyxDQUFBO1FBQ3hILENBQUM7UUFFRCxPQUFPLEVBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUMsQ0FBQTtJQUNyQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLO1FBQzVCLE9BQU8sRUFBRSxDQUFBO0lBQ1gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsTUFBTTtRQUNoQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDeEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxtQkFBbUIsQ0FBQyxPQUFPO1FBQ3pCLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN0RSxPQUFPLEVBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBQyxFQUFDLENBQUE7UUFDNUYsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLGdDQUFnQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDdkQsTUFBTSxFQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFDLEdBQUcsSUFBSSxDQUFBO1FBRTVFLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFVBQVUsS0FBSyxTQUFTLElBQUksVUFBVSxLQUFLLElBQUksSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxSyxPQUFPLEVBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUscUJBQXFCLEVBQUMsRUFBQyxDQUFBO1FBQ3hGLENBQUM7UUFFRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUMzQyxJQUFJLG1CQUFtQixHQUFHLE9BQU8sZUFBZSxLQUFLLFFBQVEsSUFBSSxlQUFlLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUV6SSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUM7WUFBRSxtQkFBbUIsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO1FBRWpGLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEVBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQTtRQUVqSCxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRTtZQUFFLE9BQU8sb0JBQW9CLENBQUE7UUFFekQsT0FBTztZQUNMLEVBQUUsRUFBRSxJQUFJO1lBQ1IsUUFBUSxFQUFFO2dCQUNSLGVBQWUsRUFBRSxtQkFBbUI7Z0JBQ3BDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxJQUFJO2dCQUMvQixFQUFFO2dCQUNGLFVBQVUsRUFBRSxnQkFBZ0I7Z0JBQzVCLFlBQVk7Z0JBQ1osY0FBYyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDO2dCQUN6RCxRQUFRO2FBQ1Q7U0FDRixDQUFBO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCx1QkFBdUIsQ0FBQyxFQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBQztRQUMxRCxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLElBQUk7WUFBRSxPQUFPLEVBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFDLENBQUE7UUFFcEUsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFFbkMsSUFBSSxDQUFDLFVBQVUsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7b0JBQUUsT0FBTyxFQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBQyxDQUFBO2dCQUUzRyxPQUFPLEVBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBQyxDQUFBO1lBQ3hFLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsd0JBQXdCLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFBO2dCQUNuRixPQUFPLEVBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFDLEVBQUMsQ0FBQTtZQUNqRixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTyxFQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBQyxDQUFBO1FBRWhGLE9BQU8sRUFBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBQyxDQUFBO0lBQzNELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLHVCQUF1QixDQUFDLEtBQUs7UUFDakMsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsQ0FBQTtJQUN4QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUM7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFaEMsT0FBTyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1lBQ2pDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDdkQsV0FBVyxFQUFFLFFBQVEsQ0FBQyxVQUFVO1lBQ2hDLGFBQWEsRUFBRSxRQUFRLENBQUMsWUFBWTtTQUNyQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWEsQ0FBQyxLQUFLO1FBQ2pCLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUUsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUMxRSxNQUFNLElBQUksS0FBSyxDQUFDLDhHQUE4RyxDQUFDLENBQUE7UUFDakksQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFBO0lBQ25CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLHlCQUF5QixDQUFDLEVBQUMsWUFBWSxFQUFFLFFBQVEsRUFBQztRQUN0RCxNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUVwRixPQUFPLENBQUMsdUJBQXVCLElBQUksUUFBUSxDQUFDLGVBQWUsR0FBRyx1QkFBdUIsQ0FBQTtJQUN2RixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGlDQUFpQyxDQUFDLFlBQVk7UUFDNUMsSUFBSSxDQUFDLFlBQVksSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFbEUsTUFBTSxVQUFVLEdBQUcsZ0NBQWdDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNsRSxNQUFNLEtBQUssR0FBRyxPQUFPLFVBQVUsQ0FBQyxlQUFlLEtBQUssVUFBVTtZQUM1RCxDQUFDLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRTtZQUM5QixDQUFDLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQTtRQUU5QixJQUFJLEtBQUssWUFBWSxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUE7UUFFdkMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFMUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFbkMsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQTtJQUNqRSxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLG1CQUFtQixDQUFDLElBQUk7UUFDNUIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFBO1lBRW5FLElBQUksWUFBWTtnQkFBRSxPQUFPLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFBO1FBQ3ZILENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUFFLE9BQU8sTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFL0UsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsaUJBQWlCO1FBQ2YsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQTtJQUNsRSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsMEJBQTBCLENBQUMsWUFBWTtRQUNyQyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFaEYsSUFBSSxvQkFBb0IsS0FBSyxTQUFTO1lBQUUsT0FBTyxvQkFBb0IsQ0FBQTtRQUVuRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFekUsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFFakUsT0FBTyxZQUFZLENBQUE7SUFDckIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxpQ0FBaUMsQ0FBQyxZQUFZO1FBQzVDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBRTNELElBQUksUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzdDLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxFQUFDLENBQUE7UUFDeEYsQ0FBQztRQUVELE1BQU0sb0JBQW9CLEdBQUcsT0FBTyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQTtRQUVuRixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUVwQyxNQUFNLG9CQUFvQixHQUFHLGlDQUFpQyxDQUFDLEVBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFDLENBQUMsQ0FBQTtRQUV2SSxJQUFJLENBQUMsb0JBQW9CO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFdEMsT0FBTztZQUNMLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxTQUFTO1lBQ3pDLGFBQWEsRUFBRSxvQkFBb0IsQ0FBQyxhQUFhO1lBQ2pELHFCQUFxQixFQUFFLG9CQUFvQixDQUFDLHFCQUFxQjtTQUNsRSxDQUFBO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILG1CQUFtQixDQUFDLEVBQUMsUUFBUSxFQUFFLFlBQVksRUFBQztRQUMxQyxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFBO1FBRWhELE9BQU8sSUFBSSxhQUFhLENBQUM7WUFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksU0FBUztZQUNsQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsSUFBSSxFQUFFO1lBQ2xDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUU7WUFDekIsU0FBUyxFQUFFLFlBQVksQ0FBQyxTQUFTO1lBQ2pDLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSTtZQUNyQixHQUFHLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFDLHFCQUFxQixFQUFFLFlBQVksQ0FBQyxxQkFBcUIsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDM0csQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLHlCQUF5QixDQUFDLEVBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUM7UUFDL0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUUzRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLCtCQUErQixRQUFRLENBQUMsWUFBWSxHQUFHLEVBQUUsRUFBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUMsQ0FBQyxDQUFBO1FBQ3JILENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBQyxRQUFRLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQTtRQUNuRSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtRQUVyRixJQUFJLGlCQUFpQixLQUFLLElBQUk7WUFBRSxPQUFPLGlCQUFpQixDQUFBO1FBRXhELE1BQU0sYUFBYSxHQUFHLE1BQU0sUUFBUSxDQUFDLHFCQUFxQixDQUFDLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7UUFFL0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMzQixNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLFFBQVEsQ0FBQyxZQUFZLEdBQUcsRUFBRSxFQUFDLElBQUksRUFBRSxhQUFhLENBQUMsTUFBTSxJQUFJLGVBQWUsRUFBQyxDQUFDLENBQUE7UUFDbkksQ0FBQztRQUVELElBQUksUUFBUSxDQUFDLFFBQVEsS0FBSyxRQUFRO1lBQUUsT0FBTyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO1FBRW5HLE9BQU8sTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7SUFDMUUsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxLQUFLLENBQUMsdUJBQXVCLENBQUMsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFDO1FBQ2hELE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtRQUV6RSxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFBO1FBRWxFLE1BQU0sa0JBQWtCLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRWxELElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ3hCLENBQUM7Z0JBQVMsQ0FBQztZQUNULGtCQUFrQixFQUFFLENBQUE7UUFDdEIsQ0FBQztRQUVELE9BQU8sRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUE7SUFDaEQsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0gsS0FBSyxDQUFDLHVCQUF1QixDQUFDLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUM7UUFDekQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7UUFDdkUsTUFBTSxjQUFjLEdBQUcsTUFBTSxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQTtRQUVoRSxtRUFBbUU7UUFDbkUsSUFBSSxNQUFNLEdBQUcsY0FBYyxDQUFBO1FBQzNCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQTtRQUVuQixJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLE1BQU0sa0JBQWtCLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBRTFELElBQUksQ0FBQztnQkFDSCxjQUFjLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO2dCQUNqQyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUNuRCxDQUFDO29CQUFTLENBQUM7Z0JBQ1Qsa0JBQWtCLEVBQUUsQ0FBQTtZQUN0QixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsRUFBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7WUFDOUUsT0FBTyxHQUFHLElBQUksQ0FBQTtRQUNoQixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQUVsRixPQUFPLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxFQUFDLENBQUE7SUFDckQsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gseUJBQXlCLENBQUMsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFDO1FBQzVDLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLDBCQUEwQixFQUFFLENBQUE7UUFFakUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSwrRUFBK0UsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUE7UUFDckosQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUN4QyxNQUFNLHlCQUF5QixHQUFHLFVBQVUsQ0FBQywrQkFBK0IsRUFBRSxDQUFBO1FBRTlFLDBCQUEwQjtRQUMxQixNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRTdCLEtBQUssTUFBTSxhQUFhLElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUNoRCxXQUFXLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1lBRTlCLE1BQU0sVUFBVSxHQUFHLHlCQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFBO1lBRTNELElBQUksVUFBVTtnQkFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzdDLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDMUMsTUFBTSxtQkFBbUIsR0FBRyxVQUFVLENBQUMsK0JBQStCLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUVwRixnQ0FBZ0M7UUFDaEMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFBO1FBRXJCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3pELElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLE1BQU0sUUFBUSxDQUFDLHNCQUFzQixDQUFDLHNCQUFzQixHQUFHLEdBQUcsRUFBRSxFQUFDLElBQUksRUFBRSx3QkFBd0IsRUFBQyxDQUFDLENBQUE7WUFDdkcsQ0FBQztZQUVELElBQUksR0FBRyxLQUFLLFVBQVUsSUFBSSxHQUFHLEtBQUssbUJBQW1CO2dCQUFFLFNBQVE7WUFFL0QsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtRQUN6QixDQUFDO1FBRUQsT0FBTyxVQUFVLENBQUE7SUFDbkIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNILEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFDO1FBQzdELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUN4QyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDMUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUE7UUFFcEcsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQywyQkFBMkIsUUFBUSxDQUFDLFlBQVksR0FBRyxFQUFFO2dCQUM3RSxJQUFJLEVBQUUsUUFBUSxDQUFDLDhCQUE4QixDQUFDLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUMsQ0FBQyxJQUFJLGVBQWU7YUFDL0YsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUVELE1BQU0sVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFFcEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsR0FBRyxVQUFVLEVBQUMsQ0FBQyxDQUFBO1FBQ2pGLE1BQU0sa0JBQWtCLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRWxELElBQUksQ0FBQztZQUNILElBQUksQ0FBQztnQkFDSCxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUNyQixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUN6QyxDQUFDO1lBRUQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQTtZQUVoQyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLE1BQU0sU0FBUyxHQUFHLE1BQU0sVUFBVTtxQkFDL0IsYUFBYSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUM7cUJBQzVELEtBQUssQ0FBQyxFQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7cUJBQ2xDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtnQkFFcEIsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUMzQixNQUFNLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtvQkFFdEIsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLDJCQUEyQixRQUFRLENBQUMsWUFBWSxHQUFHLEVBQUU7d0JBQzdFLElBQUksRUFBRSxRQUFRLENBQUMsOEJBQThCLENBQUMsRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLElBQUksZUFBZTtxQkFDL0YsQ0FBQyxDQUFBO2dCQUNKLENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxNQUFNLENBQUE7UUFDZixDQUFDO2dCQUFTLENBQUM7WUFDVCxrQkFBa0IsRUFBRSxDQUFBO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsc0JBQXNCLENBQUMsTUFBTTtRQUNqQyxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUNyQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gscUJBQXFCLENBQUMsS0FBSztRQUN6QixJQUFJLEtBQUssWUFBWSxlQUFlLEVBQUUsQ0FBQztZQUNyQyxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFDLENBQUMsQ0FBQTtRQUNyRixDQUFDO1FBRUQsT0FBTyxvQkFBb0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEtBQUs7UUFDL0IsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFDO1FBQzVGLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU07UUFFM0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7UUFFbEUsNEVBQTRFO1FBQzVFLDhEQUE4RDtRQUM5RCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUMvQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBQyxDQUFDLENBQUMsQ0FBQTtRQUM1SCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMscUJBQXFCLElBQUksV0FBVyxFQUFFLENBQUM7WUFDOUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7WUFFMUUsSUFBSSxjQUFjLEtBQUssU0FBUyxJQUFJLGNBQWMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDNUQsVUFBVSxDQUFDLElBQUksR0FBRyxPQUFPLGNBQWMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUN4RyxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsWUFBWSxDQUFDLENBQUE7WUFFcEYsSUFBSSx1QkFBdUIsSUFBSSxRQUFRLENBQUMsZUFBZSxJQUFJLHVCQUF1QjtnQkFBRSxPQUFNO1FBQzVGLENBQUM7UUFFRCxNQUFNLGFBQWEsQ0FBQyxFQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUMsQ0FBQyxDQUFBO0lBQzVFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsdUJBQXVCLENBQUMsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDO1FBQ3ZDLE9BQU87WUFDTCxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1lBQ3ZELGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxlQUFlO1lBQzNDLElBQUksRUFBRSxRQUFRLENBQUMsY0FBYztZQUM3QixXQUFXLEVBQUUsUUFBUSxDQUFDLFVBQVU7WUFDaEMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxZQUFZO1lBQ3BDLFNBQVMsRUFBRSxRQUFRLENBQUMsUUFBUTtTQUM3QixDQUFBO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQUMsSUFBSTtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTTtRQUNqRCw0RUFBNEU7UUFDNUUsK0VBQStFO1FBQy9FLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU07UUFFN0IsTUFBTSx5QkFBeUIsQ0FBQyxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBQyxDQUFDLENBQUE7SUFDckcsQ0FBQztDQUNGO0FBRUQ7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7OztHQVNHIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZGVsaXZlckRlY2xhcmVkQnJvYWRjYXN0cywgdXBzZXJ0U3luY1Jvd30gZnJvbSBcIi4vc3luYy1jaGFuZ2UtZmFub3V0LmpzXCJcbmltcG9ydCB7bWFya1NlcnZlckFwcGx5fSBmcm9tIFwiLi9zeW5jLXB1Ymxpc2gtc3VwcHJlc3Npb24uanNcIlxuaW1wb3J0IHtyZXNvbHZlRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3N9IGZyb20gXCIuLi9mcm9udGVuZC1tb2RlbHMvcmVzb3VyY2UtZGVmaW5pdGlvbi5qc1wiXG5pbXBvcnQgU3luY1JlcGxheVVwc2VydEFwcGxpZXIgZnJvbSBcIi4vc3luYy1yZXBsYXktdXBzZXJ0LWFwcGxpZXIuanNcIlxuaW1wb3J0IHtWYWxpZGF0aW9uRXJyb3J9IGZyb20gXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIlxuaW1wb3J0IFZlbG9jaW91c0Vycm9yIGZyb20gXCIuLi92ZWxvY2lvdXMtZXJyb3IuanNcIlxuXG4vKipcbiAqIE9uZSBkZWNsYXJhdGl2ZSBicm9hZGNhc3QgZmFubmVkIG91dCBhZnRlciBhIG11dGF0aW9uIGFwcGxpZXMuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jUmVwbGF5QnJvYWRjYXN0XG4gKiBAcHJvcGVydHkge3N0cmluZyB8ICgoYXJnczogUmVjb3JkPHN0cmluZywgPz4pID0+IHN0cmluZyl9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUgb3IgcmVzb2x2ZXIuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiBSZWNvcmQ8c3RyaW5nLCA/PikgPT4gUmVjb3JkPHN0cmluZywgPz59IGJyb2FkY2FzdFBhcmFtcyAtIENoYW5uZWwgcm91dGluZyBwYXJhbXMuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiBSZWNvcmQ8c3RyaW5nLCA/PikgPT4gP30gYm9keSAtIEJyb2FkY2FzdCBib2R5LlxuICogQHByb3BlcnR5IHsoYXJnczogUmVjb3JkPHN0cmluZywgPz4pID0+IGJvb2xlYW59IFt3aGVuXSAtIE9wdGlvbmFsIGdhdGU7IHNraXBwZWQgd2hlbiBpdCByZXR1cm5zIGZhbHNlLlxuICovXG5cbi8qKlxuICogUmVwbGF5cyBjbGllbnQgc3luYyBlbnZlbG9wZXMgdGhyb3VnaCBwcm9qZWN0IHN1cHBsaWVkIGF1dGhlbnRpY2F0aW9uLFxuICogYXV0aG9yaXphdGlvbiwgYXBwbGljYXRpb24sIGFuZCBwZXJzaXN0ZW5jZSBob29rcy5cbiAqXG4gKiBUaGlzIGlzIGludGVudGlvbmFsbHkgdHJhbnNwb3J0L21vZGVsIGFnbm9zdGljOiBWZWxvY2lvdXMgb3ducyB0aGUgZ2VuZXJpY1xuICogcmVwbGF5IGxvb3AsIG5vcm1hbGl6YXRpb24sIHN0YWxlLWNsaWVudCBjb21wYXJpc29uLCBhbmQgcGVyLXN5bmMgcmVzdWx0XG4gKiBzaGFwZSB3aGlsZSBlYWNoIGFwcCBvd25zIGl0cyB0b2tlbiBsb29rdXAsIG1vZGVsIGhhbmRsZXJzLCBhbmRcbiAqIGRvbWFpbiBhdXRob3JpemF0aW9uIHJ1bGVzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBzeW5jIGVudmVsb3BlIHJlcGxheSBzZXJ2aWNlLlxuICAgKlxuICAgKiBXaGVuIGEgc3luYyBtb2RlbCBpcyBnaXZlbiwgYGZpbmRFeGlzdGluZ1JlcGxheVN5bmNgIGFuZFxuICAgKiBgcGVyc2lzdFJlcGxheU11dGF0aW9uYCBnZXQgbW9kZWwtYmFja2VkIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zLiBUaGUgc3luY1xuICAgKiBtb2RlbCBtdXN0IGV4cG9zZSBgZmluZEJ5YC9gY3JlYXRlYCBzdGF0aWNzIHBsdXMgaW5zdGFuY2VcbiAgICogYGFzc2lnbmAvYHNhdmVgL2BjbGllbnRVcGRhdGVkQXRgIGFuZCBgYWR2YW5jZVNlcnZlclNlcXVlbmNlYCAodGhlXG4gICAqIGNoYW5nZS1mZWVkIHNlcXVlbmNlIGNvbnRyYWN0KSwgYW5kIHRoZSBhY3RvciByZXR1cm5lZCBmcm9tXG4gICAqIGBhdXRoZW50aWNhdGVSZXBsYXlgIG11c3QgZXhwb3NlIGFuIGBpZCgpYCBtZXRob2QuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBDb25zdHJ1Y3RvciBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7e2RlYnVnPzogKC4uLmFyZ3M6IEFycmF5PHVua25vd24+KSA9PiB2b2lkLCB3YXJuPzogKC4uLmFyZ3M6IEFycmF5PHVua25vd24+KSA9PiB2b2lkfX0gW2FyZ3MubG9nZ2VyXSAtIExvZ2dlciB1c2VkIGZvciBub3JtYWxpemF0aW9uIHdhcm5pbmdzLlxuICAgKiBAcGFyYW0gez99IFthcmdzLnN5bmNNb2RlbF0gLSBTeW5jL2NoYW5nZSBtb2RlbCBlbmFibGluZyBtb2RlbC1iYWNrZWQgZGVmYXVsdCBob29rcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmFjdG9yRm9yZWlnbktleUNvbHVtbl0gLSBTeW5jIG1vZGVsIGNvbHVtbiBsaW5raW5nIHJvd3MgdG8gdGhlIHJlcGxheSBhY3Rvci5cbiAgICogQHBhcmFtIHs/fSBbYXJncy5hdXRoZW50aWNhdGlvblRva2VuTW9kZWxdIC0gVG9rZW4gbW9kZWwgZW5hYmxpbmcgdGhlIGRlZmF1bHQgdG9rZW4tbG9va3VwIGF1dGhlbnRpY2F0ZVJlcGxheS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW5Db2x1bW5dIC0gVG9rZW4gbW9kZWwgY29sdW1uIGhvbGRpbmcgdGhlIHRva2VuLiBEZWZhdWx0cyB0byBcInRva2VuXCIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5hdXRoZW50aWNhdGlvblRva2VuUGFyYW1dIC0gUmVxdWVzdCBwYXJhbSBjYXJyeWluZyB0aGUgdG9rZW4uIERlZmF1bHRzIHRvIFwiYXV0aGVudGljYXRpb25Ub2tlblwiLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsICgoYXJnczogUmVjb3JkPHN0cmluZywgPz4pID0+IFByb21pc2U8Pz4pIHwgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBTeW5jUmVwbGF5VXBzZXJ0QXBwbGllcj5bMF0+fSBbYXJncy5hcHBseUhhbmRsZXJzXSAtIFBlci1yZXNvdXJjZVR5cGUgYXBwbHkgaGFuZGxlcnMgKGZ1bmN0aW9ucyBvciBkZWNsYXJhdGl2ZSB1cHNlcnQtYXBwbGllciBzcGVjcykgZW5hYmxpbmcgdGhlIGRlZmF1bHQgYXBwbHlSZXBsYXlNdXRhdGlvbiBkaXNwYXRjaC4gRGVwcmVjYXRlZDogcHJlZmVyIHJlc291cmNlIHJvdXRpbmcgdmlhIGBjb25maWd1cmF0aW9uYC9gcmVzb3VyY2VUeXBlT3ZlcnJpZGVzYDsgYXBwbHlIYW5kbGVycyByZW1haW4gZm9yIHJlbGVhc2VkIGFkb3B0ZXJzIGFuZCB3aWxsIGJlIHJlbW92ZWQgYWZ0ZXIgdGhlaXIgbWlncmF0aW9uLlxuICAgKiBAcGFyYW0geyhhcmdzOiBSZWNvcmQ8c3RyaW5nLCA/PikgPT4gUmVjb3JkPHN0cmluZywgPz59IFthcmdzLnBlcnNpc3RFeHRyYUF0dHJpYnV0ZXNdIC0gRXh0cmEgYXR0cmlidXRlcyBtZXJnZWQgaW50byB0aGUgbW9kZWwtYmFja2VkIHBlcnNpc3RlZCByb3cgKGUuZy4gYW4gZXZlbnQgc2NvcGUgY29sdW1uKS5cbiAgICogQHBhcmFtIHsoYXJnczoge211dGF0aW9uOiA/LCBhcHBseVJlc3VsdDogP30pID0+ID99IFthcmdzLnBlcnNpc3RTZXJpYWxpemVkRGF0YV0gLSBPdmVycmlkZXMgdGhlIHBlcnNpc3RlZCBkYXRhIHBheWxvYWQgKG9iamVjdCByZXN1bHRzIGFyZSBKU09OIHN0cmluZ2lmaWVkKS5cbiAgICogQHBhcmFtIHsoYnJvYWRjYXN0OiB7Y2hhbm5lbDogc3RyaW5nLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsID8+LCBib2R5OiA/fSkgPT4gUHJvbWlzZTx2b2lkPn0gW2FyZ3MuYnJvYWRjYXN0ZXJdIC0gRGVsaXZlcnMgZGVjbGFyYXRpdmUgYnJvYWRjYXN0cy4gUmVxdWlyZWQgd2hlbiBicm9hZGNhc3RzIGFyZSBjb25maWd1cmVkLlxuICAgKiBAcGFyYW0ge1N5bmNSZXBsYXlCcm9hZGNhc3RbXX0gW2FyZ3MuYnJvYWRjYXN0c10gLSBCcm9hZGNhc3RzIGZhbm5lZCBvdXQgYnkgdGhlIGRlZmF1bHQgYWZ0ZXJSZXBsYXlNdXRhdGlvbi5cbiAgICogQHBhcmFtIHt7Z2V0QmFja2VuZFByb2plY3RzOiAoKSA9PiBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbltdfX0gW2FyZ3MuY29uZmlndXJhdGlvbl0gLSBDb25maWd1cmF0aW9uIHdob3NlIGZyb250ZW5kLW1vZGVsIHJlZ2lzdHJ5IHJvdXRlcyBtdXRhdGlvbnMgdG8gcmVzb3VyY2UgY2xhc3Nlcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IHN0cmluZz59IFthcmdzLnJlc291cmNlVHlwZU92ZXJyaWRlc10gLSBQZXItcmVzb3VyY2VUeXBlIHJvdXRpbmcgb3ZlcnJpZGVzOiBhIHJlc291cmNlIGNsYXNzLCBvciBhIHN0cmluZyBhbGlhcyByZXNvbHZlZCB0aHJvdWdoIHRoZSByZWdpc3RyeS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9hdXRob3JpemF0aW9uL2FiaWxpdHkuanNcIikuZGVmYXVsdH0gW2FyZ3MuYWJpbGl0eV0gLSBBYmlsaXR5IHNjb3Bpbmcgcm91dGVkIHJlY29yZCBsb29rdXBzIGFuZCBjcmVhdGUgbWVtYmVyc2hpcCBjaGVja3MuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IFthcmdzLmFiaWxpdHlDb250ZXh0XSAtIEFiaWxpdHkgY29udGV4dCBwYXNzZWQgdG8gcm91dGVkIHJlc291cmNlcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW2FyZ3MubG9jYWxzXSAtIExvY2FscyBwYXNzZWQgdG8gcm91dGVkIHJlc291cmNlcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGFyZ3MgPSB7fSkge1xuICAgIHRoaXMubG9nZ2VyID0gYXJncy5sb2dnZXIgfHwgY29uc29sZVxuICAgIHRoaXMuc3luY01vZGVsID0gYXJncy5zeW5jTW9kZWwgfHwgbnVsbFxuICAgIHRoaXMuYWN0b3JGb3JlaWduS2V5Q29sdW1uID0gYXJncy5hY3RvckZvcmVpZ25LZXlDb2x1bW4gfHwgXCJhdXRoZW50aWNhdGlvbl90b2tlbl9pZFwiXG4gICAgdGhpcy5hdXRoZW50aWNhdGlvblRva2VuTW9kZWwgPSBhcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW5Nb2RlbCB8fCBudWxsXG4gICAgdGhpcy5hdXRoZW50aWNhdGlvblRva2VuQ29sdW1uID0gYXJncy5hdXRoZW50aWNhdGlvblRva2VuQ29sdW1uIHx8IFwidG9rZW5cIlxuICAgIHRoaXMuYXV0aGVudGljYXRpb25Ub2tlblBhcmFtID0gYXJncy5hdXRoZW50aWNhdGlvblRva2VuUGFyYW0gfHwgXCJhdXRoZW50aWNhdGlvblRva2VuXCJcbiAgICB0aGlzLnBlcnNpc3RFeHRyYUF0dHJpYnV0ZXMgPSBhcmdzLnBlcnNpc3RFeHRyYUF0dHJpYnV0ZXMgfHwgbnVsbFxuICAgIHRoaXMucGVyc2lzdFNlcmlhbGl6ZWREYXRhID0gYXJncy5wZXJzaXN0U2VyaWFsaXplZERhdGEgfHwgbnVsbFxuICAgIHRoaXMuYnJvYWRjYXN0ZXIgPSBhcmdzLmJyb2FkY2FzdGVyIHx8IG51bGxcbiAgICB0aGlzLmJyb2FkY2FzdHMgPSBhcmdzLmJyb2FkY2FzdHMgfHwgbnVsbFxuICAgIHRoaXMuYXBwbHlIYW5kbGVycyA9IGFyZ3MuYXBwbHlIYW5kbGVycyA/IHRoaXMuYnVpbHRBcHBseUhhbmRsZXJzKGFyZ3MuYXBwbHlIYW5kbGVycykgOiBudWxsXG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gYXJncy5jb25maWd1cmF0aW9uIHx8IG51bGxcbiAgICB0aGlzLnJlc291cmNlVHlwZU92ZXJyaWRlcyA9IGFyZ3MucmVzb3VyY2VUeXBlT3ZlcnJpZGVzIHx8IG51bGxcbiAgICB0aGlzLmFiaWxpdHkgPSBhcmdzLmFiaWxpdHkgfHwgbnVsbFxuICAgIHRoaXMuYWJpbGl0eUNvbnRleHQgPSBhcmdzLmFiaWxpdHlDb250ZXh0IHx8IG51bGxcbiAgICB0aGlzLmxvY2FscyA9IGFyZ3MubG9jYWxzIHx8IG51bGxcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFN5bmNSZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbiB8IG51bGw+fSAqL1xuICAgIHRoaXMuX3JlcGxheVJlc291cmNlUmVnaXN0cmF0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgaWYgKGFyZ3MuYWN0b3JGb3JlaWduS2V5Q29sdW1uICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBhcmdzLmFjdG9yRm9yZWlnbktleUNvbHVtbiAhPT0gXCJzdHJpbmdcIiB8fCBhcmdzLmFjdG9yRm9yZWlnbktleUNvbHVtbi5sZW5ndGggPCAxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBhY3RvckZvcmVpZ25LZXlDb2x1bW4gbXVzdCBiZSBhIG5vbi1ibGFuayBzdHJpbmcsIGdvdDogJHtTdHJpbmcoYXJncy5hY3RvckZvcmVpZ25LZXlDb2x1bW4pfWApXG4gICAgfVxuICAgIGlmICh0aGlzLmJyb2FkY2FzdHMgJiYgIXRoaXMuYnJvYWRjYXN0ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2UgYnJvYWRjYXN0cyByZXF1aXJlIGEgYnJvYWRjYXN0ZXIgb3B0aW9uIGRlbGl2ZXJpbmcgdGhlbVwiKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcyBkZWNsYXJhdGl2ZSBhcHBseS1oYW5kbGVyIHNwZWNzIGluIHVwc2VydCBhcHBsaWVycy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gYXBwbHlIYW5kbGVycyAtIFJhdyBhcHBseSBoYW5kbGVycy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIChhcmdzOiBSZWNvcmQ8c3RyaW5nLCA/PikgPT4gUHJvbWlzZTw/Pj59IENhbGxhYmxlIGhhbmRsZXJzIGJ5IHJlc291cmNlIHR5cGUuXG4gICAqL1xuICBidWlsdEFwcGx5SGFuZGxlcnMoYXBwbHlIYW5kbGVycykge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXBwbHlIYW5kbGVycykubWFwKChbcmVzb3VyY2VUeXBlLCBoYW5kbGVyXSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBbcmVzb3VyY2VUeXBlLCBoYW5kbGVyXVxuXG4gICAgICBjb25zdCBhcHBsaWVyID0gbmV3IFN5bmNSZXBsYXlVcHNlcnRBcHBsaWVyKGhhbmRsZXIpXG5cbiAgICAgIHJldHVybiBbcmVzb3VyY2VUeXBlLCAoLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gYXBwbHlBcmdzKSA9PiBhcHBsaWVyLmFwcGx5KC8qKiBAdHlwZSB7P30gKi8gKGFwcGx5QXJncykpXVxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheXMgYSBzeW5jIGJhdGNoLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBwYXJhbXMgLSBSZXF1ZXN0IHBhcmFtcyBjYXJyeWluZyBhdXRoZW50aWNhdGlvbiBhbmQgc3luY3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtzeW5jczogQXJyYXk8UmVjb3JkPHN0cmluZywgPz4+LCBzdGF0dXM/OiBzdHJpbmcsIGVycm9yQ29kZT86IHN0cmluZywgZXJyb3JNZXNzYWdlPzogc3RyaW5nfT59IFJlcGxheSByZXNwb25zZS5cbiAgICovXG4gIGFzeW5jIHJlcGxheShwYXJhbXMpIHtcbiAgICBjb25zdCBhY3RvclJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aGVudGljYXRlUmVwbGF5KHBhcmFtcylcblxuICAgIGlmICghYWN0b3JSZXN1bHQuYXV0aGVudGljYXRlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3luY3M6IFtdLFxuICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIixcbiAgICAgICAgZXJyb3JDb2RlOiBhY3RvclJlc3VsdC5lcnJvckNvZGUsXG4gICAgICAgIGVycm9yTWVzc2FnZTogYWN0b3JSZXN1bHQuZXJyb3JNZXNzYWdlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3luY1Jlc3BvbnNlcyA9IFtdXG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuYnVpbGRSZXBsYXlDb250ZXh0KHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIHBhcmFtc30pXG5cbiAgICBmb3IgKGNvbnN0IHJhd1N5bmMgb2YgdGhpcy5yZXBsYXlTeW5jcyhwYXJhbXMpKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkUmVzdWx0ID0gdGhpcy5ub3JtYWxpemVSZXBsYXlTeW5jKHJhd1N5bmMpXG5cbiAgICAgIGlmICghbm9ybWFsaXplZFJlc3VsdC5vaykge1xuICAgICAgICBzeW5jUmVzcG9uc2VzLnB1c2gobm9ybWFsaXplZFJlc3VsdC5yZXNwb25zZSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgbXV0YXRpb24gPSBub3JtYWxpemVkUmVzdWx0Lm11dGF0aW9uXG4gICAgICBjb25zdCBhY2Nlc3NSZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGhvcml6ZVJlcGxheU11dGF0aW9uKHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIGNvbnRleHQsIG11dGF0aW9ufSlcblxuICAgICAgaWYgKCFhY2Nlc3NSZXN1bHQuYWxsb3dlZCkge1xuICAgICAgICBzeW5jUmVzcG9uc2VzLnB1c2goe1xuICAgICAgICAgIGlkOiBtdXRhdGlvbi5pZCxcbiAgICAgICAgICBzeW5jU3RhdGU6IFwiZmFpbGVkXCIsXG4gICAgICAgICAgcmVhc29uOiBhY2Nlc3NSZXN1bHQucmVhc29uIHx8IFwiYWNjZXNzLWRlbmllZFwiXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nU3luYyA9IGF3YWl0IHRoaXMuZmluZEV4aXN0aW5nUmVwbGF5U3luYyh7YWN0b3I6IGFjdG9yUmVzdWx0LmFjdG9yLCBjb250ZXh0LCBtdXRhdGlvbn0pXG4gICAgICBjb25zdCBzaG91bGRBcHBseSA9IGF3YWl0IHRoaXMuc2hvdWxkQXBwbHlSZXBsYXlNdXRhdGlvbih7YWN0b3I6IGFjdG9yUmVzdWx0LmFjdG9yLCBjb250ZXh0LCBleGlzdGluZ1N5bmMsIG11dGF0aW9ufSlcblxuICAgICAgLyoqIEB0eXBlIHs/fSAqL1xuICAgICAgbGV0IGFwcGx5UmVzdWx0XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGFwcGx5UmVzdWx0ID0gc2hvdWxkQXBwbHlcbiAgICAgICAgICA/IGF3YWl0IHRoaXMuYXBwbHlSZXBsYXlNdXRhdGlvbih7YWN0b3I6IGFjdG9yUmVzdWx0LmFjdG9yLCBjb250ZXh0LCBleGlzdGluZ1N5bmMsIG11dGF0aW9ufSlcbiAgICAgICAgICA6IGF3YWl0IHRoaXMuc2tpcHBlZFJlcGxheU11dGF0aW9uKHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIGNvbnRleHQsIGV4aXN0aW5nU3luYywgbXV0YXRpb259KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gQ2xpZW50LXNhZmUgYXBwbHkgZmFpbHVyZXMgKHNjaGVtYSB2YWxpZGF0aW9uLCBtb2RlbCB2YWxpZGF0aW9uLFxuICAgICAgICAvLyBhdXRob3JpemF0aW9uIGRlbmlhbHMsIHVua25vd24gcmVzb3VyY2UgdHlwZXMpIGZhaWwgdGhpcyBzeW5jIGFuZFxuICAgICAgICAvLyBrZWVwIHRoZSBiYXRjaCBnb2luZzsgdW5leHBlY3RlZCBlcnJvcnMga2VlcCBwcm9wYWdhdGluZy5cbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVmVsb2Npb3VzRXJyb3IgJiYgZXJyb3Iuc2FmZVRvRXhwb3NlKSB7XG4gICAgICAgICAgc3luY1Jlc3BvbnNlcy5wdXNoKHtcbiAgICAgICAgICAgIGlkOiBtdXRhdGlvbi5pZCxcbiAgICAgICAgICAgIHN5bmNTdGF0ZTogXCJmYWlsZWRcIixcbiAgICAgICAgICAgIHJlYXNvbjogZXJyb3IuY29kZSB8fCBcImFwcGx5LWZhaWxlZFwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZVxuICAgICAgICAgIH0pXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMucGVyc2lzdFJlcGxheU11dGF0aW9uKHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIGNvbnRleHQsIGV4aXN0aW5nU3luYywgYXBwbHlSZXN1bHQsIG11dGF0aW9uLCBzaG91bGRBcHBseX0pXG4gICAgICBhd2FpdCB0aGlzLmFmdGVyUmVwbGF5TXV0YXRpb24oe2FjdG9yOiBhY3RvclJlc3VsdC5hY3RvciwgY29udGV4dCwgZXhpc3RpbmdTeW5jLCBhcHBseVJlc3VsdCwgbXV0YXRpb24sIHNob3VsZEFwcGx5fSlcblxuICAgICAgc3luY1Jlc3BvbnNlcy5wdXNoKHtpZDogbXV0YXRpb24uaWQsIHN5bmNTdGF0ZTogXCJzdWNjZXNzZnVsXCJ9KVxuICAgIH1cblxuICAgIHJldHVybiB7c3luY3M6IHN5bmNSZXNwb25zZXN9XG4gIH1cblxuICAvKipcbiAgICogQXV0aGVudGljYXRlcyB0aGUgc3luYyBiYXRjaCBhY3Rvci5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYSB0b2tlbi1tb2RlbCBsb29rdXAgd2hlbiBgYXV0aGVudGljYXRpb25Ub2tlbk1vZGVsYCBpc1xuICAgKiBjb25maWd1cmVkOyBvdGhlcndpc2UgYXBwcyBvdmVycmlkZSB0aGlzIGhvb2suXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IHBhcmFtcyAtIFJlcXVlc3QgcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7YXV0aGVudGljYXRlZDogdHJ1ZSwgYWN0b3I6ID99IHwge2F1dGhlbnRpY2F0ZWQ6IGZhbHNlLCBlcnJvckNvZGU6IHN0cmluZywgZXJyb3JNZXNzYWdlOiBzdHJpbmd9Pn0gQXV0aCByZXN1bHQuXG4gICAqL1xuICBhc3luYyBhdXRoZW50aWNhdGVSZXBsYXkocGFyYW1zKSB7XG4gICAgaWYgKCF0aGlzLmF1dGhlbnRpY2F0aW9uVG9rZW5Nb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0VudmVsb3BlUmVwbGF5U2VydmljZS5hdXRoZW50aWNhdGVSZXBsYXkgbXVzdCBiZSBpbXBsZW1lbnRlZCAob3IgY29uZmlndXJlIGF1dGhlbnRpY2F0aW9uVG9rZW5Nb2RlbClcIilcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IHBhcmFtc1t0aGlzLmF1dGhlbnRpY2F0aW9uVG9rZW5QYXJhbV1cblxuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiB7YXV0aGVudGljYXRlZDogZmFsc2UsIGVycm9yQ29kZTogXCJtaXNzaW5nLWF1dGhlbnRpY2F0aW9uLXRva2VuXCIsIGVycm9yTWVzc2FnZTogXCJNaXNzaW5nIGF1dGhlbnRpY2F0aW9uIHRva2VuXCJ9XG4gICAgfVxuXG4gICAgY29uc3QgYWN0b3IgPSBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0aW9uVG9rZW5Nb2RlbC5maW5kQnkoe1t0aGlzLmF1dGhlbnRpY2F0aW9uVG9rZW5Db2x1bW5dOiB0b2tlbn0pXG5cbiAgICBpZiAoIWFjdG9yKSB7XG4gICAgICByZXR1cm4ge2F1dGhlbnRpY2F0ZWQ6IGZhbHNlLCBlcnJvckNvZGU6IFwiaW52YWxpZC1hdXRoZW50aWNhdGlvbi10b2tlblwiLCBlcnJvck1lc3NhZ2U6IFwiSW52YWxpZCBhdXRoZW50aWNhdGlvbiB0b2tlblwifVxuICAgIH1cblxuICAgIHJldHVybiB7YWN0b3IsIGF1dGhlbnRpY2F0ZWQ6IHRydWV9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHBlci1iYXRjaCBtdXRhYmxlIGNvbnRleHQgZm9yIGNhY2hlcyBzaGFyZWQgYWNyb3NzIHN5bmMgaXRlbXMuXG4gICAqIEBwYXJhbSB7e2FjdG9yOiA/LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsID8+fX0gX2FyZ3MgLSBBY3RvciBhbmQgcmVxdWVzdCBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsID8+Pn0gUmVwbGF5IGNvbnRleHQuXG4gICAqL1xuICBhc3luYyBidWlsZFJlcGxheUNvbnRleHQoX2FyZ3MpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHJhdyBzeW5jIGVudHJpZXMgZnJvbSByZXF1ZXN0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gcGFyYW1zIC0gUmVxdWVzdCBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHtBcnJheTw/Pn0gUmF3IHN5bmMgZW50cmllcy5cbiAgICovXG4gIHJlcGxheVN5bmNzKHBhcmFtcykge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhcmFtcy5zeW5jcykgPyBwYXJhbXMuc3luY3MgOiBbXVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgb25lIHN5bmMgZW50cnkuXG4gICAqIEBwYXJhbSB7P30gcmF3U3luYyAtIFJhdyBzeW5jIGVudHJ5LlxuICAgKiBAcmV0dXJucyB7e29rOiB0cnVlLCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn0gfCB7b2s6IGZhbHNlLCByZXNwb25zZTogUmVjb3JkPHN0cmluZywgPz59fSBOb3JtYWxpemVkIG11dGF0aW9uIG9yIGZhaWxlZCByZXNwb25zZS5cbiAgICovXG4gIG5vcm1hbGl6ZVJlcGxheVN5bmMocmF3U3luYykge1xuICAgIGlmICghcmF3U3luYyB8fCB0eXBlb2YgcmF3U3luYyAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHJhd1N5bmMpKSB7XG4gICAgICByZXR1cm4ge29rOiBmYWxzZSwgcmVzcG9uc2U6IHtpZDogdW5kZWZpbmVkLCBzeW5jU3RhdGU6IFwiZmFpbGVkXCIsIHJlYXNvbjogXCJpbnZhbGlkLXN5bmNcIn19XG4gICAgfVxuXG4gICAgY29uc3Qgc3luYyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChyYXdTeW5jKVxuICAgIGNvbnN0IHtjbGllbnRVcGRhdGVkQXQsIGRhdGEsIGlkLCByZXNvdXJjZUlkLCByZXNvdXJjZVR5cGUsIHN5bmNUeXBlfSA9IHN5bmNcblxuICAgIGlmICh0eXBlb2YgcmVzb3VyY2VUeXBlICE9PSBcInN0cmluZ1wiIHx8IHJlc291cmNlVHlwZS5sZW5ndGggPCAxIHx8IHJlc291cmNlSWQgPT09IHVuZGVmaW5lZCB8fCByZXNvdXJjZUlkID09PSBudWxsIHx8IHR5cGVvZiBzeW5jVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCBzeW5jVHlwZS5sZW5ndGggPCAxKSB7XG4gICAgICByZXR1cm4ge29rOiBmYWxzZSwgcmVzcG9uc2U6IHtpZCwgc3luY1N0YXRlOiBcImZhaWxlZFwiLCByZWFzb246IFwiaW52YWxpZC1yZXNvdXJjZS1pZFwifX1cbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZUlkU3RyaW5nID0gU3RyaW5nKHJlc291cmNlSWQpXG4gICAgbGV0IGNsaWVudFVwZGF0ZWRBdERhdGUgPSB0eXBlb2YgY2xpZW50VXBkYXRlZEF0ID09PSBcInN0cmluZ1wiIHx8IGNsaWVudFVwZGF0ZWRBdCBpbnN0YW5jZW9mIERhdGUgPyBuZXcgRGF0ZShjbGllbnRVcGRhdGVkQXQpIDogbmV3IERhdGUoKVxuXG4gICAgaWYgKE51bWJlci5pc05hTihjbGllbnRVcGRhdGVkQXREYXRlLmdldFRpbWUoKSkpIGNsaWVudFVwZGF0ZWRBdERhdGUgPSBuZXcgRGF0ZSgpXG5cbiAgICBjb25zdCBub3JtYWxpemVkRGF0YVJlc3VsdCA9IHRoaXMubm9ybWFsaXplUmVwbGF5U3luY0RhdGEoe2RhdGEsIGlkLCByZXNvdXJjZUlkOiByZXNvdXJjZUlkU3RyaW5nLCByZXNvdXJjZVR5cGV9KVxuXG4gICAgaWYgKCFub3JtYWxpemVkRGF0YVJlc3VsdC5vaykgcmV0dXJuIG5vcm1hbGl6ZWREYXRhUmVzdWx0XG5cbiAgICByZXR1cm4ge1xuICAgICAgb2s6IHRydWUsXG4gICAgICBtdXRhdGlvbjoge1xuICAgICAgICBjbGllbnRVcGRhdGVkQXQ6IGNsaWVudFVwZGF0ZWRBdERhdGUsXG4gICAgICAgIGRhdGE6IG5vcm1hbGl6ZWREYXRhUmVzdWx0LmRhdGEsXG4gICAgICAgIGlkLFxuICAgICAgICByZXNvdXJjZUlkOiByZXNvdXJjZUlkU3RyaW5nLFxuICAgICAgICByZXNvdXJjZVR5cGUsXG4gICAgICAgIHNlcmlhbGl6ZWREYXRhOiBKU09OLnN0cmluZ2lmeShub3JtYWxpemVkRGF0YVJlc3VsdC5kYXRhKSxcbiAgICAgICAgc3luY1R5cGVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBvbmUgc3luYyBkYXRhIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7e2RhdGE6ID8sIGlkOiA/LCByZXNvdXJjZUlkOiBzdHJpbmcsIHJlc291cmNlVHlwZTogc3RyaW5nfX0gYXJncyAtIFN5bmMgcGF5bG9hZCBub3JtYWxpemF0aW9uIGFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge3tvazogdHJ1ZSwgZGF0YTogUmVjb3JkPHN0cmluZywgPz59IHwge29rOiBmYWxzZSwgcmVzcG9uc2U6IFJlY29yZDxzdHJpbmcsID8+fX0gTm9ybWFsaXplZCBwYXlsb2FkIG9yIGZhaWxlZCByZXNwb25zZS5cbiAgICovXG4gIG5vcm1hbGl6ZVJlcGxheVN5bmNEYXRhKHtkYXRhLCBpZCwgcmVzb3VyY2VJZCwgcmVzb3VyY2VUeXBlfSkge1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQgfHwgZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHtvazogdHJ1ZSwgZGF0YToge319XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSBKU09OLnBhcnNlKGRhdGEpXG5cbiAgICAgICAgaWYgKCFwYXJzZWREYXRhIHx8IHR5cGVvZiBwYXJzZWREYXRhICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocGFyc2VkRGF0YSkpIHJldHVybiB7b2s6IHRydWUsIGRhdGE6IHt9fVxuXG4gICAgICAgIHJldHVybiB7b2s6IHRydWUsIGRhdGE6IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChwYXJzZWREYXRhKX1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4/LihcIkludmFsaWQgc3luYyBkYXRhIEpTT05cIiwge2Vycm9yLCBpZCwgcmVzb3VyY2VJZCwgcmVzb3VyY2VUeXBlfSlcbiAgICAgICAgcmV0dXJuIHtvazogZmFsc2UsIHJlc3BvbnNlOiB7aWQsIHN5bmNTdGF0ZTogXCJmYWlsZWRcIiwgcmVhc29uOiBcImludmFsaWQtZGF0YVwifX1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkgcmV0dXJuIHtvazogdHJ1ZSwgZGF0YToge319XG5cbiAgICByZXR1cm4ge29rOiB0cnVlLCBkYXRhOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKX1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRob3JpemVzIG9uZSBub3JtYWxpemVkIG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge3thY3RvcjogPywgY29udGV4dDogUmVjb3JkPHN0cmluZywgPz4sIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufX0gX2FyZ3MgLSBBY3RvciwgYmF0Y2ggY29udGV4dCwgYW5kIG11dGF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7YWxsb3dlZDogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nfT59IEFjY2VzcyByZXN1bHQuXG4gICAqL1xuICBhc3luYyBhdXRob3JpemVSZXBsYXlNdXRhdGlvbihfYXJncykge1xuICAgIHJldHVybiB7YWxsb3dlZDogdHJ1ZX1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgcHJldmlvdXNseSBzdG9yZWQgc3luYy9jaGFuZ2Ugcm93IGZvciBzdGFsZS1jbGllbnQgY29tcGFyaXNvbi5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYSBzeW5jLW1vZGVsIGxvb2t1cCBieSBhY3RvciBhbmQgcmVzb3VyY2UgaWRlbnRpdHkgd2hlbiBhIHN5bmNcbiAgICogbW9kZWwgaXMgY29uZmlndXJlZDsgb3RoZXJ3aXNlIGFwcHMgb3ZlcnJpZGUgdGhpcyBob29rLlxuICAgKiBAcGFyYW0ge3thY3RvcjogPywgY29udGV4dDogUmVjb3JkPHN0cmluZywgPz4sIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufX0gYXJncyAtIEFjdG9yLCBiYXRjaCBjb250ZXh0LCBhbmQgbXV0YXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPD8+fSBFeGlzdGluZyBzeW5jIHJvdy5cbiAgICovXG4gIGFzeW5jIGZpbmRFeGlzdGluZ1JlcGxheVN5bmMoe2FjdG9yLCBtdXRhdGlvbn0pIHtcbiAgICBpZiAoIXRoaXMuc3luY01vZGVsKSByZXR1cm4gbnVsbFxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3luY01vZGVsLmZpbmRCeSh7XG4gICAgICBbdGhpcy5hY3RvckZvcmVpZ25LZXlDb2x1bW5dOiB0aGlzLnJlcGxheUFjdG9ySWQoYWN0b3IpLFxuICAgICAgcmVzb3VyY2VfaWQ6IG11dGF0aW9uLnJlc291cmNlSWQsXG4gICAgICByZXNvdXJjZV90eXBlOiBtdXRhdGlvbi5yZXNvdXJjZVR5cGVcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBwZXJzaXN0ZWQgYWN0b3IgaWQgdXNlZCBieSBtb2RlbC1iYWNrZWQgZGVmYXVsdCBob29rcy5cbiAgICogQHBhcmFtIHs/fSBhY3RvciAtIEFjdG9yIHJldHVybmVkIGZyb20gYXV0aGVudGljYXRlUmVwbGF5LlxuICAgKiBAcmV0dXJucyB7P30gQWN0b3IgaWQuXG4gICAqL1xuICByZXBsYXlBY3RvcklkKGFjdG9yKSB7XG4gICAgaWYgKCFhY3RvciB8fCB0eXBlb2YgYWN0b3IgIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGFjdG9yLmlkICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2UgbW9kZWwtYmFja2VkIGRlZmF1bHRzIHJlcXVpcmUgYW4gYWN0b3Igd2l0aCBhbiBpZCgpIG1ldGhvZCBmcm9tIGF1dGhlbnRpY2F0ZVJlcGxheVwiKVxuICAgIH1cblxuICAgIHJldHVybiBhY3Rvci5pZCgpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIGEgbm9ybWFsaXplZCBtdXRhdGlvbiBzaG91bGQgYmUgYXBwbGllZCB0byBkb21haW4gbW9kZWxzLlxuICAgKiBAcGFyYW0ge3thY3RvcjogPywgY29udGV4dDogUmVjb3JkPHN0cmluZywgPz4sIGV4aXN0aW5nU3luYzogPywgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259fSBhcmdzIC0gQWN0b3IsIGJhdGNoIGNvbnRleHQsIGV4aXN0aW5nIHN5bmMgcm93LCBhbmQgbXV0YXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIHRvIGFwcGx5IHRoZSBtdXRhdGlvbi5cbiAgICovXG4gIGFzeW5jIHNob3VsZEFwcGx5UmVwbGF5TXV0YXRpb24oe2V4aXN0aW5nU3luYywgbXV0YXRpb259KSB7XG4gICAgY29uc3QgZXhpc3RpbmdDbGllbnRVcGRhdGVkQXQgPSB0aGlzLmV4aXN0aW5nUmVwbGF5U3luY0NsaWVudFVwZGF0ZWRBdChleGlzdGluZ1N5bmMpXG5cbiAgICByZXR1cm4gIWV4aXN0aW5nQ2xpZW50VXBkYXRlZEF0IHx8IG11dGF0aW9uLmNsaWVudFVwZGF0ZWRBdCA+IGV4aXN0aW5nQ2xpZW50VXBkYXRlZEF0XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGNsaWVudCB0aW1lc3RhbXAgZnJvbSBhbiBleGlzdGluZyBzeW5jIHJvdy5cbiAgICogQHBhcmFtIHs/fSBleGlzdGluZ1N5bmMgLSBFeGlzdGluZyBzeW5jIHJvdy5cbiAgICogQHJldHVybnMge0RhdGUgfCBudWxsfSBFeGlzdGluZyBjbGllbnQgdGltZXN0YW1wLlxuICAgKi9cbiAgZXhpc3RpbmdSZXBsYXlTeW5jQ2xpZW50VXBkYXRlZEF0KGV4aXN0aW5nU3luYykge1xuICAgIGlmICghZXhpc3RpbmdTeW5jIHx8IHR5cGVvZiBleGlzdGluZ1N5bmMgIT09IFwib2JqZWN0XCIpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBzeW5jUmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKGV4aXN0aW5nU3luYylcbiAgICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBzeW5jUmVjb3JkLmNsaWVudFVwZGF0ZWRBdCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHN5bmNSZWNvcmQuY2xpZW50VXBkYXRlZEF0KClcbiAgICAgIDogc3luY1JlY29yZC5jbGllbnRVcGRhdGVkQXRcblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiB2YWx1ZVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gbmV3IERhdGUodmFsdWUpXG5cbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHBhcnNlZFZhbHVlLmdldFRpbWUoKSkgPyBudWxsIDogcGFyc2VkVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIG9uZSBub3JtYWxpemVkIG11dGF0aW9uIHRvIGRvbWFpbiBtb2RlbHMuXG4gICAqXG4gICAqIERpc3BhdGNoZXMgdGhyb3VnaCB0aGUgY29uZmlndXJlZCBhcHBseS1oYW5kbGVyIHJlZ2lzdHJ5IGZpcnN0IChjb21wYXRcbiAgICogcHJlY2VkZW5jZSk7IG11dGF0aW9ucyB3aXRob3V0IGEgbWF0Y2hpbmcgaGFuZGxlciBmYWxsIHRocm91Z2ggdG9cbiAgICogcmVzb3VyY2Ugcm91dGluZyB3aGVuIGEgY29uZmlndXJhdGlvbiBvciByZXNvdXJjZVR5cGVPdmVycmlkZXMgYXJlXG4gICAqIGNvbmZpZ3VyZWQsIGFuZCBvdGhlcndpc2UgZmFpbCBsb3VkbHkuXG4gICAqIEBwYXJhbSB7e2FjdG9yOiA/LCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCA/PiwgZXhpc3RpbmdTeW5jOiA/LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IGFyZ3MgLSBBY3RvciwgYmF0Y2ggY29udGV4dCwgZXhpc3Rpbmcgc3luYyByb3csIGFuZCBtdXRhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IFByb2plY3Qtc3BlY2lmaWMgYXBwbHkgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgYXBwbHlSZXBsYXlNdXRhdGlvbihhcmdzKSB7XG4gICAgaWYgKHRoaXMuYXBwbHlIYW5kbGVycykge1xuICAgICAgY29uc3QgYXBwbHlIYW5kbGVyID0gdGhpcy5hcHBseUhhbmRsZXJzW2FyZ3MubXV0YXRpb24ucmVzb3VyY2VUeXBlXVxuXG4gICAgICBpZiAoYXBwbHlIYW5kbGVyKSByZXR1cm4gYXdhaXQgYXBwbHlIYW5kbGVyKGFyZ3MpXG4gICAgICBpZiAoIXRoaXMucm91dGluZ0NvbmZpZ3VyZWQoKSkgdGhyb3cgbmV3IEVycm9yKGBObyBzeW5jIGFwcGx5IGhhbmRsZXIgcmVnaXN0ZXJlZCBmb3I6ICR7YXJncy5tdXRhdGlvbi5yZXNvdXJjZVR5cGV9YClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yb3V0aW5nQ29uZmlndXJlZCgpKSByZXR1cm4gYXdhaXQgdGhpcy5hcHBseVJvdXRlZFJlcGxheU11dGF0aW9uKGFyZ3MpXG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciByZXNvdXJjZSByb3V0aW5nIGlzIGNvbmZpZ3VyZWQgb24gdGhpcyBzZXJ2aWNlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBtdXRhdGlvbnMgcm91dGUgdG8gZnJvbnRlbmQtbW9kZWwgcmVzb3VyY2VzLlxuICAgKi9cbiAgcm91dGluZ0NvbmZpZ3VyZWQoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5jb25maWd1cmF0aW9uIHx8IHRoaXMucmVzb3VyY2VUeXBlT3ZlcnJpZGVzKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSByb3V0ZWQgcmVzb3VyY2UgcmVnaXN0cmF0aW9uIGZvciBhIHJlc291cmNlIHR5cGUsIG1lbW9pemVkXG4gICAqIHBlciByZXBsYXkgc2VydmljZS4gT3ZlcnJpZGVzIHdpbiBvdmVyIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdHJ5OyBzdHJpbmdcbiAgICogb3ZlcnJpZGVzIGFyZSBhbGlhc2VzIHJlc29sdmVkIHRocm91Z2ggdGhlIHJlZ2lzdHJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzb3VyY2VUeXBlIC0gTXV0YXRpb24gcmVzb3VyY2UgdHlwZS5cbiAgICogQHJldHVybnMge1N5bmNSZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbiB8IG51bGx9IFJlc29sdmVkIHJlZ2lzdHJhdGlvbiBvciBudWxsIHdoZW4gdW5yb3V0YWJsZS5cbiAgICovXG4gIHJlcGxheVJlc291cmNlUmVnaXN0cmF0aW9uKHJlc291cmNlVHlwZSkge1xuICAgIGNvbnN0IG1lbW9pemVkUmVnaXN0cmF0aW9uID0gdGhpcy5fcmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb25zLmdldChyZXNvdXJjZVR5cGUpXG5cbiAgICBpZiAobWVtb2l6ZWRSZWdpc3RyYXRpb24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIG1lbW9pemVkUmVnaXN0cmF0aW9uXG5cbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnJlc29sdmVSZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbihyZXNvdXJjZVR5cGUpXG5cbiAgICB0aGlzLl9yZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbnMuc2V0KHJlc291cmNlVHlwZSwgcmVnaXN0cmF0aW9uKVxuXG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIFVuY2FjaGVkIHJvdXRlZC1yZXNvdXJjZSByZXNvbHV0aW9uIGJlaGluZCB7QGxpbmsgU3luY0VudmVsb3BlUmVwbGF5U2VydmljZSNyZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbn0uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNvdXJjZVR5cGUgLSBNdXRhdGlvbiByZXNvdXJjZSB0eXBlLlxuICAgKiBAcmV0dXJucyB7U3luY1JlcGxheVJlc291cmNlUmVnaXN0cmF0aW9uIHwgbnVsbH0gUmVzb2x2ZWQgcmVnaXN0cmF0aW9uIG9yIG51bGwgd2hlbiB1bnJvdXRhYmxlLlxuICAgKi9cbiAgcmVzb2x2ZVJlcGxheVJlc291cmNlUmVnaXN0cmF0aW9uKHJlc291cmNlVHlwZSkge1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5yZXNvdXJjZVR5cGVPdmVycmlkZXM/LltyZXNvdXJjZVR5cGVdXG5cbiAgICBpZiAob3ZlcnJpZGUgJiYgdHlwZW9mIG92ZXJyaWRlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4ge21vZGVsTmFtZTogcmVzb3VyY2VUeXBlLCByZXNvdXJjZUNsYXNzOiBvdmVycmlkZSwgcmVzb3VyY2VDb25maWd1cmF0aW9uOiBudWxsfVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdHJ5UmVzb3VyY2VUeXBlID0gdHlwZW9mIG92ZXJyaWRlID09PSBcInN0cmluZ1wiID8gb3ZlcnJpZGUgOiByZXNvdXJjZVR5cGVcblxuICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgcmVzb2x2ZWRSZWdpc3RyYXRpb24gPSByZXNvbHZlRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3Moe2NvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbiwgcmVzb3VyY2VUeXBlOiByZWdpc3RyeVJlc291cmNlVHlwZX0pXG5cbiAgICBpZiAoIXJlc29sdmVkUmVnaXN0cmF0aW9uKSByZXR1cm4gbnVsbFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGVsTmFtZTogcmVzb2x2ZWRSZWdpc3RyYXRpb24ubW9kZWxOYW1lLFxuICAgICAgcmVzb3VyY2VDbGFzczogcmVzb2x2ZWRSZWdpc3RyYXRpb24ucmVzb3VyY2VDbGFzcyxcbiAgICAgIHJlc291cmNlQ29uZmlndXJhdGlvbjogcmVzb2x2ZWRSZWdpc3RyYXRpb24ucmVzb3VyY2VDb25maWd1cmF0aW9uXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgcm91dGVkIHJlc291cmNlIGluc3RhbmNlIGhhbmRsaW5nIG9uZSBtdXRhdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBOb3JtYWxpemVkIHJlcGxheSBtdXRhdGlvbi5cbiAgICogQHBhcmFtIHtTeW5jUmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb259IGFyZ3MucmVnaXN0cmF0aW9uIC0gUmVzb2x2ZWQgcmVzb3VyY2UgcmVnaXN0cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0fSBSb3V0ZWQgcmVzb3VyY2UgaW5zdGFuY2UuXG4gICAqL1xuICBidWlsZFJlcGxheVJlc291cmNlKHttdXRhdGlvbiwgcmVnaXN0cmF0aW9ufSkge1xuICAgIGNvbnN0IFJlc291cmNlQ2xhc3MgPSByZWdpc3RyYXRpb24ucmVzb3VyY2VDbGFzc1xuXG4gICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNsYXNzKHtcbiAgICAgIGFiaWxpdHk6IHRoaXMuYWJpbGl0eSB8fCB1bmRlZmluZWQsXG4gICAgICBjb250ZXh0OiB0aGlzLmFiaWxpdHlDb250ZXh0IHx8IHt9LFxuICAgICAgbG9jYWxzOiB0aGlzLmxvY2FscyB8fCB7fSxcbiAgICAgIG1vZGVsTmFtZTogcmVnaXN0cmF0aW9uLm1vZGVsTmFtZSxcbiAgICAgIHBhcmFtczogbXV0YXRpb24uZGF0YSxcbiAgICAgIC4uLihyZWdpc3RyYXRpb24ucmVzb3VyY2VDb25maWd1cmF0aW9uID8ge3Jlc291cmNlQ29uZmlndXJhdGlvbjogcmVnaXN0cmF0aW9uLnJlc291cmNlQ29uZmlndXJhdGlvbn0gOiB7fSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgb25lIG11dGF0aW9uIHRocm91Z2ggaXRzIHJvdXRlZCBmcm9udGVuZC1tb2RlbCByZXNvdXJjZTpcbiAgICogYXV0aG9yaXphdGlvbiwgYWJpbGl0eS1zY29wZWQgcmVjb3JkIGxvb2t1cCwgc2NoZW1hIG5vcm1hbGl6YXRpb24gYW5kXG4gICAqIGFzc2lnbi9zYXZlIGZvciB1cGRhdGVzLCBzYXZlLXRoZW4tY2hlY2sgbWVtYmVyc2hpcCBjcmVhdGVzLCBkZXN0cm95cyBmb3JcbiAgICogZGVsZXRlcywgYW5kIHRoZSByZXNvdXJjZSdzIGFmdGVyU3luY0FwcGx5IHRhaWwuIENsaWVudC1zYWZlIGZhaWx1cmVzXG4gICAqIHRocm93IHNhZmUgZXJyb3JzIHRoYXQgZmFpbCB0aGUgc2luZ2xlIHN5bmMuXG4gICAqIEBwYXJhbSB7e2FjdG9yOiA/LCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCA/PiwgZXhpc3RpbmdTeW5jOiA/LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IGFyZ3MgLSBBY3RvciwgYmF0Y2ggY29udGV4dCwgZXhpc3Rpbmcgc3luYyByb3csIGFuZCBtdXRhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fSBBcHBseSByZXN1bHQgd2l0aCByZWNvcmQsIGNyZWF0ZWQvZGVsZXRlZCBmbGFncywgYW5kIGFmdGVyU3luY0FwcGx5IGV4dHJhcy5cbiAgICovXG4gIGFzeW5jIGFwcGx5Um91dGVkUmVwbGF5TXV0YXRpb24oe2NvbnRleHQsIGV4aXN0aW5nU3luYywgbXV0YXRpb259KSB7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5yZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbihtdXRhdGlvbi5yZXNvdXJjZVR5cGUpXG5cbiAgICBpZiAoIXJlZ2lzdHJhdGlvbikge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShgVW5rbm93biBzeW5jIHJlc291cmNlIHR5cGU6ICR7bXV0YXRpb24ucmVzb3VyY2VUeXBlfS5gLCB7Y29kZTogXCJ1bmtub3duLXJlc291cmNlLXR5cGVcIn0pXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLmJ1aWxkUmVwbGF5UmVzb3VyY2Uoe211dGF0aW9uLCByZWdpc3RyYXRpb259KVxuICAgIGNvbnN0IGN1c3RvbUFwcGx5UmVzdWx0ID0gYXdhaXQgcmVzb3VyY2UuYXBwbHlTeW5jKHtjb250ZXh0LCBleGlzdGluZ1N5bmMsIG11dGF0aW9ufSlcblxuICAgIGlmIChjdXN0b21BcHBseVJlc3VsdCAhPT0gbnVsbCkgcmV0dXJuIGN1c3RvbUFwcGx5UmVzdWx0XG5cbiAgICBjb25zdCBhdXRob3JpemF0aW9uID0gYXdhaXQgcmVzb3VyY2UuYXV0aG9yaXplU3luY011dGF0aW9uKHtjb250ZXh0LCBtdXRhdGlvbn0pXG5cbiAgICBpZiAoIWF1dGhvcml6YXRpb24uYWxsb3dlZCkge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShgU3luYyBtdXRhdGlvbiBkZW5pZWQgZm9yOiAke211dGF0aW9uLnJlc291cmNlVHlwZX0uYCwge2NvZGU6IGF1dGhvcml6YXRpb24ucmVhc29uIHx8IFwiYWNjZXNzLWRlbmllZFwifSlcbiAgICB9XG5cbiAgICBpZiAobXV0YXRpb24uc3luY1R5cGUgPT09IFwiZGVsZXRlXCIpIHJldHVybiBhd2FpdCB0aGlzLmFwcGx5Um91dGVkUmVwbGF5RGVsZXRlKHttdXRhdGlvbiwgcmVzb3VyY2V9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBwbHlSb3V0ZWRSZXBsYXlVcHNlcnQoe2NvbnRleHQsIG11dGF0aW9uLCByZXNvdXJjZX0pXG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBhIHJvdXRlZCBkZWxldGUgbXV0YXRpb24uIFRoZSByZWNvcmQgaXMgbWFya2VkIGFzIGEgc2VydmVyIGFwcGx5XG4gICAqIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHJlcGxheS1vd25lZCBkZXN0cm95IC0gYW4gYWN0aXZlIFN5bmNQdWJsaXNoZXJcbiAgICogbmV2ZXIgcHVibGlzaGVzIHRoZSByZXBsYXllZCBkZWxldGUgYSBzZWNvbmQgdGltZSAodGhlIHJlcGxheSBvd25zIGl0c1xuICAgKiBvd24gcGVyc2lzdCBhbmQgYnJvYWRjYXN0cyksIHdoaWxlIGxhdGVyIHNlcnZlci1zaWRlIHdyaXRlcyB0byB0aGUgc2FtZVxuICAgKiBpbnN0YW5jZSBwdWJsaXNoIG5vcm1hbGx5IGFnYWluLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE5vcm1hbGl6ZWQgcmVwbGF5IG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdH0gYXJncy5yZXNvdXJjZSAtIFJvdXRlZCByZXNvdXJjZSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fSBBcHBseSByZXN1bHQgd2l0aCB0aGUgZGVsZXRlZCBmbGFnLlxuICAgKi9cbiAgYXN5bmMgYXBwbHlSb3V0ZWRSZXBsYXlEZWxldGUoe211dGF0aW9uLCByZXNvdXJjZX0pIHtcbiAgICBjb25zdCByZWNvcmQgPSBhd2FpdCByZXNvdXJjZS5maW5kU3luY1JlY29yZCh7Zm9yRGVsZXRlOiB0cnVlLCBtdXRhdGlvbn0pXG5cbiAgICBpZiAoIXJlY29yZCkgcmV0dXJuIHtjcmVhdGVkOiBmYWxzZSwgZGVsZXRlZDogZmFsc2UsIHJlY29yZDogbnVsbH1cblxuICAgIGNvbnN0IHJlbGVhc2VTZXJ2ZXJBcHBseSA9IG1hcmtTZXJ2ZXJBcHBseShyZWNvcmQpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmVjb3JkLmRlc3Ryb3koKVxuICAgIH0gZmluYWxseSB7XG4gICAgICByZWxlYXNlU2VydmVyQXBwbHkoKVxuICAgIH1cblxuICAgIHJldHVybiB7Y3JlYXRlZDogZmFsc2UsIGRlbGV0ZWQ6IHRydWUsIHJlY29yZH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgcm91dGVkIHVwc2VydCBtdXRhdGlvbjogcGVybWl0dGVkIHBheWxvYWQgYXR0cmlidXRlcyBhcmVcbiAgICogYXNzaWduZWQgYW5kIHNhdmVkIG9udG8gdGhlIGZvdW5kIHJlY29yZCAodGhlIHJlY29yZCBsYXllciBvd25zIHZhbHVlXG4gICAqIGNhc3RpbmcgYW5kIHZhbGlkYXRpb24pLCBhbmQgbWlzc2luZyByZWNvcmRzIGFyZSBjcmVhdGVkIHdpdGggdGhlXG4gICAqIGNsaWVudC1nZW5lcmF0ZWQgcHJpbWFyeSBrZXkgcGx1cyBhIHNhdmUtdGhlbi1jaGVjayBtZW1iZXJzaGlwIGNoZWNrLlxuICAgKiBXcml0dGVuIHJlY29yZHMgYXJlIG1hcmtlZCBhcyBzZXJ2ZXIgYXBwbGllcyBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZVxuICAgKiByZXBsYXktb3duZWQgd3JpdGUgLSBhbiBhY3RpdmUgU3luY1B1Ymxpc2hlciBuZXZlciBwdWJsaXNoZXMgdGhlIHJlcGxheWVkXG4gICAqIG11dGF0aW9uIGEgc2Vjb25kIHRpbWUgKHRoZSByZXBsYXkgb3ducyBpdHMgb3duIHBlcnNpc3QgYW5kIGJyb2FkY2FzdHMpLFxuICAgKiB3aGlsZSBsYXRlciBzZXJ2ZXItc2lkZSB3cml0ZXMgdG8gdGhlIHNhbWUgaW5zdGFuY2UgcHVibGlzaCBub3JtYWxseVxuICAgKiBhZ2Fpbi4gTW9kZWwgdmFsaWRhdGlvbiBmYWlsdXJlcyBiZWNvbWUgY2xpZW50LXNhZmUgcGVyLXN5bmMgZmFpbHVyZXNcbiAgICogY2FycnlpbmcgdGhlIHRyYW5zbGF0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IGFyZ3MuY29udGV4dCAtIFJlcGxheSBjb250ZXh0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBOb3JtYWxpemVkIHJlcGxheSBtdXRhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVzb3VyY2UgLSBSb3V0ZWQgcmVzb3VyY2UgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsID8+Pn0gQXBwbHkgcmVzdWx0IHdpdGggcmVjb3JkLCBjcmVhdGVkIGZsYWcsIGFuZCBhZnRlclN5bmNBcHBseSBleHRyYXMuXG4gICAqL1xuICBhc3luYyBhcHBseVJvdXRlZFJlcGxheVVwc2VydCh7Y29udGV4dCwgbXV0YXRpb24sIHJlc291cmNlfSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLnBlcm1pdHRlZFJvdXRlZEF0dHJpYnV0ZXMoe211dGF0aW9uLCByZXNvdXJjZX0pXG4gICAgY29uc3QgZXhpc3RpbmdSZWNvcmQgPSBhd2FpdCByZXNvdXJjZS5maW5kU3luY1JlY29yZCh7bXV0YXRpb259KVxuXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IG51bGx9ICovXG4gICAgbGV0IHJlY29yZCA9IGV4aXN0aW5nUmVjb3JkXG4gICAgbGV0IGNyZWF0ZWQgPSBmYWxzZVxuXG4gICAgaWYgKGV4aXN0aW5nUmVjb3JkKSB7XG4gICAgICBjb25zdCByZWxlYXNlU2VydmVyQXBwbHkgPSBtYXJrU2VydmVyQXBwbHkoZXhpc3RpbmdSZWNvcmQpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGV4aXN0aW5nUmVjb3JkLmFzc2lnbihhdHRyaWJ1dGVzKVxuICAgICAgICBhd2FpdCB0aGlzLnNhdmVSb3V0ZWRSZXBsYXlSZWNvcmQoZXhpc3RpbmdSZWNvcmQpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWxlYXNlU2VydmVyQXBwbHkoKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmNyZWF0ZVJvdXRlZFJlcGxheVJlY29yZCh7YXR0cmlidXRlcywgbXV0YXRpb24sIHJlc291cmNlfSlcbiAgICAgIGNyZWF0ZWQgPSB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgZXh0cmFzID0gYXdhaXQgcmVzb3VyY2UuYWZ0ZXJTeW5jQXBwbHkoe2NvbnRleHQsIGNyZWF0ZWQsIG11dGF0aW9uLCByZWNvcmR9KVxuXG4gICAgcmV0dXJuIHtjcmVhdGVkLCBkZWxldGVkOiBmYWxzZSwgcmVjb3JkLCAuLi5leHRyYXN9XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhIHJvdXRlZCBtdXRhdGlvbiBwYXlsb2FkIGRvd24gdG8gdGhlIHJlc291cmNlJ3MgZGVjbGFyZWRcbiAgICogd3JpdGFibGUtYXR0cmlidXRlIHBlcm1pdCBsaXN0LiBBY2NlcHRlZCBrZXlzIHBlciBwZXJtaXR0ZWQgYXR0cmlidXRlIGFyZVxuICAgKiB0aGUgY2FtZWxDYXNlIGF0dHJpYnV0ZSBuYW1lIHBsdXMgdGhlIG1vZGVsJ3MgYWN0dWFsIGNvbHVtbiBuYW1lOyB1bmtub3duXG4gICAqIGtleXMgZmFpbCB0aGUgc3luYyBsb3VkbHkuIFRoZSBwcmltYXJ5IGtleSBpcyBkcm9wcGVkIHdoZW4gcGVybWl0dGVkXG4gICAqIChzbmFwc2hvdCBwYXlsb2Fkcykg4oCUIHRoZSBlbnZlbG9wZSdzIHJlc291cmNlSWQgaXMgdGhlIGF1dGhvcml0YXRpdmVcbiAgICogcmVjb3JkIGlkZW50aXR5LCBzbyBhIHBheWxvYWQgaWQgY2FuIG5ldmVyIHJldGFyZ2V0IHRoZSByb3cuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gTm9ybWFsaXplZCByZXBsYXkgbXV0YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc291cmNlIC0gUm91dGVkIHJlc291cmNlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgPz59IFBlcm1pdHRlZCBhdHRyaWJ1dGVzIGZvciByZWNvcmQuYXNzaWduLlxuICAgKi9cbiAgcGVybWl0dGVkUm91dGVkQXR0cmlidXRlcyh7bXV0YXRpb24sIHJlc291cmNlfSkge1xuICAgIGNvbnN0IHBlcm1pdHRlZEF0dHJpYnV0ZXMgPSByZXNvdXJjZS5kZWNsYXJlZFdyaXRhYmxlQXR0cmlidXRlcygpXG5cbiAgICBpZiAoIXBlcm1pdHRlZEF0dHJpYnV0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtyZXNvdXJjZS5jb25zdHJ1Y3Rvci5uYW1lfSBtdXN0IGRlY2xhcmUgc3RhdGljIHdyaXRhYmxlQXR0cmlidXRlcyB0byBhcHBseSByb3V0ZWQgc3luYyBtdXRhdGlvbnMgZm9yOiAke211dGF0aW9uLnJlc291cmNlVHlwZX1gKVxuICAgIH1cblxuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSByZXNvdXJjZS5tb2RlbENsYXNzKClcbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lID0gTW9kZWxDbGFzcy5nZXRBdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lTWFwKClcblxuICAgIC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3QgYWxsb3dlZEtleXMgPSBuZXcgU2V0KClcblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBwZXJtaXR0ZWRBdHRyaWJ1dGVzKSB7XG4gICAgICBhbGxvd2VkS2V5cy5hZGQoYXR0cmlidXRlTmFtZSlcblxuICAgICAgY29uc3QgY29sdW1uTmFtZSA9IGF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVbYXR0cmlidXRlTmFtZV1cblxuICAgICAgaWYgKGNvbHVtbk5hbWUpIGFsbG93ZWRLZXlzLmFkZChjb2x1bW5OYW1lKVxuICAgIH1cblxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBNb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuICAgIGNvbnN0IHByaW1hcnlLZXlBdHRyaWJ1dGUgPSBNb2RlbENsYXNzLmdldENvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVNYXAoKVtwcmltYXJ5S2V5XVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0ge31cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG11dGF0aW9uLmRhdGEpKSB7XG4gICAgICBpZiAoIWFsbG93ZWRLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgIHRocm93IHJlc291cmNlLndyaXRhYmxlQXR0cmlidXRlRXJyb3IoYFVua25vd24gYXR0cmlidXRlOiAke2tleX0uYCwge2NvZGU6IFwic3luYy11bmtub3duLWF0dHJpYnV0ZVwifSlcbiAgICAgIH1cblxuICAgICAgaWYgKGtleSA9PT0gcHJpbWFyeUtleSB8fCBrZXkgPT09IHByaW1hcnlLZXlBdHRyaWJ1dGUpIGNvbnRpbnVlXG5cbiAgICAgIGF0dHJpYnV0ZXNba2V5XSA9IHZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSByb3V0ZWQgcmVjb3JkIHdpdGggdGhlIGNsaWVudC1nZW5lcmF0ZWQgcHJpbWFyeSBrZXkgKG1hcmtlZFxuICAgKiBhcyBhIHNlcnZlciBhcHBseSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjcmVhdGUgLSBpbmNsdWRpbmcgdGhlXG4gICAqIG1lbWJlcnNoaXAtY2hlY2sgY29tcGVuc2F0aW9uIGRlc3Ryb3kgLSBzbyBhbiBhY3RpdmUgU3luY1B1Ymxpc2hlciBuZXZlclxuICAgKiBwdWJsaXNoZXMgdGhlIHJlcGxheWVkIGNyZWF0ZSBhIHNlY29uZCB0aW1lKSwgdGhlblxuICAgKiB2ZXJpZmllcyBjcmVhdGUtc2NvcGUgbWVtYmVyc2hpcCB3aGVuIGFuIGFiaWxpdHkgaXMgY29uZmlndXJlZDogcmVjb3Jkc1xuICAgKiBvdXRzaWRlIHRoZSBhYmlsaXR5J3MgY3JlYXRlIHNjb3BlIGFyZSBkZXN0cm95ZWQgYWdhaW4gYW5kIGZhaWwgdGhlIHN5bmNcbiAgICogd2l0aCB0aGUgcmVzb3VyY2UtZGVjbGFyZWQgcmVhc29uLiBBIHJlY29yZCB0aGF0IGFscmVhZHkgZXhpc3RzIG91dHNpZGVcbiAgICogdGhlIHJlc291cmNlJ3MgbG9va3VwIHNjb3BlIGZhaWxzIHRoZSBzeW5jIGFzIGFuIGF1dGhvcml6YXRpb24gZGVuaWFsXG4gICAqIGluc3RlYWQgb2YgY29sbGlkaW5nIG9uIHRoZSBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBhcmdzLmF0dHJpYnV0ZXMgLSBQZXJtaXR0ZWQgcGF5bG9hZCBhdHRyaWJ1dGVzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBOb3JtYWxpemVkIHJlcGxheSBtdXRhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVzb3VyY2UgLSBSb3V0ZWQgcmVzb3VyY2UgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0Pn0gQ3JlYXRlZCByZWNvcmQuXG4gICAqL1xuICBhc3luYyBjcmVhdGVSb3V0ZWRSZXBsYXlSZWNvcmQoe2F0dHJpYnV0ZXMsIG11dGF0aW9uLCByZXNvdXJjZX0pIHtcbiAgICBjb25zdCBNb2RlbENsYXNzID0gcmVzb3VyY2UubW9kZWxDbGFzcygpXG4gICAgY29uc3QgcHJpbWFyeUtleSA9IE1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG4gICAgY29uc3QgY29uZmxpY3RpbmdJZHMgPSBhd2FpdCBNb2RlbENsYXNzLndoZXJlKHtbcHJpbWFyeUtleV06IG11dGF0aW9uLnJlc291cmNlSWR9KS5wbHVjayhwcmltYXJ5S2V5KVxuXG4gICAgaWYgKGNvbmZsaWN0aW5nSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoYFN5bmMgdXBkYXRlIGRlbmllZCBmb3I6ICR7bXV0YXRpb24ucmVzb3VyY2VUeXBlfS5gLCB7XG4gICAgICAgIGNvZGU6IHJlc291cmNlLnN5bmNBdXRob3JpemF0aW9uRmFpbHVyZVJlYXNvbih7YWN0aW9uOiBcInVwZGF0ZVwiLCBtdXRhdGlvbn0pIHx8IFwiYWNjZXNzLWRlbmllZFwiXG4gICAgICB9KVxuICAgIH1cblxuICAgIGF3YWl0IE1vZGVsQ2xhc3MuZW5zdXJlSW5pdGlhbGl6ZWQoKVxuXG4gICAgY29uc3QgcmVjb3JkID0gbmV3IE1vZGVsQ2xhc3Moe1twcmltYXJ5S2V5XTogbXV0YXRpb24ucmVzb3VyY2VJZCwgLi4uYXR0cmlidXRlc30pXG4gICAgY29uc3QgcmVsZWFzZVNlcnZlckFwcGx5ID0gbWFya1NlcnZlckFwcGx5KHJlY29yZClcblxuICAgIHRyeSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCByZWNvcmQuc2F2ZSgpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyB0aGlzLnJvdXRlZFJlcGxheVNhdmVFcnJvcihlcnJvcilcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWJpbGl0eSA9IHJlc291cmNlLmFiaWxpdHlcblxuICAgICAgaWYgKGFiaWxpdHkpIHtcbiAgICAgICAgY29uc3QgbWVtYmVySWRzID0gYXdhaXQgTW9kZWxDbGFzc1xuICAgICAgICAgIC5hY2Nlc3NpYmxlRm9yKHJlc291cmNlLnN5bmNBYmlsaXR5QWN0aW9uKFwiY3JlYXRlXCIpLCBhYmlsaXR5KVxuICAgICAgICAgIC53aGVyZSh7W3ByaW1hcnlLZXldOiByZWNvcmQuaWQoKX0pXG4gICAgICAgICAgLnBsdWNrKHByaW1hcnlLZXkpXG5cbiAgICAgICAgaWYgKG1lbWJlcklkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBhd2FpdCByZWNvcmQuZGVzdHJveSgpXG5cbiAgICAgICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKGBTeW5jIGNyZWF0ZSBkZW5pZWQgZm9yOiAke211dGF0aW9uLnJlc291cmNlVHlwZX0uYCwge1xuICAgICAgICAgICAgY29kZTogcmVzb3VyY2Uuc3luY0F1dGhvcml6YXRpb25GYWlsdXJlUmVhc29uKHthY3Rpb246IFwiY3JlYXRlXCIsIG11dGF0aW9ufSkgfHwgXCJhY2Nlc3MtZGVuaWVkXCJcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWNvcmRcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVsZWFzZVNlcnZlckFwcGx5KClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgYSByb3V0ZWQgcmVjb3JkLCBjb252ZXJ0aW5nIG1vZGVsIHZhbGlkYXRpb24gZmFpbHVyZXMgaW50b1xuICAgKiBjbGllbnQtc2FmZSBwZXItc3luYyBlcnJvcnMgY2FycnlpbmcgdGhlIHRyYW5zbGF0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSByZWNvcmQgLSBSZWNvcmQgdG8gc2F2ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHdoZW4gc2F2ZWQuXG4gICAqL1xuICBhc3luYyBzYXZlUm91dGVkUmVwbGF5UmVjb3JkKHJlY29yZCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZWNvcmQuc2F2ZSgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IHRoaXMucm91dGVkUmVwbGF5U2F2ZUVycm9yKGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIGEgcm91dGVkIHNhdmUvY3JlYXRlIGZhaWx1cmU6IG1vZGVsIHZhbGlkYXRpb24gZXJyb3JzIGJlY29tZVxuICAgKiBjbGllbnQtc2FmZSBlcnJvcnMgd2l0aCB0aGVpciB0cmFuc2xhdGVkIG1lc3NhZ2VzLCBldmVyeXRoaW5nIGVsc2VcbiAgICogcHJvcGFnYXRlcyB1bmNoYW5nZWQuXG4gICAqIEBwYXJhbSB7P30gZXJyb3IgLSBUaHJvd24gc2F2ZS9jcmVhdGUgZXJyb3IuXG4gICAqIEByZXR1cm5zIHtFcnJvcn0gRXJyb3IgdG8gcmV0aHJvdy5cbiAgICovXG4gIHJvdXRlZFJlcGxheVNhdmVFcnJvcihlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFZhbGlkYXRpb25FcnJvcikge1xuICAgICAgcmV0dXJuIFZlbG9jaW91c0Vycm9yLnNhZmUoZXJyb3IubWVzc2FnZSwge2NhdXNlOiBlcnJvciwgY29kZTogXCJ2YWxpZGF0aW9uLWVycm9yXCJ9KVxuICAgIH1cblxuICAgIHJldHVybiAvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW4gYXBwbHkgcmVzdWx0IGZvciBzdGFsZSBtdXRhdGlvbnMgdGhhdCBzaG91bGQgbm90IHRvdWNoIGRvbWFpbiBtb2RlbHMuXG4gICAqIEBwYXJhbSB7e2FjdG9yOiA/LCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCA/PiwgZXhpc3RpbmdTeW5jOiA/LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IF9hcmdzIC0gQWN0b3IsIGJhdGNoIGNvbnRleHQsIGV4aXN0aW5nIHN5bmMgcm93LCBhbmQgbXV0YXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPD8+fSBQcm9qZWN0LXNwZWNpZmljIGFwcGx5IHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHNraXBwZWRSZXBsYXlNdXRhdGlvbihfYXJncykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUGVyc2lzdHMgb25lIG5vcm1hbGl6ZWQgbXV0YXRpb24gaW50byB0aGUgYXBwIHN5bmMvY2hhbmdlIHN0b3JlLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBhIHN0YWxlLWd1YXJkZWQgc3luYy1tb2RlbCB1cHNlcnQgKHdpdGggc2VydmVyIHJlLXNlcXVlbmNpbmcgb25cbiAgICogdXBkYXRlcykgd2hlbiBhIHN5bmMgbW9kZWwgaXMgY29uZmlndXJlZDsgb3RoZXJ3aXNlIGFwcHMgb3ZlcnJpZGUgdGhpcyBob29rLlxuICAgKiBAcGFyYW0ge3thY3RvcjogPywgY29udGV4dDogUmVjb3JkPHN0cmluZywgPz4sIGV4aXN0aW5nU3luYzogPywgYXBwbHlSZXN1bHQ6ID8sIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9uLCBzaG91bGRBcHBseTogYm9vbGVhbn19IGFyZ3MgLSBSZXBsYXkgcGVyc2lzdGVuY2UgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHBlcnNpc3RSZXBsYXlNdXRhdGlvbih7YWN0b3IsIGFwcGx5UmVzdWx0LCBjb250ZXh0LCBleGlzdGluZ1N5bmMsIG11dGF0aW9uLCBzaG91bGRBcHBseX0pIHtcbiAgICBpZiAoIXRoaXMuc3luY01vZGVsKSByZXR1cm5cblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLnJlcGxheVBlcnNpc3RBdHRyaWJ1dGVzKHthY3RvciwgbXV0YXRpb259KVxuXG4gICAgLy8gU3RhbGUgcmVwbGF5cyBuZXZlciBhcHBsaWVkIGFueXRoaW5nLCBzbyB0aGUgYXBwbHlSZXN1bHQtZHJpdmVuIGV4dGVuc2lvblxuICAgIC8vIGhvb2tzIG11c3Qgbm90IHJ1biBhZ2FpbnN0IHRoZSBkZWZhdWx0IG51bGwgc2tpcHBlZCByZXN1bHQuXG4gICAgaWYgKHRoaXMucGVyc2lzdEV4dHJhQXR0cmlidXRlcyAmJiBzaG91bGRBcHBseSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihhdHRyaWJ1dGVzLCB0aGlzLnBlcnNpc3RFeHRyYUF0dHJpYnV0ZXMoe2FjdG9yLCBhcHBseVJlc3VsdCwgY29udGV4dCwgZXhpc3RpbmdTeW5jLCBtdXRhdGlvbiwgc2hvdWxkQXBwbHl9KSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wZXJzaXN0U2VyaWFsaXplZERhdGEgJiYgc2hvdWxkQXBwbHkpIHtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWREYXRhID0gdGhpcy5wZXJzaXN0U2VyaWFsaXplZERhdGEoe2FwcGx5UmVzdWx0LCBtdXRhdGlvbn0pXG5cbiAgICAgIGlmIChzZXJpYWxpemVkRGF0YSAhPT0gdW5kZWZpbmVkICYmIHNlcmlhbGl6ZWREYXRhICE9PSBudWxsKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMuZGF0YSA9IHR5cGVvZiBzZXJpYWxpemVkRGF0YSA9PT0gXCJzdHJpbmdcIiA/IHNlcmlhbGl6ZWREYXRhIDogSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZERhdGEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4aXN0aW5nU3luYykge1xuICAgICAgY29uc3QgZXhpc3RpbmdDbGllbnRVcGRhdGVkQXQgPSB0aGlzLmV4aXN0aW5nUmVwbGF5U3luY0NsaWVudFVwZGF0ZWRBdChleGlzdGluZ1N5bmMpXG5cbiAgICAgIGlmIChleGlzdGluZ0NsaWVudFVwZGF0ZWRBdCAmJiBtdXRhdGlvbi5jbGllbnRVcGRhdGVkQXQgPD0gZXhpc3RpbmdDbGllbnRVcGRhdGVkQXQpIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHVwc2VydFN5bmNSb3coe2F0dHJpYnV0ZXMsIGV4aXN0aW5nU3luYywgc3luY01vZGVsOiB0aGlzLnN5bmNNb2RlbH0pXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBzeW5jLW1vZGVsIGF0dHJpYnV0ZXMgcGVyc2lzdGVkIGJ5IHRoZSBtb2RlbC1iYWNrZWQgZGVmYXVsdC5cbiAgICogQHBhcmFtIHt7YWN0b3I6ID8sIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufX0gYXJncyAtIEFjdG9yIGFuZCBtdXRhdGlvbi5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+fSBTeW5jIHJvdyBhdHRyaWJ1dGVzLlxuICAgKi9cbiAgcmVwbGF5UGVyc2lzdEF0dHJpYnV0ZXMoe2FjdG9yLCBtdXRhdGlvbn0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgW3RoaXMuYWN0b3JGb3JlaWduS2V5Q29sdW1uXTogdGhpcy5yZXBsYXlBY3RvcklkKGFjdG9yKSxcbiAgICAgIGNsaWVudF91cGRhdGVkX2F0OiBtdXRhdGlvbi5jbGllbnRVcGRhdGVkQXQsXG4gICAgICBkYXRhOiBtdXRhdGlvbi5zZXJpYWxpemVkRGF0YSxcbiAgICAgIHJlc291cmNlX2lkOiBtdXRhdGlvbi5yZXNvdXJjZUlkLFxuICAgICAgcmVzb3VyY2VfdHlwZTogbXV0YXRpb24ucmVzb3VyY2VUeXBlLFxuICAgICAgc3luY190eXBlOiBtdXRhdGlvbi5zeW5jVHlwZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNpZGUgZWZmZWN0cyBhZnRlciBhIHN1Y2Nlc3NmdWwgbXV0YXRpb24gcmVwbGF5IGFuZCBwZXJzaXN0ZW5jZS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gZmFubmluZyB0aGUgYXBwbGllZCByZXN1bHQgb3V0IHRocm91Z2ggdGhlIGNvbmZpZ3VyZWRcbiAgICogZGVjbGFyYXRpdmUgYnJvYWRjYXN0cy5cbiAgICogQHBhcmFtIHt7YWN0b3I6ID8sIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsID8+LCBleGlzdGluZ1N5bmM6ID8sIGFwcGx5UmVzdWx0OiA/LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbiwgc2hvdWxkQXBwbHk6IGJvb2xlYW59fSBhcmdzIC0gUmVwbGF5IHNpZGUtZWZmZWN0IGFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBhZnRlclJlcGxheU11dGF0aW9uKGFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuYnJvYWRjYXN0cyB8fCAhdGhpcy5icm9hZGNhc3RlcikgcmV0dXJuXG4gICAgLy8gU3RhbGUgcmVwbGF5cyBuZXZlciBhcHBsaWVkIGFueXRoaW5nIC0gYnJvYWRjYXN0aW5nIHRoZWlyIHNraXBwZWQgcmVzdWx0c1xuICAgIC8vIHdvdWxkIGZhbiBvdXQgc3RhbGUgc2lkZSBlZmZlY3RzIChvciBjcmFzaCBvbiB0aGUgZGVmYXVsdCBudWxsIGFwcGx5UmVzdWx0KS5cbiAgICBpZiAoIWFyZ3Muc2hvdWxkQXBwbHkpIHJldHVyblxuXG4gICAgYXdhaXQgZGVsaXZlckRlY2xhcmVkQnJvYWRjYXN0cyh7YXJncywgYnJvYWRjYXN0ZXI6IHRoaXMuYnJvYWRjYXN0ZXIsIGJyb2FkY2FzdHM6IHRoaXMuYnJvYWRjYXN0c30pXG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlZCByb3V0ZWQtcmVzb3VyY2UgcmVnaXN0cmF0aW9uIGZvciBvbmUgcmVwbGF5IHJlc291cmNlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jUmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2RlbE5hbWUgLSBFZmZlY3RpdmUgZnJvbnRlbmQgbW9kZWwgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9IHJlc291cmNlQ2xhc3MgLSBSb3V0ZWQgcmVzb3VyY2UgY2xhc3MuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb24gfCBudWxsfSByZXNvdXJjZUNvbmZpZ3VyYXRpb24gLSBOb3JtYWxpemVkIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gd2hlbiByZWdpc3RyeS1yZXNvbHZlZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNSZXBsYXlNdXRhdGlvblxuICogQHByb3BlcnR5IHtEYXRlfSBjbGllbnRVcGRhdGVkQXQgLSBDbGllbnQtc2lkZSBtdXRhdGlvbiB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsID8+fSBkYXRhIC0gUGFyc2VkIG11dGF0aW9uIHBheWxvYWQuXG4gKiBAcHJvcGVydHkgez99IGlkIC0gQ2xpZW50IHN5bmMgcm93IGlkIGZvciBwZXItc3luYyByZXNwb25zZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVzb3VyY2VJZCAtIFJlc291cmNlIGlkIGFzIGEgc3RyaW5nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlc291cmNlVHlwZSAtIFJlc291cmNlL21vZGVsIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VyaWFsaXplZERhdGEgLSBKU09OIHNlcmlhbGl6ZWQgbXV0YXRpb24gcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzeW5jVHlwZSAtIFN5bmMgb3BlcmF0aW9uIHR5cGUuXG4gKi9cbiJdfQ==
|
|
699
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zeW5jL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyx5QkFBeUIsRUFBRSxhQUFhLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUNoRixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sK0JBQStCLENBQUE7QUFDN0QsT0FBTyxFQUFDLGlDQUFpQyxFQUFDLE1BQU0sMkNBQTJDLENBQUE7QUFDM0YsT0FBTyx1QkFBdUIsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNyRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDM0QsT0FBTyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFFbEQ7Ozs7OztHQU1HO0FBQ0g7Ozs7Ozs7OztHQVNHO0FBQ0g7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyx5QkFBeUI7SUFDNUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BMEJHO0lBQ0gsWUFBWSxJQUFJLEdBQUcsRUFBRTtRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFBO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUE7UUFDdkMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsSUFBSSx5QkFBeUIsQ0FBQTtRQUNwRixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixJQUFJLElBQUksQ0FBQTtRQUNyRSxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixJQUFJLE9BQU8sQ0FBQTtRQUMxRSxJQUFJLENBQUMsd0JBQXdCLEdB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Q0FBQyxxQkFBcUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1lBQ3ZELGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxlQUFlO1lBQzNDLElBQUksRUFBRSxRQUFRLENBQUMsY0FBYztZQUM3QixXQUFXLEVBQUUsUUFBUSxDQUFDLFVBQVU7WUFDaEMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxZQUFZO1lBQ3BDLFNBQVMsRUFBRSxRQUFRLENBQUMsUUFBUTtTQUM3QixDQUFBO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQUMsSUFBSTtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTTtRQUNqRCw0RUFBNEU7UUFDNUUsK0VBQStFO1FBQy9FLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU07UUFFN0IsTUFBTSx5QkFBeUIsQ0FBQyxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBQyxDQUFDLENBQUE7SUFDckcsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZGVsaXZlckRlY2xhcmVkQnJvYWRjYXN0cywgdXBzZXJ0U3luY1Jvd30gZnJvbSBcIi4vc3luYy1jaGFuZ2UtZmFub3V0LmpzXCJcbmltcG9ydCB7bWFya1NlcnZlckFwcGx5fSBmcm9tIFwiLi9zeW5jLXB1Ymxpc2gtc3VwcHJlc3Npb24uanNcIlxuaW1wb3J0IHtyZXNvbHZlRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3N9IGZyb20gXCIuLi9mcm9udGVuZC1tb2RlbHMvcmVzb3VyY2UtZGVmaW5pdGlvbi5qc1wiXG5pbXBvcnQgU3luY1JlcGxheVVwc2VydEFwcGxpZXIgZnJvbSBcIi4vc3luYy1yZXBsYXktdXBzZXJ0LWFwcGxpZXIuanNcIlxuaW1wb3J0IHtWYWxpZGF0aW9uRXJyb3J9IGZyb20gXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIlxuaW1wb3J0IFZlbG9jaW91c0Vycm9yIGZyb20gXCIuLi92ZWxvY2lvdXMtZXJyb3IuanNcIlxuXG4vKipcbiAqIFJlc29sdmVkIHJvdXRlZC1yZXNvdXJjZSByZWdpc3RyYXRpb24gZm9yIG9uZSByZXBsYXkgcmVzb3VyY2UgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNSZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZGVsTmFtZSAtIEVmZmVjdGl2ZSBmcm9udGVuZCBtb2RlbCBuYW1lLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZX0gcmVzb3VyY2VDbGFzcyAtIFJvdXRlZCByZXNvdXJjZSBjbGFzcy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbiB8IG51bGx9IHJlc291cmNlQ29uZmlndXJhdGlvbiAtIE5vcm1hbGl6ZWQgcmVzb3VyY2UgY29uZmlndXJhdGlvbiB3aGVuIHJlZ2lzdHJ5LXJlc29sdmVkLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNSZXBsYXlNdXRhdGlvblxuICogQHByb3BlcnR5IHtEYXRlfSBjbGllbnRVcGRhdGVkQXQgLSBDbGllbnQtc2lkZSBtdXRhdGlvbiB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsID8+fSBkYXRhIC0gUGFyc2VkIG11dGF0aW9uIHBheWxvYWQuXG4gKiBAcHJvcGVydHkgez99IGlkIC0gQ2xpZW50IHN5bmMgcm93IGlkIGZvciBwZXItc3luYyByZXNwb25zZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVzb3VyY2VJZCAtIFJlc291cmNlIGlkIGFzIGEgc3RyaW5nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlc291cmNlVHlwZSAtIFJlc291cmNlL21vZGVsIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VyaWFsaXplZERhdGEgLSBKU09OIHNlcmlhbGl6ZWQgbXV0YXRpb24gcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzeW5jVHlwZSAtIFN5bmMgb3BlcmF0aW9uIHR5cGUuXG4gKi9cbi8qKlxuICogT25lIGRlY2xhcmF0aXZlIGJyb2FkY2FzdCBmYW5uZWQgb3V0IGFmdGVyIGEgbXV0YXRpb24gYXBwbGllcy5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNSZXBsYXlCcm9hZGNhc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgKChhcmdzOiBSZWNvcmQ8c3RyaW5nLCA/PikgPT4gc3RyaW5nKX0gY2hhbm5lbCAtIENoYW5uZWwgbmFtZSBvciByZXNvbHZlci5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IFJlY29yZDxzdHJpbmcsID8+KSA9PiBSZWNvcmQ8c3RyaW5nLCA/Pn0gYnJvYWRjYXN0UGFyYW1zIC0gQ2hhbm5lbCByb3V0aW5nIHBhcmFtcy5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IFJlY29yZDxzdHJpbmcsID8+KSA9PiA/fSBib2R5IC0gQnJvYWRjYXN0IGJvZHkuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiBSZWNvcmQ8c3RyaW5nLCA/PikgPT4gYm9vbGVhbn0gW3doZW5dIC0gT3B0aW9uYWwgZ2F0ZTsgc2tpcHBlZCB3aGVuIGl0IHJldHVybnMgZmFsc2UuXG4gKi9cblxuLyoqXG4gKiBSZXBsYXlzIGNsaWVudCBzeW5jIGVudmVsb3BlcyB0aHJvdWdoIHByb2plY3Qgc3VwcGxpZWQgYXV0aGVudGljYXRpb24sXG4gKiBhdXRob3JpemF0aW9uLCBhcHBsaWNhdGlvbiwgYW5kIHBlcnNpc3RlbmNlIGhvb2tzLlxuICpcbiAqIFRoaXMgaXMgaW50ZW50aW9uYWxseSB0cmFuc3BvcnQvbW9kZWwgYWdub3N0aWM6IFZlbG9jaW91cyBvd25zIHRoZSBnZW5lcmljXG4gKiByZXBsYXkgbG9vcCwgbm9ybWFsaXphdGlvbiwgc3RhbGUtY2xpZW50IGNvbXBhcmlzb24sIGFuZCBwZXItc3luYyByZXN1bHRcbiAqIHNoYXBlIHdoaWxlIGVhY2ggYXBwIG93bnMgaXRzIHRva2VuIGxvb2t1cCwgbW9kZWwgaGFuZGxlcnMsIGFuZFxuICogZG9tYWluIGF1dGhvcml6YXRpb24gcnVsZXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHN5bmMgZW52ZWxvcGUgcmVwbGF5IHNlcnZpY2UuXG4gICAqXG4gICAqIFdoZW4gYSBzeW5jIG1vZGVsIGlzIGdpdmVuLCBgZmluZEV4aXN0aW5nUmVwbGF5U3luY2AgYW5kXG4gICAqIGBwZXJzaXN0UmVwbGF5TXV0YXRpb25gIGdldCBtb2RlbC1iYWNrZWQgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMuIFRoZSBzeW5jXG4gICAqIG1vZGVsIG11c3QgZXhwb3NlIGBmaW5kQnlgL2BjcmVhdGVgIHN0YXRpY3MgcGx1cyBpbnN0YW5jZVxuICAgKiBgYXNzaWduYC9gc2F2ZWAvYGNsaWVudFVwZGF0ZWRBdGAgYW5kIGBhZHZhbmNlU2VydmVyU2VxdWVuY2VgICh0aGVcbiAgICogY2hhbmdlLWZlZWQgc2VxdWVuY2UgY29udHJhY3QpLCBhbmQgdGhlIGFjdG9yIHJldHVybmVkIGZyb21cbiAgICogYGF1dGhlbnRpY2F0ZVJlcGxheWAgbXVzdCBleHBvc2UgYW4gYGlkKClgIG1ldGhvZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIENvbnN0cnVjdG9yIGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHt7ZGVidWc/OiAoLi4uYXJnczogQXJyYXk8dW5rbm93bj4pID0+IHZvaWQsIHdhcm4/OiAoLi4uYXJnczogQXJyYXk8dW5rbm93bj4pID0+IHZvaWR9fSBbYXJncy5sb2dnZXJdIC0gTG9nZ2VyIHVzZWQgZm9yIG5vcm1hbGl6YXRpb24gd2FybmluZ3MuXG4gICAqIEBwYXJhbSB7P30gW2FyZ3Muc3luY01vZGVsXSAtIFN5bmMvY2hhbmdlIG1vZGVsIGVuYWJsaW5nIG1vZGVsLWJhY2tlZCBkZWZhdWx0IGhvb2tzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuYWN0b3JGb3JlaWduS2V5Q29sdW1uXSAtIFN5bmMgbW9kZWwgY29sdW1uIGxpbmtpbmcgcm93cyB0byB0aGUgcmVwbGF5IGFjdG9yLlxuICAgKiBAcGFyYW0gez99IFthcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW5Nb2RlbF0gLSBUb2tlbiBtb2RlbCBlbmFibGluZyB0aGUgZGVmYXVsdCB0b2tlbi1sb29rdXAgYXV0aGVudGljYXRlUmVwbGF5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuYXV0aGVudGljYXRpb25Ub2tlbkNvbHVtbl0gLSBUb2tlbiBtb2RlbCBjb2x1bW4gaG9sZGluZyB0aGUgdG9rZW4uIERlZmF1bHRzIHRvIFwidG9rZW5cIi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW5QYXJhbV0gLSBSZXF1ZXN0IHBhcmFtIGNhcnJ5aW5nIHRoZSB0b2tlbi4gRGVmYXVsdHMgdG8gXCJhdXRoZW50aWNhdGlvblRva2VuXCIuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgKChhcmdzOiBSZWNvcmQ8c3RyaW5nLCA/PikgPT4gUHJvbWlzZTw/PikgfCBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIFN5bmNSZXBsYXlVcHNlcnRBcHBsaWVyPlswXT59IFthcmdzLmFwcGx5SGFuZGxlcnNdIC0gUGVyLXJlc291cmNlVHlwZSBhcHBseSBoYW5kbGVycyAoZnVuY3Rpb25zIG9yIGRlY2xhcmF0aXZlIHVwc2VydC1hcHBsaWVyIHNwZWNzKSBlbmFibGluZyB0aGUgZGVmYXVsdCBhcHBseVJlcGxheU11dGF0aW9uIGRpc3BhdGNoLiBEZXByZWNhdGVkOiBwcmVmZXIgcmVzb3VyY2Ugcm91dGluZyB2aWEgYGNvbmZpZ3VyYXRpb25gL2ByZXNvdXJjZVR5cGVPdmVycmlkZXNgOyBhcHBseUhhbmRsZXJzIHJlbWFpbiBmb3IgcmVsZWFzZWQgYWRvcHRlcnMgYW5kIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciB0aGVpciBtaWdyYXRpb24uXG4gICAqIEBwYXJhbSB7KGFyZ3M6IFJlY29yZDxzdHJpbmcsID8+KSA9PiBSZWNvcmQ8c3RyaW5nLCA/Pn0gW2FyZ3MucGVyc2lzdEV4dHJhQXR0cmlidXRlc10gLSBFeHRyYSBhdHRyaWJ1dGVzIG1lcmdlZCBpbnRvIHRoZSBtb2RlbC1iYWNrZWQgcGVyc2lzdGVkIHJvdyAoZS5nLiBhbiBldmVudCBzY29wZSBjb2x1bW4pLlxuICAgKiBAcGFyYW0geyhhcmdzOiB7bXV0YXRpb246ID8sIGFwcGx5UmVzdWx0OiA/fSkgPT4gP30gW2FyZ3MucGVyc2lzdFNlcmlhbGl6ZWREYXRhXSAtIE92ZXJyaWRlcyB0aGUgcGVyc2lzdGVkIGRhdGEgcGF5bG9hZCAob2JqZWN0IHJlc3VsdHMgYXJlIEpTT04gc3RyaW5naWZpZWQpLlxuICAgKiBAcGFyYW0geyhicm9hZGNhc3Q6IHtjaGFubmVsOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgPz4sIGJvZHk6ID99KSA9PiBQcm9taXNlPHZvaWQ+fSBbYXJncy5icm9hZGNhc3Rlcl0gLSBEZWxpdmVycyBkZWNsYXJhdGl2ZSBicm9hZGNhc3RzLiBSZXF1aXJlZCB3aGVuIGJyb2FkY2FzdHMgYXJlIGNvbmZpZ3VyZWQuXG4gICAqIEBwYXJhbSB7U3luY1JlcGxheUJyb2FkY2FzdFtdfSBbYXJncy5icm9hZGNhc3RzXSAtIEJyb2FkY2FzdHMgZmFubmVkIG91dCBieSB0aGUgZGVmYXVsdCBhZnRlclJlcGxheU11dGF0aW9uLlxuICAgKiBAcGFyYW0ge3tnZXRCYWNrZW5kUHJvamVjdHM6ICgpID0+IGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuQmFja2VuZFByb2plY3RDb25maWd1cmF0aW9uW119fSBbYXJncy5jb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gd2hvc2UgZnJvbnRlbmQtbW9kZWwgcmVnaXN0cnkgcm91dGVzIG11dGF0aW9ucyB0byByZXNvdXJjZSBjbGFzc2VzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgc3RyaW5nPn0gW2FyZ3MucmVzb3VyY2VUeXBlT3ZlcnJpZGVzXSAtIFBlci1yZXNvdXJjZVR5cGUgcm91dGluZyBvdmVycmlkZXM6IGEgcmVzb3VyY2UgY2xhc3MsIG9yIGEgc3RyaW5nIGFsaWFzIHJlc29sdmVkIHRocm91Z2ggdGhlIHJlZ2lzdHJ5LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2F1dGhvcml6YXRpb24vYWJpbGl0eS5qc1wiKS5kZWZhdWx0fSBbYXJncy5hYmlsaXR5XSAtIEFiaWxpdHkgc2NvcGluZyByb3V0ZWQgcmVjb3JkIGxvb2t1cHMgYW5kIGNyZWF0ZSBtZW1iZXJzaGlwIGNoZWNrcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW2FyZ3MuYWJpbGl0eUNvbnRleHRdIC0gQWJpbGl0eSBjb250ZXh0IHBhc3NlZCB0byByb3V0ZWQgcmVzb3VyY2VzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBbYXJncy5sb2NhbHNdIC0gTG9jYWxzIHBhc3NlZCB0byByb3V0ZWQgcmVzb3VyY2VzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoYXJncyA9IHt9KSB7XG4gICAgdGhpcy5sb2dnZXIgPSBhcmdzLmxvZ2dlciB8fCBjb25zb2xlXG4gICAgdGhpcy5zeW5jTW9kZWwgPSBhcmdzLnN5bmNNb2RlbCB8fCBudWxsXG4gICAgdGhpcy5hY3RvckZvcmVpZ25LZXlDb2x1bW4gPSBhcmdzLmFjdG9yRm9yZWlnbktleUNvbHVtbiB8fCBcImF1dGhlbnRpY2F0aW9uX3Rva2VuX2lkXCJcbiAgICB0aGlzLmF1dGhlbnRpY2F0aW9uVG9rZW5Nb2RlbCA9IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbk1vZGVsIHx8IG51bGxcbiAgICB0aGlzLmF1dGhlbnRpY2F0aW9uVG9rZW5Db2x1bW4gPSBhcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW5Db2x1bW4gfHwgXCJ0b2tlblwiXG4gICAgdGhpcy5hdXRoZW50aWNhdGlvblRva2VuUGFyYW0gPSBhcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW5QYXJhbSB8fCBcImF1dGhlbnRpY2F0aW9uVG9rZW5cIlxuICAgIHRoaXMucGVyc2lzdEV4dHJhQXR0cmlidXRlcyA9IGFyZ3MucGVyc2lzdEV4dHJhQXR0cmlidXRlcyB8fCBudWxsXG4gICAgdGhpcy5wZXJzaXN0U2VyaWFsaXplZERhdGEgPSBhcmdzLnBlcnNpc3RTZXJpYWxpemVkRGF0YSB8fCBudWxsXG4gICAgdGhpcy5icm9hZGNhc3RlciA9IGFyZ3MuYnJvYWRjYXN0ZXIgfHwgbnVsbFxuICAgIHRoaXMuYnJvYWRjYXN0cyA9IGFyZ3MuYnJvYWRjYXN0cyB8fCBudWxsXG4gICAgdGhpcy5hcHBseUhhbmRsZXJzID0gYXJncy5hcHBseUhhbmRsZXJzID8gdGhpcy5idWlsdEFwcGx5SGFuZGxlcnMoYXJncy5hcHBseUhhbmRsZXJzKSA6IG51bGxcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBhcmdzLmNvbmZpZ3VyYXRpb24gfHwgbnVsbFxuICAgIHRoaXMucmVzb3VyY2VUeXBlT3ZlcnJpZGVzID0gYXJncy5yZXNvdXJjZVR5cGVPdmVycmlkZXMgfHwgbnVsbFxuICAgIHRoaXMuYWJpbGl0eSA9IGFyZ3MuYWJpbGl0eSB8fCBudWxsXG4gICAgdGhpcy5hYmlsaXR5Q29udGV4dCA9IGFyZ3MuYWJpbGl0eUNvbnRleHQgfHwgbnVsbFxuICAgIHRoaXMubG9jYWxzID0gYXJncy5sb2NhbHMgfHwgbnVsbFxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgU3luY1JlcGxheVJlc291cmNlUmVnaXN0cmF0aW9uIHwgbnVsbD59ICovXG4gICAgdGhpcy5fcmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb25zID0gbmV3IE1hcCgpXG5cbiAgICBpZiAoYXJncy5hY3RvckZvcmVpZ25LZXlDb2x1bW4gIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIGFyZ3MuYWN0b3JGb3JlaWduS2V5Q29sdW1uICE9PSBcInN0cmluZ1wiIHx8IGFyZ3MuYWN0b3JGb3JlaWduS2V5Q29sdW1uLmxlbmd0aCA8IDEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGFjdG9yRm9yZWlnbktleUNvbHVtbiBtdXN0IGJlIGEgbm9uLWJsYW5rIHN0cmluZywgZ290OiAke1N0cmluZyhhcmdzLmFjdG9yRm9yZWlnbktleUNvbHVtbil9YClcbiAgICB9XG4gICAgaWYgKHRoaXMuYnJvYWRjYXN0cyAmJiAhdGhpcy5icm9hZGNhc3Rlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0VudmVsb3BlUmVwbGF5U2VydmljZSBicm9hZGNhc3RzIHJlcXVpcmUgYSBicm9hZGNhc3RlciBvcHRpb24gZGVsaXZlcmluZyB0aGVtXCIpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBzIGRlY2xhcmF0aXZlIGFwcGx5LWhhbmRsZXIgc3BlY3MgaW4gdXBzZXJ0IGFwcGxpZXJzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBhcHBseUhhbmRsZXJzIC0gUmF3IGFwcGx5IGhhbmRsZXJzLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgKGFyZ3M6IFJlY29yZDxzdHJpbmcsID8+KSA9PiBQcm9taXNlPD8+Pn0gQ2FsbGFibGUgaGFuZGxlcnMgYnkgcmVzb3VyY2UgdHlwZS5cbiAgICovXG4gIGJ1aWx0QXBwbHlIYW5kbGVycyhhcHBseUhhbmRsZXJzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhcHBseUhhbmRsZXJzKS5tYXAoKFtyZXNvdXJjZVR5cGUsIGhhbmRsZXJdKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFtyZXNvdXJjZVR5cGUsIGhhbmRsZXJdXG5cbiAgICAgIGNvbnN0IGFwcGxpZXIgPSBuZXcgU3luY1JlcGxheVVwc2VydEFwcGxpZXIoaGFuZGxlcilcblxuICAgICAgcmV0dXJuIFtyZXNvdXJjZVR5cGUsICgvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyBhcHBseUFyZ3MpID0+IGFwcGxpZXIuYXBwbHkoLyoqIEB0eXBlIHs/fSAqLyAoYXBwbHlBcmdzKSldXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogUmVwbGF5cyBhIHN5bmMgYmF0Y2guXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IHBhcmFtcyAtIFJlcXVlc3QgcGFyYW1zIGNhcnJ5aW5nIGF1dGhlbnRpY2F0aW9uIGFuZCBzeW5jcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8e3N5bmNzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCA/Pj4sIHN0YXR1cz86IHN0cmluZywgZXJyb3JDb2RlPzogc3RyaW5nLCBlcnJvck1lc3NhZ2U/OiBzdHJpbmd9Pn0gUmVwbGF5IHJlc3BvbnNlLlxuICAgKi9cbiAgYXN5bmMgcmVwbGF5KHBhcmFtcykge1xuICAgIGNvbnN0IGFjdG9yUmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoZW50aWNhdGVSZXBsYXkocGFyYW1zKVxuXG4gICAgaWYgKCFhY3RvclJlc3VsdC5hdXRoZW50aWNhdGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzeW5jczogW10sXG4gICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICBlcnJvckNvZGU6IGFjdG9yUmVzdWx0LmVycm9yQ29kZSxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBhY3RvclJlc3VsdC5lcnJvck1lc3NhZ2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzeW5jUmVzcG9uc2VzID0gW11cbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5idWlsZFJlcGxheUNvbnRleHQoe2FjdG9yOiBhY3RvclJlc3VsdC5hY3RvciwgcGFyYW1zfSlcblxuICAgIGZvciAoY29uc3QgcmF3U3luYyBvZiB0aGlzLnJlcGxheVN5bmNzKHBhcmFtcykpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXN1bHQgPSB0aGlzLm5vcm1hbGl6ZVJlcGxheVN5bmMocmF3U3luYylcblxuICAgICAgaWYgKCFub3JtYWxpemVkUmVzdWx0Lm9rKSB7XG4gICAgICAgIHN5bmNSZXNwb25zZXMucHVzaChub3JtYWxpemVkUmVzdWx0LnJlc3BvbnNlKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtdXRhdGlvbiA9IG5vcm1hbGl6ZWRSZXN1bHQubXV0YXRpb25cbiAgICAgIGNvbnN0IGFjY2Vzc1Jlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aG9yaXplUmVwbGF5TXV0YXRpb24oe2FjdG9yOiBhY3RvclJlc3VsdC5hY3RvciwgY29udGV4dCwgbXV0YXRpb259KVxuXG4gICAgICBpZiAoIWFjY2Vzc1Jlc3VsdC5hbGxvd2VkKSB7XG4gICAgICAgIHN5bmNSZXNwb25zZXMucHVzaCh7XG4gICAgICAgICAgaWQ6IG11dGF0aW9uLmlkLFxuICAgICAgICAgIHN5bmNTdGF0ZTogXCJmYWlsZWRcIixcbiAgICAgICAgICByZWFzb246IGFjY2Vzc1Jlc3VsdC5yZWFzb24gfHwgXCJhY2Nlc3MtZGVuaWVkXCJcbiAgICAgICAgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhpc3RpbmdTeW5jID0gYXdhaXQgdGhpcy5maW5kRXhpc3RpbmdSZXBsYXlTeW5jKHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIGNvbnRleHQsIG11dGF0aW9ufSlcbiAgICAgIGNvbnN0IHNob3VsZEFwcGx5ID0gYXdhaXQgdGhpcy5zaG91bGRBcHBseVJlcGxheU11dGF0aW9uKHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIGNvbnRleHQsIGV4aXN0aW5nU3luYywgbXV0YXRpb259KVxuXG4gICAgICAvKiogQHR5cGUgez99ICovXG4gICAgICBsZXQgYXBwbHlSZXN1bHRcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXBwbHlSZXN1bHQgPSBzaG91bGRBcHBseVxuICAgICAgICAgID8gYXdhaXQgdGhpcy5hcHBseVJlcGxheU11dGF0aW9uKHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIGNvbnRleHQsIGV4aXN0aW5nU3luYywgbXV0YXRpb259KVxuICAgICAgICAgIDogYXdhaXQgdGhpcy5za2lwcGVkUmVwbGF5TXV0YXRpb24oe2FjdG9yOiBhY3RvclJlc3VsdC5hY3RvciwgY29udGV4dCwgZXhpc3RpbmdTeW5jLCBtdXRhdGlvbn0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBDbGllbnQtc2FmZSBhcHBseSBmYWlsdXJlcyAoc2NoZW1hIHZhbGlkYXRpb24sIG1vZGVsIHZhbGlkYXRpb24sXG4gICAgICAgIC8vIGF1dGhvcml6YXRpb24gZGVuaWFscywgdW5rbm93biByZXNvdXJjZSB0eXBlcykgZmFpbCB0aGlzIHN5bmMgYW5kXG4gICAgICAgIC8vIGtlZXAgdGhlIGJhdGNoIGdvaW5nOyB1bmV4cGVjdGVkIGVycm9ycyBrZWVwIHByb3BhZ2F0aW5nLlxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBWZWxvY2lvdXNFcnJvciAmJiBlcnJvci5zYWZlVG9FeHBvc2UpIHtcbiAgICAgICAgICBzeW5jUmVzcG9uc2VzLnB1c2goe1xuICAgICAgICAgICAgaWQ6IG11dGF0aW9uLmlkLFxuICAgICAgICAgICAgc3luY1N0YXRlOiBcImZhaWxlZFwiLFxuICAgICAgICAgICAgcmVhc29uOiBlcnJvci5jb2RlIHx8IFwiYXBwbHktZmFpbGVkXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0UmVwbGF5TXV0YXRpb24oe2FjdG9yOiBhY3RvclJlc3VsdC5hY3RvciwgY29udGV4dCwgZXhpc3RpbmdTeW5jLCBhcHBseVJlc3VsdCwgbXV0YXRpb24sIHNob3VsZEFwcGx5fSlcbiAgICAgIGF3YWl0IHRoaXMuYWZ0ZXJSZXBsYXlNdXRhdGlvbih7YWN0b3I6IGFjdG9yUmVzdWx0LmFjdG9yLCBjb250ZXh0LCBleGlzdGluZ1N5bmMsIGFwcGx5UmVzdWx0LCBtdXRhdGlvbiwgc2hvdWxkQXBwbHl9KVxuXG4gICAgICBzeW5jUmVzcG9uc2VzLnB1c2goe2lkOiBtdXRhdGlvbi5pZCwgc3luY1N0YXRlOiBcInN1Y2Nlc3NmdWxcIn0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHtzeW5jczogc3luY1Jlc3BvbnNlc31cbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGVzIHRoZSBzeW5jIGJhdGNoIGFjdG9yLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBhIHRva2VuLW1vZGVsIGxvb2t1cCB3aGVuIGBhdXRoZW50aWNhdGlvblRva2VuTW9kZWxgIGlzXG4gICAqIGNvbmZpZ3VyZWQ7IG90aGVyd2lzZSBhcHBzIG92ZXJyaWRlIHRoaXMgaG9vay5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gcGFyYW1zIC0gUmVxdWVzdCBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHthdXRoZW50aWNhdGVkOiB0cnVlLCBhY3RvcjogP30gfCB7YXV0aGVudGljYXRlZDogZmFsc2UsIGVycm9yQ29kZTogc3RyaW5nLCBlcnJvck1lc3NhZ2U6IHN0cmluZ30+fSBBdXRoIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGF1dGhlbnRpY2F0ZVJlcGxheShwYXJhbXMpIHtcbiAgICBpZiAoIXRoaXMuYXV0aGVudGljYXRpb25Ub2tlbk1vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlLmF1dGhlbnRpY2F0ZVJlcGxheSBtdXN0IGJlIGltcGxlbWVudGVkIChvciBjb25maWd1cmUgYXV0aGVudGljYXRpb25Ub2tlbk1vZGVsKVwiKVxuICAgIH1cblxuICAgIGNvbnN0IHRva2VuID0gcGFyYW1zW3RoaXMuYXV0aGVudGljYXRpb25Ub2tlblBhcmFtXVxuXG4gICAgaWYgKCF0b2tlbikge1xuICAgICAgcmV0dXJuIHthdXRoZW50aWNhdGVkOiBmYWxzZSwgZXJyb3JDb2RlOiBcIm1pc3NpbmctYXV0aGVudGljYXRpb24tdG9rZW5cIiwgZXJyb3JNZXNzYWdlOiBcIk1pc3NpbmcgYXV0aGVudGljYXRpb24gdG9rZW5cIn1cbiAgICB9XG5cbiAgICBjb25zdCBhY3RvciA9IGF3YWl0IHRoaXMuYXV0aGVudGljYXRpb25Ub2tlbk1vZGVsLmZpbmRCeSh7W3RoaXMuYXV0aGVudGljYXRpb25Ub2tlbkNvbHVtbl06IHRva2VufSlcblxuICAgIGlmICghYWN0b3IpIHtcbiAgICAgIHJldHVybiB7YXV0aGVudGljYXRlZDogZmFsc2UsIGVycm9yQ29kZTogXCJpbnZhbGlkLWF1dGhlbnRpY2F0aW9uLXRva2VuXCIsIGVycm9yTWVzc2FnZTogXCJJbnZhbGlkIGF1dGhlbnRpY2F0aW9uIHRva2VuXCJ9XG4gICAgfVxuXG4gICAgcmV0dXJuIHthY3RvciwgYXV0aGVudGljYXRlZDogdHJ1ZX1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgcGVyLWJhdGNoIG11dGFibGUgY29udGV4dCBmb3IgY2FjaGVzIHNoYXJlZCBhY3Jvc3Mgc3luYyBpdGVtcy5cbiAgICogQHBhcmFtIHt7YWN0b3I6ID8sIHBhcmFtczogUmVjb3JkPHN0cmluZywgPz59fSBfYXJncyAtIEFjdG9yIGFuZCByZXF1ZXN0IHBhcmFtcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fSBSZXBsYXkgY29udGV4dC5cbiAgICovXG4gIGFzeW5jIGJ1aWxkUmVwbGF5Q29udGV4dChfYXJncykge1xuICAgIHJldHVybiB7fVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcmF3IHN5bmMgZW50cmllcyBmcm9tIHJlcXVlc3QgcGFyYW1zLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBwYXJhbXMgLSBSZXF1ZXN0IHBhcmFtcy5cbiAgICogQHJldHVybnMge0FycmF5PD8+fSBSYXcgc3luYyBlbnRyaWVzLlxuICAgKi9cbiAgcmVwbGF5U3luY3MocGFyYW1zKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGFyYW1zLnN5bmNzKSA/IHBhcmFtcy5zeW5jcyA6IFtdXG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBvbmUgc3luYyBlbnRyeS5cbiAgICogQHBhcmFtIHs/fSByYXdTeW5jIC0gUmF3IHN5bmMgZW50cnkuXG4gICAqIEByZXR1cm5zIHt7b2s6IHRydWUsIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufSB8IHtvazogZmFsc2UsIHJlc3BvbnNlOiBSZWNvcmQ8c3RyaW5nLCA/Pn19IE5vcm1hbGl6ZWQgbXV0YXRpb24gb3IgZmFpbGVkIHJlc3BvbnNlLlxuICAgKi9cbiAgbm9ybWFsaXplUmVwbGF5U3luYyhyYXdTeW5jKSB7XG4gICAgaWYgKCFyYXdTeW5jIHx8IHR5cGVvZiByYXdTeW5jICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocmF3U3luYykpIHtcbiAgICAgIHJldHVybiB7b2s6IGZhbHNlLCByZXNwb25zZToge2lkOiB1bmRlZmluZWQsIHN5bmNTdGF0ZTogXCJmYWlsZWRcIiwgcmVhc29uOiBcImludmFsaWQtc3luY1wifX1cbiAgICB9XG5cbiAgICBjb25zdCBzeW5jID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKHJhd1N5bmMpXG4gICAgY29uc3Qge2NsaWVudFVwZGF0ZWRBdCwgZGF0YSwgaWQsIHJlc291cmNlSWQsIHJlc291cmNlVHlwZSwgc3luY1R5cGV9ID0gc3luY1xuXG4gICAgaWYgKHR5cGVvZiByZXNvdXJjZVR5cGUgIT09IFwic3RyaW5nXCIgfHwgcmVzb3VyY2VUeXBlLmxlbmd0aCA8IDEgfHwgcmVzb3VyY2VJZCA9PT0gdW5kZWZpbmVkIHx8IHJlc291cmNlSWQgPT09IG51bGwgfHwgdHlwZW9mIHN5bmNUeXBlICE9PSBcInN0cmluZ1wiIHx8IHN5bmNUeXBlLmxlbmd0aCA8IDEpIHtcbiAgICAgIHJldHVybiB7b2s6IGZhbHNlLCByZXNwb25zZToge2lkLCBzeW5jU3RhdGU6IFwiZmFpbGVkXCIsIHJlYXNvbjogXCJpbnZhbGlkLXJlc291cmNlLWlkXCJ9fVxuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlSWRTdHJpbmcgPSBTdHJpbmcocmVzb3VyY2VJZClcbiAgICBsZXQgY2xpZW50VXBkYXRlZEF0RGF0ZSA9IHR5cGVvZiBjbGllbnRVcGRhdGVkQXQgPT09IFwic3RyaW5nXCIgfHwgY2xpZW50VXBkYXRlZEF0IGluc3RhbmNlb2YgRGF0ZSA/IG5ldyBEYXRlKGNsaWVudFVwZGF0ZWRBdCkgOiBuZXcgRGF0ZSgpXG5cbiAgICBpZiAoTnVtYmVyLmlzTmFOKGNsaWVudFVwZGF0ZWRBdERhdGUuZ2V0VGltZSgpKSkgY2xpZW50VXBkYXRlZEF0RGF0ZSA9IG5ldyBEYXRlKClcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRhUmVzdWx0ID0gdGhpcy5ub3JtYWxpemVSZXBsYXlTeW5jRGF0YSh7ZGF0YSwgaWQsIHJlc291cmNlSWQ6IHJlc291cmNlSWRTdHJpbmcsIHJlc291cmNlVHlwZX0pXG5cbiAgICBpZiAoIW5vcm1hbGl6ZWREYXRhUmVzdWx0Lm9rKSByZXR1cm4gbm9ybWFsaXplZERhdGFSZXN1bHRcblxuICAgIHJldHVybiB7XG4gICAgICBvazogdHJ1ZSxcbiAgICAgIG11dGF0aW9uOiB7XG4gICAgICAgIGNsaWVudFVwZGF0ZWRBdDogY2xpZW50VXBkYXRlZEF0RGF0ZSxcbiAgICAgICAgZGF0YTogbm9ybWFsaXplZERhdGFSZXN1bHQuZGF0YSxcbiAgICAgICAgaWQsXG4gICAgICAgIHJlc291cmNlSWQ6IHJlc291cmNlSWRTdHJpbmcsXG4gICAgICAgIHJlc291cmNlVHlwZSxcbiAgICAgICAgc2VyaWFsaXplZERhdGE6IEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWREYXRhUmVzdWx0LmRhdGEpLFxuICAgICAgICBzeW5jVHlwZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIG9uZSBzeW5jIGRhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHt7ZGF0YTogPywgaWQ6ID8sIHJlc291cmNlSWQ6IHN0cmluZywgcmVzb3VyY2VUeXBlOiBzdHJpbmd9fSBhcmdzIC0gU3luYyBwYXlsb2FkIG5vcm1hbGl6YXRpb24gYXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7e29rOiB0cnVlLCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCA/Pn0gfCB7b2s6IGZhbHNlLCByZXNwb25zZTogUmVjb3JkPHN0cmluZywgPz59fSBOb3JtYWxpemVkIHBheWxvYWQgb3IgZmFpbGVkIHJlc3BvbnNlLlxuICAgKi9cbiAgbm9ybWFsaXplUmVwbGF5U3luY0RhdGEoe2RhdGEsIGlkLCByZXNvdXJjZUlkLCByZXNvdXJjZVR5cGV9KSB7XG4gICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCB8fCBkYXRhID09PSBudWxsKSByZXR1cm4ge29rOiB0cnVlLCBkYXRhOiB7fX1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IEpTT04ucGFyc2UoZGF0YSlcblxuICAgICAgICBpZiAoIXBhcnNlZERhdGEgfHwgdHlwZW9mIHBhcnNlZERhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShwYXJzZWREYXRhKSkgcmV0dXJuIHtvazogdHJ1ZSwgZGF0YToge319XG5cbiAgICAgICAgcmV0dXJuIHtvazogdHJ1ZSwgZGF0YTogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKHBhcnNlZERhdGEpfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2Fybj8uKFwiSW52YWxpZCBzeW5jIGRhdGEgSlNPTlwiLCB7ZXJyb3IsIGlkLCByZXNvdXJjZUlkLCByZXNvdXJjZVR5cGV9KVxuICAgICAgICByZXR1cm4ge29rOiBmYWxzZSwgcmVzcG9uc2U6IHtpZCwgc3luY1N0YXRlOiBcImZhaWxlZFwiLCByZWFzb246IFwiaW52YWxpZC1kYXRhXCJ9fVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSByZXR1cm4ge29rOiB0cnVlLCBkYXRhOiB7fX1cblxuICAgIHJldHVybiB7b2s6IHRydWUsIGRhdGE6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpfVxuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhvcml6ZXMgb25lIG5vcm1hbGl6ZWQgbXV0YXRpb24uXG4gICAqIEBwYXJhbSB7e2FjdG9yOiA/LCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCA/PiwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259fSBfYXJncyAtIEFjdG9yLCBiYXRjaCBjb250ZXh0LCBhbmQgbXV0YXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHthbGxvd2VkOiBib29sZWFuLCByZWFzb24/OiBzdHJpbmd9Pn0gQWNjZXNzIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGF1dGhvcml6ZVJlcGxheU11dGF0aW9uKF9hcmdzKSB7XG4gICAgcmV0dXJuIHthbGxvd2VkOiB0cnVlfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBwcmV2aW91c2x5IHN0b3JlZCBzeW5jL2NoYW5nZSByb3cgZm9yIHN0YWxlLWNsaWVudCBjb21wYXJpc29uLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBhIHN5bmMtbW9kZWwgbG9va3VwIGJ5IGFjdG9yIGFuZCByZXNvdXJjZSBpZGVudGl0eSB3aGVuIGEgc3luY1xuICAgKiBtb2RlbCBpcyBjb25maWd1cmVkOyBvdGhlcndpc2UgYXBwcyBvdmVycmlkZSB0aGlzIGhvb2suXG4gICAqIEBwYXJhbSB7e2FjdG9yOiA/LCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCA/PiwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259fSBhcmdzIC0gQWN0b3IsIGJhdGNoIGNvbnRleHQsIGFuZCBtdXRhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IEV4aXN0aW5nIHN5bmMgcm93LlxuICAgKi9cbiAgYXN5bmMgZmluZEV4aXN0aW5nUmVwbGF5U3luYyh7YWN0b3IsIG11dGF0aW9ufSkge1xuICAgIGlmICghdGhpcy5zeW5jTW9kZWwpIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zeW5jTW9kZWwuZmluZEJ5KHtcbiAgICAgIFt0aGlzLmFjdG9yRm9yZWlnbktleUNvbHVtbl06IHRoaXMucmVwbGF5QWN0b3JJZChhY3RvciksXG4gICAgICByZXNvdXJjZV9pZDogbXV0YXRpb24ucmVzb3VyY2VJZCxcbiAgICAgIHJlc291cmNlX3R5cGU6IG11dGF0aW9uLnJlc291cmNlVHlwZVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHBlcnNpc3RlZCBhY3RvciBpZCB1c2VkIGJ5IG1vZGVsLWJhY2tlZCBkZWZhdWx0IGhvb2tzLlxuICAgKiBAcGFyYW0gez99IGFjdG9yIC0gQWN0b3IgcmV0dXJuZWQgZnJvbSBhdXRoZW50aWNhdGVSZXBsYXkuXG4gICAqIEByZXR1cm5zIHs/fSBBY3RvciBpZC5cbiAgICovXG4gIHJlcGxheUFjdG9ySWQoYWN0b3IpIHtcbiAgICBpZiAoIWFjdG9yIHx8IHR5cGVvZiBhY3RvciAhPT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgYWN0b3IuaWQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0VudmVsb3BlUmVwbGF5U2VydmljZSBtb2RlbC1iYWNrZWQgZGVmYXVsdHMgcmVxdWlyZSBhbiBhY3RvciB3aXRoIGFuIGlkKCkgbWV0aG9kIGZyb20gYXV0aGVudGljYXRlUmVwbGF5XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdG9yLmlkKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBub3JtYWxpemVkIG11dGF0aW9uIHNob3VsZCBiZSBhcHBsaWVkIHRvIGRvbWFpbiBtb2RlbHMuXG4gICAqIEBwYXJhbSB7e2FjdG9yOiA/LCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCA/PiwgZXhpc3RpbmdTeW5jOiA/LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IGFyZ3MgLSBBY3RvciwgYmF0Y2ggY29udGV4dCwgZXhpc3Rpbmcgc3luYyByb3csIGFuZCBtdXRhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgdG8gYXBwbHkgdGhlIG11dGF0aW9uLlxuICAgKi9cbiAgYXN5bmMgc2hvdWxkQXBwbHlSZXBsYXlNdXRhdGlvbih7ZXhpc3RpbmdTeW5jLCBtdXRhdGlvbn0pIHtcbiAgICBjb25zdCBleGlzdGluZ0NsaWVudFVwZGF0ZWRBdCA9IHRoaXMuZXhpc3RpbmdSZXBsYXlTeW5jQ2xpZW50VXBkYXRlZEF0KGV4aXN0aW5nU3luYylcblxuICAgIHJldHVybiAhZXhpc3RpbmdDbGllbnRVcGRhdGVkQXQgfHwgbXV0YXRpb24uY2xpZW50VXBkYXRlZEF0ID4gZXhpc3RpbmdDbGllbnRVcGRhdGVkQXRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgY2xpZW50IHRpbWVzdGFtcCBmcm9tIGFuIGV4aXN0aW5nIHN5bmMgcm93LlxuICAgKiBAcGFyYW0gez99IGV4aXN0aW5nU3luYyAtIEV4aXN0aW5nIHN5bmMgcm93LlxuICAgKiBAcmV0dXJucyB7RGF0ZSB8IG51bGx9IEV4aXN0aW5nIGNsaWVudCB0aW1lc3RhbXAuXG4gICAqL1xuICBleGlzdGluZ1JlcGxheVN5bmNDbGllbnRVcGRhdGVkQXQoZXhpc3RpbmdTeW5jKSB7XG4gICAgaWYgKCFleGlzdGluZ1N5bmMgfHwgdHlwZW9mIGV4aXN0aW5nU3luYyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHN5bmNSZWNvcmQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoZXhpc3RpbmdTeW5jKVxuICAgIGNvbnN0IHZhbHVlID0gdHlwZW9mIHN5bmNSZWNvcmQuY2xpZW50VXBkYXRlZEF0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gc3luY1JlY29yZC5jbGllbnRVcGRhdGVkQXQoKVxuICAgICAgOiBzeW5jUmVjb3JkLmNsaWVudFVwZGF0ZWRBdFxuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHZhbHVlXG5cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgcGFyc2VkVmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSlcblxuICAgIHJldHVybiBOdW1iZXIuaXNOYU4ocGFyc2VkVmFsdWUuZ2V0VGltZSgpKSA/IG51bGwgOiBwYXJzZWRWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgb25lIG5vcm1hbGl6ZWQgbXV0YXRpb24gdG8gZG9tYWluIG1vZGVscy5cbiAgICpcbiAgICogRGlzcGF0Y2hlcyB0aHJvdWdoIHRoZSBjb25maWd1cmVkIGFwcGx5LWhhbmRsZXIgcmVnaXN0cnkgZmlyc3QgKGNvbXBhdFxuICAgKiBwcmVjZWRlbmNlKTsgbXV0YXRpb25zIHdpdGhvdXQgYSBtYXRjaGluZyBoYW5kbGVyIGZhbGwgdGhyb3VnaCB0b1xuICAgKiByZXNvdXJjZSByb3V0aW5nIHdoZW4gYSBjb25maWd1cmF0aW9uIG9yIHJlc291cmNlVHlwZU92ZXJyaWRlcyBhcmVcbiAgICogY29uZmlndXJlZCwgYW5kIG90aGVyd2lzZSBmYWlsIGxvdWRseS5cbiAgICogQHBhcmFtIHt7YWN0b3I6ID8sIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsID8+LCBleGlzdGluZ1N5bmM6ID8sIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufX0gYXJncyAtIEFjdG9yLCBiYXRjaCBjb250ZXh0LCBleGlzdGluZyBzeW5jIHJvdywgYW5kIG11dGF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTw/Pn0gUHJvamVjdC1zcGVjaWZpYyBhcHBseSByZXN1bHQuXG4gICAqL1xuICBhc3luYyBhcHBseVJlcGxheU11dGF0aW9uKGFyZ3MpIHtcbiAgICBpZiAodGhpcy5hcHBseUhhbmRsZXJzKSB7XG4gICAgICBjb25zdCBhcHBseUhhbmRsZXIgPSB0aGlzLmFwcGx5SGFuZGxlcnNbYXJncy5tdXRhdGlvbi5yZXNvdXJjZVR5cGVdXG5cbiAgICAgIGlmIChhcHBseUhhbmRsZXIpIHJldHVybiBhd2FpdCBhcHBseUhhbmRsZXIoYXJncylcbiAgICAgIGlmICghdGhpcy5yb3V0aW5nQ29uZmlndXJlZCgpKSB0aHJvdyBuZXcgRXJyb3IoYE5vIHN5bmMgYXBwbHkgaGFuZGxlciByZWdpc3RlcmVkIGZvcjogJHthcmdzLm11dGF0aW9uLnJlc291cmNlVHlwZX1gKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnJvdXRpbmdDb25maWd1cmVkKCkpIHJldHVybiBhd2FpdCB0aGlzLmFwcGx5Um91dGVkUmVwbGF5TXV0YXRpb24oYXJncylcblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHJlc291cmNlIHJvdXRpbmcgaXMgY29uZmlndXJlZCBvbiB0aGlzIHNlcnZpY2UuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIG11dGF0aW9ucyByb3V0ZSB0byBmcm9udGVuZC1tb2RlbCByZXNvdXJjZXMuXG4gICAqL1xuICByb3V0aW5nQ29uZmlndXJlZCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLmNvbmZpZ3VyYXRpb24gfHwgdGhpcy5yZXNvdXJjZVR5cGVPdmVycmlkZXMpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHJvdXRlZCByZXNvdXJjZSByZWdpc3RyYXRpb24gZm9yIGEgcmVzb3VyY2UgdHlwZSwgbWVtb2l6ZWRcbiAgICogcGVyIHJlcGxheSBzZXJ2aWNlLiBPdmVycmlkZXMgd2luIG92ZXIgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0cnk7IHN0cmluZ1xuICAgKiBvdmVycmlkZXMgYXJlIGFsaWFzZXMgcmVzb2x2ZWQgdGhyb3VnaCB0aGUgcmVnaXN0cnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNvdXJjZVR5cGUgLSBNdXRhdGlvbiByZXNvdXJjZSB0eXBlLlxuICAgKiBAcmV0dXJucyB7U3luY1JlcGxheVJlc291cmNlUmVnaXN0cmF0aW9uIHwgbnVsbH0gUmVzb2x2ZWQgcmVnaXN0cmF0aW9uIG9yIG51bGwgd2hlbiB1bnJvdXRhYmxlLlxuICAgKi9cbiAgcmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb24ocmVzb3VyY2VUeXBlKSB7XG4gICAgY29uc3QgbWVtb2l6ZWRSZWdpc3RyYXRpb24gPSB0aGlzLl9yZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbnMuZ2V0KHJlc291cmNlVHlwZSlcblxuICAgIGlmIChtZW1vaXplZFJlZ2lzdHJhdGlvbiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gbWVtb2l6ZWRSZWdpc3RyYXRpb25cblxuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IHRoaXMucmVzb2x2ZVJlcGxheVJlc291cmNlUmVnaXN0cmF0aW9uKHJlc291cmNlVHlwZSlcblxuICAgIHRoaXMuX3JlcGxheVJlc291cmNlUmVnaXN0cmF0aW9ucy5zZXQocmVzb3VyY2VUeXBlLCByZWdpc3RyYXRpb24pXG5cbiAgICByZXR1cm4gcmVnaXN0cmF0aW9uXG4gIH1cblxuICAvKipcbiAgICogVW5jYWNoZWQgcm91dGVkLXJlc291cmNlIHJlc29sdXRpb24gYmVoaW5kIHtAbGluayBTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlI3JlcGxheVJlc291cmNlUmVnaXN0cmF0aW9ufS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlVHlwZSAtIE11dGF0aW9uIHJlc291cmNlIHR5cGUuXG4gICAqIEByZXR1cm5zIHtTeW5jUmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb24gfCBudWxsfSBSZXNvbHZlZCByZWdpc3RyYXRpb24gb3IgbnVsbCB3aGVuIHVucm91dGFibGUuXG4gICAqL1xuICByZXNvbHZlUmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb24ocmVzb3VyY2VUeXBlKSB7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSB0aGlzLnJlc291cmNlVHlwZU92ZXJyaWRlcz8uW3Jlc291cmNlVHlwZV1cblxuICAgIGlmIChvdmVycmlkZSAmJiB0eXBlb2Ygb3ZlcnJpZGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7bW9kZWxOYW1lOiByZXNvdXJjZVR5cGUsIHJlc291cmNlQ2xhc3M6IG92ZXJyaWRlLCByZXNvdXJjZUNvbmZpZ3VyYXRpb246IG51bGx9XG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0cnlSZXNvdXJjZVR5cGUgPSB0eXBlb2Ygb3ZlcnJpZGUgPT09IFwic3RyaW5nXCIgPyBvdmVycmlkZSA6IHJlc291cmNlVHlwZVxuXG4gICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24pIHJldHVybiBudWxsXG5cbiAgICBjb25zdCByZXNvbHZlZFJlZ2lzdHJhdGlvbiA9IHJlc29sdmVGcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzcyh7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLCByZXNvdXJjZVR5cGU6IHJlZ2lzdHJ5UmVzb3VyY2VUeXBlfSlcblxuICAgIGlmICghcmVzb2x2ZWRSZWdpc3RyYXRpb24pIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxOYW1lOiByZXNvbHZlZFJlZ2lzdHJhdGlvbi5tb2RlbE5hbWUsXG4gICAgICByZXNvdXJjZUNsYXNzOiByZXNvbHZlZFJlZ2lzdHJhdGlvbi5yZXNvdXJjZUNsYXNzLFxuICAgICAgcmVzb3VyY2VDb25maWd1cmF0aW9uOiByZXNvbHZlZFJlZ2lzdHJhdGlvbi5yZXNvdXJjZUNvbmZpZ3VyYXRpb25cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSByb3V0ZWQgcmVzb3VyY2UgaW5zdGFuY2UgaGFuZGxpbmcgb25lIG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE5vcm1hbGl6ZWQgcmVwbGF5IG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge1N5bmNSZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbn0gYXJncy5yZWdpc3RyYXRpb24gLSBSZXNvbHZlZCByZXNvdXJjZSByZWdpc3RyYXRpb24uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHR9IFJvdXRlZCByZXNvdXJjZSBpbnN0YW5jZS5cbiAgICovXG4gIGJ1aWxkUmVwbGF5UmVzb3VyY2Uoe211dGF0aW9uLCByZWdpc3RyYXRpb259KSB7XG4gICAgY29uc3QgUmVzb3VyY2VDbGFzcyA9IHJlZ2lzdHJhdGlvbi5yZXNvdXJjZUNsYXNzXG5cbiAgICByZXR1cm4gbmV3IFJlc291cmNlQ2xhc3Moe1xuICAgICAgYWJpbGl0eTogdGhpcy5hYmlsaXR5IHx8IHVuZGVmaW5lZCxcbiAgICAgIGNvbnRleHQ6IHRoaXMuYWJpbGl0eUNvbnRleHQgfHwge30sXG4gICAgICBsb2NhbHM6IHRoaXMubG9jYWxzIHx8IHt9LFxuICAgICAgbW9kZWxOYW1lOiByZWdpc3RyYXRpb24ubW9kZWxOYW1lLFxuICAgICAgcGFyYW1zOiBtdXRhdGlvbi5kYXRhLFxuICAgICAgLi4uKHJlZ2lzdHJhdGlvbi5yZXNvdXJjZUNvbmZpZ3VyYXRpb24gPyB7cmVzb3VyY2VDb25maWd1cmF0aW9uOiByZWdpc3RyYXRpb24ucmVzb3VyY2VDb25maWd1cmF0aW9ufSA6IHt9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBvbmUgbXV0YXRpb24gdGhyb3VnaCBpdHMgcm91dGVkIGZyb250ZW5kLW1vZGVsIHJlc291cmNlOlxuICAgKiBhdXRob3JpemF0aW9uLCBhYmlsaXR5LXNjb3BlZCByZWNvcmQgbG9va3VwLCBzY2hlbWEgbm9ybWFsaXphdGlvbiBhbmRcbiAgICogYXNzaWduL3NhdmUgZm9yIHVwZGF0ZXMsIHNhdmUtdGhlbi1jaGVjayBtZW1iZXJzaGlwIGNyZWF0ZXMsIGRlc3Ryb3lzIGZvclxuICAgKiBkZWxldGVzLCBhbmQgdGhlIHJlc291cmNlJ3MgYWZ0ZXJTeW5jQXBwbHkgdGFpbC4gQ2xpZW50LXNhZmUgZmFpbHVyZXNcbiAgICogdGhyb3cgc2FmZSBlcnJvcnMgdGhhdCBmYWlsIHRoZSBzaW5nbGUgc3luYy5cbiAgICogQHBhcmFtIHt7YWN0b3I6ID8sIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsID8+LCBleGlzdGluZ1N5bmM6ID8sIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufX0gYXJncyAtIEFjdG9yLCBiYXRjaCBjb250ZXh0LCBleGlzdGluZyBzeW5jIHJvdywgYW5kIG11dGF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCA/Pj59IEFwcGx5IHJlc3VsdCB3aXRoIHJlY29yZCwgY3JlYXRlZC9kZWxldGVkIGZsYWdzLCBhbmQgYWZ0ZXJTeW5jQXBwbHkgZXh0cmFzLlxuICAgKi9cbiAgYXN5bmMgYXBwbHlSb3V0ZWRSZXBsYXlNdXRhdGlvbih7Y29udGV4dCwgZXhpc3RpbmdTeW5jLCBtdXRhdGlvbn0pIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnJlcGxheVJlc291cmNlUmVnaXN0cmF0aW9uKG11dGF0aW9uLnJlc291cmNlVHlwZSlcblxuICAgIGlmICghcmVnaXN0cmF0aW9uKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKGBVbmtub3duIHN5bmMgcmVzb3VyY2UgdHlwZTogJHttdXRhdGlvbi5yZXNvdXJjZVR5cGV9LmAsIHtjb2RlOiBcInVua25vd24tcmVzb3VyY2UtdHlwZVwifSlcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuYnVpbGRSZXBsYXlSZXNvdXJjZSh7bXV0YXRpb24sIHJlZ2lzdHJhdGlvbn0pXG4gICAgY29uc3QgY3VzdG9tQXBwbHlSZXN1bHQgPSBhd2FpdCByZXNvdXJjZS5hcHBseVN5bmMoe2NvbnRleHQsIGV4aXN0aW5nU3luYywgbXV0YXRpb259KVxuXG4gICAgaWYgKGN1c3RvbUFwcGx5UmVzdWx0ICE9PSBudWxsKSByZXR1cm4gY3VzdG9tQXBwbHlSZXN1bHRcblxuICAgIGNvbnN0IGF1dGhvcml6YXRpb24gPSBhd2FpdCByZXNvdXJjZS5hdXRob3JpemVTeW5jTXV0YXRpb24oe2NvbnRleHQsIG11dGF0aW9ufSlcblxuICAgIGlmICghYXV0aG9yaXphdGlvbi5hbGxvd2VkKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKGBTeW5jIG11dGF0aW9uIGRlbmllZCBmb3I6ICR7bXV0YXRpb24ucmVzb3VyY2VUeXBlfS5gLCB7Y29kZTogYXV0aG9yaXphdGlvbi5yZWFzb24gfHwgXCJhY2Nlc3MtZGVuaWVkXCJ9KVxuICAgIH1cblxuICAgIGlmIChtdXRhdGlvbi5zeW5jVHlwZSA9PT0gXCJkZWxldGVcIikgcmV0dXJuIGF3YWl0IHRoaXMuYXBwbHlSb3V0ZWRSZXBsYXlEZWxldGUoe211dGF0aW9uLCByZXNvdXJjZX0pXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5hcHBseVJvdXRlZFJlcGxheVVwc2VydCh7Y29udGV4dCwgbXV0YXRpb24sIHJlc291cmNlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgcm91dGVkIGRlbGV0ZSBtdXRhdGlvbi4gVGhlIHJlY29yZCBpcyBtYXJrZWQgYXMgYSBzZXJ2ZXIgYXBwbHlcbiAgICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgcmVwbGF5LW93bmVkIGRlc3Ryb3kgLSBhbiBhY3RpdmUgU3luY1B1Ymxpc2hlclxuICAgKiBuZXZlciBwdWJsaXNoZXMgdGhlIHJlcGxheWVkIGRlbGV0ZSBhIHNlY29uZCB0aW1lICh0aGUgcmVwbGF5IG93bnMgaXRzXG4gICAqIG93biBwZXJzaXN0IGFuZCBicm9hZGNhc3RzKSwgd2hpbGUgbGF0ZXIgc2VydmVyLXNpZGUgd3JpdGVzIHRvIHRoZSBzYW1lXG4gICAqIGluc3RhbmNlIHB1Ymxpc2ggbm9ybWFsbHkgYWdhaW4uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gTm9ybWFsaXplZCByZXBsYXkgbXV0YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc291cmNlIC0gUm91dGVkIHJlc291cmNlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCA/Pj59IEFwcGx5IHJlc3VsdCB3aXRoIHRoZSBkZWxldGVkIGZsYWcuXG4gICAqL1xuICBhc3luYyBhcHBseVJvdXRlZFJlcGxheURlbGV0ZSh7bXV0YXRpb24sIHJlc291cmNlfSkge1xuICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IHJlc291cmNlLmZpbmRTeW5jUmVjb3JkKHtmb3JEZWxldGU6IHRydWUsIG11dGF0aW9ufSlcblxuICAgIGlmICghcmVjb3JkKSByZXR1cm4ge2NyZWF0ZWQ6IGZhbHNlLCBkZWxldGVkOiBmYWxzZSwgcmVjb3JkOiBudWxsfVxuXG4gICAgY29uc3QgcmVsZWFzZVNlcnZlckFwcGx5ID0gbWFya1NlcnZlckFwcGx5KHJlY29yZClcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZWNvcmQuZGVzdHJveSgpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlbGVhc2VTZXJ2ZXJBcHBseSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtjcmVhdGVkOiBmYWxzZSwgZGVsZXRlZDogdHJ1ZSwgcmVjb3JkfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYSByb3V0ZWQgdXBzZXJ0IG11dGF0aW9uOiBwZXJtaXR0ZWQgcGF5bG9hZCBhdHRyaWJ1dGVzIGFyZVxuICAgKiBhc3NpZ25lZCBhbmQgc2F2ZWQgb250byB0aGUgZm91bmQgcmVjb3JkICh0aGUgcmVjb3JkIGxheWVyIG93bnMgdmFsdWVcbiAgICogY2FzdGluZyBhbmQgdmFsaWRhdGlvbiksIGFuZCBtaXNzaW5nIHJlY29yZHMgYXJlIGNyZWF0ZWQgd2l0aCB0aGVcbiAgICogY2xpZW50LWdlbmVyYXRlZCBwcmltYXJ5IGtleSBwbHVzIGEgc2F2ZS10aGVuLWNoZWNrIG1lbWJlcnNoaXAgY2hlY2suXG4gICAqIFdyaXR0ZW4gcmVjb3JkcyBhcmUgbWFya2VkIGFzIHNlcnZlciBhcHBsaWVzIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlXG4gICAqIHJlcGxheS1vd25lZCB3cml0ZSAtIGFuIGFjdGl2ZSBTeW5jUHVibGlzaGVyIG5ldmVyIHB1Ymxpc2hlcyB0aGUgcmVwbGF5ZWRcbiAgICogbXV0YXRpb24gYSBzZWNvbmQgdGltZSAodGhlIHJlcGxheSBvd25zIGl0cyBvd24gcGVyc2lzdCBhbmQgYnJvYWRjYXN0cyksXG4gICAqIHdoaWxlIGxhdGVyIHNlcnZlci1zaWRlIHdyaXRlcyB0byB0aGUgc2FtZSBpbnN0YW5jZSBwdWJsaXNoIG5vcm1hbGx5XG4gICAqIGFnYWluLiBNb2RlbCB2YWxpZGF0aW9uIGZhaWx1cmVzIGJlY29tZSBjbGllbnQtc2FmZSBwZXItc3luYyBmYWlsdXJlc1xuICAgKiBjYXJyeWluZyB0aGUgdHJhbnNsYXRlZCB2YWxpZGF0aW9uIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gYXJncy5jb250ZXh0IC0gUmVwbGF5IGNvbnRleHQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE5vcm1hbGl6ZWQgcmVwbGF5IG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdH0gYXJncy5yZXNvdXJjZSAtIFJvdXRlZCByZXNvdXJjZSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fSBBcHBseSByZXN1bHQgd2l0aCByZWNvcmQsIGNyZWF0ZWQgZmxhZywgYW5kIGFmdGVyU3luY0FwcGx5IGV4dHJhcy5cbiAgICovXG4gIGFzeW5jIGFwcGx5Um91dGVkUmVwbGF5VXBzZXJ0KHtjb250ZXh0LCBtdXRhdGlvbiwgcmVzb3VyY2V9KSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMucGVybWl0dGVkUm91dGVkQXR0cmlidXRlcyh7bXV0YXRpb24sIHJlc291cmNlfSlcbiAgICBjb25zdCBleGlzdGluZ1JlY29yZCA9IGF3YWl0IHJlc291cmNlLmZpbmRTeW5jUmVjb3JkKHttdXRhdGlvbn0pXG5cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gKi9cbiAgICBsZXQgcmVjb3JkID0gZXhpc3RpbmdSZWNvcmRcbiAgICBsZXQgY3JlYXRlZCA9IGZhbHNlXG5cbiAgICBpZiAoZXhpc3RpbmdSZWNvcmQpIHtcbiAgICAgIGNvbnN0IHJlbGVhc2VTZXJ2ZXJBcHBseSA9IG1hcmtTZXJ2ZXJBcHBseShleGlzdGluZ1JlY29yZClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZXhpc3RpbmdSZWNvcmQuYXNzaWduKGF0dHJpYnV0ZXMpXG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZVJvdXRlZFJlcGxheVJlY29yZChleGlzdGluZ1JlY29yZClcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlbGVhc2VTZXJ2ZXJBcHBseSgpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuY3JlYXRlUm91dGVkUmVwbGF5UmVjb3JkKHthdHRyaWJ1dGVzLCBtdXRhdGlvbiwgcmVzb3VyY2V9KVxuICAgICAgY3JlYXRlZCA9IHRydWVcbiAgICB9XG5cbiAgICBjb25zdCBleHRyYXMgPSBhd2FpdCByZXNvdXJjZS5hZnRlclN5bmNBcHBseSh7Y29udGV4dCwgY3JlYXRlZCwgbXV0YXRpb24sIHJlY29yZH0pXG5cbiAgICByZXR1cm4ge2NyZWF0ZWQsIGRlbGV0ZWQ6IGZhbHNlLCByZWNvcmQsIC4uLmV4dHJhc31cbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGEgcm91dGVkIG11dGF0aW9uIHBheWxvYWQgZG93biB0byB0aGUgcmVzb3VyY2UncyBkZWNsYXJlZFxuICAgKiB3cml0YWJsZS1hdHRyaWJ1dGUgcGVybWl0IGxpc3QuIEFjY2VwdGVkIGtleXMgcGVyIHBlcm1pdHRlZCBhdHRyaWJ1dGUgYXJlXG4gICAqIHRoZSBjYW1lbENhc2UgYXR0cmlidXRlIG5hbWUgcGx1cyB0aGUgbW9kZWwncyBhY3R1YWwgY29sdW1uIG5hbWU7IHVua25vd25cbiAgICoga2V5cyBmYWlsIHRoZSBzeW5jIGxvdWRseS4gVGhlIHByaW1hcnkga2V5IGlzIGRyb3BwZWQgd2hlbiBwZXJtaXR0ZWRcbiAgICogKHNuYXBzaG90IHBheWxvYWRzKSDigJQgdGhlIGVudmVsb3BlJ3MgcmVzb3VyY2VJZCBpcyB0aGUgYXV0aG9yaXRhdGl2ZVxuICAgKiByZWNvcmQgaWRlbnRpdHksIHNvIGEgcGF5bG9hZCBpZCBjYW4gbmV2ZXIgcmV0YXJnZXQgdGhlIHJvdy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBOb3JtYWxpemVkIHJlcGxheSBtdXRhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVzb3VyY2UgLSBSb3V0ZWQgcmVzb3VyY2UgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gUGVybWl0dGVkIGF0dHJpYnV0ZXMgZm9yIHJlY29yZC5hc3NpZ24uXG4gICAqL1xuICBwZXJtaXR0ZWRSb3V0ZWRBdHRyaWJ1dGVzKHttdXRhdGlvbiwgcmVzb3VyY2V9KSB7XG4gICAgY29uc3QgcGVybWl0dGVkQXR0cmlidXRlcyA9IHJlc291cmNlLmRlY2xhcmVkV3JpdGFibGVBdHRyaWJ1dGVzKClcblxuICAgIGlmICghcGVybWl0dGVkQXR0cmlidXRlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Jlc291cmNlLmNvbnN0cnVjdG9yLm5hbWV9IG11c3QgZGVjbGFyZSBzdGF0aWMgd3JpdGFibGVBdHRyaWJ1dGVzIHRvIGFwcGx5IHJvdXRlZCBzeW5jIG11dGF0aW9ucyBmb3I6ICR7bXV0YXRpb24ucmVzb3VyY2VUeXBlfWApXG4gICAgfVxuXG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IHJlc291cmNlLm1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWUgPSBNb2RlbENsYXNzLmdldEF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVNYXAoKVxuXG4gICAgLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbiAgICBjb25zdCBhbGxvd2VkS2V5cyA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIHBlcm1pdHRlZEF0dHJpYnV0ZXMpIHtcbiAgICAgIGFsbG93ZWRLZXlzLmFkZChhdHRyaWJ1dGVOYW1lKVxuXG4gICAgICBjb25zdCBjb2x1bW5OYW1lID0gYXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZVthdHRyaWJ1dGVOYW1lXVxuXG4gICAgICBpZiAoY29sdW1uTmFtZSkgYWxsb3dlZEtleXMuYWRkKGNvbHVtbk5hbWUpXG4gICAgfVxuXG4gICAgY29uc3QgcHJpbWFyeUtleSA9IE1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG4gICAgY29uc3QgcHJpbWFyeUtleUF0dHJpYnV0ZSA9IE1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCgpW3ByaW1hcnlLZXldXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqL1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7fVxuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobXV0YXRpb24uZGF0YSkpIHtcbiAgICAgIGlmICghYWxsb3dlZEtleXMuaGFzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgcmVzb3VyY2Uud3JpdGFibGVBdHRyaWJ1dGVFcnJvcihgVW5rbm93biBhdHRyaWJ1dGU6ICR7a2V5fS5gLCB7Y29kZTogXCJzeW5jLXVua25vd24tYXR0cmlidXRlXCJ9KVxuICAgICAgfVxuXG4gICAgICBpZiAoa2V5ID09PSBwcmltYXJ5S2V5IHx8IGtleSA9PT0gcHJpbWFyeUtleUF0dHJpYnV0ZSkgY29udGludWVcblxuICAgICAgYXR0cmlidXRlc1trZXldID0gdmFsdWVcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlc1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHJvdXRlZCByZWNvcmQgd2l0aCB0aGUgY2xpZW50LWdlbmVyYXRlZCBwcmltYXJ5IGtleSAobWFya2VkXG4gICAqIGFzIGEgc2VydmVyIGFwcGx5IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNyZWF0ZSAtIGluY2x1ZGluZyB0aGVcbiAgICogbWVtYmVyc2hpcC1jaGVjayBjb21wZW5zYXRpb24gZGVzdHJveSAtIHNvIGFuIGFjdGl2ZSBTeW5jUHVibGlzaGVyIG5ldmVyXG4gICAqIHB1Ymxpc2hlcyB0aGUgcmVwbGF5ZWQgY3JlYXRlIGEgc2Vjb25kIHRpbWUpLCB0aGVuXG4gICAqIHZlcmlmaWVzIGNyZWF0ZS1zY29wZSBtZW1iZXJzaGlwIHdoZW4gYW4gYWJpbGl0eSBpcyBjb25maWd1cmVkOiByZWNvcmRzXG4gICAqIG91dHNpZGUgdGhlIGFiaWxpdHkncyBjcmVhdGUgc2NvcGUgYXJlIGRlc3Ryb3llZCBhZ2FpbiBhbmQgZmFpbCB0aGUgc3luY1xuICAgKiB3aXRoIHRoZSByZXNvdXJjZS1kZWNsYXJlZCByZWFzb24uIEEgcmVjb3JkIHRoYXQgYWxyZWFkeSBleGlzdHMgb3V0c2lkZVxuICAgKiB0aGUgcmVzb3VyY2UncyBsb29rdXAgc2NvcGUgZmFpbHMgdGhlIHN5bmMgYXMgYW4gYXV0aG9yaXphdGlvbiBkZW5pYWxcbiAgICogaW5zdGVhZCBvZiBjb2xsaWRpbmcgb24gdGhlIHByaW1hcnkga2V5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IGFyZ3MuYXR0cmlidXRlcyAtIFBlcm1pdHRlZCBwYXlsb2FkIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE5vcm1hbGl6ZWQgcmVwbGF5IG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdH0gYXJncy5yZXNvdXJjZSAtIFJvdXRlZCByZXNvdXJjZSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQ+fSBDcmVhdGVkIHJlY29yZC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVJvdXRlZFJlcGxheVJlY29yZCh7YXR0cmlidXRlcywgbXV0YXRpb24sIHJlc291cmNlfSkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSByZXNvdXJjZS5tb2RlbENsYXNzKClcbiAgICBjb25zdCBwcmltYXJ5S2V5ID0gTW9kZWxDbGFzcy5wcmltYXJ5S2V5KClcbiAgICBjb25zdCBjb25mbGljdGluZ0lkcyA9IGF3YWl0IE1vZGVsQ2xhc3Mud2hlcmUoe1twcmltYXJ5S2V5XTogbXV0YXRpb24ucmVzb3VyY2VJZH0pLnBsdWNrKHByaW1hcnlLZXkpXG5cbiAgICBpZiAoY29uZmxpY3RpbmdJZHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShgU3luYyB1cGRhdGUgZGVuaWVkIGZvcjogJHttdXRhdGlvbi5yZXNvdXJjZVR5cGV9LmAsIHtcbiAgICAgICAgY29kZTogcmVzb3VyY2Uuc3luY0F1dGhvcml6YXRpb25GYWlsdXJlUmVhc29uKHthY3Rpb246IFwidXBkYXRlXCIsIG11dGF0aW9ufSkgfHwgXCJhY2Nlc3MtZGVuaWVkXCJcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgYXdhaXQgTW9kZWxDbGFzcy5lbnN1cmVJbml0aWFsaXplZCgpXG5cbiAgICBjb25zdCByZWNvcmQgPSBuZXcgTW9kZWxDbGFzcyh7W3ByaW1hcnlLZXldOiBtdXRhdGlvbi5yZXNvdXJjZUlkLCAuLi5hdHRyaWJ1dGVzfSlcbiAgICBjb25zdCByZWxlYXNlU2VydmVyQXBwbHkgPSBtYXJrU2VydmVyQXBwbHkocmVjb3JkKVxuXG4gICAgdHJ5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJlY29yZC5zYXZlKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IHRoaXMucm91dGVkUmVwbGF5U2F2ZUVycm9yKGVycm9yKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBhYmlsaXR5ID0gcmVzb3VyY2UuYWJpbGl0eVxuXG4gICAgICBpZiAoYWJpbGl0eSkge1xuICAgICAgICBjb25zdCBtZW1iZXJJZHMgPSBhd2FpdCBNb2RlbENsYXNzXG4gICAgICAgICAgLmFjY2Vzc2libGVGb3IocmVzb3VyY2Uuc3luY0FiaWxpdHlBY3Rpb24oXCJjcmVhdGVcIiksIGFiaWxpdHkpXG4gICAgICAgICAgLndoZXJlKHtbcHJpbWFyeUtleV06IHJlY29yZC5pZCgpfSlcbiAgICAgICAgICAucGx1Y2socHJpbWFyeUtleSlcblxuICAgICAgICBpZiAobWVtYmVySWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGF3YWl0IHJlY29yZC5kZXN0cm95KClcblxuICAgICAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoYFN5bmMgY3JlYXRlIGRlbmllZCBmb3I6ICR7bXV0YXRpb24ucmVzb3VyY2VUeXBlfS5gLCB7XG4gICAgICAgICAgICBjb2RlOiByZXNvdXJjZS5zeW5jQXV0aG9yaXphdGlvbkZhaWx1cmVSZWFzb24oe2FjdGlvbjogXCJjcmVhdGVcIiwgbXV0YXRpb259KSB8fCBcImFjY2Vzcy1kZW5pZWRcIlxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlY29yZFxuICAgIH0gZmluYWxseSB7XG4gICAgICByZWxlYXNlU2VydmVyQXBwbHkoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIHJvdXRlZCByZWNvcmQsIGNvbnZlcnRpbmcgbW9kZWwgdmFsaWRhdGlvbiBmYWlsdXJlcyBpbnRvXG4gICAqIGNsaWVudC1zYWZlIHBlci1zeW5jIGVycm9ycyBjYXJyeWluZyB0aGUgdHJhbnNsYXRlZCB2YWxpZGF0aW9uIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IHJlY29yZCAtIFJlY29yZCB0byBzYXZlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgd2hlbiBzYXZlZC5cbiAgICovXG4gIGFzeW5jIHNhdmVSb3V0ZWRSZXBsYXlSZWNvcmQocmVjb3JkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlY29yZC5zYXZlKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgdGhpcy5yb3V0ZWRSZXBsYXlTYXZlRXJyb3IoZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgYSByb3V0ZWQgc2F2ZS9jcmVhdGUgZmFpbHVyZTogbW9kZWwgdmFsaWRhdGlvbiBlcnJvcnMgYmVjb21lXG4gICAqIGNsaWVudC1zYWZlIGVycm9ycyB3aXRoIHRoZWlyIHRyYW5zbGF0ZWQgbWVzc2FnZXMsIGV2ZXJ5dGhpbmcgZWxzZVxuICAgKiBwcm9wYWdhdGVzIHVuY2hhbmdlZC5cbiAgICogQHBhcmFtIHs/fSBlcnJvciAtIFRocm93biBzYXZlL2NyZWF0ZSBlcnJvci5cbiAgICogQHJldHVybnMge0Vycm9yfSBFcnJvciB0byByZXRocm93LlxuICAgKi9cbiAgcm91dGVkUmVwbGF5U2F2ZUVycm9yKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICByZXR1cm4gVmVsb2Npb3VzRXJyb3Iuc2FmZShlcnJvci5tZXNzYWdlLCB7Y2F1c2U6IGVycm9yLCBjb2RlOiBcInZhbGlkYXRpb24tZXJyb3JcIn0pXG4gICAgfVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbiBhcHBseSByZXN1bHQgZm9yIHN0YWxlIG11dGF0aW9ucyB0aGF0IHNob3VsZCBub3QgdG91Y2ggZG9tYWluIG1vZGVscy5cbiAgICogQHBhcmFtIHt7YWN0b3I6ID8sIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsID8+LCBleGlzdGluZ1N5bmM6ID8sIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufX0gX2FyZ3MgLSBBY3RvciwgYmF0Y2ggY29udGV4dCwgZXhpc3Rpbmcgc3luYyByb3csIGFuZCBtdXRhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IFByb2plY3Qtc3BlY2lmaWMgYXBwbHkgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgc2tpcHBlZFJlcGxheU11dGF0aW9uKF9hcmdzKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0cyBvbmUgbm9ybWFsaXplZCBtdXRhdGlvbiBpbnRvIHRoZSBhcHAgc3luYy9jaGFuZ2Ugc3RvcmUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGEgc3RhbGUtZ3VhcmRlZCBzeW5jLW1vZGVsIHVwc2VydCAod2l0aCBzZXJ2ZXIgcmUtc2VxdWVuY2luZyBvblxuICAgKiB1cGRhdGVzKSB3aGVuIGEgc3luYyBtb2RlbCBpcyBjb25maWd1cmVkOyBvdGhlcndpc2UgYXBwcyBvdmVycmlkZSB0aGlzIGhvb2suXG4gICAqIEBwYXJhbSB7e2FjdG9yOiA/LCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCA/PiwgZXhpc3RpbmdTeW5jOiA/LCBhcHBseVJlc3VsdDogPywgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb24sIHNob3VsZEFwcGx5OiBib29sZWFufX0gYXJncyAtIFJlcGxheSBwZXJzaXN0ZW5jZSBhcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcGVyc2lzdFJlcGxheU11dGF0aW9uKHthY3RvciwgYXBwbHlSZXN1bHQsIGNvbnRleHQsIGV4aXN0aW5nU3luYywgbXV0YXRpb24sIHNob3VsZEFwcGx5fSkge1xuICAgIGlmICghdGhpcy5zeW5jTW9kZWwpIHJldHVyblxuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMucmVwbGF5UGVyc2lzdEF0dHJpYnV0ZXMoe2FjdG9yLCBtdXRhdGlvbn0pXG5cbiAgICAvLyBTdGFsZSByZXBsYXlzIG5ldmVyIGFwcGxpZWQgYW55dGhpbmcsIHNvIHRoZSBhcHBseVJlc3VsdC1kcml2ZW4gZXh0ZW5zaW9uXG4gICAgLy8gaG9va3MgbXVzdCBub3QgcnVuIGFnYWluc3QgdGhlIGRlZmF1bHQgbnVsbCBza2lwcGVkIHJlc3VsdC5cbiAgICBpZiAodGhpcy5wZXJzaXN0RXh0cmFBdHRyaWJ1dGVzICYmIHNob3VsZEFwcGx5KSB7XG4gICAgICBPYmplY3QuYXNzaWduKGF0dHJpYnV0ZXMsIHRoaXMucGVyc2lzdEV4dHJhQXR0cmlidXRlcyh7YWN0b3IsIGFwcGx5UmVzdWx0LCBjb250ZXh0LCBleGlzdGluZ1N5bmMsIG11dGF0aW9uLCBzaG91bGRBcHBseX0pKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBlcnNpc3RTZXJpYWxpemVkRGF0YSAmJiBzaG91bGRBcHBseSkge1xuICAgICAgY29uc3Qgc2VyaWFsaXplZERhdGEgPSB0aGlzLnBlcnNpc3RTZXJpYWxpemVkRGF0YSh7YXBwbHlSZXN1bHQsIG11dGF0aW9ufSlcblxuICAgICAgaWYgKHNlcmlhbGl6ZWREYXRhICE9PSB1bmRlZmluZWQgJiYgc2VyaWFsaXplZERhdGEgIT09IG51bGwpIHtcbiAgICAgICAgYXR0cmlidXRlcy5kYXRhID0gdHlwZW9mIHNlcmlhbGl6ZWREYXRhID09PSBcInN0cmluZ1wiID8gc2VyaWFsaXplZERhdGEgOiBKU09OLnN0cmluZ2lmeShzZXJpYWxpemVkRGF0YSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXhpc3RpbmdTeW5jKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0NsaWVudFVwZGF0ZWRBdCA9IHRoaXMuZXhpc3RpbmdSZXBsYXlTeW5jQ2xpZW50VXBkYXRlZEF0KGV4aXN0aW5nU3luYylcblxuICAgICAgaWYgKGV4aXN0aW5nQ2xpZW50VXBkYXRlZEF0ICYmIG11dGF0aW9uLmNsaWVudFVwZGF0ZWRBdCA8PSBleGlzdGluZ0NsaWVudFVwZGF0ZWRBdCkgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgdXBzZXJ0U3luY1Jvdyh7YXR0cmlidXRlcywgZXhpc3RpbmdTeW5jLCBzeW5jTW9kZWw6IHRoaXMuc3luY01vZGVsfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHN5bmMtbW9kZWwgYXR0cmlidXRlcyBwZXJzaXN0ZWQgYnkgdGhlIG1vZGVsLWJhY2tlZCBkZWZhdWx0LlxuICAgKiBAcGFyYW0ge3thY3RvcjogPywgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259fSBhcmdzIC0gQWN0b3IgYW5kIG11dGF0aW9uLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgPz59IFN5bmMgcm93IGF0dHJpYnV0ZXMuXG4gICAqL1xuICByZXBsYXlQZXJzaXN0QXR0cmlidXRlcyh7YWN0b3IsIG11dGF0aW9ufSkge1xuICAgIHJldHVybiB7XG4gICAgICBbdGhpcy5hY3RvckZvcmVpZ25LZXlDb2x1bW5dOiB0aGlzLnJlcGxheUFjdG9ySWQoYWN0b3IpLFxuICAgICAgY2xpZW50X3VwZGF0ZWRfYXQ6IG11dGF0aW9uLmNsaWVudFVwZGF0ZWRBdCxcbiAgICAgIGRhdGE6IG11dGF0aW9uLnNlcmlhbGl6ZWREYXRhLFxuICAgICAgcmVzb3VyY2VfaWQ6IG11dGF0aW9uLnJlc291cmNlSWQsXG4gICAgICByZXNvdXJjZV90eXBlOiBtdXRhdGlvbi5yZXNvdXJjZVR5cGUsXG4gICAgICBzeW5jX3R5cGU6IG11dGF0aW9uLnN5bmNUeXBlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2lkZSBlZmZlY3RzIGFmdGVyIGEgc3VjY2Vzc2Z1bCBtdXRhdGlvbiByZXBsYXkgYW5kIHBlcnNpc3RlbmNlLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBmYW5uaW5nIHRoZSBhcHBsaWVkIHJlc3VsdCBvdXQgdGhyb3VnaCB0aGUgY29uZmlndXJlZFxuICAgKiBkZWNsYXJhdGl2ZSBicm9hZGNhc3RzLlxuICAgKiBAcGFyYW0ge3thY3RvcjogPywgY29udGV4dDogUmVjb3JkPHN0cmluZywgPz4sIGV4aXN0aW5nU3luYzogPywgYXBwbHlSZXN1bHQ6ID8sIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9uLCBzaG91bGRBcHBseTogYm9vbGVhbn19IGFyZ3MgLSBSZXBsYXkgc2lkZS1lZmZlY3QgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGFmdGVyUmVwbGF5TXV0YXRpb24oYXJncykge1xuICAgIGlmICghdGhpcy5icm9hZGNhc3RzIHx8ICF0aGlzLmJyb2FkY2FzdGVyKSByZXR1cm5cbiAgICAvLyBTdGFsZSByZXBsYXlzIG5ldmVyIGFwcGxpZWQgYW55dGhpbmcgLSBicm9hZGNhc3RpbmcgdGhlaXIgc2tpcHBlZCByZXN1bHRzXG4gICAgLy8gd291bGQgZmFuIG91dCBzdGFsZSBzaWRlIGVmZmVjdHMgKG9yIGNyYXNoIG9uIHRoZSBkZWZhdWx0IG51bGwgYXBwbHlSZXN1bHQpLlxuICAgIGlmICghYXJncy5zaG91bGRBcHBseSkgcmV0dXJuXG5cbiAgICBhd2FpdCBkZWxpdmVyRGVjbGFyZWRCcm9hZGNhc3RzKHthcmdzLCBicm9hZGNhc3RlcjogdGhpcy5icm9hZGNhc3RlciwgYnJvYWRjYXN0czogdGhpcy5icm9hZGNhc3RzfSlcbiAgfVxufVxuIl19
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Optional client-declared sync scope carried on a changes request.
|
|
3
|
-
* @typedef {object} SerializedChangesScope
|
|
4
|
-
* @property {Record<string, ?>} conditions - Plain attribute conditions from the client query.
|
|
5
|
-
* @property {string | null} resourceType - Client resource/model name the scope was declared for, or null for the all-types (user) scope: one scope covering every resource type this resource authorizes for the caller, so a sync authorizes once however many types it serves.
|
|
6
|
-
* @property {string[] | null} resourceTypes - For the all-types scope, the resource types the client can apply. A cheap delivery/type filter only - it narrows, never widens, what the app's authorization already allows. Null for a type-declared scope.
|
|
7
|
-
*/
|
|
8
1
|
/**
|
|
9
2
|
* Base resource for Velocious sync endpoints.
|
|
10
3
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-resource-base.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-resource-base.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sync-resource-base.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-resource-base.js"],"names":[],"mappings":"AAkBA;;;;;;;;GAQG;AACH,sCAHqE,WAAW,SAAnE,cAAe,6BAA6B,EAAE,OAAQ;IAIjE;;;;OAIG;IACH,2BAFU,cAAc,mCAAmC,EAAE,OAAO,GAAG,SAAS,CAE3C;IAErC;;;;iCAI6B;IAC7B,2BADU,MAAM,EAAE,GAAG,IAAI,CACO;IAgBhC;;;;;;;OAOG;IACH,oCAJG;QAAkG,KAAK,EAA/F,OAAO,6CAA6C,EAAE,6BAA6B;QACK,MAAM,EAA9F,OAAO,6CAA6C,EAAE,2BAA2B;KACzF,GAAU,OAAO,CA6BnB;IAMD;;;OAGG;IACH,WAFa,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAStC;IAED;;;OAGG;IACH,UAFa,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAQtC;IAED;;;;OAIG;IACH,qBAHW,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GACf,sBAAsB,GAAG,IAAI,CAuBzC;IAED;;;;OAIG;IACH,iCAHW,OAAC,GACC,MAAM,EAAE,GAAG,IAAI,CAQ3B;IAED;;;;OAIG;IACH,qCAHW;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;QAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAAA;KAAC,GAC/D;QAAC,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAAA;KAAC,CAQvD;IAED;;;;;;OAMG;IACH,sBAFa,OAAO,mCAAmC,EAAE,OAAO,CAY/D;IAED;;;OAGG;IACH,qBAFa,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAI7B;IAED;;;OAGG;IACH,kBAFa,cAAc,6BAA6B,EAAE,OAAO,CAQhE;IAED;;;;OAIG;IACH,wBAHW;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;QAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAAA;KAAC,GAC/D,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;;OAIG;IACH,yBAHW;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;QAAC,KAAK,EAAE,OAAO,wCAAwC,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAAA;KAAC,GAChI,IAAI,CAIhB;IAED;;;;;;;;;;;OAWG;IACH,2CAHW;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;QAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAC,CAAA;KAAC,GACjH,OAAO,CAAC,OAAO,CAAC,CAS5B;IAED;;;;;;;;OAQG;IACH,sBAFa,cAAc,mCAAmC,EAAE,OAAO,CAOtE;CACF;;;;;;;;gBAjQa,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;;;kBACjB,MAAM,GAAG,IAAI;;;;mBACb,MAAM,EAAE,GAAG,IAAI;;sCAVS,6CAA6C"}
|
|
@@ -4,7 +4,6 @@ import FrontendModelBaseResource from "../frontend-model-resource/base-resource.
|
|
|
4
4
|
import SyncEnvelopeReplayService from "./sync-envelope-replay-service.js";
|
|
5
5
|
import SyncModelChangeFeedService from "./sync-model-change-feed-service.js";
|
|
6
6
|
import VelociousError from "../velocious-error.js";
|
|
7
|
-
const QUICK_SEARCH_COLUMN = "quickSearch";
|
|
8
7
|
/**
|
|
9
8
|
* Optional client-declared sync scope carried on a changes request.
|
|
10
9
|
* @typedef {object} SerializedChangesScope
|
|
@@ -12,6 +11,7 @@ const QUICK_SEARCH_COLUMN = "quickSearch";
|
|
|
12
11
|
* @property {string | null} resourceType - Client resource/model name the scope was declared for, or null for the all-types (user) scope: one scope covering every resource type this resource authorizes for the caller, so a sync authorizes once however many types it serves.
|
|
13
12
|
* @property {string[] | null} resourceTypes - For the all-types scope, the resource types the client can apply. A cheap delivery/type filter only - it narrows, never widens, what the app's authorization already allows. Null for a type-declared scope.
|
|
14
13
|
*/
|
|
14
|
+
const QUICK_SEARCH_COLUMN = "quickSearch";
|
|
15
15
|
/**
|
|
16
16
|
* Base resource for Velocious sync endpoints.
|
|
17
17
|
*
|
|
@@ -229,4 +229,4 @@ export default class SyncResourceBase extends FrontendModelBaseResource {
|
|
|
229
229
|
return ResourceClass.ReplayServiceClass ?? SharedResource?.ReplayServiceClass ?? SyncEnvelopeReplayService;
|
|
230
230
|
}
|
|
231
231
|
}
|
|
232
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1yZXNvdXJjZS1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1yZXNvdXJjZS1iYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFFNUMsT0FBTyx5QkFBeUIsTUFBTSw2Q0FBNkMsQ0FBQTtBQUNuRixPQUFPLHlCQUF5QixNQUFNLG1DQUFtQyxDQUFBO0FBQ3pFLE9BQU8sMEJBQTBCLE1BQU0scUNBQXFDLENBQUE7QUFDNUUsT0FBTyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFFbEQsTUFBTSxtQkFBbUIsR0FBRyxhQUFhLENBQUE7QUFFekM7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLGdCQUFpQixTQUFRLHlCQUF5QjtJQUNyRTs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQTtJQUVyQzs7OztpQ0FJNkI7SUFDN0IsTUFBTSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQTtJQUVoQzs7Ozs7OztPQU9HO0lBQ0gsNkJBQTZCLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQztRQUN2RCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQztZQUFFLE9BQU07UUFFbEQsS0FBSyxDQUFDLDZCQUE2QixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO0lBQ2xFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsZ0JBQWdCLENBQUMsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDO1FBQzlCLE1BQU0sa0JBQWtCLEdBQUcsc0NBQXNDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsa0JBQWtCLENB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QixJQUFJLGNBQWMsRUFBRSxrQkFBa0IsSUFBSSx5QkFBeUIsQ0FBQTtJQUM1RyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Zm9yY2VkTm9uQmxhbmtTdHJpbmd9IGZyb20gXCJ0eXBhbmljXCJcblxuaW1wb3J0IEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2UgZnJvbSBcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIlxuaW1wb3J0IFN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2UgZnJvbSBcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiXG5pbXBvcnQgU3luY01vZGVsQ2hhbmdlRmVlZFNlcnZpY2UgZnJvbSBcIi4vc3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzXCJcbmltcG9ydCBWZWxvY2lvdXNFcnJvciBmcm9tIFwiLi4vdmVsb2Npb3VzLWVycm9yLmpzXCJcblxuY29uc3QgUVVJQ0tfU0VBUkNIX0NPTFVNTiA9IFwicXVpY2tTZWFyY2hcIlxuXG4vKipcbiAqIE9wdGlvbmFsIGNsaWVudC1kZWNsYXJlZCBzeW5jIHNjb3BlIGNhcnJpZWQgb24gYSBjaGFuZ2VzIHJlcXVlc3QuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZXJpYWxpemVkQ2hhbmdlc1Njb3BlXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsID8+fSBjb25kaXRpb25zIC0gUGxhaW4gYXR0cmlidXRlIGNvbmRpdGlvbnMgZnJvbSB0aGUgY2xpZW50IHF1ZXJ5LlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSByZXNvdXJjZVR5cGUgLSBDbGllbnQgcmVzb3VyY2UvbW9kZWwgbmFtZSB0aGUgc2NvcGUgd2FzIGRlY2xhcmVkIGZvciwgb3IgbnVsbCBmb3IgdGhlIGFsbC10eXBlcyAodXNlcikgc2NvcGU6IG9uZSBzY29wZSBjb3ZlcmluZyBldmVyeSByZXNvdXJjZSB0eXBlIHRoaXMgcmVzb3VyY2UgYXV0aG9yaXplcyBmb3IgdGhlIGNhbGxlciwgc28gYSBzeW5jIGF1dGhvcml6ZXMgb25jZSBob3dldmVyIG1hbnkgdHlwZXMgaXQgc2VydmVzLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXSB8IG51bGx9IHJlc291cmNlVHlwZXMgLSBGb3IgdGhlIGFsbC10eXBlcyBzY29wZSwgdGhlIHJlc291cmNlIHR5cGVzIHRoZSBjbGllbnQgY2FuIGFwcGx5LiBBIGNoZWFwIGRlbGl2ZXJ5L3R5cGUgZmlsdGVyIG9ubHkgLSBpdCBuYXJyb3dzLCBuZXZlciB3aWRlbnMsIHdoYXQgdGhlIGFwcCdzIGF1dGhvcml6YXRpb24gYWxyZWFkeSBhbGxvd3MuIE51bGwgZm9yIGEgdHlwZS1kZWNsYXJlZCBzY29wZS5cbiAqL1xuXG4vKipcbiAqIEJhc2UgcmVzb3VyY2UgZm9yIFZlbG9jaW91cyBzeW5jIGVuZHBvaW50cy5cbiAqXG4gKiBWZWxvY2lvdXMgb3ducyB0aGUgY2hhbmdlcy9yZXBsYXkgb3JjaGVzdHJhdGlvbiAoc2NvcGUgcGFyc2luZywgZmVlZCBwYWdpbmcsXG4gKiByZXBsYXkgZGVsZWdhdGlvbiwgcmVzcG9uc2Ugc2hhcGUpIHdoaWxlIGFwcHMgc3ViY2xhc3MgYW5kIG9ubHkgZGVjbGFyZVxuICogYXV0aG9yaXphdGlvbiwgZmVlZCBzY29waW5nLCBhbmQgdGhlaXIgcmVwbGF5IHNlcnZpY2UuXG4gKiBAdGVtcGxhdGUge3R5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gW1RNb2RlbENsYXNzPXR5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdF1cbiAqIEBhdWdtZW50cyB7RnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZTxUTW9kZWxDbGFzcz59XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bmNSZXNvdXJjZUJhc2UgZXh0ZW5kcyBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFJlcGxheSBzZXJ2aWNlIGNsYXNzIGhhbmRsaW5nIHJlcGxheSBtdXRhdGlvbnMgZm9yIHRoaXMgcmVzb3VyY2UsXG4gICAqIGRlY2xhcmVkIGluc3RlYWQgb2Ygb3ZlcnJpZGluZyB7QGxpbmsgU3luY1Jlc291cmNlQmFzZSNyZXBsYXlTZXJ2aWNlQ2xhc3N9LlxuICAgKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgc3RhdGljIFJlcGxheVNlcnZpY2VDbGFzcyA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBEZWNsYXJhdGl2ZSBxdWljay1zZWFyY2ggdGV4dCBjb2x1bW5zLiBXaGVuIGRlY2xhcmVkLCBhbiBpbmRleCBzZWFyY2ggb25cbiAgICogdGhlIHBzZXVkby1jb2x1bW4gYHF1aWNrU2VhcmNoYCBleHBhbmRzIHRvIGFuIE9SIG9mIExJS0UgY29uZGl0aW9ucyBvdmVyXG4gICAqIHRoZXNlIHJvb3QtdGFibGUgY29sdW1ucyBpbnN0ZWFkIG9mIGhpdHRpbmcgdGhlIGNvbnRyb2xsZXIgZGVmYXVsdC5cbiAgICogQHR5cGUge3N0cmluZ1tdIHwgbnVsbH0gKi9cbiAgc3RhdGljIHF1aWNrU2VhcmNoQ29sdW1ucyA9IG51bGxcblxuICAvKipcbiAgICogQXBwbGllcyBmcm9udGVuZC1tb2RlbCBpbmRleCBzZWFyY2hlcywgZXhwYW5kaW5nIGRlY2xhcmVkIHF1aWNrIHNlYXJjaGVzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFNlYXJjaCBhcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ29udHJvbGxlcn0gYXJncy5jb250cm9sbGVyIC0gQ29udHJvbGxlciBoYW5kbGluZyB0aGUgcXVlcnkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VBbnlRdWVyeX0gYXJncy5xdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlU2VhcmNofSBhcmdzLnNlYXJjaCAtIFNlYXJjaCBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYXBwbHlGcm9udGVuZE1vZGVsSW5kZXhTZWFyY2goe2NvbnRyb2xsZXIsIHF1ZXJ5LCBzZWFyY2h9KSB7XG4gICAgaWYgKHRoaXMuYXBwbHlRdWlja1NlYXJjaCh7cXVlcnksIHNlYXJjaH0pKSByZXR1cm5cblxuICAgIHN1cGVyLmFwcGx5RnJvbnRlbmRNb2RlbEluZGV4U2VhcmNoKHtjb250cm9sbGVyLCBxdWVyeSwgc2VhcmNofSlcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmRzIGEgYHF1aWNrU2VhcmNoYCBwc2V1ZG8tY29sdW1uIHNlYXJjaCBpbnRvIGFuIE9SIG9mIExJS0UgY29uZGl0aW9uc1xuICAgKiBvdmVyIHRoZSBkZWNsYXJlZCB7QGxpbmsgU3luY1Jlc291cmNlQmFzZS5xdWlja1NlYXJjaENvbHVtbnN9LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFNlYXJjaCBhcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQW55UXVlcnl9IGFyZ3MucXVlcnkgLSBRdWVyeSB0byBmaWx0ZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VTZWFyY2h9IGFyZ3Muc2VhcmNoIC0gU2VhcmNoIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBzZWFyY2ggd2FzIGhhbmRsZWQgYXMgYSBxdWljayBzZWFyY2guXG4gICAqL1xuICBhcHBseVF1aWNrU2VhcmNoKHtxdWVyeSwgc2VhcmNofSkge1xuICAgIGNvbnN0IHF1aWNrU2VhcmNoQ29sdW1ucyA9IC8qKiBAdHlwZSB7dHlwZW9mIFN5bmNSZXNvdXJjZUJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKS5xdWlja1NlYXJjaENvbHVtbnNcblxuICAgIGlmICghcXVpY2tTZWFyY2hDb2x1bW5zIHx8IHF1aWNrU2VhcmNoQ29sdW1ucy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZVxuICAgIGlmIChzZWFyY2gucGF0aC5sZW5ndGggPiAwIHx8IHNlYXJjaC5jb2x1bW4gIT09IFFVSUNLX1NFQVJDSF9DT0xVTU4pIHJldHVybiBmYWxzZVxuXG4gICAgaWYgKHNlYXJjaC5vcGVyYXRvciAhPT0gXCJsaWtlXCIpIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoXCJTeW5jIHF1aWNrIHNlYXJjaCBtdXN0IHVzZSB0aGUgbGlrZSBvcGVyYXRvci5cIiwge2NvZGU6IFwic3luYy1pbnZhbGlkLXF1aWNrLXNlYXJjaFwifSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNlYXJjaC52YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShcIlN5bmMgcXVpY2sgc2VhcmNoIG11c3QgYmUgYSBzdHJpbmcuXCIsIHtjb2RlOiBcInN5bmMtaW52YWxpZC1xdWljay1zZWFyY2hcIn0pXG4gICAgfVxuXG4gICAgY29uc3QgdHJpbW1lZFZhbHVlID0gc2VhcmNoLnZhbHVlLnRyaW0oKVxuXG4gICAgaWYgKCF0cmltbWVkVmFsdWUpIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCB0YWJsZVNxbCA9IHF1ZXJ5LmRyaXZlci5xdW90ZVRhYmxlKHF1ZXJ5LmdldFRhYmxlUmVmZXJlbmNlRm9ySm9pbigpKVxuICAgIGNvbnN0IGxpa2VWYWx1ZSA9IGAlJHt0cmltbWVkVmFsdWV9JWBcbiAgICBjb25zdCBjb25kaXRpb25zID0gcXVpY2tTZWFyY2hDb2x1bW5zLm1hcCgoY29sdW1uTmFtZSkgPT4gKFxuICAgICAgYCR7dGFibGVTcWx9LiR7cXVlcnkuZHJpdmVyLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpfSBMSUtFICR7cXVlcnkuZHJpdmVyLnF1b3RlKGxpa2VWYWx1ZSl9YFxuICAgICkpXG5cbiAgICBxdWVyeS53aGVyZShgKCR7Y29uZGl0aW9ucy5qb2luKFwiIE9SIFwiKX0pYClcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyBUaGUgZGVjbGFyYXRpdmUgYHN0YXRpYyB3cml0YWJsZUF0dHJpYnV0ZXNgIHBlcm1pdCBsaXN0IGxpdmVzIG9uXG4gIC8vIEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2Ugc28gZXZlcnkgZnJvbnRlbmQtbW9kZWwgcmVzb3VyY2UgY2FuIGRlY2xhcmVcbiAgLy8gb25lOyBzeW5jIHJlc291cmNlcyBpbmhlcml0IGl0IHVuY2hhbmdlZC5cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0YWJsZSBjaGFuZ2UtZmVlZCBwYWdlIGFmdGVyIGFwcCBhdXRob3JpemF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCA/Pj59IENoYW5nZS1mZWVkIHBhZ2UgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgY2hhbmdlcygpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLnBhcmFtcygpXG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmNoYW5nZXNTY29wZShwYXJhbXMpXG5cbiAgICBhd2FpdCB0aGlzLmF1dGhvcml6ZUNoYW5nZXMoe3BhcmFtcywgc2NvcGV9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hhbmdlRmVlZFNlcnZpY2Uoe3BhcmFtcywgc2NvcGV9KS5jaGFuZ2VzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYXlzIGNsaWVudCBzeW5jIGVudmVsb3BlcyB0aHJvdWdoIHRoZSBhcHAgcmVwbGF5IHNlcnZpY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsID8+Pn0gUmVwbGF5IHJlc3VsdCB3aXRoIHBlci1zeW5jIHN0YXRlcy5cbiAgICovXG4gIGFzeW5jIHJlcGxheSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJ1aWxkUmVwbGF5U2VydmljZSgpLnJlcGxheSh0aGlzLnBhcmFtcygpKVxuXG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiZXJyb3JcIikgcmV0dXJuIHJlc3VsdFxuXG4gICAgcmV0dXJuIHtzdGF0dXM6IFwic3VjY2Vzc1wiLCBzeW5jczogcmVzdWx0LnN5bmNzfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgb3B0aW9uYWwgY2xpZW50LWRlY2xhcmVkIHNjb3BlIGZyb20gcmVxdWVzdCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IHBhcmFtcyAtIFJlcXVlc3QgcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7U2VyaWFsaXplZENoYW5nZXNTY29wZSB8IG51bGx9IFBhcnNlZCBzY29wZSwgb3IgbnVsbCB3aGVuIHRoZSBjbGllbnQgc2VudCBub25lLlxuICAgKi9cbiAgY2hhbmdlc1Njb3BlKHBhcmFtcykge1xuICAgIGNvbnN0IHNjb3BlID0gcGFyYW1zLnNjb3BlXG5cbiAgICBpZiAoc2NvcGUgPT09IHVuZGVmaW5lZCB8fCBzY29wZSA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICAgIGlmICh0eXBlb2Ygc2NvcGUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShzY29wZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3luYyBjaGFuZ2VzIHNjb3BlIG11c3QgYmUgYW4gb2JqZWN0LCBnb3Q6ICR7U3RyaW5nKHNjb3BlKX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlUGFyYW1zID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKHNjb3BlKVxuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IHNjb3BlUGFyYW1zLnJlc291cmNlVHlwZSA9PT0gbnVsbCB8fCBzY29wZVBhcmFtcy5yZXNvdXJjZVR5cGUgPT09IHVuZGVmaW5lZFxuICAgICAgPyBudWxsXG4gICAgICA6IGZvcmNlZE5vbkJsYW5rU3RyaW5nKHNjb3BlUGFyYW1zLnJlc291cmNlVHlwZSwgXCJyZXNvdXJjZVR5cGVcIilcbiAgICBjb25zdCByZXNvdXJjZVR5cGVzID0gdGhpcy5jaGFuZ2VzU2NvcGVSZXNvdXJjZVR5cGVzKHNjb3BlUGFyYW1zLnJlc291cmNlVHlwZXMpXG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHNjb3BlUGFyYW1zLmNvbmRpdGlvbnNcblxuICAgIGlmICghY29uZGl0aW9ucyB8fCB0eXBlb2YgY29uZGl0aW9ucyAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGNvbmRpdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgY2hhbmdlcyBzY29wZS5jb25kaXRpb25zIG11c3QgYmUgYW4gb2JqZWN0LCBnb3Q6ICR7U3RyaW5nKGNvbmRpdGlvbnMpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHtjb25kaXRpb25zOiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoY29uZGl0aW9ucyksIHJlc291cmNlVHlwZSwgcmVzb3VyY2VUeXBlc31cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdGhlIG9wdGlvbmFsIHJlc291cmNlLXR5cGUgbGlzdCBhbiBhbGwtdHlwZXMgc2NvcGUgZGVjbGFyZXMuXG4gICAqIEBwYXJhbSB7P30gdmFsdWUgLSBSYXcgYHNjb3BlLnJlc291cmNlVHlwZXNgIHBhcmFtLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW10gfCBudWxsfSBEZWNsYXJlZCByZXNvdXJjZSB0eXBlcywgb3IgbnVsbCB3aGVuIHRoZSBjbGllbnQgc2VudCBub25lLlxuICAgKi9cbiAgY2hhbmdlc1Njb3BlUmVzb3VyY2VUeXBlcyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgdGhyb3cgbmV3IEVycm9yKGBTeW5jIGNoYW5nZXMgc2NvcGUucmVzb3VyY2VUeXBlcyBtdXN0IGJlIGFuIGFycmF5LCBnb3Q6ICR7U3RyaW5nKHZhbHVlKX1gKVxuXG4gICAgcmV0dXJuIHZhbHVlLm1hcCgocmVzb3VyY2VUeXBlKSA9PiBmb3JjZWROb25CbGFua1N0cmluZyhyZXNvdXJjZVR5cGUsIFwicmVzb3VyY2VUeXBlc1wiKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGNoYW5nZS1mZWVkIHNlcnZpY2Ugc2VydmluZyB0aGlzIGNoYW5nZXMgcmVxdWVzdC5cbiAgICogQHBhcmFtIHt7cGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCA/Piwgc2NvcGU6IFNlcmlhbGl6ZWRDaGFuZ2VzU2NvcGUgfCBudWxsfX0gYXJncyAtIFJlcXVlc3QgcGFyYW1zIGFuZCBwYXJzZWQgc2NvcGUuXG4gICAqIEByZXR1cm5zIHt7Y2hhbmdlczogKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCA/Pj59fSBDaGFuZ2UtZmVlZCBzZXJ2aWNlLlxuICAgKi9cbiAgY2hhbmdlRmVlZFNlcnZpY2Uoe3BhcmFtcywgc2NvcGV9KSB7XG4gICAgcmV0dXJuIG5ldyBTeW5jTW9kZWxDaGFuZ2VGZWVkU2VydmljZSh7XG4gICAgICBtb2RlbENsYXNzOiB0aGlzLnN5bmNNb2RlbENsYXNzKCksXG4gICAgICBwYXJhbXMsXG4gICAgICBzY29wZVF1ZXJ5OiAoe3F1ZXJ5fSkgPT4gdGhpcy5zY29wZUNoYW5nZXNRdWVyeSh7cGFyYW1zLCBxdWVyeSwgc2NvcGV9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBhcHAgcmVwbGF5IHNlcnZpY2UgaGFuZGxpbmcgdGhpcyByZXBsYXkgcmVxdWVzdC4gVGhlIHJlc291cmNlXG4gICAqIGFiaWxpdHksIGNvbnRleHQsIGNvbmZpZ3VyYXRpb24sIGFuZCBsb2NhbHMgYXJlIHBsdW1iZWQgaW4gdW5kZXIgdGhlXG4gICAqIGFwcC1kZWNsYXJlZCB7QGxpbmsgU3luY1Jlc291cmNlQmFzZSNyZXBsYXlTZXJ2aWNlQXJnc30gKGFwcCBhcmdzIHdpbikgc29cbiAgICogdGhlIGRlZmF1bHQgcmVzb3VyY2Utcm91dGVkIHJlcGxheSB3b3JrcyB3aXRob3V0IHdpcmluZy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5kZWZhdWx0fSBSZXBsYXkgc2VydmljZSBpbnN0YW5jZS5cbiAgICovXG4gIGJ1aWxkUmVwbGF5U2VydmljZSgpIHtcbiAgICBjb25zdCBSZXBsYXlTZXJ2aWNlQ2xhc3MgPSB0aGlzLnJlcGxheVNlcnZpY2VDbGFzcygpXG5cbiAgICByZXR1cm4gbmV3IFJlcGxheVNlcnZpY2VDbGFzcyh7XG4gICAgICBhYmlsaXR5OiB0aGlzLmFiaWxpdHksXG4gICAgICBhYmlsaXR5Q29udGV4dDogdGhpcy5nZXRDb250ZXh0KCksXG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbnRyb2xsZXIgPyB0aGlzLmNvbnRyb2xsZXJJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb24oKSA6IHVuZGVmaW5lZCxcbiAgICAgIGxvY2FsczogdGhpcy5nZXRMb2NhbHMoKSxcbiAgICAgIC4uLnRoaXMucmVwbGF5U2VydmljZUFyZ3MoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBjb25zdHJ1Y3RvciBhcmdzIGZvciB0aGUgYXBwIHJlcGxheSBzZXJ2aWNlLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgPz59IFJlcGxheSBzZXJ2aWNlIGNvbnN0cnVjdG9yIGFyZ3MuXG4gICAqL1xuICByZXBsYXlTZXJ2aWNlQXJncygpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzeW5jIG1vZGVsIGNsYXNzIGJhY2tpbmcgdGhlIGNoYW5nZSBmZWVkLlxuICAgKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBTeW5jIG1vZGVsIGNsYXNzLlxuICAgKi9cbiAgc3luY01vZGVsQ2xhc3MoKSB7XG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIFN5bmNSZXNvdXJjZUJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKS5Nb2RlbENsYXNzXG5cbiAgICBpZiAoIW1vZGVsQ2xhc3MpIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IG11c3QgZGVmaW5lIHN0YXRpYyBNb2RlbENsYXNzYClcblxuICAgIHJldHVybiBtb2RlbENsYXNzXG4gIH1cblxuICAvKipcbiAgICogQXV0aG9yaXplcyB0aGUgY3VycmVudCBjb250ZXh0IGZvciByZWFkaW5nIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcy5cbiAgICogQHBhcmFtIHt7cGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCA/Piwgc2NvcGU6IFNlcmlhbGl6ZWRDaGFuZ2VzU2NvcGUgfCBudWxsfX0gX2FyZ3MgLSBSZXF1ZXN0IHBhcmFtcyBhbmQgcGFyc2VkIHNjb3BlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgd2hlbiBhY2Nlc3MgaXMgYWxsb3dlZDsgdGhyb3dzIG90aGVyd2lzZS5cbiAgICovXG4gIGFzeW5jIGF1dGhvcml6ZUNoYW5nZXMoX2FyZ3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jUmVzb3VyY2VCYXNlI2F1dGhvcml6ZUNoYW5nZXMgbXVzdCBiZSBpbXBsZW1lbnRlZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYXBwIHZpc2liaWxpdHkgc2NvcGluZyBvbnRvIHRoZSBjaGFuZ2UtZmVlZCBxdWVyeS5cbiAgICogQHBhcmFtIHt7cGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCA/PiwgcXVlcnk6IGltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQsIHNjb3BlOiBTZXJpYWxpemVkQ2hhbmdlc1Njb3BlIHwgbnVsbH19IF9hcmdzIC0gUmVxdWVzdCBwYXJhbXMsIGZlZWQgcXVlcnksIGFuZCBwYXJzZWQgc2NvcGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2NvcGVDaGFuZ2VzUXVlcnkoX2FyZ3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jUmVzb3VyY2VCYXNlI3Njb3BlQ2hhbmdlc1F1ZXJ5IG11c3QgYmUgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgb25lIHB1Ymxpc2hlZCBjaGFuZ2UgaXMgZGVsaXZlcmFibGUgdG8gYSB1c2VyLXNjb3BlXG4gICAqIHN1YnNjcmlwdGlvbiAodGhlIGZyYW1ld29yayBzeW5jIGNoYW5uZWwncyBwZXItZGVsaXZlcnkgYWNjZXNzIHJlLWNoZWNrKS5cbiAgICogVGhlIGRlZmF1bHQgcmV1c2VzIHRoZSBhcHAncyBhYmlsaXR5IHNjb3Bpbmc6IGl0IGFwcGxpZXNcbiAgICoge0BsaW5rIFN5bmNSZXNvdXJjZUJhc2Ujc2NvcGVDaGFuZ2VzUXVlcnl9IHRvIHRoZSBjaGFuZ2UtZmVlZCBtb2RlbCDigJQgd2hpY2hcbiAgICogZm9yIGFuIGVtcHR5LWNvbmRpdGlvbnMgdXNlciBzY29wZSBmYWxscyBiYWNrIHRvIGFiaWxpdHkgc2NvcGluZyDigJQgYW5kXG4gICAqIGNoZWNrcyB3aGV0aGVyIHRoZSBwdWJsaXNoZWQgY2hhbmdlJ3MgZmVlZCByb3cgaXMgdmlzaWJsZSB3aXRoaW4gdGhhdFxuICAgKiBzY29wZS4gQXBwcyBnZXQgdGhpcyBmb3IgZnJlZSBmcm9tIHRoZSBzY29waW5nIHRoZXkgYWxyZWFkeSBkZWNsYXJlZDtcbiAgICogb3ZlcnJpZGUgb25seSBmb3IgY3VzdG9tIHBlci1kZWxpdmVyeSBydWxlcy5cbiAgICogQHBhcmFtIHt7cGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCA/Piwgc2NvcGU6IFNlcmlhbGl6ZWRDaGFuZ2VzU2NvcGUgfCBudWxsLCBzeW5jOiB7cmVzb3VyY2VJZDogc3RyaW5nLCByZXNvdXJjZVR5cGU6IHN0cmluZ319fSBhcmdzIC0gUmVxdWVzdCBwYXJhbXMsIHN1YnNjcmlwdGlvbiBzY29wZSwgYW5kIHRoZSBwdWJsaXNoZWQgY2hhbmdlJ3MgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIHRoZSBjaGFuZ2UgbWF5IGJlIGRlbGl2ZXJlZCB0byB0aGlzIHN1YnNjcmlwdGlvbi5cbiAgICovXG4gIGFzeW5jIGNoYW5nZURlbGl2ZXJhYmxlKHtwYXJhbXMsIHNjb3BlLCBzeW5jfSkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zeW5jTW9kZWxDbGFzcygpLndoZXJlKHt9KVxuXG4gICAgdGhpcy5zY29wZUNoYW5nZXNRdWVyeSh7cGFyYW1zLCBxdWVyeSwgc2NvcGV9KVxuICAgIHF1ZXJ5LndoZXJlKHtyZXNvdXJjZV9pZDogU3RyaW5nKHN5bmMucmVzb3VyY2VJZCksIHJlc291cmNlX3R5cGU6IFN0cmluZyhzeW5jLnJlc291cmNlVHlwZSl9KVxuXG4gICAgcmV0dXJuIEJvb2xlYW4oYXdhaXQgcXVlcnkuZmlyc3QoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcmVwbGF5IHNlcnZpY2UgY2xhc3MgaGFuZGxpbmcgcmVwbGF5IG11dGF0aW9uczogdGhlXG4gICAqIGRlY2xhcmF0aXZlIHtAbGluayBTeW5jUmVzb3VyY2VCYXNlLlJlcGxheVNlcnZpY2VDbGFzc30gc3RhdGljIChzaGFyZWRcbiAgICogcmVzb3VyY2VzIGluY2x1ZGVkKSB3aGVuIGRlY2xhcmVkLCBvdGhlcndpc2VcbiAgICoge0BsaW5rIFN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2V9LCB3aGljaCByZXNvdXJjZS1yb3V0ZXMgbXV0YXRpb25zIHRocm91Z2hcbiAgICogdGhlIHBsdW1iZWQgY29uZmlndXJhdGlvbiByZWdpc3RyeS4gQXBwcyBkZWNsYXJlIHRoZSBzdGF0aWMgaW5zdGVhZCBvZlxuICAgKiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5kZWZhdWx0fSBSZXBsYXkgc2VydmljZSBjbGFzcy5cbiAgICovXG4gIHJlcGxheVNlcnZpY2VDbGFzcygpIHtcbiAgICBjb25zdCBSZXNvdXJjZUNsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgU3luY1Jlc291cmNlQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgU2hhcmVkUmVzb3VyY2UgPSAvKiogQHR5cGUge3R5cGVvZiBTeW5jUmVzb3VyY2VCYXNlIHwgbnVsbH0gKi8gKFJlc291cmNlQ2xhc3Muc2hhcmVkUmVzb3VyY2VDbGFzcygpID8/IG51bGwpXG5cbiAgICByZXR1cm4gUmVzb3VyY2VDbGFzcy5SZXBsYXlTZXJ2aWNlQ2xhc3MgPz8gU2hhcmVkUmVzb3VyY2U/LlJlcGxheVNlcnZpY2VDbGFzcyA/PyBTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlXG4gIH1cbn1cbiJdfQ==
|
|
232
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1yZXNvdXJjZS1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1yZXNvdXJjZS1iYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFFNUMsT0FBTyx5QkFBeUIsTUFBTSw2Q0FBNkMsQ0FBQTtBQUNuRixPQUFPLHlCQUF5QixNQUFNLG1DQUFtQyxDQUFBO0FBQ3pFLE9BQU8sMEJBQTBCLE1BQU0scUNBQXFDLENBQUE7QUFDNUUsT0FBTyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFFbEQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxhQUFhLENBQUE7QUFFekM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLGdCQUFpQixTQUFRLHlCQUF5QjtJQUNyRTs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQTtJQUVyQzs7OztpQ0FJNkI7SUFDN0IsTUFBTSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQTtJQUVoQzs7Ozs7OztPQU9HO0lBQ0gsNkJBQTZCLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQztRQUN2RCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQztZQUFFLE9BQU07UUFFbEQsS0FBSyxDQUFDLDZCQUE2QixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO0lBQ2xFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsZ0JBQWdCLENBQUMsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDO1FBQzlCLE1BQU0sa0JBQWtCLEdBQUcsc0NBQXNDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsa0JBQWtCLENBQUE7UUFFdkcsSUFBSSxDQUFDLGtCQUFrQixJQUFJLGtCQUFrQixDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUE7UUFDeEUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxtQkFBbUI7WUFBRSxPQUFPLEtBQUssQ0FBQTtRQUVqRixJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDL0IsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLCtDQUErQyxFQUFFLEVBQUMsSUFBSSxFQUFFLDJCQUEyQixFQUFDLENBQUMsQ0FBQTtRQUNqSCxDQUFDO1FBRUQsSUFBSSxPQUFPLE1BQU0sQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDckMsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxFQUFFLEVBQUMsSUFBSSxFQUFFLDJCQUEyQixFQUFDLENBQUMsQ0FBQTtRQUN2RyxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUV4QyxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRTlCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUE7UUFDMUUsTUFBTSxTQUFTLEdBQUcsSUFBSSxZQUFZLEdBQUcsQ0FBQTtRQUNyQyxNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQ3hELEdBQUcsUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQzVGLENBQUMsQ0FBQTtRQUVGLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUUzQyxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxtRUFBbUU7SUFDbkUseUVBQXlFO0lBQ3pFLDRDQUE0QztJQUU1Qzs7O09BR0c7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQTtRQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRXZDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7UUFFNUMsT0FBTyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQ2hFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsTUFBTTtRQUNWLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBRXBFLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxPQUFPO1lBQUUsT0FBTyxNQUFNLENBQUE7UUFFNUMsT0FBTyxFQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUMsQ0FBQTtJQUNqRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQVksQ0FBQyxNQUFNO1FBQ2pCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUE7UUFFMUIsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFdEQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RELE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDaEYsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLGdDQUFnQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDNUQsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLFlBQVksS0FBSyxJQUFJLElBQUksV0FBVyxDQUFDLFlBQVksS0FBSyxTQUFTO1lBQzlGLENBQUMsQ0FBQyxJQUFJO1lBQ04sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUE7UUFDbEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUMvRSxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFBO1FBRXpDLElBQUksQ0FBQyxVQUFVLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUMvRSxNQUFNLElBQUksS0FBSyxDQUFDLHlEQUF5RCxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ2hHLENBQUM7UUFFRCxPQUFPLEVBQUMsVUFBVSxFQUFFLGdDQUFnQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBQyxDQUFBO0lBQ2pHLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gseUJBQXlCLENBQUMsS0FBSztRQUM3QixJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUV0RCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRXRILE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsb0JBQW9CLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUE7SUFDekYsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxpQkFBaUIsQ0FBQyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7UUFDL0IsT0FBTyxJQUFJLDBCQUEwQixDQUFDO1lBQ3BDLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ2pDLE1BQU07WUFDTixVQUFVLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBQyxDQUFDO1NBQ3hFLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxrQkFBa0I7UUFDaEIsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtRQUVwRCxPQUFPLElBQUksa0JBQWtCLENBQUM7WUFDNUIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLGNBQWMsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3pGLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3hCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1NBQzVCLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxpQkFBaUI7UUFDZixPQUFPLEVBQUUsQ0FBQTtJQUNYLENBQUM7SUFFRDs7O09BR0c7SUFDSCxjQUFjO1FBQ1osTUFBTSxVQUFVLEdBQUcsc0NBQXNDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxDQUFBO1FBRXZGLElBQUksQ0FBQyxVQUFVO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxnQ0FBZ0MsQ0FBQyxDQUFBO1FBRTFGLE9BQU8sVUFBVSxDQUFBO0lBQ25CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUs7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFBO0lBQzFFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsS0FBSztRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUE7SUFDM0UsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUM7UUFDM0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUU3QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7UUFDOUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQTtRQUU3RixPQUFPLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ3JDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILGtCQUFrQjtRQUNoQixNQUFNLGFBQWEsR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUMvRSxNQUFNLGNBQWMsR0FBRyw2Q0FBNkMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFBO1FBRWxILE9BQU8sYUFBYSxDQUFDLGtCQUFrQixJQUFJLGNBQWMsRUFBRSxrQkFBa0IsSUFBSSx5QkFBeUIsQ0FBQTtJQUM1RyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Zm9yY2VkTm9uQmxhbmtTdHJpbmd9IGZyb20gXCJ0eXBhbmljXCJcblxuaW1wb3J0IEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2UgZnJvbSBcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIlxuaW1wb3J0IFN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2UgZnJvbSBcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiXG5pbXBvcnQgU3luY01vZGVsQ2hhbmdlRmVlZFNlcnZpY2UgZnJvbSBcIi4vc3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzXCJcbmltcG9ydCBWZWxvY2lvdXNFcnJvciBmcm9tIFwiLi4vdmVsb2Npb3VzLWVycm9yLmpzXCJcblxuLyoqXG4gKiBPcHRpb25hbCBjbGllbnQtZGVjbGFyZWQgc3luYyBzY29wZSBjYXJyaWVkIG9uIGEgY2hhbmdlcyByZXF1ZXN0LlxuICogQHR5cGVkZWYge29iamVjdH0gU2VyaWFsaXplZENoYW5nZXNTY29wZVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/Pn0gY29uZGl0aW9ucyAtIFBsYWluIGF0dHJpYnV0ZSBjb25kaXRpb25zIGZyb20gdGhlIGNsaWVudCBxdWVyeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gcmVzb3VyY2VUeXBlIC0gQ2xpZW50IHJlc291cmNlL21vZGVsIG5hbWUgdGhlIHNjb3BlIHdhcyBkZWNsYXJlZCBmb3IsIG9yIG51bGwgZm9yIHRoZSBhbGwtdHlwZXMgKHVzZXIpIHNjb3BlOiBvbmUgc2NvcGUgY292ZXJpbmcgZXZlcnkgcmVzb3VyY2UgdHlwZSB0aGlzIHJlc291cmNlIGF1dGhvcml6ZXMgZm9yIHRoZSBjYWxsZXIsIHNvIGEgc3luYyBhdXRob3JpemVzIG9uY2UgaG93ZXZlciBtYW55IHR5cGVzIGl0IHNlcnZlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW10gfCBudWxsfSByZXNvdXJjZVR5cGVzIC0gRm9yIHRoZSBhbGwtdHlwZXMgc2NvcGUsIHRoZSByZXNvdXJjZSB0eXBlcyB0aGUgY2xpZW50IGNhbiBhcHBseS4gQSBjaGVhcCBkZWxpdmVyeS90eXBlIGZpbHRlciBvbmx5IC0gaXQgbmFycm93cywgbmV2ZXIgd2lkZW5zLCB3aGF0IHRoZSBhcHAncyBhdXRob3JpemF0aW9uIGFscmVhZHkgYWxsb3dzLiBOdWxsIGZvciBhIHR5cGUtZGVjbGFyZWQgc2NvcGUuXG4gKi9cbmNvbnN0IFFVSUNLX1NFQVJDSF9DT0xVTU4gPSBcInF1aWNrU2VhcmNoXCJcblxuLyoqXG4gKiBCYXNlIHJlc291cmNlIGZvciBWZWxvY2lvdXMgc3luYyBlbmRwb2ludHMuXG4gKlxuICogVmVsb2Npb3VzIG93bnMgdGhlIGNoYW5nZXMvcmVwbGF5IG9yY2hlc3RyYXRpb24gKHNjb3BlIHBhcnNpbmcsIGZlZWQgcGFnaW5nLFxuICogcmVwbGF5IGRlbGVnYXRpb24sIHJlc3BvbnNlIHNoYXBlKSB3aGlsZSBhcHBzIHN1YmNsYXNzIGFuZCBvbmx5IGRlY2xhcmVcbiAqIGF1dGhvcml6YXRpb24sIGZlZWQgc2NvcGluZywgYW5kIHRoZWlyIHJlcGxheSBzZXJ2aWNlLlxuICogQHRlbXBsYXRlIHt0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IFtUTW9kZWxDbGFzcz10eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRdXG4gKiBAYXVnbWVudHMge0Zyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2U8VE1vZGVsQ2xhc3M+fVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeW5jUmVzb3VyY2VCYXNlIGV4dGVuZHMgRnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBSZXBsYXkgc2VydmljZSBjbGFzcyBoYW5kbGluZyByZXBsYXkgbXV0YXRpb25zIGZvciB0aGlzIHJlc291cmNlLFxuICAgKiBkZWNsYXJlZCBpbnN0ZWFkIG9mIG92ZXJyaWRpbmcge0BsaW5rIFN5bmNSZXNvdXJjZUJhc2UjcmVwbGF5U2VydmljZUNsYXNzfS5cbiAgICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH1cbiAgICovXG4gIHN0YXRpYyBSZXBsYXlTZXJ2aWNlQ2xhc3MgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogRGVjbGFyYXRpdmUgcXVpY2stc2VhcmNoIHRleHQgY29sdW1ucy4gV2hlbiBkZWNsYXJlZCwgYW4gaW5kZXggc2VhcmNoIG9uXG4gICAqIHRoZSBwc2V1ZG8tY29sdW1uIGBxdWlja1NlYXJjaGAgZXhwYW5kcyB0byBhbiBPUiBvZiBMSUtFIGNvbmRpdGlvbnMgb3ZlclxuICAgKiB0aGVzZSByb290LXRhYmxlIGNvbHVtbnMgaW5zdGVhZCBvZiBoaXR0aW5nIHRoZSBjb250cm9sbGVyIGRlZmF1bHQuXG4gICAqIEB0eXBlIHtzdHJpbmdbXSB8IG51bGx9ICovXG4gIHN0YXRpYyBxdWlja1NlYXJjaENvbHVtbnMgPSBudWxsXG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgZnJvbnRlbmQtbW9kZWwgaW5kZXggc2VhcmNoZXMsIGV4cGFuZGluZyBkZWNsYXJlZCBxdWljayBzZWFyY2hlcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBTZWFyY2ggYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbnRyb2xsZXJ9IGFyZ3MuY29udHJvbGxlciAtIENvbnRyb2xsZXIgaGFuZGxpbmcgdGhlIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQW55UXVlcnl9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZVNlYXJjaH0gYXJncy5zZWFyY2ggLSBTZWFyY2ggcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFwcGx5RnJvbnRlbmRNb2RlbEluZGV4U2VhcmNoKHtjb250cm9sbGVyLCBxdWVyeSwgc2VhcmNofSkge1xuICAgIGlmICh0aGlzLmFwcGx5UXVpY2tTZWFyY2goe3F1ZXJ5LCBzZWFyY2h9KSkgcmV0dXJuXG5cbiAgICBzdXBlci5hcHBseUZyb250ZW5kTW9kZWxJbmRleFNlYXJjaCh7Y29udHJvbGxlciwgcXVlcnksIHNlYXJjaH0pXG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kcyBhIGBxdWlja1NlYXJjaGAgcHNldWRvLWNvbHVtbiBzZWFyY2ggaW50byBhbiBPUiBvZiBMSUtFIGNvbmRpdGlvbnNcbiAgICogb3ZlciB0aGUgZGVjbGFyZWQge0BsaW5rIFN5bmNSZXNvdXJjZUJhc2UucXVpY2tTZWFyY2hDb2x1bW5zfS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBTZWFyY2ggYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUFueVF1ZXJ5fSBhcmdzLnF1ZXJ5IC0gUXVlcnkgdG8gZmlsdGVyLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlU2VhcmNofSBhcmdzLnNlYXJjaCAtIFNlYXJjaCBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc2VhcmNoIHdhcyBoYW5kbGVkIGFzIGEgcXVpY2sgc2VhcmNoLlxuICAgKi9cbiAgYXBwbHlRdWlja1NlYXJjaCh7cXVlcnksIHNlYXJjaH0pIHtcbiAgICBjb25zdCBxdWlja1NlYXJjaENvbHVtbnMgPSAvKiogQHR5cGUge3R5cGVvZiBTeW5jUmVzb3VyY2VCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcikucXVpY2tTZWFyY2hDb2x1bW5zXG5cbiAgICBpZiAoIXF1aWNrU2VhcmNoQ29sdW1ucyB8fCBxdWlja1NlYXJjaENvbHVtbnMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoc2VhcmNoLnBhdGgubGVuZ3RoID4gMCB8fCBzZWFyY2guY29sdW1uICE9PSBRVUlDS19TRUFSQ0hfQ09MVU1OKSByZXR1cm4gZmFsc2VcblxuICAgIGlmIChzZWFyY2gub3BlcmF0b3IgIT09IFwibGlrZVwiKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKFwiU3luYyBxdWljayBzZWFyY2ggbXVzdCB1c2UgdGhlIGxpa2Ugb3BlcmF0b3IuXCIsIHtjb2RlOiBcInN5bmMtaW52YWxpZC1xdWljay1zZWFyY2hcIn0pXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzZWFyY2gudmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoXCJTeW5jIHF1aWNrIHNlYXJjaCBtdXN0IGJlIGEgc3RyaW5nLlwiLCB7Y29kZTogXCJzeW5jLWludmFsaWQtcXVpY2stc2VhcmNoXCJ9KVxuICAgIH1cblxuICAgIGNvbnN0IHRyaW1tZWRWYWx1ZSA9IHNlYXJjaC52YWx1ZS50cmltKClcblxuICAgIGlmICghdHJpbW1lZFZhbHVlKSByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3QgdGFibGVTcWwgPSBxdWVyeS5kcml2ZXIucXVvdGVUYWJsZShxdWVyeS5nZXRUYWJsZVJlZmVyZW5jZUZvckpvaW4oKSlcbiAgICBjb25zdCBsaWtlVmFsdWUgPSBgJSR7dHJpbW1lZFZhbHVlfSVgXG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHF1aWNrU2VhcmNoQ29sdW1ucy5tYXAoKGNvbHVtbk5hbWUpID0+IChcbiAgICAgIGAke3RhYmxlU3FsfS4ke3F1ZXJ5LmRyaXZlci5xdW90ZUNvbHVtbihjb2x1bW5OYW1lKX0gTElLRSAke3F1ZXJ5LmRyaXZlci5xdW90ZShsaWtlVmFsdWUpfWBcbiAgICApKVxuXG4gICAgcXVlcnkud2hlcmUoYCgke2NvbmRpdGlvbnMuam9pbihcIiBPUiBcIil9KWApXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gVGhlIGRlY2xhcmF0aXZlIGBzdGF0aWMgd3JpdGFibGVBdHRyaWJ1dGVzYCBwZXJtaXQgbGlzdCBsaXZlcyBvblxuICAvLyBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlIHNvIGV2ZXJ5IGZyb250ZW5kLW1vZGVsIHJlc291cmNlIGNhbiBkZWNsYXJlXG4gIC8vIG9uZTsgc3luYyByZXNvdXJjZXMgaW5oZXJpdCBpdCB1bmNoYW5nZWQuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdGFibGUgY2hhbmdlLWZlZWQgcGFnZSBhZnRlciBhcHAgYXV0aG9yaXphdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fSBDaGFuZ2UtZmVlZCBwYWdlIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNoYW5nZXMoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5wYXJhbXMoKVxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5jaGFuZ2VzU2NvcGUocGFyYW1zKVxuXG4gICAgYXdhaXQgdGhpcy5hdXRob3JpemVDaGFuZ2VzKHtwYXJhbXMsIHNjb3BlfSlcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNoYW5nZUZlZWRTZXJ2aWNlKHtwYXJhbXMsIHNjb3BlfSkuY2hhbmdlcygpXG4gIH1cblxuICAvKipcbiAgICogUmVwbGF5cyBjbGllbnQgc3luYyBlbnZlbG9wZXMgdGhyb3VnaCB0aGUgYXBwIHJlcGxheSBzZXJ2aWNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCA/Pj59IFJlcGxheSByZXN1bHQgd2l0aCBwZXItc3luYyBzdGF0ZXMuXG4gICAqL1xuICBhc3luYyByZXBsYXkoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5idWlsZFJlcGxheVNlcnZpY2UoKS5yZXBsYXkodGhpcy5wYXJhbXMoKSlcblxuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcImVycm9yXCIpIHJldHVybiByZXN1bHRcblxuICAgIHJldHVybiB7c3RhdHVzOiBcInN1Y2Nlc3NcIiwgc3luY3M6IHJlc3VsdC5zeW5jc31cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdGhlIG9wdGlvbmFsIGNsaWVudC1kZWNsYXJlZCBzY29wZSBmcm9tIHJlcXVlc3QgcGFyYW1zLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBwYXJhbXMgLSBSZXF1ZXN0IHBhcmFtcy5cbiAgICogQHJldHVybnMge1NlcmlhbGl6ZWRDaGFuZ2VzU2NvcGUgfCBudWxsfSBQYXJzZWQgc2NvcGUsIG9yIG51bGwgd2hlbiB0aGUgY2xpZW50IHNlbnQgbm9uZS5cbiAgICovXG4gIGNoYW5nZXNTY29wZShwYXJhbXMpIHtcbiAgICBjb25zdCBzY29wZSA9IHBhcmFtcy5zY29wZVxuXG4gICAgaWYgKHNjb3BlID09PSB1bmRlZmluZWQgfHwgc2NvcGUgPT09IG51bGwpIHJldHVybiBudWxsXG5cbiAgICBpZiAodHlwZW9mIHNjb3BlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoc2NvcGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgY2hhbmdlcyBzY29wZSBtdXN0IGJlIGFuIG9iamVjdCwgZ290OiAke1N0cmluZyhzY29wZSl9YClcbiAgICB9XG5cbiAgICBjb25zdCBzY29wZVBhcmFtcyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChzY29wZSlcbiAgICBjb25zdCByZXNvdXJjZVR5cGUgPSBzY29wZVBhcmFtcy5yZXNvdXJjZVR5cGUgPT09IG51bGwgfHwgc2NvcGVQYXJhbXMucmVzb3VyY2VUeXBlID09PSB1bmRlZmluZWRcbiAgICAgID8gbnVsbFxuICAgICAgOiBmb3JjZWROb25CbGFua1N0cmluZyhzY29wZVBhcmFtcy5yZXNvdXJjZVR5cGUsIFwicmVzb3VyY2VUeXBlXCIpXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlcyA9IHRoaXMuY2hhbmdlc1Njb3BlUmVzb3VyY2VUeXBlcyhzY29wZVBhcmFtcy5yZXNvdXJjZVR5cGVzKVxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBzY29wZVBhcmFtcy5jb25kaXRpb25zXG5cbiAgICBpZiAoIWNvbmRpdGlvbnMgfHwgdHlwZW9mIGNvbmRpdGlvbnMgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShjb25kaXRpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jIGNoYW5nZXMgc2NvcGUuY29uZGl0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCwgZ290OiAke1N0cmluZyhjb25kaXRpb25zKX1gKVxuICAgIH1cblxuICAgIHJldHVybiB7Y29uZGl0aW9uczogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKGNvbmRpdGlvbnMpLCByZXNvdXJjZVR5cGUsIHJlc291cmNlVHlwZXN9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBvcHRpb25hbCByZXNvdXJjZS10eXBlIGxpc3QgYW4gYWxsLXR5cGVzIHNjb3BlIGRlY2xhcmVzLlxuICAgKiBAcGFyYW0gez99IHZhbHVlIC0gUmF3IGBzY29wZS5yZXNvdXJjZVR5cGVzYCBwYXJhbS5cbiAgICogQHJldHVybnMge3N0cmluZ1tdIHwgbnVsbH0gRGVjbGFyZWQgcmVzb3VyY2UgdHlwZXMsIG9yIG51bGwgd2hlbiB0aGUgY2xpZW50IHNlbnQgbm9uZS5cbiAgICovXG4gIGNoYW5nZXNTY29wZVJlc291cmNlVHlwZXModmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHRocm93IG5ldyBFcnJvcihgU3luYyBjaGFuZ2VzIHNjb3BlLnJlc291cmNlVHlwZXMgbXVzdCBiZSBhbiBhcnJheSwgZ290OiAke1N0cmluZyh2YWx1ZSl9YClcblxuICAgIHJldHVybiB2YWx1ZS5tYXAoKHJlc291cmNlVHlwZSkgPT4gZm9yY2VkTm9uQmxhbmtTdHJpbmcocmVzb3VyY2VUeXBlLCBcInJlc291cmNlVHlwZXNcIikpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBjaGFuZ2UtZmVlZCBzZXJ2aWNlIHNlcnZpbmcgdGhpcyBjaGFuZ2VzIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7e3BhcmFtczogUmVjb3JkPHN0cmluZywgPz4sIHNjb3BlOiBTZXJpYWxpemVkQ2hhbmdlc1Njb3BlIHwgbnVsbH19IGFyZ3MgLSBSZXF1ZXN0IHBhcmFtcyBhbmQgcGFyc2VkIHNjb3BlLlxuICAgKiBAcmV0dXJucyB7e2NoYW5nZXM6ICgpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fX0gQ2hhbmdlLWZlZWQgc2VydmljZS5cbiAgICovXG4gIGNoYW5nZUZlZWRTZXJ2aWNlKHtwYXJhbXMsIHNjb3BlfSkge1xuICAgIHJldHVybiBuZXcgU3luY01vZGVsQ2hhbmdlRmVlZFNlcnZpY2Uoe1xuICAgICAgbW9kZWxDbGFzczogdGhpcy5zeW5jTW9kZWxDbGFzcygpLFxuICAgICAgcGFyYW1zLFxuICAgICAgc2NvcGVRdWVyeTogKHtxdWVyeX0pID0+IHRoaXMuc2NvcGVDaGFuZ2VzUXVlcnkoe3BhcmFtcywgcXVlcnksIHNjb3BlfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgYXBwIHJlcGxheSBzZXJ2aWNlIGhhbmRsaW5nIHRoaXMgcmVwbGF5IHJlcXVlc3QuIFRoZSByZXNvdXJjZVxuICAgKiBhYmlsaXR5LCBjb250ZXh0LCBjb25maWd1cmF0aW9uLCBhbmQgbG9jYWxzIGFyZSBwbHVtYmVkIGluIHVuZGVyIHRoZVxuICAgKiBhcHAtZGVjbGFyZWQge0BsaW5rIFN5bmNSZXNvdXJjZUJhc2UjcmVwbGF5U2VydmljZUFyZ3N9IChhcHAgYXJncyB3aW4pIHNvXG4gICAqIHRoZSBkZWZhdWx0IHJlc291cmNlLXJvdXRlZCByZXBsYXkgd29ya3Mgd2l0aG91dCB3aXJpbmcuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuZGVmYXVsdH0gUmVwbGF5IHNlcnZpY2UgaW5zdGFuY2UuXG4gICAqL1xuICBidWlsZFJlcGxheVNlcnZpY2UoKSB7XG4gICAgY29uc3QgUmVwbGF5U2VydmljZUNsYXNzID0gdGhpcy5yZXBsYXlTZXJ2aWNlQ2xhc3MoKVxuXG4gICAgcmV0dXJuIG5ldyBSZXBsYXlTZXJ2aWNlQ2xhc3Moe1xuICAgICAgYWJpbGl0eTogdGhpcy5hYmlsaXR5LFxuICAgICAgYWJpbGl0eUNvbnRleHQ6IHRoaXMuZ2V0Q29udGV4dCgpLFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb250cm9sbGVyID8gdGhpcy5jb250cm9sbGVySW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9uKCkgOiB1bmRlZmluZWQsXG4gICAgICBsb2NhbHM6IHRoaXMuZ2V0TG9jYWxzKCksXG4gICAgICAuLi50aGlzLnJlcGxheVNlcnZpY2VBcmdzKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY29uc3RydWN0b3IgYXJncyBmb3IgdGhlIGFwcCByZXBsYXkgc2VydmljZS5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+fSBSZXBsYXkgc2VydmljZSBjb25zdHJ1Y3RvciBhcmdzLlxuICAgKi9cbiAgcmVwbGF5U2VydmljZUFyZ3MoKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3luYyBtb2RlbCBjbGFzcyBiYWNraW5nIHRoZSBjaGFuZ2UgZmVlZC5cbiAgICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gU3luYyBtb2RlbCBjbGFzcy5cbiAgICovXG4gIHN5bmNNb2RlbENsYXNzKCkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBTeW5jUmVzb3VyY2VCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcikuTW9kZWxDbGFzc1xuXG4gICAgaWYgKCFtb2RlbENsYXNzKSB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSBtdXN0IGRlZmluZSBzdGF0aWMgTW9kZWxDbGFzc2ApXG5cbiAgICByZXR1cm4gbW9kZWxDbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhvcml6ZXMgdGhlIGN1cnJlbnQgY29udGV4dCBmb3IgcmVhZGluZyB0aGUgcmVxdWVzdGVkIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7e3BhcmFtczogUmVjb3JkPHN0cmluZywgPz4sIHNjb3BlOiBTZXJpYWxpemVkQ2hhbmdlc1Njb3BlIHwgbnVsbH19IF9hcmdzIC0gUmVxdWVzdCBwYXJhbXMgYW5kIHBhcnNlZCBzY29wZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHdoZW4gYWNjZXNzIGlzIGFsbG93ZWQ7IHRocm93cyBvdGhlcndpc2UuXG4gICAqL1xuICBhc3luYyBhdXRob3JpemVDaGFuZ2VzKF9hcmdzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY1Jlc291cmNlQmFzZSNhdXRob3JpemVDaGFuZ2VzIG11c3QgYmUgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGFwcCB2aXNpYmlsaXR5IHNjb3Bpbmcgb250byB0aGUgY2hhbmdlLWZlZWQgcXVlcnkuXG4gICAqIEBwYXJhbSB7e3BhcmFtczogUmVjb3JkPHN0cmluZywgPz4sIHF1ZXJ5OiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0LCBzY29wZTogU2VyaWFsaXplZENoYW5nZXNTY29wZSB8IG51bGx9fSBfYXJncyAtIFJlcXVlc3QgcGFyYW1zLCBmZWVkIHF1ZXJ5LCBhbmQgcGFyc2VkIHNjb3BlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNjb3BlQ2hhbmdlc1F1ZXJ5KF9hcmdzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY1Jlc291cmNlQmFzZSNzY29wZUNoYW5nZXNRdWVyeSBtdXN0IGJlIGltcGxlbWVudGVkXCIpXG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIG9uZSBwdWJsaXNoZWQgY2hhbmdlIGlzIGRlbGl2ZXJhYmxlIHRvIGEgdXNlci1zY29wZVxuICAgKiBzdWJzY3JpcHRpb24gKHRoZSBmcmFtZXdvcmsgc3luYyBjaGFubmVsJ3MgcGVyLWRlbGl2ZXJ5IGFjY2VzcyByZS1jaGVjaykuXG4gICAqIFRoZSBkZWZhdWx0IHJldXNlcyB0aGUgYXBwJ3MgYWJpbGl0eSBzY29waW5nOiBpdCBhcHBsaWVzXG4gICAqIHtAbGluayBTeW5jUmVzb3VyY2VCYXNlI3Njb3BlQ2hhbmdlc1F1ZXJ5fSB0byB0aGUgY2hhbmdlLWZlZWQgbW9kZWwg4oCUIHdoaWNoXG4gICAqIGZvciBhbiBlbXB0eS1jb25kaXRpb25zIHVzZXIgc2NvcGUgZmFsbHMgYmFjayB0byBhYmlsaXR5IHNjb3Bpbmcg4oCUIGFuZFxuICAgKiBjaGVja3Mgd2hldGhlciB0aGUgcHVibGlzaGVkIGNoYW5nZSdzIGZlZWQgcm93IGlzIHZpc2libGUgd2l0aGluIHRoYXRcbiAgICogc2NvcGUuIEFwcHMgZ2V0IHRoaXMgZm9yIGZyZWUgZnJvbSB0aGUgc2NvcGluZyB0aGV5IGFscmVhZHkgZGVjbGFyZWQ7XG4gICAqIG92ZXJyaWRlIG9ubHkgZm9yIGN1c3RvbSBwZXItZGVsaXZlcnkgcnVsZXMuXG4gICAqIEBwYXJhbSB7e3BhcmFtczogUmVjb3JkPHN0cmluZywgPz4sIHNjb3BlOiBTZXJpYWxpemVkQ2hhbmdlc1Njb3BlIHwgbnVsbCwgc3luYzoge3Jlc291cmNlSWQ6IHN0cmluZywgcmVzb3VyY2VUeXBlOiBzdHJpbmd9fX0gYXJncyAtIFJlcXVlc3QgcGFyYW1zLCBzdWJzY3JpcHRpb24gc2NvcGUsIGFuZCB0aGUgcHVibGlzaGVkIGNoYW5nZSdzIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciB0aGUgY2hhbmdlIG1heSBiZSBkZWxpdmVyZWQgdG8gdGhpcyBzdWJzY3JpcHRpb24uXG4gICAqL1xuICBhc3luYyBjaGFuZ2VEZWxpdmVyYWJsZSh7cGFyYW1zLCBzY29wZSwgc3luY30pIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc3luY01vZGVsQ2xhc3MoKS53aGVyZSh7fSlcblxuICAgIHRoaXMuc2NvcGVDaGFuZ2VzUXVlcnkoe3BhcmFtcywgcXVlcnksIHNjb3BlfSlcbiAgICBxdWVyeS53aGVyZSh7cmVzb3VyY2VfaWQ6IFN0cmluZyhzeW5jLnJlc291cmNlSWQpLCByZXNvdXJjZV90eXBlOiBTdHJpbmcoc3luYy5yZXNvdXJjZVR5cGUpfSlcblxuICAgIHJldHVybiBCb29sZWFuKGF3YWl0IHF1ZXJ5LmZpcnN0KCkpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHJlcGxheSBzZXJ2aWNlIGNsYXNzIGhhbmRsaW5nIHJlcGxheSBtdXRhdGlvbnM6IHRoZVxuICAgKiBkZWNsYXJhdGl2ZSB7QGxpbmsgU3luY1Jlc291cmNlQmFzZS5SZXBsYXlTZXJ2aWNlQ2xhc3N9IHN0YXRpYyAoc2hhcmVkXG4gICAqIHJlc291cmNlcyBpbmNsdWRlZCkgd2hlbiBkZWNsYXJlZCwgb3RoZXJ3aXNlXG4gICAqIHtAbGluayBTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlfSwgd2hpY2ggcmVzb3VyY2Utcm91dGVzIG11dGF0aW9ucyB0aHJvdWdoXG4gICAqIHRoZSBwbHVtYmVkIGNvbmZpZ3VyYXRpb24gcmVnaXN0cnkuIEFwcHMgZGVjbGFyZSB0aGUgc3RhdGljIGluc3RlYWQgb2ZcbiAgICogb3ZlcnJpZGluZyB0aGlzIG1ldGhvZC5cbiAgICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuZGVmYXVsdH0gUmVwbGF5IHNlcnZpY2UgY2xhc3MuXG4gICAqL1xuICByZXBsYXlTZXJ2aWNlQ2xhc3MoKSB7XG4gICAgY29uc3QgUmVzb3VyY2VDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIFN5bmNSZXNvdXJjZUJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IFNoYXJlZFJlc291cmNlID0gLyoqIEB0eXBlIHt0eXBlb2YgU3luY1Jlc291cmNlQmFzZSB8IG51bGx9ICovIChSZXNvdXJjZUNsYXNzLnNoYXJlZFJlc291cmNlQ2xhc3MoKSA/PyBudWxsKVxuXG4gICAgcmV0dXJuIFJlc291cmNlQ2xhc3MuUmVwbGF5U2VydmljZUNsYXNzID8/IFNoYXJlZFJlc291cmNlPy5SZXBsYXlTZXJ2aWNlQ2xhc3MgPz8gU3luY0VudmVsb3BlUmVwbGF5U2VydmljZVxuICB9XG59XG4iXX0=
|
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @typedef {object} SyncScopeRow
|
|
3
|
-
* @property {Record<string, ?>} conditions - Scope attribute conditions.
|
|
4
|
-
* @property {string | null} cursorPayload - Persisted cursor JSON payload.
|
|
5
|
-
* @property {string} id - Scope row id.
|
|
6
|
-
* @property {string | null} resourceType - Scope resource/model name, or null for the all-types (user) scope.
|
|
7
|
-
* @property {string} scopeDigest - Fixed-size deterministic digest of the canonical scope key.
|
|
8
|
-
* @property {string} state - Scope state ("active" or "removed").
|
|
9
|
-
*/
|
|
10
1
|
/**
|
|
11
2
|
* Framework-owned local persistence for declared sync scopes and their cursors.
|
|
12
3
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-scope-store.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-scope-store.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sync-scope-store.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-scope-store.js"],"names":[],"mappings":"AA8BA;;;;;;GAMG;AACH;IACE;;;;;OAKG;IACH,mDAHG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACvB,kBAAkB;KAC1C,EASA;IAPC,qDAAkC;IAClC,2BAA4C;IAC5C,wCAAwC;IACxC,eADW,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CACN;IAC9B,kBAAqB;IACrB,mCAAmC;IACnC,eADW,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CACN;IAG3B;;;OAGG;IACH,eAFa,OAAO,CAAC,IAAI,CAAC,CAsBzB;IAED;;;;OAIG;IACH,yBAHW,OAAO,wBAAwB,EAAE,mBAAmB,GAClD,OAAO,CAAC,YAAY,CAAC,CAgEjC;IAED;;;OAGG;IACH,gBAFa,OAAO,CAAC,YAAY,EAAE,CAAC,CAmBnC;IAED;;;;OAIG;IACH,qBAHW,YAAY,GACV,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAclC;IAED;;;;;OAKG;IACH,qBAJW,YAAY,UACZ,OAAO,4BAA4B,EAAE,UAAU,GAC7C,OAAO,CAAC,IAAI,CAAC,CAyBzB;IAED;;;;OAIG;IACH,kBAHW,OAAO,wBAAwB,EAAE,mBAAmB,GAClD,OAAO,CAAC,IAAI,CAAC,CAkBzB;IAED;;;OAGG;IACH,sBAFa,OAAO,CAQnB;IAED;;;;;OAKG;IACH,QAJa,MAAM,YACR,CAAC,EAAE,EAAE,OAAO,6BAA6B,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,GACpE,OAAO,CAAC,MAAM,CAAC,CAU3B;IAED;;;;OAIG;IACH,uBAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC,IAAI,CAAC,CAiBzB;IAED;;;;;OAKG;IACH,sBAJW,OAAO,6BAA6B,EAAE,OAAO,UAC7C,MAAM,GACJ,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAWxC;IAED;;;;OAIG;IACH,wBAHW,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GACf,YAAY,CAWxB;CACF;;;;;gBA7Ta,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;;;mBACjB,MAAM,GAAG,IAAI;;;;QACb,MAAM;;;;kBACN,MAAM,GAAG,IAAI;;;;iBACb,MAAM;;;;WACN,MAAM"}
|