cdk-nextjs 0.7.12 → 0.7.14
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 +346 -100
- package/.jsii.tabl.json +1 -1
- package/API.md +208 -0
- package/README.md +115 -100
- package/docs/breaking-changes.md +4 -2
- package/docs/development-guide.md +10 -0
- package/docs/harness-coverage.md +16 -6
- package/docs/next-build-output-guide.md +1 -1
- package/lib/adapter/adapter.mjs +4 -1
- package/lib/generated-structs/OptionalNextjsApiProps.d.ts +6 -0
- package/lib/generated-structs/OptionalNextjsApiProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +27 -0
- package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
- package/lib/nextjs-api.d.ts +11 -0
- package/lib/nextjs-api.js +63 -9
- package/lib/nextjs-api.test.js +127 -1
- package/lib/nextjs-build/nextjs-build.js +1 -1
- package/lib/nextjs-cache.js +1 -1
- package/lib/nextjs-compute/nextjs-containers.js +1 -1
- package/lib/nextjs-compute/nextjs-functions.js +1 -1
- package/lib/nextjs-distribution.d.ts +92 -2
- package/lib/nextjs-distribution.js +223 -109
- package/lib/nextjs-distribution.test.js +492 -12
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/nextjs-static-assets.test.js +19 -7
- package/lib/root-constructs/nextjs-base-construct.d.ts +7 -0
- package/lib/root-constructs/nextjs-base-construct.js +14 -2
- package/lib/root-constructs/nextjs-global-containers.d.ts +16 -1
- package/lib/root-constructs/nextjs-global-containers.js +5 -2
- package/lib/root-constructs/nextjs-global-functions.d.ts +16 -1
- package/lib/root-constructs/nextjs-global-functions.js +5 -2
- package/lib/root-constructs/nextjs-regional-containers.js +1 -1
- package/lib/root-constructs/nextjs-regional-functions.js +3 -2
- package/lib/runtime/lambda.mjs +4 -1
- package/lib/runtime/server.mjs +4 -1
- package/lib/utils/viewer-request-functions.d.ts +53 -0
- package/lib/utils/viewer-request-functions.js +172 -0
- package/lib/utils/viewer-request-functions.test.d.ts +1 -0
- package/lib/utils/viewer-request-functions.test.js +43 -0
- package/package.json +4 -1
- package/scripts/e2e-harness/README.md +10 -8
- package/scripts/e2e-harness/app.js +7 -2
- package/scripts/render-diagrams.mjs +121 -0
|
@@ -10,8 +10,9 @@ const constructs_1 = require("constructs");
|
|
|
10
10
|
const function_groups_1 = require("./adapter/function-groups");
|
|
11
11
|
const constants_1 = require("./constants");
|
|
12
12
|
const base_path_1 = require("./utils/base-path");
|
|
13
|
+
const viewer_request_functions_1 = require("./utils/viewer-request-functions");
|
|
13
14
|
class NextjsDistribution extends constructs_1.Construct {
|
|
14
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsDistribution", version: "0.7.
|
|
15
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsDistribution", version: "0.7.14" };
|
|
15
16
|
distribution;
|
|
16
17
|
props;
|
|
17
18
|
/**
|
|
@@ -54,6 +55,18 @@ class NextjsDistribution extends constructs_1.Construct {
|
|
|
54
55
|
dynamicOrigin;
|
|
55
56
|
dynamicOriginResponsePolicy;
|
|
56
57
|
dynamicCloudFrontFunctionAssociations;
|
|
58
|
+
/**
|
|
59
|
+
* `viewerRequestFunctionCode`, rendered and checked once, since
|
|
60
|
+
* `FunctionCode.fromFile` reads the file on every render.
|
|
61
|
+
*/
|
|
62
|
+
viewerRequestCode;
|
|
63
|
+
/**
|
|
64
|
+
* The viewer-request function `viewerRequestFunctionCode` adds to behaviors
|
|
65
|
+
* with no viewer-request logic of their own, shared by all of them, so the
|
|
66
|
+
* `assetPrefix` behavior, which has a viewer-request function of its own,
|
|
67
|
+
* can tell it from an override's.
|
|
68
|
+
*/
|
|
69
|
+
passThroughFunction;
|
|
57
70
|
isFunctionCompute;
|
|
58
71
|
staticBehaviorOptions;
|
|
59
72
|
dynamicBehaviorOptions;
|
|
@@ -61,6 +74,12 @@ class NextjsDistribution extends constructs_1.Construct {
|
|
|
61
74
|
constructor(scope, id, props) {
|
|
62
75
|
super(scope, id);
|
|
63
76
|
this.props = props;
|
|
77
|
+
if (props.viewerRequestKeyValueStore && !props.viewerRequestFunctionCode) {
|
|
78
|
+
throw new Error(`${constants_1.LOG_PREFIX} \`viewerRequestKeyValueStore\` is only associated with ` +
|
|
79
|
+
`the functions \`viewerRequestFunctionCode\` runs in, so it needs ` +
|
|
80
|
+
`\`viewerRequestFunctionCode\` to read it.`);
|
|
81
|
+
}
|
|
82
|
+
this.viewerRequestCode = this.renderViewerRequestCode();
|
|
64
83
|
this.basePath = (0, base_path_1.normalizeBasePath)(props.basePath);
|
|
65
84
|
this.assetPrefix = this.resolveAssetPrefix();
|
|
66
85
|
this.staticOrigin = this.createStaticOrigin();
|
|
@@ -144,78 +163,102 @@ class NextjsDistribution extends constructs_1.Construct {
|
|
|
144
163
|
const associations = [];
|
|
145
164
|
if (this.isFunctionCompute) {
|
|
146
165
|
const cloudFrontFn = new aws_cloudfront_1.Function(this, "CloudFrontFn", {
|
|
147
|
-
|
|
148
|
-
// literals, no `Object.keys`.
|
|
149
|
-
code: aws_cloudfront_1.FunctionCode.fromInline(`
|
|
150
|
-
function handler(event) {
|
|
151
|
-
var request = event.request;
|
|
152
|
-
var uri = request.uri;
|
|
153
|
-
|
|
154
|
-
// Next.js answers any path containing a backslash or a repeated
|
|
155
|
-
// slash with a 308 to the collapsed path
|
|
156
|
-
// (\`normalizeRepeatedSlashes\`, called from \`base-server.ts\`), and so
|
|
157
|
-
// does this runtime. Behind a Lambda Function URL the origin never
|
|
158
|
-
// gets the chance: Origin Access Control signs the raw path while the
|
|
159
|
-
// Function URL canonicalizes it before verifying, so the origin
|
|
160
|
-
// answers 403 SignatureDoesNotMatch. Doing the redirect here is what
|
|
161
|
-
// makes \`/basepath//to-sv\` behave as it does under \`next start\`.
|
|
162
|
-
//
|
|
163
|
-
// A bare \`//\` reaches here too, and is answered the same way -
|
|
164
|
-
// measured, because \`//\` at the start of a request target is also the
|
|
165
|
-
// authority form and it was not obvious CloudFront would route it to a
|
|
166
|
-
// function at all. It does: \`GET //\` answers 308 to \`/\` with
|
|
167
|
-
// \`x-cache: FunctionGeneratedResponse\`, over both HTTP/1.1 and HTTP/2,
|
|
168
|
-
// which is what \`test/e2e/hydration\` asks for.
|
|
169
|
-
//
|
|
170
|
-
// Two things Next.js does that this cannot:
|
|
171
|
-
//
|
|
172
|
-
// - the body it sends with its own redirect (the destination, as
|
|
173
|
-
// text), because a generated response can only carry one on
|
|
174
|
-
// cloudfront-js-2.0. No known client reads it.
|
|
175
|
-
// - the original order of the query string. The event exposes
|
|
176
|
-
// \`querystring\` as an object, never as the raw string, so
|
|
177
|
-
// \`/x//y?a=1&b=2\` redirects to \`/x/y?b=2&a=1\`. The pairs all
|
|
178
|
-
// survive; only their order is CloudFront's rather than the
|
|
179
|
-
// client's, and a redirect target is not order-sensitive.
|
|
180
|
-
//
|
|
181
|
-
// A repeated key's \`multiValue\` already holds its first value, which
|
|
182
|
-
// \`value\` repeats, so it is one or the other, never both. Names and
|
|
183
|
-
// values arrive as the client sent them, still percent-encoded
|
|
184
|
-
// (measured: \`?a=%20b%26c&p=1+2\` reads back unchanged), so they are
|
|
185
|
-
// joined as-is; encoding them again would turn \`%20\` into \`%2520\`.
|
|
186
|
-
if (/\\\\|\\/\\//.test(uri)) {
|
|
187
|
-
var location = uri.replace(/\\\\/g, "/").replace(/\\/\\/+/g, "/");
|
|
188
|
-
var qs = [];
|
|
189
|
-
for (var name in request.querystring) {
|
|
190
|
-
var q = request.querystring[name];
|
|
191
|
-
var values = q.multiValue || [q];
|
|
192
|
-
for (var i = 0; i < values.length; i++) {
|
|
193
|
-
var v = values[i].value;
|
|
194
|
-
qs.push(v === "" ? name : name + "=" + v);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
if (qs.length) {
|
|
198
|
-
location = location + "?" + qs.join("&");
|
|
199
|
-
}
|
|
200
|
-
return {
|
|
201
|
-
statusCode: 308,
|
|
202
|
-
statusDescription: "Permanent Redirect",
|
|
203
|
-
headers: { location: { value: location } },
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
request.headers["x-forwarded-host"] = request.headers.host;
|
|
208
|
-
return request;
|
|
209
|
-
}
|
|
210
|
-
`),
|
|
166
|
+
...this.viewerRequestFunctionProps(viewer_request_functions_1.X_FORWARDED_HOST_HANDLER),
|
|
211
167
|
});
|
|
212
168
|
associations.push({
|
|
213
169
|
eventType: aws_cloudfront_1.FunctionEventType.VIEWER_REQUEST,
|
|
214
170
|
function: cloudFrontFn,
|
|
215
171
|
});
|
|
216
172
|
}
|
|
173
|
+
else if (this.viewerRequestCode !== undefined) {
|
|
174
|
+
// Containers need no function of their own — their origin sees the
|
|
175
|
+
// viewer's `Host` — so this one only runs the user's code.
|
|
176
|
+
associations.push({
|
|
177
|
+
eventType: aws_cloudfront_1.FunctionEventType.VIEWER_REQUEST,
|
|
178
|
+
function: this.getPassThroughFunction(),
|
|
179
|
+
});
|
|
180
|
+
}
|
|
217
181
|
return associations;
|
|
218
182
|
}
|
|
183
|
+
/**
|
|
184
|
+
* The function a behavior with no viewer-request logic of its own gets when
|
|
185
|
+
* `viewerRequestFunctionCode` is set, created on first use.
|
|
186
|
+
*/
|
|
187
|
+
getPassThroughFunction() {
|
|
188
|
+
this.passThroughFunction ??= new aws_cloudfront_1.Function(this, "ViewerRequestFn", {
|
|
189
|
+
comment: this.getComment("NextJS viewer request", aws_cdk_lib_1.Stack.of(this).stackName),
|
|
190
|
+
...this.viewerRequestFunctionProps(viewer_request_functions_1.PASS_THROUGH_HANDLER),
|
|
191
|
+
});
|
|
192
|
+
return this.passThroughFunction;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* The code, runtime and KeyValueStore of a function whose `handler` is
|
|
196
|
+
* cdk-nextjs's, with `viewerRequestFunctionCode` spliced in
|
|
197
|
+
* ({@link spliceViewerRequest}) and checked against CloudFront's size limit.
|
|
198
|
+
*
|
|
199
|
+
* Every one runs on `cloudfront-js-2.0`, the runtime AWS recommends and the
|
|
200
|
+
* one with `async` and KeyValueStores, so the handlers are all `async`
|
|
201
|
+
* whether or not there is user code to await.
|
|
202
|
+
*/
|
|
203
|
+
viewerRequestFunctionProps(handler) {
|
|
204
|
+
const userCode = this.viewerRequestCode;
|
|
205
|
+
const code = (0, viewer_request_functions_1.spliceViewerRequest)(handler, userCode);
|
|
206
|
+
if (userCode === undefined) {
|
|
207
|
+
return {
|
|
208
|
+
code: aws_cloudfront_1.FunctionCode.fromInline(code),
|
|
209
|
+
runtime: aws_cloudfront_1.FunctionRuntime.JS_2_0,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
const size = Buffer.byteLength(code);
|
|
213
|
+
if (aws_cdk_lib_1.Token.isUnresolved(code)) {
|
|
214
|
+
// A token's placeholder isn't the length of what it resolves to.
|
|
215
|
+
aws_cdk_lib_1.Annotations.of(this).addWarning(`${constants_1.LOG_PREFIX} \`viewerRequestFunctionCode\` contains a CDK token, so ` +
|
|
216
|
+
`its size can't be checked against CloudFront's limit of ` +
|
|
217
|
+
`${viewer_request_functions_1.MAX_FUNCTION_CODE_BYTES} bytes until deploy.`);
|
|
218
|
+
}
|
|
219
|
+
else if (size > viewer_request_functions_1.MAX_FUNCTION_CODE_BYTES) {
|
|
220
|
+
throw new Error(`${constants_1.LOG_PREFIX} \`viewerRequestFunctionCode\` makes a CloudFront ` +
|
|
221
|
+
`Function of ${size} bytes, cdk-nextjs's own code included, over ` +
|
|
222
|
+
`CloudFront's limit of ${viewer_request_functions_1.MAX_FUNCTION_CODE_BYTES}. Shorten it ` +
|
|
223
|
+
`(comments and whitespace count). See ` +
|
|
224
|
+
`https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cloudfront-limits.html#limits-functions`);
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
code: aws_cloudfront_1.FunctionCode.fromInline(code),
|
|
228
|
+
runtime: aws_cloudfront_1.FunctionRuntime.JS_2_0,
|
|
229
|
+
keyValueStore: this.props.viewerRequestKeyValueStore,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* `viewerRequestFunctionCode`, rendered once, since `FunctionCode.fromFile`
|
|
234
|
+
* reads the file on every render, and checked
|
|
235
|
+
* ({@link checkViewerRequestCode}).
|
|
236
|
+
*/
|
|
237
|
+
renderViewerRequestCode() {
|
|
238
|
+
const userCode = this.props.viewerRequestFunctionCode?.render();
|
|
239
|
+
if (userCode === undefined) {
|
|
240
|
+
return undefined;
|
|
241
|
+
}
|
|
242
|
+
(0, viewer_request_functions_1.checkViewerRequestCode)(userCode);
|
|
243
|
+
return userCode;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* CloudFront allows one function per event type per behavior, so an
|
|
247
|
+
* override's viewer-request association and one cdk-nextjs needs can't both
|
|
248
|
+
* be kept. Thrown at synth, where both halves are known, rather than left to
|
|
249
|
+
* a deploy that names neither.
|
|
250
|
+
*/
|
|
251
|
+
assertViewerRequestUnclaimed(overrideName, associations, needs) {
|
|
252
|
+
const claimed = (associations ?? []).some((association) => association.eventType === aws_cloudfront_1.FunctionEventType.VIEWER_REQUEST);
|
|
253
|
+
if (claimed) {
|
|
254
|
+
throw new Error(`${constants_1.LOG_PREFIX} \`overrides.${overrideName}.functionAssociations\` ` +
|
|
255
|
+
`associates a CloudFront function with ` +
|
|
256
|
+
`${aws_cloudfront_1.FunctionEventType.VIEWER_REQUEST}, but ${needs}. ` +
|
|
257
|
+
`CloudFront permits only one function per event type per behavior. ` +
|
|
258
|
+
`Move the logic into \`viewerRequestFunctionCode\`, which runs ` +
|
|
259
|
+
`inside cdk-nextjs's own viewer-request function on every behavior.`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
219
262
|
createStaticBehaviorOptions() {
|
|
220
263
|
const staticBehaviorOptions = this.props.overrides?.staticBehaviorOptions;
|
|
221
264
|
const responseHeadersPolicy = staticBehaviorOptions?.responseHeadersPolicy ??
|
|
@@ -224,7 +267,7 @@ class NextjsDistribution extends constructs_1.Construct {
|
|
|
224
267
|
comment: this.getComment("NextJS Static Response Headers Policy", aws_cdk_lib_1.Stack.of(this).stackName),
|
|
225
268
|
...this.props.overrides?.staticResponseHeadersPolicyProps,
|
|
226
269
|
});
|
|
227
|
-
|
|
270
|
+
const options = {
|
|
228
271
|
allowedMethods: aws_cloudfront_1.AllowedMethods.ALLOW_GET_HEAD_OPTIONS,
|
|
229
272
|
cachedMethods: aws_cloudfront_1.CachedMethods.CACHE_GET_HEAD_OPTIONS,
|
|
230
273
|
cachePolicy: aws_cloudfront_1.CachePolicy.CACHING_OPTIMIZED,
|
|
@@ -233,6 +276,20 @@ class NextjsDistribution extends constructs_1.Construct {
|
|
|
233
276
|
viewerProtocolPolicy: aws_cloudfront_1.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
|
|
234
277
|
...staticBehaviorOptions,
|
|
235
278
|
};
|
|
279
|
+
if (this.viewerRequestCode === undefined) {
|
|
280
|
+
return options;
|
|
281
|
+
}
|
|
282
|
+
this.assertViewerRequestUnclaimed("staticBehaviorOptions", staticBehaviorOptions?.functionAssociations, "`viewerRequestFunctionCode` needs that event type on the static behaviors");
|
|
283
|
+
return {
|
|
284
|
+
...options,
|
|
285
|
+
functionAssociations: [
|
|
286
|
+
...(staticBehaviorOptions?.functionAssociations ?? []),
|
|
287
|
+
{
|
|
288
|
+
eventType: aws_cloudfront_1.FunctionEventType.VIEWER_REQUEST,
|
|
289
|
+
function: this.getPassThroughFunction(),
|
|
290
|
+
},
|
|
291
|
+
],
|
|
292
|
+
};
|
|
236
293
|
}
|
|
237
294
|
createDynamicBehaviorOptions() {
|
|
238
295
|
const dynamicBehaviorOptions = this.props.overrides?.dynamicBehaviorOptions;
|
|
@@ -271,7 +328,8 @@ class NextjsDistribution extends constructs_1.Construct {
|
|
|
271
328
|
}
|
|
272
329
|
/**
|
|
273
330
|
* The behavior's function associations: an override's, plus the viewer-request
|
|
274
|
-
* function Global Functions depends on
|
|
331
|
+
* function Global Functions depends on, or the one `viewerRequestFunctionCode`
|
|
332
|
+
* adds on Global Containers.
|
|
275
333
|
*
|
|
276
334
|
* Spreading the override's `functionAssociations` over ours would silently
|
|
277
335
|
* drop that function, and with it the only thing standing between a viewer's
|
|
@@ -282,25 +340,21 @@ class NextjsDistribution extends constructs_1.Construct {
|
|
|
282
340
|
* allows only one of per behavior — is an error rather than a replacement.
|
|
283
341
|
*/
|
|
284
342
|
withDynamicFunctionAssociations(overrideName, overridden) {
|
|
343
|
+
const ours = this.dynamicCloudFrontFunctionAssociations;
|
|
285
344
|
if (!overridden) {
|
|
286
|
-
return
|
|
345
|
+
return ours;
|
|
287
346
|
}
|
|
288
|
-
if (!
|
|
347
|
+
if (!ours.length) {
|
|
289
348
|
return overridden;
|
|
290
349
|
}
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
`
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
`CloudFront permits only one function per event type per behavior. ` +
|
|
300
|
-
`Move the logic to ${aws_cloudfront_1.FunctionEventType.VIEWER_RESPONSE}, or into ` +
|
|
301
|
-
`the app's middleware.`);
|
|
302
|
-
}
|
|
303
|
-
return [...overridden, ...this.dynamicCloudFrontFunctionAssociations];
|
|
350
|
+
this.assertViewerRequestUnclaimed(overrideName, overridden, this.isFunctionCompute
|
|
351
|
+
? `NextjsGlobalFunctions needs that event type for its own function, ` +
|
|
352
|
+
`which overwrites \`x-forwarded-host\` with the viewer's \`Host\` ` +
|
|
353
|
+
`(the runtime trusts that header behind CloudFront) and redirects ` +
|
|
354
|
+
`repeated slashes`
|
|
355
|
+
: "`viewerRequestFunctionCode` needs that event type on the dynamic " +
|
|
356
|
+
"and image behaviors");
|
|
357
|
+
return [...overridden, ...ours];
|
|
304
358
|
}
|
|
305
359
|
/**
|
|
306
360
|
* `_next/image*` goes to the same origin as everything else — the Next.js
|
|
@@ -353,6 +407,17 @@ class NextjsDistribution extends constructs_1.Construct {
|
|
|
353
407
|
distribution = this.props.distribution;
|
|
354
408
|
}
|
|
355
409
|
else {
|
|
410
|
+
// Under a `basePath`, the behaviors cdk-nextjs adds for it serve the
|
|
411
|
+
// app, so the default behavior is the user's to replace.
|
|
412
|
+
if (this.viewerRequestCode !== undefined &&
|
|
413
|
+
!this.basePath &&
|
|
414
|
+
this.props.overrides?.distributionProps?.defaultBehavior) {
|
|
415
|
+
throw new Error(`${constants_1.LOG_PREFIX} \`overrides.distributionProps.defaultBehavior\` ` +
|
|
416
|
+
`replaces the default behavior cdk-nextjs builds, and with it the ` +
|
|
417
|
+
`viewer-request function \`viewerRequestFunctionCode\` runs in, ` +
|
|
418
|
+
`so pages and API routes would skip it. Customize the default ` +
|
|
419
|
+
`behavior through \`overrides.dynamicBehaviorOptions\` instead.`);
|
|
420
|
+
}
|
|
356
421
|
distribution = new aws_cloudfront_1.Distribution(this, "Distribution", {
|
|
357
422
|
minimumProtocolVersion: aws_cloudfront_1.SecurityPolicyProtocol.TLS_V1_2_2021,
|
|
358
423
|
defaultBehavior: this.dynamicBehaviorOptions,
|
|
@@ -488,41 +553,79 @@ class NextjsDistribution extends constructs_1.Construct {
|
|
|
488
553
|
* parse.
|
|
489
554
|
*/
|
|
490
555
|
addAssetPrefixBehavior() {
|
|
491
|
-
//
|
|
492
|
-
//
|
|
493
|
-
//
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
if (claimed) {
|
|
498
|
-
throw new Error(`${constants_1.LOG_PREFIX} \`overrides.staticBehaviorOptions.functionAssociations\` ` +
|
|
499
|
-
`already associates a CloudFront function with ` +
|
|
500
|
-
`${aws_cloudfront_1.FunctionEventType.VIEWER_REQUEST}, but serving \`assetPrefix\` ` +
|
|
501
|
-
`("${this.assetPrefix}") needs that event type to rewrite the request ` +
|
|
502
|
-
`URI to the object's key, and CloudFront permits only one function per ` +
|
|
503
|
-
`event type per behavior. Either drop the override, or fold its logic ` +
|
|
504
|
-
`into a single function and set \`assetPrefix\` to "" so this ` +
|
|
505
|
-
`construct adds no behavior of its own.`);
|
|
506
|
-
}
|
|
556
|
+
// The static behaviors' own viewer-request function, when
|
|
557
|
+
// `viewerRequestFunctionCode` added one, gives way to the rewrite, which
|
|
558
|
+
// runs the same code first.
|
|
559
|
+
const associations = (this.staticBehaviorOptions.functionAssociations ?? []).filter((association) => association.function !== this.passThroughFunction);
|
|
560
|
+
this.assertViewerRequestUnclaimed("staticBehaviorOptions", associations, `serving \`assetPrefix\` ("${this.assetPrefix}") needs that event type ` +
|
|
561
|
+
`to rewrite the request URI to the object's key`);
|
|
507
562
|
const rewrite = new aws_cloudfront_1.Function(this, "AssetPrefixFn", {
|
|
508
563
|
comment: this.getComment("NextJS assetPrefix rewrite", aws_cdk_lib_1.Stack.of(this).stackName),
|
|
509
|
-
|
|
510
|
-
function handler(event) {
|
|
511
|
-
var request = event.request;
|
|
512
|
-
request.uri = ${JSON.stringify(this.basePath ? `/${this.basePath}` : "")} + request.uri.slice(${this.assetPrefix.length});
|
|
513
|
-
return request;
|
|
514
|
-
}
|
|
515
|
-
`),
|
|
564
|
+
...this.viewerRequestFunctionProps((0, viewer_request_functions_1.assetPrefixRewriteHandler)(this.basePath, this.assetPrefix)),
|
|
516
565
|
});
|
|
517
566
|
this.distribution.addBehavior(`${this.assetPrefix}/_next/static*`, this.staticOrigin, {
|
|
518
567
|
...this.staticBehaviorOptions,
|
|
519
568
|
functionAssociations: [
|
|
520
|
-
...
|
|
569
|
+
...associations,
|
|
521
570
|
{ eventType: aws_cloudfront_1.FunctionEventType.VIEWER_REQUEST, function: rewrite },
|
|
522
571
|
],
|
|
523
572
|
});
|
|
524
573
|
}
|
|
574
|
+
/**
|
|
575
|
+
* Serves `_next/static/service-worker/*` with `Service-Worker-Allowed`, which
|
|
576
|
+
* the browser requires before it registers a service worker at a scope above
|
|
577
|
+
* the script's own directory. Added ahead of `_next/static*`, which would
|
|
578
|
+
* otherwise match first.
|
|
579
|
+
*
|
|
580
|
+
* The policy is the static one plus the header, so security headers and any
|
|
581
|
+
* `staticResponseHeadersPolicyProps` still apply. A whole
|
|
582
|
+
* `staticBehaviorOptions.responseHeadersPolicy` can't be added to, so it is
|
|
583
|
+
* used as it is, with a warning.
|
|
584
|
+
*/
|
|
585
|
+
addServiceWorkerBehavior(serviceWorkerAllowed) {
|
|
586
|
+
const overridden = this.props.overrides?.staticBehaviorOptions?.responseHeadersPolicy;
|
|
587
|
+
if (overridden) {
|
|
588
|
+
aws_cdk_lib_1.Annotations.of(this).addWarning(`${constants_1.LOG_PREFIX} \`overrides.staticBehaviorOptions.responseHeadersPolicy\` ` +
|
|
589
|
+
`is used for \`_next/static/service-worker/*\` too, so service ` +
|
|
590
|
+
`workers get no \`Service-Worker-Allowed: ${serviceWorkerAllowed}\` ` +
|
|
591
|
+
`unless that policy sends it, and registering one at a scope above ` +
|
|
592
|
+
`its own directory fails. Add the header to your policy, or set ` +
|
|
593
|
+
`\`overrides.staticResponseHeadersPolicyProps\` instead.`);
|
|
594
|
+
}
|
|
595
|
+
const props = this.props.overrides?.staticResponseHeadersPolicyProps;
|
|
596
|
+
const customHeaders = props?.customHeadersBehavior?.customHeaders ?? [];
|
|
597
|
+
const responseHeadersPolicy = overridden ??
|
|
598
|
+
new aws_cloudfront_1.ResponseHeadersPolicy(this, "ServiceWorkerResponseHeadersPolicy", {
|
|
599
|
+
securityHeadersBehavior: this.commonSecurityHeadersBehavior,
|
|
600
|
+
comment: this.getComment("NextJS Service Worker Response Headers Policy", aws_cdk_lib_1.Stack.of(this).stackName),
|
|
601
|
+
...props,
|
|
602
|
+
// Policy names are unique per account, so the static policy's can't be
|
|
603
|
+
// reused as it is, and are at most 128 characters, so a suffix can't
|
|
604
|
+
// simply be added to one that is already that long.
|
|
605
|
+
responseHeadersPolicyName: props?.responseHeadersPolicyName &&
|
|
606
|
+
`${aws_cdk_lib_1.Token.isUnresolved(props.responseHeadersPolicyName)
|
|
607
|
+
? props.responseHeadersPolicyName
|
|
608
|
+
: props.responseHeadersPolicyName.slice(0, MAX_POLICY_NAME_LENGTH - SERVICE_WORKER_SUFFIX.length)}${SERVICE_WORKER_SUFFIX}`,
|
|
609
|
+
customHeadersBehavior: {
|
|
610
|
+
// One the override sets itself is kept.
|
|
611
|
+
customHeaders: customHeaders.some(({ header }) => header.toLowerCase() === "service-worker-allowed")
|
|
612
|
+
? customHeaders
|
|
613
|
+
: [
|
|
614
|
+
...customHeaders,
|
|
615
|
+
{
|
|
616
|
+
header: "Service-Worker-Allowed",
|
|
617
|
+
value: serviceWorkerAllowed,
|
|
618
|
+
override: true,
|
|
619
|
+
},
|
|
620
|
+
],
|
|
621
|
+
},
|
|
622
|
+
});
|
|
623
|
+
this.distribution.addBehavior(this.getPathPattern("_next/static/service-worker/*"), this.staticOrigin, { ...this.staticBehaviorOptions, responseHeadersPolicy });
|
|
624
|
+
}
|
|
525
625
|
addStaticBehaviors() {
|
|
626
|
+
if (this.props.serviceWorkerAllowed !== undefined) {
|
|
627
|
+
this.addServiceWorkerBehavior(this.props.serviceWorkerAllowed);
|
|
628
|
+
}
|
|
526
629
|
this.distribution.addBehavior(this.getPathPattern("_next/static*"), this.staticOrigin, this.staticBehaviorOptions);
|
|
527
630
|
if (this.assetPrefix) {
|
|
528
631
|
this.addAssetPrefixBehavior();
|
|
@@ -641,11 +744,15 @@ class NextjsDistribution extends constructs_1.Construct {
|
|
|
641
744
|
const groupPatterns = this.functionGroupBehaviors().length;
|
|
642
745
|
// The default behavior, `_next/image*`, `_next/static*`, plus — with a
|
|
643
746
|
// basePath — the two that stand in for the default behavior's coverage, and
|
|
644
|
-
// — with a path-style assetPrefix — the one that serves bundles under it
|
|
747
|
+
// — with a path-style assetPrefix — the one that serves bundles under it,
|
|
748
|
+
// and — with service workers — the one that adds `Service-Worker-Allowed`.
|
|
645
749
|
// `this.basePath`, not the raw prop: `basePath: "/"` normalizes to `""` and
|
|
646
750
|
// adds no behaviors, so counting it added 2 to the total and could throw
|
|
647
751
|
// "over the limit" on an app that is under it.
|
|
648
|
-
const fixed = 3 +
|
|
752
|
+
const fixed = 3 +
|
|
753
|
+
(this.basePath ? 2 : 0) +
|
|
754
|
+
(this.assetPrefix ? 1 : 0) +
|
|
755
|
+
(this.props.serviceWorkerAllowed !== undefined ? 1 : 0);
|
|
649
756
|
const total = fixed + publicPatterns + groupPatterns;
|
|
650
757
|
if (total <= limit) {
|
|
651
758
|
return;
|
|
@@ -762,6 +869,13 @@ const DEFAULT_MAX_CACHE_BEHAVIORS = 75;
|
|
|
762
869
|
function isPathPatternChar(char) {
|
|
763
870
|
return char === "*" || char === "?" || function_groups_1.PATH_PATTERN_LITERAL.test(char);
|
|
764
871
|
}
|
|
872
|
+
/**
|
|
873
|
+
* CloudFront's limit on a response headers policy name, and the suffix that
|
|
874
|
+
* tells the service worker policy's apart from the static one's.
|
|
875
|
+
* @see https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ResponseHeadersPolicyConfig.html
|
|
876
|
+
*/
|
|
877
|
+
const MAX_POLICY_NAME_LENGTH = 128;
|
|
878
|
+
const SERVICE_WORKER_SUFFIX = "-sw";
|
|
765
879
|
/** CloudFront's path pattern length limit. */
|
|
766
880
|
const MAX_PATH_PATTERN_LENGTH = 255;
|
|
767
881
|
/**
|
|
@@ -789,4 +903,4 @@ function toPathPattern(name) {
|
|
|
789
903
|
: "?".repeat(Buffer.byteLength(char, "utf8")))
|
|
790
904
|
.join("");
|
|
791
905
|
}
|
|
792
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWRpc3RyaWJ1dGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtZGlzdHJpYnV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBa0U7QUFFbEUsK0RBNEJvQztBQUNwQywrRUFNNEM7QUFFNUMsdURBQXFFO0FBRXJFLDJDQUF1QztBQUN2QywrREFJbUM7QUFDbkMsMkNBQXFEO0FBT3JELGlEQUF1RTtBQXdHdkUsTUFBYSxrQkFBbUIsU0FBUSxzQkFBUzs7SUFDL0MsWUFBWSxDQUFlO0lBRW5CLEtBQUssQ0FBMEI7SUFDdkM7Ozs7O09BS0c7SUFDSyxRQUFRLENBQVM7SUFDekI7Ozs7O09BS0c7SUFDSyxXQUFXLENBQVM7SUFDNUI7OztPQUdHO0lBQ0ssNkJBQTZCLEdBQW9DO1FBQ3ZFLGtCQUFrQixFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtRQUN2QyxZQUFZLEVBQUU7WUFDWixXQUFXLEVBQUUsbUNBQWtCLENBQUMsVUFBVTtZQUMxQyxRQUFRLEVBQUUsS0FBSztTQUNoQjtRQUNELGNBQWMsRUFBRTtZQUNkLFFBQVEsRUFBRSxLQUFLO1lBQ2YsY0FBYyxFQUFFLHNDQUFxQixDQUFDLCtCQUErQjtTQUN0RTtRQUVELHVCQUF1QixFQUFFO1lBQ3ZCLG1CQUFtQixFQUFFLHNCQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUN2QyxpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsT0FBTyxFQUFFLElBQUk7U0FDZDtRQUNELGFBQWEsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO0tBQ3RFLENBQUM7SUFDTSxZQUFZLENBQVU7SUFDdEIsYUFBYSxDQUFVO0lBQ3ZCLDJCQUEyQixDQUF1QjtJQUNsRCxxQ0FBcUMsQ0FBd0I7SUFDN0QsaUJBQWlCLENBQVU7SUFD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SUFBSSxFQUFFO0lBQzFDLGNBQWMsRUFBRSxvQ0FBbUIsQ0FBQyxJQUFJLEVBQUU7SUFDMUMsMEJBQTBCLEVBQUUsS0FBSztJQUNqQyx3QkFBd0IsRUFBRSxLQUFLO0NBQ2hDLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0FBRXZDOzs7R0FHRztBQUNILFNBQVMsaUJBQWlCLENBQUMsSUFBWTtJQUNyQyxPQUFPLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSSxzQ0FBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUNELDhDQUE4QztBQUM5QyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUVwQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxJQUFZO0lBQ2pDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztTQUNiLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ1osaUJBQWlCLENBQUMsSUFBSSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxJQUFJO1FBQ04sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FDaEQ7U0FDQSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbnMsIER1cmF0aW9uLCBTdGFjaywgVG9rZW4gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IElDZXJ0aWZpY2F0ZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBBY2Nlc3NMZXZlbCxcbiAgQWRkQmVoYXZpb3JPcHRpb25zLFxuICBBbGxvd2VkTWV0aG9kcyxcbiAgQmVoYXZpb3JPcHRpb25zLFxuICBDYWNoZUNvb2tpZUJlaGF2aW9yLFxuICBDYWNoZUhlYWRlckJlaGF2aW9yLFxuICBDYWNoZVBvbGljeSxcbiAgQ2FjaGVQb2xpY3lQcm9wcyxcbiAgQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLFxuICBDYWNoZWRNZXRob2RzLFxuICBGdW5jdGlvbiBhcyBDbG91ZEZyb250RnVuY3Rpb24sXG4gIERpc3RyaWJ1dGlvbixcbiAgRnVuY3Rpb25Bc3NvY2lhdGlvbixcbiAgRnVuY3Rpb25Db2RlLFxuICBGdW5jdGlvbkV2ZW50VHlwZSxcbiAgSGVhZGVyc0ZyYW1lT3B0aW9uLFxuICBIZWFkZXJzUmVmZXJyZXJQb2xpY3ksXG4gIEh0dHBWZXJzaW9uLFxuICBJT3JpZ2luLFxuICBJT3JpZ2luUmVxdWVzdFBvbGljeSxcbiAgT3JpZ2luUHJvdG9jb2xQb2xpY3ksXG4gIE9yaWdpblJlcXVlc3RQb2xpY3ksXG4gIFJlc3BvbnNlSGVhZGVyc1BvbGljeSxcbiAgUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHMsXG4gIFJlc3BvbnNlU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IsXG4gIFNlY3VyaXR5UG9saWN5UHJvdG9jb2wsXG4gIFZpZXdlclByb3RvY29sUG9saWN5LFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnRcIjtcbmltcG9ydCB7XG4gIEZ1bmN0aW9uVXJsT3JpZ2luLFxuICBGdW5jdGlvblVybE9yaWdpbldpdGhPQUNQcm9wcyxcbiAgUzNCdWNrZXRPcmlnaW4sXG4gIFZwY09yaWdpbixcbiAgVnBjT3JpZ2luV2l0aEVuZHBvaW50UHJvcHMsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zXCI7XG5pbXBvcnQgeyBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjJcIjtcbmltcG9ydCB7IENmblBlcm1pc3Npb24sIElGdW5jdGlvblVybCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBJQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIGNsb3VkRnJvbnRQYXR0ZXJuUmVnZXgsXG4gIERFRkFVTFRfRlVOQ1RJT05fR1JPVVAsXG4gIFBBVEhfUEFUVEVSTl9MSVRFUkFMLFxufSBmcm9tIFwiLi9hZGFwdGVyL2Z1bmN0aW9uLWdyb3Vwc1wiO1xuaW1wb3J0IHsgTE9HX1BSRUZJWCwgTmV4dGpzVHlwZSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxEaXN0cmlidXRpb25Qcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsRGlzdHJpYnV0aW9uUHJvcHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsUzNPcmlnaW5CdWNrZXRXaXRoT0FDUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbFMzT3JpZ2luQnVja2V0V2l0aE9BQ1Byb3BzXCI7XG5pbXBvcnQge1xuICBOZXh0anNGdW5jdGlvbkdyb3VwQmVoYXZpb3IsXG4gIFB1YmxpY0RpckVudHJ5LFxufSBmcm9tIFwiLi9uZXh0anMtYnVpbGQvbmV4dGpzLWJ1aWxkXCI7XG5pbXBvcnQgeyBhc3NldFByZWZpeFBhdGgsIG5vcm1hbGl6ZUJhc2VQYXRoIH0gZnJvbSBcIi4vdXRpbHMvYmFzZS1wYXRoXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGlzdHJpYnV0aW9uT3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgZGlzdHJpYnV0aW9uUHJvcHM/OiBPcHRpb25hbERpc3RyaWJ1dGlvblByb3BzO1xuICByZWFkb25seSBpbWFnZUJlaGF2aW9yT3B0aW9ucz86IEFkZEJlaGF2aW9yT3B0aW9ucztcbiAgcmVhZG9ubHkgaW1hZ2VDYWNoZVBvbGljeVByb3BzPzogQ2FjaGVQb2xpY3lQcm9wcztcbiAgcmVhZG9ubHkgaW1hZ2VSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcz86IFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzO1xuICByZWFkb25seSBkeW5hbWljQmVoYXZpb3JPcHRpb25zPzogQWRkQmVoYXZpb3JPcHRpb25zO1xuICByZWFkb25seSBkeW5hbWljQ2FjaGVQb2xpY3lQcm9wcz86IENhY2hlUG9saWN5UHJvcHM7XG4gIHJlYWRvbmx5IGR5bmFtaWNSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcz86IFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzO1xuICByZWFkb25seSBkeW5hbWljRnVuY3Rpb25VcmxPcmlnaW5XaXRoT0FDUHJvcHM/OiBGdW5jdGlvblVybE9yaWdpbldpdGhPQUNQcm9wcztcbiAgcmVhZG9ubHkgZHluYW1pY1ZwY09yaWdpbldpdGhFbmRwb2ludFByb3BzPzogVnBjT3JpZ2luV2l0aEVuZHBvaW50UHJvcHM7XG4gIHJlYWRvbmx5IHN0YXRpY0JlaGF2aW9yT3B0aW9ucz86IEFkZEJlaGF2aW9yT3B0aW9ucztcbiAgcmVhZG9ubHkgc3RhdGljUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHM/OiBSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcztcbiAgcmVhZG9ubHkgczNCdWNrZXRPcmlnaW5Qcm9wcz86IE9wdGlvbmFsUzNPcmlnaW5CdWNrZXRXaXRoT0FDUHJvcHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHMge1xuICAvKipcbiAgICogQnVja2V0IGNvbnRhaW5pbmcgc3RhdGljIGFzc2V0cy5cbiAgICogTXVzdCBiZSBwcm92aWRlZCBpZiB5b3Ugd2FudCB0byBzZXJ2ZSBzdGF0aWMgZmlsZXMuXG4gICAqL1xuICByZWFkb25seSBhc3NldHNCdWNrZXQ6IElCdWNrZXQ7XG4gIC8qKlxuICAgKiBUaGUgYXBwJ3Mgb3duIGBhc3NldFByZWZpeGAuIE5leHQuanMgZW1pdHMgYDxhc3NldFByZWZpeD4vX25leHQvc3RhdGljLy4uLmBcbiAgICogZm9yIGV2ZXJ5IGJ1bmRsZSB3aGlsZSB0aGUgb2JqZWN0cyBzdGF5IGF0IGA8YmFzZVBhdGg+L19uZXh0L3N0YXRpYy8uLi5gIGluXG4gICAqIFMzLCBzbyB0aGUgcHJlZml4J3MgcGF0aCBnZXRzIGEgY2FjaGUgYmVoYXZpb3Igb2YgaXRzIG93biB0aGF0IHJld3JpdGVzIGl0XG4gICAqIGF3YXkuXG4gICAqXG4gICAqIEVpdGhlciBmb3JtIGlzIGFjY2VwdGVkOiBhIHBhdGggKFwiL2NkblwiKSwgb3IgYW4gYWJzb2x1dGUgVVJMLCBpbiB3aGljaCBjYXNlXG4gICAqIG9ubHkgaXRzIHBhdGggY291bnRzIChcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2NkblwiIGJlaGF2ZXMgYXMgXCIvY2RuXCIsIGFuZFxuICAgKiBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tXCIgbmVlZHMgbm8gYmVoYXZpb3IgYXQgYWxsKS4gQW4gYWJzb2x1dGUgcHJlZml4J3MgcGF0aFxuICAgKiBtYXR0ZXJzIGJlY2F1c2UgYG5leHQgYnVpbGRgIGNvbXBpbGVzIGEgYC9jZG4vX25leHQvOnBhdGgrYCByZXdyaXRlIG9mIGl0c1xuICAgKiBvd24sIHNvIGBuZXh0IHN0YXJ0YCBzZXJ2ZXMgZXZlcnkgYnVuZGxlIHVuZGVyIGl0IOKAlCBhIENETiBmcm9udGluZyB0aGlzXG4gICAqIGRpc3RyaWJ1dGlvbiB0aGVyZSBoYXMgdG8gYmUgYW5zd2VyZWQgdG9vLlxuICAgKlxuICAgKiBBcHBsaWVkIG9uIHRvcCBvZiBgYmFzZVBhdGhgLCBub3QgdW5kZXIgaXQsIGJlY2F1c2UgdGhhdCBpcyBob3cgTmV4dC5qc1xuICAgKiBidWlsZHMgdGhlIFVSTC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lOyBwYXNzIGBOZXh0anNCdWlsZC5uZXh0Q29uZmlnQXNzZXRQcmVmaXhQYXRoYFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXRQcmVmaXg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBVUkkgcGF0aCBwcmVmaXggdGhlIGFwcCBpcyBzZXJ2ZWQgYXQuIFN1cnJvdW5kaW5nIHNsYXNoZXMgYXJlIG5vcm1hbGl6ZWRcbiAgICogYXdheSwgc28gXCIvYmFzZVwiLCBcImJhc2VcIiBhbmQgXCIvYmFzZS9cIiBhbGwgcHJvZHVjZSB0aGUgc2FtZSBjYWNoZSBiZWhhdmlvcnMuXG4gICAqL1xuICByZWFkb25seSBiYXNlUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGJ1dCBvbmx5IGFwcGxpY2FibGUgZm9yIGBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTYFxuICAgKi9cbiAgcmVhZG9ubHkgY2VydGlmaWNhdGU/OiBJQ2VydGlmaWNhdGU7XG4gIHJlYWRvbmx5IGRpc3RyaWJ1dGlvbj86IERpc3RyaWJ1dGlvbjtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGlmIGBOZXh0anNUeXBlLkdMT0JBTF9GVU5DVElPTlNgXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvblVybD86IElGdW5jdGlvblVybDtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGlmIGBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTYCBvciBgTmV4dGpzVHlwZS5SRUdJT05BTF9DT05UQUlORVJTYFxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZEJhbGFuY2VyPzogSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyO1xuICByZWFkb25seSBuZXh0anNUeXBlOiBOZXh0anNUeXBlO1xuICAvKipcbiAgICogT3ZlcnJpZGUgcHJvcHMgZm9yIGV2ZXJ5IGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc0Rpc3RyaWJ1dGlvbk92ZXJyaWRlcztcbiAgLyoqXG4gICAqIEVudHJpZXMgKGZpbGVzL2RpcmVjdG9yaWVzKSB3aXRoaW4gTmV4dC5qcyBhcHAncyBwdWJsaWMgZGlyZWN0b3J5LiBVc2VkIHRvXG4gICAqIGFkZCBzdGF0aWMgYmVoYXZpb3JzIHRvIGRpc3RyaWJ1dGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpY0RpckVudHJpZXM6IFB1YmxpY0RpckVudHJ5W107XG4gIC8qKlxuICAgKiBUaGUgbm9uLWBkZWZhdWx0YCBmdW5jdGlvbiBncm91cHMsIHRoZSBvcmlnaW5zXG4gICAqIHtAbGluayBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzfSByb3V0ZSB0by5cbiAgICogQGRlZmF1bHQgLSBubyBzcGxpdHRpbmc7IHRoZSBkZWZhdWx0IGJlaGF2aW9yIHNlcnZlcyBldmVyeSBkeW5hbWljIHJvdXRlXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkdyb3Vwcz86IE5leHRqc0Rpc3RyaWJ1dGlvbkZ1bmN0aW9uR3JvdXBbXTtcbiAgLyoqXG4gICAqIGBOZXh0anNCdWlsZC5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzYDogb25lIGNhY2hlIGJlaGF2aW9yIGVhY2gsIGFkZGVkIGluXG4gICAqIG9yZGVyLCBzbyB0aGUgcm91dGVzIGVhY2ggZ3JvdXAgd2FzIHBhY2thZ2VkIHdpdGggcmVhY2ggaXQgcmF0aGVyIHRoYW4gdGhlXG4gICAqIGRlZmF1bHQgZnVuY3Rpb24uXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycz86IE5leHRqc0Z1bmN0aW9uR3JvdXBCZWhhdmlvcltdO1xuICAvKipcbiAgICogVGhlIG1vc3QgY2FjaGUgYmVoYXZpb3JzIHRoZSBkaXN0cmlidXRpb24gbWF5IGhhdmUsIHRoZSBkZWZhdWx0IG9uZVxuICAgKiBpbmNsdWRlZC4gY2RrLW5leHRqcyBjb3VudHMgd2hhdCBpdCBhZGRzIGFnYWluc3QgdGhpcyBhdCBzeW50aCwgc28gcnVubmluZ1xuICAgKiBvdXQgaXMgYSBzeW50aCBlcnJvciBuYW1pbmcgd2hhdCB1c2VkIHRoZW0gcmF0aGVyIHRoYW4gYSBmYWlsZWQgZGVwbG95LlxuICAgKlxuICAgKiBSYWlzZSBpdCBhZnRlciByYWlzaW5nIHRoZSBcIkNhY2hlIGJlaGF2aW9ycyBwZXIgZGlzdHJpYnV0aW9uXCIgcXVvdGEgZm9yXG4gICAqIHlvdXIgYWNjb3VudC4gTG93ZXIgaXQgYnkgdGhlIGJlaGF2aW9ycyBhIHN1cHBsaWVkIHtAbGluayBkaXN0cmlidXRpb259XG4gICAqIChvciBgb3ZlcnJpZGVzLmRpc3RyaWJ1dGlvblByb3BzYCkgYWxyZWFkeSBoYXMsIHdoaWNoIGFyZSBub3QgY291bnRlZC5cbiAgICogQGRlZmF1bHQgNzUgLSBDbG91ZEZyb250J3MgZGVmYXVsdCBxdW90YVxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jbG91ZGZyb250LWxpbWl0cy5odG1sI2xpbWl0cy13ZWItZGlzdHJpYnV0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4Q2FjaGVCZWhhdmlvcnM/OiBudW1iZXI7XG59XG5cbi8qKiBBIG5vbi1kZWZhdWx0IGZ1bmN0aW9uIGdyb3VwIGFuZCB0aGUgb3JpZ2luIGl0cyByb3V0ZXMgbXVzdCByZWFjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGlzdHJpYnV0aW9uRnVuY3Rpb25Hcm91cCB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqIFRoZSBncm91cCdzIExhbWJkYSBGdW5jdGlvbiBVUkwuICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uVXJsOiBJRnVuY3Rpb25Vcmw7XG59XG5cbmV4cG9ydCBjbGFzcyBOZXh0anNEaXN0cmlidXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBkaXN0cmlidXRpb246IERpc3RyaWJ1dGlvbjtcblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNEaXN0cmlidXRpb25Qcm9wcztcbiAgLyoqXG4gICAqIGBwcm9wcy5iYXNlUGF0aGAgbm9ybWFsaXplZCB0byBhIGJhcmUgcGF0aCBzZWdtZW50LiBUaGlzIGNvbnN0cnVjdCBpcyB0aGVcbiAgICogb25lIHBsYWNlIHRoYXQgbmVlZHMgaXQgd2l0aCBhIGxlYWRpbmcgc2xhc2gg4oCUIENsb3VkRnJvbnQgcGF0aCBwYXR0ZXJucyBhcmVcbiAgICogd3JpdHRlbiBhZ2FpbnN0IHRoZSByZXF1ZXN0IHBhdGgg4oCUIHNvIGl0IHByZXBlbmRzIGl0cyBvd24gcmF0aGVyIHRoYW5cbiAgICogcmVseWluZyBvbiB0aGUgY2FsbGVyIGhhdmluZyBwYXNzZWQgb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlUGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogYHByb3BzLmFzc2V0UHJlZml4YCBub3JtYWxpemVkIHRvIGEgbGVhZGluZy1zbGFzaCBwYXRoLCBgXCJcImAgd2hlbiB0aGUgYXBwXG4gICAqIHNldHMgbm9uZSBvciBzZXRzIG9uZSB0aGF0IGFscmVhZHkgZXF1YWxzIHRoZSBgYmFzZVBhdGhgIHByZWZpeCDigJQgaW4gd2hpY2hcbiAgICogY2FzZSB0aGUgb3JkaW5hcnkgYF9uZXh0L3N0YXRpYypgIGJlaGF2aW9yIGFscmVhZHkgY292ZXJzIGl0IGFuZCBhIHNlY29uZCBvbmVcbiAgICogd291bGQgYmUgYSBkdXBsaWNhdGUgcGF0dGVybiBDbG91ZEZyb250IHJlamVjdHMuXG4gICAqL1xuICBwcml2YXRlIGFzc2V0UHJlZml4OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb21tb24gc2VjdXJpdHkgaGVhZGVycyBhcHBsaWVkIGJ5IGRlZmF1bHQgdG8gYWxsIG9yaWdpbnNcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1yZXNwb25zZS1oZWFkZXJzLXBvbGljaWVzLmh0bWwjbWFuYWdlZC1yZXNwb25zZS1oZWFkZXJzLXBvbGljaWVzLXNlY3VyaXR5XG4gICAqL1xuICBwcml2YXRlIGNvbW1vblNlY3VyaXR5SGVhZGVyc0JlaGF2aW9yOiBSZXNwb25zZVNlY3VyaXR5SGVhZGVyc0JlaGF2aW9yID0ge1xuICAgIGNvbnRlbnRUeXBlT3B0aW9uczogeyBvdmVycmlkZTogZmFsc2UgfSxcbiAgICBmcmFtZU9wdGlvbnM6IHtcbiAgICAgIGZyYW1lT3B0aW9uOiBIZWFkZXJzRnJhbWVPcHRpb24uU0FNRU9SSUdJTixcbiAgICAgIG92ZXJyaWRlOiBmYWxzZSxcbiAgICB9LFxuICAgIHJlZmVycmVyUG9saWN5OiB7XG4gICAgICBvdmVycmlkZTogZmFsc2UsXG4gICAgICByZWZlcnJlclBvbGljeTogSGVhZGVyc1JlZmVycmVyUG9saWN5LlNUUklDVF9PUklHSU5fV0hFTl9DUk9TU19PUklHSU4sXG4gICAgfSxcblxuICAgIHN0cmljdFRyYW5zcG9ydFNlY3VyaXR5OiB7XG4gICAgICBhY2Nlc3NDb250cm9sTWF4QWdlOiBEdXJhdGlvbi5kYXlzKDM2NSksXG4gICAgICBpbmNsdWRlU3ViZG9tYWluczogdHJ1ZSxcbiAgICAgIG92ZXJyaWRlOiBmYWxzZSxcbiAgICAgIHByZWxvYWQ6IHRydWUsXG4gICAgfSxcbiAgICB4c3NQcm90ZWN0aW9uOiB7IG92ZXJyaWRlOiBmYWxzZSwgcHJvdGVjdGlvbjogdHJ1ZSwgbW9kZUJsb2NrOiB0cnVlIH0sXG4gIH07XG4gIHByaXZhdGUgc3RhdGljT3JpZ2luOiBJT3JpZ2luO1xuICBwcml2YXRlIGR5bmFtaWNPcmlnaW46IElPcmlnaW47XG4gIHByaXZhdGUgZHluYW1pY09yaWdpblJlc3BvbnNlUG9saWN5OiBJT3JpZ2luUmVxdWVzdFBvbGljeTtcbiAgcHJpdmF0ZSBkeW5hbWljQ2xvdWRGcm9udEZ1bmN0aW9uQXNzb2NpYXRpb25zOiBGdW5jdGlvbkFzc29jaWF0aW9uW107XG4gIHByaXZhdGUgaXNGdW5jdGlvbkNvbXB1dGU6IGJvb2xlYW47XG4gIHByaXZhdGUgc3RhdGljQmVoYXZpb3JPcHRpb25zOiBCZWhhdmlvck9wdGlvbnM7XG4gIHByaXZhdGUgZHluYW1pY0JlaGF2aW9yT3B0aW9uczogQmVoYXZpb3JPcHRpb25zO1xuICBwcml2YXRlIGltYWdlQmVoYXZpb3JPcHRpb25zOiBCZWhhdmlvck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5leHRqc0Rpc3RyaWJ1dGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgdGhpcy5iYXNlUGF0aCA9IG5vcm1hbGl6ZUJhc2VQYXRoKHByb3BzLmJhc2VQYXRoKTtcbiAgICB0aGlzLmFzc2V0UHJlZml4ID0gdGhpcy5yZXNvbHZlQXNzZXRQcmVmaXgoKTtcbiAgICB0aGlzLnN0YXRpY09yaWdpbiA9IHRoaXMuY3JlYXRlU3RhdGljT3JpZ2luKCk7XG4gICAgdGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZSA9IHByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUztcbiAgICB0aGlzLnZhbGlkYXRlRnVuY3Rpb25Hcm91cFByb3BzKCk7XG4gICAgdGhpcy5keW5hbWljT3JpZ2luID0gdGhpcy5jcmVhdGVEeW5hbWljT3JpZ2luKCk7XG4gICAgdGhpcy5keW5hbWljT3JpZ2luUmVzcG9uc2VQb2xpY3kgPSB0aGlzLmNyZWF0ZUR5bmFtaWNPcmlnaW5SZXF1ZXN0UG9saWN5KCk7XG4gICAgdGhpcy5keW5hbWljQ2xvdWRGcm9udEZ1bmN0aW9uQXNzb2NpYXRpb25zID1cbiAgICAgIHRoaXMuY3JlYXRlRHluYW1pY0Nsb3VkRnJvbnRGdW5jdGlvbkFzc29jaWF0aW9ucygpO1xuICAgIHRoaXMuc3RhdGljQmVoYXZpb3JPcHRpb25zID0gdGhpcy5jcmVhdGVTdGF0aWNCZWhhdmlvck9wdGlvbnMoKTtcbiAgICB0aGlzLmR5bmFtaWNCZWhhdmlvck9wdGlvbnMgPSB0aGlzLmNyZWF0ZUR5bmFtaWNCZWhhdmlvck9wdGlvbnMoKTtcbiAgICB0aGlzLmltYWdlQmVoYXZpb3JPcHRpb25zID0gdGhpcy5jcmVhdGVJbWFnZUJlaGF2aW9yT3B0aW9ucygpO1xuICAgIHRoaXMuZGlzdHJpYnV0aW9uID0gdGhpcy5nZXREaXN0cmlidXRpb24oKTtcbiAgICBpZiAodGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZSkge1xuICAgICAgdGhpcy5ncmFudEludm9rZShERUZBVUxUX0ZVTkNUSU9OX0dST1VQLCBwcm9wcy5mdW5jdGlvblVybCEpO1xuICAgIH1cbiAgICB0aGlzLmFkZFN0YXRpY0JlaGF2aW9ycygpO1xuICAgIHRoaXMuYWRkRHluYW1pY0JlaGF2aW9ycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDbG91ZEZyb250IGNvbW1lbnQgdGhhdCBpcyBzYWZlIGZvciB0aGUgMTI4IGNoYXJhY3RlciBsaW1pdC5cbiAgICogSWYgdGhlIGZ1bGwgY29tbWVudCB3aXRoIHN0YWNrIG5hbWUgZXhjZWVkcyAxMjggY2hhcmFjdGVycywgcmV0dXJucyB0aGUgYmFzZSBjb21tZW50IG9ubHkuXG4gICAqIEBwYXJhbSBiYXNlQ29tbWVudCBUaGUgYmFzZSBjb21tZW50IHRleHRcbiAgICogQHBhcmFtIHN0YWNrTmFtZSBUaGUgc3RhY2sgbmFtZSB0byBhcHBlbmRcbiAgICogQHJldHVybnMgQSBjb21tZW50IHN0cmluZyB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgPCAxMjggY2hhcmFjdGVyc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb21tZW50KGJhc2VDb21tZW50OiBzdHJpbmcsIHN0YWNrTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBmdWxsQ29tbWVudCA9IGAke2Jhc2VDb21tZW50fSBmb3IgJHtzdGFja05hbWV9YDtcbiAgICByZXR1cm4gZnVsbENvbW1lbnQubGVuZ3RoIDwgMTI4ID8gZnVsbENvbW1lbnQgOiBiYXNlQ29tbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3RhdGljT3JpZ2luKCk6IElPcmlnaW4ge1xuICAgIHJldHVybiBTM0J1Y2tldE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbCh0aGlzLnByb3BzLmFzc2V0c0J1Y2tldCwge1xuICAgICAgLy8gTElTVCBsZXRzIFMzIGFuc3dlciBhIG1pc3Npbmcga2V5IHdpdGggNDA0IGluc3RlYWQgb2YgNDAzXG4gICAgICBvcmlnaW5BY2Nlc3NMZXZlbHM6IFtBY2Nlc3NMZXZlbC5SRUFELCBBY2Nlc3NMZXZlbC5MSVNUXSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5zM0J1Y2tldE9yaWdpblByb3BzLFxuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY09yaWdpbigpOiBJT3JpZ2luIHtcbiAgICBpZiAodGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZSkge1xuICAgICAgaWYgKCF0aGlzLnByb3BzLmZ1bmN0aW9uVXJsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHMuZnVuY3Rpb25VcmxcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gRnVuY3Rpb25VcmxPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0NvbnRyb2woXG4gICAgICAgIHRoaXMucHJvcHMuZnVuY3Rpb25VcmwsXG4gICAgICAgIHRoaXMucHJvcHMub3ZlcnJpZGVzPy5keW5hbWljRnVuY3Rpb25VcmxPcmlnaW5XaXRoT0FDUHJvcHMsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBsb2FkQmFsYW5jZXIgPSB0aGlzLnByb3BzLmxvYWRCYWxhbmNlcjtcbiAgICAgIGlmICghbG9hZEJhbGFuY2VyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHMubG9hZEJhbGFuY2VyXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFZwY09yaWdpbi53aXRoQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIobG9hZEJhbGFuY2VyLCB7XG4gICAgICAgIHByb3RvY29sUG9saWN5OiB0aGlzLnByb3BzLmNlcnRpZmljYXRlXG4gICAgICAgICAgPyBPcmlnaW5Qcm90b2NvbFBvbGljeS5IVFRQU19PTkxZXG4gICAgICAgICAgOiBPcmlnaW5Qcm90b2NvbFBvbGljeS5IVFRQX09OTFksXG4gICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5keW5hbWljVnBjT3JpZ2luV2l0aEVuZHBvaW50UHJvcHMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIExhbWJkYSBGdW5jdGlvbiBVUkxzIFwiZXhwZWN0IHRoZSBgSG9zdGAgaGVhZGVyIHRvIGNvbnRhaW4gdGhlIG9yaWdpbiBkb21haW5cbiAgICogbmFtZSwgbm90IHRoZSBkb21haW4gbmFtZSBvZiB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXCJcbiAgICpcbiAgICogQSBjb250YWluZXIgb3JpZ2luIGFsc28gZ2V0cyBDbG91ZEZyb250J3Mgb3duIGhlYWRlcnMsIGZvclxuICAgKiBgQ2xvdWRGcm9udC1Gb3J3YXJkZWQtUHJvdG9gOiB3aXRob3V0IGEgY2VydGlmaWNhdGUgQ2xvdWRGcm9udCByZWFjaGVzIHRoZVxuICAgKiBBTEIgb3ZlciBwbGFpbiBIVFRQLCBzbyB0aGUgQUxCJ3MgYFgtRm9yd2FyZGVkLVByb3RvYCBpcyBgaHR0cGAsIGFuZCB0aGVcbiAgICogcnVudGltZSB3b3VsZCBidWlsZCBldmVyeSBhYnNvbHV0ZSBVUkwgKGByZXF1ZXN0LnVybGAsIHRoZSBvcmlnaW4gYSBzZXJ2ZXJcbiAgICogYWN0aW9uIGlzIGZvcndhcmRlZCB0bykgYXMgYGh0dHA6Ly9gIGJlaGluZCBhIHZpZXdlciBvbiBIVFRQUy5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1vcmlnaW4tcmVxdWVzdC1wb2xpY2llcy5odG1sI21hbmFnZWQtb3JpZ2luLXJlcXVlc3QtcG9saWN5LWFsbC12aWV3ZXItZXhjZXB0LWhvc3QtaGVhZGVyXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3VzaW5nLW1hbmFnZWQtb3JpZ2luLXJlcXVlc3QtcG9saWNpZXMuaHRtbCNtYW5hZ2VkLW9yaWdpbi1yZXF1ZXN0LXBvbGljeS1hbGwtdmlld2VyLWFuZC1jbG91ZGZyb250XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUR5bmFtaWNPcmlnaW5SZXF1ZXN0UG9saWN5KCk6IElPcmlnaW5SZXF1ZXN0UG9saWN5IHtcbiAgICByZXR1cm4gdGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZVxuICAgICAgPyBPcmlnaW5SZXF1ZXN0UG9saWN5LkFMTF9WSUVXRVJfRVhDRVBUX0hPU1RfSEVBREVSXG4gICAgICA6IE9yaWdpblJlcXVlc3RQb2xpY3kuQUxMX1ZJRVdFUl9BTkRfQ0xPVURGUk9OVF8yMDIyO1xuICB9XG4gIC8qKlxuICAgKiBFbnN1cmVzIE5leHQuanMgYHJlcXVlc3QudXJsYCB3aWxsIGJlIGNvcnJlY3QgZG9tYWluIGluc3RlYWQgb2YgVVJMIG9mXG4gICAqIGNvbXB1dGUgKExhbWJkYSBvciBGYXJnYXRlKVxuICAgKiBAc2VlIGh0dHBzOi8vb3Blbi1uZXh0LmpzLm9yZy9hZHZhbmNlZC93b3JrYXJvdW5kI3dvcmthcm91bmQtc2V0LXgtZm9yd2FyZGVkLWhvc3QtaGVhZGVyLWF3cy1zcGVjaWZpY1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVEeW5hbWljQ2xvdWRGcm9udEZ1bmN0aW9uQXNzb2NpYXRpb25zKCk6IEZ1bmN0aW9uQXNzb2NpYXRpb25bXSB7XG4gICAgY29uc3QgYXNzb2NpYXRpb25zOiBGdW5jdGlvbkFzc29jaWF0aW9uW10gPSBbXTtcbiAgICBpZiAodGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZSkge1xuICAgICAgY29uc3QgY2xvdWRGcm9udEZuID0gbmV3IENsb3VkRnJvbnRGdW5jdGlvbih0aGlzLCBcIkNsb3VkRnJvbnRGblwiLCB7XG4gICAgICAgIC8vIGNsb3VkZnJvbnQtanMtMS4wLCBzbyBFUzUuMTogYHZhcmAsIG5vIGFycm93IGZ1bmN0aW9ucywgbm8gdGVtcGxhdGVcbiAgICAgICAgLy8gbGl0ZXJhbHMsIG5vIGBPYmplY3Qua2V5c2AuXG4gICAgICAgIGNvZGU6IEZ1bmN0aW9uQ29kZS5mcm9tSW5saW5lKGBcbiAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdCA9IGV2ZW50LnJlcXVlc3Q7XG4gICAgICAgICAgICB2YXIgdXJpID0gcmVxdWVzdC51cmk7XG5cbiAgICAgICAgICAgIC8vIE5leHQuanMgYW5zd2VycyBhbnkgcGF0aCBjb250YWluaW5nIGEgYmFja3NsYXNoIG9yIGEgcmVwZWF0ZWRcbiAgICAgICAgICAgIC8vIHNsYXNoIHdpdGggYSAzMDggdG8gdGhlIGNvbGxhcHNlZCBwYXRoXG4gICAgICAgICAgICAvLyAoXFxgbm9ybWFsaXplUmVwZWF0ZWRTbGFzaGVzXFxgLCBjYWxsZWQgZnJvbSBcXGBiYXNlLXNlcnZlci50c1xcYCksIGFuZCBzb1xuICAgICAgICAgICAgLy8gZG9lcyB0aGlzIHJ1bnRpbWUuIEJlaGluZCBhIExhbWJkYSBGdW5jdGlvbiBVUkwgdGhlIG9yaWdpbiBuZXZlclxuICAgICAgICAgICAgLy8gZ2V0cyB0aGUgY2hhbmNlOiBPcmlnaW4gQWNjZXNzIENvbnRyb2wgc2lnbnMgdGhlIHJhdyBwYXRoIHdoaWxlIHRoZVxuICAgICAgICAgICAgLy8gRnVuY3Rpb24gVVJMIGNhbm9uaWNhbGl6ZXMgaXQgYmVmb3JlIHZlcmlmeWluZywgc28gdGhlIG9yaWdpblxuICAgICAgICAgICAgLy8gYW5zd2VycyA0MDMgU2lnbmF0dXJlRG9lc05vdE1hdGNoLiBEb2luZyB0aGUgcmVkaXJlY3QgaGVyZSBpcyB3aGF0XG4gICAgICAgICAgICAvLyBtYWtlcyBcXGAvYmFzZXBhdGgvL3RvLXN2XFxgIGJlaGF2ZSBhcyBpdCBkb2VzIHVuZGVyIFxcYG5leHQgc3RhcnRcXGAuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gQSBiYXJlIFxcYC8vXFxgIHJlYWNoZXMgaGVyZSB0b28sIGFuZCBpcyBhbnN3ZXJlZCB0aGUgc2FtZSB3YXkgLVxuICAgICAgICAgICAgLy8gbWVhc3VyZWQsIGJlY2F1c2UgXFxgLy9cXGAgYXQgdGhlIHN0YXJ0IG9mIGEgcmVxdWVzdCB0YXJnZXQgaXMgYWxzbyB0aGVcbiAgICAgICAgICAgIC8vIGF1dGhvcml0eSBmb3JtIGFuZCBpdCB3YXMgbm90IG9idmlvdXMgQ2xvdWRGcm9udCB3b3VsZCByb3V0ZSBpdCB0byBhXG4gICAgICAgICAgICAvLyBmdW5jdGlvbiBhdCBhbGwuIEl0IGRvZXM6IFxcYEdFVCAvL1xcYCBhbnN3ZXJzIDMwOCB0byBcXGAvXFxgIHdpdGhcbiAgICAgICAgICAgIC8vIFxcYHgtY2FjaGU6IEZ1bmN0aW9uR2VuZXJhdGVkUmVzcG9uc2VcXGAsIG92ZXIgYm90aCBIVFRQLzEuMSBhbmQgSFRUUC8yLFxuICAgICAgICAgICAgLy8gd2hpY2ggaXMgd2hhdCBcXGB0ZXN0L2UyZS9oeWRyYXRpb25cXGAgYXNrcyBmb3IuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVHdvIHRoaW5ncyBOZXh0LmpzIGRvZXMgdGhhdCB0aGlzIGNhbm5vdDpcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAtIHRoZSBib2R5IGl0IHNlbmRzIHdpdGggaXRzIG93biByZWRpcmVjdCAodGhlIGRlc3RpbmF0aW9uLCBhc1xuICAgICAgICAgICAgLy8gICB0ZXh0KSwgYmVjYXVzZSBhIGdlbmVyYXRlZCByZXNwb25zZSBjYW4gb25seSBjYXJyeSBvbmUgb25cbiAgICAgICAgICAgIC8vICAgY2xvdWRmcm9udC1qcy0yLjAuIE5vIGtub3duIGNsaWVudCByZWFkcyBpdC5cbiAgICAgICAgICAgIC8vIC0gdGhlIG9yaWdpbmFsIG9yZGVyIG9mIHRoZSBxdWVyeSBzdHJpbmcuIFRoZSBldmVudCBleHBvc2VzXG4gICAgICAgICAgICAvLyAgIFxcYHF1ZXJ5c3RyaW5nXFxgIGFzIGFuIG9iamVjdCwgbmV2ZXIgYXMgdGhlIHJhdyBzdHJpbmcsIHNvXG4gICAgICAgICAgICAvLyAgIFxcYC94Ly95P2E9MSZiPTJcXGAgcmVkaXJlY3RzIHRvIFxcYC94L3k/Yj0yJmE9MVxcYC4gVGhlIHBhaXJzIGFsbFxuICAgICAgICAgICAgLy8gICBzdXJ2aXZlOyBvbmx5IHRoZWlyIG9yZGVyIGlzIENsb3VkRnJvbnQncyByYXRoZXIgdGhhbiB0aGVcbiAgICAgICAgICAgIC8vICAgY2xpZW50J3MsIGFuZCBhIHJlZGlyZWN0IHRhcmdldCBpcyBub3Qgb3JkZXItc2Vuc2l0aXZlLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIEEgcmVwZWF0ZWQga2V5J3MgXFxgbXVsdGlWYWx1ZVxcYCBhbHJlYWR5IGhvbGRzIGl0cyBmaXJzdCB2YWx1ZSwgd2hpY2hcbiAgICAgICAgICAgIC8vIFxcYHZhbHVlXFxgIHJlcGVhdHMsIHNvIGl0IGlzIG9uZSBvciB0aGUgb3RoZXIsIG5ldmVyIGJvdGguIE5hbWVzIGFuZFxuICAgICAgICAgICAgLy8gdmFsdWVzIGFycml2ZSBhcyB0aGUgY2xpZW50IHNlbnQgdGhlbSwgc3RpbGwgcGVyY2VudC1lbmNvZGVkXG4gICAgICAgICAgICAvLyAobWVhc3VyZWQ6IFxcYD9hPSUyMGIlMjZjJnA9MSsyXFxgIHJlYWRzIGJhY2sgdW5jaGFuZ2VkKSwgc28gdGhleSBhcmVcbiAgICAgICAgICAgIC8vIGpvaW5lZCBhcy1pczsgZW5jb2RpbmcgdGhlbSBhZ2FpbiB3b3VsZCB0dXJuIFxcYCUyMFxcYCBpbnRvIFxcYCUyNTIwXFxgLlxuICAgICAgICAgICAgaWYgKC9cXFxcXFxcXHxcXFxcL1xcXFwvLy50ZXN0KHVyaSkpIHtcbiAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gdXJpLnJlcGxhY2UoL1xcXFxcXFxcL2csIFwiL1wiKS5yZXBsYWNlKC9cXFxcL1xcXFwvKy9nLCBcIi9cIik7XG4gICAgICAgICAgICAgIHZhciBxcyA9IFtdO1xuICAgICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIHJlcXVlc3QucXVlcnlzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICB2YXIgcSA9IHJlcXVlc3QucXVlcnlzdHJpbmdbbmFtZV07XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHEubXVsdGlWYWx1ZSB8fCBbcV07XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIHZhciB2ID0gdmFsdWVzW2ldLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgcXMucHVzaCh2ID09PSBcIlwiID8gbmFtZSA6IG5hbWUgKyBcIj1cIiArIHYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbG9jYXRpb24gPSBsb2NhdGlvbiArIFwiP1wiICsgcXMuam9pbihcIiZcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAzMDgsXG4gICAgICAgICAgICAgICAgc3RhdHVzRGVzY3JpcHRpb246IFwiUGVybWFuZW50IFJlZGlyZWN0XCIsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogeyBsb2NhdGlvbjogeyB2YWx1ZTogbG9jYXRpb24gfSB9LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1ob3N0XCJdID0gcmVxdWVzdC5oZWFkZXJzLmhvc3Q7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYCksXG4gICAgICB9KTtcbiAgICAgIGFzc29jaWF0aW9ucy5wdXNoKHtcbiAgICAgICAgZXZlbnRUeXBlOiBGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCxcbiAgICAgICAgZnVuY3Rpb246IGNsb3VkRnJvbnRGbixcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXNzb2NpYXRpb25zO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlU3RhdGljQmVoYXZpb3JPcHRpb25zKCk6IEJlaGF2aW9yT3B0aW9ucyB7XG4gICAgY29uc3Qgc3RhdGljQmVoYXZpb3JPcHRpb25zID0gdGhpcy5wcm9wcy5vdmVycmlkZXM/LnN0YXRpY0JlaGF2aW9yT3B0aW9ucztcbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnNQb2xpY3kgPVxuICAgICAgc3RhdGljQmVoYXZpb3JPcHRpb25zPy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgPz9cbiAgICAgIG5ldyBSZXNwb25zZUhlYWRlcnNQb2xpY3kodGhpcywgXCJTdGF0aWNSZXNwb25zZUhlYWRlcnNQb2xpY3lcIiwge1xuICAgICAgICBzZWN1cml0eUhlYWRlcnNCZWhhdmlvcjogdGhpcy5jb21tb25TZWN1cml0eUhlYWRlcnNCZWhhdmlvcixcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIFN0YXRpYyBSZXNwb25zZSBIZWFkZXJzIFBvbGljeVwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnN0YXRpY1Jlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgY2FjaGVkTWV0aG9kczogQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgY2FjaGVQb2xpY3k6IENhY2hlUG9saWN5LkNBQ0hJTkdfT1BUSU1JWkVELFxuICAgICAgb3JpZ2luOiB0aGlzLnN0YXRpY09yaWdpbixcbiAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeSxcbiAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgIC4uLnN0YXRpY0JlaGF2aW9yT3B0aW9ucyxcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY0JlaGF2aW9yT3B0aW9ucygpOiBCZWhhdmlvck9wdGlvbnMge1xuICAgIGNvbnN0IGR5bmFtaWNCZWhhdmlvck9wdGlvbnMgPSB0aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY0JlaGF2aW9yT3B0aW9ucztcbiAgICBjb25zdCBjYWNoZVBvbGljeVByb3BzID0gdGhpcy5wcm9wcy5vdmVycmlkZXM/LmR5bmFtaWNDYWNoZVBvbGljeVByb3BzO1xuICAgIC8vIGNyZWF0ZSBkZWZhdWx0IGNhY2hlIHBvbGljeSBpZiBub3QgcHJvdmlkZWRcbiAgICBjb25zdCBjYWNoZVBvbGljeSA9XG4gICAgICBkeW5hbWljQmVoYXZpb3JPcHRpb25zPy5jYWNoZVBvbGljeSA/P1xuICAgICAgbmV3IENhY2hlUG9saWN5KHRoaXMsIFwiRHluYW1pY0NhY2hlUG9saWN5XCIsIHtcbiAgICAgICAgLi4uKGlzQ2FjaGluZ0Rpc2FibGVkKGNhY2hlUG9saWN5UHJvcHMpXG4gICAgICAgICAgPyBESVNBQkxFRF9DQUNIRV9LRVlcbiAgICAgICAgICA6IERZTkFNSUNfQ0FDSEVfS0VZKSxcbiAgICAgICAgLy8gQSByZXNwb25zZSB3aXRoIG5vIGBDYWNoZS1Db250cm9sYCBpcyBub3QgY2FjaGVkLCB3aGljaCBpcyB3aGF0IE5leHQuanNcbiAgICAgICAgLy8gYW5kIGV2ZXJ5IGFwcCB3cml0dGVuIGZvciBpdCBhc3N1bWU6IGEgZHluYW1pYyByb3V0ZSBoYW5kbGVyIHNldHMgbm9uZS5cbiAgICAgICAgLy8gQ0RLJ3MgZGVmYXVsdCBpcyBhIGRheSwgd2hpY2ggY2FjaGVkIGAvYXBpLypgIHJlc3BvbnNlcyBhdCB0aGUgZWRnZSBmb3JcbiAgICAgICAgLy8gMjQgaG91cnMuIEFueXRoaW5nIE5leHQuanMgKm1lYW5zKiB0byBjYWNoZSAtIElTUiwgU1NHLCBhIFBQUiBzaGVsbCAtXG4gICAgICAgIC8vIHNheXMgc28gd2l0aCBgcy1tYXhhZ2VgLCB3aGljaCBgbWF4VHRsYCBzdGlsbCBob25vcnMuXG4gICAgICAgIGRlZmF1bHRUdGw6IER1cmF0aW9uLnNlY29uZHMoMCksXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuZ2V0Q29tbWVudChcbiAgICAgICAgICBcIk5leHRKUyBEeW5hbWljIENhY2hlIFBvbGljeVwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4uY2FjaGVQb2xpY3lQcm9wcyxcbiAgICAgIH0pO1xuICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVyc1BvbGljeSA9XG4gICAgICBkeW5hbWljQmVoYXZpb3JPcHRpb25zPy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgPz9cbiAgICAgIG5ldyBSZXNwb25zZUhlYWRlcnNQb2xpY3kodGhpcywgXCJEeW5hbWljUmVzcG9uc2VIZWFkZXJzUG9saWN5XCIsIHtcbiAgICAgICAgc2VjdXJpdHlIZWFkZXJzQmVoYXZpb3I6IHRoaXMuY29tbW9uU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IsXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuZ2V0Q29tbWVudChcbiAgICAgICAgICBcIk5leHRKUyBEeW5hbWljIFJlc3BvbnNlIEhlYWRlcnMgUG9saWN5XCIsXG4gICAgICAgICAgU3RhY2sub2YodGhpcykuc3RhY2tOYW1lLFxuICAgICAgICApLFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY1Jlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19BTEwsXG4gICAgICBjYWNoZVBvbGljeSxcbiAgICAgIG9yaWdpbjogdGhpcy5keW5hbWljT3JpZ2luLFxuICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogdGhpcy5keW5hbWljT3JpZ2luUmVzcG9uc2VQb2xpY3ksXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3ksXG4gICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAuLi5keW5hbWljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IHRoaXMud2l0aER5bmFtaWNGdW5jdGlvbkFzc29jaWF0aW9ucyhcbiAgICAgICAgXCJkeW5hbWljQmVoYXZpb3JPcHRpb25zXCIsXG4gICAgICAgIGR5bmFtaWNCZWhhdmlvck9wdGlvbnM/LmZ1bmN0aW9uQXNzb2NpYXRpb25zLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBUaGUgYmVoYXZpb3IncyBmdW5jdGlvbiBhc3NvY2lhdGlvbnM6IGFuIG92ZXJyaWRlJ3MsIHBsdXMgdGhlIHZpZXdlci1yZXF1ZXN0XG4gICAqIGZ1bmN0aW9uIEdsb2JhbCBGdW5jdGlvbnMgZGVwZW5kcyBvbi5cbiAgICpcbiAgICogU3ByZWFkaW5nIHRoZSBvdmVycmlkZSdzIGBmdW5jdGlvbkFzc29jaWF0aW9uc2Agb3ZlciBvdXJzIHdvdWxkIHNpbGVudGx5XG4gICAqIGRyb3AgdGhhdCBmdW5jdGlvbiwgYW5kIHdpdGggaXQgdGhlIG9ubHkgdGhpbmcgc3RhbmRpbmcgYmV0d2VlbiBhIHZpZXdlcidzXG4gICAqIG93biBgWC1Gb3J3YXJkZWQtSG9zdGAgYW5kIHRoZSBydW50aW1lLCB3aGljaCB0cnVzdHMgdGhhdCBoZWFkZXIgb24gRnVuY3Rpb25cbiAgICogVVJMIGV2ZW50cyAoYGxhbWJkYS1ldmVudC50c2ApOiBob3N0IGluamVjdGlvbiBpbnRvIHJlZGlyZWN0cyBhbmQgYWJzb2x1dGVcbiAgICogVVJMcywgY2FjaGVkIGZvciBvdGhlciB2aWV3ZXJzIGJlY2F1c2UgdGhlIGhlYWRlciBpcyBub3QgaW4gdGhlIGNhY2hlIGtleS5cbiAgICogU28gb3VycyBpcyBrZXB0LCBhbmQgYW4gb3ZlcnJpZGUgY2xhaW1pbmcgVklFV0VSX1JFUVVFU1Qg4oCUIHdoaWNoIENsb3VkRnJvbnRcbiAgICogYWxsb3dzIG9ubHkgb25lIG9mIHBlciBiZWhhdmlvciDigJQgaXMgYW4gZXJyb3IgcmF0aGVyIHRoYW4gYSByZXBsYWNlbWVudC5cbiAgICovXG4gIHByaXZhdGUgd2l0aER5bmFtaWNGdW5jdGlvbkFzc29jaWF0aW9ucyhcbiAgICBvdmVycmlkZU5hbWU6IHN0cmluZyxcbiAgICBvdmVycmlkZGVuOiBGdW5jdGlvbkFzc29jaWF0aW9uW10gfCB1bmRlZmluZWQsXG4gICk6IEZ1bmN0aW9uQXNzb2NpYXRpb25bXSB7XG4gICAgaWYgKCFvdmVycmlkZGVuKSB7XG4gICAgICByZXR1cm4gdGhpcy5keW5hbWljQ2xvdWRGcm9udEZ1bmN0aW9uQXNzb2NpYXRpb25zO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNGdW5jdGlvbkNvbXB1dGUpIHtcbiAgICAgIHJldHVybiBvdmVycmlkZGVuO1xuICAgIH1cbiAgICBjb25zdCBjbGFpbWVkID0gb3ZlcnJpZGRlbi5zb21lKFxuICAgICAgKGFzc29jaWF0aW9uKSA9PlxuICAgICAgICBhc3NvY2lhdGlvbi5ldmVudFR5cGUgPT09IEZ1bmN0aW9uRXZlbnRUeXBlLlZJRVdFUl9SRVFVRVNULFxuICAgICk7XG4gICAgaWYgKGNsYWltZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gXFxgb3ZlcnJpZGVzLiR7b3ZlcnJpZGVOYW1lfS5mdW5jdGlvbkFzc29jaWF0aW9uc1xcYCBgICtcbiAgICAgICAgICBgYXNzb2NpYXRlcyBhIENsb3VkRnJvbnQgZnVuY3Rpb24gd2l0aCBgICtcbiAgICAgICAgICBgJHtGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVH0sIGJ1dCBOZXh0anNHbG9iYWxGdW5jdGlvbnMgbmVlZHMgYCArXG4gICAgICAgICAgYHRoYXQgZXZlbnQgdHlwZSBmb3IgaXRzIG93biBmdW5jdGlvbiwgd2hpY2ggb3ZlcndyaXRlcyBgICtcbiAgICAgICAgICBgXFxgeC1mb3J3YXJkZWQtaG9zdFxcYCB3aXRoIHRoZSB2aWV3ZXIncyBcXGBIb3N0XFxgICh0aGUgcnVudGltZSB0cnVzdHMgYCArXG4gICAgICAgICAgYHRoYXQgaGVhZGVyIGJlaGluZCBDbG91ZEZyb250KSBhbmQgcmVkaXJlY3RzIHJlcGVhdGVkIHNsYXNoZXMuIGAgK1xuICAgICAgICAgIGBDbG91ZEZyb250IHBlcm1pdHMgb25seSBvbmUgZnVuY3Rpb24gcGVyIGV2ZW50IHR5cGUgcGVyIGJlaGF2aW9yLiBgICtcbiAgICAgICAgICBgTW92ZSB0aGUgbG9naWMgdG8gJHtGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVTUE9OU0V9LCBvciBpbnRvIGAgK1xuICAgICAgICAgIGB0aGUgYXBwJ3MgbWlkZGxld2FyZS5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIFsuLi5vdmVycmlkZGVuLCAuLi50aGlzLmR5bmFtaWNDbG91ZEZyb250RnVuY3Rpb25Bc3NvY2lhdGlvbnNdO1xuICB9XG4gIC8qKlxuICAgKiBgX25leHQvaW1hZ2UqYCBnb2VzIHRvIHRoZSBzYW1lIG9yaWdpbiBhcyBldmVyeXRoaW5nIGVsc2Ug4oCUIHRoZSBOZXh0LmpzXG4gICAqIHNlcnZlciBvcHRpbWl6ZXMgaW1hZ2VzIGluLXByb2Nlc3Mg4oCUIGJ1dCBrZWVwcyBpdHMgb3duIGJlaGF2aW9yIGZvciB0aGVcbiAgICogY2FjaGUgcG9saWN5OiBgcXVlcnlTdHJpbmdCZWhhdmlvcjogYWxsKClgIHBsdXMgYGFjY2VwdGAgaW4gdGhlIGNhY2hlIGtleSBpc1xuICAgKiByaWdodCBmb3IgaW1hZ2UgcmVxdWVzdHMgYW5kIHdyb25nIGZvciB0aGUgcmVzdC5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlSW1hZ2VCZWhhdmlvck9wdGlvbnMoKTogQmVoYXZpb3JPcHRpb25zIHtcbiAgICBjb25zdCBpbWFnZUJlaGF2aW9yT3B0aW9ucyA9IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5pbWFnZUJlaGF2aW9yT3B0aW9ucztcbiAgICAvLyBhZGQgZGVmYXVsdCBjYWNoZSBwb2xpY3kgaWYgbm90IHByb3ZpZGVkXG4gICAgY29uc3QgY2FjaGVQb2xpY3kgPVxuICAgICAgaW1hZ2VCZWhhdmlvck9wdGlvbnM/LmNhY2hlUG9saWN5ID8/XG4gICAgICBuZXcgQ2FjaGVQb2xpY3kodGhpcywgXCJJbWFnZUNhY2hlUG9saWN5XCIsIHtcbiAgICAgICAgLy8gU0VDVVJJVFkgTk9URTogYnkgZGVmYXVsdCB3ZSBkb24ndCBpbmNsdWRlIGNvb2tpZXMgaW4gY2FjaGUgZm9yXG4gICAgICAgIC8vIGltYWdlcyBiL2MgaXQgc2lnbmlmaWNhbnRseSBpbXByb3ZlcyBpbWFnZSBwZXJmIGZvciBtb3N0IHNpdGVzIEJVVFxuICAgICAgICAvLyBpZiB5b3UgaGF2ZSBwcml2YXRlIGltYWdlcyBsb2NrZWQgYmVoaW5kIGF1dGggaW1wbGVtZW50ZWQgd2l0aCBjb29raWVzXG4gICAgICAgIC8vIHlvdSBuZWVkIHRvIG92ZXJyaWRlIHRoaXMuXG4gICAgICAgIHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5hbGwoKSxcbiAgICAgICAgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KFwiYWNjZXB0XCIpLFxuICAgICAgICBjb29raWVCZWhhdmlvcjogQ2FjaGVDb29raWVCZWhhdmlvci5ub25lKCksXG4gICAgICAgIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiB0cnVlLFxuICAgICAgICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IHRydWUsXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuZ2V0Q29tbWVudChcbiAgICAgICAgICBcIk5leHRKUyBJbWFnZSBDYWNoZSBQb2xpY3lcIixcbiAgICAgICAgICBTdGFjay5vZih0aGlzKS5zdGFja05hbWUsXG4gICAgICAgICksXG4gICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5pbWFnZUNhY2hlUG9saWN5UHJvcHMsXG4gICAgICB9KTtcbiAgICAvLyBhZGQgZGVmYXVsdCByZXNwb25zZSBoZWFkZXJzIHBvbGljeSBpZiBub3QgcHJvdmlkZWRcbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnNQb2xpY3kgPVxuICAgICAgaW1hZ2VCZWhhdmlvck9wdGlvbnM/LnJlc3BvbnNlSGVhZGVyc1BvbGljeSA/P1xuICAgICAgbmV3IFJlc3BvbnNlSGVhZGVyc1BvbGljeSh0aGlzLCBcIkltYWdlUmVzcG9uc2VIZWFkZXJzUG9saWN5XCIsIHtcbiAgICAgICAgc2VjdXJpdHlIZWFkZXJzQmVoYXZpb3I6IHRoaXMuY29tbW9uU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IsXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuZ2V0Q29tbWVudChcbiAgICAgICAgICBcIk5leHRKUyBJbWFnZSBSZXNwb25zZSBIZWFkZXJzIFBvbGljeVwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmltYWdlUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHMsXG4gICAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICBvcmlnaW46IHRoaXMuZHluYW1pY09yaWdpbixcbiAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6IHRoaXMuZHluYW1pY09yaWdpblJlc3BvbnNlUG9saWN5LFxuICAgICAgY2FjaGVQb2xpY3ksXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3ksXG4gICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAuLi5pbWFnZUJlaGF2aW9yT3B0aW9ucyxcbiAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiB0aGlzLndpdGhEeW5hbWljRnVuY3Rpb25Bc3NvY2lhdGlvbnMoXG4gICAgICAgIFwiaW1hZ2VCZWhhdmlvck9wdGlvbnNcIixcbiAgICAgICAgaW1hZ2VCZWhhdmlvck9wdGlvbnM/LmZ1bmN0aW9uQXNzb2NpYXRpb25zLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIG9yIHVzZXMgdXNlciBzcGVjaWZpZWQgQ2xvdWRGcm9udCBEaXN0cmlidXRpb25cbiAgICovXG4gIHByaXZhdGUgZ2V0RGlzdHJpYnV0aW9uKCk6IERpc3RyaWJ1dGlvbiB7XG4gICAgbGV0IGRpc3RyaWJ1dGlvbjogRGlzdHJpYnV0aW9uO1xuICAgIGlmICh0aGlzLnByb3BzLmRpc3RyaWJ1dGlvbikge1xuICAgICAgZGlzdHJpYnV0aW9uID0gdGhpcy5wcm9wcy5kaXN0cmlidXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpc3RyaWJ1dGlvbiA9IG5ldyBEaXN0cmlidXRpb24odGhpcywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICBtaW5pbXVtUHJvdG9jb2xWZXJzaW9uOiBTZWN1cml0eVBvbGljeVByb3RvY29sLlRMU19WMV8yXzIwMjEsXG4gICAgICAgIGRlZmF1bHRCZWhhdmlvcjogdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgICAvLyBiZXN0IHRvIHVzZSBIVFRQIDIgYW5kIDMgZm9yIGNvbXBhdGFiaWxpdHkgKEhUVFAgMikgYW5kIHBlcmZvcm1hbmNlIChIVFRQMylcbiAgICAgICAgLy8gQ2xvdWRGcm9udCB3aWxsIGNob29zZSBiZXN0IG9wdGlvbiBmb3IgY2xpZW50XG4gICAgICAgIGh0dHBWZXJzaW9uOiBIdHRwVmVyc2lvbi5IVFRQMl9BTkRfMyxcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIERpc3RyaWJ1dGlvblwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBkaXN0cmlidXRpb247XG4gIH1cbiAgcHJpdmF0ZSBhZGREeW5hbWljQmVoYXZpb3JzKCkge1xuICAgIC8vIEltYWdlIEJlaGF2aW9yXG4gICAgdGhpcy5kaXN0cmlidXRpb24uYWRkQmVoYXZpb3IoXG4gICAgICB0aGlzLmdldFBhdGhQYXR0ZXJuKFwiX25leHQvaW1hZ2UqXCIpLFxuICAgICAgdGhpcy5pbWFnZUJlaGF2aW9yT3B0aW9ucy5vcmlnaW4sXG4gICAgICB0aGlzLmltYWdlQmVoYXZpb3JPcHRpb25zLFxuICAgICk7XG4gICAgLy8gRnVuY3Rpb24gZ3JvdXAgYmVoYXZpb3JzLCBiZWZvcmUgdGhlIGJhc2VQYXRoIGNhdGNoLWFsbCBiZWxvdyBhbmQgYWZ0ZXJcbiAgICAvLyBgX25leHQvaW1hZ2UqYCAobm8gZ3JvdXAgcGF0dGVybiBjYW4gbWF0Y2ggYW4gaW1hZ2UgcmVxdWVzdCwgYW5kIGtlZXBpbmdcbiAgICAvLyB0aGUgb3JkZXIgb2YgdGhlIHVuc3BsaXQgY2FzZSBieXRlLWlkZW50aWNhbCBpcyB3b3J0aCBtb3JlIHRoYW4gc3ltbWV0cnkpLlxuICAgIHRoaXMuYWRkRnVuY3Rpb25Hcm91cEJlaGF2aW9ycygpO1xuICAgIC8vIFJvb3QgUGF0aCBCZWhhdmlvcnNcbiAgICBpZiAodGhpcy5iYXNlUGF0aCkge1xuICAgICAgLy8gYmVjYXVzZSB3ZSBhbHJlYWR5IGhhdmUgYSBiYXNlUGF0aCB3ZSBkb24ndCB1c2UgLyBpbnN0ZWFkIHdlIHVzZSAvYmFzZS1wYXRoXG4gICAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgICAgYC8ke3RoaXMuYmFzZVBhdGh9YCxcbiAgICAgICAgdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zLm9yaWdpbixcbiAgICAgICAgdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgKTtcbiAgICAgIC8vIHdoZW4gYmFzZVBhdGggaXMgc2V0LCB3ZSBlbXVsYXRlIHRoZSBcImRlZmF1bHQgYmVoYXZpb3JcIiAoKikgZm9yIHRoZSBzaXRlIGFzIGAvYmFzZS1wYXRoLypgXG4gICAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgICAgdGhpcy5nZXRQYXRoUGF0dGVybihcIipcIiksXG4gICAgICAgIHRoaXMuZHluYW1pY0JlaGF2aW9yT3B0aW9ucy5vcmlnaW4sXG4gICAgICAgIHRoaXMuZHluYW1pY0JlaGF2aW9yT3B0aW9ucyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIG5vIGJhc2UgcGF0aCwgdGhlbiBkZWZhdWx0IGJlaGF2aW9yIHdpbGwgaGFuZGxlIGFsbCBvdGhlciBwYXRoc1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQmVmb3JlIGFueSBiZWhhdmlvciBpcyBjb21wdXRlZDogdGhlIGJ1ZGdldCBhbmQgdGhlIGBwdWJsaWMvYCBjaGVja3MgYm90aFxuICAgKiBnZW5lcmF0ZSB0aGUgZ3JvdXAgcGF0dGVybnMsIGFuZCB3b3VsZCBvdGhlcndpc2UgZmFpbCBmaXJzdCB3aXRoIGEgbGVzc1xuICAgKiB1c2VmdWwgbWVzc2FnZS5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVGdW5jdGlvbkdyb3VwUHJvcHMoKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHM/Lmxlbmd0aCAmJlxuICAgICAgIXRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cEJlaGF2aW9ycz8ubGVuZ3RoXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImBmdW5jdGlvbkdyb3Vwc2AgaXMgb25seSBzdXBwb3J0ZWQgYnkgTmV4dGpzR2xvYmFsRnVuY3Rpb25zLlwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEV2ZXJ5IGdyb3VwIGJlaGF2aW9yLCBmaW5hbCBwYXRoIHBhdHRlcm4gaW5jbHVkZWQsIGluIHRoZSBvcmRlclxuICAgKiB7QGxpbmsgYWRkRnVuY3Rpb25Hcm91cEJlaGF2aW9yc30gYWRkcyB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzKCkge1xuICAgIHJldHVybiAodGhpcy5wcm9wcy5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzID8/IFtdKS5tYXAoKGJlaGF2aW9yKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHM/LmZpbmQoXG4gICAgICAgIChpdCkgPT4gaXQubmFtZSA9PT0gYmVoYXZpb3IuZ3JvdXAsXG4gICAgICApO1xuICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCR7TE9HX1BSRUZJWH0gXFxgZnVuY3Rpb25Hcm91cEJlaGF2aW9yc1xcYCByb3V0ZXMgdG8gZnVuY3Rpb24gZ3JvdXAgYCArXG4gICAgICAgICAgICBgXCIke2JlaGF2aW9yLmdyb3VwfVwiLCB3aGljaCBpcyBub3QgaW4gXFxgZnVuY3Rpb25Hcm91cHNcXGAuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJlaGF2aW9yLFxuICAgICAgICBncm91cCxcbiAgICAgICAgcGF0aFBhdHRlcm46IHRoaXMuZ2V0UGF0aFBhdHRlcm4oYmVoYXZpb3IucGF0dGVybiksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBPbmUgYmVoYXZpb3IgcGVyIGdyb3VwIHBhdHRlcm4sIG1vc3Qgc3BlY2lmaWMgZmlyc3QuXG4gICAqXG4gICAqIFRoZSBvcmRlciBpcyB0aGUgd2hvbGUgbWVjaGFuaXNtLiBDbG91ZEZyb250IGV2YWx1YXRlcyBiZWhhdmlvcnMgaW4gb3JkZXJcbiAgICogYW5kIHN0b3BzIGF0IHRoZSBmaXJzdCB3aG9zZSBwYXRoIHBhdHRlcm4gbWF0Y2hlcywgYW5kIGBhZGRCZWhhdmlvcmBcbiAgICogYXBwZW5kcyDigJQgc28gYGFwaS8qYCBhZGRlZCBiZWZvcmUgYGFwaS9yZXBvcnRzLypgIHdvdWxkIHN3YWxsb3cgZXZlcnlcbiAgICogcmVwb3J0IHJlcXVlc3QgYW5kIHNlbmQgaXQgdG8gYSBmdW5jdGlvbiB3aG9zZSBwYWNrYWdlIGhhcyBubyByZXBvcnRcbiAgICogZW50cnlwb2ludC4gVGhlIGFkYXB0ZXIgc29ydGVkIHRoZSBsaXN0IHdoZW4gaXQgY2hlY2tlZCBpdCBhZ2FpbnN0IGhvd1xuICAgKiBgYXNzaWduUm91dGVzVG9Hcm91cHNgIHBhY2thZ2VkIHRoZSBzYW1lIHJvdXRlcywgc28gaXQgaXMgYWRkZWQgYXMgaXQgaXMuXG4gICAqL1xuICBwcml2YXRlIGFkZEZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMoKSB7XG4gICAgY29uc3Qgb3JpZ2luUGVyR3JvdXAgPSBuZXcgTWFwPHN0cmluZywgSU9yaWdpbj4oKTtcbiAgICBmb3IgKGNvbnN0IHsgZ3JvdXAsIHBhdGhQYXR0ZXJuIH0gb2YgdGhpcy5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzKCkpIHtcbiAgICAgIGxldCBvcmlnaW4gPSBvcmlnaW5QZXJHcm91cC5nZXQoZ3JvdXAubmFtZSk7XG4gICAgICBpZiAoIW9yaWdpbikge1xuICAgICAgICBvcmlnaW4gPSBGdW5jdGlvblVybE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbChcbiAgICAgICAgICBncm91cC5mdW5jdGlvblVybCxcbiAgICAgICAgICB0aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY0Z1bmN0aW9uVXJsT3JpZ2luV2l0aE9BQ1Byb3BzLFxuICAgICAgICApO1xuICAgICAgICBvcmlnaW5QZXJHcm91cC5zZXQoZ3JvdXAubmFtZSwgb3JpZ2luKTtcbiAgICAgICAgdGhpcy5ncmFudEludm9rZShncm91cC5uYW1lLCBncm91cC5mdW5jdGlvblVybCk7XG4gICAgICB9XG4gICAgICAvLyBTYW1lIGJlaGF2aW9yIG9wdGlvbnMgYXMgZXZlcnkgb3RoZXIgZHluYW1pYyByb3V0ZSDigJQgb25seSB0aGUgb3JpZ2luXG4gICAgICAvLyBkaWZmZXJzLCBhbmQgaXQgaXMgcGFzc2VkIHNlcGFyYXRlbHkuXG4gICAgICBjb25zdCB7IG9yaWdpbjogX2lnbm9yZWQsIC4uLmJlaGF2aW9yT3B0aW9ucyB9ID1cbiAgICAgICAgdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zO1xuICAgICAgdGhpcy5kaXN0cmlidXRpb24uYWRkQmVoYXZpb3IocGF0aFBhdHRlcm4sIG9yaWdpbiwgYmVoYXZpb3JPcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIGBsYW1iZGE6SW52b2tlRnVuY3Rpb25gIGZvciBDbG91ZEZyb250LCB3aGljaCBhIEZ1bmN0aW9uIFVSTCBiZWhpbmQgT0FDXG4gICAqIG5lZWRzIGJlc2lkZXMgdGhlIGBsYW1iZGE6SW52b2tlRnVuY3Rpb25VcmxgIGBGdW5jdGlvblVybE9yaWdpbmAgZ3JhbnRzLFxuICAgKiBhbmQgc2NvcGVkIHRoZSBzYW1lIHdheTogdG8gdGhpcyBkaXN0cmlidXRpb24sIGFuZCB0byBjYWxscyB0aGF0IGNvbWVcbiAgICogdGhyb3VnaCB0aGUgRnVuY3Rpb24gVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBncmFudEludm9rZShncm91cDogc3RyaW5nLCBmdW5jdGlvblVybDogSUZ1bmN0aW9uVXJsKSB7XG4gICAgbmV3IENmblBlcm1pc3Npb24odGhpcywgYEludm9rZUZ1bmN0aW9uLSR7Z3JvdXB9YCwge1xuICAgICAgYWN0aW9uOiBcImxhbWJkYTpJbnZva2VGdW5jdGlvblwiLFxuICAgICAgcHJpbmNpcGFsOiBcImNsb3VkZnJvbnQuYW1hem9uYXdzLmNvbVwiLFxuICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvblVybC5mdW5jdGlvbkFybixcbiAgICAgIHNvdXJjZUFybjogdGhpcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uQXJuLFxuICAgICAgaW52b2tlZFZpYUZ1bmN0aW9uVXJsOiB0cnVlLFxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgYGFzc2V0UHJlZml4YCBwYXRoIHRoYXQgbmVlZHMgYSBiZWhhdmlvciBvZiBpdHMgb3duLCBvciBgXCJcImAgZm9yIG5vbmUuXG4gICAqXG4gICAqIEFuIGFic29sdXRlIHByZWZpeCBjb250cmlidXRlcyBpdHMgKnBhdGgqOiBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tXCIgbmVlZHMgbm9cbiAgICogYmVoYXZpb3IsIGJ1dCBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2NkblwiIGRvZXMsIGJlY2F1c2UgYG5leHQgYnVpbGRgXG4gICAqIGNvbXBpbGVzIGEgYC9jZG4vX25leHQvOnBhdGgrYCByZXdyaXRlIG9mIGl0cyBvd24gYW5kIGBuZXh0IHN0YXJ0YCBzZXJ2ZXNcbiAgICogZXZlcnkgYnVuZGxlIHVuZGVyIHRoYXQgcGF0aCDigJQgc28gYSBDRE4gZnJvbnRpbmcgdGhpcyBkaXN0cmlidXRpb24gdGhlcmUgaGFzXG4gICAqIHRvIGJlIGFuc3dlcmVkLiBBIHByZWZpeCBlcXVhbCB0byB0aGUgYGJhc2VQYXRoYCBwcmVmaXggaXMgZHJvcHBlZCDigJQgdGhhdCBpc1xuICAgKiB0aGUgTmV4dC5qcyBkZWZhdWx0IHdoZW4gYGJhc2VQYXRoYCBpcyBzZXQsIGFuZCBgX25leHQvc3RhdGljKmAgYWxyZWFkeVxuICAgKiByZXNvbHZlcyB1bmRlciBpdCwgc28gYWRkaW5nIGEgc2Vjb25kIGlkZW50aWNhbCBwYXR0ZXJuIHdvdWxkIG1ha2UgQ2xvdWRGcm9udFxuICAgKiByZWplY3QgdGhlIGRpc3RyaWJ1dGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUFzc2V0UHJlZml4KCk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJlZml4ID0gYXNzZXRQcmVmaXhQYXRoKHRoaXMucHJvcHMuYXNzZXRQcmVmaXggPz8gXCJcIik7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUJhc2VQYXRoKHByZWZpeCkgPT09IHRoaXMuYmFzZVBhdGggPyBcIlwiIDogcHJlZml4O1xuICB9XG4gIC8qKlxuICAgKiBTZXJ2ZXMgYDxhc3NldFByZWZpeD4vX25leHQvc3RhdGljLypgIGZyb20gdGhlIHNhbWUgUzMgb2JqZWN0cyBhc1xuICAgKiBgX25leHQvc3RhdGljLypgLlxuICAgKlxuICAgKiBOZWVkZWQgYmVjYXVzZSBOZXh0LmpzIHB1dHMgYGFzc2V0UHJlZml4YCBpbiBmcm9udCBvZiBldmVyeSBidW5kbGUgVVJMIGl0XG4gICAqIGVtaXRzIHdoaWxlIHRoZSBvYmplY3RzIGtlZXAgdGhlaXIgYDxiYXNlUGF0aD4vX25leHQvc3RhdGljLy4uLmAga2V5cywgYW5kXG4gICAqIGBhc3NldFByZWZpeGAgc2l0cyBvbiB0b3Agb2YgYGJhc2VQYXRoYCByYXRoZXIgdGhhbiB1bmRlciBpdCwgc29cbiAgICogYGdldFBhdGhQYXR0ZXJuYCBpcyBkZWxpYmVyYXRlbHkgbm90IHVzZWQgaGVyZS4gV2l0aG91dCB0aGlzIGJlaGF2aW9yIHRoZVxuICAgKiByZXF1ZXN0IGZhbGxzIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgb25lLCByZWFjaGVzIHRoZSBjb21wdXRlIG9yaWdpbiwgYW5kXG4gICAqIDQwNHM6IHRoZSBkZXBsb3ltZW50IHBhY2thZ2UgY2FycmllcyBubyBgLm5leHQvc3RhdGljYCBkaXJlY3RvcnkgYXQgYWxsLlxuICAgKlxuICAgKiBBIHZpZXdlci1yZXF1ZXN0IGZ1bmN0aW9uIGRvZXMgdGhlIHJld3JpdGUgYmVjYXVzZSBhbiBTMyBvcmlnaW4ga2V5cyBvbiB0aGVcbiAgICogcmVxdWVzdCBVUkkgYW5kIGBvcmlnaW5QYXRoYCBjYW4gb25seSBwcmVwZW5kLiBUaGUgcHJlZml4IGlzIGEgc3ludGgtdGltZVxuICAgKiBsaXRlcmFsLCBzbyB0aGUgZnVuY3Rpb24gaXMgYSBmaXhlZC1sZW5ndGggc3RyaW5nIG9wZXJhdGlvbiByYXRoZXIgdGhhbiBhXG4gICAqIHBhcnNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRBc3NldFByZWZpeEJlaGF2aW9yKCkge1xuICAgIC8vIENsb3VkRnJvbnQgYWxsb3dzIG9uZSBmdW5jdGlvbiBwZXIgZXZlbnQgdHlwZSBwZXIgYmVoYXZpb3IsIHNvIGFuIG92ZXJyaWRlXG4gICAgLy8gdGhhdCBhbHJlYWR5IGNsYWltcyBWSUVXRVJfUkVRVUVTVCBvbiB0aGUgc3RhdGljIGJlaGF2aW9yIGNhbm5vdCBjb2V4aXN0XG4gICAgLy8gd2l0aCB0aGUgcmV3cml0ZSBiZWxvdyDigJQgdGhlIGRpc3RyaWJ1dGlvbiB3b3VsZCBzeW50aCBhbmQgdGhlbiBiZSByZWplY3RlZFxuICAgIC8vIGF0IGRlcGxveSwgbmFtaW5nIG5laXRoZXIuIFRocm93biBoZXJlIGluc3RlYWQsIHdoZXJlIGJvdGggaGFsdmVzIGFyZVxuICAgIC8vIGtub3duLlxuICAgIGNvbnN0IGNsYWltZWQgPSAoXG4gICAgICB0aGlzLnN0YXRpY0JlaGF2aW9yT3B0aW9ucy5mdW5jdGlvbkFzc29jaWF0aW9ucyA/PyBbXVxuICAgICkuc29tZShcbiAgICAgIChhc3NvY2lhdGlvbikgPT5cbiAgICAgICAgYXNzb2NpYXRpb24uZXZlbnRUeXBlID09PSBGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCxcbiAgICApO1xuICAgIGlmIChjbGFpbWVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IFxcYG92ZXJyaWRlcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMuZnVuY3Rpb25Bc3NvY2lhdGlvbnNcXGAgYCArXG4gICAgICAgICAgYGFscmVhZHkgYXNzb2NpYXRlcyBhIENsb3VkRnJvbnQgZnVuY3Rpb24gd2l0aCBgICtcbiAgICAgICAgICBgJHtGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVH0sIGJ1dCBzZXJ2aW5nIFxcYGFzc2V0UHJlZml4XFxgIGAgK1xuICAgICAgICAgIGAoXCIke3RoaXMuYXNzZXRQcmVmaXh9XCIpIG5lZWRzIHRoYXQgZXZlbnQgdHlwZSB0byByZXdyaXRlIHRoZSByZXF1ZXN0IGAgK1xuICAgICAgICAgIGBVUkkgdG8gdGhlIG9iamVjdCdzIGtleSwgYW5kIENsb3VkRnJvbnQgcGVybWl0cyBvbmx5IG9uZSBmdW5jdGlvbiBwZXIgYCArXG4gICAgICAgICAgYGV2ZW50IHR5cGUgcGVyIGJlaGF2aW9yLiBFaXRoZXIgZHJvcCB0aGUgb3ZlcnJpZGUsIG9yIGZvbGQgaXRzIGxvZ2ljIGAgK1xuICAgICAgICAgIGBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uIGFuZCBzZXQgXFxgYXNzZXRQcmVmaXhcXGAgdG8gXCJcIiBzbyB0aGlzIGAgK1xuICAgICAgICAgIGBjb25zdHJ1Y3QgYWRkcyBubyBiZWhhdmlvciBvZiBpdHMgb3duLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCByZXdyaXRlID0gbmV3IENsb3VkRnJvbnRGdW5jdGlvbih0aGlzLCBcIkFzc2V0UHJlZml4Rm5cIiwge1xuICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICBcIk5leHRKUyBhc3NldFByZWZpeCByZXdyaXRlXCIsXG4gICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICksXG4gICAgICBjb2RlOiBGdW5jdGlvbkNvZGUuZnJvbUlubGluZShgXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgICB2YXIgcmVxdWVzdCA9IGV2ZW50LnJlcXVlc3Q7XG4gICAgICAgICAgcmVxdWVzdC51cmkgPSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgdGhpcy5iYXNlUGF0aCA/IGAvJHt0aGlzLmJhc2VQYXRofWAgOiBcIlwiLFxuICAgICAgICAgICl9ICsgcmVxdWVzdC51cmkuc2xpY2UoJHt0aGlzLmFzc2V0UHJlZml4Lmxlbmd0aH0pO1xuICAgICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgICAgICB9XG4gICAgICAgIGApLFxuICAgIH0pO1xuICAgIHRoaXMuZGlzdHJpYnV0aW9uLmFkZEJlaGF2aW9yKFxuICAgICAgYCR7dGhpcy5hc3NldFByZWZpeH0vX25leHQvc3RhdGljKmAsXG4gICAgICB0aGlzLnN0YXRpY09yaWdpbixcbiAgICAgIHtcbiAgICAgICAgLi4udGhpcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMsXG4gICAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiBbXG4gICAgICAgICAgLi4uKHRoaXMuc3RhdGljQmVoYXZpb3JPcHRpb25zLmZ1bmN0aW9uQXNzb2NpYXRpb25zID8/IFtdKSxcbiAgICAgICAgICB7IGV2ZW50VHlwZTogRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsIGZ1bmN0aW9uOiByZXdyaXRlIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBhZGRTdGF0aWNCZWhhdmlvcnMoKSB7XG4gICAgdGhpcy5kaXN0cmlidXRpb24uYWRkQmVoYXZpb3IoXG4gICAgICB0aGlzLmdldFBhdGhQYXR0ZXJuKFwiX25leHQvc3RhdGljKlwiKSxcbiAgICAgIHRoaXMuc3RhdGljT3JpZ2luLFxuICAgICAgdGhpcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMsXG4gICAgKTtcbiAgICBpZiAodGhpcy5hc3NldFByZWZpeCkge1xuICAgICAgdGhpcy5hZGRBc3NldFByZWZpeEJlaGF2aW9yKCk7XG4gICAgfVxuICAgIGNvbnN0IHB1YmxpY1BhdGhQYXR0ZXJucyA9IHRoaXMucHVibGljUGF0aFBhdHRlcm5zKCk7XG4gICAgdGhpcy5hc3NlcnRCZWhhdmlvckJ1ZGdldChwdWJsaWNQYXRoUGF0dGVybnMubGVuZ3RoKTtcbiAgICB0aGlzLmFzc2VydE5vUHVibGljQ29sbGlzaW9ucyhwdWJsaWNQYXRoUGF0dGVybnMpO1xuICAgIGZvciAoY29uc3QgcGF0aFBhdHRlcm4gb2YgcHVibGljUGF0aFBhdHRlcm5zKSB7XG4gICAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgICAgcGF0aFBhdHRlcm4sXG4gICAgICAgIHRoaXMuc3RhdGljT3JpZ2luLFxuICAgICAgICB0aGlzLnN0YXRpY0JlaGF2aW9yT3B0aW9ucyxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgYmVoYXZpb3IgcGF0aCBwYXR0ZXJuIGZvciBlYWNoIHRvcC1sZXZlbCBgcHVibGljL2AgZW50cnksIGZpbmFsIGZvcm06XG4gICAqIGAvKmAgZm9yIGEgZGlyZWN0b3J5IGFuZCB0aGUgYmFzZVBhdGggcHJlZml4IGJvdGggYXBwbGllZC5cbiAgICpcbiAgICogQW4gZW50cnkgd2hvc2UgbmFtZSBoYXMgbm8gY2hhcmFjdGVyIENsb3VkRnJvbnQgY2FuIHNwZWxsIGlzIGxlZnQgb3V0LCB3aXRoXG4gICAqIGEgd2FybmluZywgcmF0aGVyIHRoYW4gZ2l2ZW4gYSBwYXR0ZXJuIG9mIG5vdGhpbmcgYnV0IHdpbGRjYXJkcy4gYNGE0L7RgtC+L2AgaXNcbiAgICogYD8/Pz8/Pz8/LypgIOKAlCBhbnkgOC1ieXRlIGZpcnN0IHNlZ21lbnQg4oCUIGFuZCBwdWJsaWMvIGJlaGF2aW9ycyBhcmUgYWRkZWRcbiAgICogYWhlYWQgb2YgZXZlcnkgY29tcHV0ZSBiZWhhdmlvciwgc28gaXQgd291bGQgc2VuZCBgL3Byb2R1Y3RzLzQyYCBhbmRcbiAgICogYC9zZXR0aW5ncy8qYCB0byBTMywgd2hpY2ggYW5zd2VycyA0MDMuIExlYXZpbmcgdGhlIGVudHJ5IG91dCBjb3N0cyBpdHMgb3duXG4gICAqIGZpbGVzIGluc3RlYWQ6IHRob3NlIHJlcXVlc3RzIHJlYWNoIHRoZSBjb21wdXRlLCB3aGljaCBkb2VzIG5vdCBoYXZlIHRoZW0sXG4gICAqIGFuZCA0MDQuIE9uZSBsaXRlcmFsIGNoYXJhY3RlciBpcyBlbm91Z2ggdG8ga2VlcCBhIHBhdHRlcm4gbmFycm93IOKAlFxuICAgKiBgPz8/Pz8/Pz8uanBnYCBvbmx5IG1hdGNoZXMgYC5qcGdgIHJlcXVlc3RzIOKAlCBzbyBvbmx5IHRoZSBhbGwtd2lsZGNhcmQgb25lc1xuICAgKiBnby5cbiAgICpcbiAgICogVGhlIGxlbmd0aCBsaW1pdCBpcyBjaGVja2VkIGhlcmUsIG9uIHRoZSBmaW5hbCBwYXR0ZXJuLCByYXRoZXIgdGhhbiBpblxuICAgKiB7QGxpbmsgdG9QYXRoUGF0dGVybn06IHRoZSBgLypgIGFuZCB0aGUgYmFzZVBhdGggY291bnQgYWdhaW5zdCBpdCB0b28sIGFuZCBhXG4gICAqIHBhdHRlcm4gdGhhdCBwYXNzZWQgd2l0aG91dCB0aGVtIGZhaWxlZCBhdCBkZXBsb3kgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgcHVibGljUGF0aFBhdHRlcm5zKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYXR0ZXJuczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB1bm1hdGNoYWJsZTogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHB1YmxpY0ZpbGUgb2YgdGhpcy5wcm9wcy5wdWJsaWNEaXJFbnRyaWVzKSB7XG4gICAgICBjb25zdCBuYW1lID0gdG9QYXRoUGF0dGVybihwdWJsaWNGaWxlLm5hbWUpO1xuICAgICAgaWYgKCEvW14/Ki9dLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgIHVubWF0Y2hhYmxlLnB1c2goYFwiJHtwdWJsaWNGaWxlLm5hbWV9XCJgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXRoUGF0dGVybiA9IHRoaXMuZ2V0UGF0aFBhdHRlcm4oXG4gICAgICAgIHB1YmxpY0ZpbGUuaXNEaXJlY3RvcnkgPyBgJHtuYW1lfS8qYCA6IG5hbWUsXG4gICAgICApO1xuICAgICAgaWYgKHBhdGhQYXR0ZXJuLmxlbmd0aCA+IE1BWF9QQVRIX1BBVFRFUk5fTEVOR1RIKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIHB1YmxpYy8gZW50cnkgXCIke3B1YmxpY0ZpbGUubmFtZX1cIiBuZWVkcyBhIGAgK1xuICAgICAgICAgICAgYCR7cGF0aFBhdHRlcm4ubGVuZ3RofS1jaGFyYWN0ZXIgQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4sIG92ZXIgYCArXG4gICAgICAgICAgICBgdGhlICR7TUFYX1BBVEhfUEFUVEVSTl9MRU5HVEh9LWNoYXJhY3RlciBgICtcbiAgICAgICAgICAgIFwibGltaXQuIFJlbmFtZSBpdCwgb3IgbW92ZSBpdCBpbnRvIGEgc3ViZGlyZWN0b3J5IG9mIHB1YmxpYy8gd2hvc2UgXCIgK1xuICAgICAgICAgICAgXCJvd24gbmFtZSBpcyBzaG9ydCBlbm91Z2guIFNlZSBcIiArXG4gICAgICAgICAgICBcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9Eb3dubG9hZERpc3RWYWx1ZXNDYWNoZUJlaGF2aW9yLmh0bWwjRG93bmxvYWREaXN0VmFsdWVzUGF0aFBhdHRlcm5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHBhdHRlcm5zLnB1c2gocGF0aFBhdHRlcm4pO1xuICAgIH1cbiAgICBpZiAodW5tYXRjaGFibGUubGVuZ3RoID4gMCkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZyhcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gVGhlc2UgdG9wLWxldmVsIHB1YmxpYy8gZW50cmllcyBoYXZlIG5vIGNoYXJhY3RlciBhIGAgK1xuICAgICAgICAgIFwiQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4gY2FuIHNwZWxsLCBzbyB0aGVpciBwYXR0ZXJuIHdvdWxkIGJlIFwiICtcbiAgICAgICAgICBcIndpbGRjYXJkcyBhbG9uZSBhbmQgd291bGQgY2FwdHVyZSBldmVyeSBhcHAgcm91dGUgb2YgdGhlIHNhbWUgXCIgK1xuICAgICAgICAgIGBsZW5ndGguIFRoZXkgZ2V0IG5vIGJlaGF2aW9yLCBzbyB0aGVpciByZXF1ZXN0cyByZWFjaCB0aGUgc2VydmVyLCBgICtcbiAgICAgICAgICBgd2hpY2ggcmVhZHMgdGhlbSBmcm9tIFMzIGluc3RlYWQ6ICR7dW5tYXRjaGFibGUuam9pbihcIiwgXCIpfS4gVG8gc2VydmUgYCArXG4gICAgICAgICAgXCJ0aGVtIGZyb20gUzMgZGlyZWN0bHksIHJlbmFtZSB0aGVtLCBvciBtb3ZlIHRoZW0gaW50byBhIHB1YmxpYy8gXCIgK1xuICAgICAgICAgIFwic3ViZGlyZWN0b3J5IHdob3NlIG5hbWUgaGFzIGF0IGxlYXN0IG9uZSBBU0NJSSBsZXR0ZXIgb3IgZGlnaXQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcGF0dGVybnM7XG4gIH1cbiAgLyoqXG4gICAqIFJlZnVzZSBhIGdyb3VwIGJlaGF2aW9yIHRoYXQgYSBgcHVibGljL2AgYmVoYXZpb3Igd291bGQgbWFrZSB1bnJlYWNoYWJsZS5cbiAgICpcbiAgICogYHB1YmxpYy9gIGJlaGF2aW9ycyBhcmUgYWRkZWQgZmlyc3QsIGFuZCBDbG91ZEZyb250IHN0b3BzIGF0IHRoZSBmaXJzdCBtYXRjaCxcbiAgICogc28gdHdvIGNhc2VzIHNlbmQgYSBncm91cCdzIHJvdXRlIHRvIFMzIGluc3RlYWQgb2YgaXRzIGZ1bmN0aW9uIOKAlCB3aGljaCBpc1xuICAgKiB3aHkgdGhpcyBpcyBjaGVja2VkIGF0IHN5bnRoLCB3aGVyZSBib3RoIHNpZGVzIGFyZSBrbm93bjpcbiAgICogLSB0aGUgc2FtZSBwYXR0ZXJuIHR3aWNlOiBgcHVibGljL2RvY3MvYCBhbmQgYC9kb2NzLyoqYCBib3RoIGRlcGxveSBhc1xuICAgKiAgIGBkb2NzLypgLiBUaGUgc3ludGggc3VjY2VlZGVkIGFuZCBDbG91ZEZyb250IHJlamVjdGVkIHRoZSBkZXBsb3kuXG4gICAqIC0gYSBncm91cCBwYXR0ZXJuIHVuZGVyIGEgcHVibGljIGRpcmVjdG9yeTogYC9kb2NzL2d1aWRlLyoqYCBiZWhpbmRcbiAgICogICBgZG9jcy8qYCBkZXBsb3lzIGFuZCBuZXZlciBtYXRjaGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NlcnROb1B1YmxpY0NvbGxpc2lvbnMocHVibGljUGF0aFBhdHRlcm5zOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHB1YmxpY1JlZ2V4ZXMgPSBwdWJsaWNQYXRoUGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiAoe1xuICAgICAgcGF0dGVybixcbiAgICAgIHJlZ2V4OiBjbG91ZEZyb250UGF0dGVyblJlZ2V4KGAvJHtwYXR0ZXJuLnJlcGxhY2UoL15cXC8rLywgXCJcIil9YCksXG4gICAgfSkpO1xuICAgIGZvciAoY29uc3QgeyBncm91cCwgcm91dGUsIHBhdGhQYXR0ZXJuIH0gb2YgdGhpcy5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzKCkpIHtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IHB1YmxpY1BhdGhQYXR0ZXJucy5pbmNsdWRlcyhwYXRoUGF0dGVybik7XG4gICAgICAvLyBNYXRjaGluZyB0aGUgZ3JvdXAgcGF0dGVybidzIG93biB0ZXh0IGlzIGVub3VnaDogaXRzIG9ubHkgd2lsZGNhcmQgaXMgYVxuICAgICAgLy8gdHJhaWxpbmcgYCpgLCBzbyBhIHB1YmxpYyBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyB0aGUgdGV4dCB1cCB0byBhbmRcbiAgICAgIC8vIGluY2x1ZGluZyBpdCBtYXRjaGVzIGV2ZXJ5IFVSTCB0aGUgZ3JvdXAgcGF0dGVybiBkb2VzLlxuICAgICAgY29uc3Qgc2hhZG93ID0gZHVwbGljYXRlXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogcHVibGljUmVnZXhlcy5maW5kKCh7IHJlZ2V4IH0pID0+XG4gICAgICAgICAgICByZWdleC50ZXN0KGAvJHtwYXRoUGF0dGVybi5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpfWApLFxuICAgICAgICAgICk7XG4gICAgICBpZiAoIWR1cGxpY2F0ZSAmJiAhc2hhZG93KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBwYXR0ZXJuIFwiJHtyb3V0ZX1cIiAoZ3JvdXAgYCArXG4gICAgICAgICAgYFwiJHtncm91cC5uYW1lfVwiKSBgICtcbiAgICAgICAgICAoZHVwbGljYXRlXG4gICAgICAgICAgICA/IGBkZXBsb3lzIGFzIHRoZSBwYXRoIHBhdHRlcm4gXCIke3BhdGhQYXR0ZXJufVwiLCB3aGljaCBhIHRvcC1sZXZlbCBgICtcbiAgICAgICAgICAgICAgYHB1YmxpYy8gZW50cnkgYWxyZWFkeSB1c2VzIOKAlCBDbG91ZEZyb250IHJlamVjdHMgYSBkaXN0cmlidXRpb24gYCArXG4gICAgICAgICAgICAgIGB3aXRoIHR3byBiZWhhdmlvcnMgb24gb25lIHBhdGggcGF0dGVybi4gYFxuICAgICAgICAgICAgOiBgZGVwbG95cyBhcyBcIiR7cGF0aFBhdHRlcm59XCIsIGJ1dCB0aGUgdG9wLWxldmVsIHB1YmxpYy8gZW50cnkgYCArXG4gICAgICAgICAgICAgIGBiZWhpbmQgXCIke3NoYWRvdyEucGF0dGVybn1cIiBpcyBtYXRjaGVkIGZpcnN0IGFuZCBzZW5kcyBldmVyeSBgICtcbiAgICAgICAgICAgICAgYHN1Y2ggcmVxdWVzdCB0byBTMywgc28gdGhlIGdyb3VwJ3MgZnVuY3Rpb24gd291bGQgbmV2ZXIgc2VlIGAgK1xuICAgICAgICAgICAgICBgdGhlbS4gYCkgK1xuICAgICAgICAgIGBNb3ZlIHRob3NlIHB1YmxpYy8gZmlsZXMgdW5kZXIgYSBkaXJlY3Rvcnkgbm8gcm91dGUgdXNlcywgb3IgYCArXG4gICAgICAgICAgYGdyb3VwIGEgZGlmZmVyZW50IHBhdGguYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDbG91ZEZyb250IGhhcyBhIHBlci1kaXN0cmlidXRpb24gY2FjaGUgYmVoYXZpb3IgcXVvdGEsIGNvdW50aW5nIHRoZSBkZWZhdWx0XG4gICAqIG9uZSDigJQgNzUgdW5sZXNzIHJhaXNlZCwgYW5kIGBtYXhDYWNoZUJlaGF2aW9yc2Agc2F5cyB3aGljaCDigJQgYW5kIHRoZXJlIGFyZVxuICAgKiB0aHJlZSB0aGluZ3MgY29tcGV0aW5nIGZvciBpdDogYHB1YmxpYy9gIGVudHJpZXMsIGZ1bmN0aW9uIGdyb3VwcywgYW5kXG4gICAqIGNkay1uZXh0anMncyBvd24gZml4ZWQgc2V0LlxuICAgKiBDaGVja2VkIGluIG9uZSBwbGFjZSBzbyB0aGUgZXJyb3IgY2FuIHNheSB3aGljaCB0byBjdXQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Nsb3VkZnJvbnQtbGltaXRzLmh0bWwjbGltaXRzLXdlYi1kaXN0cmlidXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzc2VydEJlaGF2aW9yQnVkZ2V0KHB1YmxpY1BhdHRlcm5zOiBudW1iZXIpIHtcbiAgICBjb25zdCBsaW1pdCA9IHRoaXMucHJvcHMubWF4Q2FjaGVCZWhhdmlvcnMgPz8gREVGQVVMVF9NQVhfQ0FDSEVfQkVIQVZJT1JTO1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQobGltaXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGdyb3VwUGF0dGVybnMgPSB0aGlzLmZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMoKS5sZW5ndGg7XG4gICAgLy8gVGhlIGRlZmF1bHQgYmVoYXZpb3IsIGBfbmV4dC9pbWFnZSpgLCBgX25leHQvc3RhdGljKmAsIHBsdXMg4oCUIHdpdGggYVxuICAgIC8vIGJhc2VQYXRoIOKAlCB0aGUgdHdvIHRoYXQgc3RhbmQgaW4gZm9yIHRoZSBkZWZhdWx0IGJlaGF2aW9yJ3MgY292ZXJhZ2UsIGFuZFxuICAgIC8vIOKAlCB3aXRoIGEgcGF0aC1zdHlsZSBhc3NldFByZWZpeCDigJQgdGhlIG9uZSB0aGF0IHNlcnZlcyBidW5kbGVzIHVuZGVyIGl0LlxuICAgIC8vIGB0aGlzLmJhc2VQYXRoYCwgbm90IHRoZSByYXcgcHJvcDogYGJhc2VQYXRoOiBcIi9cImAgbm9ybWFsaXplcyB0byBgXCJcImAgYW5kXG4gICAgLy8gYWRkcyBubyBiZWhhdmlvcnMsIHNvIGNvdW50aW5nIGl0IGFkZGVkIDIgdG8gdGhlIHRvdGFsIGFuZCBjb3VsZCB0aHJvd1xuICAgIC8vIFwib3ZlciB0aGUgbGltaXRcIiBvbiBhbiBhcHAgdGhhdCBpcyB1bmRlciBpdC5cbiAgICBjb25zdCBmaXhlZCA9IDMgKyAodGhpcy5iYXNlUGF0aCA/IDIgOiAwKSArICh0aGlzLmFzc2V0UHJlZml4ID8gMSA6IDApO1xuICAgIGNvbnN0IHRvdGFsID0gZml4ZWQgKyBwdWJsaWNQYXR0ZXJucyArIGdyb3VwUGF0dGVybnM7XG4gICAgaWYgKHRvdGFsIDw9IGxpbWl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgYCR7Zml4ZWR9IHVzZWQgYnkgY2RrLW5leHRqcyBpdHNlbGZgLFxuICAgICAgYCR7cHVibGljUGF0dGVybnN9IGZvciB0b3AtbGV2ZWwgcHVibGljLyBlbnRyaWVzYCxcbiAgICBdO1xuICAgIGlmIChncm91cFBhdHRlcm5zKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke2dyb3VwUGF0dGVybnN9IGZvciBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBwYXR0ZXJuc2ApO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhpcyBOZXh0LmpzIGFwcCBuZWVkcyAke3RvdGFsfSBDbG91ZEZyb250IGNhY2hlIGJlaGF2aW9ycywgb3ZlciB0aGUgYCArXG4gICAgICAgIGBsaW1pdCBvZiAke2xpbWl0fSBwZXIgZGlzdHJpYnV0aW9uOiAke3BhcnRzLmpvaW4oXCIsIFwiKX0uIGAgK1xuICAgICAgICBgTW92ZSBwdWJsaWMvIGZpbGVzIGludG8gYSBzaW5nbGUgdG9wLWxldmVsIGRpcmVjdG9yeSAob25lIGJlaGF2aW9yIGAgK1xuICAgICAgICBgc2VydmVzIFxcYHN0YXRpYy8qXFxgKWAgK1xuICAgICAgICAoZ3JvdXBQYXR0ZXJuc1xuICAgICAgICAgID8gYCwgYW5kIHByZWZlciBvbmUgc3VidHJlZSBwYXR0ZXJuIHBlciBmdW5jdGlvbiBncm91cCBvdmVyIHNldmVyYWwgYCArXG4gICAgICAgICAgICBgZXhhY3QgcGF0aHNgXG4gICAgICAgICAgOiBgYCkgK1xuICAgICAgICBgLiBJZiB5b3VyIGFjY291bnQncyBxdW90YSBpcyBoaWdoZXIgdGhhbiAke2xpbWl0fSwgc2V0IGAgK1xuICAgICAgICBgXFxgbWF4Q2FjaGVCZWhhdmlvcnNcXGAgdG8gaXQuIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY2xvdWRmcm9udC1saW1pdHMuaHRtbCNsaW1pdHMtd2ViLWRpc3RyaWJ1dGlvbnNgLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgcHJlcGVuZHMgYmFzZSBwYXRoIHRvIGdpdmVuIHBhdGggcGF0dGVybi5cbiAgICpcbiAgICogQSB0cmFpbGluZyBzbGFzaCBvbiBgcGF0aFBhdHRlcm5gIGlzIGxvYWQtYmVhcmluZyBhbmQgc3Vydml2ZXMsIHdoaWNoIGlzIHdoeVxuICAgKiB0aGlzIGNvbmNhdGVuYXRlcyByYXRoZXIgdGhhbiBnb2luZyB0aHJvdWdoIGBqb2luUGF0aGAuIFRoZSBidWlsZCdzXG4gICAqIGBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzYCBob2xkIGJvdGggXCJwcmljaW5nXCIgYW5kIFwicHJpY2luZy9cIiBmb3IgYVxuICAgKiBgdHJhaWxpbmdTbGFzaGAgYXBwLCBhbmQgbm9ybWFsaXppbmcgdGhlIHNlY29uZCBvbmUgY29sbGFwc2VkIGl0IG9udG8gdGhlXG4gICAqIGZpcnN0OiBgYWRkQmVoYXZpb3JgIHdhc1xuICAgKiB0aGVuIGNhbGxlZCB0d2ljZSB3aXRoIGAvYmFzZS9wcmljaW5nYCwgd2hpY2ggQ2xvdWRGcm9udCByZWplY3RzIGF0IGRlcGxveVxuICAgKiAoXCJtb3JlIHRoYW4gb25lIGNhY2hlIGJlaGF2aW9yIGhhcyB0aGUgc2FtZSBwYXRoIHBhdHRlcm5cIiksIGFuZCB0aGVcbiAgICogY2Fub25pY2FsIGAvYmFzZS9wcmljaW5nL2Agd2FzIGxlZnQgdG8gdGhlIGAvYmFzZS8qYCBjYXRjaC1hbGwg4oCUIHRoZSBtaXNyb3V0ZVxuICAgKiB0aGUgc2Vjb25kIHBhdHRlcm4gZXhpc3RzIHRvIHByZXZlbnQuXG4gICAqL1xuICBwcml2YXRlIGdldFBhdGhQYXR0ZXJuKHBhdGhQYXR0ZXJuOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuYmFzZVBhdGgpIHtcbiAgICAgIHJldHVybiBwYXRoUGF0dGVybjtcbiAgICB9XG4gICAgcmV0dXJuIGAvJHt0aGlzLmJhc2VQYXRofS8ke3BhdGhQYXR0ZXJuLnJlcGxhY2UoL15cXC8rLywgXCJcIil9YDtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYGR5bmFtaWNDYWNoZVBvbGljeVByb3BzYCB0dXJucyB0aGUgZHluYW1pYyBjYWNoZSBvZmYsIGJ5IGNhcHBpbmcgZXZlcnlcbiAqIFRUTCBhdCAwLlxuICpcbiAqIENsb3VkRnJvbnQgcmVqZWN0cyBhIHBvbGljeSB0aGF0IGNhY2hlcyBub3RoaW5nIGJ1dCBzdGlsbCBoYXMgYSBjYWNoZSBrZXlcbiAqIChcIkhlYWRlckJlaGF2aW9yIGlzIGludmFsaWQgZm9yIHBvbGljeSB3aXRoIGNhY2hpbmcgZGlzYWJsZWRcIiksIHNvIHN1Y2ggYVxuICogcG9saWN5IGhhcyB0byBkcm9wIHRoZSBrZXkuIFVudGlsIHRoZSBkZWZhdWx0IFRUTCBiZWNhbWUgMCB0aGlzIGNvdWxkIG5vdFxuICogY29tZSB1cDogQ0RLIHJhaXNlcyBgbWF4VHRsYCB0byBgZGVmYXVsdFR0bGAgd2hlbiBpdCBpcyBsb3dlciwgc28gYW4gb3ZlcnJpZGVcbiAqIG9mIGBtYXhUdGw6IDBgIHN5bnRoZXNpemVkIGFzIGEgZGF5IGFuZCBkZXBsb3llZC4gTm93IGl0IGlzIGhvbm9yZWQsIGFuZFxuICogd2l0aG91dCB0aGlzIHRoZSB1cGdyYWRlIGRlcGxveSB3b3VsZCBmYWlsLlxuICpcbiAqIFRoZSBUVExzIGFyZSByZXNvbHZlZCB0aGUgd2F5IENESyByZXNvbHZlcyB0aGVtOiBgZGVmYXVsdFR0bGAgcmFpc2VkIHRvXG4gKiBgbWluVHRsYCwgdGhlbiBgbWF4VHRsYCByYWlzZWQgdG8gYGRlZmF1bHRUdGxgLiBDaGVja2luZyBgbWF4VHRsYCBhbG9uZSBjYWxsZWRcbiAqIGB7IG1heFR0bDogMCwgZGVmYXVsdFR0bDogMWggfWAgZGlzYWJsZWQsIGRyb3BwZWQgdGhlIGtleSwgYW5kIENESyB0aGVuXG4gKiBzeW50aGVzaXplZCBhIHBvbGljeSB0aGF0IGNhY2hlcyBmb3IgYW4gaG91ciBrZXllZCBvbiBub3RoaW5nIOKAlCBvbmUgdmlld2VyJ3NcbiAqIHBhZ2Ugc2VydmVkIHRvIGV2ZXJ5IHZpZXdlci5cbiAqL1xuZnVuY3Rpb24gaXNDYWNoaW5nRGlzYWJsZWQocHJvcHM6IENhY2hlUG9saWN5UHJvcHMgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgY29uc3QgdHRscyA9IFtwcm9wcz8ubWF4VHRsLCBwcm9wcz8uZGVmYXVsdFR0bCwgcHJvcHM/Lm1pblR0bF07XG4gIGlmIChwcm9wcz8ubWF4VHRsID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTsgLy8gQ0RLJ3MgZGVmYXVsdCBpcyBhIHllYXJcbiAgcmV0dXJuIHR0bHMuZXZlcnkoXG4gICAgKHR0bCkgPT5cbiAgICAgIHR0bCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAoIVRva2VuLmlzVW5yZXNvbHZlZCh0dGwudG9TdHJpbmcoKSkgJiYgdHRsLnRvU2Vjb25kcygpID09PSAwKSxcbiAgKTtcbn1cblxuLyoqIFRoZSBjYWNoZS1rZXkgaGFsZiBvZiB7QGxpbmsgQ2FjaGVQb2xpY3lQcm9wc30uICovXG5pbnRlcmZhY2UgQ2FjaGVLZXlQcm9wcyB7XG4gIHJlYWRvbmx5IHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvcjtcbiAgcmVhZG9ubHkgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3I7XG4gIHJlYWRvbmx5IGNvb2tpZUJlaGF2aW9yOiBDYWNoZUNvb2tpZUJlaGF2aW9yO1xuICByZWFkb25seSBlbmFibGVBY2NlcHRFbmNvZGluZ0Jyb3RsaTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIGR5bmFtaWMgY2FjaGUgcG9saWN5IGtleXMgb246IGV2ZXJ5IHJlcXVlc3QgaW5wdXQgYSBOZXh0LmpzIHJlc3BvbnNlXG4gKiB2YXJpZXMgYnkuXG4gKi9cbmNvbnN0IERZTkFNSUNfQ0FDSEVfS0VZOiBDYWNoZUtleVByb3BzID0ge1xuICBxdWVyeVN0cmluZ0JlaGF2aW9yOiBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsKCksXG4gIGhlYWRlckJlaGF2aW9yOiBDYWNoZUhlYWRlckJlaGF2aW9yLmFsbG93TGlzdChcbiAgICAvLyBOT1RFOiBDbG91ZEZyb250IEN1c3RvbSBDYWNoZSBQb2xpY2llcyBoYXZlIHNvZnQgbWF4IG9mIDEwIGhlYWRlcnNcbiAgICAvLyBjZGstbmV4dGpzIGluY2x1ZGVzIHRoZSBtb3N0IGVzc2VudGlhbCBoZWFkZXJzIGZvciBOZXh0LmpzIGZ1bmN0aW9uYWxpdHlcbiAgICAvLyBhbmQgbGVhdmVzIG91dCB0aGUgb25lIGNvbW1lbnRlZCBvdXQgYmVsb3c7IGtleWluZyBvbiBpdCBhcyB3ZWxsIG5lZWRzIGFcbiAgICAvLyBxdW90YSBpbmNyZWFzZVxuICAgIC8vIG1vcmUgaGVyZTogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Nsb3VkZnJvbnQtbGltaXRzLmh0bWwjbGltaXRzLXBvbGljaWVzXG4gICAgXCJhY2NlcHRcIiwgLy8gY29udGVudCBuZWdvdGlhdGlvbiAoSFRNTCB2cyBSU0MgcGF5bG9hZClcbiAgICBcInJzY1wiLCAvLyBSZWFjdCBTZXJ2ZXIgQ29tcG9uZW50cyByZXF1ZXN0c1xuICAgIFwibmV4dC11cmxcIiwgLy8gTmV4dC5qcyByb3V0aW5nXG4gICAgXCJuZXh0LXJvdXRlci1zdGF0ZS10cmVlXCIsIC8vIEFwcCBSb3V0ZXIgbmF2aWdhdGlvbiBzdGF0ZVxuICAgIFwibmV4dC1yb3V0ZXItcHJlZmV0Y2hcIiwgLy8gcHJlZmV0Y2ggYmVoYXZpb3JcbiAgICBcIm5leHQtcm91dGVyLXNlZ21lbnQtcHJlZmV0Y2hcIiwgLy8gc2VnbWVudC1sZXZlbCBwcmVmZXRjaGluZ1xuICAgIFwieC1wcmVyZW5kZXItcmV2YWxpZGF0ZVwiLCAvLyBvbi1kZW1hbmQgSVNSIHJldmFsaWRhdGlvblxuICAgIC8vIERyYWZ0IG1vZGUgbmVlZHMgbm8gaGVhZGVyOiBpdCBpcyB0aGUgYF9fcHJlcmVuZGVyX2J5cGFzc2AgY29va2llLCB3aGljaFxuICAgIC8vIGBjb29raWVCZWhhdmlvci5hbGwoKWAgYWxyZWFkeSBrZXlzIG9uLlxuICAgIC8vIFwieC1wcmVyZW5kZXItcmV2YWxpZGF0ZS1pZi1nZW5lcmF0ZWRcIiwgLy8gY29uZGl0aW9uYWwgcmV2YWxpZGF0aW9uIChuaWNoZSB1c2UgY2FzZSlcbiAgKSxcbiAgY29va2llQmVoYXZpb3I6IENhY2hlQ29va2llQmVoYXZpb3IuYWxsKCksXG4gIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiB0cnVlLFxuICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IHRydWUsXG59O1xuXG4vKipcbiAqIEEgY2FjaGUga2V5IG9mIG5vdGhpbmcsIGZvciBhIHBvbGljeSB0aGF0IGNhY2hlcyBub3RoaW5nLiBGb3J3YXJkaW5nIGlzXG4gKiB1bmFmZmVjdGVkOiB0aGUgZHluYW1pYyBvcmlnaW4gcmVxdWVzdCBwb2xpY3kgc2VuZHMgZXZlcnkgdmlld2VyIGhlYWRlcixcbiAqIGNvb2tpZSBhbmQgcXVlcnkgc3RyaW5nIHJlZ2FyZGxlc3MuXG4gKi9cbmNvbnN0IERJU0FCTEVEX0NBQ0hFX0tFWTogQ2FjaGVLZXlQcm9wcyA9IHtcbiAgcXVlcnlTdHJpbmdCZWhhdmlvcjogQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLm5vbmUoKSxcbiAgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3Iubm9uZSgpLFxuICBjb29raWVCZWhhdmlvcjogQ2FjaGVDb29raWVCZWhhdmlvci5ub25lKCksXG4gIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiBmYWxzZSxcbiAgZW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiBmYWxzZSxcbn07XG5cbi8qKlxuICogQ2xvdWRGcm9udCdzIGRlZmF1bHQgXCJDYWNoZSBiZWhhdmlvcnMgcGVyIGRpc3RyaWJ1dGlvblwiIHF1b3RhLCB0aGUgZGVmYXVsdFxuICogYmVoYXZpb3IgaW5jbHVkZWQuIEFkanVzdGFibGUsIGhlbmNlIGBtYXhDYWNoZUJlaGF2aW9yc2AuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY2xvdWRmcm9udC1saW1pdHMuaHRtbCNsaW1pdHMtd2ViLWRpc3RyaWJ1dGlvbnNcbiAqL1xuY29uc3QgREVGQVVMVF9NQVhfQ0FDSEVfQkVIQVZJT1JTID0gNzU7XG5cbi8qKlxuICogV2hldGhlciBgY2hhcmAgaXMgaW4gQ2xvdWRGcm9udCdzIHBhdGggcGF0dGVybiBhbHBoYWJldDogdGhlIGxpdGVyYWxzLCBwbHVzIHRoZVxuICogYCpgIGFuZCBgP2Agd2lsZGNhcmRzLiBObyBzcGFjZSwgbm8gYCVgLCBub3RoaW5nIG5vbi1BU0NJSS5cbiAqL1xuZnVuY3Rpb24gaXNQYXRoUGF0dGVybkNoYXIoY2hhcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaGFyID09PSBcIipcIiB8fCBjaGFyID09PSBcIj9cIiB8fCBQQVRIX1BBVFRFUk5fTElURVJBTC50ZXN0KGNoYXIpO1xufVxuLyoqIENsb3VkRnJvbnQncyBwYXRoIHBhdHRlcm4gbGVuZ3RoIGxpbWl0LiAqL1xuY29uc3QgTUFYX1BBVEhfUEFUVEVSTl9MRU5HVEggPSAyNTU7XG5cbi8qKlxuICogQSBgcHVibGljL2AgZW50cnkncyBuYW1lIGFzIGEgQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4uXG4gKlxuICogYHB1YmxpYy9oZWxsbyB3b3JsZC5qcGdgIGlzIGEgdmFsaWQgTmV4dC5qcyBhc3NldCDigJQgYG5leHQgc3RhcnRgIHNlcnZlcyBpdCwgYW5kXG4gKiBgbmV4dC9pbWFnZWAgcG9pbnRzIGF0IGl0IOKAlCBidXQgYSBzcGFjZSBjYW5ub3QgYXBwZWFyIGluIGEgcGF0aCBwYXR0ZXJuLCBzb1xuICogY2RrLW5leHRqcyB1c2VkIHRvIHRocm93IGF0IHN5bnRoIGFuZCB0aGUgYXBwIGNvdWxkIG5vdCBiZSBkZXBsb3llZCBhdCBhbGxcbiAqIChgbmV4dC1pbWFnZS1sZWdhY3kvdW5pY29kZWAsIHdob3NlIGBwdWJsaWMvYCBhbHNvIGhvbGRzIGDDpMO2w7zFocSNxZnDrS5wbmdgKS5cbiAqXG4gKiBDbG91ZEZyb250IFVSTC1kZWNvZGVzIHRoZSByZXF1ZXN0IHBhdGggYmVmb3JlIG1hdGNoaW5nIGl0LCBzbyB0aGUgcGF0dGVybiBpc1xuICogbWF0Y2hlZCBhZ2FpbnN0IGBoZWxsbyB3b3JsZC5qcGdgLCBub3QgdGhlIGAvaGVsbG8lMjB3b3JsZC5qcGdgIG9uIHRoZSB3aXJlLlxuICogRWFjaCBjaGFyYWN0ZXIgb3V0c2lkZSB0aGUgYWxwaGFiZXQgaXMgcmVwbGFjZWQgYnkgb25lIGA/YCBwZXIgYnl0ZSBvZiBpdHNcbiAqIFVURi04IGVuY29kaW5nLCBiZWNhdXNlIHRoYXQgaXMgd2hhdCBgP2AgbWF0Y2hlczogYGhlbGxvP3dvcmxkLmpwZ2AgZm9yIHRoZVxuICogc3BhY2UsIGFuZCB0d28gYD9gIGZvciBlYWNoIGNoYXJhY3RlciBvZiBgw6TDtsO8xaHEjcWZw60ucG5nYC4gTWVhc3VyZWQgYWdhaW5zdCBhXG4gKiBkZXBsb3llZCBkaXN0cmlidXRpb247IGEgYD9gIHBlciAqcGVyY2VudC1lbmNvZGVkKiBjaGFyYWN0ZXIgKGBoZWxsbz8/P3dvcmxkYClcbiAqIHN5bnRoZXNpemVzIGZpbmUgYW5kIG5ldmVyIG1hdGNoZXMuIEEgYCpgIHdvdWxkIGJlIHNob3J0ZXIgYW5kIG11Y2ggd2lkZXI6XG4gKiBgw6TDtsO8xaHEjcWZw60ucG5nYCB3b3VsZCBiZWNvbWUgYCoucG5nYCwgd2hpY2ggd291bGQgcHVsbCBldmVyeSBgLnBuZ2AgcmVxdWVzdCBpblxuICogdGhlIGFwcCBvbnRvIHRoZSBzdGF0aWMgb3JpZ2luLlxuICovXG5mdW5jdGlvbiB0b1BhdGhQYXR0ZXJuKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBbLi4ubmFtZV1cbiAgICAubWFwKChjaGFyKSA9PlxuICAgICAgaXNQYXRoUGF0dGVybkNoYXIoY2hhcilcbiAgICAgICAgPyBjaGFyXG4gICAgICAgIDogXCI/XCIucmVwZWF0KEJ1ZmZlci5ieXRlTGVuZ3RoKGNoYXIsIFwidXRmOFwiKSksXG4gICAgKVxuICAgIC5qb2luKFwiXCIpO1xufVxuIl19
|
|
906
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWRpc3RyaWJ1dGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtZGlzdHJpYnV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBa0U7QUFFbEUsK0RBK0JvQztBQUNwQywrRUFNNEM7QUFFNUMsdURBQXFFO0FBRXJFLDJDQUF1QztBQUN2QywrREFJbUM7QUFDbkMsMkNBQXFEO0FBT3JELGlEQUF1RTtBQUN2RSwrRUFPMEM7QUE2STFDLE1BQWEsa0JBQW1CLFNBQVEsc0JBQVM7O0lBQy9DLFlBQVksQ0FBZTtJQUVuQixLQUFLLENBQTBCO0lBQ3ZDOzs7OztPQUtHO0lBQ0ssUUFBUSxDQUFTO0lBQ3pCOzs7OztPQUtHO0lBQ0ssV0FBVyxDQUFTO0lBQzVCOzs7T0FHRztJQUNLLDZCQUE2QixHQUFvQztRQUN2RSxrQkFBa0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7UUFDdkMsWUFBWSxFQUFFO1lBQ1osV0FBVyxFQUFFLG1DQUFrQixDQUFDLFVBQVU7WUFDMUMsUUFBUSxFQUFFLEtBQUs7U0FDaEI7UUFDRCxjQUFjLEVBQUU7WUFDZCxRQUFRLEVBQUUsS0FBSztZQUNmLGNBQWMsRUFBRSxzQ0FBcUIsQ0FBQywrQkFBK0I7U0FDdEU7UUFFRCx1QkFBdUIsRUFBRTtZQUN2QixtQkFBbUIsRUFBRSxzQkFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDdkMsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixRQUFRLEVBQUUsS0FBSztZQUNmLE9BQU8sRUFBRSxJQUFJO1NBQ2Q7UUFDRCxhQUFhLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRTtLQUN0RSxDQUFDO0lBQ00sWUFBWSxDQUFVO0lBQ3RCLGFBQWEsQ0FBVTtJQUN2QiwyQkFBMkIsQ0FBdUI7SUFDbEQscUNBQXFDLENBQXdCO0lBQ3JFOzs7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Q2pDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztTQUNiLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ1osaUJBQWlCLENBQUMsSUFBSSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxJQUFJO1FBQ04sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FDaEQ7U0FDQSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbnMsIER1cmF0aW9uLCBTdGFjaywgVG9rZW4gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IElDZXJ0aWZpY2F0ZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBBY2Nlc3NMZXZlbCxcbiAgQWRkQmVoYXZpb3JPcHRpb25zLFxuICBBbGxvd2VkTWV0aG9kcyxcbiAgQmVoYXZpb3JPcHRpb25zLFxuICBDYWNoZUNvb2tpZUJlaGF2aW9yLFxuICBDYWNoZUhlYWRlckJlaGF2aW9yLFxuICBDYWNoZVBvbGljeSxcbiAgQ2FjaGVQb2xpY3lQcm9wcyxcbiAgQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLFxuICBDYWNoZWRNZXRob2RzLFxuICBGdW5jdGlvbiBhcyBDbG91ZEZyb250RnVuY3Rpb24sXG4gIERpc3RyaWJ1dGlvbixcbiAgRnVuY3Rpb25Bc3NvY2lhdGlvbixcbiAgRnVuY3Rpb25Db2RlLFxuICBGdW5jdGlvbkV2ZW50VHlwZSxcbiAgRnVuY3Rpb25Qcm9wcyxcbiAgRnVuY3Rpb25SdW50aW1lLFxuICBIZWFkZXJzRnJhbWVPcHRpb24sXG4gIEhlYWRlcnNSZWZlcnJlclBvbGljeSxcbiAgSHR0cFZlcnNpb24sXG4gIElLZXlWYWx1ZVN0b3JlLFxuICBJT3JpZ2luLFxuICBJT3JpZ2luUmVxdWVzdFBvbGljeSxcbiAgT3JpZ2luUHJvdG9jb2xQb2xpY3ksXG4gIE9yaWdpblJlcXVlc3RQb2xpY3ksXG4gIFJlc3BvbnNlSGVhZGVyc1BvbGljeSxcbiAgUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHMsXG4gIFJlc3BvbnNlU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IsXG4gIFNlY3VyaXR5UG9saWN5UHJvdG9jb2wsXG4gIFZpZXdlclByb3RvY29sUG9saWN5LFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnRcIjtcbmltcG9ydCB7XG4gIEZ1bmN0aW9uVXJsT3JpZ2luLFxuICBGdW5jdGlvblVybE9yaWdpbldpdGhPQUNQcm9wcyxcbiAgUzNCdWNrZXRPcmlnaW4sXG4gIFZwY09yaWdpbixcbiAgVnBjT3JpZ2luV2l0aEVuZHBvaW50UHJvcHMsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zXCI7XG5pbXBvcnQgeyBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjJcIjtcbmltcG9ydCB7IENmblBlcm1pc3Npb24sIElGdW5jdGlvblVybCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBJQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIGNsb3VkRnJvbnRQYXR0ZXJuUmVnZXgsXG4gIERFRkFVTFRfRlVOQ1RJT05fR1JPVVAsXG4gIFBBVEhfUEFUVEVSTl9MSVRFUkFMLFxufSBmcm9tIFwiLi9hZGFwdGVyL2Z1bmN0aW9uLWdyb3Vwc1wiO1xuaW1wb3J0IHsgTE9HX1BSRUZJWCwgTmV4dGpzVHlwZSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxEaXN0cmlidXRpb25Qcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsRGlzdHJpYnV0aW9uUHJvcHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsUzNPcmlnaW5CdWNrZXRXaXRoT0FDUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbFMzT3JpZ2luQnVja2V0V2l0aE9BQ1Byb3BzXCI7XG5pbXBvcnQge1xuICBOZXh0anNGdW5jdGlvbkdyb3VwQmVoYXZpb3IsXG4gIFB1YmxpY0RpckVudHJ5LFxufSBmcm9tIFwiLi9uZXh0anMtYnVpbGQvbmV4dGpzLWJ1aWxkXCI7XG5pbXBvcnQgeyBhc3NldFByZWZpeFBhdGgsIG5vcm1hbGl6ZUJhc2VQYXRoIH0gZnJvbSBcIi4vdXRpbHMvYmFzZS1wYXRoXCI7XG5pbXBvcnQge1xuICBhc3NldFByZWZpeFJld3JpdGVIYW5kbGVyLFxuICBjaGVja1ZpZXdlclJlcXVlc3RDb2RlLFxuICBNQVhfRlVOQ1RJT05fQ09ERV9CWVRFUyxcbiAgUEFTU19USFJPVUdIX0hBTkRMRVIsXG4gIHNwbGljZVZpZXdlclJlcXVlc3QsXG4gIFhfRk9SV0FSREVEX0hPU1RfSEFORExFUixcbn0gZnJvbSBcIi4vdXRpbHMvdmlld2VyLXJlcXVlc3QtZnVuY3Rpb25zXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGlzdHJpYnV0aW9uT3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgZGlzdHJpYnV0aW9uUHJvcHM/OiBPcHRpb25hbERpc3RyaWJ1dGlvblByb3BzO1xuICByZWFkb25seSBpbWFnZUJlaGF2aW9yT3B0aW9ucz86IEFkZEJlaGF2aW9yT3B0aW9ucztcbiAgcmVhZG9ubHkgaW1hZ2VDYWNoZVBvbGljeVByb3BzPzogQ2FjaGVQb2xpY3lQcm9wcztcbiAgcmVhZG9ubHkgaW1hZ2VSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcz86IFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzO1xuICByZWFkb25seSBkeW5hbWljQmVoYXZpb3JPcHRpb25zPzogQWRkQmVoYXZpb3JPcHRpb25zO1xuICByZWFkb25seSBkeW5hbWljQ2FjaGVQb2xpY3lQcm9wcz86IENhY2hlUG9saWN5UHJvcHM7XG4gIHJlYWRvbmx5IGR5bmFtaWNSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcz86IFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzO1xuICByZWFkb25seSBkeW5hbWljRnVuY3Rpb25VcmxPcmlnaW5XaXRoT0FDUHJvcHM/OiBGdW5jdGlvblVybE9yaWdpbldpdGhPQUNQcm9wcztcbiAgcmVhZG9ubHkgZHluYW1pY1ZwY09yaWdpbldpdGhFbmRwb2ludFByb3BzPzogVnBjT3JpZ2luV2l0aEVuZHBvaW50UHJvcHM7XG4gIHJlYWRvbmx5IHN0YXRpY0JlaGF2aW9yT3B0aW9ucz86IEFkZEJlaGF2aW9yT3B0aW9ucztcbiAgcmVhZG9ubHkgc3RhdGljUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHM/OiBSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcztcbiAgcmVhZG9ubHkgczNCdWNrZXRPcmlnaW5Qcm9wcz86IE9wdGlvbmFsUzNPcmlnaW5CdWNrZXRXaXRoT0FDUHJvcHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHMge1xuICAvKipcbiAgICogQnVja2V0IGNvbnRhaW5pbmcgc3RhdGljIGFzc2V0cy5cbiAgICogTXVzdCBiZSBwcm92aWRlZCBpZiB5b3Ugd2FudCB0byBzZXJ2ZSBzdGF0aWMgZmlsZXMuXG4gICAqL1xuICByZWFkb25seSBhc3NldHNCdWNrZXQ6IElCdWNrZXQ7XG4gIC8qKlxuICAgKiBUaGUgYXBwJ3Mgb3duIGBhc3NldFByZWZpeGAuIE5leHQuanMgZW1pdHMgYDxhc3NldFByZWZpeD4vX25leHQvc3RhdGljLy4uLmBcbiAgICogZm9yIGV2ZXJ5IGJ1bmRsZSB3aGlsZSB0aGUgb2JqZWN0cyBzdGF5IGF0IGA8YmFzZVBhdGg+L19uZXh0L3N0YXRpYy8uLi5gIGluXG4gICAqIFMzLCBzbyB0aGUgcHJlZml4J3MgcGF0aCBnZXRzIGEgY2FjaGUgYmVoYXZpb3Igb2YgaXRzIG93biB0aGF0IHJld3JpdGVzIGl0XG4gICAqIGF3YXkuXG4gICAqXG4gICAqIEVpdGhlciBmb3JtIGlzIGFjY2VwdGVkOiBhIHBhdGggKFwiL2NkblwiKSwgb3IgYW4gYWJzb2x1dGUgVVJMLCBpbiB3aGljaCBjYXNlXG4gICAqIG9ubHkgaXRzIHBhdGggY291bnRzIChcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2NkblwiIGJlaGF2ZXMgYXMgXCIvY2RuXCIsIGFuZFxuICAgKiBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tXCIgbmVlZHMgbm8gYmVoYXZpb3IgYXQgYWxsKS4gQW4gYWJzb2x1dGUgcHJlZml4J3MgcGF0aFxuICAgKiBtYXR0ZXJzIGJlY2F1c2UgYG5leHQgYnVpbGRgIGNvbXBpbGVzIGEgYC9jZG4vX25leHQvOnBhdGgrYCByZXdyaXRlIG9mIGl0c1xuICAgKiBvd24sIHNvIGBuZXh0IHN0YXJ0YCBzZXJ2ZXMgZXZlcnkgYnVuZGxlIHVuZGVyIGl0IOKAlCBhIENETiBmcm9udGluZyB0aGlzXG4gICAqIGRpc3RyaWJ1dGlvbiB0aGVyZSBoYXMgdG8gYmUgYW5zd2VyZWQgdG9vLlxuICAgKlxuICAgKiBBcHBsaWVkIG9uIHRvcCBvZiBgYmFzZVBhdGhgLCBub3QgdW5kZXIgaXQsIGJlY2F1c2UgdGhhdCBpcyBob3cgTmV4dC5qc1xuICAgKiBidWlsZHMgdGhlIFVSTC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lOyBwYXNzIGBOZXh0anNCdWlsZC5uZXh0Q29uZmlnQXNzZXRQcmVmaXhQYXRoYFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXRQcmVmaXg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBVUkkgcGF0aCBwcmVmaXggdGhlIGFwcCBpcyBzZXJ2ZWQgYXQuIFN1cnJvdW5kaW5nIHNsYXNoZXMgYXJlIG5vcm1hbGl6ZWRcbiAgICogYXdheSwgc28gXCIvYmFzZVwiLCBcImJhc2VcIiBhbmQgXCIvYmFzZS9cIiBhbGwgcHJvZHVjZSB0aGUgc2FtZSBjYWNoZSBiZWhhdmlvcnMuXG4gICAqL1xuICByZWFkb25seSBiYXNlUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGJ1dCBvbmx5IGFwcGxpY2FibGUgZm9yIGBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTYFxuICAgKi9cbiAgcmVhZG9ubHkgY2VydGlmaWNhdGU/OiBJQ2VydGlmaWNhdGU7XG4gIHJlYWRvbmx5IGRpc3RyaWJ1dGlvbj86IERpc3RyaWJ1dGlvbjtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGlmIGBOZXh0anNUeXBlLkdMT0JBTF9GVU5DVElPTlNgXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvblVybD86IElGdW5jdGlvblVybDtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGlmIGBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTYCBvciBgTmV4dGpzVHlwZS5SRUdJT05BTF9DT05UQUlORVJTYFxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZEJhbGFuY2VyPzogSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyO1xuICByZWFkb25seSBuZXh0anNUeXBlOiBOZXh0anNUeXBlO1xuICAvKipcbiAgICogT3ZlcnJpZGUgcHJvcHMgZm9yIGV2ZXJ5IGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc0Rpc3RyaWJ1dGlvbk92ZXJyaWRlcztcbiAgLyoqXG4gICAqIEVudHJpZXMgKGZpbGVzL2RpcmVjdG9yaWVzKSB3aXRoaW4gTmV4dC5qcyBhcHAncyBwdWJsaWMgZGlyZWN0b3J5LiBVc2VkIHRvXG4gICAqIGFkZCBzdGF0aWMgYmVoYXZpb3JzIHRvIGRpc3RyaWJ1dGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpY0RpckVudHJpZXM6IFB1YmxpY0RpckVudHJ5W107XG4gIC8qKlxuICAgKiBUaGUgYFNlcnZpY2UtV29ya2VyLUFsbG93ZWRgIGhlYWRlciBmb3IgYF9uZXh0L3N0YXRpYy9zZXJ2aWNlLXdvcmtlci8qYCxcbiAgICogd2hpY2ggTmV4dC5qcyBzZW5kcyBzbyBhIGNvbXBpbGVkIHNlcnZpY2Ugd29ya2VyIGNhbiByZWdpc3RlciBhdCBhIHNjb3BlXG4gICAqIHdpZGVyIHRoYW4gaXRzIG93biBkaXJlY3RvcnksIHN1Y2ggYXMgYC9gLiBTMyBjYW4ndCBzZW5kIGFuIGFyYml0cmFyeVxuICAgKiBoZWFkZXIsIHNvIHNldHRpbmcgdGhpcyBhZGRzIGEgYmVoYXZpb3IgZm9yIHRob3NlIGZpbGVzIHdob3NlIHJlc3BvbnNlXG4gICAqIGhlYWRlcnMgcG9saWN5IGRvZXMuIE5leHQuanMgdXNlcyB0aGUgYXBwJ3MgYGJhc2VQYXRoYCwgb3IgYC9gIGZvciBub25lLlxuICAgKiBAZGVmYXVsdCAtIG5vIGJlaGF2aW9yOyB0aGUgYnVpbGQgaGFzIG5vIHNlcnZpY2Ugd29ya2VyXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlV29ya2VyQWxsb3dlZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBub24tYGRlZmF1bHRgIGZ1bmN0aW9uIGdyb3VwcywgdGhlIG9yaWdpbnNcbiAgICoge0BsaW5rIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnN9IHJvdXRlIHRvLlxuICAgKiBAZGVmYXVsdCAtIG5vIHNwbGl0dGluZzsgdGhlIGRlZmF1bHQgYmVoYXZpb3Igc2VydmVzIGV2ZXJ5IGR5bmFtaWMgcm91dGVcbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uR3JvdXBzPzogTmV4dGpzRGlzdHJpYnV0aW9uRnVuY3Rpb25Hcm91cFtdO1xuICAvKipcbiAgICogYE5leHRqc0J1aWxkLmZ1bmN0aW9uR3JvdXBCZWhhdmlvcnNgOiBvbmUgY2FjaGUgYmVoYXZpb3IgZWFjaCwgYWRkZWQgaW5cbiAgICogb3JkZXIsIHNvIHRoZSByb3V0ZXMgZWFjaCBncm91cCB3YXMgcGFja2FnZWQgd2l0aCByZWFjaCBpdCByYXRoZXIgdGhhbiB0aGVcbiAgICogZGVmYXVsdCBmdW5jdGlvbi5cbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzPzogTmV4dGpzRnVuY3Rpb25Hcm91cEJlaGF2aW9yW107XG4gIC8qKlxuICAgKiBUaGUgbW9zdCBjYWNoZSBiZWhhdmlvcnMgdGhlIGRpc3RyaWJ1dGlvbiBtYXkgaGF2ZSwgdGhlIGRlZmF1bHQgb25lXG4gICAqIGluY2x1ZGVkLiBjZGstbmV4dGpzIGNvdW50cyB3aGF0IGl0IGFkZHMgYWdhaW5zdCB0aGlzIGF0IHN5bnRoLCBzbyBydW5uaW5nXG4gICAqIG91dCBpcyBhIHN5bnRoIGVycm9yIG5hbWluZyB3aGF0IHVzZWQgdGhlbSByYXRoZXIgdGhhbiBhIGZhaWxlZCBkZXBsb3kuXG4gICAqXG4gICAqIFJhaXNlIGl0IGFmdGVyIHJhaXNpbmcgdGhlIFwiQ2FjaGUgYmVoYXZpb3JzIHBlciBkaXN0cmlidXRpb25cIiBxdW90YSBmb3JcbiAgICogeW91ciBhY2NvdW50LiBMb3dlciBpdCBieSB0aGUgYmVoYXZpb3JzIGEgc3VwcGxpZWQge0BsaW5rIGRpc3RyaWJ1dGlvbn1cbiAgICogKG9yIGBvdmVycmlkZXMuZGlzdHJpYnV0aW9uUHJvcHNgKSBhbHJlYWR5IGhhcywgd2hpY2ggYXJlIG5vdCBjb3VudGVkLlxuICAgKiBAZGVmYXVsdCA3NSAtIENsb3VkRnJvbnQncyBkZWZhdWx0IHF1b3RhXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Nsb3VkZnJvbnQtbGltaXRzLmh0bWwjbGltaXRzLXdlYi1kaXN0cmlidXRpb25zXG4gICAqL1xuICByZWFkb25seSBtYXhDYWNoZUJlaGF2aW9ycz86IG51bWJlcjtcbiAgLyoqXG4gICAqIENsb3VkRnJvbnQgRnVuY3Rpb24gY29kZSBydW4gZmlyc3Qgb24gZXZlcnkgdmlld2VyIHJlcXVlc3QsIG9uIGV2ZXJ5XG4gICAqIGJlaGF2aW9yIGNkay1uZXh0anMgYWRkcywgc3RhdGljIGFzc2V0cyBpbmNsdWRlZCDigJQgSFRUUCBCYXNpYyBhdXRoIG9uIGFcbiAgICogcHJlLWxhdW5jaCBzaXRlLCBnZW8tZ2F0aW5nLlxuICAgKlxuICAgKiBJdCBtdXN0IGRlZmluZSBgdmlld2VyUmVxdWVzdChldmVudClgIChhIGZ1bmN0aW9uLCBzeW5jIG9yIGFzeW5jLCBvciBhXG4gICAqIGB2YXJgL2BsZXRgL2Bjb25zdGApOiByZXR1cm4gYSByZXNwb25zZSB0byBhbnN3ZXIgdGhlIHZpZXdlciwgb3IgdGhlXG4gICAqIHJlcXVlc3QgKG9yIG5vdGhpbmcpIHRvIGNhcnJ5IG9uLiBJdCBpcyBzcGxpY2VkIGludG8gY2RrLW5leHRqcydzIG93blxuICAgKiB2aWV3ZXItcmVxdWVzdCBmdW5jdGlvbnMsIGFoZWFkIG9mIHRoZWlyIGxvZ2ljLCBzbyBpdCBtYXkgbm90IHVzZSB0aGVcbiAgICogbmFtZSBgaGFuZGxlcmAsIGFuZCB0aGUgY29tYmluZWQgZnVuY3Rpb24gbXVzdCBmaXQgQ2xvdWRGcm9udCdzIDEwIEtCLlxuICAgKiBJdCBydW5zIG9uIGBjbG91ZGZyb250LWpzLTIuMGAsIHNvIGl0IG1heSBiZSBhc3luYyBhbmQgcmVhZFxuICAgKiB7QGxpbmsgdmlld2VyUmVxdWVzdEtleVZhbHVlU3RvcmV9IHdpdGggYGNmLmt2cygpYC4gQSBicmluZy15b3VyLW93blxuICAgKiB7QGxpbmsgZGlzdHJpYnV0aW9ufSdzIGRlZmF1bHQgYmVoYXZpb3IgaXNuJ3QgY292ZXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nka2xhYnMvY2RrLW5leHRqcyNydW5uaW5nLWNvZGUtb24tZXZlcnktdmlld2VyLXJlcXVlc3RcbiAgICovXG4gIHJlYWRvbmx5IHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGU/OiBGdW5jdGlvbkNvZGU7XG4gIC8qKlxuICAgKiBBIENsb3VkRnJvbnQgS2V5VmFsdWVTdG9yZSBhc3NvY2lhdGVkIHdpdGggZXZlcnkgdmlld2VyLXJlcXVlc3QgZnVuY3Rpb25cbiAgICoge0BsaW5rIHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGV9IGlzIGNvcGllZCBpbnRvICh1cCB0byB0aHJlZSwgb25lIHBlciBraW5kXG4gICAqIG9mIGJlaGF2aW9yKSwgc28gdmFsdWVzIGl0IHJlYWRzIOKAlCBCYXNpYyBhdXRoIGNyZWRlbnRpYWxzLCBhbiBhbGxvd2xpc3Qg4oCUXG4gICAqIGxpdmUgb3V0c2lkZSB0aGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgYW5kIGNoYW5nZSB3aXRob3V0IGEgZGVwbG95LlxuICAgKiBSZWFkIGl0IHdpdGggYGNmLmt2cygpYCwgbm8gSUQgbmVlZGVkLlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvZnVuY3Rpb25zLWN1c3RvbS1tZXRob2RzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IHZpZXdlclJlcXVlc3RLZXlWYWx1ZVN0b3JlPzogSUtleVZhbHVlU3RvcmU7XG59XG5cbi8qKiBBIG5vbi1kZWZhdWx0IGZ1bmN0aW9uIGdyb3VwIGFuZCB0aGUgb3JpZ2luIGl0cyByb3V0ZXMgbXVzdCByZWFjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGlzdHJpYnV0aW9uRnVuY3Rpb25Hcm91cCB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqIFRoZSBncm91cCdzIExhbWJkYSBGdW5jdGlvbiBVUkwuICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uVXJsOiBJRnVuY3Rpb25Vcmw7XG59XG5cbmV4cG9ydCBjbGFzcyBOZXh0anNEaXN0cmlidXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBkaXN0cmlidXRpb246IERpc3RyaWJ1dGlvbjtcblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNEaXN0cmlidXRpb25Qcm9wcztcbiAgLyoqXG4gICAqIGBwcm9wcy5iYXNlUGF0aGAgbm9ybWFsaXplZCB0byBhIGJhcmUgcGF0aCBzZWdtZW50LiBUaGlzIGNvbnN0cnVjdCBpcyB0aGVcbiAgICogb25lIHBsYWNlIHRoYXQgbmVlZHMgaXQgd2l0aCBhIGxlYWRpbmcgc2xhc2gg4oCUIENsb3VkRnJvbnQgcGF0aCBwYXR0ZXJucyBhcmVcbiAgICogd3JpdHRlbiBhZ2FpbnN0IHRoZSByZXF1ZXN0IHBhdGgg4oCUIHNvIGl0IHByZXBlbmRzIGl0cyBvd24gcmF0aGVyIHRoYW5cbiAgICogcmVseWluZyBvbiB0aGUgY2FsbGVyIGhhdmluZyBwYXNzZWQgb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlUGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogYHByb3BzLmFzc2V0UHJlZml4YCBub3JtYWxpemVkIHRvIGEgbGVhZGluZy1zbGFzaCBwYXRoLCBgXCJcImAgd2hlbiB0aGUgYXBwXG4gICAqIHNldHMgbm9uZSBvciBzZXRzIG9uZSB0aGF0IGFscmVhZHkgZXF1YWxzIHRoZSBgYmFzZVBhdGhgIHByZWZpeCDigJQgaW4gd2hpY2hcbiAgICogY2FzZSB0aGUgb3JkaW5hcnkgYF9uZXh0L3N0YXRpYypgIGJlaGF2aW9yIGFscmVhZHkgY292ZXJzIGl0IGFuZCBhIHNlY29uZCBvbmVcbiAgICogd291bGQgYmUgYSBkdXBsaWNhdGUgcGF0dGVybiBDbG91ZEZyb250IHJlamVjdHMuXG4gICAqL1xuICBwcml2YXRlIGFzc2V0UHJlZml4OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb21tb24gc2VjdXJpdHkgaGVhZGVycyBhcHBsaWVkIGJ5IGRlZmF1bHQgdG8gYWxsIG9yaWdpbnNcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1yZXNwb25zZS1oZWFkZXJzLXBvbGljaWVzLmh0bWwjbWFuYWdlZC1yZXNwb25zZS1oZWFkZXJzLXBvbGljaWVzLXNlY3VyaXR5XG4gICAqL1xuICBwcml2YXRlIGNvbW1vblNlY3VyaXR5SGVhZGVyc0JlaGF2aW9yOiBSZXNwb25zZVNlY3VyaXR5SGVhZGVyc0JlaGF2aW9yID0ge1xuICAgIGNvbnRlbnRUeXBlT3B0aW9uczogeyBvdmVycmlkZTogZmFsc2UgfSxcbiAgICBmcmFtZU9wdGlvbnM6IHtcbiAgICAgIGZyYW1lT3B0aW9uOiBIZWFkZXJzRnJhbWVPcHRpb24uU0FNRU9SSUdJTixcbiAgICAgIG92ZXJyaWRlOiBmYWxzZSxcbiAgICB9LFxuICAgIHJlZmVycmVyUG9saWN5OiB7XG4gICAgICBvdmVycmlkZTogZmFsc2UsXG4gICAgICByZWZlcnJlclBvbGljeTogSGVhZGVyc1JlZmVycmVyUG9saWN5LlNUUklDVF9PUklHSU5fV0hFTl9DUk9TU19PUklHSU4sXG4gICAgfSxcblxuICAgIHN0cmljdFRyYW5zcG9ydFNlY3VyaXR5OiB7XG4gICAgICBhY2Nlc3NDb250cm9sTWF4QWdlOiBEdXJhdGlvbi5kYXlzKDM2NSksXG4gICAgICBpbmNsdWRlU3ViZG9tYWluczogdHJ1ZSxcbiAgICAgIG92ZXJyaWRlOiBmYWxzZSxcbiAgICAgIHByZWxvYWQ6IHRydWUsXG4gICAgfSxcbiAgICB4c3NQcm90ZWN0aW9uOiB7IG92ZXJyaWRlOiBmYWxzZSwgcHJvdGVjdGlvbjogdHJ1ZSwgbW9kZUJsb2NrOiB0cnVlIH0sXG4gIH07XG4gIHByaXZhdGUgc3RhdGljT3JpZ2luOiBJT3JpZ2luO1xuICBwcml2YXRlIGR5bmFtaWNPcmlnaW46IElPcmlnaW47XG4gIHByaXZhdGUgZHluYW1pY09yaWdpblJlc3BvbnNlUG9saWN5OiBJT3JpZ2luUmVxdWVzdFBvbGljeTtcbiAgcHJpdmF0ZSBkeW5hbWljQ2xvdWRGcm9udEZ1bmN0aW9uQXNzb2NpYXRpb25zOiBGdW5jdGlvbkFzc29jaWF0aW9uW107XG4gIC8qKlxuICAgKiBgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZWAsIHJlbmRlcmVkIGFuZCBjaGVja2VkIG9uY2UsIHNpbmNlXG4gICAqIGBGdW5jdGlvbkNvZGUuZnJvbUZpbGVgIHJlYWRzIHRoZSBmaWxlIG9uIGV2ZXJ5IHJlbmRlci5cbiAgICovXG4gIHByaXZhdGUgdmlld2VyUmVxdWVzdENvZGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdmlld2VyLXJlcXVlc3QgZnVuY3Rpb24gYHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGVgIGFkZHMgdG8gYmVoYXZpb3JzXG4gICAqIHdpdGggbm8gdmlld2VyLXJlcXVlc3QgbG9naWMgb2YgdGhlaXIgb3duLCBzaGFyZWQgYnkgYWxsIG9mIHRoZW0sIHNvIHRoZVxuICAgKiBgYXNzZXRQcmVmaXhgIGJlaGF2aW9yLCB3aGljaCBoYXMgYSB2aWV3ZXItcmVxdWVzdCBmdW5jdGlvbiBvZiBpdHMgb3duLFxuICAgKiBjYW4gdGVsbCBpdCBmcm9tIGFuIG92ZXJyaWRlJ3MuXG4gICAqL1xuICBwcml2YXRlIHBhc3NUaHJvdWdoRnVuY3Rpb24/OiBDbG91ZEZyb250RnVuY3Rpb247XG4gIHByaXZhdGUgaXNGdW5jdGlvbkNvbXB1dGU6IGJvb2xlYW47XG4gIHByaXZhdGUgc3RhdGljQmVoYXZpb3JPcHRpb25zOiBCZWhhdmlvck9wdGlvbnM7XG4gIHByaXZhdGUgZHluYW1pY0JlaGF2aW9yT3B0aW9uczogQmVoYXZpb3JPcHRpb25zO1xuICBwcml2YXRlIGltYWdlQmVoYXZpb3JPcHRpb25zOiBCZWhhdmlvck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5leHRqc0Rpc3RyaWJ1dGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgaWYgKHByb3BzLnZpZXdlclJlcXVlc3RLZXlWYWx1ZVN0b3JlICYmICFwcm9wcy52aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IFxcYHZpZXdlclJlcXVlc3RLZXlWYWx1ZVN0b3JlXFxgIGlzIG9ubHkgYXNzb2NpYXRlZCB3aXRoIGAgK1xuICAgICAgICAgIGB0aGUgZnVuY3Rpb25zIFxcYHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGVcXGAgcnVucyBpbiwgc28gaXQgbmVlZHMgYCArXG4gICAgICAgICAgYFxcYHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGVcXGAgdG8gcmVhZCBpdC5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy52aWV3ZXJSZXF1ZXN0Q29kZSA9IHRoaXMucmVuZGVyVmlld2VyUmVxdWVzdENvZGUoKTtcbiAgICB0aGlzLmJhc2VQYXRoID0gbm9ybWFsaXplQmFzZVBhdGgocHJvcHMuYmFzZVBhdGgpO1xuICAgIHRoaXMuYXNzZXRQcmVmaXggPSB0aGlzLnJlc29sdmVBc3NldFByZWZpeCgpO1xuICAgIHRoaXMuc3RhdGljT3JpZ2luID0gdGhpcy5jcmVhdGVTdGF0aWNPcmlnaW4oKTtcbiAgICB0aGlzLmlzRnVuY3Rpb25Db21wdXRlID0gcHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TO1xuICAgIHRoaXMudmFsaWRhdGVGdW5jdGlvbkdyb3VwUHJvcHMoKTtcbiAgICB0aGlzLmR5bmFtaWNPcmlnaW4gPSB0aGlzLmNyZWF0ZUR5bmFtaWNPcmlnaW4oKTtcbiAgICB0aGlzLmR5bmFtaWNPcmlnaW5SZXNwb25zZVBvbGljeSA9IHRoaXMuY3JlYXRlRHluYW1pY09yaWdpblJlcXVlc3RQb2xpY3koKTtcbiAgICB0aGlzLmR5bmFtaWNDbG91ZEZyb250RnVuY3Rpb25Bc3NvY2lhdGlvbnMgPVxuICAgICAgdGhpcy5jcmVhdGVEeW5hbWljQ2xvdWRGcm9udEZ1bmN0aW9uQXNzb2NpYXRpb25zKCk7XG4gICAgdGhpcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMgPSB0aGlzLmNyZWF0ZVN0YXRpY0JlaGF2aW9yT3B0aW9ucygpO1xuICAgIHRoaXMuZHluYW1pY0JlaGF2aW9yT3B0aW9ucyA9IHRoaXMuY3JlYXRlRHluYW1pY0JlaGF2aW9yT3B0aW9ucygpO1xuICAgIHRoaXMuaW1hZ2VCZWhhdmlvck9wdGlvbnMgPSB0aGlzLmNyZWF0ZUltYWdlQmVoYXZpb3JPcHRpb25zKCk7XG4gICAgdGhpcy5kaXN0cmlidXRpb24gPSB0aGlzLmdldERpc3RyaWJ1dGlvbigpO1xuICAgIGlmICh0aGlzLmlzRnVuY3Rpb25Db21wdXRlKSB7XG4gICAgICB0aGlzLmdyYW50SW52b2tlKERFRkFVTFRfRlVOQ1RJT05fR1JPVVAsIHByb3BzLmZ1bmN0aW9uVXJsISk7XG4gICAgfVxuICAgIHRoaXMuYWRkU3RhdGljQmVoYXZpb3JzKCk7XG4gICAgdGhpcy5hZGREeW5hbWljQmVoYXZpb3JzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENsb3VkRnJvbnQgY29tbWVudCB0aGF0IGlzIHNhZmUgZm9yIHRoZSAxMjggY2hhcmFjdGVyIGxpbWl0LlxuICAgKiBJZiB0aGUgZnVsbCBjb21tZW50IHdpdGggc3RhY2sgbmFtZSBleGNlZWRzIDEyOCBjaGFyYWN0ZXJzLCByZXR1cm5zIHRoZSBiYXNlIGNvbW1lbnQgb25seS5cbiAgICogQHBhcmFtIGJhc2VDb21tZW50IFRoZSBiYXNlIGNvbW1lbnQgdGV4dFxuICAgKiBAcGFyYW0gc3RhY2tOYW1lIFRoZSBzdGFjayBuYW1lIHRvIGFwcGVuZFxuICAgKiBAcmV0dXJucyBBIGNvbW1lbnQgc3RyaW5nIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSA8IDEyOCBjaGFyYWN0ZXJzXG4gICAqL1xuICBwcml2YXRlIGdldENvbW1lbnQoYmFzZUNvbW1lbnQ6IHN0cmluZywgc3RhY2tOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZ1bGxDb21tZW50ID0gYCR7YmFzZUNvbW1lbnR9IGZvciAke3N0YWNrTmFtZX1gO1xuICAgIHJldHVybiBmdWxsQ29tbWVudC5sZW5ndGggPCAxMjggPyBmdWxsQ29tbWVudCA6IGJhc2VDb21tZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdGF0aWNPcmlnaW4oKTogSU9yaWdpbiB7XG4gICAgcmV0dXJuIFMzQnVja2V0T3JpZ2luLndpdGhPcmlnaW5BY2Nlc3NDb250cm9sKHRoaXMucHJvcHMuYXNzZXRzQnVja2V0LCB7XG4gICAgICAvLyBMSVNUIGxldHMgUzMgYW5zd2VyIGEgbWlzc2luZyBrZXkgd2l0aCA0MDQgaW5zdGVhZCBvZiA0MDNcbiAgICAgIG9yaWdpbkFjY2Vzc0xldmVsczogW0FjY2Vzc0xldmVsLlJFQUQsIEFjY2Vzc0xldmVsLkxJU1RdLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnMzQnVja2V0T3JpZ2luUHJvcHMsXG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVEeW5hbWljT3JpZ2luKCk6IElPcmlnaW4ge1xuICAgIGlmICh0aGlzLmlzRnVuY3Rpb25Db21wdXRlKSB7XG4gICAgICBpZiAoIXRoaXMucHJvcHMuZnVuY3Rpb25VcmwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBOZXh0anNEaXN0cmlidXRpb25Qcm9wcy5mdW5jdGlvblVybFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBGdW5jdGlvblVybE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbChcbiAgICAgICAgdGhpcy5wcm9wcy5mdW5jdGlvblVybCxcbiAgICAgICAgdGhpcy5wcm9wcy5vdmVycmlkZXM/LmR5bmFtaWNGdW5jdGlvblVybE9yaWdpbldpdGhPQUNQcm9wcyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxvYWRCYWxhbmNlciA9IHRoaXMucHJvcHMubG9hZEJhbGFuY2VyO1xuICAgICAgaWYgKCFsb2FkQmFsYW5jZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBOZXh0anNEaXN0cmlidXRpb25Qcm9wcy5sb2FkQmFsYW5jZXJcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gVnBjT3JpZ2luLndpdGhBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcihsb2FkQmFsYW5jZXIsIHtcbiAgICAgICAgcHJvdG9jb2xQb2xpY3k6IHRoaXMucHJvcHMuY2VydGlmaWNhdGVcbiAgICAgICAgICA/IE9yaWdpblByb3RvY29sUG9saWN5LkhUVFBTX09OTFlcbiAgICAgICAgICA6IE9yaWdpblByb3RvY29sUG9saWN5LkhUVFBfT05MWSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmR5bmFtaWNWcGNPcmlnaW5XaXRoRW5kcG9pbnRQcm9wcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogTGFtYmRhIEZ1bmN0aW9uIFVSTHMgXCJleHBlY3QgdGhlIGBIb3N0YCBoZWFkZXIgdG8gY29udGFpbiB0aGUgb3JpZ2luIGRvbWFpblxuICAgKiBuYW1lLCBub3QgdGhlIGRvbWFpbiBuYW1lIG9mIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cIlxuICAgKlxuICAgKiBBIGNvbnRhaW5lciBvcmlnaW4gYWxzbyBnZXRzIENsb3VkRnJvbnQncyBvd24gaGVhZGVycywgZm9yXG4gICAqIGBDbG91ZEZyb250LUZvcndhcmRlZC1Qcm90b2A6IHdpdGhvdXQgYSBjZXJ0aWZpY2F0ZSBDbG91ZEZyb250IHJlYWNoZXMgdGhlXG4gICAqIEFMQiBvdmVyIHBsYWluIEhUVFAsIHNvIHRoZSBBTEIncyBgWC1Gb3J3YXJkZWQtUHJvdG9gIGlzIGBodHRwYCwgYW5kIHRoZVxuICAgKiBydW50aW1lIHdvdWxkIGJ1aWxkIGV2ZXJ5IGFic29sdXRlIFVSTCAoYHJlcXVlc3QudXJsYCwgdGhlIG9yaWdpbiBhIHNlcnZlclxuICAgKiBhY3Rpb24gaXMgZm9yd2FyZGVkIHRvKSBhcyBgaHR0cDovL2AgYmVoaW5kIGEgdmlld2VyIG9uIEhUVFBTLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLW9yaWdpbi1yZXF1ZXN0LXBvbGljaWVzLmh0bWwjbWFuYWdlZC1vcmlnaW4tcmVxdWVzdC1wb2xpY3ktYWxsLXZpZXdlci1leGNlcHQtaG9zdC1oZWFkZXJcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1vcmlnaW4tcmVxdWVzdC1wb2xpY2llcy5odG1sI21hbmFnZWQtb3JpZ2luLXJlcXVlc3QtcG9saWN5LWFsbC12aWV3ZXItYW5kLWNsb3VkZnJvbnRcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY09yaWdpblJlcXVlc3RQb2xpY3koKTogSU9yaWdpblJlcXVlc3RQb2xpY3kge1xuICAgIHJldHVybiB0aGlzLmlzRnVuY3Rpb25Db21wdXRlXG4gICAgICA/IE9yaWdpblJlcXVlc3RQb2xpY3kuQUxMX1ZJRVdFUl9FWENFUFRfSE9TVF9IRUFERVJcbiAgICAgIDogT3JpZ2luUmVxdWVzdFBvbGljeS5BTExfVklFV0VSX0FORF9DTE9VREZST05UXzIwMjI7XG4gIH1cbiAgLyoqXG4gICAqIEVuc3VyZXMgTmV4dC5qcyBgcmVxdWVzdC51cmxgIHdpbGwgYmUgY29ycmVjdCBkb21haW4gaW5zdGVhZCBvZiBVUkwgb2ZcbiAgICogY29tcHV0ZSAoTGFtYmRhIG9yIEZhcmdhdGUpXG4gICAqIEBzZWUgaHR0cHM6Ly9vcGVuLW5leHQuanMub3JnL2FkdmFuY2VkL3dvcmthcm91bmQjd29ya2Fyb3VuZC1zZXQteC1mb3J3YXJkZWQtaG9zdC1oZWFkZXItYXdzLXNwZWNpZmljXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUR5bmFtaWNDbG91ZEZyb250RnVuY3Rpb25Bc3NvY2lhdGlvbnMoKTogRnVuY3Rpb25Bc3NvY2lhdGlvbltdIHtcbiAgICBjb25zdCBhc3NvY2lhdGlvbnM6IEZ1bmN0aW9uQXNzb2NpYXRpb25bXSA9IFtdO1xuICAgIGlmICh0aGlzLmlzRnVuY3Rpb25Db21wdXRlKSB7XG4gICAgICBjb25zdCBjbG91ZEZyb250Rm4gPSBuZXcgQ2xvdWRGcm9udEZ1bmN0aW9uKHRoaXMsIFwiQ2xvdWRGcm9udEZuXCIsIHtcbiAgICAgICAgLi4udGhpcy52aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Qcm9wcyhYX0ZPUldBUkRFRF9IT1NUX0hBTkRMRVIpLFxuICAgICAgfSk7XG4gICAgICBhc3NvY2lhdGlvbnMucHVzaCh7XG4gICAgICAgIGV2ZW50VHlwZTogRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsXG4gICAgICAgIGZ1bmN0aW9uOiBjbG91ZEZyb250Rm4sXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudmlld2VyUmVxdWVzdENvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQ29udGFpbmVycyBuZWVkIG5vIGZ1bmN0aW9uIG9mIHRoZWlyIG93biDigJQgdGhlaXIgb3JpZ2luIHNlZXMgdGhlXG4gICAgICAvLyB2aWV3ZXIncyBgSG9zdGAg4oCUIHNvIHRoaXMgb25lIG9ubHkgcnVucyB0aGUgdXNlcidzIGNvZGUuXG4gICAgICBhc3NvY2lhdGlvbnMucHVzaCh7XG4gICAgICAgIGV2ZW50VHlwZTogRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsXG4gICAgICAgIGZ1bmN0aW9uOiB0aGlzLmdldFBhc3NUaHJvdWdoRnVuY3Rpb24oKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXNzb2NpYXRpb25zO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gYSBiZWhhdmlvciB3aXRoIG5vIHZpZXdlci1yZXF1ZXN0IGxvZ2ljIG9mIGl0cyBvd24gZ2V0cyB3aGVuXG4gICAqIGB2aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlYCBpcyBzZXQsIGNyZWF0ZWQgb24gZmlyc3QgdXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQYXNzVGhyb3VnaEZ1bmN0aW9uKCkge1xuICAgIHRoaXMucGFzc1Rocm91Z2hGdW5jdGlvbiA/Pz0gbmV3IENsb3VkRnJvbnRGdW5jdGlvbihcbiAgICAgIHRoaXMsXG4gICAgICBcIlZpZXdlclJlcXVlc3RGblwiLFxuICAgICAge1xuICAgICAgICBjb21tZW50OiB0aGlzLmdldENvbW1lbnQoXG4gICAgICAgICAgXCJOZXh0SlMgdmlld2VyIHJlcXVlc3RcIixcbiAgICAgICAgICBTdGFjay5vZih0aGlzKS5zdGFja05hbWUsXG4gICAgICAgICksXG4gICAgICAgIC4uLnRoaXMudmlld2VyUmVxdWVzdEZ1bmN0aW9uUHJvcHMoUEFTU19USFJPVUdIX0hBTkRMRVIpLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnBhc3NUaHJvdWdoRnVuY3Rpb247XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjb2RlLCBydW50aW1lIGFuZCBLZXlWYWx1ZVN0b3JlIG9mIGEgZnVuY3Rpb24gd2hvc2UgYGhhbmRsZXJgIGlzXG4gICAqIGNkay1uZXh0anMncywgd2l0aCBgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZWAgc3BsaWNlZCBpblxuICAgKiAoe0BsaW5rIHNwbGljZVZpZXdlclJlcXVlc3R9KSBhbmQgY2hlY2tlZCBhZ2FpbnN0IENsb3VkRnJvbnQncyBzaXplIGxpbWl0LlxuICAgKlxuICAgKiBFdmVyeSBvbmUgcnVucyBvbiBgY2xvdWRmcm9udC1qcy0yLjBgLCB0aGUgcnVudGltZSBBV1MgcmVjb21tZW5kcyBhbmQgdGhlXG4gICAqIG9uZSB3aXRoIGBhc3luY2AgYW5kIEtleVZhbHVlU3RvcmVzLCBzbyB0aGUgaGFuZGxlcnMgYXJlIGFsbCBgYXN5bmNgXG4gICAqIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIHVzZXIgY29kZSB0byBhd2FpdC5cbiAgICovXG4gIHByaXZhdGUgdmlld2VyUmVxdWVzdEZ1bmN0aW9uUHJvcHMoXG4gICAgaGFuZGxlcjogc3RyaW5nLFxuICApOiBQaWNrPEZ1bmN0aW9uUHJvcHMsIFwiY29kZVwiIHwgXCJydW50aW1lXCIgfCBcImtleVZhbHVlU3RvcmVcIj4ge1xuICAgIGNvbnN0IHVzZXJDb2RlID0gdGhpcy52aWV3ZXJSZXF1ZXN0Q29kZTtcbiAgICBjb25zdCBjb2RlID0gc3BsaWNlVmlld2VyUmVxdWVzdChoYW5kbGVyLCB1c2VyQ29kZSk7XG4gICAgaWYgKHVzZXJDb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IEZ1bmN0aW9uQ29kZS5mcm9tSW5saW5lKGNvZGUpLFxuICAgICAgICBydW50aW1lOiBGdW5jdGlvblJ1bnRpbWUuSlNfMl8wLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgc2l6ZSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGNvZGUpO1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoY29kZSkpIHtcbiAgICAgIC8vIEEgdG9rZW4ncyBwbGFjZWhvbGRlciBpc24ndCB0aGUgbGVuZ3RoIG9mIHdoYXQgaXQgcmVzb2x2ZXMgdG8uXG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBcXGB2aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlXFxgIGNvbnRhaW5zIGEgQ0RLIHRva2VuLCBzbyBgICtcbiAgICAgICAgICBgaXRzIHNpemUgY2FuJ3QgYmUgY2hlY2tlZCBhZ2FpbnN0IENsb3VkRnJvbnQncyBsaW1pdCBvZiBgICtcbiAgICAgICAgICBgJHtNQVhfRlVOQ1RJT05fQ09ERV9CWVRFU30gYnl0ZXMgdW50aWwgZGVwbG95LmAsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoc2l6ZSA+IE1BWF9GVU5DVElPTl9DT0RFX0JZVEVTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IFxcYHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGVcXGAgbWFrZXMgYSBDbG91ZEZyb250IGAgK1xuICAgICAgICAgIGBGdW5jdGlvbiBvZiAke3NpemV9IGJ5dGVzLCBjZGstbmV4dGpzJ3Mgb3duIGNvZGUgaW5jbHVkZWQsIG92ZXIgYCArXG4gICAgICAgICAgYENsb3VkRnJvbnQncyBsaW1pdCBvZiAke01BWF9GVU5DVElPTl9DT0RFX0JZVEVTfS4gU2hvcnRlbiBpdCBgICtcbiAgICAgICAgICBgKGNvbW1lbnRzIGFuZCB3aGl0ZXNwYWNlIGNvdW50KS4gU2VlIGAgK1xuICAgICAgICAgIGBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY2xvdWRmcm9udC1saW1pdHMuaHRtbCNsaW1pdHMtZnVuY3Rpb25zYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBGdW5jdGlvbkNvZGUuZnJvbUlubGluZShjb2RlKSxcbiAgICAgIHJ1bnRpbWU6IEZ1bmN0aW9uUnVudGltZS5KU18yXzAsXG4gICAgICBrZXlWYWx1ZVN0b3JlOiB0aGlzLnByb3BzLnZpZXdlclJlcXVlc3RLZXlWYWx1ZVN0b3JlLFxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIGB2aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlYCwgcmVuZGVyZWQgb25jZSwgc2luY2UgYEZ1bmN0aW9uQ29kZS5mcm9tRmlsZWBcbiAgICogcmVhZHMgdGhlIGZpbGUgb24gZXZlcnkgcmVuZGVyLCBhbmQgY2hlY2tlZFxuICAgKiAoe0BsaW5rIGNoZWNrVmlld2VyUmVxdWVzdENvZGV9KS5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyVmlld2VyUmVxdWVzdENvZGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB1c2VyQ29kZSA9IHRoaXMucHJvcHMudmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZT8ucmVuZGVyKCk7XG4gICAgaWYgKHVzZXJDb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNoZWNrVmlld2VyUmVxdWVzdENvZGUodXNlckNvZGUpO1xuICAgIHJldHVybiB1c2VyQ29kZTtcbiAgfVxuICAvKipcbiAgICogQ2xvdWRGcm9udCBhbGxvd3Mgb25lIGZ1bmN0aW9uIHBlciBldmVudCB0eXBlIHBlciBiZWhhdmlvciwgc28gYW5cbiAgICogb3ZlcnJpZGUncyB2aWV3ZXItcmVxdWVzdCBhc3NvY2lhdGlvbiBhbmQgb25lIGNkay1uZXh0anMgbmVlZHMgY2FuJ3QgYm90aFxuICAgKiBiZSBrZXB0LiBUaHJvd24gYXQgc3ludGgsIHdoZXJlIGJvdGggaGFsdmVzIGFyZSBrbm93biwgcmF0aGVyIHRoYW4gbGVmdCB0b1xuICAgKiBhIGRlcGxveSB0aGF0IG5hbWVzIG5laXRoZXIuXG4gICAqL1xuICBwcml2YXRlIGFzc2VydFZpZXdlclJlcXVlc3RVbmNsYWltZWQoXG4gICAgb3ZlcnJpZGVOYW1lOiBzdHJpbmcsXG4gICAgYXNzb2NpYXRpb25zOiBGdW5jdGlvbkFzc29jaWF0aW9uW10gfCB1bmRlZmluZWQsXG4gICAgbmVlZHM6IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgY2xhaW1lZCA9IChhc3NvY2lhdGlvbnMgPz8gW10pLnNvbWUoXG4gICAgICAoYXNzb2NpYXRpb24pID0+XG4gICAgICAgIGFzc29jaWF0aW9uLmV2ZW50VHlwZSA9PT0gRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsXG4gICAgKTtcbiAgICBpZiAoY2xhaW1lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBcXGBvdmVycmlkZXMuJHtvdmVycmlkZU5hbWV9LmZ1bmN0aW9uQXNzb2NpYXRpb25zXFxgIGAgK1xuICAgICAgICAgIGBhc3NvY2lhdGVzIGEgQ2xvdWRGcm9udCBmdW5jdGlvbiB3aXRoIGAgK1xuICAgICAgICAgIGAke0Z1bmN0aW9uRXZlbnRUeXBlLlZJRVdFUl9SRVFVRVNUfSwgYnV0ICR7bmVlZHN9LiBgICtcbiAgICAgICAgICBgQ2xvdWRGcm9udCBwZXJtaXRzIG9ubHkgb25lIGZ1bmN0aW9uIHBlciBldmVudCB0eXBlIHBlciBiZWhhdmlvci4gYCArXG4gICAgICAgICAgYE1vdmUgdGhlIGxvZ2ljIGludG8gXFxgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZVxcYCwgd2hpY2ggcnVucyBgICtcbiAgICAgICAgICBgaW5zaWRlIGNkay1uZXh0anMncyBvd24gdmlld2VyLXJlcXVlc3QgZnVuY3Rpb24gb24gZXZlcnkgYmVoYXZpb3IuYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY3JlYXRlU3RhdGljQmVoYXZpb3JPcHRpb25zKCk6IEJlaGF2aW9yT3B0aW9ucyB7XG4gICAgY29uc3Qgc3RhdGljQmVoYXZpb3JPcHRpb25zID0gdGhpcy5wcm9wcy5vdmVycmlkZXM/LnN0YXRpY0JlaGF2aW9yT3B0aW9ucztcbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnNQb2xpY3kgPVxuICAgICAgc3RhdGljQmVoYXZpb3JPcHRpb25zPy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgPz9cbiAgICAgIG5ldyBSZXNwb25zZUhlYWRlcnNQb2xpY3kodGhpcywgXCJTdGF0aWNSZXNwb25zZUhlYWRlcnNQb2xpY3lcIiwge1xuICAgICAgICBzZWN1cml0eUhlYWRlcnNCZWhhdmlvcjogdGhpcy5jb21tb25TZWN1cml0eUhlYWRlcnNCZWhhdmlvcixcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIFN0YXRpYyBSZXNwb25zZSBIZWFkZXJzIFBvbGljeVwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnN0YXRpY1Jlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLFxuICAgICAgfSk7XG4gICAgY29uc3Qgb3B0aW9uczogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICBjYWNoZVBvbGljeTogQ2FjaGVQb2xpY3kuQ0FDSElOR19PUFRJTUlaRUQsXG4gICAgICBvcmlnaW46IHRoaXMuc3RhdGljT3JpZ2luLFxuICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5LFxuICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgLi4uc3RhdGljQmVoYXZpb3JPcHRpb25zLFxuICAgIH07XG4gICAgaWYgKHRoaXMudmlld2VyUmVxdWVzdENvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuICAgIHRoaXMuYXNzZXJ0Vmlld2VyUmVxdWVzdFVuY2xhaW1lZChcbiAgICAgIFwic3RhdGljQmVoYXZpb3JPcHRpb25zXCIsXG4gICAgICBzdGF0aWNCZWhhdmlvck9wdGlvbnM/LmZ1bmN0aW9uQXNzb2NpYXRpb25zLFxuICAgICAgXCJgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZWAgbmVlZHMgdGhhdCBldmVudCB0eXBlIG9uIHRoZSBzdGF0aWMgYmVoYXZpb3JzXCIsXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiBbXG4gICAgICAgIC4uLihzdGF0aWNCZWhhdmlvck9wdGlvbnM/LmZ1bmN0aW9uQXNzb2NpYXRpb25zID8/IFtdKSxcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50VHlwZTogRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsXG4gICAgICAgICAgZnVuY3Rpb246IHRoaXMuZ2V0UGFzc1Rocm91Z2hGdW5jdGlvbigpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY0JlaGF2aW9yT3B0aW9ucygpOiBCZWhhdmlvck9wdGlvbnMge1xuICAgIGNvbnN0IGR5bmFtaWNCZWhhdmlvck9wdGlvbnMgPSB0aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY0JlaGF2aW9yT3B0aW9ucztcbiAgICBjb25zdCBjYWNoZVBvbGljeVByb3BzID0gdGhpcy5wcm9wcy5vdmVycmlkZXM/LmR5bmFtaWNDYWNoZVBvbGljeVByb3BzO1xuICAgIC8vIGNyZWF0ZSBkZWZhdWx0IGNhY2hlIHBvbGljeSBpZiBub3QgcHJvdmlkZWRcbiAgICBjb25zdCBjYWNoZVBvbGljeSA9XG4gICAgICBkeW5hbWljQmVoYXZpb3JPcHRpb25zPy5jYWNoZVBvbGljeSA/P1xuICAgICAgbmV3IENhY2hlUG9saWN5KHRoaXMsIFwiRHluYW1pY0NhY2hlUG9saWN5XCIsIHtcbiAgICAgICAgLi4uKGlzQ2FjaGluZ0Rpc2FibGVkKGNhY2hlUG9saWN5UHJvcHMpXG4gICAgICAgICAgPyBESVNBQkxFRF9DQUNIRV9LRVlcbiAgICAgICAgICA6IERZTkFNSUNfQ0FDSEVfS0VZKSxcbiAgICAgICAgLy8gQSByZXNwb25zZSB3aXRoIG5vIGBDYWNoZS1Db250cm9sYCBpcyBub3QgY2FjaGVkLCB3aGljaCBpcyB3aGF0IE5leHQuanNcbiAgICAgICAgLy8gYW5kIGV2ZXJ5IGFwcCB3cml0dGVuIGZvciBpdCBhc3N1bWU6IGEgZHluYW1pYyByb3V0ZSBoYW5kbGVyIHNldHMgbm9uZS5cbiAgICAgICAgLy8gQ0RLJ3MgZGVmYXVsdCBpcyBhIGRheSwgd2hpY2ggY2FjaGVkIGAvYXBpLypgIHJlc3BvbnNlcyBhdCB0aGUgZWRnZSBmb3JcbiAgICAgICAgLy8gMjQgaG91cnMuIEFueXRoaW5nIE5leHQuanMgKm1lYW5zKiB0byBjYWNoZSAtIElTUiwgU1NHLCBhIFBQUiBzaGVsbCAtXG4gICAgICAgIC8vIHNheXMgc28gd2l0aCBgcy1tYXhhZ2VgLCB3aGljaCBgbWF4VHRsYCBzdGlsbCBob25vcnMuXG4gICAgICAgIGRlZmF1bHRUdGw6IER1cmF0aW9uLnNlY29uZHMoMCksXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuZ2V0Q29tbWVudChcbiAgICAgICAgICBcIk5leHRKUyBEeW5hbWljIENhY2hlIFBvbGljeVwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4uY2FjaGVQb2xpY3lQcm9wcyxcbiAgICAgIH0pO1xuICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVyc1BvbGljeSA9XG4gICAgICBkeW5hbWljQmVoYXZpb3JPcHRpb25zPy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgPz9cbiAgICAgIG5ldyBSZXNwb25zZUhlYWRlcnNQb2xpY3kodGhpcywgXCJEeW5hbWljUmVzcG9uc2VIZWFkZXJzUG9saWN5XCIsIHtcbiAgICAgICAgc2VjdXJpdHlIZWFkZXJzQmVoYXZpb3I6IHRoaXMuY29tbW9uU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IsXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuZ2V0Q29tbWVudChcbiAgICAgICAgICBcIk5leHRKUyBEeW5hbWljIFJlc3BvbnNlIEhlYWRlcnMgUG9saWN5XCIsXG4gICAgICAgICAgU3RhY2sub2YodGhpcykuc3RhY2tOYW1lLFxuICAgICAgICApLFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY1Jlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19BTEwsXG4gICAgICBjYWNoZVBvbGljeSxcbiAgICAgIG9yaWdpbjogdGhpcy5keW5hbWljT3JpZ2luLFxuICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogdGhpcy5keW5hbWljT3JpZ2luUmVzcG9uc2VQb2xpY3ksXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3ksXG4gICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAuLi5keW5hbWljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IHRoaXMud2l0aER5bmFtaWNGdW5jdGlvbkFzc29jaWF0aW9ucyhcbiAgICAgICAgXCJkeW5hbWljQmVoYXZpb3JPcHRpb25zXCIsXG4gICAgICAgIGR5bmFtaWNCZWhhdmlvck9wdGlvbnM/LmZ1bmN0aW9uQXNzb2NpYXRpb25zLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBUaGUgYmVoYXZpb3IncyBmdW5jdGlvbiBhc3NvY2lhdGlvbnM6IGFuIG92ZXJyaWRlJ3MsIHBsdXMgdGhlIHZpZXdlci1yZXF1ZXN0XG4gICAqIGZ1bmN0aW9uIEdsb2JhbCBGdW5jdGlvbnMgZGVwZW5kcyBvbiwgb3IgdGhlIG9uZSBgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZWBcbiAgICogYWRkcyBvbiBHbG9iYWwgQ29udGFpbmVycy5cbiAgICpcbiAgICogU3ByZWFkaW5nIHRoZSBvdmVycmlkZSdzIGBmdW5jdGlvbkFzc29jaWF0aW9uc2Agb3ZlciBvdXJzIHdvdWxkIHNpbGVudGx5XG4gICAqIGRyb3AgdGhhdCBmdW5jdGlvbiwgYW5kIHdpdGggaXQgdGhlIG9ubHkgdGhpbmcgc3RhbmRpbmcgYmV0d2VlbiBhIHZpZXdlcidzXG4gICAqIG93biBgWC1Gb3J3YXJkZWQtSG9zdGAgYW5kIHRoZSBydW50aW1lLCB3aGljaCB0cnVzdHMgdGhhdCBoZWFkZXIgb24gRnVuY3Rpb25cbiAgICogVVJMIGV2ZW50cyAoYGxhbWJkYS1ldmVudC50c2ApOiBob3N0IGluamVjdGlvbiBpbnRvIHJlZGlyZWN0cyBhbmQgYWJzb2x1dGVcbiAgICogVVJMcywgY2FjaGVkIGZvciBvdGhlciB2aWV3ZXJzIGJlY2F1c2UgdGhlIGhlYWRlciBpcyBub3QgaW4gdGhlIGNhY2hlIGtleS5cbiAgICogU28gb3VycyBpcyBrZXB0LCBhbmQgYW4gb3ZlcnJpZGUgY2xhaW1pbmcgVklFV0VSX1JFUVVFU1Qg4oCUIHdoaWNoIENsb3VkRnJvbnRcbiAgICogYWxsb3dzIG9ubHkgb25lIG9mIHBlciBiZWhhdmlvciDigJQgaXMgYW4gZXJyb3IgcmF0aGVyIHRoYW4gYSByZXBsYWNlbWVudC5cbiAgICovXG4gIHByaXZhdGUgd2l0aER5bmFtaWNGdW5jdGlvbkFzc29jaWF0aW9ucyhcbiAgICBvdmVycmlkZU5hbWU6IHN0cmluZyxcbiAgICBvdmVycmlkZGVuOiBGdW5jdGlvbkFzc29jaWF0aW9uW10gfCB1bmRlZmluZWQsXG4gICk6IEZ1bmN0aW9uQXNzb2NpYXRpb25bXSB7XG4gICAgY29uc3Qgb3VycyA9IHRoaXMuZHluYW1pY0Nsb3VkRnJvbnRGdW5jdGlvbkFzc29jaWF0aW9ucztcbiAgICBpZiAoIW92ZXJyaWRkZW4pIHtcbiAgICAgIHJldHVybiBvdXJzO1xuICAgIH1cbiAgICBpZiAoIW91cnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gb3ZlcnJpZGRlbjtcbiAgICB9XG4gICAgdGhpcy5hc3NlcnRWaWV3ZXJSZXF1ZXN0VW5jbGFpbWVkKFxuICAgICAgb3ZlcnJpZGVOYW1lLFxuICAgICAgb3ZlcnJpZGRlbixcbiAgICAgIHRoaXMuaXNGdW5jdGlvbkNvbXB1dGVcbiAgICAgICAgPyBgTmV4dGpzR2xvYmFsRnVuY3Rpb25zIG5lZWRzIHRoYXQgZXZlbnQgdHlwZSBmb3IgaXRzIG93biBmdW5jdGlvbiwgYCArXG4gICAgICAgICAgICBgd2hpY2ggb3ZlcndyaXRlcyBcXGB4LWZvcndhcmRlZC1ob3N0XFxgIHdpdGggdGhlIHZpZXdlcidzIFxcYEhvc3RcXGAgYCArXG4gICAgICAgICAgICBgKHRoZSBydW50aW1lIHRydXN0cyB0aGF0IGhlYWRlciBiZWhpbmQgQ2xvdWRGcm9udCkgYW5kIHJlZGlyZWN0cyBgICtcbiAgICAgICAgICAgIGByZXBlYXRlZCBzbGFzaGVzYFxuICAgICAgICA6IFwiYHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGVgIG5lZWRzIHRoYXQgZXZlbnQgdHlwZSBvbiB0aGUgZHluYW1pYyBcIiArXG4gICAgICAgICAgICBcImFuZCBpbWFnZSBiZWhhdmlvcnNcIixcbiAgICApO1xuICAgIHJldHVybiBbLi4ub3ZlcnJpZGRlbiwgLi4ub3Vyc107XG4gIH1cbiAgLyoqXG4gICAqIGBfbmV4dC9pbWFnZSpgIGdvZXMgdG8gdGhlIHNhbWUgb3JpZ2luIGFzIGV2ZXJ5dGhpbmcgZWxzZSDigJQgdGhlIE5leHQuanNcbiAgICogc2VydmVyIG9wdGltaXplcyBpbWFnZXMgaW4tcHJvY2VzcyDigJQgYnV0IGtlZXBzIGl0cyBvd24gYmVoYXZpb3IgZm9yIHRoZVxuICAgKiBjYWNoZSBwb2xpY3k6IGBxdWVyeVN0cmluZ0JlaGF2aW9yOiBhbGwoKWAgcGx1cyBgYWNjZXB0YCBpbiB0aGUgY2FjaGUga2V5IGlzXG4gICAqIHJpZ2h0IGZvciBpbWFnZSByZXF1ZXN0cyBhbmQgd3JvbmcgZm9yIHRoZSByZXN0LlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVJbWFnZUJlaGF2aW9yT3B0aW9ucygpOiBCZWhhdmlvck9wdGlvbnMge1xuICAgIGNvbnN0IGltYWdlQmVoYXZpb3JPcHRpb25zID0gdGhpcy5wcm9wcy5vdmVycmlkZXM/LmltYWdlQmVoYXZpb3JPcHRpb25zO1xuICAgIC8vIGFkZCBkZWZhdWx0IGNhY2hlIHBvbGljeSBpZiBub3QgcHJvdmlkZWRcbiAgICBjb25zdCBjYWNoZVBvbGljeSA9XG4gICAgICBpbWFnZUJlaGF2aW9yT3B0aW9ucz8uY2FjaGVQb2xpY3kgPz9cbiAgICAgIG5ldyBDYWNoZVBvbGljeSh0aGlzLCBcIkltYWdlQ2FjaGVQb2xpY3lcIiwge1xuICAgICAgICAvLyBTRUNVUklUWSBOT1RFOiBieSBkZWZhdWx0IHdlIGRvbid0IGluY2x1ZGUgY29va2llcyBpbiBjYWNoZSBmb3JcbiAgICAgICAgLy8gaW1hZ2VzIGIvYyBpdCBzaWduaWZpY2FudGx5IGltcHJvdmVzIGltYWdlIHBlcmYgZm9yIG1vc3Qgc2l0ZXMgQlVUXG4gICAgICAgIC8vIGlmIHlvdSBoYXZlIHByaXZhdGUgaW1hZ2VzIGxvY2tlZCBiZWhpbmQgYXV0aCBpbXBsZW1lbnRlZCB3aXRoIGNvb2tpZXNcbiAgICAgICAgLy8geW91IG5lZWQgdG8gb3ZlcnJpZGUgdGhpcy5cbiAgICAgICAgcXVlcnlTdHJpbmdCZWhhdmlvcjogQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbCgpLFxuICAgICAgICBoZWFkZXJCZWhhdmlvcjogQ2FjaGVIZWFkZXJCZWhhdmlvci5hbGxvd0xpc3QoXCJhY2NlcHRcIiksXG4gICAgICAgIGNvb2tpZUJlaGF2aW9yOiBDYWNoZUNvb2tpZUJlaGF2aW9yLm5vbmUoKSxcbiAgICAgICAgZW5hYmxlQWNjZXB0RW5jb2RpbmdCcm90bGk6IHRydWUsXG4gICAgICAgIGVuYWJsZUFjY2VwdEVuY29kaW5nR3ppcDogdHJ1ZSxcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIEltYWdlIENhY2hlIFBvbGljeVwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmltYWdlQ2FjaGVQb2xpY3lQcm9wcyxcbiAgICAgIH0pO1xuICAgIC8vIGFkZCBkZWZhdWx0IHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5IGlmIG5vdCBwcm92aWRlZFxuICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVyc1BvbGljeSA9XG4gICAgICBpbWFnZUJlaGF2aW9yT3B0aW9ucz8ucmVzcG9uc2VIZWFkZXJzUG9saWN5ID8/XG4gICAgICBuZXcgUmVzcG9uc2VIZWFkZXJzUG9saWN5KHRoaXMsIFwiSW1hZ2VSZXNwb25zZUhlYWRlcnNQb2xpY3lcIiwge1xuICAgICAgICBzZWN1cml0eUhlYWRlcnNCZWhhdmlvcjogdGhpcy5jb21tb25TZWN1cml0eUhlYWRlcnNCZWhhdmlvcixcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIEltYWdlIFJlc3BvbnNlIEhlYWRlcnMgUG9saWN5XCIsXG4gICAgICAgICAgU3RhY2sub2YodGhpcykuc3RhY2tOYW1lLFxuICAgICAgICApLFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uaW1hZ2VSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcyxcbiAgICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBhbGxvd2VkTWV0aG9kczogQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgIGNhY2hlZE1ldGhvZHM6IENhY2hlZE1ldGhvZHMuQ0FDSEVfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgIG9yaWdpbjogdGhpcy5keW5hbWljT3JpZ2luLFxuICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogdGhpcy5keW5hbWljT3JpZ2luUmVzcG9uc2VQb2xpY3ksXG4gICAgICBjYWNoZVBvbGljeSxcbiAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeSxcbiAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgIC4uLmltYWdlQmVoYXZpb3JPcHRpb25zLFxuICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IHRoaXMud2l0aER5bmFtaWNGdW5jdGlvbkFzc29jaWF0aW9ucyhcbiAgICAgICAgXCJpbWFnZUJlaGF2aW9yT3B0aW9uc1wiLFxuICAgICAgICBpbWFnZUJlaGF2aW9yT3B0aW9ucz8uZnVuY3Rpb25Bc3NvY2lhdGlvbnMsXG4gICAgICApLFxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgb3IgdXNlcyB1c2VyIHNwZWNpZmllZCBDbG91ZEZyb250IERpc3RyaWJ1dGlvblxuICAgKi9cbiAgcHJpdmF0ZSBnZXREaXN0cmlidXRpb24oKTogRGlzdHJpYnV0aW9uIHtcbiAgICBsZXQgZGlzdHJpYnV0aW9uOiBEaXN0cmlidXRpb247XG4gICAgaWYgKHRoaXMucHJvcHMuZGlzdHJpYnV0aW9uKSB7XG4gICAgICBkaXN0cmlidXRpb24gPSB0aGlzLnByb3BzLmRpc3RyaWJ1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVW5kZXIgYSBgYmFzZVBhdGhgLCB0aGUgYmVoYXZpb3JzIGNkay1uZXh0anMgYWRkcyBmb3IgaXQgc2VydmUgdGhlXG4gICAgICAvLyBhcHAsIHNvIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRoZSB1c2VyJ3MgdG8gcmVwbGFjZS5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy52aWV3ZXJSZXF1ZXN0Q29kZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmJhc2VQYXRoICYmXG4gICAgICAgIHRoaXMucHJvcHMub3ZlcnJpZGVzPy5kaXN0cmlidXRpb25Qcm9wcz8uZGVmYXVsdEJlaGF2aW9yXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke0xPR19QUkVGSVh9IFxcYG92ZXJyaWRlcy5kaXN0cmlidXRpb25Qcm9wcy5kZWZhdWx0QmVoYXZpb3JcXGAgYCArXG4gICAgICAgICAgICBgcmVwbGFjZXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgY2RrLW5leHRqcyBidWlsZHMsIGFuZCB3aXRoIGl0IHRoZSBgICtcbiAgICAgICAgICAgIGB2aWV3ZXItcmVxdWVzdCBmdW5jdGlvbiBcXGB2aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlXFxgIHJ1bnMgaW4sIGAgK1xuICAgICAgICAgICAgYHNvIHBhZ2VzIGFuZCBBUEkgcm91dGVzIHdvdWxkIHNraXAgaXQuIEN1c3RvbWl6ZSB0aGUgZGVmYXVsdCBgICtcbiAgICAgICAgICAgIGBiZWhhdmlvciB0aHJvdWdoIFxcYG92ZXJyaWRlcy5keW5hbWljQmVoYXZpb3JPcHRpb25zXFxgIGluc3RlYWQuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGRpc3RyaWJ1dGlvbiA9IG5ldyBEaXN0cmlidXRpb24odGhpcywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICBtaW5pbXVtUHJvdG9jb2xWZXJzaW9uOiBTZWN1cml0eVBvbGljeVByb3RvY29sLlRMU19WMV8yXzIwMjEsXG4gICAgICAgIGRlZmF1bHRCZWhhdmlvcjogdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgICAvLyBiZXN0IHRvIHVzZSBIVFRQIDIgYW5kIDMgZm9yIGNvbXBhdGFiaWxpdHkgKEhUVFAgMikgYW5kIHBlcmZvcm1hbmNlIChIVFRQMylcbiAgICAgICAgLy8gQ2xvdWRGcm9udCB3aWxsIGNob29zZSBiZXN0IG9wdGlvbiBmb3IgY2xpZW50XG4gICAgICAgIGh0dHBWZXJzaW9uOiBIdHRwVmVyc2lvbi5IVFRQMl9BTkRfMyxcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIERpc3RyaWJ1dGlvblwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBkaXN0cmlidXRpb247XG4gIH1cbiAgcHJpdmF0ZSBhZGREeW5hbWljQmVoYXZpb3JzKCkge1xuICAgIC8vIEltYWdlIEJlaGF2aW9yXG4gICAgdGhpcy5kaXN0cmlidXRpb24uYWRkQmVoYXZpb3IoXG4gICAgICB0aGlzLmdldFBhdGhQYXR0ZXJuKFwiX25leHQvaW1hZ2UqXCIpLFxuICAgICAgdGhpcy5pbWFnZUJlaGF2aW9yT3B0aW9ucy5vcmlnaW4sXG4gICAgICB0aGlzLmltYWdlQmVoYXZpb3JPcHRpb25zLFxuICAgICk7XG4gICAgLy8gRnVuY3Rpb24gZ3JvdXAgYmVoYXZpb3JzLCBiZWZvcmUgdGhlIGJhc2VQYXRoIGNhdGNoLWFsbCBiZWxvdyBhbmQgYWZ0ZXJcbiAgICAvLyBgX25leHQvaW1hZ2UqYCAobm8gZ3JvdXAgcGF0dGVybiBjYW4gbWF0Y2ggYW4gaW1hZ2UgcmVxdWVzdCwgYW5kIGtlZXBpbmdcbiAgICAvLyB0aGUgb3JkZXIgb2YgdGhlIHVuc3BsaXQgY2FzZSBieXRlLWlkZW50aWNhbCBpcyB3b3J0aCBtb3JlIHRoYW4gc3ltbWV0cnkpLlxuICAgIHRoaXMuYWRkRnVuY3Rpb25Hcm91cEJlaGF2aW9ycygpO1xuICAgIC8vIFJvb3QgUGF0aCBCZWhhdmlvcnNcbiAgICBpZiAodGhpcy5iYXNlUGF0aCkge1xuICAgICAgLy8gYmVjYXVzZSB3ZSBhbHJlYWR5IGhhdmUgYSBiYXNlUGF0aCB3ZSBkb24ndCB1c2UgLyBpbnN0ZWFkIHdlIHVzZSAvYmFzZS1wYXRoXG4gICAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgICAgYC8ke3RoaXMuYmFzZVBhdGh9YCxcbiAgICAgICAgdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zLm9yaWdpbixcbiAgICAgICAgdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgKTtcbiAgICAgIC8vIHdoZW4gYmFzZVBhdGggaXMgc2V0LCB3ZSBlbXVsYXRlIHRoZSBcImRlZmF1bHQgYmVoYXZpb3JcIiAoKikgZm9yIHRoZSBzaXRlIGFzIGAvYmFzZS1wYXRoLypgXG4gICAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgICAgdGhpcy5nZXRQYXRoUGF0dGVybihcIipcIiksXG4gICAgICAgIHRoaXMuZHluYW1pY0JlaGF2aW9yT3B0aW9ucy5vcmlnaW4sXG4gICAgICAgIHRoaXMuZHluYW1pY0JlaGF2aW9yT3B0aW9ucyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIG5vIGJhc2UgcGF0aCwgdGhlbiBkZWZhdWx0IGJlaGF2aW9yIHdpbGwgaGFuZGxlIGFsbCBvdGhlciBwYXRoc1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQmVmb3JlIGFueSBiZWhhdmlvciBpcyBjb21wdXRlZDogdGhlIGJ1ZGdldCBhbmQgdGhlIGBwdWJsaWMvYCBjaGVja3MgYm90aFxuICAgKiBnZW5lcmF0ZSB0aGUgZ3JvdXAgcGF0dGVybnMsIGFuZCB3b3VsZCBvdGhlcndpc2UgZmFpbCBmaXJzdCB3aXRoIGEgbGVzc1xuICAgKiB1c2VmdWwgbWVzc2FnZS5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVGdW5jdGlvbkdyb3VwUHJvcHMoKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHM/Lmxlbmd0aCAmJlxuICAgICAgIXRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cEJlaGF2aW9ycz8ubGVuZ3RoXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImBmdW5jdGlvbkdyb3Vwc2AgaXMgb25seSBzdXBwb3J0ZWQgYnkgTmV4dGpzR2xvYmFsRnVuY3Rpb25zLlwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEV2ZXJ5IGdyb3VwIGJlaGF2aW9yLCBmaW5hbCBwYXRoIHBhdHRlcm4gaW5jbHVkZWQsIGluIHRoZSBvcmRlclxuICAgKiB7QGxpbmsgYWRkRnVuY3Rpb25Hcm91cEJlaGF2aW9yc30gYWRkcyB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzKCkge1xuICAgIHJldHVybiAodGhpcy5wcm9wcy5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzID8/IFtdKS5tYXAoKGJlaGF2aW9yKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHM/LmZpbmQoXG4gICAgICAgIChpdCkgPT4gaXQubmFtZSA9PT0gYmVoYXZpb3IuZ3JvdXAsXG4gICAgICApO1xuICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCR7TE9HX1BSRUZJWH0gXFxgZnVuY3Rpb25Hcm91cEJlaGF2aW9yc1xcYCByb3V0ZXMgdG8gZnVuY3Rpb24gZ3JvdXAgYCArXG4gICAgICAgICAgICBgXCIke2JlaGF2aW9yLmdyb3VwfVwiLCB3aGljaCBpcyBub3QgaW4gXFxgZnVuY3Rpb25Hcm91cHNcXGAuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJlaGF2aW9yLFxuICAgICAgICBncm91cCxcbiAgICAgICAgcGF0aFBhdHRlcm46IHRoaXMuZ2V0UGF0aFBhdHRlcm4oYmVoYXZpb3IucGF0dGVybiksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBPbmUgYmVoYXZpb3IgcGVyIGdyb3VwIHBhdHRlcm4sIG1vc3Qgc3BlY2lmaWMgZmlyc3QuXG4gICAqXG4gICAqIFRoZSBvcmRlciBpcyB0aGUgd2hvbGUgbWVjaGFuaXNtLiBDbG91ZEZyb250IGV2YWx1YXRlcyBiZWhhdmlvcnMgaW4gb3JkZXJcbiAgICogYW5kIHN0b3BzIGF0IHRoZSBmaXJzdCB3aG9zZSBwYXRoIHBhdHRlcm4gbWF0Y2hlcywgYW5kIGBhZGRCZWhhdmlvcmBcbiAgICogYXBwZW5kcyDigJQgc28gYGFwaS8qYCBhZGRlZCBiZWZvcmUgYGFwaS9yZXBvcnRzLypgIHdvdWxkIHN3YWxsb3cgZXZlcnlcbiAgICogcmVwb3J0IHJlcXVlc3QgYW5kIHNlbmQgaXQgdG8gYSBmdW5jdGlvbiB3aG9zZSBwYWNrYWdlIGhhcyBubyByZXBvcnRcbiAgICogZW50cnlwb2ludC4gVGhlIGFkYXB0ZXIgc29ydGVkIHRoZSBsaXN0IHdoZW4gaXQgY2hlY2tlZCBpdCBhZ2FpbnN0IGhvd1xuICAgKiBgYXNzaWduUm91dGVzVG9Hcm91cHNgIHBhY2thZ2VkIHRoZSBzYW1lIHJvdXRlcywgc28gaXQgaXMgYWRkZWQgYXMgaXQgaXMuXG4gICAqL1xuICBwcml2YXRlIGFkZEZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMoKSB7XG4gICAgY29uc3Qgb3JpZ2luUGVyR3JvdXAgPSBuZXcgTWFwPHN0cmluZywgSU9yaWdpbj4oKTtcbiAgICBmb3IgKGNvbnN0IHsgZ3JvdXAsIHBhdGhQYXR0ZXJuIH0gb2YgdGhpcy5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzKCkpIHtcbiAgICAgIGxldCBvcmlnaW4gPSBvcmlnaW5QZXJHcm91cC5nZXQoZ3JvdXAubmFtZSk7XG4gICAgICBpZiAoIW9yaWdpbikge1xuICAgICAgICBvcmlnaW4gPSBGdW5jdGlvblVybE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbChcbiAgICAgICAgICBncm91cC5mdW5jdGlvblVybCxcbiAgICAgICAgICB0aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY0Z1bmN0aW9uVXJsT3JpZ2luV2l0aE9BQ1Byb3BzLFxuICAgICAgICApO1xuICAgICAgICBvcmlnaW5QZXJHcm91cC5zZXQoZ3JvdXAubmFtZSwgb3JpZ2luKTtcbiAgICAgICAgdGhpcy5ncmFudEludm9rZShncm91cC5uYW1lLCBncm91cC5mdW5jdGlvblVybCk7XG4gICAgICB9XG4gICAgICAvLyBTYW1lIGJlaGF2aW9yIG9wdGlvbnMgYXMgZXZlcnkgb3RoZXIgZHluYW1pYyByb3V0ZSDigJQgb25seSB0aGUgb3JpZ2luXG4gICAgICAvLyBkaWZmZXJzLCBhbmQgaXQgaXMgcGFzc2VkIHNlcGFyYXRlbHkuXG4gICAgICBjb25zdCB7IG9yaWdpbjogX2lnbm9yZWQsIC4uLmJlaGF2aW9yT3B0aW9ucyB9ID1cbiAgICAgICAgdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zO1xuICAgICAgdGhpcy5kaXN0cmlidXRpb24uYWRkQmVoYXZpb3IocGF0aFBhdHRlcm4sIG9yaWdpbiwgYmVoYXZpb3JPcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIGBsYW1iZGE6SW52b2tlRnVuY3Rpb25gIGZvciBDbG91ZEZyb250LCB3aGljaCBhIEZ1bmN0aW9uIFVSTCBiZWhpbmQgT0FDXG4gICAqIG5lZWRzIGJlc2lkZXMgdGhlIGBsYW1iZGE6SW52b2tlRnVuY3Rpb25VcmxgIGBGdW5jdGlvblVybE9yaWdpbmAgZ3JhbnRzLFxuICAgKiBhbmQgc2NvcGVkIHRoZSBzYW1lIHdheTogdG8gdGhpcyBkaXN0cmlidXRpb24sIGFuZCB0byBjYWxscyB0aGF0IGNvbWVcbiAgICogdGhyb3VnaCB0aGUgRnVuY3Rpb24gVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBncmFudEludm9rZShncm91cDogc3RyaW5nLCBmdW5jdGlvblVybDogSUZ1bmN0aW9uVXJsKSB7XG4gICAgbmV3IENmblBlcm1pc3Npb24odGhpcywgYEludm9rZUZ1bmN0aW9uLSR7Z3JvdXB9YCwge1xuICAgICAgYWN0aW9uOiBcImxhbWJkYTpJbnZva2VGdW5jdGlvblwiLFxuICAgICAgcHJpbmNpcGFsOiBcImNsb3VkZnJvbnQuYW1hem9uYXdzLmNvbVwiLFxuICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvblVybC5mdW5jdGlvbkFybixcbiAgICAgIHNvdXJjZUFybjogdGhpcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uQXJuLFxuICAgICAgaW52b2tlZFZpYUZ1bmN0aW9uVXJsOiB0cnVlLFxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgYGFzc2V0UHJlZml4YCBwYXRoIHRoYXQgbmVlZHMgYSBiZWhhdmlvciBvZiBpdHMgb3duLCBvciBgXCJcImAgZm9yIG5vbmUuXG4gICAqXG4gICAqIEFuIGFic29sdXRlIHByZWZpeCBjb250cmlidXRlcyBpdHMgKnBhdGgqOiBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tXCIgbmVlZHMgbm9cbiAgICogYmVoYXZpb3IsIGJ1dCBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2NkblwiIGRvZXMsIGJlY2F1c2UgYG5leHQgYnVpbGRgXG4gICAqIGNvbXBpbGVzIGEgYC9jZG4vX25leHQvOnBhdGgrYCByZXdyaXRlIG9mIGl0cyBvd24gYW5kIGBuZXh0IHN0YXJ0YCBzZXJ2ZXNcbiAgICogZXZlcnkgYnVuZGxlIHVuZGVyIHRoYXQgcGF0aCDigJQgc28gYSBDRE4gZnJvbnRpbmcgdGhpcyBkaXN0cmlidXRpb24gdGhlcmUgaGFzXG4gICAqIHRvIGJlIGFuc3dlcmVkLiBBIHByZWZpeCBlcXVhbCB0byB0aGUgYGJhc2VQYXRoYCBwcmVmaXggaXMgZHJvcHBlZCDigJQgdGhhdCBpc1xuICAgKiB0aGUgTmV4dC5qcyBkZWZhdWx0IHdoZW4gYGJhc2VQYXRoYCBpcyBzZXQsIGFuZCBgX25leHQvc3RhdGljKmAgYWxyZWFkeVxuICAgKiByZXNvbHZlcyB1bmRlciBpdCwgc28gYWRkaW5nIGEgc2Vjb25kIGlkZW50aWNhbCBwYXR0ZXJuIHdvdWxkIG1ha2UgQ2xvdWRGcm9udFxuICAgKiByZWplY3QgdGhlIGRpc3RyaWJ1dGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUFzc2V0UHJlZml4KCk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJlZml4ID0gYXNzZXRQcmVmaXhQYXRoKHRoaXMucHJvcHMuYXNzZXRQcmVmaXggPz8gXCJcIik7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUJhc2VQYXRoKHByZWZpeCkgPT09IHRoaXMuYmFzZVBhdGggPyBcIlwiIDogcHJlZml4O1xuICB9XG4gIC8qKlxuICAgKiBTZXJ2ZXMgYDxhc3NldFByZWZpeD4vX25leHQvc3RhdGljLypgIGZyb20gdGhlIHNhbWUgUzMgb2JqZWN0cyBhc1xuICAgKiBgX25leHQvc3RhdGljLypgLlxuICAgKlxuICAgKiBOZWVkZWQgYmVjYXVzZSBOZXh0LmpzIHB1dHMgYGFzc2V0UHJlZml4YCBpbiBmcm9udCBvZiBldmVyeSBidW5kbGUgVVJMIGl0XG4gICAqIGVtaXRzIHdoaWxlIHRoZSBvYmplY3RzIGtlZXAgdGhlaXIgYDxiYXNlUGF0aD4vX25leHQvc3RhdGljLy4uLmAga2V5cywgYW5kXG4gICAqIGBhc3NldFByZWZpeGAgc2l0cyBvbiB0b3Agb2YgYGJhc2VQYXRoYCByYXRoZXIgdGhhbiB1bmRlciBpdCwgc29cbiAgICogYGdldFBhdGhQYXR0ZXJuYCBpcyBkZWxpYmVyYXRlbHkgbm90IHVzZWQgaGVyZS4gV2l0aG91dCB0aGlzIGJlaGF2aW9yIHRoZVxuICAgKiByZXF1ZXN0IGZhbGxzIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgb25lLCByZWFjaGVzIHRoZSBjb21wdXRlIG9yaWdpbiwgYW5kXG4gICAqIDQwNHM6IHRoZSBkZXBsb3ltZW50IHBhY2thZ2UgY2FycmllcyBubyBgLm5leHQvc3RhdGljYCBkaXJlY3RvcnkgYXQgYWxsLlxuICAgKlxuICAgKiBBIHZpZXdlci1yZXF1ZXN0IGZ1bmN0aW9uIGRvZXMgdGhlIHJld3JpdGUgYmVjYXVzZSBhbiBTMyBvcmlnaW4ga2V5cyBvbiB0aGVcbiAgICogcmVxdWVzdCBVUkkgYW5kIGBvcmlnaW5QYXRoYCBjYW4gb25seSBwcmVwZW5kLiBUaGUgcHJlZml4IGlzIGEgc3ludGgtdGltZVxuICAgKiBsaXRlcmFsLCBzbyB0aGUgZnVuY3Rpb24gaXMgYSBmaXhlZC1sZW5ndGggc3RyaW5nIG9wZXJhdGlvbiByYXRoZXIgdGhhbiBhXG4gICAqIHBhcnNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRBc3NldFByZWZpeEJlaGF2aW9yKCkge1xuICAgIC8vIFRoZSBzdGF0aWMgYmVoYXZpb3JzJyBvd24gdmlld2VyLXJlcXVlc3QgZnVuY3Rpb24sIHdoZW5cbiAgICAvLyBgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZWAgYWRkZWQgb25lLCBnaXZlcyB3YXkgdG8gdGhlIHJld3JpdGUsIHdoaWNoXG4gICAgLy8gcnVucyB0aGUgc2FtZSBjb2RlIGZpcnN0LlxuICAgIGNvbnN0IGFzc29jaWF0aW9ucyA9IChcbiAgICAgIHRoaXMuc3RhdGljQmVoYXZpb3JPcHRpb25zLmZ1bmN0aW9uQXNzb2NpYXRpb25zID8/IFtdXG4gICAgKS5maWx0ZXIoXG4gICAgICAoYXNzb2NpYXRpb24pID0+IGFzc29jaWF0aW9uLmZ1bmN0aW9uICE9PSB0aGlzLnBhc3NUaHJvdWdoRnVuY3Rpb24sXG4gICAgKTtcbiAgICB0aGlzLmFzc2VydFZpZXdlclJlcXVlc3RVbmNsYWltZWQoXG4gICAgICBcInN0YXRpY0JlaGF2aW9yT3B0aW9uc1wiLFxuICAgICAgYXNzb2NpYXRpb25zLFxuICAgICAgYHNlcnZpbmcgXFxgYXNzZXRQcmVmaXhcXGAgKFwiJHt0aGlzLmFzc2V0UHJlZml4fVwiKSBuZWVkcyB0aGF0IGV2ZW50IHR5cGUgYCArXG4gICAgICAgIGB0byByZXdyaXRlIHRoZSByZXF1ZXN0IFVSSSB0byB0aGUgb2JqZWN0J3Mga2V5YCxcbiAgICApO1xuICAgIGNvbnN0IHJld3JpdGUgPSBuZXcgQ2xvdWRGcm9udEZ1bmN0aW9uKHRoaXMsIFwiQXNzZXRQcmVmaXhGblwiLCB7XG4gICAgICBjb21tZW50OiB0aGlzLmdldENvbW1lbnQoXG4gICAgICAgIFwiTmV4dEpTIGFzc2V0UHJlZml4IHJld3JpdGVcIixcbiAgICAgICAgU3RhY2sub2YodGhpcykuc3RhY2tOYW1lLFxuICAgICAgKSxcbiAgICAgIC4uLnRoaXMudmlld2VyUmVxdWVzdEZ1bmN0aW9uUHJvcHMoXG4gICAgICAgIGFzc2V0UHJlZml4UmV3cml0ZUhhbmRsZXIodGhpcy5iYXNlUGF0aCwgdGhpcy5hc3NldFByZWZpeCksXG4gICAgICApLFxuICAgIH0pO1xuICAgIHRoaXMuZGlzdHJpYnV0aW9uLmFkZEJlaGF2aW9yKFxuICAgICAgYCR7dGhpcy5hc3NldFByZWZpeH0vX25leHQvc3RhdGljKmAsXG4gICAgICB0aGlzLnN0YXRpY09yaWdpbixcbiAgICAgIHtcbiAgICAgICAgLi4udGhpcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMsXG4gICAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiBbXG4gICAgICAgICAgLi4uYXNzb2NpYXRpb25zLFxuICAgICAgICAgIHsgZXZlbnRUeXBlOiBGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCwgZnVuY3Rpb246IHJld3JpdGUgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogU2VydmVzIGBfbmV4dC9zdGF0aWMvc2VydmljZS13b3JrZXIvKmAgd2l0aCBgU2VydmljZS1Xb3JrZXItQWxsb3dlZGAsIHdoaWNoXG4gICAqIHRoZSBicm93c2VyIHJlcXVpcmVzIGJlZm9yZSBpdCByZWdpc3RlcnMgYSBzZXJ2aWNlIHdvcmtlciBhdCBhIHNjb3BlIGFib3ZlXG4gICAqIHRoZSBzY3JpcHQncyBvd24gZGlyZWN0b3J5LiBBZGRlZCBhaGVhZCBvZiBgX25leHQvc3RhdGljKmAsIHdoaWNoIHdvdWxkXG4gICAqIG90aGVyd2lzZSBtYXRjaCBmaXJzdC5cbiAgICpcbiAgICogVGhlIHBvbGljeSBpcyB0aGUgc3RhdGljIG9uZSBwbHVzIHRoZSBoZWFkZXIsIHNvIHNlY3VyaXR5IGhlYWRlcnMgYW5kIGFueVxuICAgKiBgc3RhdGljUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHNgIHN0aWxsIGFwcGx5LiBBIHdob2xlXG4gICAqIGBzdGF0aWNCZWhhdmlvck9wdGlvbnMucmVzcG9uc2VIZWFkZXJzUG9saWN5YCBjYW4ndCBiZSBhZGRlZCB0bywgc28gaXQgaXNcbiAgICogdXNlZCBhcyBpdCBpcywgd2l0aCBhIHdhcm5pbmcuXG4gICAqL1xuICBwcml2YXRlIGFkZFNlcnZpY2VXb3JrZXJCZWhhdmlvcihzZXJ2aWNlV29ya2VyQWxsb3dlZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgb3ZlcnJpZGRlbiA9XG4gICAgICB0aGlzLnByb3BzLm92ZXJyaWRlcz8uc3RhdGljQmVoYXZpb3JPcHRpb25zPy5yZXNwb25zZUhlYWRlcnNQb2xpY3k7XG4gICAgaWYgKG92ZXJyaWRkZW4pIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmcoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IFxcYG92ZXJyaWRlcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMucmVzcG9uc2VIZWFkZXJzUG9saWN5XFxgIGAgK1xuICAgICAgICAgIGBpcyB1c2VkIGZvciBcXGBfbmV4dC9zdGF0aWMvc2VydmljZS13b3JrZXIvKlxcYCB0b28sIHNvIHNlcnZpY2UgYCArXG4gICAgICAgICAgYHdvcmtlcnMgZ2V0IG5vIFxcYFNlcnZpY2UtV29ya2VyLUFsbG93ZWQ6ICR7c2VydmljZVdvcmtlckFsbG93ZWR9XFxgIGAgK1xuICAgICAgICAgIGB1bmxlc3MgdGhhdCBwb2xpY3kgc2VuZHMgaXQsIGFuZCByZWdpc3RlcmluZyBvbmUgYXQgYSBzY29wZSBhYm92ZSBgICtcbiAgICAgICAgICBgaXRzIG93biBkaXJlY3RvcnkgZmFpbHMuIEFkZCB0aGUgaGVhZGVyIHRvIHlvdXIgcG9saWN5LCBvciBzZXQgYCArXG4gICAgICAgICAgYFxcYG92ZXJyaWRlcy5zdGF0aWNSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wc1xcYCBpbnN0ZWFkLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5zdGF0aWNSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcztcbiAgICBjb25zdCBjdXN0b21IZWFkZXJzID0gcHJvcHM/LmN1c3RvbUhlYWRlcnNCZWhhdmlvcj8uY3VzdG9tSGVhZGVycyA/PyBbXTtcbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnNQb2xpY3kgPVxuICAgICAgb3ZlcnJpZGRlbiA/P1xuICAgICAgbmV3IFJlc3BvbnNlSGVhZGVyc1BvbGljeSh0aGlzLCBcIlNlcnZpY2VXb3JrZXJSZXNwb25zZUhlYWRlcnNQb2xpY3lcIiwge1xuICAgICAgICBzZWN1cml0eUhlYWRlcnNCZWhhdmlvcjogdGhpcy5jb21tb25TZWN1cml0eUhlYWRlcnNCZWhhdmlvcixcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIFNlcnZpY2UgV29ya2VyIFJlc3BvbnNlIEhlYWRlcnMgUG9saWN5XCIsXG4gICAgICAgICAgU3RhY2sub2YodGhpcykuc3RhY2tOYW1lLFxuICAgICAgICApLFxuICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgLy8gUG9saWN5IG5hbWVzIGFyZSB1bmlxdWUgcGVyIGFjY291bnQsIHNvIHRoZSBzdGF0aWMgcG9saWN5J3MgY2FuJ3QgYmVcbiAgICAgICAgLy8gcmV1c2VkIGFzIGl0IGlzLCBhbmQgYXJlIGF0IG1vc3QgMTI4IGNoYXJhY3RlcnMsIHNvIGEgc3VmZml4IGNhbid0XG4gICAgICAgIC8vIHNpbXBseSBiZSBhZGRlZCB0byBvbmUgdGhhdCBpcyBhbHJlYWR5IHRoYXQgbG9uZy5cbiAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZTpcbiAgICAgICAgICBwcm9wcz8ucmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZSAmJlxuICAgICAgICAgIGAke1xuICAgICAgICAgICAgVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeU5hbWUpXG4gICAgICAgICAgICAgID8gcHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZVxuICAgICAgICAgICAgICA6IHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeU5hbWUuc2xpY2UoXG4gICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgTUFYX1BPTElDWV9OQU1FX0xFTkdUSCAtIFNFUlZJQ0VfV09SS0VSX1NVRkZJWC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgIH0ke1NFUlZJQ0VfV09SS0VSX1NVRkZJWH1gLFxuICAgICAgICBjdXN0b21IZWFkZXJzQmVoYXZpb3I6IHtcbiAgICAgICAgICAvLyBPbmUgdGhlIG92ZXJyaWRlIHNldHMgaXRzZWxmIGlzIGtlcHQuXG4gICAgICAgICAgY3VzdG9tSGVhZGVyczogY3VzdG9tSGVhZGVycy5zb21lKFxuICAgICAgICAgICAgKHsgaGVhZGVyIH0pID0+IGhlYWRlci50b0xvd2VyQ2FzZSgpID09PSBcInNlcnZpY2Utd29ya2VyLWFsbG93ZWRcIixcbiAgICAgICAgICApXG4gICAgICAgICAgICA/IGN1c3RvbUhlYWRlcnNcbiAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAgIC4uLmN1c3RvbUhlYWRlcnMsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaGVhZGVyOiBcIlNlcnZpY2UtV29ya2VyLUFsbG93ZWRcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZXJ2aWNlV29ya2VyQWxsb3dlZCxcbiAgICAgICAgICAgICAgICAgIG92ZXJyaWRlOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgIHRoaXMuZ2V0UGF0aFBhdHRlcm4oXCJfbmV4dC9zdGF0aWMvc2VydmljZS13b3JrZXIvKlwiKSxcbiAgICAgIHRoaXMuc3RhdGljT3JpZ2luLFxuICAgICAgeyAuLi50aGlzLnN0YXRpY0JlaGF2aW9yT3B0aW9ucywgcmVzcG9uc2VIZWFkZXJzUG9saWN5IH0sXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGFkZFN0YXRpY0JlaGF2aW9ycygpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5zZXJ2aWNlV29ya2VyQWxsb3dlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmFkZFNlcnZpY2VXb3JrZXJCZWhhdmlvcih0aGlzLnByb3BzLnNlcnZpY2VXb3JrZXJBbGxvd2VkKTtcbiAgICB9XG4gICAgdGhpcy5kaXN0cmlidXRpb24uYWRkQmVoYXZpb3IoXG4gICAgICB0aGlzLmdldFBhdGhQYXR0ZXJuKFwiX25leHQvc3RhdGljKlwiKSxcbiAgICAgIHRoaXMuc3RhdGljT3JpZ2luLFxuICAgICAgdGhpcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMsXG4gICAgKTtcbiAgICBpZiAodGhpcy5hc3NldFByZWZpeCkge1xuICAgICAgdGhpcy5hZGRBc3NldFByZWZpeEJlaGF2aW9yKCk7XG4gICAgfVxuICAgIGNvbnN0IHB1YmxpY1BhdGhQYXR0ZXJucyA9IHRoaXMucHVibGljUGF0aFBhdHRlcm5zKCk7XG4gICAgdGhpcy5hc3NlcnRCZWhhdmlvckJ1ZGdldChwdWJsaWNQYXRoUGF0dGVybnMubGVuZ3RoKTtcbiAgICB0aGlzLmFzc2VydE5vUHVibGljQ29sbGlzaW9ucyhwdWJsaWNQYXRoUGF0dGVybnMpO1xuICAgIGZvciAoY29uc3QgcGF0aFBhdHRlcm4gb2YgcHVibGljUGF0aFBhdHRlcm5zKSB7XG4gICAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgICAgcGF0aFBhdHRlcm4sXG4gICAgICAgIHRoaXMuc3RhdGljT3JpZ2luLFxuICAgICAgICB0aGlzLnN0YXRpY0JlaGF2aW9yT3B0aW9ucyxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgYmVoYXZpb3IgcGF0aCBwYXR0ZXJuIGZvciBlYWNoIHRvcC1sZXZlbCBgcHVibGljL2AgZW50cnksIGZpbmFsIGZvcm06XG4gICAqIGAvKmAgZm9yIGEgZGlyZWN0b3J5IGFuZCB0aGUgYmFzZVBhdGggcHJlZml4IGJvdGggYXBwbGllZC5cbiAgICpcbiAgICogQW4gZW50cnkgd2hvc2UgbmFtZSBoYXMgbm8gY2hhcmFjdGVyIENsb3VkRnJvbnQgY2FuIHNwZWxsIGlzIGxlZnQgb3V0LCB3aXRoXG4gICAqIGEgd2FybmluZywgcmF0aGVyIHRoYW4gZ2l2ZW4gYSBwYXR0ZXJuIG9mIG5vdGhpbmcgYnV0IHdpbGRjYXJkcy4gYNGE0L7RgtC+L2AgaXNcbiAgICogYD8/Pz8/Pz8/LypgIOKAlCBhbnkgOC1ieXRlIGZpcnN0IHNlZ21lbnQg4oCUIGFuZCBwdWJsaWMvIGJlaGF2aW9ycyBhcmUgYWRkZWRcbiAgICogYWhlYWQgb2YgZXZlcnkgY29tcHV0ZSBiZWhhdmlvciwgc28gaXQgd291bGQgc2VuZCBgL3Byb2R1Y3RzLzQyYCBhbmRcbiAgICogYC9zZXR0aW5ncy8qYCB0byBTMywgd2hpY2ggYW5zd2VycyA0MDMuIExlYXZpbmcgdGhlIGVudHJ5IG91dCBjb3N0cyBpdHMgb3duXG4gICAqIGZpbGVzIGluc3RlYWQ6IHRob3NlIHJlcXVlc3RzIHJlYWNoIHRoZSBjb21wdXRlLCB3aGljaCBkb2VzIG5vdCBoYXZlIHRoZW0sXG4gICAqIGFuZCA0MDQuIE9uZSBsaXRlcmFsIGNoYXJhY3RlciBpcyBlbm91Z2ggdG8ga2VlcCBhIHBhdHRlcm4gbmFycm93IOKAlFxuICAgKiBgPz8/Pz8/Pz8uanBnYCBvbmx5IG1hdGNoZXMgYC5qcGdgIHJlcXVlc3RzIOKAlCBzbyBvbmx5IHRoZSBhbGwtd2lsZGNhcmQgb25lc1xuICAgKiBnby5cbiAgICpcbiAgICogVGhlIGxlbmd0aCBsaW1pdCBpcyBjaGVja2VkIGhlcmUsIG9uIHRoZSBmaW5hbCBwYXR0ZXJuLCByYXRoZXIgdGhhbiBpblxuICAgKiB7QGxpbmsgdG9QYXRoUGF0dGVybn06IHRoZSBgLypgIGFuZCB0aGUgYmFzZVBhdGggY291bnQgYWdhaW5zdCBpdCB0b28sIGFuZCBhXG4gICAqIHBhdHRlcm4gdGhhdCBwYXNzZWQgd2l0aG91dCB0aGVtIGZhaWxlZCBhdCBkZXBsb3kgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgcHVibGljUGF0aFBhdHRlcm5zKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYXR0ZXJuczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB1bm1hdGNoYWJsZTogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHB1YmxpY0ZpbGUgb2YgdGhpcy5wcm9wcy5wdWJsaWNEaXJFbnRyaWVzKSB7XG4gICAgICBjb25zdCBuYW1lID0gdG9QYXRoUGF0dGVybihwdWJsaWNGaWxlLm5hbWUpO1xuICAgICAgaWYgKCEvW14/Ki9dLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgIHVubWF0Y2hhYmxlLnB1c2goYFwiJHtwdWJsaWNGaWxlLm5hbWV9XCJgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXRoUGF0dGVybiA9IHRoaXMuZ2V0UGF0aFBhdHRlcm4oXG4gICAgICAgIHB1YmxpY0ZpbGUuaXNEaXJlY3RvcnkgPyBgJHtuYW1lfS8qYCA6IG5hbWUsXG4gICAgICApO1xuICAgICAgaWYgKHBhdGhQYXR0ZXJuLmxlbmd0aCA+IE1BWF9QQVRIX1BBVFRFUk5fTEVOR1RIKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIHB1YmxpYy8gZW50cnkgXCIke3B1YmxpY0ZpbGUubmFtZX1cIiBuZWVkcyBhIGAgK1xuICAgICAgICAgICAgYCR7cGF0aFBhdHRlcm4ubGVuZ3RofS1jaGFyYWN0ZXIgQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4sIG92ZXIgYCArXG4gICAgICAgICAgICBgdGhlICR7TUFYX1BBVEhfUEFUVEVSTl9MRU5HVEh9LWNoYXJhY3RlciBgICtcbiAgICAgICAgICAgIFwibGltaXQuIFJlbmFtZSBpdCwgb3IgbW92ZSBpdCBpbnRvIGEgc3ViZGlyZWN0b3J5IG9mIHB1YmxpYy8gd2hvc2UgXCIgK1xuICAgICAgICAgICAgXCJvd24gbmFtZSBpcyBzaG9ydCBlbm91Z2guIFNlZSBcIiArXG4gICAgICAgICAgICBcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9Eb3dubG9hZERpc3RWYWx1ZXNDYWNoZUJlaGF2aW9yLmh0bWwjRG93bmxvYWREaXN0VmFsdWVzUGF0aFBhdHRlcm5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHBhdHRlcm5zLnB1c2gocGF0aFBhdHRlcm4pO1xuICAgIH1cbiAgICBpZiAodW5tYXRjaGFibGUubGVuZ3RoID4gMCkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZyhcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gVGhlc2UgdG9wLWxldmVsIHB1YmxpYy8gZW50cmllcyBoYXZlIG5vIGNoYXJhY3RlciBhIGAgK1xuICAgICAgICAgIFwiQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4gY2FuIHNwZWxsLCBzbyB0aGVpciBwYXR0ZXJuIHdvdWxkIGJlIFwiICtcbiAgICAgICAgICBcIndpbGRjYXJkcyBhbG9uZSBhbmQgd291bGQgY2FwdHVyZSBldmVyeSBhcHAgcm91dGUgb2YgdGhlIHNhbWUgXCIgK1xuICAgICAgICAgIGBsZW5ndGguIFRoZXkgZ2V0IG5vIGJlaGF2aW9yLCBzbyB0aGVpciByZXF1ZXN0cyByZWFjaCB0aGUgc2VydmVyLCBgICtcbiAgICAgICAgICBgd2hpY2ggcmVhZHMgdGhlbSBmcm9tIFMzIGluc3RlYWQ6ICR7dW5tYXRjaGFibGUuam9pbihcIiwgXCIpfS4gVG8gc2VydmUgYCArXG4gICAgICAgICAgXCJ0aGVtIGZyb20gUzMgZGlyZWN0bHksIHJlbmFtZSB0aGVtLCBvciBtb3ZlIHRoZW0gaW50byBhIHB1YmxpYy8gXCIgK1xuICAgICAgICAgIFwic3ViZGlyZWN0b3J5IHdob3NlIG5hbWUgaGFzIGF0IGxlYXN0IG9uZSBBU0NJSSBsZXR0ZXIgb3IgZGlnaXQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcGF0dGVybnM7XG4gIH1cbiAgLyoqXG4gICAqIFJlZnVzZSBhIGdyb3VwIGJlaGF2aW9yIHRoYXQgYSBgcHVibGljL2AgYmVoYXZpb3Igd291bGQgbWFrZSB1bnJlYWNoYWJsZS5cbiAgICpcbiAgICogYHB1YmxpYy9gIGJlaGF2aW9ycyBhcmUgYWRkZWQgZmlyc3QsIGFuZCBDbG91ZEZyb250IHN0b3BzIGF0IHRoZSBmaXJzdCBtYXRjaCxcbiAgICogc28gdHdvIGNhc2VzIHNlbmQgYSBncm91cCdzIHJvdXRlIHRvIFMzIGluc3RlYWQgb2YgaXRzIGZ1bmN0aW9uIOKAlCB3aGljaCBpc1xuICAgKiB3aHkgdGhpcyBpcyBjaGVja2VkIGF0IHN5bnRoLCB3aGVyZSBib3RoIHNpZGVzIGFyZSBrbm93bjpcbiAgICogLSB0aGUgc2FtZSBwYXR0ZXJuIHR3aWNlOiBgcHVibGljL2RvY3MvYCBhbmQgYC9kb2NzLyoqYCBib3RoIGRlcGxveSBhc1xuICAgKiAgIGBkb2NzLypgLiBUaGUgc3ludGggc3VjY2VlZGVkIGFuZCBDbG91ZEZyb250IHJlamVjdGVkIHRoZSBkZXBsb3kuXG4gICAqIC0gYSBncm91cCBwYXR0ZXJuIHVuZGVyIGEgcHVibGljIGRpcmVjdG9yeTogYC9kb2NzL2d1aWRlLyoqYCBiZWhpbmRcbiAgICogICBgZG9jcy8qYCBkZXBsb3lzIGFuZCBuZXZlciBtYXRjaGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NlcnROb1B1YmxpY0NvbGxpc2lvbnMocHVibGljUGF0aFBhdHRlcm5zOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHB1YmxpY1JlZ2V4ZXMgPSBwdWJsaWNQYXRoUGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiAoe1xuICAgICAgcGF0dGVybixcbiAgICAgIHJlZ2V4OiBjbG91ZEZyb250UGF0dGVyblJlZ2V4KGAvJHtwYXR0ZXJuLnJlcGxhY2UoL15cXC8rLywgXCJcIil9YCksXG4gICAgfSkpO1xuICAgIGZvciAoY29uc3QgeyBncm91cCwgcm91dGUsIHBhdGhQYXR0ZXJuIH0gb2YgdGhpcy5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzKCkpIHtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IHB1YmxpY1BhdGhQYXR0ZXJucy5pbmNsdWRlcyhwYXRoUGF0dGVybik7XG4gICAgICAvLyBNYXRjaGluZyB0aGUgZ3JvdXAgcGF0dGVybidzIG93biB0ZXh0IGlzIGVub3VnaDogaXRzIG9ubHkgd2lsZGNhcmQgaXMgYVxuICAgICAgLy8gdHJhaWxpbmcgYCpgLCBzbyBhIHB1YmxpYyBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyB0aGUgdGV4dCB1cCB0byBhbmRcbiAgICAgIC8vIGluY2x1ZGluZyBpdCBtYXRjaGVzIGV2ZXJ5IFVSTCB0aGUgZ3JvdXAgcGF0dGVybiBkb2VzLlxuICAgICAgY29uc3Qgc2hhZG93ID0gZHVwbGljYXRlXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogcHVibGljUmVnZXhlcy5maW5kKCh7IHJlZ2V4IH0pID0+XG4gICAgICAgICAgICByZWdleC50ZXN0KGAvJHtwYXRoUGF0dGVybi5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpfWApLFxuICAgICAgICAgICk7XG4gICAgICBpZiAoIWR1cGxpY2F0ZSAmJiAhc2hhZG93KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBwYXR0ZXJuIFwiJHtyb3V0ZX1cIiAoZ3JvdXAgYCArXG4gICAgICAgICAgYFwiJHtncm91cC5uYW1lfVwiKSBgICtcbiAgICAgICAgICAoZHVwbGljYXRlXG4gICAgICAgICAgICA/IGBkZXBsb3lzIGFzIHRoZSBwYXRoIHBhdHRlcm4gXCIke3BhdGhQYXR0ZXJufVwiLCB3aGljaCBhIHRvcC1sZXZlbCBgICtcbiAgICAgICAgICAgICAgYHB1YmxpYy8gZW50cnkgYWxyZWFkeSB1c2VzIOKAlCBDbG91ZEZyb250IHJlamVjdHMgYSBkaXN0cmlidXRpb24gYCArXG4gICAgICAgICAgICAgIGB3aXRoIHR3byBiZWhhdmlvcnMgb24gb25lIHBhdGggcGF0dGVybi4gYFxuICAgICAgICAgICAgOiBgZGVwbG95cyBhcyBcIiR7cGF0aFBhdHRlcm59XCIsIGJ1dCB0aGUgdG9wLWxldmVsIHB1YmxpYy8gZW50cnkgYCArXG4gICAgICAgICAgICAgIGBiZWhpbmQgXCIke3NoYWRvdyEucGF0dGVybn1cIiBpcyBtYXRjaGVkIGZpcnN0IGFuZCBzZW5kcyBldmVyeSBgICtcbiAgICAgICAgICAgICAgYHN1Y2ggcmVxdWVzdCB0byBTMywgc28gdGhlIGdyb3VwJ3MgZnVuY3Rpb24gd291bGQgbmV2ZXIgc2VlIGAgK1xuICAgICAgICAgICAgICBgdGhlbS4gYCkgK1xuICAgICAgICAgIGBNb3ZlIHRob3NlIHB1YmxpYy8gZmlsZXMgdW5kZXIgYSBkaXJlY3Rvcnkgbm8gcm91dGUgdXNlcywgb3IgYCArXG4gICAgICAgICAgYGdyb3VwIGEgZGlmZmVyZW50IHBhdGguYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDbG91ZEZyb250IGhhcyBhIHBlci1kaXN0cmlidXRpb24gY2FjaGUgYmVoYXZpb3IgcXVvdGEsIGNvdW50aW5nIHRoZSBkZWZhdWx0XG4gICAqIG9uZSDigJQgNzUgdW5sZXNzIHJhaXNlZCwgYW5kIGBtYXhDYWNoZUJlaGF2aW9yc2Agc2F5cyB3aGljaCDigJQgYW5kIHRoZXJlIGFyZVxuICAgKiB0aHJlZSB0aGluZ3MgY29tcGV0aW5nIGZvciBpdDogYHB1YmxpYy9gIGVudHJpZXMsIGZ1bmN0aW9uIGdyb3VwcywgYW5kXG4gICAqIGNkay1uZXh0anMncyBvd24gZml4ZWQgc2V0LlxuICAgKiBDaGVja2VkIGluIG9uZSBwbGFjZSBzbyB0aGUgZXJyb3IgY2FuIHNheSB3aGljaCB0byBjdXQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Nsb3VkZnJvbnQtbGltaXRzLmh0bWwjbGltaXRzLXdlYi1kaXN0cmlidXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzc2VydEJlaGF2aW9yQnVkZ2V0KHB1YmxpY1BhdHRlcm5zOiBudW1iZXIpIHtcbiAgICBjb25zdCBsaW1pdCA9IHRoaXMucHJvcHMubWF4Q2FjaGVCZWhhdmlvcnMgPz8gREVGQVVMVF9NQVhfQ0FDSEVfQkVIQVZJT1JTO1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQobGltaXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGdyb3VwUGF0dGVybnMgPSB0aGlzLmZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMoKS5sZW5ndGg7XG4gICAgLy8gVGhlIGRlZmF1bHQgYmVoYXZpb3IsIGBfbmV4dC9pbWFnZSpgLCBgX25leHQvc3RhdGljKmAsIHBsdXMg4oCUIHdpdGggYVxuICAgIC8vIGJhc2VQYXRoIOKAlCB0aGUgdHdvIHRoYXQgc3RhbmQgaW4gZm9yIHRoZSBkZWZhdWx0IGJlaGF2aW9yJ3MgY292ZXJhZ2UsIGFuZFxuICAgIC8vIOKAlCB3aXRoIGEgcGF0aC1zdHlsZSBhc3NldFByZWZpeCDigJQgdGhlIG9uZSB0aGF0IHNlcnZlcyBidW5kbGVzIHVuZGVyIGl0LFxuICAgIC8vIGFuZCDigJQgd2l0aCBzZXJ2aWNlIHdvcmtlcnMg4oCUIHRoZSBvbmUgdGhhdCBhZGRzIGBTZXJ2aWNlLVdvcmtlci1BbGxvd2VkYC5cbiAgICAvLyBgdGhpcy5iYXNlUGF0aGAsIG5vdCB0aGUgcmF3IHByb3A6IGBiYXNlUGF0aDogXCIvXCJgIG5vcm1hbGl6ZXMgdG8gYFwiXCJgIGFuZFxuICAgIC8vIGFkZHMgbm8gYmVoYXZpb3JzLCBzbyBjb3VudGluZyBpdCBhZGRlZCAyIHRvIHRoZSB0b3RhbCBhbmQgY291bGQgdGhyb3dcbiAgICAvLyBcIm92ZXIgdGhlIGxpbWl0XCIgb24gYW4gYXBwIHRoYXQgaXMgdW5kZXIgaXQuXG4gICAgY29uc3QgZml4ZWQgPVxuICAgICAgMyArXG4gICAgICAodGhpcy5iYXNlUGF0aCA/IDIgOiAwKSArXG4gICAgICAodGhpcy5hc3NldFByZWZpeCA/IDEgOiAwKSArXG4gICAgICAodGhpcy5wcm9wcy5zZXJ2aWNlV29ya2VyQWxsb3dlZCAhPT0gdW5kZWZpbmVkID8gMSA6IDApO1xuICAgIGNvbnN0IHRvdGFsID0gZml4ZWQgKyBwdWJsaWNQYXR0ZXJucyArIGdyb3VwUGF0dGVybnM7XG4gICAgaWYgKHRvdGFsIDw9IGxpbWl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgYCR7Zml4ZWR9IHVzZWQgYnkgY2RrLW5leHRqcyBpdHNlbGZgLFxuICAgICAgYCR7cHVibGljUGF0dGVybnN9IGZvciB0b3AtbGV2ZWwgcHVibGljLyBlbnRyaWVzYCxcbiAgICBdO1xuICAgIGlmIChncm91cFBhdHRlcm5zKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke2dyb3VwUGF0dGVybnN9IGZvciBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBwYXR0ZXJuc2ApO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhpcyBOZXh0LmpzIGFwcCBuZWVkcyAke3RvdGFsfSBDbG91ZEZyb250IGNhY2hlIGJlaGF2aW9ycywgb3ZlciB0aGUgYCArXG4gICAgICAgIGBsaW1pdCBvZiAke2xpbWl0fSBwZXIgZGlzdHJpYnV0aW9uOiAke3BhcnRzLmpvaW4oXCIsIFwiKX0uIGAgK1xuICAgICAgICBgTW92ZSBwdWJsaWMvIGZpbGVzIGludG8gYSBzaW5nbGUgdG9wLWxldmVsIGRpcmVjdG9yeSAob25lIGJlaGF2aW9yIGAgK1xuICAgICAgICBgc2VydmVzIFxcYHN0YXRpYy8qXFxgKWAgK1xuICAgICAgICAoZ3JvdXBQYXR0ZXJuc1xuICAgICAgICAgID8gYCwgYW5kIHByZWZlciBvbmUgc3VidHJlZSBwYXR0ZXJuIHBlciBmdW5jdGlvbiBncm91cCBvdmVyIHNldmVyYWwgYCArXG4gICAgICAgICAgICBgZXhhY3QgcGF0aHNgXG4gICAgICAgICAgOiBgYCkgK1xuICAgICAgICBgLiBJZiB5b3VyIGFjY291bnQncyBxdW90YSBpcyBoaWdoZXIgdGhhbiAke2xpbWl0fSwgc2V0IGAgK1xuICAgICAgICBgXFxgbWF4Q2FjaGVCZWhhdmlvcnNcXGAgdG8gaXQuIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY2xvdWRmcm9udC1saW1pdHMuaHRtbCNsaW1pdHMtd2ViLWRpc3RyaWJ1dGlvbnNgLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgcHJlcGVuZHMgYmFzZSBwYXRoIHRvIGdpdmVuIHBhdGggcGF0dGVybi5cbiAgICpcbiAgICogQSB0cmFpbGluZyBzbGFzaCBvbiBgcGF0aFBhdHRlcm5gIGlzIGxvYWQtYmVhcmluZyBhbmQgc3Vydml2ZXMsIHdoaWNoIGlzIHdoeVxuICAgKiB0aGlzIGNvbmNhdGVuYXRlcyByYXRoZXIgdGhhbiBnb2luZyB0aHJvdWdoIGBqb2luUGF0aGAuIFRoZSBidWlsZCdzXG4gICAqIGBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzYCBob2xkIGJvdGggXCJwcmljaW5nXCIgYW5kIFwicHJpY2luZy9cIiBmb3IgYVxuICAgKiBgdHJhaWxpbmdTbGFzaGAgYXBwLCBhbmQgbm9ybWFsaXppbmcgdGhlIHNlY29uZCBvbmUgY29sbGFwc2VkIGl0IG9udG8gdGhlXG4gICAqIGZpcnN0OiBgYWRkQmVoYXZpb3JgIHdhc1xuICAgKiB0aGVuIGNhbGxlZCB0d2ljZSB3aXRoIGAvYmFzZS9wcmljaW5nYCwgd2hpY2ggQ2xvdWRGcm9udCByZWplY3RzIGF0IGRlcGxveVxuICAgKiAoXCJtb3JlIHRoYW4gb25lIGNhY2hlIGJlaGF2aW9yIGhhcyB0aGUgc2FtZSBwYXRoIHBhdHRlcm5cIiksIGFuZCB0aGVcbiAgICogY2Fub25pY2FsIGAvYmFzZS9wcmljaW5nL2Agd2FzIGxlZnQgdG8gdGhlIGAvYmFzZS8qYCBjYXRjaC1hbGwg4oCUIHRoZSBtaXNyb3V0ZVxuICAgKiB0aGUgc2Vjb25kIHBhdHRlcm4gZXhpc3RzIHRvIHByZXZlbnQuXG4gICAqL1xuICBwcml2YXRlIGdldFBhdGhQYXR0ZXJuKHBhdGhQYXR0ZXJuOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuYmFzZVBhdGgpIHtcbiAgICAgIHJldHVybiBwYXRoUGF0dGVybjtcbiAgICB9XG4gICAgcmV0dXJuIGAvJHt0aGlzLmJhc2VQYXRofS8ke3BhdGhQYXR0ZXJuLnJlcGxhY2UoL15cXC8rLywgXCJcIil9YDtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYGR5bmFtaWNDYWNoZVBvbGljeVByb3BzYCB0dXJucyB0aGUgZHluYW1pYyBjYWNoZSBvZmYsIGJ5IGNhcHBpbmcgZXZlcnlcbiAqIFRUTCBhdCAwLlxuICpcbiAqIENsb3VkRnJvbnQgcmVqZWN0cyBhIHBvbGljeSB0aGF0IGNhY2hlcyBub3RoaW5nIGJ1dCBzdGlsbCBoYXMgYSBjYWNoZSBrZXlcbiAqIChcIkhlYWRlckJlaGF2aW9yIGlzIGludmFsaWQgZm9yIHBvbGljeSB3aXRoIGNhY2hpbmcgZGlzYWJsZWRcIiksIHNvIHN1Y2ggYVxuICogcG9saWN5IGhhcyB0byBkcm9wIHRoZSBrZXkuIFVudGlsIHRoZSBkZWZhdWx0IFRUTCBiZWNhbWUgMCB0aGlzIGNvdWxkIG5vdFxuICogY29tZSB1cDogQ0RLIHJhaXNlcyBgbWF4VHRsYCB0byBgZGVmYXVsdFR0bGAgd2hlbiBpdCBpcyBsb3dlciwgc28gYW4gb3ZlcnJpZGVcbiAqIG9mIGBtYXhUdGw6IDBgIHN5bnRoZXNpemVkIGFzIGEgZGF5IGFuZCBkZXBsb3llZC4gTm93IGl0IGlzIGhvbm9yZWQsIGFuZFxuICogd2l0aG91dCB0aGlzIHRoZSB1cGdyYWRlIGRlcGxveSB3b3VsZCBmYWlsLlxuICpcbiAqIFRoZSBUVExzIGFyZSByZXNvbHZlZCB0aGUgd2F5IENESyByZXNvbHZlcyB0aGVtOiBgZGVmYXVsdFR0bGAgcmFpc2VkIHRvXG4gKiBgbWluVHRsYCwgdGhlbiBgbWF4VHRsYCByYWlzZWQgdG8gYGRlZmF1bHRUdGxgLiBDaGVja2luZyBgbWF4VHRsYCBhbG9uZSBjYWxsZWRcbiAqIGB7IG1heFR0bDogMCwgZGVmYXVsdFR0bDogMWggfWAgZGlzYWJsZWQsIGRyb3BwZWQgdGhlIGtleSwgYW5kIENESyB0aGVuXG4gKiBzeW50aGVzaXplZCBhIHBvbGljeSB0aGF0IGNhY2hlcyBmb3IgYW4gaG91ciBrZXllZCBvbiBub3RoaW5nIOKAlCBvbmUgdmlld2VyJ3NcbiAqIHBhZ2Ugc2VydmVkIHRvIGV2ZXJ5IHZpZXdlci5cbiAqL1xuZnVuY3Rpb24gaXNDYWNoaW5nRGlzYWJsZWQocHJvcHM6IENhY2hlUG9saWN5UHJvcHMgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgY29uc3QgdHRscyA9IFtwcm9wcz8ubWF4VHRsLCBwcm9wcz8uZGVmYXVsdFR0bCwgcHJvcHM/Lm1pblR0bF07XG4gIGlmIChwcm9wcz8ubWF4VHRsID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTsgLy8gQ0RLJ3MgZGVmYXVsdCBpcyBhIHllYXJcbiAgcmV0dXJuIHR0bHMuZXZlcnkoXG4gICAgKHR0bCkgPT5cbiAgICAgIHR0bCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAoIVRva2VuLmlzVW5yZXNvbHZlZCh0dGwudG9TdHJpbmcoKSkgJiYgdHRsLnRvU2Vjb25kcygpID09PSAwKSxcbiAgKTtcbn1cblxuLyoqIFRoZSBjYWNoZS1rZXkgaGFsZiBvZiB7QGxpbmsgQ2FjaGVQb2xpY3lQcm9wc30uICovXG5pbnRlcmZhY2UgQ2FjaGVLZXlQcm9wcyB7XG4gIHJlYWRvbmx5IHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvcjtcbiAgcmVhZG9ubHkgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3I7XG4gIHJlYWRvbmx5IGNvb2tpZUJlaGF2aW9yOiBDYWNoZUNvb2tpZUJlaGF2aW9yO1xuICByZWFkb25seSBlbmFibGVBY2NlcHRFbmNvZGluZ0Jyb3RsaTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIGR5bmFtaWMgY2FjaGUgcG9saWN5IGtleXMgb246IGV2ZXJ5IHJlcXVlc3QgaW5wdXQgYSBOZXh0LmpzIHJlc3BvbnNlXG4gKiB2YXJpZXMgYnkuXG4gKi9cbmNvbnN0IERZTkFNSUNfQ0FDSEVfS0VZOiBDYWNoZUtleVByb3BzID0ge1xuICBxdWVyeVN0cmluZ0JlaGF2aW9yOiBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsKCksXG4gIGhlYWRlckJlaGF2aW9yOiBDYWNoZUhlYWRlckJlaGF2aW9yLmFsbG93TGlzdChcbiAgICAvLyBOT1RFOiBDbG91ZEZyb250IEN1c3RvbSBDYWNoZSBQb2xpY2llcyBoYXZlIHNvZnQgbWF4IG9mIDEwIGhlYWRlcnNcbiAgICAvLyBjZGstbmV4dGpzIGluY2x1ZGVzIHRoZSBtb3N0IGVzc2VudGlhbCBoZWFkZXJzIGZvciBOZXh0LmpzIGZ1bmN0aW9uYWxpdHlcbiAgICAvLyBhbmQgbGVhdmVzIG91dCB0aGUgb25lIGNvbW1lbnRlZCBvdXQgYmVsb3c7IGtleWluZyBvbiBpdCBhcyB3ZWxsIG5lZWRzIGFcbiAgICAvLyBxdW90YSBpbmNyZWFzZVxuICAgIC8vIG1vcmUgaGVyZTogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Nsb3VkZnJvbnQtbGltaXRzLmh0bWwjbGltaXRzLXBvbGljaWVzXG4gICAgXCJhY2NlcHRcIiwgLy8gY29udGVudCBuZWdvdGlhdGlvbiAoSFRNTCB2cyBSU0MgcGF5bG9hZClcbiAgICBcInJzY1wiLCAvLyBSZWFjdCBTZXJ2ZXIgQ29tcG9uZW50cyByZXF1ZXN0c1xuICAgIFwibmV4dC11cmxcIiwgLy8gTmV4dC5qcyByb3V0aW5nXG4gICAgXCJuZXh0LXJvdXRlci1zdGF0ZS10cmVlXCIsIC8vIEFwcCBSb3V0ZXIgbmF2aWdhdGlvbiBzdGF0ZVxuICAgIFwibmV4dC1yb3V0ZXItcHJlZmV0Y2hcIiwgLy8gcHJlZmV0Y2ggYmVoYXZpb3JcbiAgICBcIm5leHQtcm91dGVyLXNlZ21lbnQtcHJlZmV0Y2hcIiwgLy8gc2VnbWVudC1sZXZlbCBwcmVmZXRjaGluZ1xuICAgIFwieC1wcmVyZW5kZXItcmV2YWxpZGF0ZVwiLCAvLyBvbi1kZW1hbmQgSVNSIHJldmFsaWRhdGlvblxuICAgIC8vIERyYWZ0IG1vZGUgbmVlZHMgbm8gaGVhZGVyOiBpdCBpcyB0aGUgYF9fcHJlcmVuZGVyX2J5cGFzc2AgY29va2llLCB3aGljaFxuICAgIC8vIGBjb29raWVCZWhhdmlvci5hbGwoKWAgYWxyZWFkeSBrZXlzIG9uLlxuICAgIC8vIFwieC1wcmVyZW5kZXItcmV2YWxpZGF0ZS1pZi1nZW5lcmF0ZWRcIiwgLy8gY29uZGl0aW9uYWwgcmV2YWxpZGF0aW9uIChuaWNoZSB1c2UgY2FzZSlcbiAgKSxcbiAgY29va2llQmVoYXZpb3I6IENhY2hlQ29va2llQmVoYXZpb3IuYWxsKCksXG4gIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiB0cnVlLFxuICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IHRydWUsXG59O1xuXG4vKipcbiAqIEEgY2FjaGUga2V5IG9mIG5vdGhpbmcsIGZvciBhIHBvbGljeSB0aGF0IGNhY2hlcyBub3RoaW5nLiBGb3J3YXJkaW5nIGlzXG4gKiB1bmFmZmVjdGVkOiB0aGUgZHluYW1pYyBvcmlnaW4gcmVxdWVzdCBwb2xpY3kgc2VuZHMgZXZlcnkgdmlld2VyIGhlYWRlcixcbiAqIGNvb2tpZSBhbmQgcXVlcnkgc3RyaW5nIHJlZ2FyZGxlc3MuXG4gKi9cbmNvbnN0IERJU0FCTEVEX0NBQ0hFX0tFWTogQ2FjaGVLZXlQcm9wcyA9IHtcbiAgcXVlcnlTdHJpbmdCZWhhdmlvcjogQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLm5vbmUoKSxcbiAgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3Iubm9uZSgpLFxuICBjb29raWVCZWhhdmlvcjogQ2FjaGVDb29raWVCZWhhdmlvci5ub25lKCksXG4gIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiBmYWxzZSxcbiAgZW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiBmYWxzZSxcbn07XG5cbi8qKlxuICogQ2xvdWRGcm9udCdzIGRlZmF1bHQgXCJDYWNoZSBiZWhhdmlvcnMgcGVyIGRpc3RyaWJ1dGlvblwiIHF1b3RhLCB0aGUgZGVmYXVsdFxuICogYmVoYXZpb3IgaW5jbHVkZWQuIEFkanVzdGFibGUsIGhlbmNlIGBtYXhDYWNoZUJlaGF2aW9yc2AuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY2xvdWRmcm9udC1saW1pdHMuaHRtbCNsaW1pdHMtd2ViLWRpc3RyaWJ1dGlvbnNcbiAqL1xuY29uc3QgREVGQVVMVF9NQVhfQ0FDSEVfQkVIQVZJT1JTID0gNzU7XG5cbi8qKlxuICogV2hldGhlciBgY2hhcmAgaXMgaW4gQ2xvdWRGcm9udCdzIHBhdGggcGF0dGVybiBhbHBoYWJldDogdGhlIGxpdGVyYWxzLCBwbHVzIHRoZVxuICogYCpgIGFuZCBgP2Agd2lsZGNhcmRzLiBObyBzcGFjZSwgbm8gYCVgLCBub3RoaW5nIG5vbi1BU0NJSS5cbiAqL1xuZnVuY3Rpb24gaXNQYXRoUGF0dGVybkNoYXIoY2hhcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaGFyID09PSBcIipcIiB8fCBjaGFyID09PSBcIj9cIiB8fCBQQVRIX1BBVFRFUk5fTElURVJBTC50ZXN0KGNoYXIpO1xufVxuLyoqXG4gKiBDbG91ZEZyb250J3MgbGltaXQgb24gYSByZXNwb25zZSBoZWFkZXJzIHBvbGljeSBuYW1lLCBhbmQgdGhlIHN1ZmZpeCB0aGF0XG4gKiB0ZWxscyB0aGUgc2VydmljZSB3b3JrZXIgcG9saWN5J3MgYXBhcnQgZnJvbSB0aGUgc3RhdGljIG9uZSdzLlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xvdWRmcm9udC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZXNwb25zZUhlYWRlcnNQb2xpY3lDb25maWcuaHRtbFxuICovXG5jb25zdCBNQVhfUE9MSUNZX05BTUVfTEVOR1RIID0gMTI4O1xuY29uc3QgU0VSVklDRV9XT1JLRVJfU1VGRklYID0gXCItc3dcIjtcbi8qKiBDbG91ZEZyb250J3MgcGF0aCBwYXR0ZXJuIGxlbmd0aCBsaW1pdC4gKi9cbmNvbnN0IE1BWF9QQVRIX1BBVFRFUk5fTEVOR1RIID0gMjU1O1xuXG4vKipcbiAqIEEgYHB1YmxpYy9gIGVudHJ5J3MgbmFtZSBhcyBhIENsb3VkRnJvbnQgcGF0aCBwYXR0ZXJuLlxuICpcbiAqIGBwdWJsaWMvaGVsbG8gd29ybGQuanBnYCBpcyBhIHZhbGlkIE5leHQuanMgYXNzZXQg4oCUIGBuZXh0IHN0YXJ0YCBzZXJ2ZXMgaXQsIGFuZFxuICogYG5leHQvaW1hZ2VgIHBvaW50cyBhdCBpdCDigJQgYnV0IGEgc3BhY2UgY2Fubm90IGFwcGVhciBpbiBhIHBhdGggcGF0dGVybiwgc29cbiAqIGNkay1uZXh0anMgdXNlZCB0byB0aHJvdyBhdCBzeW50aCBhbmQgdGhlIGFwcCBjb3VsZCBub3QgYmUgZGVwbG95ZWQgYXQgYWxsXG4gKiAoYG5leHQtaW1hZ2UtbGVnYWN5L3VuaWNvZGVgLCB3aG9zZSBgcHVibGljL2AgYWxzbyBob2xkcyBgw6TDtsO8xaHEjcWZw60ucG5nYCkuXG4gKlxuICogQ2xvdWRGcm9udCBVUkwtZGVjb2RlcyB0aGUgcmVxdWVzdCBwYXRoIGJlZm9yZSBtYXRjaGluZyBpdCwgc28gdGhlIHBhdHRlcm4gaXNcbiAqIG1hdGNoZWQgYWdhaW5zdCBgaGVsbG8gd29ybGQuanBnYCwgbm90IHRoZSBgL2hlbGxvJTIwd29ybGQuanBnYCBvbiB0aGUgd2lyZS5cbiAqIEVhY2ggY2hhcmFjdGVyIG91dHNpZGUgdGhlIGFscGhhYmV0IGlzIHJlcGxhY2VkIGJ5IG9uZSBgP2AgcGVyIGJ5dGUgb2YgaXRzXG4gKiBVVEYtOCBlbmNvZGluZywgYmVjYXVzZSB0aGF0IGlzIHdoYXQgYD9gIG1hdGNoZXM6IGBoZWxsbz93b3JsZC5qcGdgIGZvciB0aGVcbiAqIHNwYWNlLCBhbmQgdHdvIGA/YCBmb3IgZWFjaCBjaGFyYWN0ZXIgb2YgYMOkw7bDvMWhxI3FmcOtLnBuZ2AuIE1lYXN1cmVkIGFnYWluc3QgYVxuICogZGVwbG95ZWQgZGlzdHJpYnV0aW9uOyBhIGA/YCBwZXIgKnBlcmNlbnQtZW5jb2RlZCogY2hhcmFjdGVyIChgaGVsbG8/Pz93b3JsZGApXG4gKiBzeW50aGVzaXplcyBmaW5lIGFuZCBuZXZlciBtYXRjaGVzLiBBIGAqYCB3b3VsZCBiZSBzaG9ydGVyIGFuZCBtdWNoIHdpZGVyOlxuICogYMOkw7bDvMWhxI3FmcOtLnBuZ2Agd291bGQgYmVjb21lIGAqLnBuZ2AsIHdoaWNoIHdvdWxkIHB1bGwgZXZlcnkgYC5wbmdgIHJlcXVlc3QgaW5cbiAqIHRoZSBhcHAgb250byB0aGUgc3RhdGljIG9yaWdpbi5cbiAqL1xuZnVuY3Rpb24gdG9QYXRoUGF0dGVybihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gWy4uLm5hbWVdXG4gICAgLm1hcCgoY2hhcikgPT5cbiAgICAgIGlzUGF0aFBhdHRlcm5DaGFyKGNoYXIpXG4gICAgICAgID8gY2hhclxuICAgICAgICA6IFwiP1wiLnJlcGVhdChCdWZmZXIuYnl0ZUxlbmd0aChjaGFyLCBcInV0ZjhcIikpLFxuICAgIClcbiAgICAuam9pbihcIlwiKTtcbn1cbiJdfQ==
|