@odigos/aws-cdk 0.0.21 → 0.0.22

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/index.d.ts CHANGED
@@ -1,9 +1,12 @@
1
1
  export * from './types';
2
2
  export * from './instrumentation';
3
3
  export * from './fargate';
4
+ export * from './agentcore';
4
5
  export { odigosLayerName } from './layer-resolver';
5
6
  export { languageFromRuntime, execWrapperFor, layerNameFor } from './runtime';
6
7
  export { OTLP_PROTOCOL_GRPC, OTLP_PROTOCOL_HTTP, evaluateAppendPattern, appendSeparator, sidecarCommand, fargateResourceAttributes, } from './fargate-recipes';
7
8
  export { FARGATE_AGENTS_IMAGE, FARGATE_AGENTS_DIR, FARGATE_SIDECAR_CONTAINER_NAME, FARGATE_VOLUME_NAME, FARGATE_DISTROS_VERSION, } from './generated/fargate';
9
+ export { agentCoreAdoptEnvironment, agentCoreDistroName, agentCoreEnvironment, agentCoreIaCMarker, agentCorePackage, agentCoreQueryEscape, renderAgentCoreHeaders, validateAgentCoreDestination, } from './agentcore-recipes';
10
+ export { AGENTCORE_AGENTS_IMAGE, AGENTCORE_RECIPE_VERSION, AGENTCORE_DISTRIBUTIONS } from './generated/agentcore';
8
11
  export { renderCollectorConfig, ENV_COLLECTOR_CONFIG_URI, ENV_TRACES_EXPORTER, ENV_METRICS_EXPORTER, ENV_LOGS_EXPORTER, } from './collector-config';
9
12
  export { ODIGOS_VERSION, LAYER_ARNS, SAR_APPLICATIONS, SAR_SEMANTIC_VERSION } from './generated/layers';
package/lib/index.js CHANGED
@@ -14,10 +14,11 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.SAR_SEMANTIC_VERSION = exports.SAR_APPLICATIONS = exports.LAYER_ARNS = exports.ODIGOS_VERSION = exports.ENV_LOGS_EXPORTER = exports.ENV_METRICS_EXPORTER = exports.ENV_TRACES_EXPORTER = exports.ENV_COLLECTOR_CONFIG_URI = exports.renderCollectorConfig = exports.FARGATE_DISTROS_VERSION = exports.FARGATE_VOLUME_NAME = exports.FARGATE_SIDECAR_CONTAINER_NAME = exports.FARGATE_AGENTS_DIR = exports.FARGATE_AGENTS_IMAGE = exports.fargateResourceAttributes = exports.sidecarCommand = exports.appendSeparator = exports.evaluateAppendPattern = exports.OTLP_PROTOCOL_HTTP = exports.OTLP_PROTOCOL_GRPC = exports.layerNameFor = exports.execWrapperFor = exports.languageFromRuntime = exports.odigosLayerName = void 0;
17
+ exports.SAR_SEMANTIC_VERSION = exports.SAR_APPLICATIONS = exports.LAYER_ARNS = exports.ODIGOS_VERSION = exports.ENV_LOGS_EXPORTER = exports.ENV_METRICS_EXPORTER = exports.ENV_TRACES_EXPORTER = exports.ENV_COLLECTOR_CONFIG_URI = exports.renderCollectorConfig = exports.AGENTCORE_DISTRIBUTIONS = exports.AGENTCORE_RECIPE_VERSION = exports.AGENTCORE_AGENTS_IMAGE = exports.validateAgentCoreDestination = exports.renderAgentCoreHeaders = exports.agentCoreQueryEscape = exports.agentCorePackage = exports.agentCoreIaCMarker = exports.agentCoreEnvironment = exports.agentCoreDistroName = exports.agentCoreAdoptEnvironment = exports.FARGATE_DISTROS_VERSION = exports.FARGATE_VOLUME_NAME = exports.FARGATE_SIDECAR_CONTAINER_NAME = exports.FARGATE_AGENTS_DIR = exports.FARGATE_AGENTS_IMAGE = exports.fargateResourceAttributes = exports.sidecarCommand = exports.appendSeparator = exports.evaluateAppendPattern = exports.OTLP_PROTOCOL_HTTP = exports.OTLP_PROTOCOL_GRPC = exports.layerNameFor = exports.execWrapperFor = exports.languageFromRuntime = exports.odigosLayerName = void 0;
18
18
  __exportStar(require("./types"), exports);
19
19
  __exportStar(require("./instrumentation"), exports);
20
20
  __exportStar(require("./fargate"), exports);
21
+ __exportStar(require("./agentcore"), exports);
21
22
  var layer_resolver_1 = require("./layer-resolver");
22
23
  Object.defineProperty(exports, "odigosLayerName", { enumerable: true, get: function () { return layer_resolver_1.odigosLayerName; } });
23
24
  var runtime_1 = require("./runtime");
@@ -37,6 +38,19 @@ Object.defineProperty(exports, "FARGATE_AGENTS_DIR", { enumerable: true, get: fu
37
38
  Object.defineProperty(exports, "FARGATE_SIDECAR_CONTAINER_NAME", { enumerable: true, get: function () { return fargate_1.FARGATE_SIDECAR_CONTAINER_NAME; } });
38
39
  Object.defineProperty(exports, "FARGATE_VOLUME_NAME", { enumerable: true, get: function () { return fargate_1.FARGATE_VOLUME_NAME; } });
39
40
  Object.defineProperty(exports, "FARGATE_DISTROS_VERSION", { enumerable: true, get: function () { return fargate_1.FARGATE_DISTROS_VERSION; } });
41
+ var agentcore_recipes_1 = require("./agentcore-recipes");
42
+ Object.defineProperty(exports, "agentCoreAdoptEnvironment", { enumerable: true, get: function () { return agentcore_recipes_1.agentCoreAdoptEnvironment; } });
43
+ Object.defineProperty(exports, "agentCoreDistroName", { enumerable: true, get: function () { return agentcore_recipes_1.agentCoreDistroName; } });
44
+ Object.defineProperty(exports, "agentCoreEnvironment", { enumerable: true, get: function () { return agentcore_recipes_1.agentCoreEnvironment; } });
45
+ Object.defineProperty(exports, "agentCoreIaCMarker", { enumerable: true, get: function () { return agentcore_recipes_1.agentCoreIaCMarker; } });
46
+ Object.defineProperty(exports, "agentCorePackage", { enumerable: true, get: function () { return agentcore_recipes_1.agentCorePackage; } });
47
+ Object.defineProperty(exports, "agentCoreQueryEscape", { enumerable: true, get: function () { return agentcore_recipes_1.agentCoreQueryEscape; } });
48
+ Object.defineProperty(exports, "renderAgentCoreHeaders", { enumerable: true, get: function () { return agentcore_recipes_1.renderAgentCoreHeaders; } });
49
+ Object.defineProperty(exports, "validateAgentCoreDestination", { enumerable: true, get: function () { return agentcore_recipes_1.validateAgentCoreDestination; } });
50
+ var agentcore_1 = require("./generated/agentcore");
51
+ Object.defineProperty(exports, "AGENTCORE_AGENTS_IMAGE", { enumerable: true, get: function () { return agentcore_1.AGENTCORE_AGENTS_IMAGE; } });
52
+ Object.defineProperty(exports, "AGENTCORE_RECIPE_VERSION", { enumerable: true, get: function () { return agentcore_1.AGENTCORE_RECIPE_VERSION; } });
53
+ Object.defineProperty(exports, "AGENTCORE_DISTRIBUTIONS", { enumerable: true, get: function () { return agentcore_1.AGENTCORE_DISTRIBUTIONS; } });
40
54
  var collector_config_1 = require("./collector-config");
41
55
  Object.defineProperty(exports, "renderCollectorConfig", { enumerable: true, get: function () { return collector_config_1.renderCollectorConfig; } });
42
56
  Object.defineProperty(exports, "ENV_COLLECTOR_CONFIG_URI", { enumerable: true, get: function () { return collector_config_1.ENV_COLLECTOR_CONFIG_URI; } });
@@ -48,4 +62,4 @@ Object.defineProperty(exports, "ODIGOS_VERSION", { enumerable: true, get: functi
48
62
  Object.defineProperty(exports, "LAYER_ARNS", { enumerable: true, get: function () { return layers_1.LAYER_ARNS; } });
49
63
  Object.defineProperty(exports, "SAR_APPLICATIONS", { enumerable: true, get: function () { return layers_1.SAR_APPLICATIONS; } });
50
64
  Object.defineProperty(exports, "SAR_SEMANTIC_VERSION", { enumerable: true, get: function () { return layers_1.SAR_SEMANTIC_VERSION; } });
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwwQ0FBd0I7QUFDeEIsb0RBQWtDO0FBQ2xDLDRDQUEwQjtBQUMxQixtREFBbUQ7QUFBMUMsaUhBQUEsZUFBZSxPQUFBO0FBQ3hCLHFDQUE4RTtBQUFyRSw4R0FBQSxtQkFBbUIsT0FBQTtBQUFFLHlHQUFBLGNBQWMsT0FBQTtBQUFFLHVHQUFBLFlBQVksT0FBQTtBQUMxRCxxREFPMkI7QUFOekIscUhBQUEsa0JBQWtCLE9BQUE7QUFDbEIscUhBQUEsa0JBQWtCLE9BQUE7QUFDbEIsd0hBQUEscUJBQXFCLE9BQUE7QUFDckIsa0hBQUEsZUFBZSxPQUFBO0FBQ2YsaUhBQUEsY0FBYyxPQUFBO0FBQ2QsNEhBQUEseUJBQXlCLE9BQUE7QUFFM0IsK0NBTTZCO0FBTDNCLCtHQUFBLG9CQUFvQixPQUFBO0FBQ3BCLDZHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHlIQUFBLDhCQUE4QixPQUFBO0FBQzlCLDhHQUFBLG1CQUFtQixPQUFBO0FBQ25CLGtIQUFBLHVCQUF1QixPQUFBO0FBRXpCLHVEQU00QjtBQUwxQix5SEFBQSxxQkFBcUIsT0FBQTtBQUNyQiw0SEFBQSx3QkFBd0IsT0FBQTtBQUN4Qix1SEFBQSxtQkFBbUIsT0FBQTtBQUNuQix3SEFBQSxvQkFBb0IsT0FBQTtBQUNwQixxSEFBQSxpQkFBaUIsT0FBQTtBQUVuQiw2Q0FBd0c7QUFBL0Ysd0dBQUEsY0FBYyxPQUFBO0FBQUUsb0dBQUEsVUFBVSxPQUFBO0FBQUUsMEdBQUEsZ0JBQWdCLE9BQUE7QUFBRSw4R0FBQSxvQkFBb0IsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnN0cnVtZW50YXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9mYXJnYXRlJztcbmV4cG9ydCB7IG9kaWdvc0xheWVyTmFtZSB9IGZyb20gJy4vbGF5ZXItcmVzb2x2ZXInO1xuZXhwb3J0IHsgbGFuZ3VhZ2VGcm9tUnVudGltZSwgZXhlY1dyYXBwZXJGb3IsIGxheWVyTmFtZUZvciB9IGZyb20gJy4vcnVudGltZSc7XG5leHBvcnQge1xuICBPVExQX1BST1RPQ09MX0dSUEMsXG4gIE9UTFBfUFJPVE9DT0xfSFRUUCxcbiAgZXZhbHVhdGVBcHBlbmRQYXR0ZXJuLFxuICBhcHBlbmRTZXBhcmF0b3IsXG4gIHNpZGVjYXJDb21tYW5kLFxuICBmYXJnYXRlUmVzb3VyY2VBdHRyaWJ1dGVzLFxufSBmcm9tICcuL2ZhcmdhdGUtcmVjaXBlcyc7XG5leHBvcnQge1xuICBGQVJHQVRFX0FHRU5UU19JTUFHRSxcbiAgRkFSR0FURV9BR0VOVFNfRElSLFxuICBGQVJHQVRFX1NJREVDQVJfQ09OVEFJTkVSX05BTUUsXG4gIEZBUkdBVEVfVk9MVU1FX05BTUUsXG4gIEZBUkdBVEVfRElTVFJPU19WRVJTSU9OLFxufSBmcm9tICcuL2dlbmVyYXRlZC9mYXJnYXRlJztcbmV4cG9ydCB7XG4gIHJlbmRlckNvbGxlY3RvckNvbmZpZyxcbiAgRU5WX0NPTExFQ1RPUl9DT05GSUdfVVJJLFxuICBFTlZfVFJBQ0VTX0VYUE9SVEVSLFxuICBFTlZfTUVUUklDU19FWFBPUlRFUixcbiAgRU5WX0xPR1NfRVhQT1JURVIsXG59IGZyb20gJy4vY29sbGVjdG9yLWNvbmZpZyc7XG5leHBvcnQgeyBPRElHT1NfVkVSU0lPTiwgTEFZRVJfQVJOUywgU0FSX0FQUExJQ0FUSU9OUywgU0FSX1NFTUFOVElDX1ZFUlNJT04gfSBmcm9tICcuL2dlbmVyYXRlZC9sYXllcnMnO1xuIl19
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwwQ0FBd0I7QUFDeEIsb0RBQWtDO0FBQ2xDLDRDQUEwQjtBQUMxQiw4Q0FBNEI7QUFDNUIsbURBQW1EO0FBQTFDLGlIQUFBLGVBQWUsT0FBQTtBQUN4QixxQ0FBOEU7QUFBckUsOEdBQUEsbUJBQW1CLE9BQUE7QUFBRSx5R0FBQSxjQUFjLE9BQUE7QUFBRSx1R0FBQSxZQUFZLE9BQUE7QUFDMUQscURBTzJCO0FBTnpCLHFIQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHFIQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHdIQUFBLHFCQUFxQixPQUFBO0FBQ3JCLGtIQUFBLGVBQWUsT0FBQTtBQUNmLGlIQUFBLGNBQWMsT0FBQTtBQUNkLDRIQUFBLHlCQUF5QixPQUFBO0FBRTNCLCtDQU02QjtBQUwzQiwrR0FBQSxvQkFBb0IsT0FBQTtBQUNwQiw2R0FBQSxrQkFBa0IsT0FBQTtBQUNsQix5SEFBQSw4QkFBOEIsT0FBQTtBQUM5Qiw4R0FBQSxtQkFBbUIsT0FBQTtBQUNuQixrSEFBQSx1QkFBdUIsT0FBQTtBQUV6Qix5REFTNkI7QUFSM0IsOEhBQUEseUJBQXlCLE9BQUE7QUFDekIsd0hBQUEsbUJBQW1CLE9BQUE7QUFDbkIseUhBQUEsb0JBQW9CLE9BQUE7QUFDcEIsdUhBQUEsa0JBQWtCLE9BQUE7QUFDbEIscUhBQUEsZ0JBQWdCLE9BQUE7QUFDaEIseUhBQUEsb0JBQW9CLE9BQUE7QUFDcEIsMkhBQUEsc0JBQXNCLE9BQUE7QUFDdEIsaUlBQUEsNEJBQTRCLE9BQUE7QUFFOUIsbURBQWtIO0FBQXpHLG1IQUFBLHNCQUFzQixPQUFBO0FBQUUscUhBQUEsd0JBQXdCLE9BQUE7QUFBRSxvSEFBQSx1QkFBdUIsT0FBQTtBQUNsRix1REFNNEI7QUFMMUIseUhBQUEscUJBQXFCLE9BQUE7QUFDckIsNEhBQUEsd0JBQXdCLE9BQUE7QUFDeEIsdUhBQUEsbUJBQW1CLE9BQUE7QUFDbkIsd0hBQUEsb0JBQW9CLE9BQUE7QUFDcEIscUhBQUEsaUJBQWlCLE9BQUE7QUFFbkIsNkNBQXdHO0FBQS9GLHdHQUFBLGNBQWMsT0FBQTtBQUFFLG9HQUFBLFVBQVUsT0FBQTtBQUFFLDBHQUFBLGdCQUFnQixPQUFBO0FBQUUsOEdBQUEsb0JBQW9CLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vaW5zdHJ1bWVudGF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vZmFyZ2F0ZSc7XG5leHBvcnQgKiBmcm9tICcuL2FnZW50Y29yZSc7XG5leHBvcnQgeyBvZGlnb3NMYXllck5hbWUgfSBmcm9tICcuL2xheWVyLXJlc29sdmVyJztcbmV4cG9ydCB7IGxhbmd1YWdlRnJvbVJ1bnRpbWUsIGV4ZWNXcmFwcGVyRm9yLCBsYXllck5hbWVGb3IgfSBmcm9tICcuL3J1bnRpbWUnO1xuZXhwb3J0IHtcbiAgT1RMUF9QUk9UT0NPTF9HUlBDLFxuICBPVExQX1BST1RPQ09MX0hUVFAsXG4gIGV2YWx1YXRlQXBwZW5kUGF0dGVybixcbiAgYXBwZW5kU2VwYXJhdG9yLFxuICBzaWRlY2FyQ29tbWFuZCxcbiAgZmFyZ2F0ZVJlc291cmNlQXR0cmlidXRlcyxcbn0gZnJvbSAnLi9mYXJnYXRlLXJlY2lwZXMnO1xuZXhwb3J0IHtcbiAgRkFSR0FURV9BR0VOVFNfSU1BR0UsXG4gIEZBUkdBVEVfQUdFTlRTX0RJUixcbiAgRkFSR0FURV9TSURFQ0FSX0NPTlRBSU5FUl9OQU1FLFxuICBGQVJHQVRFX1ZPTFVNRV9OQU1FLFxuICBGQVJHQVRFX0RJU1RST1NfVkVSU0lPTixcbn0gZnJvbSAnLi9nZW5lcmF0ZWQvZmFyZ2F0ZSc7XG5leHBvcnQge1xuICBhZ2VudENvcmVBZG9wdEVudmlyb25tZW50LFxuICBhZ2VudENvcmVEaXN0cm9OYW1lLFxuICBhZ2VudENvcmVFbnZpcm9ubWVudCxcbiAgYWdlbnRDb3JlSWFDTWFya2VyLFxuICBhZ2VudENvcmVQYWNrYWdlLFxuICBhZ2VudENvcmVRdWVyeUVzY2FwZSxcbiAgcmVuZGVyQWdlbnRDb3JlSGVhZGVycyxcbiAgdmFsaWRhdGVBZ2VudENvcmVEZXN0aW5hdGlvbixcbn0gZnJvbSAnLi9hZ2VudGNvcmUtcmVjaXBlcyc7XG5leHBvcnQgeyBBR0VOVENPUkVfQUdFTlRTX0lNQUdFLCBBR0VOVENPUkVfUkVDSVBFX1ZFUlNJT04sIEFHRU5UQ09SRV9ESVNUUklCVVRJT05TIH0gZnJvbSAnLi9nZW5lcmF0ZWQvYWdlbnRjb3JlJztcbmV4cG9ydCB7XG4gIHJlbmRlckNvbGxlY3RvckNvbmZpZyxcbiAgRU5WX0NPTExFQ1RPUl9DT05GSUdfVVJJLFxuICBFTlZfVFJBQ0VTX0VYUE9SVEVSLFxuICBFTlZfTUVUUklDU19FWFBPUlRFUixcbiAgRU5WX0xPR1NfRVhQT1JURVIsXG59IGZyb20gJy4vY29sbGVjdG9yLWNvbmZpZyc7XG5leHBvcnQgeyBPRElHT1NfVkVSU0lPTiwgTEFZRVJfQVJOUywgU0FSX0FQUExJQ0FUSU9OUywgU0FSX1NFTUFOVElDX1ZFUlNJT04gfSBmcm9tICcuL2dlbmVyYXRlZC9sYXllcnMnO1xuIl19
@@ -223,7 +223,7 @@ class OdigosLambdaInstrumentation extends constructs_1.Construct {
223
223
  }
224
224
  exports.OdigosLambdaInstrumentation = OdigosLambdaInstrumentation;
225
225
  _a = JSII_RTTI_SYMBOL_1;
226
- OdigosLambdaInstrumentation[_a] = { fqn: "@odigos/aws-cdk.OdigosLambdaInstrumentation", version: "0.0.21" };
226
+ OdigosLambdaInstrumentation[_a] = { fqn: "@odigos/aws-cdk.OdigosLambdaInstrumentation", version: "0.0.22" };
227
227
  /**
228
228
  * Applies Odigos instrumentation to every `lambda.Function` in a scope.
229
229
  *
@@ -261,5 +261,5 @@ class OdigosInstrumentationAspect {
261
261
  }
262
262
  exports.OdigosInstrumentationAspect = OdigosInstrumentationAspect;
263
263
  _b = JSII_RTTI_SYMBOL_1;
264
- OdigosInstrumentationAspect[_b] = { fqn: "@odigos/aws-cdk.OdigosInstrumentationAspect", version: "0.0.21" };
264
+ OdigosInstrumentationAspect[_b] = { fqn: "@odigos/aws-cdk.OdigosInstrumentationAspect", version: "0.0.22" };
265
265
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUF1RTtBQUN2RSxpREFBaUQ7QUFDakQsMkNBQTJDO0FBQzNDLDJDQUFtRDtBQUNuRCx5REFHNEI7QUFDNUIscURBQXVEO0FBQ3ZELHVDQUF5RjtBQUN6RixtQ0FLaUI7QUFFakIsMkVBQTJFO0FBQzNFLE1BQU0sZ0JBQWdCLEdBQUcseUJBQXlCLENBQUM7QUFDbkQsa0VBQWtFO0FBQ2xFLDhGQUE4RjtBQUM5RixNQUFNLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDO0FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILFNBQVMsa0JBQWtCLENBQUMsRUFBbUI7SUFDN0MsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUE4QyxDQUFDO0lBQ25FLE1BQU0sUUFBUSxHQUFHLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4RixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNyRixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBd0hEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILE1BQWEsMkJBQTRCLFNBQVEsc0JBQVM7SUFLeEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF1QztRQUMvRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBSkYsY0FBUyxHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO1FBQ2xELGlCQUFZLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUtoRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUVyQixpR0FBaUc7UUFDakcsd0RBQXdEO1FBQ3hELElBQUEsd0NBQXFCLEVBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXpDLHdHQUF3RztRQUN4Ryx3R0FBd0c7UUFDeEcsc0dBQXNHO1FBQ3RHLDBDQUEwQztRQUMxQyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2xELHlCQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FDL0Isc0NBQXNDLEVBQ3RDLGlDQUFpQyxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsd0NBQXdDO2dCQUNqRyxvR0FBb0c7Z0JBQ3BHLHNHQUFzRyxDQUN6RyxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDdEQseUJBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUMvQixzQ0FBc0MsRUFDdEMscUNBQXFDLEtBQUssQ0FBQyxXQUFXLENBQUMsWUFBWSxvQ0FBb0M7Z0JBQ3JHLHNHQUFzRztnQkFDdEcsNkNBQTZDLENBQ2hELENBQUM7UUFDSixDQUFDO1FBRUQsS0FBSyxNQUFNLEVBQUUsSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSxVQUFVLENBQUMsRUFBbUI7UUFDbkMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDcEMsTUFBTSxRQUFRLEdBQUcsSUFBQSw2QkFBbUIsRUFBQyxXQUFXLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxNQUFNLE9BQU8sR0FDWCxvQkFBb0IsV0FBVyxzQ0FBc0M7Z0JBQ3JFLDhHQUE4RyxDQUFDO1lBQ2pILElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUN6Qyx5QkFBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsb0NBQW9DLEVBQUUsR0FBRyxPQUFPLFlBQVksQ0FBQyxDQUFDO2dCQUM5RixPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxPQUFPLHdEQUF3RCxDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLElBQUEsNEJBQWtCLEVBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzlFLElBQUEsNkJBQW1CLEVBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssaUNBQXlCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0ksSUFBSSxNQUFNLENBQUMsa0JBQWtCLElBQUksQ0FBQyxDQUFDLElBQUEsa0NBQWUsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUEsa0NBQWUsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDM0ksTUFBTSxJQUFJLEtBQUssQ0FBQywyRkFBMkYsQ0FBQyxDQUFDO1FBQy9HLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxzQkFBUyxDQUFDLEtBQUssRUFBRSxlQUFlLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM5RyxRQUFRLEdBQUcsSUFBSSxvQ0FBbUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUkseUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdkcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztRQUMxQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3ZHLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM5SSxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xFLEtBQUssTUFBTSxRQUFRLElBQUksTUFBTSxFQUFFLENBQUM7WUFDOUIsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztZQUNyQyxJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3hHLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLEdBQUcsb0NBQW9DLEtBQUssQ0FBQyxNQUFNLHNEQUFzRCxDQUFDLENBQUM7WUFDOUksQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLGVBQWUsRUFBRSxjQUFjLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDOUcsSUFBSSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM5QixFQUFFLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsdURBQXVELENBQUMsQ0FBQyxDQUFDO1lBQy9ILHlCQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxvQ0FBb0MsRUFDbEUsNFNBQTRTLENBQUMsQ0FBQztRQUNsVCxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFrQyxDQUFDO1FBQzVELFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQzdFLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3pFLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztRQUV4Qix1R0FBdUc7UUFDdkcsc0ZBQXNGO1FBQ3RGLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDeEQsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCw4Q0FBOEM7SUFDdkMsYUFBYSxDQUFDLFNBQTRCO1FBQy9DLEtBQUssTUFBTSxFQUFFLElBQUksU0FBUyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLGNBQWMsQ0FBQyxFQUFtQixFQUFFLFFBQWdCLEVBQUUsUUFBZ0IsRUFBRSxpQkFBMEI7UUFDeEcsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQy9HLE1BQU0sU0FBUyxHQUFHLElBQUksS0FBSyxpQ0FBeUIsQ0FBQyxVQUFVLENBQUM7UUFFaEUsTUFBTSxNQUFNLEdBQUcsSUFBQSw0QkFBa0IsRUFBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckUsTUFBTSxPQUFPLEdBQUcsSUFBQSxrQ0FBZSxFQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBa0MsQ0FBQztRQUM1RCxNQUFNLE9BQU8sR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBdUQsQ0FBQztRQUNqSCxNQUFNLFlBQVksR0FBSSxPQUFPLEVBQUUsU0FBZ0QsRUFBRSx1QkFBdUIsQ0FBQztRQUN6RyxNQUFNLGVBQWUsR0FBRyxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLG1CQUFLLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZGLElBQUksU0FBUyxJQUFJLGVBQWUsS0FBSyx1QkFBdUIsRUFBRSxDQUFDO1lBQzdELE1BQU0sSUFBSSxLQUFLLENBQUMsaUhBQWlILENBQUMsQ0FBQztRQUNySSxDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsSUFBQSw2QkFBbUIsRUFBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFILE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxRQUFRLEtBQUssTUFBTSxJQUFJLENBQUMsUUFBUSxLQUFLLE1BQU07WUFDN0YsQ0FBQyxtQkFBbUIsRUFBRSx5QkFBeUIsRUFBRSx1QkFBdUIsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEksTUFBTSxNQUFNLEdBQUc7WUFDYixPQUFPLEVBQUUsQ0FBQztZQUNWLE9BQU8sRUFBRSxXQUFXLElBQUksa0JBQWtCLENBQUMsRUFBRSxDQUFDO1lBQzlDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQThCLENBQUMsQ0FBQztZQUNoRyxRQUFRLEVBQUUsV0FBVyxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsWUFBWTtZQUMxRCxHQUFHLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxHQUFHLENBQUMsV0FBVyxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzNFLEdBQUcsQ0FBQyxXQUFXLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0csR0FBRyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xFLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0MsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMvQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3RELENBQUM7UUFDRixNQUFNLEdBQUcsR0FBOEI7WUFDckMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFdBQVc7WUFDL0IsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLG1CQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7U0FDdkQsQ0FBQztRQUNGLGtCQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEMsa0JBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLElBQUksaUJBQWlCO1lBQUUsa0JBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLHdCQUF3QixFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDcEYsZ0ZBQWdGO1FBQ2hGLElBQUksU0FBUyxJQUFJLG1CQUFtQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25ELE1BQU0sU0FBUyxHQUFHLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hHLElBQUksU0FBUztnQkFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsbUJBQW1CLENBQUM7UUFDdEQsQ0FBQztRQUNELElBQUksUUFBUSxLQUFLLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDM0MseUJBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLHdDQUF3QyxFQUN0RSxxSkFBcUosQ0FBQyxDQUFDO1FBQzNKLENBQUM7UUFDRCxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN6Qix5QkFBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMscUNBQXFDLEVBQ25FLDBHQUEwRyxDQUFDLENBQUM7UUFDaEgsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzs7QUF4S0gsa0VBeUtDOzs7QUFPRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQWEsMkJBQTJCO0lBR3RDOzs7O09BSUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsS0FBdUM7UUFDbkUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLDJCQUEyQixDQUFDLEtBQUssRUFBRSw2QkFBNkIsRUFBRTtZQUMzRix1QkFBdUIsRUFBRSxJQUFJO1lBQzdCLEdBQUcsS0FBSztTQUNULENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBZ0I7UUFDM0IsSUFBSSxJQUFJLFlBQVksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLENBQUM7SUFDSCxDQUFDOztBQW5CSCxrRUFvQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbm5vdGF0aW9ucywgSUFzcGVjdCwgU3RhY2ssIFRva2VuLCBUYWdzIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge1xuICByZXNvbHZlZFNpZ25hbHMsXG4gIHJlbmRlckNvbGxlY3RvckNvbmZpZyxcbn0gZnJvbSAnLi9jb2xsZWN0b3ItY29uZmlnJztcbmltcG9ydCB7IE9kaWdvc0xheWVyUmVzb2x2ZXIgfSBmcm9tICcuL2xheWVyLXJlc29sdmVyJztcbmltcG9ydCB7IGRpc3RyaWJ1dGlvblJlY2lwZSwgZGlzdHJpYnV0aW9uV3JhcHBlciwgbGFuZ3VhZ2VGcm9tUnVudGltZSB9IGZyb20gJy4vcnVudGltZSc7XG5pbXBvcnQge1xuICBPZGlnb3NEZXN0aW5hdGlvbixcbiAgT2RpZ29zSW5zdHJ1bWVudGF0aW9uTW9kZSxcbiAgT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8sXG4gIE9kaWdvc0xheWVyU291cmNlLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqIGBBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUmAg4oCUIHRoZSBsYXllcidzIGVudHJ5IHBvaW50IGluIGhhbmRsZXIgbW9kZS4gKi9cbmNvbnN0IEVOVl9FWEVDX1dSQVBQRVIgPSAnQVdTX0xBTUJEQV9FWEVDX1dSQVBQRVInO1xuLyoqIFNlcnZpY2UgbmFtZSByZXBvcnRlZCBvbiBldmVyeSBzcGFuLCBtZXRyaWMgYW5kIGxvZyByZWNvcmQuICovXG4vKiogQ29tcGFjdCBTREsgYW5kIGRlc3RpbmF0aW9uIHNldHRpbmdzOyBhbGwgYXR0cmlidXRpb24gbWFya2VycyBhcmUgTGFtYmRhIHJlc291cmNlIHRhZ3MuICovXG5jb25zdCBFTlZfTEFNQkRBX0NPTkZJRyA9ICdPRElHT1NfTEFNQkRBX0NPTkZJRyc7XG5cbi8qKlxuICogVGhlIHNlcnZpY2UgYSBmdW5jdGlvbiByZXBvcnRzIGFzLCB3aGVuIHRoZSBjYWxsZXIgaGFzIG5vdCBuYW1lZCBvbmUuXG4gKlxuICogUkVBRCBGUk9NIFRIRSBMMSwgTk9UIEZST00gYGZuLmZ1bmN0aW9uTmFtZWAuIFRoZSBMMiBwcm9wZXJ0eSBpcyBhIGNyb3NzLWVudmlyb25tZW50LWF3YXJlIHRva2VuIHRoYXRcbiAqIHJlc29sdmVzIHRvIGEgYFJlZmAgdG8gdGhlIGZ1bmN0aW9uIGl0c2VsZiBldmVuIHdoZW4gdGhlIHN0YWNrIHNldCBgZnVuY3Rpb25OYW1lYCBleHBsaWNpdGx5IOKAlCBzbyB0aGVcbiAqIG9idmlvdXMgYFN0YWNrLm9mKGZuKS5yZXNvbHZlKGZuLmZ1bmN0aW9uTmFtZSlgIG5ldmVyIHlpZWxkcyBhIGxpdGVyYWwsIGFuZCBldmVyeSBmdW5jdGlvbiBzaWxlbnRseSBmZWxsXG4gKiBiYWNrIHRvIGl0cyBjb25zdHJ1Y3QgaWQuIGBDZm5GdW5jdGlvbi5mdW5jdGlvbk5hbWVgIGlzIHRoZSByYXcgdGVtcGxhdGUgdmFsdWU6IHRoZSBsaXRlcmFsIHRoZSBzdGFja1xuICogcGFzc2VkLCBvciB1bmRlZmluZWQgd2hlbiBDbG91ZEZvcm1hdGlvbiBnZW5lcmF0ZXMgdGhlIG5hbWUuXG4gKlxuICogV2h5IHRoZSBmYWxsYmFjayBpcyB0aGUgY29uc3RydWN0IGlkIHJhdGhlciB0aGFuIHRoZSBnZW5lcmF0ZWQgbmFtZTogYSBnZW5lcmF0ZWQgbmFtZSBpcyBhIGBSZWZgIHRvIHRoZVxuICogZnVuY3Rpb24sIGFuZCBwdXR0aW5nIHRoYXQgaW4gdGhlIGZ1bmN0aW9uJ3Mgb3duIGVudmlyb25tZW50IG1ha2VzIHRoZSByZXNvdXJjZSBkZXBlbmQgb24gaXRzIG93blxuICogY3JlYXRpb24g4oCUIENsb3VkRm9ybWF0aW9uIHJlamVjdHMgdGhlIHRlbXBsYXRlIHdpdGggYSBkZXBlbmRlbmN5IGN5Y2xlLCBhdCBkZXBsb3kgdGltZS5cbiAqXG4gKiBUaGlzIG1hdHRlcnMgYmV5b25kIGNvc21ldGljcy4gVGhlIGNvbm5lY3RvciBjb21wYXJlcyBgT1RFTF9TRVJWSUNFX05BTUVgIGFnYWluc3QgdGhlIHdvcmtsb2FkJ3MgbmFtZSBpblxuICogT2RpZ29zLCB3aGljaCBpcyB0aGUgcmVhbCBBV1MgZnVuY3Rpb24gbmFtZSwgc28gYSBmdW5jdGlvbiByZXBvcnRpbmcgaXRzIGNvbnN0cnVjdCBpZCBpcyByZXBvcnRlZCBhc1xuICogZHJpZnRlZCBvbiB0aGUgc2VydmljZS1uYW1lIGNvbXBvbmVudC4gTmFtaW5nIHRoZSBmdW5jdGlvbiBpbiB5b3VyIHN0YWNrIGlzIG5vdyBlbm91Z2ggdG8gbGluZSB0aGUgdHdvXG4gKiB1cDsgYSBmdW5jdGlvbiB3aG9zZSBuYW1lIENsb3VkRm9ybWF0aW9uIGdlbmVyYXRlcyBzdGlsbCBuZWVkcyBgc2VydmljZU5hbWVgIHBhc3NlZCBleHBsaWNpdGx5LlxuICovXG5mdW5jdGlvbiBkZWZhdWx0U2VydmljZU5hbWUoZm46IGxhbWJkYS5GdW5jdGlvbik6IHN0cmluZyB7XG4gIGNvbnN0IGNmbiA9IGZuLm5vZGUuZGVmYXVsdENoaWxkIGFzIGxhbWJkYS5DZm5GdW5jdGlvbiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVzb2x2ZWQgPSBjZm4gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFN0YWNrLm9mKGZuKS5yZXNvbHZlKGNmbi5mdW5jdGlvbk5hbWUpO1xuICBpZiAodHlwZW9mIHJlc29sdmVkID09PSAnc3RyaW5nJyAmJiByZXNvbHZlZCAhPT0gJycgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChyZXNvbHZlZCkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gIH1cbiAgcmV0dXJuIGZuLm5vZGUuaWQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBzaGFyZWQgYnkgdGhlIGNvbnN0cnVjdCBhbmQgdGhlIGFzcGVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPZGlnb3NJbnN0cnVtZW50YXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBpbi1MYW1iZGEgY29sbGVjdG9yIGV4cG9ydHMgdG8uXG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbjogT2RpZ29zRGVzdGluYXRpb247XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBPZGlnb3MgbGF5ZXIgY29tZXMgZnJvbS5cbiAgICpcbiAgICogQGRlZmF1bHQgT2RpZ29zTGF5ZXJTb3VyY2UuT0RJR09TX1BVQkxJQ1xuICAgKi9cbiAgcmVhZG9ubHkgbGF5ZXJTb3VyY2U/OiBPZGlnb3NMYXllclNvdXJjZTtcblxuICAvKipcbiAgICogSGFuZGxlciBtb2RlIG9yIHdlYi1zZXJ2ZXIgKExhbWJkYSBXZWIgQWRhcHRlcikgbW9kZS5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gYXV0by1kZXRlY3Rpb24sIGFuZCB0aGF0IGlzIGRlbGliZXJhdGUgcmF0aGVyIHRoYW4gYW4gb21pc3Npb246IGRldGVjdGluZyB0aGUgd2ViIGFkYXB0ZXJcbiAgICogbWVhbnMgaW5zcGVjdGluZyB0aGUgZnVuY3Rpb24ncyBvdGhlciBsYXllcnMsIHdoaWNoIGF0IHN5bnRoIHRpbWUgYXJlIGZyZXF1ZW50bHkgdW5yZXNvbHZlZCB0b2tlbnMuXG4gICAqIEEgZGV0ZWN0b3IgdGhhdCBpcyByaWdodCBtb3N0IG9mIHRoZSB0aW1lIHdvdWxkIHNpbGVudGx5IGJyZWFrIHRoZSBmdW5jdGlvbnMgaXQgZ290IHdyb25nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLkhBTkRMRVJcbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlO1xuXG4gIC8qKlxuICAgKiBDb25uZWN0b3IgR3JhcGhRTCBkaXN0cm8gbmFtZSwgc3VjaCBhcyBqYXZhLWxhbWJkYS1vdGVsLWFnZW50IG9yIGphdmEtbGFtYmRhLW90ZWwtd3JhcHBlci5cbiAgICogQGRlZmF1bHQgLSB0aGUgYnVuZGxlZCBkZWZhdWx0IGRpc3RyaWJ1dGlvbiBmb3IgdGhlIGZ1bmN0aW9uJ3MgcnVudGltZVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzdHJvPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMZWdhY3kgbGlnaHR3ZWlnaHQgSmF2YSBoYW5kbGVyIGFkYXB0ZXIuXG4gICAqIEBkZXByZWNhdGVkIFVzZSB0aGUgY29ycmVzcG9uZGluZyBqYXZhLWxhbWJkYS1vdGVsLSotd3JhcHBlciBkaXN0cm8uXG4gICAqL1xuICByZWFkb25seSBqYXZhSGFuZGxlckRpc3Rybz86IE9kaWdvc0phdmFIYW5kbGVyRGlzdHJvO1xuXG4gIC8qKlxuICAgKiBgT1RFTF9TRVJWSUNFX05BTUVgIGZvciBldmVyeSBmdW5jdGlvbiB0aGlzIGluc3RydW1lbnRzLlxuICAgKlxuICAgKiBVc3VhbGx5IHdyb25nIHRvIHNldCB3aGVuIGluc3RydW1lbnRpbmcgbW9yZSB0aGFuIG9uZSBmdW5jdGlvbiDigJQgdGhleSB3b3VsZCBhbGwgcmVwb3J0IGFzIHRoZSBzYW1lXG4gICAqIHNlcnZpY2UuXG4gICAqXG4gICAqIExlZnQgdW5zZXQsIGEgZnVuY3Rpb24gcmVwb3J0cyBhcyBpdHMgZXhwbGljaXRseS1zZXQgcGh5c2ljYWwgbmFtZSBpZiBpdCBoYXMgb25lLCBhbmQgb3RoZXJ3aXNlIGFzXG4gICAqIGl0cyBjb25zdHJ1Y3QgaWQuIEl0IGRlbGliZXJhdGVseSBkb2VzIG5vdCBkZWZhdWx0IHRvIHRoZSBnZW5lcmF0ZWQgcGh5c2ljYWwgbmFtZTogdGhhdCB2YWx1ZSBpcyBhXG4gICAqIGBSZWZgIHRvIHRoZSBmdW5jdGlvbiBpdHNlbGYsIGFuZCBhIGZ1bmN0aW9uIHJlZmVyZW5jaW5nIGl0c2VsZiBpbiBpdHMgb3duIGVudmlyb25tZW50IGlzIGFcbiAgICogQ2xvdWRGb3JtYXRpb24gZGVwZW5kZW5jeSBjeWNsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgZnVuY3Rpb24ncyBwaHlzaWNhbCBuYW1lIGlmIGV4cGxpY2l0bHkgc2V0LCBvdGhlcndpc2UgaXRzIGNvbnN0cnVjdCBpZFxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJhaXNlIGluLWZ1bmN0aW9uIE9wZW5UZWxlbWV0cnkgdmVyYm9zaXR5IChgT1RFTF9MT0dfTEVWRUw9ZGVidWdgKS5cbiAgICpcbiAgICogVGhlIFNESyBhbmQgY29sbGVjdG9yIGNhbiB0aGVuIGVtaXQgYWRkaXRpb25hbCBPVExQLWV4cG9ydCBkaWFnbm9zdGljcyBpbnRvIHRoZSBmdW5jdGlvbidzIENsb3VkV2F0Y2hcbiAgICogbG9nIGdyb3VwLiBVc2VmdWwgd2hpbGUgd2lyaW5nIHVwIGEgZGVzdGluYXRpb24sIGV4cGVuc2l2ZSB0byBsZWF2ZSBvbi5cbiAgICpcbiAgICogSGFzIG5vIGVmZmVjdCBpbiB3ZWItc2VydmVyIG1vZGUsIG1hdGNoaW5nIHRoZSBjb25uZWN0b3IsIHdoaWNoIG5ldmVyIHNldHMgYSBsb2cgbGV2ZWwgdGhlcmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkZWJ1Zz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEF0dGFjaCB0aGlzIGxheWVyIGluc3RlYWQgb2YgcmVzb2x2aW5nIG9uZS4gT3ZlcnJpZGVzIGBsYXllclNvdXJjZWAgZW50aXJlbHkuXG4gICAqXG4gICAqIFRoZSBlc2NhcGUgaGF0Y2ggZm9yIGEgbGF5ZXIgbWlycm9yZWQgaW50byBhIHByaXZhdGUgcmVnaXN0cnkgb3IgYW4gaW50ZXJuYWwgYWNjb3VudC4gVGhlIGxheWVyIG11c3RcbiAgICogaGF2ZSB0aGUgc2FtZSBjb250ZW50cyBhcyB0aGUgT2RpZ29zIG9uZSDigJQgdGhlIGVudmlyb25tZW50IHNldCBoZXJlIGFzc3VtZXMgaXRzIGV4YWN0IHNjcmlwdCBsYXlvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcmVzb2x2ZWQgZnJvbSBsYXllclNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgbGF5ZXJWZXJzaW9uPzogbGFtYmRhLklMYXllclZlcnNpb247XG5cbiAgLyoqXG4gICAqIEFyY2hpdGVjdHVyZS1tYXRjaGVkIGNvbGxlY3RvciBsYXllciB3aGVuIHN1cHBseWluZyBhIGN1c3RvbSBBRE9UIFNESyBsYXllci5cbiAgICogVXBzdHJlYW0gU0RLIGxheWVycyBhbHJlYWR5IGluY2x1ZGUgdGhlaXIgY29sbGVjdG9yIGFuZCBkbyBub3QgdXNlIHRoaXMgb3B0aW9uLlxuICAgKiBAZGVmYXVsdCAtIHJlc29sdmVkIGZyb20gbGF5ZXJTb3VyY2UgZm9yIEFET1RcbiAgICovXG4gIHJlYWRvbmx5IGNvbGxlY3RvckxheWVyVmVyc2lvbj86IGxhbWJkYS5JTGF5ZXJWZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdGhlIGZ1bmN0aW9uIGFscmVhZHkgbmVlZHMgaW4gaXRzIGxhbmd1YWdlIGxvYWRlciB2YXJpYWJsZSAoYE5PREVfT1BUSU9OU2AsXG4gICAqIGBKQVZBX1RPT0xfT1BUSU9OU2Agb3IgYFBZVEhPTlBBVEhgKSwgd2hpY2ggdGhlIE9kaWdvcyBsb2FkZXIgaXMgam9pbmVkIHRvIHJhdGhlciB0aGFuIHJlcGxhY2luZy5cbiAgICpcbiAgICogT25seSB1c2VkIGluIHdlYi1zZXJ2ZXIgbW9kZS4gVGhlIGxhdW5jaGVyIHByZXNlcnZlcyB0aGUgZnVuY3Rpb24ncyBleGlzdGluZyBsb2FkZXIgYXQgc3RhcnR1cDtcbiAgICogdGhpcyBvcHRpb25hbCB2YWx1ZSBvdmVycmlkZXMgdGhlIGN1c3RvbWVyJ3Mgc2F2ZWQgbG9hZGVyIHNldHRpbmcgYmVmb3JlIGluc3RydW1lbnRhdGlvbiBpcyBhZGRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBwcmVzZXJ2ZSB0aGUgZnVuY3Rpb24ncyBleGlzdGluZyBsb2FkZXIgdmFyaWFibGVcbiAgICovXG4gIHJlYWRvbmx5IGV4aXN0aW5nTG9hZGVyVmFsdWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNraXAgZnVuY3Rpb25zIHdob3NlIHJ1bnRpbWUgaGFzIG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGluc3RlYWQgb2YgdGhyb3dpbmcuXG4gICAqXG4gICAqIGBkb3RuZXQqYCBhbmQgYHByb3ZpZGVkLipgIChHbywgY3VzdG9tIHJ1bnRpbWVzKSBoYXZlIG5vIGxhbmd1YWdlIGxheWVyIHVwc3RyZWFtLiBFeHBsaWNpdGx5XG4gICAqIGluc3RydW1lbnRpbmcgb25lIGlzIGEgbWlzdGFrZSB3b3J0aCBmYWlsaW5nIG9uOyBzd2VlcGluZyBhIHdob2xlIHN0YWNrIHdpdGggdGhlIGFzcGVjdCBhbmQgaGl0dGluZ1xuICAgKiBvbmUgaXMgbm90LCB3aGljaCBpcyB3aHkgdGhlIGFzcGVjdCBkZWZhdWx0cyB0aGlzIHRvIGB0cnVlYCBhbmQgdGhlIGNvbnN0cnVjdCB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcFVuc3VwcG9ydGVkUnVudGltZXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciB7QGxpbmsgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9ufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb25Qcm9wcyBleHRlbmRzIE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogRnVuY3Rpb25zIHRvIGluc3RydW1lbnQgb24gY29uc3RydWN0aW9uLiBNb3JlIGNhbiBiZSBhZGRlZCB3aXRoIGBpbnN0cnVtZW50KClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9ucz86IGxhbWJkYS5GdW5jdGlvbltdO1xufVxuXG4vKipcbiAqIEluc3RydW1lbnRzIEFXUyBMYW1iZGEgZnVuY3Rpb25zIHdpdGggdGhlIE9kaWdvcyBPcGVuVGVsZW1ldHJ5IGxheWVyLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBvZGlnb3MgPSBuZXcgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uKHRoaXMsICdPZGlnb3MnLCB7XG4gKiAgIGRlc3RpbmF0aW9uOiB7IGVuZHBvaW50OiAnb3RscC5leGFtcGxlLmNvbTo0MzE3JyB9LFxuICogICBmdW5jdGlvbnM6IFthcGlGbiwgd29ya2VyRm5dLFxuICogfSk7XG4gKiBvZGlnb3MuaW5zdHJ1bWVudChhbm90aGVyRm4pO1xuICogYGBgXG4gKlxuICogV2hhdCBpdCBkb2VzIHRvIGVhY2ggZnVuY3Rpb246IGF0dGFjaGVzIHRoZSBsYXllciBmb3IgdGhlIGZ1bmN0aW9uJ3MgbGFuZ3VhZ2UgYW5kIGFyY2hpdGVjdHVyZSwgc2V0c1xuICogYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCBhbmQgY29tcGFjdCBgT0RJR09TX0xBTUJEQV9DT05GSUdgLiBUaGUgbGF5ZXIgYnVpbGRzIHRoZSBTREsgZW52aXJvbm1lbnQgYW5kXG4gKiBjb2xsZWN0b3IgcGlwZWxpbmVzIGF0IHN0YXJ0dXA7IG93bmVyc2hpcCBhbmQgZXhhY3QgbGF5ZXIgYXR0cmlidXRpb24gYXJlIHJlY29yZGVkIGluIHJlc291cmNlIHRhZ3MuXG4gKlxuICogVGhlIGZ1bmN0aW9uJ3MgU0RLIGV4cG9ydHMgdG8gdGhlIGNvbGxlY3RvciBvbiBsb2NhbGhvc3QsIG5vdCB0byB5b3VyIGRlc3RpbmF0aW9uLiBUaGUgY29sbGVjdG9yXG4gKiBmb3J3YXJkcyBhZnRlciB0aGUgaGFuZGxlciBoYXMgYWxyZWFkeSByZXR1cm5lZCwgc28gYSBzbG93IGRlc3RpbmF0aW9uIGNvc3RzIGJpbGxlZCBkdXJhdGlvbiByYXRoZXJcbiAqIHRoYW4gY2FsbGVyIGxhdGVuY3kuXG4gKlxuICogIyMgRG8gbm90IGFsc28gaW5zdHJ1bWVudCB0aGVzZSBmdW5jdGlvbnMgd2l0aCB0aGUgY29ubmVjdG9yXG4gKlxuICogVGhlIE9kaWdvcyBBV1MgY29ubmVjdG9yIGluc3RydW1lbnRzIGxpdmUgZnVuY3Rpb25zIGJ5IG11dGF0aW5nIHRoZW0sIGFuZCByZWNvbmNpbGVzIHRoZW0gYmFjayB0byBpdHNcbiAqIG93biBkZXNpcmVkIHN0YXRlIG9uIGV2ZXJ5IHBhc3MuIEEgZnVuY3Rpb24gaW5zdHJ1bWVudGVkIGhlcmUgYW5kIGFsc28gZW5hYmxlZCBhcyBhIGNvbm5lY3RvciBzb3VyY2VcbiAqIGVuZHMgdXAgb3duZWQgYnkgYm90aDogZWFjaCBgY2RrIGRlcGxveWAgcmVhc3NlcnRzIHRoZSBDREsncyBlbnZpcm9ubWVudCwgZWFjaCByZWNvbmNpbGUgcmVhc3NlcnRzIHRoZVxuICogY29ubmVjdG9yJ3MsIGFuZCBldmVyeSByb3VuZCB0cmlwIHB1Ymxpc2hlcyBhIG5ldyBmdW5jdGlvbiB2ZXJzaW9uLlxuICpcbiAqIENob29zZSBvbmUgcGVyIGZ1bmN0aW9uLiBUaGlzIGNvbnN0cnVjdCB3cml0ZXMgYG9kaWdvczppYWNgIHJlc291cmNlIHRhZ3MgYW5kIG5ldmVyIHRoZSBjb25uZWN0b3IncyBgb2RpZ29zOm1hbmFnZWRgXG4gKiBvd25lcnNoaXAgdGFnLCBzbyBhbiBJYUMtaW5zdHJ1bWVudGVkIGZ1bmN0aW9uIHJlcG9ydHMgYXMgaW5zdHJ1bWVudGVkIGJ1dCBpcyBub3Qgb25lIHRoZSBjb25uZWN0b3JcbiAqIHdpbGwgcm9sbCBiYWNrIOKAlCB0aG91Z2ggaXQgd2lsbCBoYXBwaWx5IHRha2UgaXQgb3ZlciBpZiB5b3UgZW5hYmxlIGl0IGFzIGEgc291cmNlLlxuICovXG5leHBvcnQgY2xhc3MgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBPZGlnb3NJbnN0cnVtZW50YXRpb25PcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVycyA9IG5ldyBNYXA8U3RhY2ssIE9kaWdvc0xheWVyUmVzb2x2ZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdHJ1bWVudGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IHByb3BzO1xuXG4gICAgLy8gUmVuZGVyZWQgb25jZS4gSXQgZGVwZW5kcyBvbmx5IG9uIHRoZSBkZXN0aW5hdGlvbiwgYW5kIHJlbmRlcmluZyBpdCBwZXIgZnVuY3Rpb24gd291bGQgbWFrZSBhblxuICAgIC8vIGFjY2lkZW50YWwgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBmdW5jdGlvbnMgcG9zc2libGUuXG4gICAgcmVuZGVyQ29sbGVjdG9yQ29uZmlnKHByb3BzLmRlc3RpbmF0aW9uKTtcblxuICAgIC8vIEEgd2FybmluZyByYXRoZXIgdGhhbiBhbiBlcnJvciwgYmVjYXVzZSBhIGNvbGxlY3RvciBDQU4gYmUgcmVhY2hlZCBvdmVyIGdSUEMgb24gYSBub24tc3RhbmRhcmQgcG9ydCDigJRcbiAgICAvLyBidXQgdGhlIG92ZXJ3aGVsbWluZ2x5IGxpa2VsaWVyIHJlYWRpbmcgb2YgYGVuZHBvaW50OiBcImhvc3Q6NDMxOFwiYCBpcyBhbiBPVExQL0hUVFAgZW5kcG9pbnQgcGFzc2VkIHRvXG4gICAgLy8gdGhlIGdSUEMgZXhwb3J0ZXIsIHdoaWNoIGJ1aWxkcywgc3RhcnRzLCBhbmQgdGhlbiBuZXZlciBkZWxpdmVycyBhIGJhdGNoLiBTaWxlbnQgZm9yIHRoZSBjYWxsZXIgd2hvXG4gICAgLy8gbWVhbnQgaXQ7IGxvdWQgZm9yIHRoZSBvbmUgd2hvIGRpZCBub3QuXG4gICAgaWYgKHByb3BzLmRlc3RpbmF0aW9uLmVuZHBvaW50Py5lbmRzV2l0aCgnOjQzMTgnKSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQG9kaWdvcy9hd3MtY2RrOnByb2JhYmxlSHR0cEVuZHBvaW50JyxcbiAgICAgICAgYE9kaWdvczogZGVzdGluYXRpb24gZW5kcG9pbnQgXCIke3Byb3BzLmRlc3RpbmF0aW9uLmVuZHBvaW50fVwiIGlzIG9uIDQzMTgsIHRoZSBPVExQL0hUVFAgcG9ydCwgYnV0IGAgK1xuICAgICAgICAgICdgZW5kcG9pbnRgIGNvbmZpZ3VyZXMgdGhlIGdSUEMgZXhwb3J0ZXIgKGNvbnZlbnRpb25hbGx5IDQzMTcpLiBJZiB0aGF0IGlzIGFuIE9UTFAvSFRUUCBjb2xsZWN0b3IsICcgK1xuICAgICAgICAgICdwYXNzIGl0IGFzIGBodHRwRW5kcG9pbnQ6IFwiaHR0cDovL2hvc3Q6NDMxOFwiYCBpbnN0ZWFkIOKAlCB0aGUgZ1JQQyBleHBvcnRlciB3aWxsIGV4cG9ydCBub3RoaW5nIHRvIGl0LicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZGVzdGluYXRpb24uaHR0cEVuZHBvaW50Py5lbmRzV2l0aCgnOjQzMTcnKSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQG9kaWdvcy9hd3MtY2RrOnByb2JhYmxlR3JwY0VuZHBvaW50JyxcbiAgICAgICAgYE9kaWdvczogZGVzdGluYXRpb24gaHR0cEVuZHBvaW50IFwiJHtwcm9wcy5kZXN0aW5hdGlvbi5odHRwRW5kcG9pbnR9XCIgaXMgb24gNDMxNywgdGhlIE9UTFAvZ1JQQyBwb3J0LCBgICtcbiAgICAgICAgICAnYnV0IGBodHRwRW5kcG9pbnRgIGNvbmZpZ3VyZXMgdGhlIEhUVFAgZXhwb3J0ZXIgKGNvbnZlbnRpb25hbGx5IDQzMTgpLiBJZiB0aGF0IGlzIGEgZ1JQQyBjb2xsZWN0b3IsICcgK1xuICAgICAgICAgICdwYXNzIGl0IGFzIGBlbmRwb2ludDogXCJob3N0OjQzMTdcImAgaW5zdGVhZC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZuIG9mIHByb3BzLmZ1bmN0aW9ucyA/PyBbXSkge1xuICAgICAgdGhpcy5pbnN0cnVtZW50KGZuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5zdHJ1bWVudHMgb25lIGZ1bmN0aW9uLiBJZGVtcG90ZW50IOKAlCBpbnN0cnVtZW50aW5nIHRoZSBzYW1lIGZ1bmN0aW9uIHR3aWNlIGlzIGEgbm8tb3AgcmF0aGVyIHRoYW4gYVxuICAgKiBkb3VibGVkIGxvYWRlciB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBpbnN0cnVtZW50KGZuOiBsYW1iZGEuRnVuY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBmbi5ub2RlLnBhdGg7XG4gICAgaWYgKHRoaXMuaW5zdHJ1bWVudGVkLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcnVudGltZU5hbWUgPSBmbi5ydW50aW1lLm5hbWU7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5ndWFnZUZyb21SdW50aW1lKHJ1bnRpbWVOYW1lKTtcbiAgICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgYE9kaWdvczogcnVudGltZSBcIiR7cnVudGltZU5hbWV9XCIgaGFzIG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGAgK1xuICAgICAgICAnKHVwc3RyZWFtIHB1Ymxpc2hlcyBsYXllcnMgZm9yIHB5dGhvbiwgbm9kZWpzLCBqYXZhIGFuZCBydWJ5IG9ubHkpLCBzbyB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBpbnN0cnVtZW50ZWQuJztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2tpcFVuc3VwcG9ydGVkUnVudGltZXMpIHtcbiAgICAgICAgQW5ub3RhdGlvbnMub2YoZm4pLmFkZFdhcm5pbmdWMignQG9kaWdvcy9hd3MtY2RrOnVuc3VwcG9ydGVkUnVudGltZScsIGAke21lc3NhZ2V9IFNraXBwaW5nLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bWVzc2FnZX0gU2V0IHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzOiB0cnVlIHRvIHNraXAgaXQgaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWNpcGUgPSBkaXN0cmlidXRpb25SZWNpcGUobGFuZ3VhZ2UsIHRoaXMub3B0aW9ucy5kaXN0cm8sIHJ1bnRpbWVOYW1lKTtcbiAgICBkaXN0cmlidXRpb25XcmFwcGVyKGxhbmd1YWdlLCB0aGlzLm9wdGlvbnMuZGlzdHJvLCB0aGlzLm9wdGlvbnMuamF2YUhhbmRsZXJEaXN0cm8sIHRoaXMub3B0aW9ucy5tb2RlID09PSBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLldFQl9TRVJWRVIpO1xuICAgIGlmIChyZWNpcGUuYXBwbGljYXRpb25TaWduYWxzICYmICghcmVzb2x2ZWRTaWduYWxzKHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbikudHJhY2VzIHx8ICFyZXNvbHZlZFNpZ25hbHModGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uKS5tZXRyaWNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBRE9UICsgQXBwbGljYXRpb24gU2lnbmFscyByZXF1aXJlcyB0cmFjZXMgYW5kIG1ldHJpY3MgdG8gYmUgZW5hYmxlZCBmb3IgdGhlIGRlc3RpbmF0aW9uLicpO1xuICAgIH1cbiAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKGZuKTtcbiAgICBsZXQgcmVzb2x2ZXIgPSB0aGlzLnJlc29sdmVycy5nZXQoc3RhY2spO1xuICAgIGlmICghcmVzb2x2ZXIpIHtcbiAgICAgIGNvbnN0IHNjb3BlID0gdGhpcy5ub2RlLnNjb3Blcy5pbmNsdWRlcyhzdGFjaykgPyB0aGlzIDogbmV3IENvbnN0cnVjdChzdGFjaywgYE9kaWdvc0xheWVycyR7dGhpcy5ub2RlLmFkZHJ9YCk7XG4gICAgICByZXNvbHZlciA9IG5ldyBPZGlnb3NMYXllclJlc29sdmVyKHNjb3BlLCB0aGlzLm9wdGlvbnMubGF5ZXJTb3VyY2UgPz8gT2RpZ29zTGF5ZXJTb3VyY2UuT0RJR09TX1BVQkxJQyk7XG4gICAgICB0aGlzLnJlc29sdmVycy5zZXQoc3RhY2ssIHJlc29sdmVyKTtcbiAgICB9XG4gICAgY29uc3QgYXJjaGl0ZWN0dXJlID0gZm4uYXJjaGl0ZWN0dXJlLm5hbWU7XG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLm9wdGlvbnMubGF5ZXJWZXJzaW9uID8/IHJlc29sdmVyLnJlc29sdmUocmVjaXBlLmFydGlmYWN0ID8/IGxhbmd1YWdlLCBhcmNoaXRlY3R1cmUpO1xuICAgIGNvbnN0IGNvbGxlY3RvckxheWVyID0gcmVjaXBlLmFydGlmYWN0ID8gKHRoaXMub3B0aW9ucy5jb2xsZWN0b3JMYXllclZlcnNpb24gPz8gcmVzb2x2ZXIucmVzb2x2ZSgnYWRvdC1jb2xsZWN0b3InLCBhcmNoaXRlY3R1cmUpKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBsYXllcnMgPSBjb2xsZWN0b3JMYXllciA/IFtsYXllciwgY29sbGVjdG9yTGF5ZXJdIDogW2xheWVyXTtcbiAgICBmb3IgKGNvbnN0IGF0dGFjaGVkIG9mIGxheWVycykge1xuICAgICAgY29uc3QgYXJuID0gYXR0YWNoZWQubGF5ZXJWZXJzaW9uQXJuO1xuICAgICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoYXJuKSAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKHN0YWNrLnJlZ2lvbikgJiYgYXJuLnNwbGl0KCc6JylbM10gIT09IHN0YWNrLnJlZ2lvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9kaWdvczogbGF5ZXIgJHthcm59IGlzIG5vdCBpbiB0aGUgZnVuY3Rpb24ncyByZWdpb24gJHtzdGFjay5yZWdpb259LiBTdXBwbHkgYSBsYXllciBwdWJsaXNoZWQgaW4gdGhlIGZ1bmN0aW9uJ3MgcmVnaW9uLmApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IHRoaXMuZW52aXJvbm1lbnRGb3IoZm4sIGxhbmd1YWdlLCBsYXllci5sYXllclZlcnNpb25Bcm4sIGNvbGxlY3RvckxheWVyPy5sYXllclZlcnNpb25Bcm4pO1xuICAgIGlmIChyZWNpcGUuYXBwbGljYXRpb25TaWduYWxzKSB7XG4gICAgICBmbi5yb2xlPy5hZGRNYW5hZ2VkUG9saWN5KGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnQ2xvdWRXYXRjaExhbWJkYUFwcGxpY2F0aW9uU2lnbmFsc0V4ZWN1dGlvblJvbGVQb2xpY3knKSk7XG4gICAgICBBbm5vdGF0aW9ucy5vZihmbikuYWRkV2FybmluZ1YyKCdAb2RpZ29zL2F3cy1jZGs6YXBwbGljYXRpb25TaWduYWxzJyxcbiAgICAgICAgJ0VuYWJsZSBDbG91ZFdhdGNoIEFwcGxpY2F0aW9uIFNpZ25hbHMgc2VydmljZSBkaXNjb3Zlcnkgb25jZSBpbiB0aGlzIEFXUyBhY2NvdW50IGFuZCByZWdpb24uIElmIHRoZSBMYW1iZGEgcm9sZSBpcyBpbXBvcnRlZCBhcyBpbW11dGFibGUsIGF0dGFjaCBDbG91ZFdhdGNoTGFtYmRhQXBwbGljYXRpb25TaWduYWxzRXhlY3V0aW9uUm9sZVBvbGljeSBzZXBhcmF0ZWx5LiBBcHBsaWNhdGlvbiBTaWduYWxzIGFsc28gc2VuZHMgQVdTIHNlcnZpY2UgdGVsZW1ldHJ5IHRocm91Z2ggdGhlIExhbWJkYSBlbWJlZGRlZCBhZ2VudC4nKTtcbiAgICB9XG4gICAgY29uc3QgcmVzb3VyY2UgPSBmbi5ub2RlLmRlZmF1bHRDaGlsZCBhcyBsYW1iZGEuQ2ZuRnVuY3Rpb247XG4gICAgcmVzb3VyY2UuYWRkUHJvcGVydHlEZWxldGlvbk92ZXJyaWRlKCdFbnZpcm9ubWVudC5WYXJpYWJsZXMuT0RJR09TX01BTkFHRUQnKTtcbiAgICByZXNvdXJjZS5hZGRQcm9wZXJ0eURlbGV0aW9uT3ZlcnJpZGUoJ0Vudmlyb25tZW50LlZhcmlhYmxlcy5PRElHT1NfSUFDJyk7XG4gICAgZm4uYWRkTGF5ZXJzKC4uLmxheWVycyk7XG5cbiAgICAvLyBUaGUgQVJOLCBub3QgdGhlIGNvbnN0cnVjdDogdGhlIG1hcmtlciBoYXMgdG8gbmFtZSB0aGUgZXhhY3QgbGF5ZXIgdmVyc2lvbiB0aGUgZnVuY3Rpb24gY2FycmllcywgYW5kXG4gICAgLy8gaW4gSU5fQUNDT1VOVCBtb2RlIHRoYXQgaXMgYSBuZXN0ZWQtc3RhY2sgb3V0cHV0IHJlZmVyZW5jZSByZXNvbHZlZCBhdCBkZXBsb3kgdGltZS5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52aXJvbm1lbnQpKSB7XG4gICAgICBmbi5hZGRFbnZpcm9ubWVudChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuaW5zdHJ1bWVudGVkLmFkZChrZXkpO1xuICB9XG5cbiAgLyoqIEluc3RydW1lbnRzIGV2ZXJ5IGZ1bmN0aW9uIGluIHRoZSBsaXN0LiAqL1xuICBwdWJsaWMgaW5zdHJ1bWVudEFsbChmdW5jdGlvbnM6IGxhbWJkYS5GdW5jdGlvbltdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBmbiBvZiBmdW5jdGlvbnMpIHtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudChmbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBlbnZpcm9ubWVudCBhcHBsaWVkIHRvIG9uZSBmdW5jdGlvbi5cbiAgICpcbiAgICogTWlycm9ycyBgYXBwbHlIYW5kbGVyRW52YCAvIGBhcHBseVdlYlNlcnZlckVudmAgaW4gdGhlIGNvbm5lY3RvciwgaW5jbHVkaW5nIHdoYXQgaXMgZGVsaWJlcmF0ZWx5IE5PVFxuICAgKiBzZXQ6IGBPVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlRgIHN0YXlzIHVuc2V0IHNvIHRoZSBTREsga2VlcHMgZXhwb3J0aW5nIHRvIHRoZSBpbi1MYW1iZGEgY29sbGVjdG9yXG4gICAqIG9uIGxvY2FsaG9zdCByYXRoZXIgdGhhbiBibG9ja2luZyB0aGUgaW52b2NhdGlvbiBvbiB0aGUgcmVtb3RlIGRlc3RpbmF0aW9uLCBhbmQgZXZlcnkgc2lnbmFsIGV4cG9ydGVyIGlzIHNlbGVjdGVkIGV4cGxpY2l0bHkuXG4gICAqL1xuICBwcml2YXRlIGVudmlyb25tZW50Rm9yKGZuOiBsYW1iZGEuRnVuY3Rpb24sIGxhbmd1YWdlOiBzdHJpbmcsIGxheWVyQXJuOiBzdHJpbmcsIGNvbGxlY3RvckxheWVyQXJuPzogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgeyBkZXN0aW5hdGlvbiwgbW9kZSwgZGVidWcsIHNlcnZpY2VOYW1lLCBqYXZhSGFuZGxlckRpc3RybywgZGlzdHJvLCBleGlzdGluZ0xvYWRlclZhbHVlIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3Qgd2ViU2VydmVyID0gbW9kZSA9PT0gT2RpZ29zSW5zdHJ1bWVudGF0aW9uTW9kZS5XRUJfU0VSVkVSO1xuXG4gICAgY29uc3QgcmVjaXBlID0gZGlzdHJpYnV0aW9uUmVjaXBlKGxhbmd1YWdlLCBkaXN0cm8sIGZuLnJ1bnRpbWUubmFtZSk7XG4gICAgY29uc3Qgc2lnbmFscyA9IHJlc29sdmVkU2lnbmFscyhkZXN0aW5hdGlvbik7XG4gICAgY29uc3QgcmVzb3VyY2UgPSBmbi5ub2RlLmRlZmF1bHRDaGlsZCBhcyBsYW1iZGEuQ2ZuRnVuY3Rpb247XG4gICAgY29uc3QgY3VycmVudCA9IFN0YWNrLm9mKGZuKS5yZXNvbHZlKHJlc291cmNlLmVudmlyb25tZW50KSBhcyBsYW1iZGEuQ2ZuRnVuY3Rpb24uRW52aXJvbm1lbnRQcm9wZXJ0eSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB3cmFwcGVyVmFsdWUgPSAoY3VycmVudD8udmFyaWFibGVzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5BV1NfTEFNQkRBX0VYRUNfV1JBUFBFUjtcbiAgICBjb25zdCBvcmlnaW5hbFdyYXBwZXIgPSB3cmFwcGVyVmFsdWUgPT09IHVuZGVmaW5lZCA/ICcnIDogVG9rZW4uYXNTdHJpbmcod3JhcHBlclZhbHVlKTtcbiAgICBpZiAod2ViU2VydmVyICYmIG9yaWdpbmFsV3JhcHBlciA9PT0gJy9vcHQvb2RpZ29zLXdlYnNlcnZlcicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT2RpZ29zOiB0aGlzIGZ1bmN0aW9uIGFscmVhZHkgdXNlcyB0aGUgT2RpZ29zIHdlYi1zZXJ2ZXIgd3JhcHBlci4gUmV1c2UgaXRzIG9yaWdpbmFsIGluc3RydW1lbnRhdGlvbiBjb25zdHJ1Y3QuJyk7XG4gICAgfVxuICAgIGNvbnN0IGV4ZWNXcmFwcGVyID0gd2ViU2VydmVyID8gJy9vcHQvb2RpZ29zLXdlYnNlcnZlcicgOiBkaXN0cmlidXRpb25XcmFwcGVyKGxhbmd1YWdlLCBkaXN0cm8sIGphdmFIYW5kbGVyRGlzdHJvLCBmYWxzZSk7XG4gICAgY29uc3QgZnVuY3Rpb25Mb2dzID0gc2lnbmFscy5sb2dzICYmICF3ZWJTZXJ2ZXIgJiYgKGxhbmd1YWdlID09PSAncnVieScgfHwgKGxhbmd1YWdlID09PSAnamF2YScgJiZcbiAgICAgIFsnL29wdC9vdGVsLWhhbmRsZXInLCAnL29wdC9vdGVsLXByb3h5LWhhbmRsZXInLCAnL29wdC9vdGVsLXNxcy1oYW5kbGVyJywgJy9vcHQvb3RlbC1zdHJlYW0taGFuZGxlciddLmluY2x1ZGVzKGV4ZWNXcmFwcGVyKSkpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHZlcnNpb246IDIsXG4gICAgICBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSA/PyBkZWZhdWx0U2VydmljZU5hbWUoZm4pLFxuICAgICAgc2lnbmFsczogWyd0cmFjZXMnLCAnbWV0cmljcycsICdsb2dzJ10uZmlsdGVyKHNpZ25hbCA9PiBzaWduYWxzW3NpZ25hbCBhcyBrZXlvZiB0eXBlb2Ygc2lnbmFsc10pLFxuICAgICAgZW5kcG9pbnQ6IGRlc3RpbmF0aW9uLmVuZHBvaW50ID8/IGRlc3RpbmF0aW9uLmh0dHBFbmRwb2ludCxcbiAgICAgIC4uLihkZXN0aW5hdGlvbi5odHRwRW5kcG9pbnQgPyB7IGh0dHA6IHRydWUgfSA6IHt9KSxcbiAgICAgIC4uLihkZXN0aW5hdGlvbi5lbmRwb2ludCAmJiBkZXN0aW5hdGlvbi5pbnNlY3VyZSA/IHsgaW5zZWN1cmU6IHRydWUgfSA6IHt9KSxcbiAgICAgIC4uLihkZXN0aW5hdGlvbi5oZWFkZXJzICYmIE9iamVjdC5rZXlzKGRlc3RpbmF0aW9uLmhlYWRlcnMpLmxlbmd0aCA/IHsgaGVhZGVyczogZGVzdGluYXRpb24uaGVhZGVycyB9IDoge30pLFxuICAgICAgLi4uKHJlY2lwZS5hcHBsaWNhdGlvblNpZ25hbHMgPyB7IGFwcGxpY2F0aW9uU2lnbmFsczogdHJ1ZSB9IDoge30pLFxuICAgICAgLi4uKGZ1bmN0aW9uTG9ncyA/IHsgZnVuY3Rpb25Mb2dzOiB0cnVlIH0gOiB7fSksXG4gICAgICAuLi4oZGVidWcgJiYgIXdlYlNlcnZlciA/IHsgZGVidWc6IHRydWUgfSA6IHt9KSxcbiAgICAgIC4uLih3ZWJTZXJ2ZXIgPyB7IHdlYldyYXBwZXI6IG9yaWdpbmFsV3JhcHBlciB9IDoge30pLFxuICAgIH07XG4gICAgY29uc3QgZW52OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgW0VOVl9FWEVDX1dSQVBQRVJdOiBleGVjV3JhcHBlcixcbiAgICAgIFtFTlZfTEFNQkRBX0NPTkZJR106IFN0YWNrLm9mKGZuKS50b0pzb25TdHJpbmcoY29uZmlnKSxcbiAgICB9O1xuICAgIFRhZ3Mub2YoZm4pLmFkZCgnb2RpZ29zOmlhYycsICd2MScpO1xuICAgIFRhZ3Mub2YoZm4pLmFkZCgnb2RpZ29zOnNkay1sYXllcicsIGxheWVyQXJuKTtcbiAgICBpZiAoY29sbGVjdG9yTGF5ZXJBcm4pIFRhZ3Mub2YoZm4pLmFkZCgnb2RpZ29zOmNvbGxlY3Rvci1sYXllcicsIGNvbGxlY3RvckxheWVyQXJuKTtcbiAgICAvLyBFeHBsaWNpdCBjdXN0b21lciBsb2FkZXIgb3B0aW9ucyByZW1haW4gb3JkaW5hcnkgY3VzdG9tZXIgZW52aXJvbm1lbnQgdmFsdWVzLlxuICAgIGlmICh3ZWJTZXJ2ZXIgJiYgZXhpc3RpbmdMb2FkZXJWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBsb2FkZXJLZXkgPSB7IGphdmE6ICdKQVZBX1RPT0xfT1BUSU9OUycsIG5vZGVqczogJ05PREVfT1BUSU9OUycsIHB5dGhvbjogJ1BZVEhPTlBBVEgnIH1bbGFuZ3VhZ2VdO1xuICAgICAgaWYgKGxvYWRlcktleSkgZW52W2xvYWRlcktleV0gPSBleGlzdGluZ0xvYWRlclZhbHVlO1xuICAgIH1cbiAgICBpZiAobGFuZ3VhZ2UgPT09ICdydWJ5JyAmJiBzaWduYWxzLm1ldHJpY3MpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKGZuKS5hZGRXYXJuaW5nVjIoJ0BvZGlnb3MvYXdzLWNkazpydWJ5U2lnbmFsc1Vuc3VwcG9ydGVkJyxcbiAgICAgICAgJ1RoZSBidW5kbGVkIFJ1YnkgTGFtYmRhIFNESyBjYW5ub3QgZ2VuZXJhdGUgT1RMUCBtZXRyaWNzLiBGdW5jdGlvbiBzdGRvdXQvc3RkZXJyIGxvZ3MgYXJlIGNvbGxlY3RlZCBieSB0aGUgTGFtYmRhIGNvbGxlY3RvciB3aGVuIGxvZ3MgYXJlIHNlbGVjdGVkLicpO1xuICAgIH1cbiAgICBpZiAoZGVzdGluYXRpb24ucHJvZmlsZXMpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKGZuKS5hZGRXYXJuaW5nVjIoJ0BvZGlnb3MvYXdzLWNkazpwcm9maWxlc1Vuc3VwcG9ydGVkJyxcbiAgICAgICAgJ1RoZSBidW5kbGVkIExhbWJkYSBsYW5ndWFnZSBhZ2VudHMgZG8gbm90IGdlbmVyYXRlIE9UTFAgcHJvZmlsZXMuIE90aGVyIHNlbGVjdGVkIHNpZ25hbHMgcmVtYWluIGVuYWJsZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiBlbnY7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wcyBmb3Ige0BsaW5rIE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0UHJvcHMgZXh0ZW5kcyBPZGlnb3NJbnN0cnVtZW50YXRpb25PcHRpb25zIHt9XG5cbi8qKlxuICogQXBwbGllcyBPZGlnb3MgaW5zdHJ1bWVudGF0aW9uIHRvIGV2ZXJ5IGBsYW1iZGEuRnVuY3Rpb25gIGluIGEgc2NvcGUuXG4gKlxuICogYGBgdHNcbiAqIEFzcGVjdHMub2Yoc3RhY2spLmFkZChuZXcgT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0KHN0YWNrLCB7XG4gKiAgIGRlc3RpbmF0aW9uOiB7IGVuZHBvaW50OiAnb3RscC5leGFtcGxlLmNvbTo0MzE3JyB9LFxuICogfSkpO1xuICogYGBgXG4gKlxuICogYHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzYCBkZWZhdWx0cyB0byBgdHJ1ZWAgaGVyZSwgdW5saWtlIHRoZSBjb25zdHJ1Y3Q6IGFuIGFzcGVjdCB2aXNpdHMgZXZlcnkgZnVuY3Rpb25cbiAqIGluIHRoZSBzY29wZSwgaW5jbHVkaW5nIG9uZXMgd2hvc2UgcnVudGltZSBoYXMgbm8gT3BlblRlbGVtZXRyeSBsYXllciwgYW5kIGZhaWxpbmcgdGhlIHdob2xlIHN5bnRoXG4gKiBiZWNhdXNlIGEgc3RhY2sgaGFwcGVucyB0byBjb250YWluIG9uZSBHbyBmdW5jdGlvbiBpcyBub3QgdXNlZnVsLiBFYWNoIHNraXAgaXMgcmVwb3J0ZWQgYXMgYSBzeW50aFxuICogd2FybmluZywgc28gaXQgaXMgdmlzaWJsZSByYXRoZXIgdGhhbiBzaWxlbnQuXG4gKlxuICogVGhlIGFzcGVjdCBpbnN0cnVtZW50cyB3aGF0IGV4aXN0cyBpbiB0aGUgdHJlZSB3aGVuIGl0IHJ1bnMuIEEgZnVuY3Rpb24gYWRkZWQgYnkgYSBsYXRlciBhc3BlY3QgaXMgbm90XG4gKiB2aXNpdGVkOyB1c2UgdGhlIGNvbnN0cnVjdCBkaXJlY3RseSBmb3IgdGhvc2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3QgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0cnVtZW50YXRpb246IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvbjtcblxuICAvKipcbiAgICogQHBhcmFtIHNjb3BlIHdoZXJlIHRoZSBzaGFyZWQgbGF5ZXIgY29uc3RydWN0cyBhcmUgY3JlYXRlZC4gVXN1YWxseSB0aGUgc2FtZSBzY29wZSB0aGUgYXNwZWN0IGlzXG4gICAqIGFwcGxpZWQgdG8uIEl0IGlzIGEgc2VwYXJhdGUgYXJndW1lbnQgZnJvbSB0aGUgdmlzaXRlZCBub2RlcyBiZWNhdXNlIHRoZSBsYXllciAoYW5kLCBpbiBgSU5fQUNDT1VOVGBcbiAgICogbW9kZSwgdGhlIG5lc3RlZCBTQVIgYXBwbGljYXRpb24pIGlzIGNyZWF0ZWQgb25jZSBhbmQgc2hhcmVkIGJ5IGV2ZXJ5IGZ1bmN0aW9uIHRoZSBhc3BlY3QgdmlzaXRzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgcHJvcHM6IE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdFByb3BzKSB7XG4gICAgdGhpcy5pbnN0cnVtZW50YXRpb24gPSBuZXcgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uKHNjb3BlLCAnT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0Jywge1xuICAgICAgc2tpcFVuc3VwcG9ydGVkUnVudGltZXM6IHRydWUsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdChub2RlOiBJQ29uc3RydWN0KTogdm9pZCB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBsYW1iZGEuRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudGF0aW9uLmluc3RydW1lbnQobm9kZSk7XG4gICAgfVxuICB9XG59XG4iXX0=