sonamu 0.9.20 → 0.10.1
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 +210 -406
- package/dist/api/validator.js +5 -8
- package/dist/api/websocket-helpers.js +22 -33
- package/dist/auth/audit-log/builders.d.ts.map +1 -1
- package/dist/auth/audit-log/builders.js +4 -3
- package/dist/auth/audit-log/client-ip.d.ts +3 -0
- package/dist/auth/audit-log/client-ip.d.ts.map +1 -0
- package/dist/auth/audit-log/client-ip.js +27 -0
- package/dist/auth/audit-log/events.d.ts +1 -0
- package/dist/auth/audit-log/events.d.ts.map +1 -1
- package/dist/auth/audit-log/events.js +2 -2
- package/dist/auth/audit-log/plugin.js +30 -61
- package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
- package/dist/auth/audit-log-ingestor.js +26 -43
- package/dist/auth/auth-generator.js +16 -41
- package/dist/auth/better-auth-entities.js +3 -4
- package/dist/auth/better-auth-request.d.ts +3 -0
- package/dist/auth/better-auth-request.d.ts.map +1 -0
- package/dist/auth/better-auth-request.js +23 -0
- 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 +152 -259
- 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 +157 -311
- 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 +9 -8
- package/dist/logger/category.js +6 -12
- package/dist/logger/configure.js +23 -34
- package/dist/migration/code-generation.js +147 -315
- 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 +14 -32
- 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.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +5 -4
- 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 +100 -196
- 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 +8 -8
- 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 +28 -33
- package/src/auth/audit-log/builders.ts +3 -0
- package/src/auth/audit-log/client-ip.ts +38 -0
- package/src/auth/audit-log/events.ts +1 -0
- package/src/auth/audit-log-ingestor.ts +22 -15
- package/src/auth/better-auth-request.ts +20 -0
- 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/puri.md +33 -0
- package/src/skills/sonamu/testing-devrunner.md +1 -1
- package/src/stream/ws-telemetry-memory.ts +2 -2
- package/src/syncer/checksum.ts +7 -12
- 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/index.ts +1 -0
- 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/dict/types.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {};
|
package/dist/dict/utils.js
CHANGED
|
@@ -15,16 +15,15 @@ function josa(word, type) {
|
|
|
15
15
|
if (lastChar < 44032 || lastChar > 55203) return false;
|
|
16
16
|
return (lastChar - 44032) % 28 !== 0;
|
|
17
17
|
})();
|
|
18
|
-
|
|
18
|
+
return word + {
|
|
19
19
|
은는: has받침 ? "은" : "는",
|
|
20
20
|
이가: has받침 ? "이" : "가",
|
|
21
21
|
을를: has받침 ? "을" : "를",
|
|
22
22
|
과와: has받침 ? "과" : "와",
|
|
23
23
|
으로: has받침 ? "으로" : "로"
|
|
24
|
-
};
|
|
25
|
-
return word + map[type];
|
|
24
|
+
}[type];
|
|
26
25
|
}
|
|
27
|
-
|
|
28
26
|
//#endregion
|
|
29
27
|
export { createFormat, josa, plural };
|
|
30
|
-
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpY3QvdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgUGx1cmFsRm9ybXMgPSB7XG4gIHplcm8/OiBzdHJpbmcgfCAoKG46IG51bWJlcikgPT4gc3RyaW5nKTtcbiAgb25lPzogc3RyaW5nIHwgKChuOiBudW1iZXIpID0+IHN0cmluZyk7XG4gIG90aGVyPzogc3RyaW5nIHwgKChuOiBudW1iZXIpID0+IHN0cmluZyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlciwgZm9ybXM6IFBsdXJhbEZvcm1zKTogc3RyaW5nIHtcbiAgY29uc3QgZm9ybSA9IChuID09PSAwICYmIGZvcm1zLnplcm8pIHx8IChuID09PSAxICYmIGZvcm1zLm9uZSkgfHwgZm9ybXMub3RoZXI7XG4gIHJldHVybiB0eXBlb2YgZm9ybSA9PT0gXCJmdW5jdGlvblwiID8gZm9ybShuKSA6IChmb3JtID8/IG4udG9TdHJpbmcoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtYXQobG9jYWxlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBudW1iZXI6IChuOiBudW1iZXIpID0+IG4udG9Mb2NhbGVTdHJpbmcobG9jYWxlKSxcbiAgICBkYXRlOiAoZDogRGF0ZSkgPT4gZC50b0xvY2FsZURhdGVTdHJpbmcobG9jYWxlKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpvc2Eod29yZDogc3RyaW5nLCB0eXBlOiBcIuydgOuKlFwiIHwgXCLsnbTqsIBcIiB8IFwi7J2E66W8XCIgfCBcIuqzvOyZgFwiIHwgXCLsnLzroZxcIikge1xuICBjb25zdCBoYXPrsJvsuaggPSAoKCkgPT4ge1xuICAgIGNvbnN0IGxhc3RDaGFyID0gd29yZC5jaGFyQ29kZUF0KHdvcmQubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGxhc3RDaGFyIDwgMHhhYzAwIHx8IGxhc3RDaGFyID4gMHhkN2EzKVxuICAgICAgLy8g7ZWc6riAIOycoOuLiOy9lOuTnCDrspTsnIQ6IDB4QUMwMCB+IDB4RDdBM1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAobGFzdENoYXIgLSAweGFjMDApICUgMjggIT09IDA7XG4gIH0pKCk7XG5cbiAgY29uc3QgbWFwID0ge1xuICAgIOydgOuKlDogaGFz67Cb7LmoID8gXCLsnYBcIiA6IFwi64qUXCIsXG4gICAg7J206rCAOiBoYXPrsJvsuaggPyBcIuydtFwiIDogXCLqsIBcIixcbiAgICDsnYTrpbw6IGhhc+uwm+y5qCA/IFwi7J2EXCIgOiBcIuulvFwiLFxuICAgIOqzvOyZgDogaGFz67Cb7LmoID8gXCLqs7xcIiA6IFwi7JmAXCIsXG4gICAg7Jy866GcOiBoYXPrsJvsuaggPyBcIuycvOuhnFwiIDogXCLroZxcIixcbiAgfTtcblxuICByZXR1cm4gd29yZCArIG1hcFt0eXBlXTtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQU1BLFNBQWdCLE9BQU8sR0FBVyxPQUE0QjtDQUM1RCxNQUFNLE9BQVEsTUFBTSxLQUFLLE1BQU0sUUFBVSxNQUFNLEtBQUssTUFBTSxPQUFRLE1BQU07Q0FDeEUsT0FBTyxPQUFPLFNBQVMsYUFBYSxLQUFLLENBQUMsSUFBSyxRQUFRLEVBQUUsU0FBUztBQUNwRTtBQUVBLFNBQWdCLGFBQWEsUUFBZ0I7Q0FDM0MsT0FBTztFQUNMLFNBQVMsTUFBYyxFQUFFLGVBQWUsTUFBTTtFQUM5QyxPQUFPLE1BQVksRUFBRSxtQkFBbUIsTUFBTTtDQUNoRDtBQUNGO0FBRUEsU0FBZ0IsS0FBSyxNQUFjLE1BQXdDO0NBQ3pFLE1BQU0sZUFBZTtFQUNuQixNQUFNLFdBQVcsS0FBSyxXQUFXLEtBQUssU0FBUyxDQUFDO0VBQ2hELElBQUksV0FBVyxTQUFVLFdBQVcsT0FFbEMsT0FBTztFQUNULFFBQVEsV0FBVyxTQUFVLE9BQU87Q0FDdEMsRUFBQSxDQUFHO0NBVUgsT0FBTyxPQUFPO0VBUFosSUFBSSxRQUFRLE1BQU07RUFDbEIsSUFBSSxRQUFRLE1BQU07RUFDbEIsSUFBSSxRQUFRLE1BQU07RUFDbEIsSUFBSSxRQUFRLE1BQU07RUFDbEIsSUFBSSxRQUFRLE9BQU87Q0FHUCxFQUFJO0FBQ3BCIn0=
|
|
@@ -51,7 +51,7 @@ declare class EntityManagerClass {
|
|
|
51
51
|
type: "string";
|
|
52
52
|
name: string;
|
|
53
53
|
length?: number | undefined;
|
|
54
|
-
zodFormat?: "
|
|
54
|
+
zodFormat?: "base64" | "base64url" | "hex" | "uuid" | "email" | "url" | "httpUrl" | "hostname" | "emoji" | "jwt" | "nanoid" | "cuid" | "cuid2" | "ulid" | "ipv4" | "ipv6" | "mac" | "cidrv4" | "cidrv6" | "hashMd5" | "hashSha1" | "hashSha256" | "hashSha384" | "hashSha512" | "isoDate" | "isoTime" | "isoDatetime" | "isoDuration" | undefined;
|
|
55
55
|
desc?: string | undefined;
|
|
56
56
|
nullable?: boolean | undefined;
|
|
57
57
|
toFilter?: boolean | undefined;
|
|
@@ -82,7 +82,7 @@ declare class EntityManagerClass {
|
|
|
82
82
|
type: "string[]";
|
|
83
83
|
name: string;
|
|
84
84
|
length?: number | undefined;
|
|
85
|
-
zodFormat?: "
|
|
85
|
+
zodFormat?: "base64" | "base64url" | "hex" | "uuid" | "email" | "url" | "httpUrl" | "hostname" | "emoji" | "jwt" | "nanoid" | "cuid" | "cuid2" | "ulid" | "ipv4" | "ipv6" | "mac" | "cidrv4" | "cidrv6" | "hashMd5" | "hashSha1" | "hashSha256" | "hashSha384" | "hashSha512" | "isoDate" | "isoTime" | "isoDatetime" | "isoDuration" | undefined;
|
|
86
86
|
desc?: string | undefined;
|
|
87
87
|
nullable?: boolean | undefined;
|
|
88
88
|
toFilter?: boolean | undefined;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { globAsync, init_async_utils } from "../utils/async-utils.js";
|
|
3
3
|
import { Sonamu, init_sonamu } from "../api/sonamu.js";
|
|
4
4
|
import { EntityJsonSchema, SonamuFileArraySchema, SonamuFileSchema, init_types, isSearchTextJsonSourceZodType, isSearchTextProp } from "../types/types.js";
|
|
@@ -7,10 +7,9 @@ import { init_path_utils, runtimePath } from "../utils/path-utils.js";
|
|
|
7
7
|
import inflection from "inflection";
|
|
8
8
|
import { prettifyError, z as z$1 } from "zod";
|
|
9
9
|
import assert from "assert";
|
|
10
|
-
import { glob, readFile } from "fs/promises";
|
|
11
10
|
import path from "path";
|
|
11
|
+
import { glob, readFile } from "fs/promises";
|
|
12
12
|
import chalk from "chalk";
|
|
13
|
-
|
|
14
13
|
//#region src/entity/entity-manager.ts
|
|
15
14
|
var EntityManagerClass, EntityManager;
|
|
16
15
|
var init_entity_manager = __esmMin((() => {
|
|
@@ -20,14 +19,12 @@ var init_entity_manager = __esmMin((() => {
|
|
|
20
19
|
init_esm_utils();
|
|
21
20
|
init_path_utils();
|
|
22
21
|
EntityManagerClass = class {
|
|
23
|
-
entities = new Map();
|
|
24
|
-
modulePaths = new Map();
|
|
25
|
-
tableSpecs = new Map();
|
|
22
|
+
entities = /* @__PURE__ */ new Map();
|
|
23
|
+
modulePaths = /* @__PURE__ */ new Map();
|
|
24
|
+
tableSpecs = /* @__PURE__ */ new Map();
|
|
26
25
|
isAutoloaded = false;
|
|
27
26
|
async autoload(_ = false) {
|
|
28
|
-
if (this.isAutoloaded)
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
27
|
+
if (this.isAutoloaded) return;
|
|
31
28
|
const pathPattern = path.join(Sonamu.apiRootPath, "/src/application/**/*.entity.json");
|
|
32
29
|
for await (const file of glob(path.resolve(pathPattern))) {
|
|
33
30
|
const json = JSON.parse((await readFile(file)).toString());
|
|
@@ -58,84 +55,53 @@ var init_entity_manager = __esmMin((() => {
|
|
|
58
55
|
const { Entity } = await import("./entity.js");
|
|
59
56
|
const entity = new Entity(json);
|
|
60
57
|
await entity.registerModulePaths();
|
|
61
|
-
if (!options.deferSearchTextJsonSourceValidation)
|
|
62
|
-
await this.validateSearchTextJsonSources(entity);
|
|
63
|
-
}
|
|
58
|
+
if (!options.deferSearchTextJsonSourceValidation) await this.validateSearchTextJsonSources(entity);
|
|
64
59
|
entity.registerTableSpecs();
|
|
65
60
|
this.entities.set(json.id, entity);
|
|
66
61
|
}
|
|
67
62
|
async validateAllRegisteredSearchTextJsonSources() {
|
|
68
|
-
for (const entity of this.entities.values())
|
|
69
|
-
await this.validateSearchTextJsonSources(entity);
|
|
70
|
-
}
|
|
63
|
+
for (const entity of this.entities.values()) await this.validateSearchTextJsonSources(entity);
|
|
71
64
|
}
|
|
72
65
|
async validateSearchTextJsonSources(entity) {
|
|
73
66
|
const propsByName = new Map(entity.props.map((prop) => [prop.name, prop]));
|
|
74
67
|
for (const prop of entity.props) {
|
|
75
|
-
if (!isSearchTextProp(prop))
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
68
|
+
if (!isSearchTextProp(prop)) continue;
|
|
78
69
|
for (const source of prop.sourceColumns) {
|
|
79
70
|
const sourceProp = propsByName.get(source.name);
|
|
80
|
-
if (!sourceProp || sourceProp.type !== "json")
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
71
|
+
if (!sourceProp || sourceProp.type !== "json") continue;
|
|
83
72
|
const zodType = await this.resolveSearchTextJsonSourceType(entity, sourceProp.id);
|
|
84
|
-
if (!zodType) {
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
if (!isSearchTextJsonSourceZodType(zodType)) {
|
|
88
|
-
throw new Error(`searchText source "${source.name}"의 json 타입 "${sourceProp.id}"은(는) unwrap 후 z.array(z.string()) 이어야 합니다.`);
|
|
89
|
-
}
|
|
73
|
+
if (!zodType) throw new Error(`searchText source "${source.name}"의 json 타입 "${sourceProp.id}"을(를) 로드할 수 없습니다.`);
|
|
74
|
+
if (!isSearchTextJsonSourceZodType(zodType)) throw new Error(`searchText source "${source.name}"의 json 타입 "${sourceProp.id}"은(는) unwrap 후 z.array(z.string()) 이어야 합니다.`);
|
|
90
75
|
}
|
|
91
76
|
}
|
|
92
77
|
}
|
|
93
78
|
async resolveSearchTextJsonSourceType(entity, typeId) {
|
|
94
79
|
const localType = entity.types[typeId];
|
|
95
|
-
if (localType instanceof z$1.ZodType)
|
|
96
|
-
return localType;
|
|
97
|
-
}
|
|
80
|
+
if (localType instanceof z$1.ZodType) return localType;
|
|
98
81
|
for (const registeredEntity of this.entities.values()) {
|
|
99
82
|
const registeredType = registeredEntity.types[typeId];
|
|
100
|
-
if (registeredType instanceof z$1.ZodType)
|
|
101
|
-
return registeredType;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
if (typeId === "SonamuFile") {
|
|
105
|
-
return SonamuFileSchema;
|
|
106
|
-
}
|
|
107
|
-
if (typeId === "SonamuFile[]") {
|
|
108
|
-
return SonamuFileArraySchema;
|
|
83
|
+
if (registeredType instanceof z$1.ZodType) return registeredType;
|
|
109
84
|
}
|
|
85
|
+
if (typeId === "SonamuFile") return SonamuFileSchema;
|
|
86
|
+
if (typeId === "SonamuFile[]") return SonamuFileArraySchema;
|
|
110
87
|
const modulePath = this.modulePaths.get(typeId);
|
|
111
|
-
if (!modulePath)
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
const moduleFilePath = path.join(Sonamu.apiRootPath, runtimePath(`dist/application/${modulePath}.js`));
|
|
115
|
-
const importedMembers = await importMembers(moduleFilePath);
|
|
116
|
-
const matched = importedMembers.find(({ name }) => name === typeId);
|
|
117
|
-
if (!matched || !(matched.value instanceof z$1.ZodType)) {
|
|
118
|
-
return null;
|
|
119
|
-
}
|
|
88
|
+
if (!modulePath) return null;
|
|
89
|
+
const matched = (await importMembers(path.join(Sonamu.apiRootPath, runtimePath(`dist/application/${modulePath}.js`)))).find(({ name }) => name === typeId);
|
|
90
|
+
if (!matched || !(matched.value instanceof z$1.ZodType)) return null;
|
|
120
91
|
return matched.value;
|
|
121
92
|
}
|
|
122
93
|
get(entityId) {
|
|
123
94
|
const entity = this.entities.get(entityId);
|
|
124
|
-
if (entity ===
|
|
125
|
-
throw new Error(`존재하지 않는 Entity 요청 ${entityId}`);
|
|
126
|
-
}
|
|
95
|
+
if (entity === void 0) throw new Error(`존재하지 않는 Entity 요청 ${entityId}`);
|
|
127
96
|
return entity;
|
|
128
97
|
}
|
|
129
98
|
getByTable(table) {
|
|
130
|
-
const entity = Array.from(this.entities.values()).find((entity
|
|
131
|
-
if (entity ===
|
|
132
|
-
throw new Error(`존재하지 않는 Entity 요청 ${table}`);
|
|
133
|
-
}
|
|
99
|
+
const entity = Array.from(this.entities.values()).find((entity) => entity.table === table);
|
|
100
|
+
if (entity === void 0) throw new Error(`존재하지 않는 Entity 요청 ${table}`);
|
|
134
101
|
return entity;
|
|
135
102
|
}
|
|
136
103
|
exists(entityId) {
|
|
137
|
-
|
|
138
|
-
return entity !== undefined;
|
|
104
|
+
return this.entities.get(entityId) !== void 0;
|
|
139
105
|
}
|
|
140
106
|
getAllIds() {
|
|
141
107
|
return Array.from(EntityManager.entities.keys()).toSorted();
|
|
@@ -145,14 +111,12 @@ var init_entity_manager = __esmMin((() => {
|
|
|
145
111
|
}
|
|
146
112
|
getAllParentIds() {
|
|
147
113
|
return this.getAllIds().filter((entityId) => {
|
|
148
|
-
|
|
149
|
-
return entity.parentId === undefined;
|
|
114
|
+
return this.get(entityId).parentId === void 0;
|
|
150
115
|
});
|
|
151
116
|
}
|
|
152
117
|
getChildrenIds(parentId) {
|
|
153
118
|
return this.getAllIds().filter((entityId) => {
|
|
154
|
-
|
|
155
|
-
return entity.parentId === parentId;
|
|
119
|
+
return this.get(entityId).parentId === parentId;
|
|
156
120
|
});
|
|
157
121
|
}
|
|
158
122
|
setModulePath(key, modulePath) {
|
|
@@ -160,9 +124,7 @@ var init_entity_manager = __esmMin((() => {
|
|
|
160
124
|
}
|
|
161
125
|
getModulePath(key) {
|
|
162
126
|
const modulePath = this.modulePaths.get(key);
|
|
163
|
-
if (modulePath ===
|
|
164
|
-
throw new Error(`존재하지 않는 모듈 패스 요청 ${key}`);
|
|
165
|
-
}
|
|
127
|
+
if (modulePath === void 0) throw new Error(`존재하지 않는 모듈 패스 요청 ${key}`);
|
|
166
128
|
return modulePath;
|
|
167
129
|
}
|
|
168
130
|
setTableSpec(tableSpec) {
|
|
@@ -170,9 +132,7 @@ var init_entity_manager = __esmMin((() => {
|
|
|
170
132
|
}
|
|
171
133
|
getTableSpec(key) {
|
|
172
134
|
const tableSpec = this.tableSpecs.get(key);
|
|
173
|
-
if (tableSpec ===
|
|
174
|
-
throw new Error(`존재하지 않는 테이블 스펙 요청 ${key}`);
|
|
175
|
-
}
|
|
135
|
+
if (tableSpec === void 0) throw new Error(`존재하지 않는 테이블 스펙 요청 ${key}`);
|
|
176
136
|
return tableSpec;
|
|
177
137
|
}
|
|
178
138
|
getNamesFromId(entityId) {
|
|
@@ -195,14 +155,13 @@ var init_entity_manager = __esmMin((() => {
|
|
|
195
155
|
*/
|
|
196
156
|
getEntityIdFromPath(filePath) {
|
|
197
157
|
const fileName = path.basename(filePath);
|
|
198
|
-
const
|
|
158
|
+
const matchedSuffix = [
|
|
199
159
|
".model.ts",
|
|
200
160
|
".model.js",
|
|
201
161
|
".entity.json",
|
|
202
162
|
".frame.ts",
|
|
203
163
|
".frame.js"
|
|
204
|
-
];
|
|
205
|
-
const matchedSuffix = supportedSuffixes.find((suffix) => fileName.endsWith(suffix));
|
|
164
|
+
].find((suffix) => fileName.endsWith(suffix));
|
|
206
165
|
assert(matchedSuffix, `지원하지 않는 entity 경로입니다: ${filePath}`);
|
|
207
166
|
const entityBaseName = fileName.slice(0, -matchedSuffix.length);
|
|
208
167
|
assert(entityBaseName.length > 0, `EntityId를 계산할 수 없는 경로입니다: ${filePath}`);
|
|
@@ -214,26 +173,19 @@ var init_entity_manager = __esmMin((() => {
|
|
|
214
173
|
for (const filePath of typePaths) {
|
|
215
174
|
const modulePath = this.getModulePathFromTypeFilePath(filePath);
|
|
216
175
|
const importedMembers = await importMembers(filePath);
|
|
217
|
-
for (const { name, value } of importedMembers)
|
|
218
|
-
if (value instanceof z$1.ZodType) {
|
|
219
|
-
this.setModulePath(name, modulePath);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
176
|
+
for (const { name, value } of importedMembers) if (value instanceof z$1.ZodType) this.setModulePath(name, modulePath);
|
|
222
177
|
}
|
|
223
178
|
}
|
|
224
179
|
getModulePathFromTypeFilePath(filePath) {
|
|
225
|
-
const
|
|
226
|
-
|
|
227
|
-
if (!matched?.[1]) {
|
|
228
|
-
throw new Error(`타입 파일의 모듈 경로를 계산할 수 없습니다: ${filePath}`);
|
|
229
|
-
}
|
|
180
|
+
const matched = filePath.replaceAll("\\", "/").match(/\/(?:src|dist)\/application\/(.+)\.(?:ts|js)$/);
|
|
181
|
+
if (!matched?.[1]) throw new Error(`타입 파일의 모듈 경로를 계산할 수 없습니다: ${filePath}`);
|
|
230
182
|
return matched[1];
|
|
231
183
|
}
|
|
232
184
|
};
|
|
233
185
|
EntityManager = new EntityManagerClass();
|
|
234
186
|
}));
|
|
235
|
-
|
|
236
187
|
//#endregion
|
|
237
188
|
init_entity_manager();
|
|
238
189
|
export { EntityManager, init_entity_manager };
|
|
239
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LW1hbmFnZXIuanMiLCJuYW1lcyI6WyJ6IiwiZW50aXR5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VudGl0eS9lbnRpdHktbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IGdsb2IsIHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgcHJldHRpZnlFcnJvciwgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7XG4gIEVudGl0eUpzb25TY2hlbWEsXG4gIGlzU2VhcmNoVGV4dEpzb25Tb3VyY2Vab2RUeXBlLFxuICBpc1NlYXJjaFRleHRQcm9wLFxuICBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gIFNvbmFtdUZpbGVTY2hlbWEsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlJbmRleCwgdHlwZSBFbnRpdHlKc29uIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBnbG9iQXN5bmMgfSBmcm9tIFwiLi4vdXRpbHMvYXN5bmMtdXRpbHNcIjtcbmltcG9ydCB7IGltcG9ydE1lbWJlcnMgfSBmcm9tIFwiLi4vdXRpbHMvZXNtLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBydW50aW1lUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eSB9IGZyb20gXCIuL2VudGl0eVwiO1xuXG5leHBvcnQgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCA9IFJlY29yZDxcbiAgXCJmc1wiIHwgXCJmc1BsdXJhbFwiIHwgXCJjYW1lbFwiIHwgXCJjYW1lbFBsdXJhbFwiIHwgXCJjYXBpdGFsXCIgfCBcImNhcGl0YWxQbHVyYWxcIiB8IFwidXBwZXJcIiB8IFwiY29uc3RhbnRcIixcbiAgc3RyaW5nXG4+O1xuZXhwb3J0IHR5cGUgVGFibGVTcGVjID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHVuaXF1ZUluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIGpzb25Db2x1bW5zOiBzdHJpbmdbXTtcbn07XG5jbGFzcyBFbnRpdHlNYW5hZ2VyQ2xhc3Mge1xuICBwcml2YXRlIGVudGl0aWVzOiBNYXA8c3RyaW5nLCBFbnRpdHk+ID0gbmV3IE1hcCgpO1xuICBwdWJsaWMgbW9kdWxlUGF0aHM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgdGFibGVTcGVjczogTWFwPHN0cmluZywgVGFibGVTcGVjPiA9IG5ldyBNYXAoKTtcbiAgcHVibGljIGlzQXV0b2xvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIOqyveuhnCDsoITri6zrsJvslYQg66qo65OgIGVudGl0eS5qc29uIO2MjOydvCDroZzrk5xcbiAgYXN5bmMgYXV0b2xvYWQoXzogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuaXNBdXRvbG9hZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhdGhQYXR0ZXJuID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCIvc3JjL2FwcGxpY2F0aW9uLyoqLyouZW50aXR5Lmpzb25cIik7XG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGZpbGUgb2YgZ2xvYihwYXRoLnJlc29sdmUocGF0aFBhdHRlcm4pKSkge1xuICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoKGF3YWl0IHJlYWRGaWxlKGZpbGUpKS50b1N0cmluZygpKTtcblxuICAgICAgLy8gZW50aXR5Lmpzb24g7Iqk7YKk66eIIOqygOymnVxuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLnNjaGVtYVZhbGlkYXRlKGpzb24pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBmaWxlKTtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gcHJldHRpZnlFcnJvcihlcnJvcik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKGBJbnZhbGlkIGVudGl0eS5qc29uIHNjaGVtYTogJHtyZWxhdGl2ZVBhdGh9XFxuJHtjaGFsay55ZWxsb3coZXJyb3JNZXNzYWdlKX1gKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5yZWdpc3Rlcihqc29uLCB7IGRlZmVyU2VhcmNoVGV4dEpzb25Tb3VyY2VWYWxpZGF0aW9uOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJOb25FbnRpdHlUeXBlTW9kdWxlUGF0aHMoKTtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQWxsUmVnaXN0ZXJlZFNlYXJjaFRleHRKc29uU291cmNlcygpO1xuXG4gICAgdGhpcy5pc0F1dG9sb2FkZWQgPSB0cnVlO1xuICB9XG5cbiAgc2NoZW1hVmFsaWRhdGUoanNvbjogdW5rbm93bikge1xuICAgIGNvbnN0IHJlc3VsdCA9IEVudGl0eUpzb25TY2hlbWEuc2FmZVBhcnNlKGpzb24pO1xuICAgIHJldHVybiByZXN1bHQuc3VjY2VzcyA/IG51bGwgOiByZXN1bHQuZXJyb3I7XG4gIH1cblxuICBhc3luYyByZWxvYWQoZG9TaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuZW50aXRpZXMuY2xlYXIoKTtcbiAgICB0aGlzLm1vZHVsZVBhdGhzLmNsZWFyKCk7XG4gICAgdGhpcy50YWJsZVNwZWNzLmNsZWFyKCk7XG4gICAgdGhpcy5pc0F1dG9sb2FkZWQgPSBmYWxzZTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmF1dG9sb2FkKGRvU2lsZW50KTtcbiAgfVxuXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIGpzb246IEVudGl0eUpzb24sXG4gICAgb3B0aW9uczogeyBkZWZlclNlYXJjaFRleHRKc29uU291cmNlVmFsaWRhdGlvbj86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IEVudGl0eSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9lbnRpdHlcIik7XG4gICAgY29uc3QgZW50aXR5ID0gbmV3IEVudGl0eShqc29uKTtcbiAgICBhd2FpdCBlbnRpdHkucmVnaXN0ZXJNb2R1bGVQYXRocygpO1xuICAgIGlmICghb3B0aW9ucy5kZWZlclNlYXJjaFRleHRKc29uU291cmNlVmFsaWRhdGlvbikge1xuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZVNlYXJjaFRleHRKc29uU291cmNlcyhlbnRpdHkpO1xuICAgIH1cbiAgICBlbnRpdHkucmVnaXN0ZXJUYWJsZVNwZWNzKCk7XG4gICAgdGhpcy5lbnRpdGllcy5zZXQoanNvbi5pZCwgZW50aXR5KTtcbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlQWxsUmVnaXN0ZXJlZFNlYXJjaFRleHRKc29uU291cmNlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiB0aGlzLmVudGl0aWVzLnZhbHVlcygpKSB7XG4gICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlU2VhcmNoVGV4dEpzb25Tb3VyY2VzKGVudGl0eSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVNlYXJjaFRleHRKc29uU291cmNlcyhlbnRpdHk6IEVudGl0eSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByb3BzQnlOYW1lID0gbmV3IE1hcChlbnRpdHkucHJvcHMubWFwKChwcm9wKSA9PiBbcHJvcC5uYW1lLCBwcm9wXSkpO1xuXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIGVudGl0eS5wcm9wcykge1xuICAgICAgaWYgKCFpc1NlYXJjaFRleHRQcm9wKHByb3ApKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBwcm9wLnNvdXJjZUNvbHVtbnMpIHtcbiAgICAgICAgY29uc3Qgc291cmNlUHJvcCA9IHByb3BzQnlOYW1lLmdldChzb3VyY2UubmFtZSk7XG4gICAgICAgIGlmICghc291cmNlUHJvcCB8fCBzb3VyY2VQcm9wLnR5cGUgIT09IFwianNvblwiKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB6b2RUeXBlID0gYXdhaXQgdGhpcy5yZXNvbHZlU2VhcmNoVGV4dEpzb25Tb3VyY2VUeXBlKGVudGl0eSwgc291cmNlUHJvcC5pZCk7XG4gICAgICAgIGlmICghem9kVHlwZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBzZWFyY2hUZXh0IHNvdXJjZSBcIiR7c291cmNlLm5hbWV9XCLsnZgganNvbiDtg4DsnoUgXCIke3NvdXJjZVByb3AuaWR9XCLsnYQo66W8KSDroZzrk5ztlaAg7IiYIOyXhuyKteuLiOuLpC5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzU2VhcmNoVGV4dEpzb25Tb3VyY2Vab2RUeXBlKHpvZFR5cGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHNlYXJjaFRleHQgc291cmNlIFwiJHtzb3VyY2UubmFtZX1cIuydmCBqc29uIO2DgOyehSBcIiR7c291cmNlUHJvcC5pZH1cIuydgCjripQpIHVud3JhcCDtm4Qgei5hcnJheSh6LnN0cmluZygpKSDsnbTslrTslbwg7ZWp64uI64ukLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVNlYXJjaFRleHRKc29uU291cmNlVHlwZShcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICB0eXBlSWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx6LlpvZFR5cGVBbnkgfCBudWxsPiB7XG4gICAgY29uc3QgbG9jYWxUeXBlID0gZW50aXR5LnR5cGVzW3R5cGVJZF07XG4gICAgaWYgKGxvY2FsVHlwZSBpbnN0YW5jZW9mIHouWm9kVHlwZSkge1xuICAgICAgcmV0dXJuIGxvY2FsVHlwZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlZ2lzdGVyZWRFbnRpdHkgb2YgdGhpcy5lbnRpdGllcy52YWx1ZXMoKSkge1xuICAgICAgY29uc3QgcmVnaXN0ZXJlZFR5cGUgPSByZWdpc3RlcmVkRW50aXR5LnR5cGVzW3R5cGVJZF07XG4gICAgICBpZiAocmVnaXN0ZXJlZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVyZWRUeXBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlSWQgPT09IFwiU29uYW11RmlsZVwiKSB7XG4gICAgICByZXR1cm4gU29uYW11RmlsZVNjaGVtYTtcbiAgICB9XG4gICAgaWYgKHR5cGVJZCA9PT0gXCJTb25hbXVGaWxlW11cIikge1xuICAgICAgcmV0dXJuIFNvbmFtdUZpbGVBcnJheVNjaGVtYTtcbiAgICB9XG5cbiAgICBjb25zdCBtb2R1bGVQYXRoID0gdGhpcy5tb2R1bGVQYXRocy5nZXQodHlwZUlkKTtcbiAgICBpZiAoIW1vZHVsZVBhdGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZHVsZUZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgcnVudGltZVBhdGgoYGRpc3QvYXBwbGljYXRpb24vJHttb2R1bGVQYXRofS5qc2ApLFxuICAgICk7XG4gICAgY29uc3QgaW1wb3J0ZWRNZW1iZXJzID0gYXdhaXQgaW1wb3J0TWVtYmVyczx1bmtub3duPihtb2R1bGVGaWxlUGF0aCk7XG4gICAgY29uc3QgbWF0Y2hlZCA9IGltcG9ydGVkTWVtYmVycy5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gdHlwZUlkKTtcbiAgICBpZiAoIW1hdGNoZWQgfHwgIShtYXRjaGVkLnZhbHVlIGluc3RhbmNlb2Ygei5ab2RUeXBlKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoZWQudmFsdWU7XG4gIH1cblxuICBnZXQoZW50aXR5SWQ6IHN0cmluZyk6IEVudGl0eSB7XG4gICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdGllcy5nZXQoZW50aXR5SWQpO1xuICAgIGlmIChlbnRpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIEVudGl0eSDsmpTssq0gJHtlbnRpdHlJZH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50aXR5O1xuICB9XG5cbiAgZ2V0QnlUYWJsZSh0YWJsZTogc3RyaW5nKTogRW50aXR5IHtcbiAgICBjb25zdCBlbnRpdHkgPSBBcnJheS5mcm9tKHRoaXMuZW50aXRpZXMudmFsdWVzKCkpLmZpbmQoKGVudGl0eSkgPT4gZW50aXR5LnRhYmxlID09PSB0YWJsZSk7XG4gICAgaWYgKGVudGl0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgRW50aXR5IOyalOyyrSAke3RhYmxlfWApO1xuICAgIH1cblxuICAgIHJldHVybiBlbnRpdHk7XG4gIH1cblxuICBleGlzdHMoZW50aXR5SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXRpZXMuZ2V0KGVudGl0eUlkKTtcbiAgICByZXR1cm4gZW50aXR5ICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRBbGxJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKEVudGl0eU1hbmFnZXIuZW50aXRpZXMua2V5cygpKS50b1NvcnRlZCgpO1xuICB9XG5cbiAgZ2V0QWxsRW50aXRpZXMoKTogRW50aXR5W10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50aXRpZXMudmFsdWVzKCkpO1xuICB9XG5cbiAgZ2V0QWxsUGFyZW50SWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGxJZHMoKS5maWx0ZXIoKGVudGl0eUlkKSA9PiB7XG4gICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmdldChlbnRpdHlJZCk7XG4gICAgICByZXR1cm4gZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDaGlsZHJlbklkcyhwYXJlbnRJZDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmdldEFsbElkcygpLmZpbHRlcigoZW50aXR5SWQpID0+IHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZ2V0KGVudGl0eUlkKTtcbiAgICAgIHJldHVybiBlbnRpdHkucGFyZW50SWQgPT09IHBhcmVudElkO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0TW9kdWxlUGF0aChrZXk6IHN0cmluZywgbW9kdWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gY29uc29sZS5kZWJ1ZyhjaGFsay5jeWFuKGBzZXRNb2R1bGVQYXRoIDo6ICR7a2V5fSA6OiAke21vZHVsZVBhdGh9YCkpO1xuICAgIHRoaXMubW9kdWxlUGF0aHMuc2V0KGtleSwgbW9kdWxlUGF0aCk7XG4gIH1cblxuICBnZXRNb2R1bGVQYXRoKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtb2R1bGVQYXRoID0gdGhpcy5tb2R1bGVQYXRocy5nZXQoa2V5KTtcbiAgICBpZiAobW9kdWxlUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQg66qo65OIIO2MqOyKpCDsmpTssq0gJHtrZXl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZHVsZVBhdGg7XG4gIH1cblxuICBzZXRUYWJsZVNwZWModGFibGVTcGVjOiBUYWJsZVNwZWMpIHtcbiAgICB0aGlzLnRhYmxlU3BlY3Muc2V0KHRhYmxlU3BlYy5uYW1lLCB0YWJsZVNwZWMpO1xuICB9XG5cbiAgZ2V0VGFibGVTcGVjKGtleTogc3RyaW5nKTogVGFibGVTcGVjIHtcbiAgICBjb25zdCB0YWJsZVNwZWMgPSB0aGlzLnRhYmxlU3BlY3MuZ2V0KGtleSk7XG4gICAgaWYgKHRhYmxlU3BlYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQg7YWM7J2067iUIOyKpO2OmSDsmpTssq0gJHtrZXl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlU3BlYztcbiAgfVxuXG4gIGdldE5hbWVzRnJvbUlkKGVudGl0eUlkOiBzdHJpbmcpOiBFbnRpdHlOYW1lc1JlY29yZCB7XG4gICAgLy8gZW50aXR5SWTqsIAg64uo67O17IiYIOuPme2YlSDri6jslrTsnbgg6rK97JqwIExpc3Qg67aZ7Jes7IScIOyDneyEsVxuICAgIGNvbnN0IHBsdXJhbGl6ZWQgPVxuICAgICAgaW5mbGVjdGlvbi5wbHVyYWxpemUoZW50aXR5SWQpID09PSBlbnRpdHlJZFxuICAgICAgICA/IGAke2VudGl0eUlkfUxpc3RgXG4gICAgICAgIDogaW5mbGVjdGlvbi5wbHVyYWxpemUoZW50aXR5SWQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoZW50aXR5SWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgZnNQbHVyYWw6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShwbHVyYWxpemVkKSkudG9Mb3dlckNhc2UoKSxcbiAgICAgIGNhbWVsOiBpbmZsZWN0aW9uLmNhbWVsaXplKGVudGl0eUlkLCB0cnVlKSxcbiAgICAgIGNhbWVsUGx1cmFsOiBpbmZsZWN0aW9uLmNhbWVsaXplKHBsdXJhbGl6ZWQsIHRydWUpLFxuICAgICAgY2FwaXRhbDogZW50aXR5SWQsXG4gICAgICBjYXBpdGFsUGx1cmFsOiBwbHVyYWxpemVkLFxuICAgICAgdXBwZXI6IGVudGl0eUlkLnRvVXBwZXJDYXNlKCksXG4gICAgICBjb25zdGFudDogaW5mbGVjdGlvbi51bmRlcnNjb3JlKGVudGl0eUlkKS50b1VwcGVyQ2FzZSgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRW50aXR5SWTripQgTW9kZWzsnYQg7KCc7Jm47ZWcIFBhc2NhbENhc2Ug7J2066aE7J6F64uI64ukLiAoZXguIFwiVXNlclwiKVxuICAgKiBAcGFyYW0gZmlsZVBhdGhcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldEVudGl0eUlkRnJvbVBhdGgoZmlsZVBhdGg6IEFic29sdXRlUGF0aCk6IHN0cmluZyB7XG4gICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKTtcbiAgICBjb25zdCBzdXBwb3J0ZWRTdWZmaXhlcyA9IFtcIi5tb2RlbC50c1wiLCBcIi5tb2RlbC5qc1wiLCBcIi5lbnRpdHkuanNvblwiLCBcIi5mcmFtZS50c1wiLCBcIi5mcmFtZS5qc1wiXTtcbiAgICBjb25zdCBtYXRjaGVkU3VmZml4ID0gc3VwcG9ydGVkU3VmZml4ZXMuZmluZCgoc3VmZml4KSA9PiBmaWxlTmFtZS5lbmRzV2l0aChzdWZmaXgpKTtcblxuICAgIGFzc2VydChtYXRjaGVkU3VmZml4LCBg7KeA7JuQ7ZWY7KeAIOyViuuKlCBlbnRpdHkg6rK966Gc7J6F64uI64ukOiAke2ZpbGVQYXRofWApO1xuXG4gICAgY29uc3QgZW50aXR5QmFzZU5hbWUgPSBmaWxlTmFtZS5zbGljZSgwLCAtbWF0Y2hlZFN1ZmZpeC5sZW5ndGgpO1xuICAgIGFzc2VydChlbnRpdHlCYXNlTmFtZS5sZW5ndGggPiAwLCBgRW50aXR5SWTrpbwg6rOE7IKw7ZWgIOyImCDsl4bripQg6rK966Gc7J6F64uI64ukOiAke2ZpbGVQYXRofWApO1xuXG4gICAgcmV0dXJuIGluZmxlY3Rpb24uY2FtZWxpemUoZW50aXR5QmFzZU5hbWUucmVwbGFjZSgvLS9nLCBcIl9cIikpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3Rlck5vbkVudGl0eVR5cGVNb2R1bGVQYXRocygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0eXBlUGF0aHNQYXR0ZXJucyA9IFtcbiAgICAgIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIHJ1bnRpbWVQYXRoKFwic3JjL2FwcGxpY2F0aW9uLyoqLyoudHlwZXMudHNcIikpLFxuICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgcnVudGltZVBhdGgoXCJzcmMvYXBwbGljYXRpb24vKiovKi5nZW5lcmF0ZWQudHNcIikpLFxuICAgIF07XG4gICAgY29uc3QgdHlwZVBhdGhzID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodHlwZVBhdGhzUGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiBnbG9iQXN5bmMocGF0dGVybikpKVxuICAgICkuZmxhdCgpO1xuXG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiB0eXBlUGF0aHMpIHtcbiAgICAgIGNvbnN0IG1vZHVsZVBhdGggPSB0aGlzLmdldE1vZHVsZVBhdGhGcm9tVHlwZUZpbGVQYXRoKGZpbGVQYXRoKTtcbiAgICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8dW5rbm93bj4oZmlsZVBhdGgpO1xuICAgICAgZm9yIChjb25zdCB7IG5hbWUsIHZhbHVlIH0gb2YgaW1wb3J0ZWRNZW1iZXJzKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIHouWm9kVHlwZSkge1xuICAgICAgICAgIHRoaXMuc2V0TW9kdWxlUGF0aChuYW1lLCBtb2R1bGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TW9kdWxlUGF0aEZyb21UeXBlRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBmaWxlUGF0aC5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIik7XG4gICAgY29uc3QgbWF0Y2hlZCA9IG5vcm1hbGl6ZWRQYXRoLm1hdGNoKC9cXC8oPzpzcmN8ZGlzdClcXC9hcHBsaWNhdGlvblxcLyguKylcXC4oPzp0c3xqcykkLyk7XG5cbiAgICBpZiAoIW1hdGNoZWQ/LlsxXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7J287J2YIOuqqOuTiCDqsr3roZzrpbwg6rOE7IKw7ZWgIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoZWRbMV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEVudGl0eU1hbmFnZXIgPSBuZXcgRW50aXR5TWFuYWdlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Y0FRdUM7YUFPZjttQkFFeUI7aUJBQ0U7a0JBRUQ7Q0FZNUMscUJBQU4sTUFBeUI7RUFDdkIsQUFBUSxXQUFnQyxJQUFJLEtBQUs7RUFDakQsQUFBTyxjQUFtQyxJQUFJLEtBQUs7RUFDbkQsQUFBUSxhQUFxQyxJQUFJLEtBQUs7RUFDdEQsQUFBTyxlQUF3QjtFQUcvQixNQUFNLFNBQVMsSUFBYSxPQUFPO0FBQ2pDLE9BQUksS0FBSyxjQUFjO0FBQ3JCOztHQUVGLE1BQU0sY0FBYyxLQUFLLEtBQUssT0FBTyxhQUFhLG9DQUFvQztBQUV0RixjQUFXLE1BQU0sUUFBUSxLQUFLLEtBQUssUUFBUSxZQUFZLENBQUMsRUFBRTtJQUN4RCxNQUFNLE9BQU8sS0FBSyxPQUFPLE1BQU0sU0FBUyxLQUFLLEVBQUUsVUFBVSxDQUFDO0lBRzFELE1BQU0sUUFBUSxLQUFLLGVB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
|
|
190
|
+
|
|
191
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LW1hbmFnZXIuanMiLCJuYW1lcyI6WyJ6Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VudGl0eS9lbnRpdHktbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IGdsb2IsIHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgcHJldHRpZnlFcnJvciwgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7XG4gIEVudGl0eUpzb25TY2hlbWEsXG4gIGlzU2VhcmNoVGV4dEpzb25Tb3VyY2Vab2RUeXBlLFxuICBpc1NlYXJjaFRleHRQcm9wLFxuICBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gIFNvbmFtdUZpbGVTY2hlbWEsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlJbmRleCwgdHlwZSBFbnRpdHlKc29uIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBnbG9iQXN5bmMgfSBmcm9tIFwiLi4vdXRpbHMvYXN5bmMtdXRpbHNcIjtcbmltcG9ydCB7IGltcG9ydE1lbWJlcnMgfSBmcm9tIFwiLi4vdXRpbHMvZXNtLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBydW50aW1lUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eSB9IGZyb20gXCIuL2VudGl0eVwiO1xuXG5leHBvcnQgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCA9IFJlY29yZDxcbiAgXCJmc1wiIHwgXCJmc1BsdXJhbFwiIHwgXCJjYW1lbFwiIHwgXCJjYW1lbFBsdXJhbFwiIHwgXCJjYXBpdGFsXCIgfCBcImNhcGl0YWxQbHVyYWxcIiB8IFwidXBwZXJcIiB8IFwiY29uc3RhbnRcIixcbiAgc3RyaW5nXG4+O1xuZXhwb3J0IHR5cGUgVGFibGVTcGVjID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHVuaXF1ZUluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIGpzb25Db2x1bW5zOiBzdHJpbmdbXTtcbn07XG5jbGFzcyBFbnRpdHlNYW5hZ2VyQ2xhc3Mge1xuICBwcml2YXRlIGVudGl0aWVzOiBNYXA8c3RyaW5nLCBFbnRpdHk+ID0gbmV3IE1hcCgpO1xuICBwdWJsaWMgbW9kdWxlUGF0aHM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgdGFibGVTcGVjczogTWFwPHN0cmluZywgVGFibGVTcGVjPiA9IG5ldyBNYXAoKTtcbiAgcHVibGljIGlzQXV0b2xvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIOqyveuhnCDsoITri6zrsJvslYQg66qo65OgIGVudGl0eS5qc29uIO2MjOydvCDroZzrk5xcbiAgYXN5bmMgYXV0b2xvYWQoXzogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuaXNBdXRvbG9hZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhdGhQYXR0ZXJuID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCIvc3JjL2FwcGxpY2F0aW9uLyoqLyouZW50aXR5Lmpzb25cIik7XG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGZpbGUgb2YgZ2xvYihwYXRoLnJlc29sdmUocGF0aFBhdHRlcm4pKSkge1xuICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoKGF3YWl0IHJlYWRGaWxlKGZpbGUpKS50b1N0cmluZygpKTtcblxuICAgICAgLy8gZW50aXR5Lmpzb24g7Iqk7YKk66eIIOqygOymnVxuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLnNjaGVtYVZhbGlkYXRlKGpzb24pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBmaWxlKTtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gcHJldHRpZnlFcnJvcihlcnJvcik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKGBJbnZhbGlkIGVudGl0eS5qc29uIHNjaGVtYTogJHtyZWxhdGl2ZVBhdGh9XFxuJHtjaGFsay55ZWxsb3coZXJyb3JNZXNzYWdlKX1gKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5yZWdpc3Rlcihqc29uLCB7IGRlZmVyU2VhcmNoVGV4dEpzb25Tb3VyY2VWYWxpZGF0aW9uOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJOb25FbnRpdHlUeXBlTW9kdWxlUGF0aHMoKTtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQWxsUmVnaXN0ZXJlZFNlYXJjaFRleHRKc29uU291cmNlcygpO1xuXG4gICAgdGhpcy5pc0F1dG9sb2FkZWQgPSB0cnVlO1xuICB9XG5cbiAgc2NoZW1hVmFsaWRhdGUoanNvbjogdW5rbm93bikge1xuICAgIGNvbnN0IHJlc3VsdCA9IEVudGl0eUpzb25TY2hlbWEuc2FmZVBhcnNlKGpzb24pO1xuICAgIHJldHVybiByZXN1bHQuc3VjY2VzcyA/IG51bGwgOiByZXN1bHQuZXJyb3I7XG4gIH1cblxuICBhc3luYyByZWxvYWQoZG9TaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuZW50aXRpZXMuY2xlYXIoKTtcbiAgICB0aGlzLm1vZHVsZVBhdGhzLmNsZWFyKCk7XG4gICAgdGhpcy50YWJsZVNwZWNzLmNsZWFyKCk7XG4gICAgdGhpcy5pc0F1dG9sb2FkZWQgPSBmYWxzZTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmF1dG9sb2FkKGRvU2lsZW50KTtcbiAgfVxuXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIGpzb246IEVudGl0eUpzb24sXG4gICAgb3B0aW9uczogeyBkZWZlclNlYXJjaFRleHRKc29uU291cmNlVmFsaWRhdGlvbj86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IEVudGl0eSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9lbnRpdHlcIik7XG4gICAgY29uc3QgZW50aXR5ID0gbmV3IEVudGl0eShqc29uKTtcbiAgICBhd2FpdCBlbnRpdHkucmVnaXN0ZXJNb2R1bGVQYXRocygpO1xuICAgIGlmICghb3B0aW9ucy5kZWZlclNlYXJjaFRleHRKc29uU291cmNlVmFsaWRhdGlvbikge1xuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZVNlYXJjaFRleHRKc29uU291cmNlcyhlbnRpdHkpO1xuICAgIH1cbiAgICBlbnRpdHkucmVnaXN0ZXJUYWJsZVNwZWNzKCk7XG4gICAgdGhpcy5lbnRpdGllcy5zZXQoanNvbi5pZCwgZW50aXR5KTtcbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlQWxsUmVnaXN0ZXJlZFNlYXJjaFRleHRKc29uU291cmNlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiB0aGlzLmVudGl0aWVzLnZhbHVlcygpKSB7XG4gICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlU2VhcmNoVGV4dEpzb25Tb3VyY2VzKGVudGl0eSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVNlYXJjaFRleHRKc29uU291cmNlcyhlbnRpdHk6IEVudGl0eSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByb3BzQnlOYW1lID0gbmV3IE1hcChlbnRpdHkucHJvcHMubWFwKChwcm9wKSA9PiBbcHJvcC5uYW1lLCBwcm9wXSkpO1xuXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIGVudGl0eS5wcm9wcykge1xuICAgICAgaWYgKCFpc1NlYXJjaFRleHRQcm9wKHByb3ApKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBwcm9wLnNvdXJjZUNvbHVtbnMpIHtcbiAgICAgICAgY29uc3Qgc291cmNlUHJvcCA9IHByb3BzQnlOYW1lLmdldChzb3VyY2UubmFtZSk7XG4gICAgICAgIGlmICghc291cmNlUHJvcCB8fCBzb3VyY2VQcm9wLnR5cGUgIT09IFwianNvblwiKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB6b2RUeXBlID0gYXdhaXQgdGhpcy5yZXNvbHZlU2VhcmNoVGV4dEpzb25Tb3VyY2VUeXBlKGVudGl0eSwgc291cmNlUHJvcC5pZCk7XG4gICAgICAgIGlmICghem9kVHlwZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBzZWFyY2hUZXh0IHNvdXJjZSBcIiR7c291cmNlLm5hbWV9XCLsnZgganNvbiDtg4DsnoUgXCIke3NvdXJjZVByb3AuaWR9XCLsnYQo66W8KSDroZzrk5ztlaAg7IiYIOyXhuyKteuLiOuLpC5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzU2VhcmNoVGV4dEpzb25Tb3VyY2Vab2RUeXBlKHpvZFR5cGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHNlYXJjaFRleHQgc291cmNlIFwiJHtzb3VyY2UubmFtZX1cIuydmCBqc29uIO2DgOyehSBcIiR7c291cmNlUHJvcC5pZH1cIuydgCjripQpIHVud3JhcCDtm4Qgei5hcnJheSh6LnN0cmluZygpKSDsnbTslrTslbwg7ZWp64uI64ukLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVNlYXJjaFRleHRKc29uU291cmNlVHlwZShcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICB0eXBlSWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx6LlpvZFR5cGVBbnkgfCBudWxsPiB7XG4gICAgY29uc3QgbG9jYWxUeXBlID0gZW50aXR5LnR5cGVzW3R5cGVJZF07XG4gICAgaWYgKGxvY2FsVHlwZSBpbnN0YW5jZW9mIHouWm9kVHlwZSkge1xuICAgICAgcmV0dXJuIGxvY2FsVHlwZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlZ2lzdGVyZWRFbnRpdHkgb2YgdGhpcy5lbnRpdGllcy52YWx1ZXMoKSkge1xuICAgICAgY29uc3QgcmVnaXN0ZXJlZFR5cGUgPSByZWdpc3RlcmVkRW50aXR5LnR5cGVzW3R5cGVJZF07XG4gICAgICBpZiAocmVnaXN0ZXJlZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVyZWRUeXBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlSWQgPT09IFwiU29uYW11RmlsZVwiKSB7XG4gICAgICByZXR1cm4gU29uYW11RmlsZVNjaGVtYTtcbiAgICB9XG4gICAgaWYgKHR5cGVJZCA9PT0gXCJTb25hbXVGaWxlW11cIikge1xuICAgICAgcmV0dXJuIFNvbmFtdUZpbGVBcnJheVNjaGVtYTtcbiAgICB9XG5cbiAgICBjb25zdCBtb2R1bGVQYXRoID0gdGhpcy5tb2R1bGVQYXRocy5nZXQodHlwZUlkKTtcbiAgICBpZiAoIW1vZHVsZVBhdGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZHVsZUZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgcnVudGltZVBhdGgoYGRpc3QvYXBwbGljYXRpb24vJHttb2R1bGVQYXRofS5qc2ApLFxuICAgICk7XG4gICAgY29uc3QgaW1wb3J0ZWRNZW1iZXJzID0gYXdhaXQgaW1wb3J0TWVtYmVyczx1bmtub3duPihtb2R1bGVGaWxlUGF0aCk7XG4gICAgY29uc3QgbWF0Y2hlZCA9IGltcG9ydGVkTWVtYmVycy5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gdHlwZUlkKTtcbiAgICBpZiAoIW1hdGNoZWQgfHwgIShtYXRjaGVkLnZhbHVlIGluc3RhbmNlb2Ygei5ab2RUeXBlKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoZWQudmFsdWU7XG4gIH1cblxuICBnZXQoZW50aXR5SWQ6IHN0cmluZyk6IEVudGl0eSB7XG4gICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdGllcy5nZXQoZW50aXR5SWQpO1xuICAgIGlmIChlbnRpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIEVudGl0eSDsmpTssq0gJHtlbnRpdHlJZH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50aXR5O1xuICB9XG5cbiAgZ2V0QnlUYWJsZSh0YWJsZTogc3RyaW5nKTogRW50aXR5IHtcbiAgICBjb25zdCBlbnRpdHkgPSBBcnJheS5mcm9tKHRoaXMuZW50aXRpZXMudmFsdWVzKCkpLmZpbmQoKGVudGl0eSkgPT4gZW50aXR5LnRhYmxlID09PSB0YWJsZSk7XG4gICAgaWYgKGVudGl0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgRW50aXR5IOyalOyyrSAke3RhYmxlfWApO1xuICAgIH1cblxuICAgIHJldHVybiBlbnRpdHk7XG4gIH1cblxuICBleGlzdHMoZW50aXR5SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXRpZXMuZ2V0KGVudGl0eUlkKTtcbiAgICByZXR1cm4gZW50aXR5ICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRBbGxJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKEVudGl0eU1hbmFnZXIuZW50aXRpZXMua2V5cygpKS50b1NvcnRlZCgpO1xuICB9XG5cbiAgZ2V0QWxsRW50aXRpZXMoKTogRW50aXR5W10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50aXRpZXMudmFsdWVzKCkpO1xuICB9XG5cbiAgZ2V0QWxsUGFyZW50SWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGxJZHMoKS5maWx0ZXIoKGVudGl0eUlkKSA9PiB7XG4gICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmdldChlbnRpdHlJZCk7XG4gICAgICByZXR1cm4gZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDaGlsZHJlbklkcyhwYXJlbnRJZDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmdldEFsbElkcygpLmZpbHRlcigoZW50aXR5SWQpID0+IHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZ2V0KGVudGl0eUlkKTtcbiAgICAgIHJldHVybiBlbnRpdHkucGFyZW50SWQgPT09IHBhcmVudElkO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0TW9kdWxlUGF0aChrZXk6IHN0cmluZywgbW9kdWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gY29uc29sZS5kZWJ1ZyhjaGFsay5jeWFuKGBzZXRNb2R1bGVQYXRoIDo6ICR7a2V5fSA6OiAke21vZHVsZVBhdGh9YCkpO1xuICAgIHRoaXMubW9kdWxlUGF0aHMuc2V0KGtleSwgbW9kdWxlUGF0aCk7XG4gIH1cblxuICBnZXRNb2R1bGVQYXRoKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtb2R1bGVQYXRoID0gdGhpcy5tb2R1bGVQYXRocy5nZXQoa2V5KTtcbiAgICBpZiAobW9kdWxlUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQg66qo65OIIO2MqOyKpCDsmpTssq0gJHtrZXl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZHVsZVBhdGg7XG4gIH1cblxuICBzZXRUYWJsZVNwZWModGFibGVTcGVjOiBUYWJsZVNwZWMpIHtcbiAgICB0aGlzLnRhYmxlU3BlY3Muc2V0KHRhYmxlU3BlYy5uYW1lLCB0YWJsZVNwZWMpO1xuICB9XG5cbiAgZ2V0VGFibGVTcGVjKGtleTogc3RyaW5nKTogVGFibGVTcGVjIHtcbiAgICBjb25zdCB0YWJsZVNwZWMgPSB0aGlzLnRhYmxlU3BlY3MuZ2V0KGtleSk7XG4gICAgaWYgKHRhYmxlU3BlYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQg7YWM7J2067iUIOyKpO2OmSDsmpTssq0gJHtrZXl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlU3BlYztcbiAgfVxuXG4gIGdldE5hbWVzRnJvbUlkKGVudGl0eUlkOiBzdHJpbmcpOiBFbnRpdHlOYW1lc1JlY29yZCB7XG4gICAgLy8gZW50aXR5SWTqsIAg64uo67O17IiYIOuPme2YlSDri6jslrTsnbgg6rK97JqwIExpc3Qg67aZ7Jes7IScIOyDneyEsVxuICAgIGNvbnN0IHBsdXJhbGl6ZWQgPVxuICAgICAgaW5mbGVjdGlvbi5wbHVyYWxpemUoZW50aXR5SWQpID09PSBlbnRpdHlJZFxuICAgICAgICA/IGAke2VudGl0eUlkfUxpc3RgXG4gICAgICAgIDogaW5mbGVjdGlvbi5wbHVyYWxpemUoZW50aXR5SWQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoZW50aXR5SWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgZnNQbHVyYWw6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShwbHVyYWxpemVkKSkudG9Mb3dlckNhc2UoKSxcbiAgICAgIGNhbWVsOiBpbmZsZWN0aW9uLmNhbWVsaXplKGVudGl0eUlkLCB0cnVlKSxcbiAgICAgIGNhbWVsUGx1cmFsOiBpbmZsZWN0aW9uLmNhbWVsaXplKHBsdXJhbGl6ZWQsIHRydWUpLFxuICAgICAgY2FwaXRhbDogZW50aXR5SWQsXG4gICAgICBjYXBpdGFsUGx1cmFsOiBwbHVyYWxpemVkLFxuICAgICAgdXBwZXI6IGVudGl0eUlkLnRvVXBwZXJDYXNlKCksXG4gICAgICBjb25zdGFudDogaW5mbGVjdGlvbi51bmRlcnNjb3JlKGVudGl0eUlkKS50b1VwcGVyQ2FzZSgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRW50aXR5SWTripQgTW9kZWzsnYQg7KCc7Jm47ZWcIFBhc2NhbENhc2Ug7J2066aE7J6F64uI64ukLiAoZXguIFwiVXNlclwiKVxuICAgKiBAcGFyYW0gZmlsZVBhdGhcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldEVudGl0eUlkRnJvbVBhdGgoZmlsZVBhdGg6IEFic29sdXRlUGF0aCk6IHN0cmluZyB7XG4gICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKTtcbiAgICBjb25zdCBzdXBwb3J0ZWRTdWZmaXhlcyA9IFtcIi5tb2RlbC50c1wiLCBcIi5tb2RlbC5qc1wiLCBcIi5lbnRpdHkuanNvblwiLCBcIi5mcmFtZS50c1wiLCBcIi5mcmFtZS5qc1wiXTtcbiAgICBjb25zdCBtYXRjaGVkU3VmZml4ID0gc3VwcG9ydGVkU3VmZml4ZXMuZmluZCgoc3VmZml4KSA9PiBmaWxlTmFtZS5lbmRzV2l0aChzdWZmaXgpKTtcblxuICAgIGFzc2VydChtYXRjaGVkU3VmZml4LCBg7KeA7JuQ7ZWY7KeAIOyViuuKlCBlbnRpdHkg6rK966Gc7J6F64uI64ukOiAke2ZpbGVQYXRofWApO1xuXG4gICAgY29uc3QgZW50aXR5QmFzZU5hbWUgPSBmaWxlTmFtZS5zbGljZSgwLCAtbWF0Y2hlZFN1ZmZpeC5sZW5ndGgpO1xuICAgIGFzc2VydChlbnRpdHlCYXNlTmFtZS5sZW5ndGggPiAwLCBgRW50aXR5SWTrpbwg6rOE7IKw7ZWgIOyImCDsl4bripQg6rK966Gc7J6F64uI64ukOiAke2ZpbGVQYXRofWApO1xuXG4gICAgcmV0dXJuIGluZmxlY3Rpb24uY2FtZWxpemUoZW50aXR5QmFzZU5hbWUucmVwbGFjZSgvLS9nLCBcIl9cIikpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3Rlck5vbkVudGl0eVR5cGVNb2R1bGVQYXRocygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0eXBlUGF0aHNQYXR0ZXJucyA9IFtcbiAgICAgIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIHJ1bnRpbWVQYXRoKFwic3JjL2FwcGxpY2F0aW9uLyoqLyoudHlwZXMudHNcIikpLFxuICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgcnVudGltZVBhdGgoXCJzcmMvYXBwbGljYXRpb24vKiovKi5nZW5lcmF0ZWQudHNcIikpLFxuICAgIF07XG4gICAgY29uc3QgdHlwZVBhdGhzID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodHlwZVBhdGhzUGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiBnbG9iQXN5bmMocGF0dGVybikpKVxuICAgICkuZmxhdCgpO1xuXG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiB0eXBlUGF0aHMpIHtcbiAgICAgIGNvbnN0IG1vZHVsZVBhdGggPSB0aGlzLmdldE1vZHVsZVBhdGhGcm9tVHlwZUZpbGVQYXRoKGZpbGVQYXRoKTtcbiAgICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8dW5rbm93bj4oZmlsZVBhdGgpO1xuICAgICAgZm9yIChjb25zdCB7IG5hbWUsIHZhbHVlIH0gb2YgaW1wb3J0ZWRNZW1iZXJzKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIHouWm9kVHlwZSkge1xuICAgICAgICAgIHRoaXMuc2V0TW9kdWxlUGF0aChuYW1lLCBtb2R1bGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TW9kdWxlUGF0aEZyb21UeXBlRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBmaWxlUGF0aC5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIik7XG4gICAgY29uc3QgbWF0Y2hlZCA9IG5vcm1hbGl6ZWRQYXRoLm1hdGNoKC9cXC8oPzpzcmN8ZGlzdClcXC9hcHBsaWNhdGlvblxcLyguKylcXC4oPzp0c3xqcykkLyk7XG5cbiAgICBpZiAoIW1hdGNoZWQ/LlsxXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7J287J2YIOuqqOuTiCDqsr3roZzrpbwg6rOE7IKw7ZWgIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoZWRbMV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEVudGl0eU1hbmFnZXIgPSBuZXcgRW50aXR5TWFuYWdlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OzthQVFzQztZQU9mO2tCQUV5QjtnQkFDRTtpQkFFRDtDQVkzQyxxQkFBTixNQUF5QjtFQUN2QiwyQkFBd0MsSUFBSSxJQUFJO0VBQ2hELDhCQUEwQyxJQUFJLElBQUk7RUFDbEQsNkJBQTZDLElBQUksSUFBSTtFQUNyRCxlQUErQjtFQUcvQixNQUFNLFNBQVMsSUFBYSxPQUFPO0dBQ2pDLElBQUksS0FBSyxjQUNQO0dBRUYsTUFBTSxjQUFjLEtBQUssS0FBSyxPQUFPLGFBQWEsbUNBQW1DO0dBRXJGLFdBQVcsTUFBTSxRQUFRLEtBQUssS0FBSyxRQUFRLFdBQVcsQ0FBQyxHQUFHO0lBQ3hELE1BQU0sT0FBTyxLQUFLLE9BQU8sTUFBTSxTQUFTLElBQUksRUFBQSxDQUFHLFNBQVMsQ0FBQztJQUd6RCxNQUFNLFFBQVEsS0FBSyxlQUFlLElBQUk7SUFDdEMsSUFBSSxPQUFPO0tBQ1QsTUFBTSxlQUFlLEtBQUssU0FBUyxPQUFPLGFBQWEsSUFBSTtLQUMzRCxNQUFNLGVBQWUsY0FBYyxLQUFLO0tBQ3hDLFFBQVEsTUFDTixNQUFNLElBQUksK0JBQStCLGFBQWEsSUFBSSxNQUFNLE9BQU8sWUFBWSxHQUFHLENBQ3hGO0lBQ0Y7SUFFQSxNQUFNLEtBQUssU0FBUyxNQUFNLEVBQUUscUNBQXFDLEtBQUssQ0FBQztHQUN6RTtHQUVBLE1BQU0sS0FBSyxpQ0FBaUM7R0FDNUMsTUFBTSxLQUFLLDJDQUEyQztHQUV0RCxLQUFLLGVBQWU7RUFDdEI7RUFFQSxlQUFlLE1BQWU7R0FDNUIsTUFBTSxTQUFTLGlCQUFpQixVQUFVLElBQUk7R0FDOUMsT0FBTyxPQUFPLFVBQVUsT0FBTyxPQUFPO0VBQ3hDO0VBRUEsTUFBTSxPQUFPLFdBQW9CLE9BQU87R0FDdEMsS0FBSyxTQUFTLE1BQU07R0FDcEIsS0FBSyxZQUFZLE1BQU07R0FDdkIsS0FBSyxXQUFXLE1BQU07R0FDdEIsS0FBSyxlQUFlO0dBRXBCLE9BQU8sTUFBTSxLQUFLLFNBQVMsUUFBUTtFQUNyQztFQUVBLE1BQU0sU0FDSixNQUNBLFVBQTZELENBQUMsR0FDL0M7R0FDZixNQUFNLEVBQUUsV0FBVyxNQUFNLE9BQU87R0FDaEMsTUFBTSxTQUFTLElBQUksT0FBTyxJQUFJO0dBQzlCLE1BQU0sT0FBTyxvQkFBb0I7R0FDakMsSUFBSSxDQUFDLFFBQVEscUNBQ1gsTUFBTSxLQUFLLDhCQUE4QixNQUFNO0dBRWpELE9BQU8sbUJBQW1CO0dBQzFCLEtBQUssU0FBUyxJQUFJLEtBQUssSUFBSSxNQUFNO0VBQ25DO0VBRUEsTUFBTSw2Q0FBNEQ7R0FDaEUsS0FBSyxNQUFNLFVBQVUsS0FBSyxTQUFTLE9BQU8sR0FDeEMsTUFBTSxLQUFLLDhCQUE4QixNQUFNO0VBRW5EO0VBRUEsTUFBYyw4QkFBOEIsUUFBK0I7R0FDekUsTUFBTSxjQUFjLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxTQUFTLENBQUMsS0FBSyxNQUFNLElBQUksQ0FBQyxDQUFDO0dBRXpFLEtBQUssTUFBTSxRQUFRLE9BQU8sT0FBTztJQUMvQixJQUFJLENBQUMsaUJBQWlCLElBQUksR0FDeEI7SUFHRixLQUFLLE1BQU0sVUFBVSxLQUFLLGVBQWU7S0FDdkMsTUFBTSxhQUFhLFlBQVksSUFBSSxPQUFPLElBQUk7S0FDOUMsSUFBSSxDQUFDLGNBQWMsV0FBVyxTQUFTLFFBQ3JDO0tBR0YsTUFBTSxVQUFVLE1BQU0sS0FBSyxnQ0FBZ0MsUUFBUSxXQUFXLEVBQUU7S0FDaEYsSUFBSSxDQUFDLFNBQ0gsTUFBTSxJQUFJLE1BQ1Isc0JBQXNCLE9BQU8sS0FBSyxjQUFjLFdBQVcsR0FBRyxrQkFDaEU7S0FHRixJQUFJLENBQUMsOEJBQThCLE9BQU8sR0FDeEMsTUFBTSxJQUFJLE1BQ1Isc0JBQXNCLE9BQU8sS0FBSyxjQUFjLFdBQVcsR0FBRyw0Q0FDaEU7SUFFSjtHQUNGO0VBQ0Y7RUFFQSxNQUFjLGdDQUNaLFFBQ0EsUUFDOEI7R0FDOUIsTUFBTSxZQUFZLE9BQU8sTUFBTTtHQUMvQixJQUFJLHFCQUFxQkEsSUFBRSxTQUN6QixPQUFPO0dBR1QsS0FBSyxNQUFNLG9CQUFvQixLQUFLLFNBQVMsT0FBTyxHQUFHO0lBQ3JELE1BQU0saUJBQWlCLGlCQUFpQixNQUFNO0lBQzlDLElBQUksMEJBQTBCQSxJQUFFLFNBQzlCLE9BQU87R0FFWDtHQUVBLElBQUksV0FBVyxjQUNiLE9BQU87R0FFVCxJQUFJLFdBQVcsZ0JBQ2IsT0FBTztHQUdULE1BQU0sYUFBYSxLQUFLLFlBQVksSUFBSSxNQUFNO0dBQzlDLElBQUksQ0FBQyxZQUNILE9BQU87R0FRVCxNQUFNLFdBQVUsTUFEYyxjQUpQLEtBQUssS0FDMUIsT0FBTyxhQUNQLFlBQVksb0JBQW9CLFdBQVcsSUFBSSxDQUVJLENBQWMsRUFDbkQsQ0FBZ0IsTUFBTSxFQUFFLFdBQVcsU0FBUyxNQUFNO0dBQ2xFLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxpQkFBaUJBLElBQUUsVUFDM0MsT0FBTztHQUdULE9BQU8sUUFBUTtFQUNqQjtFQUVBLElBQUksVUFBMEI7R0FDNUIsTUFBTSxTQUFTLEtBQUssU0FBUyxJQUFJLFFBQVE7R0FDekMsSUFBSSxXQUFXLFFBQ2IsTUFBTSxJQUFJLE1BQU0scUJBQXFCLFVBQVU7R0FHakQsT0FBTztFQUNUO0VBRUEsV0FBVyxPQUF1QjtHQUNoQyxNQUFNLFNBQVMsTUFBTSxLQUFLLEtBQUssU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sV0FBVyxPQUFPLFVBQVUsS0FBSztHQUN6RixJQUFJLFdBQVcsUUFDYixNQUFNLElBQUksTUFBTSxxQkFBcUIsT0FBTztHQUc5QyxPQUFPO0VBQ1Q7RUFFQSxPQUFPLFVBQTJCO0dBRWhDLE9BRGUsS0FBSyxTQUFTLElBQUksUUFDMUIsTUFBVztFQUNwQjtFQUVBLFlBQXNCO0dBQ3BCLE9BQU8sTUFBTSxLQUFLLGNBQWMsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7RUFDNUQ7RUFFQSxpQkFBMkI7R0FDekIsT0FBTyxNQUFNLEtBQUssS0FBSyxTQUFTLE9BQU8sQ0FBQztFQUMxQztFQUVBLGtCQUE0QjtHQUMxQixPQUFPLEtBQUssVUFBVSxDQUFDLENBQUMsUUFBUSxhQUFhO0lBRTNDLE9BRGUsS0FBSyxJQUFJLFFBQ2pCLENBQUEsQ0FBTyxhQUFhO0dBQzdCLENBQUM7RUFDSDtFQUVBLGVBQWUsVUFBNEI7R0FDekMsT0FBTyxLQUFLLFVBQVUsQ0FBQyxDQUFDLFFBQVEsYUFBYTtJQUUzQyxPQURlLEtBQUssSUFBSSxRQUNqQixDQUFBLENBQU8sYUFBYTtHQUM3QixDQUFDO0VBQ0g7RUFFQSxjQUFjLEtBQWEsWUFBMEI7R0FFbkQsS0FBSyxZQUFZLElBQUksS0FBSyxVQUFVO0VBQ3RDO0VBRUEsY0FBYyxLQUFxQjtHQUNqQyxNQUFNLGFBQWEsS0FBSyxZQUFZLElBQUksR0FBRztHQUMzQyxJQUFJLGVBQWUsUUFDakIsTUFBTSxJQUFJLE1BQU0sb0JBQW9CLEtBQUs7R0FHM0MsT0FBTztFQUNUO0VBRUEsYUFBYSxXQUFzQjtHQUNqQyxLQUFLLFdBQVcsSUFBSSxVQUFVLE1BQU0sU0FBUztFQUMvQztFQUVBLGFBQWEsS0FBd0I7R0FDbkMsTUFBTSxZQUFZLEtBQUssV0FBVyxJQUFJLEdBQUc7R0FDekMsSUFBSSxjQUFjLFFBQ2hCLE1BQU0sSUFBSSxNQUFNLHFCQUFxQixLQUFLO0dBRzVDLE9BQU87RUFDVDtFQUVBLGVBQWUsVUFBcUM7R0FFbEQsTUFBTSxhQUNKLFdBQVcsVUFBVSxRQUFRLE1BQU0sV0FDL0IsR0FBRyxTQUFTLFFBQ1osV0FBVyxVQUFVLFFBQVE7R0FFbkMsT0FBTztJQUNMLElBQUksV0FBVyxVQUFVLFdBQVcsV0FBVyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVk7SUFDdEUsVUFBVSxXQUFXLFVBQVUsV0FBVyxXQUFXLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWTtJQUM5RSxPQUFPLFdBQVcsU0FBUyxVQUFVLElBQUk7SUFDekMsYUFBYSxXQUFXLFNBQVMsWUFBWSxJQUFJO0lBQ2pELFNBQVM7SUFDVCxlQUFlO0lBQ2YsT0FBTyxTQUFTLFlBQVk7SUFDNUIsVUFBVSxXQUFXLFdBQVcsUUFBUSxDQUFDLENBQUMsWUFBWTtHQUN4RDtFQUNGOzs7Ozs7RUFPQSxvQkFBb0IsVUFBZ0M7R0FDbEQsTUFBTSxXQUFXLEtBQUssU0FBUyxRQUFRO0dBRXZDLE1BQU0sZ0JBQWdCO0lBREs7SUFBYTtJQUFhO0lBQWdCO0lBQWE7R0FDNUQsQ0FBQSxDQUFrQixNQUFNLFdBQVcsU0FBUyxTQUFTLE1BQU0sQ0FBQztHQUVsRixPQUFPLGVBQWUseUJBQXlCLFVBQVU7R0FFekQsTUFBTSxpQkFBaUIsU0FBUyxNQUFNLEdBQUcsQ0FBQyxjQUFjLE1BQU07R0FDOUQsT0FBTyxlQUFlLFNBQVMsR0FBRyw2QkFBNkIsVUFBVTtHQUV6RSxPQUFPLFdBQVcsU0FBUyxlQUFlLFFBQVEsTUFBTSxHQUFHLENBQUM7RUFDOUQ7RUFFQSxNQUFjLG1DQUFrRDtHQUM5RCxNQUFNLG9CQUFvQixDQUN4QixLQUFLLEtBQUssT0FBTyxhQUFhLFlBQVksK0JBQStCLENBQUMsR0FDMUUsS0FBSyxLQUFLLE9BQU8sYUFBYSxZQUFZLG1DQUFtQyxDQUFDLENBQ2hGO0dBQ0EsTUFBTSxhQUNKLE1BQU0sUUFBUSxJQUFJLGtCQUFrQixLQUFLLFlBQVksVUFBVSxPQUFPLENBQUMsQ0FBQyxFQUFBLENBQ3hFLEtBQUs7R0FFUCxLQUFLLE1BQU0sWUFBWSxXQUFXO0lBQ2hDLE1BQU0sYUFBYSxLQUFLLDhCQUE4QixRQUFRO0lBQzlELE1BQU0sa0JBQWtCLE1BQU0sY0FBdUIsUUFBUTtJQUM3RCxLQUFLLE1BQU0sRUFBRSxNQUFNLFdBQVcsaUJBQzVCLElBQUksaUJBQWlCQSxJQUFFLFNBQ3JCLEtBQUssY0FBYyxNQUFNLFVBQVU7R0FHekM7RUFDRjtFQUVBLDhCQUFzQyxVQUEwQjtHQUU5RCxNQUFNLFVBRGlCLFNBQVMsV0FBVyxNQUFNLEdBQ2pDLENBQUEsQ0FBZSxNQUFNLCtDQUErQztHQUVwRixJQUFJLENBQUMsVUFBVSxJQUNiLE1BQU0sSUFBSSxNQUFNLDZCQUE2QixVQUFVO0dBR3pELE9BQU8sUUFBUTtFQUNqQjtDQUNGO0NBRWEsZ0JBQWdCLElBQUksbUJBQW1CIn0=
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { init_types, isBelongsToOneRelationProp, isEnumDefWithCone, isOneToOneRelationProp, isRelationProp, isSubsetDefWithCone } from "../types/types.js";
|
|
3
3
|
import { fakerMappings, init_faker_mappings } from "../testing/faker-mappings.js";
|
|
4
|
-
|
|
5
4
|
//#region src/entity/entity-template-cone.ts
|
|
6
5
|
/**
|
|
7
6
|
* Entity의 템플릿 cone을 생성합니다.
|
|
@@ -11,9 +10,7 @@ import { fakerMappings, init_faker_mappings } from "../testing/faker-mappings.js
|
|
|
11
10
|
*/
|
|
12
11
|
function generateTemplateCones(entity, locale = "ko") {
|
|
13
12
|
const mapping = fakerMappings[locale];
|
|
14
|
-
if (!mapping) {
|
|
15
|
-
throw new Error(`Unsupported locale: ${locale}`);
|
|
16
|
-
}
|
|
13
|
+
if (!mapping) throw new Error(`Unsupported locale: ${locale}`);
|
|
17
14
|
const entityCone = { note: getEntityScale(entity, locale) };
|
|
18
15
|
const propCones = {};
|
|
19
16
|
for (const prop of entity.props) {
|
|
@@ -24,13 +21,11 @@ function generateTemplateCones(entity, locale = "ko") {
|
|
|
24
21
|
dataSource: shouldHaveDataSource(prop) ? {
|
|
25
22
|
strategy: "recent",
|
|
26
23
|
config: { limit: 5 }
|
|
27
|
-
} :
|
|
24
|
+
} : void 0
|
|
28
25
|
};
|
|
29
26
|
}
|
|
30
27
|
const subsetCones = {};
|
|
31
|
-
for (const [key, subset] of Object.entries(entity.subsets || {})) {
|
|
32
|
-
subsetCones[key] = { note: getSubsetScale(key, subset, locale) };
|
|
33
|
-
}
|
|
28
|
+
for (const [key, subset] of Object.entries(entity.subsets || {})) subsetCones[key] = { note: getSubsetScale(key, subset, locale) };
|
|
34
29
|
const enumCones = {};
|
|
35
30
|
for (const [enumId, enumDef] of Object.entries(entity.enums || {})) {
|
|
36
31
|
const values = isEnumDefWithCone(enumDef) ? enumDef.values : enumDef;
|
|
@@ -58,56 +53,38 @@ function generateTemplateCones(entity, locale = "ko") {
|
|
|
58
53
|
* 3. type_defaults에서 prop type 매칭
|
|
59
54
|
*/
|
|
60
55
|
function findFakerMapping(prop, mapping) {
|
|
61
|
-
if (isRelationProp(prop))
|
|
62
|
-
return undefined;
|
|
63
|
-
}
|
|
56
|
+
if (isRelationProp(prop)) return;
|
|
64
57
|
const propName = prop.name.toLowerCase();
|
|
65
|
-
if (mapping.field_patterns[propName])
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
for (const [pattern, config] of Object.entries(mapping.field_patterns)) {
|
|
69
|
-
if (propName.includes(pattern) || propName.endsWith(`_${pattern}`)) {
|
|
70
|
-
return config;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
58
|
+
if (mapping.field_patterns[propName]) return mapping.field_patterns[propName];
|
|
59
|
+
for (const [pattern, config] of Object.entries(mapping.field_patterns)) if (propName.includes(pattern) || propName.endsWith(`_${pattern}`)) return config;
|
|
73
60
|
const typeKey = prop.type;
|
|
74
|
-
if (mapping.type_defaults[typeKey])
|
|
75
|
-
return mapping.type_defaults[typeKey];
|
|
76
|
-
}
|
|
77
|
-
return undefined;
|
|
61
|
+
if (mapping.type_defaults[typeKey]) return mapping.type_defaults[typeKey];
|
|
78
62
|
}
|
|
79
63
|
/**
|
|
80
64
|
* Entity scale을 생성합니다.
|
|
81
65
|
*/
|
|
82
66
|
function getEntityScale(entity, locale) {
|
|
83
67
|
const title = entity.title || entity.id;
|
|
84
|
-
|
|
68
|
+
return {
|
|
85
69
|
ko: `${title} 엔티티. 테스트 데이터 생성 시 각 필드는 실제 데이터와 유사한 형식으로 생성됩니다.`,
|
|
86
70
|
en: `${title} entity. Each field is generated in a format similar to real data.`,
|
|
87
71
|
ja: `${title}エンティティ。各フィールドは実際のデータに似た形式で生成されます。`
|
|
88
|
-
};
|
|
89
|
-
return templates[locale];
|
|
72
|
+
}[locale];
|
|
90
73
|
}
|
|
91
74
|
/**
|
|
92
75
|
* Prop scale을 생성합니다.
|
|
93
76
|
*/
|
|
94
77
|
function getPropScale(prop, fakerConfig, locale) {
|
|
95
|
-
if (isRelationProp(prop)) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
ko: `${fakerConfig.comment} 형식으로 생성됩니다.`,
|
|
106
|
-
en: `Generated as ${fakerConfig.comment}.`,
|
|
107
|
-
ja: `${fakerConfig.comment}形式で生成されます。`
|
|
108
|
-
};
|
|
109
|
-
return templates[locale];
|
|
110
|
-
}
|
|
78
|
+
if (isRelationProp(prop)) return {
|
|
79
|
+
ko: `${prop.with} 참조. 기존 ${prop.with} 데이터를 참조합니다.`,
|
|
80
|
+
en: `Reference to ${prop.with}. References existing ${prop.with} data.`,
|
|
81
|
+
ja: `${prop.with}への参照。既存の${prop.with}データを参照します。`
|
|
82
|
+
}[locale];
|
|
83
|
+
if (fakerConfig?.comment) return {
|
|
84
|
+
ko: `${fakerConfig.comment} 형식으로 생성됩니다.`,
|
|
85
|
+
en: `Generated as ${fakerConfig.comment}.`,
|
|
86
|
+
ja: `${fakerConfig.comment}形式で生成されます。`
|
|
87
|
+
}[locale];
|
|
111
88
|
return prop.name;
|
|
112
89
|
}
|
|
113
90
|
/**
|
|
@@ -116,41 +93,32 @@ function getPropScale(prop, fakerConfig, locale) {
|
|
|
116
93
|
* BelongsToOne 또는 OneToOne (hasJoinColumn: true)인 경우 dataSource가 필요합니다.
|
|
117
94
|
*/
|
|
118
95
|
function shouldHaveDataSource(prop) {
|
|
119
|
-
if (!isRelationProp(prop))
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if (isBelongsToOneRelationProp(prop)) {
|
|
123
|
-
return true;
|
|
124
|
-
}
|
|
125
|
-
if (isOneToOneRelationProp(prop)) {
|
|
126
|
-
return prop.hasJoinColumn;
|
|
127
|
-
}
|
|
96
|
+
if (!isRelationProp(prop)) return false;
|
|
97
|
+
if (isBelongsToOneRelationProp(prop)) return true;
|
|
98
|
+
if (isOneToOneRelationProp(prop)) return prop.hasJoinColumn;
|
|
128
99
|
return false;
|
|
129
100
|
}
|
|
130
101
|
/**
|
|
131
102
|
* Subset scale을 생성합니다.
|
|
132
103
|
*/
|
|
133
104
|
function getSubsetScale(key, subset, locale) {
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
const templates = {
|
|
105
|
+
const fieldNames = (isSubsetDefWithCone(subset) ? subset.fields : subset).map((f) => typeof f === "string" ? f : f.field).join(", ");
|
|
106
|
+
return {
|
|
137
107
|
ko: `${key} 서브셋. 포함된 필드: ${fieldNames}`,
|
|
138
108
|
en: `${key} subset. Included fields: ${fieldNames}`,
|
|
139
109
|
ja: `${key}サブセット。含まれるフィールド: ${fieldNames}`
|
|
140
|
-
};
|
|
141
|
-
return templates[locale];
|
|
110
|
+
}[locale];
|
|
142
111
|
}
|
|
143
112
|
/**
|
|
144
113
|
* Enum scale을 생성합니다.
|
|
145
114
|
*/
|
|
146
115
|
function getEnumScale(_enumId, values, locale) {
|
|
147
116
|
const valueList = Object.keys(values).join(", ");
|
|
148
|
-
|
|
117
|
+
return {
|
|
149
118
|
ko: `가능한 값: ${valueList}`,
|
|
150
119
|
en: `Possible values: ${valueList}`,
|
|
151
120
|
ja: `可能な値: ${valueList}`
|
|
152
|
-
};
|
|
153
|
-
return templates[locale];
|
|
121
|
+
}[locale];
|
|
154
122
|
}
|
|
155
123
|
/**
|
|
156
124
|
* Enum value scale을 생성합니다.
|
|
@@ -158,12 +126,11 @@ function getEnumScale(_enumId, values, locale) {
|
|
|
158
126
|
function getEnumValueScale(label) {
|
|
159
127
|
return label;
|
|
160
128
|
}
|
|
161
|
-
|
|
129
|
+
//#endregion
|
|
130
|
+
__esmMin((() => {
|
|
162
131
|
init_faker_mappings();
|
|
163
132
|
init_types();
|
|
164
|
-
}));
|
|
165
|
-
|
|
166
|
-
//#endregion
|
|
167
|
-
init_entity_template_cone();
|
|
133
|
+
}))();
|
|
168
134
|
export { generateTemplateCones };
|
|
169
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXRlbXBsYXRlLWNvbmUuanMiLCJuYW1lcyI6WyJlbnRpdHlDb25lOiBDb25lIiwicHJvcENvbmVzOiBSZWNvcmQ8c3RyaW5nLCBDb25lPiIsInN1YnNldENvbmVzOiBSZWNvcmQ8c3RyaW5nLCBDb25lPiIsImVudW1Db25lczogUmVjb3JkPHN0cmluZywgQ29uZT4iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZW50aXR5L2VudGl0eS10ZW1wbGF0ZS1jb25lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZha2VyTWFwcGluZ3MgfSBmcm9tIFwiLi4vdGVzdGluZy9mYWtlci1tYXBwaW5nc1wiO1xuaW1wb3J0IHsgdHlwZSBGYWtlck1hcHBpbmdDb25maWcgfSBmcm9tIFwiLi4vdGVzdGluZy9mYWtlci1tYXBwaW5nc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBDb25lLFxuICB0eXBlIEVudGl0eUpzb24sXG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgdHlwZSBPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgdHlwZSBTdWJzZXREZWYsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzRW51bURlZldpdGhDb25lLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNTdWJzZXREZWZXaXRoQ29uZSxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5cbi8qKlxuICogRW50aXR57J2YIO2FnO2UjOumvyBjb25l7J2EIOyDneyEse2VqeuLiOuLpC5cbiAqXG4gKiBMTE3snYQg7IKs7Jqp7ZWY7KeAIOyViuqzoCBmYWtlci1tYXBwaW5ncy50c+ulvCDtmZzsmqntlZjsl6wg6riw67O4IGNvbmXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICogc3R1YiBlbnRpdHkg7IOd7ISxIOyLnCDsnpDrj5nsnLzroZwg7Zi47Lac65CY7Ja0IOy1nOyGjO2VnOydmCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsoJzqs7Xtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVRlbXBsYXRlQ29uZXMoXG4gIGVudGl0eTogRW50aXR5SnNvbixcbiAgbG9jYWxlOiBcImtvXCIgfCBcImVuXCIgfCBcImphXCIgPSBcImtvXCIsXG4pOiB7XG4gIGVudGl0eUNvbmU/OiBDb25lO1xuICBwcm9wQ29uZXM6IFJlY29yZDxzdHJpbmcsIENvbmU+O1xuICBzdWJzZXRDb25lczogUmVjb3JkPHN0cmluZywgQ29uZT47XG4gIGVudW1Db25lczogUmVjb3JkPHN0cmluZywgQ29uZT47XG59IHtcbiAgY29uc3QgbWFwcGluZyA9IGZha2VyTWFwcGluZ3NbbG9jYWxlXTtcblxuICBpZiAoIW1hcHBpbmcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJHtsb2NhbGV9YCk7XG4gIH1cblxuICAvLyAxLiBFbnRpdHkgY29uZVxuICBjb25zdCBlbnRpdHlDb25lOiBDb25lID0ge1xuICAgIG5vdGU6IGdldEVudGl0eVNjYWxlKGVudGl0eSwgbG9jYWxlKSxcbiAgfTtcblxuICAvLyAyLiBQcm9wIGNvbmVzXG4gIGNvbnN0IHByb3BDb25lczogUmVjb3JkPHN0cmluZywgQ29uZT4gPSB7fTtcbiAgZm9yIChjb25zdCBwcm9wIG9mIGVudGl0eS5wcm9wcykge1xuICAgIGNvbnN0IGZha2VyQ29uZmlnID0gZmluZEZha2VyTWFwcGluZyhwcm9wLCBtYXBwaW5nKTtcblxuICAgIHByb3BDb25lc1twcm9wLm5hbWVdID0ge1xuICAgICAgbm90ZTogZ2V0UHJvcFNjYWxlKHByb3AsIGZha2VyQ29uZmlnLCBsb2NhbGUpLFxuICAgICAgZml4dHVyZUdlbmVyYXRvcjogZmFrZXJDb25maWc/LmZha2VyLFxuICAgICAgZGF0YVNvdXJjZTogc2hvdWxkSGF2ZURhdGFTb3VyY2UocHJvcClcbiAgICAgICAgPyB7IHN0cmF0ZWd5OiBcInJlY2VudFwiLCBjb25maWc6IHsgbGltaXQ6IDUgfSB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICAvLyAzLiBTdWJzZXQgY29uZXNcbiAgY29uc3Qgc3Vic2V0Q29uZXM6IFJlY29yZDxzdHJpbmcsIENvbmU+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgc3Vic2V0XSBvZiBPYmplY3QuZW50cmllcyhlbnRpdHkuc3Vic2V0cyB8fCB7fSkpIHtcbiAgICBzdWJzZXRDb25lc1trZXldID0ge1xuICAgICAgbm90ZTogZ2V0U3Vic2V0U2NhbGUoa2V5LCBzdWJzZXQsIGxvY2FsZSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIDQuIEVudW0gY29uZXNcbiAgY29uc3QgZW51bUNvbmVzOiBSZWNvcmQ8c3RyaW5nLCBDb25lPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtlbnVtSWQsIGVudW1EZWZdIG9mIE9iamVjdC5lbnRyaWVzKGVudGl0eS5lbnVtcyB8fCB7fSkpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBpc0VudW1EZWZXaXRoQ29uZShlbnVtRGVmKSA/IGVudW1EZWYudmFsdWVzIDogZW51bURlZjtcblxuICAgIGVudW1Db25lc1tlbnVtSWRdID0ge1xuICAgICAgbm90ZTogZ2V0RW51bVNjYWxlKGVudW1JZCwgdmFsdWVzLCBsb2NhbGUpLFxuICAgICAgdmFsdWVzOiBPYmplY3Qua2V5cyh2YWx1ZXMpLnJlZHVjZShcbiAgICAgICAgKGFjYywga2V5KSA9PiB7XG4gICAgICAgICAgYWNjW2tleV0gPSB7XG4gICAgICAgICAgICBub3RlOiBnZXRFbnVtVmFsdWVTY2FsZSh2YWx1ZXNba2V5XSB8fCBrZXkpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgeyBub3RlOiBzdHJpbmcgfT4sXG4gICAgICApLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBlbnRpdHlDb25lLCBwcm9wQ29uZXMsIHN1YnNldENvbmVzLCBlbnVtQ29uZXMgfTtcbn1cblxuLyoqXG4gKiBQcm9w7JeQIOunnuuKlCBmYWtlciBtYXBwaW5n7J2EIOywvuyKteuLiOuLpC5cbiAqXG4gKiDsmrDshKDsiJzsnIQ6XG4gKiAxLiBmaWVsZF9wYXR0ZXJuc+yXkOyEnCBwcm9wIG5hbWUg66ek7LmtICjsoJXtmZXtlZwg7J2066aEIOunpOy5rSlcbiAqIDIuIGZpZWxkX3BhdHRlcm5z7JeQ7IScIOu2gOu2hCDrp6Tsua0gKG5hbWUg7ZWE65Oc6rCAIHVzZXJfbmFtZeydtOuptCBuYW1lIOunpOy5rSlcbiAqIDMuIHR5cGVfZGVmYXVsdHPsl5DshJwgcHJvcCB0eXBlIOunpOy5rVxuICovXG5mdW5jdGlvbiBmaW5kRmFrZXJNYXBwaW5nKFxuICBwcm9wOiBFbnRpdHlQcm9wLFxuICBtYXBwaW5nOiB7XG4gICAgZmllbGRfcGF0dGVybnM6IFJlY29yZDxzdHJpbmcsIEZha2VyTWFwcGluZ0NvbmZpZz47XG4gICAgdHlwZV9kZWZhdWx0czogUmVjb3JkPHN0cmluZywgRmFrZXJNYXBwaW5nQ29uZmlnPjtcbiAgfSxcbik6IEZha2VyTWFwcGluZ0NvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBwcm9wTmFtZSA9IHByb3AubmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIDEuIOygle2Zle2VnCDtlYTrk5zrqoUg66ek7LmtXG4gIGlmIChtYXBwaW5nLmZpZWxkX3BhdHRlcm5zW3Byb3BOYW1lXSkge1xuICAgIHJldHVybiBtYXBwaW5nLmZpZWxkX3BhdHRlcm5zW3Byb3BOYW1lXTtcbiAgfVxuXG4gIC8vIDIuIOu2gOu2hCDrp6Tsua0gKHVzZXJfbmFtZSDihpIgbmFtZSwgZW1haWxfYWRkcmVzcyDihpIgZW1haWwpXG4gIGZvciAoY29uc3QgW3BhdHRlcm4sIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMobWFwcGluZy5maWVsZF9wYXR0ZXJucykpIHtcbiAgICBpZiAocHJvcE5hbWUuaW5jbHVkZXMocGF0dGVybikgfHwgcHJvcE5hbWUuZW5kc1dpdGgoYF8ke3BhdHRlcm59YCkpIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9XG5cbiAgLy8gMy4g7YOA7J6FIOq4sOuzuOqwkiDrp6Tsua1cbiAgY29uc3QgdHlwZUtleSA9IHByb3AudHlwZTtcbiAgaWYgKG1hcHBpbmcudHlwZV9kZWZhdWx0c1t0eXBlS2V5XSkge1xuICAgIHJldHVybiBtYXBwaW5nLnR5cGVfZGVmYXVsdHNbdHlwZUtleV07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEVudGl0eSBzY2FsZeydhCDsg53shLHtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGdldEVudGl0eVNjYWxlKGVudGl0eTogRW50aXR5SnNvbiwgbG9jYWxlOiBcImtvXCIgfCBcImVuXCIgfCBcImphXCIpOiBzdHJpbmcge1xuICBjb25zdCB0aXRsZSA9IGVudGl0eS50aXRsZSB8fCBlbnRpdHkuaWQ7XG5cbiAgY29uc3QgdGVtcGxhdGVzID0ge1xuICAgIGtvOiBgJHt0aXRsZX0g7JeU7Yuw7YuwLiDthYzsiqTtirgg642w7J207YSwIOyDneyEsSDsi5wg6rCBIO2VhOuTnOuKlCDsi6TsoJwg642w7J207YSw7JmAIOycoOyCrO2VnCDtmJXsi53snLzroZwg7IOd7ISx65Cp64uI64ukLmAsXG4gICAgZW46IGAke3RpdGxlfSBlbnRpdHkuIEVhY2ggZmllbGQgaXMgZ2VuZXJhdGVkIGluIGEgZm9ybWF0IHNpbWlsYXIgdG8gcmVhbCBkYXRhLmAsXG4gICAgamE6IGAke3RpdGxlfeOCqOODs+ODhuOCo+ODhuOCo+OAguWQhOODleOCo+ODvOODq+ODieOBr+Wun+mam+OBruODh+ODvOOCv+OBq+S8vOOBn+W9ouW8j+OBp+eUn+aIkOOBleOCjOOBvuOBmeOAgmAsXG4gIH07XG5cbiAgcmV0dXJuIHRlbXBsYXRlc1tsb2NhbGVdO1xufVxuXG4vKipcbiAqIFByb3Agc2NhbGXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRQcm9wU2NhbGUoXG4gIHByb3A6IEVudGl0eVByb3AsXG4gIGZha2VyQ29uZmlnOiBGYWtlck1hcHBpbmdDb25maWcgfCB1bmRlZmluZWQsXG4gIGxvY2FsZTogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiLFxuKTogc3RyaW5nIHtcbiAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgY29uc3QgdGVtcGxhdGVzID0ge1xuICAgICAga286IGAke3Byb3Aud2l0aH0g7LC47KGwLiDquLDsobQgJHtwcm9wLndpdGh9IOuNsOydtO2EsOulvCDssLjsobDtlanri4jri6QuYCxcbiAgICAgIGVuOiBgUmVmZXJlbmNlIHRvICR7cHJvcC53aXRofS4gUmVmZXJlbmNlcyBleGlzdGluZyAke3Byb3Aud2l0aH0gZGF0YS5gLFxuICAgICAgamE6IGAke3Byb3Aud2l0aH3jgbjjga7lj4LnhafjgILml6LlrZjjga4ke3Byb3Aud2l0aH3jg4fjg7zjgr/jgpLlj4LnhafjgZfjgb7jgZnjgIJgLFxuICAgIH07XG4gICAgcmV0dXJuIHRlbXBsYXRlc1tsb2NhbGVdO1xuICB9XG5cbiAgaWYgKGZha2VyQ29uZmlnPy5jb21tZW50KSB7XG4gICAgY29uc3QgdGVtcGxhdGVzID0ge1xuICAgICAga286IGAke2Zha2VyQ29uZmlnLmNvbW1lbnR9IO2YleyLneycvOuhnCDsg53shLHrkKnri4jri6QuYCxcbiAgICAgIGVuOiBgR2VuZXJhdGVkIGFzICR7ZmFrZXJDb25maWcuY29tbWVudH0uYCxcbiAgICAgIGphOiBgJHtmYWtlckNvbmZpZy5jb21tZW50feW9ouW8j+OBp+eUn+aIkOOBleOCjOOBvuOBmeOAgmAsXG4gICAgfTtcbiAgICByZXR1cm4gdGVtcGxhdGVzW2xvY2FsZV07XG4gIH1cblxuICByZXR1cm4gcHJvcC5uYW1lO1xufVxuXG4vKipcbiAqIFByb3DsnbQgZGF0YVNvdXJjZeulvCDqsIDsoLjslbwg7ZWY64qU7KeAIO2MkOuLqO2VqeuLiOuLpC5cbiAqXG4gKiBCZWxvbmdzVG9PbmUg65iQ64qUIE9uZVRvT25lIChoYXNKb2luQ29sdW1uOiB0cnVlKeyduCDqsr3smrAgZGF0YVNvdXJjZeqwgCDtlYTsmpTtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZEhhdmVEYXRhU291cmNlKHByb3A6IEVudGl0eVByb3ApOiBib29sZWFuIHtcbiAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEJlbG9uZ3NUb09uZeydgCDtla3sg4EgZGF0YVNvdXJjZSDtlYTsmpRcbiAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBPbmVUb09uZeydgCBoYXNKb2luQ29sdW1uOiB0cnVl7J24IOqyveyasOyXkOunjCBkYXRhU291cmNlIO2VhOyalFxuICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIHJldHVybiAocHJvcCBhcyBPbmVUb09uZVJlbGF0aW9uUHJvcCkuaGFzSm9pbkNvbHVtbjtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTdWJzZXQgc2NhbGXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRTdWJzZXRTY2FsZShrZXk6IHN0cmluZywgc3Vic2V0OiBTdWJzZXREZWYsIGxvY2FsZTogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiKTogc3RyaW5nIHtcbiAgY29uc3QgZmllbGRzID0gaXNTdWJzZXREZWZXaXRoQ29uZShzdWJzZXQpID8gc3Vic2V0LmZpZWxkcyA6IHN1YnNldDtcbiAgY29uc3QgZmllbGROYW1lcyA9IGZpZWxkcy5tYXAoKGYpID0+ICh0eXBlb2YgZiA9PT0gXCJzdHJpbmdcIiA/IGYgOiBmLmZpZWxkKSkuam9pbihcIiwgXCIpO1xuXG4gIGNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgICBrbzogYCR7a2V5fSDshJzruIzshYsuIO2PrO2VqOuQnCDtlYTrk5w6ICR7ZmllbGROYW1lc31gLFxuICAgIGVuOiBgJHtrZXl9IHN1YnNldC4gSW5jbHVkZWQgZmllbGRzOiAke2ZpZWxkTmFtZXN9YCxcbiAgICBqYTogYCR7a2V5feOCteODluOCu+ODg+ODiOOAguWQq+OBvuOCjOOCi+ODleOCo+ODvOODq+ODiTogJHtmaWVsZE5hbWVzfWAsXG4gIH07XG5cbiAgcmV0dXJuIHRlbXBsYXRlc1tsb2NhbGVdO1xufVxuXG4vKipcbiAqIEVudW0gc2NhbGXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRFbnVtU2NhbGUoXG4gIF9lbnVtSWQ6IHN0cmluZyxcbiAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBsb2NhbGU6IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIixcbik6IHN0cmluZyB7XG4gIGNvbnN0IHZhbHVlTGlzdCA9IE9iamVjdC5rZXlzKHZhbHVlcykuam9pbihcIiwgXCIpO1xuXG4gIGNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgICBrbzogYOqwgOuKpe2VnCDqsJI6ICR7dmFsdWVMaXN0fWAsXG4gICAgZW46IGBQb3NzaWJsZSB2YWx1ZXM6ICR7dmFsdWVMaXN0fWAsXG4gICAgamE6IGDlj6/og73jgarlgKQ6ICR7dmFsdWVMaXN0fWAsXG4gIH07XG5cbiAgcmV0dXJuIHRlbXBsYXRlc1tsb2NhbGVdO1xufVxuXG4vKipcbiAqIEVudW0gdmFsdWUgc2NhbGXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRFbnVtVmFsdWVTY2FsZShsYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxhYmVsO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQXVCQSxTQUFnQixzQkFDZCxRQUNBLFNBQTZCLE1BTTdCO0NBQ0EsTUFBTSxVQUFVLGNBQWM7QUFFOUIsS0FBSSxDQUFDLFNBQVM7QUFDWixRQUFNLElBQUksTUFBTSx1QkFBdUIsU0FBUzs7Q0FJbEQsTUFBTUEsYUFBbUIsRUFDdkIsTUFBTSxlQUFlLFFBQVEsT0FBTyxFQUNyQztDQUdELE1BQU1DLFlBQWtDLEVBQUU7QUFDMUMsTUFBSyxNQUFNLFFBQVEsT0FBTyxPQUFPO0VBQy9CLE1BQU0sY0FBYyxpQkFBaUIsTUFBTSxRQUFRO0FBRW5ELFlBQVUsS0FBSyxRQUFRO0dBQ3JCLE1BQU0sYUFBYSxNQUFNLGFBQWEsT0FBTztHQUM3QyxrQkFBa0IsYUFBYTtHQUMvQixZQUFZLHFCQUFxQixLQUFLLEdBQ2xDO0lBQUUsVUFBVTtJQUFVLFFBQVEsRUFBRSxPQUFPLEdBQUc7SUFBRSxHQUM1QztHQUNMOztDQUlILE1BQU1DLGNBQW9DLEVBQUU7QUFDNUMsTUFBSyxNQUFNLENBQUMsS0FBSyxXQUFXLE9BQU8sUUFBUSxPQUFPLFdBQVcsRUFBRSxDQUFDLEVBQUU7QUFDaEUsY0FBWSxPQUFPLEVBQ2pCLE1BQU0sZUFBZSxLQUFLLFFBQVEsT0FBTyxFQUMxQzs7Q0FJSCxNQUFNQyxZQUFrQyxFQUFFO0FBQzFDLE1BQUssTUFBTSxDQUFDLFFBQVEsWUFBWSxPQUFPLFFBQVEsT0FBTyxTQUFTLEVBQUUsQ0FBQyxFQUFFO0VBQ2xFLE1BQU0sU0FBUyxrQkFBa0IsUUFBUSxHQUFHLFFBQVEsU0FBUztBQUU3RCxZQUFVLFVBQVU7R0FDbEIsTUFBTSxhQUFhLFFBQVEsUUFBUSxPQUFPO0dBQzFDLFFBQVEsT0FBTyxLQUFLLE9BQU8sQ0FBQyxRQUN6QixLQUFLLFFBQVE7QUFDWixRQUFJLE9BQU8sRUFDVCxNQUFNLGtCQUFrQixPQUFPLFFBQVEsSUFBSSxFQUM1QztBQUNELFdBQU87TUFFVCxFQUFFLENBQ0g7R0FDRjs7QUFHSCxRQUFPO0VBQUU7RUFBWTtFQUFXO0VBQWE7RUFBVzs7Ozs7Ozs7OztBQVcxRCxTQUFTLGlCQUNQLE1BQ0EsU0FJZ0M7QUFDaEMsS0FBSSxlQUFlLEtBQUssRUFBRTtBQUN4QixTQUFPOztDQUdULE1BQU0sV0FBVyxLQUFLLEtBQUssYUFBYTtBQUd4QyxLQUFJLFFBQVEsZUFBZSxXQUFXO0FBQ3BDLFNBQU8sUUFBUSxlQUFlOztBQUloQyxNQUFLLE1BQU0sQ0FBQyxTQUFTLFdBQVcsT0FBTyxRQUFRLFFBQVEsZUFBZSxFQUFFO0FBQ3RFLE1BQUksU0FBUyxTQUFTLFFBQVEsSUFBSSxTQUFTLFNBQVMsSUFBSSxVQUFVLEVBQUU7QUFDbEUsVUFBTzs7O0NBS1gsTUFBTSxVQUFVLEtBQUs7QUFDckIsS0FBSSxRQUFRLGNBQWMsVUFBVTtBQUNsQyxTQUFPLFFBQVEsY0FBYzs7QUFHL0IsUUFBTzs7Ozs7QUFNVCxTQUFTLGVBQWUsUUFBb0IsUUFBb0M7Q0FDOUUsTUFBTSxRQUFRLE9BQU8sU0FBUyxPQUFPO0NBRXJDLE1BQU0sWUFBWTtFQUNoQixJQUFJLEdBQUcsTUFBTTtFQUNiLElBQUksR0FBRyxNQUFNO0VBQ2IsSUFBSSxHQUFHLE1BQU07RUFDZDtBQUVELFFBQU8sVUFBVTs7Ozs7QUFNbkIsU0FBUyxhQUNQLE1BQ0EsYUFDQSxRQUNRO0FBQ1IsS0FBSSxlQUFlLEtBQUssRUFBRTtFQUN4QixNQUFNLFlBQVk7R0FDaEIsSUFBSSxHQUFHLEtBQUssS0FBSyxVQUFVLEtBQUssS0FBSztHQUNyQyxJQUFJLGdCQUFnQixLQUFLLEtBQUssd0JBQXdCLEtBQUssS0FBSztHQUNoRSxJQUFJLEdBQUcsS0FBSyxLQUFLLFVBQVUsS0FBSyxLQUFLO0dBQ3RDO0FBQ0QsU0FBTyxVQUFVOztBQUduQixLQUFJLGFBQWEsU0FBUztFQUN4QixNQUFNLFlBQVk7R0FDaEIsSUFBSSxHQUFHLFlBQVksUUFBUTtHQUMzQixJQUFJLGdCQUFnQixZQUFZLFFBQVE7R0FDeEMsSUFBSSxHQUFHLFlBQVksUUFBUTtHQUM1QjtBQUNELFNBQU8sVUFBVTs7QUFHbkIsUUFBTyxLQUFLOzs7Ozs7O0FBUWQsU0FBUyxxQkFBcUIsTUFBMkI7QUFDdkQsS0FBSSxDQUFDLGVBQWUsS0FBSyxFQUFFO0FBQ3pCLFNBQU87O0FBSVQsS0FBSSwyQkFBMkIsS0FBSyxFQUFFO0FBQ3BDLFNBQU87O0FBSVQsS0FBSSx1QkFBdUIsS0FBSyxFQUFFO0FBQ2hDLFNBQVEsS0FBOEI7O0FBR3hDLFFBQU87Ozs7O0FBTVQsU0FBUyxlQUFlLEtBQWEsUUFBbUIsUUFBb0M7Q0FDMUYsTUFBTSxTQUFTLG9CQUFvQixPQUFPLEdBQUcsT0FBTyxTQUFTO0NBQzdELE1BQU0sYUFBYSxPQUFPLEtBQUssTUFBTyxPQUFPLE1BQU0sV0FBVyxJQUFJLEVBQUUsTUFBTyxDQUFDLEtBQUssS0FBSztDQUV0RixNQUFNLFlBQVk7RUFDaEIsSUFBSSxHQUFHLElBQUksZ0JBQWdCO0VBQzNCLElBQUksR0FBRyxJQUFJLDRCQUE0QjtFQUN2QyxJQUFJLEdBQUcsSUFBSSxtQkFBbUI7RUFDL0I7QUFFRCxRQUFPLFVBQVU7Ozs7O0FBTW5CLFNBQVMsYUFDUCxTQUNBLFFBQ0EsUUFDUTtDQUNSLE1BQU0sWUFBWSxPQUFPLEtBQUssT0FBTyxDQUFDLEtBQUssS0FBSztDQUVoRCxNQUFNLFlBQVk7RUFDaEIsSUFBSSxVQUFVO0VBQ2QsSUFBSSxvQkFBb0I7RUFDeEIsSUFBSSxTQUFTO0VBQ2Q7QUFFRCxRQUFPLFVBQVU7Ozs7O0FBTW5CLFNBQVMsa0JBQWtCLE9BQXVCO0FBQ2hELFFBQU87OztzQkEzT2lEO2FBZWxDIn0=
|
|
135
|
+
|
|
136
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXRlbXBsYXRlLWNvbmUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VudGl0eS9lbnRpdHktdGVtcGxhdGUtY29uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmYWtlck1hcHBpbmdzIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZmFrZXItbWFwcGluZ3NcIjtcbmltcG9ydCB7IHR5cGUgRmFrZXJNYXBwaW5nQ29uZmlnIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZmFrZXItbWFwcGluZ3NcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29uZSxcbiAgdHlwZSBFbnRpdHlKc29uLFxuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIHR5cGUgU3Vic2V0RGVmLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0VudW1EZWZXaXRoQ29uZSxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzU3Vic2V0RGVmV2l0aENvbmUsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuXG4vKipcbiAqIEVudGl0eeydmCDthZztlIzrpr8gY29uZeydhCDsg53shLHtlanri4jri6QuXG4gKlxuICogTExN7J2EIOyCrOyaqe2VmOyngCDslYrqs6AgZmFrZXItbWFwcGluZ3MudHPrpbwg7Zmc7Jqp7ZWY7JesIOq4sOuzuCBjb25l7J2EIOyDneyEse2VqeuLiOuLpC5cbiAqIHN0dWIgZW50aXR5IOyDneyEsSDsi5wg7J6Q64+Z7Jy866GcIO2YuOy2nOuQmOyWtCDstZzshoztlZzsnZggY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7KCc6rO17ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzKFxuICBlbnRpdHk6IEVudGl0eUpzb24sXG4gIGxvY2FsZTogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiID0gXCJrb1wiLFxuKToge1xuICBlbnRpdHlDb25lPzogQ29uZTtcbiAgcHJvcENvbmVzOiBSZWNvcmQ8c3RyaW5nLCBDb25lPjtcbiAgc3Vic2V0Q29uZXM6IFJlY29yZDxzdHJpbmcsIENvbmU+O1xuICBlbnVtQ29uZXM6IFJlY29yZDxzdHJpbmcsIENvbmU+O1xufSB7XG4gIGNvbnN0IG1hcHBpbmcgPSBmYWtlck1hcHBpbmdzW2xvY2FsZV07XG5cbiAgaWYgKCFtYXBwaW5nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICR7bG9jYWxlfWApO1xuICB9XG5cbiAgLy8gMS4gRW50aXR5IGNvbmVcbiAgY29uc3QgZW50aXR5Q29uZTogQ29uZSA9IHtcbiAgICBub3RlOiBnZXRFbnRpdHlTY2FsZShlbnRpdHksIGxvY2FsZSksXG4gIH07XG5cbiAgLy8gMi4gUHJvcCBjb25lc1xuICBjb25zdCBwcm9wQ29uZXM6IFJlY29yZDxzdHJpbmcsIENvbmU+ID0ge307XG4gIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICBjb25zdCBmYWtlckNvbmZpZyA9IGZpbmRGYWtlck1hcHBpbmcocHJvcCwgbWFwcGluZyk7XG5cbiAgICBwcm9wQ29uZXNbcHJvcC5uYW1lXSA9IHtcbiAgICAgIG5vdGU6IGdldFByb3BTY2FsZShwcm9wLCBmYWtlckNvbmZpZywgbG9jYWxlKSxcbiAgICAgIGZpeHR1cmVHZW5lcmF0b3I6IGZha2VyQ29uZmlnPy5mYWtlcixcbiAgICAgIGRhdGFTb3VyY2U6IHNob3VsZEhhdmVEYXRhU291cmNlKHByb3ApXG4gICAgICAgID8geyBzdHJhdGVneTogXCJyZWNlbnRcIiwgY29uZmlnOiB7IGxpbWl0OiA1IH0gfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgLy8gMy4gU3Vic2V0IGNvbmVzXG4gIGNvbnN0IHN1YnNldENvbmVzOiBSZWNvcmQ8c3RyaW5nLCBDb25lPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHN1YnNldF0gb2YgT2JqZWN0LmVudHJpZXMoZW50aXR5LnN1YnNldHMgfHwge30pKSB7XG4gICAgc3Vic2V0Q29uZXNba2V5XSA9IHtcbiAgICAgIG5vdGU6IGdldFN1YnNldFNjYWxlKGtleSwgc3Vic2V0LCBsb2NhbGUpLFxuICAgIH07XG4gIH1cblxuICAvLyA0LiBFbnVtIGNvbmVzXG4gIGNvbnN0IGVudW1Db25lczogUmVjb3JkPHN0cmluZywgQ29uZT4gPSB7fTtcbiAgZm9yIChjb25zdCBbZW51bUlkLCBlbnVtRGVmXSBvZiBPYmplY3QuZW50cmllcyhlbnRpdHkuZW51bXMgfHwge30pKSB7XG4gICAgY29uc3QgdmFsdWVzID0gaXNFbnVtRGVmV2l0aENvbmUoZW51bURlZikgPyBlbnVtRGVmLnZhbHVlcyA6IGVudW1EZWY7XG5cbiAgICBlbnVtQ29uZXNbZW51bUlkXSA9IHtcbiAgICAgIG5vdGU6IGdldEVudW1TY2FsZShlbnVtSWQsIHZhbHVlcywgbG9jYWxlKSxcbiAgICAgIHZhbHVlczogT2JqZWN0LmtleXModmFsdWVzKS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGtleSkgPT4ge1xuICAgICAgICAgIGFjY1trZXldID0ge1xuICAgICAgICAgICAgbm90ZTogZ2V0RW51bVZhbHVlU2NhbGUodmFsdWVzW2tleV0gfHwga2V5KSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sXG4gICAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIHsgbm90ZTogc3RyaW5nIH0+LFxuICAgICAgKSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgZW50aXR5Q29uZSwgcHJvcENvbmVzLCBzdWJzZXRDb25lcywgZW51bUNvbmVzIH07XG59XG5cbi8qKlxuICogUHJvcOyXkCDrp57ripQgZmFrZXIgbWFwcGluZ+ydhCDssL7sirXri4jri6QuXG4gKlxuICog7Jqw7ISg7Iic7JyEOlxuICogMS4gZmllbGRfcGF0dGVybnPsl5DshJwgcHJvcCBuYW1lIOunpOy5rSAo7KCV7ZmV7ZWcIOydtOumhCDrp6Tsua0pXG4gKiAyLiBmaWVsZF9wYXR0ZXJuc+yXkOyEnCDrtoDrtoQg66ek7LmtIChuYW1lIO2VhOuTnOqwgCB1c2VyX25hbWXsnbTrqbQgbmFtZSDrp6Tsua0pXG4gKiAzLiB0eXBlX2RlZmF1bHRz7JeQ7IScIHByb3AgdHlwZSDrp6Tsua1cbiAqL1xuZnVuY3Rpb24gZmluZEZha2VyTWFwcGluZyhcbiAgcHJvcDogRW50aXR5UHJvcCxcbiAgbWFwcGluZzoge1xuICAgIGZpZWxkX3BhdHRlcm5zOiBSZWNvcmQ8c3RyaW5nLCBGYWtlck1hcHBpbmdDb25maWc+O1xuICAgIHR5cGVfZGVmYXVsdHM6IFJlY29yZDxzdHJpbmcsIEZha2VyTWFwcGluZ0NvbmZpZz47XG4gIH0sXG4pOiBGYWtlck1hcHBpbmdDb25maWcgfCB1bmRlZmluZWQge1xuICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgcHJvcE5hbWUgPSBwcm9wLm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAvLyAxLiDsoJXtmZXtlZwg7ZWE65Oc66qFIOunpOy5rVxuICBpZiAobWFwcGluZy5maWVsZF9wYXR0ZXJuc1twcm9wTmFtZV0pIHtcbiAgICByZXR1cm4gbWFwcGluZy5maWVsZF9wYXR0ZXJuc1twcm9wTmFtZV07XG4gIH1cblxuICAvLyAyLiDrtoDrtoQg66ek7LmtICh1c2VyX25hbWUg4oaSIG5hbWUsIGVtYWlsX2FkZHJlc3Mg4oaSIGVtYWlsKVxuICBmb3IgKGNvbnN0IFtwYXR0ZXJuLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKG1hcHBpbmcuZmllbGRfcGF0dGVybnMpKSB7XG4gICAgaWYgKHByb3BOYW1lLmluY2x1ZGVzKHBhdHRlcm4pIHx8IHByb3BOYW1lLmVuZHNXaXRoKGBfJHtwYXR0ZXJufWApKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfVxuXG4gIC8vIDMuIO2DgOyehSDquLDrs7jqsJIg66ek7LmtXG4gIGNvbnN0IHR5cGVLZXkgPSBwcm9wLnR5cGU7XG4gIGlmIChtYXBwaW5nLnR5cGVfZGVmYXVsdHNbdHlwZUtleV0pIHtcbiAgICByZXR1cm4gbWFwcGluZy50eXBlX2RlZmF1bHRzW3R5cGVLZXldO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBFbnRpdHkgc2NhbGXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRFbnRpdHlTY2FsZShlbnRpdHk6IEVudGl0eUpzb24sIGxvY2FsZTogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiKTogc3RyaW5nIHtcbiAgY29uc3QgdGl0bGUgPSBlbnRpdHkudGl0bGUgfHwgZW50aXR5LmlkO1xuXG4gIGNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgICBrbzogYCR7dGl0bGV9IOyXlO2LsO2LsC4g7YWM7Iqk7Yq4IOuNsOydtO2EsCDsg53shLEg7IucIOqwgSDtlYTrk5zripQg7Iuk7KCcIOuNsOydtO2EsOyZgCDsnKDsgqztlZwg7ZiV7Iud7Jy866GcIOyDneyEseuQqeuLiOuLpC5gLFxuICAgIGVuOiBgJHt0aXRsZX0gZW50aXR5LiBFYWNoIGZpZWxkIGlzIGdlbmVyYXRlZCBpbiBhIGZvcm1hdCBzaW1pbGFyIHRvIHJlYWwgZGF0YS5gLFxuICAgIGphOiBgJHt0aXRsZX3jgqjjg7Pjg4bjgqPjg4bjgqPjgILlkITjg5XjgqPjg7zjg6vjg4njga/lrp/pmpvjga7jg4fjg7zjgr/jgavkvLzjgZ/lvaLlvI/jgafnlJ/miJDjgZXjgozjgb7jgZnjgIJgLFxuICB9O1xuXG4gIHJldHVybiB0ZW1wbGF0ZXNbbG9jYWxlXTtcbn1cblxuLyoqXG4gKiBQcm9wIHNjYWxl7J2EIOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJvcFNjYWxlKFxuICBwcm9wOiBFbnRpdHlQcm9wLFxuICBmYWtlckNvbmZpZzogRmFrZXJNYXBwaW5nQ29uZmlnIHwgdW5kZWZpbmVkLFxuICBsb2NhbGU6IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIixcbik6IHN0cmluZyB7XG4gIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgICAgIGtvOiBgJHtwcm9wLndpdGh9IOywuOyhsC4g6riw7KG0ICR7cHJvcC53aXRofSDrjbDsnbTthLDrpbwg7LC47KGw7ZWp64uI64ukLmAsXG4gICAgICBlbjogYFJlZmVyZW5jZSB0byAke3Byb3Aud2l0aH0uIFJlZmVyZW5jZXMgZXhpc3RpbmcgJHtwcm9wLndpdGh9IGRhdGEuYCxcbiAgICAgIGphOiBgJHtwcm9wLndpdGh944G444Gu5Y+C54Wn44CC5pei5a2Y44GuJHtwcm9wLndpdGh944OH44O844K/44KS5Y+C54Wn44GX44G+44GZ44CCYCxcbiAgICB9O1xuICAgIHJldHVybiB0ZW1wbGF0ZXNbbG9jYWxlXTtcbiAgfVxuXG4gIGlmIChmYWtlckNvbmZpZz8uY29tbWVudCkge1xuICAgIGNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgICAgIGtvOiBgJHtmYWtlckNvbmZpZy5jb21tZW50fSDtmJXsi53snLzroZwg7IOd7ISx65Cp64uI64ukLmAsXG4gICAgICBlbjogYEdlbmVyYXRlZCBhcyAke2Zha2VyQ29uZmlnLmNvbW1lbnR9LmAsXG4gICAgICBqYTogYCR7ZmFrZXJDb25maWcuY29tbWVudH3lvaLlvI/jgafnlJ/miJDjgZXjgozjgb7jgZnjgIJgLFxuICAgIH07XG4gICAgcmV0dXJuIHRlbXBsYXRlc1tsb2NhbGVdO1xuICB9XG5cbiAgcmV0dXJuIHByb3AubmFtZTtcbn1cblxuLyoqXG4gKiBQcm9w7J20IGRhdGFTb3VyY2Xrpbwg6rCA7KC47JW8IO2VmOuKlOyngCDtjJDri6jtlanri4jri6QuXG4gKlxuICogQmVsb25nc1RvT25lIOuYkOuKlCBPbmVUb09uZSAoaGFzSm9pbkNvbHVtbjogdHJ1ZSnsnbgg6rK97JqwIGRhdGFTb3VyY2XqsIAg7ZWE7JqU7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBzaG91bGRIYXZlRGF0YVNvdXJjZShwcm9wOiBFbnRpdHlQcm9wKTogYm9vbGVhbiB7XG4gIGlmICghaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBCZWxvbmdzVG9PbmXsnYAg7ZWt7IOBIGRhdGFTb3VyY2Ug7ZWE7JqUXG4gIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gT25lVG9PbmXsnYAgaGFzSm9pbkNvbHVtbjogdHJ1ZeyduCDqsr3smrDsl5Drp4wgZGF0YVNvdXJjZSDtlYTsmpRcbiAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICByZXR1cm4gKHByb3AgYXMgT25lVG9PbmVSZWxhdGlvblByb3ApLmhhc0pvaW5Db2x1bW47XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU3Vic2V0IHNjYWxl7J2EIOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0U3Vic2V0U2NhbGUoa2V5OiBzdHJpbmcsIHN1YnNldDogU3Vic2V0RGVmLCBsb2NhbGU6IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIik6IHN0cmluZyB7XG4gIGNvbnN0IGZpZWxkcyA9IGlzU3Vic2V0RGVmV2l0aENvbmUoc3Vic2V0KSA/IHN1YnNldC5maWVsZHMgOiBzdWJzZXQ7XG4gIGNvbnN0IGZpZWxkTmFtZXMgPSBmaWVsZHMubWFwKChmKSA9PiAodHlwZW9mIGYgPT09IFwic3RyaW5nXCIgPyBmIDogZi5maWVsZCkpLmpvaW4oXCIsIFwiKTtcblxuICBjb25zdCB0ZW1wbGF0ZXMgPSB7XG4gICAga286IGAke2tleX0g7ISc67iM7IWLLiDtj6ztlajrkJwg7ZWE65OcOiAke2ZpZWxkTmFtZXN9YCxcbiAgICBlbjogYCR7a2V5fSBzdWJzZXQuIEluY2x1ZGVkIGZpZWxkczogJHtmaWVsZE5hbWVzfWAsXG4gICAgamE6IGAke2tleX3jgrXjg5bjgrvjg4Pjg4jjgILlkKvjgb7jgozjgovjg5XjgqPjg7zjg6vjg4k6ICR7ZmllbGROYW1lc31gLFxuICB9O1xuXG4gIHJldHVybiB0ZW1wbGF0ZXNbbG9jYWxlXTtcbn1cblxuLyoqXG4gKiBFbnVtIHNjYWxl7J2EIOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0RW51bVNjYWxlKFxuICBfZW51bUlkOiBzdHJpbmcsXG4gIHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgbG9jYWxlOiBcImtvXCIgfCBcImVuXCIgfCBcImphXCIsXG4pOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZUxpc3QgPSBPYmplY3Qua2V5cyh2YWx1ZXMpLmpvaW4oXCIsIFwiKTtcblxuICBjb25zdCB0ZW1wbGF0ZXMgPSB7XG4gICAga286IGDqsIDriqXtlZwg6rCSOiAke3ZhbHVlTGlzdH1gLFxuICAgIGVuOiBgUG9zc2libGUgdmFsdWVzOiAke3ZhbHVlTGlzdH1gLFxuICAgIGphOiBg5Y+v6IO944Gq5YCkOiAke3ZhbHVlTGlzdH1gLFxuICB9O1xuXG4gIHJldHVybiB0ZW1wbGF0ZXNbbG9jYWxlXTtcbn1cblxuLyoqXG4gKiBFbnVtIHZhbHVlIHNjYWxl7J2EIOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0RW51bVZhbHVlU2NhbGUobGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBsYWJlbDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQXVCQSxTQUFnQixzQkFDZCxRQUNBLFNBQTZCLE1BTTdCO0NBQ0EsTUFBTSxVQUFVLGNBQWM7Q0FFOUIsSUFBSSxDQUFDLFNBQ0gsTUFBTSxJQUFJLE1BQU0sdUJBQXVCLFFBQVE7Q0FJakQsTUFBTSxhQUFtQixFQUN2QixNQUFNLGVBQWUsUUFBUSxNQUFNLEVBQ3JDO0NBR0EsTUFBTSxZQUFrQyxDQUFDO0NBQ3pDLEtBQUssTUFBTSxRQUFRLE9BQU8s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
|