@dbx-tools/appkit-mastra 0.9.153 → 0.9.157
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/README.md +4 -3
- package/index.ts +32 -24
- package/lib/index.d.ts +32 -24
- package/lib/index.js +32 -23
- package/lib/src/agents.d.ts +5 -6
- package/lib/src/agents.js +12 -15
- package/lib/src/chart.js +33 -33
- package/lib/src/chat.js +10 -13
- package/lib/src/config.d.ts +12 -13
- package/lib/src/config.js +4 -4
- package/lib/src/evaluation.js +7 -9
- package/lib/src/feedback-mode.d.ts +1 -1
- package/lib/src/feedback-mode.js +1 -1
- package/lib/src/filesystems.js +6 -6
- package/lib/src/follow-up-suggestions.js +10 -10
- package/lib/src/genie-chat.js +27 -29
- package/lib/src/genie.d.ts +2 -2
- package/lib/src/genie.js +29 -29
- package/lib/src/identity.d.ts +3 -30
- package/lib/src/identity.js +2 -27
- package/lib/src/memory.d.ts +1 -1
- package/lib/src/memory.js +24 -6
- package/lib/src/mlflow.d.ts +4 -4
- package/lib/src/mlflow.js +15 -18
- package/lib/src/model.d.ts +3 -3
- package/lib/src/model.js +6 -6
- package/lib/src/monty-sandbox.js +8 -8
- package/lib/src/observability.d.ts +6 -5
- package/lib/src/observability.js +8 -6
- package/lib/src/plugin.d.ts +1 -1
- package/lib/src/plugin.js +49 -51
- package/lib/src/remote-skills.d.ts +3 -4
- package/lib/src/remote-skills.js +46 -46
- package/lib/src/rest.d.ts +2 -2
- package/lib/src/rest.js +3 -3
- package/lib/src/server.js +17 -20
- package/lib/src/serving.js +10 -11
- package/lib/src/statement.js +7 -7
- package/lib/src/storage-schema.js +4 -4
- package/lib/src/summarize.js +5 -5
- package/lib/src/telemetry.d.ts +0 -6
- package/lib/src/telemetry.js +34 -41
- package/lib/src/validation.js +3 -4
- package/lib/src/workspaces.d.ts +2 -2
- package/lib/src/workspaces.js +34 -36
- package/lib/src/writer.d.ts +2 -2
- package/lib/src/writer.js +3 -3
- package/package.json +17 -305
- package/src/agents.ts +27 -21
- package/src/chart.ts +43 -37
- package/src/chat.ts +10 -12
- package/src/config.ts +14 -15
- package/src/evaluation.ts +6 -8
- package/src/feedback-mode.ts +1 -1
- package/src/filesystems.ts +5 -5
- package/src/follow-up-suggestions.ts +9 -9
- package/src/genie-chat.ts +32 -31
- package/src/genie.ts +29 -29
- package/src/identity.ts +3 -38
- package/src/memory.ts +24 -6
- package/src/mlflow.ts +21 -21
- package/src/model.ts +7 -7
- package/src/monty-sandbox.ts +7 -7
- package/src/observability.ts +8 -6
- package/src/plugin.ts +78 -65
- package/src/remote-skills.ts +63 -55
- package/src/rest.ts +4 -4
- package/src/server.ts +32 -20
- package/src/serving.ts +14 -11
- package/src/statement.ts +10 -6
- package/src/storage-schema.ts +3 -3
- package/src/summarize.ts +4 -4
- package/src/telemetry.ts +49 -55
- package/src/validation.ts +2 -3
- package/src/workspaces.ts +52 -42
- package/src/writer.ts +3 -3
package/lib/src/chart.js
CHANGED
|
@@ -27,9 +27,9 @@
|
|
|
27
27
|
* @module
|
|
28
28
|
*/
|
|
29
29
|
import { AppKitError, CacheManager, ExecutionError } from "@databricks/appkit";
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
30
|
+
import { log, sleep, toError, id, parseRecord, toNumber, toDescription, } from "@dbx-tools/shared-core";
|
|
31
|
+
import { formatMarker, ChartTypeSchema, ChartSchema, } from "@dbx-tools/shared-mastra";
|
|
32
|
+
import { ModelClass } from "@dbx-tools/shared-model";
|
|
33
33
|
import { Agent } from "@mastra/core/agent";
|
|
34
34
|
import { createTool } from "@mastra/core/tools";
|
|
35
35
|
import { z } from "zod";
|
|
@@ -88,17 +88,17 @@ const chartDataPointSchema = z
|
|
|
88
88
|
if (typeof v === "number")
|
|
89
89
|
return Number.isFinite(v) ? v : null;
|
|
90
90
|
if (typeof v === "string") {
|
|
91
|
-
return
|
|
91
|
+
return toNumber(v) ?? null;
|
|
92
92
|
}
|
|
93
93
|
// Scatter `[x, y]` or heatmap `[xIndex, yIndex, value]`. Coerce
|
|
94
94
|
// stringified components; reject if any component is non-finite.
|
|
95
95
|
if (Array.isArray(v) && (v.length === 2 || v.length === 3)) {
|
|
96
|
-
const nums = v.map((c) =>
|
|
96
|
+
const nums = v.map((c) => toNumber(c));
|
|
97
97
|
return nums.every((n) => n !== undefined) ? nums : null;
|
|
98
98
|
}
|
|
99
99
|
if (typeof v === "object" && v !== null && "value" in v) {
|
|
100
100
|
const obj = v;
|
|
101
|
-
const val =
|
|
101
|
+
const val = toNumber(obj.value);
|
|
102
102
|
if (val === undefined)
|
|
103
103
|
return null;
|
|
104
104
|
// Coerce numeric / boolean / nullish names to strings so a
|
|
@@ -138,12 +138,12 @@ const seriesMarkTypeSchema = z
|
|
|
138
138
|
* across charts.
|
|
139
139
|
*/
|
|
140
140
|
export const chartPlanSchema = z.object({
|
|
141
|
-
chartType:
|
|
141
|
+
chartType: ChartTypeSchema,
|
|
142
142
|
title: z
|
|
143
143
|
.string()
|
|
144
144
|
.nullable()
|
|
145
145
|
.default(null)
|
|
146
|
-
.describe(
|
|
146
|
+
.describe(toDescription(`
|
|
147
147
|
Short title shown above the chart. Use null to fall back to the
|
|
148
148
|
\`title\` argument the caller passed in.
|
|
149
149
|
`)),
|
|
@@ -151,7 +151,7 @@ export const chartPlanSchema = z.object({
|
|
|
151
151
|
.string()
|
|
152
152
|
.nullable()
|
|
153
153
|
.default(null)
|
|
154
|
-
.describe(
|
|
154
|
+
.describe(toDescription(`
|
|
155
155
|
Axis label for the primary (usually bottom / value) axis.
|
|
156
156
|
Used for bar / horizontalBar / line / area / combo / waterfall
|
|
157
157
|
/ scatter / heatmap; use null for pie / funnel / treemap / radar.
|
|
@@ -160,7 +160,7 @@ export const chartPlanSchema = z.object({
|
|
|
160
160
|
.string()
|
|
161
161
|
.nullable()
|
|
162
162
|
.default(null)
|
|
163
|
-
.describe(
|
|
163
|
+
.describe(toDescription(`
|
|
164
164
|
Axis label for the secondary (usually left) axis. Used for
|
|
165
165
|
bar / horizontalBar / line / area / combo / waterfall /
|
|
166
166
|
scatter / heatmap; use null for pie / funnel / treemap / radar.
|
|
@@ -169,7 +169,7 @@ export const chartPlanSchema = z.object({
|
|
|
169
169
|
.array(z.string())
|
|
170
170
|
.nullable()
|
|
171
171
|
.default(null)
|
|
172
|
-
.describe(
|
|
172
|
+
.describe(toDescription(`
|
|
173
173
|
Primary category labels. For \`bar\` / \`horizontalBar\` /
|
|
174
174
|
\`line\` / \`area\` / \`combo\` / \`waterfall\`: one label per
|
|
175
175
|
data point. For \`heatmap\`: x-axis categories. For \`radar\`:
|
|
@@ -181,14 +181,14 @@ export const chartPlanSchema = z.object({
|
|
|
181
181
|
.array(z.string())
|
|
182
182
|
.nullable()
|
|
183
183
|
.default(null)
|
|
184
|
-
.describe(
|
|
184
|
+
.describe(toDescription(`
|
|
185
185
|
Y-axis (row) labels for \`heatmap\`. Use null when the
|
|
186
186
|
row labels come from the series names, which is the preferred
|
|
187
187
|
way to build a heatmap. Use null for every other chart type.
|
|
188
188
|
`)),
|
|
189
189
|
series: z
|
|
190
190
|
.array(z.object({
|
|
191
|
-
name: z.string().describe(
|
|
191
|
+
name: z.string().describe(toDescription(`
|
|
192
192
|
Legend name for this series.
|
|
193
193
|
`)),
|
|
194
194
|
type: seriesMarkTypeSchema.nullable().default(null),
|
|
@@ -197,7 +197,7 @@ export const chartPlanSchema = z.object({
|
|
|
197
197
|
.nullable()
|
|
198
198
|
.default(null)
|
|
199
199
|
.describe("Which y-axis to bind (0 = left, 1 = right). Use on `combo` when series have different units or scales; use null otherwise."),
|
|
200
|
-
data: z.array(chartDataPointSchema).describe(
|
|
200
|
+
data: z.array(chartDataPointSchema).describe(toDescription(`
|
|
201
201
|
Data points. For category charts (\`bar\` / \`horizontalBar\`
|
|
202
202
|
/ \`line\` / \`area\` / \`combo\` / \`waterfall\` / \`radar\`),
|
|
203
203
|
an array of numbers aligned to \`categories\`; for
|
|
@@ -210,7 +210,7 @@ export const chartPlanSchema = z.object({
|
|
|
210
210
|
`)),
|
|
211
211
|
}))
|
|
212
212
|
.default([])
|
|
213
|
-
.describe(
|
|
213
|
+
.describe(toDescription(`
|
|
214
214
|
One or more series to plot. Required for every chart type
|
|
215
215
|
except \`custom\`, which carries its series inside \`option\`.
|
|
216
216
|
Slice charts (\`pie\` / \`funnel\` / \`treemap\`) and
|
|
@@ -222,7 +222,7 @@ export const chartPlanSchema = z.object({
|
|
|
222
222
|
.string()
|
|
223
223
|
.nullable()
|
|
224
224
|
.default(null)
|
|
225
|
-
.describe(
|
|
225
|
+
.describe(toDescription(`
|
|
226
226
|
Required for \`custom\`; use null for every other chart type. A
|
|
227
227
|
COMPLETE Echarts option, as a JSON object encoded in a string:
|
|
228
228
|
\`series\` (each with its own \`type\` and that series' own data
|
|
@@ -242,13 +242,13 @@ export const chartPlanSchema = z.object({
|
|
|
242
242
|
* sees a planner request, only the resolved {@link Chart}.
|
|
243
243
|
*/
|
|
244
244
|
export const chartPlannerRequestSchema = z.object({
|
|
245
|
-
title: z.string().describe(
|
|
245
|
+
title: z.string().describe(toDescription(`
|
|
246
246
|
Concise title shown above the chart (e.g. "Top 10 SKUs by Revenue").
|
|
247
247
|
`)),
|
|
248
248
|
description: z
|
|
249
249
|
.string()
|
|
250
250
|
.optional()
|
|
251
|
-
.describe(
|
|
251
|
+
.describe(toDescription(`
|
|
252
252
|
One-line intent the chart-planner uses when picking a chart type
|
|
253
253
|
and axis encodings (e.g. "compare quarterly revenue across
|
|
254
254
|
regions", "highlight the steep drop after position 5"). Not shown
|
|
@@ -258,7 +258,7 @@ export const chartPlannerRequestSchema = z.object({
|
|
|
258
258
|
.array(z.record(z.string(), z.unknown()))
|
|
259
259
|
.nonempty("Data must contain at least one row")
|
|
260
260
|
.readonly()
|
|
261
|
-
.describe(
|
|
261
|
+
.describe(toDescription(`
|
|
262
262
|
Tabular dataset to chart. One object per row, keyed by column
|
|
263
263
|
name. Values may be strings, numbers, booleans, or null. The
|
|
264
264
|
chart-planner decides which columns are categories vs. numeric
|
|
@@ -273,7 +273,7 @@ export const chartPlannerRequestSchema = z.object({
|
|
|
273
273
|
* cache by id, while the model gets the exact opaque token to copy into prose
|
|
274
274
|
* and has no reason to invent or retype a UUID.
|
|
275
275
|
*/
|
|
276
|
-
export const chartToolOutputSchema =
|
|
276
|
+
export const chartToolOutputSchema = ChartSchema.pick({ chartId: true }).extend({
|
|
277
277
|
marker: z
|
|
278
278
|
.string()
|
|
279
279
|
.describe("Exact embed marker. Copy this complete value verbatim onto its own line; never construct a marker from chartId."),
|
|
@@ -287,7 +287,7 @@ export const chartToolOutputSchema = wire.ChartSchema.pick({ chartId: true }).ex
|
|
|
287
287
|
* the schema by construction.
|
|
288
288
|
*/
|
|
289
289
|
function formatChartTypePicker() {
|
|
290
|
-
return
|
|
290
|
+
return ChartTypeSchema.options
|
|
291
291
|
.map((opt) => `\`${opt.value}\` for ${opt.description ?? ""}`)
|
|
292
292
|
.join("; ");
|
|
293
293
|
}
|
|
@@ -295,7 +295,7 @@ function formatChartTypePicker() {
|
|
|
295
295
|
* System prompt for the inner chart-planning agent. Tuned for a
|
|
296
296
|
* fast-tier model (Haiku, GPT-5-mini, Gemini Flash Lite).
|
|
297
297
|
*/
|
|
298
|
-
const CHART_PLANNER_INSTRUCTIONS =
|
|
298
|
+
const CHART_PLANNER_INSTRUCTIONS = toDescription(`
|
|
299
299
|
You design Apache Echarts visualizations. The user gives you a
|
|
300
300
|
tabular dataset (rows of objects) plus a title and an optional
|
|
301
301
|
description of the intent. You produce a small chart plan (chart
|
|
@@ -380,7 +380,7 @@ function getPlannerAgent(config) {
|
|
|
380
380
|
name: "Chart Planner",
|
|
381
381
|
description: "Picks chart type and axis encodings for a dataset.",
|
|
382
382
|
instructions: CHART_PLANNER_INSTRUCTIONS,
|
|
383
|
-
model: ({ requestContext }) => buildModel(config, requestContext, { modelClass:
|
|
383
|
+
model: ({ requestContext }) => buildModel(config, requestContext, { modelClass: ModelClass.ChatFast }),
|
|
384
384
|
});
|
|
385
385
|
plannerAgents.set(config, agent);
|
|
386
386
|
}
|
|
@@ -394,7 +394,7 @@ function getPlannerAgent(config) {
|
|
|
394
394
|
async function runChartPlanner(config, request, options = {}) {
|
|
395
395
|
const { title, description, data } = request;
|
|
396
396
|
const { requestContext, abortSignal } = options;
|
|
397
|
-
const prompt =
|
|
397
|
+
const prompt = toDescription({
|
|
398
398
|
Title: title,
|
|
399
399
|
...(description ? { Description: description } : {}),
|
|
400
400
|
"Dataset (JSON, one row per object)": JSON.stringify(data, null, 2),
|
|
@@ -436,7 +436,7 @@ async function writeChart(entry, userKey) {
|
|
|
436
436
|
catch (err) {
|
|
437
437
|
logger.warn("write-error", {
|
|
438
438
|
chartId: entry.chartId,
|
|
439
|
-
error:
|
|
439
|
+
error: toError(err),
|
|
440
440
|
});
|
|
441
441
|
}
|
|
442
442
|
}
|
|
@@ -454,7 +454,7 @@ async function readChart(chartId, userKey) {
|
|
|
454
454
|
catch (err) {
|
|
455
455
|
logger.warn("read-error", {
|
|
456
456
|
chartId,
|
|
457
|
-
error:
|
|
457
|
+
error: toError(err),
|
|
458
458
|
});
|
|
459
459
|
return undefined;
|
|
460
460
|
}
|
|
@@ -475,13 +475,13 @@ async function readChart(chartId, userKey) {
|
|
|
475
475
|
* - on data / planner failure: `{ chartId, error }`
|
|
476
476
|
*/
|
|
477
477
|
export async function prepareChart(opts) {
|
|
478
|
-
const chartId =
|
|
478
|
+
const chartId = id();
|
|
479
479
|
await writeChart({ chartId }, opts.userKey);
|
|
480
480
|
logger.debug("queued", { chartId });
|
|
481
481
|
// Fire-and-forget. Failures land in the cache as `error` entries;
|
|
482
482
|
// never escape into an unhandled rejection.
|
|
483
483
|
void runPrepareChart(chartId, opts);
|
|
484
|
-
return { chartId, marker:
|
|
484
|
+
return { chartId, marker: formatMarker("chart", chartId) };
|
|
485
485
|
}
|
|
486
486
|
async function runPrepareChart(chartId, opts) {
|
|
487
487
|
const startedAt = Date.now();
|
|
@@ -506,7 +506,7 @@ async function runPrepareChart(chartId, opts) {
|
|
|
506
506
|
});
|
|
507
507
|
}
|
|
508
508
|
catch (err) {
|
|
509
|
-
logger.warn("error", { chartId, error:
|
|
509
|
+
logger.warn("error", { chartId, error: toError(err) });
|
|
510
510
|
// The entry's `error` is rendered in the chat, so only an AppKitError's
|
|
511
511
|
// own message travels; anything else could carry upstream provider detail.
|
|
512
512
|
const errText = err instanceof AppKitError ? err.message : CHART_FAILED_MESSAGE;
|
|
@@ -544,7 +544,7 @@ export async function fetchChart(chartId, options) {
|
|
|
544
544
|
const remaining = deadline - Date.now();
|
|
545
545
|
if (remaining <= 0)
|
|
546
546
|
return last;
|
|
547
|
-
await
|
|
547
|
+
await sleep(Math.min(intervalMs, remaining), options.signal);
|
|
548
548
|
}
|
|
549
549
|
}
|
|
550
550
|
/**
|
|
@@ -753,7 +753,7 @@ export function planToEchartsOption(input, fallbackTitle, brand) {
|
|
|
753
753
|
// note on `chartDataPointSchema`). A malformed string costs one chart.
|
|
754
754
|
// Nothing here is eval'd; a string-valued Echarts formatter is a
|
|
755
755
|
// template, not code.
|
|
756
|
-
const option =
|
|
756
|
+
const option = parseRecord(plan.option);
|
|
757
757
|
if (!option) {
|
|
758
758
|
throw new Error('chartType "custom" needs an `option` holding a JSON object');
|
|
759
759
|
}
|
|
@@ -981,7 +981,7 @@ export function planToEchartsOption(input, fallbackTitle, brand) {
|
|
|
981
981
|
export function buildRenderDataTool(config) {
|
|
982
982
|
return createTool({
|
|
983
983
|
id: "render_data",
|
|
984
|
-
description:
|
|
984
|
+
description: toDescription([
|
|
985
985
|
`
|
|
986
986
|
Submit a tabular dataset for inline rendering as a chart in
|
|
987
987
|
the user's view. Pass a title, the raw rows (array of objects
|
|
@@ -1025,4 +1025,4 @@ export function buildRenderDataTool(config) {
|
|
|
1025
1025
|
},
|
|
1026
1026
|
});
|
|
1027
1027
|
}
|
|
1028
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLElBQUksRUFDSixJQUFJLEVBQ0osR0FBRyxFQUNILE1BQU0sRUFDTixXQUFXLEdBRVosTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBZ0MsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE9BQU8sRUFBRSxjQUFjLEVBQTJCLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUUxQyw2RUFBNkU7QUFFN0U7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRXBDLHNEQUFzRDtBQUN0RCxNQUFNLHFCQUFxQixHQUFHLGNBQWMsQ0FBQztBQUU3QyxtRUFBbUU7QUFDbkUsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUM7QUFFeEMsdURBQXVEO0FBQ3ZELE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUFDO0FBRXRDLG9FQUFvRTtBQUNwRSxNQUFN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QUM7WUFDckM7Ozs7Ozs7O09BUUM7WUFDRDs7Ozs7Ozs7OztPQVVDO1lBQ0Q7Ozs7O09BS0M7U0FDRixDQUFDO1FBQ0YsV0FBVyxFQUFFLHlCQUF5QjtRQUN0QyxZQUFZLEVBQUUscUJBQXFCO1FBQ25DLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQy9CLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQTRCLENBQUM7WUFDbEUsTUFBTSxHQUFHLEdBQUcsTUFBeUQsQ0FBQztZQUN0RSxPQUFPLFlBQVksQ0FBQztnQkFDbEIsTUFBTTtnQkFDTixPQUFPLEVBQUUsY0FBYyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUM7Z0JBQzVDLEtBQUs7Z0JBQ0wsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDbEQsR0FBRyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3ZFLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGFydCBwbGFubmVyICsgY2hhcnQgY2FjaGUuXG4gKlxuICogU2VsZi1jb250YWluZWQgY2hhcnQgc3Vic3lzdGVtIHdpdGggdHdvIGxheWVyczpcbiAqXG4gKiAgIDEuIElubmVyIHBsYW5uZXIgYWdlbnQgKHByaXZhdGUpLiBQdXJlIGRhdGFzZXQtaW4gL1xuICogICAgICBgRUNoYXJ0c09wdGlvbmAtb3V0IGJyYWluLiBEcml2ZW4gYnkge0BsaW5rIHByZXBhcmVDaGFydH07XG4gKiAgICAgIGNhbGxlcnMgbmV2ZXIgaW5zdGFudGlhdGUgaXQgZGlyZWN0bHkuXG4gKiAgIDIuIHtAbGluayBwcmVwYXJlQ2hhcnR9OiBvcmNoZXN0cmF0aW9uIG9uIHRvcCBvZiB0aGUgcGxhbm5lci5cbiAqICAgICAgTWludHMgYSBgY2hhcnRJZGAsIGNhY2hlcyBhbiBlbXB0eSBgeyBjaGFydElkIH1gIHJlY29yZFxuICogICAgICBzeW5jaHJvbm91c2x5LCB0aGVuIHJlc29sdmVzIHRoZSBkYXRhc2V0IGFuZCBydW5zIHRoZVxuICogICAgICBwbGFubmVyIGluIHRoZSBiYWNrZ3JvdW5kLiBUaGUgdGVybWluYWwgZW50cnkgc2V0dGxlcyB3aXRoXG4gKiAgICAgIGVpdGhlciBgcmVzdWx0YCAoc3VjY2Vzcykgb3IgYGVycm9yYCAoZmFpbHVyZSkuIEJvdGhcbiAqICAgICAgdW5kZWZpbmVkIG1lYW5zIHRoZSBlbnRyeSBpcyBzdGlsbCBwcm9jZXNzaW5nLlxuICpcbiAqIFRoZSBjYWNoZSBzdXJmYWNlICh7QGxpbmsgZmV0Y2hDaGFydH0pIGlzIHRoZSBvbmx5IHN0YXRlIHRoZVxuICogSFRUUCByb3V0ZSBhbmQgdGhlIGNoYXJ0LXByb2R1Y2luZyB0b29scyBzaGFyZS4gYHByZXBhcmVDaGFydGBcbiAqIGlzIGRhdGFzZXQtYWdub3N0aWMgLSBjYWxsZXJzIHN1cHBseSBhIGByZXNvbHZlRGF0YWAgY2FsbGJhY2tcbiAqIHRoYXQgZmV0Y2hlcyB0aGUgcm93cyBob3dldmVyIHRoZXkgbGlrZSAoR2VuaWUgc3RhdGVtZW50LCBpbmxpbmVcbiAqIGRhdGFzZXQsIGN1c3RvbSBBUEkpLiBUaGUgbW9kdWxlIGhhcyBubyBrbm93bGVkZ2Ugb2YgR2VuaWUgb3JcbiAqIHN0YXRlbWVudCBpZHM7IHRob3NlIGNvbmNlcm5zIGxpdmUgaW4gdGhlIHRvb2xzIHRoYXQgd3JhcCBpdC5cbiAqXG4gKiBXaXJlLWZvcm1hdCBzY2hlbWFzIGxpdmUgaW4gYEBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYWAgc29cbiAqIHRoZSBkZW1vIGNsaWVudCBhbmQgYW55IG90aGVyIFVJIGNvbnN1bWVyIHNoYXJlIHRoZSBleGFjdCBzYW1lXG4gKiBzaGFwZSB0aGlzIG1vZHVsZSByZWFkcyBhbmQgd3JpdGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBBcHBLaXRFcnJvciwgQ2FjaGVNYW5hZ2VyLCBFeGVjdXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGFzeW5jVXRpbHMsXG4gIGVycm9yVXRpbHMsXG4gIGhhc2gsXG4gIGpzb24sXG4gIGxvZyxcbiAgb2JqZWN0LFxuICBzdHJpbmdVdGlscyxcbiAgdHlwZSBCcmFuZENvbnRleHQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBtYXJrZXJzLCB3aXJlLCB0eXBlIENoYXJ0LCB0eXBlIENoYXJ0UmVzdWx0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHsgbW9kZWwgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB7IEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgcmVzb2x2ZVVzZXJLZXksIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBidWlsZE1vZGVsIH0gZnJvbSBcIi4vbW9kZWwudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9jaGFydFwiKTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUVEwgZm9yIGNhY2hlZCBjaGFydCBlbnRyaWVzLiBPbmUgaG91ciBiYWxhbmNlcyBcImxvbmcgZW5vdWdoIGZvclxuICogdGhlIGhvc3QgVUkgdG8gZmV0Y2ggdGhlIGNoYXJ0IHdlbGwgYWZ0ZXIgdGhlIG1vZGVsIGZpbmlzaGVkXG4gKiB0YWxraW5nXCIgYWdhaW5zdCBcInNob3J0IGVub3VnaCB0aGF0IGFiYW5kb25lZCBjaGFydCBpZHMgZG9uJ3RcbiAqIHBpbiBzdG9yYWdlXCIuIE1hdGNoZXMgdGhlIHR5cGljYWwgRGF0YWJyaWNrcyBPQk8gdG9rZW4gbGlmZXRpbWVcbiAqIHNvIGFueSBkYXRhIHJlLXJlc29sdXRpb24gc3RheXMgaW5zaWRlIHRoZSBvcmlnaW5hbCBhdXRoIHdpbmRvdy5cbiAqL1xuY29uc3QgQ0hBUlRfQ0FDSEVfVFRMX1NFQyA9IDYwICogNjA7XG5cbi8qKiBDYWNoZSBuYW1lc3BhY2U7IGtlZXBzIHRoZSBjaGFydCBrZXlzcGFjZSB0aWR5LiAqL1xuY29uc3QgQ0hBUlRfQ0FDSEVfTkFNRVNQQUNFID0gXCJtYXN0cmE6Y2hhcnRcIjtcblxuLyoqIERlZmF1bHQgc2VydmVyLXNpZGUgbG9uZy1wb2xsIGJ1ZGdldCBmb3Ige0BsaW5rIGZldGNoQ2hhcnR9LiAqL1xuY29uc3QgREVGQVVMVF9GRVRDSF9USU1FT1VUX01TID0gNjBfMDAwO1xuXG4vKiogRGVmYXVsdCBpbnRlci1wb2xsIHNsZWVwIGZvciB7QGxpbmsgZmV0Y2hDaGFydH0uICovXG5jb25zdCBERUZBVUxUX0ZFVENIX0lOVEVSVkFMX01TID0gMjUwO1xuXG4vKiogU3RhYmxlIHRleHQgc3RvcmVkIG9uIGEgY2hhcnQgZW50cnkgd2hvc2UgcGxhbm5lciBydW4gZmFpbGVkLiAqL1xuY29uc3QgQ0hBUlRfRkFJTEVEX01FU1NBR0UgPSBcIkNoYXJ0IGdlbmVyYXRpb24gZmFpbGVkXCI7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2NoZW1hcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogT25lIHNlcmllcyBkYXRhIHBvaW50LiBXaWRlIHZhcmlhbnQgc2V0IHNvIHRoZSBwbGFubmVyIGFnZW50IGNhblxuICogZmFpdGhmdWxseSBwYXNzIHRocm91Z2ggd2hhdGV2ZXIgdGhlIFNRTCByb3cgc2V0IGNvbnRhaW5lZFxuICogKG51bWJlcnMsIHN0cmluZ2lmaWVkIG51bWJlcnMsIG51bGxzIGZvciBtaXNzaW5nIG1lYXN1cmVtZW50cyxcbiAqIGBbeCwgeV1gIHR1cGxlcyBmb3Igc2NhdHRlciwgYFt4LCB5LCB2YWx1ZV1gIHRyaXBsZXMgZm9yIGhlYXRtYXAsXG4gKiBge25hbWUsIHZhbHVlfWAgc2xpY2VzIGZvciBwaWUgLyBmdW5uZWwgLyB0cmVlbWFwKSB3aXRob3V0IHRoZVxuICogc3RydWN0dXJlZC1vdXRwdXQgZ3VhcmQgcmVqZWN0aW5nIHRoZSB3aG9sZSBwbGFuLlxuICpcbiAqIFRocmVlIGxheWVycyBvZiB0b2xlcmFuY2U6XG4gKlxuICogICAxLiB7QGxpbmsgei5wcmVwcm9jZXNzfSBub3JtYWxpemVzIHdpcmUgc2hhcGVzIEJFRk9SRSB1bmlvblxuICogICAgICBkaXNwYXRjaDogc3RyaW5naWZpZWQgbnVtYmVycyBwYXJzZSB0byBudW1iZXJzLCBmaW5pdGVcbiAqICAgICAgY2hlY2tzIHJlamVjdCBgTmFOYCAvIGBJbmZpbml0eWAsIDItLzMtZWxlbWVudCBhcnJheXMgY29lcmNlXG4gKiAgICAgIHR1cGxlIGNvbXBvbmVudHMsIGFuZCBge3ZhbHVlfWAgb2JqZWN0cyB3aXRoIG1pc3NpbmcgL1xuICogICAgICBzdHJpbmdpZmllZCBgdmFsdWVgIGdldCBjb2VyY2VkIG9yIHJlamVjdGVkIHVuaWZvcm1seS5cbiAqICAgICAgQW55dGhpbmcgbm90IGhhbmRsZWFibGUgYmVjb21lcyBgbnVsbGAuXG4gKiAgIDIuIFRoZSB1bmlvbiBhY2NlcHRzIGBudWxsYCBhcyBhIGZpcnN0LWNsYXNzIHZhcmlhbnQuIEVjaGFydHNcbiAqICAgICAgcmVuZGVycyBudWxsIGFzIGEgZ2FwIG9uIGJhciAvIGxpbmUgLyBhcmVhICh3aGljaCBpcyB0aGVcbiAqICAgICAgcmlnaHQgdmlzdWFsIHNpZ25hbCBmb3IgXCJtaXNzaW5nIHJlYWRpbmdcIikuIFNjYXR0ZXIsIGhlYXRtYXAsXG4gKiAgICAgIGFuZCBzbGljZSBjaGFydHMgZmlsdGVyIG51bGxzIGluIHtAbGluayBwbGFuVG9FY2hhcnRzT3B0aW9ufVxuICogICAgICBiZWNhdXNlIEVjaGFydHMgY3Jhc2hlcyBvbiBudWxsIHR1cGxlcyAvIHNsaWNlcy5cbiAqICAgMy4ge0BsaW5rIHoudW5pb24jY2F0Y2h9IGJhY2tzdG9wcyB0aGUgd2hvbGUgdGhpbmc6IGlmXG4gKiAgICAgIHByZXByb2Nlc3Mgc29tZWhvdyBwcm9kdWNlcyBhIHNoYXBlIHRoYXQgc3RpbGwgZG9lc24ndFxuICogICAgICBtYXRjaCBhbnkgdmFyaWFudCwgdGhlIGJhZCBpdGVtIGJlY29tZXMgYG51bGxgIGluc3RlYWQgb2ZcbiAqICAgICAgdGFraW5nIGRvd24gdGhlIGVudGlyZSBjaGFydCB3aXRoIGFcbiAqICAgICAgYFN0cnVjdHVyZWQgb3V0cHV0IHZhbGlkYXRpb24gZmFpbGVkYCBlcnJvci5cbiAqL1xuY29uc3QgY2hhcnREYXRhUG9pbnRTY2hlbWEgPSB6XG4gIC5wcmVwcm9jZXNzKFxuICAgICh2KSA9PiB7XG4gICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHYpID8gdiA6IG51bGw7XG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdC50b051bWJlcih2KSA/PyBudWxsO1xuICAgICAgfVxuICAgICAgLy8gU2NhdHRlciBgW3gsIHldYCBvciBoZWF0bWFwIGBbeEluZGV4LCB5SW5kZXgsIHZhbHVlXWAuIENvZXJjZVxuICAgICAgLy8gc3RyaW5naWZpZWQgY29tcG9uZW50czsgcmVqZWN0IGlmIGFueSBjb21wb25lbnQgaXMgbm9uLWZpbml0ZS5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHYpICYmICh2Lmxlbmd0aCA9PT0gMiB8fCB2Lmxlbmd0aCA9PT0gMykpIHtcbiAgICAgICAgY29uc3QgbnVtcyA9IHYubWFwKChjKSA9PiBvYmplY3QudG9OdW1iZXIoYykpO1xuICAgICAgICByZXR1cm4gbnVtcy5ldmVyeSgobikgPT4gbiAhPT0gdW5kZWZpbmVkKSA/IG51bXMgOiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGwgJiYgXCJ2YWx1ZVwiIGluIHYpIHtcbiAgICAgICAgY29uc3Qgb2JqID0gdiBhcyB7IG5hbWU/OiB1bmtub3duOyB2YWx1ZTogdW5rbm93biB9O1xuICAgICAgICBjb25zdCB2YWwgPSBvYmplY3QudG9OdW1iZXIob2JqLnZhbHVlKTtcbiAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gQ29lcmNlIG51bWVyaWMgLyBib29sZWFuIC8gbnVsbGlzaCBuYW1lcyB0byBzdHJpbmdzIHNvIGFcbiAgICAgICAgLy8gcGllIHNsaWNlIGtleWVkIG9uIGEgeWVhciAoYDIwMjRgKSBvciBjYXRlZ29yeSBpZCBpc1xuICAgICAgICAvLyBhY2NlcHRlZCB3aXRob3V0IHJvdW5kLXRyaXBwaW5nIHRocm91Z2ggdGhlIGNhdGNoIGFybS5cbiAgICAgICAgY29uc3QgcmF3TmFtZSA9IG9iai5uYW1lO1xuICAgICAgICBjb25zdCBuYW1lID0gdHlwZW9mIHJhd05hbWUgPT09IFwic3RyaW5nXCIgPyByYXdOYW1lIDogcmF3TmFtZSA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhyYXdOYW1lKTtcbiAgICAgICAgcmV0dXJuIHsgbmFtZSwgdmFsdWU6IHZhbCB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICB6LnVuaW9uKFtcbiAgICAgIHoubnVtYmVyKCksXG4gICAgICB6Lm51bGwoKSxcbiAgICAgIC8vIGBbeCwgeV1gIHNjYXR0ZXIgb3IgYFt4LCB5LCB2YWx1ZV1gIGhlYXRtYXAgY2VsbC4gTW9kZWxsZWQgYXMgYVxuICAgICAgLy8gbGVuZ3RoLWNvbnN0cmFpbmVkIGhvbW9nZW5lb3VzIGFycmF5IHJhdGhlciB0aGFuIGB6LnR1cGxlYDpcbiAgICAgIC8vIFpvZCBlbWl0cyBhIHR1cGxlIGFzIEpTT04gU2NoZW1hIDIwMjAtMTIgYHByZWZpeEl0ZW1zYCwgYW5kXG4gICAgICAvLyBEYXRhYnJpY2tzJyBHZW1pbmkgZW5kcG9pbnRzIHJlamVjdCBhIGByZXNwb25zZV9qc29uX3NjaGVtYWBcbiAgICAgIC8vIGNvbnRhaW5pbmcgaXQgKFwibXVzdCBiZSBhIGJvb2xlYW4gb3IgYW4gb2JqZWN0XCIsIHNpbmNlXG4gICAgICAvLyBgaXRlbXNgIGlzIGFic2VudCkuIGBtaW5JdGVtc2AgLyBgbWF4SXRlbXNgICsgYGl0ZW1zYCBpcyB3aGF0XG4gICAgICAvLyBldmVyeSBwcm92aWRlciB1bmRlcnN0YW5kcy5cbiAgICAgIHouYXJyYXkoei5udW1iZXIoKSkubWluKDIpLm1heCgzKSxcbiAgICAgIHoub2JqZWN0KHsgbmFtZTogei5zdHJpbmcoKSwgdmFsdWU6IHoubnVtYmVyKCkgfSksXG4gICAgXSksXG4gIClcbiAgLmNhdGNoKG51bGwpO1xuXG4vKiogUGVyLXNlcmllcyBtYXJrIHR5cGUgdXNlZCBieSBgY29tYm9gIGNoYXJ0cyAoYmFyICsgbGluZSBvdmVybGF5KS4gKi9cbmNvbnN0IHNlcmllc01hcmtUeXBlU2NoZW1hID0gelxuICAudW5pb24oW3oubGl0ZXJhbChcImJhclwiKSwgei5saXRlcmFsKFwibGluZVwiKSwgei5saXRlcmFsKFwiYXJlYVwiKV0pXG4gIC5kZXNjcmliZShcbiAgICBcIk1hcmsgdHlwZSBmb3IgdGhpcyBzZXJpZXMuIFJlcXVpcmVkIGZvciBgY29tYm9gIChtaXggYmFyIGFuZCBsaW5lL2FyZWEpOyB1c2UgbnVsbCBmb3Igb3RoZXIgY2hhcnQgdHlwZXMuXCIsXG4gICk7XG5cbi8qKlxuICogQ29tcGFjdCwgbW9kZWwtZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgYW4gRWNoYXJ0cyBzcGVjLiBUaGVcbiAqIHBsYW5uZXIgYWdlbnQgZW1pdHMgdGhpczsge0BsaW5rIHBsYW5Ub0VjaGFydHNPcHRpb259IGV4cGFuZHMgaXRcbiAqIGludG8gYSByZWFsIGBFQ2hhcnRzT3B0aW9uYCBKU09OLiBUd28gbGF5ZXJzIGJlY2F1c2UgbGV0dGluZyB0aGVcbiAqIG1vZGVsIGZpbGwgaW4gYSBmdWxseS10eXBlZCBgRUNoYXJ0c09wdGlvbmAgaXMgYnJpdHRsZSAoaHVuZHJlZHNcbiAqIG9mIG9wdGlvbmFsIGZpZWxkcywgZGVlcCB1bmlvbnMsIHZlcnNpb24tZGVwZW5kZW50IHNoYXBlcykuIEFcbiAqIHNtYWxsIFwiY2hhcnQgcGxhblwiIHNjaGVtYSBpcyBtdWNoIG1vcmUgcmVsaWFibGUgZm9yIGEgZmFzdCBtb2RlbFxuICogYW5kIGtlZXBzIGFuaW1hdGlvbiAvIHRvb2x0aXAgLyBzdHlsaW5nIGRlZmF1bHRzIGNvbnNpc3RlbnRcbiAqIGFjcm9zcyBjaGFydHMuXG4gKi9cbmV4cG9ydCBjb25zdCBjaGFydFBsYW5TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGNoYXJ0VHlwZTogd2lyZS5DaGFydFR5cGVTY2hlbWEsXG4gIHRpdGxlOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm51bGxhYmxlKClcbiAgICAuZGVmYXVsdChudWxsKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBTaG9ydCB0aXRsZSBzaG93biBhYm92ZSB0aGUgY2hhcnQuIFVzZSBudWxsIHRvIGZhbGwgYmFjayB0byB0aGVcbiAgICAgICAgXFxgdGl0bGVcXGAgYXJndW1lbnQgdGhlIGNhbGxlciBwYXNzZWQgaW4uXG4gICAgICBgKSxcbiAgICApLFxuICB4QXhpc0xhYmVsOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm51bGxhYmxlKClcbiAgICAuZGVmYXVsdChudWxsKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBBeGlzIGxhYmVsIGZvciB0aGUgcHJpbWFyeSAodXN1YWxseSBib3R0b20gLyB2YWx1ZSkgYXhpcy5cbiAgICAgICAgVXNlZCBmb3IgYmFyIC8gaG9yaXpvbnRhbEJhciAvIGxpbmUgLyBhcmVhIC8gY29tYm8gLyB3YXRlcmZhbGxcbiAgICAgICAgLyBzY2F0dGVyIC8gaGVhdG1hcDsgdXNlIG51bGwgZm9yIHBpZSAvIGZ1bm5lbCAvIHRyZWVtYXAgLyByYWRhci5cbiAgICAgIGApLFxuICAgICksXG4gIHlBeGlzTGFiZWw6IHpcbiAgICAuc3RyaW5nKClcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIEF4aXMgbGFiZWwgZm9yIHRoZSBzZWNvbmRhcnkgKHVzdWFsbHkgbGVmdCkgYXhpcy4gVXNlZCBmb3JcbiAgICAgICAgYmFyIC8gaG9yaXpvbnRhbEJhciAvIGxpbmUgLyBhcmVhIC8gY29tYm8gLyB3YXRlcmZhbGwgL1xuICAgICAgICBzY2F0dGVyIC8gaGVhdG1hcDsgdXNlIG51bGwgZm9yIHBpZSAvIGZ1bm5lbCAvIHRyZWVtYXAgLyByYWRhci5cbiAgICAgIGApLFxuICAgICksXG4gIGNhdGVnb3JpZXM6IHpcbiAgICAuYXJyYXkoei5zdHJpbmcoKSlcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIFByaW1hcnkgY2F0ZWdvcnkgbGFiZWxzLiBGb3IgXFxgYmFyXFxgIC8gXFxgaG9yaXpvbnRhbEJhclxcYCAvXG4gICAgICAgIFxcYGxpbmVcXGAgLyBcXGBhcmVhXFxgIC8gXFxgY29tYm9cXGAgLyBcXGB3YXRlcmZhbGxcXGA6IG9uZSBsYWJlbCBwZXJcbiAgICAgICAgZGF0YSBwb2ludC4gRm9yIFxcYGhlYXRtYXBcXGA6IHgtYXhpcyBjYXRlZ29yaWVzLiBGb3IgXFxgcmFkYXJcXGA6XG4gICAgICAgIGluZGljYXRvciBuYW1lcy4gVXNlIG51bGwgZm9yIFxcYHNjYXR0ZXJcXGAgKFxcYFt4LCB5XVxcYCB0dXBsZXMpIGFuZFxuICAgICAgICBzbGljZSBjaGFydHMgKFxcYHBpZVxcYCAvIFxcYGZ1bm5lbFxcYCAvIFxcYHRyZWVtYXBcXGAsIGVhY2ggc2xpY2VcbiAgICAgICAgY2FycmllcyBpdHMgb3duIFxcYG5hbWVcXGApLlxuICAgICAgYCksXG4gICAgKSxcbiAgeUNhdGVnb3JpZXM6IHpcbiAgICAuYXJyYXkoei5zdHJpbmcoKSlcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIFktYXhpcyAocm93KSBsYWJlbHMgZm9yIFxcYGhlYXRtYXBcXGAuIFVzZSBudWxsIHdoZW4gdGhlXG4gICAgICAgIHJvdyBsYWJlbHMgY29tZSBmcm9tIHRoZSBzZXJpZXMgbmFtZXMsIHdoaWNoIGlzIHRoZSBwcmVmZXJyZWRcbiAgICAgICAgd2F5IHRvIGJ1aWxkIGEgaGVhdG1hcC4gVXNlIG51bGwgZm9yIGV2ZXJ5IG90aGVyIGNoYXJ0IHR5cGUuXG4gICAgICBgKSxcbiAgICApLFxuICBzZXJpZXM6IHpcbiAgICAuYXJyYXkoXG4gICAgICB6Lm9iamVjdCh7XG4gICAgICAgIG5hbWU6IHouc3RyaW5nKCkuZGVzY3JpYmUoXG4gICAgICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBMZWdlbmQgbmFtZSBmb3IgdGhpcyBzZXJpZXMuXG4gICAgICAgICAgYCksXG4gICAgICAgICksXG4gICAgICAgIHR5cGU6IHNlcmllc01hcmtUeXBlU2NoZW1hLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgICAgICAgeUF4aXNJbmRleDogelxuICAgICAgICAgIC51bmlvbihbei5saXRlcmFsKDApLCB6LmxpdGVyYWwoMSldKVxuICAgICAgICAgIC5udWxsYWJsZSgpXG4gICAgICAgICAgLmRlZmF1bHQobnVsbClcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICBcIldoaWNoIHktYXhpcyB0byBiaW5kICgwID0gbGVmdCwgMSA9IHJpZ2h0KS4gVXNlIG9uIGBjb21ib2Agd2hlbiBzZXJpZXMgaGF2ZSBkaWZmZXJlbnQgdW5pdHMgb3Igc2NhbGVzOyB1c2UgbnVsbCBvdGhlcndpc2UuXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgZGF0YTogei5hcnJheShjaGFydERhdGFQb2ludFNjaGVtYSkuZGVzY3JpYmUoXG4gICAgICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBEYXRhIHBvaW50cy4gRm9yIGNhdGVnb3J5IGNoYXJ0cyAoXFxgYmFyXFxgIC8gXFxgaG9yaXpvbnRhbEJhclxcYFxuICAgICAgICAgICAgLyBcXGBsaW5lXFxgIC8gXFxgYXJlYVxcYCAvIFxcYGNvbWJvXFxgIC8gXFxgd2F0ZXJmYWxsXFxgIC8gXFxgcmFkYXJcXGApLFxuICAgICAgICAgICAgYW4gYXJyYXkgb2YgbnVtYmVycyBhbGlnbmVkIHRvIFxcYGNhdGVnb3JpZXNcXGA7IGZvclxuICAgICAgICAgICAgXFxgd2F0ZXJmYWxsXFxgIHRob3NlIG51bWJlcnMgYXJlIHNpZ25lZCBkZWx0YXMgKG9uZSBzZXJpZXNcbiAgICAgICAgICAgIG9ubHkgLSBuZXZlciBhIGN1bXVsYXRpdmUgYmFzZSBzZXJpZXMpLiBGb3IgXFxgaGVhdG1hcFxcYCxcbiAgICAgICAgICAgIG9uZSBzZXJpZXMgcGVyIG1hdHJpeCByb3csIGhvbGRpbmcgdGhhdCByb3cncyBudW1iZXJzXG4gICAgICAgICAgICBhbGlnbmVkIHRvIFxcYGNhdGVnb3JpZXNcXGAuIEZvciBcXGBzY2F0dGVyXFxgLCBhbiBhcnJheSBvZlxuICAgICAgICAgICAgXFxgW3gsIHldXFxgIG51bWVyaWMgdHVwbGVzLiBGb3IgXFxgcGllXFxgIC8gXFxgZnVubmVsXFxgIC9cbiAgICAgICAgICAgIFxcYHRyZWVtYXBcXGAsIGFuIGFycmF5IG9mIFxcYHtuYW1lLCB2YWx1ZX1cXGAgb2JqZWN0cy5cbiAgICAgICAgICBgKSxcbiAgICAgICAgKSxcbiAgICAgIH0pLFxuICAgIClcbiAgICAuZGVmYXVsdChbXSlcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgT25lIG9yIG1vcmUgc2VyaWVzIHRvIHBsb3QuIFJlcXVpcmVkIGZvciBldmVyeSBjaGFydCB0eXBlXG4gICAgICAgIGV4Y2VwdCBcXGBjdXN0b21cXGAsIHdoaWNoIGNhcnJpZXMgaXRzIHNlcmllcyBpbnNpZGUgXFxgb3B0aW9uXFxgLlxuICAgICAgICBTbGljZSBjaGFydHMgKFxcYHBpZVxcYCAvIFxcYGZ1bm5lbFxcYCAvIFxcYHRyZWVtYXBcXGApIGFuZFxuICAgICAgICBcXGB3YXRlcmZhbGxcXGAgLyBcXGBoZWF0bWFwXFxgIHVzZSBleGFjdGx5IG9uZSBzZXJpZXM7IFxcYGJhclxcYCAvXG4gICAgICAgIFxcYGxpbmVcXGAgLyBcXGBhcmVhXFxgIC8gXFxgY29tYm9cXGAgLyBcXGByYWRhclxcYCAvIFxcYHNjYXR0ZXJcXGAgY2FuXG4gICAgICAgIGNhcnJ5IG11bHRpcGxlIHNlcmllcy5cbiAgICAgIGApLFxuICAgICksXG4gIG9wdGlvbjogelxuICAgIC5zdHJpbmcoKVxuICAgIC5udWxsYWJsZSgpXG4gICAgLmRlZmF1bHQobnVsbClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgUmVxdWlyZWQgZm9yIFxcYGN1c3RvbVxcYDsgdXNlIG51bGwgZm9yIGV2ZXJ5IG90aGVyIGNoYXJ0IHR5cGUuIEFcbiAgICAgICAgQ09NUExFVEUgRWNoYXJ0cyBvcHRpb24sIGFzIGEgSlNPTiBvYmplY3QgZW5jb2RlZCBpbiBhIHN0cmluZzpcbiAgICAgICAgXFxgc2VyaWVzXFxgIChlYWNoIHdpdGggaXRzIG93biBcXGB0eXBlXFxgIGFuZCB0aGF0IHNlcmllcycgb3duIGRhdGFcbiAgICAgICAgc2hhcGUpIHBsdXMgd2hhdGV2ZXIgZWxzZSB0aGUgY2hhcnQgbmVlZHMgLSBhIGNvb3JkaW5hdGUgc3lzdGVtLFxuICAgICAgICBcXGB2aXN1YWxNYXBcXGAsIGF4ZXMuIFBsYWluIEpTT04gdmFsdWVzIG9ubHksIG5ldmVyIGEgSmF2YVNjcmlwdFxuICAgICAgICBmdW5jdGlvbi4gQSBjZW50ZXJlZCB0aXRsZSBpcyBmaWxsZWQgaW4gd2hlbiB0aGUgb2JqZWN0IG9taXRzXG4gICAgICAgIG9uZS5cbiAgICAgIGApLFxuICAgICksXG59KTtcblxudHlwZSBDaGFydFBsYW4gPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5TY2hlbWE+O1xudHlwZSBDaGFydFBsYW5JbnB1dCA9IHouaW5wdXQ8dHlwZW9mIGNoYXJ0UGxhblNjaGVtYT47XG5cbi8qKlxuICogQ2Fub25pY2FsIHBsYW5uZXIgaW5wdXQgc2hhcGUuIFRvb2xzIHRoYXQgc291cmNlIHJvd3MgZnJvbSBhblxuICogaW5saW5lIGRhdGFzZXQgKGByZW5kZXJfZGF0YWApIHVzZSBpdCBhcyB0aGVpciBgaW5wdXRTY2hlbWFgXG4gKiB2ZXJiYXRpbTsgdG9vbHMgdGhhdCByZXNvbHZlIHJvd3MgZnJvbSBhIHJlbW90ZSAoYHByZXBhcmVfY2hhcnRgXG4gKiBvdmVyIGEgR2VuaWUgc3RhdGVtZW50KSBgb21pdCh7IGRhdGEgfSlgIGFuZCBgZXh0ZW5kYCB3aXRoIHRoZWlyXG4gKiBvd24gaWRlbnRpZmllciBmaWVsZCwgc28gdGhlIGZpZWxkLWxldmVsIGAuZGVzY3JpYmUoKWAgdGV4dFxuICogc3RheXMgYSBzaW5nbGUgc291cmNlIG9mIHRydXRoLiBTZXJ2ZXItb25seSAtIHRoZSBVSSBuZXZlclxuICogc2VlcyBhIHBsYW5uZXIgcmVxdWVzdCwgb25seSB0aGUgcmVzb2x2ZWQge0BsaW5rIENoYXJ0fS5cbiAqL1xuZXhwb3J0IGNvbnN0IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHRpdGxlOiB6LnN0cmluZygpLmRlc2NyaWJlKFxuICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBDb25jaXNlIHRpdGxlIHNob3duIGFib3ZlIHRoZSBjaGFydCAoZS5nLiBcIlRvcCAxMCBTS1VzIGJ5IFJldmVudWVcIikuXG4gICAgICBgKSxcbiAgKSxcbiAgZGVzY3JpcHRpb246IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBPbmUtbGluZSBpbnRlbnQgdGhlIGNoYXJ0LXBsYW5uZXIgdXNlcyB3aGVuIHBpY2tpbmcgYSBjaGFydCB0eXBlXG4gICAgICAgIGFuZCBheGlzIGVuY29kaW5ncyAoZS5nLiBcImNvbXBhcmUgcXVhcnRlcmx5IHJldmVudWUgYWNyb3NzXG4gICAgICAgIHJlZ2lvbnNcIiwgXCJoaWdobGlnaHQgdGhlIHN0ZWVwIGRyb3AgYWZ0ZXIgcG9zaXRpb24gNVwiKS4gTm90IHNob3duXG4gICAgICAgIHRvIHRoZSB1c2VyLlxuICAgICAgYCksXG4gICAgKSxcbiAgZGF0YTogelxuICAgIC5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpXG4gICAgLm5vbmVtcHR5KFwiRGF0YSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHJvd1wiKVxuICAgIC5yZWFkb25seSgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIFRhYnVsYXIgZGF0YXNldCB0byBjaGFydC4gT25lIG9iamVjdCBwZXIgcm93LCBrZXllZCBieSBjb2x1bW5cbiAgICAgICAgbmFtZS4gVmFsdWVzIG1heSBiZSBzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucywgb3IgbnVsbC4gVGhlXG4gICAgICAgIGNoYXJ0LXBsYW5uZXIgZGVjaWRlcyB3aGljaCBjb2x1bW5zIGFyZSBjYXRlZ29yaWVzIHZzLiBudW1lcmljXG4gICAgICAgIHNlcmllcy4gQ2FwIGF0IGEgZmV3IGh1bmRyZWQgcm93cyBmb3IgbGVnaWJpbGl0eTsgc2FtcGxlIC9cbiAgICAgICAgYWdncmVnYXRlIGxhcmdlciBkYXRhc2V0cyBmaXJzdC5cbiAgICAgIGApLFxuICAgICksXG59KTtcblxuLyoqIFZhbGlkYXRlZCB0aXRsZSwgZGVzY3JpcHRpb24sIGFuZCB0YWJ1bGFyIHJvd3MgcGFzc2VkIHRvIHRoZSBjaGFydC1wbGFubmluZyBtb2RlbC4gKi9cbmV4cG9ydCB0eXBlIENoYXJ0UGxhbm5lclJlcXVlc3QgPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hPjtcblxuLyoqXG4gKiBBZ2VudC1mYWNpbmcgcmVzdWx0IG9mIGVpdGhlciBjaGFydC1wcm9kdWNpbmcgdG9vbC5cbiAqXG4gKiBgbWFya2VyYCBpcyBkZWxpYmVyYXRlbHkgcmVkdW5kYW50IHdpdGggYGNoYXJ0SWRgOiB0aGUgaG9zdCBzdGlsbCBrZXlzIHRoZVxuICogY2FjaGUgYnkgaWQsIHdoaWxlIHRoZSBtb2RlbCBnZXRzIHRoZSBleGFjdCBvcGFxdWUgdG9rZW4gdG8gY29weSBpbnRvIHByb3NlXG4gKiBhbmQgaGFzIG5vIHJlYXNvbiB0byBpbnZlbnQgb3IgcmV0eXBlIGEgVVVJRC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNoYXJ0VG9vbE91dHB1dFNjaGVtYSA9IHdpcmUuQ2hhcnRTY2hlbWEucGljayh7IGNoYXJ0SWQ6IHRydWUgfSkuZXh0ZW5kKHtcbiAgbWFya2VyOiB6XG4gICAgLnN0cmluZygpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgXCJFeGFjdCBlbWJlZCBtYXJrZXIuIENvcHkgdGhpcyBjb21wbGV0ZSB2YWx1ZSB2ZXJiYXRpbSBvbnRvIGl0cyBvd24gbGluZTsgbmV2ZXIgY29uc3RydWN0IGEgbWFya2VyIGZyb20gY2hhcnRJZC5cIixcbiAgICApLFxufSk7XG5cbi8qKiBSZXN1bHQgcmV0dXJuZWQgc3luY2hyb25vdXNseSB3aGlsZSBjaGFydCBwbGFubmluZyBjb250aW51ZXMgaW4gdGhlIGJhY2tncm91bmQuICovXG5leHBvcnQgdHlwZSBDaGFydFRvb2xPdXRwdXQgPSB6LmluZmVyPHR5cGVvZiBjaGFydFRvb2xPdXRwdXRTY2hlbWE+O1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGxhbm5lciBpbnN0cnVjdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRm9ybWF0IHtAbGluayB3aXJlLkNoYXJ0VHlwZVNjaGVtYX0ncyB2YXJpYW50cyBhcyBhIHNpbmdsZVxuICogaHVtYW4tZnJpZW5kbHkgc3RyaW5nIG9mIGBgIGA8dmFsdWU+YCBmb3IgPGRlc2NyaXB0aW9uPiBgYFxuICogY2xhdXNlcyBqb2luZWQgYnkgc2VtaWNvbG9ucywgZHJhd24gZnJvbSBlYWNoIHZhcmlhbnQncyBvd25cbiAqIGAuZGVzY3JpYmUoKWAgc28gdGhlIHBsYW5uZXIgcHJvbXB0IHN0YXlzIGluIGxvY2stc3RlcCB3aXRoXG4gKiB0aGUgc2NoZW1hIGJ5IGNvbnN0cnVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0Q2hhcnRUeXBlUGlja2VyKCk6IHN0cmluZyB7XG4gIHJldHVybiB3aXJlLkNoYXJ0VHlwZVNjaGVtYS5vcHRpb25zXG4gICAgLm1hcCgob3B0KSA9PiBgXFxgJHtvcHQudmFsdWV9XFxgIGZvciAke29wdC5kZXNjcmlwdGlvbiA/PyBcIlwifWApXG4gICAgLmpvaW4oXCI7IFwiKTtcbn1cblxuLyoqXG4gKiBTeXN0ZW0gcHJvbXB0IGZvciB0aGUgaW5uZXIgY2hhcnQtcGxhbm5pbmcgYWdlbnQuIFR1bmVkIGZvciBhXG4gKiBmYXN0LXRpZXIgbW9kZWwgKEhhaWt1LCBHUFQtNS1taW5pLCBHZW1pbmkgRmxhc2ggTGl0ZSkuXG4gKi9cbmNvbnN0IENIQVJUX1BMQU5ORVJfSU5TVFJVQ1RJT05TID0gc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gIFlvdSBkZXNpZ24gQXBhY2hlIEVjaGFydHMgdmlzdWFsaXphdGlvbnMuIFRoZSB1c2VyIGdpdmVzIHlvdSBhXG4gIHRhYnVsYXIgZGF0YXNldCAocm93cyBvZiBvYmplY3RzKSBwbHVzIGEgdGl0bGUgYW5kIGFuIG9wdGlvbmFsXG4gIGRlc2NyaXB0aW9uIG9mIHRoZSBpbnRlbnQuIFlvdSBwcm9kdWNlIGEgc21hbGwgY2hhcnQgcGxhbiAoY2hhcnRcbiAgdHlwZSwgYXhpcyBsYWJlbHMsIGNhdGVnb3JpZXMsIHNlcmllcykgdGhhdCBiZXN0IGNvbnZleXMgdGhlIGRhdGEuXG5cbiAgRGVjaXNpb24gZ3VpZGUuIFBpY2sgdGhlIGNoYXJ0IHR5cGUgd2hvc2UgZGF0YSBzaGFwZSBtYXRjaGVzIHRoZVxuICBkYXRhc2V0IGFuZCB0aGUgdXNlcidzIGludGVudDogJHtmb3JtYXRDaGFydFR5cGVQaWNrZXIoKX0uXG5cbiAgV2hlbiBpbiBkb3VidCBiZXR3ZWVuIGJhciBhbmQgbGluZSwgcHJlZmVyIGJhciBmb3IgdW5vcmRlcmVkXG4gIGNhdGVnb3JpZXMgYW5kIGxpbmUgZm9yIG9yZGVyZWQgb25lcyAoZGF0ZXMsIHRpbWUgYnVja2V0cywgcmFua3MpLlxuICBQcmVmZXIgXFxgaG9yaXpvbnRhbEJhclxcYCB3aGVuIGNhdGVnb3J5IGxhYmVscyBhcmUgbG9uZy4gUHJlZmVyXG4gIFxcYGNvbWJvXFxgIHdoZW4gb25lIG1lYXN1cmUgaXMgYSBjb3VudC92b2x1bWUgYW5kIGFub3RoZXIgaXMgYVxuICByYXRlL3RyZW5kLiBQcmVmZXIgXFxgd2F0ZXJmYWxsXFxgIGZvciBicmlkZ2VzIG9mIHNpZ25lZCBkZWx0YXMuXG4gIFByZWZlciBcXGBzY2F0dGVyXFxgIHdoZW4gY29ycmVsYXRpbmcgdHdvIG51bWVyaWMgZmllbGRzIChub1xuICBjYXRlZ29yeSBheGlzKS4gUHJlZmVyIFxcYGhlYXRtYXBcXGAgZm9yIGEgY2F0ZWdvcnkgeCBjYXRlZ29yeVxuICBtYXRyaXguIFByZWZlciBcXGByYWRhclxcYCBmb3Igc2NvcmluZyB0aGUgc2FtZSBlbnRpdGllcyBhY3Jvc3MgYVxuICBmaXhlZCBzZXQgb2YgZGltZW5zaW9ucy4gTmV2ZXIgcGljayBwaWUgZm9yIG1vcmUgdGhhbiA3IHNsaWNlc1xuICAodXNlIFxcYHRyZWVtYXBcXGAgaW5zdGVhZCkuIFByZWZlciBcXGBmdW5uZWxcXGAgZm9yIG9yZGVyZWQgY29udmVyc2lvblxuICBzdGFnZXMuXG5cbiAgRm9yIGJhciAvIGhvcml6b250YWxCYXIgLyBsaW5lIC8gYXJlYSAvIGNvbWJvIC8gd2F0ZXJmYWxsOiBwaWNrIG9uZVxuICBjb2x1bW4gYXMgdGhlIGNhdGVnb3J5IGF4aXMgKHVzdWFsbHkgdGhlIG9ubHkgc3RyaW5nLXZhbHVlZCBjb2x1bW4pXG4gIGFuZCBvbmUgb3IgbW9yZSBudW1lcmljIGNvbHVtbnMgYXMgc2VyaWVzLiBTb3J0IGNhdGVnb3JpZXMgYnkgdGhlXG4gIHByaW1hcnkgc2VyaWVzIHZhbHVlIGRlc2NlbmRpbmcgdW5sZXNzIHRoZSBkYXRhIGlzIG5hdHVyYWxseSBvcmRlcmVkXG4gIChkYXRlcywgcmFua3MsIGZ1bm5lbCBzdGFnZXMsIHdhdGVyZmFsbCBzdGVwcykuIEZvciBcXGBjb21ib1xcYCwgc2V0XG4gIGVhY2ggc2VyaWVzJyBcXGB0eXBlXFxgIHRvIFxcYGJhclxcYCwgXFxgbGluZVxcYCwgb3IgXFxgYXJlYVxcYCwgYW5kIHVzZVxuICBcXGB5QXhpc0luZGV4OiAxXFxgIHdoZW4gYSBzZXJpZXMgbmVlZHMgYSBzZWNvbmQgc2NhbGUuXG5cbiAgRm9yIHdhdGVyZmFsbCwgZW1pdCBleGFjdGx5IE9ORSBzZXJpZXMgaG9sZGluZyB0aGUgc2lnbmVkIHN0ZXAgdmFsdWVzXG4gIChkZWx0YXMpLCBvbmUgcGVyIGNhdGVnb3J5LCBpbiBvcmRlciAtIHBvc2l0aXZlIGZvciBhIHJpc2UsIG5lZ2F0aXZlXG4gIGZvciBhIGRyb3AuIERvIE5PVCBhZGQgYSBjdW11bGF0aXZlIC8gcnVubmluZy10b3RhbCAvIGJhc2Ugc2VyaWVzIGFuZFxuICBkbyBOT1QgY29udmVydCB0aGUgZGVsdGFzIGludG8gcnVubmluZyB0b3RhbHMgeW91cnNlbGY7IHRoZSBydW5uaW5nXG4gIHRvdGFsIGlzIGNvbXB1dGVkIGZvciB5b3UsIGFuZCBhIGhhbmQtYnVpbHQgYmFzZSBzZXJpZXMgcmVuZGVycyBhcyBhXG4gIHBsYWluIGJhciBjaGFydCBpbnN0ZWFkIG9mIGEgYnJpZGdlLlxuXG4gIEZvciBwaWUgLyBmdW5uZWwgLyB0cmVlbWFwOiBwaWNrIHRoZSBjYXRlZ29yeSBjb2x1bW4gZm9yIHNsaWNlIG5hbWVzXG4gIGFuZCBvbmUgbnVtZXJpYyBjb2x1bW4gZm9yIHNsaWNlIHZhbHVlcy4gRW1pdCBhIHNpbmdsZSBzZXJpZXMgb2ZcbiAgXFxge25hbWUsIHZhbHVlfVxcYCBvYmplY3RzLlxuXG4gIEZvciBzY2F0dGVyOiBwaWNrIHR3byBudW1lcmljIGNvbHVtbnMgYW5kIGVtaXQgXFxgW3gsIHldXFxgIHR1cGxlcyBpblxuICBvbmUgb3IgbW9yZSBzZXJpZXMgKG9uZSBzZXJpZXMgcGVyIGdyb3VwIGlmIGEgZ3JvdXBpbmcgY29sdW1uIGV4aXN0cykuXG5cbiAgRm9yIGhlYXRtYXA6IHBpY2sgdHdvIGNhdGVnb3J5IGNvbHVtbnMgYW5kIG9uZSBudW1lcmljIG1lYXN1cmUuIFB1dFxuICB0aGUgeC1heGlzIGNhdGVnb3JpZXMgaW4gXFxgY2F0ZWdvcmllc1xcYCwgdGhlbiBlbWl0IE9ORSBTRVJJRVMgUEVSIFJPV1xuICBvZiB0aGUgbWF0cml4IC0gdGhlIHNlcmllcyBcXGBuYW1lXFxgIGlzIHRoZSByb3cgbGFiZWwgYW5kIFxcYGRhdGFcXGAgaXNcbiAgdGhlIHJvdydzIG51bWJlcnMsIG9uZSBwZXIgZW50cnkgaW4gXFxgY2F0ZWdvcmllc1xcYCwgaW4gdGhlIHNhbWUgb3JkZXIuXG4gIERvIG5vdCBjb21wdXRlIGNlbGwgaW5kaWNlcy5cblxuICBGb3IgcmFkYXI6IFxcYGNhdGVnb3JpZXNcXGAgYXJlIHRoZSBpbmRpY2F0b3IgbmFtZXM7IGVhY2ggc2VyaWVzIGlzIGFuXG4gIGFycmF5IG9mIG51bWJlcnMgKG9uZSB2YWx1ZSBwZXIgaW5kaWNhdG9yKS5cblxuICBGb3IgYW55dGhpbmcgdGhlIHR5cGVzIGFib3ZlIGNhbm5vdCBleHByZXNzIC0gYSBzYW5rZXksIGJveHBsb3QsXG4gIGNhbmRsZXN0aWNrLCBzdW5idXJzdCwgZ2F1Z2UsIG5ldHdvcmsgZ3JhcGgsIGNhbGVuZGFyLCBwYXJhbGxlbC1cbiAgY29vcmRpbmF0ZXMgcGxvdCwgb3IgYW55IG90aGVyIEVjaGFydHMgc2VyaWVzIC0gdXNlIFxcYGN1c3RvbVxcYCBhbmRcbiAgaGFuZC13cml0ZSB0aGUgd2hvbGUgRWNoYXJ0cyBvcHRpb24gaW50byBcXGBvcHRpb25cXGAgYXMgYSBKU09OIHN0cmluZy5cbiAgSW5jbHVkZSBldmVyeSBwYXJ0IHRoYXQgY2hhcnQgbmVlZHM6IHRoZSBzZXJpZXMgd2l0aCB0aGVpciBvd25cbiAgXFxgdHlwZVxcYCBhbmQgZGF0YSBzaGFwZSwgcGx1cyBhbnkgY29vcmRpbmF0ZSBzeXN0ZW0sIFxcYHZpc3VhbE1hcFxcYCxcbiAgb3IgYXhlcy4gTGVhdmUgXFxgc2VyaWVzXFxgLCBcXGBjYXRlZ29yaWVzXFxgLCBhbmQgdGhlIGF4aXMgbGFiZWxzIG91dDtcbiAgdGhleSBhcmUgaWdub3JlZCBmb3IgXFxgY3VzdG9tXFxgLiBQcmVmZXIgYSBsaXN0ZWQgdHlwZSB3aGVuZXZlciBvbmVcbiAgZ2VudWluZWx5IGZpdHMgLSBcXGBjdXN0b21cXGAgZ2l2ZXMgdXAgdGhlIHNoYXJlZCB0b29sdGlwLCBsZWdlbmQsIGFuZFxuICBncmlkIGRlZmF1bHRzLCBzbyBpdCBpcyB0aGUgYW5zd2VyIGZvciBhbiB1bnN1cHBvcnRlZCBjaGFydCBzaGFwZSxcbiAgbm90IGEgd2F5IHRvIHJlc3R5bGUgYSBzdXBwb3J0ZWQgb25lLlxuXG4gIEtlZXAgc2VyaWVzIG5hbWVzIGh1bWFuLXJlYWRhYmxlICh1c2UgdGhlIGNvbHVtbiBuYW1lOyB0aXRsZSBjYXNlIGl0XG4gIGxpZ2h0bHkgaWYgbmVlZGVkKS4gS2VlcCB0aXRsZXMgY29uY2lzZTsgZG8gbm90IHJlcGVhdCB0aGUgdXNlcidzXG4gIHRpdGxlIGluIHhBeGlzTGFiZWwgLyB5QXhpc0xhYmVsLlxuYCk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBsYW5uZXIgYWdlbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBPbmUgcGxhbm5lciBgQWdlbnRgIHBlciBwbHVnaW4gY29uZmlnLiBDYWNoZWQgb24gY29uZmlnIG9iamVjdFxuICogaWRlbnRpdHkgc28gY2FsbGVycyBjYW4gYHByZXBhcmVDaGFydCh7IGNvbmZpZywgLi4uIH0pYCBmcm9tIGFcbiAqIGhvdCBwYXRoIHdpdGhvdXQgcGF5aW5nIHRoZSBBZ2VudC1jb25zdHJ1Y3RvciBjb3N0IGV2ZXJ5IGNhbGwuXG4gKiBgV2Vha01hcGAgbGV0cyByZXRpcmVkIGNvbmZpZ3MgKGUuZy4gdGVzdCByZWNvbmZpZ3VyYXRpb25zKVxuICogcmVsZWFzZSB0aGVpciBhZ2VudCB3aXRob3V0IG1hbnVhbCBldmljdGlvbi5cbiAqL1xuY29uc3QgcGxhbm5lckFnZW50cyA9IG5ldyBXZWFrTWFwPE1hc3RyYVBsdWdpbkNvbmZpZywgQWdlbnQ+KCk7XG5cbmZ1bmN0aW9uIGdldFBsYW5uZXJBZ2VudChjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IEFnZW50IHtcbiAgbGV0IGFnZW50ID0gcGxhbm5lckFnZW50cy5nZXQoY29uZmlnKTtcbiAgaWYgKCFhZ2VudCkge1xuICAgIGFnZW50ID0gbmV3IEFnZW50KHtcbiAgICAgIGlkOiBcImNoYXJ0X3BsYW5uZXJcIixcbiAgICAgIG5hbWU6IFwiQ2hhcnQgUGxhbm5lclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiUGlja3MgY2hhcnQgdHlwZSBhbmQgYXhpcyBlbmNvZGluZ3MgZm9yIGEgZGF0YXNldC5cIixcbiAgICAgIGluc3RydWN0aW9uczogQ0hBUlRfUExBTk5FUl9JTlNUUlVDVElPTlMsXG4gICAgICBtb2RlbDogKHsgcmVxdWVzdENvbnRleHQgfSkgPT5cbiAgICAgICAgYnVpbGRNb2RlbChjb25maWcsIHJlcXVlc3RDb250ZXh0LCB7IG1vZGVsQ2xhc3M6IG1vZGVsLk1vZGVsQ2xhc3MuQ2hhdEZhc3QgfSksXG4gICAgfSk7XG4gICAgcGxhbm5lckFnZW50cy5zZXQoY29uZmlnLCBhZ2VudCk7XG4gIH1cbiAgcmV0dXJuIGFnZW50O1xufVxuXG4vKipcbiAqIFJ1biB0aGUgcGxhbm5lciBhZ2FpbnN0IGByZXF1ZXN0YCBhbmQgcmV0dXJuIHRoZSByZXNvbHZlZFxuICogRWNoYXJ0cyBzcGVjLiBUaHJvd3Mgb24gcGxhbm5lciBmYWlsdXJlIC0ge0BsaW5rIHByZXBhcmVDaGFydH1cbiAqIGNhdGNoZXMgYW5kIHN0YXNoZXMgdGhlIGVycm9yIGluIHRoZSBjYWNoZSBlbnRyeS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuQ2hhcnRQbGFubmVyKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgcmVxdWVzdDogQ2hhcnRQbGFubmVyUmVxdWVzdCxcbiAgb3B0aW9uczogeyByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0OyBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsIH0gPSB7fSxcbik6IFByb21pc2U8Q2hhcnRSZXN1bHQ+IHtcbiAgY29uc3QgeyB0aXRsZSwgZGVzY3JpcHRpb24sIGRhdGEgfSA9IHJlcXVlc3Q7XG4gIGNvbnN0IHsgcmVxdWVzdENvbnRleHQsIGFib3J0U2lnbmFsIH0gPSBvcHRpb25zO1xuICBjb25zdCBwcm9tcHQgPSBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKHtcbiAgICBUaXRsZTogdGl0bGUsXG4gICAgLi4uKGRlc2NyaXB0aW9uID8geyBEZXNjcmlwdGlvbjogZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICBcIkRhdGFzZXQgKEpTT04sIG9uZSByb3cgcGVyIG9iamVjdClcIjogSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMiksXG4gIH0pO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRQbGFubmVyQWdlbnQoY29uZmlnKS5nZW5lcmF0ZShwcm9tcHQsIHtcbiAgICBzdHJ1Y3R1cmVkT3V0cHV0OiB7IHNjaGVtYTogY2hhcnRQbGFuU2NoZW1hIH0sXG4gICAgLi4uKHJlcXVlc3RDb250ZXh0ID8geyByZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgIC4uLihhYm9ydFNpZ25hbCA/IHsgYWJvcnRTaWduYWwgfSA6IHt9KSxcbiAgfSk7XG4gIGNvbnN0IHBsYW4gPSBjaGFydFBsYW5TY2hlbWEucGFyc2UocmVzdWx0Lm9iamVjdCk7XG4gIGNvbnN0IG9wdGlvbiA9IHBsYW5Ub0VjaGFydHNPcHRpb24ocGxhbiwgdGl0bGUsIGNvbmZpZy5icmFuZCk7XG4gIHJldHVybiB7IGNoYXJ0VHlwZTogcGxhbi5jaGFydFR5cGUsIG9wdGlvbiB9O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY2FjaGUgaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBCdWlsZCB0aGUgY2Fub25pY2FsIGNhY2hlIGtleSBmb3IgYSBgY2hhcnRJZGAgb3duZWQgYnkgYHVzZXJLZXlgLlxuICpcbiAqIFRoZSBpZGVudGl0eSBpcyBwYXJ0IG9mIHRoZSBrZXksIG5vdCBhIGZpbHRlciBhcHBsaWVkIGFmdGVyIHRoZSByZWFkLCBzbyBhXG4gKiBjaGFydCBpZCBndWVzc2VkIG9yIGNvcGllZCBmcm9tIGFub3RoZXIgdXNlcidzIHRyYW5zY3JpcHQgcmVzb2x2ZXMgdG8gYVxuICogZGlmZmVyZW50IGtleSBhbmQgc2ltcGx5IG1pc3Nlcy4gVGhhdCBtaXNzIGlzIHdoYXQgdGhlIEhUVFAgcm91dGUgdHVybnMgaW50b1xuICogYSA0MDQsIHdoaWNoIGlzIGFsc28gdGhlIGFuc3dlciB0aGF0IGxlYWtzIHRoZSBsZWFzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hhcnRDYWNoZUtleShjaGFydElkOiBzdHJpbmcsIHVzZXJLZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiAoYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlKCkpLmdlbmVyYXRlS2V5KFtDSEFSVF9DQUNIRV9OQU1FU1BBQ0UsIGNoYXJ0SWRdLCB1c2VyS2V5KTtcbn1cblxuLyoqXG4gKiBQZXJzaXN0IGEge0BsaW5rIENoYXJ0fSBlbnRyeSB1bmRlciBpdHMgYGNoYXJ0SWRgLCBvd25lZCBieSBgdXNlcktleWAuXG4gKiBSZWZyZXNoZXMgdGhlIFRUTCBvbiBldmVyeSB3cml0ZS4gQ2FjaGUtbGF5ZXIgZmFpbHVyZXMgYXJlIGxvZ2dlZCBhbmRcbiAqIHN3YWxsb3dlZCBzbyBiYWNrZ3JvdW5kIHJ1bm5lcnMgbmV2ZXIgdGhyb3cgaW50byB0aGVcbiAqIHVuaGFuZGxlZC1yZWplY3Rpb24gc3RyZWFtLlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNoYXJ0KGVudHJ5OiBDaGFydCwgdXNlcktleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2hhcnRDYWNoZUtleShlbnRyeS5jaGFydElkLCB1c2VyS2V5KTtcbiAgICBhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCkuc2V0KGtleSwgZW50cnksIHtcbiAgICAgIHR0bDogQ0hBUlRfQ0FDSEVfVFRMX1NFQyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJ3cml0ZS1lcnJvclwiLCB7XG4gICAgICBjaGFydElkOiBlbnRyeS5jaGFydElkLFxuICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogTG9vayB1cCBhIGNoYXJ0IGB1c2VyS2V5YCBvd25zLiBSZXR1cm5zIGB1bmRlZmluZWRgIG9uIG1pc3MsIG9uXG4gKiBleHBpcnksIHdoZW4gYW5vdGhlciBpZGVudGl0eSBvd25zIHRoZSBpZCwgb3Igd2hlbiB0aGUgY2FjaGUgbGF5ZXIgaXNcbiAqIHVuaGVhbHRoeSAtIG5ldmVyIHRocm93cy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZENoYXJ0KGNoYXJ0SWQ6IHN0cmluZywgdXNlcktleTogc3RyaW5nKTogUHJvbWlzZTxDaGFydCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNoYXJ0Q2FjaGVLZXkoY2hhcnRJZCwgdXNlcktleSk7XG4gICAgY29uc3QgdiA9IGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5nZXQ8Q2hhcnQ+KGtleSk7XG4gICAgcmV0dXJuIHYgPz8gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcInJlYWQtZXJyb3JcIiwge1xuICAgICAgY2hhcnRJZCxcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcmVwYXJlQ2hhcnQgb3JjaGVzdHJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogSW5wdXRzIHRvIHtAbGluayBwcmVwYXJlQ2hhcnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVwYXJlQ2hhcnRPcHRpb25zIHtcbiAgLyoqIFBsdWdpbiBjb25maWc7IHJlc29sdmVzIHRoZSBwbGFubmVyIGFnZW50J3MgbW9kZWwuICovXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xuICAvKipcbiAgICogSWRlbnRpdHkgdGhhdCBvd25zIHRoZSBtaW50ZWQgY2hhcnQuIE9ubHkgYSB7QGxpbmsgZmV0Y2hDaGFydH0gY2FsbFxuICAgKiBjYXJyeWluZyB0aGUgc2FtZSBrZXkgcmVzb2x2ZXMgaXQuIFVzZSB7QGxpbmsgcmVzb2x2ZVVzZXJLZXl9LlxuICAgKi9cbiAgdXNlcktleTogc3RyaW5nO1xuICAvKiogRGlzcGxheSB0aXRsZSBmb3J3YXJkZWQgdG8gdGhlIHBsYW5uZXIgYWdlbnQuICovXG4gIHRpdGxlPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgaW50ZW50IGhpbnQgZm9yd2FyZGVkIHRvIHRoZSBwbGFubmVyIGFnZW50LiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSByb3dzIHRvIGNoYXJ0LiBDYWxsZWQgb25jZSwgaW4gdGhlIGJhY2tncm91bmQuXG4gICAqIEFueSB0aHJvd24gZXJyb3IgbGFuZHMgaW4gdGhlIGNhY2hlIGFzIHRoZSBlbnRyeSdzIGBlcnJvcmBcbiAgICogZmllbGQgKG5ldmVyIHByb3BhZ2F0ZWQgdG8gdGhlIGNhbGxlciBvZiB7QGxpbmsgcHJlcGFyZUNoYXJ0fSkuXG4gICAqIEFuIGVtcHR5IGByb3dzYCBhcnJheSBpcyByZWplY3RlZCBhcyBgXCJkYXRhc2V0IGhhcyBubyByb3dzO1xuICAgKiBub3RoaW5nIHRvIGNoYXJ0XCJgLlxuICAgKi9cbiAgcmVzb2x2ZURhdGE6IChzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzZTx7IHJvd3M6IFJlYWRvbmx5QXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IH0+O1xuICAvKipcbiAgICogUGVyLXJlcXVlc3QgYFJlcXVlc3RDb250ZXh0YC4gRm9yd2FyZGVkIHRvIHRoZSBwbGFubmVyIGFnZW50IHNvXG4gICAqIHVzZXItc2NvcGVkIG1vZGVsIHJlc29sdXRpb24gKE9CTykgc3RheXMgaW4gZWZmZWN0LlxuICAgKi9cbiAgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDtcbiAgLyoqXG4gICAqIENvb3BlcmF0aXZlIGNhbmNlbGxhdGlvbi4gRm9yd2FyZGVkIHRvIGByZXNvbHZlRGF0YWAgYW5kIHRoZVxuICAgKiBwbGFubmVyIGFnZW50LiBOb3RlOiB0aGUgY2hhcnQgdGFzayBjb250aW51ZXMgcnVubmluZyBpbiB0aGVcbiAgICogYmFja2dyb3VuZCBhZnRlciB0aGUgcGFyZW50IHJlcXVlc3QgZW5kcywgc28gZXh0ZXJuYWwgYWJvcnRcbiAgICogc2lnbmFscyBhcmUgYmVzdC1lZmZvcnQ7IHR5cGljYWwgdXNlIGlzIHRvIGxlYXZlIHRoaXMgdW5zZXRcbiAgICogYW5kIGxldCB0aGUgMWggVFRMIGNhcCBzdGFsZSBlbnRyaWVzLlxuICAgKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogTWludCBhIGBjaGFydElkYCwgY2FjaGUgYW4gZW1wdHkgYHsgY2hhcnRJZCB9YCBwbGFjZWhvbGRlclxuICogc3luY2hyb25vdXNseSwgYW5kIGtpY2sgb2ZmIGEgYmFja2dyb3VuZCB0YXNrIHRoYXQgcmVzb2x2ZXMgdGhlXG4gKiBkYXRhc2V0IGFuZCBydW5zIHRoZSBwbGFubmVyLiBSZXR1cm5zIHRoZSBgY2hhcnRJZGAgb25jZSB0aGVcbiAqIHBsYWNlaG9sZGVyIGxhbmRzIHNvIHRoZSBmaXJzdCB7QGxpbmsgZmV0Y2hDaGFydH0gY2FsbCBhbHdheXNcbiAqIHNlZXMgYW4gZW50cnkgKG5vIHNwdXJpb3VzIDQwNCByYWNlKS5cbiAqXG4gKiBUaGUgYmFja2dyb3VuZCB0YXNrIHN3YWxsb3dzIGl0cyBvd24gZmFpbHVyZXMgYW5kIHdyaXRlcyB0aGVtXG4gKiBhcyBgZXJyb3JgIGVudHJpZXMsIHNvIGNhbGxlcnMgbmV2ZXIgc2VlIGEgcmVqZWN0ZWQgcHJvbWlzZS5cbiAqIENhY2hlIHN0YXRlIG1hY2hpbmU6XG4gKlxuICogICAtIGp1c3QgYWZ0ZXIgdGhpcyBjYWxsIHJldHVybnM6IGB7IGNoYXJ0SWQgfWAgKHByb2Nlc3NpbmcpXG4gKiAgIC0gb24gcGxhbm5lciBzdWNjZXNzOiAgICAgICAgICAgYHsgY2hhcnRJZCwgcmVzdWx0IH1gXG4gKiAgIC0gb24gZGF0YSAvIHBsYW5uZXIgZmFpbHVyZTogICAgYHsgY2hhcnRJZCwgZXJyb3IgfWBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVDaGFydChvcHRzOiBQcmVwYXJlQ2hhcnRPcHRpb25zKTogUHJvbWlzZTxDaGFydFRvb2xPdXRwdXQ+IHtcbiAgY29uc3QgY2hhcnRJZCA9IGhhc2guaWQoKTtcbiAgYXdhaXQgd3JpdGVDaGFydCh7IGNoYXJ0SWQgfSwgb3B0cy51c2VyS2V5KTtcbiAgbG9nZ2VyLmRlYnVnKFwicXVldWVkXCIsIHsgY2hhcnRJZCB9KTtcbiAgLy8gRmlyZS1hbmQtZm9yZ2V0LiBGYWlsdXJlcyBsYW5kIGluIHRoZSBjYWNoZSBhcyBgZXJyb3JgIGVudHJpZXM7XG4gIC8vIG5ldmVyIGVzY2FwZSBpbnRvIGFuIHVuaGFuZGxlZCByZWplY3Rpb24uXG4gIHZvaWQgcnVuUHJlcGFyZUNoYXJ0KGNoYXJ0SWQsIG9wdHMpO1xuICByZXR1cm4geyBjaGFydElkLCBtYXJrZXI6IG1hcmtlcnMuZm9ybWF0TWFya2VyKFwiY2hhcnRcIiwgY2hhcnRJZCkgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUHJlcGFyZUNoYXJ0KGNoYXJ0SWQ6IHN0cmluZywgb3B0czogUHJlcGFyZUNoYXJ0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBvcHRzLnJlc29sdmVEYXRhKG9wdHMuc2lnbmFsKTtcbiAgICBpZiAoZGF0YS5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwiRGF0YXNldCBoYXMgbm8gcm93czsgbm90aGluZyB0byBjaGFydFwiKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuQ2hhcnRQbGFubmVyKFxuICAgICAgb3B0cy5jb25maWcsXG4gICAgICB7XG4gICAgICAgIHRpdGxlOiBvcHRzLnRpdGxlID8/IFwiQ2hhcnRcIixcbiAgICAgICAgLi4uKG9wdHMuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBvcHRzLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIGRhdGE6IGRhdGEucm93cyBhcyBDaGFydFBsYW5uZXJSZXF1ZXN0W1wiZGF0YVwiXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC4uLihvcHRzLnJlcXVlc3RDb250ZXh0ID8geyByZXF1ZXN0Q29udGV4dDogb3B0cy5yZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgICAgICAuLi4ob3B0cy5zaWduYWwgPyB7IGFib3J0U2lnbmFsOiBvcHRzLnNpZ25hbCB9IDoge30pLFxuICAgICAgfSxcbiAgICApO1xuICAgIGF3YWl0IHdyaXRlQ2hhcnQoeyBjaGFydElkLCByZXN1bHQgfSwgb3B0cy51c2VyS2V5KTtcbiAgICBsb2dnZXIuaW5mbyhcImRvbmVcIiwge1xuICAgICAgY2hhcnRJZCxcbiAgICAgIGNoYXJ0VHlwZTogcmVzdWx0LmNoYXJ0VHlwZSxcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJlcnJvclwiLCB7IGNoYXJ0SWQsIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyKSB9KTtcbiAgICAvLyBUaGUgZW50cnkncyBgZXJyb3JgIGlzIHJlbmRlcmVkIGluIHRoZSBjaGF0LCBzbyBvbmx5IGFuIEFwcEtpdEVycm9yJ3NcbiAgICAvLyBvd24gbWVzc2FnZSB0cmF2ZWxzOyBhbnl0aGluZyBlbHNlIGNvdWxkIGNhcnJ5IHVwc3RyZWFtIHByb3ZpZGVyIGRldGFpbC5cbiAgICBjb25zdCBlcnJUZXh0ID0gZXJyIGluc3RhbmNlb2YgQXBwS2l0RXJyb3IgPyBlcnIubWVzc2FnZSA6IENIQVJUX0ZBSUxFRF9NRVNTQUdFO1xuICAgIGF3YWl0IHdyaXRlQ2hhcnQoeyBjaGFydElkLCBlcnJvcjogZXJyVGV4dCB9LCBvcHRzLnVzZXJLZXkpO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbG9uZy1wb2xsIGZldGNoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIElucHV0cyB0byB7QGxpbmsgZmV0Y2hDaGFydH0uICovXG5leHBvcnQgaW50ZXJmYWNlIEZldGNoQ2hhcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIElkZW50aXR5IHRoZSBjaGFydCBtdXN0IGJlbG9uZyB0by4gQSBjaGFydCBtaW50ZWQgdW5kZXIgYSBkaWZmZXJlbnQga2V5XG4gICAqIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gdW5rbm93biBpZC4gVXNlIHtAbGluayByZXNvbHZlVXNlcktleX0uXG4gICAqL1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXJ2ZXItc2lkZSBwb2xsaW5nIGJ1ZGdldCBpbiBtcy4gV2hlbiB0aGUgZW50cnkgc3RheXMgaW5cbiAgICogdGhlIHByb2Nlc3Npbmcgc3RhdGUgcGFzdCB0aGlzIHdpbmRvdywgdGhlIGhlbHBlciByZXR1cm5zIHRoZVxuICAgKiBsYXN0IHNlZW4gdmFsdWUgKHN0aWxsIHByb2Nlc3NpbmcpIHNvIHRoZSBjbGllbnQgY2FuIHJlLXBvbGwuXG4gICAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0ZFVENIX1RJTUVPVVRfTVN9ICg2MHMpLlxuICAgKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogUG9sbCBpbnRlcnZhbCBpbiBtcy4gRGVmYXVsdHMgdG9cbiAgICoge0BsaW5rIERFRkFVTFRfRkVUQ0hfSU5URVJWQUxfTVN9ICgyNTBtcykuXG4gICAqL1xuICBpbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uIGhhbmRsZSAoZS5nLiByZXF1ZXN0IGByZXEuc2lnbmFsYCkuICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKipcbiAqIExvbmctcG9sbCB0aGUgY2hhcnQgY2FjaGUgdW50aWwgdGhlIGVudHJ5IHNldHRsZXMgKGByZXN1bHRgIG9yXG4gKiBgZXJyb3JgIHNldCksIHRoZSBlbnRyeSBpcyBtaXNzaW5nLCBvciB0aGUgc2VydmVyLXNpZGUgdGltZW91dFxuICogZWxhcHNlcy5cbiAqXG4gKiBSZXR1cm5zOlxuICogICAtIHRoZSByZXNvbHZlZCB7QGxpbmsgQ2hhcnR9IHdoZW4gaXQgc2V0dGxlZCwgZXJyb3JlZCwgb3JcbiAqICAgICBzdGF5ZWQgaW4gcHJvY2Vzc2luZyBwYXN0IGB0aW1lb3V0TXNgIChzbyB0aGUgY2xpZW50IGNhblxuICogICAgIHJlLXBvbGwpO1xuICogICAtIGB1bmRlZmluZWRgIHdoZW4gdGhlIGVudHJ5IGlzIG1pc3NpbmcsIGV4cGlyZWQsIG9yIG93bmVkIGJ5XG4gKiAgICAgYW5vdGhlciBpZGVudGl0eSAodGhlIGNvbnN1bWVyIHNob3VsZCB0cmVhdCBhcyA0MDQpLlxuICpcbiAqIGBzaWduYWxgIGxldHMgdGhlIGNhbGxlciBjYW5jZWwgYWhlYWQgb2YgdGltZW91dCAoZS5nLiB0aGUgSFRUUFxuICogcmVxdWVzdCBjbG9zZWQpLiBDYW5jZWxsYXRpb24gcHJvcGFnYXRlcyB0byB0aGUgaW50ZXItcG9sbCBzbGVlcFxuICogc28gdGhlIGhlbHBlciByZXR1cm5zIGltbWVkaWF0ZWx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hDaGFydChcbiAgY2hhcnRJZDogc3RyaW5nLFxuICBvcHRpb25zOiBGZXRjaENoYXJ0T3B0aW9ucyxcbik6IFByb21pc2U8Q2hhcnQgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgdGltZW91dE1zID0gb3B0aW9ucy50aW1lb3V0TXMgPz8gREVGQVVMVF9GRVRDSF9USU1FT1VUX01TO1xuICBjb25zdCBpbnRlcnZhbE1zID0gb3B0aW9ucy5pbnRlcnZhbE1zID8/IERFRkFVTFRfRkVUQ0hfSU5URVJWQUxfTVM7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRpbWVvdXRNcztcblxuICBsZXQgbGFzdDogQ2hhcnQgfCB1bmRlZmluZWQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgb3B0aW9ucy5zaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgbGFzdCA9IGF3YWl0IHJlYWRDaGFydChjaGFydElkLCBvcHRpb25zLnVzZXJLZXkpO1xuICAgIGlmICghbGFzdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAobGFzdC5yZXN1bHQgIT09IHVuZGVmaW5lZCB8fCBsYXN0LmVycm9yICE9PSB1bmRlZmluZWQpIHJldHVybiBsYXN0O1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IGRlYWRsaW5lIC0gRGF0ZS5ub3coKTtcbiAgICBpZiAocmVtYWluaW5nIDw9IDApIHJldHVybiBsYXN0O1xuICAgIGF3YWl0IGFzeW5jVXRpbHMuc2xlZXAoTWF0aC5taW4oaW50ZXJ2YWxNcywgcmVtYWluaW5nKSwgb3B0aW9ucy5zaWduYWwpO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVjaGFydHMgdGhlbWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUaGUgc2xpY2Ugb2YgYW4gRWNoYXJ0cyBvcHRpb24gdGhhdCBjYXJyaWVzIGJyYW5kIGlkZW50aXR5OiB0aGUgc2VyaWVzXG4gKiBjb2xvciBjeWNsZSBhbmQgdGhlIGJhc2UgZm9udCBzdGFjay4gRGVyaXZlZCBmcm9tIGEge0BsaW5rIEJyYW5kQ29udGV4dH1cbiAqIGJ5IHtAbGluayBicmFuZENoYXJ0VGhlbWV9IGFuZCBtZXJnZWQgaW50byBldmVyeSBzcGVjIGJ5XG4gKiB7QGxpbmsgcGxhblRvRWNoYXJ0c09wdGlvbn0uXG4gKlxuICogRGVsaWJlcmF0ZWx5IGNhcnJpZXMgbm8gdGV4dCBDT0xPUi4gQSBzcGVjIGlzIHBsYW5uZWQgaGVyZSwgb24gdGhlXG4gKiBzZXJ2ZXIsIGFuZCByZWFkIGxhdGVyIGluIGEgYnJvd3NlciB3aG9zZSBsaWdodC9kYXJrIHRoZW1lIHRoaXMgY29kZVxuICogY2Fubm90IGtub3c7IGJha2luZyBpbiB0aGUgYnJhbmQncyBzaW5nbGUgKGxpZ2h0KSBmb3JlZ3JvdW5kIHByb2R1Y2VkXG4gKiBuZWFyLWJsYWNrIGxhYmVscyB0aGF0IGRpc2FwcGVhcmVkIGFnYWluc3QgYSBkYXJrIGNoYXQgc3VyZmFjZS4gVGhlXG4gKiByZW5kZXJlciByZXNvbHZlcyBjaHJvbWUgY29sb3JzIGZyb20gQXBwS2l0J3MgbGl2ZSBDU1MgdG9rZW5zIGluc3RlYWRcbiAqIChgQGRieC10b29scy91aS1tYXN0cmFgJ3MgYGNoYXJ0LXRoZW1lYCArIGBub3JtYWxpemVDaGFydE9wdGlvbmApLFxuICogbGVhdmluZyB0aGlzIHRoZW1lIHRoZSBwYXJ0cyB0aGF0IHJlYWQgdGhlIHNhbWUgaW4gZWl0aGVyIG1vZGUuXG4gKi9cbmludGVyZmFjZSBDaGFydFRoZW1lIHtcbiAgY29sb3I6IHN0cmluZ1tdO1xuICB0ZXh0U3R5bGU6IHsgZm9udEZhbWlseTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQXBwS2l0J3MgY2F0ZWdvcmljYWwgY2hhcnQgcGFsZXR0ZSAoYC0tY2hhcnQtY2F0LTFgIC4uIGAtLWNoYXJ0LWNhdC04YCBmcm9tXG4gKiBgQGRhdGFicmlja3MvYXBwa2l0LXVpYCksIGFzIGhleC4gU2VydmVyLXJlbmRlcmVkIGNoYXJ0IHNwZWNzIGNhbm5vdCByZWFkIHRoZVxuICogYnJvd3NlcidzIENTUyBjdXN0b20gcHJvcGVydGllcywgc28gdGhlIHZhbHVlcyBhcmUgbWlycm9yZWQgaGVyZSB0byBrZWVwIGFcbiAqIGdlbmVyYXRlZCBjaGFydCB2aXN1YWxseSBjb25zaXN0ZW50IHdpdGggdGhlIEFwcEtpdC1zdHlsZWQgVUkgYXJvdW5kIGl0LlxuICogS2VlcCBpbiBzeW5jIHdpdGggQXBwS2l0J3Mgc3R5bGVzaGVldCBpZiBpdCBjaGFuZ2VzLlxuICovXG5jb25zdCBBUFBLSVRfQ0hBUlRfUEFMRVRURSA9IFtcbiAgXCIjMjQ2M0VCXCIsIC8vIGJsdWVcbiAgXCIjMkVCODhBXCIsIC8vIHRlYWxcbiAgXCIjQUI0N0JEXCIsIC8vIHB1cnBsZVxuICBcIiNGNjlFMjNcIiwgLy8gYW1iZXJcbiAgXCIjREQyQzREXCIsIC8vIHJvc2VcbiAgXCIjMUJBM0JCXCIsIC8vIGN5YW5cbiAgXCIjOUI2MUQxXCIsIC8vIGxhdmVuZGVyXG4gIFwiIzM0QjI2MlwiLCAvLyBlbWVyYWxkXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIEV4cGFuZCB0d28gYnJhbmQgaGV4IGNvbG9ycyBpbnRvIGEgbGVnaWJsZSBjYXRlZ29yaWNhbCBjeWNsZS4gRWNoYXJ0c1xuICogcmVwZWF0cyB0aGUgYGNvbG9yYCBhcnJheSBhY3Jvc3Mgc2VyaWVzIC8gY2F0ZWdvcmllcywgc28gYSBnb29kIGRlZmF1bHRcbiAqIG5lZWRzIHNldmVyYWwgZGlzdGluY3QgaHVlcywgbm90IHR3by4gV2Ugc2VlZCB3aXRoIHRoZSBicmFuZCBwcmltYXJ5IGFuZFxuICogYWNjZW50ICh0aGUgaWRlbnRpdHkgY29sb3JzKSBhbmQgZm9sbG93IHdpdGggQXBwS2l0J3Mgb3duIGNhdGVnb3JpY2FsIGNoYXJ0XG4gKiBwYWxldHRlLCBzbyBtdWx0aS1zZXJpZXMgLyBtYW55LXNsaWNlIGNoYXJ0cyBzdGF5IHJlYWRhYmxlIGFuZCBtYXRjaCB0aGVcbiAqIHN1cnJvdW5kaW5nIEFwcEtpdCBVSSB3aGlsZSB0aGUgZmlyc3Qgb25lIG9yIHR3byBtYXJrcyBsYW5kIG9uLWJyYW5kLlxuICovXG5mdW5jdGlvbiBicmFuZENvbG9yQ3ljbGUocHJpbWFyeTogc3RyaW5nLCBhY2NlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgc3ByZWFkID0gQVBQS0lUX0NIQVJUX1BBTEVUVEU7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcmV0dXJuIFtwcmltYXJ5LCBhY2NlbnQsIC4uLnNwcmVhZF0uZmlsdGVyKChjKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gYy50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChzZWVuLmhhcyhrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQoa2V5KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGVyaXZlIGFuIEVjaGFydHMge0BsaW5rIENoYXJ0VGhlbWV9IGZyb20gYSBicmFuZCBjb250ZXh0OiB0aGUgcHJpbWFyeSArXG4gKiBhY2NlbnQgY29sb3JzIHNlZWQgdGhlIHNlcmllcyBjeWNsZSBhbmQgdGhlIHNhbnMgc3RhY2sgYmVjb21lcyB0aGUgYmFzZVxuICogZm9udC4gVGV4dCBjb2xvcnMgYXJlIHRoZSByZW5kZXJlcidzIGpvYiAtIHNlZSB7QGxpbmsgQ2hhcnRUaGVtZX0uXG4gKi9cbmZ1bmN0aW9uIGJyYW5kQ2hhcnRUaGVtZShicmFuZDogQnJhbmRDb250ZXh0KTogQ2hhcnRUaGVtZSB7XG4gIHJldHVybiB7XG4gICAgY29sb3I6IGJyYW5kQ29sb3JDeWNsZShicmFuZC5jb2xvcnMucHJpbWFyeSwgYnJhbmQuY29sb3JzLmFjY2VudCksXG4gICAgdGV4dFN0eWxlOiB7IGZvbnRGYW1pbHk6IGJyYW5kLnR5cG9ncmFwaHkuc2FucyB9LFxuICB9O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlY2hhcnRzIGV4cGFuc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG50eXBlIE5hbWVkU2xpY2UgPSB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IG51bWJlciB9O1xudHlwZSBTY2F0dGVyUG9pbnQgPSBbbnVtYmVyLCBudW1iZXJdO1xudHlwZSBIZWF0bWFwQ2VsbCA9IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuLyoqIEtlZXAgb25seSBge25hbWUsIHZhbHVlfWAgc2xpY2VzOyBkcm9wIG51bGxzIC8gYmFyZSBudW1iZXJzIC8gdHVwbGVzLiAqL1xuZnVuY3Rpb24gbmFtZWRTbGljZXMoZGF0YTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl1bXCJkYXRhXCJdKTogTmFtZWRTbGljZVtdIHtcbiAgcmV0dXJuIGRhdGEuZmlsdGVyKFxuICAgIChkKTogZCBpcyBOYW1lZFNsaWNlID0+IGQgIT09IG51bGwgJiYgdHlwZW9mIGQgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZCksXG4gICk7XG59XG5cbi8qKiBLZWVwIG9ubHkgZmluaXRlIG51bWJlcnMgKGNhdGVnb3J5IC8gcmFkYXIgLyB3YXRlcmZhbGwgc2VyaWVzKS4gKi9cbmZ1bmN0aW9uIG51bWVyaWNQb2ludHMoZGF0YTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl1bXCJkYXRhXCJdKTogbnVtYmVyW10ge1xuICByZXR1cm4gZGF0YS5maWx0ZXIoKGQpOiBkIGlzIG51bWJlciA9PiB0eXBlb2YgZCA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUoZCkpO1xufVxuXG4vKiogS2VlcCBvbmx5IGBbeCwgeV1gIHNjYXR0ZXIgdHVwbGVzLiAqL1xuZnVuY3Rpb24gc2NhdHRlclBvaW50cyhkYXRhOiBDaGFydFBsYW5bXCJzZXJpZXNcIl1bbnVtYmVyXVtcImRhdGFcIl0pOiBTY2F0dGVyUG9pbnRbXSB7XG4gIHJldHVybiBkYXRhLmZpbHRlcihcbiAgICAoZCk6IGQgaXMgU2NhdHRlclBvaW50ID0+IEFycmF5LmlzQXJyYXkoZCkgJiYgZC5sZW5ndGggPT09IDIsXG4gICkgYXMgU2NhdHRlclBvaW50W107XG59XG5cbi8qKiBLZWVwIG9ubHkgYFt4SW5kZXgsIHlJbmRleCwgdmFsdWVdYCBoZWF0bWFwIGNlbGxzLiAqL1xuZnVuY3Rpb24gaGVhdG1hcENlbGxzKGRhdGE6IENoYXJ0UGxhbltcInNlcmllc1wiXVtudW1iZXJdW1wiZGF0YVwiXSk6IEhlYXRtYXBDZWxsW10ge1xuICByZXR1cm4gZGF0YS5maWx0ZXIoKGQpOiBkIGlzIEhlYXRtYXBDZWxsID0+IEFycmF5LmlzQXJyYXkoZCkgJiYgZC5sZW5ndGggPT09IDMpIGFzIEhlYXRtYXBDZWxsW107XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGhlYXRtYXAncyBjZWxscyBhbmQgcm93IGxhYmVscyBmcm9tIGVpdGhlciBzaGFwZSB0aGVcbiAqIHBsYW5uZXIgbWF5IHByb2R1Y2UuXG4gKlxuICogVGhlIGRvY3VtZW50ZWQgc2hhcGUgaXMgT05FIHNlcmllcyBvZiBgW3hJbmRleCwgeUluZGV4LCB2YWx1ZV1gXG4gKiB0cmlwbGVzLCBidXQgaW5kZXggYXJpdGhtZXRpYyBpcyBleGFjdGx5IHRoZSBraW5kIG9mIGJvb2trZWVwaW5nIGFcbiAqIGZhc3QgbW9kZWwgZ2V0cyB3cm9uZywgYW5kIHRoZSBmYWlsdXJlIGlzIHNpbGVudCAoZXZlcnkgY2VsbCBpc1xuICogZHJvcHBlZCBhbmQgdGhlIGdyaWQgcmVuZGVycyBlbXB0eSkuIFNvIHRoZSByb3ctcGVyLXNlcmllcyBzaGFwZSBpdFxuICogYWxyZWFkeSBwcm9kdWNlcyByZWxpYWJseSBmb3IgYmFyIGNoYXJ0cyAtIG9uZSBzZXJpZXMgcGVyIG1hdHJpeFxuICogcm93LCBudW1iZXJzIGFsaWduZWQgdG8gYGNhdGVnb3JpZXNgIC0gaXMgYWNjZXB0ZWQgdG9vIGFuZCB0dXJuZWRcbiAqIGludG8gdHJpcGxlcyBoZXJlLlxuICpcbiAqIFJvdyBvcmRlciByZWFkcyB0b3AtdG8tYm90dG9tOiBFY2hhcnRzJyBjYXRlZ29yeSB5LWF4aXMgY291bnRzIGluZGV4XG4gKiAwIGZyb20gdGhlIEJPVFRPTSwgc28gYSByb3ctZGVyaXZlZCBtYXRyaXggcmV2ZXJzZXMgYm90aCB0aGUgYXhpc1xuICogbGFiZWxzIGFuZCB0aGUgcm93IGluZGljZXMsIHB1dHRpbmcgdGhlIGZpcnN0IHNlcmllcyBhdCB0aGUgdG9wIHRoZVxuICogd2F5IHRoZSBtb2RlbCBsaXN0ZWQgaXQuXG4gKi9cbmZ1bmN0aW9uIGhlYXRtYXBNYXRyaXgocGxhbjogQ2hhcnRQbGFuKTogeyBjZWxsczogSGVhdG1hcENlbGxbXTsgeUNhdGVnb3JpZXM6IHN0cmluZ1tdIH0ge1xuICBjb25zdCB0cmlwbGVzID0gaGVhdG1hcENlbGxzKHBsYW4uc2VyaWVzWzBdPy5kYXRhID8/IFtdKTtcbiAgaWYgKHRyaXBsZXMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB7IGNlbGxzOiB0cmlwbGVzLCB5Q2F0ZWdvcmllczogcGxhbi55Q2F0ZWdvcmllcyA/PyBbXSB9O1xuICB9XG4gIGNvbnN0IHJvd3MgPSBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7IG5hbWU6IHMubmFtZSwgdmFsdWVzOiBudW1lcmljUG9pbnRzKHMuZGF0YSkgfSkpO1xuICBjb25zdCBsYWJlbHMgPSBwbGFuLnlDYXRlZ29yaWVzID8/IHJvd3MubWFwKChyKSA9PiByLm5hbWUpO1xuICBjb25zdCBsYXN0Um93ID0gcm93cy5sZW5ndGggLSAxO1xuICByZXR1cm4ge1xuICAgIGNlbGxzOiByb3dzLmZsYXRNYXAoKHJvdywgcm93SW5kZXgpID0+XG4gICAgICByb3cudmFsdWVzLm1hcCgodmFsdWUsIGNvbHVtbkluZGV4KTogSGVhdG1hcENlbGwgPT4gW2NvbHVtbkluZGV4LCBsYXN0Um93IC0gcm93SW5kZXgsIHZhbHVlXSksXG4gICAgKSxcbiAgICB5Q2F0ZWdvcmllczogWy4uLmxhYmVsc10ucmV2ZXJzZSgpLFxuICB9O1xufVxuXG4vKiogU2VxdWVudGlhbCBsaWdodC10by1icmFuZCByYW1wIGZvciBoZWF0bWFwIGludGVuc2l0eS4gKi9cbmNvbnN0IEhFQVRNQVBfUkFNUCA9IFtcIiNFQUYxRkVcIiwgXCIjOUNCREY3XCIsIFwiIzRDODZFRVwiLCBcIiMyNDYzRUJcIiwgXCIjMTQzODdGXCJdO1xuXG4vKiogQWJvdmUgdGhpcyBtYW55IGNlbGxzLCBwcmludGVkIHZhbHVlcyBvdmVybGFwIGFuZCBhcmUgc3VwcHJlc3NlZC4gKi9cbmNvbnN0IEhFQVRNQVBfTEFCRUxfTUFYX0NFTExTID0gNjA7XG5cbi8qKiBSaXNpbmcgc3RlcCBmaWxsIChlbWVyYWxkKSBhbmQgZmFsbGluZyBzdGVwIGZpbGwgKHJvc2UpLiAqL1xuY29uc3QgV0FURVJGQUxMX0lOQ1JFQVNFX0NPTE9SID0gXCIjMkVCODhBXCI7XG5jb25zdCBXQVRFUkZBTExfREVDUkVBU0VfQ09MT1IgPSBcIiNERDJDNERcIjtcblxuLyoqIFNlcmllcyBuYW1lcyB0aGUgd2F0ZXJmYWxsIGV4cGFuc2lvbiBlbWl0cy4gKi9cbmNvbnN0IFdBVEVSRkFMTF9IRUxQRVJfTkFNRSA9IFwiUnVubmluZyB0b3RhbFwiO1xuY29uc3QgV0FURVJGQUxMX0lOQ1JFQVNFX05BTUUgPSBcIkluY3JlYXNlXCI7XG5jb25zdCBXQVRFUkZBTExfREVDUkVBU0VfTkFNRSA9IFwiRGVjcmVhc2VcIjtcblxuLyoqXG4gKiBBIG1vZGVsIGFza2VkIGZvciBhIGJyaWRnZSBvZnRlbiBidWlsZHMgdGhlIHJ1bm5pbmcgdG90YWwgaXRzZWxmIGFuZFxuICogaGFuZHMgYmFjayBhIGN1bXVsYXRpdmUtYmFzZSBzZXJpZXMgYWxvbmdzaWRlIHRoZSBkZWx0YXMgLSB3aGljaFxuICogcmVuZGVycyBhcyB0d28gcGxhaW4gYmFyIHNlcmllcywgbm90IGEgd2F0ZXJmYWxsICh0aGUgYmFzZSBiYXJzIGFyZVxuICogdGhlIHRhbGwgb25lcykuIFRoZSBiYXNlIGlzIHJlY29nbml6YWJsZSBieSBuYW1lLCBzbyBpdCBpcyBkcm9wcGVkXG4gKiBoZXJlIGFuZCB0aGUgcnVubmluZyB0b3RhbCByZWNvbXB1dGVkIGZyb20gdGhlIGRlbHRhcy5cbiAqL1xuY29uc3QgV0FURVJGQUxMX0JBU0VfTkFNRSA9IC9cXGIoYmFzZXxjdW11bGF0aXZlfHJ1bm5pbmd8aGVscGVyfHRvdGFsfHN0YXJ0KGluZyk/KVxcYi9pO1xuXG4vKipcbiAqIFBpY2sgdGhlIHNpZ25lZC1kZWx0YSBzZXJpZXMgb3V0IG9mIGEgd2F0ZXJmYWxsIHBsYW4sIGlnbm9yaW5nIGFueVxuICogY3VtdWxhdGl2ZS1iYXNlIHNlcmllcyB0aGUgcGxhbm5lciBidWlsdCBieSBoYW5kXG4gKiAoe0BsaW5rIFdBVEVSRkFMTF9CQVNFX05BTUV9KS4gRmFsbHMgYmFjayB0byB0aGUgZmlyc3Qgc2VyaWVzIHdoZW5cbiAqIGV2ZXJ5IG5hbWUgbG9va3MgbGlrZSBhIGJhc2UsIHNpbmNlIGRyb3BwaW5nIHRoZW0gYWxsIHdvdWxkIGxlYXZlXG4gKiBub3RoaW5nIHRvIHBsb3QuXG4gKi9cbmZ1bmN0aW9uIHdhdGVyZmFsbERlbHRhU2VyaWVzKFxuICBzZXJpZXM6IENoYXJ0UGxhbltcInNlcmllc1wiXSxcbik6IENoYXJ0UGxhbltcInNlcmllc1wiXVtudW1iZXJdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNlcmllcy5maW5kKChzKSA9PiAhV0FURVJGQUxMX0JBU0VfTkFNRS50ZXN0KHMubmFtZSkpID8/IHNlcmllc1swXTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgc3RhY2tlZCB0cmFuc3BhcmVudC1iYXNlICsgaW5jcmVhc2UgKyBkZWNyZWFzZSBzZXJpZXMgdGhhdFxuICogRWNoYXJ0cyB1c2VzIGZvciBhIHdhdGVyZmFsbCAoaXQgaGFzIG5vIG5hdGl2ZSB3YXRlcmZhbGwgdHlwZSkuXG4gKiBWYWx1ZXMgYXJlIHNpZ25lZCBkZWx0YXM7IHRoZSB0cmFuc3BhcmVudCBoZWxwZXIgY2FycmllcyB0aGUgcnVubmluZ1xuICogdG90YWwgc28gZWFjaCB2aXNpYmxlIGJhciBzdGFydHMgd2hlcmUgdGhlIHByZXZpb3VzIG9uZSBlbmRlZC5cbiAqXG4gKiBUaGUgaGVscGVyIGlzIGBzaWxlbnRgLCBzbyB3aXRoIGFuIGl0ZW0tdHJpZ2dlcmVkIHRvb2x0aXAgaXQgaXNcbiAqIGludmlzaWJsZSB0byBib3RoIHRoZSBleWUgYW5kIHRoZSBwb2ludGVyIC0gdGhlIGFsdGVybmF0aXZlLCBhbiBheGlzXG4gKiB0b29sdGlwIHRoYXQgaGlkZXMgdGhlIGhlbHBlciByb3csIG5lZWRzIGEgZnVuY3Rpb24gZm9ybWF0dGVyLCBhbmRcbiAqIHRoaXMgc3BlYyBoYXMgdG8gc3Vydml2ZSBKU09OIHNlcmlhbGl6YXRpb24gdG8gdGhlIGJyb3dzZXIuXG4gKi9cbmZ1bmN0aW9uIHdhdGVyZmFsbFNlcmllcyh2YWx1ZXM6IG51bWJlcltdKTogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgaGVscGVyczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgaW5jcmVhc2VzOiBBcnJheTxudW1iZXIgfCBcIi1cIj4gPSBbXTtcbiAgY29uc3QgZGVjcmVhc2VzOiBBcnJheTxudW1iZXIgfCBcIi1cIj4gPSBbXTtcbiAgbGV0IGN1bXVsYXRpdmUgPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZSA+PSAwKSB7XG4gICAgICBoZWxwZXJzLnB1c2goY3VtdWxhdGl2ZSk7XG4gICAgICBpbmNyZWFzZXMucHVzaCh2YWx1ZSk7XG4gICAgICBkZWNyZWFzZXMucHVzaChcIi1cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlbHBlcnMucHVzaChjdW11bGF0aXZlICsgdmFsdWUpO1xuICAgICAgaW5jcmVhc2VzLnB1c2goXCItXCIpO1xuICAgICAgZGVjcmVhc2VzLnB1c2goLXZhbHVlKTtcbiAgICB9XG4gICAgY3VtdWxhdGl2ZSArPSB2YWx1ZTtcbiAgfVxuICBjb25zdCB0cmFuc3BhcmVudCA9IHsgYm9yZGVyQ29sb3I6IFwidHJhbnNwYXJlbnRcIiwgY29sb3I6IFwidHJhbnNwYXJlbnRcIiB9O1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIG5hbWU6IFdBVEVSRkFMTF9IRUxQRVJfTkFNRSxcbiAgICAgIHR5cGU6IFwiYmFyXCIsXG4gICAgICBzdGFjazogXCJ0b3RhbFwiLFxuICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgaXRlbVN0eWxlOiB0cmFuc3BhcmVudCxcbiAgICAgIGVtcGhhc2lzOiB7IGl0ZW1TdHlsZTogdHJhbnNwYXJlbnQgfSxcbiAgICAgIGRhdGE6IGhlbHBlcnMsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBXQVRFUkZBTExfSU5DUkVBU0VfTkFNRSxcbiAgICAgIHR5cGU6IFwiYmFyXCIsXG4gICAgICBzdGFjazogXCJ0b3RhbFwiLFxuICAgICAgaXRlbVN0eWxlOiB7IGNvbG9yOiBXQVRFUkZBTExfSU5DUkVBU0VfQ09MT1IgfSxcbiAgICAgIGRhdGE6IGluY3JlYXNlcyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFdBVEVSRkFMTF9ERUNSRUFTRV9OQU1FLFxuICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgIHN0YWNrOiBcInRvdGFsXCIsXG4gICAgICBpdGVtU3R5bGU6IHsgY29sb3I6IFdBVEVSRkFMTF9ERUNSRUFTRV9DT0xPUiB9LFxuICAgICAgZGF0YTogZGVjcmVhc2VzLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICogRXhwYW5kIGEge0BsaW5rIENoYXJ0UGxhbn0gaW50byBhIGZ1bGwgRWNoYXJ0cyBgRUNoYXJ0c09wdGlvbmBcbiAqIEpTT04uIENlbnRyYWxpemVkIGhlcmUgc28gdGhlIHBsYW5uZXIgYWdlbnQgb25seSBmaWxscyBpbiB0aGVcbiAqIGNvbXBhY3QgcGxhbiBzaGFwZTsgdG9vbHRpcCAvIGFuaW1hdGlvbiAvIGNvbG9yIC8gZ3JpZCBkZWZhdWx0c1xuICogc3RheSBjb25zaXN0ZW50IGFjcm9zcyBjaGFydHMgYW5kIGFyZSBlYXN5IHRvIHR1bmUgd2l0aG91dFxuICogcmV0cmFpbmluZyBtb2RlbCBiZWhhdmlvdXIuXG4gKlxuICogV2hlbiBgYnJhbmRgIGlzIHNldCwgdGhlIHJlc29sdmVkIHNwZWMgaXMgdGhlbWVkIHdpdGggdGhlIGJyYW5kJ3Mgc2VyaWVzXG4gKiBjb2xvciBjeWNsZSBhbmQgYmFzZSB0ZXh0IHN0eWxlIChzZWUge0BsaW5rIGJyYW5kQ2hhcnRUaGVtZX0pOyBvdGhlcndpc2VcbiAqIEVjaGFydHMnIGRlZmF1bHRzIGFwcGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGxhblRvRWNoYXJ0c09wdGlvbihcbiAgaW5wdXQ6IENoYXJ0UGxhbklucHV0LFxuICBmYWxsYmFja1RpdGxlOiBzdHJpbmcsXG4gIGJyYW5kPzogQnJhbmRDb250ZXh0LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBwbGFuID0gY2hhcnRQbGFuU2NoZW1hLnBhcnNlKGlucHV0KTtcbiAgY29uc3QgYmFzZVRpdGxlID0gcGxhbi50aXRsZSA/PyBmYWxsYmFja1RpdGxlO1xuICBjb25zdCBncmlkID0geyBsZWZ0OiA0OCwgcmlnaHQ6IDI0LCB0b3A6IDU2LCBib3R0b206IDQ4LCBjb250YWluTGFiZWw6IHRydWUgfTtcbiAgY29uc3QgdGhlbWUgPSBicmFuZCA/IGJyYW5kQ2hhcnRUaGVtZShicmFuZCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRoZW1lZCA9IChvcHRpb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgICB0aGVtZSA/IHsgLi4udGhlbWUsIC4uLm9wdGlvbiB9IDogb3B0aW9uO1xuICBjb25zdCB0aXRsZSA9IHsgdGV4dDogYmFzZVRpdGxlLCBsZWZ0OiBcImNlbnRlclwiIH07XG4gIGNvbnN0IGxlZ2VuZCA9IHsgYm90dG9tOiAwIH07XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgLy8gVGhlIG9wdGlvbiBhcnJpdmVzIGFzIGEgSlNPTiBTVFJJTkcsIG5vdCBhIG5lc3RlZCBvYmplY3Q6IHRoaXMgcGxhbiBpc1xuICAgIC8vIHRoZSBwbGFubmVyJ3MgcHJvdmlkZXItZW5mb3JjZWQgc3RydWN0dXJlZCBvdXRwdXQsIGFuZCBhIGZyZWUtZm9ybVxuICAgIC8vIG9iamVjdCBiZWNvbWVzIGFuIHVuY29uc3RyYWluZWQgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzYCBzY2hlbWEgdGhhdFxuICAgIC8vIHN0cmljdCBPcGVuQUkgYW5kIEdlbWluaSBlbmRwb2ludHMgcmVqZWN0IC0gd2hpY2ggd291bGQgYnJlYWsgRVZFUllcbiAgICAvLyBjaGFydCwgbm90IGp1c3QgdGhpcyBvbmUgKHNhbWUgY2xhc3Mgb2YgaGF6YXJkIGFzIHRoZSBgcHJlZml4SXRlbXNgXG4gICAgLy8gbm90ZSBvbiBgY2hhcnREYXRhUG9pbnRTY2hlbWFgKS4gQSBtYWxmb3JtZWQgc3RyaW5nIGNvc3RzIG9uZSBjaGFydC5cbiAgICAvLyBOb3RoaW5nIGhlcmUgaXMgZXZhbCdkOyBhIHN0cmluZy12YWx1ZWQgRWNoYXJ0cyBmb3JtYXR0ZXIgaXMgYVxuICAgIC8vIHRlbXBsYXRlLCBub3QgY29kZS5cbiAgICBjb25zdCBvcHRpb24gPSBqc29uLnBhcnNlUmVjb3JkKHBsYW4ub3B0aW9uKTtcbiAgICBpZiAoIW9wdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjaGFydFR5cGUgXCJjdXN0b21cIiBuZWVkcyBhbiBgb3B0aW9uYCBob2xkaW5nIGEgSlNPTiBvYmplY3QnKTtcbiAgICB9XG4gICAgLy8gVGl0bGUgaXMgdGhlIG9uZSBkZWZhdWx0IHdvcnRoIGZpbGxpbmc6IGV2ZXJ5IG90aGVyIGJyYW5jaCBndWFyYW50ZWVzXG4gICAgLy8gb25lIGFuZCB0aGUgcmVuZGVyZXIgcmVzZXJ2ZXMgZ3JpZCBzcGFjZSBmb3IgaXQuIEEgdGl0bGUgdGhlIG1vZGVsIHNldFxuICAgIC8vIHdpbnMsIGFzIGRvZXMgZXZlcnkgb3RoZXIgZmllbGQgaXQgZGVjbGFyZWQuXG4gICAgcmV0dXJuIHRoZW1lZCh7IHRpdGxlLCAuLi5vcHRpb24gfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwicGllXCIgfHwgcGxhbi5jaGFydFR5cGUgPT09IFwiZnVubmVsXCIgfHwgcGxhbi5jaGFydFR5cGUgPT09IFwidHJlZW1hcFwiKSB7XG4gICAgY29uc3Qgc2xpY2VzID0gbmFtZWRTbGljZXMocGxhbi5zZXJpZXNbMF0/LmRhdGEgPz8gW10pO1xuICAgIGNvbnN0IHNlcmllc1R5cGUgPSBwbGFuLmNoYXJ0VHlwZTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcIml0ZW1cIiB9LFxuICAgICAgbGVnZW5kOiBzZXJpZXNUeXBlID09PSBcInRyZWVtYXBcIiA/IHVuZGVmaW5lZCA6IGxlZ2VuZCxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogcGxhbi5zZXJpZXNbMF0/Lm5hbWUgPz8gYmFzZVRpdGxlLFxuICAgICAgICAgIHR5cGU6IHNlcmllc1R5cGUsXG4gICAgICAgICAgLi4uKHNlcmllc1R5cGUgPT09IFwicGllXCIgPyB7IHJhZGl1czogW1wiMzUlXCIsIFwiNjUlXCJdIH0gOiB7fSksXG4gICAgICAgICAgLi4uKHNlcmllc1R5cGUgPT09IFwiZnVubmVsXCIgPyB7IHNvcnQ6IFwiZGVzY2VuZGluZ1wiIH0gOiB7fSksXG4gICAgICAgICAgZGF0YTogc2xpY2VzLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJzY2F0dGVyXCIpIHtcbiAgICAvLyBFY2hhcnRzIGNyYXNoZXMgb24gbnVsbCBzY2F0dGVyIHBvaW50cyAtIGtlZXAgb25seSB2YWxpZFxuICAgIC8vIGBbeCwgeV1gIHR1cGxlcy4gQmFyZSBudW1iZXJzIC8gb2JqZWN0cyAvIG51bGxzIGZyb20gYVxuICAgIC8vIG1pc21hdGNoZWQgcGxhbiBnZXQgZHJvcHBlZCBzaWxlbnRseS5cbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcIml0ZW1cIiB9LFxuICAgICAgbGVnZW5kLFxuICAgICAgZ3JpZCxcbiAgICAgIHhBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi54QXhpc0xhYmVsIH0sXG4gICAgICB5QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgICAgc2VyaWVzOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7XG4gICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgdHlwZTogXCJzY2F0dGVyXCIsXG4gICAgICAgIGRhdGE6IHNjYXR0ZXJQb2ludHMocy5kYXRhKSxcbiAgICAgIH0pKSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJoZWF0bWFwXCIpIHtcbiAgICBjb25zdCB7IGNlbGxzLCB5Q2F0ZWdvcmllcyB9ID0gaGVhdG1hcE1hdHJpeChwbGFuKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBjZWxscy5tYXAoKGMpID0+IGNbMl0pO1xuICAgIGNvbnN0IG1pbiA9IHZhbHVlcy5sZW5ndGggPiAwID8gTWF0aC5taW4oLi4udmFsdWVzKSA6IDA7XG4gICAgY29uc3QgbWF4ID0gdmFsdWVzLmxlbmd0aCA+IDAgPyBNYXRoLm1heCguLi52YWx1ZXMpIDogMTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyBwb3NpdGlvbjogXCJ0b3BcIiB9LFxuICAgICAgLy8gVGhlIHZpc3VhbE1hcCByYW1wIHNpdHMgYmVsb3cgdGhlIHBsb3QsIHNvIHRoZSBncmlkIGdpdmVzIHVwXG4gICAgICAvLyBtb3JlIGJvdHRvbSByb29tIHRoYW4gYW4gYXhpcy1vbmx5IGNoYXJ0IG5lZWRzLlxuICAgICAgZ3JpZDogeyAuLi5ncmlkLCBib3R0b206IDcyIH0sXG4gICAgICB4QXhpczoge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIGRhdGE6IHBsYW4uY2F0ZWdvcmllcyA/PyBbXSxcbiAgICAgICAgbmFtZTogcGxhbi54QXhpc0xhYmVsLFxuICAgICAgICBzcGxpdEFyZWE6IHsgc2hvdzogdHJ1ZSB9LFxuICAgICAgfSxcbiAgICAgIHlBeGlzOiB7XG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgZGF0YTogeUNhdGVnb3JpZXMsXG4gICAgICAgIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCxcbiAgICAgICAgc3BsaXRBcmVhOiB7IHNob3c6IHRydWUgfSxcbiAgICAgIH0sXG4gICAgICB2aXN1YWxNYXA6IHtcbiAgICAgICAgLy8gRWNoYXJ0cyBoaWRlcyBldmVyeSBjZWxsIHdoZW4gbWluID09PSBtYXggKGEgdW5pZm9ybSBtYXRyaXgpLFxuICAgICAgICAvLyBzbyBhIGRlZ2VuZXJhdGUgcmFuZ2UgaXMgd2lkZW5lZCBieSBvbmUuXG4gICAgICAgIG1pbixcbiAgICAgICAgbWF4OiBtYXggPiBtaW4gPyBtYXggOiBtaW4gKyAxLFxuICAgICAgICBjYWxjdWxhYmxlOiB0cnVlLFxuICAgICAgICBvcmllbnQ6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICBsZWZ0OiBcImNlbnRlclwiLFxuICAgICAgICBib3R0b206IDgsXG4gICAgICAgIGluUmFuZ2U6IHsgY29sb3I6IEhFQVRNQVBfUkFNUCB9LFxuICAgICAgfSxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogcGxhbi5zZXJpZXNbMF0/Lm5hbWUgPz8gYmFzZVRpdGxlLFxuICAgICAgICAgIHR5cGU6IFwiaGVhdG1hcFwiLFxuICAgICAgICAgIGRhdGE6IGNlbGxzLFxuICAgICAgICAgIC8vIFByaW50ZWQgY2VsbCB2YWx1ZXMgYXJlIHVucmVhZGFibGUgb25jZSB0aGUgZ3JpZCBpcyBkZW5zZS5cbiAgICAgICAgICBsYWJlbDogeyBzaG93OiBjZWxscy5sZW5ndGggPD0gSEVBVE1BUF9MQUJFTF9NQVhfQ0VMTFMgfSxcbiAgICAgICAgICBlbXBoYXNpczogeyBpdGVtU3R5bGU6IHsgc2hhZG93Qmx1cjogMTAsIHNoYWRvd0NvbG9yOiBcInJnYmEoMCwgMCwgMCwgMC4zKVwiIH0gfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwicmFkYXJcIikge1xuICAgIGNvbnN0IGluZGljYXRvcnMgPSAocGxhbi5jYXRlZ29yaWVzID8/IFtdKS5tYXAoKG5hbWUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwZWFrID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIC4uLnBsYW4uc2VyaWVzLm1hcCgocykgPT4ge1xuICAgICAgICAgIGNvbnN0IG51bXMgPSBudW1lcmljUG9pbnRzKHMuZGF0YSk7XG4gICAgICAgICAgcmV0dXJuIG51bXNbaW5kZXhdID8/IDA7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IG5hbWUsIG1heDogcGVhayA+IDAgPyBwZWFrIDogMSB9O1xuICAgIH0pO1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiaXRlbVwiIH0sXG4gICAgICBsZWdlbmQsXG4gICAgICByYWRhcjogeyBpbmRpY2F0b3I6IGluZGljYXRvcnMgfSxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJyYWRhclwiLFxuICAgICAgICAgIGRhdGE6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiBudW1lcmljUG9pbnRzKHMuZGF0YSksXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJ3YXRlcmZhbGxcIikge1xuICAgIGNvbnN0IHZhbHVlcyA9IG51bWVyaWNQb2ludHMod2F0ZXJmYWxsRGVsdGFTZXJpZXMocGxhbi5zZXJpZXMpPy5kYXRhID8/IFtdKTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgLy8gSXRlbS10cmlnZ2VyZWQgc28gdGhlIHRyYW5zcGFyZW50IGBzaWxlbnRgIG9mZnNldCBiYXJzIG5ldmVyXG4gICAgICAvLyBzdXJmYWNlIGluIGEgdG9vbHRpcCAoc2VlIGB3YXRlcmZhbGxTZXJpZXNgKS5cbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJpdGVtXCIgfSxcbiAgICAgIC8vIE9ubHkgdGhlIHR3byB2aXNpYmxlIHN0ZXBzIGJlbG9uZyBpbiB0aGUgbGVnZW5kLlxuICAgICAgbGVnZW5kOiB7IC4uLmxlZ2VuZCwgZGF0YTogW1dBVEVSRkFMTF9JTkNSRUFTRV9OQU1FLCBXQVRFUkZBTExfREVDUkVBU0VfTkFNRV0gfSxcbiAgICAgIGdyaWQsXG4gICAgICB4QXhpczoge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIGRhdGE6IHBsYW4uY2F0ZWdvcmllcyA/PyBbXSxcbiAgICAgICAgbmFtZTogcGxhbi54QXhpc0xhYmVsLFxuICAgICAgfSxcbiAgICAgIHlBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi55QXhpc0xhYmVsIH0sXG4gICAgICBzZXJpZXM6IHdhdGVyZmFsbFNlcmllcyh2YWx1ZXMpLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcImhvcml6b250YWxCYXJcIikge1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiYXhpc1wiLCBheGlzUG9pbnRlcjogeyB0eXBlOiBcInNoYWRvd1wiIH0gfSxcbiAgICAgIGxlZ2VuZCxcbiAgICAgIGdyaWQsXG4gICAgICB4QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCB9LFxuICAgICAgeUF4aXM6IHtcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICAgIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCxcbiAgICAgIH0sXG4gICAgICBzZXJpZXM6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHtcbiAgICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgICB0eXBlOiBcImJhclwiLFxuICAgICAgICBkYXRhOiBzLmRhdGEsXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwiY29tYm9cIikge1xuICAgIGNvbnN0IHVzZXNSaWdodEF4aXMgPSBwbGFuLnNlcmllcy5zb21lKChzKSA9PiBzLnlBeGlzSW5kZXggPT09IDEpO1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiYXhpc1wiIH0sXG4gICAgICBsZWdlbmQsXG4gICAgICBncmlkLFxuICAgICAgeEF4aXM6IHtcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICAgIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCxcbiAgICAgIH0sXG4gICAgICB5QXhpczogdXNlc1JpZ2h0QXhpc1xuICAgICAgICA/IFtcbiAgICAgICAgICAgIHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICAgICAgICAgIHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiB1bmRlZmluZWQgfSxcbiAgICAgICAgICBdXG4gICAgICAgIDogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgICAgc2VyaWVzOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+IHtcbiAgICAgICAgY29uc3QgbWFyayA9IHMudHlwZSA/PyBcImJhclwiO1xuICAgICAgICBjb25zdCBzZXJpZXNUeXBlID0gbWFyayA9PT0gXCJhcmVhXCIgPyBcImxpbmVcIiA6IG1hcms7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgICAgIHR5cGU6IHNlcmllc1R5cGUsXG4gICAgICAgICAgZGF0YTogcy5kYXRhLFxuICAgICAgICAgIHlBeGlzSW5kZXg6IHMueUF4aXNJbmRleCA/PyAwLFxuICAgICAgICAgIHNtb290aDogc2VyaWVzVHlwZSA9PT0gXCJsaW5lXCIsXG4gICAgICAgICAgLi4uKG1hcmsgPT09IFwiYXJlYVwiID8geyBhcmVhU3R5bGU6IHt9IH0gOiB7fSksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGJhciAvIGxpbmUgLyBhcmVhIHNoYXJlIHRoZSBzYW1lIGF4aXMgbGF5b3V0LlxuICBjb25zdCBpc0FyZWEgPSBwbGFuLmNoYXJ0VHlwZSA9PT0gXCJhcmVhXCI7XG4gIGNvbnN0IHNlcmllc1R5cGUgPSBwbGFuLmNoYXJ0VHlwZSA9PT0gXCJiYXJcIiA/IFwiYmFyXCIgOiBcImxpbmVcIjtcbiAgcmV0dXJuIHRoZW1lZCh7XG4gICAgdGl0bGUsXG4gICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcImF4aXNcIiB9LFxuICAgIGxlZ2VuZCxcbiAgICBncmlkLFxuICAgIHhBeGlzOiB7XG4gICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICBuYW1lOiBwbGFuLnhBeGlzTGFiZWwsXG4gICAgfSxcbiAgICB5QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgIHNlcmllczogcGxhbi5zZXJpZXMubWFwKChzKSA9PiAoe1xuICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgdHlwZTogc2VyaWVzVHlwZSxcbiAgICAgIGRhdGE6IHMuZGF0YSxcbiAgICAgIHNtb290aDogc2VyaWVzVHlwZSA9PT0gXCJsaW5lXCIsXG4gICAgICAuLi4oaXNBcmVhID8geyBhcmVhU3R5bGU6IHt9IH0gOiB7fSksXG4gICAgfSkpLFxuICB9KTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVuZGVyX2RhdGEgdG9vbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBgcmVuZGVyX2RhdGFgIE1hc3RyYSB0b29sIGJvdW5kIHRvIHRoZSBnaXZlbiBwbHVnaW5cbiAqIGNvbmZpZy4gQXV0by13aXJlZCBhcyBhIHN5c3RlbSB0b29sIG9uIGV2ZXJ5IGFnZW50IChzZWVcbiAqIGBhZ2VudHMudHNgKTsgcGVyLWFnZW50IHRvb2xzIGNhbiBzaGFkb3cgaXQgYnkgcmVnaXN0ZXJpbmcgYVxuICogc2FtZS1uYW1lZCBlbnRyeS5cbiAqXG4gKiBUaGluIHdyYXBwZXIgb3ZlciB7QGxpbmsgcHJlcGFyZUNoYXJ0fSBmb3IgY2FsbGVycyB0aGF0IGFscmVhZHlcbiAqIGhhdmUgYSBkYXRhc2V0IGluIGhhbmQuIE1pbnRzIGEgYGNoYXJ0SWRgIHN5bmNocm9ub3VzbHksIGNhY2hlc1xuICogYW4gZW1wdHkgcGxhY2Vob2xkZXIsIGFuZCBraWNrcyBvZmYgdGhlIGNoYXJ0LXBsYW5uZXIgaW4gdGhlXG4gKiBiYWNrZ3JvdW5kLiBSZXR1cm5zIHRoZSBgY2hhcnRJZGAgcGx1cyBpdHMgcmVhZHktdG8tY29weSBgbWFya2VyYDsgdGhlIGhvc3RcbiAqIFVJIHJlc29sdmVzIHRoYXQgbWFya2VyIHRocm91Z2ggdGhlIHBsdWdpbidzIGAvZW1iZWQvY2hhcnQvOmlkYCByb3V0ZS5cbiAqXG4gKiBGb3IgR2VuaWUgc3RhdGVtZW50IHJlc3VsdHMsIHByZWZlciB0aGUgR2VuaWUgYWdlbnQnc1xuICogYHByZXBhcmVfY2hhcnRgIHRvb2wsIHdoaWNoIGFjY2VwdHMgYSBgc3RhdGVtZW50X2lkYCBhbmRcbiAqIHJlc29sdmVzIHRoZSByb3dzIGxhemlseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUmVuZGVyRGF0YVRvb2woY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpIHtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiBcInJlbmRlcl9kYXRhXCIsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oW1xuICAgICAgYFxuICAgICAgICBTdWJtaXQgYSB0YWJ1bGFyIGRhdGFzZXQgZm9yIGlubGluZSByZW5kZXJpbmcgYXMgYSBjaGFydCBpblxuICAgICAgICB0aGUgdXNlcidzIHZpZXcuIFBhc3MgYSB0aXRsZSwgdGhlIHJhdyByb3dzIChhcnJheSBvZiBvYmplY3RzXG4gICAgICAgIGtleWVkIGJ5IGNvbHVtbiBuYW1lKSwgYW5kIGFuIG9wdGlvbmFsIG9uZS1saW5lIGRlc2NyaXB0aW9uXG4gICAgICAgIG9mIHRoZSBpbnNpZ2h0IHRvIGhpZ2hsaWdodC4gUmV0dXJucyBcXGBjaGFydElkXFxgIHBsdXMgdGhlXG4gICAgICAgIGNvbXBsZXRlIFxcYG1hcmtlclxcYDsgY29weSB0aGUgcmV0dXJuZWQgbWFya2VyIFZFUkJBVElNIG9udG9cbiAgICAgICAgaXRzIG93biBsaW5lIHdoZXJlIHRoZSBjaGFydCBzaG91bGQgcmVuZGVyLiBOZXZlciBjb25zdHJ1Y3QsXG4gICAgICAgIGFsdGVyLCBvciBpbnZlbnQgYSBjaGFydCBtYXJrZXIgeW91cnNlbGYuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBQbGFjZW1lbnQgY29udHJhY3Q6IGVtYmVkIHRoZSByZXR1cm5lZCBcXGBtYXJrZXJcXGAgb24gaXRzIG93blxuICAgICAgICBsaW5lIChibGFuayBsaW5lcyBhYm92ZSBhbmQgYmVsb3cpIHdoZXJldmVyIHlvdSB3YW50IHRoZSBjaGFydFxuICAgICAgICB0byBhcHBlYXIgaW4geW91ciByZXBseS4gVGhlIGNoYXJ0IHJlc29sdmVzXG4gICAgICAgIGFzeW5jaHJvbm91c2x5IC0gdGhlIHRvb2wgcmV0dXJucyB0aGUgaWQgaW1tZWRpYXRlbHkgYW5kIHRoZVxuICAgICAgICBob3N0IFVJIGZldGNoZXMgdGhlIGNoYXJ0IGZyb20gdGhlIGNhY2hlIG9uY2UgdGhlIHBsYW5uZXJcbiAgICAgICAgbGFuZHMuIFlvdSBjYW4gY2FsbCBcXGByZW5kZXJfZGF0YVxcYCBtdWx0aXBsZSB0aW1lcyBpbiB0aGVcbiAgICAgICAgc2FtZSB0dXJuICh0aGUgdG9vbCBpcyBwYXJhbGxlbC1zYWZlKSBhbmQgaW50ZXJsZWF2ZSB0aGVcbiAgICAgICAgbWFya2VycyB3aXRoIHByb3NlIHNvIGVhY2ggY2hhcnQgc2l0cyBuZXh0IHRvIGl0c1xuICAgICAgICBjb21tZW50YXJ5LlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgVXNlIHdoZW5ldmVyIGEgU1FMIHJvdyBzZXQsIEFQSSByZXNwb25zZSwgb3IgaGFuZC1idWlsdFxuICAgICAgICBkYXRhc2V0IHdvdWxkIGxhbmQgYmV0dGVyIGFzIGEgcGljdHVyZSB0aGFuIGFzIGEgbGlzdCBvclxuICAgICAgICB0YWJsZS4gQ2FwIGlucHV0IGF0IGEgZmV3IGh1bmRyZWQgcm93czsgc2FtcGxlIG9yIGFnZ3JlZ2F0ZVxuICAgICAgICBsYXJnZXIgZGF0YXNldHMgZmlyc3QuXG4gICAgICBgLFxuICAgIF0pLFxuICAgIGlucHV0U2NoZW1hOiBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hLFxuICAgIG91dHB1dFNjaGVtYTogY2hhcnRUb29sT3V0cHV0U2NoZW1hLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCB7IHRpdGxlLCBkZXNjcmlwdGlvbiwgZGF0YSB9ID0gaW5wdXQgYXMgQ2hhcnRQbGFubmVyUmVxdWVzdDtcbiAgICAgIGNvbnN0IGN0eCA9IGN0eFJhdyBhcyB7IHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQgfSB8IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBwcmVwYXJlQ2hhcnQoe1xuICAgICAgICBjb25maWcsXG4gICAgICAgIHVzZXJLZXk6IHJlc29sdmVVc2VyS2V5KGN0eD8ucmVxdWVzdENvbnRleHQpLFxuICAgICAgICB0aXRsZSxcbiAgICAgICAgLi4uKGRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgICByZXNvbHZlRGF0YTogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHsgcm93czogZGF0YSB9KSxcbiAgICAgICAgLi4uKGN0eD8ucmVxdWVzdENvbnRleHQgPyB7IHJlcXVlc3RDb250ZXh0OiBjdHgucmVxdWVzdENvbnRleHQgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufVxuIl19
|
|
1028
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFDTCxHQUFHLEVBRUgsS0FBSyxFQUNMLE9BQU8sRUFDUCxFQUFFLEVBQ0YsV0FBVyxFQUNYLFFBQVEsRUFDUixhQUFhLEdBQ2QsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBR0wsWUFBWSxFQUNaLGVBQWUsRUFDZixXQUFXLEdBQ1osTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE9BQU8sRUFBRSxjQUFjLEVBQTJCLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUUxQyw2RUFBNkU7QUFFN0U7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRXBDLHNEQUFzRDtBQUN0RCxNQUFNLHFCQUFxQixHQUFHLGNBQWMsQ0FBQztBQUU3QyxtRUFBbUU7QUFDbkUsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUM7QUFFeEMsdURBQXVEO0FBQ3ZELE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUFDO0FBRXRDLG9FQUFvRTtB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QUFPLEVBQUUsY0FBYyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUM7Z0JBQzVDLEtBQUs7Z0JBQ0wsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDbEQsR0FBRyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3ZFLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGFydCBwbGFubmVyICsgY2hhcnQgY2FjaGUuXG4gKlxuICogU2VsZi1jb250YWluZWQgY2hhcnQgc3Vic3lzdGVtIHdpdGggdHdvIGxheWVyczpcbiAqXG4gKiAgIDEuIElubmVyIHBsYW5uZXIgYWdlbnQgKHByaXZhdGUpLiBQdXJlIGRhdGFzZXQtaW4gL1xuICogICAgICBgRUNoYXJ0c09wdGlvbmAtb3V0IGJyYWluLiBEcml2ZW4gYnkge0BsaW5rIHByZXBhcmVDaGFydH07XG4gKiAgICAgIGNhbGxlcnMgbmV2ZXIgaW5zdGFudGlhdGUgaXQgZGlyZWN0bHkuXG4gKiAgIDIuIHtAbGluayBwcmVwYXJlQ2hhcnR9OiBvcmNoZXN0cmF0aW9uIG9uIHRvcCBvZiB0aGUgcGxhbm5lci5cbiAqICAgICAgTWludHMgYSBgY2hhcnRJZGAsIGNhY2hlcyBhbiBlbXB0eSBgeyBjaGFydElkIH1gIHJlY29yZFxuICogICAgICBzeW5jaHJvbm91c2x5LCB0aGVuIHJlc29sdmVzIHRoZSBkYXRhc2V0IGFuZCBydW5zIHRoZVxuICogICAgICBwbGFubmVyIGluIHRoZSBiYWNrZ3JvdW5kLiBUaGUgdGVybWluYWwgZW50cnkgc2V0dGxlcyB3aXRoXG4gKiAgICAgIGVpdGhlciBgcmVzdWx0YCAoc3VjY2Vzcykgb3IgYGVycm9yYCAoZmFpbHVyZSkuIEJvdGhcbiAqICAgICAgdW5kZWZpbmVkIG1lYW5zIHRoZSBlbnRyeSBpcyBzdGlsbCBwcm9jZXNzaW5nLlxuICpcbiAqIFRoZSBjYWNoZSBzdXJmYWNlICh7QGxpbmsgZmV0Y2hDaGFydH0pIGlzIHRoZSBvbmx5IHN0YXRlIHRoZVxuICogSFRUUCByb3V0ZSBhbmQgdGhlIGNoYXJ0LXByb2R1Y2luZyB0b29scyBzaGFyZS4gYHByZXBhcmVDaGFydGBcbiAqIGlzIGRhdGFzZXQtYWdub3N0aWMgLSBjYWxsZXJzIHN1cHBseSBhIGByZXNvbHZlRGF0YWAgY2FsbGJhY2tcbiAqIHRoYXQgZmV0Y2hlcyB0aGUgcm93cyBob3dldmVyIHRoZXkgbGlrZSAoR2VuaWUgc3RhdGVtZW50LCBpbmxpbmVcbiAqIGRhdGFzZXQsIGN1c3RvbSBBUEkpLiBUaGUgbW9kdWxlIGhhcyBubyBrbm93bGVkZ2Ugb2YgR2VuaWUgb3JcbiAqIHN0YXRlbWVudCBpZHM7IHRob3NlIGNvbmNlcm5zIGxpdmUgaW4gdGhlIHRvb2xzIHRoYXQgd3JhcCBpdC5cbiAqXG4gKiBXaXJlLWZvcm1hdCBzY2hlbWFzIGxpdmUgaW4gYEBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYWAgc29cbiAqIHRoZSBkZW1vIGNsaWVudCBhbmQgYW55IG90aGVyIFVJIGNvbnN1bWVyIHNoYXJlIHRoZSBleGFjdCBzYW1lXG4gKiBzaGFwZSB0aGlzIG1vZHVsZSByZWFkcyBhbmQgd3JpdGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBBcHBLaXRFcnJvciwgQ2FjaGVNYW5hZ2VyLCBFeGVjdXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGxvZyxcbiAgdHlwZSBCcmFuZENvbnRleHQsXG4gIHNsZWVwLFxuICB0b0Vycm9yLFxuICBpZCxcbiAgcGFyc2VSZWNvcmQsXG4gIHRvTnVtYmVyLFxuICB0b0Rlc2NyaXB0aW9uLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBDaGFydCxcbiAgdHlwZSBDaGFydFJlc3VsdCxcbiAgZm9ybWF0TWFya2VyLFxuICBDaGFydFR5cGVTY2hlbWEsXG4gIENoYXJ0U2NoZW1hLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgeyBNb2RlbENsYXNzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHJlc29sdmVVc2VyS2V5LCB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgYnVpbGRNb2RlbCB9IGZyb20gXCIuL21vZGVsLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvY2hhcnRcIik7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVFRMIGZvciBjYWNoZWQgY2hhcnQgZW50cmllcy4gT25lIGhvdXIgYmFsYW5jZXMgXCJsb25nIGVub3VnaCBmb3JcbiAqIHRoZSBob3N0IFVJIHRvIGZldGNoIHRoZSBjaGFydCB3ZWxsIGFmdGVyIHRoZSBtb2RlbCBmaW5pc2hlZFxuICogdGFsa2luZ1wiIGFnYWluc3QgXCJzaG9ydCBlbm91Z2ggdGhhdCBhYmFuZG9uZWQgY2hhcnQgaWRzIGRvbid0XG4gKiBwaW4gc3RvcmFnZVwiLiBNYXRjaGVzIHRoZSB0eXBpY2FsIERhdGFicmlja3MgT0JPIHRva2VuIGxpZmV0aW1lXG4gKiBzbyBhbnkgZGF0YSByZS1yZXNvbHV0aW9uIHN0YXlzIGluc2lkZSB0aGUgb3JpZ2luYWwgYXV0aCB3aW5kb3cuXG4gKi9cbmNvbnN0IENIQVJUX0NBQ0hFX1RUTF9TRUMgPSA2MCAqIDYwO1xuXG4vKiogQ2FjaGUgbmFtZXNwYWNlOyBrZWVwcyB0aGUgY2hhcnQga2V5c3BhY2UgdGlkeS4gKi9cbmNvbnN0IENIQVJUX0NBQ0hFX05BTUVTUEFDRSA9IFwibWFzdHJhOmNoYXJ0XCI7XG5cbi8qKiBEZWZhdWx0IHNlcnZlci1zaWRlIGxvbmctcG9sbCBidWRnZXQgZm9yIHtAbGluayBmZXRjaENoYXJ0fS4gKi9cbmNvbnN0IERFRkFVTFRfRkVUQ0hfVElNRU9VVF9NUyA9IDYwXzAwMDtcblxuLyoqIERlZmF1bHQgaW50ZXItcG9sbCBzbGVlcCBmb3Ige0BsaW5rIGZldGNoQ2hhcnR9LiAqL1xuY29uc3QgREVGQVVMVF9GRVRDSF9JTlRFUlZBTF9NUyA9IDI1MDtcblxuLyoqIFN0YWJsZSB0ZXh0IHN0b3JlZCBvbiBhIGNoYXJ0IGVudHJ5IHdob3NlIHBsYW5uZXIgcnVuIGZhaWxlZC4gKi9cbmNvbnN0IENIQVJUX0ZBSUxFRF9NRVNTQUdFID0gXCJDaGFydCBnZW5lcmF0aW9uIGZhaWxlZFwiO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNjaGVtYXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE9uZSBzZXJpZXMgZGF0YSBwb2ludC4gV2lkZSB2YXJpYW50IHNldCBzbyB0aGUgcGxhbm5lciBhZ2VudCBjYW5cbiAqIGZhaXRoZnVsbHkgcGFzcyB0aHJvdWdoIHdoYXRldmVyIHRoZSBTUUwgcm93IHNldCBjb250YWluZWRcbiAqIChudW1iZXJzLCBzdHJpbmdpZmllZCBudW1iZXJzLCBudWxscyBmb3IgbWlzc2luZyBtZWFzdXJlbWVudHMsXG4gKiBgW3gsIHldYCB0dXBsZXMgZm9yIHNjYXR0ZXIsIGBbeCwgeSwgdmFsdWVdYCB0cmlwbGVzIGZvciBoZWF0bWFwLFxuICogYHtuYW1lLCB2YWx1ZX1gIHNsaWNlcyBmb3IgcGllIC8gZnVubmVsIC8gdHJlZW1hcCkgd2l0aG91dCB0aGVcbiAqIHN0cnVjdHVyZWQtb3V0cHV0IGd1YXJkIHJlamVjdGluZyB0aGUgd2hvbGUgcGxhbi5cbiAqXG4gKiBUaHJlZSBsYXllcnMgb2YgdG9sZXJhbmNlOlxuICpcbiAqICAgMS4ge0BsaW5rIHoucHJlcHJvY2Vzc30gbm9ybWFsaXplcyB3aXJlIHNoYXBlcyBCRUZPUkUgdW5pb25cbiAqICAgICAgZGlzcGF0Y2g6IHN0cmluZ2lmaWVkIG51bWJlcnMgcGFyc2UgdG8gbnVtYmVycywgZmluaXRlXG4gKiAgICAgIGNoZWNrcyByZWplY3QgYE5hTmAgLyBgSW5maW5pdHlgLCAyLS8zLWVsZW1lbnQgYXJyYXlzIGNvZXJjZVxuICogICAgICB0dXBsZSBjb21wb25lbnRzLCBhbmQgYHt2YWx1ZX1gIG9iamVjdHMgd2l0aCBtaXNzaW5nIC9cbiAqICAgICAgc3RyaW5naWZpZWQgYHZhbHVlYCBnZXQgY29lcmNlZCBvciByZWplY3RlZCB1bmlmb3JtbHkuXG4gKiAgICAgIEFueXRoaW5nIG5vdCBoYW5kbGVhYmxlIGJlY29tZXMgYG51bGxgLlxuICogICAyLiBUaGUgdW5pb24gYWNjZXB0cyBgbnVsbGAgYXMgYSBmaXJzdC1jbGFzcyB2YXJpYW50LiBFY2hhcnRzXG4gKiAgICAgIHJlbmRlcnMgbnVsbCBhcyBhIGdhcCBvbiBiYXIgLyBsaW5lIC8gYXJlYSAod2hpY2ggaXMgdGhlXG4gKiAgICAgIHJpZ2h0IHZpc3VhbCBzaWduYWwgZm9yIFwibWlzc2luZyByZWFkaW5nXCIpLiBTY2F0dGVyLCBoZWF0bWFwLFxuICogICAgICBhbmQgc2xpY2UgY2hhcnRzIGZpbHRlciBudWxscyBpbiB7QGxpbmsgcGxhblRvRWNoYXJ0c09wdGlvbn1cbiAqICAgICAgYmVjYXVzZSBFY2hhcnRzIGNyYXNoZXMgb24gbnVsbCB0dXBsZXMgLyBzbGljZXMuXG4gKiAgIDMuIHtAbGluayB6LnVuaW9uI2NhdGNofSBiYWNrc3RvcHMgdGhlIHdob2xlIHRoaW5nOiBpZlxuICogICAgICBwcmVwcm9jZXNzIHNvbWVob3cgcHJvZHVjZXMgYSBzaGFwZSB0aGF0IHN0aWxsIGRvZXNuJ3RcbiAqICAgICAgbWF0Y2ggYW55IHZhcmlhbnQsIHRoZSBiYWQgaXRlbSBiZWNvbWVzIGBudWxsYCBpbnN0ZWFkIG9mXG4gKiAgICAgIHRha2luZyBkb3duIHRoZSBlbnRpcmUgY2hhcnQgd2l0aCBhXG4gKiAgICAgIGBTdHJ1Y3R1cmVkIG91dHB1dCB2YWxpZGF0aW9uIGZhaWxlZGAgZXJyb3IuXG4gKi9cbmNvbnN0IGNoYXJ0RGF0YVBvaW50U2NoZW1hID0gelxuICAucHJlcHJvY2VzcyhcbiAgICAodikgPT4ge1xuICAgICAgaWYgKHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2KSA/IHYgOiBudWxsO1xuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiB0b051bWJlcih2KSA/PyBudWxsO1xuICAgICAgfVxuICAgICAgLy8gU2NhdHRlciBgW3gsIHldYCBvciBoZWF0bWFwIGBbeEluZGV4LCB5SW5kZXgsIHZhbHVlXWAuIENvZXJjZVxuICAgICAgLy8gc3RyaW5naWZpZWQgY29tcG9uZW50czsgcmVqZWN0IGlmIGFueSBjb21wb25lbnQgaXMgbm9uLWZpbml0ZS5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHYpICYmICh2Lmxlbmd0aCA9PT0gMiB8fCB2Lmxlbmd0aCA9PT0gMykpIHtcbiAgICAgICAgY29uc3QgbnVtcyA9IHYubWFwKChjKSA9PiB0b051bWJlcihjKSk7XG4gICAgICAgIHJldHVybiBudW1zLmV2ZXJ5KChuKSA9PiBuICE9PSB1bmRlZmluZWQpID8gbnVtcyA6IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPT0gbnVsbCAmJiBcInZhbHVlXCIgaW4gdikge1xuICAgICAgICBjb25zdCBvYmogPSB2IGFzIHsgbmFtZT86IHVua25vd247IHZhbHVlOiB1bmtub3duIH07XG4gICAgICAgIGNvbnN0IHZhbCA9IHRvTnVtYmVyKG9iai52YWx1ZSk7XG4gICAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIENvZXJjZSBudW1lcmljIC8gYm9vbGVhbiAvIG51bGxpc2ggbmFtZXMgdG8gc3RyaW5ncyBzbyBhXG4gICAgICAgIC8vIHBpZSBzbGljZSBrZXllZCBvbiBhIHllYXIgKGAyMDI0YCkgb3IgY2F0ZWdvcnkgaWQgaXNcbiAgICAgICAgLy8gYWNjZXB0ZWQgd2l0aG91dCByb3VuZC10cmlwcGluZyB0aHJvdWdoIHRoZSBjYXRjaCBhcm0uXG4gICAgICAgIGNvbnN0IHJhd05hbWUgPSBvYmoubmFtZTtcbiAgICAgICAgY29uc3QgbmFtZSA9IHR5cGVvZiByYXdOYW1lID09PSBcInN0cmluZ1wiID8gcmF3TmFtZSA6IHJhd05hbWUgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcocmF3TmFtZSk7XG4gICAgICAgIHJldHVybiB7IG5hbWUsIHZhbHVlOiB2YWwgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgei51bmlvbihbXG4gICAgICB6Lm51bWJlcigpLFxuICAgICAgei5udWxsKCksXG4gICAgICAvLyBgW3gsIHldYCBzY2F0dGVyIG9yIGBbeCwgeSwgdmFsdWVdYCBoZWF0bWFwIGNlbGwuIE1vZGVsbGVkIGFzIGFcbiAgICAgIC8vIGxlbmd0aC1jb25zdHJhaW5lZCBob21vZ2VuZW91cyBhcnJheSByYXRoZXIgdGhhbiBgei50dXBsZWA6XG4gICAgICAvLyBab2QgZW1pdHMgYSB0dXBsZSBhcyBKU09OIFNjaGVtYSAyMDIwLTEyIGBwcmVmaXhJdGVtc2AsIGFuZFxuICAgICAgLy8gRGF0YWJyaWNrcycgR2VtaW5pIGVuZHBvaW50cyByZWplY3QgYSBgcmVzcG9uc2VfanNvbl9zY2hlbWFgXG4gICAgICAvLyBjb250YWluaW5nIGl0IChcIm11c3QgYmUgYSBib29sZWFuIG9yIGFuIG9iamVjdFwiLCBzaW5jZVxuICAgICAgLy8gYGl0ZW1zYCBpcyBhYnNlbnQpLiBgbWluSXRlbXNgIC8gYG1heEl0ZW1zYCArIGBpdGVtc2AgaXMgd2hhdFxuICAgICAgLy8gZXZlcnkgcHJvdmlkZXIgdW5kZXJzdGFuZHMuXG4gICAgICB6LmFycmF5KHoubnVtYmVyKCkpLm1pbigyKS5tYXgoMyksXG4gICAgICB6Lm9iamVjdCh7IG5hbWU6IHouc3RyaW5nKCksIHZhbHVlOiB6Lm51bWJlcigpIH0pLFxuICAgIF0pLFxuICApXG4gIC5jYXRjaChudWxsKTtcblxuLyoqIFBlci1zZXJpZXMgbWFyayB0eXBlIHVzZWQgYnkgYGNvbWJvYCBjaGFydHMgKGJhciArIGxpbmUgb3ZlcmxheSkuICovXG5jb25zdCBzZXJpZXNNYXJrVHlwZVNjaGVtYSA9IHpcbiAgLnVuaW9uKFt6LmxpdGVyYWwoXCJiYXJcIiksIHoubGl0ZXJhbChcImxpbmVcIiksIHoubGl0ZXJhbChcImFyZWFcIildKVxuICAuZGVzY3JpYmUoXG4gICAgXCJNYXJrIHR5cGUgZm9yIHRoaXMgc2VyaWVzLiBSZXF1aXJlZCBmb3IgYGNvbWJvYCAobWl4IGJhciBhbmQgbGluZS9hcmVhKTsgdXNlIG51bGwgZm9yIG90aGVyIGNoYXJ0IHR5cGVzLlwiLFxuICApO1xuXG4vKipcbiAqIENvbXBhY3QsIG1vZGVsLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIGFuIEVjaGFydHMgc3BlYy4gVGhlXG4gKiBwbGFubmVyIGFnZW50IGVtaXRzIHRoaXM7IHtAbGluayBwbGFuVG9FY2hhcnRzT3B0aW9ufSBleHBhbmRzIGl0XG4gKiBpbnRvIGEgcmVhbCBgRUNoYXJ0c09wdGlvbmAgSlNPTi4gVHdvIGxheWVycyBiZWNhdXNlIGxldHRpbmcgdGhlXG4gKiBtb2RlbCBmaWxsIGluIGEgZnVsbHktdHlwZWQgYEVDaGFydHNPcHRpb25gIGlzIGJyaXR0bGUgKGh1bmRyZWRzXG4gKiBvZiBvcHRpb25hbCBmaWVsZHMsIGRlZXAgdW5pb25zLCB2ZXJzaW9uLWRlcGVuZGVudCBzaGFwZXMpLiBBXG4gKiBzbWFsbCBcImNoYXJ0IHBsYW5cIiBzY2hlbWEgaXMgbXVjaCBtb3JlIHJlbGlhYmxlIGZvciBhIGZhc3QgbW9kZWxcbiAqIGFuZCBrZWVwcyBhbmltYXRpb24gLyB0b29sdGlwIC8gc3R5bGluZyBkZWZhdWx0cyBjb25zaXN0ZW50XG4gKiBhY3Jvc3MgY2hhcnRzLlxuICovXG5leHBvcnQgY29uc3QgY2hhcnRQbGFuU2NoZW1hID0gei5vYmplY3Qoe1xuICBjaGFydFR5cGU6IENoYXJ0VHlwZVNjaGVtYSxcbiAgdGl0bGU6IHpcbiAgICAuc3RyaW5nKClcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgdG9EZXNjcmlwdGlvbihgXG4gICAgICAgIFNob3J0IHRpdGxlIHNob3duIGFib3ZlIHRoZSBjaGFydC4gVXNlIG51bGwgdG8gZmFsbCBiYWNrIHRvIHRoZVxuICAgICAgICBcXGB0aXRsZVxcYCBhcmd1bWVudCB0aGUgY2FsbGVyIHBhc3NlZCBpbi5cbiAgICAgIGApLFxuICAgICksXG4gIHhBeGlzTGFiZWw6IHpcbiAgICAuc3RyaW5nKClcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgdG9EZXNjcmlwdGlvbihgXG4gICAgICAgIEF4aXMgbGFiZWwgZm9yIHRoZSBwcmltYXJ5ICh1c3VhbGx5IGJvdHRvbSAvIHZhbHVlKSBheGlzLlxuICAgICAgICBVc2VkIGZvciBiYXIgLyBob3Jpem9udGFsQmFyIC8gbGluZSAvIGFyZWEgLyBjb21ibyAvIHdhdGVyZmFsbFxuICAgICAgICAvIHNjYXR0ZXIgLyBoZWF0bWFwOyB1c2UgbnVsbCBmb3IgcGllIC8gZnVubmVsIC8gdHJlZW1hcCAvIHJhZGFyLlxuICAgICAgYCksXG4gICAgKSxcbiAgeUF4aXNMYWJlbDogelxuICAgIC5zdHJpbmcoKVxuICAgIC5udWxsYWJsZSgpXG4gICAgLmRlZmF1bHQobnVsbClcbiAgICAuZGVzY3JpYmUoXG4gICAgICB0b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgQXhpcyBsYWJlbCBmb3IgdGhlIHNlY29uZGFyeSAodXN1YWxseSBsZWZ0KSBheGlzLiBVc2VkIGZvclxuICAgICAgICBiYXIgLyBob3Jpem9udGFsQmFyIC8gbGluZSAvIGFyZWEgLyBjb21ibyAvIHdhdGVyZmFsbCAvXG4gICAgICAgIHNjYXR0ZXIgLyBoZWF0bWFwOyB1c2UgbnVsbCBmb3IgcGllIC8gZnVubmVsIC8gdHJlZW1hcCAvIHJhZGFyLlxuICAgICAgYCksXG4gICAgKSxcbiAgY2F0ZWdvcmllczogelxuICAgIC5hcnJheSh6LnN0cmluZygpKVxuICAgIC5udWxsYWJsZSgpXG4gICAgLmRlZmF1bHQobnVsbClcbiAgICAuZGVzY3JpYmUoXG4gICAgICB0b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgUHJpbWFyeSBjYXRlZ29yeSBsYWJlbHMuIEZvciBcXGBiYXJcXGAgLyBcXGBob3Jpem9udGFsQmFyXFxgIC9cbiAgICAgICAgXFxgbGluZVxcYCAvIFxcYGFyZWFcXGAgLyBcXGBjb21ib1xcYCAvIFxcYHdhdGVyZmFsbFxcYDogb25lIGxhYmVsIHBlclxuICAgICAgICBkYXRhIHBvaW50LiBGb3IgXFxgaGVhdG1hcFxcYDogeC1heGlzIGNhdGVnb3JpZXMuIEZvciBcXGByYWRhclxcYDpcbiAgICAgICAgaW5kaWNhdG9yIG5hbWVzLiBVc2UgbnVsbCBmb3IgXFxgc2NhdHRlclxcYCAoXFxgW3gsIHldXFxgIHR1cGxlcykgYW5kXG4gICAgICAgIHNsaWNlIGNoYXJ0cyAoXFxgcGllXFxgIC8gXFxgZnVubmVsXFxgIC8gXFxgdHJlZW1hcFxcYCwgZWFjaCBzbGljZVxuICAgICAgICBjYXJyaWVzIGl0cyBvd24gXFxgbmFtZVxcYCkuXG4gICAgICBgKSxcbiAgICApLFxuICB5Q2F0ZWdvcmllczogelxuICAgIC5hcnJheSh6LnN0cmluZygpKVxuICAgIC5udWxsYWJsZSgpXG4gICAgLmRlZmF1bHQobnVsbClcbiAgICAuZGVzY3JpYmUoXG4gICAgICB0b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgWS1heGlzIChyb3cpIGxhYmVscyBmb3IgXFxgaGVhdG1hcFxcYC4gVXNlIG51bGwgd2hlbiB0aGVcbiAgICAgICAgcm93IGxhYmVscyBjb21lIGZyb20gdGhlIHNlcmllcyBuYW1lcywgd2hpY2ggaXMgdGhlIHByZWZlcnJlZFxuICAgICAgICB3YXkgdG8gYnVpbGQgYSBoZWF0bWFwLiBVc2UgbnVsbCBmb3IgZXZlcnkgb3RoZXIgY2hhcnQgdHlwZS5cbiAgICAgIGApLFxuICAgICksXG4gIHNlcmllczogelxuICAgIC5hcnJheShcbiAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgbmFtZTogei5zdHJpbmcoKS5kZXNjcmliZShcbiAgICAgICAgICB0b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgICAgIExlZ2VuZCBuYW1lIGZvciB0aGlzIHNlcmllcy5cbiAgICAgICAgICBgKSxcbiAgICAgICAgKSxcbiAgICAgICAgdHlwZTogc2VyaWVzTWFya1R5cGVTY2hlbWEubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICAgICAgICB5QXhpc0luZGV4OiB6XG4gICAgICAgICAgLnVuaW9uKFt6LmxpdGVyYWwoMCksIHoubGl0ZXJhbCgxKV0pXG4gICAgICAgICAgLm51bGxhYmxlKClcbiAgICAgICAgICAuZGVmYXVsdChudWxsKVxuICAgICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAgIFwiV2hpY2ggeS1heGlzIHRvIGJpbmQgKDAgPSBsZWZ0LCAxID0gcmlnaHQpLiBVc2Ugb24gYGNvbWJvYCB3aGVuIHNlcmllcyBoYXZlIGRpZmZlcmVudCB1bml0cyBvciBzY2FsZXM7IHVzZSBudWxsIG90aGVyd2lzZS5cIixcbiAgICAgICAgICApLFxuICAgICAgICBkYXRhOiB6LmFycmF5KGNoYXJ0RGF0YVBvaW50U2NoZW1hKS5kZXNjcmliZShcbiAgICAgICAgICB0b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgICAgIERhdGEgcG9pbnRzLiBGb3IgY2F0ZWdvcnkgY2hhcnRzIChcXGBiYXJcXGAgLyBcXGBob3Jpem9udGFsQmFyXFxgXG4gICAgICAgICAgICAvIFxcYGxpbmVcXGAgLyBcXGBhcmVhXFxgIC8gXFxgY29tYm9cXGAgLyBcXGB3YXRlcmZhbGxcXGAgLyBcXGByYWRhclxcYCksXG4gICAgICAgICAgICBhbiBhcnJheSBvZiBudW1iZXJzIGFsaWduZWQgdG8gXFxgY2F0ZWdvcmllc1xcYDsgZm9yXG4gICAgICAgICAgICBcXGB3YXRlcmZhbGxcXGAgdGhvc2UgbnVtYmVycyBhcmUgc2lnbmVkIGRlbHRhcyAob25lIHNlcmllc1xuICAgICAgICAgICAgb25seSAtIG5ldmVyIGEgY3VtdWxhdGl2ZSBiYXNlIHNlcmllcykuIEZvciBcXGBoZWF0bWFwXFxgLFxuICAgICAgICAgICAgb25lIHNlcmllcyBwZXIgbWF0cml4IHJvdywgaG9sZGluZyB0aGF0IHJvdydzIG51bWJlcnNcbiAgICAgICAgICAgIGFsaWduZWQgdG8gXFxgY2F0ZWdvcmllc1xcYC4gRm9yIFxcYHNjYXR0ZXJcXGAsIGFuIGFycmF5IG9mXG4gICAgICAgICAgICBcXGBbeCwgeV1cXGAgbnVtZXJpYyB0dXBsZXMuIEZvciBcXGBwaWVcXGAgLyBcXGBmdW5uZWxcXGAgL1xuICAgICAgICAgICAgXFxgdHJlZW1hcFxcYCwgYW4gYXJyYXkgb2YgXFxge25hbWUsIHZhbHVlfVxcYCBvYmplY3RzLlxuICAgICAgICAgIGApLFxuICAgICAgICApLFxuICAgICAgfSksXG4gICAgKVxuICAgIC5kZWZhdWx0KFtdKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHRvRGVzY3JpcHRpb24oYFxuICAgICAgICBPbmUgb3IgbW9yZSBzZXJpZXMgdG8gcGxvdC4gUmVxdWlyZWQgZm9yIGV2ZXJ5IGNoYXJ0IHR5cGVcbiAgICAgICAgZXhjZXB0IFxcYGN1c3RvbVxcYCwgd2hpY2ggY2FycmllcyBpdHMgc2VyaWVzIGluc2lkZSBcXGBvcHRpb25cXGAuXG4gICAgICAgIFNsaWNlIGNoYXJ0cyAoXFxgcGllXFxgIC8gXFxgZnVubmVsXFxgIC8gXFxgdHJlZW1hcFxcYCkgYW5kXG4gICAgICAgIFxcYHdhdGVyZmFsbFxcYCAvIFxcYGhlYXRtYXBcXGAgdXNlIGV4YWN0bHkgb25lIHNlcmllczsgXFxgYmFyXFxgIC9cbiAgICAgICAgXFxgbGluZVxcYCAvIFxcYGFyZWFcXGAgLyBcXGBjb21ib1xcYCAvIFxcYHJhZGFyXFxgIC8gXFxgc2NhdHRlclxcYCBjYW5cbiAgICAgICAgY2FycnkgbXVsdGlwbGUgc2VyaWVzLlxuICAgICAgYCksXG4gICAgKSxcbiAgb3B0aW9uOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm51bGxhYmxlKClcbiAgICAuZGVmYXVsdChudWxsKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHRvRGVzY3JpcHRpb24oYFxuICAgICAgICBSZXF1aXJlZCBmb3IgXFxgY3VzdG9tXFxgOyB1c2UgbnVsbCBmb3IgZXZlcnkgb3RoZXIgY2hhcnQgdHlwZS4gQVxuICAgICAgICBDT01QTEVURSBFY2hhcnRzIG9wdGlvbiwgYXMgYSBKU09OIG9iamVjdCBlbmNvZGVkIGluIGEgc3RyaW5nOlxuICAgICAgICBcXGBzZXJpZXNcXGAgKGVhY2ggd2l0aCBpdHMgb3duIFxcYHR5cGVcXGAgYW5kIHRoYXQgc2VyaWVzJyBvd24gZGF0YVxuICAgICAgICBzaGFwZSkgcGx1cyB3aGF0ZXZlciBlbHNlIHRoZSBjaGFydCBuZWVkcyAtIGEgY29vcmRpbmF0ZSBzeXN0ZW0sXG4gICAgICAgIFxcYHZpc3VhbE1hcFxcYCwgYXhlcy4gUGxhaW4gSlNPTiB2YWx1ZXMgb25seSwgbmV2ZXIgYSBKYXZhU2NyaXB0XG4gICAgICAgIGZ1bmN0aW9uLiBBIGNlbnRlcmVkIHRpdGxlIGlzIGZpbGxlZCBpbiB3aGVuIHRoZSBvYmplY3Qgb21pdHNcbiAgICAgICAgb25lLlxuICAgICAgYCksXG4gICAgKSxcbn0pO1xuXG50eXBlIENoYXJ0UGxhbiA9IHouaW5mZXI8dHlwZW9mIGNoYXJ0UGxhblNjaGVtYT47XG50eXBlIENoYXJ0UGxhbklucHV0ID0gei5pbnB1dDx0eXBlb2YgY2hhcnRQbGFuU2NoZW1hPjtcblxuLyoqXG4gKiBDYW5vbmljYWwgcGxhbm5lciBpbnB1dCBzaGFwZS4gVG9vbHMgdGhhdCBzb3VyY2Ugcm93cyBmcm9tIGFuXG4gKiBpbmxpbmUgZGF0YXNldCAoYHJlbmRlcl9kYXRhYCkgdXNlIGl0IGFzIHRoZWlyIGBpbnB1dFNjaGVtYWBcbiAqIHZlcmJhdGltOyB0b29scyB0aGF0IHJlc29sdmUgcm93cyBmcm9tIGEgcmVtb3RlIChgcHJlcGFyZV9jaGFydGBcbiAqIG92ZXIgYSBHZW5pZSBzdGF0ZW1lbnQpIGBvbWl0KHsgZGF0YSB9KWAgYW5kIGBleHRlbmRgIHdpdGggdGhlaXJcbiAqIG93biBpZGVudGlmaWVyIGZpZWxkLCBzbyB0aGUgZmllbGQtbGV2ZWwgYC5kZXNjcmliZSgpYCB0ZXh0XG4gKiBzdGF5cyBhIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGguIFNlcnZlci1vbmx5IC0gdGhlIFVJIG5ldmVyXG4gKiBzZWVzIGEgcGxhbm5lciByZXF1ZXN0LCBvbmx5IHRoZSByZXNvbHZlZCB7QGxpbmsgQ2hhcnR9LlxuICovXG5leHBvcnQgY29uc3QgY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdGl0bGU6IHouc3RyaW5nKCkuZGVzY3JpYmUoXG4gICAgdG9EZXNjcmlwdGlvbihgXG4gICAgICAgIENvbmNpc2UgdGl0bGUgc2hvd24gYWJvdmUgdGhlIGNoYXJ0IChlLmcuIFwiVG9wIDEwIFNLVXMgYnkgUmV2ZW51ZVwiKS5cbiAgICAgIGApLFxuICApLFxuICBkZXNjcmlwdGlvbjogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgdG9EZXNjcmlwdGlvbihgXG4gICAgICAgIE9uZS1saW5lIGludGVudCB0aGUgY2hhcnQtcGxhbm5lciB1c2VzIHdoZW4gcGlja2luZyBhIGNoYXJ0IHR5cGVcbiAgICAgICAgYW5kIGF4aXMgZW5jb2RpbmdzIChlLmcuIFwiY29tcGFyZSBxdWFydGVybHkgcmV2ZW51ZSBhY3Jvc3NcbiAgICAgICAgcmVnaW9uc1wiLCBcImhpZ2hsaWdodCB0aGUgc3RlZXAgZHJvcCBhZnRlciBwb3NpdGlvbiA1XCIpLiBOb3Qgc2hvd25cbiAgICAgICAgdG8gdGhlIHVzZXIuXG4gICAgICBgKSxcbiAgICApLFxuICBkYXRhOiB6XG4gICAgLmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKSlcbiAgICAubm9uZW1wdHkoXCJEYXRhIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgcm93XCIpXG4gICAgLnJlYWRvbmx5KClcbiAgICAuZGVzY3JpYmUoXG4gICAgICB0b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgVGFidWxhciBkYXRhc2V0IHRvIGNoYXJ0LiBPbmUgb2JqZWN0IHBlciByb3csIGtleWVkIGJ5IGNvbHVtblxuICAgICAgICBuYW1lLiBWYWx1ZXMgbWF5IGJlIHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zLCBvciBudWxsLiBUaGVcbiAgICAgICAgY2hhcnQtcGxhbm5lciBkZWNpZGVzIHdoaWNoIGNvbHVtbnMgYXJlIGNhdGVnb3JpZXMgdnMuIG51bWVyaWNcbiAgICAgICAgc2VyaWVzLiBDYXAgYXQgYSBmZXcgaHVuZHJlZCByb3dzIGZvciBsZWdpYmlsaXR5OyBzYW1wbGUgL1xuICAgICAgICBhZ2dyZWdhdGUgbGFyZ2VyIGRhdGFzZXRzIGZpcnN0LlxuICAgICAgYCksXG4gICAgKSxcbn0pO1xuXG4vKiogVmFsaWRhdGVkIHRpdGxlLCBkZXNjcmlwdGlvbiwgYW5kIHRhYnVsYXIgcm93cyBwYXNzZWQgdG8gdGhlIGNoYXJ0LXBsYW5uaW5nIG1vZGVsLiAqL1xuZXhwb3J0IHR5cGUgQ2hhcnRQbGFubmVyUmVxdWVzdCA9IHouaW5mZXI8dHlwZW9mIGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWE+O1xuXG4vKipcbiAqIEFnZW50LWZhY2luZyByZXN1bHQgb2YgZWl0aGVyIGNoYXJ0LXByb2R1Y2luZyB0b29sLlxuICpcbiAqIGBtYXJrZXJgIGlzIGRlbGliZXJhdGVseSByZWR1bmRhbnQgd2l0aCBgY2hhcnRJZGA6IHRoZSBob3N0IHN0aWxsIGtleXMgdGhlXG4gKiBjYWNoZSBieSBpZCwgd2hpbGUgdGhlIG1vZGVsIGdldHMgdGhlIGV4YWN0IG9wYXF1ZSB0b2tlbiB0byBjb3B5IGludG8gcHJvc2VcbiAqIGFuZCBoYXMgbm8gcmVhc29uIHRvIGludmVudCBvciByZXR5cGUgYSBVVUlELlxuICovXG5leHBvcnQgY29uc3QgY2hhcnRUb29sT3V0cHV0U2NoZW1hID0gQ2hhcnRTY2hlbWEucGljayh7IGNoYXJ0SWQ6IHRydWUgfSkuZXh0ZW5kKHtcbiAgbWFya2VyOiB6XG4gICAgLnN0cmluZygpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgXCJFeGFjdCBlbWJlZCBtYXJrZXIuIENvcHkgdGhpcyBjb21wbGV0ZSB2YWx1ZSB2ZXJiYXRpbSBvbnRvIGl0cyBvd24gbGluZTsgbmV2ZXIgY29uc3RydWN0IGEgbWFya2VyIGZyb20gY2hhcnRJZC5cIixcbiAgICApLFxufSk7XG5cbi8qKiBSZXN1bHQgcmV0dXJuZWQgc3luY2hyb25vdXNseSB3aGlsZSBjaGFydCBwbGFubmluZyBjb250aW51ZXMgaW4gdGhlIGJhY2tncm91bmQuICovXG5leHBvcnQgdHlwZSBDaGFydFRvb2xPdXRwdXQgPSB6LmluZmVyPHR5cGVvZiBjaGFydFRvb2xPdXRwdXRTY2hlbWE+O1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGxhbm5lciBpbnN0cnVjdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRm9ybWF0IHtAbGluayB3aXJlLkNoYXJ0VHlwZVNjaGVtYX0ncyB2YXJpYW50cyBhcyBhIHNpbmdsZVxuICogaHVtYW4tZnJpZW5kbHkgc3RyaW5nIG9mIGBgIGA8dmFsdWU+YCBmb3IgPGRlc2NyaXB0aW9uPiBgYFxuICogY2xhdXNlcyBqb2luZWQgYnkgc2VtaWNvbG9ucywgZHJhd24gZnJvbSBlYWNoIHZhcmlhbnQncyBvd25cbiAqIGAuZGVzY3JpYmUoKWAgc28gdGhlIHBsYW5uZXIgcHJvbXB0IHN0YXlzIGluIGxvY2stc3RlcCB3aXRoXG4gKiB0aGUgc2NoZW1hIGJ5IGNvbnN0cnVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0Q2hhcnRUeXBlUGlja2VyKCk6IHN0cmluZyB7XG4gIHJldHVybiBDaGFydFR5cGVTY2hlbWEub3B0aW9uc1xuICAgIC5tYXAoKG9wdCkgPT4gYFxcYCR7b3B0LnZhbHVlfVxcYCBmb3IgJHtvcHQuZGVzY3JpcHRpb24gPz8gXCJcIn1gKVxuICAgIC5qb2luKFwiOyBcIik7XG59XG5cbi8qKlxuICogU3lzdGVtIHByb21wdCBmb3IgdGhlIGlubmVyIGNoYXJ0LXBsYW5uaW5nIGFnZW50LiBUdW5lZCBmb3IgYVxuICogZmFzdC10aWVyIG1vZGVsIChIYWlrdSwgR1BULTUtbWluaSwgR2VtaW5pIEZsYXNoIExpdGUpLlxuICovXG5jb25zdCBDSEFSVF9QTEFOTkVSX0lOU1RSVUNUSU9OUyA9IHRvRGVzY3JpcHRpb24oYFxuICBZb3UgZGVzaWduIEFwYWNoZSBFY2hhcnRzIHZpc3VhbGl6YXRpb25zLiBUaGUgdXNlciBnaXZlcyB5b3UgYVxuICB0YWJ1bGFyIGRhdGFzZXQgKHJvd3Mgb2Ygb2JqZWN0cykgcGx1cyBhIHRpdGxlIGFuZCBhbiBvcHRpb25hbFxuICBkZXNjcmlwdGlvbiBvZiB0aGUgaW50ZW50LiBZb3UgcHJvZHVjZSBhIHNtYWxsIGNoYXJ0IHBsYW4gKGNoYXJ0XG4gIHR5cGUsIGF4aXMgbGFiZWxzLCBjYXRlZ29yaWVzLCBzZXJpZXMpIHRoYXQgYmVzdCBjb252ZXlzIHRoZSBkYXRhLlxuXG4gIERlY2lzaW9uIGd1aWRlLiBQaWNrIHRoZSBjaGFydCB0eXBlIHdob3NlIGRhdGEgc2hhcGUgbWF0Y2hlcyB0aGVcbiAgZGF0YXNldCBhbmQgdGhlIHVzZXIncyBpbnRlbnQ6ICR7Zm9ybWF0Q2hhcnRUeXBlUGlja2VyKCl9LlxuXG4gIFdoZW4gaW4gZG91YnQgYmV0d2VlbiBiYXIgYW5kIGxpbmUsIHByZWZlciBiYXIgZm9yIHVub3JkZXJlZFxuICBjYXRlZ29yaWVzIGFuZCBsaW5lIGZvciBvcmRlcmVkIG9uZXMgKGRhdGVzLCB0aW1lIGJ1Y2tldHMsIHJhbmtzKS5cbiAgUHJlZmVyIFxcYGhvcml6b250YWxCYXJcXGAgd2hlbiBjYXRlZ29yeSBsYWJlbHMgYXJlIGxvbmcuIFByZWZlclxuICBcXGBjb21ib1xcYCB3aGVuIG9uZSBtZWFzdXJlIGlzIGEgY291bnQvdm9sdW1lIGFuZCBhbm90aGVyIGlzIGFcbiAgcmF0ZS90cmVuZC4gUHJlZmVyIFxcYHdhdGVyZmFsbFxcYCBmb3IgYnJpZGdlcyBvZiBzaWduZWQgZGVsdGFzLlxuICBQcmVmZXIgXFxgc2NhdHRlclxcYCB3aGVuIGNvcnJlbGF0aW5nIHR3byBudW1lcmljIGZpZWxkcyAobm9cbiAgY2F0ZWdvcnkgYXhpcykuIFByZWZlciBcXGBoZWF0bWFwXFxgIGZvciBhIGNhdGVnb3J5IHggY2F0ZWdvcnlcbiAgbWF0cml4LiBQcmVmZXIgXFxgcmFkYXJcXGAgZm9yIHNjb3JpbmcgdGhlIHNhbWUgZW50aXRpZXMgYWNyb3NzIGFcbiAgZml4ZWQgc2V0IG9mIGRpbWVuc2lvbnMuIE5ldmVyIHBpY2sgcGllIGZvciBtb3JlIHRoYW4gNyBzbGljZXNcbiAgKHVzZSBcXGB0cmVlbWFwXFxgIGluc3RlYWQpLiBQcmVmZXIgXFxgZnVubmVsXFxgIGZvciBvcmRlcmVkIGNvbnZlcnNpb25cbiAgc3RhZ2VzLlxuXG4gIEZvciBiYXIgLyBob3Jpem9udGFsQmFyIC8gbGluZSAvIGFyZWEgLyBjb21ibyAvIHdhdGVyZmFsbDogcGljayBvbmVcbiAgY29sdW1uIGFzIHRoZSBjYXRlZ29yeSBheGlzICh1c3VhbGx5IHRoZSBvbmx5IHN0cmluZy12YWx1ZWQgY29sdW1uKVxuICBhbmQgb25lIG9yIG1vcmUgbnVtZXJpYyBjb2x1bW5zIGFzIHNlcmllcy4gU29ydCBjYXRlZ29yaWVzIGJ5IHRoZVxuICBwcmltYXJ5IHNlcmllcyB2YWx1ZSBkZXNjZW5kaW5nIHVubGVzcyB0aGUgZGF0YSBpcyBuYXR1cmFsbHkgb3JkZXJlZFxuICAoZGF0ZXMsIHJhbmtzLCBmdW5uZWwgc3RhZ2VzLCB3YXRlcmZhbGwgc3RlcHMpLiBGb3IgXFxgY29tYm9cXGAsIHNldFxuICBlYWNoIHNlcmllcycgXFxgdHlwZVxcYCB0byBcXGBiYXJcXGAsIFxcYGxpbmVcXGAsIG9yIFxcYGFyZWFcXGAsIGFuZCB1c2VcbiAgXFxgeUF4aXNJbmRleDogMVxcYCB3aGVuIGEgc2VyaWVzIG5lZWRzIGEgc2Vjb25kIHNjYWxlLlxuXG4gIEZvciB3YXRlcmZhbGwsIGVtaXQgZXhhY3RseSBPTkUgc2VyaWVzIGhvbGRpbmcgdGhlIHNpZ25lZCBzdGVwIHZhbHVlc1xuICAoZGVsdGFzKSwgb25lIHBlciBjYXRlZ29yeSwgaW4gb3JkZXIgLSBwb3NpdGl2ZSBmb3IgYSByaXNlLCBuZWdhdGl2ZVxuICBmb3IgYSBkcm9wLiBEbyBOT1QgYWRkIGEgY3VtdWxhdGl2ZSAvIHJ1bm5pbmctdG90YWwgLyBiYXNlIHNlcmllcyBhbmRcbiAgZG8gTk9UIGNvbnZlcnQgdGhlIGRlbHRhcyBpbnRvIHJ1bm5pbmcgdG90YWxzIHlvdXJzZWxmOyB0aGUgcnVubmluZ1xuICB0b3RhbCBpcyBjb21wdXRlZCBmb3IgeW91LCBhbmQgYSBoYW5kLWJ1aWx0IGJhc2Ugc2VyaWVzIHJlbmRlcnMgYXMgYVxuICBwbGFpbiBiYXIgY2hhcnQgaW5zdGVhZCBvZiBhIGJyaWRnZS5cblxuICBGb3IgcGllIC8gZnVubmVsIC8gdHJlZW1hcDogcGljayB0aGUgY2F0ZWdvcnkgY29sdW1uIGZvciBzbGljZSBuYW1lc1xuICBhbmQgb25lIG51bWVyaWMgY29sdW1uIGZvciBzbGljZSB2YWx1ZXMuIEVtaXQgYSBzaW5nbGUgc2VyaWVzIG9mXG4gIFxcYHtuYW1lLCB2YWx1ZX1cXGAgb2JqZWN0cy5cblxuICBGb3Igc2NhdHRlcjogcGljayB0d28gbnVtZXJpYyBjb2x1bW5zIGFuZCBlbWl0IFxcYFt4LCB5XVxcYCB0dXBsZXMgaW5cbiAgb25lIG9yIG1vcmUgc2VyaWVzIChvbmUgc2VyaWVzIHBlciBncm91cCBpZiBhIGdyb3VwaW5nIGNvbHVtbiBleGlzdHMpLlxuXG4gIEZvciBoZWF0bWFwOiBwaWNrIHR3byBjYXRlZ29yeSBjb2x1bW5zIGFuZCBvbmUgbnVtZXJpYyBtZWFzdXJlLiBQdXRcbiAgdGhlIHgtYXhpcyBjYXRlZ29yaWVzIGluIFxcYGNhdGVnb3JpZXNcXGAsIHRoZW4gZW1pdCBPTkUgU0VSSUVTIFBFUiBST1dcbiAgb2YgdGhlIG1hdHJpeCAtIHRoZSBzZXJpZXMgXFxgbmFtZVxcYCBpcyB0aGUgcm93IGxhYmVsIGFuZCBcXGBkYXRhXFxgIGlzXG4gIHRoZSByb3cncyBudW1iZXJzLCBvbmUgcGVyIGVudHJ5IGluIFxcYGNhdGVnb3JpZXNcXGAsIGluIHRoZSBzYW1lIG9yZGVyLlxuICBEbyBub3QgY29tcHV0ZSBjZWxsIGluZGljZXMuXG5cbiAgRm9yIHJhZGFyOiBcXGBjYXRlZ29yaWVzXFxgIGFyZSB0aGUgaW5kaWNhdG9yIG5hbWVzOyBlYWNoIHNlcmllcyBpcyBhblxuICBhcnJheSBvZiBudW1iZXJzIChvbmUgdmFsdWUgcGVyIGluZGljYXRvcikuXG5cbiAgRm9yIGFueXRoaW5nIHRoZSB0eXBlcyBhYm92ZSBjYW5ub3QgZXhwcmVzcyAtIGEgc2Fua2V5LCBib3hwbG90LFxuICBjYW5kbGVzdGljaywgc3VuYnVyc3QsIGdhdWdlLCBuZXR3b3JrIGdyYXBoLCBjYWxlbmRhciwgcGFyYWxsZWwtXG4gIGNvb3JkaW5hdGVzIHBsb3QsIG9yIGFueSBvdGhlciBFY2hhcnRzIHNlcmllcyAtIHVzZSBcXGBjdXN0b21cXGAgYW5kXG4gIGhhbmQtd3JpdGUgdGhlIHdob2xlIEVjaGFydHMgb3B0aW9uIGludG8gXFxgb3B0aW9uXFxgIGFzIGEgSlNPTiBzdHJpbmcuXG4gIEluY2x1ZGUgZXZlcnkgcGFydCB0aGF0IGNoYXJ0IG5lZWRzOiB0aGUgc2VyaWVzIHdpdGggdGhlaXIgb3duXG4gIFxcYHR5cGVcXGAgYW5kIGRhdGEgc2hhcGUsIHBsdXMgYW55IGNvb3JkaW5hdGUgc3lzdGVtLCBcXGB2aXN1YWxNYXBcXGAsXG4gIG9yIGF4ZXMuIExlYXZlIFxcYHNlcmllc1xcYCwgXFxgY2F0ZWdvcmllc1xcYCwgYW5kIHRoZSBheGlzIGxhYmVscyBvdXQ7XG4gIHRoZXkgYXJlIGlnbm9yZWQgZm9yIFxcYGN1c3RvbVxcYC4gUHJlZmVyIGEgbGlzdGVkIHR5cGUgd2hlbmV2ZXIgb25lXG4gIGdlbnVpbmVseSBmaXRzIC0gXFxgY3VzdG9tXFxgIGdpdmVzIHVwIHRoZSBzaGFyZWQgdG9vbHRpcCwgbGVnZW5kLCBhbmRcbiAgZ3JpZCBkZWZhdWx0cywgc28gaXQgaXMgdGhlIGFuc3dlciBmb3IgYW4gdW5zdXBwb3J0ZWQgY2hhcnQgc2hhcGUsXG4gIG5vdCBhIHdheSB0byByZXN0eWxlIGEgc3VwcG9ydGVkIG9uZS5cblxuICBLZWVwIHNlcmllcyBuYW1lcyBodW1hbi1yZWFkYWJsZSAodXNlIHRoZSBjb2x1bW4gbmFtZTsgdGl0bGUgY2FzZSBpdFxuICBsaWdodGx5IGlmIG5lZWRlZCkuIEtlZXAgdGl0bGVzIGNvbmNpc2U7IGRvIG5vdCByZXBlYXQgdGhlIHVzZXInc1xuICB0aXRsZSBpbiB4QXhpc0xhYmVsIC8geUF4aXNMYWJlbC5cbmApO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwbGFubmVyIGFnZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogT25lIHBsYW5uZXIgYEFnZW50YCBwZXIgcGx1Z2luIGNvbmZpZy4gQ2FjaGVkIG9uIGNvbmZpZyBvYmplY3RcbiAqIGlkZW50aXR5IHNvIGNhbGxlcnMgY2FuIGBwcmVwYXJlQ2hhcnQoeyBjb25maWcsIC4uLiB9KWAgZnJvbSBhXG4gKiBob3QgcGF0aCB3aXRob3V0IHBheWluZyB0aGUgQWdlbnQtY29uc3RydWN0b3IgY29zdCBldmVyeSBjYWxsLlxuICogYFdlYWtNYXBgIGxldHMgcmV0aXJlZCBjb25maWdzIChlLmcuIHRlc3QgcmVjb25maWd1cmF0aW9ucylcbiAqIHJlbGVhc2UgdGhlaXIgYWdlbnQgd2l0aG91dCBtYW51YWwgZXZpY3Rpb24uXG4gKi9cbmNvbnN0IHBsYW5uZXJBZ2VudHMgPSBuZXcgV2Vha01hcDxNYXN0cmFQbHVnaW5Db25maWcsIEFnZW50PigpO1xuXG5mdW5jdGlvbiBnZXRQbGFubmVyQWdlbnQoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBBZ2VudCB7XG4gIGxldCBhZ2VudCA9IHBsYW5uZXJBZ2VudHMuZ2V0KGNvbmZpZyk7XG4gIGlmICghYWdlbnQpIHtcbiAgICBhZ2VudCA9IG5ldyBBZ2VudCh7XG4gICAgICBpZDogXCJjaGFydF9wbGFubmVyXCIsXG4gICAgICBuYW1lOiBcIkNoYXJ0IFBsYW5uZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlBpY2tzIGNoYXJ0IHR5cGUgYW5kIGF4aXMgZW5jb2RpbmdzIGZvciBhIGRhdGFzZXQuXCIsXG4gICAgICBpbnN0cnVjdGlvbnM6IENIQVJUX1BMQU5ORVJfSU5TVFJVQ1RJT05TLFxuICAgICAgbW9kZWw6ICh7IHJlcXVlc3RDb250ZXh0IH0pID0+XG4gICAgICAgIGJ1aWxkTW9kZWwoY29uZmlnLCByZXF1ZXN0Q29udGV4dCwgeyBtb2RlbENsYXNzOiBNb2RlbENsYXNzLkNoYXRGYXN0IH0pLFxuICAgIH0pO1xuICAgIHBsYW5uZXJBZ2VudHMuc2V0KGNvbmZpZywgYWdlbnQpO1xuICB9XG4gIHJldHVybiBhZ2VudDtcbn1cblxuLyoqXG4gKiBSdW4gdGhlIHBsYW5uZXIgYWdhaW5zdCBgcmVxdWVzdGAgYW5kIHJldHVybiB0aGUgcmVzb2x2ZWRcbiAqIEVjaGFydHMgc3BlYy4gVGhyb3dzIG9uIHBsYW5uZXIgZmFpbHVyZSAtIHtAbGluayBwcmVwYXJlQ2hhcnR9XG4gKiBjYXRjaGVzIGFuZCBzdGFzaGVzIHRoZSBlcnJvciBpbiB0aGUgY2FjaGUgZW50cnkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bkNoYXJ0UGxhbm5lcihcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIHJlcXVlc3Q6IENoYXJ0UGxhbm5lclJlcXVlc3QsXG4gIG9wdGlvbnM6IHsgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDsgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCB9ID0ge30sXG4pOiBQcm9taXNlPENoYXJ0UmVzdWx0PiB7XG4gIGNvbnN0IHsgdGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhIH0gPSByZXF1ZXN0O1xuICBjb25zdCB7IHJlcXVlc3RDb250ZXh0LCBhYm9ydFNpZ25hbCB9ID0gb3B0aW9ucztcbiAgY29uc3QgcHJvbXB0ID0gdG9EZXNjcmlwdGlvbih7XG4gICAgVGl0bGU6IHRpdGxlLFxuICAgIC4uLihkZXNjcmlwdGlvbiA/IHsgRGVzY3JpcHRpb246IGRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgXCJEYXRhc2V0IChKU09OLCBvbmUgcm93IHBlciBvYmplY3QpXCI6IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpLFxuICB9KTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UGxhbm5lckFnZW50KGNvbmZpZykuZ2VuZXJhdGUocHJvbXB0LCB7XG4gICAgc3RydWN0dXJlZE91dHB1dDogeyBzY2hlbWE6IGNoYXJ0UGxhblNjaGVtYSB9LFxuICAgIC4uLihyZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQgfSA6IHt9KSxcbiAgICAuLi4oYWJvcnRTaWduYWwgPyB7IGFib3J0U2lnbmFsIH0gOiB7fSksXG4gIH0pO1xuICBjb25zdCBwbGFuID0gY2hhcnRQbGFuU2NoZW1hLnBhcnNlKHJlc3VsdC5vYmplY3QpO1xuICBjb25zdCBvcHRpb24gPSBwbGFuVG9FY2hhcnRzT3B0aW9uKHBsYW4sIHRpdGxlLCBjb25maWcuYnJhbmQpO1xuICByZXR1cm4geyBjaGFydFR5cGU6IHBsYW4uY2hhcnRUeXBlLCBvcHRpb24gfTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNhY2hlIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogQnVpbGQgdGhlIGNhbm9uaWNhbCBjYWNoZSBrZXkgZm9yIGEgYGNoYXJ0SWRgIG93bmVkIGJ5IGB1c2VyS2V5YC5cbiAqXG4gKiBUaGUgaWRlbnRpdHkgaXMgcGFydCBvZiB0aGUga2V5LCBub3QgYSBmaWx0ZXIgYXBwbGllZCBhZnRlciB0aGUgcmVhZCwgc28gYVxuICogY2hhcnQgaWQgZ3Vlc3NlZCBvciBjb3BpZWQgZnJvbSBhbm90aGVyIHVzZXIncyB0cmFuc2NyaXB0IHJlc29sdmVzIHRvIGFcbiAqIGRpZmZlcmVudCBrZXkgYW5kIHNpbXBseSBtaXNzZXMuIFRoYXQgbWlzcyBpcyB3aGF0IHRoZSBIVFRQIHJvdXRlIHR1cm5zIGludG9cbiAqIGEgNDA0LCB3aGljaCBpcyBhbHNvIHRoZSBhbnN3ZXIgdGhhdCBsZWFrcyB0aGUgbGVhc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoYXJ0Q2FjaGVLZXkoY2hhcnRJZDogc3RyaW5nLCB1c2VyS2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gKGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpKS5nZW5lcmF0ZUtleShbQ0hBUlRfQ0FDSEVfTkFNRVNQQUNFLCBjaGFydElkXSwgdXNlcktleSk7XG59XG5cbi8qKlxuICogUGVyc2lzdCBhIHtAbGluayBDaGFydH0gZW50cnkgdW5kZXIgaXRzIGBjaGFydElkYCwgb3duZWQgYnkgYHVzZXJLZXlgLlxuICogUmVmcmVzaGVzIHRoZSBUVEwgb24gZXZlcnkgd3JpdGUuIENhY2hlLWxheWVyIGZhaWx1cmVzIGFyZSBsb2dnZWQgYW5kXG4gKiBzd2FsbG93ZWQgc28gYmFja2dyb3VuZCBydW5uZXJzIG5ldmVyIHRocm93IGludG8gdGhlXG4gKiB1bmhhbmRsZWQtcmVqZWN0aW9uIHN0cmVhbS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVDaGFydChlbnRyeTogQ2hhcnQsIHVzZXJLZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNoYXJ0Q2FjaGVLZXkoZW50cnkuY2hhcnRJZCwgdXNlcktleSk7XG4gICAgYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLnNldChrZXksIGVudHJ5LCB7XG4gICAgICB0dGw6IENIQVJUX0NBQ0hFX1RUTF9TRUMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwid3JpdGUtZXJyb3JcIiwge1xuICAgICAgY2hhcnRJZDogZW50cnkuY2hhcnRJZCxcbiAgICAgIGVycm9yOiB0b0Vycm9yKGVyciksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBMb29rIHVwIGEgY2hhcnQgYHVzZXJLZXlgIG93bnMuIFJldHVybnMgYHVuZGVmaW5lZGAgb24gbWlzcywgb25cbiAqIGV4cGlyeSwgd2hlbiBhbm90aGVyIGlkZW50aXR5IG93bnMgdGhlIGlkLCBvciB3aGVuIHRoZSBjYWNoZSBsYXllciBpc1xuICogdW5oZWFsdGh5IC0gbmV2ZXIgdGhyb3dzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkQ2hhcnQoY2hhcnRJZDogc3RyaW5nLCB1c2VyS2V5OiBzdHJpbmcpOiBQcm9taXNlPENoYXJ0IHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2hhcnRDYWNoZUtleShjaGFydElkLCB1c2VyS2V5KTtcbiAgICBjb25zdCB2ID0gYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLmdldDxDaGFydD4oa2V5KTtcbiAgICByZXR1cm4gdiA/PyB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwicmVhZC1lcnJvclwiLCB7XG4gICAgICBjaGFydElkLFxuICAgICAgZXJyb3I6IHRvRXJyb3IoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcmVwYXJlQ2hhcnQgb3JjaGVzdHJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogSW5wdXRzIHRvIHtAbGluayBwcmVwYXJlQ2hhcnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVwYXJlQ2hhcnRPcHRpb25zIHtcbiAgLyoqIFBsdWdpbiBjb25maWc7IHJlc29sdmVzIHRoZSBwbGFubmVyIGFnZW50J3MgbW9kZWwuICovXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xuICAvKipcbiAgICogSWRlbnRpdHkgdGhhdCBvd25zIHRoZSBtaW50ZWQgY2hhcnQuIE9ubHkgYSB7QGxpbmsgZmV0Y2hDaGFydH0gY2FsbFxuICAgKiBjYXJyeWluZyB0aGUgc2FtZSBrZXkgcmVzb2x2ZXMgaXQuIFVzZSB7QGxpbmsgcmVzb2x2ZVVzZXJLZXl9LlxuICAgKi9cbiAgdXNlcktleTogc3RyaW5nO1xuICAvKiogRGlzcGxheSB0aXRsZSBmb3J3YXJkZWQgdG8gdGhlIHBsYW5uZXIgYWdlbnQuICovXG4gIHRpdGxlPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgaW50ZW50IGhpbnQgZm9yd2FyZGVkIHRvIHRoZSBwbGFubmVyIGFnZW50LiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSByb3dzIHRvIGNoYXJ0LiBDYWxsZWQgb25jZSwgaW4gdGhlIGJhY2tncm91bmQuXG4gICAqIEFueSB0aHJvd24gZXJyb3IgbGFuZHMgaW4gdGhlIGNhY2hlIGFzIHRoZSBlbnRyeSdzIGBlcnJvcmBcbiAgICogZmllbGQgKG5ldmVyIHByb3BhZ2F0ZWQgdG8gdGhlIGNhbGxlciBvZiB7QGxpbmsgcHJlcGFyZUNoYXJ0fSkuXG4gICAqIEFuIGVtcHR5IGByb3dzYCBhcnJheSBpcyByZWplY3RlZCBhcyBgXCJkYXRhc2V0IGhhcyBubyByb3dzO1xuICAgKiBub3RoaW5nIHRvIGNoYXJ0XCJgLlxuICAgKi9cbiAgcmVzb2x2ZURhdGE6IChzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzZTx7IHJvd3M6IFJlYWRvbmx5QXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IH0+O1xuICAvKipcbiAgICogUGVyLXJlcXVlc3QgYFJlcXVlc3RDb250ZXh0YC4gRm9yd2FyZGVkIHRvIHRoZSBwbGFubmVyIGFnZW50IHNvXG4gICAqIHVzZXItc2NvcGVkIG1vZGVsIHJlc29sdXRpb24gKE9CTykgc3RheXMgaW4gZWZmZWN0LlxuICAgKi9cbiAgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDtcbiAgLyoqXG4gICAqIENvb3BlcmF0aXZlIGNhbmNlbGxhdGlvbi4gRm9yd2FyZGVkIHRvIGByZXNvbHZlRGF0YWAgYW5kIHRoZVxuICAgKiBwbGFubmVyIGFnZW50LiBOb3RlOiB0aGUgY2hhcnQgdGFzayBjb250aW51ZXMgcnVubmluZyBpbiB0aGVcbiAgICogYmFja2dyb3VuZCBhZnRlciB0aGUgcGFyZW50IHJlcXVlc3QgZW5kcywgc28gZXh0ZXJuYWwgYWJvcnRcbiAgICogc2lnbmFscyBhcmUgYmVzdC1lZmZvcnQ7IHR5cGljYWwgdXNlIGlzIHRvIGxlYXZlIHRoaXMgdW5zZXRcbiAgICogYW5kIGxldCB0aGUgMWggVFRMIGNhcCBzdGFsZSBlbnRyaWVzLlxuICAgKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogTWludCBhIGBjaGFydElkYCwgY2FjaGUgYW4gZW1wdHkgYHsgY2hhcnRJZCB9YCBwbGFjZWhvbGRlclxuICogc3luY2hyb25vdXNseSwgYW5kIGtpY2sgb2ZmIGEgYmFja2dyb3VuZCB0YXNrIHRoYXQgcmVzb2x2ZXMgdGhlXG4gKiBkYXRhc2V0IGFuZCBydW5zIHRoZSBwbGFubmVyLiBSZXR1cm5zIHRoZSBgY2hhcnRJZGAgb25jZSB0aGVcbiAqIHBsYWNlaG9sZGVyIGxhbmRzIHNvIHRoZSBmaXJzdCB7QGxpbmsgZmV0Y2hDaGFydH0gY2FsbCBhbHdheXNcbiAqIHNlZXMgYW4gZW50cnkgKG5vIHNwdXJpb3VzIDQwNCByYWNlKS5cbiAqXG4gKiBUaGUgYmFja2dyb3VuZCB0YXNrIHN3YWxsb3dzIGl0cyBvd24gZmFpbHVyZXMgYW5kIHdyaXRlcyB0aGVtXG4gKiBhcyBgZXJyb3JgIGVudHJpZXMsIHNvIGNhbGxlcnMgbmV2ZXIgc2VlIGEgcmVqZWN0ZWQgcHJvbWlzZS5cbiAqIENhY2hlIHN0YXRlIG1hY2hpbmU6XG4gKlxuICogICAtIGp1c3QgYWZ0ZXIgdGhpcyBjYWxsIHJldHVybnM6IGB7IGNoYXJ0SWQgfWAgKHByb2Nlc3NpbmcpXG4gKiAgIC0gb24gcGxhbm5lciBzdWNjZXNzOiAgICAgICAgICAgYHsgY2hhcnRJZCwgcmVzdWx0IH1gXG4gKiAgIC0gb24gZGF0YSAvIHBsYW5uZXIgZmFpbHVyZTogICAgYHsgY2hhcnRJZCwgZXJyb3IgfWBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVDaGFydChvcHRzOiBQcmVwYXJlQ2hhcnRPcHRpb25zKTogUHJvbWlzZTxDaGFydFRvb2xPdXRwdXQ+IHtcbiAgY29uc3QgY2hhcnRJZCA9IGlkKCk7XG4gIGF3YWl0IHdyaXRlQ2hhcnQoeyBjaGFydElkIH0sIG9wdHMudXNlcktleSk7XG4gIGxvZ2dlci5kZWJ1ZyhcInF1ZXVlZFwiLCB7IGNoYXJ0SWQgfSk7XG4gIC8vIEZpcmUtYW5kLWZvcmdldC4gRmFpbHVyZXMgbGFuZCBpbiB0aGUgY2FjaGUgYXMgYGVycm9yYCBlbnRyaWVzO1xuICAvLyBuZXZlciBlc2NhcGUgaW50byBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICB2b2lkIHJ1blByZXBhcmVDaGFydChjaGFydElkLCBvcHRzKTtcbiAgcmV0dXJuIHsgY2hhcnRJZCwgbWFya2VyOiBmb3JtYXRNYXJrZXIoXCJjaGFydFwiLCBjaGFydElkKSB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5QcmVwYXJlQ2hhcnQoY2hhcnRJZDogc3RyaW5nLCBvcHRzOiBQcmVwYXJlQ2hhcnRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IG9wdHMucmVzb2x2ZURhdGEob3B0cy5zaWduYWwpO1xuICAgIGlmIChkYXRhLnJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJEYXRhc2V0IGhhcyBubyByb3dzOyBub3RoaW5nIHRvIGNoYXJ0XCIpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5DaGFydFBsYW5uZXIoXG4gICAgICBvcHRzLmNvbmZpZyxcbiAgICAgIHtcbiAgICAgICAgdGl0bGU6IG9wdHMudGl0bGUgPz8gXCJDaGFydFwiLFxuICAgICAgICAuLi4ob3B0cy5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IG9wdHMuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgICAgZGF0YTogZGF0YS5yb3dzIGFzIENoYXJ0UGxhbm5lclJlcXVlc3RbXCJkYXRhXCJdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLi4uKG9wdHMucmVxdWVzdENvbnRleHQgPyB7IHJlcXVlc3RDb250ZXh0OiBvcHRzLnJlcXVlc3RDb250ZXh0IH0gOiB7fSksXG4gICAgICAgIC4uLihvcHRzLnNpZ25hbCA/IHsgYWJvcnRTaWduYWw6IG9wdHMuc2lnbmFsIH0gOiB7fSksXG4gICAgICB9LFxuICAgICk7XG4gICAgYXdhaXQgd3JpdGVDaGFydCh7IGNoYXJ0SWQsIHJlc3VsdCB9LCBvcHRzLnVzZXJLZXkpO1xuICAgIGxvZ2dlci5pbmZvKFwiZG9uZVwiLCB7XG4gICAgICBjaGFydElkLFxuICAgICAgY2hhcnRUeXBlOiByZXN1bHQuY2hhcnRUeXBlLFxuICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImVycm9yXCIsIHsgY2hhcnRJZCwgZXJyb3I6IHRvRXJyb3IoZXJyKSB9KTtcbiAgICAvLyBUaGUgZW50cnkncyBgZXJyb3JgIGlzIHJlbmRlcmVkIGluIHRoZSBjaGF0LCBzbyBvbmx5IGFuIEFwcEtpdEVycm9yJ3NcbiAgICAvLyBvd24gbWVzc2FnZSB0cmF2ZWxzOyBhbnl0aGluZyBlbHNlIGNvdWxkIGNhcnJ5IHVwc3RyZWFtIHByb3ZpZGVyIGRldGFpbC5cbiAgICBjb25zdCBlcnJUZXh0ID0gZXJyIGluc3RhbmNlb2YgQXBwS2l0RXJyb3IgPyBlcnIubWVzc2FnZSA6IENIQVJUX0ZBSUxFRF9NRVNTQUdFO1xuICAgIGF3YWl0IHdyaXRlQ2hhcnQoeyBjaGFydElkLCBlcnJvcjogZXJyVGV4dCB9LCBvcHRzLnVzZXJLZXkpO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbG9uZy1wb2xsIGZldGNoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIElucHV0cyB0byB7QGxpbmsgZmV0Y2hDaGFydH0uICovXG5leHBvcnQgaW50ZXJmYWNlIEZldGNoQ2hhcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIElkZW50aXR5IHRoZSBjaGFydCBtdXN0IGJlbG9uZyB0by4gQSBjaGFydCBtaW50ZWQgdW5kZXIgYSBkaWZmZXJlbnQga2V5XG4gICAqIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gdW5rbm93biBpZC4gVXNlIHtAbGluayByZXNvbHZlVXNlcktleX0uXG4gICAqL1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXJ2ZXItc2lkZSBwb2xsaW5nIGJ1ZGdldCBpbiBtcy4gV2hlbiB0aGUgZW50cnkgc3RheXMgaW5cbiAgICogdGhlIHByb2Nlc3Npbmcgc3RhdGUgcGFzdCB0aGlzIHdpbmRvdywgdGhlIGhlbHBlciByZXR1cm5zIHRoZVxuICAgKiBsYXN0IHNlZW4gdmFsdWUgKHN0aWxsIHByb2Nlc3NpbmcpIHNvIHRoZSBjbGllbnQgY2FuIHJlLXBvbGwuXG4gICAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0ZFVENIX1RJTUVPVVRfTVN9ICg2MHMpLlxuICAgKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogUG9sbCBpbnRlcnZhbCBpbiBtcy4gRGVmYXVsdHMgdG9cbiAgICoge0BsaW5rIERFRkFVTFRfRkVUQ0hfSU5URVJWQUxfTVN9ICgyNTBtcykuXG4gICAqL1xuICBpbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uIGhhbmRsZSAoZS5nLiByZXF1ZXN0IGByZXEuc2lnbmFsYCkuICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKipcbiAqIExvbmctcG9sbCB0aGUgY2hhcnQgY2FjaGUgdW50aWwgdGhlIGVudHJ5IHNldHRsZXMgKGByZXN1bHRgIG9yXG4gKiBgZXJyb3JgIHNldCksIHRoZSBlbnRyeSBpcyBtaXNzaW5nLCBvciB0aGUgc2VydmVyLXNpZGUgdGltZW91dFxuICogZWxhcHNlcy5cbiAqXG4gKiBSZXR1cm5zOlxuICogICAtIHRoZSByZXNvbHZlZCB7QGxpbmsgQ2hhcnR9IHdoZW4gaXQgc2V0dGxlZCwgZXJyb3JlZCwgb3JcbiAqICAgICBzdGF5ZWQgaW4gcHJvY2Vzc2luZyBwYXN0IGB0aW1lb3V0TXNgIChzbyB0aGUgY2xpZW50IGNhblxuICogICAgIHJlLXBvbGwpO1xuICogICAtIGB1bmRlZmluZWRgIHdoZW4gdGhlIGVudHJ5IGlzIG1pc3NpbmcsIGV4cGlyZWQsIG9yIG93bmVkIGJ5XG4gKiAgICAgYW5vdGhlciBpZGVudGl0eSAodGhlIGNvbnN1bWVyIHNob3VsZCB0cmVhdCBhcyA0MDQpLlxuICpcbiAqIGBzaWduYWxgIGxldHMgdGhlIGNhbGxlciBjYW5jZWwgYWhlYWQgb2YgdGltZW91dCAoZS5nLiB0aGUgSFRUUFxuICogcmVxdWVzdCBjbG9zZWQpLiBDYW5jZWxsYXRpb24gcHJvcGFnYXRlcyB0byB0aGUgaW50ZXItcG9sbCBzbGVlcFxuICogc28gdGhlIGhlbHBlciByZXR1cm5zIGltbWVkaWF0ZWx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hDaGFydChcbiAgY2hhcnRJZDogc3RyaW5nLFxuICBvcHRpb25zOiBGZXRjaENoYXJ0T3B0aW9ucyxcbik6IFByb21pc2U8Q2hhcnQgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgdGltZW91dE1zID0gb3B0aW9ucy50aW1lb3V0TXMgPz8gREVGQVVMVF9GRVRDSF9USU1FT1VUX01TO1xuICBjb25zdCBpbnRlcnZhbE1zID0gb3B0aW9ucy5pbnRlcnZhbE1zID8/IERFRkFVTFRfRkVUQ0hfSU5URVJWQUxfTVM7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRpbWVvdXRNcztcblxuICBsZXQgbGFzdDogQ2hhcnQgfCB1bmRlZmluZWQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgb3B0aW9ucy5zaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgbGFzdCA9IGF3YWl0IHJlYWRDaGFydChjaGFydElkLCBvcHRpb25zLnVzZXJLZXkpO1xuICAgIGlmICghbGFzdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAobGFzdC5yZXN1bHQgIT09IHVuZGVmaW5lZCB8fCBsYXN0LmVycm9yICE9PSB1bmRlZmluZWQpIHJldHVybiBsYXN0O1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IGRlYWRsaW5lIC0gRGF0ZS5ub3coKTtcbiAgICBpZiAocmVtYWluaW5nIDw9IDApIHJldHVybiBsYXN0O1xuICAgIGF3YWl0IHNsZWVwKE1hdGgubWluKGludGVydmFsTXMsIHJlbWFpbmluZyksIG9wdGlvbnMuc2lnbmFsKTtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlY2hhcnRzIHRoZW1lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIGFuIEVjaGFydHMgb3B0aW9uIHRoYXQgY2FycmllcyBicmFuZCBpZGVudGl0eTogdGhlIHNlcmllc1xuICogY29sb3IgY3ljbGUgYW5kIHRoZSBiYXNlIGZvbnQgc3RhY2suIERlcml2ZWQgZnJvbSBhIHtAbGluayBCcmFuZENvbnRleHR9XG4gKiBieSB7QGxpbmsgYnJhbmRDaGFydFRoZW1lfSBhbmQgbWVyZ2VkIGludG8gZXZlcnkgc3BlYyBieVxuICoge0BsaW5rIHBsYW5Ub0VjaGFydHNPcHRpb259LlxuICpcbiAqIERlbGliZXJhdGVseSBjYXJyaWVzIG5vIHRleHQgQ09MT1IuIEEgc3BlYyBpcyBwbGFubmVkIGhlcmUsIG9uIHRoZVxuICogc2VydmVyLCBhbmQgcmVhZCBsYXRlciBpbiBhIGJyb3dzZXIgd2hvc2UgbGlnaHQvZGFyayB0aGVtZSB0aGlzIGNvZGVcbiAqIGNhbm5vdCBrbm93OyBiYWtpbmcgaW4gdGhlIGJyYW5kJ3Mgc2luZ2xlIChsaWdodCkgZm9yZWdyb3VuZCBwcm9kdWNlZFxuICogbmVhci1ibGFjayBsYWJlbHMgdGhhdCBkaXNhcHBlYXJlZCBhZ2FpbnN0IGEgZGFyayBjaGF0IHN1cmZhY2UuIFRoZVxuICogcmVuZGVyZXIgcmVzb2x2ZXMgY2hyb21lIGNvbG9ycyBmcm9tIEFwcEtpdCdzIGxpdmUgQ1NTIHRva2VucyBpbnN0ZWFkXG4gKiAoYEBkYngtdG9vbHMvdWktbWFzdHJhYCdzIGBjaGFydC10aGVtZWAgKyBgbm9ybWFsaXplQ2hhcnRPcHRpb25gKSxcbiAqIGxlYXZpbmcgdGhpcyB0aGVtZSB0aGUgcGFydHMgdGhhdCByZWFkIHRoZSBzYW1lIGluIGVpdGhlciBtb2RlLlxuICovXG5pbnRlcmZhY2UgQ2hhcnRUaGVtZSB7XG4gIGNvbG9yOiBzdHJpbmdbXTtcbiAgdGV4dFN0eWxlOiB7IGZvbnRGYW1pbHk6IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIEFwcEtpdCdzIGNhdGVnb3JpY2FsIGNoYXJ0IHBhbGV0dGUgKGAtLWNoYXJ0LWNhdC0xYCAuLiBgLS1jaGFydC1jYXQtOGAgZnJvbVxuICogYEBkYXRhYnJpY2tzL2FwcGtpdC11aWApLCBhcyBoZXguIFNlcnZlci1yZW5kZXJlZCBjaGFydCBzcGVjcyBjYW5ub3QgcmVhZCB0aGVcbiAqIGJyb3dzZXIncyBDU1MgY3VzdG9tIHByb3BlcnRpZXMsIHNvIHRoZSB2YWx1ZXMgYXJlIG1pcnJvcmVkIGhlcmUgdG8ga2VlcCBhXG4gKiBnZW5lcmF0ZWQgY2hhcnQgdmlzdWFsbHkgY29uc2lzdGVudCB3aXRoIHRoZSBBcHBLaXQtc3R5bGVkIFVJIGFyb3VuZCBpdC5cbiAqIEtlZXAgaW4gc3luYyB3aXRoIEFwcEtpdCdzIHN0eWxlc2hlZXQgaWYgaXQgY2hhbmdlcy5cbiAqL1xuY29uc3QgQVBQS0lUX0NIQVJUX1BBTEVUVEUgPSBbXG4gIFwiIzI0NjNFQlwiLCAvLyBibHVlXG4gIFwiIzJFQjg4QVwiLCAvLyB0ZWFsXG4gIFwiI0FCNDdCRFwiLCAvLyBwdXJwbGVcbiAgXCIjRjY5RTIzXCIsIC8vIGFtYmVyXG4gIFwiI0REMkM0RFwiLCAvLyByb3NlXG4gIFwiIzFCQTNCQlwiLCAvLyBjeWFuXG4gIFwiIzlCNjFEMVwiLCAvLyBsYXZlbmRlclxuICBcIiMzNEIyNjJcIiwgLy8gZW1lcmFsZFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBFeHBhbmQgdHdvIGJyYW5kIGhleCBjb2xvcnMgaW50byBhIGxlZ2libGUgY2F0ZWdvcmljYWwgY3ljbGUuIEVjaGFydHNcbiAqIHJlcGVhdHMgdGhlIGBjb2xvcmAgYXJyYXkgYWNyb3NzIHNlcmllcyAvIGNhdGVnb3JpZXMsIHNvIGEgZ29vZCBkZWZhdWx0XG4gKiBuZWVkcyBzZXZlcmFsIGRpc3RpbmN0IGh1ZXMsIG5vdCB0d28uIFdlIHNlZWQgd2l0aCB0aGUgYnJhbmQgcHJpbWFyeSBhbmRcbiAqIGFjY2VudCAodGhlIGlkZW50aXR5IGNvbG9ycykgYW5kIGZvbGxvdyB3aXRoIEFwcEtpdCdzIG93biBjYXRlZ29yaWNhbCBjaGFydFxuICogcGFsZXR0ZSwgc28gbXVsdGktc2VyaWVzIC8gbWFueS1zbGljZSBjaGFydHMgc3RheSByZWFkYWJsZSBhbmQgbWF0Y2ggdGhlXG4gKiBzdXJyb3VuZGluZyBBcHBLaXQgVUkgd2hpbGUgdGhlIGZpcnN0IG9uZSBvciB0d28gbWFya3MgbGFuZCBvbi1icmFuZC5cbiAqL1xuZnVuY3Rpb24gYnJhbmRDb2xvckN5Y2xlKHByaW1hcnk6IHN0cmluZywgYWNjZW50OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNwcmVhZCA9IEFQUEtJVF9DSEFSVF9QQUxFVFRFO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHJldHVybiBbcHJpbWFyeSwgYWNjZW50LCAuLi5zcHJlYWRdLmZpbHRlcigoYykgPT4ge1xuICAgIGNvbnN0IGtleSA9IGMudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgIHNlZW4uYWRkKGtleSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlcml2ZSBhbiBFY2hhcnRzIHtAbGluayBDaGFydFRoZW1lfSBmcm9tIGEgYnJhbmQgY29udGV4dDogdGhlIHByaW1hcnkgK1xuICogYWNjZW50IGNvbG9ycyBzZWVkIHRoZSBzZXJpZXMgY3ljbGUgYW5kIHRoZSBzYW5zIHN0YWNrIGJlY29tZXMgdGhlIGJhc2VcbiAqIGZvbnQuIFRleHQgY29sb3JzIGFyZSB0aGUgcmVuZGVyZXIncyBqb2IgLSBzZWUge0BsaW5rIENoYXJ0VGhlbWV9LlxuICovXG5mdW5jdGlvbiBicmFuZENoYXJ0VGhlbWUoYnJhbmQ6IEJyYW5kQ29udGV4dCk6IENoYXJ0VGhlbWUge1xuICByZXR1cm4ge1xuICAgIGNvbG9yOiBicmFuZENvbG9yQ3ljbGUoYnJhbmQuY29sb3JzLnByaW1hcnksIGJyYW5kLmNvbG9ycy5hY2NlbnQpLFxuICAgIHRleHRTdHlsZTogeyBmb250RmFtaWx5OiBicmFuZC50eXBvZ3JhcGh5LnNhbnMgfSxcbiAgfTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZWNoYXJ0cyBleHBhbnNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxudHlwZSBOYW1lZFNsaWNlID0geyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBudW1iZXIgfTtcbnR5cGUgU2NhdHRlclBvaW50ID0gW251bWJlciwgbnVtYmVyXTtcbnR5cGUgSGVhdG1hcENlbGwgPSBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbi8qKiBLZWVwIG9ubHkgYHtuYW1lLCB2YWx1ZX1gIHNsaWNlczsgZHJvcCBudWxscyAvIGJhcmUgbnVtYmVycyAvIHR1cGxlcy4gKi9cbmZ1bmN0aW9uIG5hbWVkU2xpY2VzKGRhdGE6IENoYXJ0UGxhbltcInNlcmllc1wiXVtudW1iZXJdW1wiZGF0YVwiXSk6IE5hbWVkU2xpY2VbXSB7XG4gIHJldHVybiBkYXRhLmZpbHRlcihcbiAgICAoZCk6IGQgaXMgTmFtZWRTbGljZSA9PiBkICE9PSBudWxsICYmIHR5cGVvZiBkID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGQpLFxuICApO1xufVxuXG4vKiogS2VlcCBvbmx5IGZpbml0ZSBudW1iZXJzIChjYXRlZ29yeSAvIHJhZGFyIC8gd2F0ZXJmYWxsIHNlcmllcykuICovXG5mdW5jdGlvbiBudW1lcmljUG9pbnRzKGRhdGE6IENoYXJ0UGxhbltcInNlcmllc1wiXVtudW1iZXJdW1wiZGF0YVwiXSk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGRhdGEuZmlsdGVyKChkKTogZCBpcyBudW1iZXIgPT4gdHlwZW9mIGQgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKGQpKTtcbn1cblxuLyoqIEtlZXAgb25seSBgW3gsIHldYCBzY2F0dGVyIHR1cGxlcy4gKi9cbmZ1bmN0aW9uIHNjYXR0ZXJQb2ludHMoZGF0YTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl1bXCJkYXRhXCJdKTogU2NhdHRlclBvaW50W10ge1xuICByZXR1cm4gZGF0YS5maWx0ZXIoXG4gICAgKGQpOiBkIGlzIFNjYXR0ZXJQb2ludCA9PiBBcnJheS5pc0FycmF5KGQpICYmIGQubGVuZ3RoID09PSAyLFxuICApIGFzIFNjYXR0ZXJQb2ludFtdO1xufVxuXG4vKiogS2VlcCBvbmx5IGBbeEluZGV4LCB5SW5kZXgsIHZhbHVlXWAgaGVhdG1hcCBjZWxscy4gKi9cbmZ1bmN0aW9uIGhlYXRtYXBDZWxscyhkYXRhOiBDaGFydFBsYW5bXCJzZXJpZXNcIl1bbnVtYmVyXVtcImRhdGFcIl0pOiBIZWF0bWFwQ2VsbFtdIHtcbiAgcmV0dXJuIGRhdGEuZmlsdGVyKChkKTogZCBpcyBIZWF0bWFwQ2VsbCA9PiBBcnJheS5pc0FycmF5KGQpICYmIGQubGVuZ3RoID09PSAzKSBhcyBIZWF0bWFwQ2VsbFtdO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBoZWF0bWFwJ3MgY2VsbHMgYW5kIHJvdyBsYWJlbHMgZnJvbSBlaXRoZXIgc2hhcGUgdGhlXG4gKiBwbGFubmVyIG1heSBwcm9kdWNlLlxuICpcbiAqIFRoZSBkb2N1bWVudGVkIHNoYXBlIGlzIE9ORSBzZXJpZXMgb2YgYFt4SW5kZXgsIHlJbmRleCwgdmFsdWVdYFxuICogdHJpcGxlcywgYnV0IGluZGV4IGFyaXRobWV0aWMgaXMgZXhhY3RseSB0aGUga2luZCBvZiBib29ra2VlcGluZyBhXG4gKiBmYXN0IG1vZGVsIGdldHMgd3JvbmcsIGFuZCB0aGUgZmFpbHVyZSBpcyBzaWxlbnQgKGV2ZXJ5IGNlbGwgaXNcbiAqIGRyb3BwZWQgYW5kIHRoZSBncmlkIHJlbmRlcnMgZW1wdHkpLiBTbyB0aGUgcm93LXBlci1zZXJpZXMgc2hhcGUgaXRcbiAqIGFscmVhZHkgcHJvZHVjZXMgcmVsaWFibHkgZm9yIGJhciBjaGFydHMgLSBvbmUgc2VyaWVzIHBlciBtYXRyaXhcbiAqIHJvdywgbnVtYmVycyBhbGlnbmVkIHRvIGBjYXRlZ29yaWVzYCAtIGlzIGFjY2VwdGVkIHRvbyBhbmQgdHVybmVkXG4gKiBpbnRvIHRyaXBsZXMgaGVyZS5cbiAqXG4gKiBSb3cgb3JkZXIgcmVhZHMgdG9wLXRvLWJvdHRvbTogRWNoYXJ0cycgY2F0ZWdvcnkgeS1heGlzIGNvdW50cyBpbmRleFxuICogMCBmcm9tIHRoZSBCT1RUT00sIHNvIGEgcm93LWRlcml2ZWQgbWF0cml4IHJldmVyc2VzIGJvdGggdGhlIGF4aXNcbiAqIGxhYmVscyBhbmQgdGhlIHJvdyBpbmRpY2VzLCBwdXR0aW5nIHRoZSBmaXJzdCBzZXJpZXMgYXQgdGhlIHRvcCB0aGVcbiAqIHdheSB0aGUgbW9kZWwgbGlzdGVkIGl0LlxuICovXG5mdW5jdGlvbiBoZWF0bWFwTWF0cml4KHBsYW46IENoYXJ0UGxhbik6IHsgY2VsbHM6IEhlYXRtYXBDZWxsW107IHlDYXRlZ29yaWVzOiBzdHJpbmdbXSB9IHtcbiAgY29uc3QgdHJpcGxlcyA9IGhlYXRtYXBDZWxscyhwbGFuLnNlcmllc1swXT8uZGF0YSA/PyBbXSk7XG4gIGlmICh0cmlwbGVzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4geyBjZWxsczogdHJpcGxlcywgeUNhdGVnb3JpZXM6IHBsYW4ueUNhdGVnb3JpZXMgPz8gW10gfTtcbiAgfVxuICBjb25zdCByb3dzID0gcGxhbi5zZXJpZXMubWFwKChzKSA9PiAoeyBuYW1lOiBzLm5hbWUsIHZhbHVlczogbnVtZXJpY1BvaW50cyhzLmRhdGEpIH0pKTtcbiAgY29uc3QgbGFiZWxzID0gcGxhbi55Q2F0ZWdvcmllcyA/PyByb3dzLm1hcCgocikgPT4gci5uYW1lKTtcbiAgY29uc3QgbGFzdFJvdyA9IHJvd3MubGVuZ3RoIC0gMTtcbiAgcmV0dXJuIHtcbiAgICBjZWxsczogcm93cy5mbGF0TWFwKChyb3csIHJvd0luZGV4KSA9PlxuICAgICAgcm93LnZhbHVlcy5tYXAoKHZhbHVlLCBjb2x1bW5JbmRleCk6IEhlYXRtYXBDZWxsID0+IFtjb2x1bW5JbmRleCwgbGFzdFJvdyAtIHJvd0luZGV4LCB2YWx1ZV0pLFxuICAgICksXG4gICAgeUNhdGVnb3JpZXM6IFsuLi5sYWJlbHNdLnJldmVyc2UoKSxcbiAgfTtcbn1cblxuLyoqIFNlcXVlbnRpYWwgbGlnaHQtdG8tYnJhbmQgcmFtcCBmb3IgaGVhdG1hcCBpbnRlbnNpdHkuICovXG5jb25zdCBIRUFUTUFQX1JBTVAgPSBbXCIjRUFGMUZFXCIsIFwiIzlDQkRGN1wiLCBcIiM0Qzg2RUVcIiwgXCIjMjQ2M0VCXCIsIFwiIzE0Mzg3RlwiXTtcblxuLyoqIEFib3ZlIHRoaXMgbWFueSBjZWxscywgcHJpbnRlZCB2YWx1ZXMgb3ZlcmxhcCBhbmQgYXJlIHN1cHByZXNzZWQuICovXG5jb25zdCBIRUFUTUFQX0xBQkVMX01BWF9DRUxMUyA9IDYwO1xuXG4vKiogUmlzaW5nIHN0ZXAgZmlsbCAoZW1lcmFsZCkgYW5kIGZhbGxpbmcgc3RlcCBmaWxsIChyb3NlKS4gKi9cbmNvbnN0IFdBVEVSRkFMTF9JTkNSRUFTRV9DT0xPUiA9IFwiIzJFQjg4QVwiO1xuY29uc3QgV0FURVJGQUxMX0RFQ1JFQVNFX0NPTE9SID0gXCIjREQyQzREXCI7XG5cbi8qKiBTZXJpZXMgbmFtZXMgdGhlIHdhdGVyZmFsbCBleHBhbnNpb24gZW1pdHMuICovXG5jb25zdCBXQVRFUkZBTExfSEVMUEVSX05BTUUgPSBcIlJ1bm5pbmcgdG90YWxcIjtcbmNvbnN0IFdBVEVSRkFMTF9JTkNSRUFTRV9OQU1FID0gXCJJbmNyZWFzZVwiO1xuY29uc3QgV0FURVJGQUxMX0RFQ1JFQVNFX05BTUUgPSBcIkRlY3JlYXNlXCI7XG5cbi8qKlxuICogQSBtb2RlbCBhc2tlZCBmb3IgYSBicmlkZ2Ugb2Z0ZW4gYnVpbGRzIHRoZSBydW5uaW5nIHRvdGFsIGl0c2VsZiBhbmRcbiAqIGhhbmRzIGJhY2sgYSBjdW11bGF0aXZlLWJhc2Ugc2VyaWVzIGFsb25nc2lkZSB0aGUgZGVsdGFzIC0gd2hpY2hcbiAqIHJlbmRlcnMgYXMgdHdvIHBsYWluIGJhciBzZXJpZXMsIG5vdCBhIHdhdGVyZmFsbCAodGhlIGJhc2UgYmFycyBhcmVcbiAqIHRoZSB0YWxsIG9uZXMpLiBUaGUgYmFzZSBpcyByZWNvZ25pemFibGUgYnkgbmFtZSwgc28gaXQgaXMgZHJvcHBlZFxuICogaGVyZSBhbmQgdGhlIHJ1bm5pbmcgdG90YWwgcmVjb21wdXRlZCBmcm9tIHRoZSBkZWx0YXMuXG4gKi9cbmNvbnN0IFdBVEVSRkFMTF9CQVNFX05BTUUgPSAvXFxiKGJhc2V8Y3VtdWxhdGl2ZXxydW5uaW5nfGhlbHBlcnx0b3RhbHxzdGFydChpbmcpPylcXGIvaTtcblxuLyoqXG4gKiBQaWNrIHRoZSBzaWduZWQtZGVsdGEgc2VyaWVzIG91dCBvZiBhIHdhdGVyZmFsbCBwbGFuLCBpZ25vcmluZyBhbnlcbiAqIGN1bXVsYXRpdmUtYmFzZSBzZXJpZXMgdGhlIHBsYW5uZXIgYnVpbHQgYnkgaGFuZFxuICogKHtAbGluayBXQVRFUkZBTExfQkFTRV9OQU1FfSkuIEZhbGxzIGJhY2sgdG8gdGhlIGZpcnN0IHNlcmllcyB3aGVuXG4gKiBldmVyeSBuYW1lIGxvb2tzIGxpa2UgYSBiYXNlLCBzaW5jZSBkcm9wcGluZyB0aGVtIGFsbCB3b3VsZCBsZWF2ZVxuICogbm90aGluZyB0byBwbG90LlxuICovXG5mdW5jdGlvbiB3YXRlcmZhbGxEZWx0YVNlcmllcyhcbiAgc2VyaWVzOiBDaGFydFBsYW5bXCJzZXJpZXNcIl0sXG4pOiBDaGFydFBsYW5bXCJzZXJpZXNcIl1bbnVtYmVyXSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzZXJpZXMuZmluZCgocykgPT4gIVdBVEVSRkFMTF9CQVNFX05BTUUudGVzdChzLm5hbWUpKSA/PyBzZXJpZXNbMF07XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHN0YWNrZWQgdHJhbnNwYXJlbnQtYmFzZSArIGluY3JlYXNlICsgZGVjcmVhc2Ugc2VyaWVzIHRoYXRcbiAqIEVjaGFydHMgdXNlcyBmb3IgYSB3YXRlcmZhbGwgKGl0IGhhcyBubyBuYXRpdmUgd2F0ZXJmYWxsIHR5cGUpLlxuICogVmFsdWVzIGFyZSBzaWduZWQgZGVsdGFzOyB0aGUgdHJhbnNwYXJlbnQgaGVscGVyIGNhcnJpZXMgdGhlIHJ1bm5pbmdcbiAqIHRvdGFsIHNvIGVhY2ggdmlzaWJsZSBiYXIgc3RhcnRzIHdoZXJlIHRoZSBwcmV2aW91cyBvbmUgZW5kZWQuXG4gKlxuICogVGhlIGhlbHBlciBpcyBgc2lsZW50YCwgc28gd2l0aCBhbiBpdGVtLXRyaWdnZXJlZCB0b29sdGlwIGl0IGlzXG4gKiBpbnZpc2libGUgdG8gYm90aCB0aGUgZXllIGFuZCB0aGUgcG9pbnRlciAtIHRoZSBhbHRlcm5hdGl2ZSwgYW4gYXhpc1xuICogdG9vbHRpcCB0aGF0IGhpZGVzIHRoZSBoZWxwZXIgcm93LCBuZWVkcyBhIGZ1bmN0aW9uIGZvcm1hdHRlciwgYW5kXG4gKiB0aGlzIHNwZWMgaGFzIHRvIHN1cnZpdmUgSlNPTiBzZXJpYWxpemF0aW9uIHRvIHRoZSBicm93c2VyLlxuICovXG5mdW5jdGlvbiB3YXRlcmZhbGxTZXJpZXModmFsdWVzOiBudW1iZXJbXSk6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IGhlbHBlcnM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGluY3JlYXNlczogQXJyYXk8bnVtYmVyIHwgXCItXCI+ID0gW107XG4gIGNvbnN0IGRlY3JlYXNlczogQXJyYXk8bnVtYmVyIHwgXCItXCI+ID0gW107XG4gIGxldCBjdW11bGF0aXZlID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAodmFsdWUgPj0gMCkge1xuICAgICAgaGVscGVycy5wdXNoKGN1bXVsYXRpdmUpO1xuICAgICAgaW5jcmVhc2VzLnB1c2godmFsdWUpO1xuICAgICAgZGVjcmVhc2VzLnB1c2goXCItXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoZWxwZXJzLnB1c2goY3VtdWxhdGl2ZSArIHZhbHVlKTtcbiAgICAgIGluY3JlYXNlcy5wdXNoKFwiLVwiKTtcbiAgICAgIGRlY3JlYXNlcy5wdXNoKC12YWx1ZSk7XG4gICAgfVxuICAgIGN1bXVsYXRpdmUgKz0gdmFsdWU7XG4gIH1cbiAgY29uc3QgdHJhbnNwYXJlbnQgPSB7IGJvcmRlckNvbG9yOiBcInRyYW5zcGFyZW50XCIsIGNvbG9yOiBcInRyYW5zcGFyZW50XCIgfTtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBuYW1lOiBXQVRFUkZBTExfSEVMUEVSX05BTUUsXG4gICAgICB0eXBlOiBcImJhclwiLFxuICAgICAgc3RhY2s6IFwidG90YWxcIixcbiAgICAgIHNpbGVudDogdHJ1ZSxcbiAgICAgIGl0ZW1TdHlsZTogdHJhbnNwYXJlbnQsXG4gICAgICBlbXBoYXNpczogeyBpdGVtU3R5bGU6IHRyYW5zcGFyZW50IH0sXG4gICAgICBkYXRhOiBoZWxwZXJzLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogV0FURVJGQUxMX0lOQ1JFQVNFX05BTUUsXG4gICAgICB0eXBlOiBcImJhclwiLFxuICAgICAgc3RhY2s6IFwidG90YWxcIixcbiAgICAgIGl0ZW1TdHlsZTogeyBjb2xvcjogV0FURVJGQUxMX0lOQ1JFQVNFX0NPTE9SIH0sXG4gICAgICBkYXRhOiBpbmNyZWFzZXMsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBXQVRFUkZBTExfREVDUkVBU0VfTkFNRSxcbiAgICAgIHR5cGU6IFwiYmFyXCIsXG4gICAgICBzdGFjazogXCJ0b3RhbFwiLFxuICAgICAgaXRlbVN0eWxlOiB7IGNvbG9yOiBXQVRFUkZBTExfREVDUkVBU0VfQ09MT1IgfSxcbiAgICAgIGRhdGE6IGRlY3JlYXNlcyxcbiAgICB9LFxuICBdO1xufVxuXG4vKipcbiAqIEV4cGFuZCBhIHtAbGluayBDaGFydFBsYW59IGludG8gYSBmdWxsIEVjaGFydHMgYEVDaGFydHNPcHRpb25gXG4gKiBKU09OLiBDZW50cmFsaXplZCBoZXJlIHNvIHRoZSBwbGFubmVyIGFnZW50IG9ubHkgZmlsbHMgaW4gdGhlXG4gKiBjb21wYWN0IHBsYW4gc2hhcGU7IHRvb2x0aXAgLyBhbmltYXRpb24gLyBjb2xvciAvIGdyaWQgZGVmYXVsdHNcbiAqIHN0YXkgY29uc2lzdGVudCBhY3Jvc3MgY2hhcnRzIGFuZCBhcmUgZWFzeSB0byB0dW5lIHdpdGhvdXRcbiAqIHJldHJhaW5pbmcgbW9kZWwgYmVoYXZpb3VyLlxuICpcbiAqIFdoZW4gYGJyYW5kYCBpcyBzZXQsIHRoZSByZXNvbHZlZCBzcGVjIGlzIHRoZW1lZCB3aXRoIHRoZSBicmFuZCdzIHNlcmllc1xuICogY29sb3IgY3ljbGUgYW5kIGJhc2UgdGV4dCBzdHlsZSAoc2VlIHtAbGluayBicmFuZENoYXJ0VGhlbWV9KTsgb3RoZXJ3aXNlXG4gKiBFY2hhcnRzJyBkZWZhdWx0cyBhcHBseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsYW5Ub0VjaGFydHNPcHRpb24oXG4gIGlucHV0OiBDaGFydFBsYW5JbnB1dCxcbiAgZmFsbGJhY2tUaXRsZTogc3RyaW5nLFxuICBicmFuZD86IEJyYW5kQ29udGV4dCxcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgcGxhbiA9IGNoYXJ0UGxhblNjaGVtYS5wYXJzZShpbnB1dCk7XG4gIGNvbnN0IGJhc2VUaXRsZSA9IHBsYW4udGl0bGUgPz8gZmFsbGJhY2tUaXRsZTtcbiAgY29uc3QgZ3JpZCA9IHsgbGVmdDogNDgsIHJpZ2h0OiAyNCwgdG9wOiA1NiwgYm90dG9tOiA0OCwgY29udGFpbkxhYmVsOiB0cnVlIH07XG4gIGNvbnN0IHRoZW1lID0gYnJhbmQgPyBicmFuZENoYXJ0VGhlbWUoYnJhbmQpIDogdW5kZWZpbmVkO1xuICBjb25zdCB0aGVtZWQgPSAob3B0aW9uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gICAgdGhlbWUgPyB7IC4uLnRoZW1lLCAuLi5vcHRpb24gfSA6IG9wdGlvbjtcbiAgY29uc3QgdGl0bGUgPSB7IHRleHQ6IGJhc2VUaXRsZSwgbGVmdDogXCJjZW50ZXJcIiB9O1xuICBjb25zdCBsZWdlbmQgPSB7IGJvdHRvbTogMCB9O1xuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJjdXN0b21cIikge1xuICAgIC8vIFRoZSBvcHRpb24gYXJyaXZlcyBhcyBhIEpTT04gU1RSSU5HLCBub3QgYSBuZXN0ZWQgb2JqZWN0OiB0aGlzIHBsYW4gaXNcbiAgICAvLyB0aGUgcGxhbm5lcidzIHByb3ZpZGVyLWVuZm9yY2VkIHN0cnVjdHVyZWQgb3V0cHV0LCBhbmQgYSBmcmVlLWZvcm1cbiAgICAvLyBvYmplY3QgYmVjb21lcyBhbiB1bmNvbnN0cmFpbmVkIGBhZGRpdGlvbmFsUHJvcGVydGllc2Agc2NoZW1hIHRoYXRcbiAgICAvLyBzdHJpY3QgT3BlbkFJIGFuZCBHZW1pbmkgZW5kcG9pbnRzIHJlamVjdCAtIHdoaWNoIHdvdWxkIGJyZWFrIEVWRVJZXG4gICAgLy8gY2hhcnQsIG5vdCBqdXN0IHRoaXMgb25lIChzYW1lIGNsYXNzIG9mIGhhemFyZCBhcyB0aGUgYHByZWZpeEl0ZW1zYFxuICAgIC8vIG5vdGUgb24gYGNoYXJ0RGF0YVBvaW50U2NoZW1hYCkuIEEgbWFsZm9ybWVkIHN0cmluZyBjb3N0cyBvbmUgY2hhcnQuXG4gICAgLy8gTm90aGluZyBoZXJlIGlzIGV2YWwnZDsgYSBzdHJpbmctdmFsdWVkIEVjaGFydHMgZm9ybWF0dGVyIGlzIGFcbiAgICAvLyB0ZW1wbGF0ZSwgbm90IGNvZGUuXG4gICAgY29uc3Qgb3B0aW9uID0gcGFyc2VSZWNvcmQocGxhbi5vcHRpb24pO1xuICAgIGlmICghb3B0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NoYXJ0VHlwZSBcImN1c3RvbVwiIG5lZWRzIGFuIGBvcHRpb25gIGhvbGRpbmcgYSBKU09OIG9iamVjdCcpO1xuICAgIH1cbiAgICAvLyBUaXRsZSBpcyB0aGUgb25lIGRlZmF1bHQgd29ydGggZmlsbGluZzogZXZlcnkgb3RoZXIgYnJhbmNoIGd1YXJhbnRlZXNcbiAgICAvLyBvbmUgYW5kIHRoZSByZW5kZXJlciByZXNlcnZlcyBncmlkIHNwYWNlIGZvciBpdC4gQSB0aXRsZSB0aGUgbW9kZWwgc2V0XG4gICAgLy8gd2lucywgYXMgZG9lcyBldmVyeSBvdGhlciBmaWVsZCBpdCBkZWNsYXJlZC5cbiAgICByZXR1cm4gdGhlbWVkKHsgdGl0bGUsIC4uLm9wdGlvbiB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJwaWVcIiB8fCBwbGFuLmNoYXJ0VHlwZSA9PT0gXCJmdW5uZWxcIiB8fCBwbGFuLmNoYXJ0VHlwZSA9PT0gXCJ0cmVlbWFwXCIpIHtcbiAgICBjb25zdCBzbGljZXMgPSBuYW1lZFNsaWNlcyhwbGFuLnNlcmllc1swXT8uZGF0YSA/PyBbXSk7XG4gICAgY29uc3Qgc2VyaWVzVHlwZSA9IHBsYW4uY2hhcnRUeXBlO1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiaXRlbVwiIH0sXG4gICAgICBsZWdlbmQ6IHNlcmllc1R5cGUgPT09IFwidHJlZW1hcFwiID8gdW5kZWZpbmVkIDogbGVnZW5kLFxuICAgICAgc2VyaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBwbGFuLnNlcmllc1swXT8ubmFtZSA/PyBiYXNlVGl0bGUsXG4gICAgICAgICAgdHlwZTogc2VyaWVzVHlwZSxcbiAgICAgICAgICAuLi4oc2VyaWVzVHlwZSA9PT0gXCJwaWVcIiA/IHsgcmFkaXVzOiBbXCIzNSVcIiwgXCI2NSVcIl0gfSA6IHt9KSxcbiAgICAgICAgICAuLi4oc2VyaWVzVHlwZSA9PT0gXCJmdW5uZWxcIiA/IHsgc29ydDogXCJkZXNjZW5kaW5nXCIgfSA6IHt9KSxcbiAgICAgICAgICBkYXRhOiBzbGljZXMsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcInNjYXR0ZXJcIikge1xuICAgIC8vIEVjaGFydHMgY3Jhc2hlcyBvbiBudWxsIHNjYXR0ZXIgcG9pbnRzIC0ga2VlcCBvbmx5IHZhbGlkXG4gICAgLy8gYFt4LCB5XWAgdHVwbGVzLiBCYXJlIG51bWJlcnMgLyBvYmplY3RzIC8gbnVsbHMgZnJvbSBhXG4gICAgLy8gbWlzbWF0Y2hlZCBwbGFuIGdldCBkcm9wcGVkIHNpbGVudGx5LlxuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiaXRlbVwiIH0sXG4gICAgICBsZWdlbmQsXG4gICAgICBncmlkLFxuICAgICAgeEF4aXM6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnhBeGlzTGFiZWwgfSxcbiAgICAgIHlBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi55QXhpc0xhYmVsIH0sXG4gICAgICBzZXJpZXM6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHtcbiAgICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgICB0eXBlOiBcInNjYXR0ZXJcIixcbiAgICAgICAgZGF0YTogc2NhdHRlclBvaW50cyhzLmRhdGEpLFxuICAgICAgfSkpLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcImhlYXRtYXBcIikge1xuICAgIGNvbnN0IHsgY2VsbHMsIHlDYXRlZ29yaWVzIH0gPSBoZWF0bWFwTWF0cml4KHBsYW4pO1xuICAgIGNvbnN0IHZhbHVlcyA9IGNlbGxzLm1hcCgoYykgPT4gY1syXSk7XG4gICAgY29uc3QgbWluID0gdmFsdWVzLmxlbmd0aCA+IDAgPyBNYXRoLm1pbiguLi52YWx1ZXMpIDogMDtcbiAgICBjb25zdCBtYXggPSB2YWx1ZXMubGVuZ3RoID4gMCA/IE1hdGgubWF4KC4uLnZhbHVlcykgOiAxO1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHBvc2l0aW9uOiBcInRvcFwiIH0sXG4gICAgICAvLyBUaGUgdmlzdWFsTWFwIHJhbXAgc2l0cyBiZWxvdyB0aGUgcGxvdCwgc28gdGhlIGdyaWQgZ2l2ZXMgdXBcbiAgICAgIC8vIG1vcmUgYm90dG9tIHJvb20gdGhhbiBhbiBheGlzLW9ubHkgY2hhcnQgbmVlZHMuXG4gICAgICBncmlkOiB7IC4uLmdyaWQsIGJvdHRvbTogNzIgfSxcbiAgICAgIHhBeGlzOiB7XG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgZGF0YTogcGxhbi5jYXRlZ29yaWVzID8/IFtdLFxuICAgICAgICBuYW1lOiBwbGFuLnhBeGlzTGFiZWwsXG4gICAgICAgIHNwbGl0QXJlYTogeyBzaG93OiB0cnVlIH0sXG4gICAgICB9LFxuICAgICAgeUF4aXM6IHtcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBkYXRhOiB5Q2F0ZWdvcmllcyxcbiAgICAgICAgbmFtZTogcGxhbi55QXhpc0xhYmVsLFxuICAgICAgICBzcGxpdEFyZWE6IHsgc2hvdzogdHJ1ZSB9LFxuICAgICAgfSxcbiAgICAgIHZpc3VhbE1hcDoge1xuICAgICAgICAvLyBFY2hhcnRzIGhpZGVzIGV2ZXJ5IGNlbGwgd2hlbiBtaW4gPT09IG1heCAoYSB1bmlmb3JtIG1hdHJpeCksXG4gICAgICAgIC8vIHNvIGEgZGVnZW5lcmF0ZSByYW5nZSBpcyB3aWRlbmVkIGJ5IG9uZS5cbiAgICAgICAgbWluLFxuICAgICAgICBtYXg6IG1heCA+IG1pbiA/IG1heCA6IG1pbiArIDEsXG4gICAgICAgIGNhbGN1bGFibGU6IHRydWUsXG4gICAgICAgIG9yaWVudDogXCJob3Jpem9udGFsXCIsXG4gICAgICAgIGxlZnQ6IFwiY2VudGVyXCIsXG4gICAgICAgIGJvdHRvbTogOCxcbiAgICAgICAgaW5SYW5nZTogeyBjb2xvcjogSEVBVE1BUF9SQU1QIH0sXG4gICAgICB9LFxuICAgICAgc2VyaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBwbGFuLnNlcmllc1swXT8ubmFtZSA/PyBiYXNlVGl0bGUsXG4gICAgICAgICAgdHlwZTogXCJoZWF0bWFwXCIsXG4gICAgICAgICAgZGF0YTogY2VsbHMsXG4gICAgICAgICAgLy8gUHJpbnRlZCBjZWxsIHZhbHVlcyBhcmUgdW5yZWFkYWJsZSBvbmNlIHRoZSBncmlkIGlzIGRlbnNlLlxuICAgICAgICAgIGxhYmVsOiB7IHNob3c6IGNlbGxzLmxlbmd0aCA8PSBIRUFUTUFQX0xBQkVMX01BWF9DRUxMUyB9LFxuICAgICAgICAgIGVtcGhhc2lzOiB7IGl0ZW1TdHlsZTogeyBzaGFkb3dCbHVyOiAxMCwgc2hhZG93Q29sb3I6IFwicmdiYSgwLCAwLCAwLCAwLjMpXCIgfSB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJyYWRhclwiKSB7XG4gICAgY29uc3QgaW5kaWNhdG9ycyA9IChwbGFuLmNhdGVnb3JpZXMgPz8gW10pLm1hcCgobmFtZSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHBlYWsgPSBNYXRoLm1heChcbiAgICAgICAgMCxcbiAgICAgICAgLi4ucGxhbi5zZXJpZXMubWFwKChzKSA9PiB7XG4gICAgICAgICAgY29uc3QgbnVtcyA9IG51bWVyaWNQb2ludHMocy5kYXRhKTtcbiAgICAgICAgICByZXR1cm4gbnVtc1tpbmRleF0gPz8gMDtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHsgbmFtZSwgbWF4OiBwZWFrID4gMCA/IHBlYWsgOiAxIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZSxcbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJpdGVtXCIgfSxcbiAgICAgIGxlZ2VuZCxcbiAgICAgIHJhZGFyOiB7IGluZGljYXRvcjogaW5kaWNhdG9ycyB9LFxuICAgICAgc2VyaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInJhZGFyXCIsXG4gICAgICAgICAgZGF0YTogcGxhbi5zZXJpZXMubWFwKChzKSA9PiAoe1xuICAgICAgICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgICAgICAgdmFsdWU6IG51bWVyaWNQb2ludHMocy5kYXRhKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcIndhdGVyZmFsbFwiKSB7XG4gICAgY29uc3QgdmFsdWVzID0gbnVtZXJpY1BvaW50cyh3YXRlcmZhbGxEZWx0YVNlcmllcyhwbGFuLnNlcmllcyk/LmRhdGEgPz8gW10pO1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICAvLyBJdGVtLXRyaWdnZXJlZCBzbyB0aGUgdHJhbnNwYXJlbnQgYHNpbGVudGAgb2Zmc2V0IGJhcnMgbmV2ZXJcbiAgICAgIC8vIHN1cmZhY2UgaW4gYSB0b29sdGlwIChzZWUgYHdhdGVyZmFsbFNlcmllc2ApLlxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcIml0ZW1cIiB9LFxuICAgICAgLy8gT25seSB0aGUgdHdvIHZpc2libGUgc3RlcHMgYmVsb25nIGluIHRoZSBsZWdlbmQuXG4gICAgICBsZWdlbmQ6IHsgLi4ubGVnZW5kLCBkYXRhOiBbV0FURVJGQUxMX0lOQ1JFQVNFX05BTUUsIFdBVEVSRkFMTF9ERUNSRUFTRV9OQU1FXSB9LFxuICAgICAgZ3JpZCxcbiAgICAgIHhBeGlzOiB7XG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgZGF0YTogcGxhbi5jYXRlZ29yaWVzID8/IFtdLFxuICAgICAgICBuYW1lOiBwbGFuLnhBeGlzTGFiZWwsXG4gICAgICB9LFxuICAgICAgeUF4aXM6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICAgIHNlcmllczogd2F0ZXJmYWxsU2VyaWVzKHZhbHVlcyksXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwiaG9yaXpvbnRhbEJhclwiKSB7XG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZSxcbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJheGlzXCIsIGF4aXNQb2ludGVyOiB7IHR5cGU6IFwic2hhZG93XCIgfSB9LFxuICAgICAgbGVnZW5kLFxuICAgICAgZ3JpZCxcbiAgICAgIHhBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi54QXhpc0xhYmVsIH0sXG4gICAgICB5QXhpczoge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIGRhdGE6IHBsYW4uY2F0ZWdvcmllcyA/PyBbXSxcbiAgICAgICAgbmFtZTogcGxhbi55QXhpc0xhYmVsLFxuICAgICAgfSxcbiAgICAgIHNlcmllczogcGxhbi5zZXJpZXMubWFwKChzKSA9PiAoe1xuICAgICAgICBuYW1lOiBzLm5hbWUsXG4gICAgICAgIHR5cGU6IFwiYmFyXCIsXG4gICAgICAgIGRhdGE6IHMuZGF0YSxcbiAgICAgIH0pKSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJjb21ib1wiKSB7XG4gICAgY29uc3QgdXNlc1JpZ2h0QXhpcyA9IHBsYW4uc2VyaWVzLnNvbWUoKHMpID0+IHMueUF4aXNJbmRleCA9PT0gMSk7XG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZSxcbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJheGlzXCIgfSxcbiAgICAgIGxlZ2VuZCxcbiAgICAgIGdyaWQsXG4gICAgICB4QXhpczoge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIGRhdGE6IHBsYW4uY2F0ZWdvcmllcyA/PyBbXSxcbiAgICAgICAgbmFtZTogcGxhbi54QXhpc0xhYmVsLFxuICAgICAgfSxcbiAgICAgIHlBeGlzOiB1c2VzUmlnaHRBeGlzXG4gICAgICAgID8gW1xuICAgICAgICAgICAgeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgICAgICAgICAgeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgIF1cbiAgICAgICAgOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi55QXhpc0xhYmVsIH0sXG4gICAgICBzZXJpZXM6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4ge1xuICAgICAgICBjb25zdCBtYXJrID0gcy50eXBlID8/IFwiYmFyXCI7XG4gICAgICAgIGNvbnN0IHNlcmllc1R5cGUgPSBtYXJrID09PSBcImFyZWFcIiA/IFwibGluZVwiIDogbWFyaztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBzLm5hbWUsXG4gICAgICAgICAgdHlwZTogc2VyaWVzVHlwZSxcbiAgICAgICAgICBkYXRhOiBzLmRhdGEsXG4gICAgICAgICAgeUF4aXNJbmRleDogcy55QXhpc0luZGV4ID8/IDAsXG4gICAgICAgICAgc21vb3RoOiBzZXJpZXNUeXBlID09PSBcImxpbmVcIixcbiAgICAgICAgICAuLi4obWFyayA9PT0gXCJhcmVhXCIgPyB7IGFyZWFTdHlsZToge30gfSA6IHt9KSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gYmFyIC8gbGluZSAvIGFyZWEgc2hhcmUgdGhlIHNhbWUgYXhpcyBsYXlvdXQuXG4gIGNvbnN0IGlzQXJlYSA9IHBsYW4uY2hhcnRUeXBlID09PSBcImFyZWFcIjtcbiAgY29uc3Qgc2VyaWVzVHlwZSA9IHBsYW4uY2hhcnRUeXBlID09PSBcImJhclwiID8gXCJiYXJcIiA6IFwibGluZVwiO1xuICByZXR1cm4gdGhlbWVkKHtcbiAgICB0aXRsZSxcbiAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiYXhpc1wiIH0sXG4gICAgbGVnZW5kLFxuICAgIGdyaWQsXG4gICAgeEF4aXM6IHtcbiAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgIGRhdGE6IHBsYW4uY2F0ZWdvcmllcyA/PyBbXSxcbiAgICAgIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCxcbiAgICB9LFxuICAgIHlBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi55QXhpc0xhYmVsIH0sXG4gICAgc2VyaWVzOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7XG4gICAgICBuYW1lOiBzLm5hbWUsXG4gICAgICB0eXBlOiBzZXJpZXNUeXBlLFxuICAgICAgZGF0YTogcy5kYXRhLFxuICAgICAgc21vb3RoOiBzZXJpZXNUeXBlID09PSBcImxpbmVcIixcbiAgICAgIC4uLihpc0FyZWEgPyB7IGFyZWFTdHlsZToge30gfSA6IHt9KSxcbiAgICB9KSksXG4gIH0pO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZW5kZXJfZGF0YSB0b29sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogQnVpbGQgdGhlIGByZW5kZXJfZGF0YWAgTWFzdHJhIHRvb2wgYm91bmQgdG8gdGhlIGdpdmVuIHBsdWdpblxuICogY29uZmlnLiBBdXRvLXdpcmVkIGFzIGEgc3lzdGVtIHRvb2wgb24gZXZlcnkgYWdlbnQgKHNlZVxuICogYGFnZW50cy50c2ApOyBwZXItYWdlbnQgdG9vbHMgY2FuIHNoYWRvdyBpdCBieSByZWdpc3RlcmluZyBhXG4gKiBzYW1lLW5hbWVkIGVudHJ5LlxuICpcbiAqIFRoaW4gd3JhcHBlciBvdmVyIHtAbGluayBwcmVwYXJlQ2hhcnR9IGZvciBjYWxsZXJzIHRoYXQgYWxyZWFkeVxuICogaGF2ZSBhIGRhdGFzZXQgaW4gaGFuZC4gTWludHMgYSBgY2hhcnRJZGAgc3luY2hyb25vdXNseSwgY2FjaGVzXG4gKiBhbiBlbXB0eSBwbGFjZWhvbGRlciwgYW5kIGtpY2tzIG9mZiB0aGUgY2hhcnQtcGxhbm5lciBpbiB0aGVcbiAqIGJhY2tncm91bmQuIFJldHVybnMgdGhlIGBjaGFydElkYCBwbHVzIGl0cyByZWFkeS10by1jb3B5IGBtYXJrZXJgOyB0aGUgaG9zdFxuICogVUkgcmVzb2x2ZXMgdGhhdCBtYXJrZXIgdGhyb3VnaCB0aGUgcGx1Z2luJ3MgYC9lbWJlZC9jaGFydC86aWRgIHJvdXRlLlxuICpcbiAqIEZvciBHZW5pZSBzdGF0ZW1lbnQgcmVzdWx0cywgcHJlZmVyIHRoZSBHZW5pZSBhZ2VudCdzXG4gKiBgcHJlcGFyZV9jaGFydGAgdG9vbCwgd2hpY2ggYWNjZXB0cyBhIGBzdGF0ZW1lbnRfaWRgIGFuZFxuICogcmVzb2x2ZXMgdGhlIHJvd3MgbGF6aWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSZW5kZXJEYXRhVG9vbChjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZykge1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IFwicmVuZGVyX2RhdGFcIixcbiAgICBkZXNjcmlwdGlvbjogdG9EZXNjcmlwdGlvbihbXG4gICAgICBgXG4gICAgICAgIFN1Ym1pdCBhIHRhYnVsYXIgZGF0YXNldCBmb3IgaW5saW5lIHJlbmRlcmluZyBhcyBhIGNoYXJ0IGluXG4gICAgICAgIHRoZSB1c2VyJ3Mgdmlldy4gUGFzcyBhIHRpdGxlLCB0aGUgcmF3IHJvd3MgKGFycmF5IG9mIG9iamVjdHNcbiAgICAgICAga2V5ZWQgYnkgY29sdW1uIG5hbWUpLCBhbmQgYW4gb3B0aW9uYWwgb25lLWxpbmUgZGVzY3JpcHRpb25cbiAgICAgICAgb2YgdGhlIGluc2lnaHQgdG8gaGlnaGxpZ2h0LiBSZXR1cm5zIFxcYGNoYXJ0SWRcXGAgcGx1cyB0aGVcbiAgICAgICAgY29tcGxldGUgXFxgbWFya2VyXFxgOyBjb3B5IHRoZSByZXR1cm5lZCBtYXJrZXIgVkVSQkFUSU0gb250b1xuICAgICAgICBpdHMgb3duIGxpbmUgd2hlcmUgdGhlIGNoYXJ0IHNob3VsZCByZW5kZXIuIE5ldmVyIGNvbnN0cnVjdCxcbiAgICAgICAgYWx0ZXIsIG9yIGludmVudCBhIGNoYXJ0IG1hcmtlciB5b3Vyc2VsZi5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIFBsYWNlbWVudCBjb250cmFjdDogZW1iZWQgdGhlIHJldHVybmVkIFxcYG1hcmtlclxcYCBvbiBpdHMgb3duXG4gICAgICAgIGxpbmUgKGJsYW5rIGxpbmVzIGFib3ZlIGFuZCBiZWxvdykgd2hlcmV2ZXIgeW91IHdhbnQgdGhlIGNoYXJ0XG4gICAgICAgIHRvIGFwcGVhciBpbiB5b3VyIHJlcGx5LiBUaGUgY2hhcnQgcmVzb2x2ZXNcbiAgICAgICAgYXN5bmNocm9ub3VzbHkgLSB0aGUgdG9vbCByZXR1cm5zIHRoZSBpZCBpbW1lZGlhdGVseSBhbmQgdGhlXG4gICAgICAgIGhvc3QgVUkgZmV0Y2hlcyB0aGUgY2hhcnQgZnJvbSB0aGUgY2FjaGUgb25jZSB0aGUgcGxhbm5lclxuICAgICAgICBsYW5kcy4gWW91IGNhbiBjYWxsIFxcYHJlbmRlcl9kYXRhXFxgIG11bHRpcGxlIHRpbWVzIGluIHRoZVxuICAgICAgICBzYW1lIHR1cm4gKHRoZSB0b29sIGlzIHBhcmFsbGVsLXNhZmUpIGFuZCBpbnRlcmxlYXZlIHRoZVxuICAgICAgICBtYXJrZXJzIHdpdGggcHJvc2Ugc28gZWFjaCBjaGFydCBzaXRzIG5leHQgdG8gaXRzXG4gICAgICAgIGNvbW1lbnRhcnkuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBVc2Ugd2hlbmV2ZXIgYSBTUUwgcm93IHNldCwgQVBJIHJlc3BvbnNlLCBvciBoYW5kLWJ1aWx0XG4gICAgICAgIGRhdGFzZXQgd291bGQgbGFuZCBiZXR0ZXIgYXMgYSBwaWN0dXJlIHRoYW4gYXMgYSBsaXN0IG9yXG4gICAgICAgIHRhYmxlLiBDYXAgaW5wdXQgYXQgYSBmZXcgaHVuZHJlZCByb3dzOyBzYW1wbGUgb3IgYWdncmVnYXRlXG4gICAgICAgIGxhcmdlciBkYXRhc2V0cyBmaXJzdC5cbiAgICAgIGAsXG4gICAgXSksXG4gICAgaW5wdXRTY2hlbWE6IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEsXG4gICAgb3V0cHV0U2NoZW1hOiBjaGFydFRvb2xPdXRwdXRTY2hlbWEsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0LCBjdHhSYXcpID0+IHtcbiAgICAgIGNvbnN0IHsgdGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhIH0gPSBpbnB1dCBhcyBDaGFydFBsYW5uZXJSZXF1ZXN0O1xuICAgICAgY29uc3QgY3R4ID0gY3R4UmF3IGFzIHsgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dCB9IHwgdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHByZXBhcmVDaGFydCh7XG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgdXNlcktleTogcmVzb2x2ZVVzZXJLZXkoY3R4Py5yZXF1ZXN0Q29udGV4dCksXG4gICAgICAgIHRpdGxlLFxuICAgICAgICAuLi4oZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIHJlc29sdmVEYXRhOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoeyByb3dzOiBkYXRhIH0pLFxuICAgICAgICAuLi4oY3R4Py5yZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQ6IGN0eC5yZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
|