@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
|
@@ -2,6 +2,7 @@ import { SD } from "../../i18n/sd.generated.js";
|
|
|
2
2
|
import { createFenceStripTransform } from "../../utils/providers/anthropic/fence-strip.js";
|
|
3
3
|
import { getAccessToken } from "../../utils/providers/common/credentials.js";
|
|
4
4
|
import { calculateCostUsd } from "../../utils/providers/common/model-cost.js";
|
|
5
|
+
import { isJsonObject, isProviderId } from "../../utils/providers/common/provider-types.js";
|
|
5
6
|
import { parseAndValidateCallerSchemas, serializeAndValidateDispatchSchema } from "../../utils/providers/common/schema-validation.js";
|
|
6
7
|
import { strictify } from "../../utils/providers/common/strictifier.js";
|
|
7
8
|
import { ProcessError, maskToken } from "./qgrid.types.js";
|
|
@@ -12,20 +13,64 @@ import { applyToolCallEmulation, isToolCallEnvelope } from "./tool-emulation.js"
|
|
|
12
13
|
import { buildToolCallSchema } from "./tool-emulation-schema.js";
|
|
13
14
|
import { InternalServerErrorException, ServiceUnavailableException } from "sonamu";
|
|
14
15
|
//#region src/application/qgrid/qgrid.dispatcher.ts
|
|
16
|
+
const PROVIDER_LABELS = {
|
|
17
|
+
openai: "OpenAI",
|
|
18
|
+
anthropic: "Anthropic",
|
|
19
|
+
grok: "Grok"
|
|
20
|
+
};
|
|
15
21
|
var QgridDispatcherClass = class {
|
|
16
22
|
tokens = /* @__PURE__ */ new Map();
|
|
17
23
|
requestCounts = /* @__PURE__ */ new Map();
|
|
18
24
|
subscriber = null;
|
|
19
|
-
|
|
20
|
-
|
|
25
|
+
dispatchers = /* @__PURE__ */ new Map();
|
|
26
|
+
#openaiDispatcher = null;
|
|
27
|
+
#anthropicDispatcher = null;
|
|
28
|
+
#grokDispatcher = null;
|
|
21
29
|
startupState = {
|
|
22
30
|
openai: "starting",
|
|
23
31
|
anthropic: "starting"
|
|
24
32
|
};
|
|
33
|
+
constructor(options = {}) {
|
|
34
|
+
if (options.grokDispatcher) this.grokDispatcher = options.grokDispatcher;
|
|
35
|
+
}
|
|
36
|
+
get openaiDispatcher() {
|
|
37
|
+
return this.#openaiDispatcher;
|
|
38
|
+
}
|
|
39
|
+
set openaiDispatcher(dispatcher) {
|
|
40
|
+
this.#openaiDispatcher = dispatcher;
|
|
41
|
+
this.register("openai", dispatcher);
|
|
42
|
+
}
|
|
43
|
+
get anthropicDispatcher() {
|
|
44
|
+
return this.#anthropicDispatcher;
|
|
45
|
+
}
|
|
46
|
+
set anthropicDispatcher(dispatcher) {
|
|
47
|
+
this.#anthropicDispatcher = dispatcher;
|
|
48
|
+
this.register("anthropic", dispatcher);
|
|
49
|
+
}
|
|
50
|
+
get grokDispatcher() {
|
|
51
|
+
return this.#grokDispatcher;
|
|
52
|
+
}
|
|
53
|
+
set grokDispatcher(dispatcher) {
|
|
54
|
+
this.#grokDispatcher = dispatcher;
|
|
55
|
+
this.register("grok", dispatcher);
|
|
56
|
+
}
|
|
57
|
+
register(provider, dispatcher) {
|
|
58
|
+
if (dispatcher) this.dispatchers.set(provider, dispatcher);
|
|
59
|
+
else this.dispatchers.delete(provider);
|
|
60
|
+
}
|
|
25
61
|
notReadyError(provider) {
|
|
26
|
-
const label = provider
|
|
62
|
+
const label = PROVIDER_LABELS[provider];
|
|
27
63
|
return this.startupState[provider] === "failed" ? new InternalServerErrorException(SD("qgrid.dispatcherFailed")(label)) : new ServiceUnavailableException(SD("qgrid.dispatcherStarting")(label));
|
|
28
64
|
}
|
|
65
|
+
resolveDispatcher(input, provider) {
|
|
66
|
+
if (!isProviderId(provider)) throw directLlmApiFallbackNotImplemented(input);
|
|
67
|
+
const dispatcher = this.dispatchers.get(provider);
|
|
68
|
+
if (!dispatcher) throw this.notReadyError(provider);
|
|
69
|
+
return {
|
|
70
|
+
provider,
|
|
71
|
+
dispatcher
|
|
72
|
+
};
|
|
73
|
+
}
|
|
29
74
|
recordCompleted(provider, tokenName) {
|
|
30
75
|
const key = `${provider}\0${tokenName}`;
|
|
31
76
|
this.requestCounts.set(key, (this.requestCounts.get(key) ?? 0) + 1);
|
|
@@ -45,43 +90,10 @@ var QgridDispatcherClass = class {
|
|
|
45
90
|
const route = parseProviderRoute(input.model);
|
|
46
91
|
const outputSchema = buildAndValidateStrictOutputSchema(input, route.provider);
|
|
47
92
|
const answerKind = input.jsonSchema ? "json" : "text";
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const decision = decideConvRouting(input, {
|
|
51
|
-
directOpenAI: true,
|
|
52
|
-
modelNamespace: `openai/${route.model}`
|
|
53
|
-
});
|
|
54
|
-
const result = await this.openaiDispatcher.generate({
|
|
55
|
-
model: route.model,
|
|
56
|
-
systemPrompt: input.system,
|
|
57
|
-
outputSchema,
|
|
58
|
-
stopAfterOutputMessage: input.tools?.length ? (text, phase) => isToolCallEnvelope(text, input.tools, answerKind, phase) : void 0,
|
|
59
|
-
thinking: input.thinking,
|
|
60
|
-
effort: input.thinking === false ? void 0 : input.effort,
|
|
61
|
-
verbosity: input.verbosity,
|
|
62
|
-
reasoningSummary: input.reasoningSummary,
|
|
63
|
-
serviceTier: input.serviceTier,
|
|
64
|
-
timeoutMs: input.timeout,
|
|
65
|
-
coldInput: decision.coldInput,
|
|
66
|
-
coldHistory: decision.coldHistory,
|
|
67
|
-
promptCacheKey: input.imageGeneration ? void 0 : decision.promptCacheKey,
|
|
68
|
-
preferredTokenId: input.preferredTokenId ?? (input.imageGeneration ? void 0 : decision.preferredTokenId),
|
|
69
|
-
requirePreferredToken: input.requirePreferredToken,
|
|
70
|
-
abortSignal,
|
|
71
|
-
imageGeneration: input.imageGeneration,
|
|
72
|
-
imageGenerationOptions: input.imageGenerationOptions
|
|
73
|
-
});
|
|
74
|
-
this.recordCompleted("openai", result.tokenName);
|
|
75
|
-
const coord = input.imageGeneration ? void 0 : issueConvContext(result.threadCoord, decision, result.threadCoord.workerId);
|
|
76
|
-
return applyToolCallEmulation(toEmulationResult(result, input.serviceTier), input.tools, {
|
|
77
|
-
threadCoord: coord,
|
|
78
|
-
images: result.images,
|
|
79
|
-
answerKind
|
|
80
|
-
});
|
|
81
|
-
} else if (route.provider === "anthropic") {
|
|
82
|
-
if (!this.anthropicDispatcher) throw this.notReadyError("anthropic");
|
|
93
|
+
const { provider, dispatcher } = this.resolveDispatcher(input, route.provider);
|
|
94
|
+
if (provider === "anthropic") {
|
|
83
95
|
const decision = decideConvRouting(input);
|
|
84
|
-
const result = await
|
|
96
|
+
const result = await dispatcher.generate({
|
|
85
97
|
model: input.model,
|
|
86
98
|
systemPrompt: composeSystemWithSchemaContract(input.system, input),
|
|
87
99
|
thinking: input.thinking,
|
|
@@ -94,66 +106,44 @@ var QgridDispatcherClass = class {
|
|
|
94
106
|
imageGeneration: input.imageGeneration,
|
|
95
107
|
imageGenerationOptions: input.imageGenerationOptions
|
|
96
108
|
});
|
|
97
|
-
this.recordCompleted(
|
|
109
|
+
this.recordCompleted(provider, result.tokenName);
|
|
98
110
|
return applyToolCallEmulation(toEmulationResult(result), input.tools, {
|
|
99
111
|
threadCoord: issueConvContext(result.threadCoord, decision),
|
|
100
112
|
answerKind
|
|
101
113
|
});
|
|
102
114
|
}
|
|
103
|
-
|
|
115
|
+
const decision = decideConvRouting(input, {
|
|
116
|
+
directProvider: provider,
|
|
117
|
+
modelNamespace: `${provider}/${route.model}`
|
|
118
|
+
});
|
|
119
|
+
const result = await dispatcher.generate({
|
|
120
|
+
...buildDirectRequest(input, route.model, outputSchema, answerKind, abortSignal),
|
|
121
|
+
promptCacheKey: input.imageGeneration ? void 0 : decision.promptCacheKey,
|
|
122
|
+
preferredTokenId: input.preferredTokenId ?? (input.imageGeneration ? void 0 : decision.preferredTokenId),
|
|
123
|
+
coldInput: decision.coldInput,
|
|
124
|
+
coldHistory: decision.coldHistory
|
|
125
|
+
});
|
|
126
|
+
this.recordCompleted(provider, result.tokenName);
|
|
127
|
+
const coord = input.imageGeneration ? void 0 : issueConvContext(result.threadCoord, decision, result.threadCoord.workerId);
|
|
128
|
+
return applyToolCallEmulation(toEmulationResult(result, input.serviceTier), input.tools, {
|
|
129
|
+
threadCoord: coord,
|
|
130
|
+
images: result.images,
|
|
131
|
+
answerKind
|
|
132
|
+
});
|
|
104
133
|
}
|
|
105
134
|
async queryStream(input, cb, abortSignal) {
|
|
106
135
|
const route = parseProviderRoute(input.model);
|
|
107
136
|
const outputSchema = buildAndValidateStrictOutputSchema(input, route.provider);
|
|
108
137
|
const answerKind = input.jsonSchema ? "json" : "text";
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const decision = decideConvRouting(input, {
|
|
112
|
-
directOpenAI: true,
|
|
113
|
-
modelNamespace: `openai/${route.model}`
|
|
114
|
-
});
|
|
115
|
-
await this.openaiDispatcher.generateStream({
|
|
116
|
-
model: route.model,
|
|
117
|
-
systemPrompt: input.system,
|
|
118
|
-
outputSchema,
|
|
119
|
-
stopAfterOutputMessage: input.tools?.length ? (text, phase) => isToolCallEnvelope(text, input.tools, answerKind, phase) : void 0,
|
|
120
|
-
thinking: input.thinking,
|
|
121
|
-
effort: input.thinking === false ? void 0 : input.effort,
|
|
122
|
-
verbosity: input.verbosity,
|
|
123
|
-
reasoningSummary: input.reasoningSummary,
|
|
124
|
-
serviceTier: input.serviceTier,
|
|
125
|
-
timeoutMs: input.timeout,
|
|
126
|
-
coldInput: decision.coldInput,
|
|
127
|
-
coldHistory: decision.coldHistory,
|
|
128
|
-
promptCacheKey: decision.promptCacheKey,
|
|
129
|
-
preferredTokenId: input.preferredTokenId ?? decision.preferredTokenId,
|
|
130
|
-
requirePreferredToken: input.requirePreferredToken,
|
|
131
|
-
abortSignal,
|
|
132
|
-
imageGeneration: input.imageGeneration,
|
|
133
|
-
imageGenerationOptions: input.imageGenerationOptions
|
|
134
|
-
}, {
|
|
135
|
-
onDelta: cb.onDelta,
|
|
136
|
-
onThreadId: cb.onThreadId,
|
|
137
|
-
onTurnId: cb.onTurnId,
|
|
138
|
-
onComplete: (turnResult) => {
|
|
139
|
-
this.recordCompleted("openai", turnResult.tokenName);
|
|
140
|
-
cb.onComplete(applyToolCallEmulation(toEmulationResult(turnResult, input.serviceTier), input.tools, {
|
|
141
|
-
threadCoord: issueConvContext(turnResult.threadCoord, decision, turnResult.threadCoord.workerId),
|
|
142
|
-
answerKind
|
|
143
|
-
}));
|
|
144
|
-
},
|
|
145
|
-
onError: cb.onError
|
|
146
|
-
});
|
|
147
|
-
return;
|
|
148
|
-
} else if (route.provider === "anthropic") {
|
|
149
|
-
if (!this.anthropicDispatcher) throw this.notReadyError("anthropic");
|
|
138
|
+
const { provider, dispatcher } = this.resolveDispatcher(input, route.provider);
|
|
139
|
+
if (provider === "anthropic") {
|
|
150
140
|
const fenceStrip = input.jsonSchema !== void 0 || Boolean(input.tools?.length) ? createFenceStripTransform() : void 0;
|
|
151
141
|
const emitDelta = fenceStrip ? (text) => {
|
|
152
142
|
const safe = fenceStrip.push(text);
|
|
153
143
|
if (safe) cb.onDelta(safe);
|
|
154
144
|
} : cb.onDelta;
|
|
155
145
|
const decision = decideConvRouting(input);
|
|
156
|
-
await
|
|
146
|
+
await dispatcher.generateStream({
|
|
157
147
|
model: input.model,
|
|
158
148
|
systemPrompt: composeSystemWithSchemaContract(input.system, input),
|
|
159
149
|
thinking: input.thinking,
|
|
@@ -169,7 +159,7 @@ var QgridDispatcherClass = class {
|
|
|
169
159
|
onDelta: emitDelta,
|
|
170
160
|
onThreadId: cb.onThreadId,
|
|
171
161
|
onComplete: (turnResult) => {
|
|
172
|
-
this.recordCompleted(
|
|
162
|
+
this.recordCompleted(provider, turnResult.tokenName);
|
|
173
163
|
const rest = fenceStrip?.flush();
|
|
174
164
|
if (rest) cb.onDelta(rest);
|
|
175
165
|
const issuedCoord = issueConvContext(turnResult.threadCoord, decision);
|
|
@@ -182,9 +172,51 @@ var QgridDispatcherClass = class {
|
|
|
182
172
|
});
|
|
183
173
|
return;
|
|
184
174
|
}
|
|
185
|
-
|
|
175
|
+
const decision = decideConvRouting(input, {
|
|
176
|
+
directProvider: provider,
|
|
177
|
+
modelNamespace: `${provider}/${route.model}`
|
|
178
|
+
});
|
|
179
|
+
await dispatcher.generateStream({
|
|
180
|
+
...buildDirectRequest(input, route.model, outputSchema, answerKind, abortSignal),
|
|
181
|
+
promptCacheKey: decision.promptCacheKey,
|
|
182
|
+
preferredTokenId: input.preferredTokenId ?? decision.preferredTokenId,
|
|
183
|
+
coldInput: decision.coldInput,
|
|
184
|
+
coldHistory: decision.coldHistory
|
|
185
|
+
}, {
|
|
186
|
+
onDelta: cb.onDelta,
|
|
187
|
+
onThreadId: cb.onThreadId,
|
|
188
|
+
onTurnId: cb.onTurnId,
|
|
189
|
+
onComplete: (turnResult) => {
|
|
190
|
+
this.recordCompleted(provider, turnResult.tokenName);
|
|
191
|
+
cb.onComplete(applyToolCallEmulation(toEmulationResult(turnResult, input.serviceTier), input.tools, {
|
|
192
|
+
threadCoord: issueConvContext(turnResult.threadCoord, decision, turnResult.threadCoord.workerId),
|
|
193
|
+
answerKind
|
|
194
|
+
}));
|
|
195
|
+
},
|
|
196
|
+
onError: cb.onError
|
|
197
|
+
});
|
|
186
198
|
}
|
|
187
199
|
};
|
|
200
|
+
function buildDirectRequest(input, model, outputSchema, answerKind, abortSignal) {
|
|
201
|
+
const request = {
|
|
202
|
+
model,
|
|
203
|
+
systemPrompt: input.system,
|
|
204
|
+
outputSchema,
|
|
205
|
+
stopAfterOutputMessage: input.tools?.length ? (text, phase) => isToolCallEnvelope(text, input.tools, answerKind, phase) : void 0,
|
|
206
|
+
thinking: input.thinking,
|
|
207
|
+
effort: input.thinking === false ? void 0 : input.effort,
|
|
208
|
+
verbosity: input.verbosity,
|
|
209
|
+
reasoningSummary: input.reasoningSummary,
|
|
210
|
+
serviceTier: input.serviceTier,
|
|
211
|
+
timeoutMs: input.timeout,
|
|
212
|
+
requirePreferredToken: input.requirePreferredToken,
|
|
213
|
+
abortSignal,
|
|
214
|
+
imageGeneration: input.imageGeneration,
|
|
215
|
+
imageGenerationOptions: input.imageGenerationOptions
|
|
216
|
+
};
|
|
217
|
+
if (input.providerOptions?.xai) request.providerOptions = { xai: { ...input.providerOptions.xai } };
|
|
218
|
+
return request;
|
|
219
|
+
}
|
|
188
220
|
function parseProviderRoute(model) {
|
|
189
221
|
if (!model?.includes("/")) return { model: model ?? "" };
|
|
190
222
|
const [provider, routedModel] = model.split("/", 2);
|
|
@@ -199,7 +231,8 @@ function directLlmApiFallbackNotImplemented(input) {
|
|
|
199
231
|
}
|
|
200
232
|
function buildStrictOutputSchema(input, provider) {
|
|
201
233
|
const outputSchema = buildRawOutputSchema(input);
|
|
202
|
-
|
|
234
|
+
if (!outputSchema) return void 0;
|
|
235
|
+
return isJsonObject(outputSchema) ? strictify(outputSchema, { provider }) : outputSchema;
|
|
203
236
|
}
|
|
204
237
|
function buildAndValidateStrictOutputSchema(input, provider = parseProviderRoute(input.model).provider) {
|
|
205
238
|
if (provider === "anthropic") {
|
|
@@ -214,13 +247,13 @@ function buildRawOutputSchema(input) {
|
|
|
214
247
|
const callerOutputSchema = parseAndValidateCallerSchemas(input);
|
|
215
248
|
return input.tools?.length ? buildToolCallSchema(input.tools, callerOutputSchema) : callerOutputSchema;
|
|
216
249
|
}
|
|
217
|
-
function completedDriverFromImageFailure(
|
|
218
|
-
if (!(
|
|
219
|
-
return applyToolCallEmulation(toEmulationResult(
|
|
250
|
+
function completedDriverFromImageFailure(cause, serviceTier) {
|
|
251
|
+
if (!(cause instanceof ImageGenerationError) || !cause.completedDriver) return void 0;
|
|
252
|
+
return applyToolCallEmulation(toEmulationResult(cause.completedDriver, serviceTier), void 0, { answerKind: "text" });
|
|
220
253
|
}
|
|
221
254
|
function toEmulationResult(result, serviceTier) {
|
|
222
|
-
const hasProviderCost = result.costUsd !== void 0 && result.costUsd > 0;
|
|
223
|
-
|
|
255
|
+
const hasProviderCost = result.costUsd !== void 0 && (result.costSource === "provider" || result.costUsd > 0);
|
|
256
|
+
const emulationResult = {
|
|
224
257
|
text: result.text,
|
|
225
258
|
tokenName: result.tokenName,
|
|
226
259
|
model: result.model,
|
|
@@ -245,11 +278,13 @@ function toEmulationResult(result, serviceTier) {
|
|
|
245
278
|
cacheCreationInputTokens5m: result.usage.cacheCreationInputTokens5m,
|
|
246
279
|
cacheCreationInputTokens1h: result.usage.cacheCreationInputTokens1h
|
|
247
280
|
}, serviceTier),
|
|
248
|
-
costSource: hasProviderCost ? "provider" : "pricing_table"
|
|
281
|
+
costSource: hasProviderCost ? result.costSource ?? "provider" : "pricing_table"
|
|
249
282
|
};
|
|
283
|
+
if (result.providerMetadata?.xai) emulationResult.providerMetadata = { xai: result.providerMetadata.xai };
|
|
284
|
+
return emulationResult;
|
|
250
285
|
}
|
|
251
286
|
const QgridDispatcher = new QgridDispatcherClass();
|
|
252
287
|
//#endregion
|
|
253
288
|
export { QgridDispatcher, QgridDispatcherClass, buildAndValidateStrictOutputSchema, buildStrictOutputSchema, completedDriverFromImageFailure };
|
|
254
289
|
|
|
255
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwcm92aWRlciDrnbzsmrDtjIXqs7wg7Yag7YGwIOy6kOyLnMK37Ya16rOELiDsupDsi5zripQgVG9rZW5TdWJzY3JpYmVy6rCAIOqwseyLoO2VnOuLpC5cblxuaW1wb3J0IHsgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbiwgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIH0gZnJvbSBcInNvbmFtdVwiO1xuXG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi8uLi9pMThuL3NkLmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgdHlwZSBBbnRocm9waWNEaXNwYXRjaGVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUZlbmNlU3RyaXBUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9mZW5jZS1zdHJpcFwiO1xuaW1wb3J0IHsgZ2V0QWNjZXNzVG9rZW4gfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9jcmVkZW50aWFsc1wiO1xuaW1wb3J0IHsgY2FsY3VsYXRlQ29zdFVzZCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL21vZGVsLWNvc3RcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXN1bHQsXG4gIHR5cGUgU3RyZWFtQ2FsbGJhY2tzLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyB0eXBlIEpzb25WYWx1ZSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLXR5cGVzXCI7XG5pbXBvcnQge1xuICBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyxcbiAgc2VyaWFsaXplQW5kVmFsaWRhdGVEaXNwYXRjaFNjaGVtYSxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc2NoZW1hLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHN0cmljdGlmeSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3N0cmljdGlmaWVyXCI7XG5pbXBvcnQge1xuICBJbWFnZUdlbmVyYXRpb25FcnJvcixcbiAgdHlwZSBPcGVuQUlEaXNwYXRjaGVyLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgZGVjaWRlQ29udlJvdXRpbmcsIGlzc3VlQ29udkNvbnRleHQgfSBmcm9tIFwiLi9jb252LXJvdXRpbmdcIjtcbmltcG9ydCB7XG4gIG1hc2tUb2tlbixcbiAgUHJvY2Vzc0Vycm9yLFxuICB0eXBlIFByb3ZpZGVyU3RhcnR1cFN0YXRlLFxuICB0eXBlIFF1ZXJ5SW5wdXQsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG4gIHR5cGUgVG9rZW5TdGF0cyxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IGNvbXBvc2VTeXN0ZW1XaXRoU2NoZW1hQ29udHJhY3QgfSBmcm9tIFwiLi9zY2hlbWEtcHJvbXB0XCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2NyaWJlciB9IGZyb20gXCIuL3Rva2VuLXN1YnNjcmliZXJcIjtcbmltcG9ydCB7IGFwcGx5VG9vbENhbGxFbXVsYXRpb24sIGlzVG9vbENhbGxFbnZlbG9wZSB9IGZyb20gXCIuL3Rvb2wtZW11bGF0aW9uXCI7XG5pbXBvcnQgeyBidWlsZFRvb2xDYWxsU2NoZW1hIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb24tc2NoZW1hXCI7XG5cbmV4cG9ydCB0eXBlIEludGVybmFsUXVlcnlJbnB1dCA9IFF1ZXJ5SW5wdXQgJiB7XG4gIHByZWZlcnJlZFRva2VuSWQ/OiBudW1iZXI7XG4gIHJlcXVpcmVQcmVmZXJyZWRUb2tlbj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgY2xhc3MgUWdyaWREaXNwYXRjaGVyQ2xhc3Mge1xuICB0b2tlbnMgPSBuZXcgTWFwPG51bWJlciwgVG9rZW5TdWJzZXRBPigpO1xuXG4gIC8vIO2UhOuhnOyEuOyKpCDsi5zsnpEg7J207ZuEIOyZhOujjOuQnCBwcm92aWRlciBnZW5lcmF0aW9uIOyImC4g7Iuk7YyoL+ykkeqwhCDsi5zrj4TripQg7KCc7Jm47ZWY66mwLFxuICAvLyDtm4Tsho0gdG9vbCB0dXJu64+EIO2VnCBnZW5lcmF0aW9u7Jy866GcIOyEvOuLpC4g64+Z66qFIO2GoO2BsOydgCBwcm92aWRlcuuzhOuhnCDrtoTrpqztlZzri6QuXG4gIHJlcXVlc3RDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIHN1YnNjcmliZXI6IFRva2VuU3Vic2NyaWJlciB8IG51bGwgPSBudWxsO1xuICBvcGVuYWlEaXNwYXRjaGVyOiBPcGVuQUlEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIGFudGhyb3BpY0Rpc3BhdGNoZXI6IEFudGhyb3BpY0Rpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcblxuICAvLyBIVFRQ6rCAIGRpc3BhdGNoZXLrs7Tri6Qg66i87KCAIOyXtOumrOuvgOuhnCDstIjquLDtmZQg7KSR6rO8IOy0iOq4sO2ZlCDsi6TtjKjrpbwg6rWs67aE7ZWc64ukLlxuICBzdGFydHVwU3RhdGU6IFJlY29yZDxcIm9wZW5haVwiIHwgXCJhbnRocm9waWNcIiwgUHJvdmlkZXJTdGFydHVwU3RhdGU+ID0ge1xuICAgIG9wZW5haTogXCJzdGFydGluZ1wiLFxuICAgIGFudGhyb3BpYzogXCJzdGFydGluZ1wiLFxuICB9O1xuXG4gIC8vIOy0iOq4sO2ZlCDspJHsl5DripQgNTAzICsgUmV0cnktQWZ0ZXIsIOy0iOq4sO2ZlCDsi6TtjKjsl5DripQgNTAw7J2EIOuwmO2ZmO2VnOuLpC5cbiAgbm90UmVhZHlFcnJvcihwcm92aWRlcjogXCJvcGVuYWlcIiB8IFwiYW50aHJvcGljXCIpOiBFcnJvciB7XG4gICAgY29uc3QgbGFiZWwgPSBwcm92aWRlciA9PT0gXCJvcGVuYWlcIiA/IFwiT3BlbkFJXCIgOiBcIkFudGhyb3BpY1wiO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0dXBTdGF0ZVtwcm92aWRlcl0gPT09IFwiZmFpbGVkXCJcbiAgICAgID8gbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oU0QoXCJxZ3JpZC5kaXNwYXRjaGVyRmFpbGVkXCIpKGxhYmVsKSlcbiAgICAgIDogbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihTRChcInFncmlkLmRpc3BhdGNoZXJTdGFydGluZ1wiKShsYWJlbCkpO1xuICB9XG5cbiAgcmVjb3JkQ29tcGxldGVkKHByb3ZpZGVyOiBzdHJpbmcsIHRva2VuTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gYCR7cHJvdmlkZXJ9XFwwJHt0b2tlbk5hbWV9YDtcbiAgICB0aGlzLnJlcXVlc3RDb3VudHMuc2V0KGtleSwgKHRoaXMucmVxdWVzdENvdW50cy5nZXQoa2V5KSA/PyAwKSArIDEpO1xuICB9XG5cbiAgcmVwbGFjZUNhY2hlKHJvd3M6IFRva2VuU3Vic2V0QVtdKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMgPSBuZXcgTWFwKHJvd3MubWFwKChyKSA9PiBbci5pZCwgcl0pKTtcbiAgfVxuXG4gIGdldFN0YXRzKCk6IFRva2VuU3RhdHNbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRva2Vucy52YWx1ZXMoKV0ubWFwKChyKSA9PiAoe1xuICAgICAgdG9rZW46IG1hc2tUb2tlbihnZXRBY2Nlc3NUb2tlbihyLmNyZWRlbnRpYWxzKSksXG4gICAgICBuYW1lOiByLm5hbWUsXG4gICAgICBwcm92aWRlcjogci5wcm92aWRlcixcbiAgICAgIHJlcXVlc3RzOiB0aGlzLnJlcXVlc3RDb3VudHMuZ2V0KGAke3IucHJvdmlkZXJ9XFwwJHtyLm5hbWV9YCkgPz8gMCxcbiAgICB9KSk7XG4gIH1cblxuICBhc3luYyBxdWVyeShpbnB1dDogSW50ZXJuYWxRdWVyeUlucHV0LCBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxRdWVyeU91dHB1dD4ge1xuICAgIGNvbnN0IHJvdXRlID0gcGFyc2VQcm92aWRlclJvdXRlKGlucHV0Lm1vZGVsKTtcbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hKGlucHV0LCByb3V0ZS5wcm92aWRlcik7XG4gICAgY29uc3QgYW5zd2VyS2luZCA9IGlucHV0Lmpzb25TY2hlbWEgPyAoXCJqc29uXCIgYXMgY29uc3QpIDogKFwidGV4dFwiIGFzIGNvbnN0KTtcblxuICAgIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgaWYgKCF0aGlzLm9wZW5haURpc3BhdGNoZXIpIHRocm93IHRoaXMubm90UmVhZHlFcnJvcihcIm9wZW5haVwiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCwge1xuICAgICAgICBkaXJlY3RPcGVuQUk6IHRydWUsXG4gICAgICAgIG1vZGVsTmFtZXNwYWNlOiBgb3BlbmFpLyR7cm91dGUubW9kZWx9YCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vcGVuYWlEaXNwYXRjaGVyLmdlbmVyYXRlKHtcbiAgICAgICAgbW9kZWw6IHJvdXRlLm1vZGVsLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgb3V0cHV0U2NoZW1hLFxuICAgICAgICBzdG9wQWZ0ZXJPdXRwdXRNZXNzYWdlOiBpbnB1dC50b29scz8ubGVuZ3RoXG4gICAgICAgICAgPyAodGV4dCwgcGhhc2UpID0+IGlzVG9vbENhbGxFbnZlbG9wZSh0ZXh0LCBpbnB1dC50b29scyEsIGFuc3dlcktpbmQsIHBoYXNlKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB0aGlua2luZzogaW5wdXQudGhpbmtpbmcsXG4gICAgICAgIGVmZm9ydDogaW5wdXQudGhpbmtpbmcgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgc2VydmljZVRpZXI6IGlucHV0LnNlcnZpY2VUaWVyLFxuICAgICAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXQsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHByb21wdENhY2hlS2V5OiBpbnB1dC5pbWFnZUdlbmVyYXRpb24gPyB1bmRlZmluZWQgOiBkZWNpc2lvbi5wcm9tcHRDYWNoZUtleSxcbiAgICAgICAgcHJlZmVycmVkVG9rZW5JZDpcbiAgICAgICAgICBpbnB1dC5wcmVmZXJyZWRUb2tlbklkID8/IChpbnB1dC5pbWFnZUdlbmVyYXRpb24gPyB1bmRlZmluZWQgOiBkZWNpc2lvbi5wcmVmZXJyZWRUb2tlbklkKSxcbiAgICAgICAgcmVxdWlyZVByZWZlcnJlZFRva2VuOiBpbnB1dC5yZXF1aXJlUHJlZmVycmVkVG9rZW4sXG4gICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZWNvcmRDb21wbGV0ZWQoXCJvcGVuYWlcIiwgcmVzdWx0LnRva2VuTmFtZSk7XG5cbiAgICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAgY29sZC1vbmx5KFI4KeudvCDsnqzsgqzsmqkg7KKM7ZGc66W8IOuwnOq4ie2VmOyngCDslYrripTri6QuIOyijO2RnOulvCDsi6TsnLzrqbRcbiAgICAgIC8vIHNlc3Npb25LZXkg7IaM67mE7J6Q7J2YIHdhcm0g7KKM7ZGc66W8IOyjveydgCDsooztkZzroZwg642u7Ja07I2oIOuLpOydjCDthY3siqTtirggdHVybiDsnbQgY29sZCDroZwg65ao7Ja07KeE64ukLlxuICAgICAgY29uc3QgY29vcmQgPSBpbnB1dC5pbWFnZUdlbmVyYXRpb25cbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBpc3N1ZUNvbnZDb250ZXh0KHJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24sIHJlc3VsdC50aHJlYWRDb29yZC53b3JrZXJJZCk7XG5cbiAgICAgIHJldHVybiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHJlc3VsdCwgaW5wdXQuc2VydmljZVRpZXIpLCBpbnB1dC50b29scywge1xuICAgICAgICB0aHJlYWRDb29yZDogY29vcmQsXG4gICAgICAgIGltYWdlczogcmVzdWx0LmltYWdlcyxcbiAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocm91dGUucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpIHtcbiAgICAgIGlmICghdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyKSB0aHJvdyB0aGlzLm5vdFJlYWR5RXJyb3IoXCJhbnRocm9waWNcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlKHtcbiAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGNvbXBvc2VTeXN0ZW1XaXRoU2NoZW1hQ29udHJhY3QoaW5wdXQuc3lzdGVtLCBpbnB1dCksXG4gICAgICAgIHRoaW5raW5nOiBpbnB1dC50aGlua2luZyxcbiAgICAgICAgZWZmb3J0OiBpbnB1dC50aGlua2luZyA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBpbnB1dC5lZmZvcnQsXG4gICAgICAgIHRpbWVvdXRNczogaW5wdXQudGltZW91dCxcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHByZWZlcnJlZFRva2VuSWQ6IGlucHV0LnByZWZlcnJlZFRva2VuSWQsXG4gICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnJlY29yZENvbXBsZXRlZChcImFudGhyb3BpY1wiLCByZXN1bHQudG9rZW5OYW1lKTtcblxuICAgICAgcmV0dXJuIGFwcGx5VG9vbENhbGxFbXVsYXRpb24odG9FbXVsYXRpb25SZXN1bHQocmVzdWx0KSwgaW5wdXQudG9vbHMsIHtcbiAgICAgICAgdGhyZWFkQ29vcmQ6IGlzc3VlQ29udkNvbnRleHQocmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbiksXG4gICAgICAgIGFuc3dlcktpbmQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBkaXJlY3RMbG1BcGlGYWxsYmFja05vdEltcGxlbWVudGVkKGlucHV0KTtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5U3RyZWFtKFxuICAgIGlucHV0OiBJbnRlcm5hbFF1ZXJ5SW5wdXQsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrczxRdWVyeU91dHB1dD4sXG4gICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcbiAgICBjb25zdCBhbnN3ZXJLaW5kID0gaW5wdXQuanNvblNjaGVtYSA/IChcImpzb25cIiBhcyBjb25zdCkgOiAoXCJ0ZXh0XCIgYXMgY29uc3QpO1xuXG4gICAgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBpZiAoIXRoaXMub3BlbmFpRGlzcGF0Y2hlcikgdGhyb3cgdGhpcy5ub3RSZWFkeUVycm9yKFwib3BlbmFpXCIpO1xuXG4gICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0LCB7XG4gICAgICAgIGRpcmVjdE9wZW5BSTogdHJ1ZSxcbiAgICAgICAgbW9kZWxOYW1lc3BhY2U6IGBvcGVuYWkvJHtyb3V0ZS5tb2RlbH1gLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLm9wZW5haURpc3BhdGNoZXIuZ2VuZXJhdGVTdHJlYW0oXG4gICAgICAgIHtcbiAgICAgICAgICBtb2RlbDogcm91dGUubW9kZWwsXG4gICAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgICAgb3V0cHV0U2NoZW1hLFxuICAgICAgICAgIHN0b3BBZnRlck91dHB1dE1lc3NhZ2U6IGlucHV0LnRvb2xzPy5sZW5ndGhcbiAgICAgICAgICAgID8gKHRleHQsIHBoYXNlKSA9PiBpc1Rvb2xDYWxsRW52ZWxvcGUodGV4dCwgaW5wdXQudG9vbHMhLCBhbnN3ZXJLaW5kLCBwaGFzZSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHRoaW5raW5nOiBpbnB1dC50aGlua2luZyxcbiAgICAgICAgICBlZmZvcnQ6IGlucHV0LnRoaW5raW5nID09PSBmYWxzZSA/IHVuZGVmaW5lZCA6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgICByZWFzb25pbmdTdW1tYXJ5OiBpbnB1dC5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgICAgIHNlcnZpY2VUaWVyOiBpbnB1dC5zZXJ2aWNlVGllcixcbiAgICAgICAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXQsXG4gICAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICAgIHByb21wdENhY2hlS2V5OiBkZWNpc2lvbi5wcm9tcHRDYWNoZUtleSxcbiAgICAgICAgICBwcmVmZXJyZWRUb2tlbklkOiBpbnB1dC5wcmVmZXJyZWRUb2tlbklkID8/IGRlY2lzaW9uLnByZWZlcnJlZFRva2VuSWQsXG4gICAgICAgICAgcmVxdWlyZVByZWZlcnJlZFRva2VuOiBpbnB1dC5yZXF1aXJlUHJlZmVycmVkVG9rZW4sXG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiBpbnB1dC5pbWFnZUdlbmVyYXRpb24sXG4gICAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9uRGVsdGE6IGNiLm9uRGVsdGEsXG4gICAgICAgICAgb25UaHJlYWRJZDogY2Iub25UaHJlYWRJZCxcbiAgICAgICAgICBvblR1cm5JZDogY2Iub25UdXJuSWQsXG4gICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVjb3JkQ29tcGxldGVkKFwib3BlbmFpXCIsIHR1cm5SZXN1bHQudG9rZW5OYW1lKTtcbiAgICAgICAgICAgIGNiLm9uQ29tcGxldGUoXG4gICAgICAgICAgICAgIGFwcGx5VG9vbENhbGxFbXVsYXRpb24oXG4gICAgICAgICAgICAgICAgdG9FbXVsYXRpb25SZXN1bHQodHVyblJlc3VsdCwgaW5wdXQuc2VydmljZVRpZXIpLFxuICAgICAgICAgICAgICAgIGlucHV0LnRvb2xzLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHRocmVhZENvb3JkOiBpc3N1ZUNvbnZDb250ZXh0KFxuICAgICAgICAgICAgICAgICAgICB0dXJuUmVzdWx0LnRocmVhZENvb3JkLFxuICAgICAgICAgICAgICAgICAgICBkZWNpc2lvbixcbiAgICAgICAgICAgICAgICAgICAgdHVyblJlc3VsdC50aHJlYWRDb29yZC53b3JrZXJJZCxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogY2Iub25FcnJvcixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgaWYgKCF0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIpIHRocm93IHRoaXMubm90UmVhZHlFcnJvcihcImFudGhyb3BpY1wiKTtcblxuICAgICAgLy8g6rWs7KGw7ZmUIOydkeuLteydgCDstZzsooUg7YWN7Iqk7Yq47JmAIOuNuO2DgCDrqqjrkZAg7L2U65Oc7Y6c7Iqk66W8IOygnOqxsO2VnOuLpC5cbiAgICAgIGNvbnN0IGhhc1NjaGVtYUNvbnRyYWN0ID0gaW5wdXQuanNvblNjaGVtYSAhPT0gdW5kZWZpbmVkIHx8IEJvb2xlYW4oaW5wdXQudG9vbHM/Lmxlbmd0aCk7XG4gICAgICBjb25zdCBmZW5jZVN0cmlwID0gaGFzU2NoZW1hQ29udHJhY3QgPyBjcmVhdGVGZW5jZVN0cmlwVHJhbnNmb3JtKCkgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBlbWl0RGVsdGEgPSBmZW5jZVN0cmlwXG4gICAgICAgID8gKHRleHQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2FmZSA9IGZlbmNlU3RyaXAucHVzaCh0ZXh0KTtcbiAgICAgICAgICAgIGlmIChzYWZlKSBjYi5vbkRlbHRhKHNhZmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgOiBjYi5vbkRlbHRhO1xuXG4gICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0KTtcbiAgICAgIGF3YWl0IHRoaXMuYW50aHJvcGljRGlzcGF0Y2hlci5nZW5lcmF0ZVN0cmVhbShcbiAgICAgICAge1xuICAgICAgICAgIG1vZGVsOiBpbnB1dC5tb2RlbCxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGNvbXBvc2VTeXN0ZW1XaXRoU2NoZW1hQ29udHJhY3QoaW5wdXQuc3lzdGVtLCBpbnB1dCksXG4gICAgICAgICAgdGhpbmtpbmc6IGlucHV0LnRoaW5raW5nLFxuICAgICAgICAgIGVmZm9ydDogaW5wdXQudGhpbmtpbmcgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogaW5wdXQuZWZmb3J0LFxuICAgICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgICBwcmVmZXJyZWRUb2tlbklkOiBpbnB1dC5wcmVmZXJyZWRUb2tlbklkLFxuICAgICAgICAgIHRpbWVvdXRNczogaW5wdXQudGltZW91dCxcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogZW1pdERlbHRhLFxuICAgICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVjb3JkQ29tcGxldGVkKFwiYW50aHJvcGljXCIsIHR1cm5SZXN1bHQudG9rZW5OYW1lKTtcbiAgICAgICAgICAgIC8vIOuLq+uKlCDtjpzsiqQg7YyQ7KCVIOuVjOusuOyXkCDrs7TrpZjtlZwg7YWN7Iqk7Yq466W8IOyZhOujjCDsoITsl5Ag67Cp7Lac7ZWc64ukLlxuICAgICAgICAgICAgY29uc3QgcmVzdCA9IGZlbmNlU3RyaXA/LmZsdXNoKCk7XG4gICAgICAgICAgICBpZiAocmVzdCkgY2Iub25EZWx0YShyZXN0KTtcblxuICAgICAgICAgICAgY29uc3QgaXNzdWVkQ29vcmQgPSBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKTtcbiAgICAgICAgICAgIGNiLm9uQ29tcGxldGUoXG4gICAgICAgICAgICAgIGFwcGx5VG9vbENhbGxFbXVsYXRpb24odG9FbXVsYXRpb25SZXN1bHQodHVyblJlc3VsdCksIGlucHV0LnRvb2xzLCB7XG4gICAgICAgICAgICAgICAgdGhyZWFkQ29vcmQ6IGlzc3VlZENvb3JkLFxuICAgICAgICAgICAgICAgIGFuc3dlcktpbmQsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uRXJyb3I6IGNiLm9uRXJyb3IsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlUHJvdmlkZXJSb3V0ZShtb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkKTogeyBwcm92aWRlcj86IHN0cmluZzsgbW9kZWw6IHN0cmluZyB9IHtcbiAgaWYgKCFtb2RlbD8uaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgcmV0dXJuIHsgbW9kZWw6IG1vZGVsID8/IFwiXCIgfTtcbiAgfVxuXG4gIGNvbnN0IFtwcm92aWRlciwgcm91dGVkTW9kZWxdID0gbW9kZWwuc3BsaXQoXCIvXCIsIDIpO1xuICBpZiAoIXByb3ZpZGVyIHx8ICFyb3V0ZWRNb2RlbCkgdGhyb3cgbmV3IFByb2Nlc3NFcnJvcihcInVua25vd24gbW9kZWxcIik7XG4gIHJldHVybiB7IHByb3ZpZGVyLCBtb2RlbDogcm91dGVkTW9kZWwgfTtcbn1cblxuZnVuY3Rpb24gZGlyZWN0TGxtQXBpRmFsbGJhY2tOb3RJbXBsZW1lbnRlZChpbnB1dDogUXVlcnlJbnB1dCk6IFByb2Nlc3NFcnJvciB7XG4gIHJldHVybiBuZXcgUHJvY2Vzc0Vycm9yKFxuICAgIGBEaXJlY3QgTExNIEFQSSBmYWxsYmFjayBub3QgaW1wbGVtZW50ZWQgZm9yIG1vZGVsOiAke2lucHV0Lm1vZGVsID8/IFwiPGRlZmF1bHQ+XCJ9YCxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4gIHByb3ZpZGVyPzogc3RyaW5nLFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRSYXdPdXRwdXRTY2hlbWEoaW5wdXQpO1xuXG4gIHJldHVybiBvdXRwdXRTY2hlbWFcbiAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0sIHsgcHJvdmlkZXIgfSkgYXMgSnNvblZhbHVlKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJtb2RlbFwiIHwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuICBwcm92aWRlciA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCkucHJvdmlkZXIsXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICAvLyBDbGF1ZGUgQ29kZeydmCAtLWpzb24tc2NoZW1h64qUIOu2iO2VhOyalO2VnCDrgrTrtoAg7J6s7Iuc64+E66W8IOycoOuwnO2VnOuLpC5cbiAgLy8gQW50aHJvcGlj7J2AIOybkOuzuCDsiqTtgqTrp4jrpbwg6rKA7Kad7ZWcIOuSpCDtlITroaztlITtirjroZwg7KCE64us7ZWY6rOgLCDsnZHri7Ug6rKA7Kad7J2AIOyGjOu5hOyekOyXkCDrp6HquLTri6QuXG4gIGlmIChwcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgIHBhcnNlQW5kVmFsaWRhdGVDYWxsZXJTY2hlbWFzKGlucHV0KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQsIHByb3ZpZGVyKTtcbiAgc2VyaWFsaXplQW5kVmFsaWRhdGVEaXNwYXRjaFNjaGVtYShvdXRwdXRTY2hlbWEsIHByb3ZpZGVyKTtcbiAgcmV0dXJuIG91dHB1dFNjaGVtYTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSYXdPdXRwdXRTY2hlbWEoXG4gIGlucHV0OiBQaWNrPFF1ZXJ5SW5wdXQsIFwidG9vbHNcIiB8IFwianNvblNjaGVtYVwiPixcbik6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNhbGxlck91dHB1dFNjaGVtYSA9IHBhcnNlQW5kVmFsaWRhdGVDYWxsZXJTY2hlbWFzKGlucHV0KTtcblxuICByZXR1cm4gaW5wdXQudG9vbHM/Lmxlbmd0aFxuICAgID8gYnVpbGRUb29sQ2FsbFNjaGVtYShpbnB1dC50b29scywgY2FsbGVyT3V0cHV0U2NoZW1hKVxuICAgIDogY2FsbGVyT3V0cHV0U2NoZW1hO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGxldGVkRHJpdmVyRnJvbUltYWdlRmFpbHVyZShcbiAgZXJyb3I6IHVua25vd24sXG4gIHNlcnZpY2VUaWVyPzogc3RyaW5nLFxuKTogUXVlcnlPdXRwdXQgfCB1bmRlZmluZWQge1xuICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEltYWdlR2VuZXJhdGlvbkVycm9yKSB8fCAhZXJyb3IuY29tcGxldGVkRHJpdmVyKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChlcnJvci5jb21wbGV0ZWREcml2ZXIsIHNlcnZpY2VUaWVyKSwgdW5kZWZpbmVkLCB7XG4gICAgYW5zd2VyS2luZDogXCJ0ZXh0XCIsXG4gIH0pO1xufVxuXG4vLyBBbnRocm9waWMgYWRhcHRlciDripQgY2FjaGUgY3JlYXRpb24g7J2EIGlucHV0VG9rZW5zIOyXkCDtj6ztlajtlbQg7ZGc7KSA7ZmU7ZWY6rOgLCDrs4Trj4Qg7ZWE65Oc7JeQ64+EIOuztOyhtO2VnOuLpC5cbmZ1bmN0aW9uIHRvRW11bGF0aW9uUmVzdWx0KFxuICByZXN1bHQ6IEdlbmVyYXRlUmVzdWx0LFxuICBzZXJ2aWNlVGllcj86IHN0cmluZyxcbik6IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPiB7XG4gIGNvbnN0IGhhc1Byb3ZpZGVyQ29zdCA9IHJlc3VsdC5jb3N0VXNkICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0LmNvc3RVc2QgPiAwO1xuICByZXR1cm4ge1xuICAgIHRleHQ6IHJlc3VsdC50ZXh0LFxuICAgIHRva2VuTmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICBtb2RlbDogcmVzdWx0Lm1vZGVsLFxuICAgIHJlcXVlc3RlZE1vZGVsOiByZXN1bHQucmVxdWVzdGVkTW9kZWwsXG4gICAgbW9kZWxGYWxsYmFja3M6IHJlc3VsdC5tb2RlbEZhbGxiYWNrcyxcbiAgICB1c2FnZToge1xuICAgICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgcmVhc29uaW5nX3Rva2VuczogcmVzdWx0LnVzYWdlLnJlYXNvbmluZ091dHB1dFRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyA/PyAwLFxuICAgICAgY2FjaGVfY3JlYXRpb25fNW1faW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0sXG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCxcbiAgICAgIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgfSxcbiAgICBkdXJhdGlvbk1zOiByZXN1bHQuZHVyYXRpb25NcyxcbiAgICB0dGZ0TXM6IHJlc3VsdC50dGZ0TXMgPz8gMCxcbiAgICBjb3N0VXNkOiBoYXNQcm92aWRlckNvc3RcbiAgICAgID8gcmVzdWx0LmNvc3RVc2QhXG4gICAgICA6IGNhbGN1bGF0ZUNvc3RVc2QoXG4gICAgICAgICAgcmVzdWx0Lm1vZGVsLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgICBvdXRwdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtLFxuICAgICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNlcnZpY2VUaWVyLFxuICAgICAgICApLFxuICAgIGNvc3RTb3VyY2U6IGhhc1Byb3ZpZGVyQ29zdCA/IFwicHJvdmlkZXJcIiA6IFwicHJpY2luZ190YWJsZVwiLFxuICB9O1xufVxuXG5leHBvcnQgY29uc3QgUWdyaWREaXNwYXRjaGVyID0gbmV3IFFncmlkRGlzcGF0Y2hlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBMkNBLElBQWEsdUJBQWIsTUFBa0M7Q0FDaEMseUJBQVMsSUFBSSxJQUEwQjtDQUl2QyxnQ0FBZ0IsSUFBSSxJQUFvQjtDQUV4QyxhQUFxQztDQUNyQyxtQkFBNEM7Q0FDNUMsc0JBQWtEO0NBR2xELGVBQXFFO0VBQ25FLFFBQVE7RUFDUixXQUFXO0NBQ2I7Q0FHQSxjQUFjLFVBQXlDO0VBQ3JELE1BQU0sUUFBUSxhQUFhLFdBQVcsV0FBVztFQUNqRCxPQUFPLEtBQUssYUFBYSxjQUFjLFdBQ25DLElBQUksNkJBQTZCLEdBQUcsd0JBQXdCLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFDcEUsSUFBSSw0QkFBNEIsR0FBRywwQkFBMEIsQ0FBQyxDQUFDLEtBQUssQ0FBQztDQUMzRTtDQUVBLGdCQUFnQixVQUFrQixXQUF5QjtFQUN6RCxNQUFNLE1BQU0sR0FBRyxTQUFTLElBQUk7RUFDNUIsS0FBSyxjQUFjLElBQUksTUFBTSxLQUFLLGNBQWMsSUFBSSxHQUFHLEtBQUssS0FBSyxDQUFDO0NBQ3BFO0NBRUEsYUFBYSxNQUE0QjtFQUN2QyxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0NBQ2xEO0NBRUEsV0FBeUI7RUFDdkIsT0FBTyxDQUFDLEdBQUcsS0FBSyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPO0dBQzNDLE9BQU8sVUFBVSxlQUFlLEVBQUUsV0FBVyxDQUFDO0dBQzlDLE1BQU0sRUFBRTtHQUNSLFVBQVUsRUFBRTtHQUNaLFVBQVUsS0FBSyxjQUFjLElBQUksR0FBRyxFQUFFLFNBQVMsSUFBSSxFQUFFLE1BQU0sS0FBSztFQUNsRSxFQUFFO0NBQ0o7Q0FFQSxNQUFNLE1BQU0sT0FBMkIsYUFBaUQ7RUFDdEYsTUFBTSxRQUFRLG1CQUFtQixNQUFNLEtBQUs7RUFDNUMsTUFBTSxlQUFlLG1DQUFtQyxPQUFPLE1BQU0sUUFBUTtFQUM3RSxNQUFNLGFBQWEsTUFBTSxhQUFjLFNBQW9CO0VBRTNELElBQUksTUFBTSxhQUFhLFVBQVU7R0FDL0IsSUFBSSxDQUFDLEtBQUssa0JBQWtCLE1BQU0sS0FBSyxjQUFjLFFBQVE7R0FFN0QsTUFBTSxXQUFXLGtCQUFrQixPQUFPO0lBQ3hDLGNBQWM7SUFDZCxnQkFBZ0IsVUFBVSxNQUFNO0dBQ2xDLENBQUM7R0FDRCxNQUFNLFNBQVMsTUFBTSxLQUFLLGlCQUFpQixTQUFTO0lBQ2xELE9BQU8sTUFBTTtJQUNiLGNBQWMsTUFBTTtJQUNwQjtJQUNBLHdCQUF3QixNQUFNLE9BQU8sVUFDaEMsTUFBTSxVQUFVLG1CQUFtQixNQUFNLE1BQU0sT0FBUSxZQUFZLEtBQUssSUFDekU7SUFDSixVQUFVLE1BQU07SUFDaEIsUUFBUSxNQUFNLGFBQWEsUUFBUSxTQUFZLE1BQU07SUFDckQsV0FBVyxNQUFNO0lBQ2pCLGtCQUFrQixNQUFNO0lBQ3hCLGFBQWEsTUFBTTtJQUNuQixXQUFXLE1BQU07SUFDakIsV0FBVyxTQUFTO0lBQ3BCLGFBQWEsU0FBUztJQUN0QixnQkFBZ0IsTUFBTSxrQkFBa0IsU0FBWSxTQUFTO0lBQzdELGtCQUNFLE1BQU0scUJBQXFCLE1BQU0sa0JBQWtCLFNBQVksU0FBUztJQUMxRSx1QkFBdUIsTUFBTTtJQUM3QjtJQUNBLGlCQUFpQixNQUFNO0lBQ3ZCLHdCQUF3QixNQUFNO0dBQ2hDLENBQUM7R0FDRCxLQUFLLGdCQUFnQixVQUFVLE9BQU8sU0FBUztHQUkvQyxNQUFNLFFBQVEsTUFBTSxrQkFDaEIsU0FDQSxpQkFBaUIsT0FBTyxhQUFhLFVBQVUsT0FBTyxZQUFZLFFBQVE7R0FFOUUsT0FBTyx1QkFBdUIsa0JBQWtCLFFBQVEsTUFBTSxXQUFXLEdBQUcsTUFBTSxPQUFPO0lBQ3ZGLGFBQWE7SUFDYixRQUFRLE9BQU87SUFDZjtHQUNGLENBQUM7RUFDSCxPQUFPLElBQUksTUFBTSxhQUFhLGFBQWE7R0FDekMsSUFBSSxDQUFDLEtBQUsscUJBQXFCLE1BQU0sS0FBSyxjQUFjLFdBQVc7R0FFbkUsTUFBTSxXQUFXLGtCQUFrQixLQUFLO0dBQ3hDLE1BQU0sU0FBUyxNQUFNLEtBQUssb0JBQW9CLFNBQVM7SUFDckQsT0FBTyxNQUFNO0lBQ2IsY0FBYyxnQ0FBZ0MsTUFBTSxRQUFRLEtBQUs7SUFDakUsVUFBVSxNQUFNO0lBQ2hCLFFBQVEsTUFBTSxhQUFhLFFBQVEsU0FBWSxNQUFNO0lBQ3JELFdBQVcsTUFBTTtJQUNqQjtJQUNBLFdBQVcsU0FBUztJQUNwQixhQUFhLFNBQVM7SUFDdEIsa0JBQWtCLE1BQU07SUFDeEIsaUJBQWlCLE1BQU07SUFDdkIsd0JBQXdCLE1BQU07R0FDaEMsQ0FBQztHQUNELEtBQUssZ0JBQWdCLGFBQWEsT0FBTyxTQUFTO0dBRWxELE9BQU8sdUJBQXVCLGtCQUFrQixNQUFNLEdBQUcsTUFBTSxPQUFPO0lBQ3BFLGFBQWEsaUJBQWlCLE9BQU8sYUFBYSxRQUFRO0lBQzFEO0dBQ0YsQ0FBQztFQUNIO0VBRUEsTUFBTSxtQ0FBbUMsS0FBSztDQUNoRDtDQUVBLE1BQU0sWUFDSixPQUNBLElBQ0EsYUFDZTtFQUNmLE1BQU0sUUFBUSxtQkFBbUIsTUFBTSxLQUFLO0VBQzVDLE1BQU0sZUFBZSxtQ0FBbUMsT0FBTyxNQUFNLFFBQVE7RUFDN0UsTUFBTSxhQUFhLE1BQU0sYUFBYyxTQUFvQjtFQUUzRCxJQUFJLE1BQU0sYUFBYSxVQUFVO0dBQy9CLElBQUksQ0FBQyxLQUFLLGtCQUFrQixNQUFNLEtBQUssY0FBYyxRQUFRO0dBRTdELE1BQU0sV0FBVyxrQkFBa0IsT0FBTztJQUN4QyxjQUFjO0lBQ2QsZ0JBQWdCLFVBQVUsTUFBTTtHQUNsQyxDQUFDO0dBQ0QsTUFBTSxLQUFLLGlCQUFpQixlQUMxQjtJQUNFLE9BQU8sTUFBTTtJQUNiLGNBQWMsTUFBTTtJQUNwQjtJQUNBLHdCQUF3QixNQUFNLE9BQU8sVUFDaEMsTUFBTSxVQUFVLG1CQUFtQixNQUFNLE1BQU0sT0FBUSxZQUFZLEtBQUssSUFDekU7SUFDSixVQUFVLE1BQU07SUFDaEIsUUFBUSxNQUFNLGFBQWEsUUFBUSxTQUFZLE1BQU07SUFDckQsV0FBVyxNQUFNO0lBQ2pCLGtCQUFrQixNQUFNO0lBQ3hCLGFBQWEsTUFBTTtJQUNuQixXQUFXLE1BQU07SUFDakIsV0FBVyxTQUFTO0lBQ3BCLGFBQWEsU0FBUztJQUN0QixnQkFBZ0IsU0FBUztJQUN6QixrQkFBa0IsTUFBTSxvQkFBb0IsU0FBUztJQUNyRCx1QkFBdUIsTUFBTTtJQUM3QjtJQUNBLGlCQUFpQixNQUFNO0lBQ3ZCLHdCQUF3QixNQUFNO0dBQ2hDLEdBQ0E7SUFDRSxTQUFTLEdBQUc7SUFDWixZQUFZLEdBQUc7SUFDZixVQUFVLEdBQUc7SUFDYixhQUFhLGVBQWU7S0FDMUIsS0FBSyxnQkFBZ0IsVUFBVSxXQUFXLFNBQVM7S0FDbkQsR0FBRyxXQUNELHVCQUNFLGtCQUFrQixZQUFZLE1BQU0sV0FBVyxHQUMvQyxNQUFNLE9BQ047TUFDRSxhQUFhLGlCQUNYLFdBQVcsYUFDWCxVQUNBLFdBQVcsWUFBWSxRQUN6QjtNQUNBO0tBQ0YsQ0FDRixDQUNGO0lBQ0Y7SUFDQSxTQUFTLEdBQUc7R0FDZCxDQUNGO0dBQ0E7RUFDRixPQUFPLElBQUksTUFBTSxhQUFhLGFBQWE7R0FDekMsSUFBSSxDQUFDLEtBQUsscUJBQXFCLE1BQU0sS0FBSyxjQUFjLFdBQVc7R0FJbkUsTUFBTSxhQURvQixNQUFNLGVBQWUsVUFBYSxRQUFRLE1BQU0sT0FBTyxNQUFNLElBQ2hELDBCQUEwQixJQUFJO0dBQ3JFLE1BQU0sWUFBWSxjQUNiLFNBQWlCO0lBQ2hCLE1BQU0sT0FBTyxXQUFXLEtBQUssSUFBSTtJQUNqQyxJQUFJLE1BQU0sR0FBRyxRQUFRLElBQUk7R0FDM0IsSUFDQSxHQUFHO0dBRVAsTUFBTSxXQUFXLGtCQUFrQixLQUFLO0dBQ3hDLE1BQU0sS0FBSyxvQkFBb0IsZUFDN0I7SUFDRSxPQUFPLE1BQU07SUFDYixjQUFjLGdDQUFnQyxNQUFNLFFBQVEsS0FBSztJQUNqRSxVQUFVLE1BQU07SUFDaEIsUUFBUSxNQUFNLGFBQWEsUUFBUSxTQUFZLE1BQU07SUFDckQsV0FBVyxTQUFTO0lBQ3BCLGFBQWEsU0FBUztJQUN0QixrQkFBa0IsTUFBTTtJQUN4QixXQUFXLE1BQU07SUFDakI7SUFDQSxpQkFBaUIsTUFBTTtJQUN2Qix3QkFBd0IsTUFBTTtHQUNoQyxHQUNBO0lBQ0UsU0FBUztJQUNULFlBQVksR0FBRztJQUNmLGFBQWEsZUFBZTtLQUMxQixLQUFLLGdCQUFnQixhQUFhLFdBQVcsU0FBUztLQUV0RCxNQUFNLE9BQU8sWUFBWSxNQUFNO0tBQy9CLElBQUksTUFBTSxHQUFHLFFBQVEsSUFBSTtLQUV6QixNQUFNLGNBQWMsaUJBQWlCLFdBQVcsYUFBYSxRQUFRO0tBQ3JFLEdBQUcsV0FDRCx1QkFBdUIsa0JBQWtCLFVBQVUsR0FBRyxNQUFNLE9BQU87TUFDakUsYUFBYTtNQUNiO0tBQ0YsQ0FBQyxDQUNIO0lBQ0Y7SUFDQSxTQUFTLEdBQUc7R0FDZCxDQUNGO0dBQ0E7RUFDRjtFQUVBLE1BQU0sbUNBQW1DLEtBQUs7Q0FDaEQ7QUFDRjtBQUVBLFNBQVMsbUJBQW1CLE9BQWlFO0NBQzNGLElBQUksQ0FBQyxPQUFPLFNBQVMsR0FBRyxHQUN0QixPQUFPLEVBQUUsT0FBTyxTQUFTLEdBQUc7Q0FHOUIsTUFBTSxDQUFDLFVBQVUsZUFBZSxNQUFNLE1BQU0sS0FBSyxDQUFDO0NBQ2xELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxNQUFNLElBQUksYUFBYSxlQUFlO0NBQ3JFLE9BQU87RUFBRTtFQUFVLE9BQU87Q0FBWTtBQUN4QztBQUVBLFNBQVMsbUNBQW1DLE9BQWlDO0NBQzNFLE9BQU8sSUFBSSxhQUNULHNEQUFzRCxNQUFNLFNBQVMsYUFDdkU7QUFDRjtBQUVBLFNBQWdCLHdCQUNkLE9BQ0EsVUFDdUI7Q0FDdkIsTUFBTSxlQUFlLHFCQUFxQixLQUFLO0NBRS9DLE9BQU8sZUFDRixVQUFVLGNBQWlELEVBQUUsU0FBUyxDQUFDLElBQ3hFO0FBQ047QUFFQSxTQUFnQixtQ0FDZCxPQUNBLFdBQVcsbUJBQW1CLE1BQU0sS0FBSyxDQUFDLENBQUMsVUFDcEI7Q0FHdkIsSUFBSSxhQUFhLGFBQWE7RUFDNUIsOEJBQThCLEtBQUs7RUFDbkM7Q0FDRjtDQUVBLE1BQU0sZUFBZSx3QkFBd0IsT0FBTyxRQUFRO0NBQzVELG1DQUFtQyxjQUFjLFFBQVE7Q0FDekQsT0FBTztBQUNUO0FBRUEsU0FBUyxxQkFDUCxPQUN1QjtDQUN2QixNQUFNLHFCQUFxQiw4QkFBOEIsS0FBSztDQUU5RCxPQUFPLE1BQU0sT0FBTyxTQUNoQixvQkFBb0IsTUFBTSxPQUFPLGtCQUFrQixJQUNuRDtBQUNOO0FBRUEsU0FBZ0IsZ0NBQ2QsT0FDQSxhQUN5QjtDQUN6QixJQUFJLEVBQUUsaUJBQWlCLHlCQUF5QixDQUFDLE1BQU0saUJBQWlCLE9BQU87Q0FDL0UsT0FBTyx1QkFBdUIsa0JBQWtCLE1BQU0saUJBQWlCLFdBQVcsR0FBRyxRQUFXLEVBQzlGLFlBQVksT0FDZCxDQUFDO0FBQ0g7QUFHQSxTQUFTLGtCQUNQLFFBQ0EsYUFDOEQ7Q0FDOUQsTUFBTSxrQkFBa0IsT0FBTyxZQUFZLFVBQWEsT0FBTyxVQUFVO0NBQ3pFLE9BQU87RUFDTCxNQUFNLE9BQU87RUFDYixXQUFXLE9BQU87RUFDbEIsT0FBTyxPQUFPO0VBQ2QsZ0JBQWdCLE9BQU87RUFDdkIsZ0JBQWdCLE9BQU87RUFDdkIsT0FBTztHQUNMLGNBQWMsT0FBTyxNQUFNO0dBQzNCLGVBQWUsT0FBTyxNQUFNO0dBQzVCLGtCQUFrQixPQUFPLE1BQU07R0FDL0IsNkJBQTZCLE9BQU8sTUFBTSw0QkFBNEI7R0FDdEUsZ0NBQWdDLE9BQU8sTUFBTTtHQUM3QyxnQ0FBZ0MsT0FBTyxNQUFNO0dBQzdDLHlCQUF5QixPQUFPLE1BQU07RUFDeEM7RUFDQSxZQUFZLE9BQU87RUFDbkIsUUFBUSxPQUFPLFVBQVU7RUFDekIsU0FBUyxrQkFDTCxPQUFPLFVBQ1AsaUJBQ0UsT0FBTyxPQUNQO0dBQ0UsYUFBYSxPQUFPLE1BQU07R0FDMUIsY0FBYyxPQUFPLE1BQU07R0FDM0IsbUJBQW1CLE9BQU8sTUFBTTtHQUNoQywwQkFBMEIsT0FBTyxNQUFNLDRCQUE0QjtHQUNuRSw0QkFBNEIsT0FBTyxNQUFNO0dBQ3pDLDRCQUE0QixPQUFPLE1BQU07RUFDM0MsR0FDQSxXQUNGO0VBQ0osWUFBWSxrQkFBa0IsYUFBYTtDQUM3QztBQUNGO0FBRUEsTUFBYSxrQkFBa0IsSUFBSSxxQkFBcUIifQ==
|
|
290
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbIiNvcGVuYWlEaXNwYXRjaGVyIiwiI2FudGhyb3BpY0Rpc3BhdGNoZXIiLCIjZ3Jva0Rpc3BhdGNoZXIiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwcm92aWRlciDrnbzsmrDtjIXqs7wg7Yag7YGwIOy6kOyLnMK37Ya16rOELiDsupDsi5zripQgVG9rZW5TdWJzY3JpYmVy6rCAIOqwseyLoO2VnOuLpC5cblxuaW1wb3J0IHsgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbiwgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIH0gZnJvbSBcInNvbmFtdVwiO1xuXG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi8uLi9pMThuL3NkLmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgdHlwZSBBbnRocm9waWNEaXNwYXRjaGVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUZlbmNlU3RyaXBUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9mZW5jZS1zdHJpcFwiO1xuaW1wb3J0IHsgZ2V0QWNjZXNzVG9rZW4gfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9jcmVkZW50aWFsc1wiO1xuaW1wb3J0IHsgY2FsY3VsYXRlQ29zdFVzZCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL21vZGVsLWNvc3RcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIE1lZGlhRGlzcGF0Y2hlcixcbiAgdHlwZSBQcm92aWRlckRpc3BhdGNoZXIsXG4gIHR5cGUgU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIFZvaWNlRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vcHJvdmlkZXItZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHtcbiAgaXNKc29uT2JqZWN0LFxuICBpc1Byb3ZpZGVySWQsXG4gIHR5cGUgSnNvblZhbHVlLFxuICB0eXBlIFByb3ZpZGVySWQsXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLXR5cGVzXCI7XG5pbXBvcnQge1xuICBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyxcbiAgc2VyaWFsaXplQW5kVmFsaWRhdGVEaXNwYXRjaFNjaGVtYSxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc2NoZW1hLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHN0cmljdGlmeSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3N0cmljdGlmaWVyXCI7XG5pbXBvcnQgeyB0eXBlIEdyb2tUb2tlblN0YXRlU25hcHNob3QgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2dyb2svZ3Jvay1kaXNwYXRjaGVyXCI7XG5pbXBvcnQge1xuICBJbWFnZUdlbmVyYXRpb25FcnJvcixcbiAgdHlwZSBPcGVuQUlEaXNwYXRjaGVyLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlbkNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyBkZWNpZGVDb252Um91dGluZywgaXNzdWVDb252Q29udGV4dCB9IGZyb20gXCIuL2NvbnYtcm91dGluZ1wiO1xuaW1wb3J0IHtcbiAgbWFza1Rva2VuLFxuICBQcm9jZXNzRXJyb3IsXG4gIHR5cGUgUHJvdmlkZXJTdGFydHVwU3RhdGUsXG4gIHR5cGUgUXVlcnlJbnB1dCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbiAgdHlwZSBUb2tlblN0YXRzLFxufSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgY29tcG9zZVN5c3RlbVdpdGhTY2hlbWFDb250cmFjdCB9IGZyb20gXCIuL3NjaGVtYS1wcm9tcHRcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5TdWJzY3JpYmVyIH0gZnJvbSBcIi4vdG9rZW4tc3Vic2NyaWJlclwiO1xuaW1wb3J0IHsgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbiwgaXNUb29sQ2FsbEVudmVsb3BlIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb25cIjtcbmltcG9ydCB7IGJ1aWxkVG9vbENhbGxTY2hlbWEgfSBmcm9tIFwiLi90b29sLWVtdWxhdGlvbi1zY2hlbWFcIjtcblxuZXhwb3J0IHR5cGUgSW50ZXJuYWxRdWVyeUlucHV0ID0gUXVlcnlJbnB1dCAmIHtcbiAgcHJlZmVycmVkVG9rZW5JZD86IG51bWJlcjtcbiAgcmVxdWlyZVByZWZlcnJlZFRva2VuPzogYm9vbGVhbjtcbn07XG5cbi8vIHFncmlkIOyDgeychOqwgCBwcm92aWRlciDsl5Ag7JqU6rWs7ZWY64qUIOyLpO2WiSDqs4Tslb0uIOyKpO2KuOumrOuwjeydgCDqs7XthrUgUHJvdmlkZXJEaXNwYXRjaGVyIOyXkCDslYTsp4Eg7JeG7Ja07IScXG4vLyDsl6zquLDshJwg7ZWp7Lmc64ukLlxuZXhwb3J0IHR5cGUgU3RyZWFtaW5nUHJvdmlkZXJEaXNwYXRjaGVyID0gUHJvdmlkZXJEaXNwYXRjaGVyICYge1xuICBnZW5lcmF0ZVN0cmVhbShyZXE6IEdlbmVyYXRlUmVxdWVzdCwgY2I6IEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzKTogUHJvbWlzZTx2b2lkPjtcbn07XG5cbi8vIFRva2VuU3Vic2NyaWJlciDqsIAgZ3JvayByb3cg66W8IOyghOuLrO2VmOuKlCDqs4Tslb0uIGNyZWRlbnRpYWxzIOuKlCBEQiBKU09OQiDsm5Drs7jsnbTrqbAgZGlzcGF0Y2hlciDqsIBcbi8vIOyekOyytCDsiqTtgqTrp4jroZwg6rKA7Kad7ZWc64ukLlxuZXhwb3J0IHR5cGUgR3Jva1Rva2VuUm93ID0ge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzOiBUb2tlbkNyZWRlbnRpYWxzO1xuICBxdW90YVRocmVzaG9sZDogbnVtYmVyIHwgbnVsbDtcbiAgd2VpZ2h0OiBudW1iZXI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEdyb2tUb2tlblNpbmsge1xuICBvblRva2VuQWRkZWQoXG4gICAgaWQ6IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IFRva2VuQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ6IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0OiBudW1iZXIsXG4gICk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBvblRva2VuVXBkYXRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogVG9rZW5DcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZDogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQ6IG51bWJlcixcbiAgKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIG9uVG9rZW5SZW1vdmVkKGlkOiBudW1iZXIpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgcmVwbGFjZVRva2Vucyhyb3dzOiBHcm9rVG9rZW5Sb3dbXSk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKiogT2JzZXJ2YWJpbGl0eSB0aGUgY29uY3JldGUgR3JvayBkaXNwYXRjaGVyIGV4cG9zZXMgYmV5b25kIHJvdXRpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyb2tUb2tlblN0YXRlU291cmNlIHtcbiAgdG9rZW5TdGF0ZXMoKTogR3Jva1Rva2VuU3RhdGVTbmFwc2hvdFtdO1xufVxuXG4vKiogTWVkaWEsIHZvaWNlLCBhbmQgdG9rZW4tc3RhdGUgcmVwb3J0aW5nIGFyZSBvcHRpb25hbCBjYXBhYmlsaXRpZXMgb2YgYSBHcm9rIGRpc3BhdGNoZXIuICovXG5leHBvcnQgdHlwZSBHcm9rUHJvdmlkZXJEaXNwYXRjaGVyID0gU3RyZWFtaW5nUHJvdmlkZXJEaXNwYXRjaGVyICZcbiAgR3Jva1Rva2VuU2luayAmXG4gIFBhcnRpYWw8TWVkaWFEaXNwYXRjaGVyICYgVm9pY2VEaXNwYXRjaGVyICYgR3Jva1Rva2VuU3RhdGVTb3VyY2U+O1xuXG5leHBvcnQgdHlwZSBRZ3JpZERpc3BhdGNoZXJPcHRpb25zID0ge1xuICBncm9rRGlzcGF0Y2hlcj86IEdyb2tQcm92aWRlckRpc3BhdGNoZXIgfCBudWxsO1xufTtcblxuY29uc3QgUFJPVklERVJfTEFCRUxTOiBSZWNvcmQ8UHJvdmlkZXJJZCwgc3RyaW5nPiA9IHtcbiAgb3BlbmFpOiBcIk9wZW5BSVwiLFxuICBhbnRocm9waWM6IFwiQW50aHJvcGljXCIsXG4gIGdyb2s6IFwiR3Jva1wiLFxufTtcblxuZXhwb3J0IGNsYXNzIFFncmlkRGlzcGF0Y2hlckNsYXNzIHtcbiAgdG9rZW5zID0gbmV3IE1hcDxudW1iZXIsIFRva2VuU3Vic2V0QT4oKTtcblxuICAvLyDtlITroZzshLjsiqQg7Iuc7J6RIOydtO2bhCDsmYTro4zrkJwgcHJvdmlkZXIgZ2VuZXJhdGlvbiDsiJguIOyLpO2MqC/spJHqsIQg7Iuc64+E64qUIOygnOyZuO2VmOupsCxcbiAgLy8g7ZuE7IaNIHRvb2wgdHVybuuPhCDtlZwgZ2VuZXJhdGlvbuycvOuhnCDshLzri6QuIOuPmeuqhSDthqDtgbDsnYAgcHJvdmlkZXLrs4TroZwg67aE66as7ZWc64ukLlxuICByZXF1ZXN0Q291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICBzdWJzY3JpYmVyOiBUb2tlblN1YnNjcmliZXIgfCBudWxsID0gbnVsbDtcblxuICAvLyBwcm92aWRlciByb3V0ZSBwcmVmaXgg4oaSIOyLpO2WiSBkaXNwYXRjaGVyLiDrk7HroZ3rkJjsp4Ag7JWK7J2AIHByb3ZpZGVyIOuKlCBub3QtcmVhZHkg66GcIOydkeuLte2VnOuLpC5cbiAgcmVhZG9ubHkgZGlzcGF0Y2hlcnMgPSBuZXcgTWFwPFByb3ZpZGVySWQsIFN0cmVhbWluZ1Byb3ZpZGVyRGlzcGF0Y2hlcj4oKTtcbiAgI29wZW5haURpc3BhdGNoZXI6IE9wZW5BSURpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgI2FudGhyb3BpY0Rpc3BhdGNoZXI6IEFudGhyb3BpY0Rpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgI2dyb2tEaXNwYXRjaGVyOiBHcm9rUHJvdmlkZXJEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gSFRUUOqwgCBkaXNwYXRjaGVy67O064ukIOuovOyggCDsl7Trpqzrr4DroZwg7LSI6riw7ZmUIOykkeqzvCDstIjquLDtmZQg7Iuk7Yyo66W8IOq1rOu2hO2VnOuLpC5cbiAgLy8gZ3JvayDsnYAgYm9vdHN0cmFwIOydtCDrtpnquLAg7KCE6rmM7KeAIOyDge2DnOqwgCDsl4bsnLzrqbAsIOyXhuycvOuptCDquLDrj5kg7KSR7Jy866GcIOuzuOuLpC5cbiAgc3RhcnR1cFN0YXRlOiBSZWNvcmQ8XCJvcGVuYWlcIiB8IFwiYW50aHJvcGljXCIsIFByb3ZpZGVyU3RhcnR1cFN0YXRlPiAmXG4gICAgUGFydGlhbDxSZWNvcmQ8XCJncm9rXCIsIFByb3ZpZGVyU3RhcnR1cFN0YXRlPj4gPSB7XG4gICAgb3BlbmFpOiBcInN0YXJ0aW5nXCIsXG4gICAgYW50aHJvcGljOiBcInN0YXJ0aW5nXCIsXG4gIH07XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogUWdyaWREaXNwYXRjaGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKG9wdGlvbnMuZ3Jva0Rpc3BhdGNoZXIpIHRoaXMuZ3Jva0Rpc3BhdGNoZXIgPSBvcHRpb25zLmdyb2tEaXNwYXRjaGVyO1xuICB9XG5cbiAgZ2V0IG9wZW5haURpc3BhdGNoZXIoKTogT3BlbkFJRGlzcGF0Y2hlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLiNvcGVuYWlEaXNwYXRjaGVyO1xuICB9XG5cbiAgc2V0IG9wZW5haURpc3BhdGNoZXIoZGlzcGF0Y2hlcjogT3BlbkFJRGlzcGF0Y2hlciB8IG51bGwpIHtcbiAgICB0aGlzLiNvcGVuYWlEaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcbiAgICB0aGlzLnJlZ2lzdGVyKFwib3BlbmFpXCIsIGRpc3BhdGNoZXIpO1xuICB9XG5cbiAgZ2V0IGFudGhyb3BpY0Rpc3BhdGNoZXIoKTogQW50aHJvcGljRGlzcGF0Y2hlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLiNhbnRocm9waWNEaXNwYXRjaGVyO1xuICB9XG5cbiAgc2V0IGFudGhyb3BpY0Rpc3BhdGNoZXIoZGlzcGF0Y2hlcjogQW50aHJvcGljRGlzcGF0Y2hlciB8IG51bGwpIHtcbiAgICB0aGlzLiNhbnRocm9waWNEaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcbiAgICB0aGlzLnJlZ2lzdGVyKFwiYW50aHJvcGljXCIsIGRpc3BhdGNoZXIpO1xuICB9XG5cbiAgZ2V0IGdyb2tEaXNwYXRjaGVyKCk6IEdyb2tQcm92aWRlckRpc3BhdGNoZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy4jZ3Jva0Rpc3BhdGNoZXI7XG4gIH1cblxuICBzZXQgZ3Jva0Rpc3BhdGNoZXIoZGlzcGF0Y2hlcjogR3Jva1Byb3ZpZGVyRGlzcGF0Y2hlciB8IG51bGwpIHtcbiAgICB0aGlzLiNncm9rRGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7XG4gICAgdGhpcy5yZWdpc3RlcihcImdyb2tcIiwgZGlzcGF0Y2hlcik7XG4gIH1cblxuICByZWdpc3Rlcihwcm92aWRlcjogUHJvdmlkZXJJZCwgZGlzcGF0Y2hlcjogU3RyZWFtaW5nUHJvdmlkZXJEaXNwYXRjaGVyIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmIChkaXNwYXRjaGVyKSB0aGlzLmRpc3BhdGNoZXJzLnNldChwcm92aWRlciwgZGlzcGF0Y2hlcik7XG4gICAgZWxzZSB0aGlzLmRpc3BhdGNoZXJzLmRlbGV0ZShwcm92aWRlcik7XG4gIH1cblxuICAvLyDstIjquLDtmZQg7KSR7JeQ64qUIDUwMyArIFJldHJ5LUFmdGVyLCDstIjquLDtmZQg7Iuk7Yyo7JeQ64qUIDUwMOydhCDrsJjtmZjtlZzri6QuXG4gIG5vdFJlYWR5RXJyb3IocHJvdmlkZXI6IFByb3ZpZGVySWQpOiBFcnJvciB7XG4gICAgY29uc3QgbGFiZWwgPSBQUk9WSURFUl9MQUJFTFNbcHJvdmlkZXJdO1xuXG4gICAgcmV0dXJuIHRoaXMuc3RhcnR1cFN0YXRlW3Byb3ZpZGVyXSA9PT0gXCJmYWlsZWRcIlxuICAgICAgPyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihTRChcInFncmlkLmRpc3BhdGNoZXJGYWlsZWRcIikobGFiZWwpKVxuICAgICAgOiBuZXcgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKFNEKFwicWdyaWQuZGlzcGF0Y2hlclN0YXJ0aW5nXCIpKGxhYmVsKSk7XG4gIH1cblxuICAvLyBwcmVmaXgg7JeG64qUL+uvuOyngOybkCBwcmVmaXgg64qUIOq4sOyhtOuMgOuhnCBQcm9jZXNzRXJyb3IsIOyngOybkCBwcm92aWRlciDsnZgg66+465Ox66Gd7J2AIG5vdC1yZWFkeS5cbiAgcmVzb2x2ZURpc3BhdGNoZXIoaW5wdXQ6IFF1ZXJ5SW5wdXQsIHByb3ZpZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBSZXNvbHZlZERpc3BhdGNoZXIge1xuICAgIGlmICghaXNQcm92aWRlcklkKHByb3ZpZGVyKSkgdGhyb3cgZGlyZWN0TGxtQXBpRmFsbGJhY2tOb3RJbXBsZW1lbnRlZChpbnB1dCk7XG4gICAgY29uc3QgZGlzcGF0Y2hlciA9IHRoaXMuZGlzcGF0Y2hlcnMuZ2V0KHByb3ZpZGVyKTtcblxuICAgIGlmICghZGlzcGF0Y2hlcikgdGhyb3cgdGhpcy5ub3RSZWFkeUVycm9yKHByb3ZpZGVyKTtcblxuICAgIHJldHVybiB7IHByb3ZpZGVyLCBkaXNwYXRjaGVyIH07XG4gIH1cblxuICByZWNvcmRDb21wbGV0ZWQocHJvdmlkZXI6IHN0cmluZywgdG9rZW5OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBgJHtwcm92aWRlcn1cXDAke3Rva2VuTmFtZX1gO1xuICAgIHRoaXMucmVxdWVzdENvdW50cy5zZXQoa2V5LCAodGhpcy5yZXF1ZXN0Q291bnRzLmdldChrZXkpID8/IDApICsgMSk7XG4gIH1cblxuICByZXBsYWNlQ2FjaGUocm93czogVG9rZW5TdWJzZXRBW10pOiB2b2lkIHtcbiAgICB0aGlzLnRva2VucyA9IG5ldyBNYXAocm93cy5tYXAoKHIpID0+IFtyLmlkLCByXSkpO1xuICB9XG5cbiAgZ2V0U3RhdHMoKTogVG9rZW5TdGF0c1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMudG9rZW5zLnZhbHVlcygpXS5tYXAoKHIpID0+ICh7XG4gICAgICB0b2tlbjogbWFza1Rva2VuKGdldEFjY2Vzc1Rva2VuKHIuY3JlZGVudGlhbHMpKSxcbiAgICAgIG5hbWU6IHIubmFtZSxcbiAgICAgIHByb3ZpZGVyOiByLnByb3ZpZGVyLFxuICAgICAgcmVxdWVzdHM6IHRoaXMucmVxdWVzdENvdW50cy5nZXQoYCR7ci5wcm92aWRlcn1cXDAke3IubmFtZX1gKSA/PyAwLFxuICAgIH0pKTtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5KGlucHV0OiBJbnRlcm5hbFF1ZXJ5SW5wdXQsIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFF1ZXJ5T3V0cHV0PiB7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcbiAgICBjb25zdCBhbnN3ZXJLaW5kID0gaW5wdXQuanNvblNjaGVtYSA/IChcImpzb25cIiBhcyBjb25zdCkgOiAoXCJ0ZXh0XCIgYXMgY29uc3QpO1xuICAgIGNvbnN0IHsgcHJvdmlkZXIsIGRpc3BhdGNoZXIgfSA9IHRoaXMucmVzb2x2ZURpc3BhdGNoZXIoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcblxuICAgIGlmIChwcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICBtb2RlbDogaW5wdXQubW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogY29tcG9zZVN5c3RlbVdpdGhTY2hlbWFDb250cmFjdChpbnB1dC5zeXN0ZW0sIGlucHV0KSxcbiAgICAgICAgdGhpbmtpbmc6IGlucHV0LnRoaW5raW5nLFxuICAgICAgICBlZmZvcnQ6IGlucHV0LnRoaW5raW5nID09PSBmYWxzZSA/IHVuZGVmaW5lZCA6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgcHJlZmVycmVkVG9rZW5JZDogaW5wdXQucHJlZmVycmVkVG9rZW5JZCxcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiBpbnB1dC5pbWFnZUdlbmVyYXRpb24sXG4gICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5yZWNvcmRDb21wbGV0ZWQocHJvdmlkZXIsIHJlc3VsdC50b2tlbk5hbWUpO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVDb252Q29udGV4dChyZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQsIHtcbiAgICAgIGRpcmVjdFByb3ZpZGVyOiBwcm92aWRlcixcbiAgICAgIG1vZGVsTmFtZXNwYWNlOiBgJHtwcm92aWRlcn0vJHtyb3V0ZS5tb2RlbH1gLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGlzcGF0Y2hlci5nZW5lcmF0ZSh7XG4gICAgICAuLi5idWlsZERpcmVjdFJlcXVlc3QoaW5wdXQsIHJvdXRlLm1vZGVsLCBvdXRwdXRTY2hlbWEsIGFuc3dlcktpbmQsIGFib3J0U2lnbmFsKSxcbiAgICAgIHByb21wdENhY2hlS2V5OiBpbnB1dC5pbWFnZUdlbmVyYXRpb24gPyB1bmRlZmluZWQgOiBkZWNpc2lvbi5wcm9tcHRDYWNoZUtleSxcbiAgICAgIHByZWZlcnJlZFRva2VuSWQ6XG4gICAgICAgIGlucHV0LnByZWZlcnJlZFRva2VuSWQgPz8gKGlucHV0LmltYWdlR2VuZXJhdGlvbiA/IHVuZGVmaW5lZCA6IGRlY2lzaW9uLnByZWZlcnJlZFRva2VuSWQpLFxuICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlY29yZENvbXBsZXRlZChwcm92aWRlciwgcmVzdWx0LnRva2VuTmFtZSk7XG5cbiAgICAvLyDsnbTrr7jsp4Ag7JqU7LKt7J2AIGNvbGQtb25seShSOCnrnbwg7J6s7IKs7JqpIOyijO2RnOulvCDrsJzquIntlZjsp4Ag7JWK64qU64ukLiDsooztkZzrpbwg7Iuk7Jy866m0XG4gICAgLy8gc2Vzc2lvbktleSDshozruYTsnpDsnZggd2FybSDsooztkZzrpbwg7KO97J2AIOyijO2RnOuhnCDrja7slrTsjagg64uk7J2MIO2FjeyKpO2KuCB0dXJuIOydtCBjb2xkIOuhnCDrlqjslrTsp4Tri6QuXG4gICAgY29uc3QgY29vcmQgPSBpbnB1dC5pbWFnZUdlbmVyYXRpb25cbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IGlzc3VlQ29udkNvbnRleHQocmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbiwgcmVzdWx0LnRocmVhZENvb3JkLndvcmtlcklkKTtcblxuICAgIHJldHVybiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHJlc3VsdCwgaW5wdXQuc2VydmljZVRpZXIpLCBpbnB1dC50b29scywge1xuICAgICAgdGhyZWFkQ29vcmQ6IGNvb3JkLFxuICAgICAgaW1hZ2VzOiByZXN1bHQuaW1hZ2VzLFxuICAgICAgYW5zd2VyS2luZCxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5U3RyZWFtKFxuICAgIGlucHV0OiBJbnRlcm5hbFF1ZXJ5SW5wdXQsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrczxRdWVyeU91dHB1dD4sXG4gICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcbiAgICBjb25zdCBhbnN3ZXJLaW5kID0gaW5wdXQuanNvblNjaGVtYSA/IChcImpzb25cIiBhcyBjb25zdCkgOiAoXCJ0ZXh0XCIgYXMgY29uc3QpO1xuICAgIGNvbnN0IHsgcHJvdmlkZXIsIGRpc3BhdGNoZXIgfSA9IHRoaXMucmVzb2x2ZURpc3BhdGNoZXIoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcblxuICAgIGlmIChwcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgLy8g6rWs7KGw7ZmUIOydkeuLteydgCDstZzsooUg7YWN7Iqk7Yq47JmAIOuNuO2DgCDrqqjrkZAg7L2U65Oc7Y6c7Iqk66W8IOygnOqxsO2VnOuLpC5cbiAgICAgIGNvbnN0IGhhc1NjaGVtYUNvbnRyYWN0ID0gaW5wdXQuanNvblNjaGVtYSAhPT0gdW5kZWZpbmVkIHx8IEJvb2xlYW4oaW5wdXQudG9vbHM/Lmxlbmd0aCk7XG4gICAgICBjb25zdCBmZW5jZVN0cmlwID0gaGFzU2NoZW1hQ29udHJhY3QgPyBjcmVhdGVGZW5jZVN0cmlwVHJhbnNmb3JtKCkgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IGVtaXREZWx0YSA9IGZlbmNlU3RyaXBcbiAgICAgICAgPyAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzYWZlID0gZmVuY2VTdHJpcC5wdXNoKHRleHQpO1xuXG4gICAgICAgICAgICBpZiAoc2FmZSkgY2Iub25EZWx0YShzYWZlKTtcbiAgICAgICAgICB9XG4gICAgICAgIDogY2Iub25EZWx0YTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBhd2FpdCBkaXNwYXRjaGVyLmdlbmVyYXRlU3RyZWFtKFxuICAgICAgICB7XG4gICAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogY29tcG9zZVN5c3RlbVdpdGhTY2hlbWFDb250cmFjdChpbnB1dC5zeXN0ZW0sIGlucHV0KSxcbiAgICAgICAgICB0aGlua2luZzogaW5wdXQudGhpbmtpbmcsXG4gICAgICAgICAgZWZmb3J0OiBpbnB1dC50aGlua2luZyA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBpbnB1dC5lZmZvcnQsXG4gICAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICAgIHByZWZlcnJlZFRva2VuSWQ6IGlucHV0LnByZWZlcnJlZFRva2VuSWQsXG4gICAgICAgICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvbkRlbHRhOiBlbWl0RGVsdGEsXG4gICAgICAgICAgb25UaHJlYWRJZDogY2Iub25UaHJlYWRJZCxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAodHVyblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWNvcmRDb21wbGV0ZWQocHJvdmlkZXIsIHR1cm5SZXN1bHQudG9rZW5OYW1lKTtcbiAgICAgICAgICAgIC8vIOuLq+uKlCDtjpzsiqQg7YyQ7KCVIOuVjOusuOyXkCDrs7TrpZjtlZwg7YWN7Iqk7Yq466W8IOyZhOujjCDsoITsl5Ag67Cp7Lac7ZWc64ukLlxuICAgICAgICAgICAgY29uc3QgcmVzdCA9IGZlbmNlU3RyaXA/LmZsdXNoKCk7XG5cbiAgICAgICAgICAgIGlmIChyZXN0KSBjYi5vbkRlbHRhKHJlc3QpO1xuXG4gICAgICAgICAgICBjb25zdCBpc3N1ZWRDb29yZCA9IGlzc3VlQ29udkNvbnRleHQodHVyblJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pO1xuICAgICAgICAgICAgY2Iub25Db21wbGV0ZShcbiAgICAgICAgICAgICAgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdCh0dXJuUmVzdWx0KSwgaW5wdXQudG9vbHMsIHtcbiAgICAgICAgICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVkQ29vcmQsXG4gICAgICAgICAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogY2Iub25FcnJvcixcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0LCB7XG4gICAgICBkaXJlY3RQcm92aWRlcjogcHJvdmlkZXIsXG4gICAgICBtb2RlbE5hbWVzcGFjZTogYCR7cHJvdmlkZXJ9LyR7cm91dGUubW9kZWx9YCxcbiAgICB9KTtcblxuICAgIGF3YWl0IGRpc3BhdGNoZXIuZ2VuZXJhdGVTdHJlYW0oXG4gICAgICB7XG4gICAgICAgIC4uLmJ1aWxkRGlyZWN0UmVxdWVzdChpbnB1dCwgcm91dGUubW9kZWwsIG91dHB1dFNjaGVtYSwgYW5zd2VyS2luZCwgYWJvcnRTaWduYWwpLFxuICAgICAgICBwcm9tcHRDYWNoZUtleTogZGVjaXNpb24ucHJvbXB0Q2FjaGVLZXksXG4gICAgICAgIHByZWZlcnJlZFRva2VuSWQ6IGlucHV0LnByZWZlcnJlZFRva2VuSWQgPz8gZGVjaXNpb24ucHJlZmVycmVkVG9rZW5JZCxcbiAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG9uRGVsdGE6IGNiLm9uRGVsdGEsXG4gICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgIG9uVHVybklkOiBjYi5vblR1cm5JZCxcbiAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICB0aGlzLnJlY29yZENvbXBsZXRlZChwcm92aWRlciwgdHVyblJlc3VsdC50b2tlbk5hbWUpO1xuICAgICAgICAgIGNiLm9uQ29tcGxldGUoXG4gICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQsIGlucHV0LnNlcnZpY2VUaWVyKSwgaW5wdXQudG9vbHMsIHtcbiAgICAgICAgICAgICAgdGhyZWFkQ29vcmQ6IGlzc3VlQ29udkNvbnRleHQoXG4gICAgICAgICAgICAgICAgdHVyblJlc3VsdC50aHJlYWRDb29yZCxcbiAgICAgICAgICAgICAgICBkZWNpc2lvbixcbiAgICAgICAgICAgICAgICB0dXJuUmVzdWx0LnRocmVhZENvb3JkLndvcmtlcklkLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogY2Iub25FcnJvcixcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxufVxuXG4vLyBEaXJlY3QgcHJvdmlkZXIoT3BlbkFJLCBHcm9rKSDqs7XthrUg7JqU7LKtIO2VhOuTnC4gY2FjaGUgYWZmaW5pdHkg7ZWE65Oc64qUIHN0cmVhbSDsl6zrtoDsl5Ag65Sw6528IO2YuOy2nOu2gOqwgCDssYTsmrTri6QuXG5mdW5jdGlvbiBidWlsZERpcmVjdFJlcXVlc3QoXG4gIGlucHV0OiBJbnRlcm5hbFF1ZXJ5SW5wdXQsXG4gIG1vZGVsOiBzdHJpbmcsXG4gIG91dHB1dFNjaGVtYTogSnNvblZhbHVlIHwgdW5kZWZpbmVkLFxuICBhbnN3ZXJLaW5kOiBcImpzb25cIiB8IFwidGV4dFwiLFxuICBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsXG4pOiBPbWl0PEdlbmVyYXRlUmVxdWVzdCwgXCJjb2xkSW5wdXRcIiB8IFwiY29sZEhpc3RvcnlcIiB8IFwicHJvbXB0Q2FjaGVLZXlcIiB8IFwicHJlZmVycmVkVG9rZW5JZFwiPiB7XG4gIGNvbnN0IHJlcXVlc3Q6IE9taXQ8XG4gICAgR2VuZXJhdGVSZXF1ZXN0LFxuICAgIFwiY29sZElucHV0XCIgfCBcImNvbGRIaXN0b3J5XCIgfCBcInByb21wdENhY2hlS2V5XCIgfCBcInByZWZlcnJlZFRva2VuSWRcIlxuICA+ID0ge1xuICAgIG1vZGVsLFxuICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgIG91dHB1dFNjaGVtYSxcbiAgICBzdG9wQWZ0ZXJPdXRwdXRNZXNzYWdlOiBpbnB1dC50b29scz8ubGVuZ3RoXG4gICAgICA/ICh0ZXh0LCBwaGFzZSkgPT4gaXNUb29sQ2FsbEVudmVsb3BlKHRleHQsIGlucHV0LnRvb2xzISwgYW5zd2VyS2luZCwgcGhhc2UpXG4gICAgICA6IHVuZGVmaW5lZCxcbiAgICB0aGlua2luZzogaW5wdXQudGhpbmtpbmcsXG4gICAgZWZmb3J0OiBpbnB1dC50aGlua2luZyA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBpbnB1dC5lZmZvcnQsXG4gICAgdmVyYm9zaXR5OiBpbnB1dC52ZXJib3NpdHksXG4gICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgIHJlcXVpcmVQcmVmZXJyZWRUb2tlbjogaW5wdXQucmVxdWlyZVByZWZlcnJlZFRva2VuLFxuICAgIGFib3J0U2lnbmFsLFxuICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gIH07XG5cbiAgLy8gT3BhcXVlIG5hbWVzcGFjZXM7IHRoZSBHcm9rIGRpc3BhdGNoZXIgcmVhZHMgYHhhaWAsIE9wZW5BSSBpZ25vcmVzIGl0LlxuICBpZiAoaW5wdXQucHJvdmlkZXJPcHRpb25zPy54YWkpIHtcbiAgICByZXF1ZXN0LnByb3ZpZGVyT3B0aW9ucyA9IHsgeGFpOiB7IC4uLmlucHV0LnByb3ZpZGVyT3B0aW9ucy54YWkgfSB9O1xuICB9XG5cbiAgcmV0dXJuIHJlcXVlc3Q7XG59XG5cbmludGVyZmFjZSBQcm92aWRlclJvdXRlIHtcbiAgcHJvdmlkZXI/OiBzdHJpbmc7XG4gIG1vZGVsOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUHJvdmlkZXJSb3V0ZShtb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvdmlkZXJSb3V0ZSB7XG4gIGlmICghbW9kZWw/LmluY2x1ZGVzKFwiL1wiKSkge1xuICAgIHJldHVybiB7IG1vZGVsOiBtb2RlbCA/PyBcIlwiIH07XG4gIH1cblxuICBjb25zdCBbcHJvdmlkZXIsIHJvdXRlZE1vZGVsXSA9IG1vZGVsLnNwbGl0KFwiL1wiLCAyKTtcblxuICBpZiAoIXByb3ZpZGVyIHx8ICFyb3V0ZWRNb2RlbCkgdGhyb3cgbmV3IFByb2Nlc3NFcnJvcihcInVua25vd24gbW9kZWxcIik7XG5cbiAgcmV0dXJuIHsgcHJvdmlkZXIsIG1vZGVsOiByb3V0ZWRNb2RlbCB9O1xufVxuXG5mdW5jdGlvbiBkaXJlY3RMbG1BcGlGYWxsYmFja05vdEltcGxlbWVudGVkKGlucHV0OiBRdWVyeUlucHV0KTogUHJvY2Vzc0Vycm9yIHtcbiAgcmV0dXJuIG5ldyBQcm9jZXNzRXJyb3IoXG4gICAgYERpcmVjdCBMTE0gQVBJIGZhbGxiYWNrIG5vdCBpbXBsZW1lbnRlZCBmb3IgbW9kZWw6ICR7aW5wdXQubW9kZWwgPz8gXCI8ZGVmYXVsdD5cIn1gLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdHJpY3RPdXRwdXRTY2hlbWEoXG4gIGlucHV0OiBQaWNrPFF1ZXJ5SW5wdXQsIFwidG9vbHNcIiB8IFwianNvblNjaGVtYVwiPixcbiAgcHJvdmlkZXI/OiBzdHJpbmcsXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFJhd091dHB1dFNjaGVtYShpbnB1dCk7XG5cbiAgaWYgKCFvdXRwdXRTY2hlbWEpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gQm9vbGVhbiBhbmQgb3RoZXIgbm9uLW9iamVjdCBzY2hlbWFzIGhhdmUgbm90aGluZyB0byB0aWdodGVuIGFuZCBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkLlxuICByZXR1cm4gaXNKc29uT2JqZWN0KG91dHB1dFNjaGVtYSkgPyBzdHJpY3RpZnkob3V0cHV0U2NoZW1hLCB7IHByb3ZpZGVyIH0pIDogb3V0cHV0U2NoZW1hO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJtb2RlbFwiIHwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuICBwcm92aWRlciA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCkucHJvdmlkZXIsXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICAvLyBDbGF1ZGUgQ29kZeydmCAtLWpzb24tc2NoZW1h64qUIOu2iO2VhOyalO2VnCDrgrTrtoAg7J6s7Iuc64+E66W8IOycoOuwnO2VnOuLpC5cbiAgLy8gQW50aHJvcGlj7J2AIOybkOuzuCDsiqTtgqTrp4jrpbwg6rKA7Kad7ZWcIOuSpCDtlITroaztlITtirjroZwg7KCE64us7ZWY6rOgLCDsnZHri7Ug6rKA7Kad7J2AIOyGjOu5hOyekOyXkCDrp6HquLTri6QuXG4gIGlmIChwcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgIHBhcnNlQW5kVmFsaWRhdGVDYWxsZXJTY2hlbWFzKGlucHV0KTtcblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFN0cmljdE91dHB1dFNjaGVtYShpbnB1dCwgcHJvdmlkZXIpO1xuICBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hKG91dHB1dFNjaGVtYSwgcHJvdmlkZXIpO1xuXG4gIHJldHVybiBvdXRwdXRTY2hlbWE7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmF3T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBjYWxsZXJPdXRwdXRTY2hlbWEgPSBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyhpbnB1dCk7XG5cbiAgcmV0dXJuIGlucHV0LnRvb2xzPy5sZW5ndGhcbiAgICA/IGJ1aWxkVG9vbENhbGxTY2hlbWEoaW5wdXQudG9vbHMsIGNhbGxlck91dHB1dFNjaGVtYSlcbiAgICA6IGNhbGxlck91dHB1dFNjaGVtYTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBsZXRlZERyaXZlckZyb21JbWFnZUZhaWx1cmUoXG4gIGNhdXNlOiB1bmtub3duLFxuICBzZXJ2aWNlVGllcj86IHN0cmluZyxcbik6IFF1ZXJ5T3V0cHV0IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCEoY2F1c2UgaW5zdGFuY2VvZiBJbWFnZUdlbmVyYXRpb25FcnJvcikgfHwgIWNhdXNlLmNvbXBsZXRlZERyaXZlcikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChjYXVzZS5jb21wbGV0ZWREcml2ZXIsIHNlcnZpY2VUaWVyKSwgdW5kZWZpbmVkLCB7XG4gICAgYW5zd2VyS2luZDogXCJ0ZXh0XCIsXG4gIH0pO1xufVxuXG4vLyBBbnRocm9waWMgYWRhcHRlciDripQgY2FjaGUgY3JlYXRpb24g7J2EIGlucHV0VG9rZW5zIOyXkCDtj6ztlajtlbQg7ZGc7KSA7ZmU7ZWY6rOgLCDrs4Trj4Qg7ZWE65Oc7JeQ64+EIOuztOyhtO2VnOuLpC5cbmZ1bmN0aW9uIHRvRW11bGF0aW9uUmVzdWx0KFxuICByZXN1bHQ6IEdlbmVyYXRlUmVzdWx0LFxuICBzZXJ2aWNlVGllcj86IHN0cmluZyxcbik6IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPiB7XG4gIC8vIEEgcHJvdmlkZXIgdGhhdCBsYWJlbHMgaXRzIG93biBjb3N0IChHcm9rIHRpY2tzKSBpcyBhdXRob3JpdGF0aXZlIGV2ZW4gYXQgMDsgb3RoZXJ3aXNlIG9ubHkgYVxuICAvLyBwb3NpdGl2ZSBwcm92aWRlciBjb3N0IChDbGF1ZGUgQ29kZSB0b3RhbF9jb3N0X3VzZCkgd2lucyBvdmVyIHRoZSBwcmljZSB0YWJsZS5cbiAgY29uc3QgaGFzUHJvdmlkZXJDb3N0ID1cbiAgICByZXN1bHQuY29zdFVzZCAhPT0gdW5kZWZpbmVkICYmIChyZXN1bHQuY29zdFNvdXJjZSA9PT0gXCJwcm92aWRlclwiIHx8IHJlc3VsdC5jb3N0VXNkID4gMCk7XG5cbiAgY29uc3QgZW11bGF0aW9uUmVzdWx0OiBPbWl0PFF1ZXJ5T3V0cHV0LCBcImNvbnRlbnRcIiB8IFwiZmluaXNoUmVhc29uXCIgfCBcInJ1bkNvbnRleHRcIj4gPSB7XG4gICAgdGV4dDogcmVzdWx0LnRleHQsXG4gICAgdG9rZW5OYW1lOiByZXN1bHQudG9rZW5OYW1lLFxuICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgcmVxdWVzdGVkTW9kZWw6IHJlc3VsdC5yZXF1ZXN0ZWRNb2RlbCxcbiAgICBtb2RlbEZhbGxiYWNrczogcmVzdWx0Lm1vZGVsRmFsbGJhY2tzLFxuICAgIHVzYWdlOiB7XG4gICAgICBpbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgIG91dHB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICByZWFzb25pbmdfdG9rZW5zOiByZXN1bHQudXNhZ2UucmVhc29uaW5nT3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICBjYWNoZV9jcmVhdGlvbl81bV9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICB9LFxuICAgIGR1cmF0aW9uTXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgIHR0ZnRNczogcmVzdWx0LnR0ZnRNcyA/PyAwLFxuICAgIGNvc3RVc2Q6IGhhc1Byb3ZpZGVyQ29zdFxuICAgICAgPyByZXN1bHQuY29zdFVzZCFcbiAgICAgIDogY2FsY3VsYXRlQ29zdFVzZChcbiAgICAgICAgICByZXN1bHQubW9kZWwsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5wdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgIG91dHB1dFRva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gMCxcbiAgICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0sXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2VydmljZVRpZXIsXG4gICAgICAgICksXG4gICAgY29zdFNvdXJjZTogaGFzUHJvdmlkZXJDb3N0ID8gKHJlc3VsdC5jb3N0U291cmNlID8/IFwicHJvdmlkZXJcIikgOiBcInByaWNpbmdfdGFibGVcIixcbiAgfTtcblxuICBpZiAocmVzdWx0LnByb3ZpZGVyTWV0YWRhdGE/LnhhaSkge1xuICAgIGVtdWxhdGlvblJlc3VsdC5wcm92aWRlck1ldGFkYXRhID0geyB4YWk6IHJlc3VsdC5wcm92aWRlck1ldGFkYXRhLnhhaSB9O1xuICB9XG5cbiAgcmV0dXJuIGVtdWxhdGlvblJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IFFncmlkRGlzcGF0Y2hlciA9IG5ldyBRZ3JpZERpc3BhdGNoZXJDbGFzcygpO1xuXG5pbnRlcmZhY2UgUmVzb2x2ZWREaXNwYXRjaGVyIHtcbiAgcHJvdmlkZXI6IFByb3ZpZGVySWQ7XG4gIGRpc3BhdGNoZXI6IFN0cmVhbWluZ1Byb3ZpZGVyRGlzcGF0Y2hlcjtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBd0dBLE1BQU0sa0JBQThDO0NBQ2xELFFBQVE7Q0FDUixXQUFXO0NBQ1gsTUFBTTtBQUNSO0FBRUEsSUFBYSx1QkFBYixNQUFrQztDQUNoQyx5QkFBUyxJQUFJLElBQTBCO0NBSXZDLGdDQUFnQixJQUFJLElBQW9CO0NBRXhDLGFBQXFDO0NBR3JDLDhCQUF1QixJQUFJLElBQTZDO0NBQ3hFLG9CQUE2QztDQUM3Qyx1QkFBbUQ7Q0FDbkQsa0JBQWlEO0NBSWpELGVBQ2tEO0VBQ2hELFFBQVE7RUFDUixXQUFXO0NBQ2I7Q0FFQSxZQUFZLFVBQWtDLENBQUMsR0FBRztFQUNoRCxJQUFJLFFBQVEsZ0JBQWdCLEtBQUssaUJBQWlCLFFBQVE7Q0FDNUQ7Q0FFQSxJQUFJLG1CQUE0QztFQUM5QyxPQUFPLEtBQUtBO0NBQ2Q7Q0FFQSxJQUFJLGlCQUFpQixZQUFxQztFQUN4RCxLQUFLQSxvQkFBb0I7RUFDekIsS0FBSyxTQUFTLFVBQVUsVUFBVTtDQUNwQztDQUVBLElBQUksc0JBQWtEO0VBQ3BELE9BQU8sS0FBS0M7Q0FDZDtDQUVBLElBQUksb0JB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
|