@cartanova/qgrid-cli 2.3.5 → 2.3.6
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/application/qgrid/oauth.js +15 -12
- package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +2 -1
- package/bundle/dist/application/qgrid/qgrid.dispatcher.js +2 -1
- package/bundle/dist/application/qgrid/qgrid.frame.js +23 -10
- package/bundle/dist/application/qgrid/qgrid.types.js +8 -2
- package/bundle/dist/application/qgrid/token-subscriber.js +16 -8
- package/bundle/dist/application/qgrid/token-trigger-setup.js +3 -2
- package/bundle/dist/application/request-log/request-log.model.js +12 -7
- package/bundle/dist/application/sonamu.generated.js +11 -3
- package/bundle/dist/application/sonamu.generated.sso.js +7 -2
- package/bundle/dist/application/token/token.model.js +10 -2
- package/bundle/dist/application/token/token.types.js +5 -3
- package/bundle/dist/i18n/sd.generated.js +4 -1
- package/bundle/dist/migrations/20260630223950_alter_tokens_add1_alter1.js +16 -0
- package/bundle/dist/migrations/20260701105327_alter_request_logs_add1_alter1.js +16 -0
- package/bundle/dist/migrations/20260701105328_alter_request_log_steps_add1_alter1.js +16 -0
- package/bundle/dist/sonamu.config.js +13 -6
- package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +99 -12
- package/bundle/dist/utils/providers/anthropic/anthropic-quota.js +31 -0
- package/bundle/dist/utils/providers/anthropic/claude-session.js +8 -3
- package/bundle/dist/utils/providers/common/ttft.js +25 -0
- package/bundle/dist/utils/providers/openai/codex-worker.js +35 -7
- package/bundle/dist/utils/providers/openai/openai-dispatcher.js +237 -39
- package/bundle/dist/utils/providers/openai/openai-quota.js +30 -0
- package/bundle/src/application/qgrid/oauth.ts +17 -7
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +96 -0
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +1 -0
- package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +16 -0
- package/bundle/src/application/qgrid/qgrid.dispatcher.ts +1 -0
- package/bundle/src/application/qgrid/qgrid.frame.test.ts +128 -0
- package/bundle/src/application/qgrid/qgrid.frame.ts +41 -20
- package/bundle/src/application/qgrid/qgrid.types.ts +6 -0
- package/bundle/src/application/qgrid/token-subscriber.test.ts +89 -0
- package/bundle/src/application/qgrid/token-subscriber.ts +40 -11
- package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -1
- package/bundle/src/application/qgrid/tool-emulation.test.ts +7 -3
- package/bundle/src/application/request-log/request-log.entity.json +3 -0
- package/bundle/src/application/request-log/request-log.model.test.ts +92 -0
- package/bundle/src/application/request-log/request-log.model.ts +20 -6
- package/bundle/src/application/request-log-step/request-log-step.entity.json +3 -0
- package/bundle/src/application/sonamu.generated.http +7 -2
- package/bundle/src/application/sonamu.generated.sso.ts +5 -0
- package/bundle/src/application/sonamu.generated.ts +11 -1
- package/bundle/src/application/token/token.entity.json +8 -2
- package/bundle/src/application/token/token.model.test.ts +69 -0
- package/bundle/src/application/token/token.model.ts +8 -1
- package/bundle/src/application/token/token.types.test.ts +34 -0
- package/bundle/src/application/token/token.types.ts +5 -0
- package/bundle/src/i18n/sd.generated.ts +3 -0
- package/bundle/src/migrations/20260630223950_alter_tokens_add1_alter1.ts +15 -0
- package/bundle/src/migrations/20260701105327_alter_request_logs_add1_alter1.ts +15 -0
- package/bundle/src/migrations/20260701105328_alter_request_log_steps_add1_alter1.ts +15 -0
- package/bundle/src/sonamu.config.ts +8 -1
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +183 -15
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +142 -12
- package/bundle/src/utils/providers/anthropic/anthropic-quota.test.ts +89 -0
- package/bundle/src/utils/providers/anthropic/anthropic-quota.ts +27 -0
- package/bundle/src/utils/providers/anthropic/claude-session.ts +7 -2
- package/bundle/src/utils/providers/common/provider-dispatcher.ts +1 -0
- package/bundle/src/utils/providers/common/ttft.test.ts +37 -0
- package/bundle/src/utils/providers/common/ttft.ts +26 -0
- package/bundle/src/utils/providers/openai/codex-worker.test.ts +148 -0
- package/bundle/src/utils/providers/openai/codex-worker.ts +50 -8
- package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +378 -6
- package/bundle/src/utils/providers/openai/openai-dispatcher.ts +332 -37
- package/bundle/src/utils/providers/openai/openai-quota.test.ts +85 -0
- package/bundle/src/utils/providers/openai/openai-quota.ts +46 -0
- package/bundle/web-dist/client/assets/index-5WdFEqZT.css +1 -0
- package/bundle/web-dist/client/assets/{index-DeThumA3.js → index-jnUY7nJ-.js} +3 -3
- package/bundle/web-dist/client/assets/logs-B0pWpDrg.js +1 -0
- package/bundle/web-dist/client/assets/routes-7XhVuG7o.js +5 -0
- package/bundle/web-dist/client/assets/{sd.generated-7jzAQL2_.js → sd.generated-DXhjjL2f.js} +1 -1
- package/bundle/web-dist/client/assets/{services.generated-Bx1Eh7ot.js → services.generated-B7u0U1wC.js} +1 -1
- package/bundle/web-dist/client/assets/{show-C6OofoAL.js → show-CcjZ9nr7.js} +3 -3
- package/bundle/web-dist/client/assets/tokens-DlwAm0v4.js +1 -0
- package/bundle/web-dist/client/index.html +3 -3
- package/bundle/web-dist/server/assets/{lazyRouteComponent-BEaI4mOq.js → lazyRouteComponent-B0LkbiYf.js} +1 -2
- package/bundle/web-dist/server/assets/{logs-CHM0fhfO.js → logs-dLx6gMXT.js} +17 -5
- package/bundle/web-dist/server/assets/{routes-C9xFMJ_r.js → routes-DD3Hb9xO.js} +201 -13
- package/bundle/web-dist/server/assets/{sd.generated-BeUHLWKH.js → sd.generated-DdfpD_iN.js} +131 -1
- package/bundle/web-dist/server/assets/{services.generated-C39hdSv0.js → services.generated-D3ZCvIkt.js} +5 -4
- package/bundle/web-dist/server/assets/{show-BZWqH09U.js → show-BQjeyv6A.js} +76 -25
- package/bundle/web-dist/server/assets/{tokens-IPwv3pNB.js → tokens-CSOsBpP7.js} +4 -3
- package/bundle/web-dist/server/entry-server.generated.js +6 -7
- package/dist/cli.js +67 -15
- package/package.json +1 -1
- package/bundle/web-dist/client/assets/index-B5DSo5uH.css +0 -1
- package/bundle/web-dist/client/assets/logs-CtmOVH58.js +0 -1
- package/bundle/web-dist/client/assets/routes-Cfoe9J0I.js +0 -5
- package/bundle/web-dist/client/assets/tokens-BAZq8sTo.js +0 -1
- package/bundle/web-dist/server/assets/shim-B9ZrFt3Z.js +0 -129
- /package/bundle/web-dist/server/assets/{cost-DzjfVtUr.js → cost-CSH_t17I.js} +0 -0
|
@@ -85,6 +85,7 @@ const QueryOutput = z.object({
|
|
|
85
85
|
cache_read_input_tokens: z.number()
|
|
86
86
|
}),
|
|
87
87
|
durationMs: z.number(),
|
|
88
|
+
ttftMs: z.number(),
|
|
88
89
|
costUsd: z.number(),
|
|
89
90
|
runContext: QgridRunContext.optional()
|
|
90
91
|
});
|
|
@@ -107,6 +108,7 @@ const StreamEvents = z.object({
|
|
|
107
108
|
cache_read_input_tokens: z.number()
|
|
108
109
|
}),
|
|
109
110
|
durationMs: z.number(),
|
|
111
|
+
ttftMs: z.number(),
|
|
110
112
|
costUsd: z.number(),
|
|
111
113
|
content: z.array(QgridContent),
|
|
112
114
|
runContext: QgridRunContext.optional()
|
|
@@ -130,6 +132,7 @@ const AppendStepInput = z.object({
|
|
|
130
132
|
cacheReadTokens: z.number().optional(),
|
|
131
133
|
cacheCreationTokens: z.number().optional(),
|
|
132
134
|
durationMs: z.number().optional(),
|
|
135
|
+
ttftMs: z.number().nullable().optional(),
|
|
133
136
|
finishReason: z.string().optional(),
|
|
134
137
|
reasoningText: z.string().optional(),
|
|
135
138
|
reasoningTokens: z.number().optional(),
|
|
@@ -194,6 +197,9 @@ const HealthResponse = z.object({
|
|
|
194
197
|
var QuotaError = class extends Error {
|
|
195
198
|
code = "QUOTA_EXHAUSTED";
|
|
196
199
|
};
|
|
200
|
+
var QuotaThresholdExceededError = class extends Error {
|
|
201
|
+
code = "QUOTA_THRESHOLD_EXCEEDED";
|
|
202
|
+
};
|
|
197
203
|
var TimeoutError = class extends Error {
|
|
198
204
|
code = "TIMEOUT";
|
|
199
205
|
};
|
|
@@ -204,6 +210,6 @@ function maskToken(token) {
|
|
|
204
210
|
return token.length > 4 ? `...${token.slice(-4)}` : token;
|
|
205
211
|
}
|
|
206
212
|
//#endregion
|
|
207
|
-
export { AddTokenInput, AppendStepInput, CreateRunInput, Effort, FinishReason, FinishRunInput, HealthResponse, OAuthStartResult, ProcessError, QgridContent, QgridLogMode, QgridRunContext, QgridThreadCoord, QgridTool, QgridToolResultInput, QueryInput, QueryOutput, QuotaError, ReasoningSummary, RemoveTokenInput, ServiceTier, StreamEvents, SubscriberStatus, TimeoutError, TokenStats, UsageResponse, Verbosity, maskToken };
|
|
213
|
+
export { AddTokenInput, AppendStepInput, CreateRunInput, Effort, FinishReason, FinishRunInput, HealthResponse, OAuthStartResult, ProcessError, QgridContent, QgridLogMode, QgridRunContext, QgridThreadCoord, QgridTool, QgridToolResultInput, QueryInput, QueryOutput, QuotaError, QuotaThresholdExceededError, ReasoningSummary, RemoveTokenInput, ServiceTier, StreamEvents, SubscriberStatus, TimeoutError, TokenStats, UsageResponse, Verbosity, maskToken };
|
|
208
214
|
|
|
209
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQudHlwZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbi8vIOKUgOKUgOKUgCBRdWVyeSDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IEVmZm9ydCA9IHouZW51bShbXCJsb3dcIiwgXCJtZWRpdW1cIiwgXCJoaWdoXCJdKTtcbmV4cG9ydCB0eXBlIEVmZm9ydCA9IHouaW5mZXI8dHlwZW9mIEVmZm9ydD47XG5cbmV4cG9ydCBjb25zdCBRZ3JpZFRvb2wgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHouc3RyaW5nKCksXG4gIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGlucHV0U2NoZW1hOiB6LnVua25vd24oKSxcbn0pO1xuZXhwb3J0IHR5cGUgUWdyaWRUb29sID0gei5pbmZlcjx0eXBlb2YgUWdyaWRUb29sPjtcblxuZXhwb3J0IGNvbnN0IFFncmlkQ29udGVudCA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gIHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJ0ZXh0XCIpLFxuICAgIHRleHQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKFwidG9vbC1jYWxsXCIpLFxuICAgIHRvb2xDYWxsSWQ6IHouc3RyaW5nKCksXG4gICAgdG9vbE5hbWU6IHouc3RyaW5nKCksXG4gICAgaW5wdXQ6IHouc3RyaW5nKCksXG4gIH0pLFxuXSk7XG5leHBvcnQgdHlwZSBRZ3JpZENvbnRlbnQgPSB6LmluZmVyPHR5cGVvZiBRZ3JpZENvbnRlbnQ+O1xuXG5leHBvcnQgY29uc3QgRmluaXNoUmVhc29uID0gei5lbnVtKFtcInN0b3BcIiwgXCJ0b29sLWNhbGxzXCJdKTtcbmV4cG9ydCB0eXBlIEZpbmlzaFJlYXNvbiA9IHouaW5mZXI8dHlwZW9mIEZpbmlzaFJlYXNvbj47XG5cbmV4cG9ydCBjb25zdCBWZXJib3NpdHkgPSB6LmVudW0oW1wibG93XCIsIFwibWVkaXVtXCIsIFwiaGlnaFwiXSk7XG5leHBvcnQgdHlwZSBWZXJib3NpdHkgPSB6LmluZmVyPHR5cGVvZiBWZXJib3NpdHk+O1xuXG5leHBvcnQgY29uc3QgUmVhc29uaW5nU3VtbWFyeSA9IHouZW51bShbXCJhdXRvXCIsIFwiY29uY2lzZVwiLCBcImRldGFpbGVkXCIsIFwibm9uZVwiXSk7XG5leHBvcnQgdHlwZSBSZWFzb25pbmdTdW1tYXJ5ID0gei5pbmZlcjx0eXBlb2YgUmVhc29uaW5nU3VtbWFyeT47XG5cbmV4cG9ydCBjb25zdCBTZXJ2aWNlVGllciA9IHouZW51bShbXCJmYXN0XCIsIFwiZmxleFwiXSk7XG5leHBvcnQgdHlwZSBTZXJ2aWNlVGllciA9IHouaW5mZXI8dHlwZW9mIFNlcnZpY2VUaWVyPjtcblxuLy8g4pSA4pSA4pSAIFJ1biBMaWZlY3ljbGUgQ29udGV4dCAoU0RLIOKGlCBTZXJ2ZXIgY29udHJhY3QpIOKUgOKUgOKUgFxuXG5leHBvcnQgY29uc3QgUWdyaWRMb2dNb2RlID0gei5lbnVtKFtcImF1dG9cIiwgXCJydW5cIiwgXCJub25lXCJdKTtcbmV4cG9ydCB0eXBlIFFncmlkTG9nTW9kZSA9IHouaW5mZXI8dHlwZW9mIFFncmlkTG9nTW9kZT47XG5cbi8vIGNvZGV4IHRocmVhZCDsooztkZwuIHRocmVhZCDsnqzsgqzsmqnsnLzroZwgY29udmVyc2F0aW9uX2lkKD1wcm9tcHRfY2FjaGVfa2V5KeulvCDqs6DsoJXtlbRcbi8vIE9wZW5BSSBwcm9tcHQgY2FjaGluZyDsnYQg7IK066as6riwIOychO2VnCDtlbjrk6QuIOyEnOuyhOqwgCDrsJzquIntlZjqs6Ag7YG065286rCAIOuLpOydjCDsmpTssq3sl5Ag6re464yA66GcIO2ajOyGoe2VnOuLpC5cbi8vIO2VuOuTpCDrr7jsoITshqEg7IucIOq4sOyhtCBcIuunpCB0dXJuIOyDiCB0aHJlYWQgKyBoaXN0b3J5IGluamVjdFwiIOuPmeyekeycvOuhnCDtj7TrsLEoUWdyaWRSdW5Db250ZXh0IOywuOyhsCkuXG5leHBvcnQgY29uc3QgUWdyaWRUaHJlYWRDb29yZCA9IHoub2JqZWN0KHtcbiAgd29ya2VySWQ6IHoubnVtYmVyKCksIC8vIOqzoOyglSDrnbzsmrDtjIUgKHRocmVhZCDripQgd29ya2VyIO2UhOuhnOyEuOyKpCDrqZTrqqjrpqzsl5Drp4wg7KG07J6sKVxuICB0aHJlYWRJZDogei5zdHJpbmcoKSwgLy8gY29kZXggY29udmVyc2F0aW9uX2lkID0gcHJvbXB0X2NhY2hlX2tleVxuICBlcG9jaDogei5udW1iZXIoKSwgLy8gd29ya2VyIHNwYXduIOy5tOyatO2EsC4gcmVzdGFydCDroZwgdGhyZWFkIOymneuwnCDqsJDsp4BcbiAgc3lzdGVtSGFzaDogei5zdHJpbmcoKSwgLy8gc3lzdGVtX3Byb21wdCDtlbTsi5wuIOuLpOuluCDrjIDtmZQg7Jik7KCR7IaNIOuwqeyngFxufSk7XG5leHBvcnQgdHlwZSBRZ3JpZFRocmVhZENvb3JkID0gei5pbmZlcjx0eXBlb2YgUWdyaWRUaHJlYWRDb29yZD47XG5cbmV4cG9ydCBjb25zdCBRZ3JpZFJ1bkNvbnRleHQgPSB6Lm9iamVjdCh7XG4gIC8vIHJ1biBsaWZlY3ljbGUobG9nTW9kZT1cInJ1blwiKSDsl5DshJzrp4wg67Cc6riJLiBhdXRvIOuqqOuTnCjsmIg6IElGKeuKlCB0aHJlYWRDb29yZCDrp4wg7JmV67O1LlxuICByZXF1ZXN0TG9nSWQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgdGhyZWFkQ29vcmQ6IFFncmlkVGhyZWFkQ29vcmQub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IHR5cGUgUWdyaWRSdW5Db250ZXh0ID0gei5pbmZlcjx0eXBlb2YgUWdyaWRSdW5Db250ZXh0PjtcblxuZXhwb3J0IGNvbnN0IFFncmlkVG9vbFJlc3VsdElucHV0ID0gei5vYmplY3Qoe1xuICB0b29sQ2FsbElkOiB6LnN0cmluZygpLFxuICB0b29sTmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBvdXRwdXQ6IHouc3RyaW5nKCksXG4gIGlzRXJyb3I6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCB0eXBlIFFncmlkVG9vbFJlc3VsdElucHV0ID0gei5pbmZlcjx0eXBlb2YgUWdyaWRUb29sUmVzdWx0SW5wdXQ+O1xuXG5leHBvcnQgY29uc3QgUXVlcnlJbnB1dCA9IHoub2JqZWN0KHtcbiAgc3lzdGVtOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHByb21wdDogei5zdHJpbmcoKSxcbiAgbW9kZWw6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgdGltZW91dDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBqc29uU2NoZW1hOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHRvb2xzOiB6LmFycmF5KFFncmlkVG9vbCkub3B0aW9uYWwoKSxcbiAgZWZmb3J0OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHZlcmJvc2l0eTogVmVyYm9zaXR5Lm9wdGlvbmFsKCksXG4gIHJlYXNvbmluZ1N1bW1hcnk6IFJlYXNvbmluZ1N1bW1hcnkub3B0aW9uYWwoKSxcbiAgc2VydmljZVRpZXI6IFNlcnZpY2VUaWVyLm9wdGlvbmFsKCksXG4gIGhpc3Rvcnk6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgcHJvamVjdE5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgaXNTdGVwOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBsb2dNb2RlOiBRZ3JpZExvZ01vZGUub3B0aW9uYWwoKSxcbiAgcnVuQ29udGV4dDogUWdyaWRSdW5Db250ZXh0Lm9wdGlvbmFsKCksXG4gIHRvb2xSZXN1bHRzOiB6LmFycmF5KFFncmlkVG9vbFJlc3VsdElucHV0KS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgdHlwZSBRdWVyeUlucHV0ID0gei5pbmZlcjx0eXBlb2YgUXVlcnlJbnB1dD47XG5cbmV4cG9ydCBjb25zdCBRdWVyeU91dHB1dCA9IHoub2JqZWN0KHtcbiAgdGV4dDogei5zdHJpbmcoKSxcbiAgY29udGVudDogei5hcnJheShRZ3JpZENvbnRlbnQpLFxuICBmaW5pc2hSZWFzb246IEZpbmlzaFJlYXNvbixcbiAgdG9rZW5OYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIG1vZGVsOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHVzYWdlOiB6Lm9iamVjdCh7XG4gICAgaW5wdXRfdG9rZW5zOiB6Lm51bWJlcigpLFxuICAgIG91dHB1dF90b2tlbnM6IHoubnVtYmVyKCksXG4gICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiB6Lm51bWJlcigpLFxuICAgIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zOiB6Lm51bWJlcigpLFxuICB9KSxcbiAgZHVyYXRpb25Nczogei5udW1iZXIoKSxcbiAgY29zdFVzZDogei5udW1iZXIoKSxcbiAgcnVuQ29udGV4dDogUWdyaWRSdW5Db250ZXh0Lm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCB0eXBlIFF1ZXJ5T3V0cHV0ID0gei5pbmZlcjx0eXBlb2YgUXVlcnlPdXRwdXQ+O1xuXG4vLyDilIDilIDilIAgU3RyZWFtIEV2ZW50cyDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IFN0cmVhbUV2ZW50cyA9IHoub2JqZWN0KHtcbiAgZGVsdGE6IHoub2JqZWN0KHsgdGV4dDogei5zdHJpbmcoKSB9KSxcbiAgdG9vbENhbGw6IHoub2JqZWN0KHtcbiAgICB0b29sQ2FsbElkOiB6LnN0cmluZygpLFxuICAgIHRvb2xOYW1lOiB6LnN0cmluZygpLFxuICAgIGlucHV0OiB6LnN0cmluZygpLFxuICB9KSxcbiAgZG9uZTogei5vYmplY3Qoe1xuICAgIHRleHQ6IHouc3RyaW5nKCksXG4gICAgbW9kZWw6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB0b2tlbk5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBmaW5pc2hSZWFzb246IEZpbmlzaFJlYXNvbixcbiAgICB1c2FnZTogei5vYmplY3Qoe1xuICAgICAgaW5wdXRfdG9rZW5zOiB6Lm51bWJlcigpLFxuICAgICAgb3V0cHV0X3Rva2Vuczogei5udW1iZXIoKSxcbiAgICAgIGNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2Vuczogei5udW1iZXIoKSxcbiAgICAgIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zOiB6Lm51bWJlcigpLFxuICAgIH0pLFxuICAgIGR1cmF0aW9uTXM6IHoubnVtYmVyKCksXG4gICAgY29zdFVzZDogei5udW1iZXIoKSxcbiAgICBjb250ZW50OiB6LmFycmF5KFFncmlkQ29udGVudCksXG4gICAgcnVuQ29udGV4dDogUWdyaWRSdW5Db250ZXh0Lm9wdGlvbmFsKCksXG4gIH0pLFxuICBlcnJvcjogei5vYmplY3QoeyBtZXNzYWdlOiB6LnN0cmluZygpIH0pLFxufSk7XG5leHBvcnQgdHlwZSBTdHJlYW1FdmVudHMgPSB6LmluZmVyPHR5cGVvZiBTdHJlYW1FdmVudHM+O1xuXG4vLyDilIDilIDilIAgUnVuIExpZmVjeWNsZSDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IENyZWF0ZVJ1bklucHV0ID0gei5vYmplY3Qoe1xuICB1c2VyUHJvbXB0OiB6LnN0cmluZygpLFxuICBzeXN0ZW1Qcm9tcHQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgbW9kZWxOYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGVmZm9ydDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBwcm9qZWN0TmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBoaXN0b3J5OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCB0eXBlIENyZWF0ZVJ1bklucHV0ID0gei5pbmZlcjx0eXBlb2YgQ3JlYXRlUnVuSW5wdXQ+O1xuXG5leHBvcnQgY29uc3QgQXBwZW5kU3RlcElucHV0ID0gei5vYmplY3Qoe1xuICByZXF1ZXN0TG9nSWQ6IHoubnVtYmVyKCksXG4gIHN0ZXBJbmRleDogei5udW1iZXIoKSxcbiAgdHlwZTogei5lbnVtKFtcImdlbmVyYXRlXCIsIFwidG9vbF9jYWxsXCJdKSxcbiAgaW5wdXRUb2tlbnM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgb3V0cHV0VG9rZW5zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIGNhY2hlUmVhZFRva2Vuczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBjYWNoZUNyZWF0aW9uVG9rZW5zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIGR1cmF0aW9uTXM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgZmluaXNoUmVhc29uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHJlYXNvbmluZ1RleHQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgcmVhc29uaW5nVG9rZW5zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHRvb2xDYWxsSW5kZXg6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgdG9vbENhbGxJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB0b29sTmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB0b29sQXJnczogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB0b29sUmVzdWx0OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHRvb2xEdXJhdGlvbk1zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIGVycm9yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCB0eXBlIEFwcGVuZFN0ZXBJbnB1dCA9IHouaW5mZXI8dHlwZW9mIEFwcGVuZFN0ZXBJbnB1dD47XG5cbmV4cG9ydCBjb25zdCBGaW5pc2hSdW5JbnB1dCA9IHoub2JqZWN0KHtcbiAgcmVxdWVzdExvZ0lkOiB6Lm51bWJlcigpLFxuICBzdGF0dXM6IHouZW51bShbXCJzdWNjZWVkZWRcIiwgXCJlcnJvclwiLCBcImFib3J0ZWRcIl0pLFxuICByZXNwb25zZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB0b2tlbk5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgdG90YWxJbnB1dFRva2Vuczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB0b3RhbE91dHB1dFRva2Vuczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB0b3RhbENhY2hlUmVhZFRva2Vuczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB0b3RhbENhY2hlQ3JlYXRpb25Ub2tlbnM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgdG90YWxEdXJhdGlvbk1zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIGhpc3Rvcnk6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZXJyb3JNZXNzYWdlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCB0eXBlIEZpbmlzaFJ1bklucHV0ID0gei5pbmZlcjx0eXBlb2YgRmluaXNoUnVuSW5wdXQ+O1xuXG4vLyDilIDilIDilIAgVG9rZW4gTWFuYWdlbWVudCDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IEFkZFRva2VuSW5wdXQgPSB6Lm9iamVjdCh7XG4gIHRva2VuOiB6LnN0cmluZygpLFxuICBuYW1lOiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgdHlwZSBBZGRUb2tlbklucHV0ID0gei5pbmZlcjx0eXBlb2YgQWRkVG9rZW5JbnB1dD47XG5cbmV4cG9ydCBjb25zdCBSZW1vdmVUb2tlbklucHV0ID0gei5vYmplY3Qoe1xuICB0b2tlbjogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IHR5cGUgUmVtb3ZlVG9rZW5JbnB1dCA9IHouaW5mZXI8dHlwZW9mIFJlbW92ZVRva2VuSW5wdXQ+O1xuXG5leHBvcnQgY29uc3QgVG9rZW5TdGF0cyA9IHoub2JqZWN0KHtcbiAgdG9rZW46IHouc3RyaW5nKCksXG4gIG5hbWU6IHouc3RyaW5nKCksXG4gIHByb3ZpZGVyOiB6LnN0cmluZygpLFxuICByZXF1ZXN0czogei5udW1iZXIoKSxcbn0pO1xuZXhwb3J0IHR5cGUgVG9rZW5TdGF0cyA9IHouaW5mZXI8dHlwZW9mIFRva2VuU3RhdHM+O1xuXG4vLyDilIDilIDilIAgT0F1dGgg4pSA4pSA4pSAXG5cbmV4cG9ydCBjb25zdCBPQXV0aFN0YXJ0UmVzdWx0ID0gei5vYmplY3Qoe1xuICBhdXRoVXJsOiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgdHlwZSBPQXV0aFN0YXJ0UmVzdWx0ID0gei5pbmZlcjx0eXBlb2YgT0F1dGhTdGFydFJlc3VsdD47XG5cbmNvbnN0IFJhdGVXaW5kb3cgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHV0aWxpemF0aW9uOiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gICAgcmVzZXRzQXQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgfSlcbiAgLm51bGxhYmxlKCk7XG5cbmV4cG9ydCBjb25zdCBVc2FnZVJlc3BvbnNlID0gei5vYmplY3Qoe1xuICBlcnJvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBwcm92aWRlcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBmaXZlSG91cjogUmF0ZVdpbmRvdy5vcHRpb25hbCgpLFxuICBzZXZlbkRheTogUmF0ZVdpbmRvdy5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgdHlwZSBVc2FnZVJlc3BvbnNlID0gei5pbmZlcjx0eXBlb2YgVXNhZ2VSZXNwb25zZT47XG5cbi8vIOKUgOKUgOKUgCBIZWFsdGgg4pSA4pSA4pSAXG5cbmV4cG9ydCBjb25zdCBTdWJzY3JpYmVyU3RhdHVzID0gei5vYmplY3Qoe1xuICBjb25uZWN0ZWQ6IHouYm9vbGVhbigpLFxuICBjb25uZWN0ZWRBdDogei5kYXRlKCkubnVsbGFibGUoKSxcbiAgbGFzdFJlY29uY2lsZUF0OiB6LmRhdGUoKS5udWxsYWJsZSgpLFxuICBhdHRlbXB0OiB6Lm51bWJlcigpLFxufSk7XG5leHBvcnQgdHlwZSBTdWJzY3JpYmVyU3RhdHVzID0gei5pbmZlcjx0eXBlb2YgU3Vic2NyaWJlclN0YXR1cz47XG5cbmV4cG9ydCBjb25zdCBIZWFsdGhSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgc3RhdHVzOiB6LnN0cmluZygpLFxuICBhY3RpdmVUb2tlbnM6IHoubnVtYmVyKCksXG4gIHN1YnNjcmliZXI6IFN1YnNjcmliZXJTdGF0dXMubnVsbGFibGUoKSxcbn0pO1xuZXhwb3J0IHR5cGUgSGVhbHRoUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBIZWFsdGhSZXNwb25zZT47XG5cbi8vIOKUgOKUgOKUgCBFcnJvcnMg4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBRdW90YUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBjb2RlID0gXCJRVU9UQV9FWEhBVVNURURcIiBhcyBjb25zdDtcbn1cbmV4cG9ydCBjbGFzcyBUaW1lb3V0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUgPSBcIlRJTUVPVVRcIiBhcyBjb25zdDtcbn1cbmV4cG9ydCBjbGFzcyBQcm9jZXNzRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUgPSBcIlBST0NFU1NfRVJST1JcIiBhcyBjb25zdDtcbn1cblxuLy8g4pSA4pSA4pSAIFV0aWxzIOKUgOKUgOKUgFxuXG5leHBvcnQgZnVuY3Rpb24gbWFza1Rva2VuKHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdG9rZW4ubGVuZ3RoID4gNCA/IGAuLi4ke3Rva2VuLnNsaWNlKC00KX1gIDogdG9rZW47XG59XG4iXSwibWFwcGluZ3MiOiI7OztBQUlBLE1BQWEsU0FBUyxFQUFFLEtBQUs7Q0FBQztDQUFPO0NBQVU7Q0FBTyxDQUFDO0FBR3ZELE1BQWEsWUFBWSxFQUFFLE9BQU87Q0FDaEMsTUFBTSxFQUFFLFFBQVE7Q0FDaEIsYUFBYSxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQ2xDLGFBQWEsRUFBRSxTQUFTO0NBQ3pCLENBQUM7QUFHRixNQUFhLGVBQWUsRUFBRSxtQkFBbUIsUUFBUSxDQUN2RCxFQUFFLE9BQU87Q0FDUCxNQUFNLEVBQUUsUUFBUSxPQUFP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
|
|
215
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQudHlwZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbi8vIOKUgOKUgOKUgCBRdWVyeSDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IEVmZm9ydCA9IHouZW51bShbXCJsb3dcIiwgXCJtZWRpdW1cIiwgXCJoaWdoXCJdKTtcbmV4cG9ydCB0eXBlIEVmZm9ydCA9IHouaW5mZXI8dHlwZW9mIEVmZm9ydD47XG5cbmV4cG9ydCBjb25zdCBRZ3JpZFRvb2wgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHouc3RyaW5nKCksXG4gIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGlucHV0U2NoZW1hOiB6LnVua25vd24oKSxcbn0pO1xuZXhwb3J0IHR5cGUgUWdyaWRUb29sID0gei5pbmZlcjx0eXBlb2YgUWdyaWRUb29sPjtcblxuZXhwb3J0IGNvbnN0IFFncmlkQ29udGVudCA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gIHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJ0ZXh0XCIpLFxuICAgIHRleHQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKFwidG9vbC1jYWxsXCIpLFxuICAgIHRvb2xDYWxsSWQ6IHouc3RyaW5nKCksXG4gICAgdG9vbE5hbWU6IHouc3RyaW5nKCksXG4gICAgaW5wdXQ6IHouc3RyaW5nKCksXG4gIH0pLFxuXSk7XG5leHBvcnQgdHlwZSBRZ3JpZENvbnRlbnQgPSB6LmluZmVyPHR5cGVvZiBRZ3JpZENvbnRlbnQ+O1xuXG5leHBvcnQgY29uc3QgRmluaXNoUmVhc29uID0gei5lbnVtKFtcInN0b3BcIiwgXCJ0b29sLWNhbGxzXCJdKTtcbmV4cG9ydCB0eXBlIEZpbmlzaFJlYXNvbiA9IHouaW5mZXI8dHlwZW9mIEZpbmlzaFJlYXNvbj47XG5cbmV4cG9ydCBjb25zdCBWZXJib3NpdHkgPSB6LmVudW0oW1wibG93XCIsIFwibWVkaXVtXCIsIFwiaGlnaFwiXSk7XG5leHBvcnQgdHlwZSBWZXJib3NpdHkgPSB6LmluZmVyPHR5cGVvZiBWZXJib3NpdHk+O1xuXG5leHBvcnQgY29uc3QgUmVhc29uaW5nU3VtbWFyeSA9IHouZW51bShbXCJhdXRvXCIsIFwiY29uY2lzZVwiLCBcImRldGFpbGVkXCIsIFwibm9uZVwiXSk7XG5leHBvcnQgdHlwZSBSZWFzb25pbmdTdW1tYXJ5ID0gei5pbmZlcjx0eXBlb2YgUmVhc29uaW5nU3VtbWFyeT47XG5cbmV4cG9ydCBjb25zdCBTZXJ2aWNlVGllciA9IHouZW51bShbXCJmYXN0XCIsIFwiZmxleFwiXSk7XG5leHBvcnQgdHlwZSBTZXJ2aWNlVGllciA9IHouaW5mZXI8dHlwZW9mIFNlcnZpY2VUaWVyPjtcblxuLy8g4pSA4pSA4pSAIFJ1biBMaWZlY3ljbGUgQ29udGV4dCAoU0RLIOKGlCBTZXJ2ZXIgY29udHJhY3QpIOKUgOKUgOKUgFxuXG5leHBvcnQgY29uc3QgUWdyaWRMb2dNb2RlID0gei5lbnVtKFtcImF1dG9cIiwgXCJydW5cIiwgXCJub25lXCJdKTtcbmV4cG9ydCB0eXBlIFFncmlkTG9nTW9kZSA9IHouaW5mZXI8dHlwZW9mIFFncmlkTG9nTW9kZT47XG5cbi8vIGNvZGV4IHRocmVhZCDsooztkZwuIHRocmVhZCDsnqzsgqzsmqnsnLzroZwgY29udmVyc2F0aW9uX2lkKD1wcm9tcHRfY2FjaGVfa2V5KeulvCDqs6DsoJXtlbRcbi8vIE9wZW5BSSBwcm9tcHQgY2FjaGluZyDsnYQg7IK066as6riwIOychO2VnCDtlbjrk6QuIOyEnOuyhOqwgCDrsJzquIntlZjqs6Ag7YG065286rCAIOuLpOydjCDsmpTssq3sl5Ag6re464yA66GcIO2ajOyGoe2VnOuLpC5cbi8vIO2VuOuTpCDrr7jsoITshqEg7IucIOq4sOyhtCBcIuunpCB0dXJuIOyDiCB0aHJlYWQgKyBoaXN0b3J5IGluamVjdFwiIOuPmeyekeycvOuhnCDtj7TrsLEoUWdyaWRSdW5Db250ZXh0IOywuOyhsCkuXG5leHBvcnQgY29uc3QgUWdyaWRUaHJlYWRDb29yZCA9IHoub2JqZWN0KHtcbiAgd29ya2VySWQ6IHoubnVtYmVyKCksIC8vIOqzoOyglSDrnbzsmrDtjIUgKHRocmVhZCDripQgd29ya2VyIO2UhOuhnOyEuOyKpCDrqZTrqqjrpqzsl5Drp4wg7KG07J6sKVxuICB0aHJlYWRJZDogei5zdHJpbmcoKSwgLy8gY29kZXggY29udmVyc2F0aW9uX2lkID0gcHJvbXB0X2NhY2hlX2tleVxuICBlcG9jaDogei5udW1iZXIoKSwgLy8gd29ya2VyIHNwYXduIOy5tOyatO2EsC4gcmVzdGFydCDroZwgdGhyZWFkIOymneuwnCDqsJDsp4BcbiAgc3lzdGVtSGFzaDogei5zdHJpbmcoKSwgLy8gc3lzdGVtX3Byb21wdCDtlbTsi5wuIOuLpOuluCDrjIDtmZQg7Jik7KCR7IaNIOuwqeyngFxufSk7XG5leHBvcnQgdHlwZSBRZ3JpZFRocmVhZENvb3JkID0gei5pbmZlcjx0eXBlb2YgUWdyaWRUaHJlYWRDb29yZD47XG5cbmV4cG9ydCBjb25zdCBRZ3JpZFJ1bkNvbnRleHQgPSB6Lm9iamVjdCh7XG4gIC8vIHJ1biBsaWZlY3ljbGUobG9nTW9kZT1cInJ1blwiKSDsl5DshJzrp4wg67Cc6riJLiBhdXRvIOuqqOuTnCjsmIg6IElGKeuKlCB0aHJlYWRDb29yZCDrp4wg7JmV67O1LlxuICByZXF1ZXN0TG9nSWQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgdGhyZWFkQ29vcmQ6IFFncmlkVGhyZWFkQ29vcmQub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IHR5cGUgUWdyaWRSdW5Db250ZXh0ID0gei5pbmZlcjx0eXBlb2YgUWdyaWRSdW5Db250ZXh0PjtcblxuZXhwb3J0IGNvbnN0IFFncmlkVG9vbFJlc3VsdElucHV0ID0gei5vYmplY3Qoe1xuICB0b29sQ2FsbElkOiB6LnN0cmluZygpLFxuICB0b29sTmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBvdXRwdXQ6IHouc3RyaW5nKCksXG4gIGlzRXJyb3I6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCB0eXBlIFFncmlkVG9vbFJlc3VsdElucHV0ID0gei5pbmZlcjx0eXBlb2YgUWdyaWRUb29sUmVzdWx0SW5wdXQ+O1xuXG5leHBvcnQgY29uc3QgUXVlcnlJbnB1dCA9IHoub2JqZWN0KHtcbiAgc3lzdGVtOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHByb21wdDogei5zdHJpbmcoKSxcbiAgbW9kZWw6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgdGltZW91dDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBqc29uU2NoZW1hOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHRvb2xzOiB6LmFycmF5KFFncmlkVG9vbCkub3B0aW9uYWwoKSxcbiAgZWZmb3J0OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHZlcmJvc2l0eTogVmVyYm9zaXR5Lm9wdGlvbmFsKCksXG4gIHJlYXNvbmluZ1N1bW1hcnk6IFJlYXNvbmluZ1N1bW1hcnkub3B0aW9uYWwoKSxcbiAgc2VydmljZVRpZXI6IFNlcnZpY2VUaWVyLm9wdGlvbmFsKCksXG4gIGhpc3Rvcnk6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgcHJvamVjdE5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgaXNTdGVwOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBsb2dNb2RlOiBRZ3JpZExvZ01vZGUub3B0aW9uYWwoKSxcbiAgcnVuQ29udGV4dDogUWdyaWRSdW5Db250ZXh0Lm9wdGlvbmFsKCksXG4gIHRvb2xSZXN1bHRzOiB6LmFycmF5KFFncmlkVG9vbFJlc3VsdElucHV0KS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgdHlwZSBRdWVyeUlucHV0ID0gei5pbmZlcjx0eXBlb2YgUXVlcnlJbnB1dD47XG5cbmV4cG9ydCBjb25zdCBRdWVyeU91dHB1dCA9IHoub2JqZWN0KHtcbiAgdGV4dDogei5zdHJpbmcoKSxcbiAgY29udGVudDogei5hcnJheShRZ3JpZENvbnRlbnQpLFxuICBmaW5pc2hSZWFzb246IEZpbmlzaFJlYXNvbixcbiAgdG9rZW5OYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIG1vZGVsOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHVzYWdlOiB6Lm9iamVjdCh7XG4gICAgaW5wdXRfdG9rZW5zOiB6Lm51bWJlcigpLFxuICAgIG91dHB1dF90b2tlbnM6IHoubnVtYmVyKCksXG4gICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiB6Lm51bWJlcigpLFxuICAgIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zOiB6Lm51bWJlcigpLFxuICB9KSxcbiAgZHVyYXRpb25Nczogei5udW1iZXIoKSxcbiAgdHRmdE1zOiB6Lm51bWJlcigpLFxuICBjb3N0VXNkOiB6Lm51bWJlcigpLFxuICBydW5Db250ZXh0OiBRZ3JpZFJ1bkNvbnRleHQub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IHR5cGUgUXVlcnlPdXRwdXQgPSB6LmluZmVyPHR5cGVvZiBRdWVyeU91dHB1dD47XG5cbi8vIOKUgOKUgOKUgCBTdHJlYW0gRXZlbnRzIOKUgOKUgOKUgFxuXG5leHBvcnQgY29uc3QgU3RyZWFtRXZlbnRzID0gei5vYmplY3Qoe1xuICBkZWx0YTogei5vYmplY3QoeyB0ZXh0OiB6LnN0cmluZygpIH0pLFxuICB0b29sQ2FsbDogei5vYmplY3Qoe1xuICAgIHRvb2xDYWxsSWQ6IHouc3RyaW5nKCksXG4gICAgdG9vbE5hbWU6IHouc3RyaW5nKCksXG4gICAgaW5wdXQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICBkb25lOiB6Lm9iamVjdCh7XG4gICAgdGV4dDogei5zdHJpbmcoKSxcbiAgICBtb2RlbDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIHRva2VuTmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGZpbmlzaFJlYXNvbjogRmluaXNoUmVhc29uLFxuICAgIHVzYWdlOiB6Lm9iamVjdCh7XG4gICAgICBpbnB1dF90b2tlbnM6IHoubnVtYmVyKCksXG4gICAgICBvdXRwdXRfdG9rZW5zOiB6Lm51bWJlcigpLFxuICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiB6Lm51bWJlcigpLFxuICAgICAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM6IHoubnVtYmVyKCksXG4gICAgfSksXG4gICAgZHVyYXRpb25Nczogei5udW1iZXIoKSxcbiAgICB0dGZ0TXM6IHoubnVtYmVyKCksXG4gICAgY29zdFVzZDogei5udW1iZXIoKSxcbiAgICBjb250ZW50OiB6LmFycmF5KFFncmlkQ29udGVudCksXG4gICAgcnVuQ29udGV4dDogUWdyaWRSdW5Db250ZXh0Lm9wdGlvbmFsKCksXG4gIH0pLFxuICBlcnJvcjogei5vYmplY3QoeyBtZXNzYWdlOiB6LnN0cmluZygpIH0pLFxufSk7XG5leHBvcnQgdHlwZSBTdHJlYW1FdmVudHMgPSB6LmluZmVyPHR5cGVvZiBTdHJlYW1FdmVudHM+O1xuXG4vLyDilIDilIDilIAgUnVuIExpZmVjeWNsZSDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IENyZWF0ZVJ1bklucHV0ID0gei5vYmplY3Qoe1xuICB1c2VyUHJvbXB0OiB6LnN0cmluZygpLFxuICBzeXN0ZW1Qcm9tcHQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgbW9kZWxOYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGVmZm9ydDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBwcm9qZWN0TmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBoaXN0b3J5OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCB0eXBlIENyZWF0ZVJ1bklucHV0ID0gei5pbmZlcjx0eXBlb2YgQ3JlYXRlUnVuSW5wdXQ+O1xuXG5leHBvcnQgY29uc3QgQXBwZW5kU3RlcElucHV0ID0gei5vYmplY3Qoe1xuICByZXF1ZXN0TG9nSWQ6IHoubnVtYmVyKCksXG4gIHN0ZXBJbmRleDogei5udW1iZXIoKSxcbiAgdHlwZTogei5lbnVtKFtcImdlbmVyYXRlXCIsIFwidG9vbF9jYWxsXCJdKSxcbiAgaW5wdXRUb2tlbnM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgb3V0cHV0VG9rZW5zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIGNhY2hlUmVhZFRva2Vuczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBjYWNoZUNyZWF0aW9uVG9rZW5zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIGR1cmF0aW9uTXM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgdHRmdE1zOiB6Lm51bWJlcigpLm51bGxhYmxlKCkub3B0aW9uYWwoKSxcbiAgZmluaXNoUmVhc29uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHJlYXNvbmluZ1RleHQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgcmVhc29uaW5nVG9rZW5zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHRvb2xDYWxsSW5kZXg6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgdG9vbENhbGxJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB0b29sTmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB0b29sQXJnczogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB0b29sUmVzdWx0OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHRvb2xEdXJhdGlvbk1zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIGVycm9yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCB0eXBlIEFwcGVuZFN0ZXBJbnB1dCA9IHouaW5mZXI8dHlwZW9mIEFwcGVuZFN0ZXBJbnB1dD47XG5cbmV4cG9ydCBjb25zdCBGaW5pc2hSdW5JbnB1dCA9IHoub2JqZWN0KHtcbiAgcmVxdWVzdExvZ0lkOiB6Lm51bWJlcigpLFxuICBzdGF0dXM6IHouZW51bShbXCJzdWNjZWVkZWRcIiwgXCJlcnJvclwiLCBcImFib3J0ZWRcIl0pLFxuICByZXNwb25zZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB0b2tlbk5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgdG90YWxJbnB1dFRva2Vuczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB0b3RhbE91dHB1dFRva2Vuczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB0b3RhbENhY2hlUmVhZFRva2Vuczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB0b3RhbENhY2hlQ3JlYXRpb25Ub2tlbnM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgdG90YWxEdXJhdGlvbk1zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIGhpc3Rvcnk6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZXJyb3JNZXNzYWdlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCB0eXBlIEZpbmlzaFJ1bklucHV0ID0gei5pbmZlcjx0eXBlb2YgRmluaXNoUnVuSW5wdXQ+O1xuXG4vLyDilIDilIDilIAgVG9rZW4gTWFuYWdlbWVudCDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IEFkZFRva2VuSW5wdXQgPSB6Lm9iamVjdCh7XG4gIHRva2VuOiB6LnN0cmluZygpLFxuICBuYW1lOiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgdHlwZSBBZGRUb2tlbklucHV0ID0gei5pbmZlcjx0eXBlb2YgQWRkVG9rZW5JbnB1dD47XG5cbmV4cG9ydCBjb25zdCBSZW1vdmVUb2tlbklucHV0ID0gei5vYmplY3Qoe1xuICB0b2tlbjogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IHR5cGUgUmVtb3ZlVG9rZW5JbnB1dCA9IHouaW5mZXI8dHlwZW9mIFJlbW92ZVRva2VuSW5wdXQ+O1xuXG5leHBvcnQgY29uc3QgVG9rZW5TdGF0cyA9IHoub2JqZWN0KHtcbiAgdG9rZW46IHouc3RyaW5nKCksXG4gIG5hbWU6IHouc3RyaW5nKCksXG4gIHByb3ZpZGVyOiB6LnN0cmluZygpLFxuICByZXF1ZXN0czogei5udW1iZXIoKSxcbn0pO1xuZXhwb3J0IHR5cGUgVG9rZW5TdGF0cyA9IHouaW5mZXI8dHlwZW9mIFRva2VuU3RhdHM+O1xuXG4vLyDilIDilIDilIAgT0F1dGgg4pSA4pSA4pSAXG5cbmV4cG9ydCBjb25zdCBPQXV0aFN0YXJ0UmVzdWx0ID0gei5vYmplY3Qoe1xuICBhdXRoVXJsOiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgdHlwZSBPQXV0aFN0YXJ0UmVzdWx0ID0gei5pbmZlcjx0eXBlb2YgT0F1dGhTdGFydFJlc3VsdD47XG5cbmNvbnN0IFJhdGVXaW5kb3cgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHV0aWxpemF0aW9uOiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gICAgcmVzZXRzQXQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgfSlcbiAgLm51bGxhYmxlKCk7XG5cbmV4cG9ydCBjb25zdCBVc2FnZVJlc3BvbnNlID0gei5vYmplY3Qoe1xuICBlcnJvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBwcm92aWRlcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBmaXZlSG91cjogUmF0ZVdpbmRvdy5vcHRpb25hbCgpLFxuICBzZXZlbkRheTogUmF0ZVdpbmRvdy5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgdHlwZSBVc2FnZVJlc3BvbnNlID0gei5pbmZlcjx0eXBlb2YgVXNhZ2VSZXNwb25zZT47XG5cbi8vIOKUgOKUgOKUgCBIZWFsdGgg4pSA4pSA4pSAXG5cbmV4cG9ydCBjb25zdCBTdWJzY3JpYmVyU3RhdHVzID0gei5vYmplY3Qoe1xuICBjb25uZWN0ZWQ6IHouYm9vbGVhbigpLFxuICBjb25uZWN0ZWRBdDogei5kYXRlKCkubnVsbGFibGUoKSxcbiAgbGFzdFJlY29uY2lsZUF0OiB6LmRhdGUoKS5udWxsYWJsZSgpLFxuICBhdHRlbXB0OiB6Lm51bWJlcigpLFxufSk7XG5leHBvcnQgdHlwZSBTdWJzY3JpYmVyU3RhdHVzID0gei5pbmZlcjx0eXBlb2YgU3Vic2NyaWJlclN0YXR1cz47XG5cbmV4cG9ydCBjb25zdCBIZWFsdGhSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgc3RhdHVzOiB6LnN0cmluZygpLFxuICBhY3RpdmVUb2tlbnM6IHoubnVtYmVyKCksXG4gIHN1YnNjcmliZXI6IFN1YnNjcmliZXJTdGF0dXMubnVsbGFibGUoKSxcbn0pO1xuZXhwb3J0IHR5cGUgSGVhbHRoUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBIZWFsdGhSZXNwb25zZT47XG5cbi8vIOKUgOKUgOKUgCBFcnJvcnMg4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBRdW90YUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBjb2RlID0gXCJRVU9UQV9FWEhBVVNURURcIiBhcyBjb25zdDtcbn1cbmV4cG9ydCBjbGFzcyBRdW90YVRocmVzaG9sZEV4Y2VlZGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUgPSBcIlFVT1RBX1RIUkVTSE9MRF9FWENFRURFRFwiIGFzIGNvbnN0O1xufVxuZXhwb3J0IGNsYXNzIFRpbWVvdXRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSA9IFwiVElNRU9VVFwiIGFzIGNvbnN0O1xufVxuZXhwb3J0IGNsYXNzIFByb2Nlc3NFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSA9IFwiUFJPQ0VTU19FUlJPUlwiIGFzIGNvbnN0O1xufVxuXG4vLyDilIDilIDilIAgVXRpbHMg4pSA4pSA4pSAXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXNrVG9rZW4odG9rZW46IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0b2tlbi5sZW5ndGggPiA0ID8gYC4uLiR7dG9rZW4uc2xpY2UoLTQpfWAgOiB0b2tlbjtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsTUFBYSxTQUFTLEVBQUUsS0FBSztDQUFDO0NBQU87Q0FBVTtDQUFPLENBQUM7QUFHdkQsTUFBYSxZQUFZLEVBQUUsT0FBTztDQUNoQyxNQUFNLEVBQUUsUUFBUTtDQUNoQixhQUFhLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDbEMsYUFBYSxFQUFFLFNBQVM7Q0FDekIsQ0FBQztBQUdGLE1BQWEsZUFBZSxFQUFFLG1CQUFtQixRQUFRLENBQ3ZELEVBQUUsT0FBTztDQUNQLE1BQU0sRUFBRSxRQUFRLE9BQU87Q0FDdkIsTUFBTSxFQUFFLFFBQVE7Q0FDakIsQ0FBQyxFQUNGLEVBQUUsT0FBTztDQUNQLE1BQU0sRUFBRSxRQUFRLFlBQVk7Q0FDNUIsWUFBWSxFQUFFLFFBQVE7Q0FDdEIsVUFBVSxFQUFFLFFBQVE7Q0FDcEIsT0FBTyxFQUFFLFFBQVE7Q0FDbEIsQ0FBQyxDQUNILENBQUM7QUFHRixNQUFhLGVBQWUsRUFBRSxLQUFLLENBQUMsUUFBUSxhQUFhLENBQUM7QUFHMUQsTUFBYSxZQUFZLEVBQUUsS0FBSztDQUFDO0NBQU87Q0FBVTtDQUFPLENBQUM7QUFHMUQsTUFBYSxtQkFBbUIsRUFBRSxLQUFLO0NBQUM7Q0FBUTtDQUFXO0NBQVk7Q0FBTyxDQUFDO0FBRy9FLE1BQWEsY0FBYyxFQUFFLEtBQUssQ0FBQyxRQUFRLE9BQU8sQ0FBQztBQUtuRCxNQUFhLGVBQWUsRUFBRSxLQUFLO0NBQUM7Q0FBUTtDQUFPO0NBQU8sQ0FBQztBQU0zRCxNQUFhLG1CQUFtQixFQUFFLE9BQU87Q0FDdkMsVUFBVSxFQUFFLFFBQVE7Q0FDcEIsVUFBVSxFQUFFLFFBQVE7Q0FDcEIsT0FBTyxFQUFFLFFBQVE7Q0FDakIsWUFBWSxFQUFFLFFBQVE7Q0FDdkIsQ0FBQztBQUdGLE1BQWEsa0JBQWtCLEVBQUUsT0FBTztDQUV0QyxjQUFjLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDbkMsYUFBYSxpQkFBaUIsVUFBVTtDQUN6QyxDQUFDO0FBR0YsTUFBYSx1QkFBdUIsRUFBRSxPQUFPO0NBQzNDLFlBQVksRUFBRSxRQUFRO0NBQ3RCLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVTtDQUMvQixRQUFRLEVBQUUsUUFBUTtDQUNsQixTQUFTLEVBQUUsU0FBUyxDQUFDLFVBQVU7Q0FDaEMsQ0FBQztBQUdGLE1BQWEsYUFBYSxFQUFFLE9BQU87Q0FDakMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQzdCLFFBQVEsRUFBRSxRQUFRO0NBQ2xCLE9BQU8sRUFBRSxRQUFRLENBQUMsVUFBVTtDQUM1QixTQUFTLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDOUIsWUFBWSxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQ2pDLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQyxVQUFVO0NBQ3BDLFFBQVEsRUFBRSxRQUFRLENBQUMsVUFBVTtDQUM3QixXQUFXLFVBQVUsVUFBVTtDQUMvQixrQkFBa0IsaUJBQWlCLFVBQVU7Q0FDN0MsYUFBYSxZQUFZLFVBQVU7Q0FDbkMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQzlCLGFBQWEsRUFBRSxRQUFRLENBQUMsVUFBVTtDQUNsQyxRQUFRLEVBQUUsU0FBUyxDQUFDLFVBQVU7Q0FDOUIsU0FBUyxhQUFhLFVBQVU7Q0FDaEMsWUFBWSxnQkFBZ0IsVUFBVTtDQUN0QyxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQyxVQUFVO0NBQ3RELENBQUM7QUFHRixNQUFhLGNBQWMsRUFBRSxPQUFPO0NBQ2xDLE1BQU0sRUFBRSxRQUFRO0NBQ2hCLFNBQVMsRUFBRSxNQUFNLGFBQWE7Q0FDOUIsY0FBYztDQUNkLFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVTtDQUNoQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDNUIsT0FBTyxFQUFFLE9BQU87RUFDZCxjQUFjLEVBQUUsUUFBUTtFQUN4QixlQUFlLEVBQUUsUUFBUTtFQUN6Qiw2QkFBNkIsRUFBRSxRQUFRO0VBQ3ZDLHlCQUF5QixFQUFFLFFBQVE7RUFDcEMsQ0FBQztDQUNGLFlBQVksRUFBRSxRQUFRO0NBQ3RCLFFBQVEsRUFBRSxRQUFRO0NBQ2xCLFNBQVMsRUFBRSxRQUFRO0NBQ25CLFlBQVksZ0JBQWdCLFVBQVU7Q0FDdkMsQ0FBQztBQUtGLE1BQWEsZUFBZSxFQUFFLE9BQU87Q0FDbkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUM7Q0FDckMsVUFBVSxFQUFFLE9BQU87RUFDakIsWUFBWSxFQUFFLFFBQVE7RUFDdEIsVUFBVSxFQUFFLFFBQVE7RUFDcEIsT0FBTyxFQUFFLFFBQVE7RUFDbEIsQ0FBQztDQUNGLE1BQU0sRUFBRSxPQUFPO0VBQ2IsTUFBTSxFQUFFLFFBQVE7RUFDaEIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVO0VBQzVCLFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVTtFQUNoQyxjQUFjO0VBQ2QsT0FBTyxFQUFFLE9BQU87R0FDZCxjQUFjLEVBQUUsUUFBUTtHQUN4QixlQUFlLEVBQUUsUUFBUTtHQUN6Qiw2QkFBNkIsRUFBRSxRQUFRO0dBQ3ZDLHlCQUF5QixFQUFFLFFBQVE7R0FDcEMsQ0FBQztFQUNGLFlBQVksRUFBRSxRQUFRO0VBQ3RCLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLFNBQVMsRUFBRSxRQUFRO0VBQ25CLFNBQVMsRUFBRSxNQUFNLGFBQWE7RUFDOUIsWUFBWSxnQkFBZ0IsVUFBVTtFQUN2QyxDQUFDO0NBQ0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUM7Q0FDekMsQ0FBQztBQUtGLE1BQWEsaUJBQWlCLEVBQUUsT0FBTztDQUNyQyxZQUFZLEVBQUUsUUFBUTtDQUN0QixjQUFjLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDbkMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQ2hDLFFBQVEsRUFBRSxRQUFRLENBQUMsVUFBVTtDQUM3QixhQUFhLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDbEMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQy9CLENBQUM7QUFHRixNQUFhLGtCQUFrQixFQUFFLE9BQU87Q0FDdEMsY0FBYyxFQUFFLFFBQVE7Q0FDeEIsV0FBVyxFQUFFLFFBQVE7Q0FDckIsTUFBTSxFQUFFLEtBQUssQ0FBQyxZQUFZLFlBQVksQ0FBQztDQUN2QyxhQUFhLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDbEMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQ25DLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQ3RDLHFCQUFxQixFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQzFDLFlBQVksRUFBRSxRQUFRLENBQUMsVUFBVTtDQUNqQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxVQUFVO0NBQ3hDLGNBQWMsRUFBRSxRQUFRLENBQUMsVUFBVTtDQUNuQyxlQUFlLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDcEMsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDdEMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQ3BDLFlBQVksRUFBRSxRQUFRLENBQUMsVUFBVTtDQUNqQyxVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDL0IsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQy9CLFlBQVksRUFBRSxRQUFRLENBQUMsVUFBVTtDQUNqQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsVUFBVTtDQUNyQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDN0IsQ0FBQztBQUdGLE1BQWEsaUJBQWlCLEVBQUUsT0FBTztDQUNyQyxjQUFjLEVBQUUsUUFBUTtDQUN4QixRQUFRLEVBQUUsS0FBSztFQUFDO0VBQWE7RUFBUztFQUFVLENBQUM7Q0FDakQsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQy9CLFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVTtDQUNoQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsVUFBVTtDQUN2QyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsVUFBVTtDQUN4QyxzQkFBc0IsRUFBRSxRQUFRLENBQUMsVUFBVTtDQUMzQywwQkFBMEIsRUFBRSxRQUFRLENBQUMsVUFBVTtDQUMvQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsVUFBVTtDQUN0QyxTQUFTLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDOUIsY0FBYyxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQ3BDLENBQUM7QUFLRixNQUFhLGdCQUFnQixFQUFFLE9BQU87Q0FDcEMsT0FBTyxFQUFFLFFBQVE7Q0FDakIsTUFBTSxFQUFFLFFBQVE7Q0FDakIsQ0FBQztBQUdGLE1BQWEsbUJBQW1CLEVBQUUsT0FBTyxFQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUNsQixDQUFDO0FBR0YsTUFBYSxhQUFhLEVBQUUsT0FBTztDQUNqQyxPQUFPLEVBQUUsUUFBUTtDQUNqQixNQUFNLEVBQUUsUUFBUTtDQUNoQixVQUFVLEVBQUUsUUFBUTtDQUNwQixVQUFVLEVBQUUsUUFBUTtDQUNyQixDQUFDO0FBS0YsTUFBYSxtQkFBbUIsRUFBRSxPQUFPLEVBQ3ZDLFNBQVMsRUFBRSxRQUFRLEVBQ3BCLENBQUM7QUFHRixNQUFNLGFBQWEsRUFDaEIsT0FBTztDQUNOLGFBQWEsRUFBRSxRQUFRLENBQUMsVUFBVTtDQUNsQyxVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDaEMsQ0FBQyxDQUNELFVBQVU7QUFFYixNQUFhLGdCQUFnQixFQUFFLE9BQU87Q0FDcEMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQzVCLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVTtDQUMvQixVQUFVLFdBQVcsVUFBVTtDQUMvQixVQUFVLFdBQVcsVUFBVTtDQUNoQyxDQUFDO0FBS0YsTUFBYSxtQkFBbUIsRUFBRSxPQUFPO0NBQ3ZDLFdBQVcsRUFBRSxTQUFTO0NBQ3RCLGFBQWEsRUFBRSxNQUFNLENBQUMsVUFBVTtDQUNoQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsVUFBVTtDQUNwQyxTQUFTLEVBQUUsUUFBUTtDQUNwQixDQUFDO0FBR0YsTUFBYSxpQkFBaUIsRUFBRSxPQUFPO0NBQ3JDLFFBQVEsRUFBRSxRQUFRO0NBQ2xCLGNBQWMsRUFBRSxRQUFRO0NBQ3hCLFlBQVksaUJBQWlCLFVBQVU7Q0FDeEMsQ0FBQztBQUtGLElBQWEsYUFBYixjQUFnQyxNQUFNO0NBQ3BDLE9BQWdCOztBQUVsQixJQUFhLDhCQUFiLGNBQWlELE1BQU07Q0FDckQsT0FBZ0I7O0FBRWxCLElBQWEsZUFBYixjQUFrQyxNQUFNO0NBQ3RDLE9BQWdCOztBQUVsQixJQUFhLGVBQWIsY0FBa0MsTUFBTTtDQUN0QyxPQUFnQjs7QUFLbEIsU0FBZ0IsVUFBVSxPQUF1QjtBQUMvQyxRQUFPLE1BQU0sU0FBUyxJQUFJLE1BQU0sTUFBTSxNQUFNLEdBQUcsS0FBSyJ9
|
|
@@ -141,15 +141,15 @@ var TokenSubscriber = class {
|
|
|
141
141
|
this.dispatcher.upsertCache(payload.id, row);
|
|
142
142
|
if (row.provider === "openai") {
|
|
143
143
|
const creds = row.credentials;
|
|
144
|
-
|
|
144
|
+
const openaiDispatcher = this.dispatcher.openaiDispatcher;
|
|
145
|
+
if (payload.op === "INSERT" && row.active) openaiDispatcher?.onTokenAdded(payload.id, row.name, creds, row.quota_threshold).catch((e) => logger.warn(`openai worker spawn failed: ${e.message}`));
|
|
145
146
|
else if (row.active) {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
} else this.dispatcher.openaiDispatcher?.onTokenDeactivated(payload.id);
|
|
147
|
+
if (openaiDispatcher) openaiDispatcher.onTokenUpdated(payload.id, row.name, creds, row.quota_threshold).then(() => openaiDispatcher.onTokenActivated(payload.id)).catch((e) => logger.warn(`openai worker update failed: ${e.message}`));
|
|
148
|
+
} else openaiDispatcher?.onTokenDeactivated(payload.id);
|
|
149
149
|
} else if (row.provider === "anthropic") {
|
|
150
150
|
const creds = row.credentials;
|
|
151
|
-
if (payload.op === "INSERT" && row.active) this.dispatcher.anthropicDispatcher?.onTokenAdded(payload.id, row.name, creds);
|
|
152
|
-
else if (row.active) this.dispatcher.anthropicDispatcher?.onTokenUpdated(payload.id, row.name, creds);
|
|
151
|
+
if (payload.op === "INSERT" && row.active) this.dispatcher.anthropicDispatcher?.onTokenAdded(payload.id, row.name, creds, row.quota_threshold);
|
|
152
|
+
else if (row.active) this.dispatcher.anthropicDispatcher?.onTokenUpdated(payload.id, row.name, creds, row.quota_threshold);
|
|
153
153
|
else this.dispatcher.anthropicDispatcher?.onTokenRemoved(payload.id);
|
|
154
154
|
}
|
|
155
155
|
logger.info(`NOTIFY ${payload.op} id=${payload.id} (${row.name}) active=${row.active}`);
|
|
@@ -160,13 +160,21 @@ var TokenSubscriber = class {
|
|
|
160
160
|
const anthropicRows = rows.filter((r) => r.provider === "anthropic").map((r) => ({
|
|
161
161
|
id: r.id,
|
|
162
162
|
name: r.name,
|
|
163
|
-
credentials: r.credentials
|
|
163
|
+
credentials: r.credentials,
|
|
164
|
+
quotaThreshold: r.quota_threshold
|
|
164
165
|
}));
|
|
165
166
|
this.dispatcher.anthropicDispatcher?.replaceTokens(anthropicRows);
|
|
167
|
+
const openaiRows = rows.filter((r) => r.provider === "openai").map((r) => ({
|
|
168
|
+
id: r.id,
|
|
169
|
+
name: r.name,
|
|
170
|
+
credentials: r.credentials,
|
|
171
|
+
quotaThreshold: r.quota_threshold
|
|
172
|
+
}));
|
|
173
|
+
await this.dispatcher.openaiDispatcher?.replaceTokens(openaiRows).catch((e) => logger.warn(`openai reconcile failed: ${e.message}`));
|
|
166
174
|
this.lastReconcileAt = /* @__PURE__ */ new Date();
|
|
167
175
|
}
|
|
168
176
|
};
|
|
169
177
|
//#endregion
|
|
170
178
|
export { TokenSubscriber };
|
|
171
179
|
|
|
172
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tc3Vic2NyaWJlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tc3Vic2NyaWJlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogdG9rZW5zX2NoYW5nZWQgTElTVEVOIHN1YnNjcmliZXIuICovXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgQ2xpZW50LCB0eXBlIENsaWVudENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0NyZWRlbnRpYWxzLCB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFFncmlkRGlzcGF0Y2hlckNsYXNzIH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBTdWJzY3JpYmVyU3RhdHVzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3Vic2NyaWJlclwiXSk7XG5cbmNvbnN0IFRPS0VOU19DSEFOR0VEID0gXCJ0b2tlbnNfY2hhbmdlZFwiO1xuY29uc3QgUkVDT05DSUxFX0lOVEVSVkFMX01TID0gMTAgKiA2MCAqIDEwMDA7XG5jb25zdCBDT05ORUNUSU9OX1RJTUVPVVRfTVMgPSA1XzAwMDtcbmNvbnN0IEJBQ0tPRkZfQkFTRV9NUyA9IDUwMDtcbmNvbnN0IEJBQ0tPRkZfQ0FQX01TID0gMzBfMDAwO1xuXG50eXBlIFBheWxvYWQgPSB7IG9wOiBcIklOU0VSVFwiIHwgXCJVUERBVEVcIiB8IFwiREVMRVRFXCI7IGlkOiBudW1iZXIgfTtcblxuZXhwb3J0IGNsYXNzIFRva2VuU3Vic2NyaWJlciB7XG4gIGNsaWVudDogQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHJlY29uY2lsZVRpbWVyOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICByZWNvbm5lY3RUaW1lcjogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgc2h1dGRvd25SZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgYXR0ZW1wdCA9IDA7XG4gIGNvbm5lY3RlZEF0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIGxhc3RSZWNvbmNpbGVBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb25uQ29uZmlnOiBDbGllbnRDb25maWcsXG4gICAgcHVibGljIGRpc3BhdGNoZXI6IFFncmlkRGlzcGF0Y2hlckNsYXNzLFxuICApIHt9XG5cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5zaHV0ZG93blJlcXVlc3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuZW5zdXJlUmVjb25jaWxlVGltZXIoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3RBbmRSZWNvbmNpbGUoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBzdWJzY3JpYmVyIHN0YXJ0IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX0sIHNjaGVkdWxpbmcgcmV0cnlgKTtcbiAgICAgIHRoaXMucmV0cnlMYXRlcigpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zaHV0ZG93blJlcXVlc3RlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMucmVjb25jaWxlVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5yZWNvbmNpbGVUaW1lcik7XG4gICAgICB0aGlzLnJlY29uY2lsZVRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVjb25uZWN0VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlY29ubmVjdFRpbWVyKTtcbiAgICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBudWxsO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNsb3NlQ2xpZW50KCk7XG4gIH1cblxuICBzdGF0dXMoKTogU3Vic2NyaWJlclN0YXR1cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbm5lY3RlZDogdGhpcy5jbGllbnQgIT09IG51bGwgJiYgdGhpcy5yZWNvbm5lY3RUaW1lciA9PT0gbnVsbCxcbiAgICAgIGNvbm5lY3RlZEF0OiB0aGlzLmNvbm5lY3RlZEF0LFxuICAgICAgbGFzdFJlY29uY2lsZUF0OiB0aGlzLmxhc3RSZWNvbmNpbGVBdCxcbiAgICAgIGF0dGVtcHQ6IHRoaXMuYXR0ZW1wdCxcbiAgICB9O1xuICB9XG5cbiAgZW5zdXJlUmVjb25jaWxlVGltZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjb25jaWxlVGltZXIpIHJldHVybjtcblxuICAgIC8vIExJU1RFTi9OT1RJRlkg64qUIOuBiuq4tCDrj5nslYgg7Jyg7Iuk65CgIOyImCDsnojslrQg7KO86riw7KCB7Jy866GcIERCIOq4sOykgOycvOuhnCDrp57stpjri6QuXG4gICAgdGhpcy5yZWNvbmNpbGVUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMucmVjb25jaWxlKCkuY2F0Y2goKGUpID0+XG4gICAgICAgIGxvZ2dlci53YXJuKGBwZXJpb2RpYyByZWNvbmNpbGUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApLFxuICAgICAgKTtcbiAgICB9LCBSRUNPTkNJTEVfSU5URVJWQUxfTVMpO1xuICB9XG5cbiAgYXN5bmMgY29ubmVjdEFuZFJlY29uY2lsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNvbm5lY3RBbmRMaXN0ZW4oKTtcbiAgICBhd2FpdCB0aGlzLnJlY29uY2lsZSgpO1xuICAgIHRoaXMuYXR0ZW1wdCA9IDA7XG4gIH1cblxuICBhc3luYyBjb25uZWN0QW5kTGlzdGVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBDbGllbnQoe1xuICAgICAgLi4udGhpcy5jb25uQ29uZmlnLFxuICAgICAgY29ubmVjdGlvblRpbWVvdXRNaWxsaXM6IENPTk5FQ1RJT05fVElNRU9VVF9NUyxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgIGtlZXBBbGl2ZUluaXRpYWxEZWxheU1pbGxpczogMTBfMDAwLFxuICAgICAgYXBwbGljYXRpb25fbmFtZTogXCJxZ3JpZC1saXN0ZW5lclwiLFxuICAgIH0pO1xuXG4gICAgY2xpZW50Lm9uKFwiZXJyb3JcIiwgKGUpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKGBzdWJzY3JpYmVyIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIHRoaXMucmV0cnlMYXRlcigpO1xuICAgIH0pO1xuICAgIGNsaWVudC5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuc2h1dGRvd25SZXF1ZXN0ZWQpIHRoaXMucmV0cnlMYXRlcigpO1xuICAgIH0pO1xuICAgIGNsaWVudC5vbihcIm5vdGlmaWNhdGlvblwiLCAobXNnKSA9PiB7XG4gICAgICBpZiAobXNnLmNoYW5uZWwgIT09IFRPS0VOU19DSEFOR0VEIHx8ICFtc2cucGF5bG9hZCkgcmV0dXJuO1xuICAgICAgdGhpcy5oYW5kbGVOb3RpZmljYXRpb24obXNnLnBheWxvYWQpLmNhdGNoKChlKSA9PlxuICAgICAgICBsb2dnZXIud2FybihgaGFuZGxlIE5PVElGWSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNsaWVudC5jb25uZWN0KCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXCJTRVQgc3RhdGVtZW50X3RpbWVvdXQgPSAwXCIpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiU0VUIGlkbGVfaW5fdHJhbnNhY3Rpb25fc2Vzc2lvbl90aW1lb3V0ID0gMFwiKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgTElTVEVOICR7Y2xpZW50LmVzY2FwZUlkZW50aWZpZXIoVE9LRU5TX0NIQU5HRUQpfWApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNsaWVudC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgIGF3YWl0IGNsaWVudC5lbmQoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuY29ubmVjdGVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgIGxvZ2dlci5pbmZvKGBzdWJzY3JpYmVkIHRvICR7VE9LRU5TX0NIQU5HRUR9YCk7XG4gIH1cblxuICByZXRyeUxhdGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNodXRkb3duUmVxdWVzdGVkKSByZXR1cm47XG4gICAgaWYgKHRoaXMucmVjb25uZWN0VGltZXIpIHJldHVybjtcblxuICAgIHZvaWQgdGhpcy5jbG9zZUNsaWVudCgpO1xuICAgIHRoaXMuYXR0ZW1wdCArPSAxO1xuICAgIGNvbnN0IGNhcCA9IE1hdGgubWluKEJBQ0tPRkZfQkFTRV9NUyAqIDIgKiogdGhpcy5hdHRlbXB0LCBCQUNLT0ZGX0NBUF9NUyk7XG4gICAgY29uc3QgZGVsYXkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjYXApO1xuICAgIGxvZ2dlci5pbmZvKGByZWNvbm5lY3RpbmcgaW4gJHtkZWxheX1tcyAoYXR0ZW1wdCAke3RoaXMuYXR0ZW1wdH0pYCk7XG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IG51bGw7XG4gICAgICB0aGlzLmNvbm5lY3RBbmRSZWNvbmNpbGUoKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICBsb2dnZXIud2Fybihgc3Vic2NyaWJlciByZWNvbm5lY3QgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB0aGlzLnJldHJ5TGF0ZXIoKTtcbiAgICAgIH0pO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxuXG4gIGFzeW5jIGNsb3NlQ2xpZW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50O1xuICAgIGlmICghY2xpZW50KSByZXR1cm47XG5cbiAgICB0aGlzLmNsaWVudCA9IG51bGw7XG4gICAgY2xpZW50LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIGF3YWl0IGNsaWVudC5lbmQoKS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVOb3RpZmljYXRpb24ocGF5bG9hZEpzb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnBhcnNlKHBheWxvYWRKc29uKSBhcyBQYXlsb2FkO1xuICAgIGlmIChwYXlsb2FkLm9wID09PSBcIkRFTEVURVwiKSB7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIucmVtb3ZlQ2FjaGUocGF5bG9hZC5pZCk7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICA/Lm9uVG9rZW5SZW1vdmVkKHBheWxvYWQuaWQpXG4gICAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYG9wZW5haSB3b3JrZXIgcmVtb3ZlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICAvLyBhbnRocm9waWMg7Yag7YGwIOydtOuypO2KuOuKlCDrj5nquLAodm9pZCkg4oCUIHByb3ZpZGVyIOulvCDrqqjrpbTrr4DroZwg66y07ZW07ZWY6rKMIO2VreyDgSDsoJzqsbAg7Iuc64+ELlxuICAgICAgdGhpcy5kaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/Lm9uVG9rZW5SZW1vdmVkKHBheWxvYWQuaWQpO1xuICAgICAgbG9nZ2VyLmluZm8oYE5PVElGWSAke3BheWxvYWQub3B9IGlkPSR7cGF5bG9hZC5pZH0g4oaSIHJlbW92ZWQgZnJvbSBjYWNoZWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByb3cgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRPbmUoXCJBXCIsIHsgaWQ6IHBheWxvYWQuaWQgfSk7XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5yZW1vdmVDYWNoZShwYXlsb2FkLmlkKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyXG4gICAgICAgID8ub25Ub2tlblJlbW92ZWQocGF5bG9hZC5pZClcbiAgICAgICAgLmNhdGNoKChlKSA9PiBsb2dnZXIud2Fybihgb3BlbmFpIHdvcmtlciByZW1vdmUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBOT1RJRlkgJHtwYXlsb2FkLm9wfSBpZD0ke3BheWxvYWQuaWR9IOKGkiBtaXNzaW5nLCByZW1vdmVkIGZyb20gY2FjaGVgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoZXIudXBzZXJ0Q2FjaGUocGF5bG9hZC5pZCwgcm93KTtcblxuICAgIGlmIChyb3cucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGNvbnN0IGNyZWRzID0gcm93LmNyZWRlbnRpYWxzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgaWYgKHBheWxvYWQub3AgPT09IFwiSU5TRVJUXCIpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXJcbiAgICAgICAgICA/Lm9uVG9rZW5BZGRlZChwYXlsb2FkLmlkLCByb3cubmFtZSwgY3JlZHMgYXMgT3BlbkFJQ3JlZGVudGlhbHMpXG4gICAgICAgICAgLmNhdGNoKChlKSA9PiBsb2dnZXIud2Fybihgb3BlbmFpIHdvcmtlciBzcGF3biBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgICAgfSBlbHNlIGlmIChyb3cuYWN0aXZlKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy5vblRva2VuQWN0aXZhdGVkKHBheWxvYWQuaWQpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICAgID8ub25Ub2tlblVwZGF0ZWQocGF5bG9hZC5pZCwgcm93Lm5hbWUsIGNyZWRzIGFzIE9wZW5BSUNyZWRlbnRpYWxzKVxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYG9wZW5haSB3b3JrZXIgdXBkYXRlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8ub25Ub2tlbkRlYWN0aXZhdGVkKHBheWxvYWQuaWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocm93LnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICAvLyBhbnRocm9waWMg7Yag7YGwIOydtOuypO2KuOuKlCDrj5nquLAodm9pZCkuIHdvcmtlciDqsIAg7JeG6rOgIO2SgChNYXAp66eMIOq0gOumrO2VmOuvgOuhnCDri6jsiJw6XG4gICAgICAvLyAgSU5TRVJUIOKGkiDstpTqsIAsIGFjdGl2ZSDrqbQg6rCx7IugKG9uVG9rZW5VcGRhdGVkIOqwgCBpZGVudGl0eSDrs4Dqsr3rj4Qg7LKY66asKSwgaW5hY3RpdmUg66m0IO2SgOyXkOyEnCDsoJzqsbAuXG4gICAgICAvLyAgKOuzhOuPhCBhY3RpdmF0ZS9kZWFjdGl2YXRlIOy9nOuwseydtCDsl4bslrQgYWN0aXZlIO2GoOq4gOydhCBhZGQvcmVtb3ZlIOuhnCDrp6TtlZEuKVxuICAgICAgY29uc3QgY3JlZHMgPSByb3cuY3JlZGVudGlhbHMgYXMgQW50aHJvcGljQ3JlZGVudGlhbHM7XG4gICAgICBpZiAocGF5bG9hZC5vcCA9PT0gXCJJTlNFUlRcIiAmJiByb3cuYWN0aXZlKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuQWRkZWQocGF5bG9hZC5pZCwgcm93Lm5hbWUsIGNyZWRzKTtcbiAgICAgIH0gZWxzZSBpZiAocm93LmFjdGl2ZSkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8ub25Ub2tlblVwZGF0ZWQocGF5bG9hZC5pZCwgcm93Lm5hbWUsIGNyZWRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGluYWN0aXZlIOuptCBJTlNFUlQg65OgIFVQREFURSDrk6Ag7ZKA7JeQIOuEo+yngCDslYrripTri6QuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nZ2VyLmluZm8oYE5PVElGWSAke3BheWxvYWQub3B9IGlkPSR7cGF5bG9hZC5pZH0gKCR7cm93Lm5hbWV9KSBhY3RpdmU9JHtyb3cuYWN0aXZlfWApO1xuICB9XG5cbiAgYXN5bmMgcmVjb25jaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRBY3RpdmUoXCJBXCIpO1xuICAgIHRoaXMuZGlzcGF0Y2hlci5yZXBsYWNlQ2FjaGUocm93cyk7XG4gICAgLy8gTk9USUZZIOycoOyLpCDrjIDruYQ6IEFudGhyb3BpY0Rpc3BhdGNoZXIg7ZKA64+EIERCIGFjdGl2ZSBhbnRocm9waWMg7Yag7YGwIOq4sOykgOycvOuhnCDsnqzrj5nquLDtmZQuXG4gICAgLy8gKHJvd3Mg64qUIGFjdGl2ZSDrp4wg4oCUIGluYWN0aXZlL+yCreygnOuQnCDthqDtgbDsnYAg7Jes6riwIOyXhuycvOuvgOuhnCByZXBsYWNlVG9rZW5zIOqwgCDtkoDsl5DshJwg7KCc6rGw7ZWc64ukLilcbiAgICBjb25zdCBhbnRocm9waWNSb3dzID0gcm93c1xuICAgICAgLmZpbHRlcigocikgPT4gci5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIilcbiAgICAgIC5tYXAoKHIpID0+ICh7IGlkOiByLmlkLCBuYW1lOiByLm5hbWUsIGNyZWRlbnRpYWxzOiByLmNyZWRlbnRpYWxzIGFzIEFudGhyb3BpY0NyZWRlbnRpYWxzIH0pKTtcbiAgICB0aGlzLmRpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8ucmVwbGFjZVRva2VucyhhbnRocm9waWNSb3dzKTtcbiAgICB0aGlzLmxhc3RSZWNvbmNpbGVBdCA9IG5ldyBEYXRlKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBU0EsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLGFBQWEsQ0FBQztBQUVqRCxNQUFNLGlCQUFpQjtBQUN2QixNQUFNLHdCQUF3QixNQUFVO0FBQ3hDLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0saUJBQWlCO0FBSXZCLElBQWEsa0JBQWIsTUFBNkI7Q0FDM0IsU0FBd0I7Q0FDeEIsaUJBQXdDO0NBQ3hDLGlCQUF3QztDQUN4QyxvQkFBb0I7Q0FDcEIsVUFBVTtDQUNWLGNBQTJCO0NBQzNCLGtCQUErQjtDQUUvQixZQUNFLFlBQ0EsWUFDQTtBQUZPLE9BQUEsYUFBQTtBQUNBLE9BQUEsYUFBQTs7Q0FHVCxNQUFNLFFBQTBCO0FBQzlCLE9BQUssb0JBQW9CO0FBQ3pCLE9BQUssc0JBQXNCO0FBRTNCLE1BQUk7QUFDRixTQUFNLEtBQUsscUJBQXFCO0FBQ2hDLFVBQU87V0FDQSxHQUFHO0FBQ1YsVUFBTyxLQUFLLDRCQUE2QixFQUFZLFFBQVEsb0JBQW9CO0FBQ2pGLFFBQUssWUFBWTtB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
|
|
180
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tc3Vic2NyaWJlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tc3Vic2NyaWJlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogdG9rZW5zX2NoYW5nZWQgTElTVEVOIHN1YnNjcmliZXIuICovXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgQ2xpZW50LCB0eXBlIENsaWVudENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0NyZWRlbnRpYWxzLCB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFFncmlkRGlzcGF0Y2hlckNsYXNzIH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBTdWJzY3JpYmVyU3RhdHVzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3Vic2NyaWJlclwiXSk7XG5cbmNvbnN0IFRPS0VOU19DSEFOR0VEID0gXCJ0b2tlbnNfY2hhbmdlZFwiO1xuY29uc3QgUkVDT05DSUxFX0lOVEVSVkFMX01TID0gMTAgKiA2MCAqIDEwMDA7XG5jb25zdCBDT05ORUNUSU9OX1RJTUVPVVRfTVMgPSA1XzAwMDtcbmNvbnN0IEJBQ0tPRkZfQkFTRV9NUyA9IDUwMDtcbmNvbnN0IEJBQ0tPRkZfQ0FQX01TID0gMzBfMDAwO1xuXG50eXBlIFBheWxvYWQgPSB7IG9wOiBcIklOU0VSVFwiIHwgXCJVUERBVEVcIiB8IFwiREVMRVRFXCI7IGlkOiBudW1iZXIgfTtcblxuZXhwb3J0IGNsYXNzIFRva2VuU3Vic2NyaWJlciB7XG4gIGNsaWVudDogQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHJlY29uY2lsZVRpbWVyOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICByZWNvbm5lY3RUaW1lcjogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgc2h1dGRvd25SZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgYXR0ZW1wdCA9IDA7XG4gIGNvbm5lY3RlZEF0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIGxhc3RSZWNvbmNpbGVBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb25uQ29uZmlnOiBDbGllbnRDb25maWcsXG4gICAgcHVibGljIGRpc3BhdGNoZXI6IFFncmlkRGlzcGF0Y2hlckNsYXNzLFxuICApIHt9XG5cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5zaHV0ZG93blJlcXVlc3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuZW5zdXJlUmVjb25jaWxlVGltZXIoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3RBbmRSZWNvbmNpbGUoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBzdWJzY3JpYmVyIHN0YXJ0IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX0sIHNjaGVkdWxpbmcgcmV0cnlgKTtcbiAgICAgIHRoaXMucmV0cnlMYXRlcigpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zaHV0ZG93blJlcXVlc3RlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMucmVjb25jaWxlVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5yZWNvbmNpbGVUaW1lcik7XG4gICAgICB0aGlzLnJlY29uY2lsZVRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVjb25uZWN0VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlY29ubmVjdFRpbWVyKTtcbiAgICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBudWxsO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNsb3NlQ2xpZW50KCk7XG4gIH1cblxuICBzdGF0dXMoKTogU3Vic2NyaWJlclN0YXR1cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbm5lY3RlZDogdGhpcy5jbGllbnQgIT09IG51bGwgJiYgdGhpcy5yZWNvbm5lY3RUaW1lciA9PT0gbnVsbCxcbiAgICAgIGNvbm5lY3RlZEF0OiB0aGlzLmNvbm5lY3RlZEF0LFxuICAgICAgbGFzdFJlY29uY2lsZUF0OiB0aGlzLmxhc3RSZWNvbmNpbGVBdCxcbiAgICAgIGF0dGVtcHQ6IHRoaXMuYXR0ZW1wdCxcbiAgICB9O1xuICB9XG5cbiAgZW5zdXJlUmVjb25jaWxlVGltZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjb25jaWxlVGltZXIpIHJldHVybjtcblxuICAgIC8vIExJU1RFTi9OT1RJRlkg64qUIOuBiuq4tCDrj5nslYgg7Jyg7Iuk65CgIOyImCDsnojslrQg7KO86riw7KCB7Jy866GcIERCIOq4sOykgOycvOuhnCDrp57stpjri6QuXG4gICAgdGhpcy5yZWNvbmNpbGVUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMucmVjb25jaWxlKCkuY2F0Y2goKGUpID0+XG4gICAgICAgIGxvZ2dlci53YXJuKGBwZXJpb2RpYyByZWNvbmNpbGUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApLFxuICAgICAgKTtcbiAgICB9LCBSRUNPTkNJTEVfSU5URVJWQUxfTVMpO1xuICB9XG5cbiAgYXN5bmMgY29ubmVjdEFuZFJlY29uY2lsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNvbm5lY3RBbmRMaXN0ZW4oKTtcbiAgICBhd2FpdCB0aGlzLnJlY29uY2lsZSgpO1xuICAgIHRoaXMuYXR0ZW1wdCA9IDA7XG4gIH1cblxuICBhc3luYyBjb25uZWN0QW5kTGlzdGVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBDbGllbnQoe1xuICAgICAgLi4udGhpcy5jb25uQ29uZmlnLFxuICAgICAgY29ubmVjdGlvblRpbWVvdXRNaWxsaXM6IENPTk5FQ1RJT05fVElNRU9VVF9NUyxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgIGtlZXBBbGl2ZUluaXRpYWxEZWxheU1pbGxpczogMTBfMDAwLFxuICAgICAgYXBwbGljYXRpb25fbmFtZTogXCJxZ3JpZC1saXN0ZW5lclwiLFxuICAgIH0pO1xuXG4gICAgY2xpZW50Lm9uKFwiZXJyb3JcIiwgKGUpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKGBzdWJzY3JpYmVyIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIHRoaXMucmV0cnlMYXRlcigpO1xuICAgIH0pO1xuICAgIGNsaWVudC5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuc2h1dGRvd25SZXF1ZXN0ZWQpIHRoaXMucmV0cnlMYXRlcigpO1xuICAgIH0pO1xuICAgIGNsaWVudC5vbihcIm5vdGlmaWNhdGlvblwiLCAobXNnKSA9PiB7XG4gICAgICBpZiAobXNnLmNoYW5uZWwgIT09IFRPS0VOU19DSEFOR0VEIHx8ICFtc2cucGF5bG9hZCkgcmV0dXJuO1xuICAgICAgdGhpcy5oYW5kbGVOb3RpZmljYXRpb24obXNnLnBheWxvYWQpLmNhdGNoKChlKSA9PlxuICAgICAgICBsb2dnZXIud2FybihgaGFuZGxlIE5PVElGWSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNsaWVudC5jb25uZWN0KCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXCJTRVQgc3RhdGVtZW50X3RpbWVvdXQgPSAwXCIpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiU0VUIGlkbGVfaW5fdHJhbnNhY3Rpb25fc2Vzc2lvbl90aW1lb3V0ID0gMFwiKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgTElTVEVOICR7Y2xpZW50LmVzY2FwZUlkZW50aWZpZXIoVE9LRU5TX0NIQU5HRUQpfWApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNsaWVudC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgIGF3YWl0IGNsaWVudC5lbmQoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuY29ubmVjdGVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgIGxvZ2dlci5pbmZvKGBzdWJzY3JpYmVkIHRvICR7VE9LRU5TX0NIQU5HRUR9YCk7XG4gIH1cblxuICByZXRyeUxhdGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNodXRkb3duUmVxdWVzdGVkKSByZXR1cm47XG4gICAgaWYgKHRoaXMucmVjb25uZWN0VGltZXIpIHJldHVybjtcblxuICAgIHZvaWQgdGhpcy5jbG9zZUNsaWVudCgpO1xuICAgIHRoaXMuYXR0ZW1wdCArPSAxO1xuICAgIGNvbnN0IGNhcCA9IE1hdGgubWluKEJBQ0tPRkZfQkFTRV9NUyAqIDIgKiogdGhpcy5hdHRlbXB0LCBCQUNLT0ZGX0NBUF9NUyk7XG4gICAgY29uc3QgZGVsYXkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjYXApO1xuICAgIGxvZ2dlci5pbmZvKGByZWNvbm5lY3RpbmcgaW4gJHtkZWxheX1tcyAoYXR0ZW1wdCAke3RoaXMuYXR0ZW1wdH0pYCk7XG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IG51bGw7XG4gICAgICB0aGlzLmNvbm5lY3RBbmRSZWNvbmNpbGUoKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICBsb2dnZXIud2Fybihgc3Vic2NyaWJlciByZWNvbm5lY3QgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB0aGlzLnJldHJ5TGF0ZXIoKTtcbiAgICAgIH0pO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxuXG4gIGFzeW5jIGNsb3NlQ2xpZW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50O1xuICAgIGlmICghY2xpZW50KSByZXR1cm47XG5cbiAgICB0aGlzLmNsaWVudCA9IG51bGw7XG4gICAgY2xpZW50LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIGF3YWl0IGNsaWVudC5lbmQoKS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVOb3RpZmljYXRpb24ocGF5bG9hZEpzb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnBhcnNlKHBheWxvYWRKc29uKSBhcyBQYXlsb2FkO1xuICAgIGlmIChwYXlsb2FkLm9wID09PSBcIkRFTEVURVwiKSB7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIucmVtb3ZlQ2FjaGUocGF5bG9hZC5pZCk7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICA/Lm9uVG9rZW5SZW1vdmVkKHBheWxvYWQuaWQpXG4gICAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYG9wZW5haSB3b3JrZXIgcmVtb3ZlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICAvLyBhbnRocm9waWMg7Yag7YGwIOydtOuypO2KuOuKlCDrj5nquLAodm9pZCkg4oCUIHByb3ZpZGVyIOulvCDrqqjrpbTrr4DroZwg66y07ZW07ZWY6rKMIO2VreyDgSDsoJzqsbAg7Iuc64+ELlxuICAgICAgdGhpcy5kaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/Lm9uVG9rZW5SZW1vdmVkKHBheWxvYWQuaWQpO1xuICAgICAgbG9nZ2VyLmluZm8oYE5PVElGWSAke3BheWxvYWQub3B9IGlkPSR7cGF5bG9hZC5pZH0g4oaSIHJlbW92ZWQgZnJvbSBjYWNoZWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByb3cgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRPbmUoXCJBXCIsIHsgaWQ6IHBheWxvYWQuaWQgfSk7XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5yZW1vdmVDYWNoZShwYXlsb2FkLmlkKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyXG4gICAgICAgID8ub25Ub2tlblJlbW92ZWQocGF5bG9hZC5pZClcbiAgICAgICAgLmNhdGNoKChlKSA9PiBsb2dnZXIud2Fybihgb3BlbmFpIHdvcmtlciByZW1vdmUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBOT1RJRlkgJHtwYXlsb2FkLm9wfSBpZD0ke3BheWxvYWQuaWR9IOKGkiBtaXNzaW5nLCByZW1vdmVkIGZyb20gY2FjaGVgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoZXIudXBzZXJ0Q2FjaGUocGF5bG9hZC5pZCwgcm93KTtcblxuICAgIGlmIChyb3cucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGNvbnN0IGNyZWRzID0gcm93LmNyZWRlbnRpYWxzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29uc3Qgb3BlbmFpRGlzcGF0Y2hlciA9IHRoaXMuZGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyO1xuICAgICAgaWYgKHBheWxvYWQub3AgPT09IFwiSU5TRVJUXCIgJiYgcm93LmFjdGl2ZSkge1xuICAgICAgICBvcGVuYWlEaXNwYXRjaGVyXG4gICAgICAgICAgPy5vblRva2VuQWRkZWQocGF5bG9hZC5pZCwgcm93Lm5hbWUsIGNyZWRzIGFzIE9wZW5BSUNyZWRlbnRpYWxzLCByb3cucXVvdGFfdGhyZXNob2xkKVxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYG9wZW5haSB3b3JrZXIgc3Bhd24gZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgICAgIH0gZWxzZSBpZiAocm93LmFjdGl2ZSkge1xuICAgICAgICBpZiAob3BlbmFpRGlzcGF0Y2hlcikge1xuICAgICAgICAgIG9wZW5haURpc3BhdGNoZXJcbiAgICAgICAgICAgIC5vblRva2VuVXBkYXRlZChwYXlsb2FkLmlkLCByb3cubmFtZSwgY3JlZHMgYXMgT3BlbkFJQ3JlZGVudGlhbHMsIHJvdy5xdW90YV90aHJlc2hvbGQpXG4gICAgICAgICAgICAudGhlbigoKSA9PiBvcGVuYWlEaXNwYXRjaGVyLm9uVG9rZW5BY3RpdmF0ZWQocGF5bG9hZC5pZCkpXG4gICAgICAgICAgICAuY2F0Y2goKGUpID0+IGxvZ2dlci53YXJuKGBvcGVuYWkgd29ya2VyIHVwZGF0ZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcGVuYWlEaXNwYXRjaGVyPy5vblRva2VuRGVhY3RpdmF0ZWQocGF5bG9hZC5pZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyb3cucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpIHtcbiAgICAgIC8vIGFudGhyb3BpYyDthqDtgbAg7J2067Kk7Yq464qUIOuPmeq4sCh2b2lkKS4gd29ya2VyIOqwgCDsl4bqs6Ag7ZKAKE1hcCnrp4wg6rSA66as7ZWY66+A66GcIOuLqOyInDpcbiAgICAgIC8vICBJTlNFUlQg4oaSIOy2lOqwgCwgYWN0aXZlIOuptCDqsLHsi6Aob25Ub2tlblVwZGF0ZWQg6rCAIGlkZW50aXR5IOuzgOqyveuPhCDsspjrpqwpLCBpbmFjdGl2ZSDrqbQg7ZKA7JeQ7IScIOygnOqxsC5cbiAgICAgIC8vICAo67OE64+EIGFjdGl2YXRlL2RlYWN0aXZhdGUg7L2c67Cx7J20IOyXhuyWtCBhY3RpdmUg7Yag6riA7J2EIGFkZC9yZW1vdmUg66GcIOunpO2VkS4pXG4gICAgICBjb25zdCBjcmVkcyA9IHJvdy5jcmVkZW50aWFscyBhcyBBbnRocm9waWNDcmVkZW50aWFscztcbiAgICAgIGlmIChwYXlsb2FkLm9wID09PSBcIklOU0VSVFwiICYmIHJvdy5hY3RpdmUpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/Lm9uVG9rZW5BZGRlZChcbiAgICAgICAgICBwYXlsb2FkLmlkLFxuICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgIGNyZWRzLFxuICAgICAgICAgIHJvdy5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHJvdy5hY3RpdmUpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/Lm9uVG9rZW5VcGRhdGVkKFxuICAgICAgICAgIHBheWxvYWQuaWQsXG4gICAgICAgICAgcm93Lm5hbWUsXG4gICAgICAgICAgY3JlZHMsXG4gICAgICAgICAgcm93LnF1b3RhX3RocmVzaG9sZCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGluYWN0aXZlIOuptCBJTlNFUlQg65OgIFVQREFURSDrk6Ag7ZKA7JeQIOuEo+yngCDslYrripTri6QuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nZ2VyLmluZm8oYE5PVElGWSAke3BheWxvYWQub3B9IGlkPSR7cGF5bG9hZC5pZH0gKCR7cm93Lm5hbWV9KSBhY3RpdmU9JHtyb3cuYWN0aXZlfWApO1xuICB9XG5cbiAgYXN5bmMgcmVjb25jaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRBY3RpdmUoXCJBXCIpO1xuICAgIHRoaXMuZGlzcGF0Y2hlci5yZXBsYWNlQ2FjaGUocm93cyk7XG4gICAgLy8gTk9USUZZIOycoOyLpCDrjIDruYQ6IEFudGhyb3BpY0Rpc3BhdGNoZXIg7ZKA64+EIERCIGFjdGl2ZSBhbnRocm9waWMg7Yag7YGwIOq4sOykgOycvOuhnCDsnqzrj5nquLDtmZQuXG4gICAgLy8gKHJvd3Mg64qUIGFjdGl2ZSDrp4wg4oCUIGluYWN0aXZlL+yCreygnOuQnCDthqDtgbDsnYAg7Jes6riwIOyXhuycvOuvgOuhnCByZXBsYWNlVG9rZW5zIOqwgCDtkoDsl5DshJwg7KCc6rGw7ZWc64ukLilcbiAgICBjb25zdCBhbnRocm9waWNSb3dzID0gcm93c1xuICAgICAgLmZpbHRlcigocikgPT4gci5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIilcbiAgICAgIC5tYXAoKHIpID0+ICh7XG4gICAgICAgIGlkOiByLmlkLFxuICAgICAgICBuYW1lOiByLm5hbWUsXG4gICAgICAgIGNyZWRlbnRpYWxzOiByLmNyZWRlbnRpYWxzIGFzIEFudGhyb3BpY0NyZWRlbnRpYWxzLFxuICAgICAgICBxdW90YVRocmVzaG9sZDogci5xdW90YV90aHJlc2hvbGQsXG4gICAgICB9KSk7XG4gICAgdGhpcy5kaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/LnJlcGxhY2VUb2tlbnMoYW50aHJvcGljUm93cyk7XG4gICAgY29uc3Qgb3BlbmFpUm93cyA9IHJvd3NcbiAgICAgIC5maWx0ZXIoKHIpID0+IHIucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpXG4gICAgICAubWFwKChyKSA9PiAoe1xuICAgICAgICBpZDogci5pZCxcbiAgICAgICAgbmFtZTogci5uYW1lLFxuICAgICAgICBjcmVkZW50aWFsczogci5jcmVkZW50aWFscyBhcyBPcGVuQUlDcmVkZW50aWFscyxcbiAgICAgICAgcXVvdGFUaHJlc2hvbGQ6IHIucXVvdGFfdGhyZXNob2xkLFxuICAgICAgfSkpO1xuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyXG4gICAgICA/LnJlcGxhY2VUb2tlbnMob3BlbmFpUm93cylcbiAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYG9wZW5haSByZWNvbmNpbGUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgICB0aGlzLmxhc3RSZWNvbmNpbGVBdCA9IG5ldyBEYXRlKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBU0EsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLGFBQWEsQ0FBQztBQUVqRCxNQUFNLGlCQUFpQjtBQUN2QixNQUFNLHdCQUF3QixNQUFVO0FBQ3hDLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0saUJBQWlCO0FBSXZCLElBQWEsa0JBQWIsTUFBNkI7Q0FDM0IsU0FBd0I7Q0FDeEIsaUJBQXdDO0NBQ3hDLGlCQUF3QztDQUN4QyxvQkFBb0I7Q0FDcEIsVUFBVTtDQUNWLGNBQTJCO0NBQzNCLGtCQUErQjtDQUUvQixZQUNFLFlBQ0EsWUFDQTtBQUZPLE9BQUEsYUFBQTtBQUNBLE9BQUEsYUFBQTs7Q0FHVCxNQUFNLFFBQTBCO0FBQzlCLE9BQUssb0JBQW9CO0FBQ3pCLE9BQUssc0JBQXNCO0FBRTNCLE1BQUk7QUFDRixTQUFNLEtBQUsscUJBQXFCO0FBQ2hDLFVBQU87V0FDQSxHQUFHO0FBQ1YsVUFBTyxLQUFLLDRCQUE2QixFQUFZLFFBQVEsb0JBQW9CO0FBQ2pGLFFBQUssWUFBWTtBQUNqQixVQUFPOzs7Q0FJWCxNQUFNLE9BQXNCO0FBQzFCLE9BQUssb0JBQW9CO0FBQ3pCLE1BQUksS0FBSyxnQkFBZ0I7QUFDdkIsaUJBQWMsS0FBSyxlQUFlO0FBQ2xDLFFBQUssaUJBQWlCOztBQUV4QixNQUFJLEtB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
|
|
@@ -37,7 +37,8 @@ const SETUP_SQL = `
|
|
|
37
37
|
OLD.active IS DISTINCT FROM NEW.active OR
|
|
38
38
|
OLD.credentials IS DISTINCT FROM NEW.credentials OR
|
|
39
39
|
OLD.provider IS DISTINCT FROM NEW.provider OR
|
|
40
|
-
OLD.name IS DISTINCT FROM NEW.name
|
|
40
|
+
OLD.name IS DISTINCT FROM NEW.name OR
|
|
41
|
+
OLD.quota_threshold IS DISTINCT FROM NEW.quota_threshold
|
|
41
42
|
)
|
|
42
43
|
EXECUTE FUNCTION public.tokens_notify();
|
|
43
44
|
`;
|
|
@@ -65,4 +66,4 @@ async function ensureTokensTrigger(connConfig) {
|
|
|
65
66
|
//#endregion
|
|
66
67
|
export { ensureTokensTrigger };
|
|
67
68
|
|
|
68
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
69
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tdHJpZ2dlci1zZXR1cC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tdHJpZ2dlci1zZXR1cC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogT25lLXRpbWUgc2V0dXAgZm9yIHB1YmxpYy50b2tlbnMgLT4gdG9rZW5zX2NoYW5nZWQgTk9USUZZIHRyaWdnZXJzLiAqL1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IENsaWVudCwgdHlwZSBDbGllbnRDb25maWcgfSBmcm9tIFwicGdcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidHJpZ2dlci1zZXR1cFwiXSk7XG5cbmNvbnN0IENPTk5FQ1RJT05fVElNRU9VVF9NUyA9IDVfMDAwO1xuY29uc3QgU0VUVVBfTE9DS19USU1FT1VUX01TID0gM18wMDA7XG5jb25zdCBTRVRVUF9TVEFURU1FTlRfVElNRU9VVF9NUyA9IDEwXzAwMDtcblxuY29uc3QgQURWSVNPUllfTE9DS19DTEFTU19JRCA9IDcxNztcbmNvbnN0IEFEVklTT1JZX0xPQ0tfT0JKRUNUX0lEID0gNDQ5MDA7XG5cbmNvbnN0IFNFVFVQX1NRTCA9IGBcbiAgQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gcHVibGljLnRva2Vuc19ub3RpZnkoKSBSRVRVUk5TIHRyaWdnZXJcbiAgTEFOR1VBR0UgcGxwZ3NxbFxuICBTRVQgc2VhcmNoX3BhdGggPSBwZ19jYXRhbG9nLCBwdWJsaWNcbiAgQVMgJGZ1bmMkXG4gIEJFR0lOXG4gICAgUEVSRk9STSBwZ19ub3RpZnkoJ3Rva2Vuc19jaGFuZ2VkJywganNvbl9idWlsZF9vYmplY3QoXG4gICAgICAnb3AnLCBUR19PUCxcbiAgICAgICdpZCcsIENPQUxFU0NFKE5FVy5pZCwgT0xELmlkKVxuICAgICk6OnRleHQpO1xuICAgIFJFVFVSTiBDT0FMRVNDRShORVcsIE9MRCk7XG4gIEVORDtcbiAgJGZ1bmMkO1xuXG4gIERST1AgVFJJR0dFUiBJRiBFWElTVFMgdG9rZW5zX2NoYW5nZWRfdHJpZ2dlciBPTiBwdWJsaWMudG9rZW5zO1xuICBEUk9QIFRSSUdHRVIgSUYgRVhJU1RTIHRva2Vuc19jaGFuZ2VkIE9OIHB1YmxpYy50b2tlbnM7XG5cbiAgQ1JFQVRFIE9SIFJFUExBQ0UgVFJJR0dFUiB0b2tlbnNfY2hhbmdlZF9pbnNfZGVsXG4gIEFGVEVSIElOU0VSVCBPUiBERUxFVEUgT04gcHVibGljLnRva2Vuc1xuICBGT1IgRUFDSCBST1cgRVhFQ1VURSBGVU5DVElPTiBwdWJsaWMudG9rZW5zX25vdGlmeSgpO1xuXG4gIENSRUFURSBPUiBSRVBMQUNFIFRSSUdHRVIgdG9rZW5zX2NoYW5nZWRfdXBkXG4gIEFGVEVSIFVQREFURSBPTiBwdWJsaWMudG9rZW5zXG4gIEZPUiBFQUNIIFJPV1xuICBXSEVOIChcbiAgICBPTEQuYWN0aXZlIElTIERJU1RJTkNUIEZST00gTkVXLmFjdGl2ZSBPUlxuICAgIE9MRC5jcmVkZW50aWFscyBJUyBESVNUSU5DVCBGUk9NIE5FVy5jcmVkZW50aWFscyBPUlxuICAgIE9MRC5wcm92aWRlciBJUyBESVNUSU5DVCBGUk9NIE5FVy5wcm92aWRlciBPUlxuICAgIE9MRC5uYW1lIElTIERJU1RJTkNUIEZST00gTkVXLm5hbWUgT1JcbiAgICBPTEQucXVvdGFfdGhyZXNob2xkIElTIERJU1RJTkNUIEZST00gTkVXLnF1b3RhX3RocmVzaG9sZFxuICApXG4gIEVYRUNVVEUgRlVOQ1RJT04gcHVibGljLnRva2Vuc19ub3RpZnkoKTtcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVUb2tlbnNUcmlnZ2VyKGNvbm5Db25maWc6IENsaWVudENvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KHtcbiAgICAuLi5jb25uQ29uZmlnLFxuICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBDT05ORUNUSU9OX1RJTUVPVVRfTVMsXG4gICAgYXBwbGljYXRpb25fbmFtZTogXCJxZ3JpZC10cmlnZ2VyLXNldHVwXCIsXG4gIH0pO1xuXG4gIGxldCBsb2NrQWNxdWlyZWQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBjbGllbnQuY29ubmVjdCgpO1xuICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIlNFVCBzZWFyY2hfcGF0aCBUTyBwdWJsaWNcIik7XG4gICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBTRVQgbG9ja190aW1lb3V0ID0gJyR7U0VUVVBfTE9DS19USU1FT1VUX01TfW1zJ2ApO1xuICAgIGF3YWl0IGNsaWVudC5xdWVyeShgU0VUIHN0YXRlbWVudF90aW1lb3V0ID0gJyR7U0VUVVBfU1RBVEVNRU5UX1RJTUVPVVRfTVN9bXMnYCk7XG4gICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiU0VMRUNUIHBnX2Fkdmlzb3J5X2xvY2soJDEsICQyKVwiLCBbXG4gICAgICBBRFZJU09SWV9MT0NLX0NMQVNTX0lELFxuICAgICAgQURWSVNPUllfTE9DS19PQkpFQ1RfSUQsXG4gICAgXSk7XG4gICAgbG9ja0FjcXVpcmVkID0gdHJ1ZTtcblxuICAgIGF3YWl0IGNsaWVudC5xdWVyeShTRVRVUF9TUUwpO1xuICAgIGxvZ2dlci5pbmZvKFwidHJpZ2dlciBlbnN1cmVkIChwdWJsaWMudG9rZW5zX25vdGlmeSArIHRva2Vuc19jaGFuZ2VkXyogdHJpZ2dlcnMpXCIpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChsb2NrQWNxdWlyZWQpIHtcbiAgICAgIGF3YWl0IGNsaWVudFxuICAgICAgICAucXVlcnkoXCJTRUxFQ1QgcGdfYWR2aXNvcnlfdW5sb2NrKCQxLCAkMilcIiwgW1xuICAgICAgICAgIEFEVklTT1JZX0xPQ0tfQ0xBU1NfSUQsXG4gICAgICAgICAgQURWSVNPUllfTE9DS19PQkpFQ1RfSUQsXG4gICAgICAgIF0pXG4gICAgICAgIC5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuICAgIGF3YWl0IGNsaWVudC5lbmQoKS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFJQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsZ0JBQWdCLENBQUM7QUFFcEQsTUFBTSx3QkFBd0I7QUFDOUIsTUFBTSx3QkFBd0I7QUFDOUIsTUFBTSw2QkFBNkI7QUFFbkMsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSwwQkFBMEI7QUFFaEMsTUFBTSxZQUFZOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQ2xCLGVBQXNCLG9CQUFvQixZQUF5QztDQUNqRixNQUFNLFNBQVMsSUFBSSxPQUFPO0VBQ3hCLEdBQUc7RUFDSCx5QkFBeUI7RUFDekIsa0JBQWtCO0VBQ25CLENBQUM7Q0FFRixJQUFJLGVBQWU7QUFDbkIsS0FBSTtBQUNGLFFBQU0sT0FBTyxTQUFTO0FBQ3RCLFFBQU0sT0FBTyxNQUFNLDRCQUE0QjtBQUMvQyxRQUFNLE9BQU8sTUFBTSx1QkFBdUIsc0JBQXNCLEtBQUs7QUFDckUsUUFBTSxPQUFPLE1BQU0sNEJBQTRCLDJCQUEyQixLQUFLO0FBQy9FLFFBQU0sT0FBTyxNQUFNLG1DQUFtQyxDQUNwRCx3QkFDQSx3QkFDRCxDQUFDO0FBQ0YsaUJBQWU7QUFFZixRQUFNLE9BQU8sTUFBTSxVQUFVO0FBQzdCLFNBQU8sS0FBSyxxRUFBcUU7V0FDekU7QUFDUixNQUFJLGFBQ0YsT0FBTSxPQUNILE1BQU0scUNBQXFDLENBQzFDLHdCQUNBLHdCQUNELENBQUMsQ0FDRCxZQUFZLEdBQUc7QUFFcEIsUUFBTSxPQUFPLEtBQUssQ0FBQyxZQUFZLEdBQUcifQ==
|
|
@@ -14,21 +14,21 @@ function canonicalModelName(modelName) {
|
|
|
14
14
|
return modelName.includes("/") ? modelName.split("/").pop() : modelName;
|
|
15
15
|
}
|
|
16
16
|
function normalizedUsageForCost(row) {
|
|
17
|
-
const cacheRead =
|
|
18
|
-
const cacheCreation =
|
|
19
|
-
const storedInput =
|
|
17
|
+
const cacheRead = row.cache_read_tokens;
|
|
18
|
+
const cacheCreation = row.cache_creation_tokens;
|
|
19
|
+
const storedInput = row.input_tokens;
|
|
20
20
|
const legacyAnthropicSplitInput = isAnthropicUsageRow(row) && storedInput < cacheRead + cacheCreation;
|
|
21
21
|
return {
|
|
22
22
|
model: row.model_name ? canonicalModelName(row.model_name) : null,
|
|
23
23
|
inputTokens: legacyAnthropicSplitInput ? storedInput + cacheRead + cacheCreation : storedInput,
|
|
24
|
-
outputTokens:
|
|
24
|
+
outputTokens: row.output_tokens,
|
|
25
25
|
cachedInputTokens: cacheRead,
|
|
26
26
|
cacheCreationInputTokens: cacheCreation
|
|
27
27
|
};
|
|
28
28
|
}
|
|
29
29
|
function normalizeLegacyAnthropicRow(row) {
|
|
30
30
|
const usage = normalizedUsageForCost(row);
|
|
31
|
-
if (usage.inputTokens ===
|
|
31
|
+
if (usage.inputTokens === row.input_tokens) return row;
|
|
32
32
|
const normalized = {
|
|
33
33
|
...row,
|
|
34
34
|
input_tokens: usage.inputTokens
|
|
@@ -148,6 +148,7 @@ var RequestLogModelClass = class extends BaseModelClass {
|
|
|
148
148
|
"tool_call_count"
|
|
149
149
|
]) if (params[key] !== void 0) update[key] = params[key];
|
|
150
150
|
if (params.history !== void 0) update.history = params.history;
|
|
151
|
+
update.ttft_ms = await this.firstGenerateStepTtft(requestLogId) ?? 0;
|
|
151
152
|
if (params.input_tokens !== void 0 && params.output_tokens !== void 0) {
|
|
152
153
|
const [row] = await this.getDB("r")("request_logs").select("model_name").where("id", requestLogId).limit(1);
|
|
153
154
|
if (row?.model_name) {
|
|
@@ -174,6 +175,10 @@ var RequestLogModelClass = class extends BaseModelClass {
|
|
|
174
175
|
await trx.ubUpsert("request_logs");
|
|
175
176
|
});
|
|
176
177
|
}
|
|
178
|
+
async firstGenerateStepTtft(requestLogId) {
|
|
179
|
+
const [row] = await this.getDB("r")("request_log_steps").select("ttft_ms").where("request_log_id", requestLogId).where("type", "generate").whereNotNull("ttft_ms").orderBy("step_index", "asc").orderBy("id", "asc").limit(1);
|
|
180
|
+
return row?.ttft_ms === null || row?.ttft_ms === void 0 ? null : Number(row.ttft_ms);
|
|
181
|
+
}
|
|
177
182
|
async aggregateStepUsage(requestLogId) {
|
|
178
183
|
const [row] = await this.getDB("r")("request_log_steps").where("request_log_id", requestLogId).where("type", "generate").sum({
|
|
179
184
|
input_tokens: "input_tokens",
|
|
@@ -213,7 +218,7 @@ var RequestLogModelClass = class extends BaseModelClass {
|
|
|
213
218
|
if (params.token_name) qb.where("token_name", params.token_name);
|
|
214
219
|
return (await qb.select("model_name", "input_tokens", "output_tokens", "cache_read_tokens", "cache_creation_tokens", "cost_usd")).reduce((sum, row) => {
|
|
215
220
|
const usage = normalizedUsageForCost(row);
|
|
216
|
-
if (!usage.model) return sum + Math.max(
|
|
221
|
+
if (!usage.model) return sum + Math.max(row.cost_usd ?? 0, 0) / MICRO_USD;
|
|
217
222
|
return sum + calculateCostUsd(usage.model, {
|
|
218
223
|
inputTokens: usage.inputTokens,
|
|
219
224
|
outputTokens: usage.outputTokens,
|
|
@@ -275,4 +280,4 @@ const RequestLogModel = new RequestLogModelClass();
|
|
|
275
280
|
//#endregion
|
|
276
281
|
export { MICRO_USD, RequestLogModel };
|
|
277
282
|
|
|
278
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1sb2cubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFwaSxcbiAgYXNBcnJheSxcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgQmFzZU1vZGVsQ2xhc3MsXG4gIGV4aGF1c3RpdmUsXG4gIHR5cGUgTGlzdFJlc3VsdCxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG59IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZUNvc3RVc2QgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0XCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RMb2dTdWJzZXRLZXksIHR5cGUgUmVxdWVzdExvZ1N1YnNldE1hcHBpbmcgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXMsIHJlcXVlc3RMb2dTdWJzZXRRdWVyaWVzIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWQuc3NvXCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RMb2dMaXN0UGFyYW1zLCB0eXBlIFJlcXVlc3RMb2dTYXZlUGFyYW1zIH0gZnJvbSBcIi4vcmVxdWVzdC1sb2cudHlwZXNcIjtcblxuLy8gY29zdF91c2TripQg7KCV7IiYIG1pY3JvLVVTROuhnCDsoIDsnqUuIOyLpOygnCBVU0QgPSBjb3N0X3VzZCAvIE1JQ1JPX1VTRC5cbmV4cG9ydCBjb25zdCBNSUNST19VU0QgPSAxXzAwMF8wMDA7XG5cbnR5cGUgUmVxdWVzdExvZ1VzYWdlUm93ID0ge1xuICB0b2tlbl9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgbW9kZWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gIGlucHV0X3Rva2VuczogbnVtYmVyO1xuICBvdXRwdXRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogbnVtYmVyO1xuICBjb3N0X3VzZD86IG51bWJlciB8IG51bGw7XG59O1xuXG5mdW5jdGlvbiBpc0FudGhyb3BpY1VzYWdlUm93KHJvdzogUGljazxSZXF1ZXN0TG9nVXNhZ2VSb3csIFwidG9rZW5fbmFtZVwiIHwgXCJtb2RlbF9uYW1lXCI+KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgcm93LnRva2VuX25hbWU/LnN0YXJ0c1dpdGgoXCJhbnRocm9waWMvXCIpID09PSB0cnVlIHx8XG4gICAgcm93Lm1vZGVsX25hbWU/LnN0YXJ0c1dpdGgoXCJjbGF1ZGUtXCIpID09PSB0cnVlIHx8XG4gICAgcm93Lm1vZGVsX25hbWU/LnN0YXJ0c1dpdGgoXCJhbnRocm9waWMvY2xhdWRlLVwiKSA9PT0gdHJ1ZVxuICApO1xufVxuXG5mdW5jdGlvbiBjYW5vbmljYWxNb2RlbE5hbWUobW9kZWxOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbW9kZWxOYW1lLmluY2x1ZGVzKFwiL1wiKSA/IG1vZGVsTmFtZS5zcGxpdChcIi9cIikucG9wKCkhIDogbW9kZWxOYW1lO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVkVXNhZ2VGb3JDb3N0KHJvdzogUmVxdWVzdExvZ1VzYWdlUm93KToge1xuICBtb2RlbDogc3RyaW5nIHwgbnVsbDtcbiAgaW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgb3V0cHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlZElucHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogbnVtYmVyO1xufSB7XG4gIGNvbnN0IGNhY2hlUmVhZCA9IE51bWJlcihyb3cuY2FjaGVfcmVhZF90b2tlbnMgPz8gMCk7XG4gIGNvbnN0IGNhY2hlQ3JlYXRpb24gPSBOdW1iZXIocm93LmNhY2hlX2NyZWF0aW9uX3Rva2VucyA/PyAwKTtcbiAgY29uc3Qgc3RvcmVkSW5wdXQgPSBOdW1iZXIocm93LmlucHV0X3Rva2VucyA/PyAwKTtcbiAgY29uc3QgbGVnYWN5QW50aHJvcGljU3BsaXRJbnB1dCA9XG4gICAgaXNBbnRocm9waWNVc2FnZVJvdyhyb3cpICYmIHN0b3JlZElucHV0IDwgY2FjaGVSZWFkICsgY2FjaGVDcmVhdGlvbjtcbiAgcmV0dXJuIHtcbiAgICBtb2RlbDogcm93Lm1vZGVsX25hbWUgPyBjYW5vbmljYWxNb2RlbE5hbWUocm93Lm1vZGVsX25hbWUpIDogbnVsbCxcbiAgICBpbnB1dFRva2VuczogbGVnYWN5QW50aHJvcGljU3BsaXRJbnB1dCA/IHN0b3JlZElucHV0ICsgY2FjaGVSZWFkICsgY2FjaGVDcmVhdGlvbiA6IHN0b3JlZElucHV0LFxuICAgIG91dHB1dFRva2VuczogTnVtYmVyKHJvdy5vdXRwdXRfdG9rZW5zID8/IDApLFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiBjYWNoZVJlYWQsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiBjYWNoZUNyZWF0aW9uLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVMZWdhY3lBbnRocm9waWNSb3c8VCBleHRlbmRzIFJlcXVlc3RMb2dVc2FnZVJvdz4ocm93OiBUKTogVCB7XG4gIGNvbnN0IHVzYWdlID0gbm9ybWFsaXplZFVzYWdlRm9yQ29zdChyb3cpO1xuICBpZiAodXNhZ2UuaW5wdXRUb2tlbnMgPT09IE51bWJlcihyb3cuaW5wdXRfdG9rZW5zID8/IDApKSByZXR1cm4gcm93O1xuICBjb25zdCBub3JtYWxpemVkID0geyAuLi5yb3csIGlucHV0X3Rva2VuczogdXNhZ2UuaW5wdXRUb2tlbnMgfTtcbiAgaWYgKHVzYWdlLm1vZGVsKSB7XG4gICAgbm9ybWFsaXplZC5jb3N0X3VzZCA9IE1hdGgucm91bmQoY2FsY3VsYXRlQ29zdFVzZCh1c2FnZS5tb2RlbCwgdXNhZ2UpICogTUlDUk9fVVNEKTtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLypcbiAgUmVxdWVzdExvZyBNb2RlbFxuKi9cbmNsYXNzIFJlcXVlc3RMb2dNb2RlbENsYXNzIGV4dGVuZHMgQmFzZU1vZGVsQ2xhc3M8XG4gIFJlcXVlc3RMb2dTdWJzZXRLZXksXG4gIFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nLFxuICB0eXBlb2YgcmVxdWVzdExvZ1N1YnNldFF1ZXJpZXMsXG4gIHR5cGVvZiByZXF1ZXN0TG9nTG9hZGVyUXVlcmllc1xuPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiUmVxdWVzdExvZ1wiLCByZXF1ZXN0TG9nU3Vic2V0UXVlcmllcywgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXMpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJSZXF1ZXN0TG9nXCIgfSlcbiAgYXN5bmMgZmluZEJ5SWQ8VCBleHRlbmRzIFJlcXVlc3RMb2dTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBpZDogbnVtYmVyLFxuICApOiBQcm9taXNlPFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nW1RdPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwge1xuICAgICAgaWQsXG4gICAgICBudW06IDEsXG4gICAgICBwYWdlOiAxLFxuICAgIH0pO1xuICAgIGlmICghcm93c1swXSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuZW50aXR5Tm90Rm91bmRcIikoXCJSZXF1ZXN0TG9nXCIsIGlkKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3NbMF07XG4gIH1cblxuICBhc3luYyBmaW5kT25lPFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgbGlzdFBhcmFtczogUmVxdWVzdExvZ0xpc3RQYXJhbXMsXG4gICk6IFByb21pc2U8UmVxdWVzdExvZ1N1YnNldE1hcHBpbmdbVF0gfCBudWxsPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwge1xuICAgICAgLi4ubGlzdFBhcmFtcyxcbiAgICAgIG51bTogMSxcbiAgICAgIHBhZ2U6IDEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcm93c1swXSA/PyBudWxsO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJSZXF1ZXN0TG9nc1wiIH0pXG4gIGFzeW5jIGZpbmRNYW55PFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5LCBMUCBleHRlbmRzIFJlcXVlc3RMb2dMaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFByb21pc2U8TGlzdFJlc3VsdDxMUCwgUmVxdWVzdExvZ1N1YnNldE1hcHBpbmdbVF0+PiB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbnVtOiAyNCxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBzZWFyY2g6IFwiaWRcIiBhcyBjb25zdCxcbiAgICAgIG9yZGVyQnk6IFwiaWQtZGVzY1wiIGFzIGNvbnN0LFxuICAgICAgLi4ucmF3UGFyYW1zLFxuICAgIH0gc2F0aXNmaWVzIFJlcXVlc3RMb2dMaXN0UGFyYW1zO1xuXG4gICAgY29uc3QgeyBxYiwgb25TdWJzZXQ6IF8gfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuXG4gICAgaWYgKHBhcmFtcy5pZCkge1xuICAgICAgcWIud2hlcmVJbihcInJlcXVlc3RfbG9ncy5pZFwiLCBhc0FycmF5KHBhcmFtcy5pZCkpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMudG9rZW5fbmFtZSkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MudG9rZW5fbmFtZVwiLCBwYXJhbXMudG9rZW5fbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wcm9qZWN0X25hbWVfaXNfbnVsbCkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsIG51bGwpO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnByb2plY3RfbmFtZV9pc19ub3RfbnVsbCkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsIFwiIT1cIiwgbnVsbCk7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMucHJvamVjdF9uYW1lKSB7XG4gICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5wcm9qZWN0X25hbWVcIiwgcGFyYW1zLnByb2plY3RfbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5tb2RlbF9uYW1lKSB7XG4gICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5tb2RlbF9uYW1lXCIsIHBhcmFtcy5tb2RlbF9uYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNlYXJjaCAmJiBwYXJhbXMua2V5d29yZCAmJiBwYXJhbXMua2V5d29yZC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJpZFwiKSB7XG4gICAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLmlkXCIsIE51bWJlcihwYXJhbXMua2V5d29yZCkpO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2VhcmNoID09PSBcInRva2VuX25hbWVcIikge1xuICAgICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy50b2tlbl9uYW1lXCIsIFwibGlrZVwiLCBgJSR7cGFyYW1zLmtleXdvcmR9JWApO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2VhcmNoID09PSBcInVzZXJfcHJvbXB0XCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MudXNlcl9wcm9tcHRcIiwgXCJsaWtlXCIsIGAlJHtwYXJhbXMua2V5d29yZH0lYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcImVycm9yLnVua25vd25TZWFyY2hGaWVsZFwiKShwYXJhbXMuc2VhcmNoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gb3JkZXJCeVxuICAgIGlmIChwYXJhbXMub3JkZXJCeSkge1xuICAgICAgLy8gZGVmYXVsdCBvcmRlckJ5XG4gICAgICBpZiAocGFyYW1zLm9yZGVyQnkgPT09IFwiaWQtZGVzY1wiKSB7XG4gICAgICAgIHFiLm9yZGVyQnkoXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgXCJkZXNjXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhoYXVzdGl2ZShwYXJhbXMub3JkZXJCeSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoe1xuICAgICAgQTogKHJvdykgPT4gbm9ybWFsaXplTGVnYWN5QW50aHJvcGljUm93KHJvdyksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXMsXG4gICAgICBlbmhhbmNlcnMsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgc2F2ZShzcGE6IFJlcXVlc3RMb2dTYXZlUGFyYW1zW10pOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcblxuICAgIC8vIHJlZ2lzdGVyXG4gICAgc3BhLmZvckVhY2goKHNwKSA9PiB7XG4gICAgICB3ZGIudWJSZWdpc3RlcihcInJlcXVlc3RfbG9nc1wiLCBzcCk7XG4gICAgfSk7XG5cbiAgICAvLyB0cmFuc2FjdGlvblxuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gYXdhaXQgdHJ4LnViVXBzZXJ0KFwicmVxdWVzdF9sb2dzXCIpO1xuXG4gICAgICByZXR1cm4gaWRzO1xuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJ1biBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgY3JlYXRlUnVuKHBhcmFtczoge1xuICAgIHVzZXJfcHJvbXB0OiBzdHJpbmc7XG4gICAgc3lzdGVtX3Byb21wdD86IHN0cmluZyB8IG51bGw7XG4gICAgbW9kZWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgZWZmb3J0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICBwcm9qZWN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIGhpc3Rvcnk/OiB1bmtub3duO1xuICB9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHdkYi51YlJlZ2lzdGVyKFwicmVxdWVzdF9sb2dzXCIsIHtcbiAgICAgIHVzZXJfcHJvbXB0OiBwYXJhbXMudXNlcl9wcm9tcHQsXG4gICAgICBzeXN0ZW1fcHJvbXB0OiBwYXJhbXMuc3lzdGVtX3Byb21wdCA/PyBudWxsLFxuICAgICAgbW9kZWxfbmFtZTogcGFyYW1zLm1vZGVsX25hbWUgPz8gbnVsbCxcbiAgICAgIGVmZm9ydDogcGFyYW1zLmVmZm9ydCA/PyBudWxsLFxuICAgICAgcHJvamVjdF9uYW1lOiBwYXJhbXMucHJvamVjdF9uYW1lID8/IG51bGwsXG4gICAgICBzdGF0dXM6IFwicnVubmluZ1wiLFxuICAgICAgcmVzcG9uc2U6IFwiXCIsXG4gICAgICBpbnB1dF90b2tlbnM6IDAsXG4gICAgICBvdXRwdXRfdG9rZW5zOiAwLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IDAsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IDAsXG4gICAgICBkdXJhdGlvbl9tczogMCxcbiAgICAgIHRvb2xfY2FsbF9jb3VudDogMCxcbiAgICAgIC4uLihwYXJhbXMuaGlzdG9yeSAhPT0gdW5kZWZpbmVkID8geyBoaXN0b3J5OiBwYXJhbXMuaGlzdG9yeSBhcyB7IHR5cGU6IHN0cmluZyB9W10gfSA6IHt9KSxcbiAgICB9KTtcbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGNvbnN0IGlkcyA9IGF3YWl0IHRyeC51YlVwc2VydChcInJlcXVlc3RfbG9nc1wiKTtcbiAgICAgIHJldHVybiBpZHNbMF0hO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgYXBwZW5kU3RlcChyZXF1ZXN0TG9nSWQ6IG51bWJlciwgc3RlcDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgd2RiLnViUmVnaXN0ZXIoXCJyZXF1ZXN0X2xvZ19zdGVwc1wiLCB7IHJlcXVlc3RfbG9nX2lkOiByZXF1ZXN0TG9nSWQsIC4uLnN0ZXAgfSk7XG4gICAgcmV0dXJuIHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBjb25zdCBpZHMgPSBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKTtcbiAgICAgIGlmIChzdGVwLnR5cGUgPT09IFwidG9vbF9jYWxsXCIpIHtcbiAgICAgICAgYXdhaXQgdHJ4LmZyb20oXCJyZXF1ZXN0X2xvZ3NcIikud2hlcmUoXCJpZFwiLCByZXF1ZXN0TG9nSWQpLmluY3JlbWVudChcInRvb2xfY2FsbF9jb3VudFwiLCAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpZHNbMF0hO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoUnVuKFxuICAgIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICAgIHBhcmFtczoge1xuICAgICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgICByZXNwb25zZT86IHN0cmluZztcbiAgICAgIHRva2VuX25hbWU/OiBzdHJpbmc7XG4gICAgICBpbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gICAgICBvdXRwdXRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgY2FjaGVfcmVhZF90b2tlbnM/OiBudW1iZXI7XG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM/OiBudW1iZXI7XG4gICAgICBkdXJhdGlvbl9tcz86IG51bWJlcjtcbiAgICAgIGhpc3Rvcnk/OiB1bmtub3duO1xuICAgICAgZXJyb3JfbWVzc2FnZT86IHN0cmluZztcbiAgICAgIHRvb2xfY2FsbF9jb3VudD86IG51bWJlcjtcbiAgICB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocGFyYW1zLnN0YXR1cyA9PT0gXCJzdWNjZWVkZWRcIiAmJiAhcGFyYW1zLnRva2VuX25hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInRva2VuTmFtZSBpcyByZXF1aXJlZCBmb3Igc3VjY2VlZGVkIHJ1bnNcIik7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IGlkOiByZXF1ZXN0TG9nSWQsIHN0YXR1czogcGFyYW1zLnN0YXR1cyB9O1xuICAgIGNvbnN0IGZpZWxkcyA9IFtcbiAgICAgIFwicmVzcG9uc2VcIixcbiAgICAgIFwidG9rZW5fbmFtZVwiLFxuICAgICAgXCJpbnB1dF90b2tlbnNcIixcbiAgICAgIFwib3V0cHV0X3Rva2Vuc1wiLFxuICAgICAgXCJjYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICAgICAgXCJjYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgICAgIFwiZHVyYXRpb25fbXNcIixcbiAgICAgIFwiZXJyb3JfbWVzc2FnZVwiLFxuICAgICAgXCJ0b29sX2NhbGxfY291bnRcIixcbiAgICBdIGFzIGNvbnN0O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGZpZWxkcykge1xuICAgICAgaWYgKHBhcmFtc1trZXldICE9PSB1bmRlZmluZWQpIHVwZGF0ZVtrZXldID0gcGFyYW1zW2tleV07XG4gICAgfVxuICAgIGlmIChwYXJhbXMuaGlzdG9yeSAhPT0gdW5kZWZpbmVkKSB1cGRhdGUuaGlzdG9yeSA9IHBhcmFtcy5oaXN0b3J5O1xuXG4gICAgaWYgKHBhcmFtcy5pbnB1dF90b2tlbnMgIT09IHVuZGVmaW5lZCAmJiBwYXJhbXMub3V0cHV0X3Rva2VucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBkYiA9IHRoaXMuZ2V0REIoXCJyXCIpO1xuICAgICAgY29uc3QgW3Jvd10gPSBhd2FpdCBkYihcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgICAuc2VsZWN0KFwibW9kZWxfbmFtZVwiKVxuICAgICAgICAud2hlcmUoXCJpZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAgIC5saW1pdCgxKTtcbiAgICAgIGlmIChyb3c/Lm1vZGVsX25hbWUpIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBjYW5vbmljYWxNb2RlbE5hbWUocm93Lm1vZGVsX25hbWUpO1xuICAgICAgICBjb25zdCB1c2FnZSA9IG5vcm1hbGl6ZWRVc2FnZUZvckNvc3Qoe1xuICAgICAgICAgIHRva2VuX25hbWU6IHBhcmFtcy50b2tlbl9uYW1lLFxuICAgICAgICAgIG1vZGVsX25hbWU6IHJvdy5tb2RlbF9uYW1lLFxuICAgICAgICAgIGlucHV0X3Rva2VuczogcGFyYW1zLmlucHV0X3Rva2VucyxcbiAgICAgICAgICBvdXRwdXRfdG9rZW5zOiBwYXJhbXMub3V0cHV0X3Rva2VucyxcbiAgICAgICAgICBjYWNoZV9yZWFkX3Rva2VuczogcGFyYW1zLmNhY2hlX3JlYWRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBwYXJhbXMuY2FjaGVfY3JlYXRpb25fdG9rZW5zID8/IDAsXG4gICAgICAgIH0pO1xuICAgICAgICB1cGRhdGUuY29zdF91c2QgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgIGNhbGN1bGF0ZUNvc3RVc2QobW9kZWwsIHtcbiAgICAgICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgIG91dHB1dFRva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IHVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMsXG4gICAgICAgICAgfSkgKiAxXzAwMF8wMDAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICB3ZGIudWJSZWdpc3RlcihcInJlcXVlc3RfbG9nc1wiLCB1cGRhdGUpO1xuICAgIGF3YWl0IHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ3NcIik7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBhZ2dyZWdhdGVTdGVwVXNhZ2UocmVxdWVzdExvZ0lkOiBudW1iZXIpOiBQcm9taXNlPHtcbiAgICBpbnB1dF90b2tlbnM6IG51bWJlcjtcbiAgICBvdXRwdXRfdG9rZW5zOiBudW1iZXI7XG4gICAgY2FjaGVfcmVhZF90b2tlbnM6IG51bWJlcjtcbiAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IG51bWJlcjtcbiAgICBkdXJhdGlvbl9tczogbnVtYmVyO1xuICB9PiB7XG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKFwiclwiKTtcbiAgICBjb25zdCBbcm93XSA9IGF3YWl0IGRiKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInR5cGVcIiwgXCJnZW5lcmF0ZVwiKVxuICAgICAgLnN1bSh7XG4gICAgICAgIGlucHV0X3Rva2VuczogXCJpbnB1dF90b2tlbnNcIixcbiAgICAgICAgb3V0cHV0X3Rva2VuczogXCJvdXRwdXRfdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBcImNhY2hlX3JlYWRfdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogXCJjYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgICAgICAgZHVyYXRpb25fbXM6IFwiZHVyYXRpb25fbXNcIixcbiAgICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBpbnB1dF90b2tlbnM6IE51bWJlcihyb3c/LmlucHV0X3Rva2VucyA/PyAwKSxcbiAgICAgIG91dHB1dF90b2tlbnM6IE51bWJlcihyb3c/Lm91dHB1dF90b2tlbnMgPz8gMCksXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogTnVtYmVyKHJvdz8uY2FjaGVfcmVhZF90b2tlbnMgPz8gMCksXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IE51bWJlcihyb3c/LmNhY2hlX2NyZWF0aW9uX3Rva2VucyA/PyAwKSxcbiAgICAgIGR1cmF0aW9uX21zOiBOdW1iZXIocm93Py5kdXJhdGlvbl9tcyA/PyAwKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmluZFN0YWxlUnVubmluZ0lkcyh0aHJlc2hvbGRNczogbnVtYmVyLCBsaW1pdDogbnVtYmVyID0gMTApOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKFwiclwiKTtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gdGhyZXNob2xkTXMpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBkYihcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLnNlbGVjdChcImlkXCIpXG4gICAgICAud2hlcmUoXCJzdGF0dXNcIiwgXCJydW5uaW5nXCIpXG4gICAgICAud2hlcmUoXCJjcmVhdGVkX2F0XCIsIFwiPFwiLCB0aHJlc2hvbGQpXG4gICAgICAubGltaXQobGltaXQpO1xuICAgIHJldHVybiByb3dzLm1hcCgocjogeyBpZDogbnVtYmVyIH0pID0+IHIuaWQpO1xuICB9XG5cbiAgYXN5bmMgZ2V0TmV4dFN0ZXBJbmRleChyZXF1ZXN0TG9nSWQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKFwiclwiKTtcbiAgICBjb25zdCBbcm93XSA9IGF3YWl0IGRiKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC5tYXgoXCJzdGVwX2luZGV4IGFzIG1heFN0ZXBcIik7XG4gICAgcmV0dXJuICgocm93IGFzIHsgbWF4U3RlcDogbnVtYmVyIHwgbnVsbCB9KT8ubWF4U3RlcCA/PyAtMSkgKyAxO1xuICB9XG5cbiAgYXN5bmMgY29tcGxldGVUb29sQ2FsbChcbiAgICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgICB0b29sQ2FsbElkOiBzdHJpbmcsXG4gICAgcGFyYW1zOiB7IHRvb2xfcmVzdWx0Pzogc3RyaW5nOyB0b29sX2R1cmF0aW9uX21zPzogbnVtYmVyOyBlcnJvcj86IHN0cmluZyB9LFxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgcmV0dXJuIHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdHJ4XG4gICAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgICAud2hlcmUoXCJ0b29sX2NhbGxfaWRcIiwgdG9vbENhbGxJZClcbiAgICAgICAgLndoZXJlKFwidHlwZVwiLCBcInRvb2xfY2FsbFwiKVxuICAgICAgICAudXBkYXRlKHtcbiAgICAgICAgICAuLi4ocGFyYW1zLnRvb2xfcmVzdWx0ICE9PSB1bmRlZmluZWQgPyB7IHRvb2xfcmVzdWx0OiBwYXJhbXMudG9vbF9yZXN1bHQgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ocGFyYW1zLnRvb2xfZHVyYXRpb25fbXMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7IHRvb2xfZHVyYXRpb25fbXM6IHBhcmFtcy50b29sX2R1cmF0aW9uX21zIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIC4uLihwYXJhbXMuZXJyb3IgIT09IHVuZGVmaW5lZCA/IHsgZXJyb3I6IHBhcmFtcy5lcnJvciB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gU29uYW11IGZpbmRNYW5564qUIHN1YnNldCDsoITssrQg7Lus65+8KHRleHQg7Y+s7ZWoKeydhCDtjpjsuZjtlbTshJwgYWdncmVnYXRl7JeUIOuEiOustCDrrLTqsbDsm4Ag4oaSIHJhdyBzdW0g7IKs7JqpLlxuICBhc3luYyB0b3RhbENvc3QocGFyYW1zOiB7IHRva2VuX25hbWU/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBxYiA9IHRoaXMuZ2V0REIoXCJyXCIpKFwicmVxdWVzdF9sb2dzXCIpO1xuICAgIGlmIChwYXJhbXMudG9rZW5fbmFtZSkge1xuICAgICAgcWIud2hlcmUoXCJ0b2tlbl9uYW1lXCIsIHBhcmFtcy50b2tlbl9uYW1lKTtcbiAgICB9XG4gICAgLy8g6riw7KG0IGNvc3RfdXNkIOyXkOuKlCDqs7zqsbAgQW50aHJvcGljIGNhY2hlIOqzhOyCsCDrsoTqt7jroZwg7J2M7IiY6rCAIOyggOyepeuQnCByb3cg6rCAIOyeiOydhCDsiJgg7J6I64ukLlxuICAgIC8vIO2ZlOuptCDsp5Hqs4TripQg7KCA7J6l6rCSIHN1bSDsnbQg7JWE64uI6528IO2YhOyerCDqs4TsgrDsi53snLzroZwgdXNhZ2Ug66W8IOyerOqzhOyCsO2VtCDqs7zqsbAg66Gc6re464+EIOymieyLnCDrs7TsoJXtlZzri6QuXG4gICAgY29uc3Qgcm93cyA9IChhd2FpdCBxYi5zZWxlY3QoXG4gICAgICBcIm1vZGVsX25hbWVcIixcbiAgICAgIFwiaW5wdXRfdG9rZW5zXCIsXG4gICAgICBcIm91dHB1dF90b2tlbnNcIixcbiAgICAgIFwiY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgICAgIFwiY2FjaGVfY3JlYXRpb25fdG9rZW5zXCIsXG4gICAgICBcImNvc3RfdXNkXCIsXG4gICAgKSkgYXMgQXJyYXk8e1xuICAgICAgbW9kZWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAgIGlucHV0X3Rva2VuczogbnVtYmVyO1xuICAgICAgb3V0cHV0X3Rva2VuczogbnVtYmVyO1xuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IG51bWJlcjtcbiAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogbnVtYmVyO1xuICAgICAgY29zdF91c2Q6IG51bWJlciB8IG51bGw7XG4gICAgfT47XG5cbiAgICByZXR1cm4gcm93cy5yZWR1Y2UoKHN1bSwgcm93KSA9PiB7XG4gICAgICBjb25zdCB1c2FnZSA9IG5vcm1hbGl6ZWRVc2FnZUZvckNvc3Qocm93KTtcbiAgICAgIGlmICghdXNhZ2UubW9kZWwpIHJldHVybiBzdW0gKyBNYXRoLm1heChOdW1iZXIocm93LmNvc3RfdXNkID8/IDApLCAwKSAvIE1JQ1JPX1VTRDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHN1bSArXG4gICAgICAgIGNhbGN1bGF0ZUNvc3RVc2QodXNhZ2UubW9kZWwsIHtcbiAgICAgICAgICBpbnB1dFRva2VuczogdXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgb3V0cHV0VG9rZW5zOiB1c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IHVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIGFzeW5jIGRpc3RpbmN0UHJvamVjdE5hbWVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC5kaXN0aW5jdChcInByb2plY3RfbmFtZVwiKVxuICAgICAgLndoZXJlKFwicHJvamVjdF9uYW1lXCIsIFwiIT1cIiwgbnVsbClcbiAgICAgIC5vcmRlckJ5KFwicHJvamVjdF9uYW1lXCIsIFwiYXNjXCIpXG4gICAgICAuc2VsZWN0KHtcbiAgICAgICAgcHJvamVjdF9uYW1lOiBcInByb2plY3RfbmFtZVwiLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHJvd3MubWFwKChyKSA9PiByLnByb2plY3RfbmFtZSEpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGRlbChpZHM6IG51bWJlcltdKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuXG4gICAgLy8gdHJhbnNhY3Rpb25cbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgYXdhaXQgdHJ4XG4gICAgICAgIC50YWJsZShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAgIC53aGVyZUluKFwicmVxdWVzdF9sb2dfc3RlcHMucmVxdWVzdF9sb2dfaWRcIiwgaWRzKVxuICAgICAgICAuZGVsZXRlKCk7XG4gICAgICByZXR1cm4gdHJ4LnRhYmxlKFwicmVxdWVzdF9sb2dzXCIpLndoZXJlSW4oXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgaWRzKS5kZWxldGUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpZHMubGVuZ3RoO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBSZXF1ZXN0TG9nTW9kZWwgPSBuZXcgUmVxdWVzdExvZ01vZGVsQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFpQkEsTUFBYSxZQUFZO0FBWXpCLFNBQVMsb0JBQW9CLEtBQXFFO0FBQ2hHLFFBQ0UsSUFBSSxZQUFZLFdBQVcsYUFBYSxLQUFLLFFBQzdDLElBQUksWUFBWSxXQUFXLFVBQVUsS0FBSyxRQUMxQyxJQUFJLFlBQVksV0FBVyxvQkFBb0IsS0FBSzs7QUFJeEQsU0FBUyxtQkFBbUIsV0FBMkI7QUFDckQsUUFBTyxVQUFVLFNBQVMsSUFBSSxHQUFHLFVBQVUsTUFBTSxJQUFJLENBQUMsS0FBSyxHQUFJOztBQUdqRSxTQUFTLHVCQUF1QixLQU05QjtDQUNBLE1BQU0sWUFBWSxPQUFPLElBQUkscUJBQXFCLEVBQUU7Q0FDcEQsTUFBTSxnQkFBZ0IsT0FBTyxJQUFJLHlCQUF5QixFQUFFO0NBQzVELE1BQU0sY0FBYyxPQUFPLElBQUksZ0JBQWdCLEVBQUU7Q0FDakQsTUFBTSw0QkFDSixvQkFBb0IsSUFBSSxJQUFJLGNBQWMsWUFBWTtBQUN4RCxRQUFPO0VBQ0wsT0FBTyxJQUFJLGFBQWEsbUJBQW1CLElBQUksV0FBVyxHQUFHO0VBQzdELGFBQWEsNEJBQTRCLGNBQWMsWUFBWSxnQkFBZ0I7RUFDbkYsY0FBYyxPQUFPLElBQUksaUJBQWlCLEVBQUU7RUFDNUMsbUJBQW1CO0VBQ25CLDBCQUEwQjtFQUMzQjs7QUFHSCxTQUFTLDRCQUEwRCxLQUFXO0NBQzVFLE1BQU0s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
|
|
283
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1sb2cubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFwaSxcbiAgYXNBcnJheSxcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgQmFzZU1vZGVsQ2xhc3MsXG4gIGV4aGF1c3RpdmUsXG4gIHR5cGUgTGlzdFJlc3VsdCxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG59IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZUNvc3RVc2QgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0XCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RMb2dTdWJzZXRLZXksIHR5cGUgUmVxdWVzdExvZ1N1YnNldE1hcHBpbmcgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXMsIHJlcXVlc3RMb2dTdWJzZXRRdWVyaWVzIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWQuc3NvXCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RMb2dMaXN0UGFyYW1zLCB0eXBlIFJlcXVlc3RMb2dTYXZlUGFyYW1zIH0gZnJvbSBcIi4vcmVxdWVzdC1sb2cudHlwZXNcIjtcblxuLy8gY29zdF91c2TripQg7KCV7IiYIG1pY3JvLVVTROuhnCDsoIDsnqUuIOyLpOygnCBVU0QgPSBjb3N0X3VzZCAvIE1JQ1JPX1VTRC5cbmV4cG9ydCBjb25zdCBNSUNST19VU0QgPSAxXzAwMF8wMDA7XG5cbnR5cGUgUmVxdWVzdExvZ1VzYWdlUm93ID0ge1xuICB0b2tlbl9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgbW9kZWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gIGlucHV0X3Rva2VuczogbnVtYmVyO1xuICBvdXRwdXRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogbnVtYmVyO1xuICBjb3N0X3VzZD86IG51bWJlciB8IG51bGw7XG59O1xuXG5mdW5jdGlvbiBpc0FudGhyb3BpY1VzYWdlUm93KHJvdzogUGljazxSZXF1ZXN0TG9nVXNhZ2VSb3csIFwidG9rZW5fbmFtZVwiIHwgXCJtb2RlbF9uYW1lXCI+KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgcm93LnRva2VuX25hbWU/LnN0YXJ0c1dpdGgoXCJhbnRocm9waWMvXCIpID09PSB0cnVlIHx8XG4gICAgcm93Lm1vZGVsX25hbWU/LnN0YXJ0c1dpdGgoXCJjbGF1ZGUtXCIpID09PSB0cnVlIHx8XG4gICAgcm93Lm1vZGVsX25hbWU/LnN0YXJ0c1dpdGgoXCJhbnRocm9waWMvY2xhdWRlLVwiKSA9PT0gdHJ1ZVxuICApO1xufVxuXG5mdW5jdGlvbiBjYW5vbmljYWxNb2RlbE5hbWUobW9kZWxOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbW9kZWxOYW1lLmluY2x1ZGVzKFwiL1wiKSA/IG1vZGVsTmFtZS5zcGxpdChcIi9cIikucG9wKCkhIDogbW9kZWxOYW1lO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVkVXNhZ2VGb3JDb3N0KHJvdzogUmVxdWVzdExvZ1VzYWdlUm93KToge1xuICBtb2RlbDogc3RyaW5nIHwgbnVsbDtcbiAgaW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgb3V0cHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlZElucHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogbnVtYmVyO1xufSB7XG4gIGNvbnN0IGNhY2hlUmVhZCA9IHJvdy5jYWNoZV9yZWFkX3Rva2VucztcbiAgY29uc3QgY2FjaGVDcmVhdGlvbiA9IHJvdy5jYWNoZV9jcmVhdGlvbl90b2tlbnM7XG4gIGNvbnN0IHN0b3JlZElucHV0ID0gcm93LmlucHV0X3Rva2VucztcbiAgY29uc3QgbGVnYWN5QW50aHJvcGljU3BsaXRJbnB1dCA9XG4gICAgaXNBbnRocm9waWNVc2FnZVJvdyhyb3cpICYmIHN0b3JlZElucHV0IDwgY2FjaGVSZWFkICsgY2FjaGVDcmVhdGlvbjtcbiAgcmV0dXJuIHtcbiAgICBtb2RlbDogcm93Lm1vZGVsX25hbWUgPyBjYW5vbmljYWxNb2RlbE5hbWUocm93Lm1vZGVsX25hbWUpIDogbnVsbCxcbiAgICBpbnB1dFRva2VuczogbGVnYWN5QW50aHJvcGljU3BsaXRJbnB1dCA/IHN0b3JlZElucHV0ICsgY2FjaGVSZWFkICsgY2FjaGVDcmVhdGlvbiA6IHN0b3JlZElucHV0LFxuICAgIG91dHB1dFRva2Vuczogcm93Lm91dHB1dF90b2tlbnMsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IGNhY2hlUmVhZCxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IGNhY2hlQ3JlYXRpb24sXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxlZ2FjeUFudGhyb3BpY1JvdzxUIGV4dGVuZHMgUmVxdWVzdExvZ1VzYWdlUm93Pihyb3c6IFQpOiBUIHtcbiAgY29uc3QgdXNhZ2UgPSBub3JtYWxpemVkVXNhZ2VGb3JDb3N0KHJvdyk7XG4gIGlmICh1c2FnZS5pbnB1dFRva2VucyA9PT0gcm93LmlucHV0X3Rva2VucykgcmV0dXJuIHJvdztcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHsgLi4ucm93LCBpbnB1dF90b2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zIH07XG4gIGlmICh1c2FnZS5tb2RlbCkge1xuICAgIG5vcm1hbGl6ZWQuY29zdF91c2QgPSBNYXRoLnJvdW5kKGNhbGN1bGF0ZUNvc3RVc2QodXNhZ2UubW9kZWwsIHVzYWdlKSAqIE1JQ1JPX1VTRCk7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbi8qXG4gIFJlcXVlc3RMb2cgTW9kZWxcbiovXG5jbGFzcyBSZXF1ZXN0TG9nTW9kZWxDbGFzcyBleHRlbmRzIEJhc2VNb2RlbENsYXNzPFxuICBSZXF1ZXN0TG9nU3Vic2V0S2V5LFxuICBSZXF1ZXN0TG9nU3Vic2V0TWFwcGluZyxcbiAgdHlwZW9mIHJlcXVlc3RMb2dTdWJzZXRRdWVyaWVzLFxuICB0eXBlb2YgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXNcbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlJlcXVlc3RMb2dcIiwgcmVxdWVzdExvZ1N1YnNldFF1ZXJpZXMsIHJlcXVlc3RMb2dMb2FkZXJRdWVyaWVzKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiUmVxdWVzdExvZ1wiIH0pXG4gIGFzeW5jIGZpbmRCeUlkPFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgaWQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTxSZXF1ZXN0TG9nU3Vic2V0TWFwcGluZ1tUXT4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIGlkLFxuICAgICAgbnVtOiAxLFxuICAgICAgcGFnZTogMSxcbiAgICB9KTtcbiAgICBpZiAoIXJvd3NbMF0pIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmVudGl0eU5vdEZvdW5kXCIpKFwiUmVxdWVzdExvZ1wiLCBpZCkpO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzWzBdO1xuICB9XG5cbiAgYXN5bmMgZmluZE9uZTxUIGV4dGVuZHMgUmVxdWVzdExvZ1N1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIGxpc3RQYXJhbXM6IFJlcXVlc3RMb2dMaXN0UGFyYW1zLFxuICApOiBQcm9taXNlPFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nW1RdIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIC4uLmxpc3RQYXJhbXMsXG4gICAgICBudW06IDEsXG4gICAgICBwYWdlOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJvd3NbMF0gPz8gbnVsbDtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiUmVxdWVzdExvZ3NcIiB9KVxuICBhc3luYyBmaW5kTWFueTxUIGV4dGVuZHMgUmVxdWVzdExvZ1N1YnNldEtleSwgTFAgZXh0ZW5kcyBSZXF1ZXN0TG9nTGlzdFBhcmFtcz4oXG4gICAgc3Vic2V0OiBULFxuICAgIHJhd1BhcmFtcz86IExQLFxuICApOiBQcm9taXNlPExpc3RSZXN1bHQ8TFAsIFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nW1RdPj4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMjQsXG4gICAgICBwYWdlOiAxLFxuICAgICAgc2VhcmNoOiBcImlkXCIgYXMgY29uc3QsXG4gICAgICBvcmRlckJ5OiBcImlkLWRlc2NcIiBhcyBjb25zdCxcbiAgICAgIC4uLnJhd1BhcmFtcyxcbiAgICB9IHNhdGlzZmllcyBSZXF1ZXN0TG9nTGlzdFBhcmFtcztcblxuICAgIGNvbnN0IHsgcWIsIG9uU3Vic2V0OiBfIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcblxuICAgIGlmIChwYXJhbXMuaWQpIHtcbiAgICAgIHFiLndoZXJlSW4oXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgYXNBcnJheShwYXJhbXMuaWQpKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnRva2VuX25hbWUpIHtcbiAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnRva2VuX25hbWVcIiwgcGFyYW1zLnRva2VuX25hbWUpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucHJvamVjdF9uYW1lX2lzX251bGwpIHtcbiAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnByb2plY3RfbmFtZVwiLCBudWxsKTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5wcm9qZWN0X25hbWVfaXNfbm90X251bGwpIHtcbiAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnByb2plY3RfbmFtZVwiLCBcIiE9XCIsIG51bGwpO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnByb2plY3RfbmFtZSkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsIHBhcmFtcy5wcm9qZWN0X25hbWUpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubW9kZWxfbmFtZSkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MubW9kZWxfbmFtZVwiLCBwYXJhbXMubW9kZWxfbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zZWFyY2ggJiYgcGFyYW1zLmtleXdvcmQgJiYgcGFyYW1zLmtleXdvcmQubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHBhcmFtcy5zZWFyY2ggPT09IFwiaWRcIikge1xuICAgICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5pZFwiLCBOdW1iZXIocGFyYW1zLmtleXdvcmQpKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJ0b2tlbl9uYW1lXCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MudG9rZW5fbmFtZVwiLCBcImxpa2VcIiwgYCUke3BhcmFtcy5rZXl3b3JkfSVgKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJ1c2VyX3Byb21wdFwiKSB7XG4gICAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnVzZXJfcHJvbXB0XCIsIFwibGlrZVwiLCBgJSR7cGFyYW1zLmtleXdvcmR9JWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci51bmtub3duU2VhcmNoRmllbGRcIikocGFyYW1zLnNlYXJjaCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG9yZGVyQnlcbiAgICBpZiAocGFyYW1zLm9yZGVyQnkpIHtcbiAgICAgIC8vIGRlZmF1bHQgb3JkZXJCeVxuICAgICAgaWYgKHBhcmFtcy5vcmRlckJ5ID09PSBcImlkLWRlc2NcIikge1xuICAgICAgICBxYi5vcmRlckJ5KFwicmVxdWVzdF9sb2dzLmlkXCIsIFwiZGVzY1wiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aGF1c3RpdmUocGFyYW1zLm9yZGVyQnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHtcbiAgICAgIEE6IChyb3cpID0+IG5vcm1hbGl6ZUxlZ2FjeUFudGhyb3BpY1Jvdyhyb3cpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHtcbiAgICAgIHN1YnNldCxcbiAgICAgIHFiLFxuICAgICAgcGFyYW1zLFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHNhdmUoc3BhOiBSZXF1ZXN0TG9nU2F2ZVBhcmFtc1tdKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG5cbiAgICAvLyByZWdpc3RlclxuICAgIHNwYS5mb3JFYWNoKChzcCkgPT4ge1xuICAgICAgd2RiLnViUmVnaXN0ZXIoXCJyZXF1ZXN0X2xvZ3NcIiwgc3ApO1xuICAgIH0pO1xuXG4gICAgLy8gdHJhbnNhY3Rpb25cbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGNvbnN0IGlkcyA9IGF3YWl0IHRyeC51YlVwc2VydChcInJlcXVlc3RfbG9nc1wiKTtcblxuICAgICAgcmV0dXJuIGlkcztcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSdW4gTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGNyZWF0ZVJ1bihwYXJhbXM6IHtcbiAgICB1c2VyX3Byb21wdDogc3RyaW5nO1xuICAgIHN5c3RlbV9wcm9tcHQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIG1vZGVsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIGVmZm9ydD86IHN0cmluZyB8IG51bGw7XG4gICAgcHJvamVjdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICBoaXN0b3J5PzogdW5rbm93bjtcbiAgfSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICB3ZGIudWJSZWdpc3RlcihcInJlcXVlc3RfbG9nc1wiLCB7XG4gICAgICB1c2VyX3Byb21wdDogcGFyYW1zLnVzZXJfcHJvbXB0LFxuICAgICAgc3lzdGVtX3Byb21wdDogcGFyYW1zLnN5c3RlbV9wcm9tcHQgPz8gbnVsbCxcbiAgICAgIG1vZGVsX25hbWU6IHBhcmFtcy5tb2RlbF9uYW1lID8/IG51bGwsXG4gICAgICBlZmZvcnQ6IHBhcmFtcy5lZmZvcnQgPz8gbnVsbCxcbiAgICAgIHByb2plY3RfbmFtZTogcGFyYW1zLnByb2plY3RfbmFtZSA/PyBudWxsLFxuICAgICAgc3RhdHVzOiBcInJ1bm5pbmdcIixcbiAgICAgIHJlc3BvbnNlOiBcIlwiLFxuICAgICAgaW5wdXRfdG9rZW5zOiAwLFxuICAgICAgb3V0cHV0X3Rva2VuczogMCxcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiAwLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiAwLFxuICAgICAgZHVyYXRpb25fbXM6IDAsXG4gICAgICB0b29sX2NhbGxfY291bnQ6IDAsXG4gICAgICAuLi4ocGFyYW1zLmhpc3RvcnkgIT09IHVuZGVmaW5lZCA/IHsgaGlzdG9yeTogcGFyYW1zLmhpc3RvcnkgYXMgeyB0eXBlOiBzdHJpbmcgfVtdIH0gOiB7fSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBjb25zdCBpZHMgPSBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ3NcIik7XG4gICAgICByZXR1cm4gaWRzWzBdITtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkOiBudW1iZXIsIHN0ZXA6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHdkYi51YlJlZ2lzdGVyKFwicmVxdWVzdF9sb2dfc3RlcHNcIiwgeyByZXF1ZXN0X2xvZ19pZDogcmVxdWVzdExvZ0lkLCAuLi5zdGVwIH0pO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gYXdhaXQgdHJ4LnViVXBzZXJ0KFwicmVxdWVzdF9sb2dfc3RlcHNcIik7XG4gICAgICBpZiAoc3RlcC50eXBlID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgICAgIGF3YWl0IHRyeC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpLndoZXJlKFwiaWRcIiwgcmVxdWVzdExvZ0lkKS5pbmNyZW1lbnQoXCJ0b29sX2NhbGxfY291bnRcIiwgMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaWRzWzBdITtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaFJ1bihcbiAgICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN0YXR1czogc3RyaW5nO1xuICAgICAgcmVzcG9uc2U/OiBzdHJpbmc7XG4gICAgICB0b2tlbl9uYW1lPzogc3RyaW5nO1xuICAgICAgaW5wdXRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgb3V0cHV0X3Rva2Vucz86IG51bWJlcjtcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zPzogbnVtYmVyO1xuICAgICAgZHVyYXRpb25fbXM/OiBudW1iZXI7XG4gICAgICBoaXN0b3J5PzogdW5rbm93bjtcbiAgICAgIGVycm9yX21lc3NhZ2U/OiBzdHJpbmc7XG4gICAgICB0b29sX2NhbGxfY291bnQ/OiBudW1iZXI7XG4gICAgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHBhcmFtcy5zdGF0dXMgPT09IFwic3VjY2VlZGVkXCIgJiYgIXBhcmFtcy50b2tlbl9uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0b2tlbk5hbWUgaXMgcmVxdWlyZWQgZm9yIHN1Y2NlZWRlZCBydW5zXCIpO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBpZDogcmVxdWVzdExvZ0lkLCBzdGF0dXM6IHBhcmFtcy5zdGF0dXMgfTtcbiAgICBjb25zdCBmaWVsZHMgPSBbXG4gICAgICBcInJlc3BvbnNlXCIsXG4gICAgICBcInRva2VuX25hbWVcIixcbiAgICAgIFwiaW5wdXRfdG9rZW5zXCIsXG4gICAgICBcIm91dHB1dF90b2tlbnNcIixcbiAgICAgIFwiY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgICAgIFwiY2FjaGVfY3JlYXRpb25fdG9rZW5zXCIsXG4gICAgICBcImR1cmF0aW9uX21zXCIsXG4gICAgICBcImVycm9yX21lc3NhZ2VcIixcbiAgICAgIFwidG9vbF9jYWxsX2NvdW50XCIsXG4gICAgXSBhcyBjb25zdDtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWVsZHMpIHtcbiAgICAgIGlmIChwYXJhbXNba2V5XSAhPT0gdW5kZWZpbmVkKSB1cGRhdGVba2V5XSA9IHBhcmFtc1trZXldO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmhpc3RvcnkgIT09IHVuZGVmaW5lZCkgdXBkYXRlLmhpc3RvcnkgPSBwYXJhbXMuaGlzdG9yeTtcbiAgICB1cGRhdGUudHRmdF9tcyA9IChhd2FpdCB0aGlzLmZpcnN0R2VuZXJhdGVTdGVwVHRmdChyZXF1ZXN0TG9nSWQpKSA/PyAwO1xuXG4gICAgaWYgKHBhcmFtcy5pbnB1dF90b2tlbnMgIT09IHVuZGVmaW5lZCAmJiBwYXJhbXMub3V0cHV0X3Rva2VucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBkYiA9IHRoaXMuZ2V0REIoXCJyXCIpO1xuICAgICAgY29uc3QgW3Jvd10gPSBhd2FpdCBkYihcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgICAuc2VsZWN0KFwibW9kZWxfbmFtZVwiKVxuICAgICAgICAud2hlcmUoXCJpZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAgIC5saW1pdCgxKTtcbiAgICAgIGlmIChyb3c/Lm1vZGVsX25hbWUpIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBjYW5vbmljYWxNb2RlbE5hbWUocm93Lm1vZGVsX25hbWUpO1xuICAgICAgICBjb25zdCB1c2FnZSA9IG5vcm1hbGl6ZWRVc2FnZUZvckNvc3Qoe1xuICAgICAgICAgIHRva2VuX25hbWU6IHBhcmFtcy50b2tlbl9uYW1lLFxuICAgICAgICAgIG1vZGVsX25hbWU6IHJvdy5tb2RlbF9uYW1lLFxuICAgICAgICAgIGlucHV0X3Rva2VuczogcGFyYW1zLmlucHV0X3Rva2VucyxcbiAgICAgICAgICBvdXRwdXRfdG9rZW5zOiBwYXJhbXMub3V0cHV0X3Rva2VucyxcbiAgICAgICAgICBjYWNoZV9yZWFkX3Rva2VuczogcGFyYW1zLmNhY2hlX3JlYWRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBwYXJhbXMuY2FjaGVfY3JlYXRpb25fdG9rZW5zID8/IDAsXG4gICAgICAgIH0pO1xuICAgICAgICB1cGRhdGUuY29zdF91c2QgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgIGNhbGN1bGF0ZUNvc3RVc2QobW9kZWwsIHtcbiAgICAgICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgIG91dHB1dFRva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IHVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMsXG4gICAgICAgICAgfSkgKiAxXzAwMF8wMDAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICB3ZGIudWJSZWdpc3RlcihcInJlcXVlc3RfbG9nc1wiLCB1cGRhdGUpO1xuICAgIGF3YWl0IHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ3NcIik7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmaXJzdEdlbmVyYXRlU3RlcFR0ZnQocmVxdWVzdExvZ0lkOiBudW1iZXIpOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcbiAgICBjb25zdCBkYiA9IHRoaXMuZ2V0REIoXCJyXCIpO1xuICAgIGNvbnN0IFtyb3ddID0gYXdhaXQgZGIoXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdChcInR0ZnRfbXNcIilcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInR5cGVcIiwgXCJnZW5lcmF0ZVwiKVxuICAgICAgLndoZXJlTm90TnVsbChcInR0ZnRfbXNcIilcbiAgICAgIC5vcmRlckJ5KFwic3RlcF9pbmRleFwiLCBcImFzY1wiKVxuICAgICAgLm9yZGVyQnkoXCJpZFwiLCBcImFzY1wiKVxuICAgICAgLmxpbWl0KDEpO1xuICAgIHJldHVybiByb3c/LnR0ZnRfbXMgPT09IG51bGwgfHwgcm93Py50dGZ0X21zID09PSB1bmRlZmluZWQgPyBudWxsIDogTnVtYmVyKHJvdy50dGZ0X21zKTtcbiAgfVxuXG4gIGFzeW5jIGFnZ3JlZ2F0ZVN0ZXBVc2FnZShyZXF1ZXN0TG9nSWQ6IG51bWJlcik6IFByb21pc2U8e1xuICAgIGlucHV0X3Rva2VuczogbnVtYmVyO1xuICAgIG91dHB1dF90b2tlbnM6IG51bWJlcjtcbiAgICBjYWNoZV9yZWFkX3Rva2VuczogbnVtYmVyO1xuICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogbnVtYmVyO1xuICAgIGR1cmF0aW9uX21zOiBudW1iZXI7XG4gIH0+IHtcbiAgICBjb25zdCBkYiA9IHRoaXMuZ2V0REIoXCJyXCIpO1xuICAgIGNvbnN0IFtyb3ddID0gYXdhaXQgZGIoXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLndoZXJlKFwidHlwZVwiLCBcImdlbmVyYXRlXCIpXG4gICAgICAuc3VtKHtcbiAgICAgICAgaW5wdXRfdG9rZW5zOiBcImlucHV0X3Rva2Vuc1wiLFxuICAgICAgICBvdXRwdXRfdG9rZW5zOiBcIm91dHB1dF90b2tlbnNcIixcbiAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IFwiY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBcImNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICAgICAgICBkdXJhdGlvbl9tczogXCJkdXJhdGlvbl9tc1wiLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0X3Rva2VuczogTnVtYmVyKHJvdz8uaW5wdXRfdG9rZW5zID8/IDApLFxuICAgICAgb3V0cHV0X3Rva2VuczogTnVtYmVyKHJvdz8ub3V0cHV0X3Rva2VucyA/PyAwKSxcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBOdW1iZXIocm93Py5jYWNoZV9yZWFkX3Rva2VucyA/PyAwKSxcbiAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogTnVtYmVyKHJvdz8uY2FjaGVfY3JlYXRpb25fdG9rZW5zID8/IDApLFxuICAgICAgZHVyYXRpb25fbXM6IE51bWJlcihyb3c/LmR1cmF0aW9uX21zID8/IDApLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmaW5kU3RhbGVSdW5uaW5nSWRzKHRocmVzaG9sZE1zOiBudW1iZXIsIGxpbWl0OiBudW1iZXIgPSAxMCk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCBkYiA9IHRoaXMuZ2V0REIoXCJyXCIpO1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IG5ldyBEYXRlKERhdGUubm93KCkgLSB0aHJlc2hvbGRNcyk7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IGRiKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAuc2VsZWN0KFwiaWRcIilcbiAgICAgIC53aGVyZShcInN0YXR1c1wiLCBcInJ1bm5pbmdcIilcbiAgICAgIC53aGVyZShcImNyZWF0ZWRfYXRcIiwgXCI8XCIsIHRocmVzaG9sZClcbiAgICAgIC5saW1pdChsaW1pdCk7XG4gICAgcmV0dXJuIHJvd3MubWFwKChyOiB7IGlkOiBudW1iZXIgfSkgPT4gci5pZCk7XG4gIH1cblxuICBhc3luYyBnZXROZXh0U3RlcEluZGV4KHJlcXVlc3RMb2dJZDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBkYiA9IHRoaXMuZ2V0REIoXCJyXCIpO1xuICAgIGNvbnN0IFtyb3ddID0gYXdhaXQgZGIoXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLm1heChcInN0ZXBfaW5kZXggYXMgbWF4U3RlcFwiKTtcbiAgICByZXR1cm4gKChyb3cgYXMgeyBtYXhTdGVwOiBudW1iZXIgfCBudWxsIH0pPy5tYXhTdGVwID8/IC0xKSArIDE7XG4gIH1cblxuICBhc3luYyBjb21wbGV0ZVRvb2xDYWxsKFxuICAgIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICAgIHRvb2xDYWxsSWQ6IHN0cmluZyxcbiAgICBwYXJhbXM6IHsgdG9vbF9yZXN1bHQ/OiBzdHJpbmc7IHRvb2xfZHVyYXRpb25fbXM/OiBudW1iZXI7IGVycm9yPzogc3RyaW5nIH0sXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0cnhcbiAgICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAgIC53aGVyZShcInRvb2xfY2FsbF9pZFwiLCB0b29sQ2FsbElkKVxuICAgICAgICAud2hlcmUoXCJ0eXBlXCIsIFwidG9vbF9jYWxsXCIpXG4gICAgICAgIC51cGRhdGUoe1xuICAgICAgICAgIC4uLihwYXJhbXMudG9vbF9yZXN1bHQgIT09IHVuZGVmaW5lZCA/IHsgdG9vbF9yZXN1bHQ6IHBhcmFtcy50b29sX3Jlc3VsdCB9IDoge30pLFxuICAgICAgICAgIC4uLihwYXJhbXMudG9vbF9kdXJhdGlvbl9tcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHsgdG9vbF9kdXJhdGlvbl9tczogcGFyYW1zLnRvb2xfZHVyYXRpb25fbXMgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgLi4uKHBhcmFtcy5lcnJvciAhPT0gdW5kZWZpbmVkID8geyBlcnJvcjogcGFyYW1zLmVycm9yIH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfSk7XG4gIH1cblxuICAvLyBTb25hbXUgZmluZE1hbnnripQgc3Vic2V0IOyghOyytCDsu6zrn7wodGV4dCDtj6ztlagp7J2EIO2OmOy5mO2VtOyEnCBhZ2dyZWdhdGXsl5Qg64SI66y0IOustOqxsOybgCDihpIgcmF3IHN1bSDsgqzsmqkuXG4gIGFzeW5jIHRvdGFsQ29zdChwYXJhbXM6IHsgdG9rZW5fbmFtZT86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHFiID0gdGhpcy5nZXREQihcInJcIikoXCJyZXF1ZXN0X2xvZ3NcIik7XG4gICAgaWYgKHBhcmFtcy50b2tlbl9uYW1lKSB7XG4gICAgICBxYi53aGVyZShcInRva2VuX25hbWVcIiwgcGFyYW1zLnRva2VuX25hbWUpO1xuICAgIH1cbiAgICAvLyDquLDsobQgY29zdF91c2Qg7JeQ64qUIOqzvOqxsCBBbnRocm9waWMgY2FjaGUg6rOE7IKwIOuyhOq3uOuhnCDsnYzsiJjqsIAg7KCA7J6l65CcIHJvdyDqsIAg7J6I7J2EIOyImCDsnojri6QuXG4gICAgLy8g7ZmU66m0IOynkeqzhOuKlCDsoIDsnqXqsJIgc3VtIOydtCDslYTri4jrnbwg7ZiE7J6sIOqzhOyCsOyLneycvOuhnCB1c2FnZSDrpbwg7J6s6rOE7IKw7ZW0IOqzvOqxsCDroZzqt7jrj4Qg7KaJ7IucIOuztOygle2VnOuLpC5cbiAgICBjb25zdCByb3dzID0gKGF3YWl0IHFiLnNlbGVjdChcbiAgICAgIFwibW9kZWxfbmFtZVwiLFxuICAgICAgXCJpbnB1dF90b2tlbnNcIixcbiAgICAgIFwib3V0cHV0X3Rva2Vuc1wiLFxuICAgICAgXCJjYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICAgICAgXCJjYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgICAgIFwiY29zdF91c2RcIixcbiAgICApKSBhcyBBcnJheTx7XG4gICAgICBtb2RlbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgICAgaW5wdXRfdG9rZW5zOiBudW1iZXI7XG4gICAgICBvdXRwdXRfdG9rZW5zOiBudW1iZXI7XG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogbnVtYmVyO1xuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBudW1iZXI7XG4gICAgICBjb3N0X3VzZDogbnVtYmVyIHwgbnVsbDtcbiAgICB9PjtcblxuICAgIHJldHVybiByb3dzLnJlZHVjZSgoc3VtLCByb3cpID0+IHtcbiAgICAgIGNvbnN0IHVzYWdlID0gbm9ybWFsaXplZFVzYWdlRm9yQ29zdChyb3cpO1xuICAgICAgaWYgKCF1c2FnZS5tb2RlbCkgcmV0dXJuIHN1bSArIE1hdGgubWF4KHJvdy5jb3N0X3VzZCA/PyAwLCAwKSAvIE1JQ1JPX1VTRDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHN1bSArXG4gICAgICAgIGNhbGN1bGF0ZUNvc3RVc2QodXNhZ2UubW9kZWwsIHtcbiAgICAgICAgICBpbnB1dFRva2VuczogdXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgb3V0cHV0VG9rZW5zOiB1c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IHVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIGFzeW5jIGRpc3RpbmN0UHJvamVjdE5hbWVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC5kaXN0aW5jdChcInByb2plY3RfbmFtZVwiKVxuICAgICAgLndoZXJlKFwicHJvamVjdF9uYW1lXCIsIFwiIT1cIiwgbnVsbClcbiAgICAgIC5vcmRlckJ5KFwicHJvamVjdF9uYW1lXCIsIFwiYXNjXCIpXG4gICAgICAuc2VsZWN0KHtcbiAgICAgICAgcHJvamVjdF9uYW1lOiBcInByb2plY3RfbmFtZVwiLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHJvd3MubWFwKChyKSA9PiByLnByb2plY3RfbmFtZSEpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGRlbChpZHM6IG51bWJlcltdKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuXG4gICAgLy8gdHJhbnNhY3Rpb25cbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgYXdhaXQgdHJ4XG4gICAgICAgIC50YWJsZShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAgIC53aGVyZUluKFwicmVxdWVzdF9sb2dfc3RlcHMucmVxdWVzdF9sb2dfaWRcIiwgaWRzKVxuICAgICAgICAuZGVsZXRlKCk7XG4gICAgICByZXR1cm4gdHJ4LnRhYmxlKFwicmVxdWVzdF9sb2dzXCIpLndoZXJlSW4oXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgaWRzKS5kZWxldGUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpZHMubGVuZ3RoO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBSZXF1ZXN0TG9nTW9kZWwgPSBuZXcgUmVxdWVzdExvZ01vZGVsQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFpQkEsTUFBYSxZQUFZO0FBWXpCLFNBQVMsb0JBQW9CLEtBQXFFO0FBQ2hHLFFBQ0UsSUFBSSxZQUFZLFdBQVcsYUFBYSxLQUFLLFFBQzdDLElBQUks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
|