@dbx-tools/appkit-mastra 0.9.108 → 0.9.111

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/lib/src/agents.js CHANGED
@@ -16,21 +16,37 @@
16
16
  */
17
17
  import { ConfigurationError } from "@databricks/appkit";
18
18
  import { toolkitEntries } from "@dbx-tools/appkit";
19
- import { errorUtils, object, stringUtils } from "@dbx-tools/shared-core";
19
+ import { errorUtils, log, object, stringUtils } from "@dbx-tools/shared-core";
20
20
  import { TOOL_PROGRESS_PART_TYPE, ToolProgressEventSchema } from "@dbx-tools/shared-mastra/wire";
21
21
  import { Agent } from "@mastra/core/agent";
22
22
  import { createEventedAgent } from "@mastra/core/agent/durable";
23
23
  import { SkillSearchProcessor } from "@mastra/core/processors";
24
24
  import { MASTRA_RESOURCE_ID_KEY } from "@mastra/core/request-context";
25
- import { createTool } from "@mastra/core/tools";
25
+ import { createCodeMode, createTool } from "@mastra/core/tools";
26
+ import { createWorkspaceTools } from "@mastra/core/workspace";
27
+ import { QuickJsCodeModeTransport } from "@mastra/quickjs";
26
28
  import { buildRenderDataTool } from "./chart.js";
27
29
  import { buildGenieToolkitProvider, resolveGenieSpaces } from "./genie.js";
30
+ import { withRequestMemoryScope } from "./memory.js";
28
31
  import { buildModel, RESPONSES_PROVIDER_OPTIONS } from "./model.js";
29
32
  import { stripStaleChartsProcessor } from "./processors.js";
30
33
  import { MASTRA_RESOLVED_MODEL_KEY } from "./serving.js";
31
34
  import { TYPOGRAPHY_RULE } from "./style.js";
32
35
  import { buildSummarizeTool } from "./summarize.js";
33
- import { bindDatabricksWorkspaceContext, databricksWorkspace } from "./workspaces.js";
36
+ import { bindDatabricksWorkspaceContext, databricksWorkspace, } from "./workspaces.js";
37
+ const codeModeLogger = log.logger("mastra/code-mode");
38
+ let resolvedCodeModeTransport;
39
+ /** Return whether this boot environment matches isolated-vm's supported app shape. */
40
+ function supportsIsolatedVmTransport() {
41
+ if (process.versions.bun || process.release.name !== "node" || process.platform !== "linux") {
42
+ return false;
43
+ }
44
+ const nodeMajor = Number.parseInt(process.versions.node.split(".")[0] ?? "", 10);
45
+ if (!Number.isFinite(nodeMajor) || nodeMajor < 20 || nodeMajor >= 25)
46
+ return false;
47
+ const nodeOptions = process.env.NODE_OPTIONS?.split(/\s+/) ?? [];
48
+ return [...process.execArgv, ...nodeOptions].includes("--no-node-snapshot");
49
+ }
34
50
  /** Re-export of Mastra's native `createTool` for full-feature access. */
35
51
  export { createTool } from "@mastra/core/tools";
36
52
  /**
@@ -95,8 +111,9 @@ function deriveToolId(description) {
95
111
  * ```
96
112
  *
97
113
  * Adds the package's default workspace when the definition omits one. That
98
- * workspace carries Databricks skill mounts and Monty command execution. An
99
- * explicit workspace remains the caller's complete override.
114
+ * workspace carries Databricks skill mounts while command execution stays
115
+ * disabled until a sandbox is selected explicitly. An explicit workspace
116
+ * remains the caller's complete override.
100
117
  */
101
118
  export function createAgent(def) {
102
119
  if (def.workspace)
@@ -108,7 +125,7 @@ export function createAgent(def) {
108
125
  /**
109
126
  * Brand for a {@link Workspace} that `createAgent` built with no caller
110
127
  * options, so {@link buildAgents} may rebuild it with startup-provisioned
111
- * `extraSkillPaths` (a caller-supplied workspace is never touched).
128
+ * `extraSkillMounts` (a caller-supplied workspace is never touched).
112
129
  */
113
130
  const defaultWorkspaces = new WeakSet();
114
131
  /** Brand `workspace` as the auto-created default. */
@@ -184,6 +201,16 @@ export const DEFAULT_TOOL_WORKFLOW_INSTRUCTIONS = [
184
201
  "When the active model supports it, call multiple tools in the same turn when their inputs are independent, including multiple calls to the same tool.",
185
202
  "Keep calls sequential when a later input depends on an earlier result or when calls mutate the same resource.",
186
203
  ].join("\n");
204
+ /** Hybrid routing guidance appended after Mastra's generated Code Mode contract. */
205
+ export const CODE_MODE_ROUTING_INSTRUCTIONS = [
206
+ "Tool routing:",
207
+ "The Code Mode contract above explains how to use execute_typescript when selected; it does not require using Code Mode for every tool call.",
208
+ "Call a directly exposed tool directly when one ordinary call is sufficient.",
209
+ "Call independent tools directly in parallel when their results do not require code-side transformation.",
210
+ "Keep dependent calls as direct sequential tool calls when code-side transformation is unnecessary.",
211
+ "Use execute_typescript when the user explicitly requests Code Mode or when code is useful for loops, filtering, joins, random selection, aggregation, arithmetic, dynamic fan-out, or keeping substantial intermediate results out of model context.",
212
+ "Do not wrap a single ordinary tool call in execute_typescript.",
213
+ ].join("\n");
187
214
  /**
188
215
  * Style guardrails appended to every agent's `instructions` to curb
189
216
  * common LLM-isms (em dashes, emojis, sycophantic openers, excessive
@@ -240,11 +267,86 @@ function appendDefaultInstructions(instructions, style) {
240
267
  * Compose static or request-context-aware instructions with shared workflow
241
268
  * and style guidance while preserving Mastra's native generic inference.
242
269
  */
243
- function composeInstructions(agentInstructions, style) {
244
- if (typeof agentInstructions !== "function") {
245
- return appendDefaultInstructions(agentInstructions, style);
270
+ function composeInstructions(agentInstructions, style, resolveCodeMode) {
271
+ const append = (instructions, codeModeInstructions) => {
272
+ const composed = appendDefaultInstructions(instructions, style);
273
+ return codeModeInstructions
274
+ ? appendInstructionBlock(composed, `${codeModeInstructions}\n\n${CODE_MODE_ROUTING_INSTRUCTIONS}`)
275
+ : composed;
276
+ };
277
+ if (typeof agentInstructions !== "function" && !resolveCodeMode) {
278
+ return append(agentInstructions);
246
279
  }
247
- return (async (args) => appendDefaultInstructions(await agentInstructions(args), style));
280
+ return (async (args) => {
281
+ const [instructions, codeMode] = await Promise.all([
282
+ typeof agentInstructions === "function" ? agentInstructions(args) : agentInstructions,
283
+ resolveCodeMode?.(args),
284
+ ]);
285
+ return append(instructions, codeMode?.instructions);
286
+ });
287
+ }
288
+ /** Append one system instruction block while preserving Mastra's accepted shapes. */
289
+ function appendInstructionBlock(instructions, block) {
290
+ if (typeof instructions === "string")
291
+ return `${instructions.trimEnd()}\n\n${block}`;
292
+ if (Array.isArray(instructions)) {
293
+ if (instructions.every((instruction) => typeof instruction === "string")) {
294
+ return [...instructions, block];
295
+ }
296
+ return [...instructions, { role: "system", content: block }];
297
+ }
298
+ return [instructions, { role: "system", content: block }];
299
+ }
300
+ /** Resolve one native Code Mode transport during plugin startup. */
301
+ function codeModeTransport() {
302
+ resolvedCodeModeTransport ??= (async () => {
303
+ if (!supportsIsolatedVmTransport()) {
304
+ codeModeLogger.info("transport selected", { provider: "quickjs" });
305
+ return new QuickJsCodeModeTransport();
306
+ }
307
+ try {
308
+ const { IsolatedVmCodeModeTransport } = await import("@mastra/isolated-vm");
309
+ const transport = new IsolatedVmCodeModeTransport();
310
+ codeModeLogger.info("transport selected", { provider: "isolated-vm" });
311
+ return transport;
312
+ }
313
+ catch (caught) {
314
+ codeModeLogger.warn("isolated-vm unavailable; using QuickJS", {
315
+ error: errorUtils.errorMessage(caught),
316
+ });
317
+ return new QuickJsCodeModeTransport();
318
+ }
319
+ })();
320
+ return resolvedCodeModeTransport;
321
+ }
322
+ /** Build request-scoped native Code Mode over all executable context tools. */
323
+ async function buildCodeMode(config, tools, workspace, requestContext) {
324
+ if (config.codeMode === false)
325
+ return undefined;
326
+ const workspaceTools = workspace
327
+ ? await createWorkspaceTools(workspace, { requestContext, workspace })
328
+ : {};
329
+ const contextTools = { ...tools, ...workspaceTools };
330
+ const executableTools = Object.fromEntries(Object.entries(contextTools).filter(([, tool]) => typeof tool === "object" &&
331
+ tool !== null &&
332
+ "execute" in tool &&
333
+ typeof tool.execute === "function"));
334
+ if (Object.keys(executableTools).length === 0)
335
+ return undefined;
336
+ const options = typeof config.codeMode === "object" ? config.codeMode : {};
337
+ const codeMode = createCodeMode({ tools: executableTools, ...options }, await codeModeTransport());
338
+ if (!("mastra_workspace_read_file" in workspaceTools))
339
+ return codeMode;
340
+ return {
341
+ ...codeMode,
342
+ instructions: `${codeMode.instructions}\n\nWorkspace file content note:\nText returned by external_mastra_workspace_read_file starts with one metadata line containing the path and size. Exclude that first line before calculating content character counts, hashes, or other content-only values.`,
343
+ };
344
+ }
345
+ /** Resolve Code Mode lazily so workspace and dynamic tool policy follow each request. */
346
+ function codeModeResolver(config, tools, workspace) {
347
+ if (config.codeMode === false)
348
+ return undefined;
349
+ return ({ requestContext }) => buildCodeMode(config, tools, workspace, requestContext);
248
350
  }
249
351
  /**
250
352
  * Generated description for an agent whose definition omits one. Kept
@@ -269,7 +371,7 @@ function defaultAgentDescription(name) {
269
371
  * resolved registry; this is a wiring bug, not a runtime condition.
270
372
  */
271
373
  export async function buildAgents(opts) {
272
- const { config, context, memoryBuilder, log, extraSkillPaths } = opts;
374
+ const { config, context, memoryBuilder, log, extraSkillMounts } = opts;
273
375
  const definitions = resolveDefinitions(config);
274
376
  const ids = Object.keys(definitions);
275
377
  const defaultAgentId = config.defaultAgent ?? ids[0] ?? FALLBACK_AGENT_ID;
@@ -278,8 +380,8 @@ export async function buildAgents(opts) {
278
380
  // `render_data` for inline visualizations and `summarize` for
279
381
  // offloading text condensing to the fast / small chat tier. The
280
382
  // user can shadow either by including a same-named tool in their own
281
- // `config.tools` or per-agent `tools`. Order in {@link resolveTools}
282
- // is `system -> user-ambient -> per-agent`, last write wins.
383
+ // `config.tools` or per-agent `tools`. Merge order is
384
+ // `system -> user-ambient -> per-agent`, last write wins.
283
385
  const systemTools = {
284
386
  render_data: buildRenderDataTool(config),
285
387
  summarize: buildSummarizeTool(config),
@@ -300,16 +402,19 @@ export async function buildAgents(opts) {
300
402
  const defaultModels = {};
301
403
  const approvalGatedByAgent = [];
302
404
  for (const [id, def] of Object.entries(definitions)) {
303
- const tools = await resolveTools(def.tools, plugins, ambientTools);
405
+ const userTools = await resolveUserTools(def.tools, plugins);
406
+ const tools = { ...ambientTools, ...userTools };
304
407
  let workspace = resolveAgentWorkspace(def.workspace);
305
408
  if ((def.workspace === undefined && !workspace) ||
306
- ((extraSkillPaths?.length ||
409
+ ((extraSkillMounts?.length ||
307
410
  config.sandbox !== undefined ||
411
+ config.workspaceFallbackToTmp !== undefined ||
308
412
  config.workspaceTools !== undefined ||
309
413
  context !== undefined) &&
310
414
  isDefaultWorkspace(workspace))) {
311
415
  workspace = databricksWorkspace({
312
- extraSkillPaths,
416
+ extraSkillMounts,
417
+ fallbackToTmp: config.workspaceFallbackToTmp,
313
418
  ...(config.workspaceTools !== undefined ? { tools: config.workspaceTools } : {}),
314
419
  pluginContext: context,
315
420
  sandbox: config.sandbox === true ? "databricks" : config.sandbox,
@@ -323,6 +428,7 @@ export async function buildAgents(opts) {
323
428
  if (gated.length > 0)
324
429
  approvalGatedByAgent.push({ agentId: id, toolIds: gated });
325
430
  const memory = memoryBuilder?.forAgent(id, def);
431
+ const resolveCodeMode = codeModeResolver(config, tools, workspace);
326
432
  const agent = new Agent({
327
433
  id,
328
434
  name: def.name ?? id,
@@ -331,17 +437,22 @@ export async function buildAgents(opts) {
331
437
  // metadata. Fall back to a generated one when the definition
332
438
  // omits it.
333
439
  description: def.description?.trim() || defaultAgentDescription(def.name ?? id),
334
- instructions: composeInstructions(def.instructions, style),
440
+ instructions: composeInstructions(def.instructions, style, resolveCodeMode),
335
441
  ...(def.requestContextSchema ? { requestContextSchema: def.requestContextSchema } : {}),
336
442
  model: resolveModel(config, def.model),
337
- defaultOptions: {
443
+ defaultOptions: ({ requestContext }) => withRequestMemoryScope({
338
444
  maxSteps: config.agentMaxSteps ?? DEFAULT_AGENT_MAX_STEPS,
339
445
  providerOptions: RESPONSES_PROVIDER_OPTIONS,
340
446
  ...(def.requireToolApproval !== undefined
341
447
  ? { requireToolApproval: def.requireToolApproval }
342
448
  : {}),
343
- },
344
- tools,
449
+ }, memory ? requestContext : undefined),
450
+ tools: resolveCodeMode
451
+ ? async (args) => {
452
+ const codeMode = await resolveCodeMode(args);
453
+ return codeMode ? { ...tools, [codeMode.tool.id]: codeMode.tool } : tools;
454
+ }
455
+ : tools,
345
456
  ...(memory ? { memory } : {}),
346
457
  ...(workspace ? { workspace } : {}),
347
458
  inputProcessors: [...inputProcessors, ...workspaceSkillInputProcessors(workspace, config)],
@@ -363,7 +474,7 @@ export async function buildAgents(opts) {
363
474
  id,
364
475
  name: def.name ?? id,
365
476
  defaultModel: defaultModel.kind === "configured" ? defaultModel.model : `<${defaultModel.kind}>`,
366
- tools: Object.keys(tools),
477
+ tools: [...Object.keys(tools), ...(resolveCodeMode ? ["<dynamic-code-mode>"] : [])],
367
478
  });
368
479
  }
369
480
  if (!agents[defaultAgentId]) {
@@ -567,16 +678,14 @@ function resolveModel(config, override) {
567
678
  return effective;
568
679
  }
569
680
  /**
570
- * Resolve a definition's `tools` field to a flat `MastraTools` record,
571
- * merging in plugin-level ambient tools (per-agent tools win on key
572
- * collision). Callback errors propagate verbatim so the original stack
573
- * survives - the caller already knows which agent was registering.
681
+ * Resolve only the tools explicitly supplied by one agent definition.
682
+ * Callback errors propagate verbatim so the original stack survives - the
683
+ * caller already knows which agent was registering.
574
684
  */
575
- async function resolveTools(defTools, plugins, ambientTools) {
685
+ async function resolveUserTools(defTools, plugins) {
576
686
  if (!defTools)
577
- return { ...ambientTools };
578
- const resolved = typeof defTools === "function" ? await defTools(plugins) : defTools;
579
- return { ...ambientTools, ...resolved };
687
+ return {};
688
+ return typeof defTools === "function" ? defTools(plugins) : defTools;
580
689
  }
581
690
  function resolveAgentWorkspace(workspace) {
582
691
  if (!workspace)
@@ -740,4 +849,4 @@ function toolkitEntryToMastraTool(entry, plugin) {
740
849
  },
741
850
  });
742
851
  }
743
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVF4RCxPQUFPLEVBQWtCLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxVQUFVLEVBQU8sTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBT2pHLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUvRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJaEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUUzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSw4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QUFFLENBQUM7Z0JBQ3pELEdBQUcsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDL0MsR0FBRyxDQUFDLE1BQU0sSUFBSSxVQUFVO29CQUN0QixDQUFDLENBQUM7d0JBQ0UsYUFBYSxFQUFFLEtBQUssRUFBRSxLQUFjLEVBQUUsRUFBRTs0QkFDdEMsTUFBTSxNQUFNLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUNwRCxNQUFNLE1BQU07aUNBQ1QsTUFBTSxDQUFDO2dDQUNOLElBQUksRUFBRSx1QkFBdUI7Z0NBQzdCLElBQUksRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFOzZCQUNwQyxDQUFDO2lDQUNELEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDNUIsQ0FBQztxQkFDRjtvQkFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ1IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFnZW50IHJlZ2lzdHJhdGlvbiBmb3IgdGhlIE1hc3RyYSBBcHBLaXQgcGx1Z2luLlxuICpcbiAqIE1pcnJvcnMgdGhlIHNoYXBlIG9mIHRoZSBBcHBLaXQgYGFnZW50c2AgcGx1Z2luIChgY29uZmlnLmFnZW50c2AgbWFwXG4gKiBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9ufSwgZHVhbC1mb3JtIGB0b29sc2AgYWNjZXB0aW5nIGEgcGxhaW5cbiAqIHJlY29yZCBvciBhIGAocGx1Z2lucykgPT4gdG9vbHNgIGNhbGxiYWNrKS4gUmVzb2x2ZXMgZWFjaCBkZWZpbml0aW9uXG4gKiBpbnRvIGEgTWFzdHJhIGBBZ2VudGAgaW5zdGFuY2UgZHVyaW5nIHBsdWdpbiBzZXR1cDsgdXNlci1zdXBwbGllZFxuICogdG9vbCBjYWxsYmFja3MgYXJlIGludm9rZWQgZXhhY3RseSBvbmNlIHdpdGggYSB0eXBlZFxuICoge0BsaW5rIE1hc3RyYVBsdWdpbnN9IG1hcCBidWlsdCBmcm9tIHJlZ2lzdGVyZWQgc2libGluZyBwbHVnaW5zLlxuICpcbiAqIFdoZW4gbm8gYWdlbnRzIGFyZSByZWdpc3RlcmVkIHRoZSBwbHVnaW4gZmFsbHMgYmFjayB0byBhIHNpbmdsZVxuICogYnVpbHQtaW4gYW5hbHlzdCBzbyB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZ1xuICogc3RyZWFtYWJsZSBhZ2VudCBmb3IgZGVtb3MuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHtcbiAgQWdlbnRUb29sRGVmaW5pdGlvbixcbiAgUGx1Z2luVG9vbGtpdFByb3ZpZGVyLFxuICBUb29sa2l0RW50cnksXG4gIFRvb2xraXRPcHRpb25zIGFzIEFwcEtpdFRvb2xraXRPcHRpb25zLFxuICBUb29sUHJvdmlkZXIsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuaW1wb3J0IHsgcGx1Z2luUmVnaXN0cnksIHRvb2xraXRFbnRyaWVzIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQvdG9vbC1wcm92aWRlclwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IFRPT0xfUFJPR1JFU1NfUEFSVF9UWVBFLCBUb29sUHJvZ3Jlc3NFdmVudFNjaGVtYSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmEvd2lyZVwiO1xuaW1wb3J0IHR5cGUge1xuICBBZ2VudENvbmZpZyxcbiAgQWdlbnRFeGVjdXRpb25PcHRpb25zLFxuICBBZ2VudEluc3RydWN0aW9ucyxcbiAgVG9vbHNJbnB1dCxcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgeyBjcmVhdGVFdmVudGVkQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50L2R1cmFibGVcIjtcbmltcG9ydCB7IFNraWxsU2VhcmNoUHJvY2Vzc29yIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9wcm9jZXNzb3JzXCI7XG5pbXBvcnQgdHlwZSB7IE91dHB1dFByb2Nlc3NvciB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcHJvY2Vzc29yc1wiO1xuaW1wb3J0IHsgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IFRvb2wgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5pbXBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2UgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHR5cGUgeyBQZ1ZlY3RvckNvbmZpZywgUG9zdGdyZXNTdG9yZUNvbmZpZyB9IGZyb20gXCJAbWFzdHJhL3BnXCI7XG5cbmltcG9ydCB7IGJ1aWxkUmVuZGVyRGF0YVRvb2wgfSBmcm9tIFwiLi9jaGFydC50c1wiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIsIHJlc29sdmVHZW5pZVNwYWNlcyB9IGZyb20gXCIuL2dlbmllLnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9tZW1vcnkudHNcIjtcbmltcG9ydCB7IGJ1aWxkTW9kZWwsIFJFU1BPTlNFU19QUk9WSURFUl9PUFRJT05TIH0gZnJvbSBcIi4vbW9kZWwudHNcIjtcbmltcG9ydCB7IHN0cmlwU3RhbGVDaGFydHNQcm9jZXNzb3IgfSBmcm9tIFwiLi9wcm9jZXNzb3JzLnRzXCI7XG5pbXBvcnQgeyBNQVNUUkFfUkVTT0xWRURfTU9ERUxfS0VZIH0gZnJvbSBcIi4vc2VydmluZy50c1wiO1xuaW1wb3J0IHsgVFlQT0dSQVBIWV9SVUxFIH0gZnJvbSBcIi4vc3R5bGUudHNcIjtcbmltcG9ydCB7IGJ1aWxkU3VtbWFyaXplVG9vbCB9IGZyb20gXCIuL3N1bW1hcml6ZS50c1wiO1xuaW1wb3J0IHsgYmluZERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LCBkYXRhYnJpY2tzV29ya3NwYWNlIH0gZnJvbSBcIi4vd29ya3NwYWNlcy50c1wiO1xuXG4vKipcbiAqIFRvb2wgcmVjb3JkIGFjY2VwdGVkIGJ5IGV2ZXJ5IE1hc3RyYSBgQWdlbnQudG9vbHNgIGZpZWxkIGFuZCBieSB0aGVcbiAqIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2sgb24ge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbn0uXG4gKlxuICogQWxpYXMgb2YgTWFzdHJhJ3MgYFRvb2xzSW5wdXRgLCBzbyBpdCBhbHJlYWR5IGFjY2VwdHM6XG4gKlxuICogLSBNYXN0cmEgdG9vbHMgYnVpbHQgd2l0aCB7QGxpbmsgY3JlYXRlVG9vbH0gKG9yIGBuZXcgVG9vbCguLi4pYClcbiAqIC0gTWFzdHJhIHRvb2xzIGJ1aWx0IHdpdGggdGhlIEFwcEtpdC1zaGFwZWQge0BsaW5rIHRvb2x9IHdyYXBwZXJcbiAqICAgYmVsb3dcbiAqIC0gVmVyY2VsIEFJIFNESyB0b29scyAoYHRvb2woeyAuLi4gfSlgIGZyb20gYGFpYClcbiAqIC0gUHJvdmlkZXItZGVmaW5lZCB0b29scyAoZS5nLiBgb3BlbmFpLnRvb2xzLndlYlNlYXJjaCguLi4pYClcbiAqXG4gKiBFeGlzdGluZyB0b29sIGxpYnJhcmllcyBkcm9wIGluIGFzLWlzIC0gbm90aGluZyBpbiB0aGlzIHBhY2thZ2VcbiAqIGZvcmNlcyBhIHJlYnVpbGQuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVRvb2xzID0gVG9vbHNJbnB1dDtcblxuLyoqIFJlLWV4cG9ydCBvZiBNYXN0cmEncyBuYXRpdmUgYGNyZWF0ZVRvb2xgIGZvciBmdWxsLWZlYXR1cmUgYWNjZXNzLiAqL1xuZXhwb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcblxuLyoqXG4gKiBBcHBLaXQtc2hhcGVkIHRvb2wgZmFjdG9yeS4gTGV0cyB1c2VycyBtaXgtYW5kLW1hdGNoIHRvb2xzIGFjcm9zc1xuICogQXBwS2l0J3MgYGFnZW50c2AgcGx1Z2luIGFuZCBgbWFzdHJhYCB3aXRoIGEgc2luZ2xlIGltcG9ydDpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgdG9vbCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqIGltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG4gKlxuICogZ2V0X3dlYXRoZXI6IHRvb2woe1xuICogICBkZXNjcmlwdGlvbjogXCJXZWF0aGVyXCIsXG4gKiAgIHNjaGVtYTogei5vYmplY3QoeyBjaXR5OiB6LnN0cmluZygpIH0pLFxuICogICBleGVjdXRlOiBhc3luYyAoeyBjaXR5IH0pID0+IGBTdW5ueSBpbiAke2NpdHl9YCxcbiAqIH0pLFxuICogYGBgXG4gKlxuICogTWFwcyBvbnRvIE1hc3RyYSdzIGBjcmVhdGVUb29sYDpcbiAqXG4gKiAtIGBkZXNjcmlwdGlvbmAgLT4gYGRlc2NyaXB0aW9uYCAocmVxdWlyZWQpXG4gKiAtIGBzY2hlbWFgIC0+IGBpbnB1dFNjaGVtYWAgKG9wdGlvbmFsKVxuICogLSBgZXhlY3V0ZShpbnB1dClgIC0+IGBleGVjdXRlKGlucHV0LCBjdHgpYCAtIE1hc3RyYSBhbHJlYWR5IGNhbGxzXG4gKiAgIHRoZSBmaXJzdCBhcmcgd2l0aCB0aGUgcGFyc2VkIGlucHV0cywgc28gdGhlIGJvZHkgc2hhcGUgaXNcbiAqICAgaWRlbnRpY2FsLiBUaGUgTWFzdHJhIGBjb250ZXh0YCBhcmcgaXMgZm9yd2FyZGVkIGFzIHRoZSBzZWNvbmRcbiAqICAgcGFyYW1ldGVyIHdoZW4gdGhlIGNhbGxlciBkZWNsYXJlcyBpdC5cbiAqIC0gYGlkYDogb3B0aW9uYWwuIERlZmF1bHRzIHRvIGEgc3RhYmxlIGlkZW50aWZpZXIgZGVyaXZlZCBmcm9tXG4gKiAgIGBkZXNjcmlwdGlvbmAgKHNsdWdpZmllZCwgd2l0aCBhIHNob3J0IGhhc2ggc3VmZml4IGZvclxuICogICB1bmlxdWVuZXNzKS4gUGFzcyBhbiBleHBsaWNpdCBgaWRgIHdoZW4geW91IG5lZWQgYSBzdGFibGUgc3RyaW5nXG4gKiAgIGZvciB0cmFjaW5nIG9yIE1DUCBleHBvc3VyZS5cbiAqXG4gKiBSZWFjaCBmb3Ige0BsaW5rIGNyZWF0ZVRvb2x9IHdoZW4geW91IG5lZWQgTWFzdHJhLW9ubHkgZmllbGRzXG4gKiAoYG91dHB1dFNjaGVtYWAsIGBzdXNwZW5kU2NoZW1hYCwgYHJlcXVpcmVBcHByb3ZhbGAsIGBtY3BgLCBldGMuKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvb2wob3B0czogQXBwS2l0VG9vbE9wdGlvbnMpOiBUb29sIHtcbiAgY29uc3QgaWQgPSBvcHRzLmlkID8/IGRlcml2ZVRvb2xJZChvcHRzLmRlc2NyaXB0aW9uKTtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkLFxuICAgIGRlc2NyaXB0aW9uOiBvcHRzLmRlc2NyaXB0aW9uLFxuICAgIC4uLihvcHRzLnNjaGVtYSA/IHsgaW5wdXRTY2hlbWE6IG9wdHMuc2NoZW1hIGFzIG5ldmVyIH0gOiB7fSksXG4gICAgZXhlY3V0ZTogb3B0cy5leGVjdXRlIGFzIG5ldmVyLFxuICB9KTtcbn1cblxuLyoqXG4gKiBJbnB1dCBzaGFwZSBmb3IgdGhlIEFwcEtpdC1zdHlsZSB7QGxpbmsgdG9vbH0gZmFjdG9yeS4gQSB0cmltbWVkXG4gKiBzdWJzZXQgb2YgTWFzdHJhJ3MgYGNyZWF0ZVRvb2xgIG9wdGlvbnMgdGhhdCBtaXJyb3JzIHRoZVxuICogYEBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhYCBgdG9vbCh7IGRlc2NyaXB0aW9uLCBzY2hlbWEsIGV4ZWN1dGUgfSlgXG4gKiBzaWduYXR1cmUuXG4gKlxuICogR2VuZXJpY3MgYXJlIGludGVudGlvbmFsbHkgYWJzZW50IC0gaW5mZXJlbmNlIGZsb3dzIHRocm91Z2ggdGhlXG4gKiBjYWxsZXIncyBgc2NoZW1hYCAodHlwaWNhbGx5IGEgWm9kIG9iamVjdCksIGFuZCB0aGUgYGV4ZWN1dGVgIGJvZHlcbiAqIGRlc3RydWN0dXJlcyBuYXR1cmFsbHkgZnJvbSB0aGF0LiBSZWFjaCBmb3Ige0BsaW5rIGNyZWF0ZVRvb2x9IHdoZW5cbiAqIHlvdSBuZWVkIHRoZSBmdWxseS10eXBlZCBpbnB1dC9vdXRwdXQgc2NoZW1hcyB3aXJlZCBleHBsaWNpdGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcEtpdFRvb2xPcHRpb25zIHtcbiAgLyoqIE9wdGlvbmFsIHN0YWJsZSBpZGVudGlmaWVyOyBhdXRvLWRlcml2ZWQgZnJvbSBgZGVzY3JpcHRpb25gIHdoZW4gb21pdHRlZC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzaG93biB0byB0aGUgbW9kZWwuIFJlcXVpcmVkLiAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgaW5wdXQgc2NoZW1hIChhbnkgU3RhbmRhcmQgU2NoZW1hIGluc3RhbmNlLCBlLmcuIFpvZCkuXG4gICAqIE1hcHMgdG8gTWFzdHJhJ3MgYGlucHV0U2NoZW1hYDsgcGFzc2VkIHRocm91Z2ggdG8gdGhlIG1vZGVsXG4gICAqIHZlcmJhdGltLlxuICAgKi9cbiAgc2NoZW1hPzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEV4ZWN1dGUgYm9keS4gRmlyc3QgYXJnIGlzIHRoZSBwYXJzZWQgaW5wdXQgKHR5cGVkIG9mZiBgc2NoZW1hYFxuICAgKiB3aGVuIHN1cHBsaWVkKSwgc2Vjb25kIGFyZyBpcyB0aGUgZnVsbCBNYXN0cmEgZXhlY3V0aW9uIGNvbnRleHRcbiAgICogKHJlcXVlc3QgY29udGV4dCwgYWJvcnQgc2lnbmFsLCBtYXN0cmEgaW5zdGFuY2UpIGlmIHlvdSBuZWVkIGl0LlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZXhlY3V0ZTogKGlucHV0OiBhbnksIGNvbnRleHQ/OiB1bmtub3duKSA9PiB1bmtub3duO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgZGV0ZXJtaW5pc3RpYyBNYXN0cmEgdG9vbCBpZCBmcm9tIGEgZGVzY3JpcHRpb24uXG4gKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIHN0cmluZy50b1VuaXF1ZVNsdWd9OiBzbHVnICsgYWx3YXlzLW9uXG4gKiA2LWNoYXIgRk5WLTFhIGJhc2UtMzIgc3VmZml4IHNvIHR3byB0b29scyB3aXRoIHRoZSBzYW1lIGxlYWRpbmdcbiAqIHdvcmRzIGRvbid0IGNvbGxpZGUgaW4gdHJhY2VzLiBTdGFibGUgYWNyb3NzIHJ1bnMuXG4gKi9cbmZ1bmN0aW9uIGRlcml2ZVRvb2xJZChkZXNjcmlwdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRvVW5pcXVlU2x1ZyhkZXNjcmlwdGlvbiwgeyBmYWxsYmFja1ByZWZpeDogXCJ0b29sXCIgfSk7XG59XG5cbi8qKlxuICogSWRlbnRpdHkgaGVscGVyIHRoYXQgYnJhbmRzIGEgZGVmaW5pdGlvbiBhcyBhIE1hc3RyYSBhZ2VudC4gTWlycm9yc1xuICogQXBwS2l0J3MgYGNyZWF0ZUFnZW50KGRlZilgIHNvIHRoZSByZWdpc3RyYXRpb24gc2hhcGUgbWF0Y2hlczpcbiAqXG4gKiBgYGB0c1xuICogY29uc3Qgc3VwcG9ydCA9IGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiLFxuICogICBtb2RlbDogXCJkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02XCIsXG4gKiAgIHRvb2xzKHBsdWdpbnMpIHsgcmV0dXJuIHsgLi4uIH07IH0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEFkZHMgdGhlIHBhY2thZ2UncyBkZWZhdWx0IHdvcmtzcGFjZSB3aGVuIHRoZSBkZWZpbml0aW9uIG9taXRzIG9uZS4gVGhhdFxuICogd29ya3NwYWNlIGNhcnJpZXMgRGF0YWJyaWNrcyBza2lsbCBtb3VudHMgYW5kIE1vbnR5IGNvbW1hbmQgZXhlY3V0aW9uLiBBblxuICogZXhwbGljaXQgd29ya3NwYWNlIHJlbWFpbnMgdGhlIGNhbGxlcidzIGNvbXBsZXRlIG92ZXJyaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWdlbnQ8XG4gIFRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93biA9IHVua25vd24sXG4gIFREZWZpbml0aW9uIGV4dGVuZHMgTWFzdHJhQWdlbnREZWZpbml0aW9uPFRSZXF1ZXN0Q29udGV4dD4gPVxuICAgIE1hc3RyYUFnZW50RGVmaW5pdGlvbjxUUmVxdWVzdENvbnRleHQ+LFxuPihkZWY6IFREZWZpbml0aW9uKTogVERlZmluaXRpb24ge1xuICBpZiAoZGVmLndvcmtzcGFjZSkgcmV0dXJuIHsgLi4uZGVmIH07XG4gIGNvbnN0IHdvcmtzcGFjZSA9IGRhdGFicmlja3NXb3Jrc3BhY2UoKTtcbiAgbWFya0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlKTtcbiAgcmV0dXJuIHsgLi4uZGVmLCB3b3Jrc3BhY2UgfTtcbn1cblxuLyoqXG4gKiBCcmFuZCBmb3IgYSB7QGxpbmsgV29ya3NwYWNlfSB0aGF0IGBjcmVhdGVBZ2VudGAgYnVpbHQgd2l0aCBubyBjYWxsZXJcbiAqIG9wdGlvbnMsIHNvIHtAbGluayBidWlsZEFnZW50c30gbWF5IHJlYnVpbGQgaXQgd2l0aCBzdGFydHVwLXByb3Zpc2lvbmVkXG4gKiBgZXh0cmFTa2lsbFBhdGhzYCAoYSBjYWxsZXItc3VwcGxpZWQgd29ya3NwYWNlIGlzIG5ldmVyIHRvdWNoZWQpLlxuICovXG5jb25zdCBkZWZhdWx0V29ya3NwYWNlcyA9IG5ldyBXZWFrU2V0PFdvcmtzcGFjZT4oKTtcblxuLyoqIEJyYW5kIGB3b3Jrc3BhY2VgIGFzIHRoZSBhdXRvLWNyZWF0ZWQgZGVmYXVsdC4gKi9cbmZ1bmN0aW9uIG1hcmtEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZTogV29ya3NwYWNlKTogdm9pZCB7XG4gIGRlZmF1bHRXb3Jrc3BhY2VzLmFkZCh3b3Jrc3BhY2UpO1xufVxuXG4vKiogV2hldGhlciBgd29ya3NwYWNlYCB3YXMgYXV0by1jcmVhdGVkIGJ5IHtAbGluayBjcmVhdGVBZ2VudH0uICovXG5mdW5jdGlvbiBpc0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlOiBXb3Jrc3BhY2UgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHdvcmtzcGFjZSAhPT0gdW5kZWZpbmVkICYmIGRlZmF1bHRXb3Jrc3BhY2VzLmhhcyh3b3Jrc3BhY2UpO1xufVxuXG4vKipcbiAqIEZpbHRlciAvIHJlbmFtZSBvcHRpb25zIGFjY2VwdGVkIGJ5IGV2ZXJ5IHBsdWdpbidzIGAudG9vbGtpdCgpYFxuICogbWV0aG9kLCBkaXJlY3RseSBzb3VyY2VkIGZyb20gQXBwS2l0J3MgcHVibGljIGJldGEgY29udHJhY3QuXG4gKi9cbmV4cG9ydCB0eXBlIFRvb2xraXRPcHRpb25zID0gQXBwS2l0VG9vbGtpdE9wdGlvbnM7XG5cbi8qKlxuICogVG9vbGtpdCBwcm92aWRlciBzaGFwZSBldmVyeSBlbnRyeSBpbiB0aGUge0BsaW5rIE1hc3RyYVBsdWdpbnN9IG1hcFxuICogZXhwb3Nlcy4gSWRlbnRpY2FsIHRvIEFwcEtpdCdzIGBQbHVnaW5Ub29sa2l0UHJvdmlkZXJgIC0gYW55IEFwcEtpdFxuICogcGx1Z2luIHRoYXQgaW1wbGVtZW50cyB0aGUgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYGdldEFnZW50VG9vbHNgICsgYGV4ZWN1dGVBZ2VudFRvb2xgICsgYHRvb2xraXRgKSBpcyByZWFjaGFibGVcbiAqIHRocm91Z2ggdGhpcyBzdXJmYWNlIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHtcbiAgLyoqXG4gICAqIFJldHVybnMgYSBNYXN0cmEtc2hhcGVkIHRvb2xzIHJlY29yZCBhZGFwdGVkIGZyb20gdGhlIHBsdWdpbidzXG4gICAqIGFnZW50IHRvb2xzLiBFYWNoIHRvb2wgZGlzcGF0Y2hlcyBiYWNrIHRocm91Z2ggdGhlIHBsdWdpbidzXG4gICAqIGBleGVjdXRlQWdlbnRUb29sYCBzbyBPQk8gYXV0aCBhbmQgdGVsZW1ldHJ5IHNwYW5zIHN0YXkgaW50YWN0LlxuICAgKi9cbiAgdG9vbGtpdChvcHRzPzogVG9vbGtpdE9wdGlvbnMpOiBNYXN0cmFUb29scyB8IFByb21pc2U8TWFzdHJhVG9vbHM+O1xufVxuXG4vKipcbiAqIFBsdWdpbiBtYXAgaGFuZGVkIHRvIHRoZSBmdW5jdGlvbiBmb3JtIG9mXG4gKiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9uLnRvb2xzfS4gTWlycm9ycyBBcHBLaXQncyBgUGx1Z2luc2BcbiAqIHR5cGUgZXhhY3RseTogYSBzdHJpbmcta2V5ZWQgcmVjb3JkIHdoZXJlIGV2ZXJ5IHZhbHVlIGV4cG9zZXNcbiAqIGAudG9vbGtpdChvcHRzKWAuXG4gKlxuICogSW1wbGVtZW50ZWQgYXMgYSBydW50aW1lIFByb3h5IHRoYXQgYXV0by1kaXNjb3ZlcnMgYW55IHJlZ2lzdGVyZWRcbiAqIEFwcEtpdCBwbHVnaW4gaW1wbGVtZW50aW5nIHRoZSBzdGFuZGFyZCBgVG9vbFByb3ZpZGVyYCBpbnRlcmZhY2VcbiAqIChgYW5hbHl0aWNzYCwgYGZpbGVzYCwgYGxha2ViYXNlYCwgYGdlbmllYCwgcGx1cyBhbnkgdGhpcmQtcGFydHlcbiAqIHBsdWdpbiB0aGF0IGRvZXMgdGhlIHNhbWUpLiBVbmtub3duIG5hbWVzIHJlc29sdmUgdG8gYHVuZGVmaW5lZGBcbiAqIGF0IHJ1bnRpbWUsIHNvIGd1YXJkIHdpdGggYD8uYCBhbmQgYD8/IHt9YCB3aGVuIHNwcmVhZGluZyBmcm9tIGFcbiAqIHBsdWdpbiB0aGF0IG1heSBub3QgYmUgcmVnaXN0ZXJlZCBpbiBldmVyeSBlbnZpcm9ubWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiLFxuICogICBhc3luYyB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgcmV0dXJuIHtcbiAqICAgICAgIC4uLihhd2FpdCBwbHVnaW5zLmFuYWx5dGljcy50b29sa2l0KCkpLFxuICogICAgICAgLi4uKGF3YWl0IHBsdWdpbnMuZmlsZXMudG9vbGtpdCh7IG9ubHk6IFtcInVwbG9hZHMucmVhZFwiXSB9KSksXG4gKiAgICAgICBnZXRfd2VhdGhlcjogdG9vbCh7XG4gKiAgICAgICAgIGRlc2NyaXB0aW9uOiBcIldlYXRoZXJcIixcbiAqICAgICAgICAgc2NoZW1hOiB6Lm9iamVjdCh7IGNpdHk6IHouc3RyaW5nKCkgfSksXG4gKiAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IGNpdHkgfSkgPT4gYFN1bm55IGluICR7Y2l0eX1gLFxuICogICAgICAgfSksXG4gKiAgICAgfTtcbiAqICAgfSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVBsdWdpbnMgPSBSZWNvcmQ8c3RyaW5nLCBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXI+O1xuXG4vKiogRnVuY3Rpb24gZm9ybSBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9uLnRvb2xzfS4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVRvb2xzRm4gPSAocGx1Z2luczogTWFzdHJhUGx1Z2lucykgPT4gTWFzdHJhVG9vbHMgfCBQcm9taXNlPE1hc3RyYVRvb2xzPjtcblxuLyoqIEZ1bmN0aW9uIGZvcm0gb2Yge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi53b3Jrc3BhY2V9OyBgdW5kZWZpbmVkYCBkaXNhYmxlcyBpdCBmb3IgdGhpcyBhZ2VudC4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYUFnZW50V29ya3NwYWNlUmVzb2x2ZXIgPSAoKSA9PiBXb3Jrc3BhY2UgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBjb2RlLWRlZmluZWQgTWFzdHJhIGFnZW50LiBNaXJyb3JzIHRoZSBzaGFwZSBBcHBLaXQncyBgYWdlbnRzYFxuICogcGx1Z2luIHVzZXMgZm9yIGBBZ2VudERlZmluaXRpb25gLiBUaGUgcmVnaXN0cnkga2V5IHVuZGVyXG4gKiBgY29uZmlnLmFnZW50c2AgaXMgdGhlIGBhZ2VudElkYCB0aGUgY2xpZW50IHN0cmVhbXMgYWdhaW5zdDsgYG5hbWVgXG4gKiBpcyBwdXJlbHkgaW5mb3JtYXRpb25hbCAoZGVmYXVsdHMgdG8gdGhlIGtleSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhQWdlbnREZWZpbml0aW9uPFxuICBUUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd24gPSB1bmtub3duLFxuPiB7XG4gIC8qKiBEaXNwbGF5IG5hbWUgdXNlZCBhcyBgQWdlbnQubmFtZWAuIERlZmF1bHRzIHRvIHRoZSByZWdpc3RyeSBrZXkuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBsb25nLWZvcm0gZGVzY3JpcHRpb247IHN1cmZhY2VkIGFzIGBBZ2VudC5kZXNjcmlwdGlvbmAuICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogU3RhdGljIG9yIHJlcXVlc3QtY29udGV4dC1hd2FyZSBzeXN0ZW0gaW5zdHJ1Y3Rpb25zLiAqL1xuICBpbnN0cnVjdGlvbnM6IEFnZW50Q29uZmlnPHN0cmluZywgVG9vbHNJbnB1dCwgdW5kZWZpbmVkLCBUUmVxdWVzdENvbnRleHQ+W1wiaW5zdHJ1Y3Rpb25zXCJdO1xuICAvKiogTmF0aXZlIE1hc3RyYSBzY2hlbWEgdGhhdCB2YWxpZGF0ZXMgYW5kIHR5cGVzIGFwcGxpY2F0aW9uIHJlcXVlc3QgY29udGV4dC4gKi9cbiAgcmVxdWVzdENvbnRleHRTY2hlbWE/OiBBZ2VudENvbmZpZzxcbiAgICBzdHJpbmcsXG4gICAgVG9vbHNJbnB1dCxcbiAgICB1bmRlZmluZWQsXG4gICAgVFJlcXVlc3RDb250ZXh0XG4gID5bXCJyZXF1ZXN0Q29udGV4dFNjaGVtYVwiXTtcbiAgLyoqXG4gICAqIE1hc3RyYS1uYXRpdmUgcGVyLWNhbGwgYXBwcm92YWwgZ2F0ZSBmb3IgdGhpcyBhZ2VudCdzIHRvb2xzLiBTdXBwb3J0cyBhblxuICAgKiBhc3luYyBDbGFzc2lmaWVyLWJhY2tlZCBmdW5jdGlvbjsgdG9vbC1sZXZlbCBhcHByb3ZhbCByZW1haW5zIGF1dGhvcml0YXRpdmUuXG4gICAqL1xuICByZXF1aXJlVG9vbEFwcHJvdmFsPzogQWdlbnRFeGVjdXRpb25PcHRpb25zW1wicmVxdWlyZVRvb2xBcHByb3ZhbFwiXTtcbiAgLyoqXG4gICAqIFBlci1hZ2VudCBtb2RlbCBvdmVycmlkZS5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IGZhbGxzIGJhY2sgdG8gdGhlIHdvcmtzcGFjZVxuICAgKiAgIGAvc2VydmluZy1lbmRwb2ludHNgIHJlc29sdmVyIHRoYXQge0BsaW5rIGJ1aWxkTW9kZWx9IGNvbmZpZ3VyZXNcbiAgICogICBmcm9tIHRoZSBwZXItcmVxdWVzdCBgV29ya3NwYWNlQ2xpZW50YC5cbiAgICogLSBgc3RyaW5nYDogc2hvcnRoYW5kIGZvciBcInVzZSB0aGUgZGVmYXVsdCByZXNvbHZlciBidXQgc3dhcCB0aGVcbiAgICogICBgbW9kZWxJZGBcIiAoZS5nLiBgXCJkYXRhYnJpY2tzLW1ldGEtbGxhbWEtMy0zLTcwYi1pbnN0cnVjdFwiYCkuXG4gICAqIC0gQW55IG90aGVyIE1hc3RyYSBgRHluYW1pY0FyZ3VtZW50PE1hc3RyYU1vZGVsQ29uZmlnPmA6IHBhc3NlZFxuICAgKiAgIHN0cmFpZ2h0IHRocm91Z2ggdG8gYEFnZW50Lm1vZGVsYC4gVXNlIHRoaXMgd2hlbiB5b3UgbmVlZCBmdWxsXG4gICAqICAgY29udHJvbCBvdmVyIGF1dGggb3IgcHJvdmlkZXJJZC5cbiAgICovXG4gIG1vZGVsPzogQWdlbnRDb25maWc8c3RyaW5nLCBUb29sc0lucHV0LCB1bmRlZmluZWQsIFRSZXF1ZXN0Q29udGV4dD5bXCJtb2RlbFwiXSB8IHN0cmluZztcbiAgLyoqXG4gICAqIFBlci1hZ2VudCB0b29sIHJlY29yZC4gRWl0aGVyIGEgcGxhaW4gbWFwIG9yIGEgY2FsbGJhY2sgdGhhdFxuICAgKiByZWNlaXZlcyB0aGUgdHlwZWQge0BsaW5rIE1hc3RyYVBsdWdpbnN9IHNpYmxpbmctcGx1Z2luIGluZGV4IGFuZFxuICAgKiByZXR1cm5zIGEgbWFwLiBUaGUgY2FsbGJhY2sgcnVucyBleGFjdGx5IG9uY2UgYXQgYWdlbnQgc2V0dXA7IHRoZVxuICAgKiByZXN1bHQgaXMgY2FjaGVkIGZvciB0aGUgYWdlbnQncyBsaWZldGltZS5cbiAgICovXG4gIHRvb2xzPzogTWFzdHJhVG9vbHMgfCBNYXN0cmFUb29sc0ZuO1xuICAvKipcbiAgICogUGVyLWFnZW50IHNlbWFudGljIHJlY2FsbCAoUGdWZWN0b3IpIG92ZXJyaWRlLiBDYXNjYWRlcyBmcm9tXG4gICAqIGBjb25maWcubWVtb3J5YDsgdGhlIGFnZW50IHZhbHVlIHdpbnMgd2hlbiBzZXQuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBpbmhlcml0IGBjb25maWcubWVtb3J5YC4gV2hlbiB0aGF0J3NcbiAgICogICBlbmFibGVkLCB0aGUgYWdlbnQgKipzaGFyZXMgdGhlIHBsdWdpbi1sZXZlbCBzaW5nbGV0b24gYFBnVmVjdG9yYFxuICAgKiAgIGluc3RhbmNlKiogKGNyb3NzLWFnZW50IHNlbWFudGljIHJlY2FsbCBhY3Jvc3MgdGhlIHNhbWUgaW5kZXgpLlxuICAgKiAtIGBmYWxzZWA6IGRpc2FibGUgc2VtYW50aWMgcmVjYWxsIGZvciB0aGlzIGFnZW50IG9ubHkuXG4gICAqIC0gYHRydWVgOiBlbmFibGUgdXNpbmcgdGhlIHNoYXJlZCBzaW5nbGV0b24gKHNhbWUgYXMgZGVmYXVsdCB3aGVuXG4gICAqICAgcGx1Z2luIG1lbW9yeSBpcyBlbmFibGVkOyB1c2VmdWwgdG8gb3B0IGluIHdoZW4gcGx1Z2luIGRpc2FibGVkKS5cbiAgICogLSB7QGxpbmsgTWFzdHJhTWVtb3J5Q29uZmlnfSBvYmplY3Q6IGRlZGljYXRlZCBgUGdWZWN0b3JgIGZvciB0aGlzXG4gICAqICAgYWdlbnQgKHByaXZhdGUgcmVjYWxsIGluZGV4KS4gQnlwYXNzZXMgdGhlIHNoYXJlZCBzaW5nbGV0b24uXG4gICAqL1xuICBtZW1vcnk/OiBib29sZWFuIHwgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGU7XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgdGhyZWFkL21lc3NhZ2Ugc3RvcmFnZSAoYFBvc3RncmVzU3RvcmVgKSBvdmVycmlkZS5cbiAgICogQ2FzY2FkZXMgZnJvbSBgY29uZmlnLnN0b3JhZ2VgOyB0aGUgYWdlbnQgdmFsdWUgd2lucyB3aGVuIHNldC5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IGluaGVyaXQgYGNvbmZpZy5zdG9yYWdlYC4gV2hlbiB0aGF0J3NcbiAgICogICBlbmFibGVkLCB0aGUgYWdlbnQgZ2V0cyBpdHMgKipvd24gcGVyLWFnZW50IGBQb3N0Z3Jlc1N0b3JlYCoqXG4gICAqICAga2V5ZWQgYnkge0BsaW5rIGFnZW50U3RvcmFnZVNjaGVtYU5hbWV9IHNvIHRocmVhZHMgYW5kXG4gICAqICAgbWVzc2FnZXMgc3RheSBpc29sYXRlZCBiZXR3ZWVuIGFnZW50cyBpbiB0aGUgc2FtZSBkYXRhYmFzZS5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIHN0b3JhZ2UgZm9yIHRoaXMgYWdlbnQgb25seSAocHVyZWx5IGluLW1lbW9yeSkuXG4gICAqIC0gYHRydWVgOiBlbmFibGUgd2l0aCB0aGUgcGVyLWFnZW50IGRlZmF1bHQgc2NoZW1hLlxuICAgKiAtIHtAbGluayBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGV9IG9iamVjdDogZGVkaWNhdGVkXG4gICAqICAgYFBvc3RncmVzU3RvcmVgIGNvbmZpZyAoY3VzdG9tIHNjaGVtYSwgY29ubmVjdGlvbiwgZXRjLikuXG4gICAqL1xuICBzdG9yYWdlPzogYm9vbGVhbiB8IE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZTtcbiAgLyoqXG4gICAqIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfSBmb3IgdGhpcyBhZ2VudCAoZmlsZXN5c3RlbSwgc2FuZGJveCwgb3Igb3RoZXJcbiAgICogcHJvdmlkZXJzKS4gQXNzaXN0YW50IHNraWxscyBmcm9tIERhdGFicmlja3Mgd29ya3NwYWNlIHBhdGhzIGFyZSB3aXJlZFxuICAgKiB2aWEge0BsaW5rIGRhdGFicmlja3NXb3Jrc3BhY2V9LlxuICAgKi9cbiAgd29ya3NwYWNlPzogV29ya3NwYWNlIHwgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlcjtcbn1cblxuLyoqIFR5cGUtZXJhc2VkIHJlZ2lzdHJ5IG1lbWJlcjsgZWFjaCBkZWZpbml0aW9uIHJldGFpbnMgdHlwaW5nIGF0IGBjcmVhdGVBZ2VudGAuICovXG5leHBvcnQgdHlwZSBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24gPSBNYXN0cmFBZ2VudERlZmluaXRpb248YW55PjtcblxuLyoqXG4gKiBEaXN0cmlidXRpdmUgYE9taXRgIHNvIHVuaW9ucyBpbiBgUG9zdGdyZXNTdG9yZUNvbmZpZ2AgL1xuICogYFBnVmVjdG9yQ29uZmlnYCBrZWVwIHRoZWlyIGRpc2NyaW1pbmFudHMgYWZ0ZXIgdGhlIG92ZXJyaWRlIHR5cGVzXG4gKiBzdHJpcCBgaWRgLiBUaGUgYnVpbHQtaW4gYE9taXRgIGNvbGxhcHNlcyB1bmlvbnMgdG8gb25lIHNoYXBlIHdpdGhcbiAqIGNvbW1vbiBmaWVsZHMgb25seSwgd2hpY2ggbG9zZXMgdGhlIGNvbm5lY3Rpb24tc3R5bGUgZGlzY3JpbWluYW50cy5cbiAqL1xudHlwZSBEaXN0cmlidXRpdmVPbWl0PFQsIEsgZXh0ZW5kcyBrZXlvZiBuZXZlcj4gPSBUIGV4dGVuZHMgdW5rbm93biA/IE9taXQ8VCwgSz4gOiBuZXZlcjtcblxuLyoqXG4gKiBgUG9zdGdyZXNTdG9yZUNvbmZpZ2AgbWludXMgYGlkYCAtIHBlci1hZ2VudCBvdmVycmlkZXMgYWNjZXB0IGFueVxuICogTWFzdHJhLXN1cHBvcnRlZCBzdG9yYWdlIHNoYXBlLiBgaWRgIGlzIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5XG4gKiBmcm9tIHRoZSBhZ2VudCByZWdpc3RyeSBrZXkgc28gdHJhY2VzIHN0YXkgc3RhYmxlLlxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGUgPSBEaXN0cmlidXRpdmVPbWl0PFBvc3RncmVzU3RvcmVDb25maWcsIFwiaWRcIj4gJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBgUGdWZWN0b3JDb25maWdgIG1pbnVzIGBpZGAgLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFjY2VwdCBhbnlcbiAqIE1hc3RyYS1zdXBwb3J0ZWQgdmVjdG9yIHNoYXBlLiBgaWRgIGlzIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5XG4gKiBmcm9tIHRoZSBhZ2VudCByZWdpc3RyeSBrZXkuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlID0gRGlzdHJpYnV0aXZlT21pdDxQZ1ZlY3RvckNvbmZpZywgXCJpZFwiPiAmIHtcbiAgaWQ/OiBzdHJpbmc7XG59O1xuXG4vKiogSG93IGFuIGFnZW50J3MgdW5waW5uZWQgbW9kZWwgaXMgcmVzb2x2ZWQuICovXG5leHBvcnQgdHlwZSBBZ2VudERlZmF1bHRNb2RlbCA9XG4gIHsga2luZDogXCJhdXRvXCIgfSB8IHsga2luZDogXCJjb25maWd1cmVkXCI7IG1vZGVsOiBzdHJpbmcgfSB8IHsga2luZDogXCJkeW5hbWljXCIgfTtcblxuLyoqIE91dHB1dCBvZiB7QGxpbmsgYnVpbGRBZ2VudHN9OiByZXNvbHZlZCBhZ2VudHMgcGx1cyB0aGUgZGVmYXVsdCBpZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbHRBZ2VudHMge1xuICBhZ2VudHM6IFJlY29yZDxzdHJpbmcsIEFnZW50PjtcbiAgZGVmYXVsdEFnZW50SWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIERlZmF1bHQgbW9kZWwgaW50ZW50IHBlciBhZ2VudCBpZC4gQW4gdW5jb25maWd1cmVkIGFnZW50IGlzIGBcImF1dG9cImAgYW5kXG4gICAqIHJlc29sdmVzIHRoZSBoaWdoZXN0LXJhbmtlZCBsaXZlIGVuZHBvaW50OyBhIHN0cmluZyBpcyBgXCJjb25maWd1cmVkXCJgOyBhXG4gICAqIGN1c3RvbSBmdW5jdGlvbiBpcyBgXCJkeW5hbWljXCJgLiBDb25zdW1lZCBieSB0aGUgcGx1Z2luJ3NcbiAgICogYEdFVCAvZGVmYXVsdC1tb2RlbGAgcm91dGUuXG4gICAqL1xuICBkZWZhdWx0TW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudERlZmF1bHRNb2RlbD47XG4gIC8qKlxuICAgKiBBbWJpZW50IHRvb2xzIHNoYXJlZCBhY3Jvc3MgZXZlcnkgYWdlbnQgKHRoZSBidWlsdC1pbiBzeXN0ZW0gdG9vbHNcbiAgICogc3ByZWFkIHdpdGggYGNvbmZpZy50b29sc2ApLiBTdXJmYWNlZCBzbyB0aGUgb3B0aW9uYWwgTUNQIHNlcnZlclxuICAgKiBjYW4gcmUtZXhwb3NlIHRoZW0gd2hlbiB7QGxpbmsgTWFzdHJhTWNwQ29uZmlnLnRvb2xzfSBpcyBlbmFibGVkLlxuICAgKi9cbiAgYW1iaWVudFRvb2xzOiBNYXN0cmFUb29scztcbn1cblxuLyoqIEZhbGxiYWNrIGFnZW50IGlkIHVzZWQgd2hlbiBgY29uZmlnLmFnZW50c2AgaXMgb21pdHRlZCBlbnRpcmVseS4gKi9cbmV4cG9ydCBjb25zdCBGQUxMQkFDS19BR0VOVF9JRCA9IFwiZGVmYXVsdFwiO1xuXG4vKipcbiAqIERlZmF1bHQgcGVyLXR1cm4gc3RlcCBjZWlsaW5nIGFwcGxpZWQgdG8gZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudFxuICogd2hlbiB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLmFnZW50TWF4U3RlcHN9IGlzIHVuc2V0LiBTaXplZCB0b1xuICogZml0IGEgZGVjb21wb3NlZCBHZW5pZSB0dXJuIChncm91bmRpbmcgKyBzZXZlcmFsIGBhc2tfZ2VuaWVgXG4gKiBjYWxscyArIGBwcmVwYXJlX2NoYXJ0YCBwZXIgZGF0YXNldCArIHRoZSBmaW5hbC10ZXh0IHJlcGx5KSB3aXRoXG4gKiBoZWFkcm9vbSBmb3IgdGhlIG1vZGVsIHRvIGNoYWluIGEgY291cGxlIG9mIGZvbGxvdy11cHMgYmVmb3JlXG4gKiBhbnN3ZXJpbmcgLSB3ZWxsIGFib3ZlIE1hc3RyYSdzIG93biBgYWdlbnQuZ2VuZXJhdGVgIGRlZmF1bHQgb2ZcbiAqIDUsIHdoaWNoIHdvdWxkIGN1dCBtdWx0aS1zdGVwIG9yY2hlc3RyYXRpb24gb2ZmIG1pZC1sb29wLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMgPSAyNTtcblxuY29uc3QgRVZFTlRFRF9DT05TVFJVQ1RPUl9NT0RFTCA9IHtcbiAgc3BlY2lmaWNhdGlvblZlcnNpb246IFwidjNcIixcbiAgcHJvdmlkZXI6IFwiZGJ4LXRvb2xzXCIsXG4gIG1vZGVsSWQ6IFwiZGVmZXJyZWRcIixcbiAgc3VwcG9ydGVkVXJsczoge30sXG4gIGFzeW5jIGRvR2VuZXJhdGUoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGVmZXJyZWQgZXZlbnRlZCBjb25zdHJ1Y3RvciBtb2RlbCBtdXN0IG5vdCBleGVjdXRlXCIpO1xuICB9LFxuICBhc3luYyBkb1N0cmVhbSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWZlcnJlZCBldmVudGVkIGNvbnN0cnVjdG9yIG1vZGVsIG11c3Qgbm90IGV4ZWN1dGVcIik7XG4gIH0sXG59IGFzIG5ldmVyO1xuXG4vKipcbiAqIGBFdmVudGVkQWdlbnRgIGRlbGVnYXRlcyBtb2RlbCByZXNvbHV0aW9uIHRvIHRoZSB3cmFwcGVkIGFnZW50IGF0IGV4ZWN1dGlvblxuICogdGltZSwgYnV0IGl0cyBjb25zdHJ1Y3RvciBhbHNvIHByb2JlcyBhbiB1bnR5cGVkIGBfX21vZGVsYCBzbG90IGFuZCBvdGhlcndpc2VcbiAqIGNhbGxzIGBnZXRNb2RlbCgpYCB3aXRoIGFuIGVtcHR5IHJlcXVlc3QgY29udGV4dC4gVGVtcG9yYXJpbHkgZmlsbGluZyB0aGF0XG4gKiBwcm9iZSBhdm9pZHMgYW4gZWFnZXIgc2VydmljZS1wcmluY2lwYWwgbG9va3VwIHdoaWxlIHByZXNlcnZpbmcgdGhlIHdyYXBwZWRcbiAqIGFnZW50J3MgcmVxdWVzdC1zY29wZWQgbW9kZWwgcmVzb2x2ZXIgZm9yIHJlYWwgdHVybnMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhY2tncm91bmRBZ2VudChhZ2VudDogQWdlbnQsIG1heFN0ZXBzOiBudW1iZXIpOiBBZ2VudCB7XG4gIGNvbnN0IG1vZGVsU2xvdCA9IFwiX19tb2RlbFwiO1xuICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhZ2VudCwgbW9kZWxTbG90KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFnZW50LCBtb2RlbFNsb3QsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IEVWRU5URURfQ09OU1RSVUNUT1JfTU9ERUwsXG4gIH0pO1xuICB0cnkge1xuICAgIHJldHVybiBjcmVhdGVFdmVudGVkQWdlbnQoeyBhZ2VudCwgbWF4U3RlcHMgfSkgYXMgdW5rbm93biBhcyBBZ2VudDtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoZGVzY3JpcHRvcikgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFnZW50LCBtb2RlbFNsb3QsIGRlc2NyaXB0b3IpO1xuICAgIGVsc2UgZGVsZXRlIChhZ2VudCBhcyBBZ2VudCAmIHsgX19tb2RlbD86IHVua25vd24gfSkuX19tb2RlbDtcbiAgfVxufVxuXG5jb25zdCBGQUxMQkFDS19BR0VOVF9JTlNUUlVDVElPTlMgPSBgWW91IGFyZSBhIGRhdGEgYW5hbHlzdC4gVGhlIHVzZXIgd2lsbCBhc2sgcXVlc3Rpb25zIGFib3V0XG5idXNpbmVzcyBtZXRyaWNzIGFuZCBtYXkgc2hhcmUgcGVyc29uYWwgcHJlZmVyZW5jZXMgeW91IHNob3VsZCByZW1lbWJlciBhY3Jvc3MgdHVybnMuXG5cblJ1bGVzOlxuXG4xLiBRdW90ZSBudW1iZXJzIGV4YWN0bHkuIE5ldmVyIGludmVudCBkYXRhLlxuMi4gV2hlbiB0aGUgdXNlciBzdGF0ZXMgYSBwcmVmZXJlbmNlIG9yIGR1cmFibGUgZmFjdCBhYm91dCB0aGVtc2VsdmVzXG4gICAoXCJJJ20gaW4gRVUgc28gdXNlIEVVUlwiLCBcImFsd2F5cyBzaG93IG1lIHRoZSBTUUxcIiksIGFja25vd2xlZGdlIHRoYXRcbiAgIHlvdSB3aWxsIHJlbWVtYmVyIGl0LlxuMy4gSWYgeW91IGRvbid0IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGFuc3dlciwgYXNrIGEgY2xhcmlmeWluZ1xuICAgcXVlc3Rpb24gaW5zdGVhZCBvZiBndWVzc2luZy5gO1xuXG4vKiogVG9vbC1jYWxsIGd1aWRhbmNlIGFwcGVuZGVkIHRvIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnQuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9UT09MX1dPUktGTE9XX0lOU1RSVUNUSU9OUyA9IFtcbiAgXCJUb29sIHdvcmtmbG93OlwiLFxuICBcIldoZW4gdGhlIGFjdGl2ZSBtb2RlbCBzdXBwb3J0cyBpdCwgY2FsbCBtdWx0aXBsZSB0b29scyBpbiB0aGUgc2FtZSB0dXJuIHdoZW4gdGhlaXIgaW5wdXRzIGFyZSBpbmRlcGVuZGVudCwgaW5jbHVkaW5nIG11bHRpcGxlIGNhbGxzIHRvIHRoZSBzYW1lIHRvb2wuXCIsXG4gIFwiS2VlcCBjYWxscyBzZXF1ZW50aWFsIHdoZW4gYSBsYXRlciBpbnB1dCBkZXBlbmRzIG9uIGFuIGVhcmxpZXIgcmVzdWx0IG9yIHdoZW4gY2FsbHMgbXV0YXRlIHRoZSBzYW1lIHJlc291cmNlLlwiLFxuXS5qb2luKFwiXFxuXCIpO1xuXG4vKipcbiAqIFN0eWxlIGd1YXJkcmFpbHMgYXBwZW5kZWQgdG8gZXZlcnkgYWdlbnQncyBgaW5zdHJ1Y3Rpb25zYCB0byBjdXJiXG4gKiBjb21tb24gTExNLWlzbXMgKGVtIGRhc2hlcywgZW1vamlzLCBzeWNvcGhhbnRpYyBvcGVuZXJzLCBleGNlc3NpdmVcbiAqIGhlZGdpbmcsIHRocm93YXdheSBjbG9zZXJzKS4gQXBwZW5kZWQgcmF0aGVyIHRoYW4gcHJlcGVuZGVkIHNvIHRoZVxuICogYWdlbnQncyByb2xlL2NvbnRleHQgY29tZXMgZmlyc3Q7IHRoZSBtb2RlbCdzIHJlY2VuY3kgYmlhcyB0aGVuXG4gKiBoZWxwcyB0aGUgc3R5bGUgcnVsZXMgZG9taW5hdGUgdGhlIHJlc3BvbnNlIHN1cmZhY2UuXG4gKlxuICogT3ZlcnJpZGUgZ2xvYmFsbHkgdmlhIHtAbGluayBNYXN0cmFQbHVnaW5Db25maWcuc3R5bGVJbnN0cnVjdGlvbnN9XG4gKiAocGFzcyBgZmFsc2VgIHRvIGRpc2FibGUgZW50aXJlbHksIG9yIGEgc3RyaW5nIHRvIHJlcGxhY2UpLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9TVFlMRV9JTlNUUlVDVElPTlMgPSBbXG4gIFwiT3V0cHV0IHN0eWxlOlwiLFxuICBcIlwiLFxuICBcIlVzZSBtYXJrZG93biBmb3JtYXR0aW5nLCBpbmNsdWRpbmcgaGVhZGluZ3MsIGxpc3RzLCBhbmQgY29kZSBibG9ja3MuXCIsXG4gIFwiQXZvaWQgbGlzdHMgYW5kIGhlYWRlcnMgZm9yIHNob3J0IHJlcGxpZXMuXCIsXG4gIFwiUGxhaW4gcHJvc2UuXCIsXG4gIFRZUE9HUkFQSFlfUlVMRSxcbiAgXCJTa2lwIG9wZW5lcnMgbGlrZSAnR3JlYXQgcXVlc3Rpb24nLCAnQWJzb2x1dGVseScsIGFuZCAnSSdkIGJlIGhhcHB5IHRvIGhlbHAnLlwiLFxuICBcIlNraXAgY2xvc2VycyBsaWtlICdMZXQgbWUga25vdyBpZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zJy5cIixcbiAgXCJTa2lwIHNlbGYtZGlzY2xhaW1lcnMgbGlrZSAnSSBzaG91bGQgbWVudGlvbicgYW5kICdJdCdzIGltcG9ydGFudCB0byBub3RlJy5cIixcbiAgXCJBbnN3ZXIgZGlyZWN0bHkuXCIsXG4gIFwiRG8gbm90IGluY2x1ZGUgYSBwcmVhbWJsZSBiZWZvcmUgdGhlIGFjdHVhbCBhbnN3ZXIuXCIsXG4gIFwiVXNlIGxpc3RzIGFuZCBoZWFkZXJzIG9ubHkgd2hlbiB0aGV5IGNsYXJpZnkgYSBtdWx0aS1wYXJ0IGFuc3dlci5cIixcbl0uam9pbihcIlxcblwiKTtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBzdHlsZSBibG9jayB0byBhcHBlbmQgdG8gZXZlcnkgYWdlbnQncyBpbnN0cnVjdGlvbnMuXG4gKiBSZXR1cm5zIGBudWxsYCB3aGVuIHRoZSBjYWxsZXIgb3B0ZWQgb3V0IChgc3R5bGVJbnN0cnVjdGlvbnM6IGZhbHNlYCkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTdHlsZUluc3RydWN0aW9ucyhjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IHN0cmluZyB8IG51bGwge1xuICBpZiAoY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zID09PSBmYWxzZSkgcmV0dXJuIG51bGw7XG4gIGlmICh0eXBlb2YgY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGNvbmZpZy5zdHlsZUluc3RydWN0aW9ucztcbiAgfVxuXG4gIHJldHVybiBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUztcbn1cblxuLyoqIEFwcGVuZCBzaGFyZWQgd29ya2Zsb3cgYW5kIHN0eWxlIGJsb2NrcyB3aXRob3V0IG5hcnJvd2luZyBNYXN0cmEncyBpbnN0cnVjdGlvbiBzaGFwZXMuICovXG5mdW5jdGlvbiBhcHBlbmREZWZhdWx0SW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IEFnZW50SW5zdHJ1Y3Rpb25zLFxuICBzdHlsZTogc3RyaW5nIHwgbnVsbCxcbik6IEFnZW50SW5zdHJ1Y3Rpb25zIHtcbiAgY29uc3Qgc3VmZml4ID0gc3R5bGVcbiAgICA/IGAke0RFRkFVTFRfVE9PTF9XT1JLRkxPV19JTlNUUlVDVElPTlN9XFxuXFxuJHtzdHlsZX1gXG4gICAgOiBERUZBVUxUX1RPT0xfV09SS0ZMT1dfSU5TVFJVQ1RJT05TO1xuICBpZiAodHlwZW9mIGluc3RydWN0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBgJHtpbnN0cnVjdGlvbnMudHJpbUVuZCgpfVxcblxcbiR7c3VmZml4fWA7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5zdHJ1Y3Rpb25zKSkge1xuICAgIGlmIChpbnN0cnVjdGlvbnMuZXZlcnkoKGluc3RydWN0aW9uKSA9PiB0eXBlb2YgaW5zdHJ1Y3Rpb24gPT09IFwic3RyaW5nXCIpKSB7XG4gICAgICByZXR1cm4gWy4uLmluc3RydWN0aW9ucywgc3VmZml4XSBhcyBBZ2VudEluc3RydWN0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIFsuLi5pbnN0cnVjdGlvbnMsIHsgcm9sZTogXCJzeXN0ZW1cIiwgY29udGVudDogc3VmZml4IH1dIGFzIEFnZW50SW5zdHJ1Y3Rpb25zO1xuICB9XG4gIHJldHVybiBbaW5zdHJ1Y3Rpb25zLCB7IHJvbGU6IFwic3lzdGVtXCIsIGNvbnRlbnQ6IHN1ZmZpeCB9XSBhcyBBZ2VudEluc3RydWN0aW9ucztcbn1cblxuLyoqXG4gKiBDb21wb3NlIHN0YXRpYyBvciByZXF1ZXN0LWNvbnRleHQtYXdhcmUgaW5zdHJ1Y3Rpb25zIHdpdGggc2hhcmVkIHdvcmtmbG93XG4gKiBhbmQgc3R5bGUgZ3VpZGFuY2Ugd2hpbGUgcHJlc2VydmluZyBNYXN0cmEncyBuYXRpdmUgZ2VuZXJpYyBpbmZlcmVuY2UuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VJbnN0cnVjdGlvbnM8VFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duPihcbiAgYWdlbnRJbnN0cnVjdGlvbnM6IEFnZW50Q29uZmlnPHN0cmluZywgVG9vbHNJbnB1dCwgdW5kZWZpbmVkLCBUUmVxdWVzdENvbnRleHQ+W1wiaW5zdHJ1Y3Rpb25zXCJdLFxuICBzdHlsZTogc3RyaW5nIHwgbnVsbCxcbik6IEFnZW50Q29uZmlnPHN0cmluZywgVG9vbHNJbnB1dCwgdW5kZWZpbmVkLCBUUmVxdWVzdENvbnRleHQ+W1wiaW5zdHJ1Y3Rpb25zXCJdIHtcbiAgaWYgKHR5cGVvZiBhZ2VudEluc3RydWN0aW9ucyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGFwcGVuZERlZmF1bHRJbnN0cnVjdGlvbnMoYWdlbnRJbnN0cnVjdGlvbnMsIHN0eWxlKSBhcyBBZ2VudENvbmZpZzxcbiAgICAgIHN0cmluZyxcbiAgICAgIFRvb2xzSW5wdXQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBUUmVxdWVzdENvbnRleHRcbiAgICA+W1wiaW5zdHJ1Y3Rpb25zXCJdO1xuICB9XG4gIHJldHVybiAoYXN5bmMgKGFyZ3MpID0+XG4gICAgYXBwZW5kRGVmYXVsdEluc3RydWN0aW9ucyhhd2FpdCBhZ2VudEluc3RydWN0aW9ucyhhcmdzKSwgc3R5bGUpKSBhcyBBZ2VudENvbmZpZzxcbiAgICBzdHJpbmcsXG4gICAgVG9vbHNJbnB1dCxcbiAgICB1bmRlZmluZWQsXG4gICAgVFJlcXVlc3RDb250ZXh0XG4gID5bXCJpbnN0cnVjdGlvbnNcIl07XG59XG5cbi8qKlxuICogR2VuZXJhdGVkIGRlc2NyaXB0aW9uIGZvciBhbiBhZ2VudCB3aG9zZSBkZWZpbml0aW9uIG9taXRzIG9uZS4gS2VwdFxuICogZ2VuZXJpYyAodGhlIGFnZW50J3Mgb3duIG5hbWUgaXMgdGhlIG9ubHkgcmVsaWFibGUgc2lnbmFsIGF0IGJ1aWxkXG4gKiB0aW1lKSBzbyBpdCByZWFkcyBzZW5zaWJseSBhcyB0aGUgYGFza188aWQ+YCBNQ1AgdG9vbCdzIGRlc2NyaXB0aW9uXG4gKiBhbmQgaW4gYWdlbnQgbWV0YWRhdGEuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRBZ2VudERlc2NyaXB0aW9uKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgQ29udmVyc2F0aW9uYWwgQUkgYWdlbnQgXCIke25hbWV9XCIuYDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGV2ZXJ5IGVudHJ5IGluIGBjb25maWcuYWdlbnRzYCBpbnRvIGEgTWFzdHJhIGBBZ2VudGBcbiAqIGluc3RhbmNlLiBXaGVuIGBjb25maWcuYWdlbnRzYCBpcyBvbWl0dGVkIHRoZSBwbHVnaW4gcmVnaXN0ZXJzIGFcbiAqIHNpbmdsZSBidWlsdC1pbiBgZGVmYXVsdGAgYW5hbHlzdCBzbyB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGxcbiAqIHlpZWxkcyBhIHdvcmtpbmcgYWdlbnQuXG4gKlxuICogUGVyLWFnZW50IHRvb2wgY2FsbGJhY2tzIGFyZSBpbnZva2VkIG9uY2Ugd2l0aCBhIHR5cGVkXG4gKiB7QGxpbmsgTWFzdHJhUGx1Z2luc30gaW5kZXggYnVpbHQgZnJvbSByZWdpc3RlcmVkIHNpYmxpbmcgcGx1Z2luc1xuICogKGN1cnJlbnRseSBgZ2VuaWVgOyBleHRlbmQgYE1hc3RyYVBsdWdpbnNgIHRvIHN1cmZhY2UgbW9yZSkuXG4gKlxuICogQHRocm93cyB3aGVuIGBjb25maWcuZGVmYXVsdEFnZW50YCBpcyBzZXQgdG8gYW4gaWQgdGhhdCBpc24ndCBpbiB0aGVcbiAqICAgcmVzb2x2ZWQgcmVnaXN0cnk7IHRoaXMgaXMgYSB3aXJpbmcgYnVnLCBub3QgYSBydW50aW1lIGNvbmRpdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQWdlbnRzKG9wdHM6IHtcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWc7XG4gIGNvbnRleHQ6IHBsdWdpblJlZ2lzdHJ5LlBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkO1xuICBtZW1vcnlCdWlsZGVyPzogTWVtb3J5QnVpbGRlcjtcbiAgbG9nOiBsb2cuTG9nZ2VyO1xuICAvKipcbiAgICogTG9jYWwgc2tpbGwgc2NhbiBwYXRocyAocmVtb3RlIHNraWxscyBwcm92aXNpb25lZCB0byBhIHRlbXAgZGlyIGF0XG4gICAqIHN0YXJ0dXApIGZvbGRlZCBpbnRvIGV2ZXJ5IGFnZW50IHRoYXQgdXNlcyB0aGUgYXV0by1jcmVhdGVkIGRlZmF1bHRcbiAgICogd29ya3NwYWNlLlxuICAgKi9cbiAgZXh0cmFTa2lsbFBhdGhzPzogc3RyaW5nW107XG59KTogUHJvbWlzZTxCdWlsdEFnZW50cz4ge1xuICBjb25zdCB7IGNvbmZpZywgY29udGV4dCwgbWVtb3J5QnVpbGRlciwgbG9nLCBleHRyYVNraWxsUGF0aHMgfSA9IG9wdHM7XG4gIGNvbnN0IGRlZmluaXRpb25zID0gcmVzb2x2ZURlZmluaXRpb25zKGNvbmZpZyk7XG4gIGNvbnN0IGlkcyA9IE9iamVjdC5rZXlzKGRlZmluaXRpb25zKTtcbiAgY29uc3QgZGVmYXVsdEFnZW50SWQgPSBjb25maWcuZGVmYXVsdEFnZW50ID8/IGlkc1swXSA/PyBGQUxMQkFDS19BR0VOVF9JRDtcblxuICBjb25zdCBwbHVnaW5zID0gYnVpbGRQbHVnaW5zTWFwKGNvbmZpZywgY29udGV4dCk7XG4gIC8vIFN5c3RlbS1kZWZhdWx0IGFtYmllbnQgdG9vbHMgZXZlcnkgYWdlbnQgZ2V0cyBvdXQgb2YgdGhlIGJveDpcbiAgLy8gYHJlbmRlcl9kYXRhYCBmb3IgaW5saW5lIHZpc3VhbGl6YXRpb25zIGFuZCBgc3VtbWFyaXplYCBmb3JcbiAgLy8gb2ZmbG9hZGluZyB0ZXh0IGNvbmRlbnNpbmcgdG8gdGhlIGZhc3QgLyBzbWFsbCBjaGF0IHRpZXIuIFRoZVxuICAvLyB1c2VyIGNhbiBzaGFkb3cgZWl0aGVyIGJ5IGluY2x1ZGluZyBhIHNhbWUtbmFtZWQgdG9vbCBpbiB0aGVpciBvd25cbiAgLy8gYGNvbmZpZy50b29sc2Agb3IgcGVyLWFnZW50IGB0b29sc2AuIE9yZGVyIGluIHtAbGluayByZXNvbHZlVG9vbHN9XG4gIC8vIGlzIGBzeXN0ZW0gLT4gdXNlci1hbWJpZW50IC0+IHBlci1hZ2VudGAsIGxhc3Qgd3JpdGUgd2lucy5cbiAgY29uc3Qgc3lzdGVtVG9vbHM6IE1hc3RyYVRvb2xzID0ge1xuICAgIHJlbmRlcl9kYXRhOiBidWlsZFJlbmRlckRhdGFUb29sKGNvbmZpZyksXG4gICAgc3VtbWFyaXplOiBidWlsZFN1bW1hcml6ZVRvb2woY29uZmlnKSxcbiAgfTtcbiAgY29uc3QgYW1iaWVudFRvb2xzID0ge1xuICAgIC4uLnN5c3RlbVRvb2xzLFxuICAgIC4uLihjb25maWcudG9vbHMgPz8ge30pLFxuICB9O1xuICBjb25zdCBzdHlsZSA9IHJlc29sdmVTdHlsZUluc3RydWN0aW9ucyhjb25maWcpO1xuICAvLyBEZWZhdWx0LW9uIHByb3RlY3Rpb24gYWdhaW5zdCB0aGUgbW9kZWwgY29weWluZyB0dXJuLXNjb3BlZFxuICAvLyBjaGFydElkcyBmcm9tIHByaW9yIGFzc2lzdGFudCB0b29sIHJlc3VsdHMgaW50byB0aGUgbmV3XG4gIC8vIHR1cm4ncyBgW2NoYXJ0OjxpZD5dYCBtYXJrZXJzLiBPcHQgb3V0IHBlci1wbHVnaW4gdmlhXG4gIC8vIGBjb25maWcuc3RyaXBTdGFsZUNoYXJ0czogZmFsc2VgLlxuICBjb25zdCBpbnB1dFByb2Nlc3NvcnMgPSBbXG4gICAgLi4uKGNvbmZpZy5zdHJpcFN0YWxlQ2hhcnRzID09PSBmYWxzZSA/IFtdIDogW3N0cmlwU3RhbGVDaGFydHNQcm9jZXNzb3JdKSxcbiAgXTtcbiAgY29uc3QgYWdlbnRzOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudD4gPSB7fTtcbiAgY29uc3QgZGVmYXVsdE1vZGVsczogUmVjb3JkPHN0cmluZywgQWdlbnREZWZhdWx0TW9kZWw+ID0ge307XG4gIGNvbnN0IGFwcHJvdmFsR2F0ZWRCeUFnZW50OiBBcnJheTx7IGFnZW50SWQ6IHN0cmluZzsgdG9vbElkczogc3RyaW5nW10gfT4gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpZCwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhkZWZpbml0aW9ucykpIHtcbiAgICBjb25zdCB0b29scyA9IGF3YWl0IHJlc29sdmVUb29scyhkZWYudG9vbHMsIHBsdWdpbnMsIGFtYmllbnRUb29scyk7XG4gICAgbGV0IHdvcmtzcGFjZSA9IHJlc29sdmVBZ2VudFdvcmtzcGFjZShkZWYud29ya3NwYWNlKTtcbiAgICBpZiAoXG4gICAgICAoZGVmLndvcmtzcGFjZSA9PT0gdW5kZWZpbmVkICYmICF3b3Jrc3BhY2UpIHx8XG4gICAgICAoKGV4dHJhU2tpbGxQYXRocz8ubGVuZ3RoIHx8XG4gICAgICAgIGNvbmZpZy5zYW5kYm94ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgY29uZmlnLndvcmtzcGFjZVRvb2xzICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgY29udGV4dCAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICBpc0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlKSlcbiAgICApIHtcbiAgICAgIHdvcmtzcGFjZSA9IGRhdGFicmlja3NXb3Jrc3BhY2Uoe1xuICAgICAgICBleHRyYVNraWxsUGF0aHMsXG4gICAgICAgIC4uLihjb25maWcud29ya3NwYWNlVG9vbHMgIT09IHVuZGVmaW5lZCA/IHsgdG9vbHM6IGNvbmZpZy53b3Jrc3BhY2VUb29scyB9IDoge30pLFxuICAgICAgICBwbHVnaW5Db250ZXh0OiBjb250ZXh0LFxuICAgICAgICBzYW5kYm94OiBjb25maWcuc2FuZGJveCA9PT0gdHJ1ZSA/IFwiZGF0YWJyaWNrc1wiIDogY29uZmlnLnNhbmRib3gsXG4gICAgICB9KTtcbiAgICAgIG1hcmtEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZSk7XG4gICAgfSBlbHNlIGlmICh3b3Jrc3BhY2UpIHtcbiAgICAgIHdvcmtzcGFjZSA9IGJpbmREYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCh3b3Jrc3BhY2UsIGNvbnRleHQpO1xuICAgIH1cbiAgICBjb25zdCBnYXRlZCA9IGFwcHJvdmFsR2F0ZWRUb29sSWRzKHRvb2xzKTtcbiAgICBpZiAoZ2F0ZWQubGVuZ3RoID4gMCkgYXBwcm92YWxHYXRlZEJ5QWdlbnQucHVzaCh7IGFnZW50SWQ6IGlkLCB0b29sSWRzOiBnYXRlZCB9KTtcbiAgICBjb25zdCBtZW1vcnkgPSBtZW1vcnlCdWlsZGVyPy5mb3JBZ2VudChpZCwgZGVmKTtcbiAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudCh7XG4gICAgICBpZCxcbiAgICAgIG5hbWU6IGRlZi5uYW1lID8/IGlkLFxuICAgICAgLy8gQWx3YXlzIGNhcnJ5IGEgbm9uLWVtcHR5IGRlc2NyaXB0aW9uOiBpdCdzIHN1cmZhY2VkIHRvIE1DUFxuICAgICAgLy8gY2xpZW50cyAod2hpY2ggcmVqZWN0IGEgZGVzY3JpcHRpb24tbGVzcyBhZ2VudCkgYW5kIGluIGFnZW50XG4gICAgICAvLyBtZXRhZGF0YS4gRmFsbCBiYWNrIHRvIGEgZ2VuZXJhdGVkIG9uZSB3aGVuIHRoZSBkZWZpbml0aW9uXG4gICAgICAvLyBvbWl0cyBpdC5cbiAgICAgIGRlc2NyaXB0aW9uOiBkZWYuZGVzY3JpcHRpb24/LnRyaW0oKSB8fCBkZWZhdWx0QWdlbnREZXNjcmlwdGlvbihkZWYubmFtZSA/PyBpZCksXG4gICAgICBpbnN0cnVjdGlvbnM6IGNvbXBvc2VJbnN0cnVjdGlvbnMoZGVmLmluc3RydWN0aW9ucywgc3R5bGUpLFxuICAgICAgLi4uKGRlZi5yZXF1ZXN0Q29udGV4dFNjaGVtYSA/IHsgcmVxdWVzdENvbnRleHRTY2hlbWE6IGRlZi5yZXF1ZXN0Q29udGV4dFNjaGVtYSB9IDoge30pLFxuICAgICAgbW9kZWw6IHJlc29sdmVNb2RlbChjb25maWcsIGRlZi5tb2RlbCksXG4gICAgICBkZWZhdWx0T3B0aW9uczoge1xuICAgICAgICBtYXhTdGVwczogY29uZmlnLmFnZW50TWF4U3RlcHMgPz8gREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMsXG4gICAgICAgIHByb3ZpZGVyT3B0aW9uczogUkVTUE9OU0VTX1BST1ZJREVSX09QVElPTlMsXG4gICAgICAgIC4uLihkZWYucmVxdWlyZVRvb2xBcHByb3ZhbCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IHJlcXVpcmVUb29sQXBwcm92YWw6IGRlZi5yZXF1aXJlVG9vbEFwcHJvdmFsIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0sXG4gICAgICB0b29scyxcbiAgICAgIC4uLihtZW1vcnkgPyB7IG1lbW9yeSB9IDoge30pLFxuICAgICAgLi4uKHdvcmtzcGFjZSA/IHsgd29ya3NwYWNlIH0gOiB7fSksXG4gICAgICBpbnB1dFByb2Nlc3NvcnM6IFsuLi5pbnB1dFByb2Nlc3NvcnMsIC4uLndvcmtzcGFjZVNraWxsSW5wdXRQcm9jZXNzb3JzKHdvcmtzcGFjZSwgY29uZmlnKV0sXG4gICAgICBvdXRwdXRQcm9jZXNzb3JzOiBbdG9vbEVycm9yTG9nZ2luZ1Byb2Nlc3Nvcihsb2cpXSxcbiAgICB9KTtcbiAgICBhZ2VudHNbaWRdID1cbiAgICAgIGNvbmZpZy5iYWNrZ3JvdW5kVHVybnMgPT09IGZhbHNlXG4gICAgICAgID8gYWdlbnRcbiAgICAgICAgOiBjcmVhdGVCYWNrZ3JvdW5kQWdlbnQoYWdlbnQsIGNvbmZpZy5hZ2VudE1heFN0ZXBzID8/IERFRkFVTFRfQUdFTlRfTUFYX1NURVBTKTtcbiAgICAvLyBTdXJmYWNlIHRoZSBlZmZlY3RpdmUgZGVmYXVsdCBtb2RlbCBwZXIgYWdlbnQgc28gb3BlcmF0b3JzIGNhblxuICAgIC8vIHNlZSBhdCBhIGdsYW5jZSB3aGljaCBlbmRwb2ludCBlYWNoIGFnZW50IHBvaW50cyBhdCB3aXRob3V0XG4gICAgLy8gaGF2aW5nIHRvIGZpcmUgYSByZXF1ZXN0IGFuZCBpbnNwZWN0IGEgdHJhY2UuIFRoZSB2YWx1ZSBpcyB0aGVcbiAgICAvLyAqc3RhdGljKiBkZWZhdWx0OyBwZXItcmVxdWVzdCBvdmVycmlkZXMgKGhlYWRlciAvIHF1ZXJ5IC9cbiAgICAvLyBib2R5KSBhbmQgdGhlIHdvcmtzcGFjZS1jYXRhbG9ndWUgZnV6enkgbWF0Y2ggc3RpbGwgYXBwbHkgYXRcbiAgICAvLyBjYWxsIHRpbWUuXG4gICAgY29uc3QgZGVmYXVsdE1vZGVsID0gZGVzY3JpYmVBZ2VudERlZmF1bHRNb2RlbChjb25maWcsIGRlZik7XG4gICAgZGVmYXVsdE1vZGVsc1tpZF0gPSBkZWZhdWx0TW9kZWw7XG4gICAgbG9nLmluZm8oXCJhZ2VudCByZWdpc3RlcmVkXCIsIHtcbiAgICAgIGlkLFxuICAgICAgbmFtZTogZGVmLm5hbWUgPz8gaWQsXG4gICAgICBkZWZhdWx0TW9kZWw6XG4gICAgICAgIGRlZmF1bHRNb2RlbC5raW5kID09PSBcImNvbmZpZ3VyZWRcIiA/IGRlZmF1bHRNb2RlbC5tb2RlbCA6IGA8JHtkZWZhdWx0TW9kZWwua2luZH0+YCxcbiAgICAgIHRvb2xzOiBPYmplY3Qua2V5cyh0b29scyksXG4gICAgfSk7XG4gIH1cblxuICBpZiAoIWFnZW50c1tkZWZhdWx0QWdlbnRJZF0pIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIGBtYXN0cmEgZGVmYXVsdEFnZW50IFwiJHtkZWZhdWx0QWdlbnRJZH1cImAsXG4gICAgICBgUmVnaXN0ZXJlZCBhZ2VudHM6ICR7aWRzLmpvaW4oXCIsIFwiKSB8fCBcIm5vbmVcIn0uYCxcbiAgICApO1xuICB9XG5cbiAgYXNzZXJ0QXBwcm92YWxHYXRlZFRvb2xzSGF2ZVN0b3JhZ2UoYXBwcm92YWxHYXRlZEJ5QWdlbnQsIG1lbW9yeUJ1aWxkZXIpO1xuXG4gIGxvZy5pbmZvKFwiYWdlbnRzIHJlYWR5XCIsIHsgaWRzLCBkZWZhdWx0QWdlbnRJZCB9KTtcbiAgcmV0dXJuIHsgYWdlbnRzLCBkZWZhdWx0QWdlbnRJZCwgZGVmYXVsdE1vZGVscywgYW1iaWVudFRvb2xzIH07XG59XG5cbi8qKiBMb2cgZmFpbGVkIHRvb2wgY2FsbHMgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2h1bmtzIHJldHVybmVkIHRvIHRoZSBjbGllbnQuICovXG5mdW5jdGlvbiB0b29sRXJyb3JMb2dnaW5nUHJvY2Vzc29yKGxvZ2dlcjogbG9nLkxvZ2dlcik6IE91dHB1dFByb2Nlc3NvciB7XG4gIHJldHVybiB7XG4gICAgaWQ6IFwidG9vbC1lcnJvci1sb2dnZXJcIixcbiAgICBhc3luYyBwcm9jZXNzT3V0cHV0U3RyZWFtKHsgcGFydCB9KSB7XG4gICAgICBpZiAocGFydC50eXBlID09PSBcInRvb2wtZXJyb3JcIikge1xuICAgICAgICBjb25zdCBlcnJvciA9IGVycm9yVXRpbHMudG9FcnJvcihwYXJ0LnBheWxvYWQuZXJyb3IpO1xuICAgICAgICBsb2dnZXIuZXJyb3IoXCJ0b29sIGV4ZWN1dGlvbiBmYWlsZWRcIiwge1xuICAgICAgICAgIHRvb2xOYW1lOiBwYXJ0LnBheWxvYWQudG9vbE5hbWUsXG4gICAgICAgICAgdG9vbENhbGxJZDogcGFydC5wYXlsb2FkLnRvb2xDYWxsSWQsXG4gICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgc3RhY2s6IGVycm9yLnN0YWNrLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJ0O1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHdvcmtzcGFjZVNraWxsSW5wdXRQcm9jZXNzb3JzKFxuICB3b3Jrc3BhY2U6IFdvcmtzcGFjZSB8IHVuZGVmaW5lZCxcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4pOiBTa2lsbFNlYXJjaFByb2Nlc3NvcltdIHtcbiAgaWYgKCF3b3Jrc3BhY2UgfHwgY29uZmlnLndvcmtzcGFjZVNraWxscyA9PT0gZmFsc2UpIHJldHVybiBbXTtcbiAgY29uc3Qgb3B0aW9ucyA9IHR5cGVvZiBjb25maWcud29ya3NwYWNlU2tpbGxzID09PSBcIm9iamVjdFwiID8gY29uZmlnLndvcmtzcGFjZVNraWxscyA6IHVuZGVmaW5lZDtcbiAgaWYgKCF3b3Jrc3BhY2Uuc2tpbGxzKSByZXR1cm4gW107XG4gIHJldHVybiBbXG4gICAgbmV3IFNraWxsU2VhcmNoUHJvY2Vzc29yKHtcbiAgICAgIHdvcmtzcGFjZSxcbiAgICAgIHNlYXJjaDoge1xuICAgICAgICB0b3BLOiBvcHRpb25zPy50b3BLID8/IDUsXG4gICAgICAgIG1pblNjb3JlOiBvcHRpb25zPy5taW5TY29yZSA/PyAwLjEsXG4gICAgICB9LFxuICAgICAgLi4uKG9wdGlvbnM/LnR0bE1zICE9PSB1bmRlZmluZWQgPyB7IHR0bDogb3B0aW9ucy50dGxNcyB9IDoge30pLFxuICAgICAgYmxvY2tpbmdSZWZyZXNoOiBmYWxzZSxcbiAgICB9KSxcbiAgXTtcbn1cblxuLyoqXG4gKiBUb29sIGlkcyBvbiBgdG9vbHNgIHRoYXQgYXJlIGFwcHJvdmFsLWdhdGVkIChgcmVxdWlyZUFwcHJvdmFsOiB0cnVlYCkuXG4gKiBLZXlzIGFyZSB1c2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBhIHRvb2wgb21pdHMgYW4gZXhwbGljaXQgYGlkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcHJvdmFsR2F0ZWRUb29sSWRzKHRvb2xzOiBNYXN0cmFUb29scyk6IHN0cmluZ1tdIHtcbiAgaWYgKCF0b29scyB8fCB0eXBlb2YgdG9vbHMgIT09IFwib2JqZWN0XCIpIHJldHVybiBbXTtcbiAgcmV0dXJuIFtcbiAgICAuLi5vYmplY3RcbiAgICAgIC5zZXF1ZW5jZShPYmplY3QuZW50cmllcyh0b29scykpXG4gICAgICAuZmlsdGVyKChbLCB0b29sXSkgPT4gaXNBcHByb3ZhbEdhdGVkVG9vbCh0b29sKSlcbiAgICAgIC5tYXAoKFtrZXksIHRvb2xdKSA9PiByZXNvbHZlVG9vbElkKHRvb2wsIGtleSkpLFxuICBdO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGEgTWFzdHJhIC8gQUkgU0RLIHRvb2wgcGF1c2VzIGZvciBodW1hbiBhcHByb3ZhbCBiZWZvcmUgZXhlY3V0ZS4gKi9cbmZ1bmN0aW9uIGlzQXBwcm92YWxHYXRlZFRvb2wodG9vbDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIXRvb2wgfHwgdHlwZW9mIHRvb2wgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuICh0b29sIGFzIHsgcmVxdWlyZUFwcHJvdmFsPzogYm9vbGVhbiB9KS5yZXF1aXJlQXBwcm92YWwgPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUb29sSWQodG9vbDogdW5rbm93biwgZmFsbGJhY2tLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICh0b29sICYmIHR5cGVvZiB0b29sID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiAodG9vbCBhcyB7IGlkPzogc3RyaW5nIH0pLmlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuICh0b29sIGFzIHsgaWQ6IHN0cmluZyB9KS5pZDtcbiAgfVxuICByZXR1cm4gZmFsbGJhY2tLZXk7XG59XG5cbi8qKlxuICogQXBwcm92YWwtZ2F0ZWQgdG9vbHMgc3VzcGVuZCB0aGUgYWdlbnQgbG9vcCB1bnRpbCBhIGh1bWFuIGFwcHJvdmVzLlxuICogTWFzdHJhIHBlcnNpc3RzIHRob3NlIHN1c3BlbmRlZCBydW5zIGluIE1hc3RyYS1pbnN0YW5jZS1sZXZlbCBzdG9yYWdlXG4gKiAoYG1lbW9yeUJ1aWxkZXIuaW5zdGFuY2VTdG9yYWdlKClgKSwgbm90IHBlci1hZ2VudCBtZW1vcnkgLSBzbyBib290XG4gKiBtdXN0IGZhaWwgZmFzdCB3aGVuIHN1Y2ggYSB0b29sIGlzIHJlZ2lzdGVyZWQgd2l0aG91dCBzdG9yYWdlLlxuICovXG5mdW5jdGlvbiBhc3NlcnRBcHByb3ZhbEdhdGVkVG9vbHNIYXZlU3RvcmFnZShcbiAgZ2F0ZWQ6IEFycmF5PHsgYWdlbnRJZDogc3RyaW5nOyB0b29sSWRzOiBzdHJpbmdbXSB9PixcbiAgbWVtb3J5QnVpbGRlcjogTWVtb3J5QnVpbGRlciB8IHVuZGVmaW5lZCxcbik6IHZvaWQge1xuICBpZiAoZ2F0ZWQubGVuZ3RoID09PSAwKSByZXR1cm47XG4gIGlmIChtZW1vcnlCdWlsZGVyPy5pbnN0YW5jZVN0b3JhZ2UoKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGRldGFpbCA9IGdhdGVkXG4gICAgLm1hcCgoeyBhZ2VudElkLCB0b29sSWRzIH0pID0+IGAke2FnZW50SWR9OiAke3Rvb2xJZHMuam9pbihcIiwgXCIpfWApXG4gICAgLmpvaW4oXCI7IFwiKTtcbiAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICBcIm1hc3RyYTogYXBwcm92YWwtZ2F0ZWQgdG9vbHMgcmVxdWlyZSBwbHVnaW4gc3RvcmFnZSAoUG9zdGdyZXNTdG9yZSkgdG8gcGVyc2lzdCBzdXNwZW5kZWQgcnVucy4gXCIgK1xuICAgICAgYEFmZmVjdGVkIGFnZW50cy90b29sczogJHtkZXRhaWx9LiBgICtcbiAgICAgIFwiUmVnaXN0ZXIgbGFrZWJhc2UoKSBiZWZvcmUgbWFzdHJhKCkgc28gc3RvcmFnZSBhdXRvLWVuYWJsZXMsIG9yIHBhc3Mgc3RvcmFnZTogdHJ1ZSBleHBsaWNpdGx5LlwiLFxuICApO1xufVxuXG4vKipcbiAqIERlc2NyaWJlIGhvdyBhbiBhZ2VudCByZXNvbHZlcyBpdHMgdW5waW5uZWQgbW9kZWw6XG4gKlxuICogICAxLiBQZXItYWdlbnQgYGRlZi5tb2RlbGAgKHN0cmluZyBzdWdhciBpcyBjb25maWd1cmVkOyBhIGZ1bmN0aW9uIGlzXG4gKiAgICAgIGR5bmFtaWMpLlxuICogICAyLiBQbHVnaW4tbGV2ZWwgYGNvbmZpZy5kZWZhdWx0TW9kZWxgIChzYW1lIHJ1bGVzKS5cbiAqICAgMy4gYERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FYCBlbnYgdmFyLlxuICogICA0LiBBdXRvbWF0aWMgbGl2ZS1jYXRhbG9ndWUgcmFua2luZyB3aGVuIG5vbmUgaXMgc2V0LlxuICpcbiAqIFVzZWQgZm9yIHRoZSBzdGFydHVwIGBhZ2VudCByZWdpc3RlcmVkYCBsb2cgc28gb3BlcmF0b3JzIGNhbiBzZWVcbiAqIGBkZWZhdWx0TW9kZWxGYWxsYmFja3NgIHJlbWFpbnMgYW4gb3BlcmF0b3ItcGlubmVkIGNhbmRpZGF0ZSBsaXN0IGluc2lkZSB0aGVcbiAqIGF1dG9tYXRpYyBsaXZlIGxvb2t1cDsgaXQgaXMgbm90IGFkdmVydGlzZWQgYXMgYSBtb2RlbCB1bnRpbCBhdmFpbGFiaWxpdHkgaXNcbiAqIGNoZWNrZWQuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlQWdlbnREZWZhdWx0TW9kZWwoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBkZWY6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbixcbik6IEFnZW50RGVmYXVsdE1vZGVsIHtcbiAgY29uc3QgZWZmZWN0aXZlID0gZGVmLm1vZGVsID8/IGNvbmZpZy5kZWZhdWx0TW9kZWw7XG4gIGlmICh0eXBlb2YgZWZmZWN0aXZlID09PSBcInN0cmluZ1wiKSByZXR1cm4geyBraW5kOiBcImNvbmZpZ3VyZWRcIiwgbW9kZWw6IGVmZmVjdGl2ZSB9O1xuICBpZiAoZWZmZWN0aXZlICE9PSB1bmRlZmluZWQpIHJldHVybiB7IGtpbmQ6IFwiZHluYW1pY1wiIH07XG4gIGNvbnN0IGVudmlyb25tZW50ID0gcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUU7XG4gIHJldHVybiBlbnZpcm9ubWVudCA/IHsga2luZDogXCJjb25maWd1cmVkXCIsIG1vZGVsOiBlbnZpcm9ubWVudCB9IDogeyBraW5kOiBcImF1dG9cIiB9O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBgY29uZmlnLmFnZW50c2AgaW50byBhIGBSZWNvcmQ8aWQsIGRlZmluaXRpb24+YC4gQWNjZXB0c1xuICogYW55IG9mIHRoZSB0aHJlZSBzaGFwZXMgZG9jdW1lbnRlZCBvblxuICoge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudHN9OlxuICpcbiAqIC0gUmVjb3JkIC0gcmV0dXJuZWQgYXMtaXMgd2hlbiBub24tZW1wdHkuXG4gKiAtIFNpbmdsZSBkZWZpbml0aW9uIChkZXRlY3RlZCB2aWEgdGhlIHJlcXVpcmVkIGBpbnN0cnVjdGlvbnNgXG4gKiAgIGZpZWxkKSAtIGtleWVkIGJ5IGBzbHVnaWZ5KGRlZi5uYW1lKWAgb3IgYEZBTExCQUNLX0FHRU5UX0lEYC5cbiAqIC0gQXJyYXkgLSBrZXllZCBieSBgc2x1Z2lmeShkZWYubmFtZSlgIG9yIGBhZ2VudF8ke2l9YDsgZHVwbGljYXRlXG4gKiAgIHNsdWdzIGZhaWwgbG91ZGx5IHNvIHVzZXJzIGtub3cgdG8gc2V0IGV4cGxpY2l0IG5hbWVzLlxuICpcbiAqIE9taXR0ZWQgb3IgZW1wdHkgaW5wdXRzIGZhbGwgYmFjayB0byBhIHNpbmdsZSBidWlsdC1pbiBhbmFseXN0IHNvXG4gKiB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZyBjaGF0IHJvdXRlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBSZWNvcmQ8c3RyaW5nLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24+IHtcbiAgY29uc3QgaW5wdXQgPSBjb25maWcuYWdlbnRzO1xuICBpZiAoIWlucHV0KSByZXR1cm4gZmFsbGJhY2tEZWZpbml0aW9ucygpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIGlmIChpbnB1dC5sZW5ndGggPT09IDApIHJldHVybiBmYWxsYmFja0RlZmluaXRpb25zKCk7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24+ID0ge307XG4gICAgaW5wdXQuZm9yRWFjaCgoZGVmLCBpKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYsIGkpO1xuICAgICAgaWYgKG91dFtrZXldKSB7XG4gICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICAgICAgYG1hc3RyYTogZHVwbGljYXRlIGFnZW50IGlkIFwiJHtrZXl9XCIgZGVyaXZlZCBmcm9tIG5hbWUgXCIke2RlZi5uYW1lID8/IFwiXCJ9XCI7IGAgK1xuICAgICAgICAgICAgYHNldCB1bmlxdWUgXFxgbmFtZVxcYHMgb24gZWFjaCBkZWZpbml0aW9uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG91dFtrZXldID0gZGVmO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyBTaW5nbGUtZGVmaW5pdGlvbiBzaG9ydGhhbmQ6IGFuIGFnZW50IG93bnMgdGhlIHJlcXVpcmVkIGBpbnN0cnVjdGlvbnNgXG4gIC8vIGZpZWxkIChzdGF0aWMgb3IgZHluYW1pYyk7IGEgcmVjb3JkLW9mLWFnZW50cyBuZXZlciBvd25zIGl0IGRpcmVjdGx5LlxuICBpZiAoXCJpbnN0cnVjdGlvbnNcIiBpbiBpbnB1dCkge1xuICAgIGNvbnN0IGRlZiA9IGlucHV0IGFzIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbjtcbiAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYpO1xuICAgIHJldHVybiB7IFtrZXldOiBkZWYgfTtcbiAgfVxuXG4gIGNvbnN0IHJlY29yZCA9IGlucHV0IGFzIFJlY29yZDxzdHJpbmcsIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbj47XG4gIGlmIChPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTtcbiAgcmV0dXJuIHJlY29yZDtcbn1cblxuLyoqIERlcml2ZSBhIHJlZ2lzdHJ5IGlkIGZyb20gYSBkZWZpbml0aW9uJ3MgYG5hbWVgLCB3aXRoIGEgZmFsbGJhY2suICovXG5mdW5jdGlvbiBkZXJpdmVBZ2VudEtleShkZWY6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbiwgaW5kZXg/OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoZGVmLm5hbWUpIHtcbiAgICBjb25zdCBzbHVnID0gc3RyaW5nVXRpbHMudG9JZGVudGlmaWVyKGRlZi5uYW1lKTtcbiAgICBpZiAoc2x1ZykgcmV0dXJuIHNsdWc7XG4gIH1cbiAgcmV0dXJuIGluZGV4ID09PSB1bmRlZmluZWQgPyBGQUxMQkFDS19BR0VOVF9JRCA6IGBhZ2VudF8ke2luZGV4fWA7XG59XG5cbi8qKiBCdWlsdC1pbiBmYWxsYmFjayByZWdpc3RyeSB1c2VkIHdoZW4gYGFnZW50c2AgaXMgb21pdHRlZCAvIGVtcHR5LiAqL1xuZnVuY3Rpb24gZmFsbGJhY2tEZWZpbml0aW9ucygpOiBSZWNvcmQ8c3RyaW5nLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24+IHtcbiAgcmV0dXJuIHtcbiAgICBbRkFMTEJBQ0tfQUdFTlRfSURdOiB7XG4gICAgICBuYW1lOiBcIkRlZmF1bHQgQWdlbnRcIixcbiAgICAgIGluc3RydWN0aW9uczogRkFMTEJBQ0tfQUdFTlRfSU5TVFJVQ1RJT05TLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUGljayB0aGUgZWZmZWN0aXZlIG1vZGVsIHNwZWMgZm9yIGFuIGFnZW50LiBGYWxsYmFjayBsYWRkZXIsIGluXG4gKiBvcmRlcjpcbiAqXG4gKiAgIDEuIFBlci1hZ2VudCBgZGVmLm1vZGVsYCAoc3RyaW5nIHN1Z2FyIG9yIGBEeW5hbWljQXJndW1lbnRgKS5cbiAqICAgMi4gUGx1Z2luLWxldmVsIGBjb25maWcuZGVmYXVsdE1vZGVsYCAoc3RyaW5nIHN1Z2FyIG9yXG4gKiAgICAgIGBEeW5hbWljQXJndW1lbnRgKSAtIG1pcnJvcnMgQXBwS2l0J3MgYGFnZW50cyh7IGRlZmF1bHRNb2RlbCB9KWAuXG4gKiAgIDMuIFRoZSBhdXRvLXJlc29sdmVyIHRoYXQgbWludHMgdXNlci1zY29wZWQgdG9rZW5zIGFnYWluc3RcbiAqICAgICAgYC9zZXJ2aW5nLWVuZHBvaW50c2AgdmlhIHtAbGluayBidWlsZE1vZGVsfS5cbiAqXG4gKiBTdHJpbmcgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIGBtb2RlbElkYCBzdWdhciBhbmQgdGhyZWFkZWQgdGhyb3VnaFxuICogYGJ1aWxkTW9kZWxgJ3Mgb3ZlcnJpZGUgaG9vayBzbyB0aGUgcnVudGltZSBmdXp6eSBtYXRjaGVyIGFuZCB0aGVcbiAqIHBlci1yZXF1ZXN0IGBYLU1hc3RyYS1Nb2RlbGAgb3ZlcnJpZGUgbGF5ZXIgb24gdG9wIG9mIHRoZSBzdGF0aWNcbiAqIGNob2ljZS4gTm9uLXN0cmluZyBgRHluYW1pY0FyZ3VtZW50YHMgYXJlIHBhc3NlZCB0aHJvdWdoIHZlcmJhdGltO1xuICogY2FsbGVycyB0aGF0IG5lZWQgZnVsbCBjb250cm9sIG92ZXIgYHByb3ZpZGVySWRgIC8gYGhlYWRlcnNgIC9cbiAqIGBtb2RlbElkYCBieXBhc3MgdGhlIHJlc29sdmVyIHBpcGVsaW5lIGVudGlyZWx5LlxuICovXG5mdW5jdGlvbiByZXNvbHZlTW9kZWwoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBvdmVycmlkZTogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW1wibW9kZWxcIl0sXG4pOiBBZ2VudENvbmZpZ1tcIm1vZGVsXCJdIHtcbiAgY29uc3QgZWZmZWN0aXZlID0gb3ZlcnJpZGUgPz8gY29uZmlnLmRlZmF1bHRNb2RlbDtcbiAgaWYgKGVmZmVjdGl2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IGJ1aWxkTW9kZWwoY29uZmlnLCByZXF1ZXN0Q29udGV4dCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBlZmZlY3RpdmUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBtb2RlbElkID0gZWZmZWN0aXZlO1xuICAgIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiBidWlsZE1vZGVsKGNvbmZpZywgcmVxdWVzdENvbnRleHQsIHsgbW9kZWxJZCB9KTtcbiAgfVxuICByZXR1cm4gZWZmZWN0aXZlO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBkZWZpbml0aW9uJ3MgYHRvb2xzYCBmaWVsZCB0byBhIGZsYXQgYE1hc3RyYVRvb2xzYCByZWNvcmQsXG4gKiBtZXJnaW5nIGluIHBsdWdpbi1sZXZlbCBhbWJpZW50IHRvb2xzIChwZXItYWdlbnQgdG9vbHMgd2luIG9uIGtleVxuICogY29sbGlzaW9uKS4gQ2FsbGJhY2sgZXJyb3JzIHByb3BhZ2F0ZSB2ZXJiYXRpbSBzbyB0aGUgb3JpZ2luYWwgc3RhY2tcbiAqIHN1cnZpdmVzIC0gdGhlIGNhbGxlciBhbHJlYWR5IGtub3dzIHdoaWNoIGFnZW50IHdhcyByZWdpc3RlcmluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVRvb2xzKFxuICBkZWZUb29sczogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW1widG9vbHNcIl0sXG4gIHBsdWdpbnM6IE1hc3RyYVBsdWdpbnMsXG4gIGFtYmllbnRUb29sczogTWFzdHJhVG9vbHMsXG4pOiBQcm9taXNlPE1hc3RyYVRvb2xzPiB7XG4gIGlmICghZGVmVG9vbHMpIHJldHVybiB7IC4uLmFtYmllbnRUb29scyB9O1xuICBjb25zdCByZXNvbHZlZCA9IHR5cGVvZiBkZWZUb29scyA9PT0gXCJmdW5jdGlvblwiID8gYXdhaXQgZGVmVG9vbHMocGx1Z2lucykgOiBkZWZUb29scztcbiAgcmV0dXJuIHsgLi4uYW1iaWVudFRvb2xzLCAuLi5yZXNvbHZlZCB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQWdlbnRXb3Jrc3BhY2UoXG4gIHdvcmtzcGFjZTogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW1wid29ya3NwYWNlXCJdLFxuKTogV29ya3NwYWNlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF3b3Jrc3BhY2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2Ygd29ya3NwYWNlID09PSBcImZ1bmN0aW9uXCIgPyB3b3Jrc3BhY2UoKSA6IHdvcmtzcGFjZTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUge0BsaW5rIE1hc3RyYVBsdWdpbnN9IHJ1bnRpbWUgcHJveHkgaGFuZGVkIHRvXG4gKiBgdG9vbHMocGx1Z2lucylgIGNhbGxiYWNrcy5cbiAqXG4gKiBJbXBsZW1lbnRlZCBhcyBhIGBQcm94eWAgb3ZlciB0aGUgQXBwS2l0IHBsdWdpbiBjb250ZXh0IHNvXG4gKiBgcGx1Z2lucy48bmFtZT5gIHJlc29sdmVzIGF0IGZpcnN0IGFjY2Vzcy4gQW55IHNpYmxpbmcgcGx1Z2luIHRoYXRcbiAqIGltcGxlbWVudHMgQXBwS2l0J3Mgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYHRvb2xraXQob3B0cz8pYCArIGBleGVjdXRlQWdlbnRUb29sKG5hbWUsIGFyZ3MsIHNpZ25hbD8sIGNvbnRleHQ/KWApIGlzXG4gKiBhdXRvLWFkYXB0ZWQgaW50byBNYXN0cmEgdG9vbHMuIFVua25vd24gbmFtZXMgcmV0dXJuIGB1bmRlZmluZWRgLFxuICogbWF0Y2hpbmcgQXBwS2l0J3MgYFBsdWdpbnNgIHNlbWFudGljcyBzbyBgcGx1Z2lucy5mb28/LnRvb2xraXQoKWBcbiAqIHJlbWFpbnMgc2FmZSBpbiBlbnZpcm9ubWVudHMgd2hlcmUgYGZvb2AgaXNuJ3QgcmVnaXN0ZXJlZC5cbiAqXG4gKiBgZ2VuaWVgIGlzIHNwZWNpYWwtY2FzZWQgdG8gc3dhcCB0aGUgZ2VuZXJpYyBBcHBLaXQgdG9vbGtpdCAod2hpY2hcbiAqIHJ1bnMgYGV4ZWN1dGVBZ2VudFRvb2xgIGFuZCBvbmx5IGVtaXRzIGEgc2luZ2xlIGZpbmFsIGB0b29sLXJlc3VsdGBcbiAqIGNodW5rIHBlciBjYWxsKSBmb3IgdGhlIHN0cmVhbWluZy1hd2FyZSB0b29scyBidWlsdCBieVxuICoge0BsaW5rIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXJ9LiBUaGUgc3RyZWFtaW5nIHZhcmlhbnQgZm9yd2FyZHMgZWFjaFxuICogR2VuaWUgd2lyZSBldmVudCAoc3RhdHVzLCBTUUwsIHJvdyBjb3VudHMsIGVycm9ycykgb3V0IHRocm91Z2ggdGhlXG4gKiBNYXN0cmEgYGN0eC53cml0ZXJgLCBzbyB0aGUgVUkgZ2V0cyBgdG9vbC1vdXRwdXRgIGNodW5rcyBpbiByZWFsXG4gKiB0aW1lIGluc3RlYWQgb2Ygc3RhcmluZyBhdCBhIHNwaW5uZXIgZm9yIHRoZSBmdWxsIEdlbmllIHJvdW5kLXRyaXAuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUGx1Z2luc01hcChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGNvbnRleHQ6IHBsdWdpblJlZ2lzdHJ5LlBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkLFxuKTogTWFzdHJhUGx1Z2lucyB7XG4gIGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB8IG51bGw+KCk7XG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgTWFzdHJhUGx1Z2lucywge1xuICAgIGdldChfdGFyZ2V0LCBwcm9wTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wTmFtZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGlmIChjYWNoZS5oYXMocHJvcE5hbWUpKSByZXR1cm4gY2FjaGUuZ2V0KHByb3BOYW1lKSA/PyB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBwcm92aWRlciA9IHJlc29sdmVQcm92aWRlcihjb25maWcsIGNvbnRleHQsIHByb3BOYW1lKTtcbiAgICAgIGNhY2hlLnNldChwcm9wTmFtZSwgcHJvdmlkZXIpO1xuICAgICAgcmV0dXJuIHByb3ZpZGVyID8/IHVuZGVmaW5lZDtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSByaWdodCB7QGxpbmsgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyfSBmb3IgYSBzaWJsaW5nXG4gKiBwbHVnaW4gbG9va3VwLiBSZXR1cm5zIHRoZSBHZW5pZSBhZ2VudC1iYWNrZWQgYWRhcHRlciB3aGVuXG4gKiB0aGUgY2FsbGVyIGFza3MgZm9yIGBnZW5pZWAgQU5EIGF0IGxlYXN0IG9uZSBzcGFjZSBpcyByZWFjaGFibGVcbiAqIHZpYSB7QGxpbmsgcmVzb2x2ZUdlbmllU3BhY2VzfSAodGhlIGV4cGxpY2l0XG4gKiBgY29uZmlnLmdlbmllU3BhY2VzYCwgdGhlIHJlZ2lzdGVyZWQgQXBwS2l0IGBnZW5pZSgpYCBwbHVnaW4nc1xuICogYHNwYWNlc2AgY29uZmlnLCBvciB0aGUgYERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSURgIGVudiB2YXIpLlxuICogRmFsbHMgYmFjayB0byB0aGUgZ2VuZXJpYyBBcHBLaXQgYFRvb2xQcm92aWRlcmAgYWRhcHRlciBmb3JcbiAqIGV2ZXJ5IG90aGVyIHBsdWdpbiBuYW1lLiBgY29uZmlnYCBpcyB0aHJlYWRlZCB0aHJvdWdoIHNvIHRoZVxuICogR2VuaWUgYWdlbnQgaW5oZXJpdHMgdGhlIHNhbWUgbW9kZWwgcmVzb2x2ZXIgLyBmYWxsYmFja1xuICogbGFkZGVyIHRoZSBjYWxsaW5nIGFnZW50cyB1c2UuXG4gKlxuICogVGhlIEdlbmllIHRvb2xzIHRhbGsgdG8gR2VuaWUgZGlyZWN0bHkgdGhyb3VnaCBgQGRieC10b29scy9nZW5pZWBcbiAqIChgZ2VuaWVFdmVudENoYXRgKSBhbmQgdGhlIHdvcmtzcGFjZSBgc3RhdGVtZW50RXhlY3V0aW9uLmdldFN0YXRlbWVudGBcbiAqIEFQSTsgQXBwS2l0J3Mgc3RvY2sgYGdlbmllYCBwbHVnaW4gY29udHJpYnV0ZXMgb25seSBpdHMgcmVzb3VyY2VcbiAqIG1hbmlmZXN0IGFuZCBgc3BhY2VzYCBjb25maWcsIHNvIGFuIGBhcHAueWFtbGAgcmVzb3VyY2UgYmluZGluZyBhbmQgYVxuICogYGdlbmllKHsgc3BhY2VzIH0pYCByZWNvcmQgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGhlcmUgYXMgdGhleSBkbyB0aGVyZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVByb3ZpZGVyKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgY29udGV4dDogcGx1Z2luUmVnaXN0cnkuUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQsXG4gIHByb3BOYW1lOiBzdHJpbmcsXG4pOiBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIgfCBudWxsIHtcbiAgaWYgKHByb3BOYW1lID09PSBcImdlbmllXCIpIHtcbiAgICBjb25zdCBzcGFjZXMgPSByZXNvbHZlR2VuaWVTcGFjZXMoY29uZmlnLCBjb250ZXh0KTtcbiAgICBpZiAoT2JqZWN0LmtleXMoc3BhY2VzKS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyKHtcbiAgICAgIHNwYWNlcyxcbiAgICAgIGNvbmZpZyxcbiAgICB9KSBhcyBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXI7XG4gIH1cbiAgY29uc3QgcGx1Z2luID0gY29udGV4dD8uZ2V0UGx1Z2lucygpLmdldChwcm9wTmFtZSk7XG4gIHJldHVybiBhZGFwdFBsdWdpblRvb2xraXQocGx1Z2luLCBwcm9wTmFtZSk7XG59XG5cbnR5cGUgQ29udGV4dHVhbFRvb2xQcm92aWRlciA9IFBhcnRpYWw8UGljazxUb29sUHJvdmlkZXIsIFwiZ2V0QWdlbnRUb29sc1wiPj4gJiB7XG4gIHRvb2xraXQ/OiAoXG4gICAgb3B0cz86IFRvb2xraXRPcHRpb25zLFxuICApID0+XG4gICAgfCBSZXR1cm5UeXBlPFBsdWdpblRvb2xraXRQcm92aWRlcltcInRvb2xraXRcIl0+XG4gICAgfCBQcm9taXNlPFJldHVyblR5cGU8UGx1Z2luVG9vbGtpdFByb3ZpZGVyW1widG9vbGtpdFwiXT4+O1xuICBleGVjdXRlQWdlbnRUb29sPzogKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBhcmdzOiB1bmtub3duLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICAgIGNvbnRleHQ/OiBBZ2VudFRvb2xFeGVjdXRpb25Db250ZXh0LFxuICApID0+IFByb21pc2U8dW5rbm93bj47XG59O1xuXG4vKipcbiAqIEFkYXB0IGFuIEFwcEtpdCBgVG9vbFByb3ZpZGVyYCBwbHVnaW4gaW5zdGFuY2UgaW50byBhXG4gKiB7QGxpbmsgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyfS4gUmV0dXJucyBgbnVsbGAgZm9yIGFueSBwbHVnaW5cbiAqIHRoYXQgZG9lc24ndCBpbXBsZW1lbnQgYGV4ZWN1dGVBZ2VudFRvb2xgIHBsdXMgZWl0aGVyIEFwcEtpdCdzIG5hdGl2ZVxuICogYHRvb2xraXRgIG9yIGBnZXRBZ2VudFRvb2xzYCBzdXJmYWNlLlxuICovXG5mdW5jdGlvbiBhZGFwdFBsdWdpblRvb2xraXQoXG4gIHBsdWdpbjogdW5rbm93bixcbiAgcGx1Z2luTmFtZTogc3RyaW5nLFxuKTogTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHwgbnVsbCB7XG4gIGlmICghcGx1Z2luIHx8IHR5cGVvZiBwbHVnaW4gIT09IFwib2JqZWN0XCIpIHJldHVybiBudWxsO1xuICBjb25zdCBwID0gcGx1Z2luIGFzIENvbnRleHR1YWxUb29sUHJvdmlkZXI7XG4gIGlmIChcbiAgICB0eXBlb2YgcC5leGVjdXRlQWdlbnRUb29sICE9PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAodHlwZW9mIHAudG9vbGtpdCAhPT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBwLmdldEFnZW50VG9vbHMgIT09IFwiZnVuY3Rpb25cIilcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0b29sa2l0KG9wdHM/OiBUb29sa2l0T3B0aW9ucyk6IE1hc3RyYVRvb2xzIHwgUHJvbWlzZTxNYXN0cmFUb29scz4ge1xuICAgICAgY29uc3QgZW50cmllcyA9XG4gICAgICAgIHR5cGVvZiBwLnRvb2xraXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gcC50b29sa2l0KG9wdHMpXG4gICAgICAgICAgOiB0b29sa2l0RW50cmllc0Zyb21EZWZpbml0aW9ucyhwbHVnaW5OYW1lLCBwLmdldEFnZW50VG9vbHMhKCksIG9wdHMpO1xuICAgICAgaWYgKGlzUHJvbWlzZUxpa2UoZW50cmllcykpIHtcbiAgICAgICAgcmV0dXJuIGVudHJpZXMudGhlbigocmVzb2x2ZWQpID0+IHRvb2xraXRFbnRyaWVzVG9NYXN0cmFUb29scyhyZXNvbHZlZCwgcCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRvb2xraXRFbnRyaWVzVG9NYXN0cmFUb29scyhlbnRyaWVzLCBwKTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiB0b29sa2l0RW50cmllc0Zyb21EZWZpbml0aW9ucyhcbiAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICBkZWZpbml0aW9uczogQWdlbnRUb29sRGVmaW5pdGlvbltdLFxuICBvcHRpb25zOiBUb29sa2l0T3B0aW9ucyA9IHt9LFxuKTogUmVjb3JkPHN0cmluZywgVG9vbGtpdEVudHJ5PiB7XG4gIHJldHVybiB0b29sa2l0RW50cmllcy5lbnRyaWVzKHBsdWdpbk5hbWUsIGRlZmluaXRpb25zLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gaXNQcm9taXNlTGlrZTxUPih2YWx1ZTogVCB8IFByb21pc2U8VD4pOiB2YWx1ZSBpcyBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIHR5cGVvZiAodmFsdWUgYXMgeyB0aGVuPzogdW5rbm93biB9KT8udGhlbiA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG5mdW5jdGlvbiB0b29sa2l0RW50cmllc1RvTWFzdHJhVG9vbHMoXG4gIGVudHJpZXM6IFJlY29yZDxzdHJpbmcsIFRvb2xraXRFbnRyeT4sXG4gIHBsdWdpbjogQ29udGV4dHVhbFRvb2xQcm92aWRlcixcbik6IE1hc3RyYVRvb2xzIHtcbiAgY29uc3QgdG9vbHM6IE1hc3RyYVRvb2xzID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgdG9vbHNba2V5XSA9IHRvb2xraXRFbnRyeVRvTWFzdHJhVG9vbChlbnRyeSwgcGx1Z2luKTtcbiAgfVxuICByZXR1cm4gdG9vbHM7XG59XG5cbi8qKlxuICogV3JhcCBhIHNpbmdsZSB7QGxpbmsgQXBwS2l0VG9vbGtpdEVudHJ5fSBhcyBhIE1hc3RyYSB0b29sIHdob3NlXG4gKiBgZXhlY3V0ZWAgZGlzcGF0Y2hlcyBiYWNrIHRocm91Z2ggYHBsdWdpbi5leGVjdXRlQWdlbnRUb29sKC4uLilgIHNvXG4gKiBBcHBLaXQncyBPQk8gYXV0aCAoYGFzVXNlcmApLCB0ZWxlbWV0cnkgc3BhbnMsIGFuZCB0aGUgTWFzdHJhIG1lbW9yeSByZXNvdXJjZVxuICogaWQgc3RheSBpbnRhY3QuIEpTT04gU2NoZW1hIHBhcmFtZXRlcnMgcGFzcyB0aHJvdWdoIHVuY2hhbmdlZCAtIE1hc3RyYSdzXG4gKiBgUHVibGljU2NoZW1hYCBhY2NlcHRzIGBKU09OU2NoZW1hN2AgZGlyZWN0bHkgdmlhIGBAbWFzdHJhL3NjaGVtYS1jb21wYXRgLlxuICovXG5mdW5jdGlvbiB0b29sa2l0RW50cnlUb01hc3RyYVRvb2woZW50cnk6IFRvb2xraXRFbnRyeSwgcGx1Z2luOiBDb250ZXh0dWFsVG9vbFByb3ZpZGVyKTogVG9vbCB7XG4gIGNvbnN0IGFubm90YXRpb25zID0gZW50cnkuYW5ub3RhdGlvbnMgPz8gZW50cnkuZGVmLmFubm90YXRpb25zO1xuICBjb25zdCBlZmZlY3QgPSBhbm5vdGF0aW9ucz8uZWZmZWN0O1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gZWZmZWN0ID09PSBcImRlc3RydWN0aXZlXCIgfHwgYW5ub3RhdGlvbnM/LmRlc3RydWN0aXZlID09PSB0cnVlO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IGAke2VudHJ5LnBsdWdpbk5hbWV9X18ke2VudHJ5LmxvY2FsTmFtZX1gLFxuICAgIGRlc2NyaXB0aW9uOiBlbnRyeS5kZWYuZGVzY3JpcHRpb24sXG4gICAgLi4uKGVudHJ5LmRlZi5wYXJhbWV0ZXJzID8geyBpbnB1dFNjaGVtYTogZW50cnkuZGVmLnBhcmFtZXRlcnMgYXMgbmV2ZXIgfSA6IHt9KSxcbiAgICAuLi4ocmVxdWlyZXNBcHByb3ZhbCA/IHsgcmVxdWlyZUFwcHJvdmFsOiB0cnVlIH0gOiB7fSksXG4gICAgLi4uKGFubm90YXRpb25zXG4gICAgICA/IHtcbiAgICAgICAgICBtY3A6IHtcbiAgICAgICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgICAgIHJlYWRPbmx5SGludDogZWZmZWN0ID09PSBcInJlYWRcIiB8fCBhbm5vdGF0aW9ucy5yZWFkT25seSA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiBlZmZlY3QgPT09IFwiZGVzdHJ1Y3RpdmVcIiB8fCBhbm5vdGF0aW9ucy5kZXN0cnVjdGl2ZSA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgaWRlbXBvdGVudEhpbnQ6IGFubm90YXRpb25zLmlkZW1wb3RlbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uID0gY29udGV4dCBhc1xuICAgICAgICB8IHtcbiAgICAgICAgICAgIGFnZW50PzogeyB0b29sQ2FsbElkPzogc3RyaW5nIH07XG4gICAgICAgICAgICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAgICAgICAgICAgcmVxdWVzdENvbnRleHQ/OiB7IGdldChrZXk6IHN0cmluZyk6IHVua25vd24gfTtcbiAgICAgICAgICAgIHdyaXRlcj86IHtcbiAgICAgICAgICAgICAgY3VzdG9tKHBhcnQ6IHsgdHlwZTogc3RyaW5nOyBkYXRhOiB1bmtub3duIH0pOiBQcm9taXNlPHZvaWQ+O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcmVzb3VyY2VJZCA9IGV4ZWN1dGlvbj8ucmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKTtcbiAgICAgIGNvbnN0IG1vZGVsID0gZXhlY3V0aW9uPy5yZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9SRVNPTFZFRF9NT0RFTF9LRVkpO1xuICAgICAgY29uc3QgdG9vbENhbGxJZCA9IGV4ZWN1dGlvbj8uYWdlbnQ/LnRvb2xDYWxsSWQ7XG4gICAgICBjb25zdCB3cml0ZXIgPSBleGVjdXRpb24/LndyaXRlcjtcbiAgICAgIHJldHVybiBwbHVnaW4uZXhlY3V0ZUFnZW50VG9vbCEoZW50cnkubG9jYWxOYW1lLCBpbnB1dCwgZXhlY3V0aW9uPy5hYm9ydFNpZ25hbCwge1xuICAgICAgICAuLi4odHlwZW9mIHJlc291cmNlSWQgPT09IFwic3RyaW5nXCIgPyB7IHJlc291cmNlSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIiA/IHsgbW9kZWwgfSA6IHt9KSxcbiAgICAgICAgLi4uKHdyaXRlciAmJiB0b29sQ2FsbElkXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHdyaXRlUHJvZ3Jlc3M6IGFzeW5jIChldmVudDogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IFRvb2xQcm9ncmVzc0V2ZW50U2NoZW1hLnBhcnNlKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB3cml0ZXJcbiAgICAgICAgICAgICAgICAgIC5jdXN0b20oe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBUT09MX1BST0dSRVNTX1BBUlRfVFlQRSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogeyB0b29sQ2FsbElkLCBldmVudDogcGFyc2VkIH0sXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
852
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVF4RCxPQUFPLEVBQWtCLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQU9qRyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFL0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHdEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVoRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFakQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxzQkFBc0IsRUFBc0IsTUFBTSxhQUFhLENBQUM7QUFDekUsT0FBTyxFQUFFLFVBQVUsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpQkFB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LEVBQUUsQ0FBQztnQkFDekQsR0FBRyxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMvQyxHQUFHLENBQUMsTUFBTSxJQUFJLFVBQVU7b0JBQ3RCLENBQUMsQ0FBQzt3QkFDRSxhQUFhLEVBQUUsS0FBSyxFQUFFLEtBQWMsRUFBRSxFQUFFOzRCQUN0QyxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ3BELE1BQU0sTUFBTTtpQ0FDVCxNQUFNLENBQUM7Z0NBQ04sSUFBSSxFQUFFLHVCQUF1QjtnQ0FDN0IsSUFBSSxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7NkJBQ3BDLENBQUM7aUNBQ0QsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUM1QixDQUFDO3FCQUNGO29CQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDUixDQUFDLENBQUM7UUFDTCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWdlbnQgcmVnaXN0cmF0aW9uIGZvciB0aGUgTWFzdHJhIEFwcEtpdCBwbHVnaW4uXG4gKlxuICogTWlycm9ycyB0aGUgc2hhcGUgb2YgdGhlIEFwcEtpdCBgYWdlbnRzYCBwbHVnaW4gKGBjb25maWcuYWdlbnRzYCBtYXBcbiAqIG9mIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb259LCBkdWFsLWZvcm0gYHRvb2xzYCBhY2NlcHRpbmcgYSBwbGFpblxuICogcmVjb3JkIG9yIGEgYChwbHVnaW5zKSA9PiB0b29sc2AgY2FsbGJhY2spLiBSZXNvbHZlcyBlYWNoIGRlZmluaXRpb25cbiAqIGludG8gYSBNYXN0cmEgYEFnZW50YCBpbnN0YW5jZSBkdXJpbmcgcGx1Z2luIHNldHVwOyB1c2VyLXN1cHBsaWVkXG4gKiB0b29sIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBleGFjdGx5IG9uY2Ugd2l0aCBhIHR5cGVkXG4gKiB7QGxpbmsgTWFzdHJhUGx1Z2luc30gbWFwIGJ1aWx0IGZyb20gcmVnaXN0ZXJlZCBzaWJsaW5nIHBsdWdpbnMuXG4gKlxuICogV2hlbiBubyBhZ2VudHMgYXJlIHJlZ2lzdGVyZWQgdGhlIHBsdWdpbiBmYWxscyBiYWNrIHRvIGEgc2luZ2xlXG4gKiBidWlsdC1pbiBhbmFseXN0IHNvIHRoZSBiYXJlIGBtYXN0cmEoKWAgY2FsbCBzdGlsbCBtb3VudHMgYSB3b3JraW5nXG4gKiBzdHJlYW1hYmxlIGFnZW50IGZvciBkZW1vcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUge1xuICBBZ2VudFRvb2xEZWZpbml0aW9uLFxuICBQbHVnaW5Ub29sa2l0UHJvdmlkZXIsXG4gIFRvb2xraXRFbnRyeSxcbiAgVG9vbGtpdE9wdGlvbnMgYXMgQXBwS2l0VG9vbGtpdE9wdGlvbnMsXG4gIFRvb2xQcm92aWRlcixcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBwbHVnaW5SZWdpc3RyeSwgdG9vbGtpdEVudHJpZXMgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRUb29sRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC90b29sLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2csIG9iamVjdCwgc3RyaW5nVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgVE9PTF9QUk9HUkVTU19QQVJUX1RZUEUsIFRvb2xQcm9ncmVzc0V2ZW50U2NoZW1hIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYS93aXJlXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFnZW50Q29uZmlnLFxuICBBZ2VudEV4ZWN1dGlvbk9wdGlvbnMsXG4gIEFnZW50SW5zdHJ1Y3Rpb25zLFxuICBUb29sc0lucHV0LFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB7IGNyZWF0ZUV2ZW50ZWRBZ2VudCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnQvZHVyYWJsZVwiO1xuaW1wb3J0IHsgU2tpbGxTZWFyY2hQcm9jZXNzb3IgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Byb2Nlc3NvcnNcIjtcbmltcG9ydCB0eXBlIHsgT3V0cHV0UHJvY2Vzc29yIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9wcm9jZXNzb3JzXCI7XG5pbXBvcnQgeyBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBDb2RlTW9kZVRyYW5zcG9ydCwgVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUNvZGVNb2RlLCBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2UgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHsgY3JlYXRlV29ya3NwYWNlVG9vbHMgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHR5cGUgeyBQZ1ZlY3RvckNvbmZpZywgUG9zdGdyZXNTdG9yZUNvbmZpZyB9IGZyb20gXCJAbWFzdHJhL3BnXCI7XG5pbXBvcnQgeyBRdWlja0pzQ29kZU1vZGVUcmFuc3BvcnQgfSBmcm9tIFwiQG1hc3RyYS9xdWlja2pzXCI7XG5cbmltcG9ydCB7IGJ1aWxkUmVuZGVyRGF0YVRvb2wgfSBmcm9tIFwiLi9jaGFydC50c1wiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIsIHJlc29sdmVHZW5pZVNwYWNlcyB9IGZyb20gXCIuL2dlbmllLnRzXCI7XG5pbXBvcnQgeyB3aXRoUmVxdWVzdE1lbW9yeVNjb3BlLCB0eXBlIE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9tZW1vcnkudHNcIjtcbmltcG9ydCB7IGJ1aWxkTW9kZWwsIFJFU1BPTlNFU19QUk9WSURFUl9PUFRJT05TIH0gZnJvbSBcIi4vbW9kZWwudHNcIjtcbmltcG9ydCB7IHN0cmlwU3RhbGVDaGFydHNQcm9jZXNzb3IgfSBmcm9tIFwiLi9wcm9jZXNzb3JzLnRzXCI7XG5pbXBvcnQgeyBNQVNUUkFfUkVTT0xWRURfTU9ERUxfS0VZIH0gZnJvbSBcIi4vc2VydmluZy50c1wiO1xuaW1wb3J0IHsgVFlQT0dSQVBIWV9SVUxFIH0gZnJvbSBcIi4vc3R5bGUudHNcIjtcbmltcG9ydCB7IGJ1aWxkU3VtbWFyaXplVG9vbCB9IGZyb20gXCIuL3N1bW1hcml6ZS50c1wiO1xuaW1wb3J0IHtcbiAgYmluZERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuICBkYXRhYnJpY2tzV29ya3NwYWNlLFxuICB0eXBlIERhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zLFxufSBmcm9tIFwiLi93b3Jrc3BhY2VzLnRzXCI7XG5cbmNvbnN0IGNvZGVNb2RlTG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9jb2RlLW1vZGVcIik7XG5sZXQgcmVzb2x2ZWRDb2RlTW9kZVRyYW5zcG9ydDogUHJvbWlzZTxDb2RlTW9kZVRyYW5zcG9ydD4gfCB1bmRlZmluZWQ7XG5cbi8qKiBSZXR1cm4gd2hldGhlciB0aGlzIGJvb3QgZW52aXJvbm1lbnQgbWF0Y2hlcyBpc29sYXRlZC12bSdzIHN1cHBvcnRlZCBhcHAgc2hhcGUuICovXG5mdW5jdGlvbiBzdXBwb3J0c0lzb2xhdGVkVm1UcmFuc3BvcnQoKTogYm9vbGVhbiB7XG4gIGlmIChwcm9jZXNzLnZlcnNpb25zLmJ1biB8fCBwcm9jZXNzLnJlbGVhc2UubmFtZSAhPT0gXCJub2RlXCIgfHwgcHJvY2Vzcy5wbGF0Zm9ybSAhPT0gXCJsaW51eFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IG5vZGVNYWpvciA9IE51bWJlci5wYXJzZUludChwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoXCIuXCIpWzBdID8/IFwiXCIsIDEwKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobm9kZU1ham9yKSB8fCBub2RlTWFqb3IgPCAyMCB8fCBub2RlTWFqb3IgPj0gMjUpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgbm9kZU9wdGlvbnMgPSBwcm9jZXNzLmVudi5OT0RFX09QVElPTlM/LnNwbGl0KC9cXHMrLykgPz8gW107XG4gIHJldHVybiBbLi4ucHJvY2Vzcy5leGVjQXJndiwgLi4ubm9kZU9wdGlvbnNdLmluY2x1ZGVzKFwiLS1uby1ub2RlLXNuYXBzaG90XCIpO1xufVxuXG4vKipcbiAqIFRvb2wgcmVjb3JkIGFjY2VwdGVkIGJ5IGV2ZXJ5IE1hc3RyYSBgQWdlbnQudG9vbHNgIGZpZWxkIGFuZCBieSB0aGVcbiAqIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2sgb24ge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbn0uXG4gKlxuICogQWxpYXMgb2YgTWFzdHJhJ3MgYFRvb2xzSW5wdXRgLCBzbyBpdCBhbHJlYWR5IGFjY2VwdHM6XG4gKlxuICogLSBNYXN0cmEgdG9vbHMgYnVpbHQgd2l0aCB7QGxpbmsgY3JlYXRlVG9vbH0gKG9yIGBuZXcgVG9vbCguLi4pYClcbiAqIC0gTWFzdHJhIHRvb2xzIGJ1aWx0IHdpdGggdGhlIEFwcEtpdC1zaGFwZWQge0BsaW5rIHRvb2x9IHdyYXBwZXJcbiAqICAgYmVsb3dcbiAqIC0gVmVyY2VsIEFJIFNESyB0b29scyAoYHRvb2woeyAuLi4gfSlgIGZyb20gYGFpYClcbiAqIC0gUHJvdmlkZXItZGVmaW5lZCB0b29scyAoZS5nLiBgb3BlbmFpLnRvb2xzLndlYlNlYXJjaCguLi4pYClcbiAqXG4gKiBFeGlzdGluZyB0b29sIGxpYnJhcmllcyBkcm9wIGluIGFzLWlzIC0gbm90aGluZyBpbiB0aGlzIHBhY2thZ2VcbiAqIGZvcmNlcyBhIHJlYnVpbGQuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVRvb2xzID0gVG9vbHNJbnB1dDtcblxuLyoqIFJlLWV4cG9ydCBvZiBNYXN0cmEncyBuYXRpdmUgYGNyZWF0ZVRvb2xgIGZvciBmdWxsLWZlYXR1cmUgYWNjZXNzLiAqL1xuZXhwb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcblxuLyoqXG4gKiBBcHBLaXQtc2hhcGVkIHRvb2wgZmFjdG9yeS4gTGV0cyB1c2VycyBtaXgtYW5kLW1hdGNoIHRvb2xzIGFjcm9zc1xuICogQXBwS2l0J3MgYGFnZW50c2AgcGx1Z2luIGFuZCBgbWFzdHJhYCB3aXRoIGEgc2luZ2xlIGltcG9ydDpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgdG9vbCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqIGltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG4gKlxuICogZ2V0X3dlYXRoZXI6IHRvb2woe1xuICogICBkZXNjcmlwdGlvbjogXCJXZWF0aGVyXCIsXG4gKiAgIHNjaGVtYTogei5vYmplY3QoeyBjaXR5OiB6LnN0cmluZygpIH0pLFxuICogICBleGVjdXRlOiBhc3luYyAoeyBjaXR5IH0pID0+IGBTdW5ueSBpbiAke2NpdHl9YCxcbiAqIH0pLFxuICogYGBgXG4gKlxuICogTWFwcyBvbnRvIE1hc3RyYSdzIGBjcmVhdGVUb29sYDpcbiAqXG4gKiAtIGBkZXNjcmlwdGlvbmAgLT4gYGRlc2NyaXB0aW9uYCAocmVxdWlyZWQpXG4gKiAtIGBzY2hlbWFgIC0+IGBpbnB1dFNjaGVtYWAgKG9wdGlvbmFsKVxuICogLSBgZXhlY3V0ZShpbnB1dClgIC0+IGBleGVjdXRlKGlucHV0LCBjdHgpYCAtIE1hc3RyYSBhbHJlYWR5IGNhbGxzXG4gKiAgIHRoZSBmaXJzdCBhcmcgd2l0aCB0aGUgcGFyc2VkIGlucHV0cywgc28gdGhlIGJvZHkgc2hhcGUgaXNcbiAqICAgaWRlbnRpY2FsLiBUaGUgTWFzdHJhIGBjb250ZXh0YCBhcmcgaXMgZm9yd2FyZGVkIGFzIHRoZSBzZWNvbmRcbiAqICAgcGFyYW1ldGVyIHdoZW4gdGhlIGNhbGxlciBkZWNsYXJlcyBpdC5cbiAqIC0gYGlkYDogb3B0aW9uYWwuIERlZmF1bHRzIHRvIGEgc3RhYmxlIGlkZW50aWZpZXIgZGVyaXZlZCBmcm9tXG4gKiAgIGBkZXNjcmlwdGlvbmAgKHNsdWdpZmllZCwgd2l0aCBhIHNob3J0IGhhc2ggc3VmZml4IGZvclxuICogICB1bmlxdWVuZXNzKS4gUGFzcyBhbiBleHBsaWNpdCBgaWRgIHdoZW4geW91IG5lZWQgYSBzdGFibGUgc3RyaW5nXG4gKiAgIGZvciB0cmFjaW5nIG9yIE1DUCBleHBvc3VyZS5cbiAqXG4gKiBSZWFjaCBmb3Ige0BsaW5rIGNyZWF0ZVRvb2x9IHdoZW4geW91IG5lZWQgTWFzdHJhLW9ubHkgZmllbGRzXG4gKiAoYG91dHB1dFNjaGVtYWAsIGBzdXNwZW5kU2NoZW1hYCwgYHJlcXVpcmVBcHByb3ZhbGAsIGBtY3BgLCBldGMuKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvb2wob3B0czogQXBwS2l0VG9vbE9wdGlvbnMpOiBUb29sIHtcbiAgY29uc3QgaWQgPSBvcHRzLmlkID8/IGRlcml2ZVRvb2xJZChvcHRzLmRlc2NyaXB0aW9uKTtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkLFxuICAgIGRlc2NyaXB0aW9uOiBvcHRzLmRlc2NyaXB0aW9uLFxuICAgIC4uLihvcHRzLnNjaGVtYSA/IHsgaW5wdXRTY2hlbWE6IG9wdHMuc2NoZW1hIGFzIG5ldmVyIH0gOiB7fSksXG4gICAgZXhlY3V0ZTogb3B0cy5leGVjdXRlIGFzIG5ldmVyLFxuICB9KTtcbn1cblxuLyoqXG4gKiBJbnB1dCBzaGFwZSBmb3IgdGhlIEFwcEtpdC1zdHlsZSB7QGxpbmsgdG9vbH0gZmFjdG9yeS4gQSB0cmltbWVkXG4gKiBzdWJzZXQgb2YgTWFzdHJhJ3MgYGNyZWF0ZVRvb2xgIG9wdGlvbnMgdGhhdCBtaXJyb3JzIHRoZVxuICogYEBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhYCBgdG9vbCh7IGRlc2NyaXB0aW9uLCBzY2hlbWEsIGV4ZWN1dGUgfSlgXG4gKiBzaWduYXR1cmUuXG4gKlxuICogR2VuZXJpY3MgYXJlIGludGVudGlvbmFsbHkgYWJzZW50IC0gaW5mZXJlbmNlIGZsb3dzIHRocm91Z2ggdGhlXG4gKiBjYWxsZXIncyBgc2NoZW1hYCAodHlwaWNhbGx5IGEgWm9kIG9iamVjdCksIGFuZCB0aGUgYGV4ZWN1dGVgIGJvZHlcbiAqIGRlc3RydWN0dXJlcyBuYXR1cmFsbHkgZnJvbSB0aGF0LiBSZWFjaCBmb3Ige0BsaW5rIGNyZWF0ZVRvb2x9IHdoZW5cbiAqIHlvdSBuZWVkIHRoZSBmdWxseS10eXBlZCBpbnB1dC9vdXRwdXQgc2NoZW1hcyB3aXJlZCBleHBsaWNpdGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcEtpdFRvb2xPcHRpb25zIHtcbiAgLyoqIE9wdGlvbmFsIHN0YWJsZSBpZGVudGlmaWVyOyBhdXRvLWRlcml2ZWQgZnJvbSBgZGVzY3JpcHRpb25gIHdoZW4gb21pdHRlZC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzaG93biB0byB0aGUgbW9kZWwuIFJlcXVpcmVkLiAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgaW5wdXQgc2NoZW1hIChhbnkgU3RhbmRhcmQgU2NoZW1hIGluc3RhbmNlLCBlLmcuIFpvZCkuXG4gICAqIE1hcHMgdG8gTWFzdHJhJ3MgYGlucHV0U2NoZW1hYDsgcGFzc2VkIHRocm91Z2ggdG8gdGhlIG1vZGVsXG4gICAqIHZlcmJhdGltLlxuICAgKi9cbiAgc2NoZW1hPzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEV4ZWN1dGUgYm9keS4gRmlyc3QgYXJnIGlzIHRoZSBwYXJzZWQgaW5wdXQgKHR5cGVkIG9mZiBgc2NoZW1hYFxuICAgKiB3aGVuIHN1cHBsaWVkKSwgc2Vjb25kIGFyZyBpcyB0aGUgZnVsbCBNYXN0cmEgZXhlY3V0aW9uIGNvbnRleHRcbiAgICogKHJlcXVlc3QgY29udGV4dCwgYWJvcnQgc2lnbmFsLCBtYXN0cmEgaW5zdGFuY2UpIGlmIHlvdSBuZWVkIGl0LlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZXhlY3V0ZTogKGlucHV0OiBhbnksIGNvbnRleHQ/OiB1bmtub3duKSA9PiB1bmtub3duO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgZGV0ZXJtaW5pc3RpYyBNYXN0cmEgdG9vbCBpZCBmcm9tIGEgZGVzY3JpcHRpb24uXG4gKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIHN0cmluZy50b1VuaXF1ZVNsdWd9OiBzbHVnICsgYWx3YXlzLW9uXG4gKiA2LWNoYXIgRk5WLTFhIGJhc2UtMzIgc3VmZml4IHNvIHR3byB0b29scyB3aXRoIHRoZSBzYW1lIGxlYWRpbmdcbiAqIHdvcmRzIGRvbid0IGNvbGxpZGUgaW4gdHJhY2VzLiBTdGFibGUgYWNyb3NzIHJ1bnMuXG4gKi9cbmZ1bmN0aW9uIGRlcml2ZVRvb2xJZChkZXNjcmlwdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRvVW5pcXVlU2x1ZyhkZXNjcmlwdGlvbiwgeyBmYWxsYmFja1ByZWZpeDogXCJ0b29sXCIgfSk7XG59XG5cbi8qKlxuICogSWRlbnRpdHkgaGVscGVyIHRoYXQgYnJhbmRzIGEgZGVmaW5pdGlvbiBhcyBhIE1hc3RyYSBhZ2VudC4gTWlycm9yc1xuICogQXBwS2l0J3MgYGNyZWF0ZUFnZW50KGRlZilgIHNvIHRoZSByZWdpc3RyYXRpb24gc2hhcGUgbWF0Y2hlczpcbiAqXG4gKiBgYGB0c1xuICogY29uc3Qgc3VwcG9ydCA9IGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiLFxuICogICBtb2RlbDogXCJkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02XCIsXG4gKiAgIHRvb2xzKHBsdWdpbnMpIHsgcmV0dXJuIHsgLi4uIH07IH0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEFkZHMgdGhlIHBhY2thZ2UncyBkZWZhdWx0IHdvcmtzcGFjZSB3aGVuIHRoZSBkZWZpbml0aW9uIG9taXRzIG9uZS4gVGhhdFxuICogd29ya3NwYWNlIGNhcnJpZXMgRGF0YWJyaWNrcyBza2lsbCBtb3VudHMgd2hpbGUgY29tbWFuZCBleGVjdXRpb24gc3RheXNcbiAqIGRpc2FibGVkIHVudGlsIGEgc2FuZGJveCBpcyBzZWxlY3RlZCBleHBsaWNpdGx5LiBBbiBleHBsaWNpdCB3b3Jrc3BhY2VcbiAqIHJlbWFpbnMgdGhlIGNhbGxlcidzIGNvbXBsZXRlIG92ZXJyaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWdlbnQ8XG4gIFRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93biA9IHVua25vd24sXG4gIFREZWZpbml0aW9uIGV4dGVuZHMgTWFzdHJhQWdlbnREZWZpbml0aW9uPFRSZXF1ZXN0Q29udGV4dD4gPVxuICAgIE1hc3RyYUFnZW50RGVmaW5pdGlvbjxUUmVxdWVzdENvbnRleHQ+LFxuPihkZWY6IFREZWZpbml0aW9uKTogVERlZmluaXRpb24ge1xuICBpZiAoZGVmLndvcmtzcGFjZSkgcmV0dXJuIHsgLi4uZGVmIH07XG4gIGNvbnN0IHdvcmtzcGFjZSA9IGRhdGFicmlja3NXb3Jrc3BhY2UoKTtcbiAgbWFya0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlKTtcbiAgcmV0dXJuIHsgLi4uZGVmLCB3b3Jrc3BhY2UgfTtcbn1cblxuLyoqXG4gKiBCcmFuZCBmb3IgYSB7QGxpbmsgV29ya3NwYWNlfSB0aGF0IGBjcmVhdGVBZ2VudGAgYnVpbHQgd2l0aCBubyBjYWxsZXJcbiAqIG9wdGlvbnMsIHNvIHtAbGluayBidWlsZEFnZW50c30gbWF5IHJlYnVpbGQgaXQgd2l0aCBzdGFydHVwLXByb3Zpc2lvbmVkXG4gKiBgZXh0cmFTa2lsbE1vdW50c2AgKGEgY2FsbGVyLXN1cHBsaWVkIHdvcmtzcGFjZSBpcyBuZXZlciB0b3VjaGVkKS5cbiAqL1xuY29uc3QgZGVmYXVsdFdvcmtzcGFjZXMgPSBuZXcgV2Vha1NldDxXb3Jrc3BhY2U+KCk7XG5cbi8qKiBCcmFuZCBgd29ya3NwYWNlYCBhcyB0aGUgYXV0by1jcmVhdGVkIGRlZmF1bHQuICovXG5mdW5jdGlvbiBtYXJrRGVmYXVsdFdvcmtzcGFjZSh3b3Jrc3BhY2U6IFdvcmtzcGFjZSk6IHZvaWQge1xuICBkZWZhdWx0V29ya3NwYWNlcy5hZGQod29ya3NwYWNlKTtcbn1cblxuLyoqIFdoZXRoZXIgYHdvcmtzcGFjZWAgd2FzIGF1dG8tY3JlYXRlZCBieSB7QGxpbmsgY3JlYXRlQWdlbnR9LiAqL1xuZnVuY3Rpb24gaXNEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZTogV29ya3NwYWNlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiB3b3Jrc3BhY2UgIT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0V29ya3NwYWNlcy5oYXMod29ya3NwYWNlKTtcbn1cblxuLyoqXG4gKiBGaWx0ZXIgLyByZW5hbWUgb3B0aW9ucyBhY2NlcHRlZCBieSBldmVyeSBwbHVnaW4ncyBgLnRvb2xraXQoKWBcbiAqIG1ldGhvZCwgZGlyZWN0bHkgc291cmNlZCBmcm9tIEFwcEtpdCdzIHB1YmxpYyBiZXRhIGNvbnRyYWN0LlxuICovXG5leHBvcnQgdHlwZSBUb29sa2l0T3B0aW9ucyA9IEFwcEtpdFRvb2xraXRPcHRpb25zO1xuXG4vKipcbiAqIFRvb2xraXQgcHJvdmlkZXIgc2hhcGUgZXZlcnkgZW50cnkgaW4gdGhlIHtAbGluayBNYXN0cmFQbHVnaW5zfSBtYXBcbiAqIGV4cG9zZXMuIElkZW50aWNhbCB0byBBcHBLaXQncyBgUGx1Z2luVG9vbGtpdFByb3ZpZGVyYCAtIGFueSBBcHBLaXRcbiAqIHBsdWdpbiB0aGF0IGltcGxlbWVudHMgdGhlIHN0YW5kYXJkIGBUb29sUHJvdmlkZXJgIGludGVyZmFjZVxuICogKGBnZXRBZ2VudFRvb2xzYCArIGBleGVjdXRlQWdlbnRUb29sYCArIGB0b29sa2l0YCkgaXMgcmVhY2hhYmxlXG4gKiB0aHJvdWdoIHRoaXMgc3VyZmFjZSBhdXRvbWF0aWNhbGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgTWFzdHJhLXNoYXBlZCB0b29scyByZWNvcmQgYWRhcHRlZCBmcm9tIHRoZSBwbHVnaW4nc1xuICAgKiBhZ2VudCB0b29scy4gRWFjaCB0b29sIGRpc3BhdGNoZXMgYmFjayB0aHJvdWdoIHRoZSBwbHVnaW4nc1xuICAgKiBgZXhlY3V0ZUFnZW50VG9vbGAgc28gT0JPIGF1dGggYW5kIHRlbGVtZXRyeSBzcGFucyBzdGF5IGludGFjdC5cbiAgICovXG4gIHRvb2xraXQob3B0cz86IFRvb2xraXRPcHRpb25zKTogTWFzdHJhVG9vbHMgfCBQcm9taXNlPE1hc3RyYVRvb2xzPjtcbn1cblxuLyoqXG4gKiBQbHVnaW4gbWFwIGhhbmRlZCB0byB0aGUgZnVuY3Rpb24gZm9ybSBvZlxuICoge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi50b29sc30uIE1pcnJvcnMgQXBwS2l0J3MgYFBsdWdpbnNgXG4gKiB0eXBlIGV4YWN0bHk6IGEgc3RyaW5nLWtleWVkIHJlY29yZCB3aGVyZSBldmVyeSB2YWx1ZSBleHBvc2VzXG4gKiBgLnRvb2xraXQob3B0cylgLlxuICpcbiAqIEltcGxlbWVudGVkIGFzIGEgcnVudGltZSBQcm94eSB0aGF0IGF1dG8tZGlzY292ZXJzIGFueSByZWdpc3RlcmVkXG4gKiBBcHBLaXQgcGx1Z2luIGltcGxlbWVudGluZyB0aGUgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYGFuYWx5dGljc2AsIGBmaWxlc2AsIGBsYWtlYmFzZWAsIGBnZW5pZWAsIHBsdXMgYW55IHRoaXJkLXBhcnR5XG4gKiBwbHVnaW4gdGhhdCBkb2VzIHRoZSBzYW1lKS4gVW5rbm93biBuYW1lcyByZXNvbHZlIHRvIGB1bmRlZmluZWRgXG4gKiBhdCBydW50aW1lLCBzbyBndWFyZCB3aXRoIGA/LmAgYW5kIGA/PyB7fWAgd2hlbiBzcHJlYWRpbmcgZnJvbSBhXG4gKiBwbHVnaW4gdGhhdCBtYXkgbm90IGJlIHJlZ2lzdGVyZWQgaW4gZXZlcnkgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogXCIuLi5cIixcbiAqICAgYXN5bmMgdG9vbHMocGx1Z2lucykge1xuICogICAgIHJldHVybiB7XG4gKiAgICAgICAuLi4oYXdhaXQgcGx1Z2lucy5hbmFseXRpY3MudG9vbGtpdCgpKSxcbiAqICAgICAgIC4uLihhd2FpdCBwbHVnaW5zLmZpbGVzLnRvb2xraXQoeyBvbmx5OiBbXCJ1cGxvYWRzLnJlYWRcIl0gfSkpLFxuICogICAgICAgZ2V0X3dlYXRoZXI6IHRvb2woe1xuICogICAgICAgICBkZXNjcmlwdGlvbjogXCJXZWF0aGVyXCIsXG4gKiAgICAgICAgIHNjaGVtYTogei5vYmplY3QoeyBjaXR5OiB6LnN0cmluZygpIH0pLFxuICogICAgICAgICBleGVjdXRlOiBhc3luYyAoeyBjaXR5IH0pID0+IGBTdW5ueSBpbiAke2NpdHl9YCxcbiAqICAgICAgIH0pLFxuICogICAgIH07XG4gKiAgIH0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFQbHVnaW5zID0gUmVjb3JkPHN0cmluZywgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyPjtcblxuLyoqIEZ1bmN0aW9uIGZvcm0gb2Yge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi50b29sc30uICovXG5leHBvcnQgdHlwZSBNYXN0cmFUb29sc0ZuID0gKHBsdWdpbnM6IE1hc3RyYVBsdWdpbnMpID0+IE1hc3RyYVRvb2xzIHwgUHJvbWlzZTxNYXN0cmFUb29scz47XG5cbi8qKiBGdW5jdGlvbiBmb3JtIG9mIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb24ud29ya3NwYWNlfTsgYHVuZGVmaW5lZGAgZGlzYWJsZXMgaXQgZm9yIHRoaXMgYWdlbnQuICovXG5leHBvcnQgdHlwZSBNYXN0cmFBZ2VudFdvcmtzcGFjZVJlc29sdmVyID0gKCkgPT4gV29ya3NwYWNlIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgY29kZS1kZWZpbmVkIE1hc3RyYSBhZ2VudC4gTWlycm9ycyB0aGUgc2hhcGUgQXBwS2l0J3MgYGFnZW50c2BcbiAqIHBsdWdpbiB1c2VzIGZvciBgQWdlbnREZWZpbml0aW9uYC4gVGhlIHJlZ2lzdHJ5IGtleSB1bmRlclxuICogYGNvbmZpZy5hZ2VudHNgIGlzIHRoZSBgYWdlbnRJZGAgdGhlIGNsaWVudCBzdHJlYW1zIGFnYWluc3Q7IGBuYW1lYFxuICogaXMgcHVyZWx5IGluZm9ybWF0aW9uYWwgKGRlZmF1bHRzIHRvIHRoZSBrZXkpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYUFnZW50RGVmaW5pdGlvbjxcbiAgVFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duID0gdW5rbm93bixcbj4ge1xuICAvKiogRGlzcGxheSBuYW1lIHVzZWQgYXMgYEFnZW50Lm5hbWVgLiBEZWZhdWx0cyB0byB0aGUgcmVnaXN0cnkga2V5LiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgbG9uZy1mb3JtIGRlc2NyaXB0aW9uOyBzdXJmYWNlZCBhcyBgQWdlbnQuZGVzY3JpcHRpb25gLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN0YXRpYyBvciByZXF1ZXN0LWNvbnRleHQtYXdhcmUgc3lzdGVtIGluc3RydWN0aW9ucy4gKi9cbiAgaW5zdHJ1Y3Rpb25zOiBBZ2VudENvbmZpZzxzdHJpbmcsIFRvb2xzSW5wdXQsIHVuZGVmaW5lZCwgVFJlcXVlc3RDb250ZXh0PltcImluc3RydWN0aW9uc1wiXTtcbiAgLyoqIE5hdGl2ZSBNYXN0cmEgc2NoZW1hIHRoYXQgdmFsaWRhdGVzIGFuZCB0eXBlcyBhcHBsaWNhdGlvbiByZXF1ZXN0IGNvbnRleHQuICovXG4gIHJlcXVlc3RDb250ZXh0U2NoZW1hPzogQWdlbnRDb25maWc8XG4gICAgc3RyaW5nLFxuICAgIFRvb2xzSW5wdXQsXG4gICAgdW5kZWZpbmVkLFxuICAgIFRSZXF1ZXN0Q29udGV4dFxuICA+W1wicmVxdWVzdENvbnRleHRTY2hlbWFcIl07XG4gIC8qKlxuICAgKiBNYXN0cmEtbmF0aXZlIHBlci1jYWxsIGFwcHJvdmFsIGdhdGUgZm9yIHRoaXMgYWdlbnQncyB0b29scy4gU3VwcG9ydHMgYW5cbiAgICogYXN5bmMgQ2xhc3NpZmllci1iYWNrZWQgZnVuY3Rpb247IHRvb2wtbGV2ZWwgYXBwcm92YWwgcmVtYWlucyBhdXRob3JpdGF0aXZlLlxuICAgKi9cbiAgcmVxdWlyZVRvb2xBcHByb3ZhbD86IEFnZW50RXhlY3V0aW9uT3B0aW9uc1tcInJlcXVpcmVUb29sQXBwcm92YWxcIl07XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgbW9kZWwgb3ZlcnJpZGUuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBmYWxscyBiYWNrIHRvIHRoZSB3b3Jrc3BhY2VcbiAgICogICBgL3NlcnZpbmctZW5kcG9pbnRzYCByZXNvbHZlciB0aGF0IHtAbGluayBidWlsZE1vZGVsfSBjb25maWd1cmVzXG4gICAqICAgZnJvbSB0aGUgcGVyLXJlcXVlc3QgYFdvcmtzcGFjZUNsaWVudGAuXG4gICAqIC0gYHN0cmluZ2A6IHNob3J0aGFuZCBmb3IgXCJ1c2UgdGhlIGRlZmF1bHQgcmVzb2x2ZXIgYnV0IHN3YXAgdGhlXG4gICAqICAgYG1vZGVsSWRgXCIgKGUuZy4gYFwiZGF0YWJyaWNrcy1tZXRhLWxsYW1hLTMtMy03MGItaW5zdHJ1Y3RcImApLlxuICAgKiAtIEFueSBvdGhlciBNYXN0cmEgYER5bmFtaWNBcmd1bWVudDxNYXN0cmFNb2RlbENvbmZpZz5gOiBwYXNzZWRcbiAgICogICBzdHJhaWdodCB0aHJvdWdoIHRvIGBBZ2VudC5tb2RlbGAuIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgZnVsbFxuICAgKiAgIGNvbnRyb2wgb3ZlciBhdXRoIG9yIHByb3ZpZGVySWQuXG4gICAqL1xuICBtb2RlbD86IEFnZW50Q29uZmlnPHN0cmluZywgVG9vbHNJbnB1dCwgdW5kZWZpbmVkLCBUUmVxdWVzdENvbnRleHQ+W1wibW9kZWxcIl0gfCBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgdG9vbCByZWNvcmQuIEVpdGhlciBhIHBsYWluIG1hcCBvciBhIGNhbGxiYWNrIHRoYXRcbiAgICogcmVjZWl2ZXMgdGhlIHR5cGVkIHtAbGluayBNYXN0cmFQbHVnaW5zfSBzaWJsaW5nLXBsdWdpbiBpbmRleCBhbmRcbiAgICogcmV0dXJucyBhIG1hcC4gVGhlIGNhbGxiYWNrIHJ1bnMgZXhhY3RseSBvbmNlIGF0IGFnZW50IHNldHVwOyB0aGVcbiAgICogcmVzdWx0IGlzIGNhY2hlZCBmb3IgdGhlIGFnZW50J3MgbGlmZXRpbWUuXG4gICAqL1xuICB0b29scz86IE1hc3RyYVRvb2xzIHwgTWFzdHJhVG9vbHNGbjtcbiAgLyoqXG4gICAqIFBlci1hZ2VudCBzZW1hbnRpYyByZWNhbGwgKFBnVmVjdG9yKSBvdmVycmlkZS4gQ2FzY2FkZXMgZnJvbVxuICAgKiBgY29uZmlnLm1lbW9yeWA7IHRoZSBhZ2VudCB2YWx1ZSB3aW5zIHdoZW4gc2V0LlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogaW5oZXJpdCBgY29uZmlnLm1lbW9yeWAuIFdoZW4gdGhhdCdzXG4gICAqICAgZW5hYmxlZCwgdGhlIGFnZW50ICoqc2hhcmVzIHRoZSBwbHVnaW4tbGV2ZWwgc2luZ2xldG9uIGBQZ1ZlY3RvcmBcbiAgICogICBpbnN0YW5jZSoqIChjcm9zcy1hZ2VudCBzZW1hbnRpYyByZWNhbGwgYWNyb3NzIHRoZSBzYW1lIGluZGV4KS5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIHNlbWFudGljIHJlY2FsbCBmb3IgdGhpcyBhZ2VudCBvbmx5LlxuICAgKiAtIGB0cnVlYDogZW5hYmxlIHVzaW5nIHRoZSBzaGFyZWQgc2luZ2xldG9uIChzYW1lIGFzIGRlZmF1bHQgd2hlblxuICAgKiAgIHBsdWdpbiBtZW1vcnkgaXMgZW5hYmxlZDsgdXNlZnVsIHRvIG9wdCBpbiB3aGVuIHBsdWdpbiBkaXNhYmxlZCkuXG4gICAqIC0ge0BsaW5rIE1hc3RyYU1lbW9yeUNvbmZpZ30gb2JqZWN0OiBkZWRpY2F0ZWQgYFBnVmVjdG9yYCBmb3IgdGhpc1xuICAgKiAgIGFnZW50IChwcml2YXRlIHJlY2FsbCBpbmRleCkuIEJ5cGFzc2VzIHRoZSBzaGFyZWQgc2luZ2xldG9uLlxuICAgKi9cbiAgbWVtb3J5PzogYm9vbGVhbiB8IE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlO1xuICAvKipcbiAgICogUGVyLWFnZW50IHRocmVhZC9tZXNzYWdlIHN0b3JhZ2UgKGBQb3N0Z3Jlc1N0b3JlYCkgb3ZlcnJpZGUuXG4gICAqIENhc2NhZGVzIGZyb20gYGNvbmZpZy5zdG9yYWdlYDsgdGhlIGFnZW50IHZhbHVlIHdpbnMgd2hlbiBzZXQuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBpbmhlcml0IGBjb25maWcuc3RvcmFnZWAuIFdoZW4gdGhhdCdzXG4gICAqICAgZW5hYmxlZCwgdGhlIGFnZW50IGdldHMgaXRzICoqb3duIHBlci1hZ2VudCBgUG9zdGdyZXNTdG9yZWAqKlxuICAgKiAgIGtleWVkIGJ5IHtAbGluayBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lfSBzbyB0aHJlYWRzIGFuZFxuICAgKiAgIG1lc3NhZ2VzIHN0YXkgaXNvbGF0ZWQgYmV0d2VlbiBhZ2VudHMgaW4gdGhlIHNhbWUgZGF0YWJhc2UuXG4gICAqIC0gYGZhbHNlYDogZGlzYWJsZSBzdG9yYWdlIGZvciB0aGlzIGFnZW50IG9ubHkgKHB1cmVseSBpbi1tZW1vcnkpLlxuICAgKiAtIGB0cnVlYDogZW5hYmxlIHdpdGggdGhlIHBlci1hZ2VudCBkZWZhdWx0IHNjaGVtYS5cbiAgICogLSB7QGxpbmsgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlfSBvYmplY3Q6IGRlZGljYXRlZFxuICAgKiAgIGBQb3N0Z3Jlc1N0b3JlYCBjb25maWcgKGN1c3RvbSBzY2hlbWEsIGNvbm5lY3Rpb24sIGV0Yy4pLlxuICAgKi9cbiAgc3RvcmFnZT86IGJvb2xlYW4gfCBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGU7XG4gIC8qKlxuICAgKiBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0gZm9yIHRoaXMgYWdlbnQgKGZpbGVzeXN0ZW0sIHNhbmRib3gsIG9yIG90aGVyXG4gICAqIHByb3ZpZGVycykuIEFzc2lzdGFudCBza2lsbHMgZnJvbSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBwYXRocyBhcmUgd2lyZWRcbiAgICogdmlhIHtAbGluayBkYXRhYnJpY2tzV29ya3NwYWNlfS5cbiAgICovXG4gIHdvcmtzcGFjZT86IFdvcmtzcGFjZSB8IE1hc3RyYUFnZW50V29ya3NwYWNlUmVzb2x2ZXI7XG59XG5cbi8qKiBUeXBlLWVyYXNlZCByZWdpc3RyeSBtZW1iZXI7IGVhY2ggZGVmaW5pdGlvbiByZXRhaW5zIHR5cGluZyBhdCBgY3JlYXRlQWdlbnRgLiAqL1xuZXhwb3J0IHR5cGUgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uID0gTWFzdHJhQWdlbnREZWZpbml0aW9uPGFueT47XG5cbi8qKlxuICogRGlzdHJpYnV0aXZlIGBPbWl0YCBzbyB1bmlvbnMgaW4gYFBvc3RncmVzU3RvcmVDb25maWdgIC9cbiAqIGBQZ1ZlY3RvckNvbmZpZ2Aga2VlcCB0aGVpciBkaXNjcmltaW5hbnRzIGFmdGVyIHRoZSBvdmVycmlkZSB0eXBlc1xuICogc3RyaXAgYGlkYC4gVGhlIGJ1aWx0LWluIGBPbWl0YCBjb2xsYXBzZXMgdW5pb25zIHRvIG9uZSBzaGFwZSB3aXRoXG4gKiBjb21tb24gZmllbGRzIG9ubHksIHdoaWNoIGxvc2VzIHRoZSBjb25uZWN0aW9uLXN0eWxlIGRpc2NyaW1pbmFudHMuXG4gKi9cbnR5cGUgRGlzdHJpYnV0aXZlT21pdDxULCBLIGV4dGVuZHMga2V5b2YgbmV2ZXI+ID0gVCBleHRlbmRzIHVua25vd24gPyBPbWl0PFQsIEs+IDogbmV2ZXI7XG5cbi8qKlxuICogYFBvc3RncmVzU3RvcmVDb25maWdgIG1pbnVzIGBpZGAgLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFjY2VwdCBhbnlcbiAqIE1hc3RyYS1zdXBwb3J0ZWQgc3RvcmFnZSBzaGFwZS4gYGlkYCBpcyBmaWxsZWQgaW4gYXV0b21hdGljYWxseVxuICogZnJvbSB0aGUgYWdlbnQgcmVnaXN0cnkga2V5IHNvIHRyYWNlcyBzdGF5IHN0YWJsZS5cbiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlID0gRGlzdHJpYnV0aXZlT21pdDxQb3N0Z3Jlc1N0b3JlQ29uZmlnLCBcImlkXCI+ICYge1xuICBpZD86IHN0cmluZztcbn07XG5cbi8qKlxuICogYFBnVmVjdG9yQ29uZmlnYCBtaW51cyBgaWRgIC0gcGVyLWFnZW50IG92ZXJyaWRlcyBhY2NlcHQgYW55XG4gKiBNYXN0cmEtc3VwcG9ydGVkIHZlY3RvciBzaGFwZS4gYGlkYCBpcyBmaWxsZWQgaW4gYXV0b21hdGljYWxseVxuICogZnJvbSB0aGUgYWdlbnQgcmVnaXN0cnkga2V5LlxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZSA9IERpc3RyaWJ1dGl2ZU9taXQ8UGdWZWN0b3JDb25maWcsIFwiaWRcIj4gJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqIEhvdyBhbiBhZ2VudCdzIHVucGlubmVkIG1vZGVsIGlzIHJlc29sdmVkLiAqL1xuZXhwb3J0IHR5cGUgQWdlbnREZWZhdWx0TW9kZWwgPVxuICB7IGtpbmQ6IFwiYXV0b1wiIH0gfCB7IGtpbmQ6IFwiY29uZmlndXJlZFwiOyBtb2RlbDogc3RyaW5nIH0gfCB7IGtpbmQ6IFwiZHluYW1pY1wiIH07XG5cbi8qKiBPdXRwdXQgb2Yge0BsaW5rIGJ1aWxkQWdlbnRzfTogcmVzb2x2ZWQgYWdlbnRzIHBsdXMgdGhlIGRlZmF1bHQgaWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWx0QWdlbnRzIHtcbiAgYWdlbnRzOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudD47XG4gIGRlZmF1bHRBZ2VudElkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEZWZhdWx0IG1vZGVsIGludGVudCBwZXIgYWdlbnQgaWQuIEFuIHVuY29uZmlndXJlZCBhZ2VudCBpcyBgXCJhdXRvXCJgIGFuZFxuICAgKiByZXNvbHZlcyB0aGUgaGlnaGVzdC1yYW5rZWQgbGl2ZSBlbmRwb2ludDsgYSBzdHJpbmcgaXMgYFwiY29uZmlndXJlZFwiYDsgYVxuICAgKiBjdXN0b20gZnVuY3Rpb24gaXMgYFwiZHluYW1pY1wiYC4gQ29uc3VtZWQgYnkgdGhlIHBsdWdpbidzXG4gICAqIGBHRVQgL2RlZmF1bHQtbW9kZWxgIHJvdXRlLlxuICAgKi9cbiAgZGVmYXVsdE1vZGVsczogUmVjb3JkPHN0cmluZywgQWdlbnREZWZhdWx0TW9kZWw+O1xuICAvKipcbiAgICogQW1iaWVudCB0b29scyBzaGFyZWQgYWNyb3NzIGV2ZXJ5IGFnZW50ICh0aGUgYnVpbHQtaW4gc3lzdGVtIHRvb2xzXG4gICAqIHNwcmVhZCB3aXRoIGBjb25maWcudG9vbHNgKS4gU3VyZmFjZWQgc28gdGhlIG9wdGlvbmFsIE1DUCBzZXJ2ZXJcbiAgICogY2FuIHJlLWV4cG9zZSB0aGVtIHdoZW4ge0BsaW5rIE1hc3RyYU1jcENvbmZpZy50b29sc30gaXMgZW5hYmxlZC5cbiAgICovXG4gIGFtYmllbnRUb29sczogTWFzdHJhVG9vbHM7XG59XG5cbi8qKiBGYWxsYmFjayBhZ2VudCBpZCB1c2VkIHdoZW4gYGNvbmZpZy5hZ2VudHNgIGlzIG9taXR0ZWQgZW50aXJlbHkuICovXG5leHBvcnQgY29uc3QgRkFMTEJBQ0tfQUdFTlRfSUQgPSBcImRlZmF1bHRcIjtcblxuLyoqXG4gKiBEZWZhdWx0IHBlci10dXJuIHN0ZXAgY2VpbGluZyBhcHBsaWVkIHRvIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnRcbiAqIHdoZW4ge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudE1heFN0ZXBzfSBpcyB1bnNldC4gU2l6ZWQgdG9cbiAqIGZpdCBhIGRlY29tcG9zZWQgR2VuaWUgdHVybiAoZ3JvdW5kaW5nICsgc2V2ZXJhbCBgYXNrX2dlbmllYFxuICogY2FsbHMgKyBgcHJlcGFyZV9jaGFydGAgcGVyIGRhdGFzZXQgKyB0aGUgZmluYWwtdGV4dCByZXBseSkgd2l0aFxuICogaGVhZHJvb20gZm9yIHRoZSBtb2RlbCB0byBjaGFpbiBhIGNvdXBsZSBvZiBmb2xsb3ctdXBzIGJlZm9yZVxuICogYW5zd2VyaW5nIC0gd2VsbCBhYm92ZSBNYXN0cmEncyBvd24gYGFnZW50LmdlbmVyYXRlYCBkZWZhdWx0IG9mXG4gKiA1LCB3aGljaCB3b3VsZCBjdXQgbXVsdGktc3RlcCBvcmNoZXN0cmF0aW9uIG9mZiBtaWQtbG9vcC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQUdFTlRfTUFYX1NURVBTID0gMjU7XG5cbmNvbnN0IEVWRU5URURfQ09OU1RSVUNUT1JfTU9ERUwgPSB7XG4gIHNwZWNpZmljYXRpb25WZXJzaW9uOiBcInYzXCIsXG4gIHByb3ZpZGVyOiBcImRieC10b29sc1wiLFxuICBtb2RlbElkOiBcImRlZmVycmVkXCIsXG4gIHN1cHBvcnRlZFVybHM6IHt9LFxuICBhc3luYyBkb0dlbmVyYXRlKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkRlZmVycmVkIGV2ZW50ZWQgY29uc3RydWN0b3IgbW9kZWwgbXVzdCBub3QgZXhlY3V0ZVwiKTtcbiAgfSxcbiAgYXN5bmMgZG9TdHJlYW0oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGVmZXJyZWQgZXZlbnRlZCBjb25zdHJ1Y3RvciBtb2RlbCBtdXN0IG5vdCBleGVjdXRlXCIpO1xuICB9LFxufSBhcyBuZXZlcjtcblxuLyoqXG4gKiBgRXZlbnRlZEFnZW50YCBkZWxlZ2F0ZXMgbW9kZWwgcmVzb2x1dGlvbiB0byB0aGUgd3JhcHBlZCBhZ2VudCBhdCBleGVjdXRpb25cbiAqIHRpbWUsIGJ1dCBpdHMgY29uc3RydWN0b3IgYWxzbyBwcm9iZXMgYW4gdW50eXBlZCBgX19tb2RlbGAgc2xvdCBhbmQgb3RoZXJ3aXNlXG4gKiBjYWxscyBgZ2V0TW9kZWwoKWAgd2l0aCBhbiBlbXB0eSByZXF1ZXN0IGNvbnRleHQuIFRlbXBvcmFyaWx5IGZpbGxpbmcgdGhhdFxuICogcHJvYmUgYXZvaWRzIGFuIGVhZ2VyIHNlcnZpY2UtcHJpbmNpcGFsIGxvb2t1cCB3aGlsZSBwcmVzZXJ2aW5nIHRoZSB3cmFwcGVkXG4gKiBhZ2VudCdzIHJlcXVlc3Qtc2NvcGVkIG1vZGVsIHJlc29sdmVyIGZvciByZWFsIHR1cm5zLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCYWNrZ3JvdW5kQWdlbnQoYWdlbnQ6IEFnZW50LCBtYXhTdGVwczogbnVtYmVyKTogQWdlbnQge1xuICBjb25zdCBtb2RlbFNsb3QgPSBcIl9fbW9kZWxcIjtcbiAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYWdlbnQsIG1vZGVsU2xvdCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhZ2VudCwgbW9kZWxTbG90LCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiBFVkVOVEVEX0NPTlNUUlVDVE9SX01PREVMLFxuICB9KTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gY3JlYXRlRXZlbnRlZEFnZW50KHsgYWdlbnQsIG1heFN0ZXBzIH0pIGFzIHVua25vd24gYXMgQWdlbnQ7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGRlc2NyaXB0b3IpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhZ2VudCwgbW9kZWxTbG90LCBkZXNjcmlwdG9yKTtcbiAgICBlbHNlIGRlbGV0ZSAoYWdlbnQgYXMgQWdlbnQgJiB7IF9fbW9kZWw/OiB1bmtub3duIH0pLl9fbW9kZWw7XG4gIH1cbn1cblxuY29uc3QgRkFMTEJBQ0tfQUdFTlRfSU5TVFJVQ1RJT05TID0gYFlvdSBhcmUgYSBkYXRhIGFuYWx5c3QuIFRoZSB1c2VyIHdpbGwgYXNrIHF1ZXN0aW9ucyBhYm91dFxuYnVzaW5lc3MgbWV0cmljcyBhbmQgbWF5IHNoYXJlIHBlcnNvbmFsIHByZWZlcmVuY2VzIHlvdSBzaG91bGQgcmVtZW1iZXIgYWNyb3NzIHR1cm5zLlxuXG5SdWxlczpcblxuMS4gUXVvdGUgbnVtYmVycyBleGFjdGx5LiBOZXZlciBpbnZlbnQgZGF0YS5cbjIuIFdoZW4gdGhlIHVzZXIgc3RhdGVzIGEgcHJlZmVyZW5jZSBvciBkdXJhYmxlIGZhY3QgYWJvdXQgdGhlbXNlbHZlc1xuICAgKFwiSSdtIGluIEVVIHNvIHVzZSBFVVJcIiwgXCJhbHdheXMgc2hvdyBtZSB0aGUgU1FMXCIpLCBhY2tub3dsZWRnZSB0aGF0XG4gICB5b3Ugd2lsbCByZW1lbWJlciBpdC5cbjMuIElmIHlvdSBkb24ndCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBhbnN3ZXIsIGFzayBhIGNsYXJpZnlpbmdcbiAgIHF1ZXN0aW9uIGluc3RlYWQgb2YgZ3Vlc3NpbmcuYDtcblxuLyoqIFRvb2wtY2FsbCBndWlkYW5jZSBhcHBlbmRlZCB0byBldmVyeSByZWdpc3RlcmVkIGFnZW50LiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVE9PTF9XT1JLRkxPV19JTlNUUlVDVElPTlMgPSBbXG4gIFwiVG9vbCB3b3JrZmxvdzpcIixcbiAgXCJXaGVuIHRoZSBhY3RpdmUgbW9kZWwgc3VwcG9ydHMgaXQsIGNhbGwgbXVsdGlwbGUgdG9vbHMgaW4gdGhlIHNhbWUgdHVybiB3aGVuIHRoZWlyIGlucHV0cyBhcmUgaW5kZXBlbmRlbnQsIGluY2x1ZGluZyBtdWx0aXBsZSBjYWxscyB0byB0aGUgc2FtZSB0b29sLlwiLFxuICBcIktlZXAgY2FsbHMgc2VxdWVudGlhbCB3aGVuIGEgbGF0ZXIgaW5wdXQgZGVwZW5kcyBvbiBhbiBlYXJsaWVyIHJlc3VsdCBvciB3aGVuIGNhbGxzIG11dGF0ZSB0aGUgc2FtZSByZXNvdXJjZS5cIixcbl0uam9pbihcIlxcblwiKTtcblxuLyoqIEh5YnJpZCByb3V0aW5nIGd1aWRhbmNlIGFwcGVuZGVkIGFmdGVyIE1hc3RyYSdzIGdlbmVyYXRlZCBDb2RlIE1vZGUgY29udHJhY3QuICovXG5leHBvcnQgY29uc3QgQ09ERV9NT0RFX1JPVVRJTkdfSU5TVFJVQ1RJT05TID0gW1xuICBcIlRvb2wgcm91dGluZzpcIixcbiAgXCJUaGUgQ29kZSBNb2RlIGNvbnRyYWN0IGFib3ZlIGV4cGxhaW5zIGhvdyB0byB1c2UgZXhlY3V0ZV90eXBlc2NyaXB0IHdoZW4gc2VsZWN0ZWQ7IGl0IGRvZXMgbm90IHJlcXVpcmUgdXNpbmcgQ29kZSBNb2RlIGZvciBldmVyeSB0b29sIGNhbGwuXCIsXG4gIFwiQ2FsbCBhIGRpcmVjdGx5IGV4cG9zZWQgdG9vbCBkaXJlY3RseSB3aGVuIG9uZSBvcmRpbmFyeSBjYWxsIGlzIHN1ZmZpY2llbnQuXCIsXG4gIFwiQ2FsbCBpbmRlcGVuZGVudCB0b29scyBkaXJlY3RseSBpbiBwYXJhbGxlbCB3aGVuIHRoZWlyIHJlc3VsdHMgZG8gbm90IHJlcXVpcmUgY29kZS1zaWRlIHRyYW5zZm9ybWF0aW9uLlwiLFxuICBcIktlZXAgZGVwZW5kZW50IGNhbGxzIGFzIGRpcmVjdCBzZXF1ZW50aWFsIHRvb2wgY2FsbHMgd2hlbiBjb2RlLXNpZGUgdHJhbnNmb3JtYXRpb24gaXMgdW5uZWNlc3NhcnkuXCIsXG4gIFwiVXNlIGV4ZWN1dGVfdHlwZXNjcmlwdCB3aGVuIHRoZSB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdHMgQ29kZSBNb2RlIG9yIHdoZW4gY29kZSBpcyB1c2VmdWwgZm9yIGxvb3BzLCBmaWx0ZXJpbmcsIGpvaW5zLCByYW5kb20gc2VsZWN0aW9uLCBhZ2dyZWdhdGlvbiwgYXJpdGhtZXRpYywgZHluYW1pYyBmYW4tb3V0LCBvciBrZWVwaW5nIHN1YnN0YW50aWFsIGludGVybWVkaWF0ZSByZXN1bHRzIG91dCBvZiBtb2RlbCBjb250ZXh0LlwiLFxuICBcIkRvIG5vdCB3cmFwIGEgc2luZ2xlIG9yZGluYXJ5IHRvb2wgY2FsbCBpbiBleGVjdXRlX3R5cGVzY3JpcHQuXCIsXG5dLmpvaW4oXCJcXG5cIik7XG5cbi8qKlxuICogU3R5bGUgZ3VhcmRyYWlscyBhcHBlbmRlZCB0byBldmVyeSBhZ2VudCdzIGBpbnN0cnVjdGlvbnNgIHRvIGN1cmJcbiAqIGNvbW1vbiBMTE0taXNtcyAoZW0gZGFzaGVzLCBlbW9qaXMsIHN5Y29waGFudGljIG9wZW5lcnMsIGV4Y2Vzc2l2ZVxuICogaGVkZ2luZywgdGhyb3dhd2F5IGNsb3NlcnMpLiBBcHBlbmRlZCByYXRoZXIgdGhhbiBwcmVwZW5kZWQgc28gdGhlXG4gKiBhZ2VudCdzIHJvbGUvY29udGV4dCBjb21lcyBmaXJzdDsgdGhlIG1vZGVsJ3MgcmVjZW5jeSBiaWFzIHRoZW5cbiAqIGhlbHBzIHRoZSBzdHlsZSBydWxlcyBkb21pbmF0ZSB0aGUgcmVzcG9uc2Ugc3VyZmFjZS5cbiAqXG4gKiBPdmVycmlkZSBnbG9iYWxseSB2aWEge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5zdHlsZUluc3RydWN0aW9uc31cbiAqIChwYXNzIGBmYWxzZWAgdG8gZGlzYWJsZSBlbnRpcmVseSwgb3IgYSBzdHJpbmcgdG8gcmVwbGFjZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUyA9IFtcbiAgXCJPdXRwdXQgc3R5bGU6XCIsXG4gIFwiXCIsXG4gIFwiVXNlIG1hcmtkb3duIGZvcm1hdHRpbmcsIGluY2x1ZGluZyBoZWFkaW5ncywgbGlzdHMsIGFuZCBjb2RlIGJsb2Nrcy5cIixcbiAgXCJBdm9pZCBsaXN0cyBhbmQgaGVhZGVycyBmb3Igc2hvcnQgcmVwbGllcy5cIixcbiAgXCJQbGFpbiBwcm9zZS5cIixcbiAgVFlQT0dSQVBIWV9SVUxFLFxuICBcIlNraXAgb3BlbmVycyBsaWtlICdHcmVhdCBxdWVzdGlvbicsICdBYnNvbHV0ZWx5JywgYW5kICdJJ2QgYmUgaGFwcHkgdG8gaGVscCcuXCIsXG4gIFwiU2tpcCBjbG9zZXJzIGxpa2UgJ0xldCBtZSBrbm93IGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMnLlwiLFxuICBcIlNraXAgc2VsZi1kaXNjbGFpbWVycyBsaWtlICdJIHNob3VsZCBtZW50aW9uJyBhbmQgJ0l0J3MgaW1wb3J0YW50IHRvIG5vdGUnLlwiLFxuICBcIkFuc3dlciBkaXJlY3RseS5cIixcbiAgXCJEbyBub3QgaW5jbHVkZSBhIHByZWFtYmxlIGJlZm9yZSB0aGUgYWN0dWFsIGFuc3dlci5cIixcbiAgXCJVc2UgbGlzdHMgYW5kIGhlYWRlcnMgb25seSB3aGVuIHRoZXkgY2xhcmlmeSBhIG11bHRpLXBhcnQgYW5zd2VyLlwiLFxuXS5qb2luKFwiXFxuXCIpO1xuXG4vKipcbiAqIFJlc29sdmUgdGhlIHN0eWxlIGJsb2NrIHRvIGFwcGVuZCB0byBldmVyeSBhZ2VudCdzIGluc3RydWN0aW9ucy5cbiAqIFJldHVybnMgYG51bGxgIHdoZW4gdGhlIGNhbGxlciBvcHRlZCBvdXQgKGBzdHlsZUluc3RydWN0aW9uczogZmFsc2VgKS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVN0eWxlSW5zdHJ1Y3Rpb25zKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChjb25maWcuc3R5bGVJbnN0cnVjdGlvbnMgPT09IGZhbHNlKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiBjb25maWcuc3R5bGVJbnN0cnVjdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zO1xuICB9XG5cbiAgcmV0dXJuIERFRkFVTFRfU1RZTEVfSU5TVFJVQ1RJT05TO1xufVxuXG4vKiogQXBwZW5kIHNoYXJlZCB3b3JrZmxvdyBhbmQgc3R5bGUgYmxvY2tzIHdpdGhvdXQgbmFycm93aW5nIE1hc3RyYSdzIGluc3RydWN0aW9uIHNoYXBlcy4gKi9cbmZ1bmN0aW9uIGFwcGVuZERlZmF1bHRJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogQWdlbnRJbnN0cnVjdGlvbnMsXG4gIHN0eWxlOiBzdHJpbmcgfCBudWxsLFxuKTogQWdlbnRJbnN0cnVjdGlvbnMge1xuICBjb25zdCBzdWZmaXggPSBzdHlsZVxuICAgID8gYCR7REVGQVVMVF9UT09MX1dPUktGTE9XX0lOU1RSVUNUSU9OU31cXG5cXG4ke3N0eWxlfWBcbiAgICA6IERFRkFVTFRfVE9PTF9XT1JLRkxPV19JTlNUUlVDVElPTlM7XG4gIGlmICh0eXBlb2YgaW5zdHJ1Y3Rpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGAke2luc3RydWN0aW9ucy50cmltRW5kKCl9XFxuXFxuJHtzdWZmaXh9YDtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShpbnN0cnVjdGlvbnMpKSB7XG4gICAgaWYgKGluc3RydWN0aW9ucy5ldmVyeSgoaW5zdHJ1Y3Rpb24pID0+IHR5cGVvZiBpbnN0cnVjdGlvbiA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgIHJldHVybiBbLi4uaW5zdHJ1Y3Rpb25zLCBzdWZmaXhdIGFzIEFnZW50SW5zdHJ1Y3Rpb25zO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLmluc3RydWN0aW9ucywgeyByb2xlOiBcInN5c3RlbVwiLCBjb250ZW50OiBzdWZmaXggfV0gYXMgQWdlbnRJbnN0cnVjdGlvbnM7XG4gIH1cbiAgcmV0dXJuIFtpbnN0cnVjdGlvbnMsIHsgcm9sZTogXCJzeXN0ZW1cIiwgY29udGVudDogc3VmZml4IH1dIGFzIEFnZW50SW5zdHJ1Y3Rpb25zO1xufVxuXG4vKipcbiAqIENvbXBvc2Ugc3RhdGljIG9yIHJlcXVlc3QtY29udGV4dC1hd2FyZSBpbnN0cnVjdGlvbnMgd2l0aCBzaGFyZWQgd29ya2Zsb3dcbiAqIGFuZCBzdHlsZSBndWlkYW5jZSB3aGlsZSBwcmVzZXJ2aW5nIE1hc3RyYSdzIG5hdGl2ZSBnZW5lcmljIGluZmVyZW5jZS5cbiAqL1xuZnVuY3Rpb24gY29tcG9zZUluc3RydWN0aW9uczxUUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd24+KFxuICBhZ2VudEluc3RydWN0aW9uczogQWdlbnRDb25maWc8c3RyaW5nLCBUb29sc0lucHV0LCB1bmRlZmluZWQsIFRSZXF1ZXN0Q29udGV4dD5bXCJpbnN0cnVjdGlvbnNcIl0sXG4gIHN0eWxlOiBzdHJpbmcgfCBudWxsLFxuICByZXNvbHZlQ29kZU1vZGU/OiBDb2RlTW9kZVJlc29sdmVyPFRSZXF1ZXN0Q29udGV4dD4sXG4pOiBBZ2VudENvbmZpZzxzdHJpbmcsIFRvb2xzSW5wdXQsIHVuZGVmaW5lZCwgVFJlcXVlc3RDb250ZXh0PltcImluc3RydWN0aW9uc1wiXSB7XG4gIGNvbnN0IGFwcGVuZCA9IChpbnN0cnVjdGlvbnM6IEFnZW50SW5zdHJ1Y3Rpb25zLCBjb2RlTW9kZUluc3RydWN0aW9ucz86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGNvbXBvc2VkID0gYXBwZW5kRGVmYXVsdEluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMsIHN0eWxlKTtcbiAgICByZXR1cm4gY29kZU1vZGVJbnN0cnVjdGlvbnNcbiAgICAgID8gYXBwZW5kSW5zdHJ1Y3Rpb25CbG9jayhcbiAgICAgICAgICBjb21wb3NlZCxcbiAgICAgICAgICBgJHtjb2RlTW9kZUluc3RydWN0aW9uc31cXG5cXG4ke0NPREVfTU9ERV9ST1VUSU5HX0lOU1RSVUNUSU9OU31gLFxuICAgICAgICApXG4gICAgICA6IGNvbXBvc2VkO1xuICB9O1xuICBpZiAodHlwZW9mIGFnZW50SW5zdHJ1Y3Rpb25zICE9PSBcImZ1bmN0aW9uXCIgJiYgIXJlc29sdmVDb2RlTW9kZSkge1xuICAgIHJldHVybiBhcHBlbmQoYWdlbnRJbnN0cnVjdGlvbnMpIGFzIEFnZW50Q29uZmlnPFxuICAgICAgc3RyaW5nLFxuICAgICAgVG9vbHNJbnB1dCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIFRSZXF1ZXN0Q29udGV4dFxuICAgID5bXCJpbnN0cnVjdGlvbnNcIl07XG4gIH1cbiAgcmV0dXJuIChhc3luYyAoYXJncykgPT4ge1xuICAgIGNvbnN0IFtpbnN0cnVjdGlvbnMsIGNvZGVNb2RlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHR5cGVvZiBhZ2VudEluc3RydWN0aW9ucyA9PT0gXCJmdW5jdGlvblwiID8gYWdlbnRJbnN0cnVjdGlvbnMoYXJncykgOiBhZ2VudEluc3RydWN0aW9ucyxcbiAgICAgIHJlc29sdmVDb2RlTW9kZT8uKGFyZ3MpLFxuICAgIF0pO1xuICAgIHJldHVybiBhcHBlbmQoaW5zdHJ1Y3Rpb25zLCBjb2RlTW9kZT8uaW5zdHJ1Y3Rpb25zKTtcbiAgfSkgYXMgQWdlbnRDb25maWc8c3RyaW5nLCBUb29sc0lucHV0LCB1bmRlZmluZWQsIFRSZXF1ZXN0Q29udGV4dD5bXCJpbnN0cnVjdGlvbnNcIl07XG59XG5cbi8qKiBBcHBlbmQgb25lIHN5c3RlbSBpbnN0cnVjdGlvbiBibG9jayB3aGlsZSBwcmVzZXJ2aW5nIE1hc3RyYSdzIGFjY2VwdGVkIHNoYXBlcy4gKi9cbmZ1bmN0aW9uIGFwcGVuZEluc3RydWN0aW9uQmxvY2soaW5zdHJ1Y3Rpb25zOiBBZ2VudEluc3RydWN0aW9ucywgYmxvY2s6IHN0cmluZyk6IEFnZW50SW5zdHJ1Y3Rpb25zIHtcbiAgaWYgKHR5cGVvZiBpbnN0cnVjdGlvbnMgPT09IFwic3RyaW5nXCIpIHJldHVybiBgJHtpbnN0cnVjdGlvbnMudHJpbUVuZCgpfVxcblxcbiR7YmxvY2t9YDtcbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5zdHJ1Y3Rpb25zKSkge1xuICAgIGlmIChpbnN0cnVjdGlvbnMuZXZlcnkoKGluc3RydWN0aW9uKSA9PiB0eXBlb2YgaW5zdHJ1Y3Rpb24gPT09IFwic3RyaW5nXCIpKSB7XG4gICAgICByZXR1cm4gWy4uLmluc3RydWN0aW9ucywgYmxvY2tdIGFzIEFnZW50SW5zdHJ1Y3Rpb25zO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLmluc3RydWN0aW9ucywgeyByb2xlOiBcInN5c3RlbVwiLCBjb250ZW50OiBibG9jayB9XSBhcyBBZ2VudEluc3RydWN0aW9ucztcbiAgfVxuICByZXR1cm4gW2luc3RydWN0aW9ucywgeyByb2xlOiBcInN5c3RlbVwiLCBjb250ZW50OiBibG9jayB9XSBhcyBBZ2VudEluc3RydWN0aW9ucztcbn1cblxuLyoqIFJlc29sdmUgb25lIG5hdGl2ZSBDb2RlIE1vZGUgdHJhbnNwb3J0IGR1cmluZyBwbHVnaW4gc3RhcnR1cC4gKi9cbmZ1bmN0aW9uIGNvZGVNb2RlVHJhbnNwb3J0KCk6IFByb21pc2U8Q29kZU1vZGVUcmFuc3BvcnQ+IHtcbiAgcmVzb2x2ZWRDb2RlTW9kZVRyYW5zcG9ydCA/Pz0gKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXN1cHBvcnRzSXNvbGF0ZWRWbVRyYW5zcG9ydCgpKSB7XG4gICAgICBjb2RlTW9kZUxvZ2dlci5pbmZvKFwidHJhbnNwb3J0IHNlbGVjdGVkXCIsIHsgcHJvdmlkZXI6IFwicXVpY2tqc1wiIH0pO1xuICAgICAgcmV0dXJuIG5ldyBRdWlja0pzQ29kZU1vZGVUcmFuc3BvcnQoKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgSXNvbGF0ZWRWbUNvZGVNb2RlVHJhbnNwb3J0IH0gPSBhd2FpdCBpbXBvcnQoXCJAbWFzdHJhL2lzb2xhdGVkLXZtXCIpO1xuICAgICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IElzb2xhdGVkVm1Db2RlTW9kZVRyYW5zcG9ydCgpO1xuICAgICAgY29kZU1vZGVMb2dnZXIuaW5mbyhcInRyYW5zcG9ydCBzZWxlY3RlZFwiLCB7IHByb3ZpZGVyOiBcImlzb2xhdGVkLXZtXCIgfSk7XG4gICAgICByZXR1cm4gdHJhbnNwb3J0O1xuICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgY29kZU1vZGVMb2dnZXIud2FybihcImlzb2xhdGVkLXZtIHVuYXZhaWxhYmxlOyB1c2luZyBRdWlja0pTXCIsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGNhdWdodCksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgUXVpY2tKc0NvZGVNb2RlVHJhbnNwb3J0KCk7XG4gICAgfVxuICB9KSgpO1xuICByZXR1cm4gcmVzb2x2ZWRDb2RlTW9kZVRyYW5zcG9ydDtcbn1cblxudHlwZSBDb2RlTW9kZVJlc29sdmVyPFRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93biA9IHVua25vd24+ID0gKFxuICBhcmdzOiBQYXJhbWV0ZXJzPFxuICAgIEV4Y2x1ZGU8XG4gICAgICBBZ2VudENvbmZpZzxzdHJpbmcsIFRvb2xzSW5wdXQsIHVuZGVmaW5lZCwgVFJlcXVlc3RDb250ZXh0PltcImluc3RydWN0aW9uc1wiXSxcbiAgICAgIEFnZW50SW5zdHJ1Y3Rpb25zXG4gICAgPlxuICA+WzBdLFxuKSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvZGVNb2RlPiB8IHVuZGVmaW5lZD47XG5cbi8qKiBCdWlsZCByZXF1ZXN0LXNjb3BlZCBuYXRpdmUgQ29kZSBNb2RlIG92ZXIgYWxsIGV4ZWN1dGFibGUgY29udGV4dCB0b29scy4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ29kZU1vZGU8VFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duPihcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIHRvb2xzOiBNYXN0cmFUb29scyxcbiAgd29ya3NwYWNlOiBXb3Jrc3BhY2UgfCB1bmRlZmluZWQsXG4gIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dDxUUmVxdWVzdENvbnRleHQ+LFxuKTogUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb2RlTW9kZT4gfCB1bmRlZmluZWQ+IHtcbiAgaWYgKGNvbmZpZy5jb2RlTW9kZSA9PT0gZmFsc2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHdvcmtzcGFjZVRvb2xzID0gd29ya3NwYWNlXG4gICAgPyBhd2FpdCBjcmVhdGVXb3Jrc3BhY2VUb29scyh3b3Jrc3BhY2UsIHsgcmVxdWVzdENvbnRleHQsIHdvcmtzcGFjZSB9KVxuICAgIDoge307XG4gIGNvbnN0IGNvbnRleHRUb29scyA9IHsgLi4udG9vbHMsIC4uLndvcmtzcGFjZVRvb2xzIH07XG4gIGNvbnN0IGV4ZWN1dGFibGVUb29scyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhjb250ZXh0VG9vbHMpLmZpbHRlcihcbiAgICAgIChbLCB0b29sXSkgPT5cbiAgICAgICAgdHlwZW9mIHRvb2wgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgdG9vbCAhPT0gbnVsbCAmJlxuICAgICAgICBcImV4ZWN1dGVcIiBpbiB0b29sICYmXG4gICAgICAgIHR5cGVvZiB0b29sLmV4ZWN1dGUgPT09IFwiZnVuY3Rpb25cIixcbiAgICApLFxuICApIGFzIFRvb2xzSW5wdXQ7XG4gIGlmIChPYmplY3Qua2V5cyhleGVjdXRhYmxlVG9vbHMpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgb3B0aW9ucyA9IHR5cGVvZiBjb25maWcuY29kZU1vZGUgPT09IFwib2JqZWN0XCIgPyBjb25maWcuY29kZU1vZGUgOiB7fTtcbiAgY29uc3QgY29kZU1vZGUgPSBjcmVhdGVDb2RlTW9kZShcbiAgICB7IHRvb2xzOiBleGVjdXRhYmxlVG9vbHMsIC4uLm9wdGlvbnMgfSxcbiAgICBhd2FpdCBjb2RlTW9kZVRyYW5zcG9ydCgpLFxuICApO1xuICBpZiAoIShcIm1hc3RyYV93b3Jrc3BhY2VfcmVhZF9maWxlXCIgaW4gd29ya3NwYWNlVG9vbHMpKSByZXR1cm4gY29kZU1vZGU7XG4gIHJldHVybiB7XG4gICAgLi4uY29kZU1vZGUsXG4gICAgaW5zdHJ1Y3Rpb25zOiBgJHtjb2RlTW9kZS5pbnN0cnVjdGlvbnN9XFxuXFxuV29ya3NwYWNlIGZpbGUgY29udGVudCBub3RlOlxcblRleHQgcmV0dXJuZWQgYnkgZXh0ZXJuYWxfbWFzdHJhX3dvcmtzcGFjZV9yZWFkX2ZpbGUgc3RhcnRzIHdpdGggb25lIG1ldGFkYXRhIGxpbmUgY29udGFpbmluZyB0aGUgcGF0aCBhbmQgc2l6ZS4gRXhjbHVkZSB0aGF0IGZpcnN0IGxpbmUgYmVmb3JlIGNhbGN1bGF0aW5nIGNvbnRlbnQgY2hhcmFjdGVyIGNvdW50cywgaGFzaGVzLCBvciBvdGhlciBjb250ZW50LW9ubHkgdmFsdWVzLmAsXG4gIH07XG59XG5cbi8qKiBSZXNvbHZlIENvZGUgTW9kZSBsYXppbHkgc28gd29ya3NwYWNlIGFuZCBkeW5hbWljIHRvb2wgcG9saWN5IGZvbGxvdyBlYWNoIHJlcXVlc3QuICovXG5mdW5jdGlvbiBjb2RlTW9kZVJlc29sdmVyPFRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93bj4oXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICB0b29sczogTWFzdHJhVG9vbHMsXG4gIHdvcmtzcGFjZTogV29ya3NwYWNlIHwgdW5kZWZpbmVkLFxuKTogQ29kZU1vZGVSZXNvbHZlcjxUUmVxdWVzdENvbnRleHQ+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5jb2RlTW9kZSA9PT0gZmFsc2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiBidWlsZENvZGVNb2RlKGNvbmZpZywgdG9vbHMsIHdvcmtzcGFjZSwgcmVxdWVzdENvbnRleHQpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlZCBkZXNjcmlwdGlvbiBmb3IgYW4gYWdlbnQgd2hvc2UgZGVmaW5pdGlvbiBvbWl0cyBvbmUuIEtlcHRcbiAqIGdlbmVyaWMgKHRoZSBhZ2VudCdzIG93biBuYW1lIGlzIHRoZSBvbmx5IHJlbGlhYmxlIHNpZ25hbCBhdCBidWlsZFxuICogdGltZSkgc28gaXQgcmVhZHMgc2Vuc2libHkgYXMgdGhlIGBhc2tfPGlkPmAgTUNQIHRvb2wncyBkZXNjcmlwdGlvblxuICogYW5kIGluIGFnZW50IG1ldGFkYXRhLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0QWdlbnREZXNjcmlwdGlvbihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYENvbnZlcnNhdGlvbmFsIEFJIGFnZW50IFwiJHtuYW1lfVwiLmA7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBldmVyeSBlbnRyeSBpbiBgY29uZmlnLmFnZW50c2AgaW50byBhIE1hc3RyYSBgQWdlbnRgXG4gKiBpbnN0YW5jZS4gV2hlbiBgY29uZmlnLmFnZW50c2AgaXMgb21pdHRlZCB0aGUgcGx1Z2luIHJlZ2lzdGVycyBhXG4gKiBzaW5nbGUgYnVpbHQtaW4gYGRlZmF1bHRgIGFuYWx5c3Qgc28gdGhlIGJhcmUgYG1hc3RyYSgpYCBjYWxsIHN0aWxsXG4gKiB5aWVsZHMgYSB3b3JraW5nIGFnZW50LlxuICpcbiAqIFBlci1hZ2VudCB0b29sIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBvbmNlIHdpdGggYSB0eXBlZFxuICoge0BsaW5rIE1hc3RyYVBsdWdpbnN9IGluZGV4IGJ1aWx0IGZyb20gcmVnaXN0ZXJlZCBzaWJsaW5nIHBsdWdpbnNcbiAqIChjdXJyZW50bHkgYGdlbmllYDsgZXh0ZW5kIGBNYXN0cmFQbHVnaW5zYCB0byBzdXJmYWNlIG1vcmUpLlxuICpcbiAqIEB0aHJvd3Mgd2hlbiBgY29uZmlnLmRlZmF1bHRBZ2VudGAgaXMgc2V0IHRvIGFuIGlkIHRoYXQgaXNuJ3QgaW4gdGhlXG4gKiAgIHJlc29sdmVkIHJlZ2lzdHJ5OyB0aGlzIGlzIGEgd2lyaW5nIGJ1Zywgbm90IGEgcnVudGltZSBjb25kaXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEFnZW50cyhvcHRzOiB7XG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xuICBjb250ZXh0OiBwbHVnaW5SZWdpc3RyeS5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZDtcbiAgbWVtb3J5QnVpbGRlcj86IE1lbW9yeUJ1aWxkZXI7XG4gIGxvZzogbG9nLkxvZ2dlcjtcbiAgLyoqXG4gICAqIExvY2FsIHNraWxsIHNjYW4gcGF0aHMgKHJlbW90ZSBza2lsbHMgcHJvdmlzaW9uZWQgdG8gYSB0ZW1wIGRpciBhdFxuICAgKiBzdGFydHVwKSBmb2xkZWQgaW50byBldmVyeSBhZ2VudCB0aGF0IHVzZXMgdGhlIGF1dG8tY3JlYXRlZCBkZWZhdWx0XG4gICAqIHdvcmtzcGFjZS5cbiAgICovXG4gIGV4dHJhU2tpbGxNb3VudHM/OiBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9uc1tcImV4dHJhU2tpbGxNb3VudHNcIl07XG59KTogUHJvbWlzZTxCdWlsdEFnZW50cz4ge1xuICBjb25zdCB7IGNvbmZpZywgY29udGV4dCwgbWVtb3J5QnVpbGRlciwgbG9nLCBleHRyYVNraWxsTW91bnRzIH0gPSBvcHRzO1xuICBjb25zdCBkZWZpbml0aW9ucyA9IHJlc29sdmVEZWZpbml0aW9ucyhjb25maWcpO1xuICBjb25zdCBpZHMgPSBPYmplY3Qua2V5cyhkZWZpbml0aW9ucyk7XG4gIGNvbnN0IGRlZmF1bHRBZ2VudElkID0gY29uZmlnLmRlZmF1bHRBZ2VudCA/PyBpZHNbMF0gPz8gRkFMTEJBQ0tfQUdFTlRfSUQ7XG5cbiAgY29uc3QgcGx1Z2lucyA9IGJ1aWxkUGx1Z2luc01hcChjb25maWcsIGNvbnRleHQpO1xuICAvLyBTeXN0ZW0tZGVmYXVsdCBhbWJpZW50IHRvb2xzIGV2ZXJ5IGFnZW50IGdldHMgb3V0IG9mIHRoZSBib3g6XG4gIC8vIGByZW5kZXJfZGF0YWAgZm9yIGlubGluZSB2aXN1YWxpemF0aW9ucyBhbmQgYHN1bW1hcml6ZWAgZm9yXG4gIC8vIG9mZmxvYWRpbmcgdGV4dCBjb25kZW5zaW5nIHRvIHRoZSBmYXN0IC8gc21hbGwgY2hhdCB0aWVyLiBUaGVcbiAgLy8gdXNlciBjYW4gc2hhZG93IGVpdGhlciBieSBpbmNsdWRpbmcgYSBzYW1lLW5hbWVkIHRvb2wgaW4gdGhlaXIgb3duXG4gIC8vIGBjb25maWcudG9vbHNgIG9yIHBlci1hZ2VudCBgdG9vbHNgLiBNZXJnZSBvcmRlciBpc1xuICAvLyBgc3lzdGVtIC0+IHVzZXItYW1iaWVudCAtPiBwZXItYWdlbnRgLCBsYXN0IHdyaXRlIHdpbnMuXG4gIGNvbnN0IHN5c3RlbVRvb2xzOiBNYXN0cmFUb29scyA9IHtcbiAgICByZW5kZXJfZGF0YTogYnVpbGRSZW5kZXJEYXRhVG9vbChjb25maWcpLFxuICAgIHN1bW1hcml6ZTogYnVpbGRTdW1tYXJpemVUb29sKGNvbmZpZyksXG4gIH07XG4gIGNvbnN0IGFtYmllbnRUb29scyA9IHtcbiAgICAuLi5zeXN0ZW1Ub29scyxcbiAgICAuLi4oY29uZmlnLnRvb2xzID8/IHt9KSxcbiAgfTtcbiAgY29uc3Qgc3R5bGUgPSByZXNvbHZlU3R5bGVJbnN0cnVjdGlvbnMoY29uZmlnKTtcbiAgLy8gRGVmYXVsdC1vbiBwcm90ZWN0aW9uIGFnYWluc3QgdGhlIG1vZGVsIGNvcHlpbmcgdHVybi1zY29wZWRcbiAgLy8gY2hhcnRJZHMgZnJvbSBwcmlvciBhc3Npc3RhbnQgdG9vbCByZXN1bHRzIGludG8gdGhlIG5ld1xuICAvLyB0dXJuJ3MgYFtjaGFydDo8aWQ+XWAgbWFya2Vycy4gT3B0IG91dCBwZXItcGx1Z2luIHZpYVxuICAvLyBgY29uZmlnLnN0cmlwU3RhbGVDaGFydHM6IGZhbHNlYC5cbiAgY29uc3QgaW5wdXRQcm9jZXNzb3JzID0gW1xuICAgIC4uLihjb25maWcuc3RyaXBTdGFsZUNoYXJ0cyA9PT0gZmFsc2UgPyBbXSA6IFtzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yXSksXG4gIF07XG4gIGNvbnN0IGFnZW50czogUmVjb3JkPHN0cmluZywgQWdlbnQ+ID0ge307XG4gIGNvbnN0IGRlZmF1bHRNb2RlbHM6IFJlY29yZDxzdHJpbmcsIEFnZW50RGVmYXVsdE1vZGVsPiA9IHt9O1xuICBjb25zdCBhcHByb3ZhbEdhdGVkQnlBZ2VudDogQXJyYXk8eyBhZ2VudElkOiBzdHJpbmc7IHRvb2xJZHM6IHN0cmluZ1tdIH0+ID0gW107XG5cbiAgZm9yIChjb25zdCBbaWQsIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoZGVmaW5pdGlvbnMpKSB7XG4gICAgY29uc3QgdXNlclRvb2xzID0gYXdhaXQgcmVzb2x2ZVVzZXJUb29scyhkZWYudG9vbHMsIHBsdWdpbnMpO1xuICAgIGNvbnN0IHRvb2xzID0geyAuLi5hbWJpZW50VG9vbHMsIC4uLnVzZXJUb29scyB9O1xuICAgIGxldCB3b3Jrc3BhY2UgPSByZXNvbHZlQWdlbnRXb3Jrc3BhY2UoZGVmLndvcmtzcGFjZSk7XG4gICAgaWYgKFxuICAgICAgKGRlZi53b3Jrc3BhY2UgPT09IHVuZGVmaW5lZCAmJiAhd29ya3NwYWNlKSB8fFxuICAgICAgKChleHRyYVNraWxsTW91bnRzPy5sZW5ndGggfHxcbiAgICAgICAgY29uZmlnLnNhbmRib3ggIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBjb25maWcud29ya3NwYWNlRmFsbGJhY2tUb1RtcCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIGNvbmZpZy53b3Jrc3BhY2VUb29scyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIGNvbnRleHQgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgaXNEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZSkpXG4gICAgKSB7XG4gICAgICB3b3Jrc3BhY2UgPSBkYXRhYnJpY2tzV29ya3NwYWNlKHtcbiAgICAgICAgZXh0cmFTa2lsbE1vdW50cyxcbiAgICAgICAgZmFsbGJhY2tUb1RtcDogY29uZmlnLndvcmtzcGFjZUZhbGxiYWNrVG9UbXAsXG4gICAgICAgIC4uLihjb25maWcud29ya3NwYWNlVG9vbHMgIT09IHVuZGVmaW5lZCA/IHsgdG9vbHM6IGNvbmZpZy53b3Jrc3BhY2VUb29scyB9IDoge30pLFxuICAgICAgICBwbHVnaW5Db250ZXh0OiBjb250ZXh0LFxuICAgICAgICBzYW5kYm94OiBjb25maWcuc2FuZGJveCA9PT0gdHJ1ZSA/IFwiZGF0YWJyaWNrc1wiIDogY29uZmlnLnNhbmRib3gsXG4gICAgICB9KTtcbiAgICAgIG1hcmtEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZSk7XG4gICAgfSBlbHNlIGlmICh3b3Jrc3BhY2UpIHtcbiAgICAgIHdvcmtzcGFjZSA9IGJpbmREYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCh3b3Jrc3BhY2UsIGNvbnRleHQpO1xuICAgIH1cbiAgICBjb25zdCBnYXRlZCA9IGFwcHJvdmFsR2F0ZWRUb29sSWRzKHRvb2xzKTtcbiAgICBpZiAoZ2F0ZWQubGVuZ3RoID4gMCkgYXBwcm92YWxHYXRlZEJ5QWdlbnQucHVzaCh7IGFnZW50SWQ6IGlkLCB0b29sSWRzOiBnYXRlZCB9KTtcbiAgICBjb25zdCBtZW1vcnkgPSBtZW1vcnlCdWlsZGVyPy5mb3JBZ2VudChpZCwgZGVmKTtcbiAgICBjb25zdCByZXNvbHZlQ29kZU1vZGUgPSBjb2RlTW9kZVJlc29sdmVyKGNvbmZpZywgdG9vbHMsIHdvcmtzcGFjZSk7XG4gICAgY29uc3QgYWdlbnQgPSBuZXcgQWdlbnQoe1xuICAgICAgaWQsXG4gICAgICBuYW1lOiBkZWYubmFtZSA/PyBpZCxcbiAgICAgIC8vIEFsd2F5cyBjYXJyeSBhIG5vbi1lbXB0eSBkZXNjcmlwdGlvbjogaXQncyBzdXJmYWNlZCB0byBNQ1BcbiAgICAgIC8vIGNsaWVudHMgKHdoaWNoIHJlamVjdCBhIGRlc2NyaXB0aW9uLWxlc3MgYWdlbnQpIGFuZCBpbiBhZ2VudFxuICAgICAgLy8gbWV0YWRhdGEuIEZhbGwgYmFjayB0byBhIGdlbmVyYXRlZCBvbmUgd2hlbiB0aGUgZGVmaW5pdGlvblxuICAgICAgLy8gb21pdHMgaXQuXG4gICAgICBkZXNjcmlwdGlvbjogZGVmLmRlc2NyaXB0aW9uPy50cmltKCkgfHwgZGVmYXVsdEFnZW50RGVzY3JpcHRpb24oZGVmLm5hbWUgPz8gaWQpLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBjb21wb3NlSW5zdHJ1Y3Rpb25zKGRlZi5pbnN0cnVjdGlvbnMsIHN0eWxlLCByZXNvbHZlQ29kZU1vZGUpLFxuICAgICAgLi4uKGRlZi5yZXF1ZXN0Q29udGV4dFNjaGVtYSA/IHsgcmVxdWVzdENvbnRleHRTY2hlbWE6IGRlZi5yZXF1ZXN0Q29udGV4dFNjaGVtYSB9IDoge30pLFxuICAgICAgbW9kZWw6IHJlc29sdmVNb2RlbChjb25maWcsIGRlZi5tb2RlbCksXG4gICAgICBkZWZhdWx0T3B0aW9uczogKHsgcmVxdWVzdENvbnRleHQgfSkgPT5cbiAgICAgICAgd2l0aFJlcXVlc3RNZW1vcnlTY29wZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXhTdGVwczogY29uZmlnLmFnZW50TWF4U3RlcHMgPz8gREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMsXG4gICAgICAgICAgICBwcm92aWRlck9wdGlvbnM6IFJFU1BPTlNFU19QUk9WSURFUl9PUFRJT05TLFxuICAgICAgICAgICAgLi4uKGRlZi5yZXF1aXJlVG9vbEFwcHJvdmFsICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyB7IHJlcXVpcmVUb29sQXBwcm92YWw6IGRlZi5yZXF1aXJlVG9vbEFwcHJvdmFsIH1cbiAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZW1vcnkgPyByZXF1ZXN0Q29udGV4dCA6IHVuZGVmaW5lZCxcbiAgICAgICAgKSxcbiAgICAgIHRvb2xzOiByZXNvbHZlQ29kZU1vZGVcbiAgICAgICAgPyBhc3luYyAoYXJncykgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29kZU1vZGUgPSBhd2FpdCByZXNvbHZlQ29kZU1vZGUoYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gY29kZU1vZGUgPyB7IC4uLnRvb2xzLCBbY29kZU1vZGUudG9vbC5pZF06IGNvZGVNb2RlLnRvb2wgfSA6IHRvb2xzO1xuICAgICAgICAgIH1cbiAgICAgICAgOiB0b29scyxcbiAgICAgIC4uLihtZW1vcnkgPyB7IG1lbW9yeSB9IDoge30pLFxuICAgICAgLi4uKHdvcmtzcGFjZSA/IHsgd29ya3NwYWNlIH0gOiB7fSksXG4gICAgICBpbnB1dFByb2Nlc3NvcnM6IFsuLi5pbnB1dFByb2Nlc3NvcnMsIC4uLndvcmtzcGFjZVNraWxsSW5wdXRQcm9jZXNzb3JzKHdvcmtzcGFjZSwgY29uZmlnKV0sXG4gICAgICBvdXRwdXRQcm9jZXNzb3JzOiBbdG9vbEVycm9yTG9nZ2luZ1Byb2Nlc3Nvcihsb2cpXSxcbiAgICB9KTtcbiAgICBhZ2VudHNbaWRdID1cbiAgICAgIGNvbmZpZy5iYWNrZ3JvdW5kVHVybnMgPT09IGZhbHNlXG4gICAgICAgID8gYWdlbnRcbiAgICAgICAgOiBjcmVhdGVCYWNrZ3JvdW5kQWdlbnQoYWdlbnQsIGNvbmZpZy5hZ2VudE1heFN0ZXBzID8/IERFRkFVTFRfQUdFTlRfTUFYX1NURVBTKTtcbiAgICAvLyBTdXJmYWNlIHRoZSBlZmZlY3RpdmUgZGVmYXVsdCBtb2RlbCBwZXIgYWdlbnQgc28gb3BlcmF0b3JzIGNhblxuICAgIC8vIHNlZSBhdCBhIGdsYW5jZSB3aGljaCBlbmRwb2ludCBlYWNoIGFnZW50IHBvaW50cyBhdCB3aXRob3V0XG4gICAgLy8gaGF2aW5nIHRvIGZpcmUgYSByZXF1ZXN0IGFuZCBpbnNwZWN0IGEgdHJhY2UuIFRoZSB2YWx1ZSBpcyB0aGVcbiAgICAvLyAqc3RhdGljKiBkZWZhdWx0OyBwZXItcmVxdWVzdCBvdmVycmlkZXMgKGhlYWRlciAvIHF1ZXJ5IC9cbiAgICAvLyBib2R5KSBhbmQgdGhlIHdvcmtzcGFjZS1jYXRhbG9ndWUgZnV6enkgbWF0Y2ggc3RpbGwgYXBwbHkgYXRcbiAgICAvLyBjYWxsIHRpbWUuXG4gICAgY29uc3QgZGVmYXVsdE1vZGVsID0gZGVzY3JpYmVBZ2VudERlZmF1bHRNb2RlbChjb25maWcsIGRlZik7XG4gICAgZGVmYXVsdE1vZGVsc1tpZF0gPSBkZWZhdWx0TW9kZWw7XG4gICAgbG9nLmluZm8oXCJhZ2VudCByZWdpc3RlcmVkXCIsIHtcbiAgICAgIGlkLFxuICAgICAgbmFtZTogZGVmLm5hbWUgPz8gaWQsXG4gICAgICBkZWZhdWx0TW9kZWw6XG4gICAgICAgIGRlZmF1bHRNb2RlbC5raW5kID09PSBcImNvbmZpZ3VyZWRcIiA/IGRlZmF1bHRNb2RlbC5tb2RlbCA6IGA8JHtkZWZhdWx0TW9kZWwua2luZH0+YCxcbiAgICAgIHRvb2xzOiBbLi4uT2JqZWN0LmtleXModG9vbHMpLCAuLi4ocmVzb2x2ZUNvZGVNb2RlID8gW1wiPGR5bmFtaWMtY29kZS1tb2RlPlwiXSA6IFtdKV0sXG4gICAgfSk7XG4gIH1cblxuICBpZiAoIWFnZW50c1tkZWZhdWx0QWdlbnRJZF0pIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIGBtYXN0cmEgZGVmYXVsdEFnZW50IFwiJHtkZWZhdWx0QWdlbnRJZH1cImAsXG4gICAgICBgUmVnaXN0ZXJlZCBhZ2VudHM6ICR7aWRzLmpvaW4oXCIsIFwiKSB8fCBcIm5vbmVcIn0uYCxcbiAgICApO1xuICB9XG5cbiAgYXNzZXJ0QXBwcm92YWxHYXRlZFRvb2xzSGF2ZVN0b3JhZ2UoYXBwcm92YWxHYXRlZEJ5QWdlbnQsIG1lbW9yeUJ1aWxkZXIpO1xuXG4gIGxvZy5pbmZvKFwiYWdlbnRzIHJlYWR5XCIsIHsgaWRzLCBkZWZhdWx0QWdlbnRJZCB9KTtcbiAgcmV0dXJuIHsgYWdlbnRzLCBkZWZhdWx0QWdlbnRJZCwgZGVmYXVsdE1vZGVscywgYW1iaWVudFRvb2xzIH07XG59XG5cbi8qKiBMb2cgZmFpbGVkIHRvb2wgY2FsbHMgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2h1bmtzIHJldHVybmVkIHRvIHRoZSBjbGllbnQuICovXG5mdW5jdGlvbiB0b29sRXJyb3JMb2dnaW5nUHJvY2Vzc29yKGxvZ2dlcjogbG9nLkxvZ2dlcik6IE91dHB1dFByb2Nlc3NvciB7XG4gIHJldHVybiB7XG4gICAgaWQ6IFwidG9vbC1lcnJvci1sb2dnZXJcIixcbiAgICBhc3luYyBwcm9jZXNzT3V0cHV0U3RyZWFtKHsgcGFydCB9KSB7XG4gICAgICBpZiAocGFydC50eXBlID09PSBcInRvb2wtZXJyb3JcIikge1xuICAgICAgICBjb25zdCBlcnJvciA9IGVycm9yVXRpbHMudG9FcnJvcihwYXJ0LnBheWxvYWQuZXJyb3IpO1xuICAgICAgICBsb2dnZXIuZXJyb3IoXCJ0b29sIGV4ZWN1dGlvbiBmYWlsZWRcIiwge1xuICAgICAgICAgIHRvb2xOYW1lOiBwYXJ0LnBheWxvYWQudG9vbE5hbWUsXG4gICAgICAgICAgdG9vbENhbGxJZDogcGFydC5wYXlsb2FkLnRvb2xDYWxsSWQsXG4gICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgc3RhY2s6IGVycm9yLnN0YWNrLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJ0O1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHdvcmtzcGFjZVNraWxsSW5wdXRQcm9jZXNzb3JzKFxuICB3b3Jrc3BhY2U6IFdvcmtzcGFjZSB8IHVuZGVmaW5lZCxcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4pOiBTa2lsbFNlYXJjaFByb2Nlc3NvcltdIHtcbiAgaWYgKCF3b3Jrc3BhY2UgfHwgY29uZmlnLndvcmtzcGFjZVNraWxscyA9PT0gZmFsc2UpIHJldHVybiBbXTtcbiAgY29uc3Qgb3B0aW9ucyA9IHR5cGVvZiBjb25maWcud29ya3NwYWNlU2tpbGxzID09PSBcIm9iamVjdFwiID8gY29uZmlnLndvcmtzcGFjZVNraWxscyA6IHVuZGVmaW5lZDtcbiAgaWYgKCF3b3Jrc3BhY2Uuc2tpbGxzKSByZXR1cm4gW107XG4gIHJldHVybiBbXG4gICAgbmV3IFNraWxsU2VhcmNoUHJvY2Vzc29yKHtcbiAgICAgIHdvcmtzcGFjZSxcbiAgICAgIHNlYXJjaDoge1xuICAgICAgICB0b3BLOiBvcHRpb25zPy50b3BLID8/IDUsXG4gICAgICAgIG1pblNjb3JlOiBvcHRpb25zPy5taW5TY29yZSA/PyAwLjEsXG4gICAgICB9LFxuICAgICAgLi4uKG9wdGlvbnM/LnR0bE1zICE9PSB1bmRlZmluZWQgPyB7IHR0bDogb3B0aW9ucy50dGxNcyB9IDoge30pLFxuICAgICAgYmxvY2tpbmdSZWZyZXNoOiBmYWxzZSxcbiAgICB9KSxcbiAgXTtcbn1cblxuLyoqXG4gKiBUb29sIGlkcyBvbiBgdG9vbHNgIHRoYXQgYXJlIGFwcHJvdmFsLWdhdGVkIChgcmVxdWlyZUFwcHJvdmFsOiB0cnVlYCkuXG4gKiBLZXlzIGFyZSB1c2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBhIHRvb2wgb21pdHMgYW4gZXhwbGljaXQgYGlkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcHJvdmFsR2F0ZWRUb29sSWRzKHRvb2xzOiBNYXN0cmFUb29scyk6IHN0cmluZ1tdIHtcbiAgaWYgKCF0b29scyB8fCB0eXBlb2YgdG9vbHMgIT09IFwib2JqZWN0XCIpIHJldHVybiBbXTtcbiAgcmV0dXJuIFtcbiAgICAuLi5vYmplY3RcbiAgICAgIC5zZXF1ZW5jZShPYmplY3QuZW50cmllcyh0b29scykpXG4gICAgICAuZmlsdGVyKChbLCB0b29sXSkgPT4gaXNBcHByb3ZhbEdhdGVkVG9vbCh0b29sKSlcbiAgICAgIC5tYXAoKFtrZXksIHRvb2xdKSA9PiByZXNvbHZlVG9vbElkKHRvb2wsIGtleSkpLFxuICBdO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGEgTWFzdHJhIC8gQUkgU0RLIHRvb2wgcGF1c2VzIGZvciBodW1hbiBhcHByb3ZhbCBiZWZvcmUgZXhlY3V0ZS4gKi9cbmZ1bmN0aW9uIGlzQXBwcm92YWxHYXRlZFRvb2wodG9vbDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIXRvb2wgfHwgdHlwZW9mIHRvb2wgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuICh0b29sIGFzIHsgcmVxdWlyZUFwcHJvdmFsPzogYm9vbGVhbiB9KS5yZXF1aXJlQXBwcm92YWwgPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUb29sSWQodG9vbDogdW5rbm93biwgZmFsbGJhY2tLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICh0b29sICYmIHR5cGVvZiB0b29sID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiAodG9vbCBhcyB7IGlkPzogc3RyaW5nIH0pLmlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuICh0b29sIGFzIHsgaWQ6IHN0cmluZyB9KS5pZDtcbiAgfVxuICByZXR1cm4gZmFsbGJhY2tLZXk7XG59XG5cbi8qKlxuICogQXBwcm92YWwtZ2F0ZWQgdG9vbHMgc3VzcGVuZCB0aGUgYWdlbnQgbG9vcCB1bnRpbCBhIGh1bWFuIGFwcHJvdmVzLlxuICogTWFzdHJhIHBlcnNpc3RzIHRob3NlIHN1c3BlbmRlZCBydW5zIGluIE1hc3RyYS1pbnN0YW5jZS1sZXZlbCBzdG9yYWdlXG4gKiAoYG1lbW9yeUJ1aWxkZXIuaW5zdGFuY2VTdG9yYWdlKClgKSwgbm90IHBlci1hZ2VudCBtZW1vcnkgLSBzbyBib290XG4gKiBtdXN0IGZhaWwgZmFzdCB3aGVuIHN1Y2ggYSB0b29sIGlzIHJlZ2lzdGVyZWQgd2l0aG91dCBzdG9yYWdlLlxuICovXG5mdW5jdGlvbiBhc3NlcnRBcHByb3ZhbEdhdGVkVG9vbHNIYXZlU3RvcmFnZShcbiAgZ2F0ZWQ6IEFycmF5PHsgYWdlbnRJZDogc3RyaW5nOyB0b29sSWRzOiBzdHJpbmdbXSB9PixcbiAgbWVtb3J5QnVpbGRlcjogTWVtb3J5QnVpbGRlciB8IHVuZGVmaW5lZCxcbik6IHZvaWQge1xuICBpZiAoZ2F0ZWQubGVuZ3RoID09PSAwKSByZXR1cm47XG4gIGlmIChtZW1vcnlCdWlsZGVyPy5pbnN0YW5jZVN0b3JhZ2UoKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGRldGFpbCA9IGdhdGVkXG4gICAgLm1hcCgoeyBhZ2VudElkLCB0b29sSWRzIH0pID0+IGAke2FnZW50SWR9OiAke3Rvb2xJZHMuam9pbihcIiwgXCIpfWApXG4gICAgLmpvaW4oXCI7IFwiKTtcbiAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICBcIm1hc3RyYTogYXBwcm92YWwtZ2F0ZWQgdG9vbHMgcmVxdWlyZSBwbHVnaW4gc3RvcmFnZSAoUG9zdGdyZXNTdG9yZSkgdG8gcGVyc2lzdCBzdXNwZW5kZWQgcnVucy4gXCIgK1xuICAgICAgYEFmZmVjdGVkIGFnZW50cy90b29sczogJHtkZXRhaWx9LiBgICtcbiAgICAgIFwiUmVnaXN0ZXIgbGFrZWJhc2UoKSBiZWZvcmUgbWFzdHJhKCkgc28gc3RvcmFnZSBhdXRvLWVuYWJsZXMsIG9yIHBhc3Mgc3RvcmFnZTogdHJ1ZSBleHBsaWNpdGx5LlwiLFxuICApO1xufVxuXG4vKipcbiAqIERlc2NyaWJlIGhvdyBhbiBhZ2VudCByZXNvbHZlcyBpdHMgdW5waW5uZWQgbW9kZWw6XG4gKlxuICogICAxLiBQZXItYWdlbnQgYGRlZi5tb2RlbGAgKHN0cmluZyBzdWdhciBpcyBjb25maWd1cmVkOyBhIGZ1bmN0aW9uIGlzXG4gKiAgICAgIGR5bmFtaWMpLlxuICogICAyLiBQbHVnaW4tbGV2ZWwgYGNvbmZpZy5kZWZhdWx0TW9kZWxgIChzYW1lIHJ1bGVzKS5cbiAqICAgMy4gYERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FYCBlbnYgdmFyLlxuICogICA0LiBBdXRvbWF0aWMgbGl2ZS1jYXRhbG9ndWUgcmFua2luZyB3aGVuIG5vbmUgaXMgc2V0LlxuICpcbiAqIFVzZWQgZm9yIHRoZSBzdGFydHVwIGBhZ2VudCByZWdpc3RlcmVkYCBsb2cgc28gb3BlcmF0b3JzIGNhbiBzZWVcbiAqIGBkZWZhdWx0TW9kZWxGYWxsYmFja3NgIHJlbWFpbnMgYW4gb3BlcmF0b3ItcGlubmVkIGNhbmRpZGF0ZSBsaXN0IGluc2lkZSB0aGVcbiAqIGF1dG9tYXRpYyBsaXZlIGxvb2t1cDsgaXQgaXMgbm90IGFkdmVydGlzZWQgYXMgYSBtb2RlbCB1bnRpbCBhdmFpbGFiaWxpdHkgaXNcbiAqIGNoZWNrZWQuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlQWdlbnREZWZhdWx0TW9kZWwoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBkZWY6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbixcbik6IEFnZW50RGVmYXVsdE1vZGVsIHtcbiAgY29uc3QgZWZmZWN0aXZlID0gZGVmLm1vZGVsID8/IGNvbmZpZy5kZWZhdWx0TW9kZWw7XG4gIGlmICh0eXBlb2YgZWZmZWN0aXZlID09PSBcInN0cmluZ1wiKSByZXR1cm4geyBraW5kOiBcImNvbmZpZ3VyZWRcIiwgbW9kZWw6IGVmZmVjdGl2ZSB9O1xuICBpZiAoZWZmZWN0aXZlICE9PSB1bmRlZmluZWQpIHJldHVybiB7IGtpbmQ6IFwiZHluYW1pY1wiIH07XG4gIGNvbnN0IGVudmlyb25tZW50ID0gcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUU7XG4gIHJldHVybiBlbnZpcm9ubWVudCA/IHsga2luZDogXCJjb25maWd1cmVkXCIsIG1vZGVsOiBlbnZpcm9ubWVudCB9IDogeyBraW5kOiBcImF1dG9cIiB9O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBgY29uZmlnLmFnZW50c2AgaW50byBhIGBSZWNvcmQ8aWQsIGRlZmluaXRpb24+YC4gQWNjZXB0c1xuICogYW55IG9mIHRoZSB0aHJlZSBzaGFwZXMgZG9jdW1lbnRlZCBvblxuICoge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudHN9OlxuICpcbiAqIC0gUmVjb3JkIC0gcmV0dXJuZWQgYXMtaXMgd2hlbiBub24tZW1wdHkuXG4gKiAtIFNpbmdsZSBkZWZpbml0aW9uIChkZXRlY3RlZCB2aWEgdGhlIHJlcXVpcmVkIGBpbnN0cnVjdGlvbnNgXG4gKiAgIGZpZWxkKSAtIGtleWVkIGJ5IGBzbHVnaWZ5KGRlZi5uYW1lKWAgb3IgYEZBTExCQUNLX0FHRU5UX0lEYC5cbiAqIC0gQXJyYXkgLSBrZXllZCBieSBgc2x1Z2lmeShkZWYubmFtZSlgIG9yIGBhZ2VudF8ke2l9YDsgZHVwbGljYXRlXG4gKiAgIHNsdWdzIGZhaWwgbG91ZGx5IHNvIHVzZXJzIGtub3cgdG8gc2V0IGV4cGxpY2l0IG5hbWVzLlxuICpcbiAqIE9taXR0ZWQgb3IgZW1wdHkgaW5wdXRzIGZhbGwgYmFjayB0byBhIHNpbmdsZSBidWlsdC1pbiBhbmFseXN0IHNvXG4gKiB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZyBjaGF0IHJvdXRlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBSZWNvcmQ8c3RyaW5nLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24+IHtcbiAgY29uc3QgaW5wdXQgPSBjb25maWcuYWdlbnRzO1xuICBpZiAoIWlucHV0KSByZXR1cm4gZmFsbGJhY2tEZWZpbml0aW9ucygpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIGlmIChpbnB1dC5sZW5ndGggPT09IDApIHJldHVybiBmYWxsYmFja0RlZmluaXRpb25zKCk7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24+ID0ge307XG4gICAgaW5wdXQuZm9yRWFjaCgoZGVmLCBpKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYsIGkpO1xuICAgICAgaWYgKG91dFtrZXldKSB7XG4gICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICAgICAgYG1hc3RyYTogZHVwbGljYXRlIGFnZW50IGlkIFwiJHtrZXl9XCIgZGVyaXZlZCBmcm9tIG5hbWUgXCIke2RlZi5uYW1lID8/IFwiXCJ9XCI7IGAgK1xuICAgICAgICAgICAgYHNldCB1bmlxdWUgXFxgbmFtZVxcYHMgb24gZWFjaCBkZWZpbml0aW9uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG91dFtrZXldID0gZGVmO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyBTaW5nbGUtZGVmaW5pdGlvbiBzaG9ydGhhbmQ6IGFuIGFnZW50IG93bnMgdGhlIHJlcXVpcmVkIGBpbnN0cnVjdGlvbnNgXG4gIC8vIGZpZWxkIChzdGF0aWMgb3IgZHluYW1pYyk7IGEgcmVjb3JkLW9mLWFnZW50cyBuZXZlciBvd25zIGl0IGRpcmVjdGx5LlxuICBpZiAoXCJpbnN0cnVjdGlvbnNcIiBpbiBpbnB1dCkge1xuICAgIGNvbnN0IGRlZiA9IGlucHV0IGFzIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbjtcbiAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYpO1xuICAgIHJldHVybiB7IFtrZXldOiBkZWYgfTtcbiAgfVxuXG4gIGNvbnN0IHJlY29yZCA9IGlucHV0IGFzIFJlY29yZDxzdHJpbmcsIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbj47XG4gIGlmIChPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTtcbiAgcmV0dXJuIHJlY29yZDtcbn1cblxuLyoqIERlcml2ZSBhIHJlZ2lzdHJ5IGlkIGZyb20gYSBkZWZpbml0aW9uJ3MgYG5hbWVgLCB3aXRoIGEgZmFsbGJhY2suICovXG5mdW5jdGlvbiBkZXJpdmVBZ2VudEtleShkZWY6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbiwgaW5kZXg/OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoZGVmLm5hbWUpIHtcbiAgICBjb25zdCBzbHVnID0gc3RyaW5nVXRpbHMudG9JZGVudGlmaWVyKGRlZi5uYW1lKTtcbiAgICBpZiAoc2x1ZykgcmV0dXJuIHNsdWc7XG4gIH1cbiAgcmV0dXJuIGluZGV4ID09PSB1bmRlZmluZWQgPyBGQUxMQkFDS19BR0VOVF9JRCA6IGBhZ2VudF8ke2luZGV4fWA7XG59XG5cbi8qKiBCdWlsdC1pbiBmYWxsYmFjayByZWdpc3RyeSB1c2VkIHdoZW4gYGFnZW50c2AgaXMgb21pdHRlZCAvIGVtcHR5LiAqL1xuZnVuY3Rpb24gZmFsbGJhY2tEZWZpbml0aW9ucygpOiBSZWNvcmQ8c3RyaW5nLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24+IHtcbiAgcmV0dXJuIHtcbiAgICBbRkFMTEJBQ0tfQUdFTlRfSURdOiB7XG4gICAgICBuYW1lOiBcIkRlZmF1bHQgQWdlbnRcIixcbiAgICAgIGluc3RydWN0aW9uczogRkFMTEJBQ0tfQUdFTlRfSU5TVFJVQ1RJT05TLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUGljayB0aGUgZWZmZWN0aXZlIG1vZGVsIHNwZWMgZm9yIGFuIGFnZW50LiBGYWxsYmFjayBsYWRkZXIsIGluXG4gKiBvcmRlcjpcbiAqXG4gKiAgIDEuIFBlci1hZ2VudCBgZGVmLm1vZGVsYCAoc3RyaW5nIHN1Z2FyIG9yIGBEeW5hbWljQXJndW1lbnRgKS5cbiAqICAgMi4gUGx1Z2luLWxldmVsIGBjb25maWcuZGVmYXVsdE1vZGVsYCAoc3RyaW5nIHN1Z2FyIG9yXG4gKiAgICAgIGBEeW5hbWljQXJndW1lbnRgKSAtIG1pcnJvcnMgQXBwS2l0J3MgYGFnZW50cyh7IGRlZmF1bHRNb2RlbCB9KWAuXG4gKiAgIDMuIFRoZSBhdXRvLXJlc29sdmVyIHRoYXQgbWludHMgdXNlci1zY29wZWQgdG9rZW5zIGFnYWluc3RcbiAqICAgICAgYC9zZXJ2aW5nLWVuZHBvaW50c2AgdmlhIHtAbGluayBidWlsZE1vZGVsfS5cbiAqXG4gKiBTdHJpbmcgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIGBtb2RlbElkYCBzdWdhciBhbmQgdGhyZWFkZWQgdGhyb3VnaFxuICogYGJ1aWxkTW9kZWxgJ3Mgb3ZlcnJpZGUgaG9vayBzbyB0aGUgcnVudGltZSBmdXp6eSBtYXRjaGVyIGFuZCB0aGVcbiAqIHBlci1yZXF1ZXN0IGBYLU1hc3RyYS1Nb2RlbGAgb3ZlcnJpZGUgbGF5ZXIgb24gdG9wIG9mIHRoZSBzdGF0aWNcbiAqIGNob2ljZS4gTm9uLXN0cmluZyBgRHluYW1pY0FyZ3VtZW50YHMgYXJlIHBhc3NlZCB0aHJvdWdoIHZlcmJhdGltO1xuICogY2FsbGVycyB0aGF0IG5lZWQgZnVsbCBjb250cm9sIG92ZXIgYHByb3ZpZGVySWRgIC8gYGhlYWRlcnNgIC9cbiAqIGBtb2RlbElkYCBieXBhc3MgdGhlIHJlc29sdmVyIHBpcGVsaW5lIGVudGlyZWx5LlxuICovXG5mdW5jdGlvbiByZXNvbHZlTW9kZWwoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBvdmVycmlkZTogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW1wibW9kZWxcIl0sXG4pOiBBZ2VudENvbmZpZ1tcIm1vZGVsXCJdIHtcbiAgY29uc3QgZWZmZWN0aXZlID0gb3ZlcnJpZGUgPz8gY29uZmlnLmRlZmF1bHRNb2RlbDtcbiAgaWYgKGVmZmVjdGl2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IGJ1aWxkTW9kZWwoY29uZmlnLCByZXF1ZXN0Q29udGV4dCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBlZmZlY3RpdmUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBtb2RlbElkID0gZWZmZWN0aXZlO1xuICAgIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiBidWlsZE1vZGVsKGNvbmZpZywgcmVxdWVzdENvbnRleHQsIHsgbW9kZWxJZCB9KTtcbiAgfVxuICByZXR1cm4gZWZmZWN0aXZlO1xufVxuXG4vKipcbiAqIFJlc29sdmUgb25seSB0aGUgdG9vbHMgZXhwbGljaXRseSBzdXBwbGllZCBieSBvbmUgYWdlbnQgZGVmaW5pdGlvbi5cbiAqIENhbGxiYWNrIGVycm9ycyBwcm9wYWdhdGUgdmVyYmF0aW0gc28gdGhlIG9yaWdpbmFsIHN0YWNrIHN1cnZpdmVzIC0gdGhlXG4gKiBjYWxsZXIgYWxyZWFkeSBrbm93cyB3aGljaCBhZ2VudCB3YXMgcmVnaXN0ZXJpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVVc2VyVG9vbHMoXG4gIGRlZlRvb2xzOiBBbnlNYXN0cmFBZ2VudERlZmluaXRpb25bXCJ0b29sc1wiXSxcbiAgcGx1Z2luczogTWFzdHJhUGx1Z2lucyxcbik6IFByb21pc2U8TWFzdHJhVG9vbHM+IHtcbiAgaWYgKCFkZWZUb29scykgcmV0dXJuIHt9O1xuICByZXR1cm4gdHlwZW9mIGRlZlRvb2xzID09PSBcImZ1bmN0aW9uXCIgPyBkZWZUb29scyhwbHVnaW5zKSA6IGRlZlRvb2xzO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQWdlbnRXb3Jrc3BhY2UoXG4gIHdvcmtzcGFjZTogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW1wid29ya3NwYWNlXCJdLFxuKTogV29ya3NwYWNlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF3b3Jrc3BhY2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2Ygd29ya3NwYWNlID09PSBcImZ1bmN0aW9uXCIgPyB3b3Jrc3BhY2UoKSA6IHdvcmtzcGFjZTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUge0BsaW5rIE1hc3RyYVBsdWdpbnN9IHJ1bnRpbWUgcHJveHkgaGFuZGVkIHRvXG4gKiBgdG9vbHMocGx1Z2lucylgIGNhbGxiYWNrcy5cbiAqXG4gKiBJbXBsZW1lbnRlZCBhcyBhIGBQcm94eWAgb3ZlciB0aGUgQXBwS2l0IHBsdWdpbiBjb250ZXh0IHNvXG4gKiBgcGx1Z2lucy48bmFtZT5gIHJlc29sdmVzIGF0IGZpcnN0IGFjY2Vzcy4gQW55IHNpYmxpbmcgcGx1Z2luIHRoYXRcbiAqIGltcGxlbWVudHMgQXBwS2l0J3Mgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYHRvb2xraXQob3B0cz8pYCArIGBleGVjdXRlQWdlbnRUb29sKG5hbWUsIGFyZ3MsIHNpZ25hbD8sIGNvbnRleHQ/KWApIGlzXG4gKiBhdXRvLWFkYXB0ZWQgaW50byBNYXN0cmEgdG9vbHMuIFVua25vd24gbmFtZXMgcmV0dXJuIGB1bmRlZmluZWRgLFxuICogbWF0Y2hpbmcgQXBwS2l0J3MgYFBsdWdpbnNgIHNlbWFudGljcyBzbyBgcGx1Z2lucy5mb28/LnRvb2xraXQoKWBcbiAqIHJlbWFpbnMgc2FmZSBpbiBlbnZpcm9ubWVudHMgd2hlcmUgYGZvb2AgaXNuJ3QgcmVnaXN0ZXJlZC5cbiAqXG4gKiBgZ2VuaWVgIGlzIHNwZWNpYWwtY2FzZWQgdG8gc3dhcCB0aGUgZ2VuZXJpYyBBcHBLaXQgdG9vbGtpdCAod2hpY2hcbiAqIHJ1bnMgYGV4ZWN1dGVBZ2VudFRvb2xgIGFuZCBvbmx5IGVtaXRzIGEgc2luZ2xlIGZpbmFsIGB0b29sLXJlc3VsdGBcbiAqIGNodW5rIHBlciBjYWxsKSBmb3IgdGhlIHN0cmVhbWluZy1hd2FyZSB0b29scyBidWlsdCBieVxuICoge0BsaW5rIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXJ9LiBUaGUgc3RyZWFtaW5nIHZhcmlhbnQgZm9yd2FyZHMgZWFjaFxuICogR2VuaWUgd2lyZSBldmVudCAoc3RhdHVzLCBTUUwsIHJvdyBjb3VudHMsIGVycm9ycykgb3V0IHRocm91Z2ggdGhlXG4gKiBNYXN0cmEgYGN0eC53cml0ZXJgLCBzbyB0aGUgVUkgZ2V0cyBgdG9vbC1vdXRwdXRgIGNodW5rcyBpbiByZWFsXG4gKiB0aW1lIGluc3RlYWQgb2Ygc3RhcmluZyBhdCBhIHNwaW5uZXIgZm9yIHRoZSBmdWxsIEdlbmllIHJvdW5kLXRyaXAuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUGx1Z2luc01hcChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGNvbnRleHQ6IHBsdWdpblJlZ2lzdHJ5LlBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkLFxuKTogTWFzdHJhUGx1Z2lucyB7XG4gIGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB8IG51bGw+KCk7XG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgTWFzdHJhUGx1Z2lucywge1xuICAgIGdldChfdGFyZ2V0LCBwcm9wTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wTmFtZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGlmIChjYWNoZS5oYXMocHJvcE5hbWUpKSByZXR1cm4gY2FjaGUuZ2V0KHByb3BOYW1lKSA/PyB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBwcm92aWRlciA9IHJlc29sdmVQcm92aWRlcihjb25maWcsIGNvbnRleHQsIHByb3BOYW1lKTtcbiAgICAgIGNhY2hlLnNldChwcm9wTmFtZSwgcHJvdmlkZXIpO1xuICAgICAgcmV0dXJuIHByb3ZpZGVyID8/IHVuZGVmaW5lZDtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSByaWdodCB7QGxpbmsgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyfSBmb3IgYSBzaWJsaW5nXG4gKiBwbHVnaW4gbG9va3VwLiBSZXR1cm5zIHRoZSBHZW5pZSBhZ2VudC1iYWNrZWQgYWRhcHRlciB3aGVuXG4gKiB0aGUgY2FsbGVyIGFza3MgZm9yIGBnZW5pZWAgQU5EIGF0IGxlYXN0IG9uZSBzcGFjZSBpcyByZWFjaGFibGVcbiAqIHZpYSB7QGxpbmsgcmVzb2x2ZUdlbmllU3BhY2VzfSAodGhlIGV4cGxpY2l0XG4gKiBgY29uZmlnLmdlbmllU3BhY2VzYCwgdGhlIHJlZ2lzdGVyZWQgQXBwS2l0IGBnZW5pZSgpYCBwbHVnaW4nc1xuICogYHNwYWNlc2AgY29uZmlnLCBvciB0aGUgYERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSURgIGVudiB2YXIpLlxuICogRmFsbHMgYmFjayB0byB0aGUgZ2VuZXJpYyBBcHBLaXQgYFRvb2xQcm92aWRlcmAgYWRhcHRlciBmb3JcbiAqIGV2ZXJ5IG90aGVyIHBsdWdpbiBuYW1lLiBgY29uZmlnYCBpcyB0aHJlYWRlZCB0aHJvdWdoIHNvIHRoZVxuICogR2VuaWUgYWdlbnQgaW5oZXJpdHMgdGhlIHNhbWUgbW9kZWwgcmVzb2x2ZXIgLyBmYWxsYmFja1xuICogbGFkZGVyIHRoZSBjYWxsaW5nIGFnZW50cyB1c2UuXG4gKlxuICogVGhlIEdlbmllIHRvb2xzIHRhbGsgdG8gR2VuaWUgZGlyZWN0bHkgdGhyb3VnaCBgQGRieC10b29scy9nZW5pZWBcbiAqIChgZ2VuaWVFdmVudENoYXRgKSBhbmQgdGhlIHdvcmtzcGFjZSBgc3RhdGVtZW50RXhlY3V0aW9uLmdldFN0YXRlbWVudGBcbiAqIEFQSTsgQXBwS2l0J3Mgc3RvY2sgYGdlbmllYCBwbHVnaW4gY29udHJpYnV0ZXMgb25seSBpdHMgcmVzb3VyY2VcbiAqIG1hbmlmZXN0IGFuZCBgc3BhY2VzYCBjb25maWcsIHNvIGFuIGBhcHAueWFtbGAgcmVzb3VyY2UgYmluZGluZyBhbmQgYVxuICogYGdlbmllKHsgc3BhY2VzIH0pYCByZWNvcmQgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGhlcmUgYXMgdGhleSBkbyB0aGVyZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVByb3ZpZGVyKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgY29udGV4dDogcGx1Z2luUmVnaXN0cnkuUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQsXG4gIHByb3BOYW1lOiBzdHJpbmcsXG4pOiBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIgfCBudWxsIHtcbiAgaWYgKHByb3BOYW1lID09PSBcImdlbmllXCIpIHtcbiAgICBjb25zdCBzcGFjZXMgPSByZXNvbHZlR2VuaWVTcGFjZXMoY29uZmlnLCBjb250ZXh0KTtcbiAgICBpZiAoT2JqZWN0LmtleXMoc3BhY2VzKS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyKHtcbiAgICAgIHNwYWNlcyxcbiAgICAgIGNvbmZpZyxcbiAgICB9KSBhcyBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXI7XG4gIH1cbiAgY29uc3QgcGx1Z2luID0gY29udGV4dD8uZ2V0UGx1Z2lucygpLmdldChwcm9wTmFtZSk7XG4gIHJldHVybiBhZGFwdFBsdWdpblRvb2xraXQocGx1Z2luLCBwcm9wTmFtZSk7XG59XG5cbnR5cGUgQ29udGV4dHVhbFRvb2xQcm92aWRlciA9IFBhcnRpYWw8UGljazxUb29sUHJvdmlkZXIsIFwiZ2V0QWdlbnRUb29sc1wiPj4gJiB7XG4gIHRvb2xraXQ/OiAoXG4gICAgb3B0cz86IFRvb2xraXRPcHRpb25zLFxuICApID0+XG4gICAgfCBSZXR1cm5UeXBlPFBsdWdpblRvb2xraXRQcm92aWRlcltcInRvb2xraXRcIl0+XG4gICAgfCBQcm9taXNlPFJldHVyblR5cGU8UGx1Z2luVG9vbGtpdFByb3ZpZGVyW1widG9vbGtpdFwiXT4+O1xuICBleGVjdXRlQWdlbnRUb29sPzogKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBhcmdzOiB1bmtub3duLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICAgIGNvbnRleHQ/OiBBZ2VudFRvb2xFeGVjdXRpb25Db250ZXh0LFxuICApID0+IFByb21pc2U8dW5rbm93bj47XG59O1xuXG4vKipcbiAqIEFkYXB0IGFuIEFwcEtpdCBgVG9vbFByb3ZpZGVyYCBwbHVnaW4gaW5zdGFuY2UgaW50byBhXG4gKiB7QGxpbmsgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyfS4gUmV0dXJucyBgbnVsbGAgZm9yIGFueSBwbHVnaW5cbiAqIHRoYXQgZG9lc24ndCBpbXBsZW1lbnQgYGV4ZWN1dGVBZ2VudFRvb2xgIHBsdXMgZWl0aGVyIEFwcEtpdCdzIG5hdGl2ZVxuICogYHRvb2xraXRgIG9yIGBnZXRBZ2VudFRvb2xzYCBzdXJmYWNlLlxuICovXG5mdW5jdGlvbiBhZGFwdFBsdWdpblRvb2xraXQoXG4gIHBsdWdpbjogdW5rbm93bixcbiAgcGx1Z2luTmFtZTogc3RyaW5nLFxuKTogTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHwgbnVsbCB7XG4gIGlmICghcGx1Z2luIHx8IHR5cGVvZiBwbHVnaW4gIT09IFwib2JqZWN0XCIpIHJldHVybiBudWxsO1xuICBjb25zdCBwID0gcGx1Z2luIGFzIENvbnRleHR1YWxUb29sUHJvdmlkZXI7XG4gIGlmIChcbiAgICB0eXBlb2YgcC5leGVjdXRlQWdlbnRUb29sICE9PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAodHlwZW9mIHAudG9vbGtpdCAhPT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBwLmdldEFnZW50VG9vbHMgIT09IFwiZnVuY3Rpb25cIilcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0b29sa2l0KG9wdHM/OiBUb29sa2l0T3B0aW9ucyk6IE1hc3RyYVRvb2xzIHwgUHJvbWlzZTxNYXN0cmFUb29scz4ge1xuICAgICAgY29uc3QgZW50cmllcyA9XG4gICAgICAgIHR5cGVvZiBwLnRvb2xraXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gcC50b29sa2l0KG9wdHMpXG4gICAgICAgICAgOiB0b29sa2l0RW50cmllc0Zyb21EZWZpbml0aW9ucyhwbHVnaW5OYW1lLCBwLmdldEFnZW50VG9vbHMhKCksIG9wdHMpO1xuICAgICAgaWYgKGlzUHJvbWlzZUxpa2UoZW50cmllcykpIHtcbiAgICAgICAgcmV0dXJuIGVudHJpZXMudGhlbigocmVzb2x2ZWQpID0+IHRvb2xraXRFbnRyaWVzVG9NYXN0cmFUb29scyhyZXNvbHZlZCwgcCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRvb2xraXRFbnRyaWVzVG9NYXN0cmFUb29scyhlbnRyaWVzLCBwKTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiB0b29sa2l0RW50cmllc0Zyb21EZWZpbml0aW9ucyhcbiAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICBkZWZpbml0aW9uczogQWdlbnRUb29sRGVmaW5pdGlvbltdLFxuICBvcHRpb25zOiBUb29sa2l0T3B0aW9ucyA9IHt9LFxuKTogUmVjb3JkPHN0cmluZywgVG9vbGtpdEVudHJ5PiB7XG4gIHJldHVybiB0b29sa2l0RW50cmllcy5lbnRyaWVzKHBsdWdpbk5hbWUsIGRlZmluaXRpb25zLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gaXNQcm9taXNlTGlrZTxUPih2YWx1ZTogVCB8IFByb21pc2U8VD4pOiB2YWx1ZSBpcyBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIHR5cGVvZiAodmFsdWUgYXMgeyB0aGVuPzogdW5rbm93biB9KT8udGhlbiA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG5mdW5jdGlvbiB0b29sa2l0RW50cmllc1RvTWFzdHJhVG9vbHMoXG4gIGVudHJpZXM6IFJlY29yZDxzdHJpbmcsIFRvb2xraXRFbnRyeT4sXG4gIHBsdWdpbjogQ29udGV4dHVhbFRvb2xQcm92aWRlcixcbik6IE1hc3RyYVRvb2xzIHtcbiAgY29uc3QgdG9vbHM6IE1hc3RyYVRvb2xzID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgdG9vbHNba2V5XSA9IHRvb2xraXRFbnRyeVRvTWFzdHJhVG9vbChlbnRyeSwgcGx1Z2luKTtcbiAgfVxuICByZXR1cm4gdG9vbHM7XG59XG5cbi8qKlxuICogV3JhcCBhIHNpbmdsZSB7QGxpbmsgQXBwS2l0VG9vbGtpdEVudHJ5fSBhcyBhIE1hc3RyYSB0b29sIHdob3NlXG4gKiBgZXhlY3V0ZWAgZGlzcGF0Y2hlcyBiYWNrIHRocm91Z2ggYHBsdWdpbi5leGVjdXRlQWdlbnRUb29sKC4uLilgIHNvXG4gKiBBcHBLaXQncyBPQk8gYXV0aCAoYGFzVXNlcmApLCB0ZWxlbWV0cnkgc3BhbnMsIGFuZCB0aGUgTWFzdHJhIG1lbW9yeSByZXNvdXJjZVxuICogaWQgc3RheSBpbnRhY3QuIEpTT04gU2NoZW1hIHBhcmFtZXRlcnMgcGFzcyB0aHJvdWdoIHVuY2hhbmdlZCAtIE1hc3RyYSdzXG4gKiBgUHVibGljU2NoZW1hYCBhY2NlcHRzIGBKU09OU2NoZW1hN2AgZGlyZWN0bHkgdmlhIGBAbWFzdHJhL3NjaGVtYS1jb21wYXRgLlxuICovXG5mdW5jdGlvbiB0b29sa2l0RW50cnlUb01hc3RyYVRvb2woZW50cnk6IFRvb2xraXRFbnRyeSwgcGx1Z2luOiBDb250ZXh0dWFsVG9vbFByb3ZpZGVyKTogVG9vbCB7XG4gIGNvbnN0IGFubm90YXRpb25zID0gZW50cnkuYW5ub3RhdGlvbnMgPz8gZW50cnkuZGVmLmFubm90YXRpb25zO1xuICBjb25zdCBlZmZlY3QgPSBhbm5vdGF0aW9ucz8uZWZmZWN0O1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gZWZmZWN0ID09PSBcImRlc3RydWN0aXZlXCIgfHwgYW5ub3RhdGlvbnM/LmRlc3RydWN0aXZlID09PSB0cnVlO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IGAke2VudHJ5LnBsdWdpbk5hbWV9X18ke2VudHJ5LmxvY2FsTmFtZX1gLFxuICAgIGRlc2NyaXB0aW9uOiBlbnRyeS5kZWYuZGVzY3JpcHRpb24sXG4gICAgLi4uKGVudHJ5LmRlZi5wYXJhbWV0ZXJzID8geyBpbnB1dFNjaGVtYTogZW50cnkuZGVmLnBhcmFtZXRlcnMgYXMgbmV2ZXIgfSA6IHt9KSxcbiAgICAuLi4ocmVxdWlyZXNBcHByb3ZhbCA/IHsgcmVxdWlyZUFwcHJvdmFsOiB0cnVlIH0gOiB7fSksXG4gICAgLi4uKGFubm90YXRpb25zXG4gICAgICA/IHtcbiAgICAgICAgICBtY3A6IHtcbiAgICAgICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgICAgIHJlYWRPbmx5SGludDogZWZmZWN0ID09PSBcInJlYWRcIiB8fCBhbm5vdGF0aW9ucy5yZWFkT25seSA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiBlZmZlY3QgPT09IFwiZGVzdHJ1Y3RpdmVcIiB8fCBhbm5vdGF0aW9ucy5kZXN0cnVjdGl2ZSA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgaWRlbXBvdGVudEhpbnQ6IGFubm90YXRpb25zLmlkZW1wb3RlbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uID0gY29udGV4dCBhc1xuICAgICAgICB8IHtcbiAgICAgICAgICAgIGFnZW50PzogeyB0b29sQ2FsbElkPzogc3RyaW5nIH07XG4gICAgICAgICAgICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAgICAgICAgICAgcmVxdWVzdENvbnRleHQ/OiB7IGdldChrZXk6IHN0cmluZyk6IHVua25vd24gfTtcbiAgICAgICAgICAgIHdyaXRlcj86IHtcbiAgICAgICAgICAgICAgY3VzdG9tKHBhcnQ6IHsgdHlwZTogc3RyaW5nOyBkYXRhOiB1bmtub3duIH0pOiBQcm9taXNlPHZvaWQ+O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcmVzb3VyY2VJZCA9IGV4ZWN1dGlvbj8ucmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKTtcbiAgICAgIGNvbnN0IG1vZGVsID0gZXhlY3V0aW9uPy5yZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9SRVNPTFZFRF9NT0RFTF9LRVkpO1xuICAgICAgY29uc3QgdG9vbENhbGxJZCA9IGV4ZWN1dGlvbj8uYWdlbnQ/LnRvb2xDYWxsSWQ7XG4gICAgICBjb25zdCB3cml0ZXIgPSBleGVjdXRpb24/LndyaXRlcjtcbiAgICAgIHJldHVybiBwbHVnaW4uZXhlY3V0ZUFnZW50VG9vbCEoZW50cnkubG9jYWxOYW1lLCBpbnB1dCwgZXhlY3V0aW9uPy5hYm9ydFNpZ25hbCwge1xuICAgICAgICAuLi4odHlwZW9mIHJlc291cmNlSWQgPT09IFwic3RyaW5nXCIgPyB7IHJlc291cmNlSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIiA/IHsgbW9kZWwgfSA6IHt9KSxcbiAgICAgICAgLi4uKHdyaXRlciAmJiB0b29sQ2FsbElkXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHdyaXRlUHJvZ3Jlc3M6IGFzeW5jIChldmVudDogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IFRvb2xQcm9ncmVzc0V2ZW50U2NoZW1hLnBhcnNlKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB3cml0ZXJcbiAgICAgICAgICAgICAgICAgIC5jdXN0b20oe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBUT09MX1BST0dSRVNTX1BBUlRfVFlQRSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogeyB0b29sQ2FsbElkLCBldmVudDogcGFyc2VkIH0sXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==