sonamu 0.9.20 → 0.10.0
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/dist/_virtual/_rolldown/runtime.js +36 -0
- package/dist/ai/agents/agent.js +5 -7
- package/dist/ai/agents/index.js +1 -2
- package/dist/ai/agents/types.js +1 -1
- package/dist/ai/index.js +1 -2
- package/dist/ai/providers/rtzr/api.js +2 -3
- package/dist/ai/providers/rtzr/error.js +14 -29
- package/dist/ai/providers/rtzr/index.js +1 -2
- package/dist/ai/providers/rtzr/model.js +13 -20
- package/dist/ai/providers/rtzr/options.js +2 -3
- package/dist/ai/providers/rtzr/provider.js +2 -3
- package/dist/ai/providers/rtzr/utils.js +12 -21
- package/dist/api/base-frame.js +4 -4
- package/dist/api/caster.js +21 -38
- package/dist/api/code-converters.js +41 -98
- package/dist/api/config.d.ts +1 -10
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +9 -8
- package/dist/api/context.js +2 -3
- package/dist/api/decorators.js +80 -116
- package/dist/api/index.js +2 -3
- package/dist/api/secret.js +6 -10
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +200 -387
- package/dist/api/validator.js +5 -8
- package/dist/api/websocket-helpers.js +21 -32
- package/dist/auth/audit-log/builders.js +2 -3
- package/dist/auth/audit-log/events.js +2 -2
- package/dist/auth/audit-log/plugin.js +30 -61
- package/dist/auth/audit-log-ingestor.js +19 -41
- package/dist/auth/auth-generator.js +16 -41
- package/dist/auth/better-auth-entities.js +3 -4
- package/dist/auth/index.js +2 -3
- package/dist/auth/knex-adapter.js +18 -45
- package/dist/auth/plugins/entity-definitions/admin.js +2 -2
- package/dist/auth/plugins/entity-definitions/anonymous.js +2 -2
- package/dist/auth/plugins/entity-definitions/api-key.js +2 -2
- package/dist/auth/plugins/entity-definitions/audit-log.js +2 -2
- package/dist/auth/plugins/entity-definitions/index.js +2 -3
- package/dist/auth/plugins/entity-definitions/jwt.js +2 -2
- package/dist/auth/plugins/entity-definitions/organization.js +2 -2
- package/dist/auth/plugins/entity-definitions/passkey.js +2 -2
- package/dist/auth/plugins/entity-definitions/phone-number.js +2 -2
- package/dist/auth/plugins/entity-definitions/sso.js +2 -2
- package/dist/auth/plugins/entity-definitions/two-factor.js +2 -2
- package/dist/auth/plugins/entity-definitions/types.js +1 -1
- package/dist/auth/plugins/entity-definitions/username.js +2 -2
- package/dist/auth/plugins/index.js +1 -2
- package/dist/auth/plugins/wrappers/admin.js +2 -3
- package/dist/auth/plugins/wrappers/anonymous.js +2 -3
- package/dist/auth/plugins/wrappers/api-key.js +2 -3
- package/dist/auth/plugins/wrappers/index.js +1 -2
- package/dist/auth/plugins/wrappers/jwt.js +2 -3
- package/dist/auth/plugins/wrappers/organization.js +2 -3
- package/dist/auth/plugins/wrappers/passkey.js +2 -3
- package/dist/auth/plugins/wrappers/phone-number.js +2 -3
- package/dist/auth/plugins/wrappers/sso.js +2 -3
- package/dist/auth/plugins/wrappers/two-factor.js +2 -3
- package/dist/auth/plugins/wrappers/username.js +2 -3
- package/dist/bin/build-config.js +2 -2
- package/dist/bin/cli.js +151 -258
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +55 -97
- package/dist/bin/hmr-hook-register.js +3 -3
- package/dist/bin/migrate-targets.d.ts +3 -0
- package/dist/bin/migrate-targets.d.ts.map +1 -0
- package/dist/bin/migrate-targets.js +11 -0
- package/dist/bin/test-command.js +25 -55
- package/dist/bin/ts-loader-register.js +5 -6
- package/dist/bin/ts-loader-registration.js +6 -13
- package/dist/cache/cache-manager.js +3 -4
- package/dist/cache/decorator.js +11 -21
- package/dist/cache/drivers.js +2 -3
- package/dist/cache/index.js +2 -3
- package/dist/cache/types.js +1 -1
- package/dist/cache-control/cache-control.js +21 -34
- package/dist/cache-control/types.js +1 -1
- package/dist/compress/compress.js +10 -10
- package/dist/compress/index.js +1 -2
- package/dist/compress/types.js +1 -1
- package/dist/cone/cone-generator.js +25 -63
- package/dist/database/_batch_update.js +26 -46
- package/dist/database/base-model.js +44 -97
- package/dist/database/base-model.types.js +1 -1
- package/dist/database/db.d.ts +8 -14
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +127 -72
- package/dist/database/knex.js +5 -8
- package/dist/database/puri-subset.types.js +1 -1
- package/dist/database/puri-wrapper.js +11 -15
- package/dist/database/puri.js +117 -234
- package/dist/database/puri.types.js +3 -4
- package/dist/database/transaction-context.js +4 -5
- package/dist/database/upsert-builder.js +109 -176
- package/dist/dict/en.d.ts +1 -0
- package/dist/dict/en.d.ts.map +1 -1
- package/dist/dict/en.js +4 -4
- package/dist/dict/index.js +2 -3
- package/dist/dict/ko.d.ts +1 -0
- package/dist/dict/ko.d.ts.map +1 -1
- package/dist/dict/ko.js +4 -4
- package/dist/dict/rc-keys.js +3 -4
- package/dist/dict/sd.js +8 -19
- package/dist/dict/sonamu-dictionary.js +141 -284
- package/dist/dict/types.js +1 -1
- package/dist/dict/utils.js +4 -5
- package/dist/entity/entity-manager.d.ts +2 -2
- package/dist/entity/entity-manager.js +34 -82
- package/dist/entity/entity-template-cone.js +33 -66
- package/dist/entity/entity.js +156 -310
- package/dist/env.d.ts +14 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +75 -0
- package/dist/exceptions/error-handler.js +2 -3
- package/dist/exceptions/so-exceptions.js +7 -5
- package/dist/filter/index.js +1 -2
- package/dist/filter/types.js +3 -4
- package/dist/filter/utils.js +21 -54
- package/dist/index.js +8 -7
- package/dist/logger/category.js +6 -12
- package/dist/logger/configure.js +23 -34
- package/dist/migration/code-generation.js +146 -314
- package/dist/migration/index-where-predicate.js +52 -144
- package/dist/migration/migration-set.js +19 -33
- package/dist/migration/migrator.d.ts +2 -0
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +69 -53
- package/dist/migration/postgresql-schema-reader.js +126 -225
- package/dist/migration/slack-confirm.d.ts +1 -0
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +28 -38
- package/dist/migration/types.js +1 -1
- package/dist/naite/messaging-types.js +1 -1
- package/dist/naite/naite-reporter.js +15 -32
- package/dist/naite/naite.js +43 -76
- package/dist/ssr/index.js +6 -9
- package/dist/ssr/registry.js +10 -18
- package/dist/ssr/renderer.js +10 -21
- package/dist/ssr/types.js +1 -1
- package/dist/storage/base-file.js +5 -10
- package/dist/storage/buffered-file.js +3 -4
- package/dist/storage/drivers.js +2 -3
- package/dist/storage/index.js +2 -3
- package/dist/storage/s3-driver.js +5 -9
- package/dist/storage/storage-manager.js +5 -5
- package/dist/storage/types.js +1 -1
- package/dist/storage/uploaded-file.js +4 -6
- package/dist/stream/index.js +1 -2
- package/dist/stream/sse.js +8 -13
- package/dist/stream/ws-audience-resolver.js +5 -5
- package/dist/stream/ws-audience.js +3 -4
- package/dist/stream/ws-cluster-bus.js +3 -4
- package/dist/stream/ws-core.js +1 -1
- package/dist/stream/ws-delivery.js +11 -25
- package/dist/stream/ws-local-connection-store.js +9 -18
- package/dist/stream/ws-presence-store.js +43 -97
- package/dist/stream/ws-registry.js +17 -22
- package/dist/stream/ws-telemetry-memory.js +38 -45
- package/dist/stream/ws-telemetry-trace.js +4 -6
- package/dist/stream/ws-telemetry.js +82 -135
- package/dist/stream/ws.js +47 -91
- package/dist/syncer/api-parser.js +81 -147
- package/dist/syncer/checksum.js +9 -20
- package/dist/syncer/code-generator.js +29 -47
- package/dist/syncer/entity-operations.js +17 -27
- package/dist/syncer/event-batcher.js +8 -15
- package/dist/syncer/file-patterns.js +3 -4
- package/dist/syncer/file-tracking.js +6 -10
- package/dist/syncer/index.js +1 -2
- package/dist/syncer/module-loader.js +10 -26
- package/dist/syncer/syncer-actions.js +19 -37
- package/dist/syncer/syncer.js +46 -98
- package/dist/syncer/watcher.js +12 -26
- package/dist/tasks/decorator.js +7 -11
- package/dist/tasks/step-wrapper.js +7 -8
- package/dist/tasks/workflow-manager.js +18 -25
- package/dist/template/entity-converter.js +40 -64
- package/dist/template/helpers.js +32 -63
- package/dist/template/implementations/entity.template.js +7 -11
- package/dist/template/implementations/entry-server.template.js +2 -3
- package/dist/template/implementations/generated.template.js +25 -51
- package/dist/template/implementations/generated_http.template.js +31 -58
- package/dist/template/implementations/generated_sso.template.js +45 -85
- package/dist/template/implementations/init_types.template.js +4 -7
- package/dist/template/implementations/model.template.js +5 -10
- package/dist/template/implementations/model_test.template.js +2 -3
- package/dist/template/implementations/queries.template.js +4 -7
- package/dist/template/implementations/sd.template.js +17 -35
- package/dist/template/implementations/services.template.js +18 -30
- package/dist/template/implementations/view_form.template.js +72 -125
- package/dist/template/implementations/view_id_all_select.template.js +2 -3
- package/dist/template/implementations/view_list.template.js +86 -143
- package/dist/template/implementations/view_search_input.template.js +2 -3
- package/dist/template/index.js +5 -8
- package/dist/template/template-manager.js +13 -26
- package/dist/template/template-types.js +2 -3
- package/dist/template/template.js +7 -11
- package/dist/template/zod-converter.js +173 -348
- package/dist/testing/_relation-graph.js +18 -37
- package/dist/testing/bootstrap.js +5 -8
- package/dist/testing/data-explorer.js +34 -78
- package/dist/testing/dev-test-routes.js +54 -60
- package/dist/testing/dev-vitest-manager.js +33 -84
- package/dist/testing/faker-mappings.js +3 -4
- package/dist/testing/fixture-generator.d.ts +2 -1
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +159 -321
- package/dist/testing/fixture-loader.js +2 -2
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +124 -227
- package/dist/testing/global-setup.d.ts.map +1 -1
- package/dist/testing/global-setup.js +29 -17
- package/dist/testing/index.js +1 -2
- package/dist/testing/naite-vitest-reporter.js +2 -3
- package/dist/testing/parallel-db-manager.js +5 -3
- package/dist/testing/vitest-helpers.d.ts.map +1 -1
- package/dist/testing/vitest-helpers.js +15 -12
- package/dist/types/types.d.ts +14 -14
- package/dist/types/types.js +27 -50
- package/dist/ui/ai-api.js +6 -11
- package/dist/ui/ai-client.js +86 -134
- package/dist/ui/api.js +99 -195
- package/dist/ui/cdd-service.js +78 -130
- package/dist/ui/cdd-types.js +1 -1
- package/dist/ui-web/assets/{index-Df8q-fhb.js → index-DFStGyd0.js} +49 -49
- package/dist/ui-web/assets/index-Dx4ap5i4.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.js +13 -25
- package/dist/utils/class-name.js +3 -4
- package/dist/utils/console-util.js +11 -26
- package/dist/utils/controller.d.ts.map +1 -1
- package/dist/utils/controller.js +14 -12
- package/dist/utils/esm-utils.js +5 -8
- package/dist/utils/formatter.js +10 -22
- package/dist/utils/fs-utils.js +14 -25
- package/dist/utils/lodash-able.js +3 -4
- package/dist/utils/model.js +7 -14
- package/dist/utils/object-utils.js +41 -73
- package/dist/utils/path-utils.js +5 -9
- package/dist/utils/process-utils.js +4 -7
- package/dist/utils/sql-parser.js +6 -13
- package/dist/utils/type-utils.js +16 -26
- package/dist/utils/utils.js +18 -40
- package/dist/utils/zod-error.js +9 -16
- package/dist/vector/chunking.js +24 -37
- package/dist/vector/config.js +2 -2
- package/dist/vector/embedding.js +8 -19
- package/dist/vector/index.js +1 -2
- package/dist/vector/types.js +1 -1
- package/package.json +6 -6
- package/src/__tests__/env.test.ts +127 -0
- package/src/api/__tests__/config.test.ts +10 -1
- package/src/api/config.ts +4 -12
- package/src/api/sonamu.ts +14 -4
- package/src/bin/__tests__/migrate-targets.test.ts +28 -0
- package/src/bin/__tests__/test-command.test.ts +82 -1
- package/src/bin/cli.ts +9 -18
- package/src/bin/fixture.ts +5 -4
- package/src/bin/migrate-targets.ts +7 -0
- package/src/bin/test-command.ts +2 -2
- package/src/database/__tests__/db.test.ts +175 -0
- package/src/database/db.ts +193 -71
- package/src/dict/en.ts +2 -0
- package/src/dict/ko.ts +2 -0
- package/src/env.ts +123 -0
- package/src/migration/__tests__/migrator.test.ts +149 -0
- package/src/migration/migrator.ts +74 -17
- package/src/migration/slack-confirm.ts +21 -0
- package/src/skills/sonamu/database.md +1 -1
- package/src/skills/sonamu/testing-devrunner.md +1 -1
- package/src/stream/ws-telemetry-memory.ts +2 -2
- package/src/testing/fixture-generator.ts +2 -1
- package/src/testing/fixture-manager.ts +3 -4
- package/src/testing/global-setup.ts +42 -18
- package/src/testing/vitest-helpers.ts +14 -0
- package/src/utils/controller.ts +14 -7
- package/tsdown.api.config.ts +6 -0
- package/dist/_virtual/rolldown_runtime.js +0 -39
- package/dist/ui-web/assets/index-D4rYm-Xz.css +0 -1
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
2
|
-
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
3
2
|
//#region src/stream/ws-local-connection-store.ts
|
|
4
3
|
function isTelemetryInspectableConnection(connection) {
|
|
5
4
|
return "getTelemetrySnapshot" in connection && typeof connection.getTelemetrySnapshot === "function";
|
|
@@ -7,7 +6,7 @@ function isTelemetryInspectableConnection(connection) {
|
|
|
7
6
|
var WebSocketLocalConnectionStore;
|
|
8
7
|
var init_ws_local_connection_store = __esmMin((() => {
|
|
9
8
|
WebSocketLocalConnectionStore = class {
|
|
10
|
-
connections = new Map();
|
|
9
|
+
connections = /* @__PURE__ */ new Map();
|
|
11
10
|
register(connection) {
|
|
12
11
|
this.connections.set(connection.id, connection);
|
|
13
12
|
}
|
|
@@ -19,16 +18,12 @@ var init_ws_local_connection_store = __esmMin((() => {
|
|
|
19
18
|
}
|
|
20
19
|
getConnections(connectionIds) {
|
|
21
20
|
const targets = [];
|
|
22
|
-
const seen = new Set();
|
|
21
|
+
const seen = /* @__PURE__ */ new Set();
|
|
23
22
|
for (const connectionId of connectionIds) {
|
|
24
|
-
if (seen.has(connectionId))
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
23
|
+
if (seen.has(connectionId)) continue;
|
|
27
24
|
seen.add(connectionId);
|
|
28
25
|
const connection = this.connections.get(connectionId);
|
|
29
|
-
if (!connection || connection.closed)
|
|
30
|
-
continue;
|
|
31
|
-
}
|
|
26
|
+
if (!connection || connection.closed) continue;
|
|
32
27
|
targets.push(connection);
|
|
33
28
|
}
|
|
34
29
|
return targets;
|
|
@@ -40,9 +35,7 @@ var init_ws_local_connection_store = __esmMin((() => {
|
|
|
40
35
|
socketBufferedBytes: 0
|
|
41
36
|
};
|
|
42
37
|
for (const connection of this.connections.values()) {
|
|
43
|
-
if (!isTelemetryInspectableConnection(connection))
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
38
|
+
if (!isTelemetryInspectableConnection(connection)) continue;
|
|
46
39
|
const connectionSnapshot = connection.getTelemetrySnapshot();
|
|
47
40
|
snapshot.pendingInboundMessages += connectionSnapshot.pendingInboundMessages;
|
|
48
41
|
snapshot.pendingOutboundMessages += connectionSnapshot.pendingOutboundMessages;
|
|
@@ -51,14 +44,12 @@ var init_ws_local_connection_store = __esmMin((() => {
|
|
|
51
44
|
return snapshot;
|
|
52
45
|
}
|
|
53
46
|
closeAll(code, reason) {
|
|
54
|
-
for (const connection of this.connections.values())
|
|
55
|
-
connection.close(code, reason);
|
|
56
|
-
}
|
|
47
|
+
for (const connection of this.connections.values()) connection.close(code, reason);
|
|
57
48
|
}
|
|
58
49
|
};
|
|
59
50
|
}));
|
|
60
|
-
|
|
61
51
|
//#endregion
|
|
62
52
|
init_ws_local_connection_store();
|
|
63
53
|
export { WebSocketLocalConnectionStore, init_ws_local_connection_store };
|
|
64
|
-
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtbG9jYWwtY29ubmVjdGlvbi1zdG9yZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RyZWFtL3dzLWxvY2FsLWNvbm5lY3Rpb24tc3RvcmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbiB9IGZyb20gXCIuL3dzLWNvcmVcIjtcbmltcG9ydCB7XG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvblNuYXBzaG90LFxuICB0eXBlIFRlbGVtZXRyeUluc3BlY3RhYmxlQ29ubmVjdGlvbixcbn0gZnJvbSBcIi4vd3MtdGVsZW1ldHJ5XCI7XG5cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRMb2NhbENvbm5lY3Rpb25TdG9yZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24+KCk7XG5cbiAgcmVnaXN0ZXIoY29ubmVjdGlvbjogTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25zLnNldChjb25uZWN0aW9uLmlkLCBjb25uZWN0aW9uKTtcbiAgfVxuXG4gIHVucmVnaXN0ZXIoY29ubmVjdGlvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25zLmRlbGV0ZShjb25uZWN0aW9uSWQpO1xuICB9XG5cbiAgZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQ6IHN0cmluZyk6IE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9ucy5nZXQoY29ubmVjdGlvbklkKTtcbiAgfVxuXG4gIGdldENvbm5lY3Rpb25zKGNvbm5lY3Rpb25JZHM6IHN0cmluZ1tdKTogTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb25bXSB7XG4gICAgY29uc3QgdGFyZ2V0czogTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb25bXSA9IFtdO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3QgY29ubmVjdGlvbklkIG9mIGNvbm5lY3Rpb25JZHMpIHtcbiAgICAgIGlmIChzZWVuLmhhcyhjb25uZWN0aW9uSWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgc2Vlbi5hZGQoY29ubmVjdGlvbklkKTtcblxuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KGNvbm5lY3Rpb25JZCk7XG4gICAgICBpZiAoIWNvbm5lY3Rpb24gfHwgY29ubmVjdGlvbi5jbG9zZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRhcmdldHMucHVzaChjb25uZWN0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0cztcbiAgfVxuXG4gIGdldFRlbGVtZXRyeVNuYXBzaG90KCk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25TbmFwc2hvdCB7XG4gICAgY29uc3Qgc25hcHNob3Q6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25TbmFwc2hvdCA9IHtcbiAgICAgIHBlbmRpbmdJbmJvdW5kTWVzc2FnZXM6IDAsXG4gICAgICBwZW5kaW5nT3V0Ym91bmRNZXNzYWdlczogMCxcbiAgICAgIHNvY2tldEJ1ZmZlcmVkQnl0ZXM6IDAsXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLmNvbm5lY3Rpb25zLnZhbHVlcygpKSB7XG4gICAgICBpZiAoIWlzVGVsZW1ldHJ5SW5zcGVjdGFibGVDb25uZWN0aW9uKGNvbm5lY3Rpb24pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb25uZWN0aW9uU25hcHNob3QgPSBjb25uZWN0aW9uLmdldFRlbGVtZXRyeVNuYXBzaG90KCk7XG4gICAgICBzbmFwc2hvdC5wZW5kaW5nSW5ib3VuZE1lc3NhZ2VzICs9IGNvbm5lY3Rpb25TbmFwc2hvdC5wZW5kaW5nSW5ib3VuZE1lc3NhZ2VzO1xuICAgICAgc25hcHNob3QucGVuZGluZ091dGJvdW5kTWVzc2FnZXMgKz0gY29ubmVjdGlvblNuYXBzaG90LnBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzO1xuICAgICAgc25hcHNob3Quc29ja2V0QnVmZmVyZWRCeXRlcyArPSBjb25uZWN0aW9uU25hcHNob3Quc29ja2V0QnVmZmVyZWRCeXRlcztcbiAgICB9XG5cbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cblxuICBjbG9zZUFsbChjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGhpcy5jb25uZWN0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgY29ubmVjdGlvbi5jbG9zZShjb2RlLCByZWFzb24pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1RlbGVtZXRyeUluc3BlY3RhYmxlQ29ubmVjdGlvbihcbiAgY29ubmVjdGlvbjogTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24sXG4pOiBjb25uZWN0aW9uIGlzIE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uICYgVGVsZW1ldHJ5SW5zcGVjdGFibGVDb25uZWN0aW9uIHtcbiAgcmV0dXJuIChcbiAgICBcImdldFRlbGVtZXRyeVNuYXBzaG90XCIgaW4gY29ubmVjdGlvbiAmJiB0eXBlb2YgY29ubmVjdGlvbi5nZXRUZWxlbWV0cnlTbmFwc2hvdCA9PT0gXCJmdW5jdGlvblwiXG4gICk7XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBc0VBLFNBQVMsaUNBQ1AsWUFDMkU7Q0FDM0UsT0FDRSwwQkFBMEIsY0FBYyxPQUFPLFdBQVcseUJBQXlCO0FBRXZGOzs7Q0F0RWEsZ0NBQWIsTUFBMkM7RUFDekMsOEJBQStCLElBQUksSUFBd0M7RUFFM0UsU0FBUyxZQUE4QztHQUNyRCxLQUFLLFlBQVksSUFBSSxXQUFXLElBQUksVUFBVTtFQUNoRDtFQUVBLFdBQVcsY0FBNEI7R0FDckMsS0FBSyxZQUFZLE9BQU8sWUFBWTtFQUN0QztFQUVBLGNBQWMsY0FBOEQ7R0FDMUUsT0FBTyxLQUFLLFlBQVksSUFBSSxZQUFZO0VBQzFDO0VBRUEsZUFBZSxlQUF1RDtHQUNwRSxNQUFNLFVBQXdDLENBQUM7R0FDL0MsTUFBTSx1QkFBTyxJQUFJLElBQVk7R0FFN0IsS0FBSyxNQUFNLGdCQUFnQixlQUFlO0lBQ3hDLElBQUksS0FBSyxJQUFJLFlBQVksR0FDdkI7SUFFRixLQUFLLElBQUksWUFBWTtJQUVyQixNQUFNLGFBQWEsS0FBSyxZQUFZLElBQUksWUFBWTtJQUNwRCxJQUFJLENBQUMsY0FBYyxXQUFXLFFBQzVCO0lBR0YsUUFBUSxLQUFLLFVBQVU7R0FDekI7R0FFQSxPQUFPO0VBQ1Q7RUFFQSx1QkFBNkQ7R0FDM0QsTUFBTSxXQUFpRDtJQUNyRCx3QkFBd0I7SUFDeEIseUJBQXlCO0lBQ3pCLHFCQUFxQjtHQUN2QjtHQUVBLEtBQUssTUFBTSxjQUFjLEtBQUssWUFBWSxPQUFPLEdBQUc7SUFDbEQsSUFBSSxDQUFDLGlDQUFpQyxVQUFVLEdBQzlDO0lBR0YsTUFBTSxxQkFBcUIsV0FBVyxxQkFBcUI7SUFDM0QsU0FBUywwQkFBMEIsbUJBQW1CO0lBQ3RELFNBQVMsMkJBQTJCLG1CQUFtQjtJQUN2RCxTQUFTLHVCQUF1QixtQkFBbUI7R0FDckQ7R0FFQSxPQUFPO0VBQ1Q7RUFFQSxTQUFTLE1BQWUsUUFBdUI7R0FDN0MsS0FBSyxNQUFNLGNBQWMsS0FBSyxZQUFZLE9BQU8sR0FDL0MsV0FBVyxNQUFNLE1BQU0sTUFBTTtFQUVqQztDQUNGIn0=
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
2
|
-
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
3
2
|
//#region src/stream/ws-presence-store.ts
|
|
4
3
|
function getBindingKey(namespace, id) {
|
|
5
4
|
return `${namespace}::${id}`;
|
|
@@ -14,88 +13,68 @@ function parseBindingKey(key) {
|
|
|
14
13
|
var InMemoryWebSocketPresenceStore;
|
|
15
14
|
var init_ws_presence_store = __esmMin((() => {
|
|
16
15
|
InMemoryWebSocketPresenceStore = class {
|
|
17
|
-
connections = new Map();
|
|
18
|
-
rooms = new Map();
|
|
19
|
-
users = new Map();
|
|
16
|
+
connections = /* @__PURE__ */ new Map();
|
|
17
|
+
rooms = /* @__PURE__ */ new Map();
|
|
18
|
+
users = /* @__PURE__ */ new Map();
|
|
20
19
|
register(input) {
|
|
21
20
|
const meta = {
|
|
22
21
|
sessionId: input.sessionId,
|
|
23
22
|
nodeId: input.nodeId,
|
|
24
23
|
namespace: input.namespace,
|
|
25
24
|
active: input.active ?? true,
|
|
26
|
-
rooms: new Set(),
|
|
27
|
-
connectedAt: new Date(),
|
|
28
|
-
lastSeenAt: new Date()
|
|
25
|
+
rooms: /* @__PURE__ */ new Set(),
|
|
26
|
+
connectedAt: /* @__PURE__ */ new Date(),
|
|
27
|
+
lastSeenAt: /* @__PURE__ */ new Date()
|
|
29
28
|
};
|
|
30
29
|
this.connections.set(input.sessionId, meta);
|
|
31
30
|
return meta;
|
|
32
31
|
}
|
|
33
32
|
activate(sessionId) {
|
|
34
33
|
const meta = this.connections.get(sessionId);
|
|
35
|
-
if (!meta)
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
34
|
+
if (!meta) return;
|
|
38
35
|
meta.active = true;
|
|
39
36
|
}
|
|
40
37
|
unregister(sessionId) {
|
|
41
38
|
const meta = this.connections.get(sessionId);
|
|
42
|
-
if (!meta)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (meta.userId !== undefined) {
|
|
46
|
-
this.removeUserBinding(meta.namespace, meta.userId, sessionId);
|
|
47
|
-
}
|
|
48
|
-
for (const roomId of meta.rooms) {
|
|
49
|
-
this.removeRoomBinding(meta.namespace, roomId, sessionId);
|
|
50
|
-
}
|
|
39
|
+
if (!meta) return;
|
|
40
|
+
if (meta.userId !== void 0) this.removeUserBinding(meta.namespace, meta.userId, sessionId);
|
|
41
|
+
for (const roomId of meta.rooms) this.removeRoomBinding(meta.namespace, roomId, sessionId);
|
|
51
42
|
this.connections.delete(sessionId);
|
|
52
43
|
return meta;
|
|
53
44
|
}
|
|
54
45
|
touch(sessionId) {
|
|
55
46
|
const meta = this.connections.get(sessionId);
|
|
56
|
-
if (!meta)
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
meta.lastSeenAt = new Date();
|
|
47
|
+
if (!meta) return;
|
|
48
|
+
meta.lastSeenAt = /* @__PURE__ */ new Date();
|
|
60
49
|
}
|
|
61
50
|
setUserId(sessionId, userId) {
|
|
62
51
|
const meta = this.connections.get(sessionId);
|
|
63
|
-
if (!meta)
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
if (meta.userId !== undefined) {
|
|
67
|
-
this.removeUserBinding(meta.namespace, meta.userId, sessionId);
|
|
68
|
-
}
|
|
52
|
+
if (!meta) return;
|
|
53
|
+
if (meta.userId !== void 0) this.removeUserBinding(meta.namespace, meta.userId, sessionId);
|
|
69
54
|
meta.userId = userId;
|
|
70
55
|
const key = getBindingKey(meta.namespace, String(userId));
|
|
71
|
-
const bound = this.users.get(key) ?? new Set();
|
|
56
|
+
const bound = this.users.get(key) ?? /* @__PURE__ */ new Set();
|
|
72
57
|
bound.add(sessionId);
|
|
73
58
|
this.users.set(key, bound);
|
|
74
59
|
}
|
|
75
60
|
clearUserId(sessionId) {
|
|
76
61
|
const meta = this.connections.get(sessionId);
|
|
77
|
-
if (!meta || meta.userId ===
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
62
|
+
if (!meta || meta.userId === void 0) return;
|
|
80
63
|
this.removeUserBinding(meta.namespace, meta.userId, sessionId);
|
|
81
64
|
delete meta.userId;
|
|
82
65
|
}
|
|
83
66
|
join(sessionId, roomId) {
|
|
84
67
|
const meta = this.connections.get(sessionId);
|
|
85
|
-
if (!meta)
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
68
|
+
if (!meta) return;
|
|
88
69
|
meta.rooms.add(roomId);
|
|
89
70
|
const key = getBindingKey(meta.namespace, roomId);
|
|
90
|
-
const members = this.rooms.get(key) ?? new Set();
|
|
71
|
+
const members = this.rooms.get(key) ?? /* @__PURE__ */ new Set();
|
|
91
72
|
members.add(sessionId);
|
|
92
73
|
this.rooms.set(key, members);
|
|
93
74
|
}
|
|
94
75
|
leave(sessionId, roomId) {
|
|
95
76
|
const meta = this.connections.get(sessionId);
|
|
96
|
-
if (!meta)
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
77
|
+
if (!meta) return;
|
|
99
78
|
meta.rooms.delete(roomId);
|
|
100
79
|
this.removeRoomBinding(meta.namespace, roomId, sessionId);
|
|
101
80
|
}
|
|
@@ -105,9 +84,7 @@ var init_ws_presence_store = __esmMin((() => {
|
|
|
105
84
|
getConnectionCount(namespace) {
|
|
106
85
|
let count = 0;
|
|
107
86
|
for (const meta of this.connections.values()) {
|
|
108
|
-
if (!meta.active || namespace && meta.namespace !== namespace)
|
|
109
|
-
continue;
|
|
110
|
-
}
|
|
87
|
+
if (!meta.active || namespace && meta.namespace !== namespace) continue;
|
|
111
88
|
count += 1;
|
|
112
89
|
}
|
|
113
90
|
return count;
|
|
@@ -118,9 +95,7 @@ var init_ws_presence_store = __esmMin((() => {
|
|
|
118
95
|
getStats() {
|
|
119
96
|
const byNamespace = {};
|
|
120
97
|
for (const meta of this.connections.values()) {
|
|
121
|
-
if (!meta.active)
|
|
122
|
-
continue;
|
|
123
|
-
}
|
|
98
|
+
if (!meta.active) continue;
|
|
124
99
|
byNamespace[meta.namespace] = (byNamespace[meta.namespace] ?? 0) + 1;
|
|
125
100
|
}
|
|
126
101
|
return {
|
|
@@ -138,27 +113,19 @@ var init_ws_presence_store = __esmMin((() => {
|
|
|
138
113
|
const metas = [];
|
|
139
114
|
for (const connectionId of audience.connectionIds) {
|
|
140
115
|
const meta = this.connections.get(connectionId);
|
|
141
|
-
if (!meta?.active)
|
|
142
|
-
|
|
143
|
-
}
|
|
144
|
-
if (audience.namespace && meta.namespace !== audience.namespace) {
|
|
145
|
-
continue;
|
|
146
|
-
}
|
|
116
|
+
if (!meta?.active) continue;
|
|
117
|
+
if (audience.namespace && meta.namespace !== audience.namespace) continue;
|
|
147
118
|
metas.push(meta);
|
|
148
119
|
}
|
|
149
120
|
return metas;
|
|
150
121
|
}
|
|
151
122
|
case "union": {
|
|
152
|
-
const seen = new Set();
|
|
123
|
+
const seen = /* @__PURE__ */ new Set();
|
|
153
124
|
const metas = [];
|
|
154
|
-
for (const item of audience.audiences) {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
seen.add(meta.sessionId);
|
|
160
|
-
metas.push(meta);
|
|
161
|
-
}
|
|
125
|
+
for (const item of audience.audiences) for (const meta of this.queryAudience(item)) {
|
|
126
|
+
if (seen.has(meta.sessionId)) continue;
|
|
127
|
+
seen.add(meta.sessionId);
|
|
128
|
+
metas.push(meta);
|
|
162
129
|
}
|
|
163
130
|
return metas;
|
|
164
131
|
}
|
|
@@ -167,27 +134,19 @@ var init_ws_presence_store = __esmMin((() => {
|
|
|
167
134
|
getActiveConnections(namespace) {
|
|
168
135
|
const metas = [];
|
|
169
136
|
for (const meta of this.connections.values()) {
|
|
170
|
-
if (!meta.active || namespace && meta.namespace !== namespace)
|
|
171
|
-
continue;
|
|
172
|
-
}
|
|
137
|
+
if (!meta.active || namespace && meta.namespace !== namespace) continue;
|
|
173
138
|
metas.push(meta);
|
|
174
139
|
}
|
|
175
140
|
return metas;
|
|
176
141
|
}
|
|
177
142
|
getBoundConnections(bindings, id, namespace) {
|
|
178
143
|
const metas = [];
|
|
179
|
-
const seen = new Set();
|
|
180
|
-
for (const members of this.getScopedBindings(bindings, id, namespace)) {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
seen.add(connectionId);
|
|
186
|
-
const meta = this.connections.get(connectionId);
|
|
187
|
-
if (meta?.active) {
|
|
188
|
-
metas.push(meta);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
144
|
+
const seen = /* @__PURE__ */ new Set();
|
|
145
|
+
for (const members of this.getScopedBindings(bindings, id, namespace)) for (const connectionId of members) {
|
|
146
|
+
if (seen.has(connectionId)) continue;
|
|
147
|
+
seen.add(connectionId);
|
|
148
|
+
const meta = this.connections.get(connectionId);
|
|
149
|
+
if (meta?.active) metas.push(meta);
|
|
191
150
|
}
|
|
192
151
|
return metas;
|
|
193
152
|
}
|
|
@@ -197,40 +156,27 @@ var init_ws_presence_store = __esmMin((() => {
|
|
|
197
156
|
return exact ? [exact] : [];
|
|
198
157
|
}
|
|
199
158
|
const matches = [];
|
|
200
|
-
for (const [key, members] of bindings)
|
|
201
|
-
const parsed = parseBindingKey(key);
|
|
202
|
-
if (parsed.id === id) {
|
|
203
|
-
matches.push(members);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
159
|
+
for (const [key, members] of bindings) if (parseBindingKey(key).id === id) matches.push(members);
|
|
206
160
|
return matches;
|
|
207
161
|
}
|
|
208
162
|
removeRoomBinding(namespace, roomId, sessionId) {
|
|
209
163
|
const key = getBindingKey(namespace, roomId);
|
|
210
164
|
const members = this.rooms.get(key);
|
|
211
|
-
if (!members)
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
165
|
+
if (!members) return;
|
|
214
166
|
members.delete(sessionId);
|
|
215
|
-
if (members.size === 0)
|
|
216
|
-
this.rooms.delete(key);
|
|
217
|
-
}
|
|
167
|
+
if (members.size === 0) this.rooms.delete(key);
|
|
218
168
|
}
|
|
219
169
|
removeUserBinding(namespace, userId, sessionId) {
|
|
220
170
|
const key = getBindingKey(namespace, String(userId));
|
|
221
171
|
const members = this.users.get(key);
|
|
222
|
-
if (!members)
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
172
|
+
if (!members) return;
|
|
225
173
|
members.delete(sessionId);
|
|
226
|
-
if (members.size === 0)
|
|
227
|
-
this.users.delete(key);
|
|
228
|
-
}
|
|
174
|
+
if (members.size === 0) this.users.delete(key);
|
|
229
175
|
}
|
|
230
176
|
};
|
|
231
177
|
}));
|
|
232
|
-
|
|
233
178
|
//#endregion
|
|
234
179
|
init_ws_presence_store();
|
|
235
180
|
export { InMemoryWebSocketPresenceStore, init_ws_presence_store };
|
|
236
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtcHJlc2VuY2Utc3RvcmUuanMiLCJuYW1lcyI6WyJtZXRhOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2UiLCJieU5hbWVzcGFjZTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiIsIm1ldGFzOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2VbXSIsIm1hdGNoZXM6IFNldDxzdHJpbmc+W10iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RyZWFtL3dzLXByZXNlbmNlLXN0b3JlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgV2ViU29ja2V0QXVkaWVuY2UgfSBmcm9tIFwiLi93cy1hdWRpZW5jZVwiO1xuaW1wb3J0IHsgdHlwZSBXZWJTb2NrZXRSZWdpc3RyeVN0YXRzLCB0eXBlIFdlYlNvY2tldFJvb21JZCwgdHlwZSBXZWJTb2NrZXRVc2VySWQgfSBmcm9tIFwiLi93cy1jb3JlXCI7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZSA9IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIG5vZGVJZDogc3RyaW5nO1xuICBuYW1lc3BhY2U6IHN0cmluZztcbiAgYWN0aXZlOiBib29sZWFuO1xuICByb29tczogU2V0PFdlYlNvY2tldFJvb21JZD47XG4gIGNvbm5lY3RlZEF0OiBEYXRlO1xuICBsYXN0U2VlbkF0OiBEYXRlO1xuICB1c2VySWQ/OiBXZWJTb2NrZXRVc2VySWQ7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFByZXNlbmNlU3RvcmUge1xuICByZWdpc3RlcihpbnB1dDoge1xuICAgIHNlc3Npb25JZDogc3RyaW5nO1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICAgIG5hbWVzcGFjZTogc3RyaW5nO1xuICAgIGFjdGl2ZT86IGJvb2xlYW47XG4gIH0pOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2U7XG4gIGFjdGl2YXRlKHNlc3Npb25JZDogc3RyaW5nKTogdm9pZDtcbiAgdW5yZWdpc3RlcihzZXNzaW9uSWQ6IHN0cmluZyk6IFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZSB8IHVuZGVmaW5lZDtcbiAgdG91Y2goc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkO1xuICBzZXRVc2VySWQoc2Vzc2lvbklkOiBzdHJpbmcsIHVzZXJJZDogV2ViU29ja2V0VXNlcklkKTogdm9pZDtcbiAgY2xlYXJVc2VySWQoc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkO1xuICBqb2luKHNlc3Npb25JZDogc3RyaW5nLCByb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IHZvaWQ7XG4gIGxlYXZlKHNlc3Npb25JZDogc3RyaW5nLCByb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IHZvaWQ7XG4gIGdldENvbm5lY3Rpb24oc2Vzc2lvbklkOiBzdHJpbmcpOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2UgfCB1bmRlZmluZWQ7XG4gIGdldENvbm5lY3Rpb25Db3VudChuYW1lc3BhY2U/OiBzdHJpbmcpOiBudW1iZXI7XG4gIGdldFJvb21NZW1iZXJzKHJvb21JZDogV2ViU29ja2V0Um9vbUlkLCBuYW1lc3BhY2U/OiBzdHJpbmcpOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2VbXTtcbiAgZ2V0U3RhdHMoKTogV2ViU29ja2V0UmVnaXN0cnlTdGF0cztcbiAgcXVlcnlBdWRpZW5jZShhdWRpZW5jZTogV2ViU29ja2V0QXVkaWVuY2UpOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2VbXTtcbn1cblxuZXhwb3J0IGNsYXNzIEluTWVtb3J5V2ViU29ja2V0UHJlc2VuY2VTdG9yZSBpbXBsZW1lbnRzIFdlYlNvY2tldFByZXNlbmNlU3RvcmUge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpb25zID0gbmV3IE1hcDxzdHJpbmcsIFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSByb29tcyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblxuICByZWdpc3RlcihpbnB1dDoge1xuICAgIHNlc3Npb25JZDogc3RyaW5nO1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICAgIG5hbWVzcGFjZTogc3RyaW5nO1xuICAgIGFjdGl2ZT86IGJvb2xlYW47XG4gIH0pOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2Uge1xuICAgIGNvbnN0IG1ldGE6IFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZSA9IHtcbiAgICAgIHNlc3Npb25JZDogaW5wdXQuc2Vzc2lvbklkLFxuICAgICAgbm9kZUlkOiBpbnB1dC5ub2RlSWQsXG4gICAgICBuYW1lc3BhY2U6IGlucHV0Lm5hbWVzcGFjZSxcbiAgICAgIGFjdGl2ZTogaW5wdXQuYWN0aXZlID8/IHRydWUsXG4gICAgICByb29tczogbmV3IFNldCgpLFxuICAgICAgY29ubmVjdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICBsYXN0U2VlbkF0OiBuZXcgRGF0ZSgpLFxuICAgIH07XG4gICAgdGhpcy5jb25uZWN0aW9ucy5zZXQoaW5wdXQuc2Vzc2lvbklkLCBtZXRhKTtcbiAgICByZXR1cm4gbWV0YTtcbiAgfVxuXG4gIGFjdGl2YXRlKHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KHNlc3Npb25JZCk7XG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbWV0YS5hY3RpdmUgPSB0cnVlO1xuICB9XG5cbiAgdW5yZWdpc3RlcihzZXNzaW9uSWQ6IHN0cmluZyk6IFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KHNlc3Npb25JZCk7XG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChtZXRhLnVzZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJlbW92ZVVzZXJCaW5kaW5nKG1ldGEubmFtZXNwYWNlLCBtZXRhLnVzZXJJZCwgc2Vzc2lvbklkKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvb21JZCBvZiBtZXRhLnJvb21zKSB7XG4gICAgICB0aGlzLnJlbW92ZVJvb21CaW5kaW5nKG1ldGEubmFtZXNwYWNlLCByb29tSWQsIHNlc3Npb25JZCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb25uZWN0aW9ucy5kZWxldGUoc2Vzc2lvbklkKTtcbiAgICByZXR1cm4gbWV0YTtcbiAgfVxuXG4gIHRvdWNoKHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KHNlc3Npb25JZCk7XG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbWV0YS5sYXN0U2VlbkF0ID0gbmV3IERhdGUoKTtcbiAgfVxuXG4gIHNldFVzZXJJZChzZXNzaW9uSWQ6IHN0cmluZywgdXNlcklkOiBXZWJTb2NrZXRVc2VySWQpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5jb25uZWN0aW9ucy5nZXQoc2Vzc2lvbklkKTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobWV0YS51c2VySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yZW1vdmVVc2VyQmluZGluZyhtZXRhLm5hbWVzcGFjZSwgbWV0YS51c2VySWQsIHNlc3Npb25JZCk7XG4gICAgfVxuXG4gICAgbWV0YS51c2VySWQgPSB1c2VySWQ7XG4gICAgY29uc3Qga2V5ID0gZ2V0QmluZGluZ0tleShtZXRhLm5hbWVzcGFjZSwgU3RyaW5nKHVzZXJJZCkpO1xuICAgIGNvbnN0IGJvdW5kID0gdGhpcy51c2Vycy5nZXQoa2V5KSA/PyBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBib3VuZC5hZGQoc2Vzc2lvbklkKTtcbiAgICB0aGlzLnVzZXJzLnNldChrZXksIGJvdW5kKTtcbiAgfVxuXG4gIGNsZWFyVXNlcklkKHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KHNlc3Npb25JZCk7XG4gICAgaWYgKCFtZXRhIHx8IG1ldGEudXNlcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlbW92ZVVzZXJCaW5kaW5nKG1ldGEubmFtZXNwYWNlLCBtZXRhLnVzZXJJZCwgc2Vzc2lvbklkKTtcbiAgICBkZWxldGUgbWV0YS51c2VySWQ7XG4gIH1cblxuICBqb2luKHNlc3Npb25JZDogc3RyaW5nLCByb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IHZvaWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNvbm5lY3Rpb25zLmdldChzZXNzaW9uSWQpO1xuICAgIGlmICghbWV0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG1ldGEucm9vbXMuYWRkKHJvb21JZCk7XG4gICAgY29uc3Qga2V5ID0gZ2V0QmluZGluZ0tleShtZXRhLm5hbWVzcGFjZSwgcm9vbUlkKTtcbiAgICBjb25zdCBtZW1iZXJzID0gdGhpcy5yb29tcy5nZXQoa2V5KSA/PyBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBtZW1iZXJzLmFkZChzZXNzaW9uSWQpO1xuICAgIHRoaXMucm9vbXMuc2V0KGtleSwgbWVtYmVycyk7XG4gIH1cblxuICBsZWF2ZShzZXNzaW9uSWQ6IHN0cmluZywgcm9vbUlkOiBXZWJTb2NrZXRSb29tSWQpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5jb25uZWN0aW9ucy5nZXQoc2Vzc2lvbklkKTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBtZXRhLnJvb21zLmRlbGV0ZShyb29tSWQpO1xuICAgIHRoaXMucmVtb3ZlUm9vbUJpbmRpbmcobWV0YS5uYW1lc3BhY2UsIHJvb21JZCwgc2Vzc2lvbklkKTtcbiAgfVxuXG4gIGdldENvbm5lY3Rpb24oc2Vzc2lvbklkOiBzdHJpbmcpOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25zLmdldChzZXNzaW9uSWQpO1xuICB9XG5cbiAgZ2V0Q29ubmVjdGlvbkNvdW50KG5hbWVzcGFjZT86IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IGNvdW50ID0gMDtcblxuICAgIGZvciAoY29uc3QgbWV0YSBvZiB0aGlzLmNvbm5lY3Rpb25zLnZhbHVlcygpKSB7XG4gICAgICBpZiAoIW1ldGEuYWN0aXZlIHx8IChuYW1lc3BhY2UgJiYgbWV0YS5uYW1lc3BhY2UgIT09IG5hbWVzcGFjZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgZ2V0Um9vbU1lbWJlcnMocm9vbUlkOiBXZWJTb2NrZXRSb29tSWQsIG5hbWVzcGFjZT86IHN0cmluZyk6IFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb3VuZENvbm5lY3Rpb25zKHRoaXMucm9vbXMsIHJvb21JZCwgbmFtZXNwYWNlKTtcbiAgfVxuXG4gIGdldFN0YXRzKCk6IFdlYlNvY2tldFJlZ2lzdHJ5U3RhdHMge1xuICAgIGNvbnN0IGJ5TmFtZXNwYWNlOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IG1ldGEgb2YgdGhpcy5jb25uZWN0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgaWYgKCFtZXRhLmFjdGl2ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJ5TmFtZXNwYWNlW21ldGEubmFtZXNwYWNlXSA9IChieU5hbWVzcGFjZVttZXRhLm5hbWVzcGFjZV0gPz8gMCkgKyAxO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbENvbm5lY3Rpb25zOiBPYmplY3QudmFsdWVzKGJ5TmFtZXNwYWNlKS5yZWR1Y2UoKHN1bSwgY291bnQpID0+IHN1bSArIGNvdW50LCAwKSxcbiAgICAgIHRvdGFsUm9vbXM6IHRoaXMucm9vbXMuc2l6ZSxcbiAgICAgIGJ5TmFtZXNwYWNlLFxuICAgIH07XG4gIH1cblxuICBxdWVyeUF1ZGllbmNlKGF1ZGllbmNlOiBXZWJTb2NrZXRBdWRpZW5jZSk6IFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZVtdIHtcbiAgICBzd2l0Y2ggKGF1ZGllbmNlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJhbGxcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlQ29ubmVjdGlvbnMoYXVkaWVuY2UubmFtZXNwYWNlKTtcbiAgICAgIGNhc2UgXCJyb29tXCI6XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJvdW5kQ29ubmVjdGlvbnModGhpcy5yb29tcywgYXVkaWVuY2Uucm9vbUlkLCBhdWRpZW5jZS5uYW1lc3BhY2UpO1xuICAgICAgY2FzZSBcInVzZXJcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Qm91bmRDb25uZWN0aW9ucyh0aGlzLnVzZXJzLCBTdHJpbmcoYXVkaWVuY2UudXNlcklkKSwgYXVkaWVuY2UubmFtZXNwYWNlKTtcbiAgICAgIGNhc2UgXCJjb25uZWN0aW9uc1wiOiB7XG4gICAgICAgIGNvbnN0IG1ldGFzOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2VbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgY29ubmVjdGlvbklkIG9mIGF1ZGllbmNlLmNvbm5lY3Rpb25JZHMpIHtcbiAgICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5jb25uZWN0aW9ucy5nZXQoY29ubmVjdGlvbklkKTtcbiAgICAgICAgICBpZiAoIW1ldGE/LmFjdGl2ZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhdWRpZW5jZS5uYW1lc3BhY2UgJiYgbWV0YS5uYW1lc3BhY2UgIT09IGF1ZGllbmNlLm5hbWVzcGFjZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1ldGFzLnB1c2gobWV0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWV0YXM7XG4gICAgICB9XG4gICAgICBjYXNlIFwidW5pb25cIjoge1xuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGNvbnN0IG1ldGFzOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2VbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhdWRpZW5jZS5hdWRpZW5jZXMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG1ldGEgb2YgdGhpcy5xdWVyeUF1ZGllbmNlKGl0ZW0pKSB7XG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMobWV0YS5zZXNzaW9uSWQpKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWVuLmFkZChtZXRhLnNlc3Npb25JZCk7XG4gICAgICAgICAgICBtZXRhcy5wdXNoKG1ldGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtZXRhcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEFjdGl2ZUNvbm5lY3Rpb25zKG5hbWVzcGFjZT86IHN0cmluZyk6IFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZVtdIHtcbiAgICBjb25zdCBtZXRhczogV2ViU29ja2V0U2Vzc2lvblByZXNlbmNlW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgbWV0YSBvZiB0aGlzLmNvbm5lY3Rpb25zLnZhbHVlcygpKSB7XG4gICAgICBpZiAoIW1ldGEuYWN0aXZlIHx8IChuYW1lc3BhY2UgJiYgbWV0YS5uYW1lc3BhY2UgIT09IG5hbWVzcGFjZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIG1ldGFzLnB1c2gobWV0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGFzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCb3VuZENvbm5lY3Rpb25zKFxuICAgIGJpbmRpbmdzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmcsXG4gICk6IFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZVtdIHtcbiAgICBjb25zdCBtZXRhczogV2ViU29ja2V0U2Vzc2lvblByZXNlbmNlW10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG1lbWJlcnMgb2YgdGhpcy5nZXRTY29wZWRCaW5kaW5ncyhiaW5kaW5ncywgaWQsIG5hbWVzcGFjZSkpIHtcbiAgICAgIGZvciAoY29uc3QgY29ubmVjdGlvbklkIG9mIG1lbWJlcnMpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKGNvbm5lY3Rpb25JZCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBzZWVuLmFkZChjb25uZWN0aW9uSWQpO1xuXG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uSWQpO1xuICAgICAgICBpZiAobWV0YT8uYWN0aXZlKSB7XG4gICAgICAgICAgbWV0YXMucHVzaChtZXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtZXRhcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2NvcGVkQmluZGluZ3MoXG4gICAgYmluZGluZ3M6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PixcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWVzcGFjZT86IHN0cmluZyxcbiAgKTogU2V0PHN0cmluZz5bXSB7XG4gICAgaWYgKG5hbWVzcGFjZSkge1xuICAgICAgY29uc3QgZXhhY3QgPSBiaW5kaW5ncy5nZXQoZ2V0QmluZGluZ0tleShuYW1lc3BhY2UsIGlkKSk7XG4gICAgICByZXR1cm4gZXhhY3QgPyBbZXhhY3RdIDogW107XG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2hlczogU2V0PHN0cmluZz5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgbWVtYmVyc10gb2YgYmluZGluZ3MpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQmluZGluZ0tleShrZXkpO1xuICAgICAgaWYgKHBhcnNlZC5pZCA9PT0gaWQpIHtcbiAgICAgICAgbWF0Y2hlcy5wdXNoKG1lbWJlcnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXRjaGVzO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVSb29tQmluZGluZyhuYW1lc3BhY2U6IHN0cmluZywgcm9vbUlkOiBXZWJTb2NrZXRSb29tSWQsIHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gZ2V0QmluZGluZ0tleShuYW1lc3BhY2UsIHJvb21JZCk7XG4gICAgY29uc3QgbWVtYmVycyA9IHRoaXMucm9vbXMuZ2V0KGtleSk7XG4gICAgaWYgKCFtZW1iZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbWVtYmVycy5kZWxldGUoc2Vzc2lvbklkKTtcbiAgICBpZiAobWVtYmVycy5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLnJvb21zLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlVXNlckJpbmRpbmcobmFtZXNwYWNlOiBzdHJpbmcsIHVzZXJJZDogV2ViU29ja2V0VXNlcklkLCBzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IGdldEJpbmRpbmdLZXkobmFtZXNwYWNlLCBTdHJpbmcodXNlcklkKSk7XG4gICAgY29uc3QgbWVtYmVycyA9IHRoaXMudXNlcnMuZ2V0KGtleSk7XG4gICAgaWYgKCFtZW1iZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbWVtYmVycy5kZWxldGUoc2Vzc2lvbklkKTtcbiAgICBpZiAobWVtYmVycy5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLnVzZXJzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRCaW5kaW5nS2V5KG5hbWVzcGFjZTogc3RyaW5nLCBpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke25hbWVzcGFjZX06OiR7aWR9YDtcbn1cblxuZnVuY3Rpb24gcGFyc2VCaW5kaW5nS2V5KGtleTogc3RyaW5nKTogeyBuYW1lc3BhY2U6IHN0cmluZzsgaWQ6IHN0cmluZyB9IHtcbiAgY29uc3QgW25hbWVzcGFjZSwgLi4ucmVzdF0gPSBrZXkuc3BsaXQoXCI6OlwiKTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lc3BhY2UsXG4gICAgaWQ6IHJlc3Quam9pbihcIjo6XCIpLFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7QUEyVEEsU0FBUyxjQUFjLFdBQW1CLElBQW9CO0FBQzVELFFBQU8sR0FBRyxVQUFVLElBQUk7O0FBRzFCLFNBQVMsZ0JBQWdCLEtBQWdEO0NBQ3ZFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsUUFBUSxJQUFJLE1BQU0sS0FBSztBQUM1QyxRQUFPO0VBQ0w7RUFDQSxJQUFJLEtBQUssS0FBSyxLQUFLO0VBQ3BCOzs7O0NBalNVLGlDQUFiLE1BQThFO0VBQzVFLEFBQWlCLGNBQWMsSUFBSSxLQUF1QztFQUMxRSxBQUFpQixRQUFRLElBQUksS0FBMEI7RUFDdkQsQUFBaUIsUUFBUSxJQUFJLEtBQTBCO0VBRXZELFNBQVMsT0FLb0I7R0FDM0IsTUFBTUEsT0FBaUM7SUFDckMsV0FBVyxNQUFNO0lBQ2pCLFFBQVEsTUFBTTtJQUNkLFdBQVcsTUFBTTtJQUNqQixRQUFRLE1BQU0sVUFBVTtJQUN4QixPQUFPLElBQUksS0FBSztJQUNoQixhQUFhLElBQUksTUFBTTtJQUN2QixZQUFZLElBQUksTUFBTTtJQUN2QjtBQUNELFFB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
|
|
181
|
+
|
|
182
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtcHJlc2VuY2Utc3RvcmUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy1wcmVzZW5jZS1zdG9yZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIFdlYlNvY2tldEF1ZGllbmNlIH0gZnJvbSBcIi4vd3MtYXVkaWVuY2VcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0UmVnaXN0cnlTdGF0cywgdHlwZSBXZWJTb2NrZXRSb29tSWQsIHR5cGUgV2ViU29ja2V0VXNlcklkIH0gZnJvbSBcIi4vd3MtY29yZVwiO1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2UgPSB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBub2RlSWQ6IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIGFjdGl2ZTogYm9vbGVhbjtcbiAgcm9vbXM6IFNldDxXZWJTb2NrZXRSb29tSWQ+O1xuICBjb25uZWN0ZWRBdDogRGF0ZTtcbiAgbGFzdFNlZW5BdDogRGF0ZTtcbiAgdXNlcklkPzogV2ViU29ja2V0VXNlcklkO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlIHtcbiAgcmVnaXN0ZXIoaW5wdXQ6IHtcbiAgICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgICBuYW1lc3BhY2U6IHN0cmluZztcbiAgICBhY3RpdmU/OiBib29sZWFuO1xuICB9KTogV2ViU29ja2V0U2Vzc2lvblByZXNlbmNlO1xuICBhY3RpdmF0ZShzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQ7XG4gIHVucmVnaXN0ZXIoc2Vzc2lvbklkOiBzdHJpbmcpOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2UgfCB1bmRlZmluZWQ7XG4gIHRvdWNoKHNlc3Npb25JZDogc3RyaW5nKTogdm9pZDtcbiAgc2V0VXNlcklkKHNlc3Npb25JZDogc3RyaW5nLCB1c2VySWQ6IFdlYlNvY2tldFVzZXJJZCk6IHZvaWQ7XG4gIGNsZWFyVXNlcklkKHNlc3Npb25JZDogc3RyaW5nKTogdm9pZDtcbiAgam9pbihzZXNzaW9uSWQ6IHN0cmluZywgcm9vbUlkOiBXZWJTb2NrZXRSb29tSWQpOiB2b2lkO1xuICBsZWF2ZShzZXNzaW9uSWQ6IHN0cmluZywgcm9vbUlkOiBXZWJTb2NrZXRSb29tSWQpOiB2b2lkO1xuICBnZXRDb25uZWN0aW9uKHNlc3Npb25JZDogc3RyaW5nKTogV2ViU29ja2V0U2Vzc2lvblByZXNlbmNlIHwgdW5kZWZpbmVkO1xuICBnZXRDb25uZWN0aW9uQ291bnQobmFtZXNwYWNlPzogc3RyaW5nKTogbnVtYmVyO1xuICBnZXRSb29tTWVtYmVycyhyb29tSWQ6IFdlYlNvY2tldFJvb21JZCwgbmFtZXNwYWNlPzogc3RyaW5nKTogV2ViU29ja2V0U2Vzc2lvblByZXNlbmNlW107XG4gIGdldFN0YXRzKCk6IFdlYlNvY2tldFJlZ2lzdHJ5U3RhdHM7XG4gIHF1ZXJ5QXVkaWVuY2UoYXVkaWVuY2U6IFdlYlNvY2tldEF1ZGllbmNlKTogV2ViU29ja2V0U2Vzc2lvblByZXNlbmNlW107XG59XG5cbmV4cG9ydCBjbGFzcyBJbk1lbW9yeVdlYlNvY2tldFByZXNlbmNlU3RvcmUgaW1wbGVtZW50cyBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2U+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcm9vbXMgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlcnMgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG5cbiAgcmVnaXN0ZXIoaW5wdXQ6IHtcbiAgICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgICBuYW1lc3BhY2U6IHN0cmluZztcbiAgICBhY3RpdmU/OiBib29sZWFuO1xuICB9KTogV2ViU29ja2V0U2Vzc2lvblByZXNlbmNlIHtcbiAgICBjb25zdCBtZXRhOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2UgPSB7XG4gICAgICBzZXNzaW9uSWQ6IGlucHV0LnNlc3Npb25JZCxcbiAgICAgIG5vZGVJZDogaW5wdXQubm9kZUlkLFxuICAgICAgbmFtZXNwYWNlOiBpbnB1dC5uYW1lc3BhY2UsXG4gICAgICBhY3RpdmU6IGlucHV0LmFjdGl2ZSA/PyB0cnVlLFxuICAgICAgcm9vbXM6IG5ldyBTZXQoKSxcbiAgICAgIGNvbm5lY3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgbGFzdFNlZW5BdDogbmV3IERhdGUoKSxcbiAgICB9O1xuICAgIHRoaXMuY29ubmVjdGlvbnMuc2V0KGlucHV0LnNlc3Npb25JZCwgbWV0YSk7XG4gICAgcmV0dXJuIG1ldGE7XG4gIH1cblxuICBhY3RpdmF0ZShzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNvbm5lY3Rpb25zLmdldChzZXNzaW9uSWQpO1xuICAgIGlmICghbWV0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG1ldGEuYWN0aXZlID0gdHJ1ZTtcbiAgfVxuXG4gIHVucmVnaXN0ZXIoc2Vzc2lvbklkOiBzdHJpbmcpOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2UgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNvbm5lY3Rpb25zLmdldChzZXNzaW9uSWQpO1xuICAgIGlmICghbWV0YSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAobWV0YS51c2VySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yZW1vdmVVc2VyQmluZGluZyhtZXRhLm5hbWVzcGFjZSwgbWV0YS51c2VySWQsIHNlc3Npb25JZCk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByb29tSWQgb2YgbWV0YS5yb29tcykge1xuICAgICAgdGhpcy5yZW1vdmVSb29tQmluZGluZyhtZXRhLm5hbWVzcGFjZSwgcm9vbUlkLCBzZXNzaW9uSWQpO1xuICAgIH1cblxuICAgIHRoaXMuY29ubmVjdGlvbnMuZGVsZXRlKHNlc3Npb25JZCk7XG4gICAgcmV0dXJuIG1ldGE7XG4gIH1cblxuICB0b3VjaChzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNvbm5lY3Rpb25zLmdldChzZXNzaW9uSWQpO1xuICAgIGlmICghbWV0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG1ldGEubGFzdFNlZW5BdCA9IG5ldyBEYXRlKCk7XG4gIH1cblxuICBzZXRVc2VySWQoc2Vzc2lvbklkOiBzdHJpbmcsIHVzZXJJZDogV2ViU29ja2V0VXNlcklkKTogdm9pZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KHNlc3Npb25JZCk7XG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG1ldGEudXNlcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVtb3ZlVXNlckJpbmRpbmcobWV0YS5uYW1lc3BhY2UsIG1ldGEudXNlcklkLCBzZXNzaW9uSWQpO1xuICAgIH1cblxuICAgIG1ldGEudXNlcklkID0gdXNlcklkO1xuICAgIGNvbnN0IGtleSA9IGdldEJpbmRpbmdLZXkobWV0YS5uYW1lc3BhY2UsIFN0cmluZyh1c2VySWQpKTtcbiAgICBjb25zdCBib3VuZCA9IHRoaXMudXNlcnMuZ2V0KGtleSkgPz8gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgYm91bmQuYWRkKHNlc3Npb25JZCk7XG4gICAgdGhpcy51c2Vycy5zZXQoa2V5LCBib3VuZCk7XG4gIH1cblxuICBjbGVhclVzZXJJZChzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNvbm5lY3Rpb25zLmdldChzZXNzaW9uSWQpO1xuICAgIGlmICghbWV0YSB8fCBtZXRhLnVzZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVVc2VyQmluZGluZyhtZXRhLm5hbWVzcGFjZSwgbWV0YS51c2VySWQsIHNlc3Npb25JZCk7XG4gICAgZGVsZXRlIG1ldGEudXNlcklkO1xuICB9XG5cbiAgam9pbihzZXNzaW9uSWQ6IHN0cmluZywgcm9vbUlkOiBXZWJTb2NrZXRSb29tSWQpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5jb25uZWN0aW9ucy5nZXQoc2Vzc2lvbklkKTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBtZXRhLnJvb21zLmFkZChyb29tSWQpO1xuICAgIGNvbnN0IGtleSA9IGdldEJpbmRpbmdLZXkobWV0YS5uYW1lc3BhY2UsIHJvb21JZCk7XG4gICAgY29uc3QgbWVtYmVycyA9IHRoaXMucm9vbXMuZ2V0KGtleSkgPz8gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgbWVtYmVycy5hZGQoc2Vzc2lvbklkKTtcbiAgICB0aGlzLnJvb21zLnNldChrZXksIG1lbWJlcnMpO1xuICB9XG5cbiAgbGVhdmUoc2Vzc2lvbklkOiBzdHJpbmcsIHJvb21JZDogV2ViU29ja2V0Um9vbUlkKTogdm9pZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KHNlc3Npb25JZCk7XG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbWV0YS5yb29tcy5kZWxldGUocm9vbUlkKTtcbiAgICB0aGlzLnJlbW92ZVJvb21CaW5kaW5nKG1ldGEubmFtZXNwYWNlLCByb29tSWQsIHNlc3Npb25JZCk7XG4gIH1cblxuICBnZXRDb25uZWN0aW9uKHNlc3Npb25JZDogc3RyaW5nKTogV2ViU29ja2V0U2Vzc2lvblByZXNlbmNlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9ucy5nZXQoc2Vzc2lvbklkKTtcbiAgfVxuXG4gIGdldENvbm5lY3Rpb25Db3VudChuYW1lc3BhY2U/OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGxldCBjb3VudCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IG1ldGEgb2YgdGhpcy5jb25uZWN0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgaWYgKCFtZXRhLmFjdGl2ZSB8fCAobmFtZXNwYWNlICYmIG1ldGEubmFtZXNwYWNlICE9PSBuYW1lc3BhY2UpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIGdldFJvb21NZW1iZXJzKHJvb21JZDogV2ViU29ja2V0Um9vbUlkLCBuYW1lc3BhY2U/OiBzdHJpbmcpOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2VbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm91bmRDb25uZWN0aW9ucyh0aGlzLnJvb21zLCByb29tSWQsIG5hbWVzcGFjZSk7XG4gIH1cblxuICBnZXRTdGF0cygpOiBXZWJTb2NrZXRSZWdpc3RyeVN0YXRzIHtcbiAgICBjb25zdCBieU5hbWVzcGFjZTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBtZXRhIG9mIHRoaXMuY29ubmVjdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIGlmICghbWV0YS5hY3RpdmUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBieU5hbWVzcGFjZVttZXRhLm5hbWVzcGFjZV0gPSAoYnlOYW1lc3BhY2VbbWV0YS5uYW1lc3BhY2VdID8/IDApICsgMTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxDb25uZWN0aW9uczogT2JqZWN0LnZhbHVlcyhieU5hbWVzcGFjZSkucmVkdWNlKChzdW0sIGNvdW50KSA9PiBzdW0gKyBjb3VudCwgMCksXG4gICAgICB0b3RhbFJvb21zOiB0aGlzLnJvb21zLnNpemUsXG4gICAgICBieU5hbWVzcGFjZSxcbiAgICB9O1xuICB9XG5cbiAgcXVlcnlBdWRpZW5jZShhdWRpZW5jZTogV2ViU29ja2V0QXVkaWVuY2UpOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2VbXSB7XG4gICAgc3dpdGNoIChhdWRpZW5jZS50eXBlKSB7XG4gICAgICBjYXNlIFwiYWxsXCI6XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjdGl2ZUNvbm5lY3Rpb25zKGF1ZGllbmNlLm5hbWVzcGFjZSk7XG4gICAgICBjYXNlIFwicm9vbVwiOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRCb3VuZENvbm5lY3Rpb25zKHRoaXMucm9vbXMsIGF1ZGllbmNlLnJvb21JZCwgYXVkaWVuY2UubmFtZXNwYWNlKTtcbiAgICAgIGNhc2UgXCJ1c2VyXCI6XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJvdW5kQ29ubmVjdGlvbnModGhpcy51c2VycywgU3RyaW5nKGF1ZGllbmNlLnVzZXJJZCksIGF1ZGllbmNlLm5hbWVzcGFjZSk7XG4gICAgICBjYXNlIFwiY29ubmVjdGlvbnNcIjoge1xuICAgICAgICBjb25zdCBtZXRhczogV2ViU29ja2V0U2Vzc2lvblByZXNlbmNlW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb25JZCBvZiBhdWRpZW5jZS5jb25uZWN0aW9uSWRzKSB7XG4gICAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KGNvbm5lY3Rpb25JZCk7XG4gICAgICAgICAgaWYgKCFtZXRhPy5hY3RpdmUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYXVkaWVuY2UubmFtZXNwYWNlICYmIG1ldGEubmFtZXNwYWNlICE9PSBhdWRpZW5jZS5uYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtZXRhcy5wdXNoKG1ldGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1ldGFzO1xuICAgICAgfVxuICAgICAgY2FzZSBcInVuaW9uXCI6IHtcbiAgICAgICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBjb25zdCBtZXRhczogV2ViU29ja2V0U2Vzc2lvblByZXNlbmNlW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXVkaWVuY2UuYXVkaWVuY2VzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBtZXRhIG9mIHRoaXMucXVlcnlBdWRpZW5jZShpdGVtKSkge1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKG1ldGEuc2Vzc2lvbklkKSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2Vlbi5hZGQobWV0YS5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgbWV0YXMucHVzaChtZXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWV0YXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRBY3RpdmVDb25uZWN0aW9ucyhuYW1lc3BhY2U/OiBzdHJpbmcpOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2VbXSB7XG4gICAgY29uc3QgbWV0YXM6IFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IG1ldGEgb2YgdGhpcy5jb25uZWN0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgaWYgKCFtZXRhLmFjdGl2ZSB8fCAobmFtZXNwYWNlICYmIG1ldGEubmFtZXNwYWNlICE9PSBuYW1lc3BhY2UpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBtZXRhcy5wdXNoKG1ldGEpO1xuICAgIH1cblxuICAgIHJldHVybiBtZXRhcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Qm91bmRDb25uZWN0aW9ucyhcbiAgICBiaW5kaW5nczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZXNwYWNlPzogc3RyaW5nLFxuICApOiBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2VbXSB7XG4gICAgY29uc3QgbWV0YXM6IFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZVtdID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBtZW1iZXJzIG9mIHRoaXMuZ2V0U2NvcGVkQmluZGluZ3MoYmluZGluZ3MsIGlkLCBuYW1lc3BhY2UpKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb25JZCBvZiBtZW1iZXJzKSB7XG4gICAgICAgIGlmIChzZWVuLmhhcyhjb25uZWN0aW9uSWQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc2Vlbi5hZGQoY29ubmVjdGlvbklkKTtcblxuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5jb25uZWN0aW9ucy5nZXQoY29ubmVjdGlvbklkKTtcbiAgICAgICAgaWYgKG1ldGE/LmFjdGl2ZSkge1xuICAgICAgICAgIG1ldGFzLnB1c2gobWV0YSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWV0YXM7XG4gIH1cblxuICBwcml2YXRlIGdldFNjb3BlZEJpbmRpbmdzKFxuICAgIGJpbmRpbmdzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmcsXG4gICk6IFNldDxzdHJpbmc+W10ge1xuICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgIGNvbnN0IGV4YWN0ID0gYmluZGluZ3MuZ2V0KGdldEJpbmRpbmdLZXkobmFtZXNwYWNlLCBpZCkpO1xuICAgICAgcmV0dXJuIGV4YWN0ID8gW2V4YWN0XSA6IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoZXM6IFNldDxzdHJpbmc+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIG1lbWJlcnNdIG9mIGJpbmRpbmdzKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUJpbmRpbmdLZXkoa2V5KTtcbiAgICAgIGlmIChwYXJzZWQuaWQgPT09IGlkKSB7XG4gICAgICAgIG1hdGNoZXMucHVzaChtZW1iZXJzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hlcztcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUm9vbUJpbmRpbmcobmFtZXNwYWNlOiBzdHJpbmcsIHJvb21JZDogV2ViU29ja2V0Um9vbUlkLCBzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IGdldEJpbmRpbmdLZXkobmFtZXNwYWNlLCByb29tSWQpO1xuICAgIGNvbnN0IG1lbWJlcnMgPSB0aGlzLnJvb21zLmdldChrZXkpO1xuICAgIGlmICghbWVtYmVycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG1lbWJlcnMuZGVsZXRlKHNlc3Npb25JZCk7XG4gICAgaWYgKG1lbWJlcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5yb29tcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVVzZXJCaW5kaW5nKG5hbWVzcGFjZTogc3RyaW5nLCB1c2VySWQ6IFdlYlNvY2tldFVzZXJJZCwgc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBnZXRCaW5kaW5nS2V5KG5hbWVzcGFjZSwgU3RyaW5nKHVzZXJJZCkpO1xuICAgIGNvbnN0IG1lbWJlcnMgPSB0aGlzLnVzZXJzLmdldChrZXkpO1xuICAgIGlmICghbWVtYmVycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG1lbWJlcnMuZGVsZXRlKHNlc3Npb25JZCk7XG4gICAgaWYgKG1lbWJlcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy51c2Vycy5kZWxldGUoa2V5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QmluZGluZ0tleShuYW1lc3BhY2U6IHN0cmluZywgaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lc3BhY2V9Ojoke2lkfWA7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQmluZGluZ0tleShrZXk6IHN0cmluZyk6IHsgbmFtZXNwYWNlOiBzdHJpbmc7IGlkOiBzdHJpbmcgfSB7XG4gIGNvbnN0IFtuYW1lc3BhY2UsIC4uLnJlc3RdID0ga2V5LnNwbGl0KFwiOjpcIik7XG4gIHJldHVybiB7XG4gICAgbmFtZXNwYWNlLFxuICAgIGlkOiByZXN0LmpvaW4oXCI6OlwiKSxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUEyVEEsU0FBUyxjQUFjLFdBQW1CLElBQW9CO0NBQzVELE9BQU8sR0FBRyxVQUFVLElBQUk7QUFDMUI7QUFFQSxTQUFTLGdCQUFnQixLQUFnRDtDQUN2RSxNQUFNLENBQUMsV0FBVyxHQUFHLFFBQVEsSUFBSSxNQUFNLElBQUk7Q0FDM0MsT0FBTztFQUNMO0VBQ0EsSUFBSSxLQUFLLEtBQUssSUFBSTtDQUNwQjtBQUNGOzs7Q0FsU2EsaUNBQWIsTUFBOEU7RUFDNUUsOEJBQStCLElBQUksSUFBc0M7RUFDekUsd0JBQXlCLElBQUksSUFBeUI7RUFDdEQsd0JBQXlCLElBQUksSUFBeUI7RUFFdEQsU0FBUyxPQUtvQjtHQUMzQixNQUFNLE9BQWlDO0lBQ3JDLFdBQVcsTUFBTTtJQUNqQixRQUFRLE1BQU07SUFDZCxXQUFXLE1BQU07SUFDakIsUUFBUSxNQUFNLFVBQVU7SUFDeEIsdUJBQU8sSUFBSSxJQUFJO0lBQ2YsNkJBQWEsSUFBSSxLQUFLO0lBQ3RCLDRCQUFZLElBQUksS0FBSztHQUN2QjtHQUNBLEtBQUssWUFBWSxJQUFJLE1BQU0sV0FBVyxJQUFJO0dBQzFDLE9BQU87RUFDVDtFQUVBLFNBQVMsV0FBeUI7R0FDaEMsTUFBTSxPQUFPLEtBQUssWUFBWSxJQUFJLFNBQVM7R0FDM0MsSUFBSSxDQUFDLE1BQ0g7R0FHRixLQUFLLFNBQVM7RUFD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
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { WebSocketAudience, init_ws_audience } from "./ws-audience.js";
|
|
3
3
|
import { WebSocketAudienceResolver, init_ws_audience_resolver } from "./ws-audience-resolver.js";
|
|
4
4
|
import { NoopWebSocketClusterBus, init_ws_cluster_bus } from "./ws-cluster-bus.js";
|
|
@@ -6,16 +6,13 @@ import { NoopWebSocketTelemetryController, init_ws_telemetry } from "./ws-teleme
|
|
|
6
6
|
import { WebSocketDeliveryEngine, init_ws_delivery } from "./ws-delivery.js";
|
|
7
7
|
import { WebSocketLocalConnectionStore, init_ws_local_connection_store } from "./ws-local-connection-store.js";
|
|
8
8
|
import { InMemoryWebSocketPresenceStore, init_ws_presence_store } from "./ws-presence-store.js";
|
|
9
|
-
|
|
10
9
|
//#region src/stream/ws-registry.ts
|
|
11
10
|
function getConnectionTelemetryContext(connection) {
|
|
12
|
-
if (!connection || !isTelemetryContextProvider(connection)) {
|
|
13
|
-
return {};
|
|
14
|
-
}
|
|
11
|
+
if (!connection || !isTelemetryContextProvider(connection)) return {};
|
|
15
12
|
return connection.getTelemetryContext();
|
|
16
13
|
}
|
|
17
14
|
function formatUserId(userId) {
|
|
18
|
-
return userId ===
|
|
15
|
+
return userId === void 0 ? void 0 : String(userId);
|
|
19
16
|
}
|
|
20
17
|
function isTelemetryContextProvider(connection) {
|
|
21
18
|
return "getTelemetryContext" in connection && typeof connection.getTelemetryContext === "function";
|
|
@@ -124,19 +121,17 @@ var init_ws_registry = __esmMin((() => {
|
|
|
124
121
|
userId,
|
|
125
122
|
...telemetryContext
|
|
126
123
|
});
|
|
127
|
-
if (meta) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
});
|
|
139
|
-
}
|
|
124
|
+
if (meta) this.telemetryController.recordMetric({
|
|
125
|
+
name: "sonamu.ws.connections",
|
|
126
|
+
kind: "counter",
|
|
127
|
+
value: 1,
|
|
128
|
+
unit: "1",
|
|
129
|
+
tags: {
|
|
130
|
+
outcome: "unregistered",
|
|
131
|
+
namespace: meta.namespace
|
|
132
|
+
},
|
|
133
|
+
userId
|
|
134
|
+
});
|
|
140
135
|
}
|
|
141
136
|
touch(connectionId) {
|
|
142
137
|
this.presenceStore.touch(connectionId);
|
|
@@ -175,7 +170,7 @@ var init_ws_registry = __esmMin((() => {
|
|
|
175
170
|
connectionId,
|
|
176
171
|
namespace: meta.namespace,
|
|
177
172
|
userId: formatUserId(userId),
|
|
178
|
-
detail: userId !==
|
|
173
|
+
detail: userId !== void 0 ? { userId } : void 0,
|
|
179
174
|
...getConnectionTelemetryContext(this.localConnections.getConnection(connectionId))
|
|
180
175
|
});
|
|
181
176
|
}
|
|
@@ -265,8 +260,8 @@ var init_ws_registry = __esmMin((() => {
|
|
|
265
260
|
}
|
|
266
261
|
};
|
|
267
262
|
}));
|
|
268
|
-
|
|
269
263
|
//#endregion
|
|
270
264
|
init_ws_registry();
|
|
271
265
|
export { WebSocketRegistry, init_ws_registry };
|
|
272
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtcmVnaXN0cnkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy1yZWdpc3RyeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXZWJTb2NrZXRBdWRpZW5jZSwgdHlwZSBXZWJTb2NrZXRBdWRpZW5jZSBhcyBXZWJTb2NrZXRBdWRpZW5jZVNwZWMgfSBmcm9tIFwiLi93cy1hdWRpZW5jZVwiO1xuaW1wb3J0IHsgV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlciB9IGZyb20gXCIuL3dzLWF1ZGllbmNlLXJlc29sdmVyXCI7XG5pbXBvcnQgeyBOb29wV2ViU29ja2V0Q2x1c3RlckJ1cywgdHlwZSBXZWJTb2NrZXRDbHVzdGVyQnVzIH0gZnJvbSBcIi4vd3MtY2x1c3Rlci1idXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24sXG4gIHR5cGUgV2ViU29ja2V0UmVnaXN0cnlTdGF0cyxcbiAgdHlwZSBXZWJTb2NrZXRSb29tSWQsXG4gIHR5cGUgV2ViU29ja2V0VXNlcklkLFxufSBmcm9tIFwiLi93cy1jb3JlXCI7XG5pbXBvcnQgeyBXZWJTb2NrZXREZWxpdmVyeUVuZ2luZSB9IGZyb20gXCIuL3dzLWRlbGl2ZXJ5XCI7XG5pbXBvcnQgeyBXZWJTb2NrZXRMb2NhbENvbm5lY3Rpb25TdG9yZSB9IGZyb20gXCIuL3dzLWxvY2FsLWNvbm5lY3Rpb24tc3RvcmVcIjtcbmltcG9ydCB7XG4gIEluTWVtb3J5V2ViU29ja2V0UHJlc2VuY2VTdG9yZSxcbiAgdHlwZSBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlLFxuICB0eXBlIFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZSxcbn0gZnJvbSBcIi4vd3MtcHJlc2VuY2Utc3RvcmVcIjtcbmltcG9ydCB7XG4gIHR5cGUgVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyLFxuICBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCxcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyLFxufSBmcm9tIFwiLi93cy10ZWxlbWV0cnlcIjtcblxuZXhwb3J0IHR5cGUge1xuICBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbixcbiAgV2ViU29ja2V0UmVnaXN0cnlTdGF0cyxcbiAgV2ViU29ja2V0Um9vbUlkLFxuICBXZWJTb2NrZXRVc2VySWQsXG59O1xuZXhwb3J0IHR5cGUgV2ViU29ja2V0Q29ubmVjdGlvbk1ldGEgPSBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2U7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFJlZ2lzdHJ5T3B0aW9ucyA9IHtcbiAgLy8g67aE7IKwIO2ZmOqyveyXkOyEnCDrhbjrk5wg6rCEIOudvOyasO2MhSDsi53rs4TsnpDroZwg7JOw7J2066+A66GcIOuwmOuTnOyLnCDtmLjstpwg7LihKFdlYlNvY2tldFJ1bnRpbWUp7JeQ7IScIOqysOygle2VtCDrhJjquLTri6RcbiAgbm9kZUlkOiBzdHJpbmc7XG4gIHByZXNlbmNlU3RvcmU/OiBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlO1xuICBjbHVzdGVyQnVzPzogV2ViU29ja2V0Q2x1c3RlckJ1cztcbiAgdGVsZW1ldHJ5Q29udHJvbGxlcj86IFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXI7XG59O1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0UmVnaXN0cnkge1xuICByZWFkb25seSBub2RlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbG9jYWxDb25uZWN0aW9ucyA9IG5ldyBXZWJTb2NrZXRMb2NhbENvbm5lY3Rpb25TdG9yZSgpO1xuICByZWFkb25seSBwcmVzZW5jZVN0b3JlOiBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlO1xuICByZWFkb25seSBjbHVzdGVyQnVzOiBXZWJTb2NrZXRDbHVzdGVyQnVzO1xuICByZWFkb25seSBhdWRpZW5jZVJlc29sdmVyOiBXZWJTb2NrZXRBdWRpZW5jZVJlc29sdmVyO1xuICByZWFkb25seSBkZWxpdmVyeUVuZ2luZTogV2ViU29ja2V0RGVsaXZlcnlFbmdpbmU7XG4gIHJlYWRvbmx5IHRlbGVtZXRyeUNvbnRyb2xsZXI6IFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXI7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogV2ViU29ja2V0UmVnaXN0cnlPcHRpb25zKSB7XG4gICAgdGhpcy5ub2RlSWQgPSBvcHRpb25zLm5vZGVJZDtcbiAgICB0aGlzLnByZXNlbmNlU3RvcmUgPSBvcHRpb25zLnByZXNlbmNlU3RvcmUgPz8gbmV3IEluTWVtb3J5V2ViU29ja2V0UHJlc2VuY2VTdG9yZSgpO1xuICAgIHRoaXMuY2x1c3RlckJ1cyA9IG9wdGlvbnMuY2x1c3RlckJ1cyA/PyBuZXcgTm9vcFdlYlNvY2tldENsdXN0ZXJCdXMoKTtcbiAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIgPVxuICAgICAgb3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyID8/IG5ldyBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcigpO1xuICAgIHRoaXMuYXVkaWVuY2VSZXNvbHZlciA9IG5ldyBXZWJTb2NrZXRBdWRpZW5jZVJlc29sdmVyKHtcbiAgICAgIG5vZGVJZDogdGhpcy5ub2RlSWQsXG4gICAgICBwcmVzZW5jZVN0b3JlOiB0aGlzLnByZXNlbmNlU3RvcmUsXG4gICAgfSk7XG4gICAgdGhpcy5kZWxpdmVyeUVuZ2luZSA9IG5ldyBXZWJTb2NrZXREZWxpdmVyeUVuZ2luZSh7XG4gICAgICBub2RlSWQ6IHRoaXMubm9kZUlkLFxuICAgICAgbG9jYWxDb25uZWN0aW9uczogdGhpcy5sb2NhbENvbm5lY3Rpb25zLFxuICAgICAgYXVkaWVuY2VSZXNvbHZlcjogdGhpcy5hdWRpZW5jZVJlc29sdmVyLFxuICAgICAgY2x1c3RlckJ1czogdGhpcy5jbHVzdGVyQnVzLFxuICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcjogdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLFxuICAgIH0pO1xuXG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLnJlZ2lzdGVyTWV0cmljU291cmNlKHtcbiAgICAgIGNvbGxlY3Q6IChfbm93KSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gdGhpcy5wcmVzZW5jZVN0b3JlLmdldFN0YXRzKCk7XG4gICAgICAgIGNvbnN0IGxvY2FsU25hcHNob3QgPSB0aGlzLmxvY2FsQ29ubmVjdGlvbnMuZ2V0VGVsZW1ldHJ5U25hcHNob3QoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhY3RpdmVDb25uZWN0aW9uczogc3RhdHMudG90YWxDb25uZWN0aW9ucyxcbiAgICAgICAgICBhY3RpdmVDb25uZWN0aW9uc0J5TmFtZXNwYWNlOiBzdGF0cy5ieU5hbWVzcGFjZSxcbiAgICAgICAgICByb29tQ291bnQ6IHN0YXRzLnRvdGFsUm9vbXMsXG4gICAgICAgICAgcGVuZGluZ0luYm91bmRNZXNzYWdlczogbG9jYWxTbmFwc2hvdC5wZW5kaW5nSW5ib3VuZE1lc3NhZ2VzLFxuICAgICAgICAgIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiBsb2NhbFNuYXBzaG90LnBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzLFxuICAgICAgICAgIHNvY2tldEJ1ZmZlcmVkQnl0ZXM6IGxvY2FsU25hcHNob3Quc29ja2V0QnVmZmVyZWRCeXRlcyxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICByZWdpc3RlcihcbiAgICBjb25uZWN0aW9uOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbixcbiAgICBhY3RpdmU6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBXZWJTb2NrZXRDb25uZWN0aW9uTWV0YSB7XG4gICAgdGhpcy5sb2NhbENvbm5lY3Rpb25zLnJlZ2lzdGVyKGNvbm5lY3Rpb24pO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnByZXNlbmNlU3RvcmUucmVnaXN0ZXIoe1xuICAgICAgc2Vzc2lvbklkOiBjb25uZWN0aW9uLmlkLFxuICAgICAgbm9kZUlkOiB0aGlzLm5vZGVJZCxcbiAgICAgIG5hbWVzcGFjZTogY29ubmVjdGlvbi5uYW1lc3BhY2UsXG4gICAgICBhY3RpdmUsXG4gICAgfSk7XG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLnJlZ2lzdGVyZWRcIixcbiAgICAgIGxldmVsOiBcImluZm9cIixcbiAgICAgIGNvbm5lY3Rpb25JZDogY29ubmVjdGlvbi5pZCxcbiAgICAgIG5hbWVzcGFjZTogY29ubmVjdGlvbi5uYW1lc3BhY2UsXG4gICAgICB1c2VySWQ6IGNvbm5lY3Rpb24udXNlcklkLFxuICAgICAgLi4uZ2V0Q29ubmVjdGlvblRlbGVtZXRyeUNvbnRleHQoY29ubmVjdGlvbiksXG4gICAgfSk7XG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLnJlY29yZE1ldHJpYyh7XG4gICAgICBuYW1lOiBcInNvbmFtdS53cy5jb25uZWN0aW9uc1wiLFxuICAgICAga2luZDogXCJjb3VudGVyXCIsXG4gICAgICB2YWx1ZTogMSxcbiAgICAgIHVuaXQ6IFwiMVwiLFxuICAgICAgdGFnczogeyBvdXRjb21lOiBcInJlZ2lzdGVyZWRcIiwgbmFtZXNwYWNlOiBjb25uZWN0aW9uLm5hbWVzcGFjZSB9LFxuICAgICAgdXNlcklkOiBjb25uZWN0aW9uLnVzZXJJZCxcbiAgICB9KTtcbiAgICByZXR1cm4gbWV0YTtcbiAgfVxuXG4gIGFjdGl2YXRlKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpKSB7XG4gICAgICB0aGlzLmVtaXRNdXRhdGlvblNraXBwZWQoY29ubmVjdGlvbklkLCB7IG9wZXJhdGlvbjogXCJhY3RpdmF0ZVwiIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJlc2VuY2VTdG9yZS5hY3RpdmF0ZShjb25uZWN0aW9uSWQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MuY29ubmVjdGlvbi5hY3RpdmF0ZWRcIixcbiAgICAgIGxldmVsOiBcImluZm9cIixcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIHVzZXJJZDogY29ubmVjdGlvbj8udXNlcklkLFxuICAgICAgLi4uZ2V0Q29ubmVjdGlvblRlbGVtZXRyeUNvbnRleHQoY29ubmVjdGlvbiksXG4gICAgfSk7XG4gIH1cblxuICB1bnJlZ2lzdGVyKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMubG9jYWxDb25uZWN0aW9ucy5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk7XG4gICAgY29uc3QgdGVsZW1ldHJ5Q29udGV4dCA9IGdldENvbm5lY3Rpb25UZWxlbWV0cnlDb250ZXh0KGNvbm5lY3Rpb24pO1xuICAgIGNvbnN0IHVzZXJJZCA9XG4gICAgICBjb25uZWN0aW9uPy51c2VySWQgPz8gZm9ybWF0VXNlcklkKHRoaXMucHJlc2VuY2VTdG9yZS5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk/LnVzZXJJZCk7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMucHJlc2VuY2VTdG9yZS51bnJlZ2lzdGVyKGNvbm5lY3Rpb25JZCk7XG4gICAgdGhpcy5sb2NhbENvbm5lY3Rpb25zLnVucmVnaXN0ZXIoY29ubmVjdGlvbklkKTtcbiAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICBuYW1lOiBcIndzLmNvbm5lY3Rpb24udW5yZWdpc3RlcmVkXCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgbmFtZXNwYWNlOiBtZXRhPy5uYW1lc3BhY2UsXG4gICAgICB1c2VySWQsXG4gICAgICAuLi50ZWxlbWV0cnlDb250ZXh0LFxuICAgIH0pO1xuICAgIGlmIChtZXRhKSB7XG4gICAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkTWV0cmljKHtcbiAgICAgICAgbmFtZTogXCJzb25hbXUud3MuY29ubmVjdGlvbnNcIixcbiAgICAgICAga2luZDogXCJjb3VudGVyXCIsXG4gICAgICAgIHZhbHVlOiAxLFxuICAgICAgICB1bml0OiBcIjFcIixcbiAgICAgICAgdGFnczogeyBvdXRjb21lOiBcInVucmVnaXN0ZXJlZFwiLCBuYW1lc3BhY2U6IG1ldGEubmFtZXNwYWNlIH0sXG4gICAgICAgIHVzZXJJZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRvdWNoKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZW5jZVN0b3JlLnRvdWNoKGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICBzZXRVc2VySWQoY29ubmVjdGlvbklkOiBzdHJpbmcsIHVzZXJJZDogV2ViU29ja2V0VXNlcklkKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpKSB7XG4gICAgICB0aGlzLmVtaXRNdXRhdGlvblNraXBwZWQoY29ubmVjdGlvbklkLCB7IG9wZXJhdGlvbjogXCJzZXRVc2VySWRcIiwgdXNlcklkIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJlc2VuY2VTdG9yZS5zZXRVc2VySWQoY29ubmVjdGlvbklkLCB1c2VySWQpO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MudXNlci5ib3VuZFwiLFxuICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIG5hbWVzcGFjZTogbWV0YT8ubmFtZXNwYWNlLFxuICAgICAgdXNlcklkOiBTdHJpbmcodXNlcklkKSxcbiAgICAgIGRldGFpbDogeyB1c2VySWQgfSxcbiAgICAgIC4uLmdldENvbm5lY3Rpb25UZWxlbWV0cnlDb250ZXh0KHRoaXMubG9jYWxDb25uZWN0aW9ucy5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCkpLFxuICAgIH0pO1xuICB9XG5cbiAgY2xlYXJVc2VySWQoY29ubmVjdGlvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5wcmVzZW5jZVN0b3JlLmdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkKTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHRoaXMuZW1pdE11dGF0aW9uU2tpcHBlZChjb25uZWN0aW9uSWQsIHsgb3BlcmF0aW9uOiBcImNsZWFyVXNlcklkXCIgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcklkID0gbWV0YS51c2VySWQ7XG4gICAgdGhpcy5wcmVzZW5jZVN0b3JlLmNsZWFyVXNlcklkKGNvbm5lY3Rpb25JZCk7XG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy51c2VyLmNsZWFyZWRcIixcbiAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICBjb25uZWN0aW9uSWQsXG4gICAgICBuYW1lc3BhY2U6IG1ldGEubmFtZXNwYWNlLFxuICAgICAgdXNlcklkOiBmb3JtYXRVc2VySWQodXNlcklkKSxcbiAgICAgIGRldGFpbDogdXNlcklkICE9PSB1bmRlZmluZWQgPyB7IHVzZXJJZCB9IDogdW5kZWZpbmVkLFxuICAgICAgLi4uZ2V0Q29ubmVjdGlvblRlbGVtZXRyeUNvbnRleHQodGhpcy5sb2NhbENvbm5lY3Rpb25zLmdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkKSksXG4gICAgfSk7XG4gIH1cblxuICBqb2luKGNvbm5lY3Rpb25JZDogc3RyaW5nLCByb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wcmVzZW5jZVN0b3JlLmdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkKSkge1xuICAgICAgdGhpcy5lbWl0TXV0YXRpb25Ta2lwcGVkKGNvbm5lY3Rpb25JZCwgeyBvcGVyYXRpb246IFwiam9pblwiLCByb29tSWQgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wcmVzZW5jZVN0b3JlLmpvaW4oY29ubmVjdGlvbklkLCByb29tSWQpO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3Mucm9vbS5qb2luZWRcIixcbiAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICBjb25uZWN0aW9uSWQsXG4gICAgICBuYW1lc3BhY2U6IG1ldGE/Lm5hbWVzcGFjZSxcbiAgICAgIHVzZXJJZDogY29ubmVjdGlvbj8udXNlcklkID8/IGZvcm1hdFVzZXJJZChtZXRhPy51c2VySWQpLFxuICAgICAgZGV0YWlsOiB7IHJvb21JZCB9LFxuICAgICAgLi4uZ2V0Q29ubmVjdGlvblRlbGVtZXRyeUNvbnRleHQoY29ubmVjdGlvbiksXG4gICAgfSk7XG4gIH1cblxuICBsZWF2ZShjb25uZWN0aW9uSWQ6IHN0cmluZywgcm9vbUlkOiBXZWJTb2NrZXRSb29tSWQpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5wcmVzZW5jZVN0b3JlLmdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkKTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHRoaXMuZW1pdE11dGF0aW9uU2tpcHBlZChjb25uZWN0aW9uSWQsIHsgb3BlcmF0aW9uOiBcImxlYXZlXCIsIHJvb21JZCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByZXNlbmNlU3RvcmUubGVhdmUoY29ubmVjdGlvbklkLCByb29tSWQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3Mucm9vbS5sZWZ0XCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgbmFtZXNwYWNlOiBtZXRhLm5hbWVzcGFjZSxcbiAgICAgIHVzZXJJZDogY29ubmVjdGlvbj8udXNlcklkID8/IGZvcm1hdFVzZXJJZChtZXRhLnVzZXJJZCksXG4gICAgICBkZXRhaWw6IHsgcm9vbUlkIH0sXG4gICAgICAuLi5nZXRDb25uZWN0aW9uVGVsZW1ldHJ5Q29udGV4dChjb25uZWN0aW9uKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdE11dGF0aW9uU2tpcHBlZChcbiAgICBjb25uZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBkZXRhaWw6IHtcbiAgICAgIG9wZXJhdGlvbjogXCJhY3RpdmF0ZVwiIHwgXCJzZXRVc2VySWRcIiB8IFwiY2xlYXJVc2VySWRcIiB8IFwiam9pblwiIHwgXCJsZWF2ZVwiO1xuICAgICAgcm9vbUlkPzogV2ViU29ja2V0Um9vbUlkO1xuICAgICAgdXNlcklkPzogV2ViU29ja2V0VXNlcklkO1xuICAgIH0sXG4gICk6IHZvaWQge1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MucmVnaXN0cnkubXV0YXRpb24uc2tpcHBlZFwiLFxuICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIGRldGFpbDogeyAuLi5kZXRhaWwsIHJlYXNvbjogXCJjb25uZWN0aW9uTWlzc2luZ1wiIH0sXG4gICAgfSk7XG4gIH1cblxuICBicm9hZGNhc3QoZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93biwgbmFtZXNwYWNlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS5hbGwobmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvUm9vbShyb29tSWQ6IFdlYlNvY2tldFJvb21JZCwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93biwgbmFtZXNwYWNlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS5yb29tKHJvb21JZCwgbmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvVXNlcih1c2VySWQ6IFdlYlNvY2tldFVzZXJJZCwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93biwgbmFtZXNwYWNlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS51c2VyKHVzZXJJZCwgbmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvQXVkaWVuY2UoYXVkaWVuY2U6IFdlYlNvY2tldEF1ZGllbmNlU3BlYywgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuZGVsaXZlcnlFbmdpbmUucHVibGlzaFRvQXVkaWVuY2UoYXVkaWVuY2UsIGV2ZW50LCBkYXRhKTtcbiAgfVxuXG4gIGdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkOiBzdHJpbmcpOiBXZWJTb2NrZXRDb25uZWN0aW9uTWV0YSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucHJlc2VuY2VTdG9yZS5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICBnZXRDb25uZWN0aW9uQ291bnQobmFtZXNwYWNlPzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wcmVzZW5jZVN0b3JlLmdldENvbm5lY3Rpb25Db3VudChuYW1lc3BhY2UpO1xuICB9XG5cbiAgZ2V0Um9vbU1lbWJlcnMocm9vbUlkOiBXZWJTb2NrZXRSb29tSWQsIG5hbWVzcGFjZT86IHN0cmluZyk6IFdlYlNvY2tldENvbm5lY3Rpb25NZXRhW10ge1xuICAgIHJldHVybiB0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Um9vbU1lbWJlcnMocm9vbUlkLCBuYW1lc3BhY2UpO1xuICB9XG5cbiAgZ2V0U3RhdHMoKTogV2ViU29ja2V0UmVnaXN0cnlTdGF0cyB7XG4gICAgcmV0dXJuIHRoaXMucHJlc2VuY2VTdG9yZS5nZXRTdGF0cygpO1xuICB9XG5cbiAgY2xvc2VBbGwoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbENvbm5lY3Rpb25zLmNsb3NlQWxsKGNvZGUsIHJlYXNvbik7XG4gIH1cblxuICBhc3luYyBzaHV0ZG93bihjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsb3NlQWxsKGNvZGUsIHJlYXNvbik7XG4gICAgYXdhaXQgdGhpcy5kZWxpdmVyeUVuZ2luZS5zaHV0ZG93bigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldENvbm5lY3Rpb25UZWxlbWV0cnlDb250ZXh0KFxuICBjb25uZWN0aW9uOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbiB8IHVuZGVmaW5lZCxcbik6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0IHtcbiAgaWYgKCFjb25uZWN0aW9uIHx8ICFpc1RlbGVtZXRyeUNvbnRleHRQcm92aWRlcihjb25uZWN0aW9uKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHJldHVybiBjb25uZWN0aW9uLmdldFRlbGVtZXRyeUNvbnRleHQoKTtcbn1cblxuLy8gdGVsZW1ldHJ5IHJlY29yZOydmCB1c2VySWTripQgc3RyaW5nIOygleq3nO2ZlCDigJQgcHJlc2VuY2Ugc3RvcmXripQgbnVtYmVyIHwgc3RyaW5nIOq3uOuMgOuhnCDrs7TqtIDtlahcbmZ1bmN0aW9uIGZvcm1hdFVzZXJJZCh1c2VySWQ6IFdlYlNvY2tldFVzZXJJZCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB1c2VySWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFN0cmluZyh1c2VySWQpO1xufVxuXG5mdW5jdGlvbiBpc1RlbGVtZXRyeUNvbnRleHRQcm92aWRlcihcbiAgY29ubmVjdGlvbjogTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24sXG4pOiBjb25uZWN0aW9uIGlzIE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uICYgVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyIHtcbiAgcmV0dXJuIChcbiAgICBcImdldFRlbGVtZXRyeUNvbnRleHRcIiBpbiBjb25uZWN0aW9uICYmIHR5cGVvZiBjb25uZWN0aW9uLmdldFRlbGVtZXRyeUNvbnRleHQgPT09IFwiZnVuY3Rpb25cIlxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBeVNBLFNBQVMsOEJBQ1AsWUFDcUM7QUFDckMsS0FBSSxDQUFDLGNBQWMsQ0FBQywyQkFBMkIsV0FBVyxFQUFFO0FBQzFELFNBQU8sRUFBRTs7QUFHWCxRQUFPLFdBQVcscUJBQXFCOztBQUl6QyxTQUFTLGFBQWEsUUFBeUQ7QUFDN0UsUUFBTyxXQUFXLFlBQVksWUFBWSxPQUFPLE9BQU87O0FBRzFELFNBQVMsMkJBQ1AsWUFDcUU7QUFDckUsUUFDRSx5QkFBeUIsY0FBYyxPQUFPLFdBQVcsd0JBQXdCOzs7O21CQTVUYzs0QkFDaEM7c0JBQ2tCO21CQU83QjtpQ0FDb0I7eUJBSy9DO29CQU1MO0NBa0JYLG9CQUFiLE1BQStCO0VBQzdCLEFBQVM7RUFDVCxBQUFTLG1CQUFtQixJQUFJLCtCQUErQjtFQUMvRCxBQUFTO0VBQ1QsQUFBUztFQUNULEFBQVM7RUFDVCxBQUFTO0VBQ1QsQUFBUztFQUVULFlBQVksU0FBbUM7QUFDN0MsUUFBSyxTQUFTLFFBQVE7QUFDdEIsUUFBSyxnQkFBZ0IsUUFBUSxpQkFBaUIsSUFBSSxnQ0FBZ0M7QUFDbEYsUUFBSyxhQUFhLFFBQVEsY0FBYyxJQUFJLHlCQUF5QjtBQUNyRSxRQUFLLHNCQUNILFFBQVEsdUJBQXVCLElBQUksa0NBQWtDO0FBQ3ZFLFFBQUssbUJBQW1CLElBQUksMEJBQTBCO0lBQ3BELFFBQVEsS0FBSztJQUNiLGVBQWUsS0FBSztJQUNyQixDQUFDO0FBQ0YsUUFBSyxpQkFBaUIsSUFBSSx3QkFBd0I7SUFDaEQsUUFBUSxLQUFLO0lBQ2Isa0JBQWtCLEtBQUs7SUFDdkIsa0JBQWtCLEtBQUs7SUFDdkIsWUFBWSxLQUFLO0lBQ2pCLHFCQUFxQixLQUFLO0lBQzNCLENBQUM7QUFFRixRQUFLLG9CQUFvQixxQkFBcUIsRUFDNUMsVUFBVSxTQUFTO0lBQ2pCLE1BQU0sUUFBUSxLQUFLLGNBQWMsVUFBVTtJQUMzQyxNQUFNLGdCQUFnQixLQUFLLGlCQUFpQixzQkFBc0I7QUFDbEUsV0FBTztLQUNMLG1CQUFtQixNQUFNO0tBQ3pCLDhCQUE4QixNQUFNO0tBQ3BDLFdBQVcsTUFBTTtLQUNqQix3QkFBd0IsY0FBYztLQUN0Qyx5QkFBeUIsY0FBYztLQUN2QyxxQkFBcUIsY0FBYztLQUNwQztNQUVKLENBQUM7O0VBR0osU0FDRSxZQUNBLFNBQWtCLE1BQ087QUFDekIsUUFBSyxpQkFBaUIsU0FBUyxXQUFXO0dBQzFDLE1BQU0sT0FBTyxLQUFLLGNBQWMsU0FBUztJQUN2QyxXQUFXLFdBQVc7SUFDdEIsUUFBUSxLQUFLO0lBQ2IsV0FBVyxXQUFXO0lBQ3RCO0lBQ0QsQ0FBQztBQUNGLFFBQUssb0JBQW9CLEtBQUs7SUFDNUIsTUFBTTtJQUNOLE9BQU87SUFDUCxjQUFjLFdBQVc7SUFDekIsV0FBVyxXQUFXO0lBQ3RCLFFBQVEsV0FBVztJQUNuQixHQUFHLDhCQUE4QixXQUFXO0lBQzdDLENBQUM7QUFDRixRQUFLLG9CQUFvQixhQUFhO0lBQ3BDLE1BQU07SUFDTixNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixNQUFNO0tBQUUsU0FBUztLQUFjLFdBQVcsV0FBVztLQUFXO0lBQ2hFLFFBQVEsV0FBVztJQUNwQixDQUFDO0FBQ0YsVUFBTzs7RUFHVCxTQUFTLGNBQTRCO0FBQ25DLE9BQUksQ0FBQyxLQUFLLGNBQWMsY0FBYyxhQUFhLEVBQUU7QUFDbkQsU0FBSyxvQkFBb0IsY0FBYyxFQUFFLFdBQVcsWUFBWSxDQUFDO0FBQ2pFOztBQUdGLFFBQUssY0FBYyxTQUFTLGFBQWE7R0FDekMsTUFBTSxhQUFhLEtBQUssaUJBQWlCLGNBQWMsYUFBYTtBQUNwRSxRQUFLLG9CQUFvQixLQUFLO0lBQzVCLE1BQU07SUFDTixPQUFPO0lBQ1A7SUFDQSxRQUFRLFlBQVk7SUFDcEIsR0FBRyw4QkFBOEIsV0FBVztJQUM3QyxDQUFDOztFQUdKLFdBQVcsY0FBNEI7R0FDckMsTUFBTSxhQUFhLEtBQUssaUJBQWlCLGNBQWMsYUFBYTtHQUNwRSxNQUFNLG1CQUFtQiw4QkFBOEIsV0FBVztHQUNsRSxNQUFNLFNBQ0osWUFBWSxVQUFVLGFBQWEsS0FBSyxjQUFjLGNBQWMsYUFBYSxFQUFFLE9BQU87R0FDNUYsTUFBTSxPQUFPLEtBQUssY0FBYyxXQUFXLGFBQWE7QUFDeEQsUUFBSyxpQkFBaUIsV0FBVyxhQUFhO0FBQzlDLFFBQUssb0JBQW9CLEtBQUs7SUFDNUIsTUFBTTtJQUNOLE9BQU87SUFDUDtJQUNBLFdBQVcsTUFBTTtJQUNqQjtJQUNBLEdBQUc7SUFDSixDQUFDO0FBQ0YsT0FBSSxNQUFNO0FBQ1IsU0FBSyxvQkFBb0IsYUFBYTtLQUNwQyxNQUFNO0tBQ04sTUFBTTtLQUNOLE9BQU87S0FDUCxNQUFNO0tBQ04sTUFBTTtNQUFFLFNBQVM7TUFBZ0IsV0FBVyxLQUFLO01BQVc7S0FDNUQ7S0FDRCxDQUFDOzs7RUFJTixNQUFNLGNBQTRCO0FBQ2hDLFFBQUssY0FBYyxNQUFNLGFBQWE7O0VBR3hDLFVBQVUsY0FBc0IsUUFBK0I7QUFDN0QsT0FBSSxDQUFDLEtBQUssY0FBYyxjQUFjLGFBQWEsRUFBRTtBQUNuRCxTQUFLLG9CQUFvQixjQUFjO0tBQUUsV0FBVztLQUFhO0tBQVEsQ0FBQztBQUMxRTs7QUFHRixRQUFLLGNBQWMsVUFBVSxjQUFjLE9BQU87R0FDbEQsTUFBTSxPQUFPLEtBQUssY0FBYyxjQUFjLGFBQWE7QUFDM0QsUUFBSyxvQkFBb0IsS0FBSztJQUM1QixNQUFNO0lBQ04sT0FBTztJQUNQO0lBQ0EsV0FBVyxNQUFNO0lBQ2pCLFFBQVEsT0FBTyxPQUFPO0lBQ3RCLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLEdBQUcsOEJBQThCLEtBQUssaUJBQWlCLGNBQWMsYUFBYSxDQUFDO0lBQ3BGLENBQUM7O0VBR0osWUFBWSxjQUE0QjtHQUN0QyxNQUFNLE9BQU8sS0FBSyxjQUFjLGNBQWMsYUFBYTtBQUMzRCxPQUFJLENBQUMsTUFBTTtBQUNULFNBQUssb0JBQW9CLGNBQWMsRUFBRSxXQUFXLGVBQWUsQ0FBQztBQUNwRTs7R0FHRixNQUFNLFNBQVMsS0FBSztBQUNwQixRQUFLLGNBQWMsWUFBWSxhQUFhO0FBQzVDLFFBQUssb0JBQW9CLEtBQUs7SUFDNUIsTUFBTTtJQUNOLE9BQU87SUFDUDtJQUNBLFdBQVcsS0FBSztJQUNoQixRQUFRLGFBQWEsT0FBTztJQUM1QixRQUFRLFdBQVcsWUFBWSxFQUFFLFFBQVEsR0FBRztJQUM1QyxHQUFHLDhCQUE4QixLQUFLLGlCQUFpQixjQUFjLGFBQWEsQ0FBQztJQUNwRixDQUFDOztFQUdKLEtBQUssY0FBc0IsUUFBK0I7QUFDeEQsT0FBSSxDQUFDLEtBQUssY0FBYyxjQUFjLGFBQWEsRUFBRTtBQUNuRCxTQUFLLG9CQUFvQixjQUFjO0tBQUUsV0FBVztLQUFRO0tBQVEsQ0FBQztBQUNyRTs7QUFHRixRQUFLLGNBQWMsS0FBSyxjQUFjLE9BQU87R0FDN0MsTUFBTSxPQUFPLEtBQUssY0FBYyxjQUFjLGFBQWE7R0FDM0QsTUFBTSxhQUFhLEtBQUssaUJBQWlCLGNBQWMsYUFBYTtBQUNwRSxRQUFLLG9CQUFvQixLQUFLO0lBQzVCLE1BQU07SUFDTixPQUFPO0lBQ1A7SUFDQSxXQUFXLE1BQU07SUFDakIsUUFBUSxZQUFZLFVBQVUsYUFBYSxNQUFNLE9BQU87SUFDeEQsUUFBUSxFQUFFLFFBQVE7SUFDbEIsR0FBRyw4QkFBOEIsV0FBVztJQUM3QyxDQUFDOztFQUdKLE1BQU0sY0FBc0IsUUFBK0I7R0FDekQsTUFBTSxPQUFPLEtBQUssY0FBYyxjQUFjLGFBQWE7QUFDM0QsT0FBSSxDQUFDLE1BQU07QUFDVCxTQUFLLG9CQUFvQixjQUFjO0tBQUUsV0FBVztLQUFTO0tBQVEsQ0FBQztBQUN0RTs7QUFHRixRQUFLLGNBQWMsTUFBTSxjQUFjLE9BQU87R0FDOUMsTUFBTSxhQUFhLEtBQUssaUJBQWlCLGNBQWMsYUFBYTtBQUNwRSxRQUFLLG9CQUFvQixLQUFLO0lBQzVCLE1BQU07SUFDTixPQUFPO0lBQ1A7SUFDQSxXQUFXLEtBQUs7SUFDaEIsUUFBUSxZQUFZLFVBQVUsYUFBYSxLQUFLLE9BQU87SUFDdkQsUUFBUSxFQUFFLFFBQVE7SUFDbEIsR0FBRyw4QkFBOEIsV0FBVztJQUM3QyxDQUFDOztFQUdKLEFBQVEsb0JBQ04sY0FDQSxRQUtNO0FBQ04sUUFBSyxvQkFBb0IsS0FBSztJQUM1QixNQUFNO0lBQ04sT0FBTztJQUNQO0lBQ0EsUUFBUTtLQUFFLEdBQUc7S0FBUSxRQUFRO0tBQXFCO0lBQ25ELENBQUM7O0VBR0osVUFBVSxPQUFlLE1BQWUsV0FBMEI7QUFDaEUsUUFBSyxrQkFBa0Isa0JBQWtCLElBQUksVUFBVSxFQUFFLE9BQU8sS0FBSzs7RUFHdkUsY0FBYyxRQUF5QixPQUFlLE1BQWUsV0FBMEI7QUFDN0YsUUFBSyxrQkFBa0Isa0JBQWtCLEtBQUssUUFBUSxVQUFVLEVBQUUsT0FBTyxLQUFLOztFQUdoRixjQUFjLFFBQXlCLE9BQWUsTUFBZSxXQUEwQjtBQUM3RixRQUFLLGtCQUFrQixrQkFBa0IsS0FBSyxRQUFRLFVBQVUsRUFBRSxPQUFPLEtBQUs7O0VBR2hGLGtCQUFrQixVQUFpQyxPQUFlLE1BQXFCO0FBQ3JGLFFBQUssZUFBZSxrQkFBa0IsVUFBVSxPQUFPLEtBQUs7O0VBRzlELGNBQWMsY0FBMkQ7QUFDdkUsVUFBTyxLQUFLLGNBQWMsY0FBYyxhQUFhOztFQUd2RCxtQkFBbUIsV0FBNEI7QUFDN0MsVUFBTyxLQUFLLGNBQWMsbUJBQW1CLFVBQVU7O0VBR3pELGVBQWUsUUFBeUIsV0FBK0M7QUFDckYsVUFBTyxLQUFLLGNBQWMsZUFBZSxRQUFRLFVBQVU7O0VBRzdELFdBQW1DO0FBQ2pDLFVBQU8sS0FBSyxjQUFjLFVBQVU7O0VBR3RDLFNBQVMsTUFBZSxRQUF1QjtBQUM3QyxRQUFLLGlCQUFpQixTQUFTLE1BQU0sT0FBTzs7RUFHOUMsTUFBTSxTQUFTLE1BQWUsUUFBZ0M7QUFDNUQsUUFBSyxTQUFTLE1BQU0sT0FBTztBQUMzQixTQUFNLEtBQUssZUFBZSxVQUFVIn0=
|
|
266
|
+
|
|
267
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtcmVnaXN0cnkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy1yZWdpc3RyeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXZWJTb2NrZXRBdWRpZW5jZSwgdHlwZSBXZWJTb2NrZXRBdWRpZW5jZSBhcyBXZWJTb2NrZXRBdWRpZW5jZVNwZWMgfSBmcm9tIFwiLi93cy1hdWRpZW5jZVwiO1xuaW1wb3J0IHsgV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlciB9IGZyb20gXCIuL3dzLWF1ZGllbmNlLXJlc29sdmVyXCI7XG5pbXBvcnQgeyBOb29wV2ViU29ja2V0Q2x1c3RlckJ1cywgdHlwZSBXZWJTb2NrZXRDbHVzdGVyQnVzIH0gZnJvbSBcIi4vd3MtY2x1c3Rlci1idXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24sXG4gIHR5cGUgV2ViU29ja2V0UmVnaXN0cnlTdGF0cyxcbiAgdHlwZSBXZWJTb2NrZXRSb29tSWQsXG4gIHR5cGUgV2ViU29ja2V0VXNlcklkLFxufSBmcm9tIFwiLi93cy1jb3JlXCI7XG5pbXBvcnQgeyBXZWJTb2NrZXREZWxpdmVyeUVuZ2luZSB9IGZyb20gXCIuL3dzLWRlbGl2ZXJ5XCI7XG5pbXBvcnQgeyBXZWJTb2NrZXRMb2NhbENvbm5lY3Rpb25TdG9yZSB9IGZyb20gXCIuL3dzLWxvY2FsLWNvbm5lY3Rpb24tc3RvcmVcIjtcbmltcG9ydCB7XG4gIEluTWVtb3J5V2ViU29ja2V0UHJlc2VuY2VTdG9yZSxcbiAgdHlwZSBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlLFxuICB0eXBlIFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZSxcbn0gZnJvbSBcIi4vd3MtcHJlc2VuY2Utc3RvcmVcIjtcbmltcG9ydCB7XG4gIHR5cGUgVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyLFxuICBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCxcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyLFxufSBmcm9tIFwiLi93cy10ZWxlbWV0cnlcIjtcblxuZXhwb3J0IHR5cGUge1xuICBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbixcbiAgV2ViU29ja2V0UmVnaXN0cnlTdGF0cyxcbiAgV2ViU29ja2V0Um9vbUlkLFxuICBXZWJTb2NrZXRVc2VySWQsXG59O1xuZXhwb3J0IHR5cGUgV2ViU29ja2V0Q29ubmVjdGlvbk1ldGEgPSBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2U7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFJlZ2lzdHJ5T3B0aW9ucyA9IHtcbiAgLy8g67aE7IKwIO2ZmOqyveyXkOyEnCDrhbjrk5wg6rCEIOudvOyasO2MhSDsi53rs4TsnpDroZwg7JOw7J2066+A66GcIOuwmOuTnOyLnCDtmLjstpwg7LihKFdlYlNvY2tldFJ1bnRpbWUp7JeQ7IScIOqysOygle2VtCDrhJjquLTri6RcbiAgbm9kZUlkOiBzdHJpbmc7XG4gIHByZXNlbmNlU3RvcmU/OiBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlO1xuICBjbHVzdGVyQnVzPzogV2ViU29ja2V0Q2x1c3RlckJ1cztcbiAgdGVsZW1ldHJ5Q29udHJvbGxlcj86IFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXI7XG59O1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0UmVnaXN0cnkge1xuICByZWFkb25seSBub2RlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbG9jYWxDb25uZWN0aW9ucyA9IG5ldyBXZWJTb2NrZXRMb2NhbENvbm5lY3Rpb25TdG9yZSgpO1xuICByZWFkb25seSBwcmVzZW5jZVN0b3JlOiBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlO1xuICByZWFkb25seSBjbHVzdGVyQnVzOiBXZWJTb2NrZXRDbHVzdGVyQnVzO1xuICByZWFkb25seSBhdWRpZW5jZVJlc29sdmVyOiBXZWJTb2NrZXRBdWRpZW5jZVJlc29sdmVyO1xuICByZWFkb25seSBkZWxpdmVyeUVuZ2luZTogV2ViU29ja2V0RGVsaXZlcnlFbmdpbmU7XG4gIHJlYWRvbmx5IHRlbGVtZXRyeUNvbnRyb2xsZXI6IFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXI7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogV2ViU29ja2V0UmVnaXN0cnlPcHRpb25zKSB7XG4gICAgdGhpcy5ub2RlSWQgPSBvcHRpb25zLm5vZGVJZDtcbiAgICB0aGlzLnByZXNlbmNlU3RvcmUgPSBvcHRpb25zLnByZXNlbmNlU3RvcmUgPz8gbmV3IEluTWVtb3J5V2ViU29ja2V0UHJlc2VuY2VTdG9yZSgpO1xuICAgIHRoaXMuY2x1c3RlckJ1cyA9IG9wdGlvbnMuY2x1c3RlckJ1cyA/PyBuZXcgTm9vcFdlYlNvY2tldENsdXN0ZXJCdXMoKTtcbiAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIgPVxuICAgICAgb3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyID8/IG5ldyBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcigpO1xuICAgIHRoaXMuYXVkaWVuY2VSZXNvbHZlciA9IG5ldyBXZWJTb2NrZXRBdWRpZW5jZVJlc29sdmVyKHtcbiAgICAgIG5vZGVJZDogdGhpcy5ub2RlSWQsXG4gICAgICBwcmVzZW5jZVN0b3JlOiB0aGlzLnByZXNlbmNlU3RvcmUsXG4gICAgfSk7XG4gICAgdGhpcy5kZWxpdmVyeUVuZ2luZSA9IG5ldyBXZWJTb2NrZXREZWxpdmVyeUVuZ2luZSh7XG4gICAgICBub2RlSWQ6IHRoaXMubm9kZUlkLFxuICAgICAgbG9jYWxDb25uZWN0aW9uczogdGhpcy5sb2NhbENvbm5lY3Rpb25zLFxuICAgICAgYXVkaWVuY2VSZXNvbHZlcjogdGhpcy5hdWRpZW5jZVJlc29sdmVyLFxuICAgICAgY2x1c3RlckJ1czogdGhpcy5jbHVzdGVyQnVzLFxuICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcjogdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLFxuICAgIH0pO1xuXG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLnJlZ2lzdGVyTWV0cmljU291cmNlKHtcbiAgICAgIGNvbGxlY3Q6IChfbm93KSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gdGhpcy5wcmVzZW5jZVN0b3JlLmdldFN0YXRzKCk7XG4gICAgICAgIGNvbnN0IGxvY2FsU25hcHNob3QgPSB0aGlzLmxvY2FsQ29ubmVjdGlvbnMuZ2V0VGVsZW1ldHJ5U25hcHNob3QoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhY3RpdmVDb25uZWN0aW9uczogc3RhdHMudG90YWxDb25uZWN0aW9ucyxcbiAgICAgICAgICBhY3RpdmVDb25uZWN0aW9uc0J5TmFtZXNwYWNlOiBzdGF0cy5ieU5hbWVzcGFjZSxcbiAgICAgICAgICByb29tQ291bnQ6IHN0YXRzLnRvdGFsUm9vbXMsXG4gICAgICAgICAgcGVuZGluZ0luYm91bmRNZXNzYWdlczogbG9jYWxTbmFwc2hvdC5wZW5kaW5nSW5ib3VuZE1lc3NhZ2VzLFxuICAgICAgICAgIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiBsb2NhbFNuYXBzaG90LnBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzLFxuICAgICAgICAgIHNvY2tldEJ1ZmZlcmVkQnl0ZXM6IGxvY2FsU25hcHNob3Quc29ja2V0QnVmZmVyZWRCeXRlcyxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICByZWdpc3RlcihcbiAgICBjb25uZWN0aW9uOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbixcbiAgICBhY3RpdmU6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBXZWJTb2NrZXRDb25uZWN0aW9uTWV0YSB7XG4gICAgdGhpcy5sb2NhbENvbm5lY3Rpb25zLnJlZ2lzdGVyKGNvbm5lY3Rpb24pO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnByZXNlbmNlU3RvcmUucmVnaXN0ZXIoe1xuICAgICAgc2Vzc2lvbklkOiBjb25uZWN0aW9uLmlkLFxuICAgICAgbm9kZUlkOiB0aGlzLm5vZGVJZCxcbiAgICAgIG5hbWVzcGFjZTogY29ubmVjdGlvbi5uYW1lc3BhY2UsXG4gICAgICBhY3RpdmUsXG4gICAgfSk7XG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLnJlZ2lzdGVyZWRcIixcbiAgICAgIGxldmVsOiBcImluZm9cIixcbiAgICAgIGNvbm5lY3Rpb25JZDogY29ubmVjdGlvbi5pZCxcbiAgICAgIG5hbWVzcGFjZTogY29ubmVjdGlvbi5uYW1lc3BhY2UsXG4gICAgICB1c2VySWQ6IGNvbm5lY3Rpb24udXNlcklkLFxuICAgICAgLi4uZ2V0Q29ubmVjdGlvblRlbGVtZXRyeUNvbnRleHQoY29ubmVjdGlvbiksXG4gICAgfSk7XG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLnJlY29yZE1ldHJpYyh7XG4gICAgICBuYW1lOiBcInNvbmFtdS53cy5jb25uZWN0aW9uc1wiLFxuICAgICAga2luZDogXCJjb3VudGVyXCIsXG4gICAgICB2YWx1ZTogMSxcbiAgICAgIHVuaXQ6IFwiMVwiLFxuICAgICAgdGFnczogeyBvdXRjb21lOiBcInJlZ2lzdGVyZWRcIiwgbmFtZXNwYWNlOiBjb25uZWN0aW9uLm5hbWVzcGFjZSB9LFxuICAgICAgdXNlcklkOiBjb25uZWN0aW9uLnVzZXJJZCxcbiAgICB9KTtcbiAgICByZXR1cm4gbWV0YTtcbiAgfVxuXG4gIGFjdGl2YXRlKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpKSB7XG4gICAgICB0aGlzLmVtaXRNdXRhdGlvblNraXBwZWQoY29ubmVjdGlvbklkLCB7IG9wZXJhdGlvbjogXCJhY3RpdmF0ZVwiIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJlc2VuY2VTdG9yZS5hY3RpdmF0ZShjb25uZWN0aW9uSWQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MuY29ubmVjdGlvbi5hY3RpdmF0ZWRcIixcbiAgICAgIGxldmVsOiBcImluZm9cIixcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIHVzZXJJZDogY29ubmVjdGlvbj8udXNlcklkLFxuICAgICAgLi4uZ2V0Q29ubmVjdGlvblRlbGVtZXRyeUNvbnRleHQoY29ubmVjdGlvbiksXG4gICAgfSk7XG4gIH1cblxuICB1bnJlZ2lzdGVyKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMubG9jYWxDb25uZWN0aW9ucy5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk7XG4gICAgY29uc3QgdGVsZW1ldHJ5Q29udGV4dCA9IGdldENvbm5lY3Rpb25UZWxlbWV0cnlDb250ZXh0KGNvbm5lY3Rpb24pO1xuICAgIGNvbnN0IHVzZXJJZCA9XG4gICAgICBjb25uZWN0aW9uPy51c2VySWQgPz8gZm9ybWF0VXNlcklkKHRoaXMucHJlc2VuY2VTdG9yZS5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk/LnVzZXJJZCk7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMucHJlc2VuY2VTdG9yZS51bnJlZ2lzdGVyKGNvbm5lY3Rpb25JZCk7XG4gICAgdGhpcy5sb2NhbENvbm5lY3Rpb25zLnVucmVnaXN0ZXIoY29ubmVjdGlvbklkKTtcbiAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICBuYW1lOiBcIndzLmNvbm5lY3Rpb24udW5yZWdpc3RlcmVkXCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgbmFtZXNwYWNlOiBtZXRhPy5uYW1lc3BhY2UsXG4gICAgICB1c2VySWQsXG4gICAgICAuLi50ZWxlbWV0cnlDb250ZXh0LFxuICAgIH0pO1xuICAgIGlmIChtZXRhKSB7XG4gICAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkTWV0cmljKHtcbiAgICAgICAgbmFtZTogXCJzb25hbXUud3MuY29ubmVjdGlvbnNcIixcbiAgICAgICAga2luZDogXCJjb3VudGVyXCIsXG4gICAgICAgIHZhbHVlOiAxLFxuICAgICAgICB1bml0OiBcIjFcIixcbiAgICAgICAgdGFnczogeyBvdXRjb21lOiBcInVucmVnaXN0ZXJlZFwiLCBuYW1lc3BhY2U6IG1ldGEubmFtZXNwYWNlIH0sXG4gICAgICAgIHVzZXJJZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRvdWNoKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZW5jZVN0b3JlLnRvdWNoKGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICBzZXRVc2VySWQoY29ubmVjdGlvbklkOiBzdHJpbmcsIHVzZXJJZDogV2ViU29ja2V0VXNlcklkKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpKSB7XG4gICAgICB0aGlzLmVtaXRNdXRhdGlvblNraXBwZWQoY29ubmVjdGlvbklkLCB7IG9wZXJhdGlvbjogXCJzZXRVc2VySWRcIiwgdXNlcklkIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJlc2VuY2VTdG9yZS5zZXRVc2VySWQoY29ubmVjdGlvbklkLCB1c2VySWQpO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MudXNlci5ib3VuZFwiLFxuICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIG5hbWVzcGFjZTogbWV0YT8ubmFtZXNwYWNlLFxuICAgICAgdXNlcklkOiBTdHJpbmcodXNlcklkKSxcbiAgICAgIGRldGFpbDogeyB1c2VySWQgfSxcbiAgICAgIC4uLmdldENvbm5lY3Rpb25UZWxlbWV0cnlDb250ZXh0KHRoaXMubG9jYWxDb25uZWN0aW9ucy5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCkpLFxuICAgIH0pO1xuICB9XG5cbiAgY2xlYXJVc2VySWQoY29ubmVjdGlvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5wcmVzZW5jZVN0b3JlLmdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkKTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHRoaXMuZW1pdE11dGF0aW9uU2tpcHBlZChjb25uZWN0aW9uSWQsIHsgb3BlcmF0aW9uOiBcImNsZWFyVXNlcklkXCIgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcklkID0gbWV0YS51c2VySWQ7XG4gICAgdGhpcy5wcmVzZW5jZVN0b3JlLmNsZWFyVXNlcklkKGNvbm5lY3Rpb25JZCk7XG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy51c2VyLmNsZWFyZWRcIixcbiAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICBjb25uZWN0aW9uSWQsXG4gICAgICBuYW1lc3BhY2U6IG1ldGEubmFtZXNwYWNlLFxuICAgICAgdXNlcklkOiBmb3JtYXRVc2VySWQodXNlcklkKSxcbiAgICAgIGRldGFpbDogdXNlcklkICE9PSB1bmRlZmluZWQgPyB7IHVzZXJJZCB9IDogdW5kZWZpbmVkLFxuICAgICAgLi4uZ2V0Q29ubmVjdGlvblRlbGVtZXRyeUNvbnRleHQodGhpcy5sb2NhbENvbm5lY3Rpb25zLmdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkKSksXG4gICAgfSk7XG4gIH1cblxuICBqb2luKGNvbm5lY3Rpb25JZDogc3RyaW5nLCByb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wcmVzZW5jZVN0b3JlLmdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkKSkge1xuICAgICAgdGhpcy5lbWl0TXV0YXRpb25Ta2lwcGVkKGNvbm5lY3Rpb25JZCwgeyBvcGVyYXRpb246IFwiam9pblwiLCByb29tSWQgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wcmVzZW5jZVN0b3JlLmpvaW4oY29ubmVjdGlvbklkLCByb29tSWQpO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3Mucm9vbS5qb2luZWRcIixcbiAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICBjb25uZWN0aW9uSWQsXG4gICAgICBuYW1lc3BhY2U6IG1ldGE/Lm5hbWVzcGFjZSxcbiAgICAgIHVzZXJJZDogY29ubmVjdGlvbj8udXNlcklkID8/IGZvcm1hdFVzZXJJZChtZXRhPy51c2VySWQpLFxuICAgICAgZGV0YWlsOiB7IHJvb21JZCB9LFxuICAgICAgLi4uZ2V0Q29ubmVjdGlvblRlbGVtZXRyeUNvbnRleHQoY29ubmVjdGlvbiksXG4gICAgfSk7XG4gIH1cblxuICBsZWF2ZShjb25uZWN0aW9uSWQ6IHN0cmluZywgcm9vbUlkOiBXZWJTb2NrZXRSb29tSWQpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5wcmVzZW5jZVN0b3JlLmdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkKTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHRoaXMuZW1pdE11dGF0aW9uU2tpcHBlZChjb25uZWN0aW9uSWQsIHsgb3BlcmF0aW9uOiBcImxlYXZlXCIsIHJvb21JZCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByZXNlbmNlU3RvcmUubGVhdmUoY29ubmVjdGlvbklkLCByb29tSWQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3Mucm9vbS5sZWZ0XCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgbmFtZXNwYWNlOiBtZXRhLm5hbWVzcGFjZSxcbiAgICAgIHVzZXJJZDogY29ubmVjdGlvbj8udXNlcklkID8/IGZvcm1hdFVzZXJJZChtZXRhLnVzZXJJZCksXG4gICAgICBkZXRhaWw6IHsgcm9vbUlkIH0sXG4gICAgICAuLi5nZXRDb25uZWN0aW9uVGVsZW1ldHJ5Q29udGV4dChjb25uZWN0aW9uKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdE11dGF0aW9uU2tpcHBlZChcbiAgICBjb25uZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBkZXRhaWw6IHtcbiAgICAgIG9wZXJhdGlvbjogXCJhY3RpdmF0ZVwiIHwgXCJzZXRVc2VySWRcIiB8IFwiY2xlYXJVc2VySWRcIiB8IFwiam9pblwiIHwgXCJsZWF2ZVwiO1xuICAgICAgcm9vbUlkPzogV2ViU29ja2V0Um9vbUlkO1xuICAgICAgdXNlcklkPzogV2ViU29ja2V0VXNlcklkO1xuICAgIH0sXG4gICk6IHZvaWQge1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MucmVnaXN0cnkubXV0YXRpb24uc2tpcHBlZFwiLFxuICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIGRldGFpbDogeyAuLi5kZXRhaWwsIHJlYXNvbjogXCJjb25uZWN0aW9uTWlzc2luZ1wiIH0sXG4gICAgfSk7XG4gIH1cblxuICBicm9hZGNhc3QoZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93biwgbmFtZXNwYWNlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS5hbGwobmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvUm9vbShyb29tSWQ6IFdlYlNvY2tldFJvb21JZCwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93biwgbmFtZXNwYWNlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS5yb29tKHJvb21JZCwgbmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvVXNlcih1c2VySWQ6IFdlYlNvY2tldFVzZXJJZCwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93biwgbmFtZXNwYWNlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS51c2VyKHVzZXJJZCwgbmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvQXVkaWVuY2UoYXVkaWVuY2U6IFdlYlNvY2tldEF1ZGllbmNlU3BlYywgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuZGVsaXZlcnlFbmdpbmUucHVibGlzaFRvQXVkaWVuY2UoYXVkaWVuY2UsIGV2ZW50LCBkYXRhKTtcbiAgfVxuXG4gIGdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkOiBzdHJpbmcpOiBXZWJTb2NrZXRDb25uZWN0aW9uTWV0YSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucHJlc2VuY2VTdG9yZS5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICBnZXRDb25uZWN0aW9uQ291bnQobmFtZXNwYWNlPzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wcmVzZW5jZVN0b3JlLmdldENvbm5lY3Rpb25Db3VudChuYW1lc3BhY2UpO1xuICB9XG5cbiAgZ2V0Um9vbU1lbWJlcnMocm9vbUlkOiBXZWJTb2NrZXRSb29tSWQsIG5hbWVzcGFjZT86IHN0cmluZyk6IFdlYlNvY2tldENvbm5lY3Rpb25NZXRhW10ge1xuICAgIHJldHVybiB0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Um9vbU1lbWJlcnMocm9vbUlkLCBuYW1lc3BhY2UpO1xuICB9XG5cbiAgZ2V0U3RhdHMoKTogV2ViU29ja2V0UmVnaXN0cnlTdGF0cyB7XG4gICAgcmV0dXJuIHRoaXMucHJlc2VuY2VTdG9yZS5nZXRTdGF0cygpO1xuICB9XG5cbiAgY2xvc2VBbGwoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbENvbm5lY3Rpb25zLmNsb3NlQWxsKGNvZGUsIHJlYXNvbik7XG4gIH1cblxuICBhc3luYyBzaHV0ZG93bihjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsb3NlQWxsKGNvZGUsIHJlYXNvbik7XG4gICAgYXdhaXQgdGhpcy5kZWxpdmVyeUVuZ2luZS5zaHV0ZG93bigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldENvbm5lY3Rpb25UZWxlbWV0cnlDb250ZXh0KFxuICBjb25uZWN0aW9uOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbiB8IHVuZGVmaW5lZCxcbik6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0IHtcbiAgaWYgKCFjb25uZWN0aW9uIHx8ICFpc1RlbGVtZXRyeUNvbnRleHRQcm92aWRlcihjb25uZWN0aW9uKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHJldHVybiBjb25uZWN0aW9uLmdldFRlbGVtZXRyeUNvbnRleHQoKTtcbn1cblxuLy8gdGVsZW1ldHJ5IHJlY29yZOydmCB1c2VySWTripQgc3RyaW5nIOygleq3nO2ZlCDigJQgcHJlc2VuY2Ugc3RvcmXripQgbnVtYmVyIHwgc3RyaW5nIOq3uOuMgOuhnCDrs7TqtIDtlahcbmZ1bmN0aW9uIGZvcm1hdFVzZXJJZCh1c2VySWQ6IFdlYlNvY2tldFVzZXJJZCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB1c2VySWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFN0cmluZyh1c2VySWQpO1xufVxuXG5mdW5jdGlvbiBpc1RlbGVtZXRyeUNvbnRleHRQcm92aWRlcihcbiAgY29ubmVjdGlvbjogTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24sXG4pOiBjb25uZWN0aW9uIGlzIE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uICYgVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyIHtcbiAgcmV0dXJuIChcbiAgICBcImdldFRlbGVtZXRyeUNvbnRleHRcIiBpbiBjb25uZWN0aW9uICYmIHR5cGVvZiBjb25uZWN0aW9uLmdldFRlbGVtZXRyeUNvbnRleHQgPT09IFwiZnVuY3Rpb25cIlxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUF5U0EsU0FBUyw4QkFDUCxZQUNxQztDQUNyQyxJQUFJLENBQUMsY0FBYyxDQUFDLDJCQUEyQixVQUFVLEdBQ3ZELE9BQU8sQ0FBQztDQUdWLE9BQU8sV0FBVyxvQkFBb0I7QUFDeEM7QUFHQSxTQUFTLGFBQWEsUUFBeUQ7Q0FDN0UsT0FBTyxXQUFXLFNBQVksU0FBWSxPQUFPLE1BQU07QUFDekQ7QUFFQSxTQUFTLDJCQUNQLFlBQ3FFO0NBQ3JFLE9BQ0UseUJBQXlCLGNBQWMsT0FBTyxXQUFXLHdCQUF3QjtBQUVyRjs7O2tCQTlUa0c7MkJBQ2hDO3FCQUNrQjtrQkFPN0I7Z0NBQ29CO3dCQUsvQzttQkFNTDtDQWtCVixvQkFBYixNQUErQjtFQUM3QjtFQUNB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
|