@cartanova/qgrid-cli 2.3.1 → 2.3.2
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.
|
@@ -35,6 +35,10 @@ const QGRID_CLAUDE_SETTINGS = {
|
|
|
35
35
|
cleanupPeriodDays: 1
|
|
36
36
|
};
|
|
37
37
|
const REFRESH_SAFETY_MS = 6e4;
|
|
38
|
+
function buildStrictOutputSchema(input) {
|
|
39
|
+
const outputSchema = input.tools?.length ? buildToolCallSchema(input.tools) : input.jsonSchema ? JSON.parse(input.jsonSchema) : void 0;
|
|
40
|
+
return outputSchema ? strictify(outputSchema) : void 0;
|
|
41
|
+
}
|
|
38
42
|
var QgridDispatcherClass = class {
|
|
39
43
|
tokens = /* @__PURE__ */ new Map();
|
|
40
44
|
requestCounts = /* @__PURE__ */ new Map();
|
|
@@ -81,7 +85,7 @@ var QgridDispatcherClass = class {
|
|
|
81
85
|
}
|
|
82
86
|
async query(input, timeoutMs) {
|
|
83
87
|
if (input.tools?.length && input.jsonSchema) throw new ProcessError("tools and jsonSchema cannot be used together");
|
|
84
|
-
const outputSchema =
|
|
88
|
+
const outputSchema = buildStrictOutputSchema(input);
|
|
85
89
|
if (input.model?.includes("/")) {
|
|
86
90
|
const [provider, model] = input.model.split("/", 2);
|
|
87
91
|
assert(model, "unknown model");
|
|
@@ -91,7 +95,7 @@ var QgridDispatcherClass = class {
|
|
|
91
95
|
const result = await this.openaiDispatcher.generate({
|
|
92
96
|
model,
|
|
93
97
|
systemPrompt: input.system,
|
|
94
|
-
outputSchema
|
|
98
|
+
outputSchema,
|
|
95
99
|
effort: input.effort,
|
|
96
100
|
verbosity: input.verbosity,
|
|
97
101
|
reasoningSummary: input.reasoningSummary,
|
|
@@ -110,7 +114,7 @@ var QgridDispatcherClass = class {
|
|
|
110
114
|
const result = await this.anthropicDispatcher.generate({
|
|
111
115
|
model: input.model,
|
|
112
116
|
systemPrompt: input.system,
|
|
113
|
-
outputSchema
|
|
117
|
+
outputSchema,
|
|
114
118
|
effort: input.effort,
|
|
115
119
|
coldInput: decision.coldInput,
|
|
116
120
|
coldHistory: decision.coldHistory,
|
|
@@ -120,7 +124,7 @@ var QgridDispatcherClass = class {
|
|
|
120
124
|
const issuedCoord = issueConvContext(result.threadCoord, decision);
|
|
121
125
|
return applyToolCallEmulation(toEmulationResult(result), input.tools, issuedCoord);
|
|
122
126
|
}
|
|
123
|
-
const executionInput = outputSchema
|
|
127
|
+
const executionInput = outputSchema ? {
|
|
124
128
|
...input,
|
|
125
129
|
jsonSchema: JSON.stringify(outputSchema)
|
|
126
130
|
} : input;
|
|
@@ -145,12 +149,12 @@ var QgridDispatcherClass = class {
|
|
|
145
149
|
async queryStream(input, cb) {
|
|
146
150
|
if (!input.model?.startsWith("openai/")) {
|
|
147
151
|
if (this.anthropicDispatcher) {
|
|
148
|
-
const outputSchema =
|
|
152
|
+
const outputSchema = buildStrictOutputSchema(input);
|
|
149
153
|
const decision = decideConvRouting(input);
|
|
150
154
|
await this.anthropicDispatcher.generateStream({
|
|
151
155
|
model: input.model,
|
|
152
156
|
systemPrompt: input.system,
|
|
153
|
-
outputSchema
|
|
157
|
+
outputSchema,
|
|
154
158
|
effort: input.effort,
|
|
155
159
|
coldInput: decision.coldInput,
|
|
156
160
|
coldHistory: decision.coldHistory,
|
|
@@ -174,12 +178,12 @@ var QgridDispatcherClass = class {
|
|
|
174
178
|
const [, model] = input.model.split("/", 2);
|
|
175
179
|
if (!model) throw new ProcessError("unknown model");
|
|
176
180
|
if (!this.openaiDispatcher) throw new QuotaError("OpenAI dispatcher not initialized");
|
|
177
|
-
const outputSchema =
|
|
181
|
+
const outputSchema = buildStrictOutputSchema(input);
|
|
178
182
|
const decision = decideConvRouting(input);
|
|
179
183
|
await this.openaiDispatcher.generateStream({
|
|
180
184
|
model,
|
|
181
185
|
systemPrompt: input.system,
|
|
182
|
-
outputSchema
|
|
186
|
+
outputSchema,
|
|
183
187
|
effort: input.effort,
|
|
184
188
|
verbosity: input.verbosity,
|
|
185
189
|
reasoningSummary: input.reasoningSummary,
|
|
@@ -343,6 +347,6 @@ async function executeClaude(input, token, timeoutMs) {
|
|
|
343
347
|
}
|
|
344
348
|
const QgridDispatcher = new QgridDispatcherClass();
|
|
345
349
|
//#endregion
|
|
346
|
-
export { QgridDispatcher, QgridDispatcherClass };
|
|
350
|
+
export { QgridDispatcher, QgridDispatcherClass, buildStrictOutputSchema };
|
|
347
351
|
|
|
348
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJub2RlOmFzc2VydFwiO1xuLyoqXG4gKiBRZ3JpZERpc3BhdGNoZXIg4oCUIE9BdXRoIO2GoO2BsCDshKDtg50gKyBjbGF1ZGUgQ0xJIGZyZXNoIHNwYXduIOuUlOyKpO2MqOyymCDsi7HquIDthLQuXG4gKlxuICogLSDrp6Qg7JqU7LKt66eI64ukIOyDiCBjbGF1ZGUgQ0xJIO2UhOuhnOyEuOyKpCBzcGF3biDihpIg7J2R64u1IO2bhCDsooXro4xcbiAqIC0gbGVhc3QtdXNlZCByb3VuZC1yb2JpbiDsnLzroZwg7Yag7YGwIOyEoO2DnVxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBxdWVyeSDsi5wgZXhwaXJlc19hdCDruYTqtZAg4oaSIOyehOuwlSDsi5wgcHJlZW1wdGl2ZSByZWZyZXNoXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMICjsnpDrj5kgZmFpbG92ZXIg7JeG7J2MLCBVSSDsl5DshJwg7IiY64+ZIO2GoOq4gClcbiAqXG4gKiBlbnYgYWxsb3dsaXN0OiBQQVRILCBUTVBESVIsIENMQVVERV9DT0RFX09BVVRIX1RPS0VOLCBDTEFVREVfQ09ORklHX0RJUlxuICogICArIENMQVVERV9DT0RFX0RJU0FCTEVfKiArIENMQVVERV9DT0RFX0FUVFJJQlVUSU9OX0hFQURFUlxuICovXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IG1rZGlyU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQgeyBjYW5vbmljYWxBbnRocm9waWNNb2RlbCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1jb25zdGFudHNcIjtcbmltcG9ydCB7IHR5cGUgQW50aHJvcGljRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQge1xuICBnZXRBY2Nlc3NUb2tlbixcbiAgZ2V0RXhwaXJlc0F0LFxuICBnZXRSZWZyZXNoVG9rZW4sXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2NyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVDb3N0VXNkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vbW9kZWwtY29zdFwiO1xuaW1wb3J0IHsgdHlwZSBHZW5lcmF0ZVJlc3VsdCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IHN0cmljdGlmeSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3N0cmljdGlmaWVyXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSURpc3BhdGNoZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgZGVjaWRlQ29udlJvdXRpbmcsIGlzc3VlQ29udkNvbnRleHQgfSBmcm9tIFwiLi9jb252LXJvdXRpbmdcIjtcbmltcG9ydCB7IHR5cGUgUXVlcnlJbnB1dCwgdHlwZSBRdWVyeU91dHB1dCwgdHlwZSBUb2tlblN0YXRzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IG1hc2tUb2tlbiwgUHJvY2Vzc0Vycm9yLCBRdW90YUVycm9yLCBUaW1lb3V0RXJyb3IgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNjcmliZXIgfSBmcm9tIFwiLi90b2tlbi1zdWJzY3JpYmVyXCI7XG5pbXBvcnQgeyBhcHBseVRvb2xDYWxsRW11bGF0aW9uLCBidWlsZFRvb2xDYWxsU2NoZW1hIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb25cIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCJdKTtcblxuY29uc3QgREVGQVVMVF9NT0RFTCA9IFwic29ubmV0XCI7XG5jb25zdCBERUZBVUxUX1RJTUVPVVRfTVMgPSA2MDBfMDAwO1xuY29uc3QgREVGQVVMVF9FRkZPUlQgPSBcImhpZ2hcIjtcblxuLy8gY2xhdWRlIENMSSDsnZggY3dkLiDsnbQg6rK966Gc7J2YIC5jbGF1ZGUvc2V0dGluZ3MuanNvbiDsnbQgcHJvamVjdCBzY29wZSDroZwg66Gc65Oc65CY7Ja0XG4vLyDtmLnsi5zrnbzrj4Qg7J6I7J2EIHVzZXIgc2NvcGUgKH4vLmNsYXVkZS9zZXR0aW5ncy5qc29uKeulvCDrja7slrTslIAgKC0tc2V0dGluZy1zb3VyY2VzIHByb2plY3Qg7JmAIO2VqOq7mCkuXG5jb25zdCBDTEFVREVfQ1dEID0gXCIvdG1wL3FncmlkXCI7XG5cbi8vIOq4gOuhnOuyjCB1c2VyIGNvbmZpZyDqsqnrpqwg6rK966GcLiAoQ0Psl5DshJwg7ZmY6rK967OA7IiY66GcIOydveuKlOuzgOyImClcbmNvbnN0IENMQVVERV9DT05GSUdfRElSID0gXCIvdG1wL3FncmlkLWNvbmZpZ1wiO1xuXG4vLyBxZ3JpZCDsoITsmqkgcHJvamVjdC9nbG9iYWwgc2V0dGluZ3Mg4oCUIHVzZXIgc2NvcGUg6rKp66as7JqpXG5jb25zdCBRR1JJRF9DTEFVREVfU0VUVElOR1MgPSB7XG4gIGFsd2F5c1RoaW5raW5nRW5hYmxlZDogZmFsc2UsIC8vIHRoaW5raW5nIGJsb2NrIOywqOuLqFxuICBpbmNsdWRlR2l0SW5zdHJ1Y3Rpb25zOiBmYWxzZSwgLy8gc3lzdGVtIHByb21wdCDsnZggZ2l0IOqwgOydtOuTnCDsoJzqsbBcbiAgY2xlYW51cFBlcmlvZERheXM6IDEsXG59O1xuXG4vLyDthqDtgbAg66eM66OMIOyehOuwlSDsnoTqs4TqsJIg4oCUIHRva2VuLmV4cGlyZWRBdOydtCAx67aEIOyViOyXkCDrp4zro4zrkJzri6TrqbQgcXVlcnkg7IucIOyytO2BrO2VmOqzoCByZWZyZXNoLlxuY29uc3QgUkVGUkVTSF9TQUZFVFlfTVMgPSA2MF8wMDA7XG5cbmV4cG9ydCBjbGFzcyBRZ3JpZERpc3BhdGNoZXJDbGFzcyB7XG4gIHRva2VucyA9IG5ldyBNYXA8bnVtYmVyLCBUb2tlblN1YnNldEE+KCk7XG5cbiAgLy8ga2V56riw67CYKHRva2VuTmFtZSkg64iE7KCBIOy5tOyatO2EsC4gdG9rZW4g7J20IE9BdXRoIHJlZnJlc2gg66GcIOuhnO2FjOydtO2KuOuQmOuPhCB0b2tlbk5hbWUg7J2AIOu2iOuzgOydtOudvCDsubTsmrTthLAg7Jyg7KeA65CoXG4gIHJlcXVlc3RDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICByckluZGV4ID0gMDtcblxuICAvLyBzb25hbXUuY29uZmlnIG9uU3RhcnQg7JeQ7IScIOyymOumrO2VmOuKlCDrs4DsiJhcbiAgc3Vic2NyaWJlcjogVG9rZW5TdWJzY3JpYmVyIHwgbnVsbCA9IG51bGw7XG4gIG9wZW5haURpc3BhdGNoZXI6IE9wZW5BSURpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgYW50aHJvcGljRGlzcGF0Y2hlcjogQW50aHJvcGljRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGNvbnN0IHNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KFFHUklEX0NMQVVERV9TRVRUSU5HUywgbnVsbCwgMik7XG5cbiAgICBta2RpclN5bmMoYCR7Q0xBVURFX0NXRH0vLmNsYXVkZWAsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHdyaXRlRmlsZVN5bmMoYCR7Q0xBVURFX0NXRH0vLmNsYXVkZS9zZXR0aW5ncy5qc29uYCwgc2V0dGluZ3NKc29uKTtcblxuICAgIG1rZGlyU3luYyhDTEFVREVfQ09ORklHX0RJUiwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgd3JpdGVGaWxlU3luYyhgJHtDTEFVREVfQ09ORklHX0RJUn0vLmNsYXVkZS5qc29uYCwgXCJ7fVwiKTtcbiAgICB3cml0ZUZpbGVTeW5jKGAke0NMQVVERV9DT05GSUdfRElSfS9zZXR0aW5ncy5qc29uYCwgc2V0dGluZ3NKc29uKTtcbiAgfVxuXG4gIGNvdW50T2YobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0Q291bnRzLmdldChuYW1lKSA/PyAwO1xuICB9XG5cbiAgLy8gVG9rZW5TdWJzY3JpYmVyIOy9nOuwsSDigJQg7LqQ7IucIG11dGF0aW9uXG4gIHVwc2VydENhY2hlKGlkOiBudW1iZXIsIHJvdzogVG9rZW5TdWJzZXRBKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMuc2V0KGlkLCByb3cpO1xuICB9XG5cbiAgcmVtb3ZlQ2FjaGUoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zLmRlbGV0ZShpZCk7XG4gIH1cblxuICByZXBsYWNlQ2FjaGUocm93czogVG9rZW5TdWJzZXRBW10pOiB2b2lkIHtcbiAgICB0aGlzLnRva2VucyA9IG5ldyBNYXAocm93cy5tYXAoKHIpID0+IFtyLmlkLCByXSkpO1xuICB9XG5cbiAgZ2V0U3RhdHMoKTogVG9rZW5TdGF0c1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMudG9rZW5zLnZhbHVlcygpXS5tYXAoKHIpID0+ICh7XG4gICAgICB0b2tlbjogbWFza1Rva2VuKGdldEFjY2Vzc1Rva2VuKHIuY3JlZGVudGlhbHMpKSxcbiAgICAgIG5hbWU6IHIubmFtZSxcbiAgICAgIHByb3ZpZGVyOiByLnByb3ZpZGVyLFxuICAgICAgcmVxdWVzdHM6IHRoaXMuY291bnRPZihyLm5hbWUpLFxuICAgIH0pKTtcbiAgfVxuXG4gIHNlbGVjdFRva2VuKHByb3ZpZGVyID0gXCJhbnRocm9waWNcIik6IFRva2VuU3Vic2V0QSB8IG51bGwge1xuICAgIGNvbnN0IHJvd3MgPSBbLi4udGhpcy50b2tlbnMudmFsdWVzKCldLmZpbHRlcigocikgPT4gci5wcm92aWRlciA9PT0gcHJvdmlkZXIpO1xuICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBtaW5Db3VudCA9IE1hdGgubWluKC4uLnJvd3MubWFwKChyKSA9PiB0aGlzLmNvdW50T2Yoci5uYW1lKSkpO1xuICAgIGNvbnN0IGlkbGUgPSByb3dzLmZpbHRlcigocikgPT4gdGhpcy5jb3VudE9mKHIubmFtZSkgPT09IG1pbkNvdW50KTtcbiAgICBjb25zdCBwaWNrZWQgPSBpZGxlW3RoaXMucnJJbmRleCAlIGlkbGUubGVuZ3RoXSE7XG4gICAgdGhpcy5yckluZGV4Kys7XG4gICAgcmV0dXJuIHBpY2tlZDtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5KGlucHV0OiBRdWVyeUlucHV0LCB0aW1lb3V0TXM/OiBudW1iZXIpOiBQcm9taXNlPFF1ZXJ5T3V0cHV0PiB7XG4gICAgaWYgKGlucHV0LnRvb2xzPy5sZW5ndGggJiYgaW5wdXQuanNvblNjaGVtYSkge1xuICAgICAgdGhyb3cgbmV3IFByb2Nlc3NFcnJvcihcInRvb2xzIGFuZCBqc29uU2NoZW1hIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGlucHV0LnRvb2xzPy5sZW5ndGhcbiAgICAgID8gYnVpbGRUb29sQ2FsbFNjaGVtYShpbnB1dC50b29scylcbiAgICAgIDogaW5wdXQuanNvblNjaGVtYVxuICAgICAgICA/IChKU09OLnBhcnNlKGlucHV0Lmpzb25TY2hlbWEpIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBwcm92aWRlciBwcmVmaXggcm91dGluZzogJ29wZW5haS9ncHQtNS40JyDihpIgT3BlbkFJRGlzcGF0Y2hlclxuICAgIGlmIChpbnB1dC5tb2RlbD8uaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICBjb25zdCBbcHJvdmlkZXIsIG1vZGVsXSA9IGlucHV0Lm1vZGVsLnNwbGl0KFwiL1wiLCAyKTtcbiAgICAgIGFzc2VydChtb2RlbCwgXCJ1bmtub3duIG1vZGVsXCIpO1xuICAgICAgaWYgKHByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIk9wZW5BSSBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZSh7XG4gICAgICAgICAgbW9kZWw6IG1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICAgIG91dHB1dFNjaGVtYTogb3V0cHV0U2NoZW1hXG4gICAgICAgICAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0pIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICAgIHZlcmJvc2l0eTogaW5wdXQudmVyYm9zaXR5LFxuICAgICAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IGlucHV0LnJlYXNvbmluZ1N1bW1hcnksXG4gICAgICAgICAgc2VydmljZVRpZXI6IGlucHV0LnNlcnZpY2VUaWVyLFxuICAgICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgICByZXVzZTogZGVjaXNpb24ucmV1c2UsXG4gICAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaXNzdWVkQ29vcmQgPSBpc3N1ZUNvbnZDb250ZXh0KHJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pO1xuICAgICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywgaXNzdWVkQ29vcmQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFudGhyb3BpYyDigJQgQW50aHJvcGljRGlzcGF0Y2hlcijrqYDti7DthLQgc2Vzc2lvbiByZXN1bWUpIOqyveuhnC4gT3BlbkFJIOqyveuhnOyZgCDrj5ntmJUuXG4gICAgaWYgKHRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikge1xuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICAvLyBtb2RlbCDrr7jsp4DsoJXsnbTrqbQgQW50aHJvcGljRGlzcGF0Y2hlciDqsIAgQU5USFJPUElDX0RFRkFVTFRfTU9ERUwg7KCB7JqpIOKAlCBcInNvbm5ldFwiIOuzhOy5reydhFxuICAgICAgICAvLyDqsJXsoJzroZwg64G87JuMIGRpc3BhdGNoZXIgZGVmYXVsdCDrpbwg7KO97J207KeAIOyViuuKlOuLpC4gcHJlZml4IOygleq3nO2ZlOuPhCBkaXNwYXRjaGVyIOuCtOu2gOyXkOyEnC5cbiAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgb3V0cHV0U2NoZW1hOiBvdXRwdXRTY2hlbWFcbiAgICAgICAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0pIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHJldXNlOiBkZWNpc2lvbi5yZXVzZSxcbiAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpc3N1ZWRDb29yZCA9IGlzc3VlQ29udkNvbnRleHQocmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbik7XG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywgaXNzdWVkQ29vcmQpO1xuICAgIH1cblxuICAgIC8vIO2PtOuwsTogQW50aHJvcGljRGlzcGF0Y2hlciDrr7jstIjquLDtmZQg7IucIOq4sOyhtCBzdGF0ZWxlc3MgY2xhdWRlIC1wIOqyveuhnCjrqYDti7DthLQg7JeG7J2MKS5cbiAgICBjb25zdCBleGVjdXRpb25JbnB1dCA9XG4gICAgICBvdXRwdXRTY2hlbWEgJiYgaW5wdXQudG9vbHM/Lmxlbmd0aFxuICAgICAgICA/IHsgLi4uaW5wdXQsIGpzb25TY2hlbWE6IEpTT04uc3RyaW5naWZ5KG91dHB1dFNjaGVtYSkgfVxuICAgICAgICA6IGlucHV0O1xuXG4gICAgY29uc3QgZWxlY3RlZFRva2VuID0gdGhpcy5zZWxlY3RUb2tlbigpO1xuICAgIGlmICghZWxlY3RlZFRva2VuKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIk5vIHRva2VucyBhdmFpbGFibGVcIik7XG5cbiAgICAvLyBhd2FpdCDsoITsl5AgY291bnQg7ISg67CY7JiBLiDrs5HroKwg7JqU7LKt7J20IOuPmeyLnOyXkCDrj4TssKntlbTrj4Qg6rCB7J6QIOuLpOuluCDthqDtgbDsnYQg6rOg66W064+E66GdLlxuICAgIHRoaXMucmVxdWVzdENvdW50cy5zZXQoZWxlY3RlZFRva2VuLm5hbWUsIHRoaXMuY291bnRPZihlbGVjdGVkVG9rZW4ubmFtZSkgKyAxKTtcblxuICAgIGxldCB0b2tlbiA9IGdldEFjY2Vzc1Rva2VuKGVsZWN0ZWRUb2tlbi5jcmVkZW50aWFscyk7XG4gICAgLy8gZXhwaXJlc19hdCDsnoTrsJXsnbTrqbQgcHJlZW1wdGl2ZSByZWZyZXNoXG4gICAgY29uc3QgZXhwaXJlc0F0ID0gZ2V0RXhwaXJlc0F0KGVsZWN0ZWRUb2tlbi5jcmVkZW50aWFscyk7XG4gICAgaWYgKFxuICAgICAgZXhwaXJlc0F0ICYmXG4gICAgICBleHBpcmVzQXQgLSBEYXRlLm5vdygpIDwgUkVGUkVTSF9TQUZFVFlfTVMgJiZcbiAgICAgIGdldFJlZnJlc2hUb2tlbihlbGVjdGVkVG9rZW4uY3JlZGVudGlhbHMpXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IFFncmlkRnJhbWUgfSA9IGF3YWl0IGltcG9ydChcIi4vcWdyaWQuZnJhbWVcIik7XG4gICAgICAgIHRva2VuID0gYXdhaXQgUWdyaWRGcmFtZS5yZWZyZXNoVG9rZW4oZWxlY3RlZFRva2VuKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYHJlZnJlc2ggZmFpbGVkIGZvciAke2VsZWN0ZWRUb2tlbi5uYW1lfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbyhg4oaSICR7ZWxlY3RlZFRva2VuLm5hbWV9IChtb2RlbDogJHtpbnB1dC5tb2RlbCA/PyBERUZBVUxUX01PREVMfSlgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVDbGF1ZGUoZXhlY3V0aW9uSW5wdXQsIHRva2VuLCB0aW1lb3V0TXMgPz8gREVGQVVMVF9USU1FT1VUX01TKTtcbiAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbihcbiAgICAgIC8vIG1vZGVsIOuPhCBjYW5vbmljYWwg66GcIOKAlCBmYWxsYmFjayDrj4QgY29zdC/tkZzquLDqsIAgbWFpbiDqsr3roZzsmYAg7J287LmY7ZWY6rKMLlxuICAgICAgeyAuLi5yZXN1bHQsIHRva2VuTmFtZTogZWxlY3RlZFRva2VuLm5hbWUsIG1vZGVsOiBjYW5vbmljYWxBbnRocm9waWNNb2RlbChpbnB1dC5tb2RlbCkgfSxcbiAgICAgIGlucHV0LnRvb2xzLFxuICAgICk7XG4gIH1cblxuICBhc3luYyBxdWVyeVN0cmVhbShcbiAgICBpbnB1dDogUXVlcnlJbnB1dCxcbiAgICBjYjoge1xuICAgICAgb25EZWx0YTogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgICAgIG9uQ29tcGxldGU6IChyZXN1bHQ6IFF1ZXJ5T3V0cHV0KSA9PiB2b2lkO1xuICAgICAgb25FcnJvcjogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbiAgICAgIG9uVGhyZWFkSWQ/OiAodGhyZWFkSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgICAgIG9uVHVybklkPzogKHR1cm5JZDogc3RyaW5nKSA9PiB2b2lkO1xuICAgIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEFudGhyb3BpYyDsiqTtirjrpqzrsI06IG9wZW5haS8gcHJlZml4IOqwgCDslYTri4jrqbQgYW50aHJvcGljIOqyveuhnC5cbiAgICBpZiAoIWlucHV0Lm1vZGVsPy5zdGFydHNXaXRoKFwib3BlbmFpL1wiKSkge1xuICAgICAgLy8gQW50aHJvcGljRGlzcGF0Y2hlciDqsIAg7J6I7Jy866m0IOyLpOygnCBkZWx0YSDsiqTtirjrpqzrsI0uIOyXhuycvOuptCDquLDsobQgcXVlcnkoKSDtj7TrsLEoZGVsdGEg7JeG7J2MKS5cbiAgICAgIGlmICh0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIpIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gaW5wdXQudG9vbHM/Lmxlbmd0aFxuICAgICAgICAgID8gYnVpbGRUb29sQ2FsbFNjaGVtYShpbnB1dC50b29scylcbiAgICAgICAgICA6IGlucHV0Lmpzb25TY2hlbWFcbiAgICAgICAgICAgID8gKEpTT04ucGFyc2UoaW5wdXQuanNvblNjaGVtYSkgYXMgSnNvblZhbHVlKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgICBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGVTdHJlYW0oXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gbW9kZWwg66+47KeA7KCVIOyLnCBkaXNwYXRjaGVyIOqwgCBBTlRIUk9QSUNfREVGQVVMVF9NT0RFTCDsoIHsmqkuIHByZWZpeCDsoJXqt5ztmZTrj4Qg64K067aA7JeQ7IScLlxuICAgICAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgICAgICBvdXRwdXRTY2hlbWE6IG91dHB1dFNjaGVtYVxuICAgICAgICAgICAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0pIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICAgICAgcmV1c2U6IGRlY2lzaW9uLnJldXNlLFxuICAgICAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9uRGVsdGE6IGNiLm9uRGVsdGEsXG4gICAgICAgICAgICBvblRocmVhZElkOiBjYi5vblRocmVhZElkLFxuICAgICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaXNzdWVkQ29vcmQgPSBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKTtcbiAgICAgICAgICAgICAgY2Iub25Db21wbGV0ZShcbiAgICAgICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywgaXNzdWVkQ29vcmQpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRXJyb3I6IGNiLm9uRXJyb3IsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5xdWVyeShpbnB1dCk7XG4gICAgICBjYi5vbkNvbXBsZXRlKHJlc3VsdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgWywgbW9kZWxdID0gaW5wdXQubW9kZWwuc3BsaXQoXCIvXCIsIDIpO1xuICAgIGlmICghbW9kZWwpIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ1bmtub3duIG1vZGVsXCIpO1xuICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIk9wZW5BSSBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcblxuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGlucHV0LnRvb2xzPy5sZW5ndGhcbiAgICAgID8gYnVpbGRUb29sQ2FsbFNjaGVtYShpbnB1dC50b29scylcbiAgICAgIDogaW5wdXQuanNvblNjaGVtYVxuICAgICAgICA/IChKU09OLnBhcnNlKGlucHV0Lmpzb25TY2hlbWEpIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0KTtcbiAgICBhd2FpdCB0aGlzLm9wZW5haURpc3BhdGNoZXIuZ2VuZXJhdGVTdHJlYW0oXG4gICAgICB7XG4gICAgICAgIG1vZGVsLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgb3V0cHV0U2NoZW1hOiBvdXRwdXRTY2hlbWFcbiAgICAgICAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0pIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgIHZlcmJvc2l0eTogaW5wdXQudmVyYm9zaXR5LFxuICAgICAgICByZWFzb25pbmdTdW1tYXJ5OiBpbnB1dC5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHJldXNlOiBkZWNpc2lvbi5yZXVzZSxcbiAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG9uRGVsdGE6IGNiLm9uRGVsdGEsXG4gICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgIG9uVHVybklkOiBjYi5vblR1cm5JZCxcbiAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICBjb25zdCBpc3N1ZWRDb29yZCA9IGlzc3VlQ29udkNvbnRleHQodHVyblJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pO1xuICAgICAgICAgIGNiLm9uQ29tcGxldGUoXG4gICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywgaXNzdWVkQ29vcmQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3I6IGNiLm9uRXJyb3IsXG4gICAgICB9LFxuICAgICk7XG4gIH1cbn1cblxuLy8gR2VuZXJhdGVSZXN1bHQocHJvdmlkZXIgZGlzcGF0Y2hlciDsnZHri7Up66W8IGFwcGx5VG9vbENhbGxFbXVsYXRpb24g7J6F66ClIHNoYXBlIOuhnCDrp6TtlZHtlZzri6QuXG4vLyBPcGVuQUkvQW50aHJvcGljLCBxdWVyeS9xdWVyeVN0cmVhbSA0IOqyveuhnOqwgCDrj5nsnbztlZjqsowg7JO064ukLlxuLy8gQW50aHJvcGljIGFkYXB0ZXIg64qUIGNhY2hlIGNyZWF0aW9uIOydhCBpbnB1dFRva2VucyDsl5Ag7Y+s7ZWo7ZW0IO2RnOykgO2ZlO2VmOqzoCwg67OE64+EIO2VhOuTnOyXkOuPhCDrs7TsobTtlZzri6QuXG4vLyBwZXItcmVxdWVzdCBjb3N0IOuKlCBDbGF1ZGUgQ29kZSDqsIAg7KSAIHRvdGFsX2Nvc3RfdXNkIOulvCDsmrDshKAg7IKs7Jqp7ZWY6rOgIGZhbGxiYWNrIOqzhOyCsOunjCDqs7XthrUgY29zdCDtlajsiJjrpbwg7JO064ukLlxuZnVuY3Rpb24gdG9FbXVsYXRpb25SZXN1bHQoXG4gIHJlc3VsdDogR2VuZXJhdGVSZXN1bHQsXG4pOiBPbWl0PFF1ZXJ5T3V0cHV0LCBcImNvbnRlbnRcIiB8IFwiZmluaXNoUmVhc29uXCIgfCBcInJ1bkNvbnRleHRcIj4ge1xuICByZXR1cm4ge1xuICAgIHRleHQ6IHJlc3VsdC50ZXh0LFxuICAgIHRva2VuTmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICBtb2RlbDogcmVzdWx0Lm1vZGVsLFxuICAgIHVzYWdlOiB7XG4gICAgICBpbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgIG91dHB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gMCxcbiAgICAgIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgfSxcbiAgICBkdXJhdGlvbk1zOiByZXN1bHQuZHVyYXRpb25NcyxcbiAgICBjb3N0VXNkOlxuICAgICAgcmVzdWx0LmNvc3RVc2QgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQuY29zdFVzZCA+IDBcbiAgICAgICAgPyByZXN1bHQuY29zdFVzZFxuICAgICAgICA6IGNhbGN1bGF0ZUNvc3RVc2QocmVzdWx0Lm1vZGVsLCB7XG4gICAgICAgICAgICBpbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgICAgb3V0cHV0VG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyA/PyAwLFxuICAgICAgICAgIH0pLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlQ2xhdWRlKFxuICBpbnB1dDogUXVlcnlJbnB1dCxcbiAgdG9rZW46IHN0cmluZyxcbiAgdGltZW91dE1zOiBudW1iZXIsXG4pOiBQcm9taXNlPE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIj4+IHtcbiAgY29uc3QgcmF3TW9kZWwgPSBpbnB1dC5tb2RlbCA/PyBERUZBVUxUX01PREVMO1xuICBjb25zdCBtb2RlbCA9IHJhd01vZGVsLmluY2x1ZGVzKFwiL1wiKSA/IHJhd01vZGVsLnNwbGl0KFwiL1wiKS5wb3AoKSEgOiByYXdNb2RlbDtcbiAgY29uc3QgdGltZW91dCA9IGlucHV0LnRpbWVvdXQgPz8gdGltZW91dE1zO1xuICBjb25zdCB1c2VTdHJ1Y3R1cmVkT3V0cHV0ID0gaW5wdXQuanNvblNjaGVtYSAmJiBpbnB1dC5qc29uU2NoZW1hLmxlbmd0aCA+IDA7XG5cbiAgLy8gLS10b29scyBcIlwiIOuhnCDrqqjrk6AgdG9vbCDsnYQg6riw67O4IOywqOuLqC4gc3RydWN0dXJlZCBvdXRwdXQg7JOw66m0IFN0cnVjdHVyZWRPdXRwdXQg66eMIO2ZlOydtO2KuOumrOyKpO2KuC5cbiAgLy8gLS10b29scyBcIlwiIOuKlCDrsJjrk5zsi5wg65Kk7JeQIOuLpOuluCDtlIzrnpjqt7jqsIAg7JmA7JW8IENMSSDtjIzsi7HsnbQg67mIIOusuOyekOyXtOuhnCDsnbjsi51cbiAgY29uc3QgdG9vbEFyZ3MgPSB1c2VTdHJ1Y3R1cmVkT3V0cHV0XG4gICAgPyBbXCItLXRvb2xzXCIsIFwiXCIsIFwiLS1hbGxvd2VkLXRvb2xzXCIsIFwiU3RydWN0dXJlZE91dHB1dFwiXVxuICAgIDogW1wiLS10b29sc1wiLCBcIlwiXTtcblxuICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtcbiAgICBcIi1wXCIsXG4gICAgLi4udG9vbEFyZ3MsXG4gICAgXCItLWRpc2FsbG93ZWRUb29sc1wiLFxuICAgIC8vIEND7JeQ7IScIOyekOuPmSDtmZzshLHtmZTrkJjripQgZGVmZXJyZWQg64+E6rWsLiDthqDtgbAg7LWc7KCB7ZmU66W87JyE7ZW0IOywqOuLqFxuICAgIC4uLihbXCJNb25pdG9yXCIsIFwiUHVzaE5vdGlmaWNhdGlvblwiLCBcIlJlbW90ZVRyaWdnZXJcIl0gYXMgY29uc3QpLFxuICAgIFwiLS1vdXRwdXQtZm9ybWF0XCIsXG4gICAgXCJzdHJlYW0tanNvblwiLFxuICAgIFwiLS12ZXJib3NlXCIsXG4gICAgLy8gLS1tYXgtdHVybnM6IHN0cnVjdHVyZWQgb3V0cHV0IOydgCB0b29sX3VzZSArIHRvb2xfcmVzdWx0IOuhnCAy7YS0IOyGjOu5hFxuICAgIFwiLS1tYXgtdHVybnNcIixcbiAgICB1c2VTdHJ1Y3R1cmVkT3V0cHV0ID8gXCIyXCIgOiBcIjFcIixcbiAgICBcIi0tcGVybWlzc2lvbi1tb2RlXCIsXG4gICAgXCJieXBhc3NQZXJtaXNzaW9uc1wiLFxuICAgIFwiLS1zZXR0aW5nLXNvdXJjZXNcIixcbiAgICBcInByb2plY3RcIixcbiAgICBcIi0tbW9kZWxcIixcbiAgICBtb2RlbCxcbiAgICAvLyAtLXN5c3RlbS1wcm9tcHTripQg67CY65Oc7IucIOuqheyLnO2VtOyVvO2VqC4g7Ji17IWYIOyDneuetSDsi5wgQ0PqsIAgZGVmYXVsdCBzeXN0ZW0gcHJvbXB066W8IOyekOuPmeycvOuhnCDso7zsnoXtlagoMjNrKVxuICAgIFwiLS1zeXN0ZW0tcHJvbXB0XCIsXG4gICAgaW5wdXQuc3lzdGVtID8/IFwiXCIsXG4gICAgXCItLXRoaW5raW5nXCIsXG4gICAgXCJkaXNhYmxlZFwiLFxuICAgIFwiLS1lZmZvcnRcIixcbiAgICBpbnB1dC5lZmZvcnQgPz8gREVGQVVMVF9FRkZPUlQsXG4gICAgXCItLW5vLXNlc3Npb24tcGVyc2lzdGVuY2VcIixcbiAgICAvLyDrqqjrk6Agc2tpbGxzIOu5hO2ZnOyEse2ZlFxuICAgIFwiLS1kaXNhYmxlLXNsYXNoLWNvbW1hbmRzXCIsXG4gIF07XG4gIGlmICh1c2VTdHJ1Y3R1cmVkT3V0cHV0KSB7XG4gICAgYXJncy5wdXNoKFwiLS1qc29uLXNjaGVtYVwiLCBpbnB1dC5qc29uU2NoZW1hISk7XG4gIH1cbiAgYXJncy5wdXNoKGlucHV0LnByb21wdCk7XG5cbiAgY29uc3QgZW52OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHtcbiAgICBQQVRIOiBwcm9jZXNzLmVudi5QQVRILFxuICAgIFRNUERJUjogcHJvY2Vzcy5lbnYuVE1QRElSLFxuICAgIENMQVVERV9DT0RFX09BVVRIX1RPS0VOOiB0b2tlbixcbiAgICAvLyBDTEFVREVfQ09ORklHX0RJUiDtmZjqsr3rs4DsiJjroZwg7KO87J6FXG4gICAgQ0xBVURFX0NPTkZJR19ESVIsXG4gICAgQ0xBVURFX0NPREVfRElTQUJMRV9BVVRPX01FTU9SWTogXCIxXCIsXG4gICAgQ0xBVURFX0NPREVfRElTQUJMRV9BREFQVElWRV9USElOS0lORzogXCIxXCIsXG4gICAgQ0xBVURFX0NPREVfRElTQUJMRV8xTV9DT05URVhUOiBcIjFcIixcbiAgICBDTEFVREVfQ09ERV9ESVNBQkxFX0NMQVVERV9NRFM6IFwiMVwiLFxuICAgIENMQVVERV9DT0RFX0FUVFJJQlVUSU9OX0hFQURFUjogXCIwXCIsXG4gIH07XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlPE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIj4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKFwiY2xhdWRlXCIsIGFyZ3MsIHtcbiAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJwaXBlXCIsIFwiaWdub3JlXCJdLFxuICAgICAgZW52LFxuICAgICAgLy8g6rKp66asICjrkZAg64uo6rOEKTpcbiAgICAgIC8vIDEuIENMQVVERV9DV0Qg4oCUIHByb2plY3Qgc2NvcGUg6rKp66asIChjd2Qg7J2YIC5jbGF1ZGUvc2V0dGluZ3MuanNvbilcbiAgICAgIC8vIDIuIENMQVVERV9DT05GSUdfRElSIOKAlCB1c2VyIHNjb3BlIOqyqeumrCBjd2Qg6rKp66as66eM7Jy866GgIOu2gOyhsS5cbiAgICAgIGN3ZDogQ0xBVURFX0NXRCxcbiAgICB9KTtcblxuICAgIGxldCBidWZmZXIgPSBcIlwiO1xuICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIGNoaWxkLmtpbGwoKTtcbiAgICAgIHJlamVjdChuZXcgVGltZW91dEVycm9yKGBUaW1lb3V0IGFmdGVyICR7dGltZW91dCAvIDEwMDB9cyAodG9rZW46ICR7bWFza1Rva2VuKHRva2VuKX0pYCkpO1xuICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgY2hpbGQuc3Rkb3V0Py5vbihcImRhdGFcIiwgKGQ6IEJ1ZmZlcikgPT4ge1xuICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgIGJ1ZmZlciArPSBkLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBsaW5lcyA9IGJ1ZmZlci5zcGxpdChcIlxcblwiKTtcbiAgICAgIGJ1ZmZlciA9IGxpbmVzLnBvcCgpID8/IFwiXCI7XG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgaWYgKCFsaW5lLnRyaW0oKSkgY29udGludWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaiA9IEpTT04ucGFyc2UobGluZSk7XG4gICAgICAgICAgaWYgKGoudHlwZSA9PT0gXCJyZXN1bHRcIiAmJiAhc2V0dGxlZCkge1xuICAgICAgICAgICAgLy8gLS1qc29uLXNjaGVtYSDsgqzsmqkg7IucIHN0cnVjdHVyZWRfb3V0cHV0IOyXkCDtjIzsi7HrkJwg6rCd7LK06rCAIOyYqOuLpCDihpIg7Jqw7ISgIOyCrOyaqVxuICAgICAgICAgICAgbGV0IHRleHQ6IHN0cmluZztcbiAgICAgICAgICAgIGlmIChqLnN0cnVjdHVyZWRfb3V0cHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdGV4dCA9IEpTT04uc3RyaW5naWZ5KGouc3RydWN0dXJlZF9vdXRwdXQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGV4dCA9IChqLnJlc3VsdCA/PyBcIlwiKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9eYGBgKD86anNvbik/XFxzKlxcbj8vaSwgXCJcIilcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxuP2BgYFxccyokL2ksIFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGV4dC5zdGFydHNXaXRoKFwiWW91J3ZlIGhpdFwiKSkge1xuICAgICAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgcmVqZWN0KG5ldyBRdW90YUVycm9yKGBRdW90YSBleGhhdXN0ZWQgKHRva2VuOiAke21hc2tUb2tlbih0b2tlbil9KWApKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB1ID0gai51c2FnZSA/PyB7fTtcbiAgICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICB1c2FnZToge1xuICAgICAgICAgICAgICAgIGlucHV0X3Rva2VuczogdS5pbnB1dF90b2tlbnMgPz8gMCxcbiAgICAgICAgICAgICAgICBvdXRwdXRfdG9rZW5zOiB1Lm91dHB1dF90b2tlbnMgPz8gMCxcbiAgICAgICAgICAgICAgICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM6IHUuY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgICAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM6IHUuY2FjaGVfcmVhZF9pbnB1dF90b2tlbnMgPz8gMCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb25Nczogai5kdXJhdGlvbl9tcyA/PyAwLFxuICAgICAgICAgICAgICBjb3N0VXNkOiBqLnRvdGFsX2Nvc3RfdXNkID8/IDAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHJlamVjdChuZXcgUHJvY2Vzc0Vycm9yKGBDTEkgcHJvY2VzcyBjbG9zZWQgd2l0aG91dCByZXN1bHQgKHRva2VuOiAke21hc2tUb2tlbih0b2tlbil9KWApKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHJlamVjdChuZXcgUHJvY2Vzc0Vycm9yKGBDTEkgcHJvY2VzcyBlcnJvcjogJHtlcnIubWVzc2FnZX0gKHRva2VuOiAke21hc2tUb2tlbih0b2tlbil9KWApKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBRZ3JpZERpc3BhdGNoZXIgPSBuZXcgUWdyaWREaXNwYXRjaGVyQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFDQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFFBQVEsQ0FBQztBQUVuQyxNQUFNLGdCQUFnQjtBQUN0QixNQUFNLHFCQUFxQjtBQUMzQixNQUFNLGlCQUFpQjtBQUl2QixNQUFNLGFBQWE7QUFHbkIsTUFBTSxvQkFBb0I7QUFHMUIsTUFBTSx3QkFBd0I7Q0FDNUIsdUJBQXVCO0NBQ3ZCLHdC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
|
|
352
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJub2RlOmFzc2VydFwiO1xuLyoqXG4gKiBRZ3JpZERpc3BhdGNoZXIg4oCUIE9BdXRoIO2GoO2BsCDshKDtg50gKyBjbGF1ZGUgQ0xJIGZyZXNoIHNwYXduIOuUlOyKpO2MqOyymCDsi7HquIDthLQuXG4gKlxuICogLSDrp6Qg7JqU7LKt66eI64ukIOyDiCBjbGF1ZGUgQ0xJIO2UhOuhnOyEuOyKpCBzcGF3biDihpIg7J2R64u1IO2bhCDsooXro4xcbiAqIC0gbGVhc3QtdXNlZCByb3VuZC1yb2JpbiDsnLzroZwg7Yag7YGwIOyEoO2DnVxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBxdWVyeSDsi5wgZXhwaXJlc19hdCDruYTqtZAg4oaSIOyehOuwlSDsi5wgcHJlZW1wdGl2ZSByZWZyZXNoXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMICjsnpDrj5kgZmFpbG92ZXIg7JeG7J2MLCBVSSDsl5DshJwg7IiY64+ZIO2GoOq4gClcbiAqXG4gKiBlbnYgYWxsb3dsaXN0OiBQQVRILCBUTVBESVIsIENMQVVERV9DT0RFX09BVVRIX1RPS0VOLCBDTEFVREVfQ09ORklHX0RJUlxuICogICArIENMQVVERV9DT0RFX0RJU0FCTEVfKiArIENMQVVERV9DT0RFX0FUVFJJQlVUSU9OX0hFQURFUlxuICovXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IG1rZGlyU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQgeyBjYW5vbmljYWxBbnRocm9waWNNb2RlbCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1jb25zdGFudHNcIjtcbmltcG9ydCB7IHR5cGUgQW50aHJvcGljRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQge1xuICBnZXRBY2Nlc3NUb2tlbixcbiAgZ2V0RXhwaXJlc0F0LFxuICBnZXRSZWZyZXNoVG9rZW4sXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2NyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVDb3N0VXNkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vbW9kZWwtY29zdFwiO1xuaW1wb3J0IHsgdHlwZSBHZW5lcmF0ZVJlc3VsdCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IHN0cmljdGlmeSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3N0cmljdGlmaWVyXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSURpc3BhdGNoZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgZGVjaWRlQ29udlJvdXRpbmcsIGlzc3VlQ29udkNvbnRleHQgfSBmcm9tIFwiLi9jb252LXJvdXRpbmdcIjtcbmltcG9ydCB7IHR5cGUgUXVlcnlJbnB1dCwgdHlwZSBRdWVyeU91dHB1dCwgdHlwZSBUb2tlblN0YXRzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IG1hc2tUb2tlbiwgUHJvY2Vzc0Vycm9yLCBRdW90YUVycm9yLCBUaW1lb3V0RXJyb3IgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNjcmliZXIgfSBmcm9tIFwiLi90b2tlbi1zdWJzY3JpYmVyXCI7XG5pbXBvcnQgeyBhcHBseVRvb2xDYWxsRW11bGF0aW9uLCBidWlsZFRvb2xDYWxsU2NoZW1hIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb25cIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCJdKTtcblxuY29uc3QgREVGQVVMVF9NT0RFTCA9IFwic29ubmV0XCI7XG5jb25zdCBERUZBVUxUX1RJTUVPVVRfTVMgPSA2MDBfMDAwO1xuY29uc3QgREVGQVVMVF9FRkZPUlQgPSBcImhpZ2hcIjtcblxuLy8gY2xhdWRlIENMSSDsnZggY3dkLiDsnbQg6rK966Gc7J2YIC5jbGF1ZGUvc2V0dGluZ3MuanNvbiDsnbQgcHJvamVjdCBzY29wZSDroZwg66Gc65Oc65CY7Ja0XG4vLyDtmLnsi5zrnbzrj4Qg7J6I7J2EIHVzZXIgc2NvcGUgKH4vLmNsYXVkZS9zZXR0aW5ncy5qc29uKeulvCDrja7slrTslIAgKC0tc2V0dGluZy1zb3VyY2VzIHByb2plY3Qg7JmAIO2VqOq7mCkuXG5jb25zdCBDTEFVREVfQ1dEID0gXCIvdG1wL3FncmlkXCI7XG5cbi8vIOq4gOuhnOuyjCB1c2VyIGNvbmZpZyDqsqnrpqwg6rK966GcLiAoQ0Psl5DshJwg7ZmY6rK967OA7IiY66GcIOydveuKlOuzgOyImClcbmNvbnN0IENMQVVERV9DT05GSUdfRElSID0gXCIvdG1wL3FncmlkLWNvbmZpZ1wiO1xuXG4vLyBxZ3JpZCDsoITsmqkgcHJvamVjdC9nbG9iYWwgc2V0dGluZ3Mg4oCUIHVzZXIgc2NvcGUg6rKp66as7JqpXG5jb25zdCBRR1JJRF9DTEFVREVfU0VUVElOR1MgPSB7XG4gIGFsd2F5c1RoaW5raW5nRW5hYmxlZDogZmFsc2UsIC8vIHRoaW5raW5nIGJsb2NrIOywqOuLqFxuICBpbmNsdWRlR2l0SW5zdHJ1Y3Rpb25zOiBmYWxzZSwgLy8gc3lzdGVtIHByb21wdCDsnZggZ2l0IOqwgOydtOuTnCDsoJzqsbBcbiAgY2xlYW51cFBlcmlvZERheXM6IDEsXG59O1xuXG4vLyDthqDtgbAg66eM66OMIOyehOuwlSDsnoTqs4TqsJIg4oCUIHRva2VuLmV4cGlyZWRBdOydtCAx67aEIOyViOyXkCDrp4zro4zrkJzri6TrqbQgcXVlcnkg7IucIOyytO2BrO2VmOqzoCByZWZyZXNoLlxuY29uc3QgUkVGUkVTSF9TQUZFVFlfTVMgPSA2MF8wMDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFN0cmljdE91dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3V0cHV0U2NoZW1hID0gaW5wdXQudG9vbHM/Lmxlbmd0aFxuICAgID8gYnVpbGRUb29sQ2FsbFNjaGVtYShpbnB1dC50b29scylcbiAgICA6IGlucHV0Lmpzb25TY2hlbWFcbiAgICAgID8gKEpTT04ucGFyc2UoaW5wdXQuanNvblNjaGVtYSkgYXMgSnNvblZhbHVlKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIG91dHB1dFNjaGVtYVxuICAgID8gKHN0cmljdGlmeShvdXRwdXRTY2hlbWEgYXMgUGFyYW1ldGVyczx0eXBlb2Ygc3RyaWN0aWZ5PlswXSkgYXMgSnNvblZhbHVlKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgUWdyaWREaXNwYXRjaGVyQ2xhc3Mge1xuICB0b2tlbnMgPSBuZXcgTWFwPG51bWJlciwgVG9rZW5TdWJzZXRBPigpO1xuXG4gIC8vIGtleeq4sOuwmCh0b2tlbk5hbWUpIOuIhOyggSDsubTsmrTthLAuIHRva2VuIOydtCBPQXV0aCByZWZyZXNoIOuhnCDroZzthYzsnbTtirjrkJjrj4QgdG9rZW5OYW1lIOydgCDrtojrs4DsnbTrnbwg7Lm07Jq07YSwIOycoOyngOuQqFxuICByZXF1ZXN0Q291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgcnJJbmRleCA9IDA7XG5cbiAgLy8gc29uYW11LmNvbmZpZyBvblN0YXJ0IOyXkOyEnCDsspjrpqztlZjripQg67OA7IiYXG4gIHN1YnNjcmliZXI6IFRva2VuU3Vic2NyaWJlciB8IG51bGwgPSBudWxsO1xuICBvcGVuYWlEaXNwYXRjaGVyOiBPcGVuQUlEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIGFudGhyb3BpY0Rpc3BhdGNoZXI6IEFudGhyb3BpY0Rpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBzZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShRR1JJRF9DTEFVREVfU0VUVElOR1MsIG51bGwsIDIpO1xuXG4gICAgbWtkaXJTeW5jKGAke0NMQVVERV9DV0R9Ly5jbGF1ZGVgLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB3cml0ZUZpbGVTeW5jKGAke0NMQVVERV9DV0R9Ly5jbGF1ZGUvc2V0dGluZ3MuanNvbmAsIHNldHRpbmdzSnNvbik7XG5cbiAgICBta2RpclN5bmMoQ0xBVURFX0NPTkZJR19ESVIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHdyaXRlRmlsZVN5bmMoYCR7Q0xBVURFX0NPTkZJR19ESVJ9Ly5jbGF1ZGUuanNvbmAsIFwie31cIik7XG4gICAgd3JpdGVGaWxlU3luYyhgJHtDTEFVREVfQ09ORklHX0RJUn0vc2V0dGluZ3MuanNvbmAsIHNldHRpbmdzSnNvbik7XG4gIH1cblxuICBjb3VudE9mKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdENvdW50cy5nZXQobmFtZSkgPz8gMDtcbiAgfVxuXG4gIC8vIFRva2VuU3Vic2NyaWJlciDsvZzrsLEg4oCUIOy6kOyLnCBtdXRhdGlvblxuICB1cHNlcnRDYWNoZShpZDogbnVtYmVyLCByb3c6IFRva2VuU3Vic2V0QSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zLnNldChpZCwgcm93KTtcbiAgfVxuXG4gIHJlbW92ZUNhY2hlKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRva2Vucy5kZWxldGUoaWQpO1xuICB9XG5cbiAgcmVwbGFjZUNhY2hlKHJvd3M6IFRva2VuU3Vic2V0QVtdKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMgPSBuZXcgTWFwKHJvd3MubWFwKChyKSA9PiBbci5pZCwgcl0pKTtcbiAgfVxuXG4gIGdldFN0YXRzKCk6IFRva2VuU3RhdHNbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRva2Vucy52YWx1ZXMoKV0ubWFwKChyKSA9PiAoe1xuICAgICAgdG9rZW46IG1hc2tUb2tlbihnZXRBY2Nlc3NUb2tlbihyLmNyZWRlbnRpYWxzKSksXG4gICAgICBuYW1lOiByLm5hbWUsXG4gICAgICBwcm92aWRlcjogci5wcm92aWRlcixcbiAgICAgIHJlcXVlc3RzOiB0aGlzLmNvdW50T2Yoci5uYW1lKSxcbiAgICB9KSk7XG4gIH1cblxuICBzZWxlY3RUb2tlbihwcm92aWRlciA9IFwiYW50aHJvcGljXCIpOiBUb2tlblN1YnNldEEgfCBudWxsIHtcbiAgICBjb25zdCByb3dzID0gWy4uLnRoaXMudG9rZW5zLnZhbHVlcygpXS5maWx0ZXIoKHIpID0+IHIucHJvdmlkZXIgPT09IHByb3ZpZGVyKTtcbiAgICBpZiAocm93cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgbWluQ291bnQgPSBNYXRoLm1pbiguLi5yb3dzLm1hcCgocikgPT4gdGhpcy5jb3VudE9mKHIubmFtZSkpKTtcbiAgICBjb25zdCBpZGxlID0gcm93cy5maWx0ZXIoKHIpID0+IHRoaXMuY291bnRPZihyLm5hbWUpID09PSBtaW5Db3VudCk7XG4gICAgY29uc3QgcGlja2VkID0gaWRsZVt0aGlzLnJySW5kZXggJSBpZGxlLmxlbmd0aF0hO1xuICAgIHRoaXMucnJJbmRleCsrO1xuICAgIHJldHVybiBwaWNrZWQ7XG4gIH1cblxuICBhc3luYyBxdWVyeShpbnB1dDogUXVlcnlJbnB1dCwgdGltZW91dE1zPzogbnVtYmVyKTogUHJvbWlzZTxRdWVyeU91dHB1dD4ge1xuICAgIGlmIChpbnB1dC50b29scz8ubGVuZ3RoICYmIGlucHV0Lmpzb25TY2hlbWEpIHtcbiAgICAgIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ0b29scyBhbmQganNvblNjaGVtYSBjYW5ub3QgYmUgdXNlZCB0b2dldGhlclwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFN0cmljdE91dHB1dFNjaGVtYShpbnB1dCk7XG5cbiAgICAvLyBwcm92aWRlciBwcmVmaXggcm91dGluZzogJ29wZW5haS9ncHQtNS40JyDihpIgT3BlbkFJRGlzcGF0Y2hlclxuICAgIGlmIChpbnB1dC5tb2RlbD8uaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICBjb25zdCBbcHJvdmlkZXIsIG1vZGVsXSA9IGlucHV0Lm1vZGVsLnNwbGl0KFwiL1wiLCAyKTtcbiAgICAgIGFzc2VydChtb2RlbCwgXCJ1bmtub3duIG1vZGVsXCIpO1xuICAgICAgaWYgKHByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIk9wZW5BSSBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZSh7XG4gICAgICAgICAgbW9kZWw6IG1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgICByZWFzb25pbmdTdW1tYXJ5OiBpbnB1dC5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgICAgIHNlcnZpY2VUaWVyOiBpbnB1dC5zZXJ2aWNlVGllcixcbiAgICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgICAgcmV1c2U6IGRlY2lzaW9uLnJldXNlLFxuICAgICAgICAgIHJldXNlSW5wdXQ6IGRlY2lzaW9uLnJldXNlSW5wdXQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGlzc3VlZENvb3JkID0gaXNzdWVDb252Q29udGV4dChyZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKTtcbiAgICAgICAgcmV0dXJuIGFwcGx5VG9vbENhbGxFbXVsYXRpb24odG9FbXVsYXRpb25SZXN1bHQocmVzdWx0KSwgaW5wdXQudG9vbHMsIGlzc3VlZENvb3JkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbnRocm9waWMg4oCUIEFudGhyb3BpY0Rpc3BhdGNoZXIo66mA7Yuw7YS0IHNlc3Npb24gcmVzdW1lKSDqsr3roZwuIE9wZW5BSSDqsr3roZzsmYAg64+Z7ZiVLlxuICAgIGlmICh0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIpIHtcbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlKHtcbiAgICAgICAgLy8gbW9kZWwg66+47KeA7KCV7J2066m0IEFudGhyb3BpY0Rpc3BhdGNoZXIg6rCAIEFOVEhST1BJQ19ERUZBVUxUX01PREVMIOyggeyaqSDigJQgXCJzb25uZXRcIiDrs4Tsua3snYRcbiAgICAgICAgLy8g6rCV7KCc66GcIOuBvOybjCBkaXNwYXRjaGVyIGRlZmF1bHQg66W8IOyjveydtOyngCDslYrripTri6QuIHByZWZpeCDsoJXqt5ztmZTrj4QgZGlzcGF0Y2hlciDrgrTrtoDsl5DshJwuXG4gICAgICAgIG1vZGVsOiBpbnB1dC5tb2RlbCxcbiAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHJldXNlOiBkZWNpc2lvbi5yZXVzZSxcbiAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpc3N1ZWRDb29yZCA9IGlzc3VlQ29udkNvbnRleHQocmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbik7XG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywgaXNzdWVkQ29vcmQpO1xuICAgIH1cblxuICAgIC8vIO2PtOuwsTogQW50aHJvcGljRGlzcGF0Y2hlciDrr7jstIjquLDtmZQg7IucIOq4sOyhtCBzdGF0ZWxlc3MgY2xhdWRlIC1wIOqyveuhnCjrqYDti7DthLQg7JeG7J2MKS5cbiAgICBjb25zdCBleGVjdXRpb25JbnB1dCA9IG91dHB1dFNjaGVtYVxuICAgICAgPyB7IC4uLmlucHV0LCBqc29uU2NoZW1hOiBKU09OLnN0cmluZ2lmeShvdXRwdXRTY2hlbWEpIH1cbiAgICAgIDogaW5wdXQ7XG5cbiAgICBjb25zdCBlbGVjdGVkVG9rZW4gPSB0aGlzLnNlbGVjdFRva2VuKCk7XG4gICAgaWYgKCFlbGVjdGVkVG9rZW4pIHRocm93IG5ldyBRdW90YUVycm9yKFwiTm8gdG9rZW5zIGF2YWlsYWJsZVwiKTtcblxuICAgIC8vIGF3YWl0IOyghOyXkCBjb3VudCDshKDrsJjsmIEuIOuzkeugrCDsmpTssq3snbQg64+Z7Iuc7JeQIOuPhOywqe2VtOuPhCDqsIHsnpAg64uk66W4IO2GoO2BsOydhCDqs6DrpbTrj4TroZ0uXG4gICAgdGhpcy5yZXF1ZXN0Q291bnRzLnNldChlbGVjdGVkVG9rZW4ubmFtZSwgdGhpcy5jb3VudE9mKGVsZWN0ZWRUb2tlbi5uYW1lKSArIDEpO1xuXG4gICAgbGV0IHRva2VuID0gZ2V0QWNjZXNzVG9rZW4oZWxlY3RlZFRva2VuLmNyZWRlbnRpYWxzKTtcbiAgICAvLyBleHBpcmVzX2F0IOyehOuwleydtOuptCBwcmVlbXB0aXZlIHJlZnJlc2hcbiAgICBjb25zdCBleHBpcmVzQXQgPSBnZXRFeHBpcmVzQXQoZWxlY3RlZFRva2VuLmNyZWRlbnRpYWxzKTtcbiAgICBpZiAoXG4gICAgICBleHBpcmVzQXQgJiZcbiAgICAgIGV4cGlyZXNBdCAtIERhdGUubm93KCkgPCBSRUZSRVNIX1NBRkVUWV9NUyAmJlxuICAgICAgZ2V0UmVmcmVzaFRva2VuKGVsZWN0ZWRUb2tlbi5jcmVkZW50aWFscylcbiAgICApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgUWdyaWRGcmFtZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9xZ3JpZC5mcmFtZVwiKTtcbiAgICAgICAgdG9rZW4gPSBhd2FpdCBRZ3JpZEZyYW1lLnJlZnJlc2hUb2tlbihlbGVjdGVkVG9rZW4pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7ZWxlY3RlZFRva2VuLm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvZ2dlci5pbmZvKGDihpIgJHtlbGVjdGVkVG9rZW4ubmFtZX0gKG1vZGVsOiAke2lucHV0Lm1vZGVsID8/IERFRkFVTFRfTU9ERUx9KWApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0ZUNsYXVkZShleGVjdXRpb25JbnB1dCwgdG9rZW4sIHRpbWVvdXRNcyA/PyBERUZBVUxUX1RJTUVPVVRfTVMpO1xuICAgIHJldHVybiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKFxuICAgICAgLy8gbW9kZWwg64+EIGNhbm9uaWNhbCDroZwg4oCUIGZhbGxiYWNrIOuPhCBjb3N0L+2RnOq4sOqwgCBtYWluIOqyveuhnOyZgCDsnbzsuZjtlZjqsowuXG4gICAgICB7IC4uLnJlc3VsdCwgdG9rZW5OYW1lOiBlbGVjdGVkVG9rZW4ubmFtZSwgbW9kZWw6IGNhbm9uaWNhbEFudGhyb3BpY01vZGVsKGlucHV0Lm1vZGVsKSB9LFxuICAgICAgaW5wdXQudG9vbHMsXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5U3RyZWFtKFxuICAgIGlucHV0OiBRdWVyeUlucHV0LFxuICAgIGNiOiB7XG4gICAgICBvbkRlbHRhOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICAgICAgb25Db21wbGV0ZTogKHJlc3VsdDogUXVlcnlPdXRwdXQpID0+IHZvaWQ7XG4gICAgICBvbkVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICAgICAgb25UaHJlYWRJZD86ICh0aHJlYWRJZDogc3RyaW5nKSA9PiB2b2lkO1xuICAgICAgb25UdXJuSWQ/OiAodHVybklkOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQW50aHJvcGljIOyKpO2KuOumrOuwjTogb3BlbmFpLyBwcmVmaXgg6rCAIOyVhOuLiOuptCBhbnRocm9waWMg6rK966GcLlxuICAgIGlmICghaW5wdXQubW9kZWw/LnN0YXJ0c1dpdGgoXCJvcGVuYWkvXCIpKSB7XG4gICAgICAvLyBBbnRocm9waWNEaXNwYXRjaGVyIOqwgCDsnojsnLzrqbQg7Iuk7KCcIGRlbHRhIOyKpO2KuOumrOuwjS4g7JeG7Jy866m0IOq4sOyhtCBxdWVyeSgpIO2PtOuwsShkZWx0YSDsl4bsnYwpLlxuICAgICAgaWYgKHRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikge1xuICAgICAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFN0cmljdE91dHB1dFNjaGVtYShpbnB1dCk7XG4gICAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgICBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGVTdHJlYW0oXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gbW9kZWwg66+47KeA7KCVIOyLnCBkaXNwYXRjaGVyIOqwgCBBTlRIUk9QSUNfREVGQVVMVF9NT0RFTCDsoIHsmqkuIHByZWZpeCDsoJXqt5ztmZTrj4Qg64K067aA7JeQ7IScLlxuICAgICAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICAgICAgcmV1c2U6IGRlY2lzaW9uLnJldXNlLFxuICAgICAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9uRGVsdGE6IGNiLm9uRGVsdGEsXG4gICAgICAgICAgICBvblRocmVhZElkOiBjYi5vblRocmVhZElkLFxuICAgICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaXNzdWVkQ29vcmQgPSBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKTtcbiAgICAgICAgICAgICAgY2Iub25Db21wbGV0ZShcbiAgICAgICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywgaXNzdWVkQ29vcmQpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRXJyb3I6IGNiLm9uRXJyb3IsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5xdWVyeShpbnB1dCk7XG4gICAgICBjYi5vbkNvbXBsZXRlKHJlc3VsdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgWywgbW9kZWxdID0gaW5wdXQubW9kZWwuc3BsaXQoXCIvXCIsIDIpO1xuICAgIGlmICghbW9kZWwpIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ1bmtub3duIG1vZGVsXCIpO1xuICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIk9wZW5BSSBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcblxuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKGlucHV0KTtcblxuICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgIGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZVN0cmVhbShcbiAgICAgIHtcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgc2VydmljZVRpZXI6IGlucHV0LnNlcnZpY2VUaWVyLFxuICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICByZXVzZTogZGVjaXNpb24ucmV1c2UsXG4gICAgICAgIHJldXNlSW5wdXQ6IGRlY2lzaW9uLnJldXNlSW5wdXQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBvbkRlbHRhOiBjYi5vbkRlbHRhLFxuICAgICAgICBvblRocmVhZElkOiBjYi5vblRocmVhZElkLFxuICAgICAgICBvblR1cm5JZDogY2Iub25UdXJuSWQsXG4gICAgICAgIG9uQ29tcGxldGU6ICh0dXJuUmVzdWx0KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNzdWVkQ29vcmQgPSBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKTtcbiAgICAgICAgICBjYi5vbkNvbXBsZXRlKFxuICAgICAgICAgICAgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdCh0dXJuUmVzdWx0KSwgaW5wdXQudG9vbHMsIGlzc3VlZENvb3JkKSxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgfSxcbiAgICApO1xuICB9XG59XG5cbi8vIEdlbmVyYXRlUmVzdWx0KHByb3ZpZGVyIGRpc3BhdGNoZXIg7J2R64u1KeulvCBhcHBseVRvb2xDYWxsRW11bGF0aW9uIOyeheugpSBzaGFwZSDroZwg66ek7ZWR7ZWc64ukLlxuLy8gT3BlbkFJL0FudGhyb3BpYywgcXVlcnkvcXVlcnlTdHJlYW0gNCDqsr3roZzqsIAg64+Z7J287ZWY6rKMIOyTtOuLpC5cbi8vIEFudGhyb3BpYyBhZGFwdGVyIOuKlCBjYWNoZSBjcmVhdGlvbiDsnYQgaW5wdXRUb2tlbnMg7JeQIO2PrO2VqO2VtCDtkZzspIDtmZTtlZjqs6AsIOuzhOuPhCDtlYTrk5zsl5Drj4Qg67O07KG07ZWc64ukLlxuLy8gcGVyLXJlcXVlc3QgY29zdCDripQgQ2xhdWRlIENvZGUg6rCAIOykgCB0b3RhbF9jb3N0X3VzZCDrpbwg7Jqw7ISgIOyCrOyaqe2VmOqzoCBmYWxsYmFjayDqs4TsgrDrp4wg6rO17Ya1IGNvc3Qg7ZWo7IiY66W8IOyTtOuLpC5cbmZ1bmN0aW9uIHRvRW11bGF0aW9uUmVzdWx0KFxuICByZXN1bHQ6IEdlbmVyYXRlUmVzdWx0LFxuKTogT21pdDxRdWVyeU91dHB1dCwgXCJjb250ZW50XCIgfCBcImZpbmlzaFJlYXNvblwiIHwgXCJydW5Db250ZXh0XCI+IHtcbiAgcmV0dXJuIHtcbiAgICB0ZXh0OiByZXN1bHQudGV4dCxcbiAgICB0b2tlbk5hbWU6IHJlc3VsdC50b2tlbk5hbWUsXG4gICAgbW9kZWw6IHJlc3VsdC5tb2RlbCxcbiAgICB1c2FnZToge1xuICAgICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICBjYWNoZV9yZWFkX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgIH0sXG4gICAgZHVyYXRpb25NczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgY29zdFVzZDpcbiAgICAgIHJlc3VsdC5jb3N0VXNkICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0LmNvc3RVc2QgPiAwXG4gICAgICAgID8gcmVzdWx0LmNvc3RVc2RcbiAgICAgICAgOiBjYWxjdWxhdGVDb3N0VXNkKHJlc3VsdC5tb2RlbCwge1xuICAgICAgICAgICAgaW5wdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgIG91dHB1dFRva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gMCxcbiAgICAgICAgICB9KSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNsYXVkZShcbiAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gIHRva2VuOiBzdHJpbmcsXG4gIHRpbWVvdXRNczogbnVtYmVyLFxuKTogUHJvbWlzZTxPbWl0PFF1ZXJ5T3V0cHV0LCBcImNvbnRlbnRcIiB8IFwiZmluaXNoUmVhc29uXCI+PiB7XG4gIGNvbnN0IHJhd01vZGVsID0gaW5wdXQubW9kZWwgPz8gREVGQVVMVF9NT0RFTDtcbiAgY29uc3QgbW9kZWwgPSByYXdNb2RlbC5pbmNsdWRlcyhcIi9cIikgPyByYXdNb2RlbC5zcGxpdChcIi9cIikucG9wKCkhIDogcmF3TW9kZWw7XG4gIGNvbnN0IHRpbWVvdXQgPSBpbnB1dC50aW1lb3V0ID8/IHRpbWVvdXRNcztcbiAgY29uc3QgdXNlU3RydWN0dXJlZE91dHB1dCA9IGlucHV0Lmpzb25TY2hlbWEgJiYgaW5wdXQuanNvblNjaGVtYS5sZW5ndGggPiAwO1xuXG4gIC8vIC0tdG9vbHMgXCJcIiDroZwg66qo65OgIHRvb2wg7J2EIOq4sOuzuCDssKjri6guIHN0cnVjdHVyZWQgb3V0cHV0IOyTsOuptCBTdHJ1Y3R1cmVkT3V0cHV0IOunjCDtmZTsnbTtirjrpqzsiqTtirguXG4gIC8vIC0tdG9vbHMgXCJcIiDripQg67CY65Oc7IucIOuSpOyXkCDri6Trpbgg7ZSM656Y6re46rCAIOyZgOyVvCBDTEkg7YyM7Iux7J20IOu5iCDrrLjsnpDsl7TroZwg7J247IudXG4gIGNvbnN0IHRvb2xBcmdzID0gdXNlU3RydWN0dXJlZE91dHB1dFxuICAgID8gW1wiLS10b29sc1wiLCBcIlwiLCBcIi0tYWxsb3dlZC10b29sc1wiLCBcIlN0cnVjdHVyZWRPdXRwdXRcIl1cbiAgICA6IFtcIi0tdG9vbHNcIiwgXCJcIl07XG5cbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXG4gICAgXCItcFwiLFxuICAgIC4uLnRvb2xBcmdzLFxuICAgIFwiLS1kaXNhbGxvd2VkVG9vbHNcIixcbiAgICAvLyBDQ+yXkOyEnCDsnpDrj5kg7Zmc7ISx7ZmU65CY64qUIGRlZmVycmVkIOuPhOq1rC4g7Yag7YGwIOy1nOygge2ZlOulvOychO2VtCDssKjri6hcbiAgICAuLi4oW1wiTW9uaXRvclwiLCBcIlB1c2hOb3RpZmljYXRpb25cIiwgXCJSZW1vdGVUcmlnZ2VyXCJdIGFzIGNvbnN0KSxcbiAgICBcIi0tb3V0cHV0LWZvcm1hdFwiLFxuICAgIFwic3RyZWFtLWpzb25cIixcbiAgICBcIi0tdmVyYm9zZVwiLFxuICAgIC8vIC0tbWF4LXR1cm5zOiBzdHJ1Y3R1cmVkIG91dHB1dCDsnYAgdG9vbF91c2UgKyB0b29sX3Jlc3VsdCDroZwgMu2EtCDshozruYRcbiAgICBcIi0tbWF4LXR1cm5zXCIsXG4gICAgdXNlU3RydWN0dXJlZE91dHB1dCA/IFwiMlwiIDogXCIxXCIsXG4gICAgXCItLXBlcm1pc3Npb24tbW9kZVwiLFxuICAgIFwiYnlwYXNzUGVybWlzc2lvbnNcIixcbiAgICBcIi0tc2V0dGluZy1zb3VyY2VzXCIsXG4gICAgXCJwcm9qZWN0XCIsXG4gICAgXCItLW1vZGVsXCIsXG4gICAgbW9kZWwsXG4gICAgLy8gLS1zeXN0ZW0tcHJvbXB064qUIOuwmOuTnOyLnCDrqoXsi5ztlbTslbztlaguIOyYteyFmCDsg53rnrUg7IucIEND6rCAIGRlZmF1bHQgc3lzdGVtIHByb21wdOulvCDsnpDrj5nsnLzroZwg7KO87J6F7ZWoKDIzaylcbiAgICBcIi0tc3lzdGVtLXByb21wdFwiLFxuICAgIGlucHV0LnN5c3RlbSA/PyBcIlwiLFxuICAgIFwiLS10aGlua2luZ1wiLFxuICAgIFwiZGlzYWJsZWRcIixcbiAgICBcIi0tZWZmb3J0XCIsXG4gICAgaW5wdXQuZWZmb3J0ID8/IERFRkFVTFRfRUZGT1JULFxuICAgIFwiLS1uby1zZXNzaW9uLXBlcnNpc3RlbmNlXCIsXG4gICAgLy8g66qo65OgIHNraWxscyDruYTtmZzshLHtmZRcbiAgICBcIi0tZGlzYWJsZS1zbGFzaC1jb21tYW5kc1wiLFxuICBdO1xuICBpZiAodXNlU3RydWN0dXJlZE91dHB1dCkge1xuICAgIGFyZ3MucHVzaChcIi0tanNvbi1zY2hlbWFcIiwgaW5wdXQuanNvblNjaGVtYSEpO1xuICB9XG4gIGFyZ3MucHVzaChpbnB1dC5wcm9tcHQpO1xuXG4gIGNvbnN0IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSB7XG4gICAgUEFUSDogcHJvY2Vzcy5lbnYuUEFUSCxcbiAgICBUTVBESVI6IHByb2Nlc3MuZW52LlRNUERJUixcbiAgICBDTEFVREVfQ09ERV9PQVVUSF9UT0tFTjogdG9rZW4sXG4gICAgLy8gQ0xBVURFX0NPTkZJR19ESVIg7ZmY6rK967OA7IiY66GcIOyjvOyehVxuICAgIENMQVVERV9DT05GSUdfRElSLFxuICAgIENMQVVERV9DT0RFX0RJU0FCTEVfQVVUT19NRU1PUlk6IFwiMVwiLFxuICAgIENMQVVERV9DT0RFX0RJU0FCTEVfQURBUFRJVkVfVEhJTktJTkc6IFwiMVwiLFxuICAgIENMQVVERV9DT0RFX0RJU0FCTEVfMU1fQ09OVEVYVDogXCIxXCIsXG4gICAgQ0xBVURFX0NPREVfRElTQUJMRV9DTEFVREVfTURTOiBcIjFcIixcbiAgICBDTEFVREVfQ09ERV9BVFRSSUJVVElPTl9IRUFERVI6IFwiMFwiLFxuICB9O1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxPbWl0PFF1ZXJ5T3V0cHV0LCBcImNvbnRlbnRcIiB8IFwiZmluaXNoUmVhc29uXCI+PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihcImNsYXVkZVwiLCBhcmdzLCB7XG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwicGlwZVwiLCBcImlnbm9yZVwiXSxcbiAgICAgIGVudixcbiAgICAgIC8vIOqyqeumrCAo65GQIOuLqOqzhCk6XG4gICAgICAvLyAxLiBDTEFVREVfQ1dEIOKAlCBwcm9qZWN0IHNjb3BlIOqyqeumrCAoY3dkIOydmCAuY2xhdWRlL3NldHRpbmdzLmpzb24pXG4gICAgICAvLyAyLiBDTEFVREVfQ09ORklHX0RJUiDigJQgdXNlciBzY29wZSDqsqnrpqwgY3dkIOqyqeumrOunjOycvOuhoCDrtoDsobEuXG4gICAgICBjd2Q6IENMQVVERV9DV0QsXG4gICAgfSk7XG5cbiAgICBsZXQgYnVmZmVyID0gXCJcIjtcbiAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICBjaGlsZC5raWxsKCk7XG4gICAgICByZWplY3QobmV3IFRpbWVvdXRFcnJvcihgVGltZW91dCBhZnRlciAke3RpbWVvdXQgLyAxMDAwfXMgKHRva2VuOiAke21hc2tUb2tlbih0b2tlbil9KWApKTtcbiAgICB9LCB0aW1lb3V0KTtcblxuICAgIGNoaWxkLnN0ZG91dD8ub24oXCJkYXRhXCIsIChkOiBCdWZmZXIpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBidWZmZXIgKz0gZC50b1N0cmluZygpO1xuICAgICAgY29uc3QgbGluZXMgPSBidWZmZXIuc3BsaXQoXCJcXG5cIik7XG4gICAgICBidWZmZXIgPSBsaW5lcy5wb3AoKSA/PyBcIlwiO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmICghbGluZS50cmltKCkpIGNvbnRpbnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGogPSBKU09OLnBhcnNlKGxpbmUpO1xuICAgICAgICAgIGlmIChqLnR5cGUgPT09IFwicmVzdWx0XCIgJiYgIXNldHRsZWQpIHtcbiAgICAgICAgICAgIC8vIC0tanNvbi1zY2hlbWEg7IKs7JqpIOyLnCBzdHJ1Y3R1cmVkX291dHB1dCDsl5Ag7YyM7Iux65CcIOqwneyytOqwgCDsmKjri6Qg4oaSIOyasOyEoCDsgqzsmqlcbiAgICAgICAgICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoai5zdHJ1Y3R1cmVkX291dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHRleHQgPSBKU09OLnN0cmluZ2lmeShqLnN0cnVjdHVyZWRfb3V0cHV0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRleHQgPSAoai5yZXN1bHQgPz8gXCJcIilcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXmBgYCg/Ompzb24pP1xccypcXG4/L2ksIFwiXCIpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcbj9gYGBcXHMqJC9pLCBcIlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aChcIllvdSd2ZSBoaXRcIikpIHtcbiAgICAgICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgUXVvdGFFcnJvcihgUXVvdGEgZXhoYXVzdGVkICh0b2tlbjogJHttYXNrVG9rZW4odG9rZW4pfSlgKSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdSA9IGoudXNhZ2UgPz8ge307XG4gICAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgdXNhZ2U6IHtcbiAgICAgICAgICAgICAgICBpbnB1dF90b2tlbnM6IHUuaW5wdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgICAgb3V0cHV0X3Rva2VuczogdS5vdXRwdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiB1LmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zOiB1LmNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uTXM6IGouZHVyYXRpb25fbXMgPz8gMCxcbiAgICAgICAgICAgICAgY29zdFVzZDogai50b3RhbF9jb3N0X3VzZCA/PyAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICByZWplY3QobmV3IFByb2Nlc3NFcnJvcihgQ0xJIHByb2Nlc3MgY2xvc2VkIHdpdGhvdXQgcmVzdWx0ICh0b2tlbjogJHttYXNrVG9rZW4odG9rZW4pfSlgKSk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICByZWplY3QobmV3IFByb2Nlc3NFcnJvcihgQ0xJIHByb2Nlc3MgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9ICh0b2tlbjogJHttYXNrVG9rZW4odG9rZW4pfSlgKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgUWdyaWREaXNwYXRjaGVyID0gbmV3IFFncmlkRGlzcGF0Y2hlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQ0EsTUFBTSxTQUFTLFVBQVUsQ0FBQyxRQUFRLENBQUM7QUFFbkMsTUFBTSxnQkFBZ0I7QUFDdEIsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxpQkFBaUI7QUFJdkIsTUFBTSxhQUFhO0FBR25CLE1BQU0sb0JBQW9CO0FBRzFCLE1BQU0sd0JBQXdCO0NBQzVCLHVCQUF1QjtDQUN2Qix3QkFBd0I7Q0FDeEIsbUJBQW1CO0NBQ3BCO0FBR0QsTUFBTSxvQkFBb0I7QUFFMUIsU0FBZ0Isd0JBQ2QsT0FDdUI7Q0FDdkIsTUFBTSxlQUFlLE1BQU0sT0FBTyxTQUM5QixvQkFBb0IsTUFBTSxNQUFNLEdBQ2hDLE1BQU0sYUFDSCxLQUFLLE1BQU0sTUFBTSxXQUFXLEdBQzdCO0FBRU4sUUFBTyxlQUNGLFVBQVUsYUFBZ0QsR0FDM0Q7O0FBR04sSUFBYSx1QkFBYixNQUFrQztDQUNoQyx5QkFBUyxJQUFJLEtBQTJCO0NBR3hDLGdDQUFnQixJQUFJLEtBQXFCO0NBQ3pDLFVBQVU7Q0FHVixhQUFxQztDQUNyQyxtQkFBNEM7Q0FDNUMsc0JBQWtEO0NBRWxELGNBQWM7RUFDWixNQUFNLGVBQWUsS0FBSyxVQUFVLHVCQUF1QixNQUFNLEVBQUU7QUFFbkUsWUFBVSxHQUFHLFdBQVcsV0FBVyxFQUFFLFdBQVcsTUFBTSxDQUFDO0FBQ3ZELGdCQUFjLEdBQUcsV0FBVyx5QkFBeUIsYUFBYTtBQUVsRSxZQUFVLG1CQUFtQixFQUFFLFdBQVcsTUFBTSxDQUFDO0FBQ2pELGdCQUFjLEdBQUcsa0JBQWtCLGdCQUFnQixLQUFLO0FBQ3hELGdC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
|
|
@@ -4,9 +4,82 @@ import {
|
|
|
4
4
|
type GenerateRequest,
|
|
5
5
|
type GenerateResult,
|
|
6
6
|
} from "../../utils/providers/common/provider-dispatcher";
|
|
7
|
-
import { QgridDispatcherClass } from "./qgrid.dispatcher";
|
|
7
|
+
import { buildStrictOutputSchema, QgridDispatcherClass } from "./qgrid.dispatcher";
|
|
8
8
|
|
|
9
9
|
describe("QgridDispatcherClass", () => {
|
|
10
|
+
it("jsonSchema 를 required + additionalProperties:false 로 strictify 한다", () => {
|
|
11
|
+
const schema = buildStrictOutputSchema({
|
|
12
|
+
jsonSchema: JSON.stringify({
|
|
13
|
+
type: "object",
|
|
14
|
+
properties: {
|
|
15
|
+
contents: {
|
|
16
|
+
type: "array",
|
|
17
|
+
items: {
|
|
18
|
+
type: "object",
|
|
19
|
+
properties: { text: { type: "string" } },
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
}),
|
|
24
|
+
}) as {
|
|
25
|
+
required?: string[];
|
|
26
|
+
additionalProperties?: boolean;
|
|
27
|
+
properties?: {
|
|
28
|
+
contents?: {
|
|
29
|
+
items?: { required?: string[]; additionalProperties?: boolean };
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
expect(schema.required).toEqual(["contents"]);
|
|
35
|
+
expect(schema.additionalProperties).toBe(false);
|
|
36
|
+
const contentsArray = (
|
|
37
|
+
schema.properties?.contents as {
|
|
38
|
+
anyOf?: Array<{ items?: { required?: string[]; additionalProperties?: boolean } }>;
|
|
39
|
+
}
|
|
40
|
+
).anyOf?.[0];
|
|
41
|
+
expect(contentsArray?.items?.required).toEqual(["text"]);
|
|
42
|
+
expect(contentsArray?.items?.additionalProperties).toBe(false);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("Anthropic provider 경로에 strictified outputSchema 를 전달한다", async () => {
|
|
46
|
+
const dispatcher = new QgridDispatcherClass();
|
|
47
|
+
const generate = vi.fn(
|
|
48
|
+
async (_req: GenerateRequest): Promise<GenerateResult> => ({
|
|
49
|
+
text: '{"contents":[{"text":"ok"}]}',
|
|
50
|
+
tokenName: "anthropic/test",
|
|
51
|
+
usage: {
|
|
52
|
+
totalTokens: 10,
|
|
53
|
+
inputTokens: 5,
|
|
54
|
+
cachedInputTokens: 0,
|
|
55
|
+
outputTokens: 5,
|
|
56
|
+
reasoningOutputTokens: 0,
|
|
57
|
+
},
|
|
58
|
+
durationMs: 12,
|
|
59
|
+
costUsd: 0.01,
|
|
60
|
+
model: "claude-sonnet-4-6",
|
|
61
|
+
threadCoord: { workerId: 1, threadId: "sess-1", epoch: 0 },
|
|
62
|
+
}),
|
|
63
|
+
);
|
|
64
|
+
dispatcher.anthropicDispatcher = { generate } as never;
|
|
65
|
+
|
|
66
|
+
await dispatcher.query({
|
|
67
|
+
prompt: "hi",
|
|
68
|
+
model: "anthropic/claude-sonnet-4-6",
|
|
69
|
+
jsonSchema: JSON.stringify({
|
|
70
|
+
type: "object",
|
|
71
|
+
properties: { contents: { type: "array", items: { type: "object" } } },
|
|
72
|
+
}),
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const outputSchema = generate.mock.calls[0]![0].outputSchema as {
|
|
76
|
+
required?: string[];
|
|
77
|
+
additionalProperties?: boolean;
|
|
78
|
+
};
|
|
79
|
+
expect(outputSchema.required).toEqual(["contents"]);
|
|
80
|
+
expect(outputSchema.additionalProperties).toBe(false);
|
|
81
|
+
});
|
|
82
|
+
|
|
10
83
|
it("provider 가 산출한 costUsd 를 가격표 fallback 보다 우선한다", async () => {
|
|
11
84
|
const dispatcher = new QgridDispatcherClass();
|
|
12
85
|
const generate = vi.fn(
|
|
@@ -58,6 +58,20 @@ const QGRID_CLAUDE_SETTINGS = {
|
|
|
58
58
|
// 토큰 만료 임박 임계값 — token.expiredAt이 1분 안에 만료된다면 query 시 체크하고 refresh.
|
|
59
59
|
const REFRESH_SAFETY_MS = 60_000;
|
|
60
60
|
|
|
61
|
+
export function buildStrictOutputSchema(
|
|
62
|
+
input: Pick<QueryInput, "tools" | "jsonSchema">,
|
|
63
|
+
): JsonValue | undefined {
|
|
64
|
+
const outputSchema = input.tools?.length
|
|
65
|
+
? buildToolCallSchema(input.tools)
|
|
66
|
+
: input.jsonSchema
|
|
67
|
+
? (JSON.parse(input.jsonSchema) as JsonValue)
|
|
68
|
+
: undefined;
|
|
69
|
+
|
|
70
|
+
return outputSchema
|
|
71
|
+
? (strictify(outputSchema as Parameters<typeof strictify>[0]) as JsonValue)
|
|
72
|
+
: undefined;
|
|
73
|
+
}
|
|
74
|
+
|
|
61
75
|
export class QgridDispatcherClass {
|
|
62
76
|
tokens = new Map<number, TokenSubsetA>();
|
|
63
77
|
|
|
@@ -123,11 +137,7 @@ export class QgridDispatcherClass {
|
|
|
123
137
|
throw new ProcessError("tools and jsonSchema cannot be used together");
|
|
124
138
|
}
|
|
125
139
|
|
|
126
|
-
const outputSchema = input
|
|
127
|
-
? buildToolCallSchema(input.tools)
|
|
128
|
-
: input.jsonSchema
|
|
129
|
-
? (JSON.parse(input.jsonSchema) as JsonValue)
|
|
130
|
-
: undefined;
|
|
140
|
+
const outputSchema = buildStrictOutputSchema(input);
|
|
131
141
|
|
|
132
142
|
// provider prefix routing: 'openai/gpt-5.4' → OpenAIDispatcher
|
|
133
143
|
if (input.model?.includes("/")) {
|
|
@@ -139,9 +149,7 @@ export class QgridDispatcherClass {
|
|
|
139
149
|
const result = await this.openaiDispatcher.generate({
|
|
140
150
|
model: model,
|
|
141
151
|
systemPrompt: input.system,
|
|
142
|
-
outputSchema
|
|
143
|
-
? (strictify(outputSchema as Parameters<typeof strictify>[0]) as JsonValue)
|
|
144
|
-
: undefined,
|
|
152
|
+
outputSchema,
|
|
145
153
|
effort: input.effort,
|
|
146
154
|
verbosity: input.verbosity,
|
|
147
155
|
reasoningSummary: input.reasoningSummary,
|
|
@@ -165,9 +173,7 @@ export class QgridDispatcherClass {
|
|
|
165
173
|
// 강제로 끼워 dispatcher default 를 죽이지 않는다. prefix 정규화도 dispatcher 내부에서.
|
|
166
174
|
model: input.model,
|
|
167
175
|
systemPrompt: input.system,
|
|
168
|
-
outputSchema
|
|
169
|
-
? (strictify(outputSchema as Parameters<typeof strictify>[0]) as JsonValue)
|
|
170
|
-
: undefined,
|
|
176
|
+
outputSchema,
|
|
171
177
|
effort: input.effort,
|
|
172
178
|
coldInput: decision.coldInput,
|
|
173
179
|
coldHistory: decision.coldHistory,
|
|
@@ -180,10 +186,9 @@ export class QgridDispatcherClass {
|
|
|
180
186
|
}
|
|
181
187
|
|
|
182
188
|
// 폴백: AnthropicDispatcher 미초기화 시 기존 stateless claude -p 경로(멀티턴 없음).
|
|
183
|
-
const executionInput =
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
: input;
|
|
189
|
+
const executionInput = outputSchema
|
|
190
|
+
? { ...input, jsonSchema: JSON.stringify(outputSchema) }
|
|
191
|
+
: input;
|
|
187
192
|
|
|
188
193
|
const electedToken = this.selectToken();
|
|
189
194
|
if (!electedToken) throw new QuotaError("No tokens available");
|
|
@@ -231,20 +236,14 @@ export class QgridDispatcherClass {
|
|
|
231
236
|
if (!input.model?.startsWith("openai/")) {
|
|
232
237
|
// AnthropicDispatcher 가 있으면 실제 delta 스트리밍. 없으면 기존 query() 폴백(delta 없음).
|
|
233
238
|
if (this.anthropicDispatcher) {
|
|
234
|
-
const outputSchema = input
|
|
235
|
-
? buildToolCallSchema(input.tools)
|
|
236
|
-
: input.jsonSchema
|
|
237
|
-
? (JSON.parse(input.jsonSchema) as JsonValue)
|
|
238
|
-
: undefined;
|
|
239
|
+
const outputSchema = buildStrictOutputSchema(input);
|
|
239
240
|
const decision = decideConvRouting(input);
|
|
240
241
|
await this.anthropicDispatcher.generateStream(
|
|
241
242
|
{
|
|
242
243
|
// model 미지정 시 dispatcher 가 ANTHROPIC_DEFAULT_MODEL 적용. prefix 정규화도 내부에서.
|
|
243
244
|
model: input.model,
|
|
244
245
|
systemPrompt: input.system,
|
|
245
|
-
outputSchema
|
|
246
|
-
? (strictify(outputSchema as Parameters<typeof strictify>[0]) as JsonValue)
|
|
247
|
-
: undefined,
|
|
246
|
+
outputSchema,
|
|
248
247
|
effort: input.effort,
|
|
249
248
|
coldInput: decision.coldInput,
|
|
250
249
|
coldHistory: decision.coldHistory,
|
|
@@ -274,20 +273,14 @@ export class QgridDispatcherClass {
|
|
|
274
273
|
if (!model) throw new ProcessError("unknown model");
|
|
275
274
|
if (!this.openaiDispatcher) throw new QuotaError("OpenAI dispatcher not initialized");
|
|
276
275
|
|
|
277
|
-
const outputSchema = input
|
|
278
|
-
? buildToolCallSchema(input.tools)
|
|
279
|
-
: input.jsonSchema
|
|
280
|
-
? (JSON.parse(input.jsonSchema) as JsonValue)
|
|
281
|
-
: undefined;
|
|
276
|
+
const outputSchema = buildStrictOutputSchema(input);
|
|
282
277
|
|
|
283
278
|
const decision = decideConvRouting(input);
|
|
284
279
|
await this.openaiDispatcher.generateStream(
|
|
285
280
|
{
|
|
286
281
|
model,
|
|
287
282
|
systemPrompt: input.system,
|
|
288
|
-
outputSchema
|
|
289
|
-
? (strictify(outputSchema as Parameters<typeof strictify>[0]) as JsonValue)
|
|
290
|
-
: undefined,
|
|
283
|
+
outputSchema,
|
|
291
284
|
effort: input.effort,
|
|
292
285
|
verbosity: input.verbosity,
|
|
293
286
|
reasoningSummary: input.reasoningSummary,
|