@liflig/cdk 3.3.0 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api-gateway/{authorizer-lambdas → authorizers}/basic-auth-authorizer.d.ts +3 -4
- package/lib/api-gateway/authorizers/basic-auth-authorizer.js +160 -0
- package/lib/api-gateway/authorizers/cognito-user-pool-authorizer.js +133 -0
- package/lib/api-gateway/{authorizer-lambdas → authorizers}/cognito-user-pool-or-basic-auth-authorizer.d.ts +3 -4
- package/lib/api-gateway/authorizers/cognito-user-pool-or-basic-auth-authorizer.js +238 -0
- package/lib/api-gateway/http-api-gateway.d.ts +67 -45
- package/lib/api-gateway/http-api-gateway.js +17 -7
- package/package.json +1 -1
- package/lib/api-gateway/authorizer-lambdas/basic-auth-authorizer.js +0 -144
- package/lib/api-gateway/authorizer-lambdas/cognito-user-pool-authorizer.js +0 -133
- package/lib/api-gateway/authorizer-lambdas/cognito-user-pool-or-basic-auth-authorizer.js +0 -222
- /package/lib/api-gateway/{authorizer-lambdas → authorizers}/cognito-user-pool-authorizer.d.ts +0 -0
|
@@ -260,6 +260,16 @@ export class ApiGateway extends constructs.Construct {
|
|
|
260
260
|
resultsCacheTtl: cdk.Duration.hours(1),
|
|
261
261
|
});
|
|
262
262
|
}
|
|
263
|
+
case "CUSTOM_LAMBDA_AUTHORIZER": {
|
|
264
|
+
return new authorizers.HttpLambdaAuthorizer(id, authorization.lambdaAuthorizer, {
|
|
265
|
+
...authorization.authorizerProps,
|
|
266
|
+
responseTypes: authorization.authorizerProps?.responseTypes ?? [
|
|
267
|
+
authorizers.HttpLambdaResponseType.SIMPLE,
|
|
268
|
+
],
|
|
269
|
+
resultsCacheTtl: authorization.authorizerProps?.resultsCacheTtl ??
|
|
270
|
+
cdk.Duration.hours(1),
|
|
271
|
+
});
|
|
272
|
+
}
|
|
263
273
|
}
|
|
264
274
|
}
|
|
265
275
|
createIntegration(integration, dns) {
|
|
@@ -406,7 +416,7 @@ const authorizerFileExtension = __dirname.endsWith("src/api-gateway")
|
|
|
406
416
|
? "ts"
|
|
407
417
|
: "js";
|
|
408
418
|
/**
|
|
409
|
-
* Creates a custom authorizer
|
|
419
|
+
* Creates a custom Lambda authorizer which reads `Authorization: Bearer <access token>` header and
|
|
410
420
|
* verifies the token against a Cognito user pool.
|
|
411
421
|
*/
|
|
412
422
|
class CognitoUserPoolAuthorizer extends constructs.Construct {
|
|
@@ -421,7 +431,7 @@ class CognitoUserPoolAuthorizer extends constructs.Construct {
|
|
|
421
431
|
constructor(scope, id, props) {
|
|
422
432
|
super(scope, id);
|
|
423
433
|
this.lambda = new lambdaNodejs.NodejsFunction(this, "AuthorizerFunction", {
|
|
424
|
-
entry: path.join(__dirname, `
|
|
434
|
+
entry: path.join(__dirname, `authorizers/cognito-user-pool-authorizer.${authorizerFileExtension}`),
|
|
425
435
|
runtime: lambda.Runtime.NODEJS_22_X,
|
|
426
436
|
timeout: cdk.Duration.seconds(5),
|
|
427
437
|
environment: {
|
|
@@ -438,7 +448,7 @@ class CognitoUserPoolAuthorizer extends constructs.Construct {
|
|
|
438
448
|
}
|
|
439
449
|
}
|
|
440
450
|
/**
|
|
441
|
-
* Creates a custom authorizer
|
|
451
|
+
* Creates a custom Lambda authorizer which reads `Authorization: Basic <base64-encoded credentials>`
|
|
442
452
|
* header and verifies the credentials against a given secret.
|
|
443
453
|
*/
|
|
444
454
|
class BasicAuthAuthorizer extends constructs.Construct {
|
|
@@ -450,7 +460,7 @@ class BasicAuthAuthorizer extends constructs.Construct {
|
|
|
450
460
|
constructor(scope, id, props) {
|
|
451
461
|
super(scope, id);
|
|
452
462
|
this.lambda = new lambdaNodejs.NodejsFunction(this, "BasicAuthLambda", {
|
|
453
|
-
entry: path.join(__dirname, `
|
|
463
|
+
entry: path.join(__dirname, `authorizers/basic-auth-authorizer.${authorizerFileExtension}`),
|
|
454
464
|
description: "An authorizer for API-Gateway that checks Basic Auth credentials on requests",
|
|
455
465
|
runtime: lambda.Runtime.NODEJS_22_X,
|
|
456
466
|
environment: {
|
|
@@ -465,7 +475,7 @@ class BasicAuthAuthorizer extends constructs.Construct {
|
|
|
465
475
|
}
|
|
466
476
|
}
|
|
467
477
|
/**
|
|
468
|
-
* Creates a custom authorizer
|
|
478
|
+
* Creates a custom Lambda authorizer which allows both:
|
|
469
479
|
* - `Authorization: Bearer <access token>` header, for which the token is checked against the given
|
|
470
480
|
* Cognito user pool
|
|
471
481
|
* - `Authorization: Basic <base64-encoded credentials>` header, for which the credentials are
|
|
@@ -485,7 +495,7 @@ class CognitoUserPoolOrBasicAuthAuthorizer extends constructs.Construct {
|
|
|
485
495
|
constructor(scope, id, props) {
|
|
486
496
|
super(scope, id);
|
|
487
497
|
this.lambda = new lambdaNodejs.NodejsFunction(this, "AuthorizerFunction", {
|
|
488
|
-
entry: path.join(__dirname, `
|
|
498
|
+
entry: path.join(__dirname, `authorizers/cognito-user-pool-or-basic-auth-authorizer.${authorizerFileExtension}`),
|
|
489
499
|
runtime: lambda.Runtime.NODEJS_22_X,
|
|
490
500
|
timeout: cdk.Duration.seconds(5),
|
|
491
501
|
environment: {
|
|
@@ -585,4 +595,4 @@ function shortHash(str) {
|
|
|
585
595
|
// which is fine
|
|
586
596
|
return createHash("sha1").update(str).digest("hex").substring(0, 10);
|
|
587
597
|
}
|
|
588
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1hcGktZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGktZ2F0ZXdheS9odHRwLWFwaS1nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sYUFBYSxDQUFBO0FBR2xDLE9BQU8sS0FBSyxNQUFNLE1BQU0sd0JBQXdCLENBQUE7QUFFaEQsT0FBTyxLQUFLLEtBQUssTUFBTSw4QkFBOEIsQ0FBQTtBQUNyRCxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFBO0FBQzVDLE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUE7QUFDMUMsT0FBTyxLQUFLLGNBQWMsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUNoRSxPQUFPLEtBQUssWUFBWSxNQUFNLDJDQUEyQyxDQUFBO0FBQ3pFLE9BQU8sS0FBSyxXQUFXLE1BQU0sMENBQTBDLENBQUE7QUFFdkUsT0FBTyxLQUFLLFlBQVksTUFBTSwrQkFBK0IsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ25DLE9BQU8sS0FBSyxPQUFPLE1BQU0seUJBQXlCLENBQUE7QUFDbEQsT0FBTyxLQUFLLGNBQWMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNqRSxPQUFPLEtBQUssR0FBRyxNQUFNLG9DQUFvQyxDQUFBO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUE7QUFDNUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUVuQyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FB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O0FBQ3RFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0IHR5cGUgKiBhcyBlbGIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyXCJcbmltcG9ydCB0eXBlICogYXMgZWMyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCJcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiXG5pbXBvcnQgdHlwZSAqIGFzIHNxcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNxc1wiXG5pbXBvcnQgKiBhcyBhcGlndyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXl2MlwiXG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIlxuaW1wb3J0ICogYXMgc2VjcmV0c21hbmFnZXIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiXG5pbXBvcnQgKiBhcyBpbnRlZ3JhdGlvbnMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5djItaW50ZWdyYXRpb25zXCJcbmltcG9ydCAqIGFzIGF1dGhvcml6ZXJzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyLWF1dGhvcml6ZXJzXCJcbmltcG9ydCB0eXBlIHsgSVVzZXJQb29sIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jb2duaXRvXCJcbmltcG9ydCAqIGFzIGxhbWJkYU5vZGVqcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanNcIlxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0ICogYXMgcm91dGU1MyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIlxuaW1wb3J0ICogYXMgcm91dGU1M1RhcmdldHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHNcIlxuaW1wb3J0ICogYXMgYWNtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCJcbmltcG9ydCB7IHRhZ1Jlc291cmNlcyB9IGZyb20gXCIuLi90YWdzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJ1cmxcIlxuXG5jb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpXG5jb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoX19maWxlbmFtZSlcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIHtAbGluayBBcGlHYXRld2F5fSBjb25zdHJ1Y3QuXG4gKlxuICogQGF1dGhvciBLcmlzdGlhbiBSZWtzdGFkIDxrcmVAY2FwcmFjb25zdWx0aW5nLm5vPlxuICogQGF1dGhvciBIZXJtYW5uIE3DuHJrcmlkIDxoZW1AbGlmbGlnLm5vPlxuICovXG5leHBvcnQgdHlwZSBBcGlHYXRld2F5UHJvcHM8QXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0ge1xuICAvKiogU2V0dGluZ3MgZm9yIHRoZSBleHRlcm5hbC1mYWNpbmcgcGFydCBvZiB0aGUgQVBJLUdXLiAqL1xuICBkbnM6IEFwaUdhdGV3YXlEbnNQcm9wc1xuXG4gIC8qKlxuICAgKiBJZiBubyBpbnRlZ3JhdGlvbiBpcyBzcGVjaWZpZWQgZm9yIGEgcm91dGUsIHRoaXMgaW50ZWdyYXRpb24gaXMgdXNlZC5cbiAgICpcbiAgICogU2VlIHtAbGluayBJbnRlZ3JhdGlvblByb3BzfSBmb3IgdGhlIGF2YWlsYWJsZSBvcHRpb25zLlxuICAgKi9cbiAgZGVmYXVsdEludGVncmF0aW9uPzogSW50ZWdyYXRpb25Qcm9wc1xuXG4gIC8qKlxuICAgKiBJZiBubyBhdXRob3JpemF0aW9uIGlzIHNwZWNpZmllZCBmb3IgYSByb3V0ZSwgdGhpcyBhdXRob3JpemF0aW9uIGlzIHVzZWQuXG4gICAqXG4gICAqIFNlZSB7QGxpbmsgQXV0aG9yaXphdGlvblByb3BzfSBmb3IgdGhlIGF2YWlsYWJsZSBvcHRpb25zLlxuICAgKi9cbiAgZGVmYXVsdEF1dGhvcml6YXRpb24/OiBBdXRob3JpemF0aW9uUHJvcHM8QXV0aFNjb3Blc1Q+XG5cbiAgcm91dGVzOiBBcGlHYXRld2F5Um91dGU8QXV0aFNjb3Blc1Q+W11cblxuICAvKipcbiAgICogVGhlIEFQSS1HVyBhY2Nlc3MgbG9ncyBmb3IgdGhlIGAkZGVmYXVsdGAgc3RhZ2UgYXJlIGtlcHQuXG4gICAqIFRoaXMgaGFzIG9wdGlvbnMgZm9yIHRoZSBsb2dzLlxuICAgKi9cbiAgYWNjZXNzTG9ncz86IEFwaUdhdGV3YXlBY2Nlc3NMb2dzUHJvcHNcblxuICAvKipcbiAgICogU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgcm91dGUtbGV2ZWwgbWV0cmljcy5cbiAgICogVGhpcyBjYW4gaW5jcmVhc2UgQ2xvdWRXYXRjaCBjb3N0cyB3aGVuIG5vdCBkaXNhYmxlZC5cbiAgICpcbiAgICogU2VlIFtBV1M6IFdvcmtpbmcgd2l0aCBtZXRyaWNzIGZvciBIVFRQIEFQSXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1tZXRyaWNzLmh0bWw/aWNtcGlkPWFwaWdhdGV3YXlfY29uc29sZV9oZWxwIzp+OnRleHQ9YW5kJTIwc3RhZ2UlMjBJRC4tLEFwaUlkJTJDJTIwU3RhZ2UlMkMlMjBSb3V0ZSwtRmlsdGVycyUyMEFQSSUyMEdhdGV3YXkpXG4gICAqIGZvciBtb3JlIGluZm8uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGRldGFpbGVkTWV0cmljcz86IGJvb2xlYW5cblxuICAvKipcbiAgICogVGhyb3R0bGluZyBvZiByZXF1ZXN0cy5cbiAgICogSWYgbm90IHNldCwgdGhlIEFXUyBkZWZhdWx0IG9mIDUwMDAgYnVyc3QgYW5kIDEwMDAwIHJhdGUgaXMgdXNlZC5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgdGhyb3R0bGluZyBpcyBwZXItYWNjb3VudCwgYW5kIGNvdW50cyBhbGwgQVBJcyBpbiB0aGUgYWNjb3VudCBhbmQgcmVnaW9uLlxuICAgKiBJZiB5b3UgaGF2ZSBhbm90aGVyIEFQSSBpbiB0aGlzIHJlZ2lvbiBnZXR0aW5nIDEwXzAwMCByZXF1ZXN0IHJhdGUsIGl0IG1heSBpbXBhY3QgdGhpcyBBUEkgYXMgd2VsbC5cbiAgICovXG4gIHRocm90dGxpbmc/OiB7XG4gICAgLyoqXG4gICAgICogR29pbmcgb3ZlciBgNV8wMDBgIG1heSByZXF1aXJlIHlvdSB0byBjb250YWN0IEFXUyBTdXBwb3J0IC0gdGhleSBhcmUgYWNjb3VudCBib3VuZC5cbiAgICAgKi9cbiAgICBidXJzdD86IG51bWJlclxuICAgIC8qKlxuICAgICAqIEdvaW5nIG92ZXIgYDEwXzAwMGAgbWF5IHJlcXVpcmUgeW91IHRvIGNvbnRhY3QgQVdTIFN1cHBvcnQgLSB0aGV5IGFyZSBhY2NvdW50IGJvdW5kLlxuICAgICAqL1xuICAgIHJhdGU/OiBudW1iZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIENPUlMgaGVhZGVycyBvbiByZXNwb25zZXMgZnJvbSB0aGUgQVBJIEdhdGV3YXkgdG8gYWxsb3cgYWxsIG9yaWdpbnMsIGhlYWRlcnMgYW5kIG1ldGhvZHMuXG4gICAqIFVzZWZ1bCBpZiB5b3VyIEFQSSBzaG91bGQgYmUgYWNjZXNzZWQgYnkgYW55IGJyb3dzZXIuXG4gICAqL1xuICBjb3JzQWxsb3dBbGw/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIElmIHNvbWUgc2V0dGluZ3MgaW4gdGhpcyBjb25zdHJ1Y3QgZG8gbm90IHdvcmsgZm9yIHlvdSwgdGhpcyBpcyBhbiBlc2NhcGUgaGF0Y2ggbWVjaGFuaXNtIHRvXG4gICAqIG92ZXJyaWRlIGFueXRoaW5nLlxuICAgKi9cbiAgcHJvcHNPdmVycmlkZT86IHtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSBzZXR0aW5ncyBmb3IgdGhlIHtAbGluayBhcGlndy5IdHRwQXBpfSAoYWNjZXNzaWJsZSBpbiB7QGxpbmsgQXBpR2F0ZXdheS5odHRwQXBpfSkuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBmcm9udGVuZCBhY2Nlc3NpbmcgdGhpcyBBUEksIHlvdSBtaWdodCB3YW50IHRvIHNldFxuICAgICAqIFtDT1JTIHByZWZsaWdodF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nkay9hcGkvdjEvZG9jcy9hd3MtYXBpZ2F0ZXdheXYyLXJlYWRtZS5odG1sI2Nyb3NzLW9yaWdpbi1yZXNvdXJjZS1zaGFyaW5nLWNvcnMpXG4gICAgICogc2V0dGluZ3MuXG4gICAgICovXG4gICAgaHR0cEFwaT86IFBhcnRpYWw8YXBpZ3cuSHR0cEFwaVByb3BzPlxuICB9XG59XG5cbmV4cG9ydCB0eXBlIEFwaUdhdGV3YXlEbnNQcm9wcyA9IHtcbiAgLyoqXG4gICAqIE9ubHkgdGhlIHN1YmRvbWFpbiBwcmVmaXgsIHdoaWNoIHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgc2VydmljZS5cbiAgICogRXhhbXBsZTogU3ViZG9tYWluIGBwcm9kdWN0YCB3b3VsZCBnaXZlIHRoZSBlbmQgcmVzdWx0IG9mIGFuIEFQSS1HVyB3aXRoXG4gICAqIGBwcm9kdWN0LnBsYXRmb3JtLmV4YW1wbGUubm9gLlxuICAgKi9cbiAgc3ViZG9tYWluOiBzdHJpbmdcblxuICAvKipcbiAgICogSG9zdGVkIFpvbmUgZm9yIHRoZSBleHRlcm5hbCBmYWNpbmcgZG9tYWluLlxuICAgKiBUaGlzIGlzIHdoZXJlIHJvdXRlcyB3aWxsIGJlIGNyZWF0ZWQsIHRvIHJlZGlyZWN0IGNvbnN1bWVycyB0byB0aGUgQVBJLUdXLlxuICAgKiBGb3IgZXhhbXBsZSBhIEhaIGZvciBgcGxhdGZvcm0uZXhhbXBsZS5ub2AuXG4gICAqL1xuICBob3N0ZWRab25lOiByb3V0ZTUzLklIb3N0ZWRab25lXG5cbiAgLyoqXG4gICAqIFRoZSBUaW1lIFRvIExpdmUgKFRUTCkgZm9yIHRoZSBwdWJsaWMgRE5TIEEgcmVjb3JkIHRoYXQgd2lsbCBleHBvc2UgdGhlIEFQSS1HVy5cbiAgICogVGhpcyBpcyBob3cgbG9uZyBETlMgc2VydmVycyB3aWxsIGNhY2hlIHRoZSByZWNvcmQuXG4gICAqXG4gICAqIEEgbG9uZyBUVEwgKGhvdXJzKSBpcyBiZW5lZmljaWFsIHRvIEROUyBzZXJ2ZXJzLCBidXQgbWFrZXMgZGV2ZWxvcGVycyAoeW91KSB3YWl0IGxvbmdlciB3aGVuXG4gICAqIGRvaW5nIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IDUgbWludXRlc1xuICAgKi9cbiAgdHRsPzogY2RrLkR1cmF0aW9uXG59XG5cbmV4cG9ydCB0eXBlIEFwaUdhdGV3YXlSb3V0ZTxBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XG4gIC8qKiBUaGUgcGF0aCBvZiB0aGUgcm91dGUgdG8gZXhwb3NlIHRocm91Z2ggdGhlIEFQSSBHYXRld2F5LiBVc2UgXCIvXCIgZm9yIHRoZSByb290IHJvdXRlLiAqL1xuICBwYXRoOiBzdHJpbmdcblxuICAvKipcbiAgICogQnkgZGVmYXVsdCwgd2Ugb25seSBmb3J3YXJkIHJlcXVlc3RzIHRoYXQgbWF0Y2ggdGhlIHJvdXRlJ3MgcGF0aCBleGFjdGx5LiBTbyBmb3IgYSByb3V0ZSB3aXRoXG4gICAqIHBhdGggYC9hcGkvdXNlcnNgLCBhIHJlcXVlc3QgdG8gYC9hcGkvdXNlcnNgIHdpbGwgYmUgZm9yd2FyZGVkLCBidXQgYSByZXF1ZXN0IHRvXG4gICAqIGAvYXBpL3VzZXJzL2FkbWluYCB3aWxsIG5vdC4gSWYgeW91IHdhbnQgdG8gZm9yd2FyZCByZXF1ZXN0cyB0byBhbGwgc3ViLXBhdGhzIHVuZGVyIHRoZSByb3V0ZSdzXG4gICAqIHBhdGgsIHlvdSBjYW4gc2V0IHRoaXMgdG8gdHJ1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGluY2x1ZGVTdWJwYXRocz86IGJvb2xlYW5cblxuICAvKipcbiAgICogVGhlIEhUVFAgbWV0aG9kIHRvIGV4cG9zZS4gYEFOWWAgZXhwb3NlcyBhbGwgSFRUUCBtZXRob2RzIG9uIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIkFOWVwiXG4gICAqL1xuICBtZXRob2Q/OiBIdHRwTWV0aG9kXG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlZ3JhdGlvbiB0aGF0IHRoZSByb3V0ZSB3aWxsIGZvcndhcmQgdG8uIFNlZSB7QGxpbmsgSW50ZWdyYXRpb25Qcm9wc30gZm9yIHRoZSBhdmFpbGFibGVcbiAgICogb3B0aW9ucy5cbiAgICpcbiAgICogSWYgdW5kZWZpbmVkLCB1c2VzIHRoZSB7QGxpbmsgQXBpR2F0ZXdheVByb3BzLmRlZmF1bHRJbnRlZ3JhdGlvbn0uXG4gICAqL1xuICBpbnRlZ3JhdGlvbj86IEludGVncmF0aW9uUHJvcHNcblxuICAvKipcbiAgICogSG93IHJlcXVlc3RzIG9uIHRoZSByb3V0ZSBhcmUgYXV0aGVudGljYXRlZC4gU2VlIHtAbGluayBBdXRob3JpemF0aW9uUHJvcHN9IGZvciB0aGUgYXZhaWxhYmxlXG4gICAqIG9wdGlvbnMuXG4gICAqXG4gICAqIElmIHVuZGVmaW5lZCwgdXNlcyB0aGUge0BsaW5rIEFwaUdhdGV3YXlQcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvbn0uXG4gICAqL1xuICBhdXRob3JpemF0aW9uPzogQXV0aG9yaXphdGlvblByb3BzPEF1dGhTY29wZXNUPlxufVxuXG5leHBvcnQgdHlwZSBIdHRwTWV0aG9kID1cbiAgfCBcIkFOWVwiXG4gIHwgXCJHRVRcIlxuICB8IFwiUE9TVFwiXG4gIHwgXCJQVVRcIlxuICB8IFwiUEFUQ0hcIlxuICB8IFwiREVMRVRFXCJcbiAgfCBcIk9QVElPTlNcIlxuICB8IFwiSEVBRFwiXG5cbmV4cG9ydCB0eXBlIEludGVncmF0aW9uUHJvcHMgPVxuICAvKiogVXNlIHRoaXMgd2hlbiBjb25uZWN0aW5nIHRoZSByb3V0ZSB0byBhbiBBTEIgKEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXIpLiAqL1xuICB8ICh7IHR5cGU6IFwiQUxCXCIgfSAmIEFsYkludGVncmF0aW9uUHJvcHMpXG4gIC8qKiBVc2UgdGhpcyB3aGVuIGNvbm5lY3Rpbmcgcm91dGUgdG8gYSBMYW1iZGEuICovXG4gIHwgKHsgdHlwZTogXCJMYW1iZGFcIiB9ICYgTGFtYmRhSW50ZWdyYXRpb25Qcm9wcylcbiAgLyoqIFVzZSB0aGlzIHdoZW4gY29ubmVjdGluZyBhIHJvdXRlIHRvIHNlbmQgdG8gYW4gU1FTIHF1ZXVlLiAqL1xuICB8ICh7IHR5cGU6IFwiU1FTXCIgfSAmIFNxc0ludGVncmF0aW9uUHJvcHMpXG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBBUEktR1cgLT4gQUxCIChBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VyKSBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBTZWUgdGhlIG5vdGUgb24ge0BsaW5rIEFwaUdhdGV3YXl9IGFib3V0IHRoZSBsb2FkIGJhbGFuY2VyIHNlY3VyaXR5IGdyb3VwLlxuICovXG5leHBvcnQgdHlwZSBBbGJJbnRlZ3JhdGlvblByb3BzID0ge1xuICAvKipcbiAgICogQSBsaXN0ZW5lciBvbiBlLmcuIHBvcnQgNDQzIChIVFRQUykuXG4gICAqXG4gICAqIFNlZSB0aGUgbm90ZSBvbiB7QGxpbmsgQXBpR2F0ZXdheX0gYWJvdXQgdGhlIGxvYWQgYmFsYW5jZXIgc2VjdXJpdHkgZ3JvdXAuXG4gICAqL1xuICBsb2FkQmFsYW5jZXJMaXN0ZW5lcjogZWxiLklBcHBsaWNhdGlvbkxpc3RlbmVyXG5cbiAgLyoqXG4gICAqIFRoZSBob3N0IG5hbWUgKGRvbWFpbiBuYW1lKSBvZiB0aGUgYmFja2VuZCBzZXJ2aWNlIHRoYXQgd2Ugd2FudCB0byByZWFjaCB0aHJvdWdoIHRoZSBBTEIuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZCB0bzpcbiAgICogLSBWZXJpZnkgdGhlIEhUVFBTIGNlcnRpZmljYXRlIG9mIHRoZSBiYWNrZW5kIHNlcnZpY2UsIHNvIHRoYXQgdGhlIHJlcXVlc3QgZm9yd2FyZGVkIGZyb21cbiAgICogICBBUEktR1cgY2FuIHVzZSBUTFNcbiAgICogLSBTZXQgdGhlIGBIb3N0YCBoZWFkZXIgb24gdGhlIHJlcXVlc3Qgd2hlbiBmb3J3YXJkaW5nIHRvIHRoZSBBTEIsIHNvIHRoYXQgcmVxdWVzdHMgY2FuIGJlXG4gICAqICAgcm91dGVkIHRvIHRoZSBjb3JyZWN0IFRhcmdldCBHcm91cFxuICAgKlxuICAgKiBFeGFtcGxlIHZhbHVlOiBgPHNlcnZpY2U+LnN0YWdpbmcubXktcHJvamVjdC5saWZsaWcuaW9gIChub3QgcHJlZml4ZWQgYnkgYGh0dHBzOi8vYCkuXG4gICAqL1xuICBob3N0TmFtZTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgdXNlZCBieSB0aGUgQUxCLiBUaGUgQVBJLUdXIGludGVncmF0aW9uIHdpbGwgY29ubmVjdCB0byB0aGUgQUxCIHVzaW5nIGEgVlBDIExpbmsgZm9yXG4gICAqIHRoaXMgVlBDLlxuICAgKlxuICAgKiBTZWUgdGhlIG5vdGUgb24ge0BsaW5rIEFwaUdhdGV3YXl9IGFib3V0IHRoZSBsb2FkIGJhbGFuY2VyIHNlY3VyaXR5IGdyb3VwLlxuICAgKi9cbiAgdnBjOiBlYzIuSVZwY1xuXG4gIC8qKlxuICAgKiBBIHNlY3VyaXR5IGdyb3VwIChTRykgdGhhdCBhbGxvd3MgaW5jb21pbmcgdHJhZmZpYyB0byB0aGUgQUxCLiBXaWxsIGJlIHVzZWQgYnkgdGhlIFZQQyBsaW5rLCBzb1xuICAgKiB0aGUgQVBJLUdXIGludGVncmF0aW9uIGNhbiBjb25uZWN0LlxuICAgKlxuICAgKiBUaGlzIGlzIHVzdWFsbHkgdGhlIHNhbWUgU0cgYXMgdGhlIEFMQiB1c2VzLCBiZWNhdXNlIHRoZXkgaGF2ZSBhIHJ1bGUgdGhhdCBhbGxvd3MgdHJhZmZpYyBmcm9tXG4gICAqIG90aGVycyBpbiB0aGUgc2FtZSBTRy5cbiAgICpcbiAgICogU2VlIHRoZSBub3RlIG9uIHtAbGluayBBcGlHYXRld2F5fSBhYm91dCB0aGUgbG9hZCBiYWxhbmNlciBzZWN1cml0eSBncm91cC5cbiAgICovXG4gIHNlY3VyaXR5R3JvdXA6IGVjMi5JU2VjdXJpdHlHcm91cFxuXG4gIC8qKlxuICAgKiBNYXAgcmVxdWVzdCBwYXJhbWV0ZXJzIChhZGQvb3ZlcndyaXRlIHBhdGgvaGVhZGVycy9xdWVyeSBwYXJhbXMpIGJlZm9yZSBmb3J3YXJkaW5nIHRvIHRoZVxuICAgKiBiYWNrZW5kLlxuICAgKlxuICAgKiBTZWUge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1wYXJhbWV0ZXItbWFwcGluZy5odG1sfVxuICAgKiBmb3IgbW9yZSBvbiB0aGlzLiBSZWFkIHRoZSAnUmVzZXJ2ZWQgaGVhZGVycycgc2VjdGlvbiBmb3Igd2hpY2ggaGVhZGVycyBjYW5ub3QgYmUgb3ZlcnJpZGRlbi5cbiAgICogSW4gYWRkaXRpb24gdG8gdGhlIEFXUy1yZXNlcnZlZCBoZWFkZXJzLCB5b3Ugc2hvdWxkIG5vdCBvdmVycmlkZSB0aGUgJ0hvc3QnIGhlYWRlciBlaXRoZXIsIGFzXG4gICAqIHRoYXQncyB1c2VkIGZvciByb3V0aW5nIHRoZSByZXF1ZXN0IHRvIHRoZSBjb3JyZWN0IHNlcnZpY2UgYmVoaW5kIHRoZSBsb2FkIGJhbGFuY2VyLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZTpcbiAgICpcbiAgICogQWRkaW5nIGEgaGVhZGVyOlxuICAgKiBgYGBcbiAgICogbWFwUGFyYW1ldGVyczogKHBhcmFtZXRlcnMpID0+IHBhcmFtZXRlcnMub3ZlcndyaXRlSGVhZGVyKFxuICAgKiAgICBcIlgtTXktQ3VzdG9tLUhlYWRlclwiLFxuICAgKiAgICBhcGlndy5NYXBwaW5nVmFsdWUuY3VzdG9tKFwibXktY3VzdG9tLXZhbHVlXCIpLFxuICAgKiApXG4gICAqIGBgYFxuICAgKlxuICAgKiBPdmVyd3JpdGluZyB0aGUgcGF0aCAoaWYsIGZvciBleGFtcGxlLCB5b3UgY29uZmlndXJlIGEgYC91c2Vyc2Agcm91dGUgb24gdGhlIEFQSSBHYXRld2F5IHRoYXRcbiAgICogeW91IHdhbnQgdG8gZm9yd2FyZCB0byBgL2FwaS91c2Vyc2Agb24gdGhlIGJhY2tlbmQpOlxuICAgKiBgYGBcbiAgICogbWFwUGFyYW1ldGVyczogKHBhcmFtZXRlcnMpID0+IHBhcmFtZXRlcnMub3ZlcndyaXRlUGF0aChcIi9hcGkvdXNlcnNcIilcbiAgICogYGBgXG4gICAqL1xuICBtYXBQYXJhbWV0ZXJzPzogKHBhcmFtZXRlcnM6IGFwaWd3LlBhcmFtZXRlck1hcHBpbmcpID0+IHZvaWRcbn1cblxuZXhwb3J0IHR5cGUgTGFtYmRhSW50ZWdyYXRpb25Qcm9wcyA9IHtcbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEgaW50ZWdyYXRpb24gdXNlcyB0aGUgVjIgcGF5bG9hZCBmb3JtYXQ6XG4gICAqIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktZGV2ZWxvcC1pbnRlZ3JhdGlvbnMtbGFtYmRhLmh0bWx9XG4gICAqXG4gICAqIElmIHdyaXRpbmcgdGhlIExhbWJkYSBpbiBUeXBlU2NyaXB0LCB0aGlzIG1lYW5zIHlvdSBzaG91bGQgdXNlIGBBUElHYXRld2F5UHJveHlFdmVudFYyYCBhcyB0aGVcbiAgICogcmVxdWVzdCB0eXBlLCBhbmQgYEFQSUdhdGV3YXlQcm94eVJlc3VsdFYyYCBhcyB0aGUgcmVzcG9uc2UgdHlwZS5cbiAgICovXG4gIGxhbWJkYTogbGFtYmRhLklGdW5jdGlvblxufVxuXG5leHBvcnQgdHlwZSBTcXNJbnRlZ3JhdGlvblByb3BzID0ge1xuICBxdWV1ZTogc3FzLklRdWV1ZVxuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGF0dHJpYnV0ZXMgdG8gcGFzcyBvbiB0byBTUVMuIFRoZSBrZXlzIGluIHRoaXMgb2JqZWN0IGFyZSB0aGUgbmFtZXMgb2YgdGhlIGF0dHJpYnV0ZXMuXG4gICAqIEVhY2ggYXR0cmlidXRlIGhhcyBhIERhdGFUeXBlIGZpZWxkLCBhbmQgZWl0aGVyIGEgU3RyaW5nVmFsdWUgb3IgQmluYXJ5VmFsdWUgZmllbGQgZGVwZW5kaW5nIG9uXG4gICAqIGl0cyB0eXBlLiBTZWUgQVdTIGRvY3M6XG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NTaW1wbGVRdWV1ZVNlcnZpY2UvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTWVzc2FnZUF0dHJpYnV0ZVZhbHVlLmh0bWxcbiAgICpcbiAgICogSW4gdGhlIFN0cmluZ1ZhbHVlIGZpZWxkLCB5b3UgY2FuIGRvIEFQSSBHYXRld2F5IHBhcmFtZXRlciBtYXBwaW5nOlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktcGFyYW1ldGVyLW1hcHBpbmcuaHRtbFxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiBgYGBcbiAgICogbWVzc2FnZUF0dHJpYnV0ZXM6IHtcbiAgICogICBjbGllbnRJZDoge1xuICAgKiAgICAgRGF0YVR5cGU6IFwiU3RyaW5nXCIsXG4gICAqICAgICBTdHJpbmdWYWx1ZTogXCIke2NvbnRleHQuYXV0aG9yaXplci5jbGllbnRJZH1cIixcbiAgICogICB9LFxuICAgKiB9LFxuICAgKiBgYGBcbiAgICovXG4gIG1lc3NhZ2VBdHRyaWJ1dGVzPzoge1xuICAgIFthdHRyaWJ1dGVOYW1lOiBzdHJpbmddOlxuICAgICAgfCB7IERhdGFUeXBlOiBcIlN0cmluZ1wiIHwgXCJOdW1iZXJcIjsgU3RyaW5nVmFsdWU6IHN0cmluZyB9XG4gICAgICB8IHtcbiAgICAgICAgICBEYXRhVHlwZTogXCJCaW5hcnlcIlxuICAgICAgICAgIC8qKiBCYXNlNjQtZW5jb2RlZCBiaW5hcnkgZGF0YSBvYmplY3QuICovXG4gICAgICAgICAgQmluYXJ5VmFsdWU6IHN0cmluZ1xuICAgICAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQXV0aG9yaXphdGlvblByb3BzPEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9XG4gIC8qKlxuICAgKiBObyBhdXRoZW50aWNhdGlvbiwgZm9yIHdoZW4geW91IHdhbnQgYSBmdWxseSBwdWJsaWMgcm91dGUgKG9yIGhhbmRsZSBhdXRoZW50aWNhdGlvbiBpbiB0aGVcbiAgICogYmFja2VuZCBpbnRlZ3JhdGlvbikuXG4gICAqL1xuICB8IHsgdHlwZTogXCJOT05FXCIgfVxuICAvKipcbiAgICogQVdTIElBTSBhdXRob3JpemF0aW9uLlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktYWNjZXNzLWNvbnRyb2wtaWFtLmh0bWxcbiAgICovXG4gIHwgeyB0eXBlOiBcIklBTVwiIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjdXN0b20gYXV0aG9yaXplciBsYW1iZGEgd2hpY2ggcmVhZHMgYEF1dGhvcml6YXRpb246IEJlYXJlciA8YWNjZXNzIHRva2VuPmAgaGVhZGVyXG4gICAqIGFuZCB2ZXJpZmllcyB0aGUgdG9rZW4gYWdhaW5zdCBhIENvZ25pdG8gdXNlciBwb29sLlxuICAgKi9cbiAgfCAoe1xuICAgICAgdHlwZTogXCJDT0dOSVRPX1VTRVJfUE9PTFwiXG4gICAgfSAmIENvZ25pdG9Vc2VyUG9vbEF1dGhvcml6ZXJQcm9wczxBdXRoU2NvcGVzVD4pXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY3VzdG9tIGF1dGhvcml6ZXIgbGFtYmRhIHdoaWNoIHJlYWRzIGBBdXRob3JpemF0aW9uOiBCYXNpYyA8YmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHM+YFxuICAgKiBoZWFkZXIgYW5kIHZlcmlmaWVzIHRoZSBjcmVkZW50aWFscyBhZ2FpbnN0IGEgZ2l2ZW4gc2VjcmV0LlxuICAgKi9cbiAgfCAoeyB0eXBlOiBcIkJBU0lDX0FVVEhcIiB9ICYgQmFzaWNBdXRoQXV0aG9yaXplclByb3BzKVxuICAvKipcbiAgICogQ3JlYXRlcyBhIGN1c3RvbSBhdXRob3JpemVyIGxhbWJkYSB3aGljaCBhbGxvd3MgYm90aDpcbiAgICogLSBgQXV0aG9yaXphdGlvbjogQmVhcmVyIDxhY2Nlc3MgdG9rZW4+YCBoZWFkZXIsIGZvciB3aGljaCB0aGUgdG9rZW4gaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZVxuICAgKiAgIGdpdmVuIENvZ25pdG8gdXNlciBwb29sXG4gICAqIC0gYEF1dGhvcml6YXRpb246IEJhc2ljIDxiYXNlNjQtZW5jb2RlZCBjcmVkZW50aWFscz5gIGhlYWRlciwgZm9yIHdoaWNoIHRoZSBjcmVkZW50aWFscyBhcmVcbiAgICogICBjaGVja2VkIGFnYWluc3QgdGhlIGNyZWRlbnRpYWxzIGZyb20gdGhlIGdpdmVuIGJhc2ljIGF1dGggc2VjcmV0IG5hbWVcbiAgICpcbiAgICogSWYgZWl0aGVyIG9mIHRoZXNlIGFyZSBnaXZlbiBhbmQgdmFsaWQsIHRoZSByZXF1ZXN0IGlzIGF1dGhlbnRpY2F0ZWQuXG4gICAqL1xuICB8ICh7XG4gICAgICB0eXBlOiBcIkNPR05JVE9fVVNFUl9QT09MX09SX0JBU0lDX0FVVEhcIlxuICAgIH0gJiBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wczxBdXRoU2NvcGVzVD4pXG5cbmV4cG9ydCB0eXBlIENvZ25pdG9Vc2VyUG9vbEF1dGhvcml6ZXJQcm9wczxcbiAgQXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4+ID0ge1xuICB1c2VyUG9vbDogSVVzZXJQb29sXG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgYWNjZXNzIHRva2VuIGNsYWltcyBjb250YWluIHRoZSBnaXZlbiBzY29wZS5cbiAgICpcbiAgICogV2hlbiBkZWZpbmVkIGFzIHBhcnQgb2YgYSByZXNvdXJjZSBzZXJ2ZXIsIHNjb3BlcyBhcmUgb24gdGhlIGZvcm1hdDpcbiAgICogYHtyZXNvdXJjZSBzZXJ2ZXIgaWRlbnRpZmllcn0ve3Njb3BlIG5hbWV9YCwgZS5nLiBgZXh0ZXJuYWwvdmlld191c2Vyc2AuXG4gICAqXG4gICAqIFRvIGdldCBtb3JlIHR5cGUgc2FmZXR5IG9uIHRoaXMgcGFyYW1ldGVyLCBzZWUgdGhlIGRvY3MgZm9yIHRoZSBgQXV0aFNjb3Blc1RgIHR5cGUgcGFyYW1ldGVyIG9uXG4gICAqIHtAbGluayBBcGlHYXRld2F5fS5cbiAgICovXG4gIHJlcXVpcmVkU2NvcGU/OiBBdXRoU2NvcGVzVFxuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHNlY3JldCBpbiBBV1MgU2VjcmV0cyBNYW5hZ2VyIHRoYXQgc3RvcmVzIGJhc2ljIGF1dGggY3JlZGVudGlhbHMgZm9yIHRoZSBiYWNrZW5kXG4gICAqIHNlcnZpY2UsIHRvIGJlIGZvcndhcmRlZCB0byB0aGUgYmFja2VuZCBpZiBDb2duaXRvIHVzZXIgcG9vbCBhdXRoZW50aWNhdGlvbiBzdWNjZWVkZWQuXG4gICAqXG4gICAqIFRoZSBzZWNyZXQgdmFsdWUgbXVzdCBmb2xsb3cgdGhpcyBmb3JtYXQ6XG4gICAqIGBgYGpzb25cbiAgICogeyBcInVzZXJuYW1lXCI6IFwiPHVzZXJuYW1lPlwiLCBcInBhc3N3b3JkXCI6IFwiPHBhc3N3b3JkPlwiIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFRoaXMgcHJvcCBzb2x2ZXMgdGhlIGZvbGxvd2luZyB1c2UtY2FzZTpcbiAgICogLSBZb3Ugd2FudCB0byBkbyBDb2duaXRvIHVzZXIgcG9vbCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgQVBJIEdhdGV3YXlcbiAgICogLSBZb3Ugd2FudCBhbiBhZGRpdGlvbmFsIGF1dGggY2hlY2sgaW4gdGhlIGJhY2tlbmQsIGJ1dCB5b3UgZG9uJ3Qgd2FudCB0byBkZWFsIHdpdGggQ29nbml0b1xuICAgKiAgIHRoZXJlXG4gICAqIC0gVGhlIGJhY2tlbmQgdXNlcyBiYXNpYyBhdXRoXG4gICAqXG4gICAqIFRoaXMgcHJvcCBzb2x2ZXMgdGhpcyBieSBsZXR0aW5nIHlvdSBzcGVjaWZ5IGNyZWRlbnRpYWxzIHRvIHBhc3MgdG8gdGhlIGJhY2tlbmQgYWZ0ZXIgQVBJLUdXXG4gICAqIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRzLiBZb3UgY2FuIHBhc3MgdGhlIGVuY29kZWQgY3JlZGVudGlhbHMgdGhyb3VnaFxuICAgKiB7QGxpbmsgQWxiSW50ZWdyYXRpb25Qcm9wcy5tYXBQYXJhbWV0ZXJzfSwgdXNpbmcgdGhlIGBhdXRob3JpemVyLmludGVybmFsQXV0aG9yaXphdGlvbkhlYWRlcmBcbiAgICogY29udGV4dCB2YXJpYWJsZSwgbGlrZSBzbzpcbiAgICogYGBgXG4gICAqIG1hcFBhcmFtZXRlcnM6IChwYXJhbWV0ZXJzKSA9PiBwYXJhbWV0ZXJzLm92ZXJ3cml0ZUhlYWRlcihcbiAgICogICAvLyAnQXV0aG9yaXphdGlvbicgaGVhZGVyIGNhbm5vdCBiZSBvdmVycmlkZGVuLCBzbyB3ZSB1c2UgYSBjdXN0b20gaGVhZGVyXG4gICAqICAgXCJYLUludGVybmFsLUF1dGhvcml6YXRpb25cIixcbiAgICogICBhcGlndy5NYXBwaW5nVmFsdWUuY29udGV4dFZhcmlhYmxlKFwiYXV0aG9yaXplci5pbnRlcm5hbEF1dGhvcml6YXRpb25IZWFkZXJcIiksXG4gICAqIClcbiAgICogYGBgXG4gICAqIFRoZSBiYWNrZW5kIGNhbiB0aGVuIGNoZWNrIHRoZSBgWC1JbnRlcm5hbC1BdXRob3JpemF0aW9uYCBoZWFkZXIuXG4gICAqL1xuICBjcmVkZW50aWFsc0ZvckludGVybmFsQXV0aG9yaXphdGlvbj86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBCYXNpY0F1dGhBdXRob3JpemVyUHJvcHMgPSB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHNlY3JldCBpbiBBV1MgU2VjcmV0cyBNYW5hZ2VyIHRoYXQgc3RvcmVzIGJhc2ljIGF1dGggY3JlZGVudGlhbHMuIFRoZSBzZWNyZXQgdmFsdWVcbiAgICogc2hvdWxkIGZvbGxvdyB0aGlzIGZvcm1hdDpcbiAgICogYGBganNvblxuICAgKiB7IFwidXNlcm5hbWVcIjogXCI8dXNlcm5hbWU+XCIsIFwicGFzc3dvcmRcIjogXCI8cGFzc3dvcmQ+XCIgfVxuICAgKiBgYGBcbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBmb3JtYXQgaXMgYWxzbyBzdXBwb3J0ZWQ6XG4gICAqIGBgYGpzb25cbiAgICogeyBcImNyZWRlbnRpYWxzXCI6IFwiW1xcXCI8ZW5jb2RlZC1jcmVkZW50aWFsLTE+XFxcIixcXFwiPGVuY29kZWQtY3JlZGVudGlhbC0yPlxcXCJdXCIgfVxuICAgKiBgYGBcbiAgICogLi4uY29uc2lzdGluZyBvZjpcbiAgICogLSBBIHNpbmdsZSBrZXksIGBjcmVkZW50aWFsc2BcbiAgICogLSBXaXRoIGEgX3N0cmluZ18gdmFsdWVcbiAgICogLSBXaGljaCBpcyBhIHN0cmluZ2lmaWVkLCBlc2NhcGVkIEpTT04gYXJyYXkgb2YgYmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHNcbiAgICogLSBJbiB3aGljaCBlYWNoIGVsZW1lbnQgaXMgZW5jb2RlZCBmcm9tIGA8dXNlcm5hbWU+OjxwYXNzd29yZD5gXG4gICAqXG4gICAqIElmIHRoZSBzZWNyZXQgaXMgb24gdGhpcyBmb3JtYXQsIHRoZSBhdXRob3JpemVyIHdpbGwgbWF0Y2ggdGhlIHJlcXVlc3QncyBBdXRob3JpemF0aW9uIGhlYWRlclxuICAgKiBhZ2FpbnN0IGFueSBvbmUgb2YgdGhlc2UgZW5jb2RlZCBjcmVkZW50aWFscy5cbiAgICpcbiAgICogVGhlIHJlYXNvbiB0aGF0IHRoaXMgc2Vjb25kIGZvcm1hdCBzdG9yZXMgc3RyaW5naWZpZWQgSlNPTiBfaW5zaWRlXyBKU09OLCBpcyBkdWUgdG8gYVxuICAgKiBsaW1pdGF0aW9uIGluIExpZmxpZydzIGBsb2FkLXNlY3JldHNgIGxpYnJhcnksIHdoaWNoIG9ubHkgYWxsb3dzIHN0b3Jpbmcgc3RyaW5ncyB2YWx1ZXMuXG4gICAqL1xuICBjcmVkZW50aWFsc1NlY3JldE5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wczxcbiAgQXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4+ID0ge1xuICB1c2VyUG9vbDogSVVzZXJQb29sXG5cbiAgLyoqXG4gICAqIE5hbWUgb2Ygc2VjcmV0IGluIEFXUyBTZWNyZXRzIE1hbmFnZXIgdGhhdCBzdG9yZXMgYmFzaWMgYXV0aCBjcmVkZW50aWFscy4gVGhlIHNlY3JldCB2YWx1ZVxuICAgKiBzaG91bGQgZm9sbG93IHRoaXMgZm9ybWF0OlxuICAgKiBgYGBqc29uXG4gICAqIHsgXCJ1c2VybmFtZVwiOiBcIjx1c2VybmFtZT5cIiwgXCJwYXNzd29yZFwiOiBcIjxwYXNzd29yZD5cIiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGZvcm1hdCBpcyBhbHNvIHN1cHBvcnRlZDpcbiAgICogYGBganNvblxuICAgKiB7IFwiY3JlZGVudGlhbHNcIjogXCJbXFxcIjxlbmNvZGVkLWNyZWRlbnRpYWwtMT5cXFwiLFxcXCI8ZW5jb2RlZC1jcmVkZW50aWFsLTI+XFxcIl1cIiB9XG4gICAqIGBgYFxuICAgKiAuLi5jb25zaXN0aW5nIG9mOlxuICAgKiAtIEEgc2luZ2xlIGtleSwgYGNyZWRlbnRpYWxzYFxuICAgKiAtIFdpdGggYSBfc3RyaW5nXyB2YWx1ZVxuICAgKiAtIFdoaWNoIGlzIGEgc3RyaW5naWZpZWQsIGVzY2FwZWQgSlNPTiBhcnJheSBvZiBiYXNlNjQtZW5jb2RlZCBjcmVkZW50aWFsc1xuICAgKiAtIEluIHdoaWNoIGVhY2ggZWxlbWVudCBpcyBlbmNvZGVkIGZyb20gYDx1c2VybmFtZT46PHBhc3N3b3JkPmBcbiAgICpcbiAgICogSWYgdGhlIHNlY3JldCBpcyBvbiB0aGlzIGZvcm1hdCwgdGhlIGF1dGhvcml6ZXIgd2lsbCBtYXRjaCB0aGUgcmVxdWVzdCdzIEF1dGhvcml6YXRpb24gaGVhZGVyXG4gICAqIGFnYWluc3QgYW55IG9uZSBvZiB0aGVzZSBlbmNvZGVkIGNyZWRlbnRpYWxzLlxuICAgKlxuICAgKiBUaGUgcmVhc29uIHRoYXQgdGhpcyBzZWNvbmQgZm9ybWF0IHN0b3JlcyBzdHJpbmdpZmllZCBKU09OIF9pbnNpZGVfIEpTT04sIGlzIGR1ZSB0byBhXG4gICAqIGxpbWl0YXRpb24gaW4gTGlmbGlnJ3MgYGxvYWQtc2VjcmV0c2AgbGlicmFyeSwgd2hpY2ggb25seSBhbGxvd3Mgc3RvcmluZyBzdHJpbmdzIHZhbHVlcy5cbiAgICovXG4gIGJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZT86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IGFjY2VzcyB0b2tlbiBjbGFpbXMgY29udGFpbiB0aGUgZ2l2ZW4gc2NvcGUuIE9ubHkgYXBwbGljYWJsZSBmb3IgcmVxdWVzdHMgdGhhdFxuICAgKiB1c2UgYEF1dGhvcml6YXRpb246IEJlYXJlciA8YWNjZXNzIHRva2VuPmAgKG5vdCBhcHBsaWNhYmxlIGZvciBiYXNpYyBhdXRoKS5cbiAgICpcbiAgICogV2hlbiBkZWZpbmVkIGFzIHBhcnQgb2YgYSByZXNvdXJjZSBzZXJ2ZXIsIHNjb3BlcyBhcmUgb24gdGhlIGZvcm1hdDpcbiAgICogYHtyZXNvdXJjZSBzZXJ2ZXIgaWRlbnRpZmllcn0ve3Njb3BlIG5hbWV9YCwgZS5nLiBgZXh0ZXJuYWwvdmlld191c2Vyc2AuXG4gICAqXG4gICAqIFRvIGdldCBtb3JlIHR5cGUgc2FmZXR5IG9uIHRoaXMgcGFyYW1ldGVyLCBzZWUgdGhlIGRvY3MgZm9yIHRoZSBgQXV0aFNjb3Blc1RgIHR5cGUgcGFyYW1ldGVyIG9uXG4gICAqIHtAbGluayBBcGlHYXRld2F5fS5cbiAgICovXG4gIHJlcXVpcmVkU2NvcGU/OiBBdXRoU2NvcGVzVFxufVxuXG5leHBvcnQgdHlwZSBBcGlHYXRld2F5QWNjZXNzTG9nc1Byb3BzID0ge1xuICAvKipcbiAgICogRGVsZXRlIHRoZSBhY2Nlc3MgbG9ncyBpZiB0aGlzIGNvbnN0cnVjdCBpcyBkZWxldGVkP1xuICAgKlxuICAgKiBNYXliZSB5b3Ugd2FudCB0byBERVNUUk9ZIGluc3RlYWQuIE9yIGZvciBsZWdhbCByZWFzb25zLCByZXRhaW4gZm9yIGF1ZGl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LlJFVEFJTlxuICAgKi9cbiAgcmVtb3ZhbFBvbGljeT86IGNkay5SZW1vdmFsUG9saWN5XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRvIGtlZXAgdGhlIGxvZ3MuIElmIHVuZGVmaW5lZCwgdXNlcyB0aGUgc2FtZSBkZWZhdWx0IGFzIG5ldyBBV1MgbG9nIGdyb3Vwcy5cbiAgICpcbiAgICogQGRlZmF1bHQgUmV0ZW50aW9uRGF5cy5UV09fWUVBUlNcbiAgICovXG4gIHJldGVudGlvbj86IGxvZ3MuUmV0ZW50aW9uRGF5c1xuXG4gIC8qKlxuICAgKiBBIGN1c3RvbSBKU09OIGxvZyBmb3JtYXQsIHdoaWNoIHVzZXMgdmFyaWFibGVzIGZyb20gYFwiJGNvbnRleHRcImAuXG4gICAqXG4gICAqIFNlZSBbQVdTOiBDbG91ZFdhdGNoIGxvZyBmb3JtYXRzIGZvciBBUEkgR2F0ZXdheV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NldC11cC1sb2dnaW5nLmh0bWwjYXBpZ2F0ZXdheS1jbG91ZHdhdGNoLWxvZy1mb3JtYXRzKVxuICAgKiBmb3IgZm9ybWF0cyBhbmQgcnVsZXMuIEl0IGlzIHBvc3NpYmxlIHRvIHVzZSBvdGhlciBmb3JtYXRzIGxpa2UgQ0xGIGFuZCBYTUwsIGJ1dCB0aGlzIGNvbnN0cnVjdFxuICAgKiBvbmx5IHN1cHBvcnRzIEpTT04gZm9yIG5vdy5cbiAgICpcbiAgICogRm9yIGEgbGlzdCBvZiBhbGwgcG9zc2libGUgdmFyaWFibGVzIHRvIGxvZywgc2VlXG4gICAqIFtBV1M6ICRjb250ZXh0IFZhcmlhYmxlcyBmb3IgZGF0YSBtb2RlbHMsIGF1dGhvcml6ZXJzLCBtYXBwaW5nIHRlbXBsYXRlcywgYW5kIENsb3VkV2F0Y2ggYWNjZXNzIGxvZ2dpbmddKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9hcGktZ2F0ZXdheS1tYXBwaW5nLXRlbXBsYXRlLXJlZmVyZW5jZS5odG1sI2NvbnRleHQtdmFyaWFibGUtcmVmZXJlbmNlKVxuICAgKiBhbmRcbiAgICogW0FXUzogJGNvbnRleHQgVmFyaWFibGVzIGZvciBhY2Nlc3MgbG9nZ2luZyBvbmx5XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvYXBpLWdhdGV3YXktbWFwcGluZy10ZW1wbGF0ZS1yZWZlcmVuY2UuaHRtbCNjb250ZXh0LXZhcmlhYmxlLXJlZmVyZW5jZS1hY2Nlc3MtbG9nZ2luZy1vbmx5KSAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBkZWZhdWx0QWNjZXNzTG9nRm9ybWF0fVxuICAgKi9cbiAgYWNjZXNzTG9nRm9ybWF0PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxufVxuXG4vKipcbiAqIFRoaXMgY29uc3RydWN0IHRyaWVzIHRvIHNpbXBsaWZ5IHRoZSBjcmVhdGlvbiBvZiBhbiBBUEkgR2F0ZXdheSBmb3IgYSBzZXJ2aWNlLCBieSBjb2xsZWN0aW5nIG1vc3RcbiAqIG9mIHRoZSBjb21tb24gc2V0dXAgaGVyZS5cbiAqXG4gKiBUaGUgYXBwcm9hY2ggZm9sbG93ZWQgaW4gdGhpcyBjb25zdHJ1Y3QgaXM6XG4gKiAxLiBPbmUgQVBJLUdXIHBlciBzZXJ2aWNlXG4gKiAyLiBPbmUgc3ViZG9tYWluIHBlciBBUEktR1cgLyBzZXJ2aWNlXG4gKiAzLiBVc2UgSFRUUCBBUEksIG5vdCBSRVNUXG4gKiA0LiBVc2UgYSAkZGVmYXVsdCBzdGFnZSB3aXRoIGF1dG9kZXBsb3lcbiAqIDUuIFN1cHBvcnQgbXVsdGlwbGUgcm91dGVzICh3aXRoIHBvc3NpYmxlIGAve3Byb3h5K31gIHRvIGxldCBhbGwgc3ViLXBhdGhzIHRocm91Z2gpXG4gKiA2LiBBbGxvdyBjdXN0b20gaW50ZWdyYXRpb24vYXV0aG9yaXplciBmb3IgZWFjaCByb3V0ZSwgb3IgZGVmYXVsdHMgZm9yIHRoZSB3aG9sZSBnYXRld2F5XG4gKlxuICogVGhlIHJvdXRlIGludGVncmF0aW9uIGlzIG9uZSBvZiB0aGVzZTpcbiAqIC0gQUxCIHByaXZhdGUgaW50ZWdyYXRpb24gd2l0aCBWUEMgTGluayB1c2luZyBIVFRQUyB0byB0aGUgQUxCXG4gKiAtIExhbWJkYSBpbnRlZ3JhdGlvblxuICogLSBTUVMgaW50ZWdyYXRpb25cbiAqXG4gKiAjIyMgTG9hZCBCYWxhbmNlciBTZWN1cml0eSBHcm91cFxuICpcbiAqIE5vdGUgdGhhdCB0aGUgbG9hZCBiYWxhbmNlciB1c2VkIGluIGFuIHtAbGluayBBbGJJbnRlZ3JhdGlvblByb3BzfSBtdXN0IGFsbG93IG91dGJvdW5kIEhUVFBTXG4gKiB0cmFmZmljIHRvIGl0cyBTZWN1cml0eUdyb3VwLiBPdGhlcndpc2UsIHRoZSBWUEMgTGluayB1c2VkIGJ5IHRoZSBBUEktR1cgY2FuJ3QgZ2V0IHRyYWZmaWMgZnJvbVxuICogdGhlIEFMQi5cbiAqXG4gKiBgYGBcbiAqIGNvbnN0IGxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAgPSBuZXcgZWMyLlNlY3VyaXR5R3JvdXAoLi4uLCB7XG4gKiAgIGFsbG93QWxsT3V0Ym91bmQ6IGZhbHNlLFxuICogfSlcbiAqXG4gKiBsb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLmFkZEVncmVzc1J1bGUoXG4gKiAgIGxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAsXG4gKiAgIGVjMi5Qb3J0LnRjcCg0NDMpLFxuICogICBcIk91dGJvdW5kIHRvIHNlbGYgZm9yIEFMQiB0byBBUEktR1cgVlBDLUxpbmtcIixcbiAqIClcbiAqXG4gKiBjb25zdCBsb2FkQmFsYW5jZXIgPSBuZXcgbGlmbGlnTG9hZEJhbGFuY2VyLkxvYWRCYWxhbmNlciguLi4sXG4gKiAgIHtcbiAqICAgICBvdmVycmlkZUxvYWRCYWxhbmNlclByb3BzOiB7XG4gKiAgICAgICBzZWN1cml0eUdyb3VwOiBsb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLFxuICogICAgIH0sXG4gKiAgIH0sXG4gKiApXG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgQXV0aFNjb3Blc1QgVGhpcyB0eXBlIHBhcmFtZXRlciBhbGxvd3MgeW91IHRvIGltcHJvdmUgdHlwZSBzYWZldHkgb24gdGhlXG4gKiBgcmVxdWlyZWRTY29wZWAgZmllbGQgb24ge0BsaW5rIENvZ25pdG9Vc2VyUG9vbE9yQmFzaWNBdXRoQXV0aG9yaXplclByb3BzfSwgYnkgbmFycm93aW5nIHRoZSB0eXBlXG4gKiB0byBzcGVjaWZpYyBzdHJpbmdzLiBZb3UgY2FuIHRoZW4gZXh0ZW5kIHRoZSBgQXBpR2F0ZXdheWAgd2l0aCB0aGlzIHR5cGUgdG8gZW5mb3JjZSB0aG9zZSBzY29wZXNcbiAqIGFjcm9zcyB0aGUgYXBwbGljYXRpb24uIFJlbWVtYmVyIHRoYXQgYXV0aCBzY29wZXMgbXVzdCBiZSBvbiB0aGUgZm9ybWF0XG4gKiBge3Jlc291cmNlIHNlcnZlciBpZGVudGlmaWVyfS97c2NvcGUgbmFtZX1gLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBcbiAqIHR5cGUgQXV0aFNjb3BlcyA9IFwiZXh0ZXJuYWwvcmVhZF91c2Vyc1wiIHwgXCJpbnRlcm5hbC9jcmVhdGVfdXNlcnNcIlxuICpcbiAqIGV4cG9ydCBjbGFzcyBNeVByb2plY3RBcGlHYXRld2F5IGV4dGVuZHMgQXBpR2F0ZXdheTxBdXRoU2NvcGVzPiB7fVxuICogYGBgXG4gKiBUeXBlU2NyaXB0IHdpbGwgdGhlbiBlbmZvcmNlIHRoYXQgYHJlcXVpcmVkU2NvcGVgIGlzIG9uZSBvZiBgQXV0aFNjb3Blc2AsIGFuZCBwcm92aWRlXG4gKiBhdXRvLWNvbXBsZXRlLlxuICpcbiAqIEBhdXRob3IgS3Jpc3RpYW4gUmVrc3RhZCA8a3JlQGNhcHJhY29uc3VsdGluZy5ubz5cbiAqIEBhdXRob3IgSGVybWFubiBNw7hya3JpZCA8aGVtQGxpZmxpZy5ubz5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwaUdhdGV3YXk8XG4gIEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgLyoqIFRoZSBBUEkgR2F0ZXdheSBIVFRQIEFQSS4gVGhpcyBpcyB0aGUgbWFpbiBjb25zdHJ1Y3QgZm9yIEFQSS1HVy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGh0dHBBcGk6IGFwaWd3Lkh0dHBBcGlcblxuICAvKiogVGhlIHJvdXRlcyB3aGljaCBjb25uZWN0IHRoZSB7QGxpbmsgaHR0cEFwaX0gdG8gdGhlIGJhY2tlbmQgaW50ZWdyYXRpb24ocykuICovXG4gIHB1YmxpYyByZWFkb25seSByb3V0ZXM6IGFwaWd3Lkh0dHBSb3V0ZVtdID0gW11cblxuICAvKiogVGhlIGRvbWFpbiB3aGljaCBjb25zdW1lcnMgbXVzdCB1c2UuKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbjogc3RyaW5nXG5cbiAgLyoqIEFjY2VzcyBsb2cgZ3JvdXAuICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dHcm91cDogbG9ncy5Mb2dHcm91cFxuXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IEFwaUdhdGV3YXlQcm9wczxBdXRoU2NvcGVzVD5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQXBpR2F0ZXdheVByb3BzPEF1dGhTY29wZXNUPixcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuXG4gICAgQXBpR2F0ZXdheS52YWxpZGF0ZVByb3BzKHByb3BzLCBpZCwgY2RrLlN0YWNrLm9mKHRoaXMpKVxuXG4gICAgY29uc3QgY3VzdG9tRG9tYWluID0gbmV3IEN1c3RvbURvbWFpbih0aGlzLCBcIkN1c3RvbURvbWFpblwiLCBwcm9wcy5kbnMpXG4gICAgdGhpcy5kb21haW4gPSBjdXN0b21Eb21haW4uY3VzdG9tRG9tYWluTmFtZVxuXG4gICAgbGV0IGNvcnNPcHRpb25zOiBhcGlndy5Db3JzUHJlZmxpZ2h0T3B0aW9ucyB8IHVuZGVmaW5lZFxuICAgIGlmIChwcm9wcy5jb3JzQWxsb3dBbGwpIHtcbiAgICAgIGNvcnNPcHRpb25zID0ge1xuICAgICAgICBhbGxvd09yaWdpbnM6IFtcIipcIl0sXG4gICAgICAgIC8vIFwiVGhlIEF1dGhvcml6YXRpb24gaGVhZGVyIGNhbid0IGJlIHdpbGRjYXJkZWQgYW5kIGFsd2F5cyBuZWVkcyB0byBiZSBsaXN0ZWQgZXhwbGljaXRseVwiXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvSGVhZGVycy9BY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzXG4gICAgICAgIC8vIENvbnRlbnQtVHlwZSBtYXkgYWxzbyByZXF1aXJlIGV4cGxpY2l0IHdoaXRlbGlzdGluZzogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzYzNTY3NjQ3XG4gICAgICAgIGFsbG93SGVhZGVyczogW1wiQXV0aG9yaXphdGlvblwiLCBcIkNvbnRlbnQtVHlwZVwiLCBcIipcIl0sXG4gICAgICAgIC8vIE5vdCB1c2luZyAnKicgaGVyZSwgYmVjYXVzZSBcIkluIHJlcXVlc3RzIHdpdGggY3JlZGVudGlhbHMsIGl0IGlzIHRyZWF0ZWQgYXMgdGhlIGxpdGVyYWxcbiAgICAgICAgLy8gbWV0aG9kIG5hbWUgJyonIHdpdGhvdXQgc3BlY2lhbCBzZW1hbnRpY3NcIlxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0hlYWRlcnMvQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kc1xuICAgICAgICBhbGxvd01ldGhvZHM6IFtcbiAgICAgICAgICBhcGlndy5Db3JzSHR0cE1ldGhvZC5HRVQsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuUE9TVCxcbiAgICAgICAgICBhcGlndy5Db3JzSHR0cE1ldGhvZC5QVVQsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuUEFUQ0gsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuREVMRVRFLFxuICAgICAgICAgIGFwaWd3LkNvcnNIdHRwTWV0aG9kLk9QVElPTlMsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuSEVBRCxcbiAgICAgICAgXSxcbiAgICAgICAgbWF4QWdlOiBjZGsuRHVyYXRpb24uZGF5cygxKSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgYWN0dWFsIEFQSS4gVGhpcyBob2xkcyB0aGUgcm91dGVzLCBhdXRob3JpemVycyBhbmQgaW50ZWdyYXRpb25zLlxuICAgIGNvbnN0IGFwaSA9IG5ldyBhcGlndy5IdHRwQXBpKHRoaXMsIFwiSHR0cEFwaS1cIiArIHByb3BzLmRucy5zdWJkb21haW4sIHtcbiAgICAgIC8vIGRlZmF1bHRJbnRlZ3JhdGlvbjogZGVmYXVsdEludGVncmF0aW9uLCAvLyBUaGlzIGlzIGZvciBhIGNhdGNoLWFsbCAkZGVmYXVsdCByb3V0ZVxuICAgICAgZGVzY3JpcHRpb246IGBBbiBIVFRQIEFQSSBmb3IgJHtwcm9wcy5kbnMuc3ViZG9tYWlufS4ke3Byb3BzLmRucy5ob3N0ZWRab25lLnpvbmVOYW1lfS5gLFxuICAgICAgZGlzYWJsZUV4ZWN1dGVBcGlFbmRwb2ludDogdHJ1ZSwgLy8gRm9yY2UgZXh0ZXJuYWxzIHRvIGdvIHRocm91Z2ggY3VzdG9tIGRvbWFpbi4gTVVTVCBiZSB0cnVlIHdoZW4gdXNpbmcgTXV0dWFsIFRMUywgZm9yIHNlY3VyaXR5IHJlYXNvbnNcbiAgICAgIGNyZWF0ZURlZmF1bHRTdGFnZTogdHJ1ZSxcbiAgICAgIGRlZmF1bHREb21haW5NYXBwaW5nOiB7IGRvbWFpbk5hbWU6IGN1c3RvbURvbWFpbi5hcGlHd0N1c3RvbURvbWFpbiB9LFxuICAgICAgY29yc1ByZWZsaWdodDogY29yc09wdGlvbnMsXG4gICAgICAuLi5wcm9wcz8ucHJvcHNPdmVycmlkZT8uaHR0cEFwaSxcbiAgICB9KVxuICAgIHRoaXMuaHR0cEFwaSA9IGFwaVxuXG4gICAgY29uc3Qgc3RhZ2UgPSBhcGkuZGVmYXVsdFN0YWdlPy5ub2RlLmRlZmF1bHRDaGlsZCBhcyBhcGlndy5DZm5TdGFnZVxuXG4gICAgY29uc3QgbG9ncyA9IG5ldyBBcGlHYXRld2F5QWNjZXNzTG9ncyhcbiAgICAgIHRoaXMsXG4gICAgICBcIkFjY2Vzc0xvZ3NcIixcbiAgICAgIHN0YWdlLFxuICAgICAgcHJvcHMuYWNjZXNzTG9ncyxcbiAgICAgIGRlZmF1bHRBY2Nlc3NMb2dGb3JtYXQsXG4gICAgKVxuICAgIHRoaXMubG9nR3JvdXAgPSBsb2dzLmxvZ0dyb3VwXG5cbiAgICBzdGFnZS5kZWZhdWx0Um91dGVTZXR0aW5ncyA9IHtcbiAgICAgIC4uLnN0YWdlLmRlZmF1bHRSb3V0ZVNldHRpbmdzLFxuICAgICAgZGV0YWlsZWRNZXRyaWNzRW5hYmxlZDogcHJvcHMuZGV0YWlsZWRNZXRyaWNzID8/IHRydWUsXG4gICAgICB0aHJvdHRsaW5nQnVyc3RMaW1pdDogcHJvcHMudGhyb3R0bGluZz8uYnVyc3QsIC8vIERlZmF1bHQgZm9yIGFjY291bnQgaXMgNV8wMDBcbiAgICAgIHRocm90dGxpbmdSYXRlTGltaXQ6IHByb3BzLnRocm90dGxpbmc/LnJhdGUsIC8vIERlZmF1bHQgZm9yIGFjY291bnQgaXMgMTBfMDAwXG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdEludGVncmF0aW9uID0gcHJvcHMuZGVmYXVsdEludGVncmF0aW9uXG4gICAgICA/IHRoaXMuY3JlYXRlSW50ZWdyYXRpb24ocHJvcHMuZGVmYXVsdEludGVncmF0aW9uLCBwcm9wcy5kbnMpXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgZGVmYXVsdEF1dGhvcml6ZXIgPSBwcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvblxuICAgICAgPyB0aGlzLmNyZWF0ZUF1dGhvcml6ZXIoXCJEZWZhdWx0QXV0aG9yaXplclwiLCBwcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvbilcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHByb3BzLnJvdXRlcykge1xuICAgICAgbGV0IGludGVncmF0aW9uOiBhcGlndy5IdHRwUm91dGVJbnRlZ3JhdGlvblxuICAgICAgaWYgKHJvdXRlLmludGVncmF0aW9uKSB7XG4gICAgICAgIGludGVncmF0aW9uID0gdGhpcy5jcmVhdGVJbnRlZ3JhdGlvbihyb3V0ZS5pbnRlZ3JhdGlvbiwgcHJvcHMuZG5zKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW50ZWdyYXRpb24gPSBkZWZhdWx0SW50ZWdyYXRpb24hIC8vIFZlcmlmaWVkIGluIHZhbGlkYXRlUHJvcHNcbiAgICAgIH1cblxuICAgICAgbGV0IGF1dGhvcml6ZXI6IGFwaWd3LklIdHRwUm91dGVBdXRob3JpemVyIHwgdW5kZWZpbmVkXG4gICAgICBpZiAocm91dGUuYXV0aG9yaXphdGlvbikge1xuICAgICAgICBhdXRob3JpemVyID0gdGhpcy5jcmVhdGVBdXRob3JpemVyKFxuICAgICAgICAgIC8vIFVzaW5nIHRoZSByb3V0ZSBwYXRoIGhlcmUgY2F1c2VkIENsb3VkRm9ybWF0aW9uIHRvIGZhaWwgZHVlIHRvIHJlc291cmNlIG5hbWVzIGJlaW5nIHRvb1xuICAgICAgICAgIC8vIGxvbmcuIFRoZXJlZm9yZSwgd2Ugbm93IGhhc2ggdGhlIHJvdXRlIHBhdGggdG8gZ2V0IGEgc2hvcnRlciBuYW1lLlxuICAgICAgICAgIGBSb3V0ZUF1dGhvcml6ZXIke3Nob3J0SGFzaChgJHtyb3V0ZS5tZXRob2QgPz8gXCJcIn0ke3JvdXRlLnBhdGh9YCl9YCxcbiAgICAgICAgICByb3V0ZS5hdXRob3JpemF0aW9uLFxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdXRob3JpemVyID0gZGVmYXVsdEF1dGhvcml6ZXJcbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm91dGVQYXRocyA9IFtyb3V0ZS5wYXRoXVxuICAgICAgaWYgKHJvdXRlLmluY2x1ZGVTdWJwYXRocyA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBJZiB3ZSBpbmNsdWRlIHN1Yi1wYXRocywgd2UgYWRkIGFuIGFkZGl0aW9uYWwgcm91dGUgd2l0aCAve3Byb3h5K30gKHRoZSArIG1lYW5zIGl0IHdpbGxcbiAgICAgICAgLy8gbWF0Y2ggYWxsIHN1YnJvdXRlcykuIFdlIHdhbnQgYm90aCB0aGlzIHJvdXRlIGFuZCB0aGUgbm9ybWFsIHJvdXRlIHdpdGhvdXQgL3twcm94eSt9LFxuICAgICAgICAvLyBzaW5jZSAve3Byb3h5K30gd2lsbCBvbmx5IG1hdGNoIHRoZSBiYXNlIHBhdGggd2l0aCB0cmFpbGluZyBzbGFzaC5cbiAgICAgICAgcm91dGVQYXRocy5wdXNoKFxuICAgICAgICAgIHJvdXRlLnBhdGggKyAocm91dGUucGF0aCA9PT0gXCIvXCIgPyBcIlwiIDogXCIvXCIpICsgXCJ7cHJveHkrfVwiLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgcm91dGVQYXRoIG9mIHJvdXRlUGF0aHMpIHtcbiAgICAgICAgLy8gVGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIEFQSSBHYXRld2F5IGNvbnN0cnVjdCBoYWQgYSBzaW5nbGUgcm91dGUgd2l0aCB0aGUgSURcbiAgICAgICAgLy8gJ0RlZmF1bHRQcm94eVJvdXRlJywgYW5kIGFsbCBnYXRld2F5cyB3ZSB1c2VkIGV4cG9zZWQgdGhlIHJvdXRlIC97cHJveHkrfS4gV2hlbiB0cnlpbmcgdG9cbiAgICAgICAgLy8gY2hhbmdlIHRvIHRoaXMgbmV3IHZlcnNpb24gb2YgdGhlIGNvbnN0cnVjdCwgZGVwbG95bWVudCBmYWlsZWQgZm9yIGdhdGV3YXlzIGV4cG9zaW5nXG4gICAgICAgIC8vIC97cHJveHkrfSwgYmVjYXVzZSBcImEgcm91dGUgd2l0aCB0aGF0IGtleSBbaS5lLiBwYXRoICsgbWV0aG9kXSBhbHJlYWR5IGV4aXN0c1wiLiBXZSB0aGlua1xuICAgICAgICAvLyB0aGlzIG1heSBiZSBiZWNhdXNlIHdlIHVzZWQgdGhlIHNhbWUgcm91dGUgcGF0aCwgYnV0IHdpdGggYSBuZXcgcm91dGUgSUQsIGNhdXNpbmdcbiAgICAgICAgLy8gY29uZnVzaW9uIGZvciBDbG91ZEZvcm1hdGlvbi4gU28gd2Uga2VlcCB0aGUgb2xkIHJvdXRlIElEIGhlcmUgZm9yIC97cHJveHkrfS5cbiAgICAgICAgY29uc3Qgcm91dGVJZCA9XG4gICAgICAgICAgcm91dGVQYXRoID09PSBcIi97cHJveHkrfVwiID8gXCJEZWZhdWx0UHJveHlSb3V0ZVwiIDogYFJvdXRlLSR7cm91dGVQYXRofWBcblxuICAgICAgICB0aGlzLnJvdXRlcy5wdXNoKFxuICAgICAgICAgIG5ldyBhcGlndy5IdHRwUm91dGUodGhpcywgcm91dGVJZCwge1xuICAgICAgICAgICAgaHR0cEFwaTogYXBpLFxuICAgICAgICAgICAgaW50ZWdyYXRpb246IGludGVncmF0aW9uLFxuICAgICAgICAgICAgYXV0aG9yaXplcjogYXV0aG9yaXplcixcbiAgICAgICAgICAgIHJvdXRlS2V5OiBhcGlndy5IdHRwUm91dGVLZXkud2l0aChcbiAgICAgICAgICAgICAgcm91dGVQYXRoLFxuICAgICAgICAgICAgICByb3V0ZS5tZXRob2RcbiAgICAgICAgICAgICAgICA/IGFwaWd3Lkh0dHBNZXRob2Rbcm91dGUubWV0aG9kXVxuICAgICAgICAgICAgICAgIDogYXBpZ3cuSHR0cE1ldGhvZC5BTlksXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFnUmVzb3VyY2VzKHRoaXMsICgpID0+ICh7IHNlcnZpY2U6IHByb3BzLmRucy5zdWJkb21haW4gfSkpXG4gIH1cblxuICAvKiogQHRocm93cyBFcnJvciAqL1xuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZVByb3BzKFxuICAgIHByb3BzOiBBcGlHYXRld2F5UHJvcHMsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdGFjazogY2RrLlN0YWNrLFxuICApIHtcbiAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHByb3BzLnJvdXRlcykge1xuICAgICAgaWYgKCFyb3V0ZS5pbnRlZ3JhdGlvbiAmJiAhcHJvcHMuZGVmYXVsdEludGVncmF0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTm8gaW50ZWdyYXRpb24gZGVmaW5lZCBmb3Igcm91dGUgJyR7cm91dGUucGF0aH0nLCBhbmQgbm8gZGVmYXVsdCBpbnRlZ3JhdGlvbiBzcGVjaWZpZWQgZm9yIHRoZSBnYXRld2F5YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKCFyb3V0ZS5hdXRob3JpemF0aW9uICYmICFwcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE5vIGF1dGhvcml6YXRpb24gZGVmaW5lZCBmb3Igcm91dGUgJyR7cm91dGUucGF0aH0nLCBhbmQgbm8gZGVmYXVsdCBhdXRob3JpemF0aW9uIHNwZWNpZmllZCBmb3IgdGhlIGdhdGV3YXlgLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAoIXJvdXRlLnBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIHBhdGggJyR7cm91dGUucGF0aH0nOiBwYXRocyBtdXN0IGJlZ2luIHdpdGggJy8nICh1c2UgJy8nIGZvciByb290IHBhdGgpYCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKHJvdXRlLnBhdGggIT09IFwiL1wiICYmIHJvdXRlLnBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBwYXRoICcke3JvdXRlLnBhdGh9JzogcGF0aHMgY2Fubm90IGVuZCB3aXRoICcvJyAoZXhjZXB0IHJvb3QgcGF0aClgLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHJvdXRlLmludGVncmF0aW9uPy50eXBlID09PSBcIkFMQlwiICYmXG4gICAgICAgIHJvdXRlLmludGVncmF0aW9uLmhvc3ROYW1lLnN0YXJ0c1dpdGgoXCJodHRwczpcIilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRoZSBhbGJJbnRlZ3JhdGlvbi5ob3N0SHR0cHNOYW1lIHNob3VsZCBub3QgaW5jbHVkZSBhIHByb3RvY29sOiAke3JvdXRlLmludGVncmF0aW9uLmhvc3ROYW1lfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb3BzLmRucy5zdWJkb21haW4gPT09IFwiXCIgfHwgcHJvcHMuZG5zLnN1YmRvbWFpbi5pbmNsdWRlcyhcIiBcIikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFN1YmRvbWFpbiBtdXN0IGJlIHNldCwgYW5kIG5vdCBjb250YWluIHNwYWNlczogJHtwcm9wcy5kbnMuc3ViZG9tYWlufWAsXG4gICAgICApXG4gICAgfVxuICAgIGlmIChwcm9wcy50aHJvdHRsaW5nPy5idXJzdCAmJiBwcm9wcy50aHJvdHRsaW5nLmJ1cnN0ID4gNV8wMDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYOKaoO+4jyBZb3VyIHRocm90dGxpbmcgYnVyc3QgbGltaXQgJyR7cHJvcHMudGhyb3R0bGluZy5idXJzdH0nIGlzIGhpZ2hlciB0aGFuIHRoZSBBV1MgQWNjb3VudCBsaW1pdC4gTWFrZSBzdXJlIHlvdXIgYWNjb3VudCBoYXMgdXBncmFkZWQgdGhpcyBxdW90YSEgYCxcbiAgICAgICAgc3RhY2ssXG4gICAgICAgIGlkLFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAocHJvcHMudGhyb3R0bGluZz8ucmF0ZSAmJiBwcm9wcy50aHJvdHRsaW5nLnJhdGUgPiAxMF8wMDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYOKaoO+4jyBZb3VyIHRocm90dGxpbmcgcmF0ZSBsaW1pdCAnJHtwcm9wcy50aHJvdHRsaW5nLnJhdGV9JyBpcyBoaWdoZXIgdGhhbiB0aGUgQVdTIEFjY291bnQgbGltaXQuIE1ha2Ugc3VyZSB5b3VyIGFjY291bnQgaGFzIHVwZ3JhZGVkIHRoaXMgcXVvdGEhIGAsXG4gICAgICAgIHN0YWNrLFxuICAgICAgICBpZCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGF1dGhvcml6ZXIgb25seSBhY2NlcHRzIHJlcXVlc3RzIGZyb20gZXh0ZXJuYWwgdXNlcnMgdGhhdCBhcmUgYXV0aG9yaXplZC5cbiAgICogVW5hdXRob3JpemVkIHVzZXJzIGFyZSBzdG9wcGVkIGluIHRoZSBBUEktR1csIGFuZCBub3QgZm9yd2FyZGVkIHRvIHRoZSBpbnRlZ3JhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQXV0aG9yaXplcjxBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZz4oXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdXRob3JpemF0aW9uOiBBdXRob3JpemF0aW9uUHJvcHM8QXV0aFNjb3Blc1Q+LFxuICApOiBhcGlndy5JSHR0cFJvdXRlQXV0aG9yaXplciB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoIChhdXRob3JpemF0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJOT05FXCI6IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuICAgICAgY2FzZSBcIklBTVwiOiB7XG4gICAgICAgIC8vIEFQSSBHYXRld2F5IGludm9rZXMgeW91ciBBUEkgcm91dGUgb25seSBpZiB0aGUgY2xpZW50IGhhcyBleGVjdXRlLWFwaSBwZXJtaXNzaW9uIGZvciB0aGUgcm91dGUuXG4gICAgICAgIC8vIFRoZSBjbGllbnQgaGFzIHRvIHVzZSBBV1MgU2lnVjQgdG8gaWRlbnRpZnkgdGhlbXNlbHZlcyBpbiB0aGUgcmVxdWVzdC5cbiAgICAgICAgLy8gUmVhZCB0aGlzIHBhZ2UgZm9yIGhlbHAgd2l0aCBJQU0gYW5kIEFQSS1HVyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc2VjdXJpdHlfaWFtX3NlcnZpY2Utd2l0aC1pYW0uaHRtbFxuICAgICAgICAvLyBOb3RlIHRoYXQgW3Jlc291cmNlIHBvbGljaWVzIGFyZSBub3Qgc3VwcG9ydGVkIHlldCBmb3IgSFRUUF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWFjY2Vzcy1jb250cm9sLWlhbS5odG1sKVxuICAgICAgICByZXR1cm4gbmV3IGF1dGhvcml6ZXJzLkh0dHBJYW1BdXRob3JpemVyKClcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJDT0dOSVRPX1VTRVJfUE9PTFwiOiB7XG4gICAgICAgIC8vIFdlIHVzZSBhIGN1c3RvbSBsYW1iZGEgYXV0aG9yaXplciBoZXJlIGluc3RlYWQgb2YgdGhlIGBIdHRwVXNlclBvb2xBdXRob3JpemVyYCBwcm92aWRlZFxuICAgICAgICAvLyBieSBDREssIGluIG9yZGVyIHRvIHN1cHBvcnQgYHJlcXVpcmVkU2NvcGVgIGFuZCBzZXR0aW5nIG9mIGN1c3RvbSBjb250ZXh0IHZhcmlhYmxlcy5cbiAgICAgICAgY29uc3QgYXV0aG9yaXplciA9IG5ldyBDb2duaXRvVXNlclBvb2xBdXRob3JpemVyKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgaWQgKyBcIkxhbWJkYVwiLFxuICAgICAgICAgIGF1dGhvcml6YXRpb24sXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gbmV3IGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFBdXRob3JpemVyKGlkLCBhdXRob3JpemVyLmxhbWJkYSwge1xuICAgICAgICAgIHJlc3BvbnNlVHlwZXM6IGF1dGhvcml6ZXIucmVzcG9uc2VUeXBlcyxcbiAgICAgICAgICAvLyBNYXggMWgsIG9yIGRpc2FibGVkICgwcykuIFRoZSB2YWx1ZSBvbmx5IG1hdHRlcnMgd2hlbiBpbnZhbGlkYXRpbmcvZHluYW1pYyBjcmVkZW50aWFsc1xuICAgICAgICAgIHJlc3VsdHNDYWNoZVR0bDogY2RrLkR1cmF0aW9uLmhvdXJzKDEpLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgY2FzZSBcIkJBU0lDX0FVVEhcIjoge1xuICAgICAgICBjb25zdCBhdXRob3JpemVyID0gbmV3IEJhc2ljQXV0aEF1dGhvcml6ZXIoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBpZCArIFwiTGFtYmRhXCIsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbixcbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiBuZXcgYXV0aG9yaXplcnMuSHR0cExhbWJkYUF1dGhvcml6ZXIoaWQsIGF1dGhvcml6ZXIubGFtYmRhLCB7XG4gICAgICAgICAgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplci5yZXNwb25zZVR5cGVzLFxuICAgICAgICAgIC8vIE1heCAxaCwgb3IgZGlzYWJsZWQgKDBzKS4gVGhlIHZhbHVlIG9ubHkgbWF0dGVycyB3aGVuIGludmFsaWRhdGluZy9keW5hbWljIGNyZWRlbnRpYWxzXG4gICAgICAgICAgcmVzdWx0c0NhY2hlVHRsOiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjYXNlIFwiQ09HTklUT19VU0VSX1BPT0xfT1JfQkFTSUNfQVVUSFwiOiB7XG4gICAgICAgIGNvbnN0IGF1dGhvcml6ZXIgPSBuZXcgQ29nbml0b1VzZXJQb29sT3JCYXNpY0F1dGhBdXRob3JpemVyKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgaWQgKyBcIkxhbWJkYVwiLFxuICAgICAgICAgIGF1dGhvcml6YXRpb24sXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gbmV3IGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFBdXRob3JpemVyKGlkLCBhdXRob3JpemVyLmxhbWJkYSwge1xuICAgICAgICAgIHJlc3BvbnNlVHlwZXM6IGF1dGhvcml6ZXIucmVzcG9uc2VUeXBlcyxcbiAgICAgICAgICAvLyBNYXggMWgsIG9yIGRpc2FibGVkICgwcykuIFRoZSB2YWx1ZSBvbmx5IG1hdHRlcnMgd2hlbiBpbnZhbGlkYXRpbmcvZHluYW1pYyBjcmVkZW50aWFsc1xuICAgICAgICAgIHJlc3VsdHNDYWNoZVR0bDogY2RrLkR1cmF0aW9uLmhvdXJzKDEpLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSW50ZWdyYXRpb24oXG4gICAgaW50ZWdyYXRpb246IEludGVncmF0aW9uUHJvcHMsXG4gICAgZG5zOiBBcGlHYXRld2F5UHJvcHNbXCJkbnNcIl0sXG4gICk6IGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9uIHtcbiAgICBzd2l0Y2ggKGludGVncmF0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJBTEJcIjoge1xuICAgICAgICAvLyBUaGUgVlBDTGluayBjb25uZWN0cyB0aGUgaW50ZWdyYXRpb24gaW50byB0aGUgQUxCJ3MgVlBDLiBNdXN0IGJlIG1hbnVhbGx5IGNyZWF0ZWQgd2hlblxuICAgICAgICAvLyB0aGUgVlBDIGlzIGltcG9ydGVkLCB3aGljaCBpcyB0aGUgY2FzZSB3aGVuIHVzaW5nIENvcmVQbGF0Zm9ybUNvbnN1bWVyLlxuICAgICAgICBjb25zdCB2cGNMaW5rID0gbmV3IGFwaWd3LlZwY0xpbmsodGhpcywgXCJBbGJWcGNMaW5rXCIsIHtcbiAgICAgICAgICB2cGM6IGludGVncmF0aW9uLnZwYyxcbiAgICAgICAgICBzZWN1cml0eUdyb3VwczogW2ludGVncmF0aW9uLnNlY3VyaXR5R3JvdXBdLFxuICAgICAgICAgIHN1Ym5ldHM6IGludGVncmF0aW9uLnZwYy5zZWxlY3RTdWJuZXRzKCksIC8vIFRoaXMgY29ycmVjdGx5IHNlbGVjdHMgdGhlIHByaXZhdGUgc3VibmV0c1xuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHBhcmFtZXRlck1hcHBpbmcgPSBuZXcgYXBpZ3cuUGFyYW1ldGVyTWFwcGluZygpXG4gICAgICAgICAgLyoqIFNlZSB7QGxpbmsgQWxiSW50ZWdyYXRpb25Qcm9wcy5ob3N0TmFtZX0gKi9cbiAgICAgICAgICAub3ZlcndyaXRlSGVhZGVyKFxuICAgICAgICAgICAgXCJIb3N0XCIsXG4gICAgICAgICAgICAvLyBUaGUgSG9zdCBoZWFkZXIgY2FuIE5PVCB1c2UgZHluYW1pYyBtYXBwaW5nLCBsaWtlICRjb250ZXh0LmRvbWFpbk5hbWUgZXRjLlxuICAgICAgICAgICAgYXBpZ3cuTWFwcGluZ1ZhbHVlLmN1c3RvbShpbnRlZ3JhdGlvbi5ob3N0TmFtZSksXG4gICAgICAgICAgKVxuICAgICAgICBpZiAoaW50ZWdyYXRpb24ubWFwUGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaW50ZWdyYXRpb24ubWFwUGFyYW1ldGVycyhwYXJhbWV0ZXJNYXBwaW5nKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBpbnRlZ3JhdGlvbnMuSHR0cEFsYkludGVncmF0aW9uKFxuICAgICAgICAgIFwiQWxiSW50ZWdyYXRpb24tXCIgKyBkbnMuc3ViZG9tYWluLFxuICAgICAgICAgIGludGVncmF0aW9uLmxvYWRCYWxhbmNlckxpc3RlbmVyLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNlY3VyZVNlcnZlck5hbWU6IGludGVncmF0aW9uLmhvc3ROYW1lLFxuICAgICAgICAgICAgdnBjTGluazogdnBjTGluayxcbiAgICAgICAgICAgIG1ldGhvZDogYXBpZ3cuSHR0cE1ldGhvZC5BTlksXG4gICAgICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJMYW1iZGFcIjoge1xuICAgICAgICByZXR1cm4gbmV3IGludGVncmF0aW9ucy5IdHRwTGFtYmRhSW50ZWdyYXRpb24oXG4gICAgICAgICAgXCJMYW1iZGFJbnRlZ3JhdGlvblwiLFxuICAgICAgICAgIGludGVncmF0aW9uLmxhbWJkYSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXlsb2FkRm9ybWF0VmVyc2lvbjogYXBpZ3cuUGF5bG9hZEZvcm1hdFZlcnNpb24uVkVSU0lPTl8yXzAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgY2FzZSBcIlNRU1wiOiB7XG4gICAgICAgIC8vIEFQSS1HVyBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byBTUVMgYnkgZGVmYXVsdFxuICAgICAgICBjb25zdCByb2xlID0gbmV3IGlhbS5Sb2xlKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYEFwaUd3VG8ke2ludGVncmF0aW9uLnF1ZXVlLm5vZGUuaWR9U2VydmljZVJvbGVgLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICBcIkFsbG93cyBBUEktR1cgdG8gYWRkIG1lc3NhZ2VzIHRvIFwiICsgaW50ZWdyYXRpb24ucXVldWUucXVldWVBcm4sXG4gICAgICAgICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbChcImFwaWdhdGV3YXkuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICAgIGludGVncmF0aW9uLnF1ZXVlLmdyYW50U2VuZE1lc3NhZ2VzKHJvbGUpXG5cbiAgICAgICAgbGV0IHBhcmFtZXRlck1hcHBpbmcgPSBuZXcgYXBpZ3cuUGFyYW1ldGVyTWFwcGluZygpXG4gICAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWRldmVsb3AtaW50ZWdyYXRpb25zLWF3cy1zZXJ2aWNlcy1yZWZlcmVuY2UuaHRtbCNTUVMtU2VuZE1lc3NhZ2VcbiAgICAgICAgICAuY3VzdG9tKFwiUXVldWVVcmxcIiwgaW50ZWdyYXRpb24ucXVldWUucXVldWVVcmwpXG4gICAgICAgICAgLmN1c3RvbShcIk1lc3NhZ2VCb2R5XCIsIFwiJHJlcXVlc3QuYm9keVwiKVxuICAgICAgICAgIC5jdXN0b20oXCJSZWdpb25cIiwgXCJldS13ZXN0LTFcIikgLy8gQ2hhbmdlIHRoaXMgaWYgdGhlIFNRUyBxdWV1ZSBpcyBpbiBhbm90aGVyIHJlZ2lvbiFcblxuICAgICAgICBpZiAoaW50ZWdyYXRpb24ubWVzc2FnZUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nID0gcGFyYW1ldGVyTWFwcGluZy5jdXN0b20oXG4gICAgICAgICAgICBcIk1lc3NhZ2VBdHRyaWJ1dGVzXCIsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShpbnRlZ3JhdGlvbi5tZXNzYWdlQXR0cmlidXRlcyksXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTcXNSb3V0ZUludGVncmF0aW9uKFwiU3FzSW50ZWdyYXRpb25cIiwge1xuICAgICAgICAgIHR5cGU6IGFwaWd3Lkh0dHBJbnRlZ3JhdGlvblR5cGUuQVdTX1BST1hZLFxuICAgICAgICAgIHN1YnR5cGU6IGFwaWd3Lkh0dHBJbnRlZ3JhdGlvblN1YnR5cGUuU1FTX1NFTkRfTUVTU0FHRSxcbiAgICAgICAgICBjcmVkZW50aWFsczogYXBpZ3cuSW50ZWdyYXRpb25DcmVkZW50aWFscy5mcm9tUm9sZShyb2xlKSxcbiAgICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nOiBwYXJhbWV0ZXJNYXBwaW5nLFxuICAgICAgICAgIHBheWxvYWRGb3JtYXRWZXJzaW9uOiBhcGlndy5QYXlsb2FkRm9ybWF0VmVyc2lvbi5WRVJTSU9OXzFfMCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGEgZ3JhbnRhYmxlIHRhcmdldCAocm9sZSwgdXNlciBldGMuKSBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGUgQVBJLlxuICAgKiBPbmx5IHdvcmtzIHdoZW4gdXNpbmcgYElBTWAgYXMge0BsaW5rIEFwaUdhdGV3YXlSb3V0ZS5hdXRob3JpemF0aW9ufS5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldCBBIGdyYW50YWJsZSwgbGlrZSB7QGxpbmsgaWFtLlJvbGV9XG4gICAqL1xuICBwdWJsaWMgZ3JhbnRJbnZva2UodGFyZ2V0OiBpYW0uSUdyYW50YWJsZSkge1xuICAgIGZvciAoY29uc3Qgcm91dGVQcm9wcyBvZiB0aGlzLnByb3BzLnJvdXRlcykge1xuICAgICAgY29uc3QgYXV0aFR5cGUgPVxuICAgICAgICByb3V0ZVByb3BzLmF1dGhvcml6YXRpb24/LnR5cGUgPz8gdGhpcy5wcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvbj8udHlwZVxuXG4gICAgICBpZiAoYXV0aFR5cGUgIT09IFwiSUFNXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgZ3JhbnQgaW52b2tlIGZvciBhbiBBUEkgR2F0ZXdheSB3aGVuIG5vdCB1c2luZyBJQU0gYXV0aCAoZm91bmQgYXV0aCAnJHthdXRoVHlwZX0nIG9uIHJvdXRlICcke3JvdXRlUHJvcHMucGF0aH0nKSBbJHtjZGsuU3RhY2sub2YodGhpcykuc3RhY2tOYW1lfV1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByb3V0ZSBvZiB0aGlzLnJvdXRlcykge1xuICAgICAgcm91dGUuZ3JhbnRJbnZva2UodGFyZ2V0KVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gZG9tYWluIGZvciB0aGUgQVBJLUdhdGV3YXksIGEgUm91dGU1MyByZWNvcmQgYW5kIGFuIEhUVFBTIGNlcnQuXG4gKiBAYXV0aG9yIEtyaXN0aWFuIFJla3N0YWQgPGtyZUBjYXByYWNvbnN1bHRpbmcubm8+XG4gKi9cbmNsYXNzIEN1c3RvbURvbWFpbiBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGFwaUd3Q3VzdG9tRG9tYWluOiBhcGlndy5Eb21haW5OYW1lXG5cbiAgLyoqIFRoZSBGdWxseSBRdWFsaWZpZWQgRG9tYWluIE5hbWUgKEZRRE4pIGxpa2UgYHByb2R1Y3QucGxhdGZvcm0uZXhhbXBsZS5ub2AuICovXG4gIHB1YmxpYyByZWFkb25seSBjdXN0b21Eb21haW5OYW1lOiBzdHJpbmdcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQXBpR2F0ZXdheURuc1Byb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG4gICAgdGhpcy5jdXN0b21Eb21haW5OYW1lID0gYCR7cHJvcHMuc3ViZG9tYWlufS4ke3Byb3BzLmhvc3RlZFpvbmUuem9uZU5hbWV9YFxuXG4gICAgLy8gQ2FuIGFsc28gdXNlIHdpbGRjYXJkIGNlcnRzIGluc3RlYWQhIENoZWFwZXJcbiAgICAvKiogQWxsb3dzIGV4dGVybmFsIHVzZXJzIHRvIGNvbm5lY3Qgd2l0aCBIVFRQUy4gKi9cbiAgICBjb25zdCBjdXN0b21Eb21haW5DZXJ0ID0gbmV3IGFjbS5DZXJ0aWZpY2F0ZSh0aGlzLCBcIkh0dHBzQ2VydGlmaWNhdGVcIiwge1xuICAgICAgZG9tYWluTmFtZTogdGhpcy5jdXN0b21Eb21haW5OYW1lLFxuICAgICAgdmFsaWRhdGlvbjogYWNtLkNlcnRpZmljYXRlVmFsaWRhdGlvbi5mcm9tRG5zKHByb3BzLmhvc3RlZFpvbmUpLFxuICAgIH0pXG5cbiAgICAvLyBOb3RlIHRoYXQgQVBJLUdXIGNhbiBhbHNvIHN1cHBvcnQgd2lsZGNhcmQgZG9tYWlucyEgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWN1c3RvbS1kb21haW4tbmFtZXMuaHRtbCNodHRwLXdpbGRjYXJkLWN1c3RvbS1kb21haW4tbmFtZXNcbiAgICAvLyBCdXQgdGhpcyB3aWxsIG5vdCB3b3JrIHdoZW4gQVdTIGFjY291bnQgWCBoYXMgQ3VzdG9tRG9tYWluIGBzdGFnaW5nLnBsYXRmb3JtLmV4YW1wbGUubm9gIGFuZCBhY2NvdW50IFkgaGFzIEN1c3RvbURvbWFpbiBgKi5wbGF0Zm9ybS5leGFtcGxlLm5vYC5cbiAgICAvLyBOb3Qgc3VyZSBob3cgc3ViLXN1YmRvbWFpbnMgYXJlIGFmZmVjdGVkOiBgbXlzZXJ2aWNlLnN0YWdpbmcucGxhdGZvcm0uZXhhbXBsZS5ub2AgYW5kIGAqLnBsYXRmb3JtLmV4YW1wbGUubm9gLlxuICAgIHRoaXMuYXBpR3dDdXN0b21Eb21haW4gPSBuZXcgYXBpZ3cuRG9tYWluTmFtZShcbiAgICAgIHRoaXMsXG4gICAgICBcIkRvbWFpbk5hbWUtXCIgKyBwcm9wcy5zdWJkb21haW4sXG4gICAgICB7XG4gICAgICAgIGRvbWFpbk5hbWU6IHRoaXMuY3VzdG9tRG9tYWluTmFtZSxcbiAgICAgICAgY2VydGlmaWNhdGU6IGN1c3RvbURvbWFpbkNlcnQsXG4gICAgICAgIGVuZHBvaW50VHlwZTogYXBpZ3cuRW5kcG9pbnRUeXBlLlJFR0lPTkFMLFxuICAgICAgICBzZWN1cml0eVBvbGljeTogYXBpZ3cuU2VjdXJpdHlQb2xpY3kuVExTXzFfMixcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgLy8gVGhpcyBtYWtlcyB0aGUgQVBJLUdXIHB1YmxpY2x5IGF2YWlsYWJsZSBvbiB0aGUgY3VzdG9tIGRvbWFpbiBuYW1lLlxuICAgIG5ldyByb3V0ZTUzLkFSZWNvcmQodGhpcywgXCJSb3V0ZTUzQVJlY29yZEFwaWd3QWxpYXNcIiwge1xuICAgICAgcmVjb3JkTmFtZTogcHJvcHMuc3ViZG9tYWluLFxuICAgICAgem9uZTogcHJvcHMuaG9zdGVkWm9uZSxcbiAgICAgIHRhcmdldDogcm91dGU1My5SZWNvcmRUYXJnZXQuZnJvbUFsaWFzKFxuICAgICAgICBuZXcgcm91dGU1M1RhcmdldHMuQXBpR2F0ZXdheXYyRG9tYWluUHJvcGVydGllcyhcbiAgICAgICAgICB0aGlzLmFwaUd3Q3VzdG9tRG9tYWluLnJlZ2lvbmFsRG9tYWluTmFtZSxcbiAgICAgICAgICB0aGlzLmFwaUd3Q3VzdG9tRG9tYWluLnJlZ2lvbmFsSG9zdGVkWm9uZUlkLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICAgIHR0bDogcHJvcHMudHRsID8/IGNkay5EdXJhdGlvbi5taW51dGVzKDUpLCAvLyBMb3cgVFRMIG1ha2VzIGl0IGVhc2llciB0byBkbyBjaGFuZ2VzXG4gICAgfSlcbiAgfVxufVxuXG4vKiogQWN0cyBhcyBnbHVlIChiZXR3ZWVuIHRoZSBpbnRlZ3JhdGlvbiBwcm9wcyBhbmQgdGhlIEh0dHBBcGkpIHdoZW4gY3JlYXRpbmcgYW4gU3FzSW50ZWdyYXRpb24uICovXG5jbGFzcyBTcXNSb3V0ZUludGVncmF0aW9uIGV4dGVuZHMgYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQHBhcmFtIGlkIFRoZSBpZCB1c2VkIGluIHRoZSB7QGxpbmsgYXBpZ3cuSHR0cEludGVncmF0aW9ufSBjb25zdHJ1Y3RcbiAgICogICAgY3JlYXRlZCBpbnRlcm5hbGx5IGJ5IHtAbGluayBhcGlndy5IdHRwUm91dGVJbnRlZ3JhdGlvbi5fYmluZFRvUm91dGV9LlxuICAgKiAgICBbU291cmNlIGNvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL2I1YWUzNzc4MmJjM2NiNjM3ZWVlZjlmYmIxZmJlMmM1ZWZkZmMwNjgvcGFja2FnZXMvJTQwYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyL2xpYi9odHRwL2ludGVncmF0aW9uLnRzI0wzMjEpXG4gICAqIEBwYXJhbSBpbnRlZ3JhdGlvblByb3BzIFRoZSBwcm9wcyB0byBwYXNzIHRvIHRoZSB7QGxpbmsgYXBpZ3cuSHR0cEludGVncmF0aW9ufSBjb25zdHJ1Y3QuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBpZDogc3RyaW5nLFxuICAgIHByaXZhdGUgaW50ZWdyYXRpb25Qcm9wczogYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb25Db25maWcsXG4gICkge1xuICAgIHN1cGVyKGlkKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgc2VuZHMgdGhlIHByb3BlcnRpZXMgbmVlZGVkIGZvciBjcmVhdGluZyBhIHtAbGluayBhcGlndy5IdHRwSW50ZWdyYXRpb259IHRvIHRoZVxuICAgKiB7QGxpbmsgYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb259LlxuICAgKi9cbiAgYmluZCgpOiBhcGlndy5IdHRwUm91dGVJbnRlZ3JhdGlvbkNvbmZpZyB7XG4gICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5OlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL2I1YWUzNzc4MmJjM2NiNjM3ZWVlZjlmYmIxZmJlMmM1ZWZkZmMwNjgvcGFja2FnZXMvJTQwYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyL2xpYi9odHRwL2ludGVncmF0aW9uLnRzI0wzMTlcbiAgICByZXR1cm4gdGhpcy5pbnRlZ3JhdGlvblByb3BzXG4gIH1cbn1cblxuLyoqXG4gKiBXaGVuIHVzaW5nIGBOb2RlanNGdW5jdGlvbmAgd2l0aCBgZW50cnlgLCB3ZSBwb2ludCBDREsgdG8gYSBmaWxlIHdpdGggb3VyIGxhbWJkYSBjb2RlLiBUaGlzIGNhblxuICogZWl0aGVyIGJlIGEgVHlwZVNjcmlwdCBvciBKYXZhU2NyaXB0IGZpbGUuIFdoZW4gY3JlYXRpbmcgY29uc3RydWN0cyBpbiB0ZXN0cyBpbnNpZGUgdGhpcyBsaWJyYXJ5LFxuICogdGhlIGVudHJ5IHdpbGwgcG9pbnQgdG8gdGhlIFR5cGVTY3JpcHQgZmlsZSBpbiB0aGUgc291cmNlIGNvZGUuIEJ1dCB3aGVuIGEgbGlicmFyeSBjb25zdW1lciB1c2VzXG4gKiB0aGlzLCBpdCB3aWxsIGluc3RlYWQgcG9pbnQgdG8gdGhlIHRyYW5zcGlsZWQgSmF2YVNjcmlwdCBmaWxlLiBTbyB0byBzZXQgdGhlIGNvcnJlY3QgZmlsZVxuICogZXh0ZW5zaW9uLCB3ZSBtdXN0IGNoZWNrIGlmIHdlJ3JlIGJlaW5nIHJ1biBpbiB0aGUgY29udGV4dCBvZiB0aGUgVHlwZVNjcmlwdCBzb3VyY2UgY29kZVxuICogKHNyYy9hcGktZ2F0ZXdheSksIG90aGVyd2lzZSB3ZSdyZSBiZWluZyBydW4gYnkgYSBjb25zdW1lciBhcyB0cmFuc3BpbGVkIEphdmFTY3JpcHQuXG4gKi9cbmNvbnN0IGF1dGhvcml6ZXJGaWxlRXh0ZW5zaW9uID0gX19kaXJuYW1lLmVuZHNXaXRoKFwic3JjL2FwaS1nYXRld2F5XCIpXG4gID8gXCJ0c1wiXG4gIDogXCJqc1wiXG5cbi8qKlxuICogQ3JlYXRlcyBhIGN1c3RvbSBhdXRob3JpemVyIGxhbWJkYSB3aGljaCByZWFkcyBgQXV0aG9yaXphdGlvbjogQmVhcmVyIDxhY2Nlc3MgdG9rZW4+YCBoZWFkZXIgYW5kXG4gKiB2ZXJpZmllcyB0aGUgdG9rZW4gYWdhaW5zdCBhIENvZ25pdG8gdXNlciBwb29sLlxuICovXG5jbGFzcyBDb2duaXRvVXNlclBvb2xBdXRob3JpemVyPFxuICBBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyxcbj4gZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBsYW1iZGE6IGxhbWJkYS5JRnVuY3Rpb25cblxuICAvKipcbiAgICogVXNlIHNpbXBsZSByZXNwb25zZSB0eXBlIChgeyBpc0F1dGhvcml6ZWQ6IHRydWUvZmFsc2UgfWApLCBhcyBvcHBvc2VkIHRvIHJldHVybmluZyBhbiBJQU1cbiAgICogUG9saWN5IGRvY3VtZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc3BvbnNlVHlwZXM6IGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGVbXSA9IFtcbiAgICBhdXRob3JpemVycy5IdHRwTGFtYmRhUmVzcG9uc2VUeXBlLlNJTVBMRSxcbiAgXVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBDb2duaXRvVXNlclBvb2xBdXRob3JpemVyUHJvcHM8QXV0aFNjb3Blc1Q+LFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICB0aGlzLmxhbWJkYSA9IG5ldyBsYW1iZGFOb2RlanMuTm9kZWpzRnVuY3Rpb24odGhpcywgXCJBdXRob3JpemVyRnVuY3Rpb25cIiwge1xuICAgICAgZW50cnk6IHBhdGguam9pbihcbiAgICAgICAgX19kaXJuYW1lLFxuICAgICAgICBgYXV0aG9yaXplci1sYW1iZGFzL2NvZ25pdG8tdXNlci1wb29sLWF1dGhvcml6ZXIuJHthdXRob3JpemVyRmlsZUV4dGVuc2lvbn1gLFxuICAgICAgKSxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBbXCJVU0VSX1BPT0xfSURcIl06IHByb3BzLnVzZXJQb29sLnVzZXJQb29sSWQsXG4gICAgICAgIFtcIlJFUVVJUkVEX1NDT1BFXCJdOiBwcm9wcy5yZXF1aXJlZFNjb3BlID8/IFwiXCIsXG4gICAgICAgIFtcIkNSRURFTlRJQUxTX0ZPUl9JTlRFUk5BTF9BVVRIT1JJWkFUSU9OXCJdOlxuICAgICAgICAgIHByb3BzLmNyZWRlbnRpYWxzRm9ySW50ZXJuYWxBdXRob3JpemF0aW9uXG4gICAgICAgICAgICA/IHByb3BzLmNyZWRlbnRpYWxzRm9ySW50ZXJuYWxBdXRob3JpemF0aW9uXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBpZiAocHJvcHMuY3JlZGVudGlhbHNGb3JJbnRlcm5hbEF1dGhvcml6YXRpb24pIHtcbiAgICAgIHNlY3JldHNtYW5hZ2VyLlNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKFxuICAgICAgICBzY29wZSxcbiAgICAgICAgaWQgKyBcIkJhc2ljQXV0aFNlY3JldFwiLFxuICAgICAgICBwcm9wcy5jcmVkZW50aWFsc0ZvckludGVybmFsQXV0aG9yaXphdGlvbixcbiAgICAgICkuZ3JhbnRSZWFkKHRoaXMubGFtYmRhKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gYXV0aG9yaXplciBsYW1iZGEgd2hpY2ggcmVhZHMgYEF1dGhvcml6YXRpb246IEJhc2ljIDxiYXNlNjQtZW5jb2RlZCBjcmVkZW50aWFscz5gXG4gKiBoZWFkZXIgYW5kIHZlcmlmaWVzIHRoZSBjcmVkZW50aWFscyBhZ2FpbnN0IGEgZ2l2ZW4gc2VjcmV0LlxuICovXG5jbGFzcyBCYXNpY0F1dGhBdXRob3JpemVyIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgbGFtYmRhOiBsYW1iZGEuSUZ1bmN0aW9uXG5cbiAgLy8gU2ltcGxlIGlzIGB7IGlzQXV0aG9yaXplZDogdHJ1ZS9mYWxzZSB9YCwgYXMgb3Bwb3NlZCB0byByZXR1cm5pbmcgYW4gSUFNIFBvbGljeSBkb2N1bWVudFxuICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplcnMuSHR0cExhbWJkYVJlc3BvbnNlVHlwZVtdID0gW1xuICAgIGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGUuU0lNUExFLFxuICBdXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgdGhpcy5sYW1iZGEgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIFwiQmFzaWNBdXRoTGFtYmRhXCIsIHtcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oXG4gICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgYGF1dGhvcml6ZXItbGFtYmRhcy9iYXNpYy1hdXRoLWF1dGhvcml6ZXIuJHthdXRob3JpemVyRmlsZUV4dGVuc2lvbn1gLFxuICAgICAgKSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkFuIGF1dGhvcml6ZXIgZm9yIEFQSS1HYXRld2F5IHRoYXQgY2hlY2tzIEJhc2ljIEF1dGggY3JlZGVudGlhbHMgb24gcmVxdWVzdHNcIixcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgW1wiQ1JFREVOVElBTFNfU0VDUkVUX05BTUVcIl06IHByb3BzLmNyZWRlbnRpYWxzU2VjcmV0TmFtZVxuICAgICAgICAgID8gcHJvcHMuY3JlZGVudGlhbHNTZWNyZXROYW1lXG4gICAgICAgICAgOiBcIlwiLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgaWYgKHByb3BzLmNyZWRlbnRpYWxzU2VjcmV0TmFtZSkge1xuICAgICAgc2VjcmV0c21hbmFnZXIuU2VjcmV0LmZyb21TZWNyZXROYW1lVjIoXG4gICAgICAgIHNjb3BlLFxuICAgICAgICBpZCArIFwiQmFzaWNBdXRoU2VjcmV0XCIsXG4gICAgICAgIHByb3BzLmNyZWRlbnRpYWxzU2VjcmV0TmFtZSxcbiAgICAgICkuZ3JhbnRSZWFkKHRoaXMubGFtYmRhKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gYXV0aG9yaXplciBsYW1iZGEgd2hpY2ggYWxsb3dzIGJvdGg6XG4gKiAtIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPGFjY2VzcyB0b2tlbj5gIGhlYWRlciwgZm9yIHdoaWNoIHRoZSB0b2tlbiBpcyBjaGVja2VkIGFnYWluc3QgdGhlIGdpdmVuXG4gKiAgIENvZ25pdG8gdXNlciBwb29sXG4gKiAtIGBBdXRob3JpemF0aW9uOiBCYXNpYyA8YmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHM+YCBoZWFkZXIsIGZvciB3aGljaCB0aGUgY3JlZGVudGlhbHMgYXJlXG4gKiAgIGNoZWNrZWQgYWdhaW5zdCB0aGUgY3JlZGVudGlhbHMgZnJvbSB0aGUgZ2l2ZW4gYmFzaWMgYXV0aCBzZWNyZXQgbmFtZVxuICpcbiAqIElmIGVpdGhlciBvZiB0aGVzZSBhcmUgZ2l2ZW4gYW5kIHZhbGlkLCB0aGUgcmVxdWVzdCBpcyBhdXRoZW50aWNhdGVkLlxuICovXG5jbGFzcyBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXI8XG4gIEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nLFxuPiBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGxhbWJkYTogbGFtYmRhLklGdW5jdGlvblxuXG4gIC8qKlxuICAgKiBVc2Ugc2ltcGxlIHJlc3BvbnNlIHR5cGUgKGB7IGlzQXV0aG9yaXplZDogdHJ1ZS9mYWxzZSB9YCksIGFzIG9wcG9zZWQgdG8gcmV0dXJuaW5nIGFuIElBTVxuICAgKiBQb2xpY3kgZG9jdW1lbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplcnMuSHR0cExhbWJkYVJlc3BvbnNlVHlwZVtdID0gW1xuICAgIGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGUuU0lNUExFLFxuICBdXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvZ25pdG9Vc2VyUG9vbE9yQmFzaWNBdXRoQXV0aG9yaXplclByb3BzPEF1dGhTY29wZXNUPixcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgdGhpcy5sYW1iZGEgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIFwiQXV0aG9yaXplckZ1bmN0aW9uXCIsIHtcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oXG4gICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgYGF1dGhvcml6ZXItbGFtYmRhcy9jb2duaXRvLXVzZXItcG9vbC1vci1iYXNpYy1hdXRoLWF1dGhvcml6ZXIuJHthdXRob3JpemVyRmlsZUV4dGVuc2lvbn1gLFxuICAgICAgKSxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBbXCJVU0VSX1BPT0xfSURcIl06IHByb3BzLnVzZXJQb29sID8gcHJvcHMudXNlclBvb2wudXNlclBvb2xJZCA6IFwiXCIsXG4gICAgICAgIFtcIlJFUVVJUkVEX1NDT1BFXCJdOiBwcm9wcy5yZXF1aXJlZFNjb3BlID8/IFwiXCIsXG4gICAgICAgIFtcIkJBU0lDX0FVVEhfQ1JFREVOVElBTFNfU0VDUkVUX05BTUVcIl06XG4gICAgICAgICAgcHJvcHMuYmFzaWNBdXRoQ3JlZGVudGlhbHNTZWNyZXROYW1lXG4gICAgICAgICAgICA/IHByb3BzLmJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgaWYgKHByb3BzLmJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZSkge1xuICAgICAgc2VjcmV0c21hbmFnZXIuU2VjcmV0LmZyb21TZWNyZXROYW1lVjIoXG4gICAgICAgIHNjb3BlLFxuICAgICAgICBpZCArIFwiQmFzaWNBdXRoU2VjcmV0XCIsXG4gICAgICAgIHByb3BzLmJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZSxcbiAgICAgICkuZ3JhbnRSZWFkKHRoaXMubGFtYmRhKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEEgc2xpZ2h0bHkgZXh0ZW5kZWQgdmVyc2lvbiBvZiB0aGUgW2RlZmF1bHQgSlNPTiBmb3JtYXQgc3VnZ2VzdGVkIGJ5IEFXU10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWxvZ2dpbmcuaHRtbCNodHRwLWFwaS1lbmFibGUtbG9nZ2luZy5leGFtcGxlcykuXG4gKi9cbmNvbnN0IGRlZmF1bHRBY2Nlc3NMb2dGb3JtYXQgPSB7XG4gIHJlcXVlc3RJZDogXCIkY29udGV4dC5yZXF1ZXN0SWRcIixcbiAgdXNlckFnZW50OiBcIiRjb250ZXh0LmlkZW50aXR5LnVzZXJBZ2VudFwiLFxuICBpcDogXCIkY29udGV4dC5pZGVudGl0eS5zb3VyY2VJcFwiLFxuICAvKiogQ0xGIGZvcm1hdDogYGRkL01NTS95eXl5OkhIOm1tOnNzICstaGhtbWAgKi9cbiAgcmVxdWVzdFRpbWU6IFwiJGNvbnRleHQucmVxdWVzdFRpbWVcIixcbiAgcmVxdWVzdFRpbWVFcG9jaDogXCIkY29udGV4dC5yZXF1ZXN0VGltZUVwb2NoXCIsXG4gIGRhdGFQcm9jZXNzZWQ6IFwiJGNvbnRleHQuZGF0YVByb2Nlc3NlZFwiLFxuICBodHRwTWV0aG9kOiBcIiRjb250ZXh0Lmh0dHBNZXRob2RcIixcbiAgcGF0aDogXCIkY29udGV4dC5wYXRoXCIsXG4gIHJvdXRlS2V5OiBcIiRjb250ZXh0LnJvdXRlS2V5XCIsXG4gIHN0YXR1czogXCIkY29udGV4dC5zdGF0dXNcIixcbiAgcHJvdG9jb2w6IFwiJGNvbnRleHQucHJvdG9jb2xcIixcbiAgcmVzcG9uc2VMZW5ndGg6IFwiJGNvbnRleHQucmVzcG9uc2VMZW5ndGhcIixcbiAgcmVzcG9uc2VMYXRlbmN5OiBcIiRjb250ZXh0LnJlc3BvbnNlTGF0ZW5jeVwiLFxuICBkb21haW5OYW1lOiBcIiRjb250ZXh0LmRvbWFpbk5hbWVcIixcbiAgZXJyb3I6IHtcbiAgICB0eXBlOiBcIiRjb250ZXh0LmVycm9yLnJlc3BvbnNlVHlwZVwiLFxuICAgIGdhdGV3YXlFcnJvcjogXCIkY29udGV4dC5lcnJvci5tZXNzYWdlXCIsXG4gICAgaW50ZWdyYXRpb25FcnJvcjogXCIkY29udGV4dC5pbnRlZ3JhdGlvbi5lcnJvclwiLFxuICAgIGF1dGhvcml6ZXJFcnJvcjogXCIkY29udGV4dC5hdXRob3JpemVyLmVycm9yXCIsXG4gIH0sXG4gIGludGVncmF0aW9uOiB7XG4gICAgbGF0ZW5jeTogXCIkY29udGV4dC5pbnRlZ3JhdGlvbi5sYXRlbmN5XCIsXG4gICAgcmVxdWVzdElkOiBcIiRjb250ZXh0LmludGVncmF0aW9uLnJlcXVlc3RJZFwiLFxuICAgIHJlc3BvbnNlU3RhdHVzOiBcIiRjb250ZXh0LmludGVncmF0aW9uLnN0YXR1c1wiLFxuICB9LFxuICBhdXRoOiB7XG4gICAgaWFtOiB7XG4gICAgICB1c2VyQXJuOiBcIiRjb250ZXh0LmlkZW50aXR5LnVzZXJBcm5cIixcbiAgICAgIGF3c0FjY291bnQ6IFwiJGNvbnRleHQuaWRlbnRpdHkuYWNjb3VudElkXCIsXG4gICAgICBhd3NQcmluY2lwYWw6IFwiJGNvbnRleHQuaWRlbnRpdHkuY2FsbGVyXCIsXG4gICAgICBhd3NQcmluY2lwYWxPcmc6IFwiJGNvbnRleHQuaWRlbnRpdHkucHJpbmNpcGFsT3JnSWRcIixcbiAgICB9LFxuICAgIGJhc2ljOiB7IHVzZXJuYW1lOiBcIiRjb250ZXh0LmF1dGhvcml6ZXIudXNlcm5hbWVcIiB9LFxuICAgIGNvZ25pdG86IHsgY2xpZW50SWQ6IFwiJGNvbnRleHQuYXV0aG9yaXplci5jbGllbnRJZFwiIH0sXG4gIH0sXG4gIGF3c0VuZHBvaW50UmVxdWVzdDoge1xuICAgIGlkOiBcIiRjb250ZXh0LmF3c0VuZHBvaW50UmVxdWVzdElkXCIsXG4gICAgaWQyOiBcIiRjb250ZXh0LmF3c0VuZHBvaW50UmVxdWVzdElkMlwiLFxuICB9LFxuICBtZXNzYWdlOlxuICAgIFwiJGNvbnRleHQuaWRlbnRpdHkuc291cmNlSXAgLSAkY29udGV4dC5odHRwTWV0aG9kICRjb250ZXh0LmRvbWFpbk5hbWUgJGNvbnRleHQucGF0aCAoJGNvbnRleHQucm91dGVLZXkpIC0gJGNvbnRleHQuc3RhdHVzIFskY29udGV4dC5yZXNwb25zZUxhdGVuY3kgbXNdXCIsXG59XG5cbi8qKlxuICogRW5hYmxlcyBhY2Nlc3MgbG9ncyBvbiB0aGUgQVBJLUdhdGV3YXkuXG4gKlxuICogQGF1dGhvciBLcmlzdGlhbiBSZWtzdGFkIDxrcmVAY2FwcmFjb25zdWx0aW5nLm5vPlxuICovXG5jbGFzcyBBcGlHYXRld2F5QWNjZXNzTG9ncyBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGxvZ0dyb3VwOiBsb2dzLkxvZ0dyb3VwXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3RhZ2U6IGFwaWd3LkNmblN0YWdlLFxuICAgIHByb3BzOiBBcGlHYXRld2F5QWNjZXNzTG9nc1Byb3BzIHwgdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRBY2Nlc3NMb2dGb3JtYXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICAvLyBsb2dHcm91cCBpcyBzZXQgdXAgd2l0aCBoZWxwIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvMTExMDAjaXNzdWVjb21tZW50LTkwNDYyNzA4MVxuICAgIC8vIE5vdCBzdXJlIGlmIEhUVFAgQVBJIGFjdHVhbGx5IG5lZWRzIHRoZSBzZXJ2aWNlIHJvbGUgd2l0aCBtYW5hZ2VkIHBvbGljeTogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWxvZ2dpbmcuaHRtbFxuICAgIGNvbnN0IGFjY2Vzc0xvZ3MgPSBuZXcgbG9ncy5Mb2dHcm91cCh0aGlzLCBcIkFjY2Vzc0xvZ0dyb3VwXCIsIHtcbiAgICAgIHJldGVudGlvbjogcHJvcHM/LnJldGVudGlvbixcbiAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzPy5yZW1vdmFsUG9saWN5ID8/IGNkay5SZW1vdmFsUG9saWN5LlJFVEFJTixcbiAgICAgIC8vIEFsd2F5cyB1c2UgdGhlIGRlZmF1bHQgZW5jcnlwdGlvbiBrZXkuIE90aGVyd2lzZSwgdGhlIGtleSBuZWVkcyBzcGVjaWFsIHBvbGljaWVzOlxuICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L2xvZ3MvZW5jcnlwdC1sb2ctZGF0YS1rbXMuaHRtbCNjbWstcGVybWlzc2lvbnNcbiAgICAgIGVuY3J5cHRpb25LZXk6IHVuZGVmaW5lZCxcbiAgICB9KVxuICAgIHRoaXMubG9nR3JvdXAgPSBhY2Nlc3NMb2dzXG5cbiAgICBzdGFnZS5hY2Nlc3NMb2dTZXR0aW5ncyA9IHtcbiAgICAgIGRlc3RpbmF0aW9uQXJuOiBhY2Nlc3NMb2dzLmxvZ0dyb3VwQXJuLFxuICAgICAgZm9ybWF0OiBKU09OLnN0cmluZ2lmeShwcm9wcz8uYWNjZXNzTG9nRm9ybWF0ID8/IGRlZmF1bHRBY2Nlc3NMb2dGb3JtYXQpLFxuICAgIH1cblxuICAgIGNvbnN0IGFwaUd3TG9nc1JvbGUgPSBuZXcgaWFtLlJvbGUoXG4gICAgICB0aGlzLFxuICAgICAgXCJBcGlHYXRld2F5UHVzaFRvQ2xvdWR3YXRjaExvZ3NSb2xlXCIsXG4gICAgICB7XG4gICAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKFwiYXBpZ2F0ZXdheS5hbWF6b25hd3MuY29tXCIpLFxuICAgICAgICBtYW5hZ2VkUG9saWNpZXM6IFtcbiAgICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgICBcInNlcnZpY2Utcm9sZS9BbWF6b25BUElHYXRld2F5UHVzaFRvQ2xvdWRXYXRjaExvZ3NcIixcbiAgICAgICAgICApLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICApXG5cbiAgICBhY2Nlc3NMb2dzLmdyYW50V3JpdGUoYXBpR3dMb2dzUm9sZSlcbiAgfVxufVxuXG4vKiogUmV0dXJucyBhIHNob3J0IHNlbWktdW5pcXVlIGhhc2ggb2YgdGhlIGdpdmVuIHN0cmluZy4gKi9cbmZ1bmN0aW9uIHNob3J0SGFzaChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFNIQS0xIGlzIG5vLW5vIHdoZW4gd2UgbmVlZCBjcnlwdG9ncmFwaGljIHNlY3VyaXR5LCBidXQgaGVyZSB3ZSBqdXN0IGl0IGZvciBzaG9ydGVuaW5nIGEgbmFtZSxcbiAgLy8gd2hpY2ggaXMgZmluZVxuICByZXR1cm4gY3JlYXRlSGFzaChcInNoYTFcIikudXBkYXRlKHN0cikuZGlnZXN0KFwiaGV4XCIpLnN1YnN0cmluZygwLCAxMClcbn1cbiJdfQ==
|
|
598
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1hcGktZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGktZ2F0ZXdheS9odHRwLWFwaS1nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sYUFBYSxDQUFBO0FBR2xDLE9BQU8sS0FBSyxNQUFNLE1BQU0sd0JBQXdCLENBQUE7QUFFaEQsT0FBTyxLQUFLLEtBQUssTUFBTSw4QkFBOEIsQ0FBQTtBQUNyRCxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFBO0FBQzVDLE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUE7QUFDMUMsT0FBTyxLQUFLLGNBQWMsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUNoRSxPQUFPLEtBQUssWUFBWSxNQUFNLDJDQUEyQyxDQUFBO0FBQ3pFLE9BQU8sS0FBSyxXQUFXLE1BQU0sMENBQTBDLENBQUE7QUFFdkUsT0FBTyxLQUFLLFlBQVksTUFBTSwrQkFBK0IsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ25DLE9BQU8sS0FBSyxPQUFPLE1BQU0seUJBQXlCLENBQUE7QUFDbEQsT0FBTyxLQUFLLGNBQWMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNqRSxPQUFPLEtBQUssR0FBRyxNQUFNLG9DQUFvQyxDQUFBO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUE7QUFDNUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUVuQyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FB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LENBQUM7WUFDL0QsZUFBZSxFQUFFO2dCQUNmLEdBQUcsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQ3hDLG1EQUFtRCxDQUNwRDthQUNGO1NBQ0YsQ0FDRixDQUFBO1FBRUQsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0NBQ0Y7QUFFRCw0REFBNEQ7QUFDNUQsU0FBUyxTQUFTLENBQUMsR0FBVztJQUM1QixpR0FBaUc7SUFDakcsZ0JBQWdCO0lBQ2hCLE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUN0RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY29uc3RydWN0cyBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCB0eXBlICogYXMgZWxiIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiXG5pbXBvcnQgdHlwZSAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiXG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0IHR5cGUgKiBhcyBzcXMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zcXNcIlxuaW1wb3J0ICogYXMgYXBpZ3cgZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5djJcIlxuaW1wb3J0ICogYXMgbG9ncyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIlxuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCJcbmltcG9ydCAqIGFzIHNlY3JldHNtYW5hZ2VyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIlxuaW1wb3J0ICogYXMgaW50ZWdyYXRpb25zIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyLWludGVncmF0aW9uc1wiXG5pbXBvcnQgKiBhcyBhdXRob3JpemVycyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXl2Mi1hdXRob3JpemVyc1wiXG5pbXBvcnQgdHlwZSB7IElVc2VyUG9vbCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY29nbml0b1wiXG5pbXBvcnQgKiBhcyBsYW1iZGFOb2RlanMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCJcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwiY3J5cHRvXCJcbmltcG9ydCAqIGFzIHJvdXRlNTMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzXCJcbmltcG9ydCAqIGFzIHJvdXRlNTNUYXJnZXRzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1My10YXJnZXRzXCJcbmltcG9ydCAqIGFzIGFjbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiXG5pbXBvcnQgeyB0YWdSZXNvdXJjZXMgfSBmcm9tIFwiLi4vdGFnc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwidXJsXCJcblxuY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKVxuY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpXG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSB7QGxpbmsgQXBpR2F0ZXdheX0gY29uc3RydWN0LlxuICpcbiAqIEBhdXRob3IgS3Jpc3RpYW4gUmVrc3RhZCA8a3JlQGNhcHJhY29uc3VsdGluZy5ubz5cbiAqIEBhdXRob3IgSGVybWFubiBNw7hya3JpZCA8aGVtQGxpZmxpZy5ubz5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpR2F0ZXdheVByb3BzPEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9IHtcbiAgLyoqIFNldHRpbmdzIGZvciB0aGUgZXh0ZXJuYWwtZmFjaW5nIHBhcnQgb2YgdGhlIEFQSS1HVy4gKi9cbiAgZG5zOiBBcGlHYXRld2F5RG5zUHJvcHNcblxuICAvKipcbiAgICogSWYgbm8gaW50ZWdyYXRpb24gaXMgc3BlY2lmaWVkIGZvciBhIHJvdXRlLCB0aGlzIGludGVncmF0aW9uIGlzIHVzZWQuXG4gICAqXG4gICAqIFNlZSB7QGxpbmsgSW50ZWdyYXRpb25Qcm9wc30gZm9yIHRoZSBhdmFpbGFibGUgb3B0aW9ucy5cbiAgICovXG4gIGRlZmF1bHRJbnRlZ3JhdGlvbj86IEludGVncmF0aW9uUHJvcHNcblxuICAvKipcbiAgICogSWYgbm8gYXV0aG9yaXphdGlvbiBpcyBzcGVjaWZpZWQgZm9yIGEgcm91dGUsIHRoaXMgYXV0aG9yaXphdGlvbiBpcyB1c2VkLlxuICAgKlxuICAgKiBTZWUge0BsaW5rIEF1dGhvcml6YXRpb25Qcm9wc30gZm9yIHRoZSBhdmFpbGFibGUgb3B0aW9ucy5cbiAgICovXG4gIGRlZmF1bHRBdXRob3JpemF0aW9uPzogQXV0aG9yaXphdGlvblByb3BzPEF1dGhTY29wZXNUPlxuXG4gIHJvdXRlczogQXBpR2F0ZXdheVJvdXRlPEF1dGhTY29wZXNUPltdXG5cbiAgLyoqXG4gICAqIFRoZSBBUEktR1cgYWNjZXNzIGxvZ3MgZm9yIHRoZSBgJGRlZmF1bHRgIHN0YWdlIGFyZSBrZXB0LlxuICAgKiBUaGlzIGhhcyBvcHRpb25zIGZvciB0aGUgbG9ncy5cbiAgICovXG4gIGFjY2Vzc0xvZ3M/OiBBcGlHYXRld2F5QWNjZXNzTG9nc1Byb3BzXG5cbiAgLyoqXG4gICAqIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHJvdXRlLWxldmVsIG1ldHJpY3MuXG4gICAqIFRoaXMgY2FuIGluY3JlYXNlIENsb3VkV2F0Y2ggY29zdHMgd2hlbiBub3QgZGlzYWJsZWQuXG4gICAqXG4gICAqIFNlZSBbQVdTOiBXb3JraW5nIHdpdGggbWV0cmljcyBmb3IgSFRUUCBBUElzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktbWV0cmljcy5odG1sP2ljbXBpZD1hcGlnYXRld2F5X2NvbnNvbGVfaGVscCM6fjp0ZXh0PWFuZCUyMHN0YWdlJTIwSUQuLSxBcGlJZCUyQyUyMFN0YWdlJTJDJTIwUm91dGUsLUZpbHRlcnMlMjBBUEklMjBHYXRld2F5KVxuICAgKiBmb3IgbW9yZSBpbmZvLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBkZXRhaWxlZE1ldHJpY3M/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIFRocm90dGxpbmcgb2YgcmVxdWVzdHMuXG4gICAqIElmIG5vdCBzZXQsIHRoZSBBV1MgZGVmYXVsdCBvZiA1MDAwIGJ1cnN0IGFuZCAxMDAwMCByYXRlIGlzIHVzZWQuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IHRocm90dGxpbmcgaXMgcGVyLWFjY291bnQsIGFuZCBjb3VudHMgYWxsIEFQSXMgaW4gdGhlIGFjY291bnQgYW5kIHJlZ2lvbi5cbiAgICogSWYgeW91IGhhdmUgYW5vdGhlciBBUEkgaW4gdGhpcyByZWdpb24gZ2V0dGluZyAxMF8wMDAgcmVxdWVzdCByYXRlLCBpdCBtYXkgaW1wYWN0IHRoaXMgQVBJIGFzIHdlbGwuXG4gICAqL1xuICB0aHJvdHRsaW5nPzoge1xuICAgIC8qKlxuICAgICAqIEdvaW5nIG92ZXIgYDVfMDAwYCBtYXkgcmVxdWlyZSB5b3UgdG8gY29udGFjdCBBV1MgU3VwcG9ydCAtIHRoZXkgYXJlIGFjY291bnQgYm91bmQuXG4gICAgICovXG4gICAgYnVyc3Q/OiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBHb2luZyBvdmVyIGAxMF8wMDBgIG1heSByZXF1aXJlIHlvdSB0byBjb250YWN0IEFXUyBTdXBwb3J0IC0gdGhleSBhcmUgYWNjb3VudCBib3VuZC5cbiAgICAgKi9cbiAgICByYXRlPzogbnVtYmVyXG4gIH1cblxuICAvKipcbiAgICogU2V0cyBDT1JTIGhlYWRlcnMgb24gcmVzcG9uc2VzIGZyb20gdGhlIEFQSSBHYXRld2F5IHRvIGFsbG93IGFsbCBvcmlnaW5zLCBoZWFkZXJzIGFuZCBtZXRob2RzLlxuICAgKiBVc2VmdWwgaWYgeW91ciBBUEkgc2hvdWxkIGJlIGFjY2Vzc2VkIGJ5IGFueSBicm93c2VyLlxuICAgKi9cbiAgY29yc0FsbG93QWxsPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBJZiBzb21lIHNldHRpbmdzIGluIHRoaXMgY29uc3RydWN0IGRvIG5vdCB3b3JrIGZvciB5b3UsIHRoaXMgaXMgYW4gZXNjYXBlIGhhdGNoIG1lY2hhbmlzbSB0b1xuICAgKiBvdmVycmlkZSBhbnl0aGluZy5cbiAgICovXG4gIHByb3BzT3ZlcnJpZGU/OiB7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgc2V0dGluZ3MgZm9yIHRoZSB7QGxpbmsgYXBpZ3cuSHR0cEFwaX0gKGFjY2Vzc2libGUgaW4ge0BsaW5rIEFwaUdhdGV3YXkuaHR0cEFwaX0pLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgZnJvbnRlbmQgYWNjZXNzaW5nIHRoaXMgQVBJLCB5b3UgbWlnaHQgd2FudCB0byBzZXRcbiAgICAgKiBbQ09SUyBwcmVmbGlnaHRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jZGsvYXBpL3YxL2RvY3MvYXdzLWFwaWdhdGV3YXl2Mi1yZWFkbWUuaHRtbCNjcm9zcy1vcmlnaW4tcmVzb3VyY2Utc2hhcmluZy1jb3JzKVxuICAgICAqIHNldHRpbmdzLlxuICAgICAqL1xuICAgIGh0dHBBcGk/OiBQYXJ0aWFsPGFwaWd3Lkh0dHBBcGlQcm9wcz5cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBBcGlHYXRld2F5RG5zUHJvcHMgPSB7XG4gIC8qKlxuICAgKiBPbmx5IHRoZSBzdWJkb21haW4gcHJlZml4LCB3aGljaCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UuXG4gICAqIEV4YW1wbGU6IFN1YmRvbWFpbiBgcHJvZHVjdGAgd291bGQgZ2l2ZSB0aGUgZW5kIHJlc3VsdCBvZiBhbiBBUEktR1cgd2l0aFxuICAgKiBgcHJvZHVjdC5wbGF0Zm9ybS5leGFtcGxlLm5vYC5cbiAgICovXG4gIHN1YmRvbWFpbjogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEhvc3RlZCBab25lIGZvciB0aGUgZXh0ZXJuYWwgZmFjaW5nIGRvbWFpbi5cbiAgICogVGhpcyBpcyB3aGVyZSByb3V0ZXMgd2lsbCBiZSBjcmVhdGVkLCB0byByZWRpcmVjdCBjb25zdW1lcnMgdG8gdGhlIEFQSS1HVy5cbiAgICogRm9yIGV4YW1wbGUgYSBIWiBmb3IgYHBsYXRmb3JtLmV4YW1wbGUubm9gLlxuICAgKi9cbiAgaG9zdGVkWm9uZTogcm91dGU1My5JSG9zdGVkWm9uZVxuXG4gIC8qKlxuICAgKiBUaGUgVGltZSBUbyBMaXZlIChUVEwpIGZvciB0aGUgcHVibGljIEROUyBBIHJlY29yZCB0aGF0IHdpbGwgZXhwb3NlIHRoZSBBUEktR1cuXG4gICAqIFRoaXMgaXMgaG93IGxvbmcgRE5TIHNlcnZlcnMgd2lsbCBjYWNoZSB0aGUgcmVjb3JkLlxuICAgKlxuICAgKiBBIGxvbmcgVFRMIChob3VycykgaXMgYmVuZWZpY2lhbCB0byBETlMgc2VydmVycywgYnV0IG1ha2VzIGRldmVsb3BlcnMgKHlvdSkgd2FpdCBsb25nZXIgd2hlblxuICAgKiBkb2luZyBjaGFuZ2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCA1IG1pbnV0ZXNcbiAgICovXG4gIHR0bD86IGNkay5EdXJhdGlvblxufVxuXG5leHBvcnQgdHlwZSBBcGlHYXRld2F5Um91dGU8QXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0ge1xuICAvKiogVGhlIHBhdGggb2YgdGhlIHJvdXRlIHRvIGV4cG9zZSB0aHJvdWdoIHRoZSBBUEkgR2F0ZXdheS4gVXNlIFwiL1wiIGZvciB0aGUgcm9vdCByb3V0ZS4gKi9cbiAgcGF0aDogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQsIHdlIG9ubHkgZm9yd2FyZCByZXF1ZXN0cyB0aGF0IG1hdGNoIHRoZSByb3V0ZSdzIHBhdGggZXhhY3RseS4gU28gZm9yIGEgcm91dGUgd2l0aFxuICAgKiBwYXRoIGAvYXBpL3VzZXJzYCwgYSByZXF1ZXN0IHRvIGAvYXBpL3VzZXJzYCB3aWxsIGJlIGZvcndhcmRlZCwgYnV0IGEgcmVxdWVzdCB0b1xuICAgKiBgL2FwaS91c2Vycy9hZG1pbmAgd2lsbCBub3QuIElmIHlvdSB3YW50IHRvIGZvcndhcmQgcmVxdWVzdHMgdG8gYWxsIHN1Yi1wYXRocyB1bmRlciB0aGUgcm91dGUnc1xuICAgKiBwYXRoLCB5b3UgY2FuIHNldCB0aGlzIHRvIHRydWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBpbmNsdWRlU3VicGF0aHM/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIFRoZSBIVFRQIG1ldGhvZCB0byBleHBvc2UuIGBBTllgIGV4cG9zZXMgYWxsIEhUVFAgbWV0aG9kcyBvbiB0aGUgcGF0aC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJBTllcIlxuICAgKi9cbiAgbWV0aG9kPzogSHR0cE1ldGhvZFxuXG4gIC8qKlxuICAgKiBUaGUgaW50ZWdyYXRpb24gdGhhdCB0aGUgcm91dGUgd2lsbCBmb3J3YXJkIHRvLiBTZWUge0BsaW5rIEludGVncmF0aW9uUHJvcHN9IGZvciB0aGUgYXZhaWxhYmxlXG4gICAqIG9wdGlvbnMuXG4gICAqXG4gICAqIElmIHVuZGVmaW5lZCwgdXNlcyB0aGUge0BsaW5rIEFwaUdhdGV3YXlQcm9wcy5kZWZhdWx0SW50ZWdyYXRpb259LlxuICAgKi9cbiAgaW50ZWdyYXRpb24/OiBJbnRlZ3JhdGlvblByb3BzXG5cbiAgLyoqXG4gICAqIEhvdyByZXF1ZXN0cyBvbiB0aGUgcm91dGUgYXJlIGF1dGhlbnRpY2F0ZWQuIFNlZSB7QGxpbmsgQXV0aG9yaXphdGlvblByb3BzfSBmb3IgdGhlIGF2YWlsYWJsZVxuICAgKiBvcHRpb25zLlxuICAgKlxuICAgKiBJZiB1bmRlZmluZWQsIHVzZXMgdGhlIHtAbGluayBBcGlHYXRld2F5UHJvcHMuZGVmYXVsdEF1dGhvcml6YXRpb259LlxuICAgKi9cbiAgYXV0aG9yaXphdGlvbj86IEF1dGhvcml6YXRpb25Qcm9wczxBdXRoU2NvcGVzVD5cbn1cblxuZXhwb3J0IHR5cGUgSHR0cE1ldGhvZCA9XG4gIHwgXCJBTllcIlxuICB8IFwiR0VUXCJcbiAgfCBcIlBPU1RcIlxuICB8IFwiUFVUXCJcbiAgfCBcIlBBVENIXCJcbiAgfCBcIkRFTEVURVwiXG4gIHwgXCJPUFRJT05TXCJcbiAgfCBcIkhFQURcIlxuXG5leHBvcnQgdHlwZSBJbnRlZ3JhdGlvblByb3BzID1cbiAgLyoqIFVzZSB0aGlzIHdoZW4gY29ubmVjdGluZyB0aGUgcm91dGUgdG8gYW4gQUxCIChBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VyKS4gKi9cbiAgfCAoeyB0eXBlOiBcIkFMQlwiIH0gJiBBbGJJbnRlZ3JhdGlvblByb3BzKVxuICAvKiogVXNlIHRoaXMgd2hlbiBjb25uZWN0aW5nIHJvdXRlIHRvIGEgTGFtYmRhLiAqL1xuICB8ICh7IHR5cGU6IFwiTGFtYmRhXCIgfSAmIExhbWJkYUludGVncmF0aW9uUHJvcHMpXG4gIC8qKiBVc2UgdGhpcyB3aGVuIGNvbm5lY3RpbmcgYSByb3V0ZSB0byBzZW5kIHRvIGFuIFNRUyBxdWV1ZS4gKi9cbiAgfCAoeyB0eXBlOiBcIlNRU1wiIH0gJiBTcXNJbnRlZ3JhdGlvblByb3BzKVxuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgQVBJLUdXIC0+IEFMQiAoQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlcikgaW50ZWdyYXRpb24uXG4gKlxuICogU2VlIHRoZSBub3RlIG9uIHtAbGluayBBcGlHYXRld2F5fSBhYm91dCB0aGUgbG9hZCBiYWxhbmNlciBzZWN1cml0eSBncm91cC5cbiAqL1xuZXhwb3J0IHR5cGUgQWxiSW50ZWdyYXRpb25Qcm9wcyA9IHtcbiAgLyoqXG4gICAqIEEgbGlzdGVuZXIgb24gZS5nLiBwb3J0IDQ0MyAoSFRUUFMpLlxuICAgKlxuICAgKiBTZWUgdGhlIG5vdGUgb24ge0BsaW5rIEFwaUdhdGV3YXl9IGFib3V0IHRoZSBsb2FkIGJhbGFuY2VyIHNlY3VyaXR5IGdyb3VwLlxuICAgKi9cbiAgbG9hZEJhbGFuY2VyTGlzdGVuZXI6IGVsYi5JQXBwbGljYXRpb25MaXN0ZW5lclxuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBuYW1lIChkb21haW4gbmFtZSkgb2YgdGhlIGJhY2tlbmQgc2VydmljZSB0aGF0IHdlIHdhbnQgdG8gcmVhY2ggdGhyb3VnaCB0aGUgQUxCLlxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWQgdG86XG4gICAqIC0gVmVyaWZ5IHRoZSBIVFRQUyBjZXJ0aWZpY2F0ZSBvZiB0aGUgYmFja2VuZCBzZXJ2aWNlLCBzbyB0aGF0IHRoZSByZXF1ZXN0IGZvcndhcmRlZCBmcm9tXG4gICAqICAgQVBJLUdXIGNhbiB1c2UgVExTXG4gICAqIC0gU2V0IHRoZSBgSG9zdGAgaGVhZGVyIG9uIHRoZSByZXF1ZXN0IHdoZW4gZm9yd2FyZGluZyB0byB0aGUgQUxCLCBzbyB0aGF0IHJlcXVlc3RzIGNhbiBiZVxuICAgKiAgIHJvdXRlZCB0byB0aGUgY29ycmVjdCBUYXJnZXQgR3JvdXBcbiAgICpcbiAgICogRXhhbXBsZSB2YWx1ZTogYDxzZXJ2aWNlPi5zdGFnaW5nLm15LXByb2plY3QubGlmbGlnLmlvYCAobm90IHByZWZpeGVkIGJ5IGBodHRwczovL2ApLlxuICAgKi9cbiAgaG9zdE5hbWU6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBUaGUgVlBDIHVzZWQgYnkgdGhlIEFMQi4gVGhlIEFQSS1HVyBpbnRlZ3JhdGlvbiB3aWxsIGNvbm5lY3QgdG8gdGhlIEFMQiB1c2luZyBhIFZQQyBMaW5rIGZvclxuICAgKiB0aGlzIFZQQy5cbiAgICpcbiAgICogU2VlIHRoZSBub3RlIG9uIHtAbGluayBBcGlHYXRld2F5fSBhYm91dCB0aGUgbG9hZCBiYWxhbmNlciBzZWN1cml0eSBncm91cC5cbiAgICovXG4gIHZwYzogZWMyLklWcGNcblxuICAvKipcbiAgICogQSBzZWN1cml0eSBncm91cCAoU0cpIHRoYXQgYWxsb3dzIGluY29taW5nIHRyYWZmaWMgdG8gdGhlIEFMQi4gV2lsbCBiZSB1c2VkIGJ5IHRoZSBWUEMgbGluaywgc29cbiAgICogdGhlIEFQSS1HVyBpbnRlZ3JhdGlvbiBjYW4gY29ubmVjdC5cbiAgICpcbiAgICogVGhpcyBpcyB1c3VhbGx5IHRoZSBzYW1lIFNHIGFzIHRoZSBBTEIgdXNlcywgYmVjYXVzZSB0aGV5IGhhdmUgYSBydWxlIHRoYXQgYWxsb3dzIHRyYWZmaWMgZnJvbVxuICAgKiBvdGhlcnMgaW4gdGhlIHNhbWUgU0cuXG4gICAqXG4gICAqIFNlZSB0aGUgbm90ZSBvbiB7QGxpbmsgQXBpR2F0ZXdheX0gYWJvdXQgdGhlIGxvYWQgYmFsYW5jZXIgc2VjdXJpdHkgZ3JvdXAuXG4gICAqL1xuICBzZWN1cml0eUdyb3VwOiBlYzIuSVNlY3VyaXR5R3JvdXBcblxuICAvKipcbiAgICogTWFwIHJlcXVlc3QgcGFyYW1ldGVycyAoYWRkL292ZXJ3cml0ZSBwYXRoL2hlYWRlcnMvcXVlcnkgcGFyYW1zKSBiZWZvcmUgZm9yd2FyZGluZyB0byB0aGVcbiAgICogYmFja2VuZC5cbiAgICpcbiAgICogU2VlIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktcGFyYW1ldGVyLW1hcHBpbmcuaHRtbH1cbiAgICogZm9yIG1vcmUgb24gdGhpcy4gUmVhZCB0aGUgJ1Jlc2VydmVkIGhlYWRlcnMnIHNlY3Rpb24gZm9yIHdoaWNoIGhlYWRlcnMgY2Fubm90IGJlIG92ZXJyaWRkZW4uXG4gICAqIEluIGFkZGl0aW9uIHRvIHRoZSBBV1MtcmVzZXJ2ZWQgaGVhZGVycywgeW91IHNob3VsZCBub3Qgb3ZlcnJpZGUgdGhlICdIb3N0JyBoZWFkZXIgZWl0aGVyLCBhc1xuICAgKiB0aGF0J3MgdXNlZCBmb3Igcm91dGluZyB0aGUgcmVxdWVzdCB0byB0aGUgY29ycmVjdCBzZXJ2aWNlIGJlaGluZCB0aGUgbG9hZCBiYWxhbmNlci5cbiAgICpcbiAgICogIyMjIEV4YW1wbGU6XG4gICAqXG4gICAqIEFkZGluZyBhIGhlYWRlcjpcbiAgICogYGBgXG4gICAqIG1hcFBhcmFtZXRlcnM6IChwYXJhbWV0ZXJzKSA9PiBwYXJhbWV0ZXJzLm92ZXJ3cml0ZUhlYWRlcihcbiAgICogICAgXCJYLU15LUN1c3RvbS1IZWFkZXJcIixcbiAgICogICAgYXBpZ3cuTWFwcGluZ1ZhbHVlLmN1c3RvbShcIm15LWN1c3RvbS12YWx1ZVwiKSxcbiAgICogKVxuICAgKiBgYGBcbiAgICpcbiAgICogT3ZlcndyaXRpbmcgdGhlIHBhdGggKGlmLCBmb3IgZXhhbXBsZSwgeW91IGNvbmZpZ3VyZSBhIGAvdXNlcnNgIHJvdXRlIG9uIHRoZSBBUEkgR2F0ZXdheSB0aGF0XG4gICAqIHlvdSB3YW50IHRvIGZvcndhcmQgdG8gYC9hcGkvdXNlcnNgIG9uIHRoZSBiYWNrZW5kKTpcbiAgICogYGBgXG4gICAqIG1hcFBhcmFtZXRlcnM6IChwYXJhbWV0ZXJzKSA9PiBwYXJhbWV0ZXJzLm92ZXJ3cml0ZVBhdGgoXCIvYXBpL3VzZXJzXCIpXG4gICAqIGBgYFxuICAgKi9cbiAgbWFwUGFyYW1ldGVycz86IChwYXJhbWV0ZXJzOiBhcGlndy5QYXJhbWV0ZXJNYXBwaW5nKSA9PiB2b2lkXG59XG5cbmV4cG9ydCB0eXBlIExhbWJkYUludGVncmF0aW9uUHJvcHMgPSB7XG4gIC8qKlxuICAgKiBUaGUgTGFtYmRhIGludGVncmF0aW9uIHVzZXMgdGhlIFYyIHBheWxvYWQgZm9ybWF0OlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWRldmVsb3AtaW50ZWdyYXRpb25zLWxhbWJkYS5odG1sfVxuICAgKlxuICAgKiBJZiB3cml0aW5nIHRoZSBMYW1iZGEgaW4gVHlwZVNjcmlwdCwgdGhpcyBtZWFucyB5b3Ugc2hvdWxkIHVzZSBgQVBJR2F0ZXdheVByb3h5RXZlbnRWMmAgYXMgdGhlXG4gICAqIHJlcXVlc3QgdHlwZSwgYW5kIGBBUElHYXRld2F5UHJveHlSZXN1bHRWMmAgYXMgdGhlIHJlc3BvbnNlIHR5cGUuXG4gICAqL1xuICBsYW1iZGE6IGxhbWJkYS5JRnVuY3Rpb25cbn1cblxuZXhwb3J0IHR5cGUgU3FzSW50ZWdyYXRpb25Qcm9wcyA9IHtcbiAgcXVldWU6IHNxcy5JUXVldWVcblxuICAvKipcbiAgICogTWVzc2FnZSBhdHRyaWJ1dGVzIHRvIHBhc3Mgb24gdG8gU1FTLiBUaGUga2V5cyBpbiB0aGlzIG9iamVjdCBhcmUgdGhlIG5hbWVzIG9mIHRoZSBhdHRyaWJ1dGVzLlxuICAgKiBFYWNoIGF0dHJpYnV0ZSBoYXMgYSBEYXRhVHlwZSBmaWVsZCwgYW5kIGVpdGhlciBhIFN0cmluZ1ZhbHVlIG9yIEJpbmFyeVZhbHVlIGZpZWxkIGRlcGVuZGluZyBvblxuICAgKiBpdHMgdHlwZS4gU2VlIEFXUyBkb2NzOlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTU2ltcGxlUXVldWVTZXJ2aWNlL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01lc3NhZ2VBdHRyaWJ1dGVWYWx1ZS5odG1sXG4gICAqXG4gICAqIEluIHRoZSBTdHJpbmdWYWx1ZSBmaWVsZCwgeW91IGNhbiBkbyBBUEkgR2F0ZXdheSBwYXJhbWV0ZXIgbWFwcGluZzpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLXBhcmFtZXRlci1tYXBwaW5nLmh0bWxcbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogYGBgXG4gICAqIG1lc3NhZ2VBdHRyaWJ1dGVzOiB7XG4gICAqICAgY2xpZW50SWQ6IHtcbiAgICogICAgIERhdGFUeXBlOiBcIlN0cmluZ1wiLFxuICAgKiAgICAgU3RyaW5nVmFsdWU6IFwiJHtjb250ZXh0LmF1dGhvcml6ZXIuY2xpZW50SWR9XCIsXG4gICAqICAgfSxcbiAgICogfSxcbiAgICogYGBgXG4gICAqL1xuICBtZXNzYWdlQXR0cmlidXRlcz86IHtcbiAgICBbYXR0cmlidXRlTmFtZTogc3RyaW5nXTpcbiAgICAgIHwgeyBEYXRhVHlwZTogXCJTdHJpbmdcIiB8IFwiTnVtYmVyXCI7IFN0cmluZ1ZhbHVlOiBzdHJpbmcgfVxuICAgICAgfCB7XG4gICAgICAgICAgRGF0YVR5cGU6IFwiQmluYXJ5XCJcbiAgICAgICAgICAvKiogQmFzZTY0LWVuY29kZWQgYmluYXJ5IGRhdGEgb2JqZWN0LiAqL1xuICAgICAgICAgIEJpbmFyeVZhbHVlOiBzdHJpbmdcbiAgICAgICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIEF1dGhvcml6YXRpb25Qcm9wczxBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPVxuICAvKipcbiAgICogTm8gYXV0aGVudGljYXRpb24sIGZvciB3aGVuIHlvdSB3YW50IGEgZnVsbHkgcHVibGljIHJvdXRlIChvciBoYW5kbGUgYXV0aGVudGljYXRpb24gaW4gdGhlXG4gICAqIGJhY2tlbmQgaW50ZWdyYXRpb24pLlxuICAgKi9cbiAgfCB7IHR5cGU6IFwiTk9ORVwiIH1cbiAgLyoqXG4gICAqIEFXUyBJQU0gYXV0aG9yaXphdGlvbi5cbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWFjY2Vzcy1jb250cm9sLWlhbS5odG1sXG4gICAqL1xuICB8IHsgdHlwZTogXCJJQU1cIiB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY3VzdG9tIExhbWJkYSBhdXRob3JpemVyIHdoaWNoIHJlYWRzIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPGFjY2VzcyB0b2tlbj5gIGhlYWRlclxuICAgKiBhbmQgdmVyaWZpZXMgdGhlIHRva2VuIGFnYWluc3QgYSBDb2duaXRvIHVzZXIgcG9vbC5cbiAgICovXG4gIHwgKHtcbiAgICAgIHR5cGU6IFwiQ09HTklUT19VU0VSX1BPT0xcIlxuICAgIH0gJiBDb2duaXRvVXNlclBvb2xBdXRob3JpemVyUHJvcHM8QXV0aFNjb3Blc1Q+KVxuICAvKipcbiAgICogQ3JlYXRlcyBhIGN1c3RvbSBMYW1iZGEgYXV0aG9yaXplciB3aGljaCByZWFkcyBgQXV0aG9yaXphdGlvbjogQmFzaWMgPGJhc2U2NC1lbmNvZGVkIGNyZWRlbnRpYWxzPmBcbiAgICogaGVhZGVyIGFuZCB2ZXJpZmllcyB0aGUgY3JlZGVudGlhbHMgYWdhaW5zdCBhIGdpdmVuIHNlY3JldC5cbiAgICovXG4gIHwgKHsgdHlwZTogXCJCQVNJQ19BVVRIXCIgfSAmIEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wcylcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjdXN0b20gTGFtYmRhIGF1dGhvcml6ZXIgd2hpY2ggYWxsb3dzIGJvdGg6XG4gICAqIC0gYEF1dGhvcml6YXRpb246IEJlYXJlciA8YWNjZXNzIHRva2VuPmAgaGVhZGVyLCBmb3Igd2hpY2ggdGhlIHRva2VuIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGVcbiAgICogICBnaXZlbiBDb2duaXRvIHVzZXIgcG9vbFxuICAgKiAtIGBBdXRob3JpemF0aW9uOiBCYXNpYyA8YmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHM+YCBoZWFkZXIsIGZvciB3aGljaCB0aGUgY3JlZGVudGlhbHMgYXJlXG4gICAqICAgY2hlY2tlZCBhZ2FpbnN0IHRoZSBjcmVkZW50aWFscyBmcm9tIHRoZSBnaXZlbiBiYXNpYyBhdXRoIHNlY3JldCBuYW1lXG4gICAqXG4gICAqIElmIGVpdGhlciBvZiB0aGVzZSBhcmUgZ2l2ZW4gYW5kIHZhbGlkLCB0aGUgcmVxdWVzdCBpcyBhdXRoZW50aWNhdGVkLlxuICAgKi9cbiAgfCAoe1xuICAgICAgdHlwZTogXCJDT0dOSVRPX1VTRVJfUE9PTF9PUl9CQVNJQ19BVVRIXCJcbiAgICB9ICYgQ29nbml0b1VzZXJQb29sT3JCYXNpY0F1dGhBdXRob3JpemVyUHJvcHM8QXV0aFNjb3Blc1Q+KVxuICAvKipcbiAgICogQ3JlYXRlcyBhIGN1c3RvbSBhdXRob3JpemVyIHdpdGggdGhlIGdpdmVuIExhbWJkYSBmdW5jdGlvbi4gVXNlIHRoaXMgaWYgeW91IGhhdmUgY3VzdG9tXG4gICAqIGF1dGhvcml6YXRpb24gbG9naWMsIGFuZCB0aGUgb3RoZXIgYXV0aG9yaXplcnMgZnJvbSB0aGlzIGNvbnN0cnVjdCBkb24ndCBtZWV0IHlvdXIgbmVlZHMuXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1sYW1iZGEtYXV0aG9yaXplci5odG1sXG4gICAqL1xuICB8ICh7IHR5cGU6IFwiQ1VTVE9NX0xBTUJEQV9BVVRIT1JJWkVSXCIgfSAmIEN1c3RvbUxhbWJkYUF1dGhvcml6ZXJQcm9wcylcblxuZXhwb3J0IHR5cGUgQ29nbml0b1VzZXJQb29sQXV0aG9yaXplclByb3BzPFxuICBBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4gPSB7XG4gIHVzZXJQb29sOiBJVXNlclBvb2xcblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCBhY2Nlc3MgdG9rZW4gY2xhaW1zIGNvbnRhaW4gdGhlIGdpdmVuIHNjb3BlLlxuICAgKlxuICAgKiBXaGVuIGRlZmluZWQgYXMgcGFydCBvZiBhIHJlc291cmNlIHNlcnZlciwgc2NvcGVzIGFyZSBvbiB0aGUgZm9ybWF0OlxuICAgKiBge3Jlc291cmNlIHNlcnZlciBpZGVudGlmaWVyfS97c2NvcGUgbmFtZX1gLCBlLmcuIGBleHRlcm5hbC92aWV3X3VzZXJzYC5cbiAgICpcbiAgICogVG8gZ2V0IG1vcmUgdHlwZSBzYWZldHkgb24gdGhpcyBwYXJhbWV0ZXIsIHNlZSB0aGUgZG9jcyBmb3IgdGhlIGBBdXRoU2NvcGVzVGAgdHlwZSBwYXJhbWV0ZXIgb25cbiAgICoge0BsaW5rIEFwaUdhdGV3YXl9LlxuICAgKi9cbiAgcmVxdWlyZWRTY29wZT86IEF1dGhTY29wZXNUXG5cbiAgLyoqXG4gICAqIE5hbWUgb2Ygc2VjcmV0IGluIEFXUyBTZWNyZXRzIE1hbmFnZXIgdGhhdCBzdG9yZXMgYmFzaWMgYXV0aCBjcmVkZW50aWFscyBmb3IgdGhlIGJhY2tlbmRcbiAgICogc2VydmljZSwgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZSBiYWNrZW5kIGlmIENvZ25pdG8gdXNlciBwb29sIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRlZC5cbiAgICpcbiAgICogVGhlIHNlY3JldCB2YWx1ZSBtdXN0IGZvbGxvdyB0aGlzIGZvcm1hdDpcbiAgICogYGBganNvblxuICAgKiB7IFwidXNlcm5hbWVcIjogXCI8dXNlcm5hbWU+XCIsIFwicGFzc3dvcmRcIjogXCI8cGFzc3dvcmQ+XCIgfVxuICAgKiBgYGBcbiAgICpcbiAgICogVGhpcyBwcm9wIHNvbHZlcyB0aGUgZm9sbG93aW5nIHVzZS1jYXNlOlxuICAgKiAtIFlvdSB3YW50IHRvIGRvIENvZ25pdG8gdXNlciBwb29sIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBBUEkgR2F0ZXdheVxuICAgKiAtIFlvdSB3YW50IGFuIGFkZGl0aW9uYWwgYXV0aCBjaGVjayBpbiB0aGUgYmFja2VuZCwgYnV0IHlvdSBkb24ndCB3YW50IHRvIGRlYWwgd2l0aCBDb2duaXRvXG4gICAqICAgdGhlcmVcbiAgICogLSBUaGUgYmFja2VuZCB1c2VzIGJhc2ljIGF1dGhcbiAgICpcbiAgICogVGhpcyBwcm9wIHNvbHZlcyB0aGlzIGJ5IGxldHRpbmcgeW91IHNwZWNpZnkgY3JlZGVudGlhbHMgdG8gcGFzcyB0byB0aGUgYmFja2VuZCBhZnRlciBBUEktR1dcbiAgICogYXV0aGVudGljYXRpb24gc3VjY2VlZHMuIFlvdSBjYW4gcGFzcyB0aGUgZW5jb2RlZCBjcmVkZW50aWFscyB0aHJvdWdoXG4gICAqIHtAbGluayBBbGJJbnRlZ3JhdGlvblByb3BzLm1hcFBhcmFtZXRlcnN9LCB1c2luZyB0aGUgYGF1dGhvcml6ZXIuaW50ZXJuYWxBdXRob3JpemF0aW9uSGVhZGVyYFxuICAgKiBjb250ZXh0IHZhcmlhYmxlLCBsaWtlIHNvOlxuICAgKiBgYGBcbiAgICogbWFwUGFyYW1ldGVyczogKHBhcmFtZXRlcnMpID0+IHBhcmFtZXRlcnMub3ZlcndyaXRlSGVhZGVyKFxuICAgKiAgIC8vICdBdXRob3JpemF0aW9uJyBoZWFkZXIgY2Fubm90IGJlIG92ZXJyaWRkZW4sIHNvIHdlIHVzZSBhIGN1c3RvbSBoZWFkZXJcbiAgICogICBcIlgtSW50ZXJuYWwtQXV0aG9yaXphdGlvblwiLFxuICAgKiAgIGFwaWd3Lk1hcHBpbmdWYWx1ZS5jb250ZXh0VmFyaWFibGUoXCJhdXRob3JpemVyLmludGVybmFsQXV0aG9yaXphdGlvbkhlYWRlclwiKSxcbiAgICogKVxuICAgKiBgYGBcbiAgICogVGhlIGJhY2tlbmQgY2FuIHRoZW4gY2hlY2sgdGhlIGBYLUludGVybmFsLUF1dGhvcml6YXRpb25gIGhlYWRlci5cbiAgICovXG4gIGNyZWRlbnRpYWxzRm9ySW50ZXJuYWxBdXRob3JpemF0aW9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wcyA9IHtcbiAgLyoqXG4gICAqIE5hbWUgb2Ygc2VjcmV0IGluIEFXUyBTZWNyZXRzIE1hbmFnZXIgdGhhdCBzdG9yZXMgYmFzaWMgYXV0aCBjcmVkZW50aWFscy5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQgZm9yIHRoZSBzZWNyZXQgdmFsdWU6XG4gICAqIC0gU2luZ2xlIHVzZXJuYW1lIGFuZCBwYXNzd29yZDpcbiAgICogICBgYGBqc29uXG4gICAqICAgeyBcInVzZXJuYW1lXCI6IFwiPHVzZXJuYW1lPlwiLCBcInBhc3N3b3JkXCI6IFwiPHBhc3N3b3JkPlwiIH1cbiAgICogICBgYGBcbiAgICogLSBBcnJheSBvZiB1c2VybmFtZSArIHBhc3N3b3JkIG9iamVjdHM6XG4gICAqICAgYGBganNvblxuICAgKiAgIHsgXCJjcmVkZW50aWFsc1wiOiBcIlt7XFxcInVzZXJuYW1lXFxcIjpcXFwiPHVzZXItMT5cXFwiLFxcXCJwYXNzd29yZFxcXCI6XFxcInBhc3N3b3JkLTFcXFwifSx7XFxcInVzZXJuYW1lXFxcIjpcXFwiPHVzZXItMj5cXFwiLFxcXCJwYXNzd29yZFxcXCI6XFxcIjxwYXNzd29yZC0yPlxcXCJ9XVwiIH1cbiAgICogICBgYGBcbiAgICogICAtIFRoZSB2YWx1ZSBvZiB0aGUgYGNyZWRlbnRpYWxzYCBmaWVsZCBpcyBhIHN0cmluZywgd2l0aCBhIHN0cmluZ2lmaWVkLCBlc2NhcGVkIEpTT04gYXJyYXkgb2ZcbiAgICogICAgIG9iamVjdHMgd2l0aCBgdXNlcm5hbWVgIGFuZCBgcGFzc3dvcmRgIGZpZWxkcy5cbiAgICogICAtIFRoZSByZWFzb24gdGhhdCB0aGlzIHNlY29uZCBmb3JtYXQgc3RvcmVzIHN0cmluZ2lmaWVkIEpTT04gX2luc2lkZV8gSlNPTiwgaXMgZHVlIHRvIGFcbiAgICogICAgIGxpbWl0YXRpb24gaW4gTGlmbGlnJ3MgYGxvYWQtc2VjcmV0c2AgbGlicmFyeSwgd2hpY2ggb25seSBhbGxvd3Mgc3RvcmluZyBzdHJpbmcgdmFsdWVzLlxuICAgKiAtIEFycmF5IG9mIGJhc2U2NC1lbmNvZGVkIGNyZWRlbnRpYWxzOlxuICAgKiAgIGBgYGpzb25cbiAgICogICB7IFwiY3JlZGVudGlhbHNcIjogXCJbXFxcIjxlbmNvZGVkLWNyZWRlbnRpYWwtMT5cXFwiLFxcXCI8ZW5jb2RlZC1jcmVkZW50aWFsLTI+XFxcIl1cIiB9XG4gICAqICAgYGBgXG4gICAqICAgLSBFYWNoIGVsZW1lbnQgaXMgZW5jb2RlZCBmcm9tIGA8dXNlcm5hbWU+OjxwYXNzd29yZD5gLlxuICAgKiAgIC0gVGhlIGFycmF5IGlzIHN0cmluZ2lmaWVkIGZvciB0aGUgc2FtZSByZWFzb24gYXMgYWJvdmUuXG4gICAqXG4gICAqIElmIHRoZSBzZWNyZXQgdXNlcyBvbmUgb2YgdGhlIGFycmF5IGZvcm1hdHMsIHRoZSBhdXRob3JpemVyIHdpbGwgbWF0Y2ggdGhlIHJlcXVlc3Qnc1xuICAgKiBBdXRob3JpemF0aW9uIGhlYWRlciBhZ2FpbnN0IGFueSBvbmUgb2YgdGhlIGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgY3JlZGVudGlhbHNTZWNyZXROYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgQ29nbml0b1VzZXJQb29sT3JCYXNpY0F1dGhBdXRob3JpemVyUHJvcHM8XG4gIEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiA9IHtcbiAgdXNlclBvb2w6IElVc2VyUG9vbFxuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHNlY3JldCBpbiBBV1MgU2VjcmV0cyBNYW5hZ2VyIHRoYXQgc3RvcmVzIGJhc2ljIGF1dGggY3JlZGVudGlhbHMuXG4gICAqXG4gICAqIFNlZSB7QGxpbmsgQmFzaWNBdXRoQXV0aG9yaXplclByb3BzLmNyZWRlbnRpYWxzU2VjcmV0TmFtZX0gZm9yIHRoZSBzdXBwb3J0ZWQgZm9ybWF0cy5cbiAgICovXG4gIGJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZT86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IGFjY2VzcyB0b2tlbiBjbGFpbXMgY29udGFpbiB0aGUgZ2l2ZW4gc2NvcGUuIE9ubHkgYXBwbGljYWJsZSBmb3IgcmVxdWVzdHMgdGhhdFxuICAgKiB1c2UgYEF1dGhvcml6YXRpb246IEJlYXJlciA8YWNjZXNzIHRva2VuPmAgKG5vdCBhcHBsaWNhYmxlIGZvciBiYXNpYyBhdXRoKS5cbiAgICpcbiAgICogV2hlbiBkZWZpbmVkIGFzIHBhcnQgb2YgYSByZXNvdXJjZSBzZXJ2ZXIsIHNjb3BlcyBhcmUgb24gdGhlIGZvcm1hdDpcbiAgICogYHtyZXNvdXJjZSBzZXJ2ZXIgaWRlbnRpZmllcn0ve3Njb3BlIG5hbWV9YCwgZS5nLiBgZXh0ZXJuYWwvdmlld191c2Vyc2AuXG4gICAqXG4gICAqIFRvIGdldCBtb3JlIHR5cGUgc2FmZXR5IG9uIHRoaXMgcGFyYW1ldGVyLCBzZWUgdGhlIGRvY3MgZm9yIHRoZSBgQXV0aFNjb3Blc1RgIHR5cGUgcGFyYW1ldGVyIG9uXG4gICAqIHtAbGluayBBcGlHYXRld2F5fS5cbiAgICovXG4gIHJlcXVpcmVkU2NvcGU/OiBBdXRoU2NvcGVzVFxufVxuXG50eXBlIEN1c3RvbUxhbWJkYUF1dGhvcml6ZXJQcm9wcyA9IHtcbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHJ1biB3aGVuZXZlciB0aGUgQVBJIEdhdGV3YXkgcm91dGUgaXMgaW52b2tlZCwgdG8gYXV0aGVudGljYXRlXG4gICAqIHRoZSByZXF1ZXN0LiBTZWUgQVdTIGRvY3MgZm9yIG1vcmUgb24gaG93IHRvIHdyaXRlIHRoZSBMYW1iZGE6XG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1sYW1iZGEtYXV0aG9yaXplci5odG1sXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IHJlc3BvbnNlIGZvcm1hdCB1c2VkIGlzIGBIdHRwTGFtYmRhUmVzcG9uc2VUeXBlLlNJTVBMRWAgKGZvcm1hdCAyLjApLiBJZiB5b3Ugd3JpdGVcbiAgICogeW91ciBMYW1iZGEgaW4gVHlwZVNjcmlwdCwgdGhpcyBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBtdXN0IHJldHVyblxuICAgKiBgQVBJR2F0ZXdheVNpbXBsZUF1dGhvcml6ZXJSZXN1bHRgIChmcm9tIHRoZSBgYXdzLWxhbWJkYWAgcGFja2FnZSkuIFRoZSByZXF1ZXN0IGV2ZW50IHdpbGwgYWxzb1xuICAgKiB1c2UgZm9ybWF0IDIuMCAoYEFQSUdhdGV3YXlSZXF1ZXN0QXV0aG9yaXplckV2ZW50VjJgIGluIFR5cGVTY3JpcHQpLiBTZWUgdGhlIEFXUyBkb2NzIGxpbmtlZFxuICAgKiBhYm92ZSBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZXNlIGZvcm1hdHMuXG4gICAqXG4gICAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIHJlc3BvbnNlIGZvcm1hdCB0eXBlIGluXG4gICAqIHtAbGluayBDdXN0b21MYW1iZGFBdXRob3JpemVyUHJvcHMuYXV0aG9yaXplclByb3BzfS5cbiAgICpcbiAgICogU2VlIHRoZSBMYW1iZGFzIHVuZGVyIHRoZSBgYXV0aG9yaXplcnNgIGZvbGRlciBuZXh0IHRvIHRoZSBgQXBpR2F0ZXdheWAgY29uc3RydWN0IGluXG4gICAqIGBsaWZsaWctY2RrYCBmb3IgZXhhbXBsZXMuXG4gICAqL1xuICBsYW1iZGFBdXRob3JpemVyOiBsYW1iZGEuSUZ1bmN0aW9uXG5cbiAgLyoqXG4gICAqIFByb3BzIGZvciB0aGUgYEh0dHBMYW1iZGFBdXRob3JpemVyYCBjb25zdHJ1Y3QuIFdlIHByb3ZpZGUgc29tZSBkaWZmZXJlbnQgZGVmYXVsdHM6XG4gICAqIC0gYHJlc3BvbnNlVHlwZXNgIGRlZmF1bHRzIHRvIGBbSHR0cExhbWJkYVJlc3BvbnNlVHlwZS5TSU1QTEVdYFxuICAgKiAtIGByZXN1bHRzQ2FjaGVUdGxgIGRlZmF1bHRzIHRvIGBEdXJhdGlvbi5ob3VycygxKWBcbiAgICovXG4gIGF1dGhvcml6ZXJQcm9wcz86IFBhcnRpYWw8YXV0aG9yaXplcnMuSHR0cExhbWJkYUF1dGhvcml6ZXJQcm9wcz5cbn1cblxuZXhwb3J0IHR5cGUgQXBpR2F0ZXdheUFjY2Vzc0xvZ3NQcm9wcyA9IHtcbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgYWNjZXNzIGxvZ3MgaWYgdGhpcyBjb25zdHJ1Y3QgaXMgZGVsZXRlZD9cbiAgICpcbiAgICogTWF5YmUgeW91IHdhbnQgdG8gREVTVFJPWSBpbnN0ZWFkLiBPciBmb3IgbGVnYWwgcmVhc29ucywgcmV0YWluIGZvciBhdWRpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgUmVtb3ZhbFBvbGljeS5SRVRBSU5cbiAgICovXG4gIHJlbW92YWxQb2xpY3k/OiBjZGsuUmVtb3ZhbFBvbGljeVxuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0byBrZWVwIHRoZSBsb2dzLiBJZiB1bmRlZmluZWQsIHVzZXMgdGhlIHNhbWUgZGVmYXVsdCBhcyBuZXcgQVdTIGxvZyBncm91cHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJldGVudGlvbkRheXMuVFdPX1lFQVJTXG4gICAqL1xuICByZXRlbnRpb24/OiBsb2dzLlJldGVudGlvbkRheXNcblxuICAvKipcbiAgICogQSBjdXN0b20gSlNPTiBsb2cgZm9ybWF0LCB3aGljaCB1c2VzIHZhcmlhYmxlcyBmcm9tIGBcIiRjb250ZXh0XCJgLlxuICAgKlxuICAgKiBTZWUgW0FXUzogQ2xvdWRXYXRjaCBsb2cgZm9ybWF0cyBmb3IgQVBJIEdhdGV3YXldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZXQtdXAtbG9nZ2luZy5odG1sI2FwaWdhdGV3YXktY2xvdWR3YXRjaC1sb2ctZm9ybWF0cylcbiAgICogZm9yIGZvcm1hdHMgYW5kIHJ1bGVzLiBJdCBpcyBwb3NzaWJsZSB0byB1c2Ugb3RoZXIgZm9ybWF0cyBsaWtlIENMRiBhbmQgWE1MLCBidXQgdGhpcyBjb25zdHJ1Y3RcbiAgICogb25seSBzdXBwb3J0cyBKU09OIGZvciBub3cuXG4gICAqXG4gICAqIEZvciBhIGxpc3Qgb2YgYWxsIHBvc3NpYmxlIHZhcmlhYmxlcyB0byBsb2csIHNlZVxuICAgKiBbQVdTOiAkY29udGV4dCBWYXJpYWJsZXMgZm9yIGRhdGEgbW9kZWxzLCBhdXRob3JpemVycywgbWFwcGluZyB0ZW1wbGF0ZXMsIGFuZCBDbG91ZFdhdGNoIGFjY2VzcyBsb2dnaW5nXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvYXBpLWdhdGV3YXktbWFwcGluZy10ZW1wbGF0ZS1yZWZlcmVuY2UuaHRtbCNjb250ZXh0LXZhcmlhYmxlLXJlZmVyZW5jZSlcbiAgICogYW5kXG4gICAqIFtBV1M6ICRjb250ZXh0IFZhcmlhYmxlcyBmb3IgYWNjZXNzIGxvZ2dpbmcgb25seV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2FwaS1nYXRld2F5LW1hcHBpbmctdGVtcGxhdGUtcmVmZXJlbmNlLmh0bWwjY29udGV4dC12YXJpYWJsZS1yZWZlcmVuY2UtYWNjZXNzLWxvZ2dpbmctb25seSkgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgZGVmYXVsdEFjY2Vzc0xvZ0Zvcm1hdH1cbiAgICovXG4gIGFjY2Vzc0xvZ0Zvcm1hdD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbn1cblxuLyoqXG4gKiBUaGlzIGNvbnN0cnVjdCB0cmllcyB0byBzaW1wbGlmeSB0aGUgY3JlYXRpb24gb2YgYW4gQVBJIEdhdGV3YXkgZm9yIGEgc2VydmljZSwgYnkgY29sbGVjdGluZyBtb3N0XG4gKiBvZiB0aGUgY29tbW9uIHNldHVwIGhlcmUuXG4gKlxuICogVGhlIGFwcHJvYWNoIGZvbGxvd2VkIGluIHRoaXMgY29uc3RydWN0IGlzOlxuICogMS4gT25lIEFQSS1HVyBwZXIgc2VydmljZVxuICogMi4gT25lIHN1YmRvbWFpbiBwZXIgQVBJLUdXIC8gc2VydmljZVxuICogMy4gVXNlIEhUVFAgQVBJLCBub3QgUkVTVFxuICogNC4gVXNlIGEgJGRlZmF1bHQgc3RhZ2Ugd2l0aCBhdXRvZGVwbG95XG4gKiA1LiBTdXBwb3J0IG11bHRpcGxlIHJvdXRlcyAod2l0aCBwb3NzaWJsZSBgL3twcm94eSt9YCB0byBsZXQgYWxsIHN1Yi1wYXRocyB0aHJvdWdoKVxuICogNi4gQWxsb3cgY3VzdG9tIGludGVncmF0aW9uL2F1dGhvcml6ZXIgZm9yIGVhY2ggcm91dGUsIG9yIGRlZmF1bHRzIGZvciB0aGUgd2hvbGUgZ2F0ZXdheVxuICpcbiAqIFRoZSByb3V0ZSBpbnRlZ3JhdGlvbiBpcyBvbmUgb2YgdGhlc2U6XG4gKiAtIEFMQiBwcml2YXRlIGludGVncmF0aW9uIHdpdGggVlBDIExpbmsgdXNpbmcgSFRUUFMgdG8gdGhlIEFMQlxuICogLSBMYW1iZGEgaW50ZWdyYXRpb25cbiAqIC0gU1FTIGludGVncmF0aW9uXG4gKlxuICogIyMjIExvYWQgQmFsYW5jZXIgU2VjdXJpdHkgR3JvdXBcbiAqXG4gKiBOb3RlIHRoYXQgdGhlIGxvYWQgYmFsYW5jZXIgdXNlZCBpbiBhbiB7QGxpbmsgQWxiSW50ZWdyYXRpb25Qcm9wc30gbXVzdCBhbGxvdyBvdXRib3VuZCBIVFRQU1xuICogdHJhZmZpYyB0byBpdHMgU2VjdXJpdHlHcm91cC4gT3RoZXJ3aXNlLCB0aGUgVlBDIExpbmsgdXNlZCBieSB0aGUgQVBJLUdXIGNhbid0IGdldCB0cmFmZmljIGZyb21cbiAqIHRoZSBBTEIuXG4gKlxuICogYGBgXG4gKiBjb25zdCBsb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwID0gbmV3IGVjMi5TZWN1cml0eUdyb3VwKC4uLiwge1xuICogICBhbGxvd0FsbE91dGJvdW5kOiBmYWxzZSxcbiAqIH0pXG4gKlxuICogbG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cC5hZGRFZ3Jlc3NSdWxlKFxuICogICBsb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLFxuICogICBlYzIuUG9ydC50Y3AoNDQzKSxcbiAqICAgXCJPdXRib3VuZCB0byBzZWxmIGZvciBBTEIgdG8gQVBJLUdXIFZQQy1MaW5rXCIsXG4gKiApXG4gKlxuICogY29uc3QgbG9hZEJhbGFuY2VyID0gbmV3IGxpZmxpZ0xvYWRCYWxhbmNlci5Mb2FkQmFsYW5jZXIoLi4uLFxuICogICB7XG4gKiAgICAgb3ZlcnJpZGVMb2FkQmFsYW5jZXJQcm9wczoge1xuICogICAgICAgc2VjdXJpdHlHcm91cDogbG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cCxcbiAqICAgICB9LFxuICogICB9LFxuICogKVxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIEF1dGhTY29wZXNUIFRoaXMgdHlwZSBwYXJhbWV0ZXIgYWxsb3dzIHlvdSB0byBpbXByb3ZlIHR5cGUgc2FmZXR5IG9uIHRoZVxuICogYHJlcXVpcmVkU2NvcGVgIGZpZWxkIG9uIHtAbGluayBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wc30sIGJ5IG5hcnJvd2luZyB0aGUgdHlwZVxuICogdG8gc3BlY2lmaWMgc3RyaW5ncy4gWW91IGNhbiB0aGVuIGV4dGVuZCB0aGUgYEFwaUdhdGV3YXlgIHdpdGggdGhpcyB0eXBlIHRvIGVuZm9yY2UgdGhvc2Ugc2NvcGVzXG4gKiBhY3Jvc3MgdGhlIGFwcGxpY2F0aW9uLiBSZW1lbWJlciB0aGF0IGF1dGggc2NvcGVzIG11c3QgYmUgb24gdGhlIGZvcm1hdFxuICogYHtyZXNvdXJjZSBzZXJ2ZXIgaWRlbnRpZmllcn0ve3Njb3BlIG5hbWV9YC5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgXG4gKiB0eXBlIEF1dGhTY29wZXMgPSBcImV4dGVybmFsL3JlYWRfdXNlcnNcIiB8IFwiaW50ZXJuYWwvY3JlYXRlX3VzZXJzXCJcbiAqXG4gKiBleHBvcnQgY2xhc3MgTXlQcm9qZWN0QXBpR2F0ZXdheSBleHRlbmRzIEFwaUdhdGV3YXk8QXV0aFNjb3Blcz4ge31cbiAqIGBgYFxuICogVHlwZVNjcmlwdCB3aWxsIHRoZW4gZW5mb3JjZSB0aGF0IGByZXF1aXJlZFNjb3BlYCBpcyBvbmUgb2YgYEF1dGhTY29wZXNgLCBhbmQgcHJvdmlkZVxuICogYXV0by1jb21wbGV0ZS5cbiAqXG4gKiBAYXV0aG9yIEtyaXN0aWFuIFJla3N0YWQgPGtyZUBjYXByYWNvbnN1bHRpbmcubm8+XG4gKiBAYXV0aG9yIEhlcm1hbm4gTcO4cmtyaWQgPGhlbUBsaWZsaWcubm8+XG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlHYXRld2F5PFxuICBBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4gZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIC8qKiBUaGUgQVBJIEdhdGV3YXkgSFRUUCBBUEkuIFRoaXMgaXMgdGhlIG1haW4gY29uc3RydWN0IGZvciBBUEktR1cuICovXG4gIHB1YmxpYyByZWFkb25seSBodHRwQXBpOiBhcGlndy5IdHRwQXBpXG5cbiAgLyoqIFRoZSByb3V0ZXMgd2hpY2ggY29ubmVjdCB0aGUge0BsaW5rIGh0dHBBcGl9IHRvIHRoZSBiYWNrZW5kIGludGVncmF0aW9uKHMpLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm91dGVzOiBhcGlndy5IdHRwUm91dGVbXSA9IFtdXG5cbiAgLyoqIFRoZSBkb21haW4gd2hpY2ggY29uc3VtZXJzIG11c3QgdXNlLiovXG4gIHB1YmxpYyByZWFkb25seSBkb21haW46IHN0cmluZ1xuXG4gIC8qKiBBY2Nlc3MgbG9nIGdyb3VwLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nR3JvdXA6IGxvZ3MuTG9nR3JvdXBcblxuICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBBcGlHYXRld2F5UHJvcHM8QXV0aFNjb3Blc1Q+XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEFwaUdhdGV3YXlQcm9wczxBdXRoU2NvcGVzVD4sXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcblxuICAgIEFwaUdhdGV3YXkudmFsaWRhdGVQcm9wcyhwcm9wcywgaWQsIGNkay5TdGFjay5vZih0aGlzKSlcblxuICAgIGNvbnN0IGN1c3RvbURvbWFpbiA9IG5ldyBDdXN0b21Eb21haW4odGhpcywgXCJDdXN0b21Eb21haW5cIiwgcHJvcHMuZG5zKVxuICAgIHRoaXMuZG9tYWluID0gY3VzdG9tRG9tYWluLmN1c3RvbURvbWFpbk5hbWVcblxuICAgIGxldCBjb3JzT3B0aW9uczogYXBpZ3cuQ29yc1ByZWZsaWdodE9wdGlvbnMgfCB1bmRlZmluZWRcbiAgICBpZiAocHJvcHMuY29yc0FsbG93QWxsKSB7XG4gICAgICBjb3JzT3B0aW9ucyA9IHtcbiAgICAgICAgYWxsb3dPcmlnaW5zOiBbXCIqXCJdLFxuICAgICAgICAvLyBcIlRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBjYW4ndCBiZSB3aWxkY2FyZGVkIGFuZCBhbHdheXMgbmVlZHMgdG8gYmUgbGlzdGVkIGV4cGxpY2l0bHlcIlxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0hlYWRlcnMvQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVyc1xuICAgICAgICAvLyBDb250ZW50LVR5cGUgbWF5IGFsc28gcmVxdWlyZSBleHBsaWNpdCB3aGl0ZWxpc3Rpbmc6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS82MzU2NzY0N1xuICAgICAgICBhbGxvd0hlYWRlcnM6IFtcIkF1dGhvcml6YXRpb25cIiwgXCJDb250ZW50LVR5cGVcIiwgXCIqXCJdLFxuICAgICAgICAvLyBOb3QgdXNpbmcgJyonIGhlcmUsIGJlY2F1c2UgXCJJbiByZXF1ZXN0cyB3aXRoIGNyZWRlbnRpYWxzLCBpdCBpcyB0cmVhdGVkIGFzIHRoZSBsaXRlcmFsXG4gICAgICAgIC8vIG1ldGhvZCBuYW1lICcqJyB3aXRob3V0IHNwZWNpYWwgc2VtYW50aWNzXCJcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9IZWFkZXJzL0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHNcbiAgICAgICAgYWxsb3dNZXRob2RzOiBbXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuR0VULFxuICAgICAgICAgIGFwaWd3LkNvcnNIdHRwTWV0aG9kLlBPU1QsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuUFVULFxuICAgICAgICAgIGFwaWd3LkNvcnNIdHRwTWV0aG9kLlBBVENILFxuICAgICAgICAgIGFwaWd3LkNvcnNIdHRwTWV0aG9kLkRFTEVURSxcbiAgICAgICAgICBhcGlndy5Db3JzSHR0cE1ldGhvZC5PUFRJT05TLFxuICAgICAgICAgIGFwaWd3LkNvcnNIdHRwTWV0aG9kLkhFQUQsXG4gICAgICAgIF0sXG4gICAgICAgIG1heEFnZTogY2RrLkR1cmF0aW9uLmRheXMoMSksXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIGFjdHVhbCBBUEkuIFRoaXMgaG9sZHMgdGhlIHJvdXRlcywgYXV0aG9yaXplcnMgYW5kIGludGVncmF0aW9ucy5cbiAgICBjb25zdCBhcGkgPSBuZXcgYXBpZ3cuSHR0cEFwaSh0aGlzLCBcIkh0dHBBcGktXCIgKyBwcm9wcy5kbnMuc3ViZG9tYWluLCB7XG4gICAgICAvLyBkZWZhdWx0SW50ZWdyYXRpb246IGRlZmF1bHRJbnRlZ3JhdGlvbiwgLy8gVGhpcyBpcyBmb3IgYSBjYXRjaC1hbGwgJGRlZmF1bHQgcm91dGVcbiAgICAgIGRlc2NyaXB0aW9uOiBgQW4gSFRUUCBBUEkgZm9yICR7cHJvcHMuZG5zLnN1YmRvbWFpbn0uJHtwcm9wcy5kbnMuaG9zdGVkWm9uZS56b25lTmFtZX0uYCxcbiAgICAgIGRpc2FibGVFeGVjdXRlQXBpRW5kcG9pbnQ6IHRydWUsIC8vIEZvcmNlIGV4dGVybmFscyB0byBnbyB0aHJvdWdoIGN1c3RvbSBkb21haW4uIE1VU1QgYmUgdHJ1ZSB3aGVuIHVzaW5nIE11dHVhbCBUTFMsIGZvciBzZWN1cml0eSByZWFzb25zXG4gICAgICBjcmVhdGVEZWZhdWx0U3RhZ2U6IHRydWUsXG4gICAgICBkZWZhdWx0RG9tYWluTWFwcGluZzogeyBkb21haW5OYW1lOiBjdXN0b21Eb21haW4uYXBpR3dDdXN0b21Eb21haW4gfSxcbiAgICAgIGNvcnNQcmVmbGlnaHQ6IGNvcnNPcHRpb25zLFxuICAgICAgLi4ucHJvcHM/LnByb3BzT3ZlcnJpZGU/Lmh0dHBBcGksXG4gICAgfSlcbiAgICB0aGlzLmh0dHBBcGkgPSBhcGlcblxuICAgIGNvbnN0IHN0YWdlID0gYXBpLmRlZmF1bHRTdGFnZT8ubm9kZS5kZWZhdWx0Q2hpbGQgYXMgYXBpZ3cuQ2ZuU3RhZ2VcblxuICAgIGNvbnN0IGxvZ3MgPSBuZXcgQXBpR2F0ZXdheUFjY2Vzc0xvZ3MoXG4gICAgICB0aGlzLFxuICAgICAgXCJBY2Nlc3NMb2dzXCIsXG4gICAgICBzdGFnZSxcbiAgICAgIHByb3BzLmFjY2Vzc0xvZ3MsXG4gICAgICBkZWZhdWx0QWNjZXNzTG9nRm9ybWF0LFxuICAgIClcbiAgICB0aGlzLmxvZ0dyb3VwID0gbG9ncy5sb2dHcm91cFxuXG4gICAgc3RhZ2UuZGVmYXVsdFJvdXRlU2V0dGluZ3MgPSB7XG4gICAgICAuLi5zdGFnZS5kZWZhdWx0Um91dGVTZXR0aW5ncyxcbiAgICAgIGRldGFpbGVkTWV0cmljc0VuYWJsZWQ6IHByb3BzLmRldGFpbGVkTWV0cmljcyA/PyB0cnVlLFxuICAgICAgdGhyb3R0bGluZ0J1cnN0TGltaXQ6IHByb3BzLnRocm90dGxpbmc/LmJ1cnN0LCAvLyBEZWZhdWx0IGZvciBhY2NvdW50IGlzIDVfMDAwXG4gICAgICB0aHJvdHRsaW5nUmF0ZUxpbWl0OiBwcm9wcy50aHJvdHRsaW5nPy5yYXRlLCAvLyBEZWZhdWx0IGZvciBhY2NvdW50IGlzIDEwXzAwMFxuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRJbnRlZ3JhdGlvbiA9IHByb3BzLmRlZmF1bHRJbnRlZ3JhdGlvblxuICAgICAgPyB0aGlzLmNyZWF0ZUludGVncmF0aW9uKHByb3BzLmRlZmF1bHRJbnRlZ3JhdGlvbiwgcHJvcHMuZG5zKVxuICAgICAgOiB1bmRlZmluZWRcblxuICAgIGNvbnN0IGRlZmF1bHRBdXRob3JpemVyID0gcHJvcHMuZGVmYXVsdEF1dGhvcml6YXRpb25cbiAgICAgID8gdGhpcy5jcmVhdGVBdXRob3JpemVyKFwiRGVmYXVsdEF1dGhvcml6ZXJcIiwgcHJvcHMuZGVmYXVsdEF1dGhvcml6YXRpb24pXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgZm9yIChjb25zdCByb3V0ZSBvZiBwcm9wcy5yb3V0ZXMpIHtcbiAgICAgIGxldCBpbnRlZ3JhdGlvbjogYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb25cbiAgICAgIGlmIChyb3V0ZS5pbnRlZ3JhdGlvbikge1xuICAgICAgICBpbnRlZ3JhdGlvbiA9IHRoaXMuY3JlYXRlSW50ZWdyYXRpb24ocm91dGUuaW50ZWdyYXRpb24sIHByb3BzLmRucylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGludGVncmF0aW9uID0gZGVmYXVsdEludGVncmF0aW9uISAvLyBWZXJpZmllZCBpbiB2YWxpZGF0ZVByb3BzXG4gICAgICB9XG5cbiAgICAgIGxldCBhdXRob3JpemVyOiBhcGlndy5JSHR0cFJvdXRlQXV0aG9yaXplciB8IHVuZGVmaW5lZFxuICAgICAgaWYgKHJvdXRlLmF1dGhvcml6YXRpb24pIHtcbiAgICAgICAgYXV0aG9yaXplciA9IHRoaXMuY3JlYXRlQXV0aG9yaXplcihcbiAgICAgICAgICAvLyBVc2luZyB0aGUgcm91dGUgcGF0aCBoZXJlIGNhdXNlZCBDbG91ZEZvcm1hdGlvbiB0byBmYWlsIGR1ZSB0byByZXNvdXJjZSBuYW1lcyBiZWluZyB0b29cbiAgICAgICAgICAvLyBsb25nLiBUaGVyZWZvcmUsIHdlIG5vdyBoYXNoIHRoZSByb3V0ZSBwYXRoIHRvIGdldCBhIHNob3J0ZXIgbmFtZS5cbiAgICAgICAgICBgUm91dGVBdXRob3JpemVyJHtzaG9ydEhhc2goYCR7cm91dGUubWV0aG9kID8/IFwiXCJ9JHtyb3V0ZS5wYXRofWApfWAsXG4gICAgICAgICAgcm91dGUuYXV0aG9yaXphdGlvbixcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXV0aG9yaXplciA9IGRlZmF1bHRBdXRob3JpemVyXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvdXRlUGF0aHMgPSBbcm91dGUucGF0aF1cbiAgICAgIGlmIChyb3V0ZS5pbmNsdWRlU3VicGF0aHMgPT09IHRydWUpIHtcbiAgICAgICAgLy8gSWYgd2UgaW5jbHVkZSBzdWItcGF0aHMsIHdlIGFkZCBhbiBhZGRpdGlvbmFsIHJvdXRlIHdpdGggL3twcm94eSt9ICh0aGUgKyBtZWFucyBpdCB3aWxsXG4gICAgICAgIC8vIG1hdGNoIGFsbCBzdWJyb3V0ZXMpLiBXZSB3YW50IGJvdGggdGhpcyByb3V0ZSBhbmQgdGhlIG5vcm1hbCByb3V0ZSB3aXRob3V0IC97cHJveHkrfSxcbiAgICAgICAgLy8gc2luY2UgL3twcm94eSt9IHdpbGwgb25seSBtYXRjaCB0aGUgYmFzZSBwYXRoIHdpdGggdHJhaWxpbmcgc2xhc2guXG4gICAgICAgIHJvdXRlUGF0aHMucHVzaChcbiAgICAgICAgICByb3V0ZS5wYXRoICsgKHJvdXRlLnBhdGggPT09IFwiL1wiID8gXCJcIiA6IFwiL1wiKSArIFwie3Byb3h5K31cIixcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHJvdXRlUGF0aCBvZiByb3V0ZVBhdGhzKSB7XG4gICAgICAgIC8vIFRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBBUEkgR2F0ZXdheSBjb25zdHJ1Y3QgaGFkIGEgc2luZ2xlIHJvdXRlIHdpdGggdGhlIElEXG4gICAgICAgIC8vICdEZWZhdWx0UHJveHlSb3V0ZScsIGFuZCBhbGwgZ2F0ZXdheXMgd2UgdXNlZCBleHBvc2VkIHRoZSByb3V0ZSAve3Byb3h5K30uIFdoZW4gdHJ5aW5nIHRvXG4gICAgICAgIC8vIGNoYW5nZSB0byB0aGlzIG5ldyB2ZXJzaW9uIG9mIHRoZSBjb25zdHJ1Y3QsIGRlcGxveW1lbnQgZmFpbGVkIGZvciBnYXRld2F5cyBleHBvc2luZ1xuICAgICAgICAvLyAve3Byb3h5K30sIGJlY2F1c2UgXCJhIHJvdXRlIHdpdGggdGhhdCBrZXkgW2kuZS4gcGF0aCArIG1ldGhvZF0gYWxyZWFkeSBleGlzdHNcIi4gV2UgdGhpbmtcbiAgICAgICAgLy8gdGhpcyBtYXkgYmUgYmVjYXVzZSB3ZSB1c2VkIHRoZSBzYW1lIHJvdXRlIHBhdGgsIGJ1dCB3aXRoIGEgbmV3IHJvdXRlIElELCBjYXVzaW5nXG4gICAgICAgIC8vIGNvbmZ1c2lvbiBmb3IgQ2xvdWRGb3JtYXRpb24uIFNvIHdlIGtlZXAgdGhlIG9sZCByb3V0ZSBJRCBoZXJlIGZvciAve3Byb3h5K30uXG4gICAgICAgIGNvbnN0IHJvdXRlSWQgPVxuICAgICAgICAgIHJvdXRlUGF0aCA9PT0gXCIve3Byb3h5K31cIiA/IFwiRGVmYXVsdFByb3h5Um91dGVcIiA6IGBSb3V0ZS0ke3JvdXRlUGF0aH1gXG5cbiAgICAgICAgdGhpcy5yb3V0ZXMucHVzaChcbiAgICAgICAgICBuZXcgYXBpZ3cuSHR0cFJvdXRlKHRoaXMsIHJvdXRlSWQsIHtcbiAgICAgICAgICAgIGh0dHBBcGk6IGFwaSxcbiAgICAgICAgICAgIGludGVncmF0aW9uOiBpbnRlZ3JhdGlvbixcbiAgICAgICAgICAgIGF1dGhvcml6ZXI6IGF1dGhvcml6ZXIsXG4gICAgICAgICAgICByb3V0ZUtleTogYXBpZ3cuSHR0cFJvdXRlS2V5LndpdGgoXG4gICAgICAgICAgICAgIHJvdXRlUGF0aCxcbiAgICAgICAgICAgICAgcm91dGUubWV0aG9kXG4gICAgICAgICAgICAgICAgPyBhcGlndy5IdHRwTWV0aG9kW3JvdXRlLm1ldGhvZF1cbiAgICAgICAgICAgICAgICA6IGFwaWd3Lkh0dHBNZXRob2QuQU5ZLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRhZ1Jlc291cmNlcyh0aGlzLCAoKSA9PiAoeyBzZXJ2aWNlOiBwcm9wcy5kbnMuc3ViZG9tYWluIH0pKVxuICB9XG5cbiAgLyoqIEB0aHJvd3MgRXJyb3IgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgdmFsaWRhdGVQcm9wcyhcbiAgICBwcm9wczogQXBpR2F0ZXdheVByb3BzLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3RhY2s6IGNkay5TdGFjayxcbiAgKSB7XG4gICAgZm9yIChjb25zdCByb3V0ZSBvZiBwcm9wcy5yb3V0ZXMpIHtcbiAgICAgIGlmICghcm91dGUuaW50ZWdyYXRpb24gJiYgIXByb3BzLmRlZmF1bHRJbnRlZ3JhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE5vIGludGVncmF0aW9uIGRlZmluZWQgZm9yIHJvdXRlICcke3JvdXRlLnBhdGh9JywgYW5kIG5vIGRlZmF1bHQgaW50ZWdyYXRpb24gc3BlY2lmaWVkIGZvciB0aGUgZ2F0ZXdheWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmICghcm91dGUuYXV0aG9yaXphdGlvbiAmJiAhcHJvcHMuZGVmYXVsdEF1dGhvcml6YXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBObyBhdXRob3JpemF0aW9uIGRlZmluZWQgZm9yIHJvdXRlICcke3JvdXRlLnBhdGh9JywgYW5kIG5vIGRlZmF1bHQgYXV0aG9yaXphdGlvbiBzcGVjaWZpZWQgZm9yIHRoZSBnYXRld2F5YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKCFyb3V0ZS5wYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBwYXRoICcke3JvdXRlLnBhdGh9JzogcGF0aHMgbXVzdCBiZWdpbiB3aXRoICcvJyAodXNlICcvJyBmb3Igcm9vdCBwYXRoKWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmIChyb3V0ZS5wYXRoICE9PSBcIi9cIiAmJiByb3V0ZS5wYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgcGF0aCAnJHtyb3V0ZS5wYXRofSc6IHBhdGhzIGNhbm5vdCBlbmQgd2l0aCAnLycgKGV4Y2VwdCByb290IHBhdGgpYCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICByb3V0ZS5pbnRlZ3JhdGlvbj8udHlwZSA9PT0gXCJBTEJcIiAmJlxuICAgICAgICByb3V0ZS5pbnRlZ3JhdGlvbi5ob3N0TmFtZS5zdGFydHNXaXRoKFwiaHR0cHM6XCIpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgYWxiSW50ZWdyYXRpb24uaG9zdEh0dHBzTmFtZSBzaG91bGQgbm90IGluY2x1ZGUgYSBwcm90b2NvbDogJHtyb3V0ZS5pbnRlZ3JhdGlvbi5ob3N0TmFtZX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcm9wcy5kbnMuc3ViZG9tYWluID09PSBcIlwiIHx8IHByb3BzLmRucy5zdWJkb21haW4uaW5jbHVkZXMoXCIgXCIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTdWJkb21haW4gbXVzdCBiZSBzZXQsIGFuZCBub3QgY29udGFpbiBzcGFjZXM6ICR7cHJvcHMuZG5zLnN1YmRvbWFpbn1gLFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAocHJvcHMudGhyb3R0bGluZz8uYnVyc3QgJiYgcHJvcHMudGhyb3R0bGluZy5idXJzdCA+IDVfMDAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGDimqDvuI8gWW91ciB0aHJvdHRsaW5nIGJ1cnN0IGxpbWl0ICcke3Byb3BzLnRocm90dGxpbmcuYnVyc3R9JyBpcyBoaWdoZXIgdGhhbiB0aGUgQVdTIEFjY291bnQgbGltaXQuIE1ha2Ugc3VyZSB5b3VyIGFjY291bnQgaGFzIHVwZ3JhZGVkIHRoaXMgcXVvdGEhIGAsXG4gICAgICAgIHN0YWNrLFxuICAgICAgICBpZCxcbiAgICAgIClcbiAgICB9XG4gICAgaWYgKHByb3BzLnRocm90dGxpbmc/LnJhdGUgJiYgcHJvcHMudGhyb3R0bGluZy5yYXRlID4gMTBfMDAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGDimqDvuI8gWW91ciB0aHJvdHRsaW5nIHJhdGUgbGltaXQgJyR7cHJvcHMudGhyb3R0bGluZy5yYXRlfScgaXMgaGlnaGVyIHRoYW4gdGhlIEFXUyBBY2NvdW50IGxpbWl0LiBNYWtlIHN1cmUgeW91ciBhY2NvdW50IGhhcyB1cGdyYWRlZCB0aGlzIHF1b3RhISBgLFxuICAgICAgICBzdGFjayxcbiAgICAgICAgaWQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhdXRob3JpemVyIG9ubHkgYWNjZXB0cyByZXF1ZXN0cyBmcm9tIGV4dGVybmFsIHVzZXJzIHRoYXQgYXJlIGF1dGhvcml6ZWQuXG4gICAqIFVuYXV0aG9yaXplZCB1c2VycyBhcmUgc3RvcHBlZCBpbiB0aGUgQVBJLUdXLCBhbmQgbm90IGZvcndhcmRlZCB0byB0aGUgaW50ZWdyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUF1dGhvcml6ZXI8QXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYXV0aG9yaXphdGlvbjogQXV0aG9yaXphdGlvblByb3BzPEF1dGhTY29wZXNUPixcbiAgKTogYXBpZ3cuSUh0dHBSb3V0ZUF1dGhvcml6ZXIgfCB1bmRlZmluZWQge1xuICAgIHN3aXRjaCAoYXV0aG9yaXphdGlvbi50eXBlKSB7XG4gICAgICBjYXNlIFwiTk9ORVwiOiB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJJQU1cIjoge1xuICAgICAgICAvLyBBUEkgR2F0ZXdheSBpbnZva2VzIHlvdXIgQVBJIHJvdXRlIG9ubHkgaWYgdGhlIGNsaWVudCBoYXMgZXhlY3V0ZS1hcGkgcGVybWlzc2lvbiBmb3IgdGhlIHJvdXRlLlxuICAgICAgICAvLyBUaGUgY2xpZW50IGhhcyB0byB1c2UgQVdTIFNpZ1Y0IHRvIGlkZW50aWZ5IHRoZW1zZWx2ZXMgaW4gdGhlIHJlcXVlc3QuXG4gICAgICAgIC8vIFJlYWQgdGhpcyBwYWdlIGZvciBoZWxwIHdpdGggSUFNIGFuZCBBUEktR1cgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NlY3VyaXR5X2lhbV9zZXJ2aWNlLXdpdGgtaWFtLmh0bWxcbiAgICAgICAgLy8gTm90ZSB0aGF0IFtyZXNvdXJjZSBwb2xpY2llcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQgZm9yIEhUVFBdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1hY2Nlc3MtY29udHJvbC1pYW0uaHRtbClcbiAgICAgICAgcmV0dXJuIG5ldyBhdXRob3JpemVycy5IdHRwSWFtQXV0aG9yaXplcigpXG4gICAgICB9XG4gICAgICBjYXNlIFwiQ09HTklUT19VU0VSX1BPT0xcIjoge1xuICAgICAgICAvLyBXZSB1c2UgYSBjdXN0b20gbGFtYmRhIGF1dGhvcml6ZXIgaGVyZSBpbnN0ZWFkIG9mIHRoZSBgSHR0cFVzZXJQb29sQXV0aG9yaXplcmAgcHJvdmlkZWRcbiAgICAgICAgLy8gYnkgQ0RLLCBpbiBvcmRlciB0byBzdXBwb3J0IGByZXF1aXJlZFNjb3BlYCBhbmQgc2V0dGluZyBvZiBjdXN0b20gY29udGV4dCB2YXJpYWJsZXMuXG4gICAgICAgIGNvbnN0IGF1dGhvcml6ZXIgPSBuZXcgQ29nbml0b1VzZXJQb29sQXV0aG9yaXplcihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGlkICsgXCJMYW1iZGFcIixcbiAgICAgICAgICBhdXRob3JpemF0aW9uLFxuICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIG5ldyBhdXRob3JpemVycy5IdHRwTGFtYmRhQXV0aG9yaXplcihpZCwgYXV0aG9yaXplci5sYW1iZGEsIHtcbiAgICAgICAgICByZXNwb25zZVR5cGVzOiBhdXRob3JpemVyLnJlc3BvbnNlVHlwZXMsXG4gICAgICAgICAgLy8gTWF4IDFoLCBvciBkaXNhYmxlZCAoMHMpLiBUaGUgdmFsdWUgb25seSBtYXR0ZXJzIHdoZW4gaW52YWxpZGF0aW5nL2R5bmFtaWMgY3JlZGVudGlhbHNcbiAgICAgICAgICByZXN1bHRzQ2FjaGVUdGw6IGNkay5EdXJhdGlvbi5ob3VycygxKSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJCQVNJQ19BVVRIXCI6IHtcbiAgICAgICAgY29uc3QgYXV0aG9yaXplciA9IG5ldyBCYXNpY0F1dGhBdXRob3JpemVyKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgaWQgKyBcIkxhbWJkYVwiLFxuICAgICAgICAgIGF1dGhvcml6YXRpb24sXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gbmV3IGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFBdXRob3JpemVyKGlkLCBhdXRob3JpemVyLmxhbWJkYSwge1xuICAgICAgICAgIHJlc3BvbnNlVHlwZXM6IGF1dGhvcml6ZXIucmVzcG9uc2VUeXBlcyxcbiAgICAgICAgICAvLyBNYXggMWgsIG9yIGRpc2FibGVkICgwcykuIFRoZSB2YWx1ZSBvbmx5IG1hdHRlcnMgd2hlbiBpbnZhbGlkYXRpbmcvZHluYW1pYyBjcmVkZW50aWFsc1xuICAgICAgICAgIHJlc3VsdHNDYWNoZVR0bDogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMzApLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgY2FzZSBcIkNPR05JVE9fVVNFUl9QT09MX09SX0JBU0lDX0FVVEhcIjoge1xuICAgICAgICBjb25zdCBhdXRob3JpemVyID0gbmV3IENvZ25pdG9Vc2VyUG9vbE9yQmFzaWNBdXRoQXV0aG9yaXplcihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGlkICsgXCJMYW1iZGFcIixcbiAgICAgICAgICBhdXRob3JpemF0aW9uLFxuICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIG5ldyBhdXRob3JpemVycy5IdHRwTGFtYmRhQXV0aG9yaXplcihpZCwgYXV0aG9yaXplci5sYW1iZGEsIHtcbiAgICAgICAgICByZXNwb25zZVR5cGVzOiBhdXRob3JpemVyLnJlc3BvbnNlVHlwZXMsXG4gICAgICAgICAgLy8gTWF4IDFoLCBvciBkaXNhYmxlZCAoMHMpLiBUaGUgdmFsdWUgb25seSBtYXR0ZXJzIHdoZW4gaW52YWxpZGF0aW5nL2R5bmFtaWMgY3JlZGVudGlhbHNcbiAgICAgICAgICByZXN1bHRzQ2FjaGVUdGw6IGNkay5EdXJhdGlvbi5ob3VycygxKSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJDVVNUT01fTEFNQkRBX0FVVEhPUklaRVJcIjoge1xuICAgICAgICByZXR1cm4gbmV3IGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFBdXRob3JpemVyKFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIGF1dGhvcml6YXRpb24ubGFtYmRhQXV0aG9yaXplcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5hdXRob3JpemF0aW9uLmF1dGhvcml6ZXJQcm9wcyxcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZXM6IGF1dGhvcml6YXRpb24uYXV0aG9yaXplclByb3BzPy5yZXNwb25zZVR5cGVzID8/IFtcbiAgICAgICAgICAgICAgYXV0aG9yaXplcnMuSHR0cExhbWJkYVJlc3BvbnNlVHlwZS5TSU1QTEUsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVzdWx0c0NhY2hlVHRsOlxuICAgICAgICAgICAgICBhdXRob3JpemF0aW9uLmF1dGhvcml6ZXJQcm9wcz8ucmVzdWx0c0NhY2hlVHRsID8/XG4gICAgICAgICAgICAgIGNkay5EdXJhdGlvbi5ob3VycygxKSxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVJbnRlZ3JhdGlvbihcbiAgICBpbnRlZ3JhdGlvbjogSW50ZWdyYXRpb25Qcm9wcyxcbiAgICBkbnM6IEFwaUdhdGV3YXlQcm9wc1tcImRuc1wiXSxcbiAgKTogYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb24ge1xuICAgIHN3aXRjaCAoaW50ZWdyYXRpb24udHlwZSkge1xuICAgICAgY2FzZSBcIkFMQlwiOiB7XG4gICAgICAgIC8vIFRoZSBWUENMaW5rIGNvbm5lY3RzIHRoZSBpbnRlZ3JhdGlvbiBpbnRvIHRoZSBBTEIncyBWUEMuIE11c3QgYmUgbWFudWFsbHkgY3JlYXRlZCB3aGVuXG4gICAgICAgIC8vIHRoZSBWUEMgaXMgaW1wb3J0ZWQsIHdoaWNoIGlzIHRoZSBjYXNlIHdoZW4gdXNpbmcgQ29yZVBsYXRmb3JtQ29uc3VtZXIuXG4gICAgICAgIGNvbnN0IHZwY0xpbmsgPSBuZXcgYXBpZ3cuVnBjTGluayh0aGlzLCBcIkFsYlZwY0xpbmtcIiwge1xuICAgICAgICAgIHZwYzogaW50ZWdyYXRpb24udnBjLFxuICAgICAgICAgIHNlY3VyaXR5R3JvdXBzOiBbaW50ZWdyYXRpb24uc2VjdXJpdHlHcm91cF0sXG4gICAgICAgICAgc3VibmV0czogaW50ZWdyYXRpb24udnBjLnNlbGVjdFN1Ym5ldHMoKSwgLy8gVGhpcyBjb3JyZWN0bHkgc2VsZWN0cyB0aGUgcHJpdmF0ZSBzdWJuZXRzXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgcGFyYW1ldGVyTWFwcGluZyA9IG5ldyBhcGlndy5QYXJhbWV0ZXJNYXBwaW5nKClcbiAgICAgICAgICAvKiogU2VlIHtAbGluayBBbGJJbnRlZ3JhdGlvblByb3BzLmhvc3ROYW1lfSAqL1xuICAgICAgICAgIC5vdmVyd3JpdGVIZWFkZXIoXG4gICAgICAgICAgICBcIkhvc3RcIixcbiAgICAgICAgICAgIC8vIFRoZSBIb3N0IGhlYWRlciBjYW4gTk9UIHVzZSBkeW5hbWljIG1hcHBpbmcsIGxpa2UgJGNvbnRleHQuZG9tYWluTmFtZSBldGMuXG4gICAgICAgICAgICBhcGlndy5NYXBwaW5nVmFsdWUuY3VzdG9tKGludGVncmF0aW9uLmhvc3ROYW1lKSxcbiAgICAgICAgICApXG4gICAgICAgIGlmIChpbnRlZ3JhdGlvbi5tYXBQYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpbnRlZ3JhdGlvbi5tYXBQYXJhbWV0ZXJzKHBhcmFtZXRlck1hcHBpbmcpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IGludGVncmF0aW9ucy5IdHRwQWxiSW50ZWdyYXRpb24oXG4gICAgICAgICAgXCJBbGJJbnRlZ3JhdGlvbi1cIiArIGRucy5zdWJkb21haW4sXG4gICAgICAgICAgaW50ZWdyYXRpb24ubG9hZEJhbGFuY2VyTGlzdGVuZXIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2VjdXJlU2VydmVyTmFtZTogaW50ZWdyYXRpb24uaG9zdE5hbWUsXG4gICAgICAgICAgICB2cGNMaW5rOiB2cGNMaW5rLFxuICAgICAgICAgICAgbWV0aG9kOiBhcGlndy5IdHRwTWV0aG9kLkFOWSxcbiAgICAgICAgICAgIHBhcmFtZXRlck1hcHBpbmcsXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgY2FzZSBcIkxhbWJkYVwiOiB7XG4gICAgICAgIHJldHVybiBuZXcgaW50ZWdyYXRpb25zLkh0dHBMYW1iZGFJbnRlZ3JhdGlvbihcbiAgICAgICAgICBcIkxhbWJkYUludGVncmF0aW9uXCIsXG4gICAgICAgICAgaW50ZWdyYXRpb24ubGFtYmRhLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHBheWxvYWRGb3JtYXRWZXJzaW9uOiBhcGlndy5QYXlsb2FkRm9ybWF0VmVyc2lvbi5WRVJTSU9OXzJfMCxcbiAgICAgICAgICAgIHBhcmFtZXRlck1hcHBpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjYXNlIFwiU1FTXCI6IHtcbiAgICAgICAgLy8gQVBJLUdXIGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvIFNRUyBieSBkZWZhdWx0XG4gICAgICAgIGNvbnN0IHJvbGUgPSBuZXcgaWFtLlJvbGUoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBgQXBpR3dUbyR7aW50ZWdyYXRpb24ucXVldWUubm9kZS5pZH1TZXJ2aWNlUm9sZWAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgIFwiQWxsb3dzIEFQSS1HVyB0byBhZGQgbWVzc2FnZXMgdG8gXCIgKyBpbnRlZ3JhdGlvbi5xdWV1ZS5xdWV1ZUFybixcbiAgICAgICAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKFwiYXBpZ2F0ZXdheS5hbWF6b25hd3MuY29tXCIpLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgaW50ZWdyYXRpb24ucXVldWUuZ3JhbnRTZW5kTWVzc2FnZXMocm9sZSlcblxuICAgICAgICBsZXQgcGFyYW1ldGVyTWFwcGluZyA9IG5ldyBhcGlndy5QYXJhbWV0ZXJNYXBwaW5nKClcbiAgICAgICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktZGV2ZWxvcC1pbnRlZ3JhdGlvbnMtYXdzLXNlcnZpY2VzLXJlZmVyZW5jZS5odG1sI1NRUy1TZW5kTWVzc2FnZVxuICAgICAgICAgIC5jdXN0b20oXCJRdWV1ZVVybFwiLCBpbnRlZ3JhdGlvbi5xdWV1ZS5xdWV1ZVVybClcbiAgICAgICAgICAuY3VzdG9tKFwiTWVzc2FnZUJvZHlcIiwgXCIkcmVxdWVzdC5ib2R5XCIpXG4gICAgICAgICAgLmN1c3RvbShcIlJlZ2lvblwiLCBcImV1LXdlc3QtMVwiKSAvLyBDaGFuZ2UgdGhpcyBpZiB0aGUgU1FTIHF1ZXVlIGlzIGluIGFub3RoZXIgcmVnaW9uIVxuXG4gICAgICAgIGlmIChpbnRlZ3JhdGlvbi5tZXNzYWdlQXR0cmlidXRlcykge1xuICAgICAgICAgIHBhcmFtZXRlck1hcHBpbmcgPSBwYXJhbWV0ZXJNYXBwaW5nLmN1c3RvbShcbiAgICAgICAgICAgIFwiTWVzc2FnZUF0dHJpYnV0ZXNcIixcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGludGVncmF0aW9uLm1lc3NhZ2VBdHRyaWJ1dGVzKSxcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFNxc1JvdXRlSW50ZWdyYXRpb24oXCJTcXNJbnRlZ3JhdGlvblwiLCB7XG4gICAgICAgICAgdHlwZTogYXBpZ3cuSHR0cEludGVncmF0aW9uVHlwZS5BV1NfUFJPWFksXG4gICAgICAgICAgc3VidHlwZTogYXBpZ3cuSHR0cEludGVncmF0aW9uU3VidHlwZS5TUVNfU0VORF9NRVNTQUdFLFxuICAgICAgICAgIGNyZWRlbnRpYWxzOiBhcGlndy5JbnRlZ3JhdGlvbkNyZWRlbnRpYWxzLmZyb21Sb2xlKHJvbGUpLFxuICAgICAgICAgIHBhcmFtZXRlck1hcHBpbmc6IHBhcmFtZXRlck1hcHBpbmcsXG4gICAgICAgICAgcGF5bG9hZEZvcm1hdFZlcnNpb246IGFwaWd3LlBheWxvYWRGb3JtYXRWZXJzaW9uLlZFUlNJT05fMV8wLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgYSBncmFudGFibGUgdGFyZ2V0IChyb2xlLCB1c2VyIGV0Yy4pIHBlcm1pc3Npb24gdG8gaW52b2tlIHRoZSBBUEkuXG4gICAqIE9ubHkgd29ya3Mgd2hlbiB1c2luZyBgSUFNYCBhcyB7QGxpbmsgQXBpR2F0ZXdheVJvdXRlLmF1dGhvcml6YXRpb259LlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IEEgZ3JhbnRhYmxlLCBsaWtlIHtAbGluayBpYW0uUm9sZX1cbiAgICovXG4gIHB1YmxpYyBncmFudEludm9rZSh0YXJnZXQ6IGlhbS5JR3JhbnRhYmxlKSB7XG4gICAgZm9yIChjb25zdCByb3V0ZVByb3BzIG9mIHRoaXMucHJvcHMucm91dGVzKSB7XG4gICAgICBjb25zdCBhdXRoVHlwZSA9XG4gICAgICAgIHJvdXRlUHJvcHMuYXV0aG9yaXphdGlvbj8udHlwZSA/PyB0aGlzLnByb3BzLmRlZmF1bHRBdXRob3JpemF0aW9uPy50eXBlXG5cbiAgICAgIGlmIChhdXRoVHlwZSAhPT0gXCJJQU1cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCBncmFudCBpbnZva2UgZm9yIGFuIEFQSSBHYXRld2F5IHdoZW4gbm90IHVzaW5nIElBTSBhdXRoIChmb3VuZCBhdXRoICcke2F1dGhUeXBlfScgb24gcm91dGUgJyR7cm91dGVQcm9wcy5wYXRofScpIFske2Nkay5TdGFjay5vZih0aGlzKS5zdGFja05hbWV9XWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHRoaXMucm91dGVzKSB7XG4gICAgICByb3V0ZS5ncmFudEludm9rZSh0YXJnZXQpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGN1c3RvbSBkb21haW4gZm9yIHRoZSBBUEktR2F0ZXdheSwgYSBSb3V0ZTUzIHJlY29yZCBhbmQgYW4gSFRUUFMgY2VydC5cbiAqIEBhdXRob3IgS3Jpc3RpYW4gUmVrc3RhZCA8a3JlQGNhcHJhY29uc3VsdGluZy5ubz5cbiAqL1xuY2xhc3MgQ3VzdG9tRG9tYWluIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgYXBpR3dDdXN0b21Eb21haW46IGFwaWd3LkRvbWFpbk5hbWVcblxuICAvKiogVGhlIEZ1bGx5IFF1YWxpZmllZCBEb21haW4gTmFtZSAoRlFETikgbGlrZSBgcHJvZHVjdC5wbGF0Zm9ybS5leGFtcGxlLm5vYC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGN1c3RvbURvbWFpbk5hbWU6IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBBcGlHYXRld2F5RG5zUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcbiAgICB0aGlzLmN1c3RvbURvbWFpbk5hbWUgPSBgJHtwcm9wcy5zdWJkb21haW59LiR7cHJvcHMuaG9zdGVkWm9uZS56b25lTmFtZX1gXG5cbiAgICAvLyBDYW4gYWxzbyB1c2Ugd2lsZGNhcmQgY2VydHMgaW5zdGVhZCEgQ2hlYXBlclxuICAgIC8qKiBBbGxvd3MgZXh0ZXJuYWwgdXNlcnMgdG8gY29ubmVjdCB3aXRoIEhUVFBTLiAqL1xuICAgIGNvbnN0IGN1c3RvbURvbWFpbkNlcnQgPSBuZXcgYWNtLkNlcnRpZmljYXRlKHRoaXMsIFwiSHR0cHNDZXJ0aWZpY2F0ZVwiLCB7XG4gICAgICBkb21haW5OYW1lOiB0aGlzLmN1c3RvbURvbWFpbk5hbWUsXG4gICAgICB2YWxpZGF0aW9uOiBhY20uQ2VydGlmaWNhdGVWYWxpZGF0aW9uLmZyb21EbnMocHJvcHMuaG9zdGVkWm9uZSksXG4gICAgfSlcblxuICAgIC8vIE5vdGUgdGhhdCBBUEktR1cgY2FuIGFsc28gc3VwcG9ydCB3aWxkY2FyZCBkb21haW5zISBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktY3VzdG9tLWRvbWFpbi1uYW1lcy5odG1sI2h0dHAtd2lsZGNhcmQtY3VzdG9tLWRvbWFpbi1uYW1lc1xuICAgIC8vIEJ1dCB0aGlzIHdpbGwgbm90IHdvcmsgd2hlbiBBV1MgYWNjb3VudCBYIGhhcyBDdXN0b21Eb21haW4gYHN0YWdpbmcucGxhdGZvcm0uZXhhbXBsZS5ub2AgYW5kIGFjY291bnQgWSBoYXMgQ3VzdG9tRG9tYWluIGAqLnBsYXRmb3JtLmV4YW1wbGUubm9gLlxuICAgIC8vIE5vdCBzdXJlIGhvdyBzdWItc3ViZG9tYWlucyBhcmUgYWZmZWN0ZWQ6IGBteXNlcnZpY2Uuc3RhZ2luZy5wbGF0Zm9ybS5leGFtcGxlLm5vYCBhbmQgYCoucGxhdGZvcm0uZXhhbXBsZS5ub2AuXG4gICAgdGhpcy5hcGlHd0N1c3RvbURvbWFpbiA9IG5ldyBhcGlndy5Eb21haW5OYW1lKFxuICAgICAgdGhpcyxcbiAgICAgIFwiRG9tYWluTmFtZS1cIiArIHByb3BzLnN1YmRvbWFpbixcbiAgICAgIHtcbiAgICAgICAgZG9tYWluTmFtZTogdGhpcy5jdXN0b21Eb21haW5OYW1lLFxuICAgICAgICBjZXJ0aWZpY2F0ZTogY3VzdG9tRG9tYWluQ2VydCxcbiAgICAgICAgZW5kcG9pbnRUeXBlOiBhcGlndy5FbmRwb2ludFR5cGUuUkVHSU9OQUwsXG4gICAgICAgIHNlY3VyaXR5UG9saWN5OiBhcGlndy5TZWN1cml0eVBvbGljeS5UTFNfMV8yLFxuICAgICAgfSxcbiAgICApXG5cbiAgICAvLyBUaGlzIG1ha2VzIHRoZSBBUEktR1cgcHVibGljbHkgYXZhaWxhYmxlIG9uIHRoZSBjdXN0b20gZG9tYWluIG5hbWUuXG4gICAgbmV3IHJvdXRlNTMuQVJlY29yZCh0aGlzLCBcIlJvdXRlNTNBUmVjb3JkQXBpZ3dBbGlhc1wiLCB7XG4gICAgICByZWNvcmROYW1lOiBwcm9wcy5zdWJkb21haW4sXG4gICAgICB6b25lOiBwcm9wcy5ob3N0ZWRab25lLFxuICAgICAgdGFyZ2V0OiByb3V0ZTUzLlJlY29yZFRhcmdldC5mcm9tQWxpYXMoXG4gICAgICAgIG5ldyByb3V0ZTUzVGFyZ2V0cy5BcGlHYXRld2F5djJEb21haW5Qcm9wZXJ0aWVzKFxuICAgICAgICAgIHRoaXMuYXBpR3dDdXN0b21Eb21haW4ucmVnaW9uYWxEb21haW5OYW1lLFxuICAgICAgICAgIHRoaXMuYXBpR3dDdXN0b21Eb21haW4ucmVnaW9uYWxIb3N0ZWRab25lSWQsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICAgdHRsOiBwcm9wcy50dGwgPz8gY2RrLkR1cmF0aW9uLm1pbnV0ZXMoNSksIC8vIExvdyBUVEwgbWFrZXMgaXQgZWFzaWVyIHRvIGRvIGNoYW5nZXNcbiAgICB9KVxuICB9XG59XG5cbi8qKiBBY3RzIGFzIGdsdWUgKGJldHdlZW4gdGhlIGludGVncmF0aW9uIHByb3BzIGFuZCB0aGUgSHR0cEFwaSkgd2hlbiBjcmVhdGluZyBhbiBTcXNJbnRlZ3JhdGlvbi4gKi9cbmNsYXNzIFNxc1JvdXRlSW50ZWdyYXRpb24gZXh0ZW5kcyBhcGlndy5IdHRwUm91dGVJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAcGFyYW0gaWQgVGhlIGlkIHVzZWQgaW4gdGhlIHtAbGluayBhcGlndy5IdHRwSW50ZWdyYXRpb259IGNvbnN0cnVjdFxuICAgKiAgICBjcmVhdGVkIGludGVybmFsbHkgYnkge0BsaW5rIGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9uLl9iaW5kVG9Sb3V0ZX0uXG4gICAqICAgIFtTb3VyY2UgY29kZV0oaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvYjVhZTM3NzgyYmMzY2I2MzdlZWVmOWZiYjFmYmUyYzVlZmRmYzA2OC9wYWNrYWdlcy8lNDBhd3MtY2RrL2F3cy1hcGlnYXRld2F5djIvbGliL2h0dHAvaW50ZWdyYXRpb24udHMjTDMyMSlcbiAgICogQHBhcmFtIGludGVncmF0aW9uUHJvcHMgVGhlIHByb3BzIHRvIHBhc3MgdG8gdGhlIHtAbGluayBhcGlndy5IdHRwSW50ZWdyYXRpb259IGNvbnN0cnVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBpbnRlZ3JhdGlvblByb3BzOiBhcGlndy5IdHRwUm91dGVJbnRlZ3JhdGlvbkNvbmZpZyxcbiAgKSB7XG4gICAgc3VwZXIoaWQpXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBzZW5kcyB0aGUgcHJvcGVydGllcyBuZWVkZWQgZm9yIGNyZWF0aW5nIGEge0BsaW5rIGFwaWd3Lkh0dHBJbnRlZ3JhdGlvbn0gdG8gdGhlXG4gICAqIHtAbGluayBhcGlndy5IdHRwUm91dGVJbnRlZ3JhdGlvbn0uXG4gICAqL1xuICBiaW5kKCk6IGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9uQ29uZmlnIHtcbiAgICAvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnk6XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvYjVhZTM3NzgyYmMzY2I2MzdlZWVmOWZiYjFmYmUyYzVlZmRmYzA2OC9wYWNrYWdlcy8lNDBhd3MtY2RrL2F3cy1hcGlnYXRld2F5djIvbGliL2h0dHAvaW50ZWdyYXRpb24udHMjTDMxOVxuICAgIHJldHVybiB0aGlzLmludGVncmF0aW9uUHJvcHNcbiAgfVxufVxuXG4vKipcbiAqIFdoZW4gdXNpbmcgYE5vZGVqc0Z1bmN0aW9uYCB3aXRoIGBlbnRyeWAsIHdlIHBvaW50IENESyB0byBhIGZpbGUgd2l0aCBvdXIgbGFtYmRhIGNvZGUuIFRoaXMgY2FuXG4gKiBlaXRoZXIgYmUgYSBUeXBlU2NyaXB0IG9yIEphdmFTY3JpcHQgZmlsZS4gV2hlbiBjcmVhdGluZyBjb25zdHJ1Y3RzIGluIHRlc3RzIGluc2lkZSB0aGlzIGxpYnJhcnksXG4gKiB0aGUgZW50cnkgd2lsbCBwb2ludCB0byB0aGUgVHlwZVNjcmlwdCBmaWxlIGluIHRoZSBzb3VyY2UgY29kZS4gQnV0IHdoZW4gYSBsaWJyYXJ5IGNvbnN1bWVyIHVzZXNcbiAqIHRoaXMsIGl0IHdpbGwgaW5zdGVhZCBwb2ludCB0byB0aGUgdHJhbnNwaWxlZCBKYXZhU2NyaXB0IGZpbGUuIFNvIHRvIHNldCB0aGUgY29ycmVjdCBmaWxlXG4gKiBleHRlbnNpb24sIHdlIG11c3QgY2hlY2sgaWYgd2UncmUgYmVpbmcgcnVuIGluIHRoZSBjb250ZXh0IG9mIHRoZSBUeXBlU2NyaXB0IHNvdXJjZSBjb2RlXG4gKiAoc3JjL2FwaS1nYXRld2F5KSwgb3RoZXJ3aXNlIHdlJ3JlIGJlaW5nIHJ1biBieSBhIGNvbnN1bWVyIGFzIHRyYW5zcGlsZWQgSmF2YVNjcmlwdC5cbiAqL1xuY29uc3QgYXV0aG9yaXplckZpbGVFeHRlbnNpb24gPSBfX2Rpcm5hbWUuZW5kc1dpdGgoXCJzcmMvYXBpLWdhdGV3YXlcIilcbiAgPyBcInRzXCJcbiAgOiBcImpzXCJcblxuLyoqXG4gKiBDcmVhdGVzIGEgY3VzdG9tIExhbWJkYSBhdXRob3JpemVyIHdoaWNoIHJlYWRzIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPGFjY2VzcyB0b2tlbj5gIGhlYWRlciBhbmRcbiAqIHZlcmlmaWVzIHRoZSB0b2tlbiBhZ2FpbnN0IGEgQ29nbml0byB1c2VyIHBvb2wuXG4gKi9cbmNsYXNzIENvZ25pdG9Vc2VyUG9vbEF1dGhvcml6ZXI8XG4gIEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nLFxuPiBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGxhbWJkYTogbGFtYmRhLklGdW5jdGlvblxuXG4gIC8qKlxuICAgKiBVc2Ugc2ltcGxlIHJlc3BvbnNlIHR5cGUgKGB7IGlzQXV0aG9yaXplZDogdHJ1ZS9mYWxzZSB9YCksIGFzIG9wcG9zZWQgdG8gcmV0dXJuaW5nIGFuIElBTVxuICAgKiBQb2xpY3kgZG9jdW1lbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplcnMuSHR0cExhbWJkYVJlc3BvbnNlVHlwZVtdID0gW1xuICAgIGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGUuU0lNUExFLFxuICBdXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvZ25pdG9Vc2VyUG9vbEF1dGhvcml6ZXJQcm9wczxBdXRoU2NvcGVzVD4sXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIHRoaXMubGFtYmRhID0gbmV3IGxhbWJkYU5vZGVqcy5Ob2RlanNGdW5jdGlvbih0aGlzLCBcIkF1dGhvcml6ZXJGdW5jdGlvblwiLCB7XG4gICAgICBlbnRyeTogcGF0aC5qb2luKFxuICAgICAgICBfX2Rpcm5hbWUsXG4gICAgICAgIGBhdXRob3JpemVycy9jb2duaXRvLXVzZXItcG9vbC1hdXRob3JpemVyLiR7YXV0aG9yaXplckZpbGVFeHRlbnNpb259YCxcbiAgICAgICksXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgW1wiVVNFUl9QT09MX0lEXCJdOiBwcm9wcy51c2VyUG9vbC51c2VyUG9vbElkLFxuICAgICAgICBbXCJSRVFVSVJFRF9TQ09QRVwiXTogcHJvcHMucmVxdWlyZWRTY29wZSA/PyBcIlwiLFxuICAgICAgICBbXCJDUkVERU5USUFMU19GT1JfSU5URVJOQUxfQVVUSE9SSVpBVElPTlwiXTpcbiAgICAgICAgICBwcm9wcy5jcmVkZW50aWFsc0ZvckludGVybmFsQXV0aG9yaXphdGlvblxuICAgICAgICAgICAgPyBwcm9wcy5jcmVkZW50aWFsc0ZvckludGVybmFsQXV0aG9yaXphdGlvblxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgaWYgKHByb3BzLmNyZWRlbnRpYWxzRm9ySW50ZXJuYWxBdXRob3JpemF0aW9uKSB7XG4gICAgICBzZWNyZXRzbWFuYWdlci5TZWNyZXQuZnJvbVNlY3JldE5hbWVWMihcbiAgICAgICAgc2NvcGUsXG4gICAgICAgIGlkICsgXCJCYXNpY0F1dGhTZWNyZXRcIixcbiAgICAgICAgcHJvcHMuY3JlZGVudGlhbHNGb3JJbnRlcm5hbEF1dGhvcml6YXRpb24sXG4gICAgICApLmdyYW50UmVhZCh0aGlzLmxhbWJkYSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgY3VzdG9tIExhbWJkYSBhdXRob3JpemVyIHdoaWNoIHJlYWRzIGBBdXRob3JpemF0aW9uOiBCYXNpYyA8YmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHM+YFxuICogaGVhZGVyIGFuZCB2ZXJpZmllcyB0aGUgY3JlZGVudGlhbHMgYWdhaW5zdCBhIGdpdmVuIHNlY3JldC5cbiAqL1xuY2xhc3MgQmFzaWNBdXRoQXV0aG9yaXplciBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGxhbWJkYTogbGFtYmRhLklGdW5jdGlvblxuXG4gIC8vIFNpbXBsZSBpcyBgeyBpc0F1dGhvcml6ZWQ6IHRydWUvZmFsc2UgfWAsIGFzIG9wcG9zZWQgdG8gcmV0dXJuaW5nIGFuIElBTSBQb2xpY3kgZG9jdW1lbnRcbiAgcHVibGljIHJlYWRvbmx5IHJlc3BvbnNlVHlwZXM6IGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGVbXSA9IFtcbiAgICBhdXRob3JpemVycy5IdHRwTGFtYmRhUmVzcG9uc2VUeXBlLlNJTVBMRSxcbiAgXVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBCYXNpY0F1dGhBdXRob3JpemVyUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIHRoaXMubGFtYmRhID0gbmV3IGxhbWJkYU5vZGVqcy5Ob2RlanNGdW5jdGlvbih0aGlzLCBcIkJhc2ljQXV0aExhbWJkYVwiLCB7XG4gICAgICBlbnRyeTogcGF0aC5qb2luKFxuICAgICAgICBfX2Rpcm5hbWUsXG4gICAgICAgIGBhdXRob3JpemVycy9iYXNpYy1hdXRoLWF1dGhvcml6ZXIuJHthdXRob3JpemVyRmlsZUV4dGVuc2lvbn1gLFxuICAgICAgKSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkFuIGF1dGhvcml6ZXIgZm9yIEFQSS1HYXRld2F5IHRoYXQgY2hlY2tzIEJhc2ljIEF1dGggY3JlZGVudGlhbHMgb24gcmVxdWVzdHNcIixcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgW1wiQ1JFREVOVElBTFNfU0VDUkVUX05BTUVcIl06IHByb3BzLmNyZWRlbnRpYWxzU2VjcmV0TmFtZVxuICAgICAgICAgID8gcHJvcHMuY3JlZGVudGlhbHNTZWNyZXROYW1lXG4gICAgICAgICAgOiBcIlwiLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgaWYgKHByb3BzLmNyZWRlbnRpYWxzU2VjcmV0TmFtZSkge1xuICAgICAgc2VjcmV0c21hbmFnZXIuU2VjcmV0LmZyb21TZWNyZXROYW1lVjIoXG4gICAgICAgIHNjb3BlLFxuICAgICAgICBpZCArIFwiQmFzaWNBdXRoU2VjcmV0XCIsXG4gICAgICAgIHByb3BzLmNyZWRlbnRpYWxzU2VjcmV0TmFtZSxcbiAgICAgICkuZ3JhbnRSZWFkKHRoaXMubGFtYmRhKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gTGFtYmRhIGF1dGhvcml6ZXIgd2hpY2ggYWxsb3dzIGJvdGg6XG4gKiAtIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPGFjY2VzcyB0b2tlbj5gIGhlYWRlciwgZm9yIHdoaWNoIHRoZSB0b2tlbiBpcyBjaGVja2VkIGFnYWluc3QgdGhlIGdpdmVuXG4gKiAgIENvZ25pdG8gdXNlciBwb29sXG4gKiAtIGBBdXRob3JpemF0aW9uOiBCYXNpYyA8YmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHM+YCBoZWFkZXIsIGZvciB3aGljaCB0aGUgY3JlZGVudGlhbHMgYXJlXG4gKiAgIGNoZWNrZWQgYWdhaW5zdCB0aGUgY3JlZGVudGlhbHMgZnJvbSB0aGUgZ2l2ZW4gYmFzaWMgYXV0aCBzZWNyZXQgbmFtZVxuICpcbiAqIElmIGVpdGhlciBvZiB0aGVzZSBhcmUgZ2l2ZW4gYW5kIHZhbGlkLCB0aGUgcmVxdWVzdCBpcyBhdXRoZW50aWNhdGVkLlxuICovXG5jbGFzcyBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXI8XG4gIEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nLFxuPiBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGxhbWJkYTogbGFtYmRhLklGdW5jdGlvblxuXG4gIC8qKlxuICAgKiBVc2Ugc2ltcGxlIHJlc3BvbnNlIHR5cGUgKGB7IGlzQXV0aG9yaXplZDogdHJ1ZS9mYWxzZSB9YCksIGFzIG9wcG9zZWQgdG8gcmV0dXJuaW5nIGFuIElBTVxuICAgKiBQb2xpY3kgZG9jdW1lbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplcnMuSHR0cExhbWJkYVJlc3BvbnNlVHlwZVtdID0gW1xuICAgIGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGUuU0lNUExFLFxuICBdXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvZ25pdG9Vc2VyUG9vbE9yQmFzaWNBdXRoQXV0aG9yaXplclByb3BzPEF1dGhTY29wZXNUPixcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgdGhpcy5sYW1iZGEgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIFwiQXV0aG9yaXplckZ1bmN0aW9uXCIsIHtcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oXG4gICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgYGF1dGhvcml6ZXJzL2NvZ25pdG8tdXNlci1wb29sLW9yLWJhc2ljLWF1dGgtYXV0aG9yaXplci4ke2F1dGhvcml6ZXJGaWxlRXh0ZW5zaW9ufWAsXG4gICAgICApLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcyg1KSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFtcIlVTRVJfUE9PTF9JRFwiXTogcHJvcHMudXNlclBvb2wgPyBwcm9wcy51c2VyUG9vbC51c2VyUG9vbElkIDogXCJcIixcbiAgICAgICAgW1wiUkVRVUlSRURfU0NPUEVcIl06IHByb3BzLnJlcXVpcmVkU2NvcGUgPz8gXCJcIixcbiAgICAgICAgW1wiQkFTSUNfQVVUSF9DUkVERU5USUFMU19TRUNSRVRfTkFNRVwiXTpcbiAgICAgICAgICBwcm9wcy5iYXNpY0F1dGhDcmVkZW50aWFsc1NlY3JldE5hbWVcbiAgICAgICAgICAgID8gcHJvcHMuYmFzaWNBdXRoQ3JlZGVudGlhbHNTZWNyZXROYW1lXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBpZiAocHJvcHMuYmFzaWNBdXRoQ3JlZGVudGlhbHNTZWNyZXROYW1lKSB7XG4gICAgICBzZWNyZXRzbWFuYWdlci5TZWNyZXQuZnJvbVNlY3JldE5hbWVWMihcbiAgICAgICAgc2NvcGUsXG4gICAgICAgIGlkICsgXCJCYXNpY0F1dGhTZWNyZXRcIixcbiAgICAgICAgcHJvcHMuYmFzaWNBdXRoQ3JlZGVudGlhbHNTZWNyZXROYW1lLFxuICAgICAgKS5ncmFudFJlYWQodGhpcy5sYW1iZGEpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQSBzbGlnaHRseSBleHRlbmRlZCB2ZXJzaW9uIG9mIHRoZSBbZGVmYXVsdCBKU09OIGZvcm1hdCBzdWdnZXN0ZWQgYnkgQVdTXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktbG9nZ2luZy5odG1sI2h0dHAtYXBpLWVuYWJsZS1sb2dnaW5nLmV4YW1wbGVzKS5cbiAqL1xuY29uc3QgZGVmYXVsdEFjY2Vzc0xvZ0Zvcm1hdCA9IHtcbiAgcmVxdWVzdElkOiBcIiRjb250ZXh0LnJlcXVlc3RJZFwiLFxuICB1c2VyQWdlbnQ6IFwiJGNvbnRleHQuaWRlbnRpdHkudXNlckFnZW50XCIsXG4gIGlwOiBcIiRjb250ZXh0LmlkZW50aXR5LnNvdXJjZUlwXCIsXG4gIC8qKiBDTEYgZm9ybWF0OiBgZGQvTU1NL3l5eXk6SEg6bW06c3MgKy1oaG1tYCAqL1xuICByZXF1ZXN0VGltZTogXCIkY29udGV4dC5yZXF1ZXN0VGltZVwiLFxuICByZXF1ZXN0VGltZUVwb2NoOiBcIiRjb250ZXh0LnJlcXVlc3RUaW1lRXBvY2hcIixcbiAgZGF0YVByb2Nlc3NlZDogXCIkY29udGV4dC5kYXRhUHJvY2Vzc2VkXCIsXG4gIGh0dHBNZXRob2Q6IFwiJGNvbnRleHQuaHR0cE1ldGhvZFwiLFxuICBwYXRoOiBcIiRjb250ZXh0LnBhdGhcIixcbiAgcm91dGVLZXk6IFwiJGNvbnRleHQucm91dGVLZXlcIixcbiAgc3RhdHVzOiBcIiRjb250ZXh0LnN0YXR1c1wiLFxuICBwcm90b2NvbDogXCIkY29udGV4dC5wcm90b2NvbFwiLFxuICByZXNwb25zZUxlbmd0aDogXCIkY29udGV4dC5yZXNwb25zZUxlbmd0aFwiLFxuICByZXNwb25zZUxhdGVuY3k6IFwiJGNvbnRleHQucmVzcG9uc2VMYXRlbmN5XCIsXG4gIGRvbWFpbk5hbWU6IFwiJGNvbnRleHQuZG9tYWluTmFtZVwiLFxuICBlcnJvcjoge1xuICAgIHR5cGU6IFwiJGNvbnRleHQuZXJyb3IucmVzcG9uc2VUeXBlXCIsXG4gICAgZ2F0ZXdheUVycm9yOiBcIiRjb250ZXh0LmVycm9yLm1lc3NhZ2VcIixcbiAgICBpbnRlZ3JhdGlvbkVycm9yOiBcIiRjb250ZXh0LmludGVncmF0aW9uLmVycm9yXCIsXG4gICAgYXV0aG9yaXplckVycm9yOiBcIiRjb250ZXh0LmF1dGhvcml6ZXIuZXJyb3JcIixcbiAgfSxcbiAgaW50ZWdyYXRpb246IHtcbiAgICBsYXRlbmN5OiBcIiRjb250ZXh0LmludGVncmF0aW9uLmxhdGVuY3lcIixcbiAgICByZXF1ZXN0SWQ6IFwiJGNvbnRleHQuaW50ZWdyYXRpb24ucmVxdWVzdElkXCIsXG4gICAgcmVzcG9uc2VTdGF0dXM6IFwiJGNvbnRleHQuaW50ZWdyYXRpb24uc3RhdHVzXCIsXG4gIH0sXG4gIGF1dGg6IHtcbiAgICBpYW06IHtcbiAgICAgIHVzZXJBcm46IFwiJGNvbnRleHQuaWRlbnRpdHkudXNlckFyblwiLFxuICAgICAgYXdzQWNjb3VudDogXCIkY29udGV4dC5pZGVudGl0eS5hY2NvdW50SWRcIixcbiAgICAgIGF3c1ByaW5jaXBhbDogXCIkY29udGV4dC5pZGVudGl0eS5jYWxsZXJcIixcbiAgICAgIGF3c1ByaW5jaXBhbE9yZzogXCIkY29udGV4dC5pZGVudGl0eS5wcmluY2lwYWxPcmdJZFwiLFxuICAgIH0sXG4gICAgYmFzaWM6IHsgdXNlcm5hbWU6IFwiJGNvbnRleHQuYXV0aG9yaXplci51c2VybmFtZVwiIH0sXG4gICAgY29nbml0bzogeyBjbGllbnRJZDogXCIkY29udGV4dC5hdXRob3JpemVyLmNsaWVudElkXCIgfSxcbiAgfSxcbiAgYXdzRW5kcG9pbnRSZXF1ZXN0OiB7XG4gICAgaWQ6IFwiJGNvbnRleHQuYXdzRW5kcG9pbnRSZXF1ZXN0SWRcIixcbiAgICBpZDI6IFwiJGNvbnRleHQuYXdzRW5kcG9pbnRSZXF1ZXN0SWQyXCIsXG4gIH0sXG4gIG1lc3NhZ2U6XG4gICAgXCIkY29udGV4dC5pZGVudGl0eS5zb3VyY2VJcCAtICRjb250ZXh0Lmh0dHBNZXRob2QgJGNvbnRleHQuZG9tYWluTmFtZSAkY29udGV4dC5wYXRoICgkY29udGV4dC5yb3V0ZUtleSkgLSAkY29udGV4dC5zdGF0dXMgWyRjb250ZXh0LnJlc3BvbnNlTGF0ZW5jeSBtc11cIixcbn1cblxuLyoqXG4gKiBFbmFibGVzIGFjY2VzcyBsb2dzIG9uIHRoZSBBUEktR2F0ZXdheS5cbiAqXG4gKiBAYXV0aG9yIEtyaXN0aWFuIFJla3N0YWQgPGtyZUBjYXByYWNvbnN1bHRpbmcubm8+XG4gKi9cbmNsYXNzIEFwaUdhdGV3YXlBY2Nlc3NMb2dzIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nR3JvdXA6IGxvZ3MuTG9nR3JvdXBcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdGFnZTogYXBpZ3cuQ2ZuU3RhZ2UsXG4gICAgcHJvcHM6IEFwaUdhdGV3YXlBY2Nlc3NMb2dzUHJvcHMgfCB1bmRlZmluZWQsXG4gICAgZGVmYXVsdEFjY2Vzc0xvZ0Zvcm1hdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIC8vIGxvZ0dyb3VwIGlzIHNldCB1cCB3aXRoIGhlbHAgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy8xMTEwMCNpc3N1ZWNvbW1lbnQtOTA0NjI3MDgxXG4gICAgLy8gTm90IHN1cmUgaWYgSFRUUCBBUEkgYWN0dWFsbHkgbmVlZHMgdGhlIHNlcnZpY2Ugcm9sZSB3aXRoIG1hbmFnZWQgcG9saWN5OiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktbG9nZ2luZy5odG1sXG4gICAgY29uc3QgYWNjZXNzTG9ncyA9IG5ldyBsb2dzLkxvZ0dyb3VwKHRoaXMsIFwiQWNjZXNzTG9nR3JvdXBcIiwge1xuICAgICAgcmV0ZW50aW9uOiBwcm9wcz8ucmV0ZW50aW9uLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHM/LnJlbW92YWxQb2xpY3kgPz8gY2RrLlJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgICAgLy8gQWx3YXlzIHVzZSB0aGUgZGVmYXVsdCBlbmNyeXB0aW9uIGtleS4gT3RoZXJ3aXNlLCB0aGUga2V5IG5lZWRzIHNwZWNpYWwgcG9saWNpZXM6XG4gICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbG9ncy9lbmNyeXB0LWxvZy1kYXRhLWttcy5odG1sI2Ntay1wZXJtaXNzaW9uc1xuICAgICAgZW5jcnlwdGlvbktleTogdW5kZWZpbmVkLFxuICAgIH0pXG4gICAgdGhpcy5sb2dHcm91cCA9IGFjY2Vzc0xvZ3NcblxuICAgIHN0YWdlLmFjY2Vzc0xvZ1NldHRpbmdzID0ge1xuICAgICAgZGVzdGluYXRpb25Bcm46IGFjY2Vzc0xvZ3MubG9nR3JvdXBBcm4sXG4gICAgICBmb3JtYXQ6IEpTT04uc3RyaW5naWZ5KHByb3BzPy5hY2Nlc3NMb2dGb3JtYXQgPz8gZGVmYXVsdEFjY2Vzc0xvZ0Zvcm1hdCksXG4gICAgfVxuXG4gICAgY29uc3QgYXBpR3dMb2dzUm9sZSA9IG5ldyBpYW0uUm9sZShcbiAgICAgIHRoaXMsXG4gICAgICBcIkFwaUdhdGV3YXlQdXNoVG9DbG91ZHdhdGNoTG9nc1JvbGVcIixcbiAgICAgIHtcbiAgICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJhcGlnYXRld2F5LmFtYXpvbmF3cy5jb21cIiksXG4gICAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcbiAgICAgICAgICAgIFwic2VydmljZS1yb2xlL0FtYXpvbkFQSUdhdGV3YXlQdXNoVG9DbG91ZFdhdGNoTG9nc1wiLFxuICAgICAgICAgICksXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIClcblxuICAgIGFjY2Vzc0xvZ3MuZ3JhbnRXcml0ZShhcGlHd0xvZ3NSb2xlKVxuICB9XG59XG5cbi8qKiBSZXR1cm5zIGEgc2hvcnQgc2VtaS11bmlxdWUgaGFzaCBvZiB0aGUgZ2l2ZW4gc3RyaW5nLiAqL1xuZnVuY3Rpb24gc2hvcnRIYXNoKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gU0hBLTEgaXMgbm8tbm8gd2hlbiB3ZSBuZWVkIGNyeXB0b2dyYXBoaWMgc2VjdXJpdHksIGJ1dCBoZXJlIHdlIGp1c3QgaXQgZm9yIHNob3J0ZW5pbmcgYSBuYW1lLFxuICAvLyB3aGljaCBpcyBmaW5lXG4gIHJldHVybiBjcmVhdGVIYXNoKFwic2hhMVwiKS51cGRhdGUoc3RyKS5kaWdlc3QoXCJoZXhcIikuc3Vic3RyaW5nKDAsIDEwKVxufVxuIl19
|