@odigos/aws-cdk 0.0.10 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +42 -23
- package/README.md +59 -6
- package/lib/collector-config.js +13 -1
- package/lib/generated/layers.d.ts +3 -3
- package/lib/generated/layers.js +148 -148
- package/lib/instrumentation.d.ts +38 -0
- package/lib/instrumentation.js +92 -24
- package/lib/runtime.d.ts +9 -0
- package/lib/runtime.js +13 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
package/lib/instrumentation.js
CHANGED
|
@@ -18,36 +18,52 @@ const ENV_SERVICE_NAME = 'OTEL_SERVICE_NAME';
|
|
|
18
18
|
/** Raises in-function OpenTelemetry verbosity into the function's CloudWatch log group. */
|
|
19
19
|
const ENV_OTEL_LOG_LEVEL = 'OTEL_LOG_LEVEL';
|
|
20
20
|
/**
|
|
21
|
-
*
|
|
21
|
+
* `ODIGOS_MANAGED` — the connector's OWNERSHIP MARKER, written only when `recordOwnershipMarker` is set.
|
|
22
22
|
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
|
|
23
|
+
* The connector derives ownership from this variable alone: `store.OdigosInstrumented` checks for its
|
|
24
|
+
* presence, and a function without it is reported `Absent` — "awaiting your deployment" — before any other
|
|
25
|
+
* component is compared, however completely the rest is applied. So a manual-mode (IaC) function that is
|
|
26
|
+
* meant to show up as instrumented in Odigos has to carry it, and nothing else can stand in for it.
|
|
27
|
+
*/
|
|
28
|
+
const ENV_ODIGOS_MANAGED = 'ODIGOS_MANAGED';
|
|
29
|
+
/**
|
|
30
|
+
* Schema version of the marker payload. Must match `managedManifestVersion` in the connector — it is what
|
|
31
|
+
* tells the connector how to read the rest of the object, so a bumped version there is a change here.
|
|
32
|
+
*/
|
|
33
|
+
const MARKER_VERSION = 1;
|
|
34
|
+
/**
|
|
35
|
+
* Marker recording that this function was instrumented by IaC, and by which version.
|
|
28
36
|
*
|
|
29
|
-
*
|
|
37
|
+
* Distinct from `ODIGOS_MANAGED`, and not a substitute for it: this one is informational and nothing reads
|
|
38
|
+
* it, while that one is the connector's ownership proof (see `recordOwnershipMarker`). The connector
|
|
39
|
+
* ignores variables it does not expect, so this is never reported as drift.
|
|
30
40
|
*/
|
|
31
41
|
const ENV_IAC_MARKER = 'ODIGOS_IAC';
|
|
32
42
|
/**
|
|
33
43
|
* The service a function reports as, when the caller has not named one.
|
|
34
44
|
*
|
|
35
|
-
* NOT `fn.functionName`.
|
|
36
|
-
* `Ref` to the function itself
|
|
37
|
-
*
|
|
38
|
-
*
|
|
45
|
+
* READ FROM THE L1, NOT FROM `fn.functionName`. The L2 property is a cross-environment-aware token that
|
|
46
|
+
* resolves to a `Ref` to the function itself even when the stack set `functionName` explicitly — so the
|
|
47
|
+
* obvious `Stack.of(fn).resolve(fn.functionName)` never yields a literal, and every function silently fell
|
|
48
|
+
* back to its construct id. `CfnFunction.functionName` is the raw template value: the literal the stack
|
|
49
|
+
* passed, or undefined when CloudFormation generates the name.
|
|
39
50
|
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
51
|
+
* Why the fallback is the construct id rather than the generated name: a generated name is a `Ref` to the
|
|
52
|
+
* function, and putting that in the function's own environment makes the resource depend on its own
|
|
53
|
+
* creation — CloudFormation rejects the template with a dependency cycle, at deploy time.
|
|
43
54
|
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
55
|
+
* This matters beyond cosmetics. The connector compares `OTEL_SERVICE_NAME` against the workload's name in
|
|
56
|
+
* Odigos, which is the real AWS function name, so a function reporting its construct id is reported as
|
|
57
|
+
* drifted on the service-name component. Naming the function in your stack is now enough to line the two
|
|
58
|
+
* up; a function whose name CloudFormation generates still needs `serviceName` passed explicitly.
|
|
47
59
|
*/
|
|
48
60
|
function defaultServiceName(fn) {
|
|
49
|
-
const
|
|
50
|
-
|
|
61
|
+
const cfn = fn.node.defaultChild;
|
|
62
|
+
const resolved = cfn === undefined ? undefined : aws_cdk_lib_1.Stack.of(fn).resolve(cfn.functionName);
|
|
63
|
+
if (typeof resolved === 'string' && resolved !== '' && !aws_cdk_lib_1.Token.isUnresolved(resolved)) {
|
|
64
|
+
return resolved;
|
|
65
|
+
}
|
|
66
|
+
return fn.node.id;
|
|
51
67
|
}
|
|
52
68
|
/**
|
|
53
69
|
* Instruments AWS Lambda functions with the Odigos OpenTelemetry layer.
|
|
@@ -88,6 +104,20 @@ class OdigosLambdaInstrumentation extends constructs_1.Construct {
|
|
|
88
104
|
// Rendered once. It depends only on the destination, and rendering it per function would make an
|
|
89
105
|
// accidental difference between two functions possible.
|
|
90
106
|
this.collectorConfig = (0, collector_config_1.renderCollectorConfig)(props.destination);
|
|
107
|
+
// A warning rather than an error, because a collector CAN be reached over gRPC on a non-standard port —
|
|
108
|
+
// but the overwhelmingly likelier reading of `endpoint: "host:4318"` is an OTLP/HTTP endpoint passed to
|
|
109
|
+
// the gRPC exporter, which builds, starts, and then never delivers a batch. Silent for the caller who
|
|
110
|
+
// meant it; loud for the one who did not.
|
|
111
|
+
if (props.destination.endpoint?.endsWith(':4318')) {
|
|
112
|
+
aws_cdk_lib_1.Annotations.of(this).addWarningV2('@odigos/aws-cdk:probableHttpEndpoint', `Odigos: destination endpoint "${props.destination.endpoint}" is on 4318, the OTLP/HTTP port, but ` +
|
|
113
|
+
'`endpoint` configures the gRPC exporter (conventionally 4317). If that is an OTLP/HTTP collector, ' +
|
|
114
|
+
'pass it as `httpEndpoint: "http://host:4318"` instead — the gRPC exporter will export nothing to it.');
|
|
115
|
+
}
|
|
116
|
+
if (props.destination.httpEndpoint?.endsWith(':4317')) {
|
|
117
|
+
aws_cdk_lib_1.Annotations.of(this).addWarningV2('@odigos/aws-cdk:probableGrpcEndpoint', `Odigos: destination httpEndpoint "${props.destination.httpEndpoint}" is on 4317, the OTLP/gRPC port, ` +
|
|
118
|
+
'but `httpEndpoint` configures the HTTP exporter (conventionally 4318). If that is a gRPC collector, ' +
|
|
119
|
+
'pass it as `endpoint: "host:4317"` instead.');
|
|
120
|
+
}
|
|
91
121
|
for (const fn of props.functions ?? []) {
|
|
92
122
|
this.instrument(fn);
|
|
93
123
|
}
|
|
@@ -116,7 +146,9 @@ class OdigosLambdaInstrumentation extends constructs_1.Construct {
|
|
|
116
146
|
const architecture = fn.architecture.name;
|
|
117
147
|
const layer = this.options.layerVersion ?? this.resolver.resolve(language, architecture);
|
|
118
148
|
fn.addLayers(layer);
|
|
119
|
-
|
|
149
|
+
// The ARN, not the construct: the marker has to name the exact layer version the function carries, and
|
|
150
|
+
// in IN_ACCOUNT mode that is a nested-stack output reference resolved at deploy time.
|
|
151
|
+
for (const [name, value] of Object.entries(this.environmentFor(fn, language, layer.layerVersionArn))) {
|
|
120
152
|
fn.addEnvironment(name, value);
|
|
121
153
|
}
|
|
122
154
|
}
|
|
@@ -134,7 +166,7 @@ class OdigosLambdaInstrumentation extends constructs_1.Construct {
|
|
|
134
166
|
* on localhost rather than blocking the invocation on the remote destination, and an enabled signal's
|
|
135
167
|
* `OTEL_*_EXPORTER` stays unset because `otlp` is already the SDK default.
|
|
136
168
|
*/
|
|
137
|
-
environmentFor(fn, language) {
|
|
169
|
+
environmentFor(fn, language, layerArn) {
|
|
138
170
|
const { destination, mode, debug, serviceName, javaHandlerDistro, existingLoaderValue } = this.options;
|
|
139
171
|
const webServer = mode === types_1.OdigosInstrumentationMode.WEB_SERVER;
|
|
140
172
|
const env = {
|
|
@@ -165,12 +197,48 @@ class OdigosLambdaInstrumentation extends constructs_1.Construct {
|
|
|
165
197
|
env[name] = value;
|
|
166
198
|
}
|
|
167
199
|
}
|
|
200
|
+
// LAST, because the marker's snapshot describes the keys above: it is built from what this function is
|
|
201
|
+
// actually getting, not from a fixed list.
|
|
202
|
+
if (this.options.recordOwnershipMarker) {
|
|
203
|
+
env[ENV_ODIGOS_MANAGED] = this.ownershipMarker(env, layerArn, language, webServer);
|
|
204
|
+
}
|
|
168
205
|
return env;
|
|
169
206
|
}
|
|
207
|
+
/**
|
|
208
|
+
* The `ODIGOS_MANAGED` payload: the layer this function carries, plus the snapshot the connector restores
|
|
209
|
+
* from if it ever rolls the function back.
|
|
210
|
+
*
|
|
211
|
+
* WHY `prevEnv` IS NOT OPTIONAL HERE. The connector's rollback iterates exactly this map — a null entry
|
|
212
|
+
* means "delete on rollback", a string means "restore this value verbatim" — and then removes the recorded
|
|
213
|
+
* layer. A marker without it would therefore strip the LAYER while leaving `AWS_LAMBDA_EXEC_WRAPPER`
|
|
214
|
+
* pointing at `/opt/otel-handler`, a script that is no longer mounted: the function then fails at its next
|
|
215
|
+
* cold start. Recording every key this construct sets makes rollback strip the whole set together.
|
|
216
|
+
*
|
|
217
|
+
* The values are null rather than the customer's prior values because a CDK stack cannot read an
|
|
218
|
+
* environment variable back — with one exception that matters, the web-server loader variable, whose prior
|
|
219
|
+
* value the caller has already had to pass as `existingLoaderValue` for exactly the same reason.
|
|
220
|
+
*/
|
|
221
|
+
ownershipMarker(env, layerArn, language, webServer) {
|
|
222
|
+
const prevEnv = {};
|
|
223
|
+
for (const name of Object.keys(env)) {
|
|
224
|
+
// Not itself, and not the informational IaC marker: rollback deletes ODIGOS_MANAGED unconditionally,
|
|
225
|
+
// and ODIGOS_IAC records where the function came from, which stays true after an uninstrument.
|
|
226
|
+
if (name !== ENV_IAC_MARKER) {
|
|
227
|
+
prevEnv[name] = null;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
const loaderKey = webServer ? (0, runtime_1.webServerLoaderKey)(language) : undefined;
|
|
231
|
+
if (loaderKey !== undefined) {
|
|
232
|
+
// Restore the caller's own loader value rather than deleting the variable: ours was appended to it, so
|
|
233
|
+
// deleting the key would take the customer's flags — the ones their app needs to boot — with it.
|
|
234
|
+
prevEnv[loaderKey] = this.options.existingLoaderValue ?? null;
|
|
235
|
+
}
|
|
236
|
+
return JSON.stringify({ v: MARKER_VERSION, layer: layerArn, prevEnv });
|
|
237
|
+
}
|
|
170
238
|
}
|
|
171
239
|
exports.OdigosLambdaInstrumentation = OdigosLambdaInstrumentation;
|
|
172
240
|
_a = JSII_RTTI_SYMBOL_1;
|
|
173
|
-
OdigosLambdaInstrumentation[_a] = { fqn: "@odigos/aws-cdk.OdigosLambdaInstrumentation", version: "0.0.
|
|
241
|
+
OdigosLambdaInstrumentation[_a] = { fqn: "@odigos/aws-cdk.OdigosLambdaInstrumentation", version: "0.0.11" };
|
|
174
242
|
/**
|
|
175
243
|
* Applies Odigos instrumentation to every `lambda.Function` in a scope.
|
|
176
244
|
*
|
|
@@ -208,5 +276,5 @@ class OdigosInstrumentationAspect {
|
|
|
208
276
|
}
|
|
209
277
|
exports.OdigosInstrumentationAspect = OdigosInstrumentationAspect;
|
|
210
278
|
_b = JSII_RTTI_SYMBOL_1;
|
|
211
|
-
OdigosInstrumentationAspect[_b] = { fqn: "@odigos/aws-cdk.OdigosInstrumentationAspect", version: "0.0.
|
|
212
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUEwRDtBQUMxRCxpREFBaUQ7QUFDakQsMkNBQW1EO0FBQ25ELHlEQVE0QjtBQUM1QiwrQ0FBb0Q7QUFDcEQscURBQXVEO0FBQ3ZELHVDQUE4RTtBQUM5RSxtQ0FLaUI7QUFFakIsMkVBQTJFO0FBQzNFLE1BQU0sZ0JBQWdCLEdBQUcseUJBQXlCLENBQUM7QUFDbkQsa0VBQWtFO0FBQ2xFLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUM7QUFDN0MsMkZBQTJGO0FBQzNGLE1BQU0sa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUM7QUFFNUM7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQztBQUVwQzs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEVBQW1CO0lBQzdDLE1BQU0sUUFBUSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdkQsT0FBTyxPQUFPLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDOUQsQ0FBQztBQTZHRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxNQUFhLDJCQUE0QixTQUFRLHNCQUFTO0lBTXhELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBdUM7UUFDL0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUhGLGlCQUFZLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUtoRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksb0NBQW1CLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxXQUFXLElBQUkseUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFcEcsaUdBQWlHO1FBQ2pHLHdEQUF3RDtRQUN4RCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUEsd0NBQXFCLEVBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWhFLEtBQUssTUFBTSxFQUFFLElBQUksS0FBSyxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksVUFBVSxDQUFDLEVBQW1CO1FBQ25DLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3BDLE1BQU0sUUFBUSxHQUFHLElBQUEsNkJBQW1CLEVBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsTUFBTSxPQUFPLEdBQ1gsb0JBQW9CLFdBQVcsc0NBQXNDO2dCQUNyRSw4R0FBOEcsQ0FBQztZQUNqSCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztnQkFDekMseUJBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsT0FBTyxZQUFZLENBQUMsQ0FBQztnQkFDOUYsT0FBTztZQUNULENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsT0FBTyx3REFBd0QsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUzQixNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztRQUMxQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDekYsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVwQixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFRCw4Q0FBOEM7SUFDdkMsYUFBYSxDQUFDLFNBQTRCO1FBQy9DLEtBQUssTUFBTSxFQUFFLElBQUksU0FBUyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxjQUFjLENBQUMsRUFBbUIsRUFBRSxRQUFnQjtRQUMxRCxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN2RyxNQUFNLFNBQVMsR0FBRyxJQUFJLEtBQUssaUNBQXlCLENBQUMsVUFBVSxDQUFDO1FBRWhFLE1BQU0sR0FBRyxHQUE4QjtZQUNyQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsV0FBVyxJQUFJLGtCQUFrQixDQUFDLEVBQUUsQ0FBQztZQUN6RCxDQUFDLDJDQUF3QixDQUFDLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDaEQsQ0FBQyxjQUFjLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSx1QkFBYyxJQUFJLFlBQVksRUFBRSxDQUFDO1NBQ25HLENBQUM7UUFFRixJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2Qsa0dBQWtHO1lBQ2xHLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUEsc0JBQVksRUFBQyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7YUFBTSxDQUFDO1lBQ04sR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBQSx3QkFBYyxFQUFDLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3BFLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1YsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQ3BDLENBQUM7UUFDSCxDQUFDO1FBRUQsdUdBQXVHO1FBQ3ZHLGtHQUFrRztRQUNsRywyRUFBMkU7UUFDM0UsTUFBTSxTQUFTLEdBQXdDO1lBQ3JELENBQUMsc0NBQW1CLEVBQUUsSUFBQSxzQ0FBbUIsRUFBQyxJQUFBLGdDQUFhLEVBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDN0UsQ0FBQyx1Q0FBb0IsRUFBRSxJQUFBLHNDQUFtQixFQUFDLElBQUEsZ0NBQWEsRUFBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUMvRSxDQUFDLG9DQUFpQixFQUFFLElBQUEsc0NBQW1CLEVBQUMsSUFBQSxnQ0FBYSxFQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQzFFLENBQUM7UUFDRixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksU0FBUyxFQUFFLENBQUM7WUFDdEMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3hCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDcEIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7O0FBekdILGtFQTBHQzs7O0FBT0Q7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFhLDJCQUEyQjtJQUd0Qzs7OztPQUlHO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEtBQXVDO1FBQ25FLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSwyQkFBMkIsQ0FBQyxLQUFLLEVBQUUsNkJBQTZCLEVBQUU7WUFDM0YsdUJBQXVCLEVBQUUsSUFBSTtZQUM3QixHQUFHLEtBQUs7U0FDVCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQWdCO1FBQzNCLElBQUksSUFBSSxZQUFZLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxDQUFDO0lBQ0gsQ0FBQzs7QUFuQkgsa0VBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbnMsIElBc3BlY3QsIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge1xuICBFTlZfQ09MTEVDVE9SX0NPTkZJR19VUkksXG4gIEVOVl9MT0dTX0VYUE9SVEVSLFxuICBFTlZfTUVUUklDU19FWFBPUlRFUixcbiAgRU5WX1RSQUNFU19FWFBPUlRFUixcbiAgZXhwb3J0ZXJPdmVycmlkZUZvcixcbiAgcmVuZGVyQ29sbGVjdG9yQ29uZmlnLFxuICBzaWduYWxFbmFibGVkLFxufSBmcm9tICcuL2NvbGxlY3Rvci1jb25maWcnO1xuaW1wb3J0IHsgT0RJR09TX1ZFUlNJT04gfSBmcm9tICcuL2dlbmVyYXRlZC9sYXllcnMnO1xuaW1wb3J0IHsgT2RpZ29zTGF5ZXJSZXNvbHZlciB9IGZyb20gJy4vbGF5ZXItcmVzb2x2ZXInO1xuaW1wb3J0IHsgZXhlY1dyYXBwZXJGb3IsIGxhbmd1YWdlRnJvbVJ1bnRpbWUsIHdlYlNlcnZlckVudiB9IGZyb20gJy4vcnVudGltZSc7XG5pbXBvcnQge1xuICBPZGlnb3NEZXN0aW5hdGlvbixcbiAgT2RpZ29zSW5zdHJ1bWVudGF0aW9uTW9kZSxcbiAgT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8sXG4gIE9kaWdvc0xheWVyU291cmNlLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqIGBBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUmAg4oCUIHRoZSBsYXllcidzIGVudHJ5IHBvaW50IGluIGhhbmRsZXIgbW9kZS4gKi9cbmNvbnN0IEVOVl9FWEVDX1dSQVBQRVIgPSAnQVdTX0xBTUJEQV9FWEVDX1dSQVBQRVInO1xuLyoqIFNlcnZpY2UgbmFtZSByZXBvcnRlZCBvbiBldmVyeSBzcGFuLCBtZXRyaWMgYW5kIGxvZyByZWNvcmQuICovXG5jb25zdCBFTlZfU0VSVklDRV9OQU1FID0gJ09URUxfU0VSVklDRV9OQU1FJztcbi8qKiBSYWlzZXMgaW4tZnVuY3Rpb24gT3BlblRlbGVtZXRyeSB2ZXJib3NpdHkgaW50byB0aGUgZnVuY3Rpb24ncyBDbG91ZFdhdGNoIGxvZyBncm91cC4gKi9cbmNvbnN0IEVOVl9PVEVMX0xPR19MRVZFTCA9ICdPVEVMX0xPR19MRVZFTCc7XG5cbi8qKlxuICogTWFya2VyIHJlY29yZGluZyB0aGF0IHRoaXMgZnVuY3Rpb24gd2FzIGluc3RydW1lbnRlZCBieSBJYUMsIGFuZCBieSB3aGljaCB2ZXJzaW9uLlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgYE9ESUdPU19NQU5BR0VEYC4gVGhhdCB2YXJpYWJsZSBpcyB0aGUgY29ubmVjdG9yJ3MgT1dORVJTSElQIFBST09GOiBhIGZ1bmN0aW9uXG4gKiBjYXJyeWluZyBpdCBpcyBvbmUgdGhlIGNvbm5lY3RvciBiZWxpZXZlcyBpdCBpbnN0cnVtZW50ZWQsIHdob3NlIGVudmlyb25tZW50IGl0IHdpbGwgY29udmVyZ2Ugb24gZXZlcnlcbiAqIHJlY29uY2lsZSBhbmQgc3RyaXAgb24gcm9sbGJhY2sg4oCUIHVzaW5nIGEgc25hcHNob3Qgb2YgXCJ0aGUgY3VzdG9tZXIncyBvcmlnaW5hbCB2YWx1ZXNcIiB0aGF0IGEgQ0RLXG4gKiBkZXBsb3ltZW50IG5ldmVyIHdyb3RlLiBTZXR0aW5nIGl0IGhlcmUgd291bGQgaGFuZCB0aGUgY29ubmVjdG9yIGEgZnVuY3Rpb24gaXQgZG9lcyBub3Qgb3duLCB3aXRoIGFcbiAqIHNuYXBzaG90IGRlc2NyaWJpbmcgYSBzdGF0ZSB0aGF0IG5ldmVyIGV4aXN0ZWQuXG4gKlxuICogVGhpcyB2YXJpYWJsZSBpcyBpbmZvcm1hdGlvbmFsIG9ubHkuIE5vdGhpbmcgcmVhZHMgaXQuXG4gKi9cbmNvbnN0IEVOVl9JQUNfTUFSS0VSID0gJ09ESUdPU19JQUMnO1xuXG4vKipcbiAqIFRoZSBzZXJ2aWNlIGEgZnVuY3Rpb24gcmVwb3J0cyBhcywgd2hlbiB0aGUgY2FsbGVyIGhhcyBub3QgbmFtZWQgb25lLlxuICpcbiAqIE5PVCBgZm4uZnVuY3Rpb25OYW1lYC4gRm9yIGEgZnVuY3Rpb24gd2hvc2UgcGh5c2ljYWwgbmFtZSBDbG91ZEZvcm1hdGlvbiBnZW5lcmF0ZXMsIHRoYXQgcHJvcGVydHkgaXMgYVxuICogYFJlZmAgdG8gdGhlIGZ1bmN0aW9uIGl0c2VsZiDigJQgcHV0dGluZyBpdCBpbiB0aGUgZnVuY3Rpb24ncyBvd24gZW52aXJvbm1lbnQgbWFrZXMgdGhlIHJlc291cmNlIGRlcGVuZFxuICogb24gaXRzIG93biBjcmVhdGlvbiwgYW5kIENsb3VkRm9ybWF0aW9uIHJlamVjdHMgdGhlIHRlbXBsYXRlIHdpdGggYSBkZXBlbmRlbmN5IGN5Y2xlLiBFdmVyeVxuICogaW5zdHJ1bWVudGVkIGZ1bmN0aW9uIHdvdWxkIGZhaWwgdG8gZGVwbG95LCBhdCBkZXBsb3kgdGltZSByYXRoZXIgdGhhbiBzeW50aCB0aW1lLlxuICpcbiAqIFNvOiB1c2UgdGhlIHBoeXNpY2FsIG5hbWUgd2hlbiB0aGUgY2FsbGVyIHNldCBvbmUgZXhwbGljaXRseSAoYHJlc29sdmVgIHlpZWxkcyBhIGxpdGVyYWwgc3RyaW5nIGZvciBhXG4gKiBrbm93biBwaHlzaWNhbCBuYW1lLCBhbmQgYSBgUmVmYCBvYmplY3Qgb3RoZXJ3aXNlKSwgYW5kIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gdGhlIGNvbnN0cnVjdCBpZCwgd2hpY2hcbiAqIGlzIHdoYXQgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgY29kZSBhbmQgbmVlZHMgbm8gcmVmZXJlbmNlIGF0IGFsbC5cbiAqXG4gKiBUaGUgY29ubmVjdG9yIHJlcG9ydHMgdGhlIHJlYWwgQVdTIGZ1bmN0aW9uIG5hbWUgZm9yIHRoZSBmdW5jdGlvbnMgSVQgaW5zdHJ1bWVudHMuIEEgZnVuY3Rpb24gd2l0aCBhXG4gKiBnZW5lcmF0ZWQgcGh5c2ljYWwgbmFtZSB0aGVyZWZvcmUgcmVwb3J0cyBkaWZmZXJlbnRseSB1bmRlciB0aGUgdHdvIHBhdGhzIOKAlCBwYXNzIGBzZXJ2aWNlTmFtZWBcbiAqIGV4cGxpY2l0bHkgaWYgdGhhdCBtYXR0ZXJzLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0U2VydmljZU5hbWUoZm46IGxhbWJkYS5GdW5jdGlvbik6IHN0cmluZyB7XG4gIGNvbnN0IHJlc29sdmVkID0gU3RhY2sub2YoZm4pLnJlc29sdmUoZm4uZnVuY3Rpb25OYW1lKTtcbiAgcmV0dXJuIHR5cGVvZiByZXNvbHZlZCA9PT0gJ3N0cmluZycgPyByZXNvbHZlZCA6IGZuLm5vZGUuaWQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBzaGFyZWQgYnkgdGhlIGNvbnN0cnVjdCBhbmQgdGhlIGFzcGVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPZGlnb3NJbnN0cnVtZW50YXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBpbi1MYW1iZGEgY29sbGVjdG9yIGV4cG9ydHMgdG8uXG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbjogT2RpZ29zRGVzdGluYXRpb247XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBPZGlnb3MgbGF5ZXIgY29tZXMgZnJvbS5cbiAgICpcbiAgICogQGRlZmF1bHQgT2RpZ29zTGF5ZXJTb3VyY2UuT0RJR09TX1BVQkxJQ1xuICAgKi9cbiAgcmVhZG9ubHkgbGF5ZXJTb3VyY2U/OiBPZGlnb3NMYXllclNvdXJjZTtcblxuICAvKipcbiAgICogSGFuZGxlciBtb2RlIG9yIHdlYi1zZXJ2ZXIgKExhbWJkYSBXZWIgQWRhcHRlcikgbW9kZS5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gYXV0by1kZXRlY3Rpb24sIGFuZCB0aGF0IGlzIGRlbGliZXJhdGUgcmF0aGVyIHRoYW4gYW4gb21pc3Npb246IGRldGVjdGluZyB0aGUgd2ViIGFkYXB0ZXJcbiAgICogbWVhbnMgaW5zcGVjdGluZyB0aGUgZnVuY3Rpb24ncyBvdGhlciBsYXllcnMsIHdoaWNoIGF0IHN5bnRoIHRpbWUgYXJlIGZyZXF1ZW50bHkgdW5yZXNvbHZlZCB0b2tlbnMuXG4gICAqIEEgZGV0ZWN0b3IgdGhhdCBpcyByaWdodCBtb3N0IG9mIHRoZSB0aW1lIHdvdWxkIHNpbGVudGx5IGJyZWFrIHRoZSBmdW5jdGlvbnMgaXQgZ290IHdyb25nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLkhBTkRMRVJcbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlO1xuXG4gIC8qKlxuICAgKiBXaGljaCBvZiB0aGUgSmF2YSBsYXllcidzIGZvdXIgd3JhcHBlciBzY3JpcHRzIHRvIHVzZS4gSWdub3JlZCBmb3Igb3RoZXIgbGFuZ3VhZ2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBPZGlnb3NKYXZhSGFuZGxlckRpc3Ryby5PVEVMX0hBTkRMRVJcbiAgICovXG4gIHJlYWRvbmx5IGphdmFIYW5kbGVyRGlzdHJvPzogT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm87XG5cbiAgLyoqXG4gICAqIGBPVEVMX1NFUlZJQ0VfTkFNRWAgZm9yIGV2ZXJ5IGZ1bmN0aW9uIHRoaXMgaW5zdHJ1bWVudHMuXG4gICAqXG4gICAqIFVzdWFsbHkgd3JvbmcgdG8gc2V0IHdoZW4gaW5zdHJ1bWVudGluZyBtb3JlIHRoYW4gb25lIGZ1bmN0aW9uIOKAlCB0aGV5IHdvdWxkIGFsbCByZXBvcnQgYXMgdGhlIHNhbWVcbiAgICogc2VydmljZS5cbiAgICpcbiAgICogTGVmdCB1bnNldCwgYSBmdW5jdGlvbiByZXBvcnRzIGFzIGl0cyBleHBsaWNpdGx5LXNldCBwaHlzaWNhbCBuYW1lIGlmIGl0IGhhcyBvbmUsIGFuZCBvdGhlcndpc2UgYXNcbiAgICogaXRzIGNvbnN0cnVjdCBpZC4gSXQgZGVsaWJlcmF0ZWx5IGRvZXMgbm90IGRlZmF1bHQgdG8gdGhlIGdlbmVyYXRlZCBwaHlzaWNhbCBuYW1lOiB0aGF0IHZhbHVlIGlzIGFcbiAgICogYFJlZmAgdG8gdGhlIGZ1bmN0aW9uIGl0c2VsZiwgYW5kIGEgZnVuY3Rpb24gcmVmZXJlbmNpbmcgaXRzZWxmIGluIGl0cyBvd24gZW52aXJvbm1lbnQgaXMgYVxuICAgKiBDbG91ZEZvcm1hdGlvbiBkZXBlbmRlbmN5IGN5Y2xlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBmdW5jdGlvbidzIHBoeXNpY2FsIG5hbWUgaWYgZXhwbGljaXRseSBzZXQsIG90aGVyd2lzZSBpdHMgY29uc3RydWN0IGlkXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUmFpc2UgaW4tZnVuY3Rpb24gT3BlblRlbGVtZXRyeSB2ZXJib3NpdHkgKGBPVEVMX0xPR19MRVZFTD1kZWJ1Z2ApLlxuICAgKlxuICAgKiBUaGUgbGF5ZXIsIFNESyBhbmQgY29sbGVjdG9yIHRoZW4gZW1pdCBzcGFuIGFuZCBPVExQLWV4cG9ydCBkaWFnbm9zdGljcyBpbnRvIHRoZSBmdW5jdGlvbidzIENsb3VkV2F0Y2hcbiAgICogbG9nIGdyb3VwLiBVc2VmdWwgd2hpbGUgd2lyaW5nIHVwIGEgZGVzdGluYXRpb24sIGV4cGVuc2l2ZSB0byBsZWF2ZSBvbi5cbiAgICpcbiAgICogSGFzIG5vIGVmZmVjdCBpbiB3ZWItc2VydmVyIG1vZGUsIG1hdGNoaW5nIHRoZSBjb25uZWN0b3IsIHdoaWNoIG5ldmVyIHNldHMgYSBsb2cgbGV2ZWwgdGhlcmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkZWJ1Zz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEF0dGFjaCB0aGlzIGxheWVyIGluc3RlYWQgb2YgcmVzb2x2aW5nIG9uZS4gT3ZlcnJpZGVzIGBsYXllclNvdXJjZWAgZW50aXJlbHkuXG4gICAqXG4gICAqIFRoZSBlc2NhcGUgaGF0Y2ggZm9yIGEgbGF5ZXIgbWlycm9yZWQgaW50byBhIHByaXZhdGUgcmVnaXN0cnkgb3IgYW4gaW50ZXJuYWwgYWNjb3VudC4gVGhlIGxheWVyIG11c3RcbiAgICogaGF2ZSB0aGUgc2FtZSBjb250ZW50cyBhcyB0aGUgT2RpZ29zIG9uZSDigJQgdGhlIGVudmlyb25tZW50IHNldCBoZXJlIGFzc3VtZXMgaXRzIGV4YWN0IHNjcmlwdCBsYXlvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcmVzb2x2ZWQgZnJvbSBsYXllclNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgbGF5ZXJWZXJzaW9uPzogbGFtYmRhLklMYXllclZlcnNpb247XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0aGUgZnVuY3Rpb24gYWxyZWFkeSBuZWVkcyBpbiBpdHMgbGFuZ3VhZ2UgbG9hZGVyIHZhcmlhYmxlIChgTk9ERV9PUFRJT05TYCxcbiAgICogYEpBVkFfVE9PTF9PUFRJT05TYCBvciBgUFlUSE9OUEFUSGApLCB3aGljaCB0aGUgT2RpZ29zIGxvYWRlciBpcyBqb2luZWQgdG8gcmF0aGVyIHRoYW4gcmVwbGFjaW5nLlxuICAgKlxuICAgKiBPbmx5IHVzZWQgaW4gd2ViLXNlcnZlciBtb2RlLiBJdCBoYXMgdG8gYmUgcGFzc2VkIGV4cGxpY2l0bHkgYmVjYXVzZSBDREsncyBgbGFtYmRhLkZ1bmN0aW9uYCBleHBvc2VzXG4gICAqIG5vIHdheSB0byByZWFkIGJhY2sgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0IGVsc2V3aGVyZSBpbiB0aGUgYXBwIOKAlCBhbiBvbWl0dGVkIHZhbHVlIGhlcmUgaXNcbiAgICogc2lsZW50bHkgb3ZlcndyaXR0ZW4sIHdoaWNoIGZvciBgTk9ERV9PUFRJT05TYCBjYW4gbWVhbiBsb3NpbmcgYSBmbGFnIHRoZSBhcHAgbmVlZHMgdG8gYm9vdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgbG9hZGVyIHZhcmlhYmxlIGlzIHNldCB0byB0aGUgT2RpZ29zIHZhbHVlIGFsb25lXG4gICAqL1xuICByZWFkb25seSBleGlzdGluZ0xvYWRlclZhbHVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTa2lwIGZ1bmN0aW9ucyB3aG9zZSBydW50aW1lIGhhcyBubyBPcGVuVGVsZW1ldHJ5IExhbWJkYSBsYXllciBpbnN0ZWFkIG9mIHRocm93aW5nLlxuICAgKlxuICAgKiBgZG90bmV0KmAgYW5kIGBwcm92aWRlZC4qYCAoR28sIGN1c3RvbSBydW50aW1lcykgaGF2ZSBubyBsYW5ndWFnZSBsYXllciB1cHN0cmVhbS4gRXhwbGljaXRseVxuICAgKiBpbnN0cnVtZW50aW5nIG9uZSBpcyBhIG1pc3Rha2Ugd29ydGggZmFpbGluZyBvbjsgc3dlZXBpbmcgYSB3aG9sZSBzdGFjayB3aXRoIHRoZSBhc3BlY3QgYW5kIGhpdHRpbmdcbiAgICogb25lIGlzIG5vdCwgd2hpY2ggaXMgd2h5IHRoZSBhc3BlY3QgZGVmYXVsdHMgdGhpcyB0byBgdHJ1ZWAgYW5kIHRoZSBjb25zdHJ1Y3QgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm9wcyBmb3Ige0BsaW5rIE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uUHJvcHMgZXh0ZW5kcyBPZGlnb3NJbnN0cnVtZW50YXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEZ1bmN0aW9ucyB0byBpbnN0cnVtZW50IG9uIGNvbnN0cnVjdGlvbi4gTW9yZSBjYW4gYmUgYWRkZWQgd2l0aCBgaW5zdHJ1bWVudCgpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbnM/OiBsYW1iZGEuRnVuY3Rpb25bXTtcbn1cblxuLyoqXG4gKiBJbnN0cnVtZW50cyBBV1MgTGFtYmRhIGZ1bmN0aW9ucyB3aXRoIHRoZSBPZGlnb3MgT3BlblRlbGVtZXRyeSBsYXllci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3Qgb2RpZ29zID0gbmV3IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvbih0aGlzLCAnT2RpZ29zJywge1xuICogICBkZXN0aW5hdGlvbjogeyBlbmRwb2ludDogJ290bHAuZXhhbXBsZS5jb206NDMxNycgfSxcbiAqICAgZnVuY3Rpb25zOiBbYXBpRm4sIHdvcmtlckZuXSxcbiAqIH0pO1xuICogb2RpZ29zLmluc3RydW1lbnQoYW5vdGhlckZuKTtcbiAqIGBgYFxuICpcbiAqIFdoYXQgaXQgZG9lcyB0byBlYWNoIGZ1bmN0aW9uOiBhdHRhY2hlcyB0aGUgbGF5ZXIgZm9yIHRoZSBmdW5jdGlvbidzIGxhbmd1YWdlIGFuZCBhcmNoaXRlY3R1cmUsIHNldHNcbiAqIGBBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUmAgc28gdGhlIGxheWVyIGxvYWRzIHRoZSBTREssIHNldHMgYE9URUxfU0VSVklDRV9OQU1FYCwgYW5kIGhhbmRzIHRoZSBpbi1MYW1iZGFcbiAqIGNvbGxlY3RvciBpdHMgZW50aXJlIGNvbmZpZ3VyYXRpb24gaW5saW5lIHRocm91Z2ggYE9QRU5URUxFTUVUUllfQ09MTEVDVE9SX0NPTkZJR19VUklgLlxuICpcbiAqIFRoZSBmdW5jdGlvbidzIFNESyBleHBvcnRzIHRvIHRoZSBjb2xsZWN0b3Igb24gbG9jYWxob3N0LCBub3QgdG8geW91ciBkZXN0aW5hdGlvbi4gVGhlIGNvbGxlY3RvclxuICogZm9yd2FyZHMgYWZ0ZXIgdGhlIGhhbmRsZXIgaGFzIGFscmVhZHkgcmV0dXJuZWQsIHNvIGEgc2xvdyBkZXN0aW5hdGlvbiBjb3N0cyBiaWxsZWQgZHVyYXRpb24gcmF0aGVyXG4gKiB0aGFuIGNhbGxlciBsYXRlbmN5LlxuICpcbiAqICMjIERvIG5vdCBhbHNvIGluc3RydW1lbnQgdGhlc2UgZnVuY3Rpb25zIHdpdGggdGhlIGNvbm5lY3RvclxuICpcbiAqIFRoZSBPZGlnb3MgQVdTIGNvbm5lY3RvciBpbnN0cnVtZW50cyBsaXZlIGZ1bmN0aW9ucyBieSBtdXRhdGluZyB0aGVtLCBhbmQgcmVjb25jaWxlcyB0aGVtIGJhY2sgdG8gaXRzXG4gKiBvd24gZGVzaXJlZCBzdGF0ZSBvbiBldmVyeSBwYXNzLiBBIGZ1bmN0aW9uIGluc3RydW1lbnRlZCBoZXJlIGFuZCBhbHNvIGVuYWJsZWQgYXMgYSBjb25uZWN0b3Igc291cmNlXG4gKiBlbmRzIHVwIG93bmVkIGJ5IGJvdGg6IGVhY2ggYGNkayBkZXBsb3lgIHJlYXNzZXJ0cyB0aGUgQ0RLJ3MgZW52aXJvbm1lbnQsIGVhY2ggcmVjb25jaWxlIHJlYXNzZXJ0cyB0aGVcbiAqIGNvbm5lY3RvcidzLCBhbmQgZXZlcnkgcm91bmQgdHJpcCBwdWJsaXNoZXMgYSBuZXcgZnVuY3Rpb24gdmVyc2lvbi5cbiAqXG4gKiBDaG9vc2Ugb25lIHBlciBmdW5jdGlvbi4gVGhpcyBjb25zdHJ1Y3QgbmV2ZXIgc2V0cyB0aGUgY29ubmVjdG9yJ3MgYE9ESUdPU19NQU5BR0VEYCBvd25lcnNoaXAgbWFya2VyLFxuICogc28gYW4gSWFDLWluc3RydW1lbnRlZCBmdW5jdGlvbiBpcyBub3Qgb25lIHRoZSBjb25uZWN0b3Igd2lsbCByb2xsIGJhY2sg4oCUIGJ1dCBpdCB3aWxsIGhhcHBpbHkgdGFrZSBpdFxuICogb3ZlciBpZiB5b3UgZW5hYmxlIGl0IGFzIGEgc291cmNlLlxuICovXG5leHBvcnQgY2xhc3MgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBPZGlnb3NJbnN0cnVtZW50YXRpb25PcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVyOiBPZGlnb3NMYXllclJlc29sdmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbGxlY3RvckNvbmZpZzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RydW1lbnRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBwcm9wcztcbiAgICB0aGlzLnJlc29sdmVyID0gbmV3IE9kaWdvc0xheWVyUmVzb2x2ZXIodGhpcywgcHJvcHMubGF5ZXJTb3VyY2UgPz8gT2RpZ29zTGF5ZXJTb3VyY2UuT0RJR09TX1BVQkxJQyk7XG5cbiAgICAvLyBSZW5kZXJlZCBvbmNlLiBJdCBkZXBlbmRzIG9ubHkgb24gdGhlIGRlc3RpbmF0aW9uLCBhbmQgcmVuZGVyaW5nIGl0IHBlciBmdW5jdGlvbiB3b3VsZCBtYWtlIGFuXG4gICAgLy8gYWNjaWRlbnRhbCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGZ1bmN0aW9ucyBwb3NzaWJsZS5cbiAgICB0aGlzLmNvbGxlY3RvckNvbmZpZyA9IHJlbmRlckNvbGxlY3RvckNvbmZpZyhwcm9wcy5kZXN0aW5hdGlvbik7XG5cbiAgICBmb3IgKGNvbnN0IGZuIG9mIHByb3BzLmZ1bmN0aW9ucyA/PyBbXSkge1xuICAgICAgdGhpcy5pbnN0cnVtZW50KGZuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5zdHJ1bWVudHMgb25lIGZ1bmN0aW9uLiBJZGVtcG90ZW50IOKAlCBpbnN0cnVtZW50aW5nIHRoZSBzYW1lIGZ1bmN0aW9uIHR3aWNlIGlzIGEgbm8tb3AgcmF0aGVyIHRoYW4gYVxuICAgKiBkb3VibGVkIGxvYWRlciB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBpbnN0cnVtZW50KGZuOiBsYW1iZGEuRnVuY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBmbi5ub2RlLnBhdGg7XG4gICAgaWYgKHRoaXMuaW5zdHJ1bWVudGVkLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcnVudGltZU5hbWUgPSBmbi5ydW50aW1lLm5hbWU7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5ndWFnZUZyb21SdW50aW1lKHJ1bnRpbWVOYW1lKTtcbiAgICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgYE9kaWdvczogcnVudGltZSBcIiR7cnVudGltZU5hbWV9XCIgaGFzIG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGAgK1xuICAgICAgICAnKHVwc3RyZWFtIHB1Ymxpc2hlcyBsYXllcnMgZm9yIHB5dGhvbiwgbm9kZWpzLCBqYXZhIGFuZCBydWJ5IG9ubHkpLCBzbyB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBpbnN0cnVtZW50ZWQuJztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2tpcFVuc3VwcG9ydGVkUnVudGltZXMpIHtcbiAgICAgICAgQW5ub3RhdGlvbnMub2YoZm4pLmFkZFdhcm5pbmdWMignQG9kaWdvcy9hd3MtY2RrOnVuc3VwcG9ydGVkUnVudGltZScsIGAke21lc3NhZ2V9IFNraXBwaW5nLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bWVzc2FnZX0gU2V0IHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzOiB0cnVlIHRvIHNraXAgaXQgaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICB0aGlzLmluc3RydW1lbnRlZC5hZGQoa2V5KTtcblxuICAgIGNvbnN0IGFyY2hpdGVjdHVyZSA9IGZuLmFyY2hpdGVjdHVyZS5uYW1lO1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy5vcHRpb25zLmxheWVyVmVyc2lvbiA/PyB0aGlzLnJlc29sdmVyLnJlc29sdmUobGFuZ3VhZ2UsIGFyY2hpdGVjdHVyZSk7XG4gICAgZm4uYWRkTGF5ZXJzKGxheWVyKTtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudmlyb25tZW50Rm9yKGZuLCBsYW5ndWFnZSkpKSB7XG4gICAgICBmbi5hZGRFbnZpcm9ubWVudChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEluc3RydW1lbnRzIGV2ZXJ5IGZ1bmN0aW9uIGluIHRoZSBsaXN0LiAqL1xuICBwdWJsaWMgaW5zdHJ1bWVudEFsbChmdW5jdGlvbnM6IGxhbWJkYS5GdW5jdGlvbltdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBmbiBvZiBmdW5jdGlvbnMpIHtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudChmbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBlbnZpcm9ubWVudCBhcHBsaWVkIHRvIG9uZSBmdW5jdGlvbi5cbiAgICpcbiAgICogTWlycm9ycyBgYXBwbHlIYW5kbGVyRW52YCAvIGBhcHBseVdlYlNlcnZlckVudmAgaW4gdGhlIGNvbm5lY3RvciwgaW5jbHVkaW5nIHdoYXQgaXMgZGVsaWJlcmF0ZWx5IE5PVFxuICAgKiBzZXQ6IGBPVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlRgIHN0YXlzIHVuc2V0IHNvIHRoZSBTREsga2VlcHMgZXhwb3J0aW5nIHRvIHRoZSBpbi1MYW1iZGEgY29sbGVjdG9yXG4gICAqIG9uIGxvY2FsaG9zdCByYXRoZXIgdGhhbiBibG9ja2luZyB0aGUgaW52b2NhdGlvbiBvbiB0aGUgcmVtb3RlIGRlc3RpbmF0aW9uLCBhbmQgYW4gZW5hYmxlZCBzaWduYWwnc1xuICAgKiBgT1RFTF8qX0VYUE9SVEVSYCBzdGF5cyB1bnNldCBiZWNhdXNlIGBvdGxwYCBpcyBhbHJlYWR5IHRoZSBTREsgZGVmYXVsdC5cbiAgICovXG4gIHByaXZhdGUgZW52aXJvbm1lbnRGb3IoZm46IGxhbWJkYS5GdW5jdGlvbiwgbGFuZ3VhZ2U6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHsgZGVzdGluYXRpb24sIG1vZGUsIGRlYnVnLCBzZXJ2aWNlTmFtZSwgamF2YUhhbmRsZXJEaXN0cm8sIGV4aXN0aW5nTG9hZGVyVmFsdWUgfSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCB3ZWJTZXJ2ZXIgPSBtb2RlID09PSBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLldFQl9TRVJWRVI7XG5cbiAgICBjb25zdCBlbnY6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICBbRU5WX1NFUlZJQ0VfTkFNRV06IHNlcnZpY2VOYW1lID8/IGRlZmF1bHRTZXJ2aWNlTmFtZShmbiksXG4gICAgICBbRU5WX0NPTExFQ1RPUl9DT05GSUdfVVJJXTogdGhpcy5jb2xsZWN0b3JDb25maWcsXG4gICAgICBbRU5WX0lBQ19NQVJLRVJdOiBKU09OLnN0cmluZ2lmeSh7IHY6IDEsIHNvdXJjZTogJ2NkaycsIHZlcnNpb246IE9ESUdPU19WRVJTSU9OIHx8ICd1bnJlbGVhc2VkJyB9KSxcbiAgICB9O1xuXG4gICAgaWYgKHdlYlNlcnZlcikge1xuICAgICAgLy8gTm8gZXhlYyB3cmFwcGVyOiB0aGUgTGFtYmRhIFdlYiBBZGFwdGVyIG93bnMgaXQsIGFuZCBvdmVyd3JpdGluZyBpdCBzdG9wcyB0aGUgZnVuY3Rpb24gc2VydmluZy5cbiAgICAgIE9iamVjdC5hc3NpZ24oZW52LCB3ZWJTZXJ2ZXJFbnYobGFuZ3VhZ2UsIGV4aXN0aW5nTG9hZGVyVmFsdWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW52W0VOVl9FWEVDX1dSQVBQRVJdID0gZXhlY1dyYXBwZXJGb3IobGFuZ3VhZ2UsIGphdmFIYW5kbGVyRGlzdHJvKTtcbiAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBlbnZbRU5WX09URUxfTE9HX0xFVkVMXSA9ICdkZWJ1Zyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VwcHJlc3MgdGhlIHNpZ25hbHMgdGhlIGRlc3RpbmF0aW9uIGRvZXMgbm90IGFjY2VwdC4gQSBzaWduYWwgd2l0aCBubyBjb2xsZWN0b3IgcGlwZWxpbmUgaXMgcmVmdXNlZFxuICAgIC8vIGF0IHRoZSByZWNlaXZlciBvbiBldmVyeSBiYXRjaCwgc28gdGVsbGluZyB0aGUgU0RLIG5vdCB0byBwcm9kdWNlIGl0IGlzIHRoZSBoYWxmIHRoYXQgc3RvcHMgdGhlXG4gICAgLy8gZXJyb3IgbG9vcDsgdGhlIHBpcGVsaW5lIGJlaW5nIGFic2VudCBpcyB0aGUgaGFsZiB0aGF0IHN0b3BzIHRoZSBleHBvcnQuXG4gICAgY29uc3Qgb3ZlcnJpZGVzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWRdPiA9IFtcbiAgICAgIFtFTlZfVFJBQ0VTX0VYUE9SVEVSLCBleHBvcnRlck92ZXJyaWRlRm9yKHNpZ25hbEVuYWJsZWQoZGVzdGluYXRpb24udHJhY2VzKSldLFxuICAgICAgW0VOVl9NRVRSSUNTX0VYUE9SVEVSLCBleHBvcnRlck92ZXJyaWRlRm9yKHNpZ25hbEVuYWJsZWQoZGVzdGluYXRpb24ubWV0cmljcykpXSxcbiAgICAgIFtFTlZfTE9HU19FWFBPUlRFUiwgZXhwb3J0ZXJPdmVycmlkZUZvcihzaWduYWxFbmFibGVkKGRlc3RpbmF0aW9uLmxvZ3MpKV0sXG4gICAgXTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2Ygb3ZlcnJpZGVzKSB7XG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbnZbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW52O1xuICB9XG59XG5cbi8qKlxuICogUHJvcHMgZm9yIHtAbGluayBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdFByb3BzIGV4dGVuZHMgT2RpZ29zSW5zdHJ1bWVudGF0aW9uT3B0aW9ucyB7fVxuXG4vKipcbiAqIEFwcGxpZXMgT2RpZ29zIGluc3RydW1lbnRhdGlvbiB0byBldmVyeSBgbGFtYmRhLkZ1bmN0aW9uYCBpbiBhIHNjb3BlLlxuICpcbiAqIGBgYHRzXG4gKiBBc3BlY3RzLm9mKHN0YWNrKS5hZGQobmV3IE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdChzdGFjaywge1xuICogICBkZXN0aW5hdGlvbjogeyBlbmRwb2ludDogJ290bHAuZXhhbXBsZS5jb206NDMxNycgfSxcbiAqIH0pKTtcbiAqIGBgYFxuICpcbiAqIGBza2lwVW5zdXBwb3J0ZWRSdW50aW1lc2AgZGVmYXVsdHMgdG8gYHRydWVgIGhlcmUsIHVubGlrZSB0aGUgY29uc3RydWN0OiBhbiBhc3BlY3QgdmlzaXRzIGV2ZXJ5IGZ1bmN0aW9uXG4gKiBpbiB0aGUgc2NvcGUsIGluY2x1ZGluZyBvbmVzIHdob3NlIHJ1bnRpbWUgaGFzIG5vIE9wZW5UZWxlbWV0cnkgbGF5ZXIsIGFuZCBmYWlsaW5nIHRoZSB3aG9sZSBzeW50aFxuICogYmVjYXVzZSBhIHN0YWNrIGhhcHBlbnMgdG8gY29udGFpbiBvbmUgR28gZnVuY3Rpb24gaXMgbm90IHVzZWZ1bC4gRWFjaCBza2lwIGlzIHJlcG9ydGVkIGFzIGEgc3ludGhcbiAqIHdhcm5pbmcsIHNvIGl0IGlzIHZpc2libGUgcmF0aGVyIHRoYW4gc2lsZW50LlxuICpcbiAqIFRoZSBhc3BlY3QgaW5zdHJ1bWVudHMgd2hhdCBleGlzdHMgaW4gdGhlIHRyZWUgd2hlbiBpdCBydW5zLiBBIGZ1bmN0aW9uIGFkZGVkIGJ5IGEgbGF0ZXIgYXNwZWN0IGlzIG5vdFxuICogdmlzaXRlZDsgdXNlIHRoZSBjb25zdHJ1Y3QgZGlyZWN0bHkgZm9yIHRob3NlLlxuICovXG5leHBvcnQgY2xhc3MgT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0IGltcGxlbWVudHMgSUFzcGVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdHJ1bWVudGF0aW9uOiBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb247XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzY29wZSB3aGVyZSB0aGUgc2hhcmVkIGxheWVyIGNvbnN0cnVjdHMgYXJlIGNyZWF0ZWQuIFVzdWFsbHkgdGhlIHNhbWUgc2NvcGUgdGhlIGFzcGVjdCBpc1xuICAgKiBhcHBsaWVkIHRvLiBJdCBpcyBhIHNlcGFyYXRlIGFyZ3VtZW50IGZyb20gdGhlIHZpc2l0ZWQgbm9kZXMgYmVjYXVzZSB0aGUgbGF5ZXIgKGFuZCwgaW4gYElOX0FDQ09VTlRgXG4gICAqIG1vZGUsIHRoZSBuZXN0ZWQgU0FSIGFwcGxpY2F0aW9uKSBpcyBjcmVhdGVkIG9uY2UgYW5kIHNoYXJlZCBieSBldmVyeSBmdW5jdGlvbiB0aGUgYXNwZWN0IHZpc2l0cy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIHByb3BzOiBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3RQcm9wcykge1xuICAgIHRoaXMuaW5zdHJ1bWVudGF0aW9uID0gbmV3IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvbihzY29wZSwgJ09kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdCcsIHtcbiAgICAgIHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzOiB0cnVlLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdmlzaXQobm9kZTogSUNvbnN0cnVjdCk6IHZvaWQge1xuICAgIGlmIChub2RlIGluc3RhbmNlb2YgbGFtYmRhLkZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLmluc3RydW1lbnRhdGlvbi5pbnN0cnVtZW50KG5vZGUpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
279
|
+
OdigosInstrumentationAspect[_b] = { fqn: "@odigos/aws-cdk.OdigosInstrumentationAspect", version: "0.0.11" };
|
|
280
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUFpRTtBQUNqRSxpREFBaUQ7QUFDakQsMkNBQW1EO0FBQ25ELHlEQVE0QjtBQUM1QiwrQ0FBb0Q7QUFDcEQscURBQXVEO0FBQ3ZELHVDQUFrRztBQUNsRyxtQ0FLaUI7QUFFakIsMkVBQTJFO0FBQzNFLE1BQU0sZ0JBQWdCLEdBQUcseUJBQXlCLENBQUM7QUFDbkQsa0VBQWtFO0FBQ2xFLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUM7QUFDN0MsMkZBQTJGO0FBQzNGLE1BQU0sa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUM7QUFFNUM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUM7QUFFNUM7OztHQUdHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBRXpCOzs7Ozs7R0FNRztBQUNILE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQztBQUVwQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEVBQW1CO0lBQzdDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBOEMsQ0FBQztJQUNuRSxNQUFNLFFBQVEsR0FBRyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEYsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDckYsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUNE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WUFBWSxLQUFnQixFQUFFLEtBQXVDO1FBQ25FLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSwyQkFBMkIsQ0FBQyxLQUFLLEVBQUUsNkJBQTZCLEVBQUU7WUFDM0YsdUJBQXVCLEVBQUUsSUFBSTtZQUM3QixHQUFHLEtBQUs7U0FDVCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQWdCO1FBQzNCLElBQUksSUFBSSxZQUFZLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxDQUFDO0lBQ0gsQ0FBQzs7QUFuQkgsa0VBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbnMsIElBc3BlY3QsIFN0YWNrLCBUb2tlbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtcbiAgRU5WX0NPTExFQ1RPUl9DT05GSUdfVVJJLFxuICBFTlZfTE9HU19FWFBPUlRFUixcbiAgRU5WX01FVFJJQ1NfRVhQT1JURVIsXG4gIEVOVl9UUkFDRVNfRVhQT1JURVIsXG4gIGV4cG9ydGVyT3ZlcnJpZGVGb3IsXG4gIHJlbmRlckNvbGxlY3RvckNvbmZpZyxcbiAgc2lnbmFsRW5hYmxlZCxcbn0gZnJvbSAnLi9jb2xsZWN0b3ItY29uZmlnJztcbmltcG9ydCB7IE9ESUdPU19WRVJTSU9OIH0gZnJvbSAnLi9nZW5lcmF0ZWQvbGF5ZXJzJztcbmltcG9ydCB7IE9kaWdvc0xheWVyUmVzb2x2ZXIgfSBmcm9tICcuL2xheWVyLXJlc29sdmVyJztcbmltcG9ydCB7IGV4ZWNXcmFwcGVyRm9yLCBsYW5ndWFnZUZyb21SdW50aW1lLCB3ZWJTZXJ2ZXJFbnYsIHdlYlNlcnZlckxvYWRlcktleSB9IGZyb20gJy4vcnVudGltZSc7XG5pbXBvcnQge1xuICBPZGlnb3NEZXN0aW5hdGlvbixcbiAgT2RpZ29zSW5zdHJ1bWVudGF0aW9uTW9kZSxcbiAgT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8sXG4gIE9kaWdvc0xheWVyU291cmNlLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqIGBBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUmAg4oCUIHRoZSBsYXllcidzIGVudHJ5IHBvaW50IGluIGhhbmRsZXIgbW9kZS4gKi9cbmNvbnN0IEVOVl9FWEVDX1dSQVBQRVIgPSAnQVdTX0xBTUJEQV9FWEVDX1dSQVBQRVInO1xuLyoqIFNlcnZpY2UgbmFtZSByZXBvcnRlZCBvbiBldmVyeSBzcGFuLCBtZXRyaWMgYW5kIGxvZyByZWNvcmQuICovXG5jb25zdCBFTlZfU0VSVklDRV9OQU1FID0gJ09URUxfU0VSVklDRV9OQU1FJztcbi8qKiBSYWlzZXMgaW4tZnVuY3Rpb24gT3BlblRlbGVtZXRyeSB2ZXJib3NpdHkgaW50byB0aGUgZnVuY3Rpb24ncyBDbG91ZFdhdGNoIGxvZyBncm91cC4gKi9cbmNvbnN0IEVOVl9PVEVMX0xPR19MRVZFTCA9ICdPVEVMX0xPR19MRVZFTCc7XG5cbi8qKlxuICogYE9ESUdPU19NQU5BR0VEYCDigJQgdGhlIGNvbm5lY3RvcidzIE9XTkVSU0hJUCBNQVJLRVIsIHdyaXR0ZW4gb25seSB3aGVuIGByZWNvcmRPd25lcnNoaXBNYXJrZXJgIGlzIHNldC5cbiAqXG4gKiBUaGUgY29ubmVjdG9yIGRlcml2ZXMgb3duZXJzaGlwIGZyb20gdGhpcyB2YXJpYWJsZSBhbG9uZTogYHN0b3JlLk9kaWdvc0luc3RydW1lbnRlZGAgY2hlY2tzIGZvciBpdHNcbiAqIHByZXNlbmNlLCBhbmQgYSBmdW5jdGlvbiB3aXRob3V0IGl0IGlzIHJlcG9ydGVkIGBBYnNlbnRgIOKAlCBcImF3YWl0aW5nIHlvdXIgZGVwbG95bWVudFwiIOKAlCBiZWZvcmUgYW55IG90aGVyXG4gKiBjb21wb25lbnQgaXMgY29tcGFyZWQsIGhvd2V2ZXIgY29tcGxldGVseSB0aGUgcmVzdCBpcyBhcHBsaWVkLiBTbyBhIG1hbnVhbC1tb2RlIChJYUMpIGZ1bmN0aW9uIHRoYXQgaXNcbiAqIG1lYW50IHRvIHNob3cgdXAgYXMgaW5zdHJ1bWVudGVkIGluIE9kaWdvcyBoYXMgdG8gY2FycnkgaXQsIGFuZCBub3RoaW5nIGVsc2UgY2FuIHN0YW5kIGluIGZvciBpdC5cbiAqL1xuY29uc3QgRU5WX09ESUdPU19NQU5BR0VEID0gJ09ESUdPU19NQU5BR0VEJztcblxuLyoqXG4gKiBTY2hlbWEgdmVyc2lvbiBvZiB0aGUgbWFya2VyIHBheWxvYWQuIE11c3QgbWF0Y2ggYG1hbmFnZWRNYW5pZmVzdFZlcnNpb25gIGluIHRoZSBjb25uZWN0b3Ig4oCUIGl0IGlzIHdoYXRcbiAqIHRlbGxzIHRoZSBjb25uZWN0b3IgaG93IHRvIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIG9iamVjdCwgc28gYSBidW1wZWQgdmVyc2lvbiB0aGVyZSBpcyBhIGNoYW5nZSBoZXJlLlxuICovXG5jb25zdCBNQVJLRVJfVkVSU0lPTiA9IDE7XG5cbi8qKlxuICogTWFya2VyIHJlY29yZGluZyB0aGF0IHRoaXMgZnVuY3Rpb24gd2FzIGluc3RydW1lbnRlZCBieSBJYUMsIGFuZCBieSB3aGljaCB2ZXJzaW9uLlxuICpcbiAqIERpc3RpbmN0IGZyb20gYE9ESUdPU19NQU5BR0VEYCwgYW5kIG5vdCBhIHN1YnN0aXR1dGUgZm9yIGl0OiB0aGlzIG9uZSBpcyBpbmZvcm1hdGlvbmFsIGFuZCBub3RoaW5nIHJlYWRzXG4gKiBpdCwgd2hpbGUgdGhhdCBvbmUgaXMgdGhlIGNvbm5lY3RvcidzIG93bmVyc2hpcCBwcm9vZiAoc2VlIGByZWNvcmRPd25lcnNoaXBNYXJrZXJgKS4gVGhlIGNvbm5lY3RvclxuICogaWdub3JlcyB2YXJpYWJsZXMgaXQgZG9lcyBub3QgZXhwZWN0LCBzbyB0aGlzIGlzIG5ldmVyIHJlcG9ydGVkIGFzIGRyaWZ0LlxuICovXG5jb25zdCBFTlZfSUFDX01BUktFUiA9ICdPRElHT1NfSUFDJztcblxuLyoqXG4gKiBUaGUgc2VydmljZSBhIGZ1bmN0aW9uIHJlcG9ydHMgYXMsIHdoZW4gdGhlIGNhbGxlciBoYXMgbm90IG5hbWVkIG9uZS5cbiAqXG4gKiBSRUFEIEZST00gVEhFIEwxLCBOT1QgRlJPTSBgZm4uZnVuY3Rpb25OYW1lYC4gVGhlIEwyIHByb3BlcnR5IGlzIGEgY3Jvc3MtZW52aXJvbm1lbnQtYXdhcmUgdG9rZW4gdGhhdFxuICogcmVzb2x2ZXMgdG8gYSBgUmVmYCB0byB0aGUgZnVuY3Rpb24gaXRzZWxmIGV2ZW4gd2hlbiB0aGUgc3RhY2sgc2V0IGBmdW5jdGlvbk5hbWVgIGV4cGxpY2l0bHkg4oCUIHNvIHRoZVxuICogb2J2aW91cyBgU3RhY2sub2YoZm4pLnJlc29sdmUoZm4uZnVuY3Rpb25OYW1lKWAgbmV2ZXIgeWllbGRzIGEgbGl0ZXJhbCwgYW5kIGV2ZXJ5IGZ1bmN0aW9uIHNpbGVudGx5IGZlbGxcbiAqIGJhY2sgdG8gaXRzIGNvbnN0cnVjdCBpZC4gYENmbkZ1bmN0aW9uLmZ1bmN0aW9uTmFtZWAgaXMgdGhlIHJhdyB0ZW1wbGF0ZSB2YWx1ZTogdGhlIGxpdGVyYWwgdGhlIHN0YWNrXG4gKiBwYXNzZWQsIG9yIHVuZGVmaW5lZCB3aGVuIENsb3VkRm9ybWF0aW9uIGdlbmVyYXRlcyB0aGUgbmFtZS5cbiAqXG4gKiBXaHkgdGhlIGZhbGxiYWNrIGlzIHRoZSBjb25zdHJ1Y3QgaWQgcmF0aGVyIHRoYW4gdGhlIGdlbmVyYXRlZCBuYW1lOiBhIGdlbmVyYXRlZCBuYW1lIGlzIGEgYFJlZmAgdG8gdGhlXG4gKiBmdW5jdGlvbiwgYW5kIHB1dHRpbmcgdGhhdCBpbiB0aGUgZnVuY3Rpb24ncyBvd24gZW52aXJvbm1lbnQgbWFrZXMgdGhlIHJlc291cmNlIGRlcGVuZCBvbiBpdHMgb3duXG4gKiBjcmVhdGlvbiDigJQgQ2xvdWRGb3JtYXRpb24gcmVqZWN0cyB0aGUgdGVtcGxhdGUgd2l0aCBhIGRlcGVuZGVuY3kgY3ljbGUsIGF0IGRlcGxveSB0aW1lLlxuICpcbiAqIFRoaXMgbWF0dGVycyBiZXlvbmQgY29zbWV0aWNzLiBUaGUgY29ubmVjdG9yIGNvbXBhcmVzIGBPVEVMX1NFUlZJQ0VfTkFNRWAgYWdhaW5zdCB0aGUgd29ya2xvYWQncyBuYW1lIGluXG4gKiBPZGlnb3MsIHdoaWNoIGlzIHRoZSByZWFsIEFXUyBmdW5jdGlvbiBuYW1lLCBzbyBhIGZ1bmN0aW9uIHJlcG9ydGluZyBpdHMgY29uc3RydWN0IGlkIGlzIHJlcG9ydGVkIGFzXG4gKiBkcmlmdGVkIG9uIHRoZSBzZXJ2aWNlLW5hbWUgY29tcG9uZW50LiBOYW1pbmcgdGhlIGZ1bmN0aW9uIGluIHlvdXIgc3RhY2sgaXMgbm93IGVub3VnaCB0byBsaW5lIHRoZSB0d29cbiAqIHVwOyBhIGZ1bmN0aW9uIHdob3NlIG5hbWUgQ2xvdWRGb3JtYXRpb24gZ2VuZXJhdGVzIHN0aWxsIG5lZWRzIGBzZXJ2aWNlTmFtZWAgcGFzc2VkIGV4cGxpY2l0bHkuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRTZXJ2aWNlTmFtZShmbjogbGFtYmRhLkZ1bmN0aW9uKTogc3RyaW5nIHtcbiAgY29uc3QgY2ZuID0gZm4ubm9kZS5kZWZhdWx0Q2hpbGQgYXMgbGFtYmRhLkNmbkZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCByZXNvbHZlZCA9IGNmbiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU3RhY2sub2YoZm4pLnJlc29sdmUoY2ZuLmZ1bmN0aW9uTmFtZSk7XG4gIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09ICdzdHJpbmcnICYmIHJlc29sdmVkICE9PSAnJyAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKHJlc29sdmVkKSkge1xuICAgIHJldHVybiByZXNvbHZlZDtcbiAgfVxuICByZXR1cm4gZm4ubm9kZS5pZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIHNoYXJlZCBieSB0aGUgY29uc3RydWN0IGFuZCB0aGUgYXNwZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogV2hlcmUgdGhlIGluLUxhbWJkYSBjb2xsZWN0b3IgZXhwb3J0cyB0by5cbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uOiBPZGlnb3NEZXN0aW5hdGlvbjtcblxuICAvKipcbiAgICogV2hlcmUgdGhlIE9kaWdvcyBsYXllciBjb21lcyBmcm9tLlxuICAgKlxuICAgKiBAZGVmYXVsdCBPZGlnb3NMYXllclNvdXJjZS5PRElHT1NfUFVCTElDXG4gICAqL1xuICByZWFkb25seSBsYXllclNvdXJjZT86IE9kaWdvc0xheWVyU291cmNlO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIG1vZGUgb3Igd2ViLXNlcnZlciAoTGFtYmRhIFdlYiBBZGFwdGVyKSBtb2RlLlxuICAgKlxuICAgKiBUaGVyZSBpcyBubyBhdXRvLWRldGVjdGlvbiwgYW5kIHRoYXQgaXMgZGVsaWJlcmF0ZSByYXRoZXIgdGhhbiBhbiBvbWlzc2lvbjogZGV0ZWN0aW5nIHRoZSB3ZWIgYWRhcHRlclxuICAgKiBtZWFucyBpbnNwZWN0aW5nIHRoZSBmdW5jdGlvbidzIG90aGVyIGxheWVycywgd2hpY2ggYXQgc3ludGggdGltZSBhcmUgZnJlcXVlbnRseSB1bnJlc29sdmVkIHRva2Vucy5cbiAgICogQSBkZXRlY3RvciB0aGF0IGlzIHJpZ2h0IG1vc3Qgb2YgdGhlIHRpbWUgd291bGQgc2lsZW50bHkgYnJlYWsgdGhlIGZ1bmN0aW9ucyBpdCBnb3Qgd3JvbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IE9kaWdvc0luc3RydW1lbnRhdGlvbk1vZGUuSEFORExFUlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZT86IE9kaWdvc0luc3RydW1lbnRhdGlvbk1vZGU7XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9mIHRoZSBKYXZhIGxheWVyJ3MgZm91ciB3cmFwcGVyIHNjcmlwdHMgdG8gdXNlLiBJZ25vcmVkIGZvciBvdGhlciBsYW5ndWFnZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IE9kaWdvc0phdmFIYW5kbGVyRGlzdHJvLk9URUxfSEFORExFUlxuICAgKi9cbiAgcmVhZG9ubHkgamF2YUhhbmRsZXJEaXN0cm8/OiBPZGlnb3NKYXZhSGFuZGxlckRpc3RybztcblxuICAvKipcbiAgICogYE9URUxfU0VSVklDRV9OQU1FYCBmb3IgZXZlcnkgZnVuY3Rpb24gdGhpcyBpbnN0cnVtZW50cy5cbiAgICpcbiAgICogVXN1YWxseSB3cm9uZyB0byBzZXQgd2hlbiBpbnN0cnVtZW50aW5nIG1vcmUgdGhhbiBvbmUgZnVuY3Rpb24g4oCUIHRoZXkgd291bGQgYWxsIHJlcG9ydCBhcyB0aGUgc2FtZVxuICAgKiBzZXJ2aWNlLlxuICAgKlxuICAgKiBMZWZ0IHVuc2V0LCBhIGZ1bmN0aW9uIHJlcG9ydHMgYXMgaXRzIGV4cGxpY2l0bHktc2V0IHBoeXNpY2FsIG5hbWUgaWYgaXQgaGFzIG9uZSwgYW5kIG90aGVyd2lzZSBhc1xuICAgKiBpdHMgY29uc3RydWN0IGlkLiBJdCBkZWxpYmVyYXRlbHkgZG9lcyBub3QgZGVmYXVsdCB0byB0aGUgZ2VuZXJhdGVkIHBoeXNpY2FsIG5hbWU6IHRoYXQgdmFsdWUgaXMgYVxuICAgKiBgUmVmYCB0byB0aGUgZnVuY3Rpb24gaXRzZWxmLCBhbmQgYSBmdW5jdGlvbiByZWZlcmVuY2luZyBpdHNlbGYgaW4gaXRzIG93biBlbnZpcm9ubWVudCBpcyBhXG4gICAqIENsb3VkRm9ybWF0aW9uIGRlcGVuZGVuY3kgY3ljbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGZ1bmN0aW9uJ3MgcGh5c2ljYWwgbmFtZSBpZiBleHBsaWNpdGx5IHNldCwgb3RoZXJ3aXNlIGl0cyBjb25zdHJ1Y3QgaWRcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSYWlzZSBpbi1mdW5jdGlvbiBPcGVuVGVsZW1ldHJ5IHZlcmJvc2l0eSAoYE9URUxfTE9HX0xFVkVMPWRlYnVnYCkuXG4gICAqXG4gICAqIFRoZSBsYXllciwgU0RLIGFuZCBjb2xsZWN0b3IgdGhlbiBlbWl0IHNwYW4gYW5kIE9UTFAtZXhwb3J0IGRpYWdub3N0aWNzIGludG8gdGhlIGZ1bmN0aW9uJ3MgQ2xvdWRXYXRjaFxuICAgKiBsb2cgZ3JvdXAuIFVzZWZ1bCB3aGlsZSB3aXJpbmcgdXAgYSBkZXN0aW5hdGlvbiwgZXhwZW5zaXZlIHRvIGxlYXZlIG9uLlxuICAgKlxuICAgKiBIYXMgbm8gZWZmZWN0IGluIHdlYi1zZXJ2ZXIgbW9kZSwgbWF0Y2hpbmcgdGhlIGNvbm5lY3Rvciwgd2hpY2ggbmV2ZXIgc2V0cyBhIGxvZyBsZXZlbCB0aGVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRlYnVnPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQXR0YWNoIHRoaXMgbGF5ZXIgaW5zdGVhZCBvZiByZXNvbHZpbmcgb25lLiBPdmVycmlkZXMgYGxheWVyU291cmNlYCBlbnRpcmVseS5cbiAgICpcbiAgICogVGhlIGVzY2FwZSBoYXRjaCBmb3IgYSBsYXllciBtaXJyb3JlZCBpbnRvIGEgcHJpdmF0ZSByZWdpc3RyeSBvciBhbiBpbnRlcm5hbCBhY2NvdW50LiBUaGUgbGF5ZXIgbXVzdFxuICAgKiBoYXZlIHRoZSBzYW1lIGNvbnRlbnRzIGFzIHRoZSBPZGlnb3Mgb25lIOKAlCB0aGUgZW52aXJvbm1lbnQgc2V0IGhlcmUgYXNzdW1lcyBpdHMgZXhhY3Qgc2NyaXB0IGxheW91dC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSByZXNvbHZlZCBmcm9tIGxheWVyU291cmNlXG4gICAqL1xuICByZWFkb25seSBsYXllclZlcnNpb24/OiBsYW1iZGEuSUxheWVyVmVyc2lvbjtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRoZSBmdW5jdGlvbiBhbHJlYWR5IG5lZWRzIGluIGl0cyBsYW5ndWFnZSBsb2FkZXIgdmFyaWFibGUgKGBOT0RFX09QVElPTlNgLFxuICAgKiBgSkFWQV9UT09MX09QVElPTlNgIG9yIGBQWVRIT05QQVRIYCksIHdoaWNoIHRoZSBPZGlnb3MgbG9hZGVyIGlzIGpvaW5lZCB0byByYXRoZXIgdGhhbiByZXBsYWNpbmcuXG4gICAqXG4gICAqIE9ubHkgdXNlZCBpbiB3ZWItc2VydmVyIG1vZGUuIEl0IGhhcyB0byBiZSBwYXNzZWQgZXhwbGljaXRseSBiZWNhdXNlIENESydzIGBsYW1iZGEuRnVuY3Rpb25gIGV4cG9zZXNcbiAgICogbm8gd2F5IHRvIHJlYWQgYmFjayBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXQgZWxzZXdoZXJlIGluIHRoZSBhcHAg4oCUIGFuIG9taXR0ZWQgdmFsdWUgaGVyZSBpc1xuICAgKiBzaWxlbnRseSBvdmVyd3JpdHRlbiwgd2hpY2ggZm9yIGBOT0RFX09QVElPTlNgIGNhbiBtZWFuIGxvc2luZyBhIGZsYWcgdGhlIGFwcCBuZWVkcyB0byBib290LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBsb2FkZXIgdmFyaWFibGUgaXMgc2V0IHRvIHRoZSBPZGlnb3MgdmFsdWUgYWxvbmVcbiAgICovXG4gIHJlYWRvbmx5IGV4aXN0aW5nTG9hZGVyVmFsdWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdyaXRlIGBPRElHT1NfTUFOQUdFRGAsIHRoZSBtYXJrZXIgdGhhdCBtYWtlcyB0aGUgT2RpZ29zIGNvbm5lY3RvciByZWNvZ25pc2UgdGhpcyBmdW5jdGlvbiBhc1xuICAgKiBpbnN0cnVtZW50ZWQuXG4gICAqXG4gICAqIFdJVEhPVVQgSVQgVEhFIEZVTkNUSU9OIElTIFJFUE9SVEVEIEFTIFVOSU5TVFJVTUVOVEVELiBUaGUgY29ubmVjdG9yIGRlcml2ZXMgb3duZXJzaGlwIGZyb20gdGhpc1xuICAgKiB2YXJpYWJsZSBhbG9uZTogbm8gbWFya2VyIG1lYW5zIGBBYnNlbnRgIOKAlCBcImF3YWl0aW5nIHlvdXIgZGVwbG95bWVudFwiIOKAlCBldmVuIHRob3VnaCB0aGUgbGF5ZXIgaXNcbiAgICogYXR0YWNoZWQsIHRoZSB3cmFwcGVyIGlzIHNldCBhbmQgdGhlIGNvbGxlY3RvciBpcyBjb25maWd1cmVkLiBTZXQgdGhpcyB0byBgdHJ1ZWAgZm9yIGEgZnVuY3Rpb24gdGhhdFxuICAgKiBPZGlnb3MgZGlzY292ZXJzIGluIE1BTlVBTCAoSWFDKSBtb2RlLCB3aGljaCBpcyB0aGUgbW9kZSBhIHdvcmtsb2FkIGlzIGluIHVubGVzcyB5b3UgZXhwbGljaXRseSBoYW5kXG4gICAqIGluc3RydW1lbnRhdGlvbiB0byB0aGUgY29ubmVjdG9yLlxuICAgKlxuICAgKiBMZWF2ZSBpdCBgZmFsc2VgICh0aGUgZGVmYXVsdCkgZm9yIGEgZnVuY3Rpb24geW91IGhhdmUgZW5hYmxlZCBhcyBhbiBBVVRPTUFUSUMtbW9kZSBjb25uZWN0b3Igc291cmNlLlxuICAgKiBUaGVyZSwgdGhlIGNvbm5lY3RvciBpbnN0cnVtZW50cyB0aGUgZnVuY3Rpb24gaXRzZWxmIGFuZCBvd25zIHRoaXMgdmFyaWFibGUsIGluY2x1ZGluZyB0aGUgYHByZXZFbnZgXG4gICAqIHNuYXBzaG90IGl0IHJlc3RvcmVzIG9uIHJvbGxiYWNrOyB0d28gd3JpdGVycyBvZiBvbmUgb3duZXJzaGlwIHJlY29yZCBpcyB0aGUgb25lIGNvbWJpbmF0aW9uIHRoYXRcbiAgICogZ2VudWluZWx5IG1pc2JlaGF2ZXMuXG4gICAqXG4gICAqIFRoZSBtYXJrZXIgcmVjb3JkcyB0aGUgZXhhY3QgbGF5ZXIgQVJOIHRoaXMgY29uc3RydWN0IGF0dGFjaGVkLCB3aGljaCBpcyBhbHNvIHdoYXQgdGhlIGNvbm5lY3RvciByZWFkc1xuICAgKiBiYWNrIHRvIGRlY2lkZSB3aGljaCBsYXllciB2ZXJzaW9uIHRoZSBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBjYXJyeSDigJQgc28gYSB2ZXJzaW9uIHlvdSBwaW5uZWQgaXNcbiAgICogcmVzcGVjdGVkIHJhdGhlciB0aGFuIHJlcG9ydGVkIGFzIGRyaWZ0LiBJdCB3b3JrcyBpbiBldmVyeSBsYXllciBtb2RlLCBpbmNsdWRpbmcgYElOX0FDQ09VTlRgLCB3aGVyZSB0aGVcbiAgICogQVJOIGlzIGEgZGVwbG95LXRpbWUgcmVmZXJlbmNlIHlvdXIgb3duIGNvZGUgY2Fubm90IG9idGFpbi5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHJlY29yZE93bmVyc2hpcE1hcmtlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNraXAgZnVuY3Rpb25zIHdob3NlIHJ1bnRpbWUgaGFzIG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGluc3RlYWQgb2YgdGhyb3dpbmcuXG4gICAqXG4gICAqIGBkb3RuZXQqYCBhbmQgYHByb3ZpZGVkLipgIChHbywgY3VzdG9tIHJ1bnRpbWVzKSBoYXZlIG5vIGxhbmd1YWdlIGxheWVyIHVwc3RyZWFtLiBFeHBsaWNpdGx5XG4gICAqIGluc3RydW1lbnRpbmcgb25lIGlzIGEgbWlzdGFrZSB3b3J0aCBmYWlsaW5nIG9uOyBzd2VlcGluZyBhIHdob2xlIHN0YWNrIHdpdGggdGhlIGFzcGVjdCBhbmQgaGl0dGluZ1xuICAgKiBvbmUgaXMgbm90LCB3aGljaCBpcyB3aHkgdGhlIGFzcGVjdCBkZWZhdWx0cyB0aGlzIHRvIGB0cnVlYCBhbmQgdGhlIGNvbnN0cnVjdCB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcFVuc3VwcG9ydGVkUnVudGltZXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciB7QGxpbmsgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9ufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb25Qcm9wcyBleHRlbmRzIE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogRnVuY3Rpb25zIHRvIGluc3RydW1lbnQgb24gY29uc3RydWN0aW9uLiBNb3JlIGNhbiBiZSBhZGRlZCB3aXRoIGBpbnN0cnVtZW50KClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9ucz86IGxhbWJkYS5GdW5jdGlvbltdO1xufVxuXG4vKipcbiAqIEluc3RydW1lbnRzIEFXUyBMYW1iZGEgZnVuY3Rpb25zIHdpdGggdGhlIE9kaWdvcyBPcGVuVGVsZW1ldHJ5IGxheWVyLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBvZGlnb3MgPSBuZXcgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uKHRoaXMsICdPZGlnb3MnLCB7XG4gKiAgIGRlc3RpbmF0aW9uOiB7IGVuZHBvaW50OiAnb3RscC5leGFtcGxlLmNvbTo0MzE3JyB9LFxuICogICBmdW5jdGlvbnM6IFthcGlGbiwgd29ya2VyRm5dLFxuICogfSk7XG4gKiBvZGlnb3MuaW5zdHJ1bWVudChhbm90aGVyRm4pO1xuICogYGBgXG4gKlxuICogV2hhdCBpdCBkb2VzIHRvIGVhY2ggZnVuY3Rpb246IGF0dGFjaGVzIHRoZSBsYXllciBmb3IgdGhlIGZ1bmN0aW9uJ3MgbGFuZ3VhZ2UgYW5kIGFyY2hpdGVjdHVyZSwgc2V0c1xuICogYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCBzbyB0aGUgbGF5ZXIgbG9hZHMgdGhlIFNESywgc2V0cyBgT1RFTF9TRVJWSUNFX05BTUVgLCBhbmQgaGFuZHMgdGhlIGluLUxhbWJkYVxuICogY29sbGVjdG9yIGl0cyBlbnRpcmUgY29uZmlndXJhdGlvbiBpbmxpbmUgdGhyb3VnaCBgT1BFTlRFTEVNRVRSWV9DT0xMRUNUT1JfQ09ORklHX1VSSWAuXG4gKlxuICogVGhlIGZ1bmN0aW9uJ3MgU0RLIGV4cG9ydHMgdG8gdGhlIGNvbGxlY3RvciBvbiBsb2NhbGhvc3QsIG5vdCB0byB5b3VyIGRlc3RpbmF0aW9uLiBUaGUgY29sbGVjdG9yXG4gKiBmb3J3YXJkcyBhZnRlciB0aGUgaGFuZGxlciBoYXMgYWxyZWFkeSByZXR1cm5lZCwgc28gYSBzbG93IGRlc3RpbmF0aW9uIGNvc3RzIGJpbGxlZCBkdXJhdGlvbiByYXRoZXJcbiAqIHRoYW4gY2FsbGVyIGxhdGVuY3kuXG4gKlxuICogIyMgRG8gbm90IGFsc28gaW5zdHJ1bWVudCB0aGVzZSBmdW5jdGlvbnMgd2l0aCB0aGUgY29ubmVjdG9yXG4gKlxuICogVGhlIE9kaWdvcyBBV1MgY29ubmVjdG9yIGluc3RydW1lbnRzIGxpdmUgZnVuY3Rpb25zIGJ5IG11dGF0aW5nIHRoZW0sIGFuZCByZWNvbmNpbGVzIHRoZW0gYmFjayB0byBpdHNcbiAqIG93biBkZXNpcmVkIHN0YXRlIG9uIGV2ZXJ5IHBhc3MuIEEgZnVuY3Rpb24gaW5zdHJ1bWVudGVkIGhlcmUgYW5kIGFsc28gZW5hYmxlZCBhcyBhIGNvbm5lY3RvciBzb3VyY2VcbiAqIGVuZHMgdXAgb3duZWQgYnkgYm90aDogZWFjaCBgY2RrIGRlcGxveWAgcmVhc3NlcnRzIHRoZSBDREsncyBlbnZpcm9ubWVudCwgZWFjaCByZWNvbmNpbGUgcmVhc3NlcnRzIHRoZVxuICogY29ubmVjdG9yJ3MsIGFuZCBldmVyeSByb3VuZCB0cmlwIHB1Ymxpc2hlcyBhIG5ldyBmdW5jdGlvbiB2ZXJzaW9uLlxuICpcbiAqIENob29zZSBvbmUgcGVyIGZ1bmN0aW9uLiBUaGlzIGNvbnN0cnVjdCBuZXZlciBzZXRzIHRoZSBjb25uZWN0b3IncyBgT0RJR09TX01BTkFHRURgIG93bmVyc2hpcCBtYXJrZXIsXG4gKiBzbyBhbiBJYUMtaW5zdHJ1bWVudGVkIGZ1bmN0aW9uIGlzIG5vdCBvbmUgdGhlIGNvbm5lY3RvciB3aWxsIHJvbGwgYmFjayDigJQgYnV0IGl0IHdpbGwgaGFwcGlseSB0YWtlIGl0XG4gKiBvdmVyIGlmIHlvdSBlbmFibGUgaXQgYXMgYSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZXI6IE9kaWdvc0xheWVyUmVzb2x2ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29sbGVjdG9yQ29uZmlnOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdHJ1bWVudGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IHByb3BzO1xuICAgIHRoaXMucmVzb2x2ZXIgPSBuZXcgT2RpZ29zTGF5ZXJSZXNvbHZlcih0aGlzLCBwcm9wcy5sYXllclNvdXJjZSA/PyBPZGlnb3NMYXllclNvdXJjZS5PRElHT1NfUFVCTElDKTtcblxuICAgIC8vIFJlbmRlcmVkIG9uY2UuIEl0IGRlcGVuZHMgb25seSBvbiB0aGUgZGVzdGluYXRpb24sIGFuZCByZW5kZXJpbmcgaXQgcGVyIGZ1bmN0aW9uIHdvdWxkIG1ha2UgYW5cbiAgICAvLyBhY2NpZGVudGFsIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZnVuY3Rpb25zIHBvc3NpYmxlLlxuICAgIHRoaXMuY29sbGVjdG9yQ29uZmlnID0gcmVuZGVyQ29sbGVjdG9yQ29uZmlnKHByb3BzLmRlc3RpbmF0aW9uKTtcblxuICAgIC8vIEEgd2FybmluZyByYXRoZXIgdGhhbiBhbiBlcnJvciwgYmVjYXVzZSBhIGNvbGxlY3RvciBDQU4gYmUgcmVhY2hlZCBvdmVyIGdSUEMgb24gYSBub24tc3RhbmRhcmQgcG9ydCDigJRcbiAgICAvLyBidXQgdGhlIG92ZXJ3aGVsbWluZ2x5IGxpa2VsaWVyIHJlYWRpbmcgb2YgYGVuZHBvaW50OiBcImhvc3Q6NDMxOFwiYCBpcyBhbiBPVExQL0hUVFAgZW5kcG9pbnQgcGFzc2VkIHRvXG4gICAgLy8gdGhlIGdSUEMgZXhwb3J0ZXIsIHdoaWNoIGJ1aWxkcywgc3RhcnRzLCBhbmQgdGhlbiBuZXZlciBkZWxpdmVycyBhIGJhdGNoLiBTaWxlbnQgZm9yIHRoZSBjYWxsZXIgd2hvXG4gICAgLy8gbWVhbnQgaXQ7IGxvdWQgZm9yIHRoZSBvbmUgd2hvIGRpZCBub3QuXG4gICAgaWYgKHByb3BzLmRlc3RpbmF0aW9uLmVuZHBvaW50Py5lbmRzV2l0aCgnOjQzMTgnKSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQG9kaWdvcy9hd3MtY2RrOnByb2JhYmxlSHR0cEVuZHBvaW50JyxcbiAgICAgICAgYE9kaWdvczogZGVzdGluYXRpb24gZW5kcG9pbnQgXCIke3Byb3BzLmRlc3RpbmF0aW9uLmVuZHBvaW50fVwiIGlzIG9uIDQzMTgsIHRoZSBPVExQL0hUVFAgcG9ydCwgYnV0IGAgK1xuICAgICAgICAgICdgZW5kcG9pbnRgIGNvbmZpZ3VyZXMgdGhlIGdSUEMgZXhwb3J0ZXIgKGNvbnZlbnRpb25hbGx5IDQzMTcpLiBJZiB0aGF0IGlzIGFuIE9UTFAvSFRUUCBjb2xsZWN0b3IsICcgK1xuICAgICAgICAgICdwYXNzIGl0IGFzIGBodHRwRW5kcG9pbnQ6IFwiaHR0cDovL2hvc3Q6NDMxOFwiYCBpbnN0ZWFkIOKAlCB0aGUgZ1JQQyBleHBvcnRlciB3aWxsIGV4cG9ydCBub3RoaW5nIHRvIGl0LicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZGVzdGluYXRpb24uaHR0cEVuZHBvaW50Py5lbmRzV2l0aCgnOjQzMTcnKSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQG9kaWdvcy9hd3MtY2RrOnByb2JhYmxlR3JwY0VuZHBvaW50JyxcbiAgICAgICAgYE9kaWdvczogZGVzdGluYXRpb24gaHR0cEVuZHBvaW50IFwiJHtwcm9wcy5kZXN0aW5hdGlvbi5odHRwRW5kcG9pbnR9XCIgaXMgb24gNDMxNywgdGhlIE9UTFAvZ1JQQyBwb3J0LCBgICtcbiAgICAgICAgICAnYnV0IGBodHRwRW5kcG9pbnRgIGNvbmZpZ3VyZXMgdGhlIEhUVFAgZXhwb3J0ZXIgKGNvbnZlbnRpb25hbGx5IDQzMTgpLiBJZiB0aGF0IGlzIGEgZ1JQQyBjb2xsZWN0b3IsICcgK1xuICAgICAgICAgICdwYXNzIGl0IGFzIGBlbmRwb2ludDogXCJob3N0OjQzMTdcImAgaW5zdGVhZC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZuIG9mIHByb3BzLmZ1bmN0aW9ucyA/PyBbXSkge1xuICAgICAgdGhpcy5pbnN0cnVtZW50KGZuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5zdHJ1bWVudHMgb25lIGZ1bmN0aW9uLiBJZGVtcG90ZW50IOKAlCBpbnN0cnVtZW50aW5nIHRoZSBzYW1lIGZ1bmN0aW9uIHR3aWNlIGlzIGEgbm8tb3AgcmF0aGVyIHRoYW4gYVxuICAgKiBkb3VibGVkIGxvYWRlciB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBpbnN0cnVtZW50KGZuOiBsYW1iZGEuRnVuY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBmbi5ub2RlLnBhdGg7XG4gICAgaWYgKHRoaXMuaW5zdHJ1bWVudGVkLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcnVudGltZU5hbWUgPSBmbi5ydW50aW1lLm5hbWU7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5ndWFnZUZyb21SdW50aW1lKHJ1bnRpbWVOYW1lKTtcbiAgICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgYE9kaWdvczogcnVudGltZSBcIiR7cnVudGltZU5hbWV9XCIgaGFzIG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGAgK1xuICAgICAgICAnKHVwc3RyZWFtIHB1Ymxpc2hlcyBsYXllcnMgZm9yIHB5dGhvbiwgbm9kZWpzLCBqYXZhIGFuZCBydWJ5IG9ubHkpLCBzbyB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBpbnN0cnVtZW50ZWQuJztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2tpcFVuc3VwcG9ydGVkUnVudGltZXMpIHtcbiAgICAgICAgQW5ub3RhdGlvbnMub2YoZm4pLmFkZFdhcm5pbmdWMignQG9kaWdvcy9hd3MtY2RrOnVuc3VwcG9ydGVkUnVudGltZScsIGAke21lc3NhZ2V9IFNraXBwaW5nLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bWVzc2FnZX0gU2V0IHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzOiB0cnVlIHRvIHNraXAgaXQgaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICB0aGlzLmluc3RydW1lbnRlZC5hZGQoa2V5KTtcblxuICAgIGNvbnN0IGFyY2hpdGVjdHVyZSA9IGZuLmFyY2hpdGVjdHVyZS5uYW1lO1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy5vcHRpb25zLmxheWVyVmVyc2lvbiA/PyB0aGlzLnJlc29sdmVyLnJlc29sdmUobGFuZ3VhZ2UsIGFyY2hpdGVjdHVyZSk7XG4gICAgZm4uYWRkTGF5ZXJzKGxheWVyKTtcblxuICAgIC8vIFRoZSBBUk4sIG5vdCB0aGUgY29uc3RydWN0OiB0aGUgbWFya2VyIGhhcyB0byBuYW1lIHRoZSBleGFjdCBsYXllciB2ZXJzaW9uIHRoZSBmdW5jdGlvbiBjYXJyaWVzLCBhbmRcbiAgICAvLyBpbiBJTl9BQ0NPVU5UIG1vZGUgdGhhdCBpcyBhIG5lc3RlZC1zdGFjayBvdXRwdXQgcmVmZXJlbmNlIHJlc29sdmVkIGF0IGRlcGxveSB0aW1lLlxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudmlyb25tZW50Rm9yKGZuLCBsYW5ndWFnZSwgbGF5ZXIubGF5ZXJWZXJzaW9uQXJuKSkpIHtcbiAgICAgIGZuLmFkZEVudmlyb25tZW50KG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogSW5zdHJ1bWVudHMgZXZlcnkgZnVuY3Rpb24gaW4gdGhlIGxpc3QuICovXG4gIHB1YmxpYyBpbnN0cnVtZW50QWxsKGZ1bmN0aW9uczogbGFtYmRhLkZ1bmN0aW9uW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGZuIG9mIGZ1bmN0aW9ucykge1xuICAgICAgdGhpcy5pbnN0cnVtZW50KGZuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGVudmlyb25tZW50IGFwcGxpZWQgdG8gb25lIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBNaXJyb3JzIGBhcHBseUhhbmRsZXJFbnZgIC8gYGFwcGx5V2ViU2VydmVyRW52YCBpbiB0aGUgY29ubmVjdG9yLCBpbmNsdWRpbmcgd2hhdCBpcyBkZWxpYmVyYXRlbHkgTk9UXG4gICAqIHNldDogYE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVGAgc3RheXMgdW5zZXQgc28gdGhlIFNESyBrZWVwcyBleHBvcnRpbmcgdG8gdGhlIGluLUxhbWJkYSBjb2xsZWN0b3JcbiAgICogb24gbG9jYWxob3N0IHJhdGhlciB0aGFuIGJsb2NraW5nIHRoZSBpbnZvY2F0aW9uIG9uIHRoZSByZW1vdGUgZGVzdGluYXRpb24sIGFuZCBhbiBlbmFibGVkIHNpZ25hbCdzXG4gICAqIGBPVEVMXypfRVhQT1JURVJgIHN0YXlzIHVuc2V0IGJlY2F1c2UgYG90bHBgIGlzIGFscmVhZHkgdGhlIFNESyBkZWZhdWx0LlxuICAgKi9cbiAgcHJpdmF0ZSBlbnZpcm9ubWVudEZvcihmbjogbGFtYmRhLkZ1bmN0aW9uLCBsYW5ndWFnZTogc3RyaW5nLCBsYXllckFybjogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgeyBkZXN0aW5hdGlvbiwgbW9kZSwgZGVidWcsIHNlcnZpY2VOYW1lLCBqYXZhSGFuZGxlckRpc3RybywgZXhpc3RpbmdMb2FkZXJWYWx1ZSB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHdlYlNlcnZlciA9IG1vZGUgPT09IE9kaWdvc0luc3RydW1lbnRhdGlvbk1vZGUuV0VCX1NFUlZFUjtcblxuICAgIGNvbnN0IGVudjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgIFtFTlZfU0VSVklDRV9OQU1FXTogc2VydmljZU5hbWUgPz8gZGVmYXVsdFNlcnZpY2VOYW1lKGZuKSxcbiAgICAgIFtFTlZfQ09MTEVDVE9SX0NPTkZJR19VUkldOiB0aGlzLmNvbGxlY3RvckNvbmZpZyxcbiAgICAgIFtFTlZfSUFDX01BUktFUl06IEpTT04uc3RyaW5naWZ5KHsgdjogMSwgc291cmNlOiAnY2RrJywgdmVyc2lvbjogT0RJR09TX1ZFUlNJT04gfHwgJ3VucmVsZWFzZWQnIH0pLFxuICAgIH07XG5cbiAgICBpZiAod2ViU2VydmVyKSB7XG4gICAgICAvLyBObyBleGVjIHdyYXBwZXI6IHRoZSBMYW1iZGEgV2ViIEFkYXB0ZXIgb3ducyBpdCwgYW5kIG92ZXJ3cml0aW5nIGl0IHN0b3BzIHRoZSBmdW5jdGlvbiBzZXJ2aW5nLlxuICAgICAgT2JqZWN0LmFzc2lnbihlbnYsIHdlYlNlcnZlckVudihsYW5ndWFnZSwgZXhpc3RpbmdMb2FkZXJWYWx1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnZbRU5WX0VYRUNfV1JBUFBFUl0gPSBleGVjV3JhcHBlckZvcihsYW5ndWFnZSwgamF2YUhhbmRsZXJEaXN0cm8pO1xuICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGVudltFTlZfT1RFTF9MT0dfTEVWRUxdID0gJ2RlYnVnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdXBwcmVzcyB0aGUgc2lnbmFscyB0aGUgZGVzdGluYXRpb24gZG9lcyBub3QgYWNjZXB0LiBBIHNpZ25hbCB3aXRoIG5vIGNvbGxlY3RvciBwaXBlbGluZSBpcyByZWZ1c2VkXG4gICAgLy8gYXQgdGhlIHJlY2VpdmVyIG9uIGV2ZXJ5IGJhdGNoLCBzbyB0ZWxsaW5nIHRoZSBTREsgbm90IHRvIHByb2R1Y2UgaXQgaXMgdGhlIGhhbGYgdGhhdCBzdG9wcyB0aGVcbiAgICAvLyBlcnJvciBsb29wOyB0aGUgcGlwZWxpbmUgYmVpbmcgYWJzZW50IGlzIHRoZSBoYWxmIHRoYXQgc3RvcHMgdGhlIGV4cG9ydC5cbiAgICBjb25zdCBvdmVycmlkZXM6IEFycmF5PFtzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZF0+ID0gW1xuICAgICAgW0VOVl9UUkFDRVNfRVhQT1JURVIsIGV4cG9ydGVyT3ZlcnJpZGVGb3Ioc2lnbmFsRW5hYmxlZChkZXN0aW5hdGlvbi50cmFjZXMpKV0sXG4gICAgICBbRU5WX01FVFJJQ1NfRVhQT1JURVIsIGV4cG9ydGVyT3ZlcnJpZGVGb3Ioc2lnbmFsRW5hYmxlZChkZXN0aW5hdGlvbi5tZXRyaWNzKSldLFxuICAgICAgW0VOVl9MT0dTX0VYUE9SVEVSLCBleHBvcnRlck92ZXJyaWRlRm9yKHNpZ25hbEVuYWJsZWQoZGVzdGluYXRpb24ubG9ncykpXSxcbiAgICBdO1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBvdmVycmlkZXMpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVudltuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExBU1QsIGJlY2F1c2UgdGhlIG1hcmtlcidzIHNuYXBzaG90IGRlc2NyaWJlcyB0aGUga2V5cyBhYm92ZTogaXQgaXMgYnVpbHQgZnJvbSB3aGF0IHRoaXMgZnVuY3Rpb24gaXNcbiAgICAvLyBhY3R1YWxseSBnZXR0aW5nLCBub3QgZnJvbSBhIGZpeGVkIGxpc3QuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZWNvcmRPd25lcnNoaXBNYXJrZXIpIHtcbiAgICAgIGVudltFTlZfT0RJR09TX01BTkFHRURdID0gdGhpcy5vd25lcnNoaXBNYXJrZXIoZW52LCBsYXllckFybiwgbGFuZ3VhZ2UsIHdlYlNlcnZlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYE9ESUdPU19NQU5BR0VEYCBwYXlsb2FkOiB0aGUgbGF5ZXIgdGhpcyBmdW5jdGlvbiBjYXJyaWVzLCBwbHVzIHRoZSBzbmFwc2hvdCB0aGUgY29ubmVjdG9yIHJlc3RvcmVzXG4gICAqIGZyb20gaWYgaXQgZXZlciByb2xscyB0aGUgZnVuY3Rpb24gYmFjay5cbiAgICpcbiAgICogV0hZIGBwcmV2RW52YCBJUyBOT1QgT1BUSU9OQUwgSEVSRS4gVGhlIGNvbm5lY3RvcidzIHJvbGxiYWNrIGl0ZXJhdGVzIGV4YWN0bHkgdGhpcyBtYXAg4oCUIGEgbnVsbCBlbnRyeVxuICAgKiBtZWFucyBcImRlbGV0ZSBvbiByb2xsYmFja1wiLCBhIHN0cmluZyBtZWFucyBcInJlc3RvcmUgdGhpcyB2YWx1ZSB2ZXJiYXRpbVwiIOKAlCBhbmQgdGhlbiByZW1vdmVzIHRoZSByZWNvcmRlZFxuICAgKiBsYXllci4gQSBtYXJrZXIgd2l0aG91dCBpdCB3b3VsZCB0aGVyZWZvcmUgc3RyaXAgdGhlIExBWUVSIHdoaWxlIGxlYXZpbmcgYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYFxuICAgKiBwb2ludGluZyBhdCBgL29wdC9vdGVsLWhhbmRsZXJgLCBhIHNjcmlwdCB0aGF0IGlzIG5vIGxvbmdlciBtb3VudGVkOiB0aGUgZnVuY3Rpb24gdGhlbiBmYWlscyBhdCBpdHMgbmV4dFxuICAgKiBjb2xkIHN0YXJ0LiBSZWNvcmRpbmcgZXZlcnkga2V5IHRoaXMgY29uc3RydWN0IHNldHMgbWFrZXMgcm9sbGJhY2sgc3RyaXAgdGhlIHdob2xlIHNldCB0b2dldGhlci5cbiAgICpcbiAgICogVGhlIHZhbHVlcyBhcmUgbnVsbCByYXRoZXIgdGhhbiB0aGUgY3VzdG9tZXIncyBwcmlvciB2YWx1ZXMgYmVjYXVzZSBhIENESyBzdGFjayBjYW5ub3QgcmVhZCBhblxuICAgKiBlbnZpcm9ubWVudCB2YXJpYWJsZSBiYWNrIOKAlCB3aXRoIG9uZSBleGNlcHRpb24gdGhhdCBtYXR0ZXJzLCB0aGUgd2ViLXNlcnZlciBsb2FkZXIgdmFyaWFibGUsIHdob3NlIHByaW9yXG4gICAqIHZhbHVlIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgaGFkIHRvIHBhc3MgYXMgYGV4aXN0aW5nTG9hZGVyVmFsdWVgIGZvciBleGFjdGx5IHRoZSBzYW1lIHJlYXNvbi5cbiAgICovXG4gIHByaXZhdGUgb3duZXJzaGlwTWFya2VyKFxuICAgIGVudjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgICBsYXllckFybjogc3RyaW5nLFxuICAgIGxhbmd1YWdlOiBzdHJpbmcsXG4gICAgd2ViU2VydmVyOiBib29sZWFuLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHByZXZFbnY6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVsbCB9ID0ge307XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGVudikpIHtcbiAgICAgIC8vIE5vdCBpdHNlbGYsIGFuZCBub3QgdGhlIGluZm9ybWF0aW9uYWwgSWFDIG1hcmtlcjogcm9sbGJhY2sgZGVsZXRlcyBPRElHT1NfTUFOQUdFRCB1bmNvbmRpdGlvbmFsbHksXG4gICAgICAvLyBhbmQgT0RJR09TX0lBQyByZWNvcmRzIHdoZXJlIHRoZSBmdW5jdGlvbiBjYW1lIGZyb20sIHdoaWNoIHN0YXlzIHRydWUgYWZ0ZXIgYW4gdW5pbnN0cnVtZW50LlxuICAgICAgaWYgKG5hbWUgIT09IEVOVl9JQUNfTUFSS0VSKSB7XG4gICAgICAgIHByZXZFbnZbbmFtZV0gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsb2FkZXJLZXkgPSB3ZWJTZXJ2ZXIgPyB3ZWJTZXJ2ZXJMb2FkZXJLZXkobGFuZ3VhZ2UpIDogdW5kZWZpbmVkO1xuICAgIGlmIChsb2FkZXJLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gUmVzdG9yZSB0aGUgY2FsbGVyJ3Mgb3duIGxvYWRlciB2YWx1ZSByYXRoZXIgdGhhbiBkZWxldGluZyB0aGUgdmFyaWFibGU6IG91cnMgd2FzIGFwcGVuZGVkIHRvIGl0LCBzb1xuICAgICAgLy8gZGVsZXRpbmcgdGhlIGtleSB3b3VsZCB0YWtlIHRoZSBjdXN0b21lcidzIGZsYWdzIOKAlCB0aGUgb25lcyB0aGVpciBhcHAgbmVlZHMgdG8gYm9vdCDigJQgd2l0aCBpdC5cbiAgICAgIHByZXZFbnZbbG9hZGVyS2V5XSA9IHRoaXMub3B0aW9ucy5leGlzdGluZ0xvYWRlclZhbHVlID8/IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHY6IE1BUktFUl9WRVJTSU9OLCBsYXllcjogbGF5ZXJBcm4sIHByZXZFbnYgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wcyBmb3Ige0BsaW5rIE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0UHJvcHMgZXh0ZW5kcyBPZGlnb3NJbnN0cnVtZW50YXRpb25PcHRpb25zIHt9XG5cbi8qKlxuICogQXBwbGllcyBPZGlnb3MgaW5zdHJ1bWVudGF0aW9uIHRvIGV2ZXJ5IGBsYW1iZGEuRnVuY3Rpb25gIGluIGEgc2NvcGUuXG4gKlxuICogYGBgdHNcbiAqIEFzcGVjdHMub2Yoc3RhY2spLmFkZChuZXcgT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0KHN0YWNrLCB7XG4gKiAgIGRlc3RpbmF0aW9uOiB7IGVuZHBvaW50OiAnb3RscC5leGFtcGxlLmNvbTo0MzE3JyB9LFxuICogfSkpO1xuICogYGBgXG4gKlxuICogYHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzYCBkZWZhdWx0cyB0byBgdHJ1ZWAgaGVyZSwgdW5saWtlIHRoZSBjb25zdHJ1Y3Q6IGFuIGFzcGVjdCB2aXNpdHMgZXZlcnkgZnVuY3Rpb25cbiAqIGluIHRoZSBzY29wZSwgaW5jbHVkaW5nIG9uZXMgd2hvc2UgcnVudGltZSBoYXMgbm8gT3BlblRlbGVtZXRyeSBsYXllciwgYW5kIGZhaWxpbmcgdGhlIHdob2xlIHN5bnRoXG4gKiBiZWNhdXNlIGEgc3RhY2sgaGFwcGVucyB0byBjb250YWluIG9uZSBHbyBmdW5jdGlvbiBpcyBub3QgdXNlZnVsLiBFYWNoIHNraXAgaXMgcmVwb3J0ZWQgYXMgYSBzeW50aFxuICogd2FybmluZywgc28gaXQgaXMgdmlzaWJsZSByYXRoZXIgdGhhbiBzaWxlbnQuXG4gKlxuICogVGhlIGFzcGVjdCBpbnN0cnVtZW50cyB3aGF0IGV4aXN0cyBpbiB0aGUgdHJlZSB3aGVuIGl0IHJ1bnMuIEEgZnVuY3Rpb24gYWRkZWQgYnkgYSBsYXRlciBhc3BlY3QgaXMgbm90XG4gKiB2aXNpdGVkOyB1c2UgdGhlIGNvbnN0cnVjdCBkaXJlY3RseSBmb3IgdGhvc2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3QgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0cnVtZW50YXRpb246IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvbjtcblxuICAvKipcbiAgICogQHBhcmFtIHNjb3BlIHdoZXJlIHRoZSBzaGFyZWQgbGF5ZXIgY29uc3RydWN0cyBhcmUgY3JlYXRlZC4gVXN1YWxseSB0aGUgc2FtZSBzY29wZSB0aGUgYXNwZWN0IGlzXG4gICAqIGFwcGxpZWQgdG8uIEl0IGlzIGEgc2VwYXJhdGUgYXJndW1lbnQgZnJvbSB0aGUgdmlzaXRlZCBub2RlcyBiZWNhdXNlIHRoZSBsYXllciAoYW5kLCBpbiBgSU5fQUNDT1VOVGBcbiAgICogbW9kZSwgdGhlIG5lc3RlZCBTQVIgYXBwbGljYXRpb24pIGlzIGNyZWF0ZWQgb25jZSBhbmQgc2hhcmVkIGJ5IGV2ZXJ5IGZ1bmN0aW9uIHRoZSBhc3BlY3QgdmlzaXRzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgcHJvcHM6IE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdFByb3BzKSB7XG4gICAgdGhpcy5pbnN0cnVtZW50YXRpb24gPSBuZXcgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uKHNjb3BlLCAnT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0Jywge1xuICAgICAgc2tpcFVuc3VwcG9ydGVkUnVudGltZXM6IHRydWUsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdChub2RlOiBJQ29uc3RydWN0KTogdm9pZCB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBsYW1iZGEuRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudGF0aW9uLmluc3RydW1lbnQobm9kZSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
package/lib/runtime.d.ts
CHANGED
|
@@ -32,6 +32,15 @@ export interface EnvVars {
|
|
|
32
32
|
* `addLoaderValue` in the connector.
|
|
33
33
|
*/
|
|
34
34
|
export declare function addLoaderValue(existing: string | undefined, value: string, separator: string): string;
|
|
35
|
+
/**
|
|
36
|
+
* The loader variable a language activates through in web-server mode (`NODE_OPTIONS`,
|
|
37
|
+
* `JAVA_TOOL_OPTIONS`, `PYTHONPATH`), or undefined for a language with no verified web-server loader.
|
|
38
|
+
*
|
|
39
|
+
* Exists so a caller that needs to name the variable — the ownership marker's rollback snapshot, which has
|
|
40
|
+
* to record the caller's own prior value for it — does not have to guess it from the key order of
|
|
41
|
+
* `webServerEnv`.
|
|
42
|
+
*/
|
|
43
|
+
export declare function webServerLoaderKey(language: string): string | undefined;
|
|
35
44
|
/**
|
|
36
45
|
* The environment that loads the language agent in web-server (AWS Lambda Web Adapter) mode.
|
|
37
46
|
*
|
package/lib/runtime.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.languageFromRuntime = languageFromRuntime;
|
|
|
4
4
|
exports.execWrapperFor = execWrapperFor;
|
|
5
5
|
exports.layerNameFor = layerNameFor;
|
|
6
6
|
exports.addLoaderValue = addLoaderValue;
|
|
7
|
+
exports.webServerLoaderKey = webServerLoaderKey;
|
|
7
8
|
exports.webServerEnv = webServerEnv;
|
|
8
9
|
const layers_1 = require("./generated/layers");
|
|
9
10
|
const types_1 = require("./types");
|
|
@@ -87,6 +88,17 @@ function addLoaderValue(existing, value, separator) {
|
|
|
87
88
|
}
|
|
88
89
|
return separator === ':' ? `${value}${separator}${existing}` : `${existing}${separator}${value}`;
|
|
89
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* The loader variable a language activates through in web-server mode (`NODE_OPTIONS`,
|
|
93
|
+
* `JAVA_TOOL_OPTIONS`, `PYTHONPATH`), or undefined for a language with no verified web-server loader.
|
|
94
|
+
*
|
|
95
|
+
* Exists so a caller that needs to name the variable — the ownership marker's rollback snapshot, which has
|
|
96
|
+
* to record the caller's own prior value for it — does not have to guess it from the key order of
|
|
97
|
+
* `webServerEnv`.
|
|
98
|
+
*/
|
|
99
|
+
function webServerLoaderKey(language) {
|
|
100
|
+
return layers_1.LANGUAGES[language]?.webServer?.envKey;
|
|
101
|
+
}
|
|
90
102
|
/**
|
|
91
103
|
* The environment that loads the language agent in web-server (AWS Lambda Web Adapter) mode.
|
|
92
104
|
*
|
|
@@ -116,4 +128,4 @@ function webServerEnv(language, existingLoaderValue) {
|
|
|
116
128
|
}
|
|
117
129
|
return env;
|
|
118
130
|
}
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMEJBLGtEQU9DO0FBb0JELHdDQVNDO0FBR0Qsb0NBTUM7QUFjRCx3Q0FRQztBQWNELG9DQXFCQztBQWhJRCwrQ0FBK0M7QUFDL0MsbUNBQTZFO0FBRTdFOzs7Ozs7R0FNRztBQUVILDRHQUE0RztBQUM1RyxNQUFNLGlCQUFpQixHQUE0QjtJQUNqRCxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUM7SUFDcEIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO0lBQ3BCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUNoQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7Q0FDakIsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLFdBQW1CO0lBQ3JELEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBQ25ELElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ25DLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxNQUFNLG9CQUFvQixHQUE4QjtJQUN0RCxDQUFDLCtCQUF1QixDQUFDLFlBQVksQ0FBQyxFQUFFLG1CQUFtQjtJQUMzRCxDQUFDLCtCQUF1QixDQUFDLGtCQUFrQixDQUFDLEVBQUUseUJBQXlCO0lBQ3ZFLENBQUMsK0JBQXVCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSx1QkFBdUI7SUFDbkUsQ0FBQywrQkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLDBCQUEwQjtDQUMxRSxDQUFDO0FBRUY7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLFFBQWdCLEVBQUUsTUFBZ0M7SUFDL0UsSUFBSSxRQUFRLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDeEIsT0FBTyxvQkFBb0IsQ0FBQyxNQUFNLElBQUksK0JBQXVCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLGtCQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0FBQzFCLENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsU0FBZ0IsWUFBWSxDQUFDLFFBQWdCLEVBQUUsWUFBb0I7SUFDakUsTUFBTSxJQUFJLEdBQUcsa0JBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFDRCxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxZQUFZLEVBQUUsQ0FBQztBQUM3QyxDQUFDO0FBT0Q7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLFFBQTRCLEVBQUUsS0FBYSxFQUFFLFNBQWlCO0lBQzNGLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzdCLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFDRCxPQUFPLFNBQVMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLFNBQVMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsU0FBUyxHQUFHLEtBQUssRUFBRSxDQUFDO0FBQ25HLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQWdCLFlBQVksQ0FDMUIsUUFBZ0IsRUFDaEIsbUJBQTRCO0lBRTVCLE1BQU0sSUFBSSxHQUFHLGtCQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxFQUFFLFNBQVMsQ0FBQztJQUMvQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUNiLFdBQVcsaUNBQXlCLENBQUMsVUFBVSw4QkFBOEIsUUFBUSxLQUFLO1lBQ3hGLHdHQUF3RyxDQUMzRyxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sR0FBRyxHQUE4QjtRQUNyQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxjQUFjLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDO0tBQ3JGLENBQUM7SUFDRix1R0FBdUc7SUFDdkcsOEVBQThFO0lBQzlFLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3JELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDYixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTEFOR1VBR0VTIH0gZnJvbSAnLi9nZW5lcmF0ZWQvbGF5ZXJzJztcbmltcG9ydCB7IE9kaWdvc0luc3RydW1lbnRhdGlvbk1vZGUsIE9kaWdvc0phdmFIYW5kbGVyRGlzdHJvIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogUnVudGltZSAtPiBsYW5ndWFnZSwgYW5kIGxhbmd1YWdlIC0+IHRoZSBleGFjdCBlbnYgdGhlIGxheWVyIGV4cGVjdHMuXG4gKlxuICogTWlycm9ycyBgTGFuZ3VhZ2VGcm9tUnVudGltZWAsIGBleGVjV3JhcHBlckZvckxhbmd1YWdlYCBhbmQgYHdlYlNlcnZlckxvYWRlcmAgaW4gdGhlIGNvbm5lY3RvcidzXG4gKiBpbnN0cnVtZW50b3IuIFRoZSBkYXRhIGxpdmVzIGluIC4uLy4uL2FydGlmYWN0cy5qc29uIGFuZCByZWFjaGVzIGhlcmUgdGhyb3VnaCB0aGUgZ2VuZXJhdGVkIG1vZHVsZTsgdGhlXG4gKiBkZWNpc2lvbnMgbGl2ZSBoZXJlLlxuICovXG5cbi8qKiBSdW50aW1lIHByZWZpeGVzIHRoYXQgbWFwIHRvIGFuIE9UZWwgbGF5ZXIgbGFuZ3VhZ2UuIFByZWZpeC1tYXRjaGVkLCBzbyBgamF2YTguYWwyYCByZXNvbHZlcyB0byBqYXZhLiAqL1xuY29uc3QgTEFOR1VBR0VfUFJFRklYRVM6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+ID0gW1xuICBbJ3B5dGhvbicsICdweXRob24nXSxcbiAgWydub2RlanMnLCAnbm9kZWpzJ10sXG4gIFsnamF2YScsICdqYXZhJ10sXG4gIFsncnVieScsICdydWJ5J10sXG5dO1xuXG4vKipcbiAqIFJlc29sdmVzIGEgTGFtYmRhIHJ1bnRpbWUgaWRlbnRpZmllciAoYHB5dGhvbjMuMTJgLCBgamF2YTIxYCwgYG5vZGVqczIyLnhgKSB0byB0aGUgT1RlbCBsYXllciBsYW5ndWFnZS5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBydW50aW1lcyB3aXRoIG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxhbmd1YWdlIGxheWVyIOKAlCBgZG90bmV0KmAsIGBwcm92aWRlZC4qYFxuICogKEdvIGFuZCBjdXN0b20gcnVudGltZXMpLiBUaGUgY2FsbGVyIHJlZnVzZXMgdG8gaW5zdHJ1bWVudCByYXRoZXIgdGhhbiBhdHRhY2hpbmcgYSBsYXllciB0aGF0IGRvZXNcbiAqIG5vdGhpbmcsIGJlY2F1c2UgYSBsYXllciBwbHVzIGFuIGV4ZWMgd3JhcHBlciB0aGF0IGRvZXMgbm90IGV4aXN0IGluIGl0IGZhaWxzIHRoZSBmdW5jdGlvbiBhdCBjb2xkIHN0YXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGFuZ3VhZ2VGcm9tUnVudGltZShydW50aW1lTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBbcHJlZml4LCBsYW5ndWFnZV0gb2YgTEFOR1VBR0VfUFJFRklYRVMpIHtcbiAgICBpZiAocnVudGltZU5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgICByZXR1cm4gbGFuZ3VhZ2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiBNYXBzIHRoZSBKYXZhIGRpc3RybyBlbnVtIHRvIHRoZSB3cmFwcGVyIHNjcmlwdCBwYXRoIHRoZSBsYXllciBzaGlwcy4gKi9cbmNvbnN0IEpBVkFfRElTVFJPX1dSQVBQRVJTOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICBbT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8uT1RFTF9IQU5ETEVSXTogJy9vcHQvb3RlbC1oYW5kbGVyJyxcbiAgW09kaWdvc0phdmFIYW5kbGVyRGlzdHJvLk9URUxfUFJPWFlfSEFORExFUl06ICcvb3B0L290ZWwtcHJveHktaGFuZGxlcicsXG4gIFtPZGlnb3NKYXZhSGFuZGxlckRpc3Ryby5PVEVMX1NRU19IQU5ETEVSXTogJy9vcHQvb3RlbC1zcXMtaGFuZGxlcicsXG4gIFtPZGlnb3NKYXZhSGFuZGxlckRpc3Ryby5PVEVMX1NUUkVBTV9IQU5ETEVSXTogJy9vcHQvb3RlbC1zdHJlYW0taGFuZGxlcicsXG59O1xuXG4vKipcbiAqIFRoZSBgQVdTX0xBTUJEQV9FWEVDX1dSQVBQRVJgIHZhbHVlIGZvciBhIGxhbmd1YWdlLlxuICpcbiAqIFRoZSB3cmFwcGVyIHNjcmlwdCBpcyBMQU5HVUFHRS1TUEVDSUZJQzogUHl0aG9uIHNoaXBzIGAvb3B0L290ZWwtaW5zdHJ1bWVudGA7IE5vZGUuanMsIEphdmEgYW5kIFJ1YnlcbiAqIHNoaXAgYC9vcHQvb3RlbC1oYW5kbGVyYC4gU2V0dGluZyB0aGUgd3Jvbmcgb25lIG1ha2VzIHRoZSBsYXllciBib290c3RyYXAgZmFpbCBhdCBjb2xkIHN0YXJ0IHdpdGhcbiAqIGAvb3B0L290ZWwtaW5zdHJ1bWVudDogZG9lcyBub3QgZXhpc3RgIGFuZCB0aGUgZnVuY3Rpb24gZXJyb3JzIG91dCDigJQgd2hpY2ggaXMgd2h5IHRoaXMgaXMgbmV2ZXIgYVxuICogaGFyZGNvZGVkIGNvbnN0YW50IGF0IGEgY2FsbCBzaXRlLlxuICpcbiAqIGBkaXN0cm9gIGlzIG9ubHkgY29uc3VsdGVkIGZvciBKYXZhLCB3aG9zZSBsYXllciBzaGlwcyBmb3VyIHdyYXBwZXJzLCBvbmUgcGVyIGhhbmRsZXIgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlY1dyYXBwZXJGb3IobGFuZ3VhZ2U6IHN0cmluZywgZGlzdHJvPzogT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8pOiBzdHJpbmcge1xuICBpZiAobGFuZ3VhZ2UgPT09ICdqYXZhJykge1xuICAgIHJldHVybiBKQVZBX0RJU1RST19XUkFQUEVSU1tkaXN0cm8gPz8gT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8uT1RFTF9IQU5ETEVSXTtcbiAgfVxuICBjb25zdCBzcGVjID0gTEFOR1VBR0VTW2xhbmd1YWdlXTtcbiAgaWYgKCFzcGVjKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPZGlnb3M6IG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGZvciBsYW5ndWFnZSBcIiR7bGFuZ3VhZ2V9XCJgKTtcbiAgfVxuICByZXR1cm4gc3BlYy5leGVjV3JhcHBlcjtcbn1cblxuLyoqIExheWVyIG5hbWUgZm9yIGEgbGFuZ3VhZ2UvYXJjaGl0ZWN0dXJlIOKAlCBgb2RpZ29zLW90ZWwtcHl0aG9uLWFybTY0YC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllck5hbWVGb3IobGFuZ3VhZ2U6IHN0cmluZywgYXJjaGl0ZWN0dXJlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzcGVjID0gTEFOR1VBR0VTW2xhbmd1YWdlXTtcbiAgaWYgKCFzcGVjKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPZGlnb3M6IHVua25vd24gbGFuZ3VhZ2UgXCIke2xhbmd1YWdlfVwiYCk7XG4gIH1cbiAgcmV0dXJuIGAke3NwZWMubGF5ZXJOYW1lfS0ke2FyY2hpdGVjdHVyZX1gO1xufVxuXG4vKiogRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNldCBvbiBhIGZ1bmN0aW9uLCBhcyBhIHBsYWluIG1hcC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW52VmFycyB7XG4gIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IHN0cmluZztcbn1cblxuLyoqXG4gKiBJZGVtcG90ZW50bHkgYWRkcyBvdXIgbG9hZGVyIHZhbHVlIHRvIGEgdmFsdWUgdGhlIGZ1bmN0aW9uIGFscmVhZHkgY2Fycmllcy5cbiAqXG4gKiBgUFlUSE9OUEFUSGAgaXMgUFJFUEVOREVELCBzbyB0aGUgbGF5ZXIncyBwYWNrYWdlcyBhbmQgaXRzIGBzaXRlY3VzdG9taXplYCBhcmUgZm91bmQgZmlyc3Q7IHRoZVxuICogYCpfT1BUSU9OU2AgdmFyaWFibGVzIGFyZSBhcHBlbmRlZCwgc28gdGhlIGN1c3RvbWVyJ3Mgb3duIGZsYWdzIGtlZXAgcHJlY2VkZW5jZS4gTWlycm9yc1xuICogYGFkZExvYWRlclZhbHVlYCBpbiB0aGUgY29ubmVjdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkTG9hZGVyVmFsdWUoZXhpc3Rpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCwgdmFsdWU6IHN0cmluZywgc2VwYXJhdG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChleGlzdGluZy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cbiAgcmV0dXJuIHNlcGFyYXRvciA9PT0gJzonID8gYCR7dmFsdWV9JHtzZXBhcmF0b3J9JHtleGlzdGluZ31gIDogYCR7ZXhpc3Rpbmd9JHtzZXBhcmF0b3J9JHt2YWx1ZX1gO1xufVxuXG4vKipcbiAqIFRoZSBlbnZpcm9ubWVudCB0aGF0IGxvYWRzIHRoZSBsYW5ndWFnZSBhZ2VudCBpbiB3ZWItc2VydmVyIChBV1MgTGFtYmRhIFdlYiBBZGFwdGVyKSBtb2RlLlxuICpcbiAqIFdlYi1hZGFwdGVyIGZ1bmN0aW9ucyBydW4gYSB3ZWIgc2VydmVyIHJhdGhlciB0aGFuIGEgTGFtYmRhIGhhbmRsZXIsIGFuZCB0aGUgYWRhcHRlciBvd25zXG4gKiBgQVdTX0xBTUJEQV9FWEVDX1dSQVBQRVJgIOKAlCBzbyBpbnN0cnVtZW50YXRpb24gaXMgbG9hZGVkIHRocm91Z2ggdGhlIGxhbmd1YWdlJ3Mgb3duIGxvYWRlciB2YXJpYWJsZSBhbmRcbiAqIHRoZSB3cmFwcGVyIGlzIGxlZnQgYWxvbmUuIEhhbmRsZXItbW9kZSBpbnN0cnVtZW50YXRpb24gYXBwbGllZCB0byBvbmUgb2YgdGhlc2Ugb3ZlcndyaXRlcyB0aGVcbiAqIGFkYXB0ZXIncyB3cmFwcGVyIGFuZCB0aGUgZnVuY3Rpb24gc3RvcHMgc2VydmluZy5cbiAqXG4gKiBAcGFyYW0gZXhpc3RpbmdMb2FkZXJWYWx1ZSB0aGUgdmFsdWUgdGhlIGZ1bmN0aW9uIGFscmVhZHkgbmVlZHMgaW4gaXRzIGxvYWRlciB2YXJpYWJsZSwgd2hpY2ggb3VycyBpc1xuICogam9pbmVkIHRvLiBDREsncyBgbGFtYmRhLkZ1bmN0aW9uYCBleHBvc2VzIG5vIHdheSB0byByZWFkIGJhY2sgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0IGVsc2V3aGVyZSBpblxuICogdGhlIGFwcCwgc28gYSB2YWx1ZSB0aGF0IG11c3QgYmUgcHJlc2VydmVkIGhhcyB0byBiZSBwYXNzZWQgaW4gZXhwbGljaXRseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdlYlNlcnZlckVudihcbiAgbGFuZ3VhZ2U6IHN0cmluZyxcbiAgZXhpc3RpbmdMb2FkZXJWYWx1ZT86IHN0cmluZyxcbik6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICBjb25zdCBzcGVjID0gTEFOR1VBR0VTW2xhbmd1YWdlXTtcbiAgY29uc3QgbG9hZGVyID0gc3BlYz8ud2ViU2VydmVyO1xuICBpZiAoIWxvYWRlcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBPZGlnb3M6ICR7T2RpZ29zSW5zdHJ1bWVudGF0aW9uTW9kZS5XRUJfU0VSVkVSfSBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yICR7bGFuZ3VhZ2V9IOKAlCBgICtcbiAgICAgICAgJ3RoZXJlIGlzIG5vIHZlcmlmaWVkIHdlYi1zZXJ2ZXIgbG9hZGVyIGZvciBpdC4gVXNlIEhBTkRMRVIgbW9kZSwgb3IgbGVhdmUgdGhlIGZ1bmN0aW9uIHVuaW5zdHJ1bWVudGVkLicsXG4gICAgKTtcbiAgfVxuICBjb25zdCBlbnY6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgW2xvYWRlci5lbnZLZXldOiBhZGRMb2FkZXJWYWx1ZShleGlzdGluZ0xvYWRlclZhbHVlLCBsb2FkZXIudmFsdWUsIGxvYWRlci5zZXBhcmF0b3IpLFxuICB9O1xuICAvLyBQeXRob24gbXVzdCBiZSBwaW5uZWQgdG8gdGhlIEhUVFAgT1RMUCBleHBvcnRlciDigJQgdGhlIG9ubHkgb25lIGJ1bmRsZWQgaW4gaXRzIGxheWVyLiBPdGhlciBsYW5ndWFnZXNcbiAgLy8gZXhwb3J0IGNvcnJlY3RseSB3aXRoIHRoZWlyIGRlZmF1bHRzLCBzbyBub3RoaW5nIGV4dHJhIGlzIHdyaXR0ZW4gZm9yIHRoZW0uXG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGxvYWRlci5leHRyYUVudikpIHtcbiAgICBlbnZba10gPSB2O1xuICB9XG4gIHJldHVybiBlbnY7XG59XG4iXX0=
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMEJBLGtEQU9DO0FBb0JELHdDQVNDO0FBR0Qsb0NBTUM7QUFjRCx3Q0FRQztBQVVELGdEQUVDO0FBY0Qsb0NBcUJDO0FBNUlELCtDQUErQztBQUMvQyxtQ0FBNkU7QUFFN0U7Ozs7OztHQU1HO0FBRUgsNEdBQTRHO0FBQzVHLE1BQU0saUJBQWlCLEdBQTRCO0lBQ2pELENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztJQUNwQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUM7SUFDcEIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztDQUNqQixDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsV0FBbUI7SUFDckQsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDbkQsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkMsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLE1BQU0sb0JBQW9CLEdBQThCO0lBQ3RELENBQUMsK0JBQXVCLENBQUMsWUFBWSxDQUFDLEVBQUUsbUJBQW1CO0lBQzNELENBQUMsK0JBQXVCLENBQUMsa0JBQWtCLENBQUMsRUFBRSx5QkFBeUI7SUFDdkUsQ0FBQywrQkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLHVCQUF1QjtJQUNuRSxDQUFDLCtCQUF1QixDQUFDLG1CQUFtQixDQUFDLEVBQUUsMEJBQTBCO0NBQzFFLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQixjQUFjLENBQUMsUUFBZ0IsRUFBRSxNQUFnQztJQUMvRSxJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUN4QixPQUFPLG9CQUFvQixDQUFDLE1BQU0sSUFBSSwrQkFBdUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsa0JBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7QUFDMUIsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxTQUFnQixZQUFZLENBQUMsUUFBZ0IsRUFBRSxZQUFvQjtJQUNqRSxNQUFNLElBQUksR0FBRyxrQkFBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUNELE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLFlBQVksRUFBRSxDQUFDO0FBQzdDLENBQUM7QUFPRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixjQUFjLENBQUMsUUFBNEIsRUFBRSxLQUFhLEVBQUUsU0FBaUI7SUFDM0YsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDN0IsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUNELE9BQU8sU0FBUyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsU0FBUyxHQUFHLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxTQUFTLEdBQUcsS0FBSyxFQUFFLENBQUM7QUFDbkcsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxRQUFnQjtJQUNqRCxPQUFPLGtCQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQztBQUNoRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFnQixZQUFZLENBQzFCLFFBQWdCLEVBQ2hCLG1CQUE0QjtJQUU1QixNQUFNLElBQUksR0FBRyxrQkFBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksRUFBRSxTQUFTLENBQUM7SUFDL0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLEtBQUssQ0FDYixXQUFXLGlDQUF5QixDQUFDLFVBQVUsOEJBQThCLFFBQVEsS0FBSztZQUN4Rix3R0FBd0csQ0FDM0csQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBOEI7UUFDckMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsY0FBYyxDQUFDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQztLQUNyRixDQUFDO0lBQ0YsdUdBQXVHO0lBQ3ZHLDhFQUE4RTtJQUM5RSxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNyRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExBTkdVQUdFUyB9IGZyb20gJy4vZ2VuZXJhdGVkL2xheWVycyc7XG5pbXBvcnQgeyBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLCBPZGlnb3NKYXZhSGFuZGxlckRpc3RybyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFJ1bnRpbWUgLT4gbGFuZ3VhZ2UsIGFuZCBsYW5ndWFnZSAtPiB0aGUgZXhhY3QgZW52IHRoZSBsYXllciBleHBlY3RzLlxuICpcbiAqIE1pcnJvcnMgYExhbmd1YWdlRnJvbVJ1bnRpbWVgLCBgZXhlY1dyYXBwZXJGb3JMYW5ndWFnZWAgYW5kIGB3ZWJTZXJ2ZXJMb2FkZXJgIGluIHRoZSBjb25uZWN0b3Inc1xuICogaW5zdHJ1bWVudG9yLiBUaGUgZGF0YSBsaXZlcyBpbiAuLi8uLi9hcnRpZmFjdHMuanNvbiBhbmQgcmVhY2hlcyBoZXJlIHRocm91Z2ggdGhlIGdlbmVyYXRlZCBtb2R1bGU7IHRoZVxuICogZGVjaXNpb25zIGxpdmUgaGVyZS5cbiAqL1xuXG4vKiogUnVudGltZSBwcmVmaXhlcyB0aGF0IG1hcCB0byBhbiBPVGVsIGxheWVyIGxhbmd1YWdlLiBQcmVmaXgtbWF0Y2hlZCwgc28gYGphdmE4LmFsMmAgcmVzb2x2ZXMgdG8gamF2YS4gKi9cbmNvbnN0IExBTkdVQUdFX1BSRUZJWEVTOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiA9IFtcbiAgWydweXRob24nLCAncHl0aG9uJ10sXG4gIFsnbm9kZWpzJywgJ25vZGVqcyddLFxuICBbJ2phdmEnLCAnamF2YSddLFxuICBbJ3J1YnknLCAncnVieSddLFxuXTtcblxuLyoqXG4gKiBSZXNvbHZlcyBhIExhbWJkYSBydW50aW1lIGlkZW50aWZpZXIgKGBweXRob24zLjEyYCwgYGphdmEyMWAsIGBub2RlanMyMi54YCkgdG8gdGhlIE9UZWwgbGF5ZXIgbGFuZ3VhZ2UuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgcnVudGltZXMgd2l0aCBubyBPcGVuVGVsZW1ldHJ5IExhbWJkYSBsYW5ndWFnZSBsYXllciDigJQgYGRvdG5ldCpgLCBgcHJvdmlkZWQuKmBcbiAqIChHbyBhbmQgY3VzdG9tIHJ1bnRpbWVzKS4gVGhlIGNhbGxlciByZWZ1c2VzIHRvIGluc3RydW1lbnQgcmF0aGVyIHRoYW4gYXR0YWNoaW5nIGEgbGF5ZXIgdGhhdCBkb2VzXG4gKiBub3RoaW5nLCBiZWNhdXNlIGEgbGF5ZXIgcGx1cyBhbiBleGVjIHdyYXBwZXIgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBpdCBmYWlscyB0aGUgZnVuY3Rpb24gYXQgY29sZCBzdGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhbmd1YWdlRnJvbVJ1bnRpbWUocnVudGltZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgW3ByZWZpeCwgbGFuZ3VhZ2VdIG9mIExBTkdVQUdFX1BSRUZJWEVTKSB7XG4gICAgaWYgKHJ1bnRpbWVOYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgcmV0dXJuIGxhbmd1YWdlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogTWFwcyB0aGUgSmF2YSBkaXN0cm8gZW51bSB0byB0aGUgd3JhcHBlciBzY3JpcHQgcGF0aCB0aGUgbGF5ZXIgc2hpcHMuICovXG5jb25zdCBKQVZBX0RJU1RST19XUkFQUEVSUzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgW09kaWdvc0phdmFIYW5kbGVyRGlzdHJvLk9URUxfSEFORExFUl06ICcvb3B0L290ZWwtaGFuZGxlcicsXG4gIFtPZGlnb3NKYXZhSGFuZGxlckRpc3Ryby5PVEVMX1BST1hZX0hBTkRMRVJdOiAnL29wdC9vdGVsLXByb3h5LWhhbmRsZXInLFxuICBbT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8uT1RFTF9TUVNfSEFORExFUl06ICcvb3B0L290ZWwtc3FzLWhhbmRsZXInLFxuICBbT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8uT1RFTF9TVFJFQU1fSEFORExFUl06ICcvb3B0L290ZWwtc3RyZWFtLWhhbmRsZXInLFxufTtcblxuLyoqXG4gKiBUaGUgYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCB2YWx1ZSBmb3IgYSBsYW5ndWFnZS5cbiAqXG4gKiBUaGUgd3JhcHBlciBzY3JpcHQgaXMgTEFOR1VBR0UtU1BFQ0lGSUM6IFB5dGhvbiBzaGlwcyBgL29wdC9vdGVsLWluc3RydW1lbnRgOyBOb2RlLmpzLCBKYXZhIGFuZCBSdWJ5XG4gKiBzaGlwIGAvb3B0L290ZWwtaGFuZGxlcmAuIFNldHRpbmcgdGhlIHdyb25nIG9uZSBtYWtlcyB0aGUgbGF5ZXIgYm9vdHN0cmFwIGZhaWwgYXQgY29sZCBzdGFydCB3aXRoXG4gKiBgL29wdC9vdGVsLWluc3RydW1lbnQ6IGRvZXMgbm90IGV4aXN0YCBhbmQgdGhlIGZ1bmN0aW9uIGVycm9ycyBvdXQg4oCUIHdoaWNoIGlzIHdoeSB0aGlzIGlzIG5ldmVyIGFcbiAqIGhhcmRjb2RlZCBjb25zdGFudCBhdCBhIGNhbGwgc2l0ZS5cbiAqXG4gKiBgZGlzdHJvYCBpcyBvbmx5IGNvbnN1bHRlZCBmb3IgSmF2YSwgd2hvc2UgbGF5ZXIgc2hpcHMgZm91ciB3cmFwcGVycywgb25lIHBlciBoYW5kbGVyIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWNXcmFwcGVyRm9yKGxhbmd1YWdlOiBzdHJpbmcsIGRpc3Rybz86IE9kaWdvc0phdmFIYW5kbGVyRGlzdHJvKTogc3RyaW5nIHtcbiAgaWYgKGxhbmd1YWdlID09PSAnamF2YScpIHtcbiAgICByZXR1cm4gSkFWQV9ESVNUUk9fV1JBUFBFUlNbZGlzdHJvID8/IE9kaWdvc0phdmFIYW5kbGVyRGlzdHJvLk9URUxfSEFORExFUl07XG4gIH1cbiAgY29uc3Qgc3BlYyA9IExBTkdVQUdFU1tsYW5ndWFnZV07XG4gIGlmICghc3BlYykge1xuICAgIHRocm93IG5ldyBFcnJvcihgT2RpZ29zOiBubyBPcGVuVGVsZW1ldHJ5IExhbWJkYSBsYXllciBmb3IgbGFuZ3VhZ2UgXCIke2xhbmd1YWdlfVwiYCk7XG4gIH1cbiAgcmV0dXJuIHNwZWMuZXhlY1dyYXBwZXI7XG59XG5cbi8qKiBMYXllciBuYW1lIGZvciBhIGxhbmd1YWdlL2FyY2hpdGVjdHVyZSDigJQgYG9kaWdvcy1vdGVsLXB5dGhvbi1hcm02NGAuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJOYW1lRm9yKGxhbmd1YWdlOiBzdHJpbmcsIGFyY2hpdGVjdHVyZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3BlYyA9IExBTkdVQUdFU1tsYW5ndWFnZV07XG4gIGlmICghc3BlYykge1xuICAgIHRocm93IG5ldyBFcnJvcihgT2RpZ29zOiB1bmtub3duIGxhbmd1YWdlIFwiJHtsYW5ndWFnZX1cImApO1xuICB9XG4gIHJldHVybiBgJHtzcGVjLmxheWVyTmFtZX0tJHthcmNoaXRlY3R1cmV9YDtcbn1cblxuLyoqIEVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzZXQgb24gYSBmdW5jdGlvbiwgYXMgYSBwbGFpbiBtYXAuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudlZhcnMge1xuICByZWFkb25seSBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSWRlbXBvdGVudGx5IGFkZHMgb3VyIGxvYWRlciB2YWx1ZSB0byBhIHZhbHVlIHRoZSBmdW5jdGlvbiBhbHJlYWR5IGNhcnJpZXMuXG4gKlxuICogYFBZVEhPTlBBVEhgIGlzIFBSRVBFTkRFRCwgc28gdGhlIGxheWVyJ3MgcGFja2FnZXMgYW5kIGl0cyBgc2l0ZWN1c3RvbWl6ZWAgYXJlIGZvdW5kIGZpcnN0OyB0aGVcbiAqIGAqX09QVElPTlNgIHZhcmlhYmxlcyBhcmUgYXBwZW5kZWQsIHNvIHRoZSBjdXN0b21lcidzIG93biBmbGFncyBrZWVwIHByZWNlZGVuY2UuIE1pcnJvcnNcbiAqIGBhZGRMb2FkZXJWYWx1ZWAgaW4gdGhlIGNvbm5lY3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZExvYWRlclZhbHVlKGV4aXN0aW5nOiBzdHJpbmcgfCB1bmRlZmluZWQsIHZhbHVlOiBzdHJpbmcsIHNlcGFyYXRvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFleGlzdGluZykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoZXhpc3RpbmcuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nO1xuICB9XG4gIHJldHVybiBzZXBhcmF0b3IgPT09ICc6JyA/IGAke3ZhbHVlfSR7c2VwYXJhdG9yfSR7ZXhpc3Rpbmd9YCA6IGAke2V4aXN0aW5nfSR7c2VwYXJhdG9yfSR7dmFsdWV9YDtcbn1cblxuLyoqXG4gKiBUaGUgbG9hZGVyIHZhcmlhYmxlIGEgbGFuZ3VhZ2UgYWN0aXZhdGVzIHRocm91Z2ggaW4gd2ViLXNlcnZlciBtb2RlIChgTk9ERV9PUFRJT05TYCxcbiAqIGBKQVZBX1RPT0xfT1BUSU9OU2AsIGBQWVRIT05QQVRIYCksIG9yIHVuZGVmaW5lZCBmb3IgYSBsYW5ndWFnZSB3aXRoIG5vIHZlcmlmaWVkIHdlYi1zZXJ2ZXIgbG9hZGVyLlxuICpcbiAqIEV4aXN0cyBzbyBhIGNhbGxlciB0aGF0IG5lZWRzIHRvIG5hbWUgdGhlIHZhcmlhYmxlIOKAlCB0aGUgb3duZXJzaGlwIG1hcmtlcidzIHJvbGxiYWNrIHNuYXBzaG90LCB3aGljaCBoYXNcbiAqIHRvIHJlY29yZCB0aGUgY2FsbGVyJ3Mgb3duIHByaW9yIHZhbHVlIGZvciBpdCDigJQgZG9lcyBub3QgaGF2ZSB0byBndWVzcyBpdCBmcm9tIHRoZSBrZXkgb3JkZXIgb2ZcbiAqIGB3ZWJTZXJ2ZXJFbnZgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2ViU2VydmVyTG9hZGVyS2V5KGxhbmd1YWdlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gTEFOR1VBR0VTW2xhbmd1YWdlXT8ud2ViU2VydmVyPy5lbnZLZXk7XG59XG5cbi8qKlxuICogVGhlIGVudmlyb25tZW50IHRoYXQgbG9hZHMgdGhlIGxhbmd1YWdlIGFnZW50IGluIHdlYi1zZXJ2ZXIgKEFXUyBMYW1iZGEgV2ViIEFkYXB0ZXIpIG1vZGUuXG4gKlxuICogV2ViLWFkYXB0ZXIgZnVuY3Rpb25zIHJ1biBhIHdlYiBzZXJ2ZXIgcmF0aGVyIHRoYW4gYSBMYW1iZGEgaGFuZGxlciwgYW5kIHRoZSBhZGFwdGVyIG93bnNcbiAqIGBBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUmAg4oCUIHNvIGluc3RydW1lbnRhdGlvbiBpcyBsb2FkZWQgdGhyb3VnaCB0aGUgbGFuZ3VhZ2UncyBvd24gbG9hZGVyIHZhcmlhYmxlIGFuZFxuICogdGhlIHdyYXBwZXIgaXMgbGVmdCBhbG9uZS4gSGFuZGxlci1tb2RlIGluc3RydW1lbnRhdGlvbiBhcHBsaWVkIHRvIG9uZSBvZiB0aGVzZSBvdmVyd3JpdGVzIHRoZVxuICogYWRhcHRlcidzIHdyYXBwZXIgYW5kIHRoZSBmdW5jdGlvbiBzdG9wcyBzZXJ2aW5nLlxuICpcbiAqIEBwYXJhbSBleGlzdGluZ0xvYWRlclZhbHVlIHRoZSB2YWx1ZSB0aGUgZnVuY3Rpb24gYWxyZWFkeSBuZWVkcyBpbiBpdHMgbG9hZGVyIHZhcmlhYmxlLCB3aGljaCBvdXJzIGlzXG4gKiBqb2luZWQgdG8uIENESydzIGBsYW1iZGEuRnVuY3Rpb25gIGV4cG9zZXMgbm8gd2F5IHRvIHJlYWQgYmFjayBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXQgZWxzZXdoZXJlIGluXG4gKiB0aGUgYXBwLCBzbyBhIHZhbHVlIHRoYXQgbXVzdCBiZSBwcmVzZXJ2ZWQgaGFzIHRvIGJlIHBhc3NlZCBpbiBleHBsaWNpdGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2ViU2VydmVyRW52KFxuICBsYW5ndWFnZTogc3RyaW5nLFxuICBleGlzdGluZ0xvYWRlclZhbHVlPzogc3RyaW5nLFxuKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gIGNvbnN0IHNwZWMgPSBMQU5HVUFHRVNbbGFuZ3VhZ2VdO1xuICBjb25zdCBsb2FkZXIgPSBzcGVjPy53ZWJTZXJ2ZXI7XG4gIGlmICghbG9hZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE9kaWdvczogJHtPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLldFQl9TRVJWRVJ9IG1vZGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgJHtsYW5ndWFnZX0g4oCUIGAgK1xuICAgICAgICAndGhlcmUgaXMgbm8gdmVyaWZpZWQgd2ViLXNlcnZlciBsb2FkZXIgZm9yIGl0LiBVc2UgSEFORExFUiBtb2RlLCBvciBsZWF2ZSB0aGUgZnVuY3Rpb24gdW5pbnN0cnVtZW50ZWQuJyxcbiAgICApO1xuICB9XG4gIGNvbnN0IGVudjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICBbbG9hZGVyLmVudktleV06IGFkZExvYWRlclZhbHVlKGV4aXN0aW5nTG9hZGVyVmFsdWUsIGxvYWRlci52YWx1ZSwgbG9hZGVyLnNlcGFyYXRvciksXG4gIH07XG4gIC8vIFB5dGhvbiBtdXN0IGJlIHBpbm5lZCB0byB0aGUgSFRUUCBPVExQIGV4cG9ydGVyIOKAlCB0aGUgb25seSBvbmUgYnVuZGxlZCBpbiBpdHMgbGF5ZXIuIE90aGVyIGxhbmd1YWdlc1xuICAvLyBleHBvcnQgY29ycmVjdGx5IHdpdGggdGhlaXIgZGVmYXVsdHMsIHNvIG5vdGhpbmcgZXh0cmEgaXMgd3JpdHRlbiBmb3IgdGhlbS5cbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMobG9hZGVyLmV4dHJhRW52KSkge1xuICAgIGVudltrXSA9IHY7XG4gIH1cbiAgcmV0dXJuIGVudjtcbn1cbiJdfQ==
|