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,679 +1,625 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
* 3. EntityProp/Node -> Zod 코드 문자열
|
|
10
|
-
* - propToZodTypeDef
|
|
11
|
-
* - propNodeToZodTypeDef
|
|
12
|
-
*
|
|
13
|
-
* 4. Zod 타입 인스턴스를 해당하는 Zod 코드 문자열로 변환 (ZodType -> ZodCode)
|
|
14
|
-
* - zodTypeToZodCode
|
|
15
|
-
*
|
|
16
|
-
* 5. Zod 타입을 UI 렌더링에 사용할 수 있는 RenderingNode로 변환 (ZodType -> RenderingNode)
|
|
17
|
-
* - zodTypeToRenderingNode
|
|
18
|
-
* - resolveRenderType
|
|
19
|
-
*/ import inflection from "inflection";
|
|
1
|
+
import { __esmMin } from "../_virtual/rolldown_runtime.js";
|
|
2
|
+
import { Sonamu, init_sonamu } from "../api/sonamu.js";
|
|
3
|
+
import { BUILT_IN_TYPE_IDS, SonamuFileArraySchema, SonamuFileSchema, init_types, isBelongsToOneRelationProp, isBigIntegerArrayProp, isBigIntegerSingleProp, isBooleanArrayProp, isBooleanSingleProp, isDateArrayProp, isDateSingleProp, isEnumArrayProp, isEnumSingleProp, isIntegerArrayProp, isIntegerSingleProp, isJsonProp, isNumberArrayProp, isNumberSingleProp, isNumericArrayProp, isNumericSingleProp, isOneToOneRelationProp, isRelationProp, isSearchTextProp, isStringArrayProp, isStringSingleProp, isTsVectorProp, isUuidArrayProp, isUuidSingleProp, isVectorArrayProp, isVectorSingleProp, isVirtualProp } from "../types/types.js";
|
|
4
|
+
import { createImportUrl, init_esm_utils } from "../utils/esm-utils.js";
|
|
5
|
+
import { init_path_utils, runtimePath } from "../utils/path-utils.js";
|
|
6
|
+
import { EntityManager, init_entity_manager } from "../entity/entity-manager.js";
|
|
7
|
+
import inflection from "inflection";
|
|
8
|
+
import { z as z$1 } from "zod";
|
|
20
9
|
import path from "path";
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
import { EntityManager } from "../entity/entity-manager.js";
|
|
24
|
-
import { BUILT_IN_TYPE_IDS, isBelongsToOneRelationProp, isBigIntegerArrayProp, isBigIntegerSingleProp, isBooleanArrayProp, isBooleanSingleProp, isDateArrayProp, isDateSingleProp, isEnumArrayProp, isEnumSingleProp, isIntegerArrayProp, isIntegerSingleProp, isJsonProp, isNumberArrayProp, isNumberSingleProp, isNumericArrayProp, isNumericSingleProp, isOneToOneRelationProp, isRelationProp, isSearchTextProp, isStringArrayProp, isStringSingleProp, isTsVectorProp, isUuidArrayProp, isUuidSingleProp, isVectorArrayProp, isVectorSingleProp, isVirtualProp, SonamuFileArraySchema, SonamuFileSchema } from "../types/types.js";
|
|
25
|
-
import { createImportUrl } from "../utils/esm-utils.js";
|
|
26
|
-
import { runtimePath } from "../utils/path-utils.js";
|
|
10
|
+
|
|
11
|
+
//#region src/template/zod-converter.ts
|
|
27
12
|
/**
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
13
|
+
* zod-converter 구성
|
|
14
|
+
* 1. 유틸리티
|
|
15
|
+
* - getZodTypeById
|
|
16
|
+
*
|
|
17
|
+
* 2. Zod 타입 변환 (EntityProp -> ZodType)
|
|
18
|
+
* - propToZodType
|
|
19
|
+
*
|
|
20
|
+
* 3. EntityProp/Node -> Zod 코드 문자열
|
|
21
|
+
* - propToZodTypeDef
|
|
22
|
+
* - propNodeToZodTypeDef
|
|
23
|
+
*
|
|
24
|
+
* 4. Zod 타입 인스턴스를 해당하는 Zod 코드 문자열로 변환 (ZodType -> ZodCode)
|
|
25
|
+
* - zodTypeToZodCode
|
|
26
|
+
*
|
|
27
|
+
* 5. Zod 타입을 UI 렌더링에 사용할 수 있는 RenderingNode로 변환 (ZodType -> RenderingNode)
|
|
28
|
+
* - zodTypeToRenderingNode
|
|
29
|
+
* - resolveRenderType
|
|
30
|
+
*/
|
|
41
31
|
/**
|
|
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
|
-
// 기본 포맷은 z.xxx() 형태 (Zod 4)
|
|
67
|
-
return `z.${format}()`;
|
|
32
|
+
* zodFormat을 Zod 4 코드 문자열로 변환합니다.
|
|
33
|
+
* Zod 4에서는 z.email(), z.uuid() 등 독립적인 함수 형태를 사용합니다.
|
|
34
|
+
*/
|
|
35
|
+
function zodFormatToCode(format) {
|
|
36
|
+
const isoFormats = {
|
|
37
|
+
isoDate: "z.iso.date()",
|
|
38
|
+
isoTime: "z.iso.time()",
|
|
39
|
+
isoDatetime: "z.iso.datetime()",
|
|
40
|
+
isoDuration: "z.iso.duration()"
|
|
41
|
+
};
|
|
42
|
+
const hashFormats = {
|
|
43
|
+
hashMd5: "z.hash(\"md5\")",
|
|
44
|
+
hashSha1: "z.hash(\"sha1\")",
|
|
45
|
+
hashSha256: "z.hash(\"sha256\")",
|
|
46
|
+
hashSha384: "z.hash(\"sha384\")",
|
|
47
|
+
hashSha512: "z.hash(\"sha512\")"
|
|
48
|
+
};
|
|
49
|
+
if (format in isoFormats) {
|
|
50
|
+
return isoFormats[format];
|
|
51
|
+
}
|
|
52
|
+
if (format in hashFormats) {
|
|
53
|
+
return hashFormats[format];
|
|
54
|
+
}
|
|
55
|
+
return `z.${format}()`;
|
|
68
56
|
}
|
|
69
57
|
/**
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
case "hashSha1":
|
|
87
|
-
return z.hash("sha1");
|
|
88
|
-
case "hashSha256":
|
|
89
|
-
return z.hash("sha256");
|
|
90
|
-
case "hashSha384":
|
|
91
|
-
return z.hash("sha384");
|
|
92
|
-
case "hashSha512":
|
|
93
|
-
return z.hash("sha512");
|
|
94
|
-
// 기본 포맷은 z.xxx() 형태 (Zod 4)
|
|
95
|
-
default:
|
|
96
|
-
return z[format]();
|
|
97
|
-
}
|
|
58
|
+
* zodFormat을 Zod 4 타입으로 변환합니다.
|
|
59
|
+
* Zod 4에서는 z.email(), z.uuid() 등 독립적인 함수 형태를 사용합니다.
|
|
60
|
+
*/
|
|
61
|
+
function zodFormatToType(format) {
|
|
62
|
+
switch (format) {
|
|
63
|
+
case "isoDate": return z$1.iso.date();
|
|
64
|
+
case "isoTime": return z$1.iso.time();
|
|
65
|
+
case "isoDatetime": return z$1.iso.datetime();
|
|
66
|
+
case "isoDuration": return z$1.iso.duration();
|
|
67
|
+
case "hashMd5": return z$1.hash("md5");
|
|
68
|
+
case "hashSha1": return z$1.hash("sha1");
|
|
69
|
+
case "hashSha256": return z$1.hash("sha256");
|
|
70
|
+
case "hashSha384": return z$1.hash("sha384");
|
|
71
|
+
case "hashSha512": return z$1.hash("sha512");
|
|
72
|
+
default: return z$1[format]();
|
|
73
|
+
}
|
|
98
74
|
}
|
|
99
75
|
/**
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
return imported[zodTypeId].describe(zodTypeId);
|
|
76
|
+
* Zod 타입 ID로부터 동적으로 Zod 스키마를 로드합니다.
|
|
77
|
+
* 내장 타입(BUILT_IN_TYPE_IDS)은 바로 반환하고,
|
|
78
|
+
* 그 외는 dist 디렉토리에서 ESM으로 import하여 가져옵니다.
|
|
79
|
+
*/
|
|
80
|
+
async function getZodTypeById(zodTypeId) {
|
|
81
|
+
if (BUILT_IN_TYPE_IDS.includes(zodTypeId)) {
|
|
82
|
+
const builtInType = BUILT_IN_TYPES[zodTypeId];
|
|
83
|
+
if (!builtInType) {
|
|
84
|
+
throw new Error(`내장 타입 ${zodTypeId}의 스키마가 정의되지 않았습니다`);
|
|
85
|
+
}
|
|
86
|
+
return builtInType.schema.describe(zodTypeId);
|
|
87
|
+
}
|
|
88
|
+
const modulePath = EntityManager.getModulePath(zodTypeId);
|
|
89
|
+
const moduleAbsPath = path.join(Sonamu.apiRootPath, runtimePath(`dist/application/${modulePath}.js`));
|
|
90
|
+
const importUrl = createImportUrl(moduleAbsPath);
|
|
91
|
+
const imported = await import(importUrl);
|
|
92
|
+
if (!imported[zodTypeId]) {
|
|
93
|
+
throw new Error(`존재하지 않는 zodTypeId ${zodTypeId}`);
|
|
94
|
+
}
|
|
95
|
+
return imported[zodTypeId].describe(zodTypeId);
|
|
121
96
|
}
|
|
122
97
|
/**
|
|
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
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
98
|
+
* EntityProp을 Zod 타입으로 변환합니다.
|
|
99
|
+
* 각 prop의 타입에 따라 적절한 Zod validator를 생성합니다.
|
|
100
|
+
*/
|
|
101
|
+
async function propToZodType(prop) {
|
|
102
|
+
let zodType = z$1.unknown();
|
|
103
|
+
if (isIntegerSingleProp(prop)) {
|
|
104
|
+
zodType = z$1.number().int();
|
|
105
|
+
} else if (isIntegerArrayProp(prop)) {
|
|
106
|
+
zodType = z$1.number().int().array();
|
|
107
|
+
} else if (isBigIntegerSingleProp(prop)) {
|
|
108
|
+
zodType = z$1.bigint();
|
|
109
|
+
} else if (isBigIntegerArrayProp(prop)) {
|
|
110
|
+
zodType = z$1.bigint().array();
|
|
111
|
+
} else if (isEnumSingleProp(prop)) {
|
|
112
|
+
zodType = await getZodTypeById(prop.id);
|
|
113
|
+
} else if (isEnumArrayProp(prop)) {
|
|
114
|
+
zodType = (await getZodTypeById(prop.id)).array();
|
|
115
|
+
} else if (isStringSingleProp(prop)) {
|
|
116
|
+
if (prop.zodFormat) {
|
|
117
|
+
zodType = zodFormatToType(prop.zodFormat);
|
|
118
|
+
if (prop.length && "max" in zodType) {
|
|
119
|
+
zodType = zodType.max(prop.length);
|
|
120
|
+
}
|
|
121
|
+
} else if (prop.length) {
|
|
122
|
+
zodType = z$1.string().max(prop.length);
|
|
123
|
+
} else {
|
|
124
|
+
zodType = z$1.string();
|
|
125
|
+
}
|
|
126
|
+
} else if (isStringArrayProp(prop)) {
|
|
127
|
+
let elementType;
|
|
128
|
+
if (prop.zodFormat) {
|
|
129
|
+
elementType = zodFormatToType(prop.zodFormat);
|
|
130
|
+
if (prop.length && "max" in elementType) {
|
|
131
|
+
elementType = elementType.max(prop.length);
|
|
132
|
+
}
|
|
133
|
+
} else if (prop.length) {
|
|
134
|
+
elementType = z$1.string().max(prop.length);
|
|
135
|
+
} else {
|
|
136
|
+
elementType = z$1.string();
|
|
137
|
+
}
|
|
138
|
+
zodType = elementType.array();
|
|
139
|
+
} else if (isNumberSingleProp(prop)) {
|
|
140
|
+
zodType = z$1.number();
|
|
141
|
+
} else if (isNumberArrayProp(prop)) {
|
|
142
|
+
zodType = z$1.number().array();
|
|
143
|
+
} else if (isNumericSingleProp(prop)) {
|
|
144
|
+
zodType = z$1.string();
|
|
145
|
+
} else if (isNumericArrayProp(prop)) {
|
|
146
|
+
zodType = z$1.string().array();
|
|
147
|
+
} else if (isBooleanSingleProp(prop)) {
|
|
148
|
+
zodType = z$1.boolean();
|
|
149
|
+
} else if (isBooleanArrayProp(prop)) {
|
|
150
|
+
zodType = z$1.boolean().array();
|
|
151
|
+
} else if (isDateSingleProp(prop)) {
|
|
152
|
+
zodType = z$1.date();
|
|
153
|
+
} else if (isDateArrayProp(prop)) {
|
|
154
|
+
zodType = z$1.date().array();
|
|
155
|
+
} else if (isUuidSingleProp(prop)) {
|
|
156
|
+
zodType = z$1.uuid();
|
|
157
|
+
} else if (isUuidArrayProp(prop)) {
|
|
158
|
+
zodType = z$1.uuid().array();
|
|
159
|
+
} else if (isJsonProp(prop)) {
|
|
160
|
+
zodType = await getZodTypeById(prop.id);
|
|
161
|
+
} else if (isSearchTextProp(prop)) {
|
|
162
|
+
zodType = z$1.string();
|
|
163
|
+
} else if (isVectorSingleProp(prop)) {
|
|
164
|
+
zodType = z$1.array(z$1.number());
|
|
165
|
+
} else if (isVectorArrayProp(prop)) {
|
|
166
|
+
zodType = z$1.array(z$1.array(z$1.number()));
|
|
167
|
+
} else if (isVirtualProp(prop)) {
|
|
168
|
+
zodType = await getZodTypeById(prop.id);
|
|
169
|
+
} else if (isRelationProp(prop)) {
|
|
170
|
+
if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
|
|
171
|
+
const relEntity = EntityManager.get(prop.with);
|
|
172
|
+
const pkType = relEntity.getPkType();
|
|
173
|
+
if (pkType === "string" || pkType === "uuid") {
|
|
174
|
+
zodType = z$1.string();
|
|
175
|
+
} else {
|
|
176
|
+
zodType = z$1.number().int();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
} else {
|
|
180
|
+
throw new Error(`prop을 zodType으로 변환하는데 실패 ${prop}}`);
|
|
181
|
+
}
|
|
182
|
+
if (prop.unsigned) {
|
|
183
|
+
zodType = zodType.nonnegative();
|
|
184
|
+
}
|
|
185
|
+
if (prop.nullable) {
|
|
186
|
+
zodType = zodType.nullable();
|
|
187
|
+
}
|
|
188
|
+
return zodType;
|
|
214
189
|
}
|
|
215
190
|
/**
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
stmt += '.meta({ SonamuPropType: "numeric" })';
|
|
326
|
-
}
|
|
327
|
-
return `${stmt},`;
|
|
191
|
+
* EntityProp을 Zod 타입 정의 코드 문자열로 변환합니다.
|
|
192
|
+
*/
|
|
193
|
+
function propToZodTypeDef(prop, injectImportKeys) {
|
|
194
|
+
let stmt;
|
|
195
|
+
if (isIntegerSingleProp(prop)) {
|
|
196
|
+
stmt = `${prop.name}: z.int()`;
|
|
197
|
+
} else if (isIntegerArrayProp(prop)) {
|
|
198
|
+
stmt = `${prop.name}: z.int().array()`;
|
|
199
|
+
} else if (isBigIntegerSingleProp(prop)) {
|
|
200
|
+
stmt = `${prop.name}: z.bigint()`;
|
|
201
|
+
} else if (isBigIntegerArrayProp(prop)) {
|
|
202
|
+
stmt = `${prop.name}: z.bigint().array()`;
|
|
203
|
+
} else if (isEnumSingleProp(prop)) {
|
|
204
|
+
stmt = `${prop.name}: ${prop.id}`;
|
|
205
|
+
injectImportKeys.push(prop.id);
|
|
206
|
+
} else if (isEnumArrayProp(prop)) {
|
|
207
|
+
stmt = `${prop.name}: ${prop.id}.array()`;
|
|
208
|
+
injectImportKeys.push(prop.id);
|
|
209
|
+
} else if (isStringSingleProp(prop)) {
|
|
210
|
+
if (prop.zodFormat) {
|
|
211
|
+
const base = zodFormatToCode(prop.zodFormat);
|
|
212
|
+
if (prop.length) {
|
|
213
|
+
stmt = `${prop.name}: ${base}.max(${prop.length})`;
|
|
214
|
+
} else {
|
|
215
|
+
stmt = `${prop.name}: ${base}`;
|
|
216
|
+
}
|
|
217
|
+
} else if (prop.length) {
|
|
218
|
+
stmt = `${prop.name}: z.string().max(${prop.length})`;
|
|
219
|
+
} else {
|
|
220
|
+
stmt = `${prop.name}: z.string()`;
|
|
221
|
+
}
|
|
222
|
+
} else if (isStringArrayProp(prop)) {
|
|
223
|
+
if (prop.zodFormat) {
|
|
224
|
+
const base = zodFormatToCode(prop.zodFormat);
|
|
225
|
+
if (prop.length) {
|
|
226
|
+
stmt = `${prop.name}: ${base}.max(${prop.length}).array()`;
|
|
227
|
+
} else {
|
|
228
|
+
stmt = `${prop.name}: ${base}.array()`;
|
|
229
|
+
}
|
|
230
|
+
} else if (prop.length) {
|
|
231
|
+
stmt = `${prop.name}: z.string().max(${prop.length}).array()`;
|
|
232
|
+
} else {
|
|
233
|
+
stmt = `${prop.name}: z.string().array()`;
|
|
234
|
+
}
|
|
235
|
+
} else if (isNumberSingleProp(prop)) {
|
|
236
|
+
stmt = `${prop.name}: z.number()`;
|
|
237
|
+
} else if (isNumberArrayProp(prop)) {
|
|
238
|
+
stmt = `${prop.name}: z.number().array()`;
|
|
239
|
+
} else if (isNumericSingleProp(prop)) {
|
|
240
|
+
stmt = `${prop.name}: z.string()`;
|
|
241
|
+
} else if (isNumericArrayProp(prop)) {
|
|
242
|
+
stmt = `${prop.name}: z.string().array()`;
|
|
243
|
+
} else if (isDateSingleProp(prop)) {
|
|
244
|
+
stmt = `${prop.name}: z.date()`;
|
|
245
|
+
} else if (isDateArrayProp(prop)) {
|
|
246
|
+
stmt = `${prop.name}: z.date().array()`;
|
|
247
|
+
} else if (isBooleanSingleProp(prop)) {
|
|
248
|
+
stmt = `${prop.name}: z.boolean()`;
|
|
249
|
+
} else if (isBooleanArrayProp(prop)) {
|
|
250
|
+
stmt = `${prop.name}: z.boolean().array()`;
|
|
251
|
+
} else if (isUuidSingleProp(prop)) {
|
|
252
|
+
stmt = `${prop.name}: z.uuid()`;
|
|
253
|
+
} else if (isUuidArrayProp(prop)) {
|
|
254
|
+
stmt = `${prop.name}: z.uuid().array()`;
|
|
255
|
+
} else if (isJsonProp(prop)) {
|
|
256
|
+
if (BUILT_IN_TYPE_IDS.includes(prop.id)) {
|
|
257
|
+
const schemaName = prop.id === "SonamuFile" ? "SonamuFileSchema" : "SonamuFileArraySchema";
|
|
258
|
+
stmt = `${prop.name}: ${schemaName}`;
|
|
259
|
+
injectImportKeys.push(schemaName);
|
|
260
|
+
} else {
|
|
261
|
+
stmt = `${prop.name}: ${prop.id}`;
|
|
262
|
+
injectImportKeys.push(prop.id);
|
|
263
|
+
}
|
|
264
|
+
} else if (isSearchTextProp(prop)) {
|
|
265
|
+
stmt = `${prop.name}: z.string()`;
|
|
266
|
+
} else if (isVectorSingleProp(prop)) {
|
|
267
|
+
stmt = `${prop.name}: z.array(z.number())`;
|
|
268
|
+
} else if (isVectorArrayProp(prop)) {
|
|
269
|
+
stmt = `${prop.name}: z.array(z.array(z.number()))`;
|
|
270
|
+
} else if (isTsVectorProp(prop)) {
|
|
271
|
+
stmt = `${prop.name}: z.string()`;
|
|
272
|
+
} else if (isVirtualProp(prop)) {
|
|
273
|
+
stmt = `${prop.name}: ${prop.id}`;
|
|
274
|
+
injectImportKeys.push(prop.id);
|
|
275
|
+
} else if (isRelationProp(prop)) {
|
|
276
|
+
if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
|
|
277
|
+
const relEntity = EntityManager.get(prop.with);
|
|
278
|
+
const pkType = relEntity.getPkType();
|
|
279
|
+
if (pkType === "string" || pkType === "uuid") {
|
|
280
|
+
stmt = `${prop.name}_id: z.string()`;
|
|
281
|
+
} else {
|
|
282
|
+
stmt = `${prop.name}_id: z.int()`;
|
|
283
|
+
}
|
|
284
|
+
} else {
|
|
285
|
+
return `// ${prop.name}: ${prop.relationType} ${prop.with}`;
|
|
286
|
+
}
|
|
287
|
+
} else {
|
|
288
|
+
return "// unable to resolve";
|
|
289
|
+
}
|
|
290
|
+
if (prop.unsigned) {
|
|
291
|
+
stmt += ".nonnegative()";
|
|
292
|
+
}
|
|
293
|
+
if (prop.nullable) {
|
|
294
|
+
stmt += ".nullable()";
|
|
295
|
+
}
|
|
296
|
+
if (isNumericSingleProp(prop) || isNumericArrayProp(prop)) {
|
|
297
|
+
stmt += ".meta({ SonamuPropType: \"numeric\" })";
|
|
298
|
+
}
|
|
299
|
+
return `${stmt},`;
|
|
328
300
|
}
|
|
329
301
|
/**
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
302
|
+
* EntityPropNode를 Zod 타입 정의 코드 문자열로 변환합니다.
|
|
303
|
+
* plain, array, object 노드 타입을 재귀적으로 처리하여 중첩 구조를 지원합니다.
|
|
304
|
+
*/
|
|
305
|
+
function propNodeToZodTypeDef(propNode, injectImportKeys) {
|
|
306
|
+
if (propNode.nodeType === "plain") {
|
|
307
|
+
return propToZodTypeDef(propNode.prop, injectImportKeys);
|
|
308
|
+
} else if (propNode.nodeType === "array") {
|
|
309
|
+
return [
|
|
310
|
+
propNode.prop ? `${propNode.prop.name}: ` : "",
|
|
311
|
+
"z.array(z.object({",
|
|
312
|
+
propNode.children.map((childPropNode) => propNodeToZodTypeDef(childPropNode, injectImportKeys)).join("\n"),
|
|
313
|
+
"",
|
|
314
|
+
"})),"
|
|
315
|
+
].join("\n");
|
|
316
|
+
} else if (propNode.nodeType === "object") {
|
|
317
|
+
return [
|
|
318
|
+
propNode.prop ? `${propNode.prop.name}: ` : "",
|
|
319
|
+
"z.object({",
|
|
320
|
+
propNode.children.map((childPropNode) => propNodeToZodTypeDef(childPropNode, injectImportKeys)).join("\n"),
|
|
321
|
+
"",
|
|
322
|
+
`})${propNode.prop?.nullable ? ".nullable()" : ""},`
|
|
323
|
+
].join("\n");
|
|
324
|
+
} else {
|
|
325
|
+
throw Error;
|
|
326
|
+
}
|
|
354
327
|
}
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
if (typeof part === "string") {
|
|
424
|
-
return `${part}`;
|
|
425
|
-
}
|
|
426
|
-
// ZodType - 재귀적으로 변환
|
|
427
|
-
if (part && typeof part === "object" && part._zod) {
|
|
428
|
-
const innerType = zodTypeToTsTypeDef(part);
|
|
429
|
-
return `$\{${innerType}}`;
|
|
430
|
-
}
|
|
431
|
-
// 폴백
|
|
432
|
-
return `\${string}`;
|
|
433
|
-
});
|
|
434
|
-
return `\`${parts.join("")}\``;
|
|
435
|
-
}
|
|
436
|
-
case "file":
|
|
437
|
-
return "File";
|
|
438
|
-
default:
|
|
439
|
-
throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
|
|
440
|
-
}
|
|
328
|
+
function zodTypeToTsTypeDef(zt) {
|
|
329
|
+
switch (zt.def.type) {
|
|
330
|
+
case "string":
|
|
331
|
+
case "number":
|
|
332
|
+
case "boolean":
|
|
333
|
+
case "bigint":
|
|
334
|
+
case "date":
|
|
335
|
+
case "null":
|
|
336
|
+
case "undefined":
|
|
337
|
+
case "any":
|
|
338
|
+
case "unknown":
|
|
339
|
+
case "never": return zt.def.type;
|
|
340
|
+
case "nullable": return `${zodTypeToTsTypeDef(zt.def.innerType)} | null`;
|
|
341
|
+
case "default": return zodTypeToTsTypeDef(zt.def.innerType);
|
|
342
|
+
case "record": {
|
|
343
|
+
const recordType = zt;
|
|
344
|
+
return `{ [ key: ${zodTypeToTsTypeDef(recordType.def.keyType)} ]: ${zodTypeToTsTypeDef(recordType.def.valueType)}}`;
|
|
345
|
+
}
|
|
346
|
+
case "literal": return Array.from(zt.values).map((value) => {
|
|
347
|
+
if (typeof value === "string") {
|
|
348
|
+
return `"${value}"`;
|
|
349
|
+
}
|
|
350
|
+
if (value === null) {
|
|
351
|
+
return `null`;
|
|
352
|
+
}
|
|
353
|
+
if (value === undefined) {
|
|
354
|
+
return `undefined`;
|
|
355
|
+
}
|
|
356
|
+
return `${value}`;
|
|
357
|
+
}).join(" | ");
|
|
358
|
+
case "union": return `${zt.options.map((option) => zodTypeToTsTypeDef(option)).join(" | ")}`;
|
|
359
|
+
case "enum": return `${zt.options.map((val) => `"${val}"`).join(" | ")}`;
|
|
360
|
+
case "array": return `${zodTypeToTsTypeDef(zt.element)}[]`;
|
|
361
|
+
case "object": {
|
|
362
|
+
const shape = zt.shape;
|
|
363
|
+
return [
|
|
364
|
+
"{",
|
|
365
|
+
...Object.keys(shape).map((key) => {
|
|
366
|
+
if (shape[key].def.type === "optional") {
|
|
367
|
+
return `${key}?: ${zodTypeToTsTypeDef(shape[key].def.innerType)},`;
|
|
368
|
+
} else {
|
|
369
|
+
return `${key}: ${zodTypeToTsTypeDef(shape[key])},`;
|
|
370
|
+
}
|
|
371
|
+
}),
|
|
372
|
+
"}"
|
|
373
|
+
].join("\n");
|
|
374
|
+
}
|
|
375
|
+
case "optional": return `${zodTypeToTsTypeDef(zt.def.innerType)} | undefined`;
|
|
376
|
+
case "template_literal": {
|
|
377
|
+
const def = zt.def;
|
|
378
|
+
if (!def.parts || def.parts.length === 0) {
|
|
379
|
+
return "string";
|
|
380
|
+
}
|
|
381
|
+
const parts = def.parts.map((part) => {
|
|
382
|
+
if (typeof part === "string") {
|
|
383
|
+
return `${part}`;
|
|
384
|
+
}
|
|
385
|
+
if (part && typeof part === "object" && part._zod) {
|
|
386
|
+
const innerType = zodTypeToTsTypeDef(part);
|
|
387
|
+
return `$\{${innerType}}`;
|
|
388
|
+
}
|
|
389
|
+
return `\${string}`;
|
|
390
|
+
});
|
|
391
|
+
return `\`${parts.join("")}\``;
|
|
392
|
+
}
|
|
393
|
+
case "file": return "File";
|
|
394
|
+
default: throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
|
|
395
|
+
}
|
|
441
396
|
}
|
|
442
397
|
/**
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
const def = zt.def;
|
|
520
|
-
// 빈 template literal
|
|
521
|
-
if (!def.parts || def.parts.length === 0) {
|
|
522
|
-
return "z.templateLiteral([])";
|
|
523
|
-
}
|
|
524
|
-
// 각 part를 Zod 코드 문자열로 변환
|
|
525
|
-
const parts = def.parts.map((part)=>{
|
|
526
|
-
// 문자열 리터럴
|
|
527
|
-
if (typeof part === "string") {
|
|
528
|
-
return `"${part}"`;
|
|
529
|
-
}
|
|
530
|
-
// ZodType - 재귀적으로 변환
|
|
531
|
-
if (part && typeof part === "object" && part._zod) {
|
|
532
|
-
return zodTypeToZodCode(part);
|
|
533
|
-
}
|
|
534
|
-
// 폴백
|
|
535
|
-
return "z.string()";
|
|
536
|
-
});
|
|
537
|
-
return `z.templateLiteral([${parts.join(", ")}])`;
|
|
538
|
-
}
|
|
539
|
-
case "intersection":
|
|
540
|
-
{
|
|
541
|
-
const zIntersectionDef = zt.def;
|
|
542
|
-
return `z.intersection(${zodTypeToZodCode(zIntersectionDef.left)}, ${zodTypeToZodCode(zIntersectionDef.right)})`;
|
|
543
|
-
}
|
|
544
|
-
default:
|
|
545
|
-
throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
|
|
546
|
-
}
|
|
398
|
+
* Zod 타입 인스턴스를 해당하는 Zod 코드 문자열로 변환합니다.
|
|
399
|
+
*/
|
|
400
|
+
function zodTypeToZodCode(zt) {
|
|
401
|
+
switch (zt.def.type) {
|
|
402
|
+
case "string": return "z.string()";
|
|
403
|
+
case "number": return "z.number()";
|
|
404
|
+
case "bigint": return "z.bigint()";
|
|
405
|
+
case "boolean": return "z.boolean()";
|
|
406
|
+
case "date": return "z.date()";
|
|
407
|
+
case "null": return "z.null()";
|
|
408
|
+
case "undefined": return "z.undefined()";
|
|
409
|
+
case "any": return "z.any()";
|
|
410
|
+
case "unknown": return "z.unknown()";
|
|
411
|
+
case "never": return "z.never()";
|
|
412
|
+
case "nullable": return `${zodTypeToZodCode(zt.def.innerType)}.nullable()`;
|
|
413
|
+
case "default": {
|
|
414
|
+
const zDefaultDef = zt.def;
|
|
415
|
+
return `${zodTypeToZodCode(zDefaultDef.innerType)}.default(${zDefaultDef.defaultValue})`;
|
|
416
|
+
}
|
|
417
|
+
case "record": {
|
|
418
|
+
const zRecordDef = zt.def;
|
|
419
|
+
return `z.record(${zodTypeToZodCode(zRecordDef.keyType)}, ${zodTypeToZodCode(zRecordDef.valueType)})`;
|
|
420
|
+
}
|
|
421
|
+
case "literal": {
|
|
422
|
+
const items = Array.from(zt.values).map((value) => {
|
|
423
|
+
if (typeof value === "string") {
|
|
424
|
+
return `"${value}"`;
|
|
425
|
+
}
|
|
426
|
+
if (value === null) {
|
|
427
|
+
return `null`;
|
|
428
|
+
}
|
|
429
|
+
if (value === undefined) {
|
|
430
|
+
return `undefined`;
|
|
431
|
+
}
|
|
432
|
+
return `${value}`;
|
|
433
|
+
});
|
|
434
|
+
if (items.length === 1) {
|
|
435
|
+
return `z.literal(${items[0]})`;
|
|
436
|
+
}
|
|
437
|
+
return `z.literal([${items.join(", ")}])`;
|
|
438
|
+
}
|
|
439
|
+
case "union": return `z.union([${zt.def.options.map((option) => zodTypeToZodCode(option)).join(",")}])`;
|
|
440
|
+
case "enum": return `z.enum({${Object.entries(zt.def.entries).map(([key, val]) => typeof val === "string" ? `${key}: "${val}"` : `${key}: ${val}`).join(", ")}})`;
|
|
441
|
+
case "array": return `z.array(${zodTypeToZodCode(zt.def.element)})`;
|
|
442
|
+
case "object": {
|
|
443
|
+
const shape = zt.shape;
|
|
444
|
+
return [
|
|
445
|
+
"z.object({",
|
|
446
|
+
...Object.keys(shape).map((key) => `${key}: ${zodTypeToZodCode(shape[key])},`),
|
|
447
|
+
"})"
|
|
448
|
+
].join("\n");
|
|
449
|
+
}
|
|
450
|
+
case "optional": return `${zodTypeToZodCode(zt.def.innerType)}.optional()`;
|
|
451
|
+
case "file": return `z.file()`;
|
|
452
|
+
case "template_literal": {
|
|
453
|
+
const def = zt.def;
|
|
454
|
+
if (!def.parts || def.parts.length === 0) {
|
|
455
|
+
return "z.templateLiteral([])";
|
|
456
|
+
}
|
|
457
|
+
const parts = def.parts.map((part) => {
|
|
458
|
+
if (typeof part === "string") {
|
|
459
|
+
return `"${part}"`;
|
|
460
|
+
}
|
|
461
|
+
if (part && typeof part === "object" && part._zod) {
|
|
462
|
+
return zodTypeToZodCode(part);
|
|
463
|
+
}
|
|
464
|
+
return "z.string()";
|
|
465
|
+
});
|
|
466
|
+
return `z.templateLiteral([${parts.join(", ")}])`;
|
|
467
|
+
}
|
|
468
|
+
case "intersection": {
|
|
469
|
+
const zIntersectionDef = zt.def;
|
|
470
|
+
return `z.intersection(${zodTypeToZodCode(zIntersectionDef.left)}, ${zodTypeToZodCode(zIntersectionDef.right)})`;
|
|
471
|
+
}
|
|
472
|
+
default: throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
|
|
473
|
+
}
|
|
547
474
|
}
|
|
548
475
|
/**
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
renderType: resolveRenderType(baseKey, zodType)
|
|
628
|
-
};
|
|
629
|
-
}
|
|
476
|
+
* Zod 타입을 UI 렌더링에 사용할 수 있는 RenderingNode로 변환합니다.
|
|
477
|
+
* 재귀적으로 중첩된 타입들을 처리합니다.
|
|
478
|
+
*/
|
|
479
|
+
function zodTypeToRenderingNode(zodType, baseKey = "root") {
|
|
480
|
+
const def = {
|
|
481
|
+
name: baseKey,
|
|
482
|
+
label: inflection.camelize(baseKey, false),
|
|
483
|
+
zodType
|
|
484
|
+
};
|
|
485
|
+
/**
|
|
486
|
+
* 케이스 처리 순서
|
|
487
|
+
*
|
|
488
|
+
* 1. 특수 케이스 (description 기반)
|
|
489
|
+
* - SonamuFile/SonamuFile[] : z.object/z.array이지만 파일 업로드용 내장 타입
|
|
490
|
+
*
|
|
491
|
+
* 2. 일반 케이스 (instanceof 기반)
|
|
492
|
+
* - z.ZodObject : 일반 객체
|
|
493
|
+
* - z.ZodArray : 일반 배열
|
|
494
|
+
* - vector : z.array(z.number)이지만 네이밍 기반으로 벡터 임베딩
|
|
495
|
+
* - 일반 배열 : 그 외
|
|
496
|
+
* - z.ZodUnion, z.ZodOptional, z.ZodNullable : 유틸리티 타입
|
|
497
|
+
* - 기타 : resolveRenderType()으로 처리
|
|
498
|
+
*/
|
|
499
|
+
if (zodType.description === "SonamuFile[]") {
|
|
500
|
+
return {
|
|
501
|
+
...def,
|
|
502
|
+
renderType: "json-sonamufile-array"
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
if (zodType.description === "SonamuFile") {
|
|
506
|
+
return {
|
|
507
|
+
...def,
|
|
508
|
+
renderType: "json-sonamufile"
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
if (zodType instanceof z$1.ZodObject) {
|
|
512
|
+
const columnKeys = Object.keys(zodType.shape);
|
|
513
|
+
const children = columnKeys.map((key) => {
|
|
514
|
+
const innerType = zodType.shape[key];
|
|
515
|
+
return zodTypeToRenderingNode(innerType, key);
|
|
516
|
+
});
|
|
517
|
+
return {
|
|
518
|
+
...def,
|
|
519
|
+
renderType: "object",
|
|
520
|
+
children
|
|
521
|
+
};
|
|
522
|
+
} else if (zodType instanceof z$1.ZodArray) {
|
|
523
|
+
const innerType = zodType.def.element;
|
|
524
|
+
if (innerType instanceof z$1.ZodNumber && (baseKey.includes("embedding") || baseKey.includes("vector"))) {
|
|
525
|
+
return {
|
|
526
|
+
...def,
|
|
527
|
+
renderType: "vector"
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
return {
|
|
531
|
+
...def,
|
|
532
|
+
renderType: "array",
|
|
533
|
+
element: zodTypeToRenderingNode(innerType, baseKey)
|
|
534
|
+
};
|
|
535
|
+
} else if (zodType instanceof z$1.ZodUnion) {
|
|
536
|
+
const optionNodes = zodType.def.options.map((opt) => zodTypeToRenderingNode(opt, baseKey));
|
|
537
|
+
return optionNodes[0];
|
|
538
|
+
} else if (zodType instanceof z$1.ZodOptional) {
|
|
539
|
+
return {
|
|
540
|
+
...zodTypeToRenderingNode(zodType.def.innerType, baseKey),
|
|
541
|
+
optional: true
|
|
542
|
+
};
|
|
543
|
+
} else if (zodType instanceof z$1.ZodNullable) {
|
|
544
|
+
return {
|
|
545
|
+
...zodTypeToRenderingNode(zodType.def.innerType, baseKey),
|
|
546
|
+
nullable: true
|
|
547
|
+
};
|
|
548
|
+
} else {
|
|
549
|
+
return {
|
|
550
|
+
...def,
|
|
551
|
+
renderType: resolveRenderType(baseKey, zodType)
|
|
552
|
+
};
|
|
553
|
+
}
|
|
630
554
|
}
|
|
631
555
|
/**
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
}
|
|
556
|
+
* Zod 타입과 키 이름으로부터 적절한 RenderType을 결정합니다.
|
|
557
|
+
*/
|
|
558
|
+
function resolveRenderType(key, zodType) {
|
|
559
|
+
if (zodType instanceof z$1.ZodDate) {
|
|
560
|
+
return "datetime";
|
|
561
|
+
} else if (zodType instanceof z$1.core.$ZodString) {
|
|
562
|
+
if (zodType.description === "SQLDateTimeString") {
|
|
563
|
+
return "string-datetime";
|
|
564
|
+
} else if (key.endsWith("date")) {
|
|
565
|
+
return "string-date";
|
|
566
|
+
} else if (key === "id") {
|
|
567
|
+
return "string-id";
|
|
568
|
+
} else if (key.endsWith("_id")) {
|
|
569
|
+
return "string-fk_id";
|
|
570
|
+
} else {
|
|
571
|
+
return "string-plain";
|
|
572
|
+
}
|
|
573
|
+
} else if (zodType instanceof z$1.ZodNumber) {
|
|
574
|
+
if (key === "id") {
|
|
575
|
+
return "number-id";
|
|
576
|
+
} else if (key.endsWith("_id")) {
|
|
577
|
+
return "number-fk_id";
|
|
578
|
+
} else {
|
|
579
|
+
return "number-plain";
|
|
580
|
+
}
|
|
581
|
+
} else if (zodType instanceof z$1.ZodBoolean) {
|
|
582
|
+
return "boolean";
|
|
583
|
+
} else if (zodType instanceof z$1.ZodEnum) {
|
|
584
|
+
return "enums";
|
|
585
|
+
} else if (zodType instanceof z$1.ZodRecord) {
|
|
586
|
+
return "record";
|
|
587
|
+
} else if (zodType instanceof z$1.ZodAny || zodType instanceof z$1.ZodUnknown) {
|
|
588
|
+
return "string-plain";
|
|
589
|
+
} else if (zodType instanceof z$1.ZodUnion) {
|
|
590
|
+
return "string-plain";
|
|
591
|
+
} else if (zodType instanceof z$1.ZodLiteral) {
|
|
592
|
+
return "string-plain";
|
|
593
|
+
} else if (zodType instanceof z$1.ZodTemplateLiteral) {
|
|
594
|
+
return "string-plain";
|
|
595
|
+
} else if (zodType.def.type === "custom") {
|
|
596
|
+
return "object";
|
|
597
|
+
} else {
|
|
598
|
+
throw new Error(`타입 파싱 불가 ${key} ${zodType.def.type}`);
|
|
599
|
+
}
|
|
677
600
|
}
|
|
601
|
+
var BUILT_IN_TYPES;
|
|
602
|
+
var init_zod_converter = __esmMin((() => {
|
|
603
|
+
init_sonamu();
|
|
604
|
+
init_entity_manager();
|
|
605
|
+
init_types();
|
|
606
|
+
init_esm_utils();
|
|
607
|
+
init_path_utils();
|
|
608
|
+
BUILT_IN_TYPES = {
|
|
609
|
+
SonamuFile: {
|
|
610
|
+
schema: SonamuFileSchema,
|
|
611
|
+
renderType: "json-sonamufile",
|
|
612
|
+
schemaName: "SonamuFileSchema"
|
|
613
|
+
},
|
|
614
|
+
"SonamuFile[]": {
|
|
615
|
+
schema: SonamuFileArraySchema,
|
|
616
|
+
renderType: "json-sonamufile-array",
|
|
617
|
+
schemaName: "SonamuFileArraySchema"
|
|
618
|
+
}
|
|
619
|
+
};
|
|
620
|
+
}));
|
|
678
621
|
|
|
679
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS96b2QtY29udmVydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogem9kLWNvbnZlcnRlciDqtazshLFcbiAqIDEuIOycoO2LuOumrO2LsFxuICogIC0gZ2V0Wm9kVHlwZUJ5SWRcbiAqXG4gKiAyLiBab2Qg7YOA7J6FIOuzgO2ZmCAoRW50aXR5UHJvcCAtPiBab2RUeXBlKVxuICogIC0gcHJvcFRvWm9kVHlwZVxuICpcbiAqIDMuIEVudGl0eVByb3AvTm9kZSAtPiBab2Qg7L2U65OcIOusuOyekOyXtFxuICogIC0gcHJvcFRvWm9kVHlwZURlZlxuICogIC0gcHJvcE5vZGVUb1pvZFR5cGVEZWZcbiAqXG4gKiA0LiBab2Qg7YOA7J6FIOyduOyKpO2EtOyKpOulvCDtlbTri7ntlZjripQgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmYIChab2RUeXBlIC0+IFpvZENvZGUpXG4gKiAgLSB6b2RUeXBlVG9ab2RDb2RlXG4gKlxuICogNS4gWm9kIO2DgOyeheydhCBVSSDroIzrjZTrp4Hsl5Ag7IKs7Jqp7ZWgIOyImCDsnojripQgUmVuZGVyaW5nTm9kZeuhnCDrs4DtmZggKFpvZFR5cGUgLT4gUmVuZGVyaW5nTm9kZSlcbiAqICAtIHpvZFR5cGVUb1JlbmRlcmluZ05vZGVcbiAqICAtIHJlc29sdmVSZW5kZXJUeXBlXG4gKi9cblxuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyAkWm9kTG9vc2VTaGFwZSB9IGZyb20gXCJ6b2QvdjQvY29yZVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBCVUlMVF9JTl9UWVBFX0lEUyxcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNCaWdJbnRlZ2VyQXJyYXlQcm9wLFxuICBpc0JpZ0ludGVnZXJTaW5nbGVQcm9wLFxuICBpc0Jvb2xlYW5BcnJheVByb3AsXG4gIGlzQm9vbGVhblNpbmdsZVByb3AsXG4gIGlzRGF0ZUFycmF5UHJvcCxcbiAgaXNEYXRlU2luZ2xlUHJvcCxcbiAgaXNFbnVtQXJyYXlQcm9wLFxuICBpc0VudW1TaW5nbGVQcm9wLFxuICBpc0ludGVnZXJBcnJheVByb3AsXG4gIGlzSW50ZWdlclNpbmdsZVByb3AsXG4gIGlzSnNvblByb3AsXG4gIGlzTnVtYmVyQXJyYXlQcm9wLFxuICBpc051bWJlclNpbmdsZVByb3AsXG4gIGlzTnVtZXJpY0FycmF5UHJvcCxcbiAgaXNOdW1lcmljU2luZ2xlUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzU2VhcmNoVGV4dFByb3AsXG4gIGlzU3RyaW5nQXJyYXlQcm9wLFxuICBpc1N0cmluZ1NpbmdsZVByb3AsXG4gIGlzVHNWZWN0b3JQcm9wLFxuICBpc1V1aWRBcnJheVByb3AsXG4gIGlzVXVpZFNpbmdsZVByb3AsXG4gIGlzVmVjdG9yQXJyYXlQcm9wLFxuICBpc1ZlY3RvclNpbmdsZVByb3AsXG4gIGlzVmlydHVhbFByb3AsXG4gIHR5cGUgUmVuZGVyaW5nTm9kZSxcbiAgU29uYW11RmlsZUFycmF5U2NoZW1hLFxuICBTb25hbXVGaWxlU2NoZW1hLFxuICB0eXBlIFpvZFN0cmluZ0Zvcm1hdCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVJbXBvcnRVcmwgfSBmcm9tIFwiLi4vdXRpbHMvZXNtLXV0aWxzXCI7XG5pbXBvcnQgeyBydW50aW1lUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5cbi8vIDxhbnk+66W8IOyekOygnO2VmOqzoCwgWm9k7JeQ7IScIOygnOyVve2VmOuKlCDquLDrs7jsoIHsnbggR2VuZXJpYyBUeXBlIFBhcmFtZXRlcuulvCDsgqzsmqntlaguXG50eXBlIEFueVpvZFJlY29yZCA9IHouWm9kUmVjb3JkPHouWm9kU3RyaW5nIHwgei5ab2ROdW1iZXIgfCB6LlpvZFN5bWJvbCwgei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kT2JqZWN0ID0gei5ab2RPYmplY3Q8JFpvZExvb3NlU2hhcGU+O1xudHlwZSBBbnlab2ROdWxsYWJsZSA9IHouWm9kTnVsbGFibGU8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kRGVmYXVsdCA9IHouWm9kRGVmYXVsdDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RVbmlvbiA9IHouWm9kVW5pb248ei5ab2RUeXBlW10+O1xudHlwZSBBbnlab2RBcnJheSA9IHouWm9kQXJyYXk8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kT3B0aW9uYWwgPSB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT47XG50eXBlIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCA9IHouWm9kVGVtcGxhdGVMaXRlcmFsPHN0cmluZz47XG5cbi8qKlxuICog64K07J6lIO2DgOyehSDsoJXsnZggKFpvZCDsiqTtgqTrp4ggKyBVSSDroIzrjZTrp4Eg7YOA7J6FKVxuICovXG5leHBvcnQgY29uc3QgQlVJTFRfSU5fVFlQRVMgPSB7XG4gIFNvbmFtdUZpbGU6IHtcbiAgICBzY2hlbWE6IFNvbmFtdUZpbGVTY2hlbWEsXG4gICAgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGVcIixcbiAgICBzY2hlbWFOYW1lOiBcIlNvbmFtdUZpbGVTY2hlbWFcIixcbiAgfSxcbiAgXCJTb25hbXVGaWxlW11cIjoge1xuICAgIHNjaGVtYTogU29uYW11RmlsZUFycmF5U2NoZW1hLFxuICAgIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlLWFycmF5XCIsXG4gICAgc2NoZW1hTmFtZTogXCJTb25hbXVGaWxlQXJyYXlTY2hlbWFcIixcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogem9kRm9ybWF07J2EIFpvZCA0IOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICogWm9kIDTsl5DshJzripQgei5lbWFpbCgpLCB6LnV1aWQoKSDrk7Eg64+F66a97KCB7J24IO2VqOyImCDtmJXtg5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiB6b2RGb3JtYXRUb0NvZGUoZm9ybWF0OiBab2RTdHJpbmdGb3JtYXQpOiBzdHJpbmcge1xuICAvLyBJU08g7Y+s66e37J2AIHouaXNvLnh4eCgpIO2Yle2DnFxuICBjb25zdCBpc29Gb3JtYXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIGlzb0RhdGU6IFwiei5pc28uZGF0ZSgpXCIsXG4gICAgaXNvVGltZTogXCJ6Lmlzby50aW1lKClcIixcbiAgICBpc29EYXRldGltZTogXCJ6Lmlzby5kYXRldGltZSgpXCIsXG4gICAgaXNvRHVyYXRpb246IFwiei5pc28uZHVyYXRpb24oKVwiLFxuICB9O1xuXG4gIC8vIGhhc2gg7Y+s66e37J2AIHouaGFzaChcImFsZ29yaXRobVwiKSDtmJXtg5xcbiAgY29uc3QgaGFzaEZvcm1hdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgaGFzaE1kNTogJ3ouaGFzaChcIm1kNVwiKScsXG4gICAgaGFzaFNoYTE6ICd6Lmhhc2goXCJzaGExXCIpJyxcbiAgICBoYXNoU2hhMjU2OiAnei5oYXNoKFwic2hhMjU2XCIpJyxcbiAgICBoYXNoU2hhMzg0OiAnei5oYXNoKFwic2hhMzg0XCIpJyxcbiAgICBoYXNoU2hhNTEyOiAnei5oYXNoKFwic2hhNTEyXCIpJyxcbiAgfTtcblxuICBpZiAoZm9ybWF0IGluIGlzb0Zvcm1hdHMpIHtcbiAgICByZXR1cm4gaXNvRm9ybWF0c1tmb3JtYXRdO1xuICB9XG5cbiAgaWYgKGZvcm1hdCBpbiBoYXNoRm9ybWF0cykge1xuICAgIHJldHVybiBoYXNoRm9ybWF0c1tmb3JtYXRdO1xuICB9XG5cbiAgLy8g6riw67O4IO2PrOunt+ydgCB6Lnh4eCgpIO2Yle2DnCAoWm9kIDQpXG4gIHJldHVybiBgei4ke2Zvcm1hdH0oKWA7XG59XG5cbi8qKlxuICogem9kRm9ybWF07J2EIFpvZCA0IO2DgOyeheycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBab2QgNOyXkOyEnOuKlCB6LmVtYWlsKCksIHoudXVpZCgpIOuTsSDrj4Xrpr3soIHsnbgg7ZWo7IiYIO2Yle2DnOulvCDsgqzsmqntlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHpvZEZvcm1hdFRvVHlwZShmb3JtYXQ6IFpvZFN0cmluZ0Zvcm1hdCk6IHouWm9kVHlwZSB7XG4gIC8vIElTTyDtj6zrp7fsnYAgei5pc28ueHh4KCkg7ZiV7YOcXG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSBcImlzb0RhdGVcIjpcbiAgICAgIHJldHVybiB6Lmlzby5kYXRlKCk7XG4gICAgY2FzZSBcImlzb1RpbWVcIjpcbiAgICAgIHJldHVybiB6Lmlzby50aW1lKCk7XG4gICAgY2FzZSBcImlzb0RhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gei5pc28uZGF0ZXRpbWUoKTtcbiAgICBjYXNlIFwiaXNvRHVyYXRpb25cIjpcbiAgICAgIHJldHVybiB6Lmlzby5kdXJhdGlvbigpO1xuICAgIC8vIGhhc2gg7Y+s66e37J2AIHouaGFzaChcImFsZ29yaXRobVwiKSDtmJXtg5xcbiAgICBjYXNlIFwiaGFzaE1kNVwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcIm1kNVwiKTtcbiAgICBjYXNlIFwiaGFzaFNoYTFcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGExXCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhMjU2XCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwic2hhMjU2XCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhMzg0XCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwic2hhMzg0XCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhNTEyXCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwic2hhNTEyXCIpO1xuICAgIC8vIOq4sOuzuCDtj6zrp7fsnYAgei54eHgoKSDtmJXtg5wgKFpvZCA0KVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gKHogYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCAoKSA9PiB6LlpvZFR5cGU+KVtmb3JtYXRdKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIOuCtOyepSDtg4DsnoUoQlVJTFRfSU5fVFlQRV9JRFMp7J2AIOuwlOuhnCDrsJjtmZjtlZjqs6AsXG4gKiDqt7gg7Jm464qUIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICAvLyDrgrTsnqUg7YOA7J6FIOyymOumrFxuICBpZiAoKEJVSUxUX0lOX1RZUEVfSURTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh6b2RUeXBlSWQpKSB7XG4gICAgY29uc3QgYnVpbHRJblR5cGUgPSBCVUlMVF9JTl9UWVBFU1t6b2RUeXBlSWQgYXMga2V5b2YgdHlwZW9mIEJVSUxUX0lOX1RZUEVTXTtcbiAgICBpZiAoIWJ1aWx0SW5UeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOuCtOyepSDtg4DsnoUgJHt6b2RUeXBlSWR97J2YIOyKpO2CpOuniOqwgCDsoJXsnZjrkJjsp4Ag7JWK7JWY7Iq164uI64ukYCk7XG4gICAgfVxuICAgIHJldHVybiBidWlsdEluVHlwZS5zY2hlbWEuZGVzY3JpYmUoem9kVHlwZUlkKTtcbiAgfVxuXG4gIC8vIO2UhOuhnOygne2KuOyXkOyEnCDsoJXsnZjtlZwg7YOA7J6FIOuPmeyggSDroZzrk5xcbiAgY29uc3QgbW9kdWxlUGF0aCA9IEVudGl0eU1hbmFnZXIuZ2V0TW9kdWxlUGF0aCh6b2RUeXBlSWQpO1xuICBjb25zdCBtb2R1bGVBYnNQYXRoID0gcGF0aC5qb2luKFxuICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICBydW50aW1lUGF0aChgZGlzdC9hcHBsaWNhdGlvbi8ke21vZHVsZVBhdGh9LmpzYCksXG4gICk7XG4gIGNvbnN0IGltcG9ydFVybCA9IGNyZWF0ZUltcG9ydFVybChtb2R1bGVBYnNQYXRoKTtcbiAgY29uc3QgaW1wb3J0ZWQgPSBhd2FpdCBpbXBvcnQoaW1wb3J0VXJsKTtcblxuICBpZiAoIWltcG9ydGVkW3pvZFR5cGVJZF0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgem9kVHlwZUlkICR7em9kVHlwZUlkfWApO1xuICB9XG4gIHJldHVybiBpbXBvcnRlZFt6b2RUeXBlSWRdLmRlc2NyaWJlKHpvZFR5cGVJZCk7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOqwgSBwcm9w7J2YIO2DgOyeheyXkCDrlLDrnbwg7KCB7KCI7ZWcIFpvZCB2YWxpZGF0b3Lrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvcFRvWm9kVHlwZShwcm9wOiBFbnRpdHlQcm9wKTogUHJvbWlzZTx6LlpvZFR5cGVBbnk+IHtcbiAgbGV0IHpvZFR5cGU6IHouWm9kVHlwZUFueSA9IHoudW5rbm93bigpO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICB9IGVsc2UgaWYgKGlzSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJpZ2ludCgpO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJpZ2ludCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNFbnVtU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc0VudW1BcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gKGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIGlmIChwcm9wLnpvZEZvcm1hdCkge1xuICAgICAgem9kVHlwZSA9IHpvZEZvcm1hdFRvVHlwZShwcm9wLnpvZEZvcm1hdCk7XG4gICAgICBpZiAocHJvcC5sZW5ndGggJiYgXCJtYXhcIiBpbiB6b2RUeXBlKSB7XG4gICAgICAgIHpvZFR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZFN0cmluZykubWF4KHByb3AubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdBcnJheVByb3AocHJvcCkpIHtcbiAgICBsZXQgZWxlbWVudFR5cGU6IHouWm9kVHlwZTtcbiAgICBpZiAocHJvcC56b2RGb3JtYXQpIHtcbiAgICAgIGVsZW1lbnRUeXBlID0gem9kRm9ybWF0VG9UeXBlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCAmJiBcIm1heFwiIGluIGVsZW1lbnRUeXBlKSB7XG4gICAgICAgIGVsZW1lbnRUeXBlID0gKGVsZW1lbnRUeXBlIGFzIHouWm9kU3RyaW5nKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIGVsZW1lbnRUeXBlID0gei5zdHJpbmcoKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50VHlwZSA9IHouc3RyaW5nKCk7XG4gICAgfVxuICAgIHpvZFR5cGUgPSBlbGVtZW50VHlwZS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYm9vbGVhbigpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhbkFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJvb2xlYW4oKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzRGF0ZVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouZGF0ZSgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNVdWlkU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnV1aWQoKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei51dWlkKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0pzb25Qcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzU2VhcmNoVGV4dFByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5hcnJheSh6Lm51bWJlcigpKTtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmFycmF5KHouYXJyYXkoei5udW1iZXIoKSkpO1xuICB9IGVsc2UgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSkge1xuICAgICAgLy8gRksg7YOA7J6F7J2EIOywuOyhsCDsl5Tti7Dti7AgUEsg7YOA7J6F7JeQIOuUsOudvCDqsrDsoJVcbiAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICBjb25zdCBwa1R5cGUgPSByZWxFbnRpdHkuZ2V0UGtUeXBlKCk7XG4gICAgICBpZiAocGtUeXBlID09PSBcInN0cmluZ1wiIHx8IHBrVHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgem9kVHlwZSA9IHouc3RyaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB6b2RUeXBlID0gei5udW1iZXIoKS5pbnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBwcm9w7J2EIHpvZFR5cGXsnLzroZwg67OA7ZmY7ZWY64qU642wIOyLpO2MqCAke3Byb3B9fWApO1xuICB9XG5cbiAgaWYgKChwcm9wIGFzIHsgdW5zaWduZWQ/OiBib29sZWFuIH0pLnVuc2lnbmVkKSB7XG4gICAgem9kVHlwZSA9ICh6b2RUeXBlIGFzIHouWm9kTnVtYmVyKS5ub25uZWdhdGl2ZSgpO1xuICB9XG4gIGlmIChwcm9wLm51bGxhYmxlKSB7XG4gICAgem9kVHlwZSA9IHpvZFR5cGUubnVsbGFibGUoKTtcbiAgfVxuXG4gIHJldHVybiB6b2RUeXBlO1xufVxuXG4vKipcbiAqIEVudGl0eVByb3DsnYQgWm9kIO2DgOyehSDsoJXsnZgg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wVG9ab2RUeXBlRGVmKHByb3A6IEVudGl0eVByb3AsIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgbGV0IHN0bXQ6IHN0cmluZztcbiAgaWYgKGlzSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5pbnQoKWA7XG4gIH0gZWxzZSBpZiAoaXNJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouaW50KCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJpZ2ludCgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5iaWdpbnQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0VudW1TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc0VudW1BcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfS5hcnJheSgpYDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICBjb25zdCBiYXNlID0gem9kRm9ybWF0VG9Db2RlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtiYXNlfS5tYXgoJHtwcm9wLmxlbmd0aH0pYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke2Jhc2V9YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5tYXgoJHtwcm9wLmxlbmd0aH0pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKClgO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1N0cmluZ0FycmF5UHJvcChwcm9wKSkge1xuICAgIGlmIChwcm9wLnpvZEZvcm1hdCkge1xuICAgICAgY29uc3QgYmFzZSA9IHpvZEZvcm1hdFRvQ29kZShwcm9wLnpvZEZvcm1hdCk7XG4gICAgICBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX0ubWF4KCR7cHJvcC5sZW5ndGh9KS5hcnJheSgpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke2Jhc2V9LmFycmF5KClgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSkuYXJyYXkoKWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLmFycmF5KClgO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc051bWJlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5udW1iZXIoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5udW1iZXIoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKClgO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY0FycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRGF0ZVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5kYXRlKClgO1xuICB9IGVsc2UgaWYgKGlzRGF0ZUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmRhdGUoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYm9vbGVhbigpYDtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5BcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5ib29sZWFuKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNVdWlkU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnV1aWQoKWA7XG4gIH0gZWxzZSBpZiAoaXNVdWlkQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoudXVpZCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzSnNvblByb3AocHJvcCkpIHtcbiAgICAvLyDrgrTsnqUg7YOA7J6F7J24IOqyveyasCDsiqTtgqTrp4gg7J2066aE7Jy866GcIOuzgO2ZmFxuICAgIGlmICgoQlVJTFRfSU5fVFlQRV9JRFMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHByb3AuaWQpKSB7XG4gICAgICBjb25zdCBzY2hlbWFOYW1lID0gcHJvcC5pZCA9PT0gXCJTb25hbXVGaWxlXCIgPyBcIlNvbmFtdUZpbGVTY2hlbWFcIiA6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCI7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtzY2hlbWFOYW1lfWA7XG4gICAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2goc2NoZW1hTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6Lm51bWJlcigpKWA7XG4gIH0gZWxzZSBpZiAoaXNWZWN0b3JBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6LmFycmF5KHoubnVtYmVyKCkpKWA7XG4gIH0gZWxzZSBpZiAoaXNUc1ZlY3RvclByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSkge1xuICAgICAgLy8gRksgWm9kIO2DgOyeheydhCDssLjsobAg7JeU7Yuw7YuwIFBLIO2DgOyeheyXkCDrlLDrnbwg6rKw7KCVXG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgY29uc3QgcGtUeXBlID0gcmVsRW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgaWYgKHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LnN0cmluZygpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LmludCgpYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6re47Jm4IHJlbGF0aW9uIOy8gOydtOyKpCDsoJzsmbhcbiAgICAgIHJldHVybiBgLy8gJHtwcm9wLm5hbWV9OiAke3Byb3AucmVsYXRpb25UeXBlfSAke3Byb3Aud2l0aH1gO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCIvLyB1bmFibGUgdG8gcmVzb2x2ZVwiO1xuICB9XG5cbiAgaWYgKChwcm9wIGFzIHsgdW5zaWduZWQ/OiBib29sZWFuIH0pLnVuc2lnbmVkKSB7XG4gICAgc3RtdCArPSBcIi5ub25uZWdhdGl2ZSgpXCI7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICBzdG10ICs9IFwiLm51bGxhYmxlKClcIjtcbiAgfVxuXG4gIC8vIG51bWVyaWMg7YOA7J6F7J2YIOqyveyasCBudWxsYWJsZSDsnbTtm4Tsl5AgbWV0YSDstpTqsIAgKOuplO2DgOuNsOydtO2EsOqwgCDstZzsg4HsnIQg66CI67Ko7JeQIOyeiOyWtOyVvCDtlagpXG4gIGlmIChpc051bWVyaWNTaW5nbGVQcm9wKHByb3ApIHx8IGlzTnVtZXJpY0FycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgKz0gJy5tZXRhKHsgU29uYW11UHJvcFR5cGU6IFwibnVtZXJpY1wiIH0pJztcbiAgfVxuXG4gIHJldHVybiBgJHtzdG10fSxgO1xufVxuXG4vKipcbiAqIEVudGl0eVByb3BOb2Rl66W8IFpvZCDtg4DsnoUg7KCV7J2YIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICogcGxhaW4sIGFycmF5LCBvYmplY3Qg64W465OcIO2DgOyeheydhCDsnqzqt4DsoIHsnLzroZwg7LKY66as7ZWY7JesIOykkeyyqSDqtazsobDrpbwg7KeA7JuQ7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcE5vZGVUb1pvZFR5cGVEZWYocHJvcE5vZGU6IEVudGl0eVByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJwbGFpblwiKSB7XG4gICAgcmV0dXJuIHByb3BUb1pvZFR5cGVEZWYocHJvcE5vZGUucHJvcCwgaW5qZWN0SW1wb3J0S2V5cyk7XG4gIH0gZWxzZSBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9wTm9kZS5wcm9wID8gYCR7cHJvcE5vZGUucHJvcC5uYW1lfTogYCA6IFwiXCIsXG4gICAgICBcInouYXJyYXkoei5vYmplY3Qoe1wiLFxuICAgICAgcHJvcE5vZGUuY2hpbGRyZW5cbiAgICAgICAgLm1hcCgoY2hpbGRQcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYoY2hpbGRQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5cykpXG4gICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgXCJcIixcbiAgICAgIFwifSkpLFwiLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9wTm9kZS5wcm9wID8gYCR7cHJvcE5vZGUucHJvcC5uYW1lfTogYCA6IFwiXCIsXG4gICAgICBcInoub2JqZWN0KHtcIixcbiAgICAgIHByb3BOb2RlLmNoaWxkcmVuXG4gICAgICAgIC5tYXAoKGNoaWxkUHJvcE5vZGUpID0+IHByb3BOb2RlVG9ab2RUeXBlRGVmKGNoaWxkUHJvcE5vZGUsIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgIFwiXCIsXG4gICAgICBgfSkke3Byb3BOb2RlLnByb3A/Lm51bGxhYmxlID8gXCIubnVsbGFibGUoKVwiIDogXCJcIn0sYCxcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1RzVHlwZURlZih6dDogei5ab2RUeXBlKTogc3RyaW5nIHtcbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICBjYXNlIFwibmV2ZXJcIjpcbiAgICAgIHJldHVybiB6dC5kZWYudHlwZTtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZE51bGxhYmxlKS5kZWYuaW5uZXJUeXBlKX0gfCBudWxsYDtcbiAgICBjYXNlIFwiZGVmYXVsdFwiOlxuICAgICAgcmV0dXJuIHpvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kRGVmYXVsdCkuZGVmLmlubmVyVHlwZSk7XG4gICAgY2FzZSBcInJlY29yZFwiOiB7XG4gICAgICBjb25zdCByZWNvcmRUeXBlID0genQgYXMgQW55Wm9kUmVjb3JkO1xuICAgICAgcmV0dXJuIGB7IFsga2V5OiAke3pvZFR5cGVUb1RzVHlwZURlZihyZWNvcmRUeXBlLmRlZi5rZXlUeXBlKX0gXTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYudmFsdWVUeXBlKX19YDtcbiAgICB9XG4gICAgY2FzZSBcImxpdGVyYWxcIjpcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKCh6dCBhcyB6LlpvZExpdGVyYWwpLnZhbHVlcylcbiAgICAgICAgLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYG51bGxgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYHVuZGVmaW5lZGA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKFwiIHwgXCIpO1xuICAgIGNhc2UgXCJ1bmlvblwiOlxuICAgICAgcmV0dXJuIGAkeyh6dCBhcyBBbnlab2RVbmlvbikub3B0aW9uc1xuICAgICAgICAubWFwKChvcHRpb24pID0+IHpvZFR5cGVUb1RzVHlwZURlZihvcHRpb24pKVxuICAgICAgICAuam9pbihcIiB8IFwiKX1gO1xuICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICByZXR1cm4gYCR7KHp0IGFzIHouWm9kRW51bSkub3B0aW9ucy5tYXAoKHZhbCkgPT4gYFwiJHt2YWx9XCJgKS5qb2luKFwiIHwgXCIpfWA7XG4gICAgY2FzZSBcImFycmF5XCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2RBcnJheSkuZWxlbWVudCl9W11gO1xuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3Qgc2hhcGUgPSAoenQgYXMgQW55Wm9kT2JqZWN0KS5zaGFwZTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwie1wiLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhzaGFwZSkubWFwKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAoc2hhcGVba2V5XS5kZWYudHlwZSA9PT0gXCJvcHRpb25hbFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7a2V5fT86ICR7em9kVHlwZVRvVHNUeXBlRGVmKHNoYXBlW2tleV0uZGVmLmlubmVyVHlwZSl9LGA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtrZXl9OiAke3pvZFR5cGVUb1RzVHlwZURlZihzaGFwZVtrZXldKX0sYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBcIn1cIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICB9XG4gICAgY2FzZSBcIm9wdGlvbmFsXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2RPcHRpb25hbCkuZGVmLmlubmVyVHlwZSl9IHwgdW5kZWZpbmVkYDtcbiAgICBjYXNlIFwidGVtcGxhdGVfbGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBkZWYgPSAoenQgYXMgQW55Wm9kVGVtcGxhdGVMaXRlcmFsKS5kZWY7XG5cbiAgICAgIC8vIOu5iCB0ZW1wbGF0ZSBsaXRlcmFs7J2AIHN0cmluZ+ycvOuhnCDtj7TrsLFcbiAgICAgIGlmICghZGVmLnBhcnRzIHx8IGRlZi5wYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIOqwgSBwYXJ066W8IFR5cGVTY3JpcHQg7YOA7J6FIOusuOyekOyXtOuhnCDrs4DtmZhcbiAgICAgIGNvbnN0IHBhcnRzID0gZGVmLnBhcnRzLm1hcCgocGFydDogdW5rbm93bikgPT4ge1xuICAgICAgICAvLyDrpqzthLDrn7Qg6rCSIChzdHJpbmcsIG51bWJlciwgYm9vbGVhbiwgbnVsbCwgdW5kZWZpbmVkKVxuICAgICAgICBpZiAodHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gYCR7cGFydH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gWm9kVHlwZSAtIOyerOq3gOyggeycvOuhnCDrs4DtmZhcbiAgICAgICAgaWYgKHBhcnQgJiYgdHlwZW9mIHBhcnQgPT09IFwib2JqZWN0XCIgJiYgKHBhcnQgYXMgei5ab2RUeXBlKS5fem9kKSB7XG4gICAgICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVHlwZVRvVHNUeXBlRGVmKHBhcnQgYXMgei5ab2RUeXBlKTtcbiAgICAgICAgICByZXR1cm4gYCRcXHske2lubmVyVHlwZX19YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2PtOuwsVxuICAgICAgICByZXR1cm4gYFxcJHtzdHJpbmd9YDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYFxcYCR7cGFydHMuam9pbihcIlwiKX1cXGBgO1xuICAgIH1cbiAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgcmV0dXJuIFwiRmlsZVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyymOumrOuQmOyngCDslYrsnYAgWm9kVHlwZSAke3p0LmRlZi50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyehSDsnbjsiqTthLTsiqTrpbwg7ZW064u57ZWY64qUIFpvZCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1pvZENvZGUoenQ6IHouWm9kVHlwZSk6IHN0cmluZyB7XG4gIHN3aXRjaCAoenQuZGVmLnR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gXCJ6LnN0cmluZygpXCI7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIFwiei5udW1iZXIoKVwiO1xuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgIHJldHVybiBcInouYmlnaW50KClcIjtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIFwiei5ib29sZWFuKClcIjtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiei5kYXRlKClcIjtcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgICAgcmV0dXJuIFwiei5udWxsKClcIjtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gXCJ6LnVuZGVmaW5lZCgpXCI7XG4gICAgY2FzZSBcImFueVwiOlxuICAgICAgcmV0dXJuIFwiei5hbnkoKVwiO1xuICAgIGNhc2UgXCJ1bmtub3duXCI6XG4gICAgICByZXR1cm4gXCJ6LnVua25vd24oKVwiO1xuICAgIGNhc2UgXCJuZXZlclwiOlxuICAgICAgcmV0dXJuIFwiei5uZXZlcigpXCI7XG4gICAgY2FzZSBcIm51bGxhYmxlXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvWm9kQ29kZSgoenQgYXMgQW55Wm9kTnVsbGFibGUpLmRlZi5pbm5lclR5cGUpfS5udWxsYWJsZSgpYDtcbiAgICBjYXNlIFwiZGVmYXVsdFwiOiB7XG4gICAgICBjb25zdCB6RGVmYXVsdERlZiA9ICh6dCBhcyBBbnlab2REZWZhdWx0KS5kZWY7XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvWm9kQ29kZSh6RGVmYXVsdERlZi5pbm5lclR5cGUpfS5kZWZhdWx0KCR7ekRlZmF1bHREZWYuZGVmYXVsdFZhbHVlfSlgO1xuICAgIH1cbiAgICBjYXNlIFwicmVjb3JkXCI6IHtcbiAgICAgIGNvbnN0IHpSZWNvcmREZWYgPSAoenQgYXMgQW55Wm9kUmVjb3JkKS5kZWY7XG4gICAgICByZXR1cm4gYHoucmVjb3JkKCR7em9kVHlwZVRvWm9kQ29kZSh6UmVjb3JkRGVmLmtleVR5cGUpfSwgJHt6b2RUeXBlVG9ab2RDb2RlKFxuICAgICAgICB6UmVjb3JkRGVmLnZhbHVlVHlwZSxcbiAgICAgICl9KWA7XG4gICAgfVxuICAgIGNhc2UgXCJsaXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbSgoenQgYXMgei5ab2RMaXRlcmFsPHN0cmluZyB8IG51bWJlcj4pLnZhbHVlcykubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYHoubGl0ZXJhbCgke2l0ZW1zWzBdfSlgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoWyR7aXRlbXMuam9pbihcIiwgXCIpfV0pYDtcbiAgICB9XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYHoudW5pb24oWyR7KHp0IGFzIEFueVpvZFVuaW9uKS5kZWYub3B0aW9uc1xuICAgICAgICAubWFwKChvcHRpb246IHouWm9kVHlwZSkgPT4gem9kVHlwZVRvWm9kQ29kZShvcHRpb24pKVxuICAgICAgICAuam9pbihcIixcIil9XSlgO1xuICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAvLyBOT1RFOiB6LmVudW0oW1wiQVwiLCBcIkJcIl0p64+EIHouZW51bSh7IEE6IFwiQVwiLCBCOiBcIkJcIiB9KeuhnCDsspjrpqzrkKguXG4gICAgICByZXR1cm4gYHouZW51bSh7JHtPYmplY3QuZW50cmllcygoenQgYXMgei5ab2RFbnVtKS5kZWYuZW50cmllcylcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsXSkgPT4gKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIgPyBgJHtrZXl9OiBcIiR7dmFsfVwiYCA6IGAke2tleX06ICR7dmFsfWApKVxuICAgICAgICAuam9pbihcIiwgXCIpfX0pYDtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiBgei5hcnJheSgke3pvZFR5cGVUb1pvZENvZGUoKHp0IGFzIHouWm9kQXJyYXk8ei5ab2RUeXBlPikuZGVmLmVsZW1lbnQpfSlgO1xuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3Qgc2hhcGUgPSAoenQgYXMgQW55Wm9kT2JqZWN0KS5zaGFwZTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwiei5vYmplY3Qoe1wiLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhzaGFwZSkubWFwKChrZXkpID0+IGAke2tleX06ICR7em9kVHlwZVRvWm9kQ29kZShzaGFwZVtrZXldKX0sYCksXG4gICAgICAgIFwifSlcIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICB9XG4gICAgY2FzZSBcIm9wdGlvbmFsXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvWm9kQ29kZSgoenQgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlKX0ub3B0aW9uYWwoKWA7XG4gICAgY2FzZSBcImZpbGVcIjpcbiAgICAgIHJldHVybiBgei5maWxlKClgO1xuICAgIGNhc2UgXCJ0ZW1wbGF0ZV9saXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGRlZiA9ICh6dCBhcyBBbnlab2RUZW1wbGF0ZUxpdGVyYWwpLmRlZjtcblxuICAgICAgLy8g67mIIHRlbXBsYXRlIGxpdGVyYWxcbiAgICAgIGlmICghZGVmLnBhcnRzIHx8IGRlZi5wYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFwiei50ZW1wbGF0ZUxpdGVyYWwoW10pXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIOqwgSBwYXJ066W8IFpvZCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmFxuICAgICAgY29uc3QgcGFydHMgPSBkZWYucGFydHMubWFwKChwYXJ0OiB1bmtub3duKSA9PiB7XG4gICAgICAgIC8vIOusuOyekOyXtCDrpqzthLDrn7RcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGBcIiR7cGFydH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gWm9kVHlwZSAtIOyerOq3gOyggeycvOuhnCDrs4DtmZhcbiAgICAgICAgaWYgKHBhcnQgJiYgdHlwZW9mIHBhcnQgPT09IFwib2JqZWN0XCIgJiYgKHBhcnQgYXMgei5ab2RUeXBlKS5fem9kKSB7XG4gICAgICAgICAgcmV0dXJuIHpvZFR5cGVUb1pvZENvZGUocGFydCBhcyB6LlpvZFR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7Y+067CxXG4gICAgICAgIHJldHVybiBcInouc3RyaW5nKClcIjtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYHoudGVtcGxhdGVMaXRlcmFsKFske3BhcnRzLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgfVxuICAgIGNhc2UgXCJpbnRlcnNlY3Rpb25cIjoge1xuICAgICAgY29uc3QgekludGVyc2VjdGlvbkRlZiA9ICh6dCBhcyB6LlpvZEludGVyc2VjdGlvbjx6LlpvZFR5cGUsIHouWm9kVHlwZT4pLmRlZjtcbiAgICAgIHJldHVybiBgei5pbnRlcnNlY3Rpb24oJHt6b2RUeXBlVG9ab2RDb2RlKHpJbnRlcnNlY3Rpb25EZWYubGVmdCl9LCAke3pvZFR5cGVUb1pvZENvZGUoekludGVyc2VjdGlvbkRlZi5yaWdodCl9KWA7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyymOumrOuQmOyngCDslYrsnYAgWm9kVHlwZSAke3p0LmRlZi50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyeheydhCBVSSDroIzrjZTrp4Hsl5Ag7IKs7Jqp7ZWgIOyImCDsnojripQgUmVuZGVyaW5nTm9kZeuhnCDrs4DtmZjtlanri4jri6QuXG4gKiDsnqzqt4DsoIHsnLzroZwg7KSR7LKp65CcIO2DgOyeheuTpOydhCDsspjrpqztlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKFxuICB6b2RUeXBlOiB6LlpvZFR5cGVBbnksXG4gIGJhc2VLZXk6IHN0cmluZyA9IFwicm9vdFwiLFxuKTogUmVuZGVyaW5nTm9kZSB7XG4gIGNvbnN0IGRlZiA9IHtcbiAgICBuYW1lOiBiYXNlS2V5LFxuICAgIGxhYmVsOiBpbmZsZWN0aW9uLmNhbWVsaXplKGJhc2VLZXksIGZhbHNlKSxcbiAgICB6b2RUeXBlLFxuICB9O1xuXG4gIC8qKlxuICAgKiDsvIDsnbTsiqQg7LKY66asIOyInOyEnFxuICAgKlxuICAgKiAxLiDtirnsiJgg7LyA7J207IqkIChkZXNjcmlwdGlvbiDquLDrsJgpXG4gICAqICAgIC0gU29uYW11RmlsZS9Tb25hbXVGaWxlW10gOiB6Lm9iamVjdC96LmFycmF57J207KeA66eMIO2MjOydvCDsl4XroZzrk5zsmqkg64K07J6lIO2DgOyehVxuICAgKlxuICAgKiAyLiDsnbzrsJgg7LyA7J207IqkIChpbnN0YW5jZW9mIOq4sOuwmClcbiAgICogICAgLSB6LlpvZE9iamVjdCA6IOydvOuwmCDqsJ3ssrRcbiAgICogICAgLSB6LlpvZEFycmF5IDog7J2867CYIOuwsOyXtFxuICAgKiAgICAgIC0gdmVjdG9yIDogei5hcnJheSh6Lm51bWJlcinsnbTsp4Drp4wg64Sk7J2067CNIOq4sOuwmOycvOuhnCDrsqHthLAg7J6E67Kg65SpXG4gICAqICAgICAgLSDsnbzrsJgg67Cw7Je0IDog6re4IOyZuFxuICAgKiAgICAtIHouWm9kVW5pb24sIHouWm9kT3B0aW9uYWwsIHouWm9kTnVsbGFibGUgOiDsnKDti7jrpqzti7Ag7YOA7J6FXG4gICAqICAgIC0g6riw7YOAIDogcmVzb2x2ZVJlbmRlclR5cGUoKeycvOuhnCDsspjrpqxcbiAgICovXG5cbiAgLy8g7Yq57IiYIOy8gOydtOyKpDogU29uYW11RmlsZVtdIO2DgOyehSDqsJDsp4BcbiAgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU29uYW11RmlsZVtdXCIpIHtcbiAgICByZXR1cm4geyAuLi5kZWYsIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlLWFycmF5XCIgfTtcbiAgfVxuXG4gIC8vIO2KueyImCDsvIDsnbTsiqQ6IFNvbmFtdUZpbGUg64uo7J28IO2DgOyehSDqsJDsp4BcbiAgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU29uYW11RmlsZVwiKSB7XG4gICAgcmV0dXJuIHsgLi4uZGVmLCByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZVwiIH07XG4gIH1cblxuICAvLyDsnbzrsJgg7LyA7J207IqkOiBab2RPYmplY3Qg7LK07YGsXG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RPYmplY3QpIHtcbiAgICBjb25zdCBjb2x1bW5LZXlzID0gT2JqZWN0LmtleXMoem9kVHlwZS5zaGFwZSk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjb2x1bW5LZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUeXBlLnNoYXBlW2tleV07XG4gICAgICByZXR1cm4gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGtleSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjaGlsZHJlbixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFycmF5KSB7XG4gICAgY29uc3QgaW5uZXJUeXBlID0gKHpvZFR5cGUgYXMgei5ab2RBcnJheTx6LlpvZFR5cGVBbnk+KS5kZWYuZWxlbWVudDtcbiAgICAvLyB2ZWN0b3Ig7YOA7J6FIO2MkOuzhDogbnVtYmVyIOuwsOyXtOydtOuptOyEnCBlbWJlZGRpbmcsIHZlY3RvciDrk7HsnZgg7J2066aE7J2EIOqwgOynhCDqsr3smrBcbiAgICBpZiAoXG4gICAgICBpbm5lclR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bWJlciAmJlxuICAgICAgKGJhc2VLZXkuaW5jbHVkZXMoXCJlbWJlZGRpbmdcIikgfHwgYmFzZUtleS5pbmNsdWRlcyhcInZlY3RvclwiKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRlZixcbiAgICAgICAgcmVuZGVyVHlwZTogXCJ2ZWN0b3JcIixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWYsXG4gICAgICByZW5kZXJUeXBlOiBcImFycmF5XCIsXG4gICAgICBlbGVtZW50OiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGlubmVyVHlwZSwgYmFzZUtleSksXG4gICAgfTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmlvbikge1xuICAgIGNvbnN0IG9wdGlvbk5vZGVzID0gKHpvZFR5cGUgYXMgei5ab2RVbmlvbjx6LlpvZFR5cGVbXT4pLmRlZi5vcHRpb25zLm1hcCgob3B0KSA9PlxuICAgICAgem9kVHlwZVRvUmVuZGVyaW5nTm9kZShvcHQsIGJhc2VLZXkpLFxuICAgICk7XG4gICAgLy8gVE9ETzogWm9kVW5pb27snbQg65Ok7Ja07J6I64qUIOqyveyasCDtlbjrk6Trp4FcbiAgICByZXR1cm4gb3B0aW9uTm9kZXNbMF07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kT3B0aW9uYWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZSgoem9kVHlwZSBhcyB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2ROdWxsYWJsZSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi56b2RUeXBlVG9SZW5kZXJpbmdOb2RlKCh6b2RUeXBlIGFzIHouWm9kTnVsbGFibGU8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSwgYmFzZUtleSksXG4gICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWYsXG4gICAgICByZW5kZXJUeXBlOiByZXNvbHZlUmVuZGVyVHlwZShiYXNlS2V5LCB6b2RUeXBlKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyeheqzvCDtgqQg7J2066aE7Jy866Gc67aA7YSwIOyggeygiO2VnCBSZW5kZXJUeXBl7J2EIOqysOygle2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlbmRlclR5cGUoa2V5OiBzdHJpbmcsIHpvZFR5cGU6IHouWm9kVHlwZUFueSk6IFJlbmRlcmluZ05vZGVbXCJyZW5kZXJUeXBlXCJdIHtcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZERhdGUpIHtcbiAgICByZXR1cm4gXCJkYXRldGltZVwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LmNvcmUuJFpvZFN0cmluZykge1xuICAgIC8vIE5PVEU6IHouWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VmOuptCB6LnVybCgpLCB6LmVtYWlsKCkg65Ox7J2YIO2DgOyeheyXkOyEnCDrrLjsoJzqsIAg7IOd6riw66+A66GcIHouY29yZS4kWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VqFxuICAgIC8vIEZJWE1FOiBlbWFpbOydtOuCmCB1cmwg7YOA7J6FIOuTseyXkCDrjIDtlZwg7LKY66as6rCAIO2VhOyalO2VqFxuICAgIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNRTERhdGVUaW1lU3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1kYXRldGltZVwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiZGF0ZVwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGVcIjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2ROdW1iZXIpIHtcbiAgICBpZiAoa2V5ID09PSBcImlkXCIpIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1pZFwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiX2lkXCIpKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItZmtfaWRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLXBsYWluXCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEJvb2xlYW4pIHtcbiAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgIHJldHVybiBcImVudW1zXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kUmVjb3JkKSB7XG4gICAgcmV0dXJuIFwicmVjb3JkXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQW55IHx8IHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVua25vd24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmlvbikge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZExpdGVyYWwpIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RUZW1wbGF0ZUxpdGVyYWwpIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlLmRlZi50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIFwib2JqZWN0XCI7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7IuxIOu2iOqwgCAke2tleX0gJHt6b2RUeXBlLmRlZi50eXBlfWApO1xuICB9XG59XG4iXSwibmFtZXMiOlsiaW5mbGVjdGlvbiIsInBhdGgiLCJ6IiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIkJVSUxUX0lOX1RZUEVfSURTIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc0JpZ0ludGVnZXJBcnJheVByb3AiLCJpc0JpZ0ludGVnZXJTaW5nbGVQcm9wIiwiaXNCb29sZWFuQXJyYXlQcm9wIiwiaXNCb29sZWFuU2luZ2xlUHJvcCIsImlzRGF0ZUFycmF5UHJvcCIsImlzRGF0ZVNpbmdsZVByb3AiLCJpc0VudW1BcnJheVByb3AiLCJpc0VudW1TaW5nbGVQcm9wIiwiaXNJbnRlZ2VyQXJyYXlQcm9wIiwiaXNJbnRlZ2VyU2luZ2xlUHJvcCIsImlzSnNvblByb3AiLCJpc051bWJlckFycmF5UHJvcCIsImlzTnVtYmVyU2luZ2xlUHJvcCIsImlzTnVtZXJpY0FycmF5UHJvcCIsImlzTnVtZXJpY1NpbmdsZVByb3AiLCJpc09uZVRvT25lUmVsYXRpb25Qcm9wIiwiaXNSZWxhdGlvblByb3AiLCJpc1NlYXJjaFRleHRQcm9wIiwiaXNTdHJpbmdBcnJheVByb3AiLCJpc1N0cmluZ1NpbmdsZVByb3AiLCJpc1RzVmVjdG9yUHJvcCIsImlzVXVpZEFycmF5UHJvcCIsImlzVXVpZFNpbmdsZVByb3AiLCJpc1ZlY3RvckFycmF5UHJvcCIsImlzVmVjdG9yU2luZ2xlUHJvcCIsImlzVmlydHVhbFByb3AiLCJTb25hbXVGaWxlQXJyYXlTY2hlbWEiLCJTb25hbXVGaWxlU2NoZW1hIiwiY3JlYXRlSW1wb3J0VXJsIiwicnVudGltZVBhdGgiLCJCVUlMVF9JTl9UWVBFUyIsIlNvbmFtdUZpbGUiLCJzY2hlbWEiLCJyZW5kZXJUeXBlIiwic2NoZW1hTmFtZSIsInpvZEZvcm1hdFRvQ29kZSIsImZvcm1hdCIsImlzb0Zvcm1hdHMiLCJpc29EYXRlIiwiaXNvVGltZSIsImlzb0RhdGV0aW1lIiwiaXNvRHVyYXRpb24iLCJoYXNoRm9ybWF0cyIsImhhc2hNZDUiLCJoYXNoU2hhMSIsImhhc2hTaGEyNTYiLCJoYXNoU2hhMzg0IiwiaGFzaFNoYTUxMiIsInpvZEZvcm1hdFRvVHlwZSIsImlzbyIsImRhdGUiLCJ0aW1lIiwiZGF0ZXRpbWUiLCJkdXJhdGlvbiIsImhhc2giLCJnZXRab2RUeXBlQnlJZCIsInpvZFR5cGVJZCIsImluY2x1ZGVzIiwiYnVpbHRJblR5cGUiLCJFcnJvciIsImRlc2NyaWJlIiwibW9kdWxlUGF0aCIsImdldE1vZHVsZVBhdGgiLCJtb2R1bGVBYnNQYXRoIiwiam9pbiIsImFwaVJvb3RQYXRoIiwiaW1wb3J0VXJsIiwiaW1wb3J0ZWQiLCJwcm9wVG9ab2RUeXBlIiwicHJvcCIsInpvZFR5cGUiLCJ1bmtub3duIiwibnVtYmVyIiwiaW50IiwiYXJyYXkiLCJiaWdpbnQiLCJpZCIsInpvZEZvcm1hdCIsImxlbmd0aCIsIm1heCIsInN0cmluZyIsImVsZW1lbnRUeXBlIiwiYm9vbGVhbiIsInV1aWQiLCJoYXNKb2luQ29sdW1uIiwicmVsRW50aXR5IiwiZ2V0Iiwid2l0aCIsInBrVHlwZSIsImdldFBrVHlwZSIsInVuc2lnbmVkIiwibm9ubmVnYXRpdmUiLCJudWxsYWJsZSIsInByb3BUb1pvZFR5cGVEZWYiLCJpbmplY3RJbXBvcnRLZXlzIiwic3RtdCIsIm5hbWUiLCJwdXNoIiwiYmFzZSIsInJlbGF0aW9uVHlwZSIsInByb3BOb2RlVG9ab2RUeXBlRGVmIiwicHJvcE5vZGUiLCJub2RlVHlwZSIsImNoaWxkcmVuIiwibWFwIiwiY2hpbGRQcm9wTm9kZSIsInpvZFR5cGVUb1RzVHlwZURlZiIsInp0IiwiZGVmIiwidHlwZSIsImlubmVyVHlwZSIsInJlY29yZFR5cGUiLCJrZXlUeXBlIiwidmFsdWVUeXBlIiwiQXJyYXkiLCJmcm9tIiwidmFsdWVzIiwidmFsdWUiLCJ1bmRlZmluZWQiLCJvcHRpb25zIiwib3B0aW9uIiwidmFsIiwiZWxlbWVudCIsInNoYXBlIiwiT2JqZWN0Iiwia2V5cyIsImtleSIsInBhcnRzIiwicGFydCIsIl96b2QiLCJ6b2RUeXBlVG9ab2RDb2RlIiwiekRlZmF1bHREZWYiLCJkZWZhdWx0VmFsdWUiLCJ6UmVjb3JkRGVmIiwiaXRlbXMiLCJlbnRyaWVzIiwiekludGVyc2VjdGlvbkRlZiIsImxlZnQiLCJyaWdodCIsInpvZFR5cGVUb1JlbmRlcmluZ05vZGUiLCJiYXNlS2V5IiwibGFiZWwiLCJjYW1lbGl6ZSIsImRlc2NyaXB0aW9uIiwiWm9kT2JqZWN0IiwiY29sdW1uS2V5cyIsIlpvZEFycmF5IiwiWm9kTnVtYmVyIiwiWm9kVW5pb24iLCJvcHRpb25Ob2RlcyIsIm9wdCIsIlpvZE9wdGlvbmFsIiwib3B0aW9uYWwiLCJab2ROdWxsYWJsZSIsInJlc29sdmVSZW5kZXJUeXBlIiwiWm9kRGF0ZSIsImNvcmUiLCIkWm9kU3RyaW5nIiwiZW5kc1dpdGgiLCJab2RCb29sZWFuIiwiWm9kRW51bSIsIlpvZFJlY29yZCIsIlpvZEFueSIsIlpvZFVua25vd24iLCJab2RMaXRlcmFsIiwiWm9kVGVtcGxhdGVMaXRlcmFsIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0JDLEdBRUQsT0FBT0EsZ0JBQWdCLGFBQWE7QUFDcEMsT0FBT0MsVUFBVSxPQUFPO0FBQ3hCLFNBQVNDLENBQUMsUUFBUSxNQUFNO0FBRXhCLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUNFQyxpQkFBaUIsRUFHakJDLDBCQUEwQixFQUMxQkMscUJBQXFCLEVBQ3JCQyxzQkFBc0IsRUFDdEJDLGtCQUFrQixFQUNsQkMsbUJBQW1CLEVBQ25CQyxlQUFlLEVBQ2ZDLGdCQUFnQixFQUNoQkMsZUFBZSxFQUNmQyxnQkFBZ0IsRUFDaEJDLGtCQUFrQixFQUNsQkMsbUJBQW1CLEVBQ25CQyxVQUFVLEVBQ1ZDLGlCQUFpQixFQUNqQkMsa0JBQWtCLEVBQ2xCQyxrQkFBa0IsRUFDbEJDLG1CQUFtQixFQUNuQkMsc0JBQXNCLEVBQ3RCQyxjQUFjLEVBQ2RDLGdCQUFnQixFQUNoQkMsaUJBQWlCLEVBQ2pCQyxrQkFBa0IsRUFDbEJDLGNBQWMsRUFDZEMsZUFBZSxFQUNmQyxnQkFBZ0IsRUFDaEJDLGlCQUFpQixFQUNqQkMsa0JBQWtCLEVBQ2xCQyxhQUFhLEVBRWJDLHFCQUFxQixFQUNyQkMsZ0JBQWdCLFFBRVgsb0JBQWlCO0FBQ3hCLFNBQVNDLGVBQWUsUUFBUSx3QkFBcUI7QUFDckQsU0FBU0MsV0FBVyxRQUFRLHlCQUFzQjtBQVlsRDs7Q0FFQyxHQUNELE9BQU8sTUFBTUMsaUJB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
|
|
622
|
+
//#endregion
|
|
623
|
+
init_zod_converter();
|
|
624
|
+
export { BUILT_IN_TYPES, getZodTypeById, init_zod_converter, propNodeToZodTypeDef, propToZodType, propToZodTypeDef, zodTypeToRenderingNode, zodTypeToTsTypeDef, zodTypeToZodCode };
|
|
625
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kLWNvbnZlcnRlci5qcyIsIm5hbWVzIjpbImlzb0Zvcm1hdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4iLCJoYXNoRm9ybWF0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiIsInoiLCJ6b2RUeXBlOiB6LlpvZFR5cGVBbnkiLCJlbGVtZW50VHlwZTogei5ab2RUeXBlIiwic3RtdDogc3RyaW5nIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbXBsYXRlL3pvZC1jb252ZXJ0ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB6b2QtY29udmVydGVyIOq1rOyEsVxuICogMS4g7Jyg7Yu466as7YuwXG4gKiAgLSBnZXRab2RUeXBlQnlJZFxuICpcbiAqIDIuIFpvZCDtg4DsnoUg67OA7ZmYIChFbnRpdHlQcm9wIC0+IFpvZFR5cGUpXG4gKiAgLSBwcm9wVG9ab2RUeXBlXG4gKlxuICogMy4gRW50aXR5UHJvcC9Ob2RlIC0+IFpvZCDsvZTrk5wg66y47J6Q7Je0XG4gKiAgLSBwcm9wVG9ab2RUeXBlRGVmXG4gKiAgLSBwcm9wTm9kZVRvWm9kVHlwZURlZlxuICpcbiAqIDQuIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66W8IO2VtOuLue2VmOuKlCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZggKFpvZFR5cGUgLT4gWm9kQ29kZSlcbiAqICAtIHpvZFR5cGVUb1pvZENvZGVcbiAqXG4gKiA1LiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmCAoWm9kVHlwZSAtPiBSZW5kZXJpbmdOb2RlKVxuICogIC0gem9kVHlwZVRvUmVuZGVyaW5nTm9kZVxuICogIC0gcmVzb2x2ZVJlbmRlclR5cGVcbiAqL1xuXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBCVUlMVF9JTl9UWVBFX0lEUyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzQmlnSW50ZWdlckFycmF5UHJvcCxcbiAgaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNCb29sZWFuQXJyYXlQcm9wLFxuICBpc0Jvb2xlYW5TaW5nbGVQcm9wLFxuICBpc0RhdGVBcnJheVByb3AsXG4gIGlzRGF0ZVNpbmdsZVByb3AsXG4gIGlzRW51bUFycmF5UHJvcCxcbiAgaXNFbnVtU2luZ2xlUHJvcCxcbiAgaXNJbnRlZ2VyQXJyYXlQcm9wLFxuICBpc0ludGVnZXJTaW5nbGVQcm9wLFxuICBpc0pzb25Qcm9wLFxuICBpc051bWJlckFycmF5UHJvcCxcbiAgaXNOdW1iZXJTaW5nbGVQcm9wLFxuICBpc051bWVyaWNBcnJheVByb3AsXG4gIGlzTnVtZXJpY1NpbmdsZVByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1NlYXJjaFRleHRQcm9wLFxuICBpc1N0cmluZ0FycmF5UHJvcCxcbiAgaXNTdHJpbmdTaW5nbGVQcm9wLFxuICBpc1RzVmVjdG9yUHJvcCxcbiAgaXNVdWlkQXJyYXlQcm9wLFxuICBpc1V1aWRTaW5nbGVQcm9wLFxuICBpc1ZlY3RvckFycmF5UHJvcCxcbiAgaXNWZWN0b3JTaW5nbGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gIFNvbmFtdUZpbGVTY2hlbWEsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIFJlbmRlcmluZ05vZGUsXG4gIHR5cGUgWm9kU3RyaW5nRm9ybWF0LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUltcG9ydFVybCB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcblxuLy8gPGFueT7rpbwg7J6Q7KCc7ZWY6rOgLCBab2Tsl5DshJwg7KCc7JW97ZWY64qUIOq4sOuzuOyggeyduCBHZW5lcmljIFR5cGUgUGFyYW1ldGVy66W8IOyCrOyaqe2VqC5cbnR5cGUgQW55Wm9kUmVjb3JkID0gei5ab2RSZWNvcmQ8ei5ab2RTdHJpbmcgfCB6LlpvZE51bWJlciB8IHouWm9kU3ltYm9sLCB6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RPYmplY3QgPSB6LlpvZE9iamVjdDtcbnR5cGUgQW55Wm9kTnVsbGFibGUgPSB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT47XG50eXBlIEFueVpvZERlZmF1bHQgPSB6LlpvZERlZmF1bHQ8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kVW5pb24gPSB6LlpvZFVuaW9uPHouWm9kVHlwZVtdPjtcbnR5cGUgQW55Wm9kQXJyYXkgPSB6LlpvZEFycmF5PHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9wdGlvbmFsID0gei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RUZW1wbGF0ZUxpdGVyYWwgPSB6LlpvZFRlbXBsYXRlTGl0ZXJhbDtcblxuLyoqXG4gKiDrgrTsnqUg7YOA7J6FIOygleydmCAoWm9kIOyKpO2CpOuniCArIFVJIOugjOuNlOungSDtg4DsnoUpXG4gKi9cbmV4cG9ydCBjb25zdCBCVUlMVF9JTl9UWVBFUyA9IHtcbiAgU29uYW11RmlsZToge1xuICAgIHNjaGVtYTogU29uYW11RmlsZVNjaGVtYSxcbiAgICByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZVwiLFxuICAgIHNjaGVtYU5hbWU6IFwiU29uYW11RmlsZVNjaGVtYVwiLFxuICB9LFxuICBcIlNvbmFtdUZpbGVbXVwiOiB7XG4gICAgc2NoZW1hOiBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gICAgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIixcbiAgICBzY2hlbWFOYW1lOiBcIlNvbmFtdUZpbGVBcnJheVNjaGVtYVwiLFxuICB9LFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiB6b2RGb3JtYXTsnYQgWm9kIDQg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBab2QgNOyXkOyEnOuKlCB6LmVtYWlsKCksIHoudXVpZCgpIOuTsSDrj4Xrpr3soIHsnbgg7ZWo7IiYIO2Yle2DnOulvCDsgqzsmqntlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHpvZEZvcm1hdFRvQ29kZShmb3JtYXQ6IFpvZFN0cmluZ0Zvcm1hdCk6IHN0cmluZyB7XG4gIC8vIElTTyDtj6zrp7fsnYAgei5pc28ueHh4KCkg7ZiV7YOcXG4gIGNvbnN0IGlzb0Zvcm1hdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgaXNvRGF0ZTogXCJ6Lmlzby5kYXRlKClcIixcbiAgICBpc29UaW1lOiBcInouaXNvLnRpbWUoKVwiLFxuICAgIGlzb0RhdGV0aW1lOiBcInouaXNvLmRhdGV0aW1lKClcIixcbiAgICBpc29EdXJhdGlvbjogXCJ6Lmlzby5kdXJhdGlvbigpXCIsXG4gIH07XG5cbiAgLy8gaGFzaCDtj6zrp7fsnYAgei5oYXNoKFwiYWxnb3JpdGhtXCIpIO2Yle2DnFxuICBjb25zdCBoYXNoRm9ybWF0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBoYXNoTWQ1OiAnei5oYXNoKFwibWQ1XCIpJyxcbiAgICBoYXNoU2hhMTogJ3ouaGFzaChcInNoYTFcIiknLFxuICAgIGhhc2hTaGEyNTY6ICd6Lmhhc2goXCJzaGEyNTZcIiknLFxuICAgIGhhc2hTaGEzODQ6ICd6Lmhhc2goXCJzaGEzODRcIiknLFxuICAgIGhhc2hTaGE1MTI6ICd6Lmhhc2goXCJzaGE1MTJcIiknLFxuICB9O1xuXG4gIGlmIChmb3JtYXQgaW4gaXNvRm9ybWF0cykge1xuICAgIHJldHVybiBpc29Gb3JtYXRzW2Zvcm1hdF07XG4gIH1cblxuICBpZiAoZm9ybWF0IGluIGhhc2hGb3JtYXRzKSB7XG4gICAgcmV0dXJuIGhhc2hGb3JtYXRzW2Zvcm1hdF07XG4gIH1cblxuICAvLyDquLDrs7gg7Y+s66e37J2AIHoueHh4KCkg7ZiV7YOcIChab2QgNClcbiAgcmV0dXJuIGB6LiR7Zm9ybWF0fSgpYDtcbn1cblxuLyoqXG4gKiB6b2RGb3JtYXTsnYQgWm9kIDQg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIFpvZCA07JeQ7ISc64qUIHouZW1haWwoKSwgei51dWlkKCkg65OxIOuPheumveyggeyduCDtlajsiJgg7ZiV7YOc66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gem9kRm9ybWF0VG9UeXBlKGZvcm1hdDogWm9kU3RyaW5nRm9ybWF0KTogei5ab2RUeXBlIHtcbiAgLy8gSVNPIO2PrOunt+ydgCB6Lmlzby54eHgoKSDtmJXtg5xcbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlIFwiaXNvRGF0ZVwiOlxuICAgICAgcmV0dXJuIHouaXNvLmRhdGUoKTtcbiAgICBjYXNlIFwiaXNvVGltZVwiOlxuICAgICAgcmV0dXJuIHouaXNvLnRpbWUoKTtcbiAgICBjYXNlIFwiaXNvRGF0ZXRpbWVcIjpcbiAgICAgIHJldHVybiB6Lmlzby5kYXRldGltZSgpO1xuICAgIGNhc2UgXCJpc29EdXJhdGlvblwiOlxuICAgICAgcmV0dXJuIHouaXNvLmR1cmF0aW9uKCk7XG4gICAgLy8gaGFzaCDtj6zrp7fsnYAgei5oYXNoKFwiYWxnb3JpdGhtXCIpIO2Yle2DnFxuICAgIGNhc2UgXCJoYXNoTWQ1XCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwibWQ1XCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhMVwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcInNoYTFcIik7XG4gICAgY2FzZSBcImhhc2hTaGEyNTZcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGEyNTZcIik7XG4gICAgY2FzZSBcImhhc2hTaGEzODRcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGEzODRcIik7XG4gICAgY2FzZSBcImhhc2hTaGE1MTJcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGE1MTJcIik7XG4gICAgLy8g6riw67O4IO2PrOunt+ydgCB6Lnh4eCgpIO2Yle2DnCAoWm9kIDQpXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAoeiBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsICgpID0+IHouWm9kVHlwZT4pW2Zvcm1hdF0oKTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoUgSUTroZzrtoDthLAg64+Z7KCB7Jy866GcIFpvZCDsiqTtgqTrp4jrpbwg66Gc65Oc7ZWp64uI64ukLlxuICog64K07J6lIO2DgOyehShCVUlMVF9JTl9UWVBFX0lEUynsnYAg67CU66GcIOuwmO2ZmO2VmOqzoCxcbiAqIOq3uCDsmbjripQgZGlzdCDrlJTroInthqDrpqzsl5DshJwgRVNN7Jy866GcIGltcG9ydO2VmOyXrCDqsIDsoLjsmLXri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRab2RUeXBlQnlJZCh6b2RUeXBlSWQ6IHN0cmluZyk6IFByb21pc2U8ei5ab2RUeXBlQW55PiB7XG4gIC8vIOuCtOyepSDtg4DsnoUg7LKY66asXG4gIGlmICgoQlVJTFRfSU5fVFlQRV9JRFMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHpvZFR5cGVJZCkpIHtcbiAgICBjb25zdCBidWlsdEluVHlwZSA9IEJVSUxUX0lOX1RZUEVTW3pvZFR5cGVJZCBhcyBrZXlvZiB0eXBlb2YgQlVJTFRfSU5fVFlQRVNdO1xuICAgIGlmICghYnVpbHRJblR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg64K07J6lIO2DgOyehSAke3pvZFR5cGVJZH3snZgg7Iqk7YKk66eI6rCAIOygleydmOuQmOyngCDslYrslZjsirXri4jri6RgKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWx0SW5UeXBlLnNjaGVtYS5kZXNjcmliZSh6b2RUeXBlSWQpO1xuICB9XG5cbiAgLy8g7ZSE66Gc7KCd7Yq47JeQ7IScIOygleydmO2VnCDtg4DsnoUg64+Z7KCBIOuhnOuTnFxuICBjb25zdCBtb2R1bGVQYXRoID0gRW50aXR5TWFuYWdlci5nZXRNb2R1bGVQYXRoKHpvZFR5cGVJZCk7XG4gIGNvbnN0IG1vZHVsZUFic1BhdGggPSBwYXRoLmpvaW4oXG4gICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgIHJ1bnRpbWVQYXRoKGBkaXN0L2FwcGxpY2F0aW9uLyR7bW9kdWxlUGF0aH0uanNgKSxcbiAgKTtcbiAgY29uc3QgaW1wb3J0VXJsID0gY3JlYXRlSW1wb3J0VXJsKG1vZHVsZUFic1BhdGgpO1xuICBjb25zdCBpbXBvcnRlZCA9IGF3YWl0IGltcG9ydChpbXBvcnRVcmwpO1xuXG4gIGlmICghaW1wb3J0ZWRbem9kVHlwZUlkXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB6b2RUeXBlSWQgJHt6b2RUeXBlSWR9YCk7XG4gIH1cbiAgcmV0dXJuIGltcG9ydGVkW3pvZFR5cGVJZF0uZGVzY3JpYmUoem9kVHlwZUlkKTtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9w7J2EIFpvZCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICog6rCBIHByb3DsnZgg7YOA7J6F7JeQIOuUsOudvCDsoIHsoIjtlZwgWm9kIHZhbGlkYXRvcuulvCDsg53shLHtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9wVG9ab2RUeXBlKHByb3A6IEVudGl0eVByb3ApOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICBsZXQgem9kVHlwZTogei5ab2RUeXBlQW55ID0gei51bmtub3duKCk7XG4gIGlmIChpc0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCk7XG4gIH0gZWxzZSBpZiAoaXNJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYmlnaW50KCk7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYmlnaW50KCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0VudW1TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSAoYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCkpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICB6b2RUeXBlID0gem9kRm9ybWF0VG9UeXBlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCAmJiBcIm1heFwiIGluIHpvZFR5cGUpIHtcbiAgICAgICAgem9kVHlwZSA9ICh6b2RUeXBlIGFzIHouWm9kU3RyaW5nKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1N0cmluZ0FycmF5UHJvcChwcm9wKSkge1xuICAgIGxldCBlbGVtZW50VHlwZTogei5ab2RUeXBlO1xuICAgIGlmIChwcm9wLnpvZEZvcm1hdCkge1xuICAgICAgZWxlbWVudFR5cGUgPSB6b2RGb3JtYXRUb1R5cGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoICYmIFwibWF4XCIgaW4gZWxlbWVudFR5cGUpIHtcbiAgICAgICAgZWxlbWVudFR5cGUgPSAoZWxlbWVudFR5cGUgYXMgei5ab2RTdHJpbmcpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgZWxlbWVudFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnRUeXBlID0gei5zdHJpbmcoKTtcbiAgICB9XG4gICAgem9kVHlwZSA9IGVsZW1lbnRUeXBlLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCk7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYm9vbGVhbigpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKTtcbiAgfSBlbHNlIGlmIChpc0RhdGVBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpO1xuICB9IGVsc2UgaWYgKGlzVXVpZEFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnV1aWQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzSnNvblByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmFycmF5KHoubnVtYmVyKCkpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYXJyYXkoei5hcnJheSh6Lm51bWJlcigpKSk7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSB7XG4gICAgICAvLyBGSyDtg4DsnoXsnYQg7LC47KGwIOyXlO2LsO2LsCBQSyDtg4DsnoXsl5Ag65Sw6528IOqysOyglVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgIGNvbnN0IHBrVHlwZSA9IHJlbEVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICAgIGlmIChwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIikge1xuICAgICAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3DsnYQgem9kVHlwZeycvOuhnCDrs4DtmZjtlZjripTrjbAg7Iuk7YyoICR7cHJvcH19YCk7XG4gIH1cblxuICBpZiAoKHByb3AgYXMgeyB1bnNpZ25lZD86IGJvb2xlYW4gfSkudW5zaWduZWQpIHtcbiAgICB6b2RUeXBlID0gKHpvZFR5cGUgYXMgei5ab2ROdW1iZXIpLm5vbm5lZ2F0aXZlKCk7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICB6b2RUeXBlID0gem9kVHlwZS5udWxsYWJsZSgpO1xuICB9XG5cbiAgcmV0dXJuIHpvZFR5cGU7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BUb1pvZFR5cGVEZWYocHJvcDogRW50aXR5UHJvcCwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBsZXQgc3RtdDogc3RyaW5nO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpYDtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5pbnQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJpZ2ludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9LmFycmF5KClgO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC56b2RGb3JtYXQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB6b2RGb3JtYXRUb0NvZGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke2Jhc2V9Lm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICBjb25zdCBiYXNlID0gem9kRm9ybWF0VG9Db2RlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtiYXNlfS5tYXgoJHtwcm9wLmxlbmd0aH0pLmFycmF5KClgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX0uYXJyYXkoKWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkubWF4KCR7cHJvcC5sZW5ndGh9KS5hcnJheSgpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTnVtYmVyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpYDtcbiAgfSBlbHNlIGlmIChpc051bWJlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmRhdGUoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouZGF0ZSgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5ib29sZWFuKClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhbkFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJvb2xlYW4oKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoudXVpZCgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei51dWlkKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIC8vIOuCtOyepSDtg4DsnoXsnbgg6rK97JqwIOyKpO2CpOuniCDsnbTrpoTsnLzroZwg67OA7ZmYXG4gICAgaWYgKChCVUlMVF9JTl9UWVBFX0lEUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMocHJvcC5pZCkpIHtcbiAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBwcm9wLmlkID09PSBcIlNvbmFtdUZpbGVcIiA/IFwiU29uYW11RmlsZVNjaGVtYVwiIDogXCJTb25hbXVGaWxlQXJyYXlTY2hlbWFcIjtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3NjaGVtYU5hbWV9YDtcbiAgICAgIGluamVjdEltcG9ydEtleXMucHVzaChzY2hlbWFOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1NlYXJjaFRleHRQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKClgO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmFycmF5KHoubnVtYmVyKCkpYDtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmFycmF5KHouYXJyYXkoei5udW1iZXIoKSkpYDtcbiAgfSBlbHNlIGlmIChpc1RzVmVjdG9yUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSB7XG4gICAgICAvLyBGSyBab2Qg7YOA7J6F7J2EIOywuOyhsCDsl5Tti7Dti7AgUEsg7YOA7J6F7JeQIOuUsOudvCDqsrDsoJVcbiAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICBjb25zdCBwa1R5cGUgPSByZWxFbnRpdHkuZ2V0UGtUeXBlKCk7XG4gICAgICBpZiAocGtUeXBlID09PSBcInN0cmluZ1wiIHx8IHBrVHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX1faWQ6IHouc3RyaW5nKClgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX1faWQ6IHouaW50KClgO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyDqt7jsmbggcmVsYXRpb24g7LyA7J207IqkIOygnOyZuFxuICAgICAgcmV0dXJuIGAvLyAke3Byb3AubmFtZX06ICR7cHJvcC5yZWxhdGlvblR5cGV9ICR7cHJvcC53aXRofWA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIi8vIHVuYWJsZSB0byByZXNvbHZlXCI7XG4gIH1cblxuICBpZiAoKHByb3AgYXMgeyB1bnNpZ25lZD86IGJvb2xlYW4gfSkudW5zaWduZWQpIHtcbiAgICBzdG10ICs9IFwiLm5vbm5lZ2F0aXZlKClcIjtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHN0bXQgKz0gXCIubnVsbGFibGUoKVwiO1xuICB9XG5cbiAgLy8gbnVtZXJpYyDtg4DsnoXsnZgg6rK97JqwIG51bGxhYmxlIOydtO2bhOyXkCBtZXRhIOy2lOqwgCAo66mU7YOA642w7J207YSw6rCAIOy1nOyDgeychCDroIjrsqjsl5Ag7J6I7Ja07JW8IO2VqClcbiAgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkgfHwgaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCArPSAnLm1ldGEoeyBTb25hbXVQcm9wVHlwZTogXCJudW1lcmljXCIgfSknO1xuICB9XG5cbiAgcmV0dXJuIGAke3N0bXR9LGA7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcE5vZGXrpbwgWm9kIO2DgOyehSDsoJXsnZgg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBwbGFpbiwgYXJyYXksIG9iamVjdCDrhbjrk5wg7YOA7J6F7J2EIOyerOq3gOyggeycvOuhnCDsspjrpqztlZjsl6wg7KSR7LKpIOq1rOyhsOulvCDsp4Dsm5Dtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wTm9kZVRvWm9kVHlwZURlZihwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUsIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcInBsYWluXCIpIHtcbiAgICByZXR1cm4gcHJvcFRvWm9kVHlwZURlZihwcm9wTm9kZS5wcm9wLCBpbmplY3RJbXBvcnRLZXlzKTtcbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5hcnJheSh6Lm9iamVjdCh7XCIsXG4gICAgICBwcm9wTm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZFByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihjaGlsZFByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICBcIlwiLFxuICAgICAgXCJ9KSksXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9IGVsc2UgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5vYmplY3Qoe1wiLFxuICAgICAgcHJvcE5vZGUuY2hpbGRyZW5cbiAgICAgICAgLm1hcCgoY2hpbGRQcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYoY2hpbGRQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5cykpXG4gICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgXCJcIixcbiAgICAgIGB9KSR7cHJvcE5vZGUucHJvcD8ubnVsbGFibGUgPyBcIi5udWxsYWJsZSgpXCIgOiBcIlwifSxgLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvVHNUeXBlRGVmKHp0OiB6LlpvZFR5cGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHp0LmRlZi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgIGNhc2UgXCJhbnlcIjpcbiAgICBjYXNlIFwidW5rbm93blwiOlxuICAgIGNhc2UgXCJuZXZlclwiOlxuICAgICAgcmV0dXJuIHp0LmRlZi50eXBlO1xuICAgIGNhc2UgXCJudWxsYWJsZVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kTnVsbGFibGUpLmRlZi5pbm5lclR5cGUpfSB8IG51bGxgO1xuICAgIGNhc2UgXCJkZWZhdWx0XCI6XG4gICAgICByZXR1cm4gem9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2REZWZhdWx0KS5kZWYuaW5uZXJUeXBlKTtcbiAgICBjYXNlIFwicmVjb3JkXCI6IHtcbiAgICAgIGNvbnN0IHJlY29yZFR5cGUgPSB6dCBhcyBBbnlab2RSZWNvcmQ7XG4gICAgICByZXR1cm4gYHsgWyBrZXk6ICR7em9kVHlwZVRvVHNUeXBlRGVmKHJlY29yZFR5cGUuZGVmLmtleVR5cGUpfSBdOiAke3pvZFR5cGVUb1RzVHlwZURlZihyZWNvcmRUeXBlLmRlZi52YWx1ZVR5cGUpfX1gO1xuICAgIH1cbiAgICBjYXNlIFwibGl0ZXJhbFwiOlxuICAgICAgcmV0dXJuIEFycmF5LmZyb20oKHp0IGFzIHouWm9kTGl0ZXJhbCkudmFsdWVzKVxuICAgICAgICAubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIgfCBcIik7XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYCR7KHp0IGFzIEFueVpvZFVuaW9uKS5vcHRpb25zXG4gICAgICAgIC5tYXAoKG9wdGlvbikgPT4gem9kVHlwZVRvVHNUeXBlRGVmKG9wdGlvbikpXG4gICAgICAgIC5qb2luKFwiIHwgXCIpfWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIHJldHVybiBgJHsoenQgYXMgei5ab2RFbnVtKS5vcHRpb25zLm1hcCgodmFsKSA9PiBgXCIke3ZhbH1cImApLmpvaW4oXCIgfCBcIil9YDtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZEFycmF5KS5lbGVtZW50KX1bXWA7XG4gICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICBjb25zdCBzaGFwZSA9ICh6dCBhcyBBbnlab2RPYmplY3QpLnNoYXBlO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJ7XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKHNoYXBlKS5tYXAoKGtleSkgPT4ge1xuICAgICAgICAgIGlmIChzaGFwZVtrZXldLmRlZi50eXBlID09PSBcIm9wdGlvbmFsXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtrZXl9PzogJHt6b2RUeXBlVG9Uc1R5cGVEZWYoc2hhcGVba2V5XS5kZWYuaW5uZXJUeXBlKX0sYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX06ICR7em9kVHlwZVRvVHNUeXBlRGVmKHNoYXBlW2tleV0pfSxgO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIFwifVwiLFxuICAgICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgICBjYXNlIFwib3B0aW9uYWxcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZE9wdGlvbmFsKS5kZWYuaW5uZXJUeXBlKX0gfCB1bmRlZmluZWRgO1xuICAgIGNhc2UgXCJ0ZW1wbGF0ZV9saXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGRlZiA9ICh6dCBhcyBBbnlab2RUZW1wbGF0ZUxpdGVyYWwpLmRlZjtcblxuICAgICAgLy8g67mIIHRlbXBsYXRlIGxpdGVyYWzsnYAgc3RyaW5n7Jy866GcIO2PtOuwsVxuICAgICAgaWYgKCFkZWYucGFydHMgfHwgZGVmLnBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICAgIH1cblxuICAgICAgLy8g6rCBIHBhcnTrpbwgVHlwZVNjcmlwdCDtg4DsnoUg66y47J6Q7Je066GcIOuzgO2ZmFxuICAgICAgY29uc3QgcGFydHMgPSBkZWYucGFydHMubWFwKChwYXJ0OiB1bmtub3duKSA9PiB7XG4gICAgICAgIC8vIOumrO2EsOuftCDqsJIgKHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBudWxsLCB1bmRlZmluZWQpXG4gICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBgJHtwYXJ0fWA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBab2RUeXBlIC0g7J6s6reA7KCB7Jy866GcIOuzgO2ZmFxuICAgICAgICBpZiAocGFydCAmJiB0eXBlb2YgcGFydCA9PT0gXCJvYmplY3RcIiAmJiAocGFydCBhcyB6LlpvZFR5cGUpLl96b2QpIHtcbiAgICAgICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUeXBlVG9Uc1R5cGVEZWYocGFydCBhcyB6LlpvZFR5cGUpO1xuICAgICAgICAgIHJldHVybiBgJFxceyR7aW5uZXJUeXBlfX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7Y+067CxXG4gICAgICAgIHJldHVybiBgXFwke3N0cmluZ31gO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBgXFxgJHtwYXJ0cy5qb2luKFwiXCIpfVxcYGA7XG4gICAgfVxuICAgIGNhc2UgXCJmaWxlXCI6XG4gICAgICByZXR1cm4gXCJGaWxlXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7LKY66as65CY7KeAIOyViuydgCBab2RUeXBlICR7enQuZGVmLnR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6FIOyduOyKpO2EtOyKpOulvCDtlbTri7ntlZjripQgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvWm9kQ29kZSh6dDogei5ab2RUeXBlKTogc3RyaW5nIHtcbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBcInouc3RyaW5nKClcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bWJlcigpXCI7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIFwiei5iaWdpbnQoKVwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJ6LmJvb2xlYW4oKVwiO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJ6LmRhdGUoKVwiO1xuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bGwoKVwiO1xuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgIHJldHVybiBcInoudW5kZWZpbmVkKClcIjtcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgICByZXR1cm4gXCJ6LmFueSgpXCI7XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICAgIHJldHVybiBcInoudW5rbm93bigpXCI7XG4gICAgY2FzZSBcIm5ldmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm5ldmVyKClcIjtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSl9Lm51bGxhYmxlKClgO1xuICAgIGNhc2UgXCJkZWZhdWx0XCI6IHtcbiAgICAgIGNvbnN0IHpEZWZhdWx0RGVmID0gKHp0IGFzIEFueVpvZERlZmF1bHQpLmRlZjtcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKHpEZWZhdWx0RGVmLmlubmVyVHlwZSl9LmRlZmF1bHQoJHt6RGVmYXVsdERlZi5kZWZhdWx0VmFsdWV9KWA7XG4gICAgfVxuICAgIGNhc2UgXCJyZWNvcmRcIjoge1xuICAgICAgY29uc3QgelJlY29yZERlZiA9ICh6dCBhcyBBbnlab2RSZWNvcmQpLmRlZjtcbiAgICAgIHJldHVybiBgei5yZWNvcmQoJHt6b2RUeXBlVG9ab2RDb2RlKHpSZWNvcmREZWYua2V5VHlwZSl9LCAke3pvZFR5cGVUb1pvZENvZGUoXG4gICAgICAgIHpSZWNvcmREZWYudmFsdWVUeXBlLFxuICAgICAgKX0pYDtcbiAgICB9XG4gICAgY2FzZSBcImxpdGVyYWxcIjoge1xuICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5mcm9tKCh6dCBhcyB6LlpvZExpdGVyYWw8c3RyaW5nIHwgbnVtYmVyPikudmFsdWVzKS5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gYG51bGxgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gYHVuZGVmaW5lZGA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBgei5saXRlcmFsKCR7aXRlbXNbMF19KWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYHoubGl0ZXJhbChbJHtpdGVtcy5qb2luKFwiLCBcIil9XSlgO1xuICAgIH1cbiAgICBjYXNlIFwidW5pb25cIjpcbiAgICAgIHJldHVybiBgei51bmlvbihbJHsoenQgYXMgQW55Wm9kVW5pb24pLmRlZi5vcHRpb25zXG4gICAgICAgIC5tYXAoKG9wdGlvbjogei5ab2RUeXBlKSA9PiB6b2RUeXBlVG9ab2RDb2RlKG9wdGlvbikpXG4gICAgICAgIC5qb2luKFwiLFwiKX1dKWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIC8vIE5PVEU6IHouZW51bShbXCJBXCIsIFwiQlwiXSnrj4Qgei5lbnVtKHsgQTogXCJBXCIsIEI6IFwiQlwiIH0p66GcIOyymOumrOuQqC5cbiAgICAgIHJldHVybiBgei5lbnVtKHske09iamVjdC5lbnRyaWVzKCh6dCBhcyB6LlpvZEVudW0pLmRlZi5lbnRyaWVzKVxuICAgICAgICAubWFwKChba2V5LCB2YWxdKSA9PiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIiA/IGAke2tleX06IFwiJHt2YWx9XCJgIDogYCR7a2V5fTogJHt2YWx9YCkpXG4gICAgICAgIC5qb2luKFwiLCBcIil9fSlgO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGB6LmFycmF5KCR7em9kVHlwZVRvWm9kQ29kZSgoenQgYXMgei5ab2RBcnJheTx6LlpvZFR5cGU+KS5kZWYuZWxlbWVudCl9KWA7XG4gICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICBjb25zdCBzaGFwZSA9ICh6dCBhcyBBbnlab2RPYmplY3QpLnNoYXBlO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJ6Lm9iamVjdCh7XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKHNoYXBlKS5tYXAoKGtleSkgPT4gYCR7a2V5fTogJHt6b2RUeXBlVG9ab2RDb2RlKHNoYXBlW2tleV0pfSxgKSxcbiAgICAgICAgXCJ9KVwiLFxuICAgICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgICBjYXNlIFwib3B0aW9uYWxcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUpfS5vcHRpb25hbCgpYDtcbiAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgcmV0dXJuIGB6LmZpbGUoKWA7XG4gICAgY2FzZSBcInRlbXBsYXRlX2xpdGVyYWxcIjoge1xuICAgICAgY29uc3QgZGVmID0gKHp0IGFzIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbFxuICAgICAgaWYgKCFkZWYucGFydHMgfHwgZGVmLnBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gXCJ6LnRlbXBsYXRlTGl0ZXJhbChbXSlcIjtcbiAgICAgIH1cblxuICAgICAgLy8g6rCBIHBhcnTrpbwgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQ6IHVua25vd24pID0+IHtcbiAgICAgICAgLy8g66y47J6Q7Je0IOumrO2EsOuftFxuICAgICAgICBpZiAodHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gYFwiJHtwYXJ0fVwiYDtcbiAgICAgICAgfVxuICAgICAgICAvLyBab2RUeXBlIC0g7J6s6reA7KCB7Jy866GcIOuzgO2ZmFxuICAgICAgICBpZiAocGFydCAmJiB0eXBlb2YgcGFydCA9PT0gXCJvYmplY3RcIiAmJiAocGFydCBhcyB6LlpvZFR5cGUpLl96b2QpIHtcbiAgICAgICAgICByZXR1cm4gem9kVHlwZVRvWm9kQ29kZShwYXJ0IGFzIHouWm9kVHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtj7TrsLFcbiAgICAgICAgcmV0dXJuIFwiei5zdHJpbmcoKVwiO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBgei50ZW1wbGF0ZUxpdGVyYWwoWyR7cGFydHMuam9pbihcIiwgXCIpfV0pYDtcbiAgICB9XG4gICAgY2FzZSBcImludGVyc2VjdGlvblwiOiB7XG4gICAgICBjb25zdCB6SW50ZXJzZWN0aW9uRGVmID0gKHp0IGFzIHouWm9kSW50ZXJzZWN0aW9uPHouWm9kVHlwZSwgei5ab2RUeXBlPikuZGVmO1xuICAgICAgcmV0dXJuIGB6LmludGVyc2VjdGlvbigke3pvZFR5cGVUb1pvZENvZGUoekludGVyc2VjdGlvbkRlZi5sZWZ0KX0sICR7em9kVHlwZVRvWm9kQ29kZSh6SW50ZXJzZWN0aW9uRGVmLnJpZ2h0KX0pYDtcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7LKY66as65CY7KeAIOyViuydgCBab2RUeXBlICR7enQuZGVmLnR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOyerOq3gOyggeycvOuhnCDspJHssqnrkJwg7YOA7J6F65Ok7J2EIOyymOumrO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gIHpvZFR5cGU6IHouWm9kVHlwZUFueSxcbiAgYmFzZUtleTogc3RyaW5nID0gXCJyb290XCIsXG4pOiBSZW5kZXJpbmdOb2RlIHtcbiAgY29uc3QgZGVmID0ge1xuICAgIG5hbWU6IGJhc2VLZXksXG4gICAgbGFiZWw6IGluZmxlY3Rpb24uY2FtZWxpemUoYmFzZUtleSwgZmFsc2UpLFxuICAgIHpvZFR5cGUsXG4gIH07XG5cbiAgLyoqXG4gICAqIOy8gOydtOyKpCDsspjrpqwg7Iic7IScXG4gICAqXG4gICAqIDEuIO2KueyImCDsvIDsnbTsiqQgKGRlc2NyaXB0aW9uIOq4sOuwmClcbiAgICogICAgLSBTb25hbXVGaWxlL1NvbmFtdUZpbGVbXSA6IHoub2JqZWN0L3ouYXJyYXnsnbTsp4Drp4wg7YyM7J28IOyXheuhnOuTnOyaqSDrgrTsnqUg7YOA7J6FXG4gICAqXG4gICAqIDIuIOydvOuwmCDsvIDsnbTsiqQgKGluc3RhbmNlb2Yg6riw67CYKVxuICAgKiAgICAtIHouWm9kT2JqZWN0IDog7J2867CYIOqwneyytFxuICAgKiAgICAtIHouWm9kQXJyYXkgOiDsnbzrsJgg67Cw7Je0XG4gICAqICAgICAgLSB2ZWN0b3IgOiB6LmFycmF5KHoubnVtYmVyKeydtOyngOunjCDrhKTsnbTrsI0g6riw67CY7Jy866GcIOuyoe2EsCDsnoTrsqDrlKlcbiAgICogICAgICAtIOydvOuwmCDrsLDsl7QgOiDqt7gg7Jm4XG4gICAqICAgIC0gei5ab2RVbmlvbiwgei5ab2RPcHRpb25hbCwgei5ab2ROdWxsYWJsZSA6IOycoO2LuOumrO2LsCDtg4DsnoVcbiAgICogICAgLSDquLDtg4AgOiByZXNvbHZlUmVuZGVyVHlwZSgp7Jy866GcIOyymOumrFxuICAgKi9cblxuICAvLyDtirnsiJgg7LyA7J207IqkOiBTb25hbXVGaWxlW10g7YOA7J6FIOqwkOyngFxuICBpZiAoem9kVHlwZS5kZXNjcmlwdGlvbiA9PT0gXCJTb25hbXVGaWxlW11cIikge1xuICAgIHJldHVybiB7IC4uLmRlZiwgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIiB9O1xuICB9XG5cbiAgLy8g7Yq57IiYIOy8gOydtOyKpDogU29uYW11RmlsZSDri6jsnbwg7YOA7J6FIOqwkOyngFxuICBpZiAoem9kVHlwZS5kZXNjcmlwdGlvbiA9PT0gXCJTb25hbXVGaWxlXCIpIHtcbiAgICByZXR1cm4geyAuLi5kZWYsIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlXCIgfTtcbiAgfVxuXG4gIC8vIOydvOuwmCDsvIDsnbTsiqQ6IFpvZE9iamVjdCDssrTtgaxcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9iamVjdCkge1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSBPYmplY3Qua2V5cyh6b2RUeXBlLnNoYXBlKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNvbHVtbktleXMubWFwKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFR5cGUuc2hhcGVba2V5XTtcbiAgICAgIHJldHVybiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGlubmVyVHlwZSwga2V5KTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJvYmplY3RcIixcbiAgICAgIGNoaWxkcmVuLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQXJyYXkpIHtcbiAgICBjb25zdCBpbm5lclR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZEFycmF5PHouWm9kVHlwZUFueT4pLmRlZi5lbGVtZW50O1xuICAgIC8vIHZlY3RvciDtg4DsnoUg7YyQ67OEOiBudW1iZXIg67Cw7Je07J2066m07IScIGVtYmVkZGluZywgdmVjdG9yIOuTseydmCDsnbTrpoTsnYQg6rCA7KeEIOqyveyasFxuICAgIGlmIChcbiAgICAgIGlubmVyVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyICYmXG4gICAgICAoYmFzZUtleS5pbmNsdWRlcyhcImVtYmVkZGluZ1wiKSB8fCBiYXNlS2V5LmluY2x1ZGVzKFwidmVjdG9yXCIpKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmLFxuICAgICAgICByZW5kZXJUeXBlOiBcInZlY3RvclwiLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGVsZW1lbnQ6IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVuaW9uKSB7XG4gICAgY29uc3Qgb3B0aW9uTm9kZXMgPSAoem9kVHlwZSBhcyB6LlpvZFVuaW9uPHouWm9kVHlwZVtdPikuZGVmLm9wdGlvbnMubWFwKChvcHQpID0+XG4gICAgICB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKG9wdCwgYmFzZUtleSksXG4gICAgKTtcbiAgICAvLyBUT0RPOiBab2RVbmlvbuydtCDrk6TslrTsnojripQg6rK97JqwIO2VuOuTpOungVxuICAgIHJldHVybiBvcHRpb25Ob2Rlc1swXTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RPcHRpb25hbCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi56b2RUeXBlVG9SZW5kZXJpbmdOb2RlKCh6b2RUeXBlIGFzIHouWm9kT3B0aW9uYWw8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSwgYmFzZUtleSksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bGxhYmxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoKHpvZFR5cGUgYXMgei5ab2ROdWxsYWJsZTx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IHJlc29sdmVSZW5kZXJUeXBlKGJhc2VLZXksIHpvZFR5cGUpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6F6rO8IO2CpCDsnbTrpoTsnLzroZzrtoDthLAg7KCB7KCI7ZWcIFJlbmRlclR5cGXsnYQg6rKw7KCV7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiByZXNvbHZlUmVuZGVyVHlwZShrZXk6IHN0cmluZywgem9kVHlwZTogei5ab2RUeXBlQW55KTogUmVuZGVyaW5nTm9kZVtcInJlbmRlclR5cGVcIl0ge1xuICBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRGF0ZSkge1xuICAgIHJldHVybiBcImRhdGV0aW1lXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouY29yZS4kWm9kU3RyaW5nKSB7XG4gICAgLy8gTk9URTogei5ab2RTdHJpbmfsnLzroZwg67mE6rWQ7ZWY66m0IHoudXJsKCksIHouZW1haWwoKSDrk7HsnZgg7YOA7J6F7JeQ7IScIOusuOygnOqwgCDsg53quLDrr4DroZwgei5jb3JlLiRab2RTdHJpbmfsnLzroZwg67mE6rWQ7ZWoXG4gICAgLy8gRklYTUU6IGVtYWls7J2064KYIHVybCDtg4DsnoUg65Ox7JeQIOuMgO2VnCDsspjrpqzqsIAg7ZWE7JqU7ZWoXG4gICAgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU1FMRGF0ZVRpbWVTdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGV0aW1lXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJkYXRlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZGF0ZVwiO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImlkXCIpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1pZFwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiX2lkXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZmtfaWRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bWJlcikge1xuICAgIGlmIChrZXkgPT09IFwiaWRcIikge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLWlkXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJfaWRcIikpIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1ma19pZFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItcGxhaW5cIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQm9vbGVhbikge1xuICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RFbnVtKSB7XG4gICAgcmV0dXJuIFwiZW51bXNcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RSZWNvcmQpIHtcbiAgICByZXR1cm4gXCJyZWNvcmRcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RBbnkgfHwgem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5rbm93bikge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVuaW9uKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTGl0ZXJhbCkge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFRlbXBsYXRlTGl0ZXJhbCkge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUuZGVmLnR5cGUgPT09IFwiY3VzdG9tXCIpIHtcbiAgICByZXR1cm4gXCJvYmplY3RcIjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYO2DgOyehSDtjIzsi7Eg67aI6rCAICR7a2V5fSAke3pvZFR5cGUuZGVmLnR5cGV9YCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtHQSxTQUFTLGdCQUFn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
|