sonamu 0.8.26 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +60 -13
- package/dist/_virtual/rolldown_runtime.js +39 -0
- package/dist/ai/agents/agent.d.ts +3 -3
- package/dist/ai/agents/agent.d.ts.map +1 -1
- package/dist/ai/agents/agent.js +76 -73
- package/dist/ai/agents/index.js +3 -3
- package/dist/ai/agents/types.d.ts +3 -3
- package/dist/ai/agents/types.d.ts.map +1 -1
- package/dist/ai/agents/types.js +1 -3
- package/dist/ai/index.js +3 -2
- package/dist/ai/providers/rtzr/api.js +25 -25
- package/dist/ai/providers/rtzr/error.js +25 -26
- package/dist/ai/providers/rtzr/index.js +5 -5
- package/dist/ai/providers/rtzr/model.d.ts +1 -1
- package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/model.js +117 -133
- package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/options.js +35 -41
- package/dist/ai/providers/rtzr/provider.d.ts +1 -1
- package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/provider.js +53 -51
- package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/utils.js +84 -84
- package/dist/api/base-frame.d.ts +2 -2
- package/dist/api/base-frame.d.ts.map +1 -1
- package/dist/api/base-frame.js +29 -19
- package/dist/api/caster.d.ts +1 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +51 -61
- package/dist/api/code-converters.d.ts +4 -3
- package/dist/api/code-converters.d.ts.map +1 -1
- package/dist/api/code-converters.js +226 -249
- package/dist/api/config.d.ts +17 -17
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +37 -30
- package/dist/api/context.d.ts +10 -10
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +8 -2
- package/dist/api/decorators.d.ts +8 -8
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +245 -268
- package/dist/api/index.js +39 -7
- package/dist/api/secret.js +22 -15
- package/dist/api/sonamu.d.ts +15 -15
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +1012 -1131
- package/dist/api/validator.js +88 -79
- package/dist/auth/auth-generator.d.ts.map +1 -1
- package/dist/auth/auth-generator.js +203 -200
- package/dist/auth/better-auth-entities.d.ts +2 -2
- package/dist/auth/better-auth-entities.d.ts.map +1 -1
- package/dist/auth/better-auth-entities.js +369 -429
- package/dist/auth/index.js +21 -6
- package/dist/auth/knex-adapter.d.ts +2 -2
- package/dist/auth/knex-adapter.d.ts.map +1 -1
- package/dist/auth/knex-adapter.js +153 -157
- package/dist/auth/plugins/entity-definitions/admin.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/admin.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/admin.js +58 -56
- package/dist/auth/plugins/entity-definitions/anonymous.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/anonymous.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/anonymous.js +20 -20
- package/dist/auth/plugins/entity-definitions/api-key.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/api-key.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/api-key.js +185 -196
- package/dist/auth/plugins/entity-definitions/index.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/index.js +26 -29
- package/dist/auth/plugins/entity-definitions/jwt.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/jwt.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/jwt.js +62 -64
- package/dist/auth/plugins/entity-definitions/organization.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/organization.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/organization.js +362 -421
- package/dist/auth/plugins/entity-definitions/passkey.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/passkey.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/passkey.js +115 -126
- package/dist/auth/plugins/entity-definitions/phone-number.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/phone-number.js +31 -40
- package/dist/auth/plugins/entity-definitions/sso.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/sso.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/sso.js +94 -107
- package/dist/auth/plugins/entity-definitions/two-factor.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/two-factor.js +78 -92
- package/dist/auth/plugins/entity-definitions/types.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/types.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/types.js +1 -10
- package/dist/auth/plugins/entity-definitions/username.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/username.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/username.js +31 -40
- package/dist/auth/plugins/index.js +12 -3
- package/dist/auth/plugins/wrappers/admin.d.ts +2 -2
- package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/admin.js +28 -29
- package/dist/auth/plugins/wrappers/anonymous.d.ts +2 -1
- package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/anonymous.js +23 -22
- package/dist/auth/plugins/wrappers/api-key.d.ts +2 -1
- package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/api-key.js +39 -34
- package/dist/auth/plugins/wrappers/index.js +11 -11
- package/dist/auth/plugins/wrappers/jwt.d.ts +2 -1
- package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/jwt.js +31 -26
- package/dist/auth/plugins/wrappers/organization.d.ts +2 -1
- package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/organization.js +65 -62
- package/dist/auth/plugins/wrappers/passkey.d.ts +2 -1
- package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/passkey.js +33 -28
- package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/phone-number.js +26 -23
- package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/sso.js +37 -31
- package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/two-factor.js +31 -28
- package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/username.js +23 -23
- package/dist/bin/build-config.js +31 -31
- package/dist/bin/cli.js +1063 -1204
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +266 -259
- package/dist/bin/hmr-hook-register.d.ts.map +1 -1
- package/dist/bin/hmr-hook-register.js +19 -18
- package/dist/bin/test-command.d.ts.map +1 -1
- package/dist/bin/test-command.js +180 -177
- package/dist/bin/ts-loader-register.js +13 -6
- package/dist/bin/ts-loader-registration.d.ts.map +1 -1
- package/dist/bin/ts-loader-registration.js +28 -38
- package/dist/cache/cache-manager.d.ts +1 -1
- package/dist/cache/cache-manager.d.ts.map +1 -1
- package/dist/cache/cache-manager.js +20 -15
- package/dist/cache/decorator.d.ts +1 -1
- package/dist/cache/decorator.d.ts.map +1 -1
- package/dist/cache/decorator.js +84 -76
- package/dist/cache/drivers.js +21 -34
- package/dist/cache/index.js +10 -7
- package/dist/cache/types.d.ts +2 -2
- package/dist/cache/types.d.ts.map +1 -1
- package/dist/cache/types.js +1 -6
- package/dist/cache-control/cache-control.d.ts +2 -2
- package/dist/cache-control/cache-control.d.ts.map +1 -1
- package/dist/cache-control/cache-control.js +106 -122
- package/dist/cache-control/types.d.ts +2 -2
- package/dist/cache-control/types.d.ts.map +1 -1
- package/dist/cache-control/types.js +1 -19
- package/dist/compress/compress.d.ts +1 -1
- package/dist/compress/compress.d.ts.map +1 -1
- package/dist/compress/compress.js +58 -56
- package/dist/compress/index.js +7 -2
- package/dist/compress/types.js +1 -11
- package/dist/cone/cone-generator.d.ts +1 -1
- package/dist/cone/cone-generator.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +216 -219
- package/dist/database/_batch_update.d.ts +1 -1
- package/dist/database/_batch_update.d.ts.map +1 -1
- package/dist/database/_batch_update.js +107 -102
- package/dist/database/base-model.d.ts +8 -9
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +371 -392
- package/dist/database/base-model.types.d.ts +5 -5
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/base-model.types.js +1 -20
- package/dist/database/db.d.ts +5 -2
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +185 -171
- package/dist/database/knex.d.ts +1 -1
- package/dist/database/knex.d.ts.map +1 -1
- package/dist/database/knex.js +48 -42
- package/dist/database/puri-subset.types.d.ts +6 -7
- package/dist/database/puri-subset.types.d.ts.map +1 -1
- package/dist/database/puri-subset.types.js +1 -16
- package/dist/database/puri-wrapper.d.ts +6 -6
- package/dist/database/puri-wrapper.d.ts.map +1 -1
- package/dist/database/puri-wrapper.js +99 -101
- package/dist/database/puri.d.ts +4 -5
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +1021 -1227
- package/dist/database/puri.types.d.ts +6 -6
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +15 -6
- package/dist/database/transaction-context.d.ts +2 -2
- package/dist/database/transaction-context.d.ts.map +1 -1
- package/dist/database/transaction-context.js +22 -13
- package/dist/database/upsert-builder.d.ts +3 -3
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +405 -465
- package/dist/dict/en.js +72 -74
- package/dist/dict/index.js +13 -13
- package/dist/dict/ko.js +72 -74
- package/dist/dict/rc-keys.js +150 -168
- package/dist/dict/sd.d.ts +3 -1
- package/dist/dict/sd.d.ts.map +1 -1
- package/dist/dict/sd.js +54 -40
- package/dist/dict/sonamu-dictionary.d.ts +1 -1
- package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
- package/dist/dict/sonamu-dictionary.js +887 -955
- package/dist/dict/types.js +1 -7
- package/dist/dict/utils.js +26 -24
- package/dist/entity/entity-manager.d.ts +9 -9
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +226 -223
- package/dist/entity/entity-template-cone.d.ts +1 -1
- package/dist/entity/entity-template-cone.d.ts.map +1 -1
- package/dist/entity/entity-template-cone.js +152 -151
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +952 -1089
- package/dist/exceptions/error-handler.d.ts +1 -1
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +32 -27
- package/dist/exceptions/so-exceptions.d.ts +1 -1
- package/dist/exceptions/so-exceptions.d.ts.map +1 -1
- package/dist/exceptions/so-exceptions.js +61 -68
- package/dist/filter/index.js +9 -3
- package/dist/filter/types.js +92 -88
- package/dist/filter/utils.d.ts +1 -1
- package/dist/filter/utils.d.ts.map +1 -1
- package/dist/filter/utils.js +147 -161
- package/dist/index.js +87 -40
- package/dist/logger/category.d.ts.map +1 -1
- package/dist/logger/category.js +30 -29
- package/dist/logger/configure.d.ts.map +1 -1
- package/dist/logger/configure.js +83 -107
- package/dist/migration/code-generation.d.ts +2 -2
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +1385 -1578
- package/dist/migration/migration-set.d.ts +1 -1
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +177 -227
- package/dist/migration/migrator.d.ts +4 -3
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +340 -345
- package/dist/migration/postgresql-schema-reader.d.ts +2 -2
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +506 -564
- package/dist/migration/slack-confirm.d.ts +2 -2
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +205 -193
- package/dist/migration/types.d.ts +2 -2
- package/dist/migration/types.d.ts.map +1 -1
- package/dist/migration/types.js +1 -3
- package/dist/naite/messaging-types.d.ts +1 -0
- package/dist/naite/messaging-types.d.ts.map +1 -1
- package/dist/naite/messaging-types.js +1 -7
- package/dist/naite/naite-reporter.d.ts +2 -2
- package/dist/naite/naite-reporter.d.ts.map +1 -1
- package/dist/naite/naite-reporter.js +127 -120
- package/dist/naite/naite.d.ts +3 -2
- package/dist/naite/naite.d.ts.map +1 -1
- package/dist/naite/naite.js +266 -300
- package/dist/ssr/index.d.ts +2 -2
- package/dist/ssr/index.d.ts.map +1 -1
- package/dist/ssr/index.js +13 -3
- package/dist/ssr/registry.d.ts +1 -1
- package/dist/ssr/registry.d.ts.map +1 -1
- package/dist/ssr/registry.js +45 -37
- package/dist/ssr/renderer.d.ts +4 -4
- package/dist/ssr/renderer.d.ts.map +1 -1
- package/dist/ssr/renderer.js +84 -91
- package/dist/ssr/types.d.ts +2 -2
- package/dist/ssr/types.d.ts.map +1 -1
- package/dist/ssr/types.js +1 -3
- package/dist/storage/base-file.js +54 -41
- package/dist/storage/buffered-file.d.ts +2 -2
- package/dist/storage/buffered-file.d.ts.map +1 -1
- package/dist/storage/buffered-file.js +51 -44
- package/dist/storage/drivers.d.ts +2 -2
- package/dist/storage/drivers.d.ts.map +1 -1
- package/dist/storage/drivers.js +12 -7
- package/dist/storage/index.js +14 -7
- package/dist/storage/s3-driver.d.ts +2 -2
- package/dist/storage/s3-driver.d.ts.map +1 -1
- package/dist/storage/s3-driver.js +52 -48
- package/dist/storage/storage-manager.d.ts +2 -2
- package/dist/storage/storage-manager.d.ts.map +1 -1
- package/dist/storage/storage-manager.js +33 -25
- package/dist/storage/types.d.ts +2 -2
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/types.js +1 -5
- package/dist/storage/uploaded-file.d.ts +1 -1
- package/dist/storage/uploaded-file.d.ts.map +1 -1
- package/dist/storage/uploaded-file.js +45 -35
- package/dist/stream/index.js +7 -2
- package/dist/stream/sse.d.ts +2 -2
- package/dist/stream/sse.d.ts.map +1 -1
- package/dist/stream/sse.js +72 -67
- package/dist/syncer/api-parser.d.ts +1 -1
- package/dist/syncer/api-parser.d.ts.map +1 -1
- package/dist/syncer/api-parser.js +224 -245
- package/dist/syncer/checksum.d.ts +1 -1
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +86 -72
- package/dist/syncer/code-generator.d.ts +2 -2
- package/dist/syncer/code-generator.d.ts.map +1 -1
- package/dist/syncer/code-generator.js +154 -160
- package/dist/syncer/entity-operations.d.ts +1 -1
- package/dist/syncer/entity-operations.d.ts.map +1 -1
- package/dist/syncer/entity-operations.js +63 -54
- package/dist/syncer/file-patterns.d.ts +1 -1
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +38 -38
- package/dist/syncer/index.js +19 -8
- package/dist/syncer/module-loader.d.ts +5 -5
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +83 -78
- package/dist/syncer/syncer-actions.d.ts +2 -2
- package/dist/syncer/syncer-actions.d.ts.map +1 -1
- package/dist/syncer/syncer-actions.js +76 -91
- package/dist/syncer/syncer.d.ts +7 -6
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +426 -492
- package/dist/tasks/decorator.d.ts +3 -3
- package/dist/tasks/decorator.d.ts.map +1 -1
- package/dist/tasks/decorator.js +32 -28
- package/dist/tasks/step-wrapper.d.ts +1 -1
- package/dist/tasks/step-wrapper.d.ts.map +1 -1
- package/dist/tasks/step-wrapper.js +42 -41
- package/dist/tasks/workflow-manager.d.ts +2 -2
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +192 -221
- package/dist/template/entity-converter.d.ts +1 -1
- package/dist/template/entity-converter.d.ts.map +1 -1
- package/dist/template/entity-converter.js +103 -103
- package/dist/template/helpers.d.ts.map +1 -1
- package/dist/template/helpers.js +163 -163
- package/dist/template/implementations/entity.template.d.ts +1 -1
- package/dist/template/implementations/entity.template.d.ts.map +1 -1
- package/dist/template/implementations/entity.template.js +76 -85
- package/dist/template/implementations/entry-server.template.d.ts +1 -1
- package/dist/template/implementations/entry-server.template.d.ts.map +1 -1
- package/dist/template/implementations/entry-server.template.js +32 -27
- package/dist/template/implementations/generated.template.d.ts +1 -1
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +254 -275
- package/dist/template/implementations/generated_http.template.d.ts +2 -2
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.js +114 -133
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +249 -275
- package/dist/template/implementations/init_types.template.d.ts +1 -1
- package/dist/template/implementations/init_types.template.d.ts.map +1 -1
- package/dist/template/implementations/init_types.template.js +40 -34
- package/dist/template/implementations/model.template.d.ts +1 -1
- package/dist/template/implementations/model.template.d.ts.map +1 -1
- package/dist/template/implementations/model.template.js +56 -53
- package/dist/template/implementations/model_test.template.d.ts +1 -1
- package/dist/template/implementations/model_test.template.d.ts.map +1 -1
- package/dist/template/implementations/model_test.template.js +32 -24
- package/dist/template/implementations/queries.template.d.ts +1 -1
- package/dist/template/implementations/queries.template.d.ts.map +1 -1
- package/dist/template/implementations/queries.template.js +84 -89
- package/dist/template/implementations/sd.template.d.ts +1 -1
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +137 -144
- package/dist/template/implementations/services.template.d.ts +1 -1
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +164 -189
- package/dist/template/implementations/view_form.template.d.ts +1 -1
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +258 -285
- package/dist/template/implementations/view_id_all_select.template.d.ts +1 -1
- package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
- package/dist/template/implementations/view_id_all_select.template.js +31 -25
- package/dist/template/implementations/view_list.template.d.ts +1 -1
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +304 -355
- package/dist/template/implementations/view_search_input.template.d.ts +1 -1
- package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
- package/dist/template/implementations/view_search_input.template.js +31 -27
- package/dist/template/index.js +21 -7
- package/dist/template/template-manager.d.ts +1 -1
- package/dist/template/template-manager.d.ts.map +1 -1
- package/dist/template/template-manager.js +132 -123
- package/dist/template/template-types.js +8 -6
- package/dist/template/template.d.ts +2 -2
- package/dist/template/template.d.ts.map +1 -1
- package/dist/template/template.js +73 -68
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +603 -657
- package/dist/testing/_relation-graph.d.ts +1 -1
- package/dist/testing/_relation-graph.d.ts.map +1 -1
- package/dist/testing/_relation-graph.js +93 -88
- package/dist/testing/bootstrap.d.ts +22 -13
- package/dist/testing/bootstrap.d.ts.map +1 -1
- package/dist/testing/bootstrap.js +114 -114
- package/dist/testing/data-explorer.d.ts +3 -3
- package/dist/testing/data-explorer.d.ts.map +1 -1
- package/dist/testing/data-explorer.js +237 -265
- package/dist/testing/dev-test-routes.d.ts +2 -2
- package/dist/testing/dev-test-routes.d.ts.map +1 -1
- package/dist/testing/dev-test-routes.js +258 -249
- package/dist/testing/dev-vitest-manager.d.ts +1 -1
- package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
- package/dist/testing/dev-vitest-manager.js +514 -539
- package/dist/testing/faker-mappings.js +422 -420
- package/dist/testing/fixture-generator.d.ts +3 -3
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +1216 -1346
- package/dist/testing/fixture-loader.js +26 -25
- package/dist/testing/fixture-manager.d.ts +3 -3
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +706 -776
- package/dist/testing/global-setup.js +53 -49
- package/dist/testing/index.js +19 -11
- package/dist/testing/naite-vitest-reporter.js +18 -13
- package/dist/testing/parallel-db-manager.d.ts +1 -1
- package/dist/testing/parallel-db-manager.d.ts.map +1 -1
- package/dist/testing/parallel-db-manager.js +63 -78
- package/dist/testing/vitest-helpers.d.ts +1 -1
- package/dist/testing/vitest-helpers.d.ts.map +1 -1
- package/dist/testing/vitest-helpers.js +37 -33
- package/dist/types/types.d.ts +28 -28
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +764 -890
- package/dist/ui/ai-api.d.ts +1 -1
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +52 -42
- package/dist/ui/ai-client.d.ts +1 -2
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +353 -388
- package/dist/ui/api.d.ts +1 -1
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +903 -1145
- package/dist/ui/cdd-service.d.ts +1 -1
- package/dist/ui/cdd-service.d.ts.map +1 -1
- package/dist/ui/cdd-service.js +406 -407
- package/dist/ui/cdd-types.js +1 -3
- package/dist/ui-web/assets/index-C-Zz-wYg.css +1 -0
- package/dist/ui-web/assets/index-DejDON8K.js +238 -0
- package/dist/ui-web/index.html +3 -3
- package/dist/utils/async-utils.js +57 -45
- package/dist/utils/console-util.d.ts.map +1 -1
- package/dist/utils/console-util.js +104 -87
- package/dist/utils/controller.js +26 -19
- package/dist/utils/esm-utils.js +49 -38
- package/dist/utils/formatter.d.ts +1 -2
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +89 -115
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +68 -65
- package/dist/utils/lodash-able.js +11 -4
- package/dist/utils/model.d.ts +1 -1
- package/dist/utils/model.d.ts.map +1 -1
- package/dist/utils/model.js +21 -19
- package/dist/utils/object-utils.js +148 -186
- package/dist/utils/path-utils.js +67 -57
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +37 -31
- package/dist/utils/sql-parser.d.ts +1 -1
- package/dist/utils/sql-parser.d.ts.map +1 -1
- package/dist/utils/sql-parser.js +40 -40
- package/dist/utils/type-utils.js +44 -43
- package/dist/utils/utils.d.ts +2 -3
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +81 -93
- package/dist/utils/zod-error.d.ts +1 -1
- package/dist/utils/zod-error.d.ts.map +1 -1
- package/dist/utils/zod-error.js +24 -17
- package/dist/vector/chunking.d.ts +1 -1
- package/dist/vector/chunking.d.ts.map +1 -1
- package/dist/vector/chunking.js +100 -94
- package/dist/vector/config.d.ts +1 -1
- package/dist/vector/config.d.ts.map +1 -1
- package/dist/vector/config.js +76 -78
- package/dist/vector/embedding.d.ts +1 -1
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +128 -125
- package/dist/vector/index.js +5 -5
- package/dist/vector/types.js +1 -5
- package/package.json +31 -36
- package/src/ai/agents/agent.ts +12 -5
- package/src/ai/agents/types.ts +5 -5
- package/src/ai/providers/rtzr/model.ts +8 -10
- package/src/ai/providers/rtzr/options.ts +2 -1
- package/src/ai/providers/rtzr/provider.ts +5 -3
- package/src/ai/providers/rtzr/utils.ts +2 -7
- package/src/api/__tests__/config.test.ts +15 -8
- package/src/api/base-frame.ts +5 -3
- package/src/api/caster.ts +7 -6
- package/src/api/code-converters.ts +23 -26
- package/src/api/config.ts +23 -17
- package/src/api/context.ts +18 -11
- package/src/api/decorators.ts +17 -18
- package/src/api/sonamu.ts +44 -49
- package/src/auth/auth-generator.ts +4 -6
- package/src/auth/better-auth-entities.ts +3 -2
- package/src/auth/knex-adapter.ts +6 -5
- package/src/auth/plugins/entity-definitions/admin.ts +1 -1
- package/src/auth/plugins/entity-definitions/anonymous.ts +1 -1
- package/src/auth/plugins/entity-definitions/api-key.ts +1 -1
- package/src/auth/plugins/entity-definitions/index.ts +1 -1
- package/src/auth/plugins/entity-definitions/jwt.ts +1 -1
- package/src/auth/plugins/entity-definitions/organization.ts +1 -1
- package/src/auth/plugins/entity-definitions/passkey.ts +1 -1
- package/src/auth/plugins/entity-definitions/phone-number.ts +1 -1
- package/src/auth/plugins/entity-definitions/sso.ts +1 -1
- package/src/auth/plugins/entity-definitions/two-factor.ts +1 -1
- package/src/auth/plugins/entity-definitions/types.ts +1 -1
- package/src/auth/plugins/entity-definitions/username.ts +1 -1
- package/src/auth/plugins/wrappers/admin.ts +3 -1
- package/src/auth/plugins/wrappers/anonymous.ts +3 -1
- package/src/auth/plugins/wrappers/api-key.ts +3 -1
- package/src/auth/plugins/wrappers/jwt.ts +3 -1
- package/src/auth/plugins/wrappers/organization.ts +3 -1
- package/src/auth/plugins/wrappers/passkey.ts +3 -1
- package/src/auth/plugins/wrappers/phone-number.ts +3 -1
- package/src/auth/plugins/wrappers/sso.ts +2 -1
- package/src/auth/plugins/wrappers/two-factor.ts +3 -1
- package/src/auth/plugins/wrappers/username.ts +3 -1
- package/src/bin/__tests__/ts-loader-register.test.ts +7 -12
- package/src/bin/build-config.ts +3 -3
- package/src/bin/cli.ts +27 -25
- package/src/bin/fixture.ts +4 -2
- package/src/bin/hmr-hook-register.ts +1 -0
- package/src/bin/test-command.ts +4 -2
- package/src/bin/ts-loader-registration.ts +6 -22
- package/src/cache/cache-manager.ts +2 -1
- package/src/cache/decorator.ts +2 -2
- package/src/cache/types.ts +3 -3
- package/src/cache-control/cache-control.ts +3 -2
- package/src/cache-control/types.ts +2 -2
- package/src/compress/compress.ts +1 -1
- package/src/cone/cone-generator.ts +5 -3
- package/src/database/_batch_update.ts +1 -1
- package/src/database/base-model.ts +20 -14
- package/src/database/base-model.types.ts +12 -11
- package/src/database/db.ts +56 -21
- package/src/database/knex.ts +2 -2
- package/src/database/puri-subset.test-d.ts +33 -32
- package/src/database/puri-subset.types.ts +6 -7
- package/src/database/puri-wrapper.ts +29 -26
- package/src/database/puri.ts +36 -34
- package/src/database/puri.types.test-d.ts +6 -5
- package/src/database/puri.types.ts +9 -12
- package/src/database/transaction-context.ts +2 -2
- package/src/database/upsert-builder.ts +17 -10
- package/src/dict/sd.ts +17 -4
- package/src/dict/sonamu-dictionary.ts +23 -17
- package/src/entity/entity-manager.ts +9 -7
- package/src/entity/entity-template-cone.ts +10 -3
- package/src/entity/entity.ts +20 -16
- package/src/exceptions/error-handler.ts +2 -1
- package/src/exceptions/so-exceptions.ts +1 -1
- package/src/filter/utils.ts +3 -2
- package/src/logger/category.ts +1 -0
- package/src/logger/configure.ts +5 -5
- package/src/migration/__tests__/code-generation.search-text.test.ts +2 -3
- package/src/migration/code-generation.ts +26 -25
- package/src/migration/migration-set.ts +16 -18
- package/src/migration/migrator.ts +38 -33
- package/src/migration/postgresql-schema-reader.ts +12 -12
- package/src/migration/slack-confirm.ts +5 -4
- package/src/migration/types.ts +2 -2
- package/src/naite/messaging-types.ts +1 -1
- package/src/naite/naite-reporter.ts +5 -3
- package/src/naite/naite.ts +12 -7
- package/src/shared/app.shared.ts.txt +2 -2
- package/src/shared/web.shared.ts.txt +2 -2
- package/src/skills/AGENTS.md +19 -18
- package/src/skills/commands/sonamu-skills.md +9 -9
- package/src/skills/sonamu/SKILL.md +111 -104
- package/src/skills/sonamu/ai-agents.md +27 -26
- package/src/skills/sonamu/api.md +81 -69
- package/src/skills/sonamu/auth-migration.md +13 -27
- package/src/skills/sonamu/auth-plugins.md +41 -31
- package/src/skills/sonamu/auth.md +30 -24
- package/src/skills/sonamu/cdd.md +26 -17
- package/src/skills/sonamu/cone.md +50 -50
- package/src/skills/sonamu/config.md +74 -51
- package/src/skills/sonamu/create-sonamu.md +31 -19
- package/src/skills/sonamu/database.md +43 -26
- package/src/skills/sonamu/entity-basic.md +61 -61
- package/src/skills/sonamu/entity-relations.md +84 -80
- package/src/skills/sonamu/entity-validation-checklist.md +19 -15
- package/src/skills/sonamu/fixture-cli.md +52 -30
- package/src/skills/sonamu/framework-change.md +9 -7
- package/src/skills/sonamu/frontend.md +64 -82
- package/src/skills/sonamu/i18n.md +45 -37
- package/src/skills/sonamu/migration.md +54 -31
- package/src/skills/sonamu/model.md +98 -66
- package/src/skills/sonamu/naite.md +34 -32
- package/src/skills/sonamu/project-init.md +28 -8
- package/src/skills/sonamu/puri.md +82 -91
- package/src/skills/sonamu/scaffolding.md +44 -32
- package/src/skills/sonamu/skill-contribution.md +50 -45
- package/src/skills/sonamu/subset.md +13 -13
- package/src/skills/sonamu/tasks.md +73 -58
- package/src/skills/sonamu/testing-devrunner.md +56 -36
- package/src/skills/sonamu/testing.md +23 -58
- package/src/skills/sonamu/upsert.md +32 -31
- package/src/skills/sonamu/vector.md +37 -36
- package/src/ssr/index.ts +2 -12
- package/src/ssr/registry.ts +1 -1
- package/src/ssr/renderer.ts +7 -5
- package/src/ssr/types.ts +2 -2
- package/src/storage/buffered-file.ts +4 -2
- package/src/storage/drivers.ts +3 -2
- package/src/storage/s3-driver.ts +7 -4
- package/src/storage/storage-manager.ts +3 -2
- package/src/storage/types.ts +3 -2
- package/src/storage/uploaded-file.ts +1 -1
- package/src/stream/sse.ts +2 -2
- package/src/syncer/api-parser.ts +8 -5
- package/src/syncer/checksum.ts +9 -5
- package/src/syncer/code-generator.ts +16 -8
- package/src/syncer/entity-operations.ts +5 -3
- package/src/syncer/file-patterns.ts +2 -1
- package/src/syncer/module-loader.ts +9 -6
- package/src/syncer/syncer-actions.ts +5 -3
- package/src/syncer/syncer.ts +18 -24
- package/src/tasks/decorator.ts +10 -8
- package/src/tasks/step-wrapper.ts +1 -1
- package/src/tasks/workflow-manager.ts +18 -15
- package/src/template/__tests__/generated.template.search-text.test.ts +1 -0
- package/src/template/entity-converter.ts +4 -2
- package/src/template/generated.template.test-d.ts +2 -1
- package/src/template/helpers.ts +5 -2
- package/src/template/implementations/entity.template.ts +9 -8
- package/src/template/implementations/entry-server.template.ts +1 -1
- package/src/template/implementations/generated.template.ts +21 -29
- package/src/template/implementations/generated_http.template.ts +9 -6
- package/src/template/implementations/generated_sso.template.ts +6 -4
- package/src/template/implementations/init_types.template.ts +3 -2
- package/src/template/implementations/model.template.ts +4 -2
- package/src/template/implementations/model_test.template.ts +3 -2
- package/src/template/implementations/queries.template.ts +6 -14
- package/src/template/implementations/sd.template.ts +4 -2
- package/src/template/implementations/services.template.ts +7 -11
- package/src/template/implementations/view_form.template.ts +5 -3
- package/src/template/implementations/view_id_all_select.template.ts +3 -2
- package/src/template/implementations/view_list.template.ts +7 -5
- package/src/template/implementations/view_search_input.template.ts +3 -2
- package/src/template/template-manager.ts +4 -3
- package/src/template/template.ts +4 -3
- package/src/template/zod-converter.ts +10 -7
- package/src/testing/__tests__/dev-test-routes.test.ts +3 -2
- package/src/testing/__tests__/dev-vitest-manager.test.ts +1 -0
- package/src/testing/_relation-graph.ts +2 -2
- package/src/testing/bootstrap.ts +55 -27
- package/src/testing/data-explorer.ts +5 -4
- package/src/testing/dev-test-routes.ts +8 -5
- package/src/testing/dev-vitest-manager.ts +13 -12
- package/src/testing/fixture-generator.ts +11 -17
- package/src/testing/fixture-manager.ts +21 -17
- package/src/testing/parallel-db-manager.ts +2 -1
- package/src/testing/vitest-helpers.ts +2 -1
- package/src/types/__tests__/entity-json-schema-search-text.test.ts +1 -0
- package/src/types/types.ts +8 -8
- package/src/typings/knex.d.ts +4 -4
- package/src/ui/ai-api.ts +5 -3
- package/src/ui/ai-client.ts +6 -5
- package/src/ui/api.ts +25 -23
- package/src/ui/cdd-service.ts +12 -11
- package/src/utils/console-util.ts +3 -1
- package/src/utils/formatter.ts +94 -102
- package/src/utils/fs-utils.ts +2 -1
- package/src/utils/model.ts +2 -2
- package/src/utils/object-utils.ts +3 -3
- package/src/utils/process-utils.ts +2 -1
- package/src/utils/sql-parser.ts +10 -1
- package/src/utils/type-utils.ts +3 -3
- package/src/utils/utils.ts +9 -7
- package/src/utils/zod-error.ts +1 -1
- package/src/vector/chunking.ts +1 -1
- package/src/vector/config.ts +1 -1
- package/src/vector/embedding.ts +11 -9
- package/tsdown.api.config.ts +50 -0
- package/.swcrc.project-default +0 -18
- package/dist/api/__tests__/config.test.js +0 -189
- package/dist/bin/__tests__/test-command.test.js +0 -112
- package/dist/bin/__tests__/ts-loader-register.test.js +0 -45
- package/dist/database/puri-subset.test-d.js +0 -89
- package/dist/database/puri.types.test-d.js +0 -129
- package/dist/migration/__tests__/code-generation.search-text.test.js +0 -435
- package/dist/template/__tests__/generated.template.search-text.test.js +0 -99
- package/dist/template/generated.template.test-d.js +0 -24
- package/dist/testing/__tests__/dev-test-routes.test.js +0 -144
- package/dist/testing/__tests__/dev-vitest-manager.test.js +0 -152
- package/dist/types/__tests__/entity-json-schema-search-text.test.js +0 -256
- package/dist/typings/knex.d.js +0 -3
- package/dist/ui-web/assets/index-CKo0Z2Iu.css +0 -1
- package/dist/ui-web/assets/index-DK-2aacv.js +0 -257
|
@@ -1,228 +1,214 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { init_utils, nonNullable } from "../../utils/utils.js";
|
|
2
|
+
import { Sonamu } from "../../api/sonamu.js";
|
|
3
|
+
import { init_types, isVirtualCodeProp, isVirtualQueryProp } from "../../types/types.js";
|
|
4
|
+
import { EntityManager, init_entity_manager } from "../../entity/entity-manager.js";
|
|
5
|
+
import { Naite, init_naite } from "../../naite/naite.js";
|
|
6
|
+
import { init_api } from "../../api/index.js";
|
|
7
|
+
import { Template, init_template } from "../template.js";
|
|
8
|
+
import { BUILT_IN_TYPES, init_zod_converter, propNodeToZodTypeDef, zodTypeToZodCode } from "../zod-converter.js";
|
|
2
9
|
import { unique } from "radashi";
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
const propNodes = filterProps.map((prop)=>{
|
|
206
|
-
return {
|
|
207
|
-
nodeType: "plain",
|
|
208
|
-
prop,
|
|
209
|
-
children: []
|
|
210
|
-
};
|
|
211
|
-
});
|
|
212
|
-
const importKeys = [];
|
|
213
|
-
const filterBody = propNodes.map((propNode)=>propNodeToZodTypeDef(propNode, importKeys)).join("\n");
|
|
214
|
-
// FilterQuery 타입을 위한 제외할 props 추출 (virtual만 제외)
|
|
215
|
-
const excludedProps = entity.props.filter((p)=>p.type === "virtual").map((p)=>p.name);
|
|
216
|
-
// numeric 타입인 props 추출
|
|
217
|
-
const numericProps = entity.props.filter((p)=>p.type === "numeric");
|
|
218
|
-
// ApplySonamuFilter 타입 인자 생성
|
|
219
|
-
const entityType = `${entity.id}BaseSchema`;
|
|
220
|
-
const numericKeysUnion = numericProps.length > 0 ? numericProps.map((prop)=>`"${prop.name}"`).join(" | ") : "never";
|
|
221
|
-
const omitKeysUnion = excludedProps.length > 0 ? excludedProps.map((n)=>`"${n}"`).join(" | ") : "never";
|
|
222
|
-
// PK 타입에 따른 id Zod 타입 결정
|
|
223
|
-
const pkType = entity.getPkType();
|
|
224
|
-
const idZodType = pkType === "string" || pkType === "uuid" ? "zArrayable(z.string())" : "zArrayable(z.number().int().positive())";
|
|
225
|
-
const schemaBody = `
|
|
10
|
+
import assert from "assert";
|
|
11
|
+
|
|
12
|
+
//#region src/template/implementations/generated.template.ts
|
|
13
|
+
init_api();
|
|
14
|
+
init_entity_manager();
|
|
15
|
+
init_naite();
|
|
16
|
+
init_types();
|
|
17
|
+
init_utils();
|
|
18
|
+
init_template();
|
|
19
|
+
init_zod_converter();
|
|
20
|
+
var Template__generated = class extends Template {
|
|
21
|
+
constructor() {
|
|
22
|
+
super("generated");
|
|
23
|
+
}
|
|
24
|
+
getTargetAndPath() {
|
|
25
|
+
const { dir } = Sonamu.config.api;
|
|
26
|
+
return {
|
|
27
|
+
target: `${dir}/src/application`,
|
|
28
|
+
path: `sonamu.generated.ts`
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
render() {
|
|
32
|
+
const entityIds = EntityManager.getAllIds();
|
|
33
|
+
const entities = entityIds.map((id) => EntityManager.get(id));
|
|
34
|
+
const sourceCodes = entities.flatMap((entity) => {
|
|
35
|
+
return [
|
|
36
|
+
this.getEnumsSourceCode(entity),
|
|
37
|
+
this.getBaseSchemaSourceCode(entity),
|
|
38
|
+
this.getBaseListParamsSourceCode(entity),
|
|
39
|
+
this.getSubsetSourceCode(entity)
|
|
40
|
+
].filter(nonNullable);
|
|
41
|
+
});
|
|
42
|
+
Naite.t("Template__generated:sourceCodes", sourceCodes);
|
|
43
|
+
const LABEL_KEY_ORDER = [
|
|
44
|
+
"Enums",
|
|
45
|
+
"BaseSchema",
|
|
46
|
+
"BaseListParams",
|
|
47
|
+
"Subsets",
|
|
48
|
+
"SubsetQueries"
|
|
49
|
+
];
|
|
50
|
+
sourceCodes.sort((a, b) => {
|
|
51
|
+
const [aKey] = a.label.split(":");
|
|
52
|
+
const [bKey] = b.label.split(":");
|
|
53
|
+
const aIndex = LABEL_KEY_ORDER.indexOf(aKey);
|
|
54
|
+
const bIndex = LABEL_KEY_ORDER.indexOf(bKey);
|
|
55
|
+
if (aIndex > bIndex) {
|
|
56
|
+
return 1;
|
|
57
|
+
} else if (aIndex < bIndex) {
|
|
58
|
+
return -1;
|
|
59
|
+
} else {
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
const sourceCode = sourceCodes.reduce((result, ts) => {
|
|
64
|
+
if (ts === null) {
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
lines: [
|
|
69
|
+
...result.lines,
|
|
70
|
+
`// ${ts.label}`,
|
|
71
|
+
...ts.lines,
|
|
72
|
+
""
|
|
73
|
+
],
|
|
74
|
+
importKeys: unique([...result.importKeys, ...ts.importKeys].toSorted())
|
|
75
|
+
};
|
|
76
|
+
}, {
|
|
77
|
+
lines: [],
|
|
78
|
+
importKeys: []
|
|
79
|
+
});
|
|
80
|
+
const allTypeKeys = entities.flatMap((entity) => Object.keys(entity.types));
|
|
81
|
+
const cdImportKeys = sourceCode.importKeys.filter((importKey) => allTypeKeys.includes(importKey));
|
|
82
|
+
if (cdImportKeys.length > 0) {
|
|
83
|
+
const customScalarLines = cdImportKeys.flatMap((importKey) => {
|
|
84
|
+
const entity = entities.find((entity$1) => entity$1.types[importKey]);
|
|
85
|
+
if (!entity) {
|
|
86
|
+
throw new Error(`ZodType not found ${importKey}`);
|
|
87
|
+
}
|
|
88
|
+
const zodType = entity.types[importKey];
|
|
89
|
+
assert(zodType);
|
|
90
|
+
return [
|
|
91
|
+
`// CustomScalar: ${importKey}`,
|
|
92
|
+
`const ${importKey} = ${zodTypeToZodCode(zodType)};`,
|
|
93
|
+
`type ${importKey} = z.infer<typeof ${importKey}>`,
|
|
94
|
+
""
|
|
95
|
+
];
|
|
96
|
+
});
|
|
97
|
+
sourceCode.lines = [...customScalarLines, ...sourceCode.lines];
|
|
98
|
+
sourceCode.importKeys = sourceCode.importKeys.filter((importKey) => !cdImportKeys.includes(importKey));
|
|
99
|
+
}
|
|
100
|
+
const body = sourceCode.lines.join("\n");
|
|
101
|
+
Naite.t("Template__generated:body", body);
|
|
102
|
+
const builtInSchemaNames = Object.values(BUILT_IN_TYPES).map((info) => info.schemaName);
|
|
103
|
+
const builtInSchemas = sourceCode.importKeys.filter((key) => builtInSchemaNames.includes(key));
|
|
104
|
+
const sonamuImports = [
|
|
105
|
+
"zArrayable",
|
|
106
|
+
"SQLDateTimeString",
|
|
107
|
+
"SubsetQuery",
|
|
108
|
+
"SonamuQueryMode",
|
|
109
|
+
"ApplySonamuFilter",
|
|
110
|
+
...builtInSchemas
|
|
111
|
+
].filter((mod) => body.includes(mod));
|
|
112
|
+
return {
|
|
113
|
+
...this.getTargetAndPath(),
|
|
114
|
+
body,
|
|
115
|
+
importKeys: sourceCode.importKeys,
|
|
116
|
+
customHeaders: [
|
|
117
|
+
"/**",
|
|
118
|
+
" * @generated",
|
|
119
|
+
" * 직접 수정하지 마세요.",
|
|
120
|
+
" */",
|
|
121
|
+
"/* oxlint-disable */",
|
|
122
|
+
"",
|
|
123
|
+
`import { z } from 'zod';`,
|
|
124
|
+
`import { ${sonamuImports.join(",")} } from "sonamu";`
|
|
125
|
+
]
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
getEnumsSourceCode(entity) {
|
|
129
|
+
if (Object.keys(entity.enumLabels).length === 0) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
label: `Enums: ${entity.id}`,
|
|
134
|
+
lines: Object.entries(entity.enumLabels).filter(([_, enumLabel]) => Object.keys(enumLabel).length > 0).flatMap(([enumId, enumLabel]) => [
|
|
135
|
+
`export const ${enumId} = z.enum([${Object.keys(enumLabel).map((el) => `"${el}"`)}]).describe("${enumId}");`,
|
|
136
|
+
`export type ${enumId} = z.infer<typeof ${enumId}>;`,
|
|
137
|
+
`export const ${enumId}Label = ${JSON.stringify(enumLabel)};`
|
|
138
|
+
]),
|
|
139
|
+
importKeys: []
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
getBaseSchemaSourceCode(entity, importKeys = []) {
|
|
143
|
+
const schemaName = `${entity.names.module}BaseSchema`;
|
|
144
|
+
const propNode = {
|
|
145
|
+
nodeType: "object",
|
|
146
|
+
children: entity.props.map((prop) => {
|
|
147
|
+
return {
|
|
148
|
+
nodeType: "plain",
|
|
149
|
+
prop
|
|
150
|
+
};
|
|
151
|
+
})
|
|
152
|
+
};
|
|
153
|
+
const schemaBody = (() => {
|
|
154
|
+
const result = propNodeToZodTypeDef(propNode, importKeys);
|
|
155
|
+
if (result.endsWith(",")) {
|
|
156
|
+
return result.slice(0, -1);
|
|
157
|
+
}
|
|
158
|
+
return result;
|
|
159
|
+
})();
|
|
160
|
+
const fulltextColumns = [];
|
|
161
|
+
const virtualProps = entity.props.filter((prop) => isVirtualCodeProp(prop)).map((prop) => prop.name);
|
|
162
|
+
const virtualQueryProps = entity.props.filter((prop) => isVirtualQueryProp(prop)).map((prop) => prop.name);
|
|
163
|
+
/**
|
|
164
|
+
* hasDefault props
|
|
165
|
+
* - nullable 또는 dbDefault가 있는 컬럼 (id 포함)
|
|
166
|
+
* - relation이 아니거나, relation이어도 nullable이면 포함
|
|
167
|
+
*/
|
|
168
|
+
const hasDefaultColumns = entity.props.filter((prop) => (prop.type !== "relation" || prop.nullable === true) && (prop.nullable === true || prop.type !== "relation" && prop.dbDefault !== undefined)).map((prop) => prop.type === "relation" ? `${prop.name}_id` : prop.name).concat("id");
|
|
169
|
+
/**
|
|
170
|
+
* hasVector props
|
|
171
|
+
* - vector 타입인 컬럼
|
|
172
|
+
*/
|
|
173
|
+
const hasVectorColumns = entity.props.filter((prop) => prop.type === "vector" || prop.type === "vector[]").map((prop) => prop.name);
|
|
174
|
+
/**
|
|
175
|
+
* generated props
|
|
176
|
+
* - generated 속성이 있는 컬럼 (INSERT/UPDATE 시 값 제공 불가)
|
|
177
|
+
*/
|
|
178
|
+
const generatedColumns = entity.props.filter((prop) => prop.type !== "relation" && (prop.generated !== undefined || prop.type === "searchText")).map((prop) => prop.name);
|
|
179
|
+
const hasMetadata = fulltextColumns.length > 0 || virtualProps.length > 0 || virtualQueryProps.length > 0 || hasDefaultColumns.length > 0 || generatedColumns.length > 0 || hasVectorColumns.length > 0;
|
|
180
|
+
const lines = [`export const ${schemaName} = ${schemaBody};`, `export type ${schemaName} = z.infer<typeof ${schemaName}>` + (hasMetadata ? ` & {${(fulltextColumns.length > 0 ? `readonly __fulltext__: readonly [${fulltextColumns.map((col) => `"${col}"`).join(", ")}],` : "") + (virtualProps.length > 0 ? `readonly __virtual__: readonly [${virtualProps.map((prop) => `"${prop}"`).join(", ")}],` : "") + (virtualQueryProps.length > 0 ? `readonly __virtual_query__: readonly [${virtualQueryProps.map((prop) => `"${prop}"`).join(", ")}],` : "") + (hasDefaultColumns.length > 0 ? `readonly __hasDefault__: readonly [${hasDefaultColumns.map((col) => `"${col}"`).join(", ")}],` : "") + (generatedColumns.length > 0 ? `readonly __generated__: readonly [${generatedColumns.map((col) => `"${col}"`).join(", ")}],` : "") + (hasVectorColumns.length > 0 ? `readonly __vector__: readonly [${hasVectorColumns.map((col) => `"${col}"`).join(", ")}],` : "")}}` : "") + ";"];
|
|
181
|
+
return {
|
|
182
|
+
label: `BaseSchema: ${entity.id}`,
|
|
183
|
+
importKeys,
|
|
184
|
+
lines
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
getBaseListParamsSourceCode(entity) {
|
|
188
|
+
if (entity.props.length === 0) {
|
|
189
|
+
return null;
|
|
190
|
+
} else if (entity.parentId !== undefined) {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
const schemaName = `${entity.names.module}BaseListParams`;
|
|
194
|
+
const filterProps = entity.props.filter((prop) => prop.toFilter === true);
|
|
195
|
+
const propNodes = filterProps.map((prop) => {
|
|
196
|
+
return {
|
|
197
|
+
nodeType: "plain",
|
|
198
|
+
prop,
|
|
199
|
+
children: []
|
|
200
|
+
};
|
|
201
|
+
});
|
|
202
|
+
const importKeys = [];
|
|
203
|
+
const filterBody = propNodes.map((propNode) => propNodeToZodTypeDef(propNode, importKeys)).join("\n");
|
|
204
|
+
const excludedProps = entity.props.filter((p) => p.type === "virtual").map((p) => p.name);
|
|
205
|
+
const numericProps = entity.props.filter((p) => p.type === "numeric");
|
|
206
|
+
const entityType = `${entity.id}BaseSchema`;
|
|
207
|
+
const numericKeysUnion = numericProps.length > 0 ? numericProps.map((prop) => `"${prop.name}"`).join(" | ") : "never";
|
|
208
|
+
const omitKeysUnion = excludedProps.length > 0 ? excludedProps.map((n) => `"${n}"`).join(" | ") : "never";
|
|
209
|
+
const pkType = entity.getPkType();
|
|
210
|
+
const idZodType = pkType === "string" || pkType === "uuid" ? "zArrayable(z.string())" : "zArrayable(z.number().int().positive())";
|
|
211
|
+
const schemaBody = `
|
|
226
212
|
z.object({
|
|
227
213
|
num: z.number().int().nonnegative(),
|
|
228
214
|
page: z.number().int().min(1),
|
|
@@ -234,55 +220,48 @@ z.object({
|
|
|
234
220
|
sonamuFilter: z.custom<ApplySonamuFilter<${entityType}, ${omitKeysUnion}, ${numericKeysUnion}>>(),${filterBody}
|
|
235
221
|
}).partial();
|
|
236
222
|
`.trim();
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
""
|
|
279
|
-
];
|
|
280
|
-
return {
|
|
281
|
-
label: `Subsets: ${entity.id}`,
|
|
282
|
-
lines,
|
|
283
|
-
importKeys: unique(importKeys)
|
|
284
|
-
};
|
|
285
|
-
}
|
|
286
|
-
}
|
|
223
|
+
const lines = [`export const ${schemaName} = ${schemaBody};`, `export type ${schemaName} = z.infer<typeof ${schemaName}>;`];
|
|
224
|
+
return {
|
|
225
|
+
label: `BaseListParams: ${entity.id}`,
|
|
226
|
+
importKeys,
|
|
227
|
+
lines
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
getSubsetSourceCode(entity) {
|
|
231
|
+
if (Object.keys(entity.subsets).length === 0) {
|
|
232
|
+
return null;
|
|
233
|
+
} else if (entity.parentId !== undefined) {
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
const subsetKeys = Object.keys(entity.subsets);
|
|
237
|
+
const importKeys = [];
|
|
238
|
+
const lines = [
|
|
239
|
+
...subsetKeys.flatMap((subsetKey) => {
|
|
240
|
+
const fieldExprs = entity.subsets[subsetKey];
|
|
241
|
+
const propNodes = entity.fieldExprsToPropNodes(fieldExprs);
|
|
242
|
+
const schemaName = `${entity.names.module}Subset${subsetKey}`;
|
|
243
|
+
const propNode = {
|
|
244
|
+
nodeType: "object",
|
|
245
|
+
children: propNodes
|
|
246
|
+
};
|
|
247
|
+
const body = propNodeToZodTypeDef(propNode, importKeys);
|
|
248
|
+
return [`export const ${schemaName} = ${body.replace(/,$/, "")};`, `export type ${schemaName} = z.infer<typeof ${schemaName}>;`];
|
|
249
|
+
}),
|
|
250
|
+
`export type ${entity.names.module}SubsetMapping = {`,
|
|
251
|
+
...subsetKeys.map((subsetKey) => ` ${subsetKey}: ${entity.names.module}Subset${subsetKey};`),
|
|
252
|
+
"};",
|
|
253
|
+
`export const ${entity.names.module}SubsetKey = z.enum([${subsetKeys.map((k) => `"${k}"`).join(",")}]);`,
|
|
254
|
+
`export type ${entity.names.module}SubsetKey = z.infer<typeof ${entity.names.module}SubsetKey>;`,
|
|
255
|
+
""
|
|
256
|
+
];
|
|
257
|
+
return {
|
|
258
|
+
label: `Subsets: ${entity.id}`,
|
|
259
|
+
lines,
|
|
260
|
+
importKeys: unique(importKeys)
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
};
|
|
287
264
|
|
|
288
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvZ2VuZXJhdGVkLnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi8uLi9hcGlcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi8uLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBFbnRpdHlJbmRleCxcbiAgdHlwZSBFbnRpdHlQcm9wTm9kZSxcbiAgaXNWaXJ0dWFsQ29kZVByb3AsXG4gIGlzVmlydHVhbFF1ZXJ5UHJvcCxcbn0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBub25OdWxsYWJsZSB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tIFwiLi4vdGVtcGxhdGVcIjtcbmltcG9ydCB7IEJVSUxUX0lOX1RZUEVTLCBwcm9wTm9kZVRvWm9kVHlwZURlZiwgem9kVHlwZVRvWm9kQ29kZSB9IGZyb20gXCIuLi96b2QtY29udmVydGVyXCI7XG5cbmV4cG9ydCB0eXBlIFNvdXJjZUNvZGUgPSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGxpbmVzOiBzdHJpbmdbXTtcbiAgaW1wb3J0S2V5czogc3RyaW5nW107XG59O1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19nZW5lcmF0ZWQgZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiZ2VuZXJhdGVkXCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aCgpIHtcbiAgICBjb25zdCB7IGRpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogYCR7ZGlyfS9zcmMvYXBwbGljYXRpb25gLFxuICAgICAgcGF0aDogYHNvbmFtdS5nZW5lcmF0ZWQudHNgLFxuICAgIH07XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgY29uc3QgZW50aXRpZXMgPSBlbnRpdHlJZHMubWFwKChpZCkgPT4gRW50aXR5TWFuYWdlci5nZXQoaWQpKTtcblxuICAgIC8vIOyghOyytCBTb3VyY2VDb2RlIOyDneyEsVxuICAgIGNvbnN0IHNvdXJjZUNvZGVzID0gZW50aXRpZXMuZmxhdE1hcCgoZW50aXR5KSA9PiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB0aGlzLmdldEVudW1zU291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgICB0aGlzLmdldEJhc2VTY2hlbWFTb3VyY2VDb2RlKGVudGl0eSksXG4gICAgICAgIHRoaXMuZ2V0QmFzZUxpc3RQYXJhbXNTb3VyY2VDb2RlKGVudGl0eSksXG4gICAgICAgIHRoaXMuZ2V0U3Vic2V0U291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgXS5maWx0ZXIobm9uTnVsbGFibGUpO1xuICAgIH0pO1xuICAgIE5haXRlLnQoXCJUZW1wbGF0ZV9fZ2VuZXJhdGVkOnNvdXJjZUNvZGVzXCIsIHNvdXJjZUNvZGVzKTtcblxuICAgIC8vIFNvcnRcbiAgICBjb25zdCBMQUJFTF9LRVlfT1JERVIgPSBbXCJFbnVtc1wiLCBcIkJhc2VTY2hlbWFcIiwgXCJCYXNlTGlzdFBhcmFtc1wiLCBcIlN1YnNldHNcIiwgXCJTdWJzZXRRdWVyaWVzXCJdO1xuICAgIHNvdXJjZUNvZGVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IFthS2V5XSA9IGEubGFiZWwuc3BsaXQoXCI6XCIpO1xuICAgICAgY29uc3QgW2JLZXldID0gYi5sYWJlbC5zcGxpdChcIjpcIik7XG4gICAgICBjb25zdCBhSW5kZXggPSBMQUJFTF9LRVlfT1JERVIuaW5kZXhPZihhS2V5KTtcbiAgICAgIGNvbnN0IGJJbmRleCA9IExBQkVMX0tFWV9PUkRFUi5pbmRleE9mKGJLZXkpO1xuICAgICAgaWYgKGFJbmRleCA+IGJJbmRleCkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSBpZiAoYUluZGV4IDwgYkluZGV4KSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgc291cmNlQ29kZSA9IHNvdXJjZUNvZGVzLnJlZHVjZShcbiAgICAgIChyZXN1bHQsIHRzKSA9PiB7XG4gICAgICAgIGlmICh0cyA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lczogWy4uLnJlc3VsdC5saW5lcywgYC8vICR7dHMubGFiZWx9YCwgLi4udHMubGluZXMsIFwiXCJdLFxuICAgICAgICAgIGltcG9ydEtleXM6IHVuaXF1ZShbLi4ucmVzdWx0LmltcG9ydEtleXMsIC4uLnRzLmltcG9ydEtleXNdLnNvcnQoKSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsaW5lczogW10sXG4gICAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgfSBhcyBPbWl0PFNvdXJjZUNvZGUsIFwibGFiZWxcIj4sXG4gICAgKTtcblxuICAgIC8vIC50eXBlcy50c+ydmCDtg4DsnoXsnYQg7LC47KGw7ZWY64qUIOqyveyasCDsiJztmZjssLjsobAo7IOB7Zi47LC47KGwKeqwgCDrsJzsg53tlZjrr4DroZwg7YOA7J6F7J2EIOqwgOyguOyZgCDsnbjrnbzsnbgg7LKY66asXG4gICAgY29uc3QgYWxsVHlwZUtleXMgPSBlbnRpdGllcy5mbGF0TWFwKChlbnRpdHkpID0+IE9iamVjdC5rZXlzKGVudGl0eS50eXBlcykpO1xuICAgIGNvbnN0IGNkSW1wb3J0S2V5cyA9IHNvdXJjZUNvZGUuaW1wb3J0S2V5cy5maWx0ZXIoKGltcG9ydEtleSkgPT5cbiAgICAgIGFsbFR5cGVLZXlzLmluY2x1ZGVzKGltcG9ydEtleSksXG4gICAgKTtcbiAgICBpZiAoY2RJbXBvcnRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1c3RvbVNjYWxhckxpbmVzID0gY2RJbXBvcnRLZXlzLmZsYXRNYXAoKGltcG9ydEtleSkgPT4ge1xuICAgICAgICBjb25zdCBlbnRpdHkgPSBlbnRpdGllcy5maW5kKChlbnRpdHkpID0+IGVudGl0eS50eXBlc1tpbXBvcnRLZXldKTtcbiAgICAgICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFpvZFR5cGUgbm90IGZvdW5kICR7aW1wb3J0S2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHpvZFR5cGUgPSBlbnRpdHkudHlwZXNbaW1wb3J0S2V5XTtcbiAgICAgICAgYXNzZXJ0KHpvZFR5cGUpO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgYC8vIEN1c3RvbVNjYWxhcjogJHtpbXBvcnRLZXl9YCxcbiAgICAgICAgICBgY29uc3QgJHtpbXBvcnRLZXl9ID0gJHt6b2RUeXBlVG9ab2RDb2RlKHpvZFR5cGUpfTtgLFxuICAgICAgICAgIGB0eXBlICR7aW1wb3J0S2V5fSA9IHouaW5mZXI8dHlwZW9mICR7aW1wb3J0S2V5fT5gLFxuICAgICAgICAgIFwiXCIsXG4gICAgICAgIF07XG4gICAgICB9KTtcbiAgICAgIHNvdXJjZUNvZGUubGluZXMgPSBbLi4uY3VzdG9tU2NhbGFyTGluZXMsIC4uLnNvdXJjZUNvZGUubGluZXNdO1xuICAgICAgc291cmNlQ29kZS5pbXBvcnRLZXlzID0gc291cmNlQ29kZS5pbXBvcnRLZXlzLmZpbHRlcihcbiAgICAgICAgKGltcG9ydEtleSkgPT4gIWNkSW1wb3J0S2V5cy5pbmNsdWRlcyhpbXBvcnRLZXkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5ID0gc291cmNlQ29kZS5saW5lcy5qb2luKFwiXFxuXCIpO1xuICAgIE5haXRlLnQoXCJUZW1wbGF0ZV9fZ2VuZXJhdGVkOmJvZHlcIiwgYm9keSk7XG5cbiAgICAvLyBpbXBvcnRcbiAgICAvLyBzb3VyY2VDb2RlLmltcG9ydEtleXPsl5Ag64K07J6lIO2DgOyeheydmCDsiqTtgqTrp4jqsIAg7J6I7Jy866m0IHNvbmFtdSBpbXBvcnTsl5Ag7LaU6rCAXG4gICAgY29uc3QgYnVpbHRJblNjaGVtYU5hbWVzID0gT2JqZWN0LnZhbHVlcyhCVUlMVF9JTl9UWVBFUykubWFwKFxuICAgICAgKGluZm8pID0+IGluZm8uc2NoZW1hTmFtZSBhcyBzdHJpbmcsXG4gICAgKTtcbiAgICBjb25zdCBidWlsdEluU2NoZW1hcyA9IHNvdXJjZUNvZGUuaW1wb3J0S2V5cy5maWx0ZXIoKGtleSkgPT4gYnVpbHRJblNjaGVtYU5hbWVzLmluY2x1ZGVzKGtleSkpO1xuICAgIGNvbnN0IHNvbmFtdUltcG9ydHMgPSBbXG4gICAgICBcInpBcnJheWFibGVcIixcbiAgICAgIFwiU1FMRGF0ZVRpbWVTdHJpbmdcIixcbiAgICAgIFwiU3Vic2V0UXVlcnlcIixcbiAgICAgIFwiU29uYW11UXVlcnlNb2RlXCIsXG4gICAgICBcIkFwcGx5U29uYW11RmlsdGVyXCIsXG4gICAgICAuLi5idWlsdEluU2NoZW1hcyxcbiAgICBdLmZpbHRlcigobW9kKSA9PiBib2R5LmluY2x1ZGVzKG1vZCkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aCgpLFxuICAgICAgYm9keSxcbiAgICAgIGltcG9ydEtleXM6IHNvdXJjZUNvZGUuaW1wb3J0S2V5cyxcbiAgICAgIGN1c3RvbUhlYWRlcnM6IFtcbiAgICAgICAgXCIvKipcIixcbiAgICAgICAgXCIgKiBAZ2VuZXJhdGVkXCIsXG4gICAgICAgIFwiICog7KeB7KCRIOyImOygle2VmOyngCDrp4jshLjsmpQuXCIsXG4gICAgICAgIFwiICovXCIsXG4gICAgICAgIFwiLyoqIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVk64qUIOustOyLnCAqL1wiLFxuICAgICAgICBcIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGFzc2lzdDogZ2VuZXJhdGVk64qUIOustOyLnCAqL1wiLFxuICAgICAgICBcIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGZvcm1hdDogZ2VuZXJhdGVk64qUIOustOyLnCAqL1wiLFxuICAgICAgICBcIlwiLFxuICAgICAgICBgaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7YCxcbiAgICAgICAgYGltcG9ydCB7ICR7c29uYW11SW1wb3J0cy5qb2luKFwiLFwiKX0gfSBmcm9tIFwic29uYW11XCI7YCxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGdldEVudW1zU291cmNlQ29kZShlbnRpdHk6IEVudGl0eSk6IFNvdXJjZUNvZGUgfCBudWxsIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYEVudW1zOiAke2VudGl0eS5pZH1gLFxuICAgICAgbGluZXM6IFtcbiAgICAgICAgLi4uT2JqZWN0LmVudHJpZXMoZW50aXR5LmVudW1MYWJlbHMpXG4gICAgICAgICAgLmZpbHRlcigoW18sIGVudW1MYWJlbF0pID0+IE9iamVjdC5rZXlzKGVudW1MYWJlbCkubGVuZ3RoID4gMClcbiAgICAgICAgICAuZmxhdE1hcCgoW2VudW1JZCwgZW51bUxhYmVsXSkgPT4gW1xuICAgICAgICAgICAgYGV4cG9ydCBjb25zdCAke2VudW1JZH0gPSB6LmVudW0oWyR7T2JqZWN0LmtleXMoZW51bUxhYmVsKS5tYXAoXG4gICAgICAgICAgICAgIChlbCkgPT4gYFwiJHtlbH1cImAsXG4gICAgICAgICAgICApfV0pLmRlc2NyaWJlKFwiJHtlbnVtSWR9XCIpO2AsXG4gICAgICAgICAgICBgZXhwb3J0IHR5cGUgJHtlbnVtSWR9ID0gei5pbmZlcjx0eXBlb2YgJHtlbnVtSWR9PjtgLFxuICAgICAgICAgICAgYGV4cG9ydCBjb25zdCAke2VudW1JZH1MYWJlbCA9ICR7SlNPTi5zdHJpbmdpZnkoZW51bUxhYmVsKX07YCxcbiAgICAgICAgICBdKSxcbiAgICAgIF0sXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0QmFzZVNjaGVtYVNvdXJjZUNvZGUoZW50aXR5OiBFbnRpdHksIGltcG9ydEtleXM6IHN0cmluZ1tdID0gW10pOiBTb3VyY2VDb2RlIHtcbiAgICBjb25zdCBzY2hlbWFOYW1lID0gYCR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1CYXNlU2NoZW1hYDtcbiAgICBjb25zdCBwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUgPSB7XG4gICAgICBub2RlVHlwZTogXCJvYmplY3RcIixcbiAgICAgIGNoaWxkcmVuOiBlbnRpdHkucHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm9kZVR5cGU6IFwicGxhaW5cIixcbiAgICAgICAgICBwcm9wLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfTtcblxuICAgIGNvbnN0IHNjaGVtYUJvZHkgPSAoKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcHJvcE5vZGVUb1pvZFR5cGVEZWYocHJvcE5vZGUsIGltcG9ydEtleXMpO1xuICAgICAgaWYgKHJlc3VsdC5lbmRzV2l0aChcIixcIikpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5zbGljZSgwLCAtMSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSkoKTtcblxuICAgIC8vIGZ1bGx0ZXh0IGluZGV47JeQIO2PrO2VqOuQnCDsu6zrn7zrk6Qg7LaU7LacXG4gICAgLy8gVE9ETzogR0lOL0dpU1Qg7J24642x7IqkIOyDneyEseuQnCDsu6zrn7wg7LaU7LacXG4gICAgY29uc3QgZnVsbHRleHRDb2x1bW5zOiBFbnRpdHlJbmRleFtcImNvbHVtbnNcIl1bXSA9IFtdO1xuXG4gICAgLy8gdmlydHVhbCBwcm9wcyAodmlydHVhbFR5cGU6IFwiY29kZVwiIOuYkOuKlCB1bmRlZmluZWTsnbgg6rKD66eMIO2PrO2VqClcbiAgICBjb25zdCB2aXJ0dWFsUHJvcHMgPSBlbnRpdHkucHJvcHNcbiAgICAgIC5maWx0ZXIoKHByb3ApID0+IGlzVmlydHVhbENvZGVQcm9wKHByb3ApKVxuICAgICAgLm1hcCgocHJvcCkgPT4gcHJvcC5uYW1lKTtcblxuICAgIC8vIHF1ZXJ5IHZpcnR1YWwgcHJvcHMgKHZpcnR1YWxUeXBlOiBcInF1ZXJ5XCLsnbgg6rKD66eMIO2PrO2VqClcbiAgICBjb25zdCB2aXJ0dWFsUXVlcnlQcm9wcyA9IGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcigocHJvcCkgPT4gaXNWaXJ0dWFsUXVlcnlQcm9wKHByb3ApKVxuICAgICAgLm1hcCgocHJvcCkgPT4gcHJvcC5uYW1lKTtcblxuICAgIC8qKlxuICAgICAqIGhhc0RlZmF1bHQgcHJvcHNcbiAgICAgKiAtIG51bGxhYmxlIOuYkOuKlCBkYkRlZmF1bHTqsIAg7J6I64qUIOy7rOufvCAoaWQg7Y+s7ZWoKVxuICAgICAqIC0gcmVsYXRpb27snbQg7JWE64uI6rGw64KYLCByZWxhdGlvbuydtOyWtOuPhCBudWxsYWJsZeydtOuptCDtj6ztlahcbiAgICAgKi9cbiAgICBjb25zdCBoYXNEZWZhdWx0Q29sdW1ucyA9IGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHByb3ApID0+XG4gICAgICAgICAgKHByb3AudHlwZSAhPT0gXCJyZWxhdGlvblwiIHx8IHByb3AubnVsbGFibGUgPT09IHRydWUpICYmXG4gICAgICAgICAgKHByb3AubnVsbGFibGUgPT09IHRydWUgfHwgKHByb3AudHlwZSAhPT0gXCJyZWxhdGlvblwiICYmIHByb3AuZGJEZWZhdWx0ICE9PSB1bmRlZmluZWQpKSxcbiAgICAgIClcbiAgICAgIC5tYXAoKHByb3ApID0+IChwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiA/IGAke3Byb3AubmFtZX1faWRgIDogcHJvcC5uYW1lKSlcbiAgICAgIC5jb25jYXQoXCJpZFwiKTtcblxuICAgIC8qKlxuICAgICAqIGhhc1ZlY3RvciBwcm9wc1xuICAgICAqIC0gdmVjdG9yIO2DgOyeheyduCDsu6zrn7xcbiAgICAgKi9cbiAgICBjb25zdCBoYXNWZWN0b3JDb2x1bW5zID0gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKChwcm9wKSA9PiBwcm9wLnR5cGUgPT09IFwidmVjdG9yXCIgfHwgcHJvcC50eXBlID09PSBcInZlY3RvcltdXCIpXG4gICAgICAubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpO1xuXG4gICAgLyoqXG4gICAgICogZ2VuZXJhdGVkIHByb3BzXG4gICAgICogLSBnZW5lcmF0ZWQg7IaN7ISx7J20IOyeiOuKlCDsu6zrn7wgKElOU0VSVC9VUERBVEUg7IucIOqwkiDsoJzqs7Ug67aI6rCAKVxuICAgICAqL1xuICAgIGNvbnN0IGdlbmVyYXRlZENvbHVtbnMgPSBlbnRpdHkucHJvcHNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChwcm9wKSA9PlxuICAgICAgICAgIHByb3AudHlwZSAhPT0gXCJyZWxhdGlvblwiICYmIChwcm9wLmdlbmVyYXRlZCAhPT0gdW5kZWZpbmVkIHx8IHByb3AudHlwZSA9PT0gXCJzZWFyY2hUZXh0XCIpLFxuICAgICAgKVxuICAgICAgLm1hcCgocHJvcCkgPT4gcHJvcC5uYW1lKTtcblxuICAgIGNvbnN0IGhhc01ldGFkYXRhID1cbiAgICAgIGZ1bGx0ZXh0Q29sdW1ucy5sZW5ndGggPiAwIHx8XG4gICAgICB2aXJ0dWFsUHJvcHMubGVuZ3RoID4gMCB8fFxuICAgICAgdmlydHVhbFF1ZXJ5UHJvcHMubGVuZ3RoID4gMCB8fFxuICAgICAgaGFzRGVmYXVsdENvbHVtbnMubGVuZ3RoID4gMCB8fFxuICAgICAgZ2VuZXJhdGVkQ29sdW1ucy5sZW5ndGggPiAwIHx8XG4gICAgICBoYXNWZWN0b3JDb2x1bW5zLmxlbmd0aCA+IDA7XG5cbiAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgIGBleHBvcnQgY29uc3QgJHtzY2hlbWFOYW1lfSA9ICR7c2NoZW1hQm9keX07YCxcbiAgICAgIGBleHBvcnQgdHlwZSAke3NjaGVtYU5hbWV9ID0gei5pbmZlcjx0eXBlb2YgJHtzY2hlbWFOYW1lfT5gICtcbiAgICAgICAgKGhhc01ldGFkYXRhXG4gICAgICAgICAgPyBgICYgeyR7XG4gICAgICAgICAgICAgIChmdWxsdGV4dENvbHVtbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gYHJlYWRvbmx5IF9fZnVsbHRleHRfXzogcmVhZG9ubHkgWyR7ZnVsbHRleHRDb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbCkgPT4gYFwiJHtjb2x9XCJgKVxuICAgICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpfV0sYFxuICAgICAgICAgICAgICAgIDogXCJcIikgK1xuICAgICAgICAgICAgICAodmlydHVhbFByb3BzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGByZWFkb25seSBfX3ZpcnR1YWxfXzogcmVhZG9ubHkgWyR7dmlydHVhbFByb3BzLm1hcCgocHJvcCkgPT4gYFwiJHtwcm9wfVwiYCkuam9pbihcIiwgXCIpfV0sYFxuICAgICAgICAgICAgICAgIDogXCJcIikgK1xuICAgICAgICAgICAgICAodmlydHVhbFF1ZXJ5UHJvcHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gYHJlYWRvbmx5IF9fdmlydHVhbF9xdWVyeV9fOiByZWFkb25seSBbJHt2aXJ0dWFsUXVlcnlQcm9wcy5tYXAoKHByb3ApID0+IGBcIiR7cHJvcH1cImApLmpvaW4oXCIsIFwiKX1dLGBcbiAgICAgICAgICAgICAgICA6IFwiXCIpICtcbiAgICAgICAgICAgICAgKGhhc0RlZmF1bHRDb2x1bW5zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGByZWFkb25seSBfX2hhc0RlZmF1bHRfXzogcmVhZG9ubHkgWyR7aGFzRGVmYXVsdENvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoY29sKSA9PiBgXCIke2NvbH1cImApXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9XSxgXG4gICAgICAgICAgICAgICAgOiBcIlwiKSArXG4gICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZWRDb2x1bW5zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgID8gYHJlYWRvbmx5IF9fZ2VuZXJhdGVkX186IHJlYWRvbmx5IFske2dlbmVyYXRlZENvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgICAubWFwKChjb2wpID0+IGBcIiR7Y29sfVwiYClcbiAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpfV0sYFxuICAgICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgICAgICkgK1xuICAgICAgICAgICAgICAoaGFzVmVjdG9yQ29sdW1ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBgcmVhZG9ubHkgX192ZWN0b3JfXzogcmVhZG9ubHkgWyR7aGFzVmVjdG9yQ29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChjb2wpID0+IGBcIiR7Y29sfVwiYClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX1dLGBcbiAgICAgICAgICAgICAgICA6IFwiXCIpXG4gICAgICAgICAgICB9fWBcbiAgICAgICAgICA6IFwiXCIpICtcbiAgICAgICAgXCI7XCIsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYEJhc2VTY2hlbWE6ICR7ZW50aXR5LmlkfWAsXG4gICAgICBpbXBvcnRLZXlzLFxuICAgICAgbGluZXMsXG4gICAgfTtcbiAgfVxuXG4gIGdldEJhc2VMaXN0UGFyYW1zU291cmNlQ29kZShlbnRpdHk6IEVudGl0eSk6IFNvdXJjZUNvZGUgfCBudWxsIHtcbiAgICAvLyBQcm9wIOyXhuuKlCBNROyduCDqsr3smrAg7IOd7ISxIOygnOyZuFxuICAgIGlmIChlbnRpdHkucHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGVudGl0eS5wYXJlbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWFOYW1lID0gYCR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1CYXNlTGlzdFBhcmFtc2A7XG5cbiAgICBjb25zdCBmaWx0ZXJQcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoKHByb3ApID0+IHByb3AudG9GaWx0ZXIgPT09IHRydWUpO1xuXG4gICAgY29uc3QgcHJvcE5vZGVzOiBFbnRpdHlQcm9wTm9kZVtdID0gZmlsdGVyUHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBub2RlVHlwZTogXCJwbGFpblwiIGFzIGNvbnN0LFxuICAgICAgICBwcm9wLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgaW1wb3J0S2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBmaWx0ZXJCb2R5ID0gcHJvcE5vZGVzXG4gICAgICAubWFwKChwcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYocHJvcE5vZGUsIGltcG9ydEtleXMpKVxuICAgICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgICAvLyBGaWx0ZXJRdWVyeSDtg4DsnoXsnYQg7JyE7ZWcIOygnOyZuO2VoCBwcm9wcyDstpTstpwgKHZpcnR1YWzrp4wg7KCc7Jm4KVxuICAgIGNvbnN0IGV4Y2x1ZGVkUHJvcHMgPSBlbnRpdHkucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwidmlydHVhbFwiKS5tYXAoKHApID0+IHAubmFtZSk7XG5cbiAgICAvLyBudW1lcmljIO2DgOyeheyduCBwcm9wcyDstpTstpxcbiAgICBjb25zdCBudW1lcmljUHJvcHMgPSBlbnRpdHkucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwibnVtZXJpY1wiKTtcblxuICAgIC8vIEFwcGx5U29uYW11RmlsdGVyIO2DgOyehSDsnbjsnpAg7IOd7ISxXG4gICAgY29uc3QgZW50aXR5VHlwZSA9IGAke2VudGl0eS5pZH1CYXNlU2NoZW1hYDtcbiAgICBjb25zdCBudW1lcmljS2V5c1VuaW9uID1cbiAgICAgIG51bWVyaWNQcm9wcy5sZW5ndGggPiAwID8gbnVtZXJpY1Byb3BzLm1hcCgocHJvcCkgPT4gYFwiJHtwcm9wLm5hbWV9XCJgKS5qb2luKFwiIHwgXCIpIDogXCJuZXZlclwiO1xuICAgIGNvbnN0IG9taXRLZXlzVW5pb24gPVxuICAgICAgZXhjbHVkZWRQcm9wcy5sZW5ndGggPiAwID8gZXhjbHVkZWRQcm9wcy5tYXAoKG4pID0+IGBcIiR7bn1cImApLmpvaW4oXCIgfCBcIikgOiBcIm5ldmVyXCI7XG5cbiAgICAvLyBQSyDtg4DsnoXsl5Ag65Sw66W4IGlkIFpvZCDtg4DsnoUg6rKw7KCVXG4gICAgY29uc3QgcGtUeXBlID0gZW50aXR5LmdldFBrVHlwZSgpO1xuICAgIGNvbnN0IGlkWm9kVHlwZSA9XG4gICAgICBwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIlxuICAgICAgICA/IFwiekFycmF5YWJsZSh6LnN0cmluZygpKVwiXG4gICAgICAgIDogXCJ6QXJyYXlhYmxlKHoubnVtYmVyKCkuaW50KCkucG9zaXRpdmUoKSlcIjtcblxuICAgIGNvbnN0IHNjaGVtYUJvZHkgPSBgXG56Lm9iamVjdCh7XG4gIG51bTogei5udW1iZXIoKS5pbnQoKS5ub25uZWdhdGl2ZSgpLFxuICBwYWdlOiB6Lm51bWJlcigpLmludCgpLm1pbigxKSxcbiAgc2VhcmNoOiAke2VudGl0eS5pZH1TZWFyY2hGaWVsZCxcbiAga2V5d29yZDogei5zdHJpbmcoKSxcbiAgb3JkZXJCeTogJHtlbnRpdHkuaWR9T3JkZXJCeSxcbiAgcXVlcnlNb2RlOiBTb25hbXVRdWVyeU1vZGUsXG4gIGlkOiAke2lkWm9kVHlwZX0sXG4gIHNvbmFtdUZpbHRlcjogei5jdXN0b208QXBwbHlTb25hbXVGaWx0ZXI8JHtlbnRpdHlUeXBlfSwgJHtvbWl0S2V5c1VuaW9ufSwgJHtudW1lcmljS2V5c1VuaW9ufT4+KCksJHtmaWx0ZXJCb2R5fVxufSkucGFydGlhbCgpO1xuYC50cmltKCk7XG5cbiAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgIGBleHBvcnQgY29uc3QgJHtzY2hlbWFOYW1lfSA9ICR7c2NoZW1hQm9keX07YCxcbiAgICAgIGBleHBvcnQgdHlwZSAke3NjaGVtYU5hbWV9ID0gei5pbmZlcjx0eXBlb2YgJHtzY2hlbWFOYW1lfT47YCxcbiAgICBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBgQmFzZUxpc3RQYXJhbXM6ICR7ZW50aXR5LmlkfWAsXG4gICAgICBpbXBvcnRLZXlzLFxuICAgICAgbGluZXMsXG4gICAgfTtcbiAgfVxuXG4gIGdldFN1YnNldFNvdXJjZUNvZGUoZW50aXR5OiBFbnRpdHkpOiBTb3VyY2VDb2RlIHwgbnVsbCB7XG4gICAgaWYgKE9iamVjdC5rZXlzKGVudGl0eS5zdWJzZXRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoZW50aXR5LnBhcmVudElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhlbnRpdHkuc3Vic2V0cyk7XG4gICAgY29uc3QgaW1wb3J0S2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgICAuLi5zdWJzZXRLZXlzLmZsYXRNYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAvLyDshJzruIzshYvsl5DshJwgRmllbGRFeHByW10g6rCA7KC47Ji0XG4gICAgICAgIGNvbnN0IGZpZWxkRXhwcnMgPSBlbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldO1xuXG4gICAgICAgIC8vIEZpZWxkRXhwcltd66GcIEVudGl0eVByb3BOb2RlW10g6rCA7KC47Ji0XG4gICAgICAgIGNvbnN0IHByb3BOb2RlcyA9IGVudGl0eS5maWVsZEV4cHJzVG9Qcm9wTm9kZXMoZmllbGRFeHBycyk7XG4gICAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBgJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldCR7c3Vic2V0S2V5fWA7XG4gICAgICAgIGNvbnN0IHByb3BOb2RlOiBFbnRpdHlQcm9wTm9kZSA9IHtcbiAgICAgICAgICBub2RlVHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICBjaGlsZHJlbjogcHJvcE5vZGVzLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEVudGl0eVByb3BOb2RlW13roZwgWm9kVHlwZURlZihzdHJpbmcp7J2EIOqwgOyguOyYtFxuICAgICAgICBjb25zdCBib2R5ID0gcHJvcE5vZGVUb1pvZFR5cGVEZWYocHJvcE5vZGUsIGltcG9ydEtleXMpO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgYGV4cG9ydCBjb25zdCAke3NjaGVtYU5hbWV9ID0gJHtib2R5LnJlcGxhY2UoLywkLywgXCJcIil9O2AsXG4gICAgICAgICAgYGV4cG9ydCB0eXBlICR7c2NoZW1hTmFtZX0gPSB6LmluZmVyPHR5cGVvZiAke3NjaGVtYU5hbWV9PjtgLFxuICAgICAgICBdO1xuICAgICAgfSksXG4gICAgICBgZXhwb3J0IHR5cGUgJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldE1hcHBpbmcgPSB7YCxcbiAgICAgIC4uLnN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IGAgICR7c3Vic2V0S2V5fTogJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldCR7c3Vic2V0S2V5fTtgKSxcbiAgICAgIFwifTtcIixcbiAgICAgIGBleHBvcnQgY29uc3QgJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldEtleSA9IHouZW51bShbJHtzdWJzZXRLZXlzXG4gICAgICAgIC5tYXAoKGspID0+IGBcIiR7a31cImApXG4gICAgICAgIC5qb2luKFwiLFwiKX1dKTtgLFxuICAgICAgYGV4cG9ydCB0eXBlICR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXRLZXkgPSB6LmluZmVyPHR5cGVvZiAke2VudGl0eS5uYW1lcy5tb2R1bGV9U3Vic2V0S2V5PjtgLFxuICAgICAgXCJcIixcbiAgICBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBgU3Vic2V0czogJHtlbnRpdHkuaWR9YCxcbiAgICAgIGxpbmVzLFxuICAgICAgaW1wb3J0S2V5czogdW5pcXVlKGltcG9ydEtleXMpLFxuICAgIH07XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJ1bmlxdWUiLCJTb25hbXUiLCJFbnRpdHlNYW5hZ2VyIiwiTmFpdGUiLCJpc1ZpcnR1YWxDb2RlUHJvcCIsImlzVmlydHVhbFF1ZXJ5UHJvcCIsIm5vbk51bGxhYmxlIiwiVGVtcGxhdGUiLCJCVUlMVF9JTl9UWVBFUyIsInByb3BOb2RlVG9ab2RUeXBlRGVmIiwiem9kVHlwZVRvWm9kQ29kZSIsIlRlbXBsYXRlX19nZW5lcmF0ZWQiLCJnZXRUYXJnZXRBbmRQYXRoIiwiZGlyIiwiY29uZmlnIiwiYXBpIiwidGFyZ2V0IiwicGF0aCIsInJlbmRlciIsImVudGl0eUlkcyIsImdldEFsbElkcyIsImVudGl0aWVzIiwibWFwIiwiaWQiLCJnZXQiLCJzb3VyY2VDb2RlcyIsImZsYXRNYXAiLCJlbnRpdHkiLCJnZXRFbnVtc1NvdXJjZUNvZGUiLCJnZXRCYXNlU2NoZW1hU291cmNlQ29kZSIsImdldEJhc2VMaXN0UGFyYW1zU291cmNlQ29kZSIsImdldFN1YnNldFNvdXJjZUNvZGUiLCJmaWx0ZXIiLCJ0IiwiTEFCRUxfS0VZX09SREVSIiwic29ydCIsImEiLCJiIiwiYUtleSIsImxhYmVsIiwic3BsaXQiLCJiS2V5IiwiYUluZGV4IiwiaW5kZXhPZiIsImJJbmRleCIsInNvdXJjZUNvZGUiLCJyZWR1Y2UiLCJyZXN1bHQiLCJ0cyIsImxpbmVzIiwiaW1wb3J0S2V5cyIsImFsbFR5cGVLZXlzIiwiT2JqZWN0Iiwia2V5cyIsInR5cGVzIiwiY2RJbXBvcnRLZXlzIiwiaW1wb3J0S2V5IiwiaW5jbHVkZXMiLCJsZW5ndGgiLCJjdXN0b21TY2FsYXJMaW5lcyIsImZpbmQiLCJFcnJvciIsInpvZFR5cGUiLCJib2R5Iiwiam9pbiIsImJ1aWx0SW5TY2hlbWFOYW1lcyIsInZhbHVlcyIsImluZm8iLCJzY2hlbWFOYW1lIiwiYnVpbHRJblNjaGVtYXMiLCJrZXkiLCJzb25hbXVJbXBvcnRzIiwibW9kIiwiY3VzdG9tSGVhZGVycyIsImVudW1MYWJlbHMiLCJlbnRyaWVzIiwiXyIsImVudW1MYWJlbCIsImVudW1JZCIsImVsIiwiSlNPTiIsInN0cmluZ2lmeSIsIm5hbWVzIiwibW9kdWxlIiwicHJvcE5vZGUiLCJub2RlVHlwZSIsImNoaWxkcmVuIiwicHJvcHMiLCJwcm9wIiwic2NoZW1hQm9keSIsImVuZHNXaXRoIiwic2xpY2UiLCJmdWxsdGV4dENvbHVtbnMiLCJ2aXJ0dWFsUHJvcHMiLCJuYW1lIiwidmlydHVhbFF1ZXJ5UHJvcHMiLCJoYXNEZWZhdWx0Q29sdW1ucyIsInR5cGUiLCJudWxsYWJsZSIsImRiRGVmYXVsdCIsInVuZGVmaW5lZCIsImNvbmNhdCIsImhhc1ZlY3RvckNvbHVtbnMiLCJnZW5lcmF0ZWRDb2x1bW5zIiwiZ2VuZXJhdGVkIiwiaGFzTWV0YWRhdGEiLCJjb2wiLCJwYXJlbnRJZCIsImZpbHRlclByb3BzIiwidG9GaWx0ZXIiLCJwcm9wTm9kZXMiLCJmaWx0ZXJCb2R5IiwiZXhjbHVkZWRQcm9wcyIsInAiLCJudW1lcmljUHJvcHMiLCJlbnRpdHlUeXBlIiwibnVtZXJpY0tleXNVbmlvbiIsIm9taXRLZXlzVW5pb24iLCJuIiwicGtUeXBlIiwiZ2V0UGtUeXBlIiwiaWRab2RUeXBlIiwidHJpbSIsInN1YnNldHMiLCJzdWJzZXRLZXlzIiwic3Vic2V0S2V5IiwiZmllbGRFeHBycyIsImZpZWxkRXhwcnNUb1Byb3BOb2RlcyIsInJlcGxhY2UiLCJrIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFDNUIsU0FBU0MsTUFBTSxRQUFRLFVBQVU7QUFDakMsU0FBU0MsTUFBTSxRQUFRLHFCQUFZO0FBRW5DLFNBQVNDLGFBQWEsUUFBUSxpQ0FBOEI7QUFDNUQsU0FBU0MsS0FBSyxRQUFRLHVCQUFvQjtBQUMxQyxTQUdFQyxpQkFBaUIsRUFDakJDLGtCQUFrQixRQUNiLHVCQUFvQjtBQUMzQixTQUFTQyxXQUFXLFFBQVEsdUJBQW9CO0FBQ2hELFNBQVNDLFFBQVEsUUFBUSxpQkFBYztBQUN2QyxTQUFTQyxjQUFjLEVBQUVDLG9CQUFvQixFQUFFQyxnQkFBZ0IsUUFBUSxzQkFBbUI7QUFPMUYsT0FBTyxNQUFNQyw0QkFBNEJKO0lBQ3ZDLGFBQWM7UUFDWixLQUFLLENBQUM7SUFDUjtJQUVBSyxtQkFBbUI7UUFDakIsTUFBTSxFQUFFQyxHQUFHLEVBQUUsR0FBR1osT0FBT2EsTUFBTSxDQUFDQyxHQUFHO1FBQ2pDLE9BQU87WUFDTEMsUUFBUSxHQUFHSCxJQUFJLGdCQUFnQixDQUFDO1lBQ2hDSSxNQUFNLENBQUMsbUJBQW1CLENBQUM7UUFDN0I7SUFDRjtJQUNBQyxTQUFTO1FBQ1AsTUFBTUMsWUFBWWpCLGNBQWNrQixTQUFTO1FBQ3pDLE1BQU1DLFdBQVdGLFVBQVVHLEdBQUcsQ0FBQyxDQUFDQyxLQUFPckIsY0FBY3NCLEdBQUcsQ0FBQ0Q7UUFFekQsbUJBQW1CO1FBQ25CLE1BQU1FLGNBQWNKLFNBQVNLLE9BQU8sQ0FBQyxDQUFDQztZQUNwQyxPQUFPO2dCQUNMLElBQUksQ0FBQ0Msa0JBQWtCLENBQUNEO2dCQUN4QixJQUFJLENBQUNFLHVCQUF1QixDQUFDRjtnQkFDN0IsSUFB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
|
|
265
|
+
//#endregion
|
|
266
|
+
export { Template__generated };
|
|
267
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVkLnRlbXBsYXRlLmpzIiwibmFtZXMiOlsiZW50aXR5IiwicHJvcE5vZGU6IEVudGl0eVByb3BOb2RlIiwiZnVsbHRleHRDb2x1bW5zOiBFbnRpdHlJbmRleFtcImNvbHVtbnNcIl1bXSIsInByb3BOb2RlczogRW50aXR5UHJvcE5vZGVbXSIsImltcG9ydEtleXM6IHN0cmluZ1tdIiwibGluZXM6IHN0cmluZ1tdIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy9nZW5lcmF0ZWQudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5cbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi8uLi9hcGlcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi8uLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgaXNWaXJ0dWFsQ29kZVByb3AsIGlzVmlydHVhbFF1ZXJ5UHJvcCB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlJbmRleCwgdHlwZSBFbnRpdHlQcm9wTm9kZSB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBCVUlMVF9JTl9UWVBFUywgcHJvcE5vZGVUb1pvZFR5cGVEZWYsIHpvZFR5cGVUb1pvZENvZGUgfSBmcm9tIFwiLi4vem9kLWNvbnZlcnRlclwiO1xuXG5leHBvcnQgdHlwZSBTb3VyY2VDb2RlID0ge1xuICBsYWJlbDogc3RyaW5nO1xuICBsaW5lczogc3RyaW5nW107XG4gIGltcG9ydEtleXM6IHN0cmluZ1tdO1xufTtcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZV9fZ2VuZXJhdGVkIGV4dGVuZHMgVGVtcGxhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcImdlbmVyYXRlZFwiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoKSB7XG4gICAgY29uc3QgeyBkaXIgfSA9IFNvbmFtdS5jb25maWcuYXBpO1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IGAke2Rpcn0vc3JjL2FwcGxpY2F0aW9uYCxcbiAgICAgIHBhdGg6IGBzb25hbXUuZ2VuZXJhdGVkLnRzYCxcbiAgICB9O1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGNvbnN0IGVudGl0aWVzID0gZW50aXR5SWRzLm1hcCgoaWQpID0+IEVudGl0eU1hbmFnZXIuZ2V0KGlkKSk7XG5cbiAgICAvLyDsoITssrQgU291cmNlQ29kZSDsg53shLFcbiAgICBjb25zdCBzb3VyY2VDb2RlcyA9IGVudGl0aWVzLmZsYXRNYXAoKGVudGl0eSkgPT4ge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgdGhpcy5nZXRFbnVtc1NvdXJjZUNvZGUoZW50aXR5KSxcbiAgICAgICAgdGhpcy5nZXRCYXNlU2NoZW1hU291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgICB0aGlzLmdldEJhc2VMaXN0UGFyYW1zU291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgICB0aGlzLmdldFN1YnNldFNvdXJjZUNvZGUoZW50aXR5KSxcbiAgICAgIF0uZmlsdGVyKG5vbk51bGxhYmxlKTtcbiAgICB9KTtcbiAgICBOYWl0ZS50KFwiVGVtcGxhdGVfX2dlbmVyYXRlZDpzb3VyY2VDb2Rlc1wiLCBzb3VyY2VDb2Rlcyk7XG5cbiAgICAvLyBTb3J0XG4gICAgY29uc3QgTEFCRUxfS0VZX09SREVSID0gW1wiRW51bXNcIiwgXCJCYXNlU2NoZW1hXCIsIFwiQmFzZUxpc3RQYXJhbXNcIiwgXCJTdWJzZXRzXCIsIFwiU3Vic2V0UXVlcmllc1wiXTtcbiAgICBzb3VyY2VDb2Rlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBbYUtleV0gPSBhLmxhYmVsLnNwbGl0KFwiOlwiKTtcbiAgICAgIGNvbnN0IFtiS2V5XSA9IGIubGFiZWwuc3BsaXQoXCI6XCIpO1xuICAgICAgY29uc3QgYUluZGV4ID0gTEFCRUxfS0VZX09SREVSLmluZGV4T2YoYUtleSk7XG4gICAgICBjb25zdCBiSW5kZXggPSBMQUJFTF9LRVlfT1JERVIuaW5kZXhPZihiS2V5KTtcbiAgICAgIGlmIChhSW5kZXggPiBiSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYgKGFJbmRleCA8IGJJbmRleCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBzb3VyY2VDb2Rlcy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCB0cykgPT4ge1xuICAgICAgICBpZiAodHMgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGluZXM6IFsuLi5yZXN1bHQubGluZXMsIGAvLyAke3RzLmxhYmVsfWAsIC4uLnRzLmxpbmVzLCBcIlwiXSxcbiAgICAgICAgICBpbXBvcnRLZXlzOiB1bmlxdWUoWy4uLnJlc3VsdC5pbXBvcnRLZXlzLCAuLi50cy5pbXBvcnRLZXlzXS50b1NvcnRlZCgpKSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxpbmVzOiBbXSxcbiAgICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgICB9IGFzIE9taXQ8U291cmNlQ29kZSwgXCJsYWJlbFwiPixcbiAgICApO1xuXG4gICAgLy8gLnR5cGVzLnRz7J2YIO2DgOyeheydhCDssLjsobDtlZjripQg6rK97JqwIOyInO2ZmOywuOyhsCjsg4HtmLjssLjsobAp6rCAIOuwnOyDne2VmOuvgOuhnCDtg4DsnoXsnYQg6rCA7KC47JmAIOyduOudvOyduCDsspjrpqxcbiAgICBjb25zdCBhbGxUeXBlS2V5cyA9IGVudGl0aWVzLmZsYXRNYXAoKGVudGl0eSkgPT4gT2JqZWN0LmtleXMoZW50aXR5LnR5cGVzKSk7XG4gICAgY29uc3QgY2RJbXBvcnRLZXlzID0gc291cmNlQ29kZS5pbXBvcnRLZXlzLmZpbHRlcigoaW1wb3J0S2V5KSA9PlxuICAgICAgYWxsVHlwZUtleXMuaW5jbHVkZXMoaW1wb3J0S2V5KSxcbiAgICApO1xuICAgIGlmIChjZEltcG9ydEtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY3VzdG9tU2NhbGFyTGluZXMgPSBjZEltcG9ydEtleXMuZmxhdE1hcCgoaW1wb3J0S2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IGVudGl0aWVzLmZpbmQoKGVudGl0eSkgPT4gZW50aXR5LnR5cGVzW2ltcG9ydEtleV0pO1xuICAgICAgICBpZiAoIWVudGl0eSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgWm9kVHlwZSBub3QgZm91bmQgJHtpbXBvcnRLZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgem9kVHlwZSA9IGVudGl0eS50eXBlc1tpbXBvcnRLZXldO1xuICAgICAgICBhc3NlcnQoem9kVHlwZSk7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBgLy8gQ3VzdG9tU2NhbGFyOiAke2ltcG9ydEtleX1gLFxuICAgICAgICAgIGBjb25zdCAke2ltcG9ydEtleX0gPSAke3pvZFR5cGVUb1pvZENvZGUoem9kVHlwZSl9O2AsXG4gICAgICAgICAgYHR5cGUgJHtpbXBvcnRLZXl9ID0gei5pbmZlcjx0eXBlb2YgJHtpbXBvcnRLZXl9PmAsXG4gICAgICAgICAgXCJcIixcbiAgICAgICAgXTtcbiAgICAgIH0pO1xuICAgICAgc291cmNlQ29kZS5saW5lcyA9IFsuLi5jdXN0b21TY2FsYXJMaW5lcywgLi4uc291cmNlQ29kZS5saW5lc107XG4gICAgICBzb3VyY2VDb2RlLmltcG9ydEtleXMgPSBzb3VyY2VDb2RlLmltcG9ydEtleXMuZmlsdGVyKFxuICAgICAgICAoaW1wb3J0S2V5KSA9PiAhY2RJbXBvcnRLZXlzLmluY2x1ZGVzKGltcG9ydEtleSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHkgPSBzb3VyY2VDb2RlLmxpbmVzLmpvaW4oXCJcXG5cIik7XG4gICAgTmFpdGUudChcIlRlbXBsYXRlX19nZW5lcmF0ZWQ6Ym9keVwiLCBib2R5KTtcblxuICAgIC8vIGltcG9ydFxuICAgIC8vIHNvdXJjZUNvZGUuaW1wb3J0S2V5c+yXkCDrgrTsnqUg7YOA7J6F7J2YIOyKpO2CpOuniOqwgCDsnojsnLzrqbQgc29uYW11IGltcG9ydOyXkCDstpTqsIBcbiAgICBjb25zdCBidWlsdEluU2NoZW1hTmFtZXMgPSBPYmplY3QudmFsdWVzKEJVSUxUX0lOX1RZUEVTKS5tYXAoXG4gICAgICAoaW5mbykgPT4gaW5mby5zY2hlbWFOYW1lIGFzIHN0cmluZyxcbiAgICApO1xuICAgIGNvbnN0IGJ1aWx0SW5TY2hlbWFzID0gc291cmNlQ29kZS5pbXBvcnRLZXlzLmZpbHRlcigoa2V5KSA9PiBidWlsdEluU2NoZW1hTmFtZXMuaW5jbHVkZXMoa2V5KSk7XG4gICAgY29uc3Qgc29uYW11SW1wb3J0cyA9IFtcbiAgICAgIFwiekFycmF5YWJsZVwiLFxuICAgICAgXCJTUUxEYXRlVGltZVN0cmluZ1wiLFxuICAgICAgXCJTdWJzZXRRdWVyeVwiLFxuICAgICAgXCJTb25hbXVRdWVyeU1vZGVcIixcbiAgICAgIFwiQXBwbHlTb25hbXVGaWx0ZXJcIixcbiAgICAgIC4uLmJ1aWx0SW5TY2hlbWFzLFxuICAgIF0uZmlsdGVyKChtb2QpID0+IGJvZHkuaW5jbHVkZXMobW9kKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKCksXG4gICAgICBib2R5LFxuICAgICAgaW1wb3J0S2V5czogc291cmNlQ29kZS5pbXBvcnRLZXlzLFxuICAgICAgY3VzdG9tSGVhZGVyczogW1xuICAgICAgICBcIi8qKlwiLFxuICAgICAgICBcIiAqIEBnZW5lcmF0ZWRcIixcbiAgICAgICAgXCIgKiDsp4HsoJEg7IiY7KCV7ZWY7KeAIOuniOyEuOyalC5cIixcbiAgICAgICAgXCIgKi9cIixcbiAgICAgICAgXCIvKiBveGxpbnQtZGlzYWJsZSAqL1wiLFxuICAgICAgICBcIlwiLFxuICAgICAgICBgaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7YCxcbiAgICAgICAgYGltcG9ydCB7ICR7c29uYW11SW1wb3J0cy5qb2luKFwiLFwiKX0gfSBmcm9tIFwic29uYW11XCI7YCxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGdldEVudW1zU291cmNlQ29kZShlbnRpdHk6IEVudGl0eSk6IFNvdXJjZUNvZGUgfCBudWxsIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYEVudW1zOiAke2VudGl0eS5pZH1gLFxuICAgICAgbGluZXM6IE9iamVjdC5lbnRyaWVzKGVudGl0eS5lbnVtTGFiZWxzKVxuICAgICAgICAuZmlsdGVyKChbXywgZW51bUxhYmVsXSkgPT4gT2JqZWN0LmtleXMoZW51bUxhYmVsKS5sZW5ndGggPiAwKVxuICAgICAgICAuZmxhdE1hcCgoW2VudW1JZCwgZW51bUxhYmVsXSkgPT4gW1xuICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtlbnVtSWR9ID0gei5lbnVtKFske09iamVjdC5rZXlzKGVudW1MYWJlbCkubWFwKFxuICAgICAgICAgICAgKGVsKSA9PiBgXCIke2VsfVwiYCxcbiAgICAgICAgICApfV0pLmRlc2NyaWJlKFwiJHtlbnVtSWR9XCIpO2AsXG4gICAgICAgICAgYGV4cG9ydCB0eXBlICR7ZW51bUlkfSA9IHouaW5mZXI8dHlwZW9mICR7ZW51bUlkfT47YCxcbiAgICAgICAgICBgZXhwb3J0IGNvbnN0ICR7ZW51bUlkfUxhYmVsID0gJHtKU09OLnN0cmluZ2lmeShlbnVtTGFiZWwpfTtgLFxuICAgICAgICBdKSxcbiAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgIH07XG4gIH1cblxuICBnZXRCYXNlU2NoZW1hU291cmNlQ29kZShlbnRpdHk6IEVudGl0eSwgaW1wb3J0S2V5czogc3RyaW5nW10gPSBbXSk6IFNvdXJjZUNvZGUge1xuICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBgJHtlbnRpdHkubmFtZXMubW9kdWxlfUJhc2VTY2hlbWFgO1xuICAgIGNvbnN0IHByb3BOb2RlOiBFbnRpdHlQcm9wTm9kZSA9IHtcbiAgICAgIG5vZGVUeXBlOiBcIm9iamVjdFwiLFxuICAgICAgY2hpbGRyZW46IGVudGl0eS5wcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlVHlwZTogXCJwbGFpblwiLFxuICAgICAgICAgIHByb3AsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2NoZW1hQm9keSA9ICgoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBwcm9wTm9kZVRvWm9kVHlwZURlZihwcm9wTm9kZSwgaW1wb3J0S2V5cyk7XG4gICAgICBpZiAocmVzdWx0LmVuZHNXaXRoKFwiLFwiKSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0LnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KSgpO1xuXG4gICAgLy8gZnVsbHRleHQgaW5kZXjsl5Ag7Y+s7ZWo65CcIOy7rOufvOuTpCDstpTstpxcbiAgICAvLyBUT0RPOiBHSU4vR2lTVCDsnbjrjbHsiqQg7IOd7ISx65CcIOy7rOufvCDstpTstpxcbiAgICBjb25zdCBmdWxsdGV4dENvbHVtbnM6IEVudGl0eUluZGV4W1wiY29sdW1uc1wiXVtdID0gW107XG5cbiAgICAvLyB2aXJ0dWFsIHByb3BzICh2aXJ0dWFsVHlwZTogXCJjb2RlXCIg65iQ64qUIHVuZGVmaW5lZOyduCDqsoPrp4wg7Y+s7ZWoKVxuICAgIGNvbnN0IHZpcnR1YWxQcm9wcyA9IGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcigocHJvcCkgPT4gaXNWaXJ0dWFsQ29kZVByb3AocHJvcCkpXG4gICAgICAubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpO1xuXG4gICAgLy8gcXVlcnkgdmlydHVhbCBwcm9wcyAodmlydHVhbFR5cGU6IFwicXVlcnlcIuyduCDqsoPrp4wg7Y+s7ZWoKVxuICAgIGNvbnN0IHZpcnR1YWxRdWVyeVByb3BzID0gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKChwcm9wKSA9PiBpc1ZpcnR1YWxRdWVyeVByb3AocHJvcCkpXG4gICAgICAubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpO1xuXG4gICAgLyoqXG4gICAgICogaGFzRGVmYXVsdCBwcm9wc1xuICAgICAqIC0gbnVsbGFibGUg65iQ64qUIGRiRGVmYXVsdOqwgCDsnojripQg7Lus65+8IChpZCDtj6ztlagpXG4gICAgICogLSByZWxhdGlvbuydtCDslYTri4jqsbDrgpgsIHJlbGF0aW9u7J207Ja064+EIG51bGxhYmxl7J2066m0IO2PrO2VqFxuICAgICAqL1xuICAgIGNvbnN0IGhhc0RlZmF1bHRDb2x1bW5zID0gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAocHJvcCkgPT5cbiAgICAgICAgICAocHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgfHwgcHJvcC5udWxsYWJsZSA9PT0gdHJ1ZSkgJiZcbiAgICAgICAgICAocHJvcC5udWxsYWJsZSA9PT0gdHJ1ZSB8fCAocHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgJiYgcHJvcC5kYkRlZmF1bHQgIT09IHVuZGVmaW5lZCkpLFxuICAgICAgKVxuICAgICAgLm1hcCgocHJvcCkgPT4gKHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiID8gYCR7cHJvcC5uYW1lfV9pZGAgOiBwcm9wLm5hbWUpKVxuICAgICAgLmNvbmNhdChcImlkXCIpO1xuXG4gICAgLyoqXG4gICAgICogaGFzVmVjdG9yIHByb3BzXG4gICAgICogLSB2ZWN0b3Ig7YOA7J6F7J24IOy7rOufvFxuICAgICAqL1xuICAgIGNvbnN0IGhhc1ZlY3RvckNvbHVtbnMgPSBlbnRpdHkucHJvcHNcbiAgICAgIC5maWx0ZXIoKHByb3ApID0+IHByb3AudHlwZSA9PT0gXCJ2ZWN0b3JcIiB8fCBwcm9wLnR5cGUgPT09IFwidmVjdG9yW11cIilcbiAgICAgIC5tYXAoKHByb3ApID0+IHByb3AubmFtZSk7XG5cbiAgICAvKipcbiAgICAgKiBnZW5lcmF0ZWQgcHJvcHNcbiAgICAgKiAtIGdlbmVyYXRlZCDsho3shLHsnbQg7J6I64qUIOy7rOufvCAoSU5TRVJUL1VQREFURSDsi5wg6rCSIOygnOqztSDrtojqsIApXG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVkQ29sdW1ucyA9IGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHByb3ApID0+XG4gICAgICAgICAgcHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgJiYgKHByb3AuZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQgfHwgcHJvcC50eXBlID09PSBcInNlYXJjaFRleHRcIiksXG4gICAgICApXG4gICAgICAubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpO1xuXG4gICAgY29uc3QgaGFzTWV0YWRhdGEgPVxuICAgICAgZnVsbHRleHRDb2x1bW5zLmxlbmd0aCA+IDAgfHxcbiAgICAgIHZpcnR1YWxQcm9wcy5sZW5ndGggPiAwIHx8XG4gICAgICB2aXJ0dWFsUXVlcnlQcm9wcy5sZW5ndGggPiAwIHx8XG4gICAgICBoYXNEZWZhdWx0Q29sdW1ucy5sZW5ndGggPiAwIHx8XG4gICAgICBnZW5lcmF0ZWRDb2x1bW5zLmxlbmd0aCA+IDAgfHxcbiAgICAgIGhhc1ZlY3RvckNvbHVtbnMubGVuZ3RoID4gMDtcblxuICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgYGV4cG9ydCBjb25zdCAke3NjaGVtYU5hbWV9ID0gJHtzY2hlbWFCb2R5fTtgLFxuICAgICAgYGV4cG9ydCB0eXBlICR7c2NoZW1hTmFtZX0gPSB6LmluZmVyPHR5cGVvZiAke3NjaGVtYU5hbWV9PmAgK1xuICAgICAgICAoaGFzTWV0YWRhdGFcbiAgICAgICAgICA/IGAgJiB7JHtcbiAgICAgICAgICAgICAgKGZ1bGx0ZXh0Q29sdW1ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBgcmVhZG9ubHkgX19mdWxsdGV4dF9fOiByZWFkb25seSBbJHtmdWxsdGV4dENvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoY29sKSA9PiBgXCIke2NvbH1cImApXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9XSxgXG4gICAgICAgICAgICAgICAgOiBcIlwiKSArXG4gICAgICAgICAgICAgICh2aXJ0dWFsUHJvcHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gYHJlYWRvbmx5IF9fdmlydHVhbF9fOiByZWFkb25seSBbJHt2aXJ0dWFsUHJvcHMubWFwKChwcm9wKSA9PiBgXCIke3Byb3B9XCJgKS5qb2luKFwiLCBcIil9XSxgXG4gICAgICAgICAgICAgICAgOiBcIlwiKSArXG4gICAgICAgICAgICAgICh2aXJ0dWFsUXVlcnlQcm9wcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBgcmVhZG9ubHkgX192aXJ0dWFsX3F1ZXJ5X186IHJlYWRvbmx5IFske3ZpcnR1YWxRdWVyeVByb3BzLm1hcCgocHJvcCkgPT4gYFwiJHtwcm9wfVwiYCkuam9pbihcIiwgXCIpfV0sYFxuICAgICAgICAgICAgICAgIDogXCJcIikgK1xuICAgICAgICAgICAgICAoaGFzRGVmYXVsdENvbHVtbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gYHJlYWRvbmx5IF9faGFzRGVmYXVsdF9fOiByZWFkb25seSBbJHtoYXNEZWZhdWx0Q29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChjb2wpID0+IGBcIiR7Y29sfVwiYClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX1dLGBcbiAgICAgICAgICAgICAgICA6IFwiXCIpICtcbiAgICAgICAgICAgICAgKGdlbmVyYXRlZENvbHVtbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gYHJlYWRvbmx5IF9fZ2VuZXJhdGVkX186IHJlYWRvbmx5IFske2dlbmVyYXRlZENvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoY29sKSA9PiBgXCIke2NvbH1cImApXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9XSxgXG4gICAgICAgICAgICAgICAgOiBcIlwiKSArXG4gICAgICAgICAgICAgIChoYXNWZWN0b3JDb2x1bW5zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGByZWFkb25seSBfX3ZlY3Rvcl9fOiByZWFkb25seSBbJHtoYXNWZWN0b3JDb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbCkgPT4gYFwiJHtjb2x9XCJgKVxuICAgICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpfV0sYFxuICAgICAgICAgICAgICAgIDogXCJcIilcbiAgICAgICAgICAgIH19YFxuICAgICAgICAgIDogXCJcIikgK1xuICAgICAgICBcIjtcIixcbiAgICBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBgQmFzZVNjaGVtYTogJHtlbnRpdHkuaWR9YCxcbiAgICAgIGltcG9ydEtleXMsXG4gICAgICBsaW5lcyxcbiAgICB9O1xuICB9XG5cbiAgZ2V0QmFzZUxpc3RQYXJhbXNTb3VyY2VDb2RlKGVudGl0eTogRW50aXR5KTogU291cmNlQ29kZSB8IG51bGwge1xuICAgIC8vIFByb3Ag7JeG64qUIE1E7J24IOqyveyasCDsg53shLEg7KCc7Jm4XG4gICAgaWYgKGVudGl0eS5wcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoZW50aXR5LnBhcmVudElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBgJHtlbnRpdHkubmFtZXMubW9kdWxlfUJhc2VMaXN0UGFyYW1zYDtcblxuICAgIGNvbnN0IGZpbHRlclByb3BzID0gZW50aXR5LnByb3BzLmZpbHRlcigocHJvcCkgPT4gcHJvcC50b0ZpbHRlciA9PT0gdHJ1ZSk7XG5cbiAgICBjb25zdCBwcm9wTm9kZXM6IEVudGl0eVByb3BOb2RlW10gPSBmaWx0ZXJQcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIgYXMgY29uc3QsXG4gICAgICAgIHByb3AsXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBpbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGZpbHRlckJvZHkgPSBwcm9wTm9kZXNcbiAgICAgIC5tYXAoKHByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihwcm9wTm9kZSwgaW1wb3J0S2V5cykpXG4gICAgICAuam9pbihcIlxcblwiKTtcblxuICAgIC8vIEZpbHRlclF1ZXJ5IO2DgOyeheydhCDsnITtlZwg7KCc7Jm47ZWgIHByb3BzIOy2lOy2nCAodmlydHVhbOunjCDsoJzsmbgpXG4gICAgY29uc3QgZXhjbHVkZWRQcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoKHApID0+IHAudHlwZSA9PT0gXCJ2aXJ0dWFsXCIpLm1hcCgocCkgPT4gcC5uYW1lKTtcblxuICAgIC8vIG51bWVyaWMg7YOA7J6F7J24IHByb3BzIOy2lOy2nFxuICAgIGNvbnN0IG51bWVyaWNQcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoKHApID0+IHAudHlwZSA9PT0gXCJudW1lcmljXCIpO1xuXG4gICAgLy8gQXBwbHlTb25hbXVGaWx0ZXIg7YOA7J6FIOyduOyekCDsg53shLFcbiAgICBjb25zdCBlbnRpdHlUeXBlID0gYCR7ZW50aXR5LmlkfUJhc2VTY2hlbWFgO1xuICAgIGNvbnN0IG51bWVyaWNLZXlzVW5pb24gPVxuICAgICAgbnVtZXJpY1Byb3BzLmxlbmd0aCA+IDAgPyBudW1lcmljUHJvcHMubWFwKChwcm9wKSA9PiBgXCIke3Byb3AubmFtZX1cImApLmpvaW4oXCIgfCBcIikgOiBcIm5ldmVyXCI7XG4gICAgY29uc3Qgb21pdEtleXNVbmlvbiA9XG4gICAgICBleGNsdWRlZFByb3BzLmxlbmd0aCA+IDAgPyBleGNsdWRlZFByb3BzLm1hcCgobikgPT4gYFwiJHtufVwiYCkuam9pbihcIiB8IFwiKSA6IFwibmV2ZXJcIjtcblxuICAgIC8vIFBLIO2DgOyeheyXkCDrlLDrpbggaWQgWm9kIO2DgOyehSDqsrDsoJVcbiAgICBjb25zdCBwa1R5cGUgPSBlbnRpdHkuZ2V0UGtUeXBlKCk7XG4gICAgY29uc3QgaWRab2RUeXBlID1cbiAgICAgIHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiXG4gICAgICAgID8gXCJ6QXJyYXlhYmxlKHouc3RyaW5nKCkpXCJcbiAgICAgICAgOiBcInpBcnJheWFibGUoei5udW1iZXIoKS5pbnQoKS5wb3NpdGl2ZSgpKVwiO1xuXG4gICAgY29uc3Qgc2NoZW1hQm9keSA9IGBcbnoub2JqZWN0KHtcbiAgbnVtOiB6Lm51bWJlcigpLmludCgpLm5vbm5lZ2F0aXZlKCksXG4gIHBhZ2U6IHoubnVtYmVyKCkuaW50KCkubWluKDEpLFxuICBzZWFyY2g6ICR7ZW50aXR5LmlkfVNlYXJjaEZpZWxkLFxuICBrZXl3b3JkOiB6LnN0cmluZygpLFxuICBvcmRlckJ5OiAke2VudGl0eS5pZH1PcmRlckJ5LFxuICBxdWVyeU1vZGU6IFNvbmFtdVF1ZXJ5TW9kZSxcbiAgaWQ6ICR7aWRab2RUeXBlfSxcbiAgc29uYW11RmlsdGVyOiB6LmN1c3RvbTxBcHBseVNvbmFtdUZpbHRlcjwke2VudGl0eVR5cGV9LCAke29taXRLZXlzVW5pb259LCAke251bWVyaWNLZXlzVW5pb259Pj4oKSwke2ZpbHRlckJvZHl9XG59KS5wYXJ0aWFsKCk7XG5gLnRyaW0oKTtcblxuICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgYGV4cG9ydCBjb25zdCAke3NjaGVtYU5hbWV9ID0gJHtzY2hlbWFCb2R5fTtgLFxuICAgICAgYGV4cG9ydCB0eXBlICR7c2NoZW1hTmFtZX0gPSB6LmluZmVyPHR5cGVvZiAke3NjaGVtYU5hbWV9PjtgLFxuICAgIF07XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGBCYXNlTGlzdFBhcmFtczogJHtlbnRpdHkuaWR9YCxcbiAgICAgIGltcG9ydEtleXMsXG4gICAgICBsaW5lcyxcbiAgICB9O1xuICB9XG5cbiAgZ2V0U3Vic2V0U291cmNlQ29kZShlbnRpdHk6IEVudGl0eSk6IFNvdXJjZUNvZGUgfCBudWxsIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoZW50aXR5LnN1YnNldHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmIChlbnRpdHkucGFyZW50SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKGVudGl0eS5zdWJzZXRzKTtcbiAgICBjb25zdCBpbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAgIC4uLnN1YnNldEtleXMuZmxhdE1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgIC8vIOyEnOu4jOyFi+yXkOyEnCBGaWVsZEV4cHJbXSDqsIDsoLjsmLRcbiAgICAgICAgY29uc3QgZmllbGRFeHBycyA9IGVudGl0eS5zdWJzZXRzW3N1YnNldEtleV07XG5cbiAgICAgICAgLy8gRmllbGRFeHByW13roZwgRW50aXR5UHJvcE5vZGVbXSDqsIDsoLjsmLRcbiAgICAgICAgY29uc3QgcHJvcE5vZGVzID0gZW50aXR5LmZpZWxkRXhwcnNUb1Byb3BOb2RlcyhmaWVsZEV4cHJzKTtcbiAgICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IGAke2VudGl0eS5uYW1lcy5tb2R1bGV9U3Vic2V0JHtzdWJzZXRLZXl9YDtcbiAgICAgICAgY29uc3QgcHJvcE5vZGU6IEVudGl0eVByb3BOb2RlID0ge1xuICAgICAgICAgIG5vZGVUeXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgIGNoaWxkcmVuOiBwcm9wTm9kZXMsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRW50aXR5UHJvcE5vZGVbXeuhnCBab2RUeXBlRGVmKHN0cmluZynsnYQg6rCA7KC47Ji0XG4gICAgICAgIGNvbnN0IGJvZHkgPSBwcm9wTm9kZVRvWm9kVHlwZURlZihwcm9wTm9kZSwgaW1wb3J0S2V5cyk7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBgZXhwb3J0IGNvbnN0ICR7c2NoZW1hTmFtZX0gPSAke2JvZHkucmVwbGFjZSgvLCQvLCBcIlwiKX07YCxcbiAgICAgICAgICBgZXhwb3J0IHR5cGUgJHtzY2hlbWFOYW1lfSA9IHouaW5mZXI8dHlwZW9mICR7c2NoZW1hTmFtZX0+O2AsXG4gICAgICAgIF07XG4gICAgICB9KSxcbiAgICAgIGBleHBvcnQgdHlwZSAke2VudGl0eS5uYW1lcy5tb2R1bGV9U3Vic2V0TWFwcGluZyA9IHtgLFxuICAgICAgLi4uc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4gYCAgJHtzdWJzZXRLZXl9OiAke2VudGl0eS5uYW1lcy5tb2R1bGV9U3Vic2V0JHtzdWJzZXRLZXl9O2ApLFxuICAgICAgXCJ9O1wiLFxuICAgICAgYGV4cG9ydCBjb25zdCAke2VudGl0eS5uYW1lcy5tb2R1bGV9U3Vic2V0S2V5ID0gei5lbnVtKFske3N1YnNldEtleXNcbiAgICAgICAgLm1hcCgoaykgPT4gYFwiJHtrfVwiYClcbiAgICAgICAgLmpvaW4oXCIsXCIpfV0pO2AsXG4gICAgICBgZXhwb3J0IHR5cGUgJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldEtleSA9IHouaW5mZXI8dHlwZW9mICR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXRLZXk+O2AsXG4gICAgICBcIlwiLFxuICAgIF07XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGBTdWJzZXRzOiAke2VudGl0eS5pZH1gLFxuICAgICAgbGluZXMsXG4gICAgICBpbXBvcnRLZXlzOiB1bmlxdWUoaW1wb3J0S2V5cyksXG4gICAgfTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7VUFJbUM7cUJBRXlCO1lBQ2xCO1lBQ2dDO1lBRTFCO2VBQ1Q7b0JBQ21EO0FBTzFGLElBQWEsc0JBQWIsY0FBeUMsU0FBUztDQUNoRCxjQUFjO0FBQ1osUUFBTSxZQUFZOztDQUdwQixtQkFBbUI7RUFDakIsTUFBTSxFQUFFLFFBQVEsT0FBTyxPQUFPO0FBQzlCLFNBQU87R0FDTCxRQUFRLEdBQUcsSUFBSTtHQUNmLE1BQU07R0FDUDs7Q0FFSCxTQUFTO0VBQ1AsTUFBTSxZQUFZLGNBQWMsV0FBVztFQUMzQyxNQUFNLFdBQVcsVUFBVSxLQUFLLE9BQU8sY0FBYyxJQUFJLEdBQUcsQ0FBQztFQUc3RCxNQUFNLGNBQWMsU0FBUyxTQUFTLFdBQVc7QUFDL0MsVUFBTztJQUNMLEtBQUssbUJBQW1CLE9BQU87SUFDL0IsS0FBSyx3QkFBd0IsT0FBTztJQUNwQyxLQUFLLDRCQUE0QixPQUFPO0lBQ3hDLEtBQUssb0JBQW9CLE9BQU87SUFDakMsQ0FBQyxPQUFPLFlBQVk7SUFDckI7QUFDRixRQUFNLEVBQUUsbUNBQW1DLFlBQVk7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
|