@aws-cdk/aws-mediapackagev2-alpha 2.256.1-alpha.0 → 2.258.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +243 -235
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +0 -11
- package/README.md +44 -0
- package/lib/channel-policy.js +1 -1
- package/lib/channel.js +3 -3
- package/lib/cloudfront-origin.d.ts +0 -12
- package/lib/cloudfront-origin.js +38 -7
- package/lib/endpoint.d.ts +39 -10
- package/lib/endpoint.js +39 -33
- package/lib/group.js +1 -1
- package/lib/mediapackagev2-grants.generated.js +37 -4
- package/lib/origin-endpoint-policy.d.ts +4 -0
- package/lib/origin-endpoint-policy.js +2 -2
- package/package.json +7 -7
package/lib/endpoint.js
CHANGED
|
@@ -39,6 +39,7 @@ const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
|
39
39
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
40
40
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
41
41
|
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
|
|
42
|
+
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
42
43
|
const aws_mediapackagev2_1 = require("aws-cdk-lib/aws-mediapackagev2");
|
|
43
44
|
const core_1 = require("aws-cdk-lib/core");
|
|
44
45
|
const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
|
|
@@ -225,7 +226,7 @@ var BitrateFilterKey;
|
|
|
225
226
|
class NumericExpression {
|
|
226
227
|
_expression;
|
|
227
228
|
_values;
|
|
228
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.NumericExpression", version: "2.
|
|
229
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.NumericExpression", version: "2.258.0-alpha.0" };
|
|
229
230
|
/**
|
|
230
231
|
* A single numeric value.
|
|
231
232
|
*/
|
|
@@ -257,7 +258,7 @@ exports.NumericExpression = NumericExpression;
|
|
|
257
258
|
class BitrateExpression {
|
|
258
259
|
_expression;
|
|
259
260
|
_values;
|
|
260
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.BitrateExpression", version: "2.
|
|
261
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.BitrateExpression", version: "2.258.0-alpha.0" };
|
|
261
262
|
/**
|
|
262
263
|
* A single bitrate value.
|
|
263
264
|
*/
|
|
@@ -287,7 +288,7 @@ exports.BitrateExpression = BitrateExpression;
|
|
|
287
288
|
*/
|
|
288
289
|
class ManifestFilter {
|
|
289
290
|
filterString;
|
|
290
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.ManifestFilter", version: "2.
|
|
291
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.ManifestFilter", version: "2.258.0-alpha.0" };
|
|
291
292
|
/**
|
|
292
293
|
* Filter by a single bitrate value.
|
|
293
294
|
*/
|
|
@@ -552,7 +553,7 @@ exports.ManifestFilter = ManifestFilter;
|
|
|
552
553
|
* Manifest to add to Origin Endpoint
|
|
553
554
|
*/
|
|
554
555
|
class Manifest {
|
|
555
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.Manifest", version: "2.
|
|
556
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.Manifest", version: "2.258.0-alpha.0" };
|
|
556
557
|
/**
|
|
557
558
|
* Specify a manifest configuration for Low Latency HLS.
|
|
558
559
|
*
|
|
@@ -1113,7 +1114,7 @@ var DrmSettingsKey;
|
|
|
1113
1114
|
* The EXT-X-START tag indicates a preferred point at which to start playing a playlist.
|
|
1114
1115
|
*/
|
|
1115
1116
|
class StartTag {
|
|
1116
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.StartTag", version: "2.
|
|
1117
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.StartTag", version: "2.258.0-alpha.0" };
|
|
1117
1118
|
/**
|
|
1118
1119
|
* Create a start tag with a time offset.
|
|
1119
1120
|
*
|
|
@@ -1351,7 +1352,7 @@ var IsmDrmSystem;
|
|
|
1351
1352
|
* Use `CmafEncryption.speke()`, `TsEncryption.speke()`, or `IsmEncryption.speke()` to create instances.
|
|
1352
1353
|
*/
|
|
1353
1354
|
class EncryptionConfiguration {
|
|
1354
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.EncryptionConfiguration", version: "2.
|
|
1355
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.EncryptionConfiguration", version: "2.258.0-alpha.0" };
|
|
1355
1356
|
}
|
|
1356
1357
|
exports.EncryptionConfiguration = EncryptionConfiguration;
|
|
1357
1358
|
/**
|
|
@@ -1360,7 +1361,7 @@ exports.EncryptionConfiguration = EncryptionConfiguration;
|
|
|
1360
1361
|
* Use `CmafEncryption.speke()` to create an instance.
|
|
1361
1362
|
*/
|
|
1362
1363
|
class CmafEncryption extends EncryptionConfiguration {
|
|
1363
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.CmafEncryption", version: "2.
|
|
1364
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.CmafEncryption", version: "2.258.0-alpha.0" };
|
|
1364
1365
|
/**
|
|
1365
1366
|
* Create a SPEKE-based encryption configuration for CMAF segments.
|
|
1366
1367
|
*/
|
|
@@ -1429,7 +1430,7 @@ exports.CmafEncryption = CmafEncryption;
|
|
|
1429
1430
|
* Use `TsEncryption.speke()` to create an instance.
|
|
1430
1431
|
*/
|
|
1431
1432
|
class TsEncryption extends EncryptionConfiguration {
|
|
1432
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.TsEncryption", version: "2.
|
|
1433
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.TsEncryption", version: "2.258.0-alpha.0" };
|
|
1433
1434
|
/**
|
|
1434
1435
|
* Create a SPEKE-based encryption configuration for TS segments.
|
|
1435
1436
|
*/
|
|
@@ -1496,7 +1497,7 @@ exports.TsEncryption = TsEncryption;
|
|
|
1496
1497
|
* Use `IsmEncryption.speke()` to create an instance.
|
|
1497
1498
|
*/
|
|
1498
1499
|
class IsmEncryption extends EncryptionConfiguration {
|
|
1499
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.IsmEncryption", version: "2.
|
|
1500
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.IsmEncryption", version: "2.258.0-alpha.0" };
|
|
1500
1501
|
/**
|
|
1501
1502
|
* Create a SPEKE-based encryption configuration for ISM segments.
|
|
1502
1503
|
*/
|
|
@@ -1548,7 +1549,7 @@ exports.IsmEncryption = IsmEncryption;
|
|
|
1548
1549
|
* Helper class for creating segment configurations.
|
|
1549
1550
|
*/
|
|
1550
1551
|
class Segment {
|
|
1551
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.Segment", version: "2.
|
|
1552
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.Segment", version: "2.258.0-alpha.0" };
|
|
1552
1553
|
/**
|
|
1553
1554
|
* Create a TS (Transport Stream) segment configuration.
|
|
1554
1555
|
*
|
|
@@ -1692,33 +1693,20 @@ class OriginEndpointBase extends aws_cdk_lib_1.Resource {
|
|
|
1692
1693
|
}
|
|
1693
1694
|
/**
|
|
1694
1695
|
* CDN authorization configuration to be applied when the policy is created.
|
|
1696
|
+
* Set by subclass constructors when `cdnAuth` is provided in props.
|
|
1695
1697
|
*/
|
|
1696
1698
|
cdnAuthConfig;
|
|
1697
|
-
/**
|
|
1698
|
-
* Set CDN auth config. Used by subclass constructors.
|
|
1699
|
-
* @internal
|
|
1700
|
-
*/
|
|
1701
|
-
_setCdnAuth(cdnAuth) {
|
|
1702
|
-
if (!this.cdnAuthConfig) {
|
|
1703
|
-
this.cdnAuthConfig = cdnAuth;
|
|
1704
|
-
}
|
|
1705
|
-
}
|
|
1706
1699
|
/**
|
|
1707
1700
|
* Configure origin endpoint policy.
|
|
1708
1701
|
*
|
|
1709
|
-
* You can only add 1 OriginEndpointPolicy to an OriginEndpoint.
|
|
1710
|
-
*
|
|
1702
|
+
* You can only add 1 OriginEndpointPolicy to an OriginEndpoint. If you have already
|
|
1703
|
+
* defined one, this will append to the policy already created.
|
|
1704
|
+
*
|
|
1705
|
+
* To configure CDN authentication, set `cdnAuth` on the construct's props instead.
|
|
1711
1706
|
*
|
|
1712
1707
|
* @param statement - The policy statement to add
|
|
1713
|
-
* @param cdnAuth - Optional CDN authorization configuration. If provided, the policy will be
|
|
1714
|
-
* created with CDN authentication enabled using secrets from AWS Secrets Manager.
|
|
1715
|
-
* If cdnAuth is provided multiple times, only the first configuration is used.
|
|
1716
1708
|
*/
|
|
1717
|
-
addToResourcePolicy(statement
|
|
1718
|
-
// Store CDN auth config if provided (only if not already set)
|
|
1719
|
-
if (cdnAuth && !this.cdnAuthConfig) {
|
|
1720
|
-
this.cdnAuthConfig = cdnAuth;
|
|
1721
|
-
}
|
|
1709
|
+
addToResourcePolicy(statement) {
|
|
1722
1710
|
if (!this.policy && this.autoCreatePolicy) {
|
|
1723
1711
|
this.policy = new origin_endpoint_policy_1.OriginEndpointPolicy(this, 'Policy', {
|
|
1724
1712
|
originEndpoint: this,
|
|
@@ -1868,7 +1856,7 @@ let OriginEndpoint = (() => {
|
|
|
1868
1856
|
OriginEndpoint = _classThis = _classDescriptor.value;
|
|
1869
1857
|
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
1870
1858
|
}
|
|
1871
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.OriginEndpoint", version: "2.
|
|
1859
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.OriginEndpoint", version: "2.258.0-alpha.0" };
|
|
1872
1860
|
/** Uniquely identifies this class. */
|
|
1873
1861
|
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-mediapackagev2-alpha.OriginEndpoint';
|
|
1874
1862
|
channelGroupName;
|
|
@@ -2030,9 +2018,27 @@ let OriginEndpoint = (() => {
|
|
|
2030
2018
|
this.originEndpointName = origin.originEndpointName;
|
|
2031
2019
|
this.originEndpointArn = origin.attrArn;
|
|
2032
2020
|
origin.applyRemovalPolicy(props?.removalPolicy ?? aws_cdk_lib_1.RemovalPolicy.DESTROY);
|
|
2033
|
-
//
|
|
2021
|
+
// When cdnAuth is set, pre-create the endpoint policy with the AWS-recommended gating
|
|
2022
|
+
// statement. The principal is `*` (anonymous) because CDN requests to MediaPackage are
|
|
2023
|
+
// unsigned HTTPS — only the matching CDN-Identifier header proves authorisation.
|
|
2024
|
+
// See https://docs.aws.amazon.com/mediapackage/latest/userguide/cdn-auth-setup.html
|
|
2034
2025
|
if (props.cdnAuth) {
|
|
2035
|
-
|
|
2026
|
+
if (props.cdnAuth.secrets.length === 0) {
|
|
2027
|
+
throw new core_1.ValidationError((0, helpers_internal_1.lit) `CdnAuthSecretsRequired`, 'cdnAuth.secrets must contain at least one secret. CDN authorization needs a secret to validate incoming CDN-Identifier headers.', this);
|
|
2028
|
+
}
|
|
2029
|
+
this.cdnAuthConfig = props.cdnAuth;
|
|
2030
|
+
this.addToResourcePolicy(new aws_iam_1.PolicyStatement({
|
|
2031
|
+
sid: 'AllowGetObjectAccessForAuthorizedRequest',
|
|
2032
|
+
effect: aws_iam_1.Effect.ALLOW,
|
|
2033
|
+
principals: [new aws_iam_1.StarPrincipal()],
|
|
2034
|
+
actions: ['mediapackagev2:GetObject'],
|
|
2035
|
+
resources: [this.originEndpointArn],
|
|
2036
|
+
conditions: {
|
|
2037
|
+
Bool: {
|
|
2038
|
+
'mediapackagev2:RequestHasMatchingCdnAuthHeader': 'true',
|
|
2039
|
+
},
|
|
2040
|
+
},
|
|
2041
|
+
}));
|
|
2036
2042
|
}
|
|
2037
2043
|
}
|
|
2038
2044
|
static {
|
|
@@ -2045,4 +2051,4 @@ exports.OriginEndpoint = OriginEndpoint;
|
|
|
2045
2051
|
function omitEmptyArray(a) {
|
|
2046
2052
|
return a.length > 0 ? a : undefined;
|
|
2047
2053
|
}
|
|
2048
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJlbmRwb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSw2Q0FBMEc7QUFHMUcsK0RBQTBEO0FBRTFELHVFQUFtRTtBQUVuRSwyQ0FBeUY7QUFDekYsNEVBQTREO0FBQzVELDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFJMUUscUVBQWdFO0FBQ2hFLHFEQUFtRTtBQUVuRTs7OztHQUlHO0FBQ0gsSUFBWSxVQVNYO0FBVEQsV0FBWSxVQUFVO0lBQ3BCLHlCQUF5QjtJQUN6QiwyQkFBYSxDQUFBO0lBQ2IseUJBQXlCO0lBQ3pCLDJCQUFhLENBQUE7SUFDYixxREFBcUQ7SUFDckQsMkJBQWEsQ0FBQTtJQUNiLDBEQUEwRDtJQUMxRCwyQkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQVRXLFVBQVUsMEJBQVYsVUFBVSxRQVNyQjtBQUVEOzs7O0dBSUc7QUFDSCxJQUFZLFVBT1g7QUFQRCxXQUFZLFVBQVU7SUFDcEIsZ0JBQWdCO0lBQ2hCLDJCQUFhLENBQUE7SUFDYixpQkFBaUI7SUFDakIsMkJBQWEsQ0FBQTtJQUNiLFVBQVU7SUFDVix5QkFBVyxDQUFBO0FBQ2IsQ0FBQyxFQVBXLFVBQVUsMEJBQVYsVUFBVSxRQU9yQjtBQUVEOzs7O0dBSUc7QUFDSCxJQUFZLGlCQVNYO0FBVEQsV0FBWSxpQkFBaUI7SUFDM0IsbUJBQW1CO0lBQ25CLDhCQUFTLENBQUE7SUFDVCxZQUFZO0lBQ1osb0NBQWUsQ0FBQTtJQUNmLHVCQUF1QjtJQUN2QixnQ0FBVyxDQUFBO0lBQ1gsNkJBQTZCO0lBQzdCLGdDQUFXLENBQUE7QUFDYixDQUFDLEVBVFcsaUJBQWlCLGlDQUFqQixpQkFBaUIsUUFTNUI7QUFFRDs7OztHQUlHO0FBQ0gsSUFBWSxhQU9YO0FBUEQsV0FBWSxhQUFhO0lBQ3ZCLDhCQUE4QjtJQUM5QixrQ0FBaUIsQ0FBQTtJQUNqQiw2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QWMsQ0FBQztZQUN4QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1lBQ2hELElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztZQUN0QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDO1lBQ3BELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBRXhDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsYUFBYSxJQUFJLDJCQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFekUsK0NBQStDO1lBQy9DLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsQyxDQUFDO1NBQ0Y7O1lBeExVLHVEQUFjOzs7OztBQUFkLHdDQUFjO0FBMkwzQixTQUFTLGNBQWMsQ0FBSSxDQUFXO0lBQ3BDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJpdHJhdGUsIElSZXNvdXJjZSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IFJlbW92YWxQb2xpY3ksIEFybkZvcm1hdCwgRHVyYXRpb24sIEZuLCBMYXp5LCBOYW1lcywgUmVzb3VyY2UsIFN0YWNrLCBUb2tlbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlIHsgSUNlcnRpZmljYXRlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlcic7XG5pbXBvcnQgdHlwZSB7IE1ldHJpY09wdGlvbnMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBNZXRyaWMsIFVuaXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgdHlwZSB7IElSb2xlLCBQb2xpY3lTdGF0ZW1lbnQsIEFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IENmbk9yaWdpbkVuZHBvaW50IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW1lZGlhcGFja2FnZXYyJztcbmltcG9ydCB0eXBlIHsgSU9yaWdpbkVuZHBvaW50UmVmLCBPcmlnaW5FbmRwb2ludFJlZmVyZW5jZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1tZWRpYXBhY2thZ2V2Mic7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IsIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yLCBDZm5SZXNvdXJjZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgbGl0IH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBJQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbCc7XG5pbXBvcnQgdHlwZSB7IENkbkF1dGhDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9vcmlnaW4tZW5kcG9pbnQtcG9saWN5JztcbmltcG9ydCB7IE9yaWdpbkVuZHBvaW50UG9saWN5IH0gZnJvbSAnLi9vcmlnaW4tZW5kcG9pbnQtcG9saWN5JztcbmltcG9ydCB7IGNvbnZlcnREYXRlVG9TdHJpbmcsIHJlbmRlclRhZ3MgfSBmcm9tICcuL3NoYXJlZC1oZWxwZXJzJztcblxuLyoqXG4gKiBBY2NlcHRlZCBhdWRpbyBjb2RlYyB2YWx1ZXMgZm9yIG1hbmlmZXN0IGZpbHRlcmluZy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYXBhY2thZ2UvbGF0ZXN0L3VzZXJndWlkZS9tYW5pZmVzdC1maWx0ZXItcXVlcnktcGFyYW1ldGVycy5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIEF1ZGlvQ29kZWMge1xuICAvKiogQUFDLUxDIGF1ZGlvIGNvZGVjICovXG4gIEFBQ0wgPSAnQUFDTCcsXG4gIC8qKiBIRS1BQUMgYXVkaW8gY29kZWMgKi9cbiAgQUFDSCA9ICdBQUNIJyxcbiAgLyoqIERvbGJ5IERpZ2l0YWwgYXVkaW8gY29kZWMgKGluY2x1ZGUgdGhlIGh5cGhlbikgKi9cbiAgQUNfMyA9ICdBQy0zJyxcbiAgLyoqIERvbGJ5IERpZ2l0YWwgUGx1cyBhdWRpbyBjb2RlYyAoaW5jbHVkZSB0aGUgaHlwaGVuKSAqL1xuICBFQ18zID0gJ0VDLTMnLFxufVxuXG4vKipcbiAqIEFjY2VwdGVkIHZpZGVvIGNvZGVjIHZhbHVlcyBmb3IgbWFuaWZlc3QgZmlsdGVyaW5nLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhcGFja2FnZS9sYXRlc3QvdXNlcmd1aWRlL21hbmlmZXN0LWZpbHRlci1xdWVyeS1wYXJhbWV0ZXJzLmh0bWxcbiAqL1xuZXhwb3J0IGVudW0gVmlkZW9Db2RlYyB7XG4gIC8qKiBILjI2NC9BVkMgKi9cbiAgSDI2NCA9ICdIMjY0JyxcbiAgLyoqIEguMjY1L0hFVkMgKi9cbiAgSDI2NSA9ICdIMjY1JyxcbiAgLyoqIEFWMSAqL1xuICBBVjEgPSAnQVYxJyxcbn1cblxuLyoqXG4gKiBBY2NlcHRlZCB2aWRlbyBkeW5hbWljIHJhbmdlIHZhbHVlcyBmb3IgbWFuaWZlc3QgZmlsdGVyaW5nLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhcGFja2FnZS9sYXRlc3QvdXNlcmd1aWRlL21hbmlmZXN0LWZpbHRlci1xdWVyeS1wYXJhbWV0ZXJzLmh0bWxcbiAqL1xuZXhwb3J0IGVudW0gVmlkZW9EeW5hbWljUmFuZ2Uge1xuICAvKiogRG9sYnkgVmlzaW9uICovXG4gIERWID0gJ2R2JyxcbiAgLyoqIEhEUjEwICovXG4gIEhEUjEwID0gJ2hkcjEwJyxcbiAgLyoqIEh5YnJpZCBMb2ctR2FtbWEgKi9cbiAgSExHID0gJ2hsZycsXG4gIC8qKiBTdGFuZGFyZCBEeW5hbWljIFJhbmdlICovXG4gIFNEUiA9ICdzZHInLFxufVxuXG4vKipcbiAqIEFjY2VwdGVkIHRyaWNrcGxheSB0eXBlIHZhbHVlcyBmb3IgbWFuaWZlc3QgZmlsdGVyaW5nLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhcGFja2FnZS9sYXRlc3QvdXNlcmd1aWRlL21hbmlmZXN0LWZpbHRlci1xdWVyeS1wYXJhbWV0ZXJzLmh0bWxcbiAqL1xuZXhwb3J0IGVudW0gVHJpY2twbGF5VHlwZSB7XG4gIC8qKiBJLWZyYW1lIG9ubHkgdHJpY2stcGxheSAqL1xuICBJRlJBTUUgPSAnaWZyYW1lJyxcbiAgLyoqIEltYWdlLWJhc2VkIHRyaWNrLXBsYXkgKi9cbiAgSU1BR0UgPSAnaW1hZ2UnLFxuICAvKiogTm8gdHJpY2stcGxheSAqL1xuICBOT05FID0gJ25vbmUnLFxufVxuXG4vKipcbiAqIE51bWVyaWMgbWFuaWZlc3QgZmlsdGVyIGtleXMuXG4gKlxuICogVXNlIHdpdGggYE1hbmlmZXN0RmlsdGVyLm51bWVyaWMoKWAsIGBNYW5pZmVzdEZpbHRlci5udW1lcmljTGlzdCgpYCwgYW5kIGBNYW5pZmVzdEZpbHRlci5udW1lcmljUmFuZ2UoKWAuXG4gKlxuICogQXVkaW8gYW5kIHZpZGVvIGJpdHJhdGUgZmlsdGVycyBhcmUgbm90IGluY2x1ZGVkIGhlcmUgYmVjYXVzZSB0aGV5IHVzZSB0aGVcbiAqIGBCaXRyYXRlYCBjbGFzcyBkaXJlY3RseSB2aWEgZGVkaWNhdGVkIG1ldGhvZHMgb24gYE1hbmlmZXN0RmlsdGVyYC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYXBhY2thZ2UvbGF0ZXN0L3VzZXJndWlkZS9tYW5pZmVzdC1maWx0ZXItcXVlcnktcGFyYW1ldGVycy5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIE51bWVyaWNGaWx0ZXJLZXkge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBhdWRpbyBjaGFubmVscy5cbiAgICpcbiAgICogQWNjZXB0ZWQgdmFsdWVzOiByYW5nZSAx4oCTMzI3NjcsIG9yIGluZGl2aWR1YWwgaW50ZWdlcnMuXG4gICAqL1xuICBBVURJT19DSEFOTkVMUz0nYXVkaW9fY2hhbm5lbHMnLFxuICAvKipcbiAgICogVGhlIGF1ZGlvIHNhbXBsZSByYXRlIGluIEh6LlxuICAgKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXM6IHJhbmdlIDDigJMyMTQ3NDgzNjQ3LCBvciBpbmRpdmlkdWFsIGludGVnZXJzLlxuICAgKi9cbiAgQVVESU9fU0FNUExFX1JBVEU9J2F1ZGlvX3NhbXBsZV9yYXRlJyxcbiAgLyoqXG4gICAqIFRoZSBoZWlnaHQgb2YgdGhlIHRyaWNrLXBsYXkgaW1hZ2UgaW4gcGl4ZWxzIChJLWZyYW1lIGFuZCBpbWFnZS1iYXNlZCB0cmljay1wbGF5KS5cbiAgICpcbiAgICogSWYgdXNpbmcgd2l0aCBJLWZyYW1lIG9ubHkgdHJpY2stcGxheSwgYFRSSUNLUExBWV9IRUlHSFRgIGFuZCBgVklERU9fSEVJR0hUYFxuICAgKiBzaG91bGQgaGF2ZSBzaW1pbGFyIHZhbHVlcy4gSWYgdGhleSBkaWZmZXIsIEktZnJhbWUgb25seSB0cmFja3MgbWlnaHQgYmVcbiAgICogcmVtb3ZlZCBmcm9tIHRoZSBtYW5pZmVzdC5cbiAgICpcbiAgICogQWNjZXB0ZWQgdmFsdWVzOiByYW5nZSAx4oCTMjE0NzQ4MzY0Nywgb3IgaW5kaXZpZHVhbCBpbnRlZ2Vycy5cbiAgICovXG4gIFRSSUNLUExBWV9IRUlHSFQ9J3RyaWNrcGxheV9oZWlnaHQnLFxuICAvKipcbiAgICogVGhlIHZpZGVvIGZyYW1lIHJhdGUgcmFuZ2UgaW4gTlRTQyBmb3JtYXQuXG4gICAqXG4gICAqIFdoZW4gZmlsdGVyaW5nIGZvciBhIHNpbmdsZSB2YWx1ZSwgTWVkaWFQYWNrYWdlIHVzZXMgYW4gYXBwcm94aW1hdGUgZXF1YWxzXG4gICAqIGNvbXBhcmlzb24gd2l0aCBhbiBlcHNpbG9uIHRvbGVyYW5jZSBvZiAwLjAwMDUuXG4gICAqXG4gICAqIEFjY2VwdGVkIHZhbHVlczogcmFuZ2UgMeKAkzk5OS45OTkgKHVwIHRvIHRocmVlIGRlY2ltYWwgcGxhY2VzKSwgb3IgaW5kaXZpZHVhbCB2YWx1ZXMuXG4gICAqL1xuICBWSURFT19GUkFNRVJBVEU9J3ZpZGVvX2ZyYW1lcmF0ZScsXG4gIC8qKlxuICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSB2aWRlbyBpbiBwaXhlbHMuXG4gICAqXG4gICAqIElmIHVzaW5nIHdpdGggSS1mcmFtZSBvbmx5IHRyaWNrLXBsYXksIGBUUklDS1BMQVlfSEVJR0hUYCBhbmQgYFZJREVPX0hFSUdIVGBcbiAgICogc2hvdWxkIGhhdmUgc2ltaWxhciB2YWx1ZXMuIElmIHRoZXkgZGlmZmVyLCBJLWZyYW1lIG9ubHkgdHJhY2tzIG1pZ2h0IGJlXG4gICAqIHJlbW92ZWQgZnJvbSB0aGUgbWFuaWZlc3QuXG4gICAqXG4gICAqIEFjY2VwdGVkIHZhbHVlczogcmFuZ2UgMeKAkzMyNzY3LCBvciBpbmRpdmlkdWFsIGludGVnZXJzLlxuICAgKi9cbiAgVklERU9fSEVJR0hUPSd2aWRlb19oZWlnaHQnLFxufVxuXG4vKipcbiAqIFRleHQgbWFuaWZlc3QgZmlsdGVyIGtleXMgZm9yIGZyZWUtZm9ybSBzdHJpbmcgdmFsdWVzLlxuICpcbiAqIFVzZSB3aXRoIGBNYW5pZmVzdEZpbHRlci50ZXh0KClgIGFuZCBgTWFuaWZlc3RGaWx0ZXIudGV4dExpc3QoKWAuXG4gKlxuICogRm9yIGtleXMgd2l0aCBmaXhlZCBhY2NlcHRlZCB2YWx1ZXMsIHVzZSB0aGUgZGVkaWNhdGVkIG1ldGhvZHMgb24gYE1hbmlmZXN0RmlsdGVyYCBpbnN0ZWFkOlxuICogLSBBdWRpbyBjb2RlYzogYE1hbmlmZXN0RmlsdGVyLmF1ZGlvQ29kZWMoKWAgLyBgTWFuaWZlc3RGaWx0ZXIuYXVkaW9Db2RlY0xpc3QoKWBcbiAqIC0gVmlkZW8gY29kZWM6IGBNYW5pZmVzdEZpbHRlci52aWRlb0NvZGVjKClgIC8gYE1hbmlmZXN0RmlsdGVyLnZpZGVvQ29kZWNMaXN0KClgXG4gKiAtIFZpZGVvIGR5bmFtaWMgcmFuZ2U6IGBNYW5pZmVzdEZpbHRlci52aWRlb0R5bmFtaWNSYW5nZSgpYCAvIGBNYW5pZmVzdEZpbHRlci52aWRlb0R5bmFtaWNSYW5nZUxpc3QoKWBcbiAqIC0gVHJpY2twbGF5IHR5cGU6IGBNYW5pZmVzdEZpbHRlci50cmlja3BsYXlUeXBlKClgIC8gYE1hbmlmZXN0RmlsdGVyLnRyaWNrcGxheVR5cGVMaXN0KClgXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWVkaWFwYWNrYWdlL2xhdGVzdC91c2VyZ3VpZGUvbWFuaWZlc3QtZmlsdGVyLXF1ZXJ5LXBhcmFtZXRlcnMuaHRtbFxuICovXG5leHBvcnQgZW51bSBUZXh0RmlsdGVyS2V5IHtcbiAgLyoqXG4gICAqIEF1ZGlvIGxhbmd1YWdlcyBvciBmdW5jdGlvbmFsIGNvZGVzIGRlcml2ZWQgZnJvbSBlbmNvZGVyIHBhc3N0aHJvdWdoLlxuICAgKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXM6IGFyYml0cmFyeSBzdHJpbmdzIHN1Y2ggYXMgSVNPLTYzOS0xIGxhbmd1YWdlIGNvZGVzIChub3QgY2FzZS1zZW5zaXRpdmUpLlxuICAgKi9cbiAgQVVESU9fTEFOR1VBR0U9J2F1ZGlvX2xhbmd1YWdlJyxcbiAgLyoqXG4gICAqIFRoZSBzdWJ0aXRsZSBsYW5ndWFnZSBvciBmdW5jdGlvbmFsIGNvZGVzIGRlcml2ZWQgZnJvbSBlbmNvZGVyIHBhc3N0aHJvdWdoLlxuICAgKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXM6IGFyYml0cmFyeSBzdHJpbmdzIHN1Y2ggYXMgSVNPLTYzOS0xIGxhbmd1YWdlIGNvZGVzIChub3QgY2FzZS1zZW5zaXRpdmUpLlxuICAgKi9cbiAgU1VCVElUTEVfTEFOR1VBR0U9J3N1YnRpdGxlX2xhbmd1YWdlJyxcbn1cblxuLyoqXG4gKiBCaXRyYXRlIG1hbmlmZXN0IGZpbHRlciBrZXlzLlxuICpcbiAqIFVzZSB3aXRoIGBNYW5pZmVzdEZpbHRlci5iaXRyYXRlKClgIGFuZCBgTWFuaWZlc3RGaWx0ZXIuYml0cmF0ZVJhbmdlKClgLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhcGFja2FnZS9sYXRlc3QvdXNlcmd1aWRlL21hbmlmZXN0LWZpbHRlci1xdWVyeS1wYXJhbWV0ZXJzLmh0bWxcbiAqL1xuZXhwb3J0IGVudW0gQml0cmF0ZUZpbHRlcktleSB7XG4gIC8qKlxuICAgKiBUaGUgYXVkaW8gYml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQuXG4gICAqXG4gICAqIEFjY2VwdGVkIHZhbHVlczogcmFuZ2UgMOKAkzIxNDc0ODM2NDcsIG9yIGluZGl2aWR1YWwgaW50ZWdlcnMuXG4gICAqL1xuICBBVURJT19CSVRSQVRFPSdhdWRpb19iaXRyYXRlJyxcbiAgLyoqXG4gICAqIFRoZSB2aWRlbyBiaXRyYXRlIGluIGJpdHMgcGVyIHNlY29uZC5cbiAgICpcbiAgICogV2UgcmVjb21tZW5kIHVzaW5nIG9ubHkgdGhpcyBmaWx0ZXIgcGFyYW1ldGVyIHRvIHNldCB0aGUgdmlkZW8gYml0cmF0ZS5cbiAgICogRG8gbm90IGFsc28gc2V0IHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZpZGVvIGJpdHJhdGUgdmlhIHRoZSBNZWRpYVBhY2thZ2VcbiAgICogY29uc29sZSBvciBBV1MgQ0xJLCBhcyB5b3VyIG91dHB1dCBtaWdodCBiZSBza2V3ZWQuXG4gICAqXG4gICAqIFRoaXMgcGFyYW1ldGVyIGNhbm5vdCBiZSB1c2VkIHdpdGggdHJpY2stcGxheSBzdHJlYW1zLlxuICAgKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXM6IHJhbmdlIDDigJMyMTQ3NDgzNjQ3LCBvciBpbmRpdmlkdWFsIGludGVnZXJzLlxuICAgKi9cbiAgVklERU9fQklUUkFURT0ndmlkZW9fYml0cmF0ZScsXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIG51bWVyaWMgZmlsdGVyIGV4cHJlc3Npb24gc2VnbWVudCDigJQgZWl0aGVyIGEgc2luZ2xlIHZhbHVlIG9yIGEgcmFuZ2UuXG4gKlxuICogVXNlIHdpdGggYE1hbmlmZXN0RmlsdGVyLm51bWVyaWNDb21ibygpYCB0byBidWlsZCBmaWx0ZXJzIHRoYXQgY29tYmluZVxuICogcmFuZ2VzIGFuZCBpbmRpdmlkdWFsIHZhbHVlcyAoZS5nLiBgdmlkZW9faGVpZ2h0OjI0MC0zNjAsNzIwLTEwODAsMTQ0MGApLlxuICovXG5leHBvcnQgY2xhc3MgTnVtZXJpY0V4cHJlc3Npb24ge1xuICAvKipcbiAgICogQSBzaW5nbGUgbnVtZXJpYyB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmFsdWUodjogbnVtYmVyKTogTnVtZXJpY0V4cHJlc3Npb24ge1xuICAgIHJldHVybiBuZXcgTnVtZXJpY0V4cHJlc3Npb24oYCR7dn1gLCBbdl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGluY2x1c2l2ZSBudW1lcmljIHJhbmdlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByYW5nZShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IE51bWVyaWNFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gbmV3IE51bWVyaWNFeHByZXNzaW9uKGAke3N0YXJ0fS0ke2VuZH1gLCBbc3RhcnQsIGVuZF0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgX2V4cHJlc3Npb246IHN0cmluZyxcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHVibGljIHJlYWRvbmx5IF92YWx1ZXM6IG51bWJlcltdLFxuICApIHt9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGJpdHJhdGUgZmlsdGVyIGV4cHJlc3Npb24gc2VnbWVudCDigJQgZWl0aGVyIGEgc2luZ2xlIHZhbHVlIG9yIGEgcmFuZ2UuXG4gKlxuICogVXNlIHdpdGggYE1hbmlmZXN0RmlsdGVyLmJpdHJhdGVDb21ibygpYCB0byBidWlsZCBmaWx0ZXJzIHRoYXQgY29tYmluZVxuICogcmFuZ2VzIGFuZCBpbmRpdmlkdWFsIGJpdHJhdGUgdmFsdWVzLlxuICovXG5leHBvcnQgY2xhc3MgQml0cmF0ZUV4cHJlc3Npb24ge1xuICAvKipcbiAgICogQSBzaW5nbGUgYml0cmF0ZSB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmFsdWUodjogQml0cmF0ZSk6IEJpdHJhdGVFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gbmV3IEJpdHJhdGVFeHByZXNzaW9uKGAke3YudG9CcHMoKX1gLCBbdi50b0JwcygpXSk7XG4gIH1cblxuICAvKipcbiAgICogQW4gaW5jbHVzaXZlIGJpdHJhdGUgcmFuZ2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJhbmdlKHN0YXJ0OiBCaXRyYXRlLCBlbmQ6IEJpdHJhdGUpOiBCaXRyYXRlRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIG5ldyBCaXRyYXRlRXhwcmVzc2lvbihgJHtzdGFydC50b0JwcygpfS0ke2VuZC50b0JwcygpfWAsIFtzdGFydC50b0JwcygpLCBlbmQudG9CcHMoKV0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgX2V4cHJlc3Npb246IHN0cmluZyxcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHVibGljIHJlYWRvbmx5IF92YWx1ZXM6IG51bWJlcltdLFxuICApIHt9XG59XG5cbi8qKlxuICogRW5hYmxlcyB5b3UgdG8gY3JlYXRlIGZpbHRlcnMgZm9yIHlvdXIgT3JpZ2luIEVuZHBvaW50LlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhcGFja2FnZS9sYXRlc3QvdXNlcmd1aWRlL21hbmlmZXN0LWZpbHRlcmluZy5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBNYW5pZmVzdEZpbHRlciB7XG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgYSBzaW5nbGUgYml0cmF0ZSB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYml0cmF0ZShrZXk6IEJpdHJhdGVGaWx0ZXJLZXksIHZhbHVlOiBCaXRyYXRlKSB7XG4gICAgY29uc3QgYnBzID0gdmFsdWUudG9CcHMoKTtcbiAgICB2YWxpZGF0ZUJpdHJhdGVGaWx0ZXJWYWx1ZShicHMsIGtleSk7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdEZpbHRlcihgJHtrZXl9OiR7YnBzfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBhIGJpdHJhdGUgcmFuZ2UgKGluY2x1c2l2ZSkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGJpdHJhdGVSYW5nZShrZXk6IEJpdHJhdGVGaWx0ZXJLZXksIHN0YXJ0OiBCaXRyYXRlLCBlbmQ6IEJpdHJhdGUpIHtcbiAgICBjb25zdCBzdGFydEJwcyA9IHN0YXJ0LnRvQnBzKCk7XG4gICAgY29uc3QgZW5kQnBzID0gZW5kLnRvQnBzKCk7XG4gICAgdmFsaWRhdGVCaXRyYXRlRmlsdGVyVmFsdWUoc3RhcnRCcHMsIGtleSk7XG4gICAgdmFsaWRhdGVCaXRyYXRlRmlsdGVyVmFsdWUoZW5kQnBzLCBrZXkpO1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoYCR7a2V5fToke3N0YXJ0QnBzfS0ke2VuZEJwc31gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgc2luZ2xlIG51bWVyaWMgZmlsdGVyIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBudW1lcmljKGtleTogTnVtZXJpY0ZpbHRlcktleSwgdmFsdWU6IG51bWJlcikge1xuICAgIHZhbGlkYXRlTnVtZXJpY0ZpbHRlclZhbHVlKHZhbHVlLCBrZXkpO1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoYCR7a2V5fToke3ZhbHVlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgbXVsdGlwbGUgbnVtZXJpYyBmaWx0ZXIgdmFsdWVzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBudW1lcmljTGlzdChrZXk6IE51bWVyaWNGaWx0ZXJLZXksIHZhbHVlczogbnVtYmVyW10pIHtcbiAgICB2YWx1ZXMuZm9yRWFjaCh2ID0+IHZhbGlkYXRlTnVtZXJpY0ZpbHRlclZhbHVlKHYsIGtleSkpO1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoYCR7a2V5fToke3ZhbHVlcy5qb2luKCcsJyl9YCk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSBhIG51bWVyaWMgZmlsdGVyIHJhbmdlIChpbmNsdXNpdmUpLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBudW1lcmljUmFuZ2Uoa2V5OiBOdW1lcmljRmlsdGVyS2V5LCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICAgIHZhbGlkYXRlTnVtZXJpY0ZpbHRlclZhbHVlKHN0YXJ0LCBrZXkpO1xuICAgIHZhbGlkYXRlTnVtZXJpY0ZpbHRlclZhbHVlKGVuZCwga2V5KTtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGAke2tleX06JHtzdGFydH0tJHtlbmR9YCk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSBhIGZyZWUtZm9ybSB0ZXh0IGZpbHRlciB2YWx1ZSAoZm9yIGxhbmd1YWdlIGtleXMpLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB0ZXh0KGtleTogVGV4dEZpbHRlcktleSwgdmFsdWU6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoYCR7a2V5fToke3ZhbHVlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgbXVsdGlwbGUgZnJlZS1mb3JtIHRleHQgZmlsdGVyIHZhbHVlcyAoZm9yIGxhbmd1YWdlIGtleXMpLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB0ZXh0TGlzdChrZXk6IFRleHRGaWx0ZXJLZXksIHZhbHVlczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGAke2tleX06JHt2YWx1ZXMuam9pbignLCcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBhIHNpbmdsZSBhdWRpbyBjb2RlYy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXVkaW9Db2RlYyh2YWx1ZTogQXVkaW9Db2RlYykge1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoYGF1ZGlvX2NvZGVjOiR7dmFsdWV9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGJ5IG11bHRpcGxlIGF1ZGlvIGNvZGVjcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXVkaW9Db2RlY0xpc3QodmFsdWVzOiBBdWRpb0NvZGVjW10pIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGBhdWRpb19jb2RlYzoke3ZhbHVlcy5qb2luKCcsJyl9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGJ5IGEgc2luZ2xlIHZpZGVvIGNvZGVjLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2aWRlb0NvZGVjKHZhbHVlOiBWaWRlb0NvZGVjKSB7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdEZpbHRlcihgdmlkZW9fY29kZWM6JHt2YWx1ZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgbXVsdGlwbGUgdmlkZW8gY29kZWNzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2aWRlb0NvZGVjTGlzdCh2YWx1ZXM6IFZpZGVvQ29kZWNbXSkge1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoYHZpZGVvX2NvZGVjOiR7dmFsdWVzLmpvaW4oJywnKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgYSBzaW5nbGUgdmlkZW8gZHluYW1pYyByYW5nZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmlkZW9EeW5hbWljUmFuZ2UodmFsdWU6IFZpZGVvRHluYW1pY1JhbmdlKSB7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdEZpbHRlcihgdmlkZW9fZHluYW1pY19yYW5nZToke3ZhbHVlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBtdWx0aXBsZSB2aWRlbyBkeW5hbWljIHJhbmdlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmlkZW9EeW5hbWljUmFuZ2VMaXN0KHZhbHVlczogVmlkZW9EeW5hbWljUmFuZ2VbXSkge1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoYHZpZGVvX2R5bmFtaWNfcmFuZ2U6JHt2YWx1ZXMuam9pbignLCcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBhIHNpbmdsZSB0cmlja3BsYXkgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdHJpY2twbGF5VHlwZSh2YWx1ZTogVHJpY2twbGF5VHlwZSkge1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoYHRyaWNrcGxheV90eXBlOiR7dmFsdWV9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGJ5IG11bHRpcGxlIHRyaWNrcGxheSB0eXBlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdHJpY2twbGF5VHlwZUxpc3QodmFsdWVzOiBUcmlja3BsYXlUeXBlW10pIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGB0cmlja3BsYXlfdHlwZToke3ZhbHVlcy5qb2luKCcsJyl9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGJ5IGEgY29tYmluYXRpb24gb2YgbnVtZXJpYyByYW5nZXMgYW5kIGluZGl2aWR1YWwgdmFsdWVzLlxuICAgKlxuICAgKiBVc2UgdGhpcyBmb3IgYWR2YW5jZWQgcGF0dGVybnMgbGlrZSBgdmlkZW9faGVpZ2h0OjI0MC0zNjAsNzIwLTEwODAsMTQ0MGAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIE1hbmlmZXN0RmlsdGVyLm51bWVyaWNDb21ibyhOdW1lcmljRmlsdGVyS2V5LlZJREVPX0hFSUdIVCwgW1xuICAgKiAgIE51bWVyaWNFeHByZXNzaW9uLnJhbmdlKDI0MCwgMzYwKSxcbiAgICogICBOdW1lcmljRXhwcmVzc2lvbi5yYW5nZSg3MjAsIDEwODApLFxuICAgKiAgIE51bWVyaWNFeHByZXNzaW9uLnZhbHVlKDE0NDApLFxuICAgKiBdKVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBudW1lcmljQ29tYm8oa2V5OiBOdW1lcmljRmlsdGVyS2V5LCBleHByZXNzaW9uczogTnVtZXJpY0V4cHJlc3Npb25bXSkge1xuICAgIGV4cHJlc3Npb25zLmZvckVhY2goZXhwciA9PiBleHByLl92YWx1ZXMuZm9yRWFjaCh2ID0+IHZhbGlkYXRlTnVtZXJpY0ZpbHRlclZhbHVlKHYsIGtleSkpKTtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGAke2tleX06JHtleHByZXNzaW9ucy5tYXAoZSA9PiBlLl9leHByZXNzaW9uKS5qb2luKCcsJyl9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGJ5IGEgY29tYmluYXRpb24gb2YgYml0cmF0ZSByYW5nZXMgYW5kIGluZGl2aWR1YWwgdmFsdWVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBNYW5pZmVzdEZpbHRlci5iaXRyYXRlQ29tYm8oQml0cmF0ZUZpbHRlcktleS5WSURFT19CSVRSQVRFLCBbXG4gICAqICAgQml0cmF0ZUV4cHJlc3Npb24ucmFuZ2UoQml0cmF0ZS5tYnBzKDEpLCBCaXRyYXRlLm1icHMoMykpLFxuICAgKiAgIEJpdHJhdGVFeHByZXNzaW9uLnZhbHVlKEJpdHJhdGUubWJwcyg1KSksXG4gICAqIF0pXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGJpdHJhdGVDb21ibyhrZXk6IEJpdHJhdGVGaWx0ZXJLZXksIGV4cHJlc3Npb25zOiBCaXRyYXRlRXhwcmVzc2lvbltdKSB7XG4gICAgZXhwcmVzc2lvbnMuZm9yRWFjaChleHByID0+IGV4cHIuX3ZhbHVlcy5mb3JFYWNoKHYgPT4gdmFsaWRhdGVCaXRyYXRlRmlsdGVyVmFsdWUodiwga2V5KSkpO1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoYCR7a2V5fToke2V4cHJlc3Npb25zLm1hcChlID0+IGUuX2V4cHJlc3Npb24pLmpvaW4oJywnKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgY3VzdG9tIG1hbmlmZXN0IGZpbHRlciBzdHJpbmcuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGN1c3RvbShjdXN0b206IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoY3VzdG9tKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gZmlsdGVyU3RyaW5nIE5vcm1hbGlzZWQgbWFuaWZlc3QgZmlsdGVyIHN0cmluZ1xuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBmaWx0ZXJTdHJpbmc6IHN0cmluZykgeyB9XG59XG5cbi8qKlxuICogQ29udGV4dCBwYXNzZWQgdG8gTWFuaWZlc3QuX2JpbmQoKSBtZXRob2RcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hbmlmZXN0QmluZENvbnRleHQge1xuICByZWFkb25seSBobHNNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50Lkhsc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5W107XG4gIHJlYWRvbmx5IGxsSGxzTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5Mb3dMYXRlbmN5SGxzTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXTtcbiAgcmVhZG9ubHkgZGFzaE1hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuRGFzaE1hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5W107XG4gIHJlYWRvbmx5IG1zc01hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuTXNzTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXTtcbiAgcmVhZG9ubHkgc2VnbWVudD86IFNlZ21lbnRDb25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIE1hbmlmZXN0IHRvIGFkZCB0byBPcmlnaW4gRW5kcG9pbnRcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1hbmlmZXN0IHtcbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBtYW5pZmVzdCBjb25maWd1cmF0aW9uIGZvciBMb3cgTGF0ZW5jeSBITFMuXG4gICAqXG4gICAqICoqTm90ZToqKiBMb3cgTGF0ZW5jeSBITFMgbWFuaWZlc3RzIHJlcXVpcmUgVFMgb3IgQ01BRiBjb250YWluZXIgdHlwZS5cbiAgICogVXNlIHdpdGggYFNlZ21lbnQudHMoKWAgb3IgYFNlZ21lbnQuY21hZigpYC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbG93TGF0ZW5jeUhMUyhtYW5pZmVzdDogTG93TGF0ZW5jeUhsc01hbmlmZXN0Q29uZmlndXJhdGlvbik6IE1hbmlmZXN0IHtcbiAgICByZXR1cm4gbmV3IExvd0xhdGVuY3lIbHNNYW5pZmVzdChtYW5pZmVzdCk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSBhIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gZm9yIEhMUy5cbiAgICpcbiAgICogKipOb3RlOioqIEhMUyBtYW5pZmVzdHMgcmVxdWlyZSBUUyBvciBDTUFGIGNvbnRhaW5lciB0eXBlLlxuICAgKiBVc2Ugd2l0aCBgU2VnbWVudC50cygpYCBvciBgU2VnbWVudC5jbWFmKClgLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBobHMobWFuaWZlc3Q6IEhsc01hbmlmZXN0Q29uZmlndXJhdGlvbik6IE1hbmlmZXN0IHtcbiAgICByZXR1cm4gbmV3IEhsc01hbmlmZXN0KG1hbmlmZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgbWFuaWZlc3QgY29uZmlndXJhdGlvbiBmb3IgREFTSC5cbiAgICpcbiAgICogKipOb3RlOioqIERBU0ggbWFuaWZlc3RzIHJlcXVpcmUgQ01BRiBjb250YWluZXIgdHlwZS5cbiAgICogVXNlIHdpdGggYFNlZ21lbnQuY21hZigpYC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGFzaChtYW5pZmVzdDogRGFzaE1hbmlmZXN0Q29uZmlndXJhdGlvbik6IE1hbmlmZXN0IHtcbiAgICByZXR1cm4gbmV3IERhc2hNYW5pZmVzdChtYW5pZmVzdCk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSBhIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gZm9yIE1TUy5cbiAgICpcbiAgICogKipOb3RlOioqIE1TUyBtYW5pZmVzdHMgcmVxdWlyZSBJU00gY29udGFpbmVyIHR5cGUuXG4gICAqIFVzZSB3aXRoIGBTZWdtZW50LmlzbSgpYC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbXNzKG1hbmlmZXN0OiBNc3NNYW5pZmVzdENvbmZpZ3VyYXRpb24pOiBNYW5pZmVzdCB7XG4gICAgcmV0dXJuIG5ldyBNc3NNYW5pZmVzdChtYW5pZmVzdCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIG1hbmlmZXN0IGlzIGJvdW5kIHRvIGFuIE9yaWdpbkVuZHBvaW50LlxuICAgKlxuICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB1c2VkIGJ5IHRoZSBjb25zdHJ1Y3QgbGlicmFyeSBhbmQgc2hvdWxkIG5vdCBiZVxuICAgKiBjYWxsZWQgb3IgaW1wbGVtZW50ZWQgYnkgZXh0ZXJuYWwgY29uc3VtZXJzLiBJdCBtYXkgY2hhbmdlIHdpdGhvdXQgbm90aWNlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfYmluZChjb250ZXh0OiBNYW5pZmVzdEJpbmRDb250ZXh0KTogdm9pZDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIG51bWVyaWMgZmlsdGVyIHZhbHVlIGlzIGFuIGludGVnZXIgd2l0aGluIHRoZSBhY2NlcHRlZCByYW5nZSBmb3IgaXRzIGtleS5cbiAqIFZJREVPX0ZSQU1FUkFURSBpcyBleGNsdWRlZCDigJQgaXQgdXNlcyBgdmFsaWRhdGVGcmFtZXJhdGVWYWx1ZWAgaW5zdGVhZC5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUludGVnZXJGaWx0ZXJWYWx1ZSh2YWx1ZTogbnVtYmVyLCBrZXk6IE51bWVyaWNGaWx0ZXJLZXksIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IHZvaWQge1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBOdW1lcmljRmlsdGVyTXVzdEJlSW50ZWdlcmAsIGBOdW1lcmljIGZpbHRlciB2YWx1ZSBmb3IgJyR7a2V5fScgbXVzdCBiZSBhbiBpbnRlZ2VyLCBnb3QgJHt2YWx1ZX1gKTtcbiAgfVxuICBpZiAodmFsdWUgPCBtaW4gfHwgdmFsdWUgPiBtYXgpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YE51bWVyaWNGaWx0ZXJPdXRPZlJhbmdlYCwgYE51bWVyaWMgZmlsdGVyIHZhbHVlIGZvciAnJHtrZXl9JyBtdXN0IGJlIGJldHdlZW4gJHttaW59IGFuZCAke21heH0sIGdvdCAke3ZhbHVlfWApO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSB2aWRlbyBmcmFtZXJhdGUgZmlsdGVyIHZhbHVlICgx4oCTOTk5Ljk5OSwgdXAgdG8gMyBkZWNpbWFsIHBsYWNlcykuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGcmFtZXJhdGVWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gIGlmICh2YWx1ZSA8IDEgfHwgdmFsdWUgPiA5OTkuOTk5KSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBOdW1lcmljRmlsdGVyT3V0T2ZSYW5nZWAsIGBOdW1lcmljIGZpbHRlciB2YWx1ZSBmb3IgJ3ZpZGVvX2ZyYW1lcmF0ZScgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDk5OS45OTksIGdvdCAke3ZhbHVlfWApO1xuICB9XG4gIGNvbnN0IGRlY2ltYWxQYXJ0ID0gdmFsdWUudG9TdHJpbmcoKS5zcGxpdCgnLicpWzFdO1xuICBpZiAoZGVjaW1hbFBhcnQgJiYgZGVjaW1hbFBhcnQubGVuZ3RoID4gMykge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTnVtZXJpY0ZpbHRlck1heERlY2ltYWxQbGFjZXNgLCBgTnVtZXJpYyBmaWx0ZXIgdmFsdWUgZm9yICd2aWRlb19mcmFtZXJhdGUnIGFsbG93cyB1cCB0byAzIGRlY2ltYWwgcGxhY2VzLCBnb3QgJHt2YWx1ZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFJvdXRlIG51bWVyaWMgdmFsaWRhdGlvbiB0byB0aGUgY29ycmVjdCBoZWxwZXIgYmFzZWQgb24ga2V5LlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlTnVtZXJpY0ZpbHRlclZhbHVlKHZhbHVlOiBudW1iZXIsIGtleTogTnVtZXJpY0ZpbHRlcktleSk6IHZvaWQge1xuICBzd2l0Y2ggKGtleSkge1xuICAgIGNhc2UgTnVtZXJpY0ZpbHRlcktleS5BVURJT19DSEFOTkVMUzpcbiAgICAgIHJldHVybiB2YWxpZGF0ZUludGVnZXJGaWx0ZXJWYWx1ZSh2YWx1ZSwga2V5LCAxLCAzMl83NjcpO1xuICAgIGNhc2UgTnVtZXJpY0ZpbHRlcktleS5BVURJT19TQU1QTEVfUkFURTpcbiAgICAgIHJldHVybiB2YWxpZGF0ZUludGVnZXJGaWx0ZXJWYWx1ZSh2YWx1ZSwga2V5LCAwLCAyXzE0N180ODNfNjQ3KTtcbiAgICBjYXNlIE51bWVyaWNGaWx0ZXJLZXkuVFJJQ0tQTEFZX0hFSUdIVDpcbiAgICAgIHJldHVybiB2YWxpZGF0ZUludGVnZXJGaWx0ZXJWYWx1ZSh2YWx1ZSwga2V5LCAxLCAyXzE0N180ODNfNjQ3KTtcbiAgICBjYXNlIE51bWVyaWNGaWx0ZXJLZXkuVklERU9fRlJBTUVSQVRFOlxuICAgICAgcmV0dXJuIHZhbGlkYXRlRnJhbWVyYXRlVmFsdWUodmFsdWUpO1xuICAgIGNhc2UgTnVtZXJpY0ZpbHRlcktleS5WSURFT19IRUlHSFQ6XG4gICAgICByZXR1cm4gdmFsaWRhdGVJbnRlZ2VyRmlsdGVyVmFsdWUodmFsdWUsIGtleSwgMSwgMzJfNzY3KTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgYml0cmF0ZSBmaWx0ZXIgdmFsdWUgaXMgYW4gaW50ZWdlciB3aXRoaW4gdGhlIGFjY2VwdGVkIHJhbmdlLlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQml0cmF0ZUZpbHRlclZhbHVlKGJwczogbnVtYmVyLCBrZXk6IEJpdHJhdGVGaWx0ZXJLZXkpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGJwcykpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YEJpdHJhdGVGaWx0ZXJNdXN0QmVJbnRlZ2VyYCwgYEJpdHJhdGUgZmlsdGVyIHZhbHVlIGZvciAnJHtrZXl9JyBtdXN0IHJlc29sdmUgdG8gYSB3aG9sZSBudW1iZXIgb2YgYml0cyBwZXIgc2Vjb25kLCBnb3QgJHticHN9YCk7XG4gIH1cbiAgaWYgKGJwcyA8IDAgfHwgYnBzID4gMl8xNDdfNDgzXzY0Nykge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgQml0cmF0ZUZpbHRlck91dE9mUmFuZ2VgLCBgQml0cmF0ZSBmaWx0ZXIgdmFsdWUgZm9yICcke2tleX0nIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyMTQ3NDgzNjQ3LCBnb3QgJHticHN9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgY29tbW9uIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiB2YWxpZGF0ZU1hbmlmZXN0Q29uZmlndXJhdGlvbihjb25maWc6IE1hbmlmZXN0Q29uZmlndXJhdGlvbkJhc2UpOiB2b2lkIHtcbiAgaWYgKGNvbmZpZy5tYW5pZmVzdFdpbmRvdyAmJiBjb25maWcubWFuaWZlc3RXaW5kb3cudG9TZWNvbmRzKCkgPCAzMCkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTWFuaWZlc3RXaW5kb3dNaW5pbXVtYCwgJ01hbmlmZXN0IFdpbmRvdyBoYXMgYSBtaW5pbXVtIHZhbHVlIG9mIDMwIHNlY29uZHMnKTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGFuZCBtb2RpZnkgZmlsdGVyIGNvbmZpZ3VyYXRpb25cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUZpbHRlckNvbmZpZ3VyYXRpb24oZmlsdGVyQ29uZmlnPzogRmlsdGVyQ29uZmlndXJhdGlvbik6IENmbk9yaWdpbkVuZHBvaW50LkZpbHRlckNvbmZpZ3VyYXRpb25Qcm9wZXJ0eSB8IHVuZGVmaW5lZCB7XG4gIGlmICghZmlsdGVyQ29uZmlnKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGlmIChmaWx0ZXJDb25maWcuY2xpcFN0YXJ0VGltZSAmJiAoZmlsdGVyQ29uZmlnLnN0YXJ0IHx8IGZpbHRlckNvbmZpZy5lbmQpKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBDbGlwU3RhcnRUaW1lQ29uZmxpY3RgLCAnWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggQ2xpcFN0YXJ0VGltZSB3aXRoIFN0YXJ0IG9yIEVuZCBpbiBhIEZpbHRlckNvbmZpZ3VyYXRpb24uJyk7XG4gIH1cblxuICBpZiAoZmlsdGVyQ29uZmlnLnRpbWVEZWxheSAmJiAoZmlsdGVyQ29uZmlnLnRpbWVEZWxheS50b1NlY29uZHMoKSA8IDAgfHwgZmlsdGVyQ29uZmlnLnRpbWVEZWxheS50b1NlY29uZHMoKSA+IDEyMDk2MDApKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBUaW1lRGVsYXlSYW5nZWAsICdUaW1lIERlbGF5IHNldHRpbmcgc2hvdWxkIGJlIGRlZmluZWQgYmV0d2VlbiAwLTEyMDk2MDAgc2Vjb25kcy4nKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXJDb25maWcuc3RhcnQgJiYgZmlsdGVyQ29uZmlnLmVuZCAmJiAoZmlsdGVyQ29uZmlnLmVuZCA8PSBmaWx0ZXJDb25maWcuc3RhcnQpKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBFbmRCZWZvcmVTdGFydGAsICdUaGUgRW5kIHBhcmFtZXRlciBuZWVkcyB0byBiZSBhZnRlciB0aGUgU3RhcnQgcGFyYW1ldGVyIGluIGEgRmlsdGVyQ29uZmlndXJhdGlvbi4nKTtcbiAgfVxuXG4gIGNvbnN0IG1hbmlmZXN0RmlsdGVyID0gZmlsdGVyQ29uZmlnLm1hbmlmZXN0RmlsdGVyID8gZmlsdGVyQ29uZmlnLm1hbmlmZXN0RmlsdGVyLm1hcChmaWx0ZXIgPT4gZmlsdGVyLmZpbHRlclN0cmluZykuam9pbignOycpIDogdW5kZWZpbmVkO1xuICBpZiAobWFuaWZlc3RGaWx0ZXIgIT0gdW5kZWZpbmVkICYmIChtYW5pZmVzdEZpbHRlci5sZW5ndGggPCAxIHx8IG1hbmlmZXN0RmlsdGVyLmxlbmd0aCA+IDEwMjQpKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBNYW5pZmVzdEZpbHRlckxlbmd0aGAsICdNYW5pZmVzdCBmaWx0ZXIgbmVlZHMgdG8gYmUgYmV0d2VlbiAxLTEwMjQgY2hhcmFjdGVycyBpbiBsZW5ndGguJyk7XG4gIH1cblxuICBpZiAoZmlsdGVyQ29uZmlnLm1hbmlmZXN0RmlsdGVyICYmIGZpbHRlckNvbmZpZy5tYW5pZmVzdEZpbHRlci5sZW5ndGggPiAxKSB7XG4gICAgY29uc3Qga2V5cyA9IGZpbHRlckNvbmZpZy5tYW5pZmVzdEZpbHRlci5tYXAoZiA9PiBmLmZpbHRlclN0cmluZy5zcGxpdCgnOicpWzBdKTtcbiAgICBrZXlzLmZvckVhY2goKGtleSwgaSkgPT4ge1xuICAgICAgaWYgKGtleXMuaW5kZXhPZihrZXkpICE9PSBpKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgRHVwbGljYXRlTWFuaWZlc3RGaWx0ZXJLZXlgLCBgRHVwbGljYXRlIG1hbmlmZXN0IGZpbHRlciBrZXkgJyR7a2V5fScuIFVzZSBhIHNpbmdsZSBmaWx0ZXIgd2l0aCBjb21tYS1zZXBhcmF0ZWQgdmFsdWVzIGluc3RlYWQgKGUuZy4gTWFuaWZlc3RGaWx0ZXIubnVtZXJpY0xpc3QoKSBvciBNYW5pZmVzdEZpbHRlci5jdXN0b20oKSkuYCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1hbmlmZXN0RmlsdGVyLFxuICAgIGRybVNldHRpbmdzOiBmaWx0ZXJDb25maWcuZHJtU2V0dGluZ3MgPyBmaWx0ZXJDb25maWcuZHJtU2V0dGluZ3MuZmlsdGVyKCh2LCBpLCBhKSA9PiBhLmluZGV4T2YodikgPT09IGkpLmpvaW4oJzsnKSA6IHVuZGVmaW5lZCxcbiAgICBjbGlwU3RhcnRUaW1lOiBmaWx0ZXJDb25maWcuY2xpcFN0YXJ0VGltZSA/IGNvbnZlcnREYXRlVG9TdHJpbmcoZmlsdGVyQ29uZmlnLmNsaXBTdGFydFRpbWUpIDogdW5kZWZpbmVkLFxuICAgIHN0YXJ0OiBmaWx0ZXJDb25maWcuc3RhcnQgPyBjb252ZXJ0RGF0ZVRvU3RyaW5nKGZpbHRlckNvbmZpZy5zdGFydCkgOiB1bmRlZmluZWQsXG4gICAgZW5kOiBmaWx0ZXJDb25maWcuZW5kID8gY29udmVydERhdGVUb1N0cmluZyhmaWx0ZXJDb25maWcuZW5kKSA6IHVuZGVmaW5lZCxcbiAgICB0aW1lRGVsYXlTZWNvbmRzOiBmaWx0ZXJDb25maWcudGltZURlbGF5Py50b1NlY29uZHMoKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzdGFydFRhZyBjb25maWd1cmF0aW9uXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTdGFydFRhZyhzdGFydFRhZzogU3RhcnRUYWcsIG1hbmlmZXN0V2luZG93PzogRHVyYXRpb24sIHNlZ21lbnREdXJhdGlvbj86IER1cmF0aW9uKTogdm9pZCB7XG4gIGNvbnN0IHRpbWVPZmZzZXQgPSBzdGFydFRhZy50aW1lT2Zmc2V0O1xuXG4gIC8vIEdldCBzZWdtZW50IGR1cmF0aW9uIChkZWZhdWx0IGlzIDYgc2Vjb25kcyBpZiBub3Qgc3BlY2lmaWVkKVxuICBjb25zdCBzZWdtZW50RHVyYXRpb25TZWMgPSBzZWdtZW50RHVyYXRpb24/LnRvU2Vjb25kcygpID8/IDY7XG5cbiAgLy8gR2V0IG1hbmlmZXN0IGR1cmF0aW9uIChkZWZhdWx0IGlzIDYwIHNlY29uZHMgaWYgbm90IHNwZWNpZmllZClcbiAgY29uc3QgbWFuaWZlc3REdXJhdGlvblNlYyA9IG1hbmlmZXN0V2luZG93Py50b1NlY29uZHMoKSA/PyA2MDtcblxuICAvLyBWYWxpZGF0ZSBwb3NpdGl2ZSBvZmZzZXQgKGZyb20gc3RhcnQpXG4gIGlmICh0aW1lT2Zmc2V0ID4gMCkge1xuICAgIGNvbnN0IG1heFBvc2l0aXZlT2Zmc2V0ID0gbWFuaWZlc3REdXJhdGlvblNlYyAtICgzICogc2VnbWVudER1cmF0aW9uU2VjKTtcbiAgICBpZiAodGltZU9mZnNldCA+PSBtYXhQb3NpdGl2ZU9mZnNldCkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBTdGFydFRhZ1Bvc2l0aXZlT2Zmc2V0RXhjZWVkZWRgLCBgU3RhcnRUYWcgdGltZU9mZnNldCAoJHt0aW1lT2Zmc2V0fXMpIG11c3QgYmUgbGVzcyB0aGFuIG1hbmlmZXN0IGR1cmF0aW9uICgke21hbmlmZXN0RHVyYXRpb25TZWN9cykgbWludXMgMyB0aW1lcyBzZWdtZW50IGR1cmF0aW9uICgke3NlZ21lbnREdXJhdGlvblNlY31zKS4gTWF4aW11bSBhbGxvd2VkOiAke21heFBvc2l0aXZlT2Zmc2V0fXNgKTtcbiAgICB9XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBuZWdhdGl2ZSBvZmZzZXQgKGZyb20gbGl2ZSBlZGdlKVxuICBpZiAodGltZU9mZnNldCA8IDApIHtcbiAgICBjb25zdCBhYnNPZmZzZXQgPSBNYXRoLmFicyh0aW1lT2Zmc2V0KTtcbiAgICBjb25zdCBtaW5OZWdhdGl2ZU9mZnNldCA9IDMgKiBzZWdtZW50RHVyYXRpb25TZWM7XG5cbiAgICBpZiAoYWJzT2Zmc2V0IDw9IG1pbk5lZ2F0aXZlT2Zmc2V0KSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YFN0YXJ0VGFnTmVnYXRpdmVPZmZzZXRUb29TbWFsbGAsIGBTdGFydFRhZyB0aW1lT2Zmc2V0ICgke3RpbWVPZmZzZXR9cykgYWJzb2x1dGUgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMyB0aW1lcyBzZWdtZW50IGR1cmF0aW9uICgke3NlZ21lbnREdXJhdGlvblNlY31zKS4gTWluaW11bSBhbGxvd2VkOiAtJHttaW5OZWdhdGl2ZU9mZnNldCArIDAuMDF9c2ApO1xuICAgIH1cblxuICAgIGlmIChhYnNPZmZzZXQgPj0gbWFuaWZlc3REdXJhdGlvblNlYykge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBTdGFydFRhZ05lZ2F0aXZlT2Zmc2V0RXhjZWVkc01hbmlmZXN0YCwgYFN0YXJ0VGFnIHRpbWVPZmZzZXQgKCR7dGltZU9mZnNldH1zKSBhYnNvbHV0ZSB2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBtYW5pZmVzdCBkdXJhdGlvbiAoJHttYW5pZmVzdER1cmF0aW9uU2VjfXMpYCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQnVpbGQgSExTIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb25cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBidWlsZEhsc01hbmlmZXN0Q29uZmlndXJhdGlvbihcbiAgY29uZmlnOiBIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG4gIHNlZ21lbnREdXJhdGlvbj86IER1cmF0aW9uLFxuKTogQ2ZuT3JpZ2luRW5kcG9pbnQuSGxzTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHkge1xuICBpZiAoY29uZmlnLnN0YXJ0VGFnKSB7XG4gICAgdmFsaWRhdGVTdGFydFRhZyhjb25maWcuc3RhcnRUYWcsIGNvbmZpZy5tYW5pZmVzdFdpbmRvdywgc2VnbWVudER1cmF0aW9uKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWFuaWZlc3ROYW1lOiBjb25maWcubWFuaWZlc3ROYW1lLFxuICAgIGNoaWxkTWFuaWZlc3ROYW1lOiBjb25maWcuY2hpbGRNYW5pZmVzdE5hbWUsXG4gICAgbWFuaWZlc3RXaW5kb3dTZWNvbmRzOiBjb25maWcubWFuaWZlc3RXaW5kb3c/LnRvU2Vjb25kcygpLFxuICAgIHByb2dyYW1EYXRlVGltZUludGVydmFsU2Vjb25kczogY29uZmlnLnByb2dyYW1EYXRlVGltZUludGVydmFsPy50b1NlY29uZHMoKSxcbiAgICBzY3RlSGxzOiBjb25maWcuc2N0ZUFkTWFya2VySGxzID8geyBhZE1hcmtlckhsczogY29uZmlnLnNjdGVBZE1hcmtlckhscyB9IDogdW5kZWZpbmVkLFxuICAgIHN0YXJ0VGFnOiBjb25maWcuc3RhcnRUYWcsXG4gICAgdXJsRW5jb2RlQ2hpbGRNYW5pZmVzdDogY29uZmlnLnVybEVuY29kZUNoaWxkTWFuaWZlc3QsXG4gICAgZmlsdGVyQ29uZmlndXJhdGlvbjogdmFsaWRhdGVGaWx0ZXJDb25maWd1cmF0aW9uKGNvbmZpZy5maWx0ZXJDb25maWd1cmF0aW9uKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBEQVNIIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb25cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBidWlsZERhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb24oXG4gIGNvbmZpZzogRGFzaE1hbmlmZXN0Q29uZmlndXJhdGlvbixcbiAgc2VnbWVudD86IFNlZ21lbnRDb25maWd1cmF0aW9uLFxuKTogQ2ZuT3JpZ2luRW5kcG9pbnQuRGFzaE1hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5IHtcbiAgaWYgKGNvbmZpZy5taW5CdWZmZXJUaW1lICYmIChjb25maWcubWluQnVmZmVyVGltZS50b1NlY29uZHMoKSA8IDEgfHwgY29uZmlnLm1pbkJ1ZmZlclRpbWUudG9TZWNvbmRzKCkgPiAzNjAwKSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTWluQnVmZmVyVGltZVJhbmdlYCwgJ01pbiBidWZmZXIgdGltZSBoYXMgYSByYW5nZSBmcm9tIDEgc2VjLiB0byAzNjAwIHNlYy4nKTtcbiAgfVxuICBpZiAoY29uZmlnLm1pblVwZGF0ZVBlcmlvZCAmJiAoY29uZmlnLm1pblVwZGF0ZVBlcmlvZC50b1NlY29uZHMoKSA8IDEgfHwgY29uZmlnLm1pblVwZGF0ZVBlcmlvZC50b1NlY29uZHMoKSA+IDM2MDApKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBNaW5VcGRhdGVQZXJpb2RSYW5nZWAsICdNaW4gdXBkYXRlIHBlcmlvZCBvcHRpb24gaGFzIGEgcmFuZ2UgZnJvbSAxIHNlYy4gdG8gMzYwMCBzZWMuJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5zY3RlRGFzaEFkTWFya2VyICYmICghc2VnbWVudD8uc2N0ZUZpbHRlciB8fCBzZWdtZW50LnNjdGVGaWx0ZXI/Lmxlbmd0aCA9PT0gMCkpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YFNjdGVGaWx0ZXJSZXF1aXJlZGAsICdTQ1RFIEZpbHRlciBtdXN0IGJlIGNvbmZpZ3VyZWQgd2l0aCBEYXNoQWRNYXJrZXIgQ29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtYW5pZmVzdE5hbWU6IGNvbmZpZy5tYW5pZmVzdE5hbWUsXG4gICAgYmFzZVVybHM6IGNvbmZpZy5iYXNlVXJscyxcbiAgICBjb21wYWN0bmVzczogY29uZmlnLmNvbXBhY3RuZXNzLFxuICAgIGRybVNpZ25hbGluZzogY29uZmlnLmRybVNpZ25hbGxpbmcsXG4gICAgZHZiU2V0dGluZ3M6IGNvbmZpZy5kdmJTZXR0aW5ncyxcbiAgICBwcm9maWxlczogY29uZmlnLnByb2ZpbGVzLFxuICAgIHByb2dyYW1JbmZvcm1hdGlvbjogY29uZmlnLnByb2dyYW1JbmZvcm1hdGlvbixcbiAgICBzdWJ0aXRsZUNvbmZpZ3VyYXRpb246IGNvbmZpZy5zdWJ0aXRsZUNvbmZpZ3VyYXRpb24sXG4gICAgbWFuaWZlc3RXaW5kb3dTZWNvbmRzOiBjb25maWcubWFuaWZlc3RXaW5kb3c/LnRvU2Vjb25kcygpLFxuICAgIG1pbkJ1ZmZlclRpbWVTZWNvbmRzOiBjb25maWcubWluQnVmZmVyVGltZT8udG9TZWNvbmRzKCksXG4gICAgbWluVXBkYXRlUGVyaW9kU2Vjb25kczogY29uZmlnLm1pblVwZGF0ZVBlcmlvZD8udG9TZWNvbmRzKCksXG4gICAgc3VnZ2VzdGVkUHJlc2VudGF0aW9uRGVsYXlTZWNvbmRzOiBjb25maWcuc3VnZ2VzdGVkUHJlc2VudGF0aW9uRGVsYXk/LnRvU2Vjb25kcygpLFxuICAgIHNlZ21lbnRUZW1wbGF0ZUZvcm1hdDogY29uZmlnLnNlZ21lbnRUZW1wbGF0ZUZvcm1hdCxcbiAgICBwZXJpb2RUcmlnZ2VyczogY29uZmlnLnBlcmlvZFRyaWdnZXJzLFxuICAgIHNjdGVEYXNoOiBzZWdtZW50Py5zY3RlRmlsdGVyID8ge1xuICAgICAgYWRNYXJrZXJEYXNoOiBjb25maWcuc2N0ZURhc2hBZE1hcmtlcixcbiAgICB9IDogdW5kZWZpbmVkLFxuICAgIHV0Y1RpbWluZzogY29uZmlnLnV0Y1RpbWluZ01vZGUgfHwgY29uZmlnLnV0Y1RpbWluZ1NvdXJjZSA/IHtcbiAgICAgIHRpbWluZ01vZGU6IGNvbmZpZy51dGNUaW1pbmdNb2RlLFxuICAgICAgdGltaW5nU291cmNlOiBjb25maWcudXRjVGltaW5nU291cmNlLFxuICAgIH0gOiB1bmRlZmluZWQsXG4gICAgZmlsdGVyQ29uZmlndXJhdGlvbjogdmFsaWRhdGVGaWx0ZXJDb25maWd1cmF0aW9uKGNvbmZpZy5maWx0ZXJDb25maWd1cmF0aW9uKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBNU1MgbWFuaWZlc3QgY29uZmlndXJhdGlvblxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTXNzTWFuaWZlc3RDb25maWd1cmF0aW9uKGNvbmZpZzogTXNzTWFuaWZlc3RDb25maWd1cmF0aW9uKTogQ2ZuT3JpZ2luRW5kcG9pbnQuTXNzTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHkge1xuICByZXR1cm4ge1xuICAgIG1hbmlmZXN0TmFtZTogY29uZmlnLm1hbmlmZXN0TmFtZSxcbiAgICBtYW5pZmVzdExheW91dDogY29uZmlnLm1hbmlmZXN0TGF5b3V0LFxuICAgIG1hbmlmZXN0V2luZG93U2Vjb25kczogY29uZmlnLm1hbmlmZXN0V2luZG93Py50b1NlY29uZHMoKSxcbiAgICBmaWx0ZXJDb25maWd1cmF0aW9uOiB2YWxpZGF0ZUZpbHRlckNvbmZpZ3VyYXRpb24oY29uZmlnLmZpbHRlckNvbmZpZ3VyYXRpb24pLFxuICB9O1xufVxuXG4vKipcbiAqIEhMUyBNYW5pZmVzdCBpbXBsZW1lbnRhdGlvblxuICovXG5jbGFzcyBIbHNNYW5pZmVzdCBleHRlbmRzIE1hbmlmZXN0IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb25maWc6IEhsc01hbmlmZXN0Q29uZmlndXJhdGlvbikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgX2JpbmQoY29udGV4dDogTWFuaWZlc3RCaW5kQ29udGV4dCk6IHZvaWQge1xuICAgIHZhbGlkYXRlTWFuaWZlc3RDb25maWd1cmF0aW9uKHRoaXMuY29uZmlnKTtcbiAgICBjb250ZXh0Lmhsc01hbmlmZXN0cy5wdXNoKGJ1aWxkSGxzTWFuaWZlc3RDb25maWd1cmF0aW9uKHRoaXMuY29uZmlnLCBjb250ZXh0LnNlZ21lbnQ/LnNlZ21lbnREdXJhdGlvbikpO1xuICB9XG59XG5cbi8qKlxuICogTG93IExhdGVuY3kgSExTIE1hbmlmZXN0IGltcGxlbWVudGF0aW9uXG4gKi9cbmNsYXNzIExvd0xhdGVuY3lIbHNNYW5pZmVzdCBleHRlbmRzIE1hbmlmZXN0IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb25maWc6IExvd0xhdGVuY3lIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb24pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIF9iaW5kKGNvbnRleHQ6IE1hbmlmZXN0QmluZENvbnRleHQpOiB2b2lkIHtcbiAgICB2YWxpZGF0ZU1hbmlmZXN0Q29uZmlndXJhdGlvbih0aGlzLmNvbmZpZyk7XG4gICAgY29udGV4dC5sbEhsc01hbmlmZXN0cy5wdXNoKGJ1aWxkSGxzTWFuaWZlc3RDb25maWd1cmF0aW9uKHRoaXMuY29uZmlnLCBjb250ZXh0LnNlZ21lbnQ/LnNlZ21lbnREdXJhdGlvbikpO1xuICB9XG59XG5cbi8qKlxuICogREFTSCBNYW5pZmVzdCBpbXBsZW1lbnRhdGlvblxuICovXG5jbGFzcyBEYXNoTWFuaWZlc3QgZXh0ZW5kcyBNYW5pZmVzdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBEYXNoTWFuaWZlc3RDb25maWd1cmF0aW9uKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBfYmluZChjb250ZXh0OiBNYW5pZmVzdEJpbmRDb250ZXh0KTogdm9pZCB7XG4gICAgdmFsaWRhdGVNYW5pZmVzdENvbmZpZ3VyYXRpb24odGhpcy5jb25maWcpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLnV0Y1RpbWluZ01vZGUgPT09IERhc2hVdGNUaW1pbmdNb2RlLlVUQ19ESVJFQ1QgJiYgdGhpcy5jb25maWcudXRjVGltaW5nU291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YFV0Y0RpcmVjdFRpbWluZ1NvdXJjZWAsICdVVEMgRGlyZWN0IGNvbmZpZ3VyZWQgd2l0aCBhIHRpbWluZyBzb3VyY2UsIGVuc3VyZSB0aW1pbmcgc291cmNlIGlzIHVuZGVmaW5lZCB0byB1c2UgVVRDIERpcmVjdC4nKTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmRhc2hNYW5pZmVzdHMucHVzaChidWlsZERhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb24odGhpcy5jb25maWcsIGNvbnRleHQuc2VnbWVudCkpO1xuICB9XG59XG5cbi8qKlxuICogTVNTIE1hbmlmZXN0IGltcGxlbWVudGF0aW9uXG4gKi9cbmNsYXNzIE1zc01hbmlmZXN0IGV4dGVuZHMgTWFuaWZlc3Qge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTXNzTWFuaWZlc3RDb25maWd1cmF0aW9uKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBfYmluZChjb250ZXh0OiBNYW5pZmVzdEJpbmRDb250ZXh0KTogdm9pZCB7XG4gICAgdmFsaWRhdGVNYW5pZmVzdENvbmZpZ3VyYXRpb24odGhpcy5jb25maWcpO1xuICAgIGNvbnRleHQubXNzTWFuaWZlc3RzLnB1c2goYnVpbGRNc3NNYW5pZmVzdENvbmZpZ3VyYXRpb24odGhpcy5jb25maWcpKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGNvbnRhaW5lciB0byBhdHRhY2ggdG8gdGhpcyBvcmlnaW4gZW5kcG9pbnQuXG4gKiBBIGNvbnRhaW5lciB0eXBlIGlzIGEgZmlsZSBmb3JtYXQgdGhhdCBlbmNhcHN1bGF0ZXMgb25lIG9yIG1vcmUgbWVkaWEgc3RyZWFtcywgc3VjaCBhcyBhdWRpbyBhbmQgdmlkZW8sIGludG8gYSBzaW5nbGUgZmlsZS4gWW91IGNhbid0IGNoYW5nZSB0aGUgY29udGFpbmVyIHR5cGUgYWZ0ZXIgeW91IGNyZWF0ZSB0aGUgZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBlbnVtIENvbnRhaW5lclR5cGUge1xuICAvKipcbiAgICogVFMgQ29udGFpbmVyIFR5cGVcbiAgICovXG4gIFRTPSdUUycsXG4gIC8qKlxuICAgKiBDTUFGIENvbnRhaW5lciBUeXBlXG4gICAqL1xuICBDTUFGPSdDTUFGJyxcbiAgLyoqXG4gICAqIElTTSBDb250YWluZXIgVHlwZSAoTWljcm9zb2Z0IFNtb290aCBTdHJlYW1pbmcpXG4gICAqL1xuICBJU009J0lTTScsXG59XG5cbi8qKlxuICogRW5jcnlwdGlvbiBtZXRob2RzIGZvciBDTUFGIGNvbnRhaW5lciB0eXBlLlxuICovXG5leHBvcnQgZW51bSBDbWFmRW5jcnlwdGlvbk1ldGhvZCB7XG4gIC8qKlxuICAgKiBDb21tb24gRW5jcnlwdGlvbiBTY2hlbWUgKENFTkMpIC0gY29tcGF0aWJsZSB3aXRoIFBsYXlSZWFkeSwgV2lkZXZpbmUsIGFuZCBJcmRldG8gRFJNIHN5c3RlbXMuXG4gICAqL1xuICBDRU5DID0gJ0NFTkMnLFxuICAvKipcbiAgICogQ29tbW9uIEVuY3J5cHRpb24gU2NoZW1lIHdpdGggQ0JDUyBtb2RlIC0gY29tcGF0aWJsZSB3aXRoIFBsYXlSZWFkeSwgV2lkZXZpbmUsIGFuZCBGYWlyUGxheSBEUk0gc3lzdGVtcy5cbiAgICovXG4gIENCQ1MgPSAnQ0JDUycsXG59XG5cbi8qKlxuICogRW5jcnlwdGlvbiBtZXRob2RzIGZvciBUUyBjb250YWluZXIgdHlwZS5cbiAqL1xuZXhwb3J0IGVudW0gVHNFbmNyeXB0aW9uTWV0aG9kIHtcbiAgLyoqXG4gICAqIEFFUy0xMjggZW5jcnlwdGlvbiAtIHJlcXVpcmVzIENsZWFyIEtleSBBRVMgMTI4IERSTSBzeXN0ZW0uXG4gICAqL1xuICBBRVNfMTI4ID0gJ0FFU18xMjgnLFxuICAvKipcbiAgICogU2FtcGxlLWxldmVsIEFFUyBlbmNyeXB0aW9uIC0gcmVxdWlyZXMgRmFpclBsYXkgRFJNIHN5c3RlbS5cbiAgICovXG4gIFNBTVBMRV9BRVMgPSAnU0FNUExFX0FFUycsXG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGF1ZGlvIGVuY3J5cHRpb24gcHJlc2V0cy5cbiAqL1xuZXhwb3J0IGVudW0gUHJlc2V0U3Bla2UyMEF1ZGlvIHtcbiAgLyoqXG4gICAqIFVzZSBvbmUgY29udGVudCBrZXkgdG8gZW5jcnlwdCBhbGwgb2YgdGhlIGF1ZGlvIHRyYWNrcyBpbiB5b3VyIHN0cmVhbS5cbiAgICovXG4gIFBSRVNFVF9BVURJT18xPSdQUkVTRVRfQVVESU9fMScsXG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBzdGVyZW8gYXVkaW8gdHJhY2tzIGFuZCBvbmUgY29udGVudCBrZXkgdG8gZW5jcnlwdCBhbGwgb2YgdGhlIG11bHRpY2hhbm5lbCBhdWRpbyB0cmFja3MuXG4gICAqL1xuICBQUkVTRVRfQVVESU9fMj0nUFJFU0VUX0FVRElPXzInLFxuICAvKipcbiAgICogVXNlIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgc3RlcmVvIGF1ZGlvIHRyYWNrcywgb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBtdWx0aWNoYW5uZWwgYXVkaW8gdHJhY2tzIHdpdGggMyB0byA2IGNoYW5uZWxzLFxuICAgKiBhbmQgb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBtdWx0aWNoYW5uZWwgYXVkaW8gdHJhY2tzIHdpdGggbW9yZSB0aGFuIDYgY2hhbm5lbHMuXG4gICAqL1xuICBQUkVTRVRfQVVESU9fMz0nUFJFU0VUX0FVRElPXzMnLFxuICAvKipcbiAgICogVXNlIHRoZSBzYW1lIGNvbnRlbnQga2V5IGZvciBhbGwgb2YgdGhlIGF1ZGlvIGFuZCB2aWRlbyB0cmFja3MgaW4geW91ciBzdHJlYW0uXG4gICAqL1xuICBTSEFSRUQ9J1NIQVJFRCcsXG4gIC8qKlxuICAgKiBEb24ndCBlbmNyeXB0IGFueSBvZiB0aGUgYXVkaW8gdHJhY2tzIGluIHlvdXIgc3RyZWFtLlxuICAgKi9cbiAgVU5FTkNSWVBURUQ9J1VORU5DUllQVEVEJyxcbn1cblxuLyoqXG4gKiBUaGUgU1BFS0UgVmVyc2lvbiAyLjAgcHJlc2V0IHZpZGVvIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5jcnlwdGlvbiBjb250cmFjdCBjb25maWd1cmF0aW9uIG9mIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gKlxuICogQSBjb2xsZWN0aW9uIG9mIHZpZGVvIGVuY3J5cHRpb24gcHJlc2V0cy5cbiAqL1xuZXhwb3J0IGVudW0gUHJlc2V0U3Bla2UyMFZpZGVvIHtcbiAgLyoqXG4gICAqIFVzZSBvbmUgY29udGVudCBrZXkgdG8gZW5jcnlwdCBhbGwgb2YgdGhlIHZpZGVvIHRyYWNrcyBpbiB5b3VyIHN0cmVhbS5cbiAgICovXG4gIFBSRVNFVF9WSURFT18xPSdQUkVTRVRfVklERU9fMScsXG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBTRCB2aWRlbyB0cmFja3MgYW5kIG9uZSBjb250ZW50IGtleSBmb3IgYWxsIEhEIGFuZCBoaWdoZXIgcmVzb2x1dGlvbnMgdmlkZW8gdHJhY2tzLlxuICAgKi9cbiAgUFJFU0VUX1ZJREVPXzI9J1BSRVNFVF9WSURFT18yJyxcbiAgLyoqXG4gICAqIFVzZSBvbmUgY29udGVudCBrZXkgdG8gZW5jcnlwdCBhbGwgb2YgdGhlIFNEIHZpZGVvIHRyYWNrcywgb25lIGNvbnRlbnQga2V5IGZvciBIRCB2aWRlbyB0cmFja3MgYW5kIG9uZSBjb250ZW50IGtleSBmb3IgYWxsIFVIRCB2aWRlbyB0cmFja3MuXG4gICAqL1xuICBQUkVTRVRfVklERU9fMz0nUFJFU0VUX1ZJREVPXzMnLFxuICAvKipcbiAgICogVXNlIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgU0QgdmlkZW8gdHJhY2tzLCBvbmUgY29udGVudCBrZXkgZm9yIEhEIHZpZGVvIHRyYWNrcyxcbiAgICogb25lIGNvbnRlbnQga2V5IGZvciBhbGwgVUhEMSB2aWRlbyB0cmFja3MgYW5kIG9uZSBjb250ZW50IGtleSBmb3IgYWxsIFVIRDIgdmlkZW8gdHJhY2tzLlxuICAgKi9cbiAgUFJFU0VUX1ZJREVPXzQ9J1BSRVNFVF9WSURFT180JyxcbiAgLyoqXG4gICAqIFVzZSBvbmUgY29udGVudCBrZXkgdG8gZW5jcnlwdCBhbGwgb2YgdGhlIFNEIHZpZGVvIHRyYWNrcywgb25lIGNvbnRlbnQga2V5IGZvciBIRDEgdmlkZW8gdHJhY2tzLCBvbmUgY29udGVudCBrZXkgZm9yIEhEMiB2aWRlbyB0cmFja3MsXG4gICAqIG9uZSBjb250ZW50IGtleSBmb3IgYWxsIFVIRDEgdmlkZW8gdHJhY2tzIGFuZCBvbmUgY29udGVudCBrZXkgZm9yIGFsbCBVSEQyIHZpZGVvIHRyYWNrcy5cbiAgICovXG4gIFBSRVNFVF9WSURFT181PSdQUkVTRVRfVklERU9fNScsXG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBTRCB2aWRlbyB0cmFja3MsIG9uZSBjb250ZW50IGtleSBmb3IgSEQxIHZpZGVvIHRyYWNrcywgb25lIGNvbnRlbnQga2V5IGZvciBIRDIgdmlkZW8gdHJhY2tzXG4gICAqIGFuZCBvbmUgY29udGVudCBrZXkgZm9yIGFsbCBVSEQgdmlkZW8gdHJhY2tzLlxuICAgKi9cbiAgUFJFU0VUX1ZJREVPXzY9J1BSRVNFVF9WSURFT182JyxcbiAgLyoqXG4gICAqIFVzZSBvbmUgY29udGVudCBrZXkgdG8gZW5jcnlwdCBhbGwgb2YgdGhlIFNEK0hEMSB2aWRlbyB0cmFja3MsIG9uZSBjb250ZW50IGtleSBmb3IgSEQyIHZpZGVvIHRyYWNrcyBhbmQgb25lIGNvbnRlbnQga2V5IGZvciBhbGwgVUhEIHZpZGVvIHRyYWNrcy5cbiAgICovXG4gIFBSRVNFVF9WSURFT183PSdQUkVTRVRfVklERU9fNycsXG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBTRCtIRDEgdmlkZW8gdHJhY2tzLCBvbmUgY29udGVudCBrZXkgZm9yIEhEMiB2aWRlbyB0cmFja3MsIG9uZSBjb250ZW50IGtleSBmb3IgYWxsIFVIRDFcbiAgICogdmlkZW8gdHJhY2tzIGFuZCBvbmUgY29udGVudCBrZXkgZm9yIGFsbCBVSEQyIHZpZGVvIHRyYWNrcy5cbiAgICovXG4gIFBSRVNFVF9WSURFT184PSdQUkVTRVRfVklERU9fOCcsXG4gIC8qKlxuICAgKiBVc2UgdGhlIHNhbWUgY29udGVudCBrZXkgZm9yIGFsbCBvZiB0aGUgdmlkZW8gYW5kIGF1ZGlvIHRyYWNrcyBpbiB5b3VyIHN0cmVhbS5cbiAgICovXG4gIFNIQVJFRD0nU0hBUkVEJyxcbiAgLyoqXG4gICAqIERvbid0IGVuY3J5cHQgYW55IG9mIHRoZSB2aWRlbyB0cmFja3MgaW4geW91ciBzdHJlYW0uXG4gICAqL1xuICBVTkVOQ1JZUFRFRD0nVU5FTkNSWVBURUQnLFxufVxuXG4vKipcbiAqIEVuZHBvaW50IGVycm9yIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gRW5kcG9pbnRFcnJvckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIG1hbmlmZXN0IHN0YWxsZWQgYW5kIHRoZXJlIGFyZSBubyBuZXcgc2VnbWVudHMgb3IgcGFydHMuXG4gICAqL1xuICBTVEFMRV9NQU5JRkVTVD0nU1RBTEVfTUFOSUZFU1QnLFxuICAvKipcbiAgICogVGhlcmUgaXMgYSBnYXAgaW4gdGhlIG1hbmlmZXN0LlxuICAgKi9cbiAgSU5DT01QTEVURV9NQU5JRkVTVD0nSU5DT01QTEVURV9NQU5JRkVTVCcsXG4gIC8qKlxuICAgKiBLZXkgcm90YXRpb24gaXMgZW5hYmxlZCBidXQgd2UncmUgdW5hYmxlIHRvIGZldGNoIHRoZSBrZXkgZm9yIHRoZSBjdXJyZW50IGtleSBwZXJpb2QuXG4gICAqL1xuICBNSVNTSU5HX0RSTV9LRVk9J01JU1NJTkdfRFJNX0tFWScsXG4gIC8qKlxuICAgKiBUaGUgc2VnbWVudHMgd2hpY2ggY29udGFpbiBzbGF0ZSBjb250ZW50IGFyZSBjb25zaWRlcmVkIHRvIGJlIG1pc3NpbmcgY29udGVudC5cbiAgICovXG4gIFNMQVRFX0lOUFVUPSdTTEFURV9JTlBVVCcsXG59XG5cbi8qKlxuICogU0NURS0zNSBtZXNzYWdlIHR5cGUgb3B0aW9ucyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBlbnVtIFNjdGVNZXNzYWdlVHlwZSB7XG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIFNQTElDRV9JTlNFUlQuXG4gICAqL1xuICBTUExJQ0VfSU5TRVJUPSdTUExJQ0VfSU5TRVJUJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgQlJFQUsuXG4gICAqL1xuICBCUkVBSz0nQlJFQUsnLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBQUk9WSURFUl9BRFZFUlRJU0VNRU5ULlxuICAgKi9cbiAgUFJPVklERVJfQURWRVJUSVNFTUVOVD0nUFJPVklERVJfQURWRVJUSVNFTUVOVCcsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIERJU1RSSUJVVE9SX0FEVkVSVElTRU1FTlQuXG4gICAqL1xuICBESVNUUklCVVRPUl9BRFZFUlRJU0VNRU5UPSdESVNUUklCVVRPUl9BRFZFUlRJU0VNRU5UJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgUFJPVklERVJfUExBQ0VNRU5UX09QUE9SVFVOSVRZLlxuICAgKi9cbiAgUFJPVklERVJfUExBQ0VNRU5UX09QUE9SVFVOSVRZPSdQUk9WSURFUl9QTEFDRU1FTlRfT1BQT1JUVU5JVFknLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBESVNUUklCVVRPUl9QTEFDRU1FTlRfT1BQT1JUVU5JVFkuXG4gICAqL1xuICBESVNUUklCVVRPUl9QTEFDRU1FTlRfT1BQT1JUVU5JVFk9J0RJU1RSSUJVVE9SX1BMQUNFTUVOVF9PUFBPUlRVTklUWScsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIFBST1ZJREVSX09WRVJMQVlfUExBQ0VNRU5UX09QUE9SVFVOSVRZLlxuICAgKi9cbiAgUFJPVklERVJfT1ZFUkxBWV9QTEFDRU1FTlRfT1BQT1JUVU5JVFk9J1BST1ZJREVSX09WRVJMQVlfUExBQ0VNRU5UX09QUE9SVFVOSVRZJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgRElTVFJJQlVUT1JfT1ZFUkxBWV9QTEFDRU1FTlRfT1BQT1JUVU5JVFkuXG4gICAqL1xuICBESVNUUklCVVRPUl9PVkVSTEFZX1BMQUNFTUVOVF9PUFBPUlRVTklUWT0nRElTVFJJQlVUT1JfT1ZFUkxBWV9QTEFDRU1FTlRfT1BQT1JUVU5JVFknLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBQUk9HUkFNLlxuICAgKi9cbiAgUFJPR1JBTT0nUFJPR1JBTScsXG59XG5cbi8qKlxuICogQ29udHJvbHMgd2hldGhlciBTQ1RFLTM1IG1lc3NhZ2VzIGFyZSBpbmNsdWRlZCBpbiBzZWdtZW50IGZpbGVzLlxuICovXG5leHBvcnQgZW51bSBTY3RlSW5TZWdtZW50cyB7XG4gIC8qKlxuICAgKiBTQ1RFLTM1IG1lc3NhZ2VzIGFyZSBub3QgaW5jbHVkZWQgaW4gc2VnbWVudHMuXG4gICAqL1xuICBOT05FID0gJ05PTkUnLFxuICAvKipcbiAgICogU0NURS0zNSBtZXNzYWdlcyBhcmUgZW1iZWRkZWQgaW4gc2VnbWVudCBkYXRhLlxuICAgKlxuICAgKiBGb3IgREFTSCBtYW5pZmVzdHMsIHdoZW4gc2V0IHRvIEFMTCwgYW4gSW5iYW5kRXZlbnRTdHJlYW0gdGFnIHNpZ25hbHNcbiAgICogdGhhdCBTQ1RFIG1lc3NhZ2VzIGFyZSBwcmVzZW50IGluIHNlZ21lbnRzLlxuICAgKi9cbiAgQUxMID0gJ0FMTCcsXG59XG5cbi8qKlxuICogT3JpZ2luIEVuZHBvaW50IGludGVyZmFjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElPcmlnaW5FbmRwb2ludCBleHRlbmRzIElSZXNvdXJjZSwgSU9yaWdpbkVuZHBvaW50UmVmIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIGdyb3VwIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWxHcm91cE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNoYW5uZWwgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG9yaWdpbiBlbmRwb2ludCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbiBlbmRwb2ludCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5FbmRwb2ludE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbkVuZHBvaW50QXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRlIGFuZCB0aW1lIHRoZSBvcmlnaW4gZW5kcG9pbnQgd2FzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZWRBdD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRhdGUgYW5kIHRpbWUgdGhlIG9yaWdpbiBlbmRwb2ludCB3YXMgbW9kaWZpZWQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IG1vZGlmaWVkQXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBITFMgbWFuaWZlc3QgVVJMcyBmb3IgdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgaGxzTWFuaWZlc3RVcmxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBMb3cgTGF0ZW5jeSBITFMgbWFuaWZlc3QgVVJMcyBmb3IgdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgbG93TGF0ZW5jeUhsc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgREFTSCBtYW5pZmVzdCBVUkxzIGZvciB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBkYXNoTWFuaWZlc3RVcmxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBNU1MgbWFuaWZlc3QgVVJMcyBmb3IgdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgbXNzTWFuaWZlc3RVcmxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBvcmlnaW4gZW5kcG9pbnQgcG9saWN5LlxuICAgKlxuICAgKiBZb3UgY2FuIG9ubHkgYWRkIDEgT3JpZ2luRW5kcG9pbnRQb2xpY3kgdG8gYW4gT3JpZ2luRW5kcG9pbnQuXG4gICAqIElmIHlvdSBoYXZlIGFscmVhZHkgZGVmaW5lZCBvbmUsIGl0IHdpbGwgYXBwZW5kIHRvIHRoZSBwb2xpY3kgYWxyZWFkeSBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhdGVtZW50IC0gVGhlIHBvbGljeSBzdGF0ZW1lbnQgdG8gYWRkXG4gICAqIEBwYXJhbSBjZG5BdXRoIC0gT3B0aW9uYWwgQ0ROIGF1dGhvcml6YXRpb24gY29uZmlndXJhdGlvbi4gT25seSB0aGUgZmlyc3QgQ0ROIGF1dGggY29uZmlndXJhdGlvbiBpcyB1c2VkIGlmIHByb3ZpZGVkIG11bHRpcGxlIHRpbWVzLlxuICAgKi9cbiAgYWRkVG9SZXNvdXJjZVBvbGljeShzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCwgY2RuQXV0aD86IENkbkF1dGhDb25maWd1cmF0aW9uKTogQWRkVG9SZXNvdXJjZVBvbGljeVJlc3VsdDtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBtZXRyaWMuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRyaWNOYW1lIG5hbWUgb2YgdGhlIG1ldHJpYy5cbiAgICogQHBhcmFtIHByb3BzIG1ldHJpYyBvcHRpb25zLlxuICAgKi9cbiAgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIE1ldHJpYyBmb3IgSW5ncmVzcyBCeXRlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY0luZ3Jlc3NCeXRlcyhvcHRpb25zPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJucyBNZXRyaWMgZm9yIEVncmVzcyBCeXRlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY0VncmVzc0J5dGVzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJucyBNZXRyaWMgZm9yIEluZ3Jlc3MgcmVzcG9uc2UgdGltZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGF2ZXJhZ2Ugb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNJbmdyZXNzUmVzcG9uc2VUaW1lKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJucyBNZXRyaWMgZm9yIEVncmVzcyBSZXNwb25zZSB0aW1lXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXZlcmFnZSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY0VncmVzc1Jlc3BvbnNlVGltZShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgTWV0cmljIGZvciBFZ3Jlc3MgUmVxdWVzdCBDb3VudFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY0VncmVzc1JlcXVlc3RDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgTWV0cmljIGZvciBJbmdyZXNzIFJlcXVlc3QgQ291bnRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNJbmdyZXNzUmVxdWVzdENvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcbn1cblxuLyoqXG4gKiBEUk0gc2V0dGluZ3Mga2V5cyBmb3IgbWFuaWZlc3QgZmlsdGVyIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBlbnVtIERybVNldHRpbmdzS2V5IHtcbiAgLyoqXG4gICAqIEV4Y2x1ZGUgRVhULVgtU0VTU0lPTi1LRVkgdGFncyBmcm9tIEhMUyBhbmQgTEwtSExTIG11bHRpdmFyaWFudCBwbGF5bGlzdHMuXG4gICAqXG4gICAqIFRoaXMgY2FuIGltcHJvdmUgY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBITFMgY2xpZW50cyB0aGF0IGhhdmUgaXNzdWVzXG4gICAqIHByb2Nlc3Npbmcgc2Vzc2lvbiBrZXlzLCBvciBwcm92aWRlIG1vcmUgZ3JhbnVsYXIgYWNjZXNzIGNvbnRyb2wgd2hlblxuICAgKiB1c2luZyBtYW5pZmVzdCBmaWx0ZXJpbmcuXG4gICAqL1xuICBFWENMVURFX1NFU1NJT05fS0VZUyA9ICdleGNsdWRlX3Nlc3Npb25fa2V5cycsXG59XG5cbi8qKlxuICogRmlsdGVyIGNvbmZpZ3VyYXRpb24gaW5jbHVkZXMgc2V0dGluZ3MgZm9yIG1hbmlmZXN0IGZpbHRlcmluZywgc3RhcnQgYW5kIGVuZCB0aW1lcywgYW5kIHRpbWUgZGVsYXkgdGhhdCBhcHBseSB0byBhbGwgb2YgeW91ciBlZ3Jlc3MgcmVxdWVzdHMgZm9yIHRoaXMgbWFuaWZlc3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBPcHRpb25hbGx5IHNwZWNpZnkgdGhlIGNsaXAgc3RhcnQgdGltZSBmb3IgYWxsIG9mIHlvdXIgbWFuaWZlc3QgZWdyZXNzIHJlcXVlc3RzLlxuICAgKiBXaGVuIHlvdSBpbmNsdWRlIGNsaXAgc3RhcnQgdGltZSwgbm90ZSB0aGF0IHlvdSBjYW5ub3QgdXNlIGNsaXAgc3RhcnQgdGltZSBxdWVyeSBwYXJhbWV0ZXJzIGZvciB0aGlzIG1hbmlmZXN0J3MgZW5kcG9pbnQgVVJMLlxuICAgKlxuICAgKiBUaGlzIHdpbGwgYmUgY29udmVydGVkIHRvIGEgVVRDIHRpbWVzdGFtcC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBjbGlwIHN0YXJ0IHRpbWVcbiAgICovXG4gIHJlYWRvbmx5IGNsaXBTdGFydFRpbWU/OiBEYXRlO1xuICAvKipcbiAgICogT3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBlbmQgdGltZSBmb3IgYWxsIG9mIHlvdXIgbWFuaWZlc3QgZWdyZXNzIHJlcXVlc3RzLlxuICAgKiBXaGVuIHlvdSBpbmNsdWRlIGVuZCB0aW1lLCBub3RlIHRoYXQgeW91IGNhbm5vdCB1c2UgZW5kIHRpbWUgcXVlcnkgcGFyYW1ldGVycyBmb3IgdGhpcyBtYW5pZmVzdCdzIGVuZHBvaW50IFVSTC5cbiAgICpcbiAgICogVGhpcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIFVUQyB0aW1lc3RhbXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZW5kIHRpbWVcbiAgICovXG4gIHJlYWRvbmx5IGVuZD86IERhdGU7XG4gIC8qKlxuICAgKiBPcHRpb25hbGx5IHNwZWNpZnkgdGhlIHN0YXJ0IHRpbWUgZm9yIGFsbCBvZiB5b3VyIG1hbmlmZXN0IGVncmVzcyByZXF1ZXN0cy5cbiAgICogV2hlbiB5b3UgaW5jbHVkZSBzdGFydCB0aW1lLCBub3RlIHRoYXQgeW91IGNhbm5vdCB1c2Ugc3RhcnQgdGltZSBxdWVyeSBwYXJhbWV0ZXJzIGZvciB0aGlzIG1hbmlmZXN0J3MgZW5kcG9pbnQgVVJMLlxuICAgKlxuICAgKiBUaGlzIHdpbGwgYmUgY29udmVydGVkIHRvIGEgVVRDIHRpbWVzdGFtcC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBzdGFydCB0aW1lXG4gICAqL1xuICByZWFkb25seSBzdGFydD86IERhdGU7XG4gIC8qKlxuICAgKiBPcHRpb25hbGx5IHNwZWNpZnkgb25lIG9yIG1vcmUgbWFuaWZlc3QgZmlsdGVycyBmb3IgYWxsIG9mIHlvdXIgbWFuaWZlc3QgZWdyZXNzIHJlcXVlc3RzLlxuICAgKiBXaGVuIHlvdSBpbmNsdWRlIGEgbWFuaWZlc3QgZmlsdGVyLCBub3RlIHRoYXQgeW91IGNhbm5vdCB1c2UgYW4gaWRlbnRpY2FsIG1hbmlmZXN0IGZpbHRlciBxdWVyeSBwYXJhbWV0ZXIgZm9yIHRoaXMgbWFuaWZlc3QncyBlbmRwb2ludCBVUkwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gbWFuaWZlc3QgZmlsdGVyc1xuICAgKi9cbiAgcmVhZG9ubHkgbWFuaWZlc3RGaWx0ZXI/OiBNYW5pZmVzdEZpbHRlcltdO1xuICAvKipcbiAgICogT3B0aW9uYWxseSBzcGVjaWZ5IHRoZSB0aW1lIGRlbGF5IGZvciBhbGwgb2YgeW91ciBtYW5pZmVzdCBlZ3Jlc3MgcmVxdWVzdHMuIEVudGVyIGEgdmFsdWUgdGhhdCBpcyBzbWFsbGVyIHRoYW4geW91ciBlbmRwb2ludCdzIHN0YXJ0b3ZlciB3aW5kb3cuXG4gICAqIFdoZW4geW91IGluY2x1ZGUgdGltZSBkZWxheSwgbm90ZSB0aGF0IHlvdSBjYW5ub3QgdXNlIHRpbWUgZGVsYXkgcXVlcnkgcGFyYW1ldGVycyBmb3IgdGhpcyBtYW5pZmVzdCdzIGVuZHBvaW50IFVSTC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyB0aW1lIGRlbGF5XG4gICAqL1xuICByZWFkb25seSB0aW1lRGVsYXk/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIERSTSBzZXR0aW5ncyBmb3IgbWFuaWZlc3QgZWdyZXNzIHJlcXVlc3RzLlxuICAgKlxuICAgKiBXaGVuIHlvdSBpbmNsdWRlIGEgRFJNIHNldHRpbmcsIG5vdGUgdGhhdCB5b3UgY2Fubm90IHVzZSBhbiBpZGVudGljYWxcbiAgICogRFJNIHNldHRpbmcgcXVlcnkgcGFyYW1ldGVyIGZvciB0aGlzIG1hbmlmZXN0J3MgZW5kcG9pbnQgVVJMLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIERSTSBzZXR0aW5nc1xuICAgKi9cbiAgcmVhZG9ubHkgZHJtU2V0dGluZ3M/OiBEcm1TZXR0aW5nc0tleVtdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGEgU3RhcnRUYWcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRUYWdPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIHZhbHVlIGZvciBQUkVDSVNFIHdpdGhpbiB5b3VyIEVYVC1YLVNUQVJUIHRhZy5cbiAgICpcbiAgICogTGVhdmUgYmxhbmssIG9yIGNob29zZSBmYWxzZSwgdG8gdXNlIHRoZSBkZWZhdWx0IHZhbHVlIE5PLiBDaG9vc2UgdHJ1ZSB0byB1c2UgdGhlIHZhbHVlIFlFUy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHByZWNpc2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEhlbHBlciBjbGFzcyBmb3IgY3JlYXRpbmcgRVhULVgtU1RBUlQgdGFncyBpbiBITFMgcGxheWxpc3RzLlxuICpcbiAqIFRoZSBFWFQtWC1TVEFSVCB0YWcgaW5kaWNhdGVzIGEgcHJlZmVycmVkIHBvaW50IGF0IHdoaWNoIHRvIHN0YXJ0IHBsYXlpbmcgYSBwbGF5bGlzdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXJ0VGFnIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0YXJ0IHRhZyB3aXRoIGEgdGltZSBvZmZzZXQuXG4gICAqXG4gICAqIEBwYXJhbSB0aW1lT2Zmc2V0IFRoZSB0aW1lIG9mZnNldCBpbiBzZWNvbmRzLiBDYW4gYmUgcG9zaXRpdmUgKGZvcndhcmQgZnJvbSBzdGFydCkgb3IgbmVnYXRpdmUgKGJhY2sgZnJvbSBsaXZlIGVkZ2UpLlxuICAgKiAgIC0gSWYgcG9zaXRpdmU6IG11c3QgYmUgbGVzcyB0aGFuIChtYW5pZmVzdCBkdXJhdGlvbiAtIDMgw5cgc2VnbWVudCBkdXJhdGlvbilcbiAgICogICAtIElmIG5lZ2F0aXZlOiBhYnNvbHV0ZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAoMyDDlyBzZWdtZW50IGR1cmF0aW9uKSBhbmQgbGVzcyB0aGFuIG1hbmlmZXN0IGR1cmF0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIEFkZGl0aW9uYWwgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvZih0aW1lT2Zmc2V0OiBudW1iZXIsIG9wdGlvbnM/OiBTdGFydFRhZ09wdGlvbnMpOiBTdGFydFRhZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpbWVPZmZzZXQsXG4gICAgICBwcmVjaXNlOiBvcHRpb25zICYmIG9wdGlvbnMucHJlY2lzZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5wcmVjaXNlIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgc3RhcnQgdGFnIHdpdGggcHJlY2lzZSBwb3NpdGlvbmluZyBlbmFibGVkIChQUkVDSVNFPVlFUykuXG4gICAqXG4gICAqIEBwYXJhbSB0aW1lT2Zmc2V0IFRoZSB0aW1lIG9mZnNldCBpbiBzZWNvbmRzIChwb3NpdGl2ZSBvciBuZWdhdGl2ZSlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgd2l0aFByZWNpc2UodGltZU9mZnNldDogbnVtYmVyKTogU3RhcnRUYWcge1xuICAgIHJldHVybiB7XG4gICAgICB0aW1lT2Zmc2V0LFxuICAgICAgcHJlY2lzZTogdHJ1ZSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgRVhULVgtU1RBUlQgdGFnIGluIEhMUyBwbGF5bGlzdHMuXG4gKlxuICogVXNlIHRoZSBgU3RhcnRUYWdgIGhlbHBlciBjbGFzcyB0byBjcmVhdGUgaW5zdGFuY2VzIHdpdGggdmFsaWRhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydFRhZyB7XG4gIC8qKlxuICAgKiBTcGVjaWZ5IHRoZSB2YWx1ZSBmb3IgUFJFQ0lTRSB3aXRoaW4geW91ciBFWFQtWC1TVEFSVCB0YWcuXG4gICAqXG4gICAqIExlYXZlIGJsYW5rLCBvciBjaG9vc2UgZmFsc2UsIHRvIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBOTy4gQ2hvb3NlIHRydWUgdG8gdXNlIHRoZSB2YWx1ZSBZRVMuXG4gICAqL1xuICByZWFkb25seSBwcmVjaXNlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIHZhbHVlIGZvciBUSU1FLU9GRlNFVCB3aXRoaW4geW91ciBFWFQtWC1TVEFSVCB0YWcuXG4gICAqXG4gICAqIEVudGVyIGEgc2lnbmVkIGZsb2F0aW5nIHBvaW50IHZhbHVlIHdoaWNoLCBpZiBwb3NpdGl2ZSwgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGNvbmZpZ3VyZWRcbiAgICogbWFuaWZlc3QgZHVyYXRpb24gbWludXMgdGhyZWUgdGltZXMgdGhlIGNvbmZpZ3VyZWQgc2VnbWVudCB0YXJnZXQgZHVyYXRpb24uIElmIG5lZ2F0aXZlLFxuICAgKiB0aGUgYWJzb2x1dGUgdmFsdWUgbXVzdCBiZSBsYXJnZXIgdGhhbiB0aHJlZSB0aW1lcyB0aGUgY29uZmlndXJlZCBzZWdtZW50IHRhcmdldCBkdXJhdGlvbixcbiAgICogYW5kIHRoZSBhYnNvbHV0ZSB2YWx1ZSBtdXN0IGJlIHNtYWxsZXIgdGhhbiB0aGUgY29uZmlndXJlZCBtYW5pZmVzdCBkdXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVPZmZzZXQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBCYXNlIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24uXG4gKi9cbmludGVyZmFjZSBNYW5pZmVzdENvbmZpZ3VyYXRpb25CYXNlIHtcbiAgLyoqXG4gICAqIEZpbHRlciBjb25maWd1cmF0aW9uIGluY2x1ZGVzIHNldHRpbmdzIGZvciBtYW5pZmVzdCBmaWx0ZXJpbmcsIHN0YXJ0IGFuZCBlbmQgdGltZXMsIGFuZCB0aW1lIGRlbGF5IHRoYXQgYXBwbHkgdG8gYWxsIG9mIHlvdXIgZWdyZXNzIHJlcXVlc3RzIGZvciB0aGlzIG1hbmlmZXN0LlxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWVkaWFwYWNrYWdlL2xhdGVzdC91c2VyZ3VpZGUvbWFuaWZlc3QtZmlsdGVyLXF1ZXJ5LXBhcmFtZXRlcnMuaHRtbFxuICAgKiBAZGVmYXVsdCAtIE5vIGZpbHRlciBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBmaWx0ZXJDb25maWd1cmF0aW9uPzogRmlsdGVyQ29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBkdXJhdGlvbiAoaW4gc2Vjb25kcykgb2YgdGhlIG1hbmlmZXN0J3MgY29udGVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgNjBcbiAgICovXG4gIHJlYWRvbmx5IG1hbmlmZXN0V2luZG93PzogRHVyYXRpb247XG59XG5cbi8qKlxuICogQ2hvb3NlIGhvdyBhZCBtYXJrZXJzIGFyZSBpbmNsdWRlZCBpbiB0aGUgcGFja2FnZWQgY29udGVudC5cbiAqL1xuZXhwb3J0IGVudW0gQWRNYXJrZXJEYXNoIHtcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgQklOQVJZIC0gVGhlIFNDVEUtMzUgbWFya2VyIGlzIGV4cHJlc3NlZCBhcyBhIGhleC1zdHJpbmcgKEJhc2U2NCBzdHJpbmcpIHJhdGhlciB0aGFuIGZ1bGwgWE1MLlxuICAgKi9cbiAgQklOQVJZPSdCSU5BUlknLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBYTUwgLSBUaGUgU0NURSBtYXJrZXIgaXMgZXhwcmVzc2VkIGZ1bGx5IGluIFhNTC5cbiAgICovXG4gIFhNTD0nWE1MJyxcbn1cblxuLyoqXG4gKiBDaG9vc2UgaG93IFNDVEUtMzUgYWQgbWFya2VycyBhcmUgaW5jbHVkZWQgaW4gSExTIGFuZCBMTC1ITFMgbWFuaWZlc3RzLlxuICovXG5leHBvcnQgZW51bSBBZE1hcmtlckhscyB7XG4gIC8qKlxuICAgKiBJbnNlcnQgRVhULVgtREFURVJBTkdFIHRhZ3MgdG8gc2lnbmFsIGFkIGNvbnRlbnQuXG4gICAqL1xuICBEQVRFUkFOR0UgPSAnREFURVJBTkdFJyxcbiAgLyoqXG4gICAqIEluc2VydCBlbmhhbmNlZCBTQ1RFLTM1IHRhZ3MgZm9yIGFkIGNvbnRlbnQuXG4gICAqL1xuICBTQ1RFMzVfRU5IQU5DRUQgPSAnU0NURTM1X0VOSEFOQ0VEJyxcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiB2YXJpYWJsZSB0aGF0IE1lZGlhUGFja2FnZSB1c2VzIGluIHRoZSBtZWRpYSBhdHRyaWJ1dGUgb2YgdGhlIFNlZ21lbnRUZW1wbGF0ZSB0YWcuXG4gKi9cbmV4cG9ydCBlbnVtIFNlZ21lbnRUZW1wbGF0ZUZvcm1hdCB7XG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIG51bWJlciB3aXRoIHRpbWVsaW5lLlxuICAgKi9cbiAgTlVNQkVSX1dJVEhfVElNRUxJTkU9J05VTUJFUl9XSVRIX1RJTUVMSU5FJyxcbn1cblxuLyoqXG4gKiBUaGUgVVRDIHRpbWluZyBtb2RlIGZvciBEQVNILlxuICovXG5leHBvcnQgZW51bSBEYXNoVXRjVGltaW5nTW9kZSB7XG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIEhUVFBfSEVBRC5cbiAgICovXG4gIEhUVFBfSEVBRD0nSFRUUF9IRUFEJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgSFRUUF9JU08uXG4gICAqL1xuICBIVFRQX0lTTz0nSFRUUF9JU08nLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBIVFRQX1hTREFURS5cbiAgICovXG4gIEhUVFBfWFNEQVRFPSdIVFRQX1hTREFURScsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIFVUQ19ESVJFQ1QuXG4gICAqL1xuICBVVENfRElSRUNUPSdVVENfRElSRUNUJyxcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0cmlnZ2VycyB3aGljaCBjYXVzZSBBV1MgRWxlbWVudGFsIE1lZGlhUGFja2FnZSB0byBjcmVhdGUgbWVkaWEgcHJlc2VudGF0aW9uIGRlc2NyaXB0aW9uIChNUEQpIHBlcmlvZHMgaW4gdGhlIG91dHB1dCBtYW5pZmVzdC5cbiAqL1xuZXhwb3J0IGVudW0gRGFzaFBlcmlvZFRyaWdnZXJzIHtcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgQVZBSUxTLlxuICAgKi9cbiAgQVZBSUxTPSdBVkFJTFMnLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBEUk1fS0VZX1JPVEFUSU9OLlxuICAgKi9cbiAgRFJNX0tFWV9ST1RBVElPTj0nRFJNX0tFWV9ST1RBVElPTicsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIFNPVVJDRV9DSEFOR0VTLlxuICAgKi9cbiAgU09VUkNFX0NIQU5HRVM9J1NPVVJDRV9DSEFOR0VTJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgU09VUkNFX0RJU1JVUFRJT05TLlxuICAgKi9cbiAgU09VUkNFX0RJU1JVUFRJT05TPSdTT1VSQ0VfRElTUlVQVElPTlMnLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBOT05FLlxuICAgKi9cbiAgTk9ORT0nTk9ORScsXG59XG5cbi8qKlxuICogRFJNIHNpZ25hbGluZyBkZXRlcm1pbmVzIHRoZSB3YXkgREFTSCBtYW5pZmVzdCBzaWduYWxzIHRoZSBEUk0gY29udGVudC5cbiAqL1xuZXhwb3J0IGVudW0gRHJtU2lnbmFsbGluZyB7XG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIElORElWSURVQUwuXG4gICAqL1xuICBJTkRJVklEVUFMPSdJTkRJVklEVUFMJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgUkVGRVJFTkNFRC5cbiAgICovXG4gIFJFRkVSRU5DRUQ9J1JFRkVSRU5DRUQnLFxufVxuXG4vKipcbiAqIFNUQU5EQVJEIGluZGljYXRlcyBhIGRlZmF1bHQgbWFuaWZlc3QsIHdoaWNoIGlzIGNvbXBhY3RlZC4gTk9ORSBpbmRpY2F0ZXMgYSBmdWxsIG1hbmlmZXN0LlxuICovXG5leHBvcnQgZW51bSBEYXNoTWFuaWZlc3RDb21wYWN0bmVzcyB7XG4gIC8qKlxuICAgKiBTVEFOREFSRFxuICAgKi9cbiAgU1RBTkRBUkQ9J1NUQU5EQVJEJyxcbiAgLyoqXG4gICAqIE5PTkVcbiAgICovXG4gIE5PTkU9J05PTkUnLFxufVxuXG4vKipcbiAqIFRoZSBiYXNlIFVSTHMgdG8gdXNlIGZvciByZXRyaWV2aW5nIHNlZ21lbnRzLiBZb3UgY2FuIHNwZWNpZnkgbXVsdGlwbGUgbG9jYXRpb25zIGFuZCBpbmRpY2F0ZSB0aGVcbiAqIHByaW9yaXR5IGFuZCB3ZWlnaHQgZm9yIHdoZW4gZWFjaCBzaG91bGQgYmUgdXNlZCwgZm9yIHVzZSBpbiBtdWx0aS1DRE4gd29ya2Zsb3dzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hCYXNlVXJsUHJvcGVydHkge1xuICAvKipcbiAgICogRm9yIHVzZSB3aXRoIERWQi1EQVNIIHByb2ZpbGVzIG9ubHkuIFRoZSBwcmlvcml0eSBvZiB0aGlzIGxvY2F0aW9uIGZvciBzZXJ2aW5nIHNlZ21lbnRzLiBUaGUgbG93ZXIgdGhlIG51bWJlciwgdGhlIGhpZ2hlciB0aGUgcHJpb3JpdHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcHJpb3JpdHkgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBkdmJQcmlvcml0eT86IG51bWJlcjtcbiAgLyoqXG4gICAqIEZvciB1c2Ugd2l0aCBEVkItREFTSCBwcm9maWxlcyBvbmx5LiBUaGUgd2VpZ2h0aW5nIGZvciBzb3VyY2UgbG9jYXRpb25zIHRoYXQgaGF2ZSB0aGUgc2FtZSBwcmlvcml0eS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyB3ZWlnaHQgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBkdmJXZWlnaHQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc291cmNlIGxvY2F0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHNlcnZpY2UgbG9jYXRpb24gc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlTG9jYXRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBIHNvdXJjZSBsb2NhdGlvbiBmb3Igc2VnbWVudHMuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBGb3IgdXNlIHdpdGggRFZCLURBU0ggcHJvZmlsZXMgb25seS4gVGhlIHNldHRpbmdzIGZvciBlcnJvciByZXBvcnRpbmcgZnJvbSB0aGUgcGxheWJhY2sgZGV2aWNlXG4gKiB0aGF0IHlvdSB3YW50IEFXUyBFbGVtZW50YWwgTWVkaWFQYWNrYWdlIHRvIHBhc3MgdGhyb3VnaCB0byB0aGUgbWFuaWZlc3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaER2Yk1ldHJpY3NSZXBvcnRpbmcge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBwbGF5YmFjayBkZXZpY2VzIHBlciAxMDAwIHRoYXQgd2lsbCBzZW5kIGVycm9yIHJlcG9ydHMgdG8gdGhlIHJlcG9ydGluZyBVUkwuXG4gICAqIFRoaXMgcmVwcmVzZW50cyB0aGUgcHJvYmFiaWxpdHkgdGhhdCBhIHBsYXliYWNrIGRldmljZSB3aWxsIGJlIGEgcmVwb3J0aW5nIHBsYXllciBmb3IgdGhpcyBzZXNzaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHByb2JhYmlsaXR5IHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvYmFiaWxpdHk/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgVVJMIHdoZXJlIHBsYXliYWNrIGRldmljZXMgc2VuZCBlcnJvciByZXBvcnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3J0aW5nVXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRm9yIHVzZSB3aXRoIERWQi1EQVNIIHByb2ZpbGVzIG9ubHkuIFRoZSBzZXR0aW5ncyBmb3IgZm9udCBkb3dubG9hZHMgdGhhdCB5b3Ugd2FudCBBV1MgRWxlbWVudGFsIE1lZGlhUGFja2FnZSB0byBwYXNzIHRocm91Z2ggdG8gdGhlIG1hbmlmZXN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hEdmJGb250RG93bmxvYWQge1xuICAvKipcbiAgICogVGhlIGZvbnRGYW1pbHkgbmFtZSBmb3Igc3VidGl0bGVzLCBhcyBkZXNjcmliZWQgaW4gRUJVLVRULUQgU3VidGl0bGluZyBEaXN0cmlidXRpb24gRm9ybWF0LlxuICAgKiBAZXh0ZXJuYWwgaHR0cHM6Ly90ZWNoLmVidS5jaC9wdWJsaWNhdGlvbnMvdGVjaDMzODBcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBmb250IGZhbWlseSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IGZvbnRGYW1pbHk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbWltZVR5cGUgb2YgdGhlIHJlc291cmNlIHRoYXQncyBhdCB0aGUgZm9udCBkb3dubG9hZCBVUkwuXG4gICAqIEZvciBpbmZvcm1hdGlvbiBhYm91dCBmb250IE1JTUUgdHlwZXMsIHNlZSB0aGUgTVBFRy1EQVNIIFByb2ZpbGUgZm9yIFRyYW5zcG9ydCBvZiBJU08gQk1GRiBCYXNlZCBEVkIgU2VydmljZXMgb3ZlciBJUCBCYXNlZCBOZXR3b3JrcyBkb2N1bWVudC5cbiAgICpcbiAgICogQGV4dGVybmFsIGh0dHBzOi8vZHZiLm9yZy93cC1jb250ZW50L3VwbG9hZHMvMjAyMS8wNi9BMTY4cjRfTVBFRy1EQVNILVByb2ZpbGUtZm9yLVRyYW5zcG9ydC1vZi1JU08tQk1GRi1CYXNlZC1EVkItU2VydmljZXNfRHJhZnQtdHNfMTAzLTI4NS12MTQwX05vdmVtYmVyXzIwMjEucGRmXG4gICAqIEBkZWZhdWx0IC0gTm8gTUlNRSB0eXBlIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgbWltZVR5cGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgVVJMIGZvciBkb3dubG9hZGluZyBmb250cyBmb3Igc3VidGl0bGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGZvbnQgZG93bmxvYWQgVVJMIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgdXJsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBmb250IGRvd25sb2FkIGFuZCBlcnJvciByZXBvcnRpbmcgaW5mb3JtYXRpb24gdGhhdCB5b3Ugd2FudCBNZWRpYVBhY2thZ2UgdG8gcGFzcyB0aHJvdWdoIHRvIHRoZSBtYW5pZmVzdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoRHZiU2V0dGluZ3Mge1xuICAvKipcbiAgICogUGxheWJhY2sgZGV2aWNlIGVycm9yIHJlcG9ydGluZyBzZXR0aW5ncy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBlcnJvciBtZXRyaWNzIGNvbmZpZ3VyZWRcbiAgICovXG4gIHJlYWRvbmx5IGVycm9yTWV0cmljcz86IERhc2hEdmJNZXRyaWNzUmVwb3J0aW5nW107XG4gIC8qKlxuICAgKiBTdWJ0aXRsZSBmb250IHNldHRpbmdzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGZvbnQgZG93bmxvYWQgY29uZmlndXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZm9udERvd25sb2FkPzogRGFzaER2YkZvbnREb3dubG9hZDtcbn1cblxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBjb250ZW50IHRoYXQgeW91IHdhbnQgTWVkaWFQYWNrYWdlIHRvIHBhc3MgdGhyb3VnaCBpbiB0aGUgbWFuaWZlc3QgdG8gdGhlIHBsYXliYWNrIGRldmljZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoUHJvZ3JhbUluZm9ybWF0aW9uIHtcbiAgLyoqXG4gICAqIEEgY29weXJpZ2h0IHN0YXRlbWVudCBhYm91dCB0aGUgY29udGVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBjb3B5cmlnaHQgaW5mb3JtYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGNvcHlyaWdodD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSBjb2RlIGZvciB0aGlzIG1hbmlmZXN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGxhbmd1YWdlIGNvZGUgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBsYW5ndWFnZUNvZGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBbiBhYnNvbHV0ZSBVUkwgdGhhdCBjb250YWlucyBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29udGVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIFVSTFxuICAgKi9cbiAgcmVhZG9ubHkgbW9yZUluZm9ybWF0aW9uVXJsPzogc3RyaW5nO1xuICAvKipcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRlbnQgcHJvdmlkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gc291cmNlIGluZm9ybWF0aW9uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGl0bGUgZm9yIHRoZSBtYW5pZmVzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyB0aXRsZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIFRUTUwgUHJvZmlsZVxuICovXG5leHBvcnQgZW51bSBUdG1sUHJvZmlsZSB7XG4gIC8qKlxuICAgKiBJTVNDXzFcbiAgICovXG4gIElNU0NfMT0nSU1TQ18xJyxcbiAgLyoqXG4gICAqIEVCVV9UVF9EXzEwMVxuICAgKi9cbiAgRUJVX1RUX0RfMTAxPSdFQlVfVFRfRF8xMDEnLFxufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBUVE1MIHN1YnRpdGxlcyBpbiBEQVNIIG1hbmlmZXN0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoVHRtbENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIHByb2ZpbGUgdGhhdCBNZWRpYVBhY2thZ2UgdXNlcyB3aGVuIHNpZ25hbGluZyBzdWJ0aXRsZXMgaW4gdGhlIG1hbmlmZXN0LiBJTVNDIGlzIHRoZSBkZWZhdWx0IHByb2ZpbGUuIEVCVS1UVC1EIHByb2R1Y2VzIHN1YnRpdGxlcyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aCB0aGUgRUJVLVRULUQgVFRNTCBwcm9maWxlLiBNZWRpYVBhY2thZ2UgcGFzc2VzIHRocm91Z2ggc3VidGl0bGUgc3R5bGVzIHRvIHRoZSBtYW5pZmVzdC5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgRUJVLVRULUQgc3VidGl0bGVzLCBzZWUgRUJVLVRULUQgU3VidGl0bGluZyBEaXN0cmlidXRpb24gRm9ybWF0LlxuICAgKlxuICAgKiBAZXh0ZXJuYWwgaHR0cHM6Ly90ZWNoLmVidS5jaC9wdWJsaWNhdGlvbnMvdGVjaDMzODBcbiAgICovXG4gIHJlYWRvbmx5IHR0bWxQcm9maWxlOiBUdG1sUHJvZmlsZTtcblxufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBzdWJ0aXRsZXMgaW4gREFTSCBtYW5pZmVzdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaFN1YnRpdGxlQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBTZXR0aW5ncyBmb3IgVFRNTCBzdWJ0aXRsZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gVFRNTCBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSB0dG1sQ29uZmlndXJhdGlvbj86IERhc2hUdG1sQ29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBUaGUgbGF5b3V0IG9mIHRoZSBNU1MgbWFuaWZlc3QuXG4gKi9cbmV4cG9ydCBlbnVtIE1zc01hbmlmZXN0TGF5b3V0IHtcbiAgLyoqXG4gICAqIEZ1bGwgbWFuaWZlc3QgbGF5b3V0LlxuICAgKi9cbiAgRlVMTCA9ICdGVUxMJyxcbiAgLyoqXG4gICAqIENvbXBhY3QgbWFuaWZlc3QgbGF5b3V0LlxuICAgKi9cbiAgQ09NUEFDVCA9ICdDT01QQUNUJyxcbn1cblxuLyoqXG4gKiBUaGUgTVNTIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTXNzTWFuaWZlc3RDb25maWd1cmF0aW9uIGV4dGVuZHMgTWFuaWZlc3RDb25maWd1cmF0aW9uQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWFuaWZlc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBNU1MgbWFuaWZlc3QgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1hbmlmZXN0TmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGxheW91dCBvZiB0aGUgTVNTIG1hbmlmZXN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBNc3NNYW5pZmVzdExheW91dC5GVUxMXG4gICAqL1xuICByZWFkb25seSBtYW5pZmVzdExheW91dD86IE1zc01hbmlmZXN0TGF5b3V0O1xufVxuXG4vKipcbiAqIFRoZSBEQVNIIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaE1hbmlmZXN0Q29uZmlndXJhdGlvbiBleHRlbmRzIE1hbmlmZXN0Q29uZmlndXJhdGlvbkJhc2Uge1xuICAvKipcbiAgICogVGhlIGJhc2UgVVJMcyB0byB1c2UgZm9yIHJldHJpZXZpbmcgc2VnbWVudHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gYmFzZSBVUkxzIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVVybHM/OiBEYXNoQmFzZVVybFByb3BlcnR5W107XG4gIC8qKlxuICAgKiBUaGUgbGF5b3V0IG9mIHRoZSBEQVNIIG1hbmlmZXN0IHRoYXQgTWVkaWFQYWNrYWdlIHByb2R1Y2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEYXNoTWFuaWZlc3RDb21wYWN0bmVzcy5TVEFOREFSRFxuICAgKi9cbiAgcmVhZG9ubHkgY29tcGFjdG5lc3M/OiBEYXNoTWFuaWZlc3RDb21wYWN0bmVzcztcbiAgLyoqXG4gICAqIEZvciBlbmRwb2ludHMgdGhhdCB1c2UgdGhlIERWQi1EQVNIIHByb2ZpbGUgb25seS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBEVkIgc2V0dGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IGR2YlNldHRpbmdzPzogRGFzaER2YlNldHRpbmdzO1xuICAvKipcbiAgICogVGhlIHByb2ZpbGUgdGhhdCB0aGUgb3V0cHV0IGlzIGNvbXBsaWFudCB3aXRoLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHByb2ZpbGVzIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZmlsZXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIERldGFpbHMgYWJvdXQgdGhlIGNvbnRlbnQgdGhhdCB5b3Ugd2FudCBNZWRpYVBhY2thZ2UgdG8gcGFzcyB0aHJvdWdoIGluIHRoZSBtYW5pZmVzdCB0byB0aGUgcGxheWJhY2sgZGV2aWNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHByb2dyYW0gaW5mb3JtYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHByb2dyYW1JbmZvcm1hdGlvbj86IERhc2hQcm9ncmFtSW5mb3JtYXRpb247XG4gIC8qKlxuICAgKiBUaGUgY29uZmlndXJhdGlvbiBmb3IgREFTSCBzdWJ0aXRsZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gc3VidGl0bGUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgc3VidGl0bGVDb25maWd1cmF0aW9uPzogRGFzaFN1YnRpdGxlQ29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtYW5pZmVzdCBhc3NvY2lhdGVkIHdpdGggdGhlIERBU0ggbWFuaWZlc3QgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1hbmlmZXN0TmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogRFJNIHNpZ25hbGluZyBkZXRlcm1pbmVzIHRoZSB3YXkgREFTSCBtYW5pZmVzdCBzaWduYWxzIHRoZSBEUk0gY29udGVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBEUk0gc2lnbmFsaW5nIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgZHJtU2lnbmFsbGluZz86IERybVNpZ25hbGxpbmc7XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBhbW91bnQgb2YgY29udGVudCB0aGF0IHRoZSBwbGF5ZXIgbXVzdCBrZWVwIGF2YWlsYWJsZSBpbiB0aGUgYnVmZmVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCA1XG4gICAqL1xuICByZWFkb25seSBtaW5CdWZmZXJUaW1lPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBhbW91bnQgb2YgdGltZSBmb3IgdGhlIHBsYXllciB0byB3YWl0IGJlZm9yZSByZXF1ZXN0aW5nIGFuIHVwZGF0ZWQgbWFuaWZlc3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IDJcbiAgICovXG4gIHJlYWRvbmx5IG1pblVwZGF0ZVBlcmlvZD86IER1cmF0aW9uO1xuICAvKipcbiAgICogU3BlY2lmeSB3aGF0IHRyaWdnZXJzIGNhdXNlIEFXUyBFbGVtZW50YWwgTWVkaWFQYWNrYWdlIHRvIGNyZWF0ZSBtZWRpYSBwcmVzZW50YXRpb24gZGVzY3JpcHRpb24gKE1QRCkgcGVyaW9kcyBpbiB0aGUgb3V0cHV0IG1hbmlmZXN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBbRGFzaFBlcmlvZFRyaWdnZXJzLkFWQUlMUywgRGFzaFBlcmlvZFRyaWdnZXJzLkRSTV9LRVlfUk9UQVRJT04sIERhc2hQZXJpb2RUcmlnZ2Vycy5TT1VSQ0VfQ0hBTkdFUywgRGFzaFBlcmlvZFRyaWdnZXJzLlNPVVJDRV9ESVNSVVBUSU9OU11cbiAgICovXG4gIHJlYWRvbmx5IHBlcmlvZFRyaWdnZXJzPzogRGFzaFBlcmlvZFRyaWdnZXJzW107XG4gIC8qKlxuICAgKiBDaG9vc2UgaG93IGFkIG1hcmtlcnMgYXJlIGluY2x1ZGVkIGluIHRoZSBwYWNrYWdlZCBjb250ZW50LiBJZiB5b3UgaW5jbHVkZSBhZCBtYXJrZXJzIGluIHRoZSBjb250ZW50IHN0cmVhbSBpbiB5b3VyIHVwc3RyZWFtIGVuY29kZXJzLFxuICAgKiB0aGVuIHlvdSBuZWVkIHRvIGluZm9ybSBNZWRpYVBhY2thZ2Ugd2hhdCB0byBkbyB3aXRoIHRoZSBhZCBtYXJrZXJzIGluIHRoZSBvdXRwdXQuXG4gICAqXG4gICAqIFRvIGNob29zZSB0aGlzIG9wdGlvbiBTVENFIGZpbHRlcmluZyBuZWVkcyB0byBiZSBlbmFibGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBZE1hcmtlckRhc2guWE1MXG4gICAqL1xuICByZWFkb25seSBzY3RlRGFzaEFkTWFya2VyPzogQWRNYXJrZXJEYXNoO1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdmFyaWFibGUgdGhhdCBNZWRpYVBhY2thZ2UgdXNlcyBpbiB0aGUgbWVkaWEgYXR0cmlidXRlIG9mIHRoZSBTZWdtZW50VGVtcGxhdGUgdGFnLlxuICAgKlxuICAgKiBAZGVmYXVsdCBTZWdtZW50VGVtcGxhdGVGb3JtYXQuTlVNQkVSX1dJVEhfVElNRUxJTkVcbiAgICovXG4gIHJlYWRvbmx5IHNlZ21lbnRUZW1wbGF0ZUZvcm1hdD86IFNlZ21lbnRUZW1wbGF0ZUZvcm1hdDtcbiAgLyoqXG4gICAqIFRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBwbGF5ZXIgc2hvdWxkIGJlIGZyb20gdGhlIGVuZCBvZiB0aGUgbWFuaWZlc3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICByZWFkb25seSBzdWdnZXN0ZWRQcmVzZW50YXRpb25EZWxheT86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIFVUQyB0aW1pbmcgbW9kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgRGFzaFV0Y1RpbWluZ01vZGUuVVRDX0RJUkVDVFxuICAgKi9cbiAgcmVhZG9ubHkgdXRjVGltaW5nTW9kZT86IERhc2hVdGNUaW1pbmdNb2RlO1xuICAvKipcbiAgICogVGhlIG1ldGhvZCB0aGF0IHRoZSBwbGF5ZXIgdXNlcyB0byBzeW5jaHJvbml6ZSB0byBjb29yZGluYXRlZCB1bml2ZXJzYWwgdGltZSAoVVRDKSB3YWxsIGNsb2NrIHRpbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAtIE5vIHZhbHVlIGlzIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgdXRjVGltaW5nU291cmNlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBITFMgbWFuaWZlc3QgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNYW5pZmVzdENvbmZpZ3VyYXRpb25CYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtYW5pZmVzdCBhc3NvY2lhdGVkIHdpdGggdGhlIEhMUyBtYW5pZmVzdCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbWFuaWZlc3ROYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2hpbGQgbWFuaWZlc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBITFMgbWFuaWZlc3QgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBjaGlsZCBtYW5pZmVzdCBuYW1lIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgY2hpbGRNYW5pZmVzdE5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJbnNlcnRzIEVYVC1YLVBST0dSQU0tREFURS1USU1FIHRhZ3MgaW4gdGhlIG91dHB1dCBtYW5pZmVzdCBhdCB0aGUgaW50ZXJ2YWwgdGhhdCB5b3Ugc3BlY2lmeS5cbiAgICogSWYgeW91IGRvbid0IGVudGVyIGFuIGludGVydmFsLCBFWFQtWC1QUk9HUkFNLURBVEUtVElNRSB0YWdzIGFyZW4ndCBpbmNsdWRlZCBpbiB0aGUgbWFuaWZlc3QuXG4gICAqIFRoZSB0YWdzIHN5bmMgdGhlIHN0cmVhbSB0byB0aGUgd2FsbCBjbG9jayBzbyB0aGF0IHZpZXdlcnMgY2FuIHNlZWsgdG8gYSBzcGVjaWZpYyB0aW1lIGluIHRoZSBwbGF5YmFjayB0aW1lbGluZSBvbiB0aGUgcGxheWVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHByb2dyYW0gZGF0ZSB0aW1lIGludGVydmFsXG4gICAqL1xuICByZWFkb25seSBwcm9ncmFtRGF0ZVRpbWVJbnRlcnZhbD86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIFNDVEUtMzUgSExTIGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBITFMgbWFuaWZlc3QgY29uZmlndXJhdGlvbiBvZiB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIFNDVEUgYWQgbWFya2VyIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHNjdGVBZE1hcmtlckhscz86IEFkTWFya2VySGxzO1xuICAvKipcbiAgICogSW5zZXJ0IEVYVC1YLVNUQVJUIHRhZyBpbiB0aGUgbWFuaWZlc3Qgd2l0aCB0aGUgY29uZmlndXJlZCBzZXR0aW5nc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHN0YXJ0IHRhZ1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRUYWc/OiBTdGFydFRhZztcbiAgLyoqXG4gICAqIFdoZW4gZW5hYmxlZCwgTWVkaWFQYWNrYWdlIFVSTC1lbmNvZGVzIHRoZSBxdWVyeSBzdHJpbmcgZm9yIEFQSSByZXF1ZXN0cyBmb3IgSExTIGNoaWxkIG1hbmlmZXN0cyB0byBjb21wbHkgd2l0aCBBV1MgU2lnbmF0dXJlIFZlcnNpb24gNCAoU2lnVjQpIHNpZ25hdHVyZSBzaWduaW5nIHByb3RvY29sLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIEFXUyBTaWduYXR1cmUgVmVyc2lvbiA0IGZvciBBUEkgcmVxdWVzdHMgaW4gQVdTIElkZW50aXR5IGFuZCBBY2Nlc3MgTWFuYWdlbWVudCBVc2VyIEd1aWRlLlxuICAgKlxuICAgKiBAZXh0ZXJuYWwgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9zaWd2Lmh0bWxcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHVybEVuY29kZUNoaWxkTWFuaWZlc3Q/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFNwZWNpZnkgYSBsb3ctbGF0ZW5jeSBIVFRQIGxpdmUgc3RyZWFtaW5nIChMTC1ITFMpIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG93TGF0ZW5jeUhsc01hbmlmZXN0Q29uZmlndXJhdGlvbiBleHRlbmRzIE1hbmlmZXN0Q29uZmlndXJhdGlvbkJhc2Uge1xuICAvKipcbiAgICogQSBzaG9ydCBzdHJpbmcgdGhhdCdzIGFwcGVuZGVkIHRvIHRoZSBlbmRwb2ludCBVUkwuIFRoZSBtYW5pZmVzdCBuYW1lIGNyZWF0ZXMgYSB1bmlxdWUgcGF0aCB0byB0aGlzIGVuZHBvaW50LlxuICAgKiBJZiB5b3UgZG9uJ3QgZW50ZXIgYSB2YWx1ZSwgTWVkaWFQYWNrYWdlIHVzZXMgdGhlIGRlZmF1bHQgbWFuaWZlc3QgbmFtZSwgaW5kZXguIE1lZGlhUGFja2FnZSBhdXRvbWF0aWNhbGx5IGluc2VydHMgdGhlIGZvcm1hdCBleHRlbnNpb24sIHN1Y2ggYXMgLm0zdTguXG4gICAqIFlvdSBjYW4ndCB1c2UgdGhlIHNhbWUgbWFuaWZlc3QgbmFtZSBpZiB5b3UgdXNlIEhMUyBtYW5pZmVzdCBhbmQgbG93LWxhdGVuY3kgSExTIG1hbmlmZXN0LlxuICAgKiBUaGUgbWFuaWZlc3ROYW1lIG9uIHRoZSBITFNNYW5pZmVzdCBvYmplY3Qgb3ZlcnJpZGVzIHRoZSBtYW5pZmVzdE5hbWUgeW91IHByb3ZpZGVkIG9uIHRoZSBvcmlnaW5FbmRwb2ludCBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSBtYW5pZmVzdE5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjaGlsZCBtYW5pZmVzdCBhc3NvY2lhdGVkIHdpdGggdGhlIGxvdy1sYXRlbmN5IEhMUyAoTEwtSExTKSBtYW5pZmVzdCBjb25maWd1cmF0aW9uIG9mIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gY2hpbGQgbWFuaWZlc3QgbmFtZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IGNoaWxkTWFuaWZlc3ROYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogSW5zZXJ0cyBFWFQtWC1QUk9HUkFNLURBVEUtVElNRSB0YWdzIGluIHRoZSBvdXRwdXQgbWFuaWZlc3QgYXQgdGhlIGludGVydmFsIHRoYXQgeW91IHNwZWNpZnkuXG4gICAqIElmIHlvdSBkb24ndCBlbnRlciBhbiBpbnRlcnZhbCwgRVhULVgtUFJPR1JBTS1EQVRFLVRJTUUgdGFncyBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIG1hbmlmZXN0LlxuICAgKiBUaGUgdGFncyBzeW5jIHRoZSBzdHJlYW0gdG8gdGhlIHdhbGwgY2xvY2sgc28gdGhhdCB2aWV3ZXJzIGNhbiBzZWVrIHRvIGEgc3BlY2lmaWMgdGltZSBpbiB0aGUgcGxheWJhY2sgdGltZWxpbmUgb24gdGhlIHBsYXllci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwcm9ncmFtIGRhdGUgdGltZSBpbnRlcnZhbFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZ3JhbURhdGVUaW1lSW50ZXJ2YWw/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBTQ1RFLTM1IEhMUyBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG93LWxhdGVuY3kgSExTIChMTC1ITFMpIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBTQ1RFIGFkIG1hcmtlciBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBzY3RlQWRNYXJrZXJIbHM/OiBBZE1hcmtlckhscztcbiAgLyoqXG4gICAqIEluc2VydCBFWFQtWC1TVEFSVCB0YWcgaW4gdGhlIG1hbmlmZXN0IHdpdGggdGhlIGNvbmZpZ3VyZWQgc2V0dGluZ3NcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBzdGFydCB0YWdcbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0VGFnPzogU3RhcnRUYWc7XG4gIC8qKlxuICAgKiBXaGVuIGVuYWJsZWQsIE1lZGlhUGFja2FnZSBVUkwtZW5jb2RlcyB0aGUgcXVlcnkgc3RyaW5nIGZvciBBUEkgcmVxdWVzdHMgZm9yIExMLUhMUyBjaGlsZCBtYW5pZmVzdHMgdG8gY29tcGx5IHdpdGggQVdTIFNpZ25hdHVyZSBWZXJzaW9uIDQgKFNpZ1Y0KSBzaWduYXR1cmUgc2lnbmluZyBwcm90b2NvbC5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBBV1MgU2lnbmF0dXJlIFZlcnNpb24gNCBmb3IgQVBJIHJlcXVlc3RzIGluIEFXUyBJZGVudGl0eSBhbmQgQWNjZXNzIE1hbmFnZW1lbnQgVXNlciBHdWlkZS5cbiAgICpcbiAgICogQGV4dGVybmFsIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2Vfc2lndi5odG1sXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB1cmxFbmNvZGVDaGlsZE1hbmlmZXN0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIGFuIEFXUyBFbGVtZW50YWwgTWVkaWFQYWNrYWdlIFYyIE9yaWdpbiBFbmRwb2ludC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmlnaW5FbmRwb2ludE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG9yaWdpbiBlbmRwb2ludCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbiBlbmRwb2ludCBjb25maWd1cmF0aW9uLlxuICAgKiBAZGVmYXVsdCBhdXRvZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5FbmRwb2ludE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkIC0gTm8gZGVzY3JpcHRpb24gaXMgYWRkZWQgdG8gT3JpZ2luIEVuZHBvaW50XG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gdGFnZ2luZ1xuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIE1hbmlmZXN0cyBjb25maWd1cmF0aW9uIGZvciBITFMsIExvdyBMYXRlbmN5IEhMUyBhbmQgREFTSC5cbiAgICovXG4gIHJlYWRvbmx5IG1hbmlmZXN0czogTWFuaWZlc3RbXTtcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIHdpbmRvdyB0byBzcGVjaWZ5IGEgd2luZG93IG9mIHRoZSBsaXZlIHN0cmVhbSB0aGF0J3MgYXZhaWxhYmxlIGZvciBvbi1kZW1hbmQgdmlld2luZy4gVmlld2VycyBjYW4gc3RhcnQtb3ZlciBvciBjYXRjaC11cCBvbiBjb250ZW50IHRoYXQgZmFsbHMgd2l0aGluIHRoZSB3aW5kb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IDkwMFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRvdmVyV2luZG93PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBzZWdtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICAgKlxuICAgKiBJbnNpZGUgdGhlIHNlZ21lbnQgY29uZmlndXJhdGlvbiB5b3UgY2FuIGRlZmluZSBvcHRpb25zIHN1Y2ggYXMgZW5jcnlwdGlvbiwgU1BFS0UgcGFyYW1ldGVycyBhbmQgb3RoZXJcbiAgICogZ2VuZXJhbCBzZWdtZW50IGNvbmZpZ3VyYXRpb25zLlxuICAgKlxuICAgKiBVc2UgU2VnbWVudC50cygpIG9yIFNlZ21lbnQuY21hZigpIHRvIGNyZWF0ZSB0aGUgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHNlZ21lbnQ6IFNlZ21lbnRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgZmFpbG92ZXIgc2V0dGluZ3MgZm9yIHRoZSBlbmRwb2ludC5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkIC0gTm8gZm9yY2UgZW5kcG9pbnQgY29uZmlndXJhdGlvbiBpcyBjb25maWd1cmVkXG4gICAqL1xuICByZWFkb25seSBmb3JjZUVuZHBvaW50Q29uZmlndXJhdGlvbkNvbmRpdGlvbnM/OiBFbmRwb2ludEVycm9yQ29uZmlndXJhdGlvbltdO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlIGFjY2VzcyB0byBNZWRpYVBhY2thZ2UgVjIgT3JpZ2luIEVuZHBvaW50IHZpYSBzZWNyZXQgaGVhZGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWQgLSBOb3QgY29uZmlndXJlZCBvbiBlbmRwb2ludFxuICAgKi9cbiAgcmVhZG9ubHkgY2RuQXV0aD86IENkbkF1dGhDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBQb2xpY3kgdG8gYXBwbHkgd2hlbiB0aGUgb3JpZ2luIGVuZHBvaW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgc3RhY2tcbiAgICpcbiAgICogRXZlbiB0aG91Z2ggTWVkaWFQYWNrYWdlIENoYW5uZWxHcm91cHMsIENoYW5uZWxzIGFuZCBPcmlnaW5FbmRwb2ludHMgYXJlIHRlY2huaWNhbGx5IHN0YXRlZnVsLFxuICAgKiB0aGVpciBjb250ZW50cyBhcmUgdHJhbnNpZW50IGFuZCBpdCBpcyBjb21tb24gdG8gYWRkIGFuZCByZW1vdmUgdGhlc2Ugd2hpbGUgcmVhcmNoaXRlY3RpbmcgeW91ciBhcHBsaWNhdGlvbi5cbiAgICogVGhlIGRlZmF1bHQgaXMgdGhlcmVmb3JlIGBERVNUUk9ZYC4gQ2hhbmdlIGl0IHRvIGBSRVRBSU5gIGlmIHRoZSBjb250ZW50IChpbiBhIGxvb2tiYWNrIHdpbmRvdykgYXJlIHNvXG4gICAqIHZhbHVhYmxlIHRoYXQgYWNjaWRlbnRhbGx5IGxvc2luZyBpdCB3b3VsZCBiZSB1bmFjY2VwdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlbW92YWxQb2xpY3kuREVTVFJPWVxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3k7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyB0byBzZXQgb24gYW4gT3JpZ2luIEVuZHBvaW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yaWdpbkVuZHBvaW50UHJvcHMgZXh0ZW5kcyBPcmlnaW5FbmRwb2ludE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGNoYW5uZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqL1xuICByZWFkb25seSBjaGFubmVsOiBJQ2hhbm5lbDtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIE9yaWdpbiBFbmRwb2ludCBkZWZpbmVkIG91dHNpZGUgb2YgdGhpcyBzdGFjay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmlnaW5FbmRwb2ludEF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIG5hbWUgdGhhdCBkZXNjcmliZXMgdGhlIGNoYW5uZWwgZ3JvdXAuIFRoZSBuYW1lIGlzIHRoZSBwcmltYXJ5IGlkZW50aWZpZXIgZm9yIHRoZSBjaGFubmVsIGdyb3VwLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjaGFubmVsR3JvdXBOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIHRoYXQgZGVzY3JpYmVzIHRoZSBjaGFubmVsLiBUaGUgbmFtZSBpcyB0aGUgcHJpbWFyeSBpZGVudGlmaWVyIGZvciB0aGUgY2hhbm5lbC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgdGhhdCBkZXNjcmliZXMgdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luRW5kcG9pbnROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBV1MgcmVnaW9uIHdoZXJlIHRoZSBvcmlnaW4gZW5kcG9pbnQgbGl2ZXMuXG4gICAqXG4gICAqIFJlcXVpcmVkIGZvciBjcm9zcy1yZWdpb24gaW1wb3J0cyB0byBjb25zdHJ1Y3QgdGhlIGNvcnJlY3QgQVJOLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBpbXBvcnRpbmcgc3RhY2sncyByZWdpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBEUk0gc3lzdGVtcyBhdmFpbGFibGUgZm9yIENNQUYgZW5jcnlwdGlvbi5cbiAqXG4gKiBDRU5DIHN1cHBvcnRzIFBsYXlSZWFkeSwgV2lkZXZpbmUsIGFuZCBJcmRldG8uXG4gKiBDQkNTIHN1cHBvcnRzIFBsYXlSZWFkeSwgV2lkZXZpbmUsIGFuZCBGYWlyUGxheS5cbiAqL1xuZXhwb3J0IGVudW0gQ21hZkRybVN5c3RlbSB7XG4gIC8qKlxuICAgKiBGYWlyUGxheSBEUk0gLSB1c2VkIHdpdGggQ0JDUyBlbmNyeXB0aW9uLlxuICAgKi9cbiAgRkFJUlBMQVkgPSAnRkFJUlBMQVknLFxuICAvKipcbiAgICogUGxheVJlYWR5IERSTSAtIHVzZWQgd2l0aCBDRU5DIGFuZCBDQkNTIGVuY3J5cHRpb24uXG4gICAqL1xuICBQTEFZUkVBRFkgPSAnUExBWVJFQURZJyxcbiAgLyoqXG4gICAqIFdpZGV2aW5lIERSTSAtIHVzZWQgd2l0aCBDRU5DIGFuZCBDQkNTIGVuY3J5cHRpb24uXG4gICAqL1xuICBXSURFVklORSA9ICdXSURFVklORScsXG4gIC8qKlxuICAgKiBJcmRldG8gRFJNIC0gdXNlZCB3aXRoIENFTkMgZW5jcnlwdGlvbi5cbiAgICovXG4gIElSREVUTyA9ICdJUkRFVE8nLFxufVxuXG4vKipcbiAqIERSTSBzeXN0ZW1zIGF2YWlsYWJsZSBmb3IgVFMgZW5jcnlwdGlvbi5cbiAqXG4gKiBTQU1QTEVfQUVTIHVzZXMgRmFpclBsYXksIEFFU18xMjggdXNlcyBDbGVhciBLZXkgQUVTIDEyOC5cbiAqL1xuZXhwb3J0IGVudW0gVHNEcm1TeXN0ZW0ge1xuICAvKipcbiAgICogRmFpclBsYXkgRFJNIC0gdXNlZCB3aXRoIFNBTVBMRV9BRVMgZW5jcnlwdGlvbi5cbiAgICovXG4gIEZBSVJQTEFZID0gJ0ZBSVJQTEFZJyxcbiAgLyoqXG4gICAqIENsZWFyIEtleSBBRVMgMTI4IC0gdXNlZCB3aXRoIEFFU18xMjggZW5jcnlwdGlvbi5cbiAgICovXG4gIENMRUFSX0tFWV9BRVNfMTI4ID0gJ0NMRUFSX0tFWV9BRVNfMTI4Jyxcbn1cblxuLyoqXG4gKiBEUk0gc3lzdGVtcyBhdmFpbGFibGUgZm9yIElTTSBlbmNyeXB0aW9uLlxuICpcbiAqIElTTSBvbmx5IHN1cHBvcnRzIFBsYXlSZWFkeSB3aXRoIENFTkMuXG4gKi9cbmV4cG9ydCBlbnVtIElzbURybVN5c3RlbSB7XG4gIC8qKlxuICAgKiBQbGF5UmVhZHkgRFJNLlxuICAgKi9cbiAgUExBWVJFQURZID0gJ1BMQVlSRUFEWScsXG59XG5cbi8qKlxuICogQmFzZSBwcm9wZXJ0aWVzIGNvbW1vbiB0byBhbGwgU1BFS0UgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9ucy5cbiAqL1xuaW50ZXJmYWNlIFNwZWtlRW5jcnlwdGlvblByb3BzQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjb250ZW50LlxuICAgKlxuICAgKiBUaGUgc2VydmljZSBzZW5kcyB0aGlzIGlkZW50aWZpZXIgdG8gdGhlIGtleSBzZXJ2ZXIgdG8gaWRlbnRpZnkgdGhlIGN1cnJlbnQgZW5kcG9pbnQuXG4gICAqIEhvdyB1bmlxdWUgeW91IG1ha2UgdGhpcyBpZGVudGlmaWVyIGRlcGVuZHMgb24gaG93IGZpbmUtZ3JhaW5lZCB5b3Ugd2FudCBhY2Nlc3MgY29udHJvbHMgdG8gYmUuXG4gICAqIFRoZSBzZXJ2aWNlIGRvZXMgbm90IHBlcm1pdCB5b3UgdG8gdXNlIHRoZSBzYW1lIElEIGZvciB0d28gc2ltdWx0YW5lb3VzIGVuY3J5cHRpb24gcHJvY2Vzc2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJQU0gcm9sZSBmb3IgYWNjZXNzaW5nIHRoZSBrZXkgcHJvdmlkZXIgQVBJLlxuICAgKlxuICAgKiBUaGlzIHJvbGUgbXVzdCBoYXZlIGEgdHJ1c3QgcG9saWN5IHRoYXQgYWxsb3dzIE1lZGlhUGFja2FnZSB0byBhc3N1bWUgdGhlIHJvbGUsXG4gICAqIGFuZCBpdCBtdXN0IGhhdmUgc3VmZmljaWVudCBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlIGtleSByZXRyaWV2YWwgVVJMLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZTogSVJvbGU7XG5cbiAgLyoqXG4gICAqIFVSTCBvZiB0aGUgU1BFS0Uga2V5IHByb3ZpZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGNlcnRpZmljYXRlIHRoYXQgeW91IGltcG9ydGVkIHRvIEFXUyBDZXJ0aWZpY2F0ZSBNYW5hZ2VyXG4gICAqIHRvIGFkZCBjb250ZW50IGtleSBlbmNyeXB0aW9uIHRvIHRoaXMgZW5kcG9pbnQuXG4gICAqXG4gICAqIEZvciB0aGlzIGZlYXR1cmUgdG8gd29yaywgeW91ciBEUk0ga2V5IHByb3ZpZGVyIG11c3Qgc3VwcG9ydCBjb250ZW50IGtleSBlbmNyeXB0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbnRlbnQga2V5IGVuY3J5cHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGNlcnRpZmljYXRlPzogSUNlcnRpZmljYXRlO1xuXG4gIC8qKlxuICAgKiBBdWRpbyBlbmNyeXB0aW9uIHByZXNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgUHJlc2V0U3Bla2UyMEF1ZGlvLlBSRVNFVF9BVURJT18xXG4gICAqL1xuICByZWFkb25seSBhdWRpb1ByZXNldD86IFByZXNldFNwZWtlMjBBdWRpbztcblxuICAvKipcbiAgICogVmlkZW8gZW5jcnlwdGlvbiBwcmVzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFByZXNldFNwZWtlMjBWaWRlby5QUkVTRVRfVklERU9fMVxuICAgKi9cbiAgcmVhZG9ubHkgdmlkZW9QcmVzZXQ/OiBQcmVzZXRTcGVrZTIwVmlkZW87XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgQ01BRiBTUEVLRSBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ21hZlNwZWtlRW5jcnlwdGlvblByb3BzIGV4dGVuZHMgU3Bla2VFbmNyeXB0aW9uUHJvcHNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBlbmNyeXB0aW9uIG1ldGhvZCB0byB1c2UuXG4gICAqL1xuICByZWFkb25seSBtZXRob2Q6IENtYWZFbmNyeXB0aW9uTWV0aG9kO1xuXG4gIC8qKlxuICAgKiBUaGUgRFJNIHN5c3RlbXMgdG8gdXNlIGZvciBjb250ZW50IHByb3RlY3Rpb24uXG4gICAqXG4gICAqIENFTkMgc3VwcG9ydHMgUGxheVJlYWR5LCBXaWRldmluZSwgYW5kIElyZGV0by5cbiAgICogQ0JDUyBzdXBwb3J0cyBQbGF5UmVhZHksIFdpZGV2aW5lLCBhbmQgRmFpclBsYXkuXG4gICAqL1xuICByZWFkb25seSBkcm1TeXN0ZW1zOiBDbWFmRHJtU3lzdGVtW107XG5cbiAgLyoqXG4gICAqIENvbnN0YW50IGluaXRpYWxpemF0aW9uIHZlY3RvciAoMzItY2hhcmFjdGVyIGhleCBzdHJpbmcpLlxuICAgKlxuICAgKiBBIDEyOC1iaXQsIDE2LWJ5dGUgaGV4IHZhbHVlIHJlcHJlc2VudGVkIGJ5IGEgMzItY2hhcmFjdGVyIHN0cmluZyxcbiAgICogdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBrZXkgZm9yIGVuY3J5cHRpbmcgY29udGVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBNZWRpYVBhY2thZ2UgZ2VuZXJhdGVzIHRoZSBJVlxuICAgKi9cbiAgcmVhZG9ubHkgY29uc3RhbnRJbml0aWFsaXphdGlvblZlY3Rvcj86IHN0cmluZztcblxuICAvKipcbiAgICogS2V5IHJvdGF0aW9uIGludGVydmFsLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHJvdGF0aW9uXG4gICAqL1xuICByZWFkb25seSBrZXlSb3RhdGlvbkludGVydmFsPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFdoZW4gZW5hYmxlZCwgRFJNIG1ldGFkYXRhIGlzIGV4Y2x1ZGVkIGZyb20gQ01BRiBzZWdtZW50cy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVTZWdtZW50RHJtTWV0YWRhdGE/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIFRTIFNQRUtFIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUc1NwZWtlRW5jcnlwdGlvblByb3BzIGV4dGVuZHMgU3Bla2VFbmNyeXB0aW9uUHJvcHNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBlbmNyeXB0aW9uIG1ldGhvZCB0byB1c2UuXG4gICAqL1xuICByZWFkb25seSBtZXRob2Q6IFRzRW5jcnlwdGlvbk1ldGhvZDtcblxuICAvKipcbiAgICogVGhlIERSTSBzeXN0ZW1zIHRvIHVzZSBmb3IgY29udGVudCBwcm90ZWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEZhaXJQbGF5IGZvciBTQU1QTEVfQUVTLCBDbGVhciBLZXkgQUVTIDEyOCBmb3IgQUVTXzEyOFxuICAgKi9cbiAgcmVhZG9ubHkgZHJtU3lzdGVtcz86IFRzRHJtU3lzdGVtW107XG5cbiAgLyoqXG4gICAqIENvbnN0YW50IGluaXRpYWxpemF0aW9uIHZlY3RvciAoMzItY2hhcmFjdGVyIGhleCBzdHJpbmcpLlxuICAgKlxuICAgKiBBIDEyOC1iaXQsIDE2LWJ5dGUgaGV4IHZhbHVlIHJlcHJlc2VudGVkIGJ5IGEgMzItY2hhcmFjdGVyIHN0cmluZyxcbiAgICogdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBrZXkgZm9yIGVuY3J5cHRpbmcgY29udGVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBNZWRpYVBhY2thZ2UgZ2VuZXJhdGVzIHRoZSBJVlxuICAgKi9cbiAgcmVhZG9ubHkgY29uc3RhbnRJbml0aWFsaXphdGlvblZlY3Rvcj86IHN0cmluZztcblxuICAvKipcbiAgICogS2V5IHJvdGF0aW9uIGludGVydmFsLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHJvdGF0aW9uXG4gICAqL1xuICByZWFkb25seSBrZXlSb3RhdGlvbkludGVydmFsPzogRHVyYXRpb247XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgSVNNIFNQRUtFIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbi5cbiAqXG4gKiBJU00gb25seSBzdXBwb3J0cyBDRU5DIGVuY3J5cHRpb24gd2l0aCBQbGF5UmVhZHkgRFJNLlxuICogS2V5IHJvdGF0aW9uIGFuZCBjb25zdGFudCBpbml0aWFsaXphdGlvbiB2ZWN0b3JzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICogQXVkaW8gYW5kIHZpZGVvIHByZXNldHMgZGVmYXVsdCB0byBTSEFSRUQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXNtU3Bla2VFbmNyeXB0aW9uUHJvcHMge1xuICAvKipcbiAgICogVGhlIERSTSBzeXN0ZW1zIHRvIHVzZSBmb3IgY29udGVudCBwcm90ZWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFtJc21Ecm1TeXN0ZW0uUExBWVJFQURZXVxuICAgKi9cbiAgcmVhZG9ubHkgZHJtU3lzdGVtcz86IElzbURybVN5c3RlbVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjb250ZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJQU0gcm9sZSBmb3IgYWNjZXNzaW5nIHRoZSBrZXkgcHJvdmlkZXIgQVBJLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZTogSVJvbGU7XG5cbiAgLyoqXG4gICAqIFVSTCBvZiB0aGUgU1BFS0Uga2V5IHByb3ZpZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGNlcnRpZmljYXRlIHRoYXQgeW91IGltcG9ydGVkIHRvIEFXUyBDZXJ0aWZpY2F0ZSBNYW5hZ2VyXG4gICAqIHRvIGFkZCBjb250ZW50IGtleSBlbmNyeXB0aW9uIHRvIHRoaXMgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29udGVudCBrZXkgZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgY2VydGlmaWNhdGU/OiBJQ2VydGlmaWNhdGU7XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBVc2UgYENtYWZFbmNyeXB0aW9uLnNwZWtlKClgLCBgVHNFbmNyeXB0aW9uLnNwZWtlKClgLCBvciBgSXNtRW5jcnlwdGlvbi5zcGVrZSgpYCB0byBjcmVhdGUgaW5zdGFuY2VzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQmluZHMgdGhlIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbiB0byBwcm9kdWNlIHRoZSBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0eS5cbiAgICpcbiAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QgdXNlZCBieSB0aGUgY29uc3RydWN0IGxpYnJhcnkgYW5kIHNob3VsZCBub3QgYmVcbiAgICogY2FsbGVkIG9yIGltcGxlbWVudGVkIGJ5IGV4dGVybmFsIGNvbnN1bWVycy4gSXQgbWF5IGNoYW5nZSB3aXRob3V0IG5vdGljZS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgX2JpbmQoc2NvcGU6IENvbnN0cnVjdCk6IENmbk9yaWdpbkVuZHBvaW50LkVuY3J5cHRpb25Qcm9wZXJ0eTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgSUFNIHJvbGUgdXNlZCBmb3IgZW5jcnlwdGlvbiwgaWYgYW55LlxuICAgKlxuICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB1c2VkIGJ5IHRoZSBjb25zdHJ1Y3QgbGlicmFyeSBhbmQgc2hvdWxkIG5vdCBiZVxuICAgKiBjYWxsZWQgb3IgaW1wbGVtZW50ZWQgYnkgZXh0ZXJuYWwgY29uc3VtZXJzLiBJdCBtYXkgY2hhbmdlIHdpdGhvdXQgbm90aWNlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfZ2V0Um9sZSgpOiBJUm9sZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgQUNNIGNlcnRpZmljYXRlIHVzZWQgZm9yIGNvbnRlbnQga2V5IGVuY3J5cHRpb24sIGlmIGFueS5cbiAgICpcbiAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QgdXNlZCBieSB0aGUgY29uc3RydWN0IGxpYnJhcnkgYW5kIHNob3VsZCBub3QgYmVcbiAgICogY2FsbGVkIG9yIGltcGxlbWVudGVkIGJ5IGV4dGVybmFsIGNvbnN1bWVycy4gSXQgbWF5IGNoYW5nZSB3aXRob3V0IG5vdGljZS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgX2dldENlcnRpZmljYXRlKCk6IElDZXJ0aWZpY2F0ZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBFbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIENNQUYgc2VnbWVudHMuXG4gKlxuICogVXNlIGBDbWFmRW5jcnlwdGlvbi5zcGVrZSgpYCB0byBjcmVhdGUgYW4gaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBDbWFmRW5jcnlwdGlvbiBleHRlbmRzIEVuY3J5cHRpb25Db25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIFNQRUtFLWJhc2VkIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgQ01BRiBzZWdtZW50cy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc3Bla2UocHJvcHM6IENtYWZTcGVrZUVuY3J5cHRpb25Qcm9wcyk6IENtYWZFbmNyeXB0aW9uIHtcbiAgICBpZiAoIXByb3BzLnVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YFNwZWtlVXJsSHR0cHNSZXF1aXJlZGAsICdTUEVLRSBrZXkgcHJvdmlkZXIgVVJMIG11c3QgdXNlIEhUVFBTLicpO1xuICAgIH1cbiAgICBpZiAocHJvcHMubWV0aG9kID09PSBDbWFmRW5jcnlwdGlvbk1ldGhvZC5DRU5DICYmIHByb3BzLmRybVN5c3RlbXMuaW5jbHVkZXMoQ21hZkRybVN5c3RlbS5GQUlSUExBWSkpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgQ2VuY0ZhaXJQbGF5SW5jb21wYXRpYmxlYCwgJ0NFTkMgZW5jcnlwdGlvbiBtZXRob2QgZG9lcyBub3Qgc3VwcG9ydCBGYWlyUGxheS4gVXNlIENCQ1MgZm9yIEZhaXJQbGF5LicpO1xuICAgIH1cbiAgICBpZiAocHJvcHMubWV0aG9kID09PSBDbWFmRW5jcnlwdGlvbk1ldGhvZC5DQkNTICYmIHByb3BzLmRybVN5c3RlbXMuaW5jbHVkZXMoQ21hZkRybVN5c3RlbS5JUkRFVE8pKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YENiY3NJcmRldG9JbmNvbXBhdGlibGVgLCAnQ0JDUyBlbmNyeXB0aW9uIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IElyZGV0by4gVXNlIENFTkMgZm9yIElyZGV0by4nKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBDbWFmRW5jcnlwdGlvbihwcm9wcyk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogQ21hZlNwZWtlRW5jcnlwdGlvblByb3BzO1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByb3BzOiBDbWFmU3Bla2VFbmNyeXB0aW9uUHJvcHMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY29uZmlnID0gcHJvcHM7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfYmluZChzY29wZTogQ29uc3RydWN0KTogQ2ZuT3JpZ2luRW5kcG9pbnQuRW5jcnlwdGlvblByb3BlcnR5IHtcbiAgICBjb25zdCBwID0gdGhpcy5jb25maWc7XG4gICAgaWYgKHAuY29uc3RhbnRJbml0aWFsaXphdGlvblZlY3RvciAmJiBwLmNvbnN0YW50SW5pdGlhbGl6YXRpb25WZWN0b3IubGVuZ3RoICE9PSAzMikge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgQ29uc3RhbnRJbml0VmVjdG9yTGVuZ3RoYCwgJ0NvbnN0YW50IEluaXRpYWxpemF0aW9uIFZlY3RvciBuZWVkcyB0byBiZSAzMiBjaGFyYWN0ZXJzIGluIGxlbmd0aC4nLCBzY29wZSk7XG4gICAgfVxuICAgIGlmIChwLmtleVJvdGF0aW9uSW50ZXJ2YWwgJiYgKHAua2V5Um90YXRpb25JbnRlcnZhbC50b1NlY29uZHMoKSA8IDMwMCB8fCBwLmtleVJvdGF0aW9uSW50ZXJ2YWwudG9TZWNvbmRzKCkgPiAzMTUzNjAwMCkpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YEtleVJvdGF0aW9uSW50ZXJ2YWxSYW5nZWAsICdLZXkgUm90YXRpb24gSW50ZXJ2YWwgbmVlZHMgdG8gYmUgYmV0d2VlbiAzMDAtMzE1MzYwMDAgc2Vjb25kcy4nLCBzY29wZSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjbWFmRXhjbHVkZVNlZ21lbnREcm1NZXRhZGF0YTogcC5leGNsdWRlU2VnbWVudERybU1ldGFkYXRhLFxuICAgICAgY29uc3RhbnRJbml0aWFsaXphdGlvblZlY3RvcjogcC5jb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yLFxuICAgICAga2V5Um90YXRpb25JbnRlcnZhbFNlY29uZHM6IHAua2V5Um90YXRpb25JbnRlcnZhbD8udG9TZWNvbmRzKCksXG4gICAgICBlbmNyeXB0aW9uTWV0aG9kOiB7IGNtYWZFbmNyeXB0aW9uTWV0aG9kOiBwLm1ldGhvZCB9LFxuICAgICAgc3Bla2VLZXlQcm92aWRlcjoge1xuICAgICAgICBjZXJ0aWZpY2F0ZUFybjogcC5jZXJ0aWZpY2F0ZT8uY2VydGlmaWNhdGVBcm4sXG4gICAgICAgIGRybVN5c3RlbXM6IHAuZHJtU3lzdGVtcyxcbiAgICAgICAgZW5jcnlwdGlvbkNvbnRyYWN0Q29uZmlndXJhdGlvbjoge1xuICAgICAgICAgIHByZXNldFNwZWtlMjBBdWRpbzogcC5hdWRpb1ByZXNldCA/PyBQcmVzZXRTcGVrZTIwQXVkaW8uUFJFU0VUX0FVRElPXzEsXG4gICAgICAgICAgcHJlc2V0U3Bla2UyMFZpZGVvOiBwLnZpZGVvUHJlc2V0ID8/IFByZXNldFNwZWtlMjBWaWRlby5QUkVTRVRfVklERU9fMSxcbiAgICAgICAgfSxcbiAgICAgICAgdXJsOiBwLnVybCxcbiAgICAgICAgcmVzb3VyY2VJZDogcC5yZXNvdXJjZUlkLFxuICAgICAgICByb2xlQXJuOiBwLnJvbGUucm9sZUFybixcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9nZXRSb2xlKCk6IElSb2xlIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuY29uZmlnLnJvbGU7IH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfZ2V0Q2VydGlmaWNhdGUoKTogSUNlcnRpZmljYXRlIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuY29uZmlnLmNlcnRpZmljYXRlOyB9XG59XG5cbi8qKlxuICogRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIGZvciBUUyBzZWdtZW50cy5cbiAqXG4gKiBVc2UgYFRzRW5jcnlwdGlvbi5zcGVrZSgpYCB0byBjcmVhdGUgYW4gaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBUc0VuY3J5cHRpb24gZXh0ZW5kcyBFbmNyeXB0aW9uQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBTUEVLRS1iYXNlZCBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIFRTIHNlZ21lbnRzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzcGVrZShwcm9wczogVHNTcGVrZUVuY3J5cHRpb25Qcm9wcyk6IFRzRW5jcnlwdGlvbiB7XG4gICAgaWYgKCFwcm9wcy51cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBTcGVrZVVybEh0dHBzUmVxdWlyZWRgLCAnU1BFS0Uga2V5IHByb3ZpZGVyIFVSTCBtdXN0IHVzZSBIVFRQUy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUc0VuY3J5cHRpb24ocHJvcHMpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IFRzU3Bla2VFbmNyeXB0aW9uUHJvcHM7XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJvcHM6IFRzU3Bla2VFbmNyeXB0aW9uUHJvcHMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY29uZmlnID0gcHJvcHM7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfYmluZChzY29wZTogQ29uc3RydWN0KTogQ2ZuT3JpZ2luRW5kcG9pbnQuRW5jcnlwdGlvblByb3BlcnR5IHtcbiAgICBjb25zdCBwID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgZGVmYXVsdERybTogVHNEcm1TeXN0ZW1bXSA9IHAubWV0aG9kID09PSBUc0VuY3J5cHRpb25NZXRob2QuU0FNUExFX0FFU1xuICAgICAgPyBbVHNEcm1TeXN0ZW0uRkFJUlBMQVldIDogW1RzRHJtU3lzdGVtLkNMRUFSX0tFWV9BRVNfMTI4XTtcbiAgICBpZiAocC5jb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yICYmIHAuY29uc3RhbnRJbml0aWFsaXphdGlvblZlY3Rvci5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBDb25zdGFudEluaXRWZWN0b3JMZW5ndGhgLCAnQ29uc3RhbnQgSW5pdGlhbGl6YXRpb24gVmVjdG9yIG5lZWRzIHRvIGJlIDMyIGNoYXJhY3RlcnMgaW4gbGVuZ3RoLicsIHNjb3BlKTtcbiAgICB9XG4gICAgaWYgKHAua2V5Um90YXRpb25JbnRlcnZhbCAmJiAocC5rZXlSb3RhdGlvbkludGVydmFsLnRvU2Vjb25kcygpIDwgMzAwIHx8IHAua2V5Um90YXRpb25JbnRlcnZhbC50b1NlY29uZHMoKSA+IDMxNTM2MDAwKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgS2V5Um90YXRpb25JbnRlcnZhbFJhbmdlYCwgJ0tleSBSb3RhdGlvbiBJbnRlcnZhbCBuZWVkcyB0byBiZSBiZXR3ZWVuIDMwMC0zMTUzNjAwMCBzZWNvbmRzLicsIHNjb3BlKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnN0YW50SW5pdGlhbGl6YXRpb25WZWN0b3I6IHAuY29uc3RhbnRJbml0aWFsaXphdGlvblZlY3RvcixcbiAgICAgIGtleVJvdGF0aW9uSW50ZXJ2YWxTZWNvbmRzOiBwLmtleVJvdGF0aW9uSW50ZXJ2YWw/LnRvU2Vjb25kcygpLFxuICAgICAgZW5jcnlwdGlvbk1ldGhvZDogeyB0c0VuY3J5cHRpb25NZXRob2Q6IHAubWV0aG9kIH0sXG4gICAgICBzcGVrZUtleVByb3ZpZGVyOiB7XG4gICAgICAgIGNlcnRpZmljYXRlQXJuOiBwLmNlcnRpZmljYXRlPy5jZXJ0aWZpY2F0ZUFybixcbiAgICAgICAgZHJtU3lzdGVtczogKHAuZHJtU3lzdGVtcyA/PyBkZWZhdWx0RHJtKS5tYXAoZCA9PiBkLnRvU3RyaW5nKCkpLFxuICAgICAgICBlbmNyeXB0aW9uQ29udHJhY3RDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgcHJlc2V0U3Bla2UyMEF1ZGlvOiBwLmF1ZGlvUHJlc2V0ID8/IFByZXNldFNwZWtlMjBBdWRpby5QUkVTRVRfQVVESU9fMSxcbiAgICAgICAgICBwcmVzZXRTcGVrZTIwVmlkZW86IHAudmlkZW9QcmVzZXQgPz8gUHJlc2V0U3Bla2UyMFZpZGVvLlBSRVNFVF9WSURFT18xLFxuICAgICAgICB9LFxuICAgICAgICB1cmw6IHAudXJsLFxuICAgICAgICByZXNvdXJjZUlkOiBwLnJlc291cmNlSWQsXG4gICAgICAgIHJvbGVBcm46IHAucm9sZS5yb2xlQXJuLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2dldFJvbGUoKTogSVJvbGUgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5jb25maWcucm9sZTsgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9nZXRDZXJ0aWZpY2F0ZSgpOiBJQ2VydGlmaWNhdGUgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5jb25maWcuY2VydGlmaWNhdGU7IH1cbn1cblxuLyoqXG4gKiBFbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIElTTSAoTWljcm9zb2Z0IFNtb290aCBTdHJlYW1pbmcpIHNlZ21lbnRzLlxuICpcbiAqIElTTSBvbmx5IHN1cHBvcnRzIENFTkMgZW5jcnlwdGlvbiB3aXRoIFBsYXlSZWFkeSBEUk0uXG4gKiBBdWRpbyBhbmQgdmlkZW8gcHJlc2V0cyBhcmUgYWx3YXlzIFNIQVJFRC5cbiAqXG4gKiBVc2UgYElzbUVuY3J5cHRpb24uc3Bla2UoKWAgdG8gY3JlYXRlIGFuIGluc3RhbmNlLlxuICovXG5leHBvcnQgY2xhc3MgSXNtRW5jcnlwdGlvbiBleHRlbmRzIEVuY3J5cHRpb25Db25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIFNQRUtFLWJhc2VkIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgSVNNIHNlZ21lbnRzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzcGVrZShwcm9wczogSXNtU3Bla2VFbmNyeXB0aW9uUHJvcHMpOiBJc21FbmNyeXB0aW9uIHtcbiAgICBpZiAoIXByb3BzLnVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YFNwZWtlVXJsSHR0cHNSZXF1aXJlZGAsICdTUEVLRSBrZXkgcHJvdmlkZXIgVVJMIG11c3QgdXNlIEhUVFBTLicpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IElzbUVuY3J5cHRpb24ocHJvcHMpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IElzbVNwZWtlRW5jcnlwdGlvblByb3BzO1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByb3BzOiBJc21TcGVrZUVuY3J5cHRpb25Qcm9wcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25maWcgPSBwcm9wcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9iaW5kKF9zY29wZTogQ29uc3RydWN0KTogQ2ZuT3JpZ2luRW5kcG9pbnQuRW5jcnlwdGlvblByb3BlcnR5IHtcbiAgICBjb25zdCBwID0gdGhpcy5jb25maWc7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuY3J5cHRpb25NZXRob2Q6IHsgaXNtRW5jcnlwdGlvbk1ldGhvZDogJ0NFTkMnIH0sXG4gICAgICBzcGVrZUtleVByb3ZpZGVyOiB7XG4gICAgICAgIGNlcnRpZmljYXRlQXJuOiBwLmNlcnRpZmljYXRlPy5jZXJ0aWZpY2F0ZUFybixcbiAgICAgICAgZHJtU3lzdGVtczogKHAuZHJtU3lzdGVtcyA/PyBbSXNtRHJtU3lzdGVtLlBMQVlSRUFEWV0pLm1hcChkID0+IGQudG9TdHJpbmcoKSksXG4gICAgICAgIGVuY3J5cHRpb25Db250cmFjdENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBwcmVzZXRTcGVrZTIwQXVkaW86IFByZXNldFNwZWtlMjBBdWRpby5TSEFSRUQsXG4gICAgICAgICAgcHJlc2V0U3Bla2UyMFZpZGVvOiBQcmVzZXRTcGVrZTIwVmlkZW8uU0hBUkVELFxuICAgICAgICB9LFxuICAgICAgICB1cmw6IHAudXJsLFxuICAgICAgICByZXNvdXJjZUlkOiBwLnJlc291cmNlSWQsXG4gICAgICAgIHJvbGVBcm46IHAucm9sZS5yb2xlQXJuLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2dldFJvbGUoKTogSVJvbGUgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5jb25maWcucm9sZTsgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9nZXRDZXJ0aWZpY2F0ZSgpOiBJQ2VydGlmaWNhdGUgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5jb25maWcuY2VydGlmaWNhdGU7IH1cbn1cblxuLyoqXG4gKiBUaGUgc2VnbWVudCBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcgdGhlIHNlZ21lbnQgbmFtZSwgZHVyYXRpb24sIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWdtZW50Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVyIHR5cGUgZm9yIHRoaXMgc2VnbWVudCAoVFMgb3IgQ01BRilcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lclR5cGU6IENvbnRhaW5lclR5cGU7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzZWdtZW50IGluY2x1ZGVzIEktZnJhbWUtb25seSBzdHJlYW1zLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWQgLSBOb3Qgc3BlY2lmaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZUlmcmFtZU9ubHlTdHJlYW1zPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBTQ1RFLTM1IGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWdtZW50LlxuICAgKlxuICAgKiBUaGUgU0NURS0zNSBtZXNzYWdlIHR5cGVzIHRoYXQgeW91IHdhbnQgdG8gYmUgdHJlYXRlZCBhcyBhZCBtYXJrZXJzIGluIHRoZSBvdXRwdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gU0NURSBmaWx0ZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHNjdGVGaWx0ZXI/OiBTY3RlTWVzc2FnZVR5cGVbXTtcbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgU0NURS0zNSBtZXNzYWdlcyBhcmUgaW5jbHVkZWQgaW4gc2VnbWVudCBmaWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBTQ1RFLTM1IG1lc3NhZ2VzIGFyZSBub3QgaW5jbHVkZWQgaW4gc2VnbWVudHNcbiAgICovXG4gIHJlYWRvbmx5IHNjdGVJblNlZ21lbnRzPzogU2N0ZUluU2VnbWVudHM7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIHNlZ21lbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCA2XG4gICAqL1xuICByZWFkb25seSBzZWdtZW50RHVyYXRpb24/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzZWdtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBzZWdtZW50XG4gICAqL1xuICByZWFkb25seSBzZWdtZW50TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNlZ21lbnQgaW5jbHVkZXMgRFZCIHN1YnRpdGxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHRzSW5jbHVkZUR2YlN1YnRpdGxlcz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzZWdtZW50IGlzIGFuIGF1ZGlvIHJlbmRpdGlvbiBncm91cC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHRzVXNlQXVkaW9SZW5kaXRpb25Hcm91cD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzZWdtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGVuY3J5cHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb24/OiBFbmNyeXB0aW9uQ29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBCYXNlIHByb3BlcnRpZXMgY29tbW9uIHRvIGFsbCBzZWdtZW50IGNvbmZpZ3VyYXRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlZ21lbnRQcm9wc0Jhc2Uge1xuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIEktZnJhbWUtb25seSBzdHJlYW1zLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZUlmcmFtZU9ubHlTdHJlYW1zPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRHVyYXRpb24gb2YgZWFjaCBzZWdtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5zZWNvbmRzKDYpXG4gICAqL1xuICByZWFkb25seSBkdXJhdGlvbj86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBzZWdtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAnc2VnbWVudCdcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgVFMgKFRyYW5zcG9ydCBTdHJlYW0pIHNlZ21lbnQgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUc1NlZ21lbnRQcm9wcyBleHRlbmRzIFNlZ21lbnRQcm9wc0Jhc2Uge1xuICAvKipcbiAgICogU0NURS0zNSBtZXNzYWdlIHR5cGVzIHRvIHRyZWF0IGFzIGFkIG1hcmtlcnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZmlsdGVyaW5nXG4gICAqL1xuICByZWFkb25seSBzY3RlRmlsdGVyPzogU2N0ZU1lc3NhZ2VUeXBlW107XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgU0NURS0zNSBtZXNzYWdlcyBhcmUgaW5jbHVkZWQgaW4gc2VnbWVudCBmaWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBTQ1RFLTM1IG1lc3NhZ2VzIGFyZSBub3QgaW5jbHVkZWQgaW4gc2VnbWVudHNcbiAgICovXG4gIHJlYWRvbmx5IHNjdGVJblNlZ21lbnRzPzogU2N0ZUluU2VnbWVudHM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSBEVkIgc3VidGl0bGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZUR2YlN1YnRpdGxlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXNlIGF1ZGlvIHJlbmRpdGlvbiBncm91cHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB1c2VBdWRpb1JlbmRpdGlvbkdyb3VwPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGUgVFMgc2VnbWVudC5cbiAgICpcbiAgICogVXNlIGBUc0VuY3J5cHRpb24uc3Bla2UoKWAgdG8gY3JlYXRlIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGVuY3J5cHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb24/OiBUc0VuY3J5cHRpb247XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgQ01BRiBzZWdtZW50IGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ21hZlNlZ21lbnRQcm9wcyBleHRlbmRzIFNlZ21lbnRQcm9wc0Jhc2Uge1xuICAvKipcbiAgICogU0NURS0zNSBtZXNzYWdlIHR5cGVzIHRvIHRyZWF0IGFzIGFkIG1hcmtlcnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZmlsdGVyaW5nXG4gICAqL1xuICByZWFkb25seSBzY3RlRmlsdGVyPzogU2N0ZU1lc3NhZ2VUeXBlW107XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgU0NURS0zNSBtZXNzYWdlcyBhcmUgaW5jbHVkZWQgaW4gc2VnbWVudCBmaWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBTQ1RFLTM1IG1lc3NhZ2VzIGFyZSBub3QgaW5jbHVkZWQgaW4gc2VnbWVudHNcbiAgICovXG4gIHJlYWRvbmx5IHNjdGVJblNlZ21lbnRzPzogU2N0ZUluU2VnbWVudHM7XG5cbiAgLyoqXG4gICAqIEVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIENNQUYgc2VnbWVudC5cbiAgICpcbiAgICogVXNlIGBDbWFmRW5jcnlwdGlvbi5zcGVrZSgpYCB0byBjcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbj86IENtYWZFbmNyeXB0aW9uO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIElTTSAoTWljcm9zb2Z0IFNtb290aCBTdHJlYW1pbmcpIHNlZ21lbnQgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc21TZWdtZW50UHJvcHMgZXh0ZW5kcyBTZWdtZW50UHJvcHNCYXNlIHtcbiAgLyoqXG4gICAqIEVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIElTTSBzZWdtZW50LlxuICAgKlxuICAgKiBVc2UgYElzbUVuY3J5cHRpb24uc3Bla2UoKWAgdG8gY3JlYXRlIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGVuY3J5cHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb24/OiBJc21FbmNyeXB0aW9uO1xufVxuXG4vKipcbiAqIEhlbHBlciBjbGFzcyBmb3IgY3JlYXRpbmcgc2VnbWVudCBjb25maWd1cmF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlZ21lbnQge1xuICAvKipcbiAgICogQ3JlYXRlIGEgVFMgKFRyYW5zcG9ydCBTdHJlYW0pIHNlZ21lbnQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogVXNlIHRoaXMgZm9yIGVuZHBvaW50cyB3aXRoIENvbnRhaW5lclR5cGUuVFMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRzKHByb3BzOiBUc1NlZ21lbnRQcm9wcyA9IHt9KTogU2VnbWVudENvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBjb250YWluZXJUeXBlOiBDb250YWluZXJUeXBlLlRTLFxuICAgICAgaW5jbHVkZUlmcmFtZU9ubHlTdHJlYW1zOiBwcm9wcy5pbmNsdWRlSWZyYW1lT25seVN0cmVhbXMsXG4gICAgICBzY3RlRmlsdGVyOiBwcm9wcy5zY3RlRmlsdGVyLFxuICAgICAgc2N0ZUluU2VnbWVudHM6IHByb3BzLnNjdGVJblNlZ21lbnRzLFxuICAgICAgc2VnbWVudER1cmF0aW9uOiBwcm9wcy5kdXJhdGlvbixcbiAgICAgIHNlZ21lbnROYW1lOiBwcm9wcy5uYW1lLFxuICAgICAgdHNJbmNsdWRlRHZiU3VidGl0bGVzOiBwcm9wcy5pbmNsdWRlRHZiU3VidGl0bGVzLFxuICAgICAgdHNVc2VBdWRpb1JlbmRpdGlvbkdyb3VwOiBwcm9wcy51c2VBdWRpb1JlbmRpdGlvbkdyb3VwLFxuICAgICAgZW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENNQUYgc2VnbWVudCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBVc2UgdGhpcyBmb3IgZW5kcG9pbnRzIHdpdGggQ29udGFpbmVyVHlwZS5DTUFGLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjbWFmKHByb3BzOiBDbWFmU2VnbWVudFByb3BzID0ge30pOiBTZWdtZW50Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRhaW5lclR5cGU6IENvbnRhaW5lclR5cGUuQ01BRixcbiAgICAgIGluY2x1ZGVJZnJhbWVPbmx5U3RyZWFtczogcHJvcHMuaW5jbHVkZUlmcmFtZU9ubHlTdHJlYW1zLFxuICAgICAgc2N0ZUZpbHRlcjogcHJvcHMuc2N0ZUZpbHRlcixcbiAgICAgIHNjdGVJblNlZ21lbnRzOiBwcm9wcy5zY3RlSW5TZWdtZW50cyxcbiAgICAgIHNlZ21lbnREdXJhdGlvbjogcHJvcHMuZHVyYXRpb24sXG4gICAgICBzZWdtZW50TmFtZTogcHJvcHMubmFtZSxcbiAgICAgIGVuY3J5cHRpb246IHByb3BzLmVuY3J5cHRpb24sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gSVNNIChNaWNyb3NvZnQgU21vb3RoIFN0cmVhbWluZykgc2VnbWVudCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBVc2UgdGhpcyBmb3IgZW5kcG9pbnRzIHdpdGggQ29udGFpbmVyVHlwZS5JU00uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzbShwcm9wczogSXNtU2VnbWVudFByb3BzID0ge30pOiBTZWdtZW50Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRhaW5lclR5cGU6IENvbnRhaW5lclR5cGUuSVNNLFxuICAgICAgaW5jbHVkZUlmcmFtZU9ubHlTdHJlYW1zOiBwcm9wcy5pbmNsdWRlSWZyYW1lT25seVN0cmVhbXMsXG4gICAgICBzZWdtZW50RHVyYXRpb246IHByb3BzLmR1cmF0aW9uLFxuICAgICAgc2VnbWVudE5hbWU6IHByb3BzLm5hbWUsXG4gICAgICBlbmNyeXB0aW9uOiBwcm9wcy5lbmNyeXB0aW9uLFxuICAgIH07XG4gIH1cbn1cblxuYWJzdHJhY3QgY2xhc3MgT3JpZ2luRW5kcG9pbnRCYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJT3JpZ2luRW5kcG9pbnQge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBPcmlnaW5FbmRwb2ludCBjb25zdHJ1Y3QgdGhhdCByZXByZXNlbnRzIGFuIGV4dGVybmFsIChpbXBvcnRlZCkgT3JpZ2luIEVuZHBvaW50IGZyb20gaXRzIEFSTi5cbiAgICpcbiAgICogVGhlIEFSTiBpcyBleHBlY3RlZCB0byBiZSBpbiB0aGUgZm9ybWF0OlxuICAgKiBgYXJuOjxwYXJ0aXRpb24+Om1lZGlhcGFja2FnZXYyOjxyZWdpb24+OjxhY2NvdW50PjpjaGFubmVsR3JvdXAvPGdyb3VwTmFtZT4vY2hhbm5lbC88Y2hhbm5lbE5hbWU+L29yaWdpbkVuZHBvaW50LzxlbmRwb2ludE5hbWU+YFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tT3JpZ2luRW5kcG9pbnRBcm4oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgb3JpZ2luRW5kcG9pbnRBcm46IHN0cmluZyk6IElPcmlnaW5FbmRwb2ludCB7XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChvcmlnaW5FbmRwb2ludEFybikpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBUb2tlbkFybk5vdFN1cHBvcnRlZGAsXG4gICAgICAgICdDYW5ub3QgcGFyc2UgYSB0b2tlbiBBUk4uIFVzZSBPcmlnaW5FbmRwb2ludC5mcm9tT3JpZ2luRW5kcG9pbnRBdHRyaWJ1dGVzKCkgd2l0aCBleHBsaWNpdCBjaGFubmVsR3JvdXBOYW1lLCBjaGFubmVsTmFtZSwgb3JpZ2luRW5kcG9pbnROYW1lLCBhbmQgcmVnaW9uIHZhbHVlcyBpbnN0ZWFkLicsXG4gICAgICAgIHNjb3BlLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkQXJuID0gU3RhY2sub2Yoc2NvcGUpLnNwbGl0QXJuKG9yaWdpbkVuZHBvaW50QXJuLCBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSk7XG4gICAgLy8gcmVzb3VyY2VOYW1lIGlzIFwiPGdyb3VwTmFtZT4vY2hhbm5lbC88Y2hhbm5lbE5hbWU+L29yaWdpbkVuZHBvaW50LzxlbmRwb2ludE5hbWU+XCJcbiAgICBjb25zdCBbY2hhbm5lbEdyb3VwTmFtZSwgLCBjaGFubmVsTmFtZSwgLCBvcmlnaW5FbmRwb2ludE5hbWVdID0gcGFyc2VkQXJuLnJlc291cmNlTmFtZT8uc3BsaXQoJy8nKSA/PyBbXTtcbiAgICBpZiAoIWNoYW5uZWxHcm91cE5hbWUgfHwgIWNoYW5uZWxOYW1lIHx8ICFvcmlnaW5FbmRwb2ludE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBJbnZhbGlkT3JpZ2luRW5kcG9pbnRBcm5gLFxuICAgICAgICBgQ291bGQgbm90IHBhcnNlIG9yaWdpbiBlbmRwb2ludCBBUk46ICR7b3JpZ2luRW5kcG9pbnRBcm59LiBFeHBlY3RlZCBmb3JtYXQ6IGFybjo8cGFydGl0aW9uPjptZWRpYXBhY2thZ2V2Mjo8cmVnaW9uPjo8YWNjb3VudD46Y2hhbm5lbEdyb3VwLzxncm91cE5hbWU+L2NoYW5uZWwvPGNoYW5uZWxOYW1lPi9vcmlnaW5FbmRwb2ludC88ZW5kcG9pbnROYW1lPmAsXG4gICAgICAgIHNjb3BlLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIE9yaWdpbkVuZHBvaW50QmFzZS5mcm9tT3JpZ2luRW5kcG9pbnRBdHRyaWJ1dGVzKHNjb3BlLCBpZCwge1xuICAgICAgY2hhbm5lbEdyb3VwTmFtZSxcbiAgICAgIGNoYW5uZWxOYW1lLFxuICAgICAgb3JpZ2luRW5kcG9pbnROYW1lLFxuICAgICAgcmVnaW9uOiBwYXJzZWRBcm4ucmVnaW9uLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gT3JpZ2luRW5kcG9pbnQgY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCAoaW1wb3J0ZWQpIE9yaWdpbiBFbmRwb2ludC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbU9yaWdpbkVuZHBvaW50QXR0cmlidXRlcyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogT3JpZ2luRW5kcG9pbnRBdHRyaWJ1dGVzKTogSU9yaWdpbkVuZHBvaW50IHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBPcmlnaW5FbmRwb2ludEJhc2UgaW1wbGVtZW50cyBJT3JpZ2luRW5kcG9pbnQge1xuICAgICAgcHJvdGVjdGVkIGhsc01hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuSGxzTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXSA9IFtdO1xuICAgICAgcHJvdGVjdGVkIGxsSGxzTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5Mb3dMYXRlbmN5SGxzTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXSA9IFtdO1xuICAgICAgcHJvdGVjdGVkIGRhc2hNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50LkRhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdID0gW107XG4gICAgICBwcm90ZWN0ZWQgbXNzTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5Nc3NNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdID0gW107XG4gICAgICBwcm90ZWN0ZWQgc2VnbWVudD86IFNlZ21lbnRDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHBvbGljeSA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBjaGFubmVsR3JvdXBOYW1lID0gYXR0cnMuY2hhbm5lbEdyb3VwTmFtZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBjaGFubmVsTmFtZSA9IGF0dHJzLmNoYW5uZWxOYW1lO1xuICAgICAgcHVibGljIHJlYWRvbmx5IG9yaWdpbkVuZHBvaW50TmFtZSA9IGF0dHJzLm9yaWdpbkVuZHBvaW50TmFtZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgbW9kaWZpZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBobHNNYW5pZmVzdFVybHMgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgbG93TGF0ZW5jeUhsc01hbmlmZXN0VXJscyA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBkYXNoTWFuaWZlc3RVcmxzID0gdW5kZWZpbmVkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IG1zc01hbmlmZXN0VXJscyA9IHVuZGVmaW5lZDtcbiAgICAgIHByb3RlY3RlZCBhdXRvQ3JlYXRlUG9saWN5ID0gZmFsc2U7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgb3JpZ2luRW5kcG9pbnRBcm4gPSBTdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgICBzZXJ2aWNlOiAnbWVkaWFwYWNrYWdldjInLFxuICAgICAgICByZXNvdXJjZTogYGNoYW5uZWxHcm91cC8ke2F0dHJzLmNoYW5uZWxHcm91cE5hbWV9L2NoYW5uZWwvJHt0aGlzLmNoYW5uZWxOYW1lfS9vcmlnaW5FbmRwb2ludGAsXG4gICAgICAgIGFybkZvcm1hdDogQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgICAgIHJlc291cmNlTmFtZTogdGhpcy5vcmlnaW5FbmRwb2ludE5hbWUsXG4gICAgICAgIHJlZ2lvbjogYXR0cnMucmVnaW9uLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjaGFubmVsR3JvdXBOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjaGFubmVsTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgb3JpZ2luRW5kcG9pbnROYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBvcmlnaW5FbmRwb2ludEFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgbW9kaWZpZWRBdD86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGhsc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgbG93TGF0ZW5jeUhsc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZGFzaE1hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgbXNzTWFuaWZlc3RVcmxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIHRvIHRoaXMgT3JpZ2luIEVuZHBvaW50IHJlc291cmNlLlxuICAgKiBSZXF1aXJlZCBieSB0aGUgYXV0by1nZW5lcmF0ZWQgSU9yaWdpbkVuZHBvaW50UmVmIGludGVyZmFjZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgb3JpZ2luRW5kcG9pbnRSZWYoKTogT3JpZ2luRW5kcG9pbnRSZWZlcmVuY2Uge1xuICAgIHJldHVybiB7XG4gICAgICBvcmlnaW5FbmRwb2ludEFybjogdGhpcy5vcmlnaW5FbmRwb2ludEFybixcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGhsc01hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuSGxzTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXTtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGxsSGxzTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5Mb3dMYXRlbmN5SGxzTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXTtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGRhc2hNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50LkRhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgbXNzTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5Nc3NNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2VnbWVudD86IFNlZ21lbnRDb25maWd1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIHJlc291cmNlIHBvbGljeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIElmIGBhdXRvQ3JlYXRlUG9saWN5YCBpcyB0cnVlLCBhbiBgT3JpZ2luRW5kcG9pbnRQb2xpY3lgIHdpbGwgYmUgY3JlYXRlZCB1cG9uIHRoZVxuICAgKiBmaXJzdCBjYWxsIHRvIGFkZFRvUmVzb3VyY2VQb2xpY3kocykuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcG9saWN5PzogT3JpZ2luRW5kcG9pbnRQb2xpY3k7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBhbiBvcmlnaW4gZW5kcG9pbnQgcmVzb3VyY2UgcG9saWN5IHNob3VsZCBhdXRvbWF0aWNhbGx5IGJlIGNyZWF0ZWQgdXBvblxuICAgKiB0aGUgZmlyc3QgY2FsbCB0byBgYWRkVG9SZXNvdXJjZVBvbGljeWAuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYXV0b0NyZWF0ZVBvbGljeTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ0ROIGF1dGhvcml6YXRpb24gY29uZmlndXJhdGlvbiB0byBiZSBhcHBsaWVkIHdoZW4gdGhlIHBvbGljeSBpcyBjcmVhdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjZG5BdXRoQ29uZmlnPzogQ2RuQXV0aENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFNldCBDRE4gYXV0aCBjb25maWcuIFVzZWQgYnkgc3ViY2xhc3MgY29uc3RydWN0b3JzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfc2V0Q2RuQXV0aChjZG5BdXRoOiBDZG5BdXRoQ29uZmlndXJhdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jZG5BdXRoQ29uZmlnKSB7XG4gICAgICB0aGlzLmNkbkF1dGhDb25maWcgPSBjZG5BdXRoO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgb3JpZ2luIGVuZHBvaW50IHBvbGljeS5cbiAgICpcbiAgICogWW91IGNhbiBvbmx5IGFkZCAxIE9yaWdpbkVuZHBvaW50UG9saWN5IHRvIGFuIE9yaWdpbkVuZHBvaW50LlxuICAgKiBJZiB5b3UgaGF2ZSBhbHJlYWR5IGRlZmluZWQgb25lLCBpdCB3aWxsIGFwcGVuZCB0byB0aGUgcG9saWN5IGFscmVhZHkgY3JlYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlbWVudCAtIFRoZSBwb2xpY3kgc3RhdGVtZW50IHRvIGFkZFxuICAgKiBAcGFyYW0gY2RuQXV0aCAtIE9wdGlvbmFsIENETiBhdXRob3JpemF0aW9uIGNvbmZpZ3VyYXRpb24uIElmIHByb3ZpZGVkLCB0aGUgcG9saWN5IHdpbGwgYmVcbiAgICogICAgICAgICAgICAgICAgICBjcmVhdGVkIHdpdGggQ0ROIGF1dGhlbnRpY2F0aW9uIGVuYWJsZWQgdXNpbmcgc2VjcmV0cyBmcm9tIEFXUyBTZWNyZXRzIE1hbmFnZXIuXG4gICAqICAgICAgICAgICAgICAgICAgSWYgY2RuQXV0aCBpcyBwcm92aWRlZCBtdWx0aXBsZSB0aW1lcywgb25seSB0aGUgZmlyc3QgY29uZmlndXJhdGlvbiBpcyB1c2VkLlxuICAgKi9cbiAgcHVibGljIGFkZFRvUmVzb3VyY2VQb2xpY3koc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQsIGNkbkF1dGg/OiBDZG5BdXRoQ29uZmlndXJhdGlvbik6IEFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQge1xuICAgIC8vIFN0b3JlIENETiBhdXRoIGNvbmZpZyBpZiBwcm92aWRlZCAob25seSBpZiBub3QgYWxyZWFkeSBzZXQpXG4gICAgaWYgKGNkbkF1dGggJiYgIXRoaXMuY2RuQXV0aENvbmZpZykge1xuICAgICAgdGhpcy5jZG5BdXRoQ29uZmlnID0gY2RuQXV0aDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucG9saWN5ICYmIHRoaXMuYXV0b0NyZWF0ZVBvbGljeSkge1xuICAgICAgdGhpcy5wb2xpY3kgPSBuZXcgT3JpZ2luRW5kcG9pbnRQb2xpY3kodGhpcywgJ1BvbGljeScsIHtcbiAgICAgICAgb3JpZ2luRW5kcG9pbnQ6IHRoaXMsXG4gICAgICAgIGNkbkF1dGg6IHRoaXMuY2RuQXV0aENvbmZpZyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBvbGljeSkge1xuICAgICAgdGhpcy5wb2xpY3kuZG9jdW1lbnQuYWRkU3RhdGVtZW50cyhzdGF0ZW1lbnQpO1xuICAgICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IHRydWUsIHBvbGljeURlcGVuZGFibGU6IHRoaXMucG9saWN5IH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IGZhbHNlIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW5kIG1vZGlmeSBTZWdtZW50IGNvbmZpZ3VyYXRpb24gZm9yIGVuZHBvaW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNlZ21lbnRWYWxpZGF0aW9uKHNlZ21lbnRDb250YWluZXJUeXBlOiBDb250YWluZXJUeXBlLCBzZWdtZW50PzogU2VnbWVudENvbmZpZ3VyYXRpb24pOiBDZm5PcmlnaW5FbmRwb2ludC5TZWdtZW50UHJvcGVydHkgfCB1bmRlZmluZWQge1xuICAgIGlmIChzZWdtZW50Py5zZWdtZW50RHVyYXRpb24gJiYgKHNlZ21lbnQuc2VnbWVudER1cmF0aW9uPy50b1NlY29uZHMoKSA8IDEgfHwgc2VnbWVudC5zZWdtZW50RHVyYXRpb24/LnRvU2Vjb25kcygpID4gMzApKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBTZWdtZW50RHVyYXRpb25SYW5nZWAsICdTZWdtZW50IER1cmF0aW9uIG5lZWRzIHRvIGJlIGJldHdlZW4gMS0zMCBzZWNvbmRzLicsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChzZWdtZW50Q29udGFpbmVyVHlwZSAhPSBDb250YWluZXJUeXBlLlRTICYmIChzZWdtZW50Py50c0luY2x1ZGVEdmJTdWJ0aXRsZXMgfHwgc2VnbWVudD8udHNVc2VBdWRpb1JlbmRpdGlvbkdyb3VwKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgVHNPcHRpb25zSW5jb21wYXRpYmxlYCwgJ0Rpc2FibGUgVFMgU2VnbWVudCBvcHRpb25zIGZvciBEdmJTdWJ0aXRsZXMgYW5kIEF1ZGlvUmVuZGl0aW9uR3JvdXBzIHdoZW4gdXNpbmcgQ01BRi4nLCB0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW5jbHVkZUlmcmFtZU9ubHlTdHJlYW1zOiBzZWdtZW50Py5pbmNsdWRlSWZyYW1lT25seVN0cmVhbXMsXG4gICAgICBzZWdtZW50RHVyYXRpb25TZWNvbmRzOiBzZWdtZW50Py5zZWdtZW50RHVyYXRpb24/LnRvU2Vjb25kcygpLFxuICAgICAgc2VnbWVudE5hbWU6IHNlZ21lbnQ/LnNlZ21lbnROYW1lLFxuICAgICAgdHNJbmNsdWRlRHZiU3VidGl0bGVzOiBzZWdtZW50Py50c0luY2x1ZGVEdmJTdWJ0aXRsZXMsXG4gICAgICB0c1VzZUF1ZGlvUmVuZGl0aW9uR3JvdXA6IHNlZ21lbnQ/LnRzVXNlQXVkaW9SZW5kaXRpb25Hcm91cCxcbiAgICAgIHNjdGU6IChzZWdtZW50Py5zY3RlRmlsdGVyIHx8IHNlZ21lbnQ/LnNjdGVJblNlZ21lbnRzKSA/IHtcbiAgICAgICAgc2N0ZUZpbHRlcjogc2VnbWVudD8uc2N0ZUZpbHRlcixcbiAgICAgICAgc2N0ZUluU2VnbWVudHM6IHNlZ21lbnQ/LnNjdGVJblNlZ21lbnRzLFxuICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgIGVuY3J5cHRpb246IHNlZ21lbnQ/LmVuY3J5cHRpb24/Ll9iaW5kKHRoaXMpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBtZXRyaWMuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRyaWNOYW1lIG5hbWUgb2YgdGhlIG1ldHJpYy5cbiAgICogQHBhcmFtIHByb3BzIG1ldHJpYyBvcHRpb25zLlxuICAgKi9cbiAgcHVibGljIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIG5hbWVzcGFjZTogJ0FXUy9NZWRpYVBhY2thZ2UnLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBDaGFubmVsR3JvdXA6IHRoaXMuY2hhbm5lbEdyb3VwTmFtZSxcbiAgICAgICAgQ2hhbm5lbDogdGhpcy5jaGFubmVsTmFtZSxcbiAgICAgICAgT3JpZ2luRW5kcG9pbnQ6IHRoaXMub3JpZ2luRW5kcG9pbnROYW1lLFxuICAgICAgfSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pLmF0dGFjaFRvKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgTWV0cmljIGZvciBJbmdyZXNzIEJ5dGVzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY0luZ3Jlc3NCeXRlcyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnSW5ncmVzc0J5dGVzJywge1xuICAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0LkJZVEVTLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBNZXRyaWMgZm9yIEVncmVzcyBCeXRlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNFZ3Jlc3NCeXRlcyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnRWdyZXNzQnl0ZXMnLCB7XG4gICAgICBzdGF0aXN0aWM6ICdzdW0nLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuQllURVMsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIE1ldHJpYyBmb3IgSW5ncmVzcyByZXNwb25zZSB0aW1lXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXZlcmFnZSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNJbmdyZXNzUmVzcG9uc2VUaW1lKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdJbmdyZXNzUmVzcG9uc2VUaW1lJywge1xuICAgICAgc3RhdGlzdGljOiAnYXZnJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0Lk1JTExJU0VDT05EUyxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgTWV0cmljIGZvciBFZ3Jlc3MgUmVzcG9uc2UgdGltZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGF2ZXJhZ2Ugb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljRWdyZXNzUmVzcG9uc2VUaW1lKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdFZ3Jlc3NSZXNwb25zZVRpbWUnLCB7XG4gICAgICBzdGF0aXN0aWM6ICdhdmcnLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuTUlMTElTRUNPTkRTLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBNZXRyaWMgZm9yIEVncmVzcyBSZXF1ZXN0IENvdW50XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY0VncmVzc1JlcXVlc3RDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnRWdyZXNzUmVxdWVzdENvdW50Jywge1xuICAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBNZXRyaWMgZm9yIEluZ3Jlc3MgUmVxdWVzdCBDb3VudFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNJbmdyZXNzUmVxdWVzdENvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdJbmdyZXNzUmVxdWVzdENvdW50Jywge1xuICAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIGFuIEFXUyBFbGVtZW50YWwgTWVkaWFQYWNrYWdlIFYyIE9yaWdpbiBFbmRwb2ludFxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgT3JpZ2luRW5kcG9pbnQgZXh0ZW5kcyBPcmlnaW5FbmRwb2ludEJhc2UgaW1wbGVtZW50cyBJT3JpZ2luRW5kcG9pbnQge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1tZWRpYXBhY2thZ2V2Mi1hbHBoYS5PcmlnaW5FbmRwb2ludCc7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxHcm91cE5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBvcmlnaW5FbmRwb2ludE5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG9yaWdpbkVuZHBvaW50QXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGNyZWF0aW9uIG9mIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtb2RpZmllZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBcnJheSBjb250YWluaW5nIExvdyBMYXRlbmN5IEhMUyBNYW5pZmVzdHMgY3JlYXRlZCBieSB0aGUgT3JpZ2luRW5kcG9pbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG93TGF0ZW5jeUhsc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBcnJheSBjb250YWluaW5nIEhMUyBNYW5pZmVzdHMgY3JlYXRlZCBieSB0aGUgT3JpZ2luRW5kcG9pbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGxzTWFuaWZlc3RVcmxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEFycmF5IGNvbnRhaW5pbmcgREFTSCBNYW5pZmVzdHMgY3JlYXRlZCBieSB0aGUgT3JpZ2luRW5kcG9pbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGFzaE1hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogQXJyYXkgY29udGFpbmluZyBNU1MgTWFuaWZlc3RzIGNyZWF0ZWQgYnkgdGhlIE9yaWdpbkVuZHBvaW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1zc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogVGhlIHJlc291cmNlIHBvbGljeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIElmIGBhdXRvQ3JlYXRlUG9saWN5YCBpcyB0cnVlLCBhbiBgT3JpZ2luRW5kcG9pbnRQb2xpY3lgIHdpbGwgYmUgY3JlYXRlZCB1cG9uIHRoZVxuICAgKiBmaXJzdCBjYWxsIHRvIGFkZFRvUmVzb3VyY2VQb2xpY3kocykuXG4gICAqL1xuICBwdWJsaWMgcG9saWN5PzogT3JpZ2luRW5kcG9pbnRQb2xpY3k7XG4gIHByb3RlY3RlZCBhdXRvQ3JlYXRlUG9saWN5ID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIGhsc01hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuSGxzTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXSA9IFtdO1xuICBwcm90ZWN0ZWQgbGxIbHNNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50Lkxvd0xhdGVuY3lIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdID0gW107XG4gIHByb3RlY3RlZCBkYXNoTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5EYXNoTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXSA9IFtdO1xuICBwcm90ZWN0ZWQgbXNzTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5Nc3NNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdID0gW107XG4gIHByb3RlY3RlZCBzZWdtZW50PzogU2VnbWVudENvbmZpZ3VyYXRpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE9yaWdpbkVuZHBvaW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHM/Lm9yaWdpbkVuZHBvaW50TmFtZSA/PyBMYXp5LnN0cmluZyh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7XG4gICAgICAgICAgbWF4TGVuZ3RoOiAyNTYsXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIC8vIFZhbGlkYXRlIG9yaWdpbkVuZHBvaW50TmFtZSBpZiBwcm92aWRlZFxuICAgIGlmIChwcm9wcy5vcmlnaW5FbmRwb2ludE5hbWUgIT0gbnVsbCAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLm9yaWdpbkVuZHBvaW50TmFtZSkpIHtcbiAgICAgIGlmIChwcm9wcy5vcmlnaW5FbmRwb2ludE5hbWUubGVuZ3RoIDwgMSB8fCBwcm9wcy5vcmlnaW5FbmRwb2ludE5hbWUubGVuZ3RoID4gMjU2KSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YE9yaWdpbkVuZHBvaW50TmFtZUxlbmd0aGAsICdPcmlnaW4gZW5kcG9pbnQgbmFtZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMjU2IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLicsIHRoaXMpO1xuICAgICAgfVxuICAgICAgaWYgKCFwcm9wcy5vcmlnaW5FbmRwb2ludE5hbWUubWF0Y2goL15bYS16QS1aMC05Xy1dKyQvKSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBPcmlnaW5FbmRwb2ludE5hbWVQYXR0ZXJuYCwgJ09yaWdpbiBlbmRwb2ludCBuYW1lIG11c3Qgb25seSBjb250YWluIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXMuJywgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZGVzY3JpcHRpb24gaWYgcHJvdmlkZWRcbiAgICBpZiAocHJvcHMuZGVzY3JpcHRpb24gJiYgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5kZXNjcmlwdGlvbikgJiYgcHJvcHMuZGVzY3JpcHRpb24ubGVuZ3RoID4gMTAyNCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgT3JpZ2luRW5kcG9pbnREZXNjcmlwdGlvbkxlbmd0aGAsICdPcmlnaW4gZW5kcG9pbnQgZGVzY3JpcHRpb24gbXVzdCBub3QgZXhjZWVkIDEwMjQgY2hhcmFjdGVycy4nLCB0aGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlZ21lbnQgPSBwcm9wcy5zZWdtZW50O1xuXG4gICAgLy8gR2V0IGNvbnRhaW5lciB0eXBlIGZyb20gc2VnbWVudFxuICAgIGNvbnN0IGNvbnRhaW5lclR5cGUgPSBwcm9wcy5zZWdtZW50LmNvbnRhaW5lclR5cGU7XG5cbiAgICBpZiAocHJvcHM/LnN0YXJ0b3ZlcldpbmRvdyAmJiAocHJvcHMuc3RhcnRvdmVyV2luZG93LnRvU2Vjb25kcygpIDwgNjAgfHwgcHJvcHMuc3RhcnRvdmVyV2luZG93LnRvU2Vjb25kcygpID4gMTIwOTYwMCkpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YFN0YXJ0b3ZlcldpbmRvd1JhbmdlYCwgJ1N0YXJ0b3ZlciBXaW5kb3cgbmVlZHMgdG8gYmUgYmV0d2VlbiA2MC0xMjA5NjAwIHNlY29uZHMuJywgdGhpcyk7XG4gICAgfVxuXG4gICAgcHJvcHMubWFuaWZlc3RzLmZvckVhY2gobWFuaWZlc3QgPT4ge1xuICAgICAgbWFuaWZlc3QuX2JpbmQoe1xuICAgICAgICBobHNNYW5pZmVzdHM6IHRoaXMuaGxzTWFuaWZlc3RzLFxuICAgICAgICBsbEhsc01hbmlmZXN0czogdGhpcy5sbEhsc01hbmlmZXN0cyxcbiAgICAgICAgZGFzaE1hbmlmZXN0czogdGhpcy5kYXNoTWFuaWZlc3RzLFxuICAgICAgICBtc3NNYW5pZmVzdHM6IHRoaXMubXNzTWFuaWZlc3RzLFxuICAgICAgICBzZWdtZW50OiBwcm9wcy5zZWdtZW50LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBtYW5pZmVzdCBuYW1lIHVuaXF1ZW5lc3MgYWNyb3NzIGFsbCBtYW5pZmVzdCB0eXBlc1xuICAgIGNvbnN0IGFsbE1hbmlmZXN0TmFtZXMgPSBbXG4gICAgICAuLi50aGlzLmhsc01hbmlmZXN0cy5tYXAobSA9PiBtLm1hbmlmZXN0TmFtZSksXG4gICAgICAuLi50aGlzLmxsSGxzTWFuaWZlc3RzLm1hcChtID0+IG0ubWFuaWZlc3ROYW1lKSxcbiAgICAgIC4uLnRoaXMuZGFzaE1hbmlmZXN0cy5tYXAobSA9PiBtLm1hbmlmZXN0TmFtZSksXG4gICAgICAuLi50aGlzLm1zc01hbmlmZXN0cy5tYXAobSA9PiBtLm1hbmlmZXN0TmFtZSksXG4gICAgXS5maWx0ZXIobmFtZSA9PiAhVG9rZW4uaXNVbnJlc29sdmVkKG5hbWUpKTtcblxuICAgIGNvbnN0IGR1cGxpY2F0ZU5hbWVzID0gWy4uLm5ldyBTZXQoYWxsTWFuaWZlc3ROYW1lcy5maWx0ZXIoKG5hbWUsIGkpID0+IGFsbE1hbmlmZXN0TmFtZXMuaW5kZXhPZihuYW1lKSAhPT0gaSkpXTtcbiAgICBpZiAoZHVwbGljYXRlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YER1cGxpY2F0ZU1hbmlmZXN0TmFtZWAsXG4gICAgICAgIGBEdXBsaWNhdGUgbWFuaWZlc3QgbmFtZXM6IFske2R1cGxpY2F0ZU5hbWVzLmpvaW4oJywgJyl9XS4gRWFjaCBtYW5pZmVzdCBpbiBhbiBPcmlnaW5FbmRwb2ludCBtdXN0IGhhdmUgYSB1bmlxdWUgbWFuaWZlc3ROYW1lLmAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG1hbmlmZXN0IGFuZCBjb250YWluZXIgdHlwZSBjb21wYXRpYmlsaXR5XG4gICAgaWYgKHRoaXMubXNzTWFuaWZlc3RzLmxlbmd0aCA+IDAgJiYgY29udGFpbmVyVHlwZSAhPT0gQ29udGFpbmVyVHlwZS5JU00pIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YE1zc1JlcXVpcmVzSXNtYCwgJ01TUyBtYW5pZmVzdHMgcmVxdWlyZSBJU00gY29udGFpbmVyIHR5cGUuIFVzZSBTZWdtZW50LmlzbSgpIGZvciBNU1MgbWFuaWZlc3RzLicsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhc2hNYW5pZmVzdHMubGVuZ3RoID4gMCAmJiBjb250YWluZXJUeXBlICE9PSBDb250YWluZXJUeXBlLkNNQUYpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YERhc2hSZXF1aXJlc0NtYWZgLCAnREFTSCBtYW5pZmVzdHMgcmVxdWlyZSBDTUFGIGNvbnRhaW5lciB0eXBlLiBVc2UgU2VnbWVudC5jbWFmKCkgZm9yIERBU0ggbWFuaWZlc3RzLicsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmICgodGhpcy5obHNNYW5pZmVzdHMubGVuZ3RoID4gMCB8fCB0aGlzLmxsSGxzTWFuaWZlc3RzLmxlbmd0aCA+IDApICYmIGNvbnRhaW5lclR5cGUgPT09IENvbnRhaW5lclR5cGUuSVNNKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBIbHNJbmNvbXBhdGlibGVXaXRoSXNtYCwgJ0hMUyBhbmQgTG93IExhdGVuY3kgSExTIG1hbmlmZXN0cyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIElTTSBjb250YWluZXIgdHlwZS4gVXNlIFNlZ21lbnQuY21hZigpIG9yIFNlZ21lbnQudHMoKSBmb3IgSExTIG1hbmlmZXN0cy4nLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBEUk0gc2lnbmFsbGluZyByZXF1aXJlcyBlbmNyeXB0aW9uXG4gICAgaWYgKHRoaXMuZGFzaE1hbmlmZXN0cy5zb21lKG0gPT4gbS5kcm1TaWduYWxpbmcpICYmICFwcm9wcy5zZWdtZW50LmVuY3J5cHRpb24pIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YERybVNpZ25hbGxpbmdSZXF1aXJlc0VuY3J5cHRpb25gLCAnRFJNIHNpZ25hbGxpbmcgcmVxdWlyZXMgZW5jcnlwdGlvbiB0byBiZSBjb25maWd1cmVkIG9uIHRoZSBlbmRwb2ludC4nLCB0aGlzKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW4gPSBuZXcgQ2ZuT3JpZ2luRW5kcG9pbnQodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgY2hhbm5lbE5hbWU6IHByb3BzLmNoYW5uZWwuY2hhbm5lbE5hbWUsXG4gICAgICBjaGFubmVsR3JvdXBOYW1lOiBwcm9wcy5jaGFubmVsLmNoYW5uZWxHcm91cE5hbWUsXG4gICAgICBvcmlnaW5FbmRwb2ludE5hbWU6IHRoaXMucGh5c2ljYWxOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgdGFnczogcHJvcHM/LnRhZ3MgPyByZW5kZXJUYWdzKHByb3BzLnRhZ3MpIDogdW5kZWZpbmVkLFxuICAgICAgaGxzTWFuaWZlc3RzOiBvbWl0RW1wdHlBcnJheSh0aGlzLmhsc01hbmlmZXN0cyksXG4gICAgICBsb3dMYXRlbmN5SGxzTWFuaWZlc3RzOiBvbWl0RW1wdHlBcnJheSh0aGlzLmxsSGxzTWFuaWZlc3RzKSxcbiAgICAgIGRhc2hNYW5pZmVzdHM6IG9taXRFbXB0eUFycmF5KHRoaXMuZGFzaE1hbmlmZXN0cyksXG4gICAgICBtc3NNYW5pZmVzdHM6IG9taXRFbXB0eUFycmF5KHRoaXMubXNzTWFuaWZlc3RzKSxcbiAgICAgIGNvbnRhaW5lclR5cGU6IGNvbnRhaW5lclR5cGUsXG4gICAgICBzdGFydG92ZXJXaW5kb3dTZWNvbmRzOiBwcm9wcy5zdGFydG92ZXJXaW5kb3c/LnRvU2Vjb25kcygpLFxuICAgICAgc2VnbWVudDogdGhpcy5zZWdtZW50VmFsaWRhdGlvbihjb250YWluZXJUeXBlLCBwcm9wcy5zZWdtZW50KSxcbiAgICAgIGZvcmNlRW5kcG9pbnRFcnJvckNvbmZpZ3VyYXRpb246IHByb3BzLmZvcmNlRW5kcG9pbnRDb25maWd1cmF0aW9uQ29uZGl0aW9ucyA/IHtcbiAgICAgICAgZW5kcG9pbnRFcnJvckNvbmRpdGlvbnM6IHByb3BzLmZvcmNlRW5kcG9pbnRDb25maWd1cmF0aW9uQ29uZGl0aW9ucyxcbiAgICAgIH06IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIC8vIFRoZSBjaGFubmVsTmFtZS9jaGFubmVsR3JvdXBOYW1lIGFyZSByZW5kZXJlZCBhcyBsaXRlcmFsIHN0cmluZ3MgKG5vdCBDRk4gUmVmcyksIHNvXG4gICAgLy8gQ2xvdWRGb3JtYXRpb24gY2Fubm90IGluZmVyIHRoZSBkZXBlbmRlbmN5LiBXZSBhZGQgZGlyZWN0IENmblJlc291cmNlLWxldmVsIERlcGVuZHNPblxuICAgIC8vIHRvIGd1YXJhbnRlZSBkZXBsb3kgb3JkZXJpbmcgd2l0aG91dCB0cmlnZ2VyaW5nIENESydzIHN1YnRyZWUtbGV2ZWwgY3ljbGUgZGV0ZWN0aW9uLlxuICAgIC8vIEZvciBpbXBvcnRlZCBjb25zdHJ1Y3RzLCBkZWZhdWx0Q2hpbGQgaXMgdW5kZWZpbmVkIChubyBDRk4gcmVzb3VyY2UgdG8gb3JkZXIgYWdhaW5zdCkuXG4gICAgY29uc3QgZW5jcnlwdGlvblJvbGUgPSBwcm9wcy5zZWdtZW50LmVuY3J5cHRpb24/Ll9nZXRSb2xlKCk7XG4gICAgaWYgKGVuY3J5cHRpb25Sb2xlKSBvcmlnaW4ubm9kZS5hZGREZXBlbmRlbmN5KGVuY3J5cHRpb25Sb2xlKTtcbiAgICBjb25zdCBlbmNyeXB0aW9uQ2VydCA9IHByb3BzLnNlZ21lbnQuZW5jcnlwdGlvbj8uX2dldENlcnRpZmljYXRlKCk7XG4gICAgaWYgKGVuY3J5cHRpb25DZXJ0KSBvcmlnaW4ubm9kZS5hZGREZXBlbmRlbmN5KGVuY3J5cHRpb25DZXJ0KTtcbiAgICBjb25zdCBjaGFubmVsQ2ZuID0gcHJvcHMuY2hhbm5lbC5ub2RlLmRlZmF1bHRDaGlsZCBhcyBDZm5SZXNvdXJjZSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoY2hhbm5lbENmbiAmJiBDZm5SZXNvdXJjZS5pc0NmblJlc291cmNlKGNoYW5uZWxDZm4pKSB7XG4gICAgICBvcmlnaW4uYWRkRGVwZW5kZW5jeShjaGFubmVsQ2ZuKTtcbiAgICB9XG4gICAgY29uc3QgZ3JvdXBDZm4gPSBwcm9wcy5jaGFubmVsLmNoYW5uZWxHcm91cD8ubm9kZS5kZWZhdWx0Q2hpbGQgYXMgQ2ZuUmVzb3VyY2UgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGdyb3VwQ2ZuICYmIENmblJlc291cmNlLmlzQ2ZuUmVzb3VyY2UoZ3JvdXBDZm4pKSB7XG4gICAgICBvcmlnaW4uYWRkRGVwZW5kZW5jeShncm91cENmbik7XG4gICAgfVxuXG4gICAgdGhpcy5sb3dMYXRlbmN5SGxzTWFuaWZlc3RVcmxzID0gdGhpcy5sbEhsc01hbmlmZXN0cy5tYXAoKF8sIGkpID0+IEZuLnNlbGVjdChpLCBvcmlnaW4uYXR0ckxvd0xhdGVuY3lIbHNNYW5pZmVzdFVybHMpKTtcbiAgICB0aGlzLmhsc01hbmlmZXN0VXJscyA9IHRoaXMuaGxzTWFuaWZlc3RzLm1hcCgoXywgaSkgPT4gRm4uc2VsZWN0KGksIG9yaWdpbi5hdHRySGxzTWFuaWZlc3RVcmxzKSk7XG4gICAgdGhpcy5kYXNoTWFuaWZlc3RVcmxzID0gdGhpcy5kYXNoTWFuaWZlc3RzLm1hcCgoXywgaSkgPT4gRm4uc2VsZWN0KGksIG9yaWdpbi5hdHRyRGFzaE1hbmlmZXN0VXJscykpO1xuICAgIHRoaXMubXNzTWFuaWZlc3RVcmxzID0gdGhpcy5tc3NNYW5pZmVzdHMubWFwKChfLCBpKSA9PiBGbi5zZWxlY3QoaSwgb3JpZ2luLmF0dHJNc3NNYW5pZmVzdFVybHMpKTtcbiAgICB0aGlzLmNyZWF0ZWRBdCA9IG9yaWdpbi5hdHRyQ3JlYXRlZEF0O1xuICAgIHRoaXMubW9kaWZpZWRBdCA9IG9yaWdpbi5hdHRyTW9kaWZpZWRBdDtcbiAgICB0aGlzLmNoYW5uZWxHcm91cE5hbWUgPSBvcmlnaW4uY2hhbm5lbEdyb3VwTmFtZTtcbiAgICB0aGlzLmNoYW5uZWxOYW1lID0gb3JpZ2luLmNoYW5uZWxOYW1lO1xuICAgIHRoaXMub3JpZ2luRW5kcG9pbnROYW1lID0gb3JpZ2luLm9yaWdpbkVuZHBvaW50TmFtZTtcbiAgICB0aGlzLm9yaWdpbkVuZHBvaW50QXJuID0gb3JpZ2luLmF0dHJBcm47XG5cbiAgICBvcmlnaW4uYXBwbHlSZW1vdmFsUG9saWN5KHByb3BzPy5yZW1vdmFsUG9saWN5ID8/IFJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG5cbiAgICAvLyBQcmUtc2V0IENETiBhdXRoIGNvbmZpZyBpZiBwcm92aWRlZCBpbiBwcm9wc1xuICAgIGlmIChwcm9wcy5jZG5BdXRoKSB7XG4gICAgICB0aGlzLl9zZXRDZG5BdXRoKHByb3BzLmNkbkF1dGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBvbWl0RW1wdHlBcnJheTxBPihhOiBBcnJheTxBPik6IEFycmF5PEE+IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGEubGVuZ3RoID4gMCA/IGEgOiB1bmRlZmluZWQ7XG59XG5cbiJdfQ==
|
|
2054
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJlbmRwb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSw2Q0FBMEc7QUFHMUcsK0RBQTBEO0FBRTFELGlEQUE2RTtBQUM3RSx1RUFBbUU7QUFFbkUsMkNBQXlGO0FBQ3pGLDRFQUE0RDtBQUM1RCw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBSTFFLHFFQUFnRTtBQUNoRSxxREFBbUU7QUFFbkU7Ozs7R0FJRztBQUNILElBQVksVUFTWDtBQVRELFdBQVksVUFBVTtJQUNwQix5QkFBeUI7SUFDekIsMkJBQWEsQ0FBQTtJQUNiLHlCQUF5QjtJQUN6QiwyQkFBYSxDQUFBO0lBQ2IscURBQXFEO0lBQ3JELDJCQUFhLENBQUE7SUFDYiwwREFBMEQ7SUFDMUQsMkJBQWEsQ0FBQTtBQUNmLENBQUMsRUFUVyxVQUFVLDBCQUFWLFVBQVUsUUFTckI7QUFFRDs7OztHQUlHO0FBQ0gsSUFBWSxVQU9YO0FBUEQsV0FBWSxVQUFVO0lBQ3BCLGdCQUFnQjtJQUNoQiwyQkFBYSxDQUFBO0lBQ2IsaUJBQWlCO0lBQ2pCLDJCQUFhLENBQUE7SUFDYixVQUFVO0lBQ1YseUJBQVcsQ0FBQTtBQUNiLENBQUMsRUFQVyxVQUFVLDBCQUFWLFVBQVUsUUFPckI7QUFFRDs7OztHQUlHO0FBQ0gsSUFBWSxpQkFTWDtBQVRELFdBQVksaUJBQWlCO0lBQzNCLG1CQUFtQjtJQUNuQiw4QkFBUyxDQUFBO0lBQ1QsWUFBWTtJQUNaLG9DQUFlLENBQUE7SUFDZix1QkFBdUI7SUFDdkIsZ0NBQVcsQ0FBQTtJQUNYLDZCQUE2QjtJQUM3QixnQ0FBVyxDQUFBO0FBQ2IsQ0FBQyxFQVRXLGlCQUFpQixpQ0FBakIsaUJBQWlCLFFBUzVCO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksYUFPWDtBQVBELFdBQVksYUFBYTtJQUN2Qiw4QkFBOEI7SUFDOUIsa0NBQWlC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LEVBQUUsYUFBYSxJQUFJLDJCQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFekUsc0ZBQXNGO1lBQ3RGLHVGQUF1RjtZQUN2RixpRkFBaUY7WUFDakYsb0ZBQW9GO1lBQ3BGLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNsQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDdkMsTUFBTSxJQUFJLHNCQUFlLENBQ3ZCLElBQUEsc0JBQUcsRUFBQSx3QkFBd0IsRUFDM0IsaUlBQWlJLEVBQ2pJLElBQUksQ0FDTCxDQUFDO2dCQUNKLENBQUM7Z0JBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSx5QkFBZSxDQUFDO29CQUMzQyxHQUFHLEVBQUUsMENBQTBDO29CQUMvQyxNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO29CQUNwQixVQUFVLEVBQUUsQ0FBQyxJQUFJLHVCQUFhLEVBQUUsQ0FBQztvQkFDakMsT0FBTyxFQUFFLENBQUMsMEJBQTBCLENBQUM7b0JBQ3JDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztvQkFDbkMsVUFBVSxFQUFFO3dCQUNWLElBQUksRUFBRTs0QkFDSixnREFBZ0QsRUFBRSxNQUFNO3lCQUN6RDtxQkFDRjtpQkFDRixDQUFDLENBQUMsQ0FBQztZQUNOLENBQUM7U0FDRjs7WUEvTVUsdURBQWM7Ozs7O0FBQWQsd0NBQWM7QUFrTjNCLFNBQVMsY0FBYyxDQUFJLENBQVc7SUFDcEMsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQml0cmF0ZSwgSVJlc291cmNlIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgUmVtb3ZhbFBvbGljeSwgQXJuRm9ybWF0LCBEdXJhdGlvbiwgRm4sIExhenksIE5hbWVzLCBSZXNvdXJjZSwgU3RhY2ssIFRva2VuIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHR5cGUgeyBJQ2VydGlmaWNhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyJztcbmltcG9ydCB0eXBlIHsgTWV0cmljT3B0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB7IE1ldHJpYywgVW5pdCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB0eXBlIHsgSVJvbGUsIEFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IEVmZmVjdCwgUG9saWN5U3RhdGVtZW50LCBTdGFyUHJpbmNpcGFsIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBDZm5PcmlnaW5FbmRwb2ludCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1tZWRpYXBhY2thZ2V2Mic7XG5pbXBvcnQgdHlwZSB7IElPcmlnaW5FbmRwb2ludFJlZiwgT3JpZ2luRW5kcG9pbnRSZWZlcmVuY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbWVkaWFwYWNrYWdldjInO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yLCBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciwgQ2ZuUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB0eXBlIHsgSUNoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwnO1xuaW1wb3J0IHR5cGUgeyBDZG5BdXRoQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vb3JpZ2luLWVuZHBvaW50LXBvbGljeSc7XG5pbXBvcnQgeyBPcmlnaW5FbmRwb2ludFBvbGljeSB9IGZyb20gJy4vb3JpZ2luLWVuZHBvaW50LXBvbGljeSc7XG5pbXBvcnQgeyBjb252ZXJ0RGF0ZVRvU3RyaW5nLCByZW5kZXJUYWdzIH0gZnJvbSAnLi9zaGFyZWQtaGVscGVycyc7XG5cbi8qKlxuICogQWNjZXB0ZWQgYXVkaW8gY29kZWMgdmFsdWVzIGZvciBtYW5pZmVzdCBmaWx0ZXJpbmcuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWVkaWFwYWNrYWdlL2xhdGVzdC91c2VyZ3VpZGUvbWFuaWZlc3QtZmlsdGVyLXF1ZXJ5LXBhcmFtZXRlcnMuaHRtbFxuICovXG5leHBvcnQgZW51bSBBdWRpb0NvZGVjIHtcbiAgLyoqIEFBQy1MQyBhdWRpbyBjb2RlYyAqL1xuICBBQUNMID0gJ0FBQ0wnLFxuICAvKiogSEUtQUFDIGF1ZGlvIGNvZGVjICovXG4gIEFBQ0ggPSAnQUFDSCcsXG4gIC8qKiBEb2xieSBEaWdpdGFsIGF1ZGlvIGNvZGVjIChpbmNsdWRlIHRoZSBoeXBoZW4pICovXG4gIEFDXzMgPSAnQUMtMycsXG4gIC8qKiBEb2xieSBEaWdpdGFsIFBsdXMgYXVkaW8gY29kZWMgKGluY2x1ZGUgdGhlIGh5cGhlbikgKi9cbiAgRUNfMyA9ICdFQy0zJyxcbn1cblxuLyoqXG4gKiBBY2NlcHRlZCB2aWRlbyBjb2RlYyB2YWx1ZXMgZm9yIG1hbmlmZXN0IGZpbHRlcmluZy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYXBhY2thZ2UvbGF0ZXN0L3VzZXJndWlkZS9tYW5pZmVzdC1maWx0ZXItcXVlcnktcGFyYW1ldGVycy5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIFZpZGVvQ29kZWMge1xuICAvKiogSC4yNjQvQVZDICovXG4gIEgyNjQgPSAnSDI2NCcsXG4gIC8qKiBILjI2NS9IRVZDICovXG4gIEgyNjUgPSAnSDI2NScsXG4gIC8qKiBBVjEgKi9cbiAgQVYxID0gJ0FWMScsXG59XG5cbi8qKlxuICogQWNjZXB0ZWQgdmlkZW8gZHluYW1pYyByYW5nZSB2YWx1ZXMgZm9yIG1hbmlmZXN0IGZpbHRlcmluZy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYXBhY2thZ2UvbGF0ZXN0L3VzZXJndWlkZS9tYW5pZmVzdC1maWx0ZXItcXVlcnktcGFyYW1ldGVycy5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIFZpZGVvRHluYW1pY1JhbmdlIHtcbiAgLyoqIERvbGJ5IFZpc2lvbiAqL1xuICBEViA9ICdkdicsXG4gIC8qKiBIRFIxMCAqL1xuICBIRFIxMCA9ICdoZHIxMCcsXG4gIC8qKiBIeWJyaWQgTG9nLUdhbW1hICovXG4gIEhMRyA9ICdobGcnLFxuICAvKiogU3RhbmRhcmQgRHluYW1pYyBSYW5nZSAqL1xuICBTRFIgPSAnc2RyJyxcbn1cblxuLyoqXG4gKiBBY2NlcHRlZCB0cmlja3BsYXkgdHlwZSB2YWx1ZXMgZm9yIG1hbmlmZXN0IGZpbHRlcmluZy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYXBhY2thZ2UvbGF0ZXN0L3VzZXJndWlkZS9tYW5pZmVzdC1maWx0ZXItcXVlcnktcGFyYW1ldGVycy5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIFRyaWNrcGxheVR5cGUge1xuICAvKiogSS1mcmFtZSBvbmx5IHRyaWNrLXBsYXkgKi9cbiAgSUZSQU1FID0gJ2lmcmFtZScsXG4gIC8qKiBJbWFnZS1iYXNlZCB0cmljay1wbGF5ICovXG4gIElNQUdFID0gJ2ltYWdlJyxcbiAgLyoqIE5vIHRyaWNrLXBsYXkgKi9cbiAgTk9ORSA9ICdub25lJyxcbn1cblxuLyoqXG4gKiBOdW1lcmljIG1hbmlmZXN0IGZpbHRlciBrZXlzLlxuICpcbiAqIFVzZSB3aXRoIGBNYW5pZmVzdEZpbHRlci5udW1lcmljKClgLCBgTWFuaWZlc3RGaWx0ZXIubnVtZXJpY0xpc3QoKWAsIGFuZCBgTWFuaWZlc3RGaWx0ZXIubnVtZXJpY1JhbmdlKClgLlxuICpcbiAqIEF1ZGlvIGFuZCB2aWRlbyBiaXRyYXRlIGZpbHRlcnMgYXJlIG5vdCBpbmNsdWRlZCBoZXJlIGJlY2F1c2UgdGhleSB1c2UgdGhlXG4gKiBgQml0cmF0ZWAgY2xhc3MgZGlyZWN0bHkgdmlhIGRlZGljYXRlZCBtZXRob2RzIG9uIGBNYW5pZmVzdEZpbHRlcmAuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWVkaWFwYWNrYWdlL2xhdGVzdC91c2VyZ3VpZGUvbWFuaWZlc3QtZmlsdGVyLXF1ZXJ5LXBhcmFtZXRlcnMuaHRtbFxuICovXG5leHBvcnQgZW51bSBOdW1lcmljRmlsdGVyS2V5IHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMuXG4gICAqXG4gICAqIEFjY2VwdGVkIHZhbHVlczogcmFuZ2UgMeKAkzMyNzY3LCBvciBpbmRpdmlkdWFsIGludGVnZXJzLlxuICAgKi9cbiAgQVVESU9fQ0hBTk5FTFM9J2F1ZGlvX2NoYW5uZWxzJyxcbiAgLyoqXG4gICAqIFRoZSBhdWRpbyBzYW1wbGUgcmF0ZSBpbiBIei5cbiAgICpcbiAgICogQWNjZXB0ZWQgdmFsdWVzOiByYW5nZSAw4oCTMjE0NzQ4MzY0Nywgb3IgaW5kaXZpZHVhbCBpbnRlZ2Vycy5cbiAgICovXG4gIEFVRElPX1NBTVBMRV9SQVRFPSdhdWRpb19zYW1wbGVfcmF0ZScsXG4gIC8qKlxuICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSB0cmljay1wbGF5IGltYWdlIGluIHBpeGVscyAoSS1mcmFtZSBhbmQgaW1hZ2UtYmFzZWQgdHJpY2stcGxheSkuXG4gICAqXG4gICAqIElmIHVzaW5nIHdpdGggSS1mcmFtZSBvbmx5IHRyaWNrLXBsYXksIGBUUklDS1BMQVlfSEVJR0hUYCBhbmQgYFZJREVPX0hFSUdIVGBcbiAgICogc2hvdWxkIGhhdmUgc2ltaWxhciB2YWx1ZXMuIElmIHRoZXkgZGlmZmVyLCBJLWZyYW1lIG9ubHkgdHJhY2tzIG1pZ2h0IGJlXG4gICAqIHJlbW92ZWQgZnJvbSB0aGUgbWFuaWZlc3QuXG4gICAqXG4gICAqIEFjY2VwdGVkIHZhbHVlczogcmFuZ2UgMeKAkzIxNDc0ODM2NDcsIG9yIGluZGl2aWR1YWwgaW50ZWdlcnMuXG4gICAqL1xuICBUUklDS1BMQVlfSEVJR0hUPSd0cmlja3BsYXlfaGVpZ2h0JyxcbiAgLyoqXG4gICAqIFRoZSB2aWRlbyBmcmFtZSByYXRlIHJhbmdlIGluIE5UU0MgZm9ybWF0LlxuICAgKlxuICAgKiBXaGVuIGZpbHRlcmluZyBmb3IgYSBzaW5nbGUgdmFsdWUsIE1lZGlhUGFja2FnZSB1c2VzIGFuIGFwcHJveGltYXRlIGVxdWFsc1xuICAgKiBjb21wYXJpc29uIHdpdGggYW4gZXBzaWxvbiB0b2xlcmFuY2Ugb2YgMC4wMDA1LlxuICAgKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXM6IHJhbmdlIDHigJM5OTkuOTk5ICh1cCB0byB0aHJlZSBkZWNpbWFsIHBsYWNlcyksIG9yIGluZGl2aWR1YWwgdmFsdWVzLlxuICAgKi9cbiAgVklERU9fRlJBTUVSQVRFPSd2aWRlb19mcmFtZXJhdGUnLFxuICAvKipcbiAgICogVGhlIGhlaWdodCBvZiB0aGUgdmlkZW8gaW4gcGl4ZWxzLlxuICAgKlxuICAgKiBJZiB1c2luZyB3aXRoIEktZnJhbWUgb25seSB0cmljay1wbGF5LCBgVFJJQ0tQTEFZX0hFSUdIVGAgYW5kIGBWSURFT19IRUlHSFRgXG4gICAqIHNob3VsZCBoYXZlIHNpbWlsYXIgdmFsdWVzLiBJZiB0aGV5IGRpZmZlciwgSS1mcmFtZSBvbmx5IHRyYWNrcyBtaWdodCBiZVxuICAgKiByZW1vdmVkIGZyb20gdGhlIG1hbmlmZXN0LlxuICAgKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXM6IHJhbmdlIDHigJMzMjc2Nywgb3IgaW5kaXZpZHVhbCBpbnRlZ2Vycy5cbiAgICovXG4gIFZJREVPX0hFSUdIVD0ndmlkZW9faGVpZ2h0Jyxcbn1cblxuLyoqXG4gKiBUZXh0IG1hbmlmZXN0IGZpbHRlciBrZXlzIGZvciBmcmVlLWZvcm0gc3RyaW5nIHZhbHVlcy5cbiAqXG4gKiBVc2Ugd2l0aCBgTWFuaWZlc3RGaWx0ZXIudGV4dCgpYCBhbmQgYE1hbmlmZXN0RmlsdGVyLnRleHRMaXN0KClgLlxuICpcbiAqIEZvciBrZXlzIHdpdGggZml4ZWQgYWNjZXB0ZWQgdmFsdWVzLCB1c2UgdGhlIGRlZGljYXRlZCBtZXRob2RzIG9uIGBNYW5pZmVzdEZpbHRlcmAgaW5zdGVhZDpcbiAqIC0gQXVkaW8gY29kZWM6IGBNYW5pZmVzdEZpbHRlci5hdWRpb0NvZGVjKClgIC8gYE1hbmlmZXN0RmlsdGVyLmF1ZGlvQ29kZWNMaXN0KClgXG4gKiAtIFZpZGVvIGNvZGVjOiBgTWFuaWZlc3RGaWx0ZXIudmlkZW9Db2RlYygpYCAvIGBNYW5pZmVzdEZpbHRlci52aWRlb0NvZGVjTGlzdCgpYFxuICogLSBWaWRlbyBkeW5hbWljIHJhbmdlOiBgTWFuaWZlc3RGaWx0ZXIudmlkZW9EeW5hbWljUmFuZ2UoKWAgLyBgTWFuaWZlc3RGaWx0ZXIudmlkZW9EeW5hbWljUmFuZ2VMaXN0KClgXG4gKiAtIFRyaWNrcGxheSB0eXBlOiBgTWFuaWZlc3RGaWx0ZXIudHJpY2twbGF5VHlwZSgpYCAvIGBNYW5pZmVzdEZpbHRlci50cmlja3BsYXlUeXBlTGlzdCgpYFxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhcGFja2FnZS9sYXRlc3QvdXNlcmd1aWRlL21hbmlmZXN0LWZpbHRlci1xdWVyeS1wYXJhbWV0ZXJzLmh0bWxcbiAqL1xuZXhwb3J0IGVudW0gVGV4dEZpbHRlcktleSB7XG4gIC8qKlxuICAgKiBBdWRpbyBsYW5ndWFnZXMgb3IgZnVuY3Rpb25hbCBjb2RlcyBkZXJpdmVkIGZyb20gZW5jb2RlciBwYXNzdGhyb3VnaC5cbiAgICpcbiAgICogQWNjZXB0ZWQgdmFsdWVzOiBhcmJpdHJhcnkgc3RyaW5ncyBzdWNoIGFzIElTTy02MzktMSBsYW5ndWFnZSBjb2RlcyAobm90IGNhc2Utc2Vuc2l0aXZlKS5cbiAgICovXG4gIEFVRElPX0xBTkdVQUdFPSdhdWRpb19sYW5ndWFnZScsXG4gIC8qKlxuICAgKiBUaGUgc3VidGl0bGUgbGFuZ3VhZ2Ugb3IgZnVuY3Rpb25hbCBjb2RlcyBkZXJpdmVkIGZyb20gZW5jb2RlciBwYXNzdGhyb3VnaC5cbiAgICpcbiAgICogQWNjZXB0ZWQgdmFsdWVzOiBhcmJpdHJhcnkgc3RyaW5ncyBzdWNoIGFzIElTTy02MzktMSBsYW5ndWFnZSBjb2RlcyAobm90IGNhc2Utc2Vuc2l0aXZlKS5cbiAgICovXG4gIFNVQlRJVExFX0xBTkdVQUdFPSdzdWJ0aXRsZV9sYW5ndWFnZScsXG59XG5cbi8qKlxuICogQml0cmF0ZSBtYW5pZmVzdCBmaWx0ZXIga2V5cy5cbiAqXG4gKiBVc2Ugd2l0aCBgTWFuaWZlc3RGaWx0ZXIuYml0cmF0ZSgpYCBhbmQgYE1hbmlmZXN0RmlsdGVyLmJpdHJhdGVSYW5nZSgpYC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYXBhY2thZ2UvbGF0ZXN0L3VzZXJndWlkZS9tYW5pZmVzdC1maWx0ZXItcXVlcnktcGFyYW1ldGVycy5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIEJpdHJhdGVGaWx0ZXJLZXkge1xuICAvKipcbiAgICogVGhlIGF1ZGlvIGJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLlxuICAgKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXM6IHJhbmdlIDDigJMyMTQ3NDgzNjQ3LCBvciBpbmRpdmlkdWFsIGludGVnZXJzLlxuICAgKi9cbiAgQVVESU9fQklUUkFURT0nYXVkaW9fYml0cmF0ZScsXG4gIC8qKlxuICAgKiBUaGUgdmlkZW8gYml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQuXG4gICAqXG4gICAqIFdlIHJlY29tbWVuZCB1c2luZyBvbmx5IHRoaXMgZmlsdGVyIHBhcmFtZXRlciB0byBzZXQgdGhlIHZpZGVvIGJpdHJhdGUuXG4gICAqIERvIG5vdCBhbHNvIHNldCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2aWRlbyBiaXRyYXRlIHZpYSB0aGUgTWVkaWFQYWNrYWdlXG4gICAqIGNvbnNvbGUgb3IgQVdTIENMSSwgYXMgeW91ciBvdXRwdXQgbWlnaHQgYmUgc2tld2VkLlxuICAgKlxuICAgKiBUaGlzIHBhcmFtZXRlciBjYW5ub3QgYmUgdXNlZCB3aXRoIHRyaWNrLXBsYXkgc3RyZWFtcy5cbiAgICpcbiAgICogQWNjZXB0ZWQgdmFsdWVzOiByYW5nZSAw4oCTMjE0NzQ4MzY0Nywgb3IgaW5kaXZpZHVhbCBpbnRlZ2Vycy5cbiAgICovXG4gIFZJREVPX0JJVFJBVEU9J3ZpZGVvX2JpdHJhdGUnLFxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBudW1lcmljIGZpbHRlciBleHByZXNzaW9uIHNlZ21lbnQg4oCUIGVpdGhlciBhIHNpbmdsZSB2YWx1ZSBvciBhIHJhbmdlLlxuICpcbiAqIFVzZSB3aXRoIGBNYW5pZmVzdEZpbHRlci5udW1lcmljQ29tYm8oKWAgdG8gYnVpbGQgZmlsdGVycyB0aGF0IGNvbWJpbmVcbiAqIHJhbmdlcyBhbmQgaW5kaXZpZHVhbCB2YWx1ZXMgKGUuZy4gYHZpZGVvX2hlaWdodDoyNDAtMzYwLDcyMC0xMDgwLDE0NDBgKS5cbiAqL1xuZXhwb3J0IGNsYXNzIE51bWVyaWNFeHByZXNzaW9uIHtcbiAgLyoqXG4gICAqIEEgc2luZ2xlIG51bWVyaWMgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZhbHVlKHY6IG51bWJlcik6IE51bWVyaWNFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gbmV3IE51bWVyaWNFeHByZXNzaW9uKGAke3Z9YCwgW3ZdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBpbmNsdXNpdmUgbnVtZXJpYyByYW5nZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmFuZ2Uoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiBOdW1lcmljRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIG5ldyBOdW1lcmljRXhwcmVzc2lvbihgJHtzdGFydH0tJHtlbmR9YCwgW3N0YXJ0LCBlbmRdKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHVibGljIHJlYWRvbmx5IF9leHByZXNzaW9uOiBzdHJpbmcsXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZWFkb25seSBfdmFsdWVzOiBudW1iZXJbXSxcbiAgKSB7fVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBiaXRyYXRlIGZpbHRlciBleHByZXNzaW9uIHNlZ21lbnQg4oCUIGVpdGhlciBhIHNpbmdsZSB2YWx1ZSBvciBhIHJhbmdlLlxuICpcbiAqIFVzZSB3aXRoIGBNYW5pZmVzdEZpbHRlci5iaXRyYXRlQ29tYm8oKWAgdG8gYnVpbGQgZmlsdGVycyB0aGF0IGNvbWJpbmVcbiAqIHJhbmdlcyBhbmQgaW5kaXZpZHVhbCBiaXRyYXRlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJpdHJhdGVFeHByZXNzaW9uIHtcbiAgLyoqXG4gICAqIEEgc2luZ2xlIGJpdHJhdGUgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZhbHVlKHY6IEJpdHJhdGUpOiBCaXRyYXRlRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIG5ldyBCaXRyYXRlRXhwcmVzc2lvbihgJHt2LnRvQnBzKCl9YCwgW3YudG9CcHMoKV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGluY2x1c2l2ZSBiaXRyYXRlIHJhbmdlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByYW5nZShzdGFydDogQml0cmF0ZSwgZW5kOiBCaXRyYXRlKTogQml0cmF0ZUV4cHJlc3Npb24ge1xuICAgIHJldHVybiBuZXcgQml0cmF0ZUV4cHJlc3Npb24oYCR7c3RhcnQudG9CcHMoKX0tJHtlbmQudG9CcHMoKX1gLCBbc3RhcnQudG9CcHMoKSwgZW5kLnRvQnBzKCldKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHVibGljIHJlYWRvbmx5IF9leHByZXNzaW9uOiBzdHJpbmcsXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZWFkb25seSBfdmFsdWVzOiBudW1iZXJbXSxcbiAgKSB7fVxufVxuXG4vKipcbiAqIEVuYWJsZXMgeW91IHRvIGNyZWF0ZSBmaWx0ZXJzIGZvciB5b3VyIE9yaWdpbiBFbmRwb2ludC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYXBhY2thZ2UvbGF0ZXN0L3VzZXJndWlkZS9tYW5pZmVzdC1maWx0ZXJpbmcuaHRtbFxuICovXG5leHBvcnQgY2xhc3MgTWFuaWZlc3RGaWx0ZXIge1xuICAvKipcbiAgICogRmlsdGVyIGJ5IGEgc2luZ2xlIGJpdHJhdGUgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGJpdHJhdGUoa2V5OiBCaXRyYXRlRmlsdGVyS2V5LCB2YWx1ZTogQml0cmF0ZSkge1xuICAgIGNvbnN0IGJwcyA9IHZhbHVlLnRvQnBzKCk7XG4gICAgdmFsaWRhdGVCaXRyYXRlRmlsdGVyVmFsdWUoYnBzLCBrZXkpO1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoYCR7a2V5fToke2Jwc31gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgYSBiaXRyYXRlIHJhbmdlIChpbmNsdXNpdmUpLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBiaXRyYXRlUmFuZ2Uoa2V5OiBCaXRyYXRlRmlsdGVyS2V5LCBzdGFydDogQml0cmF0ZSwgZW5kOiBCaXRyYXRlKSB7XG4gICAgY29uc3Qgc3RhcnRCcHMgPSBzdGFydC50b0JwcygpO1xuICAgIGNvbnN0IGVuZEJwcyA9IGVuZC50b0JwcygpO1xuICAgIHZhbGlkYXRlQml0cmF0ZUZpbHRlclZhbHVlKHN0YXJ0QnBzLCBrZXkpO1xuICAgIHZhbGlkYXRlQml0cmF0ZUZpbHRlclZhbHVlKGVuZEJwcywga2V5KTtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGAke2tleX06JHtzdGFydEJwc30tJHtlbmRCcHN9YCk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSBhIHNpbmdsZSBudW1lcmljIGZpbHRlciB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbnVtZXJpYyhrZXk6IE51bWVyaWNGaWx0ZXJLZXksIHZhbHVlOiBudW1iZXIpIHtcbiAgICB2YWxpZGF0ZU51bWVyaWNGaWx0ZXJWYWx1ZSh2YWx1ZSwga2V5KTtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGAke2tleX06JHt2YWx1ZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IG11bHRpcGxlIG51bWVyaWMgZmlsdGVyIHZhbHVlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbnVtZXJpY0xpc3Qoa2V5OiBOdW1lcmljRmlsdGVyS2V5LCB2YWx1ZXM6IG51bWJlcltdKSB7XG4gICAgdmFsdWVzLmZvckVhY2godiA9PiB2YWxpZGF0ZU51bWVyaWNGaWx0ZXJWYWx1ZSh2LCBrZXkpKTtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGAke2tleX06JHt2YWx1ZXMuam9pbignLCcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBudW1lcmljIGZpbHRlciByYW5nZSAoaW5jbHVzaXZlKS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbnVtZXJpY1JhbmdlKGtleTogTnVtZXJpY0ZpbHRlcktleSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpIHtcbiAgICB2YWxpZGF0ZU51bWVyaWNGaWx0ZXJWYWx1ZShzdGFydCwga2V5KTtcbiAgICB2YWxpZGF0ZU51bWVyaWNGaWx0ZXJWYWx1ZShlbmQsIGtleSk7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdEZpbHRlcihgJHtrZXl9OiR7c3RhcnR9LSR7ZW5kfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBmcmVlLWZvcm0gdGV4dCBmaWx0ZXIgdmFsdWUgKGZvciBsYW5ndWFnZSBrZXlzKS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdGV4dChrZXk6IFRleHRGaWx0ZXJLZXksIHZhbHVlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGAke2tleX06JHt2YWx1ZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IG11bHRpcGxlIGZyZWUtZm9ybSB0ZXh0IGZpbHRlciB2YWx1ZXMgKGZvciBsYW5ndWFnZSBrZXlzKS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdGV4dExpc3Qoa2V5OiBUZXh0RmlsdGVyS2V5LCB2YWx1ZXM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdEZpbHRlcihgJHtrZXl9OiR7dmFsdWVzLmpvaW4oJywnKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgYSBzaW5nbGUgYXVkaW8gY29kZWMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGF1ZGlvQ29kZWModmFsdWU6IEF1ZGlvQ29kZWMpIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGBhdWRpb19jb2RlYzoke3ZhbHVlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBtdWx0aXBsZSBhdWRpbyBjb2RlY3MuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGF1ZGlvQ29kZWNMaXN0KHZhbHVlczogQXVkaW9Db2RlY1tdKSB7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdEZpbHRlcihgYXVkaW9fY29kZWM6JHt2YWx1ZXMuam9pbignLCcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBhIHNpbmdsZSB2aWRlbyBjb2RlYy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmlkZW9Db2RlYyh2YWx1ZTogVmlkZW9Db2RlYykge1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoYHZpZGVvX2NvZGVjOiR7dmFsdWV9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGJ5IG11bHRpcGxlIHZpZGVvIGNvZGVjcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmlkZW9Db2RlY0xpc3QodmFsdWVzOiBWaWRlb0NvZGVjW10pIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGB2aWRlb19jb2RlYzoke3ZhbHVlcy5qb2luKCcsJyl9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGJ5IGEgc2luZ2xlIHZpZGVvIGR5bmFtaWMgcmFuZ2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZpZGVvRHluYW1pY1JhbmdlKHZhbHVlOiBWaWRlb0R5bmFtaWNSYW5nZSkge1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoYHZpZGVvX2R5bmFtaWNfcmFuZ2U6JHt2YWx1ZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgbXVsdGlwbGUgdmlkZW8gZHluYW1pYyByYW5nZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZpZGVvRHluYW1pY1JhbmdlTGlzdCh2YWx1ZXM6IFZpZGVvRHluYW1pY1JhbmdlW10pIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGB2aWRlb19keW5hbWljX3JhbmdlOiR7dmFsdWVzLmpvaW4oJywnKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgYSBzaW5nbGUgdHJpY2twbGF5IHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRyaWNrcGxheVR5cGUodmFsdWU6IFRyaWNrcGxheVR5cGUpIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGB0cmlja3BsYXlfdHlwZToke3ZhbHVlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBtdWx0aXBsZSB0cmlja3BsYXkgdHlwZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRyaWNrcGxheVR5cGVMaXN0KHZhbHVlczogVHJpY2twbGF5VHlwZVtdKSB7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdEZpbHRlcihgdHJpY2twbGF5X3R5cGU6JHt2YWx1ZXMuam9pbignLCcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBhIGNvbWJpbmF0aW9uIG9mIG51bWVyaWMgcmFuZ2VzIGFuZCBpbmRpdmlkdWFsIHZhbHVlcy5cbiAgICpcbiAgICogVXNlIHRoaXMgZm9yIGFkdmFuY2VkIHBhdHRlcm5zIGxpa2UgYHZpZGVvX2hlaWdodDoyNDAtMzYwLDcyMC0xMDgwLDE0NDBgLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBNYW5pZmVzdEZpbHRlci5udW1lcmljQ29tYm8oTnVtZXJpY0ZpbHRlcktleS5WSURFT19IRUlHSFQsIFtcbiAgICogICBOdW1lcmljRXhwcmVzc2lvbi5yYW5nZSgyNDAsIDM2MCksXG4gICAqICAgTnVtZXJpY0V4cHJlc3Npb24ucmFuZ2UoNzIwLCAxMDgwKSxcbiAgICogICBOdW1lcmljRXhwcmVzc2lvbi52YWx1ZSgxNDQwKSxcbiAgICogXSlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbnVtZXJpY0NvbWJvKGtleTogTnVtZXJpY0ZpbHRlcktleSwgZXhwcmVzc2lvbnM6IE51bWVyaWNFeHByZXNzaW9uW10pIHtcbiAgICBleHByZXNzaW9ucy5mb3JFYWNoKGV4cHIgPT4gZXhwci5fdmFsdWVzLmZvckVhY2godiA9PiB2YWxpZGF0ZU51bWVyaWNGaWx0ZXJWYWx1ZSh2LCBrZXkpKSk7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdEZpbHRlcihgJHtrZXl9OiR7ZXhwcmVzc2lvbnMubWFwKGUgPT4gZS5fZXhwcmVzc2lvbikuam9pbignLCcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBhIGNvbWJpbmF0aW9uIG9mIGJpdHJhdGUgcmFuZ2VzIGFuZCBpbmRpdmlkdWFsIHZhbHVlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogTWFuaWZlc3RGaWx0ZXIuYml0cmF0ZUNvbWJvKEJpdHJhdGVGaWx0ZXJLZXkuVklERU9fQklUUkFURSwgW1xuICAgKiAgIEJpdHJhdGVFeHByZXNzaW9uLnJhbmdlKEJpdHJhdGUubWJwcygxKSwgQml0cmF0ZS5tYnBzKDMpKSxcbiAgICogICBCaXRyYXRlRXhwcmVzc2lvbi52YWx1ZShCaXRyYXRlLm1icHMoNSkpLFxuICAgKiBdKVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBiaXRyYXRlQ29tYm8oa2V5OiBCaXRyYXRlRmlsdGVyS2V5LCBleHByZXNzaW9uczogQml0cmF0ZUV4cHJlc3Npb25bXSkge1xuICAgIGV4cHJlc3Npb25zLmZvckVhY2goZXhwciA9PiBleHByLl92YWx1ZXMuZm9yRWFjaCh2ID0+IHZhbGlkYXRlQml0cmF0ZUZpbHRlclZhbHVlKHYsIGtleSkpKTtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGAke2tleX06JHtleHByZXNzaW9ucy5tYXAoZSA9PiBlLl9leHByZXNzaW9uKS5qb2luKCcsJyl9YCk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSBhIGN1c3RvbSBtYW5pZmVzdCBmaWx0ZXIgc3RyaW5nLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjdXN0b20oY3VzdG9tOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGN1c3RvbSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGZpbHRlclN0cmluZyBOb3JtYWxpc2VkIG1hbmlmZXN0IGZpbHRlciBzdHJpbmdcbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZmlsdGVyU3RyaW5nOiBzdHJpbmcpIHsgfVxufVxuXG4vKipcbiAqIENvbnRleHQgcGFzc2VkIHRvIE1hbmlmZXN0Ll9iaW5kKCkgbWV0aG9kXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYW5pZmVzdEJpbmRDb250ZXh0IHtcbiAgcmVhZG9ubHkgaGxzTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5IbHNNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdO1xuICByZWFkb25seSBsbEhsc01hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuTG93TGF0ZW5jeUhsc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5W107XG4gIHJlYWRvbmx5IGRhc2hNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50LkRhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdO1xuICByZWFkb25seSBtc3NNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50Lk1zc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5W107XG4gIHJlYWRvbmx5IHNlZ21lbnQ/OiBTZWdtZW50Q29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBNYW5pZmVzdCB0byBhZGQgdG8gT3JpZ2luIEVuZHBvaW50XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgbWFuaWZlc3QgY29uZmlndXJhdGlvbiBmb3IgTG93IExhdGVuY3kgSExTLlxuICAgKlxuICAgKiAqKk5vdGU6KiogTG93IExhdGVuY3kgSExTIG1hbmlmZXN0cyByZXF1aXJlIFRTIG9yIENNQUYgY29udGFpbmVyIHR5cGUuXG4gICAqIFVzZSB3aXRoIGBTZWdtZW50LnRzKClgIG9yIGBTZWdtZW50LmNtYWYoKWAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGxvd0xhdGVuY3lITFMobWFuaWZlc3Q6IExvd0xhdGVuY3lIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb24pOiBNYW5pZmVzdCB7XG4gICAgcmV0dXJuIG5ldyBMb3dMYXRlbmN5SGxzTWFuaWZlc3QobWFuaWZlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBtYW5pZmVzdCBjb25maWd1cmF0aW9uIGZvciBITFMuXG4gICAqXG4gICAqICoqTm90ZToqKiBITFMgbWFuaWZlc3RzIHJlcXVpcmUgVFMgb3IgQ01BRiBjb250YWluZXIgdHlwZS5cbiAgICogVXNlIHdpdGggYFNlZ21lbnQudHMoKWAgb3IgYFNlZ21lbnQuY21hZigpYC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaGxzKG1hbmlmZXN0OiBIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb24pOiBNYW5pZmVzdCB7XG4gICAgcmV0dXJuIG5ldyBIbHNNYW5pZmVzdChtYW5pZmVzdCk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSBhIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gZm9yIERBU0guXG4gICAqXG4gICAqICoqTm90ZToqKiBEQVNIIG1hbmlmZXN0cyByZXF1aXJlIENNQUYgY29udGFpbmVyIHR5cGUuXG4gICAqIFVzZSB3aXRoIGBTZWdtZW50LmNtYWYoKWAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRhc2gobWFuaWZlc3Q6IERhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb24pOiBNYW5pZmVzdCB7XG4gICAgcmV0dXJuIG5ldyBEYXNoTWFuaWZlc3QobWFuaWZlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBtYW5pZmVzdCBjb25maWd1cmF0aW9uIGZvciBNU1MuXG4gICAqXG4gICAqICoqTm90ZToqKiBNU1MgbWFuaWZlc3RzIHJlcXVpcmUgSVNNIGNvbnRhaW5lciB0eXBlLlxuICAgKiBVc2Ugd2l0aCBgU2VnbWVudC5pc20oKWAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1zcyhtYW5pZmVzdDogTXNzTWFuaWZlc3RDb25maWd1cmF0aW9uKTogTWFuaWZlc3Qge1xuICAgIHJldHVybiBuZXcgTXNzTWFuaWZlc3QobWFuaWZlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBtYW5pZmVzdCBpcyBib3VuZCB0byBhbiBPcmlnaW5FbmRwb2ludC5cbiAgICpcbiAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QgdXNlZCBieSB0aGUgY29uc3RydWN0IGxpYnJhcnkgYW5kIHNob3VsZCBub3QgYmVcbiAgICogY2FsbGVkIG9yIGltcGxlbWVudGVkIGJ5IGV4dGVybmFsIGNvbnN1bWVycy4gSXQgbWF5IGNoYW5nZSB3aXRob3V0IG5vdGljZS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgX2JpbmQoY29udGV4dDogTWFuaWZlc3RCaW5kQ29udGV4dCk6IHZvaWQ7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSBudW1lcmljIGZpbHRlciB2YWx1ZSBpcyBhbiBpbnRlZ2VyIHdpdGhpbiB0aGUgYWNjZXB0ZWQgcmFuZ2UgZm9yIGl0cyBrZXkuXG4gKiBWSURFT19GUkFNRVJBVEUgaXMgZXhjbHVkZWQg4oCUIGl0IHVzZXMgYHZhbGlkYXRlRnJhbWVyYXRlVmFsdWVgIGluc3RlYWQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVJbnRlZ2VyRmlsdGVyVmFsdWUodmFsdWU6IG51bWJlciwga2V5OiBOdW1lcmljRmlsdGVyS2V5LCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTnVtZXJpY0ZpbHRlck11c3RCZUludGVnZXJgLCBgTnVtZXJpYyBmaWx0ZXIgdmFsdWUgZm9yICcke2tleX0nIG11c3QgYmUgYW4gaW50ZWdlciwgZ290ICR7dmFsdWV9YCk7XG4gIH1cbiAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBOdW1lcmljRmlsdGVyT3V0T2ZSYW5nZWAsIGBOdW1lcmljIGZpbHRlciB2YWx1ZSBmb3IgJyR7a2V5fScgbXVzdCBiZSBiZXR3ZWVuICR7bWlufSBhbmQgJHttYXh9LCBnb3QgJHt2YWx1ZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgdmlkZW8gZnJhbWVyYXRlIGZpbHRlciB2YWx1ZSAoMeKAkzk5OS45OTksIHVwIHRvIDMgZGVjaW1hbCBwbGFjZXMpLlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhbWVyYXRlVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICBpZiAodmFsdWUgPCAxIHx8IHZhbHVlID4gOTk5Ljk5OSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTnVtZXJpY0ZpbHRlck91dE9mUmFuZ2VgLCBgTnVtZXJpYyBmaWx0ZXIgdmFsdWUgZm9yICd2aWRlb19mcmFtZXJhdGUnIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA5OTkuOTk5LCBnb3QgJHt2YWx1ZX1gKTtcbiAgfVxuICBjb25zdCBkZWNpbWFsUGFydCA9IHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJy4nKVsxXTtcbiAgaWYgKGRlY2ltYWxQYXJ0ICYmIGRlY2ltYWxQYXJ0Lmxlbmd0aCA+IDMpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YE51bWVyaWNGaWx0ZXJNYXhEZWNpbWFsUGxhY2VzYCwgYE51bWVyaWMgZmlsdGVyIHZhbHVlIGZvciAndmlkZW9fZnJhbWVyYXRlJyBhbGxvd3MgdXAgdG8gMyBkZWNpbWFsIHBsYWNlcywgZ290ICR7dmFsdWV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSb3V0ZSBudW1lcmljIHZhbGlkYXRpb24gdG8gdGhlIGNvcnJlY3QgaGVscGVyIGJhc2VkIG9uIGtleS5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZU51bWVyaWNGaWx0ZXJWYWx1ZSh2YWx1ZTogbnVtYmVyLCBrZXk6IE51bWVyaWNGaWx0ZXJLZXkpOiB2b2lkIHtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlIE51bWVyaWNGaWx0ZXJLZXkuQVVESU9fQ0hBTk5FTFM6XG4gICAgICByZXR1cm4gdmFsaWRhdGVJbnRlZ2VyRmlsdGVyVmFsdWUodmFsdWUsIGtleSwgMSwgMzJfNzY3KTtcbiAgICBjYXNlIE51bWVyaWNGaWx0ZXJLZXkuQVVESU9fU0FNUExFX1JBVEU6XG4gICAgICByZXR1cm4gdmFsaWRhdGVJbnRlZ2VyRmlsdGVyVmFsdWUodmFsdWUsIGtleSwgMCwgMl8xNDdfNDgzXzY0Nyk7XG4gICAgY2FzZSBOdW1lcmljRmlsdGVyS2V5LlRSSUNLUExBWV9IRUlHSFQ6XG4gICAgICByZXR1cm4gdmFsaWRhdGVJbnRlZ2VyRmlsdGVyVmFsdWUodmFsdWUsIGtleSwgMSwgMl8xNDdfNDgzXzY0Nyk7XG4gICAgY2FzZSBOdW1lcmljRmlsdGVyS2V5LlZJREVPX0ZSQU1FUkFURTpcbiAgICAgIHJldHVybiB2YWxpZGF0ZUZyYW1lcmF0ZVZhbHVlKHZhbHVlKTtcbiAgICBjYXNlIE51bWVyaWNGaWx0ZXJLZXkuVklERU9fSEVJR0hUOlxuICAgICAgcmV0dXJuIHZhbGlkYXRlSW50ZWdlckZpbHRlclZhbHVlKHZhbHVlLCBrZXksIDEsIDMyXzc2Nyk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIGJpdHJhdGUgZmlsdGVyIHZhbHVlIGlzIGFuIGludGVnZXIgd2l0aGluIHRoZSBhY2NlcHRlZCByYW5nZS5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUJpdHJhdGVGaWx0ZXJWYWx1ZShicHM6IG51bWJlciwga2V5OiBCaXRyYXRlRmlsdGVyS2V5KTogdm9pZCB7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihicHMpKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBCaXRyYXRlRmlsdGVyTXVzdEJlSW50ZWdlcmAsIGBCaXRyYXRlIGZpbHRlciB2YWx1ZSBmb3IgJyR7a2V5fScgbXVzdCByZXNvbHZlIHRvIGEgd2hvbGUgbnVtYmVyIG9mIGJpdHMgcGVyIHNlY29uZCwgZ290ICR7YnBzfWApO1xuICB9XG4gIGlmIChicHMgPCAwIHx8IGJwcyA+IDJfMTQ3XzQ4M182NDcpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YEJpdHJhdGVGaWx0ZXJPdXRPZlJhbmdlYCwgYEJpdHJhdGUgZmlsdGVyIHZhbHVlIGZvciAnJHtrZXl9JyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjE0NzQ4MzY0NywgZ290ICR7YnBzfWApO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGNvbW1vbiBtYW5pZmVzdCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVNYW5pZmVzdENvbmZpZ3VyYXRpb24oY29uZmlnOiBNYW5pZmVzdENvbmZpZ3VyYXRpb25CYXNlKTogdm9pZCB7XG4gIGlmIChjb25maWcubWFuaWZlc3RXaW5kb3cgJiYgY29uZmlnLm1hbmlmZXN0V2luZG93LnRvU2Vjb25kcygpIDwgMzApIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YE1hbmlmZXN0V2luZG93TWluaW11bWAsICdNYW5pZmVzdCBXaW5kb3cgaGFzIGEgbWluaW11bSB2YWx1ZSBvZiAzMCBzZWNvbmRzJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgbW9kaWZ5IGZpbHRlciBjb25maWd1cmF0aW9uXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGaWx0ZXJDb25maWd1cmF0aW9uKGZpbHRlckNvbmZpZz86IEZpbHRlckNvbmZpZ3VyYXRpb24pOiBDZm5PcmlnaW5FbmRwb2ludC5GaWx0ZXJDb25maWd1cmF0aW9uUHJvcGVydHkgfCB1bmRlZmluZWQge1xuICBpZiAoIWZpbHRlckNvbmZpZykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBpZiAoZmlsdGVyQ29uZmlnLmNsaXBTdGFydFRpbWUgJiYgKGZpbHRlckNvbmZpZy5zdGFydCB8fCBmaWx0ZXJDb25maWcuZW5kKSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgQ2xpcFN0YXJ0VGltZUNvbmZsaWN0YCwgJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIENsaXBTdGFydFRpbWUgd2l0aCBTdGFydCBvciBFbmQgaW4gYSBGaWx0ZXJDb25maWd1cmF0aW9uLicpO1xuICB9XG5cbiAgaWYgKGZpbHRlckNvbmZpZy50aW1lRGVsYXkgJiYgKGZpbHRlckNvbmZpZy50aW1lRGVsYXkudG9TZWNvbmRzKCkgPCAwIHx8IGZpbHRlckNvbmZpZy50aW1lRGVsYXkudG9TZWNvbmRzKCkgPiAxMjA5NjAwKSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgVGltZURlbGF5UmFuZ2VgLCAnVGltZSBEZWxheSBzZXR0aW5nIHNob3VsZCBiZSBkZWZpbmVkIGJldHdlZW4gMC0xMjA5NjAwIHNlY29uZHMuJyk7XG4gIH1cblxuICBpZiAoZmlsdGVyQ29uZmlnLnN0YXJ0ICYmIGZpbHRlckNvbmZpZy5lbmQgJiYgKGZpbHRlckNvbmZpZy5lbmQgPD0gZmlsdGVyQ29uZmlnLnN0YXJ0KSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgRW5kQmVmb3JlU3RhcnRgLCAnVGhlIEVuZCBwYXJhbWV0ZXIgbmVlZHMgdG8gYmUgYWZ0ZXIgdGhlIFN0YXJ0IHBhcmFtZXRlciBpbiBhIEZpbHRlckNvbmZpZ3VyYXRpb24uJyk7XG4gIH1cblxuICBjb25zdCBtYW5pZmVzdEZpbHRlciA9IGZpbHRlckNvbmZpZy5tYW5pZmVzdEZpbHRlciA/IGZpbHRlckNvbmZpZy5tYW5pZmVzdEZpbHRlci5tYXAoZmlsdGVyID0+IGZpbHRlci5maWx0ZXJTdHJpbmcpLmpvaW4oJzsnKSA6IHVuZGVmaW5lZDtcbiAgaWYgKG1hbmlmZXN0RmlsdGVyICE9IHVuZGVmaW5lZCAmJiAobWFuaWZlc3RGaWx0ZXIubGVuZ3RoIDwgMSB8fCBtYW5pZmVzdEZpbHRlci5sZW5ndGggPiAxMDI0KSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTWFuaWZlc3RGaWx0ZXJMZW5ndGhgLCAnTWFuaWZlc3QgZmlsdGVyIG5lZWRzIHRvIGJlIGJldHdlZW4gMS0xMDI0IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLicpO1xuICB9XG5cbiAgaWYgKGZpbHRlckNvbmZpZy5tYW5pZmVzdEZpbHRlciAmJiBmaWx0ZXJDb25maWcubWFuaWZlc3RGaWx0ZXIubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IGtleXMgPSBmaWx0ZXJDb25maWcubWFuaWZlc3RGaWx0ZXIubWFwKGYgPT4gZi5maWx0ZXJTdHJpbmcuc3BsaXQoJzonKVswXSk7XG4gICAga2V5cy5mb3JFYWNoKChrZXksIGkpID0+IHtcbiAgICAgIGlmIChrZXlzLmluZGV4T2Yoa2V5KSAhPT0gaSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YER1cGxpY2F0ZU1hbmlmZXN0RmlsdGVyS2V5YCwgYER1cGxpY2F0ZSBtYW5pZmVzdCBmaWx0ZXIga2V5ICcke2tleX0nLiBVc2UgYSBzaW5nbGUgZmlsdGVyIHdpdGggY29tbWEtc2VwYXJhdGVkIHZhbHVlcyBpbnN0ZWFkIChlLmcuIE1hbmlmZXN0RmlsdGVyLm51bWVyaWNMaXN0KCkgb3IgTWFuaWZlc3RGaWx0ZXIuY3VzdG9tKCkpLmApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtYW5pZmVzdEZpbHRlcixcbiAgICBkcm1TZXR0aW5nczogZmlsdGVyQ29uZmlnLmRybVNldHRpbmdzID8gZmlsdGVyQ29uZmlnLmRybVNldHRpbmdzLmZpbHRlcigodiwgaSwgYSkgPT4gYS5pbmRleE9mKHYpID09PSBpKS5qb2luKCc7JykgOiB1bmRlZmluZWQsXG4gICAgY2xpcFN0YXJ0VGltZTogZmlsdGVyQ29uZmlnLmNsaXBTdGFydFRpbWUgPyBjb252ZXJ0RGF0ZVRvU3RyaW5nKGZpbHRlckNvbmZpZy5jbGlwU3RhcnRUaW1lKSA6IHVuZGVmaW5lZCxcbiAgICBzdGFydDogZmlsdGVyQ29uZmlnLnN0YXJ0ID8gY29udmVydERhdGVUb1N0cmluZyhmaWx0ZXJDb25maWcuc3RhcnQpIDogdW5kZWZpbmVkLFxuICAgIGVuZDogZmlsdGVyQ29uZmlnLmVuZCA/IGNvbnZlcnREYXRlVG9TdHJpbmcoZmlsdGVyQ29uZmlnLmVuZCkgOiB1bmRlZmluZWQsXG4gICAgdGltZURlbGF5U2Vjb25kczogZmlsdGVyQ29uZmlnLnRpbWVEZWxheT8udG9TZWNvbmRzKCksXG4gIH07XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc3RhcnRUYWcgY29uZmlndXJhdGlvblxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhcnRUYWcoc3RhcnRUYWc6IFN0YXJ0VGFnLCBtYW5pZmVzdFdpbmRvdz86IER1cmF0aW9uLCBzZWdtZW50RHVyYXRpb24/OiBEdXJhdGlvbik6IHZvaWQge1xuICBjb25zdCB0aW1lT2Zmc2V0ID0gc3RhcnRUYWcudGltZU9mZnNldDtcblxuICAvLyBHZXQgc2VnbWVudCBkdXJhdGlvbiAoZGVmYXVsdCBpcyA2IHNlY29uZHMgaWYgbm90IHNwZWNpZmllZClcbiAgY29uc3Qgc2VnbWVudER1cmF0aW9uU2VjID0gc2VnbWVudER1cmF0aW9uPy50b1NlY29uZHMoKSA/PyA2O1xuXG4gIC8vIEdldCBtYW5pZmVzdCBkdXJhdGlvbiAoZGVmYXVsdCBpcyA2MCBzZWNvbmRzIGlmIG5vdCBzcGVjaWZpZWQpXG4gIGNvbnN0IG1hbmlmZXN0RHVyYXRpb25TZWMgPSBtYW5pZmVzdFdpbmRvdz8udG9TZWNvbmRzKCkgPz8gNjA7XG5cbiAgLy8gVmFsaWRhdGUgcG9zaXRpdmUgb2Zmc2V0IChmcm9tIHN0YXJ0KVxuICBpZiAodGltZU9mZnNldCA+IDApIHtcbiAgICBjb25zdCBtYXhQb3NpdGl2ZU9mZnNldCA9IG1hbmlmZXN0RHVyYXRpb25TZWMgLSAoMyAqIHNlZ21lbnREdXJhdGlvblNlYyk7XG4gICAgaWYgKHRpbWVPZmZzZXQgPj0gbWF4UG9zaXRpdmVPZmZzZXQpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgU3RhcnRUYWdQb3NpdGl2ZU9mZnNldEV4Y2VlZGVkYCwgYFN0YXJ0VGFnIHRpbWVPZmZzZXQgKCR7dGltZU9mZnNldH1zKSBtdXN0IGJlIGxlc3MgdGhhbiBtYW5pZmVzdCBkdXJhdGlvbiAoJHttYW5pZmVzdER1cmF0aW9uU2VjfXMpIG1pbnVzIDMgdGltZXMgc2VnbWVudCBkdXJhdGlvbiAoJHtzZWdtZW50RHVyYXRpb25TZWN9cykuIE1heGltdW0gYWxsb3dlZDogJHttYXhQb3NpdGl2ZU9mZnNldH1zYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGUgbmVnYXRpdmUgb2Zmc2V0IChmcm9tIGxpdmUgZWRnZSlcbiAgaWYgKHRpbWVPZmZzZXQgPCAwKSB7XG4gICAgY29uc3QgYWJzT2Zmc2V0ID0gTWF0aC5hYnModGltZU9mZnNldCk7XG4gICAgY29uc3QgbWluTmVnYXRpdmVPZmZzZXQgPSAzICogc2VnbWVudER1cmF0aW9uU2VjO1xuXG4gICAgaWYgKGFic09mZnNldCA8PSBtaW5OZWdhdGl2ZU9mZnNldCkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBTdGFydFRhZ05lZ2F0aXZlT2Zmc2V0VG9vU21hbGxgLCBgU3RhcnRUYWcgdGltZU9mZnNldCAoJHt0aW1lT2Zmc2V0fXMpIGFic29sdXRlIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDMgdGltZXMgc2VnbWVudCBkdXJhdGlvbiAoJHtzZWdtZW50RHVyYXRpb25TZWN9cykuIE1pbmltdW0gYWxsb3dlZDogLSR7bWluTmVnYXRpdmVPZmZzZXQgKyAwLjAxfXNgKTtcbiAgICB9XG5cbiAgICBpZiAoYWJzT2Zmc2V0ID49IG1hbmlmZXN0RHVyYXRpb25TZWMpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgU3RhcnRUYWdOZWdhdGl2ZU9mZnNldEV4Y2VlZHNNYW5pZmVzdGAsIGBTdGFydFRhZyB0aW1lT2Zmc2V0ICgke3RpbWVPZmZzZXR9cykgYWJzb2x1dGUgdmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gbWFuaWZlc3QgZHVyYXRpb24gKCR7bWFuaWZlc3REdXJhdGlvblNlY31zKWApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIEhMUyBtYW5pZmVzdCBjb25maWd1cmF0aW9uXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gYnVpbGRIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb24oXG4gIGNvbmZpZzogSGxzTWFuaWZlc3RDb25maWd1cmF0aW9uLFxuICBzZWdtZW50RHVyYXRpb24/OiBEdXJhdGlvbixcbik6IENmbk9yaWdpbkVuZHBvaW50Lkhsc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5IHtcbiAgaWYgKGNvbmZpZy5zdGFydFRhZykge1xuICAgIHZhbGlkYXRlU3RhcnRUYWcoY29uZmlnLnN0YXJ0VGFnLCBjb25maWcubWFuaWZlc3RXaW5kb3csIHNlZ21lbnREdXJhdGlvbik7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1hbmlmZXN0TmFtZTogY29uZmlnLm1hbmlmZXN0TmFtZSxcbiAgICBjaGlsZE1hbmlmZXN0TmFtZTogY29uZmlnLmNoaWxkTWFuaWZlc3ROYW1lLFxuICAgIG1hbmlmZXN0V2luZG93U2Vjb25kczogY29uZmlnLm1hbmlmZXN0V2luZG93Py50b1NlY29uZHMoKSxcbiAgICBwcm9ncmFtRGF0ZVRpbWVJbnRlcnZhbFNlY29uZHM6IGNvbmZpZy5wcm9ncmFtRGF0ZVRpbWVJbnRlcnZhbD8udG9TZWNvbmRzKCksXG4gICAgc2N0ZUhsczogY29uZmlnLnNjdGVBZE1hcmtlckhscyA/IHsgYWRNYXJrZXJIbHM6IGNvbmZpZy5zY3RlQWRNYXJrZXJIbHMgfSA6IHVuZGVmaW5lZCxcbiAgICBzdGFydFRhZzogY29uZmlnLnN0YXJ0VGFnLFxuICAgIHVybEVuY29kZUNoaWxkTWFuaWZlc3Q6IGNvbmZpZy51cmxFbmNvZGVDaGlsZE1hbmlmZXN0LFxuICAgIGZpbHRlckNvbmZpZ3VyYXRpb246IHZhbGlkYXRlRmlsdGVyQ29uZmlndXJhdGlvbihjb25maWcuZmlsdGVyQ29uZmlndXJhdGlvbiksXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgREFTSCBtYW5pZmVzdCBjb25maWd1cmF0aW9uXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gYnVpbGREYXNoTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuICBjb25maWc6IERhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG4gIHNlZ21lbnQ/OiBTZWdtZW50Q29uZmlndXJhdGlvbixcbik6IENmbk9yaWdpbkVuZHBvaW50LkRhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eSB7XG4gIGlmIChjb25maWcubWluQnVmZmVyVGltZSAmJiAoY29uZmlnLm1pbkJ1ZmZlclRpbWUudG9TZWNvbmRzKCkgPCAxIHx8IGNvbmZpZy5taW5CdWZmZXJUaW1lLnRvU2Vjb25kcygpID4gMzYwMCkpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YE1pbkJ1ZmZlclRpbWVSYW5nZWAsICdNaW4gYnVmZmVyIHRpbWUgaGFzIGEgcmFuZ2UgZnJvbSAxIHNlYy4gdG8gMzYwMCBzZWMuJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5taW5VcGRhdGVQZXJpb2QgJiYgKGNvbmZpZy5taW5VcGRhdGVQZXJpb2QudG9TZWNvbmRzKCkgPCAxIHx8IGNvbmZpZy5taW5VcGRhdGVQZXJpb2QudG9TZWNvbmRzKCkgPiAzNjAwKSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTWluVXBkYXRlUGVyaW9kUmFuZ2VgLCAnTWluIHVwZGF0ZSBwZXJpb2Qgb3B0aW9uIGhhcyBhIHJhbmdlIGZyb20gMSBzZWMuIHRvIDM2MDAgc2VjLicpO1xuICB9XG4gIGlmIChjb25maWcuc2N0ZURhc2hBZE1hcmtlciAmJiAoIXNlZ21lbnQ/LnNjdGVGaWx0ZXIgfHwgc2VnbWVudC5zY3RlRmlsdGVyPy5sZW5ndGggPT09IDApKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBTY3RlRmlsdGVyUmVxdWlyZWRgLCAnU0NURSBGaWx0ZXIgbXVzdCBiZSBjb25maWd1cmVkIHdpdGggRGFzaEFkTWFya2VyIENvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWFuaWZlc3ROYW1lOiBjb25maWcubWFuaWZlc3ROYW1lLFxuICAgIGJhc2VVcmxzOiBjb25maWcuYmFzZVVybHMsXG4gICAgY29tcGFjdG5lc3M6IGNvbmZpZy5jb21wYWN0bmVzcyxcbiAgICBkcm1TaWduYWxpbmc6IGNvbmZpZy5kcm1TaWduYWxsaW5nLFxuICAgIGR2YlNldHRpbmdzOiBjb25maWcuZHZiU2V0dGluZ3MsXG4gICAgcHJvZmlsZXM6IGNvbmZpZy5wcm9maWxlcyxcbiAgICBwcm9ncmFtSW5mb3JtYXRpb246IGNvbmZpZy5wcm9ncmFtSW5mb3JtYXRpb24sXG4gICAgc3VidGl0bGVDb25maWd1cmF0aW9uOiBjb25maWcuc3VidGl0bGVDb25maWd1cmF0aW9uLFxuICAgIG1hbmlmZXN0V2luZG93U2Vjb25kczogY29uZmlnLm1hbmlmZXN0V2luZG93Py50b1NlY29uZHMoKSxcbiAgICBtaW5CdWZmZXJUaW1lU2Vjb25kczogY29uZmlnLm1pbkJ1ZmZlclRpbWU/LnRvU2Vjb25kcygpLFxuICAgIG1pblVwZGF0ZVBlcmlvZFNlY29uZHM6IGNvbmZpZy5taW5VcGRhdGVQZXJpb2Q/LnRvU2Vjb25kcygpLFxuICAgIHN1Z2dlc3RlZFByZXNlbnRhdGlvbkRlbGF5U2Vjb25kczogY29uZmlnLnN1Z2dlc3RlZFByZXNlbnRhdGlvbkRlbGF5Py50b1NlY29uZHMoKSxcbiAgICBzZWdtZW50VGVtcGxhdGVGb3JtYXQ6IGNvbmZpZy5zZWdtZW50VGVtcGxhdGVGb3JtYXQsXG4gICAgcGVyaW9kVHJpZ2dlcnM6IGNvbmZpZy5wZXJpb2RUcmlnZ2VycyxcbiAgICBzY3RlRGFzaDogc2VnbWVudD8uc2N0ZUZpbHRlciA/IHtcbiAgICAgIGFkTWFya2VyRGFzaDogY29uZmlnLnNjdGVEYXNoQWRNYXJrZXIsXG4gICAgfSA6IHVuZGVmaW5lZCxcbiAgICB1dGNUaW1pbmc6IGNvbmZpZy51dGNUaW1pbmdNb2RlIHx8IGNvbmZpZy51dGNUaW1pbmdTb3VyY2UgPyB7XG4gICAgICB0aW1pbmdNb2RlOiBjb25maWcudXRjVGltaW5nTW9kZSxcbiAgICAgIHRpbWluZ1NvdXJjZTogY29uZmlnLnV0Y1RpbWluZ1NvdXJjZSxcbiAgICB9IDogdW5kZWZpbmVkLFxuICAgIGZpbHRlckNvbmZpZ3VyYXRpb246IHZhbGlkYXRlRmlsdGVyQ29uZmlndXJhdGlvbihjb25maWcuZmlsdGVyQ29uZmlndXJhdGlvbiksXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgTVNTIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb25cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBidWlsZE1zc01hbmlmZXN0Q29uZmlndXJhdGlvbihjb25maWc6IE1zc01hbmlmZXN0Q29uZmlndXJhdGlvbik6IENmbk9yaWdpbkVuZHBvaW50Lk1zc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5IHtcbiAgcmV0dXJuIHtcbiAgICBtYW5pZmVzdE5hbWU6IGNvbmZpZy5tYW5pZmVzdE5hbWUsXG4gICAgbWFuaWZlc3RMYXlvdXQ6IGNvbmZpZy5tYW5pZmVzdExheW91dCxcbiAgICBtYW5pZmVzdFdpbmRvd1NlY29uZHM6IGNvbmZpZy5tYW5pZmVzdFdpbmRvdz8udG9TZWNvbmRzKCksXG4gICAgZmlsdGVyQ29uZmlndXJhdGlvbjogdmFsaWRhdGVGaWx0ZXJDb25maWd1cmF0aW9uKGNvbmZpZy5maWx0ZXJDb25maWd1cmF0aW9uKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBITFMgTWFuaWZlc3QgaW1wbGVtZW50YXRpb25cbiAqL1xuY2xhc3MgSGxzTWFuaWZlc3QgZXh0ZW5kcyBNYW5pZmVzdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb24pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIF9iaW5kKGNvbnRleHQ6IE1hbmlmZXN0QmluZENvbnRleHQpOiB2b2lkIHtcbiAgICB2YWxpZGF0ZU1hbmlmZXN0Q29uZmlndXJhdGlvbih0aGlzLmNvbmZpZyk7XG4gICAgY29udGV4dC5obHNNYW5pZmVzdHMucHVzaChidWlsZEhsc01hbmlmZXN0Q29uZmlndXJhdGlvbih0aGlzLmNvbmZpZywgY29udGV4dC5zZWdtZW50Py5zZWdtZW50RHVyYXRpb24pKTtcbiAgfVxufVxuXG4vKipcbiAqIExvdyBMYXRlbmN5IEhMUyBNYW5pZmVzdCBpbXBsZW1lbnRhdGlvblxuICovXG5jbGFzcyBMb3dMYXRlbmN5SGxzTWFuaWZlc3QgZXh0ZW5kcyBNYW5pZmVzdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBMb3dMYXRlbmN5SGxzTWFuaWZlc3RDb25maWd1cmF0aW9uKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBfYmluZChjb250ZXh0OiBNYW5pZmVzdEJpbmRDb250ZXh0KTogdm9pZCB7XG4gICAgdmFsaWRhdGVNYW5pZmVzdENvbmZpZ3VyYXRpb24odGhpcy5jb25maWcpO1xuICAgIGNvbnRleHQubGxIbHNNYW5pZmVzdHMucHVzaChidWlsZEhsc01hbmlmZXN0Q29uZmlndXJhdGlvbih0aGlzLmNvbmZpZywgY29udGV4dC5zZWdtZW50Py5zZWdtZW50RHVyYXRpb24pKTtcbiAgfVxufVxuXG4vKipcbiAqIERBU0ggTWFuaWZlc3QgaW1wbGVtZW50YXRpb25cbiAqL1xuY2xhc3MgRGFzaE1hbmlmZXN0IGV4dGVuZHMgTWFuaWZlc3Qge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogRGFzaE1hbmlmZXN0Q29uZmlndXJhdGlvbikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgX2JpbmQoY29udGV4dDogTWFuaWZlc3RCaW5kQ29udGV4dCk6IHZvaWQge1xuICAgIHZhbGlkYXRlTWFuaWZlc3RDb25maWd1cmF0aW9uKHRoaXMuY29uZmlnKTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy51dGNUaW1pbmdNb2RlID09PSBEYXNoVXRjVGltaW5nTW9kZS5VVENfRElSRUNUICYmIHRoaXMuY29uZmlnLnV0Y1RpbWluZ1NvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBVdGNEaXJlY3RUaW1pbmdTb3VyY2VgLCAnVVRDIERpcmVjdCBjb25maWd1cmVkIHdpdGggYSB0aW1pbmcgc291cmNlLCBlbnN1cmUgdGltaW5nIHNvdXJjZSBpcyB1bmRlZmluZWQgdG8gdXNlIFVUQyBEaXJlY3QuJyk7XG4gICAgfVxuXG4gICAgY29udGV4dC5kYXNoTWFuaWZlc3RzLnB1c2goYnVpbGREYXNoTWFuaWZlc3RDb25maWd1cmF0aW9uKHRoaXMuY29uZmlnLCBjb250ZXh0LnNlZ21lbnQpKTtcbiAgfVxufVxuXG4vKipcbiAqIE1TUyBNYW5pZmVzdCBpbXBsZW1lbnRhdGlvblxuICovXG5jbGFzcyBNc3NNYW5pZmVzdCBleHRlbmRzIE1hbmlmZXN0IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb25maWc6IE1zc01hbmlmZXN0Q29uZmlndXJhdGlvbikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgX2JpbmQoY29udGV4dDogTWFuaWZlc3RCaW5kQ29udGV4dCk6IHZvaWQge1xuICAgIHZhbGlkYXRlTWFuaWZlc3RDb25maWd1cmF0aW9uKHRoaXMuY29uZmlnKTtcbiAgICBjb250ZXh0Lm1zc01hbmlmZXN0cy5wdXNoKGJ1aWxkTXNzTWFuaWZlc3RDb25maWd1cmF0aW9uKHRoaXMuY29uZmlnKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBjb250YWluZXIgdG8gYXR0YWNoIHRvIHRoaXMgb3JpZ2luIGVuZHBvaW50LlxuICogQSBjb250YWluZXIgdHlwZSBpcyBhIGZpbGUgZm9ybWF0IHRoYXQgZW5jYXBzdWxhdGVzIG9uZSBvciBtb3JlIG1lZGlhIHN0cmVhbXMsIHN1Y2ggYXMgYXVkaW8gYW5kIHZpZGVvLCBpbnRvIGEgc2luZ2xlIGZpbGUuIFlvdSBjYW4ndCBjaGFuZ2UgdGhlIGNvbnRhaW5lciB0eXBlIGFmdGVyIHlvdSBjcmVhdGUgdGhlIGVuZHBvaW50LlxuICovXG5leHBvcnQgZW51bSBDb250YWluZXJUeXBlIHtcbiAgLyoqXG4gICAqIFRTIENvbnRhaW5lciBUeXBlXG4gICAqL1xuICBUUz0nVFMnLFxuICAvKipcbiAgICogQ01BRiBDb250YWluZXIgVHlwZVxuICAgKi9cbiAgQ01BRj0nQ01BRicsXG4gIC8qKlxuICAgKiBJU00gQ29udGFpbmVyIFR5cGUgKE1pY3Jvc29mdCBTbW9vdGggU3RyZWFtaW5nKVxuICAgKi9cbiAgSVNNPSdJU00nLFxufVxuXG4vKipcbiAqIEVuY3J5cHRpb24gbWV0aG9kcyBmb3IgQ01BRiBjb250YWluZXIgdHlwZS5cbiAqL1xuZXhwb3J0IGVudW0gQ21hZkVuY3J5cHRpb25NZXRob2Qge1xuICAvKipcbiAgICogQ29tbW9uIEVuY3J5cHRpb24gU2NoZW1lIChDRU5DKSAtIGNvbXBhdGlibGUgd2l0aCBQbGF5UmVhZHksIFdpZGV2aW5lLCBhbmQgSXJkZXRvIERSTSBzeXN0ZW1zLlxuICAgKi9cbiAgQ0VOQyA9ICdDRU5DJyxcbiAgLyoqXG4gICAqIENvbW1vbiBFbmNyeXB0aW9uIFNjaGVtZSB3aXRoIENCQ1MgbW9kZSAtIGNvbXBhdGlibGUgd2l0aCBQbGF5UmVhZHksIFdpZGV2aW5lLCBhbmQgRmFpclBsYXkgRFJNIHN5c3RlbXMuXG4gICAqL1xuICBDQkNTID0gJ0NCQ1MnLFxufVxuXG4vKipcbiAqIEVuY3J5cHRpb24gbWV0aG9kcyBmb3IgVFMgY29udGFpbmVyIHR5cGUuXG4gKi9cbmV4cG9ydCBlbnVtIFRzRW5jcnlwdGlvbk1ldGhvZCB7XG4gIC8qKlxuICAgKiBBRVMtMTI4IGVuY3J5cHRpb24gLSByZXF1aXJlcyBDbGVhciBLZXkgQUVTIDEyOCBEUk0gc3lzdGVtLlxuICAgKi9cbiAgQUVTXzEyOCA9ICdBRVNfMTI4JyxcbiAgLyoqXG4gICAqIFNhbXBsZS1sZXZlbCBBRVMgZW5jcnlwdGlvbiAtIHJlcXVpcmVzIEZhaXJQbGF5IERSTSBzeXN0ZW0uXG4gICAqL1xuICBTQU1QTEVfQUVTID0gJ1NBTVBMRV9BRVMnLFxufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBhdWRpbyBlbmNyeXB0aW9uIHByZXNldHMuXG4gKi9cbmV4cG9ydCBlbnVtIFByZXNldFNwZWtlMjBBdWRpbyB7XG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBhdWRpbyB0cmFja3MgaW4geW91ciBzdHJlYW0uXG4gICAqL1xuICBQUkVTRVRfQVVESU9fMT0nUFJFU0VUX0FVRElPXzEnLFxuICAvKipcbiAgICogVXNlIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgc3RlcmVvIGF1ZGlvIHRyYWNrcyBhbmQgb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBtdWx0aWNoYW5uZWwgYXVkaW8gdHJhY2tzLlxuICAgKi9cbiAgUFJFU0VUX0FVRElPXzI9J1BSRVNFVF9BVURJT18yJyxcbiAgLyoqXG4gICAqIFVzZSBvbmUgY29udGVudCBrZXkgdG8gZW5jcnlwdCBhbGwgb2YgdGhlIHN0ZXJlbyBhdWRpbyB0cmFja3MsIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgbXVsdGljaGFubmVsIGF1ZGlvIHRyYWNrcyB3aXRoIDMgdG8gNiBjaGFubmVscyxcbiAgICogYW5kIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgbXVsdGljaGFubmVsIGF1ZGlvIHRyYWNrcyB3aXRoIG1vcmUgdGhhbiA2IGNoYW5uZWxzLlxuICAgKi9cbiAgUFJFU0VUX0FVRElPXzM9J1BSRVNFVF9BVURJT18zJyxcbiAgLyoqXG4gICAqIFVzZSB0aGUgc2FtZSBjb250ZW50IGtleSBmb3IgYWxsIG9mIHRoZSBhdWRpbyBhbmQgdmlkZW8gdHJhY2tzIGluIHlvdXIgc3RyZWFtLlxuICAgKi9cbiAgU0hBUkVEPSdTSEFSRUQnLFxuICAvKipcbiAgICogRG9uJ3QgZW5jcnlwdCBhbnkgb2YgdGhlIGF1ZGlvIHRyYWNrcyBpbiB5b3VyIHN0cmVhbS5cbiAgICovXG4gIFVORU5DUllQVEVEPSdVTkVOQ1JZUFRFRCcsXG59XG5cbi8qKlxuICogVGhlIFNQRUtFIFZlcnNpb24gMi4wIHByZXNldCB2aWRlbyBhc3NvY2lhdGVkIHdpdGggdGhlIGVuY3J5cHRpb24gY29udHJhY3QgY29uZmlndXJhdGlvbiBvZiB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICpcbiAqIEEgY29sbGVjdGlvbiBvZiB2aWRlbyBlbmNyeXB0aW9uIHByZXNldHMuXG4gKi9cbmV4cG9ydCBlbnVtIFByZXNldFNwZWtlMjBWaWRlbyB7XG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSB2aWRlbyB0cmFja3MgaW4geW91ciBzdHJlYW0uXG4gICAqL1xuICBQUkVTRVRfVklERU9fMT0nUFJFU0VUX1ZJREVPXzEnLFxuICAvKipcbiAgICogVXNlIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgU0QgdmlkZW8gdHJhY2tzIGFuZCBvbmUgY29udGVudCBrZXkgZm9yIGFsbCBIRCBhbmQgaGlnaGVyIHJlc29sdXRpb25zIHZpZGVvIHRyYWNrcy5cbiAgICovXG4gIFBSRVNFVF9WSURFT18yPSdQUkVTRVRfVklERU9fMicsXG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBTRCB2aWRlbyB0cmFja3MsIG9uZSBjb250ZW50IGtleSBmb3IgSEQgdmlkZW8gdHJhY2tzIGFuZCBvbmUgY29udGVudCBrZXkgZm9yIGFsbCBVSEQgdmlkZW8gdHJhY2tzLlxuICAgKi9cbiAgUFJFU0VUX1ZJREVPXzM9J1BSRVNFVF9WSURFT18zJyxcbiAgLyoqXG4gICAqIFVzZSBvbmUgY29udGVudCBrZXkgdG8gZW5jcnlwdCBhbGwgb2YgdGhlIFNEIHZpZGVvIHRyYWNrcywgb25lIGNvbnRlbnQga2V5IGZvciBIRCB2aWRlbyB0cmFja3MsXG4gICAqIG9uZSBjb250ZW50IGtleSBmb3IgYWxsIFVIRDEgdmlkZW8gdHJhY2tzIGFuZCBvbmUgY29udGVudCBrZXkgZm9yIGFsbCBVSEQyIHZpZGVvIHRyYWNrcy5cbiAgICovXG4gIFBSRVNFVF9WSURFT180PSdQUkVTRVRfVklERU9fNCcsXG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBTRCB2aWRlbyB0cmFja3MsIG9uZSBjb250ZW50IGtleSBmb3IgSEQxIHZpZGVvIHRyYWNrcywgb25lIGNvbnRlbnQga2V5IGZvciBIRDIgdmlkZW8gdHJhY2tzLFxuICAgKiBvbmUgY29udGVudCBrZXkgZm9yIGFsbCBVSEQxIHZpZGVvIHRyYWNrcyBhbmQgb25lIGNvbnRlbnQga2V5IGZvciBhbGwgVUhEMiB2aWRlbyB0cmFja3MuXG4gICAqL1xuICBQUkVTRVRfVklERU9fNT0nUFJFU0VUX1ZJREVPXzUnLFxuICAvKipcbiAgICogVXNlIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgU0QgdmlkZW8gdHJhY2tzLCBvbmUgY29udGVudCBrZXkgZm9yIEhEMSB2aWRlbyB0cmFja3MsIG9uZSBjb250ZW50IGtleSBmb3IgSEQyIHZpZGVvIHRyYWNrc1xuICAgKiBhbmQgb25lIGNvbnRlbnQga2V5IGZvciBhbGwgVUhEIHZpZGVvIHRyYWNrcy5cbiAgICovXG4gIFBSRVNFVF9WSURFT182PSdQUkVTRVRfVklERU9fNicsXG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBTRCtIRDEgdmlkZW8gdHJhY2tzLCBvbmUgY29udGVudCBrZXkgZm9yIEhEMiB2aWRlbyB0cmFja3MgYW5kIG9uZSBjb250ZW50IGtleSBmb3IgYWxsIFVIRCB2aWRlbyB0cmFja3MuXG4gICAqL1xuICBQUkVTRVRfVklERU9fNz0nUFJFU0VUX1ZJREVPXzcnLFxuICAvKipcbiAgICogVXNlIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgU0QrSEQxIHZpZGVvIHRyYWNrcywgb25lIGNvbnRlbnQga2V5IGZvciBIRDIgdmlkZW8gdHJhY2tzLCBvbmUgY29udGVudCBrZXkgZm9yIGFsbCBVSEQxXG4gICAqIHZpZGVvIHRyYWNrcyBhbmQgb25lIGNvbnRlbnQga2V5IGZvciBhbGwgVUhEMiB2aWRlbyB0cmFja3MuXG4gICAqL1xuICBQUkVTRVRfVklERU9fOD0nUFJFU0VUX1ZJREVPXzgnLFxuICAvKipcbiAgICogVXNlIHRoZSBzYW1lIGNvbnRlbnQga2V5IGZvciBhbGwgb2YgdGhlIHZpZGVvIGFuZCBhdWRpbyB0cmFja3MgaW4geW91ciBzdHJlYW0uXG4gICAqL1xuICBTSEFSRUQ9J1NIQVJFRCcsXG4gIC8qKlxuICAgKiBEb24ndCBlbmNyeXB0IGFueSBvZiB0aGUgdmlkZW8gdHJhY2tzIGluIHlvdXIgc3RyZWFtLlxuICAgKi9cbiAgVU5FTkNSWVBURUQ9J1VORU5DUllQVEVEJyxcbn1cblxuLyoqXG4gKiBFbmRwb2ludCBlcnJvciBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBlbnVtIEVuZHBvaW50RXJyb3JDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBtYW5pZmVzdCBzdGFsbGVkIGFuZCB0aGVyZSBhcmUgbm8gbmV3IHNlZ21lbnRzIG9yIHBhcnRzLlxuICAgKi9cbiAgU1RBTEVfTUFOSUZFU1Q9J1NUQUxFX01BTklGRVNUJyxcbiAgLyoqXG4gICAqIFRoZXJlIGlzIGEgZ2FwIGluIHRoZSBtYW5pZmVzdC5cbiAgICovXG4gIElOQ09NUExFVEVfTUFOSUZFU1Q9J0lOQ09NUExFVEVfTUFOSUZFU1QnLFxuICAvKipcbiAgICogS2V5IHJvdGF0aW9uIGlzIGVuYWJsZWQgYnV0IHdlJ3JlIHVuYWJsZSB0byBmZXRjaCB0aGUga2V5IGZvciB0aGUgY3VycmVudCBrZXkgcGVyaW9kLlxuICAgKi9cbiAgTUlTU0lOR19EUk1fS0VZPSdNSVNTSU5HX0RSTV9LRVknLFxuICAvKipcbiAgICogVGhlIHNlZ21lbnRzIHdoaWNoIGNvbnRhaW4gc2xhdGUgY29udGVudCBhcmUgY29uc2lkZXJlZCB0byBiZSBtaXNzaW5nIGNvbnRlbnQuXG4gICAqL1xuICBTTEFURV9JTlBVVD0nU0xBVEVfSU5QVVQnLFxufVxuXG4vKipcbiAqIFNDVEUtMzUgbWVzc2FnZSB0eXBlIG9wdGlvbnMgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgZW51bSBTY3RlTWVzc2FnZVR5cGUge1xuICAvKipcbiAgICogT3B0aW9uIGZvciBTUExJQ0VfSU5TRVJULlxuICAgKi9cbiAgU1BMSUNFX0lOU0VSVD0nU1BMSUNFX0lOU0VSVCcsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIEJSRUFLLlxuICAgKi9cbiAgQlJFQUs9J0JSRUFLJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgUFJPVklERVJfQURWRVJUSVNFTUVOVC5cbiAgICovXG4gIFBST1ZJREVSX0FEVkVSVElTRU1FTlQ9J1BST1ZJREVSX0FEVkVSVElTRU1FTlQnLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBESVNUUklCVVRPUl9BRFZFUlRJU0VNRU5ULlxuICAgKi9cbiAgRElTVFJJQlVUT1JfQURWRVJUSVNFTUVOVD0nRElTVFJJQlVUT1JfQURWRVJUSVNFTUVOVCcsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIFBST1ZJREVSX1BMQUNFTUVOVF9PUFBPUlRVTklUWS5cbiAgICovXG4gIFBST1ZJREVSX1BMQUNFTUVOVF9PUFBPUlRVTklUWT0nUFJPVklERVJfUExBQ0VNRU5UX09QUE9SVFVOSVRZJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgRElTVFJJQlVUT1JfUExBQ0VNRU5UX09QUE9SVFVOSVRZLlxuICAgKi9cbiAgRElTVFJJQlVUT1JfUExBQ0VNRU5UX09QUE9SVFVOSVRZPSdESVNUUklCVVRPUl9QTEFDRU1FTlRfT1BQT1JUVU5JVFknLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBQUk9WSURFUl9PVkVSTEFZX1BMQUNFTUVOVF9PUFBPUlRVTklUWS5cbiAgICovXG4gIFBST1ZJREVSX09WRVJMQVlfUExBQ0VNRU5UX09QUE9SVFVOSVRZPSdQUk9WSURFUl9PVkVSTEFZX1BMQUNFTUVOVF9PUFBPUlRVTklUWScsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIERJU1RSSUJVVE9SX09WRVJMQVlfUExBQ0VNRU5UX09QUE9SVFVOSVRZLlxuICAgKi9cbiAgRElTVFJJQlVUT1JfT1ZFUkxBWV9QTEFDRU1FTlRfT1BQT1JUVU5JVFk9J0RJU1RSSUJVVE9SX09WRVJMQVlfUExBQ0VNRU5UX09QUE9SVFVOSVRZJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgUFJPR1JBTS5cbiAgICovXG4gIFBST0dSQU09J1BST0dSQU0nLFxufVxuXG4vKipcbiAqIENvbnRyb2xzIHdoZXRoZXIgU0NURS0zNSBtZXNzYWdlcyBhcmUgaW5jbHVkZWQgaW4gc2VnbWVudCBmaWxlcy5cbiAqL1xuZXhwb3J0IGVudW0gU2N0ZUluU2VnbWVudHMge1xuICAvKipcbiAgICogU0NURS0zNSBtZXNzYWdlcyBhcmUgbm90IGluY2x1ZGVkIGluIHNlZ21lbnRzLlxuICAgKi9cbiAgTk9ORSA9ICdOT05FJyxcbiAgLyoqXG4gICAqIFNDVEUtMzUgbWVzc2FnZXMgYXJlIGVtYmVkZGVkIGluIHNlZ21lbnQgZGF0YS5cbiAgICpcbiAgICogRm9yIERBU0ggbWFuaWZlc3RzLCB3aGVuIHNldCB0byBBTEwsIGFuIEluYmFuZEV2ZW50U3RyZWFtIHRhZyBzaWduYWxzXG4gICAqIHRoYXQgU0NURSBtZXNzYWdlcyBhcmUgcHJlc2VudCBpbiBzZWdtZW50cy5cbiAgICovXG4gIEFMTCA9ICdBTEwnLFxufVxuXG4vKipcbiAqIE9yaWdpbiBFbmRwb2ludCBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJT3JpZ2luRW5kcG9pbnQgZXh0ZW5kcyBJUmVzb3VyY2UsIElPcmlnaW5FbmRwb2ludFJlZiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbCBncm91cCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbiBlbmRwb2ludCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjaGFubmVsR3JvdXBOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjaGFubmVsIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWxOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBvcmlnaW4gZW5kcG9pbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luRW5kcG9pbnROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5FbmRwb2ludEFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB0aGUgb3JpZ2luIGVuZHBvaW50IHdhcyBjcmVhdGVkLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVkQXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRlIGFuZCB0aW1lIHRoZSBvcmlnaW4gZW5kcG9pbnQgd2FzIG1vZGlmaWVkLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBtb2RpZmllZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSExTIG1hbmlmZXN0IFVSTHMgZm9yIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGhsc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgTG93IExhdGVuY3kgSExTIG1hbmlmZXN0IFVSTHMgZm9yIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGxvd0xhdGVuY3lIbHNNYW5pZmVzdFVybHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIERBU0ggbWFuaWZlc3QgVVJMcyBmb3IgdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZGFzaE1hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgTVNTIG1hbmlmZXN0IFVSTHMgZm9yIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IG1zc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgb3JpZ2luIGVuZHBvaW50IHBvbGljeS5cbiAgICpcbiAgICogWW91IGNhbiBvbmx5IGFkZCAxIE9yaWdpbkVuZHBvaW50UG9saWN5IHRvIGFuIE9yaWdpbkVuZHBvaW50LlxuICAgKiBJZiB5b3UgaGF2ZSBhbHJlYWR5IGRlZmluZWQgb25lLCBpdCB3aWxsIGFwcGVuZCB0byB0aGUgcG9saWN5IGFscmVhZHkgY3JlYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlbWVudCAtIFRoZSBwb2xpY3kgc3RhdGVtZW50IHRvIGFkZFxuICAgKi9cbiAgYWRkVG9SZXNvdXJjZVBvbGljeShzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCk6IEFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0cmljTmFtZSBuYW1lIG9mIHRoZSBtZXRyaWMuXG4gICAqIEBwYXJhbSBwcm9wcyBtZXRyaWMgb3B0aW9ucy5cbiAgICovXG4gIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJucyBNZXRyaWMgZm9yIEluZ3Jlc3MgQnl0ZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNJbmdyZXNzQnl0ZXMob3B0aW9ucz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgTWV0cmljIGZvciBFZ3Jlc3MgQnl0ZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNFZ3Jlc3NCeXRlcyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgTWV0cmljIGZvciBJbmdyZXNzIHJlc3BvbnNlIHRpbWVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdmVyYWdlIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgbWV0cmljSW5ncmVzc1Jlc3BvbnNlVGltZShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgTWV0cmljIGZvciBFZ3Jlc3MgUmVzcG9uc2UgdGltZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGF2ZXJhZ2Ugb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNFZ3Jlc3NSZXNwb25zZVRpbWUocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIE1ldHJpYyBmb3IgRWdyZXNzIFJlcXVlc3QgQ291bnRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNFZ3Jlc3NSZXF1ZXN0Q291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIE1ldHJpYyBmb3IgSW5ncmVzcyBSZXF1ZXN0IENvdW50XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgbWV0cmljSW5ncmVzc1JlcXVlc3RDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG59XG5cbi8qKlxuICogRFJNIHNldHRpbmdzIGtleXMgZm9yIG1hbmlmZXN0IGZpbHRlciBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZW51bSBEcm1TZXR0aW5nc0tleSB7XG4gIC8qKlxuICAgKiBFeGNsdWRlIEVYVC1YLVNFU1NJT04tS0VZIHRhZ3MgZnJvbSBITFMgYW5kIExMLUhMUyBtdWx0aXZhcmlhbnQgcGxheWxpc3RzLlxuICAgKlxuICAgKiBUaGlzIGNhbiBpbXByb3ZlIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgSExTIGNsaWVudHMgdGhhdCBoYXZlIGlzc3Vlc1xuICAgKiBwcm9jZXNzaW5nIHNlc3Npb24ga2V5cywgb3IgcHJvdmlkZSBtb3JlIGdyYW51bGFyIGFjY2VzcyBjb250cm9sIHdoZW5cbiAgICogdXNpbmcgbWFuaWZlc3QgZmlsdGVyaW5nLlxuICAgKi9cbiAgRVhDTFVERV9TRVNTSU9OX0tFWVMgPSAnZXhjbHVkZV9zZXNzaW9uX2tleXMnLFxufVxuXG4vKipcbiAqIEZpbHRlciBjb25maWd1cmF0aW9uIGluY2x1ZGVzIHNldHRpbmdzIGZvciBtYW5pZmVzdCBmaWx0ZXJpbmcsIHN0YXJ0IGFuZCBlbmQgdGltZXMsIGFuZCB0aW1lIGRlbGF5IHRoYXQgYXBwbHkgdG8gYWxsIG9mIHlvdXIgZWdyZXNzIHJlcXVlc3RzIGZvciB0aGlzIG1hbmlmZXN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogT3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBjbGlwIHN0YXJ0IHRpbWUgZm9yIGFsbCBvZiB5b3VyIG1hbmlmZXN0IGVncmVzcyByZXF1ZXN0cy5cbiAgICogV2hlbiB5b3UgaW5jbHVkZSBjbGlwIHN0YXJ0IHRpbWUsIG5vdGUgdGhhdCB5b3UgY2Fubm90IHVzZSBjbGlwIHN0YXJ0IHRpbWUgcXVlcnkgcGFyYW1ldGVycyBmb3IgdGhpcyBtYW5pZmVzdCdzIGVuZHBvaW50IFVSTC5cbiAgICpcbiAgICogVGhpcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIFVUQyB0aW1lc3RhbXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gY2xpcCBzdGFydCB0aW1lXG4gICAqL1xuICByZWFkb25seSBjbGlwU3RhcnRUaW1lPzogRGF0ZTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgZW5kIHRpbWUgZm9yIGFsbCBvZiB5b3VyIG1hbmlmZXN0IGVncmVzcyByZXF1ZXN0cy5cbiAgICogV2hlbiB5b3UgaW5jbHVkZSBlbmQgdGltZSwgbm90ZSB0aGF0IHlvdSBjYW5ub3QgdXNlIGVuZCB0aW1lIHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHRoaXMgbWFuaWZlc3QncyBlbmRwb2ludCBVUkwuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBVVEMgdGltZXN0YW1wLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGVuZCB0aW1lXG4gICAqL1xuICByZWFkb25seSBlbmQ/OiBEYXRlO1xuICAvKipcbiAgICogT3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBzdGFydCB0aW1lIGZvciBhbGwgb2YgeW91ciBtYW5pZmVzdCBlZ3Jlc3MgcmVxdWVzdHMuXG4gICAqIFdoZW4geW91IGluY2x1ZGUgc3RhcnQgdGltZSwgbm90ZSB0aGF0IHlvdSBjYW5ub3QgdXNlIHN0YXJ0IHRpbWUgcXVlcnkgcGFyYW1ldGVycyBmb3IgdGhpcyBtYW5pZmVzdCdzIGVuZHBvaW50IFVSTC5cbiAgICpcbiAgICogVGhpcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIFVUQyB0aW1lc3RhbXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gc3RhcnQgdGltZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnQ/OiBEYXRlO1xuICAvKipcbiAgICogT3B0aW9uYWxseSBzcGVjaWZ5IG9uZSBvciBtb3JlIG1hbmlmZXN0IGZpbHRlcnMgZm9yIGFsbCBvZiB5b3VyIG1hbmlmZXN0IGVncmVzcyByZXF1ZXN0cy5cbiAgICogV2hlbiB5b3UgaW5jbHVkZSBhIG1hbmlmZXN0IGZpbHRlciwgbm90ZSB0aGF0IHlvdSBjYW5ub3QgdXNlIGFuIGlkZW50aWNhbCBtYW5pZmVzdCBmaWx0ZXIgcXVlcnkgcGFyYW1ldGVyIGZvciB0aGlzIG1hbmlmZXN0J3MgZW5kcG9pbnQgVVJMLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIG1hbmlmZXN0IGZpbHRlcnNcbiAgICovXG4gIHJlYWRvbmx5IG1hbmlmZXN0RmlsdGVyPzogTWFuaWZlc3RGaWx0ZXJbXTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgdGltZSBkZWxheSBmb3IgYWxsIG9mIHlvdXIgbWFuaWZlc3QgZWdyZXNzIHJlcXVlc3RzLiBFbnRlciBhIHZhbHVlIHRoYXQgaXMgc21hbGxlciB0aGFuIHlvdXIgZW5kcG9pbnQncyBzdGFydG92ZXIgd2luZG93LlxuICAgKiBXaGVuIHlvdSBpbmNsdWRlIHRpbWUgZGVsYXksIG5vdGUgdGhhdCB5b3UgY2Fubm90IHVzZSB0aW1lIGRlbGF5IHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHRoaXMgbWFuaWZlc3QncyBlbmRwb2ludCBVUkwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gdGltZSBkZWxheVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZURlbGF5PzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBEUk0gc2V0dGluZ3MgZm9yIG1hbmlmZXN0IGVncmVzcyByZXF1ZXN0cy5cbiAgICpcbiAgICogV2hlbiB5b3UgaW5jbHVkZSBhIERSTSBzZXR0aW5nLCBub3RlIHRoYXQgeW91IGNhbm5vdCB1c2UgYW4gaWRlbnRpY2FsXG4gICAqIERSTSBzZXR0aW5nIHF1ZXJ5IHBhcmFtZXRlciBmb3IgdGhpcyBtYW5pZmVzdCdzIGVuZHBvaW50IFVSTC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBEUk0gc2V0dGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IGRybVNldHRpbmdzPzogRHJtU2V0dGluZ3NLZXlbXTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyBhIFN0YXJ0VGFnLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0VGFnT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTcGVjaWZ5IHRoZSB2YWx1ZSBmb3IgUFJFQ0lTRSB3aXRoaW4geW91ciBFWFQtWC1TVEFSVCB0YWcuXG4gICAqXG4gICAqIExlYXZlIGJsYW5rLCBvciBjaG9vc2UgZmFsc2UsIHRvIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBOTy4gQ2hvb3NlIHRydWUgdG8gdXNlIHRoZSB2YWx1ZSBZRVMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBwcmVjaXNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgZm9yIGNyZWF0aW5nIEVYVC1YLVNUQVJUIHRhZ3MgaW4gSExTIHBsYXlsaXN0cy5cbiAqXG4gKiBUaGUgRVhULVgtU1RBUlQgdGFnIGluZGljYXRlcyBhIHByZWZlcnJlZCBwb2ludCBhdCB3aGljaCB0byBzdGFydCBwbGF5aW5nIGEgcGxheWxpc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFydFRhZyB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzdGFydCB0YWcgd2l0aCBhIHRpbWUgb2Zmc2V0LlxuICAgKlxuICAgKiBAcGFyYW0gdGltZU9mZnNldCBUaGUgdGltZSBvZmZzZXQgaW4gc2Vjb25kcy4gQ2FuIGJlIHBvc2l0aXZlIChmb3J3YXJkIGZyb20gc3RhcnQpIG9yIG5lZ2F0aXZlIChiYWNrIGZyb20gbGl2ZSBlZGdlKS5cbiAgICogICAtIElmIHBvc2l0aXZlOiBtdXN0IGJlIGxlc3MgdGhhbiAobWFuaWZlc3QgZHVyYXRpb24gLSAzIMOXIHNlZ21lbnQgZHVyYXRpb24pXG4gICAqICAgLSBJZiBuZWdhdGl2ZTogYWJzb2x1dGUgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gKDMgw5cgc2VnbWVudCBkdXJhdGlvbikgYW5kIGxlc3MgdGhhbiBtYW5pZmVzdCBkdXJhdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBBZGRpdGlvbmFsIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodGltZU9mZnNldDogbnVtYmVyLCBvcHRpb25zPzogU3RhcnRUYWdPcHRpb25zKTogU3RhcnRUYWcge1xuICAgIHJldHVybiB7XG4gICAgICB0aW1lT2Zmc2V0LFxuICAgICAgcHJlY2lzZTogb3B0aW9ucyAmJiBvcHRpb25zLnByZWNpc2UgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucHJlY2lzZSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0YXJ0IHRhZyB3aXRoIHByZWNpc2UgcG9zaXRpb25pbmcgZW5hYmxlZCAoUFJFQ0lTRT1ZRVMpLlxuICAgKlxuICAgKiBAcGFyYW0gdGltZU9mZnNldCBUaGUgdGltZSBvZmZzZXQgaW4gc2Vjb25kcyAocG9zaXRpdmUgb3IgbmVnYXRpdmUpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHdpdGhQcmVjaXNlKHRpbWVPZmZzZXQ6IG51bWJlcik6IFN0YXJ0VGFnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGltZU9mZnNldCxcbiAgICAgIHByZWNpc2U6IHRydWUsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIEVYVC1YLVNUQVJUIHRhZyBpbiBITFMgcGxheWxpc3RzLlxuICpcbiAqIFVzZSB0aGUgYFN0YXJ0VGFnYCBoZWxwZXIgY2xhc3MgdG8gY3JlYXRlIGluc3RhbmNlcyB3aXRoIHZhbGlkYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRUYWcge1xuICAvKipcbiAgICogU3BlY2lmeSB0aGUgdmFsdWUgZm9yIFBSRUNJU0Ugd2l0aGluIHlvdXIgRVhULVgtU1RBUlQgdGFnLlxuICAgKlxuICAgKiBMZWF2ZSBibGFuaywgb3IgY2hvb3NlIGZhbHNlLCB0byB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgTk8uIENob29zZSB0cnVlIHRvIHVzZSB0aGUgdmFsdWUgWUVTLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlY2lzZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTcGVjaWZ5IHRoZSB2YWx1ZSBmb3IgVElNRS1PRkZTRVQgd2l0aGluIHlvdXIgRVhULVgtU1RBUlQgdGFnLlxuICAgKlxuICAgKiBFbnRlciBhIHNpZ25lZCBmbG9hdGluZyBwb2ludCB2YWx1ZSB3aGljaCwgaWYgcG9zaXRpdmUsIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBjb25maWd1cmVkXG4gICAqIG1hbmlmZXN0IGR1cmF0aW9uIG1pbnVzIHRocmVlIHRpbWVzIHRoZSBjb25maWd1cmVkIHNlZ21lbnQgdGFyZ2V0IGR1cmF0aW9uLiBJZiBuZWdhdGl2ZSxcbiAgICogdGhlIGFic29sdXRlIHZhbHVlIG11c3QgYmUgbGFyZ2VyIHRoYW4gdGhyZWUgdGltZXMgdGhlIGNvbmZpZ3VyZWQgc2VnbWVudCB0YXJnZXQgZHVyYXRpb24sXG4gICAqIGFuZCB0aGUgYWJzb2x1dGUgdmFsdWUgbXVzdCBiZSBzbWFsbGVyIHRoYW4gdGhlIGNvbmZpZ3VyZWQgbWFuaWZlc3QgZHVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSB0aW1lT2Zmc2V0OiBudW1iZXI7XG59XG5cbi8qKlxuICogQmFzZSBtYW5pZmVzdCBjb25maWd1cmF0aW9uLlxuICovXG5pbnRlcmZhY2UgTWFuaWZlc3RDb25maWd1cmF0aW9uQmFzZSB7XG4gIC8qKlxuICAgKiBGaWx0ZXIgY29uZmlndXJhdGlvbiBpbmNsdWRlcyBzZXR0aW5ncyBmb3IgbWFuaWZlc3QgZmlsdGVyaW5nLCBzdGFydCBhbmQgZW5kIHRpbWVzLCBhbmQgdGltZSBkZWxheSB0aGF0IGFwcGx5IHRvIGFsbCBvZiB5b3VyIGVncmVzcyByZXF1ZXN0cyBmb3IgdGhpcyBtYW5pZmVzdC5cbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhcGFja2FnZS9sYXRlc3QvdXNlcmd1aWRlL21hbmlmZXN0LWZpbHRlci1xdWVyeS1wYXJhbWV0ZXJzLmh0bWxcbiAgICogQGRlZmF1bHQgLSBObyBmaWx0ZXIgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZmlsdGVyQ29uZmlndXJhdGlvbj86IEZpbHRlckNvbmZpZ3VyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgdG90YWwgZHVyYXRpb24gKGluIHNlY29uZHMpIG9mIHRoZSBtYW5pZmVzdCdzIGNvbnRlbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IDYwXG4gICAqL1xuICByZWFkb25seSBtYW5pZmVzdFdpbmRvdz86IER1cmF0aW9uO1xufVxuXG4vKipcbiAqIENob29zZSBob3cgYWQgbWFya2VycyBhcmUgaW5jbHVkZWQgaW4gdGhlIHBhY2thZ2VkIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBlbnVtIEFkTWFya2VyRGFzaCB7XG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIEJJTkFSWSAtIFRoZSBTQ1RFLTM1IG1hcmtlciBpcyBleHByZXNzZWQgYXMgYSBoZXgtc3RyaW5nIChCYXNlNjQgc3RyaW5nKSByYXRoZXIgdGhhbiBmdWxsIFhNTC5cbiAgICovXG4gIEJJTkFSWT0nQklOQVJZJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgWE1MIC0gVGhlIFNDVEUgbWFya2VyIGlzIGV4cHJlc3NlZCBmdWxseSBpbiBYTUwuXG4gICAqL1xuICBYTUw9J1hNTCcsXG59XG5cbi8qKlxuICogQ2hvb3NlIGhvdyBTQ1RFLTM1IGFkIG1hcmtlcnMgYXJlIGluY2x1ZGVkIGluIEhMUyBhbmQgTEwtSExTIG1hbmlmZXN0cy5cbiAqL1xuZXhwb3J0IGVudW0gQWRNYXJrZXJIbHMge1xuICAvKipcbiAgICogSW5zZXJ0IEVYVC1YLURBVEVSQU5HRSB0YWdzIHRvIHNpZ25hbCBhZCBjb250ZW50LlxuICAgKi9cbiAgREFURVJBTkdFID0gJ0RBVEVSQU5HRScsXG4gIC8qKlxuICAgKiBJbnNlcnQgZW5oYW5jZWQgU0NURS0zNSB0YWdzIGZvciBhZCBjb250ZW50LlxuICAgKi9cbiAgU0NURTM1X0VOSEFOQ0VEID0gJ1NDVEUzNV9FTkhBTkNFRCcsXG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgdmFyaWFibGUgdGhhdCBNZWRpYVBhY2thZ2UgdXNlcyBpbiB0aGUgbWVkaWEgYXR0cmlidXRlIG9mIHRoZSBTZWdtZW50VGVtcGxhdGUgdGFnLlxuICovXG5leHBvcnQgZW51bSBTZWdtZW50VGVtcGxhdGVGb3JtYXQge1xuICAvKipcbiAgICogT3B0aW9uIGZvciBudW1iZXIgd2l0aCB0aW1lbGluZS5cbiAgICovXG4gIE5VTUJFUl9XSVRIX1RJTUVMSU5FPSdOVU1CRVJfV0lUSF9USU1FTElORScsXG59XG5cbi8qKlxuICogVGhlIFVUQyB0aW1pbmcgbW9kZSBmb3IgREFTSC5cbiAqL1xuZXhwb3J0IGVudW0gRGFzaFV0Y1RpbWluZ01vZGUge1xuICAvKipcbiAgICogT3B0aW9uIGZvciBIVFRQX0hFQUQuXG4gICAqL1xuICBIVFRQX0hFQUQ9J0hUVFBfSEVBRCcsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIEhUVFBfSVNPLlxuICAgKi9cbiAgSFRUUF9JU089J0hUVFBfSVNPJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgSFRUUF9YU0RBVEUuXG4gICAqL1xuICBIVFRQX1hTREFURT0nSFRUUF9YU0RBVEUnLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBVVENfRElSRUNULlxuICAgKi9cbiAgVVRDX0RJUkVDVD0nVVRDX0RJUkVDVCcsXG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdHJpZ2dlcnMgd2hpY2ggY2F1c2UgQVdTIEVsZW1lbnRhbCBNZWRpYVBhY2thZ2UgdG8gY3JlYXRlIG1lZGlhIHByZXNlbnRhdGlvbiBkZXNjcmlwdGlvbiAoTVBEKSBwZXJpb2RzIGluIHRoZSBvdXRwdXQgbWFuaWZlc3QuXG4gKi9cbmV4cG9ydCBlbnVtIERhc2hQZXJpb2RUcmlnZ2VycyB7XG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIEFWQUlMUy5cbiAgICovXG4gIEFWQUlMUz0nQVZBSUxTJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgRFJNX0tFWV9ST1RBVElPTi5cbiAgICovXG4gIERSTV9LRVlfUk9UQVRJT049J0RSTV9LRVlfUk9UQVRJT04nLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBTT1VSQ0VfQ0hBTkdFUy5cbiAgICovXG4gIFNPVVJDRV9DSEFOR0VTPSdTT1VSQ0VfQ0hBTkdFUycsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIFNPVVJDRV9ESVNSVVBUSU9OUy5cbiAgICovXG4gIFNPVVJDRV9ESVNSVVBUSU9OUz0nU09VUkNFX0RJU1JVUFRJT05TJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgTk9ORS5cbiAgICovXG4gIE5PTkU9J05PTkUnLFxufVxuXG4vKipcbiAqIERSTSBzaWduYWxpbmcgZGV0ZXJtaW5lcyB0aGUgd2F5IERBU0ggbWFuaWZlc3Qgc2lnbmFscyB0aGUgRFJNIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBlbnVtIERybVNpZ25hbGxpbmcge1xuICAvKipcbiAgICogT3B0aW9uIGZvciBJTkRJVklEVUFMLlxuICAgKi9cbiAgSU5ESVZJRFVBTD0nSU5ESVZJRFVBTCcsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIFJFRkVSRU5DRUQuXG4gICAqL1xuICBSRUZFUkVOQ0VEPSdSRUZFUkVOQ0VEJyxcbn1cblxuLyoqXG4gKiBTVEFOREFSRCBpbmRpY2F0ZXMgYSBkZWZhdWx0IG1hbmlmZXN0LCB3aGljaCBpcyBjb21wYWN0ZWQuIE5PTkUgaW5kaWNhdGVzIGEgZnVsbCBtYW5pZmVzdC5cbiAqL1xuZXhwb3J0IGVudW0gRGFzaE1hbmlmZXN0Q29tcGFjdG5lc3Mge1xuICAvKipcbiAgICogU1RBTkRBUkRcbiAgICovXG4gIFNUQU5EQVJEPSdTVEFOREFSRCcsXG4gIC8qKlxuICAgKiBOT05FXG4gICAqL1xuICBOT05FPSdOT05FJyxcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBVUkxzIHRvIHVzZSBmb3IgcmV0cmlldmluZyBzZWdtZW50cy4gWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIGxvY2F0aW9ucyBhbmQgaW5kaWNhdGUgdGhlXG4gKiBwcmlvcml0eSBhbmQgd2VpZ2h0IGZvciB3aGVuIGVhY2ggc2hvdWxkIGJlIHVzZWQsIGZvciB1c2UgaW4gbXVsdGktQ0ROIHdvcmtmbG93cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoQmFzZVVybFByb3BlcnR5IHtcbiAgLyoqXG4gICAqIEZvciB1c2Ugd2l0aCBEVkItREFTSCBwcm9maWxlcyBvbmx5LiBUaGUgcHJpb3JpdHkgb2YgdGhpcyBsb2NhdGlvbiBmb3Igc2VydmluZyBzZWdtZW50cy4gVGhlIGxvd2VyIHRoZSBudW1iZXIsIHRoZSBoaWdoZXIgdGhlIHByaW9yaXR5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHByaW9yaXR5IHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgZHZiUHJpb3JpdHk/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGb3IgdXNlIHdpdGggRFZCLURBU0ggcHJvZmlsZXMgb25seS4gVGhlIHdlaWdodGluZyBmb3Igc291cmNlIGxvY2F0aW9ucyB0aGF0IGhhdmUgdGhlIHNhbWUgcHJpb3JpdHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gd2VpZ2h0IHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgZHZiV2VpZ2h0PzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBsb2NhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBzZXJ2aWNlIGxvY2F0aW9uIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZUxvY2F0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogQSBzb3VyY2UgbG9jYXRpb24gZm9yIHNlZ21lbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRm9yIHVzZSB3aXRoIERWQi1EQVNIIHByb2ZpbGVzIG9ubHkuIFRoZSBzZXR0aW5ncyBmb3IgZXJyb3IgcmVwb3J0aW5nIGZyb20gdGhlIHBsYXliYWNrIGRldmljZVxuICogdGhhdCB5b3Ugd2FudCBBV1MgRWxlbWVudGFsIE1lZGlhUGFja2FnZSB0byBwYXNzIHRocm91Z2ggdG8gdGhlIG1hbmlmZXN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hEdmJNZXRyaWNzUmVwb3J0aW5nIHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgcGxheWJhY2sgZGV2aWNlcyBwZXIgMTAwMCB0aGF0IHdpbGwgc2VuZCBlcnJvciByZXBvcnRzIHRvIHRoZSByZXBvcnRpbmcgVVJMLlxuICAgKiBUaGlzIHJlcHJlc2VudHMgdGhlIHByb2JhYmlsaXR5IHRoYXQgYSBwbGF5YmFjayBkZXZpY2Ugd2lsbCBiZSBhIHJlcG9ydGluZyBwbGF5ZXIgZm9yIHRoaXMgc2Vzc2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwcm9iYWJpbGl0eSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHByb2JhYmlsaXR5PzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIFVSTCB3aGVyZSBwbGF5YmFjayBkZXZpY2VzIHNlbmQgZXJyb3IgcmVwb3J0cy5cbiAgICovXG4gIHJlYWRvbmx5IHJlcG9ydGluZ1VybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEZvciB1c2Ugd2l0aCBEVkItREFTSCBwcm9maWxlcyBvbmx5LiBUaGUgc2V0dGluZ3MgZm9yIGZvbnQgZG93bmxvYWRzIHRoYXQgeW91IHdhbnQgQVdTIEVsZW1lbnRhbCBNZWRpYVBhY2thZ2UgdG8gcGFzcyB0aHJvdWdoIHRvIHRoZSBtYW5pZmVzdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoRHZiRm9udERvd25sb2FkIHtcbiAgLyoqXG4gICAqIFRoZSBmb250RmFtaWx5IG5hbWUgZm9yIHN1YnRpdGxlcywgYXMgZGVzY3JpYmVkIGluIEVCVS1UVC1EIFN1YnRpdGxpbmcgRGlzdHJpYnV0aW9uIEZvcm1hdC5cbiAgICogQGV4dGVybmFsIGh0dHBzOi8vdGVjaC5lYnUuY2gvcHVibGljYXRpb25zL3RlY2gzMzgwXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZm9udCBmYW1pbHkgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBmb250RmFtaWx5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG1pbWVUeXBlIG9mIHRoZSByZXNvdXJjZSB0aGF0J3MgYXQgdGhlIGZvbnQgZG93bmxvYWQgVVJMLlxuICAgKiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgZm9udCBNSU1FIHR5cGVzLCBzZWUgdGhlIE1QRUctREFTSCBQcm9maWxlIGZvciBUcmFuc3BvcnQgb2YgSVNPIEJNRkYgQmFzZWQgRFZCIFNlcnZpY2VzIG92ZXIgSVAgQmFzZWQgTmV0d29ya3MgZG9jdW1lbnQuXG4gICAqXG4gICAqIEBleHRlcm5hbCBodHRwczovL2R2Yi5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMjEvMDYvQTE2OHI0X01QRUctREFTSC1Qcm9maWxlLWZvci1UcmFuc3BvcnQtb2YtSVNPLUJNRkYtQmFzZWQtRFZCLVNlcnZpY2VzX0RyYWZ0LXRzXzEwMy0yODUtdjE0MF9Ob3ZlbWJlcl8yMDIxLnBkZlxuICAgKiBAZGVmYXVsdCAtIE5vIE1JTUUgdHlwZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IG1pbWVUeXBlPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIFVSTCBmb3IgZG93bmxvYWRpbmcgZm9udHMgZm9yIHN1YnRpdGxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBmb250IGRvd25sb2FkIFVSTCBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZm9udCBkb3dubG9hZCBhbmQgZXJyb3IgcmVwb3J0aW5nIGluZm9ybWF0aW9uIHRoYXQgeW91IHdhbnQgTWVkaWFQYWNrYWdlIHRvIHBhc3MgdGhyb3VnaCB0byB0aGUgbWFuaWZlc3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaER2YlNldHRpbmdzIHtcbiAgLyoqXG4gICAqIFBsYXliYWNrIGRldmljZSBlcnJvciByZXBvcnRpbmcgc2V0dGluZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZXJyb3IgbWV0cmljcyBjb25maWd1cmVkXG4gICAqL1xuICByZWFkb25seSBlcnJvck1ldHJpY3M/OiBEYXNoRHZiTWV0cmljc1JlcG9ydGluZ1tdO1xuICAvKipcbiAgICogU3VidGl0bGUgZm9udCBzZXR0aW5ncy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBmb250IGRvd25sb2FkIGNvbmZpZ3VyZWRcbiAgICovXG4gIHJlYWRvbmx5IGZvbnREb3dubG9hZD86IERhc2hEdmJGb250RG93bmxvYWQ7XG59XG5cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgY29udGVudCB0aGF0IHlvdSB3YW50IE1lZGlhUGFja2FnZSB0byBwYXNzIHRocm91Z2ggaW4gdGhlIG1hbmlmZXN0IHRvIHRoZSBwbGF5YmFjayBkZXZpY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaFByb2dyYW1JbmZvcm1hdGlvbiB7XG4gIC8qKlxuICAgKiBBIGNvcHlyaWdodCBzdGF0ZW1lbnQgYWJvdXQgdGhlIGNvbnRlbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gY29weXJpZ2h0IGluZm9ybWF0aW9uXG4gICAqL1xuICByZWFkb25seSBjb3B5cmlnaHQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbGFuZ3VhZ2UgY29kZSBmb3IgdGhpcyBtYW5pZmVzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBsYW5ndWFnZSBjb2RlIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2VDb2RlPzogc3RyaW5nO1xuICAvKipcbiAgICogQW4gYWJzb2x1dGUgVVJMIHRoYXQgY29udGFpbnMgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbnRlbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBVUkxcbiAgICovXG4gIHJlYWRvbmx5IG1vcmVJbmZvcm1hdGlvblVybD86IHN0cmluZztcbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250ZW50IHByb3ZpZGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHNvdXJjZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRpdGxlIGZvciB0aGUgbWFuaWZlc3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gdGl0bGUgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBUVE1MIFByb2ZpbGVcbiAqL1xuZXhwb3J0IGVudW0gVHRtbFByb2ZpbGUge1xuICAvKipcbiAgICogSU1TQ18xXG4gICAqL1xuICBJTVNDXzE9J0lNU0NfMScsXG4gIC8qKlxuICAgKiBFQlVfVFRfRF8xMDFcbiAgICovXG4gIEVCVV9UVF9EXzEwMT0nRUJVX1RUX0RfMTAxJyxcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgVFRNTCBzdWJ0aXRsZXMgaW4gREFTSCBtYW5pZmVzdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaFR0bWxDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBwcm9maWxlIHRoYXQgTWVkaWFQYWNrYWdlIHVzZXMgd2hlbiBzaWduYWxpbmcgc3VidGl0bGVzIGluIHRoZSBtYW5pZmVzdC4gSU1TQyBpcyB0aGUgZGVmYXVsdCBwcm9maWxlLiBFQlUtVFQtRCBwcm9kdWNlcyBzdWJ0aXRsZXMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGggdGhlIEVCVS1UVC1EIFRUTUwgcHJvZmlsZS4gTWVkaWFQYWNrYWdlIHBhc3NlcyB0aHJvdWdoIHN1YnRpdGxlIHN0eWxlcyB0byB0aGUgbWFuaWZlc3QuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IEVCVS1UVC1EIHN1YnRpdGxlcywgc2VlIEVCVS1UVC1EIFN1YnRpdGxpbmcgRGlzdHJpYnV0aW9uIEZvcm1hdC5cbiAgICpcbiAgICogQGV4dGVybmFsIGh0dHBzOi8vdGVjaC5lYnUuY2gvcHVibGljYXRpb25zL3RlY2gzMzgwXG4gICAqL1xuICByZWFkb25seSB0dG1sUHJvZmlsZTogVHRtbFByb2ZpbGU7XG5cbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3Igc3VidGl0bGVzIGluIERBU0ggbWFuaWZlc3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hTdWJ0aXRsZUNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogU2V0dGluZ3MgZm9yIFRUTUwgc3VidGl0bGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIFRUTUwgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgdHRtbENvbmZpZ3VyYXRpb24/OiBEYXNoVHRtbENvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogVGhlIGxheW91dCBvZiB0aGUgTVNTIG1hbmlmZXN0LlxuICovXG5leHBvcnQgZW51bSBNc3NNYW5pZmVzdExheW91dCB7XG4gIC8qKlxuICAgKiBGdWxsIG1hbmlmZXN0IGxheW91dC5cbiAgICovXG4gIEZVTEwgPSAnRlVMTCcsXG4gIC8qKlxuICAgKiBDb21wYWN0IG1hbmlmZXN0IGxheW91dC5cbiAgICovXG4gIENPTVBBQ1QgPSAnQ09NUEFDVCcsXG59XG5cbi8qKlxuICogVGhlIE1TUyBtYW5pZmVzdCBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1zc01hbmlmZXN0Q29uZmlndXJhdGlvbiBleHRlbmRzIE1hbmlmZXN0Q29uZmlndXJhdGlvbkJhc2Uge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG1hbmlmZXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgTVNTIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBtYW5pZmVzdE5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBsYXlvdXQgb2YgdGhlIE1TUyBtYW5pZmVzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgTXNzTWFuaWZlc3RMYXlvdXQuRlVMTFxuICAgKi9cbiAgcmVhZG9ubHkgbWFuaWZlc3RMYXlvdXQ/OiBNc3NNYW5pZmVzdExheW91dDtcbn1cblxuLyoqXG4gKiBUaGUgREFTSCBtYW5pZmVzdCBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNYW5pZmVzdENvbmZpZ3VyYXRpb25CYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBiYXNlIFVSTHMgdG8gdXNlIGZvciByZXRyaWV2aW5nIHNlZ21lbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGJhc2UgVVJMcyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IGJhc2VVcmxzPzogRGFzaEJhc2VVcmxQcm9wZXJ0eVtdO1xuICAvKipcbiAgICogVGhlIGxheW91dCBvZiB0aGUgREFTSCBtYW5pZmVzdCB0aGF0IE1lZGlhUGFja2FnZSBwcm9kdWNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgRGFzaE1hbmlmZXN0Q29tcGFjdG5lc3MuU1RBTkRBUkRcbiAgICovXG4gIHJlYWRvbmx5IGNvbXBhY3RuZXNzPzogRGFzaE1hbmlmZXN0Q29tcGFjdG5lc3M7XG4gIC8qKlxuICAgKiBGb3IgZW5kcG9pbnRzIHRoYXQgdXNlIHRoZSBEVkItREFTSCBwcm9maWxlIG9ubHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gRFZCIHNldHRpbmdzXG4gICAqL1xuICByZWFkb25seSBkdmJTZXR0aW5ncz86IERhc2hEdmJTZXR0aW5ncztcbiAgLyoqXG4gICAqIFRoZSBwcm9maWxlIHRoYXQgdGhlIG91dHB1dCBpcyBjb21wbGlhbnQgd2l0aC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwcm9maWxlcyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHByb2ZpbGVzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBEZXRhaWxzIGFib3V0IHRoZSBjb250ZW50IHRoYXQgeW91IHdhbnQgTWVkaWFQYWNrYWdlIHRvIHBhc3MgdGhyb3VnaCBpbiB0aGUgbWFuaWZlc3QgdG8gdGhlIHBsYXliYWNrIGRldmljZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwcm9ncmFtIGluZm9ybWF0aW9uXG4gICAqL1xuICByZWFkb25seSBwcm9ncmFtSW5mb3JtYXRpb24/OiBEYXNoUHJvZ3JhbUluZm9ybWF0aW9uO1xuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIERBU0ggc3VidGl0bGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHN1YnRpdGxlIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHN1YnRpdGxlQ29uZmlndXJhdGlvbj86IERhc2hTdWJ0aXRsZUNvbmZpZ3VyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWFuaWZlc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBEQVNIIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBtYW5pZmVzdE5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIERSTSBzaWduYWxpbmcgZGV0ZXJtaW5lcyB0aGUgd2F5IERBU0ggbWFuaWZlc3Qgc2lnbmFscyB0aGUgRFJNIGNvbnRlbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gRFJNIHNpZ25hbGluZyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IGRybVNpZ25hbGxpbmc/OiBEcm1TaWduYWxsaW5nO1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gYW1vdW50IG9mIGNvbnRlbnQgdGhhdCB0aGUgcGxheWVyIG11c3Qga2VlcCBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlci5cbiAgICpcbiAgICogQGRlZmF1bHQgNVxuICAgKi9cbiAgcmVhZG9ubHkgbWluQnVmZmVyVGltZT86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gYW1vdW50IG9mIHRpbWUgZm9yIHRoZSBwbGF5ZXIgdG8gd2FpdCBiZWZvcmUgcmVxdWVzdGluZyBhbiB1cGRhdGVkIG1hbmlmZXN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAyXG4gICAqL1xuICByZWFkb25seSBtaW5VcGRhdGVQZXJpb2Q/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hhdCB0cmlnZ2VycyBjYXVzZSBBV1MgRWxlbWVudGFsIE1lZGlhUGFja2FnZSB0byBjcmVhdGUgbWVkaWEgcHJlc2VudGF0aW9uIGRlc2NyaXB0aW9uIChNUEQpIHBlcmlvZHMgaW4gdGhlIG91dHB1dCBtYW5pZmVzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgW0Rhc2hQZXJpb2RUcmlnZ2Vycy5BVkFJTFMsIERhc2hQZXJpb2RUcmlnZ2Vycy5EUk1fS0VZX1JPVEFUSU9OLCBEYXNoUGVyaW9kVHJpZ2dlcnMuU09VUkNFX0NIQU5HRVMsIERhc2hQZXJpb2RUcmlnZ2Vycy5TT1VSQ0VfRElTUlVQVElPTlNdXG4gICAqL1xuICByZWFkb25seSBwZXJpb2RUcmlnZ2Vycz86IERhc2hQZXJpb2RUcmlnZ2Vyc1tdO1xuICAvKipcbiAgICogQ2hvb3NlIGhvdyBhZCBtYXJrZXJzIGFyZSBpbmNsdWRlZCBpbiB0aGUgcGFja2FnZWQgY29udGVudC4gSWYgeW91IGluY2x1ZGUgYWQgbWFya2VycyBpbiB0aGUgY29udGVudCBzdHJlYW0gaW4geW91ciB1cHN0cmVhbSBlbmNvZGVycyxcbiAgICogdGhlbiB5b3UgbmVlZCB0byBpbmZvcm0gTWVkaWFQYWNrYWdlIHdoYXQgdG8gZG8gd2l0aCB0aGUgYWQgbWFya2VycyBpbiB0aGUgb3V0cHV0LlxuICAgKlxuICAgKiBUbyBjaG9vc2UgdGhpcyBvcHRpb24gU1RDRSBmaWx0ZXJpbmcgbmVlZHMgdG8gYmUgZW5hYmxlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgQWRNYXJrZXJEYXNoLlhNTFxuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZURhc2hBZE1hcmtlcj86IEFkTWFya2VyRGFzaDtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHZhcmlhYmxlIHRoYXQgTWVkaWFQYWNrYWdlIHVzZXMgaW4gdGhlIG1lZGlhIGF0dHJpYnV0ZSBvZiB0aGUgU2VnbWVudFRlbXBsYXRlIHRhZy5cbiAgICpcbiAgICogQGRlZmF1bHQgU2VnbWVudFRlbXBsYXRlRm9ybWF0Lk5VTUJFUl9XSVRIX1RJTUVMSU5FXG4gICAqL1xuICByZWFkb25seSBzZWdtZW50VGVtcGxhdGVGb3JtYXQ/OiBTZWdtZW50VGVtcGxhdGVGb3JtYXQ7XG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgcGxheWVyIHNob3VsZCBiZSBmcm9tIHRoZSBlbmQgb2YgdGhlIG1hbmlmZXN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMFxuICAgKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGVkUHJlc2VudGF0aW9uRGVsYXk/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBVVEMgdGltaW5nIG1vZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IERhc2hVdGNUaW1pbmdNb2RlLlVUQ19ESVJFQ1RcbiAgICovXG4gIHJlYWRvbmx5IHV0Y1RpbWluZ01vZGU/OiBEYXNoVXRjVGltaW5nTW9kZTtcbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgdGhhdCB0aGUgcGxheWVyIHVzZXMgdG8gc3luY2hyb25pemUgdG8gY29vcmRpbmF0ZWQgdW5pdmVyc2FsIHRpbWUgKFVUQykgd2FsbCBjbG9jayB0aW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWQgLSBObyB2YWx1ZSBpcyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHV0Y1RpbWluZ1NvdXJjZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgSExTIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGxzTWFuaWZlc3RDb25maWd1cmF0aW9uIGV4dGVuZHMgTWFuaWZlc3RDb25maWd1cmF0aW9uQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWFuaWZlc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBITFMgbWFuaWZlc3QgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1hbmlmZXN0TmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNoaWxkIG1hbmlmZXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgSExTIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gY2hpbGQgbWFuaWZlc3QgbmFtZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IGNoaWxkTWFuaWZlc3ROYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogSW5zZXJ0cyBFWFQtWC1QUk9HUkFNLURBVEUtVElNRSB0YWdzIGluIHRoZSBvdXRwdXQgbWFuaWZlc3QgYXQgdGhlIGludGVydmFsIHRoYXQgeW91IHNwZWNpZnkuXG4gICAqIElmIHlvdSBkb24ndCBlbnRlciBhbiBpbnRlcnZhbCwgRVhULVgtUFJPR1JBTS1EQVRFLVRJTUUgdGFncyBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIG1hbmlmZXN0LlxuICAgKiBUaGUgdGFncyBzeW5jIHRoZSBzdHJlYW0gdG8gdGhlIHdhbGwgY2xvY2sgc28gdGhhdCB2aWV3ZXJzIGNhbiBzZWVrIHRvIGEgc3BlY2lmaWMgdGltZSBpbiB0aGUgcGxheWJhY2sgdGltZWxpbmUgb24gdGhlIHBsYXllci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwcm9ncmFtIGRhdGUgdGltZSBpbnRlcnZhbFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZ3JhbURhdGVUaW1lSW50ZXJ2YWw/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBTQ1RFLTM1IEhMUyBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSExTIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBTQ1RFIGFkIG1hcmtlciBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBzY3RlQWRNYXJrZXJIbHM/OiBBZE1hcmtlckhscztcbiAgLyoqXG4gICAqIEluc2VydCBFWFQtWC1TVEFSVCB0YWcgaW4gdGhlIG1hbmlmZXN0IHdpdGggdGhlIGNvbmZpZ3VyZWQgc2V0dGluZ3NcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBzdGFydCB0YWdcbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0VGFnPzogU3RhcnRUYWc7XG4gIC8qKlxuICAgKiBXaGVuIGVuYWJsZWQsIE1lZGlhUGFja2FnZSBVUkwtZW5jb2RlcyB0aGUgcXVlcnkgc3RyaW5nIGZvciBBUEkgcmVxdWVzdHMgZm9yIEhMUyBjaGlsZCBtYW5pZmVzdHMgdG8gY29tcGx5IHdpdGggQVdTIFNpZ25hdHVyZSBWZXJzaW9uIDQgKFNpZ1Y0KSBzaWduYXR1cmUgc2lnbmluZyBwcm90b2NvbC5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBBV1MgU2lnbmF0dXJlIFZlcnNpb24gNCBmb3IgQVBJIHJlcXVlc3RzIGluIEFXUyBJZGVudGl0eSBhbmQgQWNjZXNzIE1hbmFnZW1lbnQgVXNlciBHdWlkZS5cbiAgICpcbiAgICogQGV4dGVybmFsIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2Vfc2lndi5odG1sXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB1cmxFbmNvZGVDaGlsZE1hbmlmZXN0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTcGVjaWZ5IGEgbG93LWxhdGVuY3kgSFRUUCBsaXZlIHN0cmVhbWluZyAoTEwtSExTKSBtYW5pZmVzdCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvd0xhdGVuY3lIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNYW5pZmVzdENvbmZpZ3VyYXRpb25CYXNlIHtcbiAgLyoqXG4gICAqIEEgc2hvcnQgc3RyaW5nIHRoYXQncyBhcHBlbmRlZCB0byB0aGUgZW5kcG9pbnQgVVJMLiBUaGUgbWFuaWZlc3QgbmFtZSBjcmVhdGVzIGEgdW5pcXVlIHBhdGggdG8gdGhpcyBlbmRwb2ludC5cbiAgICogSWYgeW91IGRvbid0IGVudGVyIGEgdmFsdWUsIE1lZGlhUGFja2FnZSB1c2VzIHRoZSBkZWZhdWx0IG1hbmlmZXN0IG5hbWUsIGluZGV4LiBNZWRpYVBhY2thZ2UgYXV0b21hdGljYWxseSBpbnNlcnRzIHRoZSBmb3JtYXQgZXh0ZW5zaW9uLCBzdWNoIGFzIC5tM3U4LlxuICAgKiBZb3UgY2FuJ3QgdXNlIHRoZSBzYW1lIG1hbmlmZXN0IG5hbWUgaWYgeW91IHVzZSBITFMgbWFuaWZlc3QgYW5kIGxvdy1sYXRlbmN5IEhMUyBtYW5pZmVzdC5cbiAgICogVGhlIG1hbmlmZXN0TmFtZSBvbiB0aGUgSExTTWFuaWZlc3Qgb2JqZWN0IG92ZXJyaWRlcyB0aGUgbWFuaWZlc3ROYW1lIHlvdSBwcm92aWRlZCBvbiB0aGUgb3JpZ2luRW5kcG9pbnQgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgbWFuaWZlc3ROYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2hpbGQgbWFuaWZlc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb3ctbGF0ZW5jeSBITFMgKExMLUhMUykgbWFuaWZlc3QgY29uZmlndXJhdGlvbiBvZiB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGNoaWxkIG1hbmlmZXN0IG5hbWUgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBjaGlsZE1hbmlmZXN0TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEluc2VydHMgRVhULVgtUFJPR1JBTS1EQVRFLVRJTUUgdGFncyBpbiB0aGUgb3V0cHV0IG1hbmlmZXN0IGF0IHRoZSBpbnRlcnZhbCB0aGF0IHlvdSBzcGVjaWZ5LlxuICAgKiBJZiB5b3UgZG9uJ3QgZW50ZXIgYW4gaW50ZXJ2YWwsIEVYVC1YLVBST0dSQU0tREFURS1USU1FIHRhZ3MgYXJlbid0IGluY2x1ZGVkIGluIHRoZSBtYW5pZmVzdC5cbiAgICogVGhlIHRhZ3Mgc3luYyB0aGUgc3RyZWFtIHRvIHRoZSB3YWxsIGNsb2NrIHNvIHRoYXQgdmlld2VycyBjYW4gc2VlayB0byBhIHNwZWNpZmljIHRpbWUgaW4gdGhlIHBsYXliYWNrIHRpbWVsaW5lIG9uIHRoZSBwbGF5ZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcHJvZ3JhbSBkYXRlIHRpbWUgaW50ZXJ2YWxcbiAgICovXG4gIHJlYWRvbmx5IHByb2dyYW1EYXRlVGltZUludGVydmFsPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgU0NURS0zNSBITFMgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGxvdy1sYXRlbmN5IEhMUyAoTEwtSExTKSBtYW5pZmVzdCBjb25maWd1cmF0aW9uIG9mIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gU0NURSBhZCBtYXJrZXIgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZUFkTWFya2VySGxzPzogQWRNYXJrZXJIbHM7XG4gIC8qKlxuICAgKiBJbnNlcnQgRVhULVgtU1RBUlQgdGFnIGluIHRoZSBtYW5pZmVzdCB3aXRoIHRoZSBjb25maWd1cmVkIHNldHRpbmdzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gc3RhcnQgdGFnXG4gICAqL1xuICByZWFkb25seSBzdGFydFRhZz86IFN0YXJ0VGFnO1xuICAvKipcbiAgICogV2hlbiBlbmFibGVkLCBNZWRpYVBhY2thZ2UgVVJMLWVuY29kZXMgdGhlIHF1ZXJ5IHN0cmluZyBmb3IgQVBJIHJlcXVlc3RzIGZvciBMTC1ITFMgY2hpbGQgbWFuaWZlc3RzIHRvIGNvbXBseSB3aXRoIEFXUyBTaWduYXR1cmUgVmVyc2lvbiA0IChTaWdWNCkgc2lnbmF0dXJlIHNpZ25pbmcgcHJvdG9jb2wuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgQVdTIFNpZ25hdHVyZSBWZXJzaW9uIDQgZm9yIEFQSSByZXF1ZXN0cyBpbiBBV1MgSWRlbnRpdHkgYW5kIEFjY2VzcyBNYW5hZ2VtZW50IFVzZXIgR3VpZGUuXG4gICAqXG4gICAqIEBleHRlcm5hbCBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3NpZ3YuaHRtbFxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgdXJsRW5jb2RlQ2hpbGRNYW5pZmVzdD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciBhbiBBV1MgRWxlbWVudGFsIE1lZGlhUGFja2FnZSBWMiBPcmlnaW4gRW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JpZ2luRW5kcG9pbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBvcmlnaW4gZW5kcG9pbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQgY29uZmlndXJhdGlvbi5cbiAgICogQGRlZmF1bHQgYXV0b2dlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luRW5kcG9pbnROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAtIE5vIGRlc2NyaXB0aW9uIGlzIGFkZGVkIHRvIE9yaWdpbiBFbmRwb2ludFxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHRhZ2dpbmdcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBNYW5pZmVzdHMgY29uZmlndXJhdGlvbiBmb3IgSExTLCBMb3cgTGF0ZW5jeSBITFMgYW5kIERBU0guXG4gICAqL1xuICByZWFkb25seSBtYW5pZmVzdHM6IE1hbmlmZXN0W107XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSB3aW5kb3cgdG8gc3BlY2lmeSBhIHdpbmRvdyBvZiB0aGUgbGl2ZSBzdHJlYW0gdGhhdCdzIGF2YWlsYWJsZSBmb3Igb24tZGVtYW5kIHZpZXdpbmcuIFZpZXdlcnMgY2FuIHN0YXJ0LW92ZXIgb3IgY2F0Y2gtdXAgb24gY29udGVudCB0aGF0IGZhbGxzIHdpdGhpbiB0aGUgd2luZG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCA5MDBcbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0b3ZlcldpbmRvdz86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICpcbiAgICogSW5zaWRlIHRoZSBzZWdtZW50IGNvbmZpZ3VyYXRpb24geW91IGNhbiBkZWZpbmUgb3B0aW9ucyBzdWNoIGFzIGVuY3J5cHRpb24sIFNQRUtFIHBhcmFtZXRlcnMgYW5kIG90aGVyXG4gICAqIGdlbmVyYWwgc2VnbWVudCBjb25maWd1cmF0aW9ucy5cbiAgICpcbiAgICogVXNlIFNlZ21lbnQudHMoKSBvciBTZWdtZW50LmNtYWYoKSB0byBjcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBzZWdtZW50OiBTZWdtZW50Q29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIGZhaWxvdmVyIHNldHRpbmdzIGZvciB0aGUgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAtIE5vIGZvcmNlIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24gaXMgY29uZmlndXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2VFbmRwb2ludENvbmZpZ3VyYXRpb25Db25kaXRpb25zPzogRW5kcG9pbnRFcnJvckNvbmZpZ3VyYXRpb25bXTtcblxuICAvKipcbiAgICogUHJvdmlkZSBhY2Nlc3MgdG8gTWVkaWFQYWNrYWdlIFYyIE9yaWdpbiBFbmRwb2ludCB2aWEgc2VjcmV0IGhlYWRlci5cbiAgICpcbiAgICogVXNlIHRoaXMgd2hlbiB5b3VyIENETiBkb2Vzbid0IHN1cHBvcnQgQVdTIFNpZ25hdHVyZSBWZXJzaW9uIDQgKFNpZ1Y0KVxuICAgKiBhdXRoZW50aWNhdGlvbi4gRm9yIFNpZ1Y0LWJhc2VkIGFjY2VzcyB3aXRoIEFtYXpvbiBDbG91ZEZyb250LCBzZWVcbiAgICogYE1lZGlhUGFja2FnZVYyT3JpZ2luYC5cbiAgICpcbiAgICogU2V0dGluZyBgY2RuQXV0aGAgYXV0by1jcmVhdGVzIHRoZSBmb2xsb3dpbmcgcG9saWN5IG9uIHRoZSBPcmlnaW5FbmRwb2ludDpcbiAgICpcbiAgICogYGBganNvblxuICAgKiB7XG4gICAqICAgXCJWZXJzaW9uXCI6XCIyMDEyLTEwLTE3XCIsXG4gICAqICAgXCJTdGF0ZW1lbnRcIjogW1xuICAgKiAgICAge1xuICAgKiAgICAgICBcIlNpZFwiOiBcIkFsbG93R2V0T2JqZWN0QWNjZXNzRm9yQXV0aG9yaXplZFJlcXVlc3RcIixcbiAgICogICAgICAgXCJFZmZlY3RcIjogXCJBbGxvd1wiLFxuICAgKiAgICAgICBcIlByaW5jaXBhbFwiOiBcIipcIixcbiAgICogICAgICAgXCJBY3Rpb25cIjogXCJtZWRpYXBhY2thZ2V2MjpHZXRPYmplY3RcIixcbiAgICogICAgICAgXCJSZXNvdXJjZVwiOiBcImFybjphd3M6bWVkaWFwYWNrYWdldjI6dXMtZWFzdC0xOjExMTEyMjIyMzMzMzpjaGFubmVsR3JvdXAvY2hhbm5lbEdyb3VwTmFtZS9jaGFubmVsL2NoYW5uZWxOYW1lL29yaWdpbkVuZHBvaW50L29yaWdpbkVuZHBvaW50TmFtZVwiLFxuICAgKiAgICAgICBcIkNvbmRpdGlvblwiOiB7XG4gICAqICAgICAgICAgXCJCb29sXCI6IHtcbiAgICogICAgICAgICAgIFwibWVkaWFwYWNrYWdldjI6UmVxdWVzdEhhc01hdGNoaW5nQ2RuQXV0aEhlYWRlclwiOiBcInRydWVcIlxuICAgKiAgICAgICAgIH1cbiAgICogICAgICAgfVxuICAgKiAgICAgfVxuICAgKiAgIF1cbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWVkaWFwYWNrYWdlL2xhdGVzdC91c2VyZ3VpZGUvY2RuLWF1dGguaHRtbFxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYXBhY2thZ2UvbGF0ZXN0L3VzZXJndWlkZS9jZG4tYXV0aC1zZXR1cC5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAtIE5vdCBjb25maWd1cmVkIG9uIGVuZHBvaW50XG4gICAqL1xuICByZWFkb25seSBjZG5BdXRoPzogQ2RuQXV0aENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFBvbGljeSB0byBhcHBseSB3aGVuIHRoZSBvcmlnaW4gZW5kcG9pbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzdGFja1xuICAgKlxuICAgKiBFdmVuIHRob3VnaCBNZWRpYVBhY2thZ2UgQ2hhbm5lbEdyb3VwcywgQ2hhbm5lbHMgYW5kIE9yaWdpbkVuZHBvaW50cyBhcmUgdGVjaG5pY2FsbHkgc3RhdGVmdWwsXG4gICAqIHRoZWlyIGNvbnRlbnRzIGFyZSB0cmFuc2llbnQgYW5kIGl0IGlzIGNvbW1vbiB0byBhZGQgYW5kIHJlbW92ZSB0aGVzZSB3aGlsZSByZWFyY2hpdGVjdGluZyB5b3VyIGFwcGxpY2F0aW9uLlxuICAgKiBUaGUgZGVmYXVsdCBpcyB0aGVyZWZvcmUgYERFU1RST1lgLiBDaGFuZ2UgaXQgdG8gYFJFVEFJTmAgaWYgdGhlIGNvbnRlbnQgKGluIGEgbG9va2JhY2sgd2luZG93KSBhcmUgc29cbiAgICogdmFsdWFibGUgdGhhdCBhY2NpZGVudGFsbHkgbG9zaW5nIGl0IHdvdWxkIGJlIHVuYWNjZXB0YWJsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIHNldCBvbiBhbiBPcmlnaW4gRW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JpZ2luRW5kcG9pbnRQcm9wcyBleHRlbmRzIE9yaWdpbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgY2hhbm5lbCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWw6IElDaGFubmVsO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gT3JpZ2luIEVuZHBvaW50IGRlZmluZWQgb3V0c2lkZSBvZiB0aGlzIHN0YWNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yaWdpbkVuZHBvaW50QXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSB0aGF0IGRlc2NyaWJlcyB0aGUgY2hhbm5lbCBncm91cC4gVGhlIG5hbWUgaXMgdGhlIHByaW1hcnkgaWRlbnRpZmllciBmb3IgdGhlIGNoYW5uZWwgZ3JvdXAuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWxHcm91cE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgdGhhdCBkZXNjcmliZXMgdGhlIGNoYW5uZWwuIFRoZSBuYW1lIGlzIHRoZSBwcmltYXJ5IGlkZW50aWZpZXIgZm9yIHRoZSBjaGFubmVsLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjaGFubmVsTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSB0aGF0IGRlc2NyaWJlcyB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5FbmRwb2ludE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFXUyByZWdpb24gd2hlcmUgdGhlIG9yaWdpbiBlbmRwb2ludCBsaXZlcy5cbiAgICpcbiAgICogUmVxdWlyZWQgZm9yIGNyb3NzLXJlZ2lvbiBpbXBvcnRzIHRvIGNvbnN0cnVjdCB0aGUgY29ycmVjdCBBUk4uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGltcG9ydGluZyBzdGFjaydzIHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIERSTSBzeXN0ZW1zIGF2YWlsYWJsZSBmb3IgQ01BRiBlbmNyeXB0aW9uLlxuICpcbiAqIENFTkMgc3VwcG9ydHMgUGxheVJlYWR5LCBXaWRldmluZSwgYW5kIElyZGV0by5cbiAqIENCQ1Mgc3VwcG9ydHMgUGxheVJlYWR5LCBXaWRldmluZSwgYW5kIEZhaXJQbGF5LlxuICovXG5leHBvcnQgZW51bSBDbWFmRHJtU3lzdGVtIHtcbiAgLyoqXG4gICAqIEZhaXJQbGF5IERSTSAtIHVzZWQgd2l0aCBDQkNTIGVuY3J5cHRpb24uXG4gICAqL1xuICBGQUlSUExBWSA9ICdGQUlSUExBWScsXG4gIC8qKlxuICAgKiBQbGF5UmVhZHkgRFJNIC0gdXNlZCB3aXRoIENFTkMgYW5kIENCQ1MgZW5jcnlwdGlvbi5cbiAgICovXG4gIFBMQVlSRUFEWSA9ICdQTEFZUkVBRFknLFxuICAvKipcbiAgICogV2lkZXZpbmUgRFJNIC0gdXNlZCB3aXRoIENFTkMgYW5kIENCQ1MgZW5jcnlwdGlvbi5cbiAgICovXG4gIFdJREVWSU5FID0gJ1dJREVWSU5FJyxcbiAgLyoqXG4gICAqIElyZGV0byBEUk0gLSB1c2VkIHdpdGggQ0VOQyBlbmNyeXB0aW9uLlxuICAgKi9cbiAgSVJERVRPID0gJ0lSREVUTycsXG59XG5cbi8qKlxuICogRFJNIHN5c3RlbXMgYXZhaWxhYmxlIGZvciBUUyBlbmNyeXB0aW9uLlxuICpcbiAqIFNBTVBMRV9BRVMgdXNlcyBGYWlyUGxheSwgQUVTXzEyOCB1c2VzIENsZWFyIEtleSBBRVMgMTI4LlxuICovXG5leHBvcnQgZW51bSBUc0RybVN5c3RlbSB7XG4gIC8qKlxuICAgKiBGYWlyUGxheSBEUk0gLSB1c2VkIHdpdGggU0FNUExFX0FFUyBlbmNyeXB0aW9uLlxuICAgKi9cbiAgRkFJUlBMQVkgPSAnRkFJUlBMQVknLFxuICAvKipcbiAgICogQ2xlYXIgS2V5IEFFUyAxMjggLSB1c2VkIHdpdGggQUVTXzEyOCBlbmNyeXB0aW9uLlxuICAgKi9cbiAgQ0xFQVJfS0VZX0FFU18xMjggPSAnQ0xFQVJfS0VZX0FFU18xMjgnLFxufVxuXG4vKipcbiAqIERSTSBzeXN0ZW1zIGF2YWlsYWJsZSBmb3IgSVNNIGVuY3J5cHRpb24uXG4gKlxuICogSVNNIG9ubHkgc3VwcG9ydHMgUGxheVJlYWR5IHdpdGggQ0VOQy5cbiAqL1xuZXhwb3J0IGVudW0gSXNtRHJtU3lzdGVtIHtcbiAgLyoqXG4gICAqIFBsYXlSZWFkeSBEUk0uXG4gICAqL1xuICBQTEFZUkVBRFkgPSAnUExBWVJFQURZJyxcbn1cblxuLyoqXG4gKiBCYXNlIHByb3BlcnRpZXMgY29tbW9uIHRvIGFsbCBTUEVLRSBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICovXG5pbnRlcmZhY2UgU3Bla2VFbmNyeXB0aW9uUHJvcHNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbnRlbnQuXG4gICAqXG4gICAqIFRoZSBzZXJ2aWNlIHNlbmRzIHRoaXMgaWRlbnRpZmllciB0byB0aGUga2V5IHNlcnZlciB0byBpZGVudGlmeSB0aGUgY3VycmVudCBlbmRwb2ludC5cbiAgICogSG93IHVuaXF1ZSB5b3UgbWFrZSB0aGlzIGlkZW50aWZpZXIgZGVwZW5kcyBvbiBob3cgZmluZS1ncmFpbmVkIHlvdSB3YW50IGFjY2VzcyBjb250cm9scyB0byBiZS5cbiAgICogVGhlIHNlcnZpY2UgZG9lcyBub3QgcGVybWl0IHlvdSB0byB1c2UgdGhlIHNhbWUgSUQgZm9yIHR3byBzaW11bHRhbmVvdXMgZW5jcnlwdGlvbiBwcm9jZXNzZXMuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElBTSByb2xlIGZvciBhY2Nlc3NpbmcgdGhlIGtleSBwcm92aWRlciBBUEkuXG4gICAqXG4gICAqIFRoaXMgcm9sZSBtdXN0IGhhdmUgYSB0cnVzdCBwb2xpY3kgdGhhdCBhbGxvd3MgTWVkaWFQYWNrYWdlIHRvIGFzc3VtZSB0aGUgcm9sZSxcbiAgICogYW5kIGl0IG11c3QgaGF2ZSBzdWZmaWNpZW50IHBlcm1pc3Npb25zIHRvIGFjY2VzcyB0aGUga2V5IHJldHJpZXZhbCBVUkwuXG4gICAqL1xuICByZWFkb25seSByb2xlOiBJUm9sZTtcblxuICAvKipcbiAgICogVVJMIG9mIHRoZSBTUEVLRSBrZXkgcHJvdmlkZXIuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgY2VydGlmaWNhdGUgdGhhdCB5b3UgaW1wb3J0ZWQgdG8gQVdTIENlcnRpZmljYXRlIE1hbmFnZXJcbiAgICogdG8gYWRkIGNvbnRlbnQga2V5IGVuY3J5cHRpb24gdG8gdGhpcyBlbmRwb2ludC5cbiAgICpcbiAgICogRm9yIHRoaXMgZmVhdHVyZSB0byB3b3JrLCB5b3VyIERSTSBrZXkgcHJvdmlkZXIgbXVzdCBzdXBwb3J0IGNvbnRlbnQga2V5IGVuY3J5cHRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29udGVudCBrZXkgZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgY2VydGlmaWNhdGU/OiBJQ2VydGlmaWNhdGU7XG5cbiAgLyoqXG4gICAqIEF1ZGlvIGVuY3J5cHRpb24gcHJlc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBQcmVzZXRTcGVrZTIwQXVkaW8uUFJFU0VUX0FVRElPXzFcbiAgICovXG4gIHJlYWRvbmx5IGF1ZGlvUHJlc2V0PzogUHJlc2V0U3Bla2UyMEF1ZGlvO1xuXG4gIC8qKlxuICAgKiBWaWRlbyBlbmNyeXB0aW9uIHByZXNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgUHJlc2V0U3Bla2UyMFZpZGVvLlBSRVNFVF9WSURFT18xXG4gICAqL1xuICByZWFkb25seSB2aWRlb1ByZXNldD86IFByZXNldFNwZWtlMjBWaWRlbztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBDTUFGIFNQRUtFIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbWFmU3Bla2VFbmNyeXB0aW9uUHJvcHMgZXh0ZW5kcyBTcGVrZUVuY3J5cHRpb25Qcm9wc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIGVuY3J5cHRpb24gbWV0aG9kIHRvIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZDogQ21hZkVuY3J5cHRpb25NZXRob2Q7XG5cbiAgLyoqXG4gICAqIFRoZSBEUk0gc3lzdGVtcyB0byB1c2UgZm9yIGNvbnRlbnQgcHJvdGVjdGlvbi5cbiAgICpcbiAgICogQ0VOQyBzdXBwb3J0cyBQbGF5UmVhZHksIFdpZGV2aW5lLCBhbmQgSXJkZXRvLlxuICAgKiBDQkNTIHN1cHBvcnRzIFBsYXlSZWFkeSwgV2lkZXZpbmUsIGFuZCBGYWlyUGxheS5cbiAgICovXG4gIHJlYWRvbmx5IGRybVN5c3RlbXM6IENtYWZEcm1TeXN0ZW1bXTtcblxuICAvKipcbiAgICogQ29uc3RhbnQgaW5pdGlhbGl6YXRpb24gdmVjdG9yICgzMi1jaGFyYWN0ZXIgaGV4IHN0cmluZykuXG4gICAqXG4gICAqIEEgMTI4LWJpdCwgMTYtYnl0ZSBoZXggdmFsdWUgcmVwcmVzZW50ZWQgYnkgYSAzMi1jaGFyYWN0ZXIgc3RyaW5nLFxuICAgKiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGtleSBmb3IgZW5jcnlwdGluZyBjb250ZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE1lZGlhUGFja2FnZSBnZW5lcmF0ZXMgdGhlIElWXG4gICAqL1xuICByZWFkb25seSBjb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLZXkgcm90YXRpb24gaW50ZXJ2YWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcm90YXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGtleVJvdGF0aW9uSW50ZXJ2YWw/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogV2hlbiBlbmFibGVkLCBEUk0gbWV0YWRhdGEgaXMgZXhjbHVkZWQgZnJvbSBDTUFGIHNlZ21lbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZVNlZ21lbnREcm1NZXRhZGF0YT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgVFMgU1BFS0UgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRzU3Bla2VFbmNyeXB0aW9uUHJvcHMgZXh0ZW5kcyBTcGVrZUVuY3J5cHRpb25Qcm9wc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIGVuY3J5cHRpb24gbWV0aG9kIHRvIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZDogVHNFbmNyeXB0aW9uTWV0aG9kO1xuXG4gIC8qKlxuICAgKiBUaGUgRFJNIHN5c3RlbXMgdG8gdXNlIGZvciBjb250ZW50IHByb3RlY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRmFpclBsYXkgZm9yIFNBTVBMRV9BRVMsIENsZWFyIEtleSBBRVMgMTI4IGZvciBBRVNfMTI4XG4gICAqL1xuICByZWFkb25seSBkcm1TeXN0ZW1zPzogVHNEcm1TeXN0ZW1bXTtcblxuICAvKipcbiAgICogQ29uc3RhbnQgaW5pdGlhbGl6YXRpb24gdmVjdG9yICgzMi1jaGFyYWN0ZXIgaGV4IHN0cmluZykuXG4gICAqXG4gICAqIEEgMTI4LWJpdCwgMTYtYnl0ZSBoZXggdmFsdWUgcmVwcmVzZW50ZWQgYnkgYSAzMi1jaGFyYWN0ZXIgc3RyaW5nLFxuICAgKiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGtleSBmb3IgZW5jcnlwdGluZyBjb250ZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE1lZGlhUGFja2FnZSBnZW5lcmF0ZXMgdGhlIElWXG4gICAqL1xuICByZWFkb25seSBjb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLZXkgcm90YXRpb24gaW50ZXJ2YWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcm90YXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGtleVJvdGF0aW9uSW50ZXJ2YWw/OiBEdXJhdGlvbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBJU00gU1BFS0UgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uLlxuICpcbiAqIElTTSBvbmx5IHN1cHBvcnRzIENFTkMgZW5jcnlwdGlvbiB3aXRoIFBsYXlSZWFkeSBEUk0uXG4gKiBLZXkgcm90YXRpb24gYW5kIGNvbnN0YW50IGluaXRpYWxpemF0aW9uIHZlY3RvcnMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gKiBBdWRpbyBhbmQgdmlkZW8gcHJlc2V0cyBkZWZhdWx0IHRvIFNIQVJFRC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc21TcGVrZUVuY3J5cHRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgRFJNIHN5c3RlbXMgdG8gdXNlIGZvciBjb250ZW50IHByb3RlY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gW0lzbURybVN5c3RlbS5QTEFZUkVBRFldXG4gICAqL1xuICByZWFkb25seSBkcm1TeXN0ZW1zPzogSXNtRHJtU3lzdGVtW107XG5cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElBTSByb2xlIGZvciBhY2Nlc3NpbmcgdGhlIGtleSBwcm92aWRlciBBUEkuXG4gICAqL1xuICByZWFkb25seSByb2xlOiBJUm9sZTtcblxuICAvKipcbiAgICogVVJMIG9mIHRoZSBTUEVLRSBrZXkgcHJvdmlkZXIuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgY2VydGlmaWNhdGUgdGhhdCB5b3UgaW1wb3J0ZWQgdG8gQVdTIENlcnRpZmljYXRlIE1hbmFnZXJcbiAgICogdG8gYWRkIGNvbnRlbnQga2V5IGVuY3J5cHRpb24gdG8gdGhpcyBlbmRwb2ludC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjb250ZW50IGtleSBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBjZXJ0aWZpY2F0ZT86IElDZXJ0aWZpY2F0ZTtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICpcbiAqIFVzZSBgQ21hZkVuY3J5cHRpb24uc3Bla2UoKWAsIGBUc0VuY3J5cHRpb24uc3Bla2UoKWAsIG9yIGBJc21FbmNyeXB0aW9uLnNwZWtlKClgIHRvIGNyZWF0ZSBpbnN0YW5jZXMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBFbmNyeXB0aW9uQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBCaW5kcyB0aGUgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIHRvIHByb2R1Y2UgdGhlIENsb3VkRm9ybWF0aW9uIHByb3BlcnR5LlxuICAgKlxuICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB1c2VkIGJ5IHRoZSBjb25zdHJ1Y3QgbGlicmFyeSBhbmQgc2hvdWxkIG5vdCBiZVxuICAgKiBjYWxsZWQgb3IgaW1wbGVtZW50ZWQgYnkgZXh0ZXJuYWwgY29uc3VtZXJzLiBJdCBtYXkgY2hhbmdlIHdpdGhvdXQgbm90aWNlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfYmluZChzY29wZTogQ29uc3RydWN0KTogQ2ZuT3JpZ2luRW5kcG9pbnQuRW5jcnlwdGlvblByb3BlcnR5O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBJQU0gcm9sZSB1c2VkIGZvciBlbmNyeXB0aW9uLCBpZiBhbnkuXG4gICAqXG4gICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kIHVzZWQgYnkgdGhlIGNvbnN0cnVjdCBsaWJyYXJ5IGFuZCBzaG91bGQgbm90IGJlXG4gICAqIGNhbGxlZCBvciBpbXBsZW1lbnRlZCBieSBleHRlcm5hbCBjb25zdW1lcnMuIEl0IG1heSBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IF9nZXRSb2xlKCk6IElSb2xlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBBQ00gY2VydGlmaWNhdGUgdXNlZCBmb3IgY29udGVudCBrZXkgZW5jcnlwdGlvbiwgaWYgYW55LlxuICAgKlxuICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB1c2VkIGJ5IHRoZSBjb25zdHJ1Y3QgbGlicmFyeSBhbmQgc2hvdWxkIG5vdCBiZVxuICAgKiBjYWxsZWQgb3IgaW1wbGVtZW50ZWQgYnkgZXh0ZXJuYWwgY29uc3VtZXJzLiBJdCBtYXkgY2hhbmdlIHdpdGhvdXQgbm90aWNlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfZ2V0Q2VydGlmaWNhdGUoKTogSUNlcnRpZmljYXRlIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgQ01BRiBzZWdtZW50cy5cbiAqXG4gKiBVc2UgYENtYWZFbmNyeXB0aW9uLnNwZWtlKClgIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENtYWZFbmNyeXB0aW9uIGV4dGVuZHMgRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGEgU1BFS0UtYmFzZWQgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIGZvciBDTUFGIHNlZ21lbnRzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzcGVrZShwcm9wczogQ21hZlNwZWtlRW5jcnlwdGlvblByb3BzKTogQ21hZkVuY3J5cHRpb24ge1xuICAgIGlmICghcHJvcHMudXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgU3Bla2VVcmxIdHRwc1JlcXVpcmVkYCwgJ1NQRUtFIGtleSBwcm92aWRlciBVUkwgbXVzdCB1c2UgSFRUUFMuJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5tZXRob2QgPT09IENtYWZFbmNyeXB0aW9uTWV0aG9kLkNFTkMgJiYgcHJvcHMuZHJtU3lzdGVtcy5pbmNsdWRlcyhDbWFmRHJtU3lzdGVtLkZBSVJQTEFZKSkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBDZW5jRmFpclBsYXlJbmNvbXBhdGlibGVgLCAnQ0VOQyBlbmNyeXB0aW9uIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IEZhaXJQbGF5LiBVc2UgQ0JDUyBmb3IgRmFpclBsYXkuJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5tZXRob2QgPT09IENtYWZFbmNyeXB0aW9uTWV0aG9kLkNCQ1MgJiYgcHJvcHMuZHJtU3lzdGVtcy5pbmNsdWRlcyhDbWFmRHJtU3lzdGVtLklSREVUTykpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgQ2Jjc0lyZGV0b0luY29tcGF0aWJsZWAsICdDQkNTIGVuY3J5cHRpb24gbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgSXJkZXRvLiBVc2UgQ0VOQyBmb3IgSXJkZXRvLicpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IENtYWZFbmNyeXB0aW9uKHByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBDbWFmU3Bla2VFbmNyeXB0aW9uUHJvcHM7XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJvcHM6IENtYWZTcGVrZUVuY3J5cHRpb25Qcm9wcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25maWcgPSBwcm9wcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9iaW5kKHNjb3BlOiBDb25zdHJ1Y3QpOiBDZm5PcmlnaW5FbmRwb2ludC5FbmNyeXB0aW9uUHJvcGVydHkge1xuICAgIGNvbnN0IHAgPSB0aGlzLmNvbmZpZztcbiAgICBpZiAocC5jb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yICYmIHAuY29uc3RhbnRJbml0aWFsaXphdGlvblZlY3Rvci5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBDb25zdGFudEluaXRWZWN0b3JMZW5ndGhgLCAnQ29uc3RhbnQgSW5pdGlhbGl6YXRpb24gVmVjdG9yIG5lZWRzIHRvIGJlIDMyIGNoYXJhY3RlcnMgaW4gbGVuZ3RoLicsIHNjb3BlKTtcbiAgICB9XG4gICAgaWYgKHAua2V5Um90YXRpb25JbnRlcnZhbCAmJiAocC5rZXlSb3RhdGlvbkludGVydmFsLnRvU2Vjb25kcygpIDwgMzAwIHx8IHAua2V5Um90YXRpb25JbnRlcnZhbC50b1NlY29uZHMoKSA+IDMxNTM2MDAwKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgS2V5Um90YXRpb25JbnRlcnZhbFJhbmdlYCwgJ0tleSBSb3RhdGlvbiBJbnRlcnZhbCBuZWVkcyB0byBiZSBiZXR3ZWVuIDMwMC0zMTUzNjAwMCBzZWNvbmRzLicsIHNjb3BlKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNtYWZFeGNsdWRlU2VnbWVudERybU1ldGFkYXRhOiBwLmV4Y2x1ZGVTZWdtZW50RHJtTWV0YWRhdGEsXG4gICAgICBjb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yOiBwLmNvbnN0YW50SW5pdGlhbGl6YXRpb25WZWN0b3IsXG4gICAgICBrZXlSb3RhdGlvbkludGVydmFsU2Vjb25kczogcC5rZXlSb3RhdGlvbkludGVydmFsPy50b1NlY29uZHMoKSxcbiAgICAgIGVuY3J5cHRpb25NZXRob2Q6IHsgY21hZkVuY3J5cHRpb25NZXRob2Q6IHAubWV0aG9kIH0sXG4gICAgICBzcGVrZUtleVByb3ZpZGVyOiB7XG4gICAgICAgIGNlcnRpZmljYXRlQXJuOiBwLmNlcnRpZmljYXRlPy5jZXJ0aWZpY2F0ZUFybixcbiAgICAgICAgZHJtU3lzdGVtczogcC5kcm1TeXN0ZW1zLFxuICAgICAgICBlbmNyeXB0aW9uQ29udHJhY3RDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgcHJlc2V0U3Bla2UyMEF1ZGlvOiBwLmF1ZGlvUHJlc2V0ID8/IFByZXNldFNwZWtlMjBBdWRpby5QUkVTRVRfQVVESU9fMSxcbiAgICAgICAgICBwcmVzZXRTcGVrZTIwVmlkZW86IHAudmlkZW9QcmVzZXQgPz8gUHJlc2V0U3Bla2UyMFZpZGVvLlBSRVNFVF9WSURFT18xLFxuICAgICAgICB9LFxuICAgICAgICB1cmw6IHAudXJsLFxuICAgICAgICByZXNvdXJjZUlkOiBwLnJlc291cmNlSWQsXG4gICAgICAgIHJvbGVBcm46IHAucm9sZS5yb2xlQXJuLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2dldFJvbGUoKTogSVJvbGUgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5jb25maWcucm9sZTsgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9nZXRDZXJ0aWZpY2F0ZSgpOiBJQ2VydGlmaWNhdGUgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5jb25maWcuY2VydGlmaWNhdGU7IH1cbn1cblxuLyoqXG4gKiBFbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIFRTIHNlZ21lbnRzLlxuICpcbiAqIFVzZSBgVHNFbmNyeXB0aW9uLnNwZWtlKClgIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRzRW5jcnlwdGlvbiBleHRlbmRzIEVuY3J5cHRpb25Db25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIFNQRUtFLWJhc2VkIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgVFMgc2VnbWVudHMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNwZWtlKHByb3BzOiBUc1NwZWtlRW5jcnlwdGlvblByb3BzKTogVHNFbmNyeXB0aW9uIHtcbiAgICBpZiAoIXByb3BzLnVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YFNwZWtlVXJsSHR0cHNSZXF1aXJlZGAsICdTUEVLRSBrZXkgcHJvdmlkZXIgVVJMIG11c3QgdXNlIEhUVFBTLicpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRzRW5jcnlwdGlvbihwcm9wcyk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogVHNTcGVrZUVuY3J5cHRpb25Qcm9wcztcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcm9wczogVHNTcGVrZUVuY3J5cHRpb25Qcm9wcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25maWcgPSBwcm9wcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9iaW5kKHNjb3BlOiBDb25zdHJ1Y3QpOiBDZm5PcmlnaW5FbmRwb2ludC5FbmNyeXB0aW9uUHJvcGVydHkge1xuICAgIGNvbnN0IHAgPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCBkZWZhdWx0RHJtOiBUc0RybVN5c3RlbVtdID0gcC5tZXRob2QgPT09IFRzRW5jcnlwdGlvbk1ldGhvZC5TQU1QTEVfQUVTXG4gICAgICA/IFtUc0RybVN5c3RlbS5GQUlSUExBWV0gOiBbVHNEcm1TeXN0ZW0uQ0xFQVJfS0VZX0FFU18xMjhdO1xuICAgIGlmIChwLmNvbnN0YW50SW5pdGlhbGl6YXRpb25WZWN0b3IgJiYgcC5jb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YENvbnN0YW50SW5pdFZlY3Rvckxlbmd0aGAsICdDb25zdGFudCBJbml0aWFsaXphdGlvbiBWZWN0b3IgbmVlZHMgdG8gYmUgMzIgY2hhcmFjdGVycyBpbiBsZW5ndGguJywgc2NvcGUpO1xuICAgIH1cbiAgICBpZiAocC5rZXlSb3RhdGlvbkludGVydmFsICYmIChwLmtleVJvdGF0aW9uSW50ZXJ2YWwudG9TZWNvbmRzKCkgPCAzMDAgfHwgcC5rZXlSb3RhdGlvbkludGVydmFsLnRvU2Vjb25kcygpID4gMzE1MzYwMDApKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBLZXlSb3RhdGlvbkludGVydmFsUmFuZ2VgLCAnS2V5IFJvdGF0aW9uIEludGVydmFsIG5lZWRzIHRvIGJlIGJldHdlZW4gMzAwLTMxNTM2MDAwIHNlY29uZHMuJywgc2NvcGUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY29uc3RhbnRJbml0aWFsaXphdGlvblZlY3RvcjogcC5jb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yLFxuICAgICAga2V5Um90YXRpb25JbnRlcnZhbFNlY29uZHM6IHAua2V5Um90YXRpb25JbnRlcnZhbD8udG9TZWNvbmRzKCksXG4gICAgICBlbmNyeXB0aW9uTWV0aG9kOiB7IHRzRW5jcnlwdGlvbk1ldGhvZDogcC5tZXRob2QgfSxcbiAgICAgIHNwZWtlS2V5UHJvdmlkZXI6IHtcbiAgICAgICAgY2VydGlmaWNhdGVBcm46IHAuY2VydGlmaWNhdGU/LmNlcnRpZmljYXRlQXJuLFxuICAgICAgICBkcm1TeXN0ZW1zOiAocC5kcm1TeXN0ZW1zID8/IGRlZmF1bHREcm0pLm1hcChkID0+IGQudG9TdHJpbmcoKSksXG4gICAgICAgIGVuY3J5cHRpb25Db250cmFjdENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBwcmVzZXRTcGVrZTIwQXVkaW86IHAuYXVkaW9QcmVzZXQgPz8gUHJlc2V0U3Bla2UyMEF1ZGlvLlBSRVNFVF9BVURJT18xLFxuICAgICAgICAgIHByZXNldFNwZWtlMjBWaWRlbzogcC52aWRlb1ByZXNldCA/PyBQcmVzZXRTcGVrZTIwVmlkZW8uUFJFU0VUX1ZJREVPXzEsXG4gICAgICAgIH0sXG4gICAgICAgIHVybDogcC51cmwsXG4gICAgICAgIHJlc291cmNlSWQ6IHAucmVzb3VyY2VJZCxcbiAgICAgICAgcm9sZUFybjogcC5yb2xlLnJvbGVBcm4sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfZ2V0Um9sZSgpOiBJUm9sZSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLmNvbmZpZy5yb2xlOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2dldENlcnRpZmljYXRlKCk6IElDZXJ0aWZpY2F0ZSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLmNvbmZpZy5jZXJ0aWZpY2F0ZTsgfVxufVxuXG4vKipcbiAqIEVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgSVNNIChNaWNyb3NvZnQgU21vb3RoIFN0cmVhbWluZykgc2VnbWVudHMuXG4gKlxuICogSVNNIG9ubHkgc3VwcG9ydHMgQ0VOQyBlbmNyeXB0aW9uIHdpdGggUGxheVJlYWR5IERSTS5cbiAqIEF1ZGlvIGFuZCB2aWRlbyBwcmVzZXRzIGFyZSBhbHdheXMgU0hBUkVELlxuICpcbiAqIFVzZSBgSXNtRW5jcnlwdGlvbi5zcGVrZSgpYCB0byBjcmVhdGUgYW4gaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJc21FbmNyeXB0aW9uIGV4dGVuZHMgRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGEgU1BFS0UtYmFzZWQgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIGZvciBJU00gc2VnbWVudHMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNwZWtlKHByb3BzOiBJc21TcGVrZUVuY3J5cHRpb25Qcm9wcyk6IElzbUVuY3J5cHRpb24ge1xuICAgIGlmICghcHJvcHMudXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgU3Bla2VVcmxIdHRwc1JlcXVpcmVkYCwgJ1NQRUtFIGtleSBwcm92aWRlciBVUkwgbXVzdCB1c2UgSFRUUFMuJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSXNtRW5jcnlwdGlvbihwcm9wcyk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogSXNtU3Bla2VFbmNyeXB0aW9uUHJvcHM7XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJvcHM6IElzbVNwZWtlRW5jcnlwdGlvblByb3BzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbmZpZyA9IHByb3BzO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2JpbmQoX3Njb3BlOiBDb25zdHJ1Y3QpOiBDZm5PcmlnaW5FbmRwb2ludC5FbmNyeXB0aW9uUHJvcGVydHkge1xuICAgIGNvbnN0IHAgPSB0aGlzLmNvbmZpZztcbiAgICByZXR1cm4ge1xuICAgICAgZW5jcnlwdGlvbk1ldGhvZDogeyBpc21FbmNyeXB0aW9uTWV0aG9kOiAnQ0VOQycgfSxcbiAgICAgIHNwZWtlS2V5UHJvdmlkZXI6IHtcbiAgICAgICAgY2VydGlmaWNhdGVBcm46IHAuY2VydGlmaWNhdGU/LmNlcnRpZmljYXRlQXJuLFxuICAgICAgICBkcm1TeXN0ZW1zOiAocC5kcm1TeXN0ZW1zID8/IFtJc21Ecm1TeXN0ZW0uUExBWVJFQURZXSkubWFwKGQgPT4gZC50b1N0cmluZygpKSxcbiAgICAgICAgZW5jcnlwdGlvbkNvbnRyYWN0Q29uZmlndXJhdGlvbjoge1xuICAgICAgICAgIHByZXNldFNwZWtlMjBBdWRpbzogUHJlc2V0U3Bla2UyMEF1ZGlvLlNIQVJFRCxcbiAgICAgICAgICBwcmVzZXRTcGVrZTIwVmlkZW86IFByZXNldFNwZWtlMjBWaWRlby5TSEFSRUQsXG4gICAgICAgIH0sXG4gICAgICAgIHVybDogcC51cmwsXG4gICAgICAgIHJlc291cmNlSWQ6IHAucmVzb3VyY2VJZCxcbiAgICAgICAgcm9sZUFybjogcC5yb2xlLnJvbGVBcm4sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfZ2V0Um9sZSgpOiBJUm9sZSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLmNvbmZpZy5yb2xlOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2dldENlcnRpZmljYXRlKCk6IElDZXJ0aWZpY2F0ZSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLmNvbmZpZy5jZXJ0aWZpY2F0ZTsgfVxufVxuXG4vKipcbiAqIFRoZSBzZWdtZW50IGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyB0aGUgc2VnbWVudCBuYW1lLCBkdXJhdGlvbiwgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlZ21lbnRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXIgdHlwZSBmb3IgdGhpcyBzZWdtZW50IChUUyBvciBDTUFGKVxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyVHlwZTogQ29udGFpbmVyVHlwZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNlZ21lbnQgaW5jbHVkZXMgSS1mcmFtZS1vbmx5IHN0cmVhbXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAtIE5vdCBzcGVjaWZpZWQuXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlSWZyYW1lT25seVN0cmVhbXM/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIFNDVEUtMzUgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHNlZ21lbnQuXG4gICAqXG4gICAqIFRoZSBTQ1RFLTM1IG1lc3NhZ2UgdHlwZXMgdGhhdCB5b3Ugd2FudCB0byBiZSB0cmVhdGVkIGFzIGFkIG1hcmtlcnMgaW4gdGhlIG91dHB1dC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBTQ1RFIGZpbHRlcmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZUZpbHRlcj86IFNjdGVNZXNzYWdlVHlwZVtdO1xuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBTQ1RFLTM1IG1lc3NhZ2VzIGFyZSBpbmNsdWRlZCBpbiBzZWdtZW50IGZpbGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNDVEUtMzUgbWVzc2FnZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiBzZWdtZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZUluU2VnbWVudHM/OiBTY3RlSW5TZWdtZW50cztcbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgc2VnbWVudHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IDZcbiAgICovXG4gIHJlYWRvbmx5IHNlZ21lbnREdXJhdGlvbj86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHNlZ21lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHNlZ21lbnRcbiAgICovXG4gIHJlYWRvbmx5IHNlZ21lbnROYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgc2VnbWVudCBpbmNsdWRlcyBEVkIgc3VidGl0bGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgdHNJbmNsdWRlRHZiU3VidGl0bGVzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNlZ21lbnQgaXMgYW4gYXVkaW8gcmVuZGl0aW9uIGdyb3VwLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgdHNVc2VBdWRpb1JlbmRpdGlvbkdyb3VwPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIHNlZ21lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbj86IEVuY3J5cHRpb25Db25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIEJhc2UgcHJvcGVydGllcyBjb21tb24gdG8gYWxsIHNlZ21lbnQgY29uZmlndXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VnbWVudFByb3BzQmFzZSB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgSS1mcmFtZS1vbmx5IHN0cmVhbXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlSWZyYW1lT25seVN0cmVhbXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEdXJhdGlvbiBvZiBlYWNoIHNlZ21lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLnNlY29uZHMoNilcbiAgICovXG4gIHJlYWRvbmx5IGR1cmF0aW9uPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHNlZ21lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdzZWdtZW50J1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBUUyAoVHJhbnNwb3J0IFN0cmVhbSkgc2VnbWVudCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRzU2VnbWVudFByb3BzIGV4dGVuZHMgU2VnbWVudFByb3BzQmFzZSB7XG4gIC8qKlxuICAgKiBTQ1RFLTM1IG1lc3NhZ2UgdHlwZXMgdG8gdHJlYXQgYXMgYWQgbWFya2Vycy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBmaWx0ZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHNjdGVGaWx0ZXI/OiBTY3RlTWVzc2FnZVR5cGVbXTtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBTQ1RFLTM1IG1lc3NhZ2VzIGFyZSBpbmNsdWRlZCBpbiBzZWdtZW50IGZpbGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNDVEUtMzUgbWVzc2FnZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiBzZWdtZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZUluU2VnbWVudHM/OiBTY3RlSW5TZWdtZW50cztcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIERWQiBzdWJ0aXRsZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlRHZiU3VidGl0bGVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1c2UgYXVkaW8gcmVuZGl0aW9uIGdyb3Vwcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHVzZUF1ZGlvUmVuZGl0aW9uR3JvdXA/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBUUyBzZWdtZW50LlxuICAgKlxuICAgKiBVc2UgYFRzRW5jcnlwdGlvbi5zcGVrZSgpYCB0byBjcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbj86IFRzRW5jcnlwdGlvbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBDTUFGIHNlZ21lbnQgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbWFmU2VnbWVudFByb3BzIGV4dGVuZHMgU2VnbWVudFByb3BzQmFzZSB7XG4gIC8qKlxuICAgKiBTQ1RFLTM1IG1lc3NhZ2UgdHlwZXMgdG8gdHJlYXQgYXMgYWQgbWFya2Vycy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBmaWx0ZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHNjdGVGaWx0ZXI/OiBTY3RlTWVzc2FnZVR5cGVbXTtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBTQ1RFLTM1IG1lc3NhZ2VzIGFyZSBpbmNsdWRlZCBpbiBzZWdtZW50IGZpbGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNDVEUtMzUgbWVzc2FnZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiBzZWdtZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZUluU2VnbWVudHM/OiBTY3RlSW5TZWdtZW50cztcblxuICAvKipcbiAgICogRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGUgQ01BRiBzZWdtZW50LlxuICAgKlxuICAgKiBVc2UgYENtYWZFbmNyeXB0aW9uLnNwZWtlKClgIHRvIGNyZWF0ZSB0aGUgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uPzogQ21hZkVuY3J5cHRpb247XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgSVNNIChNaWNyb3NvZnQgU21vb3RoIFN0cmVhbWluZykgc2VnbWVudCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzbVNlZ21lbnRQcm9wcyBleHRlbmRzIFNlZ21lbnRQcm9wc0Jhc2Uge1xuICAvKipcbiAgICogRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGUgSVNNIHNlZ21lbnQuXG4gICAqXG4gICAqIFVzZSBgSXNtRW5jcnlwdGlvbi5zcGVrZSgpYCB0byBjcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbj86IElzbUVuY3J5cHRpb247XG59XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIGZvciBjcmVhdGluZyBzZWdtZW50IGNvbmZpZ3VyYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgU2VnbWVudCB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBUUyAoVHJhbnNwb3J0IFN0cmVhbSkgc2VnbWVudCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBVc2UgdGhpcyBmb3IgZW5kcG9pbnRzIHdpdGggQ29udGFpbmVyVHlwZS5UUy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdHMocHJvcHM6IFRzU2VnbWVudFByb3BzID0ge30pOiBTZWdtZW50Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRhaW5lclR5cGU6IENvbnRhaW5lclR5cGUuVFMsXG4gICAgICBpbmNsdWRlSWZyYW1lT25seVN0cmVhbXM6IHByb3BzLmluY2x1ZGVJZnJhbWVPbmx5U3RyZWFtcyxcbiAgICAgIHNjdGVGaWx0ZXI6IHByb3BzLnNjdGVGaWx0ZXIsXG4gICAgICBzY3RlSW5TZWdtZW50czogcHJvcHMuc2N0ZUluU2VnbWVudHMsXG4gICAgICBzZWdtZW50RHVyYXRpb246IHByb3BzLmR1cmF0aW9uLFxuICAgICAgc2VnbWVudE5hbWU6IHByb3BzLm5hbWUsXG4gICAgICB0c0luY2x1ZGVEdmJTdWJ0aXRsZXM6IHByb3BzLmluY2x1ZGVEdmJTdWJ0aXRsZXMsXG4gICAgICB0c1VzZUF1ZGlvUmVuZGl0aW9uR3JvdXA6IHByb3BzLnVzZUF1ZGlvUmVuZGl0aW9uR3JvdXAsXG4gICAgICBlbmNyeXB0aW9uOiBwcm9wcy5lbmNyeXB0aW9uLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ01BRiBzZWdtZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFVzZSB0aGlzIGZvciBlbmRwb2ludHMgd2l0aCBDb250YWluZXJUeXBlLkNNQUYuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNtYWYocHJvcHM6IENtYWZTZWdtZW50UHJvcHMgPSB7fSk6IFNlZ21lbnRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGFpbmVyVHlwZTogQ29udGFpbmVyVHlwZS5DTUFGLFxuICAgICAgaW5jbHVkZUlmcmFtZU9ubHlTdHJlYW1zOiBwcm9wcy5pbmNsdWRlSWZyYW1lT25seVN0cmVhbXMsXG4gICAgICBzY3RlRmlsdGVyOiBwcm9wcy5zY3RlRmlsdGVyLFxuICAgICAgc2N0ZUluU2VnbWVudHM6IHByb3BzLnNjdGVJblNlZ21lbnRzLFxuICAgICAgc2VnbWVudER1cmF0aW9uOiBwcm9wcy5kdXJhdGlvbixcbiAgICAgIHNlZ21lbnROYW1lOiBwcm9wcy5uYW1lLFxuICAgICAgZW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBJU00gKE1pY3Jvc29mdCBTbW9vdGggU3RyZWFtaW5nKSBzZWdtZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFVzZSB0aGlzIGZvciBlbmRwb2ludHMgd2l0aCBDb250YWluZXJUeXBlLklTTS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNtKHByb3BzOiBJc21TZWdtZW50UHJvcHMgPSB7fSk6IFNlZ21lbnRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGFpbmVyVHlwZTogQ29udGFpbmVyVHlwZS5JU00sXG4gICAgICBpbmNsdWRlSWZyYW1lT25seVN0cmVhbXM6IHByb3BzLmluY2x1ZGVJZnJhbWVPbmx5U3RyZWFtcyxcbiAgICAgIHNlZ21lbnREdXJhdGlvbjogcHJvcHMuZHVyYXRpb24sXG4gICAgICBzZWdtZW50TmFtZTogcHJvcHMubmFtZSxcbiAgICAgIGVuY3J5cHRpb246IHByb3BzLmVuY3J5cHRpb24sXG4gICAgfTtcbiAgfVxufVxuXG5hYnN0cmFjdCBjbGFzcyBPcmlnaW5FbmRwb2ludEJhc2UgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElPcmlnaW5FbmRwb2ludCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIE9yaWdpbkVuZHBvaW50IGNvbnN0cnVjdCB0aGF0IHJlcHJlc2VudHMgYW4gZXh0ZXJuYWwgKGltcG9ydGVkKSBPcmlnaW4gRW5kcG9pbnQgZnJvbSBpdHMgQVJOLlxuICAgKlxuICAgKiBUaGUgQVJOIGlzIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBmb3JtYXQ6XG4gICAqIGBhcm46PHBhcnRpdGlvbj46bWVkaWFwYWNrYWdldjI6PHJlZ2lvbj46PGFjY291bnQ+OmNoYW5uZWxHcm91cC88Z3JvdXBOYW1lPi9jaGFubmVsLzxjaGFubmVsTmFtZT4vb3JpZ2luRW5kcG9pbnQvPGVuZHBvaW50TmFtZT5gXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21PcmlnaW5FbmRwb2ludEFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBvcmlnaW5FbmRwb2ludEFybjogc3RyaW5nKTogSU9yaWdpbkVuZHBvaW50IHtcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKG9yaWdpbkVuZHBvaW50QXJuKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YFRva2VuQXJuTm90U3VwcG9ydGVkYCxcbiAgICAgICAgJ0Nhbm5vdCBwYXJzZSBhIHRva2VuIEFSTi4gVXNlIE9yaWdpbkVuZHBvaW50LmZyb21PcmlnaW5FbmRwb2ludEF0dHJpYnV0ZXMoKSB3aXRoIGV4cGxpY2l0IGNoYW5uZWxHcm91cE5hbWUsIGNoYW5uZWxOYW1lLCBvcmlnaW5FbmRwb2ludE5hbWUsIGFuZCByZWdpb24gdmFsdWVzIGluc3RlYWQuJyxcbiAgICAgICAgc2NvcGUsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWRBcm4gPSBTdGFjay5vZihzY29wZSkuc3BsaXRBcm4ob3JpZ2luRW5kcG9pbnRBcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKTtcbiAgICAvLyByZXNvdXJjZU5hbWUgaXMgXCI8Z3JvdXBOYW1lPi9jaGFubmVsLzxjaGFubmVsTmFtZT4vb3JpZ2luRW5kcG9pbnQvPGVuZHBvaW50TmFtZT5cIlxuICAgIGNvbnN0IFtjaGFubmVsR3JvdXBOYW1lLCAsIGNoYW5uZWxOYW1lLCAsIG9yaWdpbkVuZHBvaW50TmFtZV0gPSBwYXJzZWRBcm4ucmVzb3VyY2VOYW1lPy5zcGxpdCgnLycpID8/IFtdO1xuICAgIGlmICghY2hhbm5lbEdyb3VwTmFtZSB8fCAhY2hhbm5lbE5hbWUgfHwgIW9yaWdpbkVuZHBvaW50TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YEludmFsaWRPcmlnaW5FbmRwb2ludEFybmAsXG4gICAgICAgIGBDb3VsZCBub3QgcGFyc2Ugb3JpZ2luIGVuZHBvaW50IEFSTjogJHtvcmlnaW5FbmRwb2ludEFybn0uIEV4cGVjdGVkIGZvcm1hdDogYXJuOjxwYXJ0aXRpb24+Om1lZGlhcGFja2FnZXYyOjxyZWdpb24+OjxhY2NvdW50PjpjaGFubmVsR3JvdXAvPGdyb3VwTmFtZT4vY2hhbm5lbC88Y2hhbm5lbE5hbWU+L29yaWdpbkVuZHBvaW50LzxlbmRwb2ludE5hbWU+YCxcbiAgICAgICAgc2NvcGUsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gT3JpZ2luRW5kcG9pbnRCYXNlLmZyb21PcmlnaW5FbmRwb2ludEF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICBjaGFubmVsR3JvdXBOYW1lLFxuICAgICAgY2hhbm5lbE5hbWUsXG4gICAgICBvcmlnaW5FbmRwb2ludE5hbWUsXG4gICAgICByZWdpb246IHBhcnNlZEFybi5yZWdpb24sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBPcmlnaW5FbmRwb2ludCBjb25zdHJ1Y3QgdGhhdCByZXByZXNlbnRzIGFuIGV4dGVybmFsIChpbXBvcnRlZCkgT3JpZ2luIEVuZHBvaW50LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tT3JpZ2luRW5kcG9pbnRBdHRyaWJ1dGVzKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBPcmlnaW5FbmRwb2ludEF0dHJpYnV0ZXMpOiBJT3JpZ2luRW5kcG9pbnQge1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIE9yaWdpbkVuZHBvaW50QmFzZSBpbXBsZW1lbnRzIElPcmlnaW5FbmRwb2ludCB7XG4gICAgICBwcm90ZWN0ZWQgaGxzTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5IbHNNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdID0gW107XG4gICAgICBwcm90ZWN0ZWQgbGxIbHNNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50Lkxvd0xhdGVuY3lIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdID0gW107XG4gICAgICBwcm90ZWN0ZWQgZGFzaE1hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuRGFzaE1hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5W10gPSBbXTtcbiAgICAgIHByb3RlY3RlZCBtc3NNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50Lk1zc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5W10gPSBbXTtcbiAgICAgIHByb3RlY3RlZCBzZWdtZW50PzogU2VnbWVudENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcG9saWN5ID0gdW5kZWZpbmVkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxHcm91cE5hbWUgPSBhdHRycy5jaGFubmVsR3JvdXBOYW1lO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxOYW1lID0gYXR0cnMuY2hhbm5lbE5hbWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgb3JpZ2luRW5kcG9pbnROYW1lID0gYXR0cnMub3JpZ2luRW5kcG9pbnROYW1lO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBtb2RpZmllZEF0ID0gdW5kZWZpbmVkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGhsc01hbmlmZXN0VXJscyA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBsb3dMYXRlbmN5SGxzTWFuaWZlc3RVcmxzID0gdW5kZWZpbmVkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGRhc2hNYW5pZmVzdFVybHMgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgbXNzTWFuaWZlc3RVcmxzID0gdW5kZWZpbmVkO1xuICAgICAgcHJvdGVjdGVkIGF1dG9DcmVhdGVQb2xpY3kgPSBmYWxzZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBvcmlnaW5FbmRwb2ludEFybiA9IFN0YWNrLm9mKHRoaXMpLmZvcm1hdEFybih7XG4gICAgICAgIHNlcnZpY2U6ICdtZWRpYXBhY2thZ2V2MicsXG4gICAgICAgIHJlc291cmNlOiBgY2hhbm5lbEdyb3VwLyR7YXR0cnMuY2hhbm5lbEdyb3VwTmFtZX0vY2hhbm5lbC8ke3RoaXMuY2hhbm5lbE5hbWV9L29yaWdpbkVuZHBvaW50YCxcbiAgICAgICAgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICAgICAgcmVzb3VyY2VOYW1lOiB0aGlzLm9yaWdpbkVuZHBvaW50TmFtZSxcbiAgICAgICAgcmVnaW9uOiBhdHRycy5yZWdpb24sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQpO1xuICB9XG5cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGNoYW5uZWxHcm91cE5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGNoYW5uZWxOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBvcmlnaW5FbmRwb2ludE5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IG9yaWdpbkVuZHBvaW50QXJuOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjcmVhdGVkQXQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBtb2RpZmllZEF0Pzogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgaGxzTWFuaWZlc3RVcmxzPzogc3RyaW5nW107XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBsb3dMYXRlbmN5SGxzTWFuaWZlc3RVcmxzPzogc3RyaW5nW107XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBkYXNoTWFuaWZlc3RVcmxzPzogc3RyaW5nW107XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBtc3NNYW5pZmVzdFVybHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQSByZWZlcmVuY2UgdG8gdGhpcyBPcmlnaW4gRW5kcG9pbnQgcmVzb3VyY2UuXG4gICAqIFJlcXVpcmVkIGJ5IHRoZSBhdXRvLWdlbmVyYXRlZCBJT3JpZ2luRW5kcG9pbnRSZWYgaW50ZXJmYWNlLlxuICAgKi9cbiAgcHVibGljIGdldCBvcmlnaW5FbmRwb2ludFJlZigpOiBPcmlnaW5FbmRwb2ludFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9yaWdpbkVuZHBvaW50QXJuOiB0aGlzLm9yaWdpbkVuZHBvaW50QXJuLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgaGxzTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5IbHNNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgbGxIbHNNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50Lkxvd0xhdGVuY3lIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZGFzaE1hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuRGFzaE1hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5W107XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBtc3NNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50Lk1zc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5W107XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzZWdtZW50PzogU2VnbWVudENvbmZpZ3VyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgcG9saWN5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9yaWdpbiBlbmRwb2ludC5cbiAgICpcbiAgICogSWYgYGF1dG9DcmVhdGVQb2xpY3lgIGlzIHRydWUsIGFuIGBPcmlnaW5FbmRwb2ludFBvbGljeWAgd2lsbCBiZSBjcmVhdGVkIHVwb24gdGhlXG4gICAqIGZpcnN0IGNhbGwgdG8gYWRkVG9SZXNvdXJjZVBvbGljeShzKS5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBwb2xpY3k/OiBPcmlnaW5FbmRwb2ludFBvbGljeTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIGFuIG9yaWdpbiBlbmRwb2ludCByZXNvdXJjZSBwb2xpY3kgc2hvdWxkIGF1dG9tYXRpY2FsbHkgYmUgY3JlYXRlZCB1cG9uXG4gICAqIHRoZSBmaXJzdCBjYWxsIHRvIGBhZGRUb1Jlc291cmNlUG9saWN5YC5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBhdXRvQ3JlYXRlUG9saWN5OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDRE4gYXV0aG9yaXphdGlvbiBjb25maWd1cmF0aW9uIHRvIGJlIGFwcGxpZWQgd2hlbiB0aGUgcG9saWN5IGlzIGNyZWF0ZWQuXG4gICAqIFNldCBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcnMgd2hlbiBgY2RuQXV0aGAgaXMgcHJvdmlkZWQgaW4gcHJvcHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgY2RuQXV0aENvbmZpZz86IENkbkF1dGhDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgb3JpZ2luIGVuZHBvaW50IHBvbGljeS5cbiAgICpcbiAgICogWW91IGNhbiBvbmx5IGFkZCAxIE9yaWdpbkVuZHBvaW50UG9saWN5IHRvIGFuIE9yaWdpbkVuZHBvaW50LiBJZiB5b3UgaGF2ZSBhbHJlYWR5XG4gICAqIGRlZmluZWQgb25lLCB0aGlzIHdpbGwgYXBwZW5kIHRvIHRoZSBwb2xpY3kgYWxyZWFkeSBjcmVhdGVkLlxuICAgKlxuICAgKiBUbyBjb25maWd1cmUgQ0ROIGF1dGhlbnRpY2F0aW9uLCBzZXQgYGNkbkF1dGhgIG9uIHRoZSBjb25zdHJ1Y3QncyBwcm9wcyBpbnN0ZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhdGVtZW50IC0gVGhlIHBvbGljeSBzdGF0ZW1lbnQgdG8gYWRkXG4gICAqL1xuICBwdWJsaWMgYWRkVG9SZXNvdXJjZVBvbGljeShzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCk6IEFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQge1xuICAgIGlmICghdGhpcy5wb2xpY3kgJiYgdGhpcy5hdXRvQ3JlYXRlUG9saWN5KSB7XG4gICAgICB0aGlzLnBvbGljeSA9IG5ldyBPcmlnaW5FbmRwb2ludFBvbGljeSh0aGlzLCAnUG9saWN5Jywge1xuICAgICAgICBvcmlnaW5FbmRwb2ludDogdGhpcyxcbiAgICAgICAgY2RuQXV0aDogdGhpcy5jZG5BdXRoQ29uZmlnLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucG9saWN5KSB7XG4gICAgICB0aGlzLnBvbGljeS5kb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHN0YXRlbWVudCk7XG4gICAgICByZXR1cm4geyBzdGF0ZW1lbnRBZGRlZDogdHJ1ZSwgcG9saWN5RGVwZW5kYWJsZTogdGhpcy5wb2xpY3kgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGF0ZW1lbnRBZGRlZDogZmFsc2UgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbmQgbW9kaWZ5IFNlZ21lbnQgY29uZmlndXJhdGlvbiBmb3IgZW5kcG9pbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2VnbWVudFZhbGlkYXRpb24oc2VnbWVudENvbnRhaW5lclR5cGU6IENvbnRhaW5lclR5cGUsIHNlZ21lbnQ/OiBTZWdtZW50Q29uZmlndXJhdGlvbik6IENmbk9yaWdpbkVuZHBvaW50LlNlZ21lbnRQcm9wZXJ0eSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHNlZ21lbnQ/LnNlZ21lbnREdXJhdGlvbiAmJiAoc2VnbWVudC5zZWdtZW50RHVyYXRpb24/LnRvU2Vjb25kcygpIDwgMSB8fCBzZWdtZW50LnNlZ21lbnREdXJhdGlvbj8udG9TZWNvbmRzKCkgPiAzMCkpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YFNlZ21lbnREdXJhdGlvblJhbmdlYCwgJ1NlZ21lbnQgRHVyYXRpb24gbmVlZHMgdG8gYmUgYmV0d2VlbiAxLTMwIHNlY29uZHMuJywgdGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKHNlZ21lbnRDb250YWluZXJUeXBlICE9IENvbnRhaW5lclR5cGUuVFMgJiYgKHNlZ21lbnQ/LnRzSW5jbHVkZUR2YlN1YnRpdGxlcyB8fCBzZWdtZW50Py50c1VzZUF1ZGlvUmVuZGl0aW9uR3JvdXApKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBUc09wdGlvbnNJbmNvbXBhdGlibGVgLCAnRGlzYWJsZSBUUyBTZWdtZW50IG9wdGlvbnMgZm9yIER2YlN1YnRpdGxlcyBhbmQgQXVkaW9SZW5kaXRpb25Hcm91cHMgd2hlbiB1c2luZyBDTUFGLicsIHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpbmNsdWRlSWZyYW1lT25seVN0cmVhbXM6IHNlZ21lbnQ/LmluY2x1ZGVJZnJhbWVPbmx5U3RyZWFtcyxcbiAgICAgIHNlZ21lbnREdXJhdGlvblNlY29uZHM6IHNlZ21lbnQ/LnNlZ21lbnREdXJhdGlvbj8udG9TZWNvbmRzKCksXG4gICAgICBzZWdtZW50TmFtZTogc2VnbWVudD8uc2VnbWVudE5hbWUsXG4gICAgICB0c0luY2x1ZGVEdmJTdWJ0aXRsZXM6IHNlZ21lbnQ/LnRzSW5jbHVkZUR2YlN1YnRpdGxlcyxcbiAgICAgIHRzVXNlQXVkaW9SZW5kaXRpb25Hcm91cDogc2VnbWVudD8udHNVc2VBdWRpb1JlbmRpdGlvbkdyb3VwLFxuICAgICAgc2N0ZTogKHNlZ21lbnQ/LnNjdGVGaWx0ZXIgfHwgc2VnbWVudD8uc2N0ZUluU2VnbWVudHMpID8ge1xuICAgICAgICBzY3RlRmlsdGVyOiBzZWdtZW50Py5zY3RlRmlsdGVyLFxuICAgICAgICBzY3RlSW5TZWdtZW50czogc2VnbWVudD8uc2N0ZUluU2VnbWVudHMsXG4gICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgZW5jcnlwdGlvbjogc2VnbWVudD8uZW5jcnlwdGlvbj8uX2JpbmQodGhpcyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBDbG91ZFdhdGNoIG1ldHJpYy5cbiAgICpcbiAgICogQHBhcmFtIG1ldHJpY05hbWUgbmFtZSBvZiB0aGUgbWV0cmljLlxuICAgKiBAcGFyYW0gcHJvcHMgbWV0cmljIG9wdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IE1ldHJpYyh7XG4gICAgICBtZXRyaWNOYW1lLFxuICAgICAgbmFtZXNwYWNlOiAnQVdTL01lZGlhUGFja2FnZScsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgIENoYW5uZWxHcm91cDogdGhpcy5jaGFubmVsR3JvdXBOYW1lLFxuICAgICAgICBDaGFubmVsOiB0aGlzLmNoYW5uZWxOYW1lLFxuICAgICAgICBPcmlnaW5FbmRwb2ludDogdGhpcy5vcmlnaW5FbmRwb2ludE5hbWUsXG4gICAgICB9LFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBNZXRyaWMgZm9yIEluZ3Jlc3MgQnl0ZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljSW5ncmVzc0J5dGVzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdJbmdyZXNzQnl0ZXMnLCB7XG4gICAgICBzdGF0aXN0aWM6ICdzdW0nLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuQllURVMsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIE1ldHJpYyBmb3IgRWdyZXNzIEJ5dGVzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY0VncmVzc0J5dGVzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdFZ3Jlc3NCeXRlcycsIHtcbiAgICAgIHN0YXRpc3RpYzogJ3N1bScsXG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgdW5pdDogVW5pdC5CWVRFUyxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgTWV0cmljIGZvciBJbmdyZXNzIHJlc3BvbnNlIHRpbWVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdmVyYWdlIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY0luZ3Jlc3NSZXNwb25zZVRpbWUocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0luZ3Jlc3NSZXNwb25zZVRpbWUnLCB7XG4gICAgICBzdGF0aXN0aWM6ICdhdmcnLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuTUlMTElTRUNPTkRTLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBNZXRyaWMgZm9yIEVncmVzcyBSZXNwb25zZSB0aW1lXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXZlcmFnZSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNFZ3Jlc3NSZXNwb25zZVRpbWUocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0VncmVzc1Jlc3BvbnNlVGltZScsIHtcbiAgICAgIHN0YXRpc3RpYzogJ2F2ZycsXG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgdW5pdDogVW5pdC5NSUxMSVNFQ09ORFMsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIE1ldHJpYyBmb3IgRWdyZXNzIFJlcXVlc3QgQ291bnRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljRWdyZXNzUmVxdWVzdENvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdFZ3Jlc3NSZXF1ZXN0Q291bnQnLCB7XG4gICAgICBzdGF0aXN0aWM6ICdzdW0nLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuQ09VTlQsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIE1ldHJpYyBmb3IgSW5ncmVzcyBSZXF1ZXN0IENvdW50XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY0luZ3Jlc3NSZXF1ZXN0Q291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0luZ3Jlc3NSZXF1ZXN0Q291bnQnLCB7XG4gICAgICBzdGF0aXN0aWM6ICdzdW0nLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuQ09VTlQsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIERlZmluZXMgYW4gQVdTIEVsZW1lbnRhbCBNZWRpYVBhY2thZ2UgVjIgT3JpZ2luIEVuZHBvaW50XG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBPcmlnaW5FbmRwb2ludCBleHRlbmRzIE9yaWdpbkVuZHBvaW50QmFzZSBpbXBsZW1lbnRzIElPcmlnaW5FbmRwb2ludCB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLW1lZGlhcGFja2FnZXYyLWFscGhhLk9yaWdpbkVuZHBvaW50JztcblxuICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbEdyb3VwTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbE5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG9yaWdpbkVuZHBvaW50TmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgb3JpZ2luRW5kcG9pbnRBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgY3JlYXRpb24gb2YgdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vZGlmaWNhdGlvbiBvZiB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1vZGlmaWVkQXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFycmF5IGNvbnRhaW5pbmcgTG93IExhdGVuY3kgSExTIE1hbmlmZXN0cyBjcmVhdGVkIGJ5IHRoZSBPcmlnaW5FbmRwb2ludC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb3dMYXRlbmN5SGxzTWFuaWZlc3RVcmxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEFycmF5IGNvbnRhaW5pbmcgSExTIE1hbmlmZXN0cyBjcmVhdGVkIGJ5IHRoZSBPcmlnaW5FbmRwb2ludC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBobHNNYW5pZmVzdFVybHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQXJyYXkgY29udGFpbmluZyBEQVNIIE1hbmlmZXN0cyBjcmVhdGVkIGJ5IHRoZSBPcmlnaW5FbmRwb2ludC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkYXNoTWFuaWZlc3RVcmxzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBBcnJheSBjb250YWluaW5nIE1TUyBNYW5pZmVzdHMgY3JlYXRlZCBieSB0aGUgT3JpZ2luRW5kcG9pbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbXNzTWFuaWZlc3RVcmxzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgcG9saWN5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9yaWdpbiBlbmRwb2ludC5cbiAgICpcbiAgICogSWYgYGF1dG9DcmVhdGVQb2xpY3lgIGlzIHRydWUsIGFuIGBPcmlnaW5FbmRwb2ludFBvbGljeWAgd2lsbCBiZSBjcmVhdGVkIHVwb24gdGhlXG4gICAqIGZpcnN0IGNhbGwgdG8gYWRkVG9SZXNvdXJjZVBvbGljeShzKS5cbiAgICovXG4gIHB1YmxpYyBwb2xpY3k/OiBPcmlnaW5FbmRwb2ludFBvbGljeTtcbiAgcHJvdGVjdGVkIGF1dG9DcmVhdGVQb2xpY3kgPSB0cnVlO1xuICBwcm90ZWN0ZWQgaGxzTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5IbHNNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdID0gW107XG4gIHByb3RlY3RlZCBsbEhsc01hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuTG93TGF0ZW5jeUhsc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5W10gPSBbXTtcbiAgcHJvdGVjdGVkIGRhc2hNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50LkRhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdID0gW107XG4gIHByb3RlY3RlZCBtc3NNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50Lk1zc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5W10gPSBbXTtcbiAgcHJvdGVjdGVkIHNlZ21lbnQ/OiBTZWdtZW50Q29uZmlndXJhdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogT3JpZ2luRW5kcG9pbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcz8ub3JpZ2luRW5kcG9pbnROYW1lID8/IExhenkuc3RyaW5nKHtcbiAgICAgICAgcHJvZHVjZTogKCkgPT4gTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHtcbiAgICAgICAgICBtYXhMZW5ndGg6IDI1NixcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgLy8gVmFsaWRhdGUgb3JpZ2luRW5kcG9pbnROYW1lIGlmIHByb3ZpZGVkXG4gICAgaWYgKHByb3BzLm9yaWdpbkVuZHBvaW50TmFtZSAhPSBudWxsICYmICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMub3JpZ2luRW5kcG9pbnROYW1lKSkge1xuICAgICAgaWYgKHByb3BzLm9yaWdpbkVuZHBvaW50TmFtZS5sZW5ndGggPCAxIHx8IHByb3BzLm9yaWdpbkVuZHBvaW50TmFtZS5sZW5ndGggPiAyNTYpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgT3JpZ2luRW5kcG9pbnROYW1lTGVuZ3RoYCwgJ09yaWdpbiBlbmRwb2ludCBuYW1lIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAyNTYgY2hhcmFjdGVycyBpbiBsZW5ndGguJywgdGhpcyk7XG4gICAgICB9XG4gICAgICBpZiAoIXByb3BzLm9yaWdpbkVuZHBvaW50TmFtZS5tYXRjaCgvXlthLXpBLVowLTlfLV0rJC8pKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YE9yaWdpbkVuZHBvaW50TmFtZVBhdHRlcm5gLCAnT3JpZ2luIGVuZHBvaW50IG5hbWUgbXVzdCBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3Jlcy4nLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBkZXNjcmlwdGlvbiBpZiBwcm92aWRlZFxuICAgIGlmIChwcm9wcy5kZXNjcmlwdGlvbiAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLmRlc2NyaXB0aW9uKSAmJiBwcm9wcy5kZXNjcmlwdGlvbi5sZW5ndGggPiAxMDI0KSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBPcmlnaW5FbmRwb2ludERlc2NyaXB0aW9uTGVuZ3RoYCwgJ09yaWdpbiBlbmRwb2ludCBkZXNjcmlwdGlvbiBtdXN0IG5vdCBleGNlZWQgMTAyNCBjaGFyYWN0ZXJzLicsIHRoaXMpO1xuICAgIH1cblxuICAgIHRoaXMuc2VnbWVudCA9IHByb3BzLnNlZ21lbnQ7XG5cbiAgICAvLyBHZXQgY29udGFpbmVyIHR5cGUgZnJvbSBzZWdtZW50XG4gICAgY29uc3QgY29udGFpbmVyVHlwZSA9IHByb3BzLnNlZ21lbnQuY29udGFpbmVyVHlwZTtcblxuICAgIGlmIChwcm9wcz8uc3RhcnRvdmVyV2luZG93ICYmIChwcm9wcy5zdGFydG92ZXJXaW5kb3cudG9TZWNvbmRzKCkgPCA2MCB8fCBwcm9wcy5zdGFydG92ZXJXaW5kb3cudG9TZWNvbmRzKCkgPiAxMjA5NjAwKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgU3RhcnRvdmVyV2luZG93UmFuZ2VgLCAnU3RhcnRvdmVyIFdpbmRvdyBuZWVkcyB0byBiZSBiZXR3ZWVuIDYwLTEyMDk2MDAgc2Vjb25kcy4nLCB0aGlzKTtcbiAgICB9XG5cbiAgICBwcm9wcy5tYW5pZmVzdHMuZm9yRWFjaChtYW5pZmVzdCA9PiB7XG4gICAgICBtYW5pZmVzdC5fYmluZCh7XG4gICAgICAgIGhsc01hbmlmZXN0czogdGhpcy5obHNNYW5pZmVzdHMsXG4gICAgICAgIGxsSGxzTWFuaWZlc3RzOiB0aGlzLmxsSGxzTWFuaWZlc3RzLFxuICAgICAgICBkYXNoTWFuaWZlc3RzOiB0aGlzLmRhc2hNYW5pZmVzdHMsXG4gICAgICAgIG1zc01hbmlmZXN0czogdGhpcy5tc3NNYW5pZmVzdHMsXG4gICAgICAgIHNlZ21lbnQ6IHByb3BzLnNlZ21lbnQsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFZhbGlkYXRlIG1hbmlmZXN0IG5hbWUgdW5pcXVlbmVzcyBhY3Jvc3MgYWxsIG1hbmlmZXN0IHR5cGVzXG4gICAgY29uc3QgYWxsTWFuaWZlc3ROYW1lcyA9IFtcbiAgICAgIC4uLnRoaXMuaGxzTWFuaWZlc3RzLm1hcChtID0+IG0ubWFuaWZlc3ROYW1lKSxcbiAgICAgIC4uLnRoaXMubGxIbHNNYW5pZmVzdHMubWFwKG0gPT4gbS5tYW5pZmVzdE5hbWUpLFxuICAgICAgLi4udGhpcy5kYXNoTWFuaWZlc3RzLm1hcChtID0+IG0ubWFuaWZlc3ROYW1lKSxcbiAgICAgIC4uLnRoaXMubXNzTWFuaWZlc3RzLm1hcChtID0+IG0ubWFuaWZlc3ROYW1lKSxcbiAgICBdLmZpbHRlcihuYW1lID0+ICFUb2tlbi5pc1VucmVzb2x2ZWQobmFtZSkpO1xuXG4gICAgY29uc3QgZHVwbGljYXRlTmFtZXMgPSBbLi4ubmV3IFNldChhbGxNYW5pZmVzdE5hbWVzLmZpbHRlcigobmFtZSwgaSkgPT4gYWxsTWFuaWZlc3ROYW1lcy5pbmRleE9mKG5hbWUpICE9PSBpKSldO1xuICAgIGlmIChkdXBsaWNhdGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgRHVwbGljYXRlTWFuaWZlc3ROYW1lYCxcbiAgICAgICAgYER1cGxpY2F0ZSBtYW5pZmVzdCBuYW1lczogWyR7ZHVwbGljYXRlTmFtZXMuam9pbignLCAnKX1dLiBFYWNoIG1hbmlmZXN0IGluIGFuIE9yaWdpbkVuZHBvaW50IG11c3QgaGF2ZSBhIHVuaXF1ZSBtYW5pZmVzdE5hbWUuYCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbWFuaWZlc3QgYW5kIGNvbnRhaW5lciB0eXBlIGNvbXBhdGliaWxpdHlcbiAgICBpZiAodGhpcy5tc3NNYW5pZmVzdHMubGVuZ3RoID4gMCAmJiBjb250YWluZXJUeXBlICE9PSBDb250YWluZXJUeXBlLklTTSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgTXNzUmVxdWlyZXNJc21gLCAnTVNTIG1hbmlmZXN0cyByZXF1aXJlIElTTSBjb250YWluZXIgdHlwZS4gVXNlIFNlZ21lbnQuaXNtKCkgZm9yIE1TUyBtYW5pZmVzdHMuJywgdGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGFzaE1hbmlmZXN0cy5sZW5ndGggPiAwICYmIGNvbnRhaW5lclR5cGUgIT09IENvbnRhaW5lclR5cGUuQ01BRikge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgRGFzaFJlcXVpcmVzQ21hZmAsICdEQVNIIG1hbmlmZXN0cyByZXF1aXJlIENNQUYgY29udGFpbmVyIHR5cGUuIFVzZSBTZWdtZW50LmNtYWYoKSBmb3IgREFTSCBtYW5pZmVzdHMuJywgdGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKCh0aGlzLmhsc01hbmlmZXN0cy5sZW5ndGggPiAwIHx8IHRoaXMubGxIbHNNYW5pZmVzdHMubGVuZ3RoID4gMCkgJiYgY29udGFpbmVyVHlwZSA9PT0gQ29udGFpbmVyVHlwZS5JU00pIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YEhsc0luY29tcGF0aWJsZVdpdGhJc21gLCAnSExTIGFuZCBMb3cgTGF0ZW5jeSBITFMgbWFuaWZlc3RzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggSVNNIGNvbnRhaW5lciB0eXBlLiBVc2UgU2VnbWVudC5jbWFmKCkgb3IgU2VnbWVudC50cygpIGZvciBITFMgbWFuaWZlc3RzLicsIHRoaXMpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIERSTSBzaWduYWxsaW5nIHJlcXVpcmVzIGVuY3J5cHRpb25cbiAgICBpZiAodGhpcy5kYXNoTWFuaWZlc3RzLnNvbWUobSA9PiBtLmRybVNpZ25hbGluZykgJiYgIXByb3BzLnNlZ21lbnQuZW5jcnlwdGlvbikge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgRHJtU2lnbmFsbGluZ1JlcXVpcmVzRW5jcnlwdGlvbmAsICdEUk0gc2lnbmFsbGluZyByZXF1aXJlcyBlbmNyeXB0aW9uIHRvIGJlIGNvbmZpZ3VyZWQgb24gdGhlIGVuZHBvaW50LicsIHRoaXMpO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbiA9IG5ldyBDZm5PcmlnaW5FbmRwb2ludCh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBjaGFubmVsTmFtZTogcHJvcHMuY2hhbm5lbC5jaGFubmVsTmFtZSxcbiAgICAgIGNoYW5uZWxHcm91cE5hbWU6IHByb3BzLmNoYW5uZWwuY2hhbm5lbEdyb3VwTmFtZSxcbiAgICAgIG9yaWdpbkVuZHBvaW50TmFtZTogdGhpcy5waHlzaWNhbE5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICB0YWdzOiBwcm9wcz8udGFncyA/IHJlbmRlclRhZ3MocHJvcHMudGFncykgOiB1bmRlZmluZWQsXG4gICAgICBobHNNYW5pZmVzdHM6IG9taXRFbXB0eUFycmF5KHRoaXMuaGxzTWFuaWZlc3RzKSxcbiAgICAgIGxvd0xhdGVuY3lIbHNNYW5pZmVzdHM6IG9taXRFbXB0eUFycmF5KHRoaXMubGxIbHNNYW5pZmVzdHMpLFxuICAgICAgZGFzaE1hbmlmZXN0czogb21pdEVtcHR5QXJyYXkodGhpcy5kYXNoTWFuaWZlc3RzKSxcbiAgICAgIG1zc01hbmlmZXN0czogb21pdEVtcHR5QXJyYXkodGhpcy5tc3NNYW5pZmVzdHMpLFxuICAgICAgY29udGFpbmVyVHlwZTogY29udGFpbmVyVHlwZSxcbiAgICAgIHN0YXJ0b3ZlcldpbmRvd1NlY29uZHM6IHByb3BzLnN0YXJ0b3ZlcldpbmRvdz8udG9TZWNvbmRzKCksXG4gICAgICBzZWdtZW50OiB0aGlzLnNlZ21lbnRWYWxpZGF0aW9uKGNvbnRhaW5lclR5cGUsIHByb3BzLnNlZ21lbnQpLFxuICAgICAgZm9yY2VFbmRwb2ludEVycm9yQ29uZmlndXJhdGlvbjogcHJvcHMuZm9yY2VFbmRwb2ludENvbmZpZ3VyYXRpb25Db25kaXRpb25zID8ge1xuICAgICAgICBlbmRwb2ludEVycm9yQ29uZGl0aW9uczogcHJvcHMuZm9yY2VFbmRwb2ludENvbmZpZ3VyYXRpb25Db25kaXRpb25zLFxuICAgICAgfTogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgLy8gVGhlIGNoYW5uZWxOYW1lL2NoYW5uZWxHcm91cE5hbWUgYXJlIHJlbmRlcmVkIGFzIGxpdGVyYWwgc3RyaW5ncyAobm90IENGTiBSZWZzKSwgc29cbiAgICAvLyBDbG91ZEZvcm1hdGlvbiBjYW5ub3QgaW5mZXIgdGhlIGRlcGVuZGVuY3kuIFdlIGFkZCBkaXJlY3QgQ2ZuUmVzb3VyY2UtbGV2ZWwgRGVwZW5kc09uXG4gICAgLy8gdG8gZ3VhcmFudGVlIGRlcGxveSBvcmRlcmluZyB3aXRob3V0IHRyaWdnZXJpbmcgQ0RLJ3Mgc3VidHJlZS1sZXZlbCBjeWNsZSBkZXRlY3Rpb24uXG4gICAgLy8gRm9yIGltcG9ydGVkIGNvbnN0cnVjdHMsIGRlZmF1bHRDaGlsZCBpcyB1bmRlZmluZWQgKG5vIENGTiByZXNvdXJjZSB0byBvcmRlciBhZ2FpbnN0KS5cbiAgICBjb25zdCBlbmNyeXB0aW9uUm9sZSA9IHByb3BzLnNlZ21lbnQuZW5jcnlwdGlvbj8uX2dldFJvbGUoKTtcbiAgICBpZiAoZW5jcnlwdGlvblJvbGUpIG9yaWdpbi5ub2RlLmFkZERlcGVuZGVuY3koZW5jcnlwdGlvblJvbGUpO1xuICAgIGNvbnN0IGVuY3J5cHRpb25DZXJ0ID0gcHJvcHMuc2VnbWVudC5lbmNyeXB0aW9uPy5fZ2V0Q2VydGlmaWNhdGUoKTtcbiAgICBpZiAoZW5jcnlwdGlvbkNlcnQpIG9yaWdpbi5ub2RlLmFkZERlcGVuZGVuY3koZW5jcnlwdGlvbkNlcnQpO1xuICAgIGNvbnN0IGNoYW5uZWxDZm4gPSBwcm9wcy5jaGFubmVsLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmblJlc291cmNlIHwgdW5kZWZpbmVkO1xuICAgIGlmIChjaGFubmVsQ2ZuICYmIENmblJlc291cmNlLmlzQ2ZuUmVzb3VyY2UoY2hhbm5lbENmbikpIHtcbiAgICAgIG9yaWdpbi5hZGREZXBlbmRlbmN5KGNoYW5uZWxDZm4pO1xuICAgIH1cbiAgICBjb25zdCBncm91cENmbiA9IHByb3BzLmNoYW5uZWwuY2hhbm5lbEdyb3VwPy5ub2RlLmRlZmF1bHRDaGlsZCBhcyBDZm5SZXNvdXJjZSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZ3JvdXBDZm4gJiYgQ2ZuUmVzb3VyY2UuaXNDZm5SZXNvdXJjZShncm91cENmbikpIHtcbiAgICAgIG9yaWdpbi5hZGREZXBlbmRlbmN5KGdyb3VwQ2ZuKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvd0xhdGVuY3lIbHNNYW5pZmVzdFVybHMgPSB0aGlzLmxsSGxzTWFuaWZlc3RzLm1hcCgoXywgaSkgPT4gRm4uc2VsZWN0KGksIG9yaWdpbi5hdHRyTG93TGF0ZW5jeUhsc01hbmlmZXN0VXJscykpO1xuICAgIHRoaXMuaGxzTWFuaWZlc3RVcmxzID0gdGhpcy5obHNNYW5pZmVzdHMubWFwKChfLCBpKSA9PiBGbi5zZWxlY3QoaSwgb3JpZ2luLmF0dHJIbHNNYW5pZmVzdFVybHMpKTtcbiAgICB0aGlzLmRhc2hNYW5pZmVzdFVybHMgPSB0aGlzLmRhc2hNYW5pZmVzdHMubWFwKChfLCBpKSA9PiBGbi5zZWxlY3QoaSwgb3JpZ2luLmF0dHJEYXNoTWFuaWZlc3RVcmxzKSk7XG4gICAgdGhpcy5tc3NNYW5pZmVzdFVybHMgPSB0aGlzLm1zc01hbmlmZXN0cy5tYXAoKF8sIGkpID0+IEZuLnNlbGVjdChpLCBvcmlnaW4uYXR0ck1zc01hbmlmZXN0VXJscykpO1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gb3JpZ2luLmF0dHJDcmVhdGVkQXQ7XG4gICAgdGhpcy5tb2RpZmllZEF0ID0gb3JpZ2luLmF0dHJNb2RpZmllZEF0O1xuICAgIHRoaXMuY2hhbm5lbEdyb3VwTmFtZSA9IG9yaWdpbi5jaGFubmVsR3JvdXBOYW1lO1xuICAgIHRoaXMuY2hhbm5lbE5hbWUgPSBvcmlnaW4uY2hhbm5lbE5hbWU7XG4gICAgdGhpcy5vcmlnaW5FbmRwb2ludE5hbWUgPSBvcmlnaW4ub3JpZ2luRW5kcG9pbnROYW1lO1xuICAgIHRoaXMub3JpZ2luRW5kcG9pbnRBcm4gPSBvcmlnaW4uYXR0ckFybjtcblxuICAgIG9yaWdpbi5hcHBseVJlbW92YWxQb2xpY3kocHJvcHM/LnJlbW92YWxQb2xpY3kgPz8gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcblxuICAgIC8vIFdoZW4gY2RuQXV0aCBpcyBzZXQsIHByZS1jcmVhdGUgdGhlIGVuZHBvaW50IHBvbGljeSB3aXRoIHRoZSBBV1MtcmVjb21tZW5kZWQgZ2F0aW5nXG4gICAgLy8gc3RhdGVtZW50LiBUaGUgcHJpbmNpcGFsIGlzIGAqYCAoYW5vbnltb3VzKSBiZWNhdXNlIENETiByZXF1ZXN0cyB0byBNZWRpYVBhY2thZ2UgYXJlXG4gICAgLy8gdW5zaWduZWQgSFRUUFMg4oCUIG9ubHkgdGhlIG1hdGNoaW5nIENETi1JZGVudGlmaWVyIGhlYWRlciBwcm92ZXMgYXV0aG9yaXNhdGlvbi5cbiAgICAvLyBTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhcGFja2FnZS9sYXRlc3QvdXNlcmd1aWRlL2Nkbi1hdXRoLXNldHVwLmh0bWxcbiAgICBpZiAocHJvcHMuY2RuQXV0aCkge1xuICAgICAgaWYgKHByb3BzLmNkbkF1dGguc2VjcmV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgQ2RuQXV0aFNlY3JldHNSZXF1aXJlZGAsXG4gICAgICAgICAgJ2NkbkF1dGguc2VjcmV0cyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHNlY3JldC4gQ0ROIGF1dGhvcml6YXRpb24gbmVlZHMgYSBzZWNyZXQgdG8gdmFsaWRhdGUgaW5jb21pbmcgQ0ROLUlkZW50aWZpZXIgaGVhZGVycy4nLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2RuQXV0aENvbmZpZyA9IHByb3BzLmNkbkF1dGg7XG4gICAgICB0aGlzLmFkZFRvUmVzb3VyY2VQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIHNpZDogJ0FsbG93R2V0T2JqZWN0QWNjZXNzRm9yQXV0aG9yaXplZFJlcXVlc3QnLFxuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgcHJpbmNpcGFsczogW25ldyBTdGFyUHJpbmNpcGFsKCldLFxuICAgICAgICBhY3Rpb25zOiBbJ21lZGlhcGFja2FnZXYyOkdldE9iamVjdCddLFxuICAgICAgICByZXNvdXJjZXM6IFt0aGlzLm9yaWdpbkVuZHBvaW50QXJuXSxcbiAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgIEJvb2w6IHtcbiAgICAgICAgICAgICdtZWRpYXBhY2thZ2V2MjpSZXF1ZXN0SGFzTWF0Y2hpbmdDZG5BdXRoSGVhZGVyJzogJ3RydWUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG9taXRFbXB0eUFycmF5PEE+KGE6IEFycmF5PEE+KTogQXJyYXk8QT4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gYS5sZW5ndGggPiAwID8gYSA6IHVuZGVmaW5lZDtcbn1cblxuIl19
|