@cartanova/qgrid-cli 2.10.9 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/dist/_virtual/_rolldown/runtime.js +1 -10
- package/bundle/dist/application/monit/log-buffer.js +12 -6
- package/bundle/dist/application/monit/monit.frame.js +11 -3
- package/bundle/dist/application/monit/monit.types.js +1 -1
- package/bundle/dist/application/qgrid/conv-routing.js +9 -6
- package/bundle/dist/application/qgrid/expired-token-reminder.js +2 -2
- package/bundle/dist/application/qgrid/oauth.js +31 -4
- package/bundle/dist/application/qgrid/qgrid-image-generation.js +1 -1
- package/bundle/dist/application/qgrid/qgrid-response-format.js +22 -20
- package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +43 -34
- package/bundle/dist/application/qgrid/qgrid.dispatcher.js +128 -93
- package/bundle/dist/application/qgrid/qgrid.frame.js +930 -49
- package/bundle/dist/application/qgrid/qgrid.types.js +212 -5
- package/bundle/dist/application/qgrid/schema-prompt.js +75 -48
- package/bundle/dist/application/qgrid/slack-user-map.js +1 -1
- package/bundle/dist/application/qgrid/token-death.js +1 -1
- package/bundle/dist/application/qgrid/token-subscriber.js +83 -30
- package/bundle/dist/application/qgrid/token-trigger-setup.js +1 -1
- package/bundle/dist/application/qgrid/token-window-keepalive.js +8 -6
- package/bundle/dist/application/qgrid/tool-emulation-schema.js +13 -13
- package/bundle/dist/application/qgrid/tool-emulation.js +19 -15
- package/bundle/dist/application/request-log/json-schema-type-text.js +29 -12
- package/bundle/dist/application/request-log/request-log.model.js +83 -69
- package/bundle/dist/application/request-log/request-log.types.js +8 -2
- package/bundle/dist/application/request-log/zod-code-format.js +1 -1
- package/bundle/dist/application/request-log-step/request-log-step.model.js +1 -1
- package/bundle/dist/application/request-log-step/request-log-step.types.js +1 -1
- package/bundle/dist/application/setting/setting.constant.js +1 -1
- package/bundle/dist/application/setting/setting.model.js +2 -2
- package/bundle/dist/application/setting/setting.store.js +2 -2
- package/bundle/dist/application/setting/setting.types.js +1 -1
- package/bundle/dist/application/sonamu.generated.js +40 -16
- package/bundle/dist/application/sonamu.generated.sso.js +2 -1
- package/bundle/dist/application/token/token.model.js +26 -9
- package/bundle/dist/application/token/token.types.js +20 -3
- package/bundle/dist/i18n/en.js +15 -1
- package/bundle/dist/i18n/ko.js +15 -1
- package/bundle/dist/i18n/sd.generated.js +2 -1
- package/bundle/dist/migrations/20260807133553_manual__backfill_request_log_cost.js +8 -6
- package/bundle/dist/migrations/20261018215031_alter_request_logs_add1_alter1.js +15 -0
- package/bundle/dist/server-bootstrap.js +4 -2
- package/bundle/dist/server-error-handler.js +1 -1
- package/bundle/dist/sonamu.config.js +37 -8
- package/bundle/dist/startup-migrations.js +17 -7
- package/bundle/dist/testing/global.js +1 -1
- package/bundle/dist/testing/schema-bench.js +0 -0
- package/bundle/dist/testing/test-database-name.js +1 -1
- package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +1 -1
- package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +11 -5
- package/bundle/dist/utils/providers/anthropic/anthropic-quota.js +4 -4
- package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +1 -1
- package/bundle/dist/utils/providers/anthropic/claude-session.js +20 -19
- package/bundle/dist/utils/providers/anthropic/fence-strip.js +1 -1
- package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +49 -23
- package/bundle/dist/utils/providers/common/credentials.js +5 -1
- package/bundle/dist/utils/providers/common/effort.js +3 -3
- package/bundle/dist/utils/providers/common/model-cost.js +69 -14
- package/bundle/dist/utils/providers/common/provider-types.js +29 -1
- package/bundle/dist/utils/providers/common/schema-validation.js +78 -40
- package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +1 -1
- package/bundle/dist/utils/providers/common/strictifier.js +62 -43
- package/bundle/dist/utils/providers/common/thinking.js +3 -2
- package/bundle/dist/utils/providers/common/ttft.js +1 -1
- package/bundle/dist/utils/providers/grok/grok-backend-protocol.js +427 -0
- package/bundle/dist/utils/providers/grok/grok-constants.js +55 -0
- package/bundle/dist/utils/providers/grok/grok-direct-client.js +196 -0
- package/bundle/dist/utils/providers/grok/grok-dispatcher.js +1313 -0
- package/bundle/dist/utils/providers/grok/grok-headers.js +118 -0
- package/bundle/dist/utils/providers/grok/grok-media-client.js +420 -0
- package/bundle/dist/utils/providers/grok/grok-models.js +114 -0
- package/bundle/dist/utils/providers/grok/grok-oauth.js +455 -0
- package/bundle/dist/utils/providers/grok/grok-quota.js +119 -0
- package/bundle/dist/utils/providers/grok/grok-refresh.js +192 -0
- package/bundle/dist/utils/providers/grok/grok-types.js +186 -0
- package/bundle/dist/utils/providers/grok/grok-voice-client.js +199 -0
- package/bundle/dist/utils/providers/grok/index.js +11 -0
- package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +111 -83
- package/bundle/dist/utils/providers/openai/openai-callback-relay.js +3 -2
- package/bundle/dist/utils/providers/openai/openai-constants.js +1 -1
- package/bundle/dist/utils/providers/openai/openai-direct-client.js +23 -7
- package/bundle/dist/utils/providers/openai/openai-dispatcher.js +143 -106
- package/bundle/dist/utils/providers/openai/openai-image-generation.js +48 -33
- package/bundle/dist/utils/providers/openai/openai-oauth.js +28 -13
- package/bundle/dist/utils/providers/openai/openai-quota.js +38 -27
- package/bundle/dist/utils/providers/openai/openai-refresh.js +17 -9
- package/bundle/dist/utils/providers/openai/openai-sse.js +1 -1
- package/bundle/dist/utils/providers/openai/openai-transport-config.js +1 -1
- package/bundle/dist/utils/quiet-hours.js +1 -1
- package/bundle/dist/utils/slack-notify.js +14 -8
- package/bundle/dist/utils/subset-loaders.js +4 -5
- package/bundle/src/application/monit/log-buffer.ts +23 -9
- package/bundle/src/application/monit/monit.frame.ts +22 -5
- package/bundle/src/application/monit/monit.types.ts +6 -0
- package/bundle/src/application/qgrid/conv-routing.test.ts +76 -4
- package/bundle/src/application/qgrid/conv-routing.ts +35 -9
- package/bundle/src/application/qgrid/expired-token-reminder.ts +9 -1
- package/bundle/src/application/qgrid/oauth.ts +51 -15
- package/bundle/src/application/qgrid/qgrid-image-generation.ts +9 -0
- package/bundle/src/application/qgrid/qgrid-response-format.ts +50 -25
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +33 -0
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +87 -40
- package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +97 -0
- package/bundle/src/application/qgrid/qgrid.dispatcher.ts +274 -126
- package/bundle/src/application/qgrid/qgrid.frame.test.ts +1013 -3
- package/bundle/src/application/qgrid/qgrid.frame.ts +1415 -60
- package/bundle/src/application/qgrid/qgrid.types.ts +335 -0
- package/bundle/src/application/qgrid/schema-prompt.ts +105 -41
- package/bundle/src/application/qgrid/slack-user-map.ts +5 -0
- package/bundle/src/application/qgrid/token-death.ts +4 -0
- package/bundle/src/application/qgrid/token-subscriber.test.ts +21 -19
- package/bundle/src/application/qgrid/token-subscriber.ts +186 -53
- package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -0
- package/bundle/src/application/qgrid/token-window-keepalive.ts +49 -6
- package/bundle/src/application/qgrid/tool-emulation-schema.ts +33 -29
- package/bundle/src/application/qgrid/tool-emulation.ts +52 -27
- package/bundle/src/application/request-log/json-schema-type-text.test.ts +5 -5
- package/bundle/src/application/request-log/json-schema-type-text.ts +81 -26
- package/bundle/src/application/request-log/request-log.entity.json +8 -0
- package/bundle/src/application/request-log/request-log.model.test.ts +111 -4
- package/bundle/src/application/request-log/request-log.model.ts +279 -145
- package/bundle/src/application/request-log/request-log.types.ts +17 -0
- package/bundle/src/application/request-log/zod-code-format.ts +11 -0
- package/bundle/src/application/request-log-step/request-log-step.model.ts +1 -0
- package/bundle/src/application/request-log-step/request-log-step.types.ts +2 -0
- package/bundle/src/application/setting/setting.constant.ts +9 -0
- package/bundle/src/application/setting/setting.model.ts +12 -2
- package/bundle/src/application/setting/setting.store.ts +5 -1
- package/bundle/src/application/setting/setting.types.ts +8 -0
- package/bundle/src/application/sonamu.generated.http +135 -0
- package/bundle/src/application/sonamu.generated.sso.ts +3 -0
- package/bundle/src/application/sonamu.generated.ts +29 -0
- package/bundle/src/application/token/token.identity.test.ts +20 -0
- package/bundle/src/application/token/token.model.ts +66 -7
- package/bundle/src/application/token/token.types.ts +24 -1
- package/bundle/src/i18n/en.ts +19 -0
- package/bundle/src/i18n/ko.ts +21 -0
- package/bundle/src/i18n/sd.generated.ts +24 -2
- package/bundle/src/migrations/20260807133553_manual__backfill_request_log_cost.ts +16 -8
- package/bundle/src/migrations/20261018215031_alter_request_logs_add1_alter1.ts +15 -0
- package/bundle/src/server-bootstrap.ts +4 -2
- package/bundle/src/server-error-handler.ts +1 -0
- package/bundle/src/sonamu.config.ts +69 -7
- package/bundle/src/startup-migrations.ts +27 -9
- package/bundle/src/testing/global.ts +20 -0
- package/bundle/src/testing/schema-bench.ts +105 -30
- package/bundle/src/testing/test-database-name.ts +2 -0
- package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +8 -0
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +41 -6
- package/bundle/src/utils/providers/anthropic/anthropic-quota.ts +7 -3
- package/bundle/src/utils/providers/anthropic/anthropic-thinking.ts +6 -0
- package/bundle/src/utils/providers/anthropic/claude-session.ts +58 -24
- package/bundle/src/utils/providers/anthropic/fence-strip.ts +11 -0
- package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +110 -45
- package/bundle/src/utils/providers/common/credentials.ts +8 -0
- package/bundle/src/utils/providers/common/effort.ts +9 -2
- package/bundle/src/utils/providers/common/model-cost.test.ts +48 -1
- package/bundle/src/utils/providers/common/model-cost.ts +259 -158
- package/bundle/src/utils/providers/common/provider-dispatcher.ts +98 -2
- package/bundle/src/utils/providers/common/provider-types.ts +46 -3
- package/bundle/src/utils/providers/common/schema-validation.test.ts +5 -1
- package/bundle/src/utils/providers/common/schema-validation.ts +124 -56
- package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +4 -0
- package/bundle/src/utils/providers/common/strictifier.ts +185 -59
- package/bundle/src/utils/providers/common/thinking.ts +2 -2
- package/bundle/src/utils/providers/common/ttft.ts +4 -2
- package/bundle/src/utils/providers/grok/__fixtures__/golden-responses-1.0.60.json +164 -0
- package/bundle/src/utils/providers/grok/grok-backend-protocol.test.ts +325 -0
- package/bundle/src/utils/providers/grok/grok-backend-protocol.ts +721 -0
- package/bundle/src/utils/providers/grok/grok-constants.ts +105 -0
- package/bundle/src/utils/providers/grok/grok-direct-client.test.ts +179 -0
- package/bundle/src/utils/providers/grok/grok-direct-client.ts +313 -0
- package/bundle/src/utils/providers/grok/grok-dispatcher.test.ts +1395 -0
- package/bundle/src/utils/providers/grok/grok-dispatcher.ts +2105 -0
- package/bundle/src/utils/providers/grok/grok-headers.test.ts +149 -0
- package/bundle/src/utils/providers/grok/grok-headers.ts +199 -0
- package/bundle/src/utils/providers/grok/grok-media-client.test.ts +446 -0
- package/bundle/src/utils/providers/grok/grok-media-client.ts +703 -0
- package/bundle/src/utils/providers/grok/grok-models.test.ts +96 -0
- package/bundle/src/utils/providers/grok/grok-models.ts +161 -0
- package/bundle/src/utils/providers/grok/grok-oauth.test.ts +406 -0
- package/bundle/src/utils/providers/grok/grok-oauth.ts +771 -0
- package/bundle/src/utils/providers/grok/grok-quota.test.ts +142 -0
- package/bundle/src/utils/providers/grok/grok-quota.ts +198 -0
- package/bundle/src/utils/providers/grok/grok-refresh.test.ts +239 -0
- package/bundle/src/utils/providers/grok/grok-refresh.ts +325 -0
- package/bundle/src/utils/providers/grok/grok-types.test.ts +252 -0
- package/bundle/src/utils/providers/grok/grok-types.ts +374 -0
- package/bundle/src/utils/providers/grok/grok-voice-client.test.ts +321 -0
- package/bundle/src/utils/providers/grok/grok-voice-client.ts +284 -0
- package/bundle/src/utils/providers/grok/index.ts +20 -0
- package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +221 -137
- package/bundle/src/utils/providers/openai/openai-callback-relay.ts +12 -1
- package/bundle/src/utils/providers/openai/openai-constants.ts +2 -0
- package/bundle/src/utils/providers/openai/openai-direct-client.ts +111 -21
- package/bundle/src/utils/providers/openai/openai-dispatcher.ts +322 -169
- package/bundle/src/utils/providers/openai/openai-image-generation.ts +116 -36
- package/bundle/src/utils/providers/openai/openai-oauth.ts +48 -20
- package/bundle/src/utils/providers/openai/openai-quota.ts +77 -46
- package/bundle/src/utils/providers/openai/openai-refresh.ts +42 -18
- package/bundle/src/utils/providers/openai/openai-sse.ts +27 -3
- package/bundle/src/utils/providers/openai/openai-transport-config.ts +2 -0
- package/bundle/src/utils/quiet-hours.ts +12 -1
- package/bundle/src/utils/slack-notify.ts +44 -13
- package/bundle/src/utils/subset-loaders.ts +7 -7
- package/bundle/web-dist/client/assets/clsx-5XM_pHvN.js +1 -0
- package/bundle/web-dist/client/assets/index-BA7uQ-6c.js +31 -0
- package/bundle/web-dist/client/assets/index-Be2qCZmI.css +1 -0
- package/bundle/web-dist/client/assets/logs-C47OJGEI.js +1 -0
- package/bundle/web-dist/client/assets/monit-BS9no0dU.js +4 -0
- package/bundle/web-dist/client/assets/plus-sdACTfH0.js +1 -0
- package/bundle/web-dist/client/assets/refresh-cw-CY8o_1cT.js +1 -0
- package/bundle/web-dist/client/assets/request-model-BRtFuZvj.js +1 -0
- package/bundle/web-dist/client/assets/routes-kqgkUxE8.js +5 -0
- package/bundle/web-dist/client/assets/{services.generated-BsieU37H.js → services.generated-CefiDXEv.js} +5 -5
- package/bundle/web-dist/client/assets/settings-DNDvFGSw.js +1 -0
- package/bundle/web-dist/client/assets/show-u8Np69q3.js +2 -0
- package/bundle/web-dist/client/assets/tokens-QvP410NW.js +1 -0
- package/bundle/web-dist/client/assets/total-cost-MnfKU8IN.js +1 -0
- package/bundle/web-dist/client/assets/use-oauth-login-flow-Bzdh28Ws.js +1 -0
- package/bundle/web-dist/client/assets/use-update-token-mutation-CfJKaxmR.js +1 -0
- package/bundle/web-dist/client/assets/vendor-react-CUFFrVN9.js +244 -0
- package/bundle/web-dist/client/assets/vendor-tanstack-Bf_jag9G.js +1 -0
- package/bundle/web-dist/client/index.html +6 -6
- package/bundle/web-dist/server/assets/clsx-D_N5PN_2.js +16 -0
- package/bundle/web-dist/server/assets/{lazyRouteComponent-Dtd0NR4r.js → lazyRouteComponent-D8iTIHyn.js} +129 -2
- package/bundle/web-dist/server/assets/logs-B3OTd9hy.js +825 -0
- package/bundle/web-dist/server/assets/{monit-DvzribSE.js → monit-B2hqorPe.js} +385 -126
- package/bundle/web-dist/server/assets/plus-DwG7h9kq.js +28 -0
- package/bundle/web-dist/server/assets/{react-dom-B4a6-uuR.js → react-dom-BIYQzBqG.js} +2 -129
- package/bundle/web-dist/server/assets/refresh-cw-mMBkwOq0.js +44 -0
- package/bundle/web-dist/server/assets/{request-model-CbqfnQOJ.js → request-model-I6OdODSH.js} +15 -6
- package/bundle/web-dist/server/assets/{routes-BAPWTizT.js → routes-B95YlUv2.js} +760 -213
- package/bundle/web-dist/server/assets/{services.generated-CEbGjsI0.js → services.generated-DQATJ6qf.js} +12821 -12194
- package/bundle/web-dist/server/assets/settings-C3gbGk0m.js +830 -0
- package/bundle/web-dist/server/assets/{show-CxVZTAdv.js → show-Bxaj3rhH.js} +1355 -419
- package/bundle/web-dist/server/assets/tokens-CZjH3cB7.js +1038 -0
- package/bundle/web-dist/server/assets/total-cost-fTE9Xy82.js +18 -0
- package/bundle/web-dist/server/assets/use-oauth-login-flow-CKDHgc3U.js +2379 -0
- package/bundle/web-dist/server/assets/{use-update-token-mutation-CfYmk_4_.js → use-update-token-mutation-BEbgOzaa.js} +1 -1
- package/bundle/web-dist/server/entry-server.generated.js +4303 -22810
- package/dist/cli.js +9 -9
- package/package.json +4 -11
- package/postinstall.mjs +12 -0
- package/skills/qgrid/SKILL.md +1 -0
- package/skills/qgrid/references/cli-env-and-server-boot.md +4 -1
- package/skills/qgrid/references/decision-rationale.md +24 -1
- package/skills/qgrid/references/grok-runtime.md +89 -0
- package/skills/qgrid/references/provider-runtime-differences.md +30 -29
- package/skills/qgrid/references/repo-map.md +10 -0
- package/skills/qgrid/references/request-log-run-lifecycle.md +1 -1
- package/skills/qgrid/references/sonamu-api-web-flow.md +1 -1
- package/skills/qgrid/references/token-auth-quota-lifecycle.md +56 -3
- package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +0 -406
- package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +0 -1507
- package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +0 -887
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2756
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +0 -8
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +0 -8
- package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +0 -922
- package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +0 -386
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -121
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +0 -51
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +0 -1317
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +0 -561
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +0 -40
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +0 -272
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +0 -27
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +0 -77
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +0 -381
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +0 -51
- package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +0 -2986
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +0 -10
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +0 -109
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +0 -10
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +0 -10
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +0 -10
- package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +0 -1126
- package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +0 -21
- package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +0 -432
- package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +0 -517
- package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +0 -101
- package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.11.2_@emnapi_runtime@1.11.2_@types_node@25.0.7_esbuild@0.27.4_5b35fc1fb85d2af4d105e0d74f940f50/node_modules/vite/dist/node/module-runner.js +0 -1265
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +0 -9
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +0 -41
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +0 -19
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +0 -202
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.DdgEv5B1.js +0 -46
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +0 -119
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js +0 -3044
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +0 -59
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/index.js +0 -28
- package/bundle/dist/testing/setup-mocks.js +0 -16
- package/bundle/src/testing/setup-mocks.ts +0 -44
- package/bundle/web-dist/client/assets/index-Bw2s88Ot.css +0 -1
- package/bundle/web-dist/client/assets/index-CrXKu_J8.js +0 -106
- package/bundle/web-dist/client/assets/logs-B2SmWJXA.js +0 -1
- package/bundle/web-dist/client/assets/monit-D-JwXXoA.js +0 -1
- package/bundle/web-dist/client/assets/plus-B62CuqT8.js +0 -1
- package/bundle/web-dist/client/assets/refresh-cw-NNcU0Cmq.js +0 -1
- package/bundle/web-dist/client/assets/request-model-CojtinqK.js +0 -1
- package/bundle/web-dist/client/assets/routes-C5r4gTvY.js +0 -5
- package/bundle/web-dist/client/assets/settings-D3tDSAck.js +0 -1
- package/bundle/web-dist/client/assets/show-Cah_kUKC.js +0 -2
- package/bundle/web-dist/client/assets/tokens-DU2Iyxxd.js +0 -1
- package/bundle/web-dist/client/assets/use-oauth-login-flow-D0UaR9_e.js +0 -1
- package/bundle/web-dist/client/assets/use-update-token-mutation-DAq0F8p-.js +0 -1
- package/bundle/web-dist/client/assets/vendor-react-DH4kUfK2.js +0 -9
- package/bundle/web-dist/client/assets/vendor-tanstack-DJRQAbrY.js +0 -1
- package/bundle/web-dist/server/assets/logs-l91avYif.js +0 -509
- package/bundle/web-dist/server/assets/plus-KZrECewT.js +0 -19
- package/bundle/web-dist/server/assets/refresh-cw-BND93JrF.js +0 -23
- package/bundle/web-dist/server/assets/settings-BZR5HSAL.js +0 -461
- package/bundle/web-dist/server/assets/tokens-D1hb4eKk.js +0 -448
- package/bundle/web-dist/server/assets/use-oauth-login-flow-Cvdy0zF8.js +0 -178
- package/dist/cli.d.ts +0 -10
- /package/bundle/web-dist/client/assets/{cost-DH2jZbrw.js → cost-DB3HbU7T.js} +0 -0
- /package/bundle/web-dist/client/assets/{preload-helper-ca-nBW7U.js → preload-helper-DWTEM3RW.js} +0 -0
- /package/bundle/web-dist/server/assets/{cost-eEHeTRT5.js → cost-BC9yzyA9.js} +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
import { getLogger } from "@logtape/logtape";
|
|
2
3
|
import http from "node:http";
|
|
3
4
|
//#region src/utils/providers/openai/openai-callback-relay.ts
|
|
@@ -62,7 +63,7 @@ async function startOpenAICallbackRelay(dashboardBase, ttlMs, ports = OPENAI_CAL
|
|
|
62
63
|
const expiryTimer = setTimeout(() => stopOpenAICallbackRelay(), ttlMs);
|
|
63
64
|
expiryTimer.unref();
|
|
64
65
|
const address = server.address();
|
|
65
|
-
const boundPort =
|
|
66
|
+
const boundPort = z.looseObject({ port: z.number() }).safeParse(address).data?.port ?? port;
|
|
66
67
|
relay = {
|
|
67
68
|
server,
|
|
68
69
|
redirectUri: openAICallbackRedirectUri(boundPort),
|
|
@@ -83,4 +84,4 @@ function stopOpenAICallbackRelay() {
|
|
|
83
84
|
//#endregion
|
|
84
85
|
export { OPENAI_CALLBACK_PATH, OPENAI_CALLBACK_PORTS, openAICallbackRedirectUri, startOpenAICallbackRelay, stopOpenAICallbackRelay };
|
|
85
86
|
|
|
86
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
87
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWNhbGxiYWNrLXJlbGF5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1jYWxsYmFjay1yZWxheS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaHR0cCBmcm9tIFwibm9kZTpodHRwXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJvYXV0aFwiXSk7XG5cbi8qKlxuICogT3BlbkFJIG1hdGNoZXMgdGhlIENvZGV4IENMSSBjbGllbnQncyByZWRpcmVjdCBVUklzIGJ5IGV4YWN0IHN0cmluZywgYW5kIG9ubHkgdGhlc2UgdHdvIGxvb3BiYWNrXG4gKiBjYWxsYmFja3MgYXJlIHJlZ2lzdGVyZWQuIEFueSBvdGhlciBob3N0LCBwb3J0LCBvciBwYXRoIG1ha2VzIC9vYXV0aC9hdXRob3JpemUgZmFpbCB3aXRoXG4gKiBgaW52YWxpZF9hdXRob3JpemVfcmVxdWVzdGAgYmVmb3JlIHRoZSBsb2dpbiBzY3JlZW4gcmVuZGVycywgc28gcWdyaWQgY2Fubm90IHBvaW50IHRoZSBjYWxsYmFja1xuICogYXQgaXRzIG93biBjb25maWd1cmFibGUgc2VydmVyIHBvcnQuIEtlZXAgaW4gc3luYyB3aXRoIHRoZSBDb2RleCBDTEkgYWxsb3ctbGlzdCAoZGVmYXVsdCAxNDU1LFxuICogZmFsbGJhY2sgMTQ1NykuXG4gKi9cbmV4cG9ydCBjb25zdCBPUEVOQUlfQ0FMTEJBQ0tfUE9SVFMgPSBbMTQ1NSwgMTQ1N10gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgT1BFTkFJX0NBTExCQUNLX1BBVEggPSBcIi9hdXRoL2NhbGxiYWNrXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBvcGVuQUlDYWxsYmFja1JlZGlyZWN0VXJpKHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9JHtPUEVOQUlfQ0FMTEJBQ0tfUEFUSH1gO1xufVxuXG50eXBlIFJlbGF5ID0ge1xuICBzZXJ2ZXI6IGh0dHAuU2VydmVyO1xuICByZWRpcmVjdFVyaTogc3RyaW5nO1xuICBkYXNoYm9hcmRCYXNlOiBzdHJpbmc7XG4gIGV4cGlyeVRpbWVyOiBOb2RlSlMuVGltZW91dDtcbn07XG5cbmxldCByZWxheTogUmVsYXkgfCBudWxsID0gbnVsbDtcblxuZnVuY3Rpb24gZm9yd2FyZChyZXF1ZXN0OiBodHRwLkluY29taW5nTWVzc2FnZSwgcmVzcG9uc2U6IGh0dHAuU2VydmVyUmVzcG9uc2UpOiB2b2lkIHtcbiAgY29uc3QgY3VycmVudCA9IHJlbGF5O1xuICBjb25zdCBpbmNvbWluZyA9IG5ldyBVUkwocmVxdWVzdC51cmwgPz8gXCIvXCIsIFwiaHR0cDovL2xvY2FsaG9zdFwiKTtcblxuICBpZiAoIWN1cnJlbnQgfHwgaW5jb21pbmcucGF0aG5hbWUgIT09IE9QRU5BSV9DQUxMQkFDS19QQVRIKSB7XG4gICAgcmVzcG9uc2Uud3JpdGVIZWFkKDQwNCwgeyBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIiB9KTtcbiAgICByZXNwb25zZS5lbmQoXCJub3QgZm91bmRcIik7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBPbmx5IHRoZSB0d28gT0F1dGggcmVzdWx0IGZpZWxkcyBjcm9zcyBvdmVyLCBvbnRvIGEgZml4ZWQgbG9vcGJhY2sgYmFzZS4gVGhlIHJlcXVlc3QgbmV2ZXJcbiAgLy8gY29udHJpYnV0ZXMgc2NoZW1lLCBhdXRob3JpdHksIG9yIHBhdGggYnl0ZXMgdG8gdGhlIHJlZGlyZWN0IHRhcmdldC5cbiAgY29uc3QgdGFyZ2V0ID0gbmV3IFVSTChPUEVOQUlfQ0FMTEJBQ0tfUEFUSCwgY3VycmVudC5kYXNoYm9hcmRCYXNlKTtcblxuICBmb3IgKGNvbnN0IGZpZWxkIG9mIFtcImNvZGVcIiwgXCJzdGF0ZVwiXSBhcyBjb25zdCkge1xuICAgIGNvbnN0IHZhbHVlID0gaW5jb21pbmcuc2VhcmNoUGFyYW1zLmdldChmaWVsZCk7XG5cbiAgICBpZiAodmFsdWUpIHRhcmdldC5zZWFyY2hQYXJhbXMuc2V0KGZpZWxkLCB2YWx1ZSk7XG4gIH1cblxuICByZXNwb25zZS53cml0ZUhlYWQoMzAyLCB7IExvY2F0aW9uOiB0YXJnZXQudG9TdHJpbmcoKSwgXCJDYWNoZS1Db250cm9sXCI6IFwibm8tc3RvcmVcIiB9KTtcbiAgcmVzcG9uc2UuZW5kKCk7XG59XG5cbmZ1bmN0aW9uIGxpc3Rlbk9uKHBvcnQ6IG51bWJlcik6IFByb21pc2U8aHR0cC5TZXJ2ZXIgfCBudWxsPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoZm9yd2FyZCk7XG4gICAgc2VydmVyLm9uY2UoXCJlcnJvclwiLCAoZXJyb3I6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgc2VydmVyLmNsb3NlKCk7XG5cbiAgICAgIGlmIChlcnJvci5jb2RlID09PSBcIkVBRERSSU5VU0VcIiB8fCBlcnJvci5jb2RlID09PSBcIkVBQ0NFU1wiKSByZXNvbHZlKG51bGwpO1xuICAgICAgZWxzZSByZWplY3QoZXJyb3IpO1xuICAgIH0pO1xuICAgIC8vIEJpbmQgbG9vcGJhY2sgb25seSwgbGlrZSB0aGUgQ29kZXggQ0xJOiB0aGUgcmVsYXkgbXVzdCBub3QgYmUgcmVhY2hhYmxlIG9mZi1ob3N0LlxuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgXCIxMjcuMC4wLjFcIiwgKCkgPT4gcmVzb2x2ZShzZXJ2ZXIpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogT3BlbnMgYSBzaG9ydC1saXZlZCBsb29wYmFjayBsaXN0ZW5lciBvbiBhIHJlZ2lzdGVyZWQgQ29kZXggY2FsbGJhY2sgcG9ydCBhbmQgZm9yd2FyZHMgdGhlXG4gKiBhdXRob3JpemF0aW9uIGNvZGUgdG8gcWdyaWQgb3duIGNhbGxiYWNrIHJvdXRlLiBSZXR1cm5zIHRoZSByZWRpcmVjdCBVUkkgdG8gcHV0IGluIHRoZSBhdXRob3JpemVcbiAqIHJlcXVlc3QuIFJlcGVhdGVkIGxvZ2lucyByZXVzZSB0aGUgcnVubmluZyBsaXN0ZW5lciBhbmQgcmVmcmVzaCBpdHMgbGlmZXRpbWUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydE9wZW5BSUNhbGxiYWNrUmVsYXkoXG4gIGRhc2hib2FyZEJhc2U6IHN0cmluZyxcbiAgdHRsTXM6IG51bWJlcixcbiAgcG9ydHM6IHJlYWRvbmx5IG51bWJlcltdID0gT1BFTkFJX0NBTExCQUNLX1BPUlRTLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgaWYgKHJlbGF5KSB7XG4gICAgcmVsYXkuZGFzaGJvYXJkQmFzZSA9IGRhc2hib2FyZEJhc2U7XG4gICAgcmVsYXkuZXhwaXJ5VGltZXIucmVmcmVzaCgpO1xuXG4gICAgcmV0dXJuIHJlbGF5LnJlZGlyZWN0VXJpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwb3J0IG9mIHBvcnRzKSB7XG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgbGlzdGVuT24ocG9ydCk7XG5cbiAgICBpZiAoIXNlcnZlcikgY29udGludWU7XG5cbiAgICBjb25zdCBleHBpcnlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gc3RvcE9wZW5BSUNhbGxiYWNrUmVsYXkoKSwgdHRsTXMpO1xuICAgIGV4cGlyeVRpbWVyLnVucmVmKCk7XG4gICAgY29uc3QgYWRkcmVzcyA9IHNlcnZlci5hZGRyZXNzKCk7XG4gICAgLy8gc2VydmVyLmFkZHJlc3MoKSBpcyBhbiBBZGRyZXNzSW5mbyBmb3IgVENQIGxpc3RlbmVycywgYSBzdHJpbmcgZm9yIHBpcGVzLCBvciBudWxsLlxuICAgIGNvbnN0IGJvdW5kUG9ydCA9IHoubG9vc2VPYmplY3QoeyBwb3J0OiB6Lm51bWJlcigpIH0pLnNhZmVQYXJzZShhZGRyZXNzKS5kYXRhPy5wb3J0ID8/IHBvcnQ7XG4gICAgcmVsYXkgPSB7XG4gICAgICBzZXJ2ZXIsXG4gICAgICByZWRpcmVjdFVyaTogb3BlbkFJQ2FsbGJhY2tSZWRpcmVjdFVyaShib3VuZFBvcnQpLFxuICAgICAgZGFzaGJvYXJkQmFzZSxcbiAgICAgIGV4cGlyeVRpbWVyLFxuICAgIH07XG4gICAgbG9nZ2VyLmluZm8oYG9wZW5haSBvYXV0aCBjYWxsYmFjayByZWxheSBsaXN0ZW5pbmcgb24gMTI3LjAuMC4xOiR7Ym91bmRQb3J0fWApO1xuXG4gICAgcmV0dXJuIHJlbGF5LnJlZGlyZWN0VXJpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBPUEVOQUlfQ0FMTEJBQ0tfUE9SVFNfVU5BVkFJTEFCTEVfJHtwb3J0cy5qb2luKFwiX1wiKX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0b3BPcGVuQUlDYWxsYmFja1JlbGF5KCk6IHZvaWQge1xuICBpZiAoIXJlbGF5KSByZXR1cm47XG4gIGNsZWFyVGltZW91dChyZWxheS5leHBpcnlUaW1lcik7XG4gIHJlbGF5LnNlcnZlci5jbG9zZSgpO1xuICByZWxheSA9IG51bGw7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFLQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsT0FBTyxDQUFDOzs7Ozs7OztBQVMzQyxNQUFhLHdCQUF3QixDQUFDLE1BQU0sSUFBSTtBQUNoRCxNQUFhLHVCQUF1QjtBQUVwQyxTQUFnQiwwQkFBMEIsTUFBc0I7Q0FDOUQsT0FBTyxvQkFBb0IsT0FBTztBQUNwQztBQVNBLElBQUksUUFBc0I7QUFFMUIsU0FBUyxRQUFRLFNBQStCLFVBQXFDO0NBQ25GLE1BQU0sVUFBVTtDQUNoQixNQUFNLFdBQVcsSUFBSSxJQUFJLFFBQVEsT0FBTyxLQUFLLGtCQUFrQjtDQUUvRCxJQUFJLENBQUMsV0FBVyxTQUFTLGFBQUEsa0JBQW1DO0VBQzFELFNBQVMsVUFBVSxLQUFLLEVBQUUsZ0JBQWdCLDRCQUE0QixDQUFDO0VBQ3ZFLFNBQVMsSUFBSSxXQUFXO0VBRXhCO0NBQ0Y7Q0FJQSxNQUFNLFNBQVMsSUFBSSxJQUFJLHNCQUFzQixRQUFRLGFBQWE7Q0FFbEUsS0FBSyxNQUFNLFNBQVMsQ0FBQyxRQUFRLE9BQU8sR0FBWTtFQUM5QyxNQUFNLFFBQVEsU0FBUyxhQUFhLElBQUksS0FBSztFQUU3QyxJQUFJLE9BQU8sT0FBTyxhQUFhLElBQUksT0FBTyxLQUFLO0NBQ2pEO0NBRUEsU0FBUyxVQUFVLEtBQUs7RUFBRSxVQUFVLE9BQU8sU0FBUztFQUFHLGlCQUFpQjtDQUFXLENBQUM7Q0FDcEYsU0FBUyxJQUFJO0FBQ2Y7QUFFQSxTQUFTLFNBQVMsTUFBMkM7Q0FDM0QsT0FBTyxJQUFJLFNBQVMsU0FBUyxXQUFXO0VBQ3RDLE1BQU0sU0FBUyxLQUFLLGFBQWEsT0FBTztFQUN4QyxPQUFPLEtBQUssVUFBVSxVQUFpQztHQUNyRCxPQUFPLE1BQU07R0FFYixJQUFJLE1BQU0sU0FBUyxnQkFBZ0IsTUFBTSxTQUFTLFVBQVUsUUFBUSxJQUFJO1FBQ25FLE9BQU8sS0FBSztFQUNuQixDQUFDO0VBRUQsT0FBTyxPQUFPLE1BQU0sbUJBQW1CLFFBQVEsTUFBTSxDQUFDO0NBQ3hELENBQUM7QUFDSDs7Ozs7O0FBT0EsZUFBc0IseUJBQ3BCLGVBQ0EsT0FDQSxRQUEyQix1QkFDVjtDQUNqQixJQUFJLE9BQU87RUFDVCxNQUFNLGdCQUFnQjtFQUN0QixNQUFNLFlBQVksUUFBUTtFQUUxQixPQUFPLE1BQU07Q0FDZjtDQUVBLEtBQUssTUFBTSxRQUFRLE9BQU87RUFDeEIsTUFBTSxTQUFTLE1BQU0sU0FBUyxJQUFJO0VBRWxDLElBQUksQ0FBQyxRQUFRO0VBRWIsTUFBTSxjQUFjLGlCQUFpQix3QkFBd0IsR0FBRyxLQUFLO0VBQ3JFLFlBQVksTUFBTTtFQUNsQixNQUFNLFVBQVUsT0FBTyxRQUFRO0VBRS9CLE1BQU0sWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsT0FBTyxDQUFDLENBQUMsTUFBTSxRQUFRO0VBQ3ZGLFFBQVE7R0FDTjtHQUNBLGFBQWEsMEJBQTBCLFNBQVM7R0FDaEQ7R0FDQTtFQUNGO0VBQ0EsT0FBTyxLQUFLLHNEQUFzRCxXQUFXO0VBRTdFLE9BQU8sTUFBTTtDQUNmO0NBRUEsTUFBTSxJQUFJLE1BQU0scUNBQXFDLE1BQU0sS0FBSyxHQUFHLEdBQUc7QUFDeEU7QUFFQSxTQUFnQiwwQkFBZ0M7Q0FDOUMsSUFBSSxDQUFDLE9BQU87Q0FDWixhQUFhLE1BQU0sV0FBVztDQUM5QixNQUFNLE9BQU8sTUFBTTtDQUNuQixRQUFRO0FBQ1YifQ==
|
|
@@ -8,4 +8,4 @@ const OPENAI_ORIGINATOR = "codex_cli_rs";
|
|
|
8
8
|
//#endregion
|
|
9
9
|
export { OPENAI_AUTHORIZE_URL, OPENAI_CLIENT_ID, OPENAI_ISSUER, OPENAI_ORIGINATOR, OPENAI_SCOPES, OPENAI_TOKEN_URL };
|
|
10
10
|
|
|
11
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
11
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWNvbnN0YW50cy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktY29uc3RhbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBPUEVOQUlfSVNTVUVSID0gXCJodHRwczovL2F1dGgub3BlbmFpLmNvbVwiO1xuZXhwb3J0IGNvbnN0IE9QRU5BSV9DTElFTlRfSUQgPSBcImFwcF9FTW9hbUVFWjczZjBDa1hhWHA3aHJhbm5cIjtcbmV4cG9ydCBjb25zdCBPUEVOQUlfQVVUSE9SSVpFX1VSTCA9IGAke09QRU5BSV9JU1NVRVJ9L29hdXRoL2F1dGhvcml6ZWA7XG5leHBvcnQgY29uc3QgT1BFTkFJX1RPS0VOX1VSTCA9IGAke09QRU5BSV9JU1NVRVJ9L29hdXRoL3Rva2VuYDtcblxuZXhwb3J0IGNvbnN0IE9QRU5BSV9TQ09QRVMgPVxuICBcIm9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGFwaS5jb25uZWN0b3JzLnJlYWQgYXBpLmNvbm5lY3RvcnMuaW52b2tlXCI7XG5cbmV4cG9ydCBjb25zdCBPUEVOQUlfT1JJR0lOQVRPUiA9IFwiY29kZXhfY2xpX3JzXCI7XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxNQUFhLGdCQUFnQjtBQUM3QixNQUFhLG1CQUFtQjtBQUNoQyxNQUFhLHVCQUF1QixHQUFHLGNBQWM7QUFDckQsTUFBYSxtQkFBbUIsR0FBRyxjQUFjO0FBRWpELE1BQWEsZ0JBQ1g7QUFFRixNQUFhLG9CQUFvQiJ9
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { CHATGPT_CODEX_RESPONSES_URL, OpenAIProtocolError, buildCodexIdentityHeaders, buildOpenAIResponsesRequest, normalizeOpenAIEvent } from "./openai-backend-protocol.js";
|
|
2
2
|
import { buildStandaloneImageRequest, readStandaloneImageResponse } from "./openai-image-generation.js";
|
|
3
3
|
import { normalizeOpenAISSE } from "./openai-sse.js";
|
|
4
|
+
import { z } from "zod";
|
|
4
5
|
import crypto from "node:crypto";
|
|
5
6
|
import WsClient from "ws";
|
|
6
7
|
//#region src/utils/providers/openai/openai-direct-client.ts
|
|
@@ -239,15 +240,30 @@ var OpenAIWebSocketTransport = class OpenAIWebSocketTransport {
|
|
|
239
240
|
}
|
|
240
241
|
}
|
|
241
242
|
};
|
|
243
|
+
const openAIErrorBodySchema = z.looseObject({
|
|
244
|
+
error: z.unknown().optional(),
|
|
245
|
+
message: z.string().optional().catch(void 0),
|
|
246
|
+
code: z.string().optional().catch(void 0)
|
|
247
|
+
});
|
|
248
|
+
const openAIErrorDetailSchema = z.looseObject({
|
|
249
|
+
message: z.string().optional().catch(void 0),
|
|
250
|
+
code: z.string().optional().catch(void 0)
|
|
251
|
+
});
|
|
252
|
+
function requestsTransparentImage(imageGeneration) {
|
|
253
|
+
return imageGeneration !== void 0 && imageGeneration !== true && imageGeneration !== false && imageGeneration.background === "transparent";
|
|
254
|
+
}
|
|
242
255
|
async function responseError(response) {
|
|
243
256
|
const text = await response.text().catch(() => "");
|
|
244
257
|
let message = text || response.statusText || `HTTP ${response.status}`;
|
|
245
258
|
let code;
|
|
246
259
|
try {
|
|
247
|
-
const parsed = JSON.parse(text);
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
260
|
+
const parsed = openAIErrorBodySchema.safeParse(JSON.parse(text));
|
|
261
|
+
if (parsed.success) {
|
|
262
|
+
const error = parsed.data.error;
|
|
263
|
+
const errorDetail = openAIErrorDetailSchema.safeParse(error).data;
|
|
264
|
+
message = errorDetail?.message ?? parsed.data.message ?? z.string().safeParse(error).data ?? message;
|
|
265
|
+
code = errorDetail?.code ?? parsed.data.code;
|
|
266
|
+
}
|
|
251
267
|
} catch {
|
|
252
268
|
code = void 0;
|
|
253
269
|
}
|
|
@@ -298,7 +314,7 @@ var OpenAIDirectClient = class {
|
|
|
298
314
|
this.transport = options.transport ?? (options.transportKind === "websocket" ? new OpenAIWebSocketTransport(options) : new OpenAIHttpsTransport(options));
|
|
299
315
|
}
|
|
300
316
|
responses(options, signal) {
|
|
301
|
-
if (options.model === "gpt-image-2" ||
|
|
317
|
+
if (options.model === "gpt-image-2" || requestsTransparentImage(options.imageGeneration)) return this.standaloneImages(options, signal);
|
|
302
318
|
const clientRequestId = crypto.randomUUID();
|
|
303
319
|
const affinityId = options.promptCacheKey ? cacheAffinityUuid(options.promptCacheKey) : clientRequestId;
|
|
304
320
|
return this.transport.stream({
|
|
@@ -333,7 +349,7 @@ var OpenAIDirectClient = class {
|
|
|
333
349
|
continue;
|
|
334
350
|
}
|
|
335
351
|
if (!response.ok) throw await responseError(response);
|
|
336
|
-
const images = await readStandaloneImageResponse(response,
|
|
352
|
+
const images = await readStandaloneImageResponse(response, requestsTransparentImage(options.imageGeneration));
|
|
337
353
|
signal?.throwIfAborted();
|
|
338
354
|
yield* images;
|
|
339
355
|
const firstImage = images[0];
|
|
@@ -352,4 +368,4 @@ var OpenAIDirectClient = class {
|
|
|
352
368
|
//#endregion
|
|
353
369
|
export { OpenAIDirectClient, OpenAIHttpsTransport, OpenAIWebSocketTransport };
|
|
354
370
|
|
|
355
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpcmVjdC1jbGllbnQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpcmVjdC1jbGllbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0byBmcm9tIFwibm9kZTpjcnlwdG9cIjtcblxuaW1wb3J0IFdzQ2xpZW50LCB7IHR5cGUgQ2xpZW50T3B0aW9ucywgdHlwZSBSYXdEYXRhIH0gZnJvbSBcIndzXCI7XG5cbmltcG9ydCB7XG4gIGJ1aWxkQ29kZXhJZGVudGl0eUhlYWRlcnMsXG4gIGJ1aWxkT3BlbkFJUmVzcG9uc2VzUmVxdWVzdCxcbiAgQ0hBVEdQVF9DT0RFWF9SRVNQT05TRVNfVVJMLFxuICBub3JtYWxpemVPcGVuQUlFdmVudCxcbiAgT3BlbkFJUHJvdG9jb2xFcnJvcixcbiAgdHlwZSBPcGVuQUlOb3JtYWxpemVkRXZlbnQsXG4gIHR5cGUgT3BlbkFJUmVzcG9uc2VzT3B0aW9ucyxcbiAgdHlwZSBPcGVuQUlSZXNwb25zZXNSZXF1ZXN0LFxufSBmcm9tIFwiLi9vcGVuYWktYmFja2VuZC1wcm90b2NvbFwiO1xuaW1wb3J0IHtcbiAgYnVpbGRTdGFuZGFsb25lSW1hZ2VSZXF1ZXN0LFxuICByZWFkU3RhbmRhbG9uZUltYWdlUmVzcG9uc2UsXG59IGZyb20gXCIuL29wZW5haS1pbWFnZS1nZW5lcmF0aW9uXCI7XG5pbXBvcnQgeyBub3JtYWxpemVPcGVuQUlTU0UsIHR5cGUgT3BlbkFJRXZlbnRTdHJlYW0gfSBmcm9tIFwiLi9vcGVuYWktc3NlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFJRGlyZWN0Q3JlZGVudGlhbHMge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICBhY2NvdW50SWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlUcmFuc3BvcnRSZXF1ZXN0IHtcbiAgYm9keTogT3BlbkFJUmVzcG9uc2VzUmVxdWVzdDtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICB0aHJlYWRJZDogc3RyaW5nO1xuICBjbGllbnRSZXF1ZXN0SWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlSZXNwb25zZXNUcmFuc3BvcnQge1xuICBzdHJlYW0ocmVxdWVzdDogT3BlbkFJVHJhbnNwb3J0UmVxdWVzdCk6IE9wZW5BSUV2ZW50U3RyZWFtO1xuICBjbG9zZT8oKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlIdHRwc1RyYW5zcG9ydE9wdGlvbnMge1xuICBjcmVkZW50aWFsczogT3BlbkFJRGlyZWN0Q3JlZGVudGlhbHM7XG4gIGZldGNoPzogdHlwZW9mIGZldGNoO1xuICByZWZyZXNoQ3JlZGVudGlhbHM/OiAoKSA9PiBQcm9taXNlPE9wZW5BSURpcmVjdENyZWRlbnRpYWxzPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlXZWJTb2NrZXRMaWtlIHtcbiAgb24oZXZlbnQ6IFwib3BlblwiLCBsaXN0ZW5lcjogKCkgPT4gdm9pZCk6IHRoaXM7XG4gIG9uKGV2ZW50OiBcIm1lc3NhZ2VcIiwgbGlzdGVuZXI6IChkYXRhOiBSYXdEYXRhLCBpc0JpbmFyeTogYm9vbGVhbikgPT4gdm9pZCk6IHRoaXM7XG4gIG9uKGV2ZW50OiBcImNsb3NlXCIsIGxpc3RlbmVyOiAoY29kZTogbnVtYmVyLCByZWFzb246IEJ1ZmZlcikgPT4gdm9pZCk6IHRoaXM7XG4gIG9uKGV2ZW50OiBcImVycm9yXCIsIGxpc3RlbmVyOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkKTogdGhpcztcbiAgb24oXG4gICAgZXZlbnQ6IFwidW5leHBlY3RlZC1yZXNwb25zZVwiLFxuICAgIGxpc3RlbmVyOiAocmVxdWVzdDogdW5rbm93biwgcmVzcG9uc2U6IHsgc3RhdHVzQ29kZT86IG51bWJlciB9KSA9PiB2b2lkLFxuICApOiB0aGlzO1xuICBvZmYoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBuZXZlcltdKSA9PiB2b2lkKTogdGhpcztcbiAgc2VuZChkYXRhOiBzdHJpbmcsIGNhbGxiYWNrPzogKGVycm9yPzogRXJyb3IpID0+IHZvaWQpOiB2b2lkO1xuICBjbG9zZShjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkO1xuICB0ZXJtaW5hdGUoKTogdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUgT3BlbkFJV2ViU29ja2V0RmFjdG9yeSA9ICh1cmw6IHN0cmluZywgb3B0aW9uczogQ2xpZW50T3B0aW9ucykgPT4gT3BlbkFJV2ViU29ja2V0TGlrZTtcblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlXZWJTb2NrZXRUcmFuc3BvcnRPcHRpb25zIGV4dGVuZHMgT3BlbkFJSHR0cHNUcmFuc3BvcnRPcHRpb25zIHtcbiAgd2ViU29ja2V0RmFjdG9yeT86IE9wZW5BSVdlYlNvY2tldEZhY3Rvcnk7XG59XG5cbnR5cGUgU29ja2V0UmVjb3JkID1cbiAgfCB7IGtpbmQ6IFwib3BlblwiIH1cbiAgfCB7IGtpbmQ6IFwibWVzc2FnZVwiOyBkYXRhOiBSYXdEYXRhOyBpc0JpbmFyeTogYm9vbGVhbiB9XG4gIHwgeyBraW5kOiBcImNsb3NlXCI7IGNvZGU6IG51bWJlcjsgcmVhc29uOiBzdHJpbmcgfVxuICB8IHsga2luZDogXCJlcnJvclwiOyBlcnJvcjogRXJyb3IgfVxuICB8IHsga2luZDogXCJyZWplY3RlZFwiOyBzdGF0dXM/OiBudW1iZXIgfTtcblxuY29uc3QgTUFYX0JVRkZFUkVEX1NPQ0tFVF9SRUNPUkRTID0gMTYwMDtcblxuZnVuY3Rpb24gd2Vic29ja2V0VXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHBhcnNlZDogVVJMO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihgSW52YWxpZCBPcGVuQUkgUmVzcG9uc2VzIFVSTDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICB9XG4gIHBhcnNlZC5wcm90b2NvbCA9IHBhcnNlZC5wcm90b2NvbCA9PT0gXCJodHRwczpcIiA/IFwid3NzOlwiIDogXCJ3czpcIjtcbiAgcmV0dXJuIHBhcnNlZC50b1N0cmluZygpO1xufVxuXG5mdW5jdGlvbiByYXdEYXRhVGV4dChkYXRhOiBSYXdEYXRhKTogc3RyaW5nIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHJldHVybiBCdWZmZXIuY29uY2F0KGRhdGEpLnRvU3RyaW5nKCk7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHJldHVybiBCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheShkYXRhKSkudG9TdHJpbmcoKTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRhdGEpLnRvU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIHNvY2tldEV2ZW50cyhzb2NrZXQ6IE9wZW5BSVdlYlNvY2tldExpa2UsIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gIGNvbnN0IHJlY29yZHM6IFNvY2tldFJlY29yZFtdID0gW107XG4gIGNvbnN0IHdhaXRlcnM6IEFycmF5PChyZWNvcmQ6IFNvY2tldFJlY29yZCkgPT4gdm9pZD4gPSBbXTtcbiAgbGV0IGFjdGl2ZSA9IHRydWU7XG4gIGNvbnN0IHB1c2ggPSAocmVjb3JkOiBTb2NrZXRSZWNvcmQpID0+IHtcbiAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuICAgIGNvbnN0IHdhaXRlciA9IHdhaXRlcnMuc2hpZnQoKTtcbiAgICBpZiAod2FpdGVyKSB3YWl0ZXIocmVjb3JkKTtcbiAgICBlbHNlIGlmIChyZWNvcmRzLmxlbmd0aCA8IE1BWF9CVUZGRVJFRF9TT0NLRVRfUkVDT1JEUykgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgZWxzZSB7XG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgIHJlY29yZHMubGVuZ3RoID0gMDtcbiAgICAgIHNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgIGNvbnN0IG92ZXJmbG93ID0ge1xuICAgICAgICBraW5kOiBcImVycm9yXCIgYXMgY29uc3QsXG4gICAgICAgIGVycm9yOiBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcbiAgICAgICAgICBgT3BlbkFJIFdlYlNvY2tldCBleGNlZWRlZCB0aGUgJHtNQVhfQlVGRkVSRURfU09DS0VUX1JFQ09SRFN9LXJlY29yZCByZWNlaXZlIGJ1ZmZlcmAsXG4gICAgICAgICAgXCJ3ZWJzb2NrZXRfYmFja3ByZXNzdXJlXCIsXG4gICAgICAgICksXG4gICAgICB9O1xuICAgICAgY29uc3Qgb3ZlcmZsb3dXYWl0ZXIgPSB3YWl0ZXJzLnNoaWZ0KCk7XG4gICAgICBpZiAob3ZlcmZsb3dXYWl0ZXIpIG92ZXJmbG93V2FpdGVyKG92ZXJmbG93KTtcbiAgICAgIGVsc2UgcmVjb3Jkcy5wdXNoKG92ZXJmbG93KTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG9uT3BlbiA9ICgpID0+IHB1c2goeyBraW5kOiBcIm9wZW5cIiB9KTtcbiAgY29uc3Qgb25NZXNzYWdlID0gKGRhdGE6IFJhd0RhdGEsIGlzQmluYXJ5OiBib29sZWFuKSA9PiBwdXNoKHsga2luZDogXCJtZXNzYWdlXCIsIGRhdGEsIGlzQmluYXJ5IH0pO1xuICBjb25zdCBvbkNsb3NlID0gKGNvZGU6IG51bWJlciwgcmVhc29uOiBCdWZmZXIpID0+XG4gICAgcHVzaCh7IGtpbmQ6IFwiY2xvc2VcIiwgY29kZSwgcmVhc29uOiByZWFzb24udG9TdHJpbmcoKSB9KTtcbiAgY29uc3Qgb25FcnJvciA9IChlcnJvcjogRXJyb3IpID0+IHB1c2goeyBraW5kOiBcImVycm9yXCIsIGVycm9yIH0pO1xuICBjb25zdCBvblVuZXhwZWN0ZWRSZXNwb25zZSA9IChfcmVxdWVzdDogdW5rbm93biwgcmVzcG9uc2U6IHsgc3RhdHVzQ29kZT86IG51bWJlciB9KSA9PlxuICAgIHB1c2goeyBraW5kOiBcInJlamVjdGVkXCIsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzQ29kZSB9KTtcbiAgc29ja2V0Lm9uKFwib3BlblwiLCBvbk9wZW4pO1xuICBzb2NrZXQub24oXCJtZXNzYWdlXCIsIG9uTWVzc2FnZSk7XG4gIHNvY2tldC5vbihcImNsb3NlXCIsIG9uQ2xvc2UpO1xuICBzb2NrZXQub24oXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgc29ja2V0Lm9uKFwidW5leHBlY3RlZC1yZXNwb25zZVwiLCBvblVuZXhwZWN0ZWRSZXNwb25zZSk7XG4gIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiB7XG4gICAgc29ja2V0LnRlcm1pbmF0ZSgpO1xuICAgIHB1c2goeyBraW5kOiBcImVycm9yXCIsIGVycm9yOiBhYm9ydEVycm9yKHNpZ25hbCkgfSk7XG4gIH07XG4gIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIHtcbiAgICBuZXh0OiAoKSA9PlxuICAgICAgcmVjb3Jkcy5sZW5ndGhcbiAgICAgICAgPyBQcm9taXNlLnJlc29sdmUocmVjb3Jkcy5zaGlmdCgpISlcbiAgICAgICAgOiBuZXcgUHJvbWlzZTxTb2NrZXRSZWNvcmQ+KChyZXNvbHZlKSA9PiB3YWl0ZXJzLnB1c2gocmVzb2x2ZSkpLFxuICAgIGNsZWFudXA6ICgpID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCk7XG4gICAgICBzb2NrZXQub2ZmKFwib3BlblwiLCBvbk9wZW4pO1xuICAgICAgc29ja2V0Lm9mZihcIm1lc3NhZ2VcIiwgb25NZXNzYWdlKTtcbiAgICAgIHNvY2tldC5vZmYoXCJjbG9zZVwiLCBvbkNsb3NlKTtcbiAgICAgIC8vIGVycm9yIOumrOyKpOuEiOuKlCDrgqjquLTri6QoYWN0aXZlPWZhbHNl6528IHB1c2jripQgbm8tb3ApLiBDT05ORUNUSU5HIOyGjOy8k+ydmCB0ZXJtaW5hdGUoKeuKlFxuICAgICAgLy8g64uk7J2MIHRpY2vsl5AgZXJyb3LrpbwgZW1pdO2VmOuvgOuhnCwg65a87Ja0IOuRkOuptCBVbmhhbmRsZWQgJ2Vycm9yJ+uhnCDtlITroZzshLjsiqTqsIAg7KO964qU64ukLlxuICAgICAgc29ja2V0Lm9mZihcInVuZXhwZWN0ZWQtcmVzcG9uc2VcIiwgb25VbmV4cGVjdGVkUmVzcG9uc2UpO1xuICAgICAgcmVjb3Jkcy5sZW5ndGggPSAwO1xuICAgICAgY29uc3QgY2xvc2VkID0ge1xuICAgICAgICBraW5kOiBcImVycm9yXCIgYXMgY29uc3QsXG4gICAgICAgIGVycm9yOiBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIk9wZW5BSSBXZWJTb2NrZXQgZXZlbnQgc3RyZWFtIHdhcyBjbG9zZWRcIiksXG4gICAgICB9O1xuICAgICAgd2FpdGVycy5zcGxpY2UoMCkuZm9yRWFjaCgod2FpdGVyKSA9PiB3YWl0ZXIoY2xvc2VkKSk7XG4gICAgfSxcbiAgICBkZXRhY2hBYm9ydDogKCkgPT4gc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFib3J0RXJyb3Ioc2lnbmFsPzogQWJvcnRTaWduYWwpOiBFcnJvciB7XG4gIHJldHVybiBzaWduYWw/LnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yXG4gICAgPyBzaWduYWwucmVhc29uXG4gICAgOiBuZXcgRE9NRXhjZXB0aW9uKFwiQWJvcnRlZFwiLCBcIkFib3J0RXJyb3JcIik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5leHRQb29sZWRSZWNvcmQoXG4gIGV2ZW50czogUmV0dXJuVHlwZTx0eXBlb2Ygc29ja2V0RXZlbnRzPixcbiAgc29ja2V0OiBPcGVuQUlXZWJTb2NrZXRMaWtlLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8U29ja2V0UmVjb3JkPiB7XG4gIGlmICghc2lnbmFsKSByZXR1cm4gZXZlbnRzLm5leHQoKTtcbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aHJvdyBhYm9ydEVycm9yKHNpZ25hbCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxTb2NrZXRSZWNvcmQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBvbkFib3J0ID0gKCkgPT4ge1xuICAgICAgc29ja2V0LnRlcm1pbmF0ZSgpO1xuICAgICAgcmVqZWN0KGFib3J0RXJyb3Ioc2lnbmFsKSk7XG4gICAgfTtcbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB2b2lkIGV2ZW50c1xuICAgICAgLm5leHQoKVxuICAgICAgLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpO1xuICAgICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjYWNoZUFmZmluaXR5VXVpZChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGhleCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShrZXkpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCAzMikuc3BsaXQoXCJcIik7XG4gIGhleFsxMl0gPSBcIjRcIjtcbiAgaGV4WzE2XSA9ICgoTnVtYmVyLnBhcnNlSW50KGhleFsxNl0hLCAxNikgJiAweDMpIHwgMHg4KS50b1N0cmluZygxNik7XG4gIHJldHVybiBgJHtoZXguc2xpY2UoMCwgOCkuam9pbihcIlwiKX0tJHtoZXguc2xpY2UoOCwgMTIpLmpvaW4oXCJcIil9LSR7aGV4LnNsaWNlKDEyLCAxNikuam9pbihcIlwiKX0tJHtoZXguc2xpY2UoMTYsIDIwKS5qb2luKFwiXCIpfS0ke2hleC5zbGljZSgyMCkuam9pbihcIlwiKX1gO1xufVxuXG50eXBlIEFmZmluaXR5Q29ubmVjdGlvbiA9IHtcbiAgc29ja2V0OiBPcGVuQUlXZWJTb2NrZXRMaWtlO1xuICBldmVudHM6IFJldHVyblR5cGU8dHlwZW9mIHNvY2tldEV2ZW50cz47XG4gIGNsb3NlZD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgY2xhc3MgT3BlbkFJV2ViU29ja2V0VHJhbnNwb3J0IGltcGxlbWVudHMgT3BlbkFJUmVzcG9uc2VzVHJhbnNwb3J0IHtcbiAgc3RhdGljIHJlYWRvbmx5IE1BWF9BRkZJTklUWV9DT05ORUNUSU9OUyA9IDE2O1xuICBjcmVkZW50aWFsczogT3BlbkFJRGlyZWN0Q3JlZGVudGlhbHM7XG4gIHJlYWRvbmx5IHJlZnJlc2hDcmVkZW50aWFscz86ICgpID0+IFByb21pc2U8T3BlbkFJRGlyZWN0Q3JlZGVudGlhbHM+O1xuICByZWFkb25seSB3ZWJTb2NrZXRGYWN0b3J5OiBPcGVuQUlXZWJTb2NrZXRGYWN0b3J5O1xuICByZWFkb25seSBhZmZpbml0eUNvbm5lY3Rpb25zID0gbmV3IE1hcDxzdHJpbmcsIEFmZmluaXR5Q29ubmVjdGlvbj4oKTtcbiAgcmVhZG9ubHkgYnVzeUFmZmluaXRpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcGVuQUlXZWJTb2NrZXRUcmFuc3BvcnRPcHRpb25zKSB7XG4gICAgdGhpcy5jcmVkZW50aWFscyA9IG9wdGlvbnMuY3JlZGVudGlhbHM7XG4gICAgdGhpcy5yZWZyZXNoQ3JlZGVudGlhbHMgPSBvcHRpb25zLnJlZnJlc2hDcmVkZW50aWFscztcbiAgICB0aGlzLndlYlNvY2tldEZhY3RvcnkgPVxuICAgICAgb3B0aW9ucy53ZWJTb2NrZXRGYWN0b3J5ID8/ICgodXJsLCB3c09wdGlvbnMpID0+IG5ldyBXc0NsaWVudCh1cmwsIHdzT3B0aW9ucykpO1xuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLmZvckVhY2goKHsgc29ja2V0LCBldmVudHMgfSkgPT4ge1xuICAgICAgZXZlbnRzLmNsZWFudXAoKTtcbiAgICAgIHNvY2tldC5jbG9zZSgxMDAwLCBcInRyYW5zcG9ydCBjbG9zZWRcIik7XG4gICAgfSk7XG4gICAgdGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLmNsZWFyKCk7XG4gICAgdGhpcy5idXN5QWZmaW5pdGllcy5jbGVhcigpO1xuICB9XG5cbiAgLy8g7Jyg7Zy0IOyXsOqysOunjCDstpXstpztlZzri6QuIOyghOu2gCDsgqzsmqkg7KSR7J2066m0IGZhbHNl66W8IOuwmO2ZmO2VtCDsnbztmozshLEg7IaM7LyT7Jy866GcIOyymOumrO2VnOuLpC5cbiAgcmVtZW1iZXJBZmZpbml0eUNvbm5lY3Rpb24odGhyZWFkSWQ6IHN0cmluZywgY29ubmVjdGlvbjogQWZmaW5pdHlDb25uZWN0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5oYXModGhyZWFkSWQpICYmXG4gICAgICB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuc2l6ZSA+PSBPcGVuQUlXZWJTb2NrZXRUcmFuc3BvcnQuTUFYX0FGRklOSVRZX0NPTk5FQ1RJT05TXG4gICAgKSB7XG4gICAgICBjb25zdCBpZGxlS2V5ID0gWy4uLnRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5rZXlzKCldLmZpbmQoXG4gICAgICAgIChrZXkpID0+ICF0aGlzLmJ1c3lBZmZpbml0aWVzLmhhcyhrZXkpLFxuICAgICAgKTtcbiAgICAgIGlmIChpZGxlS2V5ID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGlkbGUgPSB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZ2V0KGlkbGVLZXkpITtcbiAgICAgIGlkbGUuZXZlbnRzLmNsZWFudXAoKTtcbiAgICAgIGlkbGUuc29ja2V0LmNsb3NlKDEwMDAsIFwiYWZmaW5pdHkgY2FjaGUgZXZpY3RlZFwiKTtcbiAgICAgIHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5kZWxldGUoaWRsZUtleSk7XG4gICAgfVxuICAgIHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5zZXQodGhyZWFkSWQsIGNvbm5lY3Rpb24pO1xuICAgIC8vIOycoO2ctCDsg4Htg5zsl5DshJwgYmFja2VuZCDqsIAg64GK7J2AIOyGjOy8k+ydhCDri6TsnYwg7JqU7LKt7J20IOynkeyWtOuTpOyngCDslYrrj4TroZ0g7LqQ7Iuc7JeQ7IScIOygnOqxsO2VnOuLpC5cbiAgICBjb25zdCBkcm9wID0gKCkgPT4ge1xuICAgICAgY29ubmVjdGlvbi5jbG9zZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuYnVzeUFmZmluaXRpZXMuaGFzKHRocmVhZElkKSkgcmV0dXJuO1xuICAgICAgaWYgKHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5nZXQodGhyZWFkSWQpICE9PSBjb25uZWN0aW9uKSByZXR1cm47XG4gICAgICB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZGVsZXRlKHRocmVhZElkKTtcbiAgICAgIGNvbm5lY3Rpb24uZXZlbnRzLmNsZWFudXAoKTtcbiAgICB9O1xuICAgIGNvbm5lY3Rpb24uc29ja2V0Lm9uKFwiY2xvc2VcIiwgZHJvcCk7XG4gICAgY29ubmVjdGlvbi5zb2NrZXQub24oXCJlcnJvclwiLCBkcm9wKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jICpzdHJlYW0ocmVxdWVzdDogT3BlbkFJVHJhbnNwb3J0UmVxdWVzdCk6IEFzeW5jR2VuZXJhdG9yPE9wZW5BSU5vcm1hbGl6ZWRFdmVudD4ge1xuICAgIGxldCByZWZyZXNoZWQgPSBmYWxzZTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHJlcXVlc3Quc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBhYm9ydEVycm9yKHJlcXVlc3Quc2lnbmFsKTtcbiAgICAgIGNvbnN0IGhhc0FmZmluaXR5ID0gcmVxdWVzdC5ib2R5LnByb21wdF9jYWNoZV9rZXkgIT09IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJldGFpbkNvbm5lY3Rpb24gPSBoYXNBZmZpbml0eSAmJiAhdGhpcy5idXN5QWZmaW5pdGllcy5oYXMocmVxdWVzdC50aHJlYWRJZCk7XG4gICAgICBpZiAocmV0YWluQ29ubmVjdGlvbikgdGhpcy5idXN5QWZmaW5pdGllcy5hZGQocmVxdWVzdC50aHJlYWRJZCk7XG4gICAgICBjb25zdCBlbnRyeSA9IHJldGFpbkNvbm5lY3Rpb24gPyB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZ2V0KHJlcXVlc3QudGhyZWFkSWQpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGVudHJ5Py5jbG9zZWQpIHtcbiAgICAgICAgdGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLmRlbGV0ZShyZXF1ZXN0LnRocmVhZElkKTtcbiAgICAgICAgZW50cnkuZXZlbnRzLmNsZWFudXAoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNhY2hlZCA9IGVudHJ5Py5jbG9zZWQgPyB1bmRlZmluZWQgOiBlbnRyeTtcbiAgICAgIGxldCByZXRhaW5lZCA9IHJldGFpbkNvbm5lY3Rpb247XG4gICAgICBjb25zdCBzb2NrZXQgPVxuICAgICAgICBjYWNoZWQ/LnNvY2tldCA/P1xuICAgICAgICB0aGlzLndlYlNvY2tldEZhY3Rvcnkod2Vic29ja2V0VXJsKENIQVRHUFRfQ09ERVhfUkVTUE9OU0VTX1VSTCksIHtcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAuLi5idWlsZENvZGV4SWRlbnRpdHlIZWFkZXJzKHRoaXMuY3JlZGVudGlhbHMuYWNjZXNzVG9rZW4sIHRoaXMuY3JlZGVudGlhbHMuYWNjb3VudElkLCB7XG4gICAgICAgICAgICAgIHNlc3Npb25JZDogcmVxdWVzdC5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHRocmVhZElkOiByZXF1ZXN0LnRocmVhZElkLFxuICAgICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHJlcXVlc3QuY2xpZW50UmVxdWVzdElkLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBcIk9wZW5BSS1CZXRhXCI6IFwicmVzcG9uc2VzX3dlYnNvY2tldHM9MjAyNi0wMi0wNlwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgY29uc3QgZXZlbnRzID0gY2FjaGVkPy5ldmVudHMgPz8gc29ja2V0RXZlbnRzKHNvY2tldCwgcmVxdWVzdC5zaWduYWwpO1xuICAgICAgbGV0IGNvbXBsZXRlZCA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgICAgICBjb25zdCBoYW5kc2hha2UgPSBhd2FpdCBldmVudHMubmV4dCgpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGhhbmRzaGFrZS5raW5kID09PSBcInJlamVjdGVkXCIgJiZcbiAgICAgICAgICAgIGhhbmRzaGFrZS5zdGF0dXMgPT09IDQwMSAmJlxuICAgICAgICAgICAgIXJlZnJlc2hlZCAmJlxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ3JlZGVudGlhbHNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgIHRoaXMuY3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLnJlZnJlc2hDcmVkZW50aWFscygpO1xuICAgICAgICAgICAgcmVmcmVzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFuZHNoYWtlLmtpbmQgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXG4gICAgICAgICAgICAgIGBPcGVuQUkgV2ViU29ja2V0IGhhbmRzaGFrZSByZWplY3RlZCR7aGFuZHNoYWtlLnN0YXR1cyA/IGAgd2l0aCBIVFRQICR7aGFuZHNoYWtlLnN0YXR1c31gIDogXCJcIn1gLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGhhbmRzaGFrZS5zdGF0dXMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFuZHNoYWtlLmtpbmQgPT09IFwiZXJyb3JcIikgdGhyb3cgaGFuZHNoYWtlLmVycm9yO1xuICAgICAgICAgIGlmIChoYW5kc2hha2Uua2luZCAhPT0gXCJvcGVuXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFwiT3BlbkFJIFdlYlNvY2tldCBjbG9zZWQgYmVmb3JlIHRoZSBoYW5kc2hha2UgY29tcGxldGVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmV0YWluQ29ubmVjdGlvbikge1xuICAgICAgICAgICAgcmV0YWluZWQgPSB0aGlzLnJlbWVtYmVyQWZmaW5pdHlDb25uZWN0aW9uKHJlcXVlc3QudGhyZWFkSWQsIHsgc29ja2V0LCBldmVudHMgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHsgdHlwZTogXCJyZXNwb25zZS5jcmVhdGVcIiwgLi4ucmVxdWVzdC5ib2R5IH0pLCAoZXJyb3IpID0+XG4gICAgICAgICAgICBlcnJvciA/IHJlamVjdChlcnJvcikgOiByZXNvbHZlKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICBjb25zdCByZWNvcmQgPSBjYWNoZWRcbiAgICAgICAgICAgID8gYXdhaXQgbmV4dFBvb2xlZFJlY29yZChldmVudHMsIHNvY2tldCwgcmVxdWVzdC5zaWduYWwpXG4gICAgICAgICAgICA6IGF3YWl0IGV2ZW50cy5uZXh0KCk7XG4gICAgICAgICAgaWYgKHJlY29yZC5raW5kID09PSBcIm1lc3NhZ2VcIikge1xuICAgICAgICAgICAgaWYgKHJlY29yZC5pc0JpbmFyeSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIk9wZW5BSSBXZWJTb2NrZXQgc2VudCBhbiB1bmV4cGVjdGVkIGJpbmFyeSBtZXNzYWdlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJhdzogdW5rbm93bjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJhdyA9IEpTT04ucGFyc2UocmF3RGF0YVRleHQocmVjb3JkLmRhdGEpKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIk9wZW5BSSBXZWJTb2NrZXQgc2VudCBpbnZhbGlkIEpTT05cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5vcm1hbGl6ZU9wZW5BSUV2ZW50KHJhdyk7XG4gICAgICAgICAgICBpZiAoIWV2ZW50KSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSBcImNvbXBsZXRlZFwiKSB7XG4gICAgICAgICAgICAgIGNvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGlmIChyZXRhaW5lZCkgZXZlbnRzLmRldGFjaEFib3J0KCk7XG4gICAgICAgICAgICAgIGVsc2Ugc29ja2V0LmNsb3NlKDEwMDAsIFwicmVzcG9uc2UgY29tcGxldGVkXCIpO1xuICAgICAgICAgICAgICB5aWVsZCBldmVudDtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgZXZlbnQ7XG4gICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJlcnJvclwiKSB0aHJvdyBldmVudC5lcnJvcjtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC5raW5kID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgICAgIHRocm93IHJlY29yZC5lcnJvcjtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC5raW5kID09PSBcImNsb3NlXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFxuICAgICAgICAgICAgICBgT3BlbkFJIFdlYlNvY2tldCBjbG9zZWQgYmVmb3JlIGEgdGVybWluYWwgcmVzcG9uc2UgZXZlbnQgKCR7cmVjb3JkLmNvZGV9JHtyZWNvcmQucmVhc29uID8gYDogJHtyZWNvcmQucmVhc29ufWAgOiBcIlwifSlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJPcGVuQUkgV2ViU29ja2V0IGVtaXR0ZWQgYW4gdW5leHBlY3RlZCBoYW5kc2hha2UgZXZlbnRcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoIWNvbXBsZXRlZCB8fCAhcmV0YWluZWQpIHtcbiAgICAgICAgICBpZiAocmV0YWluZWQpIHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5kZWxldGUocmVxdWVzdC50aHJlYWRJZCk7XG4gICAgICAgICAgZXZlbnRzLmNsZWFudXAoKTtcbiAgICAgICAgICBpZiAoIWNvbXBsZXRlZCkgc29ja2V0LnRlcm1pbmF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXRhaW5Db25uZWN0aW9uKSB0aGlzLmJ1c3lBZmZpbml0aWVzLmRlbGV0ZShyZXF1ZXN0LnRocmVhZElkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzcG9uc2VFcnJvcihyZXNwb25zZTogUmVzcG9uc2UpOiBQcm9taXNlPE9wZW5BSVByb3RvY29sRXJyb3I+IHtcbiAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKS5jYXRjaCgoKSA9PiBcIlwiKTtcbiAgbGV0IG1lc3NhZ2UgPSB0ZXh0IHx8IHJlc3BvbnNlLnN0YXR1c1RleHQgfHwgYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9YDtcbiAgbGV0IGNvZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHRleHQpIGFzIHtcbiAgICAgIGVycm9yPzogeyBtZXNzYWdlPzogc3RyaW5nOyBjb2RlPzogc3RyaW5nIH0gfCBzdHJpbmc7XG4gICAgICBtZXNzYWdlPzogc3RyaW5nO1xuICAgICAgY29kZT86IHN0cmluZztcbiAgICB9O1xuICAgIGNvbnN0IGVycm9yID0gcGFyc2VkLmVycm9yO1xuICAgIG1lc3NhZ2UgPVxuICAgICAgKHR5cGVvZiBlcnJvciA9PT0gXCJvYmplY3RcIiA/IGVycm9yLm1lc3NhZ2UgOiB1bmRlZmluZWQpID8/XG4gICAgICBwYXJzZWQubWVzc2FnZSA/P1xuICAgICAgKHR5cGVvZiBlcnJvciA9PT0gXCJzdHJpbmdcIiA/IGVycm9yIDogbWVzc2FnZSk7XG4gICAgY29kZSA9ICh0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgPyBlcnJvci5jb2RlIDogdW5kZWZpbmVkKSA/PyBwYXJzZWQuY29kZTtcbiAgfSBjYXRjaCB7XG4gICAgY29kZSA9IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gbmV3IE9wZW5BSVByb3RvY29sRXJyb3IobWVzc2FnZSwgY29kZSwgcmVzcG9uc2Uuc3RhdHVzKTtcbn1cblxuZXhwb3J0IGNsYXNzIE9wZW5BSUh0dHBzVHJhbnNwb3J0IGltcGxlbWVudHMgT3BlbkFJUmVzcG9uc2VzVHJhbnNwb3J0IHtcbiAgY3JlZGVudGlhbHM6IE9wZW5BSURpcmVjdENyZWRlbnRpYWxzO1xuICByZWFkb25seSBmZXRjaEltcGw6IHR5cGVvZiBmZXRjaDtcbiAgcmVhZG9ubHkgcmVmcmVzaENyZWRlbnRpYWxzPzogKCkgPT4gUHJvbWlzZTxPcGVuQUlEaXJlY3RDcmVkZW50aWFscz47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3BlbkFJSHR0cHNUcmFuc3BvcnRPcHRpb25zKSB7XG4gICAgdGhpcy5jcmVkZW50aWFscyA9IG9wdGlvbnMuY3JlZGVudGlhbHM7XG4gICAgdGhpcy5mZXRjaEltcGwgPSBvcHRpb25zLmZldGNoID8/IGZldGNoO1xuICAgIHRoaXMucmVmcmVzaENyZWRlbnRpYWxzID0gb3B0aW9ucy5yZWZyZXNoQ3JlZGVudGlhbHM7XG4gIH1cblxuICBhc3luYyAqc3RyZWFtKHJlcXVlc3Q6IE9wZW5BSVRyYW5zcG9ydFJlcXVlc3QpOiBBc3luY0dlbmVyYXRvcjxPcGVuQUlOb3JtYWxpemVkRXZlbnQ+IHtcbiAgICBsZXQgcmVmcmVzaGVkID0gZmFsc2U7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoSW1wbChDSEFUR1BUX0NPREVYX1JFU1BPTlNFU19VUkwsIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyczogYnVpbGRDb2RleElkZW50aXR5SGVhZGVycyhcbiAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgIHRoaXMuY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNlc3Npb25JZDogcmVxdWVzdC5zZXNzaW9uSWQsXG4gICAgICAgICAgICB0aHJlYWRJZDogcmVxdWVzdC50aHJlYWRJZCxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDogcmVxdWVzdC5jbGllbnRSZXF1ZXN0SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdC5ib2R5KSxcbiAgICAgICAgc2lnbmFsOiByZXF1ZXN0LnNpZ25hbCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgJiYgIXJlZnJlc2hlZCAmJiB0aGlzLnJlZnJlc2hDcmVkZW50aWFscykge1xuICAgICAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKTtcbiAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGF3YWl0IHRoaXMucmVmcmVzaENyZWRlbnRpYWxzKCk7XG4gICAgICAgIHJlZnJlc2hlZCA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgYXdhaXQgcmVzcG9uc2VFcnJvcihyZXNwb25zZSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLmJvZHkpIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFwiT3BlbkFJIHJlc3BvbnNlIGhhZCBubyBib2R5XCIpO1xuXG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGV2ZW50IG9mIG5vcm1hbGl6ZU9wZW5BSVNTRShyZXNwb25zZS5ib2R5KSkge1xuICAgICAgICB5aWVsZCBldmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlEaXJlY3RDbGllbnRPcHRpb25zIGV4dGVuZHMgT3BlbkFJSHR0cHNUcmFuc3BvcnRPcHRpb25zIHtcbiAgdHJhbnNwb3J0PzogT3BlbkFJUmVzcG9uc2VzVHJhbnNwb3J0O1xuICB0cmFuc3BvcnRLaW5kPzogXCJodHRwc1wiIHwgXCJ3ZWJzb2NrZXRcIjtcbiAgd2ViU29ja2V0RmFjdG9yeT86IE9wZW5BSVdlYlNvY2tldEZhY3Rvcnk7XG59XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlEaXJlY3RDbGllbnQge1xuICByZWFkb25seSB0cmFuc3BvcnQ6IE9wZW5BSVJlc3BvbnNlc1RyYW5zcG9ydDtcbiAgaW1hZ2VDcmVkZW50aWFsczogT3BlbkFJRGlyZWN0Q3JlZGVudGlhbHM7XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgb3B0aW9uczogT3BlbkFJRGlyZWN0Q2xpZW50T3B0aW9ucykge1xuICAgIHRoaXMuaW1hZ2VDcmVkZW50aWFscyA9IG9wdGlvbnMuY3JlZGVudGlhbHM7XG4gICAgdGhpcy50cmFuc3BvcnQgPVxuICAgICAgb3B0aW9ucy50cmFuc3BvcnQgPz9cbiAgICAgIChvcHRpb25zLnRyYW5zcG9ydEtpbmQgPT09IFwid2Vic29ja2V0XCJcbiAgICAgICAgPyBuZXcgT3BlbkFJV2ViU29ja2V0VHJhbnNwb3J0KG9wdGlvbnMpXG4gICAgICAgIDogbmV3IE9wZW5BSUh0dHBzVHJhbnNwb3J0KG9wdGlvbnMpKTtcbiAgfVxuXG4gIHJlc3BvbnNlcyhvcHRpb25zOiBPcGVuQUlSZXNwb25zZXNPcHRpb25zLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IE9wZW5BSUV2ZW50U3RyZWFtIHtcbiAgICBpZiAoXG4gICAgICBvcHRpb25zLm1vZGVsID09PSBcImdwdC1pbWFnZS0yXCIgfHxcbiAgICAgICh0eXBlb2Ygb3B0aW9ucy5pbWFnZUdlbmVyYXRpb24gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgb3B0aW9ucy5pbWFnZUdlbmVyYXRpb24uYmFja2dyb3VuZCA9PT0gXCJ0cmFuc3BhcmVudFwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhbmRhbG9uZUltYWdlcyhvcHRpb25zLCBzaWduYWwpO1xuICAgIH1cbiAgICBjb25zdCBjbGllbnRSZXF1ZXN0SWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IGFmZmluaXR5SWQgPSBvcHRpb25zLnByb21wdENhY2hlS2V5XG4gICAgICA/IGNhY2hlQWZmaW5pdHlVdWlkKG9wdGlvbnMucHJvbXB0Q2FjaGVLZXkpXG4gICAgICA6IGNsaWVudFJlcXVlc3RJZDtcbiAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuc3RyZWFtKHtcbiAgICAgIGJvZHk6IGJ1aWxkT3BlbkFJUmVzcG9uc2VzUmVxdWVzdChcbiAgICAgICAgb3B0aW9ucy5wcm9tcHRDYWNoZUtleSA/IHsgLi4ub3B0aW9ucywgcHJvbXB0Q2FjaGVLZXk6IGFmZmluaXR5SWQgfSA6IG9wdGlvbnMsXG4gICAgICApLFxuICAgICAgc2lnbmFsLFxuICAgICAgc2Vzc2lvbklkOiBhZmZpbml0eUlkLFxuICAgICAgLy8gcHJvbXB0Q2FjaGVLZXkgaXMgYWxyZWFkeSBhIG9uZS13YXkgU0RLIGFmZmluaXR5IHZhbHVlLCBuZXZlciBhIHJhdyBzZXNzaW9uS2V5LlxuICAgICAgdGhyZWFkSWQ6IGFmZmluaXR5SWQsXG4gICAgICBjbGllbnRSZXF1ZXN0SWQsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyAqc3RhbmRhbG9uZUltYWdlcyhcbiAgICBvcHRpb25zOiBPcGVuQUlSZXNwb25zZXNPcHRpb25zLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBPcGVuQUlFdmVudFN0cmVhbSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGJ1aWxkU3RhbmRhbG9uZUltYWdlUmVxdWVzdChvcHRpb25zKTtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgMjsgYXR0ZW1wdCsrKSB7XG4gICAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICh0aGlzLm9wdGlvbnMuZmV0Y2ggPz8gZmV0Y2gpKHJlcXVlc3QudXJsLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi5idWlsZENvZGV4SWRlbnRpdHlIZWFkZXJzKFxuICAgICAgICAgICAgdGhpcy5pbWFnZUNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgdGhpcy5pbWFnZUNyZWRlbnRpYWxzLmFjY291bnRJZCxcbiAgICAgICAgICApLFxuICAgICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgXCJ4LWNvZGV4LWltYWdlLXR1cm4taWRcIjogcmVxdWVzdElkLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0LmJvZHkpLFxuICAgICAgICBzaWduYWwsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSAmJiBhdHRlbXB0ID09PSAwICYmIHRoaXMub3B0aW9ucy5yZWZyZXNoQ3JlZGVudGlhbHMpIHtcbiAgICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCk7XG4gICAgICAgIHRoaXMuaW1hZ2VDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMub3B0aW9ucy5yZWZyZXNoQ3JlZGVudGlhbHMoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBhd2FpdCByZXNwb25zZUVycm9yKHJlc3BvbnNlKTtcbiAgICAgIGNvbnN0IGltYWdlcyA9IGF3YWl0IHJlYWRTdGFuZGFsb25lSW1hZ2VSZXNwb25zZShcbiAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgIHR5cGVvZiBvcHRpb25zLmltYWdlR2VuZXJhdGlvbiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgIG9wdGlvbnMuaW1hZ2VHZW5lcmF0aW9uLmJhY2tncm91bmQgPT09IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICk7XG4gICAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB5aWVsZCogaW1hZ2VzO1xuICAgICAgY29uc3QgZmlyc3RJbWFnZSA9IGltYWdlc1swXTtcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgdHlwZTogXCJjb21wbGV0ZWRcIixcbiAgICAgICAgcmVzcG9uc2VJZDogcmVxdWVzdElkLFxuICAgICAgICBtb2RlbDogZmlyc3RJbWFnZT8udHlwZSA9PT0gXCJpbWFnZVwiID8gZmlyc3RJbWFnZS5nZW5lcmF0aW9uPy5tb2RlbCA6IFwiZ3B0LWltYWdlLTJcIixcbiAgICAgIH07XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy50cmFuc3BvcnQuY2xvc2U/LigpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQXdFQSxNQUFNLDhCQUE4QjtBQUVwQyxTQUFTLGFBQWEsS0FBcUI7Q0FDekMsSUFBSTtDQUNKLElBQUk7RUFDRixTQUFTLElBQUksSUFBSSxH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
|
|
371
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpcmVjdC1jbGllbnQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpcmVjdC1jbGllbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0byBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHR5cGUgQ2xpZW50UmVxdWVzdCB9IGZyb20gXCJub2RlOmh0dHBcIjtcblxuaW1wb3J0IFdzQ2xpZW50LCB7IHR5cGUgQ2xpZW50T3B0aW9ucywgdHlwZSBSYXdEYXRhIH0gZnJvbSBcIndzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQge1xuICBidWlsZENvZGV4SWRlbnRpdHlIZWFkZXJzLFxuICBidWlsZE9wZW5BSVJlc3BvbnNlc1JlcXVlc3QsXG4gIENIQVRHUFRfQ09ERVhfUkVTUE9OU0VTX1VSTCxcbiAgdHlwZSBKc29uVmFsdWUsXG4gIG5vcm1hbGl6ZU9wZW5BSUV2ZW50LFxuICBPcGVuQUlQcm90b2NvbEVycm9yLFxuICB0eXBlIE9wZW5BSU5vcm1hbGl6ZWRFdmVudCxcbiAgdHlwZSBPcGVuQUlSZXNwb25zZXNPcHRpb25zLFxuICB0eXBlIE9wZW5BSVJlc3BvbnNlc1JlcXVlc3QsXG59IGZyb20gXCIuL29wZW5haS1iYWNrZW5kLXByb3RvY29sXCI7XG5pbXBvcnQge1xuICBidWlsZFN0YW5kYWxvbmVJbWFnZVJlcXVlc3QsXG4gIHJlYWRTdGFuZGFsb25lSW1hZ2VSZXNwb25zZSxcbn0gZnJvbSBcIi4vb3BlbmFpLWltYWdlLWdlbmVyYXRpb25cIjtcbmltcG9ydCB7IG5vcm1hbGl6ZU9wZW5BSVNTRSwgdHlwZSBPcGVuQUlFdmVudFN0cmVhbSB9IGZyb20gXCIuL29wZW5haS1zc2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlEaXJlY3RDcmVkZW50aWFscyB7XG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIGFjY291bnRJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVRyYW5zcG9ydFJlcXVlc3Qge1xuICBib2R5OiBPcGVuQUlSZXNwb25zZXNSZXF1ZXN0O1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHRocmVhZElkOiBzdHJpbmc7XG4gIGNsaWVudFJlcXVlc3RJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVJlc3BvbnNlc1RyYW5zcG9ydCB7XG4gIHN0cmVhbShyZXF1ZXN0OiBPcGVuQUlUcmFuc3BvcnRSZXF1ZXN0KTogT3BlbkFJRXZlbnRTdHJlYW07XG4gIGNsb3NlPygpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSUh0dHBzVHJhbnNwb3J0T3B0aW9ucyB7XG4gIGNyZWRlbnRpYWxzOiBPcGVuQUlEaXJlY3RDcmVkZW50aWFscztcbiAgZmV0Y2g/OiB0eXBlb2YgZmV0Y2g7XG4gIHJlZnJlc2hDcmVkZW50aWFscz86ICgpID0+IFByb21pc2U8T3BlbkFJRGlyZWN0Q3JlZGVudGlhbHM+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVdlYlNvY2tldExpa2Uge1xuICBvbihldmVudDogXCJvcGVuXCIsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKTogdGhpcztcbiAgb24oZXZlbnQ6IFwibWVzc2FnZVwiLCBsaXN0ZW5lcjogKGRhdGE6IFJhd0RhdGEsIGlzQmluYXJ5OiBib29sZWFuKSA9PiB2b2lkKTogdGhpcztcbiAgb24oZXZlbnQ6IFwiY2xvc2VcIiwgbGlzdGVuZXI6IChjb2RlOiBudW1iZXIsIHJlYXNvbjogQnVmZmVyKSA9PiB2b2lkKTogdGhpcztcbiAgb24oZXZlbnQ6IFwiZXJyb3JcIiwgbGlzdGVuZXI6IChlcnJvcjogRXJyb3IpID0+IHZvaWQpOiB0aGlzO1xuICBvbihcbiAgICBldmVudDogXCJ1bmV4cGVjdGVkLXJlc3BvbnNlXCIsXG4gICAgbGlzdGVuZXI6IChyZXF1ZXN0OiBDbGllbnRSZXF1ZXN0LCByZXNwb25zZTogeyBzdGF0dXNDb2RlPzogbnVtYmVyIH0pID0+IHZvaWQsXG4gICk6IHRoaXM7XG4gIG9mZihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IG5ldmVyW10pID0+IHZvaWQpOiB0aGlzO1xuICBzZW5kKGRhdGE6IHN0cmluZywgY2FsbGJhY2s/OiAoZXJyb3I/OiBFcnJvcikgPT4gdm9pZCk6IHZvaWQ7XG4gIGNsb3NlKGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IHN0cmluZyk6IHZvaWQ7XG4gIHRlcm1pbmF0ZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBPcGVuQUlXZWJTb2NrZXRGYWN0b3J5ID0gKHVybDogc3RyaW5nLCBvcHRpb25zOiBDbGllbnRPcHRpb25zKSA9PiBPcGVuQUlXZWJTb2NrZXRMaWtlO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVdlYlNvY2tldFRyYW5zcG9ydE9wdGlvbnMgZXh0ZW5kcyBPcGVuQUlIdHRwc1RyYW5zcG9ydE9wdGlvbnMge1xuICB3ZWJTb2NrZXRGYWN0b3J5PzogT3BlbkFJV2ViU29ja2V0RmFjdG9yeTtcbn1cblxudHlwZSBTb2NrZXRSZWNvcmQgPVxuICB8IHsga2luZDogXCJvcGVuXCIgfVxuICB8IHsga2luZDogXCJtZXNzYWdlXCI7IGRhdGE6IFJhd0RhdGE7IGlzQmluYXJ5OiBib29sZWFuIH1cbiAgfCB7IGtpbmQ6IFwiY2xvc2VcIjsgY29kZTogbnVtYmVyOyByZWFzb246IHN0cmluZyB9XG4gIHwgeyBraW5kOiBcImVycm9yXCI7IGVycm9yOiBFcnJvciB9XG4gIHwgeyBraW5kOiBcInJlamVjdGVkXCI7IHN0YXR1cz86IG51bWJlciB9O1xuXG5jb25zdCBNQVhfQlVGRkVSRURfU09DS0VUX1JFQ09SRFMgPSAxNjAwO1xuXG5mdW5jdGlvbiB3ZWJzb2NrZXRVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcGFyc2VkOiBVUkw7XG5cbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBuZXcgVVJMKHVybCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoYEludmFsaWQgT3BlbkFJIFJlc3BvbnNlcyBVUkw6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgfVxuXG4gIHBhcnNlZC5wcm90b2NvbCA9IHBhcnNlZC5wcm90b2NvbCA9PT0gXCJodHRwczpcIiA/IFwid3NzOlwiIDogXCJ3czpcIjtcblxuICByZXR1cm4gcGFyc2VkLnRvU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIHJhd0RhdGFUZXh0KGRhdGE6IFJhd0RhdGEpOiBzdHJpbmcge1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkgcmV0dXJuIEJ1ZmZlci5jb25jYXQoZGF0YSkudG9TdHJpbmcoKTtcblxuICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSByZXR1cm4gQnVmZmVyLmZyb20obmV3IFVpbnQ4QXJyYXkoZGF0YSkpLnRvU3RyaW5nKCk7XG5cbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRhdGEpLnRvU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIHNvY2tldEV2ZW50cyhzb2NrZXQ6IE9wZW5BSVdlYlNvY2tldExpa2UsIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gIGNvbnN0IHJlY29yZHM6IFNvY2tldFJlY29yZFtdID0gW107XG4gIGNvbnN0IHdhaXRlcnM6IEFycmF5PChyZWNvcmQ6IFNvY2tldFJlY29yZCkgPT4gdm9pZD4gPSBbXTtcbiAgbGV0IGFjdGl2ZSA9IHRydWU7XG5cbiAgY29uc3QgcHVzaCA9IChyZWNvcmQ6IFNvY2tldFJlY29yZCkgPT4ge1xuICAgIGlmICghYWN0aXZlKSByZXR1cm47XG4gICAgY29uc3Qgd2FpdGVyID0gd2FpdGVycy5zaGlmdCgpO1xuXG4gICAgaWYgKHdhaXRlcikgd2FpdGVyKHJlY29yZCk7XG4gICAgZWxzZSBpZiAocmVjb3Jkcy5sZW5ndGggPCBNQVhfQlVGRkVSRURfU09DS0VUX1JFQ09SRFMpIHJlY29yZHMucHVzaChyZWNvcmQpO1xuICAgIGVsc2Uge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgICByZWNvcmRzLmxlbmd0aCA9IDA7XG4gICAgICBzb2NrZXQudGVybWluYXRlKCk7XG5cbiAgICAgIGNvbnN0IG92ZXJmbG93ID0ge1xuICAgICAgICBraW5kOiBcImVycm9yXCIgYXMgY29uc3QsXG4gICAgICAgIGVycm9yOiBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcbiAgICAgICAgICBgT3BlbkFJIFdlYlNvY2tldCBleGNlZWRlZCB0aGUgJHtNQVhfQlVGRkVSRURfU09DS0VUX1JFQ09SRFN9LXJlY29yZCByZWNlaXZlIGJ1ZmZlcmAsXG4gICAgICAgICAgXCJ3ZWJzb2NrZXRfYmFja3ByZXNzdXJlXCIsXG4gICAgICAgICksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvdmVyZmxvd1dhaXRlciA9IHdhaXRlcnMuc2hpZnQoKTtcblxuICAgICAgaWYgKG92ZXJmbG93V2FpdGVyKSBvdmVyZmxvd1dhaXRlcihvdmVyZmxvdyk7XG4gICAgICBlbHNlIHJlY29yZHMucHVzaChvdmVyZmxvdyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG9uT3BlbiA9ICgpID0+IHB1c2goeyBraW5kOiBcIm9wZW5cIiB9KTtcbiAgY29uc3Qgb25NZXNzYWdlID0gKGRhdGE6IFJhd0RhdGEsIGlzQmluYXJ5OiBib29sZWFuKSA9PiBwdXNoKHsga2luZDogXCJtZXNzYWdlXCIsIGRhdGEsIGlzQmluYXJ5IH0pO1xuXG4gIGNvbnN0IG9uQ2xvc2UgPSAoY29kZTogbnVtYmVyLCByZWFzb246IEJ1ZmZlcikgPT5cbiAgICBwdXNoKHsga2luZDogXCJjbG9zZVwiLCBjb2RlLCByZWFzb246IHJlYXNvbi50b1N0cmluZygpIH0pO1xuXG4gIGNvbnN0IG9uRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiBwdXNoKHsga2luZDogXCJlcnJvclwiLCBlcnJvciB9KTtcblxuICBjb25zdCBvblVuZXhwZWN0ZWRSZXNwb25zZSA9IChfcmVxdWVzdDogQ2xpZW50UmVxdWVzdCwgcmVzcG9uc2U6IHsgc3RhdHVzQ29kZT86IG51bWJlciB9KSA9PlxuICAgIHB1c2goeyBraW5kOiBcInJlamVjdGVkXCIsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzQ29kZSB9KTtcblxuICBzb2NrZXQub24oXCJvcGVuXCIsIG9uT3Blbik7XG4gIHNvY2tldC5vbihcIm1lc3NhZ2VcIiwgb25NZXNzYWdlKTtcbiAgc29ja2V0Lm9uKFwiY2xvc2VcIiwgb25DbG9zZSk7XG4gIHNvY2tldC5vbihcImVycm9yXCIsIG9uRXJyb3IpO1xuICBzb2NrZXQub24oXCJ1bmV4cGVjdGVkLXJlc3BvbnNlXCIsIG9uVW5leHBlY3RlZFJlc3BvbnNlKTtcblxuICBjb25zdCBvbkFib3J0ID0gKCkgPT4ge1xuICAgIHNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICBwdXNoKHsga2luZDogXCJlcnJvclwiLCBlcnJvcjogYWJvcnRFcnJvcihzaWduYWwpIH0pO1xuICB9O1xuXG4gIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcblxuICByZXR1cm4ge1xuICAgIG5leHQ6ICgpID0+XG4gICAgICByZWNvcmRzLmxlbmd0aFxuICAgICAgICA/IFByb21pc2UucmVzb2x2ZShyZWNvcmRzLnNoaWZ0KCkhKVxuICAgICAgICA6IG5ldyBQcm9taXNlPFNvY2tldFJlY29yZD4oKHJlc29sdmUpID0+IHdhaXRlcnMucHVzaChyZXNvbHZlKSksXG4gICAgY2xlYW51cDogKCkgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgICBzaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgIHNvY2tldC5vZmYoXCJvcGVuXCIsIG9uT3Blbik7XG4gICAgICBzb2NrZXQub2ZmKFwibWVzc2FnZVwiLCBvbk1lc3NhZ2UpO1xuICAgICAgc29ja2V0Lm9mZihcImNsb3NlXCIsIG9uQ2xvc2UpO1xuICAgICAgLy8gZXJyb3Ig66as7Iqk64SI64qUIOuCqOq4tOuLpChhY3RpdmU9ZmFsc2XrnbwgcHVzaOuKlCBuby1vcCkuIENPTk5FQ1RJTkcg7IaM7LyT7J2YIHRlcm1pbmF0ZSgp64qUXG4gICAgICAvLyDri6TsnYwgdGlja+yXkCBlcnJvcuulvCBlbWl07ZWY66+A66GcLCDrlrzslrQg65GQ66m0IFVuaGFuZGxlZCAnZXJyb3In66GcIO2UhOuhnOyEuOyKpOqwgCDso73ripTri6QuXG4gICAgICBzb2NrZXQub2ZmKFwidW5leHBlY3RlZC1yZXNwb25zZVwiLCBvblVuZXhwZWN0ZWRSZXNwb25zZSk7XG4gICAgICByZWNvcmRzLmxlbmd0aCA9IDA7XG5cbiAgICAgIGNvbnN0IGNsb3NlZCA9IHtcbiAgICAgICAga2luZDogXCJlcnJvclwiIGFzIGNvbnN0LFxuICAgICAgICBlcnJvcjogbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJPcGVuQUkgV2ViU29ja2V0IGV2ZW50IHN0cmVhbSB3YXMgY2xvc2VkXCIpLFxuICAgICAgfTtcblxuICAgICAgd2FpdGVycy5zcGxpY2UoMCkuZm9yRWFjaCgod2FpdGVyKSA9PiB3YWl0ZXIoY2xvc2VkKSk7XG4gICAgfSxcbiAgICBkZXRhY2hBYm9ydDogKCkgPT4gc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFib3J0RXJyb3Ioc2lnbmFsPzogQWJvcnRTaWduYWwpOiBFcnJvciB7XG4gIHJldHVybiBzaWduYWw/LnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yXG4gICAgPyBzaWduYWwucmVhc29uXG4gICAgOiBuZXcgRE9NRXhjZXB0aW9uKFwiQWJvcnRlZFwiLCBcIkFib3J0RXJyb3JcIik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5leHRQb29sZWRSZWNvcmQoXG4gIGV2ZW50czogUmV0dXJuVHlwZTx0eXBlb2Ygc29ja2V0RXZlbnRzPixcbiAgc29ja2V0OiBPcGVuQUlXZWJTb2NrZXRMaWtlLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8U29ja2V0UmVjb3JkPiB7XG4gIGlmICghc2lnbmFsKSByZXR1cm4gZXZlbnRzLm5leHQoKTtcblxuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHRocm93IGFib3J0RXJyb3Ioc2lnbmFsKTtcblxuICByZXR1cm4gbmV3IFByb21pc2U8U29ja2V0UmVjb3JkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb25BYm9ydCA9ICgpID0+IHtcbiAgICAgIHNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgIHJlamVjdChhYm9ydEVycm9yKHNpZ25hbCkpO1xuICAgIH07XG5cbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB2b2lkIGV2ZW50c1xuICAgICAgLm5leHQoKVxuICAgICAgLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpO1xuICAgICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjYWNoZUFmZmluaXR5VXVpZChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGhleCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShrZXkpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCAzMikuc3BsaXQoXCJcIik7XG4gIGhleFsxMl0gPSBcIjRcIjtcbiAgaGV4WzE2XSA9ICgoTnVtYmVyLnBhcnNlSW50KGhleFsxNl0hLCAxNikgJiAweDMpIHwgMHg4KS50b1N0cmluZygxNik7XG5cbiAgcmV0dXJuIGAke2hleC5zbGljZSgwLCA4KS5qb2luKFwiXCIpfS0ke2hleC5zbGljZSg4LCAxMikuam9pbihcIlwiKX0tJHtoZXguc2xpY2UoMTIsIDE2KS5qb2luKFwiXCIpfS0ke2hleC5zbGljZSgxNiwgMjApLmpvaW4oXCJcIil9LSR7aGV4LnNsaWNlKDIwKS5qb2luKFwiXCIpfWA7XG59XG5cbnR5cGUgQWZmaW5pdHlDb25uZWN0aW9uID0ge1xuICBzb2NrZXQ6IE9wZW5BSVdlYlNvY2tldExpa2U7XG4gIGV2ZW50czogUmV0dXJuVHlwZTx0eXBlb2Ygc29ja2V0RXZlbnRzPjtcbiAgY2xvc2VkPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlXZWJTb2NrZXRUcmFuc3BvcnQgaW1wbGVtZW50cyBPcGVuQUlSZXNwb25zZXNUcmFuc3BvcnQge1xuICBzdGF0aWMgcmVhZG9ubHkgTUFYX0FGRklOSVRZX0NPTk5FQ1RJT05TID0gMTY7XG4gIGNyZWRlbnRpYWxzOiBPcGVuQUlEaXJlY3RDcmVkZW50aWFscztcbiAgcmVhZG9ubHkgcmVmcmVzaENyZWRlbnRpYWxzPzogKCkgPT4gUHJvbWlzZTxPcGVuQUlEaXJlY3RDcmVkZW50aWFscz47XG4gIHJlYWRvbmx5IHdlYlNvY2tldEZhY3Rvcnk6IE9wZW5BSVdlYlNvY2tldEZhY3Rvcnk7XG4gIHJlYWRvbmx5IGFmZmluaXR5Q29ubmVjdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgQWZmaW5pdHlDb25uZWN0aW9uPigpO1xuICByZWFkb25seSBidXN5QWZmaW5pdGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wZW5BSVdlYlNvY2tldFRyYW5zcG9ydE9wdGlvbnMpIHtcbiAgICB0aGlzLmNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscztcbiAgICB0aGlzLnJlZnJlc2hDcmVkZW50aWFscyA9IG9wdGlvbnMucmVmcmVzaENyZWRlbnRpYWxzO1xuICAgIHRoaXMud2ViU29ja2V0RmFjdG9yeSA9XG4gICAgICBvcHRpb25zLndlYlNvY2tldEZhY3RvcnkgPz8gKCh1cmwsIHdzT3B0aW9ucykgPT4gbmV3IFdzQ2xpZW50KHVybCwgd3NPcHRpb25zKSk7XG4gIH1cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZm9yRWFjaCgoeyBzb2NrZXQsIGV2ZW50cyB9KSA9PiB7XG4gICAgICBldmVudHMuY2xlYW51cCgpO1xuICAgICAgc29ja2V0LmNsb3NlKDEwMDAsIFwidHJhbnNwb3J0IGNsb3NlZFwiKTtcbiAgICB9KTtcbiAgICB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuY2xlYXIoKTtcbiAgICB0aGlzLmJ1c3lBZmZpbml0aWVzLmNsZWFyKCk7XG4gIH1cblxuICAvLyDsnKDtnLQg7Jew6rKw66eMIOy2ley2nO2VnOuLpC4g7KCE67aAIOyCrOyaqSDspJHsnbTrqbQgZmFsc2Xrpbwg67CY7ZmY7ZW0IOydvO2ajOyEsSDshozsvJPsnLzroZwg7LKY66as7ZWc64ukLlxuICByZW1lbWJlckFmZmluaXR5Q29ubmVjdGlvbih0aHJlYWRJZDogc3RyaW5nLCBjb25uZWN0aW9uOiBBZmZpbml0eUNvbm5lY3Rpb24pOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLmhhcyh0aHJlYWRJZCkgJiZcbiAgICAgIHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5zaXplID49IE9wZW5BSVdlYlNvY2tldFRyYW5zcG9ydC5NQVhfQUZGSU5JVFlfQ09OTkVDVElPTlNcbiAgICApIHtcbiAgICAgIGNvbnN0IGlkbGVLZXkgPSBbLi4udGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLmtleXMoKV0uZmluZChcbiAgICAgICAgKGtleSkgPT4gIXRoaXMuYnVzeUFmZmluaXRpZXMuaGFzKGtleSksXG4gICAgICApO1xuXG4gICAgICBpZiAoaWRsZUtleSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBpZGxlID0gdGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLmdldChpZGxlS2V5KSE7XG4gICAgICBpZGxlLmV2ZW50cy5jbGVhbnVwKCk7XG4gICAgICBpZGxlLnNvY2tldC5jbG9zZSgxMDAwLCBcImFmZmluaXR5IGNhY2hlIGV2aWN0ZWRcIik7XG4gICAgICB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZGVsZXRlKGlkbGVLZXkpO1xuICAgIH1cblxuICAgIHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5zZXQodGhyZWFkSWQsIGNvbm5lY3Rpb24pO1xuXG4gICAgLy8g7Jyg7Zy0IOyDge2DnOyXkOyEnCBiYWNrZW5kIOqwgCDrgYrsnYAg7IaM7LyT7J2EIOuLpOydjCDsmpTssq3snbQg7KeR7Ja065Ok7KeAIOyViuuPhOuhnSDsupDsi5zsl5DshJwg7KCc6rGw7ZWc64ukLlxuICAgIGNvbnN0IGRyb3AgPSAoKSA9PiB7XG4gICAgICBjb25uZWN0aW9uLmNsb3NlZCA9IHRydWU7XG5cbiAgICAgIGlmICh0aGlzLmJ1c3lBZmZpbml0aWVzLmhhcyh0aHJlYWRJZCkpIHJldHVybjtcblxuICAgICAgaWYgKHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5nZXQodGhyZWFkSWQpICE9PSBjb25uZWN0aW9uKSByZXR1cm47XG4gICAgICB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZGVsZXRlKHRocmVhZElkKTtcbiAgICAgIGNvbm5lY3Rpb24uZXZlbnRzLmNsZWFudXAoKTtcbiAgICB9O1xuXG4gICAgY29ubmVjdGlvbi5zb2NrZXQub24oXCJjbG9zZVwiLCBkcm9wKTtcbiAgICBjb25uZWN0aW9uLnNvY2tldC5vbihcImVycm9yXCIsIGRyb3ApO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyAqc3RyZWFtKHJlcXVlc3Q6IE9wZW5BSVRyYW5zcG9ydFJlcXVlc3QpOiBBc3luY0dlbmVyYXRvcjxPcGVuQUlOb3JtYWxpemVkRXZlbnQ+IHtcbiAgICBsZXQgcmVmcmVzaGVkID0gZmFsc2U7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHJlcXVlc3Quc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBhYm9ydEVycm9yKHJlcXVlc3Quc2lnbmFsKTtcbiAgICAgIGNvbnN0IGhhc0FmZmluaXR5ID0gcmVxdWVzdC5ib2R5LnByb21wdF9jYWNoZV9rZXkgIT09IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJldGFpbkNvbm5lY3Rpb24gPSBoYXNBZmZpbml0eSAmJiAhdGhpcy5idXN5QWZmaW5pdGllcy5oYXMocmVxdWVzdC50aHJlYWRJZCk7XG5cbiAgICAgIGlmIChyZXRhaW5Db25uZWN0aW9uKSB0aGlzLmJ1c3lBZmZpbml0aWVzLmFkZChyZXF1ZXN0LnRocmVhZElkKTtcbiAgICAgIGNvbnN0IGVudHJ5ID0gcmV0YWluQ29ubmVjdGlvbiA/IHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5nZXQocmVxdWVzdC50aHJlYWRJZCkgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChlbnRyeT8uY2xvc2VkKSB7XG4gICAgICAgIHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5kZWxldGUocmVxdWVzdC50aHJlYWRJZCk7XG4gICAgICAgIGVudHJ5LmV2ZW50cy5jbGVhbnVwKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhY2hlZCA9IGVudHJ5Py5jbG9zZWQgPyB1bmRlZmluZWQgOiBlbnRyeTtcbiAgICAgIGxldCByZXRhaW5lZCA9IHJldGFpbkNvbm5lY3Rpb247XG5cbiAgICAgIGNvbnN0IHNvY2tldCA9XG4gICAgICAgIGNhY2hlZD8uc29ja2V0ID8/XG4gICAgICAgIHRoaXMud2ViU29ja2V0RmFjdG9yeSh3ZWJzb2NrZXRVcmwoQ0hBVEdQVF9DT0RFWF9SRVNQT05TRVNfVVJMKSwge1xuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIC4uLmJ1aWxkQ29kZXhJZGVudGl0eUhlYWRlcnModGhpcy5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbiwgdGhpcy5jcmVkZW50aWFscy5hY2NvdW50SWQsIHtcbiAgICAgICAgICAgICAgc2Vzc2lvbklkOiByZXF1ZXN0LnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgdGhyZWFkSWQ6IHJlcXVlc3QudGhyZWFkSWQsXG4gICAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDogcmVxdWVzdC5jbGllbnRSZXF1ZXN0SWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIFwiT3BlbkFJLUJldGFcIjogXCJyZXNwb25zZXNfd2Vic29ja2V0cz0yMDI2LTAyLTA2XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGV2ZW50cyA9IGNhY2hlZD8uZXZlbnRzID8/IHNvY2tldEV2ZW50cyhzb2NrZXQsIHJlcXVlc3Quc2lnbmFsKTtcbiAgICAgIGxldCBjb21wbGV0ZWQgPSBmYWxzZTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgICAgICBjb25zdCBoYW5kc2hha2UgPSBhd2FpdCBldmVudHMubmV4dCgpO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaGFuZHNoYWtlLmtpbmQgPT09IFwicmVqZWN0ZWRcIiAmJlxuICAgICAgICAgICAgaGFuZHNoYWtlLnN0YXR1cyA9PT0gNDAxICYmXG4gICAgICAgICAgICAhcmVmcmVzaGVkICYmXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hDcmVkZW50aWFsc1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgc29ja2V0LnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGF3YWl0IHRoaXMucmVmcmVzaENyZWRlbnRpYWxzKCk7XG4gICAgICAgICAgICByZWZyZXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhbmRzaGFrZS5raW5kID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFxuICAgICAgICAgICAgICBgT3BlbkFJIFdlYlNvY2tldCBoYW5kc2hha2UgcmVqZWN0ZWQke2hhbmRzaGFrZS5zdGF0dXMgPyBgIHdpdGggSFRUUCAke2hhbmRzaGFrZS5zdGF0dXN9YCA6IFwiXCJ9YCxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBoYW5kc2hha2Uuc3RhdHVzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFuZHNoYWtlLmtpbmQgPT09IFwiZXJyb3JcIikgdGhyb3cgaGFuZHNoYWtlLmVycm9yO1xuXG4gICAgICAgICAgaWYgKGhhbmRzaGFrZS5raW5kICE9PSBcIm9wZW5cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJPcGVuQUkgV2ViU29ja2V0IGNsb3NlZCBiZWZvcmUgdGhlIGhhbmRzaGFrZSBjb21wbGV0ZWRcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJldGFpbkNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHJldGFpbmVkID0gdGhpcy5yZW1lbWJlckFmZmluaXR5Q29ubmVjdGlvbihyZXF1ZXN0LnRocmVhZElkLCB7IHNvY2tldCwgZXZlbnRzIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IHR5cGU6IFwicmVzcG9uc2UuY3JlYXRlXCIsIC4uLnJlcXVlc3QuYm9keSB9KSwgKGVycm9yKSA9PlxuICAgICAgICAgICAgZXJyb3IgPyByZWplY3QoZXJyb3IpIDogcmVzb2x2ZSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgY29uc3QgcmVjb3JkID0gY2FjaGVkXG4gICAgICAgICAgICA/IGF3YWl0IG5leHRQb29sZWRSZWNvcmQoZXZlbnRzLCBzb2NrZXQsIHJlcXVlc3Quc2lnbmFsKVxuICAgICAgICAgICAgOiBhd2FpdCBldmVudHMubmV4dCgpO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5raW5kID09PSBcIm1lc3NhZ2VcIikge1xuICAgICAgICAgICAgaWYgKHJlY29yZC5pc0JpbmFyeSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIk9wZW5BSSBXZWJTb2NrZXQgc2VudCBhbiB1bmV4cGVjdGVkIGJpbmFyeSBtZXNzYWdlXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmF3OiBKc29uVmFsdWU7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIC8vIEpTT04ucGFyc2Ugd2l0aG91dCBhIHJldml2ZXIgeWllbGRzIG9ubHkgSlNPTiB2YWx1ZXMuXG4gICAgICAgICAgICAgIHJhdyA9IEpTT04ucGFyc2UocmF3RGF0YVRleHQocmVjb3JkLmRhdGEpKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIk9wZW5BSSBXZWJTb2NrZXQgc2VudCBpbnZhbGlkIEpTT05cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbm9ybWFsaXplT3BlbkFJRXZlbnQocmF3KTtcblxuICAgICAgICAgICAgaWYgKCFldmVudCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSBcImNvbXBsZXRlZFwiKSB7XG4gICAgICAgICAgICAgIGNvbXBsZXRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgaWYgKHJldGFpbmVkKSBldmVudHMuZGV0YWNoQWJvcnQoKTtcbiAgICAgICAgICAgICAgZWxzZSBzb2NrZXQuY2xvc2UoMTAwMCwgXCJyZXNwb25zZSBjb21wbGV0ZWRcIik7XG4gICAgICAgICAgICAgIHlpZWxkIGV2ZW50O1xuXG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgeWllbGQgZXZlbnQ7XG5cbiAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSBcImVycm9yXCIpIHRocm93IGV2ZW50LmVycm9yO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLmtpbmQgPT09IFwiZXJyb3JcIikge1xuICAgICAgICAgICAgdGhyb3cgcmVjb3JkLmVycm9yO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLmtpbmQgPT09IFwiY2xvc2VcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXG4gICAgICAgICAgICAgIGBPcGVuQUkgV2ViU29ja2V0IGNsb3NlZCBiZWZvcmUgYSB0ZXJtaW5hbCByZXNwb25zZSBldmVudCAoJHtyZWNvcmQuY29kZX0ke3JlY29yZC5yZWFzb24gPyBgOiAke3JlY29yZC5yZWFzb259YCA6IFwiXCJ9KWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIk9wZW5BSSBXZWJTb2NrZXQgZW1pdHRlZCBhbiB1bmV4cGVjdGVkIGhhbmRzaGFrZSBldmVudFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmICghY29tcGxldGVkIHx8ICFyZXRhaW5lZCkge1xuICAgICAgICAgIGlmIChyZXRhaW5lZCkgdGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLmRlbGV0ZShyZXF1ZXN0LnRocmVhZElkKTtcbiAgICAgICAgICBldmVudHMuY2xlYW51cCgpO1xuXG4gICAgICAgICAgaWYgKCFjb21wbGV0ZWQpIHNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXRhaW5Db25uZWN0aW9uKSB0aGlzLmJ1c3lBZmZpbml0aWVzLmRlbGV0ZShyZXF1ZXN0LnRocmVhZElkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gT3BlbkFJIGVycm9yIGJvZGllcyBjYXJyeSBgZXJyb3JgIGFzIGEgc3RyaW5nIG9yIGFzIHsgbWVzc2FnZSwgY29kZSB9OyBtaXN0eXBlZCBmaWVsZHMgYXJlIGlnbm9yZWQuXG5jb25zdCBvcGVuQUlFcnJvckJvZHlTY2hlbWEgPSB6Lmxvb3NlT2JqZWN0KHtcbiAgZXJyb3I6IHoudW5rbm93bigpLm9wdGlvbmFsKCksXG4gIG1lc3NhZ2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5jYXRjaCh1bmRlZmluZWQpLFxuICBjb2RlOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuY2F0Y2godW5kZWZpbmVkKSxcbn0pO1xuXG5jb25zdCBvcGVuQUlFcnJvckRldGFpbFNjaGVtYSA9IHoubG9vc2VPYmplY3Qoe1xuICBtZXNzYWdlOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuY2F0Y2godW5kZWZpbmVkKSxcbiAgY29kZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLmNhdGNoKHVuZGVmaW5lZCksXG59KTtcblxuZnVuY3Rpb24gcmVxdWVzdHNUcmFuc3BhcmVudEltYWdlKFxuICBpbWFnZUdlbmVyYXRpb246IE9wZW5BSVJlc3BvbnNlc09wdGlvbnNbXCJpbWFnZUdlbmVyYXRpb25cIl0sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpbWFnZUdlbmVyYXRpb24gIT09IHVuZGVmaW5lZCAmJlxuICAgIGltYWdlR2VuZXJhdGlvbiAhPT0gdHJ1ZSAmJlxuICAgIGltYWdlR2VuZXJhdGlvbiAhPT0gZmFsc2UgJiZcbiAgICBpbWFnZUdlbmVyYXRpb24uYmFja2dyb3VuZCA9PT0gXCJ0cmFuc3BhcmVudFwiXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc3BvbnNlRXJyb3IocmVzcG9uc2U6IFJlc3BvbnNlKTogUHJvbWlzZTxPcGVuQUlQcm90b2NvbEVycm9yPiB7XG4gIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCkuY2F0Y2goKCkgPT4gXCJcIik7XG4gIGxldCBtZXNzYWdlID0gdGV4dCB8fCByZXNwb25zZS5zdGF0dXNUZXh0IHx8IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWA7XG4gIGxldCBjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBvcGVuQUlFcnJvckJvZHlTY2hlbWEuc2FmZVBhcnNlKEpTT04ucGFyc2UodGV4dCkpO1xuXG4gICAgaWYgKHBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHBhcnNlZC5kYXRhLmVycm9yO1xuICAgICAgY29uc3QgZXJyb3JEZXRhaWwgPSBvcGVuQUlFcnJvckRldGFpbFNjaGVtYS5zYWZlUGFyc2UoZXJyb3IpLmRhdGE7XG4gICAgICBtZXNzYWdlID1cbiAgICAgICAgZXJyb3JEZXRhaWw/Lm1lc3NhZ2UgPz8gcGFyc2VkLmRhdGEubWVzc2FnZSA/PyB6LnN0cmluZygpLnNhZmVQYXJzZShlcnJvcikuZGF0YSA/PyBtZXNzYWdlO1xuICAgICAgY29kZSA9IGVycm9yRGV0YWlsPy5jb2RlID8/IHBhcnNlZC5kYXRhLmNvZGU7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICBjb2RlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKG1lc3NhZ2UsIGNvZGUsIHJlc3BvbnNlLnN0YXR1cyk7XG59XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlIdHRwc1RyYW5zcG9ydCBpbXBsZW1lbnRzIE9wZW5BSVJlc3BvbnNlc1RyYW5zcG9ydCB7XG4gIGNyZWRlbnRpYWxzOiBPcGVuQUlEaXJlY3RDcmVkZW50aWFscztcbiAgcmVhZG9ubHkgZmV0Y2hJbXBsOiB0eXBlb2YgZmV0Y2g7XG4gIHJlYWRvbmx5IHJlZnJlc2hDcmVkZW50aWFscz86ICgpID0+IFByb21pc2U8T3BlbkFJRGlyZWN0Q3JlZGVudGlhbHM+O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wZW5BSUh0dHBzVHJhbnNwb3J0T3B0aW9ucykge1xuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzO1xuICAgIHRoaXMuZmV0Y2hJbXBsID0gb3B0aW9ucy5mZXRjaCA/PyBmZXRjaDtcbiAgICB0aGlzLnJlZnJlc2hDcmVkZW50aWFscyA9IG9wdGlvbnMucmVmcmVzaENyZWRlbnRpYWxzO1xuICB9XG5cbiAgYXN5bmMgKnN0cmVhbShyZXF1ZXN0OiBPcGVuQUlUcmFuc3BvcnRSZXF1ZXN0KTogQXN5bmNHZW5lcmF0b3I8T3BlbkFJTm9ybWFsaXplZEV2ZW50PiB7XG4gICAgbGV0IHJlZnJlc2hlZCA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaEltcGwoQ0hBVEdQVF9DT0RFWF9SRVNQT05TRVNfVVJMLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IGJ1aWxkQ29kZXhJZGVudGl0eUhlYWRlcnMoXG4gICAgICAgICAgdGhpcy5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzLmFjY291bnRJZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZXNzaW9uSWQ6IHJlcXVlc3Quc2Vzc2lvbklkLFxuICAgICAgICAgICAgdGhyZWFkSWQ6IHJlcXVlc3QudGhyZWFkSWQsXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHJlcXVlc3QuY2xpZW50UmVxdWVzdElkLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcXVlc3QuYm9keSksXG4gICAgICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWwsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxICYmICFyZWZyZXNoZWQgJiYgdGhpcy5yZWZyZXNoQ3JlZGVudGlhbHMpIHtcbiAgICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCk7XG4gICAgICAgIHRoaXMuY3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLnJlZnJlc2hDcmVkZW50aWFscygpO1xuICAgICAgICByZWZyZXNoZWQgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgYXdhaXQgcmVzcG9uc2VFcnJvcihyZXNwb25zZSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UuYm9keSkgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJPcGVuQUkgcmVzcG9uc2UgaGFkIG5vIGJvZHlcIik7XG5cbiAgICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2Ygbm9ybWFsaXplT3BlbkFJU1NFKHJlc3BvbnNlLmJvZHkpKSB7XG4gICAgICAgIHlpZWxkIGV2ZW50O1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFJRGlyZWN0Q2xpZW50T3B0aW9ucyBleHRlbmRzIE9wZW5BSUh0dHBzVHJhbnNwb3J0T3B0aW9ucyB7XG4gIHRyYW5zcG9ydD86IE9wZW5BSVJlc3BvbnNlc1RyYW5zcG9ydDtcbiAgdHJhbnNwb3J0S2luZD86IFwiaHR0cHNcIiB8IFwid2Vic29ja2V0XCI7XG4gIHdlYlNvY2tldEZhY3Rvcnk/OiBPcGVuQUlXZWJTb2NrZXRGYWN0b3J5O1xufVxuXG5leHBvcnQgY2xhc3MgT3BlbkFJRGlyZWN0Q2xpZW50IHtcbiAgcmVhZG9ubHkgdHJhbnNwb3J0OiBPcGVuQUlSZXNwb25zZXNUcmFuc3BvcnQ7XG4gIGltYWdlQ3JlZGVudGlhbHM6IE9wZW5BSURpcmVjdENyZWRlbnRpYWxzO1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IG9wdGlvbnM6IE9wZW5BSURpcmVjdENsaWVudE9wdGlvbnMpIHtcbiAgICB0aGlzLmltYWdlQ3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzO1xuICAgIHRoaXMudHJhbnNwb3J0ID1cbiAgICAgIG9wdGlvbnMudHJhbnNwb3J0ID8/XG4gICAgICAob3B0aW9ucy50cmFuc3BvcnRLaW5kID09PSBcIndlYnNvY2tldFwiXG4gICAgICAgID8gbmV3IE9wZW5BSVdlYlNvY2tldFRyYW5zcG9ydChvcHRpb25zKVxuICAgICAgICA6IG5ldyBPcGVuQUlIdHRwc1RyYW5zcG9ydChvcHRpb25zKSk7XG4gIH1cblxuICByZXNwb25zZXMob3B0aW9uczogT3BlbkFJUmVzcG9uc2VzT3B0aW9ucywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBPcGVuQUlFdmVudFN0cmVhbSB7XG4gICAgaWYgKG9wdGlvbnMubW9kZWwgPT09IFwiZ3B0LWltYWdlLTJcIiB8fCByZXF1ZXN0c1RyYW5zcGFyZW50SW1hZ2Uob3B0aW9ucy5pbWFnZUdlbmVyYXRpb24pKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGFuZGFsb25lSW1hZ2VzKG9wdGlvbnMsIHNpZ25hbCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2xpZW50UmVxdWVzdElkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcblxuICAgIGNvbnN0IGFmZmluaXR5SWQgPSBvcHRpb25zLnByb21wdENhY2hlS2V5XG4gICAgICA/IGNhY2hlQWZmaW5pdHlVdWlkKG9wdGlvbnMucHJvbXB0Q2FjaGVLZXkpXG4gICAgICA6IGNsaWVudFJlcXVlc3RJZDtcblxuICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydC5zdHJlYW0oe1xuICAgICAgYm9keTogYnVpbGRPcGVuQUlSZXNwb25zZXNSZXF1ZXN0KFxuICAgICAgICBvcHRpb25zLnByb21wdENhY2hlS2V5ID8geyAuLi5vcHRpb25zLCBwcm9tcHRDYWNoZUtleTogYWZmaW5pdHlJZCB9IDogb3B0aW9ucyxcbiAgICAgICksXG4gICAgICBzaWduYWwsXG4gICAgICBzZXNzaW9uSWQ6IGFmZmluaXR5SWQsXG4gICAgICAvLyBwcm9tcHRDYWNoZUtleSBpcyBhbHJlYWR5IGEgb25lLXdheSBTREsgYWZmaW5pdHkgdmFsdWUsIG5ldmVyIGEgcmF3IHNlc3Npb25LZXkuXG4gICAgICB0aHJlYWRJZDogYWZmaW5pdHlJZCxcbiAgICAgIGNsaWVudFJlcXVlc3RJZCxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jICpzdGFuZGFsb25lSW1hZ2VzKFxuICAgIG9wdGlvbnM6IE9wZW5BSVJlc3BvbnNlc09wdGlvbnMsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IE9wZW5BSUV2ZW50U3RyZWFtIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gYnVpbGRTdGFuZGFsb25lSW1hZ2VSZXF1ZXN0KG9wdGlvbnMpO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IDI7IGF0dGVtcHQrKykge1xuICAgICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICh0aGlzLm9wdGlvbnMuZmV0Y2ggPz8gZmV0Y2gpKHJlcXVlc3QudXJsLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi5idWlsZENvZGV4SWRlbnRpdHlIZWFkZXJzKFxuICAgICAgICAgICAgdGhpcy5pbWFnZUNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgdGhpcy5pbWFnZUNyZWRlbnRpYWxzLmFjY291bnRJZCxcbiAgICAgICAgICApLFxuICAgICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgXCJ4LWNvZGV4LWltYWdlLXR1cm4taWRcIjogcmVxdWVzdElkLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0LmJvZHkpLFxuICAgICAgICBzaWduYWwsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxICYmIGF0dGVtcHQgPT09IDAgJiYgdGhpcy5vcHRpb25zLnJlZnJlc2hDcmVkZW50aWFscykge1xuICAgICAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKTtcbiAgICAgICAgdGhpcy5pbWFnZUNyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5vcHRpb25zLnJlZnJlc2hDcmVkZW50aWFscygpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgYXdhaXQgcmVzcG9uc2VFcnJvcihyZXNwb25zZSk7XG5cbiAgICAgIGNvbnN0IGltYWdlcyA9IGF3YWl0IHJlYWRTdGFuZGFsb25lSW1hZ2VSZXNwb25zZShcbiAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgIHJlcXVlc3RzVHJhbnNwYXJlbnRJbWFnZShvcHRpb25zLmltYWdlR2VuZXJhdGlvbiksXG4gICAgICApO1xuXG4gICAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB5aWVsZCogaW1hZ2VzO1xuICAgICAgY29uc3QgZmlyc3RJbWFnZSA9IGltYWdlc1swXTtcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgdHlwZTogXCJjb21wbGV0ZWRcIixcbiAgICAgICAgcmVzcG9uc2VJZDogcmVxdWVzdElkLFxuICAgICAgICBtb2RlbDogZmlyc3RJbWFnZT8udHlwZSA9PT0gXCJpbWFnZVwiID8gZmlyc3RJbWFnZS5nZW5lcmF0aW9uPy5tb2RlbCA6IFwiZ3B0LWltYWdlLTJcIixcbiAgICAgIH07XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRyYW5zcG9ydC5jbG9zZT8uKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQTJFQSxNQUFNLDhCQUE4QjtBQUVwQyxTQUFTLGFBQWEsS0FBcUI7Q0FDekMsSUFBSTtDQUVKLElBQUk7RUFDRixTQUFTLElBQUksSUFBSSxHQUFHO0NBQ3RCLFNBQVMsT0FBTztFQUNkLE1B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
|