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
package/dist/bin/fixture.js
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { getSonamuEnvironment, init_env } from "../env.js";
|
|
2
2
|
import { createKnexInstance, init_knex } from "../database/knex.js";
|
|
3
3
|
import { DB, init_db } from "../database/db.js";
|
|
4
|
+
import { exists, init_fs_utils } from "../utils/fs-utils.js";
|
|
4
5
|
import { Sonamu, init_sonamu } from "../api/sonamu.js";
|
|
5
6
|
import { EntityManager, init_entity_manager } from "../entity/entity-manager.js";
|
|
6
7
|
import { DataExplorer, init_data_explorer } from "../testing/data-explorer.js";
|
|
8
|
+
import { FixtureManager, init_fixture_manager } from "../testing/fixture-manager.js";
|
|
7
9
|
import { FixtureGenerator, init_fixture_generator } from "../testing/fixture-generator.js";
|
|
8
10
|
import { z } from "zod";
|
|
11
|
+
import knex from "knex";
|
|
9
12
|
import chalk from "chalk";
|
|
13
|
+
import { open } from "node:fs/promises";
|
|
14
|
+
import { spawn } from "node:child_process";
|
|
10
15
|
import prompts from "prompts";
|
|
11
16
|
//#region src/bin/fixture.ts
|
|
12
17
|
init_sonamu();
|
|
@@ -16,7 +21,136 @@ init_entity_manager();
|
|
|
16
21
|
init_env();
|
|
17
22
|
init_data_explorer();
|
|
18
23
|
init_fixture_generator();
|
|
24
|
+
init_fixture_manager();
|
|
25
|
+
init_fs_utils();
|
|
19
26
|
const SignupErrorResponse = z.object({ code: z.string().optional() }).passthrough();
|
|
27
|
+
function runProcess(executable, args, stdio = [
|
|
28
|
+
"ignore",
|
|
29
|
+
"inherit",
|
|
30
|
+
"inherit"
|
|
31
|
+
]) {
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
const child = spawn(executable, args, { stdio });
|
|
34
|
+
child.once("error", reject);
|
|
35
|
+
child.once("exit", (code, signal) => {
|
|
36
|
+
if (code === 0) resolve();
|
|
37
|
+
else reject(/* @__PURE__ */ new Error(`${executable} 명령이 ${code ?? signal ?? "unknown"} 상태로 실패했습니다.`));
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async function writeMysqlDump(args, outputPath) {
|
|
42
|
+
const output = await open(outputPath, "w");
|
|
43
|
+
try {
|
|
44
|
+
await runProcess("mysqldump", args, [
|
|
45
|
+
"ignore",
|
|
46
|
+
output.fd,
|
|
47
|
+
"inherit"
|
|
48
|
+
]);
|
|
49
|
+
} finally {
|
|
50
|
+
await output.close();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function runMysqlWithInput(args, inputPath) {
|
|
54
|
+
const input = await open(inputPath, "r");
|
|
55
|
+
try {
|
|
56
|
+
await runProcess("mysql", args, [
|
|
57
|
+
input.fd,
|
|
58
|
+
"inherit",
|
|
59
|
+
"inherit"
|
|
60
|
+
]);
|
|
61
|
+
} finally {
|
|
62
|
+
await input.close();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function mysqlConnectionArgs(connection) {
|
|
66
|
+
return [
|
|
67
|
+
`-h${String(connection.host)}`,
|
|
68
|
+
`-u${String(connection.user)}`,
|
|
69
|
+
`-p${String(connection.password)}`
|
|
70
|
+
];
|
|
71
|
+
}
|
|
72
|
+
async function fixtureInitCommand() {
|
|
73
|
+
const srcConfig = Sonamu.dbConfig[getSonamuEnvironment()];
|
|
74
|
+
const fixtureConnection = Sonamu.dbConfig.fixture.connection;
|
|
75
|
+
const testConnection = Sonamu.dbConfig.test.connection;
|
|
76
|
+
const targets = [{
|
|
77
|
+
label: "(REMOTE) Fixture DB",
|
|
78
|
+
config: Sonamu.dbConfig.fixture
|
|
79
|
+
}, {
|
|
80
|
+
label: "(LOCAL) Testing DB",
|
|
81
|
+
config: Sonamu.dbConfig.test,
|
|
82
|
+
toSkip: fixtureConnection.host === testConnection.host && fixtureConnection.database === testConnection.database
|
|
83
|
+
}];
|
|
84
|
+
const dumpFilename = `/tmp/sonamu-fixture-init-${Date.now()}.sql`;
|
|
85
|
+
const migrationsDump = `/tmp/sonamu-fixture-init-migrations-${Date.now()}.sql`;
|
|
86
|
+
const srcConnection = srcConfig.connection;
|
|
87
|
+
await writeMysqlDump([
|
|
88
|
+
...mysqlConnectionArgs(srcConnection),
|
|
89
|
+
"--single-transaction",
|
|
90
|
+
"-d",
|
|
91
|
+
"--no-create-db",
|
|
92
|
+
"--triggers",
|
|
93
|
+
String(srcConnection.database)
|
|
94
|
+
], dumpFilename);
|
|
95
|
+
const sourceDb = knex(srcConfig);
|
|
96
|
+
try {
|
|
97
|
+
const [[migrations]] = await sourceDb.raw("SELECT COUNT(*) as count FROM information_schema.tables WHERE table_schema = ? AND table_name = 'knex_migrations'", [srcConnection.database]);
|
|
98
|
+
if (migrations.count > 0) await writeMysqlDump([
|
|
99
|
+
...mysqlConnectionArgs(srcConnection),
|
|
100
|
+
"--single-transaction",
|
|
101
|
+
"--no-create-db",
|
|
102
|
+
"--triggers",
|
|
103
|
+
String(srcConnection.database),
|
|
104
|
+
"knex_migrations",
|
|
105
|
+
"knex_migrations_lock"
|
|
106
|
+
], migrationsDump);
|
|
107
|
+
for (const { label, config, toSkip } of targets) {
|
|
108
|
+
const connection = config.connection;
|
|
109
|
+
if (toSkip === true) {
|
|
110
|
+
console.log(chalk.red(`${label}: Skipped!`));
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const databaseConnection = config.connection ?? {};
|
|
114
|
+
const db = knex({
|
|
115
|
+
...config,
|
|
116
|
+
connection: {
|
|
117
|
+
...databaseConnection,
|
|
118
|
+
database: void 0
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
try {
|
|
122
|
+
const [[row]] = await db.raw(`SHOW DATABASES LIKE "${connection.database}"`);
|
|
123
|
+
if (row) {
|
|
124
|
+
console.log(chalk.yellow(`${label}: Database "${connection.database}" Already exists`));
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const connectionArgs = mysqlConnectionArgs(connection);
|
|
128
|
+
const database = String(connection.database);
|
|
129
|
+
const escapedDatabase = database.replaceAll("`", "``");
|
|
130
|
+
await runProcess("mysql", [
|
|
131
|
+
...connectionArgs,
|
|
132
|
+
"-e",
|
|
133
|
+
`DROP DATABASE IF EXISTS \`${escapedDatabase}\``
|
|
134
|
+
]);
|
|
135
|
+
await runProcess("mysql", [
|
|
136
|
+
...connectionArgs,
|
|
137
|
+
"-e",
|
|
138
|
+
`CREATE DATABASE \`${escapedDatabase}\``
|
|
139
|
+
]);
|
|
140
|
+
await runMysqlWithInput([...connectionArgs, database], dumpFilename);
|
|
141
|
+
if (await exists(migrationsDump)) await runMysqlWithInput([...connectionArgs, database], migrationsDump);
|
|
142
|
+
} finally {
|
|
143
|
+
await db.destroy();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
} finally {
|
|
147
|
+
await sourceDb.destroy();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async function fixtureCleanupCommand() {
|
|
151
|
+
await FixtureManager.destroy();
|
|
152
|
+
await Sonamu.destroy();
|
|
153
|
+
}
|
|
20
154
|
/**
|
|
21
155
|
* username을 일반적인 규칙(영문자 시작, 영문자/숫자만, 1-20자)에 맞도록 정규화합니다.
|
|
22
156
|
*/
|
|
@@ -40,6 +174,10 @@ async function fixtureGenCommand(options) {
|
|
|
40
174
|
entityNames = entityNames.filter((name) => !excludeList.includes(name));
|
|
41
175
|
}
|
|
42
176
|
} else if (options.include) entityNames = options.include.split(",").map((s) => s.trim());
|
|
177
|
+
else if (options.nonInteractive === true) throw Object.assign(/* @__PURE__ */ new Error("Fixture gen selector is required."), {
|
|
178
|
+
code: "MISSING_ARGUMENT",
|
|
179
|
+
exitCode: 2
|
|
180
|
+
});
|
|
43
181
|
else {
|
|
44
182
|
const result = await prompts({
|
|
45
183
|
type: "multiselect",
|
|
@@ -57,8 +195,8 @@ async function fixtureGenCommand(options) {
|
|
|
57
195
|
}
|
|
58
196
|
entityNames = result.entities;
|
|
59
197
|
}
|
|
60
|
-
let count = options.count ? Number.parseInt(options.count, 10) : 5;
|
|
61
|
-
if (!options.count) {
|
|
198
|
+
let count = options.count ? Number.parseInt(String(options.count), 10) : 5;
|
|
199
|
+
if (!options.count && options.nonInteractive !== true) {
|
|
62
200
|
const result = await prompts({
|
|
63
201
|
type: "number",
|
|
64
202
|
name: "count",
|
|
@@ -73,7 +211,9 @@ async function fixtureGenCommand(options) {
|
|
|
73
211
|
count = result.count;
|
|
74
212
|
}
|
|
75
213
|
if (entityNames.includes("User")) {
|
|
76
|
-
|
|
214
|
+
let userMode = options.userMode;
|
|
215
|
+
if (userMode === void 0 && options.nonInteractive === true) userMode = "dummy";
|
|
216
|
+
if (userMode === void 0) userMode = (await prompts({
|
|
77
217
|
type: "select",
|
|
78
218
|
name: "userMode",
|
|
79
219
|
message: "User 엔티티가 포함되어 있습니다. 생성 방식을 선택하세요:",
|
|
@@ -84,14 +224,14 @@ async function fixtureGenCommand(options) {
|
|
|
84
224
|
title: "2. 확인용 데이터(로그인 불가) 생성",
|
|
85
225
|
value: "dummy"
|
|
86
226
|
}]
|
|
87
|
-
});
|
|
88
|
-
if (!
|
|
227
|
+
})).userMode;
|
|
228
|
+
if (!userMode) {
|
|
89
229
|
console.log(chalk.yellow("취소되었습니다."));
|
|
90
230
|
return;
|
|
91
231
|
}
|
|
92
|
-
if (
|
|
232
|
+
if (userMode === "login") {
|
|
93
233
|
let useLLM = options["use-llm"] ?? false;
|
|
94
|
-
if (
|
|
234
|
+
if (options["use-llm"] === void 0 && options.nonInteractive !== true) useLLM = (await prompts({
|
|
95
235
|
type: "confirm",
|
|
96
236
|
name: "useLLM",
|
|
97
237
|
message: "LLM으로 더 현실적인 데이터를 생성할까요? (fixtureHint 기반, ANTHROPIC_API_KEY 필요)",
|
|
@@ -160,7 +300,7 @@ async function fixtureGenCommand(options) {
|
|
|
160
300
|
}
|
|
161
301
|
}
|
|
162
302
|
let saveTarget = options["save-to"] || "db";
|
|
163
|
-
if (!options["save-to"]) {
|
|
303
|
+
if (!options["save-to"] && options.nonInteractive !== true) {
|
|
164
304
|
saveTarget = (await prompts({
|
|
165
305
|
type: "select",
|
|
166
306
|
name: "saveTarget",
|
|
@@ -199,7 +339,7 @@ async function fixtureGenCommand(options) {
|
|
|
199
339
|
}
|
|
200
340
|
}
|
|
201
341
|
let useLLM = options["use-llm"] ?? false;
|
|
202
|
-
if (
|
|
342
|
+
if (options["use-llm"] === void 0 && options.nonInteractive !== true) useLLM = (await prompts({
|
|
203
343
|
type: "confirm",
|
|
204
344
|
name: "useLLM",
|
|
205
345
|
message: "LLM으로 더 현실적인 데이터를 생성할까요? (fixtureHint 기반, ANTHROPIC_API_KEY 필요)",
|
|
@@ -266,6 +406,10 @@ async function fixtureFetchCommand(options) {
|
|
|
266
406
|
entityNames = entityNames.filter((name) => !excludeList.includes(name));
|
|
267
407
|
}
|
|
268
408
|
} else if (options.include) entityNames = options.include.split(",").map((s) => s.trim());
|
|
409
|
+
else if (options.nonInteractive === true) throw Object.assign(/* @__PURE__ */ new Error("Fixture fetch selector is required."), {
|
|
410
|
+
code: "MISSING_ARGUMENT",
|
|
411
|
+
exitCode: 2
|
|
412
|
+
});
|
|
269
413
|
else {
|
|
270
414
|
const result = await prompts({
|
|
271
415
|
type: "multiselect",
|
|
@@ -284,7 +428,7 @@ async function fixtureFetchCommand(options) {
|
|
|
284
428
|
entityNames = result.entities;
|
|
285
429
|
}
|
|
286
430
|
const strategy = options.strategy ?? "recent";
|
|
287
|
-
const limit = options.limit ? Number.parseInt(options.limit, 10) : 10;
|
|
431
|
+
const limit = options.limit ? Number.parseInt(String(options.limit), 10) : 10;
|
|
288
432
|
const generator = new FixtureGenerator(DB.getDB("r"), createKnexInstance(Sonamu.dbConfig.fixture), "fixture", EntityManager);
|
|
289
433
|
console.log(chalk.cyan(`\n${entityNames.join(", ")} import 중...`));
|
|
290
434
|
for (const entityName of entityNames) {
|
|
@@ -309,6 +453,10 @@ async function fixtureExploreCommand(options) {
|
|
|
309
453
|
try {
|
|
310
454
|
if (!EntityManager.isAutoloaded) await EntityManager.autoload();
|
|
311
455
|
let entityName = options.include;
|
|
456
|
+
if (!entityName && options.nonInteractive === true) throw Object.assign(/* @__PURE__ */ new Error("Fixture explore selector is required."), {
|
|
457
|
+
code: "MISSING_ARGUMENT",
|
|
458
|
+
exitCode: 2
|
|
459
|
+
});
|
|
312
460
|
if (!entityName) {
|
|
313
461
|
const result = await prompts({
|
|
314
462
|
type: "select",
|
|
@@ -327,7 +475,7 @@ async function fixtureExploreCommand(options) {
|
|
|
327
475
|
}
|
|
328
476
|
if (!entityName) throw new Error("Entity name is required");
|
|
329
477
|
const strategy = options.strategy ?? "sample";
|
|
330
|
-
const limit = options.limit ? Number.parseInt(options.limit, 10) : 10;
|
|
478
|
+
const limit = options.limit ? Number.parseInt(String(options.limit), 10) : 10;
|
|
331
479
|
const data = await new DataExplorer(DB.getDB("r"), EntityManager).explore(entityName, {
|
|
332
480
|
strategy,
|
|
333
481
|
limit
|
|
@@ -340,6 +488,6 @@ async function fixtureExploreCommand(options) {
|
|
|
340
488
|
}
|
|
341
489
|
}
|
|
342
490
|
//#endregion
|
|
343
|
-
export { fixtureExploreCommand, fixtureFetchCommand, fixtureGenCommand };
|
|
491
|
+
export { fixtureCleanupCommand, fixtureExploreCommand, fixtureFetchCommand, fixtureGenCommand, fixtureInitCommand };
|
|
344
492
|
|
|
345
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL2ZpeHR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHByb21wdHMgZnJvbSBcInByb21wdHNcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBEQiB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgY3JlYXRlS25leEluc3RhbmNlIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2tuZXhcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBnZXRTb25hbXVFbnZpcm9ubWVudCB9IGZyb20gXCIuLi9lbnZcIjtcbmltcG9ydCB7IERhdGFFeHBsb3JlciB9IGZyb20gXCIuLi90ZXN0aW5nL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IHR5cGUgRGF0YUV4cGxvcmVyU3RyYXRlZ3kgfSBmcm9tIFwiLi4vdGVzdGluZy9kYXRhLWV4cGxvcmVyXCI7XG5pbXBvcnQgeyBGaXh0dXJlR2VuZXJhdG9yIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1nZW5lcmF0b3JcIjtcblxuaW50ZXJmYWNlIEZpeHR1cmVDb21tYW5kT3B0aW9ucyB7XG4gIF8/OiBzdHJpbmdbXTtcbiAgYWxsPzogYm9vbGVhbjtcbiAgaW5jbHVkZT86IHN0cmluZztcbiAgZXhjbHVkZT86IHN0cmluZztcbiAgY291bnQ/OiBzdHJpbmc7XG4gIFwic2F2ZS10b1wiPzogc3RyaW5nO1xuICBzdHJhdGVneT86IERhdGFFeHBsb3JlclN0cmF0ZWd5O1xuICBsaW1pdD86IHN0cmluZztcbiAgXCJ1c2UtbGxtXCI/OiBib29sZWFuO1xuICBcIm5vLWNhY2hlXCI/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgU2lnbnVwQm9keSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZW1haWw6IHN0cmluZztcbiAgdXNlcm5hbWU6IHN0cmluZztcbiAgcGFzc3dvcmQ6IHN0cmluZztcbiAgZGlzcGxheV91c2VybmFtZT86IHN0cmluZztcbn1cblxuY29uc3QgU2lnbnVwRXJyb3JSZXNwb25zZSA9IHoub2JqZWN0KHsgY29kZTogei5zdHJpbmcoKS5vcHRpb25hbCgpIH0pLnBhc3N0aHJvdWdoKCk7XG5cbi8qKlxuICogdXNlcm5hbWXsnYQg7J2867CY7KCB7J24IOq3nOy5mSjsmIHrrLjsnpAg7Iuc7J6RLCDsmIHrrLjsnpAv7Iir7J6Q66eMLCAxLTIw7J6QKeyXkCDrp57rj4TroZ0g7KCV6rec7ZmU7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBzYW5pdGl6ZVVzZXJuYW1lKHJhdzogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8g7IaM66y47J6QIOuzgO2ZmCDtm4Qg7JiB66y47J6QL+yIq+yekCDsmbgg66y47J6QIOygnOqxsFxuICBsZXQgdXNlcm5hbWUgPSByYXcudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0vZywgXCJcIik7XG4gIGlmICh1c2VybmFtZS5sZW5ndGggPT09IDApIHtcbiAgICB1c2VybmFtZSA9IFwidXNlclwiO1xuICB9XG4gIC8vIOyyqyDquIDsnpDqsIAg7Iir7J6Q66m0ICd1JyDsoJHrkZDslrQg7LaU6rCAXG4gIGlmICgvXlswLTldLy50ZXN0KHVzZXJuYW1lKSkge1xuICAgIHVzZXJuYW1lID0gYHUke3VzZXJuYW1lfWA7XG4gIH1cbiAgLy8gMjDsnpAg7LSI6rO8IOyLnCB0cnVuY2F0ZVxuICByZXR1cm4gdXNlcm5hbWUuc2xpY2UoMCwgMjApO1xufVxuXG4vKipcbiAqIGZpeHR1cmUgZ2VuIOuqheugueyWtCAtIGNvbmUg66mU7YOA642w7J207YSw66W8IO2ZnOyaqe2VmOyXrCDsnpDrj5nsnLzroZwgZml4dHVyZeulvCDsg53shLHtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXh0dXJlR2VuQ29tbWFuZChvcHRpb25zOiBGaXh0dXJlQ29tbWFuZE9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIUVudGl0eU1hbmFnZXIuaXNBdXRvbG9hZGVkKSB7XG4gICAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgfVxuXG4gICAgbGV0IGVudGl0eU5hbWVzOiBzdHJpbmdbXTtcblxuICAgIGlmIChvcHRpb25zLmFsbCkge1xuICAgICAgZW50aXR5TmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgaWYgKG9wdGlvbnMuZXhjbHVkZSkge1xuICAgICAgICBjb25zdCBleGNsdWRlTGlzdCA9IG9wdGlvbnMuZXhjbHVkZS5zcGxpdChcIixcIikubWFwKChzOiBzdHJpbmcpID0+IHMudHJpbSgpKTtcbiAgICAgICAgZW50aXR5TmFtZXMgPSBlbnRpdHlOYW1lcy5maWx0ZXIoKG5hbWUpID0+ICFleGNsdWRlTGlzdC5pbmNsdWRlcyhuYW1lKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGUpIHtcbiAgICAgIGVudGl0eU5hbWVzID0gb3B0aW9ucy5pbmNsdWRlLnNwbGl0KFwiLFwiKS5tYXAoKHM6IHN0cmluZykgPT4gcy50cmltKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJtdWx0aXNlbGVjdFwiLFxuICAgICAgICBuYW1lOiBcImVudGl0aWVzXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiRml4dHVyZeulvCDsg53shLHtlaAgRW50aXR566W8IOyEoO2Dne2VmOyEuOyalDpcIixcbiAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKS5tYXAoKGlkKSA9PiAoeyB0aXRsZTogaWQsIHZhbHVlOiBpZCB9KSksXG4gICAgICAgIG1pbjogMSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3VsdC5lbnRpdGllcyB8fCByZXN1bHQuZW50aXRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGVudGl0eU5hbWVzID0gcmVzdWx0LmVudGl0aWVzO1xuICAgIH1cblxuICAgIGxldCBjb3VudCA9IG9wdGlvbnMuY291bnQgPyBOdW1iZXIucGFyc2VJbnQob3B0aW9ucy5jb3VudCwgMTApIDogNTtcbiAgICBpZiAoIW9wdGlvbnMuY291bnQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBuYW1lOiBcImNvdW50XCIsXG4gICAgICAgIG1lc3NhZ2U6IFwi6rCBIEVudGl0eeuzhCDsg53shLEg6rCc7IiYOlwiLFxuICAgICAgICBpbml0aWFsOiA1LFxuICAgICAgICBtaW46IDEsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuY291bnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwi7Leo7IaM65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY291bnQgPSByZXN1bHQuY291bnQ7XG4gICAgfVxuXG4gICAgLy8gVXNlciDsl5Tti7Dti7DqsIAg7Y+s7ZWo65CcIOqyveyasDog66Gc6re47J24IOqwgOuKpS/tmZXsnbjsmqkg67aE6riwIOyEoO2DnVxuICAgIGNvbnN0IGhhc1VzZXIgPSBlbnRpdHlOYW1lcy5pbmNsdWRlcyhcIlVzZXJcIik7XG5cbiAgICBpZiAoaGFzVXNlcikge1xuICAgICAgY29uc3QgdXNlck1vZGVSZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJzZWxlY3RcIixcbiAgICAgICAgbmFtZTogXCJ1c2VyTW9kZVwiLFxuICAgICAgICBtZXNzYWdlOiBcIlVzZXIg7JeU7Yuw7Yuw6rCAIO2PrO2VqOuQmOyWtCDsnojsirXri4jri6QuIOyDneyEsSDrsKnsi53snYQg7ISg7YOd7ZWY7IS47JqUOlwiLFxuICAgICAgICBjaG9pY2VzOiBbXG4gICAgICAgICAgeyB0aXRsZTogXCIxLiDroZzqt7jsnbgg6rCA64ql7ZWcIOyCrOyaqeyekCBmaXh0dXJlIOyDneyEsVwiLCB2YWx1ZTogXCJsb2dpblwiIH0sXG4gICAgICAgICAgeyB0aXRsZTogXCIyLiDtmZXsnbjsmqkg642w7J207YSwKOuhnOq3uOyduCDrtojqsIApIOyDneyEsVwiLCB2YWx1ZTogXCJkdW1teVwiIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgaWYgKCF1c2VyTW9kZVJlc3VsdC51c2VyTW9kZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodXNlck1vZGVSZXN1bHQudXNlck1vZGUgPT09IFwibG9naW5cIikge1xuICAgICAgICAvLyBMTE0g7IKs7JqpIOyXrOu2gFxuICAgICAgICBsZXQgdXNlTExNID0gb3B0aW9uc1tcInVzZS1sbG1cIl0gPz8gZmFsc2U7XG4gICAgICAgIGlmICghb3B0aW9uc1tcInVzZS1sbG1cIl0pIHtcbiAgICAgICAgICBjb25zdCBsbG1SZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgICAgIHR5cGU6IFwiY29uZmlybVwiLFxuICAgICAgICAgICAgbmFtZTogXCJ1c2VMTE1cIixcbiAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgIFwiTExN7Jy866GcIOuNlCDtmITsi6TsoIHsnbgg642w7J207YSw66W8IOyDneyEse2VoOq5jOyalD8gKGZpeHR1cmVIaW50IOq4sOuwmCwgQU5USFJPUElDX0FQSV9LRVkg7ZWE7JqUKVwiLFxuICAgICAgICAgICAgaW5pdGlhbDogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdXNlTExNID0gbGxtUmVzdWx0LnVzZUxMTSA/PyBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVuYWJsZUxMTUNhY2hlID0gIW9wdGlvbnNbXCJuby1jYWNoZVwiXTtcbiAgICAgICAgY29uc3QgREVGQVVMVF9QQVNTV09SRCA9IFwiVGVzdDEyMzQhXCI7XG5cbiAgICAgICAgLy8g66Gc6re47J24IOqwgOuKpSDqsr3roZzsl5DshJzripQg7ZiE7J6sIO2ZmOqyveydmCDsnb3quLAgRELrpbwgc291cmNlRGLroZwg7IKs7JqpXG4gICAgICAgIGNvbnN0IHNvdXJjZURiID0gREIuZ2V0REIoXCJyXCIpO1xuICAgICAgICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgRml4dHVyZUdlbmVyYXRvcihcbiAgICAgICAgICBzb3VyY2VEYixcbiAgICAgICAgICBzb3VyY2VEYixcbiAgICAgICAgICBnZXRTb25hbXVFbnZpcm9ubWVudCgpLFxuICAgICAgICAgIEVudGl0eU1hbmFnZXIsXG4gICAgICAgICAgeyB1c2VMTE0sIGVuYWJsZUxMTUNhY2hlIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgY3JlYXRlZENyZWRlbnRpYWxzOiBBcnJheTx7IGVtYWlsOiBzdHJpbmc7IHBhc3N3b3JkOiBzdHJpbmcgfT4gPSBbXTtcbiAgICAgICAgY29uc3QgYmFzZVBhdGggPSBTb25hbXUuY29uZmlnLnNlcnZlci5hdXRoPy5iYXNlUGF0aCA/PyBcIi9hcGkvYXV0aFwiO1xuXG4gICAgICAgIGlmICh1c2VMTE0pIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgICAgIGBcXG5MTE0g66qo65Oc66GcIOuhnOq3uOyduCDqsIDriqXtlZwg7IKs7Jqp7J6QICR7Y291bnR966qFIOyDneyEsSDspJEuLi4gKOy6kOyLsTogJHtlbmFibGVMTE1DYWNoZSA/IFwiT05cIiA6IFwiT0ZGXCJ9KWAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxu66Gc6re47J24IOqwgOuKpe2VnCDsgqzsmqnsnpAgJHtjb3VudH3rqoUg7IOd7ISxIOykkS4uLmApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHVzZXJEYXRhID0gYXdhaXQgZ2VuZXJhdG9yLmdlbmVyYXRlKFwiVXNlclwiKTtcblxuICAgICAgICAgIGNvbnN0IG5hbWUgPSBTdHJpbmcodXNlckRhdGEubmFtZSA/PyBcIlwiKTtcbiAgICAgICAgICBjb25zdCBlbWFpbCA9IFN0cmluZyh1c2VyRGF0YS5lbWFpbCA/PyBcIlwiKTtcbiAgICAgICAgICBjb25zdCB1c2VybmFtZSA9IHNhbml0aXplVXNlcm5hbWUoU3RyaW5nKHVzZXJEYXRhLnVzZXJuYW1lID8/IFwiXCIpKTtcbiAgICAgICAgICBjb25zdCBkaXNwbGF5VXNlcm5hbWUgPVxuICAgICAgICAgICAgdXNlckRhdGEuZGlzcGxheV91c2VybmFtZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHVzZXJEYXRhLmRpc3BsYXlfdXNlcm5hbWUpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgY29uc3QgYm9keTogU2lnbnVwQm9keSA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBlbWFpbCxcbiAgICAgICAgICAgIHVzZXJuYW1lLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IERFRkFVTFRfUEFTU1dPUkQsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoZGlzcGxheVVzZXJuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGJvZHkuZGlzcGxheV91c2VybmFtZSA9IGRpc3BsYXlVc2VybmFtZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZXEgPSBuZXcgUmVxdWVzdChgaHR0cDovL2xvY2FsaG9zdCR7YmFzZVBhdGh9L3NpZ24tdXAvZW1haWxgLCB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IFNvbmFtdS5hdXRoLmhhbmRsZXIocmVxKTtcblxuICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IFNpZ251cEVycm9yUmVzcG9uc2UucGFyc2UoYXdhaXQgcmVzcG9uc2UuanNvbigpKTtcbiAgICAgICAgICAgIGNvbnN0IGNvZGUgPSByZXNwb25zZURhdGEuY29kZTtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSBcIlVTRVJfQUxSRUFEWV9FWElTVFNcIikge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCAg4pqg77iPICAke2VtYWlsfSDsnbTrr7gg7KG07J6sIC0g6rG064SI65yB64uI64ukLmApKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCAg4p2MICR7ZW1haWx9IOyDneyEsSDsi6TtjKg6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2VEYXRhKX1gKSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjcmVhdGVkQ3JlZGVudGlhbHMucHVzaCh7IGVtYWlsLCBwYXNzd29yZDogREVGQVVMVF9QQVNTV09SRCB9KTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgICDinIUgJHtlbWFpbH0g7IOd7ISxIOyZhOujjGApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVtYWlsX3ZlcmlmaWVkID0gdHJ1ZSDsp4HsoJEg7JeF642w7J207Yq4IChkZXYg7Y647J2YKVxuICAgICAgICBpZiAoY3JlYXRlZENyZWRlbnRpYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBlbWFpbHMgPSBjcmVhdGVkQ3JlZGVudGlhbHMubWFwKChjKSA9PiBjLmVtYWlsKTtcbiAgICAgICAgICBhd2FpdCBEQi5nZXREQihcIndcIikoXCJ1c2Vyc1wiKS53aGVyZUluKFwiZW1haWxcIiwgZW1haWxzKS51cGRhdGUoeyBlbWFpbF92ZXJpZmllZDogdHJ1ZSB9KTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgXFxuZW1haWxfdmVyaWZpZWQgPSB0cnVlIOyXheuNsOydtO2KuCDsmYTro4xgKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXNlTExNKSB7XG4gICAgICAgICAgY29uc3Qgc3RhdHMgPSBnZW5lcmF0b3IuZ2V0TExNQ2FjaGVTdGF0cygpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYFtMTE0gQ2FjaGVdIOy6kOyLnCDtgazquLA6ICR7c3RhdHMuc2l6ZX1gKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5ncmVlbihgXFxu4pyFICR7Y3JlYXRlZENyZWRlbnRpYWxzLmxlbmd0aH3rqoXsnZgg66Gc6re47J24IOqwgOuKpe2VnCDsgqzsmqnsnpAg7IOd7ISxIOyZhOujjGApLFxuICAgICAgICApO1xuICAgICAgICBpZiAoY3JlYXRlZENyZWRlbnRpYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlxcbuyDneyEseuQnCDqs4TsoJUg66qp66GdOlwiKTtcbiAgICAgICAgICBjb25zb2xlLnRhYmxlKGNyZWF0ZWRDcmVkZW50aWFscyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyB1c2VyTW9kZSA9PT0gXCJkdW1teVwiOiDquLDsobQgZ2VuZXJhdGVCYXRjaCgpIO2dkOumhCDqs4Tsho1cbiAgICB9XG5cbiAgICBsZXQgc2F2ZVRhcmdldCA9IG9wdGlvbnNbXCJzYXZlLXRvXCJdIHx8IFwiZGJcIjtcbiAgICBpZiAoIW9wdGlvbnNbXCJzYXZlLXRvXCJdKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJzZWxlY3RcIixcbiAgICAgICAgbmFtZTogXCJzYXZlVGFyZ2V0XCIsXG4gICAgICAgIG1lc3NhZ2U6IFwi7KCA7J6lIOuwqeyLnTpcIixcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgIHsgdGl0bGU6IFwiRml4dHVyZSBEQuyXkCDsoIDsnqVcIiwgdmFsdWU6IFwiZGJcIiB9LFxuICAgICAgICAgIHsgdGl0bGU6IFwi7YyM7J2866GcIOyggOyepSAo7J6Q64+ZIO2MjOydvOuqhSlcIiwgdmFsdWU6IFwiZmlsZVwiIH0sXG4gICAgICAgICAgeyB0aXRsZTogXCLtjIzsnbzroZwg7KCA7J6lICjtjIzsnbzrqoUg7KeA7KCVKVwiLCB2YWx1ZTogXCJmaWxlOmN1c3RvbVwiIH0sXG4gICAgICAgICAgeyB0aXRsZTogXCLsoIDsnqUg7JWIIO2VqCAo7Lac66Cl66eMKVwiLCB2YWx1ZTogXCJub25lXCIgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBzYXZlVGFyZ2V0ID0gcmVzdWx0LnNhdmVUYXJnZXQ7XG5cbiAgICAgIGlmIChzYXZlVGFyZ2V0ID09PSBcImZpbGU6Y3VzdG9tXCIpIHtcbiAgICAgICAgY29uc3QgZmlsZW5hbWVSZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICBuYW1lOiBcImZpbGVuYW1lXCIsXG4gICAgICAgICAgbWVzc2FnZTogXCLtjIzsnbzrqoU6XCIsXG4gICAgICAgICAgaW5pdGlhbDogXCJmaXh0dXJlcy5qc29uXCIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghZmlsZW5hbWVSZXN1bHQuZmlsZW5hbWUpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzYXZlVGFyZ2V0ID0gYGZpbGU6JHtmaWxlbmFtZVJlc3VsdC5maWxlbmFtZX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExMTSDsgqzsmqkg7Jes67aAIOqysOyglVxuICAgIGxldCB1c2VMTE0gPSBvcHRpb25zW1widXNlLWxsbVwiXSA/PyBmYWxzZTtcbiAgICBpZiAoIW9wdGlvbnNbXCJ1c2UtbGxtXCJdKSB7XG4gICAgICBjb25zdCBsbG1SZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJjb25maXJtXCIsXG4gICAgICAgIG5hbWU6IFwidXNlTExNXCIsXG4gICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgXCJMTE3snLzroZwg642UIO2YhOyLpOyggeyduCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWg6rmM7JqUPyAoZml4dHVyZUhpbnQg6riw67CYLCBBTlRIUk9QSUNfQVBJX0tFWSDtlYTsmpQpXCIsXG4gICAgICAgIGluaXRpYWw6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICB1c2VMTE0gPSBsbG1SZXN1bHQudXNlTExNID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGVuYWJsZUxMTUNhY2hlID0gIW9wdGlvbnNbXCJuby1jYWNoZVwiXTtcblxuICAgIC8vIGZpeHR1cmUgZ2VuOiBmaXh0dXJlIERCIOuCtOyXkOyEnCDssLjsobAg6rSA6rOE66W8IO2VtOqysO2VmOqzoCDsoIDsnqXtlanri4jri6RcbiAgICBjb25zdCBmaXh0dXJlRGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuICAgIGNvbnN0IGdlbmVyYXRvciA9IG5ldyBGaXh0dXJlR2VuZXJhdG9yKGZpeHR1cmVEYiwgZml4dHVyZURiLCBcImZpeHR1cmVcIiwgRW50aXR5TWFuYWdlciwge1xuICAgICAgdXNlTExNLFxuICAgICAgZW5hYmxlTExNQ2FjaGUsXG4gICAgfSk7XG5cbiAgICBpZiAodXNlTExNKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICBgXFxuTExNIOuqqOuTnOuhnCAke2VudGl0eU5hbWVzLmpvaW4oXCIsIFwiKX0g7IOd7ISxIOykkS4uLiAo7LqQ7IuxOiAke2VuYWJsZUxMTUNhY2hlID8gXCJPTlwiIDogXCJPRkZcIn0pYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYFxcbiR7ZW50aXR5TmFtZXMuam9pbihcIiwgXCIpfSDsg53shLEg7KSRLi4uYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHNwZWNzID0gZW50aXR5TmFtZXMubWFwKChlbnRpdHlOYW1lKSA9PiAoe1xuICAgICAgZW50aXR5OiBlbnRpdHlOYW1lLFxuICAgICAgY291bnQsXG4gICAgICBvdmVycmlkZXM6IHt9LFxuICAgIH0pKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBnZW5lcmF0b3IuZ2VuZXJhdGVCYXRjaChzcGVjcyk7XG5cbiAgICBpZiAodXNlTExNKSB7XG4gICAgICBjb25zdCBzdGF0cyA9IGdlbmVyYXRvci5nZXRMTE1DYWNoZVN0YXRzKCk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBbTExNIENhY2hlXSDsupDsi5wg7YGs6riwOiAke3N0YXRzLnNpemV9YCkpO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGBcXG7inIUgJHtyZXN1bHRzLmxlbmd0aH3qsJwgZml4dHVyZSDsg53shLEg7JmE66OMYCkpO1xuXG4gICAgaWYgKHNhdmVUYXJnZXQgPT09IFwibm9uZVwiKSB7XG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHRzLCBudWxsLCAyKSk7XG4gICAgfSBlbHNlIGlmIChzYXZlVGFyZ2V0ID09PSBcImRiXCIpIHtcbiAgICAgIC8vIGdlbmVyYXRlQmF0Y2jqsIAg7J2066+4IERC7JeQIOyggOyepe2WiOycvOuvgOuhnCDrs4Trj4Qg7KCA7J6l7J20IOu2iO2VhOyalO2VqeuLiOuLpC5cbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiRml4dHVyZSBEQuyXkCDsoIDsnqXrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICB9IGVsc2UgaWYgKHNhdmVUYXJnZXQuc3RhcnRzV2l0aChcImZpbGVcIikpIHtcbiAgICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcbiAgICAgIGNvbnN0IHBhdGggPSBhd2FpdCBpbXBvcnQoXCJub2RlOnBhdGhcIik7XG5cbiAgICAgIGNvbnN0IGZpeHR1cmVzRGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwidGVzdFwiLCBcImZpeHR1cmVzXCIpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpeHR1cmVzRGlyKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBhd2FpdCBmcy5ta2RpcihmaXh0dXJlc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZW50aXR5TmFtZSBvZiBlbnRpdHlOYW1lcykge1xuICAgICAgICBjb25zdCBlbnRpdHlSZXN1bHRzID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuZW50aXR5SWQgPT09IGVudGl0eU5hbWUpO1xuXG4gICAgICAgIGlmIChlbnRpdHlSZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgICAgIGlmIChzYXZlVGFyZ2V0ID09PSBcImZpbGVcIikge1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eU5hbWUpO1xuICAgICAgICAgIGZpbGVuYW1lID0gYCR7ZW50aXR5LnRhYmxlfS5qc29uYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWxlbmFtZSA9IHNhdmVUYXJnZXQucmVwbGFjZShcImZpbGU6XCIsIFwiXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4oZml4dHVyZXNEaXIsIGZpbGVuYW1lKTtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgICAgICAgIGZpbGVwYXRoLFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgZW50aXR5UmVzdWx0cy5tYXAoKHIpID0+IHIuZGF0YSksXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgMixcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyFICR7ZmlsZXBhdGh9IOyggOyepSDsmYTro4xgKSk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwiRml4dHVyZSDsg53shLEg7KSRIOyYpOulmOqwgCDrsJzsg53tlojsirXri4jri6QuXFxuXCIgK1xuICAgICAgICAgIFwi7JuQ7J24OiBFbnRpdHkg7KCV7J2Y64KYIERCIOyXsOqysOydhCDtmZXsnbjtlbTso7zshLjsmpQuXFxuXCIgK1xuICAgICAgICAgIFwi7J6Q7IS47ZWcIOuCtOyaqTpcIixcbiAgICAgICksXG4gICAgICBlcnJvcixcbiAgICApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogZml4dHVyZSBmZXRjaCDrqoXroLnslrQgLSDsi6TsoJwg7Jq07JiBIERC7JeQ7IScIOuNsOydtO2EsOulvCDqsIDsoLjsmYAgZml4dHVyZeuhnCDsoIDsnqXtlanri4jri6QuXG4gKiDqtIDqs4TrkJwg642w7J207YSw64+EIO2VqOq7mCDqsIDsoLjsmKTrr4DroZwg7ZiE7Iuk7KCB7J24IO2FjOyKpO2KuCDrjbDsnbTthLDrpbwg7ZmV67O07ZWgIOyImCDsnojsirXri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXh0dXJlRmV0Y2hDb21tYW5kKG9wdGlvbnM6IEZpeHR1cmVDb21tYW5kT3B0aW9ucykge1xuICB0cnkge1xuICAgIGlmICghRW50aXR5TWFuYWdlci5pc0F1dG9sb2FkZWQpIHtcbiAgICAgIGF3YWl0IEVudGl0eU1hbmFnZXIuYXV0b2xvYWQoKTtcbiAgICB9XG5cbiAgICBsZXQgZW50aXR5TmFtZXM6IHN0cmluZ1tdO1xuXG4gICAgaWYgKG9wdGlvbnMuYWxsKSB7XG4gICAgICBlbnRpdHlOYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgICBpZiAob3B0aW9ucy5leGNsdWRlKSB7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVMaXN0ID0gb3B0aW9ucy5leGNsdWRlLnNwbGl0KFwiLFwiKS5tYXAoKHM6IHN0cmluZykgPT4gcy50cmltKCkpO1xuICAgICAgICBlbnRpdHlOYW1lcyA9IGVudGl0eU5hbWVzLmZpbHRlcigobmFtZSkgPT4gIWV4Y2x1ZGVMaXN0LmluY2x1ZGVzKG5hbWUpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaW5jbHVkZSkge1xuICAgICAgZW50aXR5TmFtZXMgPSBvcHRpb25zLmluY2x1ZGUuc3BsaXQoXCIsXCIpLm1hcCgoczogc3RyaW5nKSA9PiBzLnRyaW0oKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICB0eXBlOiBcIm11bHRpc2VsZWN0XCIsXG4gICAgICAgIG5hbWU6IFwiZW50aXRpZXNcIixcbiAgICAgICAgbWVzc2FnZTogXCJJbXBvcnTtlaAgRW50aXR566W8IOyEoO2Dne2VmOyEuOyalDpcIixcbiAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKS5tYXAoKGlkKSA9PiAoeyB0aXRsZTogaWQsIHZhbHVlOiBpZCB9KSksXG4gICAgICAgIG1pbjogMSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3VsdC5lbnRpdGllcyB8fCByZXN1bHQuZW50aXRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGVudGl0eU5hbWVzID0gcmVzdWx0LmVudGl0aWVzO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cmF0ZWd5OiBEYXRhRXhwbG9yZXJTdHJhdGVneSA9IG9wdGlvbnMuc3RyYXRlZ3kgPz8gXCJyZWNlbnRcIjtcbiAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnMubGltaXQgPyBOdW1iZXIucGFyc2VJbnQob3B0aW9ucy5saW1pdCwgMTApIDogMTA7XG5cbiAgICAvLyBmaXh0dXJlIGZldGNoOiDtmITsnqwg7ZmY6rK9IOuNsOydtO2EsOulvCBmaXh0dXJlIERC66GcIGltcG9ydO2VqeuLiOuLpFxuICAgIGNvbnN0IHNvdXJjZURiID0gREIuZ2V0REIoXCJyXCIpO1xuICAgIGNvbnN0IGZpeHR1cmVEYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcuZml4dHVyZSk7XG4gICAgY29uc3QgZ2VuZXJhdG9yID0gbmV3IEZpeHR1cmVHZW5lcmF0b3Ioc291cmNlRGIsIGZpeHR1cmVEYiwgXCJmaXh0dXJlXCIsIEVudGl0eU1hbmFnZXIpO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxuJHtlbnRpdHlOYW1lcy5qb2luKFwiLCBcIil9IGltcG9ydCDspJEuLi5gKSk7XG5cbiAgICBmb3IgKGNvbnN0IGVudGl0eU5hbWUgb2YgZW50aXR5TmFtZXMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBnZW5lcmF0b3IuaW1wb3J0RnJvbVNvdXJjZShlbnRpdHlOYW1lLCB7XG4gICAgICAgIHN0cmF0ZWd5LFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgaW5jbHVkZVJlbGF0aW9uczogdHJ1ZSxcbiAgICAgICAgbWF4RGVwdGg6IDIsXG4gICAgICB9KTtcblxuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKchSAke2VudGl0eU5hbWV9OiAke3Jlc3VsdHMubGVuZ3RofeqwnCBpbXBvcnQg7JmE66OMYCkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBcIuyLpOygnCBEQuyXkOyEnCDrjbDsnbTthLDrpbwg6rCA7KC47Jik64qUIOykkSDsmKTrpZjqsIAg67Cc7IOd7ZaI7Iq164uI64ukLlxcblwiICtcbiAgICAgICAgICBcIuybkOyduDog7IaM7IqkIERCIOyXsOqysCDshKTsoJUoc29uYW11LmNvbmZpZy50cynsnbTrgpggRW50aXR5IOq0gOqzhCDsoJXsnZjrpbwg7ZmV7J247ZW07KO87IS47JqULlxcblwiICtcbiAgICAgICAgICBcIuyekOyEuO2VnCDrgrTsmqk6XCIsXG4gICAgICApLFxuICAgICAgZXJyb3IsXG4gICAgKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIGZpeHR1cmUgZXhwbG9yZSDrqoXroLnslrQgLSBEQuydmCDsi6TsoJwg642w7J207YSw66W8IOyhsO2ajO2VmOyXrCDtmZXsnbjtlanri4jri6QuXG4gKiDsoIDsnqXtlZjsp4Ag7JWK6rOgIOyhsO2ajOunjCDtlZjrr4DroZwg642w7J207YSw66W8IOu5oOultOqyjCDtmZXsnbjtlaAg65WMIOycoOyaqe2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVFeHBsb3JlQ29tbWFuZChvcHRpb25zOiBGaXh0dXJlQ29tbWFuZE9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIUVudGl0eU1hbmFnZXIuaXNBdXRvbG9hZGVkKSB7XG4gICAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgfVxuXG4gICAgbGV0IGVudGl0eU5hbWUgPSBvcHRpb25zLmluY2x1ZGU7XG5cbiAgICBpZiAoIWVudGl0eU5hbWUpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICB0eXBlOiBcInNlbGVjdFwiLFxuICAgICAgICBuYW1lOiBcImVudGl0eVwiLFxuICAgICAgICBtZXNzYWdlOiBcIu2DkOyDie2VoCBFbnRpdHk6XCIsXG4gICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCkubWFwKChpZCkgPT4gKHsgdGl0bGU6IGlkLCB2YWx1ZTogaWQgfSkpLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzdWx0LmVudGl0eSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlbnRpdHlOYW1lID0gcmVzdWx0LmVudGl0eTtcbiAgICB9XG5cbiAgICBpZiAoIWVudGl0eU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkVudGl0eSBuYW1lIGlzIHJlcXVpcmVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cmF0ZWd5OiBEYXRhRXhwbG9yZXJTdHJhdGVneSA9IG9wdGlvbnMuc3RyYXRlZ3kgPz8gXCJzYW1wbGVcIjtcbiAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnMubGltaXQgPyBOdW1iZXIucGFyc2VJbnQob3B0aW9ucy5saW1pdCwgMTApIDogMTA7XG5cbiAgICBjb25zdCBkYiA9IERCLmdldERCKFwiclwiKTtcbiAgICBjb25zdCBleHBsb3JlciA9IG5ldyBEYXRhRXhwbG9yZXIoZGIsIEVudGl0eU1hbmFnZXIpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBleHBsb3Jlci5leHBsb3JlKGVudGl0eU5hbWUsIHsgc3RyYXRlZ3ksIGxpbWl0IH0pO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxuJHtlbnRpdHlOYW1lfSAke2RhdGEubGVuZ3RofeqwnCDsobDtmowg7JmE66OMOmApKTtcbiAgICBjb25zb2xlLnRhYmxlKGRhdGEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwi642w7J207YSwIOyhsO2ajCDspJEg7Jik66WY6rCAIOuwnOyDne2WiOyKteuLiOuLpC5cXG5cIiArXG4gICAgICAgICAgXCLsm5Dsnbg6IERCIOyXsOqysOydtOuCmCBFbnRpdHkg7KCV7J2Y66W8IO2ZleyduO2VtOyjvOyEuOyalC5cXG5cIiArXG4gICAgICAgICAgXCLsnpDshLjtlZwg64K07JqpOlwiLFxuICAgICAgKSxcbiAgICAgIGVycm9yLFxuICAgICk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7WUFJc0M7UUFDSDtVQUNrQjtvQkFDRztTQUNYO21CQUNVO3VCQUVRO0FBdUIvRCxNQUFNLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVk7Ozs7QUFLbEYsU0FBUyxpQkFBaUIsS0FBcUI7Q0FFN0MsSUFBSSxXQUFXLElBQUksWUFBWSxDQUFDLENBQUMsUUFBUSxjQUFjLEVBQUU7Q0FDekQsSUFBSSxTQUFTLFdBQVcsR0FDdEIsV0FBVztDQUdiLElBQUksU0FBUyxLQUFLLFFBQVEsR0FDeEIsV0FBVyxJQUFJO0NBR2pCLE9BQU8sU0FB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
|
|
493
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL2ZpeHR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3Bhd24sIHR5cGUgU3Bhd25PcHRpb25zIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgb3BlbiB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBrbmV4LCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgcHJvbXB0cyBmcm9tIFwicHJvbXB0c1wiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IGdldFNvbmFtdUVudmlyb25tZW50IH0gZnJvbSBcIi4uL2VudlwiO1xuaW1wb3J0IHsgRGF0YUV4cGxvcmVyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZGF0YS1leHBsb3JlclwiO1xuaW1wb3J0IHsgdHlwZSBEYXRhRXhwbG9yZXJTdHJhdGVneSB9IGZyb20gXCIuLi90ZXN0aW5nL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IEZpeHR1cmVHZW5lcmF0b3IgfSBmcm9tIFwiLi4vdGVzdGluZy9maXh0dXJlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgRml4dHVyZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVzdGluZy9maXh0dXJlLW1hbmFnZXJcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpeHR1cmVDb21tYW5kT3B0aW9ucyB7XG4gIF8/OiBzdHJpbmdbXTtcbiAgYWxsPzogYm9vbGVhbjtcbiAgaW5jbHVkZT86IHN0cmluZztcbiAgZXhjbHVkZT86IHN0cmluZztcbiAgY291bnQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gIFwic2F2ZS10b1wiPzogc3RyaW5nO1xuICBzdHJhdGVneT86IERhdGFFeHBsb3JlclN0cmF0ZWd5O1xuICBsaW1pdD86IHN0cmluZyB8IG51bWJlcjtcbiAgXCJ1c2UtbGxtXCI/OiBib29sZWFuO1xuICBcIm5vLWNhY2hlXCI/OiBib29sZWFuO1xuICBub25JbnRlcmFjdGl2ZT86IGJvb2xlYW47XG4gIHVzZXJNb2RlPzogXCJsb2dpblwiIHwgXCJkdW1teVwiO1xufVxuXG5pbnRlcmZhY2UgU2lnbnVwQm9keSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZW1haWw6IHN0cmluZztcbiAgdXNlcm5hbWU6IHN0cmluZztcbiAgcGFzc3dvcmQ6IHN0cmluZztcbiAgZGlzcGxheV91c2VybmFtZT86IHN0cmluZztcbn1cblxuY29uc3QgU2lnbnVwRXJyb3JSZXNwb25zZSA9IHoub2JqZWN0KHsgY29kZTogei5zdHJpbmcoKS5vcHRpb25hbCgpIH0pLnBhc3N0aHJvdWdoKCk7XG5cbmZ1bmN0aW9uIHJ1blByb2Nlc3MoXG4gIGV4ZWN1dGFibGU6IHN0cmluZyxcbiAgYXJnczogc3RyaW5nW10sXG4gIHN0ZGlvOiBTcGF3bk9wdGlvbnNbXCJzdGRpb1wiXSA9IFtcImlnbm9yZVwiLCBcImluaGVyaXRcIiwgXCJpbmhlcml0XCJdLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihleGVjdXRhYmxlLCBhcmdzLCB7IHN0ZGlvIH0pO1xuICAgIGNoaWxkLm9uY2UoXCJlcnJvclwiLCByZWplY3QpO1xuICAgIGNoaWxkLm9uY2UoXCJleGl0XCIsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgIGlmIChjb2RlID09PSAwKSByZXNvbHZlKCk7XG4gICAgICBlbHNlXG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoYCR7ZXhlY3V0YWJsZX0g66qF66C57J20ICR7Y29kZSA/PyBzaWduYWwgPz8gXCJ1bmtub3duXCJ9IOyDge2DnOuhnCDsi6TtjKjtlojsirXri4jri6QuYCksXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZU15c3FsRHVtcChhcmdzOiBzdHJpbmdbXSwgb3V0cHV0UGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IG9wZW4ob3V0cHV0UGF0aCwgXCJ3XCIpO1xuICB0cnkge1xuICAgIGF3YWl0IHJ1blByb2Nlc3MoXCJteXNxbGR1bXBcIiwgYXJncywgW1wiaWdub3JlXCIsIG91dHB1dC5mZCwgXCJpbmhlcml0XCJdKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBvdXRwdXQuY2xvc2UoKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBydW5NeXNxbFdpdGhJbnB1dChhcmdzOiBzdHJpbmdbXSwgaW5wdXRQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgaW5wdXQgPSBhd2FpdCBvcGVuKGlucHV0UGF0aCwgXCJyXCIpO1xuICB0cnkge1xuICAgIGF3YWl0IHJ1blByb2Nlc3MoXCJteXNxbFwiLCBhcmdzLCBbaW5wdXQuZmQsIFwiaW5oZXJpdFwiLCBcImluaGVyaXRcIl0pO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGlucHV0LmNsb3NlKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbXlzcWxDb25uZWN0aW9uQXJncyhjb25uZWN0aW9uOiBLbmV4LkNvbm5lY3Rpb25Db25maWcpIHtcbiAgcmV0dXJuIFtcbiAgICBgLWgke1N0cmluZyhjb25uZWN0aW9uLmhvc3QpfWAsXG4gICAgYC11JHtTdHJpbmcoY29ubmVjdGlvbi51c2VyKX1gLFxuICAgIGAtcCR7U3RyaW5nKGNvbm5lY3Rpb24ucGFzc3dvcmQpfWAsXG4gIF07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXh0dXJlSW5pdENvbW1hbmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNyY0NvbmZpZyA9IFNvbmFtdS5kYkNvbmZpZ1tnZXRTb25hbXVFbnZpcm9ubWVudCgpXTtcbiAgY29uc3QgZml4dHVyZUNvbm5lY3Rpb24gPVxuICAgIC8qIFNBRkVUWTogU29uYW11IERCIOq1rOyEseydgCDstIjquLDtmZQg7IucIEtuZXgg7Jew6rKwIOq1rOyEseycvOuhnCDqsoDspp3rkKnri4jri6QuICovIFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlXG4gICAgICAuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gIGNvbnN0IHRlc3RDb25uZWN0aW9uID1cbiAgICAvKiBTQUZFVFk6IFNvbmFtdSBEQiDqtazshLHsnYAg7LSI6riw7ZmUIOyLnCBLbmV4IOyXsOqysCDqtazshLHsnLzroZwg6rKA7Kad65Cp64uI64ukLiAqLyBTb25hbXUuZGJDb25maWcudGVzdFxuICAgICAgLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnO1xuICBjb25zdCB0YXJnZXRzOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IGNvbmZpZzogS25leC5Db25maWc7IHRvU2tpcD86IGJvb2xlYW4gfT4gPSBbXG4gICAgeyBsYWJlbDogXCIoUkVNT1RFKSBGaXh0dXJlIERCXCIsIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLmZpeHR1cmUgfSxcbiAgICB7XG4gICAgICBsYWJlbDogXCIoTE9DQUwpIFRlc3RpbmcgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLnRlc3QsXG4gICAgICAvLyDqsJnsnYAgRELrpbwg6rCA66as7YKk66m0IOybkOqyqSBmaXh0dXJl66W8IOuLpOyLnCDrja7slrTsk7Dsp4Ag7JWK7Iq164uI64ukLlxuICAgICAgdG9Ta2lwOlxuICAgICAgICBmaXh0dXJlQ29ubmVjdGlvbi5ob3N0ID09PSB0ZXN0Q29ubmVjdGlvbi5ob3N0ICYmXG4gICAgICAgIGZpeHR1cmVDb25uZWN0aW9uLmRhdGFiYXNlID09PSB0ZXN0Q29ubmVjdGlvbi5kYXRhYmFzZSxcbiAgICB9LFxuICBdO1xuXG4gIGNvbnN0IGR1bXBGaWxlbmFtZSA9IGAvdG1wL3NvbmFtdS1maXh0dXJlLWluaXQtJHtEYXRlLm5vdygpfS5zcWxgO1xuICBjb25zdCBtaWdyYXRpb25zRHVtcCA9IGAvdG1wL3NvbmFtdS1maXh0dXJlLWluaXQtbWlncmF0aW9ucy0ke0RhdGUubm93KCl9LnNxbGA7XG4gIGNvbnN0IHNyY0Nvbm5lY3Rpb24gPVxuICAgIC8qIFNBRkVUWTogU29uYW11IERCIOq1rOyEseydgCDstIjquLDtmZQg7IucIEtuZXgg7Jew6rKwIOq1rOyEseycvOuhnCDqsoDspp3rkKnri4jri6QuICovIHNyY0NvbmZpZy5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgYXdhaXQgd3JpdGVNeXNxbER1bXAoXG4gICAgW1xuICAgICAgLi4ubXlzcWxDb25uZWN0aW9uQXJncyhzcmNDb25uZWN0aW9uKSxcbiAgICAgIFwiLS1zaW5nbGUtdHJhbnNhY3Rpb25cIixcbiAgICAgIFwiLWRcIixcbiAgICAgIFwiLS1uby1jcmVhdGUtZGJcIixcbiAgICAgIFwiLS10cmlnZ2Vyc1wiLFxuICAgICAgU3RyaW5nKHNyY0Nvbm5lY3Rpb24uZGF0YWJhc2UpLFxuICAgIF0sXG4gICAgZHVtcEZpbGVuYW1lLFxuICApO1xuXG4gIGNvbnN0IHNvdXJjZURiID0ga25leChzcmNDb25maWcpO1xuICB0cnkge1xuICAgIGNvbnN0IFtbbWlncmF0aW9uc11dID0gYXdhaXQgc291cmNlRGIucmF3KFxuICAgICAgXCJTRUxFQ1QgQ09VTlQoKikgYXMgY291bnQgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9ID8gQU5EIHRhYmxlX25hbWUgPSAna25leF9taWdyYXRpb25zJ1wiLFxuICAgICAgW3NyY0Nvbm5lY3Rpb24uZGF0YWJhc2VdLFxuICAgICk7XG4gICAgaWYgKG1pZ3JhdGlvbnMuY291bnQgPiAwKSB7XG4gICAgICBhd2FpdCB3cml0ZU15c3FsRHVtcChcbiAgICAgICAgW1xuICAgICAgICAgIC4uLm15c3FsQ29ubmVjdGlvbkFyZ3Moc3JjQ29ubmVjdGlvbiksXG4gICAgICAgICAgXCItLXNpbmdsZS10cmFuc2FjdGlvblwiLFxuICAgICAgICAgIFwiLS1uby1jcmVhdGUtZGJcIixcbiAgICAgICAgICBcIi0tdHJpZ2dlcnNcIixcbiAgICAgICAgICBTdHJpbmcoc3JjQ29ubmVjdGlvbi5kYXRhYmFzZSksXG4gICAgICAgICAgXCJrbmV4X21pZ3JhdGlvbnNcIixcbiAgICAgICAgICBcImtuZXhfbWlncmF0aW9uc19sb2NrXCIsXG4gICAgICAgIF0sXG4gICAgICAgIG1pZ3JhdGlvbnNEdW1wLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHsgbGFiZWwsIGNvbmZpZywgdG9Ta2lwIH0gb2YgdGFyZ2V0cykge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9XG4gICAgICAgIC8qIFNBRkVUWTogdGFyZ2V0c+uKlCDqsoDspp3rkJwgU29uYW11IERCIOq1rOyEseyXkOyEnOunjCDsobDtlanrkKnri4jri6QuICovIGNvbmZpZy5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgIGlmICh0b1NraXAgPT09IHRydWUpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkKGAke2xhYmVsfTogU2tpcHBlZCFgKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhYmFzZUNvbm5lY3Rpb24gPVxuICAgICAgICAvKiBTQUZFVFk6IHRhcmdldHPripQg6rKA7Kad65CcIFNvbmFtdSBEQiDqtazshLHsl5DshJzrp4wg7KGw7ZWp65Cp64uI64ukLiAqLyAoY29uZmlnLmNvbm5lY3Rpb24gPz9cbiAgICAgICAgICB7fSkgYXMgS25leC5Db25uZWN0aW9uQ29uZmlnO1xuICAgICAgY29uc3QgZGIgPSBrbmV4KHtcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICBjb25uZWN0aW9uOiB7IC4uLmRhdGFiYXNlQ29ubmVjdGlvbiwgZGF0YWJhc2U6IHVuZGVmaW5lZCB9LFxuICAgICAgfSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBbW3Jvd11dID0gYXdhaXQgZGIucmF3KGBTSE9XIERBVEFCQVNFUyBMSUtFIFwiJHtjb25uZWN0aW9uLmRhdGFiYXNlfVwiYCk7XG4gICAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCR7bGFiZWx9OiBEYXRhYmFzZSBcIiR7Y29ubmVjdGlvbi5kYXRhYmFzZX1cIiBBbHJlYWR5IGV4aXN0c2ApKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25BcmdzID0gbXlzcWxDb25uZWN0aW9uQXJncyhjb25uZWN0aW9uKTtcbiAgICAgICAgY29uc3QgZGF0YWJhc2UgPSBTdHJpbmcoY29ubmVjdGlvbi5kYXRhYmFzZSk7XG4gICAgICAgIGNvbnN0IGVzY2FwZWREYXRhYmFzZSA9IGRhdGFiYXNlLnJlcGxhY2VBbGwoXCJgXCIsIFwiYGBcIik7XG4gICAgICAgIGF3YWl0IHJ1blByb2Nlc3MoXCJteXNxbFwiLCBbXG4gICAgICAgICAgLi4uY29ubmVjdGlvbkFyZ3MsXG4gICAgICAgICAgXCItZVwiLFxuICAgICAgICAgIGBEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcXGAke2VzY2FwZWREYXRhYmFzZX1cXGBgLFxuICAgICAgICBdKTtcbiAgICAgICAgYXdhaXQgcnVuUHJvY2VzcyhcIm15c3FsXCIsIFtcbiAgICAgICAgICAuLi5jb25uZWN0aW9uQXJncyxcbiAgICAgICAgICBcIi1lXCIsXG4gICAgICAgICAgYENSRUFURSBEQVRBQkFTRSBcXGAke2VzY2FwZWREYXRhYmFzZX1cXGBgLFxuICAgICAgICBdKTtcbiAgICAgICAgYXdhaXQgcnVuTXlzcWxXaXRoSW5wdXQoWy4uLmNvbm5lY3Rpb25BcmdzLCBkYXRhYmFzZV0sIGR1bXBGaWxlbmFtZSk7XG4gICAgICAgIGlmIChhd2FpdCBleGlzdHMobWlncmF0aW9uc0R1bXApKSB7XG4gICAgICAgICAgYXdhaXQgcnVuTXlzcWxXaXRoSW5wdXQoWy4uLmNvbm5lY3Rpb25BcmdzLCBkYXRhYmFzZV0sIG1pZ3JhdGlvbnNEdW1wKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBzb3VyY2VEYi5kZXN0cm95KCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVDbGVhbnVwQ29tbWFuZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuZGVzdHJveSgpO1xuICBhd2FpdCBTb25hbXUuZGVzdHJveSgpO1xufVxuXG4vKipcbiAqIHVzZXJuYW1l7J2EIOydvOuwmOyggeyduCDqt5zsuZko7JiB66y47J6QIOyLnOyekSwg7JiB66y47J6QL+yIq+yekOunjCwgMS0yMOyekCnsl5Ag66ee64+E66GdIOygleq3nO2ZlO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gc2FuaXRpemVVc2VybmFtZShyYXc6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIOyGjOusuOyekCDrs4DtmZgg7ZuEIOyYgeusuOyekC/siKvsnpAg7Jm4IOusuOyekCDsoJzqsbBcbiAgbGV0IHVzZXJuYW1lID0gcmF3LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTldL2csIFwiXCIpO1xuICBpZiAodXNlcm5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgdXNlcm5hbWUgPSBcInVzZXJcIjtcbiAgfVxuICAvLyDssqsg6riA7J6Q6rCAIOyIq+yekOuptCAndScg7KCR65GQ7Ja0IOy2lOqwgFxuICBpZiAoL15bMC05XS8udGVzdCh1c2VybmFtZSkpIHtcbiAgICB1c2VybmFtZSA9IGB1JHt1c2VybmFtZX1gO1xuICB9XG4gIC8vIDIw7J6QIOy0iOqzvCDsi5wgdHJ1bmNhdGVcbiAgcmV0dXJuIHVzZXJuYW1lLnNsaWNlKDAsIDIwKTtcbn1cblxuLyoqXG4gKiBmaXh0dXJlIGdlbiDrqoXroLnslrQgLSBjb25lIOuplO2DgOuNsOydtO2EsOulvCDtmZzsmqntlZjsl6wg7J6Q64+Z7Jy866GcIGZpeHR1cmXrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4dHVyZUdlbkNvbW1hbmQob3B0aW9uczogRml4dHVyZUNvbW1hbmRPcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFFbnRpdHlNYW5hZ2VyLmlzQXV0b2xvYWRlZCkge1xuICAgICAgYXdhaXQgRW50aXR5TWFuYWdlci5hdXRvbG9hZCgpO1xuICAgIH1cblxuICAgIGxldCBlbnRpdHlOYW1lczogc3RyaW5nW107XG5cbiAgICBpZiAob3B0aW9ucy5hbGwpIHtcbiAgICAgIGVudGl0eU5hbWVzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICAgIGlmIChvcHRpb25zLmV4Y2x1ZGUpIHtcbiAgICAgICAgY29uc3QgZXhjbHVkZUxpc3QgPSBvcHRpb25zLmV4Y2x1ZGUuc3BsaXQoXCIsXCIpLm1hcCgoczogc3RyaW5nKSA9PiBzLnRyaW0oKSk7XG4gICAgICAgIGVudGl0eU5hbWVzID0gZW50aXR5TmFtZXMuZmlsdGVyKChuYW1lKSA9PiAhZXhjbHVkZUxpc3QuaW5jbHVkZXMobmFtZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pbmNsdWRlKSB7XG4gICAgICBlbnRpdHlOYW1lcyA9IG9wdGlvbnMuaW5jbHVkZS5zcGxpdChcIixcIikubWFwKChzOiBzdHJpbmcpID0+IHMudHJpbSgpKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMubm9uSW50ZXJhY3RpdmUgPT09IHRydWUpIHtcbiAgICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKFwiRml4dHVyZSBnZW4gc2VsZWN0b3IgaXMgcmVxdWlyZWQuXCIpLCB7XG4gICAgICAgIGNvZGU6IFwiTUlTU0lOR19BUkdVTUVOVFwiLFxuICAgICAgICBleGl0Q29kZTogMixcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJtdWx0aXNlbGVjdFwiLFxuICAgICAgICBuYW1lOiBcImVudGl0aWVzXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiRml4dHVyZeulvCDsg53shLHtlaAgRW50aXR566W8IOyEoO2Dne2VmOyEuOyalDpcIixcbiAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKS5tYXAoKGlkKSA9PiAoeyB0aXRsZTogaWQsIHZhbHVlOiBpZCB9KSksXG4gICAgICAgIG1pbjogMSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3VsdC5lbnRpdGllcyB8fCByZXN1bHQuZW50aXRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGVudGl0eU5hbWVzID0gcmVzdWx0LmVudGl0aWVzO1xuICAgIH1cblxuICAgIGxldCBjb3VudCA9IG9wdGlvbnMuY291bnQgPyBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKG9wdGlvbnMuY291bnQpLCAxMCkgOiA1O1xuICAgIGlmICghb3B0aW9ucy5jb3VudCAmJiBvcHRpb25zLm5vbkludGVyYWN0aXZlICE9PSB0cnVlKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgbmFtZTogXCJjb3VudFwiLFxuICAgICAgICBtZXNzYWdlOiBcIuqwgSBFbnRpdHnrs4Qg7IOd7ISxIOqwnOyImDpcIixcbiAgICAgICAgaW5pdGlhbDogNSxcbiAgICAgICAgbWluOiAxLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzdWx0LmNvdW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvdW50ID0gcmVzdWx0LmNvdW50O1xuICAgIH1cblxuICAgIC8vIFVzZXIg7JeU7Yuw7Yuw6rCAIO2PrO2VqOuQnCDqsr3smrA6IOuhnOq3uOyduCDqsIDriqUv7ZmV7J247JqpIOu2hOq4sCDshKDtg51cbiAgICBjb25zdCBoYXNVc2VyID0gZW50aXR5TmFtZXMuaW5jbHVkZXMoXCJVc2VyXCIpO1xuXG4gICAgaWYgKGhhc1VzZXIpIHtcbiAgICAgIGxldCB1c2VyTW9kZSA9IG9wdGlvbnMudXNlck1vZGU7XG4gICAgICBpZiAodXNlck1vZGUgPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLm5vbkludGVyYWN0aXZlID09PSB0cnVlKSB1c2VyTW9kZSA9IFwiZHVtbXlcIjtcbiAgICAgIGlmICh1c2VyTW9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHVzZXJNb2RlUmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgICAgdHlwZTogXCJzZWxlY3RcIixcbiAgICAgICAgICBuYW1lOiBcInVzZXJNb2RlXCIsXG4gICAgICAgICAgbWVzc2FnZTogXCJVc2VyIOyXlO2LsO2LsOqwgCDtj6ztlajrkJjslrQg7J6I7Iq164uI64ukLiDsg53shLEg67Cp7Iud7J2EIOyEoO2Dne2VmOyEuOyalDpcIixcbiAgICAgICAgICBjaG9pY2VzOiBbXG4gICAgICAgICAgICB7IHRpdGxlOiBcIjEuIOuhnOq3uOyduCDqsIDriqXtlZwg7IKs7Jqp7J6QIGZpeHR1cmUg7IOd7ISxXCIsIHZhbHVlOiBcImxvZ2luXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiMi4g7ZmV7J247JqpIOuNsOydtO2EsCjroZzqt7jsnbgg67aI6rCAKSDsg53shLFcIiwgdmFsdWU6IFwiZHVtbXlcIiB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICB1c2VyTW9kZSA9IHVzZXJNb2RlUmVzdWx0LnVzZXJNb2RlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXVzZXJNb2RlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh1c2VyTW9kZSA9PT0gXCJsb2dpblwiKSB7XG4gICAgICAgIC8vIExMTSDsgqzsmqkg7Jes67aAXG4gICAgICAgIGxldCB1c2VMTE0gPSBvcHRpb25zW1widXNlLWxsbVwiXSA/PyBmYWxzZTtcbiAgICAgICAgaWYgKG9wdGlvbnNbXCJ1c2UtbGxtXCJdID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5ub25JbnRlcmFjdGl2ZSAhPT0gdHJ1ZSkge1xuICAgICAgICAgIGNvbnN0IGxsbVJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICAgICAgdHlwZTogXCJjb25maXJtXCIsXG4gICAgICAgICAgICBuYW1lOiBcInVzZUxMTVwiLFxuICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgXCJMTE3snLzroZwg642UIO2YhOyLpOyggeyduCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWg6rmM7JqUPyAoZml4dHVyZUhpbnQg6riw67CYLCBBTlRIUk9QSUNfQVBJX0tFWSDtlYTsmpQpXCIsXG4gICAgICAgICAgICBpbml0aWFsOiBmYWxzZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB1c2VMTE0gPSBsbG1SZXN1bHQudXNlTExNID8/IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW5hYmxlTExNQ2FjaGUgPSAhb3B0aW9uc1tcIm5vLWNhY2hlXCJdO1xuICAgICAgICBjb25zdCBERUZBVUxUX1BBU1NXT1JEID0gXCJUZXN0MTIzNCFcIjtcblxuICAgICAgICAvLyDroZzqt7jsnbgg6rCA64qlIOqyveuhnOyXkOyEnOuKlCDtmITsnqwg7ZmY6rK97J2YIOydveq4sCBEQuulvCBzb3VyY2VEYuuhnCDsgqzsmqlcbiAgICAgICAgY29uc3Qgc291cmNlRGIgPSBEQi5nZXREQihcInJcIik7XG4gICAgICAgIGNvbnN0IGdlbmVyYXRvciA9IG5ldyBGaXh0dXJlR2VuZXJhdG9yKFxuICAgICAgICAgIHNvdXJjZURiLFxuICAgICAgICAgIHNvdXJjZURiLFxuICAgICAgICAgIGdldFNvbmFtdUVudmlyb25tZW50KCksXG4gICAgICAgICAgRW50aXR5TWFuYWdlcixcbiAgICAgICAgICB7IHVzZUxMTSwgZW5hYmxlTExNQ2FjaGUgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBjcmVhdGVkQ3JlZGVudGlhbHM6IEFycmF5PHsgZW1haWw6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZyB9PiA9IFtdO1xuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IFNvbmFtdS5jb25maWcuc2VydmVyLmF1dGg/LmJhc2VQYXRoID8/IFwiL2FwaS9hdXRoXCI7XG5cbiAgICAgICAgaWYgKHVzZUxMTSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICAgICAgYFxcbkxMTSDrqqjrk5zroZwg66Gc6re47J24IOqwgOuKpe2VnCDsgqzsmqnsnpAgJHtjb3VudH3rqoUg7IOd7ISxIOykkS4uLiAo7LqQ7IuxOiAke2VuYWJsZUxMTUNhY2hlID8gXCJPTlwiIDogXCJPRkZcIn0pYCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG7roZzqt7jsnbgg6rCA64ql7ZWcIOyCrOyaqeyekCAke2NvdW50feuqhSDsg53shLEg7KSRLi4uYCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdXNlckRhdGEgPSBhd2FpdCBnZW5lcmF0b3IuZ2VuZXJhdGUoXCJVc2VyXCIpO1xuXG4gICAgICAgICAgY29uc3QgbmFtZSA9IFN0cmluZyh1c2VyRGF0YS5uYW1lID8/IFwiXCIpO1xuICAgICAgICAgIGNvbnN0IGVtYWlsID0gU3RyaW5nKHVzZXJEYXRhLmVtYWlsID8/IFwiXCIpO1xuICAgICAgICAgIGNvbnN0IHVzZXJuYW1lID0gc2FuaXRpemVVc2VybmFtZShTdHJpbmcodXNlckRhdGEudXNlcm5hbWUgPz8gXCJcIikpO1xuICAgICAgICAgIGNvbnN0IGRpc3BsYXlVc2VybmFtZSA9XG4gICAgICAgICAgICB1c2VyRGF0YS5kaXNwbGF5X3VzZXJuYW1lICE9PSB1bmRlZmluZWQgPyBTdHJpbmcodXNlckRhdGEuZGlzcGxheV91c2VybmFtZSkgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBjb25zdCBib2R5OiBTaWdudXBCb2R5ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgICAgICBwYXNzd29yZDogREVGQVVMVF9QQVNTV09SRCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChkaXNwbGF5VXNlcm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYm9keS5kaXNwbGF5X3VzZXJuYW1lID0gZGlzcGxheVVzZXJuYW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlcSA9IG5ldyBSZXF1ZXN0KGBodHRwOi8vbG9jYWxob3N0JHtiYXNlUGF0aH0vc2lnbi11cC9lbWFpbGAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgU29uYW11LmF1dGguaGFuZGxlcihyZXEpO1xuXG4gICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gU2lnbnVwRXJyb3JSZXNwb25zZS5wYXJzZShhd2FpdCByZXNwb25zZS5qc29uKCkpO1xuICAgICAgICAgICAgY29uc3QgY29kZSA9IHJlc3BvbnNlRGF0YS5jb2RlO1xuICAgICAgICAgICAgaWYgKGNvZGUgPT09IFwiVVNFUl9BTFJFQURZX0VYSVNUU1wiKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgICDimqDvuI8gICR7ZW1haWx9IOydtOuvuCDsobTsnqwgLSDqsbTrhIjrnIHri4jri6QuYCkpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZChgICDinYwgJHtlbWFpbH0g7IOd7ISxIOyLpO2MqDogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZURhdGEpfWApKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNyZWF0ZWRDcmVkZW50aWFscy5wdXNoKHsgZW1haWwsIHBhc3N3b3JkOiBERUZBVUxUX1BBU1NXT1JEIH0pO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGAgIOKchSAke2VtYWlsfSDsg53shLEg7JmE66OMYCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW1haWxfdmVyaWZpZWQgPSB0cnVlIOyngeygkSDsl4XrjbDsnbTtirggKGRldiDtjrjsnZgpXG4gICAgICAgIGlmIChjcmVhdGVkQ3JlZGVudGlhbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGVtYWlscyA9IGNyZWF0ZWRDcmVkZW50aWFscy5tYXAoKGMpID0+IGMuZW1haWwpO1xuICAgICAgICAgIGF3YWl0IERCLmdldERCKFwid1wiKShcInVzZXJzXCIpLndoZXJlSW4oXCJlbWFpbFwiLCBlbWFpbHMpLnVwZGF0ZSh7IGVtYWlsX3ZlcmlmaWVkOiB0cnVlIH0pO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGBcXG5lbWFpbF92ZXJpZmllZCA9IHRydWUg7JeF642w7J207Yq4IOyZhOujjGApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1c2VMTE0pIHtcbiAgICAgICAgICBjb25zdCBzdGF0cyA9IGdlbmVyYXRvci5nZXRMTE1DYWNoZVN0YXRzKCk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgW0xMTSBDYWNoZV0g7LqQ7IucIO2BrOq4sDogJHtzdGF0cy5zaXplfWApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmdyZWVuKGBcXG7inIUgJHtjcmVhdGVkQ3JlZGVudGlhbHMubGVuZ3RofeuqheydmCDroZzqt7jsnbgg6rCA64ql7ZWcIOyCrOyaqeyekCDsg53shLEg7JmE66OMYCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChjcmVhdGVkQ3JlZGVudGlhbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiXFxu7IOd7ISx65CcIOqzhOyglSDrqqnroZ06XCIpO1xuICAgICAgICAgIGNvbnNvbGUudGFibGUoY3JlYXRlZENyZWRlbnRpYWxzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIHVzZXJNb2RlID09PSBcImR1bW15XCI6IOq4sOyhtCBnZW5lcmF0ZUJhdGNoKCkg7Z2Q66aEIOqzhOyGjVxuICAgIH1cblxuICAgIGxldCBzYXZlVGFyZ2V0ID0gb3B0aW9uc1tcInNhdmUtdG9cIl0gfHwgXCJkYlwiO1xuICAgIGlmICghb3B0aW9uc1tcInNhdmUtdG9cIl0gJiYgb3B0aW9ucy5ub25JbnRlcmFjdGl2ZSAhPT0gdHJ1ZSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwic2VsZWN0XCIsXG4gICAgICAgIG5hbWU6IFwic2F2ZVRhcmdldFwiLFxuICAgICAgICBtZXNzYWdlOiBcIuyggOyepSDrsKnsi506XCIsXG4gICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICB7IHRpdGxlOiBcIkZpeHR1cmUgRELsl5Ag7KCA7J6lXCIsIHZhbHVlOiBcImRiXCIgfSxcbiAgICAgICAgICB7IHRpdGxlOiBcIu2MjOydvOuhnCDsoIDsnqUgKOyekOuPmSDtjIzsnbzrqoUpXCIsIHZhbHVlOiBcImZpbGVcIiB9LFxuICAgICAgICAgIHsgdGl0bGU6IFwi7YyM7J2866GcIOyggOyepSAo7YyM7J2866qFIOyngOyglSlcIiwgdmFsdWU6IFwiZmlsZTpjdXN0b21cIiB9LFxuICAgICAgICAgIHsgdGl0bGU6IFwi7KCA7J6lIOyViCDtlaggKOy2nOugpeunjClcIiwgdmFsdWU6IFwibm9uZVwiIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgc2F2ZVRhcmdldCA9IHJlc3VsdC5zYXZlVGFyZ2V0O1xuXG4gICAgICBpZiAoc2F2ZVRhcmdldCA9PT0gXCJmaWxlOmN1c3RvbVwiKSB7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lUmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgbmFtZTogXCJmaWxlbmFtZVwiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwi7YyM7J2866qFOlwiLFxuICAgICAgICAgIGluaXRpYWw6IFwiZml4dHVyZXMuanNvblwiLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWZpbGVuYW1lUmVzdWx0LmZpbGVuYW1lKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwi7Leo7IaM65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2F2ZVRhcmdldCA9IGBmaWxlOiR7ZmlsZW5hbWVSZXN1bHQuZmlsZW5hbWV9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMTE0g7IKs7JqpIOyXrOu2gCDqsrDsoJVcbiAgICBsZXQgdXNlTExNID0gb3B0aW9uc1tcInVzZS1sbG1cIl0gPz8gZmFsc2U7XG4gICAgaWYgKG9wdGlvbnNbXCJ1c2UtbGxtXCJdID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5ub25JbnRlcmFjdGl2ZSAhPT0gdHJ1ZSkge1xuICAgICAgY29uc3QgbGxtUmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwiY29uZmlybVwiLFxuICAgICAgICBuYW1lOiBcInVzZUxMTVwiLFxuICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgIFwiTExN7Jy866GcIOuNlCDtmITsi6TsoIHsnbgg642w7J207YSw66W8IOyDneyEse2VoOq5jOyalD8gKGZpeHR1cmVIaW50IOq4sOuwmCwgQU5USFJPUElDX0FQSV9LRVkg7ZWE7JqUKVwiLFxuICAgICAgICBpbml0aWFsOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgdXNlTExNID0gbGxtUmVzdWx0LnVzZUxMTSA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVMTE1DYWNoZSA9ICFvcHRpb25zW1wibm8tY2FjaGVcIl07XG5cbiAgICAvLyBmaXh0dXJlIGdlbjogZml4dHVyZSBEQiDrgrTsl5DshJwg7LC47KGwIOq0gOqzhOulvCDtlbTqsrDtlZjqs6Ag7KCA7J6l7ZWp64uI64ukXG4gICAgY29uc3QgZml4dHVyZURiID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlKTtcbiAgICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgRml4dHVyZUdlbmVyYXRvcihmaXh0dXJlRGIsIGZpeHR1cmVEYiwgXCJmaXh0dXJlXCIsIEVudGl0eU1hbmFnZXIsIHtcbiAgICAgIHVzZUxMTSxcbiAgICAgIGVuYWJsZUxMTUNhY2hlLFxuICAgIH0pO1xuXG4gICAgaWYgKHVzZUxMTSkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgYFxcbkxMTSDrqqjrk5zroZwgJHtlbnRpdHlOYW1lcy5qb2luKFwiLCBcIil9IOyDneyEsSDspJEuLi4gKOy6kOyLsTogJHtlbmFibGVMTE1DYWNoZSA/IFwiT05cIiA6IFwiT0ZGXCJ9KWAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG4ke2VudGl0eU5hbWVzLmpvaW4oXCIsIFwiKX0g7IOd7ISxIOykkS4uLmApKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGVjcyA9IGVudGl0eU5hbWVzLm1hcCgoZW50aXR5TmFtZSkgPT4gKHtcbiAgICAgIGVudGl0eTogZW50aXR5TmFtZSxcbiAgICAgIGNvdW50LFxuICAgICAgb3ZlcnJpZGVzOiB7fSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgZ2VuZXJhdG9yLmdlbmVyYXRlQmF0Y2goc3BlY3MpO1xuXG4gICAgaWYgKHVzZUxMTSkge1xuICAgICAgY29uc3Qgc3RhdHMgPSBnZW5lcmF0b3IuZ2V0TExNQ2FjaGVTdGF0cygpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgW0xMTSBDYWNoZV0g7LqQ7IucIO2BrOq4sDogJHtzdGF0cy5zaXplfWApKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgXFxu4pyFICR7cmVzdWx0cy5sZW5ndGh96rCcIGZpeHR1cmUg7IOd7ISxIOyZhOujjGApKTtcblxuICAgIGlmIChzYXZlVGFyZ2V0ID09PSBcIm5vbmVcIikge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0cywgbnVsbCwgMikpO1xuICAgIH0gZWxzZSBpZiAoc2F2ZVRhcmdldCA9PT0gXCJkYlwiKSB7XG4gICAgICAvLyBnZW5lcmF0ZUJhdGNo6rCAIOydtOuvuCBEQuyXkCDsoIDsnqXtlojsnLzrr4DroZwg67OE64+EIOyggOyepeydtCDrtojtlYTsmpTtlanri4jri6QuXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIkZpeHR1cmUgRELsl5Ag7KCA7J6l65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgfSBlbHNlIGlmIChzYXZlVGFyZ2V0LnN0YXJ0c1dpdGgoXCJmaWxlXCIpKSB7XG4gICAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIik7XG4gICAgICBjb25zdCBwYXRoID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuXG4gICAgICBjb25zdCBmaXh0dXJlc0RpciA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInRlc3RcIiwgXCJmaXh0dXJlc1wiKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaXh0dXJlc0Rpcik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoZml4dHVyZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGVudGl0eU5hbWUgb2YgZW50aXR5TmFtZXMpIHtcbiAgICAgICAgY29uc3QgZW50aXR5UmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKChyKSA9PiByLmVudGl0eUlkID09PSBlbnRpdHlOYW1lKTtcblxuICAgICAgICBpZiAoZW50aXR5UmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmaWxlbmFtZTogc3RyaW5nO1xuICAgICAgICBpZiAoc2F2ZVRhcmdldCA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcbiAgICAgICAgICBmaWxlbmFtZSA9IGAke2VudGl0eS50YWJsZX0uanNvbmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmlsZW5hbWUgPSBzYXZlVGFyZ2V0LnJlcGxhY2UoXCJmaWxlOlwiLCBcIlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gcGF0aC5qb2luKGZpeHR1cmVzRGlyLCBmaWxlbmFtZSk7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgICAgICBmaWxlcGF0aCxcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGVudGl0eVJlc3VsdHMubWFwKChyKSA9PiByLmRhdGEpLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKchSAke2ZpbGVwYXRofSDsoIDsnqUg7JmE66OMYCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBcIkZpeHR1cmUg7IOd7ISxIOykkSDsmKTrpZjqsIAg67Cc7IOd7ZaI7Iq164uI64ukLlxcblwiICtcbiAgICAgICAgICBcIuybkOyduDogRW50aXR5IOygleydmOuCmCBEQiDsl7DqsrDsnYQg7ZmV7J247ZW07KO87IS47JqULlxcblwiICtcbiAgICAgICAgICBcIuyekOyEuO2VnCDrgrTsmqk6XCIsXG4gICAgICApLFxuICAgICAgZXJyb3IsXG4gICAgKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIGZpeHR1cmUgZmV0Y2gg66qF66C57Ja0IC0g7Iuk7KCcIOyatOyYgSBEQuyXkOyEnCDrjbDsnbTthLDrpbwg6rCA7KC47JmAIGZpeHR1cmXroZwg7KCA7J6l7ZWp64uI64ukLlxuICog6rSA6rOE65CcIOuNsOydtO2EsOuPhCDtlajqu5gg6rCA7KC47Jik66+A66GcIO2YhOyLpOyggeyduCDthYzsiqTtirgg642w7J207YSw66W8IO2ZleuztO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4dHVyZUZldGNoQ29tbWFuZChvcHRpb25zOiBGaXh0dXJlQ29tbWFuZE9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIUVudGl0eU1hbmFnZXIuaXNBdXRvbG9hZGVkKSB7XG4gICAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgfVxuXG4gICAgbGV0IGVudGl0eU5hbWVzOiBzdHJpbmdbXTtcblxuICAgIGlmIChvcHRpb25zLmFsbCkge1xuICAgICAgZW50aXR5TmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgaWYgKG9wdGlvbnMuZXhjbHVkZSkge1xuICAgICAgICBjb25zdCBleGNsdWRlTGlzdCA9IG9wdGlvbnMuZXhjbHVkZS5zcGxpdChcIixcIikubWFwKChzOiBzdHJpbmcpID0+IHMudHJpbSgpKTtcbiAgICAgICAgZW50aXR5TmFtZXMgPSBlbnRpdHlOYW1lcy5maWx0ZXIoKG5hbWUpID0+ICFleGNsdWRlTGlzdC5pbmNsdWRlcyhuYW1lKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGUpIHtcbiAgICAgIGVudGl0eU5hbWVzID0gb3B0aW9ucy5pbmNsdWRlLnNwbGl0KFwiLFwiKS5tYXAoKHM6IHN0cmluZykgPT4gcy50cmltKCkpO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5ub25JbnRlcmFjdGl2ZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJGaXh0dXJlIGZldGNoIHNlbGVjdG9yIGlzIHJlcXVpcmVkLlwiKSwge1xuICAgICAgICBjb2RlOiBcIk1JU1NJTkdfQVJHVU1FTlRcIixcbiAgICAgICAgZXhpdENvZGU6IDIsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwibXVsdGlzZWxlY3RcIixcbiAgICAgICAgbmFtZTogXCJlbnRpdGllc1wiLFxuICAgICAgICBtZXNzYWdlOiBcIkltcG9ydO2VoCBFbnRpdHnrpbwg7ISg7YOd7ZWY7IS47JqUOlwiLFxuICAgICAgICBjaG9pY2VzOiBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpLm1hcCgoaWQpID0+ICh7IHRpdGxlOiBpZCwgdmFsdWU6IGlkIH0pKSxcbiAgICAgICAgbWluOiAxLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzdWx0LmVudGl0aWVzIHx8IHJlc3VsdC5lbnRpdGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwi7Leo7IaM65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZW50aXR5TmFtZXMgPSByZXN1bHQuZW50aXRpZXM7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RyYXRlZ3k6IERhdGFFeHBsb3JlclN0cmF0ZWd5ID0gb3B0aW9ucy5zdHJhdGVneSA/PyBcInJlY2VudFwiO1xuICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucy5saW1pdCA/IE51bWJlci5wYXJzZUludChTdHJpbmcob3B0aW9ucy5saW1pdCksIDEwKSA6IDEwO1xuXG4gICAgLy8gZml4dHVyZSBmZXRjaDog7ZiE7J6sIO2ZmOqyvSDrjbDsnbTthLDrpbwgZml4dHVyZSBEQuuhnCBpbXBvcnTtlanri4jri6RcbiAgICBjb25zdCBzb3VyY2VEYiA9IERCLmdldERCKFwiclwiKTtcbiAgICBjb25zdCBmaXh0dXJlRGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuICAgIGNvbnN0IGdlbmVyYXRvciA9IG5ldyBGaXh0dXJlR2VuZXJhdG9yKHNvdXJjZURiLCBmaXh0dXJlRGIsIFwiZml4dHVyZVwiLCBFbnRpdHlNYW5hZ2VyKTtcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYFxcbiR7ZW50aXR5TmFtZXMuam9pbihcIiwgXCIpfSBpbXBvcnQg7KSRLi4uYCkpO1xuXG4gICAgZm9yIChjb25zdCBlbnRpdHlOYW1lIG9mIGVudGl0eU5hbWVzKSB7XG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgZ2VuZXJhdG9yLmltcG9ydEZyb21Tb3VyY2UoZW50aXR5TmFtZSwge1xuICAgICAgICBzdHJhdGVneSxcbiAgICAgICAgbGltaXQsXG4gICAgICAgIGluY2x1ZGVSZWxhdGlvbnM6IHRydWUsXG4gICAgICAgIG1heERlcHRoOiAyLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinIUgJHtlbnRpdHlOYW1lfTogJHtyZXN1bHRzLmxlbmd0aH3qsJwgaW1wb3J0IOyZhOujjGApKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgXCLsi6TsoJwgRELsl5DshJwg642w7J207YSw66W8IOqwgOyguOyYpOuKlCDspJEg7Jik66WY6rCAIOuwnOyDne2WiOyKteuLiOuLpC5cXG5cIiArXG4gICAgICAgICAgXCLsm5Dsnbg6IOyGjOyKpCBEQiDsl7DqsrAg7ISk7KCVKHNvbmFtdS5jb25maWcudHMp7J2064KYIEVudGl0eSDqtIDqs4Qg7KCV7J2Y66W8IO2ZleyduO2VtOyjvOyEuOyalC5cXG5cIiArXG4gICAgICAgICAgXCLsnpDshLjtlZwg64K07JqpOlwiLFxuICAgICAgKSxcbiAgICAgIGVycm9yLFxuICAgICk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBmaXh0dXJlIGV4cGxvcmUg66qF66C57Ja0IC0gRELsnZgg7Iuk7KCcIOuNsOydtO2EsOulvCDsobDtmoztlZjsl6wg7ZmV7J247ZWp64uI64ukLlxuICog7KCA7J6l7ZWY7KeAIOyViuqzoCDsobDtmozrp4wg7ZWY66+A66GcIOuNsOydtO2EsOulvCDruaDrpbTqsowg7ZmV7J247ZWgIOuVjCDsnKDsmqntlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXh0dXJlRXhwbG9yZUNvbW1hbmQob3B0aW9uczogRml4dHVyZUNvbW1hbmRPcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFFbnRpdHlNYW5hZ2VyLmlzQXV0b2xvYWRlZCkge1xuICAgICAgYXdhaXQgRW50aXR5TWFuYWdlci5hdXRvbG9hZCgpO1xuICAgIH1cblxuICAgIGxldCBlbnRpdHlOYW1lID0gb3B0aW9ucy5pbmNsdWRlO1xuXG4gICAgaWYgKCFlbnRpdHlOYW1lICYmIG9wdGlvbnMubm9uSW50ZXJhY3RpdmUgPT09IHRydWUpIHtcbiAgICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKFwiRml4dHVyZSBleHBsb3JlIHNlbGVjdG9yIGlzIHJlcXVpcmVkLlwiKSwge1xuICAgICAgICBjb2RlOiBcIk1JU1NJTkdfQVJHVU1FTlRcIixcbiAgICAgICAgZXhpdENvZGU6IDIsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFlbnRpdHlOYW1lKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJzZWxlY3RcIixcbiAgICAgICAgbmFtZTogXCJlbnRpdHlcIixcbiAgICAgICAgbWVzc2FnZTogXCLtg5Dsg4ntlaAgRW50aXR5OlwiLFxuICAgICAgICBjaG9pY2VzOiBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpLm1hcCgoaWQpID0+ICh7IHRpdGxlOiBpZCwgdmFsdWU6IGlkIH0pKSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3VsdC5lbnRpdHkpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwi7Leo7IaM65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZW50aXR5TmFtZSA9IHJlc3VsdC5lbnRpdHk7XG4gICAgfVxuXG4gICAgaWYgKCFlbnRpdHlOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbnRpdHkgbmFtZSBpcyByZXF1aXJlZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHJhdGVneTogRGF0YUV4cGxvcmVyU3RyYXRlZ3kgPSBvcHRpb25zLnN0cmF0ZWd5ID8/IFwic2FtcGxlXCI7XG4gICAgY29uc3QgbGltaXQgPSBvcHRpb25zLmxpbWl0ID8gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhvcHRpb25zLmxpbWl0KSwgMTApIDogMTA7XG5cbiAgICBjb25zdCBkYiA9IERCLmdldERCKFwiclwiKTtcbiAgICBjb25zdCBleHBsb3JlciA9IG5ldyBEYXRhRXhwbG9yZXIoZGIsIEVudGl0eU1hbmFnZXIpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBleHBsb3Jlci5leHBsb3JlKGVudGl0eU5hbWUsIHsgc3RyYXRlZ3ksIGxpbWl0IH0pO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxuJHtlbnRpdHlOYW1lfSAke2RhdGEubGVuZ3RofeqwnCDsobDtmowg7JmE66OMOmApKTtcbiAgICBjb25zb2xlLnRhYmxlKGRhdGEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwi642w7J207YSwIOyhsO2ajCDspJEg7Jik66WY6rCAIOuwnOyDne2WiOyKteuLiOuLpC5cXG5cIiArXG4gICAgICAgICAgXCLsm5Dsnbg6IERCIOyXsOqysOydtOuCmCBFbnRpdHkg7KCV7J2Y66W8IO2ZleyduO2VtOyjvOyEuOyalC5cXG5cIiArXG4gICAgICAgICAgXCLsnpDshLjtlZwg64K07JqpOlwiLFxuICAgICAgKSxcbiAgICAgIGVycm9yLFxuICAgICk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztZQVFzQztRQUNIO1VBQ2tCO29CQUNHO1NBQ1g7bUJBQ1U7dUJBRVE7cUJBQ0o7Y0FDakI7QUF5QjFDLE1BQU0sc0JBQXNCLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWTtBQUVsRixTQUFTLFdBQ1AsWUFDQSxNQUNBLFFBQStCO0NBQUM7Q0FBVTtDQUFXO0FBQVMsR0FDL0M7Q0FDZixPQUFPLElBQUksU0FBUyxTQUFTLFdBQVc7RUFDdEMsTUFBTSxRQUFRLE1BQU0sWUFBWSxNQUFNLEVBQUUsTUFBTSxDQUFDO0VBQy9DLE1BQU0sS0FBSyxTQUFTLE1BQU07RUFDMUIsTUFBTSxLQUFLLFNBQVMsTUFBTSxXQUFXO0dBQ25DLElBQUksU0FBUyxHQUFHLFFBQVE7UUFFdEIsdUJBQ0UsSUFBSSxNQUFNLEdBQUcsV0FBVyxPQUFPLFFBQVEsVUFBVSxVQUFVLGFBQWEsQ0FDMUU7RUFDSixDQUFDO0NBQ0gsQ0FBQztBQUNIO0FBRUEsZUFBZSxlQUFlLE1BQWdCLFlBQW9CO0NBQ2hFLE1BQU0sU0FBUyxNQUFNLEtBQUssWUFBWSxHQUFHO0NBQ3pDLElBQUk7RUFDRixNQUFNLFdBQVcsYUFBYSxNQUFNO0dBQUM7R0FBVSxPQUFPO0dBQUk7RUFBUyxDQUFDO0NBQ3RFLFVBQVU7RUFDUixNQUFNLE9BQU8sTUFBTTtDQUNyQjtBQUNGO0FBRUEsZUFBZSxrQkFBa0IsTUFBZ0IsV0FBbUI7Q0FDbEUsTUFBTSxRQUFRLE1BQU0sS0FBSyxXQUFXLEdBQUc7Q0FDdkMsSUFBSTtFQUNGLE1BQU0sV0FBVyxTQUFTLE1BQU07R0FBQyxNQUFNO0dBQUk7R0FBVztFQUFTLENBQUM7Q0FDbEUsVUFBVTtF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
|
|
@@ -18,6 +18,13 @@ export interface TestCommandDependencies {
|
|
|
18
18
|
findApiRootPath: typeof findApiRootPath;
|
|
19
19
|
loadConfig: (apiRootPath: string) => Promise<TestCommandConfig>;
|
|
20
20
|
}
|
|
21
|
+
export interface LegacyTestCommandInput {
|
|
22
|
+
files?: readonly string[];
|
|
23
|
+
pattern?: string;
|
|
24
|
+
traces?: boolean;
|
|
25
|
+
status?: boolean;
|
|
26
|
+
}
|
|
21
27
|
export declare function testCommand(dependencies?: TestCommandDependencies): Promise<void>;
|
|
28
|
+
export declare function testCommandWithInput(input: LegacyTestCommandInput, dependencies?: TestCommandDependencies): Promise<void>;
|
|
22
29
|
export {};
|
|
23
30
|
//# sourceMappingURL=test-command.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-command.d.ts","sourceRoot":"","sources":["../../src/bin/test-command.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAcjD,KAAK,iBAAiB,GAAG;IACvB,MAAM,EAAE;QACN,MAAM,CAAC,EAAE;YACP,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,CAAC;KACH,CAAC;IACF,IAAI,CAAC,EAAE;QACL,SAAS,CAAC,EAAE;YACV,OAAO,CAAC,EAAE,OAAO,CAAC;YAClB,WAAW,CAAC,EAAE,MAAM,CAAC;SACtB,CAAC;KACH,CAAC;CACH,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC/B,eAAe,EAAE,OAAO,eAAe,CAAC;IACxC,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACjE;AAgCD,wBAAsB,WAAW,CAC/B,YAAY,GAAE,uBAAiD,GAC9D,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"test-command.d.ts","sourceRoot":"","sources":["../../src/bin/test-command.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAcjD,KAAK,iBAAiB,GAAG;IACvB,MAAM,EAAE;QACN,MAAM,CAAC,EAAE;YACP,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,CAAC;KACH,CAAC;IACF,IAAI,CAAC,EAAE;QACL,SAAS,CAAC,EAAE;YACV,OAAO,CAAC,EAAE,OAAO,CAAC;YAClB,WAAW,CAAC,EAAE,MAAM,CAAC;SACtB,CAAC;KACH,CAAC;CACH,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC/B,eAAe,EAAE,OAAO,eAAe,CAAC;IACxC,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAgCD,wBAAsB,WAAW,CAC/B,YAAY,GAAE,uBAAiD,GAC9D,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,sBAAsB,EAC7B,YAAY,GAAE,uBAAiD,GAC9D,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
package/dist/bin/test-command.js
CHANGED
|
@@ -36,7 +36,6 @@ function resolveTestBaseUrl(config) {
|
|
|
36
36
|
}
|
|
37
37
|
async function testCommand(dependencies = testCommandDependencies) {
|
|
38
38
|
const args = process.argv.slice(3);
|
|
39
|
-
const config = await loadDevServerConfig(dependencies);
|
|
40
39
|
const files = [];
|
|
41
40
|
let pattern;
|
|
42
41
|
let showTraces = false;
|
|
@@ -48,7 +47,22 @@ async function testCommand(dependencies = testCommandDependencies) {
|
|
|
48
47
|
else if (arg === "--status" || arg === "-s") showStatus = true;
|
|
49
48
|
else if (!arg.startsWith("-")) files.push(arg);
|
|
50
49
|
}
|
|
51
|
-
|
|
50
|
+
return runTestCommand({
|
|
51
|
+
files,
|
|
52
|
+
pattern,
|
|
53
|
+
traces: showTraces,
|
|
54
|
+
status: showStatus
|
|
55
|
+
}, dependencies);
|
|
56
|
+
}
|
|
57
|
+
async function testCommandWithInput(input, dependencies = testCommandDependencies) {
|
|
58
|
+
return runTestCommand(input, dependencies);
|
|
59
|
+
}
|
|
60
|
+
async function runTestCommand(input, dependencies) {
|
|
61
|
+
const config = await loadDevServerConfig(dependencies);
|
|
62
|
+
const files = [...input.files ?? []];
|
|
63
|
+
const pattern = input.pattern;
|
|
64
|
+
const showTraces = input.traces === true;
|
|
65
|
+
if (input.status === true) return testStatusCommand(config, dependencies.fetch);
|
|
52
66
|
if (!config.test?.devRunner?.enabled) {
|
|
53
67
|
console.error(chalk.red("devRunner가 활성화되지 않았습니다. sonamu.config.ts에서 test.devRunner.enabled: true 설정이 필요합니다"));
|
|
54
68
|
process.exit(1);
|
|
@@ -166,6 +180,6 @@ async function testStatusCommand(config, fetchRequest) {
|
|
|
166
180
|
}
|
|
167
181
|
}
|
|
168
182
|
//#endregion
|
|
169
|
-
export { testCommand };
|
|
183
|
+
export { testCommand, testCommandWithInput };
|
|
170
184
|
|
|
171
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jb21tYW5kLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vdGVzdC1jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuXG5pbXBvcnQgeyBsb2FkQ29uZmlnIH0gZnJvbSBcIi4uL2FwaS9jb25maWdcIjtcbmltcG9ydCB7IHR5cGUgUnVuUmVzdWx0LCB0eXBlIFRlc3RDYXNlUmVzdWx0IH0gZnJvbSBcIi4uL3Rlc3RpbmdcIjtcbmltcG9ydCB7IGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5cbmludGVyZmFjZSBUZXN0U2VydmVyTG9jYXRpb24ge1xuICBob3N0OiBzdHJpbmc7XG4gIHBvcnQ6IG51bWJlcjtcbiAgcm91dGVQcmVmaXg6IHN0cmluZztcbiAgYmFzZVVybDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVGVzdFJ1blBheWxvYWQge1xuICBmaWxlcz86IHN0cmluZ1tdO1xuICBwYXR0ZXJuPzogc3RyaW5nO1xufVxuXG50eXBlIFRlc3RDb21tYW5kQ29uZmlnID0ge1xuICBzZXJ2ZXI6IHtcbiAgICBsaXN0ZW4/OiB7XG4gICAgICBob3N0Pzogc3RyaW5nO1xuICAgICAgcG9ydD86IG51bWJlcjtcbiAgICB9O1xuICB9O1xuICB0ZXN0Pzoge1xuICAgIGRldlJ1bm5lcj86IHtcbiAgICAgIGVuYWJsZWQ/OiBib29sZWFuO1xuICAgICAgcm91dGVQcmVmaXg/OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdENvbW1hbmREZXBlbmRlbmNpZXMge1xuICBmZXRjaDogdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2g7XG4gIGZpbmRBcGlSb290UGF0aDogdHlwZW9mIGZpbmRBcGlSb290UGF0aDtcbiAgbG9hZENvbmZpZzogKGFwaVJvb3RQYXRoOiBzdHJpbmcpID0+IFByb21pc2U8VGVzdENvbW1hbmRDb25maWc+O1xufVxuXG5jb25zdCB0ZXN0Q29tbWFuZERlcGVuZGVuY2llczogVGVzdENvbW1hbmREZXBlbmRlbmNpZXMgPSB7XG4gIGZldGNoOiBnbG9iYWxUaGlzLmZldGNoLFxuICBmaW5kQXBpUm9vdFBhdGgsXG4gIGxvYWRDb25maWcsXG59O1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkRGV2U2VydmVyQ29uZmlnKFxuICBkZXBlbmRlbmNpZXM6IFRlc3RDb21tYW5kRGVwZW5kZW5jaWVzLFxuKTogUHJvbWlzZTxUZXN0Q29tbWFuZENvbmZpZz4ge1xuICBjb25zdCBwcmV2Vml0ZXN0ID0gcHJvY2Vzcy5lbnYuVklURVNUO1xuICBwcm9jZXNzLmVudi5WSVRFU1QgPSBcInRydWVcIjtcbiAgdHJ5IHtcbiAgICBjb25zdCBhcGlSb290UGF0aCA9IGRlcGVuZGVuY2llcy5maW5kQXBpUm9vdFBhdGgoKTtcbiAgICByZXR1cm4gYXdhaXQgZGVwZW5kZW5jaWVzLmxvYWRDb25maWcoYXBpUm9vdFBhdGgpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChwcmV2Vml0ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5WSVRFU1Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3MuZW52LlZJVEVTVCA9IHByZXZWaXRlc3Q7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUZXN0QmFzZVVybChjb25maWc6IFRlc3RDb21tYW5kQ29uZmlnKTogVGVzdFNlcnZlckxvY2F0aW9uIHtcbiAgY29uc3QgcG9ydCA9IGNvbmZpZy5zZXJ2ZXIubGlzdGVuPy5wb3J0ID8/IDMwMDA7XG4gIGNvbnN0IGhvc3QgPSBjb25maWcuc2VydmVyLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuICBjb25zdCByb3V0ZVByZWZpeCA9IGNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LnJvdXRlUHJlZml4ID8/IFwiL19fdGVzdF9fXCI7XG4gIHJldHVybiB7IGhvc3QsIHBvcnQsIHJvdXRlUHJlZml4LCBiYXNlVXJsOiBgaHR0cDovLyR7aG9zdH06JHtwb3J0fSR7cm91dGVQcmVmaXh9YCB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdENvbW1hbmQoXG4gIGRlcGVuZGVuY2llczogVGVzdENvbW1hbmREZXBlbmRlbmNpZXMgPSB0ZXN0Q29tbWFuZERlcGVuZGVuY2llcyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmdzID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDMpO1xuXG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGxvYWREZXZTZXJ2ZXJDb25maWcoZGVwZW5kZW5jaWVzKTtcblxuICAvLyBwcm9jZXNzLmFyZ3Yg7YyM7IuxOiBzb25hbXUgdGVzdCBbZmlsZS4uLl0gLS1wYXR0ZXJuIFwi7J2066aEXCIgLS10cmFjZXMgLS1zdGF0dXNcbiAgY29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBwYXR0ZXJuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBzaG93VHJhY2VzID0gZmFsc2U7XG4gIGxldCBzaG93U3RhdHVzID0gZmFsc2U7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXJnID0gYXJnc1tpXTtcbiAgICBpZiAoYXJnID09PSBcIi0tcGF0dGVyblwiIHx8IGFyZyA9PT0gXCItcFwiKSB7XG4gICAgICBwYXR0ZXJuID0gYXJnc1srK2ldO1xuICAgIH0gZWxzZSBpZiAoYXJnID09PSBcIi0tdHJhY2VzXCIgfHwgYXJnID09PSBcIi10XCIpIHtcbiAgICAgIHNob3dUcmFjZXMgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoYXJnID09PSBcIi0tc3RhdHVzXCIgfHwgYXJnID09PSBcIi1zXCIpIHtcbiAgICAgIHNob3dTdGF0dXMgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIWFyZy5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgZmlsZXMucHVzaChhcmcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaG93U3RhdHVzKSB7XG4gICAgcmV0dXJuIHRlc3RTdGF0dXNDb21tYW5kKGNvbmZpZywgZGVwZW5kZW5jaWVzLmZldGNoKTtcbiAgfVxuXG4gIGlmICghY29uZmlnLnRlc3Q/LmRldlJ1bm5lcj8uZW5hYmxlZCkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwiZGV2UnVubmVy6rCAIO2ZnOyEse2ZlOuQmOyngCDslYrslZjsirXri4jri6QuIHNvbmFtdS5jb25maWcudHPsl5DshJwgdGVzdC5kZXZSdW5uZXIuZW5hYmxlZDogdHJ1ZSDshKTsoJXsnbQg7ZWE7JqU7ZWp64uI64ukXCIsXG4gICAgICApLFxuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgeyBiYXNlVXJsIH0gPSByZXNvbHZlVGVzdEJhc2VVcmwoY29uZmlnKTtcbiAgY29uc3QgdXJsID0gYCR7YmFzZVVybH0vcnVuYDtcblxuICBjb25zdCBwYXlsb2FkOiBUZXN0UnVuUGF5bG9hZCA9IHt9O1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIHBheWxvYWQuZmlsZXMgPSBmaWxlcztcbiAgfVxuICBpZiAocGF0dGVybikge1xuICAgIHBheWxvYWQucGF0dGVybiA9IHBhdHRlcm47XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZGVwZW5kZW5jaWVzLmZldGNoKHVybCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgXCJkZXZSdW5uZXLqsIAg7Zmc7ISx7ZmU65CY7KeAIOyViuyVmOyKteuLiOuLpC4gc29uYW11LmNvbmZpZy50c+yXkOyEnCB0ZXN0LmRldlJ1bm5lci5lbmFibGVkOiB0cnVlIOyEpOygleydtCDtlYTsmpTtlanri4jri6RcIixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICBjb25zdCBlcnJvckJvZHkgPVxuICAgICAgICAvKiBTQUZFVFk6IENMSSDtjIzshJzsmYAg67mM65OcIOuPhOq1rCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMge1xuICAgICAgICAgIGVycm9yPzogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJWaXRlc3Qg7J247Iqk7YS07Iqk6rCAIOyVhOyngSDspIDruYTrkJjsp4Ag7JWK7JWY7Iq164uI64ukXCIpKTtcbiAgICAgIGlmIChlcnJvckJvZHkuZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoZXJyb3JCb2R5LmVycm9yKSk7XG4gICAgICB9XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYOyYiOyDge2VmOyngCDrqrvtlZwg7J2R64u1OiAke3Jlc3BvbnNlLnN0YXR1c31gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAgIC8qIFNBRkVUWTogQ0xJIO2MjOyEnOyZgCDruYzrk5wg64+E6rWsIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBSdW5SZXN1bHQ7XG5cbiAgICBjb25zdCB7IHBhc3NlZCwgZmFpbGVkOiBmYWlsZWRDb3VudCwgdG90YWwsIGR1cmF0aW9uTXMgfSA9IHJlc3VsdC5zdW1tYXJ5O1xuICAgIGNvbnN0IHBhc3NlZFN0ciA9IGNoYWxrLmdyZWVuKGAke3Bhc3NlZH0gcGFzc2VkYCk7XG4gICAgY29uc3QgZmFpbGVkU3RyID1cbiAgICAgIGZhaWxlZENvdW50ID4gMCA/IGNoYWxrLnJlZChgJHtmYWlsZWRDb3VudH0gZmFpbGVkYCkgOiBgJHtmYWlsZWRDb3VudH0gZmFpbGVkYDtcbiAgICBjb25zb2xlLmxvZyhgXFxuVGVzdHM6ICR7cGFzc2VkU3RyfSwgJHtmYWlsZWRTdHJ9LCAke3RvdGFsfSB0b3RhbGApO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgRHVyYXRpb246ICR7ZHVyYXRpb25Nc31tc2ApKTtcblxuICAgIGNvbnN0IGZhaWxlZFRlc3RzID0gY29sbGVjdEZhaWxlZEZyb21SZXN1bHRzKHJlc3VsdC5yZXN1bHRzKTtcbiAgICBpZiAoZmFpbGVkVGVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkLmJvbGQoXCJcXG5GYWlsZWQgdGVzdHM6XCIpKTtcbiAgICAgIGZvciAoY29uc3QgZiBvZiBmYWlsZWRUZXN0cykge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2NoYWxrLnJlZChcInhcIil9ICR7Zi5mdWxsTmFtZX0gJHtjaGFsay5kaW0oYCgke2YuZmlsZX0pYCl9YCk7XG4gICAgICAgIGlmIChmLmVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgICAke2NoYWxrLnJlZChmLmVycm9yLm1lc3NhZ2UpfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dUcmFjZXMpIHtcbiAgICAgIGNvbnN0IHRlc3RzV2l0aFRyYWNlcyA9IGNvbGxlY3RUcmFjZXNGcm9tUmVzdWx0cyhyZXN1bHQucmVzdWx0cyk7XG4gICAgICBpZiAodGVzdHNXaXRoVHJhY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbi5ib2xkKFwiXFxuVHJhY2VzOlwiKSk7XG4gICAgICAgIGZvciAoY29uc3QgeyB0ZXN0TmFtZSwgZmlsZSwgdHJhY2VzIH0gb2YgdGVzdHNXaXRoVHJhY2VzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFxcbiAgJHtjaGFsay5ib2xkKHRlc3ROYW1lKX1gKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAke2NoYWxrLmRpbShwYXRoLmJhc2VuYW1lKGZpbGUpKX1gKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHRyYWNlIG9mIHRyYWNlcykge1xuICAgICAgICAgICAgY29uc3QgbG9jID0gYCR7cGF0aC5iYXNlbmFtZSh0cmFjZS5maWxlUGF0aCl9OiR7dHJhY2UubGluZU51bWJlcn1gO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVTdHIgPSBpc1N0cmluZ1ZhbHVlKHRyYWNlLnZhbHVlKVxuICAgICAgICAgICAgICA/IHRyYWNlLnZhbHVlXG4gICAgICAgICAgICAgIDogKEpTT04uc3RyaW5naWZ5KHRyYWNlLnZhbHVlLCBudWxsLCAyKSA/PyBcInVuZGVmaW5lZFwiKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBcXG4gICAgJHtjaGFsay55ZWxsb3coYFske3RyYWNlLmtleX1dYCl9ICR7Y2hhbGsuZGltKGxvYyl9YCk7XG4gICAgICAgICAgICBjb25zdCBpbmRlbnRlZCA9IHZhbHVlU3RyLnNwbGl0KFwiXFxuXCIpLmpvaW4oXCJcXG4gICAgXCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgICAke2luZGVudGVkfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgVHlwZUVycm9yICYmIGVyci5jYXVzZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFwiZGV2IOyEnOuyhOyXkCDsl7DqsrDtlaAg7IiYIOyXhuyKteuLiOuLpC4gc29uYW11IGRlduqwgCDsi6Ttlokg7KSR7J247KeAIO2ZleyduO2VmOyEuOyalFwiKSxcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0RmFpbGVkRnJvbVJlc3VsdHMobm9kZXM6IFRlc3RDYXNlUmVzdWx0W10pOiBUZXN0Q2FzZVJlc3VsdFtdIHtcbiAgY29uc3QgcmVzdWx0OiBUZXN0Q2FzZVJlc3VsdFtdID0gW107XG4gIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgIGlmIChub2RlLmtpbmQgPT09IFwidGVzdFwiICYmIG5vZGUuc3RhdGUgPT09IFwiZmFpbGVkXCIpIHtcbiAgICAgIHJlc3VsdC5wdXNoKG5vZGUpO1xuICAgIH1cbiAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5jb2xsZWN0RmFpbGVkRnJvbVJlc3VsdHMobm9kZS5jaGlsZHJlbikpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0VHJhY2VzRnJvbVJlc3VsdHMoXG4gIG5vZGVzOiBUZXN0Q2FzZVJlc3VsdFtdLFxuKTogeyB0ZXN0TmFtZTogc3RyaW5nOyBmaWxlOiBzdHJpbmc7IHRyYWNlczogVGVzdENhc2VSZXN1bHRbXCJ0cmFjZXNcIl0gfVtdIHtcbiAgY29uc3QgcmVzdWx0OiB7IHRlc3ROYW1lOiBzdHJpbmc7IGZpbGU6IHN0cmluZzsgdHJhY2VzOiBUZXN0Q2FzZVJlc3VsdFtcInRyYWNlc1wiXSB9W10gPSBbXTtcbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgaWYgKG5vZGUua2luZCA9PT0gXCJ0ZXN0XCIgJiYgbm9kZS50cmFjZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0LnB1c2goeyB0ZXN0TmFtZTogbm9kZS5mdWxsTmFtZSwgZmlsZTogbm9kZS5maWxlLCB0cmFjZXM6IG5vZGUudHJhY2VzIH0pO1xuICAgIH1cbiAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5jb2xsZWN0VHJhY2VzRnJvbVJlc3VsdHMobm9kZS5jaGlsZHJlbikpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0U3RhdHVzQ29tbWFuZChcbiAgY29uZmlnOiBUZXN0Q29tbWFuZENvbmZpZyxcbiAgZmV0Y2hSZXF1ZXN0OiB0eXBlb2YgZ2xvYmFsVGhpcy5mZXRjaCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LmVuYWJsZWQpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBcImRldlJ1bm5lcuqwgCDtmZzshLHtmZTrkJjsp4Ag7JWK7JWY7Iq164uI64ukLiBzb25hbXUuY29uZmlnLnRz7JeQ7IScIHRlc3QuZGV2UnVubmVyLmVuYWJsZWQ6IHRydWUg7ISk7KCV7J20IO2VhOyalO2VqeuLiOuLpFwiLFxuICAgICAgKSxcbiAgICApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IHsgYmFzZVVybCB9ID0gcmVzb2x2ZVRlc3RCYXNlVXJsKGNvbmZpZyk7XG4gIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9L3N0YXR1c2A7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoUmVxdWVzdCh1cmwpO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYOyYiOyDge2VmOyngCDrqrvtlZwg7J2R64u1OiAke3Jlc3BvbnNlLnN0YXR1c31gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdHVzID1cbiAgICAgIC8qIFNBRkVUWTogQ0xJIO2MjOyEnOyZgCDruYzrk5wg64+E6rWsIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7XG4gICAgICAgIHJlYWR5OiBib29sZWFuO1xuICAgICAgICBydW5uaW5nOiBib29sZWFuO1xuICAgICAgICBsYXN0UnVuQXQ6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIHNzZUF2YWlsYWJsZTogYm9vbGVhbjtcbiAgICAgIH07XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKFwiRGV2UnVubmVyIOyDge2DnDpcIikpO1xuICAgIGNvbnNvbGUubG9nKGAgIHJlYWR5OiAgICAgICAgJHtzdGF0dXMucmVhZHkgPyBjaGFsay5ncmVlbihcInRydWVcIikgOiBjaGFsay5yZWQoXCJmYWxzZVwiKX1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBydW5uaW5nOiAgICAgICR7c3RhdHVzLnJ1bm5pbmcgPyBjaGFsay55ZWxsb3coXCJ0cnVlXCIpIDogXCJmYWxzZVwifWApO1xuICAgIGNvbnNvbGUubG9nKGAgIGxhc3RSdW5BdDogICAgJHtzdGF0dXMubGFzdFJ1bkF0ID8/IGNoYWxrLmRpbShcIuyXhuydjFwiKX1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBzc2VBdmFpbGFibGU6ICR7c3RhdHVzLnNzZUF2YWlsYWJsZSA/IGNoYWxrLmdyZWVuKFwidHJ1ZVwiKSA6IFwiZmFsc2VcIn1gKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIFR5cGVFcnJvciAmJiBlcnIuY2F1c2UpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcImRldiDshJzrsoTsl5Ag7Jew6rKw7ZWgIOyImCDsl4bsirXri4jri6QuIHNvbmFtdSBkZXbqsIAg7Iuk7ZaJIOykkeyduOyngCDtmZXsnbjtlZjshLjsmpRcIiksXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O1lBSTBDO21CQUVZO1dBQ047QUFtQ2hELE1BQU0sMEJBQW1EO0NBQ3ZELE9BQU8sV0FBVztDQUNsQjtDQUNBO0FBQ0Y7QUFFQSxlQUFlLG9CQUNiLGNBQzRCO0NBQzVCLE1BQU0sYUFBYSxRQUFRLElBQUk7Q0FDL0IsUUFBUSxJQUFJLFNBQVM7Q0FDckIsSUFBSTtFQUNGLE1BQU0sY0FBYyxhQUFhLGdCQUFnQjtFQUNqRCxPQUFPLE1BQU0sYUFBYSxXQUFXLFdBQVc7Q0FDbEQsVUFBVTtFQUNSLElBQUksZUFBZSxRQUNqQixPQUFPLFFBQVEsSUFBSTtPQUVuQixRQUFRLElBQUksU0FBUztDQUV6QjtBQUNGO0FBRUEsU0FBUyxtQkFBbUIsUUFBK0M7Q0FDekUsTUFBTSxPQUFPLE9BQU8sT0FBTyxRQUFRLFFBQVE7Q0FDM0MsTUFBTSxPQUFPLE9BQU8sT0FBTyxRQUFRLFFBQVE7Q0FDM0MsTUFBTSxjQUFjLE9BQU8sTUFBTSxXQUFXLGVBQWU7Q0FDM0QsT0FBTztFQUFFO0VBQU07RUFBTTtFQUFhLFNBQVMsVUFBVSxLQUFLLEdBQUcsT0FBTztDQUFjO0FBQ3BGO0FBRUEsZUFBc0IsWUFDcEIsZUFBd0MseUJBQ3pCO0NBQ2YsTUFBTSxPQUFPLFFBQVEsS0FBSyxNQUFNLENBQUM7Q0FFakMsTUFBTSxTQUFTLE1BQU0sb0JBQW9CLFlBQVk7Q0FHckQsTUFBTSxRQUFrQixDQUFDO0NBQ3pCLElBQUk7Q0FDSixJQUFJLGFBQWE7Q0FDakIs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
|
|
185
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jb21tYW5kLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vdGVzdC1jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuXG5pbXBvcnQgeyBsb2FkQ29uZmlnIH0gZnJvbSBcIi4uL2FwaS9jb25maWdcIjtcbmltcG9ydCB7IHR5cGUgUnVuUmVzdWx0LCB0eXBlIFRlc3RDYXNlUmVzdWx0IH0gZnJvbSBcIi4uL3Rlc3RpbmdcIjtcbmltcG9ydCB7IGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5cbmludGVyZmFjZSBUZXN0U2VydmVyTG9jYXRpb24ge1xuICBob3N0OiBzdHJpbmc7XG4gIHBvcnQ6IG51bWJlcjtcbiAgcm91dGVQcmVmaXg6IHN0cmluZztcbiAgYmFzZVVybDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVGVzdFJ1blBheWxvYWQge1xuICBmaWxlcz86IHN0cmluZ1tdO1xuICBwYXR0ZXJuPzogc3RyaW5nO1xufVxuXG50eXBlIFRlc3RDb21tYW5kQ29uZmlnID0ge1xuICBzZXJ2ZXI6IHtcbiAgICBsaXN0ZW4/OiB7XG4gICAgICBob3N0Pzogc3RyaW5nO1xuICAgICAgcG9ydD86IG51bWJlcjtcbiAgICB9O1xuICB9O1xuICB0ZXN0Pzoge1xuICAgIGRldlJ1bm5lcj86IHtcbiAgICAgIGVuYWJsZWQ/OiBib29sZWFuO1xuICAgICAgcm91dGVQcmVmaXg/OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdENvbW1hbmREZXBlbmRlbmNpZXMge1xuICBmZXRjaDogdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2g7XG4gIGZpbmRBcGlSb290UGF0aDogdHlwZW9mIGZpbmRBcGlSb290UGF0aDtcbiAgbG9hZENvbmZpZzogKGFwaVJvb3RQYXRoOiBzdHJpbmcpID0+IFByb21pc2U8VGVzdENvbW1hbmRDb25maWc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExlZ2FjeVRlc3RDb21tYW5kSW5wdXQge1xuICBmaWxlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICBwYXR0ZXJuPzogc3RyaW5nO1xuICB0cmFjZXM/OiBib29sZWFuO1xuICBzdGF0dXM/OiBib29sZWFuO1xufVxuXG5jb25zdCB0ZXN0Q29tbWFuZERlcGVuZGVuY2llczogVGVzdENvbW1hbmREZXBlbmRlbmNpZXMgPSB7XG4gIGZldGNoOiBnbG9iYWxUaGlzLmZldGNoLFxuICBmaW5kQXBpUm9vdFBhdGgsXG4gIGxvYWRDb25maWcsXG59O1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkRGV2U2VydmVyQ29uZmlnKFxuICBkZXBlbmRlbmNpZXM6IFRlc3RDb21tYW5kRGVwZW5kZW5jaWVzLFxuKTogUHJvbWlzZTxUZXN0Q29tbWFuZENvbmZpZz4ge1xuICBjb25zdCBwcmV2Vml0ZXN0ID0gcHJvY2Vzcy5lbnYuVklURVNUO1xuICBwcm9jZXNzLmVudi5WSVRFU1QgPSBcInRydWVcIjtcbiAgdHJ5IHtcbiAgICBjb25zdCBhcGlSb290UGF0aCA9IGRlcGVuZGVuY2llcy5maW5kQXBpUm9vdFBhdGgoKTtcbiAgICByZXR1cm4gYXdhaXQgZGVwZW5kZW5jaWVzLmxvYWRDb25maWcoYXBpUm9vdFBhdGgpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChwcmV2Vml0ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5WSVRFU1Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3MuZW52LlZJVEVTVCA9IHByZXZWaXRlc3Q7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUZXN0QmFzZVVybChjb25maWc6IFRlc3RDb21tYW5kQ29uZmlnKTogVGVzdFNlcnZlckxvY2F0aW9uIHtcbiAgY29uc3QgcG9ydCA9IGNvbmZpZy5zZXJ2ZXIubGlzdGVuPy5wb3J0ID8/IDMwMDA7XG4gIGNvbnN0IGhvc3QgPSBjb25maWcuc2VydmVyLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuICBjb25zdCByb3V0ZVByZWZpeCA9IGNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LnJvdXRlUHJlZml4ID8/IFwiL19fdGVzdF9fXCI7XG4gIHJldHVybiB7IGhvc3QsIHBvcnQsIHJvdXRlUHJlZml4LCBiYXNlVXJsOiBgaHR0cDovLyR7aG9zdH06JHtwb3J0fSR7cm91dGVQcmVmaXh9YCB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdENvbW1hbmQoXG4gIGRlcGVuZGVuY2llczogVGVzdENvbW1hbmREZXBlbmRlbmNpZXMgPSB0ZXN0Q29tbWFuZERlcGVuZGVuY2llcyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmdzID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDMpO1xuICBjb25zdCBmaWxlczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IHBhdHRlcm46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHNob3dUcmFjZXMgPSBmYWxzZTtcbiAgbGV0IHNob3dTdGF0dXMgPSBmYWxzZTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhcmcgPSBhcmdzW2ldO1xuICAgIGlmIChhcmcgPT09IFwiLS1wYXR0ZXJuXCIgfHwgYXJnID09PSBcIi1wXCIpIHtcbiAgICAgIHBhdHRlcm4gPSBhcmdzWysraV07XG4gICAgfSBlbHNlIGlmIChhcmcgPT09IFwiLS10cmFjZXNcIiB8fCBhcmcgPT09IFwiLXRcIikge1xuICAgICAgc2hvd1RyYWNlcyA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChhcmcgPT09IFwiLS1zdGF0dXNcIiB8fCBhcmcgPT09IFwiLXNcIikge1xuICAgICAgc2hvd1N0YXR1cyA9IHRydWU7XG4gICAgfSBlbHNlIGlmICghYXJnLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICBmaWxlcy5wdXNoKGFyZyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJ1blRlc3RDb21tYW5kKHsgZmlsZXMsIHBhdHRlcm4sIHRyYWNlczogc2hvd1RyYWNlcywgc3RhdHVzOiBzaG93U3RhdHVzIH0sIGRlcGVuZGVuY2llcyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0Q29tbWFuZFdpdGhJbnB1dChcbiAgaW5wdXQ6IExlZ2FjeVRlc3RDb21tYW5kSW5wdXQsXG4gIGRlcGVuZGVuY2llczogVGVzdENvbW1hbmREZXBlbmRlbmNpZXMgPSB0ZXN0Q29tbWFuZERlcGVuZGVuY2llcyxcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gcnVuVGVzdENvbW1hbmQoaW5wdXQsIGRlcGVuZGVuY2llcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blRlc3RDb21tYW5kKFxuICBpbnB1dDogTGVnYWN5VGVzdENvbW1hbmRJbnB1dCxcbiAgZGVwZW5kZW5jaWVzOiBUZXN0Q29tbWFuZERlcGVuZGVuY2llcyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb25maWcgPSBhd2FpdCBsb2FkRGV2U2VydmVyQ29uZmlnKGRlcGVuZGVuY2llcyk7XG4gIGNvbnN0IGZpbGVzID0gWy4uLihpbnB1dC5maWxlcyA/PyBbXSldO1xuICBjb25zdCBwYXR0ZXJuID0gaW5wdXQucGF0dGVybjtcbiAgY29uc3Qgc2hvd1RyYWNlcyA9IGlucHV0LnRyYWNlcyA9PT0gdHJ1ZTtcbiAgY29uc3Qgc2hvd1N0YXR1cyA9IGlucHV0LnN0YXR1cyA9PT0gdHJ1ZTtcblxuICBpZiAoc2hvd1N0YXR1cykge1xuICAgIHJldHVybiB0ZXN0U3RhdHVzQ29tbWFuZChjb25maWcsIGRlcGVuZGVuY2llcy5mZXRjaCk7XG4gIH1cblxuICBpZiAoIWNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LmVuYWJsZWQpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBcImRldlJ1bm5lcuqwgCDtmZzshLHtmZTrkJjsp4Ag7JWK7JWY7Iq164uI64ukLiBzb25hbXUuY29uZmlnLnRz7JeQ7IScIHRlc3QuZGV2UnVubmVyLmVuYWJsZWQ6IHRydWUg7ISk7KCV7J20IO2VhOyalO2VqeuLiOuLpFwiLFxuICAgICAgKSxcbiAgICApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IHsgYmFzZVVybCB9ID0gcmVzb2x2ZVRlc3RCYXNlVXJsKGNvbmZpZyk7XG4gIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9L3J1bmA7XG5cbiAgY29uc3QgcGF5bG9hZDogVGVzdFJ1blBheWxvYWQgPSB7fTtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBwYXlsb2FkLmZpbGVzID0gZmlsZXM7XG4gIH1cbiAgaWYgKHBhdHRlcm4pIHtcbiAgICBwYXlsb2FkLnBhdHRlcm4gPSBwYXR0ZXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGRlcGVuZGVuY2llcy5mZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICB9KTtcblxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIFwiZGV2UnVubmVy6rCAIO2ZnOyEse2ZlOuQmOyngCDslYrslZjsirXri4jri6QuIHNvbmFtdS5jb25maWcudHPsl5DshJwgdGVzdC5kZXZSdW5uZXIuZW5hYmxlZDogdHJ1ZSDshKTsoJXsnbQg7ZWE7JqU7ZWp64uI64ukXCIsXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDUwMCkge1xuICAgICAgY29uc3QgZXJyb3JCb2R5ID1cbiAgICAgICAgLyogU0FGRVRZOiBDTEkg7YyM7ISc7JmAIOu5jOuTnCDrj4Tqtawg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHtcbiAgICAgICAgICBlcnJvcj86IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiVml0ZXN0IOyduOyKpO2EtOyKpOqwgCDslYTsp4Eg7KSA67mE65CY7KeAIOyViuyVmOyKteuLiOuLpFwiKSk7XG4gICAgICBpZiAoZXJyb3JCb2R5LmVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGVycm9yQm9keS5lcnJvcikpO1xuICAgICAgfVxuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGDsmIjsg4HtlZjsp4Ag66q77ZWcIOydkeuLtTogJHtyZXNwb25zZS5zdGF0dXN9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAvKiBTQUZFVFk6IENMSSDtjIzshJzsmYAg67mM65OcIOuPhOq1rCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgUnVuUmVzdWx0O1xuXG4gICAgY29uc3QgeyBwYXNzZWQsIGZhaWxlZDogZmFpbGVkQ291bnQsIHRvdGFsLCBkdXJhdGlvbk1zIH0gPSByZXN1bHQuc3VtbWFyeTtcbiAgICBjb25zdCBwYXNzZWRTdHIgPSBjaGFsay5ncmVlbihgJHtwYXNzZWR9IHBhc3NlZGApO1xuICAgIGNvbnN0IGZhaWxlZFN0ciA9XG4gICAgICBmYWlsZWRDb3VudCA+IDAgPyBjaGFsay5yZWQoYCR7ZmFpbGVkQ291bnR9IGZhaWxlZGApIDogYCR7ZmFpbGVkQ291bnR9IGZhaWxlZGA7XG4gICAgY29uc29sZS5sb2coYFxcblRlc3RzOiAke3Bhc3NlZFN0cn0sICR7ZmFpbGVkU3RyfSwgJHt0b3RhbH0gdG90YWxgKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYER1cmF0aW9uOiAke2R1cmF0aW9uTXN9bXNgKSk7XG5cbiAgICBjb25zdCBmYWlsZWRUZXN0cyA9IGNvbGxlY3RGYWlsZWRGcm9tUmVzdWx0cyhyZXN1bHQucmVzdWx0cyk7XG4gICAgaWYgKGZhaWxlZFRlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZC5ib2xkKFwiXFxuRmFpbGVkIHRlc3RzOlwiKSk7XG4gICAgICBmb3IgKGNvbnN0IGYgb2YgZmFpbGVkVGVzdHMpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtjaGFsay5yZWQoXCJ4XCIpfSAke2YuZnVsbE5hbWV9ICR7Y2hhbGsuZGltKGAoJHtmLmZpbGV9KWApfWApO1xuICAgICAgICBpZiAoZi5lcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtjaGFsay5yZWQoZi5lcnJvci5tZXNzYWdlKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG93VHJhY2VzKSB7XG4gICAgICBjb25zdCB0ZXN0c1dpdGhUcmFjZXMgPSBjb2xsZWN0VHJhY2VzRnJvbVJlc3VsdHMocmVzdWx0LnJlc3VsdHMpO1xuICAgICAgaWYgKHRlc3RzV2l0aFRyYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4uYm9sZChcIlxcblRyYWNlczpcIikpO1xuICAgICAgICBmb3IgKGNvbnN0IHsgdGVzdE5hbWUsIGZpbGUsIHRyYWNlcyB9IG9mIHRlc3RzV2l0aFRyYWNlcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBcXG4gICR7Y2hhbGsuYm9sZCh0ZXN0TmFtZSl9YCk7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgJHtjaGFsay5kaW0ocGF0aC5iYXNlbmFtZShmaWxlKSl9YCk7XG4gICAgICAgICAgZm9yIChjb25zdCB0cmFjZSBvZiB0cmFjZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYyA9IGAke3BhdGguYmFzZW5hbWUodHJhY2UuZmlsZVBhdGgpfToke3RyYWNlLmxpbmVOdW1iZXJ9YDtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlU3RyID0gaXNTdHJpbmdWYWx1ZSh0cmFjZS52YWx1ZSlcbiAgICAgICAgICAgICAgPyB0cmFjZS52YWx1ZVxuICAgICAgICAgICAgICA6IChKU09OLnN0cmluZ2lmeSh0cmFjZS52YWx1ZSwgbnVsbCwgMikgPz8gXCJ1bmRlZmluZWRcIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgXFxuICAgICR7Y2hhbGsueWVsbG93KGBbJHt0cmFjZS5rZXl9XWApfSAke2NoYWxrLmRpbShsb2MpfWApO1xuICAgICAgICAgICAgY29uc3QgaW5kZW50ZWQgPSB2YWx1ZVN0ci5zcGxpdChcIlxcblwiKS5qb2luKFwiXFxuICAgIFwiKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtpbmRlbnRlZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIFR5cGVFcnJvciAmJiBlcnIuY2F1c2UpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcImRldiDshJzrsoTsl5Ag7Jew6rKw7ZWgIOyImCDsl4bsirXri4jri6QuIHNvbmFtdSBkZXbqsIAg7Iuk7ZaJIOykkeyduOyngCDtmZXsnbjtlZjshLjsmpRcIiksXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdEZhaWxlZEZyb21SZXN1bHRzKG5vZGVzOiBUZXN0Q2FzZVJlc3VsdFtdKTogVGVzdENhc2VSZXN1bHRbXSB7XG4gIGNvbnN0IHJlc3VsdDogVGVzdENhc2VSZXN1bHRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICBpZiAobm9kZS5raW5kID09PSBcInRlc3RcIiAmJiBub2RlLnN0YXRlID09PSBcImZhaWxlZFwiKSB7XG4gICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICB9XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0LnB1c2goLi4uY29sbGVjdEZhaWxlZEZyb21SZXN1bHRzKG5vZGUuY2hpbGRyZW4pKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFRyYWNlc0Zyb21SZXN1bHRzKFxuICBub2RlczogVGVzdENhc2VSZXN1bHRbXSxcbik6IHsgdGVzdE5hbWU6IHN0cmluZzsgZmlsZTogc3RyaW5nOyB0cmFjZXM6IFRlc3RDYXNlUmVzdWx0W1widHJhY2VzXCJdIH1bXSB7XG4gIGNvbnN0IHJlc3VsdDogeyB0ZXN0TmFtZTogc3RyaW5nOyBmaWxlOiBzdHJpbmc7IHRyYWNlczogVGVzdENhc2VSZXN1bHRbXCJ0cmFjZXNcIl0gfVtdID0gW107XG4gIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgIGlmIChub2RlLmtpbmQgPT09IFwidGVzdFwiICYmIG5vZGUudHJhY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdC5wdXNoKHsgdGVzdE5hbWU6IG5vZGUuZnVsbE5hbWUsIGZpbGU6IG5vZGUuZmlsZSwgdHJhY2VzOiBub2RlLnRyYWNlcyB9KTtcbiAgICB9XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0LnB1c2goLi4uY29sbGVjdFRyYWNlc0Zyb21SZXN1bHRzKG5vZGUuY2hpbGRyZW4pKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdFN0YXR1c0NvbW1hbmQoXG4gIGNvbmZpZzogVGVzdENvbW1hbmRDb25maWcsXG4gIGZldGNoUmVxdWVzdDogdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2gsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFjb25maWcudGVzdD8uZGV2UnVubmVyPy5lbmFibGVkKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgXCJkZXZSdW5uZXLqsIAg7Zmc7ISx7ZmU65CY7KeAIOyViuyVmOyKteuLiOuLpC4gc29uYW11LmNvbmZpZy50c+yXkOyEnCB0ZXN0LmRldlJ1bm5lci5lbmFibGVkOiB0cnVlIOyEpOygleydtCDtlYTsmpTtlanri4jri6RcIixcbiAgICAgICksXG4gICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCB7IGJhc2VVcmwgfSA9IHJlc29sdmVUZXN0QmFzZVVybChjb25maWcpO1xuICBjb25zdCB1cmwgPSBgJHtiYXNlVXJsfS9zdGF0dXNgO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFJlcXVlc3QodXJsKTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGDsmIjsg4HtlZjsp4Ag66q77ZWcIOydkeuLtTogJHtyZXNwb25zZS5zdGF0dXN9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1cyA9XG4gICAgICAvKiBTQUZFVFk6IENMSSDtjIzshJzsmYAg67mM65OcIOuPhOq1rCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMge1xuICAgICAgICByZWFkeTogYm9vbGVhbjtcbiAgICAgICAgcnVubmluZzogYm9vbGVhbjtcbiAgICAgICAgbGFzdFJ1bkF0OiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBzc2VBdmFpbGFibGU6IGJvb2xlYW47XG4gICAgICB9O1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIkRldlJ1bm5lciDsg4Htg5w6XCIpKTtcbiAgICBjb25zb2xlLmxvZyhgICByZWFkeTogICAgICAgICR7c3RhdHVzLnJlYWR5ID8gY2hhbGsuZ3JlZW4oXCJ0cnVlXCIpIDogY2hhbGsucmVkKFwiZmFsc2VcIil9YCk7XG4gICAgY29uc29sZS5sb2coYCAgcnVubmluZzogICAgICAke3N0YXR1cy5ydW5uaW5nID8gY2hhbGsueWVsbG93KFwidHJ1ZVwiKSA6IFwiZmFsc2VcIn1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBsYXN0UnVuQXQ6ICAgICR7c3RhdHVzLmxhc3RSdW5BdCA/PyBjaGFsay5kaW0oXCLsl4bsnYxcIil9YCk7XG4gICAgY29uc29sZS5sb2coYCAgc3NlQXZhaWxhYmxlOiAke3N0YXR1cy5zc2VBdmFpbGFibGUgPyBjaGFsay5ncmVlbihcInRydWVcIikgOiBcImZhbHNlXCJ9YCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUeXBlRXJyb3IgJiYgZXJyLmNhdXNlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXCJkZXYg7ISc67KE7JeQIOyXsOqysO2VoCDsiJgg7JeG7Iq164uI64ukLiBzb25hbXUgZGV26rCAIOyLpO2WiSDspJHsnbjsp4Ag7ZmV7J247ZWY7IS47JqUXCIpLFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cg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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typecheck-web.d.ts","sourceRoot":"","sources":["../../src/bin/typecheck-web.ts"],"names":[],"mappings":""}
|