sonamu 0.6.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.swcrc.project-default +18 -0
- package/bin/cli.js +24 -0
- package/dist/ai/agents/agent.d.ts +11 -0
- package/dist/ai/agents/agent.d.ts.map +1 -0
- package/dist/ai/agents/agent.js +65 -0
- package/dist/ai/agents/index.d.ts +3 -0
- package/dist/ai/agents/index.d.ts.map +1 -0
- package/dist/ai/agents/index.js +4 -0
- package/dist/ai/agents/types.d.ts +43 -0
- package/dist/ai/agents/types.d.ts.map +1 -0
- package/dist/ai/agents/types.js +3 -0
- package/dist/ai/index.d.ts +2 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +3 -0
- package/dist/ai/providers/rtzr/api.d.ts +22 -0
- package/dist/ai/providers/rtzr/api.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/api.js +28 -0
- package/dist/ai/providers/rtzr/error.d.ts +18 -0
- package/dist/ai/providers/rtzr/error.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/error.js +29 -0
- package/dist/ai/providers/rtzr/index.d.ts +5 -0
- package/dist/ai/providers/rtzr/index.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/index.js +6 -0
- package/dist/ai/providers/rtzr/model.d.ts +52 -0
- package/dist/ai/providers/rtzr/model.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/model.js +137 -0
- package/dist/ai/providers/rtzr/options.d.ts +7 -0
- package/dist/ai/providers/rtzr/options.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/options.js +47 -0
- package/dist/ai/providers/rtzr/provider.d.ts +18 -0
- package/dist/ai/providers/rtzr/provider.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/provider.js +54 -0
- package/dist/ai/providers/rtzr/utils.d.ts +19 -0
- package/dist/ai/providers/rtzr/utils.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/utils.js +88 -0
- 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 +2 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +6 -1
- package/dist/api/code-converters.d.ts +58 -14
- package/dist/api/code-converters.d.ts.map +1 -1
- package/dist/api/code-converters.js +178 -409
- package/dist/api/config.d.ts +27 -13
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +19 -26
- package/dist/api/context.d.ts +4 -3
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +1 -1
- package/dist/api/decorators.d.ts +20 -6
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +111 -18
- package/dist/api/index.d.ts +2 -2
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +3 -3
- package/dist/api/sonamu.d.ts +7 -7
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +83 -51
- package/dist/api/validator.d.ts +6 -0
- package/dist/api/validator.d.ts.map +1 -0
- package/dist/api/validator.js +81 -0
- package/dist/bin/build-config.d.ts +5 -1
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +5 -2
- package/dist/bin/cli.js +165 -64
- package/dist/bin/loader-register.d.ts +2 -0
- package/dist/bin/loader-register.d.ts.map +1 -0
- package/dist/bin/loader-register.js +34 -0
- package/dist/database/_batch_update.d.ts +5 -3
- package/dist/database/_batch_update.d.ts.map +1 -1
- package/dist/database/_batch_update.js +30 -13
- package/dist/database/base-model.d.ts +96 -10
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +232 -89
- package/dist/database/base-model.types.d.ts +93 -0
- package/dist/database/base-model.types.d.ts.map +1 -0
- package/dist/database/base-model.types.js +10 -0
- package/dist/database/code-generator.d.ts +1 -1
- package/dist/database/code-generator.d.ts.map +1 -1
- package/dist/database/code-generator.js +11 -10
- package/dist/database/db.d.ts +5 -6
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +22 -25
- package/dist/database/puri-subset.test-d.js +81 -0
- package/dist/database/puri-subset.types.d.ts +123 -0
- package/dist/database/puri-subset.types.d.ts.map +1 -0
- package/dist/database/puri-subset.types.js +16 -0
- package/dist/database/puri-wrapper.d.ts +13 -11
- package/dist/database/puri-wrapper.d.ts.map +1 -1
- package/dist/database/puri-wrapper.js +2 -2
- package/dist/database/puri.d.ts +25 -14
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +83 -21
- package/dist/database/puri.types.d.ts +21 -7
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +4 -1
- package/dist/database/transaction-context.d.ts +1 -1
- package/dist/database/transaction-context.d.ts.map +1 -1
- package/dist/database/transaction-context.js +1 -1
- package/dist/database/upsert-builder.d.ts +9 -3
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +227 -78
- package/dist/entity/entity-manager.d.ts +165 -2
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +26 -10
- package/dist/entity/entity.d.ts +5 -3
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +153 -54
- 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 +1 -1
- 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 +1 -1
- package/dist/file-storage/driver.d.ts +1 -1
- package/dist/file-storage/driver.d.ts.map +1 -1
- package/dist/file-storage/driver.js +1 -1
- package/dist/file-storage/file-storage.js +2 -2
- package/dist/index.d.ts +18 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -13
- package/dist/migration/code-generation.d.ts +1 -1
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +123 -67
- package/dist/migration/migration-set.d.ts +2 -10
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +67 -218
- package/dist/migration/migrator.d.ts +24 -73
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +121 -301
- package/dist/migration/postgresql-schema-reader.d.ts +51 -0
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -0
- package/dist/migration/postgresql-schema-reader.js +245 -0
- package/dist/migration/types.d.ts +6 -38
- package/dist/migration/types.d.ts.map +1 -1
- package/dist/migration/types.js +1 -1
- package/dist/naite/messaging-types.d.ts +43 -0
- package/dist/naite/messaging-types.d.ts.map +1 -0
- package/dist/naite/messaging-types.js +7 -0
- package/dist/naite/naite-reporter.d.ts +41 -0
- package/dist/naite/naite-reporter.d.ts.map +1 -0
- package/dist/naite/naite-reporter.js +102 -0
- package/dist/naite/naite.d.ts +91 -8
- package/dist/naite/naite.d.ts.map +1 -1
- package/dist/naite/naite.js +285 -41
- package/dist/stream/sse.d.ts +2 -2
- package/dist/stream/sse.d.ts.map +1 -1
- package/dist/stream/sse.js +1 -1
- package/dist/syncer/api-parser.d.ts +3 -13
- package/dist/syncer/api-parser.d.ts.map +1 -1
- package/dist/syncer/api-parser.js +67 -56
- package/dist/syncer/checksum.d.ts +2 -2
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +11 -11
- package/dist/syncer/code-generator.d.ts +3 -3
- package/dist/syncer/code-generator.d.ts.map +1 -1
- package/dist/syncer/code-generator.js +37 -17
- package/dist/syncer/entity-operations.d.ts +2 -2
- package/dist/syncer/entity-operations.d.ts.map +1 -1
- package/dist/syncer/entity-operations.js +9 -8
- 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 +1 -1
- package/dist/syncer/index.d.ts +4 -4
- package/dist/syncer/index.d.ts.map +1 -1
- package/dist/syncer/index.js +5 -5
- package/dist/syncer/module-loader.d.ts +4 -4
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +17 -12
- package/dist/syncer/syncer.d.ts +31 -24
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +92 -45
- 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 +15 -8
- package/dist/template/helpers.d.ts +2 -2
- package/dist/template/helpers.d.ts.map +1 -1
- package/dist/template/helpers.js +3 -3
- package/dist/template/implementations/entity.template.d.ts +2 -2
- package/dist/template/implementations/entity.template.d.ts.map +1 -1
- package/dist/template/implementations/entity.template.js +4 -5
- package/dist/template/implementations/generated.template.d.ts +2 -3
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +46 -29
- package/dist/template/implementations/generated_http.template.d.ts +2 -3
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.js +9 -9
- package/dist/template/implementations/generated_sso.template.d.ts +3 -4
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +54 -25
- package/dist/template/implementations/init_types.template.d.ts +2 -2
- package/dist/template/implementations/init_types.template.d.ts.map +1 -1
- package/dist/template/implementations/init_types.template.js +2 -2
- package/dist/template/implementations/model.template.d.ts +2 -2
- package/dist/template/implementations/model.template.d.ts.map +1 -1
- package/dist/template/implementations/model.template.js +47 -37
- package/dist/template/implementations/model_test.template.d.ts +2 -2
- package/dist/template/implementations/model_test.template.d.ts.map +1 -1
- package/dist/template/implementations/model_test.template.js +2 -2
- package/dist/template/implementations/service.template.d.ts +4 -4
- package/dist/template/implementations/service.template.d.ts.map +1 -1
- package/dist/template/implementations/service.template.js +24 -16
- package/dist/template/implementations/view_enums_buttonset.template.d.ts +2 -2
- package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -1
- package/dist/template/implementations/view_enums_buttonset.template.js +1 -1
- package/dist/template/implementations/view_enums_dropdown.template.d.ts +2 -2
- package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -1
- package/dist/template/implementations/view_enums_dropdown.template.js +2 -2
- package/dist/template/implementations/view_enums_select.template.d.ts +2 -2
- package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -1
- package/dist/template/implementations/view_enums_select.template.js +2 -2
- package/dist/template/implementations/view_form.template.d.ts +2 -2
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +4 -4
- package/dist/template/implementations/view_id_all_select.template.d.ts +2 -2
- package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
- package/dist/template/implementations/view_id_all_select.template.js +1 -1
- package/dist/template/implementations/view_id_async_select.template.d.ts +2 -2
- package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -1
- package/dist/template/implementations/view_id_async_select.template.js +1 -1
- package/dist/template/implementations/view_list.template.d.ts +2 -2
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +29 -19
- package/dist/template/implementations/view_list_columns.template.d.ts +3 -3
- package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list_columns.template.js +1 -1
- package/dist/template/implementations/view_search_input.template.d.ts +2 -2
- package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
- package/dist/template/implementations/view_search_input.template.js +1 -1
- package/dist/template/index.d.ts +4 -2
- package/dist/template/index.d.ts.map +1 -1
- package/dist/template/index.js +5 -3
- package/dist/template/template-manager.d.ts +56 -0
- package/dist/template/template-manager.d.ts.map +1 -0
- package/dist/template/template-manager.js +125 -0
- package/dist/template/template-types.d.ts +16 -0
- package/dist/template/template-types.d.ts.map +1 -0
- package/dist/template/template-types.js +7 -0
- package/dist/template/template.d.ts +12 -2
- package/dist/template/template.d.ts.map +1 -1
- package/dist/template/template.js +19 -6
- package/dist/template/zod-converter.d.ts +40 -7
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +386 -58
- 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 +12 -3
- package/dist/testing/fixture-manager.d.ts +42 -11
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +338 -236
- package/dist/types/types.d.ts +709 -104
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +309 -52
- package/dist/typings/knex.d.js +2 -2
- package/dist/utils/async-utils.d.ts.map +1 -1
- package/dist/utils/async-utils.js +3 -3
- package/dist/utils/console-util.js +1 -1
- package/dist/utils/controller.d.ts +1 -0
- package/dist/utils/controller.d.ts.map +1 -1
- package/dist/utils/controller.js +4 -1
- package/dist/utils/esm-utils.d.ts +0 -6
- package/dist/utils/esm-utils.d.ts.map +1 -1
- package/dist/utils/esm-utils.js +2 -9
- package/dist/utils/formatter.d.ts +3 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +110 -0
- package/dist/utils/fs-utils.d.ts +1 -1
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +1 -1
- package/dist/utils/lodash-able.d.ts.map +1 -1
- package/dist/utils/lodash-able.js +1 -1
- package/dist/utils/object-utils.d.ts +44 -0
- package/dist/utils/object-utils.d.ts.map +1 -0
- package/dist/utils/object-utils.js +191 -0
- package/dist/utils/path-utils.d.ts +1 -1
- package/dist/utils/path-utils.d.ts.map +1 -1
- package/dist/utils/path-utils.js +3 -3
- package/dist/utils/process-utils.js +1 -1
- package/dist/utils/sql-parser.d.ts +5 -1
- package/dist/utils/sql-parser.d.ts.map +1 -1
- package/dist/utils/sql-parser.js +14 -3
- package/dist/utils/type-utils.d.ts +23 -0
- package/dist/utils/type-utils.d.ts.map +1 -0
- package/dist/utils/type-utils.js +45 -0
- package/dist/utils/utils.d.ts +7 -1
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +44 -5
- 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 +1 -1
- package/package.json +55 -30
- package/src/ai/agents/agent.ts +87 -0
- package/src/ai/agents/index.ts +2 -0
- package/src/ai/agents/types.ts +47 -0
- package/src/ai/index.ts +1 -0
- package/src/ai/providers/rtzr/api.ts +37 -0
- package/src/ai/providers/rtzr/error.ts +34 -0
- package/src/ai/providers/rtzr/index.ts +4 -0
- package/src/ai/providers/rtzr/model.ts +201 -0
- package/src/ai/providers/rtzr/options.ts +49 -0
- package/src/ai/providers/rtzr/provider.ts +91 -0
- package/src/ai/providers/rtzr/utils.ts +127 -0
- package/src/api/base-frame.ts +4 -2
- package/src/api/caster.ts +17 -23
- package/src/api/code-converters.ts +176 -533
- package/src/api/config.ts +39 -56
- package/src/api/context.ts +7 -18
- package/src/api/decorators.ts +175 -46
- package/src/api/index.ts +2 -2
- package/src/api/sonamu.ts +133 -124
- package/src/api/validator.ts +83 -0
- package/src/bin/build-config.ts +7 -1
- package/src/bin/cli.ts +192 -110
- package/src/bin/loader-register.ts +38 -0
- package/src/database/_batch_update.ts +46 -31
- package/src/database/base-model.ts +390 -182
- package/src/database/base-model.types.ts +155 -0
- package/src/database/code-generator.ts +13 -32
- package/src/database/db.ts +36 -50
- package/src/database/puri-subset.test-d.ts +471 -0
- package/src/database/puri-subset.types.ts +195 -0
- package/src/database/puri-wrapper.ts +58 -67
- package/src/database/puri.ts +182 -126
- package/src/database/puri.types.ts +64 -31
- package/src/database/transaction-context.ts +1 -1
- package/src/database/upsert-builder.ts +261 -132
- package/src/entity/entity-manager.ts +36 -28
- package/src/entity/entity.ts +330 -249
- package/src/exceptions/error-handler.ts +3 -3
- package/src/exceptions/so-exceptions.ts +11 -11
- package/src/file-storage/driver.ts +5 -5
- package/src/file-storage/file-storage.ts +2 -2
- package/src/index.ts +18 -12
- package/src/migration/code-generation.ts +185 -172
- package/src/migration/migration-set.ts +80 -293
- package/src/migration/migrator.ts +182 -425
- package/src/migration/mysql-schema-reader.ts.txt +272 -0
- package/src/migration/postgresql-schema-reader.ts +310 -0
- package/src/migration/types.ts +6 -39
- package/src/naite/messaging-types.ts +51 -0
- package/src/naite/naite-reporter.ts +128 -0
- package/src/naite/naite.ts +378 -33
- package/src/shared/web.shared.ts.txt +20 -24
- package/src/stream/sse.ts +5 -5
- package/src/syncer/api-parser.ts +52 -69
- package/src/syncer/checksum.ts +25 -37
- package/src/syncer/code-generator.ts +58 -62
- package/src/syncer/entity-operations.ts +12 -15
- package/src/syncer/file-patterns.ts +2 -2
- package/src/syncer/index.ts +4 -4
- package/src/syncer/module-loader.ts +28 -25
- package/src/syncer/syncer.ts +155 -162
- package/src/template/entity-converter.ts +18 -27
- package/src/template/helpers.ts +8 -11
- package/src/template/implementations/entity.template.ts +6 -6
- package/src/template/implementations/generated.template.ts +99 -99
- package/src/template/implementations/generated_http.template.ts +21 -54
- package/src/template/implementations/generated_sso.template.ts +78 -65
- package/src/template/implementations/init_types.template.ts +4 -6
- package/src/template/implementations/model.template.ts +47 -38
- package/src/template/implementations/model_test.template.ts +3 -3
- package/src/template/implementations/service.template.ts +56 -80
- package/src/template/implementations/view_enums_buttonset.template.ts +2 -2
- package/src/template/implementations/view_enums_dropdown.template.ts +4 -4
- package/src/template/implementations/view_enums_select.template.ts +3 -3
- package/src/template/implementations/view_form.template.ts +34 -75
- package/src/template/implementations/view_id_all_select.template.ts +2 -2
- package/src/template/implementations/view_id_async_select.template.ts +9 -23
- package/src/template/implementations/view_list.template.ts +54 -95
- package/src/template/implementations/view_list_columns.template.ts +4 -10
- package/src/template/implementations/view_search_input.template.ts +2 -2
- package/src/template/index.ts +4 -2
- package/src/template/template-manager.ts +166 -0
- package/src/template/template-types.ts +16 -0
- package/src/template/template.ts +29 -10
- package/src/template/zod-converter.ts +459 -101
- package/src/testing/_relation-graph.ts +18 -11
- package/src/testing/fixture-manager.ts +468 -362
- package/src/types/types.ts +516 -248
- package/src/typings/knex.d.ts +7 -9
- package/src/utils/async-utils.ts +8 -12
- package/src/utils/console-util.ts +1 -1
- package/src/utils/controller.ts +3 -0
- package/src/utils/esm-utils.ts +8 -18
- package/src/utils/formatter.ts +109 -0
- package/src/utils/fs-utils.ts +1 -1
- package/src/utils/lodash-able.ts +1 -4
- package/src/utils/object-utils.ts +217 -0
- package/src/utils/path-utils.ts +3 -6
- package/src/utils/process-utils.ts +1 -1
- package/src/utils/sql-parser.ts +23 -5
- package/src/utils/type-utils.ts +83 -0
- package/src/utils/utils.ts +58 -9
- package/src/utils/zod-error.ts +3 -3
- package/dist/bin/cli-wrapper.d.ts +0 -3
- package/dist/bin/cli-wrapper.d.ts.map +0 -1
- package/dist/bin/cli-wrapper.js +0 -72
- package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +0 -2
- package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +0 -1
- package/dist/database/knex-plugins/knex-on-duplicate-update.js +0 -39
- package/dist/entity/entity-utils.d.ts +0 -61
- package/dist/entity/entity-utils.d.ts.map +0 -1
- package/dist/entity/entity-utils.js +0 -210
- package/src/bin/cli-wrapper.ts +0 -82
- package/src/database/knex-plugins/knex-on-duplicate-update.ts +0 -45
- package/src/entity/entity-utils.ts +0 -291
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export const RESERVED_KEYWORDS = new Set([
|
|
2
|
+
"abstract",
|
|
3
|
+
"arguments",
|
|
4
|
+
"async",
|
|
5
|
+
"await",
|
|
6
|
+
"boolean",
|
|
7
|
+
"break",
|
|
8
|
+
"byte",
|
|
9
|
+
"case",
|
|
10
|
+
"catch",
|
|
11
|
+
"char",
|
|
12
|
+
"class",
|
|
13
|
+
"const",
|
|
14
|
+
"continue",
|
|
15
|
+
"debugger",
|
|
16
|
+
"default",
|
|
17
|
+
"delete",
|
|
18
|
+
"do",
|
|
19
|
+
"double",
|
|
20
|
+
"else",
|
|
21
|
+
"enum",
|
|
22
|
+
"eval",
|
|
23
|
+
"export",
|
|
24
|
+
"extends",
|
|
25
|
+
"false",
|
|
26
|
+
"final",
|
|
27
|
+
"finally",
|
|
28
|
+
"float",
|
|
29
|
+
"for",
|
|
30
|
+
"function",
|
|
31
|
+
"goto",
|
|
32
|
+
"if",
|
|
33
|
+
"implements",
|
|
34
|
+
"import",
|
|
35
|
+
"in",
|
|
36
|
+
"instanceof",
|
|
37
|
+
"int",
|
|
38
|
+
"interface",
|
|
39
|
+
"let",
|
|
40
|
+
"long",
|
|
41
|
+
"native",
|
|
42
|
+
"new",
|
|
43
|
+
"null",
|
|
44
|
+
"package",
|
|
45
|
+
"private",
|
|
46
|
+
"protected",
|
|
47
|
+
"public",
|
|
48
|
+
"return",
|
|
49
|
+
"short",
|
|
50
|
+
"static",
|
|
51
|
+
"super",
|
|
52
|
+
"switch",
|
|
53
|
+
"synchronized",
|
|
54
|
+
"this",
|
|
55
|
+
"throw",
|
|
56
|
+
"throws",
|
|
57
|
+
"transient",
|
|
58
|
+
"true",
|
|
59
|
+
"try",
|
|
60
|
+
"typeof",
|
|
61
|
+
"using",
|
|
62
|
+
"var",
|
|
63
|
+
"void",
|
|
64
|
+
"volatile",
|
|
65
|
+
"while",
|
|
66
|
+
"with",
|
|
67
|
+
"yield"
|
|
68
|
+
]);
|
|
69
|
+
export class ApiValidationError extends Error {
|
|
70
|
+
constructor(message){
|
|
71
|
+
super(`[Sonamu API Validation] ${message}`);
|
|
72
|
+
this.name = "ApiValidationError";
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export function validateMethodName(methodName) {
|
|
76
|
+
if (RESERVED_KEYWORDS.has(methodName)) {
|
|
77
|
+
throw new ApiValidationError(`Method name ${methodName} is a reserved keyword. Please choose a different name.`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvdmFsaWRhdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBSRVNFUlZFRF9LRVlXT1JEUyA9IG5ldyBTZXQoW1xuICBcImFic3RyYWN0XCIsXG4gIFwiYXJndW1lbnRzXCIsXG4gIFwiYXN5bmNcIixcbiAgXCJhd2FpdFwiLFxuICBcImJvb2xlYW5cIixcbiAgXCJicmVha1wiLFxuICBcImJ5dGVcIixcbiAgXCJjYXNlXCIsXG4gIFwiY2F0Y2hcIixcbiAgXCJjaGFyXCIsXG4gIFwiY2xhc3NcIixcbiAgXCJjb25zdFwiLFxuICBcImNvbnRpbnVlXCIsXG4gIFwiZGVidWdnZXJcIixcbiAgXCJkZWZhdWx0XCIsXG4gIFwiZGVsZXRlXCIsXG4gIFwiZG9cIixcbiAgXCJkb3VibGVcIixcbiAgXCJlbHNlXCIsXG4gIFwiZW51bVwiLFxuICBcImV2YWxcIixcbiAgXCJleHBvcnRcIixcbiAgXCJleHRlbmRzXCIsXG4gIFwiZmFsc2VcIixcbiAgXCJmaW5hbFwiLFxuICBcImZpbmFsbHlcIixcbiAgXCJmbG9hdFwiLFxuICBcImZvclwiLFxuICBcImZ1bmN0aW9uXCIsXG4gIFwiZ290b1wiLFxuICBcImlmXCIsXG4gIFwiaW1wbGVtZW50c1wiLFxuICBcImltcG9ydFwiLFxuICBcImluXCIsXG4gIFwiaW5zdGFuY2VvZlwiLFxuICBcImludFwiLFxuICBcImludGVyZmFjZVwiLFxuICBcImxldFwiLFxuICBcImxvbmdcIixcbiAgXCJuYXRpdmVcIixcbiAgXCJuZXdcIixcbiAgXCJudWxsXCIsXG4gIFwicGFja2FnZVwiLFxuICBcInByaXZhdGVcIixcbiAgXCJwcm90ZWN0ZWRcIixcbiAgXCJwdWJsaWNcIixcbiAgXCJyZXR1cm5cIixcbiAgXCJzaG9ydFwiLFxuICBcInN0YXRpY1wiLFxuICBcInN1cGVyXCIsXG4gIFwic3dpdGNoXCIsXG4gIFwic3luY2hyb25pemVkXCIsXG4gIFwidGhpc1wiLFxuICBcInRocm93XCIsXG4gIFwidGhyb3dzXCIsXG4gIFwidHJhbnNpZW50XCIsXG4gIFwidHJ1ZVwiLFxuICBcInRyeVwiLFxuICBcInR5cGVvZlwiLFxuICBcInVzaW5nXCIsXG4gIFwidmFyXCIsXG4gIFwidm9pZFwiLFxuICBcInZvbGF0aWxlXCIsXG4gIFwid2hpbGVcIixcbiAgXCJ3aXRoXCIsXG4gIFwieWllbGRcIixcbl0pO1xuXG5leHBvcnQgY2xhc3MgQXBpVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgW1NvbmFtdSBBUEkgVmFsaWRhdGlvbl0gJHttZXNzYWdlfWApO1xuICAgIHRoaXMubmFtZSA9IFwiQXBpVmFsaWRhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWV0aG9kTmFtZShtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgaWYgKFJFU0VSVkVEX0tFWVdPUkRTLmhhcyhtZXRob2ROYW1lKSkge1xuICAgIHRocm93IG5ldyBBcGlWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgTWV0aG9kIG5hbWUgJHttZXRob2ROYW1lfSBpcyBhIHJlc2VydmVkIGtleXdvcmQuIFBsZWFzZSBjaG9vc2UgYSBkaWZmZXJlbnQgbmFtZS5gLFxuICAgICk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJSRVNFUlZFRF9LRVlXT1JEUyIsIlNldCIsIkFwaVZhbGlkYXRpb25FcnJvciIsIkVycm9yIiwibWVzc2FnZSIsIm5hbWUiLCJ2YWxpZGF0ZU1ldGhvZE5hbWUiLCJtZXRob2ROYW1lIiwiaGFzIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU1BLG9CQUFvQixJQUFJQyxJQUFJO0lBQ3ZDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtDQUNELEVBQUU7QUFFSCxPQUFPLE1BQU1DLDJCQUEyQkM7SUFDdEMsWUFBWUMsT0FBZSxDQUFFO1FBQzNCLEtBQUssQ0FBQyxDQUFDLHdCQUF3QixFQUFFQSxTQUFTO1FBQzFDLElBQUksQ0FBQ0MsSUFBSSxHQUFHO0lBQ2Q7QUFDRjtBQUVBLE9BQU8sU0FBU0MsbUJBQW1CQyxVQUFrQjtJQUNuRCxJQUFJUCxrQkFBa0JRLEdBQUcsQ0FBQ0QsYUFBYTtRQUNyQyxNQUFNLElBQUlMLG1CQUNSLENBQUMsWUFBWSxFQUFFSyxXQUFXLHVEQUF1RCxDQUFDO0lBRXRGO0FBQ0YifQ==
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 소스 코드가 담길 디렉토리 경로
|
|
3
|
+
*/
|
|
4
|
+
export declare const SRC_DIR = "src";
|
|
1
5
|
/**
|
|
2
6
|
* 빌드 결과물이 담길 디렉토리 경로
|
|
3
7
|
*/
|
|
@@ -6,7 +10,7 @@ export declare const BUILD_DIR = "dist";
|
|
|
6
10
|
* SWC 빌드 명령어
|
|
7
11
|
* .swcrc 설정 사용
|
|
8
12
|
*/
|
|
9
|
-
export declare const SWC_BUILD_COMMAND
|
|
13
|
+
export declare const SWC_BUILD_COMMAND: (configFilePath: string) => string;
|
|
10
14
|
/**
|
|
11
15
|
* TSC 타입 체크 명령어
|
|
12
16
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/bin/build-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,SAAS,SAAS,CAAC;AAEhC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/bin/build-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,OAAO,QAAQ,CAAC;AAE7B;;GAEG;AACH,eAAO,MAAM,SAAS,SAAS,CAAC;AAEhC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,gBAAgB,MAAM,WACiC,CAAC;AAE1F;;GAEG;AACH,eAAO,MAAM,sBAAsB,iBAAiB,CAAC"}
|
package/dist/bin/build-config.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 소스 코드가 담길 디렉토리 경로
|
|
3
|
+
*/ export const SRC_DIR = "src";
|
|
1
4
|
/**
|
|
2
5
|
* 빌드 결과물이 담길 디렉토리 경로
|
|
3
6
|
*/ export const BUILD_DIR = "dist";
|
|
4
7
|
/**
|
|
5
8
|
* SWC 빌드 명령어
|
|
6
9
|
* .swcrc 설정 사용
|
|
7
|
-
*/ export const SWC_BUILD_COMMAND =
|
|
10
|
+
*/ export const SWC_BUILD_COMMAND = (configFilePath)=>`swc ${SRC_DIR} -d ${BUILD_DIR} --config-file ${configFilePath} --strip-leading-paths`;
|
|
8
11
|
/**
|
|
9
12
|
* TSC 타입 체크 명령어
|
|
10
13
|
*/ export const TSC_TYPE_CHECK_COMMAND = `tsc --noEmit`;
|
|
11
14
|
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vYnVpbGQtY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog7IaM7IqkIOy9lOuTnOqwgCDri7TquLgg65SU66CJ7Yag66asIOqyveuhnFxuICovXG5leHBvcnQgY29uc3QgU1JDX0RJUiA9IFwic3JjXCI7XG5cbi8qKlxuICog67mM65OcIOqysOqzvOusvOydtCDri7TquLgg65SU66CJ7Yag66asIOqyveuhnFxuICovXG5leHBvcnQgY29uc3QgQlVJTERfRElSID0gXCJkaXN0XCI7XG5cbi8qKlxuICogU1dDIOu5jOuTnCDrqoXroLnslrRcbiAqIC5zd2NyYyDshKTsoJUg7IKs7JqpXG4gKi9cbmV4cG9ydCBjb25zdCBTV0NfQlVJTERfQ09NTUFORCA9IChjb25maWdGaWxlUGF0aDogc3RyaW5nKSA9PlxuICBgc3djICR7U1JDX0RJUn0gLWQgJHtCVUlMRF9ESVJ9IC0tY29uZmlnLWZpbGUgJHtjb25maWdGaWxlUGF0aH0gIC0tc3RyaXAtbGVhZGluZy1wYXRoc2A7XG5cbi8qKlxuICogVFNDIO2DgOyehSDssrTtgawg66qF66C57Ja0XG4gKi9cbmV4cG9ydCBjb25zdCBUU0NfVFlQRV9DSEVDS19DT01NQU5EID0gYHRzYyAtLW5vRW1pdGA7XG4iXSwibmFtZXMiOlsiU1JDX0RJUiIsIkJVSUxEX0RJUiIsIlNXQ19CVUlMRF9DT01NQU5EIiwiY29uZmlnRmlsZVBhdGgiLCJUU0NfVFlQRV9DSEVDS19DT01NQU5EIl0sIm1hcHBpbmdzIjoiQUFBQTs7Q0FFQyxHQUNELE9BQU8sTUFBTUEsVUFBVSxNQUFNO0FBRTdCOztDQUVDLEdBQ0QsT0FBTyxNQUFNQyxZQUFZLE9BQU87QUFFaEM7OztDQUdDLEdBQ0QsT0FBTyxNQUFNQyxvQkFBb0IsQ0FBQ0MsaUJBQ2hDLENBQUMsSUFBSSxFQUFFSCxRQUFRLElBQUksRUFBRUMsVUFBVSxlQUFlLEVBQUVFLGVBQWUsdUJBQXVCLENBQUMsQ0FBQztBQUUxRjs7Q0FFQyxHQUNELE9BQU8sTUFBTUMseUJBQXlCLENBQUMsWUFBWSxDQUFDLENBQUMifQ==
|
package/dist/bin/cli.js
CHANGED
|
@@ -1,23 +1,28 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
2
|
import dotenv from "dotenv";
|
|
3
3
|
dotenv.config();
|
|
4
|
-
import path from "path";
|
|
5
|
-
import { fileURLToPath } from "url";
|
|
6
|
-
import { tsicli } from "tsicli";
|
|
7
4
|
import { execSync, spawn } from "child_process";
|
|
8
|
-
import { mkdir, readdir, writeFile } from "node:fs/promises";
|
|
9
|
-
import
|
|
5
|
+
import { mkdir, readdir, rm, writeFile } from "node:fs/promises";
|
|
6
|
+
import knex from "knex";
|
|
7
|
+
import { createRequire } from "module";
|
|
8
|
+
import path from "path";
|
|
10
9
|
import process from "process";
|
|
10
|
+
import { tsicli } from "tsicli";
|
|
11
11
|
import { Sonamu } from "../api/index.js";
|
|
12
|
-
import knex from "knex";
|
|
13
12
|
import { EntityManager } from "../entity/entity-manager.js";
|
|
14
13
|
import { Migrator } from "../migration/migrator.js";
|
|
15
14
|
import { FixtureManager } from "../testing/fixture-manager.js";
|
|
15
|
+
import { exists } from "../utils/fs-utils.js";
|
|
16
16
|
import { findApiRootPath } from "../utils/utils.js";
|
|
17
|
+
import { BUILD_DIR, SWC_BUILD_COMMAND, TSC_TYPE_CHECK_COMMAND } from "./build-config.js";
|
|
17
18
|
let migrator;
|
|
18
19
|
async function bootstrap() {
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
const notToInit = [
|
|
21
|
+
"dev",
|
|
22
|
+
"build",
|
|
23
|
+
"start"
|
|
24
|
+
].includes(process.argv[2] ?? "");
|
|
25
|
+
if (!notToInit) {
|
|
21
26
|
await Sonamu.init(false, false);
|
|
22
27
|
}
|
|
23
28
|
await tsicli(process.argv, {
|
|
@@ -106,20 +111,22 @@ async function bootstrap() {
|
|
|
106
111
|
[
|
|
107
112
|
"ui"
|
|
108
113
|
],
|
|
114
|
+
[
|
|
115
|
+
"sync"
|
|
116
|
+
],
|
|
109
117
|
[
|
|
110
118
|
"dev"
|
|
111
119
|
],
|
|
120
|
+
[
|
|
121
|
+
"build"
|
|
122
|
+
],
|
|
112
123
|
[
|
|
113
124
|
"start"
|
|
114
125
|
]
|
|
115
126
|
],
|
|
116
127
|
runners: {
|
|
117
|
-
migrate_run,
|
|
118
|
-
migrate_check,
|
|
119
|
-
migrate_rollback,
|
|
120
|
-
migrate_clear,
|
|
121
|
-
migrate_reset,
|
|
122
128
|
migrate_status,
|
|
129
|
+
migrate_run,
|
|
123
130
|
fixture_init,
|
|
124
131
|
fixture_import,
|
|
125
132
|
fixture_sync,
|
|
@@ -130,26 +137,52 @@ async function bootstrap() {
|
|
|
130
137
|
ui,
|
|
131
138
|
// scaffold_view_list,
|
|
132
139
|
// scaffold_view_form,
|
|
140
|
+
sync,
|
|
133
141
|
dev,
|
|
142
|
+
build,
|
|
134
143
|
start
|
|
135
144
|
}
|
|
136
145
|
});
|
|
137
146
|
}
|
|
138
147
|
bootstrap().finally(async ()=>{
|
|
139
|
-
if (migrator) {
|
|
140
|
-
await migrator.destroy();
|
|
141
|
-
}
|
|
142
148
|
await FixtureManager.destroy();
|
|
143
149
|
});
|
|
144
|
-
|
|
150
|
+
/**
|
|
151
|
+
* pnpm sync 하면 실행되는 함수입니다.
|
|
152
|
+
* 프로젝트를 싱크합니다.
|
|
153
|
+
*/ async function sync() {
|
|
154
|
+
await Sonamu.syncer.sync();
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* pnpm dev 하면 실행되는 함수입니다.
|
|
158
|
+
* 프로젝트에 대해 HMR 지원하는 개발 서버를 띄워줍니다.
|
|
159
|
+
*
|
|
160
|
+
* TypeScript를 바로 실행할 수 있도록 @sonamu-kit/loader를,
|
|
161
|
+
* HMR을 지원하기 위해 @sonamu-kit/hot-hook을 import하며,
|
|
162
|
+
* 소스맵 지원을 위해 --enable-source-maps 플래그를 포함하여 실행합니다.
|
|
163
|
+
*
|
|
164
|
+
* 이때 @sonamu-kit/loader와 @sonamu-kit/hot-hook는 sonamu가 자체적으로 가지고 있는 dependency입니다.
|
|
165
|
+
* 또한 실행에 사용하는 @sonamu-kit/hot-runner도 마찬가지로 sonamu가 자체적으로 가지고 있는 dependency입니다.
|
|
166
|
+
* 따라서 사용자 프로젝트에서는 이 세 패키지를 직접 설치할 필요가 없습니다.
|
|
167
|
+
*
|
|
168
|
+
* Sonamu.init 없이 호출될 것을 상정하여 구현되었습니다.
|
|
169
|
+
*/ async function dev() {
|
|
145
170
|
const apiRoot = findApiRootPath();
|
|
146
|
-
const entryPoint =
|
|
147
|
-
console.log(chalk.yellow.bold(
|
|
148
|
-
|
|
171
|
+
const entryPoint = "src/index.ts";
|
|
172
|
+
console.log(chalk.yellow.bold("🚀 Starting Sonamu dev server...\n"));
|
|
173
|
+
// 이 sonamu 패키지가 dependencies로 가지고 있는 @sonamu-kit/hot-runner의 bin/run.js를 사용합니다.
|
|
174
|
+
// 이 경로(/bin/run.js)는 @sonamu-kit/hot-runner의 package.json의 bin 필드에 명시되어 있는 그것과 같습니다.
|
|
175
|
+
const hotRunnerBinPath = createRequire(import.meta.url).resolve("@sonamu-kit/hot-runner/bin/run.js");
|
|
176
|
+
const serverProcess = spawn(process.execPath, [
|
|
177
|
+
hotRunnerBinPath,
|
|
149
178
|
"--clear-screen=false",
|
|
150
|
-
"--node-args=--import
|
|
179
|
+
"--node-args=--import=sonamu/loader-register",
|
|
151
180
|
"--node-args=--import=sonamu/hot-hook-register",
|
|
152
181
|
"--node-args=--enable-source-maps",
|
|
182
|
+
"--on-key=r:restart:Restart server",
|
|
183
|
+
`--on-key=f:shell(rm ${path.join(apiRoot, "sonamu.lock")}):restart:Force restart`,
|
|
184
|
+
"--on-key=enter:shell(echo hi):Key binding test",
|
|
185
|
+
"--on-key=ctrl+f ctrl+f:shell(git pull && pnpm install && pnpm --filter sonamu build && echo 'Sonamu is now up-to-date!'):restart:Pull & install & build & restart",
|
|
153
186
|
entryPoint
|
|
154
187
|
], {
|
|
155
188
|
cwd: apiRoot,
|
|
@@ -163,34 +196,121 @@ async function dev() {
|
|
|
163
196
|
});
|
|
164
197
|
// 종료 처리
|
|
165
198
|
const cleanup = ()=>{
|
|
166
|
-
console.log(chalk.yellow(
|
|
167
|
-
serverProcess.kill(
|
|
199
|
+
console.log(chalk.yellow("\n\n👋 Shutting down..."));
|
|
200
|
+
serverProcess.kill("SIGTERM");
|
|
168
201
|
process.exit(0);
|
|
169
202
|
};
|
|
170
|
-
process.on(
|
|
171
|
-
process.on(
|
|
172
|
-
serverProcess.on(
|
|
203
|
+
process.on("SIGINT", cleanup);
|
|
204
|
+
process.on("SIGTERM", cleanup);
|
|
205
|
+
serverProcess.on("exit", (code)=>{
|
|
173
206
|
if (code !== 0) {
|
|
174
207
|
console.error(chalk.red(`❌ Server exited with code ${code}`));
|
|
175
208
|
process.exit(code || 1);
|
|
176
209
|
}
|
|
177
210
|
});
|
|
178
211
|
}
|
|
179
|
-
|
|
180
|
-
|
|
212
|
+
/**
|
|
213
|
+
* pnpm build 하면 실행되는 함수입니다.
|
|
214
|
+
* 프로젝트를 빌드합니다.
|
|
215
|
+
*
|
|
216
|
+
* 빌드에 필요한 .swcrc는 프로젝트 루트에서 찾고, 없으면 sonamu가 관리하는 .swcrc.project-default를 사용합니다.
|
|
217
|
+
* sonamu.config.ts는 src에 들어있지 않기 때문에 SWC_BUILD_COMMAND로 빌드되지 않습니다.
|
|
218
|
+
* 따라서 따로 빌드해줍니다.
|
|
219
|
+
*
|
|
220
|
+
* Sonamu.init 없이 호출될 것을 상정하여 구현되었습니다.
|
|
221
|
+
*/ async function build() {
|
|
222
|
+
const apiRoot = findApiRootPath();
|
|
223
|
+
// 출력 디렉토리를 제거합니다.
|
|
224
|
+
try {
|
|
225
|
+
console.log(chalk.blue("Removing build directory..."));
|
|
226
|
+
if (await exists(BUILD_DIR)) {
|
|
227
|
+
await rm(BUILD_DIR, {
|
|
228
|
+
recursive: true,
|
|
229
|
+
force: true
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
} catch (error) {
|
|
233
|
+
console.error(chalk.red("Remove build directory failed."), error);
|
|
234
|
+
process.exit(1);
|
|
235
|
+
}
|
|
236
|
+
// .swcrc 파일을 지정합니다.
|
|
237
|
+
let swcFilePath = ".swcrc";
|
|
238
|
+
try {
|
|
239
|
+
if (await exists(swcFilePath)) {
|
|
240
|
+
// 사용자 프로젝트에 .swcrc가 있으면 우선으로 사용합니다.
|
|
241
|
+
console.log(chalk.blue("Using .swcrc from project root..."));
|
|
242
|
+
} else {
|
|
243
|
+
// 아니라면 sonamu가 관리하는 .swcrc.project-default를 가져다 씁니다.
|
|
244
|
+
console.log(chalk.blue("Using default .swcrc from sonamu package..."));
|
|
245
|
+
swcFilePath = path.join(import.meta.dirname, "..", "..", ".swcrc.project-default");
|
|
246
|
+
}
|
|
247
|
+
} catch (error) {
|
|
248
|
+
console.error(chalk.red("Setting up swc config file failed."), error);
|
|
249
|
+
process.exit(1);
|
|
250
|
+
}
|
|
251
|
+
// 소스 디렉토리를 빌드합니다.
|
|
252
|
+
try {
|
|
253
|
+
console.log(chalk.blue("Building with swc..."));
|
|
254
|
+
execSync(SWC_BUILD_COMMAND(swcFilePath), {
|
|
255
|
+
cwd: apiRoot,
|
|
256
|
+
stdio: "inherit"
|
|
257
|
+
});
|
|
258
|
+
} catch (error) {
|
|
259
|
+
console.error(chalk.red("Build failed."), error);
|
|
260
|
+
process.exit(1);
|
|
261
|
+
}
|
|
262
|
+
// sonamu.config.ts만 따로 빌드합니다.
|
|
263
|
+
// 이 친구는 src에 들어있지 않기 때문에 SWC_BUILD_COMMAND로 빌드되지 않습니다.
|
|
264
|
+
// 따라서 따로 빌드해줍니다.
|
|
265
|
+
try {
|
|
266
|
+
const configPath = path.join(apiRoot, "sonamu.config.ts");
|
|
267
|
+
if (await exists(configPath)) {
|
|
268
|
+
console.log(chalk.blue("Building sonamu.config.ts..."));
|
|
269
|
+
execSync(`swc ${configPath} -o ${BUILD_DIR}/sonamu.config.js`, {
|
|
270
|
+
cwd: apiRoot,
|
|
271
|
+
stdio: "inherit"
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
} catch (error) {
|
|
275
|
+
console.error(chalk.red("Building sonamu.config.ts failed."), error);
|
|
276
|
+
process.exit(1);
|
|
277
|
+
}
|
|
278
|
+
// 마지막에는 타입 체크를 해요.
|
|
279
|
+
try {
|
|
280
|
+
console.log(chalk.blue("Checking types with tsc..."));
|
|
281
|
+
execSync(TSC_TYPE_CHECK_COMMAND, {
|
|
282
|
+
cwd: apiRoot,
|
|
283
|
+
stdio: "inherit"
|
|
284
|
+
});
|
|
285
|
+
} catch (error) {
|
|
286
|
+
console.error(chalk.red("Type check failed."), error);
|
|
287
|
+
process.exit(1);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* pnpm start 하면 실행되는 함수입니다.
|
|
292
|
+
* 빌드된 프로젝트를 실행합니다.
|
|
293
|
+
*
|
|
294
|
+
* 빌드된 결과물(dist 디렉토리의 index.js 엔트리포인트)이 없다면 실행을 중단합니다.
|
|
295
|
+
* 소스맵 지원과 dotenv 지원을 포함하여 실행합니다.
|
|
296
|
+
*
|
|
297
|
+
* Sonamu.init 없이 호출될 것을 상정하여 구현되었습니다.
|
|
298
|
+
*/ async function start() {
|
|
299
|
+
const apiRoot = findApiRootPath();
|
|
300
|
+
const entryPoint = "dist/index.js";
|
|
181
301
|
if (!await exists(entryPoint)) {
|
|
182
302
|
console.log(chalk.red(`${entryPoint} not found. Please build your project first.`));
|
|
183
303
|
console.log(chalk.blue("Run: yarn sonamu build"));
|
|
184
304
|
return;
|
|
185
305
|
}
|
|
186
306
|
const { spawn } = await import("child_process");
|
|
187
|
-
const serverProcess = spawn(
|
|
307
|
+
const serverProcess = spawn(process.execPath, [
|
|
188
308
|
"--enable-source-maps",
|
|
189
309
|
"-r",
|
|
190
310
|
"dotenv/config",
|
|
191
311
|
entryPoint
|
|
192
312
|
], {
|
|
193
|
-
cwd:
|
|
313
|
+
cwd: apiRoot,
|
|
194
314
|
stdio: "inherit"
|
|
195
315
|
});
|
|
196
316
|
process.on("SIGINT", ()=>{
|
|
@@ -200,20 +320,14 @@ async function start() {
|
|
|
200
320
|
}
|
|
201
321
|
async function setupMigrator() {
|
|
202
322
|
// migrator
|
|
203
|
-
migrator = new Migrator(
|
|
204
|
-
mode: "dev"
|
|
205
|
-
});
|
|
323
|
+
migrator = new Migrator();
|
|
206
324
|
}
|
|
207
325
|
async function setupFixtureManager() {
|
|
208
326
|
FixtureManager.init();
|
|
209
327
|
}
|
|
210
328
|
async function migrate_run() {
|
|
211
329
|
await setupMigrator();
|
|
212
|
-
await migrator.
|
|
213
|
-
}
|
|
214
|
-
async function migrate_check() {
|
|
215
|
-
await setupMigrator();
|
|
216
|
-
await migrator.check();
|
|
330
|
+
await migrator.runAction("apply", Object.keys(Sonamu.dbConfig));
|
|
217
331
|
}
|
|
218
332
|
async function migrate_status() {
|
|
219
333
|
await setupMigrator();
|
|
@@ -221,18 +335,6 @@ async function migrate_status() {
|
|
|
221
335
|
// status;
|
|
222
336
|
console.log(status);
|
|
223
337
|
}
|
|
224
|
-
async function migrate_rollback() {
|
|
225
|
-
await setupMigrator();
|
|
226
|
-
await migrator.rollback();
|
|
227
|
-
}
|
|
228
|
-
async function migrate_clear() {
|
|
229
|
-
await setupMigrator();
|
|
230
|
-
await migrator.clearPendingList();
|
|
231
|
-
}
|
|
232
|
-
async function migrate_reset() {
|
|
233
|
-
await setupMigrator();
|
|
234
|
-
await migrator.resetAll();
|
|
235
|
-
}
|
|
236
338
|
async function fixture_init() {
|
|
237
339
|
const srcConfig = Sonamu.dbConfig.development_master;
|
|
238
340
|
const targets = [
|
|
@@ -241,17 +343,13 @@ async function fixture_init() {
|
|
|
241
343
|
config: Sonamu.dbConfig.fixture_remote
|
|
242
344
|
},
|
|
243
345
|
{
|
|
244
|
-
label: "(LOCAL)
|
|
245
|
-
config: Sonamu.dbConfig.
|
|
346
|
+
label: "(LOCAL) Testing DB",
|
|
347
|
+
config: Sonamu.dbConfig.test,
|
|
246
348
|
toSkip: (()=>{
|
|
247
349
|
const remoteConn = Sonamu.dbConfig.fixture_remote.connection;
|
|
248
|
-
const localConn = Sonamu.dbConfig.
|
|
350
|
+
const localConn = Sonamu.dbConfig.test.connection;
|
|
249
351
|
return remoteConn.host === localConn.host && remoteConn.database === localConn.database;
|
|
250
352
|
})()
|
|
251
|
-
},
|
|
252
|
-
{
|
|
253
|
-
label: "(LOCAL) Testing DB",
|
|
254
|
-
config: Sonamu.dbConfig.test
|
|
255
353
|
}
|
|
256
354
|
];
|
|
257
355
|
// 1. 기준DB 스키마를 덤프
|
|
@@ -318,7 +416,7 @@ async function stub_practice(name) {
|
|
|
318
416
|
});
|
|
319
417
|
}
|
|
320
418
|
const filteredSeqs = fileNames.filter((fileName)=>fileName.startsWith("p") && fileName.endsWith(".ts")).map((fileName)=>{
|
|
321
|
-
const [, seqNo] = fileName.match(/^p([0-9]+)
|
|
419
|
+
const [, seqNo] = fileName.match(/^p([0-9]+)-/) ?? [
|
|
322
420
|
"0",
|
|
323
421
|
"0"
|
|
324
422
|
];
|
|
@@ -351,7 +449,8 @@ async function stub_practice(name) {
|
|
|
351
449
|
}
|
|
352
450
|
async function stub_entity(entityId) {
|
|
353
451
|
await Sonamu.syncer.createEntity({
|
|
354
|
-
entityId
|
|
452
|
+
entityId,
|
|
453
|
+
title: entityId
|
|
355
454
|
});
|
|
356
455
|
}
|
|
357
456
|
async function scaffold_model(entityId) {
|
|
@@ -366,9 +465,11 @@ async function scaffold_model_test(entityId) {
|
|
|
366
465
|
}
|
|
367
466
|
async function ui() {
|
|
368
467
|
try {
|
|
369
|
-
// @sonamu-kit/ui
|
|
370
|
-
|
|
371
|
-
const
|
|
468
|
+
// 사용자 프로젝트의 패키지들 중에서 @sonamu-kit/ui를 찾습니다.
|
|
469
|
+
// 이를 위해서 createRequire를 사용하여 프로젝트 경로 기준으로 resolve합니다.
|
|
470
|
+
const projectRequire = createRequire(path.join(Sonamu.apiRootPath, "package.json"));
|
|
471
|
+
const uiPackagePath = projectRequire.resolve("@sonamu-kit/ui"); // 없으면 여기서 터져요(MODULE_NOT_FOUND)
|
|
472
|
+
const uiNodePath = path.join(path.dirname(uiPackagePath), "run-ui.js");
|
|
372
473
|
if (!await exists(uiNodePath)) {
|
|
373
474
|
console.log(chalk.red(`UI runner script not found at ${uiNodePath}. Please rebuild @sonamu-kit/ui.`));
|
|
374
475
|
return;
|
|
@@ -376,7 +477,7 @@ async function ui() {
|
|
|
376
477
|
// UI를 별도 프로세스로 실행 (hot-hook 활성화)
|
|
377
478
|
const uiProcess = spawn(process.execPath, [
|
|
378
479
|
"--import",
|
|
379
|
-
"
|
|
480
|
+
"sonamu/loader-register",
|
|
380
481
|
"--import",
|
|
381
482
|
"sonamu/hot-hook-register",
|
|
382
483
|
"--enable-source-maps",
|
|
@@ -415,4 +516,4 @@ async function ui() {
|
|
|
415
516
|
}
|
|
416
517
|
}
|
|
417
518
|
|
|
418
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuZG90ZW52LmNvbmZpZygpO1xuXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJ1cmxcIjtcbmltcG9ydCB7IHRzaWNsaSB9IGZyb20gXCJ0c2ljbGlcIjtcbmltcG9ydCB7IGV4ZWNTeW5jLCBzcGF3biB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQga25leCwgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBNaWdyYXRvciB9IGZyb20gXCIuLi9taWdyYXRpb24vbWlncmF0b3JcIjtcbmltcG9ydCB7IEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBmaW5kQXBpUm9vdFBhdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxubGV0IG1pZ3JhdG9yOiBNaWdyYXRvcjtcblxuYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwKCkge1xuICAvLyBkZXYg66qF66C57Ja06rCAIOyVhOuLjCDqsr3smrDsl5Drp4wgU29uYW11IOy0iOq4sO2ZlFxuICBpZiAocHJvY2Vzcy5hcmd2WzJdICE9PSBcImRldlwiKSB7XG4gICAgYXdhaXQgU29uYW11LmluaXQoZmFsc2UsIGZhbHNlKTtcbiAgfVxuXG4gIGF3YWl0IHRzaWNsaShwcm9jZXNzLmFyZ3YsIHtcbiAgICB0eXBlczoge1xuICAgICAgXCIjZW50aXR5SWRcIjoge1xuICAgICAgICB0eXBlOiBcImF1dG9jb21wbGV0ZVwiLFxuICAgICAgICBuYW1lOiBcIiNlbnRpdHlJZFwiLFxuICAgICAgICBtZXNzYWdlOiBcIlBsZWFzZSBpbnB1dCAjZW50aXR5SWRcIixcbiAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxQYXJlbnRJZHMoKS5tYXAoKGVudGl0eUlkKSA9PiAoe1xuICAgICAgICAgIHRpdGxlOiBlbnRpdHlJZCxcbiAgICAgICAgICB2YWx1ZTogZW50aXR5SWQsXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgICBcIiNyZWNvcmRJZHNcIjogXCJudW1iZXJbXVwiLFxuICAgICAgXCIjbmFtZVwiOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgYXJnczogW1xuICAgICAgW1wiZml4dHVyZVwiLCBcImluaXRcIl0sXG4gICAgICBbXCJmaXh0dXJlXCIsIFwiaW1wb3J0XCIsIFwiI2VudGl0eUlkXCIsIFwiI3JlY29yZElkc1wiXSxcbiAgICAgIFtcImZpeHR1cmVcIiwgXCJzeW5jXCJdLFxuICAgICAgW1wibWlncmF0ZVwiLCBcInJ1blwiXSxcbiAgICAgIFtcIm1pZ3JhdGVcIiwgXCJjaGVja1wiXSxcbiAgICAgIFtcIm1pZ3JhdGVcIiwgXCJyb2xsYmFja1wiXSxcbiAgICAgIFtcIm1pZ3JhdGVcIiwgXCJyZXNldFwiXSxcbiAgICAgIFtcIm1pZ3JhdGVcIiwgXCJjbGVhclwiXSxcbiAgICAgIFtcIm1pZ3JhdGVcIiwgXCJzdGF0dXNcIl0sXG4gICAgICBbXCJzdHViXCIsIFwicHJhY3RpY2VcIiwgXCIjbmFtZVwiXSxcbiAgICAgIFtcInN0dWJcIiwgXCJlbnRpdHlcIiwgXCIjbmFtZVwiXSxcbiAgICAgIFtcInNjYWZmb2xkXCIsIFwibW9kZWxcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICBbXCJzY2FmZm9sZFwiLCBcIm1vZGVsX3Rlc3RcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICBbXCJzY2FmZm9sZFwiLCBcInZpZXdfbGlzdFwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgIFtcInNjYWZmb2xkXCIsIFwidmlld19mb3JtXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgW1widWlcIl0sXG4gICAgICBbXCJkZXZcIl0sXG4gICAgICBbXCJzdGFydFwiXSxcbiAgICBdLFxuICAgIHJ1bm5lcnM6IHtcbiAgICAgIG1pZ3JhdGVfcnVuLFxuICAgICAgbWlncmF0ZV9jaGVjayxcbiAgICAgIG1pZ3JhdGVfcm9sbGJhY2ssXG4gICAgICBtaWdyYXRlX2NsZWFyLFxuICAgICAgbWlncmF0ZV9yZXNldCxcbiAgICAgIG1pZ3JhdGVfc3RhdHVzLFxuICAgICAgZml4dHVyZV9pbml0LFxuICAgICAgZml4dHVyZV9pbXBvcnQsXG4gICAgICBmaXh0dXJlX3N5bmMsXG4gICAgICBzdHViX3ByYWN0aWNlLFxuICAgICAgc3R1Yl9lbnRpdHksXG4gICAgICBzY2FmZm9sZF9tb2RlbCxcbiAgICAgIHNjYWZmb2xkX21vZGVsX3Rlc3QsXG4gICAgICB1aSxcbiAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfbGlzdCxcbiAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfZm9ybSxcbiAgICAgIGRldixcbiAgICAgIHN0YXJ0LFxuICAgIH0sXG4gIH0pO1xufVxuYm9vdHN0cmFwKCkuZmluYWxseShhc3luYyAoKSA9PiB7XG4gIGlmIChtaWdyYXRvcikge1xuICAgIGF3YWl0IG1pZ3JhdG9yLmRlc3Ryb3koKTtcbiAgfVxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5kZXN0cm95KCk7XG59KTtcblxuYXN5bmMgZnVuY3Rpb24gZGV2KCkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSAnc3JjL2luZGV4LnRzJzsgICBcblxuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZCgn8J+agCBTdGFydGluZyBTb25hbXUgZGV2IHNlcnZlci4uLlxcbicpKTtcblxuICBjb25zdCBzZXJ2ZXJQcm9jZXNzID0gc3Bhd24oXG4gICAgXCJob3QtcnVubmVyXCIsXG4gICAgW1xuICAgICAgXCItLWNsZWFyLXNjcmVlbj1mYWxzZVwiLFxuICAgICAgXCItLW5vZGUtYXJncz0tLWltcG9ydD1Ac29uYW11LWtpdC9sb2FkZXJcIixcbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1pbXBvcnQ9c29uYW11L2hvdC1ob29rLXJlZ2lzdGVyXCIsXG4gICAgICBcIi0tbm9kZS1hcmdzPS0tZW5hYmxlLXNvdXJjZS1tYXBzXCIsXG4gICAgICBlbnRyeVBvaW50LFxuICAgIF0sXG4gICAge1xuICAgICAgY3dkOiBhcGlSb290LFxuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgZW52OiB7XG4gICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICBOT0RFX0VOVjogXCJkZXZlbG9wbWVudFwiLFxuICAgICAgICBIT1Q6IFwieWVzXCIsXG4gICAgICAgIEFQSV9ST09UX1BBVEg6IGFwaVJvb3QsXG4gICAgICB9LFxuICAgIH1cbiAgKTtcblxuICAvLyDsooXro4wg7LKY66asXG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdcXG5cXG7wn5GLIFNodXR0aW5nIGRvd24uLi4nKSk7XG4gICAgc2VydmVyUHJvY2Vzcy5raWxsKCdTSUdURVJNJyk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9O1xuXG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsIGNsZWFudXApO1xuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgY2xlYW51cCk7XG5cbiAgc2VydmVyUHJvY2Vzcy5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGDinYwgU2VydmVyIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdChjb2RlIHx8IDEpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuICBjb25zdCBlbnRyeVBvaW50ID0gJ2Rpc3QvaW5kZXguanMnOyAgXG5cbiAgaWYgKCEoYXdhaXQgZXhpc3RzKGVudHJ5UG9pbnQpKSkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY2hhbGsucmVkKGAke2VudHJ5UG9pbnR9IG5vdCBmb3VuZC4gUGxlYXNlIGJ1aWxkIHlvdXIgcHJvamVjdCBmaXJzdC5gKVxuICAgICk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJ1bjogeWFybiBzb25hbXUgYnVpbGRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgc3Bhd24gfSA9IGF3YWl0IGltcG9ydChcImNoaWxkX3Byb2Nlc3NcIik7XG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBcIm5vZGVcIixcbiAgICBbXCItLWVuYWJsZS1zb3VyY2UtbWFwc1wiLCBcIi1yXCIsIFwiZG90ZW52L2NvbmZpZ1wiLCBlbnRyeVBvaW50XSxcbiAgICB7XG4gICAgICBjd2Q6IFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9XG4gICk7XG5cbiAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCAoKSA9PiB7XG4gICAgc2VydmVyUHJvY2Vzcy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICBwcm9jZXNzLmV4aXQoMCk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cE1pZ3JhdG9yKCkge1xuICAvLyBtaWdyYXRvclxuICBtaWdyYXRvciA9IG5ldyBNaWdyYXRvcih7XG4gICAgbW9kZTogXCJkZXZcIixcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwRml4dHVyZU1hbmFnZXIoKSB7XG4gIEZpeHR1cmVNYW5hZ2VyLmluaXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWlncmF0ZV9ydW4oKSB7XG4gIGF3YWl0IHNldHVwTWlncmF0b3IoKTtcblxuICBhd2FpdCBtaWdyYXRvci5ydW4oKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWlncmF0ZV9jaGVjaygpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuXG4gIGF3YWl0IG1pZ3JhdG9yLmNoZWNrKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfc3RhdHVzKCkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG5cbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgbWlncmF0b3IuZ2V0U3RhdHVzKCk7XG4gIC8vIHN0YXR1cztcbiAgY29uc29sZS5sb2coc3RhdHVzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWlncmF0ZV9yb2xsYmFjaygpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuXG4gIGF3YWl0IG1pZ3JhdG9yLnJvbGxiYWNrKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfY2xlYXIoKSB7XG4gIGF3YWl0IHNldHVwTWlncmF0b3IoKTtcblxuICBhd2FpdCBtaWdyYXRvci5jbGVhclBlbmRpbmdMaXN0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfcmVzZXQoKSB7XG4gIGF3YWl0IHNldHVwTWlncmF0b3IoKTtcblxuICBhd2FpdCBtaWdyYXRvci5yZXNldEFsbCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2luaXQoKSB7XG4gIGNvbnN0IHNyY0NvbmZpZyA9IFNvbmFtdS5kYkNvbmZpZy5kZXZlbG9wbWVudF9tYXN0ZXI7XG4gIGNvbnN0IHRhcmdldHMgPSBbXG4gICAge1xuICAgICAgbGFiZWw6IFwiKFJFTU9URSkgRml4dHVyZSBEQlwiLFxuICAgICAgY29uZmlnOiBTb25hbXUuZGJDb25maWcuZml4dHVyZV9yZW1vdGUsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogXCIoTE9DQUwpIEZpeHR1cmUgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLmZpeHR1cmVfbG9jYWwsXG4gICAgICB0b1NraXA6ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbW90ZUNvbm4gPSBTb25hbXUuZGJDb25maWcuZml4dHVyZV9yZW1vdGVcbiAgICAgICAgICAuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gICAgICAgIGNvbnN0IGxvY2FsQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlX2xvY2FsXG4gICAgICAgICAgLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHJlbW90ZUNvbm4uaG9zdCA9PT0gbG9jYWxDb25uLmhvc3QgJiZcbiAgICAgICAgICByZW1vdGVDb25uLmRhdGFiYXNlID09PSBsb2NhbENvbm4uZGF0YWJhc2VcbiAgICAgICAgKTtcbiAgICAgIH0pKCksXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogXCIoTE9DQUwpIFRlc3RpbmcgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLnRlc3QsXG4gICAgfSxcbiAgXSBhcyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBjb25maWc6IEtuZXguQ29uZmlnO1xuICAgIHRvU2tpcD86IGJvb2xlYW47XG4gIH1bXTtcblxuICAvLyAxLiDquLDspIBEQiDsiqTtgqTrp4jrpbwg642k7ZSEXG4gIGNvbnNvbGUubG9nKFwiRFVNUC4uLlwiKTtcbiAgY29uc3QgZHVtcEZpbGVuYW1lID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC0ke0RhdGUubm93KCl9LnNxbGA7XG4gIGNvbnN0IHNyY0Nvbm4gPSBzcmNDb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEdW1wID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC1taWdyYXRpb25zLSR7RGF0ZS5ub3coKX0uc3FsYDtcbiAgZXhlY1N5bmMoXG4gICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLWQgLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9ID4gJHtkdW1wRmlsZW5hbWV9YFxuICApO1xuICBjb25zdCBfZGIgPSBrbmV4KHNyY0NvbmZpZyk7XG4gIGNvbnN0IFtbbWlncmF0aW9uc11dID0gYXdhaXQgX2RiLnJhdyhcbiAgICBcIlNFTEVDVCBDT1VOVCgqKSBhcyBjb3VudCBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfc2NoZW1hID0gPyBBTkQgdGFibGVfbmFtZSA9ICdrbmV4X21pZ3JhdGlvbnMnXCIsXG4gICAgW3NyY0Nvbm4uZGF0YWJhc2VdXG4gICk7XG4gIGlmIChtaWdyYXRpb25zLmNvdW50ID4gMCkge1xuICAgIGV4ZWNTeW5jKFxuICAgICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9IGtuZXhfbWlncmF0aW9ucyBrbmV4X21pZ3JhdGlvbnNfbG9jayA+ICR7bWlncmF0aW9uc0R1bXB9YFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDrjIDsg4FEQiDqsIHqsIHsl5Ag64yA7ZWY7JesIOyhtOyerOyXrOu2gCDtmZXsnbgg7ZuEIOu2k+q4sFxuICBmb3IgYXdhaXQgKGNvbnN0IHsgbGFiZWwsIGNvbmZpZywgdG9Ta2lwIH0gb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbm4gPSBjb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG5cbiAgICBpZiAodG9Ta2lwID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCR7bGFiZWx9OiBTa2lwcGVkIWApKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRiID0ga25leCh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLigoY29uZmlnLmNvbm5lY3Rpb24gPz8ge30pIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyksXG4gICAgICAgIGRhdGFiYXNlOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IFtbcm93XV0gPSBhd2FpdCBkYi5yYXcoYFNIT1cgREFUQUJBU0VTIExJS0UgXCIke2Nvbm4uZGF0YWJhc2V9XCJgKTtcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsueWVsbG93KGAke2xhYmVsfTogRGF0YWJhc2UgXCIke2Nvbm4uZGF0YWJhc2V9XCIgQWxyZWFkeSBleGlzdHNgKVxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBTWU5DIHRvICR7bGFiZWx9Li4uYCk7XG4gICAgY29uc3QgbXlzcWxDbWQgPSBgbXlzcWwgLWgke2Nvbm4uaG9zdH0gLXUke2Nvbm4udXNlcn0gLXAke2Nvbm4ucGFzc3dvcmR9YDtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gLWUgJ0RST1AgREFUQUJBU0UgSUYgRVhJU1RTIFxcYCR7Y29ubi5kYXRhYmFzZX1cXGAnYCk7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9IC1lICdDUkVBVEUgREFUQUJBU0UgXFxgJHtjb25uLmRhdGFiYXNlfVxcYCdgKTtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7ZHVtcEZpbGVuYW1lfWApO1xuICAgIGlmIChhd2FpdCBleGlzdHMobWlncmF0aW9uc0R1bXApKSB7XG4gICAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7bWlncmF0aW9uc0R1bXB9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICB9XG5cbiAgYXdhaXQgX2RiLmRlc3Ryb3koKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbXBvcnQoZW50aXR5SWQ6IHN0cmluZywgcmVjb3JkSWRzOiBudW1iZXJbXSkge1xuICBhd2FpdCBzZXR1cEZpeHR1cmVNYW5hZ2VyKCk7XG5cbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuaW1wb3J0Rml4dHVyZShlbnRpdHlJZCwgcmVjb3JkSWRzKTtcbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuc3luYygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX3N5bmMoKSB7XG4gIGF3YWl0IHNldHVwRml4dHVyZU1hbmFnZXIoKTtcblxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfcHJhY3RpY2UobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHByYWN0aWNlRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJwcmFjdGljZXNcIik7XG4gIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIocHJhY3RpY2VEaXIpO1xuXG4gIGNvbnN0IG1heFNlcU5vID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocHJhY3RpY2VEaXIpKSkge1xuICAgICAgYXdhaXQgbWtkaXIocHJhY3RpY2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkU2VxcyA9IGZpbGVOYW1lc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGZpbGVOYW1lKSA9PiBmaWxlTmFtZS5zdGFydHNXaXRoKFwicFwiKSAmJiBmaWxlTmFtZS5lbmRzV2l0aChcIi50c1wiKVxuICAgICAgKVxuICAgICAgLm1hcCgoZmlsZU5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgWywgc2VxTm9dID0gZmlsZU5hbWUubWF0Y2goL15wKFswLTldKylcXC0vKSA/PyBbXCIwXCIsIFwiMFwiXTtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHNlcU5vKTtcbiAgICAgIH0pXG4gICAgICAuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xuXG4gICAgaWYgKGZpbHRlcmVkU2Vxcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZmlsdGVyZWRTZXFzWzBdO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9KSgpO1xuXG4gIGNvbnN0IGN1cnJlbnRTZXFObyA9IG1heFNlcU5vICsgMTtcbiAgY29uc3QgZmlsZU5hbWUgPSBgcCR7Y3VycmVudFNlcU5vfS0ke25hbWV9LnRzYDtcbiAgY29uc3QgZHN0UGF0aCA9IHBhdGguam9pbihwcmFjdGljZURpciwgZmlsZU5hbWUpO1xuXG4gIGNvbnN0IGNvZGUgPSBbXG4gICAgYGltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCJzb25hbXVcIjtgLFxuICAgIFwiXCIsXG4gICAgYGNvbnNvbGUuY2xlYXIoKTtgLFxuICAgIGBjb25zb2xlLmxvZyhcIiR7ZmlsZU5hbWV9XCIpO2AsXG4gICAgXCJcIixcbiAgICBgU29uYW11LnJ1blNjcmlwdChhc3luYyAoKSA9PiB7YCxcbiAgICBgIC8vIFRPRE9gLFxuICAgIGB9KTtgLFxuICAgIFwiXCIsXG4gIF0uam9pbihcIlxcblwiKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGRzdFBhdGgsIGNvZGUpO1xuXG4gIGV4ZWNTeW5jKGBjb2RlICR7ZHN0UGF0aH1gKTtcblxuICBjb25zdCBydW5Db2RlID0gYHlhcm4gbm9kZSAtciBkb3RlbnYvY29uZmlnIC0tZW5hYmxlLXNvdXJjZS1tYXBzIGRpc3QvcHJhY3RpY2VzLyR7ZmlsZU5hbWUucmVwbGFjZShcbiAgICBcIi50c1wiLFxuICAgIFwiLmpzXCJcbiAgKX1gO1xuICBjb25zb2xlLmxvZyhgJHtjaGFsay5ibHVlKHJ1bkNvZGUpfSBjb3BpZWQgdG8gY2xpcGJvYXJkLmApO1xuICBleGVjU3luYyhgZWNobyBcIiR7cnVuQ29kZX1cIiB8IHBiY29weWApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdHViX2VudGl0eShlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuY3JlYXRlRW50aXR5KHsgZW50aXR5SWQgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX21vZGVsKGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5nZW5lcmF0ZVRlbXBsYXRlKFwibW9kZWxcIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2NhZmZvbGRfbW9kZWxfdGVzdChlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcIm1vZGVsX3Rlc3RcIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdWkoKSB7XG4gIHRyeSB7XG4gICAgLy8gQHNvbmFtdS1raXQvdWnsnZggcnVuLXVpLnRzIOyKpO2BrOumve2KuCDqsr3roZwg7LC+6riwXG4gICAgY29uc3QgdWlNb2R1bGVQYXRoID0gYXdhaXQgaW1wb3J0Lm1ldGEucmVzb2x2ZShcIkBzb25hbXUta2l0L3VpXCIpO1xuICAgIGNvbnN0IHVpTm9kZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aCh1aU1vZHVsZVBhdGgpKSxcbiAgICAgIFwicnVuLXVpLmpzXCJcbiAgICApO1xuXG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKHVpTm9kZVBhdGgpKSkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgVUkgcnVubmVyIHNjcmlwdCBub3QgZm91bmQgYXQgJHt1aU5vZGVQYXRofS4gUGxlYXNlIHJlYnVpbGQgQHNvbmFtdS1raXQvdWkuYFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVJ66W8IOuzhOuPhCDtlITroZzshLjsiqTroZwg7Iuk7ZaJIChob3QtaG9vayDtmZzshLHtmZQpXG4gICAgY29uc3QgdWlQcm9jZXNzID0gc3Bhd24oXG4gICAgICBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgICAgW1xuICAgICAgICBcIi0taW1wb3J0XCIsIFwiQHNvbmFtdS1raXQvbG9hZGVyXCIsXG4gICAgICAgIFwiLS1pbXBvcnRcIiwgXCJzb25hbXUvaG90LWhvb2stcmVnaXN0ZXJcIixcbiAgICAgICAgXCItLWVuYWJsZS1zb3VyY2UtbWFwc1wiLFxuICAgICAgICBcIi0tbm8td2FybmluZ3NcIixcbiAgICAgICAgdWlOb2RlUGF0aCxcbiAgICAgIF0sXG4gICAgICB7XG4gICAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgICAgSE9UOiBcInllc1wiLFxuICAgICAgICAgIFBST0pFQ1RfTkFNRTpcbiAgICAgICAgICAgIFNvbmFtdS5jb25maWcucHJvamVjdE5hbWUgPz8gcGF0aC5iYXNlbmFtZShTb25hbXUuYXBpUm9vdFBhdGgpLFxuICAgICAgICAgIEFQSV9ST09UX1BBVEg6IFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgICAgICBVSV9QT1JUOiAoU29uYW11LmNvbmZpZy51aT8ucG9ydCA/PyA1NzAwMCkudG9TdHJpbmcoKSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8g7KKF66OMIOyymOumrFxuICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJcXG5cXG7wn5GLIFNodXR0aW5nIGRvd24gVUkgc2VydmVyLi4uXCIpKTtcbiAgICAgIHVpUHJvY2Vzcy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBjbGVhbnVwKTtcbiAgICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBjbGVhbnVwKTtcblxuICAgIHVpUHJvY2Vzcy5vbihcImV4aXRcIiwgKGNvZGUpID0+IHtcbiAgICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGDinYwgVUkgc2VydmVyIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGNvZGUgfHwgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZS5pbmNsdWRlcyhcImlzbid0IGRlY2xhcmVkXCIpKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFlvdSBuZWVkIHRvIGluc3RhbGwgJHtjaGFsay5ibHVlKGBAc29uYW11LWtpdC91aWApfSBmaXJzdC5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59XG4iXSwibmFtZXMiOlsiY2hhbGsiLCJkb3RlbnYiLCJjb25maWciLCJwYXRoIiwiZmlsZVVSTFRvUGF0aCIsInRzaWNsaSIsImV4ZWNTeW5jIiwic3Bhd24iLCJta2RpciIsInJlYWRkaXIiLCJ3cml0ZUZpbGUiLCJleGlzdHMiLCJwcm9jZXNzIiwiU29uYW11Iiwia25leCIsIkVudGl0eU1hbmFnZXIiLCJNaWdyYXRvciIsIkZpeHR1cmVNYW5hZ2VyIiwiZmluZEFwaVJvb3RQYXRoIiwibWlncmF0b3IiLCJib290c3RyYXAiLCJhcmd2IiwiaW5pdCIsInR5cGVzIiwidHlwZSIsIm5hbWUiLCJtZXNzYWdlIiwiY2hvaWNlcyIsImdldEFsbFBhcmVudElkcyIsIm1hcCIsImVudGl0eUlkIiwidGl0bGUiLCJ2YWx1ZSIsImFyZ3MiLCJydW5uZXJzIiwibWlncmF0ZV9ydW4iLCJtaWdyYXRlX2NoZWNrIiwibWlncmF0ZV9yb2xsYmFjayIsIm1pZ3JhdGVfY2xlYXIiLCJtaWdyYXRlX3Jlc2V0IiwibWlncmF0ZV9zdGF0dXMiLCJmaXh0dXJlX2luaXQiLCJmaXh0dXJlX2ltcG9ydCIsImZpeHR1cmVfc3luYyIsInN0dWJfcHJhY3RpY2UiLCJzdHViX2VudGl0eSIsInNjYWZmb2xkX21vZGVsIiwic2NhZmZvbGRfbW9kZWxfdGVzdCIsInVpIiwiZGV2Iiwic3RhcnQiLCJmaW5hbGx5IiwiZGVzdHJveSIsImFwaVJvb3QiLCJlbnRyeVBvaW50IiwiY29uc29sZSIsImxvZyIsInllbGxvdyIsImJvbGQiLCJzZXJ2ZXJQcm9jZXNzIiwiY3dkIiwic3RkaW8iLCJlbnYiLCJOT0RFX0VOViIsIkhPVCIsIkFQSV9ST09UX1BBVEgiLCJjbGVhbnVwIiwia2lsbCIsImV4aXQiLCJvbiIsImNvZGUiLCJlcnJvciIsInJlZCIsImJsdWUiLCJhcGlSb290UGF0aCIsInNldHVwTWlncmF0b3IiLCJtb2RlIiwic2V0dXBGaXh0dXJlTWFuYWdlciIsInJ1biIsImNoZWNrIiwic3RhdHVzIiwiZ2V0U3RhdHVzIiwicm9sbGJhY2siLCJjbGVhclBlbmRpbmdMaXN0IiwicmVzZXRBbGwiLCJzcmNDb25maWciLCJkYkNvbmZpZyIsImRldmVsb3BtZW50X21hc3RlciIsInRhcmdldHMiLCJsYWJlbCIsImZpeHR1cmVfcmVtb3RlIiwiZml4dHVyZV9sb2NhbCIsInRvU2tpcCIsInJlbW90ZUNvbm4iLCJjb25uZWN0aW9uIiwibG9jYWxDb25uIiwiaG9zdCIsImRhdGFiYXNlIiwidGVzdCIsImR1bXBGaWxlbmFtZSIsIkRhdGUiLCJub3ciLCJzcmNDb25uIiwibWlncmF0aW9uc0R1bXAiLCJ1c2VyIiwicGFzc3dvcmQiLCJfZGIiLCJtaWdyYXRpb25zIiwicmF3IiwiY291bnQiLCJjb25uIiwiZGIiLCJ1bmRlZmluZWQiLCJyb3ciLCJteXNxbENtZCIsInJlY29yZElkcyIsImltcG9ydEZpeHR1cmUiLCJzeW5jIiwicHJhY3RpY2VEaXIiLCJqb2luIiwiZmlsZU5hbWVzIiwibWF4U2VxTm8iLCJyZWN1cnNpdmUiLCJmaWx0ZXJlZFNlcXMiLCJmaWx0ZXIiLCJmaWxlTmFtZSIsInN0YXJ0c1dpdGgiLCJlbmRzV2l0aCIsInNlcU5vIiwibWF0Y2giLCJwYXJzZUludCIsInNvcnQiLCJhIiwiYiIsImxlbmd0aCIsImN1cnJlbnRTZXFObyIsImRzdFBhdGgiLCJydW5Db2RlIiwicmVwbGFjZSIsInN5bmNlciIsImNyZWF0ZUVudGl0eSIsImdlbmVyYXRlVGVtcGxhdGUiLCJ1aU1vZHVsZVBhdGgiLCJyZXNvbHZlIiwidWlOb2RlUGF0aCIsImRpcm5hbWUiLCJ1aVByb2Nlc3MiLCJleGVjUGF0aCIsIlBST0pFQ1RfTkFNRSIsInByb2plY3ROYW1lIiwiYmFzZW5hbWUiLCJVSV9QT1JUIiwicG9ydCIsInRvU3RyaW5nIiwiZSIsIkVycm9yIiwiaW5jbHVkZXMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVcsUUFBUTtBQUMxQixPQUFPQyxZQUFZLFNBQVM7QUFDNUJBLE9BQU9DLE1BQU07QUFFYixPQUFPQyxVQUFVLE9BQU87QUFDeEIsU0FBU0MsYUFBYSxRQUFRLE1BQU07QUFDcEMsU0FBU0MsTUFBTSxRQUFRLFNBQVM7QUFDaEMsU0FBU0MsUUFBUSxFQUFFQyxLQUFLLFFBQVEsZ0JBQWdCO0FBQ2hELFNBQVNDLEtBQUssRUFBRUMsT0FBTyxFQUFFQyxTQUFTLFFBQVEsbUJBQWM7QUFDeEQsU0FBU0MsTUFBTSxRQUFRLHVCQUFvQjtBQUMzQyxPQUFPQyxhQUFhLFVBQVU7QUFDOUIsU0FBU0MsTUFBTSxRQUFRLGtCQUFTO0FBQ2hDLE9BQU9DLFVBQW9CLE9BQU87QUFDbEMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUFTQyxRQUFRLFFBQVEsMkJBQXdCO0FBQ2pELFNB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
|
|
519
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuXG5kb3RlbnYuY29uZmlnKCk7XG5cbmltcG9ydCB7IGV4ZWNTeW5jLCBzcGF3biB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgcm0sIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IGtuZXgsIHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibW9kdWxlXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSBcInByb2Nlc3NcIjtcbmltcG9ydCB7IHRzaWNsaSB9IGZyb20gXCJ0c2ljbGlcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBNaWdyYXRvciB9IGZyb20gXCIuLi9taWdyYXRpb24vbWlncmF0b3JcIjtcbmltcG9ydCB7IEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgQlVJTERfRElSLCBTV0NfQlVJTERfQ09NTUFORCwgVFNDX1RZUEVfQ0hFQ0tfQ09NTUFORCB9IGZyb20gXCIuL2J1aWxkLWNvbmZpZ1wiO1xuXG5sZXQgbWlncmF0b3I6IE1pZ3JhdG9yO1xuXG5hc3luYyBmdW5jdGlvbiBib290c3RyYXAoKSB7XG4gIGNvbnN0IG5vdFRvSW5pdCA9IFtcImRldlwiLCBcImJ1aWxkXCIsIFwic3RhcnRcIl0uaW5jbHVkZXMocHJvY2Vzcy5hcmd2WzJdID8/IFwiXCIpO1xuICBpZiAoIW5vdFRvSW5pdCkge1xuICAgIGF3YWl0IFNvbmFtdS5pbml0KGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICBhd2FpdCB0c2ljbGkocHJvY2Vzcy5hcmd2LCB7XG4gICAgdHlwZXM6IHtcbiAgICAgIFwiI2VudGl0eUlkXCI6IHtcbiAgICAgICAgdHlwZTogXCJhdXRvY29tcGxldGVcIixcbiAgICAgICAgbmFtZTogXCIjZW50aXR5SWRcIixcbiAgICAgICAgbWVzc2FnZTogXCJQbGVhc2UgaW5wdXQgI2VudGl0eUlkXCIsXG4gICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsUGFyZW50SWRzKCkubWFwKChlbnRpdHlJZCkgPT4gKHtcbiAgICAgICAgICB0aXRsZTogZW50aXR5SWQsXG4gICAgICAgICAgdmFsdWU6IGVudGl0eUlkLFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgICAgXCIjcmVjb3JkSWRzXCI6IFwibnVtYmVyW11cIixcbiAgICAgIFwiI25hbWVcIjogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGFyZ3M6IFtcbiAgICAgIFtcImZpeHR1cmVcIiwgXCJpbml0XCJdLFxuICAgICAgW1wiZml4dHVyZVwiLCBcImltcG9ydFwiLCBcIiNlbnRpdHlJZFwiLCBcIiNyZWNvcmRJZHNcIl0sXG4gICAgICBbXCJmaXh0dXJlXCIsIFwic3luY1wiXSxcbiAgICAgIFtcIm1pZ3JhdGVcIiwgXCJydW5cIl0sXG4gICAgICBbXCJtaWdyYXRlXCIsIFwiY2hlY2tcIl0sXG4gICAgICBbXCJtaWdyYXRlXCIsIFwicm9sbGJhY2tcIl0sXG4gICAgICBbXCJtaWdyYXRlXCIsIFwicmVzZXRcIl0sXG4gICAgICBbXCJtaWdyYXRlXCIsIFwiY2xlYXJcIl0sXG4gICAgICBbXCJtaWdyYXRlXCIsIFwic3RhdHVzXCJdLFxuICAgICAgW1wic3R1YlwiLCBcInByYWN0aWNlXCIsIFwiI25hbWVcIl0sXG4gICAgICBbXCJzdHViXCIsIFwiZW50aXR5XCIsIFwiI25hbWVcIl0sXG4gICAgICBbXCJzY2FmZm9sZFwiLCBcIm1vZGVsXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgW1wic2NhZmZvbGRcIiwgXCJtb2RlbF90ZXN0XCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgW1wic2NhZmZvbGRcIiwgXCJ2aWV3X2xpc3RcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICBbXCJzY2FmZm9sZFwiLCBcInZpZXdfZm9ybVwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgIFtcInVpXCJdLFxuICAgICAgW1wic3luY1wiXSxcbiAgICAgIFtcImRldlwiXSxcbiAgICAgIFtcImJ1aWxkXCJdLFxuICAgICAgW1wic3RhcnRcIl0sXG4gICAgXSxcbiAgICBydW5uZXJzOiB7XG4gICAgICBtaWdyYXRlX3N0YXR1cyxcbiAgICAgIG1pZ3JhdGVfcnVuLFxuICAgICAgZml4dHVyZV9pbml0LFxuICAgICAgZml4dHVyZV9pbXBvcnQsXG4gICAgICBmaXh0dXJlX3N5bmMsXG4gICAgICBzdHViX3ByYWN0aWNlLFxuICAgICAgc3R1Yl9lbnRpdHksXG4gICAgICBzY2FmZm9sZF9tb2RlbCxcbiAgICAgIHNjYWZmb2xkX21vZGVsX3Rlc3QsXG4gICAgICB1aSxcbiAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfbGlzdCxcbiAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfZm9ybSxcbiAgICAgIHN5bmMsXG4gICAgICBkZXYsXG4gICAgICBidWlsZCxcbiAgICAgIHN0YXJ0LFxuICAgIH0sXG4gIH0pO1xufVxuXG5ib290c3RyYXAoKS5maW5hbGx5KGFzeW5jICgpID0+IHtcbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuZGVzdHJveSgpO1xufSk7XG5cbi8qKlxuICogcG5wbSBzeW5jIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICog7ZSE66Gc7KCd7Yq466W8IOyLse2BrO2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3luYygpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5zeW5jKCk7XG59XG5cbi8qKlxuICogcG5wbSBkZXYg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDtlITroZzsoJ3tirjsl5Ag64yA7ZW0IEhNUiDsp4Dsm5DtlZjripQg6rCc67CcIOyEnOuyhOulvCDrnYTsm4zspI3ri4jri6QuXG4gKlxuICogVHlwZVNjcmlwdOulvCDrsJTroZwg7Iuk7ZaJ7ZWgIOyImCDsnojrj4TroZ0gQHNvbmFtdS1raXQvbG9hZGVy66W8LFxuICogSE1S7J2EIOyngOybkO2VmOq4sCDsnITtlbQgQHNvbmFtdS1raXQvaG90LWhvb2vsnYQgaW1wb3J07ZWY66mwLFxuICog7IaM7Iqk66e1IOyngOybkOydhCDsnITtlbQgLS1lbmFibGUtc291cmNlLW1hcHMg7ZSM656Y6re466W8IO2PrO2VqO2VmOyXrCDsi6Ttlontlanri4jri6QuXG4gKlxuICog7J2065WMIEBzb25hbXUta2l0L2xvYWRlcuyZgCBAc29uYW11LWtpdC9ob3QtaG9va+uKlCBzb25hbXXqsIAg7J6Q7LK07KCB7Jy866GcIOqwgOyngOqzoCDsnojripQgZGVwZW5kZW5jeeyeheuLiOuLpC5cbiAqIOuYkO2VnCDsi6Ttlonsl5Ag7IKs7Jqp7ZWY64qUIEBzb25hbXUta2l0L2hvdC1ydW5uZXLrj4Qg66eI7LCs6rCA7KeA66GcIHNvbmFtdeqwgCDsnpDssrTsoIHsnLzroZwg6rCA7KeA6rOgIOyeiOuKlCBkZXBlbmRlbmN57J6F64uI64ukLlxuICog65Sw65287IScIOyCrOyaqeyekCDtlITroZzsoJ3tirjsl5DshJzripQg7J20IOyEuCDtjKjtgqTsp4Drpbwg7KeB7KCRIOyEpOy5mO2VoCDtlYTsmpTqsIAg7JeG7Iq164uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRldigpIHtcbiAgY29uc3QgYXBpUm9vdCA9IGZpbmRBcGlSb290UGF0aCgpO1xuICBjb25zdCBlbnRyeVBvaW50ID0gXCJzcmMvaW5kZXgudHNcIjtcblxuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIvCfmoAgU3RhcnRpbmcgU29uYW11IGRldiBzZXJ2ZXIuLi5cXG5cIikpO1xuXG4gIC8vIOydtCBzb25hbXUg7Yyo7YKk7KeA6rCAIGRlcGVuZGVuY2llc+uhnCDqsIDsp4Dqs6Ag7J6I64qUIEBzb25hbXUta2l0L2hvdC1ydW5uZXLsnZggYmluL3J1bi5qc+ulvCDsgqzsmqntlanri4jri6QuXG4gIC8vIOydtCDqsr3roZwoL2Jpbi9ydW4uanMp64qUIEBzb25hbXUta2l0L2hvdC1ydW5uZXLsnZggcGFja2FnZS5qc29u7J2YIGJpbiDtlYTrk5zsl5Ag66qF7Iuc65CY7Ja0IOyeiOuKlCDqt7jqsoPqs7wg6rCZ7Iq164uI64ukLlxuICBjb25zdCBob3RSdW5uZXJCaW5QYXRoID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpLnJlc29sdmUoXG4gICAgXCJAc29uYW11LWtpdC9ob3QtcnVubmVyL2Jpbi9ydW4uanNcIixcbiAgKTtcblxuICBjb25zdCBzZXJ2ZXJQcm9jZXNzID0gc3Bhd24oXG4gICAgcHJvY2Vzcy5leGVjUGF0aCwgLy8gbm9kZVxuICAgIFtcbiAgICAgIGhvdFJ1bm5lckJpblBhdGgsIC8vIOydtOugh+qyjCDtlbTshJwgaG90LXJ1bm5lcuulvCDsi6TtlontlZjqtazsmpRcbiAgICAgIFwiLS1jbGVhci1zY3JlZW49ZmFsc2VcIiwgLy8g7J207ZWYIGhvdC1ydW5uZXLsl5Dqsowg64SY6rKo7KSEIOyduOyekOuTpOyeheuLiOuLpC5cbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1pbXBvcnQ9c29uYW11L2xvYWRlci1yZWdpc3RlclwiLCAvLyBUeXBlU2NyaXB0IOyEnO2PrO2KuOulvCDsnITtlZwg66Gc642ULFxuICAgICAgXCItLW5vZGUtYXJncz0tLWltcG9ydD1zb25hbXUvaG90LWhvb2stcmVnaXN0ZXJcIiwgLy8gSE1S7J2EIOyngOybkO2VmOq4sCDsnITtlZwgaG90LWhvb2ssXG4gICAgICBcIi0tbm9kZS1hcmdzPS0tZW5hYmxlLXNvdXJjZS1tYXBzXCIsIC8vIOq3uOumrOqzoCDshozsiqTrp7Ug7KeA7JuQ7J2EIOychO2VnCDtlIzrnpjqt7jsnoXri4jri6QuXG4gICAgICBcIi0tb24ta2V5PXI6cmVzdGFydDpSZXN0YXJ0IHNlcnZlclwiLCAvLyByIOuIhOultOuptCDshJzrsoQg7J6s7Iuc7J6R7ZWY6rKMIO2VtOykmOyalC5cbiAgICAgIGAtLW9uLWtleT1mOnNoZWxsKHJtICR7cGF0aC5qb2luKGFwaVJvb3QsIFwic29uYW11LmxvY2tcIil9KTpyZXN0YXJ0OkZvcmNlIHJlc3RhcnRgLCAvLyBmIOuIhOultOuptCBzb25hbXUubG9jayDtjIzsnbzsnYQg7KeA7Jqw6rOgIOyEnOuyhCDsnqzsi5zsnpHtlZjqsowg7ZW07KSY7JqULlxuXG4gICAgICBcIi0tb24ta2V5PWVudGVyOnNoZWxsKGVjaG8gaGkpOktleSBiaW5kaW5nIHRlc3RcIiwgLy8gZW50ZXLrpbwga2V566GcIOyTuCDsiJgg7J6I7J2M7J2EIOuztOydtOq4sCDsnITtlZwg7YWM7Iqk7Yq47J6F64uI64ukLlxuICAgICAgXCItLW9uLWtleT1jdHJsK2YgY3RybCtmOnNoZWxsKGdpdCBwdWxsICYmIHBucG0gaW5zdGFsbCAmJiBwbnBtIC0tZmlsdGVyIHNvbmFtdSBidWlsZCAmJiBlY2hvICdTb25hbXUgaXMgbm93IHVwLXRvLWRhdGUhJyk6cmVzdGFydDpQdWxsICYgaW5zdGFsbCAmIGJ1aWxkICYgcmVzdGFydFwiLCAvLyBtb2RpZmllcuyZgOydmCDsobDtlaksIOq3uOumrOqzoCDrkZAg6rCc7J2YIGNob3Jk66W8IOyCrOyaqe2VoCDsiJgg7J6I7J2M7J2EIOuztOydtOq4sCDsnITtlZwg7YWM7Iqk7Yq47J6F64uI64ukLlxuICAgICAgZW50cnlQb2ludCwgLy8g66eI7KeA66eJ7Jy866GcIOyLpOygnCDsi6TtlontlaAg7Iqk7YGs66a97Yq47J2YIOqyveuhnOulvCDrhJjqsqjspI3ri4jri6QuXG4gICAgXSxcbiAgICB7XG4gICAgICBjd2Q6IGFwaVJvb3QsXG4gICAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgICBlbnY6IHtcbiAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgIE5PREVfRU5WOiBcImRldmVsb3BtZW50XCIsXG4gICAgICAgIEhPVDogXCJ5ZXNcIiwgLy8g7JaY6rCAIOyeiOyWtOyVvCBITVLsnbQg7Zmc7ISx7ZmU65Cp64uI64ukLlxuICAgICAgICBBUElfUk9PVF9QQVRIOiBhcGlSb290LCAvLyDsnbQg6rK966Gc6rCAIGhvdC1ob29r7J2YIOujqO2KuCDrlJTroInthqDrpqzqsIAg65Cp64uI64ukLlxuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIC8vIOyiheujjCDsspjrpqxcbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJcXG5cXG7wn5GLIFNodXR0aW5nIGRvd24uLi5cIikpO1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9O1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgY2xlYW51cCk7XG4gIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIGNsZWFudXApO1xuXG4gIHNlcnZlclByb2Nlc3Mub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGDinYwgU2VydmVyIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdChjb2RlIHx8IDEpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogcG5wbSBidWlsZCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIO2UhOuhnOygne2KuOulvCDruYzrk5ztlanri4jri6QuXG4gKlxuICog67mM65Oc7JeQIO2VhOyalO2VnCAuc3djcmPripQg7ZSE66Gc7KCd7Yq4IOujqO2KuOyXkOyEnCDssL7qs6AsIOyXhuycvOuptCBzb25hbXXqsIAg6rSA66as7ZWY64qUIC5zd2NyYy5wcm9qZWN0LWRlZmF1bHTrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICogc29uYW11LmNvbmZpZy50c+uKlCBzcmPsl5Ag65Ok7Ja07J6I7KeAIOyViuq4sCDrlYzrrLjsl5AgU1dDX0JVSUxEX0NPTU1BTkTroZwg67mM65Oc65CY7KeAIOyViuyKteuLiOuLpC5cbiAqIOuUsOudvOyEnCDrlLDroZwg67mM65Oc7ZW07KSN64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkKCkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG5cbiAgLy8g7Lac66ClIOuUlOugie2GoOumrOulvCDsoJzqsbDtlanri4jri6QuXG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJlbW92aW5nIGJ1aWxkIGRpcmVjdG9yeS4uLlwiKSk7XG4gICAgaWYgKGF3YWl0IGV4aXN0cyhCVUlMRF9ESVIpKSB7XG4gICAgICBhd2FpdCBybShCVUlMRF9ESVIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJSZW1vdmUgYnVpbGQgZGlyZWN0b3J5IGZhaWxlZC5cIiksIGVycm9yKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICAvLyAuc3djcmMg7YyM7J287J2EIOyngOygle2VqeuLiOuLpC5cbiAgbGV0IHN3Y0ZpbGVQYXRoID0gXCIuc3djcmNcIjtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHN3Y0ZpbGVQYXRoKSkge1xuICAgICAgLy8g7IKs7Jqp7J6QIO2UhOuhnOygne2KuOyXkCAuc3djcmPqsIAg7J6I7Jy866m0IOyasOyEoOycvOuhnCDsgqzsmqntlanri4jri6QuXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKFwiVXNpbmcgLnN3Y3JjIGZyb20gcHJvamVjdCByb290Li4uXCIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7JWE64uI652866m0IHNvbmFtdeqwgCDqtIDrpqztlZjripQgLnN3Y3JjLnByb2plY3QtZGVmYXVsdOulvCDqsIDsoLjri6Qg7JSB64uI64ukLlxuICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlVzaW5nIGRlZmF1bHQgLnN3Y3JjIGZyb20gc29uYW11IHBhY2thZ2UuLi5cIikpO1xuICAgICAgc3djRmlsZVBhdGggPSBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwiLnN3Y3JjLnByb2plY3QtZGVmYXVsdFwiKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJTZXR0aW5nIHVwIHN3YyBjb25maWcgZmlsZSBmYWlsZWQuXCIpLCBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8g7IaM7IqkIOuUlOugie2GoOumrOulvCDruYzrk5ztlanri4jri6QuXG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIkJ1aWxkaW5nIHdpdGggc3djLi4uXCIpKTtcbiAgICBleGVjU3luYyhTV0NfQlVJTERfQ09NTUFORChzd2NGaWxlUGF0aCksIHsgY3dkOiBhcGlSb290LCBzdGRpbzogXCJpbmhlcml0XCIgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJCdWlsZCBmYWlsZWQuXCIpLCBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8gc29uYW11LmNvbmZpZy50c+unjCDrlLDroZwg67mM65Oc7ZWp64uI64ukLlxuICAvLyDsnbQg7Lmc6rWs64qUIHNyY+yXkCDrk6TslrTsnojsp4Ag7JWK6riwIOuVjOusuOyXkCBTV0NfQlVJTERfQ09NTUFOROuhnCDruYzrk5zrkJjsp4Ag7JWK7Iq164uI64ukLlxuICAvLyDrlLDrnbzshJwg65Sw66GcIOu5jOuTnO2VtOykjeuLiOuLpC5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKGFwaVJvb3QsIFwic29uYW11LmNvbmZpZy50c1wiKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKGNvbmZpZ1BhdGgpKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKFwiQnVpbGRpbmcgc29uYW11LmNvbmZpZy50cy4uLlwiKSk7XG4gICAgICBleGVjU3luYyhgc3djICR7Y29uZmlnUGF0aH0gLW8gJHtCVUlMRF9ESVJ9L3NvbmFtdS5jb25maWcuanNgLCB7XG4gICAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgfSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiQnVpbGRpbmcgc29uYW11LmNvbmZpZy50cyBmYWlsZWQuXCIpLCBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8g66eI7KeA66eJ7JeQ64qUIO2DgOyehSDssrTtgazrpbwg7ZW07JqULlxuICB0cnkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoXCJDaGVja2luZyB0eXBlcyB3aXRoIHRzYy4uLlwiKSk7XG4gICAgZXhlY1N5bmMoVFNDX1RZUEVfQ0hFQ0tfQ09NTUFORCwge1xuICAgICAgY3dkOiBhcGlSb290LFxuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiVHlwZSBjaGVjayBmYWlsZWQuXCIpLCBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogcG5wbSBzdGFydCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOu5jOuTnOuQnCDtlITroZzsoJ3tirjrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIOu5jOuTnOuQnCDqsrDqs7zrrLwoZGlzdCDrlJTroInthqDrpqzsnZggaW5kZXguanMg7JeU7Yq466as7Y+s7J247Yq4KeydtCDsl4bri6TrqbQg7Iuk7ZaJ7J2EIOykkeuLqO2VqeuLiOuLpC5cbiAqIOyGjOyKpOuntSDsp4Dsm5Dqs7wgZG90ZW52IOyngOybkOydhCDtj6ztlajtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcImRpc3QvaW5kZXguanNcIjtcblxuICBpZiAoIShhd2FpdCBleGlzdHMoZW50cnlQb2ludCkpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsucmVkKGAke2VudHJ5UG9pbnR9IG5vdCBmb3VuZC4gUGxlYXNlIGJ1aWxkIHlvdXIgcHJvamVjdCBmaXJzdC5gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJ1bjogeWFybiBzb25hbXUgYnVpbGRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgc3Bhd24gfSA9IGF3YWl0IGltcG9ydChcImNoaWxkX3Byb2Nlc3NcIik7XG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgIFtcIi0tZW5hYmxlLXNvdXJjZS1tYXBzXCIsIFwiLXJcIiwgXCJkb3RlbnYvY29uZmlnXCIsIGVudHJ5UG9pbnRdLFxuICAgIHtcbiAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9LFxuICApO1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgKCkgPT4ge1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBNaWdyYXRvcigpIHtcbiAgLy8gbWlncmF0b3JcbiAgbWlncmF0b3IgPSBuZXcgTWlncmF0b3IoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBGaXh0dXJlTWFuYWdlcigpIHtcbiAgRml4dHVyZU1hbmFnZXIuaW5pdCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX3J1bigpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuXG4gIGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihcbiAgICBcImFwcGx5XCIsXG4gICAgT2JqZWN0LmtleXMoU29uYW11LmRiQ29uZmlnKSBhcyAoa2V5b2YgU29uYW11REJDb25maWcpW10gLyrsi7kg64ukISovLFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX3N0YXR1cygpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuXG4gIGNvbnN0IHN0YXR1cyA9IGF3YWl0IG1pZ3JhdG9yLmdldFN0YXR1cygpO1xuICAvLyBzdGF0dXM7XG4gIGNvbnNvbGUubG9nKHN0YXR1cyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfaW5pdCgpIHtcbiAgY29uc3Qgc3JjQ29uZmlnID0gU29uYW11LmRiQ29uZmlnLmRldmVsb3BtZW50X21hc3RlcjtcbiAgY29uc3QgdGFyZ2V0cyA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogXCIoUkVNT1RFKSBGaXh0dXJlIERCXCIsXG4gICAgICBjb25maWc6IFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlX3JlbW90ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiBcIihMT0NBTCkgVGVzdGluZyBEQlwiLFxuICAgICAgY29uZmlnOiBTb25hbXUuZGJDb25maWcudGVzdCxcbiAgICAgIHRvU2tpcDogKCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVtb3RlQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlX3JlbW90ZS5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgICAgY29uc3QgbG9jYWxDb25uID0gU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gICAgICAgIHJldHVybiByZW1vdGVDb25uLmhvc3QgPT09IGxvY2FsQ29ubi5ob3N0ICYmIHJlbW90ZUNvbm4uZGF0YWJhc2UgPT09IGxvY2FsQ29ubi5kYXRhYmFzZTtcbiAgICAgIH0pKCksXG4gICAgfSxcbiAgXSBhcyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBjb25maWc6IEtuZXguQ29uZmlnO1xuICAgIHRvU2tpcD86IGJvb2xlYW47XG4gIH1bXTtcblxuICAvLyAxLiDquLDspIBEQiDsiqTtgqTrp4jrpbwg642k7ZSEXG4gIGNvbnNvbGUubG9nKFwiRFVNUC4uLlwiKTtcbiAgY29uc3QgZHVtcEZpbGVuYW1lID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC0ke0RhdGUubm93KCl9LnNxbGA7XG4gIGNvbnN0IHNyY0Nvbm4gPSBzcmNDb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEdW1wID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC1taWdyYXRpb25zLSR7RGF0ZS5ub3coKX0uc3FsYDtcbiAgZXhlY1N5bmMoXG4gICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLWQgLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9ID4gJHtkdW1wRmlsZW5hbWV9YCxcbiAgKTtcbiAgY29uc3QgX2RiID0ga25leChzcmNDb25maWcpO1xuICBjb25zdCBbW21pZ3JhdGlvbnNdXSA9IGF3YWl0IF9kYi5yYXcoXG4gICAgXCJTRUxFQ1QgQ09VTlQoKikgYXMgY291bnQgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9ID8gQU5EIHRhYmxlX25hbWUgPSAna25leF9taWdyYXRpb25zJ1wiLFxuICAgIFtzcmNDb25uLmRhdGFiYXNlXSxcbiAgKTtcbiAgaWYgKG1pZ3JhdGlvbnMuY291bnQgPiAwKSB7XG4gICAgZXhlY1N5bmMoXG4gICAgICBgbXlzcWxkdW1wIC1oJHtzcmNDb25uLmhvc3R9IC11JHtzcmNDb25uLnVzZXJ9IC1wJHtzcmNDb25uLnBhc3N3b3JkfSAtLXNpbmdsZS10cmFuc2FjdGlvbiAtLW5vLWNyZWF0ZS1kYiAtLXRyaWdnZXJzICR7c3JjQ29ubi5kYXRhYmFzZX0ga25leF9taWdyYXRpb25zIGtuZXhfbWlncmF0aW9uc19sb2NrID4gJHttaWdyYXRpb25zRHVtcH1gLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDrjIDsg4FEQiDqsIHqsIHsl5Ag64yA7ZWY7JesIOyhtOyerOyXrOu2gCDtmZXsnbgg7ZuEIOu2k+q4sFxuICBmb3IgYXdhaXQgKGNvbnN0IHsgbGFiZWwsIGNvbmZpZywgdG9Ta2lwIH0gb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbm4gPSBjb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG5cbiAgICBpZiAodG9Ta2lwID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCR7bGFiZWx9OiBTa2lwcGVkIWApKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRiID0ga25leCh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLigoY29uZmlnLmNvbm5lY3Rpb24gPz8ge30pIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyksXG4gICAgICAgIGRhdGFiYXNlOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IFtbcm93XV0gPSBhd2FpdCBkYi5yYXcoYFNIT1cgREFUQUJBU0VTIExJS0UgXCIke2Nvbm4uZGF0YWJhc2V9XCJgKTtcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCR7bGFiZWx9OiBEYXRhYmFzZSBcIiR7Y29ubi5kYXRhYmFzZX1cIiBBbHJlYWR5IGV4aXN0c2ApKTtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBTWU5DIHRvICR7bGFiZWx9Li4uYCk7XG4gICAgY29uc3QgbXlzcWxDbWQgPSBgbXlzcWwgLWgke2Nvbm4uaG9zdH0gLXUke2Nvbm4udXNlcn0gLXAke2Nvbm4ucGFzc3dvcmR9YDtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gLWUgJ0RST1AgREFUQUJBU0UgSUYgRVhJU1RTIFxcYCR7Y29ubi5kYXRhYmFzZX1cXGAnYCk7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9IC1lICdDUkVBVEUgREFUQUJBU0UgXFxgJHtjb25uLmRhdGFiYXNlfVxcYCdgKTtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7ZHVtcEZpbGVuYW1lfWApO1xuICAgIGlmIChhd2FpdCBleGlzdHMobWlncmF0aW9uc0R1bXApKSB7XG4gICAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7bWlncmF0aW9uc0R1bXB9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICB9XG5cbiAgYXdhaXQgX2RiLmRlc3Ryb3koKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbXBvcnQoZW50aXR5SWQ6IHN0cmluZywgcmVjb3JkSWRzOiBudW1iZXJbXSkge1xuICBhd2FpdCBzZXR1cEZpeHR1cmVNYW5hZ2VyKCk7XG5cbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuaW1wb3J0Rml4dHVyZShlbnRpdHlJZCwgcmVjb3JkSWRzKTtcbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuc3luYygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX3N5bmMoKSB7XG4gIGF3YWl0IHNldHVwRml4dHVyZU1hbmFnZXIoKTtcblxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfcHJhY3RpY2UobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHByYWN0aWNlRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJwcmFjdGljZXNcIik7XG4gIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIocHJhY3RpY2VEaXIpO1xuXG4gIGNvbnN0IG1heFNlcU5vID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocHJhY3RpY2VEaXIpKSkge1xuICAgICAgYXdhaXQgbWtkaXIocHJhY3RpY2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkU2VxcyA9IGZpbGVOYW1lc1xuICAgICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IGZpbGVOYW1lLnN0YXJ0c1dpdGgoXCJwXCIpICYmIGZpbGVOYW1lLmVuZHNXaXRoKFwiLnRzXCIpKVxuICAgICAgLm1hcCgoZmlsZU5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgWywgc2VxTm9dID0gZmlsZU5hbWUubWF0Y2goL15wKFswLTldKyktLykgPz8gW1wiMFwiLCBcIjBcIl07XG4gICAgICAgIHJldHVybiBwYXJzZUludChzZXFObyk7XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcblxuICAgIGlmIChmaWx0ZXJlZFNlcXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZpbHRlcmVkU2Vxc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSkoKTtcblxuICBjb25zdCBjdXJyZW50U2VxTm8gPSBtYXhTZXFObyArIDE7XG4gIGNvbnN0IGZpbGVOYW1lID0gYHAke2N1cnJlbnRTZXFOb30tJHtuYW1lfS50c2A7XG4gIGNvbnN0IGRzdFBhdGggPSBwYXRoLmpvaW4ocHJhY3RpY2VEaXIsIGZpbGVOYW1lKTtcblxuICBjb25zdCBjb2RlID0gW1xuICAgIGBpbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7YCxcbiAgICBcIlwiLFxuICAgIGBjb25zb2xlLmNsZWFyKCk7YCxcbiAgICBgY29uc29sZS5sb2coXCIke2ZpbGVOYW1lfVwiKTtgLFxuICAgIFwiXCIsXG4gICAgYFNvbmFtdS5ydW5TY3JpcHQoYXN5bmMgKCkgPT4ge2AsXG4gICAgYCAvLyBUT0RPYCxcbiAgICBgfSk7YCxcbiAgICBcIlwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG4gIGF3YWl0IHdyaXRlRmlsZShkc3RQYXRoLCBjb2RlKTtcblxuICBleGVjU3luYyhgY29kZSAke2RzdFBhdGh9YCk7XG5cbiAgY29uc3QgcnVuQ29kZSA9IGB5YXJuIG5vZGUgLXIgZG90ZW52L2NvbmZpZyAtLWVuYWJsZS1zb3VyY2UtbWFwcyBkaXN0L3ByYWN0aWNlcy8ke2ZpbGVOYW1lLnJlcGxhY2UoXG4gICAgXCIudHNcIixcbiAgICBcIi5qc1wiLFxuICApfWA7XG4gIGNvbnNvbGUubG9nKGAke2NoYWxrLmJsdWUocnVuQ29kZSl9IGNvcGllZCB0byBjbGlwYm9hcmQuYCk7XG4gIGV4ZWNTeW5jKGBlY2hvIFwiJHtydW5Db2RlfVwiIHwgcGJjb3B5YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfZW50aXR5KGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5jcmVhdGVFbnRpdHkoeyBlbnRpdHlJZCwgdGl0bGU6IGVudGl0eUlkIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZF9tb2RlbChlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcIm1vZGVsXCIsIHtcbiAgICBlbnRpdHlJZCxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX21vZGVsX3Rlc3QoZW50aXR5SWQ6IHN0cmluZykge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLmdlbmVyYXRlVGVtcGxhdGUoXCJtb2RlbF90ZXN0XCIsIHtcbiAgICBlbnRpdHlJZCxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVpKCkge1xuICB0cnkge1xuICAgIC8vIOyCrOyaqeyekCDtlITroZzsoJ3tirjsnZgg7Yyo7YKk7KeA65OkIOykkeyXkOyEnCBAc29uYW11LWtpdC91aeulvCDssL7sirXri4jri6QuXG4gICAgLy8g7J2066W8IOychO2VtOyEnCBjcmVhdGVSZXF1aXJl66W8IOyCrOyaqe2VmOyXrCDtlITroZzsoJ3tirgg6rK966GcIOq4sOykgOycvOuhnCByZXNvbHZl7ZWp64uI64ukLlxuICAgIGNvbnN0IHByb2plY3RSZXF1aXJlID0gY3JlYXRlUmVxdWlyZShwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInBhY2thZ2UuanNvblwiKSk7XG4gICAgY29uc3QgdWlQYWNrYWdlUGF0aCA9IHByb2plY3RSZXF1aXJlLnJlc29sdmUoXCJAc29uYW11LWtpdC91aVwiKTsgLy8g7JeG7Jy866m0IOyXrOq4sOyEnCDthLDsoLjsmpQoTU9EVUxFX05PVF9GT1VORClcbiAgICBjb25zdCB1aU5vZGVQYXRoID0gcGF0aC5qb2luKHBhdGguZGlybmFtZSh1aVBhY2thZ2VQYXRoKSwgXCJydW4tdWkuanNcIik7XG5cbiAgICBpZiAoIShhd2FpdCBleGlzdHModWlOb2RlUGF0aCkpKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsucmVkKGBVSSBydW5uZXIgc2NyaXB0IG5vdCBmb3VuZCBhdCAke3VpTm9kZVBhdGh9LiBQbGVhc2UgcmVidWlsZCBAc29uYW11LWtpdC91aS5gKSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVUnrpbwg67OE64+EIO2UhOuhnOyEuOyKpOuhnCDsi6TtlokgKGhvdC1ob29rIO2ZnOyEse2ZlClcbiAgICBjb25zdCB1aVByb2Nlc3MgPSBzcGF3bihcbiAgICAgIHByb2Nlc3MuZXhlY1BhdGgsXG4gICAgICBbXG4gICAgICAgIFwiLS1pbXBvcnRcIixcbiAgICAgICAgXCJzb25hbXUvbG9hZGVyLXJlZ2lzdGVyXCIsXG4gICAgICAgIFwiLS1pbXBvcnRcIixcbiAgICAgICAgXCJzb25hbXUvaG90LWhvb2stcmVnaXN0ZXJcIixcbiAgICAgICAgXCItLWVuYWJsZS1zb3VyY2UtbWFwc1wiLFxuICAgICAgICBcIi0tbm8td2FybmluZ3NcIixcbiAgICAgICAgdWlOb2RlUGF0aCxcbiAgICAgIF0sXG4gICAgICB7XG4gICAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgICAgSE9UOiBcInllc1wiLFxuICAgICAgICAgIFBST0pFQ1RfTkFNRTogU29uYW11LmNvbmZpZy5wcm9qZWN0TmFtZSA/PyBwYXRoLmJhc2VuYW1lKFNvbmFtdS5hcGlSb290UGF0aCksXG4gICAgICAgICAgQVBJX1JPT1RfUEFUSDogU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgICAgIFVJX1BPUlQ6IChTb25hbXUuY29uZmlnLnVpPy5wb3J0ID8/IDU3MDAwKS50b1N0cmluZygpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8g7KKF66OMIOyymOumrFxuICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJcXG5cXG7wn5GLIFNodXR0aW5nIGRvd24gVUkgc2VydmVyLi4uXCIpKTtcbiAgICAgIHVpUHJvY2Vzcy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBjbGVhbnVwKTtcbiAgICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBjbGVhbnVwKTtcblxuICAgIHVpUHJvY2Vzcy5vbihcImV4aXRcIiwgKGNvZGUpID0+IHtcbiAgICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGDinYwgVUkgc2VydmVyIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGNvZGUgfHwgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZS5pbmNsdWRlcyhcImlzbid0IGRlY2xhcmVkXCIpKSB7XG4gICAgICBjb25zb2xlLmxvZyhgWW91IG5lZWQgdG8gaW5zdGFsbCAke2NoYWxrLmJsdWUoYEBzb25hbXUta2l0L3VpYCl9IGZpcnN0LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59XG4iXSwibmFtZXMiOlsiY2hhbGsiLCJkb3RlbnYiLCJjb25maWciLCJleGVjU3luYyIsInNwYXduIiwibWtkaXIiLCJyZWFkZGlyIiwicm0iLCJ3cml0ZUZpbGUiLCJrbmV4IiwiY3JlYXRlUmVxdWlyZSIsInBhdGgiLCJwcm9jZXNzIiwidHNpY2xpIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIk1pZ3JhdG9yIiwiRml4dHVyZU1hbmFnZXIiLCJleGlzdHMiLCJmaW5kQXBpUm9vdFBhdGgiLCJCVUlMRF9ESVIiLCJTV0NfQlVJTERfQ09NTUFORCIsIlRTQ19UWVBFX0NIRUNLX0NPTU1BTkQiLCJtaWdyYXRvciIsImJvb3RzdHJhcCIsIm5vdFRvSW5pdCIsImluY2x1ZGVzIiwiYXJndiIsImluaXQiLCJ0eXBlcyIsInR5cGUiLCJuYW1lIiwibWVzc2FnZSIsImNob2ljZXMiLCJnZXRBbGxQYXJlbnRJZHMiLCJtYXAiLCJlbnRpdHlJZCIsInRpdGxlIiwidmFsdWUiLCJhcmdzIiwicnVubmVycyIsIm1pZ3JhdGVfc3RhdHVzIiwibWlncmF0ZV9ydW4iLCJmaXh0dXJlX2luaXQiLCJmaXh0dXJlX2ltcG9ydCIsImZpeHR1cmVfc3luYyIsInN0dWJfcHJhY3RpY2UiLCJzdHViX2VudGl0eSIsInNjYWZmb2xkX21vZGVsIiwic2NhZmZvbGRfbW9kZWxfdGVzdCIsInVpIiwic3luYyIsImRldiIsImJ1aWxkIiwic3RhcnQiLCJmaW5hbGx5IiwiZGVzdHJveSIsInN5bmNlciIsImFwaVJvb3QiLCJlbnRyeVBvaW50IiwiY29uc29sZSIsImxvZyIsInllbGxvdyIsImJvbGQiLCJob3RSdW5uZXJCaW5QYXRoIiwidXJsIiwicmVzb2x2ZSIsInNlcnZlclByb2Nlc3MiLCJleGVjUGF0aCIsImpvaW4iLCJjd2QiLCJzdGRpbyIsImVudiIsIk5PREVfRU5WIiwiSE9UIiwiQVBJX1JPT1RfUEFUSCIsImNsZWFudXAiLCJraWxsIiwiZXhpdCIsIm9uIiwiY29kZSIsImVycm9yIiwicmVkIiwiYmx1ZSIsInJlY3Vyc2l2ZSIsImZvcmNlIiwic3djRmlsZVBhdGgiLCJkaXJuYW1lIiwiY29uZmlnUGF0aCIsInNldHVwTWlncmF0b3IiLCJzZXR1cEZpeHR1cmVNYW5hZ2VyIiwicnVuQWN0aW9uIiwiT2JqZWN0Iiwia2V5cyIsImRiQ29uZmlnIiwic3RhdHVzIiwiZ2V0U3RhdHVzIiwic3JjQ29uZmlnIiwiZGV2ZWxvcG1lbnRfbWFzdGVyIiwidGFyZ2V0cyIsImxhYmVsIiwiZml4dHVyZV9yZW1vdGUiLCJ0ZXN0IiwidG9Ta2lwIiwicmVtb3RlQ29ubiIsImNvbm5lY3Rpb24iLCJsb2NhbENvbm4iLCJob3N0IiwiZGF0YWJhc2UiLCJkdW1wRmlsZW5hbWUiLCJEYXRlIiwibm93Iiwic3JjQ29ubiIsIm1pZ3JhdGlvbnNEdW1wIiwidXNlciIsInBhc3N3b3JkIiwiX2RiIiwibWlncmF0aW9ucyIsInJhdyIsImNvdW50IiwiY29ubiIsImRiIiwidW5kZWZpbmVkIiwicm93IiwibXlzcWxDbWQiLCJyZWNvcmRJZHMiLCJpbXBvcnRGaXh0dXJlIiwicHJhY3RpY2VEaXIiLCJhcGlSb290UGF0aCIsImZpbGVOYW1lcyIsIm1heFNlcU5vIiwiZmlsdGVyZWRTZXFzIiwiZmlsdGVyIiwiZmlsZU5hbWUiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJzZXFObyIsIm1hdGNoIiwicGFyc2VJbnQiLCJzb3J0IiwiYSIsImIiLCJsZW5ndGgiLCJjdXJyZW50U2VxTm8iLCJkc3RQYXRoIiwicnVuQ29kZSIsInJlcGxhY2UiLCJjcmVhdGVFbnRpdHkiLCJnZW5lcmF0ZVRlbXBsYXRlIiwicHJvamVjdFJlcXVpcmUiLCJ1aVBhY2thZ2VQYXRoIiwidWlOb2RlUGF0aCIsInVpUHJvY2VzcyIsIlBST0pFQ1RfTkFNRSIsInByb2plY3ROYW1lIiwiYmFzZW5hbWUiLCJVSV9QT1JUIiwicG9ydCIsInRvU3RyaW5nIiwiZSIsIkVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsWUFBWSxTQUFTO0FBRTVCQSxPQUFPQyxNQUFNO0FBRWIsU0FBU0MsUUFBUSxFQUFFQyxLQUFLLFFBQVEsZ0JBQWdCO0FBQ2hELFNBQVNDLEtBQUssRUFBRUMsT0FBTyxFQUFFQyxFQUFFLEVB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
|