sonamu 0.10.13 → 0.11.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/ai/agents/agent.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
- package/dist/api/base-frame.d.ts.map +1 -1
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +3 -2
- package/dist/api/validator.d.ts.map +1 -1
- package/dist/auth/audit-log/events.d.ts.map +1 -1
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +3 -3
- package/dist/auth/knex-adapter.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/admin.d.ts +4 -4
- package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
- package/dist/bin/build-config.d.ts +10 -0
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +130 -6
- package/dist/bin/fixture.d.ts +7 -4
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +161 -13
- package/dist/bin/test-command.d.ts +7 -0
- package/dist/bin/test-command.d.ts.map +1 -1
- package/dist/bin/test-command.js +18 -4
- package/dist/bin/typecheck-web.d.ts +2 -0
- package/dist/bin/typecheck-web.d.ts.map +1 -0
- package/dist/bin/typecheck-web.js +36 -0
- package/dist/cache/decorator.d.ts.map +1 -1
- package/dist/cache/drivers.d.ts.map +1 -1
- package/dist/cache-control/cache-control.d.ts.map +1 -1
- package/dist/compress/compress.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +1 -1
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.types.d.ts +0 -1
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/puri-subset.types.d.ts +0 -1
- package/dist/database/puri-subset.types.d.ts.map +1 -1
- package/dist/database/puri-wrapper.d.ts +0 -1
- package/dist/database/puri-wrapper.d.ts.map +1 -1
- package/dist/database/puri.d.ts +0 -1
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.types.d.ts +0 -1
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/transaction-context.d.ts.map +1 -1
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/dict/en.d.ts +58 -58
- package/dist/dict/en.d.ts.map +1 -1
- package/dist/dict/ko.d.ts +58 -58
- package/dist/dict/ko.d.ts.map +1 -1
- package/dist/dict/rc-keys.d.ts.map +1 -1
- package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
- package/dist/dict/sonamu-dictionary.js +2 -2
- package/dist/dict/utils.d.ts.map +1 -1
- package/dist/entity/entity-manager.d.ts +115 -113
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +25 -19
- package/dist/entity/entity-template-cone.d.ts +4 -4
- package/dist/entity/entity.d.ts +6 -1
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +8 -3
- package/dist/env.d.ts.map +1 -1
- package/dist/exceptions/so-exceptions.d.ts.map +1 -1
- package/dist/filter/types.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/logger/configure.d.ts +10 -1
- package/dist/logger/configure.d.ts.map +1 -1
- package/dist/logger/configure.js +30 -5
- package/dist/migration/migrator.d.ts +12 -1
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +77 -30
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/naite/messaging-types.d.ts +0 -1
- package/dist/naite/messaging-types.d.ts.map +1 -1
- package/dist/naite/naite-reporter.d.ts +0 -1
- package/dist/naite/naite-reporter.d.ts.map +1 -1
- package/dist/naite/naite.d.ts.map +1 -1
- package/dist/storage/base-file.d.ts.map +1 -1
- package/dist/storage/buffered-file.d.ts.map +1 -1
- package/dist/storage/drivers.d.ts.map +1 -1
- package/dist/storage/s3-driver.d.ts.map +1 -1
- package/dist/storage/storage-manager.d.ts.map +1 -1
- package/dist/storage/uploaded-file.d.ts.map +1 -1
- package/dist/stream/ws-audience-resolver.d.ts.map +1 -1
- package/dist/stream/ws-audience.d.ts.map +1 -1
- package/dist/stream/ws-cluster-bus.d.ts.map +1 -1
- package/dist/stream/ws-delivery.d.ts.map +1 -1
- package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
- package/dist/stream/ws-presence-store.d.ts.map +1 -1
- package/dist/stream/ws-registry.d.ts.map +1 -1
- package/dist/stream/ws-telemetry-memory.d.ts.map +1 -1
- package/dist/stream/ws-telemetry.d.ts.map +1 -1
- package/dist/stream/ws.d.ts.map +1 -1
- package/dist/syncer/api-parser.js +2 -2
- package/dist/syncer/file-patterns.d.ts +17 -17
- package/dist/syncer/filesystem-dependencies.js +1 -1
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/tasks/step-wrapper.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/template/implementations/entity.template.d.ts +2 -2
- package/dist/template/implementations/entity.template.d.ts.map +1 -1
- package/dist/template/implementations/entry-server.template.d.ts +2 -2
- package/dist/template/implementations/entry-server.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.d.ts +2 -2
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.d.ts +2 -2
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.d.ts +2 -2
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/http_validators.template.d.ts +2 -2
- package/dist/template/implementations/http_validators.template.d.ts.map +1 -1
- package/dist/template/implementations/init_types.template.d.ts +2 -2
- package/dist/template/implementations/init_types.template.d.ts.map +1 -1
- package/dist/template/implementations/model.template.d.ts +2 -2
- package/dist/template/implementations/model.template.d.ts.map +1 -1
- package/dist/template/implementations/model_test.template.d.ts +2 -2
- package/dist/template/implementations/model_test.template.d.ts.map +1 -1
- package/dist/template/implementations/queries.template.d.ts +2 -2
- package/dist/template/implementations/queries.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.d.ts +2 -2
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +1 -1
- package/dist/template/implementations/services.template.d.ts +2 -2
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.d.ts +3 -3
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_id_all_select.template.d.ts +2 -2
- package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.d.ts +2 -2
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_search_input.template.d.ts +2 -2
- package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
- package/dist/template/template-manager.d.ts.map +1 -1
- package/dist/template/template.d.ts.map +1 -1
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/testing/_relation-graph.d.ts.map +1 -1
- package/dist/testing/data-explorer.d.ts +2 -2
- package/dist/testing/data-explorer.d.ts.map +1 -1
- package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
- package/dist/testing/faker-mappings.d.ts.map +1 -1
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +1 -1
- package/dist/testing/fixture-loader.d.ts.map +1 -1
- package/dist/testing/fixture-manager.d.ts +4 -0
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +99 -25
- package/dist/testing/naite-vitest-reporter.d.ts.map +1 -1
- package/dist/testing/parallel-db-manager.d.ts.map +1 -1
- package/dist/tooling/__tests__/helpers/sonamu-test-root.d.ts +10 -0
- package/dist/tooling/__tests__/helpers/sonamu-test-root.d.ts.map +1 -0
- package/dist/tooling/__tests__/helpers/sonamu-test-root.js +42 -0
- package/dist/tooling/cdd-service.d.ts +87 -0
- package/dist/tooling/cdd-service.d.ts.map +1 -0
- package/dist/tooling/cdd-service.js +215 -0
- package/dist/tooling/cli-tooling.d.ts +11 -0
- package/dist/tooling/cli-tooling.d.ts.map +1 -0
- package/dist/tooling/cli-tooling.js +901 -0
- package/dist/tooling/fixture-service.d.ts +29 -0
- package/dist/tooling/fixture-service.d.ts.map +1 -0
- package/dist/tooling/fixture-service.js +53 -0
- package/dist/tooling/index.d.ts +2 -0
- package/dist/tooling/index.d.ts.map +1 -0
- package/dist/tooling/index.js +2 -0
- package/dist/tooling/test-run-client.d.ts +27 -0
- package/dist/tooling/test-run-client.d.ts.map +1 -0
- package/dist/tooling/test-run-client.js +120 -0
- package/dist/tsdown.api.config.js +48 -0
- package/dist/types/types.d.ts +527 -527
- package/dist/types/types.d.ts.map +1 -1
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/utils/formatter.d.ts +6 -0
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +42 -11
- package/dist/utils/model.d.ts +1 -1
- package/dist/vector/chunking.d.ts.map +1 -1
- package/dist/vector/embedding.d.ts.map +1 -1
- package/package.json +13 -12
- package/src/api/sonamu.ts +2 -1
- package/src/auth/index.ts +1 -1
- package/src/bin/__tests__/zod-compiler-build.test.ts +67 -0
- package/src/bin/build-config.ts +151 -5
- package/src/bin/fixture.ts +204 -21
- package/src/bin/test-command.ts +27 -4
- package/src/bin/typecheck-web.ts +56 -0
- package/src/dict/sonamu-dictionary.ts +1 -1
- package/src/entity/__tests__/entity-manager-autoload.contract.test.ts +55 -0
- package/src/entity/__tests__/entity-manager-explicit-root-registration.contract.test.ts +107 -0
- package/src/entity/entity-manager.ts +31 -19
- package/src/entity/entity.ts +7 -2
- package/src/logger/__tests__/configure.test.ts +33 -0
- package/src/logger/configure.ts +45 -3
- package/src/migration/__tests__/migrator.test.ts +51 -0
- package/src/migration/migrator.ts +103 -34
- package/src/syncer/api-parser.ts +1 -1
- package/src/testing/fixture-manager.ts +124 -32
- package/src/tooling/__tests__/cdd-rule-bootstrap.contract.test.ts +118 -0
- package/src/tooling/__tests__/cli-tooling-auth.contract.test.ts +72 -0
- package/src/tooling/__tests__/cli-tooling-cone-locale.contract.test.ts +150 -0
- package/src/tooling/__tests__/cli-tooling-entity-patch.contract.test.ts +131 -0
- package/src/tooling/__tests__/cli-tooling-fixture-transfer.contract.test.ts +255 -0
- package/src/tooling/__tests__/cli-tooling-i18n-update.contract.test.ts +104 -0
- package/src/tooling/__tests__/cli-tooling-scaffold.contract.test.ts +86 -0
- package/src/tooling/__tests__/cli-tooling-stub-practice.contract.test.ts +147 -0
- package/src/tooling/__tests__/default-cdd-adapter.contract.test.ts +73 -0
- package/src/tooling/__tests__/helpers/sonamu-test-root.ts +42 -0
- package/src/tooling/__tests__/test-run-client-config.contract.test.ts +154 -0
- package/src/tooling/cdd-service.ts +256 -0
- package/src/tooling/cli-tooling.ts +937 -0
- package/src/tooling/fixture-service.ts +72 -0
- package/src/tooling/index.ts +1 -0
- package/src/tooling/test-run-client.ts +196 -0
- package/src/utils/__tests__/formatter-bin.test.ts +99 -0
- package/src/utils/formatter.ts +74 -10
- package/tsdown.api.config.ts +8 -10
- package/bin/cli.js +0 -75
- package/dist/bin/cli.d.ts +0 -2
- package/dist/bin/cli.d.ts.map +0 -1
- package/dist/bin/cli.js +0 -956
- package/src/bin/cli.ts +0 -1166
|
@@ -6,21 +6,54 @@ import { Sonamu, init_sonamu } from "../api/sonamu.js";
|
|
|
6
6
|
import { EntityManager, init_entity_manager } from "../entity/entity-manager.js";
|
|
7
7
|
import { UpsertBuilder, init_upsert_builder } from "../database/upsert-builder.js";
|
|
8
8
|
import { BaseModel, init_base_model } from "../database/base-model.js";
|
|
9
|
-
import { RelationGraph, init__relation_graph } from "./_relation-graph.js";
|
|
10
9
|
import { dataExplorerRecordSchema, init_data_explorer } from "./data-explorer.js";
|
|
10
|
+
import { RelationGraph, init__relation_graph } from "./_relation-graph.js";
|
|
11
11
|
import inflection from "inflection";
|
|
12
12
|
import { z } from "zod";
|
|
13
13
|
import { unique } from "radashi";
|
|
14
|
-
import assert from "assert";
|
|
15
|
-
import { readFileSync, writeFileSync } from "fs";
|
|
16
14
|
import chalk from "chalk";
|
|
17
|
-
import {
|
|
18
|
-
import
|
|
15
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
16
|
+
import assert from "node:assert";
|
|
17
|
+
import { spawn } from "node:child_process";
|
|
18
|
+
import { inspect } from "node:util";
|
|
19
19
|
//#region src/testing/fixture-manager.ts
|
|
20
|
-
function
|
|
20
|
+
function waitForFixtureCommand(child, executable) {
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
child.once("error", reject);
|
|
23
|
+
child.once("exit", (code, signal) => {
|
|
24
|
+
if (code === 0) resolve();
|
|
25
|
+
else reject(/* @__PURE__ */ new Error(`${executable} 명령이 ${code ?? signal ?? "unknown"} 상태로 실패했습니다.`));
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function executeFixtureCommand(executable, args, options) {
|
|
30
|
+
return waitForFixtureCommand(spawn(executable, args, options), executable);
|
|
31
|
+
}
|
|
32
|
+
async function pipeFixtureCommands(source, destination) {
|
|
33
|
+
const sourceProcess = spawn(source.executable, source.args, {
|
|
34
|
+
env: source.env,
|
|
35
|
+
stdio: [
|
|
36
|
+
"ignore",
|
|
37
|
+
"pipe",
|
|
38
|
+
"inherit"
|
|
39
|
+
]
|
|
40
|
+
});
|
|
41
|
+
const destinationProcess = spawn(destination.executable, destination.args, {
|
|
42
|
+
env: destination.env,
|
|
43
|
+
stdio: [
|
|
44
|
+
"pipe",
|
|
45
|
+
"inherit",
|
|
46
|
+
"inherit"
|
|
47
|
+
]
|
|
48
|
+
});
|
|
49
|
+
assert(sourceProcess.stdout);
|
|
50
|
+
assert(destinationProcess.stdin);
|
|
51
|
+
sourceProcess.stdout.pipe(destinationProcess.stdin);
|
|
21
52
|
try {
|
|
22
|
-
|
|
53
|
+
await Promise.all([waitForFixtureCommand(sourceProcess, source.executable), waitForFixtureCommand(destinationProcess, destination.executable)]);
|
|
23
54
|
} catch (error) {
|
|
55
|
+
sourceProcess.kill();
|
|
56
|
+
destinationProcess.kill();
|
|
24
57
|
throw new Error("Fixture database synchronization command failed", { cause: error });
|
|
25
58
|
}
|
|
26
59
|
}
|
|
@@ -89,26 +122,37 @@ var init_fixture_manager = __esmMin((() => {
|
|
|
89
122
|
const fixtureConn = pgConnectionSchema.parse(Sonamu.dbConfig.fixture.connection);
|
|
90
123
|
const testConn = pgConnectionSchema.parse(Sonamu.dbConfig.test.connection);
|
|
91
124
|
const testPgEnv = { PGPASSWORD: testConn.password || "" };
|
|
92
|
-
|
|
125
|
+
const testPsqlArgs = [
|
|
126
|
+
"-h",
|
|
127
|
+
testConn.host ?? "localhost",
|
|
128
|
+
"-p",
|
|
129
|
+
String(testConn.port ?? 5432),
|
|
130
|
+
"-U",
|
|
131
|
+
testConn.user ?? "",
|
|
132
|
+
"-d",
|
|
133
|
+
"postgres",
|
|
134
|
+
"-c"
|
|
135
|
+
];
|
|
136
|
+
await executeFixtureCommand("psql", [...testPsqlArgs, `
|
|
93
137
|
SELECT pg_terminate_backend(pg_stat_activity.pid)
|
|
94
138
|
FROM pg_stat_activity
|
|
95
139
|
WHERE datname = '${testConn.database}'
|
|
96
140
|
AND pid <> pg_backend_pid();
|
|
97
|
-
|
|
141
|
+
`], {
|
|
98
142
|
stdio: "inherit",
|
|
99
143
|
env: {
|
|
100
144
|
...process.env,
|
|
101
145
|
...testPgEnv
|
|
102
146
|
}
|
|
103
147
|
});
|
|
104
|
-
|
|
148
|
+
await executeFixtureCommand("psql", [...testPsqlArgs, `DROP DATABASE IF EXISTS "${testConn.database}"`], {
|
|
105
149
|
stdio: "inherit",
|
|
106
150
|
env: {
|
|
107
151
|
...process.env,
|
|
108
152
|
...testPgEnv
|
|
109
153
|
}
|
|
110
154
|
});
|
|
111
|
-
|
|
155
|
+
await executeFixtureCommand("psql", [...testPsqlArgs, `CREATE DATABASE "${testConn.database}"`], {
|
|
112
156
|
stdio: "inherit",
|
|
113
157
|
env: {
|
|
114
158
|
...process.env,
|
|
@@ -116,15 +160,41 @@ var init_fixture_manager = __esmMin((() => {
|
|
|
116
160
|
}
|
|
117
161
|
});
|
|
118
162
|
const fixturePgEnv = { PGPASSWORD: fixtureConn.password || "" };
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
163
|
+
await pipeFixtureCommands({
|
|
164
|
+
executable: "pg_dump",
|
|
165
|
+
args: [
|
|
166
|
+
"-h",
|
|
167
|
+
fixtureConn.host ?? "localhost",
|
|
168
|
+
"-p",
|
|
169
|
+
String(fixtureConn.port ?? 5432),
|
|
170
|
+
"-U",
|
|
171
|
+
fixtureConn.user ?? "",
|
|
172
|
+
"-d",
|
|
173
|
+
fixtureConn.database,
|
|
174
|
+
"-Fc"
|
|
175
|
+
],
|
|
123
176
|
env: {
|
|
124
177
|
...process.env,
|
|
125
178
|
...fixturePgEnv
|
|
126
|
-
}
|
|
127
|
-
|
|
179
|
+
}
|
|
180
|
+
}, {
|
|
181
|
+
executable: "pg_restore",
|
|
182
|
+
args: [
|
|
183
|
+
"-h",
|
|
184
|
+
testConn.host ?? "localhost",
|
|
185
|
+
"-p",
|
|
186
|
+
String(testConn.port ?? 5432),
|
|
187
|
+
"-U",
|
|
188
|
+
testConn.user ?? "",
|
|
189
|
+
"-d",
|
|
190
|
+
testConn.database,
|
|
191
|
+
"--no-owner",
|
|
192
|
+
"--no-acl"
|
|
193
|
+
],
|
|
194
|
+
env: {
|
|
195
|
+
...process.env,
|
|
196
|
+
...testPgEnv
|
|
197
|
+
}
|
|
128
198
|
});
|
|
129
199
|
await this.resetSequences(Sonamu.dbConfig.test);
|
|
130
200
|
}
|
|
@@ -224,7 +294,11 @@ var init_fixture_manager = __esmMin((() => {
|
|
|
224
294
|
const fixtures = [];
|
|
225
295
|
for (const row of rows) {
|
|
226
296
|
const initialRecordsLength = fixtures.length;
|
|
227
|
-
const newRecords = await this.createFixtureRecord(entity, row, {
|
|
297
|
+
const newRecords = await this.createFixtureRecord(entity, row, {
|
|
298
|
+
db: sourceDB,
|
|
299
|
+
includeRelations: duplicateCheck?.includeRelations,
|
|
300
|
+
maxDepth: duplicateCheck?.maxDepth
|
|
301
|
+
});
|
|
228
302
|
fixtures.push(...newRecords);
|
|
229
303
|
const currentFixtureRecord = fixtures.find((r) => r.fixtureId === `${entityId}#${row.id}`);
|
|
230
304
|
if (currentFixtureRecord) currentFixtureRecord.fetchedRecords = fixtures.filter((r) => r.fixtureId !== currentFixtureRecord.fixtureId).slice(initialRecordsLength).map((r) => r.fixtureId);
|
|
@@ -259,7 +333,7 @@ var init_fixture_manager = __esmMin((() => {
|
|
|
259
333
|
async createFixtureRecord(rootEntity, rootRow, options) {
|
|
260
334
|
const records = [];
|
|
261
335
|
const visitedEntities = /* @__PURE__ */ new Set();
|
|
262
|
-
const create = async (entity, row) => {
|
|
336
|
+
const create = async (entity, row, depth) => {
|
|
263
337
|
const fixtureId = `${entity.id}#${row.id}`;
|
|
264
338
|
if (visitedEntities.has(fixtureId)) return;
|
|
265
339
|
visitedEntities.add(fixtureId);
|
|
@@ -301,19 +375,19 @@ var init_fixture_manager = __esmMin((() => {
|
|
|
301
375
|
const relatedId = relationIdSchema.parse(row[`${prop.name}_id`]);
|
|
302
376
|
record.columns[prop.name].value = relatedId;
|
|
303
377
|
if (relatedId) record.belongsRecords.push(`${prop.with}#${relatedId}`);
|
|
304
|
-
if (!options?.singleRecord && relatedId) {
|
|
378
|
+
if (!options?.singleRecord && options?.includeRelations !== false && depth < (options?.maxDepth ?? Number.POSITIVE_INFINITY) && relatedId) {
|
|
305
379
|
const relatedEntity = EntityManager.get(prop.with);
|
|
306
380
|
const relatedRow = await db(relatedEntity.table).where("id", relatedId).first();
|
|
307
381
|
if (relatedRow) await create(relatedEntity, {
|
|
308
382
|
...dataExplorerRecordSchema.parse(relatedRow),
|
|
309
383
|
id: z.union([z.number(), z.string()]).parse(relatedRow.id)
|
|
310
|
-
});
|
|
384
|
+
}, depth + 1);
|
|
311
385
|
}
|
|
312
386
|
}
|
|
313
387
|
}
|
|
314
388
|
records.push(record);
|
|
315
389
|
};
|
|
316
|
-
await create(rootEntity, rootRow);
|
|
390
|
+
await create(rootEntity, rootRow, 0);
|
|
317
391
|
return records;
|
|
318
392
|
}
|
|
319
393
|
/**
|
|
@@ -634,10 +708,10 @@ var init_fixture_manager = __esmMin((() => {
|
|
|
634
708
|
}
|
|
635
709
|
async addFixtureLoader(code) {
|
|
636
710
|
const path = `${Sonamu.apiRootPath}/src/testing/fixture.ts`;
|
|
637
|
-
const content =
|
|
711
|
+
const content = await readFile(path, "utf8");
|
|
638
712
|
const fixtureLoaderStart = content.indexOf("const fixtureLoader = {");
|
|
639
713
|
const fixtureLoaderEnd = content.indexOf("};", fixtureLoaderStart);
|
|
640
|
-
if (fixtureLoaderStart !== -1 && fixtureLoaderEnd !== -1)
|
|
714
|
+
if (fixtureLoaderStart !== -1 && fixtureLoaderEnd !== -1) await writeFile(path, `${content.slice(0, fixtureLoaderEnd)} ${code}\n${content.slice(fixtureLoaderEnd)}`);
|
|
641
715
|
else throw new Error("Failed to find fixtureLoader in fixture.ts");
|
|
642
716
|
}
|
|
643
717
|
};
|
|
@@ -647,4 +721,4 @@ var init_fixture_manager = __esmMin((() => {
|
|
|
647
721
|
init_fixture_manager();
|
|
648
722
|
export { FixtureManager, FixtureManagerClass, init_fixture_manager };
|
|
649
723
|
|
|
650
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1tYW5hZ2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IGV4ZWNTeW5jLCB0eXBlIEV4ZWNTeW5jT3B0aW9ucyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGluc3BlY3QgfSBmcm9tIFwidXRpbFwiO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgQmFzZU1vZGVsIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IGNyZWF0ZUtuZXhJbnN0YW5jZSB9IGZyb20gXCIuLi9kYXRhYmFzZS9rbmV4XCI7XG5pbXBvcnQgeyBVcHNlcnRCdWlsZGVyIH0gZnJvbSBcIi4uL2RhdGFiYXNlL3Vwc2VydC1idWlsZGVyXCI7XG5pbXBvcnQgeyB0eXBlIFVCUmVmIH0gZnJvbSBcIi4uL2RhdGFiYXNlL3Vwc2VydC1idWlsZGVyXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzSGFzTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIEJlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgdHlwZSBEYXRhYmFzZVNjaGVtYUV4dGVuZCxcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEZpeHR1cmVJbXBvcnRSZXN1bHQsXG4gIHR5cGUgRml4dHVyZVJlY29yZCxcbiAgdHlwZSBGaXh0dXJlU2VhcmNoT3B0aW9ucyxcbiAgdHlwZSBPbmVUb09uZVJlbGF0aW9uUHJvcCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBpc1Rlc3QgfSBmcm9tIFwiLi4vdXRpbHMvY29udHJvbGxlclwiO1xuaW1wb3J0IHsgUmVsYXRpb25HcmFwaCB9IGZyb20gXCIuL19yZWxhdGlvbi1ncmFwaFwiO1xuaW1wb3J0IHsgZGF0YUV4cGxvcmVyUmVjb3JkU2NoZW1hIH0gZnJvbSBcIi4vZGF0YS1leHBsb3JlclwiO1xuaW1wb3J0IHsgdHlwZSBEYXRhRXhwbG9yZXJSZWNvcmQsIHR5cGUgRGF0YUV4cGxvcmVyVmFsdWUgfSBmcm9tIFwiLi9kYXRhLWV4cGxvcmVyXCI7XG5cbmNvbnN0IHBnQ29ubmVjdGlvblNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgaG9zdDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIHBvcnQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB1c2VyOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgcGFzc3dvcmQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBkYXRhYmFzZTogei5zdHJpbmcoKSxcbiAgfSlcbiAgLnBhc3N0aHJvdWdoKCk7XG5jb25zdCBkYXRhYmFzZUNvbm5lY3Rpb25TY2hlbWEgPSB6Lm9iamVjdCh7IGRhdGFiYXNlOiB6LnN0cmluZygpIH0pLnBhc3N0aHJvdWdoKCk7XG5jb25zdCBmaXh0dXJlUmVjb3JkSWRzU2NoZW1hID0gei5hcnJheSh6LnVuaW9uKFt6Lm51bWJlcigpLCB6LnN0cmluZygpXSkpO1xuY29uc3QgcmVsYXRpb25JZFNjaGVtYSA9IHoudW5pb24oW3oubnVtYmVyKCksIHouc3RyaW5nKCksIHoubnVsbCgpXSk7XG5cbmV4cG9ydCB0eXBlIEZpeHR1cmVTb3VyY2VSZWNvcmQgPSBEYXRhRXhwbG9yZXJSZWNvcmQgJiB7XG4gIGlkOiBudW1iZXIgfCBzdHJpbmc7XG59O1xuXG50eXBlIFVwc2VydFJvd1ZhbHVlID0gRGF0YUV4cGxvcmVyVmFsdWUgfCBVQlJlZjtcbnR5cGUgVXBzZXJ0Um93ID0ge1xuICBbY29sdW1uTmFtZTogc3RyaW5nXTogVXBzZXJ0Um93VmFsdWU7XG59O1xuXG5mdW5jdGlvbiBleGVjdXRlRml4dHVyZVN5bmNDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgb3B0aW9uczogRXhlY1N5bmNPcHRpb25zKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgZXhlY1N5bmMoY29tbWFuZCwgb3B0aW9ucyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRml4dHVyZSBkYXRhYmFzZSBzeW5jaHJvbml6YXRpb24gY29tbWFuZCBmYWlsZWRcIiwgeyBjYXVzZTogZXJyb3IgfSk7XG4gIH1cbn1cblxuLyoqIOyCrOyaqeyekCDsp4DsoJUg7KSR67O1IO2ZleyduCDsu6zrn7wgKGVudGl0eUlk67OE66GcIOyngOyglSkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgRHVwbGljYXRlQ2hlY2tPcHRpb25zIHtcbiAgY29sdW1ucz86IHtcbiAgICBbZW50aXR5SWQ6IHN0cmluZ106IHN0cmluZ1tdO1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgRml4dHVyZU1hbmFnZXJDbGFzcyB7XG4gIHByaXZhdGUgdGVzdGluZ0RiOiBLbmV4IHwgbnVsbCA9IG51bGw7XG4gIHNldCB0ZGIodGRiOiBLbmV4KSB7XG4gICAgdGhpcy50ZXN0aW5nRGIgPSB0ZGI7XG4gIH1cbiAgZ2V0IHRkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy50ZXN0aW5nRGIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpeHR1cmVNYW5hZ2VyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGVzdGluZ0RiO1xuICB9XG5cbiAgcHJpdmF0ZSBmaXh0dXJlRGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IGZkYihmZGI6IEtuZXgpIHtcbiAgICB0aGlzLmZpeHR1cmVEYiA9IGZkYjtcbiAgfVxuICBnZXQgZmRiKCk6IEtuZXgge1xuICAgIGlmICh0aGlzLmZpeHR1cmVEYiA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRml4dHVyZU1hbmFnZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maXh0dXJlRGI7XG4gIH1cbiAgY2FjaGVkVGFibGVOYW1lczogc3RyaW5nW10gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlbGF0aW9uR3JhcGggPSBuZXcgUmVsYXRpb25HcmFwaCgpO1xuXG4gIC8vIFVwc2VydEJ1aWxkZXIg6riw67CYIGltcG9ydOulvCDsnITtlZwg7IOB7YOcXG4gIHByaXZhdGUgYnVpbGRlcjogVXBzZXJ0QnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gIHByaXZhdGUgZml4dHVyZVJlZk1hcDogTWFwPHN0cmluZywgVUJSZWY+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHNraXBwZWRGaXh0dXJlczogTWFwPHN0cmluZywgeyBlbnRpdHlJZDogc3RyaW5nOyBleGlzdGluZ0lkOiBudW1iZXIgfCBzdHJpbmcgfT4gPVxuICAgIG5ldyBNYXAoKTtcblxuICBpbml0KCkge1xuICAgIGlmICh0aGlzLnRlc3RpbmdEYiAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoU29uYW11LmRiQ29uZmlnLnRlc3QgJiYgU29uYW11LmRiQ29uZmlnLnByb2R1Y3Rpb24pIHtcbiAgICAgIGNvbnN0IHRDb25uID0gcGdDb25uZWN0aW9uU2NoZW1hLnBhcnNlKFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24pO1xuICAgICAgY29uc3QgcENvbm4gPSBwZ0Nvbm5lY3Rpb25TY2hlbWEucGFyc2UoU29uYW11LmRiQ29uZmlnLnByb2R1Y3Rpb24uY29ubmVjdGlvbik7XG4gICAgICBpZiAoXG4gICAgICAgIGAke3RDb25uLmhvc3QgPz8gXCJsb2NhbGhvc3RcIn06JHt0Q29ubi5wb3J0ID8/IDU0MzJ9LyR7dENvbm4uZGF0YWJhc2V9YCA9PT1cbiAgICAgICAgYCR7cENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3BDb25uLnBvcnQgPz8gNTQzMn0vJHtwQ29ubi5kYXRhYmFzZX1gXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDthYzsiqTtirhEQuyZgCDtlITroZzrjZXshZhEQuyXkCDrj5nsnbztlZwg642w7J207YSw67Kg7J207Iqk6rCAIOyCrOyaqeuQmOyXiOyKteuLiOuLpC5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnRkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcudGVzdCk7XG4gICAgdGhpcy5mZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuICB9XG5cbiAgLyoqXG4gICAg7JuQ6rKpIGZpeHR1cmUgRELrpbwg66Gc7LusIHRlc3QgRELroZwg67O17IKs7ZWp64uI64ukLlxuICAgIHBnX2R1bXDroZwg7JuQ6rKpIERC66W8IOuNpO2UhO2VmOqzoCwgcGdfcmVzdG9yZeuhnCDroZzsu6zsl5Ag67O17JuQ7ZWp64uI64ukLlxuICAqL1xuICBhc3luYyBzeW5jKCkge1xuICAgIGNvbnN0IGZpeHR1cmVDb25uID0gcGdDb25uZWN0aW9uU2NoZW1hLnBhcnNlKFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlLmNvbm5lY3Rpb24pO1xuICAgIGNvbnN0IHRlc3RDb25uID0gcGdDb25uZWN0aW9uU2NoZW1hLnBhcnNlKFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24pO1xuXG4gICAgLy8gMS4g66Gc7LusIHRlc3QgREIg7Jew6rKwIOyiheujjCDrsI8g7J6s7IOd7ISxXG4gICAgY29uc3QgdGVzdFBnRW52ID0geyBQR1BBU1NXT1JEOiB0ZXN0Q29ubi5wYXNzd29yZCB8fCBcIlwiIH07XG4gICAgZXhlY3V0ZUZpeHR1cmVTeW5jQ29tbWFuZChcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJcbiAgICAgICAgU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKHBnX3N0YXRfYWN0aXZpdHkucGlkKVxuICAgICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgICAgV0hFUkUgZGF0bmFtZSA9ICcke3Rlc3RDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgICBcImAsXG4gICAgICB7IHN0ZGlvOiBcImluaGVyaXRcIiwgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSB9LFxuICAgICk7XG5cbiAgICBleGVjdXRlRml4dHVyZVN5bmNDb21tYW5kKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIkRST1AgREFUQUJBU0UgSUYgRVhJU1RTIFxcXFxcIiR7dGVzdENvbm4uZGF0YWJhc2V9XFxcXFwiXCJgLFxuICAgICAgeyBzdGRpbzogXCJpbmhlcml0XCIsIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4udGVzdFBnRW52IH0gfSxcbiAgICApO1xuXG4gICAgZXhlY3V0ZUZpeHR1cmVTeW5jQ29tbWFuZChcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJDUkVBVEUgREFUQUJBU0UgXFxcXFwiJHt0ZXN0Q29ubi5kYXRhYmFzZX1cXFxcXCJcImAsXG4gICAgICB7IHN0ZGlvOiBcImluaGVyaXRcIiwgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSB9LFxuICAgICk7XG5cbiAgICAvLyAyLiDsm5DqsqkgZml4dHVyZSBEQiDihpIg66Gc7LusIHRlc3QgRELroZwg67O17IKsIChwZ19kdW1wIHwgcGdfcmVzdG9yZSlcbiAgICBjb25zdCBmaXh0dXJlUGdFbnYgPSB7IFBHUEFTU1dPUkQ6IGZpeHR1cmVDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcbiAgICBjb25zdCBkdW1wQ21kID0gYHBnX2R1bXAgLWggJHtmaXh0dXJlQ29ubi5ob3N0fSAtcCAke2ZpeHR1cmVDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHtmaXh0dXJlQ29ubi51c2VyfSAtZCAke2ZpeHR1cmVDb25uLmRhdGFiYXNlfSAtRmNgO1xuICAgIGNvbnN0IHJlc3RvcmVDbWQgPSBgcGdfcmVzdG9yZSAtaCAke3Rlc3RDb25uLmhvc3R9IC1wICR7dGVzdENvbm4ucG9ydCA/PyA1NDMyfSAtVSAke3Rlc3RDb25uLnVzZXJ9IC1kICR7dGVzdENvbm4uZGF0YWJhc2V9IC0tbm8tb3duZXIgLS1uby1hY2xgO1xuXG4gICAgZXhlY3V0ZUZpeHR1cmVTeW5jQ29tbWFuZChcbiAgICAgIGAke2R1bXBDbWR9IHwgUEdQQVNTV09SRD1cIiR7dGVzdENvbm4ucGFzc3dvcmQgfHwgXCJcIn1cIiAke3Jlc3RvcmVDbWR9YCxcbiAgICAgIHtcbiAgICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLmZpeHR1cmVQZ0VudiB9LFxuICAgICAgICBzaGVsbDogXCIvYmluL2Jhc2hcIixcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIDMuIOyLnO2AgOyKpCDrpqzshYsgKOuNsOydtO2EsCDrs7Xsgqwg7ZuEIOyLnO2AgOyKpOulvCBNQVgoaWQp66GcIOygleugrClcbiAgICBhd2FpdCB0aGlzLnJlc2V0U2VxdWVuY2VzKFNvbmFtdS5kYkNvbmZpZy50ZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrqqjrk6Ag7YWM7J2067iU7J2YIOyLnO2AgOyKpOulvCDtmITsnqwgTUFYKGlkKeuhnCDrpqzshYvtlanri4jri6QuXG4gICAqIGZpeHR1cmUgc3luYyDtm4Qg7Iuc7YCA7Iqk6rCAIOyLpOygnCDrjbDsnbTthLDsmYAg66ee7KeAIOyViuuKlCDrrLjsoJzrpbwg7ZW06rKw7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNldFNlcXVlbmNlcyhkYkNvbmZpZzogU29uYW11REJDb25maWdbXCJ0ZXN0XCJdKSB7XG4gICAgY29uc3QgdGVzdERiID0gY3JlYXRlS25leEluc3RhbmNlKGRiQ29uZmlnKTtcbiAgICBjb25zdCBlbnRpdGllcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBlbnRpdHkudGFibGUgfHwgZW50aXR5LmlkLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gaWQg7ZWE65Oc7J2YIO2DgOyeheydhCDtmZXsnbjtlanri4jri6RcbiAgICAgICAgY29uc3QgaWRQcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgICAgY29uc3QgaWRUeXBlID0gaWRQcm9wPy50eXBlO1xuXG4gICAgICAgIC8vIGludGVnZXIvYmlnSW50ZWdlcuydtOqxsOuCmCwgc3RyaW5n7J207KeA66eMIGZpeHR1cmVTdHJhdGVneT1zZXF1ZW5jZeyduCDqsr3smrDsl5Drp4wg66as7IWL7ZWp64uI64ukXG4gICAgICAgIGNvbnN0IHVzZXNTZXF1ZW5jZSA9XG4gICAgICAgICAgaWRUeXBlID09PSBcImludGVnZXJcIiB8fFxuICAgICAgICAgIGlkVHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIgfHxcbiAgICAgICAgICBpZFByb3A/LmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiO1xuXG4gICAgICAgIGlmICghdXNlc1NlcXVlbmNlKSB7XG4gICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgYFNraXBwaW5nIHNlcXVlbmNlIHJlc2V0IGZvciAke3RhYmxlTmFtZX0gKGlkIHR5cGU6ICR7aWRUeXBlIHx8IFwidW5rbm93blwifSlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBvc3RncmVTUUwg7Iuc7YCA7Iqk66W8IO2YhOyerCDthYzsnbTruJTsnZggTUFYKGlkKeuhnCDrpqzshYvtlanri4jri6QuXG4gICAgICAgIC8vIHN0cmluZyDtg4DsnoXsnZgg6rK97JqwIOyIq+yekCDsupDsiqTtjIXsnbQg7ZWE7JqU7ZWp64uI64ukLlxuICAgICAgICBjb25zdCBtYXhFeHByID0gaWRUeXBlID09PSBcInN0cmluZ1wiID8gXCJNQVgoaWQ6OmJpZ2ludClcIiA6IFwiTUFYKGlkKVwiO1xuICAgICAgICBhd2FpdCB0ZXN0RGIucmF3KGBcbiAgICAgICAgICBTRUxFQ1Qgc2V0dmFsKFxuICAgICAgICAgICAgcGdfZ2V0X3NlcmlhbF9zZXF1ZW5jZSgncHVibGljLiR7dGFibGVOYW1lfScsICdpZCcpLFxuICAgICAgICAgICAgQ09BTEVTQ0UoKFNFTEVDVCAke21heEV4cHJ9IEZST00gJHt0YWJsZU5hbWV9KSwgMSlcbiAgICAgICAgICApXG4gICAgICAgIGApO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0ZXN0RGIuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRlZFJlY29yZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgYXN5bmMgaW1wb3J0Rml4dHVyZShlbnRpdHlJZDogc3RyaW5nLCBpZHM6IG51bWJlcltdKSB7XG4gICAgLy8g67Cp66y4IOq4sOuhnSDstIjquLDtmZQgKOyDiOuhnOyatCBpbXBvcnQg7J6R7JeFIOyLnOyekSlcbiAgICB0aGlzLnZpc2l0ZWRSZWNvcmRzLmNsZWFyKCk7XG5cbiAgICBjb25zdCBxdWVyaWVzID0gdW5pcXVlKFxuICAgICAgKFxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBpZHMubWFwKGFzeW5jIChpZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZCwgXCJpZFwiLCBpZCk7XG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICkuZmxhdCgpLFxuICAgICk7XG5cbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgIGZvciAoY29uc3QgcXVlcnkgb2YgcXVlcmllcykge1xuICAgICAgYXdhaXQgd2RiLnJhdyhxdWVyeSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZDogc3RyaW5nLCBmaWVsZDogc3RyaW5nLCBpZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlY29yZEtleSA9IGAke2VudGl0eUlkfSMke2ZpZWxkfSMke2lkfWA7XG5cbiAgICAvLyDsiJztmZgg7LC47KGwIOuwqeyngDog7J2066+4IOuwqeusuO2VnCDroIjsvZTrk5zripQg7Iqk7YK1XG4gICAgaWYgKHRoaXMudmlzaXRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhpcy52aXNpdGVkUmVjb3Jkcy5hZGQocmVjb3JkS2V5KTtcblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuXG4gICAgLy8g7Jes6riw7IScIOyLpERC7J2YIHJvdyDqsIDsoLjsmLRcbiAgICBjb25zdCBbcm93XSA9IGF3YWl0IHdkYihlbnRpdHkudGFibGUpLndoZXJlKGZpZWxkLCBpZCkubGltaXQoMSk7XG4gICAgaWYgKHJvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50aXR5SWR9IyR7aWR9IHJvd+ulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICAvLyDtlL3siqTss5BEQiwg7IukREJcbiAgICBjb25zdCBmaXh0dXJlRGF0YWJhc2UgPSBkYXRhYmFzZUNvbm5lY3Rpb25TY2hlbWEucGFyc2UoXG4gICAgICBTb25hbXUuZGJDb25maWcuZml4dHVyZS5jb25uZWN0aW9uLFxuICAgICkuZGF0YWJhc2U7XG4gICAgY29uc3QgcmVhbERhdGFiYXNlID0gZGF0YWJhc2VDb25uZWN0aW9uU2NoZW1hLnBhcnNlKFxuICAgICAgU29uYW11LmRiQ29uZmlnLnByb2R1Y3Rpb24uY29ubmVjdGlvbixcbiAgICApLmRhdGFiYXNlO1xuXG4gICAgY29uc3Qgc2VsZlF1ZXJ5ID0gYElOU0VSVCBJR05PUkUgSU5UTyBcXGAke2ZpeHR1cmVEYXRhYmFzZX1cXGAuXFxgJHtlbnRpdHkudGFibGV9XFxgIChTRUxFQ1QgKiBGUk9NIFxcYCR7cmVhbERhdGFiYXNlfVxcYC5cXGAke2VudGl0eS50YWJsZX1cXGAgV0hFUkUgXFxgaWRcXGAgPSAke2lkfSlgO1xuXG4gICAgY29uc3QgYXJncyA9IE9iamVjdC5lbnRyaWVzKGVudGl0eS5yZWxhdGlvbnMpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoWywgcmVsYXRpb25dKSA9PlxuICAgICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSB8fFxuICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSAmJiByZWxhdGlvbi5jdXN0b21Kb2luQ2xhdXNlID09PSB1bmRlZmluZWQpLFxuICAgICAgKVxuICAgICAgLm1hcCgoWywgcmVsYXRpb25dKSA9PiB7XG4gICAgICAgIC8qXG4gICAgICAgIEJlbG9uZ3NUb09uZeyduCDqsr3smrBcbiAgICAgICAgICBDYXRlZ29yeSAvICdpZCcgLyByb3dbY2F0ZWdvcnlfaWRdIO2YuOy2nFxuICAgICAgICBPbmVUb09uZeyXkCBqb2luQ29sdW1uID09PSB0cnVlIOyduCDqsr3smrBcbiAgICAgICAgICBQcm9maWxlIC8gJ2lkJyAvIHJvd1twcm9maWxlX2lkXSDtmLjstpxcbiAgICAgICAgT25lVG9PbmXsl5Agam9pbkNvbHVtbiA9PT0gZmFsc2Ug7J24IOqyveyasFxuICAgICAgICAgIFByb2ZpbGUgLyAncHJvZmlsZV9pZCcgLyByb3dbJ2lkJ10g7Zi47LacXG4gICAgICAgICovXG4gICAgICAgIGxldCByZWxhdGlvbkZpZWxkOiBzdHJpbmc7XG4gICAgICAgIGxldCByZWxhdGlvbklkOiBudW1iZXI7XG4gICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSAmJiAhcmVsYXRpb24uaGFzSm9pbkNvbHVtbikge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChyZWxhdGlvbi53aXRoKTtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWRDb2x1bW5OYW1lID0gcmVsYXRlZEVudGl0eS5wcm9wcy5maW5kKFxuICAgICAgICAgICAgKHApID0+IGlzUmVsYXRpb25Qcm9wKHApICYmIHAud2l0aCA9PT0gZW50aXR5LmlkLFxuICAgICAgICAgICk/Lm5hbWU7XG4gICAgICAgICAgaWYgKCFyZWxhdGVkSWRDb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVsYXRlZEVudGl0eS5pZH3snZggJHtlbnRpdHkuaWR9IOq0gOqzhCDtlITroa3snYQg7LC+7J2EIOyImCDsl4bsirXri4jri6QuYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlbGF0aW9uRmllbGQgPSBgJHtyZWxhdGVkSWRDb2x1bW5OYW1lfV9pZGA7XG4gICAgICAgICAgcmVsYXRpb25JZCA9IHJvdy5pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWxhdGlvbkZpZWxkID0gXCJpZFwiO1xuICAgICAgICAgIHJlbGF0aW9uSWQgPSByb3dbYCR7cmVsYXRpb24ubmFtZX1faWRgXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVudGl0eUlkOiByZWxhdGlvbi53aXRoLFxuICAgICAgICAgIGZpZWxkOiByZWxhdGlvbkZpZWxkLFxuICAgICAgICAgIGlkOiByZWxhdGlvbklkLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGFyZykgPT4gYXJnLmlkICE9PSBudWxsKTtcblxuICAgIGNvbnN0IHJlbFF1ZXJpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGFyZ3MubWFwKGFzeW5jIChyZWxhdGlvbkFyZ3MpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhyZWxhdGlvbkFyZ3MuZW50aXR5SWQsIHJlbGF0aW9uQXJncy5maWVsZCwgcmVsYXRpb25BcmdzLmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gWy4uLnVuaXF1ZShyZWxRdWVyaWVzLnRvUmV2ZXJzZWQoKS5mbGF0KCkpLCBzZWxmUXVlcnldO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy50ZXN0aW5nRGIpIHtcbiAgICAgIGF3YWl0IHRoaXMudGVzdGluZ0RiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMudGVzdGluZ0RiID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZml4dHVyZURiKSB7XG4gICAgICBhd2FpdCB0aGlzLmZpeHR1cmVEYi5kZXN0cm95KCk7XG4gICAgICB0aGlzLmZpeHR1cmVEYiA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IEJhc2VNb2RlbC5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRGaXh0dXJlcyhcbiAgICBzb3VyY2VEQk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIHRhcmdldERCTmFtZToga2V5b2YgU29uYW11REJDb25maWcsXG4gICAgc2VhcmNoT3B0aW9uczogRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gICAgZHVwbGljYXRlQ2hlY2s/OiBEdXBsaWNhdGVDaGVja09wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHNvdXJjZURCID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1tzb3VyY2VEQk5hbWVdKTtcbiAgICBjb25zdCB0YXJnZXREQiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbdGFyZ2V0REJOYW1lXSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBlbnRpdHlJZCwgZmllbGQsIHZhbHVlLCBzZWFyY2hUeXBlIH0gPSBzZWFyY2hPcHRpb25zO1xuXG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICBjb25zdCBjb2x1bW4gPVxuICAgICAgICBlbnRpdHkucHJvcHMuZmluZCgocHJvcCkgPT4gcHJvcC5uYW1lID09PSBmaWVsZCk/LnR5cGUgPT09IFwicmVsYXRpb25cIlxuICAgICAgICAgID8gYCR7ZmllbGR9X2lkYFxuICAgICAgICAgIDogZmllbGQ7XG5cbiAgICAgIGxldCBxdWVyeSA9IHNvdXJjZURCKGVudGl0eS50YWJsZSk7XG4gICAgICBpZiAoc2VhcmNoVHlwZSA9PT0gXCJlcXVhbHNcIikge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzZWFyY2hUeXBlID09PSBcImxpa2VcIikge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgXCJsaWtlXCIsIGAlJHt2YWx1ZX0lYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeTtcbiAgICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyByZWNvcmRzIGZvdW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaXh0dXJlczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxSZWNvcmRzTGVuZ3RoID0gZml4dHVyZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBuZXdSZWNvcmRzID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgcm93LCB7XG4gICAgICAgICAgZGI6IHNvdXJjZURCLFxuICAgICAgICB9KTtcbiAgICAgICAgZml4dHVyZXMucHVzaCguLi5uZXdSZWNvcmRzKTtcbiAgICAgICAgY29uc3QgY3VycmVudEZpeHR1cmVSZWNvcmQgPSBmaXh0dXJlcy5maW5kKChyKSA9PiByLmZpeHR1cmVJZCA9PT0gYCR7ZW50aXR5SWR9IyR7cm93LmlkfWApO1xuXG4gICAgICAgIGlmIChjdXJyZW50Rml4dHVyZVJlY29yZCkge1xuICAgICAgICAgIC8vIO2YhOyerCBmaXh0dXJl66Gc67aA7YSwIOyDneyEseuQnCBmZXRjaGVkUmVjb3JkcyDshKTsoJVcbiAgICAgICAgICBjdXJyZW50Rml4dHVyZVJlY29yZC5mZXRjaGVkUmVjb3JkcyA9IGZpeHR1cmVzXG4gICAgICAgICAgICAuZmlsdGVyKChyKSA9PiByLmZpeHR1cmVJZCAhPT0gY3VycmVudEZpeHR1cmVSZWNvcmQuZml4dHVyZUlkKVxuICAgICAgICAgICAgLnNsaWNlKGluaXRpYWxSZWNvcmRzTGVuZ3RoKVxuICAgICAgICAgICAgLm1hcCgocikgPT4gci5maXh0dXJlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICBjb25zdCBmaXh0dXJlRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOyngOyglSDsu6zrn7wg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIHRhcmdldFxuICAgICAgICBjb25zdCBjdXN0b21Db2x1bW5zID0gZHVwbGljYXRlQ2hlY2s/LmNvbHVtbnM/LltmaXh0dXJlLmVudGl0eUlkXTtcbiAgICAgICAgaWYgKGN1c3RvbUNvbHVtbnMgJiYgY3VzdG9tQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3VzdG9tRHVwbGljYXRlUm93ID0gYXdhaXQgdGhpcy5jaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICAgICAgICAgIHRhcmdldERCLFxuICAgICAgICAgICAgZml4dHVyZUVudGl0eSxcbiAgICAgICAgICAgIGZpeHR1cmUsXG4gICAgICAgICAgICBjdXN0b21Db2x1bW5zLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGN1c3RvbUR1cGxpY2F0ZVJvdykge1xuICAgICAgICAgICAgY29uc3QgW3JlY29yZF0gPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZml4dHVyZUVudGl0eSwgY3VzdG9tRHVwbGljYXRlUm93LCB7XG4gICAgICAgICAgICAgIHNpbmdsZVJlY29yZDogdHJ1ZSxcbiAgICAgICAgICAgICAgZGI6IHRhcmdldERCLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmaXh0dXJlLnRhcmdldCA9IHJlY29yZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVbmlxdWUgaW5kZXgg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIGZpeHR1cmUudW5pcXVlXG4gICAgICAgIGNvbnN0IHVuaXF1ZVJvdyA9IGF3YWl0IHRoaXMuY2hlY2tVbmlxdWVWaW9sYXRpb24odGFyZ2V0REIsIGZpeHR1cmVFbnRpdHksIGZpeHR1cmUpO1xuICAgICAgICBpZiAodW5pcXVlUm93KSB7XG4gICAgICAgICAgY29uc3QgW3JlY29yZF0gPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZml4dHVyZUVudGl0eSwgdW5pcXVlUm93LCB7XG4gICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICBkYjogdGFyZ2V0REIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZml4dHVyZS51bmlxdWUgPSByZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuaXF1ZShmaXh0dXJlcywgKGYpID0+IGYuZml4dHVyZUlkKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFt0YXJnZXREQi5kZXN0cm95KCksIHNvdXJjZURCLmRlc3Ryb3koKV0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUZpeHR1cmVSZWNvcmQoXG4gICAgcm9vdEVudGl0eTogRW50aXR5LFxuICAgIHJvb3RSb3c6IEZpeHR1cmVTb3VyY2VSZWNvcmQsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHNpbmdsZVJlY29yZD86IGJvb2xlYW47XG4gICAgICBkYj86IEtuZXg7XG4gICAgfSxcbiAgKTogUHJvbWlzZTxGaXh0dXJlUmVjb3JkW10+IHtcbiAgICBjb25zdCByZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcbiAgICBjb25zdCB2aXNpdGVkRW50aXRpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IGNyZWF0ZSA9IGFzeW5jIChlbnRpdHk6IEVudGl0eSwgcm93OiBGaXh0dXJlU291cmNlUmVjb3JkKSA9PiB7XG4gICAgICBjb25zdCBmaXh0dXJlSWQgPSBgJHtlbnRpdHkuaWR9IyR7cm93LmlkfWA7XG4gICAgICBpZiAodmlzaXRlZEVudGl0aWVzLmhhcyhmaXh0dXJlSWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZpc2l0ZWRFbnRpdGllcy5hZGQoZml4dHVyZUlkKTtcblxuICAgICAgY29uc3QgcmVjb3JkOiBGaXh0dXJlUmVjb3JkID0ge1xuICAgICAgICBmaXh0dXJlSWQsXG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIGlkOiByb3cuaWQsXG4gICAgICAgIGNvbHVtbnM6IHt9LFxuICAgICAgICBmZXRjaGVkUmVjb3JkczogW10sXG4gICAgICAgIGJlbG9uZ3NSZWNvcmRzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNBRkVUWTogRml4dHVyZVJlY29yZOydmCDroIjqsbDsi5wg6rCSIO2DgOyeheuztOuLpCDsi6TsoJwgREIvSlNPTiBmaXh0dXJlIOqwkiDqs4Tslb3snbQg64ST7Iq164uI64ukLlxuICAgICAgICBjb25zdCBjb2x1bW5WYWx1ZSA9IHJvd1twcm9wLm5hbWVdIGFzIEZpeHR1cmVSZWNvcmRbXCJjb2x1bW5zXCJdW3N0cmluZ11bXCJ2YWx1ZVwiXTtcbiAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXSA9IHtcbiAgICAgICAgICBwcm9wOiBwcm9wLFxuICAgICAgICAgIHZhbHVlOiBjb2x1bW5WYWx1ZSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBkYiA9IG9wdGlvbnM/LmRiID8/IEJhc2VNb2RlbC5nZXREQihcIndcIik7XG4gICAgICAgIGlmIChpc01hbnlUb01hbnlSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBjb25zdCB0aHJvdWdoVGFibGUgPSBwcm9wLmpvaW5UYWJsZTtcbiAgICAgICAgICBjb25zdCBmcm9tQ29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShlbnRpdHkudGFibGUpfV9pZGA7XG4gICAgICAgICAgY29uc3QgdG9Db2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHJlbGF0ZWRFbnRpdHkudGFibGUpfV9pZGA7XG5cbiAgICAgICAgICBjb25zdCByZWxhdGVkSWRzID0gYXdhaXQgZGIodGhyb3VnaFRhYmxlKS53aGVyZShmcm9tQ29sdW1uLCByb3cuaWQpLnBsdWNrKHRvQ29sdW1uKTtcbiAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZElkcztcbiAgICAgICAgfSBlbHNlIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWRzID0gYXdhaXQgZGIocmVsYXRlZEVudGl0eS50YWJsZSlcbiAgICAgICAgICAgIC53aGVyZShwcm9wLmpvaW5Db2x1bW4sIHJvdy5pZClcbiAgICAgICAgICAgIC5wbHVjayhcImlkXCIpO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWRzO1xuICAgICAgICB9IGVsc2UgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgIXByb3AuaGFzSm9pbkNvbHVtbikge1xuICAgICAgICAgIC8vIOyXreuwqe2WpSBPbmVUb09uZTogRkvrpbwg6rCA7KeEIOq0gOugqCDsl5Tti7Dti7Drpbwg7LC+7Iq164uI64ukXG4gICAgICAgICAgLy8g7JiI7IucOiBVc2VyIE9uZVRvT25lIEVtcGxveWVlIChFbXBsb3llZeqwgCB1c2VyX2lkIEZL66W8IOqwgOynkClcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBjb25zdCByZWxhdGVkUHJvcCA9IHJlbGF0ZWRFbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBpc1JlbGF0aW9uUHJvcChwKSAmJiBwLndpdGggPT09IGVudGl0eS5pZCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChyZWxhdGVkUHJvcCAmJiBpc1JlbGF0aW9uUHJvcChyZWxhdGVkUHJvcCkpIHtcbiAgICAgICAgICAgIC8vIOq0gOugqCDsl5Tti7Dti7Dsl5DshJwgRksg7Lus65+87Jy866GcIOy/vOumrO2VqeuLiOuLpCAoaWTqsIAg7JWE64uYKVxuICAgICAgICAgICAgY29uc3QgZmtDb2x1bW4gPSBgJHtyZWxhdGVkUHJvcC5uYW1lfV9pZGA7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkUm93ID0gYXdhaXQgZGIocmVsYXRlZEVudGl0eS50YWJsZSkud2hlcmUoZmtDb2x1bW4sIHJvdy5pZCkuZmlyc3QoKTtcbiAgICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkUm93Py5pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWQgPSByZWxhdGlvbklkU2NoZW1hLnBhcnNlKHJvd1tgJHtwcm9wLm5hbWV9X2lkYF0pO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWQ7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCkge1xuICAgICAgICAgICAgcmVjb3JkLmJlbG9uZ3NSZWNvcmRzLnB1c2goYCR7cHJvcC53aXRofSMke3JlbGF0ZWRJZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFvcHRpb25zPy5zaW5nbGVSZWNvcmQgJiYgcmVsYXRlZElkKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSb3cgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKS53aGVyZShcImlkXCIsIHJlbGF0ZWRJZCkuZmlyc3QoKTtcbiAgICAgICAgICAgIGlmIChyZWxhdGVkUm93KSB7XG4gICAgICAgICAgICAgIGF3YWl0IGNyZWF0ZShyZWxhdGVkRW50aXR5LCB7XG4gICAgICAgICAgICAgICAgLi4uZGF0YUV4cGxvcmVyUmVjb3JkU2NoZW1hLnBhcnNlKHJlbGF0ZWRSb3cpLFxuICAgICAgICAgICAgICAgIGlkOiB6LnVuaW9uKFt6Lm51bWJlcigpLCB6LnN0cmluZygpXSkucGFyc2UocmVsYXRlZFJvdy5pZCksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgICB9O1xuXG4gICAgYXdhaXQgY3JlYXRlKHJvb3RFbnRpdHksIHJvb3RSb3cpO1xuXG4gICAgcmV0dXJuIHJlY29yZHM7XG4gIH1cblxuICAvKipcbiAgICogMS4gUmVsYXRpb25HcmFwaOuhnCBmaXh0dXJlIOuLqOychCDsgr3snoUg7Iic7IScIOqzhOyCsCAoc2VsZi1yZWZlcmVuY2Ug7Y+s7ZWoKVxuICAgKiAyLiDthYzsnbTruJTrs4Qg66CI67Ko67OE66GcIFVwc2VydEJ1aWxkZXLsl5Ag65Ox66GdIOuwjyB1cHNlcnQg7Iuk7ZaJXG4gICAqIDMuIOyInOyEnCDquLDrsJggdXVpZOKGkmlkIOunpO2VkSAoVXBzZXJ0QnVpbGRlcuqwgCB1dWlk66W8IERC7JeQIOyggOyepe2VmOyngCDslYrsnLzrr4DroZwpXG4gICAqXG4gICAqIFVwc2VydEJ1aWxkZXLripQgc2VsZi1yZWZlcmVuY2XqsIAg7J6I7Jy866m0IGJ1aWxkSW5zZXJ0TGV2ZWxzKCnroZwg7J6s7KCV66Cs7ZWY7JesXG4gICAqIOuTseuhnSDsiJzshJzsmYAg67CY7ZmYIOyInOyEnOqwgCDri6zrnbzsp4gg7IiYIOyeiOyKteuLiOuLpC4g7J2066W8IOuwqeyngO2VmOq4sCDsnITtlbRcbiAgICogRml4dHVyZU1hbmFnZXLqsIAg66CI67Ko67OE66GcIOuCmOuIoOyEnCDsspjrpqztlZjsl6wg6rCBIHVwc2VydCDtmLjstpzsl5DshJzripRcbiAgICogc2VsZi1yZWZlcmVuY2XqsIAg7JeG64+E66GdIO2VqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGluc2VydEZpeHR1cmVzKFxuICAgIGRiTmFtZToga2V5b2YgU29uYW11REJDb25maWcsXG4gICAgX2ZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10sXG4gICk6IFByb21pc2U8Rml4dHVyZUltcG9ydFJlc3VsdFtdPiB7XG4gICAgY29uc3QgZml4dHVyZXMgPSB1bmlxdWUoX2ZpeHR1cmVzLCAoZikgPT4gZi5maXh0dXJlSWQpO1xuXG4gICAgLy8g7LSI6riw7ZmUXG4gICAgdGhpcy5idWlsZGVyID0gbmV3IFVwc2VydEJ1aWxkZXIoKTtcbiAgICB0aGlzLmZpeHR1cmVSZWZNYXAgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5za2lwcGVkRml4dHVyZXMgPSBuZXcgTWFwKCk7XG5cbiAgICAvLyDrs5HroKwg7YWM7Iqk7Yq4IOuqqOuTnOyXkOyEnOuKlCB3b3JrZXLrs4QgRELsl5Ag7KCA7J6lXG4gICAgY29uc3QgZGJDb25maWcgPVxuICAgICAgcHJvY2Vzcy5lbnYuU09OQU1VX1dPUktFUl9EQiA9PT0gXCJ0cnVlXCIgJiYgcHJvY2Vzcy5lbnYuVklURVNUX1BPT0xfSURcbiAgICAgICAgPyAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VySWQgPSBwYXJzZUludChwcm9jZXNzLmVudi5WSVRFU1RfUE9PTF9JRCA/PyBcIjFcIiwgMTApO1xuICAgICAgICAgICAgY29uc3QgYmFzZUNvbmZpZyA9IFNvbmFtdS5kYkNvbmZpZ1tkYk5hbWVdO1xuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGRhdGFiYXNlQ29ubmVjdGlvblNjaGVtYS5wYXJzZShiYXNlQ29uZmlnLmNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uYmFzZUNvbmZpZyxcbiAgICAgICAgICAgICAgY29ubmVjdGlvbjogeyAuLi5jb25uZWN0aW9uLCBkYXRhYmFzZTogYCR7Y29ubmVjdGlvbi5kYXRhYmFzZX1fJHt3b3JrZXJJZH1gIH0sXG4gICAgICAgICAgICAgIHBvb2w6IHsgbWluOiAxLCBtYXg6IDEgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSkoKVxuICAgICAgICA6IFNvbmFtdS5kYkNvbmZpZ1tkYk5hbWVdO1xuICAgIGNvbnN0IGRiID0gY3JlYXRlS25leEluc3RhbmNlKGRiQ29uZmlnKTtcbiAgICBjb25zdCByZXN1bHRzOiBGaXh0dXJlSW1wb3J0UmVzdWx0W10gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICAvLyAxLiBSZWxhdGlvbkdyYXBo66GcIGZpeHR1cmUg64uo7JyEIOyCveyehSDsiJzshJwg6rOE7IKwXG4gICAgICB0aGlzLnJlbGF0aW9uR3JhcGguYnVpbGRHcmFwaChmaXh0dXJlcyk7XG4gICAgICBjb25zdCBpbnNlcnRpb25PcmRlciA9IHRoaXMucmVsYXRpb25HcmFwaC5nZXRJbnNlcnRpb25PcmRlcigpO1xuXG4gICAgICAvLyAyLiDsiqTtgrXtlaAgZml4dHVyZSDrqLzsoIAg7LKY66asIChvdmVycmlkZSDssrTtgawpXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmVJZCBvZiBpbnNlcnRpb25PcmRlcikge1xuICAgICAgICBjb25zdCBmaXh0dXJlID0gZml4dHVyZXMuZmluZCgoZikgPT4gZi5maXh0dXJlSWQgPT09IGZpeHR1cmVJZCk7XG4gICAgICAgIGlmICghZml4dHVyZSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgaGFzVGFyZ2V0ID0gISFmaXh0dXJlLnRhcmdldDtcbiAgICAgICAgY29uc3QgaGFzVW5pcXVlID0gISFmaXh0dXJlLnVuaXF1ZTtcbiAgICAgICAgY29uc3QgaGFzRHVwbGljYXRlID0gaGFzVGFyZ2V0IHx8IGhhc1VuaXF1ZTtcblxuICAgICAgICAvLyDspJHrs7XsnbQg7J6I6rOgIG92ZXJyaWRlPWZhbHNl7J24IOqyveyasDog7Iqk7YK1XG4gICAgICAgIGlmIChoYXNEdXBsaWNhdGUgJiYgIWZpeHR1cmUub3ZlcnJpZGUpIHtcbiAgICAgICAgICAvLyDquLDsobQg66CI7L2U65OcIElEIOyggOyepSAodW5pcXVlIOyasOyEoCwg7JeG7Jy866m0IHRhcmdldClcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkID0gZml4dHVyZS51bmlxdWU/LmlkID8/IGZpeHR1cmUudGFyZ2V0Py5pZDtcbiAgICAgICAgICBhc3NlcnQoZXhpc3RpbmdJZCk7XG4gICAgICAgICAgdGhpcy5za2lwcGVkRml4dHVyZXMuc2V0KGZpeHR1cmVJZCwge1xuICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICBleGlzdGluZ0lkLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgIGBTa2lwcGVkICR7Zml4dHVyZS5lbnRpdHlJZH0jJHtmaXh0dXJlLmlkfSAoZXhpc3Rpbmc6ICMke2V4aXN0aW5nSWR9LCBvdmVycmlkZTogZmFsc2UpYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gMy4g7YWM7J2067iU67OEIGZpeHR1cmUg6re466O57ZmUIChpbnNlcnRpb25PcmRlciDsiJzshJwg6riw67CYKVxuICAgICAgY29uc3QgZml4dHVyZXNCeVRhYmxlID0gbmV3IE1hcDxzdHJpbmcsIEZpeHR1cmVSZWNvcmRbXT4oKTtcbiAgICAgIGNvbnN0IHRhYmxlT3JkZXI6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZUlkIG9mIGluc2VydGlvbk9yZGVyKSB7XG4gICAgICAgIC8vIOyKpO2CteuQnCBmaXh0dXJlIOygnOyZuFxuICAgICAgICBpZiAodGhpcy5za2lwcGVkRml4dHVyZXMuaGFzKGZpeHR1cmVJZCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGZpeHR1cmUgPSBmaXh0dXJlcy5maW5kKChmKSA9PiBmLmZpeHR1cmVJZCA9PT0gZml4dHVyZUlkKTtcbiAgICAgICAgaWYgKCFmaXh0dXJlKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICAgICAgY29uc3QgdGFibGVOYW1lID0gZW50aXR5LnRhYmxlO1xuXG4gICAgICAgIGlmICghZml4dHVyZXNCeVRhYmxlLmhhcyh0YWJsZU5hbWUpKSB7XG4gICAgICAgICAgZml4dHVyZXNCeVRhYmxlLnNldCh0YWJsZU5hbWUsIFtdKTtcbiAgICAgICAgICB0YWJsZU9yZGVyLnB1c2godGFibGVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBmaXh0dXJlc0J5VGFibGUuZ2V0KHRhYmxlTmFtZSk/LnB1c2goZml4dHVyZSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGRiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgICAgY29uc3QgaW5zZXJ0ZWRJZHNCeVRhYmxlID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4+KCk7XG5cbiAgICAgICAgLy8gNC4g7YWM7J2067iU67OEIOugiOuyqOuzhCDsspjrpqxcbiAgICAgICAgZm9yIChjb25zdCB0YWJsZU5hbWUgb2YgdGFibGVPcmRlcikge1xuICAgICAgICAgIGNvbnN0IHRhYmxlRml4dHVyZXMgPSBmaXh0dXJlc0J5VGFibGUuZ2V0KHRhYmxlTmFtZSkgPz8gW107XG4gICAgICAgICAgY29uc3QgbGV2ZWxzID0gdGhpcy5ncm91cEZpeHR1cmVzQnlMZXZlbCh0YWJsZUZpeHR1cmVzKTtcblxuICAgICAgICAgIGZvciAoY29uc3QgbGV2ZWxGaXh0dXJlcyBvZiBsZXZlbHMpIHtcbiAgICAgICAgICAgIC8vIO2VtOuLuSDroIjrsqjsnZggZml4dHVyZeuTpCByZWdpc3RlclxuICAgICAgICAgICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGxldmVsRml4dHVyZXMpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlckZpeHR1cmUoZml4dHVyZSwgaW5zZXJ0ZWRJZHNCeVRhYmxlKTtcbiAgICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBjaGFsay5ibHVlKFxuICAgICAgICAgICAgICAgICAgICBgUmVnaXN0ZXJlZCAke2ZpeHR1cmUuZW50aXR5SWR9IyR7Zml4dHVyZS5pZH0ke2ZpeHR1cmUub3ZlcnJpZGUgPyBgIChvdmVycmlkZSlgIDogXCJcIn1gLFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB1cHNlcnQg7Iuk7ZaJIOyghCB1dWlkIOuqqeuhnSDsoIDsnqVcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5idWlsZGVyLmdldFRhYmxlKHRhYmxlTmFtZSk7XG4gICAgICAgICAgICBjb25zdCB1dWlkcyA9IHRhYmxlLnJvd3MubWFwKChyb3cpID0+IHouc3RyaW5nKCkucGFyc2Uocm93LnV1aWQpKTtcblxuICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoXG4gICAgICAgICAgICAgICAgICBgVXBzZXJ0aW5nICR7dGFibGVOYW1lfSB3aXRoICR7dXVpZHMubGVuZ3RofSByb3dzIChsZXZlbCAke2xldmVscy5pbmRleE9mKGxldmVsRml4dHVyZXMpICsgMX0vJHtsZXZlbHMubGVuZ3RofSlgLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBTQUZFVFk6IHRhYmxlTmFtZeydgCDrk7HroZ3rkJwgRW50aXR57J2YIOyLpOygnCDthYzsnbTruJTrqoXsl5DshJzrp4wg7IOd7ISx65Cp64uI64ukLlxuICAgICAgICAgICAgY29uc3Qgc2NoZW1hVGFibGVOYW1lID0gdGFibGVOYW1lIGFzIGtleW9mIERhdGFiYXNlU2NoZW1hRXh0ZW5kO1xuICAgICAgICAgICAgY29uc3QgaWRzID0gZml4dHVyZVJlY29yZElkc1NjaGVtYS5wYXJzZShcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5idWlsZGVyLnVwc2VydCh0cngsIHNjaGVtYVRhYmxlTmFtZSksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyDsiJzshJwg6riw67CYIHV1aWQgLT4gaWQg66ek7ZWRXG4gICAgICAgICAgICAvLyBzZWxmLXJlZmVyZW5jZeqwgCDsl4bsnLzrr4DroZwg65Ox66GdIOyInOyEnCA9IOuwmO2ZmCDsiJzshJwg67O07J6lXG4gICAgICAgICAgICBpZiAodXVpZHMubGVuZ3RoID4gMCAmJiB1dWlkcy5sZW5ndGggPT09IGlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdNYXAgPVxuICAgICAgICAgICAgICAgIGluc2VydGVkSWRzQnlUYWJsZS5nZXQodGFibGVOYW1lKSA/PyBuZXcgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPigpO1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHV1aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdNYXAuc2V0KHV1aWRzW2ldLCBpZHNbaV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGluc2VydGVkSWRzQnlUYWJsZS5zZXQodGFibGVOYW1lLCBleGlzdGluZ01hcCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHV1aWRzLmxlbmd0aCAhPT0gaWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgICAgYFdhcm5pbmc6IHV1aWQgY291bnQgKCR7dXVpZHMubGVuZ3RofSkgIT0gaWQgY291bnQgKCR7aWRzLmxlbmd0aH0pIGZvciAke3RhYmxlTmFtZX1gLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNS4gTWFueVRvTWFueSDqtIDqs4Qg7LKY66asXG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnModHJ4LCBmaXh0dXJlcywgaW5zZXJ0ZWRJZHNCeVRhYmxlKTtcblxuICAgICAgICAvLyA2LiBQb3N0Z3JlU1FMIOyLnO2AgOyKpCDrpqzshYtcbiAgICAgICAgLy8gRml4dHVyZSDsgr3snoUg7ZuEIOqwgSDthYzsnbTruJTsnZggSUQg7Iuc7YCA7Iqk66W8IOy1nOuMgCBJRCDqsJLsnLzroZwg7JeF642w7J207Yq47ZWp64uI64ukLlxuICAgICAgICAvLyDsnbTroIfqsowg7ZWY7KeAIOyViuycvOuptCDri6TsnYwgSU5TRVJUIOyLnCBJROqwgCAyMDAw67KI64yA66GcIOyDneyEseuQoCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJlc2V0dGluZyBzZXF1ZW5jZXMuLi5cIikpO1xuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU9yZGVyKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEVudGl0eeulvCDssL7slYTshJwgaWQg7YOA7J6FIO2ZleyduFxuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpLmZpbmQoXG4gICAgICAgICAgICAgIChlKSA9PiBlLnRhYmxlID09PSB0YWJsZU5hbWUgfHwgZS5pZC50b0xvd2VyQ2FzZSgpID09PSB0YWJsZU5hbWUsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoZW50aXR5KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICAgICAgICAgIGNvbnN0IGlkVHlwZSA9IGlkUHJvcD8udHlwZTtcblxuICAgICAgICAgICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXLsnbTqsbDrgpgsIHN0cmluZ+ydtOyngOunjCBmaXh0dXJlU3RyYXRlZ3k9c2VxdWVuY2Xsnbgg6rK97Jqw7JeQ66eMIOumrOyFi+2VqeuLiOuLpFxuICAgICAgICAgICAgICBjb25zdCB1c2VzU2VxdWVuY2UgPVxuICAgICAgICAgICAgICAgIGlkVHlwZSA9PT0gXCJpbnRlZ2VyXCIgfHxcbiAgICAgICAgICAgICAgICBpZFR5cGUgPT09IFwiYmlnSW50ZWdlclwiIHx8XG4gICAgICAgICAgICAgICAgaWRQcm9wPy5jb25lPy5maXh0dXJlU3RyYXRlZ3kgPT09IFwic2VxdWVuY2VcIjtcblxuICAgICAgICAgICAgICBpZiAoIXVzZXNTZXF1ZW5jZSkge1xuICAgICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgICAgICAgICAgYFNraXBwZWQgc2VxdWVuY2UgcmVzZXQgZm9yICR7dGFibGVOYW1lfSAoaWQgdHlwZTogJHtpZFR5cGUgfHwgXCJ1bmtub3duXCJ9KWAsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIO2FjOydtOu4lOydmCDstZzrjIAgSUQg7KGw7ZqMIChzdHJpbmcg7YOA7J6F7J2AIOyIq+yekCDsupDsiqTtjIUg7ZWE7JqUKVxuICAgICAgICAgICAgY29uc3QgZW50aXR5MiA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKS5maW5kKFxuICAgICAgICAgICAgICAoZSkgPT4gZS50YWJsZSA9PT0gdGFibGVOYW1lIHx8IGUuaWQudG9Mb3dlckNhc2UoKSA9PT0gdGFibGVOYW1lLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGlkVHlwZTIgPSBlbnRpdHkyPy5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik/LnR5cGU7XG4gICAgICAgICAgICBjb25zdCBtYXhJZFJlc3VsdCA9XG4gICAgICAgICAgICAgIGlkVHlwZTIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICA/IGF3YWl0IHRyeFxuICAgICAgICAgICAgICAgICAgICAucmF3KGBTRUxFQ1QgTUFYKGlkOjpiaWdpbnQpIGFzIG1heF9pZCBGUk9NIFwiJHt0YWJsZU5hbWV9XCJgKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocikgPT4gci5yb3dzWzBdKVxuICAgICAgICAgICAgICAgIDogYXdhaXQgdHJ4KHRhYmxlTmFtZSkubWF4KFwiaWQgYXMgbWF4X2lkXCIpLmZpcnN0KCk7XG4gICAgICAgICAgICBjb25zdCBtYXhJZCA9IG1heElkUmVzdWx0Py5tYXhfaWQ7XG5cbiAgICAgICAgICAgIGlmIChtYXhJZCAhPT0gbnVsbCAmJiBtYXhJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIOyLnO2AgOyKpOuqheydhCBwZ19nZXRfc2VyaWFsX3NlcXVlbmNl66GcIOyViOyghO2VmOqyjCDsobDtmoxcbiAgICAgICAgICAgICAgYXdhaXQgdHJ4LnJhdyhgU0VMRUNUIHNldHZhbChwZ19nZXRfc2VyaWFsX3NlcXVlbmNlKD8sICdpZCcpLCA/KWAsIFtcbiAgICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgbWF4SWQsXG4gICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFJlc2V0IHNlcXVlbmNlIGZvciAke3RhYmxlTmFtZX06ICR7bWF4SWR9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8g7Iuc7YCA7Iqk6rCAIOyXhuuKlCDthYzsnbTruJQoam9pbiB0YWJsZSDrk7Ep7J2AIOustOyLnFxuICAgICAgICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYFNraXBwZWQgc2VxdWVuY2UgcmVzZXQgZm9yICR7dGFibGVOYW1lfWApKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyA3LiDqsrDqs7wg7IiY7KeRXG4gICAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuXG4gICAgICAgICAgLy8g7Iqk7YK165CcIGZpeHR1cmXripQg6riw7KG0IOugiOy9lOuTnCDsoJXrs7TroZwg6rKw6rO8IOy2lOqwgFxuICAgICAgICAgIGNvbnN0IHNraXBwZWQgPSB0aGlzLnNraXBwZWRGaXh0dXJlcy5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICAgIGlmIChza2lwcGVkKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgICAgICAgZGF0YTogYXdhaXQgdHJ4KGVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCBza2lwcGVkLmV4aXN0aW5nSWQpLmZpcnN0KCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgIGNvbnN0IHV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChlbnRpdHkudGFibGUpO1xuICAgICAgICAgICAgY29uc3QgaW5zZXJ0ZWRJZCA9IHV1aWRUb0lkPy5nZXQocmVmLnV1aWQpO1xuXG4gICAgICAgICAgICBpZiAoaW5zZXJ0ZWRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICAgICAgZGF0YTogYXdhaXQgdHJ4KGVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCBpbnNlcnRlZElkKS5maXJzdCgpLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKGBJbnNlcnRlZCBpbnRvICR7ZW50aXR5LnRhYmxlfTogIyR7Zml4dHVyZS5pZH0gLT4gIyR7aW5zZXJ0ZWRJZH1gKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5pcXVlKHJlc3VsdHMsIChyKSA9PiBgJHtyLmVudGl0eUlkfSMke3IuZGF0YS5pZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXh0dXJlUmVjb3Jk66W8IFVwc2VydEJ1aWxkZXLsl5Ag65Ox66GdXG4gICAqIEBwYXJhbSBpbnNlcnRlZElkc0J5VGFibGUg7J2066+4IHVwc2VydOuQnCDthYzsnbTruJTsnZggdXVpZOKGkmlkIOunpO2VkSAo66CI67Ko67OEIOyymOumrCDsi5wg7IKs7JqpKVxuICAgKi9cbiAgcHJpdmF0ZSByZWdpc3RlckZpeHR1cmUoXG4gICAgZml4dHVyZTogRml4dHVyZVJlY29yZCxcbiAgICBpbnNlcnRlZElkc0J5VGFibGU/OiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+PixcbiAgKTogVUJSZWYge1xuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgIGNvbnN0IHJvdzogVXBzZXJ0Um93ID0ge307XG5cbiAgICAvLyBPdmVycmlkZSDrqqjrk5wg7YyQ64uoOiB0YXJnZXQg65iQ64qUIHVuaXF1ZeqwgCDsnojqs6Agb3ZlcnJpZGU9dHJ1ZeyduCDqsr3smrBcbiAgICBjb25zdCBleGlzdGluZ1JlY29yZCA9IGZpeHR1cmUudGFyZ2V0ID8/IGZpeHR1cmUudW5pcXVlO1xuICAgIGNvbnN0IGlzT3ZlcnJpZGVNb2RlID0gZml4dHVyZS5vdmVycmlkZSAmJiBleGlzdGluZ1JlY29yZDtcblxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBjb2x1bW5dIG9mIE9iamVjdC5lbnRyaWVzKGZpeHR1cmUuY29sdW1ucykpIHtcbiAgICAgIGNvbnN0IHByb3AgPSBjb2x1bW4ucHJvcDtcblxuICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlZCBjb2x1bW7snYAgSU5TRVJU7JeQ7IScIOygnOyZuCAoRELqsIAg7J6Q64+ZIOyDneyEsSlcbiAgICAgIGlmIChcImdlbmVyYXRlZFwiIGluIHByb3AgJiYgcHJvcC5nZW5lcmF0ZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlkIOyymOumrFxuICAgICAgaWYgKHByb3BOYW1lID09PSBcImlkXCIpIHtcbiAgICAgICAgY29uc3QgaWRQcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgICAgLy8gcGFyZW50SWQg7JeU7Yuw7Yuw7J2YIGlk64qUIOu2gOuqqCDsl5Tti7Dti7DsnZggRkvsnbTrr4DroZwg7Iuc7YCA7IqkIOuvuOyCrOyaqSAo66qF7Iuc7KCB7Jy866GcIO2PrO2VqClcbiAgICAgICAgY29uc3QgdXNlc1NlcXVlbmNlID1cbiAgICAgICAgICAhZW50aXR5LnBhcmVudElkICYmXG4gICAgICAgICAgKGlkUHJvcD8udHlwZSA9PT0gXCJpbnRlZ2VyXCIgfHxcbiAgICAgICAgICAgIGlkUHJvcD8udHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIgfHxcbiAgICAgICAgICAgIGlkUHJvcD8uY29uZT8uZml4dHVyZVN0cmF0ZWd5ID09PSBcInNlcXVlbmNlXCIpO1xuXG4gICAgICAgIGlmIChpc092ZXJyaWRlTW9kZSAmJiBleGlzdGluZ1JlY29yZCkge1xuICAgICAgICAgIC8vIE92ZXJyaWRlOiDquLDsobQg66CI7L2U65Oc7J2YIOqwkiDsgqzsmqkg4oaSIFVQREFURVxuICAgICAgICAgIHJvd1twcm9wTmFtZV0gPSBleGlzdGluZ1JlY29yZC5jb2x1bW5zW3Byb3BOYW1lXT8udmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIXVzZXNTZXF1ZW5jZSkge1xuICAgICAgICAgIC8vIHN0cmluZyBQSyDrmJDripQgcGFyZW50SWQg7JeU7Yuw7YuwIEZLOiDsg53shLHrkJwgaWQg6rCS7J2EIElOU0VSVOyXkCDtj6ztlahcbiAgICAgICAgICByb3dbcHJvcE5hbWVdID0gY29sdW1uLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGludGVnZXIvYmlnSW50ZWdlciBQSzogREIg7Iuc7YCA7Iqk7JeQIOunoeq5gCAo6rCSIOygnOyZuClcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHxcbiAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZCA9IHJlbGF0aW9uSWRTY2hlbWEucGFyc2UoY29sdW1uLnZhbHVlKTtcbiAgICAgICAgICBpZiAocmVsYXRlZElkICE9PSBudWxsICYmIHJlbGF0ZWRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkRml4dHVyZUlkID0gYCR7cHJvcC53aXRofSMke3JlbGF0ZWRJZH1gO1xuXG4gICAgICAgICAgICAvLyDrqLzsoIAgc2tpcOuQnCBmaXh0dXJl7J247KeAIO2ZleyduFxuICAgICAgICAgICAgY29uc3Qgc2tpcHBlZEV4aXN0aW5nSWQgPSB0aGlzLnNraXBwZWRGaXh0dXJlcy5nZXQocmVsYXRlZEZpeHR1cmVJZCk/LmV4aXN0aW5nSWQ7XG4gICAgICAgICAgICBpZiAoc2tpcHBlZEV4aXN0aW5nSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyBza2lw65CcIGZpeHR1cmUg4oaSIHRhcmdldCBEQuydmCDquLDsobQg66CI7L2U65OcIGlkIOyCrOyaqVxuICAgICAgICAgICAgICByb3dbYCR7cHJvcE5hbWV9X2lkYF0gPSBza2lwcGVkRXhpc3RpbmdJZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpO1xuICAgICAgICAgICAgICBpZiAocmVsYXRlZFJlZikge1xuICAgICAgICAgICAgICAgIC8vIOydtOuvuCB1cHNlcnTrkJwg6rCZ7J2AIO2FjOydtOu4lCBmaXh0dXJlIO2ZleyduFxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJbnNlcnRlZElkcyA9IGluc2VydGVkSWRzQnlUYWJsZT8uZ2V0KHJlbGF0ZWRFbnRpdHkudGFibGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbElkID0gcmVsYXRlZEluc2VydGVkSWRzPy5nZXQocmVsYXRlZFJlZi51dWlkKTtcblxuICAgICAgICAgICAgICAgIGlmIChhY3R1YWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAvLyDsnbTrr7ggdXBzZXJ065CoIOKGkiDsi6TsoJwgSUQg7IKs7JqpXG4gICAgICAgICAgICAgICAgICByb3dbYCR7cHJvcE5hbWV9X2lkYF0gPSBhY3R1YWxJZDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8g7JWE7KeBIHVwc2VydCDslYjrkKgg4oaSIFVCUmVmIOyCrOyaqVxuICAgICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gcmVsYXRlZFJlZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZml4dHVyZXPsl5Ag7Y+s7ZWo65CY7KeAIOyViuydgCDroIjsvZTrk5wg4oaSIElEIOq3uOuMgOuhnCDsgqzsmqlcbiAgICAgICAgICAgICAgICByb3dbYCR7cHJvcE5hbWV9X2lkYF0gPSByZWxhdGVkSWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGFzTWFueSwgTWFueVRvTWFueeuKlCDrs4Trj4Qg7LKY66asXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDsnbzrsJgg7Lus65+8XG4gICAgICAgIHJvd1twcm9wTmFtZV0gPSB0aGlzLmNvbnZlcnRDb2x1bW5WYWx1ZShwcm9wLCBjb2x1bW4udmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShgUmVnaXN0ZXJpbmcgJHtlbnRpdHkudGFibGV9IC0gJHtpbnNwZWN0KHJvdywgZmFsc2UsIG51bGwsIHRydWUpfWApKTtcbiAgICBjb25zdCByZWYgPSB0aGlzLmJ1aWxkZXIucmVnaXN0ZXIoZW50aXR5LnRhYmxlLCByb3cpO1xuICAgIHRoaXMuZml4dHVyZVJlZk1hcC5zZXQoZml4dHVyZS5maXh0dXJlSWQsIHJlZik7XG5cbiAgICByZXR1cm4gcmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIOy7rOufvCDqsJIg67OA7ZmYXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRDb2x1bW5WYWx1ZShcbiAgICBwcm9wOiBFbnRpdHlQcm9wLFxuICAgIHZhbHVlOiBGaXh0dXJlUmVjb3JkW1wiY29sdW1uc1wiXVtzdHJpbmddW1widmFsdWVcIl0sXG4gICk6IERhdGFFeHBsb3JlclZhbHVlIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwcm9wLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIC8vIFVwc2VydEJ1aWxkZXIucmVnaXN0ZXLsl5DshJwgSlNPTi5zdHJpbmdpZnkg7LKY66as7ZWY66+A66GcIG9iamVjdCDqt7jrjIDroZwg7KCE64usXG4gICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IGRhdGVTb3VyY2UgPSB6LnVuaW9uKFt6LnN0cmluZygpLCB6Lm51bWJlcigpXSkuc2FmZVBhcnNlKHZhbHVlKTtcbiAgICAgICAgICBpZiAoZGF0ZVNvdXJjZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZVNvdXJjZS5kYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzTWFueVRvTWFueVJlbGF0aW9ucyhcbiAgICB0cng6IEtuZXguVHJhbnNhY3Rpb24sXG4gICAgZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSxcbiAgICBpbnNlcnRlZElkc0J5VGFibGU6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgICAgY29uc3Qgc291cmNlUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChmaXh0dXJlLmZpeHR1cmVJZCk7XG5cbiAgICAgIGlmICghc291cmNlUmVmKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qgc291cmNlVXVpZFRvSWQgPSBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KGVudGl0eS50YWJsZSk7XG4gICAgICBjb25zdCBzb3VyY2VJZCA9IHNvdXJjZVV1aWRUb0lkPy5nZXQoc291cmNlUmVmLnV1aWQpO1xuXG4gICAgICBpZiAoc291cmNlSWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgIGZvciAoY29uc3QgWywgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICAgIGNvbnN0IHByb3AgPSBjb2x1bW4ucHJvcDtcblxuICAgICAgICBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApICYmIEFycmF5LmlzQXJyYXkoY29sdW1uLnZhbHVlKSkge1xuICAgICAgICAgIC8vIOyEoO2DneuQmOyngCDslYrsnYAgTWFueVRvTWFueSDqtIDqs4TripQg7KCA7J6l7ZWY7KeAIOyViuydjFxuICAgICAgICAgIGNvbnN0IHRhcmdldFRhYmxlID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuYnVpbGRlci5oYXNUYWJsZSh0YXJnZXRUYWJsZS50YWJsZSkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IGZpeHR1cmVSZWNvcmRJZHNTY2hlbWEucGFyc2UoY29sdW1uLnZhbHVlKTtcbiAgICAgICAgICBpZiAocmVsYXRlZElkcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3Qgam9pblRhYmxlID0gcHJvcC5qb2luVGFibGU7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG5cbiAgICAgICAgICBjb25zdCBzb3VyY2VDb2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKGVudGl0eS50YWJsZSl9X2lkYDtcbiAgICAgICAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHJlbGF0ZWRFbnRpdHkudGFibGUpfV9pZGA7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0ZWRJZCBvZiByZWxhdGVkSWRzKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkRml4dHVyZUlkID0gYCR7cHJvcC53aXRofSMke3JlbGF0ZWRJZH1gO1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQocmVsYXRlZEZpeHR1cmVJZCk7XG5cbiAgICAgICAgICAgIGxldCB0YXJnZXRJZDogbnVtYmVyIHwgc3RyaW5nO1xuXG4gICAgICAgICAgICBpZiAocmVsYXRlZFJlZikge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkVXVpZFRvSWQgPSBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KHJlbGF0ZWRFbnRpdHkudGFibGUpO1xuICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZElkID0gcmVsYXRlZFV1aWRUb0lkPy5nZXQocmVsYXRlZFJlZi51dWlkKTtcblxuICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgYFJlbGF0ZWQgZml4dHVyZSAke3JlbGF0ZWRGaXh0dXJlSWR9IG5vdCBmb3VuZCBpbiBpbnNlcnRlZElkcywgc2tpcHBpbmdgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGFyZ2V0SWQgPSByZXNvbHZlZElkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGFyZ2V0SWQgPSByZWxhdGVkSWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEpvaW5UYWJsZeyXkCDsgr3snoVcbiAgICAgICAgICAgIGNvbnN0IFtmb3VuZF0gPSBhd2FpdCB0cngoam9pblRhYmxlKVxuICAgICAgICAgICAgICAud2hlcmUoe1xuICAgICAgICAgICAgICAgIFtzb3VyY2VDb2x1bW5dOiBzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBbdGFyZ2V0Q29sdW1uXTogdGFyZ2V0SWQsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5saW1pdCgxKTtcblxuICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICBhd2FpdCB0cngoam9pblRhYmxlKS5pbnNlcnQoe1xuICAgICAgICAgICAgICAgIFtzb3VyY2VDb2x1bW5dOiBzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBbdGFyZ2V0Q29sdW1uXTogdGFyZ2V0SWQsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICAgICAgICAgIGBJbnNlcnRlZCBpbnRvICR7am9pblRhYmxlfTogJHtlbnRpdHkudGFibGV9KCR7c291cmNlSWR9KSAtICR7cmVsYXRlZEVudGl0eS50YWJsZX0oJHt0YXJnZXRJZH0pYCxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6rCZ7J2AIO2FjOydtOu4lCDrgrQgZml4dHVyZeuTpOydhCBzZWxmLXJlZmVyZW5jZSDroIjrsqjrs4TroZwg67aE7ZWgXG4gICAqIC0gc2VsZi1yZWZlcmVuY2XqsIAg7JeG64qUIGZpeHR1cmXrk6Q6IExldmVsIDBcbiAgICogLSBMZXZlbCAw7J2EIOywuOyhsO2VmOuKlCBmaXh0dXJl65OkOiBMZXZlbCAxXG4gICAqIC0g67CY67O1XG4gICAqXG4gICAqIFVwc2VydEJ1aWxkZXLqsIAgc2VsZi1yZWZlcmVuY2XqsIAg7J6I7Jy866m0IGJ1aWxkSW5zZXJ0TGV2ZWxzKCnroZwg7J6s7KCV66Cs7ZWY7JesXG4gICAqIOuTseuhnSDsiJzshJzsmYAg67CY7ZmYIOyInOyEnOqwgCDri6zrnbzsp4gg7IiYIOyeiOyKteuLiOuLpC5cbiAgICog7J2066W8IOuwqeyngO2VmOq4sCDsnITtlbQgRml4dHVyZU1hbmFnZXLqsIAg66CI67Ko67OE66GcIOuCmOuIoOyEnCDsspjrpqztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGdyb3VwRml4dHVyZXNCeUxldmVsKGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10pOiBGaXh0dXJlUmVjb3JkW11bXSB7XG4gICAgaWYgKGZpeHR1cmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmVzWzBdLmVudGl0eUlkKTtcblxuICAgIC8vIHNlbGYtcmVmZXJlbmNlIHJlbGF0aW9uIHByb3Ag7LC+6riwXG4gICAgY29uc3Qgc2VsZlJlZlByb3BzID0gZW50aXR5LnByb3BzLmZpbHRlcihcbiAgICAgIChwKTogcCBpcyBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AgfCBPbmVUb09uZVJlbGF0aW9uUHJvcCA9PlxuICAgICAgICBpc1JlbGF0aW9uUHJvcChwKSAmJlxuICAgICAgICAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocCkgJiYgcC5oYXNKb2luQ29sdW1uKSkgJiZcbiAgICAgICAgcC53aXRoID09PSBlbnRpdHkuaWQsXG4gICAgKTtcblxuICAgIGlmIChzZWxmUmVmUHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBzZWxmLXJlZmVyZW5jZSDsl4bsnYwg4oaSIOuLqOydvCDroIjrsqhcbiAgICAgIHJldHVybiBbZml4dHVyZXNdO1xuICAgIH1cblxuICAgIC8vIOugiOuyqOuzhCDrtoTtlaAgKHRvcG9sb2dpY2FsIHNvcnQpXG4gICAgY29uc3QgbGV2ZWxzOiBGaXh0dXJlUmVjb3JkW11bXSA9IFtdO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IG5ldyBTZXQoZml4dHVyZXMubWFwKChmKSA9PiBmLmZpeHR1cmVJZCkpO1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgd2hpbGUgKHJlbWFpbmluZy5zaXplID4gMCkge1xuICAgICAgY29uc3QgY3VycmVudExldmVsOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICAgIGlmICghcmVtYWluaW5nLmhhcyhmaXh0dXJlLmZpeHR1cmVJZCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIHNlbGYtcmVmZXJlbmNl6rCAIOuqqOuRkCDsnbTrr7gg7LKY66as65CQ6rGw64KYIG51bGzsnbgg6rK97JqwXG4gICAgICAgIGNvbnN0IGNhblByb2Nlc3MgPSBzZWxmUmVmUHJvcHMuZXZlcnkoKHByb3ApID0+IHtcbiAgICAgICAgICBjb25zdCByZWZJZCA9IHJlbGF0aW9uSWRTY2hlbWEucGFyc2UoZml4dHVyZS5jb2x1bW5zW3Byb3AubmFtZV0/LnZhbHVlKTtcbiAgICAgICAgICBpZiAocmVmSWQgPT09IG51bGwgfHwgcmVmSWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgY29uc3QgcmVmRml4dHVyZUlkID0gYCR7cHJvcC53aXRofSMke3JlZklkfWA7XG4gICAgICAgICAgLy8g7J2066+4IOyymOumrOuQkOqxsOuCmCwg7ZiE7J6sIGZpeHR1cmVz7JeQIO2PrO2VqOuQmOyngCDslYrsnYAg6rK97JqwICjsmbjrtoAg7LC47KGwKVxuICAgICAgICAgIHJldHVybiBwcm9jZXNzZWQuaGFzKHJlZkZpeHR1cmVJZCkgfHwgIXJlbWFpbmluZy5oYXMocmVmRml4dHVyZUlkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNhblByb2Nlc3MpIHtcbiAgICAgICAgICBjdXJyZW50TGV2ZWwucHVzaChmaXh0dXJlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudExldmVsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zdCByZW1haW5pbmdJZHMgPSBBcnJheS5mcm9tKHJlbWFpbmluZykuam9pbihcIiwgXCIpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENpcmN1bGFyIHNlbGYtcmVmZXJlbmNlIGRldGVjdGVkIGluICR7ZW50aXR5LnRhYmxlfS4gUmVtYWluaW5nIGZpeHR1cmVzOiAke3JlbWFpbmluZ0lkc31gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgY3VycmVudExldmVsKSB7XG4gICAgICAgIHJlbWFpbmluZy5kZWxldGUoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICBwcm9jZXNzZWQuYWRkKGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgIH1cblxuICAgICAgbGV2ZWxzLnB1c2goY3VycmVudExldmVsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGV2ZWxzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1VuaXF1ZVZpb2xhdGlvbihkYjogS25leCwgZW50aXR5OiBFbnRpdHksIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQpIHtcbiAgICBjb25zdCBlbnRpdHlVbmlxdWVJbmRleGVzID0gZW50aXR5LmluZGV4ZXM/LmZpbHRlcigoaSkgPT4gaS50eXBlID09PSBcInVuaXF1ZVwiKSA/PyBbXTtcblxuICAgIGNvbnN0IHVuaXF1ZUluZGV4ZXMgPSBlbnRpdHlVbmlxdWVJbmRleGVzLmZpbHRlcigoaW5kZXgpID0+XG4gICAgICBpbmRleC5jb2x1bW5zLmV2ZXJ5KChjb2x1bW4pID0+ICFjb2x1bW4ubmFtZS5zdGFydHNXaXRoKGAke2VudGl0eS50YWJsZX1fX2ApKSxcbiAgICApO1xuICAgIGlmICh1bmlxdWVJbmRleGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IHVuaXF1ZVF1ZXJ5ID0gZGIoZW50aXR5LnRhYmxlKTtcbiAgICBsZXQgaGFzQ29uZGl0aW9uID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIHVuaXF1ZUluZGV4ZXMpIHtcbiAgICAgIC8vIOy7rOufvCDspJEg7ZWY64KY652864+EIG51bGzsnbTrqbQg7Jyg64uI7YGsIOygnOyVveydhCDsnITrsJjtlZjsp4Ag7JWK6riwIOuVjOusuOyXkCDtlbTri7kg7J24642x7Iqk64qUIOustOyLnFxuICAgICAgY29uc3QgY29udGFpbnNOdWxsID0gaW5kZXguY29sdW1ucy5zb21lKChjb2x1bW4pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb2x1bW4ubmFtZS5yZXBsYWNlKC9faWQkLywgXCJcIik7XG4gICAgICAgIHJldHVybiBmaXh0dXJlLmNvbHVtbnNbZmllbGRdPy52YWx1ZSA9PT0gbnVsbDtcbiAgICAgIH0pO1xuICAgICAgaWYgKGNvbnRhaW5zTnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdW5pcXVlUXVlcnkgPSB1bmlxdWVRdWVyeS5vcldoZXJlKChxYikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBpbmRleC5jb2x1bW5zKSB7XG4gICAgICAgICAgY29uc3QgZmllbGQgPSBjb2x1bW4ubmFtZS5yZXBsYWNlKC9faWQkLywgXCJcIik7XG5cbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaXh0dXJlLmNvbHVtbnNbZmllbGRdPy52YWx1ZSkpIHtcbiAgICAgICAgICAgIHFiLndoZXJlSW4oY29sdW1uLm5hbWUsIGZpeHR1cmUuY29sdW1uc1tmaWVsZF0udmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBxYi5hbmRXaGVyZShjb2x1bW4ubmFtZSwgZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBoYXNDb25kaXRpb24gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghaGFzQ29uZGl0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBbdW5pcXVlRm91bmRdID0gYXdhaXQgdW5pcXVlUXVlcnk7XG4gICAgcmV0dXJuIHVuaXF1ZUZvdW5kO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICBkYjogS25leCxcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBmaXh0dXJlOiBGaXh0dXJlUmVjb3JkLFxuICAgIGNvbHVtbnM6IHN0cmluZ1tdLFxuICApIHtcbiAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHdoZXJlQ2xhdXNlOiBEYXRhRXhwbG9yZXJSZWNvcmQgPSB7fTtcblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgIC8vIHJlbGF0aW9uIO2VhOuTnOyduCDqsr3smrAgX2lkIOu2meydtOq4sFxuICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbHVtbik7XG4gICAgICBjb25zdCBkYkNvbHVtbiA9IHByb3AgJiYgaXNSZWxhdGlvblByb3AocHJvcCkgPyBgJHtjb2x1bW59X2lkYCA6IGNvbHVtbjtcbiAgICAgIGNvbnN0IHZhbHVlID0gZml4dHVyZS5jb2x1bW5zW2NvbHVtbl0/LnZhbHVlO1xuXG4gICAgICAvLyBudWxsIOqwkuydtCDtj6ztlajrkJwg6rK97JqwIOykkeuztSDtmZXsnbgg7Iqk7YK1XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgd2hlcmVDbGF1c2VbZGJDb2x1bW5dID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZvdW5kXSA9IGF3YWl0IGRiKGVudGl0eS50YWJsZSkud2hlcmUod2hlcmVDbGF1c2UpLmxpbWl0KDEpO1xuICAgIHJldHVybiBmb3VuZDtcbiAgfVxuXG4gIGFzeW5jIGFkZEZpeHR1cmVMb2FkZXIoY29kZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcGF0aCA9IGAke1NvbmFtdS5hcGlSb290UGF0aH0vc3JjL3Rlc3RpbmcvZml4dHVyZS50c2A7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhwYXRoKS50b1N0cmluZygpO1xuXG4gICAgY29uc3QgZml4dHVyZUxvYWRlclN0YXJ0ID0gY29udGVudC5pbmRleE9mKFwiY29uc3QgZml4dHVyZUxvYWRlciA9IHtcIik7XG4gICAgY29uc3QgZml4dHVyZUxvYWRlckVuZCA9IGNvbnRlbnQuaW5kZXhPZihcIn07XCIsIGZpeHR1cmVMb2FkZXJTdGFydCk7XG5cbiAgICBpZiAoZml4dHVyZUxvYWRlclN0YXJ0ICE9PSAtMSAmJiBmaXh0dXJlTG9hZGVyRW5kICE9PSAtMSkge1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGAke2NvbnRlbnQuc2xpY2UoMCwgZml4dHVyZUxvYWRlckVuZCl9ICAke2NvZGV9XFxuJHtjb250ZW50LnNsaWNlKGZpeHR1cmVMb2FkZXJFbmQpfWA7XG5cbiAgICAgIHdyaXRlRmlsZVN5bmMocGF0aCwgbmV3Q29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBmaW5kIGZpeHR1cmVMb2FkZXIgaW4gZml4dHVyZS50c1wiKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEZpeHR1cmVNYW5hZ2VyID0gbmV3IEZpeHR1cmVNYW5hZ2VyQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7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
|
|
724
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1tYW5hZ2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJub2RlOmFzc2VydFwiO1xuaW1wb3J0IHsgc3Bhd24sIHR5cGUgQ2hpbGRQcm9jZXNzLCB0eXBlIFNwYXduT3B0aW9ucyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJub2RlOnV0aWxcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gXCIuLi9kYXRhYmFzZS9iYXNlLW1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgVXBzZXJ0QnVpbGRlciB9IGZyb20gXCIuLi9kYXRhYmFzZS91cHNlcnQtYnVpbGRlclwiO1xuaW1wb3J0IHsgdHlwZSBVQlJlZiB9IGZyb20gXCIuLi9kYXRhYmFzZS91cHNlcnQtYnVpbGRlclwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0hhc01hbnlSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzVmlydHVhbFByb3AsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIHR5cGUgRGF0YWJhc2VTY2hlbWFFeHRlbmQsXG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgdHlwZSBGaXh0dXJlSW1wb3J0UmVzdWx0LFxuICB0eXBlIEZpeHR1cmVSZWNvcmQsXG4gIHR5cGUgRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gIHR5cGUgT25lVG9PbmVSZWxhdGlvblByb3AsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IFJlbGF0aW9uR3JhcGggfSBmcm9tIFwiLi9fcmVsYXRpb24tZ3JhcGhcIjtcbmltcG9ydCB7IGRhdGFFeHBsb3JlclJlY29yZFNjaGVtYSB9IGZyb20gXCIuL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IHR5cGUgRGF0YUV4cGxvcmVyUmVjb3JkLCB0eXBlIERhdGFFeHBsb3JlclZhbHVlIH0gZnJvbSBcIi4vZGF0YS1leHBsb3JlclwiO1xuXG5jb25zdCBwZ0Nvbm5lY3Rpb25TY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGhvc3Q6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgdXNlcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIHBhc3N3b3JkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgZGF0YWJhc2U6IHouc3RyaW5nKCksXG4gIH0pXG4gIC5wYXNzdGhyb3VnaCgpO1xuY29uc3QgZGF0YWJhc2VDb25uZWN0aW9uU2NoZW1hID0gei5vYmplY3QoeyBkYXRhYmFzZTogei5zdHJpbmcoKSB9KS5wYXNzdGhyb3VnaCgpO1xuY29uc3QgZml4dHVyZVJlY29yZElkc1NjaGVtYSA9IHouYXJyYXkoei51bmlvbihbei5udW1iZXIoKSwgei5zdHJpbmcoKV0pKTtcbmNvbnN0IHJlbGF0aW9uSWRTY2hlbWEgPSB6LnVuaW9uKFt6Lm51bWJlcigpLCB6LnN0cmluZygpLCB6Lm51bGwoKV0pO1xuXG5leHBvcnQgdHlwZSBGaXh0dXJlU291cmNlUmVjb3JkID0gRGF0YUV4cGxvcmVyUmVjb3JkICYge1xuICBpZDogbnVtYmVyIHwgc3RyaW5nO1xufTtcblxudHlwZSBVcHNlcnRSb3dWYWx1ZSA9IERhdGFFeHBsb3JlclZhbHVlIHwgVUJSZWY7XG50eXBlIFVwc2VydFJvdyA9IHtcbiAgW2NvbHVtbk5hbWU6IHN0cmluZ106IFVwc2VydFJvd1ZhbHVlO1xufTtcblxuZnVuY3Rpb24gd2FpdEZvckZpeHR1cmVDb21tYW5kKGNoaWxkOiBDaGlsZFByb2Nlc3MsIGV4ZWN1dGFibGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNoaWxkLm9uY2UoXCJlcnJvclwiLCByZWplY3QpO1xuICAgIGNoaWxkLm9uY2UoXCJleGl0XCIsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgIGlmIChjb2RlID09PSAwKSByZXNvbHZlKCk7XG4gICAgICBlbHNlXG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoYCR7ZXhlY3V0YWJsZX0g66qF66C57J20ICR7Y29kZSA/PyBzaWduYWwgPz8gXCJ1bmtub3duXCJ9IOyDge2DnOuhnCDsi6TtjKjtlojsirXri4jri6QuYCksXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBleGVjdXRlRml4dHVyZUNvbW1hbmQoXG4gIGV4ZWN1dGFibGU6IHN0cmluZyxcbiAgYXJnczogc3RyaW5nW10sXG4gIG9wdGlvbnM6IFBpY2s8U3Bhd25PcHRpb25zLCBcImVudlwiIHwgXCJzdGRpb1wiPixcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gd2FpdEZvckZpeHR1cmVDb21tYW5kKHNwYXduKGV4ZWN1dGFibGUsIGFyZ3MsIG9wdGlvbnMpLCBleGVjdXRhYmxlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGlwZUZpeHR1cmVDb21tYW5kcyhcbiAgc291cmNlOiB7IGV4ZWN1dGFibGU6IHN0cmluZzsgYXJnczogc3RyaW5nW107IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgfSxcbiAgZGVzdGluYXRpb246IHsgZXhlY3V0YWJsZTogc3RyaW5nOyBhcmdzOiBzdHJpbmdbXTsgZW52OiBOb2RlSlMuUHJvY2Vzc0VudiB9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvdXJjZVByb2Nlc3MgPSBzcGF3bihzb3VyY2UuZXhlY3V0YWJsZSwgc291cmNlLmFyZ3MsIHtcbiAgICBlbnY6IHNvdXJjZS5lbnYsXG4gICAgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJpbmhlcml0XCJdLFxuICB9KTtcbiAgY29uc3QgZGVzdGluYXRpb25Qcm9jZXNzID0gc3Bhd24oZGVzdGluYXRpb24uZXhlY3V0YWJsZSwgZGVzdGluYXRpb24uYXJncywge1xuICAgIGVudjogZGVzdGluYXRpb24uZW52LFxuICAgIHN0ZGlvOiBbXCJwaXBlXCIsIFwiaW5oZXJpdFwiLCBcImluaGVyaXRcIl0sXG4gIH0pO1xuICBhc3NlcnQoc291cmNlUHJvY2Vzcy5zdGRvdXQpO1xuICBhc3NlcnQoZGVzdGluYXRpb25Qcm9jZXNzLnN0ZGluKTtcbiAgc291cmNlUHJvY2Vzcy5zdGRvdXQucGlwZShkZXN0aW5hdGlvblByb2Nlc3Muc3RkaW4pO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgd2FpdEZvckZpeHR1cmVDb21tYW5kKHNvdXJjZVByb2Nlc3MsIHNvdXJjZS5leGVjdXRhYmxlKSxcbiAgICAgIHdhaXRGb3JGaXh0dXJlQ29tbWFuZChkZXN0aW5hdGlvblByb2Nlc3MsIGRlc3RpbmF0aW9uLmV4ZWN1dGFibGUpLFxuICAgIF0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHNvdXJjZVByb2Nlc3Mua2lsbCgpO1xuICAgIGRlc3RpbmF0aW9uUHJvY2Vzcy5raWxsKCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRml4dHVyZSBkYXRhYmFzZSBzeW5jaHJvbml6YXRpb24gY29tbWFuZCBmYWlsZWRcIiwgeyBjYXVzZTogZXJyb3IgfSk7XG4gIH1cbn1cblxuLyoqIOyCrOyaqeyekCDsp4DsoJUg7KSR67O1IO2ZleyduCDsu6zrn7wgKGVudGl0eUlk67OE66GcIOyngOyglSkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgRHVwbGljYXRlQ2hlY2tPcHRpb25zIHtcbiAgY29sdW1ucz86IHtcbiAgICBbZW50aXR5SWQ6IHN0cmluZ106IHN0cmluZ1tdO1xuICB9O1xuICBpbmNsdWRlUmVsYXRpb25zPzogYm9vbGVhbjtcbiAgbWF4RGVwdGg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBGaXh0dXJlTWFuYWdlckNsYXNzIHtcbiAgcHJpdmF0ZSB0ZXN0aW5nRGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IHRkYih0ZGI6IEtuZXgpIHtcbiAgICB0aGlzLnRlc3RpbmdEYiA9IHRkYjtcbiAgfVxuICBnZXQgdGRiKCk6IEtuZXgge1xuICAgIGlmICh0aGlzLnRlc3RpbmdEYiA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRml4dHVyZU1hbmFnZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50ZXN0aW5nRGI7XG4gIH1cblxuICBwcml2YXRlIGZpeHR1cmVEYjogS25leCB8IG51bGwgPSBudWxsO1xuICBzZXQgZmRiKGZkYjogS25leCkge1xuICAgIHRoaXMuZml4dHVyZURiID0gZmRiO1xuICB9XG4gIGdldCBmZGIoKTogS25leCB7XG4gICAgaWYgKHRoaXMuZml4dHVyZURiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpeHR1cmVEYjtcbiAgfVxuICBjYWNoZWRUYWJsZU5hbWVzOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVsYXRpb25HcmFwaCA9IG5ldyBSZWxhdGlvbkdyYXBoKCk7XG5cbiAgLy8gVXBzZXJ0QnVpbGRlciDquLDrsJggaW1wb3J066W8IOychO2VnCDsg4Htg5xcbiAgcHJpdmF0ZSBidWlsZGVyOiBVcHNlcnRCdWlsZGVyID0gbmV3IFVwc2VydEJ1aWxkZXIoKTtcbiAgcHJpdmF0ZSBmaXh0dXJlUmVmTWFwOiBNYXA8c3RyaW5nLCBVQlJlZj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc2tpcHBlZEZpeHR1cmVzOiBNYXA8c3RyaW5nLCB7IGVudGl0eUlkOiBzdHJpbmc7IGV4aXN0aW5nSWQ6IG51bWJlciB8IHN0cmluZyB9PiA9XG4gICAgbmV3IE1hcCgpO1xuXG4gIGluaXQoKSB7XG4gICAgaWYgKHRoaXMudGVzdGluZ0RiICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChTb25hbXUuZGJDb25maWcudGVzdCAmJiBTb25hbXUuZGJDb25maWcucHJvZHVjdGlvbikge1xuICAgICAgY29uc3QgdENvbm4gPSBwZ0Nvbm5lY3Rpb25TY2hlbWEucGFyc2UoU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbik7XG4gICAgICBjb25zdCBwQ29ubiA9IHBnQ29ubmVjdGlvblNjaGVtYS5wYXJzZShTb25hbXUuZGJDb25maWcucHJvZHVjdGlvbi5jb25uZWN0aW9uKTtcbiAgICAgIGlmIChcbiAgICAgICAgYCR7dENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3RDb25uLnBvcnQgPz8gNTQzMn0vJHt0Q29ubi5kYXRhYmFzZX1gID09PVxuICAgICAgICBgJHtwQ29ubi5ob3N0ID8/IFwibG9jYWxob3N0XCJ9OiR7cENvbm4ucG9ydCA/PyA1NDMyfS8ke3BDb25uLmRhdGFiYXNlfWBcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYO2FjOyKpO2KuERC7JmAIO2UhOuhnOuNleyFmERC7JeQIOuPmeydvO2VnCDrjbDsnbTthLDrsqDsnbTsiqTqsIAg7IKs7Jqp65CY7JeI7Iq164uI64ukLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudGRiID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZy50ZXN0KTtcbiAgICB0aGlzLmZkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcuZml4dHVyZSk7XG4gIH1cblxuICAvKipcbiAgICDsm5DqsqkgZml4dHVyZSBEQuulvCDroZzsu6wgdGVzdCBEQuuhnCDrs7Xsgqztlanri4jri6QuXG4gICAgcGdfZHVtcOuhnCDsm5DqsqkgRELrpbwg642k7ZSE7ZWY6rOgLCBwZ19yZXN0b3Jl66GcIOuhnOy7rOyXkCDrs7Xsm5Dtlanri4jri6QuXG4gICovXG4gIGFzeW5jIHN5bmMoKSB7XG4gICAgY29uc3QgZml4dHVyZUNvbm4gPSBwZ0Nvbm5lY3Rpb25TY2hlbWEucGFyc2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbik7XG4gICAgY29uc3QgdGVzdENvbm4gPSBwZ0Nvbm5lY3Rpb25TY2hlbWEucGFyc2UoU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbik7XG5cbiAgICAvLyAxLiDroZzsu6wgdGVzdCBEQiDsl7DqsrAg7KKF66OMIOuwjyDsnqzsg53shLFcbiAgICBjb25zdCB0ZXN0UGdFbnYgPSB7IFBHUEFTU1dPUkQ6IHRlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcbiAgICBjb25zdCB0ZXN0UHNxbEFyZ3MgPSBbXG4gICAgICBcIi1oXCIsXG4gICAgICB0ZXN0Q29ubi5ob3N0ID8/IFwibG9jYWxob3N0XCIsXG4gICAgICBcIi1wXCIsXG4gICAgICBTdHJpbmcodGVzdENvbm4ucG9ydCA/PyA1NDMyKSxcbiAgICAgIFwiLVVcIixcbiAgICAgIHRlc3RDb25uLnVzZXIgPz8gXCJcIixcbiAgICAgIFwiLWRcIixcbiAgICAgIFwicG9zdGdyZXNcIixcbiAgICAgIFwiLWNcIixcbiAgICBdO1xuICAgIGF3YWl0IGV4ZWN1dGVGaXh0dXJlQ29tbWFuZChcbiAgICAgIFwicHNxbFwiLFxuICAgICAgW1xuICAgICAgICAuLi50ZXN0UHNxbEFyZ3MsXG4gICAgICAgIGBcbiAgICAgICAgU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKHBnX3N0YXRfYWN0aXZpdHkucGlkKVxuICAgICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgICAgV0hFUkUgZGF0bmFtZSA9ICcke3Rlc3RDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgICBgLFxuICAgICAgXSxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IH0sXG4gICAgKTtcbiAgICBhd2FpdCBleGVjdXRlRml4dHVyZUNvbW1hbmQoXG4gICAgICBcInBzcWxcIixcbiAgICAgIFsuLi50ZXN0UHNxbEFyZ3MsIGBEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcIiR7dGVzdENvbm4uZGF0YWJhc2V9XCJgXSxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IH0sXG4gICAgKTtcbiAgICBhd2FpdCBleGVjdXRlRml4dHVyZUNvbW1hbmQoXG4gICAgICBcInBzcWxcIixcbiAgICAgIFsuLi50ZXN0UHNxbEFyZ3MsIGBDUkVBVEUgREFUQUJBU0UgXCIke3Rlc3RDb25uLmRhdGFiYXNlfVwiYF0sXG4gICAgICB7IHN0ZGlvOiBcImluaGVyaXRcIiwgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSB9LFxuICAgICk7XG5cbiAgICAvLyAyLiDsm5DqsqkgZml4dHVyZSBEQiDihpIg66Gc7LusIHRlc3QgRELroZwg67O17IKsIChwZ19kdW1wIHwgcGdfcmVzdG9yZSlcbiAgICBjb25zdCBmaXh0dXJlUGdFbnYgPSB7IFBHUEFTU1dPUkQ6IGZpeHR1cmVDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcbiAgICBhd2FpdCBwaXBlRml4dHVyZUNvbW1hbmRzKFxuICAgICAge1xuICAgICAgICBleGVjdXRhYmxlOiBcInBnX2R1bXBcIixcbiAgICAgICAgYXJnczogW1xuICAgICAgICAgIFwiLWhcIixcbiAgICAgICAgICBmaXh0dXJlQ29ubi5ob3N0ID8/IFwibG9jYWxob3N0XCIsXG4gICAgICAgICAgXCItcFwiLFxuICAgICAgICAgIFN0cmluZyhmaXh0dXJlQ29ubi5wb3J0ID8/IDU0MzIpLFxuICAgICAgICAgIFwiLVVcIixcbiAgICAgICAgICBmaXh0dXJlQ29ubi51c2VyID8/IFwiXCIsXG4gICAgICAgICAgXCItZFwiLFxuICAgICAgICAgIGZpeHR1cmVDb25uLmRhdGFiYXNlLFxuICAgICAgICAgIFwiLUZjXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZml4dHVyZVBnRW52IH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBleGVjdXRhYmxlOiBcInBnX3Jlc3RvcmVcIixcbiAgICAgICAgYXJnczogW1xuICAgICAgICAgIFwiLWhcIixcbiAgICAgICAgICB0ZXN0Q29ubi5ob3N0ID8/IFwibG9jYWxob3N0XCIsXG4gICAgICAgICAgXCItcFwiLFxuICAgICAgICAgIFN0cmluZyh0ZXN0Q29ubi5wb3J0ID8/IDU0MzIpLFxuICAgICAgICAgIFwiLVVcIixcbiAgICAgICAgICB0ZXN0Q29ubi51c2VyID8/IFwiXCIsXG4gICAgICAgICAgXCItZFwiLFxuICAgICAgICAgIHRlc3RDb25uLmRhdGFiYXNlLFxuICAgICAgICAgIFwiLS1uby1vd25lclwiLFxuICAgICAgICAgIFwiLS1uby1hY2xcIixcbiAgICAgICAgXSxcbiAgICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICAvLyAzLiDsi5ztgIDsiqQg66as7IWLICjrjbDsnbTthLAg67O17IKsIO2bhCDsi5ztgIDsiqTrpbwgTUFYKGlkKeuhnCDsoJXroKwpXG4gICAgYXdhaXQgdGhpcy5yZXNldFNlcXVlbmNlcyhTb25hbXUuZGJDb25maWcudGVzdCk7XG4gIH1cblxuICAvKipcbiAgICog66qo65OgIO2FjOydtOu4lOydmCDsi5ztgIDsiqTrpbwg7ZiE7J6sIE1BWChpZCnroZwg66as7IWL7ZWp64uI64ukLlxuICAgKiBmaXh0dXJlIHN5bmMg7ZuEIOyLnO2AgOyKpOqwgCDsi6TsoJwg642w7J207YSw7JmAIOunnuyngCDslYrripQg66y47KCc66W8IO2VtOqysO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzZXRTZXF1ZW5jZXMoZGJDb25maWc6IFNvbmFtdURCQ29uZmlnW1widGVzdFwiXSkge1xuICAgIGNvbnN0IHRlc3REYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShkYkNvbmZpZyk7XG4gICAgY29uc3QgZW50aXRpZXMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbEVudGl0aWVzKCk7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBlbnRpdHkgb2YgZW50aXRpZXMpIHtcbiAgICAgICAgY29uc3QgdGFibGVOYW1lID0gZW50aXR5LnRhYmxlIHx8IGVudGl0eS5pZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIGlkIO2VhOuTnOydmCDtg4DsnoXsnYQg7ZmV7J247ZWp64uI64ukXG4gICAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICAgIGNvbnN0IGlkVHlwZSA9IGlkUHJvcD8udHlwZTtcblxuICAgICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXLsnbTqsbDrgpgsIHN0cmluZ+ydtOyngOunjCBmaXh0dXJlU3RyYXRlZ3k9c2VxdWVuY2Xsnbgg6rK97Jqw7JeQ66eMIOumrOyFi+2VqeuLiOuLpFxuICAgICAgICBjb25zdCB1c2VzU2VxdWVuY2UgPVxuICAgICAgICAgIGlkVHlwZSA9PT0gXCJpbnRlZ2VyXCIgfHxcbiAgICAgICAgICBpZFR5cGUgPT09IFwiYmlnSW50ZWdlclwiIHx8XG4gICAgICAgICAgaWRQcm9wPy5jb25lPy5maXh0dXJlU3RyYXRlZ3kgPT09IFwic2VxdWVuY2VcIjtcblxuICAgICAgICBpZiAoIXVzZXNTZXF1ZW5jZSkge1xuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGBTa2lwcGluZyBzZXF1ZW5jZSByZXNldCBmb3IgJHt0YWJsZU5hbWV9IChpZCB0eXBlOiAke2lkVHlwZSB8fCBcInVua25vd25cIn0pYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQb3N0Z3JlU1FMIOyLnO2AgOyKpOulvCDtmITsnqwg7YWM7J2067iU7J2YIE1BWChpZCnroZwg66as7IWL7ZWp64uI64ukLlxuICAgICAgICAvLyBzdHJpbmcg7YOA7J6F7J2YIOqyveyasCDsiKvsnpAg7LqQ7Iqk7YyF7J20IO2VhOyalO2VqeuLiOuLpC5cbiAgICAgICAgY29uc3QgbWF4RXhwciA9IGlkVHlwZSA9PT0gXCJzdHJpbmdcIiA/IFwiTUFYKGlkOjpiaWdpbnQpXCIgOiBcIk1BWChpZClcIjtcbiAgICAgICAgYXdhaXQgdGVzdERiLnJhdyhgXG4gICAgICAgICAgU0VMRUNUIHNldHZhbChcbiAgICAgICAgICAgIHBnX2dldF9zZXJpYWxfc2VxdWVuY2UoJ3B1YmxpYy4ke3RhYmxlTmFtZX0nLCAnaWQnKSxcbiAgICAgICAgICAgIENPQUxFU0NFKChTRUxFQ1QgJHttYXhFeHByfSBGUk9NICR7dGFibGVOYW1lfSksIDEpXG4gICAgICAgICAgKVxuICAgICAgICBgKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGVzdERiLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZpc2l0ZWRSZWNvcmRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGFzeW5jIGltcG9ydEZpeHR1cmUoZW50aXR5SWQ6IHN0cmluZywgaWRzOiBudW1iZXJbXSkge1xuICAgIC8vIOuwqeusuCDquLDroZ0g7LSI6riw7ZmUICjsg4jroZzsmrQgaW1wb3J0IOyekeyXhSDsi5zsnpEpXG4gICAgdGhpcy52aXNpdGVkUmVjb3Jkcy5jbGVhcigpO1xuXG4gICAgY29uc3QgcXVlcmllcyA9IHVuaXF1ZShcbiAgICAgIChcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgaWRzLm1hcChhc3luYyAoaWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEltcG9ydFF1ZXJpZXMoZW50aXR5SWQsIFwiaWRcIiwgaWQpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICApLmZsYXQoKSxcbiAgICApO1xuXG4gICAgY29uc3Qgd2RiID0gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcbiAgICBmb3IgKGNvbnN0IHF1ZXJ5IG9mIHF1ZXJpZXMpIHtcbiAgICAgIGF3YWl0IHdkYi5yYXcocXVlcnkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldEltcG9ydFF1ZXJpZXMoZW50aXR5SWQ6IHN0cmluZywgZmllbGQ6IHN0cmluZywgaWQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByZWNvcmRLZXkgPSBgJHtlbnRpdHlJZH0jJHtmaWVsZH0jJHtpZH1gO1xuXG4gICAgLy8g7Iic7ZmYIOywuOyhsCDrsKnsp4A6IOydtOuvuCDrsKnrrLjtlZwg66CI7L2U65Oc64qUIOyKpO2CtVxuICAgIGlmICh0aGlzLnZpc2l0ZWRSZWNvcmRzLmhhcyhyZWNvcmRLZXkpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHRoaXMudmlzaXRlZFJlY29yZHMuYWRkKHJlY29yZEtleSk7XG5cbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgY29uc3Qgd2RiID0gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcblxuICAgIC8vIOyXrOq4sOyEnCDsi6REQuydmCByb3cg6rCA7KC47Ji0XG4gICAgY29uc3QgW3Jvd10gPSBhd2FpdCB3ZGIoZW50aXR5LnRhYmxlKS53aGVyZShmaWVsZCwgaWQpLmxpbWl0KDEpO1xuICAgIGlmIChyb3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VudGl0eUlkfSMke2lkfSByb3frpbwg7LC+7J2EIOyImCDsl4bsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgLy8g7ZS97Iqk7LOQREIsIOyLpERCXG4gICAgY29uc3QgZml4dHVyZURhdGFiYXNlID0gZGF0YWJhc2VDb25uZWN0aW9uU2NoZW1hLnBhcnNlKFxuICAgICAgU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbixcbiAgICApLmRhdGFiYXNlO1xuICAgIGNvbnN0IHJlYWxEYXRhYmFzZSA9IGRhdGFiYXNlQ29ubmVjdGlvblNjaGVtYS5wYXJzZShcbiAgICAgIFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uLmNvbm5lY3Rpb24sXG4gICAgKS5kYXRhYmFzZTtcblxuICAgIGNvbnN0IHNlbGZRdWVyeSA9IGBJTlNFUlQgSUdOT1JFIElOVE8gXFxgJHtmaXh0dXJlRGF0YWJhc2V9XFxgLlxcYCR7ZW50aXR5LnRhYmxlfVxcYCAoU0VMRUNUICogRlJPTSBcXGAke3JlYWxEYXRhYmFzZX1cXGAuXFxgJHtlbnRpdHkudGFibGV9XFxgIFdIRVJFIFxcYGlkXFxgID0gJHtpZH0pYDtcblxuICAgIGNvbnN0IGFyZ3MgPSBPYmplY3QuZW50cmllcyhlbnRpdHkucmVsYXRpb25zKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKFssIHJlbGF0aW9uXSkgPT5cbiAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgfHxcbiAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgJiYgcmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSA9PT0gdW5kZWZpbmVkKSxcbiAgICAgIClcbiAgICAgIC5tYXAoKFssIHJlbGF0aW9uXSkgPT4ge1xuICAgICAgICAvKlxuICAgICAgICBCZWxvbmdzVG9PbmXsnbgg6rK97JqwXG4gICAgICAgICAgQ2F0ZWdvcnkgLyAnaWQnIC8gcm93W2NhdGVnb3J5X2lkXSDtmLjstpxcbiAgICAgICAgT25lVG9PbmXsl5Agam9pbkNvbHVtbiA9PT0gdHJ1ZSDsnbgg6rK97JqwXG4gICAgICAgICAgUHJvZmlsZSAvICdpZCcgLyByb3dbcHJvZmlsZV9pZF0g7Zi47LacXG4gICAgICAgIE9uZVRvT25l7JeQIGpvaW5Db2x1bW4gPT09IGZhbHNlIOyduCDqsr3smrBcbiAgICAgICAgICBQcm9maWxlIC8gJ3Byb2ZpbGVfaWQnIC8gcm93WydpZCddIO2YuOy2nFxuICAgICAgICAqL1xuICAgICAgICBsZXQgcmVsYXRpb25GaWVsZDogc3RyaW5nO1xuICAgICAgICBsZXQgcmVsYXRpb25JZDogbnVtYmVyO1xuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgJiYgIXJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsYXRpb24ud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkQ29sdW1uTmFtZSA9IHJlbGF0ZWRFbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBpc1JlbGF0aW9uUHJvcChwKSAmJiBwLndpdGggPT09IGVudGl0eS5pZCxcbiAgICAgICAgICApPy5uYW1lO1xuICAgICAgICAgIGlmICghcmVsYXRlZElkQ29sdW1uTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0ZWRFbnRpdHkuaWR97J2YICR7ZW50aXR5LmlkfSDqtIDqs4Qg7ZSE66Gt7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWxhdGlvbkZpZWxkID0gYCR7cmVsYXRlZElkQ29sdW1uTmFtZX1faWRgO1xuICAgICAgICAgIHJlbGF0aW9uSWQgPSByb3cuaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVsYXRpb25GaWVsZCA9IFwiaWRcIjtcbiAgICAgICAgICByZWxhdGlvbklkID0gcm93W2Ake3JlbGF0aW9uLm5hbWV9X2lkYF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlbnRpdHlJZDogcmVsYXRpb24ud2l0aCxcbiAgICAgICAgICBmaWVsZDogcmVsYXRpb25GaWVsZCxcbiAgICAgICAgICBpZDogcmVsYXRpb25JZCxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChhcmcpID0+IGFyZy5pZCAhPT0gbnVsbCk7XG5cbiAgICBjb25zdCByZWxRdWVyaWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBhcmdzLm1hcChhc3luYyAocmVsYXRpb25BcmdzKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEltcG9ydFF1ZXJpZXMocmVsYXRpb25BcmdzLmVudGl0eUlkLCByZWxhdGlvbkFyZ3MuZmllbGQsIHJlbGF0aW9uQXJncy5pZCk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIFsuLi51bmlxdWUocmVsUXVlcmllcy50b1JldmVyc2VkKCkuZmxhdCgpKSwgc2VsZlF1ZXJ5XTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMudGVzdGluZ0RiKSB7XG4gICAgICBhd2FpdCB0aGlzLnRlc3RpbmdEYi5kZXN0cm95KCk7XG4gICAgICB0aGlzLnRlc3RpbmdEYiA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmZpeHR1cmVEYikge1xuICAgICAgYXdhaXQgdGhpcy5maXh0dXJlRGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5maXh0dXJlRGIgPSBudWxsO1xuICAgIH1cbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICB9XG5cbiAgYXN5bmMgZ2V0Rml4dHVyZXMoXG4gICAgc291cmNlREJOYW1lOiBrZXlvZiBTb25hbXVEQkNvbmZpZyxcbiAgICB0YXJnZXREQk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIHNlYXJjaE9wdGlvbnM6IEZpeHR1cmVTZWFyY2hPcHRpb25zLFxuICAgIGR1cGxpY2F0ZUNoZWNrPzogRHVwbGljYXRlQ2hlY2tPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBzb3VyY2VEQiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbc291cmNlREJOYW1lXSk7XG4gICAgY29uc3QgdGFyZ2V0REIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnW3RhcmdldERCTmFtZV0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGZpZWxkLCB2YWx1ZSwgc2VhcmNoVHlwZSB9ID0gc2VhcmNoT3B0aW9ucztcblxuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgY29uc3QgY29sdW1uID1cbiAgICAgICAgZW50aXR5LnByb3BzLmZpbmQoKHByb3ApID0+IHByb3AubmFtZSA9PT0gZmllbGQpPy50eXBlID09PSBcInJlbGF0aW9uXCJcbiAgICAgICAgICA/IGAke2ZpZWxkfV9pZGBcbiAgICAgICAgICA6IGZpZWxkO1xuXG4gICAgICBsZXQgcXVlcnkgPSBzb3VyY2VEQihlbnRpdHkudGFibGUpO1xuICAgICAgaWYgKHNlYXJjaFR5cGUgPT09IFwiZXF1YWxzXCIpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZShjb2x1bW4sIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VhcmNoVHlwZSA9PT0gXCJsaWtlXCIpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZShjb2x1bW4sIFwibGlrZVwiLCBgJSR7dmFsdWV9JWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgcXVlcnk7XG4gICAgICBpZiAocm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVjb3JkcyBmb3VuZFwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgICBjb25zdCBpbml0aWFsUmVjb3Jkc0xlbmd0aCA9IGZpeHR1cmVzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbmV3UmVjb3JkcyA9IGF3YWl0IHRoaXMuY3JlYXRlRml4dHVyZVJlY29yZChlbnRpdHksIHJvdywge1xuICAgICAgICAgIGRiOiBzb3VyY2VEQixcbiAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zOiBkdXBsaWNhdGVDaGVjaz8uaW5jbHVkZVJlbGF0aW9ucyxcbiAgICAgICAgICBtYXhEZXB0aDogZHVwbGljYXRlQ2hlY2s/Lm1heERlcHRoLFxuICAgICAgICB9KTtcbiAgICAgICAgZml4dHVyZXMucHVzaCguLi5uZXdSZWNvcmRzKTtcbiAgICAgICAgY29uc3QgY3VycmVudEZpeHR1cmVSZWNvcmQgPSBmaXh0dXJlcy5maW5kKChyKSA9PiByLmZpeHR1cmVJZCA9PT0gYCR7ZW50aXR5SWR9IyR7cm93LmlkfWApO1xuXG4gICAgICAgIGlmIChjdXJyZW50Rml4dHVyZVJlY29yZCkge1xuICAgICAgICAgIC8vIO2YhOyerCBmaXh0dXJl66Gc67aA7YSwIOyDneyEseuQnCBmZXRjaGVkUmVjb3JkcyDshKTsoJVcbiAgICAgICAgICBjdXJyZW50Rml4dHVyZVJlY29yZC5mZXRjaGVkUmVjb3JkcyA9IGZpeHR1cmVzXG4gICAgICAgICAgICAuZmlsdGVyKChyKSA9PiByLmZpeHR1cmVJZCAhPT0gY3VycmVudEZpeHR1cmVSZWNvcmQuZml4dHVyZUlkKVxuICAgICAgICAgICAgLnNsaWNlKGluaXRpYWxSZWNvcmRzTGVuZ3RoKVxuICAgICAgICAgICAgLm1hcCgocikgPT4gci5maXh0dXJlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICBjb25zdCBmaXh0dXJlRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOyngOyglSDsu6zrn7wg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIHRhcmdldFxuICAgICAgICBjb25zdCBjdXN0b21Db2x1bW5zID0gZHVwbGljYXRlQ2hlY2s/LmNvbHVtbnM/LltmaXh0dXJlLmVudGl0eUlkXTtcbiAgICAgICAgaWYgKGN1c3RvbUNvbHVtbnMgJiYgY3VzdG9tQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3VzdG9tRHVwbGljYXRlUm93ID0gYXdhaXQgdGhpcy5jaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICAgICAgICAgIHRhcmdldERCLFxuICAgICAgICAgICAgZml4dHVyZUVudGl0eSxcbiAgICAgICAgICAgIGZpeHR1cmUsXG4gICAgICAgICAgICBjdXN0b21Db2x1bW5zLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGN1c3RvbUR1cGxpY2F0ZVJvdykge1xuICAgICAgICAgICAgY29uc3QgW3JlY29yZF0gPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZml4dHVyZUVudGl0eSwgY3VzdG9tRHVwbGljYXRlUm93LCB7XG4gICAgICAgICAgICAgIHNpbmdsZVJlY29yZDogdHJ1ZSxcbiAgICAgICAgICAgICAgZGI6IHRhcmdldERCLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmaXh0dXJlLnRhcmdldCA9IHJlY29yZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVbmlxdWUgaW5kZXgg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIGZpeHR1cmUudW5pcXVlXG4gICAgICAgIGNvbnN0IHVuaXF1ZVJvdyA9IGF3YWl0IHRoaXMuY2hlY2tVbmlxdWVWaW9sYXRpb24odGFyZ2V0REIsIGZpeHR1cmVFbnRpdHksIGZpeHR1cmUpO1xuICAgICAgICBpZiAodW5pcXVlUm93KSB7XG4gICAgICAgICAgY29uc3QgW3JlY29yZF0gPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZml4dHVyZUVudGl0eSwgdW5pcXVlUm93LCB7XG4gICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICBkYjogdGFyZ2V0REIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZml4dHVyZS51bmlxdWUgPSByZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuaXF1ZShmaXh0dXJlcywgKGYpID0+IGYuZml4dHVyZUlkKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFt0YXJnZXREQi5kZXN0cm95KCksIHNvdXJjZURCLmRlc3Ryb3koKV0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUZpeHR1cmVSZWNvcmQoXG4gICAgcm9vdEVudGl0eTogRW50aXR5LFxuICAgIHJvb3RSb3c6IEZpeHR1cmVTb3VyY2VSZWNvcmQsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHNpbmdsZVJlY29yZD86IGJvb2xlYW47XG4gICAgICBkYj86IEtuZXg7XG4gICAgICBpbmNsdWRlUmVsYXRpb25zPzogYm9vbGVhbjtcbiAgICAgIG1heERlcHRoPzogbnVtYmVyO1xuICAgIH0sXG4gICk6IFByb21pc2U8Rml4dHVyZVJlY29yZFtdPiB7XG4gICAgY29uc3QgcmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgY29uc3QgdmlzaXRlZEVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCBjcmVhdGUgPSBhc3luYyAoZW50aXR5OiBFbnRpdHksIHJvdzogRml4dHVyZVNvdXJjZVJlY29yZCwgZGVwdGg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgZml4dHVyZUlkID0gYCR7ZW50aXR5LmlkfSMke3Jvdy5pZH1gO1xuICAgICAgaWYgKHZpc2l0ZWRFbnRpdGllcy5oYXMoZml4dHVyZUlkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2aXNpdGVkRW50aXRpZXMuYWRkKGZpeHR1cmVJZCk7XG5cbiAgICAgIGNvbnN0IHJlY29yZDogRml4dHVyZVJlY29yZCA9IHtcbiAgICAgICAgZml4dHVyZUlkLFxuICAgICAgICBlbnRpdHlJZDogZW50aXR5LmlkLFxuICAgICAgICBpZDogcm93LmlkLFxuICAgICAgICBjb2x1bW5zOiB7fSxcbiAgICAgICAgZmV0Y2hlZFJlY29yZHM6IFtdLFxuICAgICAgICBiZWxvbmdzUmVjb3JkczogW10sXG4gICAgICB9O1xuXG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5LnByb3BzKSB7XG4gICAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTQUZFVFk6IEZpeHR1cmVSZWNvcmTsnZgg66CI6rGw7IucIOqwkiDtg4DsnoXrs7Tri6Qg7Iuk7KCcIERCL0pTT04gZml4dHVyZSDqsJIg6rOE7JW97J20IOuEk+yKteuLiOuLpC5cbiAgICAgICAgY29uc3QgY29sdW1uVmFsdWUgPSByb3dbcHJvcC5uYW1lXSBhcyBGaXh0dXJlUmVjb3JkW1wiY29sdW1uc1wiXVtzdHJpbmddW1widmFsdWVcIl07XG4gICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0gPSB7XG4gICAgICAgICAgcHJvcDogcHJvcCxcbiAgICAgICAgICB2YWx1ZTogY29sdW1uVmFsdWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGIgPSBvcHRpb25zPy5kYiA/PyBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgICAgICBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgY29uc3QgdGhyb3VnaFRhYmxlID0gcHJvcC5qb2luVGFibGU7XG4gICAgICAgICAgY29uc3QgZnJvbUNvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUoZW50aXR5LnRhYmxlKX1faWRgO1xuICAgICAgICAgIGNvbnN0IHRvQ29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxhdGVkRW50aXR5LnRhYmxlKX1faWRgO1xuXG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IGF3YWl0IGRiKHRocm91Z2hUYWJsZSkud2hlcmUoZnJvbUNvbHVtbiwgcm93LmlkKS5wbHVjayh0b0NvbHVtbik7XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZHM7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNIYXNNYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IGF3YWl0IGRiKHJlbGF0ZWRFbnRpdHkudGFibGUpXG4gICAgICAgICAgICAud2hlcmUocHJvcC5qb2luQ29sdW1uLCByb3cuaWQpXG4gICAgICAgICAgICAucGx1Y2soXCJpZFwiKTtcbiAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZElkcztcbiAgICAgICAgfSBlbHNlIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmICFwcm9wLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICAvLyDsl63rsKntlqUgT25lVG9PbmU6IEZL66W8IOqwgOynhCDqtIDroKgg7JeU7Yuw7Yuw66W8IOywvuyKteuLiOuLpFxuICAgICAgICAgIC8vIOyYiOyLnDogVXNlciBPbmVUb09uZSBFbXBsb3llZSAoRW1wbG95ZWXqsIAgdXNlcl9pZCBGS+ulvCDqsIDsp5ApXG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZFByb3AgPSByZWxhdGVkRW50aXR5LnByb3BzLmZpbmQoXG4gICAgICAgICAgICAocCkgPT4gaXNSZWxhdGlvblByb3AocCkgJiYgcC53aXRoID09PSBlbnRpdHkuaWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocmVsYXRlZFByb3AgJiYgaXNSZWxhdGlvblByb3AocmVsYXRlZFByb3ApKSB7XG4gICAgICAgICAgICAvLyDqtIDroKgg7JeU7Yuw7Yuw7JeQ7IScIEZLIOy7rOufvOycvOuhnCDsv7zrpqztlanri4jri6QgKGlk6rCAIOyVhOuLmClcbiAgICAgICAgICAgIGNvbnN0IGZrQ29sdW1uID0gYCR7cmVsYXRlZFByb3AubmFtZX1faWRgO1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJvdyA9IGF3YWl0IGRiKHJlbGF0ZWRFbnRpdHkudGFibGUpLndoZXJlKGZrQ29sdW1uLCByb3cuaWQpLmZpcnN0KCk7XG4gICAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZFJvdz8uaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkID0gcmVsYXRpb25JZFNjaGVtYS5wYXJzZShyb3dbYCR7cHJvcC5uYW1lfV9pZGBdKTtcbiAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZElkO1xuICAgICAgICAgIGlmIChyZWxhdGVkSWQpIHtcbiAgICAgICAgICAgIHJlY29yZC5iZWxvbmdzUmVjb3Jkcy5wdXNoKGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFvcHRpb25zPy5zaW5nbGVSZWNvcmQgJiZcbiAgICAgICAgICAgIG9wdGlvbnM/LmluY2x1ZGVSZWxhdGlvbnMgIT09IGZhbHNlICYmXG4gICAgICAgICAgICBkZXB0aCA8IChvcHRpb25zPy5tYXhEZXB0aCA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpICYmXG4gICAgICAgICAgICByZWxhdGVkSWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJvdyA9IGF3YWl0IGRiKHJlbGF0ZWRFbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgcmVsYXRlZElkKS5maXJzdCgpO1xuICAgICAgICAgICAgaWYgKHJlbGF0ZWRSb3cpIHtcbiAgICAgICAgICAgICAgYXdhaXQgY3JlYXRlKFxuICAgICAgICAgICAgICAgIHJlbGF0ZWRFbnRpdHksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgLi4uZGF0YUV4cGxvcmVyUmVjb3JkU2NoZW1hLnBhcnNlKHJlbGF0ZWRSb3cpLFxuICAgICAgICAgICAgICAgICAgaWQ6IHoudW5pb24oW3oubnVtYmVyKCksIHouc3RyaW5nKCldKS5wYXJzZShyZWxhdGVkUm93LmlkKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRlcHRoICsgMSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgfTtcblxuICAgIGF3YWl0IGNyZWF0ZShyb290RW50aXR5LCByb290Um93LCAwKTtcblxuICAgIHJldHVybiByZWNvcmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuIFJlbGF0aW9uR3JhcGjroZwgZml4dHVyZSDri6jsnIQg7IK97J6FIOyInOyEnCDqs4TsgrAgKHNlbGYtcmVmZXJlbmNlIO2PrO2VqClcbiAgICogMi4g7YWM7J2067iU67OEIOugiOuyqOuzhOuhnCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnSDrsI8gdXBzZXJ0IOyLpO2WiVxuICAgKiAzLiDsiJzshJwg6riw67CYIHV1aWTihpJpZCDrp6TtlZEgKFVwc2VydEJ1aWxkZXLqsIAgdXVpZOulvCBEQuyXkCDsoIDsnqXtlZjsp4Ag7JWK7Jy866+A66GcKVxuICAgKlxuICAgKiBVcHNlcnRCdWlsZGVy64qUIHNlbGYtcmVmZXJlbmNl6rCAIOyeiOycvOuptCBidWlsZEluc2VydExldmVscygp66GcIOyerOygleugrO2VmOyXrFxuICAgKiDrk7HroZ0g7Iic7ISc7JmAIOuwmO2ZmCDsiJzshJzqsIAg64us65287KeIIOyImCDsnojsirXri4jri6QuIOydtOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0XG4gICAqIEZpeHR1cmVNYW5hZ2Vy6rCAIOugiOuyqOuzhOuhnCDrgpjriKDshJwg7LKY66as7ZWY7JesIOqwgSB1cHNlcnQg7Zi47Lac7JeQ7ISc64qUXG4gICAqIHNlbGYtcmVmZXJlbmNl6rCAIOyXhuuPhOuhnSDtlanri4jri6QuXG4gICAqL1xuICBhc3luYyBpbnNlcnRGaXh0dXJlcyhcbiAgICBkYk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIF9maXh0dXJlczogRml4dHVyZVJlY29yZFtdLFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGZpeHR1cmVzID0gdW5pcXVlKF9maXh0dXJlcywgKGYpID0+IGYuZml4dHVyZUlkKTtcblxuICAgIC8vIOy0iOq4sO2ZlFxuICAgIHRoaXMuYnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gICAgdGhpcy5maXh0dXJlUmVmTWFwID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuc2tpcHBlZEZpeHR1cmVzID0gbmV3IE1hcCgpO1xuXG4gICAgLy8g67OR66CsIO2FjOyKpO2KuCDrqqjrk5zsl5DshJzripQgd29ya2Vy67OEIERC7JeQIOyggOyepVxuICAgIGNvbnN0IGRiQ29uZmlnID1cbiAgICAgIHByb2Nlc3MuZW52LlNPTkFNVV9XT1JLRVJfREIgPT09IFwidHJ1ZVwiICYmIHByb2Nlc3MuZW52LlZJVEVTVF9QT09MX0lEXG4gICAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlcklkID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuVklURVNUX1BPT0xfSUQgPz8gXCIxXCIsIDEwKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBTb25hbXUuZGJDb25maWdbZGJOYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBkYXRhYmFzZUNvbm5lY3Rpb25TY2hlbWEucGFyc2UoYmFzZUNvbmZpZy5jb25uZWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmJhc2VDb25maWcsXG4gICAgICAgICAgICAgIGNvbm5lY3Rpb246IHsgLi4uY29ubmVjdGlvbiwgZGF0YWJhc2U6IGAke2Nvbm5lY3Rpb24uZGF0YWJhc2V9XyR7d29ya2VySWR9YCB9LFxuICAgICAgICAgICAgICBwb29sOiB7IG1pbjogMSwgbWF4OiAxIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pKClcbiAgICAgICAgOiBTb25hbXUuZGJDb25maWdbZGJOYW1lXTtcbiAgICBjb25zdCBkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShkYkNvbmZpZyk7XG4gICAgY29uc3QgcmVzdWx0czogRml4dHVyZUltcG9ydFJlc3VsdFtdID0gW107XG5cbiAgICB0cnkge1xuICAgICAgLy8gMS4gUmVsYXRpb25HcmFwaOuhnCBmaXh0dXJlIOuLqOychCDsgr3snoUg7Iic7IScIOqzhOyCsFxuICAgICAgdGhpcy5yZWxhdGlvbkdyYXBoLmJ1aWxkR3JhcGgoZml4dHVyZXMpO1xuICAgICAgY29uc3QgaW5zZXJ0aW9uT3JkZXIgPSB0aGlzLnJlbGF0aW9uR3JhcGguZ2V0SW5zZXJ0aW9uT3JkZXIoKTtcblxuICAgICAgLy8gMi4g7Iqk7YK17ZWgIGZpeHR1cmUg66i87KCAIOyymOumrCAob3ZlcnJpZGUg7LK07YGsKVxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlSWQgb2YgaW5zZXJ0aW9uT3JkZXIpIHtcbiAgICAgICAgY29uc3QgZml4dHVyZSA9IGZpeHR1cmVzLmZpbmQoKGYpID0+IGYuZml4dHVyZUlkID09PSBmaXh0dXJlSWQpO1xuICAgICAgICBpZiAoIWZpeHR1cmUpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGhhc1RhcmdldCA9ICEhZml4dHVyZS50YXJnZXQ7XG4gICAgICAgIGNvbnN0IGhhc1VuaXF1ZSA9ICEhZml4dHVyZS51bmlxdWU7XG4gICAgICAgIGNvbnN0IGhhc0R1cGxpY2F0ZSA9IGhhc1RhcmdldCB8fCBoYXNVbmlxdWU7XG5cbiAgICAgICAgLy8g7KSR67O17J20IOyeiOqzoCBvdmVycmlkZT1mYWxzZeyduCDqsr3smrA6IOyKpO2CtVxuICAgICAgICBpZiAoaGFzRHVwbGljYXRlICYmICFmaXh0dXJlLm92ZXJyaWRlKSB7XG4gICAgICAgICAgLy8g6riw7KG0IOugiOy9lOuTnCBJRCDsoIDsnqUgKHVuaXF1ZSDsmrDshKAsIOyXhuycvOuptCB0YXJnZXQpXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IGZpeHR1cmUudW5pcXVlPy5pZCA/PyBmaXh0dXJlLnRhcmdldD8uaWQ7XG4gICAgICAgICAgYXNzZXJ0KGV4aXN0aW5nSWQpO1xuICAgICAgICAgIHRoaXMuc2tpcHBlZEZpeHR1cmVzLnNldChmaXh0dXJlSWQsIHtcbiAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgZXhpc3RpbmdJZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICBgU2tpcHBlZCAke2ZpeHR1cmUuZW50aXR5SWR9IyR7Zml4dHVyZS5pZH0gKGV4aXN0aW5nOiAjJHtleGlzdGluZ0lkfSwgb3ZlcnJpZGU6IGZhbHNlKWAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIO2FjOydtOu4lOuzhCBmaXh0dXJlIOq3uOujue2ZlCAoaW5zZXJ0aW9uT3JkZXIg7Iic7IScIOq4sOuwmClcbiAgICAgIGNvbnN0IGZpeHR1cmVzQnlUYWJsZSA9IG5ldyBNYXA8c3RyaW5nLCBGaXh0dXJlUmVjb3JkW10+KCk7XG4gICAgICBjb25zdCB0YWJsZU9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmVJZCBvZiBpbnNlcnRpb25PcmRlcikge1xuICAgICAgICAvLyDsiqTtgrXrkJwgZml4dHVyZSDsoJzsmbhcbiAgICAgICAgaWYgKHRoaXMuc2tpcHBlZEZpeHR1cmVzLmhhcyhmaXh0dXJlSWQpKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBmaXh0dXJlID0gZml4dHVyZXMuZmluZCgoZikgPT4gZi5maXh0dXJlSWQgPT09IGZpeHR1cmVJZCk7XG4gICAgICAgIGlmICghZml4dHVyZSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG4gICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGVudGl0eS50YWJsZTtcblxuICAgICAgICBpZiAoIWZpeHR1cmVzQnlUYWJsZS5oYXModGFibGVOYW1lKSkge1xuICAgICAgICAgIGZpeHR1cmVzQnlUYWJsZS5zZXQodGFibGVOYW1lLCBbXSk7XG4gICAgICAgICAgdGFibGVPcmRlci5wdXNoKHRhYmxlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZml4dHVyZXNCeVRhYmxlLmdldCh0YWJsZU5hbWUpPy5wdXNoKGZpeHR1cmUpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICAgIGNvbnN0IGluc2VydGVkSWRzQnlUYWJsZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+PigpO1xuXG4gICAgICAgIC8vIDQuIO2FjOydtOu4lOuzhCDroIjrsqjrs4Qg7LKY66asXG4gICAgICAgIGZvciAoY29uc3QgdGFibGVOYW1lIG9mIHRhYmxlT3JkZXIpIHtcbiAgICAgICAgICBjb25zdCB0YWJsZUZpeHR1cmVzID0gZml4dHVyZXNCeVRhYmxlLmdldCh0YWJsZU5hbWUpID8/IFtdO1xuICAgICAgICAgIGNvbnN0IGxldmVscyA9IHRoaXMuZ3JvdXBGaXh0dXJlc0J5TGV2ZWwodGFibGVGaXh0dXJlcyk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGxldmVsRml4dHVyZXMgb2YgbGV2ZWxzKSB7XG4gICAgICAgICAgICAvLyDtlbTri7kg66CI67Ko7J2YIGZpeHR1cmXrk6QgcmVnaXN0ZXJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBsZXZlbEZpeHR1cmVzKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJGaXh0dXJlKGZpeHR1cmUsIGluc2VydGVkSWRzQnlUYWJsZSk7XG4gICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgY2hhbGsuYmx1ZShcbiAgICAgICAgICAgICAgICAgICAgYFJlZ2lzdGVyZWQgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9JHtmaXh0dXJlLm92ZXJyaWRlID8gYCAob3ZlcnJpZGUpYCA6IFwiXCJ9YCxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdXBzZXJ0IOyLpO2WiSDsoIQgdXVpZCDrqqnroZ0g7KCA7J6lXG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuYnVpbGRlci5nZXRUYWJsZSh0YWJsZU5hbWUpO1xuICAgICAgICAgICAgY29uc3QgdXVpZHMgPSB0YWJsZS5yb3dzLm1hcCgocm93KSA9PiB6LnN0cmluZygpLnBhcnNlKHJvdy51dWlkKSk7XG5cbiAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjaGFsay5ibHVlKFxuICAgICAgICAgICAgICAgICAgYFVwc2VydGluZyAke3RhYmxlTmFtZX0gd2l0aCAke3V1aWRzLmxlbmd0aH0gcm93cyAobGV2ZWwgJHtsZXZlbHMuaW5kZXhPZihsZXZlbEZpeHR1cmVzKSArIDF9LyR7bGV2ZWxzLmxlbmd0aH0pYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gU0FGRVRZOiB0YWJsZU5hbWXsnYAg65Ox66Gd65CcIEVudGl0eeydmCDsi6TsoJwg7YWM7J2067iU66qF7JeQ7ISc66eMIOyDneyEseuQqeuLiOuLpC5cbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYVRhYmxlTmFtZSA9IHRhYmxlTmFtZSBhcyBrZXlvZiBEYXRhYmFzZVNjaGVtYUV4dGVuZDtcbiAgICAgICAgICAgIGNvbnN0IGlkcyA9IGZpeHR1cmVSZWNvcmRJZHNTY2hlbWEucGFyc2UoXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuYnVpbGRlci51cHNlcnQodHJ4LCBzY2hlbWFUYWJsZU5hbWUpLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8g7Iic7IScIOq4sOuwmCB1dWlkIC0+IGlkIOunpO2VkVxuICAgICAgICAgICAgLy8gc2VsZi1yZWZlcmVuY2XqsIAg7JeG7Jy866+A66GcIOuTseuhnSDsiJzshJwgPSDrsJjtmZgg7Iic7IScIOuztOyepVxuICAgICAgICAgICAgaWYgKHV1aWRzLmxlbmd0aCA+IDAgJiYgdXVpZHMubGVuZ3RoID09PSBpZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nTWFwID1cbiAgICAgICAgICAgICAgICBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KHRhYmxlTmFtZSkgPz8gbmV3IE1hcDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4oKTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1dWlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nTWFwLnNldCh1dWlkc1tpXSwgaWRzW2ldKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbnNlcnRlZElkc0J5VGFibGUuc2V0KHRhYmxlTmFtZSwgZXhpc3RpbmdNYXApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh1dWlkcy5sZW5ndGggIT09IGlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICAgIGBXYXJuaW5nOiB1dWlkIGNvdW50ICgke3V1aWRzLmxlbmd0aH0pICE9IGlkIGNvdW50ICgke2lkcy5sZW5ndGh9KSBmb3IgJHt0YWJsZU5hbWV9YCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIE1hbnlUb01hbnkg6rSA6rOEIOyymOumrFxuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NNYW55VG9NYW55UmVsYXRpb25zKHRyeCwgZml4dHVyZXMsIGluc2VydGVkSWRzQnlUYWJsZSk7XG5cbiAgICAgICAgLy8gNi4gUG9zdGdyZVNRTCDsi5ztgIDsiqQg66as7IWLXG4gICAgICAgIC8vIEZpeHR1cmUg7IK97J6FIO2bhCDqsIEg7YWM7J2067iU7J2YIElEIOyLnO2AgOyKpOulvCDstZzrjIAgSUQg6rCS7Jy866GcIOyXheuNsOydtO2KuO2VqeuLiOuLpC5cbiAgICAgICAgLy8g7J2066CH6rKMIO2VmOyngCDslYrsnLzrqbQg64uk7J2MIElOU0VSVCDsi5wgSUTqsIAgMjAwMOuyiOuMgOuhnCDsg53shLHrkKAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoXCJSZXNldHRpbmcgc2VxdWVuY2VzLi4uXCIpKTtcbiAgICAgICAgZm9yIChjb25zdCB0YWJsZU5hbWUgb2YgdGFibGVPcmRlcikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBFbnRpdHnrpbwg7LC+7JWE7IScIGlkIO2DgOyehSDtmZXsnbhcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKS5maW5kKFxuICAgICAgICAgICAgICAoZSkgPT4gZS50YWJsZSA9PT0gdGFibGVOYW1lIHx8IGUuaWQudG9Mb3dlckNhc2UoKSA9PT0gdGFibGVOYW1lLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGVudGl0eSkge1xuICAgICAgICAgICAgICBjb25zdCBpZFByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBcImlkXCIpO1xuICAgICAgICAgICAgICBjb25zdCBpZFR5cGUgPSBpZFByb3A/LnR5cGU7XG5cbiAgICAgICAgICAgICAgLy8gaW50ZWdlci9iaWdJbnRlZ2Vy7J206rGw64KYLCBzdHJpbmfsnbTsp4Drp4wgZml4dHVyZVN0cmF0ZWd5PXNlcXVlbmNl7J24IOqyveyasOyXkOunjCDrpqzshYvtlanri4jri6RcbiAgICAgICAgICAgICAgY29uc3QgdXNlc1NlcXVlbmNlID1cbiAgICAgICAgICAgICAgICBpZFR5cGUgPT09IFwiaW50ZWdlclwiIHx8XG4gICAgICAgICAgICAgICAgaWRUeXBlID09PSBcImJpZ0ludGVnZXJcIiB8fFxuICAgICAgICAgICAgICAgIGlkUHJvcD8uY29uZT8uZml4dHVyZVN0cmF0ZWd5ID09PSBcInNlcXVlbmNlXCI7XG5cbiAgICAgICAgICAgICAgaWYgKCF1c2VzU2VxdWVuY2UpIHtcbiAgICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgICBjaGFsay5ncmF5KFxuICAgICAgICAgICAgICAgICAgICAgIGBTa2lwcGVkIHNlcXVlbmNlIHJlc2V0IGZvciAke3RhYmxlTmFtZX0gKGlkIHR5cGU6ICR7aWRUeXBlIHx8IFwidW5rbm93blwifSlgLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDthYzsnbTruJTsnZgg7LWc64yAIElEIOyhsO2ajCAoc3RyaW5nIO2DgOyeheydgCDsiKvsnpAg7LqQ7Iqk7YyFIO2VhOyalClcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eTIgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbEVudGl0aWVzKCkuZmluZChcbiAgICAgICAgICAgICAgKGUpID0+IGUudGFibGUgPT09IHRhYmxlTmFtZSB8fCBlLmlkLnRvTG93ZXJDYXNlKCkgPT09IHRhYmxlTmFtZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBpZFR5cGUyID0gZW50aXR5Mj8ucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBcImlkXCIpPy50eXBlO1xuICAgICAgICAgICAgY29uc3QgbWF4SWRSZXN1bHQgPVxuICAgICAgICAgICAgICBpZFR5cGUyID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgPyBhd2FpdCB0cnhcbiAgICAgICAgICAgICAgICAgICAgLnJhdyhgU0VMRUNUIE1BWChpZDo6YmlnaW50KSBhcyBtYXhfaWQgRlJPTSBcIiR7dGFibGVOYW1lfVwiYClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHIpID0+IHIucm93c1swXSlcbiAgICAgICAgICAgICAgICA6IGF3YWl0IHRyeCh0YWJsZU5hbWUpLm1heChcImlkIGFzIG1heF9pZFwiKS5maXJzdCgpO1xuICAgICAgICAgICAgY29uc3QgbWF4SWQgPSBtYXhJZFJlc3VsdD8ubWF4X2lkO1xuXG4gICAgICAgICAgICBpZiAobWF4SWQgIT09IG51bGwgJiYgbWF4SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyDsi5ztgIDsiqTrqoXsnYQgcGdfZ2V0X3NlcmlhbF9zZXF1ZW5jZeuhnCDslYjsoITtlZjqsowg7KGw7ZqMXG4gICAgICAgICAgICAgIGF3YWl0IHRyeC5yYXcoYFNFTEVDVCBzZXR2YWwocGdfZ2V0X3NlcmlhbF9zZXF1ZW5jZSg/LCAnaWQnKSwgPylgLCBbXG4gICAgICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgIG1heElkLFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGBSZXNldCBzZXF1ZW5jZSBmb3IgJHt0YWJsZU5hbWV9OiAke21heElkfWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIOyLnO2AgOyKpOqwgCDsl4bripQg7YWM7J2067iUKGpvaW4gdGFibGUg65OxKeydgCDrrLTsi5xcbiAgICAgICAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGBTa2lwcGVkIHNlcXVlbmNlIHJlc2V0IGZvciAke3RhYmxlTmFtZX1gKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNy4g6rKw6rO8IOyImOynkVxuICAgICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgICAgIC8vIOyKpO2CteuQnCBmaXh0dXJl64qUIOq4sOyhtCDroIjsvZTrk5wg7KCV67O066GcIOqysOqzvCDstpTqsIBcbiAgICAgICAgICBjb25zdCBza2lwcGVkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAoc2tpcHBlZCkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgc2tpcHBlZC5leGlzdGluZ0lkKS5maXJzdCgpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICBjb25zdCB1dWlkVG9JZCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQoZW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydGVkSWQgPSB1dWlkVG9JZD8uZ2V0KHJlZi51dWlkKTtcblxuICAgICAgICAgICAgaWYgKGluc2VydGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgaW5zZXJ0ZWRJZCkuZmlyc3QoKSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgSW5zZXJ0ZWQgaW50byAke2VudGl0eS50YWJsZX06ICMke2ZpeHR1cmUuaWR9IC0+ICMke2luc2VydGVkSWR9YCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBkYi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuaXF1ZShyZXN1bHRzLCAocikgPT4gYCR7ci5lbnRpdHlJZH0jJHtyLmRhdGEuaWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogRml4dHVyZVJlY29yZOulvCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnVxuICAgKiBAcGFyYW0gaW5zZXJ0ZWRJZHNCeVRhYmxlIOydtOuvuCB1cHNlcnTrkJwg7YWM7J2067iU7J2YIHV1aWTihpJpZCDrp6TtlZEgKOugiOuyqOuzhCDsspjrpqwg7IucIOyCrOyaqSlcbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJGaXh0dXJlKFxuICAgIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQsXG4gICAgaW5zZXJ0ZWRJZHNCeVRhYmxlPzogTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPj4sXG4gICk6IFVCUmVmIHtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICBjb25zdCByb3c6IFVwc2VydFJvdyA9IHt9O1xuXG4gICAgLy8gT3ZlcnJpZGUg66qo65OcIO2MkOuLqDogdGFyZ2V0IOuYkOuKlCB1bmlxdWXqsIAg7J6I6rOgIG92ZXJyaWRlPXRydWXsnbgg6rK97JqwXG4gICAgY29uc3QgZXhpc3RpbmdSZWNvcmQgPSBmaXh0dXJlLnRhcmdldCA/PyBmaXh0dXJlLnVuaXF1ZTtcbiAgICBjb25zdCBpc092ZXJyaWRlTW9kZSA9IGZpeHR1cmUub3ZlcnJpZGUgJiYgZXhpc3RpbmdSZWNvcmQ7XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3A7XG5cbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBHZW5lcmF0ZWQgY29sdW1u7J2AIElOU0VSVOyXkOyEnCDsoJzsmbggKERC6rCAIOyekOuPmSDsg53shLEpXG4gICAgICBpZiAoXCJnZW5lcmF0ZWRcIiBpbiBwcm9wICYmIHByb3AuZ2VuZXJhdGVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZCDsspjrpqxcbiAgICAgIGlmIChwcm9wTmFtZSA9PT0gXCJpZFwiKSB7XG4gICAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICAgIC8vIHBhcmVudElkIOyXlO2LsO2LsOydmCBpZOuKlCDrtoDrqqgg7JeU7Yuw7Yuw7J2YIEZL7J2066+A66GcIOyLnO2AgOyKpCDrr7jsgqzsmqkgKOuqheyLnOyggeycvOuhnCDtj6ztlagpXG4gICAgICAgIGNvbnN0IHVzZXNTZXF1ZW5jZSA9XG4gICAgICAgICAgIWVudGl0eS5wYXJlbnRJZCAmJlxuICAgICAgICAgIChpZFByb3A/LnR5cGUgPT09IFwiaW50ZWdlclwiIHx8XG4gICAgICAgICAgICBpZFByb3A/LnR5cGUgPT09IFwiYmlnSW50ZWdlclwiIHx8XG4gICAgICAgICAgICBpZFByb3A/LmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiKTtcblxuICAgICAgICBpZiAoaXNPdmVycmlkZU1vZGUgJiYgZXhpc3RpbmdSZWNvcmQpIHtcbiAgICAgICAgICAvLyBPdmVycmlkZTog6riw7KG0IOugiOy9lOuTnOydmCDqsJIg7IKs7JqpIOKGkiBVUERBVEVcbiAgICAgICAgICByb3dbcHJvcE5hbWVdID0gZXhpc3RpbmdSZWNvcmQuY29sdW1uc1twcm9wTmFtZV0/LnZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKCF1c2VzU2VxdWVuY2UpIHtcbiAgICAgICAgICAvLyBzdHJpbmcgUEsg65iQ64qUIHBhcmVudElkIOyXlO2LsO2LsCBGSzog7IOd7ISx65CcIGlkIOqwkuydhCBJTlNFUlTsl5Ag7Y+s7ZWoXG4gICAgICAgICAgcm93W3Byb3BOYW1lXSA9IGNvbHVtbi52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXIgUEs6IERCIOyLnO2AgOyKpOyXkCDrp6HquYAgKOqwkiDsoJzsmbgpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWQgPSByZWxhdGlvbklkU2NoZW1hLnBhcnNlKGNvbHVtbi52YWx1ZSk7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCAhPT0gbnVsbCAmJiByZWxhdGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcblxuICAgICAgICAgICAgLy8g66i87KCAIHNraXDrkJwgZml4dHVyZeyduOyngCDtmZXsnbhcbiAgICAgICAgICAgIGNvbnN0IHNraXBwZWRFeGlzdGluZ0lkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpPy5leGlzdGluZ0lkO1xuICAgICAgICAgICAgaWYgKHNraXBwZWRFeGlzdGluZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gc2tpcOuQnCBmaXh0dXJlIOKGkiB0YXJnZXQgRELsnZgg6riw7KG0IOugiOy9lOuTnCBpZCDsgqzsmqlcbiAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gc2tpcHBlZEV4aXN0aW5nSWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChyZWxhdGVkRml4dHVyZUlkKTtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgICAvLyDsnbTrr7ggdXBzZXJ065CcIOqwmeydgCDthYzsnbTruJQgZml4dHVyZSDtmZXsnbhcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkSW5zZXJ0ZWRJZHMgPSBpbnNlcnRlZElkc0J5VGFibGU/LmdldChyZWxhdGVkRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWxJZCA9IHJlbGF0ZWRJbnNlcnRlZElkcz8uZ2V0KHJlbGF0ZWRSZWYudXVpZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWN0dWFsSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgLy8g7J2066+4IHVwc2VydOuQqCDihpIg7Iuk7KCcIElEIOyCrOyaqVxuICAgICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gYWN0dWFsSWQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIOyVhOyngSB1cHNlcnQg7JWI65CoIOKGkiBVQlJlZiDsgqzsmqlcbiAgICAgICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IHJlbGF0ZWRSZWY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZpeHR1cmVz7JeQIO2PrO2VqOuQmOyngCDslYrsnYAg66CI7L2U65OcIOKGkiBJRCDqt7jrjIDroZwg7IKs7JqpXG4gICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhc01hbnksIE1hbnlUb01hbnnripQg67OE64+EIOyymOumrFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvFxuICAgICAgICByb3dbcHJvcE5hbWVdID0gdGhpcy5jb252ZXJ0Q29sdW1uVmFsdWUocHJvcCwgY29sdW1uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYFJlZ2lzdGVyaW5nICR7ZW50aXR5LnRhYmxlfSAtICR7aW5zcGVjdChyb3csIGZhbHNlLCBudWxsLCB0cnVlKX1gKSk7XG4gICAgY29uc3QgcmVmID0gdGhpcy5idWlsZGVyLnJlZ2lzdGVyKGVudGl0eS50YWJsZSwgcm93KTtcbiAgICB0aGlzLmZpeHR1cmVSZWZNYXAuc2V0KGZpeHR1cmUuZml4dHVyZUlkLCByZWYpO1xuXG4gICAgcmV0dXJuIHJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiDsu6zrn7wg6rCSIOuzgO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0Q29sdW1uVmFsdWUoXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICB2YWx1ZTogRml4dHVyZVJlY29yZFtcImNvbHVtbnNcIl1bc3RyaW5nXVtcInZhbHVlXCJdLFxuICApOiBEYXRhRXhwbG9yZXJWYWx1ZSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN3aXRjaCAocHJvcC50eXBlKSB7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICAvLyBVcHNlcnRCdWlsZGVyLnJlZ2lzdGVy7JeQ7IScIEpTT04uc3RyaW5naWZ5IOyymOumrO2VmOuvgOuhnCBvYmplY3Qg6re464yA66GcIOyghOuLrFxuICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBkYXRlU291cmNlID0gei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pLnNhZmVQYXJzZSh2YWx1ZSk7XG4gICAgICAgICAgaWYgKGRhdGVTb3VyY2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGVTb3VyY2UuZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnMoXG4gICAgdHJ4OiBLbmV4LlRyYW5zYWN0aW9uLFxuICAgIGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10sXG4gICAgaW5zZXJ0ZWRJZHNCeVRhYmxlOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICAgIGNvbnN0IHNvdXJjZVJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuXG4gICAgICBpZiAoIXNvdXJjZVJlZikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHNvdXJjZVV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChlbnRpdHkudGFibGUpO1xuICAgICAgY29uc3Qgc291cmNlSWQgPSBzb3VyY2VVdWlkVG9JZD8uZ2V0KHNvdXJjZVJlZi51dWlkKTtcblxuICAgICAgaWYgKHNvdXJjZUlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IFssIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3A7XG5cbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSAmJiBBcnJheS5pc0FycmF5KGNvbHVtbi52YWx1ZSkpIHtcbiAgICAgICAgICAvLyDshKDtg53rkJjsp4Ag7JWK7J2AIE1hbnlUb01hbnkg6rSA6rOE64qUIOyggOyepe2VmOyngCDslYrsnYxcbiAgICAgICAgICBjb25zdCB0YXJnZXRUYWJsZSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgaWYgKCF0aGlzLmJ1aWxkZXIuaGFzVGFibGUodGFyZ2V0VGFibGUudGFibGUpKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBmaXh0dXJlUmVjb3JkSWRzU2NoZW1hLnBhcnNlKGNvbHVtbi52YWx1ZSk7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZHMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGpvaW5UYWJsZSA9IHByb3Auam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuXG4gICAgICAgICAgY29uc3Qgc291cmNlQ29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShlbnRpdHkudGFibGUpfV9pZGA7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0Q29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxhdGVkRW50aXR5LnRhYmxlKX1faWRgO1xuXG4gICAgICAgICAgZm9yIChjb25zdCByZWxhdGVkSWQgb2YgcmVsYXRlZElkcykge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpO1xuXG4gICAgICAgICAgICBsZXQgdGFyZ2V0SWQ6IG51bWJlciB8IHN0cmluZztcblxuICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZFV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChyZWxhdGVkRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRJZCA9IHJlbGF0ZWRVdWlkVG9JZD8uZ2V0KHJlbGF0ZWRSZWYudXVpZCk7XG5cbiAgICAgICAgICAgICAgaWYgKHJlc29sdmVkSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgIGBSZWxhdGVkIGZpeHR1cmUgJHtyZWxhdGVkRml4dHVyZUlkfSBub3QgZm91bmQgaW4gaW5zZXJ0ZWRJZHMsIHNraXBwaW5nYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRhcmdldElkID0gcmVzb2x2ZWRJZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRhcmdldElkID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBKb2luVGFibGXsl5Ag7IK97J6FXG4gICAgICAgICAgICBjb25zdCBbZm91bmRdID0gYXdhaXQgdHJ4KGpvaW5UYWJsZSlcbiAgICAgICAgICAgICAgLndoZXJlKHtcbiAgICAgICAgICAgICAgICBbc291cmNlQ29sdW1uXTogc291cmNlSWQsXG4gICAgICAgICAgICAgICAgW3RhcmdldENvbHVtbl06IHRhcmdldElkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAubGltaXQoMSk7XG5cbiAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgYXdhaXQgdHJ4KGpvaW5UYWJsZSkuaW5zZXJ0KHtcbiAgICAgICAgICAgICAgICBbc291cmNlQ29sdW1uXTogc291cmNlSWQsXG4gICAgICAgICAgICAgICAgW3RhcmdldENvbHVtbl06IHRhcmdldElkLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgICAgICAgICAgICBgSW5zZXJ0ZWQgaW50byAke2pvaW5UYWJsZX06ICR7ZW50aXR5LnRhYmxlfSgke3NvdXJjZUlkfSkgLSAke3JlbGF0ZWRFbnRpdHkudGFibGV9KCR7dGFyZ2V0SWR9KWAsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOqwmeydgCDthYzsnbTruJQg64K0IGZpeHR1cmXrk6TsnYQgc2VsZi1yZWZlcmVuY2Ug66CI67Ko67OE66GcIOu2hO2VoFxuICAgKiAtIHNlbGYtcmVmZXJlbmNl6rCAIOyXhuuKlCBmaXh0dXJl65OkOiBMZXZlbCAwXG4gICAqIC0gTGV2ZWwgMOydhCDssLjsobDtlZjripQgZml4dHVyZeuTpDogTGV2ZWwgMVxuICAgKiAtIOuwmOuztVxuICAgKlxuICAgKiBVcHNlcnRCdWlsZGVy6rCAIHNlbGYtcmVmZXJlbmNl6rCAIOyeiOycvOuptCBidWlsZEluc2VydExldmVscygp66GcIOyerOygleugrO2VmOyXrFxuICAgKiDrk7HroZ0g7Iic7ISc7JmAIOuwmO2ZmCDsiJzshJzqsIAg64us65287KeIIOyImCDsnojsirXri4jri6QuXG4gICAqIOydtOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0IEZpeHR1cmVNYW5hZ2Vy6rCAIOugiOuyqOuzhOuhnCDrgpjriKDshJwg7LKY66as7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBncm91cEZpeHR1cmVzQnlMZXZlbChmaXh0dXJlczogRml4dHVyZVJlY29yZFtdKTogRml4dHVyZVJlY29yZFtdW10ge1xuICAgIGlmIChmaXh0dXJlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlc1swXS5lbnRpdHlJZCk7XG5cbiAgICAvLyBzZWxmLXJlZmVyZW5jZSByZWxhdGlvbiBwcm9wIOywvuq4sFxuICAgIGNvbnN0IHNlbGZSZWZQcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoXG4gICAgICAocCk6IHAgaXMgQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIHwgT25lVG9PbmVSZWxhdGlvblByb3AgPT5cbiAgICAgICAgaXNSZWxhdGlvblByb3AocCkgJiZcbiAgICAgICAgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHApICYmIHAuaGFzSm9pbkNvbHVtbikpICYmXG4gICAgICAgIHAud2l0aCA9PT0gZW50aXR5LmlkLFxuICAgICk7XG5cbiAgICBpZiAoc2VsZlJlZlByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gc2VsZi1yZWZlcmVuY2Ug7JeG7J2MIOKGkiDri6jsnbwg66CI67KoXG4gICAgICByZXR1cm4gW2ZpeHR1cmVzXTtcbiAgICB9XG5cbiAgICAvLyDroIjrsqjrs4Qg67aE7ZWgICh0b3BvbG9naWNhbCBzb3J0KVxuICAgIGNvbnN0IGxldmVsczogRml4dHVyZVJlY29yZFtdW10gPSBbXTtcbiAgICBjb25zdCByZW1haW5pbmcgPSBuZXcgU2V0KGZpeHR1cmVzLm1hcCgoZikgPT4gZi5maXh0dXJlSWQpKTtcbiAgICBjb25zdCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHdoaWxlIChyZW1haW5pbmcuc2l6ZSA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbDogRml4dHVyZVJlY29yZFtdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICBpZiAoIXJlbWFpbmluZy5oYXMoZml4dHVyZS5maXh0dXJlSWQpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBzZWxmLXJlZmVyZW5jZeqwgCDrqqjrkZAg7J2066+4IOyymOumrOuQkOqxsOuCmCBudWxs7J24IOqyveyasFxuICAgICAgICBjb25zdCBjYW5Qcm9jZXNzID0gc2VsZlJlZlByb3BzLmV2ZXJ5KChwcm9wKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVmSWQgPSByZWxhdGlvbklkU2NoZW1hLnBhcnNlKGZpeHR1cmUuY29sdW1uc1twcm9wLm5hbWVdPy52YWx1ZSk7XG4gICAgICAgICAgaWYgKHJlZklkID09PSBudWxsIHx8IHJlZklkID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgICAgICAgIGNvbnN0IHJlZkZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWZJZH1gO1xuICAgICAgICAgIC8vIOydtOuvuCDsspjrpqzrkJDqsbDrgpgsIO2YhOyerCBmaXh0dXJlc+yXkCDtj6ztlajrkJjsp4Ag7JWK7J2AIOqyveyasCAo7Jm467aAIOywuOyhsClcbiAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkLmhhcyhyZWZGaXh0dXJlSWQpIHx8ICFyZW1haW5pbmcuaGFzKHJlZkZpeHR1cmVJZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChjYW5Qcm9jZXNzKSB7XG4gICAgICAgICAgY3VycmVudExldmVsLnB1c2goZml4dHVyZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnJlbnRMZXZlbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc3QgcmVtYWluaW5nSWRzID0gQXJyYXkuZnJvbShyZW1haW5pbmcpLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDaXJjdWxhciBzZWxmLXJlZmVyZW5jZSBkZXRlY3RlZCBpbiAke2VudGl0eS50YWJsZX0uIFJlbWFpbmluZyBmaXh0dXJlczogJHtyZW1haW5pbmdJZHN9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGN1cnJlbnRMZXZlbCkge1xuICAgICAgICByZW1haW5pbmcuZGVsZXRlKGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgcHJvY2Vzc2VkLmFkZChmaXh0dXJlLmZpeHR1cmVJZCk7XG4gICAgICB9XG5cbiAgICAgIGxldmVscy5wdXNoKGN1cnJlbnRMZXZlbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxldmVscztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tVbmlxdWVWaW9sYXRpb24oZGI6IEtuZXgsIGVudGl0eTogRW50aXR5LCBmaXh0dXJlOiBGaXh0dXJlUmVjb3JkKSB7XG4gICAgY29uc3QgZW50aXR5VW5pcXVlSW5kZXhlcyA9IGVudGl0eS5pbmRleGVzPy5maWx0ZXIoKGkpID0+IGkudHlwZSA9PT0gXCJ1bmlxdWVcIikgPz8gW107XG5cbiAgICBjb25zdCB1bmlxdWVJbmRleGVzID0gZW50aXR5VW5pcXVlSW5kZXhlcy5maWx0ZXIoKGluZGV4KSA9PlxuICAgICAgaW5kZXguY29sdW1ucy5ldmVyeSgoY29sdW1uKSA9PiAhY29sdW1uLm5hbWUuc3RhcnRzV2l0aChgJHtlbnRpdHkudGFibGV9X19gKSksXG4gICAgKTtcbiAgICBpZiAodW5pcXVlSW5kZXhlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCB1bmlxdWVRdWVyeSA9IGRiKGVudGl0eS50YWJsZSk7XG4gICAgbGV0IGhhc0NvbmRpdGlvbiA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBpbmRleCBvZiB1bmlxdWVJbmRleGVzKSB7XG4gICAgICAvLyDsu6zrn7wg7KSRIO2VmOuCmOudvOuPhCBudWxs7J2066m0IOycoOuLiO2BrCDsoJzslb3snYQg7JyE67CY7ZWY7KeAIOyViuq4sCDrlYzrrLjsl5Ag7ZW064u5IOyduOuNseyKpOuKlCDrrLTsi5xcbiAgICAgIGNvbnN0IGNvbnRhaW5zTnVsbCA9IGluZGV4LmNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLm5hbWUucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuICAgICAgICByZXR1cm4gZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUgPT09IG51bGw7XG4gICAgICB9KTtcbiAgICAgIGlmIChjb250YWluc051bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHVuaXF1ZVF1ZXJ5ID0gdW5pcXVlUXVlcnkub3JXaGVyZSgocWIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgaW5kZXguY29sdW1ucykge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLm5hbWUucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUpKSB7XG4gICAgICAgICAgICBxYi53aGVyZUluKGNvbHVtbi5uYW1lLCBmaXh0dXJlLmNvbHVtbnNbZmllbGRdLnZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcWIuYW5kV2hlcmUoY29sdW1uLm5hbWUsIGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaGFzQ29uZGl0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0NvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgW3VuaXF1ZUZvdW5kXSA9IGF3YWl0IHVuaXF1ZVF1ZXJ5O1xuICAgIHJldHVybiB1bmlxdWVGb3VuZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tEdXBsaWNhdGVCeUNvbHVtbnMoXG4gICAgZGI6IEtuZXgsXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgZml4dHVyZTogRml4dHVyZVJlY29yZCxcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB3aGVyZUNsYXVzZTogRGF0YUV4cGxvcmVyUmVjb3JkID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgICAvLyByZWxhdGlvbiDtlYTrk5zsnbgg6rK97JqwIF9pZCDrtpnsnbTquLBcbiAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBjb2x1bW4pO1xuICAgICAgY29uc3QgZGJDb2x1bW4gPSBwcm9wICYmIGlzUmVsYXRpb25Qcm9wKHByb3ApID8gYCR7Y29sdW1ufV9pZGAgOiBjb2x1bW47XG4gICAgICBjb25zdCB2YWx1ZSA9IGZpeHR1cmUuY29sdW1uc1tjb2x1bW5dPy52YWx1ZTtcblxuICAgICAgLy8gbnVsbCDqsJLsnbQg7Y+s7ZWo65CcIOqyveyasCDspJHrs7Ug7ZmV7J24IOyKpO2CtVxuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHdoZXJlQ2xhdXNlW2RiQ29sdW1uXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IFtmb3VuZF0gPSBhd2FpdCBkYihlbnRpdHkudGFibGUpLndoZXJlKHdoZXJlQ2xhdXNlKS5saW1pdCgxKTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBhc3luYyBhZGRGaXh0dXJlTG9hZGVyKGNvZGU6IHN0cmluZykge1xuICAgIGNvbnN0IHBhdGggPSBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L3NyYy90ZXN0aW5nL2ZpeHR1cmUudHNgO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShwYXRoLCBcInV0ZjhcIik7XG5cbiAgICBjb25zdCBmaXh0dXJlTG9hZGVyU3RhcnQgPSBjb250ZW50LmluZGV4T2YoXCJjb25zdCBmaXh0dXJlTG9hZGVyID0ge1wiKTtcbiAgICBjb25zdCBmaXh0dXJlTG9hZGVyRW5kID0gY29udGVudC5pbmRleE9mKFwifTtcIiwgZml4dHVyZUxvYWRlclN0YXJ0KTtcblxuICAgIGlmIChmaXh0dXJlTG9hZGVyU3RhcnQgIT09IC0xICYmIGZpeHR1cmVMb2FkZXJFbmQgIT09IC0xKSB7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7Y29udGVudC5zbGljZSgwLCBmaXh0dXJlTG9hZGVyRW5kKX0gICR7Y29kZX1cXG4ke2NvbnRlbnQuc2xpY2UoZml4dHVyZUxvYWRlckVuZCl9YDtcblxuICAgICAgYXdhaXQgd3JpdGVGaWxlKHBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBmaXh0dXJlTG9hZGVyIGluIGZpeHR1cmUudHNcIik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBGaXh0dXJlTWFuYWdlciA9IG5ldyBGaXh0dXJlTWFuYWdlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErREEsU0FBUyxzQkFBc0IsT0FBcUIsWUFBbUM7Q0FDckYsT0FBTyxJQUFJLFNBQVMsU0FBUyxXQUFXO0VBQ3RDLE1BQU0sS0FBSyxTQUFTLE1BQU07RUFDMUIsTUFBTSxLQUFLLFNBQVMsTUFBTSxXQUFXO0dBQ25DLElBQUksU0FBUyxHQUFHLFFBQVE7UUFFdEIsdUJBQ0UsSUFBSSxNQUFNLEdBQUcsV0FBVyxPQUFPLFFBQVEsVUFBVSxVQUFVLGFBQWEsQ0FDMUU7RUFDSixDQUFDO0NBQ0gsQ0FBQztBQUNIO0FBRUEsU0FBUyxzQkFDUCxZQUNBLE1BQ0EsU0FDZTtDQUNmLE9BQU8sc0JBQXNCLE1BQU0sWUFBWSxNQUFNLE9BQU8sR0FBRyxVQUFVO0FBQzNFO0FBRUEsZUFBZSxvQkFDYixRQUNBLGFBQ2U7Q0FDZixNQUFNLGdCQUFnQixN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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naite-vitest-reporter.d.ts","sourceRoot":"","sources":["../../src/testing/naite-vitest-reporter.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB
|
|
1
|
+
{"version":3,"file":"naite-vitest-reporter.d.ts","sourceRoot":"","sources":["../../src/testing/naite-vitest-reporter.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB;IACxB,cAAc;IAId,YAAY;CAGnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parallel-db-manager.d.ts","sourceRoot":"","sources":["../../src/testing/parallel-db-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC;;;;;GAKG;AACH,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;
|
|
1
|
+
{"version":3,"file":"parallel-db-manager.d.ts","sourceRoot":"","sources":["../../src/testing/parallel-db-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC;;;;;GAKG;AACH,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAH7B,YACmB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,IAAI,CAAC,MAAM,EACrB,UAAU,EAAE,MAAM,EACjC;IACJ;;;OAGG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CA2C3C;IAED;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiCzC;IAED;;;OAGG;IACH,WAAW,IAAI,MAAM,CAGpB;IAED;;OAEG;IACH,cAAc,IAAI,OAAO,CAExB;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 임시 api root를 만들어 Sonamu singleton의 공개 setter로 주입합니다.
|
|
3
|
+
*
|
|
4
|
+
* tooling 연산은 `Sonamu.isInitialized`가 참이면 초기화를 건너뛰므로,
|
|
5
|
+
* 실제 DB/설정 없이 파일 경로 기반 동작만 검증할 수 있습니다.
|
|
6
|
+
*/
|
|
7
|
+
export declare function attachSonamuTestRoot(): Promise<string>;
|
|
8
|
+
/** 주입한 Sonamu 상태를 되돌리고 임시 디렉터리를 정리합니다. */
|
|
9
|
+
export declare function detachSonamuTestRoot(): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=sonamu-test-root.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sonamu-test-root.d.ts","sourceRoot":"","sources":["../../../../src/tooling/__tests__/helpers/sonamu-test-root.ts"],"names":[],"mappings":"AAWA;;;;;GAKG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAY5D;AAED,0CAA0C;AAC1C,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAS1D"}
|