@aws-cdk/toolkit-lib 1.21.3 → 1.22.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/build-info.json +2 -2
- package/lib/api/aws-auth/sdk.d.ts +5 -3
- package/lib/api/aws-auth/sdk.js +7 -5
- package/lib/api/cloudformation/evaluate-cloudformation-template.d.ts +33 -0
- package/lib/api/cloudformation/evaluate-cloudformation-template.js +155 -20
- package/lib/api/hotswap/cloud-control-resource.d.ts +5 -0
- package/lib/api/hotswap/cloud-control-resource.js +98 -0
- package/lib/api/hotswap/hotswap-deployments.js +31 -13
- package/lib/api/hotswap/lambda-functions.js +9 -12
- package/package.json +2 -2
- package/lib/api/hotswap/bedrock-agentcore-runtimes.d.ts +0 -5
- package/lib/api/hotswap/bedrock-agentcore-runtimes.js +0 -145
- package/lib/api/hotswap/stepfunctions-state-machines.d.ts +0 -5
- package/lib/api/hotswap/stepfunctions-state-machines.js +0 -48
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EvaluateCloudFormationTemplate = exports.CfnEvaluationException = exports.LazyLookupExport = exports.LookupExportError = exports.LazyListStackResources = void 0;
|
|
3
|
+
exports.RESOURCE_TYPE_PRIMARY_IDENTIFIERS = exports.EvaluateCloudFormationTemplate = exports.CfnEvaluationException = exports.LazyLookupExport = exports.LookupExportError = exports.LazyListStackResources = void 0;
|
|
4
4
|
const toolkit_error_1 = require("../../toolkit/toolkit-error");
|
|
5
5
|
const resource_metadata_1 = require("../resource-metadata");
|
|
6
6
|
class LazyListStackResources {
|
|
@@ -77,6 +77,7 @@ class EvaluateCloudFormationTemplate {
|
|
|
77
77
|
stackResources;
|
|
78
78
|
lookupExport;
|
|
79
79
|
cachedUrlSuffix;
|
|
80
|
+
_cloudControl;
|
|
80
81
|
constructor(props) {
|
|
81
82
|
this.stackArtifact = props.stackArtifact;
|
|
82
83
|
this.stackName = props.stackName ?? props.stackArtifact.stackName;
|
|
@@ -100,6 +101,12 @@ class EvaluateCloudFormationTemplate {
|
|
|
100
101
|
// CloudFormation Exports lookup to be able to resolve Fn::ImportValue intrinsics in template
|
|
101
102
|
this.lookupExport = new LazyLookupExport(this.sdk);
|
|
102
103
|
}
|
|
104
|
+
get cloudControl() {
|
|
105
|
+
if (!this._cloudControl) {
|
|
106
|
+
this._cloudControl = this.sdk.cloudControl();
|
|
107
|
+
}
|
|
108
|
+
return this._cloudControl;
|
|
109
|
+
}
|
|
103
110
|
// clones current EvaluateCloudFormationTemplate object, but updates the stack name
|
|
104
111
|
async createNestedEvaluateCloudFormationTemplate(stackName, nestedTemplate, nestedStackParameters) {
|
|
105
112
|
const evaluatedParams = await this.evaluateCfnExpression(nestedStackParameters);
|
|
@@ -246,6 +253,43 @@ class EvaluateCloudFormationTemplate {
|
|
|
246
253
|
}
|
|
247
254
|
return cfnExpression;
|
|
248
255
|
}
|
|
256
|
+
/**
|
|
257
|
+
* Best-effort attempt to construct the Cloud Control API primary identifier for a resource.
|
|
258
|
+
*
|
|
259
|
+
* Cloud Control compound identifiers are pipe-delimited, ordered by the `primaryIdentifier`
|
|
260
|
+
* array in the resource type schema (e.g. `DatabaseName|TableName` for `AWS::Glue::Table`).
|
|
261
|
+
*
|
|
262
|
+
* CloudFormation's `PhysicalResourceId` (the `physicalId` parameter here) is the `Ref` return
|
|
263
|
+
* value for the resource, which is resource-type-specific and may not correspond to the Cloud
|
|
264
|
+
* Control Primary Identifier.
|
|
265
|
+
*
|
|
266
|
+
* For properties present in the template, we resolve them directly. For properties NOT in the
|
|
267
|
+
* template (e.g. service-generated read-only values), we fall back to `physicalId`. This is
|
|
268
|
+
* only correct when:
|
|
269
|
+
*
|
|
270
|
+
* - Exactly one property in the identifier is missing from the template, AND
|
|
271
|
+
* - That property happens to be the one that `Ref` returns for this resource type.
|
|
272
|
+
*
|
|
273
|
+
* If multiple properties are missing, `physicalId` is reused for all of them.
|
|
274
|
+
*/
|
|
275
|
+
async evaluateCloudControlIdentifier(logicalId, resourceType, physicalId) {
|
|
276
|
+
if (resourceType in exports.RESOURCE_TYPE_PRIMARY_IDENTIFIERS) {
|
|
277
|
+
const primaryProps = exports.RESOURCE_TYPE_PRIMARY_IDENTIFIERS[resourceType];
|
|
278
|
+
const parts = [];
|
|
279
|
+
for (const propName of primaryProps) {
|
|
280
|
+
const templateVal = this.getResourceProperty(logicalId, propName);
|
|
281
|
+
if (templateVal) {
|
|
282
|
+
parts.push(await this.evaluateCfnExpression(templateVal));
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
// Not in template — assume this is the Ref return value. See doc comment for caveats.
|
|
286
|
+
parts.push(physicalId);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return parts.join('|');
|
|
290
|
+
}
|
|
291
|
+
return physicalId;
|
|
292
|
+
}
|
|
249
293
|
getResourceProperty(logicalId, propertyName) {
|
|
250
294
|
return this.template.Resources?.[logicalId]?.Properties?.[propertyName];
|
|
251
295
|
}
|
|
@@ -336,32 +380,46 @@ class EvaluateCloudFormationTemplate {
|
|
|
336
380
|
}
|
|
337
381
|
return undefined;
|
|
338
382
|
}
|
|
339
|
-
formatResourceAttribute(resource, attribute) {
|
|
383
|
+
async formatResourceAttribute(resource, attribute) {
|
|
340
384
|
const physicalId = resource.PhysicalResourceId;
|
|
341
385
|
// no attribute means Ref expression, for which we use the physical ID directly
|
|
342
386
|
if (!attribute) {
|
|
343
387
|
return physicalId;
|
|
344
388
|
}
|
|
345
389
|
const resourceTypeFormats = RESOURCE_TYPE_ATTRIBUTES_FORMATS[resource.ResourceType];
|
|
346
|
-
if (
|
|
347
|
-
|
|
348
|
-
|
|
390
|
+
if (resourceTypeFormats) {
|
|
391
|
+
const attributeFormatFunc = resourceTypeFormats[attribute];
|
|
392
|
+
if (attributeFormatFunc) {
|
|
393
|
+
const service = this.getServiceOfResource(resource);
|
|
394
|
+
const resourceTypeArnPart = this.getResourceTypeArnPartOfResource(resource);
|
|
395
|
+
return attributeFormatFunc({
|
|
396
|
+
partition: this.partition,
|
|
397
|
+
service,
|
|
398
|
+
region: this.region,
|
|
399
|
+
account: this.account,
|
|
400
|
+
resourceType: resourceTypeArnPart,
|
|
401
|
+
resourceName: physicalId,
|
|
402
|
+
});
|
|
403
|
+
}
|
|
349
404
|
}
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
405
|
+
try {
|
|
406
|
+
const identifier = await this.evaluateCloudControlIdentifier(resource.LogicalResourceId, resource.ResourceType, physicalId);
|
|
407
|
+
const response = await this.cloudControl.getResource({
|
|
408
|
+
TypeName: resource.ResourceType,
|
|
409
|
+
Identifier: identifier,
|
|
410
|
+
});
|
|
411
|
+
const props = JSON.parse(response.ResourceDescription?.Properties ?? '{}');
|
|
412
|
+
if (attribute in props) {
|
|
413
|
+
return props[attribute];
|
|
414
|
+
}
|
|
354
415
|
}
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
resourceType: resourceTypeArnPart,
|
|
363
|
-
resourceName: physicalId,
|
|
364
|
-
});
|
|
416
|
+
catch (error) {
|
|
417
|
+
// Cloud Control lookup failed — fall through to the error below
|
|
418
|
+
throw new CfnEvaluationException(`Could not find '${attribute}' attribute of the '${resource.ResourceType}' resource because` +
|
|
419
|
+
`an error occured while attempting to retrieve the information: '${error.name}:${error.message}'`);
|
|
420
|
+
}
|
|
421
|
+
throw new CfnEvaluationException(`We don't support the '${attribute}' attribute of the '${resource.ResourceType}' resource. This is a CDK limitation. ` +
|
|
422
|
+
'Please report it at https://github.com/aws/aws-cdk/issues/new/choose');
|
|
365
423
|
}
|
|
366
424
|
getServiceOfResource(resource) {
|
|
367
425
|
return resource.ResourceType.split('::')[1].toLowerCase();
|
|
@@ -376,6 +434,83 @@ class EvaluateCloudFormationTemplate {
|
|
|
376
434
|
}
|
|
377
435
|
}
|
|
378
436
|
exports.EvaluateCloudFormationTemplate = EvaluateCloudFormationTemplate;
|
|
437
|
+
/**
|
|
438
|
+
* Resources where the CloudFormation physical resource ID ({ Ref }) disagrees
|
|
439
|
+
* with the Cloud Control API primary identifier.
|
|
440
|
+
*
|
|
441
|
+
* Maps resource type to the CC primary identifier property names.
|
|
442
|
+
* For resources NOT in this map, the physical resource ID can be used
|
|
443
|
+
* directly as the CC primary identifier.
|
|
444
|
+
*/
|
|
445
|
+
exports.RESOURCE_TYPE_PRIMARY_IDENTIFIERS = {
|
|
446
|
+
'AWS::ApiGateway::Authorizer': ['RestApiId', 'AuthorizerId'],
|
|
447
|
+
'AWS::ApiGateway::Deployment': ['DeploymentId', 'RestApiId'],
|
|
448
|
+
'AWS::ApiGateway::Model': ['RestApiId', 'Name'],
|
|
449
|
+
'AWS::ApiGateway::RequestValidator': ['RestApiId', 'RequestValidatorId'],
|
|
450
|
+
'AWS::ApiGateway::DocumentationPart': ['DocumentationPartId', 'RestApiId'],
|
|
451
|
+
'AWS::ApiGateway::Resource': ['RestApiId', 'ResourceId'],
|
|
452
|
+
'AWS::ApiGateway::Stage': ['RestApiId', 'StageName'],
|
|
453
|
+
'AWS::ApiGatewayV2::ApiMapping': ['ApiMappingId', 'DomainName'],
|
|
454
|
+
'AWS::ApiGatewayV2::Authorizer': ['AuthorizerId', 'ApiId'],
|
|
455
|
+
'AWS::ApiGatewayV2::Deployment': ['ApiId', 'DeploymentId'],
|
|
456
|
+
'AWS::ApiGatewayV2::Integration': ['ApiId', 'IntegrationId'],
|
|
457
|
+
'AWS::ApiGatewayV2::IntegrationResponse': ['ApiId', 'IntegrationId', 'IntegrationResponseId'],
|
|
458
|
+
'AWS::ApiGatewayV2::Model': ['ApiId', 'ModelId'],
|
|
459
|
+
'AWS::ApiGatewayV2::Route': ['ApiId', 'RouteId'],
|
|
460
|
+
'AWS::ApiGatewayV2::RouteResponse': ['ApiId', 'RouteId', 'RouteResponseId'],
|
|
461
|
+
'AWS::ApiGatewayV2::Stage': ['Id'],
|
|
462
|
+
'AWS::AppConfig::ConfigurationProfile': ['ApplicationId', 'ConfigurationProfileId'],
|
|
463
|
+
'AWS::AppConfig::Environment': ['ApplicationId', 'EnvironmentId'],
|
|
464
|
+
'AWS::AppConfig::HostedConfigurationVersion': ['ApplicationId', 'ConfigurationProfileId', 'VersionNumber'],
|
|
465
|
+
'AWS::AppMesh::GatewayRoute': ['Id'],
|
|
466
|
+
'AWS::AppMesh::Mesh': ['Id'],
|
|
467
|
+
'AWS::AppMesh::Route': ['Id'],
|
|
468
|
+
'AWS::AppMesh::VirtualGateway': ['Id'],
|
|
469
|
+
'AWS::AppMesh::VirtualNode': ['Id'],
|
|
470
|
+
'AWS::AppMesh::VirtualRouter': ['Id'],
|
|
471
|
+
'AWS::AppMesh::VirtualService': ['Id'],
|
|
472
|
+
'AWS::AppSync::ApiKey': ['ApiKeyId'],
|
|
473
|
+
'AWS::AppSync::GraphQLApi': ['ApiId'],
|
|
474
|
+
'AWS::Batch::JobDefinition': ['JobDefinitionName'],
|
|
475
|
+
'AWS::CloudWatch::InsightRule': ['Id'],
|
|
476
|
+
'AWS::CodeBuild::Project': ['Id'],
|
|
477
|
+
'AWS::CodeBuild::ReportGroup': ['Id'],
|
|
478
|
+
'AWS::CodeDeploy::DeploymentGroup': ['ApplicationName', 'DeploymentGroupName'],
|
|
479
|
+
'AWS::CodePipeline::Webhook': ['Id'],
|
|
480
|
+
'AWS::Cognito::UserPoolClient': ['UserPoolId', 'ClientId'],
|
|
481
|
+
'AWS::Cognito::UserPoolDomain': ['UserPoolId', 'Domain'],
|
|
482
|
+
'AWS::Cognito::UserPoolGroup': ['UserPoolId', 'GroupName'],
|
|
483
|
+
'AWS::Cognito::UserPoolIdentityProvider': ['UserPoolId', 'ProviderName'],
|
|
484
|
+
'AWS::Cognito::UserPoolResourceServer': ['UserPoolId', 'Identifier'],
|
|
485
|
+
'AWS::Cognito::UserPoolUser': ['UserPoolId', 'Username'],
|
|
486
|
+
'AWS::DAX::Cluster': ['Id'],
|
|
487
|
+
'AWS::DAX::ParameterGroup': ['Id'],
|
|
488
|
+
'AWS::DAX::SubnetGroup': ['Id'],
|
|
489
|
+
'AWS::DMS::EventSubscription': ['Id'],
|
|
490
|
+
'AWS::EC2::EIP': ['PublicIp', 'AllocationId'],
|
|
491
|
+
'AWS::ECS::Service': ['ServiceArn', 'Cluster'],
|
|
492
|
+
'AWS::ElastiCache::CacheCluster': ['Id'],
|
|
493
|
+
'AWS::ElasticLoadBalancing::LoadBalancer': ['Id'],
|
|
494
|
+
'AWS::ElastiCache::User': ['UserId'],
|
|
495
|
+
'AWS::Elasticsearch::Domain': ['Id'],
|
|
496
|
+
'AWS::Events::Rule': ['Arn'],
|
|
497
|
+
'AWS::EventSchemas::RegistryPolicy': ['Id'],
|
|
498
|
+
'AWS::Glue::DevEndpoint': ['Id'],
|
|
499
|
+
'AWS::Glue::Workflow': ['Id'],
|
|
500
|
+
'AWS::IoT::Policy': ['Id'],
|
|
501
|
+
'AWS::Logs::LogStream': ['LogGroupName', 'LogStreamName'],
|
|
502
|
+
'AWS::Logs::SubscriptionFilter': ['FilterName', 'LogGroupName'],
|
|
503
|
+
'AWS::MediaConvert::JobTemplate': ['Id'],
|
|
504
|
+
'AWS::MediaConvert::Preset': ['Id'],
|
|
505
|
+
'AWS::MediaConvert::Queue': ['Id'],
|
|
506
|
+
'AWS::Route53::RecordSet': ['Id'],
|
|
507
|
+
'AWS::SageMaker::Device': ['Device/DeviceName'],
|
|
508
|
+
'AWS::SecretsManager::ResourcePolicy': ['Id'],
|
|
509
|
+
'AWS::SecretsManager::SecretTargetAttachment': ['Id'],
|
|
510
|
+
'AWS::SES::ReceiptRuleSet': ['Id'],
|
|
511
|
+
'AWS::SSM::MaintenanceWindowTarget': ['WindowId', 'WindowTargetId'],
|
|
512
|
+
'AWS::SSM::MaintenanceWindowTask': ['WindowId', 'WindowTaskId'],
|
|
513
|
+
};
|
|
379
514
|
/**
|
|
380
515
|
* Usually, we deduce the names of the service and the resource type used to format the ARN from the CloudFormation resource type.
|
|
381
516
|
* For a CFN type like AWS::Service::ResourceType, the second segment becomes the service name, and the third the resource type
|
|
@@ -453,4 +588,4 @@ async function asyncGlobalReplace(str, regex, cb) {
|
|
|
453
588
|
ret.push(str.slice(start));
|
|
454
589
|
return ret.join('');
|
|
455
590
|
}
|
|
456
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdGUtY2xvdWRmb3JtYXRpb24tdGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJldmFsdWF0ZS1jbG91ZGZvcm1hdGlvbi10ZW1wbGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSwrREFBMkQ7QUFHM0QsNERBQXdEO0FBTXhELE1BQWEsc0JBQXNCO0lBSWQ7SUFDQTtJQUpYLGNBQWMsQ0FBOEM7SUFFcEUsWUFDbUIsR0FBUSxFQUNSLFNBQWlCO1FBRGpCLFFBQUcsR0FBSCxHQUFHLENBQUs7UUFDUixjQUFTLEdBQVQsU0FBUyxDQUFRO0lBRXBDLENBQUM7SUFFTSxLQUFLLENBQUMsa0JBQWtCO1FBQzdCLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsa0JBQWtCLENBQUM7Z0JBQ2pFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUzthQUMxQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7Q0FDRjtBQWpCRCx3REFpQkM7QUFNRCxNQUFhLGlCQUFrQixTQUFRLEtBQUs7Q0FDM0M7QUFERCw4Q0FDQztBQUVELE1BQWEsZ0JBQWdCO0lBR0U7SUFGckIsYUFBYSxHQUErQixFQUFFLENBQUM7SUFFdkQsWUFBNkIsR0FBUTtRQUFSLFFBQUcsR0FBSCxHQUFHLENBQUs7SUFDckMsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBWTtRQUM3QixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVELElBQUksS0FBSyxFQUFFLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFX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Q0FBQztJQUUzQixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0IH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktYXBpJztcbmltcG9ydCB0eXBlIHsgRXhwb3J0LCBMaXN0RXhwb3J0c0NvbW1hbmRPdXRwdXQsIFN0YWNrUmVzb3VyY2VTdW1tYXJ5IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB0eXBlIHsgTmVzdGVkU3RhY2tUZW1wbGF0ZXMgfSBmcm9tICcuL25lc3RlZC1zdGFjay1oZWxwZXJzJztcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tICcuL3N0YWNrLWhlbHBlcnMnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC90b29sa2l0LWVycm9yJztcbmltcG9ydCB0eXBlIHsgU0RLIH0gZnJvbSAnLi4vYXdzLWF1dGgvcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlTWV0YWRhdGEgfSBmcm9tICcuLi9yZXNvdXJjZS1tZXRhZGF0YSc7XG5pbXBvcnQgeyByZXNvdXJjZU1ldGFkYXRhIH0gZnJvbSAnLi4vcmVzb3VyY2UtbWV0YWRhdGEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RTdGFja1Jlc291cmNlcyB7XG4gIGxpc3RTdGFja1Jlc291cmNlcygpOiBQcm9taXNlPFN0YWNrUmVzb3VyY2VTdW1tYXJ5W10+O1xufVxuXG5leHBvcnQgY2xhc3MgTGF6eUxpc3RTdGFja1Jlc291cmNlcyBpbXBsZW1lbnRzIExpc3RTdGFja1Jlc291cmNlcyB7XG4gIHByaXZhdGUgc3RhY2tSZXNvdXJjZXM6IFByb21pc2U8U3RhY2tSZXNvdXJjZVN1bW1hcnlbXT4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZGs6IFNESyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nLFxuICApIHtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsaXN0U3RhY2tSZXNvdXJjZXMoKTogUHJvbWlzZTxTdGFja1Jlc291cmNlU3VtbWFyeVtdPiB7XG4gICAgaWYgKHRoaXMuc3RhY2tSZXNvdXJjZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdGFja1Jlc291cmNlcyA9IHRoaXMuc2RrLmNsb3VkRm9ybWF0aW9uKCkubGlzdFN0YWNrUmVzb3VyY2VzKHtcbiAgICAgICAgU3RhY2tOYW1lOiB0aGlzLnN0YWNrTmFtZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGFja1Jlc291cmNlcztcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvb2t1cEV4cG9ydCB7XG4gIGxvb2t1cEV4cG9ydChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEV4cG9ydCB8IHVuZGVmaW5lZD47XG59XG5cbmV4cG9ydCBjbGFzcyBMb29rdXBFeHBvcnRFcnJvciBleHRlbmRzIEVycm9yIHtcbn1cblxuZXhwb3J0IGNsYXNzIExhenlMb29rdXBFeHBvcnQgaW1wbGVtZW50cyBMb29rdXBFeHBvcnQge1xuICBwcml2YXRlIGNhY2hlZEV4cG9ydHM6IHsgW25hbWU6IHN0cmluZ106IEV4cG9ydCB9ID0ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBzZGs6IFNESykge1xuICB9XG5cbiAgYXN5bmMgbG9va3VwRXhwb3J0KG5hbWU6IHN0cmluZyk6IFByb21pc2U8RXhwb3J0IHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKHRoaXMuY2FjaGVkRXhwb3J0c1tuYW1lXSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkRXhwb3J0c1tuYW1lXTtcbiAgICB9XG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGNmbkV4cG9ydCBvZiB0aGlzLmxpc3RFeHBvcnRzKCkpIHtcbiAgICAgIGlmICghY2ZuRXhwb3J0Lk5hbWUpIHtcbiAgICAgICAgY29udGludWU7IC8vIGlnbm9yZSBhbnkgcmVzdWx0IHRoYXQgb21pdHMgYSBuYW1lXG4gICAgICB9XG4gICAgICB0aGlzLmNhY2hlZEV4cG9ydHNbY2ZuRXhwb3J0Lk5hbWVdID0gY2ZuRXhwb3J0O1xuXG4gICAgICBpZiAoY2ZuRXhwb3J0Lk5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGNmbkV4cG9ydDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBleHBvcnQgbm90IGZvdW5kXG4gIH1cblxuICAvLyBUT0RPOiBQYWdpbmF0ZVxuICBwcml2YXRlIGFzeW5jICpsaXN0RXhwb3J0cygpIHtcbiAgICBsZXQgbmV4dFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBMaXN0RXhwb3J0c0NvbW1hbmRPdXRwdXQgPSBhd2FpdCB0aGlzLnNkay5jbG91ZEZvcm1hdGlvbigpLmxpc3RFeHBvcnRzKHsgTmV4dFRva2VuOiBuZXh0VG9rZW4gfSk7XG4gICAgICBmb3IgKGNvbnN0IGNmbkV4cG9ydCBvZiByZXNwb25zZS5FeHBvcnRzID8/IFtdKSB7XG4gICAgICAgIHlpZWxkIGNmbkV4cG9ydDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZXNwb25zZS5OZXh0VG9rZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbmV4dFRva2VuID0gcmVzcG9uc2UuTmV4dFRva2VuO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZURlZmluaXRpb24ge1xuICByZWFkb25seSBMb2dpY2FsSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgVHlwZTogc3RyaW5nO1xuICByZWFkb25seSBQcm9wZXJ0aWVzOiB7IFtwOiBzdHJpbmddOiBhbnkgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGVQcm9wcyB7XG4gIHJlYWRvbmx5IHN0YWNrQXJ0aWZhY3Q6IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcbiAgcmVhZG9ubHkgc3RhY2tOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSB0ZW1wbGF0ZT86IFRlbXBsYXRlO1xuICByZWFkb25seSBwYXJhbWV0ZXJzOiB7IFtwYXJhbWV0ZXJOYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgcmVhZG9ubHkgYWNjb3VudDogc3RyaW5nO1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcbiAgcmVhZG9ubHkgcGFydGl0aW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNkazogU0RLO1xuICByZWFkb25seSBuZXN0ZWRTdGFja3M/OiB7XG4gICAgW25lc3RlZFN0YWNrTG9naWNhbElkOiBzdHJpbmddOiBOZXN0ZWRTdGFja1RlbXBsYXRlcztcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSB7XG4gIHB1YmxpYyByZWFkb25seSBzdGFja0FydGlmYWN0OiBDbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGU6IFRlbXBsYXRlO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHQ6IHsgW2s6IHN0cmluZ106IGFueSB9O1xuICBwcml2YXRlIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJ0aXRpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzZGs6IFNESztcbiAgcHJpdmF0ZSByZWFkb25seSBuZXN0ZWRTdGFja3M6IHtcbiAgICBbbmVzdGVkU3RhY2tMb2dpY2FsSWQ6IHN0cmluZ106IE5lc3RlZFN0YWNrVGVtcGxhdGVzO1xuICB9O1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrUmVzb3VyY2VzOiBMaXN0U3RhY2tSZXNvdXJjZXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9va3VwRXhwb3J0OiBMb29rdXBFeHBvcnQ7XG5cbiAgcHJpdmF0ZSBjYWNoZWRVcmxTdWZmaXg6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlUHJvcHMpIHtcbiAgICB0aGlzLnN0YWNrQXJ0aWZhY3QgPSBwcm9wcy5zdGFja0FydGlmYWN0O1xuICAgIHRoaXMuc3RhY2tOYW1lID0gcHJvcHMuc3RhY2tOYW1lID8/IHByb3BzLnN0YWNrQXJ0aWZhY3Quc3RhY2tOYW1lO1xuICAgIHRoaXMudGVtcGxhdGUgPSBwcm9wcy50ZW1wbGF0ZSA/PyBwcm9wcy5zdGFja0FydGlmYWN0LnRlbXBsYXRlO1xuICAgIHRoaXMuY29udGV4dCA9IHtcbiAgICAgICdBV1M6OkFjY291bnRJZCc6IHByb3BzLmFjY291bnQsXG4gICAgICAnQVdTOjpSZWdpb24nOiBwcm9wcy5yZWdpb24sXG4gICAgICAnQVdTOjpQYXJ0aXRpb24nOiBwcm9wcy5wYXJ0aXRpb24sXG4gICAgICAuLi5wcm9wcy5wYXJhbWV0ZXJzLFxuICAgIH07XG4gICAgdGhpcy5hY2NvdW50ID0gcHJvcHMuYWNjb3VudDtcbiAgICB0aGlzLnJlZ2lvbiA9IHByb3BzLnJlZ2lvbjtcbiAgICB0aGlzLnBhcnRpdGlvbiA9IHByb3BzLnBhcnRpdGlvbjtcbiAgICB0aGlzLnNkayA9IHByb3BzLnNkaztcblxuICAgIC8vIFdlIG5lZWQgbmFtZXMgb2YgbmVzdGVkIHN0YWNrIHNvIHdlIGNhbiBldmFsdWF0ZSBjcm9zcyBzdGFjayByZWZlcmVuY2VzXG4gICAgdGhpcy5uZXN0ZWRTdGFja3MgPSBwcm9wcy5uZXN0ZWRTdGFja3MgPz8ge307XG5cbiAgICAvLyBUaGUgY3VycmVudCByZXNvdXJjZXMgb2YgdGhlIFN0YWNrLlxuICAgIC8vIFdlIG5lZWQgdGhlbSB0byBmaWd1cmUgb3V0IHRoZSBwaHlzaWNhbCBuYW1lIG9mIGEgcmVzb3VyY2UgaW4gY2FzZSBpdCB3YXNuJ3Qgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLlxuICAgIC8vIFdlIGZldGNoIGl0IGxhemlseSwgdG8gc2F2ZSBhIHNlcnZpY2UgY2FsbCwgaW4gY2FzZSBhbGwgaG90c3dhcHBlZCByZXNvdXJjZXMgaGF2ZSB0aGVpciBwaHlzaWNhbCBuYW1lcyBzZXQuXG4gICAgdGhpcy5zdGFja1Jlc291cmNlcyA9IG5ldyBMYXp5TGlzdFN0YWNrUmVzb3VyY2VzKHRoaXMuc2RrLCB0aGlzLnN0YWNrTmFtZSk7XG5cbiAgICAvLyBDbG91ZEZvcm1hdGlvbiBFeHBvcnRzIGxvb2t1cCB0byBiZSBhYmxlIHRvIHJlc29sdmUgRm46OkltcG9ydFZhbHVlIGludHJpbnNpY3MgaW4gdGVtcGxhdGVcbiAgICB0aGlzLmxvb2t1cEV4cG9ydCA9IG5ldyBMYXp5TG9va3VwRXhwb3J0KHRoaXMuc2RrKTtcbiAgfVxuXG4gIC8vIGNsb25lcyBjdXJyZW50IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSBvYmplY3QsIGJ1dCB1cGRhdGVzIHRoZSBzdGFjayBuYW1lXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVOZXN0ZWRFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUoXG4gICAgc3RhY2tOYW1lOiBzdHJpbmcsXG4gICAgbmVzdGVkVGVtcGxhdGU6IFRlbXBsYXRlLFxuICAgIG5lc3RlZFN0YWNrUGFyYW1ldGVyczogeyBbcGFyYW1ldGVyTmFtZTogc3RyaW5nXTogYW55IH0sXG4gICkge1xuICAgIGNvbnN0IGV2YWx1YXRlZFBhcmFtcyA9IGF3YWl0IHRoaXMuZXZhbHVhdGVDZm5FeHByZXNzaW9uKG5lc3RlZFN0YWNrUGFyYW1ldGVycyk7XG4gICAgcmV0dXJuIG5ldyBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUoe1xuICAgICAgc3RhY2tBcnRpZmFjdDogdGhpcy5zdGFja0FydGlmYWN0LFxuICAgICAgc3RhY2tOYW1lLFxuICAgICAgdGVtcGxhdGU6IG5lc3RlZFRlbXBsYXRlLFxuICAgICAgcGFyYW1ldGVyczogZXZhbHVhdGVkUGFyYW1zLFxuICAgICAgYWNjb3VudDogdGhpcy5hY2NvdW50LFxuICAgICAgcmVnaW9uOiB0aGlzLnJlZ2lvbixcbiAgICAgIHBhcnRpdGlvbjogdGhpcy5wYXJ0aXRpb24sXG4gICAgICBzZGs6IHRoaXMuc2RrLFxuICAgICAgbmVzdGVkU3RhY2tzOiB0aGlzLm5lc3RlZFN0YWNrcyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBlc3RhYmxpc2hSZXNvdXJjZVBoeXNpY2FsTmFtZShcbiAgICBsb2dpY2FsSWQ6IHN0cmluZyxcbiAgICBwaHlzaWNhbE5hbWVJbkNmblRlbXBsYXRlOiBhbnksXG4gICk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKHBoeXNpY2FsTmFtZUluQ2ZuVGVtcGxhdGUgIT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXZhbHVhdGVDZm5FeHByZXNzaW9uKHBoeXNpY2FsTmFtZUluQ2ZuVGVtcGxhdGUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZiB3ZSBjYW4ndCBldmFsdWF0ZSB0aGUgcmVzb3VyY2UncyBuYW1lIENsb3VkRm9ybWF0aW9uIGV4cHJlc3Npb24sXG4gICAgICAgIC8vIGp1c3QgbG9vayBpdCB1cCBpbiB0aGUgY3VycmVudGx5IGRlcGxveWVkIFN0YWNrXG4gICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uKSkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmluZFBoeXNpY2FsTmFtZUZvcihsb2dpY2FsSWQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZpbmRQaHlzaWNhbE5hbWVGb3IobG9naWNhbElkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHN0YWNrUmVzb3VyY2VzID0gYXdhaXQgdGhpcy5zdGFja1Jlc291cmNlcy5saXN0U3RhY2tSZXNvdXJjZXMoKTtcbiAgICByZXR1cm4gc3RhY2tSZXNvdXJjZXMuZmluZCgoc3IpID0+IHNyLkxvZ2ljYWxSZXNvdXJjZUlkID09PSBsb2dpY2FsSWQpPy5QaHlzaWNhbFJlc291cmNlSWQ7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZmluZExvZ2ljYWxJZEZvclBoeXNpY2FsTmFtZShwaHlzaWNhbE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc3RhY2tSZXNvdXJjZXMgPSBhd2FpdCB0aGlzLnN0YWNrUmVzb3VyY2VzLmxpc3RTdGFja1Jlc291cmNlcygpO1xuICAgIHJldHVybiBzdGFja1Jlc291cmNlcy5maW5kKChzcikgPT4gc3IuUGh5c2ljYWxSZXNvdXJjZUlkID09PSBwaHlzaWNhbE5hbWUpPy5Mb2dpY2FsUmVzb3VyY2VJZDtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUmVmZXJlbmNlc1RvKGxvZ2ljYWxJZDogc3RyaW5nKTogQXJyYXk8UmVzb3VyY2VEZWZpbml0aW9uPiB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFJlc291cmNlRGVmaW5pdGlvbj4oKTtcbiAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZUxvZ2ljYWxJZCwgcmVzb3VyY2VEZWZdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMudGVtcGxhdGU/LlJlc291cmNlcyA/PyB7fSkpIHtcbiAgICAgIGlmIChsb2dpY2FsSWQgIT09IHJlc291cmNlTG9naWNhbElkICYmIHRoaXMucmVmZXJlbmNlcyhsb2dpY2FsSWQsIHJlc291cmNlRGVmKSkge1xuICAgICAgICByZXQucHVzaCh7XG4gICAgICAgICAgLi4uKHJlc291cmNlRGVmIGFzIGFueSksXG4gICAgICAgICAgTG9naWNhbElkOiByZXNvdXJjZUxvZ2ljYWxJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZXZhbHVhdGVDZm5FeHByZXNzaW9uKGNmbkV4cHJlc3Npb246IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgLyoqXG4gICAgICogRXZhbHVhdGVzIENsb3VkRm9ybWF0aW9uIGludHJpbnNpYyBmdW5jdGlvbnNcbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBzdXBwb3J0ZWQgaW50cmluc2ljIGZ1bmN0aW9ucyBhcmUgZG9jdW1lbnRlZCBpbiBSRUFETUUubWQgLS0gcGxlYXNlIHVwZGF0ZVxuICAgICAqIGxpc3Qgb2Ygc3VwcG9ydGVkIGZ1bmN0aW9ucyB3aGVuIGFkZGluZyBuZXcgZXZhbHVhdGlvbnNcbiAgICAgKlxuICAgICAqIFNlZTogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvaW50cmluc2ljLWZ1bmN0aW9uLXJlZmVyZW5jZS5odG1sXG4gICAgICovXG4gICAgY2xhc3MgQ2ZuSW50cmluc2ljcyB7XG4gICAgICBwdWJsaWMgZXZhbHVhdGVJbnRyaW5zaWMoaW50cmluc2ljOiBJbnRyaW5zaWMpOiBhbnkge1xuICAgICAgICBjb25zdCBpbnRyaW5zaWNGdW5jID0gKHRoaXMgYXMgYW55KVtpbnRyaW5zaWMubmFtZV07XG4gICAgICAgIGlmICghaW50cmluc2ljRnVuYykge1xuICAgICAgICAgIHRocm93IG5ldyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uKGBDbG91ZEZvcm1hdGlvbiBmdW5jdGlvbiAke2ludHJpbnNpYy5uYW1lfSBpcyBub3Qgc3VwcG9ydGVkYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmdzQXNBcnJheSA9IEFycmF5LmlzQXJyYXkoaW50cmluc2ljLmFyZ3MpID8gaW50cmluc2ljLmFyZ3MgOiBbaW50cmluc2ljLmFyZ3NdO1xuXG4gICAgICAgIHJldHVybiBpbnRyaW5zaWNGdW5jLmFwcGx5KHRoaXMsIGFyZ3NBc0FycmF5KTtcbiAgICAgIH1cblxuICAgICAgYXN5bmMgJ0ZuOjpKb2luJyhzZXBhcmF0b3I6IHN0cmluZywgYXJnczogYW55W10pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBldmFsdWF0ZWRBcmdzID0gYXdhaXQgc2VsZi5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oYXJncyk7XG4gICAgICAgIHJldHVybiBldmFsdWF0ZWRBcmdzLmpvaW4oc2VwYXJhdG9yKTtcbiAgICAgIH1cblxuICAgICAgYXN5bmMgJ0ZuOjpTcGxpdCcoc2VwYXJhdG9yOiBzdHJpbmcsIGFyZ3M6IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGV2YWx1YXRlZEFyZ3MgPSBhd2FpdCBzZWxmLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihhcmdzKTtcbiAgICAgICAgcmV0dXJuIGV2YWx1YXRlZEFyZ3Muc3BsaXQoc2VwYXJhdG9yKTtcbiAgICAgIH1cblxuICAgICAgYXN5bmMgJ0ZuOjpTZWxlY3QnKGluZGV4OiBudW1iZXIsIGFyZ3M6IGFueVtdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgZXZhbHVhdGVkQXJncyA9IGF3YWl0IHNlbGYuZXZhbHVhdGVDZm5FeHByZXNzaW9uKGFyZ3MpO1xuICAgICAgICByZXR1cm4gZXZhbHVhdGVkQXJnc1tpbmRleF07XG4gICAgICB9XG5cbiAgICAgIGFzeW5jIFJlZihsb2dpY2FsSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHJlZlRhcmdldCA9IGF3YWl0IHNlbGYuZmluZFJlZlRhcmdldChsb2dpY2FsSWQpO1xuICAgICAgICBpZiAocmVmVGFyZ2V0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlZlRhcmdldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbihgUGFyYW1ldGVyIG9yIHJlc291cmNlICcke2xvZ2ljYWxJZH0nIGNvdWxkIG5vdCBiZSBmb3VuZCBmb3IgZXZhbHVhdGlvbmApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFzeW5jICdGbjo6R2V0QXR0Jyhsb2dpY2FsSWQ6IHN0cmluZywgYXR0cmlidXRlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgLy8gVG9EbyBoYW5kbGUgdGhlICdsb2dpY2FsSWQuYXR0cmlidXRlTmFtZScgZm9ybSBvZiBGbjo6R2V0QXR0XG4gICAgICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGF3YWl0IHNlbGYuZmluZEdldEF0dFRhcmdldChsb2dpY2FsSWQsIGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICBpZiAoYXR0clZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGF0dHJWYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbihcbiAgICAgICAgICAgIGBBdHRyaWJ1dGUgJyR7YXR0cmlidXRlTmFtZX0nIG9mIHJlc291cmNlICcke2xvZ2ljYWxJZH0nIGNvdWxkIG5vdCBiZSBmb3VuZCBmb3IgZXZhbHVhdGlvbmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhc3luYyAnRm46OlN1YicodGVtcGxhdGU6IHN0cmluZywgZXhwbGljaXRQbGFjZWhvbGRlcnM/OiB7IFt2YXJpYWJsZTogc3RyaW5nXTogc3RyaW5nIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSBleHBsaWNpdFBsYWNlaG9sZGVycyA/IGF3YWl0IHNlbGYuZXZhbHVhdGVDZm5FeHByZXNzaW9uKGV4cGxpY2l0UGxhY2Vob2xkZXJzKSA6IHt9O1xuXG4gICAgICAgIHJldHVybiBhc3luY0dsb2JhbFJlcGxhY2UodGVtcGxhdGUsIC9cXCR7KFtefV0qKX0vZywgKGtleSkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgaW4gcGxhY2Vob2xkZXJzKSB7XG4gICAgICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXJzW2tleV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0S2V5ID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICByZXR1cm4gc3BsaXRLZXkubGVuZ3RoID09PSAxID8gdGhpcy5SZWYoa2V5KSA6IHRoaXNbJ0ZuOjpHZXRBdHQnXShzcGxpdEtleVswXSwgc3BsaXRLZXkuc2xpY2UoMSkuam9pbignLicpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBhc3luYyAnRm46OkltcG9ydFZhbHVlJyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBleHBvcnRlZCA9IGF3YWl0IHNlbGYubG9va3VwRXhwb3J0Lmxvb2t1cEV4cG9ydChuYW1lKTtcbiAgICAgICAgaWYgKCFleHBvcnRlZCkge1xuICAgICAgICAgIHRocm93IG5ldyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uKGBFeHBvcnQgJyR7bmFtZX0nIGNvdWxkIG5vdCBiZSBmb3VuZCBmb3IgZXZhbHVhdGlvbmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXhwb3J0ZWQuVmFsdWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbihgRXhwb3J0ICcke25hbWV9JyBleGlzdHMgd2l0aG91dCBhIHZhbHVlYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4cG9ydGVkLlZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjZm5FeHByZXNzaW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiBjZm5FeHByZXNzaW9uO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGNmbkV4cHJlc3Npb24pKSB7XG4gICAgICAvLyBTbWFsbCBhcnJheXMgaW4gcHJhY3RpY2VcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAY2RrbGFicy9wcm9taXNlYWxsLW5vLXVuYm91bmRlZC1wYXJhbGxlbGlzbVxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGNmbkV4cHJlc3Npb24ubWFwKChleHByKSA9PiB0aGlzLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihleHByKSkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2ZuRXhwcmVzc2lvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IGludHJpbnNpYyA9IHRoaXMucGFyc2VJbnRyaW5zaWMoY2ZuRXhwcmVzc2lvbik7XG4gICAgICBpZiAoaW50cmluc2ljKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2ZuSW50cmluc2ljcygpLmV2YWx1YXRlSW50cmluc2ljKGludHJpbnNpYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKGNmbkV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgcmV0W2tleV0gPSBhd2FpdCB0aGlzLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbih2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNmbkV4cHJlc3Npb247XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVzb3VyY2VQcm9wZXJ0eShsb2dpY2FsSWQ6IHN0cmluZywgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLlJlc291cmNlcz8uW2xvZ2ljYWxJZF0/LlByb3BlcnRpZXM/Lltwcm9wZXJ0eU5hbWVdO1xuICB9XG5cbiAgcHVibGljIG1ldGFkYXRhRm9yKGxvZ2ljYWxJZDogc3RyaW5nKTogUmVzb3VyY2VNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHJlc291cmNlTWV0YWRhdGEodGhpcy5zdGFja0FydGlmYWN0LCBsb2dpY2FsSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZlcmVuY2VzKGxvZ2ljYWxJZDogc3RyaW5nLCB0ZW1wbGF0ZUVsZW1lbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdGVtcGxhdGVFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGxvZ2ljYWxJZCA9PT0gdGVtcGxhdGVFbGVtZW50O1xuICAgIH1cblxuICAgIGlmICh0ZW1wbGF0ZUVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRlbXBsYXRlRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiB0ZW1wbGF0ZUVsZW1lbnQuc29tZSgoZWwpID0+IHRoaXMucmVmZXJlbmNlcyhsb2dpY2FsSWQsIGVsKSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0ZW1wbGF0ZUVsZW1lbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0ZW1wbGF0ZUVsZW1lbnQpLnNvbWUoKGVsKSA9PiB0aGlzLnJlZmVyZW5jZXMobG9naWNhbElkLCBlbCkpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VJbnRyaW5zaWMoeDogYW55KTogSW50cmluc2ljIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoeCk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAxICYmIChrZXlzWzBdLnN0YXJ0c1dpdGgoJ0ZuOjonKSB8fCBrZXlzWzBdID09PSAnUmVmJykpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGtleXNbMF0sXG4gICAgICAgIGFyZ3M6IHhba2V5c1swXV0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kUmVmVGFyZ2V0KGxvZ2ljYWxJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBmaXJzdCwgY2hlY2sgdG8gc2VlIGlmIHRoZSBSZWYgaXMgYSBQYXJhbWV0ZXIgd2hvJ3MgdmFsdWUgd2UgaGF2ZVxuICAgIGlmIChsb2dpY2FsSWQgPT09ICdBV1M6OlVSTFN1ZmZpeCcpIHtcbiAgICAgIGlmICghdGhpcy5jYWNoZWRVcmxTdWZmaXgpIHtcbiAgICAgICAgdGhpcy5jYWNoZWRVcmxTdWZmaXggPSBhd2FpdCB0aGlzLnNkay5nZXRVcmxTdWZmaXgodGhpcy5yZWdpb24pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jYWNoZWRVcmxTdWZmaXg7XG4gICAgfVxuXG4gICAgLy8gVHJ5IGZpbmRpbmcgdGhlIHJlZiBpbiB0aGUgcGFzc2VkIGluIHBhcmFtZXRlcnNcbiAgICBjb25zdCBwYXJhbWV0ZXJUYXJnZXQgPSB0aGlzLmNvbnRleHRbbG9naWNhbElkXTtcbiAgICBpZiAocGFyYW1ldGVyVGFyZ2V0KSB7XG4gICAgICByZXR1cm4gcGFyYW1ldGVyVGFyZ2V0O1xuICAgIH1cblxuICAgIC8vIElmIG5vdCBpbiB0aGUgcGFzc2VkIGluIHBhcmFtZXRlcnMsIHNlZSBpZiB0aGVyZSBpcyBhIGRlZmF1bHQgdmFsdWUgaW4gdGhlIHRlbXBsYXRlIHBhcmFtZXRlciB0aGF0IHdhcyBub3QgcGFzc2VkIGluXG4gICAgY29uc3QgZGVmYXVsdFBhcmFtZXRlclZhbHVlID0gdGhpcy50ZW1wbGF0ZS5QYXJhbWV0ZXJzPy5bbG9naWNhbElkXT8uRGVmYXVsdDtcbiAgICBpZiAoZGVmYXVsdFBhcmFtZXRlclZhbHVlKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFBhcmFtZXRlclZhbHVlO1xuICAgIH1cblxuICAgIC8vIGlmIGl0J3Mgbm90IGEgUGFyYW1ldGVyLCB3ZSBuZWVkIHRvIHNlYXJjaCBpbiB0aGUgY3VycmVudCBTdGFjayByZXNvdXJjZXNcbiAgICByZXR1cm4gdGhpcy5maW5kR2V0QXR0VGFyZ2V0KGxvZ2ljYWxJZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmRHZXRBdHRUYXJnZXQobG9naWNhbElkOiBzdHJpbmcsIGF0dHJpYnV0ZT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgdGhlIGF0dHJpYnV0ZSBpcyByZWZlcmVuY2luZyBhIHN0YWNrIG91dHB1dCAodXNlZCBpbiBuZXN0ZWQgc3RhY2tzIHRvIHNoYXJlIHBhcmFtZXRlcnMpXG4gICAgLy8gU2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL3F1aWNrcmVmLWNsb3VkZm9ybWF0aW9uLmh0bWwjdzJhYjFjMTdjMjNjMTliNVxuICAgIGlmIChsb2dpY2FsSWQgPT09ICdPdXRwdXRzJyAmJiBhdHRyaWJ1dGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbih0aGlzLnRlbXBsYXRlLk91dHB1dHNbYXR0cmlidXRlXT8uVmFsdWUpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWNrUmVzb3VyY2VzID0gYXdhaXQgdGhpcy5zdGFja1Jlc291cmNlcy5saXN0U3RhY2tSZXNvdXJjZXMoKTtcbiAgICBjb25zdCBmb3VuZFJlc291cmNlID0gc3RhY2tSZXNvdXJjZXMuZmluZCgoc3IpID0+IHNyLkxvZ2ljYWxSZXNvdXJjZUlkID09PSBsb2dpY2FsSWQpO1xuICAgIGlmICghZm91bmRSZXNvdXJjZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoZm91bmRSZXNvdXJjZS5SZXNvdXJjZVR5cGUgPT0gJ0FXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrJyAmJiBhdHRyaWJ1dGU/LnN0YXJ0c1dpdGgoJ091dHB1dHMuJykpIHtcbiAgICAgIGNvbnN0IGRlcGVuZGFudFN0YWNrID0gdGhpcy5maW5kTmVzdGVkU3RhY2sobG9naWNhbElkLCB0aGlzLm5lc3RlZFN0YWNrcyk7XG4gICAgICBpZiAoIWRlcGVuZGFudFN0YWNrIHx8ICFkZXBlbmRhbnRTdGFjay5waHlzaWNhbE5hbWUpIHtcbiAgICAgICAgLy8gdGhpcyBpcyBhIG5ld2x5IGNyZWF0ZWQgbmVzdGVkIHN0YWNrIGFuZCBjYW5ub3QgYmUgaG90c3dhcHBlZFxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgY29uc3QgZXZhbHVhdGVDZm5UZW1wbGF0ZSA9IGF3YWl0IHRoaXMuY3JlYXRlTmVzdGVkRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlKFxuICAgICAgICBkZXBlbmRhbnRTdGFjay5waHlzaWNhbE5hbWUsXG4gICAgICAgIGRlcGVuZGFudFN0YWNrLmdlbmVyYXRlZFRlbXBsYXRlLFxuICAgICAgICBkZXBlbmRhbnRTdGFjay5nZW5lcmF0ZWRUZW1wbGF0ZS5QYXJhbWV0ZXJzISxcbiAgICAgICk7XG5cbiAgICAgIC8vIFNwbGl0IE91dHB1dHMuPHJlZk5hbWU+IGludG8gJ091dHB1dHMnIGFuZCAnPHJlZk5hbWU+JyBhbmQgcmVjdXJzaXZlbHkgY2FsbCBldmFsdWF0ZVxuICAgICAgcmV0dXJuIGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZXZhbHVhdGVDZm5FeHByZXNzaW9uKHtcbiAgICAgICAgJ0ZuOjpHZXRBdHQnOiBhdHRyaWJ1dGUuc3BsaXQoL1xcLiguKikvcyksXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gbm93LCB3ZSBuZWVkIHRvIGZvcm1hdCB0aGUgYXBwcm9wcmlhdGUgaWRlbnRpZmllciBkZXBlbmRpbmcgb24gdGhlIHJlc291cmNlIHR5cGUsXG4gICAgLy8gYW5kIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlIG5hbWVcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRSZXNvdXJjZUF0dHJpYnV0ZShmb3VuZFJlc291cmNlLCBhdHRyaWJ1dGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kTmVzdGVkU3RhY2soXG4gICAgbG9naWNhbElkOiBzdHJpbmcsXG4gICAgbmVzdGVkU3RhY2tzOiB7XG4gICAgICBbbmVzdGVkU3RhY2tMb2dpY2FsSWQ6IHN0cmluZ106IE5lc3RlZFN0YWNrVGVtcGxhdGVzO1xuICAgIH0sXG4gICk6IE5lc3RlZFN0YWNrVGVtcGxhdGVzIHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGNvbnN0IG5lc3RlZFN0YWNrTG9naWNhbElkIG9mIE9iamVjdC5rZXlzKG5lc3RlZFN0YWNrcykpIHtcbiAgICAgIGlmIChuZXN0ZWRTdGFja0xvZ2ljYWxJZCA9PT0gbG9naWNhbElkKSB7XG4gICAgICAgIHJldHVybiBuZXN0ZWRTdGFja3NbbmVzdGVkU3RhY2tMb2dpY2FsSWRdO1xuICAgICAgfVxuICAgICAgY29uc3QgY2hlY2tJbk5lc3RlZENoaWxkU3RhY2tzID0gdGhpcy5maW5kTmVzdGVkU3RhY2soXG4gICAgICAgIGxvZ2ljYWxJZCxcbiAgICAgICAgbmVzdGVkU3RhY2tzW25lc3RlZFN0YWNrTG9naWNhbElkXS5uZXN0ZWRTdGFja1RlbXBsYXRlcyxcbiAgICAgICk7XG4gICAgICBpZiAoY2hlY2tJbk5lc3RlZENoaWxkU3RhY2tzKSByZXR1cm4gY2hlY2tJbk5lc3RlZENoaWxkU3RhY2tzO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRSZXNvdXJjZUF0dHJpYnV0ZShyZXNvdXJjZTogU3RhY2tSZXNvdXJjZVN1bW1hcnksIGF0dHJpYnV0ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwaHlzaWNhbElkID0gcmVzb3VyY2UuUGh5c2ljYWxSZXNvdXJjZUlkO1xuXG4gICAgLy8gbm8gYXR0cmlidXRlIG1lYW5zIFJlZiBleHByZXNzaW9uLCBmb3Igd2hpY2ggd2UgdXNlIHRoZSBwaHlzaWNhbCBJRCBkaXJlY3RseVxuICAgIGlmICghYXR0cmlidXRlKSB7XG4gICAgICByZXR1cm4gcGh5c2ljYWxJZDtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZVR5cGVGb3JtYXRzID0gUkVTT1VSQ0VfVFlQRV9BVFRSSUJVVEVTX0ZPUk1BVFNbcmVzb3VyY2UuUmVzb3VyY2VUeXBlIV07XG4gICAgaWYgKCFyZXNvdXJjZVR5cGVGb3JtYXRzKSB7XG4gICAgICB0aHJvdyBuZXcgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbihcbiAgICAgICAgYFdlIGRvbid0IHN1cHBvcnQgYXR0cmlidXRlcyBvZiB0aGUgJyR7cmVzb3VyY2UuUmVzb3VyY2VUeXBlfScgcmVzb3VyY2UuIFRoaXMgaXMgYSBDREsgbGltaXRhdGlvbi4gYCArXG4gICAgICAgICAgJ1BsZWFzZSByZXBvcnQgaXQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy9uZXcvY2hvb3NlJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZUZtdEZ1bmMgPSByZXNvdXJjZVR5cGVGb3JtYXRzW2F0dHJpYnV0ZV07XG4gICAgaWYgKCFhdHRyaWJ1dGVGbXRGdW5jKSB7XG4gICAgICB0aHJvdyBuZXcgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbihcbiAgICAgICAgYFdlIGRvbid0IHN1cHBvcnQgdGhlICcke2F0dHJpYnV0ZX0nIGF0dHJpYnV0ZSBvZiB0aGUgJyR7cmVzb3VyY2UuUmVzb3VyY2VUeXBlfScgcmVzb3VyY2UuIFRoaXMgaXMgYSBDREsgbGltaXRhdGlvbi4gYCArXG4gICAgICAgICAgJ1BsZWFzZSByZXBvcnQgaXQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy9uZXcvY2hvb3NlJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmdldFNlcnZpY2VPZlJlc291cmNlKHJlc291cmNlKTtcbiAgICBjb25zdCByZXNvdXJjZVR5cGVBcm5QYXJ0ID0gdGhpcy5nZXRSZXNvdXJjZVR5cGVBcm5QYXJ0T2ZSZXNvdXJjZShyZXNvdXJjZSk7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZUZtdEZ1bmMoe1xuICAgICAgcGFydGl0aW9uOiB0aGlzLnBhcnRpdGlvbixcbiAgICAgIHNlcnZpY2UsXG4gICAgICByZWdpb246IHRoaXMucmVnaW9uLFxuICAgICAgYWNjb3VudDogdGhpcy5hY2NvdW50LFxuICAgICAgcmVzb3VyY2VUeXBlOiByZXNvdXJjZVR5cGVBcm5QYXJ0LFxuICAgICAgcmVzb3VyY2VOYW1lOiBwaHlzaWNhbElkISxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VydmljZU9mUmVzb3VyY2UocmVzb3VyY2U6IFN0YWNrUmVzb3VyY2VTdW1tYXJ5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb3VyY2UuUmVzb3VyY2VUeXBlIS5zcGxpdCgnOjonKVsxXS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZXNvdXJjZVR5cGVBcm5QYXJ0T2ZSZXNvdXJjZShyZXNvdXJjZTogU3RhY2tSZXNvdXJjZVN1bW1hcnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IHJlc291cmNlLlJlc291cmNlVHlwZSE7XG4gICAgY29uc3Qgc3BlY2lhbENhc2VSZXNvdXJjZVR5cGUgPSBSRVNPVVJDRV9UWVBFX1NQRUNJQUxfTkFNRVNbcmVzb3VyY2VUeXBlXT8ucmVzb3VyY2VUeXBlO1xuICAgIHJldHVybiBzcGVjaWFsQ2FzZVJlc291cmNlVHlwZVxuICAgICAgPyBzcGVjaWFsQ2FzZVJlc291cmNlVHlwZVxuICAgICAgOiAvLyB0aGlzIGlzIHRoZSBkZWZhdWx0IGNhc2VcbiAgICAgIHJlc291cmNlVHlwZS5zcGxpdCgnOjonKVsyXS50b0xvd2VyQ2FzZSgpO1xuICB9XG59XG5cbmludGVyZmFjZSBBcm5QYXJ0cyB7XG4gIHJlYWRvbmx5IHBhcnRpdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlc291cmNlVHlwZTogc3RyaW5nO1xuICByZWFkb25seSByZXNvdXJjZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBVc3VhbGx5LCB3ZSBkZWR1Y2UgdGhlIG5hbWVzIG9mIHRoZSBzZXJ2aWNlIGFuZCB0aGUgcmVzb3VyY2UgdHlwZSB1c2VkIHRvIGZvcm1hdCB0aGUgQVJOIGZyb20gdGhlIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIHR5cGUuXG4gKiBGb3IgYSBDRk4gdHlwZSBsaWtlIEFXUzo6U2VydmljZTo6UmVzb3VyY2VUeXBlLCB0aGUgc2Vjb25kIHNlZ21lbnQgYmVjb21lcyB0aGUgc2VydmljZSBuYW1lLCBhbmQgdGhlIHRoaXJkIHRoZSByZXNvdXJjZSB0eXBlXG4gKiAoYWZ0ZXIgY29udmVydGluZyBib3RoIG9mIHRoZW0gdG8gbG93ZXJjYXNlKS5cbiAqIEhvd2V2ZXIsIHNvbWUgcmVzb3VyY2UgdHlwZXMgYnJlYWsgdGhpcyBzaW1wbGUgY29udmVudGlvbiwgYW5kIHdlIG5lZWQgdG8gc3BlY2lhbC1jYXNlIHRoZW0uXG4gKiBUaGlzIG1hcCBpcyBmb3Igc3RvcmluZyB0aG9zZSBjYXNlcy5cbiAqL1xuY29uc3QgUkVTT1VSQ0VfVFlQRV9TUEVDSUFMX05BTUVTOiB7XG4gIFt0eXBlOiBzdHJpbmddOiB7IHJlc291cmNlVHlwZTogc3RyaW5nIH07XG59ID0ge1xuICAnQVdTOjpFdmVudHM6OkV2ZW50QnVzJzoge1xuICAgIHJlc291cmNlVHlwZTogJ2V2ZW50LWJ1cycsXG4gIH0sXG59O1xuXG5jb25zdCBSRVNPVVJDRV9UWVBFX0FUVFJJQlVURVNfRk9STUFUUzoge1xuICBbdHlwZTogc3RyaW5nXTogeyBbYXR0cmlidXRlOiBzdHJpbmddOiAocGFydHM6IEFyblBhcnRzKSA9PiBzdHJpbmcgfTtcbn0gPSB7XG4gICdBV1M6OklBTTo6Um9sZSc6IHsgQXJuOiBpYW1Bcm5GbXQgfSxcbiAgJ0FXUzo6SUFNOjpVc2VyJzogeyBBcm46IGlhbUFybkZtdCB9LFxuICAnQVdTOjpJQU06Okdyb3VwJzogeyBBcm46IGlhbUFybkZtdCB9LFxuICAnQVdTOjpTMzo6QnVja2V0JzogeyBBcm46IHMzQXJuRm10IH0sXG4gICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nOiB7IEFybjogc3RkQ29sb25SZXNvdXJjZUFybkZtdCB9LFxuICAnQVdTOjpFdmVudHM6OkV2ZW50QnVzJzoge1xuICAgIEFybjogc3RkU2xhc2hSZXNvdXJjZUFybkZtdCxcbiAgICAvLyB0aGUgbmFtZSBhdHRyaWJ1dGUgb2YgdGhlIEV2ZW50QnVzIGlzIHRoZSBzYW1lIGFzIHRoZSBSZWZcbiAgICBOYW1lOiAocGFydHMpID0+IHBhcnRzLnJlc291cmNlTmFtZSxcbiAgfSxcbiAgJ0FXUzo6RHluYW1vREI6OlRhYmxlJzogeyBBcm46IHN0ZFNsYXNoUmVzb3VyY2VBcm5GbXQgfSxcbiAgJ0FXUzo6QXBwU3luYzo6R3JhcGhRTEFwaSc6IHsgQXBpSWQ6IGFwcHN5bmNHcmFwaFFsQXBpQXBpSWRGbXQgfSxcbiAgJ0FXUzo6QXBwU3luYzo6RnVuY3Rpb25Db25maWd1cmF0aW9uJzoge1xuICAgIEZ1bmN0aW9uSWQ6IGFwcHN5bmNHcmFwaFFsRnVuY3Rpb25JREZtdCxcbiAgfSxcbiAgJ0FXUzo6QXBwU3luYzo6RGF0YVNvdXJjZSc6IHsgTmFtZTogYXBwc3luY0dyYXBoUWxEYXRhU291cmNlTmFtZUZtdCB9LFxuICAnQVdTOjpLTVM6OktleSc6IHsgQXJuOiBzdGRTbGFzaFJlc291cmNlQXJuRm10IH0sXG59O1xuXG5mdW5jdGlvbiBpYW1Bcm5GbXQocGFydHM6IEFyblBhcnRzKTogc3RyaW5nIHtcbiAgLy8gd2Ugc2tpcCByZWdpb24gZm9yIElBTSByZXNvdXJjZXNcbiAgcmV0dXJuIGBhcm46JHtwYXJ0cy5wYXJ0aXRpb259OiR7cGFydHMuc2VydmljZX06OiR7cGFydHMuYWNjb3VudH06JHtwYXJ0cy5yZXNvdXJjZVR5cGV9LyR7cGFydHMucmVzb3VyY2VOYW1lfWA7XG59XG5cbmZ1bmN0aW9uIHMzQXJuRm10KHBhcnRzOiBBcm5QYXJ0cyk6IHN0cmluZyB7XG4gIC8vIHdlIHNraXAgYWNjb3VudCwgcmVnaW9uIGFuZCByZXNvdXJjZVR5cGUgZm9yIFMzIHJlc291cmNlc1xuICByZXR1cm4gYGFybjoke3BhcnRzLnBhcnRpdGlvbn06JHtwYXJ0cy5zZXJ2aWNlfTo6OiR7cGFydHMucmVzb3VyY2VOYW1lfWA7XG59XG5cbmZ1bmN0aW9uIHN0ZENvbG9uUmVzb3VyY2VBcm5GbXQocGFydHM6IEFyblBhcnRzKTogc3RyaW5nIHtcbiAgLy8gdGhpcyBpcyBhIHN0YW5kYXJkIGZvcm1hdCBmb3IgQVJOcyBsaWtlOiBhcm46YXdzOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6cmVzb3VyY2VUeXBlOnJlc291cmNlTmFtZVxuICByZXR1cm4gYGFybjoke3BhcnRzLnBhcnRpdGlvbn06JHtwYXJ0cy5zZXJ2aWNlfToke3BhcnRzLnJlZ2lvbn06JHtwYXJ0cy5hY2NvdW50fToke3BhcnRzLnJlc291cmNlVHlwZX06JHtwYXJ0cy5yZXNvdXJjZU5hbWV9YDtcbn1cblxuZnVuY3Rpb24gc3RkU2xhc2hSZXNvdXJjZUFybkZtdChwYXJ0czogQXJuUGFydHMpOiBzdHJpbmcge1xuICAvLyB0aGlzIGlzIGEgc3RhbmRhcmQgZm9ybWF0IGZvciBBUk5zIGxpa2U6IGFybjphd3M6c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZVR5cGUvcmVzb3VyY2VOYW1lXG4gIHJldHVybiBgYXJuOiR7cGFydHMucGFydGl0aW9ufToke3BhcnRzLnNlcnZpY2V9OiR7cGFydHMucmVnaW9ufToke3BhcnRzLmFjY291bnR9OiR7cGFydHMucmVzb3VyY2VUeXBlfS8ke3BhcnRzLnJlc291cmNlTmFtZX1gO1xufVxuXG5mdW5jdGlvbiBhcHBzeW5jR3JhcGhRbEFwaUFwaUlkRm10KHBhcnRzOiBBcm5QYXJ0cyk6IHN0cmluZyB7XG4gIC8vIGFybjphd3M6YXBwc3luYzp1cy1lYXN0LTE6MTExMTExMTExMTExOmFwaXMvPGFwaUlkPlxuICByZXR1cm4gcGFydHMucmVzb3VyY2VOYW1lLnNwbGl0KCcvJylbMV07XG59XG5cbmZ1bmN0aW9uIGFwcHN5bmNHcmFwaFFsRnVuY3Rpb25JREZtdChwYXJ0czogQXJuUGFydHMpOiBzdHJpbmcge1xuICAvLyBhcm46YXdzOmFwcHN5bmM6dXMtZWFzdC0xOjExMTExMTExMTExMTphcGlzLzxhcGlJZD4vZnVuY3Rpb25zLzxmdW5jdGlvbklkPlxuICByZXR1cm4gcGFydHMucmVzb3VyY2VOYW1lLnNwbGl0KCcvJylbM107XG59XG5cbmZ1bmN0aW9uIGFwcHN5bmNHcmFwaFFsRGF0YVNvdXJjZU5hbWVGbXQocGFydHM6IEFyblBhcnRzKTogc3RyaW5nIHtcbiAgLy8gYXJuOmF3czphcHBzeW5jOnVzLWVhc3QtMToxMTExMTExMTExMTE6YXBpcy88YXBpSWQ+L2RhdGFzb3VyY2VzLzxuYW1lPlxuICByZXR1cm4gcGFydHMucmVzb3VyY2VOYW1lLnNwbGl0KCcvJylbM107XG59XG5cbmludGVyZmFjZSBJbnRyaW5zaWMge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IGFueTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXN5bmNHbG9iYWxSZXBsYWNlKHN0cjogc3RyaW5nLCByZWdleDogUmVnRXhwLCBjYjogKHg6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgaWYgKCFyZWdleC5nbG9iYWwpIHtcbiAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdSZWdleE1pc3NpbmdHbG9iYWxGbGFnJywgJ1JlZ2V4IG11c3QgYmUgY3JlYXRlZCB3aXRoIC9nIGZsYWcnKTtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIGxldCBzdGFydCA9IDA7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgbWF0Y2ggPSByZWdleC5leGVjKHN0cik7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0LnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgbWF0Y2guaW5kZXgpKTtcbiAgICByZXQucHVzaChhd2FpdCBjYihtYXRjaFsxXSkpO1xuXG4gICAgc3RhcnQgPSByZWdleC5sYXN0SW5kZXg7XG4gIH1cbiAgcmV0LnB1c2goc3RyLnNsaWNlKHN0YXJ0KSk7XG5cbiAgcmV0dXJuIHJldC5qb2luKCcnKTtcbn1cbiJdfQ==
|
|
591
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdGUtY2xvdWRmb3JtYXRpb24tdGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJldmFsdWF0ZS1jbG91ZGZvcm1hdGlvbi10ZW1wbGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSwrREFBMkQ7QUFHM0QsNERBQXdEO0FBTXhELE1BQWEsc0JBQXNCO0lBSWQ7SUFDQTtJQUpYLGNBQWMsQ0FBOEM7SUFFcEUsWUFDbUIsR0FBUSxFQUNSLFNBQWlCO1FBRGpCLFFBQUcsR0FBSCxHQUFHLENBQUs7UUFDUixjQUFTLEdBQVQsU0FBUyxDQUFRO0lBRXBDLENBQUM7SUFFTSxLQUFLLENBQUMsa0JBQWtCO1FBQzdCLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsa0JBQWtCLENBQUM7Z0JBQ2pFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUzthQUMxQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7Q0FDRjtBQWpCRCx3REFpQkM7QUFNRCxNQUFhLGlCQUFrQixTQUFRLEtBQUs7Q0FDM0M7QUFERCw4Q0FDQztBQUVELE1BQWEsZ0JBQWdCO0lBR0U7SUFGckIsYUFBYSxHQUErQixFQUFFLENBQUM7SUFFdkQsWUFBNkIsR0FBUTtRQUFSLFFBQUcsR0FBSCxHQUFHLENBQUs7SUFDckMsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBWTtRQUM3QixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVELElBQUksS0FBSyxFQUFFLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3BCLFNBQVMsQ0FBQyxzQ0FBc0M7WUFDbEQsQ0FBQztZQUNELElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQztZQUUvQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUMsQ0FBQyxtQkFBbUI7SUFDdkMsQ0FBQztJQUVELGlCQUFpQjtJQUNULEtBQUssQ0FBQyxDQUFDLFdBQVc7UUFDeEIsSUFBSSxTQUFTLEdBQXVCLFNBQVMsQ0FBQztRQUM5QyxPQUFPLElBQUksRUFBRSxDQUFDO1lBQ1osTUFBTSxRQUFRLEdBQTZCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUNqSCxLQUFLLE1BQU0sU0FBUyxJQUFJLFFBQVEsQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQy9DLE1BQU0sU0FBUyxDQUFDO1lBQ2xCLENBQUM7WUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN4QixPQUFPO1lBQ1QsQ0FBQztZQUNELFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF4Q0QsNENBd0NDO0FBRUQsTUFBYSxzQkFBdUIsU0FBUSxLQUFLO0NBQ2hEO0FBREQsd0RBQ0M7QUFzQkQsTUFBYSw4QkFBOEI7SUFDekIsYUFBYSxDQUE4QjtJQUMxQyxTQUFTLENBQVM7SUFDbEIsUUFBUSxDQUFXO0lBQ25CLE9BQU8sQ0FBdUI7SUFDOUIsT0FBTyxDQUFTO0lBQ2hCLE1BQU0sQ0FBUztJQUNmLFNBQVMsQ0FBUztJQUNsQixHQUFHLENBQU07SUFDVCxZQUFZLENBRTNCO0lBQ2UsY0FBYyxDQUFxQjtJQUNuQyxZQUFZLENBQWU7SUFFcEMsZUFBZSxDQUFxQjtJQUNwQyxhQUFhLENBQWtDO0lBRXZELFlBQVksS0FBMEM7UUFDcEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztRQUNsRSxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7UUFDL0QsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQy9CLGFBQWEsRUFBRSxLQUFLLENBQUMsTUFBTTtZQUMzQixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsU0FBUztZQUNqQyxHQUFHLEtBQUssQ0FBQyxVQUFVO1NBQ3BCLENBQUM7UUFDRixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNqQyxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFFckIsMEVBQTBFO1FBQzFFLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7UUFFN0Msc0NBQXNDO1FBQ3RDLHNHQUFzRztRQUN0Ryw4R0FBOEc7UUFDOUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTNFLDZGQUE2RjtRQUM3RixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxJQUFZLFlBQVk7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDL0MsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsbUZBQW1GO0lBQzVFLEtBQUssQ0FBQywwQ0FBMEMsQ0FDckQsU0FBaUIsRUFDakIsY0FBd0IsRUFDeEIscUJBQXVEO1FBRXZELE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDaEYsT0FBTyxJQUFJLDhCQUE4QixDQUFDO1lBQ3hDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxTQUFTO1lBQ1QsUUFBUSxFQUFFLGNBQWM7WUFDeEIsVUFBVSxFQUFFLGVBQWU7WUFDM0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1NBQ2hDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsNkJBQTZCLENBQ3hDLFNBQWlCLEVBQ2pCLHlCQUE4QjtRQUU5QixJQUFJLHlCQUF5QixJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLHlCQUF5QixDQUFDLENBQUM7WUFDckUsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsc0VBQXNFO2dCQUN0RSxrREFBa0Q7Z0JBQ2xELElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7b0JBQzNDLE1BQU0sQ0FBQyxDQUFDO2dCQUNWLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTSxLQUFLLENBQUMsbUJBQW1CLENBQUMsU0FBaUI7UUFDaEQsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDdEUsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEtBQUssU0FBUyxDQUFDLEVBQUUsa0JBQWtCLENBQUM7SUFDN0YsQ0FBQztJQUVNLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxZQUFvQjtRQUM1RCxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN0RSxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsS0FBSyxZQUFZLENBQUMsRUFBRSxpQkFBaUIsQ0FBQztJQUNoRyxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsU0FBaUI7UUFDdkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLEVBQXNCLENBQUM7UUFDNUMsS0FBSyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzlGLElBQUksU0FBUyxLQUFLLGlCQUFpQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQy9FLEdBQUcsQ0FBQyxJQUFJLENBQUM7b0JBQ1AsR0FBSSxXQUFtQjtvQkFDdkIsU0FBUyxFQUFFLGlCQUFpQjtpQkFDN0IsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTSxLQUFLLENBQUMscUJBQXFCLENBQUMsYUFBa0I7UUFDbkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2xCOzs7Ozs7O1dBT0c7UUFDSCxNQUFNLGFBQWE7WUFDVixpQkFBaUIsQ0FBQyxTQUFvQjtnQkFDM0MsTUFBTSxhQUFhLEdBQUksSUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUNuQixNQUFNLElBQUksc0JBQXNCLENBQUMsMkJBQTJCLFNBQVMsQ0FBQyxJQUFJLG1CQUFtQixDQUFDLENBQUM7Z0JBQ2pHLENBQUM7Z0JBRUQsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUV0RixPQUFPLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQWlCLEVBQUUsSUFBVztnQkFDN0MsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzdELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFpQixFQUFFLElBQVM7Z0JBQzVDLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3RCxPQUFPLGFBQWEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEMsQ0FBQztZQUVELEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBYSxFQUFFLElBQVc7Z0JBQzNDLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3RCxPQUFPLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QixDQUFDO1lBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFpQjtnQkFDekIsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUNkLE9BQU8sU0FBUyxDQUFDO2dCQUNuQixDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxJQUFJLHNCQUFzQixDQUFDLDBCQUEwQixTQUFTLHFDQUFxQyxDQUFDLENBQUM7Z0JBQzdHLENBQUM7WUFDSCxDQUFDO1lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFpQixFQUFFLGFBQXFCO2dCQUN6RCwrREFBK0Q7Z0JBQy9ELE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDeEUsSUFBSSxTQUFTLEVBQUUsQ0FBQztvQkFDZCxPQUFPLFNBQVMsQ0FBQztnQkFDbkIsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE1BQU0sSUFBSSxzQkFBc0IsQ0FDOUIsY0FBYyxhQUFhLGtCQUFrQixTQUFTLHFDQUFxQyxDQUM1RixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFnQixFQUFFLG9CQUFxRDtnQkFDckYsTUFBTSxZQUFZLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFFeEcsT0FBTyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsY0FBYyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQzFELElBQUksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO3dCQUN4QixPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDM0IsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ2hDLE9BQU8sUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDOUcsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBWTtnQkFDbEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNkLE1BQU0sSUFBSSxzQkFBc0IsQ0FBQyxXQUFXLElBQUkscUNBQXFDLENBQUMsQ0FBQztnQkFDekYsQ0FBQztnQkFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNwQixNQUFNLElBQUksc0JBQXNCLENBQUMsV0FBVyxJQUFJLDBCQUEwQixDQUFDLENBQUM7Z0JBQzlFLENBQUM7Z0JBQ0QsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3hCLENBQUM7U0FDRjtRQUVELElBQUksYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzFCLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNqQywyQkFBMkI7WUFDM0Isd0VBQXdFO1lBQ3hFLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFFRCxJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDckQsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxPQUFPLElBQUksYUFBYSxFQUFFLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sR0FBRyxHQUEyQixFQUFFLENBQUM7Z0JBQ3ZDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7b0JBQ3ZELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkQsQ0FBQztnQkFDRCxPQUFPLEdBQUcsQ0FBQztZQUNiLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FrQkc7SUFDSSxLQUFLLENBQUMsOEJBQThCLENBQUMsU0FBaUIsRUFBRSxZQUFvQixFQUFFLFVBQWtCO1FBQ3JHLElBQUksWUFBWSxJQUFJLHlDQUFpQyxFQUFFLENBQUM7WUFDdEQsTUFBTSxZQUFZLEdBQUcseUNBQWlDLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDckUsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1lBRTNCLEtBQUssTUFBTSxRQUFRLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ2xFLElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ2hCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDNUQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLHNGQUFzRjtvQkFDdEYsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDekIsQ0FBQztZQUNILENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxTQUFpQixFQUFFLFlBQW9CO1FBQ2hFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRU0sV0FBVyxDQUFDLFNBQWlCO1FBQ2xDLE9BQU8sSUFBQSxvQ0FBZ0IsRUFBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFTyxVQUFVLENBQUMsU0FBaUIsRUFBRSxlQUFvQjtRQUN4RCxJQUFJLE9BQU8sZUFBZSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sU0FBUyxLQUFLLGVBQWUsQ0FBQztRQUN2QyxDQUFDO1FBRUQsSUFBSSxlQUFlLElBQUksSUFBSSxFQUFFLENBQUM7WUFDNUIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDbkMsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFFRCxJQUFJLE9BQU8sZUFBZSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckYsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLGNBQWMsQ0FBQyxDQUFNO1FBQzNCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0UsT0FBTztnQkFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDYixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNqQixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQWlCO1FBQzNDLG9FQUFvRTtRQUNwRSxJQUFJLFNBQVMsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEUsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUM5QixDQUFDO1FBRUQsa0RBQWtEO1FBQ2xELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEQsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQixPQUFPLGVBQWUsQ0FBQztRQUN6QixDQUFDO1FBRUQsdUhBQXVIO1FBQ3ZILE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLENBQUM7UUFDN0UsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1lBQzFCLE9BQU8scUJBQXFCLENBQUM7UUFDL0IsQ0FBQztRQUVELDRFQUE0RTtRQUM1RSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUFDLFNBQWlCLEVBQUUsU0FBa0I7UUFDbEUsNEdBQTRHO1FBQzVHLG1IQUFtSDtRQUNuSCxJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUksU0FBUyxFQUFFLENBQUM7WUFDekMsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3RFLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLENBQUMsQ0FBQztRQUN0RixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELElBQUksYUFBYSxDQUFDLFlBQVksSUFBSSw0QkFBNEIsSUFBSSxTQUFTLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDcEcsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3BELGdFQUFnRTtnQkFDaEUsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUNELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxJQUFJLENBQUMsMENBQTBDLENBQy9FLGNBQWMsQ0FBQyxZQUFZLEVBQzNCLGNBQWMsQ0FBQyxpQkFBaUIsRUFDaEMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLFVBQVcsQ0FDN0MsQ0FBQztZQUVGLHVGQUF1RjtZQUN2RixPQUFPLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDO2dCQUMvQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7YUFDekMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELG9GQUFvRjtRQUNwRixtQ0FBbUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFTyxlQUFlLENBQ3JCLFNBQWlCLEVBQ2pCLFlBRUM7UUFFRCxLQUFLLE1BQU0sb0JBQW9CLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzdELElBQUksb0JBQW9CLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3ZDLE9BQU8sWUFBWSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUNELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FDbkQsU0FBUyxFQUNULFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLG9CQUFvQixDQUN4RCxDQUFDO1lBQ0YsSUFBSSx3QkFBd0I7Z0JBQUUsT0FBTyx3QkFBd0IsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVPLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxRQUE4QixFQUFFLFNBQTZCO1FBQ2pHLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztRQUUvQywrRUFBK0U7UUFDL0UsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQztRQUVELE1BQU0sbUJBQW1CLEdBQUcsZ0NBQWdDLENBQUMsUUFBUSxDQUFDLFlBQWEsQ0FBQyxDQUFDO1FBQ3JGLElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUN4QixNQUFNLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNELElBQUksbUJBQW1CLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNwRCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDNUUsT0FBTyxtQkFBbUIsQ0FBQztvQkFDekIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO29CQUN6QixPQUFPO29CQUNQLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtvQkFDbkIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO29CQUNyQixZQUFZLEVBQUUsbUJBQW1CO29CQUNqQyxZQUFZLEVBQUUsVUFBVztpQkFDMUIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxRQUFRLENBQUMsaUJBQWtCLEVBQUUsUUFBUSxDQUFDLFlBQWEsRUFBRSxVQUFXLENBQUMsQ0FBQztZQUUvSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO2dCQUNuRCxRQUFRLEVBQUUsUUFBUSxDQUFDLFlBQWE7Z0JBQ2hDLFVBQVUsRUFBRSxVQUFVO2FBQ3ZCLENBQUMsQ0FBQztZQUNILE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLFVBQVUsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUMzRSxJQUFJLFNBQVMsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDdkIsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1lBQ3BCLGdFQUFnRTtZQUNoRSxNQUFNLElBQUksc0JBQXNCLENBQUMsbUJBQW1CLFNBQVMsdUJBQXVCLFFBQVEsQ0FBQyxZQUFZLG9CQUFvQjtnQkFDM0gsbUVBQW1FLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDdkcsQ0FBQztRQUVELE1BQU0sSUFBSSxzQkFBc0IsQ0FDOUIseUJBQXlCLFNBQVMsdUJBQXVCLFFBQVEsQ0FBQyxZQUFZLHdDQUF3QztZQUNwSCxzRUFBc0UsQ0FDekUsQ0FBQztJQUNKLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxRQUE4QjtRQUN6RCxPQUFPLFFBQVEsQ0FBQyxZQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdELENBQUM7SUFFTyxnQ0FBZ0MsQ0FBQyxRQUE4QjtRQUNyRSxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsWUFBYSxDQUFDO1FBQzVDLE1BQU0sdUJBQXVCLEdBQUcsMkJBQTJCLENBQUMsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDO1FBQ3hGLE9BQU8sdUJBQXVCO1lBQzVCLENBQUMsQ0FBQyx1QkFBdUI7WUFDekIsQ0FBQyxDQUFDLDJCQUEyQjtnQkFDN0IsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0NBQ0Y7QUF2YkQsd0VBdWJDO0FBV0Q7Ozs7Ozs7R0FPRztBQUNVLFFBQUEsaUNBQWlDLEdBQWlDO0lBQzdFLDZCQUE2QixFQUFFLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQztJQUM1RCw2QkFBNkIsRUFBRSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUM7SUFDNUQsd0JBQXdCLEVBQUUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDO0lBQy9DLG1DQUFtQyxFQUFFLENBQUMsV0FBVyxFQUFFLG9CQUFvQixDQUFDO0lBQ3hFLG9DQUFvQyxFQUFFLENBQUMscUJBQXFCLEVBQUUsV0FBVyxDQUFDO0lBQzFFLDJCQUEyQixFQUFFLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQztJQUN4RCx3QkFBd0IsRUFBRSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7SUFDcEQsK0JBQStCLEVBQUUsQ0FBQyxjQUFjLEVBQUUsWUFBWSxDQUFDO0lBQy9ELCtCQUErQixFQUFFLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQztJQUMxRCwrQkFBK0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUM7SUFDMUQsZ0NBQWdDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDO0lBQzVELHdDQUF3QyxFQUFFLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQztJQUM3RiwwQkFBMEIsRUFBRSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUM7SUFDaEQsMEJBQTBCLEVBQUUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDO0lBQ2hELGtDQUFrQyxFQUFFLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQztJQUMzRSwwQkFBMEIsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNsQyxzQ0FBc0MsRUFBRSxDQUFDLGVBQWUsRUFBRSx3QkFBd0IsQ0FBQztJQUNuRiw2QkFBNkIsRUFBRSxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUM7SUFDakUsNENBQTRDLEVBQUUsQ0FBQyxlQUFlLEVBQUUsd0JBQXdCLEVBQUUsZUFBZSxDQUFDO0lBQzFHLDRCQUE0QixFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ3BDLG9CQUFvQixFQUFFLENBQUMsSUFBSSxDQUFDO0lBQzVCLHFCQUFxQixFQUFFLENBQUMsSUFBSSxDQUFDO0lBQzdCLDhCQUE4QixFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ3RDLDJCQUEyQixFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ25DLDZCQUE2QixFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ3JDLDhCQUE4QixFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ3RDLHNCQUFzQixFQUFFLENBQUMsVUFBVSxDQUFDO0lBQ3BDLDBCQUEwQixFQUFFLENBQUMsT0FBTyxDQUFDO0lBQ3JDLDJCQUEyQixFQUFFLENBQUMsbUJBQW1CLENBQUM7SUFDbEQsOEJBQThCLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDdEMseUJBQXlCLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDakMsNkJBQTZCLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckMsa0NBQWtDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxxQkFBcUIsQ0FBQztJQUM5RSw0QkFBNEIsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNwQyw4QkFBOEIsRUFBRSxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUM7SUFDMUQsOEJBQThCLEVBQUUsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDO0lBQ3hELDZCQUE2QixFQUFFLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQztJQUMxRCx3Q0FBd0MsRUFBRSxDQUFDLFlBQVksRUFBRSxjQUFjLENBQUM7SUFDeEUsc0NBQXNDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDO0lBQ3BFLDRCQUE0QixFQUFFLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQztJQUN4RCxtQkFBbUIsRUFBRSxDQUFDLElBQUksQ0FBQztJQUMzQiwwQkFBMEIsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNsQyx1QkFBdUIsRUFBRSxDQUFDLElBQUksQ0FBQztJQUMvQiw2QkFBNkIsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNyQyxlQUFlLEVBQUUsQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDO0lBQzdDLG1CQUFtQixFQUFFLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQztJQUM5QyxnQ0FBZ0MsRUFBRSxDQUFDLElBQUksQ0FBQztJQUN4Qyx5Q0FBeUMsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNqRCx3QkFBd0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztJQUNwQyw0QkFBNEIsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNwQyxtQkFBbUIsRUFBRSxDQUFDLEtBQUssQ0FBQztJQUM1QixtQ0FBbUMsRUFBRSxDQUFDLElBQUksQ0FBQztJQUMzQyx3QkFBd0IsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNoQyxxQkFBcUIsRUFBRSxDQUFDLElBQUksQ0FBQztJQUM3QixrQkFBa0IsRUFBRSxDQUFDLElBQUksQ0FBQztJQUMxQixzQkFBc0IsRUFBRSxDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUM7SUFDekQsK0JBQStCLEVBQUUsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDO0lBQy9ELGdDQUFnQyxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ3hDLDJCQUEyQixFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ25DLDBCQUEwQixFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ2xDLHlCQUF5QixFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ2pDLHdCQUF3QixFQUFFLENBQUMsbUJBQW1CLENBQUM7SUFDL0MscUNBQXFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDN0MsNkNBQTZDLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckQsMEJBQTBCLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDbEMsbUNBQW1DLEVBQUUsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUM7SUFDbkUsaUNBQWlDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDO0NBQ2hFLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLDJCQUEyQixHQUU3QjtJQUNGLHVCQUF1QixFQUFFO1FBQ3ZCLFlBQVksRUFBRSxXQUFXO0tBQzFCO0NBQ0YsQ0FBQztBQUVGLE1BQU0sZ0NBQWdDLEdBRWxDO0lBQ0YsZ0JBQWdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFO0lBQ3BDLGdCQUFnQixFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRTtJQUNwQyxpQkFBaUIsRUFBRSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUU7SUFDckMsaUJBQWlCLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFO0lBQ3BDLHVCQUF1QixFQUFFLEVBQUUsR0FBRyxFQUFFLHNCQUFzQixFQUFFO0lBQ3hELHVCQUF1QixFQUFFO1FBQ3ZCLEdBQUcsRUFBRSxzQkFBc0I7UUFDM0IsNERBQTREO1FBQzVELElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVk7S0FDcEM7SUFDRCxzQkFBc0IsRUFBRSxFQUFFLEdBQUcsRUFBRSxzQkFBc0IsRUFBRTtJQUN2RCwwQkFBMEIsRUFBRSxFQUFFLEtBQUssRUFBRSx5QkFBeUIsRUFBRTtJQUNoRSxxQ0FBcUMsRUFBRTtRQUNyQyxVQUFVLEVBQUUsMkJBQTJCO0tBQ3hDO0lBQ0QsMEJBQTBCLEVBQUUsRUFBRSxJQUFJLEVBQUUsK0JBQStCLEVBQUU7SUFDckUsZUFBZSxFQUFFLEVBQUUsR0FBRyxFQUFFLHNCQUFzQixFQUFFO0NBQ2pELENBQUM7QUFFRixTQUFTLFNBQVMsQ0FBQyxLQUFlO0lBQ2hDLG1DQUFtQztJQUNuQyxPQUFPLE9BQU8sS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDakgsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLEtBQWU7SUFDL0IsNERBQTREO0lBQzVELE9BQU8sT0FBTyxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxPQUFPLE1BQU0sS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQzNFLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLEtBQWU7SUFDN0Msb0dBQW9HO0lBQ3BHLE9BQU8sT0FBTyxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQ2hJLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLEtBQWU7SUFDN0Msb0dBQW9HO0lBQ3BHLE9BQU8sT0FBTyxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQ2hJLENBQUM7QUFFRCxTQUFTLHlCQUF5QixDQUFDLEtBQWU7SUFDaEQsc0RBQXNEO0lBQ3RELE9BQU8sS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELFNBQVMsMkJBQTJCLENBQUMsS0FBZTtJQUNsRCw2RUFBNkU7SUFDN0UsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRUQsU0FBUywrQkFBK0IsQ0FBQyxLQUFlO0lBQ3RELHlFQUF5RTtJQUN6RSxPQUFPLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFPRCxLQUFLLFVBQVUsa0JBQWtCLENBQUMsR0FBVyxFQUFFLEtBQWEsRUFBRSxFQUFrQztJQUM5RixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSw0QkFBWSxDQUFDLHdCQUF3QixFQUFFLG9DQUFvQyxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7SUFDaEMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsTUFBTTtRQUNSLENBQUM7UUFFRCxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU3QixLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBQ0QsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFM0IsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LWFwaSc7XG5pbXBvcnQgdHlwZSB7IEV4cG9ydCwgTGlzdEV4cG9ydHNDb21tYW5kT3V0cHV0LCBTdGFja1Jlc291cmNlU3VtbWFyeSB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgdHlwZSB7IE5lc3RlZFN0YWNrVGVtcGxhdGVzIH0gZnJvbSAnLi9uZXN0ZWQtc3RhY2staGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uL3Rvb2xraXQvdG9vbGtpdC1lcnJvcic7XG5pbXBvcnQgdHlwZSB7IElDbG91ZENvbnRyb2xDbGllbnQsIFNESyB9IGZyb20gJy4uL2F3cy1hdXRoL3ByaXZhdGUnO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZU1ldGFkYXRhIH0gZnJvbSAnLi4vcmVzb3VyY2UtbWV0YWRhdGEnO1xuaW1wb3J0IHsgcmVzb3VyY2VNZXRhZGF0YSB9IGZyb20gJy4uL3Jlc291cmNlLW1ldGFkYXRhJztcblxuZXhwb3J0IGludGVyZmFjZSBMaXN0U3RhY2tSZXNvdXJjZXMge1xuICBsaXN0U3RhY2tSZXNvdXJjZXMoKTogUHJvbWlzZTxTdGFja1Jlc291cmNlU3VtbWFyeVtdPjtcbn1cblxuZXhwb3J0IGNsYXNzIExhenlMaXN0U3RhY2tSZXNvdXJjZXMgaW1wbGVtZW50cyBMaXN0U3RhY2tSZXNvdXJjZXMge1xuICBwcml2YXRlIHN0YWNrUmVzb3VyY2VzOiBQcm9taXNlPFN0YWNrUmVzb3VyY2VTdW1tYXJ5W10+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2RrOiBTREssXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdGFja05hbWU6IHN0cmluZyxcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbGlzdFN0YWNrUmVzb3VyY2VzKCk6IFByb21pc2U8U3RhY2tSZXNvdXJjZVN1bW1hcnlbXT4ge1xuICAgIGlmICh0aGlzLnN0YWNrUmVzb3VyY2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc3RhY2tSZXNvdXJjZXMgPSB0aGlzLnNkay5jbG91ZEZvcm1hdGlvbigpLmxpc3RTdGFja1Jlc291cmNlcyh7XG4gICAgICAgIFN0YWNrTmFtZTogdGhpcy5zdGFja05hbWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tSZXNvdXJjZXM7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb29rdXBFeHBvcnQge1xuICBsb29rdXBFeHBvcnQobmFtZTogc3RyaW5nKTogUHJvbWlzZTxFeHBvcnQgfCB1bmRlZmluZWQ+O1xufVxuXG5leHBvcnQgY2xhc3MgTG9va3VwRXhwb3J0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG5cbmV4cG9ydCBjbGFzcyBMYXp5TG9va3VwRXhwb3J0IGltcGxlbWVudHMgTG9va3VwRXhwb3J0IHtcbiAgcHJpdmF0ZSBjYWNoZWRFeHBvcnRzOiB7IFtuYW1lOiBzdHJpbmddOiBFeHBvcnQgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc2RrOiBTREspIHtcbiAgfVxuXG4gIGFzeW5jIGxvb2t1cEV4cG9ydChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEV4cG9ydCB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICh0aGlzLmNhY2hlZEV4cG9ydHNbbmFtZV0pIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlZEV4cG9ydHNbbmFtZV07XG4gICAgfVxuXG4gICAgZm9yIGF3YWl0IChjb25zdCBjZm5FeHBvcnQgb2YgdGhpcy5saXN0RXhwb3J0cygpKSB7XG4gICAgICBpZiAoIWNmbkV4cG9ydC5OYW1lKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBpZ25vcmUgYW55IHJlc3VsdCB0aGF0IG9taXRzIGEgbmFtZVxuICAgICAgfVxuICAgICAgdGhpcy5jYWNoZWRFeHBvcnRzW2NmbkV4cG9ydC5OYW1lXSA9IGNmbkV4cG9ydDtcblxuICAgICAgaWYgKGNmbkV4cG9ydC5OYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiBjZm5FeHBvcnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gZXhwb3J0IG5vdCBmb3VuZFxuICB9XG5cbiAgLy8gVE9ETzogUGFnaW5hdGVcbiAgcHJpdmF0ZSBhc3luYyAqbGlzdEV4cG9ydHMoKSB7XG4gICAgbGV0IG5leHRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCByZXNwb25zZTogTGlzdEV4cG9ydHNDb21tYW5kT3V0cHV0ID0gYXdhaXQgdGhpcy5zZGsuY2xvdWRGb3JtYXRpb24oKS5saXN0RXhwb3J0cyh7IE5leHRUb2tlbjogbmV4dFRva2VuIH0pO1xuICAgICAgZm9yIChjb25zdCBjZm5FeHBvcnQgb2YgcmVzcG9uc2UuRXhwb3J0cyA/PyBbXSkge1xuICAgICAgICB5aWVsZCBjZm5FeHBvcnQ7XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVzcG9uc2UuTmV4dFRva2VuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG5leHRUb2tlbiA9IHJlc3BvbnNlLk5leHRUb2tlbjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENmbkV2YWx1YXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFcnJvciB7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VEZWZpbml0aW9uIHtcbiAgcmVhZG9ubHkgTG9naWNhbElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IFR5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgUHJvcGVydGllczogeyBbcDogc3RyaW5nXTogYW55IH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlUHJvcHMge1xuICByZWFkb25seSBzdGFja0FydGlmYWN0OiBDbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG4gIHJlYWRvbmx5IHN0YWNrTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgdGVtcGxhdGU/OiBUZW1wbGF0ZTtcbiAgcmVhZG9ubHkgcGFyYW1ldGVyczogeyBbcGFyYW1ldGVyTmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG4gIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhcnRpdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBzZGs6IFNESztcbiAgcmVhZG9ubHkgbmVzdGVkU3RhY2tzPzoge1xuICAgIFtuZXN0ZWRTdGFja0xvZ2ljYWxJZDogc3RyaW5nXTogTmVzdGVkU3RhY2tUZW1wbGF0ZXM7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUge1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhY2tBcnRpZmFjdDogQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHRlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0OiB7IFtrOiBzdHJpbmddOiBhbnkgfTtcbiAgcHJpdmF0ZSByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFydGl0aW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2RrOiBTREs7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmVzdGVkU3RhY2tzOiB7XG4gICAgW25lc3RlZFN0YWNrTG9naWNhbElkOiBzdHJpbmddOiBOZXN0ZWRTdGFja1RlbXBsYXRlcztcbiAgfTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja1Jlc291cmNlczogTGlzdFN0YWNrUmVzb3VyY2VzO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvb2t1cEV4cG9ydDogTG9va3VwRXhwb3J0O1xuXG4gIHByaXZhdGUgY2FjaGVkVXJsU3VmZml4OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2Nsb3VkQ29udHJvbDogSUNsb3VkQ29udHJvbENsaWVudCB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlUHJvcHMpIHtcbiAgICB0aGlzLnN0YWNrQXJ0aWZhY3QgPSBwcm9wcy5zdGFja0FydGlmYWN0O1xuICAgIHRoaXMuc3RhY2tOYW1lID0gcHJvcHMuc3RhY2tOYW1lID8/IHByb3BzLnN0YWNrQXJ0aWZhY3Quc3RhY2tOYW1lO1xuICAgIHRoaXMudGVtcGxhdGUgPSBwcm9wcy50ZW1wbGF0ZSA/PyBwcm9wcy5zdGFja0FydGlmYWN0LnRlbXBsYXRlO1xuICAgIHRoaXMuY29udGV4dCA9IHtcbiAgICAgICdBV1M6OkFjY291bnRJZCc6IHByb3BzLmFjY291bnQsXG4gICAgICAnQVdTOjpSZWdpb24nOiBwcm9wcy5yZWdpb24sXG4gICAgICAnQVdTOjpQYXJ0aXRpb24nOiBwcm9wcy5wYXJ0aXRpb24sXG4gICAgICAuLi5wcm9wcy5wYXJhbWV0ZXJzLFxuICAgIH07XG4gICAgdGhpcy5hY2NvdW50ID0gcHJvcHMuYWNjb3VudDtcbiAgICB0aGlzLnJlZ2lvbiA9IHByb3BzLnJlZ2lvbjtcbiAgICB0aGlzLnBhcnRpdGlvbiA9IHByb3BzLnBhcnRpdGlvbjtcbiAgICB0aGlzLnNkayA9IHByb3BzLnNkaztcblxuICAgIC8vIFdlIG5lZWQgbmFtZXMgb2YgbmVzdGVkIHN0YWNrIHNvIHdlIGNhbiBldmFsdWF0ZSBjcm9zcyBzdGFjayByZWZlcmVuY2VzXG4gICAgdGhpcy5uZXN0ZWRTdGFja3MgPSBwcm9wcy5uZXN0ZWRTdGFja3MgPz8ge307XG5cbiAgICAvLyBUaGUgY3VycmVudCByZXNvdXJjZXMgb2YgdGhlIFN0YWNrLlxuICAgIC8vIFdlIG5lZWQgdGhlbSB0byBmaWd1cmUgb3V0IHRoZSBwaHlzaWNhbCBuYW1lIG9mIGEgcmVzb3VyY2UgaW4gY2FzZSBpdCB3YXNuJ3Qgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLlxuICAgIC8vIFdlIGZldGNoIGl0IGxhemlseSwgdG8gc2F2ZSBhIHNlcnZpY2UgY2FsbCwgaW4gY2FzZSBhbGwgaG90c3dhcHBlZCByZXNvdXJjZXMgaGF2ZSB0aGVpciBwaHlzaWNhbCBuYW1lcyBzZXQuXG4gICAgdGhpcy5zdGFja1Jlc291cmNlcyA9IG5ldyBMYXp5TGlzdFN0YWNrUmVzb3VyY2VzKHRoaXMuc2RrLCB0aGlzLnN0YWNrTmFtZSk7XG5cbiAgICAvLyBDbG91ZEZvcm1hdGlvbiBFeHBvcnRzIGxvb2t1cCB0byBiZSBhYmxlIHRvIHJlc29sdmUgRm46OkltcG9ydFZhbHVlIGludHJpbnNpY3MgaW4gdGVtcGxhdGVcbiAgICB0aGlzLmxvb2t1cEV4cG9ydCA9IG5ldyBMYXp5TG9va3VwRXhwb3J0KHRoaXMuc2RrKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNsb3VkQ29udHJvbCgpOiBJQ2xvdWRDb250cm9sQ2xpZW50IHtcbiAgICBpZiAoIXRoaXMuX2Nsb3VkQ29udHJvbCkge1xuICAgICAgdGhpcy5fY2xvdWRDb250cm9sID0gdGhpcy5zZGsuY2xvdWRDb250cm9sKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbG91ZENvbnRyb2w7XG4gIH1cblxuICAvLyBjbG9uZXMgY3VycmVudCBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUgb2JqZWN0LCBidXQgdXBkYXRlcyB0aGUgc3RhY2sgbmFtZVxuICBwdWJsaWMgYXN5bmMgY3JlYXRlTmVzdGVkRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlKFxuICAgIHN0YWNrTmFtZTogc3RyaW5nLFxuICAgIG5lc3RlZFRlbXBsYXRlOiBUZW1wbGF0ZSxcbiAgICBuZXN0ZWRTdGFja1BhcmFtZXRlcnM6IHsgW3BhcmFtZXRlck5hbWU6IHN0cmluZ106IGFueSB9LFxuICApIHtcbiAgICBjb25zdCBldmFsdWF0ZWRQYXJhbXMgPSBhd2FpdCB0aGlzLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihuZXN0ZWRTdGFja1BhcmFtZXRlcnMpO1xuICAgIHJldHVybiBuZXcgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlKHtcbiAgICAgIHN0YWNrQXJ0aWZhY3Q6IHRoaXMuc3RhY2tBcnRpZmFjdCxcbiAgICAgIHN0YWNrTmFtZSxcbiAgICAgIHRlbXBsYXRlOiBuZXN0ZWRUZW1wbGF0ZSxcbiAgICAgIHBhcmFtZXRlcnM6IGV2YWx1YXRlZFBhcmFtcyxcbiAgICAgIGFjY291bnQ6IHRoaXMuYWNjb3VudCxcbiAgICAgIHJlZ2lvbjogdGhpcy5yZWdpb24sXG4gICAgICBwYXJ0aXRpb246IHRoaXMucGFydGl0aW9uLFxuICAgICAgc2RrOiB0aGlzLnNkayxcbiAgICAgIG5lc3RlZFN0YWNrczogdGhpcy5uZXN0ZWRTdGFja3MsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZXN0YWJsaXNoUmVzb3VyY2VQaHlzaWNhbE5hbWUoXG4gICAgbG9naWNhbElkOiBzdHJpbmcsXG4gICAgcGh5c2ljYWxOYW1lSW5DZm5UZW1wbGF0ZTogYW55LFxuICApOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmIChwaHlzaWNhbE5hbWVJbkNmblRlbXBsYXRlICE9IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihwaHlzaWNhbE5hbWVJbkNmblRlbXBsYXRlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgd2UgY2FuJ3QgZXZhbHVhdGUgdGhlIHJlc291cmNlJ3MgbmFtZSBDbG91ZEZvcm1hdGlvbiBleHByZXNzaW9uLFxuICAgICAgICAvLyBqdXN0IGxvb2sgaXQgdXAgaW4gdGhlIGN1cnJlbnRseSBkZXBsb3llZCBTdGFja1xuICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbikpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmRQaHlzaWNhbE5hbWVGb3IobG9naWNhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBmaW5kUGh5c2ljYWxOYW1lRm9yKGxvZ2ljYWxJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzdGFja1Jlc291cmNlcyA9IGF3YWl0IHRoaXMuc3RhY2tSZXNvdXJjZXMubGlzdFN0YWNrUmVzb3VyY2VzKCk7XG4gICAgcmV0dXJuIHN0YWNrUmVzb3VyY2VzLmZpbmQoKHNyKSA9PiBzci5Mb2dpY2FsUmVzb3VyY2VJZCA9PT0gbG9naWNhbElkKT8uUGh5c2ljYWxSZXNvdXJjZUlkO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZpbmRMb2dpY2FsSWRGb3JQaHlzaWNhbE5hbWUocGh5c2ljYWxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHN0YWNrUmVzb3VyY2VzID0gYXdhaXQgdGhpcy5zdGFja1Jlc291cmNlcy5saXN0U3RhY2tSZXNvdXJjZXMoKTtcbiAgICByZXR1cm4gc3RhY2tSZXNvdXJjZXMuZmluZCgoc3IpID0+IHNyLlBoeXNpY2FsUmVzb3VyY2VJZCA9PT0gcGh5c2ljYWxOYW1lKT8uTG9naWNhbFJlc291cmNlSWQ7XG4gIH1cblxuICBwdWJsaWMgZmluZFJlZmVyZW5jZXNUbyhsb2dpY2FsSWQ6IHN0cmluZyk6IEFycmF5PFJlc291cmNlRGVmaW5pdGlvbj4ge1xuICAgIGNvbnN0IHJldCA9IG5ldyBBcnJheTxSZXNvdXJjZURlZmluaXRpb24+KCk7XG4gICAgZm9yIChjb25zdCBbcmVzb3VyY2VMb2dpY2FsSWQsIHJlc291cmNlRGVmXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnRlbXBsYXRlPy5SZXNvdXJjZXMgPz8ge30pKSB7XG4gICAgICBpZiAobG9naWNhbElkICE9PSByZXNvdXJjZUxvZ2ljYWxJZCAmJiB0aGlzLnJlZmVyZW5jZXMobG9naWNhbElkLCByZXNvdXJjZURlZikpIHtcbiAgICAgICAgcmV0LnB1c2goe1xuICAgICAgICAgIC4uLihyZXNvdXJjZURlZiBhcyBhbnkpLFxuICAgICAgICAgIExvZ2ljYWxJZDogcmVzb3VyY2VMb2dpY2FsSWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihjZm5FeHByZXNzaW9uOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIC8qKlxuICAgICAqIEV2YWx1YXRlcyBDbG91ZEZvcm1hdGlvbiBpbnRyaW5zaWMgZnVuY3Rpb25zXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgc3VwcG9ydGVkIGludHJpbnNpYyBmdW5jdGlvbnMgYXJlIGRvY3VtZW50ZWQgaW4gUkVBRE1FLm1kIC0tIHBsZWFzZSB1cGRhdGVcbiAgICAgKiBsaXN0IG9mIHN1cHBvcnRlZCBmdW5jdGlvbnMgd2hlbiBhZGRpbmcgbmV3IGV2YWx1YXRpb25zXG4gICAgICpcbiAgICAgKiBTZWU6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2ludHJpbnNpYy1mdW5jdGlvbi1yZWZlcmVuY2UuaHRtbFxuICAgICAqL1xuICAgIGNsYXNzIENmbkludHJpbnNpY3Mge1xuICAgICAgcHVibGljIGV2YWx1YXRlSW50cmluc2ljKGludHJpbnNpYzogSW50cmluc2ljKTogYW55IHtcbiAgICAgICAgY29uc3QgaW50cmluc2ljRnVuYyA9ICh0aGlzIGFzIGFueSlbaW50cmluc2ljLm5hbWVdO1xuICAgICAgICBpZiAoIWludHJpbnNpY0Z1bmMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbihgQ2xvdWRGb3JtYXRpb24gZnVuY3Rpb24gJHtpbnRyaW5zaWMubmFtZX0gaXMgbm90IHN1cHBvcnRlZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJnc0FzQXJyYXkgPSBBcnJheS5pc0FycmF5KGludHJpbnNpYy5hcmdzKSA/IGludHJpbnNpYy5hcmdzIDogW2ludHJpbnNpYy5hcmdzXTtcblxuICAgICAgICByZXR1cm4gaW50cmluc2ljRnVuYy5hcHBseSh0aGlzLCBhcmdzQXNBcnJheSk7XG4gICAgICB9XG5cbiAgICAgIGFzeW5jICdGbjo6Sm9pbicoc2VwYXJhdG9yOiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgZXZhbHVhdGVkQXJncyA9IGF3YWl0IHNlbGYuZXZhbHVhdGVDZm5FeHByZXNzaW9uKGFyZ3MpO1xuICAgICAgICByZXR1cm4gZXZhbHVhdGVkQXJncy5qb2luKHNlcGFyYXRvcik7XG4gICAgICB9XG5cbiAgICAgIGFzeW5jICdGbjo6U3BsaXQnKHNlcGFyYXRvcjogc3RyaW5nLCBhcmdzOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBldmFsdWF0ZWRBcmdzID0gYXdhaXQgc2VsZi5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oYXJncyk7XG4gICAgICAgIHJldHVybiBldmFsdWF0ZWRBcmdzLnNwbGl0KHNlcGFyYXRvcik7XG4gICAgICB9XG5cbiAgICAgIGFzeW5jICdGbjo6U2VsZWN0JyhpbmRleDogbnVtYmVyLCBhcmdzOiBhbnlbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGV2YWx1YXRlZEFyZ3MgPSBhd2FpdCBzZWxmLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihhcmdzKTtcbiAgICAgICAgcmV0dXJuIGV2YWx1YXRlZEFyZ3NbaW5kZXhdO1xuICAgICAgfVxuXG4gICAgICBhc3luYyBSZWYobG9naWNhbElkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCByZWZUYXJnZXQgPSBhd2FpdCBzZWxmLmZpbmRSZWZUYXJnZXQobG9naWNhbElkKTtcbiAgICAgICAgaWYgKHJlZlRhcmdldCkge1xuICAgICAgICAgIHJldHVybiByZWZUYXJnZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IENmbkV2YWx1YXRpb25FeGNlcHRpb24oYFBhcmFtZXRlciBvciByZXNvdXJjZSAnJHtsb2dpY2FsSWR9JyBjb3VsZCBub3QgYmUgZm91bmQgZm9yIGV2YWx1YXRpb25gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhc3luYyAnRm46OkdldEF0dCcobG9naWNhbElkOiBzdHJpbmcsIGF0dHJpYnV0ZU5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIC8vIFRvRG8gaGFuZGxlIHRoZSAnbG9naWNhbElkLmF0dHJpYnV0ZU5hbWUnIGZvcm0gb2YgRm46OkdldEF0dFxuICAgICAgICBjb25zdCBhdHRyVmFsdWUgPSBhd2FpdCBzZWxmLmZpbmRHZXRBdHRUYXJnZXQobG9naWNhbElkLCBhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgaWYgKGF0dHJWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiBhdHRyVmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IENmbkV2YWx1YXRpb25FeGNlcHRpb24oXG4gICAgICAgICAgICBgQXR0cmlidXRlICcke2F0dHJpYnV0ZU5hbWV9JyBvZiByZXNvdXJjZSAnJHtsb2dpY2FsSWR9JyBjb3VsZCBub3QgYmUgZm91bmQgZm9yIGV2YWx1YXRpb25gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXN5bmMgJ0ZuOjpTdWInKHRlbXBsYXRlOiBzdHJpbmcsIGV4cGxpY2l0UGxhY2Vob2xkZXJzPzogeyBbdmFyaWFibGU6IHN0cmluZ106IHN0cmluZyB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gZXhwbGljaXRQbGFjZWhvbGRlcnMgPyBhd2FpdCBzZWxmLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihleHBsaWNpdFBsYWNlaG9sZGVycykgOiB7fTtcblxuICAgICAgICByZXR1cm4gYXN5bmNHbG9iYWxSZXBsYWNlKHRlbXBsYXRlLCAvXFwkeyhbXn1dKil9L2csIChrZXkpID0+IHtcbiAgICAgICAgICBpZiAoa2V5IGluIHBsYWNlaG9sZGVycykge1xuICAgICAgICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyc1trZXldO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzcGxpdEtleSA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgcmV0dXJuIHNwbGl0S2V5Lmxlbmd0aCA9PT0gMSA/IHRoaXMuUmVmKGtleSkgOiB0aGlzWydGbjo6R2V0QXR0J10oc3BsaXRLZXlbMF0sIHNwbGl0S2V5LnNsaWNlKDEpLmpvaW4oJy4nKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgYXN5bmMgJ0ZuOjpJbXBvcnRWYWx1ZScobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgZXhwb3J0ZWQgPSBhd2FpdCBzZWxmLmxvb2t1cEV4cG9ydC5sb29rdXBFeHBvcnQobmFtZSk7XG4gICAgICAgIGlmICghZXhwb3J0ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbihgRXhwb3J0ICcke25hbWV9JyBjb3VsZCBub3QgYmUgZm91bmQgZm9yIGV2YWx1YXRpb25gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWV4cG9ydGVkLlZhbHVlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IENmbkV2YWx1YXRpb25FeGNlcHRpb24oYEV4cG9ydCAnJHtuYW1lfScgZXhpc3RzIHdpdGhvdXQgYSB2YWx1ZWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHBvcnRlZC5WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2ZuRXhwcmVzc2lvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY2ZuRXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjZm5FeHByZXNzaW9uKSkge1xuICAgICAgLy8gU21hbGwgYXJyYXlzIGluIHByYWN0aWNlXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGNka2xhYnMvcHJvbWlzZWFsbC1uby11bmJvdW5kZWQtcGFyYWxsZWxpc21cbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChjZm5FeHByZXNzaW9uLm1hcCgoZXhwcikgPT4gdGhpcy5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oZXhwcikpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNmbkV4cHJlc3Npb24gPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBpbnRyaW5zaWMgPSB0aGlzLnBhcnNlSW50cmluc2ljKGNmbkV4cHJlc3Npb24pO1xuICAgICAgaWYgKGludHJpbnNpYykge1xuICAgICAgICByZXR1cm4gbmV3IENmbkludHJpbnNpY3MoKS5ldmFsdWF0ZUludHJpbnNpYyhpbnRyaW5zaWMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmV0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhjZm5FeHByZXNzaW9uKSkge1xuICAgICAgICAgIHJldFtrZXldID0gYXdhaXQgdGhpcy5ldmFsdWF0ZUNmbkV4cHJlc3Npb24odmFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjZm5FeHByZXNzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEJlc3QtZWZmb3J0IGF0dGVtcHQgdG8gY29uc3RydWN0IHRoZSBDbG91ZCBDb250cm9sIEFQSSBwcmltYXJ5IGlkZW50aWZpZXIgZm9yIGEgcmVzb3VyY2UuXG4gICAqXG4gICAqIENsb3VkIENvbnRyb2wgY29tcG91bmQgaWRlbnRpZmllcnMgYXJlIHBpcGUtZGVsaW1pdGVkLCBvcmRlcmVkIGJ5IHRoZSBgcHJpbWFyeUlkZW50aWZpZXJgXG4gICAqIGFycmF5IGluIHRoZSByZXNvdXJjZSB0eXBlIHNjaGVtYSAoZS5nLiBgRGF0YWJhc2VOYW1lfFRhYmxlTmFtZWAgZm9yIGBBV1M6OkdsdWU6OlRhYmxlYCkuXG4gICAqXG4gICAqIENsb3VkRm9ybWF0aW9uJ3MgYFBoeXNpY2FsUmVzb3VyY2VJZGAgKHRoZSBgcGh5c2ljYWxJZGAgcGFyYW1ldGVyIGhlcmUpIGlzIHRoZSBgUmVmYCByZXR1cm5cbiAgICogdmFsdWUgZm9yIHRoZSByZXNvdXJjZSwgd2hpY2ggaXMgcmVzb3VyY2UtdHlwZS1zcGVjaWZpYyBhbmQgbWF5IG5vdCBjb3JyZXNwb25kIHRvIHRoZSBDbG91ZFxuICAgKiBDb250cm9sIFByaW1hcnkgSWRlbnRpZmllci5cbiAgICpcbiAgICogRm9yIHByb3BlcnRpZXMgcHJlc2VudCBpbiB0aGUgdGVtcGxhdGUsIHdlIHJlc29sdmUgdGhlbSBkaXJlY3RseS4gRm9yIHByb3BlcnRpZXMgTk9UIGluIHRoZVxuICAgKiB0ZW1wbGF0ZSAoZS5nLiBzZXJ2aWNlLWdlbmVyYXRlZCByZWFkLW9ubHkgdmFsdWVzKSwgd2UgZmFsbCBiYWNrIHRvIGBwaHlzaWNhbElkYC4gVGhpcyBpc1xuICAgKiBvbmx5IGNvcnJlY3Qgd2hlbjpcbiAgICpcbiAgICogLSBFeGFjdGx5IG9uZSBwcm9wZXJ0eSBpbiB0aGUgaWRlbnRpZmllciBpcyBtaXNzaW5nIGZyb20gdGhlIHRlbXBsYXRlLCBBTkRcbiAgICogLSBUaGF0IHByb3BlcnR5IGhhcHBlbnMgdG8gYmUgdGhlIG9uZSB0aGF0IGBSZWZgIHJldHVybnMgZm9yIHRoaXMgcmVzb3VyY2UgdHlwZS5cbiAgICpcbiAgICogSWYgbXVsdGlwbGUgcHJvcGVydGllcyBhcmUgbWlzc2luZywgYHBoeXNpY2FsSWRgIGlzIHJldXNlZCBmb3IgYWxsIG9mIHRoZW0uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXZhbHVhdGVDbG91ZENvbnRyb2xJZGVudGlmaWVyKGxvZ2ljYWxJZDogc3RyaW5nLCByZXNvdXJjZVR5cGU6IHN0cmluZywgcGh5c2ljYWxJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAocmVzb3VyY2VUeXBlIGluIFJFU09VUkNFX1RZUEVfUFJJTUFSWV9JREVOVElGSUVSUykge1xuICAgICAgY29uc3QgcHJpbWFyeVByb3BzID0gUkVTT1VSQ0VfVFlQRV9QUklNQVJZX0lERU5USUZJRVJTW3Jlc291cmNlVHlwZV07XG4gICAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBwcmltYXJ5UHJvcHMpIHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVWYWwgPSB0aGlzLmdldFJlc291cmNlUHJvcGVydHkobG9naWNhbElkLCBwcm9wTmFtZSk7XG4gICAgICAgIGlmICh0ZW1wbGF0ZVZhbCkge1xuICAgICAgICAgIHBhcnRzLnB1c2goYXdhaXQgdGhpcy5ldmFsdWF0ZUNmbkV4cHJlc3Npb24odGVtcGxhdGVWYWwpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBOb3QgaW4gdGVtcGxhdGUg4oCUIGFzc3VtZSB0aGlzIGlzIHRoZSBSZWYgcmV0dXJuIHZhbHVlLiBTZWUgZG9jIGNvbW1lbnQgZm9yIGNhdmVhdHMuXG4gICAgICAgICAgcGFydHMucHVzaChwaHlzaWNhbElkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJ3wnKTtcbiAgICB9XG4gICAgcmV0dXJuIHBoeXNpY2FsSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVzb3VyY2VQcm9wZXJ0eShsb2dpY2FsSWQ6IHN0cmluZywgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLlJlc291cmNlcz8uW2xvZ2ljYWxJZF0/LlByb3BlcnRpZXM/Lltwcm9wZXJ0eU5hbWVdO1xuICB9XG5cbiAgcHVibGljIG1ldGFkYXRhRm9yKGxvZ2ljYWxJZDogc3RyaW5nKTogUmVzb3VyY2VNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHJlc291cmNlTWV0YWRhdGEodGhpcy5zdGFja0FydGlmYWN0LCBsb2dpY2FsSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZlcmVuY2VzKGxvZ2ljYWxJZDogc3RyaW5nLCB0ZW1wbGF0ZUVsZW1lbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdGVtcGxhdGVFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGxvZ2ljYWxJZCA9PT0gdGVtcGxhdGVFbGVtZW50O1xuICAgIH1cblxuICAgIGlmICh0ZW1wbGF0ZUVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRlbXBsYXRlRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiB0ZW1wbGF0ZUVsZW1lbnQuc29tZSgoZWwpID0+IHRoaXMucmVmZXJlbmNlcyhsb2dpY2FsSWQsIGVsKSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0ZW1wbGF0ZUVsZW1lbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0ZW1wbGF0ZUVsZW1lbnQpLnNvbWUoKGVsKSA9PiB0aGlzLnJlZmVyZW5jZXMobG9naWNhbElkLCBlbCkpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VJbnRyaW5zaWMoeDogYW55KTogSW50cmluc2ljIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoeCk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAxICYmIChrZXlzWzBdLnN0YXJ0c1dpdGgoJ0ZuOjonKSB8fCBrZXlzWzBdID09PSAnUmVmJykpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGtleXNbMF0sXG4gICAgICAgIGFyZ3M6IHhba2V5c1swXV0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kUmVmVGFyZ2V0KGxvZ2ljYWxJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBmaXJzdCwgY2hlY2sgdG8gc2VlIGlmIHRoZSBSZWYgaXMgYSBQYXJhbWV0ZXIgd2hvJ3MgdmFsdWUgd2UgaGF2ZVxuICAgIGlmIChsb2dpY2FsSWQgPT09ICdBV1M6OlVSTFN1ZmZpeCcpIHtcbiAgICAgIGlmICghdGhpcy5jYWNoZWRVcmxTdWZmaXgpIHtcbiAgICAgICAgdGhpcy5jYWNoZWRVcmxTdWZmaXggPSBhd2FpdCB0aGlzLnNkay5nZXRVcmxTdWZmaXgodGhpcy5yZWdpb24pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jYWNoZWRVcmxTdWZmaXg7XG4gICAgfVxuXG4gICAgLy8gVHJ5IGZpbmRpbmcgdGhlIHJlZiBpbiB0aGUgcGFzc2VkIGluIHBhcmFtZXRlcnNcbiAgICBjb25zdCBwYXJhbWV0ZXJUYXJnZXQgPSB0aGlzLmNvbnRleHRbbG9naWNhbElkXTtcbiAgICBpZiAocGFyYW1ldGVyVGFyZ2V0KSB7XG4gICAgICByZXR1cm4gcGFyYW1ldGVyVGFyZ2V0O1xuICAgIH1cblxuICAgIC8vIElmIG5vdCBpbiB0aGUgcGFzc2VkIGluIHBhcmFtZXRlcnMsIHNlZSBpZiB0aGVyZSBpcyBhIGRlZmF1bHQgdmFsdWUgaW4gdGhlIHRlbXBsYXRlIHBhcmFtZXRlciB0aGF0IHdhcyBub3QgcGFzc2VkIGluXG4gICAgY29uc3QgZGVmYXVsdFBhcmFtZXRlclZhbHVlID0gdGhpcy50ZW1wbGF0ZS5QYXJhbWV0ZXJzPy5bbG9naWNhbElkXT8uRGVmYXVsdDtcbiAgICBpZiAoZGVmYXVsdFBhcmFtZXRlclZhbHVlKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFBhcmFtZXRlclZhbHVlO1xuICAgIH1cblxuICAgIC8vIGlmIGl0J3Mgbm90IGEgUGFyYW1ldGVyLCB3ZSBuZWVkIHRvIHNlYXJjaCBpbiB0aGUgY3VycmVudCBTdGFjayByZXNvdXJjZXNcbiAgICByZXR1cm4gdGhpcy5maW5kR2V0QXR0VGFyZ2V0KGxvZ2ljYWxJZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmRHZXRBdHRUYXJnZXQobG9naWNhbElkOiBzdHJpbmcsIGF0dHJpYnV0ZT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgdGhlIGF0dHJpYnV0ZSBpcyByZWZlcmVuY2luZyBhIHN0YWNrIG91dHB1dCAodXNlZCBpbiBuZXN0ZWQgc3RhY2tzIHRvIHNoYXJlIHBhcmFtZXRlcnMpXG4gICAgLy8gU2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL3F1aWNrcmVmLWNsb3VkZm9ybWF0aW9uLmh0bWwjdzJhYjFjMTdjMjNjMTliNVxuICAgIGlmIChsb2dpY2FsSWQgPT09ICdPdXRwdXRzJyAmJiBhdHRyaWJ1dGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbih0aGlzLnRlbXBsYXRlLk91dHB1dHNbYXR0cmlidXRlXT8uVmFsdWUpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWNrUmVzb3VyY2VzID0gYXdhaXQgdGhpcy5zdGFja1Jlc291cmNlcy5saXN0U3RhY2tSZXNvdXJjZXMoKTtcbiAgICBjb25zdCBmb3VuZFJlc291cmNlID0gc3RhY2tSZXNvdXJjZXMuZmluZCgoc3IpID0+IHNyLkxvZ2ljYWxSZXNvdXJjZUlkID09PSBsb2dpY2FsSWQpO1xuICAgIGlmICghZm91bmRSZXNvdXJjZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoZm91bmRSZXNvdXJjZS5SZXNvdXJjZVR5cGUgPT0gJ0FXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrJyAmJiBhdHRyaWJ1dGU/LnN0YXJ0c1dpdGgoJ091dHB1dHMuJykpIHtcbiAgICAgIGNvbnN0IGRlcGVuZGFudFN0YWNrID0gdGhpcy5maW5kTmVzdGVkU3RhY2sobG9naWNhbElkLCB0aGlzLm5lc3RlZFN0YWNrcyk7XG4gICAgICBpZiAoIWRlcGVuZGFudFN0YWNrIHx8ICFkZXBlbmRhbnRTdGFjay5waHlzaWNhbE5hbWUpIHtcbiAgICAgICAgLy8gdGhpcyBpcyBhIG5ld2x5IGNyZWF0ZWQgbmVzdGVkIHN0YWNrIGFuZCBjYW5ub3QgYmUgaG90c3dhcHBlZFxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgY29uc3QgZXZhbHVhdGVDZm5UZW1wbGF0ZSA9IGF3YWl0IHRoaXMuY3JlYXRlTmVzdGVkRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlKFxuICAgICAgICBkZXBlbmRhbnRTdGFjay5waHlzaWNhbE5hbWUsXG4gICAgICAgIGRlcGVuZGFudFN0YWNrLmdlbmVyYXRlZFRlbXBsYXRlLFxuICAgICAgICBkZXBlbmRhbnRTdGFjay5nZW5lcmF0ZWRUZW1wbGF0ZS5QYXJhbWV0ZXJzISxcbiAgICAgICk7XG5cbiAgICAgIC8vIFNwbGl0IE91dHB1dHMuPHJlZk5hbWU+IGludG8gJ091dHB1dHMnIGFuZCAnPHJlZk5hbWU+JyBhbmQgcmVjdXJzaXZlbHkgY2FsbCBldmFsdWF0ZVxuICAgICAgcmV0dXJuIGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZXZhbHVhdGVDZm5FeHByZXNzaW9uKHtcbiAgICAgICAgJ0ZuOjpHZXRBdHQnOiBhdHRyaWJ1dGUuc3BsaXQoL1xcLiguKikvcyksXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gbm93LCB3ZSBuZWVkIHRvIGZvcm1hdCB0aGUgYXBwcm9wcmlhdGUgaWRlbnRpZmllciBkZXBlbmRpbmcgb24gdGhlIHJlc291cmNlIHR5cGUsXG4gICAgLy8gYW5kIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlIG5hbWVcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRSZXNvdXJjZUF0dHJpYnV0ZShmb3VuZFJlc291cmNlLCBhdHRyaWJ1dGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kTmVzdGVkU3RhY2soXG4gICAgbG9naWNhbElkOiBzdHJpbmcsXG4gICAgbmVzdGVkU3RhY2tzOiB7XG4gICAgICBbbmVzdGVkU3RhY2tMb2dpY2FsSWQ6IHN0cmluZ106IE5lc3RlZFN0YWNrVGVtcGxhdGVzO1xuICAgIH0sXG4gICk6IE5lc3RlZFN0YWNrVGVtcGxhdGVzIHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGNvbnN0IG5lc3RlZFN0YWNrTG9naWNhbElkIG9mIE9iamVjdC5rZXlzKG5lc3RlZFN0YWNrcykpIHtcbiAgICAgIGlmIChuZXN0ZWRTdGFja0xvZ2ljYWxJZCA9PT0gbG9naWNhbElkKSB7XG4gICAgICAgIHJldHVybiBuZXN0ZWRTdGFja3NbbmVzdGVkU3RhY2tMb2dpY2FsSWRdO1xuICAgICAgfVxuICAgICAgY29uc3QgY2hlY2tJbk5lc3RlZENoaWxkU3RhY2tzID0gdGhpcy5maW5kTmVzdGVkU3RhY2soXG4gICAgICAgIGxvZ2ljYWxJZCxcbiAgICAgICAgbmVzdGVkU3RhY2tzW25lc3RlZFN0YWNrTG9naWNhbElkXS5uZXN0ZWRTdGFja1RlbXBsYXRlcyxcbiAgICAgICk7XG4gICAgICBpZiAoY2hlY2tJbk5lc3RlZENoaWxkU3RhY2tzKSByZXR1cm4gY2hlY2tJbk5lc3RlZENoaWxkU3RhY2tzO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmb3JtYXRSZXNvdXJjZUF0dHJpYnV0ZShyZXNvdXJjZTogU3RhY2tSZXNvdXJjZVN1bW1hcnksIGF0dHJpYnV0ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwaHlzaWNhbElkID0gcmVzb3VyY2UuUGh5c2ljYWxSZXNvdXJjZUlkO1xuXG4gICAgLy8gbm8gYXR0cmlidXRlIG1lYW5zIFJlZiBleHByZXNzaW9uLCBmb3Igd2hpY2ggd2UgdXNlIHRoZSBwaHlzaWNhbCBJRCBkaXJlY3RseVxuICAgIGlmICghYXR0cmlidXRlKSB7XG4gICAgICByZXR1cm4gcGh5c2ljYWxJZDtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZVR5cGVGb3JtYXRzID0gUkVTT1VSQ0VfVFlQRV9BVFRSSUJVVEVTX0ZPUk1BVFNbcmVzb3VyY2UuUmVzb3VyY2VUeXBlIV07XG4gICAgaWYgKHJlc291cmNlVHlwZUZvcm1hdHMpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZUZvcm1hdEZ1bmMgPSByZXNvdXJjZVR5cGVGb3JtYXRzW2F0dHJpYnV0ZV07XG4gICAgICBpZiAoYXR0cmlidXRlRm9ybWF0RnVuYykge1xuICAgICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5nZXRTZXJ2aWNlT2ZSZXNvdXJjZShyZXNvdXJjZSk7XG4gICAgICAgIGNvbnN0IHJlc291cmNlVHlwZUFyblBhcnQgPSB0aGlzLmdldFJlc291cmNlVHlwZUFyblBhcnRPZlJlc291cmNlKHJlc291cmNlKTtcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZUZvcm1hdEZ1bmMoe1xuICAgICAgICAgIHBhcnRpdGlvbjogdGhpcy5wYXJ0aXRpb24sXG4gICAgICAgICAgc2VydmljZSxcbiAgICAgICAgICByZWdpb246IHRoaXMucmVnaW9uLFxuICAgICAgICAgIGFjY291bnQ6IHRoaXMuYWNjb3VudCxcbiAgICAgICAgICByZXNvdXJjZVR5cGU6IHJlc291cmNlVHlwZUFyblBhcnQsXG4gICAgICAgICAgcmVzb3VyY2VOYW1lOiBwaHlzaWNhbElkISxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBhd2FpdCB0aGlzLmV2YWx1YXRlQ2xvdWRDb250cm9sSWRlbnRpZmllcihyZXNvdXJjZS5Mb2dpY2FsUmVzb3VyY2VJZCEsIHJlc291cmNlLlJlc291cmNlVHlwZSEsIHBoeXNpY2FsSWQhKTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsb3VkQ29udHJvbC5nZXRSZXNvdXJjZSh7XG4gICAgICAgIFR5cGVOYW1lOiByZXNvdXJjZS5SZXNvdXJjZVR5cGUhLFxuICAgICAgICBJZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwcm9wcyA9IEpTT04ucGFyc2UocmVzcG9uc2UuUmVzb3VyY2VEZXNjcmlwdGlvbj8uUHJvcGVydGllcyA/PyAne30nKTtcbiAgICAgIGlmIChhdHRyaWJ1dGUgaW4gcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHByb3BzW2F0dHJpYnV0ZV07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gQ2xvdWQgQ29udHJvbCBsb29rdXAgZmFpbGVkIOKAlCBmYWxsIHRocm91Z2ggdG8gdGhlIGVycm9yIGJlbG93XG4gICAgICB0aHJvdyBuZXcgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbihgQ291bGQgbm90IGZpbmQgJyR7YXR0cmlidXRlfScgYXR0cmlidXRlIG9mIHRoZSAnJHtyZXNvdXJjZS5SZXNvdXJjZVR5cGV9JyByZXNvdXJjZSBiZWNhdXNlYCArXG4gICAgICAgIGBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gcmV0cmlldmUgdGhlIGluZm9ybWF0aW9uOiAnJHtlcnJvci5uYW1lfToke2Vycm9yLm1lc3NhZ2V9J2ApO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uKFxuICAgICAgYFdlIGRvbid0IHN1cHBvcnQgdGhlICcke2F0dHJpYnV0ZX0nIGF0dHJpYnV0ZSBvZiB0aGUgJyR7cmVzb3VyY2UuUmVzb3VyY2VUeXBlfScgcmVzb3VyY2UuIFRoaXMgaXMgYSBDREsgbGltaXRhdGlvbi4gYCArXG4gICAgICAgICdQbGVhc2UgcmVwb3J0IGl0IGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvbmV3L2Nob29zZScsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VydmljZU9mUmVzb3VyY2UocmVzb3VyY2U6IFN0YWNrUmVzb3VyY2VTdW1tYXJ5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb3VyY2UuUmVzb3VyY2VUeXBlIS5zcGxpdCgnOjonKVsxXS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZXNvdXJjZVR5cGVBcm5QYXJ0T2ZSZXNvdXJjZShyZXNvdXJjZTogU3RhY2tSZXNvdXJjZVN1bW1hcnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IHJlc291cmNlLlJlc291cmNlVHlwZSE7XG4gICAgY29uc3Qgc3BlY2lhbENhc2VSZXNvdXJjZVR5cGUgPSBSRVNPVVJDRV9UWVBFX1NQRUNJQUxfTkFNRVNbcmVzb3VyY2VUeXBlXT8ucmVzb3VyY2VUeXBlO1xuICAgIHJldHVybiBzcGVjaWFsQ2FzZVJlc291cmNlVHlwZVxuICAgICAgPyBzcGVjaWFsQ2FzZVJlc291cmNlVHlwZVxuICAgICAgOiAvLyB0aGlzIGlzIHRoZSBkZWZhdWx0IGNhc2VcbiAgICAgIHJlc291cmNlVHlwZS5zcGxpdCgnOjonKVsyXS50b0xvd2VyQ2FzZSgpO1xuICB9XG59XG5cbmludGVyZmFjZSBBcm5QYXJ0cyB7XG4gIHJlYWRvbmx5IHBhcnRpdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlc291cmNlVHlwZTogc3RyaW5nO1xuICByZWFkb25seSByZXNvdXJjZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXNvdXJjZXMgd2hlcmUgdGhlIENsb3VkRm9ybWF0aW9uIHBoeXNpY2FsIHJlc291cmNlIElEICh7IFJlZiB9KSBkaXNhZ3JlZXNcbiAqIHdpdGggdGhlIENsb3VkIENvbnRyb2wgQVBJIHByaW1hcnkgaWRlbnRpZmllci5cbiAqXG4gKiBNYXBzIHJlc291cmNlIHR5cGUgdG8gdGhlIENDIHByaW1hcnkgaWRlbnRpZmllciBwcm9wZXJ0eSBuYW1lcy5cbiAqIEZvciByZXNvdXJjZXMgTk9UIGluIHRoaXMgbWFwLCB0aGUgcGh5c2ljYWwgcmVzb3VyY2UgSUQgY2FuIGJlIHVzZWRcbiAqIGRpcmVjdGx5IGFzIHRoZSBDQyBwcmltYXJ5IGlkZW50aWZpZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBSRVNPVVJDRV9UWVBFX1BSSU1BUllfSURFTlRJRklFUlM6IHsgW3R5cGU6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7XG4gICdBV1M6OkFwaUdhdGV3YXk6OkF1dGhvcml6ZXInOiBbJ1Jlc3RBcGlJZCcsICdBdXRob3JpemVySWQnXSxcbiAgJ0FXUzo6QXBpR2F0ZXdheTo6RGVwbG95bWVudCc6IFsnRGVwbG95bWVudElkJywgJ1Jlc3RBcGlJZCddLFxuICAnQVdTOjpBcGlHYXRld2F5OjpNb2RlbCc6IFsnUmVzdEFwaUlkJywgJ05hbWUnXSxcbiAgJ0FXUzo6QXBpR2F0ZXdheTo6UmVxdWVzdFZhbGlkYXRvcic6IFsnUmVzdEFwaUlkJywgJ1JlcXVlc3RWYWxpZGF0b3JJZCddLFxuICAnQVdTOjpBcGlHYXRld2F5OjpEb2N1bWVudGF0aW9uUGFydCc6IFsnRG9jdW1lbnRhdGlvblBhcnRJZCcsICdSZXN0QXBpSWQnXSxcbiAgJ0FXUzo6QXBpR2F0ZXdheTo6UmVzb3VyY2UnOiBbJ1Jlc3RBcGlJZCcsICdSZXNvdXJjZUlkJ10sXG4gICdBV1M6OkFwaUdhdGV3YXk6OlN0YWdlJzogWydSZXN0QXBpSWQnLCAnU3RhZ2VOYW1lJ10sXG4gICdBV1M6OkFwaUdhdGV3YXlWMjo6QXBpTWFwcGluZyc6IFsnQXBpTWFwcGluZ0lkJywgJ0RvbWFpbk5hbWUnXSxcbiAgJ0FXUzo6QXBpR2F0ZXdheVYyOjpBdXRob3JpemVyJzogWydBdXRob3JpemVySWQnLCAnQXBpSWQnXSxcbiAgJ0FXUzo6QXBpR2F0ZXdheVYyOjpEZXBsb3ltZW50JzogWydBcGlJZCcsICdEZXBsb3ltZW50SWQnXSxcbiAgJ0FXUzo6QXBpR2F0ZXdheVYyOjpJbnRlZ3JhdGlvbic6IFsnQXBpSWQnLCAnSW50ZWdyYXRpb25JZCddLFxuICAnQVdTOjpBcGlHYXRld2F5VjI6OkludGVncmF0aW9uUmVzcG9uc2UnOiBbJ0FwaUlkJywgJ0ludGVncmF0aW9uSWQnLCAnSW50ZWdyYXRpb25SZXNwb25zZUlkJ10sXG4gICdBV1M6OkFwaUdhdGV3YXlWMjo6TW9kZWwnOiBbJ0FwaUlkJywgJ01vZGVsSWQnXSxcbiAgJ0FXUzo6QXBpR2F0ZXdheVYyOjpSb3V0ZSc6IFsnQXBpSWQnLCAnUm91dGVJZCddLFxuICAnQVdTOjpBcGlHYXRld2F5VjI6OlJvdXRlUmVzcG9uc2UnOiBbJ0FwaUlkJywgJ1JvdXRlSWQnLCAnUm91dGVSZXNwb25zZUlkJ10sXG4gICdBV1M6OkFwaUdhdGV3YXlWMjo6U3RhZ2UnOiBbJ0lkJ10sXG4gICdBV1M6OkFwcENvbmZpZzo6Q29uZmlndXJhdGlvblByb2ZpbGUnOiBbJ0FwcGxpY2F0aW9uSWQnLCAnQ29uZmlndXJhdGlvblByb2ZpbGVJZCddLFxuICAnQVdTOjpBcHBDb25maWc6OkVudmlyb25tZW50JzogWydBcHBsaWNhdGlvbklkJywgJ0Vudmlyb25tZW50SWQnXSxcbiAgJ0FXUzo6QXBwQ29uZmlnOjpIb3N0ZWRDb25maWd1cmF0aW9uVmVyc2lvbic6IFsnQXBwbGljYXRpb25JZCcsICdDb25maWd1cmF0aW9uUHJvZmlsZUlkJywgJ1ZlcnNpb25OdW1iZXInXSxcbiAgJ0FXUzo6QXBwTWVzaDo6R2F0ZXdheVJvdXRlJzogWydJZCddLFxuICAnQVdTOjpBcHBNZXNoOjpNZXNoJzogWydJZCddLFxuICAnQVdTOjpBcHBNZXNoOjpSb3V0ZSc6IFsnSWQnXSxcbiAgJ0FXUzo6QXBwTWVzaDo6VmlydHVhbEdhdGV3YXknOiBbJ0lkJ10sXG4gICdBV1M6OkFwcE1lc2g6OlZpcnR1YWxOb2RlJzogWydJZCddLFxuICAnQVdTOjpBcHBNZXNoOjpWaXJ0dWFsUm91dGVyJzogWydJZCddLFxuICAnQVdTOjpBcHBNZXNoOjpWaXJ0dWFsU2VydmljZSc6IFsnSWQnXSxcbiAgJ0FXUzo6QXBwU3luYzo6QXBpS2V5JzogWydBcGlLZXlJZCddLFxuICAnQVdTOjpBcHBTeW5jOjpHcmFwaFFMQXBpJzogWydBcGlJZCddLFxuICAnQVdTOjpCYXRjaDo6Sm9iRGVmaW5pdGlvbic6IFsnSm9iRGVmaW5pdGlvbk5hbWUnXSxcbiAgJ0FXUzo6Q2xvdWRXYXRjaDo6SW5zaWdodFJ1bGUnOiBbJ0lkJ10sXG4gICdBV1M6OkNvZGVCdWlsZDo6UHJvamVjdCc6IFsnSWQnXSxcbiAgJ0FXUzo6Q29kZUJ1aWxkOjpSZXBvcnRHcm91cCc6IFsnSWQnXSxcbiAgJ0FXUzo6Q29kZURlcGxveTo6RGVwbG95bWVudEdyb3VwJzogWydBcHBsaWNhdGlvbk5hbWUnLCAnRGVwbG95bWVudEdyb3VwTmFtZSddLFxuICAnQVdTOjpDb2RlUGlwZWxpbmU6OldlYmhvb2snOiBbJ0lkJ10sXG4gICdBV1M6OkNvZ25pdG86OlVzZXJQb29sQ2xpZW50JzogWydVc2VyUG9vbElkJywgJ0NsaWVudElkJ10sXG4gICdBV1M6OkNvZ25pdG86OlVzZXJQb29sRG9tYWluJzogWydVc2VyUG9vbElkJywgJ0RvbWFpbiddLFxuICAnQVdTOjpDb2duaXRvOjpVc2VyUG9vbEdyb3VwJzogWydVc2VyUG9vbElkJywgJ0dyb3VwTmFtZSddLFxuICAnQVdTOjpDb2duaXRvOjpVc2VyUG9vbElkZW50aXR5UHJvdmlkZXInOiBbJ1VzZXJQb29sSWQnLCAnUHJvdmlkZXJOYW1lJ10sXG4gICdBV1M6OkNvZ25pdG86OlVzZXJQb29sUmVzb3VyY2VTZXJ2ZXInOiBbJ1VzZXJQb29sSWQnLCAnSWRlbnRpZmllciddLFxuICAnQVdTOjpDb2duaXRvOjpVc2VyUG9vbFVzZXInOiBbJ1VzZXJQb29sSWQnLCAnVXNlcm5hbWUnXSxcbiAgJ0FXUzo6REFYOjpDbHVzdGVyJzogWydJZCddLFxuICAnQVdTOjpEQVg6OlBhcmFtZXRlckdyb3VwJzogWydJZCddLFxuICAnQVdTOjpEQVg6OlN1Ym5ldEdyb3VwJzogWydJZCddLFxuICAnQVdTOjpETVM6OkV2ZW50U3Vic2NyaXB0aW9uJzogWydJZCddLFxuICAnQVdTOjpFQzI6OkVJUCc6IFsnUHVibGljSXAnLCAnQWxsb2NhdGlvbklkJ10sXG4gICdBV1M6OkVDUzo6U2VydmljZSc6IFsnU2VydmljZUFybicsICdDbHVzdGVyJ10sXG4gICdBV1M6OkVsYXN0aUNhY2hlOjpDYWNoZUNsdXN0ZXInOiBbJ0lkJ10sXG4gICdBV1M6OkVsYXN0aWNMb2FkQmFsYW5jaW5nOjpMb2FkQmFsYW5jZXInOiBbJ0lkJ10sXG4gICdBV1M6OkVsYXN0aUNhY2hlOjpVc2VyJzogWydVc2VySWQnXSxcbiAgJ0FXUzo6RWxhc3RpY3NlYXJjaDo6RG9tYWluJzogWydJZCddLFxuICAnQVdTOjpFdmVudHM6OlJ1bGUnOiBbJ0FybiddLFxuICAnQVdTOjpFdmVudFNjaGVtYXM6OlJlZ2lzdHJ5UG9saWN5JzogWydJZCddLFxuICAnQVdTOjpHbHVlOjpEZXZFbmRwb2ludCc6IFsnSWQnXSxcbiAgJ0FXUzo6R2x1ZTo6V29ya2Zsb3cnOiBbJ0lkJ10sXG4gICdBV1M6OklvVDo6UG9saWN5JzogWydJZCddLFxuICAnQVdTOjpMb2dzOjpMb2dTdHJlYW0nOiBbJ0xvZ0dyb3VwTmFtZScsICdMb2dTdHJlYW1OYW1lJ10sXG4gICdBV1M6OkxvZ3M6OlN1YnNjcmlwdGlvbkZpbHRlcic6IFsnRmlsdGVyTmFtZScsICdMb2dHcm91cE5hbWUnXSxcbiAgJ0FXUzo6TWVkaWFDb252ZXJ0OjpKb2JUZW1wbGF0ZSc6IFsnSWQnXSxcbiAgJ0FXUzo6TWVkaWFDb252ZXJ0OjpQcmVzZXQnOiBbJ0lkJ10sXG4gICdBV1M6Ok1lZGlhQ29udmVydDo6UXVldWUnOiBbJ0lkJ10sXG4gICdBV1M6OlJvdXRlNTM6OlJlY29yZFNldCc6IFsnSWQnXSxcbiAgJ0FXUzo6U2FnZU1ha2VyOjpEZXZpY2UnOiBbJ0RldmljZS9EZXZpY2VOYW1lJ10sXG4gICdBV1M6OlNlY3JldHNNYW5hZ2VyOjpSZXNvdXJjZVBvbGljeSc6IFsnSWQnXSxcbiAgJ0FXUzo6U2VjcmV0c01hbmFnZXI6OlNlY3JldFRhcmdldEF0dGFjaG1lbnQnOiBbJ0lkJ10sXG4gICdBV1M6OlNFUzo6UmVjZWlwdFJ1bGVTZXQnOiBbJ0lkJ10sXG4gICdBV1M6OlNTTTo6TWFpbnRlbmFuY2VXaW5kb3dUYXJnZXQnOiBbJ1dpbmRvd0lkJywgJ1dpbmRvd1RhcmdldElkJ10sXG4gICdBV1M6OlNTTTo6TWFpbnRlbmFuY2VXaW5kb3dUYXNrJzogWydXaW5kb3dJZCcsICdXaW5kb3dUYXNrSWQnXSxcbn07XG5cbi8qKlxuICogVXN1YWxseSwgd2UgZGVkdWNlIHRoZSBuYW1lcyBvZiB0aGUgc2VydmljZSBhbmQgdGhlIHJlc291cmNlIHR5cGUgdXNlZCB0byBmb3JtYXQgdGhlIEFSTiBmcm9tIHRoZSBDbG91ZEZvcm1hdGlvbiByZXNvdXJjZSB0eXBlLlxuICogRm9yIGEgQ0ZOIHR5cGUgbGlrZSBBV1M6OlNlcnZpY2U6OlJlc291cmNlVHlwZSwgdGhlIHNlY29uZCBzZWdtZW50IGJlY29tZXMgdGhlIHNlcnZpY2UgbmFtZSwgYW5kIHRoZSB0aGlyZCB0aGUgcmVzb3VyY2UgdHlwZVxuICogKGFmdGVyIGNvbnZlcnRpbmcgYm90aCBvZiB0aGVtIHRvIGxvd2VyY2FzZSkuXG4gKiBIb3dldmVyLCBzb21lIHJlc291cmNlIHR5cGVzIGJyZWFrIHRoaXMgc2ltcGxlIGNvbnZlbnRpb24sIGFuZCB3ZSBuZWVkIHRvIHNwZWNpYWwtY2FzZSB0aGVtLlxuICogVGhpcyBtYXAgaXMgZm9yIHN0b3JpbmcgdGhvc2UgY2FzZXMuXG4gKi9cbmNvbnN0IFJFU09VUkNFX1RZUEVfU1BFQ0lBTF9OQU1FUzoge1xuICBbdHlwZTogc3RyaW5nXTogeyByZXNvdXJjZVR5cGU6IHN0cmluZyB9O1xufSA9IHtcbiAgJ0FXUzo6RXZlbnRzOjpFdmVudEJ1cyc6IHtcbiAgICByZXNvdXJjZVR5cGU6ICdldmVudC1idXMnLFxuICB9LFxufTtcblxuY29uc3QgUkVTT1VSQ0VfVFlQRV9BVFRSSUJVVEVTX0ZPUk1BVFM6IHtcbiAgW3R5cGU6IHN0cmluZ106IHsgW2F0dHJpYnV0ZTogc3RyaW5nXTogKHBhcnRzOiBBcm5QYXJ0cykgPT4gc3RyaW5nIH07XG59ID0ge1xuICAnQVdTOjpJQU06OlJvbGUnOiB7IEFybjogaWFtQXJuRm10IH0sXG4gICdBV1M6OklBTTo6VXNlcic6IHsgQXJuOiBpYW1Bcm5GbXQgfSxcbiAgJ0FXUzo6SUFNOjpHcm91cCc6IHsgQXJuOiBpYW1Bcm5GbXQgfSxcbiAgJ0FXUzo6UzM6OkJ1Y2tldCc6IHsgQXJuOiBzM0FybkZtdCB9LFxuICAnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJzogeyBBcm46IHN0ZENvbG9uUmVzb3VyY2VBcm5GbXQgfSxcbiAgJ0FXUzo6RXZlbnRzOjpFdmVudEJ1cyc6IHtcbiAgICBBcm46IHN0ZFNsYXNoUmVzb3VyY2VBcm5GbXQsXG4gICAgLy8gdGhlIG5hbWUgYXR0cmlidXRlIG9mIHRoZSBFdmVudEJ1cyBpcyB0aGUgc2FtZSBhcyB0aGUgUmVmXG4gICAgTmFtZTogKHBhcnRzKSA9PiBwYXJ0cy5yZXNvdXJjZU5hbWUsXG4gIH0sXG4gICdBV1M6OkR5bmFtb0RCOjpUYWJsZSc6IHsgQXJuOiBzdGRTbGFzaFJlc291cmNlQXJuRm10IH0sXG4gICdBV1M6OkFwcFN5bmM6OkdyYXBoUUxBcGknOiB7IEFwaUlkOiBhcHBzeW5jR3JhcGhRbEFwaUFwaUlkRm10IH0sXG4gICdBV1M6OkFwcFN5bmM6OkZ1bmN0aW9uQ29uZmlndXJhdGlvbic6IHtcbiAgICBGdW5jdGlvbklkOiBhcHBzeW5jR3JhcGhRbEZ1bmN0aW9uSURGbXQsXG4gIH0sXG4gICdBV1M6OkFwcFN5bmM6OkRhdGFTb3VyY2UnOiB7IE5hbWU6IGFwcHN5bmNHcmFwaFFsRGF0YVNvdXJjZU5hbWVGbXQgfSxcbiAgJ0FXUzo6S01TOjpLZXknOiB7IEFybjogc3RkU2xhc2hSZXNvdXJjZUFybkZtdCB9LFxufTtcblxuZnVuY3Rpb24gaWFtQXJuRm10KHBhcnRzOiBBcm5QYXJ0cyk6IHN0cmluZyB7XG4gIC8vIHdlIHNraXAgcmVnaW9uIGZvciBJQU0gcmVzb3VyY2VzXG4gIHJldHVybiBgYXJuOiR7cGFydHMucGFydGl0aW9ufToke3BhcnRzLnNlcnZpY2V9Ojoke3BhcnRzLmFjY291bnR9OiR7cGFydHMucmVzb3VyY2VUeXBlfS8ke3BhcnRzLnJlc291cmNlTmFtZX1gO1xufVxuXG5mdW5jdGlvbiBzM0FybkZtdChwYXJ0czogQXJuUGFydHMpOiBzdHJpbmcge1xuICAvLyB3ZSBza2lwIGFjY291bnQsIHJlZ2lvbiBhbmQgcmVzb3VyY2VUeXBlIGZvciBTMyByZXNvdXJjZXNcbiAgcmV0dXJuIGBhcm46JHtwYXJ0cy5wYXJ0aXRpb259OiR7cGFydHMuc2VydmljZX06Ojoke3BhcnRzLnJlc291cmNlTmFtZX1gO1xufVxuXG5mdW5jdGlvbiBzdGRDb2xvblJlc291cmNlQXJuRm10KHBhcnRzOiBBcm5QYXJ0cyk6IHN0cmluZyB7XG4gIC8vIHRoaXMgaXMgYSBzdGFuZGFyZCBmb3JtYXQgZm9yIEFSTnMgbGlrZTogYXJuOmF3czpzZXJ2aWNlOnJlZ2lvbjphY2NvdW50OnJlc291cmNlVHlwZTpyZXNvdXJjZU5hbWVcbiAgcmV0dXJuIGBhcm46JHtwYXJ0cy5wYXJ0aXRpb259OiR7cGFydHMuc2VydmljZX06JHtwYXJ0cy5yZWdpb259OiR7cGFydHMuYWNjb3VudH06JHtwYXJ0cy5yZXNvdXJjZVR5cGV9OiR7cGFydHMucmVzb3VyY2VOYW1lfWA7XG59XG5cbmZ1bmN0aW9uIHN0ZFNsYXNoUmVzb3VyY2VBcm5GbXQocGFydHM6IEFyblBhcnRzKTogc3RyaW5nIHtcbiAgLy8gdGhpcyBpcyBhIHN0YW5kYXJkIGZvcm1hdCBmb3IgQVJOcyBsaWtlOiBhcm46YXdzOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6cmVzb3VyY2VUeXBlL3Jlc291cmNlTmFtZVxuICByZXR1cm4gYGFybjoke3BhcnRzLnBhcnRpdGlvbn06JHtwYXJ0cy5zZXJ2aWNlfToke3BhcnRzLnJlZ2lvbn06JHtwYXJ0cy5hY2NvdW50fToke3BhcnRzLnJlc291cmNlVHlwZX0vJHtwYXJ0cy5yZXNvdXJjZU5hbWV9YDtcbn1cblxuZnVuY3Rpb24gYXBwc3luY0dyYXBoUWxBcGlBcGlJZEZtdChwYXJ0czogQXJuUGFydHMpOiBzdHJpbmcge1xuICAvLyBhcm46YXdzOmFwcHN5bmM6dXMtZWFzdC0xOjExMTExMTExMTExMTphcGlzLzxhcGlJZD5cbiAgcmV0dXJuIHBhcnRzLnJlc291cmNlTmFtZS5zcGxpdCgnLycpWzFdO1xufVxuXG5mdW5jdGlvbiBhcHBzeW5jR3JhcGhRbEZ1bmN0aW9uSURGbXQocGFydHM6IEFyblBhcnRzKTogc3RyaW5nIHtcbiAgLy8gYXJuOmF3czphcHBzeW5jOnVzLWVhc3QtMToxMTExMTExMTExMTE6YXBpcy88YXBpSWQ+L2Z1bmN0aW9ucy88ZnVuY3Rpb25JZD5cbiAgcmV0dXJuIHBhcnRzLnJlc291cmNlTmFtZS5zcGxpdCgnLycpWzNdO1xufVxuXG5mdW5jdGlvbiBhcHBzeW5jR3JhcGhRbERhdGFTb3VyY2VOYW1lRm10KHBhcnRzOiBBcm5QYXJ0cyk6IHN0cmluZyB7XG4gIC8vIGFybjphd3M6YXBwc3luYzp1cy1lYXN0LTE6MTExMTExMTExMTExOmFwaXMvPGFwaUlkPi9kYXRhc291cmNlcy88bmFtZT5cbiAgcmV0dXJuIHBhcnRzLnJlc291cmNlTmFtZS5zcGxpdCgnLycpWzNdO1xufVxuXG5pbnRlcmZhY2UgSW50cmluc2ljIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiBhbnk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFzeW5jR2xvYmFsUmVwbGFjZShzdHI6IHN0cmluZywgcmVnZXg6IFJlZ0V4cCwgY2I6ICh4OiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmICghcmVnZXguZ2xvYmFsKSB7XG4gICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignUmVnZXhNaXNzaW5nR2xvYmFsRmxhZycsICdSZWdleCBtdXN0IGJlIGNyZWF0ZWQgd2l0aCAvZyBmbGFnJyk7XG4gIH1cblxuICBjb25zdCByZXQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICBsZXQgc3RhcnQgPSAwO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IG1hdGNoID0gcmVnZXguZXhlYyhzdHIpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldC5wdXNoKHN0ci5zdWJzdHJpbmcoc3RhcnQsIG1hdGNoLmluZGV4KSk7XG4gICAgcmV0LnB1c2goYXdhaXQgY2IobWF0Y2hbMV0pKTtcblxuICAgIHN0YXJ0ID0gcmVnZXgubGFzdEluZGV4O1xuICB9XG4gIHJldC5wdXNoKHN0ci5zbGljZShzdGFydCkpO1xuXG4gIHJldHVybiByZXQuam9pbignJyk7XG59XG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { HotswapChange } from './common';
|
|
2
|
+
import type { ResourceChange } from '../../payloads/hotswap';
|
|
3
|
+
import { type EvaluateCloudFormationTemplate } from '../cloudformation';
|
|
4
|
+
export declare function isHotswappableCloudControlChange(logicalId: string, change: ResourceChange, evaluateCfnTemplate: EvaluateCloudFormationTemplate, _hotswapPropertyOverrides: unknown): Promise<HotswapChange[]>;
|
|
5
|
+
//# sourceMappingURL=cloud-control-resource.d.ts.map
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isHotswappableCloudControlChange = isHotswappableCloudControlChange;
|
|
4
|
+
const common_1 = require("./common");
|
|
5
|
+
const payloads_1 = require("../../payloads");
|
|
6
|
+
const cloudformation_1 = require("../cloudformation");
|
|
7
|
+
async function isHotswappableCloudControlChange(logicalId, change, evaluateCfnTemplate, _hotswapPropertyOverrides) {
|
|
8
|
+
const ret = [];
|
|
9
|
+
const changedPropNames = Object.keys(change.propertyUpdates);
|
|
10
|
+
if (changedPropNames.length === 0) {
|
|
11
|
+
return ret;
|
|
12
|
+
}
|
|
13
|
+
const classifiedChanges = (0, common_1.classifyChanges)(change, changedPropNames);
|
|
14
|
+
classifiedChanges.reportNonHotswappablePropertyChanges(ret);
|
|
15
|
+
if (classifiedChanges.namesOfHotswappableProps.length === 0) {
|
|
16
|
+
return ret;
|
|
17
|
+
}
|
|
18
|
+
const resourceType = change.newValue.Type;
|
|
19
|
+
const identifier = await resolveCloudControlIdentifier(logicalId, resourceType, evaluateCfnTemplate);
|
|
20
|
+
if (!identifier) {
|
|
21
|
+
ret.push((0, common_1.nonHotswappableChange)(change, payloads_1.NonHotswappableReason.RESOURCE_UNSUPPORTED, 'Could not determine the physical name or primary identifier of the resource, so Cloud Control API cannot hotswap it.'));
|
|
22
|
+
return ret;
|
|
23
|
+
}
|
|
24
|
+
// Eagerly evaluate property values so that unresolvable references
|
|
25
|
+
// are caught here and the resource is classified as non-hotswappable
|
|
26
|
+
// instead of failing at apply time. This is for resources that depend
|
|
27
|
+
// on resources where an update means replacement.
|
|
28
|
+
const evaluatedProps = {};
|
|
29
|
+
for (const propName of classifiedChanges.namesOfHotswappableProps) {
|
|
30
|
+
try {
|
|
31
|
+
evaluatedProps[propName] = await evaluateCfnTemplate.evaluateCfnExpression(change.propertyUpdates[propName].newValue);
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
if (e instanceof cloudformation_1.CfnEvaluationException) {
|
|
35
|
+
ret.push((0, common_1.nonHotswappableChange)(change, payloads_1.NonHotswappableReason.RESOURCE_UNSUPPORTED, `Property '${propName}' of resource '${logicalId}' has been replaced and could not be resolved: ${e.message}`));
|
|
36
|
+
return ret;
|
|
37
|
+
}
|
|
38
|
+
throw e;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
ret.push({
|
|
42
|
+
change: {
|
|
43
|
+
cause: change,
|
|
44
|
+
resources: [{
|
|
45
|
+
logicalId,
|
|
46
|
+
resourceType,
|
|
47
|
+
physicalName: identifier,
|
|
48
|
+
metadata: evaluateCfnTemplate.metadataFor(logicalId),
|
|
49
|
+
}],
|
|
50
|
+
},
|
|
51
|
+
hotswappable: true,
|
|
52
|
+
service: 'cloudcontrol',
|
|
53
|
+
apply: async (sdk) => {
|
|
54
|
+
const cloudControl = sdk.cloudControl();
|
|
55
|
+
const patchOps = [];
|
|
56
|
+
for (const propName of classifiedChanges.namesOfHotswappableProps) {
|
|
57
|
+
const diff = change.propertyUpdates[propName];
|
|
58
|
+
const newValue = evaluatedProps[propName];
|
|
59
|
+
if (diff.isRemoval) {
|
|
60
|
+
patchOps.push({ op: 'remove', path: `/${propName}` });
|
|
61
|
+
}
|
|
62
|
+
else if (diff.isAddition) {
|
|
63
|
+
patchOps.push({ op: 'add', path: `/${propName}`, value: newValue });
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
patchOps.push({ op: 'replace', path: `/${propName}`, value: newValue });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// nothing to hotswap
|
|
70
|
+
if (patchOps.length === 0) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
await cloudControl.updateResource({
|
|
74
|
+
TypeName: resourceType,
|
|
75
|
+
Identifier: identifier,
|
|
76
|
+
PatchDocument: JSON.stringify(patchOps),
|
|
77
|
+
});
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
return ret;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Resolves the Cloud Control API identifier for a resource.
|
|
84
|
+
*
|
|
85
|
+
* CCAPI resources with compound primary identifiers need their identifiers to be
|
|
86
|
+
* built by joining each component with "|". CloudFormation's PhysicalResourceId
|
|
87
|
+
* only returns a single value, which doesn't work for compound keys.
|
|
88
|
+
*
|
|
89
|
+
* Falls back to the CloudFormation physical resource ID for when the schema cannot be retrieved.
|
|
90
|
+
*/
|
|
91
|
+
async function resolveCloudControlIdentifier(logicalId, resourceType, evaluateCfnTemplate) {
|
|
92
|
+
const cfnPhysicalId = await evaluateCfnTemplate.findPhysicalNameFor(logicalId);
|
|
93
|
+
if (!cfnPhysicalId) {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
return evaluateCfnTemplate.evaluateCloudControlIdentifier(logicalId, resourceType, cfnPhysicalId);
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWQtY29udHJvbC1yZXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNsb3VkLWNvbnRyb2wtcmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFPQSw0RUFnR0M7QUF0R0QscUNBQWtFO0FBQ2xFLDZDQUF1RDtBQUd2RCxzREFBZ0c7QUFFekYsS0FBSyxVQUFVLGdDQUFnQyxDQUNwRCxTQUFpQixFQUNqQixNQUFzQixFQUN0QixtQkFBbUQsRUFDbkQseUJBQWtDO0lBRWxDLE1BQU0sR0FBRyxHQUFvQixFQUFFLENBQUM7SUFFaEMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM3RCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFDRCxNQUFNLGlCQUFpQixHQUFHLElBQUEsd0JBQWUsRUFBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUNwRSxpQkFBaUIsQ0FBQyxvQ0FBb0MsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU1RCxJQUFJLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM1RCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztJQUUxQyxNQUFNLFVBQVUsR0FBRyxNQUFNLDZCQUE2QixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNyRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFBLDhCQUFxQixFQUM1QixNQUFNLEVBQ04sZ0NBQXFCLENBQUMsb0JBQW9CLEVBQzFDLHNIQUFzSCxDQUN2SCxDQUFDLENBQUM7UUFDSCxPQUFP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QUVEOzs7Ozs7OztHQVFHO0FBQ0gsS0FBSyxVQUFVLDZCQUE2QixDQUMxQyxTQUFpQixFQUNqQixZQUFvQixFQUNwQixtQkFBbUQ7SUFFbkQsTUFBTSxhQUFhLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE9BQU8sbUJBQW1CLENBQUMsOEJBQThCLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQztBQUNwRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIb3Rzd2FwQ2hhbmdlIH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgY2xhc3NpZnlDaGFuZ2VzLCBub25Ib3Rzd2FwcGFibGVDaGFuZ2UgfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgeyBOb25Ib3Rzd2FwcGFibGVSZWFzb24gfSBmcm9tICcuLi8uLi9wYXlsb2Fkcyc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlQ2hhbmdlIH0gZnJvbSAnLi4vLi4vcGF5bG9hZHMvaG90c3dhcCc7XG5pbXBvcnQgdHlwZSB7IFNESyB9IGZyb20gJy4uL2F3cy1hdXRoL3ByaXZhdGUnO1xuaW1wb3J0IHsgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbiwgdHlwZSBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUgfSBmcm9tICcuLi9jbG91ZGZvcm1hdGlvbic7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0hvdHN3YXBwYWJsZUNsb3VkQ29udHJvbENoYW5nZShcbiAgbG9naWNhbElkOiBzdHJpbmcsXG4gIGNoYW5nZTogUmVzb3VyY2VDaGFuZ2UsXG4gIGV2YWx1YXRlQ2ZuVGVtcGxhdGU6IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSxcbiAgX2hvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlczogdW5rbm93bixcbik6IFByb21pc2U8SG90c3dhcENoYW5nZVtdPiB7XG4gIGNvbnN0IHJldDogSG90c3dhcENoYW5nZVtdID0gW107XG5cbiAgY29uc3QgY2hhbmdlZFByb3BOYW1lcyA9IE9iamVjdC5rZXlzKGNoYW5nZS5wcm9wZXJ0eVVwZGF0ZXMpO1xuICBpZiAoY2hhbmdlZFByb3BOYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gcmV0O1xuICB9XG4gIGNvbnN0IGNsYXNzaWZpZWRDaGFuZ2VzID0gY2xhc3NpZnlDaGFuZ2VzKGNoYW5nZSwgY2hhbmdlZFByb3BOYW1lcyk7XG4gIGNsYXNzaWZpZWRDaGFuZ2VzLnJlcG9ydE5vbkhvdHN3YXBwYWJsZVByb3BlcnR5Q2hhbmdlcyhyZXQpO1xuXG4gIGlmIChjbGFzc2lmaWVkQ2hhbmdlcy5uYW1lc09mSG90c3dhcHBhYmxlUHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIGNvbnN0IHJlc291cmNlVHlwZSA9IGNoYW5nZS5uZXdWYWx1ZS5UeXBlO1xuXG4gIGNvbnN0IGlkZW50aWZpZXIgPSBhd2FpdCByZXNvbHZlQ2xvdWRDb250cm9sSWRlbnRpZmllcihsb2dpY2FsSWQsIHJlc291cmNlVHlwZSwgZXZhbHVhdGVDZm5UZW1wbGF0ZSk7XG4gIGlmICghaWRlbnRpZmllcikge1xuICAgIHJldC5wdXNoKG5vbkhvdHN3YXBwYWJsZUNoYW5nZShcbiAgICAgIGNoYW5nZSxcbiAgICAgIE5vbkhvdHN3YXBwYWJsZVJlYXNvbi5SRVNPVVJDRV9VTlNVUFBPUlRFRCxcbiAgICAgICdDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBwaHlzaWNhbCBuYW1lIG9yIHByaW1hcnkgaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2UsIHNvIENsb3VkIENvbnRyb2wgQVBJIGNhbm5vdCBob3Rzd2FwIGl0LicsXG4gICAgKSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIEVhZ2VybHkgZXZhbHVhdGUgcHJvcGVydHkgdmFsdWVzIHNvIHRoYXQgdW5yZXNvbHZhYmxlIHJlZmVyZW5jZXNcbiAgLy8gYXJlIGNhdWdodCBoZXJlIGFuZCB0aGUgcmVzb3VyY2UgaXMgY2xhc3NpZmllZCBhcyBub24taG90c3dhcHBhYmxlXG4gIC8vIGluc3RlYWQgb2YgZmFpbGluZyBhdCBhcHBseSB0aW1lLiBUaGlzIGlzIGZvciByZXNvdXJjZXMgdGhhdCBkZXBlbmRcbiAgLy8gb24gcmVzb3VyY2VzIHdoZXJlIGFuIHVwZGF0ZSBtZWFucyByZXBsYWNlbWVudC5cbiAgY29uc3QgZXZhbHVhdGVkUHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBjbGFzc2lmaWVkQ2hhbmdlcy5uYW1lc09mSG90c3dhcHBhYmxlUHJvcHMpIHtcbiAgICB0cnkge1xuICAgICAgZXZhbHVhdGVkUHJvcHNbcHJvcE5hbWVdID0gYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oXG4gICAgICAgIGNoYW5nZS5wcm9wZXJ0eVVwZGF0ZXNbcHJvcE5hbWVdLm5ld1ZhbHVlLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIENmbkV2YWx1YXRpb25FeGNlcHRpb24pIHtcbiAgICAgICAgcmV0LnB1c2gobm9uSG90c3dhcHBhYmxlQ2hhbmdlKFxuICAgICAgICAgIGNoYW5nZSxcbiAgICAgICAgICBOb25Ib3Rzd2FwcGFibGVSZWFzb24uUkVTT1VSQ0VfVU5TVVBQT1JURUQsXG4gICAgICAgICAgYFByb3BlcnR5ICcke3Byb3BOYW1lfScgb2YgcmVzb3VyY2UgJyR7bG9naWNhbElkfScgaGFzIGJlZW4gcmVwbGFjZWQgYW5kIGNvdWxkIG5vdCBiZSByZXNvbHZlZDogJHtlLm1lc3NhZ2V9YCxcbiAgICAgICAgKSk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIHJldC5wdXNoKHtcbiAgICBjaGFuZ2U6IHtcbiAgICAgIGNhdXNlOiBjaGFuZ2UsXG4gICAgICByZXNvdXJjZXM6IFt7XG4gICAgICAgIGxvZ2ljYWxJZCxcbiAgICAgICAgcmVzb3VyY2VUeXBlLFxuICAgICAgICBwaHlzaWNhbE5hbWU6IGlkZW50aWZpZXIsXG4gICAgICAgIG1ldGFkYXRhOiBldmFsdWF0ZUNmblRlbXBsYXRlLm1ldGFkYXRhRm9yKGxvZ2ljYWxJZCksXG4gICAgICB9XSxcbiAgICB9LFxuICAgIGhvdHN3YXBwYWJsZTogdHJ1ZSxcbiAgICBzZXJ2aWNlOiAnY2xvdWRjb250cm9sJyxcbiAgICBhcHBseTogYXN5bmMgKHNkazogU0RLKSA9PiB7XG4gICAgICBjb25zdCBjbG91ZENvbnRyb2wgPSBzZGsuY2xvdWRDb250cm9sKCk7XG5cbiAgICAgIGNvbnN0IHBhdGNoT3BzOiBBcnJheTx7IG9wOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgdmFsdWU/OiBhbnkgfT4gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgY2xhc3NpZmllZENoYW5nZXMubmFtZXNPZkhvdHN3YXBwYWJsZVByb3BzKSB7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBjaGFuZ2UucHJvcGVydHlVcGRhdGVzW3Byb3BOYW1lXTtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBldmFsdWF0ZWRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIGlmIChkaWZmLmlzUmVtb3ZhbCkge1xuICAgICAgICAgIHBhdGNoT3BzLnB1c2goeyBvcDogJ3JlbW92ZScsIHBhdGg6IGAvJHtwcm9wTmFtZX1gIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGRpZmYuaXNBZGRpdGlvbikge1xuICAgICAgICAgIHBhdGNoT3BzLnB1c2goeyBvcDogJ2FkZCcsIHBhdGg6IGAvJHtwcm9wTmFtZX1gLCB2YWx1ZTogbmV3VmFsdWUgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGF0Y2hPcHMucHVzaCh7IG9wOiAncmVwbGFjZScsIHBhdGg6IGAvJHtwcm9wTmFtZX1gLCB2YWx1ZTogbmV3VmFsdWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gbm90aGluZyB0byBob3Rzd2FwXG4gICAgICBpZiAocGF0Y2hPcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgY2xvdWRDb250cm9sLnVwZGF0ZVJlc291cmNlKHtcbiAgICAgICAgVHlwZU5hbWU6IHJlc291cmNlVHlwZSxcbiAgICAgICAgSWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgUGF0Y2hEb2N1bWVudDogSlNPTi5zdHJpbmdpZnkocGF0Y2hPcHMpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgQ2xvdWQgQ29udHJvbCBBUEkgaWRlbnRpZmllciBmb3IgYSByZXNvdXJjZS5cbiAqXG4gKiBDQ0FQSSByZXNvdXJjZXMgd2l0aCBjb21wb3VuZCBwcmltYXJ5IGlkZW50aWZpZXJzIG5lZWQgdGhlaXIgaWRlbnRpZmllcnMgdG8gYmVcbiAqIGJ1aWx0IGJ5IGpvaW5pbmcgZWFjaCBjb21wb25lbnQgd2l0aCBcInxcIi4gQ2xvdWRGb3JtYXRpb24ncyBQaHlzaWNhbFJlc291cmNlSWRcbiAqIG9ubHkgcmV0dXJucyBhIHNpbmdsZSB2YWx1ZSwgd2hpY2ggZG9lc24ndCB3b3JrIGZvciBjb21wb3VuZCBrZXlzLlxuICpcbiAqIEZhbGxzIGJhY2sgdG8gdGhlIENsb3VkRm9ybWF0aW9uIHBoeXNpY2FsIHJlc291cmNlIElEIGZvciB3aGVuIHRoZSBzY2hlbWEgY2Fubm90IGJlIHJldHJpZXZlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNsb3VkQ29udHJvbElkZW50aWZpZXIoXG4gIGxvZ2ljYWxJZDogc3RyaW5nLFxuICByZXNvdXJjZVR5cGU6IHN0cmluZyxcbiAgZXZhbHVhdGVDZm5UZW1wbGF0ZTogRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlLFxuKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY2ZuUGh5c2ljYWxJZCA9IGF3YWl0IGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZmluZFBoeXNpY2FsTmFtZUZvcihsb2dpY2FsSWQpO1xuICBpZiAoIWNmblBoeXNpY2FsSWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZXZhbHVhdGVDbG91ZENvbnRyb2xJZGVudGlmaWVyKGxvZ2ljYWxJZCwgcmVzb3VyY2VUeXBlLCBjZm5QaHlzaWNhbElkKTtcbn1cbiJdfQ==
|