@dbx-tools/appkit-mastra 0.9.60 → 0.9.64
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 +33 -4
- package/index.ts +6 -3
- package/lib/index.d.ts +6 -3
- package/lib/index.js +5 -3
- package/lib/src/agents.js +26 -3
- package/lib/src/config.d.ts +19 -0
- package/lib/src/config.js +9 -1
- package/lib/src/genie.js +3 -1
- package/lib/src/mlflow.d.ts +28 -4
- package/lib/src/mlflow.js +125 -14
- package/lib/src/server.js +3 -1
- package/lib/src/skill-cache.d.ts +70 -0
- package/lib/src/skill-cache.js +194 -0
- package/lib/src/telemetry.d.ts +41 -0
- package/lib/src/telemetry.js +89 -4
- package/lib/src/workspaces.d.ts +10 -0
- package/lib/src/workspaces.js +84 -24
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +22 -14
- package/src/agents.ts +29 -2
- package/src/config.ts +30 -0
- package/src/genie.ts +2 -0
- package/src/mlflow.ts +131 -15
- package/src/server.ts +1 -0
- package/src/skill-cache.ts +312 -0
- package/src/telemetry.ts +90 -2
- package/src/workspaces.ts +107 -22
package/lib/src/mlflow.js
CHANGED
|
@@ -13,19 +13,118 @@
|
|
|
13
13
|
*
|
|
14
14
|
* There is no MLflow JS SDK, so this posts to the assessments REST
|
|
15
15
|
* endpoint directly using the OBO-scoped workspace client (the feedback
|
|
16
|
-
* is thus attributed to the signed-in user).
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
16
|
+
* is thus attributed to the signed-in user). UC-backed Apps traces need
|
|
17
|
+
* the experiment's table-prefix URI (`trace:/{catalog}.{schema}.{prefix}/{tr-hex}`)
|
|
18
|
+
* rather than the experiment-store id the UI does not store. That prefix is
|
|
19
|
+
* read from the experiment's `mlflow.experiment.databricksTraceDestinationPath`
|
|
20
|
+
* tag (or the spans-table tag); `MLFLOW_UC_TRACE_PREFIX` remains an optional
|
|
21
|
+
* override. Trace export is asynchronous, so the just-finished trace may not
|
|
22
|
+
* exist in MLflow yet when the user reacts; the log call retries briefly on
|
|
23
|
+
* "not found" before giving up softly.
|
|
20
24
|
*
|
|
21
25
|
* @module
|
|
22
26
|
*/
|
|
23
27
|
import { ConfigurationError } from "@databricks/appkit";
|
|
24
|
-
import { asyncUtils, errorUtils, log } from "@dbx-tools/shared-core";
|
|
28
|
+
import { asyncUtils, errorUtils, log, object } from "@dbx-tools/shared-core";
|
|
25
29
|
import { feedback } from "@dbx-tools/shared-mastra";
|
|
26
30
|
import { z } from "zod";
|
|
27
31
|
import { databricksFetch, readResponseJson, readResponseText } from "./rest.js";
|
|
28
32
|
const logger = log.logger("mastra/mlflow");
|
|
33
|
+
/** Experiment tag Databricks stores as `catalog.schema.table_prefix`. */
|
|
34
|
+
const TRACE_DESTINATION_PATH_TAG = "mlflow.experiment.databricksTraceDestinationPath";
|
|
35
|
+
/** Experiment tag naming the OTel spans table (`catalog.schema.{prefix}_otel_spans`). */
|
|
36
|
+
const TRACE_SPAN_STORAGE_TABLE_TAG = "mlflow.experiment.databricksTraceSpanStorageTable";
|
|
37
|
+
/**
|
|
38
|
+
* Cached UC table prefix resolved from the experiment. `loaded` distinguishes
|
|
39
|
+
* "not fetched yet" from "fetched, experiment has no UC location". Network
|
|
40
|
+
* failures are not cached so a later thumbs click can retry.
|
|
41
|
+
*/
|
|
42
|
+
let loadedUcPrefix;
|
|
43
|
+
/** Strip the `trace:/` URI wrapper and trailing slashes from a UC prefix. */
|
|
44
|
+
function normalizeUcPrefix(raw) {
|
|
45
|
+
const value = raw
|
|
46
|
+
?.trim()
|
|
47
|
+
.replace(/^trace:\//, "")
|
|
48
|
+
.replace(/\/+$/, "");
|
|
49
|
+
return value || undefined;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Derive `catalog.schema.table_prefix` from a spans table name.
|
|
53
|
+
* Databricks names the table `{prefix}_otel_spans`.
|
|
54
|
+
*/
|
|
55
|
+
function prefixFromSpanTable(table) {
|
|
56
|
+
const name = table?.trim();
|
|
57
|
+
if (!name)
|
|
58
|
+
return undefined;
|
|
59
|
+
if (name.endsWith("_otel_spans"))
|
|
60
|
+
return name.slice(0, -"_otel_spans".length);
|
|
61
|
+
if (name.endsWith("_spans"))
|
|
62
|
+
return name.slice(0, -"_spans".length);
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
function experimentTagMap(raw) {
|
|
66
|
+
const tags = new Map();
|
|
67
|
+
if (Array.isArray(raw)) {
|
|
68
|
+
for (const tag of raw) {
|
|
69
|
+
if (!object.isRecord(tag) || typeof tag.key !== "string" || typeof tag.value !== "string") {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
tags.set(tag.key, tag.value);
|
|
73
|
+
}
|
|
74
|
+
return tags;
|
|
75
|
+
}
|
|
76
|
+
if (!object.isRecord(raw))
|
|
77
|
+
return tags;
|
|
78
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
79
|
+
if (typeof value === "string")
|
|
80
|
+
tags.set(key, value);
|
|
81
|
+
}
|
|
82
|
+
return tags;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* UC table prefix the assessments API needs, read from experiment tags.
|
|
86
|
+
*
|
|
87
|
+
* Prefers the three-part destination path Databricks writes when the
|
|
88
|
+
* experiment is linked to a table-prefix location. Falls back to stripping
|
|
89
|
+
* `_otel_spans` from the spans-table tag. Two-part schema-linked destinations
|
|
90
|
+
* are ignored (they are not a table prefix).
|
|
91
|
+
*/
|
|
92
|
+
export function ucTracePrefixFromExperimentTags(rawTags) {
|
|
93
|
+
const tags = experimentTagMap(rawTags);
|
|
94
|
+
const destination = normalizeUcPrefix(tags.get(TRACE_DESTINATION_PATH_TAG));
|
|
95
|
+
if (destination && destination.split(".").length >= 3)
|
|
96
|
+
return destination;
|
|
97
|
+
return prefixFromSpanTable(tags.get(TRACE_SPAN_STORAGE_TABLE_TAG));
|
|
98
|
+
}
|
|
99
|
+
/** Drop the in-process UC prefix cache (tests). */
|
|
100
|
+
export function resetUcTracePrefixCache() {
|
|
101
|
+
loadedUcPrefix = undefined;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Trace id the assessments REST API accepts for this deployment.
|
|
105
|
+
*
|
|
106
|
+
* Databricks Apps persist traces in Unity Catalog. The experiment UI lists
|
|
107
|
+
* those rows, but `POST /api/3.0/mlflow/traces/{id}/assessments` looks up the
|
|
108
|
+
* experiment store unless `{id}` is the UC URI `trace:/{catalog}.{schema}.{prefix}/{tr-hex}`.
|
|
109
|
+
* A bare `tr-<hex>` 404s and the assessment never appears.
|
|
110
|
+
*/
|
|
111
|
+
export function mlflowAssessmentTraceId(traceId, prefix) {
|
|
112
|
+
const resolved = normalizeUcPrefix(prefix);
|
|
113
|
+
return resolved ? `trace:/${resolved}/${traceId}` : traceId;
|
|
114
|
+
}
|
|
115
|
+
async function resolveUcTracePrefix(client) {
|
|
116
|
+
const fromEnv = normalizeUcPrefix(process.env.MLFLOW_UC_TRACE_PREFIX);
|
|
117
|
+
if (fromEnv)
|
|
118
|
+
return fromEnv;
|
|
119
|
+
if (loadedUcPrefix)
|
|
120
|
+
return loadedUcPrefix.prefix;
|
|
121
|
+
const experiment = await fetchExperiment(client);
|
|
122
|
+
if (!experiment)
|
|
123
|
+
return undefined;
|
|
124
|
+
const prefix = ucTracePrefixFromExperimentTags(experiment.tags);
|
|
125
|
+
loadedUcPrefix = { prefix };
|
|
126
|
+
return prefix;
|
|
127
|
+
}
|
|
29
128
|
/** Assessments REST path for a trace. `3.0` is the current MLflow API version. */
|
|
30
129
|
const assessmentsPath = (traceId) => `/api/3.0/mlflow/traces/${encodeURIComponent(traceId)}/assessments`;
|
|
31
130
|
/** Number of times to retry a "trace not found" response before giving up. */
|
|
@@ -37,6 +136,7 @@ const MlflowExperimentResponseSchema = z
|
|
|
37
136
|
experiment: z
|
|
38
137
|
.object({
|
|
39
138
|
experiment_id: z.string().min(1).describe("Workspace MLflow experiment identifier."),
|
|
139
|
+
tags: z.unknown().optional().describe("Experiment tags, including the UC trace location."),
|
|
40
140
|
})
|
|
41
141
|
.passthrough()
|
|
42
142
|
.describe("Configured MLflow experiment."),
|
|
@@ -175,18 +275,26 @@ async function resolveMlflowExperimentManagerUrl(client) {
|
|
|
175
275
|
const host = (await client.config.getHost()).toString();
|
|
176
276
|
return new URL(`/ml/experiments/${encodeURIComponent(experimentId)}`, host).toString();
|
|
177
277
|
}
|
|
178
|
-
async function
|
|
278
|
+
async function fetchExperiment(client) {
|
|
179
279
|
const experiment = configuredExperiment();
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
280
|
+
const path = experiment.id
|
|
281
|
+
? `/api/2.0/mlflow/experiments/get?experiment_id=${encodeURIComponent(experiment.id)}`
|
|
282
|
+
: experiment.name
|
|
283
|
+
? `/api/2.0/mlflow/experiments/get-by-name?experiment_name=${encodeURIComponent(experiment.name)}`
|
|
284
|
+
: undefined;
|
|
285
|
+
if (!path)
|
|
183
286
|
return undefined;
|
|
184
|
-
const path = `/api/2.0/mlflow/experiments/get-by-name?experiment_name=${encodeURIComponent(experiment.name)}`;
|
|
185
287
|
const response = await databricksFetch(client, path, { method: "GET" });
|
|
186
288
|
if (!response.ok)
|
|
187
289
|
return undefined;
|
|
188
290
|
const parsed = MlflowExperimentResponseSchema.safeParse(await readResponseJson(response));
|
|
189
|
-
return parsed.success ? parsed.data.experiment
|
|
291
|
+
return parsed.success ? parsed.data.experiment : undefined;
|
|
292
|
+
}
|
|
293
|
+
async function resolveExperimentId(client) {
|
|
294
|
+
const configured = configuredExperiment();
|
|
295
|
+
if (configured.id)
|
|
296
|
+
return configured.id;
|
|
297
|
+
return (await fetchExperiment(client))?.experiment_id;
|
|
190
298
|
}
|
|
191
299
|
/**
|
|
192
300
|
* Log a HUMAN feedback assessment to a trace. Returns the created
|
|
@@ -202,8 +310,9 @@ export async function logFeedback(client, params) {
|
|
|
202
310
|
const name = params.name?.trim() ||
|
|
203
311
|
(hasValue ? feedback.DEFAULT_FEEDBACK_NAME : feedback.DEFAULT_COMMENT_NAME);
|
|
204
312
|
const value = hasValue ? params.value : params.comment;
|
|
313
|
+
const assessmentTraceId = mlflowAssessmentTraceId(params.traceId, await resolveUcTracePrefix(client));
|
|
205
314
|
const assessment = {
|
|
206
|
-
trace_id:
|
|
315
|
+
trace_id: assessmentTraceId,
|
|
207
316
|
assessment_name: name,
|
|
208
317
|
source: {
|
|
209
318
|
source_type: "HUMAN",
|
|
@@ -216,7 +325,7 @@ export async function logFeedback(client, params) {
|
|
|
216
325
|
for (let attempt = 0; attempt <= NOT_FOUND_RETRIES; attempt++) {
|
|
217
326
|
let res;
|
|
218
327
|
try {
|
|
219
|
-
res = await databricksFetch(client, assessmentsPath(
|
|
328
|
+
res = await databricksFetch(client, assessmentsPath(assessmentTraceId), {
|
|
220
329
|
method: "POST",
|
|
221
330
|
body,
|
|
222
331
|
});
|
|
@@ -224,6 +333,7 @@ export async function logFeedback(client, params) {
|
|
|
224
333
|
catch (err) {
|
|
225
334
|
logger.warn("feedback request failed", {
|
|
226
335
|
traceId: params.traceId,
|
|
336
|
+
assessmentTraceId,
|
|
227
337
|
error: errorUtils.errorMessage(err),
|
|
228
338
|
});
|
|
229
339
|
return undefined;
|
|
@@ -242,6 +352,7 @@ export async function logFeedback(client, params) {
|
|
|
242
352
|
}
|
|
243
353
|
logger.warn("feedback not recorded", {
|
|
244
354
|
traceId: params.traceId,
|
|
355
|
+
assessmentTraceId,
|
|
245
356
|
status: res.status,
|
|
246
357
|
body: await readResponseText(res),
|
|
247
358
|
});
|
|
@@ -249,4 +360,4 @@ export async function logFeedback(client, params) {
|
|
|
249
360
|
}
|
|
250
361
|
return undefined;
|
|
251
362
|
}
|
|
252
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWxmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21sZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVoRixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBSzNDLGtGQUFrRjtBQUNsRixNQUFNLGVBQWUsR0FBRyxDQUFDLE9BQWUsRUFBVSxFQUFFLENBQ2xELDBCQUEwQixrQkFBa0IsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDO0FBRXRFLDhFQUE4RTtBQUM5RSxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQUM1Qiw4RUFBOEU7QUFDOUUsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7QUFFbEMsTUFBTSw4QkFBOEIsR0FBRyxDQUFDO0tBQ3JDLE1BQU0sQ0FBQztJQUNOLFVBQVUsRUFBRSxDQUFDO1NBQ1YsTUFBTSxDQUFDO1FBQ04sYUFBYSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLHlDQUF5QyxDQUFDO0tBQ3JGLENBQUM7U0FDRCxXQUFXLEVBQUU7U0FDYixRQUFRLENBQUMsK0JBQStCLENBQUM7Q0FDN0MsQ0FBQztLQUNELFdBQVcsRUFBRTtLQUNiLFFBQVEsQ0FBQyxp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LEdBQUcsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sWUFBWSxHQUNmLE1BQXVELEVBQUUsVUFBVSxFQUFFLGFBQWE7Z0JBQ2xGLE1BQXNDLEVBQUUsYUFBYSxDQUFDO1lBQ3pELE9BQU8sT0FBTyxZQUFZLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM5RCxDQUFDO1FBQ0Qsa0VBQWtFO1FBQ2xFLDBEQUEwRDtRQUMxRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sR0FBRyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RELE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdELFNBQVM7UUFDWCxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUNuQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO1lBQ2xCLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDLEdBQUcsQ0FBQztTQUNsQyxDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTUxmbG93IHVzZXItZmVlZGJhY2sgbG9nZ2luZzogZGV0ZWN0IHdoZXRoZXIgTUxmbG93IHRyYWNpbmcgaXMgd2lyZWRcbiAqIGZvciB0aGlzIGRlcGxveW1lbnQsIGFuZCBsb2cgYSB0aHVtYnMgLyBjb21tZW50IGFzIGEgdHJhY2VcbiAqICphc3Nlc3NtZW50KiB2aWEgdGhlIERhdGFicmlja3MgTUxmbG93IFJFU1QgQVBJLlxuICpcbiAqIEZlZWRiYWNrIGF0dGFjaGVzIHRvIGEgdHJhY2UsIGFuZCB0aGUgcGx1Z2luJ3Mgc3BhbnMgcmVhY2ggTUxmbG93XG4gKiB0aHJvdWdoIHRoZSBzYW1lIE9UZWwgcGlwZWxpbmUgYXMgZXZlcnkgb3RoZXIgQXBwS2l0IHNwYW4gKHNlZVxuICogYG9ic2VydmFiaWxpdHkudHNgKS4gT24gRGF0YWJyaWNrcyBBcHBzIHRoYXQgcGlwZWxpbmUgaXMgdGhlIFVDXG4gKiBzaWRlY2FyIGluamVjdGVkIGJ5IGB0ZWxlbWV0cnlfZXhwb3J0X2Rlc3RpbmF0aW9uc2AsIG5vdCBhIGRpcmVjdFxuICogd29ya3NwYWNlIE9UTFAgVVJMLiBNTGZsb3cgZGVyaXZlcyBpdHMgdHJhY2UgaWQgZnJvbSB0aGUgT3BlblRlbGVtZXRyeVxuICogdHJhY2UgaWQgKGB0ci08aGV4KG90ZWxUcmFjZUlkKT5gKSwgc28gdGhlIHNlcnZlciBzdGFtcHMgdGhlIGFjdGl2ZVxuICogdHJhY2UgaWQgb24gZWFjaCB0dXJuJ3MgcmVzcG9uc2UgYW5kIHRoZSBjbGllbnQgc2VuZHMgaXQgYmFjayBoZXJlLlxuICpcbiAqIFRoZXJlIGlzIG5vIE1MZmxvdyBKUyBTREssIHNvIHRoaXMgcG9zdHMgdG8gdGhlIGFzc2Vzc21lbnRzIFJFU1RcbiAqIGVuZHBvaW50IGRpcmVjdGx5IHVzaW5nIHRoZSBPQk8tc2NvcGVkIHdvcmtzcGFjZSBjbGllbnQgKHRoZSBmZWVkYmFja1xuICogaXMgdGh1cyBhdHRyaWJ1dGVkIHRvIHRoZSBzaWduZWQtaW4gdXNlcikuIFRyYWNlIGV4cG9ydCBpc1xuICogYXN5bmNocm9ub3VzLCBzbyB0aGUganVzdC1maW5pc2hlZCB0cmFjZSBtYXkgbm90IGV4aXN0IGluIE1MZmxvdyB5ZXRcbiAqIHdoZW4gdGhlIHVzZXIgcmVhY3RzOyB0aGUgbG9nIGNhbGwgcmV0cmllcyBicmllZmx5IG9uIFwibm90IGZvdW5kXCJcbiAqIGJlZm9yZSBnaXZpbmcgdXAgc29mdGx5LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRXJyb3IgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGFzeW5jVXRpbHMsIGVycm9yVXRpbHMsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmZWVkYmFjayB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBkYXRhYnJpY2tzRmV0Y2gsIHJlYWRSZXNwb25zZUpzb24sIHJlYWRSZXNwb25zZVRleHQgfSBmcm9tIFwiLi9yZXN0LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvbWxmbG93XCIpO1xuXG4vKiogV29ya3NwYWNlIGNsaWVudCBjYXJyaWVkIG9uIGFuIEFwcEtpdCBleGVjdXRpb24gY29udGV4dC4gKi9cbnR5cGUgV29ya3NwYWNlQ2xpZW50ID0gYXBwa2l0LldvcmtzcGFjZUNsaWVudExpa2U7XG5cbi8qKiBBc3Nlc3NtZW50cyBSRVNUIHBhdGggZm9yIGEgdHJhY2UuIGAzLjBgIGlzIHRoZSBjdXJyZW50IE1MZmxvdyBBUEkgdmVyc2lvbi4gKi9cbmNvbnN0IGFzc2Vzc21lbnRzUGF0aCA9ICh0cmFjZUlkOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgYC9hcGkvMy4wL21sZmxvdy90cmFjZXMvJHtlbmNvZGVVUklDb21wb25lbnQodHJhY2VJZCl9L2Fzc2Vzc21lbnRzYDtcblxuLyoqIE51bWJlciBvZiB0aW1lcyB0byByZXRyeSBhIFwidHJhY2Ugbm90IGZvdW5kXCIgcmVzcG9uc2UgYmVmb3JlIGdpdmluZyB1cC4gKi9cbmNvbnN0IE5PVF9GT1VORF9SRVRSSUVTID0gMztcbi8qKiBCYXNlIGJhY2tvZmYgYmV0d2VlbiBcInRyYWNlIG5vdCBmb3VuZFwiIHJldHJpZXMsIGluIG1zIChncm93cyBsaW5lYXJseSkuICovXG5jb25zdCBOT1RfRk9VTkRfQkFDS09GRl9NUyA9IDEyMDA7XG5cbmNvbnN0IE1sZmxvd0V4cGVyaW1lbnRSZXNwb25zZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgZXhwZXJpbWVudDogelxuICAgICAgLm9iamVjdCh7XG4gICAgICAgIGV4cGVyaW1lbnRfaWQ6IHouc3RyaW5nKCkubWluKDEpLmRlc2NyaWJlKFwiV29ya3NwYWNlIE1MZmxvdyBleHBlcmltZW50IGlkZW50aWZpZXIuXCIpLFxuICAgICAgfSlcbiAgICAgIC5wYXNzdGhyb3VnaCgpXG4gICAgICAuZGVzY3JpYmUoXCJDb25maWd1cmVkIE1MZmxvdyBleHBlcmltZW50LlwiKSxcbiAgfSlcbiAgLnBhc3N0aHJvdWdoKClcbiAgLmRlc2NyaWJlKFwiTUxmbG93IGdldC1leHBlcmltZW50IHJlc3BvbnNlLlwiKTtcblxuY29uc3QgQ3VycmVudFVzZXJSZXNwb25zZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdXNlck5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkN1cnJlbnQgd29ya3NwYWNlIHVzZXIgbmFtZS5cIiksXG4gICAgYXBwbGljYXRpb25JZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiQ3VycmVudCBzZXJ2aWNlIHByaW5jaXBhbCBhcHBsaWNhdGlvbiBpZC5cIiksXG4gICAgZGlzcGxheU5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkN1cnJlbnQgcHJpbmNpcGFsIGRpc3BsYXkgbmFtZS5cIiksXG4gICAgZ3JvdXBzOiB6XG4gICAgICAuYXJyYXkoXG4gICAgICAgIHpcbiAgICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICAgIHZhbHVlOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJXb3Jrc3BhY2UgZ3JvdXAgaWRlbnRpZmllci5cIiksXG4gICAgICAgICAgICBkaXNwbGF5OiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJXb3Jrc3BhY2UgZ3JvdXAgZGlzcGxheSBuYW1lLlwiKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5wYXNzdGhyb3VnaCgpLFxuICAgICAgKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIkdyb3VwcyBhc3NpZ25lZCB0byB0aGUgY3VycmVudCBwcmluY2lwYWwuXCIpLFxuICB9KVxuICAucGFzc3Rocm91Z2goKVxuICAuZGVzY3JpYmUoXCJEYXRhYnJpY2tzIEN1cnJlbnQgVXNlciBBUEkgcmVzcG9uc2UuXCIpO1xuXG5jb25zdCBFeHBlcmltZW50UGVybWlzc2lvbnNSZXNwb25zZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgYWNjZXNzX2NvbnRyb2xfbGlzdDogelxuICAgICAgLmFycmF5KFxuICAgICAgICB6XG4gICAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgICB1c2VyX25hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlVzZXIgcHJpbmNpcGFsIG5hbWUuXCIpLFxuICAgICAgICAgICAgZ3JvdXBfbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiR3JvdXAgcHJpbmNpcGFsIG5hbWUuXCIpLFxuICAgICAgICAgICAgc2VydmljZV9wcmluY2lwYWxfbmFtZTogelxuICAgICAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgLmRlc2NyaWJlKFwiU2VydmljZSBwcmluY2lwYWwgYXBwbGljYXRpb24gaWQuXCIpLFxuICAgICAgICAgICAgYWxsX3Blcm1pc3Npb25zOiB6XG4gICAgICAgICAgICAgIC5hcnJheShcbiAgICAgICAgICAgICAgICB6XG4gICAgICAgICAgICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbl9sZXZlbDogei5zdHJpbmcoKS5kZXNjcmliZShcIkVmZmVjdGl2ZSBleHBlcmltZW50IHBlcm1pc3Npb24gbGV2ZWwuXCIpLFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIC5wYXNzdGhyb3VnaCgpLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAgIC5kZXNjcmliZShcIkRpcmVjdCBhbmQgaW5oZXJpdGVkIHBlcm1pc3Npb25zIGZvciB0aGlzIHByaW5jaXBhbC5cIiksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucGFzc3Rocm91Z2goKSxcbiAgICAgIClcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXCJFeHBlcmltZW50IGFjY2VzcyBjb250cm9sIGVudHJpZXMuXCIpLFxuICB9KVxuICAucGFzc3Rocm91Z2goKVxuICAuZGVzY3JpYmUoXCJEYXRhYnJpY2tzIGV4cGVyaW1lbnQgcGVybWlzc2lvbnMgcmVzcG9uc2UuXCIpO1xuXG5mdW5jdGlvbiBjb25maWd1cmVkRXhwZXJpbWVudCgpOiB7IGlkPzogc3RyaW5nOyBuYW1lPzogc3RyaW5nIH0ge1xuICBjb25zdCBpZCA9IHByb2Nlc3MuZW52Lk1MRkxPV19FWFBFUklNRU5UX0lEPy50cmltKCk7XG4gIGNvbnN0IG5hbWUgPSBwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9OQU1FPy50cmltKCk7XG4gIHJldHVybiB7XG4gICAgLi4uKGlkID8geyBpZCB9IDoge30pLFxuICAgIC4uLihuYW1lID8geyBuYW1lIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKlxuICogV2hldGhlciBNTGZsb3cgZmVlZGJhY2sgbG9nZ2luZyBpcyBhdmFpbGFibGUgZm9yIHRoaXMgZGVwbG95bWVudC5cbiAqXG4gKiBFbmFibGVkIHdoZW4gYW4gT1RMUCBleHBvcnRlciBlbmRwb2ludCBpcyBjb25maWd1cmVkICh0cmFjZXMgYXJlXG4gKiBhY3R1YWxseSBzaGlwcGVkIHNvbWV3aGVyZSkgQU5EIGFuIE1MZmxvdyBleHBlcmltZW50IGlzIG5hbWVkIC0gdGhlXG4gKiB0d28gc2lnbmFscyB0aGF0IHRoZSBPVExQIGJhY2tlbmQgaXMgTUxmbG93IGFuZCB0cmFjZXMgd2lsbFxuICogbWF0ZXJpYWxpemUgdGhlcmUuIEJvdGggYXJlIHN0YW5kYXJkIGVudiB2YXJzLCBzbyBubyBwbHVnaW4gY29uZmlnIGlzXG4gKiByZXF1aXJlZDsgYSBkZXBsb3ltZW50IG9wdHMgaW4gc2ltcGx5IGJ5IHdpcmluZyBNTGZsb3cgdHJhY2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1sZmxvd0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IGhhc0V4cG9ydGVyID0gQm9vbGVhbihcbiAgICBwcm9jZXNzLmVudi5PVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlQ/LnRyaW0oKSB8fFxuICAgIHByb2Nlc3MuZW52Lk9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfRU5EUE9JTlQ/LnRyaW0oKSxcbiAgKTtcbiAgY29uc3QgaGFzRXhwZXJpbWVudCA9IEJvb2xlYW4oXG4gICAgcHJvY2Vzcy5lbnYuTUxGTE9XX0VYUEVSSU1FTlRfSUQ/LnRyaW0oKSB8fCBwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9OQU1FPy50cmltKCksXG4gICk7XG4gIHJldHVybiBoYXNFeHBvcnRlciAmJiBoYXNFeHBlcmltZW50O1xufVxuXG4vKipcbiAqIFJlc29sdmUgd2hldGhlciB1c2VyIGZlZWRiYWNrIGlzIGVuYWJsZWQgZnJvbSB0aGUgcGx1Z2luJ3Mgb3B0aW9uYWxcbiAqIGBjb25maWcuZmVlZGJhY2tgIG92ZXJyaWRlOiB0aGUgZXhwbGljaXQgYm9vbGVhbiB3aW5zLCBvdGhlcndpc2UgZmFsbFxuICogYmFjayB0byBhdXRvLWRldGVjdGluZyBNTGZsb3cgdHJhY2luZyAoe0BsaW5rIG1sZmxvd0VuYWJsZWR9KS4gU2hhcmVkXG4gKiBieSB0aGUgcGx1Z2luJ3MgY2xpZW50LWNvbmZpZyBnYXRlIGFuZCB0aGUgc2VydmVyJ3MgdHJhY2UtaWQgaGVhZGVyIHNvXG4gKiB0aGUgdHdvIG5ldmVyIGRpc2FncmVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZlZWRiYWNrRW5hYmxlZChleHBsaWNpdDogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZXhwbGljaXQgPz8gbWxmbG93RW5hYmxlZCgpO1xufVxuXG4vKipcbiAqIFJlamVjdCBhbiBleHBsaWNpdGx5IGVuYWJsZWQgZmVlZGJhY2sgc3VyZmFjZSB3aGVuIG5vIE1MZmxvdyBleHBlcmltZW50IGlzXG4gKiBjb25maWd1cmVkLiBBdXRvIG1vZGUgcmVtYWlucyBub24tZmF0YWwgYW5kIHNpbXBseSBkaXNhYmxlcyBmZWVkYmFjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRmVlZGJhY2tDb25maWcoZXhwbGljaXQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKGV4cGxpY2l0ICE9PSB0cnVlKSByZXR1cm47XG4gIGNvbnN0IGV4cGVyaW1lbnQgPSBjb25maWd1cmVkRXhwZXJpbWVudCgpO1xuICBpZiAoZXhwZXJpbWVudC5pZCB8fCBleHBlcmltZW50Lm5hbWUpIHJldHVybjtcbiAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICBcIm1hc3RyYTogZmVlZGJhY2sgaXMgZW5hYmxlZCBidXQgbm8gTUxmbG93IGV4cGVyaW1lbnQgaXMgY29uZmlndXJlZC4gXCIgK1xuICAgICAgXCJTZXQgTUxGTE9XX0VYUEVSSU1FTlRfSUQgb3IgTUxGTE9XX0VYUEVSSU1FTlRfTkFNRSwgdXNlIGZlZWRiYWNrOiBmYWxzZSwgXCIgK1xuICAgICAgXCJvciBvbWl0IGZlZWRiYWNrIHRvIHVzZSBhdXRvbWF0aWMgZGV0ZWN0aW9uLlwiLFxuICApO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgY29uZmlndXJlZCBleHBlcmltZW50IFVSTCBvbmx5IHdoZW4gdGhlIGFjdGl2ZSBEYXRhYnJpY2tzXG4gKiBwcmluY2lwYWwgaGFzIGVmZmVjdGl2ZSBgQ0FOX01BTkFHRWAgcGVybWlzc2lvbi4gUGVybWlzc2lvbiBsb29rdXAgaXNcbiAqIGludGVudGlvbmFsbHkgYmVzdC1lZmZvcnQgc28gQXBwcyBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgZXhwb3NlIHRoZVxuICogcmVxdWlyZWQgQVBJcyBzaW1wbHkgb21pdCB0aGUgZGVidWcgYWZmb3JkYW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1sZmxvd0V4cGVyaW1lbnRNYW5hZ2VyVXJsKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlc29sdmVNbGZsb3dFeHBlcmltZW50TWFuYWdlclVybChjbGllbnQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVNbGZsb3dFeHBlcmltZW50TWFuYWdlclVybChcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBleHBlcmltZW50SWQgPSBhd2FpdCByZXNvbHZlRXhwZXJpbWVudElkKGNsaWVudCk7XG4gIGlmICghZXhwZXJpbWVudElkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IFtjdXJyZW50UmVzcG9uc2UsIHBlcm1pc3Npb25zUmVzcG9uc2VdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGRhdGFicmlja3NGZXRjaChjbGllbnQsIFwiL2FwaS8yLjAvcHJldmlldy9zY2ltL3YyL01lXCIsIHsgbWV0aG9kOiBcIkdFVFwiIH0pLFxuICAgIGRhdGFicmlja3NGZXRjaChcbiAgICAgIGNsaWVudCxcbiAgICAgIGAvYXBpLzIuMC9wZXJtaXNzaW9ucy9leHBlcmltZW50cy8ke2VuY29kZVVSSUNvbXBvbmVudChleHBlcmltZW50SWQpfWAsXG4gICAgICB7IG1ldGhvZDogXCJHRVRcIiB9LFxuICAgICksXG4gIF0pO1xuICBpZiAoIWN1cnJlbnRSZXNwb25zZS5vayB8fCAhcGVybWlzc2lvbnNSZXNwb25zZS5vaykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBjdXJyZW50ID0gQ3VycmVudFVzZXJSZXNwb25zZVNjaGVtYS5zYWZlUGFyc2UoYXdhaXQgcmVhZFJlc3BvbnNlSnNvbihjdXJyZW50UmVzcG9uc2UpKTtcbiAgY29uc3QgcGVybWlzc2lvbnMgPSBFeHBlcmltZW50UGVybWlzc2lvbnNSZXNwb25zZVNjaGVtYS5zYWZlUGFyc2UoXG4gICAgYXdhaXQgcmVhZFJlc3BvbnNlSnNvbihwZXJtaXNzaW9uc1Jlc3BvbnNlKSxcbiAgKTtcbiAgaWYgKCFjdXJyZW50LnN1Y2Nlc3MgfHwgIXBlcm1pc3Npb25zLnN1Y2Nlc3MpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgdXNlck5hbWVzID0gbmV3IFNldChcbiAgICBbY3VycmVudC5kYXRhLnVzZXJOYW1lLCBjdXJyZW50LmRhdGEuYXBwbGljYXRpb25JZCwgY3VycmVudC5kYXRhLmRpc3BsYXlOYW1lXS5maWx0ZXIoXG4gICAgICAodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gQm9vbGVhbih2YWx1ZSksXG4gICAgKSxcbiAgKTtcbiAgY29uc3QgZ3JvdXBOYW1lcyA9IG5ldyBTZXQoXG4gICAgKGN1cnJlbnQuZGF0YS5ncm91cHMgPz8gW10pLmZsYXRNYXAoKHsgdmFsdWUsIGRpc3BsYXkgfSkgPT5cbiAgICAgIFt2YWx1ZSwgZGlzcGxheV0uZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIHN0cmluZyA9PiBCb29sZWFuKGVudHJ5KSksXG4gICAgKSxcbiAgKTtcbiAgY29uc3QgY2FuTWFuYWdlID0gKHBlcm1pc3Npb25zLmRhdGEuYWNjZXNzX2NvbnRyb2xfbGlzdCA/PyBbXSkuc29tZSgoZW50cnkpID0+IHtcbiAgICBjb25zdCBtYXRjaGVzID1cbiAgICAgIChlbnRyeS51c2VyX25hbWUgIT09IHVuZGVmaW5lZCAmJiB1c2VyTmFtZXMuaGFzKGVudHJ5LnVzZXJfbmFtZSkpIHx8XG4gICAgICAoZW50cnkuc2VydmljZV9wcmluY2lwYWxfbmFtZSAhPT0gdW5kZWZpbmVkICYmIHVzZXJOYW1lcy5oYXMoZW50cnkuc2VydmljZV9wcmluY2lwYWxfbmFtZSkpIHx8XG4gICAgICAoZW50cnkuZ3JvdXBfbmFtZSAhPT0gdW5kZWZpbmVkICYmIGdyb3VwTmFtZXMuaGFzKGVudHJ5Lmdyb3VwX25hbWUpKTtcbiAgICByZXR1cm4gKFxuICAgICAgbWF0Y2hlcyAmJlxuICAgICAgKGVudHJ5LmFsbF9wZXJtaXNzaW9ucyA/PyBbXSkuc29tZShcbiAgICAgICAgKHBlcm1pc3Npb24pID0+IHBlcm1pc3Npb24ucGVybWlzc2lvbl9sZXZlbCA9PT0gXCJDQU5fTUFOQUdFXCIsXG4gICAgICApXG4gICAgKTtcbiAgfSk7XG4gIGlmICghY2FuTWFuYWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gIHJldHVybiBuZXcgVVJMKGAvbWwvZXhwZXJpbWVudHMvJHtlbmNvZGVVUklDb21wb25lbnQoZXhwZXJpbWVudElkKX1gLCBob3N0KS50b1N0cmluZygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRXhwZXJpbWVudElkKGNsaWVudDogV29ya3NwYWNlQ2xpZW50KTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZXhwZXJpbWVudCA9IGNvbmZpZ3VyZWRFeHBlcmltZW50KCk7XG4gIGlmIChleHBlcmltZW50LmlkKSByZXR1cm4gZXhwZXJpbWVudC5pZDtcbiAgaWYgKCFleHBlcmltZW50Lm5hbWUpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgcGF0aCA9IGAvYXBpLzIuMC9tbGZsb3cvZXhwZXJpbWVudHMvZ2V0LWJ5LW5hbWU/ZXhwZXJpbWVudF9uYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgIGV4cGVyaW1lbnQubmFtZSxcbiAgKX1gO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGRhdGFicmlja3NGZXRjaChjbGllbnQsIHBhdGgsIHsgbWV0aG9kOiBcIkdFVFwiIH0pO1xuICBpZiAoIXJlc3BvbnNlLm9rKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYXJzZWQgPSBNbGZsb3dFeHBlcmltZW50UmVzcG9uc2VTY2hlbWEuc2FmZVBhcnNlKGF3YWl0IHJlYWRSZXNwb25zZUpzb24ocmVzcG9uc2UpKTtcbiAgcmV0dXJuIHBhcnNlZC5zdWNjZXNzID8gcGFyc2VkLmRhdGEuZXhwZXJpbWVudC5leHBlcmltZW50X2lkIDogdW5kZWZpbmVkO1xufVxuXG4vKiogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGxvZ0ZlZWRiYWNrfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nRmVlZGJhY2tQYXJhbXMge1xuICAvKiogTUxmbG93IHRyYWNlIGlkIHRoZSBhc3Nlc3NtZW50IGF0dGFjaGVzIHRvIChgdHItPGhleD5gKS4gKi9cbiAgdHJhY2VJZDogc3RyaW5nO1xuICAvKiogQXNzZXNzbWVudCBuYW1lOyBkZWZhdWx0cyBwZXIgd2hldGhlciBhIHZhbHVlIG9yIGEgY29tbWVudCBpcyBzZW50LiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogVGh1bWJzIC8gcmF0aW5nIC8gbGFiZWwgdmFsdWUuIE9taXQgZm9yIGEgY29tbWVudC1vbmx5IHN1Ym1pc3Npb24uICovXG4gIHZhbHVlPzogYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZztcbiAgLyoqIEZyZWVmb3JtIGNvbW1lbnQ6IHRoZSByYXRpb25hbGUgYWxvbmdzaWRlIGEgdmFsdWUsIG9yIHRoZSB2YWx1ZSBpdHNlbGYgd2hlbiBub25lLiAqL1xuICBjb21tZW50Pzogc3RyaW5nO1xuICAvKiogSWRlbnRpdHkgdGhlIGZlZWRiYWNrIGlzIGF0dHJpYnV0ZWQgdG8gKHVzZXIgZW1haWwgLyBpZCkuICovXG4gIHNvdXJjZUlkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIExvZyBhIEhVTUFOIGZlZWRiYWNrIGFzc2Vzc21lbnQgdG8gYSB0cmFjZS4gUmV0dXJucyB0aGUgY3JlYXRlZFxuICogYXNzZXNzbWVudCBpZCBvbiBzdWNjZXNzLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSB0cmFjZSBjYW4ndCBiZVxuICogZm91bmQgKGV2ZW4gYWZ0ZXIgcmV0cnlpbmcgZm9yIGV4cG9ydCBsYWcpIG9yIHRoZSByZXF1ZXN0IG90aGVyd2lzZVxuICogZmFpbHMgLSBjYWxsZXJzIHN1cmZhY2UgdGhhdCBhcyBhIHNvZnQgXCJub3QgcmVjb3JkZWRcIiByYXRoZXIgdGhhbiBhblxuICogZXJyb3IsIGtlZXBpbmcgdGhlIGNoYXQgdXNhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9nRmVlZGJhY2soXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICBwYXJhbXM6IExvZ0ZlZWRiYWNrUGFyYW1zLFxuKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgLy8gQSBjb21tZW50IHdpdGggbm8gdGh1bWJzIHZhbHVlIGlzIGxvZ2dlZCBhcyB0ZXh0IGZlZWRiYWNrOyBhIHZhbHVlXG4gIC8vICh3aXRoIGFuIG9wdGlvbmFsIGNvbW1lbnQgYXMgdGhlIHJhdGlvbmFsZSkgaXMgdGhlIHRodW1icyBwYXRoLlxuICBjb25zdCBoYXNWYWx1ZSA9IHBhcmFtcy52YWx1ZSAhPT0gdW5kZWZpbmVkO1xuICBjb25zdCBuYW1lID1cbiAgICBwYXJhbXMubmFtZT8udHJpbSgpIHx8XG4gICAgKGhhc1ZhbHVlID8gZmVlZGJhY2suREVGQVVMVF9GRUVEQkFDS19OQU1FIDogZmVlZGJhY2suREVGQVVMVF9DT01NRU5UX05BTUUpO1xuICBjb25zdCB2YWx1ZSA9IGhhc1ZhbHVlID8gcGFyYW1zLnZhbHVlIDogcGFyYW1zLmNvbW1lbnQ7XG4gIGNvbnN0IGFzc2Vzc21lbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHRyYWNlX2lkOiBwYXJhbXMudHJhY2VJZCxcbiAgICBhc3Nlc3NtZW50X25hbWU6IG5hbWUsXG4gICAgc291cmNlOiB7XG4gICAgICBzb3VyY2VfdHlwZTogXCJIVU1BTlwiLFxuICAgICAgc291cmNlX2lkOiBwYXJhbXMuc291cmNlSWQ/LnRyaW0oKSB8fCBcInVzZXJcIixcbiAgICB9LFxuICAgIGZlZWRiYWNrOiB7IHZhbHVlIH0sXG4gICAgLi4uKGhhc1ZhbHVlICYmIHBhcmFtcy5jb21tZW50Py50cmltKCkgPyB7IHJhdGlvbmFsZTogcGFyYW1zLmNvbW1lbnQgfSA6IHt9KSxcbiAgfTtcbiAgY29uc3QgYm9keSA9IHsgYXNzZXNzbWVudCB9O1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IE5PVF9GT1VORF9SRVRSSUVTOyBhdHRlbXB0KyspIHtcbiAgICBsZXQgcmVzOiBSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gYXdhaXQgZGF0YWJyaWNrc0ZldGNoKGNsaWVudCwgYXNzZXNzbWVudHNQYXRoKHBhcmFtcy50cmFjZUlkKSwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBib2R5LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIud2FybihcImZlZWRiYWNrIHJlcXVlc3QgZmFpbGVkXCIsIHtcbiAgICAgICAgdHJhY2VJZDogcGFyYW1zLnRyYWNlSWQsXG4gICAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAocmVzLm9rKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBhd2FpdCByZWFkUmVzcG9uc2VKc29uKHJlcyk7XG4gICAgICBjb25zdCBhc3Nlc3NtZW50SWQgPVxuICAgICAgICAocGFyc2VkIGFzIHsgYXNzZXNzbWVudD86IHsgYXNzZXNzbWVudF9pZD86IHVua25vd24gfSB9KT8uYXNzZXNzbWVudD8uYXNzZXNzbWVudF9pZCA/P1xuICAgICAgICAocGFyc2VkIGFzIHsgYXNzZXNzbWVudF9pZD86IHVua25vd24gfSk/LmFzc2Vzc21lbnRfaWQ7XG4gICAgICByZXR1cm4gdHlwZW9mIGFzc2Vzc21lbnRJZCA9PT0gXCJzdHJpbmdcIiA/IGFzc2Vzc21lbnRJZCA6IFwiXCI7XG4gICAgfVxuICAgIC8vIFRyYWNlIGV4cG9ydCBpcyBhc3luYzsgYSBmcmVzaCB0cmFjZSBtYXkgbm90IGV4aXN0IHlldC4gUmV0cnkgYVxuICAgIC8vIGZldyB0aW1lcyB3aXRoIGEgc2hvcnQgYmFja29mZiBiZWZvcmUgZ2l2aW5nIHVwIHNvZnRseS5cbiAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDA0ICYmIGF0dGVtcHQgPCBOT1RfRk9VTkRfUkVUUklFUykge1xuICAgICAgYXdhaXQgYXN5bmNVdGlscy5zbGVlcChOT1RfRk9VTkRfQkFDS09GRl9NUyAqIChhdHRlbXB0ICsgMSkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGxvZ2dlci53YXJuKFwiZmVlZGJhY2sgbm90IHJlY29yZGVkXCIsIHtcbiAgICAgIHRyYWNlSWQ6IHBhcmFtcy50cmFjZUlkLFxuICAgICAgc3RhdHVzOiByZXMuc3RhdHVzLFxuICAgICAgYm9keTogYXdhaXQgcmVhZFJlc3BvbnNlVGV4dChyZXMpLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
363
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWxmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21sZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXhELE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWhGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUFLM0MseUVBQXlFO0FBQ3pFLE1BQU0sMEJBQTBCLEdBQUcsa0RBQWtELENBQUM7QUFDdEYseUZBQXlGO0FBQ3pGLE1BQU0sNEJBQTRCLEdBQUcsbURBQW1ELENBQUM7QUFFekY7Ozs7R0FJRztBQUNILElBQUksY0FBMEQsQ0FBQztBQUUvRCw2RUFBNkU7QUFDN0UsU0FBUyxpQkFBaUIsQ0FBQyxHQUF1QjtJQUNoRCxNQUFNLEtBQUssR0FBRyxHQUFHO1FBQ2YsRUFBRSxJQUFJLEVBQUU7U0FDUCxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztTQUN4QixPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZCLE9BQU8sS0FBSyxJQUFJLFNBQVMsQ0FBQztBQUM1QixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxLQUF5QjtJQUNwRCxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDM0IsSUFBSSxDQUFD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QWlCO2dCQUNqQixLQUFLLEVBQUUsVUFBVSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7YUFDcEMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELElBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1gsTUFBTSxNQUFNLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQyxNQUFNLFlBQVksR0FDZixNQUF1RCxFQUFFLFVBQVUsRUFBRSxhQUFhO2dCQUNsRixNQUFzQyxFQUFFLGFBQWEsQ0FBQztZQUN6RCxPQUFPLE9BQU8sWUFBWSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDOUQsQ0FBQztRQUNELGtFQUFrRTtRQUNsRSwwREFBMEQ7UUFDMUQsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxPQUFPLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztZQUN0RCxNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RCxTQUFTO1FBQ1gsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7WUFDbkMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLGlCQUFpQjtZQUNqQixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU07WUFDbEIsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUMsR0FBRyxDQUFDO1NBQ2xDLENBQUMsQ0FBQztRQUNILE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNTGZsb3cgdXNlci1mZWVkYmFjayBsb2dnaW5nOiBkZXRlY3Qgd2hldGhlciBNTGZsb3cgdHJhY2luZyBpcyB3aXJlZFxuICogZm9yIHRoaXMgZGVwbG95bWVudCwgYW5kIGxvZyBhIHRodW1icyAvIGNvbW1lbnQgYXMgYSB0cmFjZVxuICogKmFzc2Vzc21lbnQqIHZpYSB0aGUgRGF0YWJyaWNrcyBNTGZsb3cgUkVTVCBBUEkuXG4gKlxuICogRmVlZGJhY2sgYXR0YWNoZXMgdG8gYSB0cmFjZSwgYW5kIHRoZSBwbHVnaW4ncyBzcGFucyByZWFjaCBNTGZsb3dcbiAqIHRocm91Z2ggdGhlIHNhbWUgT1RlbCBwaXBlbGluZSBhcyBldmVyeSBvdGhlciBBcHBLaXQgc3BhbiAoc2VlXG4gKiBgb2JzZXJ2YWJpbGl0eS50c2ApLiBPbiBEYXRhYnJpY2tzIEFwcHMgdGhhdCBwaXBlbGluZSBpcyB0aGUgVUNcbiAqIHNpZGVjYXIgaW5qZWN0ZWQgYnkgYHRlbGVtZXRyeV9leHBvcnRfZGVzdGluYXRpb25zYCwgbm90IGEgZGlyZWN0XG4gKiB3b3Jrc3BhY2UgT1RMUCBVUkwuIE1MZmxvdyBkZXJpdmVzIGl0cyB0cmFjZSBpZCBmcm9tIHRoZSBPcGVuVGVsZW1ldHJ5XG4gKiB0cmFjZSBpZCAoYHRyLTxoZXgob3RlbFRyYWNlSWQpPmApLCBzbyB0aGUgc2VydmVyIHN0YW1wcyB0aGUgYWN0aXZlXG4gKiB0cmFjZSBpZCBvbiBlYWNoIHR1cm4ncyByZXNwb25zZSBhbmQgdGhlIGNsaWVudCBzZW5kcyBpdCBiYWNrIGhlcmUuXG4gKlxuICogVGhlcmUgaXMgbm8gTUxmbG93IEpTIFNESywgc28gdGhpcyBwb3N0cyB0byB0aGUgYXNzZXNzbWVudHMgUkVTVFxuICogZW5kcG9pbnQgZGlyZWN0bHkgdXNpbmcgdGhlIE9CTy1zY29wZWQgd29ya3NwYWNlIGNsaWVudCAodGhlIGZlZWRiYWNrXG4gKiBpcyB0aHVzIGF0dHJpYnV0ZWQgdG8gdGhlIHNpZ25lZC1pbiB1c2VyKS4gVUMtYmFja2VkIEFwcHMgdHJhY2VzIG5lZWRcbiAqIHRoZSBleHBlcmltZW50J3MgdGFibGUtcHJlZml4IFVSSSAoYHRyYWNlOi97Y2F0YWxvZ30ue3NjaGVtYX0ue3ByZWZpeH0ve3RyLWhleH1gKVxuICogcmF0aGVyIHRoYW4gdGhlIGV4cGVyaW1lbnQtc3RvcmUgaWQgdGhlIFVJIGRvZXMgbm90IHN0b3JlLiBUaGF0IHByZWZpeCBpc1xuICogcmVhZCBmcm9tIHRoZSBleHBlcmltZW50J3MgYG1sZmxvdy5leHBlcmltZW50LmRhdGFicmlja3NUcmFjZURlc3RpbmF0aW9uUGF0aGBcbiAqIHRhZyAob3IgdGhlIHNwYW5zLXRhYmxlIHRhZyk7IGBNTEZMT1dfVUNfVFJBQ0VfUFJFRklYYCByZW1haW5zIGFuIG9wdGlvbmFsXG4gKiBvdmVycmlkZS4gVHJhY2UgZXhwb3J0IGlzIGFzeW5jaHJvbm91cywgc28gdGhlIGp1c3QtZmluaXNoZWQgdHJhY2UgbWF5IG5vdFxuICogZXhpc3QgaW4gTUxmbG93IHlldCB3aGVuIHRoZSB1c2VyIHJlYWN0czsgdGhlIGxvZyBjYWxsIHJldHJpZXMgYnJpZWZseSBvblxuICogXCJub3QgZm91bmRcIiBiZWZvcmUgZ2l2aW5nIHVwIHNvZnRseS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBhc3luY1V0aWxzLCBlcnJvclV0aWxzLCBsb2csIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmZWVkYmFjayB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBkYXRhYnJpY2tzRmV0Y2gsIHJlYWRSZXNwb25zZUpzb24sIHJlYWRSZXNwb25zZVRleHQgfSBmcm9tIFwiLi9yZXN0LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvbWxmbG93XCIpO1xuXG4vKiogV29ya3NwYWNlIGNsaWVudCBjYXJyaWVkIG9uIGFuIEFwcEtpdCBleGVjdXRpb24gY29udGV4dC4gKi9cbnR5cGUgV29ya3NwYWNlQ2xpZW50ID0gYXBwa2l0LldvcmtzcGFjZUNsaWVudExpa2U7XG5cbi8qKiBFeHBlcmltZW50IHRhZyBEYXRhYnJpY2tzIHN0b3JlcyBhcyBgY2F0YWxvZy5zY2hlbWEudGFibGVfcHJlZml4YC4gKi9cbmNvbnN0IFRSQUNFX0RFU1RJTkFUSU9OX1BBVEhfVEFHID0gXCJtbGZsb3cuZXhwZXJpbWVudC5kYXRhYnJpY2tzVHJhY2VEZXN0aW5hdGlvblBhdGhcIjtcbi8qKiBFeHBlcmltZW50IHRhZyBuYW1pbmcgdGhlIE9UZWwgc3BhbnMgdGFibGUgKGBjYXRhbG9nLnNjaGVtYS57cHJlZml4fV9vdGVsX3NwYW5zYCkuICovXG5jb25zdCBUUkFDRV9TUEFOX1NUT1JBR0VfVEFCTEVfVEFHID0gXCJtbGZsb3cuZXhwZXJpbWVudC5kYXRhYnJpY2tzVHJhY2VTcGFuU3RvcmFnZVRhYmxlXCI7XG5cbi8qKlxuICogQ2FjaGVkIFVDIHRhYmxlIHByZWZpeCByZXNvbHZlZCBmcm9tIHRoZSBleHBlcmltZW50LiBgbG9hZGVkYCBkaXN0aW5ndWlzaGVzXG4gKiBcIm5vdCBmZXRjaGVkIHlldFwiIGZyb20gXCJmZXRjaGVkLCBleHBlcmltZW50IGhhcyBubyBVQyBsb2NhdGlvblwiLiBOZXR3b3JrXG4gKiBmYWlsdXJlcyBhcmUgbm90IGNhY2hlZCBzbyBhIGxhdGVyIHRodW1icyBjbGljayBjYW4gcmV0cnkuXG4gKi9cbmxldCBsb2FkZWRVY1ByZWZpeDogeyBwcmVmaXg6IHN0cmluZyB8IHVuZGVmaW5lZCB9IHwgdW5kZWZpbmVkO1xuXG4vKiogU3RyaXAgdGhlIGB0cmFjZTovYCBVUkkgd3JhcHBlciBhbmQgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIGEgVUMgcHJlZml4LiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplVWNQcmVmaXgocmF3OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB2YWx1ZSA9IHJhd1xuICAgID8udHJpbSgpXG4gICAgLnJlcGxhY2UoL150cmFjZTpcXC8vLCBcIlwiKVxuICAgIC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpO1xuICByZXR1cm4gdmFsdWUgfHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIERlcml2ZSBgY2F0YWxvZy5zY2hlbWEudGFibGVfcHJlZml4YCBmcm9tIGEgc3BhbnMgdGFibGUgbmFtZS5cbiAqIERhdGFicmlja3MgbmFtZXMgdGhlIHRhYmxlIGB7cHJlZml4fV9vdGVsX3NwYW5zYC5cbiAqL1xuZnVuY3Rpb24gcHJlZml4RnJvbVNwYW5UYWJsZSh0YWJsZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbmFtZSA9IHRhYmxlPy50cmltKCk7XG4gIGlmICghbmFtZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKG5hbWUuZW5kc1dpdGgoXCJfb3RlbF9zcGFuc1wiKSkgcmV0dXJuIG5hbWUuc2xpY2UoMCwgLVwiX290ZWxfc3BhbnNcIi5sZW5ndGgpO1xuICBpZiAobmFtZS5lbmRzV2l0aChcIl9zcGFuc1wiKSkgcmV0dXJuIG5hbWUuc2xpY2UoMCwgLVwiX3NwYW5zXCIubGVuZ3RoKTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXhwZXJpbWVudFRhZ01hcChyYXc6IHVua25vd24pOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgdGFncyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGlmIChBcnJheS5pc0FycmF5KHJhdykpIHtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiByYXcpIHtcbiAgICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHRhZykgfHwgdHlwZW9mIHRhZy5rZXkgIT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHRhZy52YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRhZ3Muc2V0KHRhZy5rZXksIHRhZy52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0YWdzO1xuICB9XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKHJhdykpIHJldHVybiB0YWdzO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyYXcpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgdGFncy5zZXQoa2V5LCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHRhZ3M7XG59XG5cbi8qKlxuICogVUMgdGFibGUgcHJlZml4IHRoZSBhc3Nlc3NtZW50cyBBUEkgbmVlZHMsIHJlYWQgZnJvbSBleHBlcmltZW50IHRhZ3MuXG4gKlxuICogUHJlZmVycyB0aGUgdGhyZWUtcGFydCBkZXN0aW5hdGlvbiBwYXRoIERhdGFicmlja3Mgd3JpdGVzIHdoZW4gdGhlXG4gKiBleHBlcmltZW50IGlzIGxpbmtlZCB0byBhIHRhYmxlLXByZWZpeCBsb2NhdGlvbi4gRmFsbHMgYmFjayB0byBzdHJpcHBpbmdcbiAqIGBfb3RlbF9zcGFuc2AgZnJvbSB0aGUgc3BhbnMtdGFibGUgdGFnLiBUd28tcGFydCBzY2hlbWEtbGlua2VkIGRlc3RpbmF0aW9uc1xuICogYXJlIGlnbm9yZWQgKHRoZXkgYXJlIG5vdCBhIHRhYmxlIHByZWZpeCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1Y1RyYWNlUHJlZml4RnJvbUV4cGVyaW1lbnRUYWdzKHJhd1RhZ3M6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0YWdzID0gZXhwZXJpbWVudFRhZ01hcChyYXdUYWdzKTtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBub3JtYWxpemVVY1ByZWZpeCh0YWdzLmdldChUUkFDRV9ERVNUSU5BVElPTl9QQVRIX1RBRykpO1xuICBpZiAoZGVzdGluYXRpb24gJiYgZGVzdGluYXRpb24uc3BsaXQoXCIuXCIpLmxlbmd0aCA+PSAzKSByZXR1cm4gZGVzdGluYXRpb247XG4gIHJldHVybiBwcmVmaXhGcm9tU3BhblRhYmxlKHRhZ3MuZ2V0KFRSQUNFX1NQQU5fU1RPUkFHRV9UQUJMRV9UQUcpKTtcbn1cblxuLyoqIERyb3AgdGhlIGluLXByb2Nlc3MgVUMgcHJlZml4IGNhY2hlICh0ZXN0cykuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRVY1RyYWNlUHJlZml4Q2FjaGUoKTogdm9pZCB7XG4gIGxvYWRlZFVjUHJlZml4ID0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRyYWNlIGlkIHRoZSBhc3Nlc3NtZW50cyBSRVNUIEFQSSBhY2NlcHRzIGZvciB0aGlzIGRlcGxveW1lbnQuXG4gKlxuICogRGF0YWJyaWNrcyBBcHBzIHBlcnNpc3QgdHJhY2VzIGluIFVuaXR5IENhdGFsb2cuIFRoZSBleHBlcmltZW50IFVJIGxpc3RzXG4gKiB0aG9zZSByb3dzLCBidXQgYFBPU1QgL2FwaS8zLjAvbWxmbG93L3RyYWNlcy97aWR9L2Fzc2Vzc21lbnRzYCBsb29rcyB1cCB0aGVcbiAqIGV4cGVyaW1lbnQgc3RvcmUgdW5sZXNzIGB7aWR9YCBpcyB0aGUgVUMgVVJJIGB0cmFjZTove2NhdGFsb2d9LntzY2hlbWF9LntwcmVmaXh9L3t0ci1oZXh9YC5cbiAqIEEgYmFyZSBgdHItPGhleD5gIDQwNHMgYW5kIHRoZSBhc3Nlc3NtZW50IG5ldmVyIGFwcGVhcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtbGZsb3dBc3Nlc3NtZW50VHJhY2VJZCh0cmFjZUlkOiBzdHJpbmcsIHByZWZpeD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlc29sdmVkID0gbm9ybWFsaXplVWNQcmVmaXgocHJlZml4KTtcbiAgcmV0dXJuIHJlc29sdmVkID8gYHRyYWNlOi8ke3Jlc29sdmVkfS8ke3RyYWNlSWR9YCA6IHRyYWNlSWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVVY1RyYWNlUHJlZml4KGNsaWVudDogV29ya3NwYWNlQ2xpZW50KTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZnJvbUVudiA9IG5vcm1hbGl6ZVVjUHJlZml4KHByb2Nlc3MuZW52Lk1MRkxPV19VQ19UUkFDRV9QUkVGSVgpO1xuICBpZiAoZnJvbUVudikgcmV0dXJuIGZyb21FbnY7XG4gIGlmIChsb2FkZWRVY1ByZWZpeCkgcmV0dXJuIGxvYWRlZFVjUHJlZml4LnByZWZpeDtcbiAgY29uc3QgZXhwZXJpbWVudCA9IGF3YWl0IGZldGNoRXhwZXJpbWVudChjbGllbnQpO1xuICBpZiAoIWV4cGVyaW1lbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHByZWZpeCA9IHVjVHJhY2VQcmVmaXhGcm9tRXhwZXJpbWVudFRhZ3MoZXhwZXJpbWVudC50YWdzKTtcbiAgbG9hZGVkVWNQcmVmaXggPSB7IHByZWZpeCB9O1xuICByZXR1cm4gcHJlZml4O1xufVxuXG4vKiogQXNzZXNzbWVudHMgUkVTVCBwYXRoIGZvciBhIHRyYWNlLiBgMy4wYCBpcyB0aGUgY3VycmVudCBNTGZsb3cgQVBJIHZlcnNpb24uICovXG5jb25zdCBhc3Nlc3NtZW50c1BhdGggPSAodHJhY2VJZDogc3RyaW5nKTogc3RyaW5nID0+XG4gIGAvYXBpLzMuMC9tbGZsb3cvdHJhY2VzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRyYWNlSWQpfS9hc3Nlc3NtZW50c2A7XG5cbi8qKiBOdW1iZXIgb2YgdGltZXMgdG8gcmV0cnkgYSBcInRyYWNlIG5vdCBmb3VuZFwiIHJlc3BvbnNlIGJlZm9yZSBnaXZpbmcgdXAuICovXG5jb25zdCBOT1RfRk9VTkRfUkVUUklFUyA9IDM7XG4vKiogQmFzZSBiYWNrb2ZmIGJldHdlZW4gXCJ0cmFjZSBub3QgZm91bmRcIiByZXRyaWVzLCBpbiBtcyAoZ3Jvd3MgbGluZWFybHkpLiAqL1xuY29uc3QgTk9UX0ZPVU5EX0JBQ0tPRkZfTVMgPSAxMjAwO1xuXG5jb25zdCBNbGZsb3dFeHBlcmltZW50UmVzcG9uc2VTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGV4cGVyaW1lbnQ6IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICBleHBlcmltZW50X2lkOiB6LnN0cmluZygpLm1pbigxKS5kZXNjcmliZShcIldvcmtzcGFjZSBNTGZsb3cgZXhwZXJpbWVudCBpZGVudGlmaWVyLlwiKSxcbiAgICAgICAgdGFnczogei51bmtub3duKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkV4cGVyaW1lbnQgdGFncywgaW5jbHVkaW5nIHRoZSBVQyB0cmFjZSBsb2NhdGlvbi5cIiksXG4gICAgICB9KVxuICAgICAgLnBhc3N0aHJvdWdoKClcbiAgICAgIC5kZXNjcmliZShcIkNvbmZpZ3VyZWQgTUxmbG93IGV4cGVyaW1lbnQuXCIpLFxuICB9KVxuICAucGFzc3Rocm91Z2goKVxuICAuZGVzY3JpYmUoXCJNTGZsb3cgZ2V0LWV4cGVyaW1lbnQgcmVzcG9uc2UuXCIpO1xuXG5jb25zdCBDdXJyZW50VXNlclJlc3BvbnNlU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICB1c2VyTmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiQ3VycmVudCB3b3Jrc3BhY2UgdXNlciBuYW1lLlwiKSxcbiAgICBhcHBsaWNhdGlvbklkOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJDdXJyZW50IHNlcnZpY2UgcHJpbmNpcGFsIGFwcGxpY2F0aW9uIGlkLlwiKSxcbiAgICBkaXNwbGF5TmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiQ3VycmVudCBwcmluY2lwYWwgZGlzcGxheSBuYW1lLlwiKSxcbiAgICBncm91cHM6IHpcbiAgICAgIC5hcnJheShcbiAgICAgICAgelxuICAgICAgICAgIC5vYmplY3Qoe1xuICAgICAgICAgICAgdmFsdWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIldvcmtzcGFjZSBncm91cCBpZGVudGlmaWVyLlwiKSxcbiAgICAgICAgICAgIGRpc3BsYXk6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIldvcmtzcGFjZSBncm91cCBkaXNwbGF5IG5hbWUuXCIpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnBhc3N0aHJvdWdoKCksXG4gICAgICApXG4gICAgICAub3B0aW9uYWwoKVxuICAgICAgLmRlc2NyaWJlKFwiR3JvdXBzIGFzc2lnbmVkIHRvIHRoZSBjdXJyZW50IHByaW5jaXBhbC5cIiksXG4gIH0pXG4gIC5wYXNzdGhyb3VnaCgpXG4gIC5kZXNjcmliZShcIkRhdGFicmlja3MgQ3VycmVudCBVc2VyIEFQSSByZXNwb25zZS5cIik7XG5cbmNvbnN0IEV4cGVyaW1lbnRQZXJtaXNzaW9uc1Jlc3BvbnNlU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBhY2Nlc3NfY29udHJvbF9saXN0OiB6XG4gICAgICAuYXJyYXkoXG4gICAgICAgIHpcbiAgICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICAgIHVzZXJfbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiVXNlciBwcmluY2lwYWwgbmFtZS5cIiksXG4gICAgICAgICAgICBncm91cF9uYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJHcm91cCBwcmluY2lwYWwgbmFtZS5cIiksXG4gICAgICAgICAgICBzZXJ2aWNlX3ByaW5jaXBhbF9uYW1lOiB6XG4gICAgICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAuZGVzY3JpYmUoXCJTZXJ2aWNlIHByaW5jaXBhbCBhcHBsaWNhdGlvbiBpZC5cIiksXG4gICAgICAgICAgICBhbGxfcGVybWlzc2lvbnM6IHpcbiAgICAgICAgICAgICAgLmFycmF5KFxuICAgICAgICAgICAgICAgIHpcbiAgICAgICAgICAgICAgICAgIC5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uX2xldmVsOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiRWZmZWN0aXZlIGV4cGVyaW1lbnQgcGVybWlzc2lvbiBsZXZlbC5cIiksXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgLnBhc3N0aHJvdWdoKCksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgLmRlc2NyaWJlKFwiRGlyZWN0IGFuZCBpbmhlcml0ZWQgcGVybWlzc2lvbnMgZm9yIHRoaXMgcHJpbmNpcGFsLlwiKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5wYXNzdGhyb3VnaCgpLFxuICAgICAgKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIkV4cGVyaW1lbnQgYWNjZXNzIGNvbnRyb2wgZW50cmllcy5cIiksXG4gIH0pXG4gIC5wYXNzdGhyb3VnaCgpXG4gIC5kZXNjcmliZShcIkRhdGFicmlja3MgZXhwZXJpbWVudCBwZXJtaXNzaW9ucyByZXNwb25zZS5cIik7XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZWRFeHBlcmltZW50KCk6IHsgaWQ/OiBzdHJpbmc7IG5hbWU/OiBzdHJpbmcgfSB7XG4gIGNvbnN0IGlkID0gcHJvY2Vzcy5lbnYuTUxGTE9XX0VYUEVSSU1FTlRfSUQ/LnRyaW0oKTtcbiAgY29uc3QgbmFtZSA9IHByb2Nlc3MuZW52Lk1MRkxPV19FWFBFUklNRU5UX05BTUU/LnRyaW0oKTtcbiAgcmV0dXJuIHtcbiAgICAuLi4oaWQgPyB7IGlkIH0gOiB7fSksXG4gICAgLi4uKG5hbWUgPyB7IG5hbWUgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIE1MZmxvdyBmZWVkYmFjayBsb2dnaW5nIGlzIGF2YWlsYWJsZSBmb3IgdGhpcyBkZXBsb3ltZW50LlxuICpcbiAqIEVuYWJsZWQgd2hlbiBhbiBPVExQIGV4cG9ydGVyIGVuZHBvaW50IGlzIGNvbmZpZ3VyZWQgKHRyYWNlcyBhcmVcbiAqIGFjdHVhbGx5IHNoaXBwZWQgc29tZXdoZXJlKSBBTkQgYW4gTUxmbG93IGV4cGVyaW1lbnQgaXMgbmFtZWQgLSB0aGVcbiAqIHR3byBzaWduYWxzIHRoYXQgdGhlIE9UTFAgYmFja2VuZCBpcyBNTGZsb3cgYW5kIHRyYWNlcyB3aWxsXG4gKiBtYXRlcmlhbGl6ZSB0aGVyZS4gQm90aCBhcmUgc3RhbmRhcmQgZW52IHZhcnMsIHNvIG5vIHBsdWdpbiBjb25maWcgaXNcbiAqIHJlcXVpcmVkOyBhIGRlcGxveW1lbnQgb3B0cyBpbiBzaW1wbHkgYnkgd2lyaW5nIE1MZmxvdyB0cmFjaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWxmbG93RW5hYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgaGFzRXhwb3J0ZXIgPSBCb29sZWFuKFxuICAgIHByb2Nlc3MuZW52Lk9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVD8udHJpbSgpIHx8XG4gICAgcHJvY2Vzcy5lbnYuT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19FTkRQT0lOVD8udHJpbSgpLFxuICApO1xuICBjb25zdCBoYXNFeHBlcmltZW50ID0gQm9vbGVhbihcbiAgICBwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9JRD8udHJpbSgpIHx8IHByb2Nlc3MuZW52Lk1MRkxPV19FWFBFUklNRU5UX05BTUU/LnRyaW0oKSxcbiAgKTtcbiAgcmV0dXJuIGhhc0V4cG9ydGVyICYmIGhhc0V4cGVyaW1lbnQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB3aGV0aGVyIHVzZXIgZmVlZGJhY2sgaXMgZW5hYmxlZCBmcm9tIHRoZSBwbHVnaW4ncyBvcHRpb25hbFxuICogYGNvbmZpZy5mZWVkYmFja2Agb3ZlcnJpZGU6IHRoZSBleHBsaWNpdCBib29sZWFuIHdpbnMsIG90aGVyd2lzZSBmYWxsXG4gKiBiYWNrIHRvIGF1dG8tZGV0ZWN0aW5nIE1MZmxvdyB0cmFjaW5nICh7QGxpbmsgbWxmbG93RW5hYmxlZH0pLiBTaGFyZWRcbiAqIGJ5IHRoZSBwbHVnaW4ncyBjbGllbnQtY29uZmlnIGdhdGUgYW5kIHRoZSBzZXJ2ZXIncyB0cmFjZS1pZCBoZWFkZXIgc29cbiAqIHRoZSB0d28gbmV2ZXIgZGlzYWdyZWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRmVlZGJhY2tFbmFibGVkKGV4cGxpY2l0OiBib29sZWFuIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBleHBsaWNpdCA/PyBtbGZsb3dFbmFibGVkKCk7XG59XG5cbi8qKlxuICogUmVqZWN0IGFuIGV4cGxpY2l0bHkgZW5hYmxlZCBmZWVkYmFjayBzdXJmYWNlIHdoZW4gbm8gTUxmbG93IGV4cGVyaW1lbnQgaXNcbiAqIGNvbmZpZ3VyZWQuIEF1dG8gbW9kZSByZW1haW5zIG5vbi1mYXRhbCBhbmQgc2ltcGx5IGRpc2FibGVzIGZlZWRiYWNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVGZWVkYmFja0NvbmZpZyhleHBsaWNpdDogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoZXhwbGljaXQgIT09IHRydWUpIHJldHVybjtcbiAgY29uc3QgZXhwZXJpbWVudCA9IGNvbmZpZ3VyZWRFeHBlcmltZW50KCk7XG4gIGlmIChleHBlcmltZW50LmlkIHx8IGV4cGVyaW1lbnQubmFtZSkgcmV0dXJuO1xuICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgIFwibWFzdHJhOiBmZWVkYmFjayBpcyBlbmFibGVkIGJ1dCBubyBNTGZsb3cgZXhwZXJpbWVudCBpcyBjb25maWd1cmVkLiBcIiArXG4gICAgICBcIlNldCBNTEZMT1dfRVhQRVJJTUVOVF9JRCBvciBNTEZMT1dfRVhQRVJJTUVOVF9OQU1FLCB1c2UgZmVlZGJhY2s6IGZhbHNlLCBcIiArXG4gICAgICBcIm9yIG9taXQgZmVlZGJhY2sgdG8gdXNlIGF1dG9tYXRpYyBkZXRlY3Rpb24uXCIsXG4gICk7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBjb25maWd1cmVkIGV4cGVyaW1lbnQgVVJMIG9ubHkgd2hlbiB0aGUgYWN0aXZlIERhdGFicmlja3NcbiAqIHByaW5jaXBhbCBoYXMgZWZmZWN0aXZlIGBDQU5fTUFOQUdFYCBwZXJtaXNzaW9uLiBQZXJtaXNzaW9uIGxvb2t1cCBpc1xuICogaW50ZW50aW9uYWxseSBiZXN0LWVmZm9ydCBzbyBBcHBzIGVudmlyb25tZW50cyB0aGF0IGRvIG5vdCBleHBvc2UgdGhlXG4gKiByZXF1aXJlZCBBUElzIHNpbXBseSBvbWl0IHRoZSBkZWJ1ZyBhZmZvcmRhbmNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWxmbG93RXhwZXJpbWVudE1hbmFnZXJVcmwoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZU1sZmxvd0V4cGVyaW1lbnRNYW5hZ2VyVXJsKGNsaWVudCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU1sZmxvd0V4cGVyaW1lbnRNYW5hZ2VyVXJsKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGV4cGVyaW1lbnRJZCA9IGF3YWl0IHJlc29sdmVFeHBlcmltZW50SWQoY2xpZW50KTtcbiAgaWYgKCFleHBlcmltZW50SWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgW2N1cnJlbnRSZXNwb25zZSwgcGVybWlzc2lvbnNSZXNwb25zZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZGF0YWJyaWNrc0ZldGNoKGNsaWVudCwgXCIvYXBpLzIuMC9wcmV2aWV3L3NjaW0vdjIvTWVcIiwgeyBtZXRob2Q6IFwiR0VUXCIgfSksXG4gICAgZGF0YWJyaWNrc0ZldGNoKFxuICAgICAgY2xpZW50LFxuICAgICAgYC9hcGkvMi4wL3Blcm1pc3Npb25zL2V4cGVyaW1lbnRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGV4cGVyaW1lbnRJZCl9YCxcbiAgICAgIHsgbWV0aG9kOiBcIkdFVFwiIH0sXG4gICAgKSxcbiAgXSk7XG4gIGlmICghY3VycmVudFJlc3BvbnNlLm9rIHx8ICFwZXJtaXNzaW9uc1Jlc3BvbnNlLm9rKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGN1cnJlbnQgPSBDdXJyZW50VXNlclJlc3BvbnNlU2NoZW1hLnNhZmVQYXJzZShhd2FpdCByZWFkUmVzcG9uc2VKc29uKGN1cnJlbnRSZXNwb25zZSkpO1xuICBjb25zdCBwZXJtaXNzaW9ucyA9IEV4cGVyaW1lbnRQZXJtaXNzaW9uc1Jlc3BvbnNlU2NoZW1hLnNhZmVQYXJzZShcbiAgICBhd2FpdCByZWFkUmVzcG9uc2VKc29uKHBlcm1pc3Npb25zUmVzcG9uc2UpLFxuICApO1xuICBpZiAoIWN1cnJlbnQuc3VjY2VzcyB8fCAhcGVybWlzc2lvbnMuc3VjY2VzcykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCB1c2VyTmFtZXMgPSBuZXcgU2V0KFxuICAgIFtjdXJyZW50LmRhdGEudXNlck5hbWUsIGN1cnJlbnQuZGF0YS5hcHBsaWNhdGlvbklkLCBjdXJyZW50LmRhdGEuZGlzcGxheU5hbWVdLmZpbHRlcihcbiAgICAgICh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiBCb29sZWFuKHZhbHVlKSxcbiAgICApLFxuICApO1xuICBjb25zdCBncm91cE5hbWVzID0gbmV3IFNldChcbiAgICAoY3VycmVudC5kYXRhLmdyb3VwcyA/PyBbXSkuZmxhdE1hcCgoeyB2YWx1ZSwgZGlzcGxheSB9KSA9PlxuICAgICAgW3ZhbHVlLCBkaXNwbGF5XS5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgc3RyaW5nID0+IEJvb2xlYW4oZW50cnkpKSxcbiAgICApLFxuICApO1xuICBjb25zdCBjYW5NYW5hZ2UgPSAocGVybWlzc2lvbnMuZGF0YS5hY2Nlc3NfY29udHJvbF9saXN0ID8/IFtdKS5zb21lKChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IG1hdGNoZXMgPVxuICAgICAgKGVudHJ5LnVzZXJfbmFtZSAhPT0gdW5kZWZpbmVkICYmIHVzZXJOYW1lcy5oYXMoZW50cnkudXNlcl9uYW1lKSkgfHxcbiAgICAgIChlbnRyeS5zZXJ2aWNlX3ByaW5jaXBhbF9uYW1lICE9PSB1bmRlZmluZWQgJiYgdXNlck5hbWVzLmhhcyhlbnRyeS5zZXJ2aWNlX3ByaW5jaXBhbF9uYW1lKSkgfHxcbiAgICAgIChlbnRyeS5ncm91cF9uYW1lICE9PSB1bmRlZmluZWQgJiYgZ3JvdXBOYW1lcy5oYXMoZW50cnkuZ3JvdXBfbmFtZSkpO1xuICAgIHJldHVybiAoXG4gICAgICBtYXRjaGVzICYmXG4gICAgICAoZW50cnkuYWxsX3Blcm1pc3Npb25zID8/IFtdKS5zb21lKFxuICAgICAgICAocGVybWlzc2lvbikgPT4gcGVybWlzc2lvbi5wZXJtaXNzaW9uX2xldmVsID09PSBcIkNBTl9NQU5BR0VcIixcbiAgICAgIClcbiAgICApO1xuICB9KTtcbiAgaWYgKCFjYW5NYW5hZ2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgcmV0dXJuIG5ldyBVUkwoYC9tbC9leHBlcmltZW50cy8ke2VuY29kZVVSSUNvbXBvbmVudChleHBlcmltZW50SWQpfWAsIGhvc3QpLnRvU3RyaW5nKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoRXhwZXJpbWVudChcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4pOiBQcm9taXNlPHsgZXhwZXJpbWVudF9pZDogc3RyaW5nOyB0YWdzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGV4cGVyaW1lbnQgPSBjb25maWd1cmVkRXhwZXJpbWVudCgpO1xuICBjb25zdCBwYXRoID0gZXhwZXJpbWVudC5pZFxuICAgID8gYC9hcGkvMi4wL21sZmxvdy9leHBlcmltZW50cy9nZXQ/ZXhwZXJpbWVudF9pZD0ke2VuY29kZVVSSUNvbXBvbmVudChleHBlcmltZW50LmlkKX1gXG4gICAgOiBleHBlcmltZW50Lm5hbWVcbiAgICAgID8gYC9hcGkvMi4wL21sZmxvdy9leHBlcmltZW50cy9nZXQtYnktbmFtZT9leHBlcmltZW50X25hbWU9JHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICAgICAgZXhwZXJpbWVudC5uYW1lLFxuICAgICAgICApfWBcbiAgICAgIDogdW5kZWZpbmVkO1xuICBpZiAoIXBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZGF0YWJyaWNrc0ZldGNoKGNsaWVudCwgcGF0aCwgeyBtZXRob2Q6IFwiR0VUXCIgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhcnNlZCA9IE1sZmxvd0V4cGVyaW1lbnRSZXNwb25zZVNjaGVtYS5zYWZlUGFyc2UoYXdhaXQgcmVhZFJlc3BvbnNlSnNvbihyZXNwb25zZSkpO1xuICByZXR1cm4gcGFyc2VkLnN1Y2Nlc3MgPyBwYXJzZWQuZGF0YS5leHBlcmltZW50IDogdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRXhwZXJpbWVudElkKGNsaWVudDogV29ya3NwYWNlQ2xpZW50KTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY29uZmlndXJlZCA9IGNvbmZpZ3VyZWRFeHBlcmltZW50KCk7XG4gIGlmIChjb25maWd1cmVkLmlkKSByZXR1cm4gY29uZmlndXJlZC5pZDtcbiAgcmV0dXJuIChhd2FpdCBmZXRjaEV4cGVyaW1lbnQoY2xpZW50KSk/LmV4cGVyaW1lbnRfaWQ7XG59XG5cbi8qKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgbG9nRmVlZGJhY2t9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dGZWVkYmFja1BhcmFtcyB7XG4gIC8qKiBNTGZsb3cgdHJhY2UgaWQgdGhlIGFzc2Vzc21lbnQgYXR0YWNoZXMgdG8gKGB0ci08aGV4PmApLiAqL1xuICB0cmFjZUlkOiBzdHJpbmc7XG4gIC8qKiBBc3Nlc3NtZW50IG5hbWU7IGRlZmF1bHRzIHBlciB3aGV0aGVyIGEgdmFsdWUgb3IgYSBjb21tZW50IGlzIHNlbnQuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBUaHVtYnMgLyByYXRpbmcgLyBsYWJlbCB2YWx1ZS4gT21pdCBmb3IgYSBjb21tZW50LW9ubHkgc3VibWlzc2lvbi4gKi9cbiAgdmFsdWU/OiBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nO1xuICAvKiogRnJlZWZvcm0gY29tbWVudDogdGhlIHJhdGlvbmFsZSBhbG9uZ3NpZGUgYSB2YWx1ZSwgb3IgdGhlIHZhbHVlIGl0c2VsZiB3aGVuIG5vbmUuICovXG4gIGNvbW1lbnQ/OiBzdHJpbmc7XG4gIC8qKiBJZGVudGl0eSB0aGUgZmVlZGJhY2sgaXMgYXR0cmlidXRlZCB0byAodXNlciBlbWFpbCAvIGlkKS4gKi9cbiAgc291cmNlSWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogTG9nIGEgSFVNQU4gZmVlZGJhY2sgYXNzZXNzbWVudCB0byBhIHRyYWNlLiBSZXR1cm5zIHRoZSBjcmVhdGVkXG4gKiBhc3Nlc3NtZW50IGlkIG9uIHN1Y2Nlc3MsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHRyYWNlIGNhbid0IGJlXG4gKiBmb3VuZCAoZXZlbiBhZnRlciByZXRyeWluZyBmb3IgZXhwb3J0IGxhZykgb3IgdGhlIHJlcXVlc3Qgb3RoZXJ3aXNlXG4gKiBmYWlscyAtIGNhbGxlcnMgc3VyZmFjZSB0aGF0IGFzIGEgc29mdCBcIm5vdCByZWNvcmRlZFwiIHJhdGhlciB0aGFuIGFuXG4gKiBlcnJvciwga2VlcGluZyB0aGUgY2hhdCB1c2FibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2dGZWVkYmFjayhcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIHBhcmFtczogTG9nRmVlZGJhY2tQYXJhbXMsXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAvLyBBIGNvbW1lbnQgd2l0aCBubyB0aHVtYnMgdmFsdWUgaXMgbG9nZ2VkIGFzIHRleHQgZmVlZGJhY2s7IGEgdmFsdWVcbiAgLy8gKHdpdGggYW4gb3B0aW9uYWwgY29tbWVudCBhcyB0aGUgcmF0aW9uYWxlKSBpcyB0aGUgdGh1bWJzIHBhdGguXG4gIGNvbnN0IGhhc1ZhbHVlID0gcGFyYW1zLnZhbHVlICE9PSB1bmRlZmluZWQ7XG4gIGNvbnN0IG5hbWUgPVxuICAgIHBhcmFtcy5uYW1lPy50cmltKCkgfHxcbiAgICAoaGFzVmFsdWUgPyBmZWVkYmFjay5ERUZBVUxUX0ZFRURCQUNLX05BTUUgOiBmZWVkYmFjay5ERUZBVUxUX0NPTU1FTlRfTkFNRSk7XG4gIGNvbnN0IHZhbHVlID0gaGFzVmFsdWUgPyBwYXJhbXMudmFsdWUgOiBwYXJhbXMuY29tbWVudDtcbiAgY29uc3QgYXNzZXNzbWVudFRyYWNlSWQgPSBtbGZsb3dBc3Nlc3NtZW50VHJhY2VJZChcbiAgICBwYXJhbXMudHJhY2VJZCxcbiAgICBhd2FpdCByZXNvbHZlVWNUcmFjZVByZWZpeChjbGllbnQpLFxuICApO1xuICBjb25zdCBhc3Nlc3NtZW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICB0cmFjZV9pZDogYXNzZXNzbWVudFRyYWNlSWQsXG4gICAgYXNzZXNzbWVudF9uYW1lOiBuYW1lLFxuICAgIHNvdXJjZToge1xuICAgICAgc291cmNlX3R5cGU6IFwiSFVNQU5cIixcbiAgICAgIHNvdXJjZV9pZDogcGFyYW1zLnNvdXJjZUlkPy50cmltKCkgfHwgXCJ1c2VyXCIsXG4gICAgfSxcbiAgICBmZWVkYmFjazogeyB2YWx1ZSB9LFxuICAgIC4uLihoYXNWYWx1ZSAmJiBwYXJhbXMuY29tbWVudD8udHJpbSgpID8geyByYXRpb25hbGU6IHBhcmFtcy5jb21tZW50IH0gOiB7fSksXG4gIH07XG4gIGNvbnN0IGJvZHkgPSB7IGFzc2Vzc21lbnQgfTtcblxuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSBOT1RfRk9VTkRfUkVUUklFUzsgYXR0ZW1wdCsrKSB7XG4gICAgbGV0IHJlczogUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IGF3YWl0IGRhdGFicmlja3NGZXRjaChjbGllbnQsIGFzc2Vzc21lbnRzUGF0aChhc3Nlc3NtZW50VHJhY2VJZCksIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgYm9keSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLndhcm4oXCJmZWVkYmFjayByZXF1ZXN0IGZhaWxlZFwiLCB7XG4gICAgICAgIHRyYWNlSWQ6IHBhcmFtcy50cmFjZUlkLFxuICAgICAgICBhc3Nlc3NtZW50VHJhY2VJZCxcbiAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChyZXMub2spIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IGF3YWl0IHJlYWRSZXNwb25zZUpzb24ocmVzKTtcbiAgICAgIGNvbnN0IGFzc2Vzc21lbnRJZCA9XG4gICAgICAgIChwYXJzZWQgYXMgeyBhc3Nlc3NtZW50PzogeyBhc3Nlc3NtZW50X2lkPzogdW5rbm93biB9IH0pPy5hc3Nlc3NtZW50Py5hc3Nlc3NtZW50X2lkID8/XG4gICAgICAgIChwYXJzZWQgYXMgeyBhc3Nlc3NtZW50X2lkPzogdW5rbm93biB9KT8uYXNzZXNzbWVudF9pZDtcbiAgICAgIHJldHVybiB0eXBlb2YgYXNzZXNzbWVudElkID09PSBcInN0cmluZ1wiID8gYXNzZXNzbWVudElkIDogXCJcIjtcbiAgICB9XG4gICAgLy8gVHJhY2UgZXhwb3J0IGlzIGFzeW5jOyBhIGZyZXNoIHRyYWNlIG1heSBub3QgZXhpc3QgeWV0LiBSZXRyeSBhXG4gICAgLy8gZmV3IHRpbWVzIHdpdGggYSBzaG9ydCBiYWNrb2ZmIGJlZm9yZSBnaXZpbmcgdXAgc29mdGx5LlxuICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDQgJiYgYXR0ZW1wdCA8IE5PVF9GT1VORF9SRVRSSUVTKSB7XG4gICAgICBhd2FpdCBhc3luY1V0aWxzLnNsZWVwKE5PVF9GT1VORF9CQUNLT0ZGX01TICogKGF0dGVtcHQgKyAxKSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgbG9nZ2VyLndhcm4oXCJmZWVkYmFjayBub3QgcmVjb3JkZWRcIiwge1xuICAgICAgdHJhY2VJZDogcGFyYW1zLnRyYWNlSWQsXG4gICAgICBhc3Nlc3NtZW50VHJhY2VJZCxcbiAgICAgIHN0YXR1czogcmVzLnN0YXR1cyxcbiAgICAgIGJvZHk6IGF3YWl0IHJlYWRSZXNwb25zZVRleHQocmVzKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
|
package/lib/src/server.js
CHANGED
|
@@ -224,6 +224,8 @@ export class MastraServer extends ExpressMastraServer {
|
|
|
224
224
|
configureMlflowTraceId(res) {
|
|
225
225
|
if (!this.feedbackEnabled || res.headersSent)
|
|
226
226
|
return;
|
|
227
|
+
if (res.getHeader(feedback.MLFLOW_TRACE_ID_HEADER))
|
|
228
|
+
return;
|
|
227
229
|
const traceId = trace.getActiveSpan()?.spanContext().traceId;
|
|
228
230
|
if (!traceId || traceId === INVALID_TRACE_ID)
|
|
229
231
|
return;
|
|
@@ -376,4 +378,4 @@ export function attachRoutePatchMiddleware(app) {
|
|
|
376
378
|
next();
|
|
377
379
|
});
|
|
378
380
|
}
|
|
379
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsY0FBYyxHQUNmLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLFlBQVksSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUczQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLGVBQWUsRUFDZixvQkFBb0IsR0FHckIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFckQsT0FBTyxFQUNMLG9CQUFvQixFQUNwQix5QkFBeUIsRUFDekIsb0JBQW9CLEdBQ3JCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCOzs7OztHQUtHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLE1BQU0sNEJBQTRCLEdBQUc7SUFDbkMsc0JBQXNCO0lBQ3RCLG9CQUFvQjtJQUNwQixlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLHFC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QUksRUFBRSxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztRQUMzQixJQUFJLEVBQUUsQ0FBQztJQUNULENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXhwcmVzcy1sYXllciBwbHVtYmluZyBmb3IgdGhlIE1hc3RyYSBwbHVnaW46IGEgYE1hc3RyYVNlcnZlcmAgdGhhdFxuICogc3RhbXBzIHRoZSBwZXItcmVxdWVzdCBgUmVxdWVzdENvbnRleHRgIGFuZCBhIHNjb3BlZCBuYXRpdmUgQVBJIGdhdGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBoYXNoLCBodHRwLCBsb2csIG9iamVjdCwgc3RyaW5nVXRpbHMsIHRva2VuIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGZlZWRiYWNrLCB0aHJlYWQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQge1xuICBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLFxuICBNQVNUUkFfVEhSRUFEX0lEX0tFWSxcbiAgUmVxdWVzdENvbnRleHQsXG59IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBNYXN0cmFTZXJ2ZXIgYXMgRXhwcmVzc01hc3RyYVNlcnZlciB9IGZyb20gXCJAbWFzdHJhL2V4cHJlc3NcIjtcbmltcG9ydCB7IHRyYWNlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQge1xuICBhdHRyaWJ1dGVkVXNlcklkLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9VU0VSX0tFWSxcbiAgTUFTVFJBX1VTRVJfTkFNRV9LRVksXG4gIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnLFxuICB0eXBlIFVzZXIsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgcmVxdWVzdFVzZXJFbWFpbCwgcmVxdWVzdFVzZXJJZCB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlRmVlZGJhY2tFbmFibGVkIH0gZnJvbSBcIi4vbWxmbG93LnRzXCI7XG5cbmltcG9ydCB7XG4gIGV4dHJhY3RNb2RlbE92ZXJyaWRlLFxuICBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLFxuICByZXNvbHZlU2VydmluZ0NvbmZpZyxcbn0gZnJvbSBcIi4vc2VydmluZy50c1wiO1xuLyoqXG4gKiBPcGVuVGVsZW1ldHJ5J3Mgc2VudGluZWwgZm9yIFwibm8gdmFsaWQgdHJhY2VcIiAtIDMyIHplcm8gaGV4IGNoYXJzLlxuICogYHRyYWNlLmdldEFjdGl2ZVNwYW4oKWAgcmV0dXJucyBhIG5vbi1yZWNvcmRpbmcgc3BhbiB3aXRoIHRoaXMgaWRcbiAqIHdoZW4gbm8gU0RLIGlzIHJlZ2lzdGVyZWQsIHdoaWNoIG11c3QgbmV2ZXIgYmUgc3VyZmFjZWQgYXMgYSB0cmFjZSB0b1xuICogYXR0YWNoIGZlZWRiYWNrIHRvLlxuICovXG5jb25zdCBJTlZBTElEX1RSQUNFX0lEID0gXCIwXCIucmVwZWF0KDMyKTtcbmNvbnN0IFRSVVNURURfUkVRVUVTVF9DT05URVhUX0tFWVMgPSBbXG4gIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksXG4gIE1BU1RSQV9USFJFQURfSURfS0VZLFxuICBNQVNUUkFfVVNFUl9LRVksXG4gIE1BU1RSQV9VU0VSX05BTUVfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9SRVFVRVNUX0lEX0tFWSxcbiAgTUFTVFJBX1NDT1BFU19LRVksXG4gIE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVksXG5dIGFzIGNvbnN0O1xuXG4vKiogUmVtb3ZlIGJyb3dzZXItc3VwcGxpZWQgdmFsdWVzIGZvciBmaWVsZHMgb3duZWQgYnkgdHJ1c3RlZCBzZXJ2ZXIgbWlkZGxld2FyZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclRydXN0ZWRSZXF1ZXN0Q29udGV4dChyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgVFJVU1RFRF9SRVFVRVNUX0NPTlRFWFRfS0VZUykge1xuICAgIHJlcXVlc3RDb250ZXh0LmRlbGV0ZVJhdyhrZXkpO1xuICB9XG59XG5cbi8qKlxuICogV2hvIGEgdHVybiBpcyBBVFRSSUJVVEVEIHRvLCBpbmRlcGVuZGVudCBvZiB3aGljaCBEYXRhYnJpY2tzIGNyZWRlbnRpYWwgcnVuc1xuICogaXRzIGNhbGxzLiBTdXBwbGllZCBieSB0aGUgSFRUUCBtaWRkbGV3YXJlIGZyb20gdGhlIGZvcndhcmRlZCB1c2VyIGhlYWRlcnMgc29cbiAqIHRoYXQgaW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIC0gd2hlcmUgZXZlcnkgcmVxdWVzdCBzaGFyZXMgdGhlIGFwcCBTUCdzXG4gKiBjbGllbnQgLSB0aGUgbWVtb3J5IHRocmVhZCwgcGVyLXVzZXIgY2FjaGUgbmFtZXNwYWNlLCBhbmQgdHJhY2UgbWV0YWRhdGFcbiAqIHN0aWxsIGtleSBvZmYgdGhlIHJlYWwgY2FsbGVyLiBJZ25vcmVkIGluIGFuIE9CTyAodXNlcikgY29udGV4dCwgd2hvc2Ugb3duXG4gKiB1c2VyIGlkIC8gZW1haWwgYXJlIGF1dGhvcml0YXRpdmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXR0cmlidXRlZElkZW50aXR5IHtcbiAgLyoqIEZvcndhcmRlZCBgeC1mb3J3YXJkZWQtdXNlcmAgaWQsIHVzZWQgd2hlbiB0aGUgY2xpZW50IGlzIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC4gKi9cbiAgdXNlcklkPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogRm9yd2FyZGVkIGB4LWZvcndhcmRlZC1lbWFpbGAsIHVzZWQgZm9yIHRyYWNlIG1ldGFkYXRhIHVuZGVyIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC4gKi9cbiAgZW1haWw/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU3RhbXAgdGhlIEFwcEtpdCB1c2VyIChwbHVzIHRoZSByZXNvdXJjZSBpZCBhbmQgdHJhY2UgbWV0YWRhdGEpIG9udG9cbiAqIGByZXF1ZXN0Q29udGV4dGAuXG4gKlxuICogU3BsaXQgb3V0IG9mIHtAbGluayBNYXN0cmFTZXJ2ZXJ9IGJlY2F1c2UgdGhlIEhUVFAgbWlkZGxld2FyZSBpcyBub3QgdGhlIG9ubHlcbiAqIGNhbGxlciB0aGF0IG5lZWRzIGl0OiBhbiBvdXQtb2YtYmFuZCB0dXJuIChhIFRlYW1zIGFjdGl2aXR5IGFycml2aW5nIG9uXG4gKiBhbm90aGVyIHBsdWdpbidzIHJvdXRlLCBhIHNjaGVkdWxlZCBqb2IpIGRyaXZlcyBgYWdlbnQuZ2VuZXJhdGVgIGRpcmVjdGx5LCBhbmRcbiAqIHdpdGhvdXQgdGhpcyBzdGFtcCBldmVyeSB1c2VyLXNjb3BlZCB0b29sIC0gYGFza19nZW5pZWAgYWJvdmUgYWxsIC0gZmFpbHMgd2l0aFxuICogXCJpbnZva2UgdGhlIHRvb2wgZnJvbSBhbiBhZ2VudCB0dXJuIHNlcnZlZCBieSB0aGUgbWFzdHJhIHBsdWdpblwiLiBUaG9zZVxuICogY2FsbGVycyBidWlsZCBhIGNvbnRleHQgd2l0aCB7QGxpbmsgY3JlYXRlUmVxdWVzdENvbnRleHR9IGluc3RlYWQgb2YgYVxuICogcmVxdWVzdC5cbiAqXG4gKiBUaGUgRGF0YWJyaWNrcyBjcmVkZW50aWFsIGFsd2F5cyBjb21lcyBmcm9tIHRoZSBhbWJpZW50IGV4ZWN1dGlvbiBjb250ZXh0O1xuICogYGF0dHJpYnV0ZWRgIG9ubHkgY2hhbmdlcyBXSE8gdGhlIHR1cm4gaXMgYXR0cmlidXRlZCB0byB3aGVuIHRoYXQgY29udGV4dCBpc1xuICogdGhlIHNlcnZpY2UgcHJpbmNpcGFsIChzZWUge0BsaW5rIEF0dHJpYnV0ZWRJZGVudGl0eX0pLlxuICpcbiAqIElkZW1wb3RlbnQ6IHJldHVybnMgaW1tZWRpYXRlbHkgd2hlbiB0aGUgdXNlciBhbmQgcmVzb3VyY2UgaWQgYXJlIGFscmVhZHlcbiAqIHByZXNlbnQsIHNvIHRoZSBtaWRkbGV3YXJlIGNhbiBjYWxsIGl0IG92ZXIgYSBjb250ZXh0IGFub3RoZXIgbGF5ZXIgc3RhbXBlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YW1wUmVxdWVzdENvbnRleHRVc2VyKFxuICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQsXG4gIGF0dHJpYnV0ZWQ6IEF0dHJpYnV0ZWRJZGVudGl0eSA9IHt9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChbTUFTVFJBX1VTRVJfS0VZLCBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZXS5ldmVyeSgoa2V5KSA9PiByZXF1ZXN0Q29udGV4dC5nZXQoa2V5KSkpIHJldHVybjtcbiAgY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgY29uc3QgaXNVc2VyQ29udGV4dCA9IFwiaXNVc2VyQ29udGV4dFwiIGluIGV4ZWN1dGlvbkNvbnRleHQ7XG4gIC8vIFRoZSBEYXRhYnJpY2tzIENSRURFTlRJQUwgaXMgYWx3YXlzIHRoZSBhbWJpZW50IGV4ZWN1dGlvbiBjb250ZXh0J3MgY2xpZW50XG4gIC8vIChPQk8gaW4gYSB1c2VyIGNvbnRleHQsIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCBvdGhlcndpc2UpLiBXSE8gdGhlIHR1cm4gaXNcbiAgLy8gYXR0cmlidXRlZCB0byBjYW4gZGlmZmVyOiBpbiBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgZXZlcnkgcmVxdWVzdCBzaGFyZXNcbiAgLy8gdGhlIFNQIGNsaWVudCwgYnV0IHRoZSBmb3J3YXJkZWQgdXNlciBpZCBtdXN0IHN0aWxsIGtleSB0aGUgbWVtb3J5IHRocmVhZFxuICAvLyBhbmQgdGhlIHBlci11c2VyIGNhY2hlIG5hbWVzcGFjZSBzbyB0d28gY2FsbGVycyBkb24ndCBzaGFyZSBhIGNvbnZlcnNhdGlvbi5cbiAgY29uc3QgdXNlcjogVXNlciA9IHtcbiAgICBpZDogYXR0cmlidXRlZFVzZXJJZChleGVjdXRpb25Db250ZXh0LCBhdHRyaWJ1dGVkLnVzZXJJZCksXG4gICAgZXhlY3V0aW9uQ29udGV4dCxcbiAgfTtcbiAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9VU0VSX0tFWSwgdXNlcik7XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCB1c2VyLmlkKTtcbiAgLy8gQXBwS2l0J3MgYFVzZXJDb250ZXh0YCBzdXJmYWNlcyBkaXNwbGF5IG5hbWUgLyBlbWFpbCBvbmx5IG9uXG4gIC8vIE9CTyByZXF1ZXN0cy4gU2VydmljZS1jb250ZXh0IGNhbGxzIChiYWNrZ3JvdW5kIHRhc2tzLCBzZXJ2ZXJcbiAgLy8gc3RhcnQtdXApIGxlYXZlIHRoZXNlIHVuZGVmaW5lZCBhbmQgd2Ugc2tpcCB0aGUgc3RhbXAgc29cbiAgLy8gZG93bnN0cmVhbSB0cmFjZSBtZXRhZGF0YSBzdGF5cyBhYnNlbnQgcmF0aGVyIHRoYW4gZW1wdHkuIEluXG4gIC8vIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSB0aGUgZm9yd2FyZGVkIGVtYWlsIHN0aWxsIGlkZW50aWZpZXMgdGhlIGNhbGxlcixcbiAgLy8gc28gaXQgaXMgdXNlZCBmb3IgdHJhY2UgbWV0YWRhdGEgZXZlbiB0aG91Z2ggdGhlIGNsaWVudCBpcyB0aGUgU1AuXG4gIGxldCB1c2VyTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgZW1haWw6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGF0dHJpYnV0ZWQuZW1haWw7XG4gIGlmIChpc1VzZXJDb250ZXh0KSB7XG4gICAgdXNlck5hbWUgPSBleGVjdXRpb25Db250ZXh0LnVzZXJOYW1lO1xuICAgIGVtYWlsID0gZXhlY3V0aW9uQ29udGV4dC51c2VyRW1haWwgPz8gZW1haWw7XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gYXdhaXQgZXhlY3V0aW9uQ29udGV4dC5jbGllbnQuY3VycmVudFVzZXIubWUoKTtcbiAgICB1c2VyTmFtZSA9IGN1cnJlbnRVc2VyPy51c2VyTmFtZTtcbiAgICBlbWFpbCA9IGN1cnJlbnRVc2VyPy5lbWFpbHM/LmZpbHRlcigoZW1haWwpID0+IGVtYWlsLnByaW1hcnkpLmZpbmQoKGVtYWlsKSA9PiBlbWFpbC52YWx1ZSlcbiAgICAgID8udmFsdWUgYXMgc3RyaW5nO1xuICB9XG4gIGlmICh1c2VyTmFtZSkge1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVVNFUl9OQU1FX0tFWSwgdXNlck5hbWUpO1xuICB9XG4gIGlmIChlbWFpbCkge1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVVNFUl9FTUFJTF9LRVksIGVtYWlsKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBgUmVxdWVzdENvbnRleHRgIGEgTk9OLUhUVFAgYWdlbnQgdHVybiBuZWVkcy5cbiAqXG4gKiBFdmVyeXRoaW5nIE1hc3RyYSdzIHRvb2xzIHJlYWQgb2ZmIHRoZSBjb250ZXh0IGlzIHN0YW1wZWQgdGhlIHNhbWUgd2F5IHRoZVxuICogcmVxdWVzdCBtaWRkbGV3YXJlIHN0YW1wcyBpdCAtIHRoZSBBcHBLaXQgdXNlciAoc28gYGFza19nZW5pZWAgYW5kIHRoZSBtb2RlbFxuICogcmVzb2x2ZXIgY2FuIG1pbnQgdXNlci1zY29wZWQgdG9rZW5zKSwgdGhlIG1lbW9yeSB0aHJlYWQgLyByZXNvdXJjZSBwYWlyLCBhbmRcbiAqIGEgcmVxdWVzdCBpZCBzbyB0aGUgdHVybidzIHNwYW5zIGpvaW4gdXAgaW4gdHJhY2VzLiBUaGUgcmVzdWx0IGlzIHBhc3NlZCBhc1xuICogYHJlcXVlc3RDb250ZXh0YCB0byBgYWdlbnQuZ2VuZXJhdGVgIC8gYGFnZW50LnN0cmVhbWAuXG4gKlxuICogVGhpcyBpcyB3aGF0IG1ha2VzIGEgY2FyZCB0dXJuIGFuc3dlciB3aXRoIHRoZSBTQU1FIGRhdGEgYSBjaGF0IHR1cm4gZG9lczogdGhlXG4gKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBlbmRwb2ludHMgaXMgcHJlc2VudGF0aW9uLCBub3QgY2FwYWJpbGl0eS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RDb250ZXh0KFxuICBvcHRpb25zOiB7IHRocmVhZElkPzogc3RyaW5nOyByZXNvdXJjZUlkPzogc3RyaW5nOyByZXF1ZXN0SWQ/OiBzdHJpbmcgfSA9IHt9LFxuKTogUHJvbWlzZTxSZXF1ZXN0Q29udGV4dD4ge1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IG5ldyBSZXF1ZXN0Q29udGV4dCgpO1xuICBhd2FpdCBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcihyZXF1ZXN0Q29udGV4dCk7XG4gIGlmIChvcHRpb25zLnRocmVhZElkKSByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVksIG9wdGlvbnMudGhyZWFkSWQpO1xuICAvLyBTdGFtcGVkIEFGVEVSIHRoZSB1c2VyIHNvIGFuIGV4cGxpY2l0IHJlc291cmNlIGlkIChhIGNoYW5uZWwgbWVtYmVyLCBzYXkpXG4gIC8vIHdpbnMgb3ZlciB0aGUgYW1iaWVudCBpZGVudGl0eSBgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXJgIGRlZmF1bHRlZCB0by5cbiAgaWYgKG9wdGlvbnMucmVzb3VyY2VJZCkgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksIG9wdGlvbnMucmVzb3VyY2VJZCk7XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVRVUVTVF9JRF9LRVksIG9wdGlvbnMucmVxdWVzdElkID8/IGhhc2guaWQoKSk7XG4gIHJldHVybiByZXF1ZXN0Q29udGV4dDtcbn1cblxuLyoqXG4gKiBgQG1hc3RyYS9leHByZXNzYCBzdWJjbGFzcyB0aGF0IHN0YW1wcyBgUmVxdWVzdENvbnRleHRgIHdpdGggdGhlXG4gKiBBcHBLaXQgdXNlciwgcmVzb3VyY2UgaWQsIGFuZCBhIHRocmVhZCBpZCBiYWNrZWQgYnkgYW4gSFRUUC1vbmx5XG4gKiBzZXNzaW9uIGNvb2tpZSAoYGFwcGtpdF88cGx1Z2luLW5hbWU+X3Nlc3Npb25faWRgKS5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hc3RyYVNlcnZlciBleHRlbmRzIEV4cHJlc3NNYXN0cmFTZXJ2ZXIge1xuICBwcml2YXRlIGxvZzogbG9nLkxvZ2dlcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RhbXAgdGhlIE1MZmxvdyB0cmFjZS1pZCBoZWFkZXIgb24gcmVzcG9uc2VzLiBTaGFyZXMgdGhlXG4gICAqIHBsdWdpbidzIGZlZWRiYWNrIGdhdGUgdmlhIHtAbGluayByZXNvbHZlRmVlZGJhY2tFbmFibGVkfS5cbiAgICovXG4gIHByaXZhdGUgZmVlZGJhY2tFbmFibGVkOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gICAgLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBFeHByZXNzTWFzdHJhU2VydmVyPlxuICApIHtcbiAgICBzdXBlciguLi5hcmdzKTtcbiAgICB0aGlzLmxvZyA9IGxvZy5sb2dnZXIoY29uZmlnKTtcbiAgICB0aGlzLmZlZWRiYWNrRW5hYmxlZCA9IHJlc29sdmVGZWVkYmFja0VuYWJsZWQoY29uZmlnLmZlZWRiYWNrKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlZ2lzdGVyQXV0aE1pZGRsZXdhcmUoKTogdm9pZCB7XG4gICAgc3VwZXIucmVnaXN0ZXJBdXRoTWlkZGxld2FyZSgpO1xuICAgIHRoaXMuYXBwLnVzZShhc3luYyAocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gcmVzLmxvY2Fscy5yZXF1ZXN0Q29udGV4dCEgYXMgUmVxdWVzdENvbnRleHQ7XG4gICAgICBjbGVhclRydXN0ZWRSZXF1ZXN0Q29udGV4dChyZXF1ZXN0Q29udGV4dCk7XG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VXNlcihyZXEsIHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIHRoaXMuY29uZmlndXJlUmVxdWVzdENvbnRleHRUaHJlYWRJZChyZXEsIHJlcywgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dE1vZGVsT3ZlcnJpZGUocmVxLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0UmVxdWVzdElkKHJlcSwgcmVzLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0U2NvcGVzKHJlcSwgcmVxdWVzdENvbnRleHQpO1xuXG4gICAgICB0aGlzLmNvbmZpZ3VyZU1sZmxvd1RyYWNlSWQocmVzKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFwiYXV0aDptaWRkbGV3YXJlXCIsIHtcbiAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgcmVxdWVzdElkOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1JFUVVFU1RfSURfS0VZKSxcbiAgICAgICAgdGhyZWFkSWQ6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSksXG4gICAgICAgIHJlc291cmNlSWQ6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKSxcbiAgICAgICAgdXNlck5hbWU6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9OQU1FX0tFWSksXG4gICAgICAgIHVzZXJFbWFpbDogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX0VNQUlMX0tFWSksXG4gICAgICAgIG1vZGVsT3ZlcnJpZGU6IHJlcXVlc3RDb250ZXh0LmdldChcbiAgICAgICAgICAvLyBpbXBvcnRlZCBiZWxvdzsgbG9nZ2VkIHNvIGEgbWlzcm91dGVkIHJlcXVlc3Qgc2hvd3NcbiAgICAgICAgICAvLyB1cCBhbG9uZ3NpZGUgaXRzIG1vZGVsIHNlbGVjdGlvbiBpbiBgTE9HX0xFVkVMPWRlYnVnYC5cbiAgICAgICAgICBcIm1hc3RyYV9fbW9kZWxfb3ZlcnJpZGVcIixcbiAgICAgICAgKSxcbiAgICAgIH0pO1xuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgY29uZmlndXJlUmVxdWVzdENvbnRleHRVc2VyKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpIHtcbiAgICAvLyBQYXNzIHRoZSBmb3J3YXJkZWQgY2FsbGVyIGlkZW50aXR5IHNvIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSBzdGlsbCBrZXlzXG4gICAgLy8gbWVtb3J5IC8gY2FjaGUgLyB0cmFjZXMgcGVyIHVzZXIgZXZlbiB0aG91Z2ggdGhlIGNsaWVudCBpcyB0aGUgYXBwIFNQLlxuICAgIC8vIEluIGFuIE9CTyBjb250ZXh0IHRoZXNlIGFyZSBpZ25vcmVkIGluIGZhdm9yIG9mIHRoZSBjb250ZXh0J3Mgb3duIHVzZXIuXG4gICAgYXdhaXQgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXIocmVxdWVzdENvbnRleHQsIHtcbiAgICAgIHVzZXJJZDogcmVxdWVzdFVzZXJJZChyZXEpLFxuICAgICAgZW1haWw6IHJlcXVlc3RVc2VyRW1haWwocmVxKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFtcCBhIHBlci1yZXF1ZXN0IGlkIGFuZCBlY2hvIGl0IG9uIHRoZSByZXNwb25zZSBzbyBhbiB1cHN0cmVhbVxuICAgKiBwcm94eSAvIGN1cmwgY2xpZW50IC8gYnJvd3Nlci1zaWRlIGxvZyBsaW5lIGNhbiBwYWlyIGl0cyB2aWV3IG9mXG4gICAqIHRoZSByZXF1ZXN0IHdpdGggdGhlIG1hdGNoaW5nIHRyYWNlIHNwYW4uIFJldXNlcyBgWC1SZXF1ZXN0LUlkYFxuICAgKiB3aGVuIHRoZSB1cHN0cmVhbSBhbHJlYWR5IHN1cHBsaWVzIG9uZSBzbyBtdWx0aS1ob3AgdHJhY2VzIHN0YXlcbiAgICogam9pbmVkOyBvdGhlcndpc2UgbWludHMgYSBVVUlEdjQuXG4gICAqXG4gICAqIFRoZSBpZCBpcyBzdXJmYWNlZCBhcyBgbWFzdHJhX19yZXF1ZXN0SWRgIHNwYW4gbWV0YWRhdGEgdmlhXG4gICAqIHtAbGluayBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZU30gYW5kIGFzIHRoZSBgWC1SZXF1ZXN0LUlkYFxuICAgKiByZXNwb25zZSBoZWFkZXIgc28gZGV2IHRvb2xzIGNhbiBjb3B5IGl0IGZyb20gZWl0aGVyIHNpZGUuXG4gICAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFJlcXVlc3RJZChcbiAgICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICApIHtcbiAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSkpIHJldHVybjtcbiAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IHJlcS5oZWFkZXJzW1wieC1yZXF1ZXN0LWlkXCJdO1xuICAgIGNvbnN0IHVwc3RyZWFtID0gQXJyYXkuaXNBcnJheShoZWFkZXJWYWx1ZSkgPyBoZWFkZXJWYWx1ZVswXSA6IGhlYWRlclZhbHVlO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHVwc3RyZWFtPy50cmltKCkgfHwgaGFzaC5pZCgpO1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVRVUVTVF9JRF9LRVksIHJlcXVlc3RJZCk7XG4gICAgcmVzLnNldEhlYWRlcihcIlgtUmVxdWVzdC1JZFwiLCByZXF1ZXN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YW1wIE9BdXRoIHNjb3BlcyBmcm9tIHRoZSBmb3J3YXJkZWQgYWNjZXNzIHRva2VuIG9uXG4gICAqIHtAbGluayBNQVNUUkFfU0NPUEVTX0tFWX0gZm9yIHdvcmtzcGFjZSBtb3VudCBnYXRpbmcuXG4gICAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFNjb3BlcyhyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KSB7XG4gICAgY29uc3Qgc2NvcGVzID0gW1xuICAgICAgLi4ub2JqZWN0XG4gICAgICAgIC5zZXF1ZW5jZSh0b2tlbi5nZXRBY2Nlc3NUb2tlblNjb3BlcyhyZXEpLCB0b2tlbi5nZXRBY2Nlc3NUb2tlblNjb3BlcyhyZXEsIFwiYXV0aG9yaXphdGlvblwiKSlcbiAgICAgICAgLmRpc3RpbmN0KCksXG4gICAgXTtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1NDT1BFU19LRVksIHNjb3Blcyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhbXAgdGhlIHR1cm4ncyBNTGZsb3cgdHJhY2UgaWQgb24gdGhlIHJlc3BvbnNlIHNvIHRoZSBjaGF0IGNsaWVudFxuICAgKiBjYW4gYXR0YWNoIHRodW1icyAvIGNvbW1lbnQgZmVlZGJhY2sgdG8gaXQgbGF0ZXIuIE1MZmxvdyBkZXJpdmVzXG4gICAqIGl0cyB0cmFjZSBpZCBmcm9tIHRoZSBPcGVuVGVsZW1ldHJ5IHRyYWNlIGlkIChgdHItPGhleD5gKSwgYW5kIGV2ZXJ5XG4gICAqIE1hc3RyYSBzcGFuIGZvciB0aGlzIHJlcXVlc3QgaW5oZXJpdHMgdGhlIGFtYmllbnQgT1RlbCBjb250ZXh0IChzZWVcbiAgICogYG9ic2VydmFiaWxpdHkudHNgKSwgc28gdGhlIGFjdGl2ZSBzcGFuJ3MgdHJhY2UgaWQgaGVyZSBpcyB0aGUgaWRcbiAgICogTUxmbG93IHdpbGwgcmVjb3JkIGZvciB0aGUgdHVybi5cbiAgICpcbiAgICogTm8tb3AgdW5sZXNzIGZlZWRiYWNrIGlzIGVuYWJsZWQsIGFuZCB3aGVuIG5vIGxpdmUgT1RlbCBzcGFuIGlzXG4gICAqIGFjdGl2ZSAoZS5nLiB0aGUgT1RMUCBTREsgaXNuJ3QgcmVnaXN0ZXJlZCk6IGluIHRoYXQgY2FzZSB0aGUgaGVhZGVyXG4gICAqIGlzIHNpbXBseSBhYnNlbnQgYW5kIHRoZSBjbGllbnQgaGlkZXMgZmVlZGJhY2sgZm9yIHRoYXQgbWVzc2FnZSxcbiAgICogZGVncmFkaW5nIGdyYWNlZnVsbHkgcmF0aGVyIHRoYW4gZW1pdHRpbmcgYSBib2d1cyB0cmFjZSBpZC5cbiAgICovXG4gIGNvbmZpZ3VyZU1sZmxvd1RyYWNlSWQocmVzOiBleHByZXNzLlJlc3BvbnNlKSB7XG4gICAgaWYgKCF0aGlzLmZlZWRiYWNrRW5hYmxlZCB8fCByZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgICBjb25zdCB0cmFjZUlkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpPy5zcGFuQ29udGV4dCgpLnRyYWNlSWQ7XG4gICAgaWYgKCF0cmFjZUlkIHx8IHRyYWNlSWQgPT09IElOVkFMSURfVFJBQ0VfSUQpIHJldHVybjtcbiAgICByZXMuc2V0SGVhZGVyKGZlZWRiYWNrLk1MRkxPV19UUkFDRV9JRF9IRUFERVIsIGB0ci0ke3RyYWNlSWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgdGhyZWFkIGlkIHRoaXMgcmVxdWVzdCB0YXJnZXRzIGFuZCBwaW4gaXQgb25cbiAgICogYFJlcXVlc3RDb250ZXh0YCAoY29uc3VtZWQgYnkgdGhlIGFnZW50IHN0cmVhbSBmb3IgcGVyc2lzdGVuY2UgYW5kXG4gICAqIGJ5IG5hdGl2ZSBtZW1vcnkgcm91dGVzKS4gUmVzb2x1dGlvbiBvcmRlcjpcbiAgICpcbiAgICogICAxLiBBIGNsaWVudC1zdXBwbGllZCB0aHJlYWQgaWQgKHRoZSB0aHJlYWQtc2VsZWN0aW9uIGhlYWRlciAvXG4gICAqICAgICAgYD90aHJlYWRJZD1gIHF1ZXJ5KS4gVGhpcyBpcyBob3cgdGhlIGNoYXQgVUkgcmVmZXJlbmNlcyBhXG4gICAqICAgICAgc3BlY2lmaWMgY29udmVyc2F0aW9uIGFtb25nIHRoZSBtYW55IGEgdXNlciBvd25zIC0gaXQgcGlja3MgYVxuICAgKiAgICAgIHRocmVhZCBpZCBmcm9tIHRoZSBgL3RocmVhZHNgIGxpc3RpbmcgKG9yIG1pbnRzIG9uZSBmb3IgYSBuZXdcbiAgICogICAgICBjb252ZXJzYXRpb24pIGFuZCBzdGFtcHMgaXQgaGVyZS4gVGhlIGlkIGlzIHNjb3BlZCB0byB0aGVcbiAgICogICAgICBjYWxsZXIncyByZXNvdXJjZSBieSB0aGUgcmVjYWxsIC8gbGlzdCByb3V0ZXMsIHNvIGEgY2xpZW50XG4gICAqICAgICAgY2FuIG9ubHkgZXZlciByZWFkIG9yIHdyaXRlIGl0cyBvd24gdGhyZWFkcy5cbiAgICogICAyLiBUaGUgcGVyLXNlc3Npb24gY29va2llIChgYXBwa2l0XzxwbHVnaW4tbmFtZT5fc2Vzc2lvbl9pZGApLFxuICAgKiAgICAgIG1pbnRlZCBvbiBmaXJzdCBjb250YWN0LiBUaGlzIGlzIHRoZSBkZWZhdWx0IHNpbmdsZS10aHJlYWRcbiAgICogICAgICBmYWxsYmFjayBmb3IgY2xpZW50cyB0aGF0IGRvbid0IG1hbmFnZSB0aHJlYWRzIGV4cGxpY2l0bHksIHNvXG4gICAqICAgICAgZXhpc3RpbmcgZW1iZWRzIGtlZXAgb25lIHN0YWJsZSBjb252ZXJzYXRpb24gcGVyIHNlc3Npb24gd2l0aFxuICAgKiAgICAgIG5vIGNsaWVudCBjaGFuZ2VzLlxuICAgKi9cbiAgY29uZmlndXJlUmVxdWVzdENvbnRleHRUaHJlYWRJZChcbiAgICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICApIHtcbiAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9USFJFQURfSURfS0VZKSkgcmV0dXJuO1xuICAgIGNvbnN0IHJlcXVlc3RlZCA9IHRoaXMucmVhZFJlcXVlc3RlZFRocmVhZElkKHJlcSk7XG4gICAgaWYgKHJlcXVlc3RlZCkge1xuICAgICAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9USFJFQURfSURfS0VZLCByZXF1ZXN0ZWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb29raWVzID0gaHR0cC5wYXJzZUNvb2tpZXMocmVxLmhlYWRlcnMuY29va2llKTtcbiAgICBjb25zdCBjb29raWVOYW1lID0gc3RyaW5nVXRpbHMudG9JZGVudGlmaWVyV2l0aE9wdGlvbnMoXG4gICAgICB7IGRlbGltaXRlcjogXCJfXCIsIGRpc3RpbmN0OiB0cnVlIH0sXG4gICAgICBcImFwcGtpdFwiLFxuICAgICAgdGhpcy5jb25maWcubmFtZSEsXG4gICAgICBcInNlc3Npb25JZFwiLFxuICAgICk7XG4gICAgbGV0IHNlc3Npb25JZCA9IGNvb2tpZXNbY29va2llTmFtZV07XG4gICAgaWYgKCFzZXNzaW9uSWQpIHtcbiAgICAgIHNlc3Npb25JZCA9IGhhc2guaWQoKTtcbiAgICAgIHJlcy5jb29raWUoY29va2llTmFtZSwgc2Vzc2lvbklkLCB7XG4gICAgICAgIGh0dHBPbmx5OiB0cnVlLFxuICAgICAgICBzYW1lU2l0ZTogXCJsYXhcIixcbiAgICAgICAgc2VjdXJlOiByZXEuc2VjdXJlLFxuICAgICAgICBwYXRoOiBcIi9cIixcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVksIHNlc3Npb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgY2xpZW50LXNlbGVjdGVkIHRocmVhZCBpZCBmcm9tIHRoZSByZXF1ZXN0LCBwcmVmZXJyaW5nXG4gICAqIHRoZSB0aHJlYWQtc2VsZWN0aW9uIGhlYWRlciBvdmVyIHRoZSBgP3RocmVhZElkPWAgcXVlcnkuIFJldHVybnNcbiAgICogYG51bGxgIHdoZW4gbmVpdGhlciBjYXJyaWVzIGEgbm9uLWVtcHR5IHZhbHVlIHNvIHRoZSBjYWxsZXIgZmFsbHNcbiAgICogYmFjayB0byB0aGUgc2Vzc2lvbiBjb29raWUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRSZXF1ZXN0ZWRUaHJlYWRJZChyZXE6IGV4cHJlc3MuUmVxdWVzdCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGhlYWRlclZhbHVlID0gcmVxLmhlYWRlcnNbdGhyZWFkLlRIUkVBRF9JRF9IRUFERVJdO1xuICAgIGNvbnN0IHF1ZXJ5VmFsdWUgPSByZXEucXVlcnlbdGhyZWFkLlRIUkVBRF9JRF9RVUVSWV07XG4gICAgcmV0dXJuIChcbiAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoQXJyYXkuaXNBcnJheShoZWFkZXJWYWx1ZSkgPyBoZWFkZXJWYWx1ZVswXSA6IGhlYWRlclZhbHVlKSA/P1xuICAgICAgc3RyaW5nVXRpbHMudHJpbVRvTnVsbChBcnJheS5pc0FycmF5KHF1ZXJ5VmFsdWUpID8gcXVlcnlWYWx1ZVswXSA6IHF1ZXJ5VmFsdWUpXG4gICAgKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0TW9kZWxPdmVycmlkZShyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KSB7XG4gICAgLy8gUGVyLXJlcXVlc3QgbW9kZWwgb3ZlcnJpZGU6IG9ubHkgaG9ub3JlZCB3aGVuIHRoZSBwbHVnaW5cbiAgICAvLyBvcHRzIGluIChkZWZhdWx0KS4gU291cmNlcywgaW4gcHJpb3JpdHkgb3JkZXIsIGFyZVxuICAgIC8vIGBYLU1hc3RyYS1Nb2RlbGAgaGVhZGVyLCBgP21vZGVsPWAgcXVlcnksIGFuZCBgbW9kZWxgIC9cbiAgICAvLyBgbW9kZWxJZGAgYm9keSBmaWVsZDsgc2VlIGBzZXJ2aW5nLnRzYC5cbiAgICBjb25zdCBzZXJ2aW5nID0gcmVzb2x2ZVNlcnZpbmdDb25maWcodGhpcy5jb25maWcpO1xuICAgIGlmIChzZXJ2aW5nLmFsbG93T3ZlcnJpZGUpIHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gZXh0cmFjdE1vZGVsT3ZlcnJpZGUoe1xuICAgICAgICBoZWFkZXJzOiByZXEuaGVhZGVycyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4sXG4gICAgICAgIHF1ZXJ5OiByZXEucXVlcnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIGJvZHk6IHJlcS5ib2R5LFxuICAgICAgfSk7XG4gICAgICBpZiAob3ZlcnJpZGUpIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLCBvdmVycmlkZSk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBJbnB1dHMgZm9yIHtAbGluayBpc01hc3RyYVJlcXVlc3RBbGxvd2VkfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhQXBpR2F0ZU9wdGlvbnMge1xuICAvKiogYGNvbmZpZy5hcGlBY2Nlc3NgOyBgXCJmdWxsXCJgIHNob3J0LWNpcmN1aXRzIHRvIGFsbG93IGV2ZXJ5dGhpbmcuICovXG4gIGFjY2VzczogXCJzY29wZWRcIiB8IFwiZnVsbFwiO1xuICAvKiogV2hldGhlciB0aGUgTUNQIHRyYW5zcG9ydCBpcyBtb3VudGVkIChzbyBgL21jcC8qYCBpcyBsZWdpdGltYXRlKS4gKi9cbiAgbWNwRW5hYmxlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNb3VudC1yZWxhdGl2ZSBhZ2VudCBpbmZlcmVuY2UgcGF0aHMgKGAvYWdlbnRzLzppZC88dmVyYj4uLi5gKS4gTWF0Y2hlZFxuICogYnkgcHJlZml4IG9uIHRoZSB2ZXJiIHNvIGZ1dHVyZSB2YXJpYW50cyAoYHN0cmVhbVZOZXh0YCwgYHN0cmVhbS92bmV4dGAsXG4gKiBgZ2VuZXJhdGVWTmV4dGApIHN0YXkgY292ZXJlZCB3aXRob3V0IGEgY29kZSBjaGFuZ2UuXG4gKlxuICogQ292ZXJzIHRoZSBwbGFpbiBpbmZlcmVuY2UgdmVyYnMgKGBzdHJlYW1gIC8gYGdlbmVyYXRlYCAvIGBuZXR3b3JrYCkgcGx1c1xuICogdGhlIGh1bWFuLWluLXRoZS1sb29wIHJlc3VtZSB2ZXJicyBhIHBhdXNlZCBgcmVxdWlyZUFwcHJvdmFsYCB0b29sIG5lZWRzXG4gKiB0byBjb250aW51ZTogYGFwcHJvdmUtdG9vbC1jYWxsYCAvIGBkZWNsaW5lLXRvb2wtY2FsbGAgKHN0cmVhbWluZywgYW5kIHZpYVxuICogcHJlZml4IHRoZWlyIGAtZ2VuZXJhdGVgIG5vbi1zdHJlYW1pbmcgdmFyaWFudHMpLCB0aGUgYC1uZXR3b3JrLWAgdmFyaWFudHMsXG4gKiBhbmQgYHJlc3VtZS1zdHJlYW1gIChjb3ZlcnMgYHJlc3VtZS1zdHJlYW0tdW50aWwtaWRsZWApLiBXaXRob3V0IHRoZXNlIGFuXG4gKiBhcHByb3ZhbC1nYXRlZCB0b29sIChlLmcuIGBzZW5kX2VtYWlsYCkgY2FuIGJlIHJlcXVlc3RlZCBidXQgbmV2ZXIgYXBwcm92ZWRcbiAqIGZyb20gdGhlIGJyb3dzZXIgLSB0aGUgcmVzdW1lIGBQT1NUYCA0MDNzIHVuZGVyIHNjb3BlZCBtb2RlLiBUb2dldGhlciB3aXRoXG4gKiB0aGUgcmVzb3VyY2Utc2NvcGVkIG1lbW9yeSBtdXRhdGlvbnMgYmVsb3csIHRoZXNlIGFyZSB0aGUgb25seSBzdG9jayBNYXN0cmFcbiAqIHdyaXRlcyB0aGUgYnJvd3NlciBjbGllbnQgY2FuIG1ha2UuXG4gKi9cbmNvbnN0IEFHRU5UX0lORkVSRU5DRSA9XG4gIC9eXFwvYWdlbnRzXFwvW14vXStcXC8oc3RyZWFtfGdlbmVyYXRlfG5ldHdvcmt8cmVzdW1lLXN0cmVhbXxhcHByb3ZlLXRvb2wtY2FsbHxkZWNsaW5lLXRvb2wtY2FsbHxhcHByb3ZlLW5ldHdvcmstdG9vbC1jYWxsfGRlY2xpbmUtbmV0d29yay10b29sLWNhbGwpL2k7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEgKGAvYWdlbnRzYCwgYC9hZ2VudHMvOmlkYCkuICovXG5jb25zdCBBR0VOVF9NRVRBREFUQSA9IC9eXFwvYWdlbnRzKFxcL1teL10rKT8kLztcbi8qKiBQZXJzaXN0ZWQgYXBwcm92YWwgZGlzY292ZXJ5IGZvciBvbmUgYWdlbnQuICovXG5jb25zdCBBR0VOVF9TVVNQRU5ERURfUlVOUyA9IC9eXFwvYWdlbnRzXFwvW14vXStcXC9zdXNwZW5kZWQtcnVucyQvaTtcbi8qKiBPZmZpY2lhbCBBSSBTREsgVUkgc3RyZWFtIHJvdXRlLCBpbmNsdWRpbmcgYHJlc3VtZURhdGFgIGNvbnRpbnVhdGlvbnMuICovXG5jb25zdCBBR0VOVF9DSEFUID0gL15cXC9jaGF0XFwvW14vXSskL2k7XG4vKiogTmF0aXZlIHJlc291cmNlLXNjb3BlZCBtZW1vcnkgcmVhZHMgdXNlZCBieSBoaXN0b3J5IGFuZCB0aGUgdGhyZWFkIGxpc3QuICovXG5jb25zdCBNRU1PUllfUkVBRCA9IC9eXFwvbWVtb3J5XFwvdGhyZWFkcyg/OlxcL1teL10rKD86XFwvbWVzc2FnZXMpPyk/JC9pO1xuLyoqIE5hdGl2ZSB0aHJlYWQgcmVuYW1lL2RlbGV0ZSByb3V0ZXMuICovXG5jb25zdCBNRU1PUllfVEhSRUFEX01VVEFUSU9OID0gL15cXC9tZW1vcnlcXC90aHJlYWRzXFwvW14vXSskL2k7XG5cbi8qKlxuICogV2hldGhlciBhIHJlcXVlc3QgdG8gdGhlIHN0b2NrIGBAbWFzdHJhL2V4cHJlc3NgIHN1Yi1hcHAgc2hvdWxkIGJlXG4gKiBkaXNwYXRjaGVkLCBnaXZlbiB0aGUgY29uZmlndXJlZCB7QGxpbmsgTWFzdHJhQXBpR2F0ZU9wdGlvbnMuYWNjZXNzfS5cbiAqXG4gKiBgcGF0aGAgaXMgbW91bnQtcmVsYXRpdmUgKHdoYXQgdGhlIHBsdWdpbidzIGNhdGNoLWFsbCBzZWVzLCBlLmcuXG4gKiBgL2NoYXQveGAsIGAvbWVtb3J5L3RocmVhZHNgLCBgL21jcC8uLi5gKS4gSW4gYFwic2NvcGVkXCJgXG4gKiBtb2RlIHRoZSBhbGxvd2xpc3QgaXMgZGVsaWJlcmF0ZWx5IHRpZ2h0IC0gdGhlIGNoYXQgY2xpZW50IG9ubHkgZXZlclxuICogbmVlZHMgYWdlbnQgaW5mZXJlbmNlLCByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEsIHJlc291cmNlLXNjb3BlZCBtZW1vcnksXG4gKiB0aGlzIHBsdWdpbidzIG93biBgL3JvdXRlLypgIHJvdXRlcywgYW5kICh3aGVuIGVuYWJsZWQpIE1DUC4gVGhlIHJlbWFpbmluZ1xuICogYWRtaW4sIG11dGF0aW5nLCBhbmQgYnVsay1leHBvcnQgc3VyZmFjZSBzdGF5cyBkZW5pZWQgYnkgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWQoXG4gIG1ldGhvZDogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIG9wdHM6IE1hc3RyYUFwaUdhdGVPcHRpb25zLFxuKTogYm9vbGVhbiB7XG4gIGlmIChvcHRzLmFjY2VzcyA9PT0gXCJmdWxsXCIpIHJldHVybiB0cnVlO1xuICBjb25zdCBwID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gO1xuICAvLyBUaGUgcGx1Z2luJ3MgYC9yb3V0ZS8qYCBhZGRpdGlvbnMgdmFsaWRhdGUgdGhlaXIgb3duIGlucHV0cyBhbmQgdHJ1c3RlZFxuICAvLyBBcHBLaXQgcmVxdWVzdCBjb250ZXh0IGJlZm9yZSByZWFjaGluZyBwcm9kdWN0IGJlaGF2aW9yLlxuICBpZiAocCA9PT0gXCIvcm91dGVcIiB8fCBwLnN0YXJ0c1dpdGgoXCIvcm91dGUvXCIpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG9wdHMubWNwRW5hYmxlZCAmJiAocCA9PT0gXCIvbWNwXCIgfHwgcC5zdGFydHNXaXRoKFwiL21jcC9cIikpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgbSA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICBpZiAobSA9PT0gXCJQT1NUXCIgJiYgQUdFTlRfQ0hBVC50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiUE9TVFwiICYmIEFHRU5UX0lORkVSRU5DRS50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiR0VUXCIgJiYgKEFHRU5UX01FVEFEQVRBLnRlc3QocCkgfHwgQUdFTlRfU1VTUEVOREVEX1JVTlMudGVzdChwKSkpIHJldHVybiB0cnVlO1xuICBpZiAobSA9PT0gXCJHRVRcIiAmJiBNRU1PUllfUkVBRC50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKChtID09PSBcIlBBVENIXCIgfHwgbSA9PT0gXCJERUxFVEVcIikgJiYgTUVNT1JZX1RIUkVBRF9NVVRBVElPTi50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiUE9TVFwiICYmIHAgPT09IFwiL21lbW9yeS9tZXNzYWdlcy9kZWxldGVcIikgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBLZWVwIE1hc3RyYSBjdXN0b20gQVBJIHJvdXRlcyBtb3VudC1yZWxhdGl2ZSB3aGVuIHRoZSBFeHByZXNzIHN1YmFwcCBpc1xuICogaG9zdGVkIHVuZGVyIEFwcEtpdCdzIGAvYXBpLzxwbHVnaW4+YCBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0YWNoUm91dGVQYXRjaE1pZGRsZXdhcmUoYXBwOiBleHByZXNzLkV4cHJlc3MpOiB2b2lkIHtcbiAgYXBwLnVzZSgocmVxLCBfcmVzLCBuZXh0KSA9PiB7XG4gICAgY29uc3QgaXNDdXN0b21Sb3V0ZSA9XG4gICAgICByZXEucGF0aCA9PT0gXCIvY2hhdFwiIHx8XG4gICAgICByZXEucGF0aC5zdGFydHNXaXRoKFwiL2NoYXQvXCIpIHx8XG4gICAgICByZXEucGF0aCA9PT0gXCIvcm91dGVcIiB8fFxuICAgICAgcmVxLnBhdGguc3RhcnRzV2l0aChcIi9yb3V0ZS9cIik7XG4gICAgaWYgKCFpc0N1c3RvbVJvdXRlKSByZXR1cm4gbmV4dCgpO1xuICAgIHJlcS5vcmlnaW5hbFVybCA9IHJlcS5wYXRoO1xuICAgIG5leHQoKTtcbiAgfSk7XG59XG4iXX0=
|
|
381
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsY0FBYyxHQUNmLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLFlBQVksSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUczQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLGVBQWUsRUFDZixvQkFBb0IsR0FHckIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFckQsT0FBTyxFQUNMLG9CQUFvQixFQUNwQix5QkFBeUIsRUFDekIsb0JBQW9CLEdBQ3JCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCOzs7OztHQUtHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLE1BQU0sNEJBQTRCLEdBQUc7SUFDbkMsc0JBQXNCO0lBQ3RCLG9CQUFvQjtJQUNwQixlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLHFC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Q0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGFBQWE7WUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztRQUMzQixJQUFJLEVBQUUsQ0FBQztJQUNULENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXhwcmVzcy1sYXllciBwbHVtYmluZyBmb3IgdGhlIE1hc3RyYSBwbHVnaW46IGEgYE1hc3RyYVNlcnZlcmAgdGhhdFxuICogc3RhbXBzIHRoZSBwZXItcmVxdWVzdCBgUmVxdWVzdENvbnRleHRgIGFuZCBhIHNjb3BlZCBuYXRpdmUgQVBJIGdhdGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBoYXNoLCBodHRwLCBsb2csIG9iamVjdCwgc3RyaW5nVXRpbHMsIHRva2VuIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGZlZWRiYWNrLCB0aHJlYWQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQge1xuICBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLFxuICBNQVNUUkFfVEhSRUFEX0lEX0tFWSxcbiAgUmVxdWVzdENvbnRleHQsXG59IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBNYXN0cmFTZXJ2ZXIgYXMgRXhwcmVzc01hc3RyYVNlcnZlciB9IGZyb20gXCJAbWFzdHJhL2V4cHJlc3NcIjtcbmltcG9ydCB7IHRyYWNlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQge1xuICBhdHRyaWJ1dGVkVXNlcklkLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9VU0VSX0tFWSxcbiAgTUFTVFJBX1VTRVJfTkFNRV9LRVksXG4gIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnLFxuICB0eXBlIFVzZXIsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgcmVxdWVzdFVzZXJFbWFpbCwgcmVxdWVzdFVzZXJJZCB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlRmVlZGJhY2tFbmFibGVkIH0gZnJvbSBcIi4vbWxmbG93LnRzXCI7XG5cbmltcG9ydCB7XG4gIGV4dHJhY3RNb2RlbE92ZXJyaWRlLFxuICBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLFxuICByZXNvbHZlU2VydmluZ0NvbmZpZyxcbn0gZnJvbSBcIi4vc2VydmluZy50c1wiO1xuLyoqXG4gKiBPcGVuVGVsZW1ldHJ5J3Mgc2VudGluZWwgZm9yIFwibm8gdmFsaWQgdHJhY2VcIiAtIDMyIHplcm8gaGV4IGNoYXJzLlxuICogYHRyYWNlLmdldEFjdGl2ZVNwYW4oKWAgcmV0dXJucyBhIG5vbi1yZWNvcmRpbmcgc3BhbiB3aXRoIHRoaXMgaWRcbiAqIHdoZW4gbm8gU0RLIGlzIHJlZ2lzdGVyZWQsIHdoaWNoIG11c3QgbmV2ZXIgYmUgc3VyZmFjZWQgYXMgYSB0cmFjZSB0b1xuICogYXR0YWNoIGZlZWRiYWNrIHRvLlxuICovXG5jb25zdCBJTlZBTElEX1RSQUNFX0lEID0gXCIwXCIucmVwZWF0KDMyKTtcbmNvbnN0IFRSVVNURURfUkVRVUVTVF9DT05URVhUX0tFWVMgPSBbXG4gIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksXG4gIE1BU1RSQV9USFJFQURfSURfS0VZLFxuICBNQVNUUkFfVVNFUl9LRVksXG4gIE1BU1RSQV9VU0VSX05BTUVfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9SRVFVRVNUX0lEX0tFWSxcbiAgTUFTVFJBX1NDT1BFU19LRVksXG4gIE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVksXG5dIGFzIGNvbnN0O1xuXG4vKiogUmVtb3ZlIGJyb3dzZXItc3VwcGxpZWQgdmFsdWVzIGZvciBmaWVsZHMgb3duZWQgYnkgdHJ1c3RlZCBzZXJ2ZXIgbWlkZGxld2FyZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclRydXN0ZWRSZXF1ZXN0Q29udGV4dChyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgVFJVU1RFRF9SRVFVRVNUX0NPTlRFWFRfS0VZUykge1xuICAgIHJlcXVlc3RDb250ZXh0LmRlbGV0ZVJhdyhrZXkpO1xuICB9XG59XG5cbi8qKlxuICogV2hvIGEgdHVybiBpcyBBVFRSSUJVVEVEIHRvLCBpbmRlcGVuZGVudCBvZiB3aGljaCBEYXRhYnJpY2tzIGNyZWRlbnRpYWwgcnVuc1xuICogaXRzIGNhbGxzLiBTdXBwbGllZCBieSB0aGUgSFRUUCBtaWRkbGV3YXJlIGZyb20gdGhlIGZvcndhcmRlZCB1c2VyIGhlYWRlcnMgc29cbiAqIHRoYXQgaW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIC0gd2hlcmUgZXZlcnkgcmVxdWVzdCBzaGFyZXMgdGhlIGFwcCBTUCdzXG4gKiBjbGllbnQgLSB0aGUgbWVtb3J5IHRocmVhZCwgcGVyLXVzZXIgY2FjaGUgbmFtZXNwYWNlLCBhbmQgdHJhY2UgbWV0YWRhdGFcbiAqIHN0aWxsIGtleSBvZmYgdGhlIHJlYWwgY2FsbGVyLiBJZ25vcmVkIGluIGFuIE9CTyAodXNlcikgY29udGV4dCwgd2hvc2Ugb3duXG4gKiB1c2VyIGlkIC8gZW1haWwgYXJlIGF1dGhvcml0YXRpdmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXR0cmlidXRlZElkZW50aXR5IHtcbiAgLyoqIEZvcndhcmRlZCBgeC1mb3J3YXJkZWQtdXNlcmAgaWQsIHVzZWQgd2hlbiB0aGUgY2xpZW50IGlzIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC4gKi9cbiAgdXNlcklkPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogRm9yd2FyZGVkIGB4LWZvcndhcmRlZC1lbWFpbGAsIHVzZWQgZm9yIHRyYWNlIG1ldGFkYXRhIHVuZGVyIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC4gKi9cbiAgZW1haWw/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU3RhbXAgdGhlIEFwcEtpdCB1c2VyIChwbHVzIHRoZSByZXNvdXJjZSBpZCBhbmQgdHJhY2UgbWV0YWRhdGEpIG9udG9cbiAqIGByZXF1ZXN0Q29udGV4dGAuXG4gKlxuICogU3BsaXQgb3V0IG9mIHtAbGluayBNYXN0cmFTZXJ2ZXJ9IGJlY2F1c2UgdGhlIEhUVFAgbWlkZGxld2FyZSBpcyBub3QgdGhlIG9ubHlcbiAqIGNhbGxlciB0aGF0IG5lZWRzIGl0OiBhbiBvdXQtb2YtYmFuZCB0dXJuIChhIFRlYW1zIGFjdGl2aXR5IGFycml2aW5nIG9uXG4gKiBhbm90aGVyIHBsdWdpbidzIHJvdXRlLCBhIHNjaGVkdWxlZCBqb2IpIGRyaXZlcyBgYWdlbnQuZ2VuZXJhdGVgIGRpcmVjdGx5LCBhbmRcbiAqIHdpdGhvdXQgdGhpcyBzdGFtcCBldmVyeSB1c2VyLXNjb3BlZCB0b29sIC0gYGFza19nZW5pZWAgYWJvdmUgYWxsIC0gZmFpbHMgd2l0aFxuICogXCJpbnZva2UgdGhlIHRvb2wgZnJvbSBhbiBhZ2VudCB0dXJuIHNlcnZlZCBieSB0aGUgbWFzdHJhIHBsdWdpblwiLiBUaG9zZVxuICogY2FsbGVycyBidWlsZCBhIGNvbnRleHQgd2l0aCB7QGxpbmsgY3JlYXRlUmVxdWVzdENvbnRleHR9IGluc3RlYWQgb2YgYVxuICogcmVxdWVzdC5cbiAqXG4gKiBUaGUgRGF0YWJyaWNrcyBjcmVkZW50aWFsIGFsd2F5cyBjb21lcyBmcm9tIHRoZSBhbWJpZW50IGV4ZWN1dGlvbiBjb250ZXh0O1xuICogYGF0dHJpYnV0ZWRgIG9ubHkgY2hhbmdlcyBXSE8gdGhlIHR1cm4gaXMgYXR0cmlidXRlZCB0byB3aGVuIHRoYXQgY29udGV4dCBpc1xuICogdGhlIHNlcnZpY2UgcHJpbmNpcGFsIChzZWUge0BsaW5rIEF0dHJpYnV0ZWRJZGVudGl0eX0pLlxuICpcbiAqIElkZW1wb3RlbnQ6IHJldHVybnMgaW1tZWRpYXRlbHkgd2hlbiB0aGUgdXNlciBhbmQgcmVzb3VyY2UgaWQgYXJlIGFscmVhZHlcbiAqIHByZXNlbnQsIHNvIHRoZSBtaWRkbGV3YXJlIGNhbiBjYWxsIGl0IG92ZXIgYSBjb250ZXh0IGFub3RoZXIgbGF5ZXIgc3RhbXBlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YW1wUmVxdWVzdENvbnRleHRVc2VyKFxuICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQsXG4gIGF0dHJpYnV0ZWQ6IEF0dHJpYnV0ZWRJZGVudGl0eSA9IHt9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChbTUFTVFJBX1VTRVJfS0VZLCBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZXS5ldmVyeSgoa2V5KSA9PiByZXF1ZXN0Q29udGV4dC5nZXQoa2V5KSkpIHJldHVybjtcbiAgY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgY29uc3QgaXNVc2VyQ29udGV4dCA9IFwiaXNVc2VyQ29udGV4dFwiIGluIGV4ZWN1dGlvbkNvbnRleHQ7XG4gIC8vIFRoZSBEYXRhYnJpY2tzIENSRURFTlRJQUwgaXMgYWx3YXlzIHRoZSBhbWJpZW50IGV4ZWN1dGlvbiBjb250ZXh0J3MgY2xpZW50XG4gIC8vIChPQk8gaW4gYSB1c2VyIGNvbnRleHQsIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCBvdGhlcndpc2UpLiBXSE8gdGhlIHR1cm4gaXNcbiAgLy8gYXR0cmlidXRlZCB0byBjYW4gZGlmZmVyOiBpbiBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgZXZlcnkgcmVxdWVzdCBzaGFyZXNcbiAgLy8gdGhlIFNQIGNsaWVudCwgYnV0IHRoZSBmb3J3YXJkZWQgdXNlciBpZCBtdXN0IHN0aWxsIGtleSB0aGUgbWVtb3J5IHRocmVhZFxuICAvLyBhbmQgdGhlIHBlci11c2VyIGNhY2hlIG5hbWVzcGFjZSBzbyB0d28gY2FsbGVycyBkb24ndCBzaGFyZSBhIGNvbnZlcnNhdGlvbi5cbiAgY29uc3QgdXNlcjogVXNlciA9IHtcbiAgICBpZDogYXR0cmlidXRlZFVzZXJJZChleGVjdXRpb25Db250ZXh0LCBhdHRyaWJ1dGVkLnVzZXJJZCksXG4gICAgZXhlY3V0aW9uQ29udGV4dCxcbiAgfTtcbiAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9VU0VSX0tFWSwgdXNlcik7XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCB1c2VyLmlkKTtcbiAgLy8gQXBwS2l0J3MgYFVzZXJDb250ZXh0YCBzdXJmYWNlcyBkaXNwbGF5IG5hbWUgLyBlbWFpbCBvbmx5IG9uXG4gIC8vIE9CTyByZXF1ZXN0cy4gU2VydmljZS1jb250ZXh0IGNhbGxzIChiYWNrZ3JvdW5kIHRhc2tzLCBzZXJ2ZXJcbiAgLy8gc3RhcnQtdXApIGxlYXZlIHRoZXNlIHVuZGVmaW5lZCBhbmQgd2Ugc2tpcCB0aGUgc3RhbXAgc29cbiAgLy8gZG93bnN0cmVhbSB0cmFjZSBtZXRhZGF0YSBzdGF5cyBhYnNlbnQgcmF0aGVyIHRoYW4gZW1wdHkuIEluXG4gIC8vIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSB0aGUgZm9yd2FyZGVkIGVtYWlsIHN0aWxsIGlkZW50aWZpZXMgdGhlIGNhbGxlcixcbiAgLy8gc28gaXQgaXMgdXNlZCBmb3IgdHJhY2UgbWV0YWRhdGEgZXZlbiB0aG91Z2ggdGhlIGNsaWVudCBpcyB0aGUgU1AuXG4gIGxldCB1c2VyTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgZW1haWw6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGF0dHJpYnV0ZWQuZW1haWw7XG4gIGlmIChpc1VzZXJDb250ZXh0KSB7XG4gICAgdXNlck5hbWUgPSBleGVjdXRpb25Db250ZXh0LnVzZXJOYW1lO1xuICAgIGVtYWlsID0gZXhlY3V0aW9uQ29udGV4dC51c2VyRW1haWwgPz8gZW1haWw7XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gYXdhaXQgZXhlY3V0aW9uQ29udGV4dC5jbGllbnQuY3VycmVudFVzZXIubWUoKTtcbiAgICB1c2VyTmFtZSA9IGN1cnJlbnRVc2VyPy51c2VyTmFtZTtcbiAgICBlbWFpbCA9IGN1cnJlbnRVc2VyPy5lbWFpbHM/LmZpbHRlcigoZW1haWwpID0+IGVtYWlsLnByaW1hcnkpLmZpbmQoKGVtYWlsKSA9PiBlbWFpbC52YWx1ZSlcbiAgICAgID8udmFsdWUgYXMgc3RyaW5nO1xuICB9XG4gIGlmICh1c2VyTmFtZSkge1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVVNFUl9OQU1FX0tFWSwgdXNlck5hbWUpO1xuICB9XG4gIGlmIChlbWFpbCkge1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVVNFUl9FTUFJTF9LRVksIGVtYWlsKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBgUmVxdWVzdENvbnRleHRgIGEgTk9OLUhUVFAgYWdlbnQgdHVybiBuZWVkcy5cbiAqXG4gKiBFdmVyeXRoaW5nIE1hc3RyYSdzIHRvb2xzIHJlYWQgb2ZmIHRoZSBjb250ZXh0IGlzIHN0YW1wZWQgdGhlIHNhbWUgd2F5IHRoZVxuICogcmVxdWVzdCBtaWRkbGV3YXJlIHN0YW1wcyBpdCAtIHRoZSBBcHBLaXQgdXNlciAoc28gYGFza19nZW5pZWAgYW5kIHRoZSBtb2RlbFxuICogcmVzb2x2ZXIgY2FuIG1pbnQgdXNlci1zY29wZWQgdG9rZW5zKSwgdGhlIG1lbW9yeSB0aHJlYWQgLyByZXNvdXJjZSBwYWlyLCBhbmRcbiAqIGEgcmVxdWVzdCBpZCBzbyB0aGUgdHVybidzIHNwYW5zIGpvaW4gdXAgaW4gdHJhY2VzLiBUaGUgcmVzdWx0IGlzIHBhc3NlZCBhc1xuICogYHJlcXVlc3RDb250ZXh0YCB0byBgYWdlbnQuZ2VuZXJhdGVgIC8gYGFnZW50LnN0cmVhbWAuXG4gKlxuICogVGhpcyBpcyB3aGF0IG1ha2VzIGEgY2FyZCB0dXJuIGFuc3dlciB3aXRoIHRoZSBTQU1FIGRhdGEgYSBjaGF0IHR1cm4gZG9lczogdGhlXG4gKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBlbmRwb2ludHMgaXMgcHJlc2VudGF0aW9uLCBub3QgY2FwYWJpbGl0eS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RDb250ZXh0KFxuICBvcHRpb25zOiB7IHRocmVhZElkPzogc3RyaW5nOyByZXNvdXJjZUlkPzogc3RyaW5nOyByZXF1ZXN0SWQ/OiBzdHJpbmcgfSA9IHt9LFxuKTogUHJvbWlzZTxSZXF1ZXN0Q29udGV4dD4ge1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IG5ldyBSZXF1ZXN0Q29udGV4dCgpO1xuICBhd2FpdCBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcihyZXF1ZXN0Q29udGV4dCk7XG4gIGlmIChvcHRpb25zLnRocmVhZElkKSByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVksIG9wdGlvbnMudGhyZWFkSWQpO1xuICAvLyBTdGFtcGVkIEFGVEVSIHRoZSB1c2VyIHNvIGFuIGV4cGxpY2l0IHJlc291cmNlIGlkIChhIGNoYW5uZWwgbWVtYmVyLCBzYXkpXG4gIC8vIHdpbnMgb3ZlciB0aGUgYW1iaWVudCBpZGVudGl0eSBgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXJgIGRlZmF1bHRlZCB0by5cbiAgaWYgKG9wdGlvbnMucmVzb3VyY2VJZCkgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksIG9wdGlvbnMucmVzb3VyY2VJZCk7XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVRVUVTVF9JRF9LRVksIG9wdGlvbnMucmVxdWVzdElkID8/IGhhc2guaWQoKSk7XG4gIHJldHVybiByZXF1ZXN0Q29udGV4dDtcbn1cblxuLyoqXG4gKiBgQG1hc3RyYS9leHByZXNzYCBzdWJjbGFzcyB0aGF0IHN0YW1wcyBgUmVxdWVzdENvbnRleHRgIHdpdGggdGhlXG4gKiBBcHBLaXQgdXNlciwgcmVzb3VyY2UgaWQsIGFuZCBhIHRocmVhZCBpZCBiYWNrZWQgYnkgYW4gSFRUUC1vbmx5XG4gKiBzZXNzaW9uIGNvb2tpZSAoYGFwcGtpdF88cGx1Z2luLW5hbWU+X3Nlc3Npb25faWRgKS5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hc3RyYVNlcnZlciBleHRlbmRzIEV4cHJlc3NNYXN0cmFTZXJ2ZXIge1xuICBwcml2YXRlIGxvZzogbG9nLkxvZ2dlcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RhbXAgdGhlIE1MZmxvdyB0cmFjZS1pZCBoZWFkZXIgb24gcmVzcG9uc2VzLiBTaGFyZXMgdGhlXG4gICAqIHBsdWdpbidzIGZlZWRiYWNrIGdhdGUgdmlhIHtAbGluayByZXNvbHZlRmVlZGJhY2tFbmFibGVkfS5cbiAgICovXG4gIHByaXZhdGUgZmVlZGJhY2tFbmFibGVkOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gICAgLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBFeHByZXNzTWFzdHJhU2VydmVyPlxuICApIHtcbiAgICBzdXBlciguLi5hcmdzKTtcbiAgICB0aGlzLmxvZyA9IGxvZy5sb2dnZXIoY29uZmlnKTtcbiAgICB0aGlzLmZlZWRiYWNrRW5hYmxlZCA9IHJlc29sdmVGZWVkYmFja0VuYWJsZWQoY29uZmlnLmZlZWRiYWNrKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlZ2lzdGVyQXV0aE1pZGRsZXdhcmUoKTogdm9pZCB7XG4gICAgc3VwZXIucmVnaXN0ZXJBdXRoTWlkZGxld2FyZSgpO1xuICAgIHRoaXMuYXBwLnVzZShhc3luYyAocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gcmVzLmxvY2Fscy5yZXF1ZXN0Q29udGV4dCEgYXMgUmVxdWVzdENvbnRleHQ7XG4gICAgICBjbGVhclRydXN0ZWRSZXF1ZXN0Q29udGV4dChyZXF1ZXN0Q29udGV4dCk7XG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VXNlcihyZXEsIHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIHRoaXMuY29uZmlndXJlUmVxdWVzdENvbnRleHRUaHJlYWRJZChyZXEsIHJlcywgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dE1vZGVsT3ZlcnJpZGUocmVxLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0UmVxdWVzdElkKHJlcSwgcmVzLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0U2NvcGVzKHJlcSwgcmVxdWVzdENvbnRleHQpO1xuXG4gICAgICB0aGlzLmNvbmZpZ3VyZU1sZmxvd1RyYWNlSWQocmVzKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFwiYXV0aDptaWRkbGV3YXJlXCIsIHtcbiAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgcmVxdWVzdElkOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1JFUVVFU1RfSURfS0VZKSxcbiAgICAgICAgdGhyZWFkSWQ6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSksXG4gICAgICAgIHJlc291cmNlSWQ6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKSxcbiAgICAgICAgdXNlck5hbWU6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9OQU1FX0tFWSksXG4gICAgICAgIHVzZXJFbWFpbDogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX0VNQUlMX0tFWSksXG4gICAgICAgIG1vZGVsT3ZlcnJpZGU6IHJlcXVlc3RDb250ZXh0LmdldChcbiAgICAgICAgICAvLyBpbXBvcnRlZCBiZWxvdzsgbG9nZ2VkIHNvIGEgbWlzcm91dGVkIHJlcXVlc3Qgc2hvd3NcbiAgICAgICAgICAvLyB1cCBhbG9uZ3NpZGUgaXRzIG1vZGVsIHNlbGVjdGlvbiBpbiBgTE9HX0xFVkVMPWRlYnVnYC5cbiAgICAgICAgICBcIm1hc3RyYV9fbW9kZWxfb3ZlcnJpZGVcIixcbiAgICAgICAgKSxcbiAgICAgIH0pO1xuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgY29uZmlndXJlUmVxdWVzdENvbnRleHRVc2VyKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpIHtcbiAgICAvLyBQYXNzIHRoZSBmb3J3YXJkZWQgY2FsbGVyIGlkZW50aXR5IHNvIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSBzdGlsbCBrZXlzXG4gICAgLy8gbWVtb3J5IC8gY2FjaGUgLyB0cmFjZXMgcGVyIHVzZXIgZXZlbiB0aG91Z2ggdGhlIGNsaWVudCBpcyB0aGUgYXBwIFNQLlxuICAgIC8vIEluIGFuIE9CTyBjb250ZXh0IHRoZXNlIGFyZSBpZ25vcmVkIGluIGZhdm9yIG9mIHRoZSBjb250ZXh0J3Mgb3duIHVzZXIuXG4gICAgYXdhaXQgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXIocmVxdWVzdENvbnRleHQsIHtcbiAgICAgIHVzZXJJZDogcmVxdWVzdFVzZXJJZChyZXEpLFxuICAgICAgZW1haWw6IHJlcXVlc3RVc2VyRW1haWwocmVxKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFtcCBhIHBlci1yZXF1ZXN0IGlkIGFuZCBlY2hvIGl0IG9uIHRoZSByZXNwb25zZSBzbyBhbiB1cHN0cmVhbVxuICAgKiBwcm94eSAvIGN1cmwgY2xpZW50IC8gYnJvd3Nlci1zaWRlIGxvZyBsaW5lIGNhbiBwYWlyIGl0cyB2aWV3IG9mXG4gICAqIHRoZSByZXF1ZXN0IHdpdGggdGhlIG1hdGNoaW5nIHRyYWNlIHNwYW4uIFJldXNlcyBgWC1SZXF1ZXN0LUlkYFxuICAgKiB3aGVuIHRoZSB1cHN0cmVhbSBhbHJlYWR5IHN1cHBsaWVzIG9uZSBzbyBtdWx0aS1ob3AgdHJhY2VzIHN0YXlcbiAgICogam9pbmVkOyBvdGhlcndpc2UgbWludHMgYSBVVUlEdjQuXG4gICAqXG4gICAqIFRoZSBpZCBpcyBzdXJmYWNlZCBhcyBgbWFzdHJhX19yZXF1ZXN0SWRgIHNwYW4gbWV0YWRhdGEgdmlhXG4gICAqIHtAbGluayBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZU30gYW5kIGFzIHRoZSBgWC1SZXF1ZXN0LUlkYFxuICAgKiByZXNwb25zZSBoZWFkZXIgc28gZGV2IHRvb2xzIGNhbiBjb3B5IGl0IGZyb20gZWl0aGVyIHNpZGUuXG4gICAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFJlcXVlc3RJZChcbiAgICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICApIHtcbiAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSkpIHJldHVybjtcbiAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IHJlcS5oZWFkZXJzW1wieC1yZXF1ZXN0LWlkXCJdO1xuICAgIGNvbnN0IHVwc3RyZWFtID0gQXJyYXkuaXNBcnJheShoZWFkZXJWYWx1ZSkgPyBoZWFkZXJWYWx1ZVswXSA6IGhlYWRlclZhbHVlO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHVwc3RyZWFtPy50cmltKCkgfHwgaGFzaC5pZCgpO1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVRVUVTVF9JRF9LRVksIHJlcXVlc3RJZCk7XG4gICAgcmVzLnNldEhlYWRlcihcIlgtUmVxdWVzdC1JZFwiLCByZXF1ZXN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YW1wIE9BdXRoIHNjb3BlcyBmcm9tIHRoZSBmb3J3YXJkZWQgYWNjZXNzIHRva2VuIG9uXG4gICAqIHtAbGluayBNQVNUUkFfU0NPUEVTX0tFWX0gZm9yIHdvcmtzcGFjZSBtb3VudCBnYXRpbmcuXG4gICAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFNjb3BlcyhyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KSB7XG4gICAgY29uc3Qgc2NvcGVzID0gW1xuICAgICAgLi4ub2JqZWN0XG4gICAgICAgIC5zZXF1ZW5jZSh0b2tlbi5nZXRBY2Nlc3NUb2tlblNjb3BlcyhyZXEpLCB0b2tlbi5nZXRBY2Nlc3NUb2tlblNjb3BlcyhyZXEsIFwiYXV0aG9yaXphdGlvblwiKSlcbiAgICAgICAgLmRpc3RpbmN0KCksXG4gICAgXTtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1NDT1BFU19LRVksIHNjb3Blcyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhbXAgdGhlIHR1cm4ncyBNTGZsb3cgdHJhY2UgaWQgb24gdGhlIHJlc3BvbnNlIHNvIHRoZSBjaGF0IGNsaWVudFxuICAgKiBjYW4gYXR0YWNoIHRodW1icyAvIGNvbW1lbnQgZmVlZGJhY2sgdG8gaXQgbGF0ZXIuIE1MZmxvdyBkZXJpdmVzXG4gICAqIGl0cyB0cmFjZSBpZCBmcm9tIHRoZSBPcGVuVGVsZW1ldHJ5IHRyYWNlIGlkIChgdHItPGhleD5gKSwgYW5kIGV2ZXJ5XG4gICAqIE1hc3RyYSBzcGFuIGZvciB0aGlzIHJlcXVlc3QgaW5oZXJpdHMgdGhlIGFtYmllbnQgT1RlbCBjb250ZXh0IChzZWVcbiAgICogYG9ic2VydmFiaWxpdHkudHNgKSwgc28gdGhlIGFjdGl2ZSBzcGFuJ3MgdHJhY2UgaWQgaGVyZSBpcyB0aGUgaWRcbiAgICogTUxmbG93IHdpbGwgcmVjb3JkIGZvciB0aGUgdHVybi5cbiAgICpcbiAgICogTm8tb3AgdW5sZXNzIGZlZWRiYWNrIGlzIGVuYWJsZWQsIGFuZCB3aGVuIG5vIGxpdmUgT1RlbCBzcGFuIGlzXG4gICAqIGFjdGl2ZSAoZS5nLiB0aGUgT1RMUCBTREsgaXNuJ3QgcmVnaXN0ZXJlZCk6IGluIHRoYXQgY2FzZSB0aGUgaGVhZGVyXG4gICAqIGlzIHNpbXBseSBhYnNlbnQgYW5kIHRoZSBjbGllbnQgaGlkZXMgZmVlZGJhY2sgZm9yIHRoYXQgbWVzc2FnZSxcbiAgICogZGVncmFkaW5nIGdyYWNlZnVsbHkgcmF0aGVyIHRoYW4gZW1pdHRpbmcgYSBib2d1cyB0cmFjZSBpZC5cbiAgICovXG4gIGNvbmZpZ3VyZU1sZmxvd1RyYWNlSWQocmVzOiBleHByZXNzLlJlc3BvbnNlKSB7XG4gICAgaWYgKCF0aGlzLmZlZWRiYWNrRW5hYmxlZCB8fCByZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgICBpZiAocmVzLmdldEhlYWRlcihmZWVkYmFjay5NTEZMT1dfVFJBQ0VfSURfSEVBREVSKSkgcmV0dXJuO1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0cmFjZS5nZXRBY3RpdmVTcGFuKCk/LnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgICBpZiAoIXRyYWNlSWQgfHwgdHJhY2VJZCA9PT0gSU5WQUxJRF9UUkFDRV9JRCkgcmV0dXJuO1xuICAgIHJlcy5zZXRIZWFkZXIoZmVlZGJhY2suTUxGTE9XX1RSQUNFX0lEX0hFQURFUiwgYHRyLSR7dHJhY2VJZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSB0aHJlYWQgaWQgdGhpcyByZXF1ZXN0IHRhcmdldHMgYW5kIHBpbiBpdCBvblxuICAgKiBgUmVxdWVzdENvbnRleHRgIChjb25zdW1lZCBieSB0aGUgYWdlbnQgc3RyZWFtIGZvciBwZXJzaXN0ZW5jZSBhbmRcbiAgICogYnkgbmF0aXZlIG1lbW9yeSByb3V0ZXMpLiBSZXNvbHV0aW9uIG9yZGVyOlxuICAgKlxuICAgKiAgIDEuIEEgY2xpZW50LXN1cHBsaWVkIHRocmVhZCBpZCAodGhlIHRocmVhZC1zZWxlY3Rpb24gaGVhZGVyIC9cbiAgICogICAgICBgP3RocmVhZElkPWAgcXVlcnkpLiBUaGlzIGlzIGhvdyB0aGUgY2hhdCBVSSByZWZlcmVuY2VzIGFcbiAgICogICAgICBzcGVjaWZpYyBjb252ZXJzYXRpb24gYW1vbmcgdGhlIG1hbnkgYSB1c2VyIG93bnMgLSBpdCBwaWNrcyBhXG4gICAqICAgICAgdGhyZWFkIGlkIGZyb20gdGhlIGAvdGhyZWFkc2AgbGlzdGluZyAob3IgbWludHMgb25lIGZvciBhIG5ld1xuICAgKiAgICAgIGNvbnZlcnNhdGlvbikgYW5kIHN0YW1wcyBpdCBoZXJlLiBUaGUgaWQgaXMgc2NvcGVkIHRvIHRoZVxuICAgKiAgICAgIGNhbGxlcidzIHJlc291cmNlIGJ5IHRoZSByZWNhbGwgLyBsaXN0IHJvdXRlcywgc28gYSBjbGllbnRcbiAgICogICAgICBjYW4gb25seSBldmVyIHJlYWQgb3Igd3JpdGUgaXRzIG93biB0aHJlYWRzLlxuICAgKiAgIDIuIFRoZSBwZXItc2Vzc2lvbiBjb29raWUgKGBhcHBraXRfPHBsdWdpbi1uYW1lPl9zZXNzaW9uX2lkYCksXG4gICAqICAgICAgbWludGVkIG9uIGZpcnN0IGNvbnRhY3QuIFRoaXMgaXMgdGhlIGRlZmF1bHQgc2luZ2xlLXRocmVhZFxuICAgKiAgICAgIGZhbGxiYWNrIGZvciBjbGllbnRzIHRoYXQgZG9uJ3QgbWFuYWdlIHRocmVhZHMgZXhwbGljaXRseSwgc29cbiAgICogICAgICBleGlzdGluZyBlbWJlZHMga2VlcCBvbmUgc3RhYmxlIGNvbnZlcnNhdGlvbiBwZXIgc2Vzc2lvbiB3aXRoXG4gICAqICAgICAgbm8gY2xpZW50IGNoYW5nZXMuXG4gICAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFRocmVhZElkKFxuICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQsXG4gICkge1xuICAgIGlmIChyZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVkpKSByZXR1cm47XG4gICAgY29uc3QgcmVxdWVzdGVkID0gdGhpcy5yZWFkUmVxdWVzdGVkVGhyZWFkSWQocmVxKTtcbiAgICBpZiAocmVxdWVzdGVkKSB7XG4gICAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVksIHJlcXVlc3RlZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvb2tpZXMgPSBodHRwLnBhcnNlQ29va2llcyhyZXEuaGVhZGVycy5jb29raWUpO1xuICAgIGNvbnN0IGNvb2tpZU5hbWUgPSBzdHJpbmdVdGlscy50b0lkZW50aWZpZXJXaXRoT3B0aW9ucyhcbiAgICAgIHsgZGVsaW1pdGVyOiBcIl9cIiwgZGlzdGluY3Q6IHRydWUgfSxcbiAgICAgIFwiYXBwa2l0XCIsXG4gICAgICB0aGlzLmNvbmZpZy5uYW1lISxcbiAgICAgIFwic2Vzc2lvbklkXCIsXG4gICAgKTtcbiAgICBsZXQgc2Vzc2lvbklkID0gY29va2llc1tjb29raWVOYW1lXTtcbiAgICBpZiAoIXNlc3Npb25JZCkge1xuICAgICAgc2Vzc2lvbklkID0gaGFzaC5pZCgpO1xuICAgICAgcmVzLmNvb2tpZShjb29raWVOYW1lLCBzZXNzaW9uSWQsIHtcbiAgICAgICAgaHR0cE9ubHk6IHRydWUsXG4gICAgICAgIHNhbWVTaXRlOiBcImxheFwiLFxuICAgICAgICBzZWN1cmU6IHJlcS5zZWN1cmUsXG4gICAgICAgIHBhdGg6IFwiL1wiLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVEhSRUFEX0lEX0tFWSwgc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBjbGllbnQtc2VsZWN0ZWQgdGhyZWFkIGlkIGZyb20gdGhlIHJlcXVlc3QsIHByZWZlcnJpbmdcbiAgICogdGhlIHRocmVhZC1zZWxlY3Rpb24gaGVhZGVyIG92ZXIgdGhlIGA/dGhyZWFkSWQ9YCBxdWVyeS4gUmV0dXJuc1xuICAgKiBgbnVsbGAgd2hlbiBuZWl0aGVyIGNhcnJpZXMgYSBub24tZW1wdHkgdmFsdWUgc28gdGhlIGNhbGxlciBmYWxsc1xuICAgKiBiYWNrIHRvIHRoZSBzZXNzaW9uIGNvb2tpZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZFJlcXVlc3RlZFRocmVhZElkKHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgaGVhZGVyVmFsdWUgPSByZXEuaGVhZGVyc1t0aHJlYWQuVEhSRUFEX0lEX0hFQURFUl07XG4gICAgY29uc3QgcXVlcnlWYWx1ZSA9IHJlcS5xdWVyeVt0aHJlYWQuVEhSRUFEX0lEX1FVRVJZXTtcbiAgICByZXR1cm4gKFxuICAgICAgc3RyaW5nVXRpbHMudHJpbVRvTnVsbChBcnJheS5pc0FycmF5KGhlYWRlclZhbHVlKSA/IGhlYWRlclZhbHVlWzBdIDogaGVhZGVyVmFsdWUpID8/XG4gICAgICBzdHJpbmdVdGlscy50cmltVG9OdWxsKEFycmF5LmlzQXJyYXkocXVlcnlWYWx1ZSkgPyBxdWVyeVZhbHVlWzBdIDogcXVlcnlWYWx1ZSlcbiAgICApO1xuICB9XG5cbiAgY29uZmlndXJlUmVxdWVzdENvbnRleHRNb2RlbE92ZXJyaWRlKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpIHtcbiAgICAvLyBQZXItcmVxdWVzdCBtb2RlbCBvdmVycmlkZTogb25seSBob25vcmVkIHdoZW4gdGhlIHBsdWdpblxuICAgIC8vIG9wdHMgaW4gKGRlZmF1bHQpLiBTb3VyY2VzLCBpbiBwcmlvcml0eSBvcmRlciwgYXJlXG4gICAgLy8gYFgtTWFzdHJhLU1vZGVsYCBoZWFkZXIsIGA/bW9kZWw9YCBxdWVyeSwgYW5kIGBtb2RlbGAgL1xuICAgIC8vIGBtb2RlbElkYCBib2R5IGZpZWxkOyBzZWUgYHNlcnZpbmcudHNgLlxuICAgIGNvbnN0IHNlcnZpbmcgPSByZXNvbHZlU2VydmluZ0NvbmZpZyh0aGlzLmNvbmZpZyk7XG4gICAgaWYgKHNlcnZpbmcuYWxsb3dPdmVycmlkZSkge1xuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBleHRyYWN0TW9kZWxPdmVycmlkZSh7XG4gICAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPixcbiAgICAgICAgcXVlcnk6IHJlcS5xdWVyeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgYm9keTogcmVxLmJvZHksXG4gICAgICB9KTtcbiAgICAgIGlmIChvdmVycmlkZSkgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVksIG92ZXJyaWRlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIElucHV0cyBmb3Ige0BsaW5rIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFBcGlHYXRlT3B0aW9ucyB7XG4gIC8qKiBgY29uZmlnLmFwaUFjY2Vzc2A7IGBcImZ1bGxcImAgc2hvcnQtY2lyY3VpdHMgdG8gYWxsb3cgZXZlcnl0aGluZy4gKi9cbiAgYWNjZXNzOiBcInNjb3BlZFwiIHwgXCJmdWxsXCI7XG4gIC8qKiBXaGV0aGVyIHRoZSBNQ1AgdHJhbnNwb3J0IGlzIG1vdW50ZWQgKHNvIGAvbWNwLypgIGlzIGxlZ2l0aW1hdGUpLiAqL1xuICBtY3BFbmFibGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1vdW50LXJlbGF0aXZlIGFnZW50IGluZmVyZW5jZSBwYXRocyAoYC9hZ2VudHMvOmlkLzx2ZXJiPi4uLmApLiBNYXRjaGVkXG4gKiBieSBwcmVmaXggb24gdGhlIHZlcmIgc28gZnV0dXJlIHZhcmlhbnRzIChgc3RyZWFtVk5leHRgLCBgc3RyZWFtL3ZuZXh0YCxcbiAqIGBnZW5lcmF0ZVZOZXh0YCkgc3RheSBjb3ZlcmVkIHdpdGhvdXQgYSBjb2RlIGNoYW5nZS5cbiAqXG4gKiBDb3ZlcnMgdGhlIHBsYWluIGluZmVyZW5jZSB2ZXJicyAoYHN0cmVhbWAgLyBgZ2VuZXJhdGVgIC8gYG5ldHdvcmtgKSBwbHVzXG4gKiB0aGUgaHVtYW4taW4tdGhlLWxvb3AgcmVzdW1lIHZlcmJzIGEgcGF1c2VkIGByZXF1aXJlQXBwcm92YWxgIHRvb2wgbmVlZHNcbiAqIHRvIGNvbnRpbnVlOiBgYXBwcm92ZS10b29sLWNhbGxgIC8gYGRlY2xpbmUtdG9vbC1jYWxsYCAoc3RyZWFtaW5nLCBhbmQgdmlhXG4gKiBwcmVmaXggdGhlaXIgYC1nZW5lcmF0ZWAgbm9uLXN0cmVhbWluZyB2YXJpYW50cyksIHRoZSBgLW5ldHdvcmstYCB2YXJpYW50cyxcbiAqIGFuZCBgcmVzdW1lLXN0cmVhbWAgKGNvdmVycyBgcmVzdW1lLXN0cmVhbS11bnRpbC1pZGxlYCkuIFdpdGhvdXQgdGhlc2UgYW5cbiAqIGFwcHJvdmFsLWdhdGVkIHRvb2wgKGUuZy4gYHNlbmRfZW1haWxgKSBjYW4gYmUgcmVxdWVzdGVkIGJ1dCBuZXZlciBhcHByb3ZlZFxuICogZnJvbSB0aGUgYnJvd3NlciAtIHRoZSByZXN1bWUgYFBPU1RgIDQwM3MgdW5kZXIgc2NvcGVkIG1vZGUuIFRvZ2V0aGVyIHdpdGhcbiAqIHRoZSByZXNvdXJjZS1zY29wZWQgbWVtb3J5IG11dGF0aW9ucyBiZWxvdywgdGhlc2UgYXJlIHRoZSBvbmx5IHN0b2NrIE1hc3RyYVxuICogd3JpdGVzIHRoZSBicm93c2VyIGNsaWVudCBjYW4gbWFrZS5cbiAqL1xuY29uc3QgQUdFTlRfSU5GRVJFTkNFID1cbiAgL15cXC9hZ2VudHNcXC9bXi9dK1xcLyhzdHJlYW18Z2VuZXJhdGV8bmV0d29ya3xyZXN1bWUtc3RyZWFtfGFwcHJvdmUtdG9vbC1jYWxsfGRlY2xpbmUtdG9vbC1jYWxsfGFwcHJvdmUtbmV0d29yay10b29sLWNhbGx8ZGVjbGluZS1uZXR3b3JrLXRvb2wtY2FsbCkvaTtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSAoYC9hZ2VudHNgLCBgL2FnZW50cy86aWRgKS4gKi9cbmNvbnN0IEFHRU5UX01FVEFEQVRBID0gL15cXC9hZ2VudHMoXFwvW14vXSspPyQvO1xuLyoqIFBlcnNpc3RlZCBhcHByb3ZhbCBkaXNjb3ZlcnkgZm9yIG9uZSBhZ2VudC4gKi9cbmNvbnN0IEFHRU5UX1NVU1BFTkRFRF9SVU5TID0gL15cXC9hZ2VudHNcXC9bXi9dK1xcL3N1c3BlbmRlZC1ydW5zJC9pO1xuLyoqIE9mZmljaWFsIEFJIFNESyBVSSBzdHJlYW0gcm91dGUsIGluY2x1ZGluZyBgcmVzdW1lRGF0YWAgY29udGludWF0aW9ucy4gKi9cbmNvbnN0IEFHRU5UX0NIQVQgPSAvXlxcL2NoYXRcXC9bXi9dKyQvaTtcbi8qKiBOYXRpdmUgcmVzb3VyY2Utc2NvcGVkIG1lbW9yeSByZWFkcyB1c2VkIGJ5IGhpc3RvcnkgYW5kIHRoZSB0aHJlYWQgbGlzdC4gKi9cbmNvbnN0IE1FTU9SWV9SRUFEID0gL15cXC9tZW1vcnlcXC90aHJlYWRzKD86XFwvW14vXSsoPzpcXC9tZXNzYWdlcyk/KT8kL2k7XG4vKiogTmF0aXZlIHRocmVhZCByZW5hbWUvZGVsZXRlIHJvdXRlcy4gKi9cbmNvbnN0IE1FTU9SWV9USFJFQURfTVVUQVRJT04gPSAvXlxcL21lbW9yeVxcL3RocmVhZHNcXC9bXi9dKyQvaTtcblxuLyoqXG4gKiBXaGV0aGVyIGEgcmVxdWVzdCB0byB0aGUgc3RvY2sgYEBtYXN0cmEvZXhwcmVzc2Agc3ViLWFwcCBzaG91bGQgYmVcbiAqIGRpc3BhdGNoZWQsIGdpdmVuIHRoZSBjb25maWd1cmVkIHtAbGluayBNYXN0cmFBcGlHYXRlT3B0aW9ucy5hY2Nlc3N9LlxuICpcbiAqIGBwYXRoYCBpcyBtb3VudC1yZWxhdGl2ZSAod2hhdCB0aGUgcGx1Z2luJ3MgY2F0Y2gtYWxsIHNlZXMsIGUuZy5cbiAqIGAvY2hhdC94YCwgYC9tZW1vcnkvdGhyZWFkc2AsIGAvbWNwLy4uLmApLiBJbiBgXCJzY29wZWRcImBcbiAqIG1vZGUgdGhlIGFsbG93bGlzdCBpcyBkZWxpYmVyYXRlbHkgdGlnaHQgLSB0aGUgY2hhdCBjbGllbnQgb25seSBldmVyXG4gKiBuZWVkcyBhZ2VudCBpbmZlcmVuY2UsIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgcmVzb3VyY2Utc2NvcGVkIG1lbW9yeSxcbiAqIHRoaXMgcGx1Z2luJ3Mgb3duIGAvcm91dGUvKmAgcm91dGVzLCBhbmQgKHdoZW4gZW5hYmxlZCkgTUNQLiBUaGUgcmVtYWluaW5nXG4gKiBhZG1pbiwgbXV0YXRpbmcsIGFuZCBidWxrLWV4cG9ydCBzdXJmYWNlIHN0YXlzIGRlbmllZCBieSBkZWZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZChcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIHBhdGg6IHN0cmluZyxcbiAgb3B0czogTWFzdHJhQXBpR2F0ZU9wdGlvbnMsXG4pOiBib29sZWFuIHtcbiAgaWYgKG9wdHMuYWNjZXNzID09PSBcImZ1bGxcIikgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHAgPSBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aCA6IGAvJHtwYXRofWA7XG4gIC8vIFRoZSBwbHVnaW4ncyBgL3JvdXRlLypgIGFkZGl0aW9ucyB2YWxpZGF0ZSB0aGVpciBvd24gaW5wdXRzIGFuZCB0cnVzdGVkXG4gIC8vIEFwcEtpdCByZXF1ZXN0IGNvbnRleHQgYmVmb3JlIHJlYWNoaW5nIHByb2R1Y3QgYmVoYXZpb3IuXG4gIGlmIChwID09PSBcIi9yb3V0ZVwiIHx8IHAuc3RhcnRzV2l0aChcIi9yb3V0ZS9cIikpIHJldHVybiB0cnVlO1xuICBpZiAob3B0cy5tY3BFbmFibGVkICYmIChwID09PSBcIi9tY3BcIiB8fCBwLnN0YXJ0c1dpdGgoXCIvbWNwL1wiKSkpIHJldHVybiB0cnVlO1xuICBjb25zdCBtID0gbWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gIGlmIChtID09PSBcIlBPU1RcIiAmJiBBR0VOVF9DSEFULnRlc3QocCkpIHJldHVybiB0cnVlO1xuICBpZiAobSA9PT0gXCJQT1NUXCIgJiYgQUdFTlRfSU5GRVJFTkNFLnRlc3QocCkpIHJldHVybiB0cnVlO1xuICBpZiAobSA9PT0gXCJHRVRcIiAmJiAoQUdFTlRfTUVUQURBVEEudGVzdChwKSB8fCBBR0VOVF9TVVNQRU5ERURfUlVOUy50ZXN0KHApKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtID09PSBcIkdFVFwiICYmIE1FTU9SWV9SRUFELnRlc3QocCkpIHJldHVybiB0cnVlO1xuICBpZiAoKG0gPT09IFwiUEFUQ0hcIiB8fCBtID09PSBcIkRFTEVURVwiKSAmJiBNRU1PUllfVEhSRUFEX01VVEFUSU9OLnRlc3QocCkpIHJldHVybiB0cnVlO1xuICBpZiAobSA9PT0gXCJQT1NUXCIgJiYgcCA9PT0gXCIvbWVtb3J5L21lc3NhZ2VzL2RlbGV0ZVwiKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEtlZXAgTWFzdHJhIGN1c3RvbSBBUEkgcm91dGVzIG1vdW50LXJlbGF0aXZlIHdoZW4gdGhlIEV4cHJlc3Mgc3ViYXBwIGlzXG4gKiBob3N0ZWQgdW5kZXIgQXBwS2l0J3MgYC9hcGkvPHBsdWdpbj5gIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hSb3V0ZVBhdGNoTWlkZGxld2FyZShhcHA6IGV4cHJlc3MuRXhwcmVzcyk6IHZvaWQge1xuICBhcHAudXNlKChyZXEsIF9yZXMsIG5leHQpID0+IHtcbiAgICBjb25zdCBpc0N1c3RvbVJvdXRlID1cbiAgICAgIHJlcS5wYXRoID09PSBcIi9jaGF0XCIgfHxcbiAgICAgIHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvY2hhdC9cIikgfHxcbiAgICAgIHJlcS5wYXRoID09PSBcIi9yb3V0ZVwiIHx8XG4gICAgICByZXEucGF0aC5zdGFydHNXaXRoKFwiL3JvdXRlL1wiKTtcbiAgICBpZiAoIWlzQ3VzdG9tUm91dGUpIHJldHVybiBuZXh0KCk7XG4gICAgcmVxLm9yaWdpbmFsVXJsID0gcmVxLnBhdGg7XG4gICAgbmV4dCgpO1xuICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AppKit-backed caching for Databricks workspace skill mounts.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { CopyOptions, FileContent, FileEntry, FileStat, FileSystem, ListOptions, MakeDirectoryOptions, ReadFileOptions, RemoveOptions, WriteFileOptions } from "@dbx-tools/shared-fs";
|
|
7
|
+
import { type MastraFileSystemAdapter } from "./filesystems.ts";
|
|
8
|
+
/** Default remote skill metadata and content cache lifetime. */
|
|
9
|
+
export declare const DEFAULT_WORKSPACE_SKILL_CACHE_TTL_MS: number;
|
|
10
|
+
/** Options for one AppKit-cached workspace skill filesystem. */
|
|
11
|
+
export interface AppKitCachedFileSystemOptions {
|
|
12
|
+
host: string;
|
|
13
|
+
source: FileSystem;
|
|
14
|
+
ttlMs?: number;
|
|
15
|
+
userKey: string;
|
|
16
|
+
}
|
|
17
|
+
/** Stable Mastra mount plus the identity key used for source reuse. */
|
|
18
|
+
export interface CachedWorkspaceSkillMount {
|
|
19
|
+
cacheKey: string;
|
|
20
|
+
filesystem: MastraFileSystemAdapter;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Cache read-only filesystem operations through AppKit while delegating
|
|
24
|
+
* mutations to the current request's source.
|
|
25
|
+
*/
|
|
26
|
+
export declare class AppKitCachedFileSystem implements FileSystem<"appkit-cache"> {
|
|
27
|
+
readonly backend: "appkit-cache";
|
|
28
|
+
readonly id: string;
|
|
29
|
+
readonly readOnly: boolean;
|
|
30
|
+
readonly root: string;
|
|
31
|
+
private source;
|
|
32
|
+
private readonly host;
|
|
33
|
+
private readonly ttlSec;
|
|
34
|
+
private readonly userKey;
|
|
35
|
+
constructor(options: AppKitCachedFileSystemOptions);
|
|
36
|
+
/** Rebind cache misses and writes to the current request's OBO filesystem. */
|
|
37
|
+
bind(source: FileSystem): void;
|
|
38
|
+
init(): Promise<void>;
|
|
39
|
+
/** Keep the shared scope alive when one request releases its workspace view. */
|
|
40
|
+
close(): Promise<void>;
|
|
41
|
+
resolvePath(inputPath: string): string;
|
|
42
|
+
readFile(inputPath: string): Promise<Uint8Array>;
|
|
43
|
+
readFile(inputPath: string, options: ReadFileOptions & {
|
|
44
|
+
encoding: string;
|
|
45
|
+
}): Promise<string>;
|
|
46
|
+
writeFile(inputPath: string, content: FileContent, options?: WriteFileOptions): Promise<void>;
|
|
47
|
+
appendFile(inputPath: string, content: FileContent): Promise<void>;
|
|
48
|
+
deleteFile(inputPath: string, options?: RemoveOptions): Promise<void>;
|
|
49
|
+
copyFile(sourcePath: string, destinationPath: string, options?: CopyOptions): Promise<void>;
|
|
50
|
+
moveFile(sourcePath: string, destinationPath: string, options?: CopyOptions): Promise<void>;
|
|
51
|
+
mkdir(inputPath: string, options?: MakeDirectoryOptions): Promise<void>;
|
|
52
|
+
rmdir(inputPath: string, options?: RemoveOptions): Promise<void>;
|
|
53
|
+
readdir(inputPath: string, options?: ListOptions): Promise<FileEntry[]>;
|
|
54
|
+
exists(inputPath: string): Promise<boolean>;
|
|
55
|
+
stat(inputPath: string): Promise<FileStat>;
|
|
56
|
+
/** Rotate this scope's cache generation so the next read reloads it. */
|
|
57
|
+
invalidate(): Promise<void>;
|
|
58
|
+
private cached;
|
|
59
|
+
private generation;
|
|
60
|
+
private generationKey;
|
|
61
|
+
private mutate;
|
|
62
|
+
}
|
|
63
|
+
/** Return one stable Mastra mount per resolved user, host, and source root. */
|
|
64
|
+
export declare function cachedWorkspaceSkillMount(options: AppKitCachedFileSystemOptions): CachedWorkspaceSkillMount;
|
|
65
|
+
/** Invalidate one user's cached workspace skill scope. */
|
|
66
|
+
export declare function clearWorkspaceSkillCache(options: {
|
|
67
|
+
host: string;
|
|
68
|
+
root?: string;
|
|
69
|
+
userKey: string;
|
|
70
|
+
}): Promise<void>;
|