@dbx-tools/appkit-mastra 0.9.64 → 0.9.67

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/src/mlflow.js CHANGED
@@ -25,11 +25,77 @@
25
25
  * @module
26
26
  */
27
27
  import { ConfigurationError } from "@databricks/appkit";
28
- import { asyncUtils, errorUtils, log, object } from "@dbx-tools/shared-core";
28
+ import { asyncUtils, environmentUtils, errorUtils, log, object } from "@dbx-tools/shared-core";
29
29
  import { feedback } from "@dbx-tools/shared-mastra";
30
30
  import { z } from "zod";
31
31
  import { databricksFetch, readResponseJson, readResponseText } from "./rest.js";
32
+ import { MLFLOW_AGENT_TAG_ATTR } from "./trace-attributes.js";
32
33
  const logger = log.logger("mastra/mlflow");
34
+ let directMlflow;
35
+ let directMlflowInitStarted = false;
36
+ let directMlflowProvider;
37
+ let directMlflowProcessor;
38
+ const NOISY_INSTRUMENTATION_SCOPES = new Set([
39
+ "@opentelemetry/instrumentation-express",
40
+ "@opentelemetry/instrumentation-http",
41
+ "cache-manager-cache-manager",
42
+ ]);
43
+ function isAgentTraceRoot(span) {
44
+ return span.attributes[MLFLOW_AGENT_TAG_ATTR] === "true";
45
+ }
46
+ function isUsefulAgentDescendant(span) {
47
+ return !NOISY_INSTRUMENTATION_SCOPES.has(span.instrumentationScope.name);
48
+ }
49
+ /**
50
+ * Restrict the direct MLflow provider to chat roots and their descendants.
51
+ * AppKit and Mastra create other OTel roots for cache and plugin operations;
52
+ * forwarding those would recreate the one-trace-per-request noise this path is
53
+ * intended to avoid.
54
+ */
55
+ export class AgentTraceSpanProcessor {
56
+ delegate;
57
+ traceIds = new Set();
58
+ spanIds = new Set();
59
+ constructor(delegate) {
60
+ this.delegate = delegate;
61
+ }
62
+ onStart(span, parentContext) {
63
+ const traceId = span.spanContext().traceId;
64
+ const isRoot = !span.parentSpanContext?.spanId;
65
+ if (isRoot) {
66
+ if (!isAgentTraceRoot(span))
67
+ return;
68
+ this.traceIds.add(traceId);
69
+ }
70
+ else if (!this.traceIds.has(traceId) || !isUsefulAgentDescendant(span)) {
71
+ return;
72
+ }
73
+ this.spanIds.add(span.spanContext().spanId);
74
+ this.delegate.onStart(span, parentContext);
75
+ }
76
+ onEnding(span) {
77
+ if (!this.spanIds.has(span.spanContext().spanId))
78
+ return;
79
+ this.delegate.onEnding?.(span);
80
+ }
81
+ onEnd(span) {
82
+ const traceId = span.spanContext().traceId;
83
+ const spanId = span.spanContext().spanId;
84
+ if (!this.spanIds.delete(spanId))
85
+ return;
86
+ this.delegate.onEnd(span);
87
+ if (!span.parentSpanContext?.spanId)
88
+ this.traceIds.delete(traceId);
89
+ }
90
+ forceFlush() {
91
+ return this.delegate.forceFlush();
92
+ }
93
+ shutdown() {
94
+ this.traceIds.clear();
95
+ this.spanIds.clear();
96
+ return this.delegate.shutdown();
97
+ }
98
+ }
33
99
  /** Experiment tag Databricks stores as `catalog.schema.table_prefix`. */
34
100
  const TRACE_DESTINATION_PATH_TAG = "mlflow.experiment.databricksTraceDestinationPath";
35
101
  /** Experiment tag naming the OTel spans table (`catalog.schema.{prefix}_otel_spans`). */
@@ -194,20 +260,160 @@ function configuredExperiment() {
194
260
  ...(name ? { name } : {}),
195
261
  };
196
262
  }
263
+ /** Tracking URI for direct local MLflow tracing, with CLI-profile auth injected. */
264
+ export function directMlflowTrackingUri() {
265
+ if (environmentUtils.isDatabricksAppEnv())
266
+ return undefined;
267
+ const configured = process.env.MLFLOW_TRACKING_URI?.trim();
268
+ if (configured && configured !== "databricks")
269
+ return configured;
270
+ const profile = process.env.DATABRICKS_CONFIG_PROFILE?.trim();
271
+ return profile ? `databricks://${profile}` : "databricks";
272
+ }
273
+ /** Parse the optional UC table-prefix location used by direct local tracing. */
274
+ export function directMlflowTraceLocation() {
275
+ const catalogName = process.env.MLFLOW_UC_CATALOG?.trim();
276
+ const schemaName = process.env.MLFLOW_UC_SCHEMA?.trim();
277
+ const tablePrefix = process.env.MLFLOW_UC_TABLE_PREFIX?.trim();
278
+ if (catalogName && schemaName && tablePrefix) {
279
+ return { catalogName, schemaName, tablePrefix };
280
+ }
281
+ const prefix = normalizeUcPrefix(process.env.MLFLOW_UC_TRACE_PREFIX);
282
+ if (!prefix)
283
+ return undefined;
284
+ const parts = prefix.split(".");
285
+ if (parts.length !== 3)
286
+ return undefined;
287
+ const [prefixCatalog, prefixSchema, prefixTable] = parts;
288
+ if (!prefixCatalog || !prefixSchema || !prefixTable)
289
+ return undefined;
290
+ return {
291
+ catalogName: prefixCatalog,
292
+ schemaName: prefixSchema,
293
+ tablePrefix: prefixTable,
294
+ };
295
+ }
296
+ /** Whether the local direct-to-experiment MLflow SDK has enough configuration. */
297
+ export function directMlflowTracingConfigured() {
298
+ return Boolean(!environmentUtils.isDatabricksAppEnv() &&
299
+ process.env.MLFLOW_EXPERIMENT_ID?.trim() &&
300
+ directMlflowTrackingUri());
301
+ }
302
+ async function detectedDirectMlflowTraceLocation(mlflow, trackingUri, experimentId, host) {
303
+ const explicit = directMlflowTraceLocation();
304
+ if (explicit)
305
+ return explicit;
306
+ try {
307
+ const authProvider = mlflow.createAuthProvider({
308
+ trackingUri,
309
+ ...(host ? { host } : {}),
310
+ });
311
+ const client = new mlflow.MlflowClient({ trackingUri, authProvider });
312
+ const experiment = await client.getExperiment(experimentId);
313
+ if (!experiment)
314
+ return undefined;
315
+ const { ucLocationFromExperimentTags } = await import("@mlflow/core/dist/core/destination");
316
+ const location = ucLocationFromExperimentTags(experiment.tags);
317
+ if (!location?.tablePrefix)
318
+ return undefined;
319
+ return {
320
+ catalogName: location.catalogName,
321
+ schemaName: location.schemaName,
322
+ tablePrefix: location.tablePrefix,
323
+ };
324
+ }
325
+ catch (err) {
326
+ logger.warn("direct MLflow UC trace-location detection failed", {
327
+ experimentId,
328
+ error: errorUtils.errorMessage(err),
329
+ });
330
+ return undefined;
331
+ }
332
+ }
333
+ /**
334
+ * Start the MLflow Node tracer for local development when AppKit has no OTLP
335
+ * exporter. This provider is never started in the deployed Apps path, avoiding
336
+ * a second global OTel provider racing AppKit's telemetry manager.
337
+ */
338
+ export async function initializeDirectMlflowTracing() {
339
+ if (directMlflow)
340
+ return true;
341
+ if (directMlflowInitStarted || !directMlflowTracingConfigured())
342
+ return false;
343
+ directMlflowInitStarted = true;
344
+ const experimentId = process.env.MLFLOW_EXPERIMENT_ID.trim();
345
+ const trackingUri = directMlflowTrackingUri();
346
+ try {
347
+ const mlflow = await import("@mlflow/core");
348
+ const rawHost = process.env.DATABRICKS_HOST?.trim();
349
+ const host = rawHost
350
+ ? /^https?:\/\//i.test(rawHost)
351
+ ? rawHost
352
+ : `https://${rawHost}`
353
+ : undefined;
354
+ const traceLocation = await detectedDirectMlflowTraceLocation(mlflow, trackingUri, experimentId, host);
355
+ if (!traceLocation) {
356
+ throw new ConfigurationError("Direct local MLflow tracing requires a UC-linked experiment or MLFLOW_UC_TRACE_PREFIX.");
357
+ }
358
+ const [{ DatabricksUCTableSpanExporter, DatabricksUCTableSpanProcessor }, sdk] = await Promise.all([
359
+ import("@mlflow/core/dist/exporters/uc_table"),
360
+ import("@opentelemetry/sdk-trace-node"),
361
+ ]);
362
+ const authProvider = mlflow.createAuthProvider({
363
+ trackingUri,
364
+ ...(host ? { host } : {}),
365
+ });
366
+ const client = new mlflow.MlflowClient({ trackingUri, authProvider });
367
+ const exporter = new DatabricksUCTableSpanExporter(client);
368
+ const processor = new AgentTraceSpanProcessor(new DatabricksUCTableSpanProcessor(exporter, traceLocation));
369
+ const provider = new sdk.NodeTracerProvider({ spanProcessors: [processor] });
370
+ provider.register();
371
+ directMlflow = mlflow;
372
+ directMlflowProvider = provider;
373
+ directMlflowProcessor = processor;
374
+ logger.info("direct MLflow tracing enabled", {
375
+ experimentId,
376
+ trackingUri,
377
+ traceLocation,
378
+ });
379
+ return true;
380
+ }
381
+ catch (err) {
382
+ logger.warn("direct MLflow tracing disabled", {
383
+ error: errorUtils.errorMessage(err),
384
+ });
385
+ return false;
386
+ }
387
+ }
388
+ /** Persist trace-level fields on the direct MLflow trace in the current OTel context. */
389
+ export function updateActiveMlflowTrace(options) {
390
+ directMlflow?.updateCurrentTrace(options);
391
+ }
392
+ /** Persist tags on the direct MLflow trace active in the current OTel context. */
393
+ export function updateActiveMlflowTraceTags(tags) {
394
+ updateActiveMlflowTrace({ tags });
395
+ }
396
+ /** Whether this process owns the filtered local MLflow tracer provider. */
397
+ export function directMlflowTracingActive() {
398
+ return directMlflowProcessor !== undefined;
399
+ }
400
+ /** Flush pending direct local trace exports during graceful shutdown. */
401
+ export async function flushDirectMlflowTracing() {
402
+ await directMlflowProcessor?.forceFlush();
403
+ await directMlflowProvider?.forceFlush();
404
+ }
197
405
  /**
198
406
  * Whether MLflow feedback logging is available for this deployment.
199
407
  *
200
- * Enabled when an OTLP exporter endpoint is configured (traces are
201
- * actually shipped somewhere) AND an MLflow experiment is named - the
202
- * two signals that the OTLP backend is MLflow and traces will
203
- * materialize there. Both are standard env vars, so no plugin config is
204
- * required; a deployment opts in simply by wiring MLflow tracing.
408
+ * Enabled when an MLflow experiment is configured and traces have an export
409
+ * path: AppKit OTLP in a Databricks App, or the direct MLflow Node SDK outside
410
+ * one. Both paths are selected from standard environment values.
205
411
  */
206
412
  export function mlflowEnabled() {
207
413
  const hasExporter = Boolean(process.env.OTEL_EXPORTER_OTLP_ENDPOINT?.trim() ||
208
414
  process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT?.trim());
209
415
  const hasExperiment = Boolean(process.env.MLFLOW_EXPERIMENT_ID?.trim() || process.env.MLFLOW_EXPERIMENT_NAME?.trim());
210
- return hasExporter && hasExperiment;
416
+ return hasExperiment && (hasExporter || directMlflowTracingConfigured());
211
417
  }
212
418
  /**
213
419
  * Resolve whether user feedback is enabled from the plugin's optional
@@ -360,4 +566,4 @@ export async function logFeedback(client, params) {
360
566
  }
361
567
  return undefined;
362
568
  }
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=
569
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWxmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21sZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXhELE9BQU8sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFRcEQsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTlELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUFLM0MsSUFBSSxZQUFzQyxDQUFDO0FBQzNDLElBQUksdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0FBQ3BDLElBQUksb0JBQW9ELENBQUM7QUFDekQsSUFBSSxxQkFBZ0QsQ0FBQztBQUVyRCxNQUFNLDRCQUE0QixHQUFHLElBQUksR0FBRyxDQUFDO0lBQzNDLHdDQUF3QztJQUN4QyxxQ0FBcUM7SUFDckMsNkJBQTZCO0NBQzlCLENBQUMsQ0FBQztBQUVILFNBQVMsZ0JBQWdCLENBQUMsSUFBYTtJQUNyQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsS0FBSyxNQUFNLENBQUM7QUFDM0QsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQUMsSUFBYTtJQUM1QyxPQUFPLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJ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ZmVlZGJhY2sgbG9nZ2luZzogZGV0ZWN0IHdoZXRoZXIgTUxmbG93IHRyYWNpbmcgaXMgd2lyZWRcbiAqIGZvciB0aGlzIGRlcGxveW1lbnQsIGFuZCBsb2cgYSB0aHVtYnMgLyBjb21tZW50IGFzIGEgdHJhY2VcbiAqICphc3Nlc3NtZW50KiB2aWEgdGhlIERhdGFicmlja3MgTUxmbG93IFJFU1QgQVBJLlxuICpcbiAqIEZlZWRiYWNrIGF0dGFjaGVzIHRvIGEgdHJhY2UsIGFuZCB0aGUgcGx1Z2luJ3Mgc3BhbnMgcmVhY2ggTUxmbG93XG4gKiB0aHJvdWdoIHRoZSBzYW1lIE9UZWwgcGlwZWxpbmUgYXMgZXZlcnkgb3RoZXIgQXBwS2l0IHNwYW4gKHNlZVxuICogYG9ic2VydmFiaWxpdHkudHNgKS4gT24gRGF0YWJyaWNrcyBBcHBzIHRoYXQgcGlwZWxpbmUgaXMgdGhlIFVDXG4gKiBzaWRlY2FyIGluamVjdGVkIGJ5IGB0ZWxlbWV0cnlfZXhwb3J0X2Rlc3RpbmF0aW9uc2AsIG5vdCBhIGRpcmVjdFxuICogd29ya3NwYWNlIE9UTFAgVVJMLiBNTGZsb3cgZGVyaXZlcyBpdHMgdHJhY2UgaWQgZnJvbSB0aGUgT3BlblRlbGVtZXRyeVxuICogdHJhY2UgaWQgKGB0ci08aGV4KG90ZWxUcmFjZUlkKT5gKSwgc28gdGhlIHNlcnZlciBzdGFtcHMgdGhlIGFjdGl2ZVxuICogdHJhY2UgaWQgb24gZWFjaCB0dXJuJ3MgcmVzcG9uc2UgYW5kIHRoZSBjbGllbnQgc2VuZHMgaXQgYmFjayBoZXJlLlxuICpcbiAqIFRoZXJlIGlzIG5vIE1MZmxvdyBKUyBTREssIHNvIHRoaXMgcG9zdHMgdG8gdGhlIGFzc2Vzc21lbnRzIFJFU1RcbiAqIGVuZHBvaW50IGRpcmVjdGx5IHVzaW5nIHRoZSBPQk8tc2NvcGVkIHdvcmtzcGFjZSBjbGllbnQgKHRoZSBmZWVkYmFja1xuICogaXMgdGh1cyBhdHRyaWJ1dGVkIHRvIHRoZSBzaWduZWQtaW4gdXNlcikuIFVDLWJhY2tlZCBBcHBzIHRyYWNlcyBuZWVkXG4gKiB0aGUgZXhwZXJpbWVudCdzIHRhYmxlLXByZWZpeCBVUkkgKGB0cmFjZTove2NhdGFsb2d9LntzY2hlbWF9LntwcmVmaXh9L3t0ci1oZXh9YClcbiAqIHJhdGhlciB0aGFuIHRoZSBleHBlcmltZW50LXN0b3JlIGlkIHRoZSBVSSBkb2VzIG5vdCBzdG9yZS4gVGhhdCBwcmVmaXggaXNcbiAqIHJlYWQgZnJvbSB0aGUgZXhwZXJpbWVudCdzIGBtbGZsb3cuZXhwZXJpbWVudC5kYXRhYnJpY2tzVHJhY2VEZXN0aW5hdGlvblBhdGhgXG4gKiB0YWcgKG9yIHRoZSBzcGFucy10YWJsZSB0YWcpOyBgTUxGTE9XX1VDX1RSQUNFX1BSRUZJWGAgcmVtYWlucyBhbiBvcHRpb25hbFxuICogb3ZlcnJpZGUuIFRyYWNlIGV4cG9ydCBpcyBhc3luY2hyb25vdXMsIHNvIHRoZSBqdXN0LWZpbmlzaGVkIHRyYWNlIG1heSBub3RcbiAqIGV4aXN0IGluIE1MZmxvdyB5ZXQgd2hlbiB0aGUgdXNlciByZWFjdHM7IHRoZSBsb2cgY2FsbCByZXRyaWVzIGJyaWVmbHkgb25cbiAqIFwibm90IGZvdW5kXCIgYmVmb3JlIGdpdmluZyB1cCBzb2Z0bHkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXN5bmNVdGlscywgZW52aXJvbm1lbnRVdGlscywgZXJyb3JVdGlscywgbG9nLCBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgZmVlZGJhY2sgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvYXBpXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFJlYWRhYmxlU3BhbixcbiAgU3BhbiBhcyBTZGtTcGFuLFxuICBTcGFuUHJvY2Vzc29yLFxufSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLWJhc2VcIjtcbmltcG9ydCB0eXBlIHsgTm9kZVRyYWNlclByb3ZpZGVyIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L3Nkay10cmFjZS1ub2RlXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgZGF0YWJyaWNrc0ZldGNoLCByZWFkUmVzcG9uc2VKc29uLCByZWFkUmVzcG9uc2VUZXh0IH0gZnJvbSBcIi4vcmVzdC50c1wiO1xuaW1wb3J0IHsgTUxGTE9XX0FHRU5UX1RBR19BVFRSIH0gZnJvbSBcIi4vdHJhY2UtYXR0cmlidXRlcy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL21sZmxvd1wiKTtcblxudHlwZSBNbGZsb3dNb2R1bGUgPSB0eXBlb2YgaW1wb3J0KFwiQG1sZmxvdy9jb3JlXCIpO1xudHlwZSBVcGRhdGVDdXJyZW50VHJhY2VPcHRpb25zID0gUGFyYW1ldGVyczxNbGZsb3dNb2R1bGVbXCJ1cGRhdGVDdXJyZW50VHJhY2VcIl0+WzBdO1xuXG5sZXQgZGlyZWN0TWxmbG93OiBNbGZsb3dNb2R1bGUgfCB1bmRlZmluZWQ7XG5sZXQgZGlyZWN0TWxmbG93SW5pdFN0YXJ0ZWQgPSBmYWxzZTtcbmxldCBkaXJlY3RNbGZsb3dQcm92aWRlcjogTm9kZVRyYWNlclByb3ZpZGVyIHwgdW5kZWZpbmVkO1xubGV0IGRpcmVjdE1sZmxvd1Byb2Nlc3NvcjogU3BhblByb2Nlc3NvciB8IHVuZGVmaW5lZDtcblxuY29uc3QgTk9JU1lfSU5TVFJVTUVOVEFUSU9OX1NDT1BFUyA9IG5ldyBTZXQoW1xuICBcIkBvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1leHByZXNzXCIsXG4gIFwiQG9wZW50ZWxlbWV0cnkvaW5zdHJ1bWVudGF0aW9uLWh0dHBcIixcbiAgXCJjYWNoZS1tYW5hZ2VyLWNhY2hlLW1hbmFnZXJcIixcbl0pO1xuXG5mdW5jdGlvbiBpc0FnZW50VHJhY2VSb290KHNwYW46IFNka1NwYW4pOiBib29sZWFuIHtcbiAgcmV0dXJuIHNwYW4uYXR0cmlidXRlc1tNTEZMT1dfQUdFTlRfVEFHX0FUVFJdID09PSBcInRydWVcIjtcbn1cblxuZnVuY3Rpb24gaXNVc2VmdWxBZ2VudERlc2NlbmRhbnQoc3BhbjogU2RrU3Bhbik6IGJvb2xlYW4ge1xuICByZXR1cm4gIU5PSVNZX0lOU1RSVU1FTlRBVElPTl9TQ09QRVMuaGFzKHNwYW4uaW5zdHJ1bWVudGF0aW9uU2NvcGUubmFtZSk7XG59XG5cbi8qKlxuICogUmVzdHJpY3QgdGhlIGRpcmVjdCBNTGZsb3cgcHJvdmlkZXIgdG8gY2hhdCByb290cyBhbmQgdGhlaXIgZGVzY2VuZGFudHMuXG4gKiBBcHBLaXQgYW5kIE1hc3RyYSBjcmVhdGUgb3RoZXIgT1RlbCByb290cyBmb3IgY2FjaGUgYW5kIHBsdWdpbiBvcGVyYXRpb25zO1xuICogZm9yd2FyZGluZyB0aG9zZSB3b3VsZCByZWNyZWF0ZSB0aGUgb25lLXRyYWNlLXBlci1yZXF1ZXN0IG5vaXNlIHRoaXMgcGF0aCBpc1xuICogaW50ZW5kZWQgdG8gYXZvaWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBZ2VudFRyYWNlU3BhblByb2Nlc3NvciBpbXBsZW1lbnRzIFNwYW5Qcm9jZXNzb3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYWNlSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3BhbklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZGVsZWdhdGU6IFNwYW5Qcm9jZXNzb3IpIHt9XG5cbiAgb25TdGFydChzcGFuOiBTZGtTcGFuLCBwYXJlbnRDb250ZXh0OiBDb250ZXh0KTogdm9pZCB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHNwYW4uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICAgIGNvbnN0IGlzUm9vdCA9ICFzcGFuLnBhcmVudFNwYW5Db250ZXh0Py5zcGFuSWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgaWYgKCFpc0FnZW50VHJhY2VSb290KHNwYW4pKSByZXR1cm47XG4gICAgICB0aGlzLnRyYWNlSWRzLmFkZCh0cmFjZUlkKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnRyYWNlSWRzLmhhcyh0cmFjZUlkKSB8fCAhaXNVc2VmdWxBZ2VudERlc2NlbmRhbnQoc3BhbikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zcGFuSWRzLmFkZChzcGFuLnNwYW5Db250ZXh0KCkuc3BhbklkKTtcbiAgICB0aGlzLmRlbGVnYXRlLm9uU3RhcnQoc3BhbiwgcGFyZW50Q29udGV4dCk7XG4gIH1cblxuICBvbkVuZGluZyhzcGFuOiBTZGtTcGFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNwYW5JZHMuaGFzKHNwYW4uc3BhbkNvbnRleHQoKS5zcGFuSWQpKSByZXR1cm47XG4gICAgdGhpcy5kZWxlZ2F0ZS5vbkVuZGluZz8uKHNwYW4pO1xuICB9XG5cbiAgb25FbmQoc3BhbjogUmVhZGFibGVTcGFuKTogdm9pZCB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHNwYW4uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICAgIGNvbnN0IHNwYW5JZCA9IHNwYW4uc3BhbkNvbnRleHQoKS5zcGFuSWQ7XG4gICAgaWYgKCF0aGlzLnNwYW5JZHMuZGVsZXRlKHNwYW5JZCkpIHJldHVybjtcbiAgICB0aGlzLmRlbGVnYXRlLm9uRW5kKHNwYW4pO1xuICAgIGlmICghc3Bhbi5wYXJlbnRTcGFuQ29udGV4dD8uc3BhbklkKSB0aGlzLnRyYWNlSWRzLmRlbGV0ZSh0cmFjZUlkKTtcbiAgfVxuXG4gIGZvcmNlRmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUuZm9yY2VGbHVzaCgpO1xuICB9XG5cbiAgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy50cmFjZUlkcy5jbGVhcigpO1xuICAgIHRoaXMuc3Bhbklkcy5jbGVhcigpO1xuICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLnNodXRkb3duKCk7XG4gIH1cbn1cblxuLyoqIFdvcmtzcGFjZSBjbGllbnQgY2FycmllZCBvbiBhbiBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQuICovXG50eXBlIFdvcmtzcGFjZUNsaWVudCA9IGFwcGtpdC5Xb3Jrc3BhY2VDbGllbnRMaWtlO1xuXG4vKiogRXhwZXJpbWVudCB0YWcgRGF0YWJyaWNrcyBzdG9yZXMgYXMgYGNhdGFsb2cuc2NoZW1hLnRhYmxlX3ByZWZpeGAuICovXG5jb25zdCBUUkFDRV9ERVNUSU5BVElPTl9QQVRIX1RBRyA9IFwibWxmbG93LmV4cGVyaW1lbnQuZGF0YWJyaWNrc1RyYWNlRGVzdGluYXRpb25QYXRoXCI7XG4vKiogRXhwZXJpbWVudCB0YWcgbmFtaW5nIHRoZSBPVGVsIHNwYW5zIHRhYmxlIChgY2F0YWxvZy5zY2hlbWEue3ByZWZpeH1fb3RlbF9zcGFuc2ApLiAqL1xuY29uc3QgVFJBQ0VfU1BBTl9TVE9SQUdFX1RBQkxFX1RBRyA9IFwibWxmbG93LmV4cGVyaW1lbnQuZGF0YWJyaWNrc1RyYWNlU3BhblN0b3JhZ2VUYWJsZVwiO1xuXG4vKipcbiAqIENhY2hlZCBVQyB0YWJsZSBwcmVmaXggcmVzb2x2ZWQgZnJvbSB0aGUgZXhwZXJpbWVudC4gYGxvYWRlZGAgZGlzdGluZ3Vpc2hlc1xuICogXCJub3QgZmV0Y2hlZCB5ZXRcIiBmcm9tIFwiZmV0Y2hlZCwgZXhwZXJpbWVudCBoYXMgbm8gVUMgbG9jYXRpb25cIi4gTmV0d29ya1xuICogZmFpbHVyZXMgYXJlIG5vdCBjYWNoZWQgc28gYSBsYXRlciB0aHVtYnMgY2xpY2sgY2FuIHJldHJ5LlxuICovXG5sZXQgbG9hZGVkVWNQcmVmaXg6IHsgcHJlZml4OiBzdHJpbmcgfCB1bmRlZmluZWQgfSB8IHVuZGVmaW5lZDtcblxuLyoqIFN0cmlwIHRoZSBgdHJhY2U6L2AgVVJJIHdyYXBwZXIgYW5kIHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBhIFVDIHByZWZpeC4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVVjUHJlZml4KHJhdzogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSByYXdcbiAgICA/LnRyaW0oKVxuICAgIC5yZXBsYWNlKC9edHJhY2U6XFwvLywgXCJcIilcbiAgICAucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcbiAgcmV0dXJuIHZhbHVlIHx8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBEZXJpdmUgYGNhdGFsb2cuc2NoZW1hLnRhYmxlX3ByZWZpeGAgZnJvbSBhIHNwYW5zIHRhYmxlIG5hbWUuXG4gKiBEYXRhYnJpY2tzIG5hbWVzIHRoZSB0YWJsZSBge3ByZWZpeH1fb3RlbF9zcGFuc2AuXG4gKi9cbmZ1bmN0aW9uIHByZWZpeEZyb21TcGFuVGFibGUodGFibGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG5hbWUgPSB0YWJsZT8udHJpbSgpO1xuICBpZiAoIW5hbWUpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChuYW1lLmVuZHNXaXRoKFwiX290ZWxfc3BhbnNcIikpIHJldHVybiBuYW1lLnNsaWNlKDAsIC1cIl9vdGVsX3NwYW5zXCIubGVuZ3RoKTtcbiAgaWYgKG5hbWUuZW5kc1dpdGgoXCJfc3BhbnNcIikpIHJldHVybiBuYW1lLnNsaWNlKDAsIC1cIl9zcGFuc1wiLmxlbmd0aCk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4cGVyaW1lbnRUYWdNYXAocmF3OiB1bmtub3duKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHRhZ3MgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBpZiAoQXJyYXkuaXNBcnJheShyYXcpKSB7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgcmF3KSB7XG4gICAgICBpZiAoIW9iamVjdC5pc1JlY29yZCh0YWcpIHx8IHR5cGVvZiB0YWcua2V5ICE9PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB0YWcudmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0YWdzLnNldCh0YWcua2V5LCB0YWcudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGFncztcbiAgfVxuICBpZiAoIW9iamVjdC5pc1JlY29yZChyYXcpKSByZXR1cm4gdGFncztcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmF3KSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHRhZ3Muc2V0KGtleSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiB0YWdzO1xufVxuXG4vKipcbiAqIFVDIHRhYmxlIHByZWZpeCB0aGUgYXNzZXNzbWVudHMgQVBJIG5lZWRzLCByZWFkIGZyb20gZXhwZXJpbWVudCB0YWdzLlxuICpcbiAqIFByZWZlcnMgdGhlIHRocmVlLXBhcnQgZGVzdGluYXRpb24gcGF0aCBEYXRhYnJpY2tzIHdyaXRlcyB3aGVuIHRoZVxuICogZXhwZXJpbWVudCBpcyBsaW5rZWQgdG8gYSB0YWJsZS1wcmVmaXggbG9jYXRpb24uIEZhbGxzIGJhY2sgdG8gc3RyaXBwaW5nXG4gKiBgX290ZWxfc3BhbnNgIGZyb20gdGhlIHNwYW5zLXRhYmxlIHRhZy4gVHdvLXBhcnQgc2NoZW1hLWxpbmtlZCBkZXN0aW5hdGlvbnNcbiAqIGFyZSBpZ25vcmVkICh0aGV5IGFyZSBub3QgYSB0YWJsZSBwcmVmaXgpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdWNUcmFjZVByZWZpeEZyb21FeHBlcmltZW50VGFncyhyYXdUYWdzOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdGFncyA9IGV4cGVyaW1lbnRUYWdNYXAocmF3VGFncyk7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gbm9ybWFsaXplVWNQcmVmaXgodGFncy5nZXQoVFJBQ0VfREVTVElOQVRJT05fUEFUSF9UQUcpKTtcbiAgaWYgKGRlc3RpbmF0aW9uICYmIGRlc3RpbmF0aW9uLnNwbGl0KFwiLlwiKS5sZW5ndGggPj0gMykgcmV0dXJuIGRlc3RpbmF0aW9uO1xuICByZXR1cm4gcHJlZml4RnJvbVNwYW5UYWJsZSh0YWdzLmdldChUUkFDRV9TUEFOX1NUT1JBR0VfVEFCTEVfVEFHKSk7XG59XG5cbi8qKiBEcm9wIHRoZSBpbi1wcm9jZXNzIFVDIHByZWZpeCBjYWNoZSAodGVzdHMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0VWNUcmFjZVByZWZpeENhY2hlKCk6IHZvaWQge1xuICBsb2FkZWRVY1ByZWZpeCA9IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUcmFjZSBpZCB0aGUgYXNzZXNzbWVudHMgUkVTVCBBUEkgYWNjZXB0cyBmb3IgdGhpcyBkZXBsb3ltZW50LlxuICpcbiAqIERhdGFicmlja3MgQXBwcyBwZXJzaXN0IHRyYWNlcyBpbiBVbml0eSBDYXRhbG9nLiBUaGUgZXhwZXJpbWVudCBVSSBsaXN0c1xuICogdGhvc2Ugcm93cywgYnV0IGBQT1NUIC9hcGkvMy4wL21sZmxvdy90cmFjZXMve2lkfS9hc3Nlc3NtZW50c2AgbG9va3MgdXAgdGhlXG4gKiBleHBlcmltZW50IHN0b3JlIHVubGVzcyBge2lkfWAgaXMgdGhlIFVDIFVSSSBgdHJhY2U6L3tjYXRhbG9nfS57c2NoZW1hfS57cHJlZml4fS97dHItaGV4fWAuXG4gKiBBIGJhcmUgYHRyLTxoZXg+YCA0MDRzIGFuZCB0aGUgYXNzZXNzbWVudCBuZXZlciBhcHBlYXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWxmbG93QXNzZXNzbWVudFRyYWNlSWQodHJhY2VJZDogc3RyaW5nLCBwcmVmaXg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZXNvbHZlZCA9IG5vcm1hbGl6ZVVjUHJlZml4KHByZWZpeCk7XG4gIHJldHVybiByZXNvbHZlZCA/IGB0cmFjZTovJHtyZXNvbHZlZH0vJHt0cmFjZUlkfWAgOiB0cmFjZUlkO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlVWNUcmFjZVByZWZpeChjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGZyb21FbnYgPSBub3JtYWxpemVVY1ByZWZpeChwcm9jZXNzLmVudi5NTEZMT1dfVUNfVFJBQ0VfUFJFRklYKTtcbiAgaWYgKGZyb21FbnYpIHJldHVybiBmcm9tRW52O1xuICBpZiAobG9hZGVkVWNQcmVmaXgpIHJldHVybiBsb2FkZWRVY1ByZWZpeC5wcmVmaXg7XG4gIGNvbnN0IGV4cGVyaW1lbnQgPSBhd2FpdCBmZXRjaEV4cGVyaW1lbnQoY2xpZW50KTtcbiAgaWYgKCFleHBlcmltZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwcmVmaXggPSB1Y1RyYWNlUHJlZml4RnJvbUV4cGVyaW1lbnRUYWdzKGV4cGVyaW1lbnQudGFncyk7XG4gIGxvYWRlZFVjUHJlZml4ID0geyBwcmVmaXggfTtcbiAgcmV0dXJuIHByZWZpeDtcbn1cblxuLyoqIEFzc2Vzc21lbnRzIFJFU1QgcGF0aCBmb3IgYSB0cmFjZS4gYDMuMGAgaXMgdGhlIGN1cnJlbnQgTUxmbG93IEFQSSB2ZXJzaW9uLiAqL1xuY29uc3QgYXNzZXNzbWVudHNQYXRoID0gKHRyYWNlSWQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICBgL2FwaS8zLjAvbWxmbG93L3RyYWNlcy8ke2VuY29kZVVSSUNvbXBvbmVudCh0cmFjZUlkKX0vYXNzZXNzbWVudHNgO1xuXG4vKiogTnVtYmVyIG9mIHRpbWVzIHRvIHJldHJ5IGEgXCJ0cmFjZSBub3QgZm91bmRcIiByZXNwb25zZSBiZWZvcmUgZ2l2aW5nIHVwLiAqL1xuY29uc3QgTk9UX0ZPVU5EX1JFVFJJRVMgPSAzO1xuLyoqIEJhc2UgYmFja29mZiBiZXR3ZWVuIFwidHJhY2Ugbm90IGZvdW5kXCIgcmV0cmllcywgaW4gbXMgKGdyb3dzIGxpbmVhcmx5KS4gKi9cbmNvbnN0IE5PVF9GT1VORF9CQUNLT0ZGX01TID0gMTIwMDtcblxuY29uc3QgTWxmbG93RXhwZXJpbWVudFJlc3BvbnNlU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBleHBlcmltZW50OiB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgZXhwZXJpbWVudF9pZDogei5zdHJpbmcoKS5taW4oMSkuZGVzY3JpYmUoXCJXb3Jrc3BhY2UgTUxmbG93IGV4cGVyaW1lbnQgaWRlbnRpZmllci5cIiksXG4gICAgICAgIHRhZ3M6IHoudW5rbm93bigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJFeHBlcmltZW50IHRhZ3MsIGluY2x1ZGluZyB0aGUgVUMgdHJhY2UgbG9jYXRpb24uXCIpLFxuICAgICAgfSlcbiAgICAgIC5wYXNzdGhyb3VnaCgpXG4gICAgICAuZGVzY3JpYmUoXCJDb25maWd1cmVkIE1MZmxvdyBleHBlcmltZW50LlwiKSxcbiAgfSlcbiAgLnBhc3N0aHJvdWdoKClcbiAgLmRlc2NyaWJlKFwiTUxmbG93IGdldC1leHBlcmltZW50IHJlc3BvbnNlLlwiKTtcblxuY29uc3QgQ3VycmVudFVzZXJSZXNwb25zZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdXNlck5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkN1cnJlbnQgd29ya3NwYWNlIHVzZXIgbmFtZS5cIiksXG4gICAgYXBwbGljYXRpb25JZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiQ3VycmVudCBzZXJ2aWNlIHByaW5jaXBhbCBhcHBsaWNhdGlvbiBpZC5cIiksXG4gICAgZGlzcGxheU5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkN1cnJlbnQgcHJpbmNpcGFsIGRpc3BsYXkgbmFtZS5cIiksXG4gICAgZ3JvdXBzOiB6XG4gICAgICAuYXJyYXkoXG4gICAgICAgIHpcbiAgICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICAgIHZhbHVlOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJXb3Jrc3BhY2UgZ3JvdXAgaWRlbnRpZmllci5cIiksXG4gICAgICAgICAgICBkaXNwbGF5OiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJXb3Jrc3BhY2UgZ3JvdXAgZGlzcGxheSBuYW1lLlwiKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5wYXNzdGhyb3VnaCgpLFxuICAgICAgKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIkdyb3VwcyBhc3NpZ25lZCB0byB0aGUgY3VycmVudCBwcmluY2lwYWwuXCIpLFxuICB9KVxuICAucGFzc3Rocm91Z2goKVxuICAuZGVzY3JpYmUoXCJEYXRhYnJpY2tzIEN1cnJlbnQgVXNlciBBUEkgcmVzcG9uc2UuXCIpO1xuXG5jb25zdCBFeHBlcmltZW50UGVybWlzc2lvbnNSZXNwb25zZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgYWNjZXNzX2NvbnRyb2xfbGlzdDogelxuICAgICAgLmFycmF5KFxuICAgICAgICB6XG4gICAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgICB1c2VyX25hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlVzZXIgcHJpbmNpcGFsIG5hbWUuXCIpLFxuICAgICAgICAgICAgZ3JvdXBfbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiR3JvdXAgcHJpbmNpcGFsIG5hbWUuXCIpLFxuICAgICAgICAgICAgc2VydmljZV9wcmluY2lwYWxfbmFtZTogelxuICAgICAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgLmRlc2NyaWJlKFwiU2VydmljZSBwcmluY2lwYWwgYXBwbGljYXRpb24gaWQuXCIpLFxuICAgICAgICAgICAgYWxsX3Blcm1pc3Npb25zOiB6XG4gICAgICAgICAgICAgIC5hcnJheShcbiAgICAgICAgICAgICAgICB6XG4gICAgICAgICAgICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbl9sZXZlbDogei5zdHJpbmcoKS5kZXNjcmliZShcIkVmZmVjdGl2ZSBleHBlcmltZW50IHBlcm1pc3Npb24gbGV2ZWwuXCIpLFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIC5wYXNzdGhyb3VnaCgpLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAgIC5kZXNjcmliZShcIkRpcmVjdCBhbmQgaW5oZXJpdGVkIHBlcm1pc3Npb25zIGZvciB0aGlzIHByaW5jaXBhbC5cIiksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucGFzc3Rocm91Z2goKSxcbiAgICAgIClcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXCJFeHBlcmltZW50IGFjY2VzcyBjb250cm9sIGVudHJpZXMuXCIpLFxuICB9KVxuICAucGFzc3Rocm91Z2goKVxuICAuZGVzY3JpYmUoXCJEYXRhYnJpY2tzIGV4cGVyaW1lbnQgcGVybWlzc2lvbnMgcmVzcG9uc2UuXCIpO1xuXG5mdW5jdGlvbiBjb25maWd1cmVkRXhwZXJpbWVudCgpOiB7IGlkPzogc3RyaW5nOyBuYW1lPzogc3RyaW5nIH0ge1xuICBjb25zdCBpZCA9IHByb2Nlc3MuZW52Lk1MRkxPV19FWFBFUklNRU5UX0lEPy50cmltKCk7XG4gIGNvbnN0IG5hbWUgPSBwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9OQU1FPy50cmltKCk7XG4gIHJldHVybiB7XG4gICAgLi4uKGlkID8geyBpZCB9IDoge30pLFxuICAgIC4uLihuYW1lID8geyBuYW1lIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBUcmFja2luZyBVUkkgZm9yIGRpcmVjdCBsb2NhbCBNTGZsb3cgdHJhY2luZywgd2l0aCBDTEktcHJvZmlsZSBhdXRoIGluamVjdGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdE1sZmxvd1RyYWNraW5nVXJpKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudigpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBjb25maWd1cmVkID0gcHJvY2Vzcy5lbnYuTUxGTE9XX1RSQUNLSU5HX1VSST8udHJpbSgpO1xuICBpZiAoY29uZmlndXJlZCAmJiBjb25maWd1cmVkICE9PSBcImRhdGFicmlja3NcIikgcmV0dXJuIGNvbmZpZ3VyZWQ7XG4gIGNvbnN0IHByb2ZpbGUgPSBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0NPTkZJR19QUk9GSUxFPy50cmltKCk7XG4gIHJldHVybiBwcm9maWxlID8gYGRhdGFicmlja3M6Ly8ke3Byb2ZpbGV9YCA6IFwiZGF0YWJyaWNrc1wiO1xufVxuXG4vKiogUGFyc2UgdGhlIG9wdGlvbmFsIFVDIHRhYmxlLXByZWZpeCBsb2NhdGlvbiB1c2VkIGJ5IGRpcmVjdCBsb2NhbCB0cmFjaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdE1sZmxvd1RyYWNlTG9jYXRpb24oKTpcbiAgfCB7IGNhdGFsb2dOYW1lOiBzdHJpbmc7IHNjaGVtYU5hbWU6IHN0cmluZzsgdGFibGVQcmVmaXg6IHN0cmluZyB9XG4gIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2F0YWxvZ05hbWUgPSBwcm9jZXNzLmVudi5NTEZMT1dfVUNfQ0FUQUxPRz8udHJpbSgpO1xuICBjb25zdCBzY2hlbWFOYW1lID0gcHJvY2Vzcy5lbnYuTUxGTE9XX1VDX1NDSEVNQT8udHJpbSgpO1xuICBjb25zdCB0YWJsZVByZWZpeCA9IHByb2Nlc3MuZW52Lk1MRkxPV19VQ19UQUJMRV9QUkVGSVg/LnRyaW0oKTtcbiAgaWYgKGNhdGFsb2dOYW1lICYmIHNjaGVtYU5hbWUgJiYgdGFibGVQcmVmaXgpIHtcbiAgICByZXR1cm4geyBjYXRhbG9nTmFtZSwgc2NoZW1hTmFtZSwgdGFibGVQcmVmaXggfTtcbiAgfVxuXG4gIGNvbnN0IHByZWZpeCA9IG5vcm1hbGl6ZVVjUHJlZml4KHByb2Nlc3MuZW52Lk1MRkxPV19VQ19UUkFDRV9QUkVGSVgpO1xuICBpZiAoIXByZWZpeCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcGFydHMgPSBwcmVmaXguc3BsaXQoXCIuXCIpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBbcHJlZml4Q2F0YWxvZywgcHJlZml4U2NoZW1hLCBwcmVmaXhUYWJsZV0gPSBwYXJ0cztcbiAgaWYgKCFwcmVmaXhDYXRhbG9nIHx8ICFwcmVmaXhTY2hlbWEgfHwgIXByZWZpeFRhYmxlKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIGNhdGFsb2dOYW1lOiBwcmVmaXhDYXRhbG9nLFxuICAgIHNjaGVtYU5hbWU6IHByZWZpeFNjaGVtYSxcbiAgICB0YWJsZVByZWZpeDogcHJlZml4VGFibGUsXG4gIH07XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBsb2NhbCBkaXJlY3QtdG8tZXhwZXJpbWVudCBNTGZsb3cgU0RLIGhhcyBlbm91Z2ggY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3RNbGZsb3dUcmFjaW5nQ29uZmlndXJlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgIWVudmlyb25tZW50VXRpbHMuaXNEYXRhYnJpY2tzQXBwRW52KCkgJiZcbiAgICAgIHByb2Nlc3MuZW52Lk1MRkxPV19FWFBFUklNRU5UX0lEPy50cmltKCkgJiZcbiAgICAgIGRpcmVjdE1sZmxvd1RyYWNraW5nVXJpKCksXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRldGVjdGVkRGlyZWN0TWxmbG93VHJhY2VMb2NhdGlvbihcbiAgbWxmbG93OiBNbGZsb3dNb2R1bGUsXG4gIHRyYWNraW5nVXJpOiBzdHJpbmcsXG4gIGV4cGVyaW1lbnRJZDogc3RyaW5nLFxuICBob3N0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPHsgY2F0YWxvZ05hbWU6IHN0cmluZzsgc2NoZW1hTmFtZTogc3RyaW5nOyB0YWJsZVByZWZpeDogc3RyaW5nIH0gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZXhwbGljaXQgPSBkaXJlY3RNbGZsb3dUcmFjZUxvY2F0aW9uKCk7XG4gIGlmIChleHBsaWNpdCkgcmV0dXJuIGV4cGxpY2l0O1xuICB0cnkge1xuICAgIGNvbnN0IGF1dGhQcm92aWRlciA9IG1sZmxvdy5jcmVhdGVBdXRoUHJvdmlkZXIoe1xuICAgICAgdHJhY2tpbmdVcmksXG4gICAgICAuLi4oaG9zdCA/IHsgaG9zdCB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBtbGZsb3cuTWxmbG93Q2xpZW50KHsgdHJhY2tpbmdVcmksIGF1dGhQcm92aWRlciB9KTtcbiAgICBjb25zdCBleHBlcmltZW50ID0gYXdhaXQgY2xpZW50LmdldEV4cGVyaW1lbnQoZXhwZXJpbWVudElkKTtcbiAgICBpZiAoIWV4cGVyaW1lbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgeyB1Y0xvY2F0aW9uRnJvbUV4cGVyaW1lbnRUYWdzIH0gPSBhd2FpdCBpbXBvcnQoXCJAbWxmbG93L2NvcmUvZGlzdC9jb3JlL2Rlc3RpbmF0aW9uXCIpO1xuICAgIGNvbnN0IGxvY2F0aW9uID0gdWNMb2NhdGlvbkZyb21FeHBlcmltZW50VGFncyhleHBlcmltZW50LnRhZ3MpO1xuICAgIGlmICghbG9jYXRpb24/LnRhYmxlUHJlZml4KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBjYXRhbG9nTmFtZTogbG9jYXRpb24uY2F0YWxvZ05hbWUsXG4gICAgICBzY2hlbWFOYW1lOiBsb2NhdGlvbi5zY2hlbWFOYW1lLFxuICAgICAgdGFibGVQcmVmaXg6IGxvY2F0aW9uLnRhYmxlUHJlZml4LFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiZGlyZWN0IE1MZmxvdyBVQyB0cmFjZS1sb2NhdGlvbiBkZXRlY3Rpb24gZmFpbGVkXCIsIHtcbiAgICAgIGV4cGVyaW1lbnRJZCxcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTdGFydCB0aGUgTUxmbG93IE5vZGUgdHJhY2VyIGZvciBsb2NhbCBkZXZlbG9wbWVudCB3aGVuIEFwcEtpdCBoYXMgbm8gT1RMUFxuICogZXhwb3J0ZXIuIFRoaXMgcHJvdmlkZXIgaXMgbmV2ZXIgc3RhcnRlZCBpbiB0aGUgZGVwbG95ZWQgQXBwcyBwYXRoLCBhdm9pZGluZ1xuICogYSBzZWNvbmQgZ2xvYmFsIE9UZWwgcHJvdmlkZXIgcmFjaW5nIEFwcEtpdCdzIHRlbGVtZXRyeSBtYW5hZ2VyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZURpcmVjdE1sZmxvd1RyYWNpbmcoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChkaXJlY3RNbGZsb3cpIHJldHVybiB0cnVlO1xuICBpZiAoZGlyZWN0TWxmbG93SW5pdFN0YXJ0ZWQgfHwgIWRpcmVjdE1sZmxvd1RyYWNpbmdDb25maWd1cmVkKCkpIHJldHVybiBmYWxzZTtcbiAgZGlyZWN0TWxmbG93SW5pdFN0YXJ0ZWQgPSB0cnVlO1xuXG4gIGNvbnN0IGV4cGVyaW1lbnRJZCA9IHByb2Nlc3MuZW52Lk1MRkxPV19FWFBFUklNRU5UX0lEIS50cmltKCk7XG4gIGNvbnN0IHRyYWNraW5nVXJpID0gZGlyZWN0TWxmbG93VHJhY2tpbmdVcmkoKSE7XG4gIHRyeSB7XG4gICAgY29uc3QgbWxmbG93ID0gYXdhaXQgaW1wb3J0KFwiQG1sZmxvdy9jb3JlXCIpO1xuICAgIGNvbnN0IHJhd0hvc3QgPSBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0hPU1Q/LnRyaW0oKTtcbiAgICBjb25zdCBob3N0ID0gcmF3SG9zdFxuICAgICAgPyAvXmh0dHBzPzpcXC9cXC8vaS50ZXN0KHJhd0hvc3QpXG4gICAgICAgID8gcmF3SG9zdFxuICAgICAgICA6IGBodHRwczovLyR7cmF3SG9zdH1gXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0cmFjZUxvY2F0aW9uID0gYXdhaXQgZGV0ZWN0ZWREaXJlY3RNbGZsb3dUcmFjZUxvY2F0aW9uKFxuICAgICAgbWxmbG93LFxuICAgICAgdHJhY2tpbmdVcmksXG4gICAgICBleHBlcmltZW50SWQsXG4gICAgICBob3N0LFxuICAgICk7XG4gICAgaWYgKCF0cmFjZUxvY2F0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgICAgICBcIkRpcmVjdCBsb2NhbCBNTGZsb3cgdHJhY2luZyByZXF1aXJlcyBhIFVDLWxpbmtlZCBleHBlcmltZW50IG9yIE1MRkxPV19VQ19UUkFDRV9QUkVGSVguXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBbeyBEYXRhYnJpY2tzVUNUYWJsZVNwYW5FeHBvcnRlciwgRGF0YWJyaWNrc1VDVGFibGVTcGFuUHJvY2Vzc29yIH0sIHNka10gPVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBpbXBvcnQoXCJAbWxmbG93L2NvcmUvZGlzdC9leHBvcnRlcnMvdWNfdGFibGVcIiksXG4gICAgICAgIGltcG9ydChcIkBvcGVudGVsZW1ldHJ5L3Nkay10cmFjZS1ub2RlXCIpLFxuICAgICAgXSk7XG4gICAgY29uc3QgYXV0aFByb3ZpZGVyID0gbWxmbG93LmNyZWF0ZUF1dGhQcm92aWRlcih7XG4gICAgICB0cmFja2luZ1VyaSxcbiAgICAgIC4uLihob3N0ID8geyBob3N0IH0gOiB7fSksXG4gICAgfSk7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IG1sZmxvdy5NbGZsb3dDbGllbnQoeyB0cmFja2luZ1VyaSwgYXV0aFByb3ZpZGVyIH0pO1xuICAgIGNvbnN0IGV4cG9ydGVyID0gbmV3IERhdGFicmlja3NVQ1RhYmxlU3BhbkV4cG9ydGVyKGNsaWVudCk7XG4gICAgY29uc3QgcHJvY2Vzc29yID0gbmV3IEFnZW50VHJhY2VTcGFuUHJvY2Vzc29yKFxuICAgICAgbmV3IERhdGFicmlja3NVQ1RhYmxlU3BhblByb2Nlc3NvcihleHBvcnRlciwgdHJhY2VMb2NhdGlvbiksXG4gICAgKTtcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBzZGsuTm9kZVRyYWNlclByb3ZpZGVyKHsgc3BhblByb2Nlc3NvcnM6IFtwcm9jZXNzb3JdIH0pO1xuICAgIHByb3ZpZGVyLnJlZ2lzdGVyKCk7XG4gICAgZGlyZWN0TWxmbG93ID0gbWxmbG93O1xuICAgIGRpcmVjdE1sZmxvd1Byb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgZGlyZWN0TWxmbG93UHJvY2Vzc29yID0gcHJvY2Vzc29yO1xuICAgIGxvZ2dlci5pbmZvKFwiZGlyZWN0IE1MZmxvdyB0cmFjaW5nIGVuYWJsZWRcIiwge1xuICAgICAgZXhwZXJpbWVudElkLFxuICAgICAgdHJhY2tpbmdVcmksXG4gICAgICB0cmFjZUxvY2F0aW9uLFxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImRpcmVjdCBNTGZsb3cgdHJhY2luZyBkaXNhYmxlZFwiLCB7XG4gICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIFBlcnNpc3QgdHJhY2UtbGV2ZWwgZmllbGRzIG9uIHRoZSBkaXJlY3QgTUxmbG93IHRyYWNlIGluIHRoZSBjdXJyZW50IE9UZWwgY29udGV4dC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZShvcHRpb25zOiBVcGRhdGVDdXJyZW50VHJhY2VPcHRpb25zKTogdm9pZCB7XG4gIGRpcmVjdE1sZmxvdz8udXBkYXRlQ3VycmVudFRyYWNlKG9wdGlvbnMpO1xufVxuXG4vKiogUGVyc2lzdCB0YWdzIG9uIHRoZSBkaXJlY3QgTUxmbG93IHRyYWNlIGFjdGl2ZSBpbiB0aGUgY3VycmVudCBPVGVsIGNvbnRleHQuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQWN0aXZlTWxmbG93VHJhY2VUYWdzKHRhZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiB2b2lkIHtcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2UoeyB0YWdzIH0pO1xufVxuXG4vKiogV2hldGhlciB0aGlzIHByb2Nlc3Mgb3ducyB0aGUgZmlsdGVyZWQgbG9jYWwgTUxmbG93IHRyYWNlciBwcm92aWRlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3RNbGZsb3dUcmFjaW5nQWN0aXZlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZGlyZWN0TWxmbG93UHJvY2Vzc29yICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKiBGbHVzaCBwZW5kaW5nIGRpcmVjdCBsb2NhbCB0cmFjZSBleHBvcnRzIGR1cmluZyBncmFjZWZ1bCBzaHV0ZG93bi4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmbHVzaERpcmVjdE1sZmxvd1RyYWNpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGRpcmVjdE1sZmxvd1Byb2Nlc3Nvcj8uZm9yY2VGbHVzaCgpO1xuICBhd2FpdCBkaXJlY3RNbGZsb3dQcm92aWRlcj8uZm9yY2VGbHVzaCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgTUxmbG93IGZlZWRiYWNrIGxvZ2dpbmcgaXMgYXZhaWxhYmxlIGZvciB0aGlzIGRlcGxveW1lbnQuXG4gKlxuICogRW5hYmxlZCB3aGVuIGFuIE1MZmxvdyBleHBlcmltZW50IGlzIGNvbmZpZ3VyZWQgYW5kIHRyYWNlcyBoYXZlIGFuIGV4cG9ydFxuICogcGF0aDogQXBwS2l0IE9UTFAgaW4gYSBEYXRhYnJpY2tzIEFwcCwgb3IgdGhlIGRpcmVjdCBNTGZsb3cgTm9kZSBTREsgb3V0c2lkZVxuICogb25lLiBCb3RoIHBhdGhzIGFyZSBzZWxlY3RlZCBmcm9tIHN0YW5kYXJkIGVudmlyb25tZW50IHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1sZmxvd0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IGhhc0V4cG9ydGVyID0gQm9vbGVhbihcbiAgICBwcm9jZXNzLmVudi5PVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlQ/LnRyaW0oKSB8fFxuICAgIHByb2Nlc3MuZW52Lk9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfRU5EUE9JTlQ/LnRyaW0oKSxcbiAgKTtcbiAgY29uc3QgaGFzRXhwZXJpbWVudCA9IEJvb2xlYW4oXG4gICAgcHJvY2Vzcy5lbnYuTUxGTE9XX0VYUEVSSU1FTlRfSUQ/LnRyaW0oKSB8fCBwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9OQU1FPy50cmltKCksXG4gICk7XG4gIHJldHVybiBoYXNFeHBlcmltZW50ICYmIChoYXNFeHBvcnRlciB8fCBkaXJlY3RNbGZsb3dUcmFjaW5nQ29uZmlndXJlZCgpKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHdoZXRoZXIgdXNlciBmZWVkYmFjayBpcyBlbmFibGVkIGZyb20gdGhlIHBsdWdpbidzIG9wdGlvbmFsXG4gKiBgY29uZmlnLmZlZWRiYWNrYCBvdmVycmlkZTogdGhlIGV4cGxpY2l0IGJvb2xlYW4gd2lucywgb3RoZXJ3aXNlIGZhbGxcbiAqIGJhY2sgdG8gYXV0by1kZXRlY3RpbmcgTUxmbG93IHRyYWNpbmcgKHtAbGluayBtbGZsb3dFbmFibGVkfSkuIFNoYXJlZFxuICogYnkgdGhlIHBsdWdpbidzIGNsaWVudC1jb25maWcgZ2F0ZSBhbmQgdGhlIHNlcnZlcidzIHRyYWNlLWlkIGhlYWRlciBzb1xuICogdGhlIHR3byBuZXZlciBkaXNhZ3JlZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGZWVkYmFja0VuYWJsZWQoZXhwbGljaXQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGV4cGxpY2l0ID8/IG1sZmxvd0VuYWJsZWQoKTtcbn1cblxuLyoqXG4gKiBSZWplY3QgYW4gZXhwbGljaXRseSBlbmFibGVkIGZlZWRiYWNrIHN1cmZhY2Ugd2hlbiBubyBNTGZsb3cgZXhwZXJpbWVudCBpc1xuICogY29uZmlndXJlZC4gQXV0byBtb2RlIHJlbWFpbnMgbm9uLWZhdGFsIGFuZCBzaW1wbHkgZGlzYWJsZXMgZmVlZGJhY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUZlZWRiYWNrQ29uZmlnKGV4cGxpY2l0OiBib29sZWFuIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmIChleHBsaWNpdCAhPT0gdHJ1ZSkgcmV0dXJuO1xuICBjb25zdCBleHBlcmltZW50ID0gY29uZmlndXJlZEV4cGVyaW1lbnQoKTtcbiAgaWYgKGV4cGVyaW1lbnQuaWQgfHwgZXhwZXJpbWVudC5uYW1lKSByZXR1cm47XG4gIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgXCJtYXN0cmE6IGZlZWRiYWNrIGlzIGVuYWJsZWQgYnV0IG5vIE1MZmxvdyBleHBlcmltZW50IGlzIGNvbmZpZ3VyZWQuIFwiICtcbiAgICAgIFwiU2V0IE1MRkxPV19FWFBFUklNRU5UX0lEIG9yIE1MRkxPV19FWFBFUklNRU5UX05BTUUsIHVzZSBmZWVkYmFjazogZmFsc2UsIFwiICtcbiAgICAgIFwib3Igb21pdCBmZWVkYmFjayB0byB1c2UgYXV0b21hdGljIGRldGVjdGlvbi5cIixcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIGNvbmZpZ3VyZWQgZXhwZXJpbWVudCBVUkwgb25seSB3aGVuIHRoZSBhY3RpdmUgRGF0YWJyaWNrc1xuICogcHJpbmNpcGFsIGhhcyBlZmZlY3RpdmUgYENBTl9NQU5BR0VgIHBlcm1pc3Npb24uIFBlcm1pc3Npb24gbG9va3VwIGlzXG4gKiBpbnRlbnRpb25hbGx5IGJlc3QtZWZmb3J0IHNvIEFwcHMgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IGV4cG9zZSB0aGVcbiAqIHJlcXVpcmVkIEFQSXMgc2ltcGx5IG9taXQgdGhlIGRlYnVnIGFmZm9yZGFuY2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtbGZsb3dFeHBlcmltZW50TWFuYWdlclVybChcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCByZXNvbHZlTWxmbG93RXhwZXJpbWVudE1hbmFnZXJVcmwoY2xpZW50KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlTWxmbG93RXhwZXJpbWVudE1hbmFnZXJVcmwoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZXhwZXJpbWVudElkID0gYXdhaXQgcmVzb2x2ZUV4cGVyaW1lbnRJZChjbGllbnQpO1xuICBpZiAoIWV4cGVyaW1lbnRJZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBbY3VycmVudFJlc3BvbnNlLCBwZXJtaXNzaW9uc1Jlc3BvbnNlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBkYXRhYnJpY2tzRmV0Y2goY2xpZW50LCBcIi9hcGkvMi4wL3ByZXZpZXcvc2NpbS92Mi9NZVwiLCB7IG1ldGhvZDogXCJHRVRcIiB9KSxcbiAgICBkYXRhYnJpY2tzRmV0Y2goXG4gICAgICBjbGllbnQsXG4gICAgICBgL2FwaS8yLjAvcGVybWlzc2lvbnMvZXhwZXJpbWVudHMvJHtlbmNvZGVVUklDb21wb25lbnQoZXhwZXJpbWVudElkKX1gLFxuICAgICAgeyBtZXRob2Q6IFwiR0VUXCIgfSxcbiAgICApLFxuICBdKTtcbiAgaWYgKCFjdXJyZW50UmVzcG9uc2Uub2sgfHwgIXBlcm1pc3Npb25zUmVzcG9uc2Uub2spIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgY3VycmVudCA9IEN1cnJlbnRVc2VyUmVzcG9uc2VTY2hlbWEuc2FmZVBhcnNlKGF3YWl0IHJlYWRSZXNwb25zZUpzb24oY3VycmVudFJlc3BvbnNlKSk7XG4gIGNvbnN0IHBlcm1pc3Npb25zID0gRXhwZXJpbWVudFBlcm1pc3Npb25zUmVzcG9uc2VTY2hlbWEuc2FmZVBhcnNlKFxuICAgIGF3YWl0IHJlYWRSZXNwb25zZUpzb24ocGVybWlzc2lvbnNSZXNwb25zZSksXG4gICk7XG4gIGlmICghY3VycmVudC5zdWNjZXNzIHx8ICFwZXJtaXNzaW9ucy5zdWNjZXNzKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHVzZXJOYW1lcyA9IG5ldyBTZXQoXG4gICAgW2N1cnJlbnQuZGF0YS51c2VyTmFtZSwgY3VycmVudC5kYXRhLmFwcGxpY2F0aW9uSWQsIGN1cnJlbnQuZGF0YS5kaXNwbGF5TmFtZV0uZmlsdGVyKFxuICAgICAgKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IEJvb2xlYW4odmFsdWUpLFxuICAgICksXG4gICk7XG4gIGNvbnN0IGdyb3VwTmFtZXMgPSBuZXcgU2V0KFxuICAgIChjdXJyZW50LmRhdGEuZ3JvdXBzID8/IFtdKS5mbGF0TWFwKCh7IHZhbHVlLCBkaXNwbGF5IH0pID0+XG4gICAgICBbdmFsdWUsIGRpc3BsYXldLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBzdHJpbmcgPT4gQm9vbGVhbihlbnRyeSkpLFxuICAgICksXG4gICk7XG4gIGNvbnN0IGNhbk1hbmFnZSA9IChwZXJtaXNzaW9ucy5kYXRhLmFjY2Vzc19jb250cm9sX2xpc3QgPz8gW10pLnNvbWUoKGVudHJ5KSA9PiB7XG4gICAgY29uc3QgbWF0Y2hlcyA9XG4gICAgICAoZW50cnkudXNlcl9uYW1lICE9PSB1bmRlZmluZWQgJiYgdXNlck5hbWVzLmhhcyhlbnRyeS51c2VyX25hbWUpKSB8fFxuICAgICAgKGVudHJ5LnNlcnZpY2VfcHJpbmNpcGFsX25hbWUgIT09IHVuZGVmaW5lZCAmJiB1c2VyTmFtZXMuaGFzKGVudHJ5LnNlcnZpY2VfcHJpbmNpcGFsX25hbWUpKSB8fFxuICAgICAgKGVudHJ5Lmdyb3VwX25hbWUgIT09IHVuZGVmaW5lZCAmJiBncm91cE5hbWVzLmhhcyhlbnRyeS5ncm91cF9uYW1lKSk7XG4gICAgcmV0dXJuIChcbiAgICAgIG1hdGNoZXMgJiZcbiAgICAgIChlbnRyeS5hbGxfcGVybWlzc2lvbnMgPz8gW10pLnNvbWUoXG4gICAgICAgIChwZXJtaXNzaW9uKSA9PiBwZXJtaXNzaW9uLnBlcm1pc3Npb25fbGV2ZWwgPT09IFwiQ0FOX01BTkFHRVwiLFxuICAgICAgKVxuICAgICk7XG4gIH0pO1xuICBpZiAoIWNhbk1hbmFnZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICByZXR1cm4gbmV3IFVSTChgL21sL2V4cGVyaW1lbnRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGV4cGVyaW1lbnRJZCl9YCwgaG9zdCkudG9TdHJpbmcoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hFeHBlcmltZW50KFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbik6IFByb21pc2U8eyBleHBlcmltZW50X2lkOiBzdHJpbmc7IHRhZ3M/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZXhwZXJpbWVudCA9IGNvbmZpZ3VyZWRFeHBlcmltZW50KCk7XG4gIGNvbnN0IHBhdGggPSBleHBlcmltZW50LmlkXG4gICAgPyBgL2FwaS8yLjAvbWxmbG93L2V4cGVyaW1lbnRzL2dldD9leHBlcmltZW50X2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGV4cGVyaW1lbnQuaWQpfWBcbiAgICA6IGV4cGVyaW1lbnQubmFtZVxuICAgICAgPyBgL2FwaS8yLjAvbWxmbG93L2V4cGVyaW1lbnRzL2dldC1ieS1uYW1lP2V4cGVyaW1lbnRfbmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgICAgICBleHBlcmltZW50Lm5hbWUsXG4gICAgICAgICl9YFxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmICghcGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBkYXRhYnJpY2tzRmV0Y2goY2xpZW50LCBwYXRoLCB7IG1ldGhvZDogXCJHRVRcIiB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcGFyc2VkID0gTWxmbG93RXhwZXJpbWVudFJlc3BvbnNlU2NoZW1hLnNhZmVQYXJzZShhd2FpdCByZWFkUmVzcG9uc2VKc29uKHJlc3BvbnNlKSk7XG4gIHJldHVybiBwYXJzZWQuc3VjY2VzcyA/IHBhcnNlZC5kYXRhLmV4cGVyaW1lbnQgOiB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVFeHBlcmltZW50SWQoY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBjb25maWd1cmVkID0gY29uZmlndXJlZEV4cGVyaW1lbnQoKTtcbiAgaWYgKGNvbmZpZ3VyZWQuaWQpIHJldHVybiBjb25maWd1cmVkLmlkO1xuICByZXR1cm4gKGF3YWl0IGZldGNoRXhwZXJpbWVudChjbGllbnQpKT8uZXhwZXJpbWVudF9pZDtcbn1cblxuLyoqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBsb2dGZWVkYmFja30uICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ0ZlZWRiYWNrUGFyYW1zIHtcbiAgLyoqIE1MZmxvdyB0cmFjZSBpZCB0aGUgYXNzZXNzbWVudCBhdHRhY2hlcyB0byAoYHRyLTxoZXg+YCkuICovXG4gIHRyYWNlSWQ6IHN0cmluZztcbiAgLyoqIEFzc2Vzc21lbnQgbmFtZTsgZGVmYXVsdHMgcGVyIHdoZXRoZXIgYSB2YWx1ZSBvciBhIGNvbW1lbnQgaXMgc2VudC4gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIFRodW1icyAvIHJhdGluZyAvIGxhYmVsIHZhbHVlLiBPbWl0IGZvciBhIGNvbW1lbnQtb25seSBzdWJtaXNzaW9uLiAqL1xuICB2YWx1ZT86IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBGcmVlZm9ybSBjb21tZW50OiB0aGUgcmF0aW9uYWxlIGFsb25nc2lkZSBhIHZhbHVlLCBvciB0aGUgdmFsdWUgaXRzZWxmIHdoZW4gbm9uZS4gKi9cbiAgY29tbWVudD86IHN0cmluZztcbiAgLyoqIElkZW50aXR5IHRoZSBmZWVkYmFjayBpcyBhdHRyaWJ1dGVkIHRvICh1c2VyIGVtYWlsIC8gaWQpLiAqL1xuICBzb3VyY2VJZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBMb2cgYSBIVU1BTiBmZWVkYmFjayBhc3Nlc3NtZW50IHRvIGEgdHJhY2UuIFJldHVybnMgdGhlIGNyZWF0ZWRcbiAqIGFzc2Vzc21lbnQgaWQgb24gc3VjY2Vzcywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgdHJhY2UgY2FuJ3QgYmVcbiAqIGZvdW5kIChldmVuIGFmdGVyIHJldHJ5aW5nIGZvciBleHBvcnQgbGFnKSBvciB0aGUgcmVxdWVzdCBvdGhlcndpc2VcbiAqIGZhaWxzIC0gY2FsbGVycyBzdXJmYWNlIHRoYXQgYXMgYSBzb2Z0IFwibm90IHJlY29yZGVkXCIgcmF0aGVyIHRoYW4gYW5cbiAqIGVycm9yLCBrZWVwaW5nIHRoZSBjaGF0IHVzYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvZ0ZlZWRiYWNrKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgcGFyYW1zOiBMb2dGZWVkYmFja1BhcmFtcyxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIC8vIEEgY29tbWVudCB3aXRoIG5vIHRodW1icyB2YWx1ZSBpcyBsb2dnZWQgYXMgdGV4dCBmZWVkYmFjazsgYSB2YWx1ZVxuICAvLyAod2l0aCBhbiBvcHRpb25hbCBjb21tZW50IGFzIHRoZSByYXRpb25hbGUpIGlzIHRoZSB0aHVtYnMgcGF0aC5cbiAgY29uc3QgaGFzVmFsdWUgPSBwYXJhbXMudmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgbmFtZSA9XG4gICAgcGFyYW1zLm5hbWU/LnRyaW0oKSB8fFxuICAgIChoYXNWYWx1ZSA/IGZlZWRiYWNrLkRFRkFVTFRfRkVFREJBQ0tfTkFNRSA6IGZlZWRiYWNrLkRFRkFVTFRfQ09NTUVOVF9OQU1FKTtcbiAgY29uc3QgdmFsdWUgPSBoYXNWYWx1ZSA/IHBhcmFtcy52YWx1ZSA6IHBhcmFtcy5jb21tZW50O1xuICBjb25zdCBhc3Nlc3NtZW50VHJhY2VJZCA9IG1sZmxvd0Fzc2Vzc21lbnRUcmFjZUlkKFxuICAgIHBhcmFtcy50cmFjZUlkLFxuICAgIGF3YWl0IHJlc29sdmVVY1RyYWNlUHJlZml4KGNsaWVudCksXG4gICk7XG4gIGNvbnN0IGFzc2Vzc21lbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHRyYWNlX2lkOiBhc3Nlc3NtZW50VHJhY2VJZCxcbiAgICBhc3Nlc3NtZW50X25hbWU6IG5hbWUsXG4gICAgc291cmNlOiB7XG4gICAgICBzb3VyY2VfdHlwZTogXCJIVU1BTlwiLFxuICAgICAgc291cmNlX2lkOiBwYXJhbXMuc291cmNlSWQ/LnRyaW0oKSB8fCBcInVzZXJcIixcbiAgICB9LFxuICAgIGZlZWRiYWNrOiB7IHZhbHVlIH0sXG4gICAgLi4uKGhhc1ZhbHVlICYmIHBhcmFtcy5jb21tZW50Py50cmltKCkgPyB7IHJhdGlvbmFsZTogcGFyYW1zLmNvbW1lbnQgfSA6IHt9KSxcbiAgfTtcbiAgY29uc3QgYm9keSA9IHsgYXNzZXNzbWVudCB9O1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IE5PVF9GT1VORF9SRVRSSUVTOyBhdHRlbXB0KyspIHtcbiAgICBsZXQgcmVzOiBSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gYXdhaXQgZGF0YWJyaWNrc0ZldGNoKGNsaWVudCwgYXNzZXNzbWVudHNQYXRoKGFzc2Vzc21lbnRUcmFjZUlkKSwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBib2R5LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIud2FybihcImZlZWRiYWNrIHJlcXVlc3QgZmFpbGVkXCIsIHtcbiAgICAgICAgdHJhY2VJZDogcGFyYW1zLnRyYWNlSWQsXG4gICAgICAgIGFzc2Vzc21lbnRUcmFjZUlkLFxuICAgICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHJlcy5vaykge1xuICAgICAgY29uc3QgcGFyc2VkID0gYXdhaXQgcmVhZFJlc3BvbnNlSnNvbihyZXMpO1xuICAgICAgY29uc3QgYXNzZXNzbWVudElkID1cbiAgICAgICAgKHBhcnNlZCBhcyB7IGFzc2Vzc21lbnQ/OiB7IGFzc2Vzc21lbnRfaWQ/OiB1bmtub3duIH0gfSk/LmFzc2Vzc21lbnQ/LmFzc2Vzc21lbnRfaWQgPz9cbiAgICAgICAgKHBhcnNlZCBhcyB7IGFzc2Vzc21lbnRfaWQ/OiB1bmtub3duIH0pPy5hc3Nlc3NtZW50X2lkO1xuICAgICAgcmV0dXJuIHR5cGVvZiBhc3Nlc3NtZW50SWQgPT09IFwic3RyaW5nXCIgPyBhc3Nlc3NtZW50SWQgOiBcIlwiO1xuICAgIH1cbiAgICAvLyBUcmFjZSBleHBvcnQgaXMgYXN5bmM7IGEgZnJlc2ggdHJhY2UgbWF5IG5vdCBleGlzdCB5ZXQuIFJldHJ5IGFcbiAgICAvLyBmZXcgdGltZXMgd2l0aCBhIHNob3J0IGJhY2tvZmYgYmVmb3JlIGdpdmluZyB1cCBzb2Z0bHkuXG4gICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwNCAmJiBhdHRlbXB0IDwgTk9UX0ZPVU5EX1JFVFJJRVMpIHtcbiAgICAgIGF3YWl0IGFzeW5jVXRpbHMuc2xlZXAoTk9UX0ZPVU5EX0JBQ0tPRkZfTVMgKiAoYXR0ZW1wdCArIDEpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBsb2dnZXIud2FybihcImZlZWRiYWNrIG5vdCByZWNvcmRlZFwiLCB7XG4gICAgICB0cmFjZUlkOiBwYXJhbXMudHJhY2VJZCxcbiAgICAgIGFzc2Vzc21lbnRUcmFjZUlkLFxuICAgICAgc3RhdHVzOiByZXMuc3RhdHVzLFxuICAgICAgYm9keTogYXdhaXQgcmVhZFJlc3BvbnNlVGV4dChyZXMpLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
package/lib/src/model.js CHANGED
@@ -28,6 +28,7 @@ import { functionUtils, json, log, net } from "@dbx-tools/shared-core";
28
28
  import { MASTRA_USER_KEY } from "./config.js";
29
29
  import { rewriteServingRequest, rewriteServingResponseBody, rewriteServingResponseStream, } from "./serving-sanitize.js";
30
30
  import { MASTRA_MODEL_OVERRIDE_KEY, resolveServingConfig } from "./serving.js";
31
+ import { recordActiveTraceAuth, recordActiveTraceModel } from "./telemetry.js";
31
32
  const { parseModelClass } = classes;
32
33
  const { selectModel } = resolve;
33
34
  /** Keep Responses turns stateless so tool continuations replay encrypted reasoning inline. */
@@ -87,6 +88,7 @@ export async function buildModel(config, requestContext, overrides = {}) {
87
88
  // (the active OBO scope, or the service principal) when it's absent.
88
89
  const user = requestContext.get(MASTRA_USER_KEY);
89
90
  const executionContext = user?.executionContext ?? getExecutionContext();
91
+ recordActiveTraceAuth("isUserContext" in executionContext ? "obo" : "service-principal");
90
92
  const clientConfig = executionContext.client.config;
91
93
  const host = (await clientConfig.getHost()).toString();
92
94
  const headers = new Headers();
@@ -110,6 +112,7 @@ export async function buildModel(config, requestContext, overrides = {}) {
110
112
  const requested = override ?? overrides.modelId ?? process.env.DATABRICKS_SERVING_ENDPOINT_NAME;
111
113
  const { modelId, source } = await selectModel(executionContext.client, host, selectionInput(config, requested, overrides.modelClass, serving));
112
114
  logger.debug("model selected", { modelId, source, requested });
115
+ recordActiveTraceModel(modelId);
113
116
  return {
114
117
  providerId: config.providerId ?? "databricks",
115
118
  modelId,
@@ -195,4 +198,4 @@ function rebuildServingResponse(response, body) {
195
198
  headers,
196
199
  });
197
200
  }
198
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUt2RSxPQUFPLEVBQUUsZUFBZSxFQUFzQyxNQUFNLGFBQWEsQ0FBQztBQUNsRixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLDBCQUEwQixFQUMxQiw0QkFBNEIsR0FDN0IsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUseUJBQXlCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHL0UsTUFBTSxFQUFFLGVBQWUsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUNwQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDO0FBRWhDLDhGQUE4RjtBQUM5RixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRztJQUN4QyxNQUFNLEVBQUU7UUFDTixLQUFLLEVBQUUsS0FBSztLQUNiO0NBQ08sQ0FBQztBQUVYLGlGQUFpRjtBQUNqRixNQUFNLFVBQVUsVUFBVSxDQUFDLE9BQWU7SUFDeEMsT0FBTyxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFxQkQsU0FBUyxjQUFjLENBQ3JCLE1BQTBCLEVBQzFCLFNBQTZCLEVBQzdCLFlBQW9DLEVBQ3BDLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLENBQUM7SUFFdEMsTUFBTSxjQUFjLEdBQUcsU0FBUyxLQUFLLFNBQVMs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KiBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgcmVzb2x2ZXIgZm9yIE1hc3RyYSBhZ2VudHMuXG4gKlxuICogRWFjaCBhZ2VudCBzdGVwIGNhbGxzIHtAbGluayBidWlsZE1vZGVsfSB3aXRoIHRoZSBhY3RpdmVcbiAqIGBSZXF1ZXN0Q29udGV4dGAuIFRoZSB1c2VyIHN0YW1wZWQgYnkgYE1hc3RyYVNlcnZlcmAgY2FycmllcyBhblxuICogQXBwS2l0IGBXb3Jrc3BhY2VDbGllbnRgOyB3ZSBhc2sgaXQgZm9yIHRoZSB3b3Jrc3BhY2UgaG9zdCBhbmQgYVxuICogZnJlc2ggYmVhcmVyIGhlYWRlciwgdGhlbiBwb2ludCBNYXN0cmEncyBPcGVuQUktY29tcGF0aWJsZSBwcm92aWRlclxuICogYXQgYC9zZXJ2aW5nLWVuZHBvaW50c2Agb24gdGhhdCBob3N0LlxuICpcbiAqIFRoaXMgbW9kdWxlIG9ubHkgYWRkcyB0aGUgTWFzdHJhLXNwZWNpZmljIGdsdWUuIFRoZSBhY3R1YWwgbW9kZWxcbiAqIHNlbGVjdGlvbiAtIGxpc3RpbmcgdGhlIHdvcmtzcGFjZSBjYXRhbG9ndWUgYW5kIHJlc29sdmluZyBhblxuICogZXhwbGljaXQgbmFtZSAvIGNsYXNzIC8gZmFsbGJhY2sgY2hhaW4gdG8gYSByZWFsIGVuZHBvaW50IGlkIC0gbGl2ZXNcbiAqIGluIGBAZGJ4LXRvb2xzL21vZGVsYCAoe0BsaW5rIHNlbGVjdE1vZGVsfSkgc28gbm9uLU1hc3RyYSBjb25zdW1lcnNcbiAqIChlLmcuIGEgam9iIHRoYXQganVzdCBuZWVkcyBhIG1vZGVsIG5hbWUpIGNhbiByZXVzZSBpdC4gSGVyZSB3ZVxuICogYXNzZW1ibGUgdGhlIGV4cGxpY2l0IGFzayBmcm9tIE1hc3RyYSdzIHJlcXVlc3QgY29udGV4dCAodGhlXG4gKiBwZXItcmVxdWVzdCBvdmVycmlkZSB1bmRlciB7QGxpbmsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWX0sIHRoZVxuICogYWdlbnQgLyBwbHVnaW4gYG1vZGVsSWRgLCBvciBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgKSxcbiAqIHBhc3MgdGhlIHBsdWdpbidzIGZ1enp5IC8gY2xhc3MgLyBmYWxsYmFjayBrbm9icyB0aHJvdWdoLCBhbmQgd3JhcFxuICogdGhlIHJlc29sdmVkIGlkIGluIHRoZSBPcGVuQUktY29tcGF0aWJsZSBwcm92aWRlciBjb25maWcgTWFzdHJhXG4gKiBleHBlY3RzLiBDYXRhbG9ndWUgZmV0Y2hlcyBmYWlsIGxvdWQ6IG5ldHdvcmsgLyBhdXRoIGVycm9yc1xuICogcHJvcGFnYXRlIHNvIGNhbGxlcnMgc2VlIHRoZSByZWFsIFNESyBtZXNzYWdlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY2xhc3NlcywgaW52b2tlLCBwb2xpY3ksIHJlc29sdmUgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgZnVuY3Rpb25VdGlscywganNvbiwgbG9nLCBuZXQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFNb2RlbENvbmZpZyB9IGZyb20gXCJAbWFzdHJhL2NvcmUvbGxtXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcblxuaW1wb3J0IHsgTUFTVFJBX1VTRVJfS0VZLCB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZywgdHlwZSBVc2VyIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQge1xuICByZXdyaXRlU2VydmluZ1JlcXVlc3QsXG4gIHJld3JpdGVTZXJ2aW5nUmVzcG9uc2VCb2R5LFxuICByZXdyaXRlU2VydmluZ1Jlc3BvbnNlU3RyZWFtLFxufSBmcm9tIFwiLi9zZXJ2aW5nLXNhbml0aXplLnRzXCI7XG5pbXBvcnQgeyBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLCByZXNvbHZlU2VydmluZ0NvbmZpZyB9IGZyb20gXCIuL3NlcnZpbmcudHNcIjtcblxudHlwZSBNb2RlbENsYXNzID0gbW9kZWwuTW9kZWxDbGFzcztcbmNvbnN0IHsgcGFyc2VNb2RlbENsYXNzIH0gPSBjbGFzc2VzO1xuY29uc3QgeyBzZWxlY3RNb2RlbCB9ID0gcmVzb2x2ZTtcblxuLyoqIEtlZXAgUmVzcG9uc2VzIHR1cm5zIHN0YXRlbGVzcyBzbyB0b29sIGNvbnRpbnVhdGlvbnMgcmVwbGF5IGVuY3J5cHRlZCByZWFzb25pbmcgaW5saW5lLiAqL1xuZXhwb3J0IGNvbnN0IFJFU1BPTlNFU19QUk9WSURFUl9PUFRJT05TID0ge1xuICBvcGVuYWk6IHtcbiAgICBzdG9yZTogZmFsc2UsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG4vKiogUGljayB0aGUgbmF0aXZlIERhdGFicmlja3MgaW5mZXJlbmNlIHN1cmZhY2UgcmVxdWlyZWQgYnkgYSByZXNvbHZlZCBtb2RlbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aW5nQXBpKG1vZGVsSWQ6IHN0cmluZyk6IFwiY2hhdFwiIHwgXCJyZXNwb25zZXNcIiB7XG4gIHJldHVybiBwb2xpY3kubW9kZWxTZXJ2aW5nQXBpKG1vZGVsSWQpO1xufVxuXG4vKiogT3B0aW9uYWwgb3ZlcnJpZGVzIGFjY2VwdGVkIGJ5IHtAbGluayBidWlsZE1vZGVsfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRNb2RlbE92ZXJyaWRlcyB7XG4gIC8qKlxuICAgKiBTdGF0aWMgbW9kZWwgaWQgZnJvbSB0aGUgYWdlbnQgLyBwbHVnaW4gY29uZmlnIChzdHJpbmcgc3VnYXIgb25cbiAgICogYGRlZi5tb2RlbGAgb3IgYGNvbmZpZy5kZWZhdWx0TW9kZWxgKS4gTG9zZXMgdG8gdGhlIHBlci1yZXF1ZXN0XG4gICAqIG92ZXJyaWRlIGJ1dCB3aW5zIG92ZXIgZW52IC8gY2xhc3MgLyBmYWxsYmFjay5cbiAgICovXG4gIG1vZGVsSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDaGF0IGNhcGFiaWxpdHkgY2xhc3MgdG8gcmVzb2x2ZSB3aGVuIG5vIGV4cGxpY2l0IG1vZGVsIGlkIGlzXG4gICAqIHN1cHBsaWVkLiBVc2VkIGJ5IGludGVybmFsIGFnZW50cyAoZS5nLiB0aGUgY2hhcnQgcGxhbm5lciBhc2tzIGZvclxuICAgKiB7QGxpbmsgbW9kZWwuTW9kZWxDbGFzcy5DaGF0RmFzdH0pIHRvIGV4cHJlc3MgaW50ZW50IHdpdGhvdXQgcGlubmluZyBhblxuICAgKiBlbmRwb2ludCBuYW1lOyB0aGUgbGl2ZSBjYXRhbG9ndWUgaXMgY2xhc3NpZmllZCBhbmQgdGhlIHRvcFxuICAgKiBhdmFpbGFibGUgbW9kZWwgaW4gdGhlIGNsYXNzIGlzIGNob3NlbiwgZmFsbGluZyBiYWNrIHRvIHRoZVxuICAgKiBjbGFzcydzIHN0YXRpYyBsaXN0IHdoZW4gdGhlIHdvcmtzcGFjZSBoYXMgbm9uZS5cbiAgICovXG4gIG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25JbnB1dChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIHJlcXVlc3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBkZWZhdWx0Q2xhc3M6IE1vZGVsQ2xhc3MgfCB1bmRlZmluZWQsXG4gIHNlcnZpbmcgPSByZXNvbHZlU2VydmluZ0NvbmZpZyhjb25maWcpLFxuKSB7XG4gIGNvbnN0IHJlcXVlc3RlZENsYXNzID0gcmVxdWVzdGVkICE9PSB1bmRlZmluZWQgPyBwYXJzZU1vZGVsQ2xhc3MocmVxdWVzdGVkKSA6IG51bGw7XG4gIGNvbnN0IGV4cGxpY2l0ID0gcmVxdWVzdGVkQ2xhc3MgPT09IG51bGwgPyByZXF1ZXN0ZWQgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSByZXF1ZXN0ZWRDbGFzcyA/PyBkZWZhdWx0Q2xhc3M7XG4gIHJldHVybiB7XG4gICAgLi4uKGV4cGxpY2l0ICE9PSB1bmRlZmluZWQgPyB7IGV4cGxpY2l0IH0gOiB7fSksXG4gICAgZnV6enk6IHNlcnZpbmcuZnV6enksXG4gICAgdGhyZXNob2xkOiBzZXJ2aW5nLnRocmVzaG9sZCxcbiAgICAuLi4obW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkID8geyBtb2RlbENsYXNzIH0gOiB7fSksXG4gICAgZmFsbGJhY2tzOiBzZXJ2aW5nLmZhbGxiYWNrcy5zbGljZSgpLFxuICAgIGxpdmVPbmx5OiByZXF1ZXN0ZWQgPT09IHVuZGVmaW5lZCxcbiAgICB0dGxNczogc2VydmluZy50dGxNcyxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGFuIGFnZW50J3MgdW5waW5uZWQgZGVmYXVsdCBhZ2FpbnN0IGFuIGFscmVhZHktbG9hZGVkIGxpdmUgY2F0YWxvZ3VlLlxuICpcbiAqIFdpdGggbm8gY29uZmlndXJlZCBpZC9jbGFzcy9mYWxsYmFjaywgdGhlIGdlbmVyaWMgbW9kZWwgcmFua2VyIHNlbGVjdHMgdGhlXG4gKiBoaWdoZXN0LXJhbmtlZCBjdXJyZW50bHkgYXZhaWxhYmxlIEdQVCwgdGhlbiBmYWxscyBiYWNrIHRvIHRoZSBoaWdoZXN0LXJhbmtlZFxuICogbGl2ZSBjaGF0IGVuZHBvaW50IHdoZW4gdGhlIHdvcmtzcGFjZSBoYXMgbm8gR1BULlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRNb2RlbElkKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIG92ZXJyaWRlczogQnVpbGRNb2RlbE92ZXJyaWRlcyA9IHt9LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcmVxdWVzdGVkID0gb3ZlcnJpZGVzLm1vZGVsSWQgPz8gcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUU7XG4gIHJldHVybiByZXNvbHZlLnJlc29sdmVNb2RlbChlbmRwb2ludHMsIHNlbGVjdGlvbklucHV0KGNvbmZpZywgcmVxdWVzdGVkLCBvdmVycmlkZXMubW9kZWxDbGFzcykpXG4gICAgLm1vZGVsSWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGBNYXN0cmFNb2RlbENvbmZpZ2AgZm9yIHRoZSBjdXJyZW50IGFnZW50IHN0ZXAuIFJ1bnNcbiAqIHdoaWxlIGBhZ2VudC5zdHJlYW1gIGlzIGluc2lkZSB0aGUgYGFzVXNlcihyZXEpYCBzY29wZSBzbyB0b2tlbnNcbiAqIGFyZSB1c2VyLXNjb3BlZDsgb3V0c2lkZSBhbiBhY3RpdmUgdXNlciBjb250ZXh0IHRoZSB3b3Jrc3BhY2VcbiAqIGNsaWVudCBmYWxscyBiYWNrIHRvIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC5cbiAqXG4gKiBFbmRwb2ludCBwcmVjZWRlbmNlOiB0aGUgcGVyLXJlcXVlc3Qgb3ZlcnJpZGVcbiAqICh7QGxpbmsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWX0sIG9ubHkgd2hlbiBgY29uZmlnLm1vZGVsT3ZlcnJpZGVgIGFsbG93c1xuICogaXQpLCB0aGVuIHtAbGluayBCdWlsZE1vZGVsT3ZlcnJpZGVzLm1vZGVsSWR9IGZyb20gdGhlIGFnZW50IC8gcGx1Z2luXG4gKiBjb25maWcsIHRoZW4gYERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FYC4gV2l0aCBub25lIG9mIHRob3NlIHNldCB0aGVcbiAqIGNhcGFiaWxpdHkgY2xhc3MgYW5kIGZhbGxiYWNrIGxhZGRlciBpbiBgQGRieC10b29scy9tb2RlbGAgY2hvb3NlIHRoZVxuICogZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZE1vZGVsKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICBvdmVycmlkZXM6IEJ1aWxkTW9kZWxPdmVycmlkZXMgPSB7fSxcbik6IFByb21pc2U8TWFzdHJhTW9kZWxDb25maWc+IHtcbiAgdm9pZCBzZXR1cEZldGNoSW50ZXJjZXB0b3IoKTtcbiAgLy8gVGhlIGNoYXQgcGF0aCBzdGFtcHMgdGhlIEFwcEtpdCB1c2VyIG9uIHRoZSByZXF1ZXN0IGNvbnRleHQgdmlhXG4gIC8vIGBNYXN0cmFTZXJ2ZXJgLiBUaGUgTUNQIHRyYW5zcG9ydCByb3V0ZXMgZG9uJ3QgdGhyZWFkIHRoYXQgY29udGV4dFxuICAvLyBpbnRvIHRvb2wgZXhlY3V0aW9uLCBzbyBmYWxsIGJhY2sgdG8gdGhlIGFtYmllbnQgZXhlY3V0aW9uIGNvbnRleHRcbiAgLy8gKHRoZSBhY3RpdmUgT0JPIHNjb3BlLCBvciB0aGUgc2VydmljZSBwcmluY2lwYWwpIHdoZW4gaXQncyBhYnNlbnQuXG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0gdXNlcj8uZXhlY3V0aW9uQ29udGV4dCA/PyBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGNvbnN0IGNsaWVudENvbmZpZyA9IGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50LmNvbmZpZztcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnRDb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgYXdhaXQgY2xpZW50Q29uZmlnLmF1dGhlbnRpY2F0ZShoZWFkZXJzKTtcbiAgLy8gVGhlIE9wZW5BSSBOb2RlIFNESyBhcHBlbmRzIHBhdGhzIGxpa2UgYC9jaGF0L2NvbXBsZXRpb25zYCB0byB3aGF0ZXZlclxuICAvLyBVUkwgd2UgaGFuZCBpdC4gRHJvcCB0aGUgdHJhaWxpbmcgc2xhc2ggc28gdGhlIHJlc3VsdGluZyBVUkwgc3RheXNcbiAgLy8gd2VsbC1mb3JtZWQgKGAvc2VydmluZy1lbmRwb2ludHMvY2hhdC9jb21wbGV0aW9uc2ApLlxuICBjb25zdCB1cmwgPSBuZXcgVVJMKFwiL3NlcnZpbmctZW5kcG9pbnRzXCIsIGhvc3QpLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xuXG4gIGNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoY29uZmlnKTtcbiAgY29uc3Qgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKGNvbmZpZyk7XG4gIGNvbnN0IG92ZXJyaWRlID0gc2VydmluZy5hbGxvd092ZXJyaWRlXG4gICAgPyAocmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVkpIGFzIHN0cmluZyB8IHVuZGVmaW5lZClcbiAgICA6IHVuZGVmaW5lZDtcblxuICAvLyBUaGUgb3ZlcnJpZGUgLyBhZ2VudCBkZWZhdWx0IC8gZW52IHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBjb25jcmV0ZVxuICAvLyBlbmRwb2ludCBuYW1lIG9yIGEgbW9kZWwgY2xhc3Mgc2x1ZyAoXCJjaGF0LXRoaW5raW5nXCIgL1xuICAvLyBcImNoYXQtYmFsYW5jZWRcIiAvIFwiY2hhdC1mYXN0XCIpLiBBIGNsYXNzIHNsdWcgYmVjb21lcyBhIGNsYXNzIGludGVudFxuICAvLyAobGV0IHRoZSBsaXZlIGNhdGFsb2d1ZSBwaWNrIHRoZSBiZXN0IG1vZGVsIGluIHRoYXQgYmFuZCk7IGFueXRoaW5nXG4gIC8vIGVsc2UgaXMgYW4gZXhwbGljaXQgbmFtZSBmdXp6eS1tYXRjaGVkIGFnYWluc3QgdGhlIGNhdGFsb2d1ZS4gQW5cbiAgLy8gaW50ZXJuYWwgYG92ZXJyaWRlcy5tb2RlbENsYXNzYCAoZS5nLiB0aGUgY2hhcnQgcGxhbm5lcikgaXMgdGhlXG4gIC8vIGZsb29yIHdoZW4gbm90aGluZyB3YXMgcmVxdWVzdGVkLlxuICBjb25zdCByZXF1ZXN0ZWQgPSBvdmVycmlkZSA/PyBvdmVycmlkZXMubW9kZWxJZCA/PyBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRTtcblxuICBjb25zdCB7IG1vZGVsSWQsIHNvdXJjZSB9ID0gYXdhaXQgc2VsZWN0TW9kZWwoXG4gICAgZXhlY3V0aW9uQ29udGV4dC5jbGllbnQsXG4gICAgaG9zdCxcbiAgICBzZWxlY3Rpb25JbnB1dChjb25maWcsIHJlcXVlc3RlZCwgb3ZlcnJpZGVzLm1vZGVsQ2xhc3MsIHNlcnZpbmcpLFxuICApO1xuICBsb2dnZXIuZGVidWcoXCJtb2RlbCBzZWxlY3RlZFwiLCB7IG1vZGVsSWQsIHNvdXJjZSwgcmVxdWVzdGVkIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcHJvdmlkZXJJZDogY29uZmlnLnByb3ZpZGVySWQgPz8gXCJkYXRhYnJpY2tzXCIsXG4gICAgbW9kZWxJZCxcbiAgICB1cmwsXG4gICAgaGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKGhlYWRlcnMuZW50cmllcygpKSxcbiAgICBhcGk6IHNlcnZpbmdBcGkobW9kZWxJZCksXG4gIH07XG59XG5cbi8qKiBDaGF0IENvbXBsZXRpb25zIHJvdXRlIHdob3NlIHByb3ZpZGVyLXNwZWNpZmljIHdpcmUgc2hhcGVzIGFyZSBub3JtYWxpemVkIGhlcmUuICovXG5jb25zdCBDSEFUX0NPTVBMRVRJT05TX1BBVEggPSBgLyR7aW52b2tlLkNIQVRfQ09NUExFVElPTlNfUEFUSH1gO1xuXG4vKipcbiAqIEluc3RhbGwgYSBzaW5nbGUgc2hhcmVkIGBnbG9iYWxUaGlzLmZldGNoYCB3cmFwcGVyIGZvciBDaGF0IENvbXBsZXRpb25zXG4gKiByZXF1ZXN0cy4gVGhlIHdyYXBwZXIgZG9lcyB0aHJlZSB0aGluZ3M6XG4gKlxuICogICAxLiBSZXdyaXRlcyBvdXRnb2luZyBKU09OIGZyb20gZWl0aGVyIGBpbml0LmJvZHlgIG9yIGEgYFJlcXVlc3RgIHRvIHJlcGFpclxuICogICAgICBwcm92aWRlci1zcGVjaWZpYyByZXF1ZXN0IGNvbnN0cmFpbnRzIChzZWUge0BsaW5rIHJld3JpdGVTZXJ2aW5nUmVxdWVzdH1cbiAqICAgICAgaW4gYC4vc2VydmluZy1zYW5pdGl6ZS5qc2ApLlxuICogICAyLiBBdCBgTE9HX0xFVkVMPWRlYnVnYCwgZHVtcHMgdGhlIChwb3N0LXNhbml0aXplKSBKU09OIGJvZHkgc29cbiAqICAgICAgNHh4IGRlYnVnZ2luZyBkb2Vzbid0IGhhdmUgdG8gZmlnaHQgQUkgU0RLJ3MgYFtBcnJheV1gXG4gKiAgICAgIGZvcm1hdHRlci5cbiAqICAgMy4gUmVwYWlycyBidWZmZXJlZCBhbmQgc3RyZWFtaW5nIHJlc3BvbnNlcyB3aGVyZSBhIHByb3ZpZGVyIHJldHVybnNcbiAqICAgICAgYGNob2ljZXNbXS5tZXNzYWdlLmNvbnRlbnRgIG9yIGBjaG9pY2VzW10uZGVsdGEuY29udGVudGAgYXMgYSBwYXJ0c1xuICogICAgICBhcnJheSB0aGF0IHRoZSBBSSBTREsncyBPcGVuQUkgc2NoZW1hIHJlamVjdHMuXG4gKlxuICogU2FmZSB0byBjYWxsIGZyb20gYW55IGhvdCBwYXRoOiB7QGxpbmsgZnVuY3Rpb25VdGlscy5tZW1vaXplfSBlbnN1cmVzXG4gKiB0aGUgd3JhcHBlciBpcyBpbnN0YWxsZWQgYXQgbW9zdCBvbmNlIHBlciBwcm9jZXNzLCBzbyBzdWJzZXF1ZW50XG4gKiBjYWxscyBhcmUgYSBuby1vcCBldmVuIHdoZW4ge0BsaW5rIGJ1aWxkTW9kZWx9IGZpcmVzIG9uIGV2ZXJ5IGFnZW50XG4gKiBzdGVwLlxuICovXG5jb25zdCBzZXR1cEZldGNoSW50ZXJjZXB0b3IgPSBmdW5jdGlvblV0aWxzLm1lbW9pemUoKCk6IHZvaWQgPT4ge1xuICBnbG9iYWxUaGlzLmZldGNoID0gY3JlYXRlU2VydmluZ0ZldGNoSW50ZXJjZXB0b3IoZ2xvYmFsVGhpcy5mZXRjaC5iaW5kKGdsb2JhbFRoaXMpKTtcbn0pO1xuXG4vKiogQnVpbGQgdGhlIHNlcnZpbmcgZmV0Y2ggd3JhcHBlcjsgZXhwb3J0ZWQgZm9yIHRyYW5zcG9ydC1sZXZlbCByZWdyZXNzaW9uIHRlc3RzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlcnZpbmdGZXRjaEludGVyY2VwdG9yKG9yaWdpbmFsOiB0eXBlb2YgZmV0Y2gpOiB0eXBlb2YgZmV0Y2gge1xuICBjb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL2xsbVwiKTtcbiAgcmV0dXJuIChhc3luYyAoaW5wdXQsIGluaXQpID0+IHtcbiAgICBjb25zdCB1cmwgPSBuZXQudXJsQnVpbGRlcihpbnB1dCk7XG4gICAgY29uc3QgbWV0aG9kID0gaW5pdD8ubWV0aG9kID8/IChpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QgPyBpbnB1dC5tZXRob2QgOiBcIkdFVFwiKTtcbiAgICBpZiAoIXVybCB8fCB1cmwucGF0aG5hbWUgIT09IENIQVRfQ09NUExFVElPTlNfUEFUSCB8fCBtZXRob2QudG9VcHBlckNhc2UoKSAhPT0gXCJQT1NUXCIpIHtcbiAgICAgIHJldHVybiBvcmlnaW5hbChpbnB1dCwgaW5pdCk7XG4gICAgfVxuICAgIGNvbnN0IHJld3JpdHRlbiA9IGF3YWl0IHJld3JpdGVTZXJ2aW5nUmVxdWVzdChpbnB1dCwgaW5pdCk7XG4gICAgY29uc3QgcGFyc2VkID0ganNvbi5wYXJzZTx1bmtub3duPihyZXdyaXR0ZW4uYm9keSk7XG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgXCJQT1NUXCIsXG4gICAgICBwYXJzZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgdXJsOiB1cmwudG9TdHJpbmcoKSwgYm9keVR5cGU6IFwibm9uLUpTT05cIiB9XG4gICAgICAgIDogeyB1cmw6IHVybC50b1N0cmluZygpLCBib2R5OiBwYXJzZWQgfSxcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb3JpZ2luYWwocmV3cml0dGVuLmlucHV0LCByZXdyaXR0ZW4uaW5pdCk7XG4gICAgcmV0dXJuIHJlcGFpclNlcnZpbmdSZXNwb25zZShyZXNwb25zZSk7XG4gIH0pIGFzIHR5cGVvZiBnbG9iYWxUaGlzLmZldGNoO1xufVxuXG4vKipcbiAqIFJld3JpdGUgYSBzZXJ2aW5nIHJlc3BvbnNlIHdob3NlIGJvZHkgbmVlZHMgcmVwYWlyLCBsZWF2aW5nIHVuc3VwcG9ydGVkXG4gKiBjb250ZW50IHR5cGVzIGJ5dGUtaWRlbnRpY2FsLlxuICpcbiAqIFNTRSByZW1haW5zIGEgbGl2ZSBzdHJlYW06IGEgVHJhbnNmb3JtU3RyZWFtIHJlcGFpcnMgY29tcGxldGUgYGRhdGE6YCBsaW5lc1xuICogYXMgYnl0ZXMgYXJyaXZlIGFuZCBwcmVzZXJ2ZXMgcGFydGlhbCBsaW5lcyBhY3Jvc3MgbmV0d29yayBjaHVua3MuIEpTT04gaXNcbiAqIGJ1ZmZlcmVkIHRocm91Z2ggdGhlIGV4aXN0aW5nIHJlc3BvbnNlLWJvZHkgcmVwYWlyLiBBIG5vbi1KU09OL25vbi1TU0UgYm9keVxuICogaXMgcmV0dXJuZWQgdW50b3VjaGVkIHNvIHRoZSBjYWxsZXIgc3RpbGwgc2VlcyB0aGUgb3JpZ2luYWwgcmVzcG9uc2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcGFpclNlcnZpbmdSZXNwb25zZShyZXNwb25zZTogUmVzcG9uc2UpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIikgPz8gXCJcIjtcbiAgaWYgKGNvbnRlbnRUeXBlLmluY2x1ZGVzKFwidGV4dC9ldmVudC1zdHJlYW1cIikgJiYgcmVzcG9uc2UuYm9keSkge1xuICAgIHJldHVybiByZWJ1aWxkU2VydmluZ1Jlc3BvbnNlKHJlc3BvbnNlLCByZXdyaXRlU2VydmluZ1Jlc3BvbnNlU3RyZWFtKHJlc3BvbnNlLmJvZHkpKTtcbiAgfVxuICBpZiAoIWNvbnRlbnRUeXBlLmluY2x1ZGVzKFwiYXBwbGljYXRpb24vanNvblwiKSkgcmV0dXJuIHJlc3BvbnNlO1xuXG4gIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwb25zZS5jbG9uZSgpLnRleHQoKTtcbiAgY29uc3QgcmV3cml0dGVuID0gcmV3cml0ZVNlcnZpbmdSZXNwb25zZUJvZHkoYm9keSk7XG4gIGlmIChyZXdyaXR0ZW4gPT09IGJvZHkpIHJldHVybiByZXNwb25zZTtcbiAgcmV0dXJuIHJlYnVpbGRTZXJ2aW5nUmVzcG9uc2UocmVzcG9uc2UsIHJld3JpdHRlbik7XG59XG5cbi8qKiBSZWJ1aWxkIGEgdHJhbnNmb3JtZWQgcmVzcG9uc2Ugd2l0aG91dCBzdGFsZSBieXRlLWxlbmd0aC9lbmNvZGluZyBoZWFkZXJzLiAqL1xuZnVuY3Rpb24gcmVidWlsZFNlcnZpbmdSZXNwb25zZShcbiAgcmVzcG9uc2U6IFJlc3BvbnNlLFxuICBib2R5OiBzdHJpbmcgfCBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pixcbik6IFJlc3BvbnNlIHtcbiAgLy8gYGNvbnRlbnQtbGVuZ3RoYCAvIGBjb250ZW50LWVuY29kaW5nYCBkZXNjcmliZSB0aGUgT1JJR0lOQUwgYnl0ZXMsIHNvIHRoZXlcbiAgLy8gYXJlIGRyb3BwZWQ6IHRoZSByZXdyaXR0ZW4gYm9keSBpcyBhIGRpZmZlcmVudCBsZW5ndGggYW5kIGFscmVhZHkgZGVjb2RlZC5cbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMpO1xuICBoZWFkZXJzLmRlbGV0ZShcImNvbnRlbnQtbGVuZ3RoXCIpO1xuICBoZWFkZXJzLmRlbGV0ZShcImNvbnRlbnQtZW5jb2RpbmdcIik7XG4gIHJldHVybiBuZXcgUmVzcG9uc2UoYm9keSwge1xuICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgaGVhZGVycyxcbiAgfSk7XG59XG4iXX0=
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUt2RSxPQUFPLEVBQUUsZUFBZSxFQUFzQyxNQUFNLGFBQWEsQ0FBQztBQUNsRixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLDBCQUEwQixFQUMxQiw0QkFBNEIsR0FDN0IsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUseUJBQXlCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHL0UsTUFBTSxFQUFFLGVBQWUsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUNwQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDO0FBRWhDLDhGQUE4RjtBQUM5RixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRztJQUN4QyxNQUFNLEVBQUU7UUFDTixLQUFLLEVBQUUsS0FBSztLQUNiO0NBQ08sQ0FBQztBQUVYLGlGQUFpRjtBQUNqRixNQUFNLFVBQVUsVUFBVSxDQUFDLE9BQWU7SUFDeEMsT0FBTyxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFxQkQsU0FBUyxjQUFjLENBQ3JCLE1BQTBCLEVBQzFCLFNBQTZCLEVBQzdCLFlBQW9DLEVBQ3BDLE9BQU8sR0FBRyxv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a0JBQWtCLENBQUMsQ0FBQztJQUNuQyxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksRUFBRTtRQUN4QixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07UUFDdkIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1FBQy9CLE9BQU87S0FDUixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgcmVzb2x2ZXIgZm9yIE1hc3RyYSBhZ2VudHMuXG4gKlxuICogRWFjaCBhZ2VudCBzdGVwIGNhbGxzIHtAbGluayBidWlsZE1vZGVsfSB3aXRoIHRoZSBhY3RpdmVcbiAqIGBSZXF1ZXN0Q29udGV4dGAuIFRoZSB1c2VyIHN0YW1wZWQgYnkgYE1hc3RyYVNlcnZlcmAgY2FycmllcyBhblxuICogQXBwS2l0IGBXb3Jrc3BhY2VDbGllbnRgOyB3ZSBhc2sgaXQgZm9yIHRoZSB3b3Jrc3BhY2UgaG9zdCBhbmQgYVxuICogZnJlc2ggYmVhcmVyIGhlYWRlciwgdGhlbiBwb2ludCBNYXN0cmEncyBPcGVuQUktY29tcGF0aWJsZSBwcm92aWRlclxuICogYXQgYC9zZXJ2aW5nLWVuZHBvaW50c2Agb24gdGhhdCBob3N0LlxuICpcbiAqIFRoaXMgbW9kdWxlIG9ubHkgYWRkcyB0aGUgTWFzdHJhLXNwZWNpZmljIGdsdWUuIFRoZSBhY3R1YWwgbW9kZWxcbiAqIHNlbGVjdGlvbiAtIGxpc3RpbmcgdGhlIHdvcmtzcGFjZSBjYXRhbG9ndWUgYW5kIHJlc29sdmluZyBhblxuICogZXhwbGljaXQgbmFtZSAvIGNsYXNzIC8gZmFsbGJhY2sgY2hhaW4gdG8gYSByZWFsIGVuZHBvaW50IGlkIC0gbGl2ZXNcbiAqIGluIGBAZGJ4LXRvb2xzL21vZGVsYCAoe0BsaW5rIHNlbGVjdE1vZGVsfSkgc28gbm9uLU1hc3RyYSBjb25zdW1lcnNcbiAqIChlLmcuIGEgam9iIHRoYXQganVzdCBuZWVkcyBhIG1vZGVsIG5hbWUpIGNhbiByZXVzZSBpdC4gSGVyZSB3ZVxuICogYXNzZW1ibGUgdGhlIGV4cGxpY2l0IGFzayBmcm9tIE1hc3RyYSdzIHJlcXVlc3QgY29udGV4dCAodGhlXG4gKiBwZXItcmVxdWVzdCBvdmVycmlkZSB1bmRlciB7QGxpbmsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWX0sIHRoZVxuICogYWdlbnQgLyBwbHVnaW4gYG1vZGVsSWRgLCBvciBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgKSxcbiAqIHBhc3MgdGhlIHBsdWdpbidzIGZ1enp5IC8gY2xhc3MgLyBmYWxsYmFjayBrbm9icyB0aHJvdWdoLCBhbmQgd3JhcFxuICogdGhlIHJlc29sdmVkIGlkIGluIHRoZSBPcGVuQUktY29tcGF0aWJsZSBwcm92aWRlciBjb25maWcgTWFzdHJhXG4gKiBleHBlY3RzLiBDYXRhbG9ndWUgZmV0Y2hlcyBmYWlsIGxvdWQ6IG5ldHdvcmsgLyBhdXRoIGVycm9yc1xuICogcHJvcGFnYXRlIHNvIGNhbGxlcnMgc2VlIHRoZSByZWFsIFNESyBtZXNzYWdlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY2xhc3NlcywgaW52b2tlLCBwb2xpY3ksIHJlc29sdmUgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgZnVuY3Rpb25VdGlscywganNvbiwgbG9nLCBuZXQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFNb2RlbENvbmZpZyB9IGZyb20gXCJAbWFzdHJhL2NvcmUvbGxtXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcblxuaW1wb3J0IHsgTUFTVFJBX1VTRVJfS0VZLCB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZywgdHlwZSBVc2VyIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQge1xuICByZXdyaXRlU2VydmluZ1JlcXVlc3QsXG4gIHJld3JpdGVTZXJ2aW5nUmVzcG9uc2VCb2R5LFxuICByZXdyaXRlU2VydmluZ1Jlc3BvbnNlU3RyZWFtLFxufSBmcm9tIFwiLi9zZXJ2aW5nLXNhbml0aXplLnRzXCI7XG5pbXBvcnQgeyBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLCByZXNvbHZlU2VydmluZ0NvbmZpZyB9IGZyb20gXCIuL3NlcnZpbmcudHNcIjtcbmltcG9ydCB7IHJlY29yZEFjdGl2ZVRyYWNlQXV0aCwgcmVjb3JkQWN0aXZlVHJhY2VNb2RlbCB9IGZyb20gXCIuL3RlbGVtZXRyeS50c1wiO1xuXG50eXBlIE1vZGVsQ2xhc3MgPSBtb2RlbC5Nb2RlbENsYXNzO1xuY29uc3QgeyBwYXJzZU1vZGVsQ2xhc3MgfSA9IGNsYXNzZXM7XG5jb25zdCB7IHNlbGVjdE1vZGVsIH0gPSByZXNvbHZlO1xuXG4vKiogS2VlcCBSZXNwb25zZXMgdHVybnMgc3RhdGVsZXNzIHNvIHRvb2wgY29udGludWF0aW9ucyByZXBsYXkgZW5jcnlwdGVkIHJlYXNvbmluZyBpbmxpbmUuICovXG5leHBvcnQgY29uc3QgUkVTUE9OU0VTX1BST1ZJREVSX09QVElPTlMgPSB7XG4gIG9wZW5haToge1xuICAgIHN0b3JlOiBmYWxzZSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbi8qKiBQaWNrIHRoZSBuYXRpdmUgRGF0YWJyaWNrcyBpbmZlcmVuY2Ugc3VyZmFjZSByZXF1aXJlZCBieSBhIHJlc29sdmVkIG1vZGVsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpbmdBcGkobW9kZWxJZDogc3RyaW5nKTogXCJjaGF0XCIgfCBcInJlc3BvbnNlc1wiIHtcbiAgcmV0dXJuIHBvbGljeS5tb2RlbFNlcnZpbmdBcGkobW9kZWxJZCk7XG59XG5cbi8qKiBPcHRpb25hbCBvdmVycmlkZXMgYWNjZXB0ZWQgYnkge0BsaW5rIGJ1aWxkTW9kZWx9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE1vZGVsT3ZlcnJpZGVzIHtcbiAgLyoqXG4gICAqIFN0YXRpYyBtb2RlbCBpZCBmcm9tIHRoZSBhZ2VudCAvIHBsdWdpbiBjb25maWcgKHN0cmluZyBzdWdhciBvblxuICAgKiBgZGVmLm1vZGVsYCBvciBgY29uZmlnLmRlZmF1bHRNb2RlbGApLiBMb3NlcyB0byB0aGUgcGVyLXJlcXVlc3RcbiAgICogb3ZlcnJpZGUgYnV0IHdpbnMgb3ZlciBlbnYgLyBjbGFzcyAvIGZhbGxiYWNrLlxuICAgKi9cbiAgbW9kZWxJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIENoYXQgY2FwYWJpbGl0eSBjbGFzcyB0byByZXNvbHZlIHdoZW4gbm8gZXhwbGljaXQgbW9kZWwgaWQgaXNcbiAgICogc3VwcGxpZWQuIFVzZWQgYnkgaW50ZXJuYWwgYWdlbnRzIChlLmcuIHRoZSBjaGFydCBwbGFubmVyIGFza3MgZm9yXG4gICAqIHtAbGluayBtb2RlbC5Nb2RlbENsYXNzLkNoYXRGYXN0fSkgdG8gZXhwcmVzcyBpbnRlbnQgd2l0aG91dCBwaW5uaW5nIGFuXG4gICAqIGVuZHBvaW50IG5hbWU7IHRoZSBsaXZlIGNhdGFsb2d1ZSBpcyBjbGFzc2lmaWVkIGFuZCB0aGUgdG9wXG4gICAqIGF2YWlsYWJsZSBtb2RlbCBpbiB0aGUgY2xhc3MgaXMgY2hvc2VuLCBmYWxsaW5nIGJhY2sgdG8gdGhlXG4gICAqIGNsYXNzJ3Mgc3RhdGljIGxpc3Qgd2hlbiB0aGUgd29ya3NwYWNlIGhhcyBub25lLlxuICAgKi9cbiAgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3M7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbklucHV0KFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgcmVxdWVzdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGRlZmF1bHRDbGFzczogTW9kZWxDbGFzcyB8IHVuZGVmaW5lZCxcbiAgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKGNvbmZpZyksXG4pIHtcbiAgY29uc3QgcmVxdWVzdGVkQ2xhc3MgPSByZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCA/IHBhcnNlTW9kZWxDbGFzcyhyZXF1ZXN0ZWQpIDogbnVsbDtcbiAgY29uc3QgZXhwbGljaXQgPSByZXF1ZXN0ZWRDbGFzcyA9PT0gbnVsbCA/IHJlcXVlc3RlZCA6IHVuZGVmaW5lZDtcbiAgY29uc3QgbW9kZWxDbGFzcyA9IHJlcXVlc3RlZENsYXNzID8/IGRlZmF1bHRDbGFzcztcbiAgcmV0dXJuIHtcbiAgICAuLi4oZXhwbGljaXQgIT09IHVuZGVmaW5lZCA/IHsgZXhwbGljaXQgfSA6IHt9KSxcbiAgICBmdXp6eTogc2VydmluZy5mdXp6eSxcbiAgICB0aHJlc2hvbGQ6IHNlcnZpbmcudGhyZXNob2xkLFxuICAgIC4uLihtb2RlbENsYXNzICE9PSB1bmRlZmluZWQgPyB7IG1vZGVsQ2xhc3MgfSA6IHt9KSxcbiAgICBmYWxsYmFja3M6IHNlcnZpbmcuZmFsbGJhY2tzLnNsaWNlKCksXG4gICAgbGl2ZU9ubHk6IHJlcXVlc3RlZCA9PT0gdW5kZWZpbmVkLFxuICAgIHR0bE1zOiBzZXJ2aW5nLnR0bE1zLFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYW4gYWdlbnQncyB1bnBpbm5lZCBkZWZhdWx0IGFnYWluc3QgYW4gYWxyZWFkeS1sb2FkZWQgbGl2ZSBjYXRhbG9ndWUuXG4gKlxuICogV2l0aCBubyBjb25maWd1cmVkIGlkL2NsYXNzL2ZhbGxiYWNrLCB0aGUgZ2VuZXJpYyBtb2RlbCByYW5rZXIgc2VsZWN0cyB0aGVcbiAqIGhpZ2hlc3QtcmFua2VkIGN1cnJlbnRseSBhdmFpbGFibGUgR1BULCB0aGVuIGZhbGxzIGJhY2sgdG8gdGhlIGhpZ2hlc3QtcmFua2VkXG4gKiBsaXZlIGNoYXQgZW5kcG9pbnQgd2hlbiB0aGUgd29ya3NwYWNlIGhhcyBubyBHUFQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGVmYXVsdE1vZGVsSWQoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgb3ZlcnJpZGVzOiBCdWlsZE1vZGVsT3ZlcnJpZGVzID0ge30sXG4pOiBzdHJpbmcge1xuICBjb25zdCByZXF1ZXN0ZWQgPSBvdmVycmlkZXMubW9kZWxJZCA/PyBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRTtcbiAgcmV0dXJuIHJlc29sdmUucmVzb2x2ZU1vZGVsKGVuZHBvaW50cywgc2VsZWN0aW9uSW5wdXQoY29uZmlnLCByZXF1ZXN0ZWQsIG92ZXJyaWRlcy5tb2RlbENsYXNzKSlcbiAgICAubW9kZWxJZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgYE1hc3RyYU1vZGVsQ29uZmlnYCBmb3IgdGhlIGN1cnJlbnQgYWdlbnQgc3RlcC4gUnVuc1xuICogd2hpbGUgYGFnZW50LnN0cmVhbWAgaXMgaW5zaWRlIHRoZSBgYXNVc2VyKHJlcSlgIHNjb3BlIHNvIHRva2Vuc1xuICogYXJlIHVzZXItc2NvcGVkOyBvdXRzaWRlIGFuIGFjdGl2ZSB1c2VyIGNvbnRleHQgdGhlIHdvcmtzcGFjZVxuICogY2xpZW50IGZhbGxzIGJhY2sgdG8gdGhlIHNlcnZpY2UgcHJpbmNpcGFsLlxuICpcbiAqIEVuZHBvaW50IHByZWNlZGVuY2U6IHRoZSBwZXItcmVxdWVzdCBvdmVycmlkZVxuICogKHtAbGluayBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZfSwgb25seSB3aGVuIGBjb25maWcubW9kZWxPdmVycmlkZWAgYWxsb3dzXG4gKiBpdCksIHRoZW4ge0BsaW5rIEJ1aWxkTW9kZWxPdmVycmlkZXMubW9kZWxJZH0gZnJvbSB0aGUgYWdlbnQgLyBwbHVnaW5cbiAqIGNvbmZpZywgdGhlbiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgLiBXaXRoIG5vbmUgb2YgdGhvc2Ugc2V0IHRoZVxuICogY2FwYWJpbGl0eSBjbGFzcyBhbmQgZmFsbGJhY2sgbGFkZGVyIGluIGBAZGJ4LXRvb2xzL21vZGVsYCBjaG9vc2UgdGhlXG4gKiBlbmRwb2ludC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkTW9kZWwoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQsXG4gIG92ZXJyaWRlczogQnVpbGRNb2RlbE92ZXJyaWRlcyA9IHt9LFxuKTogUHJvbWlzZTxNYXN0cmFNb2RlbENvbmZpZz4ge1xuICB2b2lkIHNldHVwRmV0Y2hJbnRlcmNlcHRvcigpO1xuICAvLyBUaGUgY2hhdCBwYXRoIHN0YW1wcyB0aGUgQXBwS2l0IHVzZXIgb24gdGhlIHJlcXVlc3QgY29udGV4dCB2aWFcbiAgLy8gYE1hc3RyYVNlcnZlcmAuIFRoZSBNQ1AgdHJhbnNwb3J0IHJvdXRlcyBkb24ndCB0aHJlYWQgdGhhdCBjb250ZXh0XG4gIC8vIGludG8gdG9vbCBleGVjdXRpb24sIHNvIGZhbGwgYmFjayB0byB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dFxuICAvLyAodGhlIGFjdGl2ZSBPQk8gc2NvcGUsIG9yIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCkgd2hlbiBpdCdzIGFic2VudC5cbiAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgPSB1c2VyPy5leGVjdXRpb25Db250ZXh0ID8/IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgcmVjb3JkQWN0aXZlVHJhY2VBdXRoKFwiaXNVc2VyQ29udGV4dFwiIGluIGV4ZWN1dGlvbkNvbnRleHQgPyBcIm9ib1wiIDogXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTtcbiAgY29uc3QgY2xpZW50Q29uZmlnID0gZXhlY3V0aW9uQ29udGV4dC5jbGllbnQuY29uZmlnO1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudENvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICBhd2FpdCBjbGllbnRDb25maWcuYXV0aGVudGljYXRlKGhlYWRlcnMpO1xuICAvLyBUaGUgT3BlbkFJIE5vZGUgU0RLIGFwcGVuZHMgcGF0aHMgbGlrZSBgL2NoYXQvY29tcGxldGlvbnNgIHRvIHdoYXRldmVyXG4gIC8vIFVSTCB3ZSBoYW5kIGl0LiBEcm9wIHRoZSB0cmFpbGluZyBzbGFzaCBzbyB0aGUgcmVzdWx0aW5nIFVSTCBzdGF5c1xuICAvLyB3ZWxsLWZvcm1lZCAoYC9zZXJ2aW5nLWVuZHBvaW50cy9jaGF0L2NvbXBsZXRpb25zYCkuXG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoXCIvc2VydmluZy1lbmRwb2ludHNcIiwgaG9zdCkudG9TdHJpbmcoKS5yZXBsYWNlKC9cXC8kLywgXCJcIik7XG5cbiAgY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihjb25maWcpO1xuICBjb25zdCBzZXJ2aW5nID0gcmVzb2x2ZVNlcnZpbmdDb25maWcoY29uZmlnKTtcbiAgY29uc3Qgb3ZlcnJpZGUgPSBzZXJ2aW5nLmFsbG93T3ZlcnJpZGVcbiAgICA/IChyZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSBvdmVycmlkZSAvIGFnZW50IGRlZmF1bHQgLyBlbnYgdmFsdWUgY2FuIGJlIGVpdGhlciBhIGNvbmNyZXRlXG4gIC8vIGVuZHBvaW50IG5hbWUgb3IgYSBtb2RlbCBjbGFzcyBzbHVnIChcImNoYXQtdGhpbmtpbmdcIiAvXG4gIC8vIFwiY2hhdC1iYWxhbmNlZFwiIC8gXCJjaGF0LWZhc3RcIikuIEEgY2xhc3Mgc2x1ZyBiZWNvbWVzIGEgY2xhc3MgaW50ZW50XG4gIC8vIChsZXQgdGhlIGxpdmUgY2F0YWxvZ3VlIHBpY2sgdGhlIGJlc3QgbW9kZWwgaW4gdGhhdCBiYW5kKTsgYW55dGhpbmdcbiAgLy8gZWxzZSBpcyBhbiBleHBsaWNpdCBuYW1lIGZ1enp5LW1hdGNoZWQgYWdhaW5zdCB0aGUgY2F0YWxvZ3VlLiBBblxuICAvLyBpbnRlcm5hbCBgb3ZlcnJpZGVzLm1vZGVsQ2xhc3NgIChlLmcuIHRoZSBjaGFydCBwbGFubmVyKSBpcyB0aGVcbiAgLy8gZmxvb3Igd2hlbiBub3RoaW5nIHdhcyByZXF1ZXN0ZWQuXG4gIGNvbnN0IHJlcXVlc3RlZCA9IG92ZXJyaWRlID8/IG92ZXJyaWRlcy5tb2RlbElkID8/IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FO1xuXG4gIGNvbnN0IHsgbW9kZWxJZCwgc291cmNlIH0gPSBhd2FpdCBzZWxlY3RNb2RlbChcbiAgICBleGVjdXRpb25Db250ZXh0LmNsaWVudCxcbiAgICBob3N0LFxuICAgIHNlbGVjdGlvbklucHV0KGNvbmZpZywgcmVxdWVzdGVkLCBvdmVycmlkZXMubW9kZWxDbGFzcywgc2VydmluZyksXG4gICk7XG4gIGxvZ2dlci5kZWJ1ZyhcIm1vZGVsIHNlbGVjdGVkXCIsIHsgbW9kZWxJZCwgc291cmNlLCByZXF1ZXN0ZWQgfSk7XG4gIHJlY29yZEFjdGl2ZVRyYWNlTW9kZWwobW9kZWxJZCk7XG5cbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlcklkOiBjb25maWcucHJvdmlkZXJJZCA/PyBcImRhdGFicmlja3NcIixcbiAgICBtb2RlbElkLFxuICAgIHVybCxcbiAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycy5lbnRyaWVzKCkpLFxuICAgIGFwaTogc2VydmluZ0FwaShtb2RlbElkKSxcbiAgfTtcbn1cblxuLyoqIENoYXQgQ29tcGxldGlvbnMgcm91dGUgd2hvc2UgcHJvdmlkZXItc3BlY2lmaWMgd2lyZSBzaGFwZXMgYXJlIG5vcm1hbGl6ZWQgaGVyZS4gKi9cbmNvbnN0IENIQVRfQ09NUExFVElPTlNfUEFUSCA9IGAvJHtpbnZva2UuQ0hBVF9DT01QTEVUSU9OU19QQVRIfWA7XG5cbi8qKlxuICogSW5zdGFsbCBhIHNpbmdsZSBzaGFyZWQgYGdsb2JhbFRoaXMuZmV0Y2hgIHdyYXBwZXIgZm9yIENoYXQgQ29tcGxldGlvbnNcbiAqIHJlcXVlc3RzLiBUaGUgd3JhcHBlciBkb2VzIHRocmVlIHRoaW5nczpcbiAqXG4gKiAgIDEuIFJld3JpdGVzIG91dGdvaW5nIEpTT04gZnJvbSBlaXRoZXIgYGluaXQuYm9keWAgb3IgYSBgUmVxdWVzdGAgdG8gcmVwYWlyXG4gKiAgICAgIHByb3ZpZGVyLXNwZWNpZmljIHJlcXVlc3QgY29uc3RyYWludHMgKHNlZSB7QGxpbmsgcmV3cml0ZVNlcnZpbmdSZXF1ZXN0fVxuICogICAgICBpbiBgLi9zZXJ2aW5nLXNhbml0aXplLmpzYCkuXG4gKiAgIDIuIEF0IGBMT0dfTEVWRUw9ZGVidWdgLCBkdW1wcyB0aGUgKHBvc3Qtc2FuaXRpemUpIEpTT04gYm9keSBzb1xuICogICAgICA0eHggZGVidWdnaW5nIGRvZXNuJ3QgaGF2ZSB0byBmaWdodCBBSSBTREsncyBgW0FycmF5XWBcbiAqICAgICAgZm9ybWF0dGVyLlxuICogICAzLiBSZXBhaXJzIGJ1ZmZlcmVkIGFuZCBzdHJlYW1pbmcgcmVzcG9uc2VzIHdoZXJlIGEgcHJvdmlkZXIgcmV0dXJuc1xuICogICAgICBgY2hvaWNlc1tdLm1lc3NhZ2UuY29udGVudGAgb3IgYGNob2ljZXNbXS5kZWx0YS5jb250ZW50YCBhcyBhIHBhcnRzXG4gKiAgICAgIGFycmF5IHRoYXQgdGhlIEFJIFNESydzIE9wZW5BSSBzY2hlbWEgcmVqZWN0cy5cbiAqXG4gKiBTYWZlIHRvIGNhbGwgZnJvbSBhbnkgaG90IHBhdGg6IHtAbGluayBmdW5jdGlvblV0aWxzLm1lbW9pemV9IGVuc3VyZXNcbiAqIHRoZSB3cmFwcGVyIGlzIGluc3RhbGxlZCBhdCBtb3N0IG9uY2UgcGVyIHByb2Nlc3MsIHNvIHN1YnNlcXVlbnRcbiAqIGNhbGxzIGFyZSBhIG5vLW9wIGV2ZW4gd2hlbiB7QGxpbmsgYnVpbGRNb2RlbH0gZmlyZXMgb24gZXZlcnkgYWdlbnRcbiAqIHN0ZXAuXG4gKi9cbmNvbnN0IHNldHVwRmV0Y2hJbnRlcmNlcHRvciA9IGZ1bmN0aW9uVXRpbHMubWVtb2l6ZSgoKTogdm9pZCA9PiB7XG4gIGdsb2JhbFRoaXMuZmV0Y2ggPSBjcmVhdGVTZXJ2aW5nRmV0Y2hJbnRlcmNlcHRvcihnbG9iYWxUaGlzLmZldGNoLmJpbmQoZ2xvYmFsVGhpcykpO1xufSk7XG5cbi8qKiBCdWlsZCB0aGUgc2VydmluZyBmZXRjaCB3cmFwcGVyOyBleHBvcnRlZCBmb3IgdHJhbnNwb3J0LWxldmVsIHJlZ3Jlc3Npb24gdGVzdHMuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmluZ0ZldGNoSW50ZXJjZXB0b3Iob3JpZ2luYWw6IHR5cGVvZiBmZXRjaCk6IHR5cGVvZiBmZXRjaCB7XG4gIGNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvbGxtXCIpO1xuICByZXR1cm4gKGFzeW5jIChpbnB1dCwgaW5pdCkgPT4ge1xuICAgIGNvbnN0IHVybCA9IG5ldC51cmxCdWlsZGVyKGlucHV0KTtcbiAgICBjb25zdCBtZXRob2QgPSBpbml0Py5tZXRob2QgPz8gKGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCA/IGlucHV0Lm1ldGhvZCA6IFwiR0VUXCIpO1xuICAgIGlmICghdXJsIHx8IHVybC5wYXRobmFtZSAhPT0gQ0hBVF9DT01QTEVUSU9OU19QQVRIIHx8IG1ldGhvZC50b1VwcGVyQ2FzZSgpICE9PSBcIlBPU1RcIikge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsKGlucHV0LCBpbml0KTtcbiAgICB9XG4gICAgY29uc3QgcmV3cml0dGVuID0gYXdhaXQgcmV3cml0ZVNlcnZpbmdSZXF1ZXN0KGlucHV0LCBpbml0KTtcbiAgICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlPHVua25vd24+KHJld3JpdHRlbi5ib2R5KTtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIlBPU1RcIixcbiAgICAgIHBhcnNlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8geyB1cmw6IHVybC50b1N0cmluZygpLCBib2R5VHlwZTogXCJub24tSlNPTlwiIH1cbiAgICAgICAgOiB7IHVybDogdXJsLnRvU3RyaW5nKCksIGJvZHk6IHBhcnNlZCB9LFxuICAgICk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvcmlnaW5hbChyZXdyaXR0ZW4uaW5wdXQsIHJld3JpdHRlbi5pbml0KTtcbiAgICByZXR1cm4gcmVwYWlyU2VydmluZ1Jlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfSkgYXMgdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2g7XG59XG5cbi8qKlxuICogUmV3cml0ZSBhIHNlcnZpbmcgcmVzcG9uc2Ugd2hvc2UgYm9keSBuZWVkcyByZXBhaXIsIGxlYXZpbmcgdW5zdXBwb3J0ZWRcbiAqIGNvbnRlbnQgdHlwZXMgYnl0ZS1pZGVudGljYWwuXG4gKlxuICogU1NFIHJlbWFpbnMgYSBsaXZlIHN0cmVhbTogYSBUcmFuc2Zvcm1TdHJlYW0gcmVwYWlycyBjb21wbGV0ZSBgZGF0YTpgIGxpbmVzXG4gKiBhcyBieXRlcyBhcnJpdmUgYW5kIHByZXNlcnZlcyBwYXJ0aWFsIGxpbmVzIGFjcm9zcyBuZXR3b3JrIGNodW5rcy4gSlNPTiBpc1xuICogYnVmZmVyZWQgdGhyb3VnaCB0aGUgZXhpc3RpbmcgcmVzcG9uc2UtYm9keSByZXBhaXIuIEEgbm9uLUpTT04vbm9uLVNTRSBib2R5XG4gKiBpcyByZXR1cm5lZCB1bnRvdWNoZWQgc28gdGhlIGNhbGxlciBzdGlsbCBzZWVzIHRoZSBvcmlnaW5hbCByZXNwb25zZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVwYWlyU2VydmluZ1Jlc3BvbnNlKHJlc3BvbnNlOiBSZXNwb25zZSk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSA/PyBcIlwiO1xuICBpZiAoY29udGVudFR5cGUuaW5jbHVkZXMoXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiKSAmJiByZXNwb25zZS5ib2R5KSB7XG4gICAgcmV0dXJuIHJlYnVpbGRTZXJ2aW5nUmVzcG9uc2UocmVzcG9uc2UsIHJld3JpdGVTZXJ2aW5nUmVzcG9uc2VTdHJlYW0ocmVzcG9uc2UuYm9keSkpO1xuICB9XG4gIGlmICghY29udGVudFR5cGUuaW5jbHVkZXMoXCJhcHBsaWNhdGlvbi9qc29uXCIpKSByZXR1cm4gcmVzcG9uc2U7XG5cbiAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3BvbnNlLmNsb25lKCkudGV4dCgpO1xuICBjb25zdCByZXdyaXR0ZW4gPSByZXdyaXRlU2VydmluZ1Jlc3BvbnNlQm9keShib2R5KTtcbiAgaWYgKHJld3JpdHRlbiA9PT0gYm9keSkgcmV0dXJuIHJlc3BvbnNlO1xuICByZXR1cm4gcmVidWlsZFNlcnZpbmdSZXNwb25zZShyZXNwb25zZSwgcmV3cml0dGVuKTtcbn1cblxuLyoqIFJlYnVpbGQgYSB0cmFuc2Zvcm1lZCByZXNwb25zZSB3aXRob3V0IHN0YWxlIGJ5dGUtbGVuZ3RoL2VuY29kaW5nIGhlYWRlcnMuICovXG5mdW5jdGlvbiByZWJ1aWxkU2VydmluZ1Jlc3BvbnNlKFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4gIGJvZHk6IHN0cmluZyB8IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+LFxuKTogUmVzcG9uc2Uge1xuICAvLyBgY29udGVudC1sZW5ndGhgIC8gYGNvbnRlbnQtZW5jb2RpbmdgIGRlc2NyaWJlIHRoZSBPUklHSU5BTCBieXRlcywgc28gdGhleVxuICAvLyBhcmUgZHJvcHBlZDogdGhlIHJld3JpdHRlbiBib2R5IGlzIGEgZGlmZmVyZW50IGxlbmd0aCBhbmQgYWxyZWFkeSBkZWNvZGVkLlxuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG4gIGhlYWRlcnMuZGVsZXRlKFwiY29udGVudC1sZW5ndGhcIik7XG4gIGhlYWRlcnMuZGVsZXRlKFwiY29udGVudC1lbmNvZGluZ1wiKTtcbiAgcmV0dXJuIG5ldyBSZXNwb25zZShib2R5LCB7XG4gICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICBoZWFkZXJzLFxuICB9KTtcbn1cbiJdfQ==
@@ -90,7 +90,8 @@ export declare function configureOtelPropagation(): boolean;
90
90
  * OTel pipeline via `@mastra/otel-bridge`.
91
91
  *
92
92
  * Returns `undefined` when tracing is off: either the caller passed
93
- * `enabled: false`, or auto mode finds no OTLP endpoint (the default).
93
+ * `enabled: false`, or auto mode finds neither AppKit OTLP nor a local MLflow
94
+ * experiment.
94
95
  * Skipping the bridge in that case avoids `[OtelBridge] No OTEL span
95
96
  * found` log spam from Mastra spans that have no parent on the noop
96
97
  * tracer.