terraconstructs 0.1.9 → 0.2.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/.jsii +1693 -955
- package/lib/asset-staging.js +1 -1
- package/lib/aws/arn.js +4 -3
- package/lib/aws/aws-asset-manager.js +1 -1
- package/lib/aws/aws-construct.js +1 -1
- package/lib/aws/aws-stack.d.ts +28 -4
- package/lib/aws/aws-stack.js +80 -22
- package/lib/aws/aws-tags.js +2 -2
- package/lib/aws/cloudwatch/actions/appscaling.js +1 -1
- package/lib/aws/cloudwatch/actions/ec2.js +1 -1
- package/lib/aws/cloudwatch/actions/lambda.js +1 -1
- package/lib/aws/cloudwatch/actions/sns.js +1 -1
- package/lib/aws/cloudwatch/actions/ssm.js +2 -2
- package/lib/aws/cloudwatch/alarm-base.js +1 -1
- package/lib/aws/cloudwatch/alarm-rule.js +1 -1
- package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
- package/lib/aws/cloudwatch/alarm.js +1 -1
- package/lib/aws/cloudwatch/composite-alarm.js +1 -1
- package/lib/aws/cloudwatch/dashboard.js +1 -1
- package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
- package/lib/aws/cloudwatch/graph.js +8 -8
- package/lib/aws/cloudwatch/layout.js +3 -3
- package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
- package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
- package/lib/aws/cloudwatch/log-group.js +1 -1
- package/lib/aws/cloudwatch/log-query.js +1 -1
- package/lib/aws/cloudwatch/log-stream.js +1 -1
- package/lib/aws/cloudwatch/metric-filter.js +1 -1
- package/lib/aws/cloudwatch/metric.js +2 -2
- package/lib/aws/cloudwatch/pattern.js +3 -3
- package/lib/aws/cloudwatch/policy.js +1 -1
- package/lib/aws/cloudwatch/query-definition.js +2 -2
- package/lib/aws/cloudwatch/stats.js +1 -1
- package/lib/aws/cloudwatch/subscription-filter.js +1 -1
- package/lib/aws/cloudwatch/text.js +1 -1
- package/lib/aws/cloudwatch/variable.js +3 -3
- package/lib/aws/cloudwatch/widget.js +1 -1
- package/lib/aws/compute/access-log.js +4 -4
- package/lib/aws/compute/activity.js +1 -1
- package/lib/aws/compute/alb/application-listener-action.js +1 -1
- package/lib/aws/compute/alb/application-listener-certificate.js +1 -1
- package/lib/aws/compute/alb/application-listener-rule.js +1 -1
- package/lib/aws/compute/alb/application-listener.js +1 -1
- package/lib/aws/compute/alb/application-load-balancer.js +1 -1
- package/lib/aws/compute/alb/application-target-group.js +1 -1
- package/lib/aws/compute/alb/conditions.js +1 -1
- package/lib/aws/compute/alb/trust-store-revocation.js +1 -1
- package/lib/aws/compute/alb/trust-store.js +1 -1
- package/lib/aws/compute/api-definition.js +3 -3
- package/lib/aws/compute/api-key.js +2 -2
- package/lib/aws/compute/architecture.js +1 -1
- package/lib/aws/compute/aspects/require-imdsv2-aspect.js +2 -2
- package/lib/aws/compute/authorizer.js +1 -1
- package/lib/aws/compute/authorizers/identity-source.js +1 -1
- package/lib/aws/compute/authorizers/lambda.js +2 -2
- package/lib/aws/compute/base-path-mapping.js +1 -1
- package/lib/aws/compute/base-scalable-attribute.js +1 -1
- package/lib/aws/compute/bastion-host.js +1 -1
- package/lib/aws/compute/chain.js +1 -1
- package/lib/aws/compute/client-vpn-authorization-rule.js +1 -1
- package/lib/aws/compute/client-vpn-endpoint.js +2 -2
- package/lib/aws/compute/client-vpn-route.js +2 -2
- package/lib/aws/compute/code.js +8 -8
- package/lib/aws/compute/condition.js +1 -1
- package/lib/aws/compute/connections.js +1 -1
- package/lib/aws/compute/cors.js +1 -1
- package/lib/aws/compute/deployment.js +1 -1
- package/lib/aws/compute/domain-name.js +1 -1
- package/lib/aws/compute/event-invoke-config.js +1 -1
- package/lib/aws/compute/event-source-filter.js +2 -2
- package/lib/aws/compute/event-source-mapping.d.ts +10 -0
- package/lib/aws/compute/event-source-mapping.js +20 -23
- package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
- package/lib/aws/compute/event-sources/s3.js +1 -1
- package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
- package/lib/aws/compute/event-sources/sqs.d.ts +10 -0
- package/lib/aws/compute/event-sources/sqs.js +3 -3
- package/lib/aws/compute/fields.js +4 -4
- package/lib/aws/compute/function-alias.js +1 -1
- package/lib/aws/compute/function-base.js +2 -2
- package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
- package/lib/aws/compute/function-destinations/function.js +1 -1
- package/lib/aws/compute/function-destinations/sqs.js +1 -1
- package/lib/aws/compute/function-nodejs/function.js +1 -1
- package/lib/aws/compute/function-url.js +1 -1
- package/lib/aws/compute/function.js +3 -3
- package/lib/aws/compute/gateway-response.js +2 -2
- package/lib/aws/compute/handler.js +1 -1
- package/lib/aws/compute/instance-types.js +1 -1
- package/lib/aws/compute/instance.js +1 -1
- package/lib/aws/compute/integration.js +1 -1
- package/lib/aws/compute/integrations/aws.js +1 -1
- package/lib/aws/compute/integrations/http.js +1 -1
- package/lib/aws/compute/integrations/lambda.js +1 -1
- package/lib/aws/compute/integrations/mock.js +1 -1
- package/lib/aws/compute/integrations/stepfunctions.js +1 -1
- package/lib/aws/compute/ip-addresses.js +2 -2
- package/lib/aws/compute/ipam.js +1 -1
- package/lib/aws/compute/key-pair.js +1 -1
- package/lib/aws/compute/lambda-api.js +1 -1
- package/lib/aws/compute/launch-template.js +2 -2
- package/lib/aws/compute/lb-shared/base-listener.js +1 -1
- package/lib/aws/compute/lb-shared/base-load-balancer.js +5 -7
- package/lib/aws/compute/lb-shared/base-target-group.js +1 -1
- package/lib/aws/compute/lb-shared/listener-certificate.js +1 -1
- package/lib/aws/compute/lb-shared/load-balancer-targets.js +2 -2
- package/lib/aws/compute/lb-targets/alb-target.js +3 -3
- package/lib/aws/compute/lb-targets/instance-target.js +2 -2
- package/lib/aws/compute/lb-targets/ip-target.js +1 -1
- package/lib/aws/compute/lb-targets/lambda-target.js +1 -1
- package/lib/aws/compute/load-balancer.js +3 -3
- package/lib/aws/compute/machine-image/amazon-linux-2022.js +2 -2
- package/lib/aws/compute/machine-image/amazon-linux-2023.js +2 -2
- package/lib/aws/compute/machine-image/amazon-linux2.js +2 -2
- package/lib/aws/compute/machine-image/common.js +1 -1
- package/lib/aws/compute/machine-image/machine-image.js +8 -8
- package/lib/aws/compute/method.js +1 -1
- package/lib/aws/compute/model.js +3 -3
- package/lib/aws/compute/nat.js +5 -5
- package/lib/aws/compute/network-acl-types.js +2 -2
- package/lib/aws/compute/network-acl.js +3 -3
- package/lib/aws/compute/nlb/network-listener-action.js +1 -1
- package/lib/aws/compute/nlb/network-listener.js +1 -1
- package/lib/aws/compute/nlb/network-load-balancer.js +1 -1
- package/lib/aws/compute/nlb/network-target-group.js +1 -1
- package/lib/aws/compute/peer.js +1 -1
- package/lib/aws/compute/placement-group.js +1 -1
- package/lib/aws/compute/port.js +1 -1
- package/lib/aws/compute/prefix-list.js +1 -1
- package/lib/aws/compute/requestvalidator.js +1 -1
- package/lib/aws/compute/resource.js +3 -3
- package/lib/aws/compute/restapi.js +3 -3
- package/lib/aws/compute/route.js +8 -8
- package/lib/aws/compute/runtime.d.ts +0 -1
- package/lib/aws/compute/runtime.js +5 -36
- package/lib/aws/compute/scalable-target.js +1 -1
- package/lib/aws/compute/schedule.js +1 -1
- package/lib/aws/compute/security-group.js +1 -1
- package/lib/aws/compute/stage.js +2 -2
- package/lib/aws/compute/state-graph.js +1 -1
- package/lib/aws/compute/state-machine-fragment.js +1 -1
- package/lib/aws/compute/state-machine.js +4 -4
- package/lib/aws/compute/states/choice.js +1 -1
- package/lib/aws/compute/states/custom-state.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
- package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
- package/lib/aws/compute/states/distributed-map.js +1 -1
- package/lib/aws/compute/states/fail.js +1 -1
- package/lib/aws/compute/states/map-base.js +1 -1
- package/lib/aws/compute/states/map.js +1 -1
- package/lib/aws/compute/states/parallel.js +1 -1
- package/lib/aws/compute/states/pass.js +2 -2
- package/lib/aws/compute/states/state.js +1 -1
- package/lib/aws/compute/states/succeed.js +1 -1
- package/lib/aws/compute/states/task-base.js +2 -2
- package/lib/aws/compute/states/task.js +1 -1
- package/lib/aws/compute/states/wait.js +2 -2
- package/lib/aws/compute/step-scaling-action.js +1 -1
- package/lib/aws/compute/step-scaling-policy.js +1 -1
- package/lib/aws/compute/stepfunctions-api.js +1 -1
- package/lib/aws/compute/subnet-v2.js +2 -2
- package/lib/aws/compute/subnet.js +1 -1
- package/lib/aws/compute/target-tracking-scaling-policy.js +1 -1
- package/lib/aws/compute/task-credentials.js +1 -1
- package/lib/aws/compute/task-input.js +1 -1
- package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
- package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
- package/lib/aws/compute/tasks/http/invoke.js +1 -1
- package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
- package/lib/aws/compute/tasks/sqs/send-message.js +10 -13
- package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
- package/lib/aws/compute/types.js +1 -1
- package/lib/aws/compute/usage-plan.js +1 -1
- package/lib/aws/compute/user-data.js +3 -3
- package/lib/aws/compute/volume.js +2 -2
- package/lib/aws/compute/vpc-endpoint-service.js +1 -1
- package/lib/aws/compute/vpc-endpoint.js +6 -6
- package/lib/aws/compute/vpc-flow-logs.js +4 -4
- package/lib/aws/compute/vpc-link.js +1 -1
- package/lib/aws/compute/vpc-v2-base.js +1 -1
- package/lib/aws/compute/vpc-v2.js +2 -2
- package/lib/aws/compute/vpc.js +4 -4
- package/lib/aws/compute/vpn.js +3 -3
- package/lib/aws/cx-api.d.ts +1 -0
- package/lib/aws/cx-api.js +6 -0
- package/lib/aws/edge/certificate.js +1 -1
- package/lib/aws/edge/distribution.js +3 -3
- package/lib/aws/edge/dns-alias-record-targets.js +6 -6
- package/lib/aws/edge/dns-record.js +13 -13
- package/lib/aws/edge/dns-zone.js +1 -1
- package/lib/aws/edge/function.js +2 -2
- package/lib/aws/edge/key-value-store.js +4 -4
- package/lib/aws/edge/origin.js +3 -3
- package/lib/aws/edge/response-headers-policy.js +1 -1
- package/lib/aws/encryption/alias.js +1 -1
- package/lib/aws/encryption/key.js +1 -1
- package/lib/aws/encryption/via-service-principal.js +1 -1
- package/lib/aws/environment-aware.d.ts +41 -0
- package/lib/aws/environment-aware.js +3 -0
- package/lib/aws/iam/grant.d.ts +34 -0
- package/lib/aws/iam/grant.js +27 -6
- package/lib/aws/iam/group.js +1 -1
- package/lib/aws/iam/instance-profile.js +1 -1
- package/lib/aws/iam/managed-policy.js +1 -1
- package/lib/aws/iam/oidc-provider.js +1 -1
- package/lib/aws/iam/policy-document.js +1 -1
- package/lib/aws/iam/policy-statement.js +1 -1
- package/lib/aws/iam/policy.js +1 -1
- package/lib/aws/iam/principals.js +20 -20
- package/lib/aws/iam/role.js +1 -1
- package/lib/aws/iam/saml-provider.js +2 -2
- package/lib/aws/iam/unknown-principal.js +1 -1
- package/lib/aws/iam/user.js +1 -1
- package/lib/aws/index.d.ts +1 -0
- package/lib/aws/index.js +2 -1
- package/lib/aws/network/simple-ipv4-vpc.js +1 -1
- package/lib/aws/network/subnet-group.js +3 -3
- package/lib/aws/network/subnet.js +4 -4
- package/lib/aws/notify/archive.js +1 -1
- package/lib/aws/notify/connection.js +3 -3
- package/lib/aws/notify/event-bus.d.ts +1 -1
- package/lib/aws/notify/event-bus.js +4 -4
- package/lib/aws/notify/event-pattern.js +1 -1
- package/lib/aws/notify/index.d.ts +3 -1
- package/lib/aws/notify/index.js +5 -5
- package/lib/aws/notify/input.js +2 -2
- package/lib/aws/notify/kinesis-stream.js +1 -1
- package/lib/aws/notify/notification-rule.js +1 -1
- package/lib/aws/notify/policy.js +1 -1
- package/lib/aws/notify/queue-base.d.ts +241 -0
- package/lib/aws/notify/queue-base.js +161 -0
- package/lib/aws/notify/queue-policy.js +1 -1
- package/lib/aws/notify/queue.d.ts +157 -190
- package/lib/aws/notify/queue.js +239 -186
- package/lib/aws/notify/resource-policy.js +1 -1
- package/lib/aws/notify/rule.js +1 -1
- package/lib/aws/notify/schedule.js +1 -1
- package/lib/aws/notify/sqs-augmentations.generated.d.ts +3 -3
- package/lib/aws/notify/sqs-augmentations.generated.js +23 -26
- package/lib/aws/notify/sqs-grants.generated.d.ts +72 -0
- package/lib/aws/notify/sqs-grants.generated.js +139 -0
- package/lib/aws/notify/subscription-filter.js +1 -1
- package/lib/aws/notify/subscription.js +4 -4
- package/lib/aws/notify/subscriptions/email.js +1 -1
- package/lib/aws/notify/subscriptions/lambda.js +1 -1
- package/lib/aws/notify/subscriptions/sms.js +1 -1
- package/lib/aws/notify/subscriptions/sqs.js +30 -27
- package/lib/aws/notify/subscriptions/subscription.d.ts +1 -1
- package/lib/aws/notify/subscriptions/subscription.js +1 -1
- package/lib/aws/notify/subscriptions/url.js +1 -1
- package/lib/aws/notify/targets/event-bus.d.ts +1 -1
- package/lib/aws/notify/targets/event-bus.js +2 -2
- package/lib/aws/notify/targets/function.js +1 -1
- package/lib/aws/notify/targets/log-group.js +2 -2
- package/lib/aws/notify/targets/sqs.js +12 -14
- package/lib/aws/notify/targets/state-machine.js +1 -1
- package/lib/aws/notify/topic-base.js +1 -1
- package/lib/aws/notify/topic.js +1 -1
- package/lib/aws/region-lookup.d.ts +8 -0
- package/lib/aws/region-lookup.js +104 -0
- package/lib/aws/storage/assets/image-asset.js +3 -3
- package/lib/aws/storage/assets/s3.js +1 -1
- package/lib/aws/storage/auth-token.js +2 -2
- package/lib/aws/storage/billing.js +1 -1
- package/lib/aws/storage/bucket-notifications.js +1 -1
- package/lib/aws/storage/bucket-policy.js +1 -1
- package/lib/aws/storage/bucket-source.js +1 -1
- package/lib/aws/storage/bucket.js +27 -24
- package/lib/aws/storage/capacity.js +1 -1
- package/lib/aws/storage/ecr-repository.js +3 -3
- package/lib/aws/storage/encryption.js +1 -1
- package/lib/aws/storage/notification-targets/function.js +1 -1
- package/lib/aws/storage/notification-targets/queue.js +17 -21
- package/lib/aws/storage/origin-access-identity.js +1 -1
- package/lib/aws/storage/parameter.js +2 -2
- package/lib/aws/storage/table.js +3 -3
- package/lib/aws/storage/util.d.ts +0 -10
- package/lib/aws/storage/util.js +4 -91
- package/lib/bundling.js +3 -3
- package/lib/construct-base.js +2 -2
- package/lib/duration.js +1 -1
- package/lib/errors.js +1 -1
- package/lib/expiration.js +1 -1
- package/lib/fs/ignore.js +4 -4
- package/lib/fs/index.js +1 -1
- package/lib/helpers-internal/index.d.ts +1 -0
- package/lib/helpers-internal/index.js +16 -1
- package/lib/helpers-internal/validate-all-props.d.ts +29 -0
- package/lib/helpers-internal/validate-all-props.js +23 -0
- package/lib/size.js +1 -1
- package/lib/stack-base.d.ts +21 -5
- package/lib/stack-base.js +68 -5
- package/lib/terra-func.js +1 -1
- package/lib/time-zone.js +1 -1
- package/package.json +3 -1
- package/lib/aws/compute/lb-shared/access-logs-accounts.d.ts +0 -7
- package/lib/aws/compute/lb-shared/access-logs-accounts.js +0 -46
- package/lib/aws/notify/queue-config.generated.d.ts +0 -98
- package/lib/aws/notify/queue-config.generated.js +0 -3
- package/lib/aws/partition.d.ts +0 -21
- package/lib/aws/partition.js +0 -42
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
exports.EventType = exports.BucketEncryption = exports.StorageClass = exports.Bucket = exports.BucketBase = void 0;
|
|
5
5
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
6
|
const node_os_1 = require("node:os");
|
|
7
|
+
const region_info_1 = require("@aws-cdk/region-info");
|
|
7
8
|
const provider_aws_1 = require("@cdktf/provider-aws");
|
|
8
9
|
const provider_time_1 = require("@cdktf/provider-time");
|
|
9
10
|
const cdktf_1 = require("cdktf");
|
|
@@ -15,6 +16,7 @@ const origin_access_identity_1 = require("./origin-access-identity");
|
|
|
15
16
|
const aws_construct_1 = require("../aws-construct");
|
|
16
17
|
const aws_stack_1 = require("../aws-stack");
|
|
17
18
|
const util_1 = require("./util");
|
|
19
|
+
const errors_1 = require("../../errors");
|
|
18
20
|
const kms = require("../encryption");
|
|
19
21
|
const iam = require("../iam");
|
|
20
22
|
class BucketBase extends aws_construct_1.AwsConstructBase {
|
|
@@ -154,7 +156,7 @@ class BucketBase extends aws_construct_1.AwsConstructBase {
|
|
|
154
156
|
// */
|
|
155
157
|
// public grantPublicAccess(keyPrefix = "*", ...allowedActions: string[]) {
|
|
156
158
|
// if (!this.public) {
|
|
157
|
-
// throw new
|
|
159
|
+
// throw new ValidationError("Cannot grant public access when 'public' is enabled", this);
|
|
158
160
|
// }
|
|
159
161
|
// // TDOO: This should create publicAccess resource
|
|
160
162
|
// allowedActions =
|
|
@@ -289,7 +291,7 @@ class BucketBase extends aws_construct_1.AwsConstructBase {
|
|
|
289
291
|
const indexedSource = this.sources.find((sourceIndex) => sourceIndex.props === props);
|
|
290
292
|
if (indexedSource) {
|
|
291
293
|
if (sourceId && sourceId !== indexedSource.id) {
|
|
292
|
-
throw new
|
|
294
|
+
throw new errors_1.ValidationError(`Duplicate bucket source for ${indexedSource.id} and ${sourceId}.`, this);
|
|
293
295
|
}
|
|
294
296
|
return indexedSource.id;
|
|
295
297
|
}
|
|
@@ -297,7 +299,7 @@ class BucketBase extends aws_construct_1.AwsConstructBase {
|
|
|
297
299
|
const id = sourceId ?? `source-${nextIndex}`;
|
|
298
300
|
// ensure id (if provided) is unique within Bucket
|
|
299
301
|
if (this.sources.some((sourceIndex) => sourceIndex.id === id)) {
|
|
300
|
-
throw new
|
|
302
|
+
throw new errors_1.ValidationError(`Duplicate source id ${id}. SourceIds must be unique within a Bucket.`, this);
|
|
301
303
|
}
|
|
302
304
|
this.sources.push({
|
|
303
305
|
props: {
|
|
@@ -399,7 +401,7 @@ class BucketBase extends aws_construct_1.AwsConstructBase {
|
|
|
399
401
|
}
|
|
400
402
|
exports.BucketBase = BucketBase;
|
|
401
403
|
_a = JSII_RTTI_SYMBOL_1;
|
|
402
|
-
BucketBase[_a] = { fqn: "terraconstructs.aws.storage.BucketBase", version: "0.
|
|
404
|
+
BucketBase[_a] = { fqn: "terraconstructs.aws.storage.BucketBase", version: "0.2.0" };
|
|
403
405
|
/**
|
|
404
406
|
* The `Bucket` provides an [AWS S3 Bucket](https://aws.amazon.com/s3/).
|
|
405
407
|
*
|
|
@@ -441,21 +443,18 @@ class Bucket extends BucketBase {
|
|
|
441
443
|
static fromBucketAttributes(scope, id, attrs) {
|
|
442
444
|
const stack = aws_stack_1.AwsStack.ofAwsConstruct(scope);
|
|
443
445
|
const region = attrs.region ?? stack.region;
|
|
444
|
-
const
|
|
446
|
+
const regionInfo = region_info_1.RegionInfo.get(region);
|
|
447
|
+
const urlSuffix = regionInfo.domainSuffix ?? stack.urlSuffix;
|
|
445
448
|
const bucketName = (0, util_1.parseBucketName)(scope, attrs);
|
|
446
449
|
if (!bucketName) {
|
|
447
|
-
throw new
|
|
450
|
+
throw new errors_1.ValidationError("Bucket name is required", scope);
|
|
448
451
|
}
|
|
449
452
|
Bucket.validateBucketName(bucketName, true);
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
// regionInformation.FactName.S3_STATIC_WEBSITE_ENDPOINT,
|
|
456
|
-
// newEndpoint,
|
|
457
|
-
// ),
|
|
458
|
-
// });
|
|
453
|
+
const newEndpoint = `s3-website.${region}.${urlSuffix}`;
|
|
454
|
+
const staticDomainEndpoint = regionInfo.s3StaticWebsiteEndpoint ??
|
|
455
|
+
cdktf_1.Lazy.stringValue({
|
|
456
|
+
produce: () => stack.regionalFact(region_info_1.FactName.S3_STATIC_WEBSITE_ENDPOINT, newEndpoint),
|
|
457
|
+
});
|
|
459
458
|
const websiteDomain = `${bucketName}.${staticDomainEndpoint}`;
|
|
460
459
|
class Import extends BucketBase {
|
|
461
460
|
constructor() {
|
|
@@ -488,7 +487,11 @@ class Bucket extends BucketBase {
|
|
|
488
487
|
// protected notificationsHandlerRole = attrs.notificationsHandlerRole;
|
|
489
488
|
}
|
|
490
489
|
get hostedZoneId() {
|
|
491
|
-
|
|
490
|
+
const { s3StaticWebsiteHostedZoneId } = region_info_1.RegionInfo.get(region);
|
|
491
|
+
if (!s3StaticWebsiteHostedZoneId) {
|
|
492
|
+
throw new errors_1.ValidationError(`No hosted zone ID found for S3 static website in region: ${region}`, this);
|
|
493
|
+
}
|
|
494
|
+
return s3StaticWebsiteHostedZoneId;
|
|
492
495
|
}
|
|
493
496
|
isWebsite() {
|
|
494
497
|
return attrs.isWebsite ?? false;
|
|
@@ -551,7 +554,7 @@ class Bucket extends BucketBase {
|
|
|
551
554
|
errors.push("Bucket name must not resemble an IP address");
|
|
552
555
|
}
|
|
553
556
|
if (errors.length > 0) {
|
|
554
|
-
throw new
|
|
557
|
+
throw new errors_1.UnscopedValidationError(`Invalid S3 bucket name (value: ${bucketName})${node_os_1.EOL}${errors.join(node_os_1.EOL)}`);
|
|
555
558
|
}
|
|
556
559
|
}
|
|
557
560
|
get bucketArn() {
|
|
@@ -585,7 +588,7 @@ class Bucket extends BucketBase {
|
|
|
585
588
|
const { websiteConfig, corsConfig, cloudfrontAccess } = props;
|
|
586
589
|
this._isWebsite = false;
|
|
587
590
|
if (props.bucketName && props.namePrefix) {
|
|
588
|
-
throw new
|
|
591
|
+
throw new errors_1.ValidationError("Cannot specify both 'bucketName' and 'namePrefix'. Use only one.", scope);
|
|
589
592
|
}
|
|
590
593
|
let bucketPrefix;
|
|
591
594
|
if (!props.bucketName) {
|
|
@@ -642,7 +645,7 @@ class Bucket extends BucketBase {
|
|
|
642
645
|
this.minimumTLSVersionStatement(props.minimumTLSVersion);
|
|
643
646
|
}
|
|
644
647
|
else if (props.minimumTLSVersion) {
|
|
645
|
-
throw new
|
|
648
|
+
throw new errors_1.ValidationError("'enforceSSL' must be enabled for 'minimumTLSVersion' to be applied", this);
|
|
646
649
|
}
|
|
647
650
|
if (websiteConfig && websiteConfig.enabled) {
|
|
648
651
|
this._isWebsite = true;
|
|
@@ -753,12 +756,12 @@ class Bucket extends BucketBase {
|
|
|
753
756
|
if (encryptionType !== BucketEncryption.DSSE &&
|
|
754
757
|
encryptionType !== BucketEncryption.KMS &&
|
|
755
758
|
props.encryptionKey) {
|
|
756
|
-
throw new
|
|
759
|
+
throw new errors_1.ValidationError(`encryptionKey is specified, so 'encryption' must be set to KMS or DSSE (value: ${encryptionType})`, this);
|
|
757
760
|
}
|
|
758
761
|
// if bucketKeyEnabled is set, encryption can not be BucketEncryption.UNENCRYPTED
|
|
759
762
|
if (props.bucketKeyEnabled &&
|
|
760
763
|
encryptionType === BucketEncryption.UNENCRYPTED) {
|
|
761
|
-
throw new
|
|
764
|
+
throw new errors_1.ValidationError(`bucketKeyEnabled is specified, so 'encryption' must be set to KMS, DSSE or S3 (value: ${encryptionType})`, this);
|
|
762
765
|
}
|
|
763
766
|
if (encryptionType === BucketEncryption.UNENCRYPTED) {
|
|
764
767
|
return { bucketEncryption: undefined, encryptionKey: undefined };
|
|
@@ -852,7 +855,7 @@ class Bucket extends BucketBase {
|
|
|
852
855
|
},
|
|
853
856
|
};
|
|
854
857
|
}
|
|
855
|
-
throw new
|
|
858
|
+
throw new errors_1.ValidationError(`Unexpected 'encryptionType': ${encryptionType}`, this);
|
|
856
859
|
}
|
|
857
860
|
/**
|
|
858
861
|
* Adds an iam statement to enforce SSL requests only.
|
|
@@ -898,7 +901,7 @@ class Bucket extends BucketBase {
|
|
|
898
901
|
}
|
|
899
902
|
exports.Bucket = Bucket;
|
|
900
903
|
_b = JSII_RTTI_SYMBOL_1;
|
|
901
|
-
Bucket[_b] = { fqn: "terraconstructs.aws.storage.Bucket", version: "0.
|
|
904
|
+
Bucket[_b] = { fqn: "terraconstructs.aws.storage.Bucket", version: "0.2.0" };
|
|
902
905
|
/**
|
|
903
906
|
* Storage class to move an object to
|
|
904
907
|
*/
|
|
@@ -1197,4 +1200,4 @@ var EventType;
|
|
|
1197
1200
|
*/
|
|
1198
1201
|
EventType["OBJECT_ACL_PUT"] = "s3:ObjectAcl:Put";
|
|
1199
1202
|
})(EventType || (exports.EventType = EventType = {}));
|
|
1200
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVja2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy9zdG9yYWdlL2J1Y2tldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFDQUE4QjtBQUM5QixzREFXNkI7QUFDN0Isd0RBQTZDO0FBQzdDLGlDQUE4QjtBQUk5QixpRUFBNkQ7QUFDN0Qsd0NBQXdDO0FBQ3hDLG1EQUErQztBQUMvQyxtREFBa0U7QUFHbEUscUVBQWdFO0FBRWhFLG9EQUkwQjtBQUMxQiw0Q0FBd0M7QUFDeEMsaUNBS2dCO0FBQ2hCLHFDQUFxQztBQUNyQyw4QkFBOEI7QUF3cEI5QixNQUFzQixVQUFXLFNBQVEsZ0NBQWdCO0lBY3ZELElBQVcsYUFBYTtRQUN0QixPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQ3JCLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUztZQUNuQixVQUFVLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUNqQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsd0JBQXdCO1lBQ2pELGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7WUFDekMsVUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ2hDLG9CQUFvQixFQUNsQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsa0NBQWtDO1lBQy9ELGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLFVBQVU7U0FDOUMsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFzQ0Qsa0VBQWtFO0lBQ2xFLG9HQUFvRztJQUNwRywrQ0FBK0M7SUFFL0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxRQUEyQixFQUFFO1FBQ3JFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBakMxQixnQkFBZ0I7UUFDQyxZQUFPLEdBQWtCLEVBQUUsQ0FBQztR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SCwwREFBNkMsQ0FBQTtJQUU3Qzs7Ozs7O09BTUc7SUFDSCwwREFBNkMsQ0FBQTtJQUU3Qzs7Ozs7O09BTUc7SUFDSCxrR0FBcUYsQ0FBQTtJQUVyRjs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILGtEQUFxQyxDQUFBO0lBRXJDOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0gsOERBQWlELENBQUE7SUFFakQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSCwwRkFBNkUsQ0FBQTtJQUU3RTs7Ozs7OztPQU9HO0lBQ0gsMERBQTZDLENBQUE7SUFFN0M7Ozs7Ozs7T0FPRztJQUNILG9FQUF1RCxDQUFBO0lBRXZEOzs7Ozs7O09BT0c7SUFDSCw4REFBaUQsQ0FBQTtJQUVqRDs7OztPQUlHO0lBQ0gsOEVBQWlFLENBQUE7SUFFakU7OztPQUdHO0lBQ0gsbUdBQXNGLENBQUE7SUFFdEY7Ozs7T0FJRztJQUNILCtGQUFrRixDQUFBO0lBRWxGOzs7O09BSUc7SUFDSCxrSEFBcUcsQ0FBQTtJQUVyRzs7OztPQUlHO0lBQ0gscUZBQXdFLENBQUE7SUFFeEU7OztPQUdHO0lBQ0gsOERBQWlELENBQUE7SUFFakQ7Ozs7O09BS0c7SUFDSCwwRUFBNkQsQ0FBQTtJQUU3RDs7OztPQUlHO0lBQ0gsc0dBQXlGLENBQUE7SUFFekY7OztPQUdHO0lBQ0gsNERBQStDLENBQUE7SUFFL0M7Ozs7T0FJRztJQUNILDBEQUE2QyxDQUFBO0lBRTdDOzs7T0FHRztJQUNILGtEQUFxQyxDQUFBO0lBRXJDOzs7O09BSUc7SUFDSCx3REFBMkMsQ0FBQTtJQUUzQzs7O09BR0c7SUFDSCw4REFBaUQsQ0FBQTtJQUVqRDs7Ozs7T0FLRztJQUNILGdEQUFtQyxDQUFBO0FBQ3JDLENBQUMsRUE3TlcsU0FBUyx5QkFBVCxTQUFTLFFBNk5wQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVPTCB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQge1xuICBzM0J1Y2tldCxcbiAgczNCdWNrZXRBY2wsXG4gIHMzQnVja2V0Q29yc0NvbmZpZ3VyYXRpb24sXG4gIHMzQnVja2V0T3duZXJzaGlwQ29udHJvbHMsXG4gIHMzQnVja2V0UHVibGljQWNjZXNzQmxvY2ssXG4gIHMzQnVja2V0V2Vic2l0ZUNvbmZpZ3VyYXRpb24sXG4gIHMzQnVja2V0TGlmZWN5Y2xlQ29uZmlndXJhdGlvbixcbiAgczNCdWNrZXRWZXJzaW9uaW5nLFxuICBzM0J1Y2tldFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbixcbiAgZGF0YUF3c1MzQnVja2V0LFxufSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLXRpbWVcIjtcbmltcG9ydCB7IFRva2VuIH0gZnJvbSBcImNka3RmXCI7XG4vLyBpbXBvcnQgeyBGbiB9IGZyb20gXCIuLi8uLi90ZXJyYS1mdW5jXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uIH0gZnJvbSBcIi4vYnVja2V0LWRlc3RpbmF0aW9uXCI7XG5pbXBvcnQgeyBCdWNrZXROb3RpZmljYXRpb25zIH0gZnJvbSBcIi4vYnVja2V0LW5vdGlmaWNhdGlvbnNcIjtcbmltcG9ydCAqIGFzIHBlcm1zIGZyb20gXCIuL2J1Y2tldC1wZXJtc1wiO1xuaW1wb3J0IHsgQnVja2V0UG9saWN5IH0gZnJvbSBcIi4vYnVja2V0LXBvbGljeVwiO1xuaW1wb3J0IHsgQnVja2V0U291cmNlLCBCdWNrZXRTb3VyY2VQcm9wcyB9IGZyb20gXCIuL2J1Y2tldC1zb3VyY2VcIjtcbmltcG9ydCB7IENvcnNDb25maWcgfSBmcm9tIFwiLi9jb3JzLWNvbmZpZy5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IExpZmVjeWNsZUNvbmZpZ3VyYXRpb25SdWxlIH0gZnJvbSBcIi4vbGlmZWN5Y2xlLWNvbmZpZy5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IE9yaWdpbkFjY2Vzc0lkZW50aXR5IH0gZnJvbSBcIi4vb3JpZ2luLWFjY2Vzcy1pZGVudGl0eVwiO1xuaW1wb3J0IHsgV2Vic2l0ZUNvbmZpZyB9IGZyb20gXCIuL3dlYnNpdGUtY29uZmlnLmdlbmVyYXRlZFwiO1xuaW1wb3J0IHtcbiAgQXdzQ29uc3RydWN0QmFzZSxcbiAgSUF3c0NvbnN0cnVjdCxcbiAgQXdzQ29uc3RydWN0UHJvcHMsXG59IGZyb20gXCIuLi9hd3MtY29uc3RydWN0XCI7XG5pbXBvcnQgeyBBd3NTdGFjayB9IGZyb20gXCIuLi9hd3Mtc3RhY2tcIjtcbmltcG9ydCB7XG4gIHMzU3RhdGljV2Vic2l0ZUVuZHBvaW50LFxuICBzM1N0YXRpY1dlYnNpdGVIb3N0ZWRab25lSWQsXG4gIHBhcnNlQnVja2V0TmFtZSxcbiAgcGFyc2VCdWNrZXRBcm4sXG59IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCAqIGFzIGttcyBmcm9tIFwiLi4vZW5jcnlwdGlvblwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCIuLi9pYW1cIjtcblxuZXhwb3J0IGludGVyZmFjZSBDbG91ZGZyb250QWNjZXNzQ29uZmlnIHtcbiAgLyoqXG4gICAqIEVuYWJsZSBDbG91ZGZyb250IGFjY2VzcyB2aWEgT3JpZ2luIEFjY2VzcyBJZGVudGl0eS5cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBPYmplY3Qga2V5IHBhdHRlcm5zIGZvciBjbG91ZGZyb250IGFjY2Vzcy5cbiAgICpcbiAgICogQGRlZmF1bHQgXCIqXCJcbiAgICovXG4gIHJlYWRvbmx5IGtleVBhdHRlcm5zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSByZWZlcmVuY2UgdG8gYSBidWNrZXQgb3V0c2lkZSB0aGlzIHN0YWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0QXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBidWNrZXQuIEF0IGxlYXN0IG9uZSBvZiBidWNrZXRBcm4gb3IgYnVja2V0TmFtZSBtdXN0IGJlXG4gICAqIGRlZmluZWQgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSBhIGJ1Y2tldCByZWYuXG4gICAqL1xuICByZWFkb25seSBidWNrZXRBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBidWNrZXQuIElmIHRoZSB1bmRlcmx5aW5nIHZhbHVlIG9mIEFSTiBpcyBhIHN0cmluZywgdGhlXG4gICAqIG5hbWUgd2lsbCBiZSBwYXJzZWQgZnJvbSB0aGUgQVJOLiBPdGhlcndpc2UsIHRoZSBuYW1lIGlzIG9wdGlvbmFsLCBidXRcbiAgICogc29tZSBmZWF0dXJlcyB0aGF0IHJlcXVpcmUgdGhlIGJ1Y2tldCBuYW1lIHN1Y2ggYXMgYXV0by1jcmVhdGluZyBhIGJ1Y2tldFxuICAgKiBwb2xpY3ksIHdvbid0IHdvcmsuXG4gICAqL1xuICByZWFkb25seSBidWNrZXROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9tYWluIG5hbWUgb2YgdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJbmZlcnJlZCBmcm9tIGJ1Y2tldCBuYW1lXG4gICAqL1xuICByZWFkb25seSBidWNrZXREb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd2Vic2l0ZSBVUkwgb2YgdGhlIGJ1Y2tldCAoaWYgc3RhdGljIHdlYiBob3N0aW5nIGlzIGVuYWJsZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEluZmVycmVkIGZyb20gYnVja2V0IG5hbWUgYW5kIHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0V2Vic2l0ZVVybD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlZ2lvbmFsIGRvbWFpbiBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgYnVja2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0UmVnaW9uYWxEb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVB2NiBETlMgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGJ1Y2tldC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldER1YWxTdGFja0RvbWFpbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEtNUyBlbmNyeXB0aW9uIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZW5jcnlwdGlvbiBrZXlcbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogSWYgdGhpcyBidWNrZXQgaGFzIGJlZW4gY29uZmlndXJlZCBmb3Igc3RhdGljIHdlYnNpdGUgaG9zdGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGlzV2Vic2l0ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBhY2NvdW50IHRoaXMgZXhpc3RpbmcgYnVja2V0IGJlbG9uZ3MgdG8uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gaXQncyBhc3N1bWVkIHRoZSBidWNrZXQgYmVsb25ncyB0byB0aGUgc2FtZSBhY2NvdW50IGFzIHRoZSBzY29wZSBpdCdzIGJlaW5nIGltcG9ydGVkIGludG9cbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gdGhpcyBleGlzdGluZyBidWNrZXQgaXMgaW4uXG4gICAqIEZlYXR1cmVzIHRoYXQgcmVxdWlyZSB0aGUgcmVnaW9uIChlLmcuIGBidWNrZXRXZWJzaXRlVXJsYCkgd29uJ3QgZnVsbHkgd29ya1xuICAgKiBpZiB0aGUgcmVnaW9uIGNhbm5vdCBiZSBjb3JyZWN0bHkgaW5mZXJyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gaXQncyBhc3N1bWVkIHRoZSBidWNrZXQgaXMgaW4gdGhlIHNhbWUgcmVnaW9uIGFzIHRoZSBzY29wZSBpdCdzIGJlaW5nIGltcG9ydGVkIGludG9cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcblxuICAvLyBUT0RPOiBVc2UgQ3VzdG9tIFJlc291cmNlIGZvciB3aXRoTm90aWZpY2F0aW9ucygpIHN1cHBvcnRcbiAgLy8gLyoqXG4gIC8vICAqIFRoZSByb2xlIHRvIGJlIHVzZWQgYnkgdGhlIG5vdGlmaWNhdGlvbnMgaGFuZGxlclxuICAvLyAgKlxuICAvLyAgKiBAZGVmYXVsdCAtIGEgbmV3IHJvbGUgd2lsbCBiZSBjcmVhdGVkLlxuICAvLyAgKi9cbiAgLy8gcmVhZG9ubHkgbm90aWZpY2F0aW9uc0hhbmRsZXJSb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBidWNrZXQgaXMgcHVibGljIG9yIG5vdC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpYz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGJ1Y2tldCBoYXMgdmVyc2lvbmluZyBlbmFibGVkXG4gICAqXG4gICAqIElmIHlvdSBhcmUgZW5hYmxpbmcgdmVyc2lvbmluZyBvbiB0aGUgYnVja2V0IGZvciB0aGUgZmlyc3QgdGltZSwgQVdTIHJlY29tbWVuZHMgdGhhdFxuICAgKiB5b3Ugd2FpdCBmb3IgMTUgbWludXRlcyBhZnRlciBlbmFibGluZyB2ZXJzaW9uaW5nIGJlZm9yZSBpc3N1aW5nIHdyaXRlIG9wZXJhdGlvbnNcbiAgICogKFBVVCBvciBERUxFVEUpIG9uIG9iamVjdHMgaW4gdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogVGhpcyB3aWxsIGNhdXNlIDE1bSBkZWxheSBpZiBgcGF0aGAgaXMgY29uZmlndXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25lZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpYWwgQ2xvdWRGcm9udCB1c2VyIHRoYXQgeW91IGNhbiBhc3NvY2lhdGUgd2l0aCBBbWF6b24gUzMgb3JpZ2lucywgc28gdGhhdCB5b3UgY2FuIHNlY3VyZSBhbGwgb3IganVzdCBzb21lIG9mXG4gICAqIHlvdXIgQW1hem9uIFMzIGNvbnRlbnQuXG4gICAqXG4gICAqIFJlcXVpcmVkIHRvIHVzZSB0aGUgaW1wb3J0ZWQgYnVja2V0IGluIGEgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5BY2Nlc3NJZGVudGl0eT86IE9yaWdpbkFjY2Vzc0lkZW50aXR5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFByb3BzIGV4dGVuZHMgQXdzQ29uc3RydWN0UHJvcHMge1xuICAvKipcbiAgICogVGhlIGtpbmQgb2Ygc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB0byBhcHBseSB0byB0aGlzIGJ1Y2tldC5cbiAgICpcbiAgICogSWYgeW91IGNob29zZSBLTVMsIHlvdSBjYW4gc3BlY2lmeSBhIEtNUyBrZXkgdmlhIGBlbmNyeXB0aW9uS2V5YC4gSWZcbiAgICogZW5jcnlwdGlvbiBrZXkgaXMgbm90IHNwZWNpZmllZCwgYSBrZXkgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYEtNU2AgaWYgYGVuY3J5cHRpb25LZXlgIGlzIHNwZWNpZmllZCwgb3IgYFVORU5DUllQVEVEYCBvdGhlcndpc2UuXG4gICAqIEJ1dCBpZiBgVU5FTkNSWVBURURgIGlzIHNwZWNpZmllZCwgdGhlIGJ1Y2tldCB3aWxsIGJlIGVuY3J5cHRlZCBhcyBgUzNfTUFOQUdFRGAgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb24/OiBCdWNrZXRFbmNyeXB0aW9uO1xuXG4gIC8qKlxuICAgKiBFeHRlcm5hbCBLTVMga2V5IHRvIHVzZSBmb3IgYnVja2V0IGVuY3J5cHRpb24uXG4gICAqXG4gICAqIFRoZSBgZW5jcnlwdGlvbmAgcHJvcGVydHkgbXVzdCBiZSBlaXRoZXIgbm90IHNwZWNpZmllZCBvciBzZXQgdG8gYEtNU2Agb3IgYERTU0VgLlxuICAgKiBBbiBlcnJvciB3aWxsIGJlIGVtaXR0ZWQgaWYgYGVuY3J5cHRpb25gIGlzIHNldCB0byBgVU5FTkNSWVBURURgIG9yIGBTM19NQU5BR0VEYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiBgZW5jcnlwdGlvbmAgaXMgc2V0IHRvIGBLTVNgIGFuZCB0aGlzIHByb3BlcnR5IGlzIHVuZGVmaW5lZCxcbiAgICogYSBuZXcgS01TIGtleSB3aWxsIGJlIGNyZWF0ZWQgYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1Y2tldC5cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogV2hldGhlciBBbWF6b24gUzMgc2hvdWxkIHVzZSBpdHMgb3duIGludGVybWVkaWFyeSBrZXkgdG8gZ2VuZXJhdGUgZGF0YSBrZXlzLlxuICAgKlxuICAgKiBPbmx5IHJlbGV2YW50IHdoZW4gdXNpbmcgS01TIGZvciBlbmNyeXB0aW9uLlxuICAgKlxuICAgKiAtIElmIG5vdCBlbmFibGVkLCBldmVyeSBvYmplY3QgR0VUIGFuZCBQVVQgd2lsbCBjYXVzZSBhbiBBUEkgY2FsbCB0byBLTVMgKHdpdGggdGhlXG4gICAqICAgYXR0ZW5kYW50IGNvc3QgaW1wbGljYXRpb25zIG9mIHRoYXQpLlxuICAgKiAtIElmIGVuYWJsZWQsIFMzIHdpbGwgdXNlIGl0cyBvd24gdGltZS1saW1pdGVkIGtleSBpbnN0ZWFkLlxuICAgKlxuICAgKiBPbmx5IHJlbGV2YW50LCB3aGVuIEVuY3J5cHRpb24gaXMgbm90IHNldCB0byBgQnVja2V0RW5jcnlwdGlvbi5VTkVOQ1JZUFRFRGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldEtleUVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aChzKSB0byBzdGF0aWMgZGlyZWN0b3JpZXMgb3IgZmlsZXMgdG8gdXBsb2FkLCByZWxhdGl2ZSB0byB0aGUgU3RhY2sgZmlsZS5cbiAgICpcbiAgICogQGV4YW1wbGUgXCIuL2Rpc3RcIlxuICAgKiBAZGVmYXVsdCAtIE5vIGZpbGVzIGFyZSB1cGxvYWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZXM/OiBzdHJpbmcgfCBzdHJpbmdbXSB8IEFkZFNvdXJjZU9wdGlvbnNbXTtcblxuICAvLyBUT0RPOiBBZGQgc3VwcG9ydCB0byBwYXNzIGRvbWFpbiBwcm9wcyAoZm9yIHJvdXRlNTMgYWxpYXM/KVxuXG4gIC8qKlxuICAgKiBFbmFibGUgcHVibGljIHJlYWQgYWNjZXNzIGZvciBhbGwgdGhlIGZpbGVzIGluIHRoZSBidWNrZXQuXG4gICAqXG4gICAqIEVuYWJsZSB0aGlzIG9ubHkgaWYgeW91J3JlIG5vdCB1c2luZyBDRE4gKENsb3VkRnJvbnQpIHRvIHNlcnZlIGZpbGVzIGZyb20gdGhlIGJ1Y2tldC5cbiAgICogU2hvdWxkIG9ubHkgYmUgdHVybmVkIG9uIGlmIHlvdSB3YW50IHRvIGhvc3QgcHVibGljIGZpbGVzIGRpcmVjdGx5IGZyb20gdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBuYW1lIGZvciB0aGUgYnVja2V0LlxuICAgKlxuICAgKiBNdXN0IGJlIGxvd2VyY2FzZSBhbmQgYmV0d2VlbiAzIChtaW4pIGFuZCA2MyAobWF4KSBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqXG4gICAqIFRoZSBuYW1lIG11c3Qgbm90IGJlIGluIHRoZSBmb3JtYXQgW2J1Y2tldF9uYW1lXS0tW2F6aWRdLS14LXMzLiBVc2UgdGhlXG4gICAqIGBhd3NfczNfZGlyZWN0b3J5X2J1Y2tldGAgcmVzb3VyY2UgdG8gbWFuYWdlIFMzIEV4cHJlc3MgYnVja2V0cy5cbiAgICpcbiAgICogQSBmdWxsIGxpc3Qgb2YgYnVja2V0IG5hbWluZyBydWxlcyBbbWF5IGJlIGZvdW5kIGhlcmVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2J1Y2tldG5hbWluZ3J1bGVzLmh0bWwpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIG9taXR0ZWQsIFJlZmVyIHRvIGBuYW1lUHJlZml4YC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB1bmlxdWUgbmFtZSBiZWdpbm5pbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeC5cbiAgICogQ29uZmxpY3RzIHdpdGggYGJ1Y2tldE5hbWVgLlxuICAgKlxuICAgKiBUZXJyYWZvcm0gUHJlZml4ZXMgbXVzdCByZXNlcnZlIDI2IGNoYXJhY3RlcnMgZm9yIHRoZSB0ZXJyYWZvcm0gZ2VuZXJhdGVkIHN1ZmZpeC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiBvbWl0dGVkLCBFVCB3aWxsIGFzc2lnbiBhIHJhbmRvbSwgdW5pcXVlIG5hbWUgcHJlZml4ZWQgYnkgR3JpZFVVSUQuXG4gICAqL1xuICByZWFkb25seSBuYW1lUHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCb29sZWFuIHRoYXQgaW5kaWNhdGVzIGFsbCBvYmplY3RzIChpbmNsdWRpbmcgYW55IGxvY2tlZCBvYmplY3RzKVxuICAgKiBzaG91bGQgYmUgZGVsZXRlZCBmcm9tIHRoZSBidWNrZXQgd2hlbiB0aGUgYnVja2V0IGlzIGRlc3Ryb3llZFxuICAgKiBzbyB0aGF0IHRoZSBidWNrZXQgY2FuIGJlIGRlc3Ryb3llZCB3aXRob3V0IGVycm9yLlxuICAgKlxuICAgKiBUaGVzZSBvYmplY3RzIGFyZSBub3QgcmVjb3ZlcmFibGUuIFRoaXMgb25seSBkZWxldGVzIG9iamVjdHMgd2hlblxuICAgKiB0aGUgYnVja2V0IGlzIGRlc3Ryb3llZCwgbm90IHdoZW4gc2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byB0cnVlLlxuICAgKlxuICAgKiBPbmNlIHRoaXMgcGFyYW1ldGVyIGlzIHNldCB0byB0cnVlLCB0aGVyZSBtdXN0IGJlIGEgc3VjY2Vzc2Z1bFxuICAgKiB0ZXJyYWZvcm0gYXBwbHkgcnVuIGJlZm9yZSBhIGRlc3Ryb3kgaXMgcmVxdWlyZWQgdG8gdXBkYXRlIHRoaXNcbiAgICogdmFsdWUgaW4gdGhlIHJlc291cmNlIHN0YXRlLlxuICAgKlxuICAgKiBXaXRob3V0IGEgc3VjY2Vzc2Z1bCB0ZXJyYWZvcm0gYXBwbHkgYWZ0ZXIgdGhpcyBwYXJhbWV0ZXIgaXMgc2V0LFxuICAgKiB0aGlzIGZsYWcgd2lsbCBoYXZlIG5vIGVmZmVjdC4gSWYgc2V0dGluZyB0aGlzIGZpZWxkIGluIHRoZSBzYW1lXG4gICAqIG9wZXJhdGlvbiB0aGF0IHdvdWxkIHJlcXVpcmUgcmVwbGFjaW5nIHRoZSBidWNrZXQgb3IgZGVzdHJveWluZ1xuICAgKiB0aGUgYnVja2V0LCB0aGlzIGZsYWcgd2lsbCBub3Qgd29yay5cbiAgICpcbiAgICogQWRkaXRpb25hbGx5IHdoZW4gaW1wb3J0aW5nIGEgYnVja2V0LCBhIHN1Y2Nlc3NmdWwgdGVycmFmb3JtIGFwcGx5XG4gICAqIGlzIHJlcXVpcmVkIHRvIHNldCB0aGlzIHZhbHVlIGluIHN0YXRlIGJlZm9yZSBpdCB3aWxsIHRha2UgZWZmZWN0XG4gICAqIG9uIGEgZGVzdHJveSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmb3JjZURlc3Ryb3k/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhbiBTMyBidWNrZXQgd2Vic2l0ZSBjb25maWd1cmF0aW9uIHJlc291cmNlLlxuICAgKlxuICAgKiBJbXBvcnRhbnQ6IEFtYXpvbiBTMyB3ZWJzaXRlIGVuZHBvaW50cyBkbyBub3Qgc3VwcG9ydCBIVFRQUyBvciBhY2Nlc3MgcG9pbnRzLlxuICAgKiBJZiB5b3Ugd2FudCB0byB1c2UgSFRUUFMsIHlvdSBjYW4gdXNlIGVkZ2UgRGlzdHJpYnV0aW9uIHRvIHNlcnZlIGEgc3RhdGljXG4gICAqIHdlYnNpdGUgaG9zdGVkIGluIGEgYnVja2V0LlxuICAgKlxuICAgKiBVc2UgT3JpZ2luQWNjZXNzSWRlbnRpdHkgcHJvcGVydHkgdG8gY29udHJvbCBpbmdyZXNzIHRocm91Z2ggZWRnZSBEaXN0cmlidXRpb24uXG4gICAqXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0hvc3RpbmcgV2Vic2l0ZXMgb24gUzNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L1dlYnNpdGVIb3N0aW5nLmh0bWwpLlxuICAgKi9cbiAgcmVhZG9ubHkgd2Vic2l0ZUNvbmZpZz86IFdlYnNpdGVDb25maWc7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGFuIFMzIGJ1Y2tldCBDT1JTIGNvbmZpZ3VyYXRpb24gcmVzb3VyY2UuXG4gICAqXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IENPUlMsIGdvIHRvXG4gICAqIFtFbmFibGluZyBDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZ10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvY29ycy5odG1sKVxuICAgKiBpbiB0aGUgQW1hem9uIFMzIFVzZXIgR3VpZGUuXG4gICAqL1xuICByZWFkb25seSBjb3JzQ29uZmlnPzogQ29yc0NvbmZpZztcblxuICAvKipcbiAgICogT25lIG9yIG1vcmUgTGlmZWN5Y2xlIHJ1bGVzLiBFYWNoIHJ1bGUgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZzpcbiAgICpcbiAgICogIC0gUnVsZSBpZFxuICAgKiAgLSBGaWx0ZXIgaWRlbnRpZnlpbmcgb2JqZWN0cyB0byB3aGljaCB0aGUgcnVsZSBhcHBsaWVzXG4gICAqICAtIE9uZSBvciBtb3JlIHRyYW5zaXRpb24gb3IgZXhwaXJhdGlvbiBhY3Rpb25zXG4gICAqXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgQW1hem9uIFMzIFVzZXIgR3VpZGUgb24gW0xpZmVjeWNsZSBDb25maWd1cmF0aW9uIEVsZW1lbnRzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9pbnRyby1saWZlY3ljbGUtcnVsZXMuaHRtbCkuXG4gICAqL1xuICByZWFkb25seSBsaWZlY3ljbGVSdWxlcz86IExpZmVjeWNsZUNvbmZpZ3VyYXRpb25SdWxlW107XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHZlcnNpb25pbmcgb24gdGhlIFMzIGJ1Y2tldC5cbiAgICpcbiAgICogU2V0dGluZyB0aGlzIHRvIGZhbHNlIHdpbGwgc3VzcGVuZCB2ZXJzaW9uaW5nIGlmIHRoZSBhc3NvY2lhdGVkIFMzIGJ1Y2tldCBpcyB2ZXJzaW9uZWQuXG4gICAqXG4gICAqIElmIHlvdSBhcmUgZW5hYmxpbmcgdmVyc2lvbmluZyBvbiB0aGUgYnVja2V0IGZvciB0aGUgZmlyc3QgdGltZSwgQVdTIHJlY29tbWVuZHMgdGhhdCB5b3Ugd2FpdCBmb3IgMTUgbWludXRlcyBhZnRlciBlbmFibGluZyB2ZXJzaW9uaW5nIGJlZm9yZSBpc3N1aW5nIHdyaXRlIG9wZXJhdGlvbnMgKFBVVCBvciBERUxFVEUpIG9uIG9iamVjdHMgaW4gdGhlIGJ1Y2tldC5cbiAgICogVGhpcyB3aWxsIGNhdXNlIDE1bSBkZWxheSBpZiBgcGF0aGAgaXMgY29uZmlndXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25lZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBidWNrZXQgc2hvdWxkIHNlbmQgbm90aWZpY2F0aW9ucyB0byBBbWF6b24gRXZlbnRCcmlkZ2Ugb3Igbm90LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZXZlbnRCcmlkZ2VFbmFibGVkPzogYm9vbGVhbjtcblxuICAvLyBUT0RPOiByZS1hZGQgT2JqZWN0T3duZXJzaGlwIGFuZCBCdWNrZXRBY2Nlc3NDb250cm9sXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0wxMjg0XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0wxNjQzXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0wxOTM2XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0wyMzYzXG4gIC8vIEJ1Y2tldEFjY2Vzc0NvbnRyb2xcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXMzL2xpYi9idWNrZXQudHMjTDI5MDVcblxuICAvKipcbiAgICogRW5mb3JjZXMgU1NMIGZvciByZXF1ZXN0cy4gUzMuNSBvZiB0aGUgQVdTIEZvdW5kYXRpb25hbCBTZWN1cml0eSBCZXN0IFByYWN0aWNlcyBSZWdhcmRpbmcgUzMuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NvbmZpZy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvczMtYnVja2V0LXNzbC1yZXF1ZXN0cy1vbmx5Lmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuZm9yY2VTU0w/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmZvcmNlcyBtaW5pbXVtIFRMUyB2ZXJzaW9uIGZvciByZXF1ZXN0cy5cbiAgICpcbiAgICogUmVxdWlyZXMgYGVuZm9yY2VTU0xgIHRvIGJlIGVuYWJsZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvYW1hem9uLXMzLXBvbGljeS1rZXlzLmh0bWwjZXhhbXBsZS1vYmplY3QtdGxzLXZlcnNpb25cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gbWluaW11bSBUTFMgdmVyc2lvbiBpcyBlbmZvcmNlZC5cbiAgICovXG4gIHJlYWRvbmx5IG1pbmltdW1UTFNWZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgQ2xvdWRmcm9udCBhY2Nlc3MgdmlhIE9yaWdpbiBBY2Nlc3MgSWRlbnRpdHkuXG4gICAqXG4gICAqIE5vdGU6IHJlY29tbWVuZGVkIHRvIG1pZ3JhdGUgdG8gT0FDIGluIGZ1dHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjbG91ZGZyb250IGFjY2Vzc1xuICAgKi9cbiAgcmVhZG9ubHkgY2xvdWRmcm9udEFjY2Vzcz86IENsb3VkZnJvbnRBY2Nlc3NDb25maWc7XG5cbiAgLy8gVE9ETzogQWRkIGZsYWcgdG8gcmVnaXN0ZXIgQnVja2V0IFNvdXJjZSBvdXRwdXRzP1xufVxuXG4vKipcbiAqIE91dHB1dHMgd2hpY2ggbWF5IGJlIHJlZ2lzdGVyZWQgZm9yIG91dHB1dCB2aWEgdGhlIEdyaWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0T3V0cHV0cyB7XG4gIC8qKlxuICAgKiBBV1MgQnVja2V0IG5hbWVcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBV1MgQnVja2V0IGFyblxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBhcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGUgc3RhdGljIHdlYnNpdGUuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdlYnNpdGVVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBEb21haW4gbmFtZSBvZiB0aGUgc3RhdGljIHdlYnNpdGUuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdlYnNpdGVEb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVB2NCBETlMgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGJ1Y2tldC5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZG9tYWluTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uYWwgZG9tYWluIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBidWNrZXQuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbmFsRG9tYWluTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcmlnaW4gQWNjZXNzIElkZW50aXR5LCBpZiBjbG91ZGZyb250QWNjZXNzIGlzIGVuYWJsZWQuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbkFjY2Vzc0lkZW50aXR5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLbXMgS2V5IG91dHB1dHMsIGlmIGJ1Y2tldCBoYXMgZW5jcnlwdGlvbi5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5LZXlPdXRwdXRzO1xufVxuXG4vKipcbiAqIEltcG9ydGVkIG9yIGNyZWF0ZWQgQnVja2V0IGF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQnVja2V0IGV4dGVuZHMgSUF3c0NvbnN0cnVjdCB7XG4gIC8qKiBTdHJvbmdseSB0eXBlZCBvdXRwdXRzICovXG4gIHJlYWRvbmx5IGJ1Y2tldE91dHB1dHM6IEJ1Y2tldE91dHB1dHM7XG5cbiAgLyoqXG4gICAqIEFXUyBCdWNrZXQgYXJuXG4gICAqL1xuICByZWFkb25seSBidWNrZXRBcm46IHN0cmluZztcblxuICAvKipcbiAgICogQVdTIEJ1Y2tldCBuYW1lXG4gICAqL1xuICByZWFkb25seSBidWNrZXROYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGJ1Y2tldCBoYXMgdmVyc2lvbmluZyBlbmFibGVkICovXG4gIHJlYWRvbmx5IHZlcnNpb25lZDogYm9vbGVhbjtcblxuICAvKiogVGhlIGhvc3RlZCBab25lIElkIGZvciB0aGUgYnVja2V0ICovXG4gIHJlYWRvbmx5IGhvc3RlZFpvbmVJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRG9tYWluIG5hbWUgb2YgdGhlIHN0YXRpYyB3ZWJzaXRlLlxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIFJvdXRlIDUzIGFsaWFzIHJlY29yZHMuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdlYnNpdGVEb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBidWNrZXQgaXMgcHVibGljIG9yIG5vdC5cbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpYz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIEtNUyBlbmNyeXB0aW9uIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBwb2xpY3kgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVja2V0LlxuICAgKlxuICAgKiBJZiBgYXV0b0NyZWF0ZVBvbGljeWAgaXMgdHJ1ZSwgYSBgQnVja2V0UG9saWN5YCB3aWxsIGJlIGNyZWF0ZWQgdXBvbiB0aGVcbiAgICogZmlyc3QgY2FsbCB0byBhZGRUb1Jlc291cmNlUG9saWN5KHMpLlxuICAgKi9cbiAgcG9saWN5PzogQnVja2V0UG9saWN5O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBzb3VyY2Ugb2YgZmlsZXMgZm9yIHVwbG9hZCB0byB0aGUgYnVja2V0LlxuICAgKi9cbiAgYWRkU291cmNlKHByb3BzOiBBZGRTb3VyY2VPcHRpb25zLCBzb3VyY2VJZD86IHN0cmluZyk6IHN0cmluZztcblxuICAvKipcbiAgICogSWYgdGhpcyBidWNrZXQgaGFzIGJlZW4gY29uZmlndXJlZCBmb3Igc3RhdGljIHdlYnNpdGUgaG9zdGluZy5cbiAgICovXG4gIGlzV2Vic2l0ZSgpOiB0aGlzIGlzIHtcbiAgICB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nO1xuICAgIGJ1Y2tldE91dHB1dHM6IHsgd2Vic2l0ZVVybDogc3RyaW5nOyB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBodHRwcyBVUkwgb2YgYW4gUzMgb2JqZWN0LiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogLSBgaHR0cHM6Ly9zMy51cy13ZXN0LTEuYW1hem9uYXdzLmNvbS9vbmx5YnVja2V0YFxuICAgKiAtIGBodHRwczovL3MzLnVzLXdlc3QtMS5hbWF6b25hd3MuY29tL2J1Y2tldC9rZXlgXG4gICAqIC0gYGh0dHBzOi8vczMuY24tbm9ydGgtMS5hbWF6b25hd3MuY29tLmNuL2NoaW5hLWJ1Y2tldC9teWtleWBcbiAgICogQHBhcmFtIGtleSBUaGUgUzMga2V5IG9mIHRoZSBvYmplY3QuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBVUkwgb2YgdGhlXG4gICAqICAgICAgYnVja2V0IGlzIHJldHVybmVkLlxuICAgKiBAcmV0dXJucyBhbiBPYmplY3RTM1VybCB0b2tlblxuICAgKi9cbiAgdXJsRm9yT2JqZWN0KGtleT86IHN0cmluZyk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFMzIFVSTCBvZiBhbiBTMyBvYmplY3QuIEZvciBleGFtcGxlOlxuICAgKiAtIGBzMzovL29ubHlidWNrZXRgXG4gICAqIC0gYHMzOi8vYnVja2V0L2tleWBcbiAgICogQHBhcmFtIGtleSBUaGUgUzMga2V5IG9mIHRoZSBvYmplY3QuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBTMyBVUkwgb2YgdGhlXG4gICAqICAgICAgYnVja2V0IGlzIHJldHVybmVkLlxuICAgKiBAcmV0dXJucyBhbiBPYmplY3RTM1VybCB0b2tlblxuICAgKi9cbiAgczNVcmxGb3JPYmplY3Qoa2V5Pzogc3RyaW5nKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIEFSTiB0aGF0IHJlcHJlc2VudHMgYWxsIG9iamVjdHMgd2l0aGluIHRoZSBidWNrZXQgdGhhdCBtYXRjaFxuICAgKiB0aGUga2V5IHBhdHRlcm4gc3BlY2lmaWVkLiBUbyByZXByZXNlbnQgYWxsIGtleXMsIHNwZWNpZnkgYGBcIipcImBgLlxuICAgKi9cbiAgYXJuRm9yT2JqZWN0cyhrZXlQYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzdGF0ZW1lbnQgdG8gdGhlIHJlc291cmNlIHBvbGljeSBmb3IgYSBwcmluY2lwYWwgKGkuZS5cbiAgICogYWNjb3VudC9yb2xlL3NlcnZpY2UpIHRvIHBlcmZvcm0gYWN0aW9ucyBvbiB0aGlzIGJ1Y2tldCBhbmQvb3IgaXRzXG4gICAqIGNvbnRlbnRzLiBVc2UgYGJ1Y2tldEFybmAgYW5kIGBhcm5Gb3JPYmplY3RzKGtleXMpYCB0byBvYnRhaW4gQVJOcyBmb3JcbiAgICogdGhpcyBidWNrZXQgb3Igb2JqZWN0cy5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBwb2xpY3kgc3RhdGVtZW50IG1heSBvciBtYXkgbm90IGJlIGFkZGVkIHRvIHRoZSBwb2xpY3kuXG4gICAqIEZvciBleGFtcGxlLCB3aGVuIGFuIGBJQnVja2V0YCBpcyBjcmVhdGVkIGZyb20gYW4gZXhpc3RpbmcgYnVja2V0LFxuICAgKiBpdCdzIG5vdCBwb3NzaWJsZSB0byB0ZWxsIHdoZXRoZXIgdGhlIGJ1Y2tldCBhbHJlYWR5IGhhcyBhIHBvbGljeVxuICAgKiBhdHRhY2hlZCwgbGV0IGFsb25lIHRvIHJlLXVzZSB0aGF0IHBvbGljeSB0byBhZGQgbW9yZSBzdGF0ZW1lbnRzIHRvIGl0LlxuICAgKiBTbyBpdCdzIHNhZmVzdCB0byBkbyBub3RoaW5nIGluIHRoZXNlIGNhc2VzLlxuICAgKlxuICAgKiBAcGFyYW0gcGVybWlzc2lvbiB0aGUgcG9saWN5IHN0YXRlbWVudCB0byBiZSBhZGRlZCB0byB0aGUgYnVja2V0J3NcbiAgICogcG9saWN5LlxuICAgKiBAcmV0dXJucyBtZXRhZGF0YSBhYm91dCB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWV0aG9kLiBJZiB0aGUgcG9saWN5XG4gICAqIHdhcyBub3QgYWRkZWQsIHRoZSB2YWx1ZSBvZiBgc3RhdGVtZW50QWRkZWRgIHdpbGwgYmUgYGZhbHNlYC4gWW91XG4gICAqIHNob3VsZCBhbHdheXMgY2hlY2sgdGhpcyB2YWx1ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgb3BlcmF0aW9uIHdhc1xuICAgKiBhY3R1YWxseSBjYXJyaWVkIG91dC4gT3RoZXJ3aXNlLCBzeW50aGVzaXMgYW5kIGRlcGxveSB3aWxsIHRlcm1pbmF0ZVxuICAgKiBzaWxlbnRseSwgd2hpY2ggbWF5IGJlIGNvbmZ1c2luZy5cbiAgICovXG4gIGFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgcGVybWlzc2lvbjogaWFtLlBvbGljeVN0YXRlbWVudCxcbiAgKTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgZm9yIHRoaXMgYnVja2V0IGFuZCBpdCdzIGNvbnRlbnRzIHRvIGFuIElBTVxuICAgKiBwcmluY2lwYWwgKFJvbGUvR3JvdXAvVXNlcikuXG4gICAqXG4gICAqIElmIGVuY3J5cHRpb24gaXMgdXNlZCwgcGVybWlzc2lvbiB0byB1c2UgdGhlIGtleSB0byBkZWNyeXB0IHRoZSBjb250ZW50c1xuICAgKiBvZiB0aGUgYnVja2V0IHdpbGwgYWxzbyBiZSBncmFudGVkIHRvIHRoZSBzYW1lIHByaW5jaXBhbC5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpLiBQYXJhbWV0ZXIgdHlwZSBpcyBgYW55YCBidXQgYHN0cmluZ2Agc2hvdWxkIGJlIHBhc3NlZCBpbi5cbiAgICovXG4gIGdyYW50UmVhZChpZGVudGl0eTogaWFtLklHcmFudGFibGUsIG9iamVjdHNLZXlQYXR0ZXJuPzogYW55KTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudCB3cml0ZSBwZXJtaXNzaW9ucyB0byB0aGlzIGJ1Y2tldCB0byBhbiBJQU0gcHJpbmNpcGFsLlxuICAgKlxuICAgKiBJZiBlbmNyeXB0aW9uIGlzIHVzZWQsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBrZXkgdG8gZW5jcnlwdCB0aGUgY29udGVudHNcbiAgICogb2Ygd3JpdHRlbiBmaWxlcyB3aWxsIGFsc28gYmUgZ3JhbnRlZCB0byB0aGUgc2FtZSBwcmluY2lwYWwuXG4gICAqXG4gICAqIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBgczM6UHV0T2JqZWN0QWNsYCwgd2hpY2ggY291bGQgYmUgdXNlZCB0byBncmFudCByZWFkL3dyaXRlIG9iamVjdCBhY2Nlc3MgdG8gSUFNIHByaW5jaXBhbHMgaW4gb3RoZXIgYWNjb3VudHMuXG4gICAqXG4gICAqIElmIHlvdSBuZWVkIHRoZSBwcmluY2lwYWwgdG8gaGF2ZSBwZXJtaXNzaW9ucyB0byBtb2RpZnkgdGhlIEFDTHMsXG4gICAqIHVzZSB0aGUgYGdyYW50UHV0QWNsYCBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgcHJpbmNpcGFsXG4gICAqIEBwYXJhbSBvYmplY3RzS2V5UGF0dGVybiBSZXN0cmljdCB0aGUgcGVybWlzc2lvbiB0byBhIGNlcnRhaW4ga2V5IHBhdHRlcm4gKGRlZmF1bHQgJyonKS4gUGFyYW1ldGVyIHR5cGUgaXMgYGFueWAgYnV0IGBzdHJpbmdgIHNob3VsZCBiZSBwYXNzZWQgaW4uXG4gICAqIEBwYXJhbSBhbGxvd2VkQWN0aW9uUGF0dGVybnMgUmVzdHJpY3QgdGhlIHBlcm1pc3Npb25zIHRvIGNlcnRhaW4gbGlzdCBvZiBhY3Rpb24gcGF0dGVybnNcbiAgICovXG4gIGdyYW50V3JpdGUoXG4gICAgaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLFxuICAgIG9iamVjdHNLZXlQYXR0ZXJuPzogYW55LFxuICAgIGFsbG93ZWRBY3Rpb25QYXR0ZXJucz86IHN0cmluZ1tdLFxuICApOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBzMzpQdXRPYmplY3QqIGFuZCBzMzpBYm9ydCogcGVybWlzc2lvbnMgZm9yIHRoaXMgYnVja2V0IHRvIGFuIElBTSBwcmluY2lwYWwuXG4gICAqXG4gICAqIElmIGVuY3J5cHRpb24gaXMgdXNlZCwgcGVybWlzc2lvbiB0byB1c2UgdGhlIGtleSB0byBlbmNyeXB0IHRoZSBjb250ZW50c1xuICAgKiBvZiB3cml0dGVuIGZpbGVzIHdpbGwgYWxzbyBiZSBncmFudGVkIHRvIHRoZSBzYW1lIHByaW5jaXBhbC5cbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpLiBQYXJhbWV0ZXIgdHlwZSBpcyBgYW55YCBidXQgYHN0cmluZ2Agc2hvdWxkIGJlIHBhc3NlZCBpbi5cbiAgICovXG4gIGdyYW50UHV0KGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm4/OiBhbnkpOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHRoZSBnaXZlbiBJQU0gaWRlbnRpdHkgcGVybWlzc2lvbnMgdG8gbW9kaWZ5IHRoZSBBQ0xzIG9mIG9iamVjdHMgaW4gdGhlIGdpdmVuIEJ1Y2tldC5cbiAgICpcbiAgICogY2FsbGluZyBgZ3JhbnRXcml0ZWAgb3IgYGdyYW50UmVhZFdyaXRlYCBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9ucyB0byBtb2RpZnkgdGhlIEFDTHMgb2YgdGhlIG9iamVjdHM7XG4gICAqIGluIHRoaXMgY2FzZSwgaWYgeW91IG5lZWQgdG8gbW9kaWZ5IG9iamVjdCBBQ0xzLCBjYWxsIHRoaXMgbWV0aG9kIGV4cGxpY2l0bHkuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgcHJpbmNpcGFsXG4gICAqIEBwYXJhbSBvYmplY3RzS2V5UGF0dGVybiBSZXN0cmljdCB0aGUgcGVybWlzc2lvbiB0byBhIGNlcnRhaW4ga2V5IHBhdHRlcm4gKGRlZmF1bHQgJyonKVxuICAgKi9cbiAgZ3JhbnRQdXRBY2woaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLCBvYmplY3RzS2V5UGF0dGVybj86IHN0cmluZyk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnRzIHMzOkRlbGV0ZU9iamVjdCogcGVybWlzc2lvbiB0byBhbiBJQU0gcHJpbmNpcGFsIGZvciBvYmplY3RzXG4gICAqIGluIHRoaXMgYnVja2V0LlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgZ3JhbnREZWxldGUoaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLCBvYmplY3RzS2V5UGF0dGVybj86IGFueSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnRzIHJlYWQvd3JpdGUgcGVybWlzc2lvbnMgZm9yIHRoaXMgYnVja2V0IGFuZCBpdCdzIGNvbnRlbnRzIHRvIGFuIElBTVxuICAgKiBwcmluY2lwYWwgKFJvbGUvR3JvdXAvVXNlcikuXG4gICAqXG4gICAqIElmIGFuIGVuY3J5cHRpb24ga2V5IGlzIHVzZWQsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBrZXkgZm9yXG4gICAqIGVuY3J5cHQvZGVjcnlwdCB3aWxsIGFsc28gYmUgZ3JhbnRlZC5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGBzMzpQdXRPYmplY3RBY2xgLCB3aGljaCBjb3VsZCBiZSB1c2VkIHRvIGdyYW50IHJlYWQvd3JpdGUgb2JqZWN0IGFjY2VzcyB0byBJQU0gcHJpbmNpcGFscyBpbiBvdGhlciBhY2NvdW50cy5cbiAgICpcbiAgICogSWYgeW91IG5lZWQgdGhlIHByaW5jaXBhbCB0byBoYXZlIHBlcm1pc3Npb25zIHRvIG1vZGlmeSB0aGUgQUNMcyxcbiAgICogdXNlIHRoZSBgZ3JhbnRQdXRBY2xgIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpLiBQYXJhbWV0ZXIgdHlwZSBpcyBgYW55YCBidXQgYHN0cmluZ2Agc2hvdWxkIGJlIHBhc3NlZCBpbi5cbiAgICovXG4gIGdyYW50UmVhZFdyaXRlKGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm4/OiBhbnkpOiBpYW0uR3JhbnQ7XG5cbiAgLy8gLyoqXG4gIC8vICAqIEFsbG93cyB1bnJlc3RyaWN0ZWQgYWNjZXNzIHRvIG9iamVjdHMgZnJvbSB0aGlzIGJ1Y2tldC5cbiAgLy8gICpcbiAgLy8gICogSU1QT1JUQU5UOiBUaGlzIHBlcm1pc3Npb24gYWxsb3dzIGFueW9uZSB0byBwZXJmb3JtIGFjdGlvbnMgb24gUzMgb2JqZWN0c1xuICAvLyAgKiBpbiB0aGlzIGJ1Y2tldCwgd2hpY2ggaXMgdXNlZnVsIGZvciB3aGVuIHlvdSBjb25maWd1cmUgeW91ciBidWNrZXQgYXMgYVxuICAvLyAgKiB3ZWJzaXRlIGFuZCB3YW50IGV2ZXJ5b25lIHRvIGJlIGFibGUgdG8gcmVhZCBvYmplY3RzIGluIHRoZSBidWNrZXQgd2l0aG91dFxuICAvLyAgKiBuZWVkaW5nIHRvIGF1dGhlbnRpY2F0ZS5cbiAgLy8gICpcbiAgLy8gICogV2l0aG91dCBhcmd1bWVudHMsIHRoaXMgbWV0aG9kIHdpbGwgZ3JhbnQgcmVhZCAoXCJzMzpHZXRPYmplY3RcIikgYWNjZXNzIHRvXG4gIC8vICAqIGFsbCBvYmplY3RzIChcIipcIikgaW4gdGhlIGJ1Y2tldC5cbiAgLy8gICpcbiAgLy8gICogVGhlIG1ldGhvZCByZXR1cm5zIHRoZSBgaWFtLkdyYW50YCBvYmplY3QsIHdoaWNoIGNhbiB0aGVuIGJlIG1vZGlmaWVkXG4gIC8vICAqIGFzIG5lZWRlZC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gYWRkIGEgY29uZGl0aW9uIHRoYXQgd2lsbCByZXN0cmljdCBhY2Nlc3Mgb25seVxuICAvLyAgKiB0byBhbiBJUHY0IHJhbmdlIGxpa2UgdGhpczpcbiAgLy8gICpcbiAgLy8gICogICAgIGNvbnN0IGdyYW50ID0gYnVja2V0LmdyYW50UHVibGljQWNjZXNzKCk7XG4gIC8vICAqICAgICBncmFudC5yZXNvdXJjZVN0YXRlbWVudCEuYWRkQ29uZGl0aW9uKOKAmElwQWRkcmVzc+KAmSwgeyDigJxhd3M6U291cmNlSXDigJ06IOKAnDU0LjI0MC4xNDMuMC8yNOKAnSB9KTtcbiAgLy8gICpcbiAgLy8gICpcbiAgLy8gICogQHBhcmFtIGtleVByZWZpeCB0aGUgcHJlZml4IG9mIFMzIG9iamVjdCBrZXlzIChlLmcuIGBob21lLypgKS4gRGVmYXVsdCBpcyBcIipcIi5cbiAgLy8gICogQHBhcmFtIGFsbG93ZWRBY3Rpb25zIHRoZSBzZXQgb2YgUzMgYWN0aW9ucyB0byBhbGxvdy4gRGVmYXVsdCBpcyBcInMzOkdldE9iamVjdFwiLlxuICAvLyAgKiBAcmV0dXJucyBUaGUgYGlhbS5Qb2xpY3lTdGF0ZW1lbnRgIG9iamVjdCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYXBwbHkgZS5nLiBjb25kaXRpb25zLlxuICAvLyAgKi9cbiAgLy8gZ3JhbnRQdWJsaWNBY2Nlc3Moa2V5UHJlZml4Pzogc3RyaW5nLCAuLi5hbGxvd2VkQWN0aW9uczogc3RyaW5nW10pOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBidWNrZXQgbm90aWZpY2F0aW9uIGV2ZW50IGRlc3RpbmF0aW9uLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHRyaWdnZXIgdGhlIG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0gZGVzdCBUaGUgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uIChMYW1iZGEsIFNOUyBUb3BpYyBvciBTUVMgUXVldWUpXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXJzIFMzIG9iamVjdCBrZXkgZmlsdGVyIHJ1bGVzIHRvIGRldGVybWluZSB3aGljaCBvYmplY3RzXG4gICAqIHRyaWdnZXIgdGhpcyBldmVudC4gRWFjaCBmaWx0ZXIgbXVzdCBpbmNsdWRlIGEgYHByZWZpeGAgYW5kL29yIGBzdWZmaXhgXG4gICAqIHRoYXQgd2lsbCBiZSBtYXRjaGVkIGFnYWluc3QgdGhlIHMzIG9iamVjdCBrZXkuIFJlZmVyIHRvIHRoZSBTMyBEZXZlbG9wZXIgR3VpZGVcbiAgICogZm9yIGRldGFpbHMgYWJvdXQgYWxsb3dlZCBmaWx0ZXIgcnVsZXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvTm90aWZpY2F0aW9uSG93VG8uaHRtbCNub3RpZmljYXRpb24taG93LXRvLWZpbHRlcmluZ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgICBkZWNsYXJlIGNvbnN0IG15TGFtYmRhOiBsYW1iZGEuRnVuY3Rpb247XG4gICAqICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgJ015QnVja2V0Jyk7XG4gICAqICAgIGJ1Y2tldC5hZGRFdmVudE5vdGlmaWNhdGlvbihzMy5FdmVudFR5cGUuT0JKRUNUX0NSRUFURUQsIG5ldyBzM24uTGFtYmRhRGVzdGluYXRpb24obXlMYW1iZGEpLCB7cHJlZml4OiAnaG9tZS9teXVzZXJuYW1lLyonfSlcbiAgICpcbiAgICogQHNlZVxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9Ob3RpZmljYXRpb25Ib3dUby5odG1sXG4gICAqL1xuICBhZGRFdmVudE5vdGlmaWNhdGlvbihcbiAgICBldmVudDogRXZlbnRUeXBlLFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIGEgZGVzdGluYXRpb24gdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gYW4gb2JqZWN0IGlzXG4gICAqIGNyZWF0ZWQgaW4gdGhlIGJ1Y2tldC4gVGhpcyBpcyBpZGVudGljYWwgdG8gY2FsbGluZ1xuICAgKiBgb25FdmVudChzMy5FdmVudFR5cGUuT0JKRUNUX0NSRUFURUQpYC5cbiAgICpcbiAgICogQHBhcmFtIGRlc3QgVGhlIG5vdGlmaWNhdGlvbiBkZXN0aW5hdGlvbiAoc2VlIG9uRXZlbnQpXG4gICAqIEBwYXJhbSBmaWx0ZXJzIEZpbHRlcnMgKHNlZSBvbkV2ZW50KVxuICAgKi9cbiAgYWRkT2JqZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbihcbiAgICBkZXN0OiBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gICAgLi4uZmlsdGVyczogTm90aWZpY2F0aW9uS2V5RmlsdGVyW11cbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogU3Vic2NyaWJlcyBhIGRlc3RpbmF0aW9uIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucyB3aGVuIGFuIG9iamVjdCBpc1xuICAgKiByZW1vdmVkIGZyb20gdGhlIGJ1Y2tldC4gVGhpcyBpcyBpZGVudGljYWwgdG8gY2FsbGluZ1xuICAgKiBgb25FdmVudChFdmVudFR5cGUuT0JKRUNUX1JFTU9WRUQpYC5cbiAgICpcbiAgICogQHBhcmFtIGRlc3QgVGhlIG5vdGlmaWNhdGlvbiBkZXN0aW5hdGlvbiAoc2VlIG9uRXZlbnQpXG4gICAqIEBwYXJhbSBmaWx0ZXJzIEZpbHRlcnMgKHNlZSBvbkV2ZW50KVxuICAgKi9cbiAgYWRkT2JqZWN0UmVtb3ZlZE5vdGlmaWNhdGlvbihcbiAgICBkZXN0OiBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gICAgLi4uZmlsdGVyczogTm90aWZpY2F0aW9uS2V5RmlsdGVyW11cbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogRW5hYmxlcyBldmVudCBicmlkZ2Ugbm90aWZpY2F0aW9uLCBjYXVzaW5nIGFsbCBldmVudHMgYmVsb3cgdG8gYmUgc2VudCB0byBFdmVudEJyaWRnZTpcbiAgICpcbiAgICogLSBPYmplY3QgRGVsZXRlZCAoRGVsZXRlT2JqZWN0KVxuICAgKiAtIE9iamVjdCBEZWxldGVkIChMaWZlY3ljbGUgZXhwaXJhdGlvbilcbiAgICogLSBPYmplY3QgUmVzdG9yZSBJbml0aWF0ZWRcbiAgICogLSBPYmplY3QgUmVzdG9yZSBDb21wbGV0ZWRcbiAgICogLSBPYmplY3QgUmVzdG9yZSBFeHBpcmVkXG4gICAqIC0gT2JqZWN0IFN0b3JhZ2UgQ2xhc3MgQ2hhbmdlZFxuICAgKiAtIE9iamVjdCBBY2Nlc3MgVGllciBDaGFuZ2VkXG4gICAqIC0gT2JqZWN0IEFDTCBVcGRhdGVkXG4gICAqIC0gT2JqZWN0IFRhZ3MgQWRkZWRcbiAgICogLSBPYmplY3QgVGFncyBEZWxldGVkXG4gICAqL1xuICBlbmFibGVFdmVudEJyaWRnZU5vdGlmaWNhdGlvbigpOiB2b2lkO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQnVja2V0QmFzZSBleHRlbmRzIEF3c0NvbnN0cnVjdEJhc2UgaW1wbGVtZW50cyBJQnVja2V0IHtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGJ1Y2tldEFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYnVja2V0TmFtZTogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgd2Vic2l0ZURvbWFpbk5hbWU/OiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBidWNrZXREb21haW5OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBidWNrZXRSZWdpb25hbERvbWFpbk5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHdlYnNpdGVFbmRwb2ludD86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHB1YmxpYz86IGJvb2xlYW47XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB2ZXJzaW9uZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBob3N0ZWRab25lSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIEtNUyBlbmNyeXB0aW9uIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuICBwdWJsaWMgZ2V0IGJ1Y2tldE91dHB1dHMoKTogQnVja2V0T3V0cHV0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgIGFybjogdGhpcy5idWNrZXRBcm4sXG4gICAgICBkb21haW5OYW1lOiB0aGlzLmJ1Y2tldERvbWFpbk5hbWUsXG4gICAgICByZWdpb25hbERvbWFpbk5hbWU6IHRoaXMuYnVja2V0UmVnaW9uYWxEb21haW5OYW1lLFxuICAgICAgd2Vic2l0ZURvbWFpbk5hbWU6IHRoaXMud2Vic2l0ZURvbWFpbk5hbWUsXG4gICAgICB3ZWJzaXRlVXJsOiB0aGlzLndlYnNpdGVFbmRwb2ludCxcbiAgICAgIG9yaWdpbkFjY2Vzc0lkZW50aXR5OlxuICAgICAgICB0aGlzLm9yaWdpbkFjY2Vzc0lkZW50aXR5Py5jbG91ZEZyb250T3JpZ2luQWNjZXNzSWRlbnRpdHlQYXRoLFxuICAgICAgZW5jcnlwdGlvbktleTogdGhpcy5lbmNyeXB0aW9uS2V5Py5rZXlPdXRwdXRzLFxuICAgIH07XG4gIH1cbiAgcHVibGljIGdldCBvdXRwdXRzKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldE91dHB1dHM7XG4gIH1cbiAgLy8gcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IHJlc291cmNlOlxuICAvLyAgIHwgczNCdWNrZXQuUzNCdWNrZXRcbiAgLy8gICB8IGRhdGFBd3NTM0J1Y2tldC5EYXRhQXdzUzNCdWNrZXQ7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWFkb25seSBvcmlnaW5BY2Nlc3NJZGVudGl0eT86IE9yaWdpbkFjY2Vzc0lkZW50aXR5O1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IF9pc1dlYnNpdGU6IGJvb2xlYW47XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBzb3VyY2VTbGVlcD86IHNsZWVwLlNsZWVwO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc291cmNlczogU291cmNlSW5kZXhbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgcG9saWN5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1Y2tldC5cbiAgICpcbiAgICogSWYgYGF1dG9DcmVhdGVQb2xpY3lgIGlzIHRydWUsIGEgYEJ1Y2tldFBvbGljeWAgd2lsbCBiZSBjcmVhdGVkIHVwb24gdGhlXG4gICAqIGZpcnN0IGNhbGwgdG8gYWRkVG9SZXNvdXJjZVBvbGljeShzKS5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBwb2xpY3k/OiBCdWNrZXRQb2xpY3k7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBhIGJ1Y2tldCByZXNvdXJjZSBwb2xpY3kgc2hvdWxkIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB1cG9uXG4gICAqIHRoZSBmaXJzdCBjYWxsIHRvIGBhZGRUb1Jlc291cmNlUG9saWN5YC5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBhdXRvQ3JlYXRlUG9saWN5OiBib29sZWFuO1xuXG4gIC8vIC8qKlxuICAvLyAgKiBXaGV0aGVyIHRvIGRpc2FsbG93IHB1YmxpYyBhY2Nlc3NcbiAgLy8gICovXG4gIC8vIHByb3RlY3RlZCBhYnN0cmFjdCBkaXNhbGxvd1B1YmxpY0FjY2Vzcz86IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBub3RpZmljYXRpb25zPzogQnVja2V0Tm90aWZpY2F0aW9ucztcblxuICBwcm90ZWN0ZWQgbm90aWZpY2F0aW9uc0hhbmRsZXJSb2xlPzogaWFtLklSb2xlO1xuXG4gIHByb3RlY3RlZCBub3RpZmljYXRpb25zU2tpcERlc3RpbmF0aW9uVmFsaWRhdGlvbj86IGJvb2xlYW47XG5cbiAgLy8gVE9ETzogcmUtYWRkIG93bmVyc2hpcCBjb250cm9sIHBhcnNpbmcgYmFzZWQgb24gYWNjZXNzIGNvbnRyb2xzXG4gIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXMzL2xpYi9idWNrZXQudHMjTDIzNjNcbiAgLy8gcHJvdGVjdGVkIG9iamVjdE93bmVyc2hpcD86IE9iamVjdE93bmVyc2hpcDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXdzQ29uc3RydWN0UHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oe1xuICAgICAgdmFsaWRhdGU6ICgpID0+IHRoaXMucG9saWN5Py5kb2N1bWVudC52YWxpZGF0ZUZvclJlc291cmNlUG9saWN5KCkgPz8gW10sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHN0YXRlbWVudCB0byB0aGUgcmVzb3VyY2UgcG9saWN5IGZvciBhIHByaW5jaXBhbCAoaS5lLlxuICAgKiBhY2NvdW50L3JvbGUvc2VydmljZSkgdG8gcGVyZm9ybSBhY3Rpb25zIG9uIHRoaXMgYnVja2V0IGFuZC9vciBpdHNcbiAgICogY29udGVudHMuIFVzZSBgYnVja2V0QXJuYCBhbmQgYGFybkZvck9iamVjdHMoa2V5cylgIHRvIG9idGFpbiBBUk5zIGZvclxuICAgKiB0aGlzIGJ1Y2tldCBvciBvYmplY3RzLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIHBvbGljeSBzdGF0ZW1lbnQgbWF5IG9yIG1heSBub3QgYmUgYWRkZWQgdG8gdGhlIHBvbGljeS5cbiAgICogRm9yIGV4YW1wbGUsIHdoZW4gYW4gYElCdWNrZXRgIGlzIGNyZWF0ZWQgZnJvbSBhbiBleGlzdGluZyBidWNrZXQsXG4gICAqIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHRlbGwgd2hldGhlciB0aGUgYnVja2V0IGFscmVhZHkgaGFzIGEgcG9saWN5XG4gICAqIGF0dGFjaGVkLCBsZXQgYWxvbmUgdG8gcmUtdXNlIHRoYXQgcG9saWN5IHRvIGFkZCBtb3JlIHN0YXRlbWVudHMgdG8gaXQuXG4gICAqIFNvIGl0J3Mgc2FmZXN0IHRvIGRvIG5vdGhpbmcgaW4gdGhlc2UgY2FzZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwZXJtaXNzaW9uIHRoZSBwb2xpY3kgc3RhdGVtZW50IHRvIGJlIGFkZGVkIHRvIHRoZSBidWNrZXQnc1xuICAgKiBwb2xpY3kuXG4gICAqIEByZXR1cm5zIG1ldGFkYXRhIGFib3V0IHRoZSBleGVjdXRpb24gb2YgdGhpcyBtZXRob2QuIElmIHRoZSBwb2xpY3lcbiAgICogd2FzIG5vdCBhZGRlZCwgdGhlIHZhbHVlIG9mIGBzdGF0ZW1lbnRBZGRlZGAgd2lsbCBiZSBgZmFsc2VgLiBZb3VcbiAgICogc2hvdWxkIGFsd2F5cyBjaGVjayB0aGlzIHZhbHVlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBvcGVyYXRpb24gd2FzXG4gICAqIGFjdHVhbGx5IGNhcnJpZWQgb3V0LiBPdGhlcndpc2UsIHN5bnRoZXNpcyBhbmQgZGVwbG95IHdpbGwgdGVybWluYXRlXG4gICAqIHNpbGVudGx5LCB3aGljaCBtYXkgYmUgY29uZnVzaW5nLlxuICAgKi9cbiAgcHVibGljIGFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgcGVybWlzc2lvbjogaWFtLlBvbGljeVN0YXRlbWVudCxcbiAgKTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQge1xuICAgIGlmICghdGhpcy5wb2xpY3kgJiYgdGhpcy5hdXRvQ3JlYXRlUG9saWN5KSB7XG4gICAgICB0aGlzLnBvbGljeSA9IG5ldyBCdWNrZXRQb2xpY3kodGhpcywgXCJQb2xpY3lcIiwgeyBidWNrZXQ6IHRoaXMgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucG9saWN5KSB7XG4gICAgICB0aGlzLnBvbGljeS5kb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHBlcm1pc3Npb24pO1xuICAgICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IHRydWUsIHBvbGljeURlcGVuZGFibGU6IHRoaXMucG9saWN5IH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IGZhbHNlIH07XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcmVhZCBwZXJtaXNzaW9ucyBmb3IgdGhpcyBidWNrZXQgYW5kIGl0J3MgY29udGVudHMgdG8gYW4gSUFNXG4gICAqIHByaW5jaXBhbCAoUm9sZS9Hcm91cC9Vc2VyKS5cbiAgICpcbiAgICogSWYgZW5jcnlwdGlvbiBpcyB1c2VkLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUga2V5IHRvIGRlY3J5cHQgdGhlIGNvbnRlbnRzXG4gICAqIG9mIHRoZSBidWNrZXQgd2lsbCBhbHNvIGJlIGdyYW50ZWQgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgcHVibGljIGdyYW50UmVhZChpZGVudGl0eTogaWFtLklHcmFudGFibGUsIG9iamVjdHNLZXlQYXR0ZXJuOiBhbnkgPSBcIipcIikge1xuICAgIHJldHVybiB0aGlzLmdyYW50KFxuICAgICAgaWRlbnRpdHksXG4gICAgICBwZXJtcy5CVUNLRVRfUkVBRF9BQ1RJT05TLFxuICAgICAgcGVybXMuS0VZX1JFQURfQUNUSU9OUyxcbiAgICAgIHRoaXMuYnVja2V0QXJuLFxuICAgICAgdGhpcy5hcm5Gb3JPYmplY3RzKG9iamVjdHNLZXlQYXR0ZXJuKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdyYW50V3JpdGUoXG4gICAgaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLFxuICAgIG9iamVjdHNLZXlQYXR0ZXJuOiBhbnkgPSBcIipcIixcbiAgICBhbGxvd2VkQWN0aW9uUGF0dGVybnM6IHN0cmluZ1tdID0gW10sXG4gICkge1xuICAgIGNvbnN0IGdyYW50ZWRXcml0ZUFjdGlvbnMgPVxuICAgICAgYWxsb3dlZEFjdGlvblBhdHRlcm5zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhbGxvd2VkQWN0aW9uUGF0dGVybnNcbiAgICAgICAgOiB0aGlzLndyaXRlQWN0aW9ucztcbiAgICByZXR1cm4gdGhpcy5ncmFudChcbiAgICAgIGlkZW50aXR5LFxuICAgICAgZ3JhbnRlZFdyaXRlQWN0aW9ucyxcbiAgICAgIHBlcm1zLktFWV9XUklURV9BQ1RJT05TLFxuICAgICAgdGhpcy5idWNrZXRBcm4sXG4gICAgICB0aGlzLmFybkZvck9iamVjdHMob2JqZWN0c0tleVBhdHRlcm4pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHMzOlB1dE9iamVjdCogYW5kIHMzOkFib3J0KiBwZXJtaXNzaW9ucyBmb3IgdGhpcyBidWNrZXQgdG8gYW4gSUFNIHByaW5jaXBhbC5cbiAgICpcbiAgICogSWYgZW5jcnlwdGlvbiBpcyB1c2VkLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUga2V5IHRvIGVuY3J5cHQgdGhlIGNvbnRlbnRzXG4gICAqIG9mIHdyaXR0ZW4gZmlsZXMgd2lsbCBhbHNvIGJlIGdyYW50ZWQgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgcHVibGljIGdyYW50UHV0KGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm46IGFueSA9IFwiKlwiKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoXG4gICAgICBpZGVudGl0eSxcbiAgICAgIHBlcm1zLkJVQ0tFVF9QVVRfQUNUSU9OUyxcbiAgICAgIHBlcm1zLktFWV9XUklURV9BQ1RJT05TLFxuICAgICAgdGhpcy5hcm5Gb3JPYmplY3RzKG9iamVjdHNLZXlQYXR0ZXJuKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdyYW50UHV0QWNsKFxuICAgIGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSxcbiAgICBvYmplY3RzS2V5UGF0dGVybjogc3RyaW5nID0gXCIqXCIsXG4gICkge1xuICAgIHJldHVybiB0aGlzLmdyYW50KFxuICAgICAgaWRlbnRpdHksXG4gICAgICBwZXJtcy5CVUNLRVRfUFVUX0FDTF9BQ1RJT05TLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFybkZvck9iamVjdHMob2JqZWN0c0tleVBhdHRlcm4pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHMzOkRlbGV0ZU9iamVjdCogcGVybWlzc2lvbiB0byBhbiBJQU0gcHJpbmNpcGFsIGZvciBvYmplY3RzXG4gICAqIGluIHRoaXMgYnVja2V0LlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgcHVibGljIGdyYW50RGVsZXRlKGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm46IGFueSA9IFwiKlwiKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoXG4gICAgICBpZGVudGl0eSxcbiAgICAgIHBlcm1zLkJVQ0tFVF9ERUxFVEVfQUNUSU9OUyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hcm5Gb3JPYmplY3RzKG9iamVjdHNLZXlQYXR0ZXJuKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdyYW50UmVhZFdyaXRlKFxuICAgIGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSxcbiAgICBvYmplY3RzS2V5UGF0dGVybjogYW55ID0gXCIqXCIsXG4gICkge1xuICAgIGNvbnN0IGJ1Y2tldEFjdGlvbnMgPSBwZXJtcy5CVUNLRVRfUkVBRF9BQ1RJT05TLmNvbmNhdCh0aGlzLndyaXRlQWN0aW9ucyk7XG4gICAgLy8gd2UgbmVlZCB1bmlxdWUgcGVybWlzc2lvbnMgYmVjYXVzZSBzb21lIHBlcm1pc3Npb25zIGFyZSBjb21tb24gYmV0d2VlbiByZWFkIGFuZCB3cml0ZSBrZXkgYWN0aW9uc1xuICAgIGNvbnN0IGtleUFjdGlvbnMgPSBbXG4gICAgICAuLi5uZXcgU2V0KFsuLi5wZXJtcy5LRVlfUkVBRF9BQ1RJT05TLCAuLi5wZXJtcy5LRVlfV1JJVEVfQUNUSU9OU10pLFxuICAgIF07XG5cbiAgICByZXR1cm4gdGhpcy5ncmFudChcbiAgICAgIGlkZW50aXR5LFxuICAgICAgYnVja2V0QWN0aW9ucyxcbiAgICAgIGtleUFjdGlvbnMsXG4gICAgICB0aGlzLmJ1Y2tldEFybixcbiAgICAgIHRoaXMuYXJuRm9yT2JqZWN0cyhvYmplY3RzS2V5UGF0dGVybiksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRPRE86IGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB0aHJvdWdoIGBwcm9wcy5wdWJsaWNgIGluIGNvbnN0cnVjdG9yLFxuICAvLyBUT0RPOiByZS1hZGQgT2JqZWN0T3duZXJzaGlwIGFuZCBCdWNrZXRBY2Nlc3NDb250cm9sXG4gIC8vIC8qKlxuICAvLyAgKiBBbGxvd3MgdW5yZXN0cmljdGVkIGFjY2VzcyB0byBvYmplY3RzIGZyb20gdGhpcyBidWNrZXQuXG4gIC8vICAqXG4gIC8vICAqIElNUE9SVEFOVDogVGhpcyBwZXJtaXNzaW9uIGFsbG93cyBhbnlvbmUgdG8gcGVyZm9ybSBhY3Rpb25zIG9uIFMzIG9iamVjdHNcbiAgLy8gICogaW4gdGhpcyBidWNrZXQsIHdoaWNoIGlzIHVzZWZ1bCBmb3Igd2hlbiB5b3UgY29uZmlndXJlIHlvdXIgYnVja2V0IGFzIGFcbiAgLy8gICogd2Vic2l0ZSBhbmQgd2FudCBldmVyeW9uZSB0byBiZSBhYmxlIHRvIHJlYWQgb2JqZWN0cyBpbiB0aGUgYnVja2V0IHdpdGhvdXRcbiAgLy8gICogbmVlZGluZyB0byBhdXRoZW50aWNhdGUuXG4gIC8vICAqXG4gIC8vICAqIFdpdGhvdXQgYXJndW1lbnRzLCB0aGlzIG1ldGhvZCB3aWxsIGdyYW50IHJlYWQgKFwiczM6R2V0T2JqZWN0XCIpIGFjY2VzcyB0b1xuICAvLyAgKiBhbGwgb2JqZWN0cyAoXCIqXCIpIGluIHRoZSBidWNrZXQuXG4gIC8vICAqXG4gIC8vICAqIFRoZSBtZXRob2QgcmV0dXJucyB0aGUgYGlhbS5HcmFudGAgb2JqZWN0LCB3aGljaCBjYW4gdGhlbiBiZSBtb2RpZmllZFxuICAvLyAgKiBhcyBuZWVkZWQuIEZvciBleGFtcGxlLCB5b3UgY2FuIGFkZCBhIGNvbmRpdGlvbiB0aGF0IHdpbGwgcmVzdHJpY3QgYWNjZXNzIG9ubHlcbiAgLy8gICogdG8gYW4gSVB2NCByYW5nZSBsaWtlIHRoaXM6XG4gIC8vICAqXG4gIC8vICAqICAgICBjb25zdCBncmFudCA9IGJ1Y2tldC5ncmFudFB1YmxpY0FjY2VzcygpO1xuICAvLyAgKiAgICAgZ3JhbnQucmVzb3VyY2VTdGF0ZW1lbnQhLmFkZENvbmRpdGlvbijigJhJcEFkZHJlc3PigJksIHsg4oCcYXdzOlNvdXJjZUlw4oCdOiDigJw1NC4yNDAuMTQzLjAvMjTigJ0gfSk7XG4gIC8vICAqXG4gIC8vICAqIE5vdGUgdGhhdCBpZiB0aGlzIGBJQnVja2V0YCByZWZlcnMgdG8gYW4gZXhpc3RpbmcgYnVja2V0LCBwb3NzaWJseSBub3RcbiAgLy8gICogbWFuYWdlZCBieSBDbG91ZEZvcm1hdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIGVmZmVjdCwgc2luY2UgaXQnc1xuICAvLyAgKiBpbXBvc3NpYmxlIHRvIG1vZGlmeSB0aGUgcG9saWN5IG9mIGFuIGV4aXN0aW5nIGJ1Y2tldC5cbiAgLy8gICpcbiAgLy8gICogQHBhcmFtIGtleVByZWZpeCB0aGUgcHJlZml4IG9mIFMzIG9iamVjdCBrZXlzIChlLmcuIGBob21lLypgKS4gRGVmYXVsdCBpcyBcIipcIi5cbiAgLy8gICogQHBhcmFtIGFsbG93ZWRBY3Rpb25zIHRoZSBzZXQgb2YgUzMgYWN0aW9ucyB0byBhbGxvdy4gRGVmYXVsdCBpcyBcInMzOkdldE9iamVjdFwiLlxuICAvLyAgKi9cbiAgLy8gcHVibGljIGdyYW50UHVibGljQWNjZXNzKGtleVByZWZpeCA9IFwiKlwiLCAuLi5hbGxvd2VkQWN0aW9uczogc3RyaW5nW10pIHtcbiAgLy8gICBpZiAoIXRoaXMucHVibGljKSB7XG4gIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZ3JhbnQgcHVibGljIGFjY2VzcyB3aGVuICdwdWJsaWMnIGlzIGVuYWJsZWRcIik7XG4gIC8vICAgfVxuICAvLyAgIC8vIFRET086IFRoaXMgc2hvdWxkIGNyZWF0ZSBwdWJsaWNBY2Nlc3MgcmVzb3VyY2VcbiAgLy8gICBhbGxvd2VkQWN0aW9ucyA9XG4gIC8vICAgICBhbGxvd2VkQWN0aW9ucy5sZW5ndGggPiAwID8gYWxsb3dlZEFjdGlvbnMgOiBbXCJzMzpHZXRPYmplY3RcIl07XG5cbiAgLy8gICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsT3JSZXNvdXJjZSh7XG4gIC8vICAgICBhY3Rpb25zOiBhbGxvd2VkQWN0aW9ucyxcbiAgLy8gICAgIHJlc291cmNlQXJuczogW3RoaXMuYXJuRm9yT2JqZWN0cyhrZXlQcmVmaXgpXSxcbiAgLy8gICAgIGdyYW50ZWU6IG5ldyBpYW0uQW55UHJpbmNpcGFsKCksXG4gIC8vICAgICByZXNvdXJjZTogdGhpcyxcbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgYnVja2V0IG5vdGlmaWNhdGlvbiBldmVudCBkZXN0aW5hdGlvbi5cbiAgICpcbiAgICogUzMgQnVja2V0cyBvbmx5IHN1cHBvcnQgYSBzaW5nbGUgbm90aWZpY2F0aW9uIGNvbmZpZ3VyYXRpb24gcmVzb3VyY2UuXG4gICAqIERlY2xhcmluZyBtdWx0aXBsZSBgYXdzX3MzX2J1Y2tldF9ub3RpZmljYXRpb25gIHJlc291cmNlcyB0byB0aGUgc2FtZVxuICAgKiBTMyBCdWNrZXQgd2lsbCBjYXVzZSBhIHBlcnBldHVhbCBkaWZmZXJlbmNlIGluIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgZXZlbnQgbm90aWZpY2F0aW9ucyBjb25maWd1cmVkXG4gICAqIGZvciB0aGUgUzMgYnVja2V0IG91dHNpZGUgb2YgdGhpcyBiZWFjb24uXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gdHJpZ2dlciB0aGUgbm90aWZpY2F0aW9uXG4gICAqIEBwYXJhbSBkZXN0IFRoZSBub3RpZmljYXRpb24gZGVzdGluYXRpb24gKExhbWJkYSwgU05TIFRvcGljIG9yIFNRUyBRdWV1ZSlcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlcnMgUzMgb2JqZWN0IGtleSBmaWx0ZXIgcnVsZXMgdG8gZGV0ZXJtaW5lIHdoaWNoIG9iamVjdHNcbiAgICogdHJpZ2dlciB0aGlzIGV2ZW50LiBFYWNoIGZpbHRlciBtdXN0IGluY2x1ZGUgYSBgcHJlZml4YCBhbmQvb3IgYHN1ZmZpeGBcbiAgICogdGhhdCB3aWxsIGJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgczMgb2JqZWN0IGtleS4gUmVmZXIgdG8gdGhlIFMzIERldmVsb3BlciBHdWlkZVxuICAgKiBmb3IgZGV0YWlscyBhYm91dCBhbGxvd2VkIGZpbHRlciBydWxlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9Ob3RpZmljYXRpb25Ib3dUby5odG1sI25vdGlmaWNhdGlvbi1ob3ctdG8tZmlsdGVyaW5nXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGRlY2xhcmUgY29uc3QgbXlGdW5jdGlvbjogY29tcHV0ZS5GdW5jdGlvbjtcbiAgICogICAgY29uc3QgYnVja2V0ID0gbmV3IHN0b3JhZ2UuQnVja2V0KHRoaXMsICdNeUJ1Y2tldCcpO1xuICAgKiAgICBidWNrZXQuYWRkRXZlbnROb3RpZmljYXRpb24oczMuRXZlbnRUeXBlLk9CSkVDVF9DUkVBVEVELCBuZXcgczNuLkxhbWJkYURlc3RpbmF0aW9uKG15RnVuY3Rpb24pLCB7cHJlZml4OiAnaG9tZS9teXVzZXJuYW1lLyonfSk7XG4gICAqXG4gICAqIEBzZWVcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvTm90aWZpY2F0aW9uSG93VG8uaHRtbFxuICAgKi9cbiAgcHVibGljIGFkZEV2ZW50Tm90aWZpY2F0aW9uKFxuICAgIGV2ZW50OiBFdmVudFR5cGUsXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICkge1xuICAgIC8vIFRPRE86IFRoaXMgYmxvY2tzIGFkZGluZyBub3RpZmljYXRpb25zIG91dHNpZGUgb2YgdGhlIFN0YWNrIG93bmluZyB0aGUgYnVja2V0Li4uXG4gICAgLy8gQVdTLUNESyB3b3JrcyBhcm91bmQgdGhpcyBieSB1c2luZyBhIEN1c3RvbVJlc291cmNlIGhhbmRsZXIgKExhbWJkYSBmdW5jdGlvbikgd2hpY2ggbW9kaWZpZXNcbiAgICAvLyB0aGUgYnVja2V0IHBvbGljeSBpbiBwbGFjZSAoYW5kIENGTiBkb2VzIG5vdCBtYW5hZ2UgdGhlIGFjdHVhbCBidWNrZXQgcG9saWN5LCBzbyBubyB0ZiBzdGF0ZSEpXG4gICAgdGhpcy53aXRoTm90aWZpY2F0aW9ucygobm90aWZpY2F0aW9ucykgPT5cbiAgICAgIG5vdGlmaWNhdGlvbnMuYWRkTm90aWZpY2F0aW9uKGV2ZW50LCBkZXN0LCAuLi5maWx0ZXJzKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB3aXRoTm90aWZpY2F0aW9ucyhjYjogKG5vdGlmaWNhdGlvbnM6IEJ1Y2tldE5vdGlmaWNhdGlvbnMpID0+IHZvaWQpIHtcbiAgICAvLyBUT0RPOiBVc2UgQ3VzdG9tIFJlc291cmNlcyB0byBtYW5hZ2UgYnVja2V0IG5vdGlmaWNhdGlvbnMgb3V0c2lkZSBvZiB0aGUgc3RhY2tcbiAgICAvLyBoYW5kbGVyUm9sZTogdGhpcy5ub3RpZmljYXRpb25zSGFuZGxlclJvbGUsXG4gICAgaWYgKCF0aGlzLm5vdGlmaWNhdGlvbnMpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9ucyA9IG5ldyBCdWNrZXROb3RpZmljYXRpb25zKHRoaXMsIFwiTm90aWZpY2F0aW9uc1wiLCB7XG4gICAgICAgIGJ1Y2tldDogdGhpcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjYih0aGlzLm5vdGlmaWNhdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgYSBkZXN0aW5hdGlvbiB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgd2hlbiBhbiBvYmplY3QgaXNcbiAgICogY3JlYXRlZCBpbiB0aGUgYnVja2V0LiBUaGlzIGlzIGlkZW50aWNhbCB0byBjYWxsaW5nXG4gICAqIGBvbkV2ZW50KEV2ZW50VHlwZS5PQkpFQ1RfQ1JFQVRFRClgLlxuICAgKlxuICAgKiBAcGFyYW0gZGVzdCBUaGUgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uIChzZWUgb25FdmVudClcbiAgICogQHBhcmFtIGZpbHRlcnMgRmlsdGVycyAoc2VlIG9uRXZlbnQpXG4gICAqL1xuICBwdWJsaWMgYWRkT2JqZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbihcbiAgICBkZXN0OiBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gICAgLi4uZmlsdGVyczogTm90aWZpY2F0aW9uS2V5RmlsdGVyW11cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRXZlbnROb3RpZmljYXRpb24oXG4gICAgICBFdmVudFR5cGUuT0JKRUNUX0NSRUFURUQsXG4gICAgICBkZXN0LFxuICAgICAgLi4uZmlsdGVycyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgYSBkZXN0aW5hdGlvbiB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgd2hlbiBhbiBvYmplY3QgaXNcbiAgICogcmVtb3ZlZCBmcm9tIHRoZSBidWNrZXQuIFRoaXMgaXMgaWRlbnRpY2FsIHRvIGNhbGxpbmdcbiAgICogYG9uRXZlbnQoRXZlbnRUeXBlLk9CSkVDVF9SRU1PVkVEKWAuXG4gICAqXG4gICAqIEBwYXJhbSBkZXN0IFRoZSBub3RpZmljYXRpb24gZGVzdGluYXRpb24gKHNlZSBvbkV2ZW50KVxuICAgKiBAcGFyYW0gZmlsdGVycyBGaWx0ZXJzIChzZWUgb25FdmVudClcbiAgICovXG4gIHB1YmxpYyBhZGRPYmplY3RSZW1vdmVkTm90aWZpY2F0aW9uKFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApIHtcbiAgICByZXR1cm4gdGhpcy5hZGRFdmVudE5vdGlmaWNhdGlvbihcbiAgICAgIEV2ZW50VHlwZS5PQkpFQ1RfUkVNT1ZFRCxcbiAgICAgIGRlc3QsXG4gICAgICAuLi5maWx0ZXJzLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlcyBldmVudCBicmlkZ2Ugbm90aWZpY2F0aW9uLCBjYXVzaW5nIGFsbCBldmVudHMgYmVsb3cgdG8gYmUgc2VudCB0byBFdmVudEJyaWRnZTpcbiAgICpcbiAgICogLSBPYmplY3QgRGVsZXRlZCAoRGVsZXRlT2JqZWN0KVxuICAgKiAtIE9iamVjdCBEZWxldGVkIChMaWZlY3ljbGUgZXhwaXJhdGlvbilcbiAgICogLSBPYmplY3QgUmVzdG9yZSBJbml0aWF0ZWRcbiAgICogLSBPYmplY3QgUmVzdG9yZSBDb21wbGV0ZWRcbiAgICogLSBPYmplY3QgUmVzdG9yZSBFeHBpcmVkXG4gICAqIC0gT2JqZWN0IFN0b3JhZ2UgQ2xhc3MgQ2hhbmdlZFxuICAgKiAtIE9iamVjdCBBY2Nlc3MgVGllciBDaGFuZ2VkXG4gICAqIC0gT2JqZWN0IEFDTCBVcGRhdGVkXG4gICAqIC0gT2JqZWN0IFRhZ3MgQWRkZWRcbiAgICogLSBPYmplY3QgVGFncyBEZWxldGVkXG4gICAqL1xuICBwdWJsaWMgZW5hYmxlRXZlbnRCcmlkZ2VOb3RpZmljYXRpb24oKSB7XG4gICAgdGhpcy53aXRoTm90aWZpY2F0aW9ucygobm90aWZpY2F0aW9ucykgPT5cbiAgICAgIG5vdGlmaWNhdGlvbnMuZW5hYmxlRXZlbnRCcmlkZ2VOb3RpZmljYXRpb24oKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBncmFudChcbiAgICBncmFudGVlOiBpYW0uSUdyYW50YWJsZSxcbiAgICBidWNrZXRBY3Rpb25zOiBzdHJpbmdbXSxcbiAgICBrZXlBY3Rpb25zOiBzdHJpbmdbXSxcbiAgICByZXNvdXJjZUFybjogc3RyaW5nLFxuICAgIC4uLm90aGVyUmVzb3VyY2VBcm5zOiBzdHJpbmdbXVxuICApIHtcbiAgICBjb25zdCByZXNvdXJjZXMgPSBbcmVzb3VyY2VBcm4sIC4uLm90aGVyUmVzb3VyY2VBcm5zXTtcblxuICAgIGNvbnN0IHJldCA9IGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbE9yUmVzb3VyY2Uoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnM6IGJ1Y2tldEFjdGlvbnMsXG4gICAgICByZXNvdXJjZUFybnM6IHJlc291cmNlcyxcbiAgICAgIHJlc291cmNlOiB0aGlzLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuZW5jcnlwdGlvbktleSAmJiBrZXlBY3Rpb25zICYmIGtleUFjdGlvbnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmVuY3J5cHRpb25LZXkuZ3JhbnQoZ3JhbnRlZSwgLi4ua2V5QWN0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHdyaXRlQWN0aW9ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsuLi5wZXJtcy5CVUNLRVRfREVMRVRFX0FDVElPTlMsIC4uLnBlcm1zLkJVQ0tFVF9QVVRfQUNUSU9OU107XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgc291cmNlIHRvIHRoZSBidWNrZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyBUaGUgcHJvcGVydGllcyBvZiB0aGUgc291cmNlIHRvIGFkZFxuICAgKi9cbiAgcHVibGljIGFkZFNvdXJjZShwcm9wczogQWRkU291cmNlT3B0aW9ucywgc291cmNlSWQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnZlcnNpb25lZCkge1xuICAgICAgLyoqXG4gICAgICAgKiBJZiB5b3UgZW5hYmxlIHZlcnNpb25pbmcgb24gYSBidWNrZXQgZm9yIHRoZSBmaXJzdCB0aW1lLCBpdCBtaWdodCB0YWtlIHVwIHRvIDE1IG1pbnV0ZXNcbiAgICAgICAqIGZvciB0aGUgY2hhbmdlIHRvIGJlIGZ1bGx5IHByb3BhZ2F0ZWQuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB3YWl0IGZvciAxNSBtaW51dGVzIGFmdGVyXG4gICAgICAgKiBlbmFibGluZyB2ZXJzaW9uaW5nIGJlZm9yZSBpc3N1aW5nIHdyaXRlIG9wZXJhdGlvbnMgKFBVVCBvciBERUxFVEUpIG9uIG9iamVjdHMgaW4gdGhlIGJ1Y2tldC5cbiAgICAgICAqXG4gICAgICAgKiBXcml0ZSBvcGVyYXRpb25zIGlzc3VlZCBiZWZvcmUgdGhpcyBjb252ZXJzaW9uIGlzIGNvbXBsZXRlIG1heSBhcHBseSB0byB1bnZlcnNpb25lZCBvYmplY3RzLlxuICAgICAgICovXG4gICAgICBpZiAoIXRoaXMuc291cmNlU2xlZXApIHtcbiAgICAgICAgdGhpcy5zb3VyY2VTbGVlcCA9IG5ldyBzbGVlcC5TbGVlcCh0aGlzLCBcIlZlcnNpb25pbmdTbGVlcFwiLCB7XG4gICAgICAgICAgY3JlYXRlRHVyYXRpb246IFwiMTVtXCIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpbmRleGVkU291cmNlID0gdGhpcy5zb3VyY2VzLmZpbmQoXG4gICAgICAoc291cmNlSW5kZXgpID0+IHNvdXJjZUluZGV4LnByb3BzID09PSBwcm9wcyxcbiAgICApO1xuICAgIGlmIChpbmRleGVkU291cmNlKSB7XG4gICAgICBpZiAoc291cmNlSWQgJiYgc291cmNlSWQgIT09IGluZGV4ZWRTb3VyY2UuaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBEdXBsaWNhdGUgYnVja2V0IHNvdXJjZSBmb3IgJHtpbmRleGVkU291cmNlLmlkfSBhbmQgJHtzb3VyY2VJZH0uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbmRleGVkU291cmNlLmlkO1xuICAgIH1cbiAgICBjb25zdCBuZXh0SW5kZXggPSB0aGlzLnNvdXJjZXMubGVuZ3RoO1xuICAgIGNvbnN0IGlkID0gc291cmNlSWQgPz8gYHNvdXJjZS0ke25leHRJbmRleH1gO1xuICAgIC8vIGVuc3VyZSBpZCAoaWYgcHJvdmlkZWQpIGlzIHVuaXF1ZSB3aXRoaW4gQnVja2V0XG4gICAgaWYgKHRoaXMuc291cmNlcy5zb21lKChzb3VyY2VJbmRleCkgPT4gc291cmNlSW5kZXguaWQgPT09IGlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRHVwbGljYXRlIHNvdXJjZSBpZCAke2lkfS4gU291cmNlSWRzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIEJ1Y2tldC5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5zb3VyY2VzLnB1c2goe1xuICAgICAgcHJvcHM6IHtcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIGJ1Y2tldDogdGhpcyxcbiAgICAgICAgZGVwZW5kc09uOiB0aGlzLnNvdXJjZVNsZWVwID8gW3RoaXMuc291cmNlU2xlZXBdIDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIGlkLFxuICAgIH0pO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIHB1YmxpYyBpc1dlYnNpdGUoKTogdGhpcyBpcyB7XG4gICAgd2Vic2l0ZURvbWFpbk5hbWU6IHN0cmluZztcbiAgICBidWNrZXRPdXRwdXRzOiB7IHdlYnNpdGVVcmw6IHN0cmluZzsgd2Vic2l0ZURvbWFpbk5hbWU6IHN0cmluZyB9O1xuICB9IHtcbiAgICByZXR1cm4gdGhpcy5faXNXZWJzaXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBodHRwcyBVUkwgb2YgYW4gUzMgb2JqZWN0LiBTcGVjaWZ5IGByZWdpb25hbDogZmFsc2VgIGF0IHRoZSBvcHRpb25zXG4gICAqIGZvciBub24tcmVnaW9uYWwgVVJMcy4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqIC0gYGh0dHBzOi8vczMudXMtd2VzdC0xLmFtYXpvbmF3cy5jb20vb25seWJ1Y2tldGBcbiAgICogLSBgaHR0cHM6Ly9zMy51cy13ZXN0LTEuYW1hem9uYXdzLmNvbS9idWNrZXQva2V5YFxuICAgKiAtIGBodHRwczovL3MzLmNuLW5vcnRoLTEuYW1hem9uYXdzLmNvbS5jbi9jaGluYS1idWNrZXQvbXlrZXlgXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgVGhlIFMzIGtleSBvZiB0aGUgb2JqZWN0LiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgVVJMIG9mIHRoZVxuICAgKiAgICAgIGJ1Y2tldCBpcyByZXR1cm5lZC5cbiAgICogQHJldHVybnMgYW4gT2JqZWN0UzNVcmwgdG9rZW5cbiAgICovXG4gIHB1YmxpYyB1cmxGb3JPYmplY3Qoa2V5Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGFjayA9IEF3c1N0YWNrLm9mQXdzQ29uc3RydWN0KHRoaXMpO1xuICAgIGNvbnN0IHByZWZpeCA9IGBodHRwczovL3MzLiR7dGhpcy5lbnYucmVnaW9ufS4ke3N0YWNrLnVybFN1ZmZpeH0vYDtcbiAgICBpZiAodHlwZW9mIGtleSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHRoaXMudXJsSm9pbihwcmVmaXgsIHRoaXMuYnVja2V0TmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnVybEpvaW4ocHJlZml4LCB0aGlzLmJ1Y2tldE5hbWUsIGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIFMzIFVSTCBvZiBhbiBTMyBvYmplY3QuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAtIGBzMzovL29ubHlidWNrZXRgXG4gICAqIC0gYHMzOi8vYnVja2V0L2tleWBcbiAgICpcbiAgICogQHBhcmFtIGtleSBUaGUgUzMga2V5IG9mIHRoZSBvYmplY3QuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBTMyBVUkwgb2YgdGhlXG4gICAqICAgICAgYnVja2V0IGlzIHJldHVybmVkLlxuICAgKiBAcmV0dXJucyBhbiBPYmplY3RTM1VybCB0b2tlblxuICAgKi9cbiAgcHVibGljIHMzVXJsRm9yT2JqZWN0KGtleT86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJlZml4ID0gXCJzMzovL1wiO1xuICAgIGlmICh0eXBlb2Yga2V5ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdGhpcy51cmxKb2luKHByZWZpeCwgdGhpcy5idWNrZXROYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXJsSm9pbihwcmVmaXgsIHRoaXMuYnVja2V0TmFtZSwga2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIEFSTiB0aGF0IHJlcHJlc2VudHMgYWxsIG9iamVjdHMgd2l0aGluIHRoZSBidWNrZXQgdGhhdCBtYXRjaFxuICAgKiB0aGUga2V5IHBhdHRlcm4gc3BlY2lmaWVkLiBUbyByZXByZXNlbnQgYWxsIGtleXMsIHNwZWNpZnkgYGBcIipcImBgLlxuICAgKlxuICAgKiBJZiB5b3UgbmVlZCB0byBzcGVjaWZ5IGEga2V5UGF0dGVybiB3aXRoIG11bHRpcGxlIGNvbXBvbmVudHMsIGNvbmNhdGVuYXRlIHRoZW0gaW50byBhIHNpbmdsZSBzdHJpbmcsIGUuZy46XG4gICAqXG4gICAqICAgYXJuRm9yT2JqZWN0cyhgaG9tZS8ke3RlYW19LyR7dXNlcn0vKmApXG4gICAqXG4gICAqL1xuICBwdWJsaWMgYXJuRm9yT2JqZWN0cyhrZXlQYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmJ1Y2tldEFybn0vJHtrZXlQYXR0ZXJufWA7XG4gIH1cblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNDAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtczMvbGliL2J1Y2tldC50cyNMOTUzXG4gIHByaXZhdGUgdXJsSm9pbiguLi5jb21wb25lbnRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbXBvbmVudHMucmVkdWNlKChyZXN1bHQsIGNvbXBvbmVudCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5lbmRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wb25lbnQuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50LnNsaWNlKDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke3Jlc3VsdH0vJHtjb21wb25lbnR9YDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHJlc291cmNlIHRvIHRoZSBUZXJyYWZvcm0gSlNPTiBvdXRwdXQgYXQgU3ludGggdGltZS5cbiAgICpcbiAgICogY2FsbGVkIGJ5IFRlcnJhZm9ybVN0YWNrLnByZXBhcmVTdGFjaygpXG4gICAqL1xuICBwdWJsaWMgdG9UZXJyYWZvcm0oKTogYW55IHtcbiAgICAvKipcbiAgICAgKiBBIHByZXBhcmluZyByZXNvbHZlIG1pZ2h0IGFkZCBuZXcgcmVzb3VyY2VzIHRvIHRoZSBzdGFja1xuICAgICAqXG4gICAgICogc2hvdWxkIG5vdCBhZGQgcmVzb3VyY2VzIGlmIG5vIGJ1Y2tldCBzb3VyY2VzIGFyZSBkZWZpbmVkXG4gICAgICovXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuc291cmNlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzb3VyY2Ugb2YgdGhpcy5zb3VyY2VzKSB7XG4gICAgICAvLyBUT0RPOiBJZGVhbGx5IHdlIHNob3VsZCBoYXZlIHVzZWQgSVJlc29sdmFibGUucmVzb2x2ZSBhbmQgdXNlIHRoZSBJUmVzb2x2ZUNvbnRleHQucHJlcGFyaW5nIGZsYWdcbiAgICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTcwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWlhbS9saWIvcG9saWN5LWRvY3VtZW50LnRzI0w0OFxuICAgICAgaWYgKHRoaXMubm9kZS50cnlGaW5kQ2hpbGQoc291cmNlLmlkKSkgY29udGludWU7IC8vIGlnbm9yZSBpZiBhbHJlYWR5IGdlbmVyYXRlZFxuICAgICAgbmV3IEJ1Y2tldFNvdXJjZSh0aGlzLCBzb3VyY2UuaWQsIHNvdXJjZS5wcm9wcyk7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBgQnVja2V0YCBwcm92aWRlcyBhbiBbQVdTIFMzIEJ1Y2tldF0oaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9zMy8pLlxuICpcbiAqIGBgYHRzXG4gKiBuZXcgc3RvcmFnZS5CdWNrZXQoc3RhY2ssIFwiTXlXZWJzaXRlXCIsIHtcbiAqICAgcGF0aDogcGF0aC5qb2luKF9fZGlybmFtZSwgXCJkaXN0XCIpLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiAjIyMjIFB1YmxpYyByZWFkIGFjY2Vzc1xuICpcbiAqIEVuYWJsZXMgYHB1YmxpY2AgcmVhZCBhY2Nlc3MgZm9yIGFsbCB0aGUgZmlsZXMgaW4gdGhlIGJ1Y2tldC4gRGFuZ2Vyb3VzIGFuZFxuICogcmVjb21tZW5kZWQgdG8gdXNlIGVkZ2UuRGlzdHJpYnV0aW9uIGluc3RlYWQuXG4gKlxuICogVXNlZnVsIGZvciBob3N0aW5nIHB1YmxpYyBmaWxlcyBkaXJlY3RseSBmcm9tIFMzLlxuICpcbiAqIGBgYHRzXG4gKiBuZXcgc3RvcmFnZS5CdWNrZXQoXCJNeUJ1Y2tldFwiLCB7XG4gKiAgIHB1YmxpYzogdHJ1ZVxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAcmVzb3VyY2UgYXdzX3MzX2J1Y2tldFxuICogQHRlcnJhY29uc3RydWN0IHN0b3JhZ2UuSUJ1Y2tldFxuICovXG5cbmV4cG9ydCBjbGFzcyBCdWNrZXQgZXh0ZW5kcyBCdWNrZXRCYXNlIGltcGxlbWVudHMgSUJ1Y2tldCB7XG4gIC8vIFRPRE86IEFkZCBzdGF0aWMgZnJvbUxvb2t1cD9cbiAgcHVibGljIHN0YXRpYyBmcm9tQnVja2V0TmFtZShcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYnVja2V0TmFtZTogc3RyaW5nLFxuICApOiBJQnVja2V0IHtcbiAgICByZXR1cm4gQnVja2V0LmZyb21CdWNrZXRBdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyBidWNrZXROYW1lIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBCdWNrZXQgY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCBidWNrZXQuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgcGFyZW50IGNyZWF0aW5nIGNvbnN0cnVjdCAodXN1YWxseSBgdGhpc2ApLlxuICAgKiBAcGFyYW0gaWQgVGhlIGNvbnN0cnVjdCdzIG5hbWUuXG4gICAqIEBwYXJhbSBhdHRycyBBIGBCdWNrZXRBdHRyaWJ1dGVzYCBvYmplY3QuIENhbiBiZSBvYnRhaW5lZCBmcm9tIGEgY2FsbCB0b1xuICAgKiBgYnVja2V0LmV4cG9ydCgpYCBvciBtYW51YWxseSBjcmVhdGVkLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQnVja2V0QXR0cmlidXRlcyhcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYXR0cnM6IEJ1Y2tldEF0dHJpYnV0ZXMsXG4gICk6IElCdWNrZXQge1xuICAgIGNvbnN0IHN0YWNrID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3Qoc2NvcGUpO1xuICAgIGNvbnN0IHJlZ2lvbiA9IGF0dHJzLnJlZ2lvbiA/PyBzdGFjay5yZWdpb247XG4gICAgY29uc3QgdXJsU3VmZml4ID0gc3RhY2sudXJsU3VmZml4O1xuXG4gICAgY29uc3QgYnVja2V0TmFtZSA9IHBhcnNlQnVja2V0TmFtZShzY29wZSwgYXR0cnMpO1xuICAgIGlmICghYnVja2V0TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnVja2V0IG5hbWUgaXMgcmVxdWlyZWRcIik7XG4gICAgfVxuICAgIEJ1Y2tldC52YWxpZGF0ZUJ1Y2tldE5hbWUoYnVja2V0TmFtZSwgdHJ1ZSk7XG5cbiAgICBsZXQgc3RhdGljRG9tYWluRW5kcG9pbnQgPSBzM1N0YXRpY1dlYnNpdGVFbmRwb2ludChyZWdpb24pO1xuICAgIC8vIFRPRE86IHN1cHBvcnQgbGF6eSBsb29rdXAgYmFzZWQgb24gVW5yZXNvbHZlZCByZWdpb25cbiAgICAvLyBMYXp5LnN0cmluZ1ZhbHVlKHtcbiAgICAvLyAgIHByb2R1Y2U6ICgpID0+XG4gICAgLy8gICAgIHN0YWNrLnJlZ2lvbmFsRmFjdChcbiAgICAvLyAgICAgICByZWdpb25JbmZvcm1hdGlvbi5GYWN0TmFtZS5TM19TVEFUSUNfV0VCU0lURV9FTkRQT0lOVCxcbiAgICAvLyAgICAgICBuZXdFbmRwb2ludCxcbiAgICAvLyAgICAgKSxcbiAgICAvLyB9KTtcbiAgICBjb25zdCB3ZWJzaXRlRG9tYWluID0gYCR7YnVja2V0TmFtZX0uJHtzdGF0aWNEb21haW5FbmRwb2ludH1gO1xuXG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgQnVja2V0QmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYnVja2V0TmFtZSA9IGJ1Y2tldE5hbWUhO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGJ1Y2tldEFybiA9IHBhcnNlQnVja2V0QXJuKHNjb3BlLCBhdHRycyk7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYnVja2V0RG9tYWluTmFtZSA9XG4gICAgICAgIGF0dHJzLmJ1Y2tldERvbWFpbk5hbWUgfHwgYCR7YnVja2V0TmFtZX0uczMuJHt1cmxTdWZmaXh9YDtcbiAgICAgIC8vIE5PVEUgcHJldmlvdXMgdmVyc2lvbnMgZXJyb3I6IHJlc291cmNlLndlYnNpdGVEb21haW4gc2hvdWxkIGJlIHdlYnNpdGVFbmRwb2ludCAod2l0aG91dCBodHRwOi8vKVxuICAgICAgLy8gUmVmOiBodHRwczovL2dpdGh1Yi5jb20vaGFzaGljb3JwL3RlcnJhZm9ybS1wcm92aWRlci1hd3MvYmxvYi92Ni4wLjAvaW50ZXJuYWwvc2VydmljZS9zMy9idWNrZXQuZ28jTDE3MDgtTDE3MTJcbiAgICAgIHB1YmxpYyByZWFkb25seSB3ZWJzaXRlRG9tYWluTmFtZSA9IHN0YXRpY0RvbWFpbkVuZHBvaW50O1xuICAgICAgLy8gVE9ETzogcmUtYWxpZ24gdG8gQVdTQ0RLIGJ1Y2tldFdlYnNpdGVEb21haW5OYW1lIC4uLlxuICAgICAgLy8gYXR0cnMuYnVja2V0V2Vic2l0ZVVybFxuICAgICAgLy8gICA/IEZuLnNlbGVjdCgyLCBGbi5zcGxpdChcIi9cIiwgYXR0cnMuYnVja2V0V2Vic2l0ZVVybCkpIC8vIGRyb3AgaHR0cDovL1xuICAgICAgLy8gICA6IHdlYnNpdGVEb21haW47XG4gICAgICAvLyBUT0RPOiBEb2VzIG5vdCBleGlzdCBmb3IgQVdTQ0RLXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgd2Vic2l0ZUVuZHBvaW50ID0gd2Vic2l0ZURvbWFpbjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBidWNrZXRXZWJzaXRlVXJsID1cbiAgICAgICAgYXR0cnMuYnVja2V0V2Vic2l0ZVVybCB8fCBgaHR0cDovLyR7d2Vic2l0ZURvbWFpbn1gO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGJ1Y2tldFJlZ2lvbmFsRG9tYWluTmFtZSA9XG4gICAgICAgIGF0dHJzLmJ1Y2tldFJlZ2lvbmFsRG9tYWluTmFtZSB8fFxuICAgICAgICBgJHtidWNrZXROYW1lfS5zMy4ke3JlZ2lvbn0uJHt1cmxTdWZmaXh9YDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBidWNrZXREdWFsU3RhY2tEb21haW5OYW1lID1cbiAgICAgICAgYXR0cnMuYnVja2V0RHVhbFN0YWNrRG9tYWluTmFtZSB8fFxuICAgICAgICBgJHtidWNrZXROYW1lfS5zMy5kdWFsc3RhY2suJHtyZWdpb259LiR7dXJsU3VmZml4fWA7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZW5jcnlwdGlvbktleSA9IGF0dHJzLmVuY3J5cHRpb25LZXk7XG5cbiAgICAgIHB1YmxpYyBnZXQgaG9zdGVkWm9uZUlkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBzM1N0YXRpY1dlYnNpdGVIb3N0ZWRab25lSWQocmVnaW9uKTtcbiAgICAgIH1cbiAgICAgIHB1YmxpYyByZWFkb25seSBwdWJsaWMgPSBhdHRycy5wdWJsaWMgPz8gZmFsc2U7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbmVkID0gYXR0cnMudmVyc2lvbmVkID8/IGZhbHNlO1xuICAgICAgcHVibGljIHBvbGljeT86IEJ1Y2tldFBvbGljeSA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBvcmlnaW5BY2Nlc3NJZGVudGl0eSA9IGF0dHJzLm9yaWdpbkFjY2Vzc0lkZW50aXR5O1xuICAgICAgcHVibGljIHJlYWRvbmx5IF9pc1dlYnNpdGUgPSAhIWF0dHJzLmlzV2Vic2l0ZTtcbiAgICAgIHByb3RlY3RlZCBhdXRvQ3JlYXRlUG9saWN5ID0gZmFsc2U7XG4gICAgICBwdWJsaWMgaXNXZWJzaXRlKCk6IHRoaXMgaXMge1xuICAgICAgICB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nO1xuICAgICAgICBidWNrZXRPdXRwdXRzOiB7IHdlYnNpdGVVcmw6IHN0cmluZzsgd2Vic2l0ZURvbWFpbk5hbWU6IHN0cmluZyB9O1xuICAgICAgfSB7XG4gICAgICAgIHJldHVybiBhdHRycy5pc1dlYnNpdGUgPz8gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBwcm90ZWN0ZWQgZGlzYWxsb3dQdWJsaWNBY2Nlc3MgPSBmYWxzZTtcbiAgICAgIC8vIHByb3RlY3RlZCBub3RpZmljYXRpb25zSGFuZGxlclJvbGUgPSBhdHRycy5ub3RpZmljYXRpb25zSGFuZGxlclJvbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkLCB7XG4gICAgICBhY2NvdW50OiBhdHRycy5hY2NvdW50LFxuICAgICAgcmVnaW9uOiBhdHRycy5yZWdpb24sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3duIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gYnVja2V0IG5hbWUgaXMgbm90IHZhbGlkLlxuICAgKlxuICAgKiBAcGFyYW0gcGh5c2ljYWxOYW1lIG5hbWUgb2YgdGhlIGJ1Y2tldC5cbiAgICogQHBhcmFtIGFsbG93TGVnYWN5QnVja2V0TmFtaW5nIGFsbG93IGxlZ2FjeSBidWNrZXQgbmFtaW5nIHN0eWxlLCBkZWZhdWx0IGlzIGZhbHNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2YWxpZGF0ZUJ1Y2tldE5hbWUoXG4gICAgcGh5c2ljYWxOYW1lOiBzdHJpbmcsXG4gICAgYWxsb3dMZWdhY3lCdWNrZXROYW1pbmc6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgYnVja2V0TmFtZSA9IHBoeXNpY2FsTmFtZTtcbiAgICBpZiAoIWJ1Y2tldE5hbWUgfHwgVG9rZW4uaXNVbnJlc29sdmVkKGJ1Y2tldE5hbWUpKSB7XG4gICAgICAvLyB0aGUgbmFtZSBpcyBhIGxhdGUtYm91bmQgdmFsdWUsIG5vdCBhIGRlZmluZWQgc3RyaW5nLFxuICAgICAgLy8gc28gc2tpcCB2YWxpZGF0aW9uXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gUnVsZXMgY29kaWZpZWQgZnJvbSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9CdWNrZXRSZXN0cmljdGlvbnMuaHRtbFxuICAgIGlmIChidWNrZXROYW1lLmxlbmd0aCA8IDMgfHwgYnVja2V0TmFtZS5sZW5ndGggPiA2Mykge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIFwiQnVja2V0IG5hbWUgbXVzdCBiZSBhdCBsZWFzdCAzIGFuZCBubyBtb3JlIHRoYW4gNjMgY2hhcmFjdGVyc1wiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbGxlZ2FsQ2hhcnNldFJlZ0V4ID0gYWxsb3dMZWdhY3lCdWNrZXROYW1pbmdcbiAgICAgID8gL1teQS1aYS16MC05Ll8tXS9cbiAgICAgIDogL1teYS16MC05Li1dLztcbiAgICBjb25zdCBhbGxvd2VkRWRnZUNoYXJzZXRSZWdFeCA9IGFsbG93TGVnYWN5QnVja2V0TmFtaW5nXG4gICAgICA/IC9bQS1aYS16MC05XS9cbiAgICAgIDogL1thLXowLTldLztcblxuICAgIGNvbnN0IGlsbGVnYWxDaGFyTWF0Y2ggPSBidWNrZXROYW1lLm1hdGNoKGlsbGVnYWxDaGFyc2V0UmVnRXgpO1xuICAgIGlmIChpbGxlZ2FsQ2hhck1hdGNoKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgYWxsb3dMZWdhY3lCdWNrZXROYW1pbmdcbiAgICAgICAgICA/IFwiQnVja2V0IG5hbWUgbXVzdCBvbmx5IGNvbnRhaW4gdXBwZXJjYXNlIG9yIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIGFuZCB0aGUgc3ltYm9scywgcGVyaW9kICguKSwgdW5kZXJzY29yZSAoXyksIGFuZCBkYXNoICgtKVwiXG4gICAgICAgICAgOiBcIkJ1Y2tldCBuYW1lIG11c3Qgb25seSBjb250YWluIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIGFuZCB0aGUgc3ltYm9scywgcGVyaW9kICguKSBhbmQgZGFzaCAoLSlcIiArXG4gICAgICAgICAgICAgIGAgKG9mZnNldDogJHtpbGxlZ2FsQ2hhck1hdGNoLmluZGV4fSlgLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFhbGxvd2VkRWRnZUNoYXJzZXRSZWdFeC50ZXN0KGJ1Y2tldE5hbWUuY2hhckF0KDApKSkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIGFsbG93TGVnYWN5QnVja2V0TmFtaW5nXG4gICAgICAgICAgPyBcIkJ1Y2tldCBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UsIGxvd2VyY2FzZSBjaGFyYWN0ZXIgb3IgbnVtYmVyXCJcbiAgICAgICAgICA6IFwiQnVja2V0IG5hbWUgbXVzdCBzdGFydCB3aXRoIGEgbG93ZXJjYXNlIGNoYXJhY3RlciBvciBudW1iZXJcIiArXG4gICAgICAgICAgICAgIFwiIChvZmZzZXQ6IDApXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhYWxsb3dlZEVkZ2VDaGFyc2V0UmVnRXgudGVzdChidWNrZXROYW1lLmNoYXJBdChidWNrZXROYW1lLmxlbmd0aCAtIDEpKVxuICAgICkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIGFsbG93TGVnYWN5QnVja2V0TmFtaW5nXG4gICAgICAgICAgPyBcIkJ1Y2tldCBuYW1lIG11c3QgZW5kIHdpdGggYW4gdXBwZXJjYXNlLCBsb3dlcmNhc2UgY2hhcmFjdGVyIG9yIG51bWJlclwiXG4gICAgICAgICAgOiBcIkJ1Y2tldCBuYW1lIG11c3QgZW5kIHdpdGggYSBsb3dlcmNhc2UgY2hhcmFjdGVyIG9yIG51bWJlclwiICtcbiAgICAgICAgICAgICAgYCAob2Zmc2V0OiAke2J1Y2tldE5hbWUubGVuZ3RoIC0gMX0pYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uc2VjU3ltYm9sTWF0Y2ggPSBidWNrZXROYW1lLm1hdGNoKC9cXC4tfC1cXC58XFwuXFwuLyk7XG4gICAgaWYgKGNvbnNlY1N5bWJvbE1hdGNoKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgXCJCdWNrZXQgbmFtZSBtdXN0IG5vdCBoYXZlIGRhc2ggbmV4dCB0byBwZXJpb2QsIG9yIHBlcmlvZCBuZXh0IHRvIGRhc2gsIG9yIGNvbnNlY3V0aXZlIHBlcmlvZHNcIiArXG4gICAgICAgICAgYCAob2Zmc2V0OiAke2NvbnNlY1N5bWJvbE1hdGNoLmluZGV4fSlgLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKC9eXFxkezEsM31cXC5cXGR7MSwzfVxcLlxcZHsxLDN9XFwuXFxkezEsM30kLy50ZXN0KGJ1Y2tldE5hbWUpKSB7XG4gICAgICBlcnJvcnMucHVzaChcIkJ1Y2tldCBuYW1lIG11c3Qgbm90IHJlc2VtYmxlIGFuIElQIGFkZHJlc3NcIik7XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIFMzIGJ1Y2tldCBuYW1lICh2YWx1ZTogJHtidWNrZXROYW1lfSkke0VPTH0ke2Vycm9ycy5qb2luKEVPTCl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc291cmNlOlxuICAgIHwgczNCdWNrZXQuUzNCdWNrZXRcbiAgICB8IGRhdGFBd3NTM0J1Y2tldC5EYXRhQXdzUzNCdWNrZXQ7XG4gIHByb3RlY3RlZCByZWFkb25seSB3ZWJzaXRlQ29uZmlnPzogczNCdWNrZXRXZWJzaXRlQ29uZmlndXJhdGlvbi5TM0J1Y2tldFdlYnNpdGVDb25maWd1cmF0aW9uO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29yc0NvbmZpZz86IHMzQnVja2V0Q29yc0NvbmZpZ3VyYXRpb24uUzNCdWNrZXRDb3JzQ29uZmlndXJhdGlvbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9yaWdpbkFjY2Vzc0lkZW50aXR5PzogT3JpZ2luQWNjZXNzSWRlbnRpdHk7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2lzV2Vic2l0ZTogYm9vbGVhbjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF92ZXJzaW9uZWQ6IGJvb2xlYW47XG5cbiAgcHVibGljIGdldCBidWNrZXRBcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5hcm47XG4gIH1cbiAgcHVibGljIGdldCBidWNrZXROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2UuYnVja2V0O1xuICB9XG4gIHB1YmxpYyBnZXQgYnVja2V0RG9tYWluTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLmJ1Y2tldERvbWFpbk5hbWU7XG4gIH1cbiAgcHVibGljIGdldCBidWNrZXRSZWdpb25hbERvbWFpbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5idWNrZXRSZWdpb25hbERvbWFpbk5hbWU7XG4gIH1cbiAgcHVibGljIGdldCB3ZWJzaXRlRG9tYWluTmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLndlYnNpdGVDb25maWc/LndlYnNpdGVEb21haW47XG4gIH1cbiAgcHVibGljIGdldCB3ZWJzaXRlRW5kcG9pbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy53ZWJzaXRlQ29uZmlnPy53ZWJzaXRlRW5kcG9pbnQ7XG4gIH1cbiAgcHVibGljIGdldCB2ZXJzaW9uZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb25lZDtcbiAgfVxuICBwdWJsaWMgZ2V0IGhvc3RlZFpvbmVJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLmhvc3RlZFpvbmVJZDtcbiAgfVxuXG4gIHB1YmxpYyBwb2xpY3k/OiBCdWNrZXRQb2xpY3k7XG4gIHByb3RlY3RlZCBhdXRvQ3JlYXRlUG9saWN5ID0gdHJ1ZTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnVja2V0IGlzIHB1YmxpYyBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHVibGljPzogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudEJyaWRnZUVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIG5hbWU6IHN0cmluZywgcHJvcHM6IEJ1Y2tldFByb3BzID0ge30pIHtcbiAgICBzdXBlcihzY29wZSwgbmFtZSwgcHJvcHMpO1xuXG4gICAgY29uc3QgeyBidWNrZXRFbmNyeXB0aW9uLCBlbmNyeXB0aW9uS2V5IH0gPSB0aGlzLnBhcnNlRW5jcnlwdGlvbihwcm9wcyk7XG4gICAgY29uc3QgeyB3ZWJzaXRlQ29uZmlnLCBjb3JzQ29uZmlnLCBjbG91ZGZyb250QWNjZXNzIH0gPSBwcm9wcztcbiAgICB0aGlzLl9pc1dlYnNpdGUgPSBmYWxzZTtcblxuICAgIGlmIChwcm9wcy5idWNrZXROYW1lICYmIHByb3BzLm5hbWVQcmVmaXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3Qgc3BlY2lmeSBib3RoICdidWNrZXROYW1lJyBhbmQgJ25hbWVQcmVmaXgnLiBVc2Ugb25seSBvbmUuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBidWNrZXRQcmVmaXg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIXByb3BzLmJ1Y2tldE5hbWUpIHtcbiAgICAgIC8vIEJ1Y2tldCBuYW1lcyBtdXN0IGJlIGxvd2VyY2FzZSBhbmQgYmV0d2VlbiAzIChtaW4pIGFuZCA2MyAobWF4KSBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICBidWNrZXRQcmVmaXggPSB0aGlzLnN0YWNrLnVuaXF1ZVJlc291cmNlTmFtZVByZWZpeCh0aGlzLCB7XG4gICAgICAgIHByZWZpeDogKHByb3BzLm5hbWVQcmVmaXggPz8gdGhpcy5ncmlkVVVJRCkgKyBcIi1cIixcbiAgICAgICAgbG93ZXJDYXNlOiB0cnVlLFxuICAgICAgICBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6IFwiLi1cIixcbiAgICAgICAgbWF4TGVuZ3RoOiA2MyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgczNCdWNrZXQuUzNCdWNrZXQodGhpcywgXCJSZXNvdXJjZVwiLCB7XG4gICAgICBidWNrZXQ6IHByb3BzLmJ1Y2tldE5hbWUsXG4gICAgICBmb3JjZURlc3Ryb3k6IHByb3BzLmZvcmNlRGVzdHJveSxcbiAgICAgIGJ1Y2tldFByZWZpeCxcbiAgICB9KTtcblxuICAgIHRoaXMuX3ZlcnNpb25lZCA9IHByb3BzLnZlcnNpb25lZCA/PyBmYWxzZTtcbiAgICBpZiAodGhpcy5fdmVyc2lvbmVkKSB7XG4gICAgICBuZXcgczNCdWNrZXRWZXJzaW9uaW5nLlMzQnVja2V0VmVyc2lvbmluZ0EodGhpcywgXCJWZXJzaW9uaW5nXCIsIHtcbiAgICAgICAgYnVja2V0OiB0aGlzLnJlc291cmNlLmJ1Y2tldCxcbiAgICAgICAgdmVyc2lvbmluZ0NvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBzdGF0dXM6IHRoaXMuX3ZlcnNpb25lZCA/IFwiRW5hYmxlZFwiIDogXCJTdXNwZW5kZWRcIixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmV2ZW50QnJpZGdlRW5hYmxlZCA9IHByb3BzLmV2ZW50QnJpZGdlRW5hYmxlZDtcblxuICAgIGlmIChwcm9wcy5zb3VyY2VzKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BzLnNvdXJjZXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhpcy5hZGRTb3VyY2UoeyBwYXRoOiBwcm9wcy5zb3VyY2VzIH0pO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHByb3BzLnNvdXJjZXMpKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlUHJvcHMgb2YgcHJvcHMuc291cmNlcykge1xuICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkU291cmNlKHsgcGF0aDogc291cmNlUHJvcHMgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRkU291cmNlKHNvdXJjZVByb3BzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocHJvcHMubGlmZWN5Y2xlUnVsZXMpIHtcbiAgICAgIG5ldyBzM0J1Y2tldExpZmVjeWNsZUNvbmZpZ3VyYXRpb24uUzNCdWNrZXRMaWZlY3ljbGVDb25maWd1cmF0aW9uKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIkxpZmVDeWNsZUNvbmZpZ1wiLFxuICAgICAgICB7XG4gICAgICAgICAgYnVja2V0OiB0aGlzLnJlc291cmNlLmJ1Y2tldCxcbiAgICAgICAgICBydWxlOiBwcm9wcy5saWZlY3ljbGVSdWxlcy5tYXAoKHJ1bGUpID0+ICh7XG4gICAgICAgICAgICAuLi5ydWxlLFxuICAgICAgICAgICAgc3RhdHVzOiBydWxlLmVuYWJsZWQgPyBcIkVuYWJsZWRcIiA6IFwiRGlzYWJsZWRcIixcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEVuZm9yY2UgQVdTIEZvdW5kYXRpb25hbCBTZWN1cml0eSBCZXN0IFByYWN0aWNlXG4gICAgaWYgKHByb3BzLmVuZm9yY2VTU0wpIHtcbiAgICAgIHRoaXMuZW5mb3JjZVNTTFN0YXRlbWVudCgpO1xuICAgICAgdGhpcy5taW5pbXVtVExTVmVyc2lvblN0YXRlbWVudChwcm9wcy5taW5pbXVtVExTVmVyc2lvbik7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5taW5pbXVtVExTVmVyc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIidlbmZvcmNlU1NMJyBtdXN0IGJlIGVuYWJsZWQgZm9yICdtaW5pbXVtVExTVmVyc2lvbicgdG8gYmUgYXBwbGllZFwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAod2Vic2l0ZUNvbmZpZyAmJiB3ZWJzaXRlQ29uZmlnLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuX2lzV2Vic2l0ZSA9IHRydWU7XG4gICAgICB0aGlzLndlYnNpdGVDb25maWcgPVxuICAgICAgICBuZXcgczNCdWNrZXRXZWJzaXRlQ29uZmlndXJhdGlvbi5TM0J1Y2tldFdlYnNpdGVDb25maWd1cmF0aW9uKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJXZWJzaXRlQ29uZmlnXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYnVja2V0OiB0aGlzLnJlc291cmNlLmJ1Y2tldCxcbiAgICAgICAgICAgIC4uLndlYnNpdGVDb25maWcsXG4gICAgICAgICAgICBpbmRleERvY3VtZW50OiB3ZWJzaXRlQ29uZmlnPy5pbmRleERvY3VtZW50XG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgc3VmZml4OiB3ZWJzaXRlQ29uZmlnLmluZGV4RG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgIHN1ZmZpeDogXCJpbmRleC5odG1sXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHRoaXMucHVibGljID0gcHJvcHMucHVibGljID8/IGZhbHNlO1xuICAgIGlmICh0aGlzLnB1YmxpYykge1xuICAgICAgLy8gVE9ETzogc3dpdGNoIHRvIExhenkgY29uZmlnIHVzaW5nIFwiZ3JhbnRQdWJsaWNBY2Nlc3NcIiBtZWNoYW5pc20gaW5zdGVhZD9cbiAgICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXMzL2xpYi9idWNrZXQudHMjTDg1MFxuICAgICAgY29uc3Qgb3duZXJzaGlwQ29udHJvbHMgPVxuICAgICAgICBuZXcgczNCdWNrZXRPd25lcnNoaXBDb250cm9scy5TM0J1Y2tldE93bmVyc2hpcENvbnRyb2xzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJPd25lcnNoaXBDb250cm9sc1wiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5yZXNvdXJjZS5idWNrZXQsXG4gICAgICAgICAgICBydWxlOiB7XG4gICAgICAgICAgICAgIG9iamVjdE93bmVyc2hpcDogXCJCdWNrZXRPd25lclByZWZlcnJlZFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgY29uc3QgcHVibGljQWNjZXNzQmxvY2sgPVxuICAgICAgICBuZXcgczNCdWNrZXRQdWJsaWNBY2Nlc3NCbG9jay5TM0J1Y2tldFB1YmxpY0FjY2Vzc0Jsb2NrKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJQdWJsaWNBY2Nlc3NCbG9ja1wiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5yZXNvdXJjZS5idWNrZXQsXG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjbHM6IGZhbHNlLFxuICAgICAgICAgICAgYmxvY2tQdWJsaWNQb2xpY3k6IGZhbHNlLFxuICAgICAgICAgICAgaWdub3JlUHVibGljQWNsczogZmFsc2UsXG4gICAgICAgICAgICByZXN0cmljdFB1YmxpY0J1Y2tldHM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICBuZXcgczNCdWNrZXRBY2wuUzNCdWNrZXRBY2wodGhpcywgXCJQdWJsaWNBY2xcIiwge1xuICAgICAgICBidWNrZXQ6IHRoaXMucmVzb3VyY2UuYnVja2V0LFxuICAgICAgICBhY2w6IFwicHVibGljLXJlYWRcIixcbiAgICAgICAgZGVwZW5kc09uOiBbb3duZXJzaGlwQ29udHJvbHMsIHB1YmxpY0FjY2Vzc0Jsb2NrXSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgcmVzb3VyY2VzOiBbdGhpcy5hcm5Gb3JPYmplY3RzKFwiKlwiKV0sXG4gICAgICAgICAgYWN0aW9uczogW1wiczM6R2V0T2JqZWN0XCJdLFxuICAgICAgICAgIHByaW5jaXBhbHM6IFtuZXcgaWFtLkFueVByaW5jaXBhbCgpXSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgLy8gLy8gcG9saWN5IGRlcGVuZHMgb24gcHVibGljIGFjY2VzcyBibG9jaz9cbiAgICAgIC8vIC8vIGlzIHRoaXMgbmVlZGVkP1xuICAgICAgLy8gaWYgKHBvbGljeURlcGVuZGFibGUgJiYgcG9saWN5RGVwZW5kYWJsZSBpbnN0YW5jZW9mIENvbnN0cnVjdCkge1xuICAgICAgLy8gICBwb2xpY3lEZXBlbmRhYmxlLm5vZGUuYWRkRGVwZW5kZW5jeShwdWJsaWNBY2Nlc3NCbG9jayk7XG4gICAgICAvLyB9XG4gICAgfVxuXG4gICAgaWYgKGNvcnNDb25maWcpIHtcbiAgICAgIHRoaXMuY29yc0NvbmZpZyA9IG5ldyBzM0J1Y2tldENvcnNDb25maWd1cmF0aW9uLlMzQnVja2V0Q29yc0NvbmZpZ3VyYXRpb24oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiQ29yc0NvbmZpZ1wiLFxuICAgICAgICB7XG4gICAgICAgICAgYnVja2V0OiB0aGlzLnJlc291cmNlLmJ1Y2tldCxcbiAgICAgICAgICAuLi5jb3JzQ29uZmlnLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY2xvdWRmcm9udEFjY2Vzcz8uZW5hYmxlZCkge1xuICAgICAgY29uc3Qgb2FpID0gbmV3IE9yaWdpbkFjY2Vzc0lkZW50aXR5KHRoaXMsIFwiT3JpZ2luQWNjZXNzSWRlbnRpdHlcIiwge1xuICAgICAgICBjb21tZW50OiBgT0FJIGZvciAke3RoaXMucmVzb3VyY2UuYnVja2V0fWAsXG4gICAgICB9KTtcbiAgICAgIHRoaXMub3JpZ2luQWNjZXNzSWRlbnRpdHkgPSBvYWk7XG4gICAgICBjb25zdCByZXNvdXJjZXMgPSAoY2xvdWRmcm9udEFjY2Vzcy5rZXlQYXR0ZXJucyA/PyBbXCIqXCJdKS5tYXAoXG4gICAgICAgIChrZXlQYXR0ZXJuKSA9PiB0aGlzLmFybkZvck9iamVjdHMoa2V5UGF0dGVybiksXG4gICAgICApO1xuICAgICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgIGFjdGlvbnM6IFtcInMzOkdldE9iamVjdFwiXSxcbiAgICAgICAgICBwcmluY2lwYWxzOiBbb2FpLmdyYW50UHJpbmNpcGFsXSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmV2ZW50QnJpZGdlRW5hYmxlZCkge1xuICAgICAgdGhpcy5lbmFibGVFdmVudEJyaWRnZU5vdGlmaWNhdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBlbmNyeXB0aW9uS2V5O1xuICAgIGlmIChidWNrZXRFbmNyeXB0aW9uKSB7XG4gICAgICBuZXcgczNCdWNrZXRTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24uUzNCdWNrZXRTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb25BKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIkVuY3J5cHRpb25cIixcbiAgICAgICAge1xuICAgICAgICAgIGJ1Y2tldDogdGhpcy5yZXNvdXJjZS5idWNrZXQsXG4gICAgICAgICAgLi4uYnVja2V0RW5jcnlwdGlvbixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCBrZXkgcHJvcGVydGllcyBhbmQgcmV0dXJuIHRoZSBCdWNrZXQgZW5jcnlwdGlvbiBwcm9wZXJ0eSBmcm9tIHRoZVxuICAgKiB1c2VyJ3MgY29uZmlndXJhdGlvbiwgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgdGFibGU6XG4gICAqXG4gICAqIHwgcHJvcHMuZW5jcnlwdGlvbiB8IHByb3BzLmVuY3J5cHRpb25LZXkgfCBwcm9wcy5idWNrZXRLZXlFbmFibGVkIHwgYnVja2V0RW5jcnlwdGlvbiAocmV0dXJuIHZhbHVlKSB8IGVuY3J5cHRpb25LZXkgKHJldHVybiB2YWx1ZSkgfFxuICAgKiB8LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgICogfCB1bmRlZmluZWQgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgVU5FTkNSWVBURUQgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgfCBmYWxzZSAgICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IHVuZGVmaW5lZCAgICAgICAgfCBrICAgICAgICAgICAgICAgICAgIHwgZSAgICAgICAgICAgICAgICAgICAgICB8IFNTRS1LTVMsIGJ1Y2tldEtleUVuYWJsZWQgPSBlICAgfCBrICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBLTVMgICAgICAgICAgICAgIHwgayAgICAgICAgICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCBTU0UtS01TLCBidWNrZXRLZXlFbmFibGVkID0gZSAgIHwgayAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgS01TICAgICAgICAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgfCBlICAgICAgICAgICAgICAgICAgICAgIHwgU1NFLUtNUywgYnVja2V0S2V5RW5hYmxlZCA9IGUgICB8IG5ldyBrZXkgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IEtNU19NQU5BR0VEICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgIHwgZSAgICAgICAgICAgICAgICAgICAgICB8IFNTRS1LTVMsIGJ1Y2tldEtleUVuYWJsZWQgPSBlICAgfCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBTM19NQU5BR0VEICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICB8IGZhbHNlICAgICAgICAgICAgICAgICAgfCBTU0UtUzMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgUzNfTUFOQUdFRCAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgfCBlICAgICAgICAgICAgICAgICAgICAgIHwgU1NFLVMzLCBidWNrZXRLZXlFbmFibGVkID0gZSAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IFVORU5DUllQVEVEICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgIHwgdHJ1ZSAgICAgICAgICAgICAgICAgICB8IEVSUk9SISAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBVTkVOQ1JZUFRFRCAgICAgIHwgayAgICAgICAgICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1IhICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgS01TX01BTkFHRUQgICAgICB8IGsgICAgICAgICAgICAgICAgICAgfCBlICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1IhICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVSUk9SISAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IFMzX01BTkFHRUQgICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgIHwgdHJ1ZSAgICAgICAgICAgICAgICAgICB8IEVSUk9SISAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBTM19NQU5BR0VEICAgICAgIHwgayAgICAgICAgICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1IhICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqL1xuICBwcml2YXRlIHBhcnNlRW5jcnlwdGlvbihwcm9wczogQnVja2V0UHJvcHMpOiB7XG4gICAgYnVja2V0RW5jcnlwdGlvbj86IE9taXQ8XG4gICAgICBzM0J1Y2tldFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbi5TM0J1Y2tldFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbkFDb25maWcsXG4gICAgICBcImJ1Y2tldFwiXG4gICAgPjtcbiAgICBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG4gIH0ge1xuICAgIC8vIGRlZmF1bHQgYmFzZWQgb24gd2hldGhlciBlbmNyeXB0aW9uS2V5IGlzIHNwZWNpZmllZFxuICAgIGxldCBlbmNyeXB0aW9uVHlwZSA9IHByb3BzLmVuY3J5cHRpb247XG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVuY3J5cHRpb25UeXBlID0gcHJvcHMuZW5jcnlwdGlvbktleVxuICAgICAgICA/IEJ1Y2tldEVuY3J5cHRpb24uS01TXG4gICAgICAgIDogQnVja2V0RW5jcnlwdGlvbi5VTkVOQ1JZUFRFRDtcbiAgICB9XG5cbiAgICAvLyBpZiBlbmNyeXB0aW9uIGtleSBpcyBzZXQsIGVuY3J5cHRpb24gbXVzdCBiZSBzZXQgdG8gS01TIG9yIERTU0UuXG4gICAgaWYgKFxuICAgICAgZW5jcnlwdGlvblR5cGUgIT09IEJ1Y2tldEVuY3J5cHRpb24uRFNTRSAmJlxuICAgICAgZW5jcnlwdGlvblR5cGUgIT09IEJ1Y2tldEVuY3J5cHRpb24uS01TICYmXG4gICAgICBwcm9wcy5lbmNyeXB0aW9uS2V5XG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBlbmNyeXB0aW9uS2V5IGlzIHNwZWNpZmllZCwgc28gJ2VuY3J5cHRpb24nIG11c3QgYmUgc2V0IHRvIEtNUyBvciBEU1NFICh2YWx1ZTogJHtlbmNyeXB0aW9uVHlwZX0pYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gaWYgYnVja2V0S2V5RW5hYmxlZCBpcyBzZXQsIGVuY3J5cHRpb24gY2FuIG5vdCBiZSBCdWNrZXRFbmNyeXB0aW9uLlVORU5DUllQVEVEXG4gICAgaWYgKFxuICAgICAgcHJvcHMuYnVja2V0S2V5RW5hYmxlZCAmJlxuICAgICAgZW5jcnlwdGlvblR5cGUgPT09IEJ1Y2tldEVuY3J5cHRpb24uVU5FTkNSWVBURURcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGJ1Y2tldEtleUVuYWJsZWQgaXMgc3BlY2lmaWVkLCBzbyAnZW5jcnlwdGlvbicgbXVzdCBiZSBzZXQgdG8gS01TLCBEU1NFIG9yIFMzICh2YWx1ZTogJHtlbmNyeXB0aW9uVHlwZX0pYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLlVORU5DUllQVEVEKSB7XG4gICAgICByZXR1cm4geyBidWNrZXRFbmNyeXB0aW9uOiB1bmRlZmluZWQsIGVuY3J5cHRpb25LZXk6IHVuZGVmaW5lZCB9O1xuICAgIH1cblxuICAgIGlmIChlbmNyeXB0aW9uVHlwZSA9PT0gQnVja2V0RW5jcnlwdGlvbi5LTVMpIHtcbiAgICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPVxuICAgICAgICBwcm9wcy5lbmNyeXB0aW9uS2V5IHx8XG4gICAgICAgIG5ldyBrbXMuS2V5KHRoaXMsIFwiS2V5XCIsIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYENyZWF0ZWQgYnkgJHt0aGlzLm5vZGUucGF0aH1gLFxuICAgICAgICAgIGVuYWJsZUtleVJvdGF0aW9uOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIGJ1Y2tldEVuY3J5cHRpb246IHtcbiAgICAgICAgICAvLyAoT3B0aW9uYWwpIEFjY291bnQgSUQgb2YgdGhlIGV4cGVjdGVkIGJ1Y2tldCBvd25lci5cbiAgICAgICAgICAvLyBleHBlY3RlZEJ1Y2tldE93bmVyXG4gICAgICAgICAgcnVsZTogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBidWNrZXRLZXlFbmFibGVkOiBwcm9wcy5idWNrZXRLZXlFbmFibGVkLFxuICAgICAgICAgICAgICBhcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgc3NlQWxnb3JpdGhtOiBcImF3czprbXNcIixcbiAgICAgICAgICAgICAgICBrbXNNYXN0ZXJLZXlJZDogZW5jcnlwdGlvbktleS5rZXlBcm4sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChlbmNyeXB0aW9uVHlwZSA9PT0gQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VEKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBidWNrZXRFbmNyeXB0aW9uOiB7XG4gICAgICAgICAgLy8gKE9wdGlvbmFsKSBBY2NvdW50IElEIG9mIHRoZSBleHBlY3RlZCBidWNrZXQgb3duZXIuXG4gICAgICAgICAgLy8gZXhwZWN0ZWRCdWNrZXRPd25lclxuICAgICAgICAgIHJ1bGU6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYnVja2V0S2V5RW5hYmxlZDogcHJvcHMuYnVja2V0S2V5RW5hYmxlZCxcbiAgICAgICAgICAgICAgYXBwbHlTZXJ2ZXJTaWRlRW5jcnlwdGlvbkJ5RGVmYXVsdDogeyBzc2VBbGdvcml0aG06IFwiQUVTMjU2XCIgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLktNU19NQU5BR0VEKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBidWNrZXRFbmNyeXB0aW9uOiB7XG4gICAgICAgICAgLy8gKE9wdGlvbmFsKSBBY2NvdW50IElEIG9mIHRoZSBleHBlY3RlZCBidWNrZXQgb3duZXIuXG4gICAgICAgICAgLy8gZXhwZWN0ZWRCdWNrZXRPd25lclxuICAgICAgICAgIHJ1bGU6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYnVja2V0S2V5RW5hYmxlZDogcHJvcHMuYnVja2V0S2V5RW5hYmxlZCxcbiAgICAgICAgICAgICAgYXBwbHlTZXJ2ZXJTaWRlRW5jcnlwdGlvbkJ5RGVmYXVsdDogeyBzc2VBbGdvcml0aG06IFwiYXdzOmttc1wiIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChlbmNyeXB0aW9uVHlwZSA9PT0gQnVja2V0RW5jcnlwdGlvbi5EU1NFKSB7XG4gICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID1cbiAgICAgICAgcHJvcHMuZW5jcnlwdGlvbktleSB8fFxuICAgICAgICBuZXcga21zLktleSh0aGlzLCBcIktleVwiLCB7XG4gICAgICAgICAgZGVzY3JpcHRpb246IGBDcmVhdGVkIGJ5ICR7dGhpcy5ub2RlLnBhdGh9YCxcbiAgICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICBidWNrZXRFbmNyeXB0aW9uOiB7XG4gICAgICAgICAgLy8gKE9wdGlvbmFsKSBBY2NvdW50IElEIG9mIHRoZSBleHBlY3RlZCBidWNrZXQgb3duZXIuXG4gICAgICAgICAgLy8gZXhwZWN0ZWRCdWNrZXRPd25lclxuICAgICAgICAgIHJ1bGU6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYnVja2V0S2V5RW5hYmxlZDogcHJvcHMuYnVja2V0S2V5RW5hYmxlZCxcbiAgICAgICAgICAgICAgYXBwbHlTZXJ2ZXJTaWRlRW5jcnlwdGlvbkJ5RGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHNzZUFsZ29yaXRobTogXCJhd3M6a21zOmRzc2VcIixcbiAgICAgICAgICAgICAgICBrbXNNYXN0ZXJLZXlJZDogZW5jcnlwdGlvbktleS5rZXlBcm4sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChlbmNyeXB0aW9uVHlwZSA9PT0gQnVja2V0RW5jcnlwdGlvbi5EU1NFX01BTkFHRUQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJ1Y2tldEVuY3J5cHRpb246IHtcbiAgICAgICAgICAvLyAoT3B0aW9uYWwpIEFjY291bnQgSUQgb2YgdGhlIGV4cGVjdGVkIGJ1Y2tldCBvd25lci5cbiAgICAgICAgICAvLyBleHBlY3RlZEJ1Y2tldE93bmVyXG4gICAgICAgICAgcnVsZTogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBidWNrZXRLZXlFbmFibGVkOiBwcm9wcy5idWNrZXRLZXlFbmFibGVkLFxuICAgICAgICAgICAgICBhcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgc3NlQWxnb3JpdGhtOiBcImF3czprbXM6ZHNzZVwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgJ2VuY3J5cHRpb25UeXBlJzogJHtlbmNyeXB0aW9uVHlwZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGlhbSBzdGF0ZW1lbnQgdG8gZW5mb3JjZSBTU0wgcmVxdWVzdHMgb25seS5cbiAgICovXG4gIHByaXZhdGUgZW5mb3JjZVNTTFN0YXRlbWVudCgpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBhY3Rpb25zOiBbXCJzMzoqXCJdLFxuICAgICAgY29uZGl0aW9uOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXN0OiBcIkJvb2xcIixcbiAgICAgICAgICB2YXJpYWJsZTogXCJhd3M6U2VjdXJlVHJhbnNwb3J0XCIsXG4gICAgICAgICAgdmFsdWVzOiBbXCJmYWxzZVwiXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuREVOWSxcbiAgICAgIHJlc291cmNlczogW3RoaXMucmVzb3VyY2UuYXJuLCB0aGlzLmFybkZvck9iamVjdHMoXCIqXCIpXSxcbiAgICAgIHByaW5jaXBhbHM6IFtuZXcgaWFtLkFueVByaW5jaXBhbCgpXSxcbiAgICB9KTtcbiAgICB0aGlzLmFkZFRvUmVzb3VyY2VQb2xpY3koc3RhdGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGlhbSBzdGF0ZW1lbnQgdG8gYWxsb3cgcmVxdWVzdHMgd2l0aCBhIG1pbmltdW0gVExTXG4gICAqIHZlcnNpb24gb25seS5cbiAgICovXG4gIHByaXZhdGUgbWluaW11bVRMU1ZlcnNpb25TdGF0ZW1lbnQobWluaW11bVRMU1ZlcnNpb24/OiBudW1iZXIpIHtcbiAgICBpZiAoIW1pbmltdW1UTFNWZXJzaW9uKSByZXR1cm47XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgYWN0aW9uczogW1wiczM6KlwiXSxcbiAgICAgIGNvbmRpdGlvbjogW1xuICAgICAgICB7XG4gICAgICAgICAgdGVzdDogXCJOdW1lcmljTGVzc1RoYW5cIixcbiAgICAgICAgICB2YXJpYWJsZTogXCJzMzpUbHNWZXJzaW9uXCIsXG4gICAgICAgICAgdmFsdWVzOiBbbWluaW11bVRMU1ZlcnNpb24udG9TdHJpbmcoKV0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkRFTlksXG4gICAgICByZXNvdXJjZXM6IFt0aGlzLnJlc291cmNlLmFybiwgdGhpcy5hcm5Gb3JPYmplY3RzKFwiKlwiKV0sXG4gICAgICBwcmluY2lwYWxzOiBbbmV3IGlhbS5BbnlQcmluY2lwYWwoKV0sXG4gICAgfSk7XG4gICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KHN0YXRlbWVudCk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGRTb3VyY2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIExvY2FsIHBhdGggdG8gdGhlIHNvdXJjZSBmaWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogUHJlZml4IHRvIGFkZCB0byB0aGUgdXBsb2FkZWQgb2JqZWN0c1xuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4Pzogc3RyaW5nO1xufVxuXG4vLyBwcml2YXRlIGludGVyZmFjZSB0byBpbmRleCBCdWNrZXQgc291cmNlcyBieSBpZFxuaW50ZXJmYWNlIFNvdXJjZUluZGV4IHtcbiAgcHJvcHM6IEJ1Y2tldFNvdXJjZVByb3BzO1xuICBpZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFN0b3JhZ2UgY2xhc3MgdG8gbW92ZSBhbiBvYmplY3QgdG9cbiAqL1xuZXhwb3J0IGVudW0gU3RvcmFnZUNsYXNzIHtcbiAgLyoqXG4gICAqIFN0b3JhZ2UgY2xhc3MgZm9yIGRhdGEgdGhhdCBpcyBhY2Nlc3NlZCBsZXNzIGZyZXF1ZW50bHksIGJ1dCByZXF1aXJlcyByYXBpZFxuICAgKiBhY2Nlc3Mgd2hlbiBuZWVkZWQuXG4gICAqXG4gICAqIEhhcyBsb3dlciBhdmFpbGFiaWxpdHkgdGhhbiBTdGFuZGFyZCBzdG9yYWdlLlxuICAgKi9cbiAgSU5GUkVRVUVOVF9BQ0NFU1MgPSBcIlNUQU5EQVJEX0lBXCIsXG5cbiAgLyoqXG4gICAqIEluZnJlcXVlbnQgQWNjZXNzIHRoYXQncyBvbmx5IHN0b3JlZCBpbiBvbmUgYXZhaWxhYmlsaXR5IHpvbmUuXG4gICAqXG4gICAqIEhhcyBsb3dlciBhdmFpbGFiaWxpdHkgdGhhbiBzdGFuZGFyZCBJbmZyZXF1ZW50QWNjZXNzLlxuICAgKi9cbiAgT05FX1pPTkVfSU5GUkVRVUVOVF9BQ0NFU1MgPSBcIk9ORVpPTkVfSUFcIixcblxuICAvKipcbiAgICogU3RvcmFnZSBjbGFzcyBmb3IgbG9uZy10ZXJtIGFyY2hpdmFsIHRoYXQgY2FuIHRha2UgYmV0d2VlbiBtaW51dGVzIGFuZFxuICAgKiBob3VycyB0byBhY2Nlc3MuXG4gICAqXG4gICAqIFVzZSBmb3IgYXJjaGl2ZXMgd2hlcmUgcG9ydGlvbnMgb2YgdGhlIGRhdGEgbWlnaHQgbmVlZCB0byBiZSByZXRyaWV2ZWQgaW5cbiAgICogbWludXRlcy4gRGF0YSBzdG9yZWQgaW4gdGhlIEdMQUNJRVIgc3RvcmFnZSBjbGFzcyBoYXMgYSBtaW5pbXVtIHN0b3JhZ2VcbiAgICogZHVyYXRpb24gcGVyaW9kIG9mIDkwIGRheXMgYW5kIGNhbiBiZSBhY2Nlc3NlZCBpbiBhcyBsaXR0bGUgYXMgMS01IG1pbnV0ZXNcbiAgICogdXNpbmcgZXhwZWRpdGVkIHJldHJpZXZhbC4gSWYgeW91IGRlbGV0ZSBhbiBvYmplY3QgYmVmb3JlIHRoZSA5MC1kYXlcbiAgICogbWluaW11bSwgeW91IGFyZSBjaGFyZ2VkIGZvciA5MCBkYXlzLlxuICAgKi9cbiAgR0xBQ0lFUiA9IFwiR0xBQ0lFUlwiLFxuXG4gIC8qKlxuICAgKiBTdG9yYWdlIGNsYXNzIGZvciBsb25nLXRlcm0gYXJjaGl2YWwgdGhhdCBjYW4gYmUgYWNjZXNzZWQgaW4gYSBmZXcgbWlsbGlzZWNvbmRzLlxuICAgKlxuICAgKiBJdCBpcyBpZGVhbCBmb3IgZGF0YSB0aGF0IGlzIGFjY2Vzc2VkIG9uY2Ugb3IgdHdpY2UgcGVyIHF1YXJ0ZXIsIGFuZFxuICAgKiB0aGF0IHJlcXVpcmVzIGltbWVkaWF0ZSBhY2Nlc3MuIERhdGEgc3RvcmVkIGluIHRoZSBHTEFDSUVSX0lSIHN0b3JhZ2UgY2xhc3NcbiAgICogaGFzIGEgbWluaW11bSBzdG9yYWdlIGR1cmF0aW9uIHBlcmlvZCBvZiA5MCBkYXlzIGFuZCBjYW4gYmUgYWNjZXNzZWQgaW5cbiAgICogYXMgbWlsbGlzZWNvbmRzLiBJZiB5b3UgZGVsZXRlIGFuIG9iamVjdCBiZWZvcmUgdGhlIDkwLWRheSBtaW5pbXVtLFxuICAgKiB5b3UgYXJlIGNoYXJnZWQgZm9yIDkwIGRheXMuXG4gICAqL1xuICBHTEFDSUVSX0lOU1RBTlRfUkVUUklFVkFMID0gXCJHTEFDSUVSX0lSXCIsXG5cbiAgLyoqXG4gICAqIFVzZSBmb3IgYXJjaGl2aW5nIGRhdGEgdGhhdCByYXJlbHkgbmVlZHMgdG8gYmUgYWNjZXNzZWQuIERhdGEgc3RvcmVkIGluIHRoZVxuICAgKiBERUVQX0FSQ0hJVkUgc3RvcmFnZSBjbGFzcyBoYXMgYSBtaW5pbXVtIHN0b3JhZ2UgZHVyYXRpb24gcGVyaW9kIG9mIDE4MFxuICAgKiBkYXlzIGFuZCBhIGRlZmF1bHQgcmV0cmlldmFsIHRpbWUgb2YgMTIgaG91cnMuIElmIHlvdSBkZWxldGUgYW4gb2JqZWN0XG4gICAqIGJlZm9yZSB0aGUgMTgwLWRheSBtaW5pbXVtLCB5b3UgYXJlIGNoYXJnZWQgZm9yIDE4MCBkYXlzLiBGb3IgcHJpY2luZ1xuICAgKiBpbmZvcm1hdGlvbiwgc2VlIEFtYXpvbiBTMyBQcmljaW5nLlxuICAgKi9cbiAgREVFUF9BUkNISVZFID0gXCJERUVQX0FSQ0hJVkVcIixcblxuICAvKipcbiAgICogVGhlIElOVEVMTElHRU5UX1RJRVJJTkcgc3RvcmFnZSBjbGFzcyBpcyBkZXNpZ25lZCB0byBvcHRpbWl6ZSBzdG9yYWdlIGNvc3RzXG4gICAqIGJ5IGF1dG9tYXRpY2FsbHkgbW92aW5nIGRhdGEgdG8gdGhlIG1vc3QgY29zdC1lZmZlY3RpdmUgc3RvcmFnZSBhY2Nlc3NcbiAgICogdGllciwgd2l0aG91dCBwZXJmb3JtYW5jZSBpbXBhY3Qgb3Igb3BlcmF0aW9uYWwgb3ZlcmhlYWQuXG4gICAqIElOVEVMTElHRU5UX1RJRVJJTkcgZGVsaXZlcnMgYXV0b21hdGljIGNvc3Qgc2F2aW5ncyBieSBtb3ZpbmcgZGF0YSBvbiBhXG4gICAqIGdyYW51bGFyIG9iamVjdCBsZXZlbCBiZXR3ZWVuIHR3byBhY2Nlc3MgdGllcnMsIGEgZnJlcXVlbnQgYWNjZXNzIHRpZXIgYW5kXG4gICAqIGEgbG93ZXItY29zdCBpbmZyZXF1ZW50IGFjY2VzcyB0aWVyLCB3aGVuIGFjY2VzcyBwYXR0ZXJucyBjaGFuZ2UuIFRoZVxuICAgKiBJTlRFTExJR0VOVF9USUVSSU5HIHN0b3JhZ2UgY2xhc3MgaXMgaWRlYWwgaWYgeW91IHdhbnQgdG8gb3B0aW1pemUgc3RvcmFnZVxuICAgKiBjb3N0cyBhdXRvbWF0aWNhbGx5IGZvciBsb25nLWxpdmVkIGRhdGEgd2hlbiBhY2Nlc3MgcGF0dGVybnMgYXJlIHVua25vd24gb3JcbiAgICogdW5wcmVkaWN0YWJsZS5cbiAgICovXG4gIElOVEVMTElHRU5UX1RJRVJJTkcgPSBcIklOVEVMTElHRU5UX1RJRVJJTkdcIixcbn1cblxuLyoqXG4gKiBXaGF0IGtpbmQgb2Ygc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB0byBhcHBseSB0byB0aGlzIGJ1Y2tldFxuICovXG5leHBvcnQgZW51bSBCdWNrZXRFbmNyeXB0aW9uIHtcbiAgLyoqXG4gICAqIFByZXZpb3VzIG9wdGlvbi4gQnVja2V0cyBjYW4gbm90IGJlIHVuZW5jcnlwdGVkIG5vdy5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9zZXJ2LXNpZGUtZW5jcnlwdGlvbi5odG1sXG4gICAqIEBkZXByZWNhdGVkIFMzIGFwcGxpZXMgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB3aXRoIFNTRS1TMyBmb3IgZXZlcnkgYnVja2V0XG4gICAqIHRoYXQgZGVmYXVsdCBlbmNyeXB0aW9uIGlzIG5vdCBjb25maWd1cmVkLlxuICAgKi9cbiAgVU5FTkNSWVBURUQgPSBcIlVORU5DUllQVEVEXCIsXG5cbiAgLyoqXG4gICAqIFNlcnZlci1zaWRlIEtNUyBlbmNyeXB0aW9uIHdpdGggYSBtYXN0ZXIga2V5IG1hbmFnZWQgYnkgS01TLlxuICAgKi9cbiAgS01TX01BTkFHRUQgPSBcIktNU19NQU5BR0VEXCIsXG5cbiAgLyoqXG4gICAqIFNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBhIG1hc3RlciBrZXkgbWFuYWdlZCBieSBTMy5cbiAgICovXG4gIFMzX01BTkFHRUQgPSBcIlMzX01BTkFHRURcIixcblxuICAvKipcbiAgICogU2VydmVyLXNpZGUgZW5jcnlwdGlvbiB3aXRoIGEgS01TIGtleSBtYW5hZ2VkIGJ5IHRoZSB1c2VyLlxuICAgKiBJZiBgZW5jcnlwdGlvbktleWAgaXMgc3BlY2lmaWVkLCB0aGlzIGtleSB3aWxsIGJlIHVzZWQsIG90aGVyd2lzZSwgb25lIHdpbGwgYmUgZGVmaW5lZC5cbiAgICovXG4gIEtNUyA9IFwiS01TXCIsXG5cbiAgLyoqXG4gICAqIERvdWJsZSBzZXJ2ZXItc2lkZSBLTVMgZW5jcnlwdGlvbiB3aXRoIGEgbWFzdGVyIGtleSBtYW5hZ2VkIGJ5IEtNUy5cbiAgICovXG4gIERTU0VfTUFOQUdFRCA9IFwiRFNTRV9NQU5BR0VEXCIsXG5cbiAgLyoqXG4gICAqIERvdWJsZSBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIHdpdGggYSBLTVMga2V5IG1hbmFnZWQgYnkgdGhlIHVzZXIuXG4gICAqIElmIGBlbmNyeXB0aW9uS2V5YCBpcyBzcGVjaWZpZWQsIHRoaXMga2V5IHdpbGwgYmUgdXNlZCwgb3RoZXJ3aXNlLCBvbmUgd2lsbCBiZSBkZWZpbmVkLlxuICAgKi9cbiAgRFNTRSA9IFwiRFNTRVwiLFxufVxuXG4vKipcbiAqIE5vdGlmaWNhdGlvbiBldmVudCB0eXBlcy5cbiAqIEBsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL25vdGlmaWNhdGlvbi1ob3ctdG8tZXZlbnQtdHlwZXMtYW5kLWRlc3RpbmF0aW9ucy5odG1sI3N1cHBvcnRlZC1ub3RpZmljYXRpb24tZXZlbnQtdHlwZXNcbiAqL1xuZXhwb3J0IGVudW0gRXZlbnRUeXBlIHtcbiAgLyoqXG4gICAqIEFtYXpvbiBTMyBBUElzIHN1Y2ggYXMgUFVULCBQT1NULCBhbmQgQ09QWSBjYW4gY3JlYXRlIGFuIG9iamVjdC4gVXNpbmdcbiAgICogdGhlc2UgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuIGFuIG9iamVjdCBpcyBjcmVhdGVkXG4gICAqIHVzaW5nIGEgc3BlY2lmaWMgQVBJLCBvciB5b3UgY2FuIHVzZSB0aGUgczM6T2JqZWN0Q3JlYXRlZDoqIGV2ZW50IHR5cGUgdG9cbiAgICogcmVxdWVzdCBub3RpZmljYXRpb24gcmVnYXJkbGVzcyBvZiB0aGUgQVBJIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIGFuXG4gICAqIG9iamVjdC5cbiAgICovXG4gIE9CSkVDVF9DUkVBVEVEID0gXCJzMzpPYmplY3RDcmVhdGVkOipcIixcblxuICAvKipcbiAgICogQW1hem9uIFMzIEFQSXMgc3VjaCBhcyBQVVQsIFBPU1QsIGFuZCBDT1BZIGNhbiBjcmVhdGUgYW4gb2JqZWN0LiBVc2luZ1xuICAgKiB0aGVzZSBldmVudCB0eXBlcywgeW91IGNhbiBlbmFibGUgbm90aWZpY2F0aW9uIHdoZW4gYW4gb2JqZWN0IGlzIGNyZWF0ZWRcbiAgICogdXNpbmcgYSBzcGVjaWZpYyBBUEksIG9yIHlvdSBjYW4gdXNlIHRoZSBzMzpPYmplY3RDcmVhdGVkOiogZXZlbnQgdHlwZSB0b1xuICAgKiByZXF1ZXN0IG5vdGlmaWNhdGlvbiByZWdhcmRsZXNzIG9mIHRoZSBBUEkgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgYW5cbiAgICogb2JqZWN0LlxuICAgKi9cbiAgT0JKRUNUX0NSRUFURURfUFVUID0gXCJzMzpPYmplY3RDcmVhdGVkOlB1dFwiLFxuXG4gIC8qKlxuICAgKiBBbWF6b24gUzMgQVBJcyBzdWNoIGFzIFBVVCwgUE9TVCwgYW5kIENPUFkgY2FuIGNyZWF0ZSBhbiBvYmplY3QuIFVzaW5nXG4gICAqIHRoZXNlIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlbiBhbiBvYmplY3QgaXMgY3JlYXRlZFxuICAgKiB1c2luZyBhIHNwZWNpZmljIEFQSSwgb3IgeW91IGNhbiB1c2UgdGhlIHMzOk9iamVjdENyZWF0ZWQ6KiBldmVudCB0eXBlIHRvXG4gICAqIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhlIEFQSSB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSBhblxuICAgKiBvYmplY3QuXG4gICAqL1xuICBPQkpFQ1RfQ1JFQVRFRF9QT1NUID0gXCJzMzpPYmplY3RDcmVhdGVkOlBvc3RcIixcblxuICAvKipcbiAgICogQW1hem9uIFMzIEFQSXMgc3VjaCBhcyBQVVQsIFBPU1QsIGFuZCBDT1BZIGNhbiBjcmVhdGUgYW4gb2JqZWN0LiBVc2luZ1xuICAgKiB0aGVzZSBldmVudCB0eXBlcywgeW91IGNhbiBlbmFibGUgbm90aWZpY2F0aW9uIHdoZW4gYW4gb2JqZWN0IGlzIGNyZWF0ZWRcbiAgICogdXNpbmcgYSBzcGVjaWZpYyBBUEksIG9yIHlvdSBjYW4gdXNlIHRoZSBzMzpPYmplY3RDcmVhdGVkOiogZXZlbnQgdHlwZSB0b1xuICAgKiByZXF1ZXN0IG5vdGlmaWNhdGlvbiByZWdhcmRsZXNzIG9mIHRoZSBBUEkgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgYW5cbiAgICogb2JqZWN0LlxuICAgKi9cbiAgT0JKRUNUX0NSRUFURURfQ09QWSA9IFwiczM6T2JqZWN0Q3JlYXRlZDpDb3B5XCIsXG5cbiAgLyoqXG4gICAqIEFtYXpvbiBTMyBBUElzIHN1Y2ggYXMgUFVULCBQT1NULCBhbmQgQ09QWSBjYW4gY3JlYXRlIGFuIG9iamVjdC4gVXNpbmdcbiAgICogdGhlc2UgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuIGFuIG9iamVjdCBpcyBjcmVhdGVkXG4gICAqIHVzaW5nIGEgc3BlY2lmaWMgQVBJLCBvciB5b3UgY2FuIHVzZSB0aGUgczM6T2JqZWN0Q3JlYXRlZDoqIGV2ZW50IHR5cGUgdG9cbiAgICogcmVxdWVzdCBub3RpZmljYXRpb24gcmVnYXJkbGVzcyBvZiB0aGUgQVBJIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIGFuXG4gICAqIG9iamVjdC5cbiAgICovXG4gIE9CSkVDVF9DUkVBVEVEX0NPTVBMRVRFX01VTFRJUEFSVF9VUExPQUQgPSBcInMzOk9iamVjdENyZWF0ZWQ6Q29tcGxldGVNdWx0aXBhcnRVcGxvYWRcIixcblxuICAvKipcbiAgICogQnkgdXNpbmcgdGhlIE9iamVjdFJlbW92ZWQgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuXG4gICAqIGFuIG9iamVjdCBvciBhIGJhdGNoIG9mIG9iamVjdHMgaXMgcmVtb3ZlZCBmcm9tIGEgYnVja2V0LlxuICAgKlxuICAgKiBZb3UgY2FuIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHdoZW4gYW4gb2JqZWN0IGlzIGRlbGV0ZWQgb3IgYSB2ZXJzaW9uZWRcbiAgICogb2JqZWN0IGlzIHBlcm1hbmVudGx5IGRlbGV0ZWQgYnkgdXNpbmcgdGhlIHMzOk9iamVjdFJlbW92ZWQ6RGVsZXRlIGV2ZW50XG4gICAqIHR5cGUuIE9yIHlvdSBjYW4gcmVxdWVzdCBub3RpZmljYXRpb24gd2hlbiBhIGRlbGV0ZSBtYXJrZXIgaXMgY3JlYXRlZCBmb3JcbiAgICogYSB2ZXJzaW9uZWQgb2JqZWN0IGJ5IHVzaW5nIHMzOk9iamVjdFJlbW92ZWQ6RGVsZXRlTWFya2VyQ3JlYXRlZC4gRm9yXG4gICAqIGluZm9ybWF0aW9uIGFib3V0IGRlbGV0aW5nIHZlcnNpb25lZCBvYmplY3RzLCBzZWUgRGVsZXRpbmcgT2JqZWN0XG4gICAqIFZlcnNpb25zLiBZb3UgY2FuIGFsc28gdXNlIGEgd2lsZGNhcmQgczM6T2JqZWN0UmVtb3ZlZDoqIHRvIHJlcXVlc3RcbiAgICogbm90aWZpY2F0aW9uIGFueXRpbWUgYW4gb2JqZWN0IGlzIGRlbGV0ZWQuXG4gICAqXG4gICAqIFlvdSB3aWxsIG5vdCByZWNlaXZlIGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSBhdXRvbWF0aWMgZGVsZXRlcyBmcm9tXG4gICAqIGxpZmVjeWNsZSBwb2xpY2llcyBvciBmcm9tIGZhaWxlZCBvcGVyYXRpb25zLlxuICAgKi9cbiAgT0JKRUNUX1JFTU9WRUQgPSBcInMzOk9iamVjdFJlbW92ZWQ6KlwiLFxuXG4gIC8qKlxuICAgKiBCeSB1c2luZyB0aGUgT2JqZWN0UmVtb3ZlZCBldmVudCB0eXBlcywgeW91IGNhbiBlbmFibGUgbm90aWZpY2F0aW9uIHdoZW5cbiAgICogYW4gb2JqZWN0IG9yIGEgYmF0Y2ggb2Ygb2JqZWN0cyBpcyByZW1vdmVkIGZyb20gYSBidWNrZXQuXG4gICAqXG4gICAqIFlvdSBjYW4gcmVxdWVzdCBub3RpZmljYXRpb24gd2hlbiBhbiBvYmplY3QgaXMgZGVsZXRlZCBvciBhIHZlcnNpb25lZFxuICAgKiBvYmplY3QgaXMgcGVybWFuZW50bHkgZGVsZXRlZCBieSB1c2luZyB0aGUgczM6T2JqZWN0UmVtb3ZlZDpEZWxldGUgZXZlbnRcbiAgICogdHlwZS4gT3IgeW91IGNhbiByZXF1ZXN0IG5vdGlmaWNhdGlvbiB3aGVuIGEgZGVsZXRlIG1hcmtlciBpcyBjcmVhdGVkIGZvclxuICAgKiBhIHZlcnNpb25lZCBvYmplY3QgYnkgdXNpbmcgczM6T2JqZWN0UmVtb3ZlZDpEZWxldGVNYXJrZXJDcmVhdGVkLiBGb3JcbiAgICogaW5mb3JtYXRpb24gYWJvdXQgZGVsZXRpbmcgdmVyc2lvbmVkIG9iamVjdHMsIHNlZSBEZWxldGluZyBPYmplY3RcbiAgICogVmVyc2lvbnMuIFlvdSBjYW4gYWxzbyB1c2UgYSB3aWxkY2FyZCBzMzpPYmplY3RSZW1vdmVkOiogdG8gcmVxdWVzdFxuICAgKiBub3RpZmljYXRpb24gYW55dGltZSBhbiBvYmplY3QgaXMgZGVsZXRlZC5cbiAgICpcbiAgICogWW91IHdpbGwgbm90IHJlY2VpdmUgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIGF1dG9tYXRpYyBkZWxldGVzIGZyb21cbiAgICogbGlmZWN5Y2xlIHBvbGljaWVzIG9yIGZyb20gZmFpbGVkIG9wZXJhdGlvbnMuXG4gICAqL1xuICBPQkpFQ1RfUkVNT1ZFRF9ERUxFVEUgPSBcInMzOk9iamVjdFJlbW92ZWQ6RGVsZXRlXCIsXG5cbiAgLyoqXG4gICAqIEJ5IHVzaW5nIHRoZSBPYmplY3RSZW1vdmVkIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlblxuICAgKiBhbiBvYmplY3Qgb3IgYSBiYXRjaCBvZiBvYmplY3RzIGlzIHJlbW92ZWQgZnJvbSBhIGJ1Y2tldC5cbiAgICpcbiAgICogWW91IGNhbiByZXF1ZXN0IG5vdGlmaWNhdGlvbiB3aGVuIGFuIG9iamVjdCBpcyBkZWxldGVkIG9yIGEgdmVyc2lvbmVkXG4gICAqIG9iamVjdCBpcyBwZXJtYW5lbnRseSBkZWxldGVkIGJ5IHVzaW5nIHRoZSBzMzpPYmplY3RSZW1vdmVkOkRlbGV0ZSBldmVudFxuICAgKiB0eXBlLiBPciB5b3UgY2FuIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHdoZW4gYSBkZWxldGUgbWFya2VyIGlzIGNyZWF0ZWQgZm9yXG4gICAqIGEgdmVyc2lvbmVkIG9iamVjdCBieSB1c2luZyBzMzpPYmplY3RSZW1vdmVkOkRlbGV0ZU1hcmtlckNyZWF0ZWQuIEZvclxuICAgKiBpbmZvcm1hdGlvbiBhYm91dCBkZWxldGluZyB2ZXJzaW9uZWQgb2JqZWN0cywgc2VlIERlbGV0aW5nIE9iamVjdFxuICAgKiBWZXJzaW9ucy4gWW91IGNhbiBhbHNvIHVzZSBhIHdpbGRjYXJkIHMzOk9iamVjdFJlbW92ZWQ6KiB0byByZXF1ZXN0XG4gICAqIG5vdGlmaWNhdGlvbiBhbnl0aW1lIGFuIG9iamVjdCBpcyBkZWxldGVkLlxuICAgKlxuICAgKiBZb3Ugd2lsbCBub3QgcmVjZWl2ZSBldmVudCBub3RpZmljYXRpb25zIGZyb20gYXV0b21hdGljIGRlbGV0ZXMgZnJvbVxuICAgKiBsaWZlY3ljbGUgcG9saWNpZXMgb3IgZnJvbSBmYWlsZWQgb3BlcmF0aW9ucy5cbiAgICovXG4gIE9CSkVDVF9SRU1PVkVEX0RFTEVURV9NQVJLRVJfQ1JFQVRFRCA9IFwiczM6T2JqZWN0UmVtb3ZlZDpEZWxldGVNYXJrZXJDcmVhdGVkXCIsXG5cbiAgLyoqXG4gICAqIFVzaW5nIHJlc3RvcmUgb2JqZWN0IGV2ZW50IHR5cGVzIHlvdSBjYW4gcmVjZWl2ZSBub3RpZmljYXRpb25zIGZvclxuICAgKiBpbml0aWF0aW9uIGFuZCBjb21wbGV0aW9uIHdoZW4gcmVzdG9yaW5nIG9iamVjdHMgZnJvbSB0aGUgUzMgR2xhY2llclxuICAgKiBzdG9yYWdlIGNsYXNzLlxuICAgKlxuICAgKiBZb3UgdXNlIHMzOk9iamVjdFJlc3RvcmU6UG9zdCB0byByZXF1ZXN0IG5vdGlmaWNhdGlvbiBvZiBvYmplY3QgcmVzdG9yYXRpb25cbiAgICogaW5pdGlhdGlvbi5cbiAgICovXG4gIE9CSkVDVF9SRVNUT1JFX1BPU1QgPSBcInMzOk9iamVjdFJlc3RvcmU6UG9zdFwiLFxuXG4gIC8qKlxuICAgKiBVc2luZyByZXN0b3JlIG9iamVjdCBldmVudCB0eXBlcyB5b3UgY2FuIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBmb3JcbiAgICogaW5pdGlhdGlvbiBhbmQgY29tcGxldGlvbiB3aGVuIHJlc3RvcmluZyBvYmplY3RzIGZyb20gdGhlIFMzIEdsYWNpZXJcbiAgICogc3RvcmFnZSBjbGFzcy5cbiAgICpcbiAgICogWW91IHVzZSBzMzpPYmplY3RSZXN0b3JlOkNvbXBsZXRlZCB0byByZXF1ZXN0IG5vdGlmaWNhdGlvbiBvZlxuICAgKiByZXN0b3JhdGlvbiBjb21wbGV0aW9uLlxuICAgKi9cbiAgT0JKRUNUX1JFU1RPUkVfQ09NUExFVEVEID0gXCJzMzpPYmplY3RSZXN0b3JlOkNvbXBsZXRlZFwiLFxuXG4gIC8qKlxuICAgKiBVc2luZyByZXN0b3JlIG9iamVjdCBldmVudCB0eXBlcyB5b3UgY2FuIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBmb3JcbiAgICogaW5pdGlhdGlvbiBhbmQgY29tcGxldGlvbiB3aGVuIHJlc3RvcmluZyBvYmplY3RzIGZyb20gdGhlIFMzIEdsYWNpZXJcbiAgICogc3RvcmFnZSBjbGFzcy5cbiAgICpcbiAgICogWW91IHVzZSBzMzpPYmplY3RSZXN0b3JlOkRlbGV0ZSB0byByZXF1ZXN0IG5vdGlmaWNhdGlvbiBvZlxuICAgKiByZXN0b3JhdGlvbiBjb21wbGV0aW9uLlxuICAgKi9cbiAgT0JKRUNUX1JFU1RPUkVfREVMRVRFID0gXCJzMzpPYmplY3RSZXN0b3JlOkRlbGV0ZVwiLFxuXG4gIC8qKlxuICAgKiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgdG8gcmVxdWVzdCBBbWF6b24gUzMgdG8gc2VuZCBhIG5vdGlmaWNhdGlvblxuICAgKiBtZXNzYWdlIHdoZW4gQW1hem9uIFMzIGRldGVjdHMgdGhhdCBhbiBvYmplY3Qgb2YgdGhlIFJSUyBzdG9yYWdlIGNsYXNzIGlzXG4gICAqIGxvc3QuXG4gICAqL1xuICBSRURVQ0VEX1JFRFVOREFOQ1lfTE9TVF9PQkpFQ1QgPSBcInMzOlJlZHVjZWRSZWR1bmRhbmN5TG9zdE9iamVjdFwiLFxuXG4gIC8qKlxuICAgKiBZb3UgcmVjZWl2ZSB0aGlzIG5vdGlmaWNhdGlvbiBldmVudCB3aGVuIGFuIG9iamVjdCB0aGF0IHdhcyBlbGlnaWJsZSBmb3JcbiAgICogcmVwbGljYXRpb24gdXNpbmcgQW1hem9uIFMzIFJlcGxpY2F0aW9uIFRpbWUgQ29udHJvbCBmYWlsZWQgdG8gcmVwbGljYXRlLlxuICAgKi9cbiAgUkVQTElDQVRJT05fT1BFUkFUSU9OX0ZBSUxFRF9SRVBMSUNBVElPTiA9IFwiczM6UmVwbGljYXRpb246T3BlcmF0aW9uRmFpbGVkUmVwbGljYXRpb25cIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgd2hlbiBhbiBvYmplY3QgdGhhdCB3YXMgZWxpZ2libGUgZm9yXG4gICAqIHJlcGxpY2F0aW9uIHVzaW5nIEFtYXpvbiBTMyBSZXBsaWNhdGlvbiBUaW1lIENvbnRyb2wgZXhjZWVkZWQgdGhlIDE1LW1pbnV0ZVxuICAgKiB0aHJlc2hvbGQgZm9yIHJlcGxpY2F0aW9uLlxuICAgKi9cbiAgUkVQTElDQVRJT05fT1BFUkFUSU9OX01JU1NFRF9USFJFU0hPTEQgPSBcInMzOlJlcGxpY2F0aW9uOk9wZXJhdGlvbk1pc3NlZFRocmVzaG9sZFwiLFxuXG4gIC8qKlxuICAgKiBZb3UgcmVjZWl2ZSB0aGlzIG5vdGlmaWNhdGlvbiBldmVudCBmb3IgYW4gb2JqZWN0IHRoYXQgd2FzIGVsaWdpYmxlIGZvclxuICAgKiByZXBsaWNhdGlvbiB1c2luZyB0aGUgQW1hem9uIFMzIFJlcGxpY2F0aW9uIFRpbWUgQ29udHJvbCBmZWF0dXJlIHJlcGxpY2F0ZWRcbiAgICogYWZ0ZXIgdGhlIDE1LW1pbnV0ZSB0aHJlc2hvbGQuXG4gICAqL1xuICBSRVBMSUNBVElPTl9PUEVSQVRJT05fUkVQTElDQVRFRF9BRlRFUl9USFJFU0hPTEQgPSBcInMzOlJlcGxpY2F0aW9uOk9wZXJhdGlvblJlcGxpY2F0ZWRBZnRlclRocmVzaG9sZFwiLFxuXG4gIC8qKlxuICAgKiBZb3UgcmVjZWl2ZSB0aGlzIG5vdGlmaWNhdGlvbiBldmVudCBmb3IgYW4gb2JqZWN0IHRoYXQgd2FzIGVsaWdpYmxlIGZvclxuICAgKiByZXBsaWNhdGlvbiB1c2luZyBBbWF6b24gUzMgUmVwbGljYXRpb24gVGltZSBDb250cm9sIGJ1dCBpcyBubyBsb25nZXIgdHJhY2tlZFxuICAgKiBieSByZXBsaWNhdGlvbiBtZXRyaWNzLlxuICAgKi9cbiAgUkVQTElDQVRJT05fT1BFUkFUSU9OX05PVF9UUkFDS0VEID0gXCJzMzpSZXBsaWNhdGlvbjpPcGVyYXRpb25Ob3RUcmFja2VkXCIsXG5cbiAgLyoqXG4gICAqIEJ5IHVzaW5nIHRoZSBMaWZlY3ljbGVFeHBpcmF0aW9uIGV2ZW50IHR5cGVzLCB5b3UgY2FuIHJlY2VpdmUgYSBub3RpZmljYXRpb25cbiAgICogd2hlbiBBbWF6b24gUzMgZGVsZXRlcyBhbiBvYmplY3QgYmFzZWQgb24geW91ciBTMyBMaWZlY3ljbGUgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIExJRkVDWUNMRV9FWFBJUkFUSU9OID0gXCJzMzpMaWZlY3ljbGVFeHBpcmF0aW9uOipcIixcblxuICAvKipcbiAgICogVGhlIHMzOkxpZmVjeWNsZUV4cGlyYXRpb246RGVsZXRlIGV2ZW50IHR5cGUgbm90aWZpZXMgeW91IHdoZW4gYW4gb2JqZWN0XG4gICAqIGluIGFuIHVudmVyc2lvbmVkIGJ1Y2tldCBpcyBkZWxldGVkLlxuICAgKiBJdCBhbHNvIG5vdGlmaWVzIHlvdSB3aGVuIGFuIG9iamVjdCB2ZXJzaW9uIGlzIHBlcm1hbmVudGx5IGRlbGV0ZWQgYnkgYW5cbiAgICogUzMgTGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBMSUZFQ1lDTEVfRVhQSVJBVElPTl9ERUxFVEUgPSBcInMzOkxpZmVjeWNsZUV4cGlyYXRpb246RGVsZXRlXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBzMzpMaWZlY3ljbGVFeHBpcmF0aW9uOkRlbGV0ZU1hcmtlckNyZWF0ZWQgZXZlbnQgdHlwZSBub3RpZmllcyB5b3VcbiAgICogd2hlbiBTMyBMaWZlY3ljbGUgY3JlYXRlcyBhIGRlbGV0ZSBtYXJrZXIgd2hlbiBhIGN1cnJlbnQgdmVyc2lvbiBvZiBhblxuICAgKiBvYmplY3QgaW4gdmVyc2lvbmVkIGJ1Y2tldCBpcyBkZWxldGVkLlxuICAgKi9cbiAgTElGRUNZQ0xFX0VYUElSQVRJT05fREVMRVRFX01BUktFUl9DUkVBVEVEID0gXCJzMzpMaWZlY3ljbGVFeHBpcmF0aW9uOkRlbGV0ZU1hcmtlckNyZWF0ZWRcIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgd2hlbiBhbiBvYmplY3QgaXMgdHJhbnNpdGlvbmVkIHRvXG4gICAqIGFub3RoZXIgQW1hem9uIFMzIHN0b3JhZ2UgY2xhc3MgYnkgYW4gUzMgTGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBMSUZFQ1lDTEVfVFJBTlNJVElPTiA9IFwiczM6TGlmZWN5Y2xlVHJhbnNpdGlvblwiLFxuXG4gIC8qKlxuICAgKiBZb3UgcmVjZWl2ZSB0aGlzIG5vdGlmaWNhdGlvbiBldmVudCB3aGVuIGFuIG9iamVjdCB3aXRoaW4gdGhlXG4gICAqIFMzIEludGVsbGlnZW50LVRpZXJpbmcgc3RvcmFnZSBjbGFzcyBtb3ZlZCB0byB0aGUgQXJjaGl2ZSBBY2Nlc3MgdGllciBvclxuICAgKiBEZWVwIEFyY2hpdmUgQWNjZXNzIHRpZXIuXG4gICAqL1xuICBJTlRFTExJR0VOVF9USUVSSU5HID0gXCJzMzpJbnRlbGxpZ2VudFRpZXJpbmdcIixcblxuICAvKipcbiAgICogQnkgdXNpbmcgdGhlIE9iamVjdFRhZ2dpbmcgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuXG4gICAqIGFuIG9iamVjdCB0YWcgaXMgYWRkZWQgb3IgZGVsZXRlZCBmcm9tIGFuIG9iamVjdC5cbiAgICovXG4gIE9CSkVDVF9UQUdHSU5HID0gXCJzMzpPYmplY3RUYWdnaW5nOipcIixcblxuICAvKipcbiAgICogVGhlIHMzOk9iamVjdFRhZ2dpbmc6UHV0IGV2ZW50IHR5cGUgbm90aWZpZXMgeW91IHdoZW4gYSB0YWcgaXMgUFVUIG9uIGFuXG4gICAqIG9iamVjdCBvciBhbiBleGlzdGluZyB0YWcgaXMgdXBkYXRlZC5cblxuICAgKi9cbiAgT0JKRUNUX1RBR0dJTkdfUFVUID0gXCJzMzpPYmplY3RUYWdnaW5nOlB1dFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgczM6T2JqZWN0VGFnZ2luZzpEZWxldGUgZXZlbnQgdHlwZSBub3RpZmllcyB5b3Ugd2hlbiBhIHRhZyBpcyByZW1vdmVkXG4gICAqIGZyb20gYW4gb2JqZWN0LlxuICAgKi9cbiAgT0JKRUNUX1RBR0dJTkdfREVMRVRFID0gXCJzMzpPYmplY3RUYWdnaW5nOkRlbGV0ZVwiLFxuXG4gIC8qKlxuICAgKiBZb3UgcmVjZWl2ZSB0aGlzIG5vdGlmaWNhdGlvbiBldmVudCB3aGVuIGFuIEFDTCBpcyBQVVQgb24gYW4gb2JqZWN0IG9yIHdoZW5cbiAgICogYW4gZXhpc3RpbmcgQUNMIGlzIGNoYW5nZWQuXG4gICAqIEFuIGV2ZW50IGlzIG5vdCBnZW5lcmF0ZWQgd2hlbiBhIHJlcXVlc3QgcmVzdWx0cyBpbiBubyBjaGFuZ2UgdG8gYW5cbiAgICogb2JqZWN04oCZcyBBQ0wuXG4gICAqL1xuICBPQkpFQ1RfQUNMX1BVVCA9IFwiczM6T2JqZWN0QWNsOlB1dFwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbktleUZpbHRlciB7XG4gIC8qKlxuICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgZWFjaCBvZiB0aGUgbm90aWZpY2F0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTMyBrZXlzIG11c3QgaGF2ZSB0aGUgc3BlY2lmaWVkIHByZWZpeC5cbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogUzMga2V5cyBtdXN0IGhhdmUgdGhlIHNwZWNpZmllZCBzdWZmaXguXG4gICAqL1xuICByZWFkb25seSBzdWZmaXg/OiBzdHJpbmc7XG59XG4iXX0=
|
|
1203
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVja2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy9zdG9yYWdlL2J1Y2tldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFDQUE4QjtBQUM5QixzREFBNEQ7QUFDNUQsc0RBVzZCO0FBQzdCLHdEQUE2QztBQUM3QyxpQ0FBb0M7QUFJcEMsaUVBQTZEO0FBQzdELHdDQUF3QztBQUN4QyxtREFBK0M7QUFDL0MsbURBQWtFO0FBR2xFLHFFQUFnRTtBQUVoRSxvREFJMEI7QUFDMUIsNENBQXdDO0FBQ3hDLGlDQUF5RDtBQUN6RCx5Q0FBd0U7QUFDeEUscUNBQXFDO0FBQ3JDLDhCQUE4QjtBQXdwQjlCLE1BQXNCLFVBQVcsU0FBUSxnQ0FBZ0I7SUFjdkQsSUFBVyxhQUFhO1FBQ3RCLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDckIsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQ2pDLGtCQUFrQixFQUFFLElBQUksQ0FBQyx3QkFBd0I7WUFDakQsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtZQUN6QyxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDaEMsb0JBQW9CLEVBQ2xCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxrQ0FBa0M7WUFDL0QsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsVUFBVTtTQUM5QyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQXNDRCxrRUFBa0U7SUFDbEUsb0dBQW9HO0lBQ3BHLCtDQUErQztJQUUvQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLFFBQTJCLEVBQUU7UUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFqQzFCLGdCQUFnQjtR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Q0gsOERBQWlELENBQUE7SUFFakQ7Ozs7O09BS0c7SUFDSCwwRUFBNkQsQ0FBQTtJQUU3RDs7OztPQUlHO0lBQ0gsc0dBQXlGLENBQUE7SUFFekY7OztPQUdHO0lBQ0gsNERBQStDLENBQUE7SUFFL0M7Ozs7T0FJRztJQUNILDBEQUE2QyxDQUFBO0lBRTdDOzs7T0FHRztJQUNILGtEQUFxQyxDQUFBO0lBRXJDOzs7O09BSUc7SUFDSCx3REFBMkMsQ0FBQTtJQUUzQzs7O09BR0c7SUFDSCw4REFBaUQsQ0FBQTtJQUVqRDs7Ozs7T0FLRztJQUNILGdEQUFtQyxDQUFBO0FBQ3JDLENBQUMsRUE3TlcsU0FBUyx5QkFBVCxTQUFTLFFBNk5wQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVPTCB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBGYWN0TmFtZSwgUmVnaW9uSW5mbyB9IGZyb20gXCJAYXdzLWNkay9yZWdpb24taW5mb1wiO1xuaW1wb3J0IHtcbiAgczNCdWNrZXQsXG4gIHMzQnVja2V0QWNsLFxuICBzM0J1Y2tldENvcnNDb25maWd1cmF0aW9uLFxuICBzM0J1Y2tldE93bmVyc2hpcENvbnRyb2xzLFxuICBzM0J1Y2tldFB1YmxpY0FjY2Vzc0Jsb2NrLFxuICBzM0J1Y2tldFdlYnNpdGVDb25maWd1cmF0aW9uLFxuICBzM0J1Y2tldExpZmVjeWNsZUNvbmZpZ3VyYXRpb24sXG4gIHMzQnVja2V0VmVyc2lvbmluZyxcbiAgczNCdWNrZXRTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24sXG4gIGRhdGFBd3NTM0J1Y2tldCxcbn0gZnJvbSBcIkBjZGt0Zi9wcm92aWRlci1hd3NcIjtcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIkBjZGt0Zi9wcm92aWRlci10aW1lXCI7XG5pbXBvcnQgeyBMYXp5LCBUb2tlbiB9IGZyb20gXCJjZGt0ZlwiO1xuLy8gaW1wb3J0IHsgRm4gfSBmcm9tIFwiLi4vLi4vdGVycmEtZnVuY1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbiB9IGZyb20gXCIuL2J1Y2tldC1kZXN0aW5hdGlvblwiO1xuaW1wb3J0IHsgQnVja2V0Tm90aWZpY2F0aW9ucyB9IGZyb20gXCIuL2J1Y2tldC1ub3RpZmljYXRpb25zXCI7XG5pbXBvcnQgKiBhcyBwZXJtcyBmcm9tIFwiLi9idWNrZXQtcGVybXNcIjtcbmltcG9ydCB7IEJ1Y2tldFBvbGljeSB9IGZyb20gXCIuL2J1Y2tldC1wb2xpY3lcIjtcbmltcG9ydCB7IEJ1Y2tldFNvdXJjZSwgQnVja2V0U291cmNlUHJvcHMgfSBmcm9tIFwiLi9idWNrZXQtc291cmNlXCI7XG5pbXBvcnQgeyBDb3JzQ29uZmlnIH0gZnJvbSBcIi4vY29ycy1jb25maWcuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBMaWZlY3ljbGVDb25maWd1cmF0aW9uUnVsZSB9IGZyb20gXCIuL2xpZmVjeWNsZS1jb25maWcuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBPcmlnaW5BY2Nlc3NJZGVudGl0eSB9IGZyb20gXCIuL29yaWdpbi1hY2Nlc3MtaWRlbnRpdHlcIjtcbmltcG9ydCB7IFdlYnNpdGVDb25maWcgfSBmcm9tIFwiLi93ZWJzaXRlLWNvbmZpZy5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIEF3c0NvbnN0cnVjdEJhc2UsXG4gIElBd3NDb25zdHJ1Y3QsXG4gIEF3c0NvbnN0cnVjdFByb3BzLFxufSBmcm9tIFwiLi4vYXdzLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHsgQXdzU3RhY2sgfSBmcm9tIFwiLi4vYXdzLXN0YWNrXCI7XG5pbXBvcnQgeyBwYXJzZUJ1Y2tldE5hbWUsIHBhcnNlQnVja2V0QXJuIH0gZnJvbSBcIi4vdXRpbFwiO1xuaW1wb3J0IHsgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvcnNcIjtcbmltcG9ydCAqIGFzIGttcyBmcm9tIFwiLi4vZW5jcnlwdGlvblwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCIuLi9pYW1cIjtcblxuZXhwb3J0IGludGVyZmFjZSBDbG91ZGZyb250QWNjZXNzQ29uZmlnIHtcbiAgLyoqXG4gICAqIEVuYWJsZSBDbG91ZGZyb250IGFjY2VzcyB2aWEgT3JpZ2luIEFjY2VzcyBJZGVudGl0eS5cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBPYmplY3Qga2V5IHBhdHRlcm5zIGZvciBjbG91ZGZyb250IGFjY2Vzcy5cbiAgICpcbiAgICogQGRlZmF1bHQgXCIqXCJcbiAgICovXG4gIHJlYWRvbmx5IGtleVBhdHRlcm5zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSByZWZlcmVuY2UgdG8gYSBidWNrZXQgb3V0c2lkZSB0aGlzIHN0YWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0QXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBidWNrZXQuIEF0IGxlYXN0IG9uZSBvZiBidWNrZXRBcm4gb3IgYnVja2V0TmFtZSBtdXN0IGJlXG4gICAqIGRlZmluZWQgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSBhIGJ1Y2tldCByZWYuXG4gICAqL1xuICByZWFkb25seSBidWNrZXRBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBidWNrZXQuIElmIHRoZSB1bmRlcmx5aW5nIHZhbHVlIG9mIEFSTiBpcyBhIHN0cmluZywgdGhlXG4gICAqIG5hbWUgd2lsbCBiZSBwYXJzZWQgZnJvbSB0aGUgQVJOLiBPdGhlcndpc2UsIHRoZSBuYW1lIGlzIG9wdGlvbmFsLCBidXRcbiAgICogc29tZSBmZWF0dXJlcyB0aGF0IHJlcXVpcmUgdGhlIGJ1Y2tldCBuYW1lIHN1Y2ggYXMgYXV0by1jcmVhdGluZyBhIGJ1Y2tldFxuICAgKiBwb2xpY3ksIHdvbid0IHdvcmsuXG4gICAqL1xuICByZWFkb25seSBidWNrZXROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9tYWluIG5hbWUgb2YgdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJbmZlcnJlZCBmcm9tIGJ1Y2tldCBuYW1lXG4gICAqL1xuICByZWFkb25seSBidWNrZXREb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd2Vic2l0ZSBVUkwgb2YgdGhlIGJ1Y2tldCAoaWYgc3RhdGljIHdlYiBob3N0aW5nIGlzIGVuYWJsZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEluZmVycmVkIGZyb20gYnVja2V0IG5hbWUgYW5kIHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0V2Vic2l0ZVVybD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlZ2lvbmFsIGRvbWFpbiBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgYnVja2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0UmVnaW9uYWxEb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVB2NiBETlMgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGJ1Y2tldC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldER1YWxTdGFja0RvbWFpbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEtNUyBlbmNyeXB0aW9uIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZW5jcnlwdGlvbiBrZXlcbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogSWYgdGhpcyBidWNrZXQgaGFzIGJlZW4gY29uZmlndXJlZCBmb3Igc3RhdGljIHdlYnNpdGUgaG9zdGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGlzV2Vic2l0ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBhY2NvdW50IHRoaXMgZXhpc3RpbmcgYnVja2V0IGJlbG9uZ3MgdG8uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gaXQncyBhc3N1bWVkIHRoZSBidWNrZXQgYmVsb25ncyB0byB0aGUgc2FtZSBhY2NvdW50IGFzIHRoZSBzY29wZSBpdCdzIGJlaW5nIGltcG9ydGVkIGludG9cbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gdGhpcyBleGlzdGluZyBidWNrZXQgaXMgaW4uXG4gICAqIEZlYXR1cmVzIHRoYXQgcmVxdWlyZSB0aGUgcmVnaW9uIChlLmcuIGBidWNrZXRXZWJzaXRlVXJsYCkgd29uJ3QgZnVsbHkgd29ya1xuICAgKiBpZiB0aGUgcmVnaW9uIGNhbm5vdCBiZSBjb3JyZWN0bHkgaW5mZXJyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gaXQncyBhc3N1bWVkIHRoZSBidWNrZXQgaXMgaW4gdGhlIHNhbWUgcmVnaW9uIGFzIHRoZSBzY29wZSBpdCdzIGJlaW5nIGltcG9ydGVkIGludG9cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcblxuICAvLyBUT0RPOiBVc2UgQ3VzdG9tIFJlc291cmNlIGZvciB3aXRoTm90aWZpY2F0aW9ucygpIHN1cHBvcnRcbiAgLy8gLyoqXG4gIC8vICAqIFRoZSByb2xlIHRvIGJlIHVzZWQgYnkgdGhlIG5vdGlmaWNhdGlvbnMgaGFuZGxlclxuICAvLyAgKlxuICAvLyAgKiBAZGVmYXVsdCAtIGEgbmV3IHJvbGUgd2lsbCBiZSBjcmVhdGVkLlxuICAvLyAgKi9cbiAgLy8gcmVhZG9ubHkgbm90aWZpY2F0aW9uc0hhbmRsZXJSb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBidWNrZXQgaXMgcHVibGljIG9yIG5vdC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpYz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGJ1Y2tldCBoYXMgdmVyc2lvbmluZyBlbmFibGVkXG4gICAqXG4gICAqIElmIHlvdSBhcmUgZW5hYmxpbmcgdmVyc2lvbmluZyBvbiB0aGUgYnVja2V0IGZvciB0aGUgZmlyc3QgdGltZSwgQVdTIHJlY29tbWVuZHMgdGhhdFxuICAgKiB5b3Ugd2FpdCBmb3IgMTUgbWludXRlcyBhZnRlciBlbmFibGluZyB2ZXJzaW9uaW5nIGJlZm9yZSBpc3N1aW5nIHdyaXRlIG9wZXJhdGlvbnNcbiAgICogKFBVVCBvciBERUxFVEUpIG9uIG9iamVjdHMgaW4gdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogVGhpcyB3aWxsIGNhdXNlIDE1bSBkZWxheSBpZiBgcGF0aGAgaXMgY29uZmlndXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25lZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpYWwgQ2xvdWRGcm9udCB1c2VyIHRoYXQgeW91IGNhbiBhc3NvY2lhdGUgd2l0aCBBbWF6b24gUzMgb3JpZ2lucywgc28gdGhhdCB5b3UgY2FuIHNlY3VyZSBhbGwgb3IganVzdCBzb21lIG9mXG4gICAqIHlvdXIgQW1hem9uIFMzIGNvbnRlbnQuXG4gICAqXG4gICAqIFJlcXVpcmVkIHRvIHVzZSB0aGUgaW1wb3J0ZWQgYnVja2V0IGluIGEgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5BY2Nlc3NJZGVudGl0eT86IE9yaWdpbkFjY2Vzc0lkZW50aXR5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFByb3BzIGV4dGVuZHMgQXdzQ29uc3RydWN0UHJvcHMge1xuICAvKipcbiAgICogVGhlIGtpbmQgb2Ygc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB0byBhcHBseSB0byB0aGlzIGJ1Y2tldC5cbiAgICpcbiAgICogSWYgeW91IGNob29zZSBLTVMsIHlvdSBjYW4gc3BlY2lmeSBhIEtNUyBrZXkgdmlhIGBlbmNyeXB0aW9uS2V5YC4gSWZcbiAgICogZW5jcnlwdGlvbiBrZXkgaXMgbm90IHNwZWNpZmllZCwgYSBrZXkgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYEtNU2AgaWYgYGVuY3J5cHRpb25LZXlgIGlzIHNwZWNpZmllZCwgb3IgYFVORU5DUllQVEVEYCBvdGhlcndpc2UuXG4gICAqIEJ1dCBpZiBgVU5FTkNSWVBURURgIGlzIHNwZWNpZmllZCwgdGhlIGJ1Y2tldCB3aWxsIGJlIGVuY3J5cHRlZCBhcyBgUzNfTUFOQUdFRGAgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb24/OiBCdWNrZXRFbmNyeXB0aW9uO1xuXG4gIC8qKlxuICAgKiBFeHRlcm5hbCBLTVMga2V5IHRvIHVzZSBmb3IgYnVja2V0IGVuY3J5cHRpb24uXG4gICAqXG4gICAqIFRoZSBgZW5jcnlwdGlvbmAgcHJvcGVydHkgbXVzdCBiZSBlaXRoZXIgbm90IHNwZWNpZmllZCBvciBzZXQgdG8gYEtNU2Agb3IgYERTU0VgLlxuICAgKiBBbiBlcnJvciB3aWxsIGJlIGVtaXR0ZWQgaWYgYGVuY3J5cHRpb25gIGlzIHNldCB0byBgVU5FTkNSWVBURURgIG9yIGBTM19NQU5BR0VEYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiBgZW5jcnlwdGlvbmAgaXMgc2V0IHRvIGBLTVNgIGFuZCB0aGlzIHByb3BlcnR5IGlzIHVuZGVmaW5lZCxcbiAgICogYSBuZXcgS01TIGtleSB3aWxsIGJlIGNyZWF0ZWQgYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1Y2tldC5cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogV2hldGhlciBBbWF6b24gUzMgc2hvdWxkIHVzZSBpdHMgb3duIGludGVybWVkaWFyeSBrZXkgdG8gZ2VuZXJhdGUgZGF0YSBrZXlzLlxuICAgKlxuICAgKiBPbmx5IHJlbGV2YW50IHdoZW4gdXNpbmcgS01TIGZvciBlbmNyeXB0aW9uLlxuICAgKlxuICAgKiAtIElmIG5vdCBlbmFibGVkLCBldmVyeSBvYmplY3QgR0VUIGFuZCBQVVQgd2lsbCBjYXVzZSBhbiBBUEkgY2FsbCB0byBLTVMgKHdpdGggdGhlXG4gICAqICAgYXR0ZW5kYW50IGNvc3QgaW1wbGljYXRpb25zIG9mIHRoYXQpLlxuICAgKiAtIElmIGVuYWJsZWQsIFMzIHdpbGwgdXNlIGl0cyBvd24gdGltZS1saW1pdGVkIGtleSBpbnN0ZWFkLlxuICAgKlxuICAgKiBPbmx5IHJlbGV2YW50LCB3aGVuIEVuY3J5cHRpb24gaXMgbm90IHNldCB0byBgQnVja2V0RW5jcnlwdGlvbi5VTkVOQ1JZUFRFRGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldEtleUVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aChzKSB0byBzdGF0aWMgZGlyZWN0b3JpZXMgb3IgZmlsZXMgdG8gdXBsb2FkLCByZWxhdGl2ZSB0byB0aGUgU3RhY2sgZmlsZS5cbiAgICpcbiAgICogQGV4YW1wbGUgXCIuL2Rpc3RcIlxuICAgKiBAZGVmYXVsdCAtIE5vIGZpbGVzIGFyZSB1cGxvYWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZXM/OiBzdHJpbmcgfCBzdHJpbmdbXSB8IEFkZFNvdXJjZU9wdGlvbnNbXTtcblxuICAvLyBUT0RPOiBBZGQgc3VwcG9ydCB0byBwYXNzIGRvbWFpbiBwcm9wcyAoZm9yIHJvdXRlNTMgYWxpYXM/KVxuXG4gIC8qKlxuICAgKiBFbmFibGUgcHVibGljIHJlYWQgYWNjZXNzIGZvciBhbGwgdGhlIGZpbGVzIGluIHRoZSBidWNrZXQuXG4gICAqXG4gICAqIEVuYWJsZSB0aGlzIG9ubHkgaWYgeW91J3JlIG5vdCB1c2luZyBDRE4gKENsb3VkRnJvbnQpIHRvIHNlcnZlIGZpbGVzIGZyb20gdGhlIGJ1Y2tldC5cbiAgICogU2hvdWxkIG9ubHkgYmUgdHVybmVkIG9uIGlmIHlvdSB3YW50IHRvIGhvc3QgcHVibGljIGZpbGVzIGRpcmVjdGx5IGZyb20gdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBuYW1lIGZvciB0aGUgYnVja2V0LlxuICAgKlxuICAgKiBNdXN0IGJlIGxvd2VyY2FzZSBhbmQgYmV0d2VlbiAzIChtaW4pIGFuZCA2MyAobWF4KSBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqXG4gICAqIFRoZSBuYW1lIG11c3Qgbm90IGJlIGluIHRoZSBmb3JtYXQgW2J1Y2tldF9uYW1lXS0tW2F6aWRdLS14LXMzLiBVc2UgdGhlXG4gICAqIGBhd3NfczNfZGlyZWN0b3J5X2J1Y2tldGAgcmVzb3VyY2UgdG8gbWFuYWdlIFMzIEV4cHJlc3MgYnVja2V0cy5cbiAgICpcbiAgICogQSBmdWxsIGxpc3Qgb2YgYnVja2V0IG5hbWluZyBydWxlcyBbbWF5IGJlIGZvdW5kIGhlcmVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2J1Y2tldG5hbWluZ3J1bGVzLmh0bWwpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIG9taXR0ZWQsIFJlZmVyIHRvIGBuYW1lUHJlZml4YC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB1bmlxdWUgbmFtZSBiZWdpbm5pbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeC5cbiAgICogQ29uZmxpY3RzIHdpdGggYGJ1Y2tldE5hbWVgLlxuICAgKlxuICAgKiBUZXJyYWZvcm0gUHJlZml4ZXMgbXVzdCByZXNlcnZlIDI2IGNoYXJhY3RlcnMgZm9yIHRoZSB0ZXJyYWZvcm0gZ2VuZXJhdGVkIHN1ZmZpeC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiBvbWl0dGVkLCBFVCB3aWxsIGFzc2lnbiBhIHJhbmRvbSwgdW5pcXVlIG5hbWUgcHJlZml4ZWQgYnkgR3JpZFVVSUQuXG4gICAqL1xuICByZWFkb25seSBuYW1lUHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCb29sZWFuIHRoYXQgaW5kaWNhdGVzIGFsbCBvYmplY3RzIChpbmNsdWRpbmcgYW55IGxvY2tlZCBvYmplY3RzKVxuICAgKiBzaG91bGQgYmUgZGVsZXRlZCBmcm9tIHRoZSBidWNrZXQgd2hlbiB0aGUgYnVja2V0IGlzIGRlc3Ryb3llZFxuICAgKiBzbyB0aGF0IHRoZSBidWNrZXQgY2FuIGJlIGRlc3Ryb3llZCB3aXRob3V0IGVycm9yLlxuICAgKlxuICAgKiBUaGVzZSBvYmplY3RzIGFyZSBub3QgcmVjb3ZlcmFibGUuIFRoaXMgb25seSBkZWxldGVzIG9iamVjdHMgd2hlblxuICAgKiB0aGUgYnVja2V0IGlzIGRlc3Ryb3llZCwgbm90IHdoZW4gc2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byB0cnVlLlxuICAgKlxuICAgKiBPbmNlIHRoaXMgcGFyYW1ldGVyIGlzIHNldCB0byB0cnVlLCB0aGVyZSBtdXN0IGJlIGEgc3VjY2Vzc2Z1bFxuICAgKiB0ZXJyYWZvcm0gYXBwbHkgcnVuIGJlZm9yZSBhIGRlc3Ryb3kgaXMgcmVxdWlyZWQgdG8gdXBkYXRlIHRoaXNcbiAgICogdmFsdWUgaW4gdGhlIHJlc291cmNlIHN0YXRlLlxuICAgKlxuICAgKiBXaXRob3V0IGEgc3VjY2Vzc2Z1bCB0ZXJyYWZvcm0gYXBwbHkgYWZ0ZXIgdGhpcyBwYXJhbWV0ZXIgaXMgc2V0LFxuICAgKiB0aGlzIGZsYWcgd2lsbCBoYXZlIG5vIGVmZmVjdC4gSWYgc2V0dGluZyB0aGlzIGZpZWxkIGluIHRoZSBzYW1lXG4gICAqIG9wZXJhdGlvbiB0aGF0IHdvdWxkIHJlcXVpcmUgcmVwbGFjaW5nIHRoZSBidWNrZXQgb3IgZGVzdHJveWluZ1xuICAgKiB0aGUgYnVja2V0LCB0aGlzIGZsYWcgd2lsbCBub3Qgd29yay5cbiAgICpcbiAgICogQWRkaXRpb25hbGx5IHdoZW4gaW1wb3J0aW5nIGEgYnVja2V0LCBhIHN1Y2Nlc3NmdWwgdGVycmFmb3JtIGFwcGx5XG4gICAqIGlzIHJlcXVpcmVkIHRvIHNldCB0aGlzIHZhbHVlIGluIHN0YXRlIGJlZm9yZSBpdCB3aWxsIHRha2UgZWZmZWN0XG4gICAqIG9uIGEgZGVzdHJveSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmb3JjZURlc3Ryb3k/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhbiBTMyBidWNrZXQgd2Vic2l0ZSBjb25maWd1cmF0aW9uIHJlc291cmNlLlxuICAgKlxuICAgKiBJbXBvcnRhbnQ6IEFtYXpvbiBTMyB3ZWJzaXRlIGVuZHBvaW50cyBkbyBub3Qgc3VwcG9ydCBIVFRQUyBvciBhY2Nlc3MgcG9pbnRzLlxuICAgKiBJZiB5b3Ugd2FudCB0byB1c2UgSFRUUFMsIHlvdSBjYW4gdXNlIGVkZ2UgRGlzdHJpYnV0aW9uIHRvIHNlcnZlIGEgc3RhdGljXG4gICAqIHdlYnNpdGUgaG9zdGVkIGluIGEgYnVja2V0LlxuICAgKlxuICAgKiBVc2UgT3JpZ2luQWNjZXNzSWRlbnRpdHkgcHJvcGVydHkgdG8gY29udHJvbCBpbmdyZXNzIHRocm91Z2ggZWRnZSBEaXN0cmlidXRpb24uXG4gICAqXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0hvc3RpbmcgV2Vic2l0ZXMgb24gUzNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L1dlYnNpdGVIb3N0aW5nLmh0bWwpLlxuICAgKi9cbiAgcmVhZG9ubHkgd2Vic2l0ZUNvbmZpZz86IFdlYnNpdGVDb25maWc7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGFuIFMzIGJ1Y2tldCBDT1JTIGNvbmZpZ3VyYXRpb24gcmVzb3VyY2UuXG4gICAqXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IENPUlMsIGdvIHRvXG4gICAqIFtFbmFibGluZyBDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZ10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvY29ycy5odG1sKVxuICAgKiBpbiB0aGUgQW1hem9uIFMzIFVzZXIgR3VpZGUuXG4gICAqL1xuICByZWFkb25seSBjb3JzQ29uZmlnPzogQ29yc0NvbmZpZztcblxuICAvKipcbiAgICogT25lIG9yIG1vcmUgTGlmZWN5Y2xlIHJ1bGVzLiBFYWNoIHJ1bGUgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZzpcbiAgICpcbiAgICogIC0gUnVsZSBpZFxuICAgKiAgLSBGaWx0ZXIgaWRlbnRpZnlpbmcgb2JqZWN0cyB0byB3aGljaCB0aGUgcnVsZSBhcHBsaWVzXG4gICAqICAtIE9uZSBvciBtb3JlIHRyYW5zaXRpb24gb3IgZXhwaXJhdGlvbiBhY3Rpb25zXG4gICAqXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgQW1hem9uIFMzIFVzZXIgR3VpZGUgb24gW0xpZmVjeWNsZSBDb25maWd1cmF0aW9uIEVsZW1lbnRzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9pbnRyby1saWZlY3ljbGUtcnVsZXMuaHRtbCkuXG4gICAqL1xuICByZWFkb25seSBsaWZlY3ljbGVSdWxlcz86IExpZmVjeWNsZUNvbmZpZ3VyYXRpb25SdWxlW107XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHZlcnNpb25pbmcgb24gdGhlIFMzIGJ1Y2tldC5cbiAgICpcbiAgICogU2V0dGluZyB0aGlzIHRvIGZhbHNlIHdpbGwgc3VzcGVuZCB2ZXJzaW9uaW5nIGlmIHRoZSBhc3NvY2lhdGVkIFMzIGJ1Y2tldCBpcyB2ZXJzaW9uZWQuXG4gICAqXG4gICAqIElmIHlvdSBhcmUgZW5hYmxpbmcgdmVyc2lvbmluZyBvbiB0aGUgYnVja2V0IGZvciB0aGUgZmlyc3QgdGltZSwgQVdTIHJlY29tbWVuZHMgdGhhdCB5b3Ugd2FpdCBmb3IgMTUgbWludXRlcyBhZnRlciBlbmFibGluZyB2ZXJzaW9uaW5nIGJlZm9yZSBpc3N1aW5nIHdyaXRlIG9wZXJhdGlvbnMgKFBVVCBvciBERUxFVEUpIG9uIG9iamVjdHMgaW4gdGhlIGJ1Y2tldC5cbiAgICogVGhpcyB3aWxsIGNhdXNlIDE1bSBkZWxheSBpZiBgcGF0aGAgaXMgY29uZmlndXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25lZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBidWNrZXQgc2hvdWxkIHNlbmQgbm90aWZpY2F0aW9ucyB0byBBbWF6b24gRXZlbnRCcmlkZ2Ugb3Igbm90LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZXZlbnRCcmlkZ2VFbmFibGVkPzogYm9vbGVhbjtcblxuICAvLyBUT0RPOiByZS1hZGQgT2JqZWN0T3duZXJzaGlwIGFuZCBCdWNrZXRBY2Nlc3NDb250cm9sXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0wxMjg0XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0wxNjQzXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0wxOTM2XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0wyMzYzXG4gIC8vIEJ1Y2tldEFjY2Vzc0NvbnRyb2xcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXMzL2xpYi9idWNrZXQudHMjTDI5MDVcblxuICAvKipcbiAgICogRW5mb3JjZXMgU1NMIGZvciByZXF1ZXN0cy4gUzMuNSBvZiB0aGUgQVdTIEZvdW5kYXRpb25hbCBTZWN1cml0eSBCZXN0IFByYWN0aWNlcyBSZWdhcmRpbmcgUzMuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NvbmZpZy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvczMtYnVja2V0LXNzbC1yZXF1ZXN0cy1vbmx5Lmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuZm9yY2VTU0w/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmZvcmNlcyBtaW5pbXVtIFRMUyB2ZXJzaW9uIGZvciByZXF1ZXN0cy5cbiAgICpcbiAgICogUmVxdWlyZXMgYGVuZm9yY2VTU0xgIHRvIGJlIGVuYWJsZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvYW1hem9uLXMzLXBvbGljeS1rZXlzLmh0bWwjZXhhbXBsZS1vYmplY3QtdGxzLXZlcnNpb25cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gbWluaW11bSBUTFMgdmVyc2lvbiBpcyBlbmZvcmNlZC5cbiAgICovXG4gIHJlYWRvbmx5IG1pbmltdW1UTFNWZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgQ2xvdWRmcm9udCBhY2Nlc3MgdmlhIE9yaWdpbiBBY2Nlc3MgSWRlbnRpdHkuXG4gICAqXG4gICAqIE5vdGU6IHJlY29tbWVuZGVkIHRvIG1pZ3JhdGUgdG8gT0FDIGluIGZ1dHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjbG91ZGZyb250IGFjY2Vzc1xuICAgKi9cbiAgcmVhZG9ubHkgY2xvdWRmcm9udEFjY2Vzcz86IENsb3VkZnJvbnRBY2Nlc3NDb25maWc7XG5cbiAgLy8gVE9ETzogQWRkIGZsYWcgdG8gcmVnaXN0ZXIgQnVja2V0IFNvdXJjZSBvdXRwdXRzP1xufVxuXG4vKipcbiAqIE91dHB1dHMgd2hpY2ggbWF5IGJlIHJlZ2lzdGVyZWQgZm9yIG91dHB1dCB2aWEgdGhlIEdyaWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0T3V0cHV0cyB7XG4gIC8qKlxuICAgKiBBV1MgQnVja2V0IG5hbWVcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBV1MgQnVja2V0IGFyblxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBhcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGUgc3RhdGljIHdlYnNpdGUuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdlYnNpdGVVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBEb21haW4gbmFtZSBvZiB0aGUgc3RhdGljIHdlYnNpdGUuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdlYnNpdGVEb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVB2NCBETlMgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGJ1Y2tldC5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZG9tYWluTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uYWwgZG9tYWluIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBidWNrZXQuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbmFsRG9tYWluTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcmlnaW4gQWNjZXNzIElkZW50aXR5LCBpZiBjbG91ZGZyb250QWNjZXNzIGlzIGVuYWJsZWQuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbkFjY2Vzc0lkZW50aXR5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLbXMgS2V5IG91dHB1dHMsIGlmIGJ1Y2tldCBoYXMgZW5jcnlwdGlvbi5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5LZXlPdXRwdXRzO1xufVxuXG4vKipcbiAqIEltcG9ydGVkIG9yIGNyZWF0ZWQgQnVja2V0IGF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQnVja2V0IGV4dGVuZHMgSUF3c0NvbnN0cnVjdCB7XG4gIC8qKiBTdHJvbmdseSB0eXBlZCBvdXRwdXRzICovXG4gIHJlYWRvbmx5IGJ1Y2tldE91dHB1dHM6IEJ1Y2tldE91dHB1dHM7XG5cbiAgLyoqXG4gICAqIEFXUyBCdWNrZXQgYXJuXG4gICAqL1xuICByZWFkb25seSBidWNrZXRBcm46IHN0cmluZztcblxuICAvKipcbiAgICogQVdTIEJ1Y2tldCBuYW1lXG4gICAqL1xuICByZWFkb25seSBidWNrZXROYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGJ1Y2tldCBoYXMgdmVyc2lvbmluZyBlbmFibGVkICovXG4gIHJlYWRvbmx5IHZlcnNpb25lZDogYm9vbGVhbjtcblxuICAvKiogVGhlIGhvc3RlZCBab25lIElkIGZvciB0aGUgYnVja2V0ICovXG4gIHJlYWRvbmx5IGhvc3RlZFpvbmVJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRG9tYWluIG5hbWUgb2YgdGhlIHN0YXRpYyB3ZWJzaXRlLlxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIFJvdXRlIDUzIGFsaWFzIHJlY29yZHMuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdlYnNpdGVEb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBidWNrZXQgaXMgcHVibGljIG9yIG5vdC5cbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpYz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIEtNUyBlbmNyeXB0aW9uIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBwb2xpY3kgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVja2V0LlxuICAgKlxuICAgKiBJZiBgYXV0b0NyZWF0ZVBvbGljeWAgaXMgdHJ1ZSwgYSBgQnVja2V0UG9saWN5YCB3aWxsIGJlIGNyZWF0ZWQgdXBvbiB0aGVcbiAgICogZmlyc3QgY2FsbCB0byBhZGRUb1Jlc291cmNlUG9saWN5KHMpLlxuICAgKi9cbiAgcG9saWN5PzogQnVja2V0UG9saWN5O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBzb3VyY2Ugb2YgZmlsZXMgZm9yIHVwbG9hZCB0byB0aGUgYnVja2V0LlxuICAgKi9cbiAgYWRkU291cmNlKHByb3BzOiBBZGRTb3VyY2VPcHRpb25zLCBzb3VyY2VJZD86IHN0cmluZyk6IHN0cmluZztcblxuICAvKipcbiAgICogSWYgdGhpcyBidWNrZXQgaGFzIGJlZW4gY29uZmlndXJlZCBmb3Igc3RhdGljIHdlYnNpdGUgaG9zdGluZy5cbiAgICovXG4gIGlzV2Vic2l0ZSgpOiB0aGlzIGlzIHtcbiAgICB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nO1xuICAgIGJ1Y2tldE91dHB1dHM6IHsgd2Vic2l0ZVVybDogc3RyaW5nOyB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBodHRwcyBVUkwgb2YgYW4gUzMgb2JqZWN0LiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogLSBgaHR0cHM6Ly9zMy51cy13ZXN0LTEuYW1hem9uYXdzLmNvbS9vbmx5YnVja2V0YFxuICAgKiAtIGBodHRwczovL3MzLnVzLXdlc3QtMS5hbWF6b25hd3MuY29tL2J1Y2tldC9rZXlgXG4gICAqIC0gYGh0dHBzOi8vczMuY24tbm9ydGgtMS5hbWF6b25hd3MuY29tLmNuL2NoaW5hLWJ1Y2tldC9teWtleWBcbiAgICogQHBhcmFtIGtleSBUaGUgUzMga2V5IG9mIHRoZSBvYmplY3QuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBVUkwgb2YgdGhlXG4gICAqICAgICAgYnVja2V0IGlzIHJldHVybmVkLlxuICAgKiBAcmV0dXJucyBhbiBPYmplY3RTM1VybCB0b2tlblxuICAgKi9cbiAgdXJsRm9yT2JqZWN0KGtleT86IHN0cmluZyk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFMzIFVSTCBvZiBhbiBTMyBvYmplY3QuIEZvciBleGFtcGxlOlxuICAgKiAtIGBzMzovL29ubHlidWNrZXRgXG4gICAqIC0gYHMzOi8vYnVja2V0L2tleWBcbiAgICogQHBhcmFtIGtleSBUaGUgUzMga2V5IG9mIHRoZSBvYmplY3QuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBTMyBVUkwgb2YgdGhlXG4gICAqICAgICAgYnVja2V0IGlzIHJldHVybmVkLlxuICAgKiBAcmV0dXJucyBhbiBPYmplY3RTM1VybCB0b2tlblxuICAgKi9cbiAgczNVcmxGb3JPYmplY3Qoa2V5Pzogc3RyaW5nKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIEFSTiB0aGF0IHJlcHJlc2VudHMgYWxsIG9iamVjdHMgd2l0aGluIHRoZSBidWNrZXQgdGhhdCBtYXRjaFxuICAgKiB0aGUga2V5IHBhdHRlcm4gc3BlY2lmaWVkLiBUbyByZXByZXNlbnQgYWxsIGtleXMsIHNwZWNpZnkgYGBcIipcImBgLlxuICAgKi9cbiAgYXJuRm9yT2JqZWN0cyhrZXlQYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzdGF0ZW1lbnQgdG8gdGhlIHJlc291cmNlIHBvbGljeSBmb3IgYSBwcmluY2lwYWwgKGkuZS5cbiAgICogYWNjb3VudC9yb2xlL3NlcnZpY2UpIHRvIHBlcmZvcm0gYWN0aW9ucyBvbiB0aGlzIGJ1Y2tldCBhbmQvb3IgaXRzXG4gICAqIGNvbnRlbnRzLiBVc2UgYGJ1Y2tldEFybmAgYW5kIGBhcm5Gb3JPYmplY3RzKGtleXMpYCB0byBvYnRhaW4gQVJOcyBmb3JcbiAgICogdGhpcyBidWNrZXQgb3Igb2JqZWN0cy5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBwb2xpY3kgc3RhdGVtZW50IG1heSBvciBtYXkgbm90IGJlIGFkZGVkIHRvIHRoZSBwb2xpY3kuXG4gICAqIEZvciBleGFtcGxlLCB3aGVuIGFuIGBJQnVja2V0YCBpcyBjcmVhdGVkIGZyb20gYW4gZXhpc3RpbmcgYnVja2V0LFxuICAgKiBpdCdzIG5vdCBwb3NzaWJsZSB0byB0ZWxsIHdoZXRoZXIgdGhlIGJ1Y2tldCBhbHJlYWR5IGhhcyBhIHBvbGljeVxuICAgKiBhdHRhY2hlZCwgbGV0IGFsb25lIHRvIHJlLXVzZSB0aGF0IHBvbGljeSB0byBhZGQgbW9yZSBzdGF0ZW1lbnRzIHRvIGl0LlxuICAgKiBTbyBpdCdzIHNhZmVzdCB0byBkbyBub3RoaW5nIGluIHRoZXNlIGNhc2VzLlxuICAgKlxuICAgKiBAcGFyYW0gcGVybWlzc2lvbiB0aGUgcG9saWN5IHN0YXRlbWVudCB0byBiZSBhZGRlZCB0byB0aGUgYnVja2V0J3NcbiAgICogcG9saWN5LlxuICAgKiBAcmV0dXJucyBtZXRhZGF0YSBhYm91dCB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWV0aG9kLiBJZiB0aGUgcG9saWN5XG4gICAqIHdhcyBub3QgYWRkZWQsIHRoZSB2YWx1ZSBvZiBgc3RhdGVtZW50QWRkZWRgIHdpbGwgYmUgYGZhbHNlYC4gWW91XG4gICAqIHNob3VsZCBhbHdheXMgY2hlY2sgdGhpcyB2YWx1ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgb3BlcmF0aW9uIHdhc1xuICAgKiBhY3R1YWxseSBjYXJyaWVkIG91dC4gT3RoZXJ3aXNlLCBzeW50aGVzaXMgYW5kIGRlcGxveSB3aWxsIHRlcm1pbmF0ZVxuICAgKiBzaWxlbnRseSwgd2hpY2ggbWF5IGJlIGNvbmZ1c2luZy5cbiAgICovXG4gIGFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgcGVybWlzc2lvbjogaWFtLlBvbGljeVN0YXRlbWVudCxcbiAgKTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgZm9yIHRoaXMgYnVja2V0IGFuZCBpdCdzIGNvbnRlbnRzIHRvIGFuIElBTVxuICAgKiBwcmluY2lwYWwgKFJvbGUvR3JvdXAvVXNlcikuXG4gICAqXG4gICAqIElmIGVuY3J5cHRpb24gaXMgdXNlZCwgcGVybWlzc2lvbiB0byB1c2UgdGhlIGtleSB0byBkZWNyeXB0IHRoZSBjb250ZW50c1xuICAgKiBvZiB0aGUgYnVja2V0IHdpbGwgYWxzbyBiZSBncmFudGVkIHRvIHRoZSBzYW1lIHByaW5jaXBhbC5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpLiBQYXJhbWV0ZXIgdHlwZSBpcyBgYW55YCBidXQgYHN0cmluZ2Agc2hvdWxkIGJlIHBhc3NlZCBpbi5cbiAgICovXG4gIGdyYW50UmVhZChpZGVudGl0eTogaWFtLklHcmFudGFibGUsIG9iamVjdHNLZXlQYXR0ZXJuPzogYW55KTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudCB3cml0ZSBwZXJtaXNzaW9ucyB0byB0aGlzIGJ1Y2tldCB0byBhbiBJQU0gcHJpbmNpcGFsLlxuICAgKlxuICAgKiBJZiBlbmNyeXB0aW9uIGlzIHVzZWQsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBrZXkgdG8gZW5jcnlwdCB0aGUgY29udGVudHNcbiAgICogb2Ygd3JpdHRlbiBmaWxlcyB3aWxsIGFsc28gYmUgZ3JhbnRlZCB0byB0aGUgc2FtZSBwcmluY2lwYWwuXG4gICAqXG4gICAqIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBgczM6UHV0T2JqZWN0QWNsYCwgd2hpY2ggY291bGQgYmUgdXNlZCB0byBncmFudCByZWFkL3dyaXRlIG9iamVjdCBhY2Nlc3MgdG8gSUFNIHByaW5jaXBhbHMgaW4gb3RoZXIgYWNjb3VudHMuXG4gICAqXG4gICAqIElmIHlvdSBuZWVkIHRoZSBwcmluY2lwYWwgdG8gaGF2ZSBwZXJtaXNzaW9ucyB0byBtb2RpZnkgdGhlIEFDTHMsXG4gICAqIHVzZSB0aGUgYGdyYW50UHV0QWNsYCBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgcHJpbmNpcGFsXG4gICAqIEBwYXJhbSBvYmplY3RzS2V5UGF0dGVybiBSZXN0cmljdCB0aGUgcGVybWlzc2lvbiB0byBhIGNlcnRhaW4ga2V5IHBhdHRlcm4gKGRlZmF1bHQgJyonKS4gUGFyYW1ldGVyIHR5cGUgaXMgYGFueWAgYnV0IGBzdHJpbmdgIHNob3VsZCBiZSBwYXNzZWQgaW4uXG4gICAqIEBwYXJhbSBhbGxvd2VkQWN0aW9uUGF0dGVybnMgUmVzdHJpY3QgdGhlIHBlcm1pc3Npb25zIHRvIGNlcnRhaW4gbGlzdCBvZiBhY3Rpb24gcGF0dGVybnNcbiAgICovXG4gIGdyYW50V3JpdGUoXG4gICAgaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLFxuICAgIG9iamVjdHNLZXlQYXR0ZXJuPzogYW55LFxuICAgIGFsbG93ZWRBY3Rpb25QYXR0ZXJucz86IHN0cmluZ1tdLFxuICApOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBzMzpQdXRPYmplY3QqIGFuZCBzMzpBYm9ydCogcGVybWlzc2lvbnMgZm9yIHRoaXMgYnVja2V0IHRvIGFuIElBTSBwcmluY2lwYWwuXG4gICAqXG4gICAqIElmIGVuY3J5cHRpb24gaXMgdXNlZCwgcGVybWlzc2lvbiB0byB1c2UgdGhlIGtleSB0byBlbmNyeXB0IHRoZSBjb250ZW50c1xuICAgKiBvZiB3cml0dGVuIGZpbGVzIHdpbGwgYWxzbyBiZSBncmFudGVkIHRvIHRoZSBzYW1lIHByaW5jaXBhbC5cbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpLiBQYXJhbWV0ZXIgdHlwZSBpcyBgYW55YCBidXQgYHN0cmluZ2Agc2hvdWxkIGJlIHBhc3NlZCBpbi5cbiAgICovXG4gIGdyYW50UHV0KGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm4/OiBhbnkpOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHRoZSBnaXZlbiBJQU0gaWRlbnRpdHkgcGVybWlzc2lvbnMgdG8gbW9kaWZ5IHRoZSBBQ0xzIG9mIG9iamVjdHMgaW4gdGhlIGdpdmVuIEJ1Y2tldC5cbiAgICpcbiAgICogY2FsbGluZyBgZ3JhbnRXcml0ZWAgb3IgYGdyYW50UmVhZFdyaXRlYCBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9ucyB0byBtb2RpZnkgdGhlIEFDTHMgb2YgdGhlIG9iamVjdHM7XG4gICAqIGluIHRoaXMgY2FzZSwgaWYgeW91IG5lZWQgdG8gbW9kaWZ5IG9iamVjdCBBQ0xzLCBjYWxsIHRoaXMgbWV0aG9kIGV4cGxpY2l0bHkuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgcHJpbmNpcGFsXG4gICAqIEBwYXJhbSBvYmplY3RzS2V5UGF0dGVybiBSZXN0cmljdCB0aGUgcGVybWlzc2lvbiB0byBhIGNlcnRhaW4ga2V5IHBhdHRlcm4gKGRlZmF1bHQgJyonKVxuICAgKi9cbiAgZ3JhbnRQdXRBY2woaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLCBvYmplY3RzS2V5UGF0dGVybj86IHN0cmluZyk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnRzIHMzOkRlbGV0ZU9iamVjdCogcGVybWlzc2lvbiB0byBhbiBJQU0gcHJpbmNpcGFsIGZvciBvYmplY3RzXG4gICAqIGluIHRoaXMgYnVja2V0LlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgZ3JhbnREZWxldGUoaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLCBvYmplY3RzS2V5UGF0dGVybj86IGFueSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnRzIHJlYWQvd3JpdGUgcGVybWlzc2lvbnMgZm9yIHRoaXMgYnVja2V0IGFuZCBpdCdzIGNvbnRlbnRzIHRvIGFuIElBTVxuICAgKiBwcmluY2lwYWwgKFJvbGUvR3JvdXAvVXNlcikuXG4gICAqXG4gICAqIElmIGFuIGVuY3J5cHRpb24ga2V5IGlzIHVzZWQsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBrZXkgZm9yXG4gICAqIGVuY3J5cHQvZGVjcnlwdCB3aWxsIGFsc28gYmUgZ3JhbnRlZC5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGBzMzpQdXRPYmplY3RBY2xgLCB3aGljaCBjb3VsZCBiZSB1c2VkIHRvIGdyYW50IHJlYWQvd3JpdGUgb2JqZWN0IGFjY2VzcyB0byBJQU0gcHJpbmNpcGFscyBpbiBvdGhlciBhY2NvdW50cy5cbiAgICpcbiAgICogSWYgeW91IG5lZWQgdGhlIHByaW5jaXBhbCB0byBoYXZlIHBlcm1pc3Npb25zIHRvIG1vZGlmeSB0aGUgQUNMcyxcbiAgICogdXNlIHRoZSBgZ3JhbnRQdXRBY2xgIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpLiBQYXJhbWV0ZXIgdHlwZSBpcyBgYW55YCBidXQgYHN0cmluZ2Agc2hvdWxkIGJlIHBhc3NlZCBpbi5cbiAgICovXG4gIGdyYW50UmVhZFdyaXRlKGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm4/OiBhbnkpOiBpYW0uR3JhbnQ7XG5cbiAgLy8gLyoqXG4gIC8vICAqIEFsbG93cyB1bnJlc3RyaWN0ZWQgYWNjZXNzIHRvIG9iamVjdHMgZnJvbSB0aGlzIGJ1Y2tldC5cbiAgLy8gICpcbiAgLy8gICogSU1QT1JUQU5UOiBUaGlzIHBlcm1pc3Npb24gYWxsb3dzIGFueW9uZSB0byBwZXJmb3JtIGFjdGlvbnMgb24gUzMgb2JqZWN0c1xuICAvLyAgKiBpbiB0aGlzIGJ1Y2tldCwgd2hpY2ggaXMgdXNlZnVsIGZvciB3aGVuIHlvdSBjb25maWd1cmUgeW91ciBidWNrZXQgYXMgYVxuICAvLyAgKiB3ZWJzaXRlIGFuZCB3YW50IGV2ZXJ5b25lIHRvIGJlIGFibGUgdG8gcmVhZCBvYmplY3RzIGluIHRoZSBidWNrZXQgd2l0aG91dFxuICAvLyAgKiBuZWVkaW5nIHRvIGF1dGhlbnRpY2F0ZS5cbiAgLy8gICpcbiAgLy8gICogV2l0aG91dCBhcmd1bWVudHMsIHRoaXMgbWV0aG9kIHdpbGwgZ3JhbnQgcmVhZCAoXCJzMzpHZXRPYmplY3RcIikgYWNjZXNzIHRvXG4gIC8vICAqIGFsbCBvYmplY3RzIChcIipcIikgaW4gdGhlIGJ1Y2tldC5cbiAgLy8gICpcbiAgLy8gICogVGhlIG1ldGhvZCByZXR1cm5zIHRoZSBgaWFtLkdyYW50YCBvYmplY3QsIHdoaWNoIGNhbiB0aGVuIGJlIG1vZGlmaWVkXG4gIC8vICAqIGFzIG5lZWRlZC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gYWRkIGEgY29uZGl0aW9uIHRoYXQgd2lsbCByZXN0cmljdCBhY2Nlc3Mgb25seVxuICAvLyAgKiB0byBhbiBJUHY0IHJhbmdlIGxpa2UgdGhpczpcbiAgLy8gICpcbiAgLy8gICogICAgIGNvbnN0IGdyYW50ID0gYnVja2V0LmdyYW50UHVibGljQWNjZXNzKCk7XG4gIC8vICAqICAgICBncmFudC5yZXNvdXJjZVN0YXRlbWVudCEuYWRkQ29uZGl0aW9uKOKAmElwQWRkcmVzc+KAmSwgeyDigJxhd3M6U291cmNlSXDigJ06IOKAnDU0LjI0MC4xNDMuMC8yNOKAnSB9KTtcbiAgLy8gICpcbiAgLy8gICpcbiAgLy8gICogQHBhcmFtIGtleVByZWZpeCB0aGUgcHJlZml4IG9mIFMzIG9iamVjdCBrZXlzIChlLmcuIGBob21lLypgKS4gRGVmYXVsdCBpcyBcIipcIi5cbiAgLy8gICogQHBhcmFtIGFsbG93ZWRBY3Rpb25zIHRoZSBzZXQgb2YgUzMgYWN0aW9ucyB0byBhbGxvdy4gRGVmYXVsdCBpcyBcInMzOkdldE9iamVjdFwiLlxuICAvLyAgKiBAcmV0dXJucyBUaGUgYGlhbS5Qb2xpY3lTdGF0ZW1lbnRgIG9iamVjdCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYXBwbHkgZS5nLiBjb25kaXRpb25zLlxuICAvLyAgKi9cbiAgLy8gZ3JhbnRQdWJsaWNBY2Nlc3Moa2V5UHJlZml4Pzogc3RyaW5nLCAuLi5hbGxvd2VkQWN0aW9uczogc3RyaW5nW10pOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBidWNrZXQgbm90aWZpY2F0aW9uIGV2ZW50IGRlc3RpbmF0aW9uLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHRyaWdnZXIgdGhlIG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0gZGVzdCBUaGUgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uIChMYW1iZGEsIFNOUyBUb3BpYyBvciBTUVMgUXVldWUpXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXJzIFMzIG9iamVjdCBrZXkgZmlsdGVyIHJ1bGVzIHRvIGRldGVybWluZSB3aGljaCBvYmplY3RzXG4gICAqIHRyaWdnZXIgdGhpcyBldmVudC4gRWFjaCBmaWx0ZXIgbXVzdCBpbmNsdWRlIGEgYHByZWZpeGAgYW5kL29yIGBzdWZmaXhgXG4gICAqIHRoYXQgd2lsbCBiZSBtYXRjaGVkIGFnYWluc3QgdGhlIHMzIG9iamVjdCBrZXkuIFJlZmVyIHRvIHRoZSBTMyBEZXZlbG9wZXIgR3VpZGVcbiAgICogZm9yIGRldGFpbHMgYWJvdXQgYWxsb3dlZCBmaWx0ZXIgcnVsZXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvTm90aWZpY2F0aW9uSG93VG8uaHRtbCNub3RpZmljYXRpb24taG93LXRvLWZpbHRlcmluZ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgICBkZWNsYXJlIGNvbnN0IG15TGFtYmRhOiBsYW1iZGEuRnVuY3Rpb247XG4gICAqICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgJ015QnVja2V0Jyk7XG4gICAqICAgIGJ1Y2tldC5hZGRFdmVudE5vdGlmaWNhdGlvbihzMy5FdmVudFR5cGUuT0JKRUNUX0NSRUFURUQsIG5ldyBzM24uTGFtYmRhRGVzdGluYXRpb24obXlMYW1iZGEpLCB7cHJlZml4OiAnaG9tZS9teXVzZXJuYW1lLyonfSlcbiAgICpcbiAgICogQHNlZVxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9Ob3RpZmljYXRpb25Ib3dUby5odG1sXG4gICAqL1xuICBhZGRFdmVudE5vdGlmaWNhdGlvbihcbiAgICBldmVudDogRXZlbnRUeXBlLFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIGEgZGVzdGluYXRpb24gdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gYW4gb2JqZWN0IGlzXG4gICAqIGNyZWF0ZWQgaW4gdGhlIGJ1Y2tldC4gVGhpcyBpcyBpZGVudGljYWwgdG8gY2FsbGluZ1xuICAgKiBgb25FdmVudChzMy5FdmVudFR5cGUuT0JKRUNUX0NSRUFURUQpYC5cbiAgICpcbiAgICogQHBhcmFtIGRlc3QgVGhlIG5vdGlmaWNhdGlvbiBkZXN0aW5hdGlvbiAoc2VlIG9uRXZlbnQpXG4gICAqIEBwYXJhbSBmaWx0ZXJzIEZpbHRlcnMgKHNlZSBvbkV2ZW50KVxuICAgKi9cbiAgYWRkT2JqZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbihcbiAgICBkZXN0OiBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gICAgLi4uZmlsdGVyczogTm90aWZpY2F0aW9uS2V5RmlsdGVyW11cbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogU3Vic2NyaWJlcyBhIGRlc3RpbmF0aW9uIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucyB3aGVuIGFuIG9iamVjdCBpc1xuICAgKiByZW1vdmVkIGZyb20gdGhlIGJ1Y2tldC4gVGhpcyBpcyBpZGVudGljYWwgdG8gY2FsbGluZ1xuICAgKiBgb25FdmVudChFdmVudFR5cGUuT0JKRUNUX1JFTU9WRUQpYC5cbiAgICpcbiAgICogQHBhcmFtIGRlc3QgVGhlIG5vdGlmaWNhdGlvbiBkZXN0aW5hdGlvbiAoc2VlIG9uRXZlbnQpXG4gICAqIEBwYXJhbSBmaWx0ZXJzIEZpbHRlcnMgKHNlZSBvbkV2ZW50KVxuICAgKi9cbiAgYWRkT2JqZWN0UmVtb3ZlZE5vdGlmaWNhdGlvbihcbiAgICBkZXN0OiBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gICAgLi4uZmlsdGVyczogTm90aWZpY2F0aW9uS2V5RmlsdGVyW11cbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogRW5hYmxlcyBldmVudCBicmlkZ2Ugbm90aWZpY2F0aW9uLCBjYXVzaW5nIGFsbCBldmVudHMgYmVsb3cgdG8gYmUgc2VudCB0byBFdmVudEJyaWRnZTpcbiAgICpcbiAgICogLSBPYmplY3QgRGVsZXRlZCAoRGVsZXRlT2JqZWN0KVxuICAgKiAtIE9iamVjdCBEZWxldGVkIChMaWZlY3ljbGUgZXhwaXJhdGlvbilcbiAgICogLSBPYmplY3QgUmVzdG9yZSBJbml0aWF0ZWRcbiAgICogLSBPYmplY3QgUmVzdG9yZSBDb21wbGV0ZWRcbiAgICogLSBPYmplY3QgUmVzdG9yZSBFeHBpcmVkXG4gICAqIC0gT2JqZWN0IFN0b3JhZ2UgQ2xhc3MgQ2hhbmdlZFxuICAgKiAtIE9iamVjdCBBY2Nlc3MgVGllciBDaGFuZ2VkXG4gICAqIC0gT2JqZWN0IEFDTCBVcGRhdGVkXG4gICAqIC0gT2JqZWN0IFRhZ3MgQWRkZWRcbiAgICogLSBPYmplY3QgVGFncyBEZWxldGVkXG4gICAqL1xuICBlbmFibGVFdmVudEJyaWRnZU5vdGlmaWNhdGlvbigpOiB2b2lkO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQnVja2V0QmFzZSBleHRlbmRzIEF3c0NvbnN0cnVjdEJhc2UgaW1wbGVtZW50cyBJQnVja2V0IHtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGJ1Y2tldEFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYnVja2V0TmFtZTogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgd2Vic2l0ZURvbWFpbk5hbWU/OiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBidWNrZXREb21haW5OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBidWNrZXRSZWdpb25hbERvbWFpbk5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHdlYnNpdGVFbmRwb2ludD86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHB1YmxpYz86IGJvb2xlYW47XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB2ZXJzaW9uZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBob3N0ZWRab25lSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIEtNUyBlbmNyeXB0aW9uIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuICBwdWJsaWMgZ2V0IGJ1Y2tldE91dHB1dHMoKTogQnVja2V0T3V0cHV0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgIGFybjogdGhpcy5idWNrZXRBcm4sXG4gICAgICBkb21haW5OYW1lOiB0aGlzLmJ1Y2tldERvbWFpbk5hbWUsXG4gICAgICByZWdpb25hbERvbWFpbk5hbWU6IHRoaXMuYnVja2V0UmVnaW9uYWxEb21haW5OYW1lLFxuICAgICAgd2Vic2l0ZURvbWFpbk5hbWU6IHRoaXMud2Vic2l0ZURvbWFpbk5hbWUsXG4gICAgICB3ZWJzaXRlVXJsOiB0aGlzLndlYnNpdGVFbmRwb2ludCxcbiAgICAgIG9yaWdpbkFjY2Vzc0lkZW50aXR5OlxuICAgICAgICB0aGlzLm9yaWdpbkFjY2Vzc0lkZW50aXR5Py5jbG91ZEZyb250T3JpZ2luQWNjZXNzSWRlbnRpdHlQYXRoLFxuICAgICAgZW5jcnlwdGlvbktleTogdGhpcy5lbmNyeXB0aW9uS2V5Py5rZXlPdXRwdXRzLFxuICAgIH07XG4gIH1cbiAgcHVibGljIGdldCBvdXRwdXRzKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldE91dHB1dHM7XG4gIH1cbiAgLy8gcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IHJlc291cmNlOlxuICAvLyAgIHwgczNCdWNrZXQuUzNCdWNrZXRcbiAgLy8gICB8IGRhdGFBd3NTM0J1Y2tldC5EYXRhQXdzUzNCdWNrZXQ7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWFkb25seSBvcmlnaW5BY2Nlc3NJZGVudGl0eT86IE9yaWdpbkFjY2Vzc0lkZW50aXR5O1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IF9pc1dlYnNpdGU6IGJvb2xlYW47XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBzb3VyY2VTbGVlcD86IHNsZWVwLlNsZWVwO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc291cmNlczogU291cmNlSW5kZXhbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgcG9saWN5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1Y2tldC5cbiAgICpcbiAgICogSWYgYGF1dG9DcmVhdGVQb2xpY3lgIGlzIHRydWUsIGEgYEJ1Y2tldFBvbGljeWAgd2lsbCBiZSBjcmVhdGVkIHVwb24gdGhlXG4gICAqIGZpcnN0IGNhbGwgdG8gYWRkVG9SZXNvdXJjZVBvbGljeShzKS5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBwb2xpY3k/OiBCdWNrZXRQb2xpY3k7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBhIGJ1Y2tldCByZXNvdXJjZSBwb2xpY3kgc2hvdWxkIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB1cG9uXG4gICAqIHRoZSBmaXJzdCBjYWxsIHRvIGBhZGRUb1Jlc291cmNlUG9saWN5YC5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBhdXRvQ3JlYXRlUG9saWN5OiBib29sZWFuO1xuXG4gIC8vIC8qKlxuICAvLyAgKiBXaGV0aGVyIHRvIGRpc2FsbG93IHB1YmxpYyBhY2Nlc3NcbiAgLy8gICovXG4gIC8vIHByb3RlY3RlZCBhYnN0cmFjdCBkaXNhbGxvd1B1YmxpY0FjY2Vzcz86IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBub3RpZmljYXRpb25zPzogQnVja2V0Tm90aWZpY2F0aW9ucztcblxuICBwcm90ZWN0ZWQgbm90aWZpY2F0aW9uc0hhbmRsZXJSb2xlPzogaWFtLklSb2xlO1xuXG4gIHByb3RlY3RlZCBub3RpZmljYXRpb25zU2tpcERlc3RpbmF0aW9uVmFsaWRhdGlvbj86IGJvb2xlYW47XG5cbiAgLy8gVE9ETzogcmUtYWRkIG93bmVyc2hpcCBjb250cm9sIHBhcnNpbmcgYmFzZWQgb24gYWNjZXNzIGNvbnRyb2xzXG4gIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXMzL2xpYi9idWNrZXQudHMjTDIzNjNcbiAgLy8gcHJvdGVjdGVkIG9iamVjdE93bmVyc2hpcD86IE9iamVjdE93bmVyc2hpcDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXdzQ29uc3RydWN0UHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oe1xuICAgICAgdmFsaWRhdGU6ICgpID0+IHRoaXMucG9saWN5Py5kb2N1bWVudC52YWxpZGF0ZUZvclJlc291cmNlUG9saWN5KCkgPz8gW10sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHN0YXRlbWVudCB0byB0aGUgcmVzb3VyY2UgcG9saWN5IGZvciBhIHByaW5jaXBhbCAoaS5lLlxuICAgKiBhY2NvdW50L3JvbGUvc2VydmljZSkgdG8gcGVyZm9ybSBhY3Rpb25zIG9uIHRoaXMgYnVja2V0IGFuZC9vciBpdHNcbiAgICogY29udGVudHMuIFVzZSBgYnVja2V0QXJuYCBhbmQgYGFybkZvck9iamVjdHMoa2V5cylgIHRvIG9idGFpbiBBUk5zIGZvclxuICAgKiB0aGlzIGJ1Y2tldCBvciBvYmplY3RzLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIHBvbGljeSBzdGF0ZW1lbnQgbWF5IG9yIG1heSBub3QgYmUgYWRkZWQgdG8gdGhlIHBvbGljeS5cbiAgICogRm9yIGV4YW1wbGUsIHdoZW4gYW4gYElCdWNrZXRgIGlzIGNyZWF0ZWQgZnJvbSBhbiBleGlzdGluZyBidWNrZXQsXG4gICAqIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHRlbGwgd2hldGhlciB0aGUgYnVja2V0IGFscmVhZHkgaGFzIGEgcG9saWN5XG4gICAqIGF0dGFjaGVkLCBsZXQgYWxvbmUgdG8gcmUtdXNlIHRoYXQgcG9saWN5IHRvIGFkZCBtb3JlIHN0YXRlbWVudHMgdG8gaXQuXG4gICAqIFNvIGl0J3Mgc2FmZXN0IHRvIGRvIG5vdGhpbmcgaW4gdGhlc2UgY2FzZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwZXJtaXNzaW9uIHRoZSBwb2xpY3kgc3RhdGVtZW50IHRvIGJlIGFkZGVkIHRvIHRoZSBidWNrZXQnc1xuICAgKiBwb2xpY3kuXG4gICAqIEByZXR1cm5zIG1ldGFkYXRhIGFib3V0IHRoZSBleGVjdXRpb24gb2YgdGhpcyBtZXRob2QuIElmIHRoZSBwb2xpY3lcbiAgICogd2FzIG5vdCBhZGRlZCwgdGhlIHZhbHVlIG9mIGBzdGF0ZW1lbnRBZGRlZGAgd2lsbCBiZSBgZmFsc2VgLiBZb3VcbiAgICogc2hvdWxkIGFsd2F5cyBjaGVjayB0aGlzIHZhbHVlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBvcGVyYXRpb24gd2FzXG4gICAqIGFjdHVhbGx5IGNhcnJpZWQgb3V0LiBPdGhlcndpc2UsIHN5bnRoZXNpcyBhbmQgZGVwbG95IHdpbGwgdGVybWluYXRlXG4gICAqIHNpbGVudGx5LCB3aGljaCBtYXkgYmUgY29uZnVzaW5nLlxuICAgKi9cbiAgcHVibGljIGFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgcGVybWlzc2lvbjogaWFtLlBvbGljeVN0YXRlbWVudCxcbiAgKTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQge1xuICAgIGlmICghdGhpcy5wb2xpY3kgJiYgdGhpcy5hdXRvQ3JlYXRlUG9saWN5KSB7XG4gICAgICB0aGlzLnBvbGljeSA9IG5ldyBCdWNrZXRQb2xpY3kodGhpcywgXCJQb2xpY3lcIiwgeyBidWNrZXQ6IHRoaXMgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucG9saWN5KSB7XG4gICAgICB0aGlzLnBvbGljeS5kb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHBlcm1pc3Npb24pO1xuICAgICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IHRydWUsIHBvbGljeURlcGVuZGFibGU6IHRoaXMucG9saWN5IH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IGZhbHNlIH07XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcmVhZCBwZXJtaXNzaW9ucyBmb3IgdGhpcyBidWNrZXQgYW5kIGl0J3MgY29udGVudHMgdG8gYW4gSUFNXG4gICAqIHByaW5jaXBhbCAoUm9sZS9Hcm91cC9Vc2VyKS5cbiAgICpcbiAgICogSWYgZW5jcnlwdGlvbiBpcyB1c2VkLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUga2V5IHRvIGRlY3J5cHQgdGhlIGNvbnRlbnRzXG4gICAqIG9mIHRoZSBidWNrZXQgd2lsbCBhbHNvIGJlIGdyYW50ZWQgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgcHVibGljIGdyYW50UmVhZChpZGVudGl0eTogaWFtLklHcmFudGFibGUsIG9iamVjdHNLZXlQYXR0ZXJuOiBhbnkgPSBcIipcIikge1xuICAgIHJldHVybiB0aGlzLmdyYW50KFxuICAgICAgaWRlbnRpdHksXG4gICAgICBwZXJtcy5CVUNLRVRfUkVBRF9BQ1RJT05TLFxuICAgICAgcGVybXMuS0VZX1JFQURfQUNUSU9OUyxcbiAgICAgIHRoaXMuYnVja2V0QXJuLFxuICAgICAgdGhpcy5hcm5Gb3JPYmplY3RzKG9iamVjdHNLZXlQYXR0ZXJuKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdyYW50V3JpdGUoXG4gICAgaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLFxuICAgIG9iamVjdHNLZXlQYXR0ZXJuOiBhbnkgPSBcIipcIixcbiAgICBhbGxvd2VkQWN0aW9uUGF0dGVybnM6IHN0cmluZ1tdID0gW10sXG4gICkge1xuICAgIGNvbnN0IGdyYW50ZWRXcml0ZUFjdGlvbnMgPVxuICAgICAgYWxsb3dlZEFjdGlvblBhdHRlcm5zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhbGxvd2VkQWN0aW9uUGF0dGVybnNcbiAgICAgICAgOiB0aGlzLndyaXRlQWN0aW9ucztcbiAgICByZXR1cm4gdGhpcy5ncmFudChcbiAgICAgIGlkZW50aXR5LFxuICAgICAgZ3JhbnRlZFdyaXRlQWN0aW9ucyxcbiAgICAgIHBlcm1zLktFWV9XUklURV9BQ1RJT05TLFxuICAgICAgdGhpcy5idWNrZXRBcm4sXG4gICAgICB0aGlzLmFybkZvck9iamVjdHMob2JqZWN0c0tleVBhdHRlcm4pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHMzOlB1dE9iamVjdCogYW5kIHMzOkFib3J0KiBwZXJtaXNzaW9ucyBmb3IgdGhpcyBidWNrZXQgdG8gYW4gSUFNIHByaW5jaXBhbC5cbiAgICpcbiAgICogSWYgZW5jcnlwdGlvbiBpcyB1c2VkLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUga2V5IHRvIGVuY3J5cHQgdGhlIGNvbnRlbnRzXG4gICAqIG9mIHdyaXR0ZW4gZmlsZXMgd2lsbCBhbHNvIGJlIGdyYW50ZWQgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgcHVibGljIGdyYW50UHV0KGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm46IGFueSA9IFwiKlwiKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoXG4gICAgICBpZGVudGl0eSxcbiAgICAgIHBlcm1zLkJVQ0tFVF9QVVRfQUNUSU9OUyxcbiAgICAgIHBlcm1zLktFWV9XUklURV9BQ1RJT05TLFxuICAgICAgdGhpcy5hcm5Gb3JPYmplY3RzKG9iamVjdHNLZXlQYXR0ZXJuKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdyYW50UHV0QWNsKFxuICAgIGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSxcbiAgICBvYmplY3RzS2V5UGF0dGVybjogc3RyaW5nID0gXCIqXCIsXG4gICkge1xuICAgIHJldHVybiB0aGlzLmdyYW50KFxuICAgICAgaWRlbnRpdHksXG4gICAgICBwZXJtcy5CVUNLRVRfUFVUX0FDTF9BQ1RJT05TLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFybkZvck9iamVjdHMob2JqZWN0c0tleVBhdHRlcm4pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHMzOkRlbGV0ZU9iamVjdCogcGVybWlzc2lvbiB0byBhbiBJQU0gcHJpbmNpcGFsIGZvciBvYmplY3RzXG4gICAqIGluIHRoaXMgYnVja2V0LlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgcHVibGljIGdyYW50RGVsZXRlKGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm46IGFueSA9IFwiKlwiKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoXG4gICAgICBpZGVudGl0eSxcbiAgICAgIHBlcm1zLkJVQ0tFVF9ERUxFVEVfQUNUSU9OUyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hcm5Gb3JPYmplY3RzKG9iamVjdHNLZXlQYXR0ZXJuKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdyYW50UmVhZFdyaXRlKFxuICAgIGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSxcbiAgICBvYmplY3RzS2V5UGF0dGVybjogYW55ID0gXCIqXCIsXG4gICkge1xuICAgIGNvbnN0IGJ1Y2tldEFjdGlvbnMgPSBwZXJtcy5CVUNLRVRfUkVBRF9BQ1RJT05TLmNvbmNhdCh0aGlzLndyaXRlQWN0aW9ucyk7XG4gICAgLy8gd2UgbmVlZCB1bmlxdWUgcGVybWlzc2lvbnMgYmVjYXVzZSBzb21lIHBlcm1pc3Npb25zIGFyZSBjb21tb24gYmV0d2VlbiByZWFkIGFuZCB3cml0ZSBrZXkgYWN0aW9uc1xuICAgIGNvbnN0IGtleUFjdGlvbnMgPSBbXG4gICAgICAuLi5uZXcgU2V0KFsuLi5wZXJtcy5LRVlfUkVBRF9BQ1RJT05TLCAuLi5wZXJtcy5LRVlfV1JJVEVfQUNUSU9OU10pLFxuICAgIF07XG5cbiAgICByZXR1cm4gdGhpcy5ncmFudChcbiAgICAgIGlkZW50aXR5LFxuICAgICAgYnVja2V0QWN0aW9ucyxcbiAgICAgIGtleUFjdGlvbnMsXG4gICAgICB0aGlzLmJ1Y2tldEFybixcbiAgICAgIHRoaXMuYXJuRm9yT2JqZWN0cyhvYmplY3RzS2V5UGF0dGVybiksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRPRE86IGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB0aHJvdWdoIGBwcm9wcy5wdWJsaWNgIGluIGNvbnN0cnVjdG9yLFxuICAvLyBUT0RPOiByZS1hZGQgT2JqZWN0T3duZXJzaGlwIGFuZCBCdWNrZXRBY2Nlc3NDb250cm9sXG4gIC8vIC8qKlxuICAvLyAgKiBBbGxvd3MgdW5yZXN0cmljdGVkIGFjY2VzcyB0byBvYmplY3RzIGZyb20gdGhpcyBidWNrZXQuXG4gIC8vICAqXG4gIC8vICAqIElNUE9SVEFOVDogVGhpcyBwZXJtaXNzaW9uIGFsbG93cyBhbnlvbmUgdG8gcGVyZm9ybSBhY3Rpb25zIG9uIFMzIG9iamVjdHNcbiAgLy8gICogaW4gdGhpcyBidWNrZXQsIHdoaWNoIGlzIHVzZWZ1bCBmb3Igd2hlbiB5b3UgY29uZmlndXJlIHlvdXIgYnVja2V0IGFzIGFcbiAgLy8gICogd2Vic2l0ZSBhbmQgd2FudCBldmVyeW9uZSB0byBiZSBhYmxlIHRvIHJlYWQgb2JqZWN0cyBpbiB0aGUgYnVja2V0IHdpdGhvdXRcbiAgLy8gICogbmVlZGluZyB0byBhdXRoZW50aWNhdGUuXG4gIC8vICAqXG4gIC8vICAqIFdpdGhvdXQgYXJndW1lbnRzLCB0aGlzIG1ldGhvZCB3aWxsIGdyYW50IHJlYWQgKFwiczM6R2V0T2JqZWN0XCIpIGFjY2VzcyB0b1xuICAvLyAgKiBhbGwgb2JqZWN0cyAoXCIqXCIpIGluIHRoZSBidWNrZXQuXG4gIC8vICAqXG4gIC8vICAqIFRoZSBtZXRob2QgcmV0dXJucyB0aGUgYGlhbS5HcmFudGAgb2JqZWN0LCB3aGljaCBjYW4gdGhlbiBiZSBtb2RpZmllZFxuICAvLyAgKiBhcyBuZWVkZWQuIEZvciBleGFtcGxlLCB5b3UgY2FuIGFkZCBhIGNvbmRpdGlvbiB0aGF0IHdpbGwgcmVzdHJpY3QgYWNjZXNzIG9ubHlcbiAgLy8gICogdG8gYW4gSVB2NCByYW5nZSBsaWtlIHRoaXM6XG4gIC8vICAqXG4gIC8vICAqICAgICBjb25zdCBncmFudCA9IGJ1Y2tldC5ncmFudFB1YmxpY0FjY2VzcygpO1xuICAvLyAgKiAgICAgZ3JhbnQucmVzb3VyY2VTdGF0ZW1lbnQhLmFkZENvbmRpdGlvbijigJhJcEFkZHJlc3PigJksIHsg4oCcYXdzOlNvdXJjZUlw4oCdOiDigJw1NC4yNDAuMTQzLjAvMjTigJ0gfSk7XG4gIC8vICAqXG4gIC8vICAqIE5vdGUgdGhhdCBpZiB0aGlzIGBJQnVja2V0YCByZWZlcnMgdG8gYW4gZXhpc3RpbmcgYnVja2V0LCBwb3NzaWJseSBub3RcbiAgLy8gICogbWFuYWdlZCBieSBDbG91ZEZvcm1hdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIGVmZmVjdCwgc2luY2UgaXQnc1xuICAvLyAgKiBpbXBvc3NpYmxlIHRvIG1vZGlmeSB0aGUgcG9saWN5IG9mIGFuIGV4aXN0aW5nIGJ1Y2tldC5cbiAgLy8gICpcbiAgLy8gICogQHBhcmFtIGtleVByZWZpeCB0aGUgcHJlZml4IG9mIFMzIG9iamVjdCBrZXlzIChlLmcuIGBob21lLypgKS4gRGVmYXVsdCBpcyBcIipcIi5cbiAgLy8gICogQHBhcmFtIGFsbG93ZWRBY3Rpb25zIHRoZSBzZXQgb2YgUzMgYWN0aW9ucyB0byBhbGxvdy4gRGVmYXVsdCBpcyBcInMzOkdldE9iamVjdFwiLlxuICAvLyAgKi9cbiAgLy8gcHVibGljIGdyYW50UHVibGljQWNjZXNzKGtleVByZWZpeCA9IFwiKlwiLCAuLi5hbGxvd2VkQWN0aW9uczogc3RyaW5nW10pIHtcbiAgLy8gICBpZiAoIXRoaXMucHVibGljKSB7XG4gIC8vICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiQ2Fubm90IGdyYW50IHB1YmxpYyBhY2Nlc3Mgd2hlbiAncHVibGljJyBpcyBlbmFibGVkXCIsIHRoaXMpO1xuICAvLyAgIH1cbiAgLy8gICAvLyBURE9POiBUaGlzIHNob3VsZCBjcmVhdGUgcHVibGljQWNjZXNzIHJlc291cmNlXG4gIC8vICAgYWxsb3dlZEFjdGlvbnMgPVxuICAvLyAgICAgYWxsb3dlZEFjdGlvbnMubGVuZ3RoID4gMCA/IGFsbG93ZWRBY3Rpb25zIDogW1wiczM6R2V0T2JqZWN0XCJdO1xuXG4gIC8vICAgcmV0dXJuIGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbE9yUmVzb3VyY2Uoe1xuICAvLyAgICAgYWN0aW9uczogYWxsb3dlZEFjdGlvbnMsXG4gIC8vICAgICByZXNvdXJjZUFybnM6IFt0aGlzLmFybkZvck9iamVjdHMoa2V5UHJlZml4KV0sXG4gIC8vICAgICBncmFudGVlOiBuZXcgaWFtLkFueVByaW5jaXBhbCgpLFxuICAvLyAgICAgcmVzb3VyY2U6IHRoaXMsXG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICAvKipcbiAgICogQWRkcyBhIGJ1Y2tldCBub3RpZmljYXRpb24gZXZlbnQgZGVzdGluYXRpb24uXG4gICAqXG4gICAqIFMzIEJ1Y2tldHMgb25seSBzdXBwb3J0IGEgc2luZ2xlIG5vdGlmaWNhdGlvbiBjb25maWd1cmF0aW9uIHJlc291cmNlLlxuICAgKiBEZWNsYXJpbmcgbXVsdGlwbGUgYGF3c19zM19idWNrZXRfbm90aWZpY2F0aW9uYCByZXNvdXJjZXMgdG8gdGhlIHNhbWVcbiAgICogUzMgQnVja2V0IHdpbGwgY2F1c2UgYSBwZXJwZXR1YWwgZGlmZmVyZW5jZSBpbiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIGV2ZW50IG5vdGlmaWNhdGlvbnMgY29uZmlndXJlZFxuICAgKiBmb3IgdGhlIFMzIGJ1Y2tldCBvdXRzaWRlIG9mIHRoaXMgYmVhY29uLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHRyaWdnZXIgdGhlIG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0gZGVzdCBUaGUgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uIChMYW1iZGEsIFNOUyBUb3BpYyBvciBTUVMgUXVldWUpXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXJzIFMzIG9iamVjdCBrZXkgZmlsdGVyIHJ1bGVzIHRvIGRldGVybWluZSB3aGljaCBvYmplY3RzXG4gICAqIHRyaWdnZXIgdGhpcyBldmVudC4gRWFjaCBmaWx0ZXIgbXVzdCBpbmNsdWRlIGEgYHByZWZpeGAgYW5kL29yIGBzdWZmaXhgXG4gICAqIHRoYXQgd2lsbCBiZSBtYXRjaGVkIGFnYWluc3QgdGhlIHMzIG9iamVjdCBrZXkuIFJlZmVyIHRvIHRoZSBTMyBEZXZlbG9wZXIgR3VpZGVcbiAgICogZm9yIGRldGFpbHMgYWJvdXQgYWxsb3dlZCBmaWx0ZXIgcnVsZXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvTm90aWZpY2F0aW9uSG93VG8uaHRtbCNub3RpZmljYXRpb24taG93LXRvLWZpbHRlcmluZ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgICBkZWNsYXJlIGNvbnN0IG15RnVuY3Rpb246IGNvbXB1dGUuRnVuY3Rpb247XG4gICAqICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBzdG9yYWdlLkJ1Y2tldCh0aGlzLCAnTXlCdWNrZXQnKTtcbiAgICogICAgYnVja2V0LmFkZEV2ZW50Tm90aWZpY2F0aW9uKHMzLkV2ZW50VHlwZS5PQkpFQ1RfQ1JFQVRFRCwgbmV3IHMzbi5MYW1iZGFEZXN0aW5hdGlvbihteUZ1bmN0aW9uKSwge3ByZWZpeDogJ2hvbWUvbXl1c2VybmFtZS8qJ30pO1xuICAgKlxuICAgKiBAc2VlXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L05vdGlmaWNhdGlvbkhvd1RvLmh0bWxcbiAgICovXG4gIHB1YmxpYyBhZGRFdmVudE5vdGlmaWNhdGlvbihcbiAgICBldmVudDogRXZlbnRUeXBlLFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApIHtcbiAgICAvLyBUT0RPOiBUaGlzIGJsb2NrcyBhZGRpbmcgbm90aWZpY2F0aW9ucyBvdXRzaWRlIG9mIHRoZSBTdGFjayBvd25pbmcgdGhlIGJ1Y2tldC4uLlxuICAgIC8vIEFXUy1DREsgd29ya3MgYXJvdW5kIHRoaXMgYnkgdXNpbmcgYSBDdXN0b21SZXNvdXJjZSBoYW5kbGVyIChMYW1iZGEgZnVuY3Rpb24pIHdoaWNoIG1vZGlmaWVzXG4gICAgLy8gdGhlIGJ1Y2tldCBwb2xpY3kgaW4gcGxhY2UgKGFuZCBDRk4gZG9lcyBub3QgbWFuYWdlIHRoZSBhY3R1YWwgYnVja2V0IHBvbGljeSwgc28gbm8gdGYgc3RhdGUhKVxuICAgIHRoaXMud2l0aE5vdGlmaWNhdGlvbnMoKG5vdGlmaWNhdGlvbnMpID0+XG4gICAgICBub3RpZmljYXRpb25zLmFkZE5vdGlmaWNhdGlvbihldmVudCwgZGVzdCwgLi4uZmlsdGVycyksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgd2l0aE5vdGlmaWNhdGlvbnMoY2I6IChub3RpZmljYXRpb25zOiBCdWNrZXROb3RpZmljYXRpb25zKSA9PiB2b2lkKSB7XG4gICAgLy8gVE9ETzogVXNlIEN1c3RvbSBSZXNvdXJjZXMgdG8gbWFuYWdlIGJ1Y2tldCBub3RpZmljYXRpb25zIG91dHNpZGUgb2YgdGhlIHN0YWNrXG4gICAgLy8gaGFuZGxlclJvbGU6IHRoaXMubm90aWZpY2F0aW9uc0hhbmRsZXJSb2xlLFxuICAgIGlmICghdGhpcy5ub3RpZmljYXRpb25zKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbnMgPSBuZXcgQnVja2V0Tm90aWZpY2F0aW9ucyh0aGlzLCBcIk5vdGlmaWNhdGlvbnNcIiwge1xuICAgICAgICBidWNrZXQ6IHRoaXMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY2IodGhpcy5ub3RpZmljYXRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIGEgZGVzdGluYXRpb24gdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gYW4gb2JqZWN0IGlzXG4gICAqIGNyZWF0ZWQgaW4gdGhlIGJ1Y2tldC4gVGhpcyBpcyBpZGVudGljYWwgdG8gY2FsbGluZ1xuICAgKiBgb25FdmVudChFdmVudFR5cGUuT0JKRUNUX0NSRUFURUQpYC5cbiAgICpcbiAgICogQHBhcmFtIGRlc3QgVGhlIG5vdGlmaWNhdGlvbiBkZXN0aW5hdGlvbiAoc2VlIG9uRXZlbnQpXG4gICAqIEBwYXJhbSBmaWx0ZXJzIEZpbHRlcnMgKHNlZSBvbkV2ZW50KVxuICAgKi9cbiAgcHVibGljIGFkZE9iamVjdENyZWF0ZWROb3RpZmljYXRpb24oXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICkge1xuICAgIHJldHVybiB0aGlzLmFkZEV2ZW50Tm90aWZpY2F0aW9uKFxuICAgICAgRXZlbnRUeXBlLk9CSkVDVF9DUkVBVEVELFxuICAgICAgZGVzdCxcbiAgICAgIC4uLmZpbHRlcnMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIGEgZGVzdGluYXRpb24gdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gYW4gb2JqZWN0IGlzXG4gICAqIHJlbW92ZWQgZnJvbSB0aGUgYnVja2V0LiBUaGlzIGlzIGlkZW50aWNhbCB0byBjYWxsaW5nXG4gICAqIGBvbkV2ZW50KEV2ZW50VHlwZS5PQkpFQ1RfUkVNT1ZFRClgLlxuICAgKlxuICAgKiBAcGFyYW0gZGVzdCBUaGUgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uIChzZWUgb25FdmVudClcbiAgICogQHBhcmFtIGZpbHRlcnMgRmlsdGVycyAoc2VlIG9uRXZlbnQpXG4gICAqL1xuICBwdWJsaWMgYWRkT2JqZWN0UmVtb3ZlZE5vdGlmaWNhdGlvbihcbiAgICBkZXN0OiBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gICAgLi4uZmlsdGVyczogTm90aWZpY2F0aW9uS2V5RmlsdGVyW11cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRXZlbnROb3RpZmljYXRpb24oXG4gICAgICBFdmVudFR5cGUuT0JKRUNUX1JFTU9WRUQsXG4gICAgICBkZXN0LFxuICAgICAgLi4uZmlsdGVycyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgZXZlbnQgYnJpZGdlIG5vdGlmaWNhdGlvbiwgY2F1c2luZyBhbGwgZXZlbnRzIGJlbG93IHRvIGJlIHNlbnQgdG8gRXZlbnRCcmlkZ2U6XG4gICAqXG4gICAqIC0gT2JqZWN0IERlbGV0ZWQgKERlbGV0ZU9iamVjdClcbiAgICogLSBPYmplY3QgRGVsZXRlZCAoTGlmZWN5Y2xlIGV4cGlyYXRpb24pXG4gICAqIC0gT2JqZWN0IFJlc3RvcmUgSW5pdGlhdGVkXG4gICAqIC0gT2JqZWN0IFJlc3RvcmUgQ29tcGxldGVkXG4gICAqIC0gT2JqZWN0IFJlc3RvcmUgRXhwaXJlZFxuICAgKiAtIE9iamVjdCBTdG9yYWdlIENsYXNzIENoYW5nZWRcbiAgICogLSBPYmplY3QgQWNjZXNzIFRpZXIgQ2hhbmdlZFxuICAgKiAtIE9iamVjdCBBQ0wgVXBkYXRlZFxuICAgKiAtIE9iamVjdCBUYWdzIEFkZGVkXG4gICAqIC0gT2JqZWN0IFRhZ3MgRGVsZXRlZFxuICAgKi9cbiAgcHVibGljIGVuYWJsZUV2ZW50QnJpZGdlTm90aWZpY2F0aW9uKCkge1xuICAgIHRoaXMud2l0aE5vdGlmaWNhdGlvbnMoKG5vdGlmaWNhdGlvbnMpID0+XG4gICAgICBub3RpZmljYXRpb25zLmVuYWJsZUV2ZW50QnJpZGdlTm90aWZpY2F0aW9uKCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ3JhbnQoXG4gICAgZ3JhbnRlZTogaWFtLklHcmFudGFibGUsXG4gICAgYnVja2V0QWN0aW9uczogc3RyaW5nW10sXG4gICAga2V5QWN0aW9uczogc3RyaW5nW10sXG4gICAgcmVzb3VyY2VBcm46IHN0cmluZyxcbiAgICAuLi5vdGhlclJlc291cmNlQXJuczogc3RyaW5nW11cbiAgKSB7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gW3Jlc291cmNlQXJuLCAuLi5vdGhlclJlc291cmNlQXJuc107XG5cbiAgICBjb25zdCByZXQgPSBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWxPclJlc291cmNlKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICBhY3Rpb25zOiBidWNrZXRBY3Rpb25zLFxuICAgICAgcmVzb3VyY2VBcm5zOiByZXNvdXJjZXMsXG4gICAgICByZXNvdXJjZTogdGhpcyxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmVuY3J5cHRpb25LZXkgJiYga2V5QWN0aW9ucyAmJiBrZXlBY3Rpb25zLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50KGdyYW50ZWUsIC4uLmtleUFjdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwcml2YXRlIGdldCB3cml0ZUFjdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4ucGVybXMuQlVDS0VUX0RFTEVURV9BQ1RJT05TLCAuLi5wZXJtcy5CVUNLRVRfUFVUX0FDVElPTlNdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNvdXJjZSB0byB0aGUgYnVja2V0LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BlcnRpZXMgb2YgdGhlIHNvdXJjZSB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBhZGRTb3VyY2UocHJvcHM6IEFkZFNvdXJjZU9wdGlvbnMsIHNvdXJjZUlkPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy52ZXJzaW9uZWQpIHtcbiAgICAgIC8qKlxuICAgICAgICogSWYgeW91IGVuYWJsZSB2ZXJzaW9uaW5nIG9uIGEgYnVja2V0IGZvciB0aGUgZmlyc3QgdGltZSwgaXQgbWlnaHQgdGFrZSB1cCB0byAxNSBtaW51dGVzXG4gICAgICAgKiBmb3IgdGhlIGNoYW5nZSB0byBiZSBmdWxseSBwcm9wYWdhdGVkLiBXZSByZWNvbW1lbmQgdGhhdCB5b3Ugd2FpdCBmb3IgMTUgbWludXRlcyBhZnRlclxuICAgICAgICogZW5hYmxpbmcgdmVyc2lvbmluZyBiZWZvcmUgaXNzdWluZyB3cml0ZSBvcGVyYXRpb25zIChQVVQgb3IgREVMRVRFKSBvbiBvYmplY3RzIGluIHRoZSBidWNrZXQuXG4gICAgICAgKlxuICAgICAgICogV3JpdGUgb3BlcmF0aW9ucyBpc3N1ZWQgYmVmb3JlIHRoaXMgY29udmVyc2lvbiBpcyBjb21wbGV0ZSBtYXkgYXBwbHkgdG8gdW52ZXJzaW9uZWQgb2JqZWN0cy5cbiAgICAgICAqL1xuICAgICAgaWYgKCF0aGlzLnNvdXJjZVNsZWVwKSB7XG4gICAgICAgIHRoaXMuc291cmNlU2xlZXAgPSBuZXcgc2xlZXAuU2xlZXAodGhpcywgXCJWZXJzaW9uaW5nU2xlZXBcIiwge1xuICAgICAgICAgIGNyZWF0ZUR1cmF0aW9uOiBcIjE1bVwiLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaW5kZXhlZFNvdXJjZSA9IHRoaXMuc291cmNlcy5maW5kKFxuICAgICAgKHNvdXJjZUluZGV4KSA9PiBzb3VyY2VJbmRleC5wcm9wcyA9PT0gcHJvcHMsXG4gICAgKTtcbiAgICBpZiAoaW5kZXhlZFNvdXJjZSkge1xuICAgICAgaWYgKHNvdXJjZUlkICYmIHNvdXJjZUlkICE9PSBpbmRleGVkU291cmNlLmlkKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgYER1cGxpY2F0ZSBidWNrZXQgc291cmNlIGZvciAke2luZGV4ZWRTb3VyY2UuaWR9IGFuZCAke3NvdXJjZUlkfS5gLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5kZXhlZFNvdXJjZS5pZDtcbiAgICB9XG4gICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5zb3VyY2VzLmxlbmd0aDtcbiAgICBjb25zdCBpZCA9IHNvdXJjZUlkID8/IGBzb3VyY2UtJHtuZXh0SW5kZXh9YDtcbiAgICAvLyBlbnN1cmUgaWQgKGlmIHByb3ZpZGVkKSBpcyB1bmlxdWUgd2l0aGluIEJ1Y2tldFxuICAgIGlmICh0aGlzLnNvdXJjZXMuc29tZSgoc291cmNlSW5kZXgpID0+IHNvdXJjZUluZGV4LmlkID09PSBpZCkpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBEdXBsaWNhdGUgc291cmNlIGlkICR7aWR9LiBTb3VyY2VJZHMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgQnVja2V0LmAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnNvdXJjZXMucHVzaCh7XG4gICAgICBwcm9wczoge1xuICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgYnVja2V0OiB0aGlzLFxuICAgICAgICBkZXBlbmRzT246IHRoaXMuc291cmNlU2xlZXAgPyBbdGhpcy5zb3VyY2VTbGVlcF0gOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgICAgaWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgcHVibGljIGlzV2Vic2l0ZSgpOiB0aGlzIGlzIHtcbiAgICB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nO1xuICAgIGJ1Y2tldE91dHB1dHM6IHsgd2Vic2l0ZVVybDogc3RyaW5nOyB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nIH07XG4gIH0ge1xuICAgIHJldHVybiB0aGlzLl9pc1dlYnNpdGU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGh0dHBzIFVSTCBvZiBhbiBTMyBvYmplY3QuIFNwZWNpZnkgYHJlZ2lvbmFsOiBmYWxzZWAgYXQgdGhlIG9wdGlvbnNcbiAgICogZm9yIG5vbi1yZWdpb25hbCBVUkxzLiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogLSBgaHR0cHM6Ly9zMy51cy13ZXN0LTEuYW1hem9uYXdzLmNvbS9vbmx5YnVja2V0YFxuICAgKiAtIGBodHRwczovL3MzLnVzLXdlc3QtMS5hbWF6b25hd3MuY29tL2J1Y2tldC9rZXlgXG4gICAqIC0gYGh0dHBzOi8vczMuY24tbm9ydGgtMS5hbWF6b25hd3MuY29tLmNuL2NoaW5hLWJ1Y2tldC9teWtleWBcbiAgICpcbiAgICogQHBhcmFtIGtleSBUaGUgUzMga2V5IG9mIHRoZSBvYmplY3QuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBVUkwgb2YgdGhlXG4gICAqICAgICAgYnVja2V0IGlzIHJldHVybmVkLlxuICAgKiBAcmV0dXJucyBhbiBPYmplY3RTM1VybCB0b2tlblxuICAgKi9cbiAgcHVibGljIHVybEZvck9iamVjdChrZXk/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0YWNrID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3QodGhpcyk7XG4gICAgY29uc3QgcHJlZml4ID0gYGh0dHBzOi8vczMuJHt0aGlzLmVudi5yZWdpb259LiR7c3RhY2sudXJsU3VmZml4fS9gO1xuICAgIGlmICh0eXBlb2Yga2V5ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdGhpcy51cmxKb2luKHByZWZpeCwgdGhpcy5idWNrZXROYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXJsSm9pbihwcmVmaXgsIHRoaXMuYnVja2V0TmFtZSwga2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgUzMgVVJMIG9mIGFuIFMzIG9iamVjdC4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqIC0gYHMzOi8vb25seWJ1Y2tldGBcbiAgICogLSBgczM6Ly9idWNrZXQva2V5YFxuICAgKlxuICAgKiBAcGFyYW0ga2V5IFRoZSBTMyBrZXkgb2YgdGhlIG9iamVjdC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIFMzIFVSTCBvZiB0aGVcbiAgICogICAgICBidWNrZXQgaXMgcmV0dXJuZWQuXG4gICAqIEByZXR1cm5zIGFuIE9iamVjdFMzVXJsIHRva2VuXG4gICAqL1xuICBwdWJsaWMgczNVcmxGb3JPYmplY3Qoa2V5Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcmVmaXggPSBcInMzOi8vXCI7XG4gICAgaWYgKHR5cGVvZiBrZXkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnVybEpvaW4ocHJlZml4LCB0aGlzLmJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51cmxKb2luKHByZWZpeCwgdGhpcy5idWNrZXROYW1lLCBrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gQVJOIHRoYXQgcmVwcmVzZW50cyBhbGwgb2JqZWN0cyB3aXRoaW4gdGhlIGJ1Y2tldCB0aGF0IG1hdGNoXG4gICAqIHRoZSBrZXkgcGF0dGVybiBzcGVjaWZpZWQuIFRvIHJlcHJlc2VudCBhbGwga2V5cywgc3BlY2lmeSBgYFwiKlwiYGAuXG4gICAqXG4gICAqIElmIHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBrZXlQYXR0ZXJuIHdpdGggbXVsdGlwbGUgY29tcG9uZW50cywgY29uY2F0ZW5hdGUgdGhlbSBpbnRvIGEgc2luZ2xlIHN0cmluZywgZS5nLjpcbiAgICpcbiAgICogICBhcm5Gb3JPYmplY3RzKGBob21lLyR7dGVhbX0vJHt1c2VyfS8qYClcbiAgICpcbiAgICovXG4gIHB1YmxpYyBhcm5Gb3JPYmplY3RzKGtleVBhdHRlcm46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVja2V0QXJufS8ke2tleVBhdHRlcm59YDtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE0MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0w5NTNcbiAgcHJpdmF0ZSB1cmxKb2luKC4uLmNvbXBvbmVudHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29tcG9uZW50cy5yZWR1Y2UoKHJlc3VsdCwgY29tcG9uZW50KSA9PiB7XG4gICAgICBpZiAocmVzdWx0LmVuZHNXaXRoKFwiL1wiKSkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbXBvbmVudC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnQuc2xpY2UoMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7cmVzdWx0fS8ke2NvbXBvbmVudH1gO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcmVzb3VyY2UgdG8gdGhlIFRlcnJhZm9ybSBKU09OIG91dHB1dCBhdCBTeW50aCB0aW1lLlxuICAgKlxuICAgKiBjYWxsZWQgYnkgVGVycmFmb3JtU3RhY2sucHJlcGFyZVN0YWNrKClcbiAgICovXG4gIHB1YmxpYyB0b1RlcnJhZm9ybSgpOiBhbnkge1xuICAgIC8qKlxuICAgICAqIEEgcHJlcGFyaW5nIHJlc29sdmUgbWlnaHQgYWRkIG5ldyByZXNvdXJjZXMgdG8gdGhlIHN0YWNrXG4gICAgICpcbiAgICAgKiBzaG91bGQgbm90IGFkZCByZXNvdXJjZXMgaWYgbm8gYnVja2V0IHNvdXJjZXMgYXJlIGRlZmluZWRcbiAgICAgKi9cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zb3VyY2VzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiB0aGlzLnNvdXJjZXMpIHtcbiAgICAgIC8vIFRPRE86IElkZWFsbHkgd2Ugc2hvdWxkIGhhdmUgdXNlZCBJUmVzb2x2YWJsZS5yZXNvbHZlIGFuZCB1c2UgdGhlIElSZXNvbHZlQ29udGV4dC5wcmVwYXJpbmcgZmxhZ1xuICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNzAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtaWFtL2xpYi9wb2xpY3ktZG9jdW1lbnQudHMjTDQ4XG4gICAgICBpZiAodGhpcy5ub2RlLnRyeUZpbmRDaGlsZChzb3VyY2UuaWQpKSBjb250aW51ZTsgLy8gaWdub3JlIGlmIGFscmVhZHkgZ2VuZXJhdGVkXG4gICAgICBuZXcgQnVja2V0U291cmNlKHRoaXMsIHNvdXJjZS5pZCwgc291cmNlLnByb3BzKTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbi8qKlxuICogVGhlIGBCdWNrZXRgIHByb3ZpZGVzIGFuIFtBV1MgUzMgQnVja2V0XShodHRwczovL2F3cy5hbWF6b24uY29tL3MzLykuXG4gKlxuICogYGBgdHNcbiAqIG5ldyBzdG9yYWdlLkJ1Y2tldChzdGFjaywgXCJNeVdlYnNpdGVcIiwge1xuICogICBwYXRoOiBwYXRoLmpvaW4oX19kaXJuYW1lLCBcImRpc3RcIiksXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqICMjIyMgUHVibGljIHJlYWQgYWNjZXNzXG4gKlxuICogRW5hYmxlcyBgcHVibGljYCByZWFkIGFjY2VzcyBmb3IgYWxsIHRoZSBmaWxlcyBpbiB0aGUgYnVja2V0LiBEYW5nZXJvdXMgYW5kXG4gKiByZWNvbW1lbmRlZCB0byB1c2UgZWRnZS5EaXN0cmlidXRpb24gaW5zdGVhZC5cbiAqXG4gKiBVc2VmdWwgZm9yIGhvc3RpbmcgcHVibGljIGZpbGVzIGRpcmVjdGx5IGZyb20gUzMuXG4gKlxuICogYGBgdHNcbiAqIG5ldyBzdG9yYWdlLkJ1Y2tldChcIk15QnVja2V0XCIsIHtcbiAqICAgcHVibGljOiB0cnVlXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEByZXNvdXJjZSBhd3NfczNfYnVja2V0XG4gKiBAdGVycmFjb25zdHJ1Y3Qgc3RvcmFnZS5JQnVja2V0XG4gKi9cblxuZXhwb3J0IGNsYXNzIEJ1Y2tldCBleHRlbmRzIEJ1Y2tldEJhc2UgaW1wbGVtZW50cyBJQnVja2V0IHtcbiAgLy8gVE9ETzogQWRkIHN0YXRpYyBmcm9tTG9va3VwP1xuICBwdWJsaWMgc3RhdGljIGZyb21CdWNrZXROYW1lKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBidWNrZXROYW1lOiBzdHJpbmcsXG4gICk6IElCdWNrZXQge1xuICAgIHJldHVybiBCdWNrZXQuZnJvbUJ1Y2tldEF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7IGJ1Y2tldE5hbWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIEJ1Y2tldCBjb25zdHJ1Y3QgdGhhdCByZXByZXNlbnRzIGFuIGV4dGVybmFsIGJ1Y2tldC5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY3JlYXRpbmcgY29uc3RydWN0ICh1c3VhbGx5IGB0aGlzYCkuXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0J3MgbmFtZS5cbiAgICogQHBhcmFtIGF0dHJzIEEgYEJ1Y2tldEF0dHJpYnV0ZXNgIG9iamVjdC4gQ2FuIGJlIG9idGFpbmVkIGZyb20gYSBjYWxsIHRvXG4gICAqIGBidWNrZXQuZXhwb3J0KClgIG9yIG1hbnVhbGx5IGNyZWF0ZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21CdWNrZXRBdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogQnVja2V0QXR0cmlidXRlcyxcbiAgKTogSUJ1Y2tldCB7XG4gICAgY29uc3Qgc3RhY2sgPSBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdChzY29wZSk7XG4gICAgY29uc3QgcmVnaW9uID0gYXR0cnMucmVnaW9uID8/IHN0YWNrLnJlZ2lvbjtcbiAgICBjb25zdCByZWdpb25JbmZvID0gUmVnaW9uSW5mby5nZXQocmVnaW9uKTtcbiAgICBjb25zdCB1cmxTdWZmaXggPSByZWdpb25JbmZvLmRvbWFpblN1ZmZpeCA/PyBzdGFjay51cmxTdWZmaXg7XG5cbiAgICBjb25zdCBidWNrZXROYW1lID0gcGFyc2VCdWNrZXROYW1lKHNjb3BlLCBhdHRycyk7XG4gICAgaWYgKCFidWNrZXROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiQnVja2V0IG5hbWUgaXMgcmVxdWlyZWRcIiwgc2NvcGUpO1xuICAgIH1cbiAgICBCdWNrZXQudmFsaWRhdGVCdWNrZXROYW1lKGJ1Y2tldE5hbWUsIHRydWUpO1xuXG4gICAgY29uc3QgbmV3RW5kcG9pbnQgPSBgczMtd2Vic2l0ZS4ke3JlZ2lvbn0uJHt1cmxTdWZmaXh9YDtcblxuICAgIGNvbnN0IHN0YXRpY0RvbWFpbkVuZHBvaW50ID1cbiAgICAgIHJlZ2lvbkluZm8uczNTdGF0aWNXZWJzaXRlRW5kcG9pbnQgPz9cbiAgICAgIExhenkuc3RyaW5nVmFsdWUoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PlxuICAgICAgICAgIHN0YWNrLnJlZ2lvbmFsRmFjdChGYWN0TmFtZS5TM19TVEFUSUNfV0VCU0lURV9FTkRQT0lOVCwgbmV3RW5kcG9pbnQpLFxuICAgICAgfSk7XG4gICAgY29uc3Qgd2Vic2l0ZURvbWFpbiA9IGAke2J1Y2tldE5hbWV9LiR7c3RhdGljRG9tYWluRW5kcG9pbnR9YDtcblxuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIEJ1Y2tldEJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGJ1Y2tldE5hbWUgPSBidWNrZXROYW1lITtcbiAgICAgIHB1YmxpYyByZWFkb25seSBidWNrZXRBcm4gPSBwYXJzZUJ1Y2tldEFybihzY29wZSwgYXR0cnMpO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGJ1Y2tldERvbWFpbk5hbWUgPVxuICAgICAgICBhdHRycy5idWNrZXREb21haW5OYW1lIHx8IGAke2J1Y2tldE5hbWV9LnMzLiR7dXJsU3VmZml4fWA7XG4gICAgICAvLyBOT1RFIHByZXZpb3VzIHZlcnNpb25zIGVycm9yOiByZXNvdXJjZS53ZWJzaXRlRG9tYWluIHNob3VsZCBiZSB3ZWJzaXRlRW5kcG9pbnQgKHdpdGhvdXQgaHR0cDovLylcbiAgICAgIC8vIFJlZjogaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tcHJvdmlkZXItYXdzL2Jsb2IvdjYuMC4wL2ludGVybmFsL3NlcnZpY2UvczMvYnVja2V0LmdvI0wxNzA4LUwxNzEyXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgd2Vic2l0ZURvbWFpbk5hbWUgPSBzdGF0aWNEb21haW5FbmRwb2ludDtcbiAgICAgIC8vIFRPRE86IHJlLWFsaWduIHRvIEFXU0NESyBidWNrZXRXZWJzaXRlRG9tYWluTmFtZSAuLi5cbiAgICAgIC8vIGF0dHJzLmJ1Y2tldFdlYnNpdGVVcmxcbiAgICAgIC8vICAgPyBGbi5zZWxlY3QoMiwgRm4uc3BsaXQoXCIvXCIsIGF0dHJzLmJ1Y2tldFdlYnNpdGVVcmwpKSAvLyBkcm9wIGh0dHA6Ly9cbiAgICAgIC8vICAgOiB3ZWJzaXRlRG9tYWluO1xuICAgICAgLy8gVE9ETzogRG9lcyBub3QgZXhpc3QgZm9yIEFXU0NES1xuICAgICAgcHVibGljIHJlYWRvbmx5IHdlYnNpdGVFbmRwb2ludCA9IHdlYnNpdGVEb21haW47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYnVja2V0V2Vic2l0ZVVybCA9XG4gICAgICAgIGF0dHJzLmJ1Y2tldFdlYnNpdGVVcmwgfHwgYGh0dHA6Ly8ke3dlYnNpdGVEb21haW59YDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBidWNrZXRSZWdpb25hbERvbWFpbk5hbWUgPVxuICAgICAgICBhdHRycy5idWNrZXRSZWdpb25hbERvbWFpbk5hbWUgfHxcbiAgICAgICAgYCR7YnVja2V0TmFtZX0uczMuJHtyZWdpb259LiR7dXJsU3VmZml4fWA7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYnVja2V0RHVhbFN0YWNrRG9tYWluTmFtZSA9XG4gICAgICAgIGF0dHJzLmJ1Y2tldER1YWxTdGFja0RvbWFpbk5hbWUgfHxcbiAgICAgICAgYCR7YnVja2V0TmFtZX0uczMuZHVhbHN0YWNrLiR7cmVnaW9ufS4ke3VybFN1ZmZpeH1gO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGVuY3J5cHRpb25LZXkgPSBhdHRycy5lbmNyeXB0aW9uS2V5O1xuXG4gICAgICBwdWJsaWMgZ2V0IGhvc3RlZFpvbmVJZCgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB7IHMzU3RhdGljV2Vic2l0ZUhvc3RlZFpvbmVJZCB9ID0gUmVnaW9uSW5mby5nZXQocmVnaW9uKTtcbiAgICAgICAgaWYgKCFzM1N0YXRpY1dlYnNpdGVIb3N0ZWRab25lSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgICAgYE5vIGhvc3RlZCB6b25lIElEIGZvdW5kIGZvciBTMyBzdGF0aWMgd2Vic2l0ZSBpbiByZWdpb246ICR7cmVnaW9ufWAsXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHMzU3RhdGljV2Vic2l0ZUhvc3RlZFpvbmVJZDtcbiAgICAgIH1cbiAgICAgIHB1YmxpYyByZWFkb25seSBwdWJsaWMgPSBhdHRycy5wdWJsaWMgPz8gZmFsc2U7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbmVkID0gYXR0cnMudmVyc2lvbmVkID8/IGZhbHNlO1xuICAgICAgcHVibGljIHBvbGljeT86IEJ1Y2tldFBvbGljeSA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBvcmlnaW5BY2Nlc3NJZGVudGl0eSA9IGF0dHJzLm9yaWdpbkFjY2Vzc0lkZW50aXR5O1xuICAgICAgcHVibGljIHJlYWRvbmx5IF9pc1dlYnNpdGUgPSAhIWF0dHJzLmlzV2Vic2l0ZTtcbiAgICAgIHByb3RlY3RlZCBhdXRvQ3JlYXRlUG9saWN5ID0gZmFsc2U7XG4gICAgICBwdWJsaWMgaXNXZWJzaXRlKCk6IHRoaXMgaXMge1xuICAgICAgICB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nO1xuICAgICAgICBidWNrZXRPdXRwdXRzOiB7IHdlYnNpdGVVcmw6IHN0cmluZzsgd2Vic2l0ZURvbWFpbk5hbWU6IHN0cmluZyB9O1xuICAgICAgfSB7XG4gICAgICAgIHJldHVybiBhdHRycy5pc1dlYnNpdGUgPz8gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBwcm90ZWN0ZWQgZGlzYWxsb3dQdWJsaWNBY2Nlc3MgPSBmYWxzZTtcbiAgICAgIC8vIHByb3RlY3RlZCBub3RpZmljYXRpb25zSGFuZGxlclJvbGUgPSBhdHRycy5ub3RpZmljYXRpb25zSGFuZGxlclJvbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkLCB7XG4gICAgICBhY2NvdW50OiBhdHRycy5hY2NvdW50LFxuICAgICAgcmVnaW9uOiBhdHRycy5yZWdpb24sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3duIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gYnVja2V0IG5hbWUgaXMgbm90IHZhbGlkLlxuICAgKlxuICAgKiBAcGFyYW0gcGh5c2ljYWxOYW1lIG5hbWUgb2YgdGhlIGJ1Y2tldC5cbiAgICogQHBhcmFtIGFsbG93TGVnYWN5QnVja2V0TmFtaW5nIGFsbG93IGxlZ2FjeSBidWNrZXQgbmFtaW5nIHN0eWxlLCBkZWZhdWx0IGlzIGZhbHNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2YWxpZGF0ZUJ1Y2tldE5hbWUoXG4gICAgcGh5c2ljYWxOYW1lOiBzdHJpbmcsXG4gICAgYWxsb3dMZWdhY3lCdWNrZXROYW1pbmc6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgYnVja2V0TmFtZSA9IHBoeXNpY2FsTmFtZTtcbiAgICBpZiAoIWJ1Y2tldE5hbWUgfHwgVG9rZW4uaXNVbnJlc29sdmVkKGJ1Y2tldE5hbWUpKSB7XG4gICAgICAvLyB0aGUgbmFtZSBpcyBhIGxhdGUtYm91bmQgdmFsdWUsIG5vdCBhIGRlZmluZWQgc3RyaW5nLFxuICAgICAgLy8gc28gc2tpcCB2YWxpZGF0aW9uXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gUnVsZXMgY29kaWZpZWQgZnJvbSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9CdWNrZXRSZXN0cmljdGlvbnMuaHRtbFxuICAgIGlmIChidWNrZXROYW1lLmxlbmd0aCA8IDMgfHwgYnVja2V0TmFtZS5sZW5ndGggPiA2Mykge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIFwiQnVja2V0IG5hbWUgbXVzdCBiZSBhdCBsZWFzdCAzIGFuZCBubyBtb3JlIHRoYW4gNjMgY2hhcmFjdGVyc1wiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbGxlZ2FsQ2hhcnNldFJlZ0V4ID0gYWxsb3dMZWdhY3lCdWNrZXROYW1pbmdcbiAgICAgID8gL1teQS1aYS16MC05Ll8tXS9cbiAgICAgIDogL1teYS16MC05Li1dLztcbiAgICBjb25zdCBhbGxvd2VkRWRnZUNoYXJzZXRSZWdFeCA9IGFsbG93TGVnYWN5QnVja2V0TmFtaW5nXG4gICAgICA/IC9bQS1aYS16MC05XS9cbiAgICAgIDogL1thLXowLTldLztcblxuICAgIGNvbnN0IGlsbGVnYWxDaGFyTWF0Y2ggPSBidWNrZXROYW1lLm1hdGNoKGlsbGVnYWxDaGFyc2V0UmVnRXgpO1xuICAgIGlmIChpbGxlZ2FsQ2hhck1hdGNoKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgYWxsb3dMZWdhY3lCdWNrZXROYW1pbmdcbiAgICAgICAgICA/IFwiQnVja2V0IG5hbWUgbXVzdCBvbmx5IGNvbnRhaW4gdXBwZXJjYXNlIG9yIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIGFuZCB0aGUgc3ltYm9scywgcGVyaW9kICguKSwgdW5kZXJzY29yZSAoXyksIGFuZCBkYXNoICgtKVwiXG4gICAgICAgICAgOiBcIkJ1Y2tldCBuYW1lIG11c3Qgb25seSBjb250YWluIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIGFuZCB0aGUgc3ltYm9scywgcGVyaW9kICguKSBhbmQgZGFzaCAoLSlcIiArXG4gICAgICAgICAgICAgIGAgKG9mZnNldDogJHtpbGxlZ2FsQ2hhck1hdGNoLmluZGV4fSlgLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFhbGxvd2VkRWRnZUNoYXJzZXRSZWdFeC50ZXN0KGJ1Y2tldE5hbWUuY2hhckF0KDApKSkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIGFsbG93TGVnYWN5QnVja2V0TmFtaW5nXG4gICAgICAgICAgPyBcIkJ1Y2tldCBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UsIGxvd2VyY2FzZSBjaGFyYWN0ZXIgb3IgbnVtYmVyXCJcbiAgICAgICAgICA6IFwiQnVja2V0IG5hbWUgbXVzdCBzdGFydCB3aXRoIGEgbG93ZXJjYXNlIGNoYXJhY3RlciBvciBudW1iZXJcIiArXG4gICAgICAgICAgICAgIFwiIChvZmZzZXQ6IDApXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhYWxsb3dlZEVkZ2VDaGFyc2V0UmVnRXgudGVzdChidWNrZXROYW1lLmNoYXJBdChidWNrZXROYW1lLmxlbmd0aCAtIDEpKVxuICAgICkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIGFsbG93TGVnYWN5QnVja2V0TmFtaW5nXG4gICAgICAgICAgPyBcIkJ1Y2tldCBuYW1lIG11c3QgZW5kIHdpdGggYW4gdXBwZXJjYXNlLCBsb3dlcmNhc2UgY2hhcmFjdGVyIG9yIG51bWJlclwiXG4gICAgICAgICAgOiBcIkJ1Y2tldCBuYW1lIG11c3QgZW5kIHdpdGggYSBsb3dlcmNhc2UgY2hhcmFjdGVyIG9yIG51bWJlclwiICtcbiAgICAgICAgICAgICAgYCAob2Zmc2V0OiAke2J1Y2tldE5hbWUubGVuZ3RoIC0gMX0pYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uc2VjU3ltYm9sTWF0Y2ggPSBidWNrZXROYW1lLm1hdGNoKC9cXC4tfC1cXC58XFwuXFwuLyk7XG4gICAgaWYgKGNvbnNlY1N5bWJvbE1hdGNoKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgXCJCdWNrZXQgbmFtZSBtdXN0IG5vdCBoYXZlIGRhc2ggbmV4dCB0byBwZXJpb2QsIG9yIHBlcmlvZCBuZXh0IHRvIGRhc2gsIG9yIGNvbnNlY3V0aXZlIHBlcmlvZHNcIiArXG4gICAgICAgICAgYCAob2Zmc2V0OiAke2NvbnNlY1N5bWJvbE1hdGNoLmluZGV4fSlgLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKC9eXFxkezEsM31cXC5cXGR7MSwzfVxcLlxcZHsxLDN9XFwuXFxkezEsM30kLy50ZXN0KGJ1Y2tldE5hbWUpKSB7XG4gICAgICBlcnJvcnMucHVzaChcIkJ1Y2tldCBuYW1lIG11c3Qgbm90IHJlc2VtYmxlIGFuIElQIGFkZHJlc3NcIik7XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIFMzIGJ1Y2tldCBuYW1lICh2YWx1ZTogJHtidWNrZXROYW1lfSkke0VPTH0ke2Vycm9ycy5qb2luKEVPTCl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc291cmNlOlxuICAgIHwgczNCdWNrZXQuUzNCdWNrZXRcbiAgICB8IGRhdGFBd3NTM0J1Y2tldC5EYXRhQXdzUzNCdWNrZXQ7XG4gIHByb3RlY3RlZCByZWFkb25seSB3ZWJzaXRlQ29uZmlnPzogczNCdWNrZXRXZWJzaXRlQ29uZmlndXJhdGlvbi5TM0J1Y2tldFdlYnNpdGVDb25maWd1cmF0aW9uO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29yc0NvbmZpZz86IHMzQnVja2V0Q29yc0NvbmZpZ3VyYXRpb24uUzNCdWNrZXRDb3JzQ29uZmlndXJhdGlvbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9yaWdpbkFjY2Vzc0lkZW50aXR5PzogT3JpZ2luQWNjZXNzSWRlbnRpdHk7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2lzV2Vic2l0ZTogYm9vbGVhbjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF92ZXJzaW9uZWQ6IGJvb2xlYW47XG5cbiAgcHVibGljIGdldCBidWNrZXRBcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5hcm47XG4gIH1cbiAgcHVibGljIGdldCBidWNrZXROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2UuYnVja2V0O1xuICB9XG4gIHB1YmxpYyBnZXQgYnVja2V0RG9tYWluTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLmJ1Y2tldERvbWFpbk5hbWU7XG4gIH1cbiAgcHVibGljIGdldCBidWNrZXRSZWdpb25hbERvbWFpbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5idWNrZXRSZWdpb25hbERvbWFpbk5hbWU7XG4gIH1cbiAgcHVibGljIGdldCB3ZWJzaXRlRG9tYWluTmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLndlYnNpdGVDb25maWc/LndlYnNpdGVEb21haW47XG4gIH1cbiAgcHVibGljIGdldCB3ZWJzaXRlRW5kcG9pbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy53ZWJzaXRlQ29uZmlnPy53ZWJzaXRlRW5kcG9pbnQ7XG4gIH1cbiAgcHVibGljIGdldCB2ZXJzaW9uZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb25lZDtcbiAgfVxuICBwdWJsaWMgZ2V0IGhvc3RlZFpvbmVJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLmhvc3RlZFpvbmVJZDtcbiAgfVxuXG4gIHB1YmxpYyBwb2xpY3k/OiBCdWNrZXRQb2xpY3k7XG4gIHByb3RlY3RlZCBhdXRvQ3JlYXRlUG9saWN5ID0gdHJ1ZTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnVja2V0IGlzIHB1YmxpYyBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHVibGljPzogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudEJyaWRnZUVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIG5hbWU6IHN0cmluZywgcHJvcHM6IEJ1Y2tldFByb3BzID0ge30pIHtcbiAgICBzdXBlcihzY29wZSwgbmFtZSwgcHJvcHMpO1xuXG4gICAgY29uc3QgeyBidWNrZXRFbmNyeXB0aW9uLCBlbmNyeXB0aW9uS2V5IH0gPSB0aGlzLnBhcnNlRW5jcnlwdGlvbihwcm9wcyk7XG4gICAgY29uc3QgeyB3ZWJzaXRlQ29uZmlnLCBjb3JzQ29uZmlnLCBjbG91ZGZyb250QWNjZXNzIH0gPSBwcm9wcztcbiAgICB0aGlzLl9pc1dlYnNpdGUgPSBmYWxzZTtcblxuICAgIGlmIChwcm9wcy5idWNrZXROYW1lICYmIHByb3BzLm5hbWVQcmVmaXgpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IHNwZWNpZnkgYm90aCAnYnVja2V0TmFtZScgYW5kICduYW1lUHJlZml4Jy4gVXNlIG9ubHkgb25lLlwiLFxuICAgICAgICBzY29wZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGJ1Y2tldFByZWZpeDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghcHJvcHMuYnVja2V0TmFtZSkge1xuICAgICAgLy8gQnVja2V0IG5hbWVzIG11c3QgYmUgbG93ZXJjYXNlIGFuZCBiZXR3ZWVuIDMgKG1pbikgYW5kIDYzIChtYXgpIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgIGJ1Y2tldFByZWZpeCA9IHRoaXMuc3RhY2sudW5pcXVlUmVzb3VyY2VOYW1lUHJlZml4KHRoaXMsIHtcbiAgICAgICAgcHJlZml4OiAocHJvcHMubmFtZVByZWZpeCA/PyB0aGlzLmdyaWRVVUlEKSArIFwiLVwiLFxuICAgICAgICBsb3dlckNhc2U6IHRydWUsXG4gICAgICAgIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogXCIuLVwiLFxuICAgICAgICBtYXhMZW5ndGg6IDYzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBzM0J1Y2tldC5TM0J1Y2tldCh0aGlzLCBcIlJlc291cmNlXCIsIHtcbiAgICAgIGJ1Y2tldDogcHJvcHMuYnVja2V0TmFtZSxcbiAgICAgIGZvcmNlRGVzdHJveTogcHJvcHMuZm9yY2VEZXN0cm95LFxuICAgICAgYnVja2V0UHJlZml4LFxuICAgIH0pO1xuXG4gICAgdGhpcy5fdmVyc2lvbmVkID0gcHJvcHMudmVyc2lvbmVkID8/IGZhbHNlO1xuICAgIGlmICh0aGlzLl92ZXJzaW9uZWQpIHtcbiAgICAgIG5ldyBzM0J1Y2tldFZlcnNpb25pbmcuUzNCdWNrZXRWZXJzaW9uaW5nQSh0aGlzLCBcIlZlcnNpb25pbmdcIiwge1xuICAgICAgICBidWNrZXQ6IHRoaXMucmVzb3VyY2UuYnVja2V0LFxuICAgICAgICB2ZXJzaW9uaW5nQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgIHN0YXR1czogdGhpcy5fdmVyc2lvbmVkID8gXCJFbmFibGVkXCIgOiBcIlN1c3BlbmRlZFwiLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuZXZlbnRCcmlkZ2VFbmFibGVkID0gcHJvcHMuZXZlbnRCcmlkZ2VFbmFibGVkO1xuXG4gICAgaWYgKHByb3BzLnNvdXJjZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMuc291cmNlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aGlzLmFkZFNvdXJjZSh7IHBhdGg6IHByb3BzLnNvdXJjZXMgfSk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMuc291cmNlcykpIHtcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2VQcm9wcyBvZiBwcm9wcy5zb3VyY2VzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2VQcm9wcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5hZGRTb3VyY2UoeyBwYXRoOiBzb3VyY2VQcm9wcyB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hZGRTb3VyY2Uoc291cmNlUHJvcHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcm9wcy5saWZlY3ljbGVSdWxlcykge1xuICAgICAgbmV3IHMzQnVja2V0TGlmZWN5Y2xlQ29uZmlndXJhdGlvbi5TM0J1Y2tldExpZmVjeWNsZUNvbmZpZ3VyYXRpb24oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiTGlmZUN5Y2xlQ29uZmlnXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBidWNrZXQ6IHRoaXMucmVzb3VyY2UuYnVja2V0LFxuICAgICAgICAgIHJ1bGU6IHByb3BzLmxpZmVjeWNsZVJ1bGVzLm1hcCgocnVsZSkgPT4gKHtcbiAgICAgICAgICAgIC4uLnJ1bGUsXG4gICAgICAgICAgICBzdGF0dXM6IHJ1bGUuZW5hYmxlZCA/IFwiRW5hYmxlZFwiIDogXCJEaXNhYmxlZFwiLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRW5mb3JjZSBBV1MgRm91bmRhdGlvbmFsIFNlY3VyaXR5IEJlc3QgUHJhY3RpY2VcbiAgICBpZiAocHJvcHMuZW5mb3JjZVNTTCkge1xuICAgICAgdGhpcy5lbmZvcmNlU1NMU3RhdGVtZW50KCk7XG4gICAgICB0aGlzLm1pbmltdW1UTFNWZXJzaW9uU3RhdGVtZW50KHByb3BzLm1pbmltdW1UTFNWZXJzaW9uKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLm1pbmltdW1UTFNWZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIidlbmZvcmNlU1NMJyBtdXN0IGJlIGVuYWJsZWQgZm9yICdtaW5pbXVtVExTVmVyc2lvbicgdG8gYmUgYXBwbGllZFwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAod2Vic2l0ZUNvbmZpZyAmJiB3ZWJzaXRlQ29uZmlnLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuX2lzV2Vic2l0ZSA9IHRydWU7XG4gICAgICB0aGlzLndlYnNpdGVDb25maWcgPVxuICAgICAgICBuZXcgczNCdWNrZXRXZWJzaXRlQ29uZmlndXJhdGlvbi5TM0J1Y2tldFdlYnNpdGVDb25maWd1cmF0aW9uKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJXZWJzaXRlQ29uZmlnXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYnVja2V0OiB0aGlzLnJlc291cmNlLmJ1Y2tldCxcbiAgICAgICAgICAgIC4uLndlYnNpdGVDb25maWcsXG4gICAgICAgICAgICBpbmRleERvY3VtZW50OiB3ZWJzaXRlQ29uZmlnPy5pbmRleERvY3VtZW50XG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgc3VmZml4OiB3ZWJzaXRlQ29uZmlnLmluZGV4RG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgIHN1ZmZpeDogXCJpbmRleC5odG1sXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHRoaXMucHVibGljID0gcHJvcHMucHVibGljID8/IGZhbHNlO1xuICAgIGlmICh0aGlzLnB1YmxpYykge1xuICAgICAgLy8gVE9ETzogc3dpdGNoIHRvIExhenkgY29uZmlnIHVzaW5nIFwiZ3JhbnRQdWJsaWNBY2Nlc3NcIiBtZWNoYW5pc20gaW5zdGVhZD9cbiAgICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXMzL2xpYi9idWNrZXQudHMjTDg1MFxuICAgICAgY29uc3Qgb3duZXJzaGlwQ29udHJvbHMgPVxuICAgICAgICBuZXcgczNCdWNrZXRPd25lcnNoaXBDb250cm9scy5TM0J1Y2tldE93bmVyc2hpcENvbnRyb2xzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJPd25lcnNoaXBDb250cm9sc1wiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5yZXNvdXJjZS5idWNrZXQsXG4gICAgICAgICAgICBydWxlOiB7XG4gICAgICAgICAgICAgIG9iamVjdE93bmVyc2hpcDogXCJCdWNrZXRPd25lclByZWZlcnJlZFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgY29uc3QgcHVibGljQWNjZXNzQmxvY2sgPVxuICAgICAgICBuZXcgczNCdWNrZXRQdWJsaWNBY2Nlc3NCbG9jay5TM0J1Y2tldFB1YmxpY0FjY2Vzc0Jsb2NrKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJQdWJsaWNBY2Nlc3NCbG9ja1wiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5yZXNvdXJjZS5idWNrZXQsXG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjbHM6IGZhbHNlLFxuICAgICAgICAgICAgYmxvY2tQdWJsaWNQb2xpY3k6IGZhbHNlLFxuICAgICAgICAgICAgaWdub3JlUHVibGljQWNsczogZmFsc2UsXG4gICAgICAgICAgICByZXN0cmljdFB1YmxpY0J1Y2tldHM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICBuZXcgczNCdWNrZXRBY2wuUzNCdWNrZXRBY2wodGhpcywgXCJQdWJsaWNBY2xcIiwge1xuICAgICAgICBidWNrZXQ6IHRoaXMucmVzb3VyY2UuYnVja2V0LFxuICAgICAgICBhY2w6IFwicHVibGljLXJlYWRcIixcbiAgICAgICAgZGVwZW5kc09uOiBbb3duZXJzaGlwQ29udHJvbHMsIHB1YmxpY0FjY2Vzc0Jsb2NrXSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgcmVzb3VyY2VzOiBbdGhpcy5hcm5Gb3JPYmplY3RzKFwiKlwiKV0sXG4gICAgICAgICAgYWN0aW9uczogW1wiczM6R2V0T2JqZWN0XCJdLFxuICAgICAgICAgIHByaW5jaXBhbHM6IFtuZXcgaWFtLkFueVByaW5jaXBhbCgpXSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgLy8gLy8gcG9saWN5IGRlcGVuZHMgb24gcHVibGljIGFjY2VzcyBibG9jaz9cbiAgICAgIC8vIC8vIGlzIHRoaXMgbmVlZGVkP1xuICAgICAgLy8gaWYgKHBvbGljeURlcGVuZGFibGUgJiYgcG9saWN5RGVwZW5kYWJsZSBpbnN0YW5jZW9mIENvbnN0cnVjdCkge1xuICAgICAgLy8gICBwb2xpY3lEZXBlbmRhYmxlLm5vZGUuYWRkRGVwZW5kZW5jeShwdWJsaWNBY2Nlc3NCbG9jayk7XG4gICAgICAvLyB9XG4gICAgfVxuXG4gICAgaWYgKGNvcnNDb25maWcpIHtcbiAgICAgIHRoaXMuY29yc0NvbmZpZyA9IG5ldyBzM0J1Y2tldENvcnNDb25maWd1cmF0aW9uLlMzQnVja2V0Q29yc0NvbmZpZ3VyYXRpb24oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiQ29yc0NvbmZpZ1wiLFxuICAgICAgICB7XG4gICAgICAgICAgYnVja2V0OiB0aGlzLnJlc291cmNlLmJ1Y2tldCxcbiAgICAgICAgICAuLi5jb3JzQ29uZmlnLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY2xvdWRmcm9udEFjY2Vzcz8uZW5hYmxlZCkge1xuICAgICAgY29uc3Qgb2FpID0gbmV3IE9yaWdpbkFjY2Vzc0lkZW50aXR5KHRoaXMsIFwiT3JpZ2luQWNjZXNzSWRlbnRpdHlcIiwge1xuICAgICAgICBjb21tZW50OiBgT0FJIGZvciAke3RoaXMucmVzb3VyY2UuYnVja2V0fWAsXG4gICAgICB9KTtcbiAgICAgIHRoaXMub3JpZ2luQWNjZXNzSWRlbnRpdHkgPSBvYWk7XG4gICAgICBjb25zdCByZXNvdXJjZXMgPSAoY2xvdWRmcm9udEFjY2Vzcy5rZXlQYXR0ZXJucyA/PyBbXCIqXCJdKS5tYXAoXG4gICAgICAgIChrZXlQYXR0ZXJuKSA9PiB0aGlzLmFybkZvck9iamVjdHMoa2V5UGF0dGVybiksXG4gICAgICApO1xuICAgICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgIGFjdGlvbnM6IFtcInMzOkdldE9iamVjdFwiXSxcbiAgICAgICAgICBwcmluY2lwYWxzOiBbb2FpLmdyYW50UHJpbmNpcGFsXSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmV2ZW50QnJpZGdlRW5hYmxlZCkge1xuICAgICAgdGhpcy5lbmFibGVFdmVudEJyaWRnZU5vdGlmaWNhdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBlbmNyeXB0aW9uS2V5O1xuICAgIGlmIChidWNrZXRFbmNyeXB0aW9uKSB7XG4gICAgICBuZXcgczNCdWNrZXRTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24uUzNCdWNrZXRTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb25BKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIkVuY3J5cHRpb25cIixcbiAgICAgICAge1xuICAgICAgICAgIGJ1Y2tldDogdGhpcy5yZXNvdXJjZS5idWNrZXQsXG4gICAgICAgICAgLi4uYnVja2V0RW5jcnlwdGlvbixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCBrZXkgcHJvcGVydGllcyBhbmQgcmV0dXJuIHRoZSBCdWNrZXQgZW5jcnlwdGlvbiBwcm9wZXJ0eSBmcm9tIHRoZVxuICAgKiB1c2VyJ3MgY29uZmlndXJhdGlvbiwgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgdGFibGU6XG4gICAqXG4gICAqIHwgcHJvcHMuZW5jcnlwdGlvbiB8IHByb3BzLmVuY3J5cHRpb25LZXkgfCBwcm9wcy5idWNrZXRLZXlFbmFibGVkIHwgYnVja2V0RW5jcnlwdGlvbiAocmV0dXJuIHZhbHVlKSB8IGVuY3J5cHRpb25LZXkgKHJldHVybiB2YWx1ZSkgfFxuICAgKiB8LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgICogfCB1bmRlZmluZWQgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgVU5FTkNSWVBURUQgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgfCBmYWxzZSAgICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IHVuZGVmaW5lZCAgICAgICAgfCBrICAgICAgICAgICAgICAgICAgIHwgZSAgICAgICAgICAgICAgICAgICAgICB8IFNTRS1LTVMsIGJ1Y2tldEtleUVuYWJsZWQgPSBlICAgfCBrICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBLTVMgICAgICAgICAgICAgIHwgayAgICAgICAgICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCBTU0UtS01TLCBidWNrZXRLZXlFbmFibGVkID0gZSAgIHwgayAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgS01TICAgICAgICAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgfCBlICAgICAgICAgICAgICAgICAgICAgIHwgU1NFLUtNUywgYnVja2V0S2V5RW5hYmxlZCA9IGUgICB8IG5ldyBrZXkgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IEtNU19NQU5BR0VEICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgIHwgZSAgICAgICAgICAgICAgICAgICAgICB8IFNTRS1LTVMsIGJ1Y2tldEtleUVuYWJsZWQgPSBlICAgfCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBTM19NQU5BR0VEICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICB8IGZhbHNlICAgICAgICAgICAgICAgICAgfCBTU0UtUzMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgUzNfTUFOQUdFRCAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgfCBlICAgICAgICAgICAgICAgICAgICAgIHwgU1NFLVMzLCBidWNrZXRLZXlFbmFibGVkID0gZSAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IFVORU5DUllQVEVEICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgIHwgdHJ1ZSAgICAgICAgICAgICAgICAgICB8IEVSUk9SISAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBVTkVOQ1JZUFRFRCAgICAgIHwgayAgICAgICAgICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1IhICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgS01TX01BTkFHRUQgICAgICB8IGsgICAgICAgICAgICAgICAgICAgfCBlICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1IhICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVSUk9SISAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IFMzX01BTkFHRUQgICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgIHwgdHJ1ZSAgICAgICAgICAgICAgICAgICB8IEVSUk9SISAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBTM19NQU5BR0VEICAgICAgIHwgayAgICAgICAgICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1IhICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqL1xuICBwcml2YXRlIHBhcnNlRW5jcnlwdGlvbihwcm9wczogQnVja2V0UHJvcHMpOiB7XG4gICAgYnVja2V0RW5jcnlwdGlvbj86IE9taXQ8XG4gICAgICBzM0J1Y2tldFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbi5TM0J1Y2tldFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbkFDb25maWcsXG4gICAgICBcImJ1Y2tldFwiXG4gICAgPjtcbiAgICBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG4gIH0ge1xuICAgIC8vIGRlZmF1bHQgYmFzZWQgb24gd2hldGhlciBlbmNyeXB0aW9uS2V5IGlzIHNwZWNpZmllZFxuICAgIGxldCBlbmNyeXB0aW9uVHlwZSA9IHByb3BzLmVuY3J5cHRpb247XG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVuY3J5cHRpb25UeXBlID0gcHJvcHMuZW5jcnlwdGlvbktleVxuICAgICAgICA/IEJ1Y2tldEVuY3J5cHRpb24uS01TXG4gICAgICAgIDogQnVja2V0RW5jcnlwdGlvbi5VTkVOQ1JZUFRFRDtcbiAgICB9XG5cbiAgICAvLyBpZiBlbmNyeXB0aW9uIGtleSBpcyBzZXQsIGVuY3J5cHRpb24gbXVzdCBiZSBzZXQgdG8gS01TIG9yIERTU0UuXG4gICAgaWYgKFxuICAgICAgZW5jcnlwdGlvblR5cGUgIT09IEJ1Y2tldEVuY3J5cHRpb24uRFNTRSAmJlxuICAgICAgZW5jcnlwdGlvblR5cGUgIT09IEJ1Y2tldEVuY3J5cHRpb24uS01TICYmXG4gICAgICBwcm9wcy5lbmNyeXB0aW9uS2V5XG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgZW5jcnlwdGlvbktleSBpcyBzcGVjaWZpZWQsIHNvICdlbmNyeXB0aW9uJyBtdXN0IGJlIHNldCB0byBLTVMgb3IgRFNTRSAodmFsdWU6ICR7ZW5jcnlwdGlvblR5cGV9KWAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGlmIGJ1Y2tldEtleUVuYWJsZWQgaXMgc2V0LCBlbmNyeXB0aW9uIGNhbiBub3QgYmUgQnVja2V0RW5jcnlwdGlvbi5VTkVOQ1JZUFRFRFxuICAgIGlmIChcbiAgICAgIHByb3BzLmJ1Y2tldEtleUVuYWJsZWQgJiZcbiAgICAgIGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLlVORU5DUllQVEVEXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgYnVja2V0S2V5RW5hYmxlZCBpcyBzcGVjaWZpZWQsIHNvICdlbmNyeXB0aW9uJyBtdXN0IGJlIHNldCB0byBLTVMsIERTU0Ugb3IgUzMgKHZhbHVlOiAke2VuY3J5cHRpb25UeXBlfSlgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZW5jcnlwdGlvblR5cGUgPT09IEJ1Y2tldEVuY3J5cHRpb24uVU5FTkNSWVBURUQpIHtcbiAgICAgIHJldHVybiB7IGJ1Y2tldEVuY3J5cHRpb246IHVuZGVmaW5lZCwgZW5jcnlwdGlvbktleTogdW5kZWZpbmVkIH07XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLktNUykge1xuICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9XG4gICAgICAgIHByb3BzLmVuY3J5cHRpb25LZXkgfHxcbiAgICAgICAgbmV3IGttcy5LZXkodGhpcywgXCJLZXlcIiwge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQ3JlYXRlZCBieSAke3RoaXMubm9kZS5wYXRofWAsXG4gICAgICAgICAgZW5hYmxlS2V5Um90YXRpb246IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgYnVja2V0RW5jcnlwdGlvbjoge1xuICAgICAgICAgIC8vIChPcHRpb25hbCkgQWNjb3VudCBJRCBvZiB0aGUgZXhwZWN0ZWQgYnVja2V0IG93bmVyLlxuICAgICAgICAgIC8vIGV4cGVjdGVkQnVja2V0T3duZXJcbiAgICAgICAgICBydWxlOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGJ1Y2tldEtleUVuYWJsZWQ6IHByb3BzLmJ1Y2tldEtleUVuYWJsZWQsXG4gICAgICAgICAgICAgIGFwcGx5U2VydmVyU2lkZUVuY3J5cHRpb25CeURlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBzc2VBbGdvcml0aG06IFwiYXdzOmttc1wiLFxuICAgICAgICAgICAgICAgIGttc01hc3RlcktleUlkOiBlbmNyeXB0aW9uS2V5LmtleUFybixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJ1Y2tldEVuY3J5cHRpb246IHtcbiAgICAgICAgICAvLyAoT3B0aW9uYWwpIEFjY291bnQgSUQgb2YgdGhlIGV4cGVjdGVkIGJ1Y2tldCBvd25lci5cbiAgICAgICAgICAvLyBleHBlY3RlZEJ1Y2tldE93bmVyXG4gICAgICAgICAgcnVsZTogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBidWNrZXRLZXlFbmFibGVkOiBwcm9wcy5idWNrZXRLZXlFbmFibGVkLFxuICAgICAgICAgICAgICBhcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7IHNzZUFsZ29yaXRobTogXCJBRVMyNTZcIiB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZW5jcnlwdGlvblR5cGUgPT09IEJ1Y2tldEVuY3J5cHRpb24uS01TX01BTkFHRUQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJ1Y2tldEVuY3J5cHRpb246IHtcbiAgICAgICAgICAvLyAoT3B0aW9uYWwpIEFjY291bnQgSUQgb2YgdGhlIGV4cGVjdGVkIGJ1Y2tldCBvd25lci5cbiAgICAgICAgICAvLyBleHBlY3RlZEJ1Y2tldE93bmVyXG4gICAgICAgICAgcnVsZTogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBidWNrZXRLZXlFbmFibGVkOiBwcm9wcy5idWNrZXRLZXlFbmFibGVkLFxuICAgICAgICAgICAgICBhcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7IHNzZUFsZ29yaXRobTogXCJhd3M6a21zXCIgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLkRTU0UpIHtcbiAgICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPVxuICAgICAgICBwcm9wcy5lbmNyeXB0aW9uS2V5IHx8XG4gICAgICAgIG5ldyBrbXMuS2V5KHRoaXMsIFwiS2V5XCIsIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYENyZWF0ZWQgYnkgJHt0aGlzLm5vZGUucGF0aH1gLFxuICAgICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIGJ1Y2tldEVuY3J5cHRpb246IHtcbiAgICAgICAgICAvLyAoT3B0aW9uYWwpIEFjY291bnQgSUQgb2YgdGhlIGV4cGVjdGVkIGJ1Y2tldCBvd25lci5cbiAgICAgICAgICAvLyBleHBlY3RlZEJ1Y2tldE93bmVyXG4gICAgICAgICAgcnVsZTogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBidWNrZXRLZXlFbmFibGVkOiBwcm9wcy5idWNrZXRLZXlFbmFibGVkLFxuICAgICAgICAgICAgICBhcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgc3NlQWxnb3JpdGhtOiBcImF3czprbXM6ZHNzZVwiLFxuICAgICAgICAgICAgICAgIGttc01hc3RlcktleUlkOiBlbmNyeXB0aW9uS2V5LmtleUFybixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLkRTU0VfTUFOQUdFRCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYnVja2V0RW5jcnlwdGlvbjoge1xuICAgICAgICAgIC8vIChPcHRpb25hbCkgQWNjb3VudCBJRCBvZiB0aGUgZXhwZWN0ZWQgYnVja2V0IG93bmVyLlxuICAgICAgICAgIC8vIGV4cGVjdGVkQnVja2V0T3duZXJcbiAgICAgICAgICBydWxlOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGJ1Y2tldEtleUVuYWJsZWQ6IHByb3BzLmJ1Y2tldEtleUVuYWJsZWQsXG4gICAgICAgICAgICAgIGFwcGx5U2VydmVyU2lkZUVuY3J5cHRpb25CeURlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBzc2VBbGdvcml0aG06IFwiYXdzOmttczpkc3NlXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgVW5leHBlY3RlZCAnZW5jcnlwdGlvblR5cGUnOiAke2VuY3J5cHRpb25UeXBlfWAsXG4gICAgICB0aGlzLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBpYW0gc3RhdGVtZW50IHRvIGVuZm9yY2UgU1NMIHJlcXVlc3RzIG9ubHkuXG4gICAqL1xuICBwcml2YXRlIGVuZm9yY2VTU0xTdGF0ZW1lbnQoKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgYWN0aW9uczogW1wiczM6KlwiXSxcbiAgICAgIGNvbmRpdGlvbjogW1xuICAgICAgICB7XG4gICAgICAgICAgdGVzdDogXCJCb29sXCIsXG4gICAgICAgICAgdmFyaWFibGU6IFwiYXdzOlNlY3VyZVRyYW5zcG9ydFwiLFxuICAgICAgICAgIHZhbHVlczogW1wiZmFsc2VcIl0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkRFTlksXG4gICAgICByZXNvdXJjZXM6IFt0aGlzLnJlc291cmNlLmFybiwgdGhpcy5hcm5Gb3JPYmplY3RzKFwiKlwiKV0sXG4gICAgICBwcmluY2lwYWxzOiBbbmV3IGlhbS5BbnlQcmluY2lwYWwoKV0sXG4gICAgfSk7XG4gICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KHN0YXRlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBpYW0gc3RhdGVtZW50IHRvIGFsbG93IHJlcXVlc3RzIHdpdGggYSBtaW5pbXVtIFRMU1xuICAgKiB2ZXJzaW9uIG9ubHkuXG4gICAqL1xuICBwcml2YXRlIG1pbmltdW1UTFNWZXJzaW9uU3RhdGVtZW50KG1pbmltdW1UTFNWZXJzaW9uPzogbnVtYmVyKSB7XG4gICAgaWYgKCFtaW5pbXVtVExTVmVyc2lvbikgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGFjdGlvbnM6IFtcInMzOipcIl0sXG4gICAgICBjb25kaXRpb246IFtcbiAgICAgICAge1xuICAgICAgICAgIHRlc3Q6IFwiTnVtZXJpY0xlc3NUaGFuXCIsXG4gICAgICAgICAgdmFyaWFibGU6IFwiczM6VGxzVmVyc2lvblwiLFxuICAgICAgICAgIHZhbHVlczogW21pbmltdW1UTFNWZXJzaW9uLnRvU3RyaW5nKCldLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5ERU5ZLFxuICAgICAgcmVzb3VyY2VzOiBbdGhpcy5yZXNvdXJjZS5hcm4sIHRoaXMuYXJuRm9yT2JqZWN0cyhcIipcIildLFxuICAgICAgcHJpbmNpcGFsczogW25ldyBpYW0uQW55UHJpbmNpcGFsKCldLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkVG9SZXNvdXJjZVBvbGljeShzdGF0ZW1lbnQpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkU291cmNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBMb2NhbCBwYXRoIHRvIHRoZSBzb3VyY2UgZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIFByZWZpeCB0byBhZGQgdG8gdGhlIHVwbG9hZGVkIG9iamVjdHNcbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeD86IHN0cmluZztcbn1cblxuLy8gcHJpdmF0ZSBpbnRlcmZhY2UgdG8gaW5kZXggQnVja2V0IHNvdXJjZXMgYnkgaWRcbmludGVyZmFjZSBTb3VyY2VJbmRleCB7XG4gIHByb3BzOiBCdWNrZXRTb3VyY2VQcm9wcztcbiAgaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTdG9yYWdlIGNsYXNzIHRvIG1vdmUgYW4gb2JqZWN0IHRvXG4gKi9cbmV4cG9ydCBlbnVtIFN0b3JhZ2VDbGFzcyB7XG4gIC8qKlxuICAgKiBTdG9yYWdlIGNsYXNzIGZvciBkYXRhIHRoYXQgaXMgYWNjZXNzZWQgbGVzcyBmcmVxdWVudGx5LCBidXQgcmVxdWlyZXMgcmFwaWRcbiAgICogYWNjZXNzIHdoZW4gbmVlZGVkLlxuICAgKlxuICAgKiBIYXMgbG93ZXIgYXZhaWxhYmlsaXR5IHRoYW4gU3RhbmRhcmQgc3RvcmFnZS5cbiAgICovXG4gIElORlJFUVVFTlRfQUNDRVNTID0gXCJTVEFOREFSRF9JQVwiLFxuXG4gIC8qKlxuICAgKiBJbmZyZXF1ZW50IEFjY2VzcyB0aGF0J3Mgb25seSBzdG9yZWQgaW4gb25lIGF2YWlsYWJpbGl0eSB6b25lLlxuICAgKlxuICAgKiBIYXMgbG93ZXIgYXZhaWxhYmlsaXR5IHRoYW4gc3RhbmRhcmQgSW5mcmVxdWVudEFjY2Vzcy5cbiAgICovXG4gIE9ORV9aT05FX0lORlJFUVVFTlRfQUNDRVNTID0gXCJPTkVaT05FX0lBXCIsXG5cbiAgLyoqXG4gICAqIFN0b3JhZ2UgY2xhc3MgZm9yIGxvbmctdGVybSBhcmNoaXZhbCB0aGF0IGNhbiB0YWtlIGJldHdlZW4gbWludXRlcyBhbmRcbiAgICogaG91cnMgdG8gYWNjZXNzLlxuICAgKlxuICAgKiBVc2UgZm9yIGFyY2hpdmVzIHdoZXJlIHBvcnRpb25zIG9mIHRoZSBkYXRhIG1pZ2h0IG5lZWQgdG8gYmUgcmV0cmlldmVkIGluXG4gICAqIG1pbnV0ZXMuIERhdGEgc3RvcmVkIGluIHRoZSBHTEFDSUVSIHN0b3JhZ2UgY2xhc3MgaGFzIGEgbWluaW11bSBzdG9yYWdlXG4gICAqIGR1cmF0aW9uIHBlcmlvZCBvZiA5MCBkYXlzIGFuZCBjYW4gYmUgYWNjZXNzZWQgaW4gYXMgbGl0dGxlIGFzIDEtNSBtaW51dGVzXG4gICAqIHVzaW5nIGV4cGVkaXRlZCByZXRyaWV2YWwuIElmIHlvdSBkZWxldGUgYW4gb2JqZWN0IGJlZm9yZSB0aGUgOTAtZGF5XG4gICAqIG1pbmltdW0sIHlvdSBhcmUgY2hhcmdlZCBmb3IgOTAgZGF5cy5cbiAgICovXG4gIEdMQUNJRVIgPSBcIkdMQUNJRVJcIixcblxuICAvKipcbiAgICogU3RvcmFnZSBjbGFzcyBmb3IgbG9uZy10ZXJtIGFyY2hpdmFsIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGluIGEgZmV3IG1pbGxpc2Vjb25kcy5cbiAgICpcbiAgICogSXQgaXMgaWRlYWwgZm9yIGRhdGEgdGhhdCBpcyBhY2Nlc3NlZCBvbmNlIG9yIHR3aWNlIHBlciBxdWFydGVyLCBhbmRcbiAgICogdGhhdCByZXF1aXJlcyBpbW1lZGlhdGUgYWNjZXNzLiBEYXRhIHN0b3JlZCBpbiB0aGUgR0xBQ0lFUl9JUiBzdG9yYWdlIGNsYXNzXG4gICAqIGhhcyBhIG1pbmltdW0gc3RvcmFnZSBkdXJhdGlvbiBwZXJpb2Qgb2YgOTAgZGF5cyBhbmQgY2FuIGJlIGFjY2Vzc2VkIGluXG4gICAqIGFzIG1pbGxpc2Vjb25kcy4gSWYgeW91IGRlbGV0ZSBhbiBvYmplY3QgYmVmb3JlIHRoZSA5MC1kYXkgbWluaW11bSxcbiAgICogeW91IGFyZSBjaGFyZ2VkIGZvciA5MCBkYXlzLlxuICAgKi9cbiAgR0xBQ0lFUl9JTlNUQU5UX1JFVFJJRVZBTCA9IFwiR0xBQ0lFUl9JUlwiLFxuXG4gIC8qKlxuICAgKiBVc2UgZm9yIGFyY2hpdmluZyBkYXRhIHRoYXQgcmFyZWx5IG5lZWRzIHRvIGJlIGFjY2Vzc2VkLiBEYXRhIHN0b3JlZCBpbiB0aGVcbiAgICogREVFUF9BUkNISVZFIHN0b3JhZ2UgY2xhc3MgaGFzIGEgbWluaW11bSBzdG9yYWdlIGR1cmF0aW9uIHBlcmlvZCBvZiAxODBcbiAgICogZGF5cyBhbmQgYSBkZWZhdWx0IHJldHJpZXZhbCB0aW1lIG9mIDEyIGhvdXJzLiBJZiB5b3UgZGVsZXRlIGFuIG9iamVjdFxuICAgKiBiZWZvcmUgdGhlIDE4MC1kYXkgbWluaW11bSwgeW91IGFyZSBjaGFyZ2VkIGZvciAxODAgZGF5cy4gRm9yIHByaWNpbmdcbiAgICogaW5mb3JtYXRpb24sIHNlZSBBbWF6b24gUzMgUHJpY2luZy5cbiAgICovXG4gIERFRVBfQVJDSElWRSA9IFwiREVFUF9BUkNISVZFXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBJTlRFTExJR0VOVF9USUVSSU5HIHN0b3JhZ2UgY2xhc3MgaXMgZGVzaWduZWQgdG8gb3B0aW1pemUgc3RvcmFnZSBjb3N0c1xuICAgKiBieSBhdXRvbWF0aWNhbGx5IG1vdmluZyBkYXRhIHRvIHRoZSBtb3N0IGNvc3QtZWZmZWN0aXZlIHN0b3JhZ2UgYWNjZXNzXG4gICAqIHRpZXIsIHdpdGhvdXQgcGVyZm9ybWFuY2UgaW1wYWN0IG9yIG9wZXJhdGlvbmFsIG92ZXJoZWFkLlxuICAgKiBJTlRFTExJR0VOVF9USUVSSU5HIGRlbGl2ZXJzIGF1dG9tYXRpYyBjb3N0IHNhdmluZ3MgYnkgbW92aW5nIGRhdGEgb24gYVxuICAgKiBncmFudWxhciBvYmplY3QgbGV2ZWwgYmV0d2VlbiB0d28gYWNjZXNzIHRpZXJzLCBhIGZyZXF1ZW50IGFjY2VzcyB0aWVyIGFuZFxuICAgKiBhIGxvd2VyLWNvc3QgaW5mcmVxdWVudCBhY2Nlc3MgdGllciwgd2hlbiBhY2Nlc3MgcGF0dGVybnMgY2hhbmdlLiBUaGVcbiAgICogSU5URUxMSUdFTlRfVElFUklORyBzdG9yYWdlIGNsYXNzIGlzIGlkZWFsIGlmIHlvdSB3YW50IHRvIG9wdGltaXplIHN0b3JhZ2VcbiAgICogY29zdHMgYXV0b21hdGljYWxseSBmb3IgbG9uZy1saXZlZCBkYXRhIHdoZW4gYWNjZXNzIHBhdHRlcm5zIGFyZSB1bmtub3duIG9yXG4gICAqIHVucHJlZGljdGFibGUuXG4gICAqL1xuICBJTlRFTExJR0VOVF9USUVSSU5HID0gXCJJTlRFTExJR0VOVF9USUVSSU5HXCIsXG59XG5cbi8qKlxuICogV2hhdCBraW5kIG9mIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gdG8gYXBwbHkgdG8gdGhpcyBidWNrZXRcbiAqL1xuZXhwb3J0IGVudW0gQnVja2V0RW5jcnlwdGlvbiB7XG4gIC8qKlxuICAgKiBQcmV2aW91cyBvcHRpb24uIEJ1Y2tldHMgY2FuIG5vdCBiZSB1bmVuY3J5cHRlZCBub3cuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvc2Vydi1zaWRlLWVuY3J5cHRpb24uaHRtbFxuICAgKiBAZGVwcmVjYXRlZCBTMyBhcHBsaWVzIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBTU0UtUzMgZm9yIGV2ZXJ5IGJ1Y2tldFxuICAgKiB0aGF0IGRlZmF1bHQgZW5jcnlwdGlvbiBpcyBub3QgY29uZmlndXJlZC5cbiAgICovXG4gIFVORU5DUllQVEVEID0gXCJVTkVOQ1JZUFRFRFwiLFxuXG4gIC8qKlxuICAgKiBTZXJ2ZXItc2lkZSBLTVMgZW5jcnlwdGlvbiB3aXRoIGEgbWFzdGVyIGtleSBtYW5hZ2VkIGJ5IEtNUy5cbiAgICovXG4gIEtNU19NQU5BR0VEID0gXCJLTVNfTUFOQUdFRFwiLFxuXG4gIC8qKlxuICAgKiBTZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIHdpdGggYSBtYXN0ZXIga2V5IG1hbmFnZWQgYnkgUzMuXG4gICAqL1xuICBTM19NQU5BR0VEID0gXCJTM19NQU5BR0VEXCIsXG5cbiAgLyoqXG4gICAqIFNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBhIEtNUyBrZXkgbWFuYWdlZCBieSB0aGUgdXNlci5cbiAgICogSWYgYGVuY3J5cHRpb25LZXlgIGlzIHNwZWNpZmllZCwgdGhpcyBrZXkgd2lsbCBiZSB1c2VkLCBvdGhlcndpc2UsIG9uZSB3aWxsIGJlIGRlZmluZWQuXG4gICAqL1xuICBLTVMgPSBcIktNU1wiLFxuXG4gIC8qKlxuICAgKiBEb3VibGUgc2VydmVyLXNpZGUgS01TIGVuY3J5cHRpb24gd2l0aCBhIG1hc3RlciBrZXkgbWFuYWdlZCBieSBLTVMuXG4gICAqL1xuICBEU1NFX01BTkFHRUQgPSBcIkRTU0VfTUFOQUdFRFwiLFxuXG4gIC8qKlxuICAgKiBEb3VibGUgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB3aXRoIGEgS01TIGtleSBtYW5hZ2VkIGJ5IHRoZSB1c2VyLlxuICAgKiBJZiBgZW5jcnlwdGlvbktleWAgaXMgc3BlY2lmaWVkLCB0aGlzIGtleSB3aWxsIGJlIHVzZWQsIG90aGVyd2lzZSwgb25lIHdpbGwgYmUgZGVmaW5lZC5cbiAgICovXG4gIERTU0UgPSBcIkRTU0VcIixcbn1cblxuLyoqXG4gKiBOb3RpZmljYXRpb24gZXZlbnQgdHlwZXMuXG4gKiBAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9ub3RpZmljYXRpb24taG93LXRvLWV2ZW50LXR5cGVzLWFuZC1kZXN0aW5hdGlvbnMuaHRtbCNzdXBwb3J0ZWQtbm90aWZpY2F0aW9uLWV2ZW50LXR5cGVzXG4gKi9cbmV4cG9ydCBlbnVtIEV2ZW50VHlwZSB7XG4gIC8qKlxuICAgKiBBbWF6b24gUzMgQVBJcyBzdWNoIGFzIFBVVCwgUE9TVCwgYW5kIENPUFkgY2FuIGNyZWF0ZSBhbiBvYmplY3QuIFVzaW5nXG4gICAqIHRoZXNlIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlbiBhbiBvYmplY3QgaXMgY3JlYXRlZFxuICAgKiB1c2luZyBhIHNwZWNpZmljIEFQSSwgb3IgeW91IGNhbiB1c2UgdGhlIHMzOk9iamVjdENyZWF0ZWQ6KiBldmVudCB0eXBlIHRvXG4gICAqIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhlIEFQSSB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSBhblxuICAgKiBvYmplY3QuXG4gICAqL1xuICBPQkpFQ1RfQ1JFQVRFRCA9IFwiczM6T2JqZWN0Q3JlYXRlZDoqXCIsXG5cbiAgLyoqXG4gICAqIEFtYXpvbiBTMyBBUElzIHN1Y2ggYXMgUFVULCBQT1NULCBhbmQgQ09QWSBjYW4gY3JlYXRlIGFuIG9iamVjdC4gVXNpbmdcbiAgICogdGhlc2UgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuIGFuIG9iamVjdCBpcyBjcmVhdGVkXG4gICAqIHVzaW5nIGEgc3BlY2lmaWMgQVBJLCBvciB5b3UgY2FuIHVzZSB0aGUgczM6T2JqZWN0Q3JlYXRlZDoqIGV2ZW50IHR5cGUgdG9cbiAgICogcmVxdWVzdCBub3RpZmljYXRpb24gcmVnYXJkbGVzcyBvZiB0aGUgQVBJIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIGFuXG4gICAqIG9iamVjdC5cbiAgICovXG4gIE9CSkVDVF9DUkVBVEVEX1BVVCA9IFwiczM6T2JqZWN0Q3JlYXRlZDpQdXRcIixcblxuICAvKipcbiAgICogQW1hem9uIFMzIEFQSXMgc3VjaCBhcyBQVVQsIFBPU1QsIGFuZCBDT1BZIGNhbiBjcmVhdGUgYW4gb2JqZWN0LiBVc2luZ1xuICAgKiB0aGVzZSBldmVudCB0eXBlcywgeW91IGNhbiBlbmFibGUgbm90aWZpY2F0aW9uIHdoZW4gYW4gb2JqZWN0IGlzIGNyZWF0ZWRcbiAgICogdXNpbmcgYSBzcGVjaWZpYyBBUEksIG9yIHlvdSBjYW4gdXNlIHRoZSBzMzpPYmplY3RDcmVhdGVkOiogZXZlbnQgdHlwZSB0b1xuICAgKiByZXF1ZXN0IG5vdGlmaWNhdGlvbiByZWdhcmRsZXNzIG9mIHRoZSBBUEkgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgYW5cbiAgICogb2JqZWN0LlxuICAgKi9cbiAgT0JKRUNUX0NSRUFURURfUE9TVCA9IFwiczM6T2JqZWN0Q3JlYXRlZDpQb3N0XCIsXG5cbiAgLyoqXG4gICAqIEFtYXpvbiBTMyBBUElzIHN1Y2ggYXMgUFVULCBQT1NULCBhbmQgQ09QWSBjYW4gY3JlYXRlIGFuIG9iamVjdC4gVXNpbmdcbiAgICogdGhlc2UgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuIGFuIG9iamVjdCBpcyBjcmVhdGVkXG4gICAqIHVzaW5nIGEgc3BlY2lmaWMgQVBJLCBvciB5b3UgY2FuIHVzZSB0aGUgczM6T2JqZWN0Q3JlYXRlZDoqIGV2ZW50IHR5cGUgdG9cbiAgICogcmVxdWVzdCBub3RpZmljYXRpb24gcmVnYXJkbGVzcyBvZiB0aGUgQVBJIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIGFuXG4gICAqIG9iamVjdC5cbiAgICovXG4gIE9CSkVDVF9DUkVBVEVEX0NPUFkgPSBcInMzOk9iamVjdENyZWF0ZWQ6Q29weVwiLFxuXG4gIC8qKlxuICAgKiBBbWF6b24gUzMgQVBJcyBzdWNoIGFzIFBVVCwgUE9TVCwgYW5kIENPUFkgY2FuIGNyZWF0ZSBhbiBvYmplY3QuIFVzaW5nXG4gICAqIHRoZXNlIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlbiBhbiBvYmplY3QgaXMgY3JlYXRlZFxuICAgKiB1c2luZyBhIHNwZWNpZmljIEFQSSwgb3IgeW91IGNhbiB1c2UgdGhlIHMzOk9iamVjdENyZWF0ZWQ6KiBldmVudCB0eXBlIHRvXG4gICAqIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhlIEFQSSB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSBhblxuICAgKiBvYmplY3QuXG4gICAqL1xuICBPQkpFQ1RfQ1JFQVRFRF9DT01QTEVURV9NVUxUSVBBUlRfVVBMT0FEID0gXCJzMzpPYmplY3RDcmVhdGVkOkNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkXCIsXG5cbiAgLyoqXG4gICAqIEJ5IHVzaW5nIHRoZSBPYmplY3RSZW1vdmVkIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlblxuICAgKiBhbiBvYmplY3Qgb3IgYSBiYXRjaCBvZiBvYmplY3RzIGlzIHJlbW92ZWQgZnJvbSBhIGJ1Y2tldC5cbiAgICpcbiAgICogWW91IGNhbiByZXF1ZXN0IG5vdGlmaWNhdGlvbiB3aGVuIGFuIG9iamVjdCBpcyBkZWxldGVkIG9yIGEgdmVyc2lvbmVkXG4gICAqIG9iamVjdCBpcyBwZXJtYW5lbnRseSBkZWxldGVkIGJ5IHVzaW5nIHRoZSBzMzpPYmplY3RSZW1vdmVkOkRlbGV0ZSBldmVudFxuICAgKiB0eXBlLiBPciB5b3UgY2FuIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHdoZW4gYSBkZWxldGUgbWFya2VyIGlzIGNyZWF0ZWQgZm9yXG4gICAqIGEgdmVyc2lvbmVkIG9iamVjdCBieSB1c2luZyBzMzpPYmplY3RSZW1vdmVkOkRlbGV0ZU1hcmtlckNyZWF0ZWQuIEZvclxuICAgKiBpbmZvcm1hdGlvbiBhYm91dCBkZWxldGluZyB2ZXJzaW9uZWQgb2JqZWN0cywgc2VlIERlbGV0aW5nIE9iamVjdFxuICAgKiBWZXJzaW9ucy4gWW91IGNhbiBhbHNvIHVzZSBhIHdpbGRjYXJkIHMzOk9iamVjdFJlbW92ZWQ6KiB0byByZXF1ZXN0XG4gICAqIG5vdGlmaWNhdGlvbiBhbnl0aW1lIGFuIG9iamVjdCBpcyBkZWxldGVkLlxuICAgKlxuICAgKiBZb3Ugd2lsbCBub3QgcmVjZWl2ZSBldmVudCBub3RpZmljYXRpb25zIGZyb20gYXV0b21hdGljIGRlbGV0ZXMgZnJvbVxuICAgKiBsaWZlY3ljbGUgcG9saWNpZXMgb3IgZnJvbSBmYWlsZWQgb3BlcmF0aW9ucy5cbiAgICovXG4gIE9CSkVDVF9SRU1PVkVEID0gXCJzMzpPYmplY3RSZW1vdmVkOipcIixcblxuICAvKipcbiAgICogQnkgdXNpbmcgdGhlIE9iamVjdFJlbW92ZWQgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuXG4gICAqIGFuIG9iamVjdCBvciBhIGJhdGNoIG9mIG9iamVjdHMgaXMgcmVtb3ZlZCBmcm9tIGEgYnVja2V0LlxuICAgKlxuICAgKiBZb3UgY2FuIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHdoZW4gYW4gb2JqZWN0IGlzIGRlbGV0ZWQgb3IgYSB2ZXJzaW9uZWRcbiAgICogb2JqZWN0IGlzIHBlcm1hbmVudGx5IGRlbGV0ZWQgYnkgdXNpbmcgdGhlIHMzOk9iamVjdFJlbW92ZWQ6RGVsZXRlIGV2ZW50XG4gICAqIHR5cGUuIE9yIHlvdSBjYW4gcmVxdWVzdCBub3RpZmljYXRpb24gd2hlbiBhIGRlbGV0ZSBtYXJrZXIgaXMgY3JlYXRlZCBmb3JcbiAgICogYSB2ZXJzaW9uZWQgb2JqZWN0IGJ5IHVzaW5nIHMzOk9iamVjdFJlbW92ZWQ6RGVsZXRlTWFya2VyQ3JlYXRlZC4gRm9yXG4gICAqIGluZm9ybWF0aW9uIGFib3V0IGRlbGV0aW5nIHZlcnNpb25lZCBvYmplY3RzLCBzZWUgRGVsZXRpbmcgT2JqZWN0XG4gICAqIFZlcnNpb25zLiBZb3UgY2FuIGFsc28gdXNlIGEgd2lsZGNhcmQgczM6T2JqZWN0UmVtb3ZlZDoqIHRvIHJlcXVlc3RcbiAgICogbm90aWZpY2F0aW9uIGFueXRpbWUgYW4gb2JqZWN0IGlzIGRlbGV0ZWQuXG4gICAqXG4gICAqIFlvdSB3aWxsIG5vdCByZWNlaXZlIGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSBhdXRvbWF0aWMgZGVsZXRlcyBmcm9tXG4gICAqIGxpZmVjeWNsZSBwb2xpY2llcyBvciBmcm9tIGZhaWxlZCBvcGVyYXRpb25zLlxuICAgKi9cbiAgT0JKRUNUX1JFTU9WRURfREVMRVRFID0gXCJzMzpPYmplY3RSZW1vdmVkOkRlbGV0ZVwiLFxuXG4gIC8qKlxuICAgKiBCeSB1c2luZyB0aGUgT2JqZWN0UmVtb3ZlZCBldmVudCB0eXBlcywgeW91IGNhbiBlbmFibGUgbm90aWZpY2F0aW9uIHdoZW5cbiAgICogYW4gb2JqZWN0IG9yIGEgYmF0Y2ggb2Ygb2JqZWN0cyBpcyByZW1vdmVkIGZyb20gYSBidWNrZXQuXG4gICAqXG4gICAqIFlvdSBjYW4gcmVxdWVzdCBub3RpZmljYXRpb24gd2hlbiBhbiBvYmplY3QgaXMgZGVsZXRlZCBvciBhIHZlcnNpb25lZFxuICAgKiBvYmplY3QgaXMgcGVybWFuZW50bHkgZGVsZXRlZCBieSB1c2luZyB0aGUgczM6T2JqZWN0UmVtb3ZlZDpEZWxldGUgZXZlbnRcbiAgICogdHlwZS4gT3IgeW91IGNhbiByZXF1ZXN0IG5vdGlmaWNhdGlvbiB3aGVuIGEgZGVsZXRlIG1hcmtlciBpcyBjcmVhdGVkIGZvclxuICAgKiBhIHZlcnNpb25lZCBvYmplY3QgYnkgdXNpbmcgczM6T2JqZWN0UmVtb3ZlZDpEZWxldGVNYXJrZXJDcmVhdGVkLiBGb3JcbiAgICogaW5mb3JtYXRpb24gYWJvdXQgZGVsZXRpbmcgdmVyc2lvbmVkIG9iamVjdHMsIHNlZSBEZWxldGluZyBPYmplY3RcbiAgICogVmVyc2lvbnMuIFlvdSBjYW4gYWxzbyB1c2UgYSB3aWxkY2FyZCBzMzpPYmplY3RSZW1vdmVkOiogdG8gcmVxdWVzdFxuICAgKiBub3RpZmljYXRpb24gYW55dGltZSBhbiBvYmplY3QgaXMgZGVsZXRlZC5cbiAgICpcbiAgICogWW91IHdpbGwgbm90IHJlY2VpdmUgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIGF1dG9tYXRpYyBkZWxldGVzIGZyb21cbiAgICogbGlmZWN5Y2xlIHBvbGljaWVzIG9yIGZyb20gZmFpbGVkIG9wZXJhdGlvbnMuXG4gICAqL1xuICBPQkpFQ1RfUkVNT1ZFRF9ERUxFVEVfTUFSS0VSX0NSRUFURUQgPSBcInMzOk9iamVjdFJlbW92ZWQ6RGVsZXRlTWFya2VyQ3JlYXRlZFwiLFxuXG4gIC8qKlxuICAgKiBVc2luZyByZXN0b3JlIG9iamVjdCBldmVudCB0eXBlcyB5b3UgY2FuIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBmb3JcbiAgICogaW5pdGlhdGlvbiBhbmQgY29tcGxldGlvbiB3aGVuIHJlc3RvcmluZyBvYmplY3RzIGZyb20gdGhlIFMzIEdsYWNpZXJcbiAgICogc3RvcmFnZSBjbGFzcy5cbiAgICpcbiAgICogWW91IHVzZSBzMzpPYmplY3RSZXN0b3JlOlBvc3QgdG8gcmVxdWVzdCBub3RpZmljYXRpb24gb2Ygb2JqZWN0IHJlc3RvcmF0aW9uXG4gICAqIGluaXRpYXRpb24uXG4gICAqL1xuICBPQkpFQ1RfUkVTVE9SRV9QT1NUID0gXCJzMzpPYmplY3RSZXN0b3JlOlBvc3RcIixcblxuICAvKipcbiAgICogVXNpbmcgcmVzdG9yZSBvYmplY3QgZXZlbnQgdHlwZXMgeW91IGNhbiByZWNlaXZlIG5vdGlmaWNhdGlvbnMgZm9yXG4gICAqIGluaXRpYXRpb24gYW5kIGNvbXBsZXRpb24gd2hlbiByZXN0b3Jpbmcgb2JqZWN0cyBmcm9tIHRoZSBTMyBHbGFjaWVyXG4gICAqIHN0b3JhZ2UgY2xhc3MuXG4gICAqXG4gICAqIFlvdSB1c2UgczM6T2JqZWN0UmVzdG9yZTpDb21wbGV0ZWQgdG8gcmVxdWVzdCBub3RpZmljYXRpb24gb2ZcbiAgICogcmVzdG9yYXRpb24gY29tcGxldGlvbi5cbiAgICovXG4gIE9CSkVDVF9SRVNUT1JFX0NPTVBMRVRFRCA9IFwiczM6T2JqZWN0UmVzdG9yZTpDb21wbGV0ZWRcIixcblxuICAvKipcbiAgICogVXNpbmcgcmVzdG9yZSBvYmplY3QgZXZlbnQgdHlwZXMgeW91IGNhbiByZWNlaXZlIG5vdGlmaWNhdGlvbnMgZm9yXG4gICAqIGluaXRpYXRpb24gYW5kIGNvbXBsZXRpb24gd2hlbiByZXN0b3Jpbmcgb2JqZWN0cyBmcm9tIHRoZSBTMyBHbGFjaWVyXG4gICAqIHN0b3JhZ2UgY2xhc3MuXG4gICAqXG4gICAqIFlvdSB1c2UgczM6T2JqZWN0UmVzdG9yZTpEZWxldGUgdG8gcmVxdWVzdCBub3RpZmljYXRpb24gb2ZcbiAgICogcmVzdG9yYXRpb24gY29tcGxldGlvbi5cbiAgICovXG4gIE9CSkVDVF9SRVNUT1JFX0RFTEVURSA9IFwiczM6T2JqZWN0UmVzdG9yZTpEZWxldGVcIixcblxuICAvKipcbiAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHRvIHJlcXVlc3QgQW1hem9uIFMzIHRvIHNlbmQgYSBub3RpZmljYXRpb25cbiAgICogbWVzc2FnZSB3aGVuIEFtYXpvbiBTMyBkZXRlY3RzIHRoYXQgYW4gb2JqZWN0IG9mIHRoZSBSUlMgc3RvcmFnZSBjbGFzcyBpc1xuICAgKiBsb3N0LlxuICAgKi9cbiAgUkVEVUNFRF9SRURVTkRBTkNZX0xPU1RfT0JKRUNUID0gXCJzMzpSZWR1Y2VkUmVkdW5kYW5jeUxvc3RPYmplY3RcIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgd2hlbiBhbiBvYmplY3QgdGhhdCB3YXMgZWxpZ2libGUgZm9yXG4gICAqIHJlcGxpY2F0aW9uIHVzaW5nIEFtYXpvbiBTMyBSZXBsaWNhdGlvbiBUaW1lIENvbnRyb2wgZmFpbGVkIHRvIHJlcGxpY2F0ZS5cbiAgICovXG4gIFJFUExJQ0FUSU9OX09QRVJBVElPTl9GQUlMRURfUkVQTElDQVRJT04gPSBcInMzOlJlcGxpY2F0aW9uOk9wZXJhdGlvbkZhaWxlZFJlcGxpY2F0aW9uXCIsXG5cbiAgLyoqXG4gICAqIFlvdSByZWNlaXZlIHRoaXMgbm90aWZpY2F0aW9uIGV2ZW50IHdoZW4gYW4gb2JqZWN0IHRoYXQgd2FzIGVsaWdpYmxlIGZvclxuICAgKiByZXBsaWNhdGlvbiB1c2luZyBBbWF6b24gUzMgUmVwbGljYXRpb24gVGltZSBDb250cm9sIGV4Y2VlZGVkIHRoZSAxNS1taW51dGVcbiAgICogdGhyZXNob2xkIGZvciByZXBsaWNhdGlvbi5cbiAgICovXG4gIFJFUExJQ0FUSU9OX09QRVJBVElPTl9NSVNTRURfVEhSRVNIT0xEID0gXCJzMzpSZXBsaWNhdGlvbjpPcGVyYXRpb25NaXNzZWRUaHJlc2hvbGRcIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgZm9yIGFuIG9iamVjdCB0aGF0IHdhcyBlbGlnaWJsZSBmb3JcbiAgICogcmVwbGljYXRpb24gdXNpbmcgdGhlIEFtYXpvbiBTMyBSZXBsaWNhdGlvbiBUaW1lIENvbnRyb2wgZmVhdHVyZSByZXBsaWNhdGVkXG4gICAqIGFmdGVyIHRoZSAxNS1taW51dGUgdGhyZXNob2xkLlxuICAgKi9cbiAgUkVQTElDQVRJT05fT1BFUkFUSU9OX1JFUExJQ0FURURfQUZURVJfVEhSRVNIT0xEID0gXCJzMzpSZXBsaWNhdGlvbjpPcGVyYXRpb25SZXBsaWNhdGVkQWZ0ZXJUaHJlc2hvbGRcIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgZm9yIGFuIG9iamVjdCB0aGF0IHdhcyBlbGlnaWJsZSBmb3JcbiAgICogcmVwbGljYXRpb24gdXNpbmcgQW1hem9uIFMzIFJlcGxpY2F0aW9uIFRpbWUgQ29udHJvbCBidXQgaXMgbm8gbG9uZ2VyIHRyYWNrZWRcbiAgICogYnkgcmVwbGljYXRpb24gbWV0cmljcy5cbiAgICovXG4gIFJFUExJQ0FUSU9OX09QRVJBVElPTl9OT1RfVFJBQ0tFRCA9IFwiczM6UmVwbGljYXRpb246T3BlcmF0aW9uTm90VHJhY2tlZFwiLFxuXG4gIC8qKlxuICAgKiBCeSB1c2luZyB0aGUgTGlmZWN5Y2xlRXhwaXJhdGlvbiBldmVudCB0eXBlcywgeW91IGNhbiByZWNlaXZlIGEgbm90aWZpY2F0aW9uXG4gICAqIHdoZW4gQW1hem9uIFMzIGRlbGV0ZXMgYW4gb2JqZWN0IGJhc2VkIG9uIHlvdXIgUzMgTGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBMSUZFQ1lDTEVfRVhQSVJBVElPTiA9IFwiczM6TGlmZWN5Y2xlRXhwaXJhdGlvbjoqXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBzMzpMaWZlY3ljbGVFeHBpcmF0aW9uOkRlbGV0ZSBldmVudCB0eXBlIG5vdGlmaWVzIHlvdSB3aGVuIGFuIG9iamVjdFxuICAgKiBpbiBhbiB1bnZlcnNpb25lZCBidWNrZXQgaXMgZGVsZXRlZC5cbiAgICogSXQgYWxzbyBub3RpZmllcyB5b3Ugd2hlbiBhbiBvYmplY3QgdmVyc2lvbiBpcyBwZXJtYW5lbnRseSBkZWxldGVkIGJ5IGFuXG4gICAqIFMzIExpZmVjeWNsZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgTElGRUNZQ0xFX0VYUElSQVRJT05fREVMRVRFID0gXCJzMzpMaWZlY3ljbGVFeHBpcmF0aW9uOkRlbGV0ZVwiLFxuXG4gIC8qKlxuICAgKiBUaGUgczM6TGlmZWN5Y2xlRXhwaXJhdGlvbjpEZWxldGVNYXJrZXJDcmVhdGVkIGV2ZW50IHR5cGUgbm90aWZpZXMgeW91XG4gICAqIHdoZW4gUzMgTGlmZWN5Y2xlIGNyZWF0ZXMgYSBkZWxldGUgbWFya2VyIHdoZW4gYSBjdXJyZW50IHZlcnNpb24gb2YgYW5cbiAgICogb2JqZWN0IGluIHZlcnNpb25lZCBidWNrZXQgaXMgZGVsZXRlZC5cbiAgICovXG4gIExJRkVDWUNMRV9FWFBJUkFUSU9OX0RFTEVURV9NQVJLRVJfQ1JFQVRFRCA9IFwiczM6TGlmZWN5Y2xlRXhwaXJhdGlvbjpEZWxldGVNYXJrZXJDcmVhdGVkXCIsXG5cbiAgLyoqXG4gICAqIFlvdSByZWNlaXZlIHRoaXMgbm90aWZpY2F0aW9uIGV2ZW50IHdoZW4gYW4gb2JqZWN0IGlzIHRyYW5zaXRpb25lZCB0b1xuICAgKiBhbm90aGVyIEFtYXpvbiBTMyBzdG9yYWdlIGNsYXNzIGJ5IGFuIFMzIExpZmVjeWNsZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgTElGRUNZQ0xFX1RSQU5TSVRJT04gPSBcInMzOkxpZmVjeWNsZVRyYW5zaXRpb25cIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgd2hlbiBhbiBvYmplY3Qgd2l0aGluIHRoZVxuICAgKiBTMyBJbnRlbGxpZ2VudC1UaWVyaW5nIHN0b3JhZ2UgY2xhc3MgbW92ZWQgdG8gdGhlIEFyY2hpdmUgQWNjZXNzIHRpZXIgb3JcbiAgICogRGVlcCBBcmNoaXZlIEFjY2VzcyB0aWVyLlxuICAgKi9cbiAgSU5URUxMSUdFTlRfVElFUklORyA9IFwiczM6SW50ZWxsaWdlbnRUaWVyaW5nXCIsXG5cbiAgLyoqXG4gICAqIEJ5IHVzaW5nIHRoZSBPYmplY3RUYWdnaW5nIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlblxuICAgKiBhbiBvYmplY3QgdGFnIGlzIGFkZGVkIG9yIGRlbGV0ZWQgZnJvbSBhbiBvYmplY3QuXG4gICAqL1xuICBPQkpFQ1RfVEFHR0lORyA9IFwiczM6T2JqZWN0VGFnZ2luZzoqXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBzMzpPYmplY3RUYWdnaW5nOlB1dCBldmVudCB0eXBlIG5vdGlmaWVzIHlvdSB3aGVuIGEgdGFnIGlzIFBVVCBvbiBhblxuICAgKiBvYmplY3Qgb3IgYW4gZXhpc3RpbmcgdGFnIGlzIHVwZGF0ZWQuXG5cbiAgICovXG4gIE9CSkVDVF9UQUdHSU5HX1BVVCA9IFwiczM6T2JqZWN0VGFnZ2luZzpQdXRcIixcblxuICAvKipcbiAgICogVGhlIHMzOk9iamVjdFRhZ2dpbmc6RGVsZXRlIGV2ZW50IHR5cGUgbm90aWZpZXMgeW91IHdoZW4gYSB0YWcgaXMgcmVtb3ZlZFxuICAgKiBmcm9tIGFuIG9iamVjdC5cbiAgICovXG4gIE9CSkVDVF9UQUdHSU5HX0RFTEVURSA9IFwiczM6T2JqZWN0VGFnZ2luZzpEZWxldGVcIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgd2hlbiBhbiBBQ0wgaXMgUFVUIG9uIGFuIG9iamVjdCBvciB3aGVuXG4gICAqIGFuIGV4aXN0aW5nIEFDTCBpcyBjaGFuZ2VkLlxuICAgKiBBbiBldmVudCBpcyBub3QgZ2VuZXJhdGVkIHdoZW4gYSByZXF1ZXN0IHJlc3VsdHMgaW4gbm8gY2hhbmdlIHRvIGFuXG4gICAqIG9iamVjdOKAmXMgQUNMLlxuICAgKi9cbiAgT0JKRUNUX0FDTF9QVVQgPSBcInMzOk9iamVjdEFjbDpQdXRcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb3RpZmljYXRpb25LZXlGaWx0ZXIge1xuICAvKipcbiAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIGVhY2ggb2YgdGhlIG5vdGlmaWNhdGlvbiBjb25maWd1cmF0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICAvKipcbiAgICogUzMga2V5cyBtdXN0IGhhdmUgdGhlIHNwZWNpZmllZCBwcmVmaXguXG4gICAqL1xuICByZWFkb25seSBwcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFMzIGtleXMgbXVzdCBoYXZlIHRoZSBzcGVjaWZpZWQgc3VmZml4LlxuICAgKi9cbiAgcmVhZG9ubHkgc3VmZml4Pzogc3RyaW5nO1xufVxuIl19
|