sonamu 0.9.19 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.js +36 -0
- package/dist/ai/agents/agent.js +5 -7
- package/dist/ai/agents/index.js +1 -2
- package/dist/ai/agents/types.js +1 -1
- package/dist/ai/index.js +1 -2
- package/dist/ai/providers/rtzr/api.js +2 -3
- package/dist/ai/providers/rtzr/error.js +14 -29
- package/dist/ai/providers/rtzr/index.js +1 -2
- package/dist/ai/providers/rtzr/model.js +13 -20
- package/dist/ai/providers/rtzr/options.js +2 -3
- package/dist/ai/providers/rtzr/provider.js +2 -3
- package/dist/ai/providers/rtzr/utils.js +12 -21
- package/dist/api/base-frame.js +4 -4
- package/dist/api/caster.js +21 -38
- package/dist/api/code-converters.js +41 -98
- package/dist/api/config.d.ts +1 -10
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +9 -8
- package/dist/api/context.js +2 -3
- package/dist/api/decorators.js +80 -116
- package/dist/api/index.js +2 -3
- package/dist/api/secret.js +6 -10
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +200 -387
- package/dist/api/validator.js +5 -8
- package/dist/api/websocket-helpers.js +21 -32
- package/dist/auth/audit-log/builders.js +2 -3
- package/dist/auth/audit-log/events.js +2 -2
- package/dist/auth/audit-log/plugin.js +30 -61
- package/dist/auth/audit-log-ingestor.js +19 -41
- package/dist/auth/auth-generator.js +16 -41
- package/dist/auth/better-auth-entities.js +3 -4
- package/dist/auth/index.js +2 -3
- package/dist/auth/knex-adapter.js +18 -45
- package/dist/auth/plugins/entity-definitions/admin.js +2 -2
- package/dist/auth/plugins/entity-definitions/anonymous.js +2 -2
- package/dist/auth/plugins/entity-definitions/api-key.js +2 -2
- package/dist/auth/plugins/entity-definitions/audit-log.js +2 -2
- package/dist/auth/plugins/entity-definitions/index.js +2 -3
- package/dist/auth/plugins/entity-definitions/jwt.js +2 -2
- package/dist/auth/plugins/entity-definitions/organization.js +2 -2
- package/dist/auth/plugins/entity-definitions/passkey.js +2 -2
- package/dist/auth/plugins/entity-definitions/phone-number.js +2 -2
- package/dist/auth/plugins/entity-definitions/sso.js +2 -2
- package/dist/auth/plugins/entity-definitions/two-factor.js +2 -2
- package/dist/auth/plugins/entity-definitions/types.js +1 -1
- package/dist/auth/plugins/entity-definitions/username.js +2 -2
- package/dist/auth/plugins/index.js +1 -2
- package/dist/auth/plugins/wrappers/admin.js +2 -3
- package/dist/auth/plugins/wrappers/anonymous.js +2 -3
- package/dist/auth/plugins/wrappers/api-key.js +2 -3
- package/dist/auth/plugins/wrappers/index.js +1 -2
- package/dist/auth/plugins/wrappers/jwt.js +2 -3
- package/dist/auth/plugins/wrappers/organization.js +2 -3
- package/dist/auth/plugins/wrappers/passkey.js +2 -3
- package/dist/auth/plugins/wrappers/phone-number.js +2 -3
- package/dist/auth/plugins/wrappers/sso.js +2 -3
- package/dist/auth/plugins/wrappers/two-factor.js +2 -3
- package/dist/auth/plugins/wrappers/username.js +2 -3
- package/dist/bin/build-config.js +2 -2
- package/dist/bin/cli.js +151 -258
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +55 -97
- package/dist/bin/hmr-hook-register.js +3 -3
- package/dist/bin/migrate-targets.d.ts +3 -0
- package/dist/bin/migrate-targets.d.ts.map +1 -0
- package/dist/bin/migrate-targets.js +11 -0
- package/dist/bin/test-command.js +25 -55
- package/dist/bin/ts-loader-register.js +5 -6
- package/dist/bin/ts-loader-registration.js +6 -13
- package/dist/cache/cache-manager.js +3 -4
- package/dist/cache/decorator.js +11 -21
- package/dist/cache/drivers.js +2 -3
- package/dist/cache/index.js +2 -3
- package/dist/cache/types.js +1 -1
- package/dist/cache-control/cache-control.js +21 -34
- package/dist/cache-control/types.js +1 -1
- package/dist/compress/compress.js +10 -10
- package/dist/compress/index.js +1 -2
- package/dist/compress/types.js +1 -1
- package/dist/cone/cone-generator.js +25 -63
- package/dist/database/_batch_update.js +26 -46
- package/dist/database/base-model.js +44 -97
- package/dist/database/base-model.types.js +1 -1
- package/dist/database/db.d.ts +8 -14
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +127 -72
- package/dist/database/knex.js +5 -8
- package/dist/database/puri-subset.types.js +1 -1
- package/dist/database/puri-wrapper.js +11 -15
- package/dist/database/puri.js +117 -234
- package/dist/database/puri.types.js +3 -4
- package/dist/database/transaction-context.js +4 -5
- package/dist/database/upsert-builder.js +109 -176
- package/dist/dict/en.d.ts +1 -0
- package/dist/dict/en.d.ts.map +1 -1
- package/dist/dict/en.js +4 -4
- package/dist/dict/index.js +2 -3
- package/dist/dict/ko.d.ts +1 -0
- package/dist/dict/ko.d.ts.map +1 -1
- package/dist/dict/ko.js +4 -4
- package/dist/dict/rc-keys.js +3 -4
- package/dist/dict/sd.js +8 -19
- package/dist/dict/sonamu-dictionary.js +141 -284
- package/dist/dict/types.js +1 -1
- package/dist/dict/utils.js +4 -5
- package/dist/entity/entity-manager.d.ts +2 -2
- package/dist/entity/entity-manager.js +34 -82
- package/dist/entity/entity-template-cone.js +33 -66
- package/dist/entity/entity.js +156 -310
- package/dist/env.d.ts +14 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +75 -0
- package/dist/exceptions/error-handler.js +2 -3
- package/dist/exceptions/so-exceptions.js +7 -5
- package/dist/filter/index.js +1 -2
- package/dist/filter/types.js +3 -4
- package/dist/filter/utils.js +21 -54
- package/dist/index.js +8 -7
- package/dist/logger/category.js +6 -12
- package/dist/logger/configure.js +23 -34
- package/dist/migration/code-generation.js +146 -314
- package/dist/migration/index-where-predicate.js +52 -144
- package/dist/migration/migration-set.js +19 -33
- package/dist/migration/migrator.d.ts +2 -0
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +69 -53
- package/dist/migration/postgresql-schema-reader.js +126 -225
- package/dist/migration/slack-confirm.d.ts +1 -0
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +28 -38
- package/dist/migration/types.js +1 -1
- package/dist/naite/messaging-types.js +1 -1
- package/dist/naite/naite-reporter.js +15 -32
- package/dist/naite/naite.js +43 -76
- package/dist/ssr/index.js +6 -9
- package/dist/ssr/registry.js +10 -18
- package/dist/ssr/renderer.js +10 -21
- package/dist/ssr/types.js +1 -1
- package/dist/storage/base-file.js +5 -10
- package/dist/storage/buffered-file.js +3 -4
- package/dist/storage/drivers.js +2 -3
- package/dist/storage/index.js +2 -3
- package/dist/storage/s3-driver.js +5 -9
- package/dist/storage/storage-manager.js +5 -5
- package/dist/storage/types.js +1 -1
- package/dist/storage/uploaded-file.js +4 -6
- package/dist/stream/index.js +1 -2
- package/dist/stream/sse.js +8 -13
- package/dist/stream/ws-audience-resolver.js +5 -5
- package/dist/stream/ws-audience.js +3 -4
- package/dist/stream/ws-cluster-bus.js +3 -4
- package/dist/stream/ws-core.js +1 -1
- package/dist/stream/ws-delivery.js +11 -25
- package/dist/stream/ws-local-connection-store.js +9 -18
- package/dist/stream/ws-presence-store.js +43 -97
- package/dist/stream/ws-registry.js +17 -22
- package/dist/stream/ws-telemetry-memory.js +38 -45
- package/dist/stream/ws-telemetry-trace.js +4 -6
- package/dist/stream/ws-telemetry.js +82 -135
- package/dist/stream/ws.js +47 -91
- package/dist/syncer/api-parser.js +81 -147
- package/dist/syncer/checksum.js +9 -20
- package/dist/syncer/code-generator.js +29 -47
- package/dist/syncer/entity-operations.js +17 -27
- package/dist/syncer/event-batcher.js +8 -15
- package/dist/syncer/file-patterns.js +3 -4
- package/dist/syncer/file-tracking.js +6 -10
- package/dist/syncer/index.js +1 -2
- package/dist/syncer/module-loader.js +10 -26
- package/dist/syncer/syncer-actions.js +19 -37
- package/dist/syncer/syncer.js +46 -98
- package/dist/syncer/watcher.js +12 -26
- package/dist/tasks/decorator.js +7 -11
- package/dist/tasks/step-wrapper.js +7 -8
- package/dist/tasks/workflow-manager.js +18 -25
- package/dist/template/entity-converter.js +40 -64
- package/dist/template/helpers.js +32 -63
- package/dist/template/implementations/entity.template.js +7 -11
- package/dist/template/implementations/entry-server.template.js +2 -3
- package/dist/template/implementations/generated.template.js +25 -51
- package/dist/template/implementations/generated_http.template.js +31 -58
- package/dist/template/implementations/generated_sso.template.js +45 -85
- package/dist/template/implementations/init_types.template.js +4 -7
- package/dist/template/implementations/model.template.js +5 -10
- package/dist/template/implementations/model_test.template.js +2 -3
- package/dist/template/implementations/queries.template.js +4 -7
- package/dist/template/implementations/sd.template.js +17 -35
- package/dist/template/implementations/services.template.js +18 -30
- package/dist/template/implementations/view_form.template.js +72 -125
- package/dist/template/implementations/view_id_all_select.template.js +2 -3
- package/dist/template/implementations/view_list.template.js +86 -143
- package/dist/template/implementations/view_search_input.template.js +2 -3
- package/dist/template/index.js +5 -8
- package/dist/template/template-manager.js +13 -26
- package/dist/template/template-types.js +2 -3
- package/dist/template/template.js +7 -11
- package/dist/template/zod-converter.js +173 -348
- package/dist/testing/_relation-graph.js +18 -37
- package/dist/testing/bootstrap.js +5 -8
- package/dist/testing/data-explorer.js +34 -78
- package/dist/testing/dev-test-routes.js +54 -60
- package/dist/testing/dev-vitest-manager.js +33 -84
- package/dist/testing/faker-mappings.js +3 -4
- package/dist/testing/fixture-generator.d.ts +2 -1
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +159 -321
- package/dist/testing/fixture-loader.js +2 -2
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +124 -227
- package/dist/testing/global-setup.d.ts.map +1 -1
- package/dist/testing/global-setup.js +29 -17
- package/dist/testing/index.js +1 -2
- package/dist/testing/naite-vitest-reporter.js +2 -3
- package/dist/testing/parallel-db-manager.js +5 -3
- package/dist/testing/vitest-helpers.d.ts.map +1 -1
- package/dist/testing/vitest-helpers.js +15 -12
- package/dist/types/types.d.ts +14 -14
- package/dist/types/types.js +27 -50
- package/dist/ui/ai-api.js +6 -11
- package/dist/ui/ai-client.js +86 -134
- package/dist/ui/api.js +99 -195
- package/dist/ui/cdd-service.js +78 -130
- package/dist/ui/cdd-types.js +1 -1
- package/dist/ui-web/assets/{index-Df8q-fhb.js → index-DFStGyd0.js} +49 -49
- package/dist/ui-web/assets/index-Dx4ap5i4.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.js +13 -25
- package/dist/utils/class-name.js +3 -4
- package/dist/utils/console-util.js +11 -26
- package/dist/utils/controller.d.ts.map +1 -1
- package/dist/utils/controller.js +14 -12
- package/dist/utils/esm-utils.js +5 -8
- package/dist/utils/formatter.js +10 -22
- package/dist/utils/fs-utils.js +14 -25
- package/dist/utils/lodash-able.js +3 -4
- package/dist/utils/model.js +7 -14
- package/dist/utils/object-utils.js +41 -73
- package/dist/utils/path-utils.js +5 -9
- package/dist/utils/process-utils.js +4 -7
- package/dist/utils/sql-parser.js +6 -13
- package/dist/utils/type-utils.js +16 -26
- package/dist/utils/utils.js +18 -40
- package/dist/utils/zod-error.js +9 -16
- package/dist/vector/chunking.js +24 -37
- package/dist/vector/config.js +2 -2
- package/dist/vector/embedding.js +8 -19
- package/dist/vector/index.js +1 -2
- package/dist/vector/types.js +1 -1
- package/package.json +7 -7
- package/src/__tests__/env.test.ts +127 -0
- package/src/api/__tests__/config.test.ts +10 -1
- package/src/api/config.ts +4 -12
- package/src/api/sonamu.ts +14 -4
- package/src/bin/__tests__/migrate-targets.test.ts +28 -0
- package/src/bin/__tests__/test-command.test.ts +82 -1
- package/src/bin/cli.ts +9 -18
- package/src/bin/fixture.ts +5 -4
- package/src/bin/migrate-targets.ts +7 -0
- package/src/bin/test-command.ts +2 -2
- package/src/database/__tests__/db.test.ts +175 -0
- package/src/database/db.ts +193 -71
- package/src/dict/en.ts +2 -0
- package/src/dict/ko.ts +2 -0
- package/src/env.ts +123 -0
- package/src/migration/__tests__/migrator.test.ts +149 -0
- package/src/migration/migrator.ts +74 -17
- package/src/migration/slack-confirm.ts +21 -0
- package/src/skills/sonamu/database.md +1 -1
- package/src/skills/sonamu/entity-basic.md +31 -0
- package/src/skills/sonamu/puri.md +22 -0
- package/src/skills/sonamu/testing-devrunner.md +1 -1
- package/src/skills/sonamu/upsert.md +53 -6
- package/src/stream/ws-telemetry-memory.ts +2 -2
- package/src/testing/fixture-generator.ts +2 -1
- package/src/testing/fixture-manager.ts +3 -4
- package/src/testing/global-setup.ts +42 -18
- package/src/testing/vitest-helpers.ts +14 -0
- package/src/utils/controller.ts +14 -7
- package/tsdown.api.config.ts +6 -0
- package/dist/_virtual/rolldown_runtime.js +0 -39
- package/dist/ui-web/assets/index-D4rYm-Xz.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixture.d.ts","sourceRoot":"","sources":["../../src/bin/fixture.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fixture.d.ts","sourceRoot":"","sources":["../../src/bin/fixture.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAGrE,UAAU,qBAAqB;IAC7B,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAmBD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,iBAuTrE;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,iBAgEvE;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,iBAgDzE"}
|
package/dist/bin/fixture.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getSonamuEnvironment, init_env } from "../env.js";
|
|
1
2
|
import { createKnexInstance, init_knex } from "../database/knex.js";
|
|
2
3
|
import { DB, init_db } from "../database/db.js";
|
|
3
4
|
import { Sonamu, init_sonamu } from "../api/sonamu.js";
|
|
@@ -6,12 +7,12 @@ import { DataExplorer, init_data_explorer } from "../testing/data-explorer.js";
|
|
|
6
7
|
import { FixtureGenerator, init_fixture_generator } from "../testing/fixture-generator.js";
|
|
7
8
|
import chalk from "chalk";
|
|
8
9
|
import prompts from "prompts";
|
|
9
|
-
|
|
10
10
|
//#region src/bin/fixture.ts
|
|
11
11
|
init_sonamu();
|
|
12
12
|
init_db();
|
|
13
13
|
init_knex();
|
|
14
14
|
init_entity_manager();
|
|
15
|
+
init_env();
|
|
15
16
|
init_data_explorer();
|
|
16
17
|
init_fixture_generator();
|
|
17
18
|
/**
|
|
@@ -19,12 +20,8 @@ init_fixture_generator();
|
|
|
19
20
|
*/
|
|
20
21
|
function sanitizeUsername(raw) {
|
|
21
22
|
let username = raw.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
22
|
-
if (username.length === 0)
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
if (/^[0-9]/.test(username)) {
|
|
26
|
-
username = `u${username}`;
|
|
27
|
-
}
|
|
23
|
+
if (username.length === 0) username = "user";
|
|
24
|
+
if (/^[0-9]/.test(username)) username = `u${username}`;
|
|
28
25
|
return username.slice(0, 20);
|
|
29
26
|
}
|
|
30
27
|
/**
|
|
@@ -32,9 +29,7 @@ function sanitizeUsername(raw) {
|
|
|
32
29
|
*/
|
|
33
30
|
async function fixtureGenCommand(options) {
|
|
34
31
|
try {
|
|
35
|
-
if (!EntityManager.isAutoloaded)
|
|
36
|
-
await EntityManager.autoload();
|
|
37
|
-
}
|
|
32
|
+
if (!EntityManager.isAutoloaded) await EntityManager.autoload();
|
|
38
33
|
let entityNames;
|
|
39
34
|
if (options.all) {
|
|
40
35
|
entityNames = EntityManager.getAllIds();
|
|
@@ -42,9 +37,8 @@ async function fixtureGenCommand(options) {
|
|
|
42
37
|
const excludeList = options.exclude.split(",").map((s) => s.trim());
|
|
43
38
|
entityNames = entityNames.filter((name) => !excludeList.includes(name));
|
|
44
39
|
}
|
|
45
|
-
} else if (options.include)
|
|
46
|
-
|
|
47
|
-
} else {
|
|
40
|
+
} else if (options.include) entityNames = options.include.split(",").map((s) => s.trim());
|
|
41
|
+
else {
|
|
48
42
|
const result = await prompts({
|
|
49
43
|
type: "multiselect",
|
|
50
44
|
name: "entities",
|
|
@@ -76,8 +70,7 @@ async function fixtureGenCommand(options) {
|
|
|
76
70
|
}
|
|
77
71
|
count = result.count;
|
|
78
72
|
}
|
|
79
|
-
|
|
80
|
-
if (hasUser) {
|
|
73
|
+
if (entityNames.includes("User")) {
|
|
81
74
|
const userModeResult = await prompts({
|
|
82
75
|
type: "select",
|
|
83
76
|
name: "userMode",
|
|
@@ -95,45 +88,37 @@ async function fixtureGenCommand(options) {
|
|
|
95
88
|
return;
|
|
96
89
|
}
|
|
97
90
|
if (userModeResult.userMode === "login") {
|
|
98
|
-
let useLLM
|
|
99
|
-
if (!options["use-llm"]) {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
useLLM$1 = llmResult.useLLM ?? false;
|
|
107
|
-
}
|
|
108
|
-
const enableLLMCache$1 = !options["no-cache"];
|
|
91
|
+
let useLLM = options["use-llm"] ?? false;
|
|
92
|
+
if (!options["use-llm"]) useLLM = (await prompts({
|
|
93
|
+
type: "confirm",
|
|
94
|
+
name: "useLLM",
|
|
95
|
+
message: "LLM으로 더 현실적인 데이터를 생성할까요? (fixtureHint 기반, ANTHROPIC_API_KEY 필요)",
|
|
96
|
+
initial: false
|
|
97
|
+
})).useLLM ?? false;
|
|
98
|
+
const enableLLMCache = !options["no-cache"];
|
|
109
99
|
const DEFAULT_PASSWORD = "Test1234!";
|
|
110
100
|
const sourceDb = DB.getDB("r");
|
|
111
|
-
const generator
|
|
112
|
-
useLLM
|
|
113
|
-
enableLLMCache
|
|
101
|
+
const generator = new FixtureGenerator(sourceDb, sourceDb, getSonamuEnvironment(), EntityManager, {
|
|
102
|
+
useLLM,
|
|
103
|
+
enableLLMCache
|
|
114
104
|
});
|
|
115
105
|
const createdCredentials = [];
|
|
116
106
|
const basePath = Sonamu.config.server.auth?.basePath ?? "/api/auth";
|
|
117
|
-
if (useLLM
|
|
118
|
-
|
|
119
|
-
} else {
|
|
120
|
-
console.log(chalk.cyan(`\n로그인 가능한 사용자 ${count}명 생성 중...`));
|
|
121
|
-
}
|
|
107
|
+
if (useLLM) console.log(chalk.cyan(`\nLLM 모드로 로그인 가능한 사용자 ${count}명 생성 중... (캐싱: ${enableLLMCache ? "ON" : "OFF"})`));
|
|
108
|
+
else console.log(chalk.cyan(`\n로그인 가능한 사용자 ${count}명 생성 중...`));
|
|
122
109
|
for (let i = 0; i < count; i++) {
|
|
123
|
-
const userData = await generator
|
|
110
|
+
const userData = await generator.generate("User");
|
|
124
111
|
const name = String(userData.name ?? "");
|
|
125
112
|
const email = String(userData.email ?? "");
|
|
126
113
|
const username = sanitizeUsername(String(userData.username ?? ""));
|
|
127
|
-
const displayUsername = userData.display_username !==
|
|
114
|
+
const displayUsername = userData.display_username !== void 0 ? String(userData.display_username) : void 0;
|
|
128
115
|
const body = {
|
|
129
116
|
name,
|
|
130
117
|
email,
|
|
131
118
|
username,
|
|
132
119
|
password: DEFAULT_PASSWORD
|
|
133
120
|
};
|
|
134
|
-
if (displayUsername !==
|
|
135
|
-
body.display_username = displayUsername;
|
|
136
|
-
}
|
|
121
|
+
if (displayUsername !== void 0) body.display_username = displayUsername;
|
|
137
122
|
const req = new Request(`http://localhost${basePath}/sign-up/email`, {
|
|
138
123
|
method: "POST",
|
|
139
124
|
headers: { "Content-Type": "application/json" },
|
|
@@ -142,8 +127,7 @@ async function fixtureGenCommand(options) {
|
|
|
142
127
|
const response = await Sonamu.auth.handler(req);
|
|
143
128
|
if (!response.ok) {
|
|
144
129
|
const responseData = await response.json();
|
|
145
|
-
|
|
146
|
-
if (code === "USER_ALREADY_EXISTS") {
|
|
130
|
+
if ((typeof responseData.code === "string" ? responseData.code : void 0) === "USER_ALREADY_EXISTS") {
|
|
147
131
|
console.log(chalk.yellow(` ⚠️ ${email} 이미 존재 - 건너뜁니다.`));
|
|
148
132
|
continue;
|
|
149
133
|
}
|
|
@@ -161,8 +145,8 @@ async function fixtureGenCommand(options) {
|
|
|
161
145
|
await DB.getDB("w")("users").whereIn("email", emails).update({ email_verified: true });
|
|
162
146
|
console.log(chalk.green(`\nemail_verified = true 업데이트 완료`));
|
|
163
147
|
}
|
|
164
|
-
if (useLLM
|
|
165
|
-
const stats = generator
|
|
148
|
+
if (useLLM) {
|
|
149
|
+
const stats = generator.getLLMCacheStats();
|
|
166
150
|
console.log(chalk.cyan(`[LLM Cache] 캐시 크기: ${stats.size}`));
|
|
167
151
|
}
|
|
168
152
|
console.log(chalk.green(`\n✅ ${createdCredentials.length}명의 로그인 가능한 사용자 생성 완료`));
|
|
@@ -175,7 +159,7 @@ async function fixtureGenCommand(options) {
|
|
|
175
159
|
}
|
|
176
160
|
let saveTarget = options["save-to"] || "db";
|
|
177
161
|
if (!options["save-to"]) {
|
|
178
|
-
|
|
162
|
+
saveTarget = (await prompts({
|
|
179
163
|
type: "select",
|
|
180
164
|
name: "saveTarget",
|
|
181
165
|
message: "저장 방식:",
|
|
@@ -197,8 +181,7 @@ async function fixtureGenCommand(options) {
|
|
|
197
181
|
value: "none"
|
|
198
182
|
}
|
|
199
183
|
]
|
|
200
|
-
});
|
|
201
|
-
saveTarget = result.saveTarget;
|
|
184
|
+
})).saveTarget;
|
|
202
185
|
if (saveTarget === "file:custom") {
|
|
203
186
|
const filenameResult = await prompts({
|
|
204
187
|
type: "text",
|
|
@@ -214,26 +197,20 @@ async function fixtureGenCommand(options) {
|
|
|
214
197
|
}
|
|
215
198
|
}
|
|
216
199
|
let useLLM = options["use-llm"] ?? false;
|
|
217
|
-
if (!options["use-llm"]) {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
});
|
|
224
|
-
useLLM = llmResult.useLLM ?? false;
|
|
225
|
-
}
|
|
200
|
+
if (!options["use-llm"]) useLLM = (await prompts({
|
|
201
|
+
type: "confirm",
|
|
202
|
+
name: "useLLM",
|
|
203
|
+
message: "LLM으로 더 현실적인 데이터를 생성할까요? (fixtureHint 기반, ANTHROPIC_API_KEY 필요)",
|
|
204
|
+
initial: false
|
|
205
|
+
})).useLLM ?? false;
|
|
226
206
|
const enableLLMCache = !options["no-cache"];
|
|
227
207
|
const fixtureDb = createKnexInstance(Sonamu.dbConfig.fixture);
|
|
228
208
|
const generator = new FixtureGenerator(fixtureDb, fixtureDb, "fixture", EntityManager, {
|
|
229
209
|
useLLM,
|
|
230
210
|
enableLLMCache
|
|
231
211
|
});
|
|
232
|
-
if (useLLM) {
|
|
233
|
-
|
|
234
|
-
} else {
|
|
235
|
-
console.log(chalk.cyan(`\n${entityNames.join(", ")} 생성 중...`));
|
|
236
|
-
}
|
|
212
|
+
if (useLLM) console.log(chalk.cyan(`\nLLM 모드로 ${entityNames.join(", ")} 생성 중... (캐싱: ${enableLLMCache ? "ON" : "OFF"})`));
|
|
213
|
+
else console.log(chalk.cyan(`\n${entityNames.join(", ")} 생성 중...`));
|
|
237
214
|
const specs = entityNames.map((entityName) => ({
|
|
238
215
|
entity: entityName,
|
|
239
216
|
count,
|
|
@@ -245,11 +222,9 @@ async function fixtureGenCommand(options) {
|
|
|
245
222
|
console.log(chalk.cyan(`[LLM Cache] 캐시 크기: ${stats.size}`));
|
|
246
223
|
}
|
|
247
224
|
console.log(chalk.green(`\n✅ ${results.length}개 fixture 생성 완료`));
|
|
248
|
-
if (saveTarget === "none")
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
console.log(chalk.green("Fixture DB에 저장되었습니다."));
|
|
252
|
-
} else if (saveTarget.startsWith("file")) {
|
|
225
|
+
if (saveTarget === "none") console.log(JSON.stringify(results, null, 2));
|
|
226
|
+
else if (saveTarget === "db") console.log(chalk.green("Fixture DB에 저장되었습니다."));
|
|
227
|
+
else if (saveTarget.startsWith("file")) {
|
|
253
228
|
const fs = await import("node:fs/promises");
|
|
254
229
|
const path = await import("node:path");
|
|
255
230
|
const fixturesDir = path.join(process.cwd(), "test", "fixtures");
|
|
@@ -260,23 +235,17 @@ async function fixtureGenCommand(options) {
|
|
|
260
235
|
}
|
|
261
236
|
for (const entityName of entityNames) {
|
|
262
237
|
const entityResults = results.filter((r) => r.entityId === entityName);
|
|
263
|
-
if (entityResults.length === 0)
|
|
264
|
-
continue;
|
|
265
|
-
}
|
|
238
|
+
if (entityResults.length === 0) continue;
|
|
266
239
|
let filename;
|
|
267
|
-
if (saveTarget === "file") {
|
|
268
|
-
|
|
269
|
-
filename = `${entity.table}.json`;
|
|
270
|
-
} else {
|
|
271
|
-
filename = saveTarget.replace("file:", "");
|
|
272
|
-
}
|
|
240
|
+
if (saveTarget === "file") filename = `${EntityManager.get(entityName).table}.json`;
|
|
241
|
+
else filename = saveTarget.replace("file:", "");
|
|
273
242
|
const filepath = path.join(fixturesDir, filename);
|
|
274
243
|
await fs.writeFile(filepath, JSON.stringify(entityResults.map((r) => r.data), null, 2));
|
|
275
244
|
console.log(chalk.green(`✅ ${filepath} 저장 완료`));
|
|
276
245
|
}
|
|
277
246
|
}
|
|
278
247
|
} catch (error) {
|
|
279
|
-
console.error(chalk.red("Fixture 생성 중 오류가 발생했습니다.\n
|
|
248
|
+
console.error(chalk.red("Fixture 생성 중 오류가 발생했습니다.\n원인: Entity 정의나 DB 연결을 확인해주세요.\n자세한 내용:"), error);
|
|
280
249
|
throw error;
|
|
281
250
|
}
|
|
282
251
|
}
|
|
@@ -286,9 +255,7 @@ async function fixtureGenCommand(options) {
|
|
|
286
255
|
*/
|
|
287
256
|
async function fixtureFetchCommand(options) {
|
|
288
257
|
try {
|
|
289
|
-
if (!EntityManager.isAutoloaded)
|
|
290
|
-
await EntityManager.autoload();
|
|
291
|
-
}
|
|
258
|
+
if (!EntityManager.isAutoloaded) await EntityManager.autoload();
|
|
292
259
|
let entityNames;
|
|
293
260
|
if (options.all) {
|
|
294
261
|
entityNames = EntityManager.getAllIds();
|
|
@@ -296,9 +263,8 @@ async function fixtureFetchCommand(options) {
|
|
|
296
263
|
const excludeList = options.exclude.split(",").map((s) => s.trim());
|
|
297
264
|
entityNames = entityNames.filter((name) => !excludeList.includes(name));
|
|
298
265
|
}
|
|
299
|
-
} else if (options.include)
|
|
300
|
-
|
|
301
|
-
} else {
|
|
266
|
+
} else if (options.include) entityNames = options.include.split(",").map((s) => s.trim());
|
|
267
|
+
else {
|
|
302
268
|
const result = await prompts({
|
|
303
269
|
type: "multiselect",
|
|
304
270
|
name: "entities",
|
|
@@ -317,9 +283,7 @@ async function fixtureFetchCommand(options) {
|
|
|
317
283
|
}
|
|
318
284
|
const strategy = options.strategy ?? "recent";
|
|
319
285
|
const limit = options.limit ? Number.parseInt(options.limit, 10) : 10;
|
|
320
|
-
const
|
|
321
|
-
const fixtureDb = createKnexInstance(Sonamu.dbConfig.fixture);
|
|
322
|
-
const generator = new FixtureGenerator(sourceDb, fixtureDb, "fixture", EntityManager);
|
|
286
|
+
const generator = new FixtureGenerator(DB.getDB("r"), createKnexInstance(Sonamu.dbConfig.fixture), "fixture", EntityManager);
|
|
323
287
|
console.log(chalk.cyan(`\n${entityNames.join(", ")} import 중...`));
|
|
324
288
|
for (const entityName of entityNames) {
|
|
325
289
|
const results = await generator.importFromSource(entityName, {
|
|
@@ -331,7 +295,7 @@ async function fixtureFetchCommand(options) {
|
|
|
331
295
|
console.log(chalk.green(`✅ ${entityName}: ${results.length}개 import 완료`));
|
|
332
296
|
}
|
|
333
297
|
} catch (error) {
|
|
334
|
-
console.error(chalk.red("실제 DB에서 데이터를 가져오는 중 오류가 발생했습니다.\n
|
|
298
|
+
console.error(chalk.red("실제 DB에서 데이터를 가져오는 중 오류가 발생했습니다.\n원인: 소스 DB 연결 설정(sonamu.config.ts)이나 Entity 관계 정의를 확인해주세요.\n자세한 내용:"), error);
|
|
335
299
|
throw error;
|
|
336
300
|
}
|
|
337
301
|
}
|
|
@@ -341,9 +305,7 @@ async function fixtureFetchCommand(options) {
|
|
|
341
305
|
*/
|
|
342
306
|
async function fixtureExploreCommand(options) {
|
|
343
307
|
try {
|
|
344
|
-
if (!EntityManager.isAutoloaded)
|
|
345
|
-
await EntityManager.autoload();
|
|
346
|
-
}
|
|
308
|
+
if (!EntityManager.isAutoloaded) await EntityManager.autoload();
|
|
347
309
|
let entityName = options.include;
|
|
348
310
|
if (!entityName) {
|
|
349
311
|
const result = await prompts({
|
|
@@ -361,25 +323,21 @@ async function fixtureExploreCommand(options) {
|
|
|
361
323
|
}
|
|
362
324
|
entityName = result.entity;
|
|
363
325
|
}
|
|
364
|
-
if (!entityName)
|
|
365
|
-
throw new Error("Entity name is required");
|
|
366
|
-
}
|
|
326
|
+
if (!entityName) throw new Error("Entity name is required");
|
|
367
327
|
const strategy = options.strategy ?? "sample";
|
|
368
328
|
const limit = options.limit ? Number.parseInt(options.limit, 10) : 10;
|
|
369
|
-
const
|
|
370
|
-
const explorer = new DataExplorer(db, EntityManager);
|
|
371
|
-
const data = await explorer.explore(entityName, {
|
|
329
|
+
const data = await new DataExplorer(DB.getDB("r"), EntityManager).explore(entityName, {
|
|
372
330
|
strategy,
|
|
373
331
|
limit
|
|
374
332
|
});
|
|
375
333
|
console.log(chalk.cyan(`\n${entityName} ${data.length}개 조회 완료:`));
|
|
376
334
|
console.table(data);
|
|
377
335
|
} catch (error) {
|
|
378
|
-
console.error(chalk.red("데이터 조회 중 오류가 발생했습니다.\n
|
|
336
|
+
console.error(chalk.red("데이터 조회 중 오류가 발생했습니다.\n원인: DB 연결이나 Entity 정의를 확인해주세요.\n자세한 내용:"), error);
|
|
379
337
|
throw error;
|
|
380
338
|
}
|
|
381
339
|
}
|
|
382
|
-
|
|
383
340
|
//#endregion
|
|
384
341
|
export { fixtureExploreCommand, fixtureFetchCommand, fixtureGenCommand };
|
|
385
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS5qcyIsIm5hbWVzIjpbImVudGl0eU5hbWVzOiBzdHJpbmdbXSIsInVzZUxMTSIsImVuYWJsZUxMTUNhY2hlIiwiZ2VuZXJhdG9yIiwiY3JlYXRlZENyZWRlbnRpYWxzOiBBcnJheTx7IGVtYWlsOiBzdHJpbmc7IHBhc3N3b3JkOiBzdHJpbmcgfT4iLCJib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiIsImZpbGVuYW1lOiBzdHJpbmciLCJzdHJhdGVneTogRGF0YUV4cGxvcmVyU3RyYXRlZ3kiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL2ZpeHR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHByb21wdHMgZnJvbSBcInByb21wdHNcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IERhdGFFeHBsb3JlciB9IGZyb20gXCIuLi90ZXN0aW5nL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IHR5cGUgRGF0YUV4cGxvcmVyU3RyYXRlZ3kgfSBmcm9tIFwiLi4vdGVzdGluZy9kYXRhLWV4cGxvcmVyXCI7XG5pbXBvcnQgeyBGaXh0dXJlR2VuZXJhdG9yIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1nZW5lcmF0b3JcIjtcblxuaW50ZXJmYWNlIEZpeHR1cmVDb21tYW5kT3B0aW9ucyB7XG4gIF8/OiBzdHJpbmdbXTtcbiAgYWxsPzogYm9vbGVhbjtcbiAgaW5jbHVkZT86IHN0cmluZztcbiAgZXhjbHVkZT86IHN0cmluZztcbiAgY291bnQ/OiBzdHJpbmc7XG4gIFwic2F2ZS10b1wiPzogc3RyaW5nO1xuICBzdHJhdGVneT86IERhdGFFeHBsb3JlclN0cmF0ZWd5O1xuICBsaW1pdD86IHN0cmluZztcbiAgXCJ1c2UtbGxtXCI/OiBib29sZWFuO1xuICBcIm5vLWNhY2hlXCI/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIHVzZXJuYW1l7J2EIOydvOuwmOyggeyduCDqt5zsuZko7JiB66y47J6QIOyLnOyekSwg7JiB66y47J6QL+yIq+yekOunjCwgMS0yMOyekCnsl5Ag66ee64+E66GdIOygleq3nO2ZlO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gc2FuaXRpemVVc2VybmFtZShyYXc6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIOyGjOusuOyekCDrs4DtmZgg7ZuEIOyYgeusuOyekC/siKvsnpAg7Jm4IOusuOyekCDsoJzqsbBcbiAgbGV0IHVzZXJuYW1lID0gcmF3LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTldL2csIFwiXCIpO1xuICBpZiAodXNlcm5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgdXNlcm5hbWUgPSBcInVzZXJcIjtcbiAgfVxuICAvLyDssqsg6riA7J6Q6rCAIOyIq+yekOuptCAndScg7KCR65GQ7Ja0IOy2lOqwgFxuICBpZiAoL15bMC05XS8udGVzdCh1c2VybmFtZSkpIHtcbiAgICB1c2VybmFtZSA9IGB1JHt1c2VybmFtZX1gO1xuICB9XG4gIC8vIDIw7J6QIOy0iOqzvCDsi5wgdHJ1bmNhdGVcbiAgcmV0dXJuIHVzZXJuYW1lLnNsaWNlKDAsIDIwKTtcbn1cblxuLyoqXG4gKiBmaXh0dXJlIGdlbiDrqoXroLnslrQgLSBjb25lIOuplO2DgOuNsOydtO2EsOulvCDtmZzsmqntlZjsl6wg7J6Q64+Z7Jy866GcIGZpeHR1cmXrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4dHVyZUdlbkNvbW1hbmQob3B0aW9uczogRml4dHVyZUNvbW1hbmRPcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFFbnRpdHlNYW5hZ2VyLmlzQXV0b2xvYWRlZCkge1xuICAgICAgYXdhaXQgRW50aXR5TWFuYWdlci5hdXRvbG9hZCgpO1xuICAgIH1cblxuICAgIGxldCBlbnRpdHlOYW1lczogc3RyaW5nW107XG5cbiAgICBpZiAob3B0aW9ucy5hbGwpIHtcbiAgICAgIGVudGl0eU5hbWVzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICAgIGlmIChvcHRpb25zLmV4Y2x1ZGUpIHtcbiAgICAgICAgY29uc3QgZXhjbHVkZUxpc3QgPSBvcHRpb25zLmV4Y2x1ZGUuc3BsaXQoXCIsXCIpLm1hcCgoczogc3RyaW5nKSA9PiBzLnRyaW0oKSk7XG4gICAgICAgIGVudGl0eU5hbWVzID0gZW50aXR5TmFtZXMuZmlsdGVyKChuYW1lKSA9PiAhZXhjbHVkZUxpc3QuaW5jbHVkZXMobmFtZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pbmNsdWRlKSB7XG4gICAgICBlbnRpdHlOYW1lcyA9IG9wdGlvbnMuaW5jbHVkZS5zcGxpdChcIixcIikubWFwKChzOiBzdHJpbmcpID0+IHMudHJpbSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwibXVsdGlzZWxlY3RcIixcbiAgICAgICAgbmFtZTogXCJlbnRpdGllc1wiLFxuICAgICAgICBtZXNzYWdlOiBcIkZpeHR1cmXrpbwg7IOd7ISx7ZWgIEVudGl0eeulvCDshKDtg53tlZjshLjsmpQ6XCIsXG4gICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCkubWFwKChpZCkgPT4gKHsgdGl0bGU6IGlkLCB2YWx1ZTogaWQgfSkpLFxuICAgICAgICBtaW46IDEsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuZW50aXRpZXMgfHwgcmVzdWx0LmVudGl0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlbnRpdHlOYW1lcyA9IHJlc3VsdC5lbnRpdGllcztcbiAgICB9XG5cbiAgICBsZXQgY291bnQgPSBvcHRpb25zLmNvdW50ID8gTnVtYmVyLnBhcnNlSW50KG9wdGlvbnMuY291bnQsIDEwKSA6IDU7XG4gICAgaWYgKCFvcHRpb25zLmNvdW50KSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgbmFtZTogXCJjb3VudFwiLFxuICAgICAgICBtZXNzYWdlOiBcIuqwgSBFbnRpdHnrs4Qg7IOd7ISxIOqwnOyImDpcIixcbiAgICAgICAgaW5pdGlhbDogNSxcbiAgICAgICAgbWluOiAxLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzdWx0LmNvdW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvdW50ID0gcmVzdWx0LmNvdW50O1xuICAgIH1cblxuICAgIC8vIFVzZXIg7JeU7Yuw7Yuw6rCAIO2PrO2VqOuQnCDqsr3smrA6IOuhnOq3uOyduCDqsIDriqUv7ZmV7J247JqpIOu2hOq4sCDshKDtg51cbiAgICBjb25zdCBoYXNVc2VyID0gZW50aXR5TmFtZXMuaW5jbHVkZXMoXCJVc2VyXCIpO1xuXG4gICAgaWYgKGhhc1VzZXIpIHtcbiAgICAgIGNvbnN0IHVzZXJNb2RlUmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwic2VsZWN0XCIsXG4gICAgICAgIG5hbWU6IFwidXNlck1vZGVcIixcbiAgICAgICAgbWVzc2FnZTogXCJVc2VyIOyXlO2LsO2LsOqwgCDtj6ztlajrkJjslrQg7J6I7Iq164uI64ukLiDsg53shLEg67Cp7Iud7J2EIOyEoO2Dne2VmOyEuOyalDpcIixcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgIHsgdGl0bGU6IFwiMS4g66Gc6re47J24IOqwgOuKpe2VnCDsgqzsmqnsnpAgZml4dHVyZSDsg53shLFcIiwgdmFsdWU6IFwibG9naW5cIiB9LFxuICAgICAgICAgIHsgdGl0bGU6IFwiMi4g7ZmV7J247JqpIOuNsOydtO2EsCjroZzqt7jsnbgg67aI6rCAKSDsg53shLFcIiwgdmFsdWU6IFwiZHVtbXlcIiB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghdXNlck1vZGVSZXN1bHQudXNlck1vZGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwi7Leo7IaM65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHVzZXJNb2RlUmVzdWx0LnVzZXJNb2RlID09PSBcImxvZ2luXCIpIHtcbiAgICAgICAgLy8gTExNIOyCrOyaqSDsl6zrtoBcbiAgICAgICAgbGV0IHVzZUxMTSA9IG9wdGlvbnNbXCJ1c2UtbGxtXCJdID8/IGZhbHNlO1xuICAgICAgICBpZiAoIW9wdGlvbnNbXCJ1c2UtbGxtXCJdKSB7XG4gICAgICAgICAgY29uc3QgbGxtUmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgICAgICB0eXBlOiBcImNvbmZpcm1cIixcbiAgICAgICAgICAgIG5hbWU6IFwidXNlTExNXCIsXG4gICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICBcIkxMTeycvOuhnCDrjZQg7ZiE7Iuk7KCB7J24IOuNsOydtO2EsOulvCDsg53shLHtlaDquYzsmpQ/IChmaXh0dXJlSGludCDquLDrsJgsIEFOVEhST1BJQ19BUElfS0VZIO2VhOyalClcIixcbiAgICAgICAgICAgIGluaXRpYWw6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHVzZUxMTSA9IGxsbVJlc3VsdC51c2VMTE0gPz8gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbmFibGVMTE1DYWNoZSA9ICFvcHRpb25zW1wibm8tY2FjaGVcIl07XG4gICAgICAgIGNvbnN0IERFRkFVTFRfUEFTU1dPUkQgPSBcIlRlc3QxMjM0IVwiO1xuXG4gICAgICAgIC8vIOuhnOq3uOyduCDqsIDriqUg6rK966Gc7JeQ7ISc64qUIHNvdXJjZURi66GcIGRldmVsb3BtZW50X21hc3RlciDsgqzsmqlcbiAgICAgICAgY29uc3Qgc291cmNlRGIgPSBEQi5nZXREQihcInJcIik7XG4gICAgICAgIGNvbnN0IGdlbmVyYXRvciA9IG5ldyBGaXh0dXJlR2VuZXJhdG9yKFxuICAgICAgICAgIHNvdXJjZURiLFxuICAgICAgICAgIHNvdXJjZURiLFxuICAgICAgICAgIFwicHJvZHVjdGlvbl9tYXN0ZXJcIixcbiAgICAgICAgICBFbnRpdHlNYW5hZ2VyLFxuICAgICAgICAgIHsgdXNlTExNLCBlbmFibGVMTE1DYWNoZSB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZWRDcmVkZW50aWFsczogQXJyYXk8eyBlbWFpbDogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH0+ID0gW107XG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gU29uYW11LmNvbmZpZy5zZXJ2ZXIuYXV0aD8uYmFzZVBhdGggPz8gXCIvYXBpL2F1dGhcIjtcblxuICAgICAgICBpZiAodXNlTExNKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgICAgICBgXFxuTExNIOuqqOuTnOuhnCDroZzqt7jsnbgg6rCA64ql7ZWcIOyCrOyaqeyekCAke2NvdW50feuqhSDsg53shLEg7KSRLi4uICjsupDsi7E6ICR7ZW5hYmxlTExNQ2FjaGUgPyBcIk9OXCIgOiBcIk9GRlwifSlgLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYFxcbuuhnOq3uOyduCDqsIDriqXtlZwg7IKs7Jqp7J6QICR7Y291bnR966qFIOyDneyEsSDspJEuLi5gKSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICBjb25zdCB1c2VyRGF0YSA9IGF3YWl0IGdlbmVyYXRvci5nZW5lcmF0ZShcIlVzZXJcIik7XG5cbiAgICAgICAgICBjb25zdCBuYW1lID0gU3RyaW5nKHVzZXJEYXRhLm5hbWUgPz8gXCJcIik7XG4gICAgICAgICAgY29uc3QgZW1haWwgPSBTdHJpbmcodXNlckRhdGEuZW1haWwgPz8gXCJcIik7XG4gICAgICAgICAgY29uc3QgdXNlcm5hbWUgPSBzYW5pdGl6ZVVzZXJuYW1lKFN0cmluZyh1c2VyRGF0YS51c2VybmFtZSA/PyBcIlwiKSk7XG4gICAgICAgICAgY29uc3QgZGlzcGxheVVzZXJuYW1lID1cbiAgICAgICAgICAgIHVzZXJEYXRhLmRpc3BsYXlfdXNlcm5hbWUgIT09IHVuZGVmaW5lZCA/IFN0cmluZyh1c2VyRGF0YS5kaXNwbGF5X3VzZXJuYW1lKSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGNvbnN0IGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgICAgICBwYXNzd29yZDogREVGQVVMVF9QQVNTV09SRCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChkaXNwbGF5VXNlcm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYm9keS5kaXNwbGF5X3VzZXJuYW1lID0gZGlzcGxheVVzZXJuYW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlcSA9IG5ldyBSZXF1ZXN0KGBodHRwOi8vbG9jYWxob3N0JHtiYXNlUGF0aH0vc2lnbi11cC9lbWFpbGAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgU29uYW11LmF1dGguaGFuZGxlcihyZXEpO1xuXG4gICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgICBjb25zdCBjb2RlID0gdHlwZW9mIHJlc3BvbnNlRGF0YS5jb2RlID09PSBcInN0cmluZ1wiID8gcmVzcG9uc2VEYXRhLmNvZGUgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gXCJVU0VSX0FMUkVBRFlfRVhJU1RTXCIpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGAgIOKaoO+4jyAgJHtlbWFpbH0g7J2066+4IOyhtOyerCAtIOqxtOuEiOucgeuLiOuLpC5gKSk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkKGAgIOKdjCAke2VtYWlsfSDsg53shLEg7Iuk7YyoOiAke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlRGF0YSl9YCkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY3JlYXRlZENyZWRlbnRpYWxzLnB1c2goeyBlbWFpbCwgcGFzc3dvcmQ6IERFRkFVTFRfUEFTU1dPUkQgfSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYCAg4pyFICR7ZW1haWx9IOyDneyEsSDsmYTro4xgKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbWFpbF92ZXJpZmllZCA9IHRydWUg7KeB7KCRIOyXheuNsOydtO2KuCAoZGV2IO2OuOydmClcbiAgICAgICAgaWYgKGNyZWF0ZWRDcmVkZW50aWFscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgZW1haWxzID0gY3JlYXRlZENyZWRlbnRpYWxzLm1hcCgoYykgPT4gYy5lbWFpbCk7XG4gICAgICAgICAgYXdhaXQgREIuZ2V0REIoXCJ3XCIpKFwidXNlcnNcIikud2hlcmVJbihcImVtYWlsXCIsIGVtYWlscykudXBkYXRlKHsgZW1haWxfdmVyaWZpZWQ6IHRydWUgfSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFxcbmVtYWlsX3ZlcmlmaWVkID0gdHJ1ZSDsl4XrjbDsnbTtirgg7JmE66OMYCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVzZUxMTSkge1xuICAgICAgICAgIGNvbnN0IHN0YXRzID0gZ2VuZXJhdG9yLmdldExMTUNhY2hlU3RhdHMoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBbTExNIENhY2hlXSDsupDsi5wg7YGs6riwOiAke3N0YXRzLnNpemV9YCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oYFxcbuKchSAke2NyZWF0ZWRDcmVkZW50aWFscy5sZW5ndGh966qF7J2YIOuhnOq3uOyduCDqsIDriqXtlZwg7IKs7Jqp7J6QIOyDneyEsSDsmYTro4xgKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGNyZWF0ZWRDcmVkZW50aWFscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJcXG7sg53shLHrkJwg6rOE7KCVIOuqqeuhnTpcIik7XG4gICAgICAgICAgY29uc29sZS50YWJsZShjcmVhdGVkQ3JlZGVudGlhbHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gdXNlck1vZGUgPT09IFwiZHVtbXlcIjog6riw7KG0IGdlbmVyYXRlQmF0Y2goKSDtnZDrpoQg6rOE7IaNXG4gICAgfVxuXG4gICAgbGV0IHNhdmVUYXJnZXQgPSBvcHRpb25zW1wic2F2ZS10b1wiXSB8fCBcImRiXCI7XG4gICAgaWYgKCFvcHRpb25zW1wic2F2ZS10b1wiXSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwic2VsZWN0XCIsXG4gICAgICAgIG5hbWU6IFwic2F2ZVRhcmdldFwiLFxuICAgICAgICBtZXNzYWdlOiBcIuyggOyepSDrsKnsi506XCIsXG4gICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICB7IHRpdGxlOiBcIkZpeHR1cmUgRELsl5Ag7KCA7J6lXCIsIHZhbHVlOiBcImRiXCIgfSxcbiAgICAgICAgICB7IHRpdGxlOiBcIu2MjOydvOuhnCDsoIDsnqUgKOyekOuPmSDtjIzsnbzrqoUpXCIsIHZhbHVlOiBcImZpbGVcIiB9LFxuICAgICAgICAgIHsgdGl0bGU6IFwi7YyM7J2866GcIOyggOyepSAo7YyM7J2866qFIOyngOyglSlcIiwgdmFsdWU6IFwiZmlsZTpjdXN0b21cIiB9LFxuICAgICAgICAgIHsgdGl0bGU6IFwi7KCA7J6lIOyViCDtlaggKOy2nOugpeunjClcIiwgdmFsdWU6IFwibm9uZVwiIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgc2F2ZVRhcmdldCA9IHJlc3VsdC5zYXZlVGFyZ2V0O1xuXG4gICAgICBpZiAoc2F2ZVRhcmdldCA9PT0gXCJmaWxlOmN1c3RvbVwiKSB7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lUmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgbmFtZTogXCJmaWxlbmFtZVwiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwi7YyM7J2866qFOlwiLFxuICAgICAgICAgIGluaXRpYWw6IFwiZml4dHVyZXMuanNvblwiLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWZpbGVuYW1lUmVzdWx0LmZpbGVuYW1lKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwi7Leo7IaM65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2F2ZVRhcmdldCA9IGBmaWxlOiR7ZmlsZW5hbWVSZXN1bHQuZmlsZW5hbWV9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMTE0g7IKs7JqpIOyXrOu2gCDqsrDsoJVcbiAgICBsZXQgdXNlTExNID0gb3B0aW9uc1tcInVzZS1sbG1cIl0gPz8gZmFsc2U7XG4gICAgaWYgKCFvcHRpb25zW1widXNlLWxsbVwiXSkge1xuICAgICAgY29uc3QgbGxtUmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwiY29uZmlybVwiLFxuICAgICAgICBuYW1lOiBcInVzZUxMTVwiLFxuICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgIFwiTExN7Jy866GcIOuNlCDtmITsi6TsoIHsnbgg642w7J207YSw66W8IOyDneyEse2VoOq5jOyalD8gKGZpeHR1cmVIaW50IOq4sOuwmCwgQU5USFJPUElDX0FQSV9LRVkg7ZWE7JqUKVwiLFxuICAgICAgICBpbml0aWFsOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgdXNlTExNID0gbGxtUmVzdWx0LnVzZUxMTSA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVMTE1DYWNoZSA9ICFvcHRpb25zW1wibm8tY2FjaGVcIl07XG5cbiAgICAvLyBmaXh0dXJlIGdlbjogZml4dHVyZSBEQiDrgrTsl5DshJwg7LC47KGwIOq0gOqzhOulvCDtlbTqsrDtlZjqs6Ag7KCA7J6l7ZWp64uI64ukXG4gICAgY29uc3QgZml4dHVyZURiID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlKTtcbiAgICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgRml4dHVyZUdlbmVyYXRvcihmaXh0dXJlRGIsIGZpeHR1cmVEYiwgXCJmaXh0dXJlXCIsIEVudGl0eU1hbmFnZXIsIHtcbiAgICAgIHVzZUxMTSxcbiAgICAgIGVuYWJsZUxMTUNhY2hlLFxuICAgIH0pO1xuXG4gICAgaWYgKHVzZUxMTSkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgYFxcbkxMTSDrqqjrk5zroZwgJHtlbnRpdHlOYW1lcy5qb2luKFwiLCBcIil9IOyDneyEsSDspJEuLi4gKOy6kOyLsTogJHtlbmFibGVMTE1DYWNoZSA/IFwiT05cIiA6IFwiT0ZGXCJ9KWAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG4ke2VudGl0eU5hbWVzLmpvaW4oXCIsIFwiKX0g7IOd7ISxIOykkS4uLmApKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGVjcyA9IGVudGl0eU5hbWVzLm1hcCgoZW50aXR5TmFtZSkgPT4gKHtcbiAgICAgIGVudGl0eTogZW50aXR5TmFtZSxcbiAgICAgIGNvdW50LFxuICAgICAgb3ZlcnJpZGVzOiB7fSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgZ2VuZXJhdG9yLmdlbmVyYXRlQmF0Y2goc3BlY3MpO1xuXG4gICAgaWYgKHVzZUxMTSkge1xuICAgICAgY29uc3Qgc3RhdHMgPSBnZW5lcmF0b3IuZ2V0TExNQ2FjaGVTdGF0cygpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgW0xMTSBDYWNoZV0g7LqQ7IucIO2BrOq4sDogJHtzdGF0cy5zaXplfWApKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgXFxu4pyFICR7cmVzdWx0cy5sZW5ndGh96rCcIGZpeHR1cmUg7IOd7ISxIOyZhOujjGApKTtcblxuICAgIGlmIChzYXZlVGFyZ2V0ID09PSBcIm5vbmVcIikge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0cywgbnVsbCwgMikpO1xuICAgIH0gZWxzZSBpZiAoc2F2ZVRhcmdldCA9PT0gXCJkYlwiKSB7XG4gICAgICAvLyBnZW5lcmF0ZUJhdGNo6rCAIOydtOuvuCBEQuyXkCDsoIDsnqXtlojsnLzrr4DroZwg67OE64+EIOyggOyepeydtCDrtojtlYTsmpTtlanri4jri6QuXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIkZpeHR1cmUgRELsl5Ag7KCA7J6l65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgfSBlbHNlIGlmIChzYXZlVGFyZ2V0LnN0YXJ0c1dpdGgoXCJmaWxlXCIpKSB7XG4gICAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIik7XG4gICAgICBjb25zdCBwYXRoID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuXG4gICAgICBjb25zdCBmaXh0dXJlc0RpciA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInRlc3RcIiwgXCJmaXh0dXJlc1wiKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaXh0dXJlc0Rpcik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoZml4dHVyZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGVudGl0eU5hbWUgb2YgZW50aXR5TmFtZXMpIHtcbiAgICAgICAgY29uc3QgZW50aXR5UmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKChyKSA9PiByLmVudGl0eUlkID09PSBlbnRpdHlOYW1lKTtcblxuICAgICAgICBpZiAoZW50aXR5UmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmaWxlbmFtZTogc3RyaW5nO1xuICAgICAgICBpZiAoc2F2ZVRhcmdldCA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcbiAgICAgICAgICBmaWxlbmFtZSA9IGAke2VudGl0eS50YWJsZX0uanNvbmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmlsZW5hbWUgPSBzYXZlVGFyZ2V0LnJlcGxhY2UoXCJmaWxlOlwiLCBcIlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gcGF0aC5qb2luKGZpeHR1cmVzRGlyLCBmaWxlbmFtZSk7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgICAgICBmaWxlcGF0aCxcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGVudGl0eVJlc3VsdHMubWFwKChyKSA9PiByLmRhdGEpLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKchSAke2ZpbGVwYXRofSDsoIDsnqUg7JmE66OMYCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBcIkZpeHR1cmUg7IOd7ISxIOykkSDsmKTrpZjqsIAg67Cc7IOd7ZaI7Iq164uI64ukLlxcblwiICtcbiAgICAgICAgICBcIuybkOyduDogRW50aXR5IOygleydmOuCmCBEQiDsl7DqsrDsnYQg7ZmV7J247ZW07KO87IS47JqULlxcblwiICtcbiAgICAgICAgICBcIuyekOyEuO2VnCDrgrTsmqk6XCIsXG4gICAgICApLFxuICAgICAgZXJyb3IsXG4gICAgKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIGZpeHR1cmUgZmV0Y2gg66qF66C57Ja0IC0g7Iuk7KCcIOyatOyYgSBEQuyXkOyEnCDrjbDsnbTthLDrpbwg6rCA7KC47JmAIGZpeHR1cmXroZwg7KCA7J6l7ZWp64uI64ukLlxuICog6rSA6rOE65CcIOuNsOydtO2EsOuPhCDtlajqu5gg6rCA7KC47Jik66+A66GcIO2YhOyLpOyggeyduCDthYzsiqTtirgg642w7J207YSw66W8IO2ZleuztO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4dHVyZUZldGNoQ29tbWFuZChvcHRpb25zOiBGaXh0dXJlQ29tbWFuZE9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIUVudGl0eU1hbmFnZXIuaXNBdXRvbG9hZGVkKSB7XG4gICAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgfVxuXG4gICAgbGV0IGVudGl0eU5hbWVzOiBzdHJpbmdbXTtcblxuICAgIGlmIChvcHRpb25zLmFsbCkge1xuICAgICAgZW50aXR5TmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgaWYgKG9wdGlvbnMuZXhjbHVkZSkge1xuICAgICAgICBjb25zdCBleGNsdWRlTGlzdCA9IG9wdGlvbnMuZXhjbHVkZS5zcGxpdChcIixcIikubWFwKChzOiBzdHJpbmcpID0+IHMudHJpbSgpKTtcbiAgICAgICAgZW50aXR5TmFtZXMgPSBlbnRpdHlOYW1lcy5maWx0ZXIoKG5hbWUpID0+ICFleGNsdWRlTGlzdC5pbmNsdWRlcyhuYW1lKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGUpIHtcbiAgICAgIGVudGl0eU5hbWVzID0gb3B0aW9ucy5pbmNsdWRlLnNwbGl0KFwiLFwiKS5tYXAoKHM6IHN0cmluZykgPT4gcy50cmltKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJtdWx0aXNlbGVjdFwiLFxuICAgICAgICBuYW1lOiBcImVudGl0aWVzXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiSW1wb3J07ZWgIEVudGl0eeulvCDshKDtg53tlZjshLjsmpQ6XCIsXG4gICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCkubWFwKChpZCkgPT4gKHsgdGl0bGU6IGlkLCB2YWx1ZTogaWQgfSkpLFxuICAgICAgICBtaW46IDEsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuZW50aXRpZXMgfHwgcmVzdWx0LmVudGl0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlbnRpdHlOYW1lcyA9IHJlc3VsdC5lbnRpdGllcztcbiAgICB9XG5cbiAgICBjb25zdCBzdHJhdGVneTogRGF0YUV4cGxvcmVyU3RyYXRlZ3kgPSBvcHRpb25zLnN0cmF0ZWd5ID8/IFwicmVjZW50XCI7XG4gICAgY29uc3QgbGltaXQgPSBvcHRpb25zLmxpbWl0ID8gTnVtYmVyLnBhcnNlSW50KG9wdGlvbnMubGltaXQsIDEwKSA6IDEwO1xuXG4gICAgLy8gZml4dHVyZSBmZXRjaDogcHJvZHVjdGlvbiDrjbDsnbTthLDrpbwgZml4dHVyZSBEQuuhnCBpbXBvcnTtlanri4jri6RcbiAgICBjb25zdCBzb3VyY2VEYiA9IERCLmdldERCKFwiclwiKTsgLy8gcHJvZHVjdGlvbl9tYXN0ZXIgKOuYkOuKlCBkZXZlbG9wbWVudF9tYXN0ZXIpXG4gICAgY29uc3QgZml4dHVyZURiID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlKTtcbiAgICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgRml4dHVyZUdlbmVyYXRvcihzb3VyY2VEYiwgZml4dHVyZURiLCBcImZpeHR1cmVcIiwgRW50aXR5TWFuYWdlcik7XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG4ke2VudGl0eU5hbWVzLmpvaW4oXCIsIFwiKX0gaW1wb3J0IOykkS4uLmApKTtcblxuICAgIGZvciAoY29uc3QgZW50aXR5TmFtZSBvZiBlbnRpdHlOYW1lcykge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGdlbmVyYXRvci5pbXBvcnRGcm9tU291cmNlKGVudGl0eU5hbWUsIHtcbiAgICAgICAgc3RyYXRlZ3ksXG4gICAgICAgIGxpbWl0LFxuICAgICAgICBpbmNsdWRlUmVsYXRpb25zOiB0cnVlLFxuICAgICAgICBtYXhEZXB0aDogMixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyFICR7ZW50aXR5TmFtZX06ICR7cmVzdWx0cy5sZW5ndGh96rCcIGltcG9ydCDsmYTro4xgKSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwi7Iuk7KCcIERC7JeQ7IScIOuNsOydtO2EsOulvCDqsIDsoLjsmKTripQg7KSRIOyYpOulmOqwgCDrsJzsg53tlojsirXri4jri6QuXFxuXCIgK1xuICAgICAgICAgIFwi7JuQ7J24OiDshozsiqQgREIg7Jew6rKwIOyEpOyglShzb25hbXUuY29uZmlnLnRzKeydtOuCmCBFbnRpdHkg6rSA6rOEIOygleydmOulvCDtmZXsnbjtlbTso7zshLjsmpQuXFxuXCIgK1xuICAgICAgICAgIFwi7J6Q7IS47ZWcIOuCtOyaqTpcIixcbiAgICAgICksXG4gICAgICBlcnJvcixcbiAgICApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogZml4dHVyZSBleHBsb3JlIOuqheugueyWtCAtIERC7J2YIOyLpOygnCDrjbDsnbTthLDrpbwg7KGw7ZqM7ZWY7JesIO2ZleyduO2VqeuLiOuLpC5cbiAqIOyggOyepe2VmOyngCDslYrqs6Ag7KGw7ZqM66eMIO2VmOuvgOuhnCDrjbDsnbTthLDrpbwg67mg66W06rKMIO2ZleyduO2VoCDrlYwg7Jyg7Jqp7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4dHVyZUV4cGxvcmVDb21tYW5kKG9wdGlvbnM6IEZpeHR1cmVDb21tYW5kT3B0aW9ucykge1xuICB0cnkge1xuICAgIGlmICghRW50aXR5TWFuYWdlci5pc0F1dG9sb2FkZWQpIHtcbiAgICAgIGF3YWl0IEVudGl0eU1hbmFnZXIuYXV0b2xvYWQoKTtcbiAgICB9XG5cbiAgICBsZXQgZW50aXR5TmFtZSA9IG9wdGlvbnMuaW5jbHVkZTtcblxuICAgIGlmICghZW50aXR5TmFtZSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwic2VsZWN0XCIsXG4gICAgICAgIG5hbWU6IFwiZW50aXR5XCIsXG4gICAgICAgIG1lc3NhZ2U6IFwi7YOQ7IOJ7ZWgIEVudGl0eTpcIixcbiAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKS5tYXAoKGlkKSA9PiAoeyB0aXRsZTogaWQsIHZhbHVlOiBpZCB9KSksXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuZW50aXR5KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGVudGl0eU5hbWUgPSByZXN1bHQuZW50aXR5O1xuICAgIH1cblxuICAgIGlmICghZW50aXR5TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW50aXR5IG5hbWUgaXMgcmVxdWlyZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RyYXRlZ3k6IERhdGFFeHBsb3JlclN0cmF0ZWd5ID0gb3B0aW9ucy5zdHJhdGVneSA/PyBcInNhbXBsZVwiO1xuICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucy5saW1pdCA/IE51bWJlci5wYXJzZUludChvcHRpb25zLmxpbWl0LCAxMCkgOiAxMDtcblxuICAgIGNvbnN0IGRiID0gREIuZ2V0REIoXCJyXCIpO1xuICAgIGNvbnN0IGV4cGxvcmVyID0gbmV3IERhdGFFeHBsb3JlcihkYiwgRW50aXR5TWFuYWdlcik7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGV4cGxvcmVyLmV4cGxvcmUoZW50aXR5TmFtZSwgeyBzdHJhdGVneSwgbGltaXQgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG4ke2VudGl0eU5hbWV9ICR7ZGF0YS5sZW5ndGh96rCcIOyhsO2ajCDsmYTro4w6YCkpO1xuICAgIGNvbnNvbGUudGFibGUoZGF0YSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgXCLrjbDsnbTthLAg7KGw7ZqMIOykkSDsmKTrpZjqsIAg67Cc7IOd7ZaI7Iq164uI64ukLlxcblwiICtcbiAgICAgICAgICBcIuybkOyduDogREIg7Jew6rKw7J2064KYIEVudGl0eSDsoJXsnZjrpbwg7ZmV7J247ZW07KO87IS47JqULlxcblwiICtcbiAgICAgICAgICBcIuyekOyEuO2VnCDrgrTsmqk6XCIsXG4gICAgICApLFxuICAgICAgZXJyb3IsXG4gICAgKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O2FBR3VDO1NBQ0g7V0FDa0I7cUJBQ0c7b0JBQ0Q7d0JBRVE7Ozs7QUFrQmhFLFNBQVMsaUJBQWlCLEtBQXFCO0NBRTdDLElBQUksV0FBVyxJQUFJLGFBQWEsQ0FBQyxRQUFRLGNBQWMsR0FBRztBQUMxRCxLQUFJLFNBQVMsV0FBVyxHQUFHO0FBQ3pCLGFBQVc7O0FBR2IsS0FBSSxTQUFTLEtBQUssU0FBUyxFQUFFO0FBQzNCLGFBQVcsSUFBSTs7QUFHakIsUUFBTyxTQUFTLE1BQU0sR0FBRyxHQUFHOzs7OztBQU05QixlQUFzQixrQkFBa0IsU0FBZ0M7QUFDdEUsS0FBSTtBQUNGLE1BQUksQ0FBQyxjQUFj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
|
|
342
|
+
|
|
343
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL2ZpeHR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHByb21wdHMgZnJvbSBcInByb21wdHNcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IGdldFNvbmFtdUVudmlyb25tZW50IH0gZnJvbSBcIi4uL2VudlwiO1xuaW1wb3J0IHsgRGF0YUV4cGxvcmVyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZGF0YS1leHBsb3JlclwiO1xuaW1wb3J0IHsgdHlwZSBEYXRhRXhwbG9yZXJTdHJhdGVneSB9IGZyb20gXCIuLi90ZXN0aW5nL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IEZpeHR1cmVHZW5lcmF0b3IgfSBmcm9tIFwiLi4vdGVzdGluZy9maXh0dXJlLWdlbmVyYXRvclwiO1xuXG5pbnRlcmZhY2UgRml4dHVyZUNvbW1hbmRPcHRpb25zIHtcbiAgXz86IHN0cmluZ1tdO1xuICBhbGw/OiBib29sZWFuO1xuICBpbmNsdWRlPzogc3RyaW5nO1xuICBleGNsdWRlPzogc3RyaW5nO1xuICBjb3VudD86IHN0cmluZztcbiAgXCJzYXZlLXRvXCI/OiBzdHJpbmc7XG4gIHN0cmF0ZWd5PzogRGF0YUV4cGxvcmVyU3RyYXRlZ3k7XG4gIGxpbWl0Pzogc3RyaW5nO1xuICBcInVzZS1sbG1cIj86IGJvb2xlYW47XG4gIFwibm8tY2FjaGVcIj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogdXNlcm5hbWXsnYQg7J2867CY7KCB7J24IOq3nOy5mSjsmIHrrLjsnpAg7Iuc7J6RLCDsmIHrrLjsnpAv7Iir7J6Q66eMLCAxLTIw7J6QKeyXkCDrp57rj4TroZ0g7KCV6rec7ZmU7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBzYW5pdGl6ZVVzZXJuYW1lKHJhdzogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8g7IaM66y47J6QIOuzgO2ZmCDtm4Qg7JiB66y47J6QL+yIq+yekCDsmbgg66y47J6QIOygnOqxsFxuICBsZXQgdXNlcm5hbWUgPSByYXcudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0vZywgXCJcIik7XG4gIGlmICh1c2VybmFtZS5sZW5ndGggPT09IDApIHtcbiAgICB1c2VybmFtZSA9IFwidXNlclwiO1xuICB9XG4gIC8vIOyyqyDquIDsnpDqsIAg7Iir7J6Q66m0ICd1JyDsoJHrkZDslrQg7LaU6rCAXG4gIGlmICgvXlswLTldLy50ZXN0KHVzZXJuYW1lKSkge1xuICAgIHVzZXJuYW1lID0gYHUke3VzZXJuYW1lfWA7XG4gIH1cbiAgLy8gMjDsnpAg7LSI6rO8IOyLnCB0cnVuY2F0ZVxuICByZXR1cm4gdXNlcm5hbWUuc2xpY2UoMCwgMjApO1xufVxuXG4vKipcbiAqIGZpeHR1cmUgZ2VuIOuqheugueyWtCAtIGNvbmUg66mU7YOA642w7J207YSw66W8IO2ZnOyaqe2VmOyXrCDsnpDrj5nsnLzroZwgZml4dHVyZeulvCDsg53shLHtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXh0dXJlR2VuQ29tbWFuZChvcHRpb25zOiBGaXh0dXJlQ29tbWFuZE9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIUVudGl0eU1hbmFnZXIuaXNBdXRvbG9hZGVkKSB7XG4gICAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgfVxuXG4gICAgbGV0IGVudGl0eU5hbWVzOiBzdHJpbmdbXTtcblxuICAgIGlmIChvcHRpb25zLmFsbCkge1xuICAgICAgZW50aXR5TmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgaWYgKG9wdGlvbnMuZXhjbHVkZSkge1xuICAgICAgICBjb25zdCBleGNsdWRlTGlzdCA9IG9wdGlvbnMuZXhjbHVkZS5zcGxpdChcIixcIikubWFwKChzOiBzdHJpbmcpID0+IHMudHJpbSgpKTtcbiAgICAgICAgZW50aXR5TmFtZXMgPSBlbnRpdHlOYW1lcy5maWx0ZXIoKG5hbWUpID0+ICFleGNsdWRlTGlzdC5pbmNsdWRlcyhuYW1lKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGUpIHtcbiAgICAgIGVudGl0eU5hbWVzID0gb3B0aW9ucy5pbmNsdWRlLnNwbGl0KFwiLFwiKS5tYXAoKHM6IHN0cmluZykgPT4gcy50cmltKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJtdWx0aXNlbGVjdFwiLFxuICAgICAgICBuYW1lOiBcImVudGl0aWVzXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiRml4dHVyZeulvCDsg53shLHtlaAgRW50aXR566W8IOyEoO2Dne2VmOyEuOyalDpcIixcbiAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKS5tYXAoKGlkKSA9PiAoeyB0aXRsZTogaWQsIHZhbHVlOiBpZCB9KSksXG4gICAgICAgIG1pbjogMSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3VsdC5lbnRpdGllcyB8fCByZXN1bHQuZW50aXRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGVudGl0eU5hbWVzID0gcmVzdWx0LmVudGl0aWVzO1xuICAgIH1cblxuICAgIGxldCBjb3VudCA9IG9wdGlvbnMuY291bnQgPyBOdW1iZXIucGFyc2VJbnQob3B0aW9ucy5jb3VudCwgMTApIDogNTtcbiAgICBpZiAoIW9wdGlvbnMuY291bnQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBuYW1lOiBcImNvdW50XCIsXG4gICAgICAgIG1lc3NhZ2U6IFwi6rCBIEVudGl0eeuzhCDsg53shLEg6rCc7IiYOlwiLFxuICAgICAgICBpbml0aWFsOiA1LFxuICAgICAgICBtaW46IDEsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuY291bnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwi7Leo7IaM65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY291bnQgPSByZXN1bHQuY291bnQ7XG4gICAgfVxuXG4gICAgLy8gVXNlciDsl5Tti7Dti7DqsIAg7Y+s7ZWo65CcIOqyveyasDog66Gc6re47J24IOqwgOuKpS/tmZXsnbjsmqkg67aE6riwIOyEoO2DnVxuICAgIGNvbnN0IGhhc1VzZXIgPSBlbnRpdHlOYW1lcy5pbmNsdWRlcyhcIlVzZXJcIik7XG5cbiAgICBpZiAoaGFzVXNlcikge1xuICAgICAgY29uc3QgdXNlck1vZGVSZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJzZWxlY3RcIixcbiAgICAgICAgbmFtZTogXCJ1c2VyTW9kZVwiLFxuICAgICAgICBtZXNzYWdlOiBcIlVzZXIg7JeU7Yuw7Yuw6rCAIO2PrO2VqOuQmOyWtCDsnojsirXri4jri6QuIOyDneyEsSDrsKnsi53snYQg7ISg7YOd7ZWY7IS47JqUOlwiLFxuICAgICAgICBjaG9pY2VzOiBbXG4gICAgICAgICAgeyB0aXRsZTogXCIxLiDroZzqt7jsnbgg6rCA64ql7ZWcIOyCrOyaqeyekCBmaXh0dXJlIOyDneyEsVwiLCB2YWx1ZTogXCJsb2dpblwiIH0sXG4gICAgICAgICAgeyB0aXRsZTogXCIyLiDtmZXsnbjsmqkg642w7J207YSwKOuhnOq3uOyduCDrtojqsIApIOyDneyEsVwiLCB2YWx1ZTogXCJkdW1teVwiIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgaWYgKCF1c2VyTW9kZVJlc3VsdC51c2VyTW9kZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodXNlck1vZGVSZXN1bHQudXNlck1vZGUgPT09IFwibG9naW5cIikge1xuICAgICAgICAvLyBMTE0g7IKs7JqpIOyXrOu2gFxuICAgICAgICBsZXQgdXNlTExNID0gb3B0aW9uc1tcInVzZS1sbG1cIl0gPz8gZmFsc2U7XG4gICAgICAgIGlmICghb3B0aW9uc1tcInVzZS1sbG1cIl0pIHtcbiAgICAgICAgICBjb25zdCBsbG1SZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgICAgIHR5cGU6IFwiY29uZmlybVwiLFxuICAgICAgICAgICAgbmFtZTogXCJ1c2VMTE1cIixcbiAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgIFwiTExN7Jy866GcIOuNlCDtmITsi6TsoIHsnbgg642w7J207YSw66W8IOyDneyEse2VoOq5jOyalD8gKGZpeHR1cmVIaW50IOq4sOuwmCwgQU5USFJPUElDX0FQSV9LRVkg7ZWE7JqUKVwiLFxuICAgICAgICAgICAgaW5pdGlhbDogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdXNlTExNID0gbGxtUmVzdWx0LnVzZUxMTSA/PyBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVuYWJsZUxMTUNhY2hlID0gIW9wdGlvbnNbXCJuby1jYWNoZVwiXTtcbiAgICAgICAgY29uc3QgREVGQVVMVF9QQVNTV09SRCA9IFwiVGVzdDEyMzQhXCI7XG5cbiAgICAgICAgLy8g66Gc6re47J24IOqwgOuKpSDqsr3roZzsl5DshJzripQg7ZiE7J6sIO2ZmOqyveydmCDsnb3quLAgRELrpbwgc291cmNlRGLroZwg7IKs7JqpXG4gICAgICAgIGNvbnN0IHNvdXJjZURiID0gREIuZ2V0REIoXCJyXCIpO1xuICAgICAgICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgRml4dHVyZUdlbmVyYXRvcihcbiAgICAgICAgICBzb3VyY2VEYixcbiAgICAgICAgICBzb3VyY2VEYixcbiAgICAgICAgICBnZXRTb25hbXVFbnZpcm9ubWVudCgpLFxuICAgICAgICAgIEVudGl0eU1hbmFnZXIsXG4gICAgICAgICAgeyB1c2VMTE0sIGVuYWJsZUxMTUNhY2hlIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgY3JlYXRlZENyZWRlbnRpYWxzOiBBcnJheTx7IGVtYWlsOiBzdHJpbmc7IHBhc3N3b3JkOiBzdHJpbmcgfT4gPSBbXTtcbiAgICAgICAgY29uc3QgYmFzZVBhdGggPSBTb25hbXUuY29uZmlnLnNlcnZlci5hdXRoPy5iYXNlUGF0aCA/PyBcIi9hcGkvYXV0aFwiO1xuXG4gICAgICAgIGlmICh1c2VMTE0pIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgICAgIGBcXG5MTE0g66qo65Oc66GcIOuhnOq3uOyduCDqsIDriqXtlZwg7IKs7Jqp7J6QICR7Y291bnR966qFIOyDneyEsSDspJEuLi4gKOy6kOyLsTogJHtlbmFibGVMTE1DYWNoZSA/IFwiT05cIiA6IFwiT0ZGXCJ9KWAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxu66Gc6re47J24IOqwgOuKpe2VnCDsgqzsmqnsnpAgJHtjb3VudH3rqoUg7IOd7ISxIOykkS4uLmApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHVzZXJEYXRhID0gYXdhaXQgZ2VuZXJhdG9yLmdlbmVyYXRlKFwiVXNlclwiKTtcblxuICAgICAgICAgIGNvbnN0IG5hbWUgPSBTdHJpbmcodXNlckRhdGEubmFtZSA/PyBcIlwiKTtcbiAgICAgICAgICBjb25zdCBlbWFpbCA9IFN0cmluZyh1c2VyRGF0YS5lbWFpbCA/PyBcIlwiKTtcbiAgICAgICAgICBjb25zdCB1c2VybmFtZSA9IHNhbml0aXplVXNlcm5hbWUoU3RyaW5nKHVzZXJEYXRhLnVzZXJuYW1lID8/IFwiXCIpKTtcbiAgICAgICAgICBjb25zdCBkaXNwbGF5VXNlcm5hbWUgPVxuICAgICAgICAgICAgdXNlckRhdGEuZGlzcGxheV91c2VybmFtZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHVzZXJEYXRhLmRpc3BsYXlfdXNlcm5hbWUpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgY29uc3QgYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZW1haWwsXG4gICAgICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBERUZBVUxUX1BBU1NXT1JELFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGRpc3BsYXlVc2VybmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBib2R5LmRpc3BsYXlfdXNlcm5hbWUgPSBkaXNwbGF5VXNlcm5hbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcmVxID0gbmV3IFJlcXVlc3QoYGh0dHA6Ly9sb2NhbGhvc3Qke2Jhc2VQYXRofS9zaWduLXVwL2VtYWlsYCwge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBTb25hbXUuYXV0aC5oYW5kbGVyKHJlcSk7XG5cbiAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICAgIGNvbnN0IGNvZGUgPSB0eXBlb2YgcmVzcG9uc2VEYXRhLmNvZGUgPT09IFwic3RyaW5nXCIgPyByZXNwb25zZURhdGEuY29kZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSBcIlVTRVJfQUxSRUFEWV9FWElTVFNcIikge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCAg4pqg77iPICAke2VtYWlsfSDsnbTrr7gg7KG07J6sIC0g6rG064SI65yB64uI64ukLmApKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCAg4p2MICR7ZW1haWx9IOyDneyEsSDsi6TtjKg6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2VEYXRhKX1gKSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjcmVhdGVkQ3JlZGVudGlhbHMucHVzaCh7IGVtYWlsLCBwYXNzd29yZDogREVGQVVMVF9QQVNTV09SRCB9KTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgICDinIUgJHtlbWFpbH0g7IOd7ISxIOyZhOujjGApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVtYWlsX3ZlcmlmaWVkID0gdHJ1ZSDsp4HsoJEg7JeF642w7J207Yq4IChkZXYg7Y647J2YKVxuICAgICAgICBpZiAoY3JlYXRlZENyZWRlbnRpYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBlbWFpbHMgPSBjcmVhdGVkQ3JlZGVudGlhbHMubWFwKChjKSA9PiBjLmVtYWlsKTtcbiAgICAgICAgICBhd2FpdCBEQi5nZXREQihcIndcIikoXCJ1c2Vyc1wiKS53aGVyZUluKFwiZW1haWxcIiwgZW1haWxzKS51cGRhdGUoeyBlbWFpbF92ZXJpZmllZDogdHJ1ZSB9KTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgXFxuZW1haWxfdmVyaWZpZWQgPSB0cnVlIOyXheuNsOydtO2KuCDsmYTro4xgKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXNlTExNKSB7XG4gICAgICAgICAgY29uc3Qgc3RhdHMgPSBnZW5lcmF0b3IuZ2V0TExNQ2FjaGVTdGF0cygpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYFtMTE0gQ2FjaGVdIOy6kOyLnCDtgazquLA6ICR7c3RhdHMuc2l6ZX1gKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5ncmVlbihgXFxu4pyFICR7Y3JlYXRlZENyZWRlbnRpYWxzLmxlbmd0aH3rqoXsnZgg66Gc6re47J24IOqwgOuKpe2VnCDsgqzsmqnsnpAg7IOd7ISxIOyZhOujjGApLFxuICAgICAgICApO1xuICAgICAgICBpZiAoY3JlYXRlZENyZWRlbnRpYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlxcbuyDneyEseuQnCDqs4TsoJUg66qp66GdOlwiKTtcbiAgICAgICAgICBjb25zb2xlLnRhYmxlKGNyZWF0ZWRDcmVkZW50aWFscyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyB1c2VyTW9kZSA9PT0gXCJkdW1teVwiOiDquLDsobQgZ2VuZXJhdGVCYXRjaCgpIO2dkOumhCDqs4Tsho1cbiAgICB9XG5cbiAgICBsZXQgc2F2ZVRhcmdldCA9IG9wdGlvbnNbXCJzYXZlLXRvXCJdIHx8IFwiZGJcIjtcbiAgICBpZiAoIW9wdGlvbnNbXCJzYXZlLXRvXCJdKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJzZWxlY3RcIixcbiAgICAgICAgbmFtZTogXCJzYXZlVGFyZ2V0XCIsXG4gICAgICAgIG1lc3NhZ2U6IFwi7KCA7J6lIOuwqeyLnTpcIixcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgIHsgdGl0bGU6IFwiRml4dHVyZSBEQuyXkCDsoIDsnqVcIiwgdmFsdWU6IFwiZGJcIiB9LFxuICAgICAgICAgIHsgdGl0bGU6IFwi7YyM7J2866GcIOyggOyepSAo7J6Q64+ZIO2MjOydvOuqhSlcIiwgdmFsdWU6IFwiZmlsZVwiIH0sXG4gICAgICAgICAgeyB0aXRsZTogXCLtjIzsnbzroZwg7KCA7J6lICjtjIzsnbzrqoUg7KeA7KCVKVwiLCB2YWx1ZTogXCJmaWxlOmN1c3RvbVwiIH0sXG4gICAgICAgICAgeyB0aXRsZTogXCLsoIDsnqUg7JWIIO2VqCAo7Lac66Cl66eMKVwiLCB2YWx1ZTogXCJub25lXCIgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBzYXZlVGFyZ2V0ID0gcmVzdWx0LnNhdmVUYXJnZXQ7XG5cbiAgICAgIGlmIChzYXZlVGFyZ2V0ID09PSBcImZpbGU6Y3VzdG9tXCIpIHtcbiAgICAgICAgY29uc3QgZmlsZW5hbWVSZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICBuYW1lOiBcImZpbGVuYW1lXCIsXG4gICAgICAgICAgbWVzc2FnZTogXCLtjIzsnbzrqoU6XCIsXG4gICAgICAgICAgaW5pdGlhbDogXCJmaXh0dXJlcy5qc29uXCIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghZmlsZW5hbWVSZXN1bHQuZmlsZW5hbWUpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzYXZlVGFyZ2V0ID0gYGZpbGU6JHtmaWxlbmFtZVJlc3VsdC5maWxlbmFtZX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExMTSDsgqzsmqkg7Jes67aAIOqysOyglVxuICAgIGxldCB1c2VMTE0gPSBvcHRpb25zW1widXNlLWxsbVwiXSA/PyBmYWxzZTtcbiAgICBpZiAoIW9wdGlvbnNbXCJ1c2UtbGxtXCJdKSB7XG4gICAgICBjb25zdCBsbG1SZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJjb25maXJtXCIsXG4gICAgICAgIG5hbWU6IFwidXNlTExNXCIsXG4gICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgXCJMTE3snLzroZwg642UIO2YhOyLpOyggeyduCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWg6rmM7JqUPyAoZml4dHVyZUhpbnQg6riw67CYLCBBTlRIUk9QSUNfQVBJX0tFWSDtlYTsmpQpXCIsXG4gICAgICAgIGluaXRpYWw6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICB1c2VMTE0gPSBsbG1SZXN1bHQudXNlTExNID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGVuYWJsZUxMTUNhY2hlID0gIW9wdGlvbnNbXCJuby1jYWNoZVwiXTtcblxuICAgIC8vIGZpeHR1cmUgZ2VuOiBmaXh0dXJlIERCIOuCtOyXkOyEnCDssLjsobAg6rSA6rOE66W8IO2VtOqysO2VmOqzoCDsoIDsnqXtlanri4jri6RcbiAgICBjb25zdCBmaXh0dXJlRGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuICAgIGNvbnN0IGdlbmVyYXRvciA9IG5ldyBGaXh0dXJlR2VuZXJhdG9yKGZpeHR1cmVEYiwgZml4dHVyZURiLCBcImZpeHR1cmVcIiwgRW50aXR5TWFuYWdlciwge1xuICAgICAgdXNlTExNLFxuICAgICAgZW5hYmxlTExNQ2FjaGUsXG4gICAgfSk7XG5cbiAgICBpZiAodXNlTExNKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICBgXFxuTExNIOuqqOuTnOuhnCAke2VudGl0eU5hbWVzLmpvaW4oXCIsIFwiKX0g7IOd7ISxIOykkS4uLiAo7LqQ7IuxOiAke2VuYWJsZUxMTUNhY2hlID8gXCJPTlwiIDogXCJPRkZcIn0pYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYFxcbiR7ZW50aXR5TmFtZXMuam9pbihcIiwgXCIpfSDsg53shLEg7KSRLi4uYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHNwZWNzID0gZW50aXR5TmFtZXMubWFwKChlbnRpdHlOYW1lKSA9PiAoe1xuICAgICAgZW50aXR5OiBlbnRpdHlOYW1lLFxuICAgICAgY291bnQsXG4gICAgICBvdmVycmlkZXM6IHt9LFxuICAgIH0pKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBnZW5lcmF0b3IuZ2VuZXJhdGVCYXRjaChzcGVjcyk7XG5cbiAgICBpZiAodXNlTExNKSB7XG4gICAgICBjb25zdCBzdGF0cyA9IGdlbmVyYXRvci5nZXRMTE1DYWNoZVN0YXRzKCk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBbTExNIENhY2hlXSDsupDsi5wg7YGs6riwOiAke3N0YXRzLnNpemV9YCkpO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGBcXG7inIUgJHtyZXN1bHRzLmxlbmd0aH3qsJwgZml4dHVyZSDsg53shLEg7JmE66OMYCkpO1xuXG4gICAgaWYgKHNhdmVUYXJnZXQgPT09IFwibm9uZVwiKSB7XG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHRzLCBudWxsLCAyKSk7XG4gICAgfSBlbHNlIGlmIChzYXZlVGFyZ2V0ID09PSBcImRiXCIpIHtcbiAgICAgIC8vIGdlbmVyYXRlQmF0Y2jqsIAg7J2066+4IERC7JeQIOyggOyepe2WiOycvOuvgOuhnCDrs4Trj4Qg7KCA7J6l7J20IOu2iO2VhOyalO2VqeuLiOuLpC5cbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiRml4dHVyZSBEQuyXkCDsoIDsnqXrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICB9IGVsc2UgaWYgKHNhdmVUYXJnZXQuc3RhcnRzV2l0aChcImZpbGVcIikpIHtcbiAgICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcbiAgICAgIGNvbnN0IHBhdGggPSBhd2FpdCBpbXBvcnQoXCJub2RlOnBhdGhcIik7XG5cbiAgICAgIGNvbnN0IGZpeHR1cmVzRGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwidGVzdFwiLCBcImZpeHR1cmVzXCIpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpeHR1cmVzRGlyKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBhd2FpdCBmcy5ta2RpcihmaXh0dXJlc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZW50aXR5TmFtZSBvZiBlbnRpdHlOYW1lcykge1xuICAgICAgICBjb25zdCBlbnRpdHlSZXN1bHRzID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuZW50aXR5SWQgPT09IGVudGl0eU5hbWUpO1xuXG4gICAgICAgIGlmIChlbnRpdHlSZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgICAgIGlmIChzYXZlVGFyZ2V0ID09PSBcImZpbGVcIikge1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eU5hbWUpO1xuICAgICAgICAgIGZpbGVuYW1lID0gYCR7ZW50aXR5LnRhYmxlfS5qc29uYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWxlbmFtZSA9IHNhdmVUYXJnZXQucmVwbGFjZShcImZpbGU6XCIsIFwiXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4oZml4dHVyZXNEaXIsIGZpbGVuYW1lKTtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgICAgICAgIGZpbGVwYXRoLFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgZW50aXR5UmVzdWx0cy5tYXAoKHIpID0+IHIuZGF0YSksXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgMixcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyFICR7ZmlsZXBhdGh9IOyggOyepSDsmYTro4xgKSk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwiRml4dHVyZSDsg53shLEg7KSRIOyYpOulmOqwgCDrsJzsg53tlojsirXri4jri6QuXFxuXCIgK1xuICAgICAgICAgIFwi7JuQ7J24OiBFbnRpdHkg7KCV7J2Y64KYIERCIOyXsOqysOydhCDtmZXsnbjtlbTso7zshLjsmpQuXFxuXCIgK1xuICAgICAgICAgIFwi7J6Q7IS47ZWcIOuCtOyaqTpcIixcbiAgICAgICksXG4gICAgICBlcnJvcixcbiAgICApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogZml4dHVyZSBmZXRjaCDrqoXroLnslrQgLSDsi6TsoJwg7Jq07JiBIERC7JeQ7IScIOuNsOydtO2EsOulvCDqsIDsoLjsmYAgZml4dHVyZeuhnCDsoIDsnqXtlanri4jri6QuXG4gKiDqtIDqs4TrkJwg642w7J207YSw64+EIO2VqOq7mCDqsIDsoLjsmKTrr4DroZwg7ZiE7Iuk7KCB7J24IO2FjOyKpO2KuCDrjbDsnbTthLDrpbwg7ZmV67O07ZWgIOyImCDsnojsirXri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXh0dXJlRmV0Y2hDb21tYW5kKG9wdGlvbnM6IEZpeHR1cmVDb21tYW5kT3B0aW9ucykge1xuICB0cnkge1xuICAgIGlmICghRW50aXR5TWFuYWdlci5pc0F1dG9sb2FkZWQpIHtcbiAgICAgIGF3YWl0IEVudGl0eU1hbmFnZXIuYXV0b2xvYWQoKTtcbiAgICB9XG5cbiAgICBsZXQgZW50aXR5TmFtZXM6IHN0cmluZ1tdO1xuXG4gICAgaWYgKG9wdGlvbnMuYWxsKSB7XG4gICAgICBlbnRpdHlOYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgICBpZiAob3B0aW9ucy5leGNsdWRlKSB7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVMaXN0ID0gb3B0aW9ucy5leGNsdWRlLnNwbGl0KFwiLFwiKS5tYXAoKHM6IHN0cmluZykgPT4gcy50cmltKCkpO1xuICAgICAgICBlbnRpdHlOYW1lcyA9IGVudGl0eU5hbWVzLmZpbHRlcigobmFtZSkgPT4gIWV4Y2x1ZGVMaXN0LmluY2x1ZGVzKG5hbWUpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaW5jbHVkZSkge1xuICAgICAgZW50aXR5TmFtZXMgPSBvcHRpb25zLmluY2x1ZGUuc3BsaXQoXCIsXCIpLm1hcCgoczogc3RyaW5nKSA9PiBzLnRyaW0oKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICB0eXBlOiBcIm11bHRpc2VsZWN0XCIsXG4gICAgICAgIG5hbWU6IFwiZW50aXRpZXNcIixcbiAgICAgICAgbWVzc2FnZTogXCJJbXBvcnTtlaAgRW50aXR566W8IOyEoO2Dne2VmOyEuOyalDpcIixcbiAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKS5tYXAoKGlkKSA9PiAoeyB0aXRsZTogaWQsIHZhbHVlOiBpZCB9KSksXG4gICAgICAgIG1pbjogMSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3VsdC5lbnRpdGllcyB8fCByZXN1bHQuZW50aXRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGVudGl0eU5hbWVzID0gcmVzdWx0LmVudGl0aWVzO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cmF0ZWd5OiBEYXRhRXhwbG9yZXJTdHJhdGVneSA9IG9wdGlvbnMuc3RyYXRlZ3kgPz8gXCJyZWNlbnRcIjtcbiAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnMubGltaXQgPyBOdW1iZXIucGFyc2VJbnQob3B0aW9ucy5saW1pdCwgMTApIDogMTA7XG5cbiAgICAvLyBmaXh0dXJlIGZldGNoOiDtmITsnqwg7ZmY6rK9IOuNsOydtO2EsOulvCBmaXh0dXJlIERC66GcIGltcG9ydO2VqeuLiOuLpFxuICAgIGNvbnN0IHNvdXJjZURiID0gREIuZ2V0REIoXCJyXCIpO1xuICAgIGNvbnN0IGZpeHR1cmVEYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcuZml4dHVyZSk7XG4gICAgY29uc3QgZ2VuZXJhdG9yID0gbmV3IEZpeHR1cmVHZW5lcmF0b3Ioc291cmNlRGIsIGZpeHR1cmVEYiwgXCJmaXh0dXJlXCIsIEVudGl0eU1hbmFnZXIpO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxuJHtlbnRpdHlOYW1lcy5qb2luKFwiLCBcIil9IGltcG9ydCDspJEuLi5gKSk7XG5cbiAgICBmb3IgKGNvbnN0IGVudGl0eU5hbWUgb2YgZW50aXR5TmFtZXMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBnZW5lcmF0b3IuaW1wb3J0RnJvbVNvdXJjZShlbnRpdHlOYW1lLCB7XG4gICAgICAgIHN0cmF0ZWd5LFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgaW5jbHVkZVJlbGF0aW9uczogdHJ1ZSxcbiAgICAgICAgbWF4RGVwdGg6IDIsXG4gICAgICB9KTtcblxuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKchSAke2VudGl0eU5hbWV9OiAke3Jlc3VsdHMubGVuZ3RofeqwnCBpbXBvcnQg7JmE66OMYCkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBcIuyLpOygnCBEQuyXkOyEnCDrjbDsnbTthLDrpbwg6rCA7KC47Jik64qUIOykkSDsmKTrpZjqsIAg67Cc7IOd7ZaI7Iq164uI64ukLlxcblwiICtcbiAgICAgICAgICBcIuybkOyduDog7IaM7IqkIERCIOyXsOqysCDshKTsoJUoc29uYW11LmNvbmZpZy50cynsnbTrgpggRW50aXR5IOq0gOqzhCDsoJXsnZjrpbwg7ZmV7J247ZW07KO87IS47JqULlxcblwiICtcbiAgICAgICAgICBcIuyekOyEuO2VnCDrgrTsmqk6XCIsXG4gICAgICApLFxuICAgICAgZXJyb3IsXG4gICAgKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIGZpeHR1cmUgZXhwbG9yZSDrqoXroLnslrQgLSBEQuydmCDsi6TsoJwg642w7J207YSw66W8IOyhsO2ajO2VmOyXrCDtmZXsnbjtlanri4jri6QuXG4gKiDsoIDsnqXtlZjsp4Ag7JWK6rOgIOyhsO2ajOunjCDtlZjrr4DroZwg642w7J207YSw66W8IOu5oOultOqyjCDtmZXsnbjtlaAg65WMIOycoOyaqe2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVFeHBsb3JlQ29tbWFuZChvcHRpb25zOiBGaXh0dXJlQ29tbWFuZE9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIUVudGl0eU1hbmFnZXIuaXNBdXRvbG9hZGVkKSB7XG4gICAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgfVxuXG4gICAgbGV0IGVudGl0eU5hbWUgPSBvcHRpb25zLmluY2x1ZGU7XG5cbiAgICBpZiAoIWVudGl0eU5hbWUpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICB0eXBlOiBcInNlbGVjdFwiLFxuICAgICAgICBuYW1lOiBcImVudGl0eVwiLFxuICAgICAgICBtZXNzYWdlOiBcIu2DkOyDie2VoCBFbnRpdHk6XCIsXG4gICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCkubWFwKChpZCkgPT4gKHsgdGl0bGU6IGlkLCB2YWx1ZTogaWQgfSkpLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzdWx0LmVudGl0eSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlbnRpdHlOYW1lID0gcmVzdWx0LmVudGl0eTtcbiAgICB9XG5cbiAgICBpZiAoIWVudGl0eU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkVudGl0eSBuYW1lIGlzIHJlcXVpcmVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cmF0ZWd5OiBEYXRhRXhwbG9yZXJTdHJhdGVneSA9IG9wdGlvbnMuc3RyYXRlZ3kgPz8gXCJzYW1wbGVcIjtcbiAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnMubGltaXQgPyBOdW1iZXIucGFyc2VJbnQob3B0aW9ucy5saW1pdCwgMTApIDogMTA7XG5cbiAgICBjb25zdCBkYiA9IERCLmdldERCKFwiclwiKTtcbiAgICBjb25zdCBleHBsb3JlciA9IG5ldyBEYXRhRXhwbG9yZXIoZGIsIEVudGl0eU1hbmFnZXIpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBleHBsb3Jlci5leHBsb3JlKGVudGl0eU5hbWUsIHsgc3RyYXRlZ3ksIGxpbWl0IH0pO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxuJHtlbnRpdHlOYW1lfSAke2RhdGEubGVuZ3RofeqwnCDsobDtmowg7JmE66OMOmApKTtcbiAgICBjb25zb2xlLnRhYmxlKGRhdGEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwi642w7J207YSwIOyhsO2ajCDspJEg7Jik66WY6rCAIOuwnOyDne2WiOyKteuLiOuLpC5cXG5cIiArXG4gICAgICAgICAgXCLsm5Dsnbg6IERCIOyXsOqysOydtOuCmCBFbnRpdHkg7KCV7J2Y66W8IO2ZleyduO2VtOyjvOyEuOyalC5cXG5cIiArXG4gICAgICAgICAgXCLsnpDshLjtlZwg64K07JqpOlwiLFxuICAgICAgKSxcbiAgICAgIGVycm9yLFxuICAgICk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztZQUdzQztRQUNIO1VBQ2tCO29CQUNHO1NBQ1g7bUJBQ1U7dUJBRVE7Ozs7QUFrQi9ELFNBQVMsaUJBQWlCLEtBQXFCO0NBRTdDLElBQUksV0FBVyxJQUFJLFlBQVksQ0FBQyxDQUFDLFFBQVEsY0FBYyxFQUFFO0NBQ3pELElBQUksU0FBUyxXQUFXLEdBQ3RCLFdBQVc7Q0FHYixJQUFJLFNBQVMsS0FBSyxRQUFRLEdBQ3hCLFdBQVcsSUFBSTtDQUdqQixPQUFPLFNBQVMsTUFBTSxHQUFHLEVBQUU7QUFDN0I7Ozs7QUFLQSxlQUFzQixrQkFBa0IsU0FBZ0M7Q0FDdEUsSUFBSTtFQUNGLElBQUksQ0FBQyxjQUFjLGNBQ2pCLE1BQU0sY0FBYyxTQUFTO0VBRy9CLElBQUk7RUFFSixJQUFJLFFBQVEsS0FBSztHQUNmLGNBQWMsY0FBYyxVQUFVO0dBQ3RDLElBQUksUUFBUSxTQUFTO0lBQ25CLE1BQU0sY0FBYyxRQUFRLFFBQVEsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLE1BQWMsRUFBRSxLQUFLLENBQUM7SUFDMUUsY0FBYyxZQUFZLFFBQVEsU0FBUyxD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
|
|
@@ -16,7 +16,7 @@ if (process.env.HOT === "yes" && process.env.API_ROOT_PATH) {
|
|
|
16
16
|
});
|
|
17
17
|
console.log("🔥 HMR-hook initialized");
|
|
18
18
|
}
|
|
19
|
-
|
|
20
19
|
//#endregion
|
|
21
|
-
export {
|
|
22
|
-
|
|
20
|
+
export {};
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG1yLWhvb2stcmVnaXN0ZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jpbi9obXItaG9vay1yZWdpc3Rlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGhtci1ob29rIOy0iOq4sO2ZlO2VmOuKlCDrqqjrk4jsnoXri4jri6QuXG4gKlxuICog7J20IO2MjOydvOydgCAtLWltcG9ydCDtlIzrnpjqt7jroZwg7ZSE66Gc7IS47IqkIOyLnOyekSDsi5wg66Gc65Oc65CY7Ja07JW8IO2VqeuLiOuLpC5cbiAqXG4gKiDtmZjqsr3rs4DsiJg6XG4gKiAtIEFQSV9ST09UX1BBVEg6IOyCrOyaqeyekCDtlITroZzsoJ3tirjsnZggQVBJIOujqO2KuCDqsr3roZxcbiAqIC0gSE9UOiAneWVzJ+ydvCDrlYzrp4wgaG1yLWhvb2sg7Zmc7ISx7ZmUXG4gKi9cblxuaWYgKHByb2Nlc3MuZW52LkhPVCA9PT0gXCJ5ZXNcIiAmJiBwcm9jZXNzLmVudi5BUElfUk9PVF9QQVRIKSB7XG4gIGNvbnN0IHsgaG90IH0gPSBhd2FpdCBpbXBvcnQoXCJAc29uYW11LWtpdC9obXItaG9va1wiKTtcblxuICBhd2FpdCBob3QuaW5pdCh7XG4gICAgcm9vdERpcmVjdG9yeTogcHJvY2Vzcy5lbnYuQVBJX1JPT1RfUEFUSCwgLy8g7J20IOy5nOq1rOqwgCDtlITroZzsoJ3tirggQVBJIOqyveuhnOuhnCDsnpgg7ISk7KCV65CY7Ja07JW8IOyVhOuemCDrsJTsmrTrjZTrpqzqsIAg7J6R64+Z7ZWp64uI64ukLlxuICAgIGJvdW5kYXJpZXM6IFtgLi9zcmMvKiovKi50c2BdLCAvLyDtlITroZzsoJ3tirjsnZgg7J20IOy5nOq1rOuTpOydtCDrsJTsmrTrjZTrpqzqsIAg65Cp64uI64ukLlxuICB9KTtcblxuICBjb25zb2xlLmxvZyhcIvCflKUgSE1SLWhvb2sgaW5pdGlhbGl6ZWRcIik7XG59XG5cbi8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZVxuZXhwb3J0IHt9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBVUEsSUFBSSxRQUFRLElBQUksUUFBUSxTQUFTLFFBQVEsSUFBSSxlQUFlO0NBQzFELE1BQU0sRUFBRSxRQUFRLE1BQU0sT0FBTztDQUU3QixNQUFNLElBQUksS0FBSztFQUNiLGVBQWUsUUFBUSxJQUFJO0VBQzNCLFlBQVksQ0FBQyxlQUFlO0NBQzlCLENBQUM7Q0FFRCxRQUFRLElBQUkseUJBQXlCO0FBQ3ZDIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-targets.d.ts","sourceRoot":"","sources":["../../src/bin/migrate-targets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,wBAAgB,oBAAoB,IAAI,CAAC,MAAM,cAAc,CAAC,EAAE,CAG/D"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { getSonamuEnvironment, init_env } from "../env.js";
|
|
2
|
+
//#region src/bin/migrate-targets.ts
|
|
3
|
+
init_env();
|
|
4
|
+
function getMigrateRunTargets() {
|
|
5
|
+
const environment = getSonamuEnvironment();
|
|
6
|
+
return environment === "test" ? ["test", "fixture"] : [environment];
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { getMigrateRunTargets };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0ZS10YXJnZXRzLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vbWlncmF0ZS10YXJnZXRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IGdldFNvbmFtdUVudmlyb25tZW50IH0gZnJvbSBcIi4uL2VudlwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWlncmF0ZVJ1blRhcmdldHMoKTogKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdIHtcbiAgY29uc3QgZW52aXJvbm1lbnQgPSBnZXRTb25hbXVFbnZpcm9ubWVudCgpO1xuICByZXR1cm4gZW52aXJvbm1lbnQgPT09IFwidGVzdFwiID8gW1widGVzdFwiLCBcImZpeHR1cmVcIl0gOiBbZW52aXJvbm1lbnRdO1xufVxuIl0sIm1hcHBpbmdzIjoiOztTQUM2QztBQUU3QyxTQUFnQix1QkFBaUQ7Q0FDL0QsTUFBTSxjQUFjLHFCQUFxQjtDQUN6QyxPQUFPLGdCQUFnQixTQUFTLENBQUMsUUFBUSxTQUFTLElBQUksQ0FBQyxXQUFXO0FBQ3BFIn0=
|