sonamu 0.10.12 → 0.10.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/agents/agent.d.ts +1 -1
- package/dist/ai/agents/agent.d.ts.map +1 -1
- package/dist/ai/agents/agent.js +5 -6
- package/dist/ai/agents/types.d.ts +1 -1
- package/dist/ai/agents/types.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/api.js +18 -18
- package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/error.js +17 -15
- package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/model.js +3 -2
- package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/options.js +16 -16
- package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/provider.js +9 -9
- package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/utils.js +1 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +17 -17
- package/dist/api/code-converters.d.ts +4 -2
- package/dist/api/code-converters.d.ts.map +1 -1
- package/dist/api/code-converters.js +100 -19
- package/dist/api/config.d.ts +16 -1
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +28 -21
- package/dist/api/context.d.ts +2 -2
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +1 -1
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +18 -11
- package/dist/api/http-validator.d.ts +36 -0
- package/dist/api/http-validator.d.ts.map +1 -0
- package/dist/api/http-validator.js +72 -0
- package/dist/api/index.js +6 -4
- package/dist/api/sonamu.d.ts +59 -20
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +250 -106
- package/dist/api/websocket-helpers.d.ts +7 -5
- package/dist/api/websocket-helpers.d.ts.map +1 -1
- package/dist/api/websocket-helpers.js +6 -6
- package/dist/auth/audit-log/builders.d.ts.map +1 -1
- package/dist/auth/audit-log/builders.js +1 -1
- package/dist/auth/audit-log/client-ip.d.ts +1 -1
- package/dist/auth/audit-log/client-ip.d.ts.map +1 -1
- package/dist/auth/audit-log/client-ip.js +4 -2
- package/dist/auth/audit-log/events.d.ts +5 -1
- package/dist/auth/audit-log/events.d.ts.map +1 -1
- package/dist/auth/audit-log/events.js +1 -1
- package/dist/auth/audit-log/plugin.d.ts +0 -8
- package/dist/auth/audit-log/plugin.d.ts.map +1 -1
- package/dist/auth/audit-log/plugin.js +48 -52
- package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
- package/dist/auth/audit-log-ingestor.js +16 -12
- package/dist/auth/auth-generator.d.ts.map +1 -1
- package/dist/auth/auth-generator.js +1 -1
- package/dist/auth/better-auth-request.d.ts.map +1 -1
- package/dist/auth/better-auth-request.js +6 -5
- package/dist/auth/knex-adapter.js +1 -1
- package/dist/auth/plugins/entity-definitions/index.d.ts +13 -1
- package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/index.js +1 -1
- package/dist/auth/plugins/wrappers/admin.d.ts +1 -1
- package/dist/bin/build-config.d.ts +25 -0
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +105 -2
- package/dist/bin/cli.js +131 -27
- package/dist/bin/compiler-policy.d.ts +3 -0
- package/dist/bin/compiler-policy.d.ts.map +1 -0
- package/dist/bin/compiler-policy.js +24 -0
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +5 -3
- package/dist/bin/test-command.d.ts +22 -1
- package/dist/bin/test-command.d.ts.map +1 -1
- package/dist/bin/test-command.js +18 -10
- package/dist/bin/ts-loader-registration.d.ts +7 -1
- package/dist/bin/ts-loader-registration.d.ts.map +1 -1
- package/dist/bin/ts-loader-registration.js +13 -4
- package/dist/cache/decorator.d.ts.map +1 -1
- package/dist/cache/decorator.js +11 -4
- package/dist/compress/compress.d.ts.map +1 -1
- package/dist/compress/compress.js +1 -1
- package/dist/cone/cone-generator.d.ts +14 -1
- package/dist/cone/cone-generator.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +13 -9
- package/dist/database/_batch_update.js +1 -1
- package/dist/database/base-model.d.ts +22 -10
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +26 -16
- package/dist/database/base-model.types.d.ts +15 -3
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/db.d.ts +12 -2
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +10 -7
- package/dist/database/knex.d.ts.map +1 -1
- package/dist/database/knex.js +17 -14
- package/dist/database/puri.d.ts +11 -9
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +93 -79
- package/dist/database/puri.types.d.ts +21 -21
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +1 -1
- package/dist/database/upsert-builder.d.ts +12 -10
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +20 -12
- package/dist/dict/sd.d.ts.map +1 -1
- package/dist/dict/sd.js +1 -1
- package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
- package/dist/dict/sonamu-dictionary.js +1 -1
- package/dist/dict/utils.d.ts.map +1 -1
- package/dist/dict/utils.js +7 -2
- package/dist/entity/entity-manager.d.ts +13 -4
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +19 -11
- package/dist/entity/entity-template-cone.d.ts +73 -5
- package/dist/entity/entity-template-cone.d.ts.map +1 -1
- package/dist/entity/entity-template-cone.js +4 -2
- package/dist/entity/entity.d.ts +6 -2
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +30 -28
- package/dist/env.d.ts +3 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +1 -1
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +7 -2
- package/dist/exceptions/so-exceptions.d.ts +24 -20
- package/dist/exceptions/so-exceptions.d.ts.map +1 -1
- package/dist/exceptions/so-exceptions.js +4 -2
- package/dist/filter/utils.d.ts +7 -2
- package/dist/filter/utils.d.ts.map +1 -1
- package/dist/filter/utils.js +8 -6
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -6
- package/dist/logger/configure.d.ts.map +1 -1
- package/dist/logger/configure.js +10 -10
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +50 -46
- package/dist/migration/index-where-predicate.d.ts.map +1 -1
- package/dist/migration/index-where-predicate.js +22 -8
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +1 -1
- package/dist/migration/migrator.d.ts +3 -2
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +27 -21
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +51 -36
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +1 -1
- package/dist/naite/naite-reporter.js +2 -2
- package/dist/naite/naite.d.ts +74 -15
- package/dist/naite/naite.d.ts.map +1 -1
- package/dist/naite/naite.js +5 -19
- package/dist/runtime-type.d.ts +6 -0
- package/dist/runtime-type.d.ts.map +1 -0
- package/dist/runtime-type.js +26 -0
- package/dist/ssr/hmr-opt-out.d.ts +26 -0
- package/dist/ssr/hmr-opt-out.d.ts.map +1 -0
- package/dist/ssr/hmr-opt-out.js +59 -0
- package/dist/ssr/renderer.d.ts.map +1 -1
- package/dist/ssr/renderer.js +4 -1
- package/dist/storage/base-file.js +14 -14
- 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 +12 -12
- package/dist/storage/s3-driver.d.ts.map +1 -1
- package/dist/storage/s3-driver.js +1 -1
- package/dist/storage/uploaded-file.d.ts +2 -2
- package/dist/storage/uploaded-file.d.ts.map +1 -1
- package/dist/storage/uploaded-file.js +8 -8
- package/dist/stream/sse.js +11 -11
- package/dist/stream/ws-core.d.ts +1 -1
- package/dist/stream/ws-core.d.ts.map +1 -1
- package/dist/stream/ws-delivery.d.ts +1 -1
- package/dist/stream/ws-delivery.d.ts.map +1 -1
- package/dist/stream/ws-delivery.js +6 -4
- package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
- package/dist/stream/ws-local-connection-store.js +4 -2
- package/dist/stream/ws-presence-store.js +1 -1
- package/dist/stream/ws-registry.d.ts +4 -4
- package/dist/stream/ws-registry.d.ts.map +1 -1
- package/dist/stream/ws-registry.js +4 -2
- package/dist/stream/ws-telemetry.d.ts +16 -12
- package/dist/stream/ws-telemetry.d.ts.map +1 -1
- package/dist/stream/ws-telemetry.js +22 -18
- package/dist/stream/ws.d.ts +18 -12
- package/dist/stream/ws.d.ts.map +1 -1
- package/dist/stream/ws.js +26 -22
- package/dist/syncer/api-parser.js +1 -1
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +7 -8
- package/dist/syncer/code-generator.d.ts.map +1 -1
- package/dist/syncer/code-generator.js +13 -14
- package/dist/syncer/entity-operations.d.ts.map +1 -1
- package/dist/syncer/entity-operations.js +5 -6
- package/dist/syncer/file-copy.d.ts +5 -0
- package/dist/syncer/file-copy.d.ts.map +1 -0
- package/dist/syncer/file-copy.js +36 -0
- package/dist/syncer/file-patterns.d.ts +1 -0
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +5 -2
- package/dist/syncer/file-tracking.d.ts.map +1 -1
- package/dist/syncer/file-tracking.js +5 -4
- package/dist/syncer/filesystem-dependencies.d.ts +15 -0
- package/dist/syncer/filesystem-dependencies.d.ts.map +1 -0
- package/dist/syncer/filesystem-dependencies.js +53 -0
- package/dist/syncer/module-loader.d.ts +1 -1
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +6 -4
- package/dist/syncer/syncer-actions.d.ts +4 -0
- package/dist/syncer/syncer-actions.d.ts.map +1 -1
- package/dist/syncer/syncer-actions.js +34 -17
- package/dist/syncer/syncer.d.ts +17 -6
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +71 -29
- package/dist/syncer/watcher.d.ts.map +1 -1
- package/dist/syncer/watcher.js +3 -3
- package/dist/tasks/decorator.d.ts +6 -6
- package/dist/tasks/decorator.d.ts.map +1 -1
- package/dist/tasks/decorator.js +4 -4
- package/dist/tasks/step-wrapper.d.ts +6 -4
- package/dist/tasks/step-wrapper.d.ts.map +1 -1
- package/dist/tasks/step-wrapper.js +5 -5
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +13 -7
- 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 +2 -2
- package/dist/template/helpers.d.ts +8 -6
- package/dist/template/helpers.d.ts.map +1 -1
- package/dist/template/helpers.js +1 -1
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +4 -4
- package/dist/template/implementations/generated_http.template.d.ts +7 -4
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.js +21 -21
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +6 -3
- package/dist/template/implementations/http_validators.template.d.ts +18 -0
- package/dist/template/implementations/http_validators.template.d.ts.map +1 -0
- package/dist/template/implementations/http_validators.template.js +127 -0
- package/dist/template/implementations/model.template.d.ts.map +1 -1
- package/dist/template/implementations/model.template.js +1 -1
- package/dist/template/implementations/queries.template.js +1 -1
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +79 -39
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +6 -4
- package/dist/template/implementations/view_form.template.d.ts +6 -1
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +23 -15
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +11 -6
- package/dist/template/template-manager.d.ts.map +1 -1
- package/dist/template/template-manager.js +9 -7
- package/dist/template/template-types.d.ts +12 -5
- package/dist/template/template-types.d.ts.map +1 -1
- package/dist/template/template-types.js +1 -1
- package/dist/template/template.d.ts +2 -2
- package/dist/template/template.d.ts.map +1 -1
- package/dist/template/template.js +6 -4
- package/dist/template/zod-converter.d.ts +0 -19
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +100 -84
- package/dist/testing/_relation-graph.d.ts.map +1 -1
- package/dist/testing/_relation-graph.js +2 -1
- package/dist/testing/bootstrap.d.ts.map +1 -1
- package/dist/testing/bootstrap.js +9 -6
- package/dist/testing/data-explorer.d.ts +32 -7
- package/dist/testing/data-explorer.d.ts.map +1 -1
- package/dist/testing/data-explorer.js +77 -31
- package/dist/testing/dev-test-routes.d.ts +8 -1
- package/dist/testing/dev-test-routes.d.ts.map +1 -1
- package/dist/testing/dev-test-routes.js +125 -108
- package/dist/testing/dev-vitest-manager.d.ts +54 -8
- package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
- package/dist/testing/dev-vitest-manager.js +24 -9
- package/dist/testing/faker-mappings.d.ts +412 -1
- package/dist/testing/faker-mappings.d.ts.map +1 -1
- package/dist/testing/faker-mappings.js +1 -1
- package/dist/testing/filesystem.d.ts +2 -0
- package/dist/testing/filesystem.d.ts.map +1 -0
- package/dist/testing/filesystem.js +7 -0
- package/dist/testing/fixture-generator.d.ts +25 -8
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +132 -73
- package/dist/testing/fixture-loader.d.ts +3 -1
- package/dist/testing/fixture-loader.d.ts.map +1 -1
- package/dist/testing/fixture-loader.js +1 -20
- package/dist/testing/fixture-manager.d.ts +8 -7
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +91 -59
- package/dist/testing/global-setup.d.ts.map +1 -1
- package/dist/testing/global-setup.js +5 -2
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +6 -3
- package/dist/types/types.d.ts +101 -99
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +234 -225
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +1 -1
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +28 -18
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +135 -128
- package/dist/ui/async-route.d.ts +3 -0
- package/dist/ui/async-route.d.ts.map +1 -0
- package/dist/ui/async-route.js +12 -0
- package/dist/ui/cdd-service.d.ts +9 -7
- package/dist/ui/cdd-service.d.ts.map +1 -1
- package/dist/ui/cdd-service.js +7 -5
- package/dist/ui/migrations-api.d.ts.map +1 -1
- package/dist/ui/migrations-api.js +17 -15
- package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
- package/dist/ui-web/index.html +1 -1
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +7 -5
- package/dist/utils/fs-utils.d.ts +3 -3
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +6 -6
- package/dist/utils/model.d.ts +3 -5
- package/dist/utils/model.d.ts.map +1 -1
- package/dist/utils/model.js +1 -1
- package/dist/utils/object-utils.d.ts +1 -1
- package/dist/utils/object-utils.d.ts.map +1 -1
- package/dist/utils/object-utils.js +17 -16
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +4 -2
- package/dist/utils/runtime-value.d.ts +13 -0
- package/dist/utils/runtime-value.d.ts.map +1 -0
- package/dist/utils/runtime-value.js +40 -0
- package/dist/utils/sql-parser.d.ts +8 -1
- package/dist/utils/sql-parser.d.ts.map +1 -1
- package/dist/utils/sql-parser.js +6 -3
- package/dist/utils/type-utils.d.ts.map +1 -1
- package/dist/utils/type-utils.js +10 -8
- package/dist/utils/utils.d.ts +2 -2
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +11 -8
- package/dist/utils/zod-error.d.ts.map +1 -1
- package/dist/utils/zod-error.js +7 -4
- package/dist/vector/chunking.d.ts.map +1 -1
- package/dist/vector/chunking.js +1 -1
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +1 -1
- package/dist/vector/types.d.ts +3 -2
- package/dist/vector/types.d.ts.map +1 -1
- package/package.json +5 -3
- package/src/ai/agents/agent.ts +5 -5
- package/src/ai/agents/types.ts +1 -1
- package/src/ai/providers/rtzr/__tests__/model.test.ts +2 -2
- package/src/ai/providers/rtzr/error.ts +5 -3
- package/src/ai/providers/rtzr/model.ts +3 -2
- package/src/ai/providers/rtzr/options.ts +10 -5
- package/src/ai/providers/rtzr/provider.ts +10 -10
- package/src/ai/providers/rtzr/utils.ts +3 -1
- package/src/api/__tests__/config.test.ts +11 -21
- package/src/api/__tests__/sonamu.http-validator.test.ts +512 -0
- package/src/api/__tests__/sonamu.websocket.test.ts +51 -41
- package/src/api/__tests__/zod-compiler-policy.test.ts +95 -0
- package/src/api/caster.ts +6 -8
- package/src/api/code-converters.ts +136 -36
- package/src/api/config.ts +62 -4
- package/src/api/context.ts +3 -3
- package/src/api/decorators.ts +28 -17
- package/src/api/http-validator.ts +149 -0
- package/src/api/sonamu.ts +459 -152
- package/src/api/websocket-helpers.ts +24 -17
- package/src/auth/audit-log/builders.ts +3 -2
- package/src/auth/audit-log/client-ip.ts +4 -2
- package/src/auth/audit-log/events.ts +15 -1
- package/src/auth/audit-log/plugin.ts +129 -200
- package/src/auth/audit-log-ingestor.ts +19 -15
- package/src/auth/auth-generator.ts +10 -5
- package/src/auth/better-auth-request.ts +4 -3
- package/src/auth/knex-adapter.ts +8 -2
- package/src/auth/plugins/entity-definitions/index.ts +6 -5
- package/src/bin/__tests__/http-validator-benchmark.test.ts +94 -0
- package/src/bin/__tests__/test-command.test.ts +9 -15
- package/src/bin/__tests__/ts-loader-register.test.ts +15 -17
- package/src/bin/__tests__/zod-compiler-build.test.ts +307 -0
- package/src/bin/build-config.ts +167 -0
- package/src/bin/cli.ts +153 -36
- package/src/bin/compiler-policy.ts +35 -0
- package/src/bin/fixture.ts +14 -3
- package/src/bin/test-command.ts +74 -29
- package/src/bin/ts-loader-registration.ts +22 -4
- package/src/cache/decorator.ts +10 -3
- package/src/compress/compress.ts +17 -4
- package/src/cone/cone-generator.ts +34 -6
- package/src/database/__tests__/db.test.ts +1 -0
- package/src/database/__tests__/puri.test.ts +16 -15
- package/src/database/__tests__/transaction-scope.test.ts +5 -0
- package/src/database/_batch_update.ts +1 -0
- package/src/database/base-model.ts +81 -50
- package/src/database/base-model.types.ts +6 -6
- package/src/database/db.ts +29 -19
- package/src/database/knex.ts +30 -17
- package/src/database/puri-subset.test-d.ts +17 -0
- package/src/database/puri.ts +181 -143
- package/src/database/puri.types.test-d.ts +31 -1
- package/src/database/puri.types.ts +23 -21
- package/src/database/upsert-builder.ts +75 -53
- package/src/dict/sd.ts +15 -5
- package/src/dict/sonamu-dictionary.ts +6 -6
- package/src/dict/utils.ts +9 -1
- package/src/entity/entity-manager.ts +26 -9
- package/src/entity/entity-template-cone.ts +5 -10
- package/src/entity/entity.ts +50 -34
- package/src/env.ts +7 -3
- package/src/exceptions/error-handler.ts +17 -2
- package/src/exceptions/so-exceptions.ts +26 -20
- package/src/filter/utils.ts +21 -11
- package/src/index.ts +3 -0
- package/src/logger/configure.ts +26 -18
- package/src/migration/__tests__/migrator.test.ts +50 -57
- package/src/migration/code-generation.ts +132 -104
- package/src/migration/index-where-predicate.ts +51 -24
- package/src/migration/migration-set.ts +11 -5
- package/src/migration/migrator.ts +68 -41
- package/src/migration/postgresql-schema-reader.ts +52 -47
- package/src/migration/slack-confirm.ts +17 -15
- package/src/naite/naite-reporter.ts +1 -1
- package/src/naite/naite.ts +97 -24
- package/src/runtime-type.ts +34 -0
- package/src/ssr/hmr-opt-out.ts +78 -0
- package/src/ssr/renderer.ts +6 -0
- package/src/storage/base-file.ts +13 -13
- package/src/storage/buffered-file.ts +11 -11
- package/src/storage/s3-driver.ts +4 -1
- package/src/storage/uploaded-file.ts +8 -8
- package/src/stream/__tests__/ws-contracts.test.ts +4 -2
- package/src/stream/__tests__/ws-telemetry.test.ts +1 -1
- package/src/stream/__tests__/ws.test.ts +30 -6
- package/src/stream/sse.ts +12 -11
- package/src/stream/ws-core.ts +1 -1
- package/src/stream/ws-delivery.ts +16 -7
- package/src/stream/ws-local-connection-store.ts +2 -3
- package/src/stream/ws-presence-store.ts +6 -1
- package/src/stream/ws-registry.ts +16 -7
- package/src/stream/ws-telemetry.ts +66 -43
- package/src/stream/ws.ts +73 -39
- package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +3 -2
- package/src/syncer/__tests__/http-validator-registry.test.ts +137 -0
- package/src/syncer/api-parser.ts +67 -27
- package/src/syncer/checksum.ts +17 -11
- package/src/syncer/code-generator.ts +25 -17
- package/src/syncer/entity-operations.ts +3 -5
- package/src/syncer/file-copy.ts +46 -0
- package/src/syncer/file-patterns.ts +11 -8
- package/src/syncer/file-tracking.ts +3 -4
- package/src/syncer/filesystem-dependencies.ts +73 -0
- package/src/syncer/module-loader.ts +8 -4
- package/src/syncer/syncer-actions.ts +56 -18
- package/src/syncer/syncer.ts +116 -43
- package/src/syncer/watcher.ts +8 -4
- package/src/tasks/decorator.ts +20 -12
- package/src/tasks/step-wrapper.ts +19 -9
- package/src/tasks/workflow-manager.ts +15 -9
- package/src/template/__tests__/http_validators.template.test.ts +160 -0
- package/src/template/__tests__/services.template.mutation.test.ts +24 -23
- package/src/template/__tests__/services.template.websocket.test.ts +21 -25
- package/src/template/entity-converter.ts +5 -2
- package/src/template/helpers.ts +8 -9
- package/src/template/implementations/generated.template.ts +5 -4
- package/src/template/implementations/generated_http.template.ts +61 -15
- package/src/template/implementations/generated_sso.template.ts +15 -4
- package/src/template/implementations/http_validators.template.ts +175 -0
- package/src/template/implementations/model.template.ts +3 -1
- package/src/template/implementations/sd.template.ts +81 -41
- package/src/template/implementations/services.template.ts +2 -2
- package/src/template/implementations/view_form.template.ts +56 -39
- package/src/template/implementations/view_list.template.ts +31 -23
- package/src/template/template-manager.ts +15 -13
- package/src/template/template-types.ts +13 -5
- package/src/template/template.ts +4 -3
- package/src/template/zod-converter.ts +206 -91
- package/src/testing/__tests__/dev-test-routes.test.ts +85 -25
- package/src/testing/__tests__/dev-vitest-manager.test.ts +15 -15
- package/src/testing/_relation-graph.ts +4 -1
- package/src/testing/bootstrap.ts +12 -5
- package/src/testing/data-explorer.ts +102 -53
- package/src/testing/dev-test-routes.ts +87 -50
- package/src/testing/dev-vitest-manager.ts +88 -32
- package/src/testing/faker-mappings.ts +2 -2
- package/src/testing/filesystem.ts +1 -0
- package/src/testing/fixture-generator.ts +191 -131
- package/src/testing/fixture-loader.ts +5 -1
- package/src/testing/fixture-manager.ts +129 -90
- package/src/testing/global-setup.ts +7 -3
- package/src/testing/index.ts +5 -0
- package/src/types/__tests__/entity-json-schema-search-text.test.ts +9 -3
- package/src/types/types.ts +184 -158
- package/src/ui/ai-api.ts +9 -7
- package/src/ui/ai-client.ts +61 -56
- package/src/ui/api.ts +727 -616
- package/src/ui/async-route.ts +4 -0
- package/src/ui/cdd-service.ts +35 -12
- package/src/ui/migrations-api.ts +63 -51
- package/src/utils/formatter.ts +7 -3
- package/src/utils/fs-utils.ts +5 -5
- package/src/utils/model.ts +4 -5
- package/src/utils/object-utils.ts +32 -22
- package/src/utils/process-utils.ts +4 -1
- package/src/utils/runtime-value.ts +43 -0
- package/src/utils/sql-parser.ts +13 -6
- package/src/utils/type-utils.ts +9 -7
- package/src/utils/utils.ts +19 -21
- package/src/utils/zod-error.ts +4 -2
- package/src/vector/chunking.ts +6 -1
- package/src/vector/embedding.ts +2 -1
- package/src/vector/types.ts +4 -2
- package/tsdown.api.config.ts +5 -2
- package/dist/ui-web/assets/index-C0m1pk6K.js +0 -177
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-route.d.ts","sourceRoot":"","sources":["../../src/ui/async-route.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAE1F"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
|
+
//#region src/ui/async-route.ts
|
|
3
|
+
/** Fastify가 비동기 실패를 오류 처리기로 전달할 수 있도록 Promise를 반환합니다. */
|
|
4
|
+
function forwardAsyncErrors(handler) {
|
|
5
|
+
return Promise.resolve().then(handler);
|
|
6
|
+
}
|
|
7
|
+
var init_async_route = __esmMin((() => {}));
|
|
8
|
+
//#endregion
|
|
9
|
+
init_async_route();
|
|
10
|
+
export { forwardAsyncErrors, init_async_route };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtcm91dGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpL2FzeW5jLXJvdXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBGYXN0aWZ56rCAIOu5hOuPmeq4sCDsi6TtjKjrpbwg7Jik66WYIOyymOumrOq4sOuhnCDsoITri6ztlaAg7IiYIOyeiOuPhOuhnSBQcm9taXNl66W8IOuwmO2ZmO2VqeuLiOuLpC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkQXN5bmNFcnJvcnM8UmVzdWx0PihoYW5kbGVyOiAoKSA9PiBQcm9taXNlPFJlc3VsdD4pOiBQcm9taXNlPFJlc3VsdD4ge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihoYW5kbGVyKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsU0FBZ0IsbUJBQTJCLFNBQWlEO0NBQzFGLE9BQU8sUUFBUSxRQUFRLENBQUMsQ0FBQyxLQUFLLE9BQU87QUFDdkMifQ==
|
package/dist/ui/cdd-service.d.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { type CddAcListResult, type CddAddRuleRequest, type CddContentResult, type CddRuleDetail, type CddRuleSummary, type CddTreeNode } from "./cdd-types";
|
|
2
|
-
|
|
3
|
-
/** contract/ 디렉터리의 트리 구조를 반환 */
|
|
4
|
-
export declare function getCddTree(): {
|
|
2
|
+
interface CddTreeResult {
|
|
5
3
|
exists: boolean;
|
|
6
4
|
tree: CddTreeNode[];
|
|
7
|
-
}
|
|
5
|
+
}
|
|
6
|
+
interface CddRulesResult {
|
|
7
|
+
rules: CddRuleSummary[];
|
|
8
|
+
}
|
|
9
|
+
export type { CddAcEntry, CddAcFile, CddAcListResult, CddAddRuleRequest, CddContentResult, CddFileType, CddRuleDetail, CddRuleEntry, CddRuleSummary, CddTreeNode, } from "./cdd-types";
|
|
10
|
+
/** contract/ 디렉터리의 트리 구조를 반환 */
|
|
11
|
+
export declare function getCddTree(): CddTreeResult;
|
|
8
12
|
/** 파일 내용을 읽어 반환 (contract.md → markdown 원문, rules.json → JSON 문자열) */
|
|
9
13
|
export declare function readContent(filePath: string): CddContentResult;
|
|
10
14
|
/** 파일을 외부 에디터로 직접 편집 */
|
|
@@ -15,9 +19,7 @@ export declare function editContent(filePath: string): Promise<{
|
|
|
15
19
|
/** 소스 파일을 외부 에디터로 열기 (대기하지 않음) */
|
|
16
20
|
export declare function openSourceFile(filePath: string): void;
|
|
17
21
|
/** contract/rules/ 디렉터리 내 .rules.json 파일 목록 반환 */
|
|
18
|
-
export declare function listRules():
|
|
19
|
-
rules: CddRuleSummary[];
|
|
20
|
-
};
|
|
22
|
+
export declare function listRules(): CddRulesResult;
|
|
21
23
|
/** rules 파일 상세 반환 */
|
|
22
24
|
export declare function readRule(ruleKey: string): CddRuleDetail;
|
|
23
25
|
/** rules 파일에 규칙 추가 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdd-service.d.ts","sourceRoot":"","sources":["../../src/ui/cdd-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cdd-service.d.ts","sourceRoot":"","sources":["../../src/ui/cdd-service.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAErB,KAAK,aAAa,EAElB,KAAK,cAAc,EACnB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAErB,UAAU,aAAa;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,WAAW,EAAE,CAAC;CACrB;AASD,UAAU,cAAc;IACtB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,YAAY,EACV,UAAU,EACV,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,cAAc,EACd,WAAW,GACZ,MAAM,aAAa,CAAC;AAgErB,gCAAgC;AAChC,wBAAgB,UAAU,IAAI,aAAa,CAO1C;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAiB9D;AAED,wBAAwB;AACxB,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAcjD;AA0DD,kCAAkC;AAClC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAarD;AAMD,kDAAkD;AAClD,wBAAgB,SAAS,IAAI,cAAc,CAsC1C;AAED,qBAAqB;AACrB,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAmBvD;AAED,sBAAsB;AACtB,wBAAgB,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,aAAa,CAoC7D;AAyHD,yCAAyC;AACzC,wBAAgB,SAAS,IAAI,eAAe,CAkB3C"}
|
package/dist/ui/cdd-service.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { init_runtime_value, isStringValue } from "../utils/runtime-value.js";
|
|
2
3
|
import { Sonamu, init_sonamu } from "../api/sonamu.js";
|
|
3
4
|
import fs from "fs";
|
|
4
5
|
import path from "path";
|
|
@@ -91,7 +92,7 @@ async function editContent(filePath) {
|
|
|
91
92
|
function resolveEditorCli(options) {
|
|
92
93
|
const wait = options?.wait ?? true;
|
|
93
94
|
const appName = Sonamu.config.externalEditor ?? "Visual Studio Code";
|
|
94
|
-
const mapping = EDITOR_CLI_MAP[appName];
|
|
95
|
+
const mapping = Object.entries(EDITOR_CLI_MAP).find(([name]) => name === appName)?.[1];
|
|
95
96
|
if (!mapping) throw new Error(`지원되지 않는 에디터입니다: ${appName} (지원: ${Object.keys(EDITOR_CLI_MAP).join(", ")})`);
|
|
96
97
|
const bundlePath = [`/Applications/${appName}.app`, `${os.homedir()}/Applications/${appName}.app`].find((p) => fs.existsSync(p));
|
|
97
98
|
if (!bundlePath) throw new Error(`앱 번들을 찾을 수 없습니다: ${appName} (/Applications 확인)`);
|
|
@@ -143,7 +144,7 @@ function listRules() {
|
|
|
143
144
|
rules.push({
|
|
144
145
|
key,
|
|
145
146
|
path: relPath,
|
|
146
|
-
description:
|
|
147
|
+
description: isStringValue(doc.description) ? doc.description : "",
|
|
147
148
|
ruleCount: Array.isArray(doc.rules) ? doc.rules.length : 0
|
|
148
149
|
});
|
|
149
150
|
} catch (err) {
|
|
@@ -168,7 +169,7 @@ function readRule(ruleKey) {
|
|
|
168
169
|
return {
|
|
169
170
|
key: ruleKey,
|
|
170
171
|
path: `rules/${ruleKey}.rules.json`,
|
|
171
|
-
description:
|
|
172
|
+
description: isStringValue(doc.description) ? doc.description : "",
|
|
172
173
|
rules: Array.isArray(doc.rules) ? doc.rules : []
|
|
173
174
|
};
|
|
174
175
|
}
|
|
@@ -193,7 +194,7 @@ function addRule(req) {
|
|
|
193
194
|
return {
|
|
194
195
|
key: req.ruleKey,
|
|
195
196
|
path: `rules/${req.ruleKey}.rules.json`,
|
|
196
|
-
description:
|
|
197
|
+
description: isStringValue(doc.description) ? doc.description : "",
|
|
197
198
|
rules
|
|
198
199
|
};
|
|
199
200
|
}
|
|
@@ -352,6 +353,7 @@ function findTestFiles(dir) {
|
|
|
352
353
|
var EDITOR_CLI_MAP;
|
|
353
354
|
var init_cdd_service = __esmMin((() => {
|
|
354
355
|
init_sonamu();
|
|
356
|
+
init_runtime_value();
|
|
355
357
|
EDITOR_CLI_MAP = {
|
|
356
358
|
"Visual Studio Code": {
|
|
357
359
|
cli: "Contents/Resources/app/bin/code",
|
|
@@ -371,4 +373,4 @@ var init_cdd_service = __esmMin((() => {
|
|
|
371
373
|
init_cdd_service();
|
|
372
374
|
export { addRule, editContent, getAcList, getCddTree, init_cdd_service, listRules, openSourceFile, readContent, readRule };
|
|
373
375
|
|
|
374
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RkLXNlcnZpY2UuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpL2NkZC1zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQge1xuICB0eXBlIENkZEFjRW50cnksXG4gIHR5cGUgQ2RkQWNGaWxlLFxuICB0eXBlIENkZEFjTGlzdFJlc3VsdCxcbiAgdHlwZSBDZGRBZGRSdWxlUmVxdWVzdCxcbiAgdHlwZSBDZGRDb250ZW50UmVzdWx0LFxuICB0eXBlIENkZEZpbGVUeXBlLFxuICB0eXBlIENkZFJ1bGVEZXRhaWwsXG4gIHR5cGUgQ2RkUnVsZUVudHJ5LFxuICB0eXBlIENkZFJ1bGVTdW1tYXJ5LFxuICB0eXBlIENkZFRyZWVOb2RlLFxufSBmcm9tIFwiLi9jZGQtdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUge1xuICBDZGRBY0VudHJ5LFxuICBDZGRBY0ZpbGUsXG4gIENkZEFjTGlzdFJlc3VsdCxcbiAgQ2RkQWRkUnVsZVJlcXVlc3QsXG4gIENkZENvbnRlbnRSZXN1bHQsXG4gIENkZEZpbGVUeXBlLFxuICBDZGRSdWxlRGV0YWlsLFxuICBDZGRSdWxlRW50cnksXG4gIENkZFJ1bGVTdW1tYXJ5LFxuICBDZGRUcmVlTm9kZSxcbn0gZnJvbSBcIi4vY2RkLXR5cGVzXCI7XG5cbi8qKiBjb250cmFjdC8g65SU66CJ7YSw66asIOygiOuMgCDqsr3roZwg67CY7ZmYIChhcGlSb290UGF0aCDquLDspIApICovXG5mdW5jdGlvbiBnZXRDb250cmFjdERpcigpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCIuLlwiLCBcIi4uXCIsIFwiY29udHJhY3RcIik7XG59XG5cbi8qKiDtlITroZzsoJ3tirgg66Oo7Yq4IOqyveuhnCDrsJjtmZggKi9cbmZ1bmN0aW9uIGdldFByb2plY3RSb290KCk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcIi4uXCIsIFwiLi5cIik7XG59XG5cbi8qKiDqsr3roZzqsIAgY29udHJhY3QvIOuUlOugie2EsOumrCDrgrTrtoDsnbjsp4Ag6rKA7KadICovXG5mdW5jdGlvbiBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoY29udHJhY3REaXIsIGZpbGVQYXRoKTtcbiAgaWYgKCFyZXNvbHZlZC5zdGFydHNXaXRoKGNvbnRyYWN0RGlyICsgcGF0aC5zZXApICYmIHJlc29sdmVkICE9PSBjb250cmFjdERpcikge1xuICAgIHRocm93IG5ldyBFcnJvcihg6rK966Gc6rCAIGNvbnRyYWN0LyDrlJTroInthLDrpqwg67CW7J2EIOywuOyhsO2VqeuLiOuLpDogJHtmaWxlUGF0aH1gKTtcbiAgfVxufVxuXG4vKiog7YyM7J2866qF7JeQ7IScIENkZEZpbGVUeXBlIO2MkOuzhCAqL1xuZnVuY3Rpb24gZGV0ZWN0RmlsZVR5cGUoZmlsZU5hbWU6IHN0cmluZyk6IENkZEZpbGVUeXBlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKFwiLmNvbnRyYWN0Lm1kXCIpKSByZXR1cm4gXCJjb250cmFjdFwiO1xuICBpZiAoZmlsZU5hbWUuZW5kc1dpdGgoXCIucnVsZXMuanNvblwiKSkgcmV0dXJuIFwicnVsZXNcIjtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIOuUlOugie2EsOumrOulvCDsnqzqt4Ag7YOQ7IOJ7ZWY7JesIENkZFRyZWVOb2RlIO2KuOumrOulvCDsg53shLEgKi9cbmZ1bmN0aW9uIHNjYW5EaXJlY3RvcnkoZGlyUGF0aDogc3RyaW5nLCByZWxhdGl2ZVRvOiBzdHJpbmcpOiBDZGRUcmVlTm9kZVtdIHtcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgbm9kZXM6IENkZFRyZWVOb2RlW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICBjb25zdCByZWxQYXRoID0gcGF0aC5yZWxhdGl2ZShyZWxhdGl2ZVRvLCBmdWxsUGF0aCk7XG5cbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgaWYgKGVudHJ5Lm5hbWUgPT09IFwicnVsZXNcIikgY29udGludWU7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHNjYW5EaXJlY3RvcnkoZnVsbFBhdGgsIHJlbGF0aXZlVG8pO1xuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbm9kZXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICAgIHR5cGU6IFwiZGlyZWN0b3J5XCIsXG4gICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW50cnkuaXNGaWxlKCkpIHtcbiAgICAgIGNvbnN0IGZpbGVUeXBlID0gZGV0ZWN0RmlsZVR5cGUoZW50cnkubmFtZSk7XG4gICAgICBpZiAoZmlsZVR5cGUgJiYgZmlsZVR5cGUgIT09IFwicnVsZXNcIikge1xuICAgICAgICBub2Rlcy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgICAgIHBhdGg6IHJlbFBhdGgsXG4gICAgICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgICAgICAgZmlsZVR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub2Rlcztcbn1cblxuLyoqIGNvbnRyYWN0LyDrlJTroInthLDrpqzsnZgg7Yq466asIOq1rOyhsOulvCDrsJjtmZggKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDZGRUcmVlKCk6IHsgZXhpc3RzOiBib29sZWFuOyB0cmVlOiBDZGRUcmVlTm9kZVtdIH0ge1xuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb250cmFjdERpcikpIHtcbiAgICByZXR1cm4geyBleGlzdHM6IGZhbHNlLCB0cmVlOiBbXSB9O1xuICB9XG4gIGNvbnN0IHRyZWUgPSBzY2FuRGlyZWN0b3J5KGNvbnRyYWN0RGlyLCBjb250cmFjdERpcik7XG4gIHJldHVybiB7IGV4aXN0czogdHJ1ZSwgdHJlZSB9O1xufVxuXG4vKiog7YyM7J28IOuCtOyaqeydhCDsnb3slrQg67CY7ZmYIChjb250cmFjdC5tZCDihpIgbWFya2Rvd24g7JuQ66y4LCBydWxlcy5qc29uIOKGkiBKU09OIOusuOyekOyXtCkgKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQ29udGVudChmaWxlUGF0aDogc3RyaW5nKTogQ2RkQ29udGVudFJlc3VsdCB7XG4gIGFzc2VydEluc2lkZUNvbnRyYWN0RGlyKGZpbGVQYXRoKTtcblxuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLnJlc29sdmUoY29udHJhY3REaXIsIGZpbGVQYXRoKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYO2MjOydvOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtmaWxlUGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoYWJzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgY29uc3QgZmlsZVR5cGUgPSBkZXRlY3RGaWxlVHlwZShwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBjb250ZW50LFxuICAgIGZpbGVUeXBlOiBmaWxlVHlwZSA/PyBcImNvbnRyYWN0XCIsXG4gIH07XG59XG5cbi8qKiDtjIzsnbzsnYQg7Jm467aAIOyXkOuUlO2EsOuhnCDsp4HsoJEg7Y647KeRICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdENvbnRlbnQoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgZmlsZVBhdGg6IHN0cmluZyB9PiB7XG4gIGFzc2VydEluc2lkZUNvbnRyYWN0RGlyKGZpbGVQYXRoKTtcblxuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLnJlc29sdmUoY29udHJhY3REaXIsIGZpbGVQYXRoKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYO2MjOydvOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtmaWxlUGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IGVkaXRvciA9IHJlc29sdmVFZGl0b3JDbGkoKTtcbiAgYXdhaXQgcnVuRWRpdG9yKGVkaXRvciwgYWJzUGF0aCk7XG5cbiAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZmlsZVBhdGggfTtcbn1cblxuLyoqIOyXkOuUlO2EsOuzhCDslbEg67KI65OkIOuCtCBDTEkg6rK966GcICsgLS13YWl0IO2UjOuemOq3uCDrp6TtlZEgKi9cbmNvbnN0IEVESVRPUl9DTElfTUFQOiBSZWNvcmQ8c3RyaW5nLCB7IGNsaTogc3RyaW5nOyB3YWl0RmxhZzogc3RyaW5nIH0+ID0ge1xuICBcIlZpc3VhbCBTdHVkaW8gQ29kZVwiOiB7IGNsaTogXCJDb250ZW50cy9SZXNvdXJjZXMvYXBwL2Jpbi9jb2RlXCIsIHdhaXRGbGFnOiBcIi0td2FpdFwiIH0sXG4gIFplZDogeyBjbGk6IFwiQ29udGVudHMvTWFjT1MvY2xpXCIsIHdhaXRGbGFnOiBcIi0td2FpdFwiIH0sXG4gIEN1cnNvcjogeyBjbGk6IFwiQ29udGVudHMvUmVzb3VyY2VzL2FwcC9iaW4vY3Vyc29yXCIsIHdhaXRGbGFnOiBcIi0td2FpdFwiIH0sXG59O1xuXG4vKiog7JWxIOuyiOuTpCBDTEkg6rK966Gc66W8IHJlc29sdmUuIHdhaXQ9ZmFsc2XsnbTrqbQgLS13YWl0IO2UjOuemOq3uOulvCDsg53rnrUgKi9cbmZ1bmN0aW9uIHJlc29sdmVFZGl0b3JDbGkob3B0aW9ucz86IHsgd2FpdD86IGJvb2xlYW4gfSk6IHsgYmluOiBzdHJpbmc7IGFyZ3M6IHN0cmluZ1tdIH0ge1xuICBjb25zdCB3YWl0ID0gb3B0aW9ucz8ud2FpdCA/PyB0cnVlO1xuICBjb25zdCBhcHBOYW1lID0gU29uYW11LmNvbmZpZy5leHRlcm5hbEVkaXRvciA/PyBcIlZpc3VhbCBTdHVkaW8gQ29kZVwiO1xuICBjb25zdCBtYXBwaW5nID0gRURJVE9SX0NMSV9NQVBbYXBwTmFtZV07XG4gIGlmICghbWFwcGluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGDsp4Dsm5DrkJjsp4Ag7JWK64qUIOyXkOuUlO2EsOyeheuLiOuLpDogJHthcHBOYW1lfSAo7KeA7JuQOiAke09iamVjdC5rZXlzKEVESVRPUl9DTElfTUFQKS5qb2luKFwiLCBcIil9KWAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNlYXJjaFBhdGhzID0gW1xuICAgIGAvQXBwbGljYXRpb25zLyR7YXBwTmFtZX0uYXBwYCxcbiAgICBgJHtvcy5ob21lZGlyKCl9L0FwcGxpY2F0aW9ucy8ke2FwcE5hbWV9LmFwcGAsXG4gIF07XG4gIGNvbnN0IGJ1bmRsZVBhdGggPSBzZWFyY2hQYXRocy5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgaWYgKCFidW5kbGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDslbEg67KI65Ok7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2FwcE5hbWV9ICgvQXBwbGljYXRpb25zIO2ZleyduClgKTtcbiAgfVxuXG4gIGNvbnN0IGNsaUJpbiA9IHBhdGguam9pbihidW5kbGVQYXRoLCBtYXBwaW5nLmNsaSk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjbGlCaW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDsl5DrlJTthLAgQ0xJ66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2NsaUJpbn1gKTtcbiAgfVxuXG4gIHJldHVybiB7IGJpbjogY2xpQmluLCBhcmdzOiB3YWl0ID8gW21hcHBpbmcud2FpdEZsYWddIDogW10gfTtcbn1cblxuLyoqIOyXkOuUlO2EsCBDTEnrpbwg7Iuk7ZaJ7ZWY6rOgIO2DreydtCDri6vtnpAg65WM6rmM7KeAIOuMgOq4sCAqL1xuZnVuY3Rpb24gcnVuRWRpdG9yKGVkaXRvcjogeyBiaW46IHN0cmluZzsgYXJnczogc3RyaW5nW10gfSwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oZWRpdG9yLmJpbiwgWy4uLmVkaXRvci5hcmdzLCBmaWxlUGF0aF0sIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihg7JeQ65SU7YSwIOyLpO2WiSDsi6TtjKggKCR7ZWRpdG9yLmJpbn0pOiAke2Vyci5tZXNzYWdlfWApKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKGNvZGUpID0+IHtcbiAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYOyXkOuUlO2EsOqwgCDruYTsoJXsg4Eg7KKF66OM65CY7JeI7Iq164uI64ukIChleGl0IGNvZGU6ICR7Y29kZX0pYCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqIOyGjOyKpCDtjIzsnbzsnYQg7Jm467aAIOyXkOuUlO2EsOuhnCDsl7TquLAgKOuMgOq4sO2VmOyngCDslYrsnYwpICovXG5leHBvcnQgZnVuY3Rpb24gb3BlblNvdXJjZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5pc0Fic29sdXRlKGZpbGVQYXRoKSA/IGZpbGVQYXRoIDogcGF0aC5yZXNvbHZlKFNvbmFtdS5hcGlSb290UGF0aCwgZmlsZVBhdGgpO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnNQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7YyM7J287J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgY29uc3QgZWRpdG9yID0gcmVzb2x2ZUVkaXRvckNsaSh7IHdhaXQ6IGZhbHNlIH0pO1xuICBjb25zdCBjaGlsZCA9IHNwYXduKGVkaXRvci5iaW4sIFsuLi5lZGl0b3IuYXJncywgYWJzUGF0aF0sIHtcbiAgICBzdGRpbzogXCJpZ25vcmVcIixcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgfSk7XG4gIGNoaWxkLnVucmVmKCk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUnVsZXMgQVBJXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqIGNvbnRyYWN0L3J1bGVzLyDrlJTroInthLDrpqwg64K0IC5ydWxlcy5qc29uIO2MjOydvCDrqqnroZ0g67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdFJ1bGVzKCk6IHsgcnVsZXM6IENkZFJ1bGVTdW1tYXJ5W10gfSB7XG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgcnVsZXNEaXIgPSBwYXRoLmpvaW4oY29udHJhY3REaXIsIFwicnVsZXNcIik7XG4gIGlmICghZnMuZXhpc3RzU3luYyhydWxlc0RpcikpIHJldHVybiB7IHJ1bGVzOiBbXSB9O1xuXG4gIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhydWxlc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCBydWxlczogQ2RkUnVsZVN1bW1hcnlbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIWVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIucnVsZXMuanNvblwiKSkgY29udGludWU7XG5cbiAgICBjb25zdCBrZXkgPSBlbnRyeS5uYW1lLnJlcGxhY2UoL1xcLnJ1bGVzXFwuanNvbiQvLCBcIlwiKTtcbiAgICBjb25zdCByZWxQYXRoID0gYHJ1bGVzLyR7ZW50cnkubmFtZX1gO1xuICAgIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4ocnVsZXNEaXIsIGVudHJ5Lm5hbWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IGZzLnJlYWRGaWxlU3luYyhhYnNQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgY29uc3QgZG9jID0gSlNPTi5wYXJzZShyYXcpIGFzIHsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IHJ1bGVzPzogdW5rbm93bltdIH07XG4gICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAga2V5LFxuICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICBkZXNjcmlwdGlvbjogdHlwZW9mIGRvYy5kZXNjcmlwdGlvbiA9PT0gXCJzdHJpbmdcIiA/IGRvYy5kZXNjcmlwdGlvbiA6IFwiXCIsXG4gICAgICAgIHJ1bGVDb3VudDogQXJyYXkuaXNBcnJheShkb2MucnVsZXMpID8gZG9jLnJ1bGVzLmxlbmd0aCA6IDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIHBhdGg6IHJlbFBhdGgsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlwiLFxuICAgICAgICBydWxlQ291bnQ6IDAsXG4gICAgICAgIHBhcnNlRXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHJ1bGVzIH07XG59XG5cbi8qKiBydWxlcyDtjIzsnbwg7IOB7IS4IOuwmO2ZmCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRSdWxlKHJ1bGVLZXk6IHN0cmluZyk6IENkZFJ1bGVEZXRhaWwge1xuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4oY29udHJhY3REaXIsIFwicnVsZXNcIiwgYCR7cnVsZUtleX0ucnVsZXMuanNvbmApO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnNQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUnVsZXMg7YyM7J287J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke3J1bGVLZXl9YCk7XG4gIH1cblxuICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMoYWJzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgY29uc3QgZG9jID0gSlNPTi5wYXJzZShyYXcpIGFzIHsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IHJ1bGVzPzogQ2RkUnVsZUVudHJ5W10gfTtcblxuICByZXR1cm4ge1xuICAgIGtleTogcnVsZUtleSxcbiAgICBwYXRoOiBgcnVsZXMvJHtydWxlS2V5fS5ydWxlcy5qc29uYCxcbiAgICBkZXNjcmlwdGlvbjogdHlwZW9mIGRvYy5kZXNjcmlwdGlvbiA9PT0gXCJzdHJpbmdcIiA/IGRvYy5kZXNjcmlwdGlvbiA6IFwiXCIsXG4gICAgcnVsZXM6IEFycmF5LmlzQXJyYXkoZG9jLnJ1bGVzKSA/IGRvYy5ydWxlcyA6IFtdLFxuICB9O1xufVxuXG4vKiogcnVsZXMg7YyM7J287JeQIOq3nOy5mSDstpTqsIAgKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRSdWxlKHJlcTogQ2RkQWRkUnVsZVJlcXVlc3QpOiBDZGRSdWxlRGV0YWlsIHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBydWxlc0RpciA9IHBhdGguam9pbihjb250cmFjdERpciwgXCJydWxlc1wiKTtcbiAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbihydWxlc0RpciwgYCR7cmVxLnJ1bGVLZXl9LnJ1bGVzLmpzb25gKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJ1bGVzIO2MjOydvOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtyZXEucnVsZUtleX1gKTtcbiAgfVxuXG4gIGNvbnN0IHJhdyA9IGZzLnJlYWRGaWxlU3luYyhhYnNQYXRoLCBcInV0Zi04XCIpO1xuICBjb25zdCBkb2MgPSBKU09OLnBhcnNlKHJhdykgYXMgeyBkZXNjcmlwdGlvbj86IHN0cmluZzsgcnVsZXM/OiBDZGRSdWxlRW50cnlbXSB9O1xuICBjb25zdCBydWxlczogQ2RkUnVsZUVudHJ5W10gPSBBcnJheS5pc0FycmF5KGRvYy5ydWxlcykgPyBkb2MucnVsZXMgOiBbXTtcblxuICBjb25zdCBuZXh0SWQgPSBnZW5lcmF0ZU5leHRSdWxlSWQocnVsZXMpO1xuICBjb25zdCBuZXdFbnRyeTogQ2RkUnVsZUVudHJ5ID0ge1xuICAgIGlkOiBuZXh0SWQsXG4gICAgd2hlbjogcmVxLndoZW4sXG4gICAgaW5zdHJ1Y3Rpb246IHJlcS5pbnN0cnVjdGlvbixcbiAgfTtcbiAgaWYgKHJlcS5leGFtcGxlcyAmJiByZXEuZXhhbXBsZXMubGVuZ3RoID4gMCkge1xuICAgIG5ld0VudHJ5LmV4YW1wbGVzID0gcmVxLmV4YW1wbGVzO1xuICB9XG5cbiAgcnVsZXMucHVzaChuZXdFbnRyeSk7XG4gIGRvYy5ydWxlcyA9IHJ1bGVzO1xuXG4gIGZzLndyaXRlRmlsZVN5bmMoYWJzUGF0aCwgYCR7SlNPTi5zdHJpbmdpZnkoZG9jLCBudWxsLCAyKX1cXG5gLCBcInV0Zi04XCIpO1xuXG4gIHJldHVybiB7XG4gICAga2V5OiByZXEucnVsZUtleSxcbiAgICBwYXRoOiBgcnVsZXMvJHtyZXEucnVsZUtleX0ucnVsZXMuanNvbmAsXG4gICAgZGVzY3JpcHRpb246IHR5cGVvZiBkb2MuZGVzY3JpcHRpb24gPT09IFwic3RyaW5nXCIgPyBkb2MuZGVzY3JpcHRpb24gOiBcIlwiLFxuICAgIHJ1bGVzLFxuICB9O1xufVxuXG4vKiog6riw7KG0IGlkIO2MqO2EtOydhCDrtoTshJ3tlZjsl6wg64uk7J2MIOyInOuyiCBpZCDsg53shLEgKi9cbmZ1bmN0aW9uIGdlbmVyYXRlTmV4dFJ1bGVJZChydWxlczogQ2RkUnVsZUVudHJ5W10pOiBzdHJpbmcge1xuICBpZiAocnVsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJSLTAwMVwiO1xuXG4gIGNvbnN0IG51bWVyaWNQYXR0ZXJuID0gL14oLis/KShcXGQrKSQvO1xuICBsZXQgYmVzdFByZWZpeCA9IFwiUi1cIjtcbiAgbGV0IG1heE51bSA9IDA7XG5cbiAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBudW1lcmljUGF0dGVybi5leGVjKHJ1bGUuaWQpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgY29uc3QgcHJlZml4ID0gbWF0Y2hbMV07XG4gICAgICBjb25zdCBudW0gPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMl0sIDEwKTtcbiAgICAgIGlmIChudW0gPiBtYXhOdW0pIHtcbiAgICAgICAgYmVzdFByZWZpeCA9IHByZWZpeDtcbiAgICAgICAgbWF4TnVtID0gbnVtO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG5leHROdW0gPSBtYXhOdW0gKyAxO1xuICBjb25zdCBwYWRMZW4gPSBNYXRoLm1heCgzLCBTdHJpbmcobWF4TnVtKS5sZW5ndGgpO1xuICByZXR1cm4gYCR7YmVzdFByZWZpeH0ke1N0cmluZyhuZXh0TnVtKS5wYWRTdGFydChwYWRMZW4sIFwiMFwiKX1gO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEFDIEFQSSAobW9kdWxlcy9jZGQgYWMtbGlzdCDtjIzsi7Eg66Gc7KeBIOuzteyCrClcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKiogZGVzY3JpYmUvdGVzdCDtjKjthLQg7YyM7IuxICovXG5mdW5jdGlvbiBwYXJzZUFjRW50cmllcyhjb250ZW50OiBzdHJpbmcpOiBDZGRBY0VudHJ5W10ge1xuICBjb25zdCBlbnRyaWVzOiBDZGRBY0VudHJ5W10gPSBbXTtcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpO1xuXG4gIGxldCBjdXJyZW50RGVzY3JpYmU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBsZXQgZGVzY3JpYmVEZXB0aCA9IDA7XG4gIGxldCBicmFjZURlcHRoID0gMDtcbiAgbGV0IHBlbmRpbmdUZXN0QXMgPSBmYWxzZTtcbiAgbGV0IHRlc3RBc0JyYWNlRGVwdGggPSAwO1xuICBsZXQgdGVzdEFzTmVlZE5hbWUgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG5cbiAgICBjb25zdCBkZXNjcmliZU1hdGNoID0gdHJpbW1lZC5tYXRjaCgvXmRlc2NyaWJlXFwoW1wiJ2BdKC4rPylbXCInYF0vKTtcbiAgICBpZiAoZGVzY3JpYmVNYXRjaCkge1xuICAgICAgY3VycmVudERlc2NyaWJlID0gZGVzY3JpYmVNYXRjaFsxXTtcbiAgICAgIGRlc2NyaWJlRGVwdGggPSBicmFjZURlcHRoO1xuICAgIH1cblxuICAgIGNvbnN0IHRlc3RNYXRjaCA9IHRyaW1tZWQubWF0Y2goL14oPzp0ZXN0fGl0KVxcKFtcIidgXSguKz8pW1wiJ2BdLyk7XG4gICAgaWYgKHRlc3RNYXRjaCkge1xuICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgZGVzY3JpYmU6IGN1cnJlbnREZXNjcmliZSxcbiAgICAgICAgdGVzdDogdGVzdE1hdGNoWzFdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFwZW5kaW5nVGVzdEFzICYmIHRyaW1tZWQubWF0Y2goL150ZXN0QXNcXHMqXFwoLykpIHtcbiAgICAgIGNvbnN0IGlubGluZU1hdGNoID0gdHJpbW1lZC5tYXRjaCgvXnRlc3RBc1xccypcXChcXHMqXFx7W159XSpcXH1cXHMqLFxccypbXCInYF0oLis/KVtcIidgXS8pO1xuICAgICAgaWYgKGlubGluZU1hdGNoKSB7XG4gICAgICAgIGVudHJpZXMucHVzaCh7IGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsIHRlc3Q6IGlubGluZU1hdGNoWzFdIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVuZGluZ1Rlc3RBcyA9IHRydWU7XG4gICAgICAgIHRlc3RBc0JyYWNlRGVwdGggPSAwO1xuICAgICAgICB0ZXN0QXNOZWVkTmFtZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRyaW1tZWQpIHtcbiAgICAgICAgICBpZiAoY2ggPT09IFwie1wiKSB0ZXN0QXNCcmFjZURlcHRoKys7XG4gICAgICAgICAgaWYgKGNoID09PSBcIn1cIikgdGVzdEFzQnJhY2VEZXB0aC0tO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXN0QXNCcmFjZURlcHRoIDw9IDApIHtcbiAgICAgICAgICB0ZXN0QXNOZWVkTmFtZSA9IHRydWU7XG4gICAgICAgICAgY29uc3QgbmFtZU1hdGNoID0gdHJpbW1lZC5tYXRjaCgvfVxccyosXFxzKltcIidgXSguKz8pW1wiJ2BdLyk7XG4gICAgICAgICAgaWYgKG5hbWVNYXRjaCkge1xuICAgICAgICAgICAgZW50cmllcy5wdXNoKHsgZGVzY3JpYmU6IGN1cnJlbnREZXNjcmliZSwgdGVzdDogbmFtZU1hdGNoWzFdIH0pO1xuICAgICAgICAgICAgcGVuZGluZ1Rlc3RBcyA9IGZhbHNlO1xuICAgICAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBlbmRpbmdUZXN0QXMpIHtcbiAgICAgIGlmICghdGVzdEFzTmVlZE5hbWUpIHtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0cmltbWVkKSB7XG4gICAgICAgICAgaWYgKGNoID09PSBcIntcIikgdGVzdEFzQnJhY2VEZXB0aCsrO1xuICAgICAgICAgIGlmIChjaCA9PT0gXCJ9XCIpIHRlc3RBc0JyYWNlRGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGVzdEFzQnJhY2VEZXB0aCA8PSAwKSB7XG4gICAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IG5hbWVNYXRjaCA9IHRyaW1tZWQubWF0Y2goL31cXHMqLFxccypbXCInYF0oLis/KVtcIidgXS8pO1xuICAgICAgICAgIGlmIChuYW1lTWF0Y2gpIHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaCh7IGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsIHRlc3Q6IG5hbWVNYXRjaFsxXSB9KTtcbiAgICAgICAgICAgIHBlbmRpbmdUZXN0QXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRlc3RBc05lZWROYW1lID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuYW1lTWF0Y2ggPSB0cmltbWVkLm1hdGNoKC9eW1wiJ2BdKC4rPylbXCInYF0vKTtcbiAgICAgICAgaWYgKG5hbWVNYXRjaCkge1xuICAgICAgICAgIGVudHJpZXMucHVzaCh7IGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsIHRlc3Q6IG5hbWVNYXRjaFsxXSB9KTtcbiAgICAgICAgICBwZW5kaW5nVGVzdEFzID0gZmFsc2U7XG4gICAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2ggb2YgdHJpbW1lZCkge1xuICAgICAgaWYgKGNoID09PSBcIntcIikgYnJhY2VEZXB0aCsrO1xuICAgICAgaWYgKGNoID09PSBcIn1cIikge1xuICAgICAgICBicmFjZURlcHRoLS07XG4gICAgICAgIGlmIChjdXJyZW50RGVzY3JpYmUgJiYgYnJhY2VEZXB0aCA8PSBkZXNjcmliZURlcHRoKSB7XG4gICAgICAgICAgY3VycmVudERlc2NyaWJlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKiog7ZSE66Gc7KCd7Yq4IOuCtCAqLnRlc3QudHMg7YyM7J287J2EIOyKpOy6lO2VmOyXrCBBQyDrqqnroZ0g67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWNMaXN0KCk6IENkZEFjTGlzdFJlc3VsdCB7XG4gIGNvbnN0IHByb2plY3RSb290ID0gZ2V0UHJvamVjdFJvb3QoKTtcbiAgY29uc3QgZmlsZXMgPSBmaW5kVGVzdEZpbGVzKHByb2plY3RSb290KTtcblxuICBjb25zdCBhY0ZpbGVzOiBDZGRBY0ZpbGVbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGFic1BhdGggb2YgZmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3QgZW50cmllcyA9IHBhcnNlQWNFbnRyaWVzKGNvbnRlbnQpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGFjRmlsZXMucHVzaCh7XG4gICAgICAgIHBhdGg6IHBhdGgucmVsYXRpdmUocHJvamVjdFJvb3QsIGFic1BhdGgpLFxuICAgICAgICBlbnRyaWVzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdG90YWwgPSBhY0ZpbGVzLnJlZHVjZSgoc3VtLCBmKSA9PiBzdW0gKyBmLmVudHJpZXMubGVuZ3RoLCAwKTtcbiAgcmV0dXJuIHsgZmlsZXM6IGFjRmlsZXMsIHRvdGFsIH07XG59XG5cbi8qKiAqLnRlc3QudHMg7YyM7J287J2EIOyerOq3gCDtg5Dsg4kgKG5vZGVfbW9kdWxlcywgZGlzdCDsoJzsmbgpICovXG5mdW5jdGlvbiBmaW5kVGVzdEZpbGVzKGRpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCByZXN1bHRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBJR05PUkUgPSBuZXcgU2V0KFtcIm5vZGVfbW9kdWxlc1wiLCBcImRpc3RcIiwgXCIuZ2l0XCIsIFwiY29udHJhY3RcIl0pO1xuXG4gIGZ1bmN0aW9uIHdhbGsoY3VycmVudERpcjogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IGVudHJpZXM6IGZzLkRpcmVudFtdO1xuICAgIHRyeSB7XG4gICAgICBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoY3VycmVudERpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmIChJR05PUkUuaGFzKGVudHJ5Lm5hbWUpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsIGVudHJ5Lm5hbWUpO1xuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgd2FsayhmdWxsUGF0aCk7XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIudGVzdC50c1wiKSkge1xuICAgICAgICByZXN1bHRzLnB1c2goZnVsbFBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHdhbGsoZGlyKTtcbiAgcmVzdWx0cy5zb3J0KCk7XG4gIHJldHVybiByZXN1bHRzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQWlDQSxTQUFTLGlCQUF5QjtDQUNoQyxPQUFPLEtBQUssS0FBSyxPQUFPLGFBQWEsTUFBTSxNQUFNLFVBQVU7QUFDN0Q7O0FBR0EsU0FBUyxpQkFBeUI7Q0FDaEMsT0FBTyxLQUFLLEtBQUssT0FBTyxhQUFhLE1BQU0sSUFBSTtBQUNqRDs7QUFHQSxTQUFTLHdCQUF3QixVQUF3QjtDQUN2RCxNQUFNLGNBQWMsZUFBZTtDQUNuQyxNQUFNLFdBQVcsS0FBSyxRQUFRLGFBQWEsUUFBUTtDQUNuRCxJQUFJLENBQUMsU0FBUyxXQUFXLGNBQWMsS0FBSyxHQUFHLEtBQUssYUFBYSxhQUMvRCxNQUFNLElBQUksTUFBTSxnQ0FBZ0MsVUFBVTtBQUU5RDs7QUFHQSxTQUFTLGVBQWUsVUFBMkM7Q0FDakUsSUFBSSxTQUFTLFNBQVMsY0FBYyxHQUFHLE9BQU87Q0FDOUMsSUFBSSxTQUFTLFNBQVMsYUFBYSxHQUFHLE9BQU87QUFFL0M7O0FBR0EsU0FBUyxjQUFjLFNBQWlCLFlBQW1DO0NBQ3pFLE1BQU0sVUFBVSxHQUFHLFlBQVksU0FBUyxFQUFFLGVBQWUsS0FBSyxDQUFDO0NBQy9ELE1BQU0sUUFBdUIsQ0FBQztDQUU5QixLQUFLLE1BQU0sU0FBUyxTQUFTO0VBQzNCLE1BQU0sV0FBVyxLQUFLLEtBQUssU0FBUyxNQUFNLElBQUk7RUFDOUMsTUFBTSxVQUFVLEtBQUssU0FBUyxZQUFZLFFBQVE7RUFFbEQsSUFBSSxNQUFNLFlBQVksR0FBRztHQUN2QixJQUFJLE1BQU0s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
|
|
376
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RkLXNlcnZpY2UuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpL2NkZC1zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBpc1N0cmluZ1ZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ2RkQWNFbnRyeSxcbiAgdHlwZSBDZGRBY0ZpbGUsXG4gIHR5cGUgQ2RkQWNMaXN0UmVzdWx0LFxuICB0eXBlIENkZEFkZFJ1bGVSZXF1ZXN0LFxuICB0eXBlIENkZENvbnRlbnRSZXN1bHQsXG4gIHR5cGUgQ2RkRmlsZVR5cGUsXG4gIHR5cGUgQ2RkUnVsZURldGFpbCxcbiAgdHlwZSBDZGRSdWxlRW50cnksXG4gIHR5cGUgQ2RkUnVsZVN1bW1hcnksXG4gIHR5cGUgQ2RkVHJlZU5vZGUsXG59IGZyb20gXCIuL2NkZC10eXBlc1wiO1xuXG5pbnRlcmZhY2UgQ2RkVHJlZVJlc3VsdCB7XG4gIGV4aXN0czogYm9vbGVhbjtcbiAgdHJlZTogQ2RkVHJlZU5vZGVbXTtcbn1cbmludGVyZmFjZSBFZGl0b3JDbGlDb25maWcge1xuICBjbGk6IHN0cmluZztcbiAgd2FpdEZsYWc6IHN0cmluZztcbn1cbmludGVyZmFjZSBFZGl0b3JDbGlSZXNvbHV0aW9uIHtcbiAgYmluOiBzdHJpbmc7XG4gIGFyZ3M6IHN0cmluZ1tdO1xufVxuaW50ZXJmYWNlIENkZFJ1bGVzUmVzdWx0IHtcbiAgcnVsZXM6IENkZFJ1bGVTdW1tYXJ5W107XG59XG5cbmV4cG9ydCB0eXBlIHtcbiAgQ2RkQWNFbnRyeSxcbiAgQ2RkQWNGaWxlLFxuICBDZGRBY0xpc3RSZXN1bHQsXG4gIENkZEFkZFJ1bGVSZXF1ZXN0LFxuICBDZGRDb250ZW50UmVzdWx0LFxuICBDZGRGaWxlVHlwZSxcbiAgQ2RkUnVsZURldGFpbCxcbiAgQ2RkUnVsZUVudHJ5LFxuICBDZGRSdWxlU3VtbWFyeSxcbiAgQ2RkVHJlZU5vZGUsXG59IGZyb20gXCIuL2NkZC10eXBlc1wiO1xuXG4vKiogY29udHJhY3QvIOuUlOugie2EsOumrCDsoIjrjIAg6rK966GcIOuwmO2ZmCAoYXBpUm9vdFBhdGgg6riw7KSAKSAqL1xuZnVuY3Rpb24gZ2V0Q29udHJhY3REaXIoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwiLi5cIiwgXCIuLlwiLCBcImNvbnRyYWN0XCIpO1xufVxuXG4vKiog7ZSE66Gc7KCd7Yq4IOujqO2KuCDqsr3roZwg67CY7ZmYICovXG5mdW5jdGlvbiBnZXRQcm9qZWN0Um9vdCgpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCIuLlwiLCBcIi4uXCIpO1xufVxuXG4vKiog6rK966Gc6rCAIGNvbnRyYWN0LyDrlJTroInthLDrpqwg64K067aA7J247KeAIOqygOymnSAqL1xuZnVuY3Rpb24gYXNzZXJ0SW5zaWRlQ29udHJhY3REaXIoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGNvbnN0IHJlc29sdmVkID0gcGF0aC5yZXNvbHZlKGNvbnRyYWN0RGlyLCBmaWxlUGF0aCk7XG4gIGlmICghcmVzb2x2ZWQuc3RhcnRzV2l0aChjb250cmFjdERpciArIHBhdGguc2VwKSAmJiByZXNvbHZlZCAhPT0gY29udHJhY3REaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOqyveuhnOqwgCBjb250cmFjdC8g65SU66CJ7YSw66asIOuwluydhCDssLjsobDtlanri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cbn1cblxuLyoqIO2MjOydvOuqheyXkOyEnCBDZGRGaWxlVHlwZSDtjJDrs4QgKi9cbmZ1bmN0aW9uIGRldGVjdEZpbGVUeXBlKGZpbGVOYW1lOiBzdHJpbmcpOiBDZGRGaWxlVHlwZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChmaWxlTmFtZS5lbmRzV2l0aChcIi5jb250cmFjdC5tZFwiKSkgcmV0dXJuIFwiY29udHJhY3RcIjtcbiAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKFwiLnJ1bGVzLmpzb25cIikpIHJldHVybiBcInJ1bGVzXCI7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiDrlJTroInthLDrpqzrpbwg7J6s6reAIO2DkOyDie2VmOyXrCBDZGRUcmVlTm9kZSDtirjrpqzrpbwg7IOd7ISxICovXG5mdW5jdGlvbiBzY2FuRGlyZWN0b3J5KGRpclBhdGg6IHN0cmluZywgcmVsYXRpdmVUbzogc3RyaW5nKTogQ2RkVHJlZU5vZGVbXSB7XG4gIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IG5vZGVzOiBDZGRUcmVlTm9kZVtdID0gW107XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZW50cnkubmFtZSk7XG4gICAgY29uc3QgcmVsUGF0aCA9IHBhdGgucmVsYXRpdmUocmVsYXRpdmVUbywgZnVsbFBhdGgpO1xuXG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGlmIChlbnRyeS5uYW1lID09PSBcInJ1bGVzXCIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBzY2FuRGlyZWN0b3J5KGZ1bGxQYXRoLCByZWxhdGl2ZVRvKTtcbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5vZGVzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICAgICAgcGF0aDogcmVsUGF0aCxcbiAgICAgICAgICB0eXBlOiBcImRpcmVjdG9yeVwiLFxuICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpKSB7XG4gICAgICBjb25zdCBmaWxlVHlwZSA9IGRldGVjdEZpbGVUeXBlKGVudHJ5Lm5hbWUpO1xuICAgICAgaWYgKGZpbGVUeXBlICYmIGZpbGVUeXBlICE9PSBcInJ1bGVzXCIpIHtcbiAgICAgICAgbm9kZXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICAgIGZpbGVUeXBlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZXM7XG59XG5cbi8qKiBjb250cmFjdC8g65SU66CJ7YSw66as7J2YIO2KuOumrCDqtazsobDrpbwg67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2RkVHJlZSgpOiBDZGRUcmVlUmVzdWx0IHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29udHJhY3REaXIpKSB7XG4gICAgcmV0dXJuIHsgZXhpc3RzOiBmYWxzZSwgdHJlZTogW10gfTtcbiAgfVxuICBjb25zdCB0cmVlID0gc2NhbkRpcmVjdG9yeShjb250cmFjdERpciwgY29udHJhY3REaXIpO1xuICByZXR1cm4geyBleGlzdHM6IHRydWUsIHRyZWUgfTtcbn1cblxuLyoqIO2MjOydvCDrgrTsmqnsnYQg7J297Ja0IOuwmO2ZmCAoY29udHJhY3QubWQg4oaSIG1hcmtkb3duIOybkOusuCwgcnVsZXMuanNvbiDihpIgSlNPTiDrrLjsnpDsl7QpICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZENvbnRlbnQoZmlsZVBhdGg6IHN0cmluZyk6IENkZENvbnRlbnRSZXN1bHQge1xuICBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aCk7XG5cbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbnRyYWN0RGlyLCBmaWxlUGF0aCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gIGNvbnN0IGZpbGVUeXBlID0gZGV0ZWN0RmlsZVR5cGUocGF0aC5iYXNlbmFtZShmaWxlUGF0aCkpO1xuXG4gIHJldHVybiB7XG4gICAgY29udGVudCxcbiAgICBmaWxlVHlwZTogZmlsZVR5cGUgPz8gXCJjb250cmFjdFwiLFxuICB9O1xufVxuXG4vKiog7YyM7J287J2EIOyZuOu2gCDsl5DrlJTthLDroZwg7KeB7KCRIO2OuOynkSAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRDb250ZW50KFxuICBmaWxlUGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IGZpbGVQYXRoOiBzdHJpbmcgfT4ge1xuICBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aCk7XG5cbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbnRyYWN0RGlyLCBmaWxlUGF0aCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBlZGl0b3IgPSByZXNvbHZlRWRpdG9yQ2xpKCk7XG4gIGF3YWl0IHJ1bkVkaXRvcihlZGl0b3IsIGFic1BhdGgpO1xuXG4gIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGZpbGVQYXRoIH07XG59XG5cbi8qKiDsl5DrlJTthLDrs4Qg7JWxIOuyiOuTpCDrgrQgQ0xJIOqyveuhnCArIC0td2FpdCDtlIzrnpjqt7gg66ek7ZWRICovXG5jb25zdCBFRElUT1JfQ0xJX01BUCA9IHtcbiAgXCJWaXN1YWwgU3R1ZGlvIENvZGVcIjogeyBjbGk6IFwiQ29udGVudHMvUmVzb3VyY2VzL2FwcC9iaW4vY29kZVwiLCB3YWl0RmxhZzogXCItLXdhaXRcIiB9LFxuICBaZWQ6IHsgY2xpOiBcIkNvbnRlbnRzL01hY09TL2NsaVwiLCB3YWl0RmxhZzogXCItLXdhaXRcIiB9LFxuICBDdXJzb3I6IHsgY2xpOiBcIkNvbnRlbnRzL1Jlc291cmNlcy9hcHAvYmluL2N1cnNvclwiLCB3YWl0RmxhZzogXCItLXdhaXRcIiB9LFxufSBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgRWRpdG9yQ2xpQ29uZmlnPjtcblxuLyoqIOyVsSDrsojrk6QgQ0xJIOqyveuhnOulvCByZXNvbHZlLiB3YWl0PWZhbHNl7J2066m0IC0td2FpdCDtlIzrnpjqt7jrpbwg7IOd6561ICovXG5mdW5jdGlvbiByZXNvbHZlRWRpdG9yQ2xpKG9wdGlvbnM/OiB7IHdhaXQ/OiBib29sZWFuIH0pOiBFZGl0b3JDbGlSZXNvbHV0aW9uIHtcbiAgY29uc3Qgd2FpdCA9IG9wdGlvbnM/LndhaXQgPz8gdHJ1ZTtcbiAgY29uc3QgYXBwTmFtZSA9IFNvbmFtdS5jb25maWcuZXh0ZXJuYWxFZGl0b3IgPz8gXCJWaXN1YWwgU3R1ZGlvIENvZGVcIjtcbiAgY29uc3QgbWFwcGluZyA9IE9iamVjdC5lbnRyaWVzKEVESVRPUl9DTElfTUFQKS5maW5kKChbbmFtZV0pID0+IG5hbWUgPT09IGFwcE5hbWUpPy5bMV07XG4gIGlmICghbWFwcGluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGDsp4Dsm5DrkJjsp4Ag7JWK64qUIOyXkOuUlO2EsOyeheuLiOuLpDogJHthcHBOYW1lfSAo7KeA7JuQOiAke09iamVjdC5rZXlzKEVESVRPUl9DTElfTUFQKS5qb2luKFwiLCBcIil9KWAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNlYXJjaFBhdGhzID0gW1xuICAgIGAvQXBwbGljYXRpb25zLyR7YXBwTmFtZX0uYXBwYCxcbiAgICBgJHtvcy5ob21lZGlyKCl9L0FwcGxpY2F0aW9ucy8ke2FwcE5hbWV9LmFwcGAsXG4gIF07XG4gIGNvbnN0IGJ1bmRsZVBhdGggPSBzZWFyY2hQYXRocy5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgaWYgKCFidW5kbGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDslbEg67KI65Ok7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2FwcE5hbWV9ICgvQXBwbGljYXRpb25zIO2ZleyduClgKTtcbiAgfVxuXG4gIGNvbnN0IGNsaUJpbiA9IHBhdGguam9pbihidW5kbGVQYXRoLCBtYXBwaW5nLmNsaSk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjbGlCaW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDsl5DrlJTthLAgQ0xJ66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2NsaUJpbn1gKTtcbiAgfVxuXG4gIHJldHVybiB7IGJpbjogY2xpQmluLCBhcmdzOiB3YWl0ID8gW21hcHBpbmcud2FpdEZsYWddIDogW10gfTtcbn1cblxuLyoqIOyXkOuUlO2EsCBDTEnrpbwg7Iuk7ZaJ7ZWY6rOgIO2DreydtCDri6vtnpAg65WM6rmM7KeAIOuMgOq4sCAqL1xuZnVuY3Rpb24gcnVuRWRpdG9yKGVkaXRvcjogeyBiaW46IHN0cmluZzsgYXJnczogc3RyaW5nW10gfSwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oZWRpdG9yLmJpbiwgWy4uLmVkaXRvci5hcmdzLCBmaWxlUGF0aF0sIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihg7JeQ65SU7YSwIOyLpO2WiSDsi6TtjKggKCR7ZWRpdG9yLmJpbn0pOiAke2Vyci5tZXNzYWdlfWApKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKGNvZGUpID0+IHtcbiAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYOyXkOuUlO2EsOqwgCDruYTsoJXsg4Eg7KKF66OM65CY7JeI7Iq164uI64ukIChleGl0IGNvZGU6ICR7Y29kZX0pYCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqIOyGjOyKpCDtjIzsnbzsnYQg7Jm467aAIOyXkOuUlO2EsOuhnCDsl7TquLAgKOuMgOq4sO2VmOyngCDslYrsnYwpICovXG5leHBvcnQgZnVuY3Rpb24gb3BlblNvdXJjZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5pc0Fic29sdXRlKGZpbGVQYXRoKSA/IGZpbGVQYXRoIDogcGF0aC5yZXNvbHZlKFNvbmFtdS5hcGlSb290UGF0aCwgZmlsZVBhdGgpO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnNQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7YyM7J287J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgY29uc3QgZWRpdG9yID0gcmVzb2x2ZUVkaXRvckNsaSh7IHdhaXQ6IGZhbHNlIH0pO1xuICBjb25zdCBjaGlsZCA9IHNwYXduKGVkaXRvci5iaW4sIFsuLi5lZGl0b3IuYXJncywgYWJzUGF0aF0sIHtcbiAgICBzdGRpbzogXCJpZ25vcmVcIixcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgfSk7XG4gIGNoaWxkLnVucmVmKCk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUnVsZXMgQVBJXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqIGNvbnRyYWN0L3J1bGVzLyDrlJTroInthLDrpqwg64K0IC5ydWxlcy5qc29uIO2MjOydvCDrqqnroZ0g67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdFJ1bGVzKCk6IENkZFJ1bGVzUmVzdWx0IHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBydWxlc0RpciA9IHBhdGguam9pbihjb250cmFjdERpciwgXCJydWxlc1wiKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHJ1bGVzRGlyKSkgcmV0dXJuIHsgcnVsZXM6IFtdIH07XG5cbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHJ1bGVzRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IHJ1bGVzOiBDZGRSdWxlU3VtbWFyeVtdID0gW107XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhZW50cnkubmFtZS5lbmRzV2l0aChcIi5ydWxlcy5qc29uXCIpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGtleSA9IGVudHJ5Lm5hbWUucmVwbGFjZSgvXFwucnVsZXNcXC5qc29uJC8sIFwiXCIpO1xuICAgIGNvbnN0IHJlbFBhdGggPSBgcnVsZXMvJHtlbnRyeS5uYW1lfWA7XG4gICAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbihydWxlc0RpciwgZW50cnkubmFtZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gICAgICBjb25zdCBkb2MgPSAvKiBTQUZFVFk6IFVJIOuPhOq1rOydmCBab2Qg7J6F66ClIOyKpO2CpOuniOqwgCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIEpTT04ucGFyc2UoXG4gICAgICAgIHJhdyxcbiAgICAgICkgYXMgeyBkZXNjcmlwdGlvbj86IHN0cmluZzsgcnVsZXM/OiB1bmtub3duW10gfTtcbiAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIHBhdGg6IHJlbFBhdGgsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBpc1N0cmluZ1ZhbHVlKGRvYy5kZXNjcmlwdGlvbikgPyBkb2MuZGVzY3JpcHRpb24gOiBcIlwiLFxuICAgICAgICBydWxlQ291bnQ6IEFycmF5LmlzQXJyYXkoZG9jLnJ1bGVzKSA/IGRvYy5ydWxlcy5sZW5ndGggOiAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAga2V5LFxuICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJcIixcbiAgICAgICAgcnVsZUNvdW50OiAwLFxuICAgICAgICBwYXJzZUVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBydWxlcyB9O1xufVxuXG4vKiogcnVsZXMg7YyM7J28IOyDgeyEuCDrsJjtmZggKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkUnVsZShydWxlS2V5OiBzdHJpbmcpOiBDZGRSdWxlRGV0YWlsIHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5qb2luKGNvbnRyYWN0RGlyLCBcInJ1bGVzXCIsIGAke3J1bGVLZXl9LnJ1bGVzLmpzb25gKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJ1bGVzIO2MjOydvOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtydWxlS2V5fWApO1xuICB9XG5cbiAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gIGNvbnN0IGRvYyA9IC8qIFNBRkVUWTogVUkg64+E6rWs7J2YIFpvZCDsnoXroKUg7Iqk7YKk66eI6rCAIOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gSlNPTi5wYXJzZShcbiAgICByYXcsXG4gICkgYXMgeyBkZXNjcmlwdGlvbj86IHN0cmluZzsgcnVsZXM/OiBDZGRSdWxlRW50cnlbXSB9O1xuXG4gIHJldHVybiB7XG4gICAga2V5OiBydWxlS2V5LFxuICAgIHBhdGg6IGBydWxlcy8ke3J1bGVLZXl9LnJ1bGVzLmpzb25gLFxuICAgIGRlc2NyaXB0aW9uOiBpc1N0cmluZ1ZhbHVlKGRvYy5kZXNjcmlwdGlvbikgPyBkb2MuZGVzY3JpcHRpb24gOiBcIlwiLFxuICAgIHJ1bGVzOiBBcnJheS5pc0FycmF5KGRvYy5ydWxlcykgPyBkb2MucnVsZXMgOiBbXSxcbiAgfTtcbn1cblxuLyoqIHJ1bGVzIO2MjOydvOyXkCDqt5zsuZkg7LaU6rCAICovXG5leHBvcnQgZnVuY3Rpb24gYWRkUnVsZShyZXE6IENkZEFkZFJ1bGVSZXF1ZXN0KTogQ2RkUnVsZURldGFpbCB7XG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgcnVsZXNEaXIgPSBwYXRoLmpvaW4oY29udHJhY3REaXIsIFwicnVsZXNcIik7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4ocnVsZXNEaXIsIGAke3JlcS5ydWxlS2V5fS5ydWxlcy5qc29uYCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSdWxlcyDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7cmVxLnJ1bGVLZXl9YCk7XG4gIH1cblxuICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMoYWJzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgY29uc3QgZG9jID0gLyogU0FGRVRZOiBVSSDrj4TqtazsnZggWm9kIOyeheugpSDsiqTtgqTrp4jqsIAg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBKU09OLnBhcnNlKFxuICAgIHJhdyxcbiAgKSBhcyB7IGRlc2NyaXB0aW9uPzogc3RyaW5nOyBydWxlcz86IENkZFJ1bGVFbnRyeVtdIH07XG4gIGNvbnN0IHJ1bGVzOiBDZGRSdWxlRW50cnlbXSA9IEFycmF5LmlzQXJyYXkoZG9jLnJ1bGVzKSA/IGRvYy5ydWxlcyA6IFtdO1xuXG4gIGNvbnN0IG5leHRJZCA9IGdlbmVyYXRlTmV4dFJ1bGVJZChydWxlcyk7XG4gIGNvbnN0IG5ld0VudHJ5OiBDZGRSdWxlRW50cnkgPSB7XG4gICAgaWQ6IG5leHRJZCxcbiAgICB3aGVuOiByZXEud2hlbixcbiAgICBpbnN0cnVjdGlvbjogcmVxLmluc3RydWN0aW9uLFxuICB9O1xuICBpZiAocmVxLmV4YW1wbGVzICYmIHJlcS5leGFtcGxlcy5sZW5ndGggPiAwKSB7XG4gICAgbmV3RW50cnkuZXhhbXBsZXMgPSByZXEuZXhhbXBsZXM7XG4gIH1cblxuICBydWxlcy5wdXNoKG5ld0VudHJ5KTtcbiAgZG9jLnJ1bGVzID0gcnVsZXM7XG5cbiAgZnMud3JpdGVGaWxlU3luYyhhYnNQYXRoLCBgJHtKU09OLnN0cmluZ2lmeShkb2MsIG51bGwsIDIpfVxcbmAsIFwidXRmLThcIik7XG5cbiAgcmV0dXJuIHtcbiAgICBrZXk6IHJlcS5ydWxlS2V5LFxuICAgIHBhdGg6IGBydWxlcy8ke3JlcS5ydWxlS2V5fS5ydWxlcy5qc29uYCxcbiAgICBkZXNjcmlwdGlvbjogaXNTdHJpbmdWYWx1ZShkb2MuZGVzY3JpcHRpb24pID8gZG9jLmRlc2NyaXB0aW9uIDogXCJcIixcbiAgICBydWxlcyxcbiAgfTtcbn1cblxuLyoqIOq4sOyhtCBpZCDtjKjthLTsnYQg67aE7ISd7ZWY7JesIOuLpOydjCDsiJzrsoggaWQg7IOd7ISxICovXG5mdW5jdGlvbiBnZW5lcmF0ZU5leHRSdWxlSWQocnVsZXM6IENkZFJ1bGVFbnRyeVtdKTogc3RyaW5nIHtcbiAgaWYgKHJ1bGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiUi0wMDFcIjtcblxuICBjb25zdCBudW1lcmljUGF0dGVybiA9IC9eKC4rPykoXFxkKykkLztcbiAgbGV0IGJlc3RQcmVmaXggPSBcIlItXCI7XG4gIGxldCBtYXhOdW0gPSAwO1xuXG4gIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgIGNvbnN0IG1hdGNoID0gbnVtZXJpY1BhdHRlcm4uZXhlYyhydWxlLmlkKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IG1hdGNoWzFdO1xuICAgICAgY29uc3QgbnVtID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdLCAxMCk7XG4gICAgICBpZiAobnVtID4gbWF4TnVtKSB7XG4gICAgICAgIGJlc3RQcmVmaXggPSBwcmVmaXg7XG4gICAgICAgIG1heE51bSA9IG51bTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBuZXh0TnVtID0gbWF4TnVtICsgMTtcbiAgY29uc3QgcGFkTGVuID0gTWF0aC5tYXgoMywgU3RyaW5nKG1heE51bSkubGVuZ3RoKTtcbiAgcmV0dXJuIGAke2Jlc3RQcmVmaXh9JHtTdHJpbmcobmV4dE51bSkucGFkU3RhcnQocGFkTGVuLCBcIjBcIil9YDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBBQyBBUEkgKG1vZHVsZXMvY2RkIGFjLWxpc3Qg7YyM7IuxIOuhnOyngSDrs7XsgqwpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqIGRlc2NyaWJlL3Rlc3Qg7Yyo7YS0IO2MjOyLsSAqL1xuZnVuY3Rpb24gcGFyc2VBY0VudHJpZXMoY29udGVudDogc3RyaW5nKTogQ2RkQWNFbnRyeVtdIHtcbiAgY29uc3QgZW50cmllczogQ2RkQWNFbnRyeVtdID0gW107XG4gIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcblxuICBsZXQgY3VycmVudERlc2NyaWJlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgbGV0IGRlc2NyaWJlRGVwdGggPSAwO1xuICBsZXQgYnJhY2VEZXB0aCA9IDA7XG4gIGxldCBwZW5kaW5nVGVzdEFzID0gZmFsc2U7XG4gIGxldCB0ZXN0QXNCcmFjZURlcHRoID0gMDtcbiAgbGV0IHRlc3RBc05lZWROYW1lID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuXG4gICAgY29uc3QgZGVzY3JpYmVNYXRjaCA9IHRyaW1tZWQubWF0Y2goL15kZXNjcmliZVxcKFtcIidgXSguKz8pW1wiJ2BdLyk7XG4gICAgaWYgKGRlc2NyaWJlTWF0Y2gpIHtcbiAgICAgIGN1cnJlbnREZXNjcmliZSA9IGRlc2NyaWJlTWF0Y2hbMV07XG4gICAgICBkZXNjcmliZURlcHRoID0gYnJhY2VEZXB0aDtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXN0TWF0Y2ggPSB0cmltbWVkLm1hdGNoKC9eKD86dGVzdHxpdClcXChbXCInYF0oLis/KVtcIidgXS8pO1xuICAgIGlmICh0ZXN0TWF0Y2gpIHtcbiAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgIGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsXG4gICAgICAgIHRlc3Q6IHRlc3RNYXRjaFsxXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghcGVuZGluZ1Rlc3RBcyAmJiB0cmltbWVkLm1hdGNoKC9edGVzdEFzXFxzKlxcKC8pKSB7XG4gICAgICBjb25zdCBpbmxpbmVNYXRjaCA9IHRyaW1tZWQubWF0Y2goL150ZXN0QXNcXHMqXFwoXFxzKlxce1tefV0qXFx9XFxzKixcXHMqW1wiJ2BdKC4rPylbXCInYF0vKTtcbiAgICAgIGlmIChpbmxpbmVNYXRjaCkge1xuICAgICAgICBlbnRyaWVzLnB1c2goeyBkZXNjcmliZTogY3VycmVudERlc2NyaWJlLCB0ZXN0OiBpbmxpbmVNYXRjaFsxXSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlbmRpbmdUZXN0QXMgPSB0cnVlO1xuICAgICAgICB0ZXN0QXNCcmFjZURlcHRoID0gMDtcbiAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0cmltbWVkKSB7XG4gICAgICAgICAgaWYgKGNoID09PSBcIntcIikgdGVzdEFzQnJhY2VEZXB0aCsrO1xuICAgICAgICAgIGlmIChjaCA9PT0gXCJ9XCIpIHRlc3RBc0JyYWNlRGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGVzdEFzQnJhY2VEZXB0aCA8PSAwKSB7XG4gICAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IG5hbWVNYXRjaCA9IHRyaW1tZWQubWF0Y2goL31cXHMqLFxccypbXCInYF0oLis/KVtcIidgXS8pO1xuICAgICAgICAgIGlmIChuYW1lTWF0Y2gpIHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaCh7IGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsIHRlc3Q6IG5hbWVNYXRjaFsxXSB9KTtcbiAgICAgICAgICAgIHBlbmRpbmdUZXN0QXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRlc3RBc05lZWROYW1lID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwZW5kaW5nVGVzdEFzKSB7XG4gICAgICBpZiAoIXRlc3RBc05lZWROYW1lKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdHJpbW1lZCkge1xuICAgICAgICAgIGlmIChjaCA9PT0gXCJ7XCIpIHRlc3RBc0JyYWNlRGVwdGgrKztcbiAgICAgICAgICBpZiAoY2ggPT09IFwifVwiKSB0ZXN0QXNCcmFjZURlcHRoLS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRlc3RBc0JyYWNlRGVwdGggPD0gMCkge1xuICAgICAgICAgIHRlc3RBc05lZWROYW1lID0gdHJ1ZTtcbiAgICAgICAgICBjb25zdCBuYW1lTWF0Y2ggPSB0cmltbWVkLm1hdGNoKC99XFxzKixcXHMqW1wiJ2BdKC4rPylbXCInYF0vKTtcbiAgICAgICAgICBpZiAobmFtZU1hdGNoKSB7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goeyBkZXNjcmliZTogY3VycmVudERlc2NyaWJlLCB0ZXN0OiBuYW1lTWF0Y2hbMV0gfSk7XG4gICAgICAgICAgICBwZW5kaW5nVGVzdEFzID0gZmFsc2U7XG4gICAgICAgICAgICB0ZXN0QXNOZWVkTmFtZSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmFtZU1hdGNoID0gdHJpbW1lZC5tYXRjaCgvXltcIidgXSguKz8pW1wiJ2BdLyk7XG4gICAgICAgIGlmIChuYW1lTWF0Y2gpIHtcbiAgICAgICAgICBlbnRyaWVzLnB1c2goeyBkZXNjcmliZTogY3VycmVudERlc2NyaWJlLCB0ZXN0OiBuYW1lTWF0Y2hbMV0gfSk7XG4gICAgICAgICAgcGVuZGluZ1Rlc3RBcyA9IGZhbHNlO1xuICAgICAgICAgIHRlc3RBc05lZWROYW1lID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNoIG9mIHRyaW1tZWQpIHtcbiAgICAgIGlmIChjaCA9PT0gXCJ7XCIpIGJyYWNlRGVwdGgrKztcbiAgICAgIGlmIChjaCA9PT0gXCJ9XCIpIHtcbiAgICAgICAgYnJhY2VEZXB0aC0tO1xuICAgICAgICBpZiAoY3VycmVudERlc2NyaWJlICYmIGJyYWNlRGVwdGggPD0gZGVzY3JpYmVEZXB0aCkge1xuICAgICAgICAgIGN1cnJlbnREZXNjcmliZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW50cmllcztcbn1cblxuLyoqIO2UhOuhnOygne2KuCDrgrQgKi50ZXN0LnRzIO2MjOydvOydhCDsiqTsupTtlZjsl6wgQUMg66qp66GdIOuwmO2ZmCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjTGlzdCgpOiBDZGRBY0xpc3RSZXN1bHQge1xuICBjb25zdCBwcm9qZWN0Um9vdCA9IGdldFByb2plY3RSb290KCk7XG4gIGNvbnN0IGZpbGVzID0gZmluZFRlc3RGaWxlcyhwcm9qZWN0Um9vdCk7XG5cbiAgY29uc3QgYWNGaWxlczogQ2RkQWNGaWxlW10gPSBbXTtcbiAgZm9yIChjb25zdCBhYnNQYXRoIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhhYnNQYXRoLCBcInV0Zi04XCIpO1xuICAgIGNvbnN0IGVudHJpZXMgPSBwYXJzZUFjRW50cmllcyhjb250ZW50KTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBhY0ZpbGVzLnB1c2goe1xuICAgICAgICBwYXRoOiBwYXRoLnJlbGF0aXZlKHByb2plY3RSb290LCBhYnNQYXRoKSxcbiAgICAgICAgZW50cmllcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRvdGFsID0gYWNGaWxlcy5yZWR1Y2UoKHN1bSwgZikgPT4gc3VtICsgZi5lbnRyaWVzLmxlbmd0aCwgMCk7XG4gIHJldHVybiB7IGZpbGVzOiBhY0ZpbGVzLCB0b3RhbCB9O1xufVxuXG4vKiogKi50ZXN0LnRzIO2MjOydvOydhCDsnqzqt4Ag7YOQ7IOJIChub2RlX21vZHVsZXMsIGRpc3Qg7KCc7Jm4KSAqL1xuZnVuY3Rpb24gZmluZFRlc3RGaWxlcyhkaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmVzdWx0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgSUdOT1JFID0gbmV3IFNldChbXCJub2RlX21vZHVsZXNcIiwgXCJkaXN0XCIsIFwiLmdpdFwiLCBcImNvbnRyYWN0XCJdKTtcblxuICBmdW5jdGlvbiB3YWxrKGN1cnJlbnREaXI6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBlbnRyaWVzOiBmcy5EaXJlbnRbXTtcbiAgICB0cnkge1xuICAgICAgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGN1cnJlbnREaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoSUdOT1JFLmhhcyhlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHdhbGsoZnVsbFBhdGgpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS5pc0ZpbGUoKSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKFwiLnRlc3QudHNcIikpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKGZ1bGxQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB3YWxrKGRpcik7XG4gIHJlc3VsdHMuc29ydCgpO1xuICByZXR1cm4gcmVzdWx0cztcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBa0RBLFNBQVMsaUJBQXlCO0NBQ2hDLE9BQU8sS0FBSyxLQUFLLE9BQU8sYUFBYSxNQUFN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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations-api.d.ts","sourceRoot":"","sources":["../../src/ui/migrations-api.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,eAAe,EAAqB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"migrations-api.d.ts","sourceRoot":"","sources":["../../src/ui/migrations-api.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,eAAe,EAAqB,MAAM,SAAS,CAAC;AAqPlE,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,eAAe,iBAoIlE"}
|
|
@@ -4,6 +4,7 @@ import { BadRequestException, init_so_exceptions } from "../exceptions/so-except
|
|
|
4
4
|
import { Sonamu, init_sonamu } from "../api/sonamu.js";
|
|
5
5
|
import { SlackConfirm, init_slack_confirm } from "../migration/slack-confirm.js";
|
|
6
6
|
import { MigrationTargetExecutionError, Migrator, init_migrator } from "../migration/migrator.js";
|
|
7
|
+
import { forwardAsyncErrors, init_async_route } from "./async-route.js";
|
|
7
8
|
import { readFile } from "fs/promises";
|
|
8
9
|
import { PassThrough } from "stream";
|
|
9
10
|
//#region src/ui/migrations-api.ts
|
|
@@ -137,32 +138,32 @@ async function registerMigrationsApi(server) {
|
|
|
137
138
|
const migrator = new Migrator();
|
|
138
139
|
server.get("/api/migrations/connections", async () => ({ connections: migrator.getConnections() }));
|
|
139
140
|
server.get("/api/migrations/codes", async () => ({ codes: await migrator.getMigrationCodes() }));
|
|
140
|
-
server.get("/api/migrations/code", async (
|
|
141
|
+
server.get("/api/migrations/code", (request) => forwardAsyncErrors(async () => {
|
|
141
142
|
const migrationCode = (await migrator.getMigrationCodes()).find(({ name }) => name === request.query.codeName);
|
|
142
143
|
if (migrationCode === void 0) throw new BadRequestException(SD("error.badRequest"));
|
|
143
144
|
return { code: await readFile(migrationCode.path, "utf8") };
|
|
144
|
-
});
|
|
145
|
-
server.get("/api/migrations/status", async (
|
|
145
|
+
}));
|
|
146
|
+
server.get("/api/migrations/status", (request) => forwardAsyncErrors(async () => {
|
|
146
147
|
if (request.query.connKey === void 0) return { status: await migrator.getStatus() };
|
|
147
148
|
return { status: await migrator.getConnectionStatus(request.query.connKey) };
|
|
148
|
-
});
|
|
149
|
-
server.get("/api/migrations/prepared-codes", async (
|
|
150
|
-
server.post("/api/migrations/request-approval", async (
|
|
149
|
+
}));
|
|
150
|
+
server.get("/api/migrations/prepared-codes", (request) => forwardAsyncErrors(async () => ({ preparedCodes: await migrator.getPreparedCodes(request.query.compareConnKey) })));
|
|
151
|
+
server.post("/api/migrations/request-approval", (request) => forwardAsyncErrors(async () => {
|
|
151
152
|
return requestApproval(migrator, request.body.targets, request.body.requestor);
|
|
152
|
-
});
|
|
153
|
-
server.post("/api/migrations/checkApproval", async (
|
|
153
|
+
}));
|
|
154
|
+
server.post("/api/migrations/checkApproval", (request) => forwardAsyncErrors(async () => {
|
|
154
155
|
const slack = new SlackConfirm();
|
|
155
156
|
return slack.isConfigured() ? slack.checkApproval(request.body.channel, request.body.ts) : {
|
|
156
157
|
approved: true,
|
|
157
158
|
rejected: false
|
|
158
159
|
};
|
|
159
|
-
});
|
|
160
|
-
server.post("/api/migrations/forceApproval", async (
|
|
160
|
+
}));
|
|
161
|
+
server.post("/api/migrations/forceApproval", (request) => forwardAsyncErrors(async () => {
|
|
161
162
|
const slack = new SlackConfirm();
|
|
162
163
|
if (!slack.isConfigured()) throw new BadRequestException(SD("sonamu.error.slackConfirmNotConfigured"));
|
|
163
164
|
await slack.forceApproval(request.body.channel, request.body.ts, request.body.reason, request.body.requestor);
|
|
164
165
|
return { success: true };
|
|
165
|
-
});
|
|
166
|
+
}));
|
|
166
167
|
server.post("/api/migrations/shadow", async (_request, reply) => {
|
|
167
168
|
return sendMigrationStream(reply, "shadow", [], (onProgress) => {
|
|
168
169
|
return migrator.runShadowTest({ onProgress });
|
|
@@ -183,14 +184,14 @@ async function registerMigrationsApi(server) {
|
|
|
183
184
|
return migrator.rollback(request.body.targets, { onProgress });
|
|
184
185
|
});
|
|
185
186
|
});
|
|
186
|
-
server.post("/api/migrations/generatePreparedCodes", async (
|
|
187
|
-
server.post("/api/migrations/runAction", async (
|
|
187
|
+
server.post("/api/migrations/generatePreparedCodes", (request) => forwardAsyncErrors(async () => migrator.generatePreparedCodes(request.body.compareConnKey)));
|
|
188
|
+
server.post("/api/migrations/runAction", (request) => forwardAsyncErrors(async () => {
|
|
188
189
|
if (request.body.action === "shadow") return migrator.runShadowTest();
|
|
189
190
|
if (request.body.action === "apply") return runLegacyApply(migrator, request.body);
|
|
190
191
|
assertTargets(migrator, request.body.targets);
|
|
191
192
|
await getAvailableTargetStatuses(migrator, request.body.targets);
|
|
192
193
|
return migrator.rollback(request.body.targets);
|
|
193
|
-
});
|
|
194
|
+
}));
|
|
194
195
|
}
|
|
195
196
|
var LOCAL_HOSTS;
|
|
196
197
|
var init_migrations_api = __esmMin((() => {
|
|
@@ -199,6 +200,7 @@ var init_migrations_api = __esmMin((() => {
|
|
|
199
200
|
init_so_exceptions();
|
|
200
201
|
init_migrator();
|
|
201
202
|
init_slack_confirm();
|
|
203
|
+
init_async_route();
|
|
202
204
|
LOCAL_HOSTS = /* @__PURE__ */ new Set([
|
|
203
205
|
"localhost",
|
|
204
206
|
"127.0.0.1",
|
|
@@ -210,4 +212,4 @@ var init_migrations_api = __esmMin((() => {
|
|
|
210
212
|
init_migrations_api();
|
|
211
213
|
export { init_migrations_api, registerMigrationsApi };
|
|
212
214
|
|
|
213
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9ucy1hcGkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpL21pZ3JhdGlvbnMtYXBpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBQYXNzVGhyb3VnaCB9IGZyb20gXCJzdHJlYW1cIjtcblxuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5SW5zdGFuY2UsIHR5cGUgRmFzdGlmeVJlcGx5IH0gZnJvbSBcImZhc3RpZnlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uL2RpY3Qvc2RcIjtcbmltcG9ydCB7IEJhZFJlcXVlc3RFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQge1xuICBNaWdyYXRvcixcbiAgTWlncmF0aW9uVGFyZ2V0RXhlY3V0aW9uRXJyb3IsXG4gIHR5cGUgTWlncmF0aW9uUmVzdWx0LFxufSBmcm9tIFwiLi4vbWlncmF0aW9uL21pZ3JhdG9yXCI7XG5pbXBvcnQgeyBTbGFja0NvbmZpcm0sIHR5cGUgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdCB9IGZyb20gXCIuLi9taWdyYXRpb24vc2xhY2stY29uZmlybVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBNaWdyYXRpb25BY3Rpb24sXG4gIHR5cGUgTWlncmF0aW9uQ29ubmVjdGlvblN0YXR1cyxcbiAgdHlwZSBNaWdyYXRpb25Qcm9ncmVzc0V2ZW50LFxuICB0eXBlIE1pZ3JhdGlvblN0cmVhbUV2ZW50LFxuICB0eXBlIE1pZ3JhdGlvblRhcmdldCxcbn0gZnJvbSBcIi4uL21pZ3JhdGlvbi90eXBlc1wiO1xuXG50eXBlIEFwcHJvdmFsUmVhZHkgPSB7IHR5cGU6IFwicmVhZHlcIiB9O1xudHlwZSBBcHByb3ZhbFJlc3VsdCA9IEFwcHJvdmFsUmVhZHkgfCBTbGFja0NvbmZpcm1QZW5kaW5nUmVzdWx0O1xudHlwZSBBcHBseUJvZHkgPSB7IHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdOyByZXF1ZXN0b3I/OiBzdHJpbmcgfTtcbnR5cGUgTGVnYWN5QXBwbHlCb2R5ID0gQXBwbHlCb2R5ICYgeyBmb3JjZT86IGJvb2xlYW47IGZvcmNlUmVhc29uPzogc3RyaW5nIH07XG5cbmNvbnN0IExPQ0FMX0hPU1RTID0gbmV3IFNldChbXCJsb2NhbGhvc3RcIiwgXCIxMjcuMC4wLjFcIiwgXCIwLjAuMC4wXCIsIFwiOjoxXCJdKTtcblxuZnVuY3Rpb24gYXNzZXJ0VGFyZ2V0cyhtaWdyYXRvcjogTWlncmF0b3IsIHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdKTogdm9pZCB7XG4gIGNvbnN0IGFsbG93ZWQgPSBuZXcgU2V0KG1pZ3JhdG9yLmdldENvbm5lY3Rpb25zKCkubWFwKCh7IGNvbm5LZXkgfSkgPT4gY29ubktleSkpO1xuICBjb25zdCBpbnZhbGlkID0gdGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gIWFsbG93ZWQuaGFzKHRhcmdldCkpO1xuICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDAgfHwgaW52YWxpZC5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci5iYWRSZXF1ZXN0XCIpLCB7XG4gICAgICBtZXNzYWdlOiBgSW52YWxpZCBtaWdyYXRpb24gdGFyZ2V0czogJHtpbnZhbGlkLmxlbmd0aCA9PT0gMCA/IFwiKGVtcHR5KVwiIDogaW52YWxpZC5qb2luKFwiLCBcIil9YCxcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0YXJnZXRSZXF1aXJlc0FwcHJvdmFsKHNsYWNrOiBTbGFja0NvbmZpcm0sIHRhcmdldDogTWlncmF0aW9uVGFyZ2V0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbm5lY3Rpb24gPSBTb25hbXUuZGJDb25maWdbdGFyZ2V0XT8uY29ubmVjdGlvbiBhcyB7IGhvc3Q/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVtb3RlID0gIUxPQ0FMX0hPU1RTLmhhcygoY29ubmVjdGlvbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiKS50b0xvd2VyQ2FzZSgpKTtcbiAgcmV0dXJuIHJlbW90ZSAmJiBzbGFjay5pc1RhcmdldFJlcXVpcmVzQXBwcm92YWwodGFyZ2V0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMoXG4gIG1pZ3JhdG9yOiBNaWdyYXRvcixcbiAgdGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10sXG4pOiBQcm9taXNlPE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXNbXT4ge1xuICBjb25zdCBzdGF0dXNlcyA9IGF3YWl0IFByb21pc2UuYWxsKHRhcmdldHMubWFwKCh0YXJnZXQpID0+IG1pZ3JhdG9yLmdldENvbm5lY3Rpb25TdGF0dXModGFyZ2V0KSkpO1xuICBjb25zdCBmYWlsZWQgPSBzdGF0dXNlcy5maWx0ZXIoKHsgc3RhdHVzLCBlcnJvciB9KSA9PiBzdGF0dXMgPT09IFwiZXJyb3JcIiB8fCBlcnJvciAhPT0gdW5kZWZpbmVkKTtcbiAgaWYgKGZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci5iYWRSZXF1ZXN0XCIpLCB7XG4gICAgICBtZXNzYWdlOiBgTWlncmF0aW9uIHN0YXR1cyBjb3VsZCBub3QgYmUgdmVyaWZpZWQ6ICR7ZmFpbGVkLm1hcCgoeyBjb25uS2V5IH0pID0+IGNvbm5LZXkpLmpvaW4oXCIsIFwiKX1gLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBzdGF0dXNlcztcbn1cblxuZnVuY3Rpb24gZ2V0UGVuZGluZ01pZ3JhdGlvbnMoc3RhdHVzZXM6IE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXNbXSkge1xuICByZXR1cm4gWy4uLm5ldyBTZXQoc3RhdHVzZXMuZmxhdE1hcCgoeyBwZW5kaW5nIH0pID0+IHBlbmRpbmcpKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RBcHByb3ZhbChcbiAgbWlncmF0b3I6IE1pZ3JhdG9yLFxuICB0YXJnZXRzOiBNaWdyYXRpb25UYXJnZXRbXSxcbiAgcmVxdWVzdG9yPzogc3RyaW5nLFxuKTogUHJvbWlzZTxBcHByb3ZhbFJlc3VsdD4ge1xuICBhc3NlcnRUYXJnZXRzKG1pZ3JhdG9yLCB0YXJnZXRzKTtcbiAgY29uc3Qgc3RhdHVzZXMgPSBhd2FpdCBnZXRBdmFpbGFibGVUYXJnZXRTdGF0dXNlcyhtaWdyYXRvciwgdGFyZ2V0cyk7XG4gIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gdGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldFJlcXVpcmVzQXBwcm92YWwoc2xhY2ssIHRhcmdldCkpO1xuICBpZiAoIXJlcXVpcmVzQXBwcm92YWwgfHwgIXNsYWNrLmlzQ29uZmlndXJlZCgpKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJyZWFkeVwiIH07XG4gIH1cblxuICBjb25zdCBwZW5kaW5nID0gZ2V0UGVuZGluZ01pZ3JhdGlvbnMoc3RhdHVzZXMpO1xuICBpZiAocGVuZGluZy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4geyB0eXBlOiBcInJlYWR5XCIgfTtcbiAgfVxuXG4gIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc2xhY2suZ2V0RXhpc3RpbmdSZXF1ZXN0KHBlbmRpbmcpO1xuICBpZiAoZXhpc3RpbmcgIT09IG51bGwpIHtcbiAgICBjb25zdCBhcHByb3ZhbCA9IGF3YWl0IHNsYWNrLmNoZWNrQXBwcm92YWwoZXhpc3RpbmcuY2hhbm5lbCwgZXhpc3RpbmcudHMpO1xuICAgIGlmIChhcHByb3ZhbC5hcHByb3ZlZCkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJyZWFkeVwiIH07XG4gICAgfVxuICAgIGlmIChhcHByb3ZhbC5yZWplY3RlZCkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IubWlncmF0aW9uUmVqZWN0ZWRcIikpO1xuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiBcInBlbmRpbmdcIiwgLi4uZXhpc3RpbmcgfTtcbiAgfVxuXG4gIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBzbGFjay5wb3N0QXBwcm92YWxSZXF1ZXN0KHBlbmRpbmcsIHRhcmdldHMsIHJlcXVlc3Rvcik7XG4gIGF3YWl0IHNsYWNrLnNhdmVSZXF1ZXN0KHBlbmRpbmcsIGNyZWF0ZWQuY2hhbm5lbCwgY3JlYXRlZC50cyk7XG4gIHJldHVybiB7IHR5cGU6IFwicGVuZGluZ1wiLCAuLi5jcmVhdGVkIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVBcHByb3ZlZEFwcGx5KFxuICBib2R5OiBBcHBseUJvZHksXG4gIHN0YXR1c2VzOiBNaWdyYXRpb25Db25uZWN0aW9uU3RhdHVzW10sXG4pOiBQcm9taXNlPHsgY2hhbm5lbDogc3RyaW5nOyB0czogc3RyaW5nIH0gfCBudWxsPiB7XG4gIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gYm9keS50YXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0UmVxdWlyZXNBcHByb3ZhbChzbGFjaywgdGFyZ2V0KSk7XG4gIGlmICghcmVxdWlyZXNBcHByb3ZhbCB8fCAhc2xhY2suaXNDb25maWd1cmVkKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBlbmRpbmcgPSBnZXRQZW5kaW5nTWlncmF0aW9ucyhzdGF0dXNlcyk7XG4gIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzbGFjay5nZXRFeGlzdGluZ1JlcXVlc3QocGVuZGluZyk7XG4gIGlmIChleGlzdGluZyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IuYmFkUmVxdWVzdFwiKSwge1xuICAgICAgbWVzc2FnZTogXCJTbGFjayBhcHByb3ZhbCBoYXMgbm90IGJlZW4gcmVxdWVzdGVkXCIsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgYXBwcm92YWwgPSBhd2FpdCBzbGFjay5jaGVja0FwcHJvdmFsKGV4aXN0aW5nLmNoYW5uZWwsIGV4aXN0aW5nLnRzKTtcbiAgaWYgKGFwcHJvdmFsLnJlamVjdGVkKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IubWlncmF0aW9uUmVqZWN0ZWRcIikpO1xuICB9XG4gIGlmICghYXBwcm92YWwuYXBwcm92ZWQpIHtcbiAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcImVycm9yLmJhZFJlcXVlc3RcIiksIHtcbiAgICAgIG1lc3NhZ2U6IFwiU2xhY2sgYXBwcm92YWwgaXMgc3RpbGwgcGVuZGluZ1wiLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBleGlzdGluZztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuTGVnYWN5QXBwbHkoXG4gIG1pZ3JhdG9yOiBNaWdyYXRvcixcbiAgYm9keTogTGVnYWN5QXBwbHlCb2R5LFxuKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQgfCBTbGFja0NvbmZpcm1QZW5kaW5nUmVzdWx0PiB7XG4gIGFzc2VydFRhcmdldHMobWlncmF0b3IsIGJvZHkudGFyZ2V0cyk7XG4gIGNvbnN0IHN0YXR1c2VzID0gYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIGJvZHkudGFyZ2V0cyk7XG4gIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gYm9keS50YXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0UmVxdWlyZXNBcHByb3ZhbChzbGFjaywgdGFyZ2V0KSk7XG4gIGlmICghcmVxdWlyZXNBcHByb3ZhbCB8fCAhc2xhY2suaXNDb25maWd1cmVkKCkpIHtcbiAgICByZXR1cm4gbWlncmF0b3IuYXBwbHkoYm9keS50YXJnZXRzKTtcbiAgfVxuXG4gIGNvbnN0IHBlbmRpbmcgPSBnZXRQZW5kaW5nTWlncmF0aW9ucyhzdGF0dXNlcyk7XG4gIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBtaWdyYXRvci5hcHBseShib2R5LnRhcmdldHMpO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzbGFjay5nZXRFeGlzdGluZ1JlcXVlc3QocGVuZGluZyk7XG4gIGlmIChleGlzdGluZyA9PT0gbnVsbCkge1xuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBzbGFjay5wb3N0QXBwcm92YWxSZXF1ZXN0KHBlbmRpbmcsIGJvZHkudGFyZ2V0cywgYm9keS5yZXF1ZXN0b3IpO1xuICAgIGF3YWl0IHNsYWNrLnNhdmVSZXF1ZXN0KHBlbmRpbmcsIGNyZWF0ZWQuY2hhbm5lbCwgY3JlYXRlZC50cyk7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJwZW5kaW5nXCIsIC4uLmNyZWF0ZWQgfTtcbiAgfVxuXG4gIGNvbnN0IGFwcHJvdmFsID0gYXdhaXQgc2xhY2suY2hlY2tBcHByb3ZhbChleGlzdGluZy5jaGFubmVsLCBleGlzdGluZy50cyk7XG4gIGlmIChhcHByb3ZhbC5yZWplY3RlZCkge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLm1pZ3JhdGlvblJlamVjdGVkXCIpKTtcbiAgfVxuICBpZiAoIWFwcHJvdmFsLmFwcHJvdmVkICYmICFib2R5LmZvcmNlKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJwZW5kaW5nXCIsIC4uLmV4aXN0aW5nIH07XG4gIH1cbiAgaWYgKCFhcHByb3ZhbC5hcHByb3ZlZCkge1xuICAgIGF3YWl0IHNsYWNrLmZvcmNlQXBwcm92YWwoXG4gICAgICBleGlzdGluZy5jaGFubmVsLFxuICAgICAgZXhpc3RpbmcudHMsXG4gICAgICBib2R5LmZvcmNlUmVhc29uID8/IFwi7IKs7JygIOyXhuydjFwiLFxuICAgICAgYm9keS5yZXF1ZXN0b3IsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1pZ3JhdG9yLmFwcGx5KGJvZHkudGFyZ2V0cyk7XG4gIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgIGF3YWl0IHNsYWNrLmxvZ0V4ZWN1dGlvbihleGlzdGluZy5jaGFubmVsLCBleGlzdGluZy50cywgcmVzdWx0LCBib2R5LnJlcXVlc3Rvcik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc2VuZE1pZ3JhdGlvblN0cmVhbShcbiAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgYWN0aW9uOiBNaWdyYXRpb25BY3Rpb24sXG4gIHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdLFxuICBydW46IChvblByb2dyZXNzOiAoZXZlbnQ6IE1pZ3JhdGlvblByb2dyZXNzRXZlbnQpID0+IHZvaWQpID0+IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PixcbiAgYWZ0ZXJDb21wbGV0ZT86IChyZXN1bHQ6IE1pZ3JhdGlvblJlc3VsdCkgPT4gUHJvbWlzZTx2b2lkPixcbikge1xuICBjb25zdCBzdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgbGV0IGNhbldyaXRlID0gdHJ1ZTtcbiAgbGV0IGN1cnJlbnQ6IE1pZ3JhdGlvblByb2dyZXNzRXZlbnQgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGNvbXBsZXRlZFRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdID0gW107XG4gIGNvbnN0IHdyaXRlID0gKGV2ZW50OiBNaWdyYXRpb25TdHJlYW1FdmVudCkgPT4ge1xuICAgIGlmIChjYW5Xcml0ZSAmJiAhc3RyZWFtLmRlc3Ryb3llZCkge1xuICAgICAgc3RyZWFtLndyaXRlKGAke0pTT04uc3RyaW5naWZ5KGV2ZW50KX1cXG5gKTtcbiAgICB9XG4gIH07XG5cbiAgc3RyZWFtLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgIGNhbldyaXRlID0gZmFsc2U7XG4gIH0pO1xuICByZXBseVxuICAgIC5oZWFkZXIoXCJjb250ZW50LXR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LW5kanNvbjsgY2hhcnNldD11dGYtOFwiKVxuICAgIC5oZWFkZXIoXCJjYWNoZS1jb250cm9sXCIsIFwibm8tY2FjaGUsIG5vLXRyYW5zZm9ybVwiKVxuICAgIC5oZWFkZXIoXCJjb250ZW50LWVuY29kaW5nXCIsIFwiaWRlbnRpdHlcIilcbiAgICAuaGVhZGVyKFwieC1uby1jb21wcmVzc2lvblwiLCBcIjFcIik7XG5cbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW4oKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSBcInRhcmdldC1jb21wbGV0ZVwiKSB7XG4gICAgICAgICAgaWYgKGV2ZW50LmNvbm5LZXkgIT09IFwic2hhZG93XCIpIGNvbXBsZXRlZFRhcmdldHMucHVzaChldmVudC5jb25uS2V5KTtcbiAgICAgICAgICB3cml0ZShldmVudCk7XG4gICAgICAgICAgLy8g64uk7J2MIHRhcmdldOydmCBsaWZlY3ljbGXsnbQg7Iuc7J6R65CY6riwIOyghCDsmKTrpZjrpbwg7KeB7KCEIHRhcmdldOyXkCDsnpjrqrsg6reA7IaN7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICAgICAgICBjdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gZXZlbnQ7XG4gICAgICAgIHdyaXRlKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYWZ0ZXJDb21wbGV0ZT8uKHJlc3VsdCk7XG4gICAgICB3cml0ZSh7IHR5cGU6IFwiY29tcGxldGVcIiwgcmVzdWx0IH0pO1xuICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGNhdWdodCBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0Lm1lc3NhZ2UgOiBTdHJpbmcoY2F1Z2h0KTtcbiAgICAgIGNvbnN0IGZhaWxlZFRhcmdldCA9XG4gICAgICAgIGNhdWdodCBpbnN0YW5jZW9mIE1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yID8gY2F1Z2h0LmNvbm5LZXkgOiBjdXJyZW50Py5jb25uS2V5O1xuICAgICAgd3JpdGUoe1xuICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgY29ubktleTogZmFpbGVkVGFyZ2V0LFxuICAgICAgICBmaWxlOlxuICAgICAgICAgIGN1cnJlbnQ/LnR5cGUgPT09IFwiZmlsZS1zdGFydFwiIHx8IGN1cnJlbnQ/LnR5cGUgPT09IFwiZmlsZS1leGVjdXRlZFwiXG4gICAgICAgICAgICA/IGN1cnJlbnQuZmlsZVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbXBsZXRlZFRhcmdldHMsXG4gICAgICAgIHBlbmRpbmdUYXJnZXRzOiB0YXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiAhY29tcGxldGVkVGFyZ2V0cy5pbmNsdWRlcyh0YXJnZXQpKSxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoIXN0cmVhbS5kZXN0cm95ZWQpIHtcbiAgICAgICAgc3RyZWFtLmVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSkoKTtcblxuICByZXR1cm4gcmVwbHkuc2VuZChzdHJlYW0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJNaWdyYXRpb25zQXBpKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlKSB7XG4gIGNvbnN0IG1pZ3JhdG9yID0gbmV3IE1pZ3JhdG9yKCk7XG5cbiAgc2VydmVyLmdldChcIi9hcGkvbWlncmF0aW9ucy9jb25uZWN0aW9uc1wiLCBhc3luYyAoKSA9PiAoe1xuICAgIGNvbm5lY3Rpb25zOiBtaWdyYXRvci5nZXRDb25uZWN0aW9ucygpLFxuICB9KSk7XG4gIHNlcnZlci5nZXQoXCIvYXBpL21pZ3JhdGlvbnMvY29kZXNcIiwgYXN5bmMgKCkgPT4gKHsgY29kZXM6IGF3YWl0IG1pZ3JhdG9yLmdldE1pZ3JhdGlvbkNvZGVzKCkgfSkpO1xuICBzZXJ2ZXIuZ2V0PHsgUXVlcnlzdHJpbmc6IHsgY29kZU5hbWU6IHN0cmluZyB9IH0+KFwiL2FwaS9taWdyYXRpb25zL2NvZGVcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICBjb25zdCBtaWdyYXRpb25Db2RlID0gKGF3YWl0IG1pZ3JhdG9yLmdldE1pZ3JhdGlvbkNvZGVzKCkpLmZpbmQoXG4gICAgICAoeyBuYW1lIH0pID0+IG5hbWUgPT09IHJlcXVlc3QucXVlcnkuY29kZU5hbWUsXG4gICAgKTtcbiAgICBpZiAobWlncmF0aW9uQ29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcImVycm9yLmJhZFJlcXVlc3RcIikpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlOiBhd2FpdCByZWFkRmlsZShtaWdyYXRpb25Db2RlLnBhdGgsIFwidXRmOFwiKSB9O1xuICB9KTtcbiAgc2VydmVyLmdldDx7IFF1ZXJ5c3RyaW5nOiB7IGNvbm5LZXk/OiBNaWdyYXRpb25UYXJnZXQgfSB9PihcbiAgICBcIi9hcGkvbWlncmF0aW9ucy9zdGF0dXNcIixcbiAgICBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgaWYgKHJlcXVlc3QucXVlcnkuY29ubktleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogYXdhaXQgbWlncmF0b3IuZ2V0U3RhdHVzKCkgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHN0YXR1czogYXdhaXQgbWlncmF0b3IuZ2V0Q29ubmVjdGlvblN0YXR1cyhyZXF1ZXN0LnF1ZXJ5LmNvbm5LZXkpIH07XG4gICAgfSxcbiAgKTtcbiAgc2VydmVyLmdldDx7IFF1ZXJ5c3RyaW5nOiB7IGNvbXBhcmVDb25uS2V5OiBNaWdyYXRpb25UYXJnZXQgfSB9PihcbiAgICBcIi9hcGkvbWlncmF0aW9ucy9wcmVwYXJlZC1jb2Rlc1wiLFxuICAgIGFzeW5jIChyZXF1ZXN0KSA9PiAoe1xuICAgICAgcHJlcGFyZWRDb2RlczogYXdhaXQgbWlncmF0b3IuZ2V0UHJlcGFyZWRDb2RlcyhyZXF1ZXN0LnF1ZXJ5LmNvbXBhcmVDb25uS2V5KSxcbiAgICB9KSxcbiAgKTtcblxuICBzZXJ2ZXIucG9zdDx7IEJvZHk6IEFwcGx5Qm9keSB9PihcIi9hcGkvbWlncmF0aW9ucy9yZXF1ZXN0LWFwcHJvdmFsXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgcmV0dXJuIHJlcXVlc3RBcHByb3ZhbChtaWdyYXRvciwgcmVxdWVzdC5ib2R5LnRhcmdldHMsIHJlcXVlc3QuYm9keS5yZXF1ZXN0b3IpO1xuICB9KTtcbiAgc2VydmVyLnBvc3Q8eyBCb2R5OiB7IGNoYW5uZWw6IHN0cmluZzsgdHM6IHN0cmluZyB9IH0+KFxuICAgIFwiL2FwaS9taWdyYXRpb25zL2NoZWNrQXBwcm92YWxcIixcbiAgICBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgY29uc3Qgc2xhY2sgPSBuZXcgU2xhY2tDb25maXJtKCk7XG4gICAgICByZXR1cm4gc2xhY2suaXNDb25maWd1cmVkKClcbiAgICAgICAgPyBzbGFjay5jaGVja0FwcHJvdmFsKHJlcXVlc3QuYm9keS5jaGFubmVsLCByZXF1ZXN0LmJvZHkudHMpXG4gICAgICAgIDogeyBhcHByb3ZlZDogdHJ1ZSwgcmVqZWN0ZWQ6IGZhbHNlIH07XG4gICAgfSxcbiAgKTtcbiAgc2VydmVyLnBvc3Q8e1xuICAgIEJvZHk6IHsgY2hhbm5lbDogc3RyaW5nOyB0czogc3RyaW5nOyByZWFzb246IHN0cmluZzsgcmVxdWVzdG9yPzogc3RyaW5nIH07XG4gIH0+KFwiL2FwaS9taWdyYXRpb25zL2ZvcmNlQXBwcm92YWxcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICBjb25zdCBzbGFjayA9IG5ldyBTbGFja0NvbmZpcm0oKTtcbiAgICBpZiAoIXNsYWNrLmlzQ29uZmlndXJlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5zbGFja0NvbmZpcm1Ob3RDb25maWd1cmVkXCIpKTtcbiAgICB9XG4gICAgYXdhaXQgc2xhY2suZm9yY2VBcHByb3ZhbChcbiAgICAgIHJlcXVlc3QuYm9keS5jaGFubmVsLFxuICAgICAgcmVxdWVzdC5ib2R5LnRzLFxuICAgICAgcmVxdWVzdC5ib2R5LnJlYXNvbixcbiAgICAgIHJlcXVlc3QuYm9keS5yZXF1ZXN0b3IsXG4gICAgKTtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gIH0pO1xuXG4gIHNlcnZlci5wb3N0KFwiL2FwaS9taWdyYXRpb25zL3NoYWRvd1wiLCBhc3luYyAoX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgcmV0dXJuIHNlbmRNaWdyYXRpb25TdHJlYW0ocmVwbHksIFwic2hhZG93XCIsIFtdLCAob25Qcm9ncmVzcykgPT4ge1xuICAgICAgcmV0dXJuIG1pZ3JhdG9yLnJ1blNoYWRvd1Rlc3QoeyBvblByb2dyZXNzIH0pO1xuICAgIH0pO1xuICB9KTtcbiAgc2VydmVyLnBvc3Q8eyBCb2R5OiBBcHBseUJvZHkgfT4oXCIvYXBpL21pZ3JhdGlvbnMvYXBwbHlcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgYXNzZXJ0VGFyZ2V0cyhtaWdyYXRvciwgcmVxdWVzdC5ib2R5LnRhcmdldHMpO1xuICAgIGNvbnN0IHN0YXR1c2VzID0gYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIHJlcXVlc3QuYm9keS50YXJnZXRzKTtcbiAgICBjb25zdCBhcHByb3ZhbCA9IGF3YWl0IHJlcXVpcmVBcHByb3ZlZEFwcGx5KHJlcXVlc3QuYm9keSwgc3RhdHVzZXMpO1xuICAgIHJldHVybiBzZW5kTWlncmF0aW9uU3RyZWFtKFxuICAgICAgcmVwbHksXG4gICAgICBcImFwcGx5XCIsXG4gICAgICByZXF1ZXN0LmJvZHkudGFyZ2V0cyxcbiAgICAgIChvblByb2dyZXNzKSA9PiBtaWdyYXRvci5hcHBseShyZXF1ZXN0LmJvZHkudGFyZ2V0cywgeyBvblByb2dyZXNzIH0pLFxuICAgICAgYXBwcm92YWwgPT09IG51bGxcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgU2xhY2tDb25maXJtKCkubG9nRXhlY3V0aW9uKFxuICAgICAgICAgICAgICBhcHByb3ZhbC5jaGFubmVsLFxuICAgICAgICAgICAgICBhcHByb3ZhbC50cyxcbiAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICByZXF1ZXN0LmJvZHkucmVxdWVzdG9yLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICk7XG4gIH0pO1xuICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsgdGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10gfSB9PihcbiAgICBcIi9hcGkvbWlncmF0aW9ucy9yb2xsYmFja1wiLFxuICAgIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgYXNzZXJ0VGFyZ2V0cyhtaWdyYXRvciwgcmVxdWVzdC5ib2R5LnRhcmdldHMpO1xuICAgICAgYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIHJlcXVlc3QuYm9keS50YXJnZXRzKTtcbiAgICAgIHJldHVybiBzZW5kTWlncmF0aW9uU3RyZWFtKHJlcGx5LCBcInJvbGxiYWNrXCIsIHJlcXVlc3QuYm9keS50YXJnZXRzLCAob25Qcm9ncmVzcykgPT4ge1xuICAgICAgICByZXR1cm4gbWlncmF0b3Iucm9sbGJhY2socmVxdWVzdC5ib2R5LnRhcmdldHMsIHsgb25Qcm9ncmVzcyB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICk7XG5cbiAgc2VydmVyLnBvc3Q8eyBCb2R5OiB7IGNvbXBhcmVDb25uS2V5PzogTWlncmF0aW9uVGFyZ2V0IH0gfT4oXG4gICAgXCIvYXBpL21pZ3JhdGlvbnMvZ2VuZXJhdGVQcmVwYXJlZENvZGVzXCIsXG4gICAgYXN5bmMgKHJlcXVlc3QpID0+IG1pZ3JhdG9yLmdlbmVyYXRlUHJlcGFyZWRDb2RlcyhyZXF1ZXN0LmJvZHkuY29tcGFyZUNvbm5LZXkpLFxuICApO1xuXG4gIC8vIOydtOyghCBVSSDrsojrk6Tqs7wg7Jm467aAIOyKpO2BrOumve2KuOqwgCDsg4gg7ISc67KE7JeQ7ISc64+EIO2VnCDrprTrpqzsiqQg64+Z7JWIIOuPmeyeke2VmOuPhOuhnSDsnKDsp4Dtlanri4jri6QuXG4gIHNlcnZlci5wb3N0PHtcbiAgICBCb2R5OiB7XG4gICAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIiB8IFwic2hhZG93XCI7XG4gICAgICB0YXJnZXRzOiAoa2V5b2YgU29uYW11REJDb25maWcpW107XG4gICAgICBmb3JjZT86IGJvb2xlYW47XG4gICAgICBmb3JjZVJlYXNvbj86IHN0cmluZztcbiAgICAgIHJlcXVlc3Rvcj86IHN0cmluZztcbiAgICB9O1xuICB9PihcIi9hcGkvbWlncmF0aW9ucy9ydW5BY3Rpb25cIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICBpZiAocmVxdWVzdC5ib2R5LmFjdGlvbiA9PT0gXCJzaGFkb3dcIikge1xuICAgICAgcmV0dXJuIG1pZ3JhdG9yLnJ1blNoYWRvd1Rlc3QoKTtcbiAgICB9XG4gICAgaWYgKHJlcXVlc3QuYm9keS5hY3Rpb24gPT09IFwiYXBwbHlcIikge1xuICAgICAgcmV0dXJuIHJ1bkxlZ2FjeUFwcGx5KG1pZ3JhdG9yLCByZXF1ZXN0LmJvZHkpO1xuICAgIH1cbiAgICBhc3NlcnRUYXJnZXRzKG1pZ3JhdG9yLCByZXF1ZXN0LmJvZHkudGFyZ2V0cyk7XG4gICAgYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIHJlcXVlc3QuYm9keS50YXJnZXRzKTtcbiAgICByZXR1cm4gbWlncmF0b3Iucm9sbGJhY2socmVxdWVzdC5ib2R5LnRhcmdldHMpO1xuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBOEJBLFNBQVMsY0FBYyxVQUFvQixTQUFrQztDQUMzRSxNQUFNLFVBQVUsSUFBSSxJQUFJLFNBQVMsZUFBZSxDQUFDLENBQUMsS0FBSyxFQUFFLGNBQWMsT0FBTyxDQUFDO0NBQy9FLE1BQU0sVUFBVSxRQUFRLFFBQVEsV0FBVyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUM7Q0FDL0QsSUFBSSxRQUFRLFdBQVcsS0FBSyxRQUFRLFNBQVMsR0FDM0MsTUFBTSxJQUFJLG9CQUFvQixHQUFHLGtCQUFrQixHQUFHLEVBQ3BELFNBQVMsOEJBQThCLFFBQVEsV0FBVyxJQUFJLFlBQVksUUFBUSxLQUFLLElBQUksSUFDN0YsQ0FBQztBQUVMO0FBRUEsU0FBUyx1QkFBdUIsT0FBcUIsUUFBa0M7Q0FDckYsTUFBTSxhQUFhLE9BQU8sU0FBUyxPQUFPLEVBQUU7Q0FFNUMsT0FBTyxDQURTLFlBQVksS0FBSyxZQUFZLFFBQVEsWUFBQSxDQUFhLFlBQVksQ0FBQyxLQUM5RCxNQUFNLHlCQUF5QixNQUFNO0FBQ3hEO0FBRUEsZUFBZSwyQkFDYixVQUNBLFNBQ3NDO0NBQ3RDLE1BQU0sV0FBVyxNQUFNLFFBQVEsSUFBSSxRQUFRLEtBQUssV0FBVyxTQUFTLG9CQUFvQixNQUFNLENBQUMsQ0FBQztDQUNoRyxNQUFNLFNBQVMsU0FBUyxRQUFRLEVBQUUsUUFBUSxZQUFZLFdBQVcsV0FBVyxVQUFVLE1BQVM7Q0FDL0YsSUFBSSxPQUFPLFNBQVMsR0FDbEIsTUFBTSxJQUFJLG9CQUFvQixHQUFHLGtCQUFrQixHQUFHLEVBQ3BELFNBQVMsMkNBQTJDLE9BQU8sS0FBSyxFQUFFLGNBQWMsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQ3BHLENBQUM7Q0FFSCxPQUFPO0FBQ1Q7QUFFQSxTQUFTLHFCQUFxQixVQUF1QztDQUNuRSxPQUFPLENBQUMsR0FBRyxJQUFJLElBQUksU0FBUyxTQUFTLEVBQUUsY0FBYyxPQUFPLENBQUMsQ0FBQztBQUNoRTtBQUVBLGVBQWUsZ0JBQ2IsVUFDQSxTQUNBLFdBQ3lCO0NBQ3pCLGNBQWMsVUFBVSxPQUFPO0NBQy9CLE1BQU0sV0FBVyxNQUFNLDJCQUEyQixVQUFVLE9BQU87Q0FDbkUsTUFBTSxRQUFRLElBQUksYUFBYTtDQUUvQixJQUFJLENBRHFCLFFBQVEsTUFBTSxXQUFXLHVCQUF1QixPQUFPLE1BQU0sQ0FDakYsS0FBb0IsQ0FBQyxNQUFNLGFBQWEsR0FDM0MsT0FBTyxFQUFFLE1BQU0sUUFBUTtDQUd6QixNQUFNLFVBQVUscUJBQXFCLFFBQVE7Q0FDN0MsSUFBSSxRQUFRLFdBQVcsR0FDckIsT0FBTyxFQUFFLE1BQU0sUUFBUTtDQUd6QixNQUFNLFdBQVcsTUFBTSxNQUFNLG1CQUFtQixPQUFPO0NBQ3ZELElBQUksYUFBYSxNQUFNO0VBQ3JCLE1BQU0sV0FBVyxNQUFNLE1BQU0sY0FBYyxTQUFTLFNBQVMsU0FBUyxFQUFFO0VBQ3hFLElBQUksU0FBUyxVQUNYLE9BQU8sRUFBRSxNQUFNLFFBQVE7RUFFekIsSUFBSSxTQUFTLFVBQ1gsTUFBTSxJQUFJLG9CQUFvQixHQUFHLGdDQUFnQyxDQUFDO0VBRXBFLE9BQU87R0FBRSxNQUFNO0dBQVcsR0FBRztFQUFTO0NBQ3hDO0NBRUEsTUFBTSxVQUFVLE1BQU0sTUFBTSxvQkFBb0IsU0FBUyxTQUFTLFNBQVM7Q0FDM0UsTUFBTSxNQUFNLFlBQVksU0FBUyxRQUFRLFNBQVMsUUFBUSxFQUFFO0NBQzVELE9BQU87RUFBRSxNQUFNO0VBQVcsR0FBRztDQUFRO0FBQ3ZDO0FBRUEsZUFBZSxxQkFDYixNQUNBLFVBQ2lEO0NBQ2pELE1BQU0sUUFBUSxJQUFJLGFBQWE7Q0FFL0IsSUFBSSxDQURxQixLQUFLLFFBQVEsTUFBTSxXQUFXLHVCQUF1QixPQUFPLE1BQU0sQ0FDdEYsS0FBb0IsQ0FBQyxNQUFNLGFBQWEsR0FDM0MsT0FBTztDQUdULE1BQU0sVUFBVSxxQkFBcUIsUUFBUTtDQUM3QyxJQUFJLFFBQVEsV0FBVyxHQUNyQixPQUFPO0NBR1QsTUFBTSxXQUFXLE1BQU0sTUFBTSxtQkFBbUIsT0FBTztDQUN2RCxJQUFJLGFBQWEsTUFDZixNQUFNLElBQUksb0JBQW9CLEdBQUcsa0JBQWtCLEdBQUcsRUFDcEQsU0FBUyx3Q0FDWCxDQUFDO0NBRUgsTUFBTSxXQUFXLE1BQU0sTUFBTSxjQUFjLFNBQVMsU0FBUyxTQUFTLEVBQUU7Q0FDeEUsSUFBSSxTQUFTLFVBQ1gsTUFBTSxJQUFJLG9CQUFvQixHQUFHLGdDQUFnQyxDQUFDO0NBRXBFLElBQUksQ0FBQyxTQUFTLFVBQ1osTUFBTSxJQUFJLG9CQUFvQixHQUFHLGtCQUFrQixHQUFHLEVBQ3BELFNBQVMsa0NBQ1gsQ0FBQztDQUVILE9BQU87QUFDVDtBQUVBLGVBQWUsZUFDYixVQUNBLE1BQ3NEO0NBQ3RELGNBQWMsVUFBVSxLQUFLLE9BQU87Q0FDcEMsTUFBTSxXQUFXLE1BQU0sMkJBQTJCLFVBQVUsS0FBSyxPQUFPO0NBQ3hFLE1BQU0sUUFBUSxJQUFJLGFBQWE7Q0FFL0IsSUFBSSxDQURxQixLQUFLLFFBQVEsTUFBTSxXQUFXLHVCQUF1QixPQUFPLE1BQU0sQ0FDdEYsS0FBb0IsQ0FBQyxNQUFNLGFBQWEsR0FDM0MsT0FBTyxTQUFTLE1BQU0sS0FBSyxPQUFPO0NBR3BDLE1BQU0sVUFBVSxxQkFBcUIsUUFBUTtDQUM3QyxJQUFJLFFBQVEsV0FBVyxHQUNyQixPQUFPLFNBQVMsTUFBTSxLQUFLLE9BQU87Q0FHcEMsTUFBTSxXQUFXLE1BQU0sTUFBTSxtQkFBbUIsT0FBTztDQUN2RCxJQUFJLGFBQWEsTUFBTTtFQUNyQixNQUFNLFVBQVUsTUFBTSxNQUFNLG9CQUFvQixTQUFTLEtBQUssU0FBUyxLQUFLLFNBQVM7RUFDckYsTUFBTSxNQUFNLFlBQVksU0FBUyxRQUFRLFNBQVMsUUFBUSxFQUFFO0VBQzVELE9BQU87R0FBRSxNQUFNO0dBQVcsR0FBRztFQUFRO0NBQ3ZDO0NBRUEsTUFBTSxXQUFXLE1BQU0sTUFBTSxjQUFjLFNBQVMsU0FBUyxTQUFTLEVBQUU7Q0FDeEUsSUFBSSxTQUFTLFVBQ1gsTUFBTSxJQUFJLG9CQUFvQixHQUFHLGdDQUFnQyxDQUFDO0NBRXBFLElBQUksQ0FBQyxTQUFTLFlBQVksQ0FBQyxLQUFLLE9BQzlCLE9BQU87RUFBRSxNQUFNO0VBQVcsR0FBRztDQUFTO0NBRXhDLElBQUksQ0FBQyxTQUFTLFVBQ1osTUFBTSxNQUFNLGNBQ1YsU0FBUyxTQUNULFNBQVMsSUFDVCxLQUFLLGVBQWUsU0FDcEIsS0FBSyxTQUNQO0NBR0YsTUFBTSxTQUFTLE1BQU0sU0FBUyxNQUFNLEtBQUssT0FBTztDQUNoRCxJQUFJLE9BQU8sU0FBUyxHQUNsQixNQUFNLE1BQU0sYUFBYSxTQUFTLFNBQVMsU0FBUyxJQUFJLFFBQVEsS0FBSyxTQUFTO0NBRWhGLE9BQU87QUFDVDtBQUVBLFNBQVMsb0JBQ1AsT0FDQSxRQUNBLFNBQ0EsS0FDQSxlQUNBO0NBQ0EsTUFBTSxTQUFTLElBQUksWUFBWTtDQUMvQixJQUFJLFdBQVc7Q0FDZixJQUFJO0NBQ0osTUFBTSxtQkFBc0MsQ0FBQztDQUM3QyxNQUFNLFNBQVMsVUFBZ0M7RUFDN0MsSUFBSSxZQUFZLENBQUMsT0FBTyxXQUN0QixPQUFPLE1BQU0sR0FBRyxLQUFLLFVBQVUsS0FBSyxFQUFFLEdBQUc7Q0FFN0M7Q0FFQSxPQUFPLEdBQUcsZUFBZTtFQUN2QixXQUFXO0NBQ2IsQ0FBQztDQUNELE1BQ0csT0FBTyxnQkFBZ0IscUNBQXFDLENBQUMsQ0FDN0QsT0FBTyxpQkFBaUIsd0JBQXdCLENBQUMsQ0FDakQsT0FBTyxvQkFBb0IsVUFBVSxDQUFDLENBQ3RDLE9BQU8sb0JBQW9CLEdBQUc7Q0FFakMsQ0FBTSxZQUFZO0VBQ2hCLElBQUk7R0FDRixNQUFNLFNBQVMsTUFBTSxLQUFLLFVBQVU7SUFDbEMsSUFBSSxNQUFNLFNBQVMsbUJBQW1CO0tBQ3BDLElBQUksTUFBTSxZQUFZLFVBQVUsaUJBQWlCLEtBQUssTUFBTSxPQUFPO0tBQ25FLE1BQU0sS0FBSztLQUVYLFVBQVU7S0FDVjtJQUNGO0lBQ0EsVUFBVTtJQUNWLE1BQU0sS0FBSztHQUNiLENBQUM7R0FDRCxNQUFNLGdCQUFnQixNQUFNO0dBQzVCLE1BQU07SUFBRSxNQUFNO0lBQVk7R0FBTyxDQUFDO0VBQ3BDLFNBQVMsUUFBUTtHQUlmLE1BQU07SUFDSixNQUFNO0lBQ047SUFDQSxTQU5jLGtCQUFrQixRQUFRLE9BQU8sVUFBVSxPQUFPLE1BQU07SUFPdEUsU0FMQSxrQkFBa0IsZ0NBQWdDLE9BQU8sVUFBVSxTQUFTO0lBTTVFLE1BQ0UsU0FBUyxTQUFTLGdCQUFnQixTQUFTLFNBQVMsa0JBQ2hELFFBQVEsT0FDUjtJQUNOO0lBQ0EsZ0JBQWdCLFFBQVEsUUFBUSxXQUFXLENBQUMsaUJBQWlCLFNBQVMsTUFBTSxDQUFDO0dBQy9FLENBQUM7RUFDSCxVQUFVO0dBQ1IsSUFBSSxDQUFDLE9BQU8sV0FDVixPQUFPLElBQUk7RUFFZjtDQUNGLEVBQUEsQ0FBRztDQUVILE9BQU8sTUFBTSxLQUFLLE1BQU07QUFDMUI7QUFFQSxlQUFzQixzQkFBc0IsUUFBeUI7Q0FDbkUsTUFBTSxXQUFXLElBQUksU0FBUztDQUU5QixPQUFPLElBQUksK0JBQStCLGFBQWEsRUFDckQsYUFBYSxTQUFTLGVBQWUsRUFDdkMsRUFBRTtDQUNGLE9BQU8sSUFBSSx5QkFBeUIsYUFBYSxFQUFFLE9BQU8sTUFBTSxTQUFTLGtCQUFrQixFQUFFLEVBQUU7Q0FDL0YsT0FBTyxJQUEyQyx3QkFBd0IsT0FBTyxZQUFZO0VBQzNGLE1BQU0saUJBQWlCLE1BQU0sU0FBUyxrQkFBa0IsRUFBQSxDQUFHLE1BQ3hELEVBQUUsV0FBVyxTQUFTLFFBQVEsTUFBTSxRQUN2QztFQUNBLElBQUksa0JBQWtCLFFBQ3BCLE1BQU0sSUFBSSxvQkFBb0IsR0FBRyxrQkFBa0IsQ0FBQztFQUV0RCxPQUFPLEVBQUUsTUFBTSxNQUFNLFNBQVMsY0FBYyxNQUFNLE1BQU0sRUFBRTtDQUM1RCxDQUFDO0NBQ0QsT0FBTyxJQUNMLDBCQUNBLE9BQU8sWUFBWTtFQUNqQixJQUFJLFFBQVEsTUFBTSxZQUFZLFFBQzVCLE9BQU8sRUFBRSxRQUFRLE1BQU0sU0FBUyxVQUFVLEVBQUU7RUFFOUMsT0FBTyxFQUFFLFFBQVEsTUFBTSxTQUFTLG9CQUFvQixRQUFRLE1BQU0sT0FBTyxFQUFFO0NBQzdFLENBQ0Y7Q0FDQSxPQUFPLElBQ0wsa0NBQ0EsT0FBTyxhQUFhLEVBQ2xCLGVBQWUsTUFBTSxTQUFTLGlCQUFpQixRQUFRLE1BQU0sY0FBYyxFQUM3RSxFQUNGO0NBRUEsT0FBTyxLQUEwQixvQ0FBb0MsT0FBTyxZQUFZO0VBQ3RGLE9BQU8sZ0JBQWdCLFVBQVUsUUFBUSxLQUFLLFNBQVMsUUFBUSxLQUFLLFNBQVM7Q0FDL0UsQ0FBQztDQUNELE9BQU8sS0FDTCxpQ0FDQSxPQUFPLFlBQVk7RUFDakIsTUFBTSxRQUFRLElBQUksYUFBYTtFQUMvQixPQUFPLE1BQU0sYUFBYSxJQUN0QixNQUFNLGNBQWMsUUFBUSxLQUFLLFNBQVMsUUFBUSxLQUFLLEVBQUUsSUFDekQ7R0FBRSxVQUFVO0dBQU0sVUFBVTtFQUFNO0NBQ3hDLENBQ0Y7Q0FDQSxPQUFPLEtBRUosaUNBQWlDLE9BQU8sWUFBWTtFQUNyRCxNQUFNLFFBQVEsSUFBSSxhQUFhO0VBQy9CLElBQUksQ0FBQyxNQUFNLGFBQWEsR0FDdEIsTUFBTSxJQUFJLG9CQUFvQixHQUFHLHdDQUF3QyxDQUFDO0VBRTVFLE1BQU0sTUFBTSxjQUNWLFFBQVEsS0FBSyxTQUNiLFFBQVEsS0FBSyxJQUNiLFFBQVEsS0FBSyxRQUNiLFFBQVEsS0FBSyxTQUNmO0VBQ0EsT0FBTyxFQUFFLFNBQVMsS0FBSztDQUN6QixDQUFDO0NBRUQsT0FBTyxLQUFLLDBCQUEwQixPQUFPLFVBQVUsVUFBVTtFQUMvRCxPQUFPLG9CQUFvQixPQUFPLFVBQVUsQ0FBQyxJQUFJLGVBQWU7R0FDOUQsT0FBTyxTQUFTLGNBQWMsRUFBRSxXQUFXLENBQUM7RUFDOUMsQ0FBQztDQUNILENBQUM7Q0FDRCxPQUFPLEtBQTBCLHlCQUF5QixPQUFPLFNBQVMsVUFBVTtFQUNsRixjQUFjLFVBQVUsUUFBUSxLQUFLLE9BQU87RUFDNUMsTUFBTSxXQUFXLE1BQU0sMkJBQTJCLFVBQVUsUUFBUSxLQUFLLE9BQU87RUFDaEYsTUFBTSxXQUFXLE1BQU0scUJBQXFCLFFBQVEsTUFBTSxRQUFRO0VBQ2xFLE9BQU8sb0JBQ0wsT0FDQSxTQUNBLFFBQVEsS0FBSyxVQUNaLGVBQWUsU0FBUyxNQUFNLFFBQVEsS0FBSyxTQUFTLEVBQUUsV0FBVyxDQUFDLEdBQ25FLGFBQWEsT0FDVCxTQUNBLE9BQU8sV0FBVztHQUNoQixNQUFNLElBQUksYUFBYSxDQUFDLENBQUMsYUFDdkIsU0FBUyxTQUNULFNBQVMsSUFDVCxRQUNBLFFBQVEsS0FBSyxTQUNmO0VBQ0YsQ0FDTjtDQUNGLENBQUM7Q0FDRCxPQUFPLEtBQ0wsNEJBQ0EsT0FBTyxTQUFTLFVBQVU7RUFDeEIsY0FBYyxVQUFVLFFBQVEsS0FBSyxPQUFPO0VBQzVDLE1BQU0sMkJBQTJCLFVBQVUsUUFBUSxLQUFLLE9BQU87RUFDL0QsT0FBTyxvQkFBb0IsT0FBTyxZQUFZLFFBQVEsS0FBSyxVQUFVLGVBQWU7R0FDbEYsT0FBTyxTQUFTLFNBQVMsUUFBUSxLQUFLLFNBQVMsRUFBRSxXQUFXLENBQUM7RUFDL0QsQ0FBQztDQUNILENBQ0Y7Q0FFQSxPQUFPLEtBQ0wseUNBQ0EsT0FBTyxZQUFZLFNBQVMsc0JBQXNCLFFBQVEsS0FBSyxjQUFjLENBQy9FO0NBR0EsT0FBTyxLQVFKLDZCQUE2QixPQUFPLFlBQVk7RUFDakQsSUFBSSxRQUFRLEtBQUssV0FBVyxVQUMxQixPQUFPLFNBQVMsY0FBYztFQUVoQyxJQUFJLFFBQVEsS0FBSyxXQUFXLFNBQzFCLE9BQU8sZUFBZSxVQUFVLFFBQVEsSUFBSTtFQUU5QyxjQUFjLFVBQVUsUUFBUSxLQUFLLE9BQU87RUFDNUMsTUFBTSwyQkFBMkIsVUFBVSxRQUFRLEtBQUssT0FBTztFQUMvRCxPQUFPLFNBQVMsU0FBUyxRQUFRLEtBQUssT0FBTztDQUMvQyxDQUFDO0FBQ0g7OzthQTNXc0M7U0FFUDtvQkFDa0M7ZUFLbkM7b0JBQzJEO0NBY25GLDhCQUFjLElBQUksSUFBSTtFQUFDO0VBQWE7RUFBYTtFQUFXO0NBQUssQ0FBQyJ9
|
|
215
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9ucy1hcGkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpL21pZ3JhdGlvbnMtYXBpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBQYXNzVGhyb3VnaCB9IGZyb20gXCJzdHJlYW1cIjtcblxuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5SW5zdGFuY2UsIHR5cGUgRmFzdGlmeVJlcGx5IH0gZnJvbSBcImZhc3RpZnlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uL2RpY3Qvc2RcIjtcbmltcG9ydCB7IEJhZFJlcXVlc3RFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQge1xuICBNaWdyYXRvcixcbiAgTWlncmF0aW9uVGFyZ2V0RXhlY3V0aW9uRXJyb3IsXG4gIHR5cGUgTWlncmF0aW9uUmVzdWx0LFxufSBmcm9tIFwiLi4vbWlncmF0aW9uL21pZ3JhdG9yXCI7XG5pbXBvcnQgeyBTbGFja0NvbmZpcm0sIHR5cGUgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdCB9IGZyb20gXCIuLi9taWdyYXRpb24vc2xhY2stY29uZmlybVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBNaWdyYXRpb25BY3Rpb24sXG4gIHR5cGUgTWlncmF0aW9uQ29ubmVjdGlvblN0YXR1cyxcbiAgdHlwZSBNaWdyYXRpb25Qcm9ncmVzc0V2ZW50LFxuICB0eXBlIE1pZ3JhdGlvblN0cmVhbUV2ZW50LFxuICB0eXBlIE1pZ3JhdGlvblRhcmdldCxcbn0gZnJvbSBcIi4uL21pZ3JhdGlvbi90eXBlc1wiO1xuaW1wb3J0IHsgZm9yd2FyZEFzeW5jRXJyb3JzIH0gZnJvbSBcIi4vYXN5bmMtcm91dGVcIjtcblxudHlwZSBBcHByb3ZhbFJlYWR5ID0geyB0eXBlOiBcInJlYWR5XCIgfTtcbnR5cGUgQXBwcm92YWxSZXN1bHQgPSBBcHByb3ZhbFJlYWR5IHwgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdDtcbnR5cGUgQXBwbHlCb2R5ID0geyB0YXJnZXRzOiBNaWdyYXRpb25UYXJnZXRbXTsgcmVxdWVzdG9yPzogc3RyaW5nIH07XG50eXBlIExlZ2FjeUFwcGx5Qm9keSA9IEFwcGx5Qm9keSAmIHsgZm9yY2U/OiBib29sZWFuOyBmb3JjZVJlYXNvbj86IHN0cmluZyB9O1xuXG5jb25zdCBMT0NBTF9IT1NUUyA9IG5ldyBTZXQoW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXSk7XG5cbmZ1bmN0aW9uIGFzc2VydFRhcmdldHMobWlncmF0b3I6IE1pZ3JhdG9yLCB0YXJnZXRzOiBNaWdyYXRpb25UYXJnZXRbXSk6IHZvaWQge1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldChtaWdyYXRvci5nZXRDb25uZWN0aW9ucygpLm1hcCgoeyBjb25uS2V5IH0pID0+IGNvbm5LZXkpKTtcbiAgY29uc3QgaW52YWxpZCA9IHRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+ICFhbGxvd2VkLmhhcyh0YXJnZXQpKTtcbiAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwIHx8IGludmFsaWQubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IuYmFkUmVxdWVzdFwiKSwge1xuICAgICAgbWVzc2FnZTogYEludmFsaWQgbWlncmF0aW9uIHRhcmdldHM6ICR7aW52YWxpZC5sZW5ndGggPT09IDAgPyBcIihlbXB0eSlcIiA6IGludmFsaWQuam9pbihcIiwgXCIpfWAsXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGFyZ2V0UmVxdWlyZXNBcHByb3ZhbChzbGFjazogU2xhY2tDb25maXJtLCB0YXJnZXQ6IE1pZ3JhdGlvblRhcmdldCk6IGJvb2xlYW4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gLyogU0FGRVRZOiBVSSDrj4TqtazsnZggWm9kIOyeheugpSDsiqTtgqTrp4jqsIAg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBTb25hbXVcbiAgICAuZGJDb25maWdbdGFyZ2V0XT8uY29ubmVjdGlvbiBhcyB7IGhvc3Q/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVtb3RlID0gIUxPQ0FMX0hPU1RTLmhhcygoY29ubmVjdGlvbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiKS50b0xvd2VyQ2FzZSgpKTtcbiAgcmV0dXJuIHJlbW90ZSAmJiBzbGFjay5pc1RhcmdldFJlcXVpcmVzQXBwcm92YWwodGFyZ2V0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMoXG4gIG1pZ3JhdG9yOiBNaWdyYXRvcixcbiAgdGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10sXG4pOiBQcm9taXNlPE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXNbXT4ge1xuICBjb25zdCBzdGF0dXNlcyA9IGF3YWl0IFByb21pc2UuYWxsKHRhcmdldHMubWFwKCh0YXJnZXQpID0+IG1pZ3JhdG9yLmdldENvbm5lY3Rpb25TdGF0dXModGFyZ2V0KSkpO1xuICBjb25zdCBmYWlsZWQgPSBzdGF0dXNlcy5maWx0ZXIoKHsgc3RhdHVzLCBlcnJvciB9KSA9PiBzdGF0dXMgPT09IFwiZXJyb3JcIiB8fCBlcnJvciAhPT0gdW5kZWZpbmVkKTtcbiAgaWYgKGZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci5iYWRSZXF1ZXN0XCIpLCB7XG4gICAgICBtZXNzYWdlOiBgTWlncmF0aW9uIHN0YXR1cyBjb3VsZCBub3QgYmUgdmVyaWZpZWQ6ICR7ZmFpbGVkLm1hcCgoeyBjb25uS2V5IH0pID0+IGNvbm5LZXkpLmpvaW4oXCIsIFwiKX1gLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBzdGF0dXNlcztcbn1cblxuZnVuY3Rpb24gZ2V0UGVuZGluZ01pZ3JhdGlvbnMoc3RhdHVzZXM6IE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXNbXSkge1xuICByZXR1cm4gWy4uLm5ldyBTZXQoc3RhdHVzZXMuZmxhdE1hcCgoeyBwZW5kaW5nIH0pID0+IHBlbmRpbmcpKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RBcHByb3ZhbChcbiAgbWlncmF0b3I6IE1pZ3JhdG9yLFxuICB0YXJnZXRzOiBNaWdyYXRpb25UYXJnZXRbXSxcbiAgcmVxdWVzdG9yPzogc3RyaW5nLFxuKTogUHJvbWlzZTxBcHByb3ZhbFJlc3VsdD4ge1xuICBhc3NlcnRUYXJnZXRzKG1pZ3JhdG9yLCB0YXJnZXRzKTtcbiAgY29uc3Qgc3RhdHVzZXMgPSBhd2FpdCBnZXRBdmFpbGFibGVUYXJnZXRTdGF0dXNlcyhtaWdyYXRvciwgdGFyZ2V0cyk7XG4gIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gdGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldFJlcXVpcmVzQXBwcm92YWwoc2xhY2ssIHRhcmdldCkpO1xuICBpZiAoIXJlcXVpcmVzQXBwcm92YWwgfHwgIXNsYWNrLmlzQ29uZmlndXJlZCgpKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJyZWFkeVwiIH07XG4gIH1cblxuICBjb25zdCBwZW5kaW5nID0gZ2V0UGVuZGluZ01pZ3JhdGlvbnMoc3RhdHVzZXMpO1xuICBpZiAocGVuZGluZy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4geyB0eXBlOiBcInJlYWR5XCIgfTtcbiAgfVxuXG4gIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc2xhY2suZ2V0RXhpc3RpbmdSZXF1ZXN0KHBlbmRpbmcpO1xuICBpZiAoZXhpc3RpbmcgIT09IG51bGwpIHtcbiAgICBjb25zdCBhcHByb3ZhbCA9IGF3YWl0IHNsYWNrLmNoZWNrQXBwcm92YWwoZXhpc3RpbmcuY2hhbm5lbCwgZXhpc3RpbmcudHMpO1xuICAgIGlmIChhcHByb3ZhbC5hcHByb3ZlZCkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJyZWFkeVwiIH07XG4gICAgfVxuICAgIGlmIChhcHByb3ZhbC5yZWplY3RlZCkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IubWlncmF0aW9uUmVqZWN0ZWRcIikpO1xuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiBcInBlbmRpbmdcIiwgLi4uZXhpc3RpbmcgfTtcbiAgfVxuXG4gIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBzbGFjay5wb3N0QXBwcm92YWxSZXF1ZXN0KHBlbmRpbmcsIHRhcmdldHMsIHJlcXVlc3Rvcik7XG4gIGF3YWl0IHNsYWNrLnNhdmVSZXF1ZXN0KHBlbmRpbmcsIGNyZWF0ZWQuY2hhbm5lbCwgY3JlYXRlZC50cyk7XG4gIHJldHVybiB7IHR5cGU6IFwicGVuZGluZ1wiLCAuLi5jcmVhdGVkIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVBcHByb3ZlZEFwcGx5KFxuICBib2R5OiBBcHBseUJvZHksXG4gIHN0YXR1c2VzOiBNaWdyYXRpb25Db25uZWN0aW9uU3RhdHVzW10sXG4pOiBQcm9taXNlPHsgY2hhbm5lbDogc3RyaW5nOyB0czogc3RyaW5nIH0gfCBudWxsPiB7XG4gIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gYm9keS50YXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0UmVxdWlyZXNBcHByb3ZhbChzbGFjaywgdGFyZ2V0KSk7XG4gIGlmICghcmVxdWlyZXNBcHByb3ZhbCB8fCAhc2xhY2suaXNDb25maWd1cmVkKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBlbmRpbmcgPSBnZXRQZW5kaW5nTWlncmF0aW9ucyhzdGF0dXNlcyk7XG4gIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzbGFjay5nZXRFeGlzdGluZ1JlcXVlc3QocGVuZGluZyk7XG4gIGlmIChleGlzdGluZyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IuYmFkUmVxdWVzdFwiKSwge1xuICAgICAgbWVzc2FnZTogXCJTbGFjayBhcHByb3ZhbCBoYXMgbm90IGJlZW4gcmVxdWVzdGVkXCIsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgYXBwcm92YWwgPSBhd2FpdCBzbGFjay5jaGVja0FwcHJvdmFsKGV4aXN0aW5nLmNoYW5uZWwsIGV4aXN0aW5nLnRzKTtcbiAgaWYgKGFwcHJvdmFsLnJlamVjdGVkKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IubWlncmF0aW9uUmVqZWN0ZWRcIikpO1xuICB9XG4gIGlmICghYXBwcm92YWwuYXBwcm92ZWQpIHtcbiAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcImVycm9yLmJhZFJlcXVlc3RcIiksIHtcbiAgICAgIG1lc3NhZ2U6IFwiU2xhY2sgYXBwcm92YWwgaXMgc3RpbGwgcGVuZGluZ1wiLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBleGlzdGluZztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuTGVnYWN5QXBwbHkoXG4gIG1pZ3JhdG9yOiBNaWdyYXRvcixcbiAgYm9keTogTGVnYWN5QXBwbHlCb2R5LFxuKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQgfCBTbGFja0NvbmZpcm1QZW5kaW5nUmVzdWx0PiB7XG4gIGFzc2VydFRhcmdldHMobWlncmF0b3IsIGJvZHkudGFyZ2V0cyk7XG4gIGNvbnN0IHN0YXR1c2VzID0gYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIGJvZHkudGFyZ2V0cyk7XG4gIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gYm9keS50YXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0UmVxdWlyZXNBcHByb3ZhbChzbGFjaywgdGFyZ2V0KSk7XG4gIGlmICghcmVxdWlyZXNBcHByb3ZhbCB8fCAhc2xhY2suaXNDb25maWd1cmVkKCkpIHtcbiAgICByZXR1cm4gbWlncmF0b3IuYXBwbHkoYm9keS50YXJnZXRzKTtcbiAgfVxuXG4gIGNvbnN0IHBlbmRpbmcgPSBnZXRQZW5kaW5nTWlncmF0aW9ucyhzdGF0dXNlcyk7XG4gIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBtaWdyYXRvci5hcHBseShib2R5LnRhcmdldHMpO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzbGFjay5nZXRFeGlzdGluZ1JlcXVlc3QocGVuZGluZyk7XG4gIGlmIChleGlzdGluZyA9PT0gbnVsbCkge1xuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBzbGFjay5wb3N0QXBwcm92YWxSZXF1ZXN0KHBlbmRpbmcsIGJvZHkudGFyZ2V0cywgYm9keS5yZXF1ZXN0b3IpO1xuICAgIGF3YWl0IHNsYWNrLnNhdmVSZXF1ZXN0KHBlbmRpbmcsIGNyZWF0ZWQuY2hhbm5lbCwgY3JlYXRlZC50cyk7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJwZW5kaW5nXCIsIC4uLmNyZWF0ZWQgfTtcbiAgfVxuXG4gIGNvbnN0IGFwcHJvdmFsID0gYXdhaXQgc2xhY2suY2hlY2tBcHByb3ZhbChleGlzdGluZy5jaGFubmVsLCBleGlzdGluZy50cyk7XG4gIGlmIChhcHByb3ZhbC5yZWplY3RlZCkge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLm1pZ3JhdGlvblJlamVjdGVkXCIpKTtcbiAgfVxuICBpZiAoIWFwcHJvdmFsLmFwcHJvdmVkICYmICFib2R5LmZvcmNlKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJwZW5kaW5nXCIsIC4uLmV4aXN0aW5nIH07XG4gIH1cbiAgaWYgKCFhcHByb3ZhbC5hcHByb3ZlZCkge1xuICAgIGF3YWl0IHNsYWNrLmZvcmNlQXBwcm92YWwoXG4gICAgICBleGlzdGluZy5jaGFubmVsLFxuICAgICAgZXhpc3RpbmcudHMsXG4gICAgICBib2R5LmZvcmNlUmVhc29uID8/IFwi7IKs7JygIOyXhuydjFwiLFxuICAgICAgYm9keS5yZXF1ZXN0b3IsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1pZ3JhdG9yLmFwcGx5KGJvZHkudGFyZ2V0cyk7XG4gIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgIGF3YWl0IHNsYWNrLmxvZ0V4ZWN1dGlvbihleGlzdGluZy5jaGFubmVsLCBleGlzdGluZy50cywgcmVzdWx0LCBib2R5LnJlcXVlc3Rvcik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc2VuZE1pZ3JhdGlvblN0cmVhbShcbiAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgYWN0aW9uOiBNaWdyYXRpb25BY3Rpb24sXG4gIHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdLFxuICBydW46IChvblByb2dyZXNzOiAoZXZlbnQ6IE1pZ3JhdGlvblByb2dyZXNzRXZlbnQpID0+IHZvaWQpID0+IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PixcbiAgYWZ0ZXJDb21wbGV0ZT86IChyZXN1bHQ6IE1pZ3JhdGlvblJlc3VsdCkgPT4gUHJvbWlzZTx2b2lkPixcbikge1xuICBjb25zdCBzdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgbGV0IGNhbldyaXRlID0gdHJ1ZTtcbiAgbGV0IGN1cnJlbnQ6IE1pZ3JhdGlvblByb2dyZXNzRXZlbnQgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGNvbXBsZXRlZFRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdID0gW107XG4gIGNvbnN0IHdyaXRlID0gKGV2ZW50OiBNaWdyYXRpb25TdHJlYW1FdmVudCkgPT4ge1xuICAgIGlmIChjYW5Xcml0ZSAmJiAhc3RyZWFtLmRlc3Ryb3llZCkge1xuICAgICAgc3RyZWFtLndyaXRlKGAke0pTT04uc3RyaW5naWZ5KGV2ZW50KX1cXG5gKTtcbiAgICB9XG4gIH07XG5cbiAgc3RyZWFtLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgIGNhbldyaXRlID0gZmFsc2U7XG4gIH0pO1xuICByZXBseVxuICAgIC5oZWFkZXIoXCJjb250ZW50LXR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LW5kanNvbjsgY2hhcnNldD11dGYtOFwiKVxuICAgIC5oZWFkZXIoXCJjYWNoZS1jb250cm9sXCIsIFwibm8tY2FjaGUsIG5vLXRyYW5zZm9ybVwiKVxuICAgIC5oZWFkZXIoXCJjb250ZW50LWVuY29kaW5nXCIsIFwiaWRlbnRpdHlcIilcbiAgICAuaGVhZGVyKFwieC1uby1jb21wcmVzc2lvblwiLCBcIjFcIik7XG5cbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW4oKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSBcInRhcmdldC1jb21wbGV0ZVwiKSB7XG4gICAgICAgICAgaWYgKGV2ZW50LmNvbm5LZXkgIT09IFwic2hhZG93XCIpIGNvbXBsZXRlZFRhcmdldHMucHVzaChldmVudC5jb25uS2V5KTtcbiAgICAgICAgICB3cml0ZShldmVudCk7XG4gICAgICAgICAgLy8g64uk7J2MIHRhcmdldOydmCBsaWZlY3ljbGXsnbQg7Iuc7J6R65CY6riwIOyghCDsmKTrpZjrpbwg7KeB7KCEIHRhcmdldOyXkCDsnpjrqrsg6reA7IaN7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICAgICAgICBjdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gZXZlbnQ7XG4gICAgICAgIHdyaXRlKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYWZ0ZXJDb21wbGV0ZT8uKHJlc3VsdCk7XG4gICAgICB3cml0ZSh7IHR5cGU6IFwiY29tcGxldGVcIiwgcmVzdWx0IH0pO1xuICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGNhdWdodCBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0Lm1lc3NhZ2UgOiBTdHJpbmcoY2F1Z2h0KTtcbiAgICAgIGNvbnN0IGZhaWxlZFRhcmdldCA9XG4gICAgICAgIGNhdWdodCBpbnN0YW5jZW9mIE1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yID8gY2F1Z2h0LmNvbm5LZXkgOiBjdXJyZW50Py5jb25uS2V5O1xuICAgICAgd3JpdGUoe1xuICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgY29ubktleTogZmFpbGVkVGFyZ2V0LFxuICAgICAgICBmaWxlOlxuICAgICAgICAgIGN1cnJlbnQ/LnR5cGUgPT09IFwiZmlsZS1zdGFydFwiIHx8IGN1cnJlbnQ/LnR5cGUgPT09IFwiZmlsZS1leGVjdXRlZFwiXG4gICAgICAgICAgICA/IGN1cnJlbnQuZmlsZVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbXBsZXRlZFRhcmdldHMsXG4gICAgICAgIHBlbmRpbmdUYXJnZXRzOiB0YXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiAhY29tcGxldGVkVGFyZ2V0cy5pbmNsdWRlcyh0YXJnZXQpKSxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoIXN0cmVhbS5kZXN0cm95ZWQpIHtcbiAgICAgICAgc3RyZWFtLmVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSkoKTtcblxuICByZXR1cm4gcmVwbHkuc2VuZChzdHJlYW0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJNaWdyYXRpb25zQXBpKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlKSB7XG4gIGNvbnN0IG1pZ3JhdG9yID0gbmV3IE1pZ3JhdG9yKCk7XG5cbiAgc2VydmVyLmdldChcIi9hcGkvbWlncmF0aW9ucy9jb25uZWN0aW9uc1wiLCBhc3luYyAoKSA9PiAoe1xuICAgIGNvbm5lY3Rpb25zOiBtaWdyYXRvci5nZXRDb25uZWN0aW9ucygpLFxuICB9KSk7XG4gIHNlcnZlci5nZXQoXCIvYXBpL21pZ3JhdGlvbnMvY29kZXNcIiwgYXN5bmMgKCkgPT4gKHsgY29kZXM6IGF3YWl0IG1pZ3JhdG9yLmdldE1pZ3JhdGlvbkNvZGVzKCkgfSkpO1xuICBzZXJ2ZXIuZ2V0PHsgUXVlcnlzdHJpbmc6IHsgY29kZU5hbWU6IHN0cmluZyB9IH0+KFwiL2FwaS9taWdyYXRpb25zL2NvZGVcIiwgKHJlcXVlc3QpID0+XG4gICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1pZ3JhdGlvbkNvZGUgPSAoYXdhaXQgbWlncmF0b3IuZ2V0TWlncmF0aW9uQ29kZXMoKSkuZmluZChcbiAgICAgICAgKHsgbmFtZSB9KSA9PiBuYW1lID09PSByZXF1ZXN0LnF1ZXJ5LmNvZGVOYW1lLFxuICAgICAgKTtcbiAgICAgIGlmIChtaWdyYXRpb25Db2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci5iYWRSZXF1ZXN0XCIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNvZGU6IGF3YWl0IHJlYWRGaWxlKG1pZ3JhdGlvbkNvZGUucGF0aCwgXCJ1dGY4XCIpIH07XG4gICAgfSksXG4gICk7XG4gIHNlcnZlci5nZXQ8eyBRdWVyeXN0cmluZzogeyBjb25uS2V5PzogTWlncmF0aW9uVGFyZ2V0IH0gfT4oXCIvYXBpL21pZ3JhdGlvbnMvc3RhdHVzXCIsIChyZXF1ZXN0KSA9PlxuICAgIGZvcndhcmRBc3luY0Vycm9ycyhhc3luYyAoKSA9PiB7XG4gICAgICBpZiAocmVxdWVzdC5xdWVyeS5jb25uS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBhd2FpdCBtaWdyYXRvci5nZXRTdGF0dXMoKSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBhd2FpdCBtaWdyYXRvci5nZXRDb25uZWN0aW9uU3RhdHVzKHJlcXVlc3QucXVlcnkuY29ubktleSkgfTtcbiAgICB9KSxcbiAgKTtcbiAgc2VydmVyLmdldDx7IFF1ZXJ5c3RyaW5nOiB7IGNvbXBhcmVDb25uS2V5OiBNaWdyYXRpb25UYXJnZXQgfSB9PihcbiAgICBcIi9hcGkvbWlncmF0aW9ucy9wcmVwYXJlZC1jb2Rlc1wiLFxuICAgIChyZXF1ZXN0KSA9PlxuICAgICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+ICh7XG4gICAgICAgIHByZXBhcmVkQ29kZXM6IGF3YWl0IG1pZ3JhdG9yLmdldFByZXBhcmVkQ29kZXMocmVxdWVzdC5xdWVyeS5jb21wYXJlQ29ubktleSksXG4gICAgICB9KSksXG4gICk7XG5cbiAgc2VydmVyLnBvc3Q8eyBCb2R5OiBBcHBseUJvZHkgfT4oXCIvYXBpL21pZ3JhdGlvbnMvcmVxdWVzdC1hcHByb3ZhbFwiLCAocmVxdWVzdCkgPT5cbiAgICBmb3J3YXJkQXN5bmNFcnJvcnMoYXN5bmMgKCkgPT4ge1xuICAgICAgcmV0dXJuIHJlcXVlc3RBcHByb3ZhbChtaWdyYXRvciwgcmVxdWVzdC5ib2R5LnRhcmdldHMsIHJlcXVlc3QuYm9keS5yZXF1ZXN0b3IpO1xuICAgIH0pLFxuICApO1xuICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsgY2hhbm5lbDogc3RyaW5nOyB0czogc3RyaW5nIH0gfT4oXG4gICAgXCIvYXBpL21pZ3JhdGlvbnMvY2hlY2tBcHByb3ZhbFwiLFxuICAgIChyZXF1ZXN0KSA9PlxuICAgICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2xhY2sgPSBuZXcgU2xhY2tDb25maXJtKCk7XG4gICAgICAgIHJldHVybiBzbGFjay5pc0NvbmZpZ3VyZWQoKVxuICAgICAgICAgID8gc2xhY2suY2hlY2tBcHByb3ZhbChyZXF1ZXN0LmJvZHkuY2hhbm5lbCwgcmVxdWVzdC5ib2R5LnRzKVxuICAgICAgICAgIDogeyBhcHByb3ZlZDogdHJ1ZSwgcmVqZWN0ZWQ6IGZhbHNlIH07XG4gICAgICB9KSxcbiAgKTtcbiAgc2VydmVyLnBvc3Q8e1xuICAgIEJvZHk6IHsgY2hhbm5lbDogc3RyaW5nOyB0czogc3RyaW5nOyByZWFzb246IHN0cmluZzsgcmVxdWVzdG9yPzogc3RyaW5nIH07XG4gIH0+KFwiL2FwaS9taWdyYXRpb25zL2ZvcmNlQXBwcm92YWxcIiwgKHJlcXVlc3QpID0+XG4gICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICAgICAgaWYgKCFzbGFjay5pc0NvbmZpZ3VyZWQoKSkge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5zbGFja0NvbmZpcm1Ob3RDb25maWd1cmVkXCIpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHNsYWNrLmZvcmNlQXBwcm92YWwoXG4gICAgICAgIHJlcXVlc3QuYm9keS5jaGFubmVsLFxuICAgICAgICByZXF1ZXN0LmJvZHkudHMsXG4gICAgICAgIHJlcXVlc3QuYm9keS5yZWFzb24sXG4gICAgICAgIHJlcXVlc3QuYm9keS5yZXF1ZXN0b3IsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH0pLFxuICApO1xuXG4gIHNlcnZlci5wb3N0KFwiL2FwaS9taWdyYXRpb25zL3NoYWRvd1wiLCBhc3luYyAoX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgcmV0dXJuIHNlbmRNaWdyYXRpb25TdHJlYW0ocmVwbHksIFwic2hhZG93XCIsIFtdLCAob25Qcm9ncmVzcykgPT4ge1xuICAgICAgcmV0dXJuIG1pZ3JhdG9yLnJ1blNoYWRvd1Rlc3QoeyBvblByb2dyZXNzIH0pO1xuICAgIH0pO1xuICB9KTtcbiAgc2VydmVyLnBvc3Q8eyBCb2R5OiBBcHBseUJvZHkgfT4oXCIvYXBpL21pZ3JhdGlvbnMvYXBwbHlcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgYXNzZXJ0VGFyZ2V0cyhtaWdyYXRvciwgcmVxdWVzdC5ib2R5LnRhcmdldHMpO1xuICAgIGNvbnN0IHN0YXR1c2VzID0gYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIHJlcXVlc3QuYm9keS50YXJnZXRzKTtcbiAgICBjb25zdCBhcHByb3ZhbCA9IGF3YWl0IHJlcXVpcmVBcHByb3ZlZEFwcGx5KHJlcXVlc3QuYm9keSwgc3RhdHVzZXMpO1xuICAgIHJldHVybiBzZW5kTWlncmF0aW9uU3RyZWFtKFxuICAgICAgcmVwbHksXG4gICAgICBcImFwcGx5XCIsXG4gICAgICByZXF1ZXN0LmJvZHkudGFyZ2V0cyxcbiAgICAgIChvblByb2dyZXNzKSA9PiBtaWdyYXRvci5hcHBseShyZXF1ZXN0LmJvZHkudGFyZ2V0cywgeyBvblByb2dyZXNzIH0pLFxuICAgICAgYXBwcm92YWwgPT09IG51bGxcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgU2xhY2tDb25maXJtKCkubG9nRXhlY3V0aW9uKFxuICAgICAgICAgICAgICBhcHByb3ZhbC5jaGFubmVsLFxuICAgICAgICAgICAgICBhcHByb3ZhbC50cyxcbiAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICByZXF1ZXN0LmJvZHkucmVxdWVzdG9yLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICk7XG4gIH0pO1xuICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsgdGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10gfSB9PihcbiAgICBcIi9hcGkvbWlncmF0aW9ucy9yb2xsYmFja1wiLFxuICAgIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgYXNzZXJ0VGFyZ2V0cyhtaWdyYXRvciwgcmVxdWVzdC5ib2R5LnRhcmdldHMpO1xuICAgICAgYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIHJlcXVlc3QuYm9keS50YXJnZXRzKTtcbiAgICAgIHJldHVybiBzZW5kTWlncmF0aW9uU3RyZWFtKHJlcGx5LCBcInJvbGxiYWNrXCIsIHJlcXVlc3QuYm9keS50YXJnZXRzLCAob25Qcm9ncmVzcykgPT4ge1xuICAgICAgICByZXR1cm4gbWlncmF0b3Iucm9sbGJhY2socmVxdWVzdC5ib2R5LnRhcmdldHMsIHsgb25Qcm9ncmVzcyB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICk7XG5cbiAgc2VydmVyLnBvc3Q8eyBCb2R5OiB7IGNvbXBhcmVDb25uS2V5PzogTWlncmF0aW9uVGFyZ2V0IH0gfT4oXG4gICAgXCIvYXBpL21pZ3JhdGlvbnMvZ2VuZXJhdGVQcmVwYXJlZENvZGVzXCIsXG4gICAgKHJlcXVlc3QpID0+XG4gICAgICBmb3J3YXJkQXN5bmNFcnJvcnMoYXN5bmMgKCkgPT4gbWlncmF0b3IuZ2VuZXJhdGVQcmVwYXJlZENvZGVzKHJlcXVlc3QuYm9keS5jb21wYXJlQ29ubktleSkpLFxuICApO1xuXG4gIC8vIOydtOyghCBVSSDrsojrk6Tqs7wg7Jm467aAIOyKpO2BrOumve2KuOqwgCDsg4gg7ISc67KE7JeQ7ISc64+EIO2VnCDrprTrpqzsiqQg64+Z7JWIIOuPmeyeke2VmOuPhOuhnSDsnKDsp4Dtlanri4jri6QuXG4gIHNlcnZlci5wb3N0PHtcbiAgICBCb2R5OiB7XG4gICAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIiB8IFwic2hhZG93XCI7XG4gICAgICB0YXJnZXRzOiAoa2V5b2YgU29uYW11REJDb25maWcpW107XG4gICAgICBmb3JjZT86IGJvb2xlYW47XG4gICAgICBmb3JjZVJlYXNvbj86IHN0cmluZztcbiAgICAgIHJlcXVlc3Rvcj86IHN0cmluZztcbiAgICB9O1xuICB9PihcIi9hcGkvbWlncmF0aW9ucy9ydW5BY3Rpb25cIiwgKHJlcXVlc3QpID0+XG4gICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChyZXF1ZXN0LmJvZHkuYWN0aW9uID09PSBcInNoYWRvd1wiKSB7XG4gICAgICAgIHJldHVybiBtaWdyYXRvci5ydW5TaGFkb3dUZXN0KCk7XG4gICAgICB9XG4gICAgICBpZiAocmVxdWVzdC5ib2R5LmFjdGlvbiA9PT0gXCJhcHBseVwiKSB7XG4gICAgICAgIHJldHVybiBydW5MZWdhY3lBcHBseShtaWdyYXRvciwgcmVxdWVzdC5ib2R5KTtcbiAgICAgIH1cbiAgICAgIGFzc2VydFRhcmdldHMobWlncmF0b3IsIHJlcXVlc3QuYm9keS50YXJnZXRzKTtcbiAgICAgIGF3YWl0IGdldEF2YWlsYWJsZVRhcmdldFN0YXR1c2VzKG1pZ3JhdG9yLCByZXF1ZXN0LmJvZHkudGFyZ2V0cyk7XG4gICAgICByZXR1cm4gbWlncmF0b3Iucm9sbGJhY2socmVxdWVzdC5ib2R5LnRhcmdldHMpO1xuICAgIH0pLFxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBK0JBLFNBQVMsY0FBYyxVQUFvQixTQUFrQztDQUMzRSxNQUFNLFVBQVUsSUFBSSxJQUFJLFNBQVMsZUFBZSxDQUFDLENBQUMsS0FBSyxFQUFFLGNBQWMsT0FBTyxDQUFDO0NBQy9FLE1BQU0sVUFBVSxRQUFRLFFBQVEsV0FBVyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUM7Q0FDL0QsSUFBSSxRQUFRLFdBQVcsS0FBSyxRQUFRLFNBQVMsR0FDM0MsTUFBTSxJQUFJLG9CQUFvQixHQUFHLGtCQUFrQixHQUFHLEVBQ3BELFNBQVMsOEJBQThCLFFB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
|