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
package/dist/logger/configure.js
CHANGED
|
@@ -1,24 +1,19 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { init_category, isSameCategory } from "./category.js";
|
|
3
3
|
import { configure, getConsoleSink } from "@logtape/logtape";
|
|
4
4
|
import { getPrettyFormatter } from "@logtape/pretty";
|
|
5
|
-
|
|
6
5
|
//#region src/logger/configure.ts
|
|
7
6
|
function defaultFastifySink(fastifyCategory) {
|
|
8
|
-
|
|
9
|
-
const filterFastify = (request, record
|
|
10
|
-
if (!request.url.startsWith("/api"))
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
...record$1,
|
|
16
|
-
message: [...record$1.message.slice(0, -1), `[${request.method}${responseCode ? `:${responseCode}` : ""}] ${request.originalUrl} - ${lastItem}`]
|
|
7
|
+
return getConsoleSink({ formatter: ((formatter, record) => {
|
|
8
|
+
const filterFastify = (request, record, responseCode) => {
|
|
9
|
+
if (!request.url.startsWith("/api")) return formatter(record);
|
|
10
|
+
const lastItem = record.message[record.message.length - 1];
|
|
11
|
+
return formatter({
|
|
12
|
+
...record,
|
|
13
|
+
message: [...record.message.slice(0, -1), `[${request.method}${responseCode ? `:${responseCode}` : ""}] ${request.originalUrl} - ${lastItem}`]
|
|
17
14
|
});
|
|
18
15
|
};
|
|
19
|
-
if (!isSameCategory(fastifyCategory, [...record.category]))
|
|
20
|
-
return formatter$1(record);
|
|
21
|
-
}
|
|
16
|
+
if (!isSameCategory(fastifyCategory, [...record.category])) return formatter(record);
|
|
22
17
|
if ("req" in record.properties && record.properties.req !== null) {
|
|
23
18
|
const request = record.properties.req;
|
|
24
19
|
return filterFastify(request, record);
|
|
@@ -27,19 +22,16 @@ function defaultFastifySink(fastifyCategory) {
|
|
|
27
22
|
const reply = record.properties.res;
|
|
28
23
|
return filterFastify(reply.request, record, reply.statusCode);
|
|
29
24
|
}
|
|
30
|
-
return formatter
|
|
25
|
+
return formatter(record);
|
|
31
26
|
}).bind(null, getPrettyFormatter({
|
|
32
27
|
timestamp: "time",
|
|
33
28
|
categoryWidth: 20,
|
|
34
29
|
categoryTruncate: "middle"
|
|
35
|
-
}));
|
|
36
|
-
return getConsoleSink({ formatter });
|
|
30
|
+
})) });
|
|
37
31
|
}
|
|
38
32
|
function defaultFastifyFilter(fastifyCategory) {
|
|
39
33
|
return (record) => {
|
|
40
|
-
if (!isSameCategory([...fastifyCategory], [...record.category]))
|
|
41
|
-
return false;
|
|
42
|
-
}
|
|
34
|
+
if (!isSameCategory([...fastifyCategory], [...record.category])) return false;
|
|
43
35
|
if ("req" in record.properties && record.properties.req !== null) {
|
|
44
36
|
const request = record.properties.req;
|
|
45
37
|
return request.url.startsWith("/api") && request.url !== "/api/healthcheck";
|
|
@@ -66,14 +58,12 @@ async function configureLogTape(options) {
|
|
|
66
58
|
category: ["logtape", "meta"],
|
|
67
59
|
lowestLevel: "fatal"
|
|
68
60
|
});
|
|
69
|
-
if ([...loggers].every((logger) => !isSameCategory([...fastifyCategory], logger.category))) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
});
|
|
76
|
-
}
|
|
61
|
+
if ([...loggers].every((logger) => !isSameCategory([...fastifyCategory], logger.category))) loggers.add({
|
|
62
|
+
category: [...fastifyCategory],
|
|
63
|
+
sinks: ["fastify-console"],
|
|
64
|
+
lowestLevel: "info",
|
|
65
|
+
filters: ["fastify-console"]
|
|
66
|
+
});
|
|
77
67
|
return configure({
|
|
78
68
|
sinks,
|
|
79
69
|
filters,
|
|
@@ -81,11 +71,10 @@ async function configureLogTape(options) {
|
|
|
81
71
|
reset: true
|
|
82
72
|
});
|
|
83
73
|
}
|
|
84
|
-
var init_configure = __esmMin((() => {
|
|
85
|
-
init_category();
|
|
86
|
-
}));
|
|
87
|
-
|
|
88
74
|
//#endregion
|
|
89
|
-
|
|
75
|
+
__esmMin((() => {
|
|
76
|
+
init_category();
|
|
77
|
+
}))();
|
|
90
78
|
export { configureLogTape };
|
|
91
|
-
|
|
79
|
+
|
|
80
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJlLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sb2dnZXIvY29uZmlndXJlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbmZpZ3VyZSwgZ2V0Q29uc29sZVNpbmsgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBGaWx0ZXIsXG4gIHR5cGUgRmlsdGVyTGlrZSxcbiAgdHlwZSBMb2dnZXJDb25maWcsXG4gIHR5cGUgTG9nUmVjb3JkLFxuICB0eXBlIFNpbmssXG4gIHR5cGUgVGV4dEZvcm1hdHRlcixcbn0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldFByZXR0eUZvcm1hdHRlciB9IGZyb20gXCJAbG9ndGFwZS9wcmV0dHlcIjtcbmltcG9ydCB7IHR5cGUgRmFzdGlmeVJlcGx5LCB0eXBlIEZhc3RpZnlSZXF1ZXN0IH0gZnJvbSBcImZhc3RpZnlcIjtcblxuaW1wb3J0IHsgaXNTYW1lQ2F0ZWdvcnkgfSBmcm9tIFwiLi9jYXRlZ29yeVwiO1xuXG5leHBvcnQgdHlwZSBTb25hbXVMb2dnaW5nT3B0aW9uczxUU2lua0lkIGV4dGVuZHMgc3RyaW5nLCBURmlsdGVySWQgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuICAvLyBmYXN0aWZ5IOuhnOq5hSDsubTthYzqs6DrpqwgKGEuYi5j7J2YIO2Yle2DnOuhnCDrhKPsnLzrqbQgW2EsIGIsIGNd66GcIOuTpOyWtOqwkeuLiOuLpC4pXG4gIC8vIOq4sOuzuOqwkuydgCBbXCJmYXN0aWZ5XCJdIOyeheuLiOuLpC5cbiAgZmFzdGlmeUNhdGVnb3J5PzogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLy8g6rCBIO2VreuqqeuTpOydhCDshKTsoJXtlaAg65WMIFwiZmFzdGlmeS1jb25zb2xlXCLsnbQg65Ok7Ja06rCIIOqyveyasCwg642u7Ja07JSM7JuM7KeR64uI64ukLlxuICBzaW5rcz86IFJlY29yZDxUU2lua0lkLCBTaW5rPjtcbiAgZmlsdGVycz86IFJlY29yZDxURmlsdGVySWQsIEZpbHRlckxpa2U+O1xuXG4gIC8vIOqwgSDtla3rqqnsnYQg7ISk7KCV7ZWgIOuVjCBmYXN0aWZ5Q2F0ZWdvcnnsl5Ag7ISk7KCV65CcIOy5tO2FjOqzoOumrOqwgCDsnojsnYQg6rK97JqwLCDquLDrs7ggbG9nZ2VyIOyEpOygleydgCDstpTqsIDrkJjsp4Ag7JWK7Iq164uI64ukLlxuICBsb2dnZXJzPzogTG9nZ2VyQ29uZmlnPFRTaW5rSWQsIFRGaWx0ZXJJZD5bXTtcbn07XG5cbi8vIGZhc3RpZnnsl5Ag64yA7ZWcIOq4sOuzuCBzaW5rIOyEpOyglVxuZnVuY3Rpb24gZGVmYXVsdEZhc3RpZnlTaW5rKGZhc3RpZnlDYXRlZ29yeTogcmVhZG9ubHkgc3RyaW5nW10pOiBTaW5rIHtcbiAgY29uc3QgZm9ybWF0dGVyID0gKChmb3JtYXR0ZXI6IFRleHRGb3JtYXR0ZXIsIHJlY29yZDogTG9nUmVjb3JkKSA9PiB7XG4gICAgLy8gRmFzdGlmeSBBUEkgUm91dGXsl5Ag64yA7ZWcIExvZ2dlcuydmCDqsr3smrAsIOydkeuLtSDsvZTrk5zsmYAg7JqU7LKtIFVSTOydhCDstpTqsIBcbiAgICBjb25zdCBmaWx0ZXJGYXN0aWZ5ID0gKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZWNvcmQ6IExvZ1JlY29yZCwgcmVzcG9uc2VDb2RlPzogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvYXBpXCIpKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXR0ZXIocmVjb3JkKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGFzdEl0ZW0gPSByZWNvcmQubWVzc2FnZVtyZWNvcmQubWVzc2FnZS5sZW5ndGggLSAxXSBhcyBzdHJpbmc7XG4gICAgICByZXR1cm4gZm9ybWF0dGVyKHtcbiAgICAgICAgLi4ucmVjb3JkLFxuICAgICAgICBtZXNzYWdlOiBbXG4gICAgICAgICAgLi4ucmVjb3JkLm1lc3NhZ2Uuc2xpY2UoMCwgLTEpLFxuICAgICAgICAgIGBbJHtyZXF1ZXN0Lm1ldGhvZH0ke3Jlc3BvbnNlQ29kZSA/IGA6JHtyZXNwb25zZUNvZGV9YCA6IFwiXCJ9XSAke3JlcXVlc3Qub3JpZ2luYWxVcmx9IC0gJHtsYXN0SXRlbX1gLFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmICghaXNTYW1lQ2F0ZWdvcnkoZmFzdGlmeUNhdGVnb3J5LCBbLi4ucmVjb3JkLmNhdGVnb3J5XSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXR0ZXIocmVjb3JkKTtcbiAgICB9XG5cbiAgICBpZiAoXCJyZXFcIiBpbiByZWNvcmQucHJvcGVydGllcyAmJiByZWNvcmQucHJvcGVydGllcy5yZXEgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSByZWNvcmQucHJvcGVydGllcy5yZXEgYXMgRmFzdGlmeVJlcXVlc3Q7XG4gICAgICByZXR1cm4gZmlsdGVyRmFzdGlmeShyZXF1ZXN0LCByZWNvcmQpO1xuICAgIH1cblxuICAgIGlmIChcInJlc1wiIGluIHJlY29yZC5wcm9wZXJ0aWVzICYmIHJlY29yZC5wcm9wZXJ0aWVzLnJlcyAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcmVwbHkgPSByZWNvcmQucHJvcGVydGllcy5yZXMgYXMgRmFzdGlmeVJlcGx5O1xuICAgICAgcmV0dXJuIGZpbHRlckZhc3RpZnkocmVwbHkucmVxdWVzdCwgcmVjb3JkLCByZXBseS5zdGF0dXNDb2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0dGVyKHJlY29yZCk7XG4gIH0pLmJpbmQoXG4gICAgbnVsbCxcbiAgICBnZXRQcmV0dHlGb3JtYXR0ZXIoe1xuICAgICAgdGltZXN0YW1wOiBcInRpbWVcIixcbiAgICAgIGNhdGVnb3J5V2lkdGg6IDIwLFxuICAgICAgY2F0ZWdvcnlUcnVuY2F0ZTogXCJtaWRkbGVcIixcbiAgICB9KSxcbiAgKTtcblxuICByZXR1cm4gZ2V0Q29uc29sZVNpbmsoe1xuICAgIGZvcm1hdHRlcixcbiAgfSk7XG59XG5cbi8vIGZhc3RpZnnsl5Ag64yA7ZWcIOq4sOuzuCBmaWx0ZXIg7ISk7KCVICgvYXBpIOqyveuhnOydmCDsmpTssq3rp4wg66Gc6rmFKVxuZnVuY3Rpb24gZGVmYXVsdEZhc3RpZnlGaWx0ZXIoZmFzdGlmeUNhdGVnb3J5OiByZWFkb25seSBzdHJpbmdbXSk6IEZpbHRlciB7XG4gIHJldHVybiAocmVjb3JkOiBMb2dSZWNvcmQpID0+IHtcbiAgICBpZiAoIWlzU2FtZUNhdGVnb3J5KFsuLi5mYXN0aWZ5Q2F0ZWdvcnldLCBbLi4ucmVjb3JkLmNhdGVnb3J5XSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoXCJyZXFcIiBpbiByZWNvcmQucHJvcGVydGllcyAmJiByZWNvcmQucHJvcGVydGllcy5yZXEgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSByZWNvcmQucHJvcGVydGllcy5yZXEgYXMgRmFzdGlmeVJlcXVlc3Q7XG4gICAgICByZXR1cm4gcmVxdWVzdC51cmwuc3RhcnRzV2l0aChcIi9hcGlcIikgJiYgcmVxdWVzdC51cmwgIT09IFwiL2FwaS9oZWFsdGhjaGVja1wiO1xuICAgIH1cblxuICAgIGlmIChcInJlc1wiIGluIHJlY29yZC5wcm9wZXJ0aWVzICYmIHJlY29yZC5wcm9wZXJ0aWVzLnJlcyAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcmVwbHkgPSByZWNvcmQucHJvcGVydGllcy5yZXMgYXMgRmFzdGlmeVJlcGx5O1xuICAgICAgcmV0dXJuIHJlcGx5LnJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvYXBpXCIpICYmIHJlcGx5LnJlcXVlc3QudXJsICE9PSBcIi9hcGkvaGVhbHRoY2hlY2tcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuLy8g7KCE7LK0IGxvZ3RhcGUg7ISk7KCVXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29uZmlndXJlTG9nVGFwZTxUU2lua0lkIGV4dGVuZHMgc3RyaW5nLCBURmlsdGVySWQgZXh0ZW5kcyBzdHJpbmc+KFxuICBvcHRpb25zOiBTb25hbXVMb2dnaW5nT3B0aW9uczxUU2lua0lkLCBURmlsdGVySWQ+LFxuKSB7XG4gIGNvbnN0IGZhc3RpZnlDYXRlZ29yeSA9IG9wdGlvbnMuZmFzdGlmeUNhdGVnb3J5ID8/IFtcImZhc3RpZnlcIl07XG5cbiAgY29uc3Qgc2lua3MgPSB7XG4gICAgXCJmYXN0aWZ5LWNvbnNvbGVcIjogZGVmYXVsdEZhc3RpZnlTaW5rKGZhc3RpZnlDYXRlZ29yeSksXG4gICAgLi4ub3B0aW9ucy5zaW5rcyxcbiAgfSBhcyBSZWNvcmQ8VFNpbmtJZCB8IFwiZmFzdGlmeS1jb25zb2xlXCIsIFNpbms+O1xuXG4gIGNvbnN0IGZpbHRlcnMgPSB7XG4gICAgXCJmYXN0aWZ5LWNvbnNvbGVcIjogZGVmYXVsdEZhc3RpZnlGaWx0ZXIoZmFzdGlmeUNhdGVnb3J5KSxcbiAgICAuLi5vcHRpb25zLmZpbHRlcnMsXG4gIH0gYXMgUmVjb3JkPFRGaWx0ZXJJZCB8IFwiZmFzdGlmeS1jb25zb2xlXCIsIEZpbHRlckxpa2U+O1xuXG4gIGNvbnN0IGxvZ2dlcnM6IFNldDxMb2dnZXJDb25maWc8VFNpbmtJZCB8IFwiZmFzdGlmeS1jb25zb2xlXCIsIFRGaWx0ZXJJZCB8IFwiZmFzdGlmeS1jb25zb2xlXCI+PiA9XG4gICAgbmV3IFNldChvcHRpb25zLmxvZ2dlcnMgPz8gW10pO1xuXG4gIC8vIGxvZ3RhcGXsnZggbWV0YSBsb2dnZXIg7ZGc7Iuc66W8IOu5hO2ZnOyEse2ZlFxuICBsb2dnZXJzLmFkZCh7XG4gICAgY2F0ZWdvcnk6IFtcImxvZ3RhcGVcIiwgXCJtZXRhXCJdLFxuICAgIGxvd2VzdExldmVsOiBcImZhdGFsXCIsXG4gIH0pO1xuXG4gIGlmIChbLi4ubG9nZ2Vyc10uZXZlcnkoKGxvZ2dlcikgPT4gIWlzU2FtZUNhdGVnb3J5KFsuLi5mYXN0aWZ5Q2F0ZWdvcnldLCBsb2dnZXIuY2F0ZWdvcnkpKSkge1xuICAgIGxvZ2dlcnMuYWRkKHtcbiAgICAgIGNhdGVnb3J5OiBbLi4uZmFzdGlmeUNhdGVnb3J5XSxcbiAgICAgIHNpbmtzOiBbXCJmYXN0aWZ5LWNvbnNvbGVcIl0sXG4gICAgICBsb3dlc3RMZXZlbDogXCJpbmZvXCIsXG4gICAgICBmaWx0ZXJzOiBbXCJmYXN0aWZ5LWNvbnNvbGVcIl0sXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gY29uZmlndXJlKHsgc2lua3MsIGZpbHRlcnMsIGxvZ2dlcnM6IFsuLi5sb2dnZXJzXSwgcmVzZXQ6IHRydWUgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBNEJBLFNBQVMsbUJBQW1CLGlCQUEwQztDQTBDcEUsT0FBTyxlQUFlLEVBQ3BCLGFBMUNrQixXQUEwQixXQUFzQjtFQUVsRSxNQUFNLGlCQUFpQixTQUF5QixRQUFtQixpQkFBMEI7R0FDM0YsSUFBSSxDQUFDLFFBQVEsSUFBSSxXQUFXLE1BQU0sR0FDaEMsT0FBTyxVQUFVLE1BQU07R0FHekIsTUFBTSxXQUFXLE9BQU8sUUFBUSxPQUFPLFFBQVEsU0FBUztHQUN4RCxPQUFPLFVBQVU7SUFDZixHQUFHO0lBQ0gsU0FBUyxDQUNQLEdBQUcsT0FBTyxRQUFRLE1BQU0sR0FBRyxFQUFFLEdBQzdCLElBQUksUUFBUSxTQUFTLGVBQWUsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLFFBQVEsWUFBWSxLQUFLLFVBQzNGO0dBQ0YsQ0FBQztFQUNIO0VBRUEsSUFBSSxDQUFDLGVBQWUsaUJBQWlCLENBQUMsR0FBRyxPQUFPLFFBQVEsQ0FBQyxHQUN2RCxPQUFPLFVBQVUsTUFBTTtFQUd6QixJQUFJLFNBQVMsT0FBTyxjQUFjLE9BQU8sV0FBVyxRQUFRLE1BQU07R0FDaEUsTUFBTSxVQUFVLE9BQU8sV0FBVztHQUNsQyxPQUFPLGNBQWMsU0FBUyxNQUFNO0VBQ3RDO0VBRUEsSUFBSSxTQUFTLE9BQU8sY0FBYyxPQUFPLFdBQVcsUUFBUSxNQUFNO0dBQ2hFLE1BQU0sUUFBUSxPQUFPLFdBQVc7R0FDaEMsT0FBTyxjQUFjLE1BQU0sU0FBUyxRQUFRLE1BQU0sVUFBVTtFQUM5RDtFQUVBLE9BQU8sVUFBVSxNQUFNO0NBQ3pCLEVBQUEsQ0FBRyxLQUNELE1BQ0EsbUJBQW1CO0VBQ2pCLFdBQVc7RUFDWCxlQUFlO0VBQ2Ysa0JBQWtCO0NBQ3BCLENBQUMsQ0FJRCxFQUNGLENBQUM7QUFDSDtBQUdBLFNBQVMscUJBQXFCLGlCQUE0QztDQUN4RSxRQUFRLFdBQXNCO0VBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxlQUFlLEdBQUcsQ0FBQyxHQUFHLE9BQU8sUUFBUSxDQUFDLEdBQzVELE9BQU87RUFHVCxJQUFJLFNBQVMsT0FBTyxjQUFjLE9BQU8sV0FBVyxRQUFRLE1BQU07R0FDaEUsTUFBTSxVQUFVLE9BQU8sV0FBVztHQUNsQyxPQUFPLFFBQVEsSUFBSSxXQUFXLE1BQU0sS0FBSyxRQUFRLFFBQVE7RUFDM0Q7RUFFQSxJQUFJLFNBQVMsT0FBTyxjQUFjLE9BQU8sV0FBVyxRQUFRLE1BQU07R0FDaEUsTUFBTSxRQUFRLE9BQU8sV0FBVztHQUNoQyxPQUFPLE1BQU0sUUFBUSxJQUFJLFdBQVcsTUFBTSxLQUFLLE1BQU0sUUFBUSxRQUFRO0VBQ3ZFO0VBRUEsT0FBTztDQUNUO0FBQ0Y7QUFHQSxlQUFzQixpQkFDcEIsU0FDQTtDQUNBLE1BQU0sa0JBQWtCLFFBQVEsbUJBQW1CLENBQUMsU0FBUztDQUU3RCxNQUFNLFFBQVE7RUFDWixtQkFBbUIsbUJBQW1CLGVBQWU7RUFDckQsR0FBRyxRQUFRO0NBQ2I7Q0FFQSxNQUFNLFVBQVU7RUFDZCxtQkFBbUIscUJBQXFCLGVBQWU7RUFDdkQsR0FBRyxRQUFRO0NBQ2I7Q0FFQSxNQUFNLFVBQ0osSUFBSSxJQUFJLFFBQVEsV0FBVyxDQUFDLENBQUM7Q0FHL0IsUUFBUSxJQUFJO0VBQ1YsVUFBVSxDQUFDLFdBQVcsTUFBTTtFQUM1QixhQUFhO0NBQ2YsQ0FBQztDQUVELElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLE9BQU8sV0FBVyxDQUFDLGVBQWUsQ0FBQyxHQUFHLGVBQWUsR0FBRyxPQUFPLFFBQVEsQ0FBQyxHQUN2RixRQUFRLElBQUk7RUFDVixVQUFVLENBQUMsR0FBRyxlQUFlO0VBQzdCLE9BQU8sQ0FBQyxpQkFBaUI7RUFDekIsYUFBYTtFQUNiLFNBQVMsQ0FBQyxpQkFBaUI7Q0FDN0IsQ0FBQztDQUdILE9BQU8sVUFBVTtFQUFFO0VBQU87RUFBUyxTQUFTLENBQUMsR0FBRyxPQUFPO0VBQUcsT0FBTztDQUFLLENBQUM7QUFDekU7OztlQXZIMkMifQ==
|