@odigos/aws-cdk 0.0.17 → 0.0.19

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.
@@ -70,6 +70,12 @@ export interface OdigosInstrumentationOptions {
70
70
  * @default - resolved from layerSource
71
71
  */
72
72
  readonly layerVersion?: lambda.ILayerVersion;
73
+ /**
74
+ * Architecture-matched collector layer when supplying a custom ADOT SDK layer.
75
+ * Upstream SDK layers already include their collector and do not use this option.
76
+ * @default - resolved from layerSource for ADOT
77
+ */
78
+ readonly collectorLayerVersion?: lambda.ILayerVersion;
73
79
  /**
74
80
  * The value the function already needs in its language loader variable (`NODE_OPTIONS`,
75
81
  * `JAVA_TOOL_OPTIONS` or `PYTHONPATH`), which the Odigos loader is joined to rather than replacing.
@@ -115,8 +121,8 @@ export interface OdigosLambdaInstrumentationProps extends OdigosInstrumentationO
115
121
  * ```
116
122
  *
117
123
  * What it does to each function: attaches the layer for the function's language and architecture, sets
118
- * `AWS_LAMBDA_EXEC_WRAPPER` so the layer loads the SDK, sets `OTEL_SERVICE_NAME`, and hands the in-Lambda
119
- * collector its entire configuration inline through `OPENTELEMETRY_COLLECTOR_CONFIG_URI`.
124
+ * `AWS_LAMBDA_EXEC_WRAPPER` and compact `ODIGOS_LAMBDA_CONFIG`. The layer builds the SDK environment and
125
+ * collector pipelines at startup; ownership and exact layer attribution are recorded in resource tags.
120
126
  *
121
127
  * The function's SDK exports to the collector on localhost, not to your destination. The collector
122
128
  * forwards after the handler has already returned, so a slow destination costs billed duration rather
@@ -129,14 +135,13 @@ export interface OdigosLambdaInstrumentationProps extends OdigosInstrumentationO
129
135
  * ends up owned by both: each `cdk deploy` reasserts the CDK's environment, each reconcile reasserts the
130
136
  * connector's, and every round trip publishes a new function version.
131
137
  *
132
- * Choose one per function. This construct writes `ODIGOS_IAC` and never the connector's `ODIGOS_MANAGED`
133
- * ownership marker, so an IaC-instrumented function reports as instrumented but is not one the connector
138
+ * Choose one per function. This construct writes `odigos:iac` resource tags and never the connector's `odigos:managed`
139
+ * ownership tag, so an IaC-instrumented function reports as instrumented but is not one the connector
134
140
  * will roll back — though it will happily take it over if you enable it as a source.
135
141
  */
136
142
  export declare class OdigosLambdaInstrumentation extends Construct {
137
143
  private readonly options;
138
144
  private readonly resolver;
139
- private readonly collectorConfig;
140
145
  private readonly instrumented;
141
146
  constructor(scope: Construct, id: string, props: OdigosLambdaInstrumentationProps);
142
147
  /**
@@ -151,8 +156,7 @@ export declare class OdigosLambdaInstrumentation extends Construct {
151
156
  *
152
157
  * Mirrors `applyHandlerEnv` / `applyWebServerEnv` in the connector, including what is deliberately NOT
153
158
  * set: `OTEL_EXPORTER_OTLP_ENDPOINT` stays unset so the SDK keeps exporting to the in-Lambda collector
154
- * on localhost rather than blocking the invocation on the remote destination, and an enabled signal's
155
- * `OTEL_*_EXPORTER` stays unset because `otlp` is already the SDK default.
159
+ * on localhost rather than blocking the invocation on the remote destination, and every signal exporter is selected explicitly.
156
160
  */
157
161
  private environmentFor;
158
162
  }
@@ -5,41 +5,17 @@ exports.OdigosInstrumentationAspect = exports.OdigosLambdaInstrumentation = void
5
5
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  const aws_cdk_lib_1 = require("aws-cdk-lib");
7
7
  const lambda = require("aws-cdk-lib/aws-lambda");
8
+ const iam = require("aws-cdk-lib/aws-iam");
8
9
  const constructs_1 = require("constructs");
9
10
  const collector_config_1 = require("./collector-config");
10
- const layers_1 = require("./generated/layers");
11
11
  const layer_resolver_1 = require("./layer-resolver");
12
12
  const runtime_1 = require("./runtime");
13
13
  const types_1 = require("./types");
14
14
  /** `AWS_LAMBDA_EXEC_WRAPPER` — the layer's entry point in handler mode. */
15
15
  const ENV_EXEC_WRAPPER = 'AWS_LAMBDA_EXEC_WRAPPER';
16
16
  /** Service name reported on every span, metric and log record. */
17
- const ENV_SERVICE_NAME = 'OTEL_SERVICE_NAME';
18
- /** Raises in-function OpenTelemetry verbosity into the function's CloudWatch log group. */
19
- const ENV_OTEL_LOG_LEVEL = 'OTEL_LOG_LEVEL';
20
- /**
21
- * Schema version of the marker payload. Must match `api.IaCMarkerVersion` in the connector — it is what tells
22
- * the connector how to read the rest of the object, so a bumped version there is a change here.
23
- */
24
- const MARKER_VERSION = 1;
25
- /**
26
- * `ODIGOS_IAC` — the marker recording that this function was instrumented by Odigos IaC tooling, by which
27
- * package version, and carrying which layer. This construct always writes it, and it is what makes Odigos
28
- * report the function as instrumented rather than `Absent` — "awaiting your deployment".
29
- *
30
- * It is NOT `ODIGOS_MANAGED`, and the difference is the whole reason there are two variables. That one is the
31
- * connector's record of a mutation IT performed, whose payload is the snapshot it restores from on rollback;
32
- * a CDK stack has no such snapshot to offer, because nothing was mutated — the environment below IS the
33
- * function's definition. So the connector accepts either marker for "is this instrumented by Odigos", and
34
- * only its own for "may I roll this back". This construct writes the first and never the second: the package
35
- * will not claim ownership of a function on your behalf.
36
- *
37
- * The `layer` field is the load-bearing one. The connector reads it back to decide which layer version the
38
- * function is SUPPOSED to carry, so a version you pinned is respected instead of being reported as drift the
39
- * day Odigos publishes a newer one. It works in `IN_ACCOUNT` mode too, where the ARN is a deploy-time
40
- * reference your own code has no way to obtain.
41
- */
42
- const ENV_IAC_MARKER = 'ODIGOS_IAC';
17
+ /** Compact SDK and destination settings; all attribution markers are Lambda resource tags. */
18
+ const ENV_LAMBDA_CONFIG = 'ODIGOS_LAMBDA_CONFIG';
43
19
  /**
44
20
  * The service a function reports as, when the caller has not named one.
45
21
  *
@@ -78,8 +54,8 @@ function defaultServiceName(fn) {
78
54
  * ```
79
55
  *
80
56
  * What it does to each function: attaches the layer for the function's language and architecture, sets
81
- * `AWS_LAMBDA_EXEC_WRAPPER` so the layer loads the SDK, sets `OTEL_SERVICE_NAME`, and hands the in-Lambda
82
- * collector its entire configuration inline through `OPENTELEMETRY_COLLECTOR_CONFIG_URI`.
57
+ * `AWS_LAMBDA_EXEC_WRAPPER` and compact `ODIGOS_LAMBDA_CONFIG`. The layer builds the SDK environment and
58
+ * collector pipelines at startup; ownership and exact layer attribution are recorded in resource tags.
83
59
  *
84
60
  * The function's SDK exports to the collector on localhost, not to your destination. The collector
85
61
  * forwards after the handler has already returned, so a slow destination costs billed duration rather
@@ -92,8 +68,8 @@ function defaultServiceName(fn) {
92
68
  * ends up owned by both: each `cdk deploy` reasserts the CDK's environment, each reconcile reasserts the
93
69
  * connector's, and every round trip publishes a new function version.
94
70
  *
95
- * Choose one per function. This construct writes `ODIGOS_IAC` and never the connector's `ODIGOS_MANAGED`
96
- * ownership marker, so an IaC-instrumented function reports as instrumented but is not one the connector
71
+ * Choose one per function. This construct writes `odigos:iac` resource tags and never the connector's `odigos:managed`
72
+ * ownership tag, so an IaC-instrumented function reports as instrumented but is not one the connector
97
73
  * will roll back — though it will happily take it over if you enable it as a source.
98
74
  */
99
75
  class OdigosLambdaInstrumentation extends constructs_1.Construct {
@@ -104,7 +80,7 @@ class OdigosLambdaInstrumentation extends constructs_1.Construct {
104
80
  this.resolver = new layer_resolver_1.OdigosLayerResolver(this, props.layerSource ?? types_1.OdigosLayerSource.ODIGOS_PUBLIC);
105
81
  // Rendered once. It depends only on the destination, and rendering it per function would make an
106
82
  // accidental difference between two functions possible.
107
- this.collectorConfig = (0, collector_config_1.renderCollectorConfig)(props.destination);
83
+ (0, collector_config_1.renderCollectorConfig)(props.destination);
108
84
  // A warning rather than an error, because a collector CAN be reached over gRPC on a non-standard port —
109
85
  // but the overwhelmingly likelier reading of `endpoint: "host:4318"` is an OTLP/HTTP endpoint passed to
110
86
  // the gRPC exporter, which builds, starts, and then never delivers a batch. Silent for the caller who
@@ -143,13 +119,26 @@ class OdigosLambdaInstrumentation extends constructs_1.Construct {
143
119
  }
144
120
  throw new Error(`${message} Set skipUnsupportedRuntimes: true to skip it instead.`);
145
121
  }
122
+ const recipe = (0, runtime_1.distributionRecipe)(language, this.options.distro, runtimeName);
123
+ (0, runtime_1.distributionWrapper)(language, this.options.distro, this.options.javaHandlerDistro, this.options.mode === types_1.OdigosInstrumentationMode.WEB_SERVER);
124
+ if (recipe.applicationSignals && (!(0, collector_config_1.resolvedSignals)(this.options.destination).traces || !(0, collector_config_1.resolvedSignals)(this.options.destination).metrics)) {
125
+ throw new Error('ADOT + Application Signals requires traces and metrics to be enabled for the destination.');
126
+ }
127
+ if (recipe.applicationSignals) {
128
+ fn.role?.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('CloudWatchLambdaApplicationSignalsExecutionRolePolicy'));
129
+ aws_cdk_lib_1.Annotations.of(fn).addWarningV2('@odigos/aws-cdk:applicationSignals', 'Enable CloudWatch Application Signals service discovery once in this AWS account and region. Application Signals also sends AWS service telemetry through the Lambda embedded agent.');
130
+ }
131
+ const resource = fn.node.defaultChild;
132
+ resource.addPropertyDeletionOverride('Environment.Variables.ODIGOS_MANAGED');
133
+ resource.addPropertyDeletionOverride('Environment.Variables.ODIGOS_IAC');
146
134
  this.instrumented.add(key);
147
135
  const architecture = fn.architecture.name;
148
- const layer = this.options.layerVersion ?? this.resolver.resolve(language, architecture);
149
- fn.addLayers(layer);
136
+ const layer = this.options.layerVersion ?? this.resolver.resolve(recipe.artifact ?? language, architecture);
137
+ const collectorLayer = recipe.artifact ? (this.options.collectorLayerVersion ?? this.resolver.resolve('adot-collector', architecture)) : undefined;
138
+ fn.addLayers(...(collectorLayer ? [layer, collectorLayer] : [layer]));
150
139
  // The ARN, not the construct: the marker has to name the exact layer version the function carries, and
151
140
  // in IN_ACCOUNT mode that is a nested-stack output reference resolved at deploy time.
152
- for (const [name, value] of Object.entries(this.environmentFor(fn, language, layer.layerVersionArn))) {
141
+ for (const [name, value] of Object.entries(this.environmentFor(fn, language, layer.layerVersionArn, collectorLayer?.layerVersionArn))) {
153
142
  fn.addEnvironment(name, value);
154
143
  }
155
144
  }
@@ -164,53 +153,58 @@ class OdigosLambdaInstrumentation extends constructs_1.Construct {
164
153
  *
165
154
  * Mirrors `applyHandlerEnv` / `applyWebServerEnv` in the connector, including what is deliberately NOT
166
155
  * set: `OTEL_EXPORTER_OTLP_ENDPOINT` stays unset so the SDK keeps exporting to the in-Lambda collector
167
- * on localhost rather than blocking the invocation on the remote destination, and an enabled signal's
168
- * `OTEL_*_EXPORTER` stays unset because `otlp` is already the SDK default.
156
+ * on localhost rather than blocking the invocation on the remote destination, and every signal exporter is selected explicitly.
169
157
  */
170
- environmentFor(fn, language, layerArn) {
158
+ environmentFor(fn, language, layerArn, collectorLayerArn) {
171
159
  const { destination, mode, debug, serviceName, javaHandlerDistro, distro, existingLoaderValue } = this.options;
172
160
  const webServer = mode === types_1.OdigosInstrumentationMode.WEB_SERVER;
161
+ const recipe = (0, runtime_1.distributionRecipe)(language, distro, fn.runtime.name);
162
+ const signals = (0, collector_config_1.resolvedSignals)(destination);
163
+ const resource = fn.node.defaultChild;
164
+ const current = aws_cdk_lib_1.Stack.of(fn).resolve(resource.environment);
165
+ const originalWrapper = current?.variables?.AWS_LAMBDA_EXEC_WRAPPER ?? '';
166
+ const execWrapper = webServer ? '/opt/odigos-webserver' : (0, runtime_1.distributionWrapper)(language, distro, javaHandlerDistro, false);
167
+ const functionLogs = signals.logs && !webServer && (language === 'ruby' || (language === 'java' &&
168
+ ['/opt/otel-handler', '/opt/otel-proxy-handler', '/opt/otel-sqs-handler', '/opt/otel-stream-handler'].includes(execWrapper)));
169
+ const config = {
170
+ version: 2,
171
+ service: serviceName ?? defaultServiceName(fn),
172
+ signals: ['traces', 'metrics', 'logs'].filter(signal => signals[signal]),
173
+ endpoint: destination.endpoint ?? destination.httpEndpoint,
174
+ ...(destination.httpEndpoint ? { http: true } : {}),
175
+ ...(destination.endpoint && destination.insecure ? { insecure: true } : {}),
176
+ ...(destination.headers && Object.keys(destination.headers).length ? { headers: destination.headers } : {}),
177
+ ...(recipe.applicationSignals ? { applicationSignals: true } : {}),
178
+ ...(functionLogs ? { functionLogs: true } : {}),
179
+ ...(debug && !webServer ? { debug: true } : {}),
180
+ ...(webServer ? { webWrapper: originalWrapper } : {}),
181
+ };
173
182
  const env = {
174
- [ENV_SERVICE_NAME]: serviceName ?? defaultServiceName(fn),
175
- [collector_config_1.ENV_COLLECTOR_CONFIG_URI]: this.collectorConfig,
176
- [ENV_IAC_MARKER]: JSON.stringify({
177
- v: MARKER_VERSION,
178
- source: 'cdk',
179
- version: layers_1.ODIGOS_VERSION || 'unreleased',
180
- layer: layerArn,
181
- }),
183
+ [ENV_EXEC_WRAPPER]: execWrapper,
184
+ [ENV_LAMBDA_CONFIG]: JSON.stringify(config),
182
185
  };
183
- const selectedWrapper = (0, runtime_1.distributionWrapper)(language, distro, javaHandlerDistro, webServer);
184
- if (webServer) {
185
- // No exec wrapper: the Lambda Web Adapter owns it, and overwriting it stops the function serving.
186
- Object.assign(env, (0, runtime_1.webServerEnv)(language, existingLoaderValue));
186
+ aws_cdk_lib_1.Tags.of(fn).add('odigos:iac', 'v1');
187
+ aws_cdk_lib_1.Tags.of(fn).add('odigos:sdk-layer', layerArn);
188
+ if (collectorLayerArn)
189
+ aws_cdk_lib_1.Tags.of(fn).add('odigos:collector-layer', collectorLayerArn);
190
+ // Explicit customer loader options remain ordinary customer environment values.
191
+ if (webServer && existingLoaderValue !== undefined) {
192
+ const loaderKey = { java: 'JAVA_TOOL_OPTIONS', nodejs: 'NODE_OPTIONS', python: 'PYTHONPATH' }[language];
193
+ if (loaderKey)
194
+ env[loaderKey] = existingLoaderValue;
187
195
  }
188
- else {
189
- env[ENV_EXEC_WRAPPER] = selectedWrapper;
190
- if (debug) {
191
- env[ENV_OTEL_LOG_LEVEL] = 'debug';
192
- }
196
+ if (language === 'ruby' && signals.metrics) {
197
+ aws_cdk_lib_1.Annotations.of(fn).addWarningV2('@odigos/aws-cdk:rubySignalsUnsupported', 'The bundled Ruby Lambda SDK cannot generate OTLP metrics. Function stdout/stderr logs are collected by the Lambda collector when logs are selected.');
193
198
  }
194
- // Suppress the signals the destination does not accept. A signal with no collector pipeline is refused
195
- // at the receiver on every batch, so telling the SDK not to produce it is the half that stops the
196
- // error loop; the pipeline being absent is the half that stops the export.
197
- const enabled = (0, collector_config_1.resolvedSignals)(destination);
198
- const overrides = [
199
- [collector_config_1.ENV_TRACES_EXPORTER, (0, collector_config_1.exporterOverrideFor)(enabled.traces)],
200
- [collector_config_1.ENV_METRICS_EXPORTER, (0, collector_config_1.exporterOverrideFor)(enabled.metrics)],
201
- [collector_config_1.ENV_LOGS_EXPORTER, (0, collector_config_1.exporterOverrideFor)(enabled.logs)],
202
- ];
203
- for (const [name, value] of overrides) {
204
- if (value !== undefined) {
205
- env[name] = value;
206
- }
199
+ if (destination.profiles) {
200
+ aws_cdk_lib_1.Annotations.of(fn).addWarningV2('@odigos/aws-cdk:profilesUnsupported', 'The bundled Lambda language agents do not generate OTLP profiles. Other selected signals remain enabled.');
207
201
  }
208
202
  return env;
209
203
  }
210
204
  }
211
205
  exports.OdigosLambdaInstrumentation = OdigosLambdaInstrumentation;
212
206
  _a = JSII_RTTI_SYMBOL_1;
213
- OdigosLambdaInstrumentation[_a] = { fqn: "@odigos/aws-cdk.OdigosLambdaInstrumentation", version: "0.0.17" };
207
+ OdigosLambdaInstrumentation[_a] = { fqn: "@odigos/aws-cdk.OdigosLambdaInstrumentation", version: "0.0.19" };
214
208
  /**
215
209
  * Applies Odigos instrumentation to every `lambda.Function` in a scope.
216
210
  *
@@ -248,5 +242,5 @@ class OdigosInstrumentationAspect {
248
242
  }
249
243
  exports.OdigosInstrumentationAspect = OdigosInstrumentationAspect;
250
244
  _b = JSII_RTTI_SYMBOL_1;
251
- OdigosInstrumentationAspect[_b] = { fqn: "@odigos/aws-cdk.OdigosInstrumentationAspect", version: "0.0.17" };
252
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUFpRTtBQUNqRSxpREFBaUQ7QUFDakQsMkNBQW1EO0FBQ25ELHlEQVE0QjtBQUM1QiwrQ0FBb0Q7QUFDcEQscURBQXVEO0FBQ3ZELHVDQUFtRjtBQUNuRixtQ0FLaUI7QUFFakIsMkVBQTJFO0FBQzNFLE1BQU0sZ0JBQWdCLEdBQUcseUJBQXlCLENBQUM7QUFDbkQsa0VBQWtFO0FBQ2xFLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUM7QUFDN0MsMkZBQTJGO0FBQzNGLE1BQU0sa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUM7QUFFNUM7OztHQUdHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBRXpCOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDO0FBRXBDOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILFNBQVMsa0JBQWtCLENBQUMsRUFBbUI7SUFDN0MsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUE4QyxDQUFDO0lBQ25FLE1BQU0sUUFBUSxHQUFHLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4RixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNyRixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNw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O1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDOztBQXZJSCxrRUF3SUM7OztBQU9EOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBYSwyQkFBMkI7SUFHdEM7Ozs7T0FJRztJQUNILFlBQVksS0FBZ0IsRUFBRSxLQUF1QztRQUNuRSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksMkJBQTJCLENBQUMsS0FBSyxFQUFFLDZCQUE2QixFQUFFO1lBQzNGLHVCQUF1QixFQUFFLElBQUk7WUFDN0IsR0FBRyxLQUFLO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFnQjtRQUMzQixJQUFJLElBQUksWUFBWSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7O0FBbkJILGtFQW9CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25zLCBJQXNwZWN0LCBTdGFjaywgVG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7XG4gIEVOVl9DT0xMRUNUT1JfQ09ORklHX1VSSSxcbiAgRU5WX0xPR1NfRVhQT1JURVIsXG4gIEVOVl9NRVRSSUNTX0VYUE9SVEVSLFxuICBFTlZfVFJBQ0VTX0VYUE9SVEVSLFxuICBleHBvcnRlck92ZXJyaWRlRm9yLFxuICByZW5kZXJDb2xsZWN0b3JDb25maWcsXG4gIHJlc29sdmVkU2lnbmFscyxcbn0gZnJvbSAnLi9jb2xsZWN0b3ItY29uZmlnJztcbmltcG9ydCB7IE9ESUdPU19WRVJTSU9OIH0gZnJvbSAnLi9nZW5lcmF0ZWQvbGF5ZXJzJztcbmltcG9ydCB7IE9kaWdvc0xheWVyUmVzb2x2ZXIgfSBmcm9tICcuL2xheWVyLXJlc29sdmVyJztcbmltcG9ydCB7IGRpc3RyaWJ1dGlvbldyYXBwZXIsIGxhbmd1YWdlRnJvbVJ1bnRpbWUsIHdlYlNlcnZlckVudiB9IGZyb20gJy4vcnVudGltZSc7XG5pbXBvcnQge1xuICBPZGlnb3NEZXN0aW5hdGlvbixcbiAgT2RpZ29zSW5zdHJ1bWVudGF0aW9uTW9kZSxcbiAgT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8sXG4gIE9kaWdvc0xheWVyU291cmNlLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqIGBBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUmAg4oCUIHRoZSBsYXllcidzIGVudHJ5IHBvaW50IGluIGhhbmRsZXIgbW9kZS4gKi9cbmNvbnN0IEVOVl9FWEVDX1dSQVBQRVIgPSAnQVdTX0xBTUJEQV9FWEVDX1dSQVBQRVInO1xuLyoqIFNlcnZpY2UgbmFtZSByZXBvcnRlZCBvbiBldmVyeSBzcGFuLCBtZXRyaWMgYW5kIGxvZyByZWNvcmQuICovXG5jb25zdCBFTlZfU0VSVklDRV9OQU1FID0gJ09URUxfU0VSVklDRV9OQU1FJztcbi8qKiBSYWlzZXMgaW4tZnVuY3Rpb24gT3BlblRlbGVtZXRyeSB2ZXJib3NpdHkgaW50byB0aGUgZnVuY3Rpb24ncyBDbG91ZFdhdGNoIGxvZyBncm91cC4gKi9cbmNvbnN0IEVOVl9PVEVMX0xPR19MRVZFTCA9ICdPVEVMX0xPR19MRVZFTCc7XG5cbi8qKlxuICogU2NoZW1hIHZlcnNpb24gb2YgdGhlIG1hcmtlciBwYXlsb2FkLiBNdXN0IG1hdGNoIGBhcGkuSWFDTWFya2VyVmVyc2lvbmAgaW4gdGhlIGNvbm5lY3RvciDigJQgaXQgaXMgd2hhdCB0ZWxsc1xuICogdGhlIGNvbm5lY3RvciBob3cgdG8gcmVhZCB0aGUgcmVzdCBvZiB0aGUgb2JqZWN0LCBzbyBhIGJ1bXBlZCB2ZXJzaW9uIHRoZXJlIGlzIGEgY2hhbmdlIGhlcmUuXG4gKi9cbmNvbnN0IE1BUktFUl9WRVJTSU9OID0gMTtcblxuLyoqXG4gKiBgT0RJR09TX0lBQ2Ag4oCUIHRoZSBtYXJrZXIgcmVjb3JkaW5nIHRoYXQgdGhpcyBmdW5jdGlvbiB3YXMgaW5zdHJ1bWVudGVkIGJ5IE9kaWdvcyBJYUMgdG9vbGluZywgYnkgd2hpY2hcbiAqIHBhY2thZ2UgdmVyc2lvbiwgYW5kIGNhcnJ5aW5nIHdoaWNoIGxheWVyLiBUaGlzIGNvbnN0cnVjdCBhbHdheXMgd3JpdGVzIGl0LCBhbmQgaXQgaXMgd2hhdCBtYWtlcyBPZGlnb3NcbiAqIHJlcG9ydCB0aGUgZnVuY3Rpb24gYXMgaW5zdHJ1bWVudGVkIHJhdGhlciB0aGFuIGBBYnNlbnRgIOKAlCBcImF3YWl0aW5nIHlvdXIgZGVwbG95bWVudFwiLlxuICpcbiAqIEl0IGlzIE5PVCBgT0RJR09TX01BTkFHRURgLCBhbmQgdGhlIGRpZmZlcmVuY2UgaXMgdGhlIHdob2xlIHJlYXNvbiB0aGVyZSBhcmUgdHdvIHZhcmlhYmxlcy4gVGhhdCBvbmUgaXMgdGhlXG4gKiBjb25uZWN0b3IncyByZWNvcmQgb2YgYSBtdXRhdGlvbiBJVCBwZXJmb3JtZWQsIHdob3NlIHBheWxvYWQgaXMgdGhlIHNuYXBzaG90IGl0IHJlc3RvcmVzIGZyb20gb24gcm9sbGJhY2s7XG4gKiBhIENESyBzdGFjayBoYXMgbm8gc3VjaCBzbmFwc2hvdCB0byBvZmZlciwgYmVjYXVzZSBub3RoaW5nIHdhcyBtdXRhdGVkIOKAlCB0aGUgZW52aXJvbm1lbnQgYmVsb3cgSVMgdGhlXG4gKiBmdW5jdGlvbidzIGRlZmluaXRpb24uIFNvIHRoZSBjb25uZWN0b3IgYWNjZXB0cyBlaXRoZXIgbWFya2VyIGZvciBcImlzIHRoaXMgaW5zdHJ1bWVudGVkIGJ5IE9kaWdvc1wiLCBhbmRcbiAqIG9ubHkgaXRzIG93biBmb3IgXCJtYXkgSSByb2xsIHRoaXMgYmFja1wiLiBUaGlzIGNvbnN0cnVjdCB3cml0ZXMgdGhlIGZpcnN0IGFuZCBuZXZlciB0aGUgc2Vjb25kOiB0aGUgcGFja2FnZVxuICogd2lsbCBub3QgY2xhaW0gb3duZXJzaGlwIG9mIGEgZnVuY3Rpb24gb24geW91ciBiZWhhbGYuXG4gKlxuICogVGhlIGBsYXllcmAgZmllbGQgaXMgdGhlIGxvYWQtYmVhcmluZyBvbmUuIFRoZSBjb25uZWN0b3IgcmVhZHMgaXQgYmFjayB0byBkZWNpZGUgd2hpY2ggbGF5ZXIgdmVyc2lvbiB0aGVcbiAqIGZ1bmN0aW9uIGlzIFNVUFBPU0VEIHRvIGNhcnJ5LCBzbyBhIHZlcnNpb24geW91IHBpbm5lZCBpcyByZXNwZWN0ZWQgaW5zdGVhZCBvZiBiZWluZyByZXBvcnRlZCBhcyBkcmlmdCB0aGVcbiAqIGRheSBPZGlnb3MgcHVibGlzaGVzIGEgbmV3ZXIgb25lLiBJdCB3b3JrcyBpbiBgSU5fQUNDT1VOVGAgbW9kZSB0b28sIHdoZXJlIHRoZSBBUk4gaXMgYSBkZXBsb3ktdGltZVxuICogcmVmZXJlbmNlIHlvdXIgb3duIGNvZGUgaGFzIG5vIHdheSB0byBvYnRhaW4uXG4gKi9cbmNvbnN0IEVOVl9JQUNfTUFSS0VSID0gJ09ESUdPU19JQUMnO1xuXG4vKipcbiAqIFRoZSBzZXJ2aWNlIGEgZnVuY3Rpb24gcmVwb3J0cyBhcywgd2hlbiB0aGUgY2FsbGVyIGhhcyBub3QgbmFtZWQgb25lLlxuICpcbiAqIFJFQUQgRlJPTSBUSEUgTDEsIE5PVCBGUk9NIGBmbi5mdW5jdGlvbk5hbWVgLiBUaGUgTDIgcHJvcGVydHkgaXMgYSBjcm9zcy1lbnZpcm9ubWVudC1hd2FyZSB0b2tlbiB0aGF0XG4gKiByZXNvbHZlcyB0byBhIGBSZWZgIHRvIHRoZSBmdW5jdGlvbiBpdHNlbGYgZXZlbiB3aGVuIHRoZSBzdGFjayBzZXQgYGZ1bmN0aW9uTmFtZWAgZXhwbGljaXRseSDigJQgc28gdGhlXG4gKiBvYnZpb3VzIGBTdGFjay5vZihmbikucmVzb2x2ZShmbi5mdW5jdGlvbk5hbWUpYCBuZXZlciB5aWVsZHMgYSBsaXRlcmFsLCBhbmQgZXZlcnkgZnVuY3Rpb24gc2lsZW50bHkgZmVsbFxuICogYmFjayB0byBpdHMgY29uc3RydWN0IGlkLiBgQ2ZuRnVuY3Rpb24uZnVuY3Rpb25OYW1lYCBpcyB0aGUgcmF3IHRlbXBsYXRlIHZhbHVlOiB0aGUgbGl0ZXJhbCB0aGUgc3RhY2tcbiAqIHBhc3NlZCwgb3IgdW5kZWZpbmVkIHdoZW4gQ2xvdWRGb3JtYXRpb24gZ2VuZXJhdGVzIHRoZSBuYW1lLlxuICpcbiAqIFdoeSB0aGUgZmFsbGJhY2sgaXMgdGhlIGNvbnN0cnVjdCBpZCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJhdGVkIG5hbWU6IGEgZ2VuZXJhdGVkIG5hbWUgaXMgYSBgUmVmYCB0byB0aGVcbiAqIGZ1bmN0aW9uLCBhbmQgcHV0dGluZyB0aGF0IGluIHRoZSBmdW5jdGlvbidzIG93biBlbnZpcm9ubWVudCBtYWtlcyB0aGUgcmVzb3VyY2UgZGVwZW5kIG9uIGl0cyBvd25cbiAqIGNyZWF0aW9uIOKAlCBDbG91ZEZvcm1hdGlvbiByZWplY3RzIHRoZSB0ZW1wbGF0ZSB3aXRoIGEgZGVwZW5kZW5jeSBjeWNsZSwgYXQgZGVwbG95IHRpbWUuXG4gKlxuICogVGhpcyBtYXR0ZXJzIGJleW9uZCBjb3NtZXRpY3MuIFRoZSBjb25uZWN0b3IgY29tcGFyZXMgYE9URUxfU0VSVklDRV9OQU1FYCBhZ2FpbnN0IHRoZSB3b3JrbG9hZCdzIG5hbWUgaW5cbiAqIE9kaWdvcywgd2hpY2ggaXMgdGhlIHJlYWwgQVdTIGZ1bmN0aW9uIG5hbWUsIHNvIGEgZnVuY3Rpb24gcmVwb3J0aW5nIGl0cyBjb25zdHJ1Y3QgaWQgaXMgcmVwb3J0ZWQgYXNcbiAqIGRyaWZ0ZWQgb24gdGhlIHNlcnZpY2UtbmFtZSBjb21wb25lbnQuIE5hbWluZyB0aGUgZnVuY3Rpb24gaW4geW91ciBzdGFjayBpcyBub3cgZW5vdWdoIHRvIGxpbmUgdGhlIHR3b1xuICogdXA7IGEgZnVuY3Rpb24gd2hvc2UgbmFtZSBDbG91ZEZvcm1hdGlvbiBnZW5lcmF0ZXMgc3RpbGwgbmVlZHMgYHNlcnZpY2VOYW1lYCBwYXNzZWQgZXhwbGljaXRseS5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdFNlcnZpY2VOYW1lKGZuOiBsYW1iZGEuRnVuY3Rpb24pOiBzdHJpbmcge1xuICBjb25zdCBjZm4gPSBmbi5ub2RlLmRlZmF1bHRDaGlsZCBhcyBsYW1iZGEuQ2ZuRnVuY3Rpb24gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc29sdmVkID0gY2ZuID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdGFjay5vZihmbikucmVzb2x2ZShjZm4uZnVuY3Rpb25OYW1lKTtcbiAgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gJ3N0cmluZycgJiYgcmVzb2x2ZWQgIT09ICcnICYmICFUb2tlbi5pc1VucmVzb2x2ZWQocmVzb2x2ZWQpKSB7XG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG4gIHJldHVybiBmbi5ub2RlLmlkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgc2hhcmVkIGJ5IHRoZSBjb25zdHJ1Y3QgYW5kIHRoZSBhc3BlY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2RpZ29zSW5zdHJ1bWVudGF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgaW4tTGFtYmRhIGNvbGxlY3RvciBleHBvcnRzIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb246IE9kaWdvc0Rlc3RpbmF0aW9uO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgT2RpZ29zIGxheWVyIGNvbWVzIGZyb20uXG4gICAqXG4gICAqIEBkZWZhdWx0IE9kaWdvc0xheWVyU291cmNlLk9ESUdPU19QVUJMSUNcbiAgICovXG4gIHJlYWRvbmx5IGxheWVyU291cmNlPzogT2RpZ29zTGF5ZXJTb3VyY2U7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgbW9kZSBvciB3ZWItc2VydmVyIChMYW1iZGEgV2ViIEFkYXB0ZXIpIG1vZGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGF1dG8tZGV0ZWN0aW9uLCBhbmQgdGhhdCBpcyBkZWxpYmVyYXRlIHJhdGhlciB0aGFuIGFuIG9taXNzaW9uOiBkZXRlY3RpbmcgdGhlIHdlYiBhZGFwdGVyXG4gICAqIG1lYW5zIGluc3BlY3RpbmcgdGhlIGZ1bmN0aW9uJ3Mgb3RoZXIgbGF5ZXJzLCB3aGljaCBhdCBzeW50aCB0aW1lIGFyZSBmcmVxdWVudGx5IHVucmVzb2x2ZWQgdG9rZW5zLlxuICAgKiBBIGRldGVjdG9yIHRoYXQgaXMgcmlnaHQgbW9zdCBvZiB0aGUgdGltZSB3b3VsZCBzaWxlbnRseSBicmVhayB0aGUgZnVuY3Rpb25zIGl0IGdvdCB3cm9uZy5cbiAgICpcbiAgICogQGRlZmF1bHQgT2RpZ29zSW5zdHJ1bWVudGF0aW9uTW9kZS5IQU5ETEVSXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogT2RpZ29zSW5zdHJ1bWVudGF0aW9uTW9kZTtcblxuICAvKipcbiAgICogQ29ubmVjdG9yIEdyYXBoUUwgZGlzdHJvIG5hbWUsIHN1Y2ggYXMgamF2YS1sYW1iZGEtb3RlbC1hZ2VudCBvciBqYXZhLWxhbWJkYS1vdGVsLXdyYXBwZXIuXG4gICAqIEBkZWZhdWx0IC0gdGhlIGJ1bmRsZWQgZGVmYXVsdCBkaXN0cmlidXRpb24gZm9yIHRoZSBmdW5jdGlvbidzIHJ1bnRpbWVcbiAgICovXG4gIHJlYWRvbmx5IGRpc3Rybz86IHN0cmluZztcblxuICAvKipcbiAgICogTGVnYWN5IGxpZ2h0d2VpZ2h0IEphdmEgaGFuZGxlciBhZGFwdGVyLlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgamF2YS1sYW1iZGEtb3RlbC0qLXdyYXBwZXIgZGlzdHJvLlxuICAgKi9cbiAgcmVhZG9ubHkgamF2YUhhbmRsZXJEaXN0cm8/OiBPZGlnb3NKYXZhSGFuZGxlckRpc3RybztcblxuICAvKipcbiAgICogYE9URUxfU0VSVklDRV9OQU1FYCBmb3IgZXZlcnkgZnVuY3Rpb24gdGhpcyBpbnN0cnVtZW50cy5cbiAgICpcbiAgICogVXN1YWxseSB3cm9uZyB0byBzZXQgd2hlbiBpbnN0cnVtZW50aW5nIG1vcmUgdGhhbiBvbmUgZnVuY3Rpb24g4oCUIHRoZXkgd291bGQgYWxsIHJlcG9ydCBhcyB0aGUgc2FtZVxuICAgKiBzZXJ2aWNlLlxuICAgKlxuICAgKiBMZWZ0IHVuc2V0LCBhIGZ1bmN0aW9uIHJlcG9ydHMgYXMgaXRzIGV4cGxpY2l0bHktc2V0IHBoeXNpY2FsIG5hbWUgaWYgaXQgaGFzIG9uZSwgYW5kIG90aGVyd2lzZSBhc1xuICAgKiBpdHMgY29uc3RydWN0IGlkLiBJdCBkZWxpYmVyYXRlbHkgZG9lcyBub3QgZGVmYXVsdCB0byB0aGUgZ2VuZXJhdGVkIHBoeXNpY2FsIG5hbWU6IHRoYXQgdmFsdWUgaXMgYVxuICAgKiBgUmVmYCB0byB0aGUgZnVuY3Rpb24gaXRzZWxmLCBhbmQgYSBmdW5jdGlvbiByZWZlcmVuY2luZyBpdHNlbGYgaW4gaXRzIG93biBlbnZpcm9ubWVudCBpcyBhXG4gICAqIENsb3VkRm9ybWF0aW9uIGRlcGVuZGVuY3kgY3ljbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGZ1bmN0aW9uJ3MgcGh5c2ljYWwgbmFtZSBpZiBleHBsaWNpdGx5IHNldCwgb3RoZXJ3aXNlIGl0cyBjb25zdHJ1Y3QgaWRcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSYWlzZSBpbi1mdW5jdGlvbiBPcGVuVGVsZW1ldHJ5IHZlcmJvc2l0eSAoYE9URUxfTE9HX0xFVkVMPWRlYnVnYCkuXG4gICAqXG4gICAqIFRoZSBsYXllciwgU0RLIGFuZCBjb2xsZWN0b3IgdGhlbiBlbWl0IHNwYW4gYW5kIE9UTFAtZXhwb3J0IGRpYWdub3N0aWNzIGludG8gdGhlIGZ1bmN0aW9uJ3MgQ2xvdWRXYXRjaFxuICAgKiBsb2cgZ3JvdXAuIFVzZWZ1bCB3aGlsZSB3aXJpbmcgdXAgYSBkZXN0aW5hdGlvbiwgZXhwZW5zaXZlIHRvIGxlYXZlIG9uLlxuICAgKlxuICAgKiBIYXMgbm8gZWZmZWN0IGluIHdlYi1zZXJ2ZXIgbW9kZSwgbWF0Y2hpbmcgdGhlIGNvbm5lY3Rvciwgd2hpY2ggbmV2ZXIgc2V0cyBhIGxvZyBsZXZlbCB0aGVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRlYnVnPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQXR0YWNoIHRoaXMgbGF5ZXIgaW5zdGVhZCBvZiByZXNvbHZpbmcgb25lLiBPdmVycmlkZXMgYGxheWVyU291cmNlYCBlbnRpcmVseS5cbiAgICpcbiAgICogVGhlIGVzY2FwZSBoYXRjaCBmb3IgYSBsYXllciBtaXJyb3JlZCBpbnRvIGEgcHJpdmF0ZSByZWdpc3RyeSBvciBhbiBpbnRlcm5hbCBhY2NvdW50LiBUaGUgbGF5ZXIgbXVzdFxuICAgKiBoYXZlIHRoZSBzYW1lIGNvbnRlbnRzIGFzIHRoZSBPZGlnb3Mgb25lIOKAlCB0aGUgZW52aXJvbm1lbnQgc2V0IGhlcmUgYXNzdW1lcyBpdHMgZXhhY3Qgc2NyaXB0IGxheW91dC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSByZXNvbHZlZCBmcm9tIGxheWVyU291cmNlXG4gICAqL1xuICByZWFkb25seSBsYXllclZlcnNpb24/OiBsYW1iZGEuSUxheWVyVmVyc2lvbjtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRoZSBmdW5jdGlvbiBhbHJlYWR5IG5lZWRzIGluIGl0cyBsYW5ndWFnZSBsb2FkZXIgdmFyaWFibGUgKGBOT0RFX09QVElPTlNgLFxuICAgKiBgSkFWQV9UT09MX09QVElPTlNgIG9yIGBQWVRIT05QQVRIYCksIHdoaWNoIHRoZSBPZGlnb3MgbG9hZGVyIGlzIGpvaW5lZCB0byByYXRoZXIgdGhhbiByZXBsYWNpbmcuXG4gICAqXG4gICAqIE9ubHkgdXNlZCBpbiB3ZWItc2VydmVyIG1vZGUuIEl0IGhhcyB0byBiZSBwYXNzZWQgZXhwbGljaXRseSBiZWNhdXNlIENESydzIGBsYW1iZGEuRnVuY3Rpb25gIGV4cG9zZXNcbiAgICogbm8gd2F5IHRvIHJlYWQgYmFjayBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXQgZWxzZXdoZXJlIGluIHRoZSBhcHAg4oCUIGFuIG9taXR0ZWQgdmFsdWUgaGVyZSBpc1xuICAgKiBzaWxlbnRseSBvdmVyd3JpdHRlbiwgd2hpY2ggZm9yIGBOT0RFX09QVElPTlNgIGNhbiBtZWFuIGxvc2luZyBhIGZsYWcgdGhlIGFwcCBuZWVkcyB0byBib290LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBsb2FkZXIgdmFyaWFibGUgaXMgc2V0IHRvIHRoZSBPZGlnb3MgdmFsdWUgYWxvbmVcbiAgICovXG4gIHJlYWRvbmx5IGV4aXN0aW5nTG9hZGVyVmFsdWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNraXAgZnVuY3Rpb25zIHdob3NlIHJ1bnRpbWUgaGFzIG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGluc3RlYWQgb2YgdGhyb3dpbmcuXG4gICAqXG4gICAqIGBkb3RuZXQqYCBhbmQgYHByb3ZpZGVkLipgIChHbywgY3VzdG9tIHJ1bnRpbWVzKSBoYXZlIG5vIGxhbmd1YWdlIGxheWVyIHVwc3RyZWFtLiBFeHBsaWNpdGx5XG4gICAqIGluc3RydW1lbnRpbmcgb25lIGlzIGEgbWlzdGFrZSB3b3J0aCBmYWlsaW5nIG9uOyBzd2VlcGluZyBhIHdob2xlIHN0YWNrIHdpdGggdGhlIGFzcGVjdCBhbmQgaGl0dGluZ1xuICAgKiBvbmUgaXMgbm90LCB3aGljaCBpcyB3aHkgdGhlIGFzcGVjdCBkZWZhdWx0cyB0aGlzIHRvIGB0cnVlYCBhbmQgdGhlIGNvbnN0cnVjdCB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcFVuc3VwcG9ydGVkUnVudGltZXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciB7QGxpbmsgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9ufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb25Qcm9wcyBleHRlbmRzIE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogRnVuY3Rpb25zIHRvIGluc3RydW1lbnQgb24gY29uc3RydWN0aW9uLiBNb3JlIGNhbiBiZSBhZGRlZCB3aXRoIGBpbnN0cnVtZW50KClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9ucz86IGxhbWJkYS5GdW5jdGlvbltdO1xufVxuXG4vKipcbiAqIEluc3RydW1lbnRzIEFXUyBMYW1iZGEgZnVuY3Rpb25zIHdpdGggdGhlIE9kaWdvcyBPcGVuVGVsZW1ldHJ5IGxheWVyLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBvZGlnb3MgPSBuZXcgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uKHRoaXMsICdPZGlnb3MnLCB7XG4gKiAgIGRlc3RpbmF0aW9uOiB7IGVuZHBvaW50OiAnb3RscC5leGFtcGxlLmNvbTo0MzE3JyB9LFxuICogICBmdW5jdGlvbnM6IFthcGlGbiwgd29ya2VyRm5dLFxuICogfSk7XG4gKiBvZGlnb3MuaW5zdHJ1bWVudChhbm90aGVyRm4pO1xuICogYGBgXG4gKlxuICogV2hhdCBpdCBkb2VzIHRvIGVhY2ggZnVuY3Rpb246IGF0dGFjaGVzIHRoZSBsYXllciBmb3IgdGhlIGZ1bmN0aW9uJ3MgbGFuZ3VhZ2UgYW5kIGFyY2hpdGVjdHVyZSwgc2V0c1xuICogYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCBzbyB0aGUgbGF5ZXIgbG9hZHMgdGhlIFNESywgc2V0cyBgT1RFTF9TRVJWSUNFX05BTUVgLCBhbmQgaGFuZHMgdGhlIGluLUxhbWJkYVxuICogY29sbGVjdG9yIGl0cyBlbnRpcmUgY29uZmlndXJhdGlvbiBpbmxpbmUgdGhyb3VnaCBgT1BFTlRFTEVNRVRSWV9DT0xMRUNUT1JfQ09ORklHX1VSSWAuXG4gKlxuICogVGhlIGZ1bmN0aW9uJ3MgU0RLIGV4cG9ydHMgdG8gdGhlIGNvbGxlY3RvciBvbiBsb2NhbGhvc3QsIG5vdCB0byB5b3VyIGRlc3RpbmF0aW9uLiBUaGUgY29sbGVjdG9yXG4gKiBmb3J3YXJkcyBhZnRlciB0aGUgaGFuZGxlciBoYXMgYWxyZWFkeSByZXR1cm5lZCwgc28gYSBzbG93IGRlc3RpbmF0aW9uIGNvc3RzIGJpbGxlZCBkdXJhdGlvbiByYXRoZXJcbiAqIHRoYW4gY2FsbGVyIGxhdGVuY3kuXG4gKlxuICogIyMgRG8gbm90IGFsc28gaW5zdHJ1bWVudCB0aGVzZSBmdW5jdGlvbnMgd2l0aCB0aGUgY29ubmVjdG9yXG4gKlxuICogVGhlIE9kaWdvcyBBV1MgY29ubmVjdG9yIGluc3RydW1lbnRzIGxpdmUgZnVuY3Rpb25zIGJ5IG11dGF0aW5nIHRoZW0sIGFuZCByZWNvbmNpbGVzIHRoZW0gYmFjayB0byBpdHNcbiAqIG93biBkZXNpcmVkIHN0YXRlIG9uIGV2ZXJ5IHBhc3MuIEEgZnVuY3Rpb24gaW5zdHJ1bWVudGVkIGhlcmUgYW5kIGFsc28gZW5hYmxlZCBhcyBhIGNvbm5lY3RvciBzb3VyY2VcbiAqIGVuZHMgdXAgb3duZWQgYnkgYm90aDogZWFjaCBgY2RrIGRlcGxveWAgcmVhc3NlcnRzIHRoZSBDREsncyBlbnZpcm9ubWVudCwgZWFjaCByZWNvbmNpbGUgcmVhc3NlcnRzIHRoZVxuICogY29ubmVjdG9yJ3MsIGFuZCBldmVyeSByb3VuZCB0cmlwIHB1Ymxpc2hlcyBhIG5ldyBmdW5jdGlvbiB2ZXJzaW9uLlxuICpcbiAqIENob29zZSBvbmUgcGVyIGZ1bmN0aW9uLiBUaGlzIGNvbnN0cnVjdCB3cml0ZXMgYE9ESUdPU19JQUNgIGFuZCBuZXZlciB0aGUgY29ubmVjdG9yJ3MgYE9ESUdPU19NQU5BR0VEYFxuICogb3duZXJzaGlwIG1hcmtlciwgc28gYW4gSWFDLWluc3RydW1lbnRlZCBmdW5jdGlvbiByZXBvcnRzIGFzIGluc3RydW1lbnRlZCBidXQgaXMgbm90IG9uZSB0aGUgY29ubmVjdG9yXG4gKiB3aWxsIHJvbGwgYmFjayDigJQgdGhvdWdoIGl0IHdpbGwgaGFwcGlseSB0YWtlIGl0IG92ZXIgaWYgeW91IGVuYWJsZSBpdCBhcyBhIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvbiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogT2RpZ29zSW5zdHJ1bWVudGF0aW9uT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSByZXNvbHZlcjogT2RpZ29zTGF5ZXJSZXNvbHZlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsZWN0b3JDb25maWc6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0cnVtZW50ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5vcHRpb25zID0gcHJvcHM7XG4gICAgdGhpcy5yZXNvbHZlciA9IG5ldyBPZGlnb3NMYXllclJlc29sdmVyKHRoaXMsIHByb3BzLmxheWVyU291cmNlID8/IE9kaWdvc0xheWVyU291cmNlLk9ESUdPU19QVUJMSUMpO1xuXG4gICAgLy8gUmVuZGVyZWQgb25jZS4gSXQgZGVwZW5kcyBvbmx5IG9uIHRoZSBkZXN0aW5hdGlvbiwgYW5kIHJlbmRlcmluZyBpdCBwZXIgZnVuY3Rpb24gd291bGQgbWFrZSBhblxuICAgIC8vIGFjY2lkZW50YWwgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBmdW5jdGlvbnMgcG9zc2libGUuXG4gICAgdGhpcy5jb2xsZWN0b3JDb25maWcgPSByZW5kZXJDb2xsZWN0b3JDb25maWcocHJvcHMuZGVzdGluYXRpb24pO1xuXG4gICAgLy8gQSB3YXJuaW5nIHJhdGhlciB0aGFuIGFuIGVycm9yLCBiZWNhdXNlIGEgY29sbGVjdG9yIENBTiBiZSByZWFjaGVkIG92ZXIgZ1JQQyBvbiBhIG5vbi1zdGFuZGFyZCBwb3J0IOKAlFxuICAgIC8vIGJ1dCB0aGUgb3ZlcndoZWxtaW5nbHkgbGlrZWxpZXIgcmVhZGluZyBvZiBgZW5kcG9pbnQ6IFwiaG9zdDo0MzE4XCJgIGlzIGFuIE9UTFAvSFRUUCBlbmRwb2ludCBwYXNzZWQgdG9cbiAgICAvLyB0aGUgZ1JQQyBleHBvcnRlciwgd2hpY2ggYnVpbGRzLCBzdGFydHMsIGFuZCB0aGVuIG5ldmVyIGRlbGl2ZXJzIGEgYmF0Y2guIFNpbGVudCBmb3IgdGhlIGNhbGxlciB3aG9cbiAgICAvLyBtZWFudCBpdDsgbG91ZCBmb3IgdGhlIG9uZSB3aG8gZGlkIG5vdC5cbiAgICBpZiAocHJvcHMuZGVzdGluYXRpb24uZW5kcG9pbnQ/LmVuZHNXaXRoKCc6NDMxOCcpKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoXG4gICAgICAgICdAb2RpZ29zL2F3cy1jZGs6cHJvYmFibGVIdHRwRW5kcG9pbnQnLFxuICAgICAgICBgT2RpZ29zOiBkZXN0aW5hdGlvbiBlbmRwb2ludCBcIiR7cHJvcHMuZGVzdGluYXRpb24uZW5kcG9pbnR9XCIgaXMgb24gNDMxOCwgdGhlIE9UTFAvSFRUUCBwb3J0LCBidXQgYCArXG4gICAgICAgICAgJ2BlbmRwb2ludGAgY29uZmlndXJlcyB0aGUgZ1JQQyBleHBvcnRlciAoY29udmVudGlvbmFsbHkgNDMxNykuIElmIHRoYXQgaXMgYW4gT1RMUC9IVFRQIGNvbGxlY3RvciwgJyArXG4gICAgICAgICAgJ3Bhc3MgaXQgYXMgYGh0dHBFbmRwb2ludDogXCJodHRwOi8vaG9zdDo0MzE4XCJgIGluc3RlYWQg4oCUIHRoZSBnUlBDIGV4cG9ydGVyIHdpbGwgZXhwb3J0IG5vdGhpbmcgdG8gaXQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5kZXN0aW5hdGlvbi5odHRwRW5kcG9pbnQ/LmVuZHNXaXRoKCc6NDMxNycpKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoXG4gICAgICAgICdAb2RpZ29zL2F3cy1jZGs6cHJvYmFibGVHcnBjRW5kcG9pbnQnLFxuICAgICAgICBgT2RpZ29zOiBkZXN0aW5hdGlvbiBodHRwRW5kcG9pbnQgXCIke3Byb3BzLmRlc3RpbmF0aW9uLmh0dHBFbmRwb2ludH1cIiBpcyBvbiA0MzE3LCB0aGUgT1RMUC9nUlBDIHBvcnQsIGAgK1xuICAgICAgICAgICdidXQgYGh0dHBFbmRwb2ludGAgY29uZmlndXJlcyB0aGUgSFRUUCBleHBvcnRlciAoY29udmVudGlvbmFsbHkgNDMxOCkuIElmIHRoYXQgaXMgYSBnUlBDIGNvbGxlY3RvciwgJyArXG4gICAgICAgICAgJ3Bhc3MgaXQgYXMgYGVuZHBvaW50OiBcImhvc3Q6NDMxN1wiYCBpbnN0ZWFkLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZm4gb2YgcHJvcHMuZnVuY3Rpb25zID8/IFtdKSB7XG4gICAgICB0aGlzLmluc3RydW1lbnQoZm4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0cnVtZW50cyBvbmUgZnVuY3Rpb24uIElkZW1wb3RlbnQg4oCUIGluc3RydW1lbnRpbmcgdGhlIHNhbWUgZnVuY3Rpb24gdHdpY2UgaXMgYSBuby1vcCByYXRoZXIgdGhhbiBhXG4gICAqIGRvdWJsZWQgbG9hZGVyIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGluc3RydW1lbnQoZm46IGxhbWJkYS5GdW5jdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IGZuLm5vZGUucGF0aDtcbiAgICBpZiAodGhpcy5pbnN0cnVtZW50ZWQuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBydW50aW1lTmFtZSA9IGZuLnJ1bnRpbWUubmFtZTtcbiAgICBjb25zdCBsYW5ndWFnZSA9IGxhbmd1YWdlRnJvbVJ1bnRpbWUocnVudGltZU5hbWUpO1xuICAgIGlmICghbGFuZ3VhZ2UpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICBgT2RpZ29zOiBydW50aW1lIFwiJHtydW50aW1lTmFtZX1cIiBoYXMgbm8gT3BlblRlbGVtZXRyeSBMYW1iZGEgbGF5ZXIgYCArXG4gICAgICAgICcodXBzdHJlYW0gcHVibGlzaGVzIGxheWVycyBmb3IgcHl0aG9uLCBub2RlanMsIGphdmEgYW5kIHJ1Ynkgb25seSksIHNvIHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGluc3RydW1lbnRlZC4nO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5za2lwVW5zdXBwb3J0ZWRSdW50aW1lcykge1xuICAgICAgICBBbm5vdGF0aW9ucy5vZihmbikuYWRkV2FybmluZ1YyKCdAb2RpZ29zL2F3cy1jZGs6dW5zdXBwb3J0ZWRSdW50aW1lJywgYCR7bWVzc2FnZX0gU2tpcHBpbmcuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHttZXNzYWdlfSBTZXQgc2tpcFVuc3VwcG9ydGVkUnVudGltZXM6IHRydWUgdG8gc2tpcCBpdCBpbnN0ZWFkLmApO1xuICAgIH1cblxuICAgIHRoaXMuaW5zdHJ1bWVudGVkLmFkZChrZXkpO1xuXG4gICAgY29uc3QgYXJjaGl0ZWN0dXJlID0gZm4uYXJjaGl0ZWN0dXJlLm5hbWU7XG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLm9wdGlvbnMubGF5ZXJWZXJzaW9uID8/IHRoaXMucmVzb2x2ZXIucmVzb2x2ZShsYW5ndWFnZSwgYXJjaGl0ZWN0dXJlKTtcbiAgICBmbi5hZGRMYXllcnMobGF5ZXIpO1xuXG4gICAgLy8gVGhlIEFSTiwgbm90IHRoZSBjb25zdHJ1Y3Q6IHRoZSBtYXJrZXIgaGFzIHRvIG5hbWUgdGhlIGV4YWN0IGxheWVyIHZlcnNpb24gdGhlIGZ1bmN0aW9uIGNhcnJpZXMsIGFuZFxuICAgIC8vIGluIElOX0FDQ09VTlQgbW9kZSB0aGF0IGlzIGEgbmVzdGVkLXN0YWNrIG91dHB1dCByZWZlcmVuY2UgcmVzb2x2ZWQgYXQgZGVwbG95IHRpbWUuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW52aXJvbm1lbnRGb3IoZm4sIGxhbmd1YWdlLCBsYXllci5sYXllclZlcnNpb25Bcm4pKSkge1xuICAgICAgZm4uYWRkRW52aXJvbm1lbnQobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBJbnN0cnVtZW50cyBldmVyeSBmdW5jdGlvbiBpbiB0aGUgbGlzdC4gKi9cbiAgcHVibGljIGluc3RydW1lbnRBbGwoZnVuY3Rpb25zOiBsYW1iZGEuRnVuY3Rpb25bXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZm4gb2YgZnVuY3Rpb25zKSB7XG4gICAgICB0aGlzLmluc3RydW1lbnQoZm4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZW52aXJvbm1lbnQgYXBwbGllZCB0byBvbmUgZnVuY3Rpb24uXG4gICAqXG4gICAqIE1pcnJvcnMgYGFwcGx5SGFuZGxlckVudmAgLyBgYXBwbHlXZWJTZXJ2ZXJFbnZgIGluIHRoZSBjb25uZWN0b3IsIGluY2x1ZGluZyB3aGF0IGlzIGRlbGliZXJhdGVseSBOT1RcbiAgICogc2V0OiBgT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UYCBzdGF5cyB1bnNldCBzbyB0aGUgU0RLIGtlZXBzIGV4cG9ydGluZyB0byB0aGUgaW4tTGFtYmRhIGNvbGxlY3RvclxuICAgKiBvbiBsb2NhbGhvc3QgcmF0aGVyIHRoYW4gYmxvY2tpbmcgdGhlIGludm9jYXRpb24gb24gdGhlIHJlbW90ZSBkZXN0aW5hdGlvbiwgYW5kIGFuIGVuYWJsZWQgc2lnbmFsJ3NcbiAgICogYE9URUxfKl9FWFBPUlRFUmAgc3RheXMgdW5zZXQgYmVjYXVzZSBgb3RscGAgaXMgYWxyZWFkeSB0aGUgU0RLIGRlZmF1bHQuXG4gICAqL1xuICBwcml2YXRlIGVudmlyb25tZW50Rm9yKGZuOiBsYW1iZGEuRnVuY3Rpb24sIGxhbmd1YWdlOiBzdHJpbmcsIGxheWVyQXJuOiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCB7IGRlc3RpbmF0aW9uLCBtb2RlLCBkZWJ1Zywgc2VydmljZU5hbWUsIGphdmFIYW5kbGVyRGlzdHJvLCBkaXN0cm8sIGV4aXN0aW5nTG9hZGVyVmFsdWUgfSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCB3ZWJTZXJ2ZXIgPSBtb2RlID09PSBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLldFQl9TRVJWRVI7XG5cbiAgICBjb25zdCBlbnY6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICBbRU5WX1NFUlZJQ0VfTkFNRV06IHNlcnZpY2VOYW1lID8/IGRlZmF1bHRTZXJ2aWNlTmFtZShmbiksXG4gICAgICBbRU5WX0NPTExFQ1RPUl9DT05GSUdfVVJJXTogdGhpcy5jb2xsZWN0b3JDb25maWcsXG4gICAgICBbRU5WX0lBQ19NQVJLRVJdOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHY6IE1BUktFUl9WRVJTSU9OLFxuICAgICAgICBzb3VyY2U6ICdjZGsnLFxuICAgICAgICB2ZXJzaW9uOiBPRElHT1NfVkVSU0lPTiB8fCAndW5yZWxlYXNlZCcsXG4gICAgICAgIGxheWVyOiBsYXllckFybixcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICBjb25zdCBzZWxlY3RlZFdyYXBwZXIgPSBkaXN0cmlidXRpb25XcmFwcGVyKGxhbmd1YWdlLCBkaXN0cm8sIGphdmFIYW5kbGVyRGlzdHJvLCB3ZWJTZXJ2ZXIpO1xuICAgIGlmICh3ZWJTZXJ2ZXIpIHtcbiAgICAgIC8vIE5vIGV4ZWMgd3JhcHBlcjogdGhlIExhbWJkYSBXZWIgQWRhcHRlciBvd25zIGl0LCBhbmQgb3ZlcndyaXRpbmcgaXQgc3RvcHMgdGhlIGZ1bmN0aW9uIHNlcnZpbmcuXG4gICAgICBPYmplY3QuYXNzaWduKGVudiwgd2ViU2VydmVyRW52KGxhbmd1YWdlLCBleGlzdGluZ0xvYWRlclZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudltFTlZfRVhFQ19XUkFQUEVSXSA9IHNlbGVjdGVkV3JhcHBlcjtcbiAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBlbnZbRU5WX09URUxfTE9HX0xFVkVMXSA9ICdkZWJ1Zyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VwcHJlc3MgdGhlIHNpZ25hbHMgdGhlIGRlc3RpbmF0aW9uIGRvZXMgbm90IGFjY2VwdC4gQSBzaWduYWwgd2l0aCBubyBjb2xsZWN0b3IgcGlwZWxpbmUgaXMgcmVmdXNlZFxuICAgIC8vIGF0IHRoZSByZWNlaXZlciBvbiBldmVyeSBiYXRjaCwgc28gdGVsbGluZyB0aGUgU0RLIG5vdCB0byBwcm9kdWNlIGl0IGlzIHRoZSBoYWxmIHRoYXQgc3RvcHMgdGhlXG4gICAgLy8gZXJyb3IgbG9vcDsgdGhlIHBpcGVsaW5lIGJlaW5nIGFic2VudCBpcyB0aGUgaGFsZiB0aGF0IHN0b3BzIHRoZSBleHBvcnQuXG4gICAgY29uc3QgZW5hYmxlZCA9IHJlc29sdmVkU2lnbmFscyhkZXN0aW5hdGlvbik7XG4gICAgY29uc3Qgb3ZlcnJpZGVzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWRdPiA9IFtcbiAgICAgIFtFTlZfVFJBQ0VTX0VYUE9SVEVSLCBleHBvcnRlck92ZXJyaWRlRm9yKGVuYWJsZWQudHJhY2VzKV0sXG4gICAgICBbRU5WX01FVFJJQ1NfRVhQT1JURVIsIGV4cG9ydGVyT3ZlcnJpZGVGb3IoZW5hYmxlZC5tZXRyaWNzKV0sXG4gICAgICBbRU5WX0xPR1NfRVhQT1JURVIsIGV4cG9ydGVyT3ZlcnJpZGVGb3IoZW5hYmxlZC5sb2dzKV0sXG4gICAgXTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2Ygb3ZlcnJpZGVzKSB7XG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbnZbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW52O1xuICB9XG59XG5cbi8qKlxuICogUHJvcHMgZm9yIHtAbGluayBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdFByb3BzIGV4dGVuZHMgT2RpZ29zSW5zdHJ1bWVudGF0aW9uT3B0aW9ucyB7fVxuXG4vKipcbiAqIEFwcGxpZXMgT2RpZ29zIGluc3RydW1lbnRhdGlvbiB0byBldmVyeSBgbGFtYmRhLkZ1bmN0aW9uYCBpbiBhIHNjb3BlLlxuICpcbiAqIGBgYHRzXG4gKiBBc3BlY3RzLm9mKHN0YWNrKS5hZGQobmV3IE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdChzdGFjaywge1xuICogICBkZXN0aW5hdGlvbjogeyBlbmRwb2ludDogJ290bHAuZXhhbXBsZS5jb206NDMxNycgfSxcbiAqIH0pKTtcbiAqIGBgYFxuICpcbiAqIGBza2lwVW5zdXBwb3J0ZWRSdW50aW1lc2AgZGVmYXVsdHMgdG8gYHRydWVgIGhlcmUsIHVubGlrZSB0aGUgY29uc3RydWN0OiBhbiBhc3BlY3QgdmlzaXRzIGV2ZXJ5IGZ1bmN0aW9uXG4gKiBpbiB0aGUgc2NvcGUsIGluY2x1ZGluZyBvbmVzIHdob3NlIHJ1bnRpbWUgaGFzIG5vIE9wZW5UZWxlbWV0cnkgbGF5ZXIsIGFuZCBmYWlsaW5nIHRoZSB3aG9sZSBzeW50aFxuICogYmVjYXVzZSBhIHN0YWNrIGhhcHBlbnMgdG8gY29udGFpbiBvbmUgR28gZnVuY3Rpb24gaXMgbm90IHVzZWZ1bC4gRWFjaCBza2lwIGlzIHJlcG9ydGVkIGFzIGEgc3ludGhcbiAqIHdhcm5pbmcsIHNvIGl0IGlzIHZpc2libGUgcmF0aGVyIHRoYW4gc2lsZW50LlxuICpcbiAqIFRoZSBhc3BlY3QgaW5zdHJ1bWVudHMgd2hhdCBleGlzdHMgaW4gdGhlIHRyZWUgd2hlbiBpdCBydW5zLiBBIGZ1bmN0aW9uIGFkZGVkIGJ5IGEgbGF0ZXIgYXNwZWN0IGlzIG5vdFxuICogdmlzaXRlZDsgdXNlIHRoZSBjb25zdHJ1Y3QgZGlyZWN0bHkgZm9yIHRob3NlLlxuICovXG5leHBvcnQgY2xhc3MgT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0IGltcGxlbWVudHMgSUFzcGVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdHJ1bWVudGF0aW9uOiBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb247XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzY29wZSB3aGVyZSB0aGUgc2hhcmVkIGxheWVyIGNvbnN0cnVjdHMgYXJlIGNyZWF0ZWQuIFVzdWFsbHkgdGhlIHNhbWUgc2NvcGUgdGhlIGFzcGVjdCBpc1xuICAgKiBhcHBsaWVkIHRvLiBJdCBpcyBhIHNlcGFyYXRlIGFyZ3VtZW50IGZyb20gdGhlIHZpc2l0ZWQgbm9kZXMgYmVjYXVzZSB0aGUgbGF5ZXIgKGFuZCwgaW4gYElOX0FDQ09VTlRgXG4gICAqIG1vZGUsIHRoZSBuZXN0ZWQgU0FSIGFwcGxpY2F0aW9uKSBpcyBjcmVhdGVkIG9uY2UgYW5kIHNoYXJlZCBieSBldmVyeSBmdW5jdGlvbiB0aGUgYXNwZWN0IHZpc2l0cy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIHByb3BzOiBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3RQcm9wcykge1xuICAgIHRoaXMuaW5zdHJ1bWVudGF0aW9uID0gbmV3IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvbihzY29wZSwgJ09kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdCcsIHtcbiAgICAgIHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzOiB0cnVlLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdmlzaXQobm9kZTogSUNvbnN0cnVjdCk6IHZvaWQge1xuICAgIGlmIChub2RlIGluc3RhbmNlb2YgbGFtYmRhLkZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLmluc3RydW1lbnRhdGlvbi5pbnN0cnVtZW50KG5vZGUpO1xuICAgIH1cbiAgfVxufVxuIl19
245
+ OdigosInstrumentationAspect[_b] = { fqn: "@odigos/aws-cdk.OdigosInstrumentationAspect", version: "0.0.19" };
246
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUF1RTtBQUN2RSxpREFBaUQ7QUFDakQsMkNBQTJDO0FBQzNDLDJDQUFtRDtBQUNuRCx5REFHNEI7QUFDNUIscURBQXVEO0FBQ3ZELHVDQUF5RjtBQUN6RixtQ0FLaUI7QUFFakIsMkVBQTJFO0FBQzNFLE1BQU0sZ0JBQWdCLEdBQUcseUJBQXlCLENBQUM7QUFDbkQsa0VBQWtFO0FBQ2xFLDhGQUE4RjtBQUM5RixNQUFNLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDO0FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILFNBQVMsa0JBQWtCLENBQUMsRUFBbUI7SUFDN0MsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUE4QyxDQUFDO0lBQ25FLE1BQU0sUUFBUSxHQUFHLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4RixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNyRixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBeUhEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILE1BQWEsMkJBQTRCLFNBQVEsc0JBQVM7SUFLeEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF1QztRQUMvRSxLQUFLLENBQUMsS0FBSyxF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TCxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQWdCO1FBQzNCLElBQUksSUFBSSxZQUFZLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxDQUFDO0lBQ0gsQ0FBQzs7QUFuQkgsa0VBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbnMsIElBc3BlY3QsIFN0YWNrLCBUb2tlbiwgVGFncyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZWRTaWduYWxzLFxuICByZW5kZXJDb2xsZWN0b3JDb25maWcsXG59IGZyb20gJy4vY29sbGVjdG9yLWNvbmZpZyc7XG5pbXBvcnQgeyBPZGlnb3NMYXllclJlc29sdmVyIH0gZnJvbSAnLi9sYXllci1yZXNvbHZlcic7XG5pbXBvcnQgeyBkaXN0cmlidXRpb25SZWNpcGUsIGRpc3RyaWJ1dGlvbldyYXBwZXIsIGxhbmd1YWdlRnJvbVJ1bnRpbWUgfSBmcm9tICcuL3J1bnRpbWUnO1xuaW1wb3J0IHtcbiAgT2RpZ29zRGVzdGluYXRpb24sXG4gIE9kaWdvc0luc3RydW1lbnRhdGlvbk1vZGUsXG4gIE9kaWdvc0phdmFIYW5kbGVyRGlzdHJvLFxuICBPZGlnb3NMYXllclNvdXJjZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKiBgQVdTX0xBTUJEQV9FWEVDX1dSQVBQRVJgIOKAlCB0aGUgbGF5ZXIncyBlbnRyeSBwb2ludCBpbiBoYW5kbGVyIG1vZGUuICovXG5jb25zdCBFTlZfRVhFQ19XUkFQUEVSID0gJ0FXU19MQU1CREFfRVhFQ19XUkFQUEVSJztcbi8qKiBTZXJ2aWNlIG5hbWUgcmVwb3J0ZWQgb24gZXZlcnkgc3BhbiwgbWV0cmljIGFuZCBsb2cgcmVjb3JkLiAqL1xuLyoqIENvbXBhY3QgU0RLIGFuZCBkZXN0aW5hdGlvbiBzZXR0aW5nczsgYWxsIGF0dHJpYnV0aW9uIG1hcmtlcnMgYXJlIExhbWJkYSByZXNvdXJjZSB0YWdzLiAqL1xuY29uc3QgRU5WX0xBTUJEQV9DT05GSUcgPSAnT0RJR09TX0xBTUJEQV9DT05GSUcnO1xuXG4vKipcbiAqIFRoZSBzZXJ2aWNlIGEgZnVuY3Rpb24gcmVwb3J0cyBhcywgd2hlbiB0aGUgY2FsbGVyIGhhcyBub3QgbmFtZWQgb25lLlxuICpcbiAqIFJFQUQgRlJPTSBUSEUgTDEsIE5PVCBGUk9NIGBmbi5mdW5jdGlvbk5hbWVgLiBUaGUgTDIgcHJvcGVydHkgaXMgYSBjcm9zcy1lbnZpcm9ubWVudC1hd2FyZSB0b2tlbiB0aGF0XG4gKiByZXNvbHZlcyB0byBhIGBSZWZgIHRvIHRoZSBmdW5jdGlvbiBpdHNlbGYgZXZlbiB3aGVuIHRoZSBzdGFjayBzZXQgYGZ1bmN0aW9uTmFtZWAgZXhwbGljaXRseSDigJQgc28gdGhlXG4gKiBvYnZpb3VzIGBTdGFjay5vZihmbikucmVzb2x2ZShmbi5mdW5jdGlvbk5hbWUpYCBuZXZlciB5aWVsZHMgYSBsaXRlcmFsLCBhbmQgZXZlcnkgZnVuY3Rpb24gc2lsZW50bHkgZmVsbFxuICogYmFjayB0byBpdHMgY29uc3RydWN0IGlkLiBgQ2ZuRnVuY3Rpb24uZnVuY3Rpb25OYW1lYCBpcyB0aGUgcmF3IHRlbXBsYXRlIHZhbHVlOiB0aGUgbGl0ZXJhbCB0aGUgc3RhY2tcbiAqIHBhc3NlZCwgb3IgdW5kZWZpbmVkIHdoZW4gQ2xvdWRGb3JtYXRpb24gZ2VuZXJhdGVzIHRoZSBuYW1lLlxuICpcbiAqIFdoeSB0aGUgZmFsbGJhY2sgaXMgdGhlIGNvbnN0cnVjdCBpZCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJhdGVkIG5hbWU6IGEgZ2VuZXJhdGVkIG5hbWUgaXMgYSBgUmVmYCB0byB0aGVcbiAqIGZ1bmN0aW9uLCBhbmQgcHV0dGluZyB0aGF0IGluIHRoZSBmdW5jdGlvbidzIG93biBlbnZpcm9ubWVudCBtYWtlcyB0aGUgcmVzb3VyY2UgZGVwZW5kIG9uIGl0cyBvd25cbiAqIGNyZWF0aW9uIOKAlCBDbG91ZEZvcm1hdGlvbiByZWplY3RzIHRoZSB0ZW1wbGF0ZSB3aXRoIGEgZGVwZW5kZW5jeSBjeWNsZSwgYXQgZGVwbG95IHRpbWUuXG4gKlxuICogVGhpcyBtYXR0ZXJzIGJleW9uZCBjb3NtZXRpY3MuIFRoZSBjb25uZWN0b3IgY29tcGFyZXMgYE9URUxfU0VSVklDRV9OQU1FYCBhZ2FpbnN0IHRoZSB3b3JrbG9hZCdzIG5hbWUgaW5cbiAqIE9kaWdvcywgd2hpY2ggaXMgdGhlIHJlYWwgQVdTIGZ1bmN0aW9uIG5hbWUsIHNvIGEgZnVuY3Rpb24gcmVwb3J0aW5nIGl0cyBjb25zdHJ1Y3QgaWQgaXMgcmVwb3J0ZWQgYXNcbiAqIGRyaWZ0ZWQgb24gdGhlIHNlcnZpY2UtbmFtZSBjb21wb25lbnQuIE5hbWluZyB0aGUgZnVuY3Rpb24gaW4geW91ciBzdGFjayBpcyBub3cgZW5vdWdoIHRvIGxpbmUgdGhlIHR3b1xuICogdXA7IGEgZnVuY3Rpb24gd2hvc2UgbmFtZSBDbG91ZEZvcm1hdGlvbiBnZW5lcmF0ZXMgc3RpbGwgbmVlZHMgYHNlcnZpY2VOYW1lYCBwYXNzZWQgZXhwbGljaXRseS5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdFNlcnZpY2VOYW1lKGZuOiBsYW1iZGEuRnVuY3Rpb24pOiBzdHJpbmcge1xuICBjb25zdCBjZm4gPSBmbi5ub2RlLmRlZmF1bHRDaGlsZCBhcyBsYW1iZGEuQ2ZuRnVuY3Rpb24gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc29sdmVkID0gY2ZuID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdGFjay5vZihmbikucmVzb2x2ZShjZm4uZnVuY3Rpb25OYW1lKTtcbiAgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gJ3N0cmluZycgJiYgcmVzb2x2ZWQgIT09ICcnICYmICFUb2tlbi5pc1VucmVzb2x2ZWQocmVzb2x2ZWQpKSB7XG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG4gIHJldHVybiBmbi5ub2RlLmlkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgc2hhcmVkIGJ5IHRoZSBjb25zdHJ1Y3QgYW5kIHRoZSBhc3BlY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2RpZ29zSW5zdHJ1bWVudGF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgaW4tTGFtYmRhIGNvbGxlY3RvciBleHBvcnRzIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb246IE9kaWdvc0Rlc3RpbmF0aW9uO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgT2RpZ29zIGxheWVyIGNvbWVzIGZyb20uXG4gICAqXG4gICAqIEBkZWZhdWx0IE9kaWdvc0xheWVyU291cmNlLk9ESUdPU19QVUJMSUNcbiAgICovXG4gIHJlYWRvbmx5IGxheWVyU291cmNlPzogT2RpZ29zTGF5ZXJTb3VyY2U7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgbW9kZSBvciB3ZWItc2VydmVyIChMYW1iZGEgV2ViIEFkYXB0ZXIpIG1vZGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGF1dG8tZGV0ZWN0aW9uLCBhbmQgdGhhdCBpcyBkZWxpYmVyYXRlIHJhdGhlciB0aGFuIGFuIG9taXNzaW9uOiBkZXRlY3RpbmcgdGhlIHdlYiBhZGFwdGVyXG4gICAqIG1lYW5zIGluc3BlY3RpbmcgdGhlIGZ1bmN0aW9uJ3Mgb3RoZXIgbGF5ZXJzLCB3aGljaCBhdCBzeW50aCB0aW1lIGFyZSBmcmVxdWVudGx5IHVucmVzb2x2ZWQgdG9rZW5zLlxuICAgKiBBIGRldGVjdG9yIHRoYXQgaXMgcmlnaHQgbW9zdCBvZiB0aGUgdGltZSB3b3VsZCBzaWxlbnRseSBicmVhayB0aGUgZnVuY3Rpb25zIGl0IGdvdCB3cm9uZy5cbiAgICpcbiAgICogQGRlZmF1bHQgT2RpZ29zSW5zdHJ1bWVudGF0aW9uTW9kZS5IQU5ETEVSXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogT2RpZ29zSW5zdHJ1bWVudGF0aW9uTW9kZTtcblxuICAvKipcbiAgICogQ29ubmVjdG9yIEdyYXBoUUwgZGlzdHJvIG5hbWUsIHN1Y2ggYXMgamF2YS1sYW1iZGEtb3RlbC1hZ2VudCBvciBqYXZhLWxhbWJkYS1vdGVsLXdyYXBwZXIuXG4gICAqIEBkZWZhdWx0IC0gdGhlIGJ1bmRsZWQgZGVmYXVsdCBkaXN0cmlidXRpb24gZm9yIHRoZSBmdW5jdGlvbidzIHJ1bnRpbWVcbiAgICovXG4gIHJlYWRvbmx5IGRpc3Rybz86IHN0cmluZztcblxuICAvKipcbiAgICogTGVnYWN5IGxpZ2h0d2VpZ2h0IEphdmEgaGFuZGxlciBhZGFwdGVyLlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgamF2YS1sYW1iZGEtb3RlbC0qLXdyYXBwZXIgZGlzdHJvLlxuICAgKi9cbiAgcmVhZG9ubHkgamF2YUhhbmRsZXJEaXN0cm8/OiBPZGlnb3NKYXZhSGFuZGxlckRpc3RybztcblxuICAvKipcbiAgICogYE9URUxfU0VSVklDRV9OQU1FYCBmb3IgZXZlcnkgZnVuY3Rpb24gdGhpcyBpbnN0cnVtZW50cy5cbiAgICpcbiAgICogVXN1YWxseSB3cm9uZyB0byBzZXQgd2hlbiBpbnN0cnVtZW50aW5nIG1vcmUgdGhhbiBvbmUgZnVuY3Rpb24g4oCUIHRoZXkgd291bGQgYWxsIHJlcG9ydCBhcyB0aGUgc2FtZVxuICAgKiBzZXJ2aWNlLlxuICAgKlxuICAgKiBMZWZ0IHVuc2V0LCBhIGZ1bmN0aW9uIHJlcG9ydHMgYXMgaXRzIGV4cGxpY2l0bHktc2V0IHBoeXNpY2FsIG5hbWUgaWYgaXQgaGFzIG9uZSwgYW5kIG90aGVyd2lzZSBhc1xuICAgKiBpdHMgY29uc3RydWN0IGlkLiBJdCBkZWxpYmVyYXRlbHkgZG9lcyBub3QgZGVmYXVsdCB0byB0aGUgZ2VuZXJhdGVkIHBoeXNpY2FsIG5hbWU6IHRoYXQgdmFsdWUgaXMgYVxuICAgKiBgUmVmYCB0byB0aGUgZnVuY3Rpb24gaXRzZWxmLCBhbmQgYSBmdW5jdGlvbiByZWZlcmVuY2luZyBpdHNlbGYgaW4gaXRzIG93biBlbnZpcm9ubWVudCBpcyBhXG4gICAqIENsb3VkRm9ybWF0aW9uIGRlcGVuZGVuY3kgY3ljbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGZ1bmN0aW9uJ3MgcGh5c2ljYWwgbmFtZSBpZiBleHBsaWNpdGx5IHNldCwgb3RoZXJ3aXNlIGl0cyBjb25zdHJ1Y3QgaWRcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSYWlzZSBpbi1mdW5jdGlvbiBPcGVuVGVsZW1ldHJ5IHZlcmJvc2l0eSAoYE9URUxfTE9HX0xFVkVMPWRlYnVnYCkuXG4gICAqXG4gICAqIFRoZSBsYXllciwgU0RLIGFuZCBjb2xsZWN0b3IgdGhlbiBlbWl0IHNwYW4gYW5kIE9UTFAtZXhwb3J0IGRpYWdub3N0aWNzIGludG8gdGhlIGZ1bmN0aW9uJ3MgQ2xvdWRXYXRjaFxuICAgKiBsb2cgZ3JvdXAuIFVzZWZ1bCB3aGlsZSB3aXJpbmcgdXAgYSBkZXN0aW5hdGlvbiwgZXhwZW5zaXZlIHRvIGxlYXZlIG9uLlxuICAgKlxuICAgKiBIYXMgbm8gZWZmZWN0IGluIHdlYi1zZXJ2ZXIgbW9kZSwgbWF0Y2hpbmcgdGhlIGNvbm5lY3Rvciwgd2hpY2ggbmV2ZXIgc2V0cyBhIGxvZyBsZXZlbCB0aGVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRlYnVnPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQXR0YWNoIHRoaXMgbGF5ZXIgaW5zdGVhZCBvZiByZXNvbHZpbmcgb25lLiBPdmVycmlkZXMgYGxheWVyU291cmNlYCBlbnRpcmVseS5cbiAgICpcbiAgICogVGhlIGVzY2FwZSBoYXRjaCBmb3IgYSBsYXllciBtaXJyb3JlZCBpbnRvIGEgcHJpdmF0ZSByZWdpc3RyeSBvciBhbiBpbnRlcm5hbCBhY2NvdW50LiBUaGUgbGF5ZXIgbXVzdFxuICAgKiBoYXZlIHRoZSBzYW1lIGNvbnRlbnRzIGFzIHRoZSBPZGlnb3Mgb25lIOKAlCB0aGUgZW52aXJvbm1lbnQgc2V0IGhlcmUgYXNzdW1lcyBpdHMgZXhhY3Qgc2NyaXB0IGxheW91dC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSByZXNvbHZlZCBmcm9tIGxheWVyU291cmNlXG4gICAqL1xuICByZWFkb25seSBsYXllclZlcnNpb24/OiBsYW1iZGEuSUxheWVyVmVyc2lvbjtcblxuICAvKipcbiAgICogQXJjaGl0ZWN0dXJlLW1hdGNoZWQgY29sbGVjdG9yIGxheWVyIHdoZW4gc3VwcGx5aW5nIGEgY3VzdG9tIEFET1QgU0RLIGxheWVyLlxuICAgKiBVcHN0cmVhbSBTREsgbGF5ZXJzIGFscmVhZHkgaW5jbHVkZSB0aGVpciBjb2xsZWN0b3IgYW5kIGRvIG5vdCB1c2UgdGhpcyBvcHRpb24uXG4gICAqIEBkZWZhdWx0IC0gcmVzb2x2ZWQgZnJvbSBsYXllclNvdXJjZSBmb3IgQURPVFxuICAgKi9cbiAgcmVhZG9ubHkgY29sbGVjdG9yTGF5ZXJWZXJzaW9uPzogbGFtYmRhLklMYXllclZlcnNpb247XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0aGUgZnVuY3Rpb24gYWxyZWFkeSBuZWVkcyBpbiBpdHMgbGFuZ3VhZ2UgbG9hZGVyIHZhcmlhYmxlIChgTk9ERV9PUFRJT05TYCxcbiAgICogYEpBVkFfVE9PTF9PUFRJT05TYCBvciBgUFlUSE9OUEFUSGApLCB3aGljaCB0aGUgT2RpZ29zIGxvYWRlciBpcyBqb2luZWQgdG8gcmF0aGVyIHRoYW4gcmVwbGFjaW5nLlxuICAgKlxuICAgKiBPbmx5IHVzZWQgaW4gd2ViLXNlcnZlciBtb2RlLiBJdCBoYXMgdG8gYmUgcGFzc2VkIGV4cGxpY2l0bHkgYmVjYXVzZSBDREsncyBgbGFtYmRhLkZ1bmN0aW9uYCBleHBvc2VzXG4gICAqIG5vIHdheSB0byByZWFkIGJhY2sgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0IGVsc2V3aGVyZSBpbiB0aGUgYXBwIOKAlCBhbiBvbWl0dGVkIHZhbHVlIGhlcmUgaXNcbiAgICogc2lsZW50bHkgb3ZlcndyaXR0ZW4sIHdoaWNoIGZvciBgTk9ERV9PUFRJT05TYCBjYW4gbWVhbiBsb3NpbmcgYSBmbGFnIHRoZSBhcHAgbmVlZHMgdG8gYm9vdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgbG9hZGVyIHZhcmlhYmxlIGlzIHNldCB0byB0aGUgT2RpZ29zIHZhbHVlIGFsb25lXG4gICAqL1xuICByZWFkb25seSBleGlzdGluZ0xvYWRlclZhbHVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTa2lwIGZ1bmN0aW9ucyB3aG9zZSBydW50aW1lIGhhcyBubyBPcGVuVGVsZW1ldHJ5IExhbWJkYSBsYXllciBpbnN0ZWFkIG9mIHRocm93aW5nLlxuICAgKlxuICAgKiBgZG90bmV0KmAgYW5kIGBwcm92aWRlZC4qYCAoR28sIGN1c3RvbSBydW50aW1lcykgaGF2ZSBubyBsYW5ndWFnZSBsYXllciB1cHN0cmVhbS4gRXhwbGljaXRseVxuICAgKiBpbnN0cnVtZW50aW5nIG9uZSBpcyBhIG1pc3Rha2Ugd29ydGggZmFpbGluZyBvbjsgc3dlZXBpbmcgYSB3aG9sZSBzdGFjayB3aXRoIHRoZSBhc3BlY3QgYW5kIGhpdHRpbmdcbiAgICogb25lIGlzIG5vdCwgd2hpY2ggaXMgd2h5IHRoZSBhc3BlY3QgZGVmYXVsdHMgdGhpcyB0byBgdHJ1ZWAgYW5kIHRoZSBjb25zdHJ1Y3QgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm9wcyBmb3Ige0BsaW5rIE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uUHJvcHMgZXh0ZW5kcyBPZGlnb3NJbnN0cnVtZW50YXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEZ1bmN0aW9ucyB0byBpbnN0cnVtZW50IG9uIGNvbnN0cnVjdGlvbi4gTW9yZSBjYW4gYmUgYWRkZWQgd2l0aCBgaW5zdHJ1bWVudCgpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbnM/OiBsYW1iZGEuRnVuY3Rpb25bXTtcbn1cblxuLyoqXG4gKiBJbnN0cnVtZW50cyBBV1MgTGFtYmRhIGZ1bmN0aW9ucyB3aXRoIHRoZSBPZGlnb3MgT3BlblRlbGVtZXRyeSBsYXllci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3Qgb2RpZ29zID0gbmV3IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvbih0aGlzLCAnT2RpZ29zJywge1xuICogICBkZXN0aW5hdGlvbjogeyBlbmRwb2ludDogJ290bHAuZXhhbXBsZS5jb206NDMxNycgfSxcbiAqICAgZnVuY3Rpb25zOiBbYXBpRm4sIHdvcmtlckZuXSxcbiAqIH0pO1xuICogb2RpZ29zLmluc3RydW1lbnQoYW5vdGhlckZuKTtcbiAqIGBgYFxuICpcbiAqIFdoYXQgaXQgZG9lcyB0byBlYWNoIGZ1bmN0aW9uOiBhdHRhY2hlcyB0aGUgbGF5ZXIgZm9yIHRoZSBmdW5jdGlvbidzIGxhbmd1YWdlIGFuZCBhcmNoaXRlY3R1cmUsIHNldHNcbiAqIGBBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUmAgYW5kIGNvbXBhY3QgYE9ESUdPU19MQU1CREFfQ09ORklHYC4gVGhlIGxheWVyIGJ1aWxkcyB0aGUgU0RLIGVudmlyb25tZW50IGFuZFxuICogY29sbGVjdG9yIHBpcGVsaW5lcyBhdCBzdGFydHVwOyBvd25lcnNoaXAgYW5kIGV4YWN0IGxheWVyIGF0dHJpYnV0aW9uIGFyZSByZWNvcmRlZCBpbiByZXNvdXJjZSB0YWdzLlxuICpcbiAqIFRoZSBmdW5jdGlvbidzIFNESyBleHBvcnRzIHRvIHRoZSBjb2xsZWN0b3Igb24gbG9jYWxob3N0LCBub3QgdG8geW91ciBkZXN0aW5hdGlvbi4gVGhlIGNvbGxlY3RvclxuICogZm9yd2FyZHMgYWZ0ZXIgdGhlIGhhbmRsZXIgaGFzIGFscmVhZHkgcmV0dXJuZWQsIHNvIGEgc2xvdyBkZXN0aW5hdGlvbiBjb3N0cyBiaWxsZWQgZHVyYXRpb24gcmF0aGVyXG4gKiB0aGFuIGNhbGxlciBsYXRlbmN5LlxuICpcbiAqICMjIERvIG5vdCBhbHNvIGluc3RydW1lbnQgdGhlc2UgZnVuY3Rpb25zIHdpdGggdGhlIGNvbm5lY3RvclxuICpcbiAqIFRoZSBPZGlnb3MgQVdTIGNvbm5lY3RvciBpbnN0cnVtZW50cyBsaXZlIGZ1bmN0aW9ucyBieSBtdXRhdGluZyB0aGVtLCBhbmQgcmVjb25jaWxlcyB0aGVtIGJhY2sgdG8gaXRzXG4gKiBvd24gZGVzaXJlZCBzdGF0ZSBvbiBldmVyeSBwYXNzLiBBIGZ1bmN0aW9uIGluc3RydW1lbnRlZCBoZXJlIGFuZCBhbHNvIGVuYWJsZWQgYXMgYSBjb25uZWN0b3Igc291cmNlXG4gKiBlbmRzIHVwIG93bmVkIGJ5IGJvdGg6IGVhY2ggYGNkayBkZXBsb3lgIHJlYXNzZXJ0cyB0aGUgQ0RLJ3MgZW52aXJvbm1lbnQsIGVhY2ggcmVjb25jaWxlIHJlYXNzZXJ0cyB0aGVcbiAqIGNvbm5lY3RvcidzLCBhbmQgZXZlcnkgcm91bmQgdHJpcCBwdWJsaXNoZXMgYSBuZXcgZnVuY3Rpb24gdmVyc2lvbi5cbiAqXG4gKiBDaG9vc2Ugb25lIHBlciBmdW5jdGlvbi4gVGhpcyBjb25zdHJ1Y3Qgd3JpdGVzIGBvZGlnb3M6aWFjYCByZXNvdXJjZSB0YWdzIGFuZCBuZXZlciB0aGUgY29ubmVjdG9yJ3MgYG9kaWdvczptYW5hZ2VkYFxuICogb3duZXJzaGlwIHRhZywgc28gYW4gSWFDLWluc3RydW1lbnRlZCBmdW5jdGlvbiByZXBvcnRzIGFzIGluc3RydW1lbnRlZCBidXQgaXMgbm90IG9uZSB0aGUgY29ubmVjdG9yXG4gKiB3aWxsIHJvbGwgYmFjayDigJQgdGhvdWdoIGl0IHdpbGwgaGFwcGlseSB0YWtlIGl0IG92ZXIgaWYgeW91IGVuYWJsZSBpdCBhcyBhIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvbiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogT2RpZ29zSW5zdHJ1bWVudGF0aW9uT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSByZXNvbHZlcjogT2RpZ29zTGF5ZXJSZXNvbHZlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0cnVtZW50ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5vcHRpb25zID0gcHJvcHM7XG4gICAgdGhpcy5yZXNvbHZlciA9IG5ldyBPZGlnb3NMYXllclJlc29sdmVyKHRoaXMsIHByb3BzLmxheWVyU291cmNlID8/IE9kaWdvc0xheWVyU291cmNlLk9ESUdPU19QVUJMSUMpO1xuXG4gICAgLy8gUmVuZGVyZWQgb25jZS4gSXQgZGVwZW5kcyBvbmx5IG9uIHRoZSBkZXN0aW5hdGlvbiwgYW5kIHJlbmRlcmluZyBpdCBwZXIgZnVuY3Rpb24gd291bGQgbWFrZSBhblxuICAgIC8vIGFjY2lkZW50YWwgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBmdW5jdGlvbnMgcG9zc2libGUuXG4gICAgcmVuZGVyQ29sbGVjdG9yQ29uZmlnKHByb3BzLmRlc3RpbmF0aW9uKTtcblxuICAgIC8vIEEgd2FybmluZyByYXRoZXIgdGhhbiBhbiBlcnJvciwgYmVjYXVzZSBhIGNvbGxlY3RvciBDQU4gYmUgcmVhY2hlZCBvdmVyIGdSUEMgb24gYSBub24tc3RhbmRhcmQgcG9ydCDigJRcbiAgICAvLyBidXQgdGhlIG92ZXJ3aGVsbWluZ2x5IGxpa2VsaWVyIHJlYWRpbmcgb2YgYGVuZHBvaW50OiBcImhvc3Q6NDMxOFwiYCBpcyBhbiBPVExQL0hUVFAgZW5kcG9pbnQgcGFzc2VkIHRvXG4gICAgLy8gdGhlIGdSUEMgZXhwb3J0ZXIsIHdoaWNoIGJ1aWxkcywgc3RhcnRzLCBhbmQgdGhlbiBuZXZlciBkZWxpdmVycyBhIGJhdGNoLiBTaWxlbnQgZm9yIHRoZSBjYWxsZXIgd2hvXG4gICAgLy8gbWVhbnQgaXQ7IGxvdWQgZm9yIHRoZSBvbmUgd2hvIGRpZCBub3QuXG4gICAgaWYgKHByb3BzLmRlc3RpbmF0aW9uLmVuZHBvaW50Py5lbmRzV2l0aCgnOjQzMTgnKSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQG9kaWdvcy9hd3MtY2RrOnByb2JhYmxlSHR0cEVuZHBvaW50JyxcbiAgICAgICAgYE9kaWdvczogZGVzdGluYXRpb24gZW5kcG9pbnQgXCIke3Byb3BzLmRlc3RpbmF0aW9uLmVuZHBvaW50fVwiIGlzIG9uIDQzMTgsIHRoZSBPVExQL0hUVFAgcG9ydCwgYnV0IGAgK1xuICAgICAgICAgICdgZW5kcG9pbnRgIGNvbmZpZ3VyZXMgdGhlIGdSUEMgZXhwb3J0ZXIgKGNvbnZlbnRpb25hbGx5IDQzMTcpLiBJZiB0aGF0IGlzIGFuIE9UTFAvSFRUUCBjb2xsZWN0b3IsICcgK1xuICAgICAgICAgICdwYXNzIGl0IGFzIGBodHRwRW5kcG9pbnQ6IFwiaHR0cDovL2hvc3Q6NDMxOFwiYCBpbnN0ZWFkIOKAlCB0aGUgZ1JQQyBleHBvcnRlciB3aWxsIGV4cG9ydCBub3RoaW5nIHRvIGl0LicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZGVzdGluYXRpb24uaHR0cEVuZHBvaW50Py5lbmRzV2l0aCgnOjQzMTcnKSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQG9kaWdvcy9hd3MtY2RrOnByb2JhYmxlR3JwY0VuZHBvaW50JyxcbiAgICAgICAgYE9kaWdvczogZGVzdGluYXRpb24gaHR0cEVuZHBvaW50IFwiJHtwcm9wcy5kZXN0aW5hdGlvbi5odHRwRW5kcG9pbnR9XCIgaXMgb24gNDMxNywgdGhlIE9UTFAvZ1JQQyBwb3J0LCBgICtcbiAgICAgICAgICAnYnV0IGBodHRwRW5kcG9pbnRgIGNvbmZpZ3VyZXMgdGhlIEhUVFAgZXhwb3J0ZXIgKGNvbnZlbnRpb25hbGx5IDQzMTgpLiBJZiB0aGF0IGlzIGEgZ1JQQyBjb2xsZWN0b3IsICcgK1xuICAgICAgICAgICdwYXNzIGl0IGFzIGBlbmRwb2ludDogXCJob3N0OjQzMTdcImAgaW5zdGVhZC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZuIG9mIHByb3BzLmZ1bmN0aW9ucyA/PyBbXSkge1xuICAgICAgdGhpcy5pbnN0cnVtZW50KGZuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5zdHJ1bWVudHMgb25lIGZ1bmN0aW9uLiBJZGVtcG90ZW50IOKAlCBpbnN0cnVtZW50aW5nIHRoZSBzYW1lIGZ1bmN0aW9uIHR3aWNlIGlzIGEgbm8tb3AgcmF0aGVyIHRoYW4gYVxuICAgKiBkb3VibGVkIGxvYWRlciB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBpbnN0cnVtZW50KGZuOiBsYW1iZGEuRnVuY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBmbi5ub2RlLnBhdGg7XG4gICAgaWYgKHRoaXMuaW5zdHJ1bWVudGVkLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcnVudGltZU5hbWUgPSBmbi5ydW50aW1lLm5hbWU7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5ndWFnZUZyb21SdW50aW1lKHJ1bnRpbWVOYW1lKTtcbiAgICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgYE9kaWdvczogcnVudGltZSBcIiR7cnVudGltZU5hbWV9XCIgaGFzIG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGAgK1xuICAgICAgICAnKHVwc3RyZWFtIHB1Ymxpc2hlcyBsYXllcnMgZm9yIHB5dGhvbiwgbm9kZWpzLCBqYXZhIGFuZCBydWJ5IG9ubHkpLCBzbyB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBpbnN0cnVtZW50ZWQuJztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2tpcFVuc3VwcG9ydGVkUnVudGltZXMpIHtcbiAgICAgICAgQW5ub3RhdGlvbnMub2YoZm4pLmFkZFdhcm5pbmdWMignQG9kaWdvcy9hd3MtY2RrOnVuc3VwcG9ydGVkUnVudGltZScsIGAke21lc3NhZ2V9IFNraXBwaW5nLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bWVzc2FnZX0gU2V0IHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzOiB0cnVlIHRvIHNraXAgaXQgaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWNpcGUgPSBkaXN0cmlidXRpb25SZWNpcGUobGFuZ3VhZ2UsIHRoaXMub3B0aW9ucy5kaXN0cm8sIHJ1bnRpbWVOYW1lKTtcbiAgICBkaXN0cmlidXRpb25XcmFwcGVyKGxhbmd1YWdlLCB0aGlzLm9wdGlvbnMuZGlzdHJvLCB0aGlzLm9wdGlvbnMuamF2YUhhbmRsZXJEaXN0cm8sIHRoaXMub3B0aW9ucy5tb2RlID09PSBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLldFQl9TRVJWRVIpO1xuICAgIGlmIChyZWNpcGUuYXBwbGljYXRpb25TaWduYWxzICYmICghcmVzb2x2ZWRTaWduYWxzKHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbikudHJhY2VzIHx8ICFyZXNvbHZlZFNpZ25hbHModGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uKS5tZXRyaWNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBRE9UICsgQXBwbGljYXRpb24gU2lnbmFscyByZXF1aXJlcyB0cmFjZXMgYW5kIG1ldHJpY3MgdG8gYmUgZW5hYmxlZCBmb3IgdGhlIGRlc3RpbmF0aW9uLicpO1xuICAgIH1cbiAgICBpZiAocmVjaXBlLmFwcGxpY2F0aW9uU2lnbmFscykge1xuICAgICAgZm4ucm9sZT8uYWRkTWFuYWdlZFBvbGljeShpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ0Nsb3VkV2F0Y2hMYW1iZGFBcHBsaWNhdGlvblNpZ25hbHNFeGVjdXRpb25Sb2xlUG9saWN5JykpO1xuICAgICAgQW5ub3RhdGlvbnMub2YoZm4pLmFkZFdhcm5pbmdWMignQG9kaWdvcy9hd3MtY2RrOmFwcGxpY2F0aW9uU2lnbmFscycsXG4gICAgICAgICdFbmFibGUgQ2xvdWRXYXRjaCBBcHBsaWNhdGlvbiBTaWduYWxzIHNlcnZpY2UgZGlzY292ZXJ5IG9uY2UgaW4gdGhpcyBBV1MgYWNjb3VudCBhbmQgcmVnaW9uLiBBcHBsaWNhdGlvbiBTaWduYWxzIGFsc28gc2VuZHMgQVdTIHNlcnZpY2UgdGVsZW1ldHJ5IHRocm91Z2ggdGhlIExhbWJkYSBlbWJlZGRlZCBhZ2VudC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZT1mbi5ub2RlLmRlZmF1bHRDaGlsZCBhcyBsYW1iZGEuQ2ZuRnVuY3Rpb247XG4gICAgcmVzb3VyY2UuYWRkUHJvcGVydHlEZWxldGlvbk92ZXJyaWRlKCdFbnZpcm9ubWVudC5WYXJpYWJsZXMuT0RJR09TX01BTkFHRUQnKTtcbiAgICByZXNvdXJjZS5hZGRQcm9wZXJ0eURlbGV0aW9uT3ZlcnJpZGUoJ0Vudmlyb25tZW50LlZhcmlhYmxlcy5PRElHT1NfSUFDJyk7XG4gICAgdGhpcy5pbnN0cnVtZW50ZWQuYWRkKGtleSk7XG5cbiAgICBjb25zdCBhcmNoaXRlY3R1cmUgPSBmbi5hcmNoaXRlY3R1cmUubmFtZTtcbiAgICBjb25zdCBsYXllciA9IHRoaXMub3B0aW9ucy5sYXllclZlcnNpb24gPz8gdGhpcy5yZXNvbHZlci5yZXNvbHZlKHJlY2lwZS5hcnRpZmFjdCA/PyBsYW5ndWFnZSwgYXJjaGl0ZWN0dXJlKTtcbiAgICBjb25zdCBjb2xsZWN0b3JMYXllciA9IHJlY2lwZS5hcnRpZmFjdCA/ICh0aGlzLm9wdGlvbnMuY29sbGVjdG9yTGF5ZXJWZXJzaW9uID8/IHRoaXMucmVzb2x2ZXIucmVzb2x2ZSgnYWRvdC1jb2xsZWN0b3InLCBhcmNoaXRlY3R1cmUpKSA6IHVuZGVmaW5lZDtcbiAgICBmbi5hZGRMYXllcnMoLi4uKGNvbGxlY3RvckxheWVyID8gW2xheWVyLCBjb2xsZWN0b3JMYXllcl0gOiBbbGF5ZXJdKSk7XG5cbiAgICAvLyBUaGUgQVJOLCBub3QgdGhlIGNvbnN0cnVjdDogdGhlIG1hcmtlciBoYXMgdG8gbmFtZSB0aGUgZXhhY3QgbGF5ZXIgdmVyc2lvbiB0aGUgZnVuY3Rpb24gY2FycmllcywgYW5kXG4gICAgLy8gaW4gSU5fQUNDT1VOVCBtb2RlIHRoYXQgaXMgYSBuZXN0ZWQtc3RhY2sgb3V0cHV0IHJlZmVyZW5jZSByZXNvbHZlZCBhdCBkZXBsb3kgdGltZS5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5lbnZpcm9ubWVudEZvcihmbiwgbGFuZ3VhZ2UsIGxheWVyLmxheWVyVmVyc2lvbkFybiwgY29sbGVjdG9yTGF5ZXI/LmxheWVyVmVyc2lvbkFybikpKSB7XG4gICAgICBmbi5hZGRFbnZpcm9ubWVudChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEluc3RydW1lbnRzIGV2ZXJ5IGZ1bmN0aW9uIGluIHRoZSBsaXN0LiAqL1xuICBwdWJsaWMgaW5zdHJ1bWVudEFsbChmdW5jdGlvbnM6IGxhbWJkYS5GdW5jdGlvbltdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBmbiBvZiBmdW5jdGlvbnMpIHtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudChmbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBlbnZpcm9ubWVudCBhcHBsaWVkIHRvIG9uZSBmdW5jdGlvbi5cbiAgICpcbiAgICogTWlycm9ycyBgYXBwbHlIYW5kbGVyRW52YCAvIGBhcHBseVdlYlNlcnZlckVudmAgaW4gdGhlIGNvbm5lY3RvciwgaW5jbHVkaW5nIHdoYXQgaXMgZGVsaWJlcmF0ZWx5IE5PVFxuICAgKiBzZXQ6IGBPVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlRgIHN0YXlzIHVuc2V0IHNvIHRoZSBTREsga2VlcHMgZXhwb3J0aW5nIHRvIHRoZSBpbi1MYW1iZGEgY29sbGVjdG9yXG4gICAqIG9uIGxvY2FsaG9zdCByYXRoZXIgdGhhbiBibG9ja2luZyB0aGUgaW52b2NhdGlvbiBvbiB0aGUgcmVtb3RlIGRlc3RpbmF0aW9uLCBhbmQgZXZlcnkgc2lnbmFsIGV4cG9ydGVyIGlzIHNlbGVjdGVkIGV4cGxpY2l0bHkuXG4gICAqL1xuICBwcml2YXRlIGVudmlyb25tZW50Rm9yKGZuOiBsYW1iZGEuRnVuY3Rpb24sIGxhbmd1YWdlOiBzdHJpbmcsIGxheWVyQXJuOiBzdHJpbmcsIGNvbGxlY3RvckxheWVyQXJuPzogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgeyBkZXN0aW5hdGlvbiwgbW9kZSwgZGVidWcsIHNlcnZpY2VOYW1lLCBqYXZhSGFuZGxlckRpc3RybywgZGlzdHJvLCBleGlzdGluZ0xvYWRlclZhbHVlIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3Qgd2ViU2VydmVyID0gbW9kZSA9PT0gT2RpZ29zSW5zdHJ1bWVudGF0aW9uTW9kZS5XRUJfU0VSVkVSO1xuXG4gICAgY29uc3QgcmVjaXBlID0gZGlzdHJpYnV0aW9uUmVjaXBlKGxhbmd1YWdlLCBkaXN0cm8sIGZuLnJ1bnRpbWUubmFtZSk7XG4gICAgY29uc3Qgc2lnbmFscyA9IHJlc29sdmVkU2lnbmFscyhkZXN0aW5hdGlvbik7XG4gICAgY29uc3QgcmVzb3VyY2UgPSBmbi5ub2RlLmRlZmF1bHRDaGlsZCBhcyBsYW1iZGEuQ2ZuRnVuY3Rpb247XG4gICAgY29uc3QgY3VycmVudCA9IFN0YWNrLm9mKGZuKS5yZXNvbHZlKHJlc291cmNlLmVudmlyb25tZW50KSBhcyBsYW1iZGEuQ2ZuRnVuY3Rpb24uRW52aXJvbm1lbnRQcm9wZXJ0eSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBvcmlnaW5hbFdyYXBwZXIgPSAoY3VycmVudD8udmFyaWFibGVzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5BV1NfTEFNQkRBX0VYRUNfV1JBUFBFUiA/PyAnJztcbiAgICBjb25zdCBleGVjV3JhcHBlciA9IHdlYlNlcnZlciA/ICcvb3B0L29kaWdvcy13ZWJzZXJ2ZXInIDogZGlzdHJpYnV0aW9uV3JhcHBlcihsYW5ndWFnZSwgZGlzdHJvLCBqYXZhSGFuZGxlckRpc3RybywgZmFsc2UpO1xuICAgIGNvbnN0IGZ1bmN0aW9uTG9ncyA9IHNpZ25hbHMubG9ncyAmJiAhd2ViU2VydmVyICYmIChsYW5ndWFnZSA9PT0gJ3J1YnknIHx8IChsYW5ndWFnZSA9PT0gJ2phdmEnICYmXG4gICAgICBbJy9vcHQvb3RlbC1oYW5kbGVyJywgJy9vcHQvb3RlbC1wcm94eS1oYW5kbGVyJywgJy9vcHQvb3RlbC1zcXMtaGFuZGxlcicsICcvb3B0L290ZWwtc3RyZWFtLWhhbmRsZXInXS5pbmNsdWRlcyhleGVjV3JhcHBlcikpKTtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICB2ZXJzaW9uOiAyLFxuICAgICAgc2VydmljZTogc2VydmljZU5hbWUgPz8gZGVmYXVsdFNlcnZpY2VOYW1lKGZuKSxcbiAgICAgIHNpZ25hbHM6IFsndHJhY2VzJywgJ21ldHJpY3MnLCAnbG9ncyddLmZpbHRlcihzaWduYWwgPT4gc2lnbmFsc1tzaWduYWwgYXMga2V5b2YgdHlwZW9mIHNpZ25hbHNdKSxcbiAgICAgIGVuZHBvaW50OiBkZXN0aW5hdGlvbi5lbmRwb2ludCA/PyBkZXN0aW5hdGlvbi5odHRwRW5kcG9pbnQsXG4gICAgICAuLi4oZGVzdGluYXRpb24uaHR0cEVuZHBvaW50ID8geyBodHRwOiB0cnVlIH0gOiB7fSksXG4gICAgICAuLi4oZGVzdGluYXRpb24uZW5kcG9pbnQgJiYgZGVzdGluYXRpb24uaW5zZWN1cmUgPyB7IGluc2VjdXJlOiB0cnVlIH0gOiB7fSksXG4gICAgICAuLi4oZGVzdGluYXRpb24uaGVhZGVycyAmJiBPYmplY3Qua2V5cyhkZXN0aW5hdGlvbi5oZWFkZXJzKS5sZW5ndGggPyB7IGhlYWRlcnM6IGRlc3RpbmF0aW9uLmhlYWRlcnMgfSA6IHt9KSxcbiAgICAgIC4uLihyZWNpcGUuYXBwbGljYXRpb25TaWduYWxzID8geyBhcHBsaWNhdGlvblNpZ25hbHM6IHRydWUgfSA6IHt9KSxcbiAgICAgIC4uLihmdW5jdGlvbkxvZ3MgPyB7IGZ1bmN0aW9uTG9nczogdHJ1ZSB9IDoge30pLFxuICAgICAgLi4uKGRlYnVnICYmICF3ZWJTZXJ2ZXIgPyB7IGRlYnVnOiB0cnVlIH0gOiB7fSksXG4gICAgICAuLi4od2ViU2VydmVyID8geyB3ZWJXcmFwcGVyOiBvcmlnaW5hbFdyYXBwZXIgfSA6IHt9KSxcbiAgICB9O1xuICAgIGNvbnN0IGVudjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgIFtFTlZfRVhFQ19XUkFQUEVSXTogZXhlY1dyYXBwZXIsXG4gICAgICBbRU5WX0xBTUJEQV9DT05GSUddOiBKU09OLnN0cmluZ2lmeShjb25maWcpLFxuICAgIH07XG4gICAgVGFncy5vZihmbikuYWRkKCdvZGlnb3M6aWFjJywgJ3YxJyk7XG4gICAgVGFncy5vZihmbikuYWRkKCdvZGlnb3M6c2RrLWxheWVyJywgbGF5ZXJBcm4pO1xuICAgIGlmIChjb2xsZWN0b3JMYXllckFybikgVGFncy5vZihmbikuYWRkKCdvZGlnb3M6Y29sbGVjdG9yLWxheWVyJywgY29sbGVjdG9yTGF5ZXJBcm4pO1xuICAgIC8vIEV4cGxpY2l0IGN1c3RvbWVyIGxvYWRlciBvcHRpb25zIHJlbWFpbiBvcmRpbmFyeSBjdXN0b21lciBlbnZpcm9ubWVudCB2YWx1ZXMuXG4gICAgaWYgKHdlYlNlcnZlciAmJiBleGlzdGluZ0xvYWRlclZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGxvYWRlcktleSA9IHsgamF2YTogJ0pBVkFfVE9PTF9PUFRJT05TJywgbm9kZWpzOiAnTk9ERV9PUFRJT05TJywgcHl0aG9uOiAnUFlUSE9OUEFUSCcgfVtsYW5ndWFnZV07XG4gICAgICBpZiAobG9hZGVyS2V5KSBlbnZbbG9hZGVyS2V5XSA9IGV4aXN0aW5nTG9hZGVyVmFsdWU7XG4gICAgfVxuICAgIGlmIChsYW5ndWFnZSA9PT0gJ3J1YnknICYmIHNpZ25hbHMubWV0cmljcykge1xuICAgICAgQW5ub3RhdGlvbnMub2YoZm4pLmFkZFdhcm5pbmdWMignQG9kaWdvcy9hd3MtY2RrOnJ1YnlTaWduYWxzVW5zdXBwb3J0ZWQnLFxuICAgICAgICAnVGhlIGJ1bmRsZWQgUnVieSBMYW1iZGEgU0RLIGNhbm5vdCBnZW5lcmF0ZSBPVExQIG1ldHJpY3MuIEZ1bmN0aW9uIHN0ZG91dC9zdGRlcnIgbG9ncyBhcmUgY29sbGVjdGVkIGJ5IHRoZSBMYW1iZGEgY29sbGVjdG9yIHdoZW4gbG9ncyBhcmUgc2VsZWN0ZWQuJyk7XG4gICAgfVxuICAgIGlmIChkZXN0aW5hdGlvbi5wcm9maWxlcykge1xuICAgICAgQW5ub3RhdGlvbnMub2YoZm4pLmFkZFdhcm5pbmdWMignQG9kaWdvcy9hd3MtY2RrOnByb2ZpbGVzVW5zdXBwb3J0ZWQnLFxuICAgICAgICAnVGhlIGJ1bmRsZWQgTGFtYmRhIGxhbmd1YWdlIGFnZW50cyBkbyBub3QgZ2VuZXJhdGUgT1RMUCBwcm9maWxlcy4gT3RoZXIgc2VsZWN0ZWQgc2lnbmFscyByZW1haW4gZW5hYmxlZC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudjtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BzIGZvciB7QGxpbmsgT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3RQcm9wcyBleHRlbmRzIE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnMge31cblxuLyoqXG4gKiBBcHBsaWVzIE9kaWdvcyBpbnN0cnVtZW50YXRpb24gdG8gZXZlcnkgYGxhbWJkYS5GdW5jdGlvbmAgaW4gYSBzY29wZS5cbiAqXG4gKiBgYGB0c1xuICogQXNwZWN0cy5vZihzdGFjaykuYWRkKG5ldyBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3Qoc3RhY2ssIHtcbiAqICAgZGVzdGluYXRpb246IHsgZW5kcG9pbnQ6ICdvdGxwLmV4YW1wbGUuY29tOjQzMTcnIH0sXG4gKiB9KSk7XG4gKiBgYGBcbiAqXG4gKiBgc2tpcFVuc3VwcG9ydGVkUnVudGltZXNgIGRlZmF1bHRzIHRvIGB0cnVlYCBoZXJlLCB1bmxpa2UgdGhlIGNvbnN0cnVjdDogYW4gYXNwZWN0IHZpc2l0cyBldmVyeSBmdW5jdGlvblxuICogaW4gdGhlIHNjb3BlLCBpbmNsdWRpbmcgb25lcyB3aG9zZSBydW50aW1lIGhhcyBubyBPcGVuVGVsZW1ldHJ5IGxheWVyLCBhbmQgZmFpbGluZyB0aGUgd2hvbGUgc3ludGhcbiAqIGJlY2F1c2UgYSBzdGFjayBoYXBwZW5zIHRvIGNvbnRhaW4gb25lIEdvIGZ1bmN0aW9uIGlzIG5vdCB1c2VmdWwuIEVhY2ggc2tpcCBpcyByZXBvcnRlZCBhcyBhIHN5bnRoXG4gKiB3YXJuaW5nLCBzbyBpdCBpcyB2aXNpYmxlIHJhdGhlciB0aGFuIHNpbGVudC5cbiAqXG4gKiBUaGUgYXNwZWN0IGluc3RydW1lbnRzIHdoYXQgZXhpc3RzIGluIHRoZSB0cmVlIHdoZW4gaXQgcnVucy4gQSBmdW5jdGlvbiBhZGRlZCBieSBhIGxhdGVyIGFzcGVjdCBpcyBub3RcbiAqIHZpc2l0ZWQ7IHVzZSB0aGUgY29uc3RydWN0IGRpcmVjdGx5IGZvciB0aG9zZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdCBpbXBsZW1lbnRzIElBc3BlY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RydW1lbnRhdGlvbjogT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc2NvcGUgd2hlcmUgdGhlIHNoYXJlZCBsYXllciBjb25zdHJ1Y3RzIGFyZSBjcmVhdGVkLiBVc3VhbGx5IHRoZSBzYW1lIHNjb3BlIHRoZSBhc3BlY3QgaXNcbiAgICogYXBwbGllZCB0by4gSXQgaXMgYSBzZXBhcmF0ZSBhcmd1bWVudCBmcm9tIHRoZSB2aXNpdGVkIG5vZGVzIGJlY2F1c2UgdGhlIGxheWVyIChhbmQsIGluIGBJTl9BQ0NPVU5UYFxuICAgKiBtb2RlLCB0aGUgbmVzdGVkIFNBUiBhcHBsaWNhdGlvbikgaXMgY3JlYXRlZCBvbmNlIGFuZCBzaGFyZWQgYnkgZXZlcnkgZnVuY3Rpb24gdGhlIGFzcGVjdCB2aXNpdHMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBwcm9wczogT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0UHJvcHMpIHtcbiAgICB0aGlzLmluc3RydW1lbnRhdGlvbiA9IG5ldyBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb24oc2NvcGUsICdPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3QnLCB7XG4gICAgICBza2lwVW5zdXBwb3J0ZWRSdW50aW1lczogdHJ1ZSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIGxhbWJkYS5GdW5jdGlvbikge1xuICAgICAgdGhpcy5pbnN0cnVtZW50YXRpb24uaW5zdHJ1bWVudChub2RlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
package/lib/runtime.d.ts CHANGED
@@ -58,3 +58,5 @@ export declare function webServerEnv(language: string, existingLoaderValue?: str
58
58
  };
59
59
  /** Resolve the same concrete SDK names advertised by the connector's GraphQL catalog. */
60
60
  export declare function distributionWrapper(language: string, name?: string, legacy?: OdigosJavaHandlerDistro, webServer?: boolean): string;
61
+ /** Concrete layer family and AWS preset associated with a GraphQL distro name. */
62
+ export declare function distributionRecipe(language: string, name?: string, runtime?: string): import("./generated/distributions").LambdaDistribution;
package/lib/runtime.js CHANGED
@@ -7,6 +7,7 @@ exports.addLoaderValue = addLoaderValue;
7
7
  exports.webServerLoaderKey = webServerLoaderKey;
8
8
  exports.webServerEnv = webServerEnv;
9
9
  exports.distributionWrapper = distributionWrapper;
10
+ exports.distributionRecipe = distributionRecipe;
10
11
  const distributions_1 = require("./generated/distributions");
11
12
  const layers_1 = require("./generated/layers");
12
13
  const types_1 = require("./types");
@@ -146,9 +147,19 @@ function distributionWrapper(language, name, legacy, webServer = false) {
146
147
  if (webServer && language === 'ruby')
147
148
  throw new Error('Web-server instrumentation is not supported for ruby');
148
149
  const d = distributions_1.LAMBDA_DISTRIBUTIONS.find(d => d.language === language && (name ? d.name === name : d.isDefault));
149
- if (!d || (webServer && (language === 'ruby' || (language === 'java' && d.name !== 'java-lambda-otel-agent')))) {
150
+ if (!d || (webServer && (d.artifact || language === 'ruby' || (language === 'java' && d.name !== 'java-lambda-otel-agent')))) {
150
151
  throw new Error(`Unsupported Lambda distro ${name ?? '(default)'} for ${language}`);
151
152
  }
152
153
  return d.execWrapper;
153
154
  }
154
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMkJBLGtEQU9DO0FBb0JELHdDQVNDO0FBR0Qsb0NBTUM7QUFjRCx3Q0FRQztBQVVELGdEQUVDO0FBY0Qsb0NBcUJDO0FBR0Qsa0RBY0M7QUE5SkQsNkRBQWlFO0FBQ2pFLCtDQUErQztBQUMvQyxtQ0FBNkU7QUFFN0U7Ozs7OztHQU1HO0FBRUgsNEdBQTRHO0FBQzVHLE1BQU0saUJBQWlCLEdBQTRCO0lBQ2pELENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztJQUNwQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUM7SUFDcEIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztDQUNqQixDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsV0FBbUI7SUFDckQsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDbkQsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkMsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLE1BQU0sb0JBQW9CLEdBQThCO0lBQ3RELENBQUMsK0JBQXVCLENBQUMsWUFBWSxDQUFDLEVBQUUsbUJBQW1CO0lBQzNELENBQUMsK0JBQXVCLENBQUMsa0JBQWtCLENBQUMsRUFBRSx5QkFBeUI7SUFDdkUsQ0FBQywrQkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLHVCQUF1QjtJQUNuRSxDQUFDLCtCQUF1QixDQUFDLG1CQUFtQixDQUFDLEVBQUUsMEJBQTBCO0NBQzFFLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxT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bmVyYXRlZC9kaXN0cmlidXRpb25zJztcbmltcG9ydCB7IExBTkdVQUdFUyB9IGZyb20gJy4vZ2VuZXJhdGVkL2xheWVycyc7XG5pbXBvcnQgeyBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLCBPZGlnb3NKYXZhSGFuZGxlckRpc3RybyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFJ1bnRpbWUgLT4gbGFuZ3VhZ2UsIGFuZCBsYW5ndWFnZSAtPiB0aGUgZXhhY3QgZW52IHRoZSBsYXllciBleHBlY3RzLlxuICpcbiAqIE1pcnJvcnMgYExhbmd1YWdlRnJvbVJ1bnRpbWVgLCBgZXhlY1dyYXBwZXJGb3JMYW5ndWFnZWAgYW5kIGB3ZWJTZXJ2ZXJMb2FkZXJgIGluIHRoZSBjb25uZWN0b3Inc1xuICogaW5zdHJ1bWVudG9yLiBUaGUgZGF0YSBsaXZlcyBpbiAuLi8uLi9hcnRpZmFjdHMuanNvbiBhbmQgcmVhY2hlcyBoZXJlIHRocm91Z2ggdGhlIGdlbmVyYXRlZCBtb2R1bGU7IHRoZVxuICogZGVjaXNpb25zIGxpdmUgaGVyZS5cbiAqL1xuXG4vKiogUnVudGltZSBwcmVmaXhlcyB0aGF0IG1hcCB0byBhbiBPVGVsIGxheWVyIGxhbmd1YWdlLiBQcmVmaXgtbWF0Y2hlZCwgc28gYGphdmE4LmFsMmAgcmVzb2x2ZXMgdG8gamF2YS4gKi9cbmNvbnN0IExBTkdVQUdFX1BSRUZJWEVTOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiA9IFtcbiAgWydweXRob24nLCAncHl0aG9uJ10sXG4gIFsnbm9kZWpzJywgJ25vZGVqcyddLFxuICBbJ2phdmEnLCAnamF2YSddLFxuICBbJ3J1YnknLCAncnVieSddLFxuXTtcblxuLyoqXG4gKiBSZXNvbHZlcyBhIExhbWJkYSBydW50aW1lIGlkZW50aWZpZXIgKGBweXRob24zLjEyYCwgYGphdmEyMWAsIGBub2RlanMyMi54YCkgdG8gdGhlIE9UZWwgbGF5ZXIgbGFuZ3VhZ2UuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgcnVudGltZXMgd2l0aCBubyBPcGVuVGVsZW1ldHJ5IExhbWJkYSBsYW5ndWFnZSBsYXllciDigJQgYGRvdG5ldCpgLCBgcHJvdmlkZWQuKmBcbiAqIChHbyBhbmQgY3VzdG9tIHJ1bnRpbWVzKS4gVGhlIGNhbGxlciByZWZ1c2VzIHRvIGluc3RydW1lbnQgcmF0aGVyIHRoYW4gYXR0YWNoaW5nIGEgbGF5ZXIgdGhhdCBkb2VzXG4gKiBub3RoaW5nLCBiZWNhdXNlIGEgbGF5ZXIgcGx1cyBhbiBleGVjIHdyYXBwZXIgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBpdCBmYWlscyB0aGUgZnVuY3Rpb24gYXQgY29sZCBzdGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhbmd1YWdlRnJvbVJ1bnRpbWUocnVudGltZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgW3ByZWZpeCwgbGFuZ3VhZ2VdIG9mIExBTkdVQUdFX1BSRUZJWEVTKSB7XG4gICAgaWYgKHJ1bnRpbWVOYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgcmV0dXJuIGxhbmd1YWdlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogTWFwcyB0aGUgSmF2YSBkaXN0cm8gZW51bSB0byB0aGUgd3JhcHBlciBzY3JpcHQgcGF0aCB0aGUgbGF5ZXIgc2hpcHMuICovXG5jb25zdCBKQVZBX0RJU1RST19XUkFQUEVSUzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgW09kaWdvc0phdmFIYW5kbGVyRGlzdHJvLk9URUxfSEFORExFUl06ICcvb3B0L290ZWwtaGFuZGxlcicsXG4gIFtPZGlnb3NKYXZhSGFuZGxlckRpc3Ryby5PVEVMX1BST1hZX0hBTkRMRVJdOiAnL29wdC9vdGVsLXByb3h5LWhhbmRsZXInLFxuICBbT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8uT1RFTF9TUVNfSEFORExFUl06ICcvb3B0L290ZWwtc3FzLWhhbmRsZXInLFxuICBbT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8uT1RFTF9TVFJFQU1fSEFORExFUl06ICcvb3B0L290ZWwtc3RyZWFtLWhhbmRsZXInLFxufTtcblxuLyoqXG4gKiBUaGUgYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCB2YWx1ZSBmb3IgYSBsYW5ndWFnZS5cbiAqXG4gKiBUaGUgd3JhcHBlciBzY3JpcHQgaXMgbGFuZ3VhZ2Utc3BlY2lmaWMuIEphdmEgZGVmYXVsdHMgdG8gYC9vcHQvb3RlbC1qYXZhYWdlbnQtaGFuZGxlcmA7XG4gKiBQeXRob24gdXNlcyBgL29wdC9vdGVsLWluc3RydW1lbnRgLCBhbmQgTm9kZS5qcy9SdWJ5IHVzZSBgL29wdC9vdGVsLWhhbmRsZXJgLiBTZXR0aW5nIHRoZSB3cm9uZyBvbmUgbWFrZXMgdGhlIGxheWVyIGJvb3RzdHJhcCBmYWlsIGF0IGNvbGQgc3RhcnQgd2l0aFxuICogYC9vcHQvb3RlbC1pbnN0cnVtZW50OiBkb2VzIG5vdCBleGlzdGAgYW5kIHRoZSBmdW5jdGlvbiBlcnJvcnMgb3V0IOKAlCB3aGljaCBpcyB3aHkgdGhpcyBpcyBuZXZlciBhXG4gKiBoYXJkY29kZWQgY29uc3RhbnQgYXQgYSBjYWxsIHNpdGUuXG4gKlxuICogYGRpc3Ryb2AgaXMgb25seSBjb25zdWx0ZWQgZm9yIEphdmEsIHdob3NlIGxheWVyIHNoaXBzIGZvdXIgd3JhcHBlcnMsIG9uZSBwZXIgaGFuZGxlciBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjV3JhcHBlckZvcihsYW5ndWFnZTogc3RyaW5nLCBkaXN0cm8/OiBPZGlnb3NKYXZhSGFuZGxlckRpc3Rybyk6IHN0cmluZyB7XG4gIGlmIChsYW5ndWFnZSA9PT0gJ2phdmEnKSB7XG4gICAgcmV0dXJuIGRpc3RybyA/IEpBVkFfRElTVFJPX1dSQVBQRVJTW2Rpc3Ryb10gOiAnL29wdC9vdGVsLWphdmFhZ2VudC1oYW5kbGVyJztcbiAgfVxuICBjb25zdCBzcGVjID0gTEFOR1VBR0VTW2xhbmd1YWdlXTtcbiAgaWYgKCFzcGVjKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPZGlnb3M6IG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGZvciBsYW5ndWFnZSBcIiR7bGFuZ3VhZ2V9XCJgKTtcbiAgfVxuICByZXR1cm4gc3BlYy5leGVjV3JhcHBlcjtcbn1cblxuLyoqIExheWVyIG5hbWUgZm9yIGEgbGFuZ3VhZ2UvYXJjaGl0ZWN0dXJlIOKAlCBgb2RpZ29zLW90ZWwtcHl0aG9uLWFybTY0YC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllck5hbWVGb3IobGFuZ3VhZ2U6IHN0cmluZywgYXJjaGl0ZWN0dXJlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzcGVjID0gTEFOR1VBR0VTW2xhbmd1YWdlXTtcbiAgaWYgKCFzcGVjKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPZGlnb3M6IHVua25vd24gbGFuZ3VhZ2UgXCIke2xhbmd1YWdlfVwiYCk7XG4gIH1cbiAgcmV0dXJuIGAke3NwZWMubGF5ZXJOYW1lfS0ke2FyY2hpdGVjdHVyZX1gO1xufVxuXG4vKiogRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNldCBvbiBhIGZ1bmN0aW9uLCBhcyBhIHBsYWluIG1hcC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW52VmFycyB7XG4gIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IHN0cmluZztcbn1cblxuLyoqXG4gKiBJZGVtcG90ZW50bHkgYWRkcyBvdXIgbG9hZGVyIHZhbHVlIHRvIGEgdmFsdWUgdGhlIGZ1bmN0aW9uIGFscmVhZHkgY2Fycmllcy5cbiAqXG4gKiBgUFlUSE9OUEFUSGAgaXMgUFJFUEVOREVELCBzbyB0aGUgbGF5ZXIncyBwYWNrYWdlcyBhbmQgaXRzIGBzaXRlY3VzdG9taXplYCBhcmUgZm91bmQgZmlyc3Q7IHRoZVxuICogYCpfT1BUSU9OU2AgdmFyaWFibGVzIGFyZSBhcHBlbmRlZCwgc28gdGhlIGN1c3RvbWVyJ3Mgb3duIGZsYWdzIGtlZXAgcHJlY2VkZW5jZS4gTWlycm9yc1xuICogYGFkZExvYWRlclZhbHVlYCBpbiB0aGUgY29ubmVjdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkTG9hZGVyVmFsdWUoZXhpc3Rpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCwgdmFsdWU6IHN0cmluZywgc2VwYXJhdG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChleGlzdGluZy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cbiAgcmV0dXJuIHNlcGFyYXRvciA9PT0gJzonID8gYCR7dmFsdWV9JHtzZXBhcmF0b3J9JHtleGlzdGluZ31gIDogYCR7ZXhpc3Rpbmd9JHtzZXBhcmF0b3J9JHt2YWx1ZX1gO1xufVxuXG4vKipcbiAqIFRoZSBsb2FkZXIgdmFyaWFibGUgYSBsYW5ndWFnZSBhY3RpdmF0ZXMgdGhyb3VnaCBpbiB3ZWItc2VydmVyIG1vZGUgKGBOT0RFX09QVElPTlNgLFxuICogYEpBVkFfVE9PTF9PUFRJT05TYCwgYFBZVEhPTlBBVEhgKSwgb3IgdW5kZWZpbmVkIGZvciBhIGxhbmd1YWdlIHdpdGggbm8gdmVyaWZpZWQgd2ViLXNlcnZlciBsb2FkZXIuXG4gKlxuICogRXhpc3RzIHNvIGEgY2FsbGVyIHRoYXQgbmVlZHMgdG8gbmFtZSB0aGUgdmFyaWFibGUg4oCUIHRoZSBvd25lcnNoaXAgbWFya2VyJ3Mgcm9sbGJhY2sgc25hcHNob3QsIHdoaWNoIGhhc1xuICogdG8gcmVjb3JkIHRoZSBjYWxsZXIncyBvd24gcHJpb3IgdmFsdWUgZm9yIGl0IOKAlCBkb2VzIG5vdCBoYXZlIHRvIGd1ZXNzIGl0IGZyb20gdGhlIGtleSBvcmRlciBvZlxuICogYHdlYlNlcnZlckVudmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3ZWJTZXJ2ZXJMb2FkZXJLZXkobGFuZ3VhZ2U6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBMQU5HVUFHRVNbbGFuZ3VhZ2VdPy53ZWJTZXJ2ZXI/LmVudktleTtcbn1cblxuLyoqXG4gKiBUaGUgZW52aXJvbm1lbnQgdGhhdCBsb2FkcyB0aGUgbGFuZ3VhZ2UgYWdlbnQgaW4gd2ViLXNlcnZlciAoQVdTIExhbWJkYSBXZWIgQWRhcHRlcikgbW9kZS5cbiAqXG4gKiBXZWItYWRhcHRlciBmdW5jdGlvbnMgcnVuIGEgd2ViIHNlcnZlciByYXRoZXIgdGhhbiBhIExhbWJkYSBoYW5kbGVyLCBhbmQgdGhlIGFkYXB0ZXIgb3duc1xuICogYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCDigJQgc28gaW5zdHJ1bWVudGF0aW9uIGlzIGxvYWRlZCB0aHJvdWdoIHRoZSBsYW5ndWFnZSdzIG93biBsb2FkZXIgdmFyaWFibGUgYW5kXG4gKiB0aGUgd3JhcHBlciBpcyBsZWZ0IGFsb25lLiBIYW5kbGVyLW1vZGUgaW5zdHJ1bWVudGF0aW9uIGFwcGxpZWQgdG8gb25lIG9mIHRoZXNlIG92ZXJ3cml0ZXMgdGhlXG4gKiBhZGFwdGVyJ3Mgd3JhcHBlciBhbmQgdGhlIGZ1bmN0aW9uIHN0b3BzIHNlcnZpbmcuXG4gKlxuICogQHBhcmFtIGV4aXN0aW5nTG9hZGVyVmFsdWUgdGhlIHZhbHVlIHRoZSBmdW5jdGlvbiBhbHJlYWR5IG5lZWRzIGluIGl0cyBsb2FkZXIgdmFyaWFibGUsIHdoaWNoIG91cnMgaXNcbiAqIGpvaW5lZCB0by4gQ0RLJ3MgYGxhbWJkYS5GdW5jdGlvbmAgZXhwb3NlcyBubyB3YXkgdG8gcmVhZCBiYWNrIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHNldCBlbHNld2hlcmUgaW5cbiAqIHRoZSBhcHAsIHNvIGEgdmFsdWUgdGhhdCBtdXN0IGJlIHByZXNlcnZlZCBoYXMgdG8gYmUgcGFzc2VkIGluIGV4cGxpY2l0bHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3ZWJTZXJ2ZXJFbnYoXG4gIGxhbmd1YWdlOiBzdHJpbmcsXG4gIGV4aXN0aW5nTG9hZGVyVmFsdWU/OiBzdHJpbmcsXG4pOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgY29uc3Qgc3BlYyA9IExBTkdVQUdFU1tsYW5ndWFnZV07XG4gIGNvbnN0IGxvYWRlciA9IHNwZWM/LndlYlNlcnZlcjtcbiAgaWYgKCFsb2FkZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgT2RpZ29zOiAke09kaWdvc0luc3RydW1lbnRhdGlvbk1vZGUuV0VCX1NFUlZFUn0gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGZvciAke2xhbmd1YWdlfSDigJQgYCArXG4gICAgICAgICd0aGVyZSBpcyBubyB2ZXJpZmllZCB3ZWItc2VydmVyIGxvYWRlciBmb3IgaXQuIFVzZSBIQU5ETEVSIG1vZGUsIG9yIGxlYXZlIHRoZSBmdW5jdGlvbiB1bmluc3RydW1lbnRlZC4nLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZW52OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIFtsb2FkZXIuZW52S2V5XTogYWRkTG9hZGVyVmFsdWUoZXhpc3RpbmdMb2FkZXJWYWx1ZSwgbG9hZGVyLnZhbHVlLCBsb2FkZXIuc2VwYXJhdG9yKSxcbiAgfTtcbiAgLy8gUHl0aG9uIG11c3QgYmUgcGlubmVkIHRvIHRoZSBIVFRQIE9UTFAgZXhwb3J0ZXIg4oCUIHRoZSBvbmx5IG9uZSBidW5kbGVkIGluIGl0cyBsYXllci4gT3RoZXIgbGFuZ3VhZ2VzXG4gIC8vIGV4cG9ydCBjb3JyZWN0bHkgd2l0aCB0aGVpciBkZWZhdWx0cywgc28gbm90aGluZyBleHRyYSBpcyB3cml0dGVuIGZvciB0aGVtLlxuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhsb2FkZXIuZXh0cmFFbnYpKSB7XG4gICAgZW52W2tdID0gdjtcbiAgfVxuICByZXR1cm4gZW52O1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgc2FtZSBjb25jcmV0ZSBTREsgbmFtZXMgYWR2ZXJ0aXNlZCBieSB0aGUgY29ubmVjdG9yJ3MgR3JhcGhRTCBjYXRhbG9nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RyaWJ1dGlvbldyYXBwZXIobGFuZ3VhZ2U6IHN0cmluZywgbmFtZT86IHN0cmluZywgbGVnYWN5PzogT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8sIHdlYlNlcnZlciA9IGZhbHNlKTogc3RyaW5nIHtcbiAgaWYgKGxlZ2FjeSAmJiBuYW1lKSB0aHJvdyBuZXcgRXJyb3IoJ1VzZSBkaXN0cm8gb3IgbGVnYWN5IGphdmFIYW5kbGVyRGlzdHJvLCBub3QgYm90aCcpO1xuICBpZiAobGVnYWN5KSB7XG4gICAgaWYgKGxhbmd1YWdlICE9PSAnamF2YScpIHJldHVybiBleGVjV3JhcHBlckZvcihsYW5ndWFnZSk7XG4gICAgaWYgKHdlYlNlcnZlcikgdGhyb3cgbmV3IEVycm9yKCdKYXZhIGhhbmRsZXIgYWRhcHRlcnMgcmVxdWlyZSBIQU5ETEVSIG1vZGUnKTtcbiAgICBpZiAoIUpBVkFfRElTVFJPX1dSQVBQRVJTW2xlZ2FjeV0pIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgSmF2YSBoYW5kbGVyIGFkYXB0ZXIgJHtsZWdhY3l9YCk7XG4gICAgcmV0dXJuIGV4ZWNXcmFwcGVyRm9yKGxhbmd1YWdlLCBsZWdhY3kpO1xuICB9XG4gIGlmICh3ZWJTZXJ2ZXIgJiYgbGFuZ3VhZ2UgPT09ICdydWJ5JykgdGhyb3cgbmV3IEVycm9yKCdXZWItc2VydmVyIGluc3RydW1lbnRhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBydWJ5Jyk7XG4gIGNvbnN0IGQgPSBMQU1CREFfRElTVFJJQlVUSU9OUy5maW5kKGQgPT4gZC5sYW5ndWFnZSA9PT0gbGFuZ3VhZ2UgJiYgKG5hbWUgPyBkLm5hbWUgPT09IG5hbWUgOiBkLmlzRGVmYXVsdCkpO1xuICBpZiAoIWQgfHwgKHdlYlNlcnZlciAmJiAobGFuZ3VhZ2UgPT09ICdydWJ5JyB8fCAobGFuZ3VhZ2UgPT09ICdqYXZhJyAmJiBkLm5hbWUgIT09ICdqYXZhLWxhbWJkYS1vdGVsLWFnZW50JykpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgTGFtYmRhIGRpc3RybyAke25hbWUgPz8gJyhkZWZhdWx0KSd9IGZvciAke2xhbmd1YWdlfWApO1xuICB9XG4gIHJldHVybiBkLmV4ZWNXcmFwcGVyO1xufVxuIl19
155
+ /** Concrete layer family and AWS preset associated with a GraphQL distro name. */
156
+ function distributionRecipe(language, name, runtime) {
157
+ const d = distributions_1.LAMBDA_DISTRIBUTIONS.find(d => d.language === language && (name ? d.name === name : d.isDefault));
158
+ if (!d)
159
+ throw new Error(`Unsupported Lambda distro ${name ?? '(default)'} for ${language}`);
160
+ if (runtime && d.compatibleRuntimes && !d.compatibleRuntimes.includes(runtime)) {
161
+ throw new Error(`Lambda distro ${d.name} does not support runtime ${runtime}`);
162
+ }
163
+ return d;
164
+ }
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMkJBLGtEQU9DO0FBb0JELHdDQVNDO0FBR0Qsb0NBTUM7QUFjRCx3Q0FRQztBQVVELGdEQUVDO0FBY0Qsb0NBcUJDO0FBR0Qsa0RBY0M7QUFHRCxnREFPQztBQXhLRCw2REFBaUU7QUFDakUsK0NBQStDO0FBQy9DLG1DQUE2RTtBQUU3RTs7Ozs7O0dBTUc7QUFFSCw0R0FBNEc7QUFDNUcsTUFBTSxpQkFBaUIsR0FBNEI7SUFDakQsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO0lBQ3BCLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztJQUNwQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDaEIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO0NBQ2pCLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxXQUFtQjtJQUNyRCxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUNuRCxJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsTUFBTSxvQkFBb0IsR0FBOEI7SUFDdEQsQ0FBQywrQkFBdUIsQ0FBQyxZQUFZLENBQUMsRUFBRSxtQkFBbUI7SUFDM0QsQ0FBQywrQkFBdUIsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLHlCQUF5QjtJQUN2RSxDQUFDLCtCQUF1QixDQUFDLGdCQUFnQixDQUFDLEVBQUUsdUJBQXVCO0lBQ25FLENBQUMsK0JBQXVCLENBQUMsbUJBQW1CLENBQUMsRUFBRSwwQkFBMEI7Q0FDMUUsQ0FBQztBQUVGOzs7Ozs7Ozs7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Q0FBQyxRQUFnQixFQUFFLElBQWEsRUFBRSxPQUFnQjtJQUNsRixNQUFNLENBQUMsR0FBRyxvQ0FBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzVHLElBQUksQ0FBQyxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsSUFBSSxJQUFJLFdBQVcsUUFBUSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzVGLElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUMvRSxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSw2QkFBNkIsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTEFNQkRBX0RJU1RSSUJVVElPTlMgfSBmcm9tICcuL2dlbmVyYXRlZC9kaXN0cmlidXRpb25zJztcbmltcG9ydCB7IExBTkdVQUdFUyB9IGZyb20gJy4vZ2VuZXJhdGVkL2xheWVycyc7XG5pbXBvcnQgeyBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLCBPZGlnb3NKYXZhSGFuZGxlckRpc3RybyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFJ1bnRpbWUgLT4gbGFuZ3VhZ2UsIGFuZCBsYW5ndWFnZSAtPiB0aGUgZXhhY3QgZW52IHRoZSBsYXllciBleHBlY3RzLlxuICpcbiAqIE1pcnJvcnMgYExhbmd1YWdlRnJvbVJ1bnRpbWVgLCBgZXhlY1dyYXBwZXJGb3JMYW5ndWFnZWAgYW5kIGB3ZWJTZXJ2ZXJMb2FkZXJgIGluIHRoZSBjb25uZWN0b3Inc1xuICogaW5zdHJ1bWVudG9yLiBUaGUgZGF0YSBsaXZlcyBpbiAuLi8uLi9hcnRpZmFjdHMuanNvbiBhbmQgcmVhY2hlcyBoZXJlIHRocm91Z2ggdGhlIGdlbmVyYXRlZCBtb2R1bGU7IHRoZVxuICogZGVjaXNpb25zIGxpdmUgaGVyZS5cbiAqL1xuXG4vKiogUnVudGltZSBwcmVmaXhlcyB0aGF0IG1hcCB0byBhbiBPVGVsIGxheWVyIGxhbmd1YWdlLiBQcmVmaXgtbWF0Y2hlZCwgc28gYGphdmE4LmFsMmAgcmVzb2x2ZXMgdG8gamF2YS4gKi9cbmNvbnN0IExBTkdVQUdFX1BSRUZJWEVTOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiA9IFtcbiAgWydweXRob24nLCAncHl0aG9uJ10sXG4gIFsnbm9kZWpzJywgJ25vZGVqcyddLFxuICBbJ2phdmEnLCAnamF2YSddLFxuICBbJ3J1YnknLCAncnVieSddLFxuXTtcblxuLyoqXG4gKiBSZXNvbHZlcyBhIExhbWJkYSBydW50aW1lIGlkZW50aWZpZXIgKGBweXRob24zLjEyYCwgYGphdmEyMWAsIGBub2RlanMyMi54YCkgdG8gdGhlIE9UZWwgbGF5ZXIgbGFuZ3VhZ2UuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgcnVudGltZXMgd2l0aCBubyBPcGVuVGVsZW1ldHJ5IExhbWJkYSBsYW5ndWFnZSBsYXllciDigJQgYGRvdG5ldCpgLCBgcHJvdmlkZWQuKmBcbiAqIChHbyBhbmQgY3VzdG9tIHJ1bnRpbWVzKS4gVGhlIGNhbGxlciByZWZ1c2VzIHRvIGluc3RydW1lbnQgcmF0aGVyIHRoYW4gYXR0YWNoaW5nIGEgbGF5ZXIgdGhhdCBkb2VzXG4gKiBub3RoaW5nLCBiZWNhdXNlIGEgbGF5ZXIgcGx1cyBhbiBleGVjIHdyYXBwZXIgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBpdCBmYWlscyB0aGUgZnVuY3Rpb24gYXQgY29sZCBzdGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhbmd1YWdlRnJvbVJ1bnRpbWUocnVudGltZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgW3ByZWZpeCwgbGFuZ3VhZ2VdIG9mIExBTkdVQUdFX1BSRUZJWEVTKSB7XG4gICAgaWYgKHJ1bnRpbWVOYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgcmV0dXJuIGxhbmd1YWdlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogTWFwcyB0aGUgSmF2YSBkaXN0cm8gZW51bSB0byB0aGUgd3JhcHBlciBzY3JpcHQgcGF0aCB0aGUgbGF5ZXIgc2hpcHMuICovXG5jb25zdCBKQVZBX0RJU1RST19XUkFQUEVSUzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgW09kaWdvc0phdmFIYW5kbGVyRGlzdHJvLk9URUxfSEFORExFUl06ICcvb3B0L290ZWwtaGFuZGxlcicsXG4gIFtPZGlnb3NKYXZhSGFuZGxlckRpc3Ryby5PVEVMX1BST1hZX0hBTkRMRVJdOiAnL29wdC9vdGVsLXByb3h5LWhhbmRsZXInLFxuICBbT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8uT1RFTF9TUVNfSEFORExFUl06ICcvb3B0L290ZWwtc3FzLWhhbmRsZXInLFxuICBbT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8uT1RFTF9TVFJFQU1fSEFORExFUl06ICcvb3B0L290ZWwtc3RyZWFtLWhhbmRsZXInLFxufTtcblxuLyoqXG4gKiBUaGUgYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCB2YWx1ZSBmb3IgYSBsYW5ndWFnZS5cbiAqXG4gKiBUaGUgd3JhcHBlciBzY3JpcHQgaXMgbGFuZ3VhZ2Utc3BlY2lmaWMuIEphdmEgZGVmYXVsdHMgdG8gYC9vcHQvb3RlbC1qYXZhYWdlbnQtaGFuZGxlcmA7XG4gKiBQeXRob24gdXNlcyBgL29wdC9vdGVsLWluc3RydW1lbnRgLCBhbmQgTm9kZS5qcy9SdWJ5IHVzZSBgL29wdC9vdGVsLWhhbmRsZXJgLiBTZXR0aW5nIHRoZSB3cm9uZyBvbmUgbWFrZXMgdGhlIGxheWVyIGJvb3RzdHJhcCBmYWlsIGF0IGNvbGQgc3RhcnQgd2l0aFxuICogYC9vcHQvb3RlbC1pbnN0cnVtZW50OiBkb2VzIG5vdCBleGlzdGAgYW5kIHRoZSBmdW5jdGlvbiBlcnJvcnMgb3V0IOKAlCB3aGljaCBpcyB3aHkgdGhpcyBpcyBuZXZlciBhXG4gKiBoYXJkY29kZWQgY29uc3RhbnQgYXQgYSBjYWxsIHNpdGUuXG4gKlxuICogYGRpc3Ryb2AgaXMgb25seSBjb25zdWx0ZWQgZm9yIEphdmEsIHdob3NlIGxheWVyIHNoaXBzIGZvdXIgd3JhcHBlcnMsIG9uZSBwZXIgaGFuZGxlciBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjV3JhcHBlckZvcihsYW5ndWFnZTogc3RyaW5nLCBkaXN0cm8/OiBPZGlnb3NKYXZhSGFuZGxlckRpc3Rybyk6IHN0cmluZyB7XG4gIGlmIChsYW5ndWFnZSA9PT0gJ2phdmEnKSB7XG4gICAgcmV0dXJuIGRpc3RybyA/IEpBVkFfRElTVFJPX1dSQVBQRVJTW2Rpc3Ryb10gOiAnL29wdC9vdGVsLWphdmFhZ2VudC1oYW5kbGVyJztcbiAgfVxuICBjb25zdCBzcGVjID0gTEFOR1VBR0VTW2xhbmd1YWdlXTtcbiAgaWYgKCFzcGVjKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPZGlnb3M6IG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGZvciBsYW5ndWFnZSBcIiR7bGFuZ3VhZ2V9XCJgKTtcbiAgfVxuICByZXR1cm4gc3BlYy5leGVjV3JhcHBlcjtcbn1cblxuLyoqIExheWVyIG5hbWUgZm9yIGEgbGFuZ3VhZ2UvYXJjaGl0ZWN0dXJlIOKAlCBgb2RpZ29zLW90ZWwtcHl0aG9uLWFybTY0YC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllck5hbWVGb3IobGFuZ3VhZ2U6IHN0cmluZywgYXJjaGl0ZWN0dXJlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzcGVjID0gTEFOR1VBR0VTW2xhbmd1YWdlXTtcbiAgaWYgKCFzcGVjKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPZGlnb3M6IHVua25vd24gbGFuZ3VhZ2UgXCIke2xhbmd1YWdlfVwiYCk7XG4gIH1cbiAgcmV0dXJuIGAke3NwZWMubGF5ZXJOYW1lfS0ke2FyY2hpdGVjdHVyZX1gO1xufVxuXG4vKiogRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNldCBvbiBhIGZ1bmN0aW9uLCBhcyBhIHBsYWluIG1hcC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW52VmFycyB7XG4gIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IHN0cmluZztcbn1cblxuLyoqXG4gKiBJZGVtcG90ZW50bHkgYWRkcyBvdXIgbG9hZGVyIHZhbHVlIHRvIGEgdmFsdWUgdGhlIGZ1bmN0aW9uIGFscmVhZHkgY2Fycmllcy5cbiAqXG4gKiBgUFlUSE9OUEFUSGAgaXMgUFJFUEVOREVELCBzbyB0aGUgbGF5ZXIncyBwYWNrYWdlcyBhbmQgaXRzIGBzaXRlY3VzdG9taXplYCBhcmUgZm91bmQgZmlyc3Q7IHRoZVxuICogYCpfT1BUSU9OU2AgdmFyaWFibGVzIGFyZSBhcHBlbmRlZCwgc28gdGhlIGN1c3RvbWVyJ3Mgb3duIGZsYWdzIGtlZXAgcHJlY2VkZW5jZS4gTWlycm9yc1xuICogYGFkZExvYWRlclZhbHVlYCBpbiB0aGUgY29ubmVjdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkTG9hZGVyVmFsdWUoZXhpc3Rpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCwgdmFsdWU6IHN0cmluZywgc2VwYXJhdG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChleGlzdGluZy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cbiAgcmV0dXJuIHNlcGFyYXRvciA9PT0gJzonID8gYCR7dmFsdWV9JHtzZXBhcmF0b3J9JHtleGlzdGluZ31gIDogYCR7ZXhpc3Rpbmd9JHtzZXBhcmF0b3J9JHt2YWx1ZX1gO1xufVxuXG4vKipcbiAqIFRoZSBsb2FkZXIgdmFyaWFibGUgYSBsYW5ndWFnZSBhY3RpdmF0ZXMgdGhyb3VnaCBpbiB3ZWItc2VydmVyIG1vZGUgKGBOT0RFX09QVElPTlNgLFxuICogYEpBVkFfVE9PTF9PUFRJT05TYCwgYFBZVEhPTlBBVEhgKSwgb3IgdW5kZWZpbmVkIGZvciBhIGxhbmd1YWdlIHdpdGggbm8gdmVyaWZpZWQgd2ViLXNlcnZlciBsb2FkZXIuXG4gKlxuICogRXhpc3RzIHNvIGEgY2FsbGVyIHRoYXQgbmVlZHMgdG8gbmFtZSB0aGUgdmFyaWFibGUg4oCUIHRoZSBvd25lcnNoaXAgbWFya2VyJ3Mgcm9sbGJhY2sgc25hcHNob3QsIHdoaWNoIGhhc1xuICogdG8gcmVjb3JkIHRoZSBjYWxsZXIncyBvd24gcHJpb3IgdmFsdWUgZm9yIGl0IOKAlCBkb2VzIG5vdCBoYXZlIHRvIGd1ZXNzIGl0IGZyb20gdGhlIGtleSBvcmRlciBvZlxuICogYHdlYlNlcnZlckVudmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3ZWJTZXJ2ZXJMb2FkZXJLZXkobGFuZ3VhZ2U6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBMQU5HVUFHRVNbbGFuZ3VhZ2VdPy53ZWJTZXJ2ZXI/LmVudktleTtcbn1cblxuLyoqXG4gKiBUaGUgZW52aXJvbm1lbnQgdGhhdCBsb2FkcyB0aGUgbGFuZ3VhZ2UgYWdlbnQgaW4gd2ViLXNlcnZlciAoQVdTIExhbWJkYSBXZWIgQWRhcHRlcikgbW9kZS5cbiAqXG4gKiBXZWItYWRhcHRlciBmdW5jdGlvbnMgcnVuIGEgd2ViIHNlcnZlciByYXRoZXIgdGhhbiBhIExhbWJkYSBoYW5kbGVyLCBhbmQgdGhlIGFkYXB0ZXIgb3duc1xuICogYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCDigJQgc28gaW5zdHJ1bWVudGF0aW9uIGlzIGxvYWRlZCB0aHJvdWdoIHRoZSBsYW5ndWFnZSdzIG93biBsb2FkZXIgdmFyaWFibGUgYW5kXG4gKiB0aGUgd3JhcHBlciBpcyBsZWZ0IGFsb25lLiBIYW5kbGVyLW1vZGUgaW5zdHJ1bWVudGF0aW9uIGFwcGxpZWQgdG8gb25lIG9mIHRoZXNlIG92ZXJ3cml0ZXMgdGhlXG4gKiBhZGFwdGVyJ3Mgd3JhcHBlciBhbmQgdGhlIGZ1bmN0aW9uIHN0b3BzIHNlcnZpbmcuXG4gKlxuICogQHBhcmFtIGV4aXN0aW5nTG9hZGVyVmFsdWUgdGhlIHZhbHVlIHRoZSBmdW5jdGlvbiBhbHJlYWR5IG5lZWRzIGluIGl0cyBsb2FkZXIgdmFyaWFibGUsIHdoaWNoIG91cnMgaXNcbiAqIGpvaW5lZCB0by4gQ0RLJ3MgYGxhbWJkYS5GdW5jdGlvbmAgZXhwb3NlcyBubyB3YXkgdG8gcmVhZCBiYWNrIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHNldCBlbHNld2hlcmUgaW5cbiAqIHRoZSBhcHAsIHNvIGEgdmFsdWUgdGhhdCBtdXN0IGJlIHByZXNlcnZlZCBoYXMgdG8gYmUgcGFzc2VkIGluIGV4cGxpY2l0bHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3ZWJTZXJ2ZXJFbnYoXG4gIGxhbmd1YWdlOiBzdHJpbmcsXG4gIGV4aXN0aW5nTG9hZGVyVmFsdWU/OiBzdHJpbmcsXG4pOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgY29uc3Qgc3BlYyA9IExBTkdVQUdFU1tsYW5ndWFnZV07XG4gIGNvbnN0IGxvYWRlciA9IHNwZWM/LndlYlNlcnZlcjtcbiAgaWYgKCFsb2FkZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgT2RpZ29zOiAke09kaWdvc0luc3RydW1lbnRhdGlvbk1vZGUuV0VCX1NFUlZFUn0gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGZvciAke2xhbmd1YWdlfSDigJQgYCArXG4gICAgICAgICd0aGVyZSBpcyBubyB2ZXJpZmllZCB3ZWItc2VydmVyIGxvYWRlciBmb3IgaXQuIFVzZSBIQU5ETEVSIG1vZGUsIG9yIGxlYXZlIHRoZSBmdW5jdGlvbiB1bmluc3RydW1lbnRlZC4nLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZW52OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIFtsb2FkZXIuZW52S2V5XTogYWRkTG9hZGVyVmFsdWUoZXhpc3RpbmdMb2FkZXJWYWx1ZSwgbG9hZGVyLnZhbHVlLCBsb2FkZXIuc2VwYXJhdG9yKSxcbiAgfTtcbiAgLy8gUHl0aG9uIG11c3QgYmUgcGlubmVkIHRvIHRoZSBIVFRQIE9UTFAgZXhwb3J0ZXIg4oCUIHRoZSBvbmx5IG9uZSBidW5kbGVkIGluIGl0cyBsYXllci4gT3RoZXIgbGFuZ3VhZ2VzXG4gIC8vIGV4cG9ydCBjb3JyZWN0bHkgd2l0aCB0aGVpciBkZWZhdWx0cywgc28gbm90aGluZyBleHRyYSBpcyB3cml0dGVuIGZvciB0aGVtLlxuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhsb2FkZXIuZXh0cmFFbnYpKSB7XG4gICAgZW52W2tdID0gdjtcbiAgfVxuICByZXR1cm4gZW52O1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgc2FtZSBjb25jcmV0ZSBTREsgbmFtZXMgYWR2ZXJ0aXNlZCBieSB0aGUgY29ubmVjdG9yJ3MgR3JhcGhRTCBjYXRhbG9nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RyaWJ1dGlvbldyYXBwZXIobGFuZ3VhZ2U6IHN0cmluZywgbmFtZT86IHN0cmluZywgbGVnYWN5PzogT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8sIHdlYlNlcnZlciA9IGZhbHNlKTogc3RyaW5nIHtcbiAgaWYgKGxlZ2FjeSAmJiBuYW1lKSB0aHJvdyBuZXcgRXJyb3IoJ1VzZSBkaXN0cm8gb3IgbGVnYWN5IGphdmFIYW5kbGVyRGlzdHJvLCBub3QgYm90aCcpO1xuICBpZiAobGVnYWN5KSB7XG4gICAgaWYgKGxhbmd1YWdlICE9PSAnamF2YScpIHJldHVybiBleGVjV3JhcHBlckZvcihsYW5ndWFnZSk7XG4gICAgaWYgKHdlYlNlcnZlcikgdGhyb3cgbmV3IEVycm9yKCdKYXZhIGhhbmRsZXIgYWRhcHRlcnMgcmVxdWlyZSBIQU5ETEVSIG1vZGUnKTtcbiAgICBpZiAoIUpBVkFfRElTVFJPX1dSQVBQRVJTW2xlZ2FjeV0pIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgSmF2YSBoYW5kbGVyIGFkYXB0ZXIgJHtsZWdhY3l9YCk7XG4gICAgcmV0dXJuIGV4ZWNXcmFwcGVyRm9yKGxhbmd1YWdlLCBsZWdhY3kpO1xuICB9XG4gIGlmICh3ZWJTZXJ2ZXIgJiYgbGFuZ3VhZ2UgPT09ICdydWJ5JykgdGhyb3cgbmV3IEVycm9yKCdXZWItc2VydmVyIGluc3RydW1lbnRhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBydWJ5Jyk7XG4gIGNvbnN0IGQgPSBMQU1CREFfRElTVFJJQlVUSU9OUy5maW5kKGQgPT4gZC5sYW5ndWFnZSA9PT0gbGFuZ3VhZ2UgJiYgKG5hbWUgPyBkLm5hbWUgPT09IG5hbWUgOiBkLmlzRGVmYXVsdCkpO1xuICBpZiAoIWQgfHwgKHdlYlNlcnZlciAmJiAoZC5hcnRpZmFjdCB8fCBsYW5ndWFnZSA9PT0gJ3J1YnknIHx8IChsYW5ndWFnZSA9PT0gJ2phdmEnICYmIGQubmFtZSAhPT0gJ2phdmEtbGFtYmRhLW90ZWwtYWdlbnQnKSkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBMYW1iZGEgZGlzdHJvICR7bmFtZSA/PyAnKGRlZmF1bHQpJ30gZm9yICR7bGFuZ3VhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIGQuZXhlY1dyYXBwZXI7XG59XG5cbi8qKiBDb25jcmV0ZSBsYXllciBmYW1pbHkgYW5kIEFXUyBwcmVzZXQgYXNzb2NpYXRlZCB3aXRoIGEgR3JhcGhRTCBkaXN0cm8gbmFtZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0cmlidXRpb25SZWNpcGUobGFuZ3VhZ2U6IHN0cmluZywgbmFtZT86IHN0cmluZywgcnVudGltZT86IHN0cmluZykge1xuICBjb25zdCBkID0gTEFNQkRBX0RJU1RSSUJVVElPTlMuZmluZChkID0+IGQubGFuZ3VhZ2UgPT09IGxhbmd1YWdlICYmIChuYW1lID8gZC5uYW1lID09PSBuYW1lIDogZC5pc0RlZmF1bHQpKTtcbiAgaWYgKCFkKSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIExhbWJkYSBkaXN0cm8gJHtuYW1lID8/ICcoZGVmYXVsdCknfSBmb3IgJHtsYW5ndWFnZX1gKTtcbiAgaWYgKHJ1bnRpbWUgJiYgZC5jb21wYXRpYmxlUnVudGltZXMgJiYgIWQuY29tcGF0aWJsZVJ1bnRpbWVzLmluY2x1ZGVzKHJ1bnRpbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBMYW1iZGEgZGlzdHJvICR7ZC5uYW1lfSBkb2VzIG5vdCBzdXBwb3J0IHJ1bnRpbWUgJHtydW50aW1lfWApO1xuICB9XG4gIHJldHVybiBkO1xufVxuIl19