@openai/agents-realtime 0.13.0 → 0.13.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.
- package/dist/bundle/agent-Bk8ZINBX.mjs +642 -0
- package/dist/bundle/index-IC-GtnyH.mjs +23394 -0
- package/dist/bundle/openai-realtime-agents.mjs +1 -1
- package/dist/bundle/openai-realtime-agents.umd.js +53 -53
- package/dist/metadata.js +2 -2
- package/dist/metadata.mjs +2 -2
- package/dist/openaiRealtimeWebRtc.js +28 -0
- package/dist/openaiRealtimeWebRtc.js.map +1 -1
- package/dist/openaiRealtimeWebRtc.mjs +28 -0
- package/dist/openaiRealtimeWebRtc.mjs.map +1 -1
- package/package.json +2 -2
- package/dist/bundle/agent-C5sYsRJQ.mjs +0 -638
- package/dist/bundle/index-x9KfzV3j.mjs +0 -23314
|
@@ -1,638 +0,0 @@
|
|
|
1
|
-
var U = Object.defineProperty;
|
|
2
|
-
var j = (t, s, e) => s in t ? U(t, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : t[s] = e;
|
|
3
|
-
var o = (t, s, e) => j(t, typeof s != "symbol" ? s + "" : s, e);
|
|
4
|
-
import { Capability as _, requireBoundSession as N, UserError as b, tool as m, object as y, string as p, applyPatchTool as K, withSandboxSpan as w, isRecord as L, encodeUint8ArrayToBase64 as H, ApplyPatchOperation as z, number as d, boolean as P, prompt as T, Agent as X, SANDBOX_AGENT_BRAND as q, cloneManifest as G, Manifest as Y, normalizeUser as J } from "./index-x9KfzV3j.mjs";
|
|
5
|
-
function V(t) {
|
|
6
|
-
return t ? !(typeof t == "object" && t && "constructor" in t && typeof t.constructor == "function" ? t.constructor.name : "").includes("ChatCompletions") : !0;
|
|
7
|
-
}
|
|
8
|
-
function Q(t) {
|
|
9
|
-
return $(t);
|
|
10
|
-
}
|
|
11
|
-
function $(t) {
|
|
12
|
-
return t ? !(typeof t == "object" && t && "constructor" in t && typeof t.constructor == "function" ? t.constructor.name : "").includes("ChatCompletions") : !1;
|
|
13
|
-
}
|
|
14
|
-
class Z {
|
|
15
|
-
}
|
|
16
|
-
class ee extends Z {
|
|
17
|
-
constructor(e = 0.9, i = 24e4) {
|
|
18
|
-
super();
|
|
19
|
-
o(this, "thresholdRatio");
|
|
20
|
-
o(this, "fallbackThreshold");
|
|
21
|
-
this.thresholdRatio = e, this.fallbackThreshold = i;
|
|
22
|
-
}
|
|
23
|
-
compactThreshold(e) {
|
|
24
|
-
if (!e)
|
|
25
|
-
return this.fallbackThreshold;
|
|
26
|
-
const i = u.forModel(e);
|
|
27
|
-
return i ? Math.floor(i.contextWindow * this.thresholdRatio) : this.fallbackThreshold;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
class u {
|
|
31
|
-
constructor(s) {
|
|
32
|
-
o(this, "contextWindow");
|
|
33
|
-
this.contextWindow = s;
|
|
34
|
-
}
|
|
35
|
-
static forModel(s) {
|
|
36
|
-
for (const e of ie(s)) {
|
|
37
|
-
if (ne.has(e))
|
|
38
|
-
return new u(1047576);
|
|
39
|
-
if (re.has(e))
|
|
40
|
-
return new u(4e5);
|
|
41
|
-
if (oe.has(e))
|
|
42
|
-
return new u(2e5);
|
|
43
|
-
if (ae.has(e))
|
|
44
|
-
return new u(128e3);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
class te extends _ {
|
|
49
|
-
constructor(e = new ee()) {
|
|
50
|
-
super();
|
|
51
|
-
o(this, "type", "compaction");
|
|
52
|
-
o(this, "policy");
|
|
53
|
-
this.policy = e;
|
|
54
|
-
}
|
|
55
|
-
samplingParams(e) {
|
|
56
|
-
if (e.modelInstance && !V(e.modelInstance))
|
|
57
|
-
return {};
|
|
58
|
-
const i = typeof e.model == "string" ? e.model : void 0;
|
|
59
|
-
return {
|
|
60
|
-
context_management: [
|
|
61
|
-
{
|
|
62
|
-
type: "compaction",
|
|
63
|
-
compact_threshold: this.policy.compactThreshold(i)
|
|
64
|
-
}
|
|
65
|
-
]
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
processContext(e) {
|
|
69
|
-
let i = -1;
|
|
70
|
-
for (let n = 0; n < e.length; n += 1)
|
|
71
|
-
e[n].type === "compaction" && (i = n);
|
|
72
|
-
return i === -1 ? e : e.slice(i);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
function se(t = {}) {
|
|
76
|
-
return new te(t.policy);
|
|
77
|
-
}
|
|
78
|
-
function ie(t) {
|
|
79
|
-
const s = t.trim();
|
|
80
|
-
if (!s)
|
|
81
|
-
return [];
|
|
82
|
-
const i = (s.includes("/") ? s.slice(s.lastIndexOf("/") + 1) : s).toLowerCase(), n = i.replace(/-\d{4}-\d{2}-\d{2}$/u, "");
|
|
83
|
-
return [.../* @__PURE__ */ new Set([i, n])];
|
|
84
|
-
}
|
|
85
|
-
const ne = /* @__PURE__ */ new Set([
|
|
86
|
-
"gpt-5.4",
|
|
87
|
-
"gpt-5.4-2026-03-05",
|
|
88
|
-
"gpt-5.4-pro",
|
|
89
|
-
"gpt-5.4-pro-2026-03-05",
|
|
90
|
-
"gpt-4.1",
|
|
91
|
-
"gpt-4.1-2025-04-14",
|
|
92
|
-
"gpt-4.1-mini",
|
|
93
|
-
"gpt-4.1-mini-2025-04-14",
|
|
94
|
-
"gpt-4.1-nano",
|
|
95
|
-
"gpt-4.1-nano-2025-04-14"
|
|
96
|
-
]), re = /* @__PURE__ */ new Set([
|
|
97
|
-
"gpt-5",
|
|
98
|
-
"gpt-5-codex",
|
|
99
|
-
"gpt-5-mini",
|
|
100
|
-
"gpt-5-nano",
|
|
101
|
-
"gpt-5-pro",
|
|
102
|
-
"gpt-5.1",
|
|
103
|
-
"gpt-5.1-codex",
|
|
104
|
-
"gpt-5.1-codex-max",
|
|
105
|
-
"gpt-5.1-codex-mini",
|
|
106
|
-
"gpt-5.2",
|
|
107
|
-
"gpt-5.2-codex",
|
|
108
|
-
"gpt-5.2-codex-cyber",
|
|
109
|
-
"gpt-5.2-pro",
|
|
110
|
-
"gpt-5.3-codex",
|
|
111
|
-
"gpt-5.3-codex-spark",
|
|
112
|
-
"gpt-5.4-mini",
|
|
113
|
-
"gpt-5.4-nano"
|
|
114
|
-
]), oe = /* @__PURE__ */ new Set([
|
|
115
|
-
"codex-mini-latest",
|
|
116
|
-
"o1",
|
|
117
|
-
"o1-2024-12-17",
|
|
118
|
-
"o1-pro",
|
|
119
|
-
"o3",
|
|
120
|
-
"o3-2025-04-16",
|
|
121
|
-
"o3-mini",
|
|
122
|
-
"o3-pro",
|
|
123
|
-
"o3-deep-research",
|
|
124
|
-
"o4-mini",
|
|
125
|
-
"o4-mini-2025-04-16",
|
|
126
|
-
"o4-mini-deep-research"
|
|
127
|
-
]), ae = /* @__PURE__ */ new Set([
|
|
128
|
-
"gpt-4o",
|
|
129
|
-
"gpt-4o-2024-08-06",
|
|
130
|
-
"gpt-4o-mini",
|
|
131
|
-
"gpt-4o-mini-2024-07-18",
|
|
132
|
-
"gpt-5-chat-latest",
|
|
133
|
-
"gpt-5.1-chat-latest",
|
|
134
|
-
"gpt-5.2-chat-latest",
|
|
135
|
-
"gpt-5.3-chat-latest"
|
|
136
|
-
]), le = {
|
|
137
|
-
type: "object",
|
|
138
|
-
properties: {
|
|
139
|
-
patch: {
|
|
140
|
-
type: "string",
|
|
141
|
-
description: "A freeform apply_patch payload wrapped in *** Begin Patch and *** End Patch."
|
|
142
|
-
},
|
|
143
|
-
operation: {
|
|
144
|
-
type: "object",
|
|
145
|
-
description: "A single structured apply_patch operation."
|
|
146
|
-
},
|
|
147
|
-
operations: {
|
|
148
|
-
type: "array",
|
|
149
|
-
items: { type: "object" },
|
|
150
|
-
description: "Structured apply_patch operations to apply in order."
|
|
151
|
-
},
|
|
152
|
-
command: {
|
|
153
|
-
type: "array",
|
|
154
|
-
description: 'Optional ["apply_patch", patch] command tuple form.'
|
|
155
|
-
},
|
|
156
|
-
type: {
|
|
157
|
-
type: "string",
|
|
158
|
-
enum: ["create_file", "update_file", "delete_file"],
|
|
159
|
-
description: "The patch operation to apply."
|
|
160
|
-
},
|
|
161
|
-
path: {
|
|
162
|
-
type: "string",
|
|
163
|
-
description: "The sandbox file path to patch."
|
|
164
|
-
},
|
|
165
|
-
diff: {
|
|
166
|
-
type: "string",
|
|
167
|
-
description: "The V4A patch diff for create_file and update_file operations."
|
|
168
|
-
},
|
|
169
|
-
moveTo: {
|
|
170
|
-
type: "string",
|
|
171
|
-
description: "Optional destination path for update_file move operations."
|
|
172
|
-
}
|
|
173
|
-
},
|
|
174
|
-
required: [],
|
|
175
|
-
additionalProperties: !0
|
|
176
|
-
}, k = "*** Begin Patch", C = "*** End Patch", x = "*** Add File: ", I = "*** Delete File: ", v = "*** Update File: ", D = "*** Move to: ";
|
|
177
|
-
function A(t) {
|
|
178
|
-
if (t instanceof Error)
|
|
179
|
-
return t.message || t.toString();
|
|
180
|
-
try {
|
|
181
|
-
return JSON.stringify(t);
|
|
182
|
-
} catch {
|
|
183
|
-
return String(t);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
function ce(t) {
|
|
187
|
-
if (typeof t == "string")
|
|
188
|
-
return t;
|
|
189
|
-
const s = t.image;
|
|
190
|
-
if (typeof s == "string")
|
|
191
|
-
return s;
|
|
192
|
-
if (!L(s))
|
|
193
|
-
return "No image data was returned by the sandbox session.";
|
|
194
|
-
const e = s;
|
|
195
|
-
return typeof e.url == "string" ? e.url : typeof e.fileId == "string" ? `OpenAI file reference: ${e.fileId}` : typeof e.data == "string" ? `data:${typeof e.mediaType == "string" ? e.mediaType : "application/octet-stream"};base64,${e.data}` : e.data instanceof Uint8Array ? `data:${typeof e.mediaType == "string" ? e.mediaType : "application/octet-stream"};base64,${H(e.data)}` : "No image data was returned by the sandbox session.";
|
|
196
|
-
}
|
|
197
|
-
function pe(t, s) {
|
|
198
|
-
const e = A(s);
|
|
199
|
-
if (/not found/iu.test(e))
|
|
200
|
-
return `image path \`${t}\` was not found`;
|
|
201
|
-
if (/not a file/iu.test(e))
|
|
202
|
-
return `image path \`${t}\` is not a file`;
|
|
203
|
-
if (/exceeds the 10 MB limit|exceeded the allowed size/iu.test(e))
|
|
204
|
-
return `image path \`${t}\` exceeded the allowed size of 10MB; resize or compress the image and try again`;
|
|
205
|
-
if (/unsupported image format|not a supported image/iu.test(e))
|
|
206
|
-
return `image path \`${t}\` is not a supported image file`;
|
|
207
|
-
const i = s instanceof Error ? s.name : typeof s;
|
|
208
|
-
return `unable to read image at \`${t}\`: ${i}`;
|
|
209
|
-
}
|
|
210
|
-
function ue(t) {
|
|
211
|
-
const s = t.trimStart();
|
|
212
|
-
if (s.startsWith(k))
|
|
213
|
-
return f(s);
|
|
214
|
-
let e;
|
|
215
|
-
try {
|
|
216
|
-
e = JSON.parse(t);
|
|
217
|
-
} catch (i) {
|
|
218
|
-
return {
|
|
219
|
-
ok: !1,
|
|
220
|
-
error: `Invalid apply_patch JSON: ${A(i)}`
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
return de(e);
|
|
224
|
-
}
|
|
225
|
-
function de(t) {
|
|
226
|
-
if (typeof t == "string")
|
|
227
|
-
return f(t);
|
|
228
|
-
if (Array.isArray(t))
|
|
229
|
-
return h(t);
|
|
230
|
-
if (!L(t))
|
|
231
|
-
return {
|
|
232
|
-
ok: !1,
|
|
233
|
-
error: "apply_patch input must be an object or array."
|
|
234
|
-
};
|
|
235
|
-
if (typeof t.patch == "string")
|
|
236
|
-
return f(t.patch);
|
|
237
|
-
if (Array.isArray(t.command)) {
|
|
238
|
-
const [s, e] = t.command;
|
|
239
|
-
if (s === "apply_patch" && typeof e == "string")
|
|
240
|
-
return f(e);
|
|
241
|
-
}
|
|
242
|
-
return Array.isArray(t.operations) ? h(t.operations) : t.operation !== void 0 ? h([t.operation]) : h([t]);
|
|
243
|
-
}
|
|
244
|
-
function h(t) {
|
|
245
|
-
const s = [];
|
|
246
|
-
for (const e of t) {
|
|
247
|
-
const i = z.safeParse(e);
|
|
248
|
-
if (!i.success)
|
|
249
|
-
return {
|
|
250
|
-
ok: !1,
|
|
251
|
-
error: `Invalid apply_patch operation: ${i.error.message}`
|
|
252
|
-
};
|
|
253
|
-
s.push(i.data);
|
|
254
|
-
}
|
|
255
|
-
return s.length === 0 ? { ok: !1, error: "apply_patch input must include an operation." } : { ok: !0, operations: s };
|
|
256
|
-
}
|
|
257
|
-
function f(t) {
|
|
258
|
-
const s = t.split(/\r?\n/);
|
|
259
|
-
if (s.at(-1) === "" && s.pop(), s[0] !== k)
|
|
260
|
-
return {
|
|
261
|
-
ok: !1,
|
|
262
|
-
error: `apply_patch input must start with "${k}".`
|
|
263
|
-
};
|
|
264
|
-
if (s.length < 2 || s.at(-1) !== C)
|
|
265
|
-
return {
|
|
266
|
-
ok: !1,
|
|
267
|
-
error: `apply_patch input must end with "${C}".`
|
|
268
|
-
};
|
|
269
|
-
const e = [];
|
|
270
|
-
let i = 1;
|
|
271
|
-
for (; i < s.length - 1; ) {
|
|
272
|
-
const n = s[i];
|
|
273
|
-
let r;
|
|
274
|
-
if (n.startsWith(x))
|
|
275
|
-
r = he(s, i);
|
|
276
|
-
else if (n.startsWith(I))
|
|
277
|
-
r = fe(s, i);
|
|
278
|
-
else if (n.startsWith(v))
|
|
279
|
-
r = me(s, i);
|
|
280
|
-
else
|
|
281
|
-
return {
|
|
282
|
-
ok: !1,
|
|
283
|
-
error: `Invalid apply_patch file operation header: ${n}`
|
|
284
|
-
};
|
|
285
|
-
if ("error" in r)
|
|
286
|
-
return { ok: !1, error: r.error };
|
|
287
|
-
e.push(r.operation), i = r.nextIndex;
|
|
288
|
-
}
|
|
289
|
-
return e.length === 0 ? {
|
|
290
|
-
ok: !1,
|
|
291
|
-
error: "apply_patch input must include at least one file operation."
|
|
292
|
-
} : { ok: !0, operations: e };
|
|
293
|
-
}
|
|
294
|
-
function he(t, s) {
|
|
295
|
-
const e = g(t[s], x);
|
|
296
|
-
if (!e)
|
|
297
|
-
return { error: `Missing path in apply_patch header: ${t[s]}` };
|
|
298
|
-
s += 1;
|
|
299
|
-
const i = [];
|
|
300
|
-
for (; s < t.length - 1 && !S(t[s]); ) {
|
|
301
|
-
const n = t[s];
|
|
302
|
-
if (!n.startsWith("+"))
|
|
303
|
-
return { error: `Invalid Add File line: ${n}` };
|
|
304
|
-
i.push(n), s += 1;
|
|
305
|
-
}
|
|
306
|
-
return i.length === 0 ? {
|
|
307
|
-
error: `Add File patch for ${e} must include at least one + line.`
|
|
308
|
-
} : {
|
|
309
|
-
operation: {
|
|
310
|
-
type: "create_file",
|
|
311
|
-
path: e,
|
|
312
|
-
diff: F(i)
|
|
313
|
-
},
|
|
314
|
-
nextIndex: s
|
|
315
|
-
};
|
|
316
|
-
}
|
|
317
|
-
function fe(t, s) {
|
|
318
|
-
const e = g(t[s], I);
|
|
319
|
-
return e ? (s += 1, s < t.length - 1 && !S(t[s]) ? { error: `Delete File patch for ${e} must not include a diff.` } : {
|
|
320
|
-
operation: {
|
|
321
|
-
type: "delete_file",
|
|
322
|
-
path: e
|
|
323
|
-
},
|
|
324
|
-
nextIndex: s
|
|
325
|
-
}) : { error: `Missing path in apply_patch header: ${t[s]}` };
|
|
326
|
-
}
|
|
327
|
-
function me(t, s) {
|
|
328
|
-
const e = g(t[s], v);
|
|
329
|
-
if (!e)
|
|
330
|
-
return { error: `Missing path in apply_patch header: ${t[s]}` };
|
|
331
|
-
s += 1;
|
|
332
|
-
let i;
|
|
333
|
-
if (s < t.length - 1 && t[s].startsWith(D)) {
|
|
334
|
-
const r = g(t[s], D);
|
|
335
|
-
if (!r)
|
|
336
|
-
return { error: `Missing path in apply_patch header: ${t[s]}` };
|
|
337
|
-
i = r, s += 1;
|
|
338
|
-
}
|
|
339
|
-
const n = [];
|
|
340
|
-
for (; s < t.length - 1 && !S(t[s]); )
|
|
341
|
-
n.push(t[s]), s += 1;
|
|
342
|
-
return n.length === 0 && !i ? { error: `Update File patch for ${e} must include a hunk.` } : {
|
|
343
|
-
operation: {
|
|
344
|
-
type: "update_file",
|
|
345
|
-
path: e,
|
|
346
|
-
diff: n.length > 0 ? F(n) : "",
|
|
347
|
-
...i ? { moveTo: i } : {}
|
|
348
|
-
},
|
|
349
|
-
nextIndex: s
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
function g(t, s) {
|
|
353
|
-
const e = t.slice(s.length).trim();
|
|
354
|
-
return e || null;
|
|
355
|
-
}
|
|
356
|
-
function S(t) {
|
|
357
|
-
return t.startsWith(x) || t.startsWith(I) || t.startsWith(v);
|
|
358
|
-
}
|
|
359
|
-
function F(t) {
|
|
360
|
-
return `${t.join(`
|
|
361
|
-
`)}
|
|
362
|
-
`;
|
|
363
|
-
}
|
|
364
|
-
async function ye(t, s, e) {
|
|
365
|
-
let i;
|
|
366
|
-
try {
|
|
367
|
-
switch (s.type) {
|
|
368
|
-
case "create_file":
|
|
369
|
-
i = await t.createFile(s, { runContext: e });
|
|
370
|
-
break;
|
|
371
|
-
case "update_file":
|
|
372
|
-
i = await t.updateFile(s, { runContext: e });
|
|
373
|
-
break;
|
|
374
|
-
case "delete_file":
|
|
375
|
-
i = await t.deleteFile(s, { runContext: e });
|
|
376
|
-
break;
|
|
377
|
-
default:
|
|
378
|
-
return "Unsupported apply_patch operation.";
|
|
379
|
-
}
|
|
380
|
-
} catch (n) {
|
|
381
|
-
return `Failed to apply patch: ${A(n)}`;
|
|
382
|
-
}
|
|
383
|
-
return (i == null ? void 0 : i.status) === "failed" ? i.output ? `Patch failed: ${i.output}` : "Patch failed." : (i == null ? void 0 : i.output) ?? "Patch applied.";
|
|
384
|
-
}
|
|
385
|
-
async function ge(t, s, e) {
|
|
386
|
-
const i = [];
|
|
387
|
-
for (const n of s) {
|
|
388
|
-
const r = await ye(t, n, e);
|
|
389
|
-
r && i.push(r);
|
|
390
|
-
}
|
|
391
|
-
return i.join(`
|
|
392
|
-
`) || "Patch applied.";
|
|
393
|
-
}
|
|
394
|
-
function be(t) {
|
|
395
|
-
return {
|
|
396
|
-
type: "function",
|
|
397
|
-
name: "apply_patch",
|
|
398
|
-
description: "Applies a create, update, move, or delete file patch in the sandbox workspace. Accepts a freeform patch string or structured apply_patch operations.",
|
|
399
|
-
parameters: le,
|
|
400
|
-
strict: !1,
|
|
401
|
-
deferLoading: !1,
|
|
402
|
-
needsApproval: async () => !1,
|
|
403
|
-
isEnabled: async () => !0,
|
|
404
|
-
invoke: async (e, i) => {
|
|
405
|
-
const n = ue(i);
|
|
406
|
-
return n.ok ? await ge(t, n.operations, e) : n.error;
|
|
407
|
-
}
|
|
408
|
-
};
|
|
409
|
-
}
|
|
410
|
-
class we extends _ {
|
|
411
|
-
constructor(e = {}) {
|
|
412
|
-
super();
|
|
413
|
-
o(this, "type", "filesystem");
|
|
414
|
-
o(this, "configureTools");
|
|
415
|
-
this.configureTools = e.configureTools;
|
|
416
|
-
}
|
|
417
|
-
tools() {
|
|
418
|
-
var l;
|
|
419
|
-
const e = N(this.type, this._session), i = (l = e.createEditor) == null ? void 0 : l.call(e, this._runAs);
|
|
420
|
-
if (!i)
|
|
421
|
-
throw new b("Filesystem sandbox sessions must provide createEditor().");
|
|
422
|
-
const n = [], r = async (a) => {
|
|
423
|
-
if (!e.viewImage)
|
|
424
|
-
throw new b("Filesystem sandbox sessions must provide viewImage().");
|
|
425
|
-
try {
|
|
426
|
-
return await w("sandbox.view_image", {
|
|
427
|
-
path: a,
|
|
428
|
-
run_as: this._runAs
|
|
429
|
-
}, async () => await e.viewImage({
|
|
430
|
-
path: a,
|
|
431
|
-
runAs: this._runAs
|
|
432
|
-
}));
|
|
433
|
-
} catch (c) {
|
|
434
|
-
return pe(a, c);
|
|
435
|
-
}
|
|
436
|
-
};
|
|
437
|
-
return $(this._modelInstance) ? n.push(m({
|
|
438
|
-
name: "view_image",
|
|
439
|
-
description: "Returns an image output from a local path in the sandbox workspace.",
|
|
440
|
-
parameters: y({
|
|
441
|
-
path: p().describe("Local filesystem path to an image file")
|
|
442
|
-
}),
|
|
443
|
-
execute: async ({ path: a }) => await r(a)
|
|
444
|
-
})) : n.push(m({
|
|
445
|
-
name: "view_image",
|
|
446
|
-
description: "Returns an image from a local path in the sandbox workspace as a data URL or reference string.",
|
|
447
|
-
parameters: y({
|
|
448
|
-
path: p().describe("Local filesystem path to an image file")
|
|
449
|
-
}),
|
|
450
|
-
execute: async ({ path: a }) => ce(await r(a))
|
|
451
|
-
})), Q(this._modelInstance) ? n.push(K({
|
|
452
|
-
name: "apply_patch",
|
|
453
|
-
editor: i
|
|
454
|
-
})) : n.push(be(i)), this.configureTools ? this.configureTools([...n]) : n;
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
function ke(t = {}) {
|
|
458
|
-
return new we(t);
|
|
459
|
-
}
|
|
460
|
-
const _e = 1e4, Te = 250, xe = [
|
|
461
|
-
"When using the shell:",
|
|
462
|
-
"- Use `exec_command` for shell execution.",
|
|
463
|
-
"- If available, use `write_stdin` to interact with or poll running sessions.",
|
|
464
|
-
"- To interrupt a long-running process via `write_stdin`, start it with `tty=true` and send Ctrl-C (`\\u0003`).",
|
|
465
|
-
"- Prefer `rg` and `rg --files` for text/file discovery when available.",
|
|
466
|
-
"- Avoid using Python scripts just to print large file chunks."
|
|
467
|
-
].join(`
|
|
468
|
-
`);
|
|
469
|
-
class Ie extends _ {
|
|
470
|
-
constructor(e = {}) {
|
|
471
|
-
super();
|
|
472
|
-
o(this, "type", "shell");
|
|
473
|
-
o(this, "configureTools");
|
|
474
|
-
this.configureTools = e.configureTools;
|
|
475
|
-
}
|
|
476
|
-
tools() {
|
|
477
|
-
var n;
|
|
478
|
-
const e = N(this.type, this._session);
|
|
479
|
-
if (!e.execCommand)
|
|
480
|
-
throw new b("Shell sandbox sessions must provide execCommand().");
|
|
481
|
-
const i = [
|
|
482
|
-
m({
|
|
483
|
-
name: "exec_command",
|
|
484
|
-
description: "Runs a command in a PTY, returning output or a session ID for ongoing interaction.",
|
|
485
|
-
parameters: y({
|
|
486
|
-
cmd: p().min(1).describe("Shell command to execute."),
|
|
487
|
-
workdir: p().optional().describe("Optional working directory to run the command in; defaults to the turn cwd."),
|
|
488
|
-
shell: p().optional().describe("Shell binary to launch. Defaults to the user's default shell."),
|
|
489
|
-
login: P().default(!0).describe("Whether to run the shell with -l/-i semantics. Defaults to true."),
|
|
490
|
-
tty: P().default(!1).describe("Whether to allocate a TTY for the command. Defaults to false (plain pipes); set to true to open a PTY and access TTY process."),
|
|
491
|
-
yield_time_ms: d().int().min(0).default(_e).describe("How long to wait (in milliseconds) for output before yielding."),
|
|
492
|
-
max_output_tokens: d().int().min(1).optional().describe("Maximum number of tokens to return. Excess output will be truncated.")
|
|
493
|
-
}),
|
|
494
|
-
execute: async ({ cmd: r, workdir: l, shell: a, login: c, tty: E, yield_time_ms: B, max_output_tokens: R }) => await w("sandbox.exec", {
|
|
495
|
-
cmd: r,
|
|
496
|
-
workdir: l,
|
|
497
|
-
shell: a,
|
|
498
|
-
login: c,
|
|
499
|
-
tty: E,
|
|
500
|
-
run_as: this._runAs
|
|
501
|
-
}, async () => await e.execCommand({
|
|
502
|
-
cmd: r,
|
|
503
|
-
workdir: l,
|
|
504
|
-
shell: a,
|
|
505
|
-
login: c,
|
|
506
|
-
tty: E,
|
|
507
|
-
yieldTimeMs: B,
|
|
508
|
-
maxOutputTokens: R,
|
|
509
|
-
runAs: this._runAs
|
|
510
|
-
}))
|
|
511
|
-
})
|
|
512
|
-
];
|
|
513
|
-
return (n = e.supportsPty) != null && n.call(e) && e.writeStdin && i.push(m({
|
|
514
|
-
name: "write_stdin",
|
|
515
|
-
description: "Writes characters to an existing unified exec session and returns recent output.",
|
|
516
|
-
parameters: y({
|
|
517
|
-
session_id: d().int().describe("Identifier of the running unified exec session."),
|
|
518
|
-
chars: p().default("").describe("Bytes to write to stdin (may be empty to poll)."),
|
|
519
|
-
yield_time_ms: d().int().min(0).default(Te).describe("How long to wait (in milliseconds) for output before yielding."),
|
|
520
|
-
max_output_tokens: d().int().min(1).optional().describe("Maximum number of tokens to return. Excess output will be truncated.")
|
|
521
|
-
}),
|
|
522
|
-
execute: async ({ session_id: r, chars: l, yield_time_ms: a, max_output_tokens: c }) => await w("sandbox.write_stdin", {
|
|
523
|
-
session_id: r
|
|
524
|
-
}, async () => await e.writeStdin({
|
|
525
|
-
sessionId: r,
|
|
526
|
-
chars: l,
|
|
527
|
-
yieldTimeMs: a,
|
|
528
|
-
maxOutputTokens: c
|
|
529
|
-
}))
|
|
530
|
-
})), this.configureTools ? this.configureTools([...i]) : i;
|
|
531
|
-
}
|
|
532
|
-
instructions() {
|
|
533
|
-
return xe;
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
function ve(t = {}) {
|
|
537
|
-
return new Ie(t);
|
|
538
|
-
}
|
|
539
|
-
T`
|
|
540
|
-
A skill is a set of local instructions to follow that is stored in a \`SKILL.md\` file. Below is the list of skills that can be used. Each entry includes a name, description, and file path so you can open the source for full instructions when using a specific skill.
|
|
541
|
-
`;
|
|
542
|
-
T`
|
|
543
|
-
### How to use skills
|
|
544
|
-
- Discovery: The list above is the skills available in this session (name + description + file path). Skill bodies live on disk at the listed paths.
|
|
545
|
-
- Trigger rules: If the user names a skill (with \`$SkillName\` or plain text) OR the task clearly matches a skill's description shown above, you must use that skill for that turn. Multiple mentions mean use them all. Do not carry skills across turns unless re-mentioned.
|
|
546
|
-
- Missing/blocked: If a named skill isn't in the list or the path can't be read, say so briefly and continue with the best fallback.
|
|
547
|
-
- How to use a skill (progressive disclosure):
|
|
548
|
-
1) After deciding to use a skill, open its \`SKILL.md\`. Read only enough to follow the workflow.
|
|
549
|
-
2) If \`SKILL.md\` points to extra folders such as \`references/\`, load only the specific files needed for the request; don't bulk-load everything.
|
|
550
|
-
3) If \`scripts/\` exist, prefer running or patching them instead of retyping large code blocks.
|
|
551
|
-
4) If \`assets/\` or templates exist, reuse them instead of recreating from scratch.
|
|
552
|
-
- Coordination and sequencing:
|
|
553
|
-
- If multiple skills apply, choose the minimal set that covers the request and state the order you'll use them.
|
|
554
|
-
- Announce which skill(s) you're using and why (one short line). If you skip an obvious skill, say why.
|
|
555
|
-
- Context hygiene:
|
|
556
|
-
- Keep context small: summarize long sections instead of pasting them; only load extra files when needed.
|
|
557
|
-
- Avoid deep reference-chasing: prefer opening only files directly linked from \`SKILL.md\` unless you're blocked.
|
|
558
|
-
- When variants exist (frameworks, providers, domains), pick only the relevant reference file(s) and note that choice.
|
|
559
|
-
- Safety and fallback: If a skill can't be applied cleanly (missing files, unclear instructions), state the issue, pick the next-best approach, and continue.
|
|
560
|
-
`;
|
|
561
|
-
T`
|
|
562
|
-
### How to use skills
|
|
563
|
-
- Discovery: The list above is the skill index available in this session (name + description + workspace path). In lazy mode, those paths are loaded on demand instead of being present up front.
|
|
564
|
-
- Trigger rules: If the user names a skill (with \`$SkillName\` or plain text) OR the task clearly matches a skill's description shown above, you must use that skill for that turn. Multiple mentions mean use them all. Do not carry skills across turns unless re-mentioned.
|
|
565
|
-
- Missing/blocked: If a named skill isn't in the list or the path can't be read, say so briefly and continue with the best fallback.
|
|
566
|
-
- How to use a skill (progressive disclosure):
|
|
567
|
-
1) After deciding to use a lazy skill, call \`load_skill\` for that skill first, then open its \`SKILL.md\`.
|
|
568
|
-
2) If \`SKILL.md\` points to extra folders such as \`references/\`, load only the specific files needed for the request; don't bulk-load everything.
|
|
569
|
-
3) If \`scripts/\` exist, prefer running or patching them instead of retyping large code blocks.
|
|
570
|
-
4) If \`assets/\` or templates exist, reuse them instead of recreating from scratch.
|
|
571
|
-
- Coordination and sequencing:
|
|
572
|
-
- If multiple skills apply, choose the minimal set that covers the request and state the order you'll use them.
|
|
573
|
-
- Announce which skill(s) you're using and why (one short line). If you skip an obvious skill, say why.
|
|
574
|
-
- Context hygiene:
|
|
575
|
-
- Keep context small: summarize long sections instead of pasting them; only load extra files when needed.
|
|
576
|
-
- Avoid deep reference-chasing: prefer opening only files directly linked from \`SKILL.md\` unless you're blocked.
|
|
577
|
-
- When variants exist (frameworks, providers, domains), pick only the relevant reference file(s) and note that choice.
|
|
578
|
-
- Safety and fallback: If a skill can't be applied cleanly (missing files, unclear instructions), state the issue, pick the next-best approach, and continue.
|
|
579
|
-
`;
|
|
580
|
-
function Ae() {
|
|
581
|
-
return [ke(), ve(), se()];
|
|
582
|
-
}
|
|
583
|
-
const Se = {
|
|
584
|
-
default: Ae
|
|
585
|
-
};
|
|
586
|
-
var M, O;
|
|
587
|
-
class W extends (O = X, M = q, O) {
|
|
588
|
-
constructor(e) {
|
|
589
|
-
super(e);
|
|
590
|
-
o(this, M, !0);
|
|
591
|
-
o(this, "defaultManifest");
|
|
592
|
-
o(this, "baseInstructions");
|
|
593
|
-
o(this, "capabilities");
|
|
594
|
-
o(this, "runAs");
|
|
595
|
-
o(this, "runtimeManifest");
|
|
596
|
-
if (e.baseInstructions !== void 0 && typeof e.baseInstructions != "string" && typeof e.baseInstructions != "function")
|
|
597
|
-
throw new TypeError("SandboxAgent baseInstructions must be a string or function.");
|
|
598
|
-
this.defaultManifest = e.defaultManifest ? G(e.defaultManifest) : void 0, this.baseInstructions = e.baseInstructions, this.capabilities = e.capabilities ?? Se.default(), this.runAs = Ee(e.runAs), this.runtimeManifest = this.defaultManifest ?? new Y();
|
|
599
|
-
}
|
|
600
|
-
clone(e) {
|
|
601
|
-
return new W({
|
|
602
|
-
name: e.name ?? this.name,
|
|
603
|
-
instructions: e.instructions ?? this.instructions,
|
|
604
|
-
prompt: e.prompt ?? this.prompt,
|
|
605
|
-
handoffDescription: e.handoffDescription ?? this.handoffDescription,
|
|
606
|
-
handoffs: e.handoffs ?? this.handoffs,
|
|
607
|
-
model: e.model ?? this.model,
|
|
608
|
-
modelSettings: e.modelSettings ?? this.modelSettings,
|
|
609
|
-
tools: e.tools ?? this.tools,
|
|
610
|
-
mcpServers: e.mcpServers ?? this.mcpServers,
|
|
611
|
-
mcpConfig: e.mcpConfig ?? this.mcpConfig,
|
|
612
|
-
inputGuardrails: e.inputGuardrails ?? this.inputGuardrails,
|
|
613
|
-
outputGuardrails: e.outputGuardrails ?? this.outputGuardrails,
|
|
614
|
-
outputType: e.outputType ?? this.outputType,
|
|
615
|
-
toolUseBehavior: e.toolUseBehavior ?? this.toolUseBehavior,
|
|
616
|
-
resetToolChoice: e.resetToolChoice ?? this.resetToolChoice,
|
|
617
|
-
defaultManifest: e.defaultManifest ?? this.defaultManifest,
|
|
618
|
-
baseInstructions: e.baseInstructions ?? this.baseInstructions,
|
|
619
|
-
capabilities: e.capabilities ?? this.capabilities,
|
|
620
|
-
runAs: e.runAs ?? this.runAs
|
|
621
|
-
});
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
function Ee(t) {
|
|
625
|
-
if (t !== void 0) {
|
|
626
|
-
if (typeof t == "string") {
|
|
627
|
-
const s = t.trim();
|
|
628
|
-
if (!s)
|
|
629
|
-
throw new TypeError("SandboxAgent runAs must be non-empty.");
|
|
630
|
-
return s;
|
|
631
|
-
}
|
|
632
|
-
return J(t);
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
export {
|
|
636
|
-
W as SandboxAgent
|
|
637
|
-
};
|
|
638
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtQzVzWXNSSlEubWpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NhbmRib3gvY2FwYWJpbGl0aWVzL3RyYW5zcG9ydC5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NhbmRib3gvY2FwYWJpbGl0aWVzL2NvbXBhY3Rpb24ubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9zYW5kYm94L2NhcGFiaWxpdGllcy9maWxlc3lzdGVtLm1qcyIsIi4uLy4uLy4uL2FnZW50cy1jb3JlL2Rpc3Qvc2FuZGJveC9jYXBhYmlsaXRpZXMvc2hlbGwubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9zYW5kYm94L2NhcGFiaWxpdGllcy9za2lsbHMubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9zYW5kYm94L2NhcGFiaWxpdGllcy9pbmRleC5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NhbmRib3gvYWdlbnQubWpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c1Jlc3BvbnNlc0NvbXBhY3Rpb25UcmFuc3BvcnQobW9kZWxJbnN0YW5jZSkge1xuICAgIGlmICghbW9kZWxJbnN0YW5jZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gdHlwZW9mIG1vZGVsSW5zdGFuY2UgPT09ICdvYmplY3QnICYmXG4gICAgICAgIG1vZGVsSW5zdGFuY2UgJiZcbiAgICAgICAgJ2NvbnN0cnVjdG9yJyBpbiBtb2RlbEluc3RhbmNlICYmXG4gICAgICAgIHR5cGVvZiBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gbW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIDogJyc7XG4gICAgcmV0dXJuICFjb25zdHJ1Y3Rvck5hbWUuaW5jbHVkZXMoJ0NoYXRDb21wbGV0aW9ucycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzQXBwbHlQYXRjaFRyYW5zcG9ydChtb2RlbEluc3RhbmNlKSB7XG4gICAgcmV0dXJuIHN1cHBvcnRzU3RydWN0dXJlZFRvb2xPdXRwdXRUcmFuc3BvcnQobW9kZWxJbnN0YW5jZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNTdHJ1Y3R1cmVkVG9vbE91dHB1dFRyYW5zcG9ydChtb2RlbEluc3RhbmNlKSB7XG4gICAgaWYgKCFtb2RlbEluc3RhbmNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gdHlwZW9mIG1vZGVsSW5zdGFuY2UgPT09ICdvYmplY3QnICYmXG4gICAgICAgIG1vZGVsSW5zdGFuY2UgJiZcbiAgICAgICAgJ2NvbnN0cnVjdG9yJyBpbiBtb2RlbEluc3RhbmNlICYmXG4gICAgICAgIHR5cGVvZiBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gbW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIDogJyc7XG4gICAgcmV0dXJuICFjb25zdHJ1Y3Rvck5hbWUuaW5jbHVkZXMoJ0NoYXRDb21wbGV0aW9ucycpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhbnNwb3J0Lm1qcy5tYXAiLCJpbXBvcnQgeyBDYXBhYmlsaXR5IH0gZnJvbSBcIi4vYmFzZS5tanNcIjtcbmltcG9ydCB7IHN1cHBvcnRzUmVzcG9uc2VzQ29tcGFjdGlvblRyYW5zcG9ydCB9IGZyb20gXCIuL3RyYW5zcG9ydC5tanNcIjtcbmV4cG9ydCBjbGFzcyBDb21wYWN0aW9uUG9saWN5IHtcbn1cbmV4cG9ydCBjbGFzcyBTdGF0aWNDb21wYWN0aW9uUG9saWN5IGV4dGVuZHMgQ29tcGFjdGlvblBvbGljeSB7XG4gICAgdGhyZXNob2xkO1xuICAgIGNvbnN0cnVjdG9yKHRocmVzaG9sZCA9IDI0MDAwMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRocmVzaG9sZCA9IHRocmVzaG9sZDtcbiAgICB9XG4gICAgY29tcGFjdFRocmVzaG9sZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhyZXNob2xkO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBEeW5hbWljQ29tcGFjdGlvblBvbGljeSBleHRlbmRzIENvbXBhY3Rpb25Qb2xpY3kge1xuICAgIHRocmVzaG9sZFJhdGlvO1xuICAgIGZhbGxiYWNrVGhyZXNob2xkO1xuICAgIGNvbnN0cnVjdG9yKHRocmVzaG9sZFJhdGlvID0gMC45LCBmYWxsYmFja1RocmVzaG9sZCA9IDI0MDAwMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRocmVzaG9sZFJhdGlvID0gdGhyZXNob2xkUmF0aW87XG4gICAgICAgIHRoaXMuZmFsbGJhY2tUaHJlc2hvbGQgPSBmYWxsYmFja1RocmVzaG9sZDtcbiAgICB9XG4gICAgY29tcGFjdFRocmVzaG9sZChtb2RlbCkge1xuICAgICAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWxsYmFja1RocmVzaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtb2RlbEluZm8gPSBDb21wYWN0aW9uTW9kZWxJbmZvLmZvck1vZGVsKG1vZGVsKTtcbiAgICAgICAgaWYgKCFtb2RlbEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZhbGxiYWNrVGhyZXNob2xkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKG1vZGVsSW5mby5jb250ZXh0V2luZG93ICogdGhpcy50aHJlc2hvbGRSYXRpbyk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbXBhY3Rpb25Nb2RlbEluZm8ge1xuICAgIGNvbnRleHRXaW5kb3c7XG4gICAgY29uc3RydWN0b3IoY29udGV4dFdpbmRvdykge1xuICAgICAgICB0aGlzLmNvbnRleHRXaW5kb3cgPSBjb250ZXh0V2luZG93O1xuICAgIH1cbiAgICBzdGF0aWMgZm9yTW9kZWwobW9kZWwpIHtcbiAgICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgZ2V0U2FuZGJveENvbXBhY3Rpb25Nb2RlbENhbmRpZGF0ZXMobW9kZWwpKSB7XG4gICAgICAgICAgICBpZiAoU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMU0uaGFzKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25Nb2RlbEluZm8oMTA0NzU3Nik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoU0FOREJPWF9DT05URVhUX1dJTkRPV1NfNDAwSy5oYXMoY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbk1vZGVsSW5mbyg0MDAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzIwMEsuaGFzKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25Nb2RlbEluZm8oMjAwMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChTQU5EQk9YX0NPTlRFWFRfV0lORE9XU18xMjhLLmhhcyhjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wYWN0aW9uTW9kZWxJbmZvKDEyODAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5jbGFzcyBDb21wYWN0aW9uQ2FwYWJpbGl0eSBleHRlbmRzIENhcGFiaWxpdHkge1xuICAgIHR5cGUgPSAnY29tcGFjdGlvbic7XG4gICAgcG9saWN5O1xuICAgIGNvbnN0cnVjdG9yKHBvbGljeSA9IG5ldyBEeW5hbWljQ29tcGFjdGlvblBvbGljeSgpKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIH1cbiAgICBzYW1wbGluZ1BhcmFtcyhzYW1wbGluZ1BhcmFtcykge1xuICAgICAgICBpZiAoc2FtcGxpbmdQYXJhbXMubW9kZWxJbnN0YW5jZSAmJlxuICAgICAgICAgICAgIXN1cHBvcnRzUmVzcG9uc2VzQ29tcGFjdGlvblRyYW5zcG9ydChzYW1wbGluZ1BhcmFtcy5tb2RlbEluc3RhbmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vZGVsID0gdHlwZW9mIHNhbXBsaW5nUGFyYW1zLm1vZGVsID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBzYW1wbGluZ1BhcmFtcy5tb2RlbFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZXh0X21hbmFnZW1lbnQ6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb21wYWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgY29tcGFjdF90aHJlc2hvbGQ6IHRoaXMucG9saWN5LmNvbXBhY3RUaHJlc2hvbGQobW9kZWwpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwcm9jZXNzQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIGxldCBsYXN0Q29tcGFjdGlvbkluZGV4ID0gLTE7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZXh0Lmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgICAgaWYgKGNvbnRleHRbaW5kZXhdLnR5cGUgPT09ICdjb21wYWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGxhc3RDb21wYWN0aW9uSW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGFzdENvbXBhY3Rpb25JbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0LnNsaWNlKGxhc3RDb21wYWN0aW9uSW5kZXgpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wYWN0aW9uKGFyZ3MgPSB7fSkge1xuICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkNhcGFiaWxpdHkoYXJncy5wb2xpY3kpO1xufVxuZnVuY3Rpb24gZ2V0U2FuZGJveENvbXBhY3Rpb25Nb2RlbENhbmRpZGF0ZXMobW9kZWwpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbW9kZWwudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHdpdGhvdXRQcm92aWRlclByZWZpeCA9IHRyaW1tZWQuaW5jbHVkZXMoJy8nKVxuICAgICAgICA/IHRyaW1tZWQuc2xpY2UodHJpbW1lZC5sYXN0SW5kZXhPZignLycpICsgMSlcbiAgICAgICAgOiB0cmltbWVkO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB3aXRob3V0UHJvdmlkZXJQcmVmaXgudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB3aXRob3V0UGlubmVkRGF0ZSA9IG5vcm1hbGl6ZWQucmVwbGFjZSgvLVxcZHs0fS1cXGR7Mn0tXFxkezJ9JC91LCAnJyk7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KFtub3JtYWxpemVkLCB3aXRob3V0UGlubmVkRGF0ZV0pXTtcbn1cbmNvbnN0IFNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzFNID0gbmV3IFNldChbXG4gICAgJ2dwdC01LjQnLFxuICAgICdncHQtNS40LTIwMjYtMDMtMDUnLFxuICAgICdncHQtNS40LXBybycsXG4gICAgJ2dwdC01LjQtcHJvLTIwMjYtMDMtMDUnLFxuICAgICdncHQtNC4xJyxcbiAgICAnZ3B0LTQuMS0yMDI1LTA0LTE0JyxcbiAgICAnZ3B0LTQuMS1taW5pJyxcbiAgICAnZ3B0LTQuMS1taW5pLTIwMjUtMDQtMTQnLFxuICAgICdncHQtNC4xLW5hbm8nLFxuICAgICdncHQtNC4xLW5hbm8tMjAyNS0wNC0xNCcsXG5dKTtcbmNvbnN0IFNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzQwMEsgPSBuZXcgU2V0KFtcbiAgICAnZ3B0LTUnLFxuICAgICdncHQtNS1jb2RleCcsXG4gICAgJ2dwdC01LW1pbmknLFxuICAgICdncHQtNS1uYW5vJyxcbiAgICAnZ3B0LTUtcHJvJyxcbiAgICAnZ3B0LTUuMScsXG4gICAgJ2dwdC01LjEtY29kZXgnLFxuICAgICdncHQtNS4xLWNvZGV4LW1heCcsXG4gICAgJ2dwdC01LjEtY29kZXgtbWluaScsXG4gICAgJ2dwdC01LjInLFxuICAgICdncHQtNS4yLWNvZGV4JyxcbiAgICAnZ3B0LTUuMi1jb2RleC1jeWJlcicsXG4gICAgJ2dwdC01LjItcHJvJyxcbiAgICAnZ3B0LTUuMy1jb2RleCcsXG4gICAgJ2dwdC01LjMtY29kZXgtc3BhcmsnLFxuICAgICdncHQtNS40LW1pbmknLFxuICAgICdncHQtNS40LW5hbm8nLFxuXSk7XG5jb25zdCBTQU5EQk9YX0NPTlRFWFRfV0lORE9XU18yMDBLID0gbmV3IFNldChbXG4gICAgJ2NvZGV4LW1pbmktbGF0ZXN0JyxcbiAgICAnbzEnLFxuICAgICdvMS0yMDI0LTEyLTE3JyxcbiAgICAnbzEtcHJvJyxcbiAgICAnbzMnLFxuICAgICdvMy0yMDI1LTA0LTE2JyxcbiAgICAnbzMtbWluaScsXG4gICAgJ28zLXBybycsXG4gICAgJ28zLWRlZXAtcmVzZWFyY2gnLFxuICAgICdvNC1taW5pJyxcbiAgICAnbzQtbWluaS0yMDI1LTA0LTE2JyxcbiAgICAnbzQtbWluaS1kZWVwLXJlc2VhcmNoJyxcbl0pO1xuY29uc3QgU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMTI4SyA9IG5ldyBTZXQoW1xuICAgICdncHQtNG8nLFxuICAgICdncHQtNG8tMjAyNC0wOC0wNicsXG4gICAgJ2dwdC00by1taW5pJyxcbiAgICAnZ3B0LTRvLW1pbmktMjAyNC0wNy0xOCcsXG4gICAgJ2dwdC01LWNoYXQtbGF0ZXN0JyxcbiAgICAnZ3B0LTUuMS1jaGF0LWxhdGVzdCcsXG4gICAgJ2dwdC01LjItY2hhdC1sYXRlc3QnLFxuICAgICdncHQtNS4zLWNoYXQtbGF0ZXN0Jyxcbl0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcGFjdGlvbi5tanMubWFwIiwiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBVc2VyRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JzLm1qc1wiO1xuaW1wb3J0IHsgYXBwbHlQYXRjaFRvb2wsIHRvb2wsIH0gZnJvbSBcIi4uLy4uL3Rvb2wubWpzXCI7XG5pbXBvcnQgeyBBcHBseVBhdGNoT3BlcmF0aW9uIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3Byb3RvY29sLm1qc1wiO1xuaW1wb3J0IHsgZW5jb2RlVWludDhBcnJheVRvQmFzZTY0IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2Jhc2U2NC5tanNcIjtcbmltcG9ydCB7IHdpdGhTYW5kYm94U3BhbiB9IGZyb20gXCIuLi9ydW50aW1lL3NwYW5zLm1qc1wiO1xuaW1wb3J0IHsgaXNSZWNvcmQgfSBmcm9tIFwiLi4vc2hhcmVkL3R5cGVHdWFyZHMubWpzXCI7XG5pbXBvcnQgeyBDYXBhYmlsaXR5LCByZXF1aXJlQm91bmRTZXNzaW9uLCB9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5pbXBvcnQgeyBzdXBwb3J0c0FwcGx5UGF0Y2hUcmFuc3BvcnQsIHN1cHBvcnRzU3RydWN0dXJlZFRvb2xPdXRwdXRUcmFuc3BvcnQsIH0gZnJvbSBcIi4vdHJhbnNwb3J0Lm1qc1wiO1xuY29uc3QgYXBwbHlQYXRjaEZ1bmN0aW9uUGFyYW1ldGVycyA9IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHBhdGNoOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQSBmcmVlZm9ybSBhcHBseV9wYXRjaCBwYXlsb2FkIHdyYXBwZWQgaW4gKioqIEJlZ2luIFBhdGNoIGFuZCAqKiogRW5kIFBhdGNoLicsXG4gICAgICAgIH0sXG4gICAgICAgIG9wZXJhdGlvbjoge1xuICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0Egc2luZ2xlIHN0cnVjdHVyZWQgYXBwbHlfcGF0Y2ggb3BlcmF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICAgIG9wZXJhdGlvbnM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgICBpdGVtczogeyB0eXBlOiAnb2JqZWN0JyB9LFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdTdHJ1Y3R1cmVkIGFwcGx5X3BhdGNoIG9wZXJhdGlvbnMgdG8gYXBwbHkgaW4gb3JkZXIuJyxcbiAgICAgICAgfSxcbiAgICAgICAgY29tbWFuZDoge1xuICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnT3B0aW9uYWwgW1wiYXBwbHlfcGF0Y2hcIiwgcGF0Y2hdIGNvbW1hbmQgdHVwbGUgZm9ybS4nLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGVudW06IFsnY3JlYXRlX2ZpbGUnLCAndXBkYXRlX2ZpbGUnLCAnZGVsZXRlX2ZpbGUnXSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHBhdGNoIG9wZXJhdGlvbiB0byBhcHBseS4nLFxuICAgICAgICB9LFxuICAgICAgICBwYXRoOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHNhbmRib3ggZmlsZSBwYXRoIHRvIHBhdGNoLicsXG4gICAgICAgIH0sXG4gICAgICAgIGRpZmY6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgVjRBIHBhdGNoIGRpZmYgZm9yIGNyZWF0ZV9maWxlIGFuZCB1cGRhdGVfZmlsZSBvcGVyYXRpb25zLicsXG4gICAgICAgIH0sXG4gICAgICAgIG1vdmVUbzoge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ09wdGlvbmFsIGRlc3RpbmF0aW9uIHBhdGggZm9yIHVwZGF0ZV9maWxlIG1vdmUgb3BlcmF0aW9ucy4nLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFtdLFxuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlLFxufTtcbmNvbnN0IEJFR0lOX1BBVENIID0gJyoqKiBCZWdpbiBQYXRjaCc7XG5jb25zdCBFTkRfUEFUQ0ggPSAnKioqIEVuZCBQYXRjaCc7XG5jb25zdCBBRERfRklMRSA9ICcqKiogQWRkIEZpbGU6ICc7XG5jb25zdCBERUxFVEVfRklMRSA9ICcqKiogRGVsZXRlIEZpbGU6ICc7XG5jb25zdCBVUERBVEVfRklMRSA9ICcqKiogVXBkYXRlIEZpbGU6ICc7XG5jb25zdCBNT1ZFX1RPID0gJyoqKiBNb3ZlIHRvOiAnO1xuZnVuY3Rpb24gdG9FcnJvck1lc3NhZ2UoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCBlcnJvci50b1N0cmluZygpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXJyb3IpO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoZXJyb3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbmRlckltYWdlRm9yVGV4dFRyYW5zcG9ydChvdXRwdXQpIHtcbiAgICBpZiAodHlwZW9mIG91dHB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG4gICAgY29uc3QgaW1hZ2UgPSBvdXRwdXQuaW1hZ2U7XG4gICAgaWYgKHR5cGVvZiBpbWFnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgIH1cbiAgICBpZiAoIWlzUmVjb3JkKGltYWdlKSkge1xuICAgICAgICByZXR1cm4gJ05vIGltYWdlIGRhdGEgd2FzIHJldHVybmVkIGJ5IHRoZSBzYW5kYm94IHNlc3Npb24uJztcbiAgICB9XG4gICAgY29uc3QgaW1hZ2VSZWNvcmQgPSBpbWFnZTtcbiAgICBpZiAodHlwZW9mIGltYWdlUmVjb3JkLnVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGltYWdlUmVjb3JkLnVybDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBpbWFnZVJlY29yZC5maWxlSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBgT3BlbkFJIGZpbGUgcmVmZXJlbmNlOiAke2ltYWdlUmVjb3JkLmZpbGVJZH1gO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGltYWdlUmVjb3JkLmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IHR5cGVvZiBpbWFnZVJlY29yZC5tZWRpYVR5cGUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IGltYWdlUmVjb3JkLm1lZGlhVHlwZVxuICAgICAgICAgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgICAgICAgcmV0dXJuIGBkYXRhOiR7bWVkaWFUeXBlfTtiYXNlNjQsJHtpbWFnZVJlY29yZC5kYXRhfWA7XG4gICAgfVxuICAgIGlmIChpbWFnZVJlY29yZC5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSB0eXBlb2YgaW1hZ2VSZWNvcmQubWVkaWFUeXBlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBpbWFnZVJlY29yZC5tZWRpYVR5cGVcbiAgICAgICAgICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gICAgICAgIHJldHVybiBgZGF0YToke21lZGlhVHlwZX07YmFzZTY0LCR7ZW5jb2RlVWludDhBcnJheVRvQmFzZTY0KGltYWdlUmVjb3JkLmRhdGEpfWA7XG4gICAgfVxuICAgIHJldHVybiAnTm8gaW1hZ2UgZGF0YSB3YXMgcmV0dXJuZWQgYnkgdGhlIHNhbmRib3ggc2Vzc2lvbi4nO1xufVxuZnVuY3Rpb24gcmVuZGVyVmlld0ltYWdlRXJyb3IocGF0aCwgZXJyb3IpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdG9FcnJvck1lc3NhZ2UoZXJyb3IpO1xuICAgIGlmICgvbm90IGZvdW5kL2l1LnRlc3QobWVzc2FnZSkpIHtcbiAgICAgICAgcmV0dXJuIGBpbWFnZSBwYXRoIFxcYCR7cGF0aH1cXGAgd2FzIG5vdCBmb3VuZGA7XG4gICAgfVxuICAgIGlmICgvbm90IGEgZmlsZS9pdS50ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgIHJldHVybiBgaW1hZ2UgcGF0aCBcXGAke3BhdGh9XFxgIGlzIG5vdCBhIGZpbGVgO1xuICAgIH1cbiAgICBpZiAoL2V4Y2VlZHMgdGhlIDEwIE1CIGxpbWl0fGV4Y2VlZGVkIHRoZSBhbGxvd2VkIHNpemUvaXUudGVzdChtZXNzYWdlKSkge1xuICAgICAgICByZXR1cm4gYGltYWdlIHBhdGggXFxgJHtwYXRofVxcYCBleGNlZWRlZCB0aGUgYWxsb3dlZCBzaXplIG9mIDEwTUI7IHJlc2l6ZSBvciBjb21wcmVzcyB0aGUgaW1hZ2UgYW5kIHRyeSBhZ2FpbmA7XG4gICAgfVxuICAgIGlmICgvdW5zdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0fG5vdCBhIHN1cHBvcnRlZCBpbWFnZS9pdS50ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgIHJldHVybiBgaW1hZ2UgcGF0aCBcXGAke3BhdGh9XFxgIGlzIG5vdCBhIHN1cHBvcnRlZCBpbWFnZSBmaWxlYDtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5uYW1lIDogdHlwZW9mIGVycm9yO1xuICAgIHJldHVybiBgdW5hYmxlIHRvIHJlYWQgaW1hZ2UgYXQgXFxgJHtwYXRofVxcYDogJHtuYW1lfWA7XG59XG5mdW5jdGlvbiBwYXJzZUFwcGx5UGF0Y2hJbnB1dChyYXdJbnB1dCkge1xuICAgIGNvbnN0IHRyaW1tZWRJbnB1dCA9IHJhd0lucHV0LnRyaW1TdGFydCgpO1xuICAgIGlmICh0cmltbWVkSW5wdXQuc3RhcnRzV2l0aChCRUdJTl9QQVRDSCkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRnJlZWZvcm1QYXRjaCh0cmltbWVkSW5wdXQpO1xuICAgIH1cbiAgICBsZXQgcGF5bG9hZDtcbiAgICB0cnkge1xuICAgICAgICBwYXlsb2FkID0gSlNPTi5wYXJzZShyYXdJbnB1dCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IGBJbnZhbGlkIGFwcGx5X3BhdGNoIEpTT046ICR7dG9FcnJvck1lc3NhZ2UoZXJyb3IpfWAsXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUFwcGx5UGF0Y2hQYXlsb2FkKHBheWxvYWQpO1xufVxuZnVuY3Rpb24gcGFyc2VBcHBseVBhdGNoUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gcGFyc2VGcmVlZm9ybVBhdGNoKHBheWxvYWQpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXlsb2FkKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyhwYXlsb2FkKTtcbiAgICB9XG4gICAgaWYgKCFpc1JlY29yZChwYXlsb2FkKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6ICdhcHBseV9wYXRjaCBpbnB1dCBtdXN0IGJlIGFuIG9iamVjdCBvciBhcnJheS4nLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBheWxvYWQucGF0Y2ggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZyZWVmb3JtUGF0Y2gocGF5bG9hZC5wYXRjaCk7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHBheWxvYWQuY29tbWFuZCkpIHtcbiAgICAgICAgY29uc3QgW2NvbW1hbmROYW1lLCBwYXRjaF0gPSBwYXlsb2FkLmNvbW1hbmQ7XG4gICAgICAgIGlmIChjb21tYW5kTmFtZSA9PT0gJ2FwcGx5X3BhdGNoJyAmJiB0eXBlb2YgcGF0Y2ggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGcmVlZm9ybVBhdGNoKHBhdGNoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXlsb2FkLm9wZXJhdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cnVjdHVyZWRPcGVyYXRpb25zKHBheWxvYWQub3BlcmF0aW9ucyk7XG4gICAgfVxuICAgIGlmIChwYXlsb2FkLm9wZXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cnVjdHVyZWRPcGVyYXRpb25zKFtwYXlsb2FkLm9wZXJhdGlvbl0pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyhbcGF5bG9hZF0pO1xufVxuZnVuY3Rpb24gcGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyhwYXlsb2Fkcykge1xuICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBheWxvYWQgb2YgcGF5bG9hZHMpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gQXBwbHlQYXRjaE9wZXJhdGlvbi5zYWZlUGFyc2UocGF5bG9hZCk7XG4gICAgICAgIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVycm9yOiBgSW52YWxpZCBhcHBseV9wYXRjaCBvcGVyYXRpb246ICR7cGFyc2VkLmVycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgb3BlcmF0aW9ucy5wdXNoKHBhcnNlZC5kYXRhKTtcbiAgICB9XG4gICAgaWYgKG9wZXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6ICdhcHBseV9wYXRjaCBpbnB1dCBtdXN0IGluY2x1ZGUgYW4gb3BlcmF0aW9uLicgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgb2s6IHRydWUsIG9wZXJhdGlvbnMgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlRnJlZWZvcm1QYXRjaChyYXdQYXRjaCkge1xuICAgIGNvbnN0IGxpbmVzID0gcmF3UGF0Y2guc3BsaXQoL1xccj9cXG4vKTtcbiAgICBpZiAobGluZXMuYXQoLTEpID09PSAnJykge1xuICAgICAgICBsaW5lcy5wb3AoKTtcbiAgICB9XG4gICAgaWYgKGxpbmVzWzBdICE9PSBCRUdJTl9QQVRDSCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IGBhcHBseV9wYXRjaCBpbnB1dCBtdXN0IHN0YXJ0IHdpdGggXCIke0JFR0lOX1BBVENIfVwiLmAsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChsaW5lcy5sZW5ndGggPCAyIHx8IGxpbmVzLmF0KC0xKSAhPT0gRU5EX1BBVENIKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogYGFwcGx5X3BhdGNoIGlucHV0IG11c3QgZW5kIHdpdGggXCIke0VORF9QQVRDSH1cIi5gLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBvcGVyYXRpb25zID0gW107XG4gICAgbGV0IGluZGV4ID0gMTtcbiAgICB3aGlsZSAoaW5kZXggPCBsaW5lcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpbmRleF07XG4gICAgICAgIGxldCBwYXJzZWQ7XG4gICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoQUREX0ZJTEUpKSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBwYXJzZUFkZEZpbGVQYXRjaChsaW5lcywgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChERUxFVEVfRklMRSkpIHtcbiAgICAgICAgICAgIHBhcnNlZCA9IHBhcnNlRGVsZXRlRmlsZVBhdGNoKGxpbmVzLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKFVQREFURV9GSUxFKSkge1xuICAgICAgICAgICAgcGFyc2VkID0gcGFyc2VVcGRhdGVGaWxlUGF0Y2gobGluZXMsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVycm9yOiBgSW52YWxpZCBhcHBseV9wYXRjaCBmaWxlIG9wZXJhdGlvbiBoZWFkZXI6ICR7bGluZX1gLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ2Vycm9yJyBpbiBwYXJzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6IHBhcnNlZC5lcnJvciB9O1xuICAgICAgICB9XG4gICAgICAgIG9wZXJhdGlvbnMucHVzaChwYXJzZWQub3BlcmF0aW9uKTtcbiAgICAgICAgaW5kZXggPSBwYXJzZWQubmV4dEluZGV4O1xuICAgIH1cbiAgICBpZiAob3BlcmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiAnYXBwbHlfcGF0Y2ggaW5wdXQgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSBmaWxlIG9wZXJhdGlvbi4nLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBvazogdHJ1ZSwgb3BlcmF0aW9ucyB9O1xufVxuZnVuY3Rpb24gcGFyc2VBZGRGaWxlUGF0Y2gobGluZXMsIGluZGV4KSB7XG4gICAgY29uc3QgcGF0aCA9IHBhcnNlUGF0Y2hIZWFkZXIobGluZXNbaW5kZXhdLCBBRERfRklMRSk7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgTWlzc2luZyBwYXRoIGluIGFwcGx5X3BhdGNoIGhlYWRlcjogJHtsaW5lc1tpbmRleF19YCB9O1xuICAgIH1cbiAgICBpbmRleCArPSAxO1xuICAgIGNvbnN0IGRpZmZMaW5lcyA9IFtdO1xuICAgIHdoaWxlIChpbmRleCA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgIWlzRmlsZU9wZXJhdGlvbkhlYWRlcihsaW5lc1tpbmRleF0pKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpbmRleF07XG4gICAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKCcrJykpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBgSW52YWxpZCBBZGQgRmlsZSBsaW5lOiAke2xpbmV9YCB9O1xuICAgICAgICB9XG4gICAgICAgIGRpZmZMaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICBpbmRleCArPSAxO1xuICAgIH1cbiAgICBpZiAoZGlmZkxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXJyb3I6IGBBZGQgRmlsZSBwYXRjaCBmb3IgJHtwYXRofSBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lICsgbGluZS5gLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBvcGVyYXRpb246IHtcbiAgICAgICAgICAgIHR5cGU6ICdjcmVhdGVfZmlsZScsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgZGlmZjogam9pbkRpZmYoZGlmZkxpbmVzKSxcbiAgICAgICAgfSxcbiAgICAgICAgbmV4dEluZGV4OiBpbmRleCxcbiAgICB9O1xufVxuZnVuY3Rpb24gcGFyc2VEZWxldGVGaWxlUGF0Y2gobGluZXMsIGluZGV4KSB7XG4gICAgY29uc3QgcGF0aCA9IHBhcnNlUGF0Y2hIZWFkZXIobGluZXNbaW5kZXhdLCBERUxFVEVfRklMRSk7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgTWlzc2luZyBwYXRoIGluIGFwcGx5X3BhdGNoIGhlYWRlcjogJHtsaW5lc1tpbmRleF19YCB9O1xuICAgIH1cbiAgICBpbmRleCArPSAxO1xuICAgIGlmIChpbmRleCA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgIWlzRmlsZU9wZXJhdGlvbkhlYWRlcihsaW5lc1tpbmRleF0pKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgRGVsZXRlIEZpbGUgcGF0Y2ggZm9yICR7cGF0aH0gbXVzdCBub3QgaW5jbHVkZSBhIGRpZmYuYCB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBvcGVyYXRpb246IHtcbiAgICAgICAgICAgIHR5cGU6ICdkZWxldGVfZmlsZScsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICB9LFxuICAgICAgICBuZXh0SW5kZXg6IGluZGV4LFxuICAgIH07XG59XG5mdW5jdGlvbiBwYXJzZVVwZGF0ZUZpbGVQYXRjaChsaW5lcywgaW5kZXgpIHtcbiAgICBjb25zdCBwYXRoID0gcGFyc2VQYXRjaEhlYWRlcihsaW5lc1tpbmRleF0sIFVQREFURV9GSUxFKTtcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGBNaXNzaW5nIHBhdGggaW4gYXBwbHlfcGF0Y2ggaGVhZGVyOiAke2xpbmVzW2luZGV4XX1gIH07XG4gICAgfVxuICAgIGluZGV4ICs9IDE7XG4gICAgbGV0IG1vdmVUbztcbiAgICBpZiAoaW5kZXggPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmVzW2luZGV4XS5zdGFydHNXaXRoKE1PVkVfVE8pKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZE1vdmVUbyA9IHBhcnNlUGF0Y2hIZWFkZXIobGluZXNbaW5kZXhdLCBNT1ZFX1RPKTtcbiAgICAgICAgaWYgKCFwYXJzZWRNb3ZlVG8pIHtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBgTWlzc2luZyBwYXRoIGluIGFwcGx5X3BhdGNoIGhlYWRlcjogJHtsaW5lc1tpbmRleF19YCB9O1xuICAgICAgICB9XG4gICAgICAgIG1vdmVUbyA9IHBhcnNlZE1vdmVUbztcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICB9XG4gICAgY29uc3QgZGlmZkxpbmVzID0gW107XG4gICAgd2hpbGUgKGluZGV4IDwgbGluZXMubGVuZ3RoIC0gMSAmJiAhaXNGaWxlT3BlcmF0aW9uSGVhZGVyKGxpbmVzW2luZGV4XSkpIHtcbiAgICAgICAgZGlmZkxpbmVzLnB1c2gobGluZXNbaW5kZXhdKTtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICB9XG4gICAgaWYgKGRpZmZMaW5lcy5sZW5ndGggPT09IDAgJiYgIW1vdmVUbykge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogYFVwZGF0ZSBGaWxlIHBhdGNoIGZvciAke3BhdGh9IG11c3QgaW5jbHVkZSBhIGh1bmsuYCB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBvcGVyYXRpb246IHtcbiAgICAgICAgICAgIHR5cGU6ICd1cGRhdGVfZmlsZScsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgZGlmZjogZGlmZkxpbmVzLmxlbmd0aCA+IDAgPyBqb2luRGlmZihkaWZmTGluZXMpIDogJycsXG4gICAgICAgICAgICAuLi4obW92ZVRvID8geyBtb3ZlVG8gfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgbmV4dEluZGV4OiBpbmRleCxcbiAgICB9O1xufVxuZnVuY3Rpb24gcGFyc2VQYXRjaEhlYWRlcihsaW5lLCBwcmVmaXgpIHtcbiAgICBjb25zdCBwYXRoID0gbGluZS5zbGljZShwcmVmaXgubGVuZ3RoKS50cmltKCk7XG4gICAgcmV0dXJuIHBhdGggPyBwYXRoIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGlzRmlsZU9wZXJhdGlvbkhlYWRlcihsaW5lKSB7XG4gICAgcmV0dXJuIChsaW5lLnN0YXJ0c1dpdGgoQUREX0ZJTEUpIHx8XG4gICAgICAgIGxpbmUuc3RhcnRzV2l0aChERUxFVEVfRklMRSkgfHxcbiAgICAgICAgbGluZS5zdGFydHNXaXRoKFVQREFURV9GSUxFKSk7XG59XG5mdW5jdGlvbiBqb2luRGlmZihsaW5lcykge1xuICAgIHJldHVybiBgJHtsaW5lcy5qb2luKCdcXG4nKX1cXG5gO1xufVxuYXN5bmMgZnVuY3Rpb24gYXBwbHlQYXRjaE9wZXJhdGlvbihlZGl0b3IsIG9wZXJhdGlvbiwgcnVuQ29udGV4dCkge1xuICAgIGxldCByZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgICAgc3dpdGNoIChvcGVyYXRpb24udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnY3JlYXRlX2ZpbGUnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGVkaXRvci5jcmVhdGVGaWxlKG9wZXJhdGlvbiwgeyBydW5Db250ZXh0IH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndXBkYXRlX2ZpbGUnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGVkaXRvci51cGRhdGVGaWxlKG9wZXJhdGlvbiwgeyBydW5Db250ZXh0IH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGVsZXRlX2ZpbGUnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGVkaXRvci5kZWxldGVGaWxlKG9wZXJhdGlvbiwgeyBydW5Db250ZXh0IH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1Vuc3VwcG9ydGVkIGFwcGx5X3BhdGNoIG9wZXJhdGlvbi4nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gYEZhaWxlZCB0byBhcHBseSBwYXRjaDogJHt0b0Vycm9yTWVzc2FnZShlcnJvcil9YDtcbiAgICB9XG4gICAgaWYgKHJlc3VsdD8uc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgICAgICByZXR1cm4gcmVzdWx0Lm91dHB1dCA/IGBQYXRjaCBmYWlsZWQ6ICR7cmVzdWx0Lm91dHB1dH1gIDogJ1BhdGNoIGZhaWxlZC4nO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0Py5vdXRwdXQgPz8gJ1BhdGNoIGFwcGxpZWQuJztcbn1cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5UGF0Y2hPcGVyYXRpb25zKGVkaXRvciwgb3BlcmF0aW9ucywgcnVuQ29udGV4dCkge1xuICAgIGNvbnN0IG91dHB1dHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGFwcGx5UGF0Y2hPcGVyYXRpb24oZWRpdG9yLCBvcGVyYXRpb24sIHJ1bkNvbnRleHQpO1xuICAgICAgICBpZiAob3V0cHV0KSB7XG4gICAgICAgICAgICBvdXRwdXRzLnB1c2gob3V0cHV0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0cy5qb2luKCdcXG4nKSB8fCAnUGF0Y2ggYXBwbGllZC4nO1xufVxuZnVuY3Rpb24gYXBwbHlQYXRjaEZ1bmN0aW9uVG9vbChlZGl0b3IpIHtcbiAgICBjb25zdCBmYWxsYmFja1Rvb2wgPSB7XG4gICAgICAgIHR5cGU6ICdmdW5jdGlvbicsXG4gICAgICAgIG5hbWU6ICdhcHBseV9wYXRjaCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnQXBwbGllcyBhIGNyZWF0ZSwgdXBkYXRlLCBtb3ZlLCBvciBkZWxldGUgZmlsZSBwYXRjaCBpbiB0aGUgc2FuZGJveCB3b3Jrc3BhY2UuIEFjY2VwdHMgYSBmcmVlZm9ybSBwYXRjaCBzdHJpbmcgb3Igc3RydWN0dXJlZCBhcHBseV9wYXRjaCBvcGVyYXRpb25zLicsXG4gICAgICAgIHBhcmFtZXRlcnM6IGFwcGx5UGF0Y2hGdW5jdGlvblBhcmFtZXRlcnMsXG4gICAgICAgIHN0cmljdDogZmFsc2UsXG4gICAgICAgIGRlZmVyTG9hZGluZzogZmFsc2UsXG4gICAgICAgIG5lZWRzQXBwcm92YWw6IGFzeW5jICgpID0+IGZhbHNlLFxuICAgICAgICBpc0VuYWJsZWQ6IGFzeW5jICgpID0+IHRydWUsXG4gICAgICAgIGludm9rZTogYXN5bmMgKHJ1bkNvbnRleHQsIGlucHV0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUFwcGx5UGF0Y2hJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICBpZiAoIXBhcnNlZC5vaykge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWQuZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYXBwbHlQYXRjaE9wZXJhdGlvbnMoZWRpdG9yLCBwYXJzZWQub3BlcmF0aW9ucywgcnVuQ29udGV4dCk7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gZmFsbGJhY2tUb29sO1xufVxuY2xhc3MgRmlsZXN5c3RlbUNhcGFiaWxpdHkgZXh0ZW5kcyBDYXBhYmlsaXR5IHtcbiAgICB0eXBlID0gJ2ZpbGVzeXN0ZW0nO1xuICAgIGNvbmZpZ3VyZVRvb2xzO1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MgPSB7fSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZVRvb2xzID0gYXJncy5jb25maWd1cmVUb29scztcbiAgICB9XG4gICAgdG9vbHMoKSB7XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSByZXF1aXJlQm91bmRTZXNzaW9uKHRoaXMudHlwZSwgdGhpcy5fc2Vzc2lvbik7XG4gICAgICAgIGNvbnN0IGVkaXRvciA9IHNlc3Npb24uY3JlYXRlRWRpdG9yPy4odGhpcy5fcnVuQXMpO1xuICAgICAgICBpZiAoIWVkaXRvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcignRmlsZXN5c3RlbSBzYW5kYm94IHNlc3Npb25zIG11c3QgcHJvdmlkZSBjcmVhdGVFZGl0b3IoKS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b29scyA9IFtdO1xuICAgICAgICBjb25zdCB2aWV3SW1hZ2UgPSBhc3luYyAocGF0aCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzZXNzaW9uLnZpZXdJbWFnZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ0ZpbGVzeXN0ZW0gc2FuZGJveCBzZXNzaW9ucyBtdXN0IHByb3ZpZGUgdmlld0ltYWdlKCkuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB3aXRoU2FuZGJveFNwYW4oJ3NhbmRib3gudmlld19pbWFnZScsIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcnVuX2FzOiB0aGlzLl9ydW5BcyxcbiAgICAgICAgICAgICAgICB9LCBhc3luYyAoKSA9PiBhd2FpdCBzZXNzaW9uLnZpZXdJbWFnZSh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHJ1bkFzOiB0aGlzLl9ydW5BcyxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyVmlld0ltYWdlRXJyb3IocGF0aCwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoc3VwcG9ydHNTdHJ1Y3R1cmVkVG9vbE91dHB1dFRyYW5zcG9ydCh0aGlzLl9tb2RlbEluc3RhbmNlKSkge1xuICAgICAgICAgICAgdG9vbHMucHVzaCh0b29sKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndmlld19pbWFnZScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdSZXR1cm5zIGFuIGltYWdlIG91dHB1dCBmcm9tIGEgbG9jYWwgcGF0aCBpbiB0aGUgc2FuZGJveCB3b3Jrc3BhY2UuJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoJ0xvY2FsIGZpbGVzeXN0ZW0gcGF0aCB0byBhbiBpbWFnZSBmaWxlJyksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCwgfSkgPT4gYXdhaXQgdmlld0ltYWdlKHBhdGgpLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdG9vbHMucHVzaCh0b29sKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndmlld19pbWFnZScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdSZXR1cm5zIGFuIGltYWdlIGZyb20gYSBsb2NhbCBwYXRoIGluIHRoZSBzYW5kYm94IHdvcmtzcGFjZSBhcyBhIGRhdGEgVVJMIG9yIHJlZmVyZW5jZSBzdHJpbmcuJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoJ0xvY2FsIGZpbGVzeXN0ZW0gcGF0aCB0byBhbiBpbWFnZSBmaWxlJyksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCB9KSA9PiByZW5kZXJJbWFnZUZvclRleHRUcmFuc3BvcnQoYXdhaXQgdmlld0ltYWdlKHBhdGgpKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VwcG9ydHNBcHBseVBhdGNoVHJhbnNwb3J0KHRoaXMuX21vZGVsSW5zdGFuY2UpKSB7XG4gICAgICAgICAgICB0b29scy5wdXNoKGFwcGx5UGF0Y2hUb29sKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnYXBwbHlfcGF0Y2gnLFxuICAgICAgICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRvb2xzLnB1c2goYXBwbHlQYXRjaEZ1bmN0aW9uVG9vbChlZGl0b3IpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmVUb29scyA/IHRoaXMuY29uZmlndXJlVG9vbHMoWy4uLnRvb2xzXSkgOiB0b29scztcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZmlsZXN5c3RlbShhcmdzID0ge30pIHtcbiAgICByZXR1cm4gbmV3IEZpbGVzeXN0ZW1DYXBhYmlsaXR5KGFyZ3MpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlsZXN5c3RlbS5tanMubWFwIiwiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBVc2VyRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JzLm1qc1wiO1xuaW1wb3J0IHsgdG9vbCB9IGZyb20gXCIuLi8uLi90b29sLm1qc1wiO1xuaW1wb3J0IHsgd2l0aFNhbmRib3hTcGFuIH0gZnJvbSBcIi4uL3J1bnRpbWUvc3BhbnMubWpzXCI7XG5pbXBvcnQgeyBDYXBhYmlsaXR5LCByZXF1aXJlQm91bmRTZXNzaW9uLCB9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5jb25zdCBERUZBVUxUX0VYRUNfWUlFTERfVElNRV9NUyA9IDEwXzAwMDtcbmNvbnN0IERFRkFVTFRfV1JJVEVfU1RESU5fWUlFTERfVElNRV9NUyA9IDI1MDtcbmNvbnN0IFNIRUxMX0lOU1RSVUNUSU9OUyA9IFtcbiAgICAnV2hlbiB1c2luZyB0aGUgc2hlbGw6JyxcbiAgICAnLSBVc2UgYGV4ZWNfY29tbWFuZGAgZm9yIHNoZWxsIGV4ZWN1dGlvbi4nLFxuICAgICctIElmIGF2YWlsYWJsZSwgdXNlIGB3cml0ZV9zdGRpbmAgdG8gaW50ZXJhY3Qgd2l0aCBvciBwb2xsIHJ1bm5pbmcgc2Vzc2lvbnMuJyxcbiAgICAnLSBUbyBpbnRlcnJ1cHQgYSBsb25nLXJ1bm5pbmcgcHJvY2VzcyB2aWEgYHdyaXRlX3N0ZGluYCwgc3RhcnQgaXQgd2l0aCBgdHR5PXRydWVgIGFuZCBzZW5kIEN0cmwtQyAoYFxcXFx1MDAwM2ApLicsXG4gICAgJy0gUHJlZmVyIGByZ2AgYW5kIGByZyAtLWZpbGVzYCBmb3IgdGV4dC9maWxlIGRpc2NvdmVyeSB3aGVuIGF2YWlsYWJsZS4nLFxuICAgICctIEF2b2lkIHVzaW5nIFB5dGhvbiBzY3JpcHRzIGp1c3QgdG8gcHJpbnQgbGFyZ2UgZmlsZSBjaHVua3MuJyxcbl0uam9pbignXFxuJyk7XG5jbGFzcyBTaGVsbENhcGFiaWxpdHkgZXh0ZW5kcyBDYXBhYmlsaXR5IHtcbiAgICB0eXBlID0gJ3NoZWxsJztcbiAgICBjb25maWd1cmVUb29scztcbiAgICBjb25zdHJ1Y3RvcihhcmdzID0ge30pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmVUb29scyA9IGFyZ3MuY29uZmlndXJlVG9vbHM7XG4gICAgfVxuICAgIHRvb2xzKCkge1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gcmVxdWlyZUJvdW5kU2Vzc2lvbih0aGlzLnR5cGUsIHRoaXMuX3Nlc3Npb24pO1xuICAgICAgICBpZiAoIXNlc3Npb24uZXhlY0NvbW1hbmQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ1NoZWxsIHNhbmRib3ggc2Vzc2lvbnMgbXVzdCBwcm92aWRlIGV4ZWNDb21tYW5kKCkuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9vbHMgPSBbXG4gICAgICAgICAgICB0b29sKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZXhlY19jb21tYW5kJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1J1bnMgYSBjb21tYW5kIGluIGEgUFRZLCByZXR1cm5pbmcgb3V0cHV0IG9yIGEgc2Vzc2lvbiBJRCBmb3Igb25nb2luZyBpbnRlcmFjdGlvbi4nLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHoub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgY21kOiB6LnN0cmluZygpLm1pbigxKS5kZXNjcmliZSgnU2hlbGwgY29tbWFuZCB0byBleGVjdXRlLicpLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZGlyOiB6XG4gICAgICAgICAgICAgICAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoJ09wdGlvbmFsIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHJ1biB0aGUgY29tbWFuZCBpbjsgZGVmYXVsdHMgdG8gdGhlIHR1cm4gY3dkLicpLFxuICAgICAgICAgICAgICAgICAgICBzaGVsbDogelxuICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKFwiU2hlbGwgYmluYXJ5IHRvIGxhdW5jaC4gRGVmYXVsdHMgdG8gdGhlIHVzZXIncyBkZWZhdWx0IHNoZWxsLlwiKSxcbiAgICAgICAgICAgICAgICAgICAgbG9naW46IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0KHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoJ1doZXRoZXIgdG8gcnVuIHRoZSBzaGVsbCB3aXRoIC1sLy1pIHNlbWFudGljcy4gRGVmYXVsdHMgdG8gdHJ1ZS4nKSxcbiAgICAgICAgICAgICAgICAgICAgdHR5OiB6XG4gICAgICAgICAgICAgICAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnV2hldGhlciB0byBhbGxvY2F0ZSBhIFRUWSBmb3IgdGhlIGNvbW1hbmQuIERlZmF1bHRzIHRvIGZhbHNlIChwbGFpbiBwaXBlcyk7IHNldCB0byB0cnVlIHRvIG9wZW4gYSBQVFkgYW5kIGFjY2VzcyBUVFkgcHJvY2Vzcy4nKSxcbiAgICAgICAgICAgICAgICAgICAgeWllbGRfdGltZV9tczogelxuICAgICAgICAgICAgICAgICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5taW4oMClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0KERFRkFVTFRfRVhFQ19ZSUVMRF9USU1FX01TKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdIb3cgbG9uZyB0byB3YWl0IChpbiBtaWxsaXNlY29uZHMpIGZvciBvdXRwdXQgYmVmb3JlIHlpZWxkaW5nLicpLFxuICAgICAgICAgICAgICAgICAgICBtYXhfb3V0cHV0X3Rva2VuczogelxuICAgICAgICAgICAgICAgICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5taW4oMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoJ01heGltdW0gbnVtYmVyIG9mIHRva2VucyB0byByZXR1cm4uIEV4Y2VzcyBvdXRwdXQgd2lsbCBiZSB0cnVuY2F0ZWQuJyksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgY21kLCB3b3JrZGlyLCBzaGVsbCwgbG9naW4sIHR0eSwgeWllbGRfdGltZV9tcywgbWF4X291dHB1dF90b2tlbnMsIH0pID0+IGF3YWl0IHdpdGhTYW5kYm94U3Bhbignc2FuZGJveC5leGVjJywge1xuICAgICAgICAgICAgICAgICAgICBjbWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtkaXIsXG4gICAgICAgICAgICAgICAgICAgIHNoZWxsLFxuICAgICAgICAgICAgICAgICAgICBsb2dpbixcbiAgICAgICAgICAgICAgICAgICAgdHR5LFxuICAgICAgICAgICAgICAgICAgICBydW5fYXM6IHRoaXMuX3J1bkFzLFxuICAgICAgICAgICAgICAgIH0sIGFzeW5jICgpID0+IGF3YWl0IHNlc3Npb24uZXhlY0NvbW1hbmQoe1xuICAgICAgICAgICAgICAgICAgICBjbWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtkaXIsXG4gICAgICAgICAgICAgICAgICAgIHNoZWxsLFxuICAgICAgICAgICAgICAgICAgICBsb2dpbixcbiAgICAgICAgICAgICAgICAgICAgdHR5LFxuICAgICAgICAgICAgICAgICAgICB5aWVsZFRpbWVNczogeWllbGRfdGltZV9tcyxcbiAgICAgICAgICAgICAgICAgICAgbWF4T3V0cHV0VG9rZW5zOiBtYXhfb3V0cHV0X3Rva2VucyxcbiAgICAgICAgICAgICAgICAgICAgcnVuQXM6IHRoaXMuX3J1bkFzLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdO1xuICAgICAgICBpZiAoc2Vzc2lvbi5zdXBwb3J0c1B0eT8uKCkgJiYgc2Vzc2lvbi53cml0ZVN0ZGluKSB7XG4gICAgICAgICAgICB0b29scy5wdXNoKHRvb2woe1xuICAgICAgICAgICAgICAgIG5hbWU6ICd3cml0ZV9zdGRpbicsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdXcml0ZXMgY2hhcmFjdGVycyB0byBhbiBleGlzdGluZyB1bmlmaWVkIGV4ZWMgc2Vzc2lvbiBhbmQgcmV0dXJucyByZWNlbnQgb3V0cHV0LicsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uX2lkOiB6XG4gICAgICAgICAgICAgICAgICAgICAgICAubnVtYmVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5pbnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdJZGVudGlmaWVyIG9mIHRoZSBydW5uaW5nIHVuaWZpZWQgZXhlYyBzZXNzaW9uLicpLFxuICAgICAgICAgICAgICAgICAgICBjaGFyczogelxuICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCgnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnQnl0ZXMgdG8gd3JpdGUgdG8gc3RkaW4gKG1heSBiZSBlbXB0eSB0byBwb2xsKS4nKSxcbiAgICAgICAgICAgICAgICAgICAgeWllbGRfdGltZV9tczogelxuICAgICAgICAgICAgICAgICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5taW4oMClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0KERFRkFVTFRfV1JJVEVfU1RESU5fWUlFTERfVElNRV9NUylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnSG93IGxvbmcgdG8gd2FpdCAoaW4gbWlsbGlzZWNvbmRzKSBmb3Igb3V0cHV0IGJlZm9yZSB5aWVsZGluZy4nKSxcbiAgICAgICAgICAgICAgICAgICAgbWF4X291dHB1dF90b2tlbnM6IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5udW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmludCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWluKDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdNYXhpbXVtIG51bWJlciBvZiB0b2tlbnMgdG8gcmV0dXJuLiBFeGNlc3Mgb3V0cHV0IHdpbGwgYmUgdHJ1bmNhdGVkLicpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHNlc3Npb25faWQsIGNoYXJzLCB5aWVsZF90aW1lX21zLCBtYXhfb3V0cHV0X3Rva2VucywgfSkgPT4gYXdhaXQgd2l0aFNhbmRib3hTcGFuKCdzYW5kYm94LndyaXRlX3N0ZGluJywge1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uX2lkLFxuICAgICAgICAgICAgICAgIH0sIGFzeW5jICgpID0+IGF3YWl0IHNlc3Npb24ud3JpdGVTdGRpbih7XG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbl9pZCxcbiAgICAgICAgICAgICAgICAgICAgY2hhcnMsXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkVGltZU1zOiB5aWVsZF90aW1lX21zLFxuICAgICAgICAgICAgICAgICAgICBtYXhPdXRwdXRUb2tlbnM6IG1heF9vdXRwdXRfdG9rZW5zLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmVUb29scyA/IHRoaXMuY29uZmlndXJlVG9vbHMoWy4uLnRvb2xzXSkgOiB0b29scztcbiAgICB9XG4gICAgaW5zdHJ1Y3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gU0hFTExfSU5TVFJVQ1RJT05TO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbChhcmdzID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFNoZWxsQ2FwYWJpbGl0eShhcmdzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNoZWxsLm1qcy5tYXAiLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IHRvb2wgfSBmcm9tIFwiLi4vLi4vdG9vbC5tanNcIjtcbmltcG9ydCB7IGRpciwgZmlsZSwgaXNEaXIsIGlzRGlyZWN0b3J5TGlrZUVudHJ5LCB9IGZyb20gXCIuLi9lbnRyaWVzL2luZGV4Lm1qc1wiO1xuaW1wb3J0IHsgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5tanNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aCB9IGZyb20gXCIuLi9tYW5pZmVzdC5tanNcIjtcbmltcG9ydCB7IHByb21wdCB9IGZyb20gXCIuLi9ydW50aW1lL3Byb21wdHMubWpzXCI7XG5pbXBvcnQgeyBDYXBhYmlsaXR5LCByZXF1aXJlQm91bmRTZXNzaW9uIH0gZnJvbSBcIi4vYmFzZS5tanNcIjtcbmNsYXNzIFNraWxsc0NhcGFiaWxpdHkgZXh0ZW5kcyBDYXBhYmlsaXR5IHtcbiAgICB0eXBlID0gJ3NraWxscyc7XG4gICAgc2tpbGxzO1xuICAgIGZyb207XG4gICAgbGF6eUZyb207XG4gICAgaW5kZXg7XG4gICAgc2tpbGxzUGF0aDtcbiAgICBjb25zdHJ1Y3RvcihhcmdzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2tpbGxzID0gYXJncy5za2lsbHMgPz8gW107XG4gICAgICAgIHRoaXMuZnJvbSA9IGFyZ3MuZnJvbTtcbiAgICAgICAgdGhpcy5sYXp5RnJvbSA9IGFyZ3MubGF6eUZyb207XG4gICAgICAgIHRoaXMuaW5kZXggPSBhcmdzLmluZGV4O1xuICAgICAgICB0aGlzLnNraWxsc1BhdGggPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgoYXJncy5za2lsbHNQYXRoID8/ICcuYWdlbnRzJyk7XG4gICAgICAgIHZhbGlkYXRlU2tpbGxzQ2FwYWJpbGl0eSh0aGlzKTtcbiAgICB9XG4gICAgdG9vbHMoKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXp5RnJvbSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSByZXF1aXJlQm91bmRTZXNzaW9uKHRoaXMudHlwZSwgdGhpcy5fc2Vzc2lvbik7XG4gICAgICAgIGlmICghc2Vzc2lvbi5wYXRoRXhpc3RzIHx8ICFzZXNzaW9uLm1hdGVyaWFsaXplRW50cnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoJ1NraWxscyBzYW5kYm94IHNlc3Npb25zIG11c3QgcHJvdmlkZSBwYXRoRXhpc3RzKCkgYW5kIG1hdGVyaWFsaXplRW50cnkoKS4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdG9vbCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2xvYWRfc2tpbGwnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTG9hZCBhIHNpbmdsZSBsYXppbHkgY29uZmlndXJlZCBza2lsbCBpbnRvIHRoZSBzYW5kYm94IHNvIGl0cyBTS0lMTC5tZCwgc2NyaXB0cywgcmVmZXJlbmNlcywgYW5kIGFzc2V0cyBjYW4gYmUgcmVhZCBmcm9tIHRoZSB3b3Jrc3BhY2UuJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIHNraWxsX25hbWU6IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1pbigxKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdOYW1lIG9mIHRoZSBsYXppbHkgY29uZmlndXJlZCBza2lsbCB0byBtYXRlcmlhbGl6ZS4nKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBleGVjdXRlOiBhc3luYyAoeyBza2lsbF9uYW1lLCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gcmVzb2x2ZUxhenlTa2lsbE1hdGNoKHRoaXMsIHNraWxsX25hbWUsIHNlc3Npb24uc3RhdGUubWFuaWZlc3QpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxhdGl2ZVNraWxsUGF0aCA9IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChtYXRjaC5wYXRoID8/IG1hdGNoLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblBhdGggPSBqb2luUmVsYXRpdmVQYXRocyh0aGlzLnNraWxsc1BhdGgsIHJlbGF0aXZlU2tpbGxQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2tpbGxNYXJrZG93blBhdGggPSBqb2luUmVsYXRpdmVQYXRocyhkZXN0aW5hdGlvblBhdGgsICdTS0lMTC5tZCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXdhaXQgc2Vzc2lvbi5wYXRoRXhpc3RzKHNraWxsTWFya2Rvd25QYXRoLCB0aGlzLl9ydW5BcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnYWxyZWFkeV9sb2FkZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraWxsX25hbWU6IG1hdGNoLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZGVzdGluYXRpb25QYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzZXNzaW9uLm1hdGVyaWFsaXplRW50cnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZGVzdGluYXRpb25QYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnk6IHJlc29sdmVMYXp5U2tpbGxFbnRyeSh0aGlzLmxhenlGcm9tLnNvdXJjZSwgcmVsYXRpdmVTa2lsbFBhdGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuQXM6IHRoaXMuX3J1bkFzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ2xvYWRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBza2lsbF9uYW1lOiBtYXRjaC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZGVzdGluYXRpb25QYXRoLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgcHJvY2Vzc01hbmlmZXN0KG1hbmlmZXN0KSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUGF0aHMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG1hbmlmZXN0LmVudHJpZXMpLm1hcCgocGF0aCkgPT4gbm9ybWFsaXplUmVsYXRpdmVQYXRoKHBhdGgpKSk7XG4gICAgICAgIGlmICh0aGlzLmxhenlGcm9tKSB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGFwcyA9IFsuLi5leGlzdGluZ1BhdGhzXVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBhdGgpID0+IHBhdGhzT3ZlcmxhcChwYXRoLCB0aGlzLnNraWxsc1BhdGgpKVxuICAgICAgICAgICAgICAgIC5zb3J0KCk7XG4gICAgICAgICAgICBpZiAob3ZlcmxhcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoYHNraWxscyBsYXp5RnJvbSBwYXRoIG92ZXJsYXBzIGV4aXN0aW5nIG1hbmlmZXN0IGVudHJpZXM6ICR7b3ZlcmxhcHMuam9pbignLCAnKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5mcm9tKSB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGFwID0gWy4uLmV4aXN0aW5nUGF0aHNdLmZpbmQoKHBhdGgpID0+IHBhdGhzT3ZlcmxhcChwYXRoLCB0aGlzLnNraWxsc1BhdGgpKTtcbiAgICAgICAgICAgIGlmIChvdmVybGFwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcihgc2tpbGxzIHBhdGggb3ZlcmxhcHMgZXhpc3RpbmcgbWFuaWZlc3QgZW50cmllczogJHtvdmVybGFwfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWFuaWZlc3QuZW50cmllc1t0aGlzLnNraWxsc1BhdGhdID0gdGhpcy5mcm9tO1xuICAgICAgICAgICAgcmV0dXJuIG1hbmlmZXN0O1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgc2tpbGwgb2YgdGhpcy5za2lsbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNraWxsUGF0aCA9IGpvaW5SZWxhdGl2ZVBhdGhzKHRoaXMuc2tpbGxzUGF0aCwgc2tpbGwubmFtZSk7XG4gICAgICAgICAgICBjb25zdCBvdmVybGFwID0gWy4uLmV4aXN0aW5nUGF0aHNdLmZpbmQoKHBhdGgpID0+IHBhdGhzT3ZlcmxhcChwYXRoLCBza2lsbFBhdGgpKTtcbiAgICAgICAgICAgIGlmIChvdmVybGFwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcihgc2tpbGwgcGF0aCBvdmVybGFwcyBleGlzdGluZyBtYW5pZmVzdCBlbnRyaWVzOiAke3NraWxsUGF0aH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1hbmlmZXN0LmVudHJpZXNbc2tpbGxQYXRoXSA9IHJlbmRlclNraWxsRGVzY3JpcHRvcihza2lsbCk7XG4gICAgICAgICAgICBleGlzdGluZ1BhdGhzLmFkZChza2lsbFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYW5pZmVzdDtcbiAgICB9XG4gICAgYXN5bmMgaW5zdHJ1Y3Rpb25zKG1hbmlmZXN0KSB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gcmVzb2x2ZVNraWxsc01ldGFkYXRhKHRoaXMsIGF3YWl0IHRoaXMucmVzb2x2ZVJ1bnRpbWVNZXRhZGF0YShtYW5pZmVzdCksIG1hbmlmZXN0KTtcbiAgICAgICAgaWYgKG1ldGFkYXRhLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmZyb20pIHtcbiAgICAgICAgICAgIHJldHVybiByZW5kZXJTa2lsbHNEaXNjb3ZlcnlJbnN0cnVjdGlvbnModGhpcy5za2lsbHNQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVuZGVyU2tpbGxzSW5zdHJ1Y3Rpb25zKHtcbiAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgbGF6eTogQm9vbGVhbih0aGlzLmxhenlGcm9tKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHJlc29sdmVSdW50aW1lTWV0YWRhdGEoX21hbmlmZXN0KSB7XG4gICAgICAgIGlmICghdGhpcy5mcm9tIHx8ICF0aGlzLl9zZXNzaW9uPy5saXN0RGlyIHx8ICF0aGlzLl9zZXNzaW9uLnJlYWRGaWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVudHJpZXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnRyaWVzID0gYXdhaXQgdGhpcy5fc2Vzc2lvbi5saXN0RGlyKHtcbiAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLnNraWxsc1BhdGgsXG4gICAgICAgICAgICAgICAgcnVuQXM6IHRoaXMuX3J1bkFzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgaWYgKGVudHJ5LnR5cGUgIT09ICdkaXInKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY29udGVudDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGF3YWl0IHRoaXMuX3Nlc3Npb24ucmVhZEZpbGUoe1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiBqb2luUmVsYXRpdmVQYXRocyhlbnRyeS5wYXRoLCAnU0tJTEwubWQnKSxcbiAgICAgICAgICAgICAgICAgICAgcnVuQXM6IHRoaXMuX3J1bkFzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWFya2Rvd24gPSB0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGNvbnRlbnRcbiAgICAgICAgICAgICAgICA6IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShjb250ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGZyb250bWF0dGVyID0gcGFyc2VTa2lsbEZyb250bWF0dGVyKG1hcmtkb3duKTtcbiAgICAgICAgICAgIG1ldGFkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6IGZyb250bWF0dGVyLm5hbWUgPz8gZW50cnkubmFtZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZnJvbnRtYXR0ZXIuZGVzY3JpcHRpb24gPz8gJ05vIGRlc2NyaXB0aW9uIHByb3ZpZGVkLicsXG4gICAgICAgICAgICAgICAgcGF0aDogZW50cnkubmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXRhZGF0YTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gc2tpbGxzKGFyZ3MpIHtcbiAgICByZXR1cm4gbmV3IFNraWxsc0NhcGFiaWxpdHkoYXJncyk7XG59XG5jb25zdCBTS0lMTFNfU0VDVElPTl9JTlRSTyA9IHByb21wdCBgXG5BIHNraWxsIGlzIGEgc2V0IG9mIGxvY2FsIGluc3RydWN0aW9ucyB0byBmb2xsb3cgdGhhdCBpcyBzdG9yZWQgaW4gYSBcXGBTS0lMTC5tZFxcYCBmaWxlLiBCZWxvdyBpcyB0aGUgbGlzdCBvZiBza2lsbHMgdGhhdCBjYW4gYmUgdXNlZC4gRWFjaCBlbnRyeSBpbmNsdWRlcyBhIG5hbWUsIGRlc2NyaXB0aW9uLCBhbmQgZmlsZSBwYXRoIHNvIHlvdSBjYW4gb3BlbiB0aGUgc291cmNlIGZvciBmdWxsIGluc3RydWN0aW9ucyB3aGVuIHVzaW5nIGEgc3BlY2lmaWMgc2tpbGwuXG5gO1xuY29uc3QgSE9XX1RPX1VTRV9TS0lMTFNfU0VDVElPTiA9IHByb21wdCBgXG4jIyMgSG93IHRvIHVzZSBza2lsbHNcbi0gRGlzY292ZXJ5OiBUaGUgbGlzdCBhYm92ZSBpcyB0aGUgc2tpbGxzIGF2YWlsYWJsZSBpbiB0aGlzIHNlc3Npb24gKG5hbWUgKyBkZXNjcmlwdGlvbiArIGZpbGUgcGF0aCkuIFNraWxsIGJvZGllcyBsaXZlIG9uIGRpc2sgYXQgdGhlIGxpc3RlZCBwYXRocy5cbi0gVHJpZ2dlciBydWxlczogSWYgdGhlIHVzZXIgbmFtZXMgYSBza2lsbCAod2l0aCBcXGAkU2tpbGxOYW1lXFxgIG9yIHBsYWluIHRleHQpIE9SIHRoZSB0YXNrIGNsZWFybHkgbWF0Y2hlcyBhIHNraWxsJ3MgZGVzY3JpcHRpb24gc2hvd24gYWJvdmUsIHlvdSBtdXN0IHVzZSB0aGF0IHNraWxsIGZvciB0aGF0IHR1cm4uIE11bHRpcGxlIG1lbnRpb25zIG1lYW4gdXNlIHRoZW0gYWxsLiBEbyBub3QgY2Fycnkgc2tpbGxzIGFjcm9zcyB0dXJucyB1bmxlc3MgcmUtbWVudGlvbmVkLlxuLSBNaXNzaW5nL2Jsb2NrZWQ6IElmIGEgbmFtZWQgc2tpbGwgaXNuJ3QgaW4gdGhlIGxpc3Qgb3IgdGhlIHBhdGggY2FuJ3QgYmUgcmVhZCwgc2F5IHNvIGJyaWVmbHkgYW5kIGNvbnRpbnVlIHdpdGggdGhlIGJlc3QgZmFsbGJhY2suXG4tIEhvdyB0byB1c2UgYSBza2lsbCAocHJvZ3Jlc3NpdmUgZGlzY2xvc3VyZSk6XG4gIDEpIEFmdGVyIGRlY2lkaW5nIHRvIHVzZSBhIHNraWxsLCBvcGVuIGl0cyBcXGBTS0lMTC5tZFxcYC4gUmVhZCBvbmx5IGVub3VnaCB0byBmb2xsb3cgdGhlIHdvcmtmbG93LlxuICAyKSBJZiBcXGBTS0lMTC5tZFxcYCBwb2ludHMgdG8gZXh0cmEgZm9sZGVycyBzdWNoIGFzIFxcYHJlZmVyZW5jZXMvXFxgLCBsb2FkIG9ubHkgdGhlIHNwZWNpZmljIGZpbGVzIG5lZWRlZCBmb3IgdGhlIHJlcXVlc3Q7IGRvbid0IGJ1bGstbG9hZCBldmVyeXRoaW5nLlxuICAzKSBJZiBcXGBzY3JpcHRzL1xcYCBleGlzdCwgcHJlZmVyIHJ1bm5pbmcgb3IgcGF0Y2hpbmcgdGhlbSBpbnN0ZWFkIG9mIHJldHlwaW5nIGxhcmdlIGNvZGUgYmxvY2tzLlxuICA0KSBJZiBcXGBhc3NldHMvXFxgIG9yIHRlbXBsYXRlcyBleGlzdCwgcmV1c2UgdGhlbSBpbnN0ZWFkIG9mIHJlY3JlYXRpbmcgZnJvbSBzY3JhdGNoLlxuLSBDb29yZGluYXRpb24gYW5kIHNlcXVlbmNpbmc6XG4gIC0gSWYgbXVsdGlwbGUgc2tpbGxzIGFwcGx5LCBjaG9vc2UgdGhlIG1pbmltYWwgc2V0IHRoYXQgY292ZXJzIHRoZSByZXF1ZXN0IGFuZCBzdGF0ZSB0aGUgb3JkZXIgeW91J2xsIHVzZSB0aGVtLlxuICAtIEFubm91bmNlIHdoaWNoIHNraWxsKHMpIHlvdSdyZSB1c2luZyBhbmQgd2h5IChvbmUgc2hvcnQgbGluZSkuIElmIHlvdSBza2lwIGFuIG9idmlvdXMgc2tpbGwsIHNheSB3aHkuXG4tIENvbnRleHQgaHlnaWVuZTpcbiAgLSBLZWVwIGNvbnRleHQgc21hbGw6IHN1bW1hcml6ZSBsb25nIHNlY3Rpb25zIGluc3RlYWQgb2YgcGFzdGluZyB0aGVtOyBvbmx5IGxvYWQgZXh0cmEgZmlsZXMgd2hlbiBuZWVkZWQuXG4gIC0gQXZvaWQgZGVlcCByZWZlcmVuY2UtY2hhc2luZzogcHJlZmVyIG9wZW5pbmcgb25seSBmaWxlcyBkaXJlY3RseSBsaW5rZWQgZnJvbSBcXGBTS0lMTC5tZFxcYCB1bmxlc3MgeW91J3JlIGJsb2NrZWQuXG4gIC0gV2hlbiB2YXJpYW50cyBleGlzdCAoZnJhbWV3b3JrcywgcHJvdmlkZXJzLCBkb21haW5zKSwgcGljayBvbmx5IHRoZSByZWxldmFudCByZWZlcmVuY2UgZmlsZShzKSBhbmQgbm90ZSB0aGF0IGNob2ljZS5cbi0gU2FmZXR5IGFuZCBmYWxsYmFjazogSWYgYSBza2lsbCBjYW4ndCBiZSBhcHBsaWVkIGNsZWFubHkgKG1pc3NpbmcgZmlsZXMsIHVuY2xlYXIgaW5zdHJ1Y3Rpb25zKSwgc3RhdGUgdGhlIGlzc3VlLCBwaWNrIHRoZSBuZXh0LWJlc3QgYXBwcm9hY2gsIGFuZCBjb250aW51ZS5cbmA7XG5jb25zdCBIT1dfVE9fVVNFX0xBWllfU0tJTExTX1NFQ1RJT04gPSBwcm9tcHQgYFxuIyMjIEhvdyB0byB1c2Ugc2tpbGxzXG4tIERpc2NvdmVyeTogVGhlIGxpc3QgYWJvdmUgaXMgdGhlIHNraWxsIGluZGV4IGF2YWlsYWJsZSBpbiB0aGlzIHNlc3Npb24gKG5hbWUgKyBkZXNjcmlwdGlvbiArIHdvcmtzcGFjZSBwYXRoKS4gSW4gbGF6eSBtb2RlLCB0aG9zZSBwYXRocyBhcmUgbG9hZGVkIG9uIGRlbWFuZCBpbnN0ZWFkIG9mIGJlaW5nIHByZXNlbnQgdXAgZnJvbnQuXG4tIFRyaWdnZXIgcnVsZXM6IElmIHRoZSB1c2VyIG5hbWVzIGEgc2tpbGwgKHdpdGggXFxgJFNraWxsTmFtZVxcYCBvciBwbGFpbiB0ZXh0KSBPUiB0aGUgdGFzayBjbGVhcmx5IG1hdGNoZXMgYSBza2lsbCdzIGRlc2NyaXB0aW9uIHNob3duIGFib3ZlLCB5b3UgbXVzdCB1c2UgdGhhdCBza2lsbCBmb3IgdGhhdCB0dXJuLiBNdWx0aXBsZSBtZW50aW9ucyBtZWFuIHVzZSB0aGVtIGFsbC4gRG8gbm90IGNhcnJ5IHNraWxscyBhY3Jvc3MgdHVybnMgdW5sZXNzIHJlLW1lbnRpb25lZC5cbi0gTWlzc2luZy9ibG9ja2VkOiBJZiBhIG5hbWVkIHNraWxsIGlzbid0IGluIHRoZSBsaXN0IG9yIHRoZSBwYXRoIGNhbid0IGJlIHJlYWQsIHNheSBzbyBicmllZmx5IGFuZCBjb250aW51ZSB3aXRoIHRoZSBiZXN0IGZhbGxiYWNrLlxuLSBIb3cgdG8gdXNlIGEgc2tpbGwgKHByb2dyZXNzaXZlIGRpc2Nsb3N1cmUpOlxuICAxKSBBZnRlciBkZWNpZGluZyB0byB1c2UgYSBsYXp5IHNraWxsLCBjYWxsIFxcYGxvYWRfc2tpbGxcXGAgZm9yIHRoYXQgc2tpbGwgZmlyc3QsIHRoZW4gb3BlbiBpdHMgXFxgU0tJTEwubWRcXGAuXG4gIDIpIElmIFxcYFNLSUxMLm1kXFxgIHBvaW50cyB0byBleHRyYSBmb2xkZXJzIHN1Y2ggYXMgXFxgcmVmZXJlbmNlcy9cXGAsIGxvYWQgb25seSB0aGUgc3BlY2lmaWMgZmlsZXMgbmVlZGVkIGZvciB0aGUgcmVxdWVzdDsgZG9uJ3QgYnVsay1sb2FkIGV2ZXJ5dGhpbmcuXG4gIDMpIElmIFxcYHNjcmlwdHMvXFxgIGV4aXN0LCBwcmVmZXIgcnVubmluZyBvciBwYXRjaGluZyB0aGVtIGluc3RlYWQgb2YgcmV0eXBpbmcgbGFyZ2UgY29kZSBibG9ja3MuXG4gIDQpIElmIFxcYGFzc2V0cy9cXGAgb3IgdGVtcGxhdGVzIGV4aXN0LCByZXVzZSB0aGVtIGluc3RlYWQgb2YgcmVjcmVhdGluZyBmcm9tIHNjcmF0Y2guXG4tIENvb3JkaW5hdGlvbiBhbmQgc2VxdWVuY2luZzpcbiAgLSBJZiBtdWx0aXBsZSBza2lsbHMgYXBwbHksIGNob29zZSB0aGUgbWluaW1hbCBzZXQgdGhhdCBjb3ZlcnMgdGhlIHJlcXVlc3QgYW5kIHN0YXRlIHRoZSBvcmRlciB5b3UnbGwgdXNlIHRoZW0uXG4gIC0gQW5ub3VuY2Ugd2hpY2ggc2tpbGwocykgeW91J3JlIHVzaW5nIGFuZCB3aHkgKG9uZSBzaG9ydCBsaW5lKS4gSWYgeW91IHNraXAgYW4gb2J2aW91cyBza2lsbCwgc2F5IHdoeS5cbi0gQ29udGV4dCBoeWdpZW5lOlxuICAtIEtlZXAgY29udGV4dCBzbWFsbDogc3VtbWFyaXplIGxvbmcgc2VjdGlvbnMgaW5zdGVhZCBvZiBwYXN0aW5nIHRoZW07IG9ubHkgbG9hZCBleHRyYSBmaWxlcyB3aGVuIG5lZWRlZC5cbiAgLSBBdm9pZCBkZWVwIHJlZmVyZW5jZS1jaGFzaW5nOiBwcmVmZXIgb3BlbmluZyBvbmx5IGZpbGVzIGRpcmVjdGx5IGxpbmtlZCBmcm9tIFxcYFNLSUxMLm1kXFxgIHVubGVzcyB5b3UncmUgYmxvY2tlZC5cbiAgLSBXaGVuIHZhcmlhbnRzIGV4aXN0IChmcmFtZXdvcmtzLCBwcm92aWRlcnMsIGRvbWFpbnMpLCBwaWNrIG9ubHkgdGhlIHJlbGV2YW50IHJlZmVyZW5jZSBmaWxlKHMpIGFuZCBub3RlIHRoYXQgY2hvaWNlLlxuLSBTYWZldHkgYW5kIGZhbGxiYWNrOiBJZiBhIHNraWxsIGNhbid0IGJlIGFwcGxpZWQgY2xlYW5seSAobWlzc2luZyBmaWxlcywgdW5jbGVhciBpbnN0cnVjdGlvbnMpLCBzdGF0ZSB0aGUgaXNzdWUsIHBpY2sgdGhlIG5leHQtYmVzdCBhcHByb2FjaCwgYW5kIGNvbnRpbnVlLlxuYDtcbmZ1bmN0aW9uIHZhbGlkYXRlU2tpbGxzQ2FwYWJpbGl0eShjYXBhYmlsaXR5KSB7XG4gICAgY29uc3QgY29uZmlndXJlZFNvdXJjZXMgPSBbXG4gICAgICAgIGNhcGFiaWxpdHkuc2tpbGxzLmxlbmd0aCA+IDAsXG4gICAgICAgIEJvb2xlYW4oY2FwYWJpbGl0eS5mcm9tKSxcbiAgICAgICAgQm9vbGVhbihjYXBhYmlsaXR5LmxhenlGcm9tKSxcbiAgICBdLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG4gICAgaWYgKGNvbmZpZ3VyZWRTb3VyY2VzID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoJ3NraWxscyBjYXBhYmlsaXR5IHJlcXVpcmVzIGBza2lsbHNgLCBgZnJvbWAsIG9yIGBsYXp5RnJvbWAuJyk7XG4gICAgfVxuICAgIGlmIChjb25maWd1cmVkU291cmNlcyA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcignc2tpbGxzIGNhcGFiaWxpdHkgYWNjZXB0cyBvbmx5IG9uZSBvZiBgc2tpbGxzYCwgYGZyb21gLCBvciBgbGF6eUZyb21gLicpO1xuICAgIH1cbiAgICBpZiAoY2FwYWJpbGl0eS5mcm9tICYmICFpc0RpcmVjdG9yeUxpa2VFbnRyeShjYXBhYmlsaXR5LmZyb20pKSB7XG4gICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoJ3NraWxscyBmcm9tIG11c3QgYmUgYSBkaXJlY3RvcnktbGlrZSBlbnRyeSBzdWNoIGFzIGRpciwgZ2l0X3JlcG8sIG9yIG1vdW50LicpO1xuICAgIH1cbiAgICBjb25zdCBzZWVuU2tpbGxOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGNvbnN0IHNraWxsIG9mIGNhcGFiaWxpdHkuc2tpbGxzKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplUmVsYXRpdmVQYXRoKHNraWxsLm5hbWUpO1xuICAgICAgICBpZiAoc2VlblNraWxsTmFtZXMuaGFzKG5vcm1hbGl6ZWROYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcihgZHVwbGljYXRlIHNraWxsIG5hbWU6ICR7c2tpbGwubmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBzZWVuU2tpbGxOYW1lcy5hZGQobm9ybWFsaXplZE5hbWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbmRlclNraWxsRGVzY3JpcHRvcihza2lsbCkge1xuICAgIGNvbnN0IGNoaWxkcmVuID0ge1xuICAgICAgICAnU0tJTEwubWQnOiBub3JtYWxpemVTa2lsbENvbnRlbnQoc2tpbGwuY29udGVudCksXG4gICAgfTtcbiAgICBpZiAoc2tpbGwuc2NyaXB0cyAmJiBPYmplY3Qua2V5cyhza2lsbC5zY3JpcHRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNoaWxkcmVuLnNjcmlwdHMgPSBkaXIoe1xuICAgICAgICAgICAgY2hpbGRyZW46IHNraWxsLnNjcmlwdHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc2tpbGwucmVmZXJlbmNlcyAmJiBPYmplY3Qua2V5cyhza2lsbC5yZWZlcmVuY2VzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNoaWxkcmVuLnJlZmVyZW5jZXMgPSBkaXIoe1xuICAgICAgICAgICAgY2hpbGRyZW46IHNraWxsLnJlZmVyZW5jZXMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc2tpbGwuYXNzZXRzICYmIE9iamVjdC5rZXlzKHNraWxsLmFzc2V0cykubGVuZ3RoID4gMCkge1xuICAgICAgICBjaGlsZHJlbi5hc3NldHMgPSBkaXIoe1xuICAgICAgICAgICAgY2hpbGRyZW46IHNraWxsLmFzc2V0cyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBkaXIoe1xuICAgICAgICBjaGlsZHJlbixcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNraWxsQ29udGVudChjb250ZW50KSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJyB8fCBjb250ZW50IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICByZXR1cm4gZmlsZSh7XG4gICAgICAgICAgICBjb250ZW50LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG59XG5mdW5jdGlvbiByZXNvbHZlU2tpbGxzTWV0YWRhdGEoY2FwYWJpbGl0eSwgcnVudGltZU1ldGFkYXRhID0gW10sIG1hbmlmZXN0KSB7XG4gICAgaWYgKGNhcGFiaWxpdHkuc2tpbGxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGNhcGFiaWxpdHkuc2tpbGxzXG4gICAgICAgICAgICAubWFwKChza2lsbCkgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IHNraWxsLm5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogc2tpbGwuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBwYXRoOiBqb2luUmVsYXRpdmVQYXRocyhjYXBhYmlsaXR5LnNraWxsc1BhdGgsIHNraWxsLm5hbWUpLFxuICAgICAgICB9KSlcbiAgICAgICAgICAgIC5zb3J0KChsZWZ0LCByaWdodCkgPT4gbGVmdC5uYW1lLmxvY2FsZUNvbXBhcmUocmlnaHQubmFtZSkpO1xuICAgIH1cbiAgICBjb25zdCBjb25maWd1cmVkSW5kZXggPSByZXNvbHZlTGF6eVNraWxsSW5kZXgoY2FwYWJpbGl0eS5sYXp5RnJvbSwgbWFuaWZlc3QsIGNhcGFiaWxpdHkuc2tpbGxzUGF0aCkgPz9cbiAgICAgICAgY2FwYWJpbGl0eS5pbmRleCA/P1xuICAgICAgICAocnVudGltZU1ldGFkYXRhLmxlbmd0aCA+IDAgPyBydW50aW1lTWV0YWRhdGEgOiB1bmRlZmluZWQpID8/XG4gICAgICAgIGRlcml2ZUluZGV4RnJvbURpckVudHJ5KGNhcGFiaWxpdHkuZnJvbSk7XG4gICAgcmV0dXJuIGNvbmZpZ3VyZWRJbmRleFxuICAgICAgICAubWFwKChza2lsbCkgPT4gKHtcbiAgICAgICAgLi4uc2tpbGwsXG4gICAgICAgIHBhdGg6IGpvaW5SZWxhdGl2ZVBhdGhzKGNhcGFiaWxpdHkuc2tpbGxzUGF0aCwgc2tpbGwucGF0aCA/PyBub3JtYWxpemVSZWxhdGl2ZVBhdGgoc2tpbGwubmFtZSkpLFxuICAgIH0pKVxuICAgICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQubmFtZS5sb2NhbGVDb21wYXJlKHJpZ2h0Lm5hbWUpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNraWxsRnJvbnRtYXR0ZXIobWFya2Rvd24pIHtcbiAgICBjb25zdCBsaW5lcyA9IG1hcmtkb3duLnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgaWYgKGxpbmVzWzBdPy50cmltKCkgIT09ICctLS0nKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgZW5kSW5kZXggPSBsaW5lcy5maW5kSW5kZXgoKGxpbmUsIGluZGV4KSA9PiBpbmRleCA+IDAgJiYgbGluZS50cmltKCkgPT09ICctLS0nKTtcbiAgICBpZiAoZW5kSW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgbWV0YWRhdGEgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMuc2xpY2UoMSwgZW5kSW5kZXgpKSB7XG4gICAgICAgIGNvbnN0IHN0cmlwcGVkID0gbGluZS50cmltKCk7XG4gICAgICAgIGNvbnN0IGRlbGltaXRlckluZGV4ID0gc3RyaXBwZWQuaW5kZXhPZignOicpO1xuICAgICAgICBpZiAoIXN0cmlwcGVkIHx8IHN0cmlwcGVkLnN0YXJ0c1dpdGgoJyMnKSB8fCBkZWxpbWl0ZXJJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleSA9IHN0cmlwcGVkLnNsaWNlKDAsIGRlbGltaXRlckluZGV4KS50cmltKCk7XG4gICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gc3RyaXBwZWQuc2xpY2UoZGVsaW1pdGVySW5kZXggKyAxKS50cmltKCk7XG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBtZXRhZGF0YVtrZXldID0gdW5xdW90ZUZyb250bWF0dGVyVmFsdWUocmF3VmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gbWV0YWRhdGE7XG59XG5mdW5jdGlvbiB1bnF1b3RlRnJvbnRtYXR0ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gMiAmJlxuICAgICAgICB2YWx1ZVswXSA9PT0gdmFsdWVbdmFsdWUubGVuZ3RoIC0gMV0gJiZcbiAgICAgICAgKHZhbHVlWzBdID09PSAnXCInIHx8IHZhbHVlWzBdID09PSBcIidcIikpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUxhenlTa2lsbEluZGV4KGxhenlTb3VyY2UsIG1hbmlmZXN0LCBza2lsbHNQYXRoID0gJy5hZ2VudHMnKSB7XG4gICAgaWYgKCFsYXp5U291cmNlKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChsYXp5U291cmNlLmluZGV4KSB7XG4gICAgICAgIHJldHVybiBsYXp5U291cmNlLmluZGV4O1xuICAgIH1cbiAgICBpZiAobGF6eVNvdXJjZS5nZXRJbmRleCAmJiBtYW5pZmVzdCkge1xuICAgICAgICBjb25zdCBkZXJpdmVkSW5kZXggPSBsYXp5U291cmNlLmdldEluZGV4KG1hbmlmZXN0LCBza2lsbHNQYXRoKTtcbiAgICAgICAgcmV0dXJuIGRlcml2ZWRJbmRleC5sZW5ndGggPiAwID8gZGVyaXZlZEluZGV4IDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBkZXJpdmVkSW5kZXggPSBkZXJpdmVJbmRleEZyb21EaXJFbnRyeShsYXp5U291cmNlLnNvdXJjZSk7XG4gICAgcmV0dXJuIGRlcml2ZWRJbmRleC5sZW5ndGggPiAwID8gZGVyaXZlZEluZGV4IDogdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gZGVyaXZlSW5kZXhGcm9tRGlyRW50cnkoZW50cnkpIHtcbiAgICBpZiAoIWVudHJ5IHx8ICFpc0RpcihlbnRyeSkgfHwgIWVudHJ5LmNoaWxkcmVuKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGVudHJ5LmNoaWxkcmVuKVxuICAgICAgICAuZmlsdGVyKChbLCBjaGlsZF0pID0+IGNoaWxkLnR5cGUgPT09ICdkaXInKVxuICAgICAgICAubWFwKChbbmFtZSwgY2hpbGRdKSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogY2hpbGQuZGVzY3JpcHRpb24gPz8gJ05vIGRlc2NyaXB0aW9uIHByb3ZpZGVkLicsXG4gICAgfSkpO1xufVxuZnVuY3Rpb24gcmVuZGVyU2tpbGxzRGlzY292ZXJ5SW5zdHJ1Y3Rpb25zKHNraWxsc1BhdGgpIHtcbiAgICByZXR1cm4gcHJvbXB0IGBcbiMjIFNraWxsc1xuJHtTS0lMTFNfU0VDVElPTl9JTlRST31cblxuIyMjIFNraWxsIHNvdXJjZVxuLSBTa2lsbHMgYXJlIG1hdGVyaWFsaXplZCB1bmRlciAke3NraWxsc1BhdGh9LiBEaXNjb3ZlciBhdmFpbGFibGUgc2tpbGxzIGJ5IGluc3BlY3RpbmcgY2hpbGQgZGlyZWN0b3JpZXMgYW5kIHRoZWlyIFNLSUxMLm1kIGZpbGVzIGF0IHJ1bnRpbWUuXG5cbiR7SE9XX1RPX1VTRV9TS0lMTFNfU0VDVElPTn1cbmA7XG59XG5mdW5jdGlvbiByZW5kZXJTa2lsbHNJbnN0cnVjdGlvbnMoYXJncykge1xuICAgIGNvbnN0IGF2YWlsYWJsZVNraWxscyA9IGFyZ3MubWV0YWRhdGFcbiAgICAgICAgLm1hcCgoc2tpbGwpID0+IGAtICR7c2tpbGwubmFtZX06ICR7c2tpbGwuZGVzY3JpcHRpb259IChmaWxlOiAke3NraWxsLnBhdGggPz8gc2tpbGwubmFtZX0pYClcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIGNvbnN0IGxhenlMb2FkaW5nSW5zdHJ1Y3Rpb25zID0gYXJncy5sYXp5XG4gICAgICAgID8gcHJvbXB0IGBcbiMjIyBMYXp5IGxvYWRpbmdcbi0gVGhlc2Ugc2tpbGxzIGFyZSBpbmRleGVkIGZvciBwbGFubmluZywgYnV0IHRoZXkgYXJlIG5vdCBtYXRlcmlhbGl6ZWQgaW4gdGhlIHdvcmtzcGFjZSB5ZXQuXG4tIENhbGwgXFxgbG9hZF9za2lsbFxcYCB3aXRoIGEgc2luZ2xlIHNraWxsIG5hbWUgZnJvbSB0aGUgbGlzdCBiZWZvcmUgcmVhZGluZyBpdHMgXFxgU0tJTEwubWRcXGAgb3Igb3RoZXIgZmlsZXMgZnJvbSB0aGUgd29ya3NwYWNlLlxuLSBcXGBsb2FkX3NraWxsXFxgIHN0YWdlcyBleGFjdGx5IG9uZSBza2lsbCB1bmRlciB0aGUgbGlzdGVkIHBhdGguIElmIHlvdSBuZWVkIG1vcmUgdGhhbiBvbmUgc2tpbGwsIGNhbGwgaXQgbXVsdGlwbGUgdGltZXMuXG5gXG4gICAgICAgIDogJyc7XG4gICAgY29uc3QgdXNhZ2VJbnN0cnVjdGlvbnMgPSBhcmdzLmxhenlcbiAgICAgICAgPyBIT1dfVE9fVVNFX0xBWllfU0tJTExTX1NFQ1RJT05cbiAgICAgICAgOiBIT1dfVE9fVVNFX1NLSUxMU19TRUNUSU9OO1xuICAgIGNvbnN0IGxhenlMb2FkaW5nU2VjdGlvbiA9IGxhenlMb2FkaW5nSW5zdHJ1Y3Rpb25zXG4gICAgICAgID8gYCR7bGF6eUxvYWRpbmdJbnN0cnVjdGlvbnN9XFxuXFxuYFxuICAgICAgICA6ICcnO1xuICAgIHJldHVybiBwcm9tcHQgYFxuIyMgU2tpbGxzXG4ke1NLSUxMU19TRUNUSU9OX0lOVFJPfVxuXG4jIyMgQXZhaWxhYmxlIHNraWxsc1xuJHthdmFpbGFibGVTa2lsbHN9XG5cbiR7bGF6eUxvYWRpbmdTZWN0aW9ufSR7dXNhZ2VJbnN0cnVjdGlvbnN9XG5gO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUxhenlTa2lsbE1hdGNoKGNhcGFiaWxpdHksIHNraWxsTmFtZSwgbWFuaWZlc3QpIHtcbiAgICBjb25zdCBpbmRleCA9IHJlc29sdmVMYXp5U2tpbGxJbmRleChjYXBhYmlsaXR5LmxhenlGcm9tLCBtYW5pZmVzdCwgY2FwYWJpbGl0eS5za2lsbHNQYXRoKSA/P1xuICAgICAgICBjYXBhYmlsaXR5LmluZGV4ID8/XG4gICAgICAgIFtdO1xuICAgIGNvbnN0IG1hdGNoZXMgPSBpbmRleC5maWx0ZXIoKHNraWxsKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChza2lsbC5wYXRoID8/IHNraWxsLm5hbWUpO1xuICAgICAgICBjb25zdCBwYXRoQmFzZU5hbWUgPSByZWxhdGl2ZVBhdGguc3BsaXQoJy8nKS5wb3AoKSA/PyByZWxhdGl2ZVBhdGg7XG4gICAgICAgIHJldHVybiAoc2tpbGwubmFtZSA9PT0gc2tpbGxOYW1lIHx8XG4gICAgICAgICAgICByZWxhdGl2ZVBhdGggPT09IHNraWxsTmFtZSB8fFxuICAgICAgICAgICAgcGF0aEJhc2VOYW1lID09PSBza2lsbE5hbWUpO1xuICAgIH0pO1xuICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKGBsYXp5IHNraWxsIG5vdCBmb3VuZDogJHtza2lsbE5hbWV9YCk7XG4gICAgfVxuICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcihgbGF6eSBza2lsbCBuYW1lIGlzIGFtYmlndW91czogJHtza2lsbE5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVzWzBdO1xufVxuZnVuY3Rpb24gam9pblJlbGF0aXZlUGF0aHMobGVmdCwgcmlnaHQpIHtcbiAgICBjb25zdCBub3JtYWxpemVkTGVmdCA9IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChsZWZ0KTtcbiAgICBjb25zdCBub3JtYWxpemVkUmlnaHQgPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgocmlnaHQpO1xuICAgIGlmICghbm9ybWFsaXplZExlZnQpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRSaWdodDtcbiAgICB9XG4gICAgaWYgKCFub3JtYWxpemVkUmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRMZWZ0O1xuICAgIH1cbiAgICByZXR1cm4gYCR7bm9ybWFsaXplZExlZnR9LyR7bm9ybWFsaXplZFJpZ2h0fWA7XG59XG5mdW5jdGlvbiBqb2luU291cmNlUGF0aChzb3VyY2VSb290LCByZWxhdGl2ZVBhdGgpIHtcbiAgICBjb25zdCB0cmltbWVkUm9vdCA9IHNvdXJjZVJvb3QucmVwbGFjZSgvW1xcXFwvXSskLywgJycpO1xuICAgIGlmICghdHJpbW1lZFJvb3QpIHtcbiAgICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RyaW1tZWRSb290fS8ke3JlbGF0aXZlUGF0aH1gO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUxhenlTa2lsbEVudHJ5KHNvdXJjZSwgcmVsYXRpdmVTa2lsbFBhdGgpIHtcbiAgICBpZiAoc291cmNlLnR5cGUgPT09ICdsb2NhbF9kaXInKSB7XG4gICAgICAgIGlmICghc291cmNlLnNyYykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcignTGF6eSBza2lsbCBsb2NhbF9kaXIgc291cmNlcyByZXF1aXJlIGEgY29uY3JldGUgc3JjIHZhbHVlLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zb3VyY2UsXG4gICAgICAgICAgICB0eXBlOiAnbG9jYWxfZGlyJyxcbiAgICAgICAgICAgIHNyYzogam9pblNvdXJjZVBhdGgoc291cmNlLnNyYywgcmVsYXRpdmVTa2lsbFBhdGgpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoc291cmNlLnR5cGUgPT09ICdnaXRfcmVwbycpIHtcbiAgICAgICAgY29uc3QgYmFzZVN1YnBhdGggPSBzb3VyY2Uuc3VicGF0aFxuICAgICAgICAgICAgPyBub3JtYWxpemVSZWxhdGl2ZVBhdGgoc291cmNlLnN1YnBhdGgpXG4gICAgICAgICAgICA6ICcnO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc291cmNlLFxuICAgICAgICAgICAgdHlwZTogJ2dpdF9yZXBvJyxcbiAgICAgICAgICAgIHN1YnBhdGg6IGpvaW5SZWxhdGl2ZVBhdGhzKGJhc2VTdWJwYXRoLCByZWxhdGl2ZVNraWxsUGF0aCksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChzb3VyY2UudHlwZSA9PT0gJ2RpcicpIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSByZWFkRGlyQ2hpbGQoc291cmNlLCByZWxhdGl2ZVNraWxsUGF0aCk7XG4gICAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoYGxhenkgc2tpbGwgc291cmNlIHBhdGggbm90IGZvdW5kOiAke3JlbGF0aXZlU2tpbGxQYXRofWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcihgTGF6eSBza2lsbCBzb3VyY2UgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIHlldDogJHtzb3VyY2UudHlwZX1gKTtcbn1cbmZ1bmN0aW9uIHJlYWREaXJDaGlsZChzb3VyY2UsIHJlbGF0aXZlU2tpbGxQYXRoKSB7XG4gICAgbGV0IGN1cnJlbnQgPSBzb3VyY2U7XG4gICAgZm9yIChjb25zdCBzZWdtZW50IG9mIG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChyZWxhdGl2ZVNraWxsUGF0aCkuc3BsaXQoJy8nKSkge1xuICAgICAgICBpZiAoIXNlZ21lbnQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3VycmVudCB8fCAhaXNEaXIoY3VycmVudCkgfHwgIWN1cnJlbnQuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGRyZW5bc2VnbWVudF07XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50O1xufVxuZnVuY3Rpb24gcGF0aHNPdmVybGFwKGxlZnQsIHJpZ2h0KSB7XG4gICAgcmV0dXJuIChsZWZ0ID09PSByaWdodCB8fFxuICAgICAgICBsZWZ0LnN0YXJ0c1dpdGgoYCR7cmlnaHR9L2ApIHx8XG4gICAgICAgIHJpZ2h0LnN0YXJ0c1dpdGgoYCR7bGVmdH0vYCkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2tpbGxzLm1qcy5tYXAiLCJpbXBvcnQgeyBjb21wYWN0aW9uIH0gZnJvbSBcIi4vY29tcGFjdGlvbi5tanNcIjtcbmltcG9ydCB7IGZpbGVzeXN0ZW0gfSBmcm9tIFwiLi9maWxlc3lzdGVtLm1qc1wiO1xuaW1wb3J0IHsgc2hlbGwgfSBmcm9tIFwiLi9zaGVsbC5tanNcIjtcbmV4cG9ydCB7IENhcGFiaWxpdHkgfSBmcm9tIFwiLi9iYXNlLm1qc1wiO1xuZXhwb3J0IHsgQ29tcGFjdGlvbk1vZGVsSW5mbywgQ29tcGFjdGlvblBvbGljeSwgRHluYW1pY0NvbXBhY3Rpb25Qb2xpY3ksIFN0YXRpY0NvbXBhY3Rpb25Qb2xpY3ksIGNvbXBhY3Rpb24sIH0gZnJvbSBcIi4vY29tcGFjdGlvbi5tanNcIjtcbmV4cG9ydCB7IGZpbGVzeXN0ZW0gfSBmcm9tIFwiLi9maWxlc3lzdGVtLm1qc1wiO1xuZXhwb3J0IHsgbWVtb3J5IH0gZnJvbSBcIi4vbWVtb3J5Lm1qc1wiO1xuZXhwb3J0IHsgSW5NZW1vcnlNZW1vcnlTdG9yZSB9IGZyb20gXCIuLi9tZW1vcnkvc3RvcmFnZS5tanNcIjtcbmV4cG9ydCB7IHNoZWxsIH0gZnJvbSBcIi4vc2hlbGwubWpzXCI7XG5leHBvcnQgeyBza2lsbHMgfSBmcm9tIFwiLi9za2lsbHMubWpzXCI7XG5mdW5jdGlvbiBkZWZhdWx0Q2FwYWJpbGl0aWVzKCkge1xuICAgIHJldHVybiBbZmlsZXN5c3RlbSgpLCBzaGVsbCgpLCBjb21wYWN0aW9uKCldO1xufVxuZXhwb3J0IGNvbnN0IENhcGFiaWxpdGllcyA9IHtcbiAgICBkZWZhdWx0OiBkZWZhdWx0Q2FwYWJpbGl0aWVzLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXAiLCJpbXBvcnQgeyBBZ2VudCB9IGZyb20gXCIuLi9hZ2VudC5tanNcIjtcbmltcG9ydCB7IFNBTkRCT1hfQUdFTlRfQlJBTkQgfSBmcm9tIFwiLi9icmFuZC5tanNcIjtcbmltcG9ydCB7IENhcGFiaWxpdGllcyB9IGZyb20gXCIuL2NhcGFiaWxpdGllcy9pbmRleC5tanNcIjtcbmltcG9ydCB7IGNsb25lTWFuaWZlc3QsIE1hbmlmZXN0IH0gZnJvbSBcIi4vbWFuaWZlc3QubWpzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVVc2VyIH0gZnJvbSBcIi4vdXNlcnMubWpzXCI7XG5leHBvcnQgY2xhc3MgU2FuZGJveEFnZW50IGV4dGVuZHMgQWdlbnQge1xuICAgIFtTQU5EQk9YX0FHRU5UX0JSQU5EXSA9IHRydWU7XG4gICAgZGVmYXVsdE1hbmlmZXN0O1xuICAgIGJhc2VJbnN0cnVjdGlvbnM7XG4gICAgY2FwYWJpbGl0aWVzO1xuICAgIHJ1bkFzO1xuICAgIHJ1bnRpbWVNYW5pZmVzdDtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5iYXNlSW5zdHJ1Y3Rpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjb25maWcuYmFzZUluc3RydWN0aW9ucyAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjb25maWcuYmFzZUluc3RydWN0aW9ucyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignU2FuZGJveEFnZW50IGJhc2VJbnN0cnVjdGlvbnMgbXVzdCBiZSBhIHN0cmluZyBvciBmdW5jdGlvbi4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlZmF1bHRNYW5pZmVzdCA9IGNvbmZpZy5kZWZhdWx0TWFuaWZlc3RcbiAgICAgICAgICAgID8gY2xvbmVNYW5pZmVzdChjb25maWcuZGVmYXVsdE1hbmlmZXN0KVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuYmFzZUluc3RydWN0aW9ucyA9IGNvbmZpZy5iYXNlSW5zdHJ1Y3Rpb25zO1xuICAgICAgICB0aGlzLmNhcGFiaWxpdGllcyA9IGNvbmZpZy5jYXBhYmlsaXRpZXMgPz8gQ2FwYWJpbGl0aWVzLmRlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5ydW5BcyA9IG5vcm1hbGl6ZVJ1bkFzKGNvbmZpZy5ydW5Bcyk7XG4gICAgICAgIHRoaXMucnVudGltZU1hbmlmZXN0ID0gdGhpcy5kZWZhdWx0TWFuaWZlc3QgPz8gbmV3IE1hbmlmZXN0KCk7XG4gICAgfVxuICAgIGNsb25lKGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hBZ2VudCh7XG4gICAgICAgICAgICBuYW1lOiBjb25maWcubmFtZSA/PyB0aGlzLm5hbWUsXG4gICAgICAgICAgICBpbnN0cnVjdGlvbnM6IGNvbmZpZy5pbnN0cnVjdGlvbnMgPz8gdGhpcy5pbnN0cnVjdGlvbnMsXG4gICAgICAgICAgICBwcm9tcHQ6IGNvbmZpZy5wcm9tcHQgPz8gdGhpcy5wcm9tcHQsXG4gICAgICAgICAgICBoYW5kb2ZmRGVzY3JpcHRpb246IGNvbmZpZy5oYW5kb2ZmRGVzY3JpcHRpb24gPz8gdGhpcy5oYW5kb2ZmRGVzY3JpcHRpb24sXG4gICAgICAgICAgICBoYW5kb2ZmczogY29uZmlnLmhhbmRvZmZzID8/IHRoaXMuaGFuZG9mZnMsXG4gICAgICAgICAgICBtb2RlbDogY29uZmlnLm1vZGVsID8/IHRoaXMubW9kZWwsXG4gICAgICAgICAgICBtb2RlbFNldHRpbmdzOiBjb25maWcubW9kZWxTZXR0aW5ncyA/PyB0aGlzLm1vZGVsU2V0dGluZ3MsXG4gICAgICAgICAgICB0b29sczogY29uZmlnLnRvb2xzID8/IHRoaXMudG9vbHMsXG4gICAgICAgICAgICBtY3BTZXJ2ZXJzOiBjb25maWcubWNwU2VydmVycyA/PyB0aGlzLm1jcFNlcnZlcnMsXG4gICAgICAgICAgICBtY3BDb25maWc6IGNvbmZpZy5tY3BDb25maWcgPz8gdGhpcy5tY3BDb25maWcsXG4gICAgICAgICAgICBpbnB1dEd1YXJkcmFpbHM6IGNvbmZpZy5pbnB1dEd1YXJkcmFpbHMgPz8gdGhpcy5pbnB1dEd1YXJkcmFpbHMsXG4gICAgICAgICAgICBvdXRwdXRHdWFyZHJhaWxzOiBjb25maWcub3V0cHV0R3VhcmRyYWlscyA/PyB0aGlzLm91dHB1dEd1YXJkcmFpbHMsXG4gICAgICAgICAgICBvdXRwdXRUeXBlOiBjb25maWcub3V0cHV0VHlwZSA/PyB0aGlzLm91dHB1dFR5cGUsXG4gICAgICAgICAgICB0b29sVXNlQmVoYXZpb3I6IGNvbmZpZy50b29sVXNlQmVoYXZpb3IgPz8gdGhpcy50b29sVXNlQmVoYXZpb3IsXG4gICAgICAgICAgICByZXNldFRvb2xDaG9pY2U6IGNvbmZpZy5yZXNldFRvb2xDaG9pY2UgPz8gdGhpcy5yZXNldFRvb2xDaG9pY2UsXG4gICAgICAgICAgICBkZWZhdWx0TWFuaWZlc3Q6IGNvbmZpZy5kZWZhdWx0TWFuaWZlc3QgPz8gdGhpcy5kZWZhdWx0TWFuaWZlc3QsXG4gICAgICAgICAgICBiYXNlSW5zdHJ1Y3Rpb25zOiBjb25maWcuYmFzZUluc3RydWN0aW9ucyA/PyB0aGlzLmJhc2VJbnN0cnVjdGlvbnMsXG4gICAgICAgICAgICBjYXBhYmlsaXRpZXM6IGNvbmZpZy5jYXBhYmlsaXRpZXMgPz8gdGhpcy5jYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICBydW5BczogY29uZmlnLnJ1bkFzID8/IHRoaXMucnVuQXMsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJ1bkFzKHJ1bkFzKSB7XG4gICAgaWYgKHJ1bkFzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBydW5BcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IHJ1bkFzLnRyaW0oKTtcbiAgICAgICAgaWYgKCF0cmltbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdTYW5kYm94QWdlbnQgcnVuQXMgbXVzdCBiZSBub24tZW1wdHkuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyaW1tZWQ7XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVVc2VyKHJ1bkFzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFnZW50Lm1qcy5tYXAiXSwibmFtZXMiOlsic3VwcG9ydHNSZXNwb25zZXNDb21wYWN0aW9uVHJhbnNwb3J0IiwibW9kZWxJbnN0YW5jZSIsInN1cHBvcnRzQXBwbHlQYXRjaFRyYW5zcG9ydCIsInN1cHBvcnRzU3RydWN0dXJlZFRvb2xPdXRwdXRUcmFuc3BvcnQiLCJDb21wYWN0aW9uUG9saWN5IiwiRHluYW1pY0NvbXBhY3Rpb25Qb2xpY3kiLCJ0aHJlc2hvbGRSYXRpbyIsImZhbGxiYWNrVGhyZXNob2xkIiwiX19wdWJsaWNGaWVsZCIsIm1vZGVsIiwibW9kZWxJbmZvIiwiQ29tcGFjdGlvbk1vZGVsSW5mbyIsImNvbnRleHRXaW5kb3ciLCJjYW5kaWRhdGUiLCJnZXRTYW5kYm94Q29tcGFjdGlvbk1vZGVsQ2FuZGlkYXRlcyIsIlNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzFNIiwiU0FOREJPWF9DT05URVhUX1dJTkRPV1NfNDAwSyIsIlNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzIwMEsiLCJTQU5EQk9YX0NPTlRFWFRfV0lORE9XU18xMjhLIiwiQ29tcGFjdGlvbkNhcGFiaWxpdHkiLCJDYXBhYmlsaXR5IiwicG9saWN5Iiwic2FtcGxpbmdQYXJhbXMiLCJjb250ZXh0IiwibGFzdENvbXBhY3Rpb25JbmRleCIsImluZGV4IiwiY29tcGFjdGlvbiIsImFyZ3MiLCJ0cmltbWVkIiwibm9ybWFsaXplZCIsIndpdGhvdXRQaW5uZWREYXRlIiwiYXBwbHlQYXRjaEZ1bmN0aW9uUGFyYW1ldGVycyIsIkJFR0lOX1BBVENIIiwiRU5EX1BBVENIIiwiQUREX0ZJTEUiLCJERUxFVEVfRklMRSIsIlVQREFURV9GSUxFIiwiTU9WRV9UTyIsInRvRXJyb3JNZXNzYWdlIiwiZXJyb3IiLCJyZW5kZXJJbWFnZUZvclRleHRUcmFuc3BvcnQiLCJvdXRwdXQiLCJpbWFnZSIsImlzUmVjb3JkIiwiaW1hZ2VSZWNvcmQiLCJlbmNvZGVVaW50OEFycmF5VG9CYXNlNjQiLCJyZW5kZXJWaWV3SW1hZ2VFcnJvciIsInBhdGgiLCJtZXNzYWdlIiwibmFtZSIsInBhcnNlQXBwbHlQYXRjaElucHV0IiwicmF3SW5wdXQiLCJ0cmltbWVkSW5wdXQiLCJwYXJzZUZyZWVmb3JtUGF0Y2giLCJwYXlsb2FkIiwicGFyc2VBcHBseVBhdGNoUGF5bG9hZCIsInBhcnNlU3RydWN0dXJlZE9wZXJhdGlvbnMiLCJjb21tYW5kTmFtZSIsInBhdGNoIiwicGF5bG9hZHMiLCJvcGVyYXRpb25zIiwicGFyc2VkIiwiQXBwbHlQYXRjaE9wZXJhdGlvbiIsInJhd1BhdGNoIiwibGluZXMiLCJsaW5lIiwicGFyc2VBZGRGaWxlUGF0Y2giLCJwYXJzZURlbGV0ZUZpbGVQYXRjaCIsInBhcnNlVXBkYXRlRmlsZVBhdGNoIiwicGFyc2VQYXRjaEhlYWRlciIsImRpZmZMaW5lcyIsImlzRmlsZU9wZXJhdGlvbkhlYWRlciIsImpvaW5EaWZmIiwibW92ZVRvIiwicGFyc2VkTW92ZVRvIiwicHJlZml4IiwiYXBwbHlQYXRjaE9wZXJhdGlvbiIsImVkaXRvciIsIm9wZXJhdGlvbiIsInJ1bkNvbnRleHQiLCJyZXN1bHQiLCJhcHBseVBhdGNoT3BlcmF0aW9ucyIsIm91dHB1dHMiLCJhcHBseVBhdGNoRnVuY3Rpb25Ub29sIiwiaW5wdXQiLCJGaWxlc3lzdGVtQ2FwYWJpbGl0eSIsInNlc3Npb24iLCJyZXF1aXJlQm91bmRTZXNzaW9uIiwiX2EiLCJVc2VyRXJyb3IiLCJ0b29scyIsInZpZXdJbWFnZSIsIndpdGhTYW5kYm94U3BhbiIsInRvb2wiLCJ6Lm9iamVjdCIsInouc3RyaW5nIiwiYXBwbHlQYXRjaFRvb2wiLCJmaWxlc3lzdGVtIiwiREVGQVVMVF9FWEVDX1lJRUxEX1RJTUVfTVMiLCJERUZBVUxUX1dSSVRFX1NURElOX1lJRUxEX1RJTUVfTVMiLCJTSEVMTF9JTlNUUlVDVElPTlMiLCJTaGVsbENhcGFiaWxpdHkiLCJ6XG4gICAgICAgICAgICAgICAgICAgICAgICAuc3RyaW5nIiwielxuICAgICAgICAgICAgICAgICAgICAgICAgLmJvb2xlYW4iLCJ6XG4gICAgICAgICAgICAgICAgICAgICAgICAubnVtYmVyIiwiY21kIiwid29ya2RpciIsInNoZWxsIiwibG9naW4iLCJ0dHkiLCJ5aWVsZF90aW1lX21zIiwibWF4X291dHB1dF90b2tlbnMiLCJzZXNzaW9uX2lkIiwiY2hhcnMiLCJwcm9tcHQiLCJkZWZhdWx0Q2FwYWJpbGl0aWVzIiwiQ2FwYWJpbGl0aWVzIiwiU2FuZGJveEFnZW50IiwiX2IiLCJBZ2VudCIsIlNBTkRCT1hfQUdFTlRfQlJBTkQiLCJjb25maWciLCJjbG9uZU1hbmlmZXN0Iiwibm9ybWFsaXplUnVuQXMiLCJNYW5pZmVzdCIsInJ1bkFzIiwibm9ybWFsaXplVXNlciJdLCJtYXBwaW5ncyI6Ijs7OztBQUFPLFNBQVNBLEVBQXFDQyxHQUFlO0FBQ2hFLFNBQUtBLElBU0UsRUFOaUIsT0FBT0EsS0FBa0IsWUFDN0NBLEtBQ0EsaUJBQWlCQSxLQUNqQixPQUFPQSxFQUFjLGVBQWdCLGFBQ25DQSxFQUFjLFlBQVksT0FDMUIsSUFDa0IsU0FBUyxpQkFBaUIsSUFSdkM7QUFTZjtBQUNPLFNBQVNDLEVBQTRCRCxHQUFlO0FBQ3ZELFNBQU9FLEVBQXNDRixDQUFhO0FBQzlEO0FBQ08sU0FBU0UsRUFBc0NGLEdBQWU7QUFDakUsU0FBS0EsSUFTRSxFQU5pQixPQUFPQSxLQUFrQixZQUM3Q0EsS0FD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
|