cdk8s-aws-cdk 0.0.5

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.
Files changed (94) hide show
  1. package/.gitattributes +21 -0
  2. package/.jsii +4392 -0
  3. package/API.md +2204 -0
  4. package/LICENSE +202 -0
  5. package/README.md +201 -0
  6. package/changelog.md +2 -0
  7. package/examples/rds-db-instance/README.md +0 -0
  8. package/examples/rds-db-instance/cdk.out/RdsDBInstanceStack.assets.json +19 -0
  9. package/examples/rds-db-instance/cdk.out/RdsDBInstanceStack.template.json +86 -0
  10. package/examples/rds-db-instance/cdk.out/cdk.out +1 -0
  11. package/examples/rds-db-instance/cdk.out/manifest.json +230 -0
  12. package/examples/rds-db-instance/cdk.out/tree.json +171 -0
  13. package/examples/rds-db-instance/main.ts +136 -0
  14. package/lib/adapter.d.ts +37 -0
  15. package/lib/adapter.d.ts.map +1 -0
  16. package/lib/adapter.js +196 -0
  17. package/lib/chart.d.ts +19 -0
  18. package/lib/chart.d.ts.map +1 -0
  19. package/lib/chart.js +63 -0
  20. package/lib/imports/cloudcontrol.services.k8s.aws.d.ts +106 -0
  21. package/lib/imports/cloudcontrol.services.k8s.aws.d.ts.map +1 -0
  22. package/lib/imports/cloudcontrol.services.k8s.aws.js +92 -0
  23. package/lib/imports/dynamotables-dynamodb.services.k8s.aws.d.ts +430 -0
  24. package/lib/imports/dynamotables-dynamodb.services.k8s.aws.d.ts.map +1 -0
  25. package/lib/imports/dynamotables-dynamodb.services.k8s.aws.js +314 -0
  26. package/lib/imports/ec2securitygroups-ec2.services.k8s.aws.d.ts +173 -0
  27. package/lib/imports/ec2securitygroups-ec2.services.k8s.aws.d.ts.map +1 -0
  28. package/lib/imports/ec2securitygroups-ec2.services.k8s.aws.js +156 -0
  29. package/lib/imports/fieldexports-services.k8s.aws.d.ts +159 -0
  30. package/lib/imports/fieldexports-services.k8s.aws.d.ts.map +1 -0
  31. package/lib/imports/fieldexports-services.k8s.aws.js +151 -0
  32. package/lib/imports/iampolicies-iam.services.k8s.aws.d.ts +135 -0
  33. package/lib/imports/iampolicies-iam.services.k8s.aws.d.ts.map +1 -0
  34. package/lib/imports/iampolicies-iam.services.k8s.aws.js +109 -0
  35. package/lib/imports/iamroles-iam.services.k8s.aws.d.ts +143 -0
  36. package/lib/imports/iamroles-iam.services.k8s.aws.d.ts.map +1 -0
  37. package/lib/imports/iamroles-iam.services.k8s.aws.js +112 -0
  38. package/lib/imports/k8s.d.ts +18619 -0
  39. package/lib/imports/k8s.d.ts.map +1 -0
  40. package/lib/imports/k8s.js +14701 -0
  41. package/lib/imports/lambdaeventsourcemappings-lambda.services.k8s.aws.d.ts +280 -0
  42. package/lib/imports/lambdaeventsourcemappings-lambda.services.k8s.aws.d.ts.map +1 -0
  43. package/lib/imports/lambdaeventsourcemappings-lambda.services.k8s.aws.js +183 -0
  44. package/lib/imports/lambdafunctions-lambda.services.k8s.aws.d.ts +343 -0
  45. package/lib/imports/lambdafunctions-lambda.services.k8s.aws.d.ts.map +1 -0
  46. package/lib/imports/lambdafunctions-lambda.services.k8s.aws.js +225 -0
  47. package/lib/imports/rdsdbinstances-rds.services.k8s.aws.d.ts +790 -0
  48. package/lib/imports/rdsdbinstances-rds.services.k8s.aws.d.ts.map +1 -0
  49. package/lib/imports/rdsdbinstances-rds.services.k8s.aws.js +217 -0
  50. package/lib/imports/rdsdbsubnetgroups-rds.services.k8s.aws.d.ts +114 -0
  51. package/lib/imports/rdsdbsubnetgroups-rds.services.k8s.aws.d.ts.map +1 -0
  52. package/lib/imports/rdsdbsubnetgroups-rds.services.k8s.aws.js +108 -0
  53. package/lib/imports/s3buckets-s3.services.k8s.aws.d.ts +2253 -0
  54. package/lib/imports/s3buckets-s3.services.k8s.aws.d.ts.map +1 -0
  55. package/lib/imports/s3buckets-s3.services.k8s.aws.js +1672 -0
  56. package/lib/imports/sfnmachines-sfn.services.k8s.aws.d.ts +203 -0
  57. package/lib/imports/sfnmachines-sfn.services.k8s.aws.d.ts.map +1 -0
  58. package/lib/imports/sfnmachines-sfn.services.k8s.aws.js +174 -0
  59. package/lib/imports/snstopics-sns.services.k8s.aws.d.ts +106 -0
  60. package/lib/imports/snstopics-sns.services.k8s.aws.d.ts.map +1 -0
  61. package/lib/imports/snstopics-sns.services.k8s.aws.js +110 -0
  62. package/lib/index.d.ts +4 -0
  63. package/lib/index.d.ts.map +1 -0
  64. package/lib/index.js +16 -0
  65. package/lib/mappers/base.d.ts +23 -0
  66. package/lib/mappers/base.d.ts.map +1 -0
  67. package/lib/mappers/base.js +20 -0
  68. package/lib/mappers/ec2-security-group.d.ts +9 -0
  69. package/lib/mappers/ec2-security-group.d.ts.map +1 -0
  70. package/lib/mappers/ec2-security-group.js +33 -0
  71. package/lib/mappers/iam-policy.d.ts +9 -0
  72. package/lib/mappers/iam-policy.d.ts.map +1 -0
  73. package/lib/mappers/iam-policy.js +32 -0
  74. package/lib/mappers/iam-role.d.ts +9 -0
  75. package/lib/mappers/iam-role.d.ts.map +1 -0
  76. package/lib/mappers/iam-role.js +34 -0
  77. package/lib/mappers/index.d.ts +9 -0
  78. package/lib/mappers/index.d.ts.map +1 -0
  79. package/lib/mappers/index.js +21 -0
  80. package/lib/mappers/lambda-function.d.ts +9 -0
  81. package/lib/mappers/lambda-function.d.ts.map +1 -0
  82. package/lib/mappers/lambda-function.js +37 -0
  83. package/lib/mappers/rds-db-instance.d.ts +10 -0
  84. package/lib/mappers/rds-db-instance.d.ts.map +1 -0
  85. package/lib/mappers/rds-db-instance.js +65 -0
  86. package/lib/mappers/rds-db-subnet-group.d.ts +9 -0
  87. package/lib/mappers/rds-db-subnet-group.d.ts.map +1 -0
  88. package/lib/mappers/rds-db-subnet-group.js +34 -0
  89. package/lib/mappers/s3-bucket.d.ts +9 -0
  90. package/lib/mappers/s3-bucket.d.ts.map +1 -0
  91. package/lib/mappers/s3-bucket.js +53 -0
  92. package/package.json +129 -0
  93. package/releasetag.txt +1 -0
  94. package/version.txt +1 -0
@@ -0,0 +1,1672 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toJson_BucketSpecReplicationRulesFilterAndTags = exports.toJson_BucketSpecReplicationRulesDestinationReplicationTimeTime = exports.toJson_BucketSpecReplicationRulesDestinationMetricsEventThreshold = exports.toJson_BucketSpecNotificationTopicConfigurationsFilterKeyFilterRules = exports.toJson_BucketSpecNotificationQueueConfigurationsFilterKeyFilterRules = exports.toJson_BucketSpecNotificationLambdaFunctionConfigurationsFilterKeyFilterRules = exports.toJson_BucketSpecLifecycleRulesFilterAndTags = exports.toJson_BucketSpecInventoryDestinationS3BucketDestinationEncryptionSseKms = exports.toJson_BucketSpecAnalyticsStorageClassAnalysisDataExportDestinationS3BucketDestination = exports.toJson_BucketSpecReplicationRulesSourceSelectionCriteriaSseKmsEncryptedObjects = exports.toJson_BucketSpecReplicationRulesSourceSelectionCriteriaReplicaModifications = exports.toJson_BucketSpecReplicationRulesFilterTag = exports.toJson_BucketSpecReplicationRulesFilterAnd = exports.toJson_BucketSpecReplicationRulesDestinationReplicationTime = exports.toJson_BucketSpecReplicationRulesDestinationMetrics = exports.toJson_BucketSpecReplicationRulesDestinationEncryptionConfiguration = exports.toJson_BucketSpecReplicationRulesDestinationAccessControlTranslation = exports.toJson_BucketSpecNotificationTopicConfigurationsFilterKey = exports.toJson_BucketSpecNotificationQueueConfigurationsFilterKey = exports.toJson_BucketSpecNotificationLambdaFunctionConfigurationsFilterKey = exports.toJson_BucketSpecMetricsFilterAndTags = exports.toJson_BucketSpecLoggingLoggingEnabledTargetGrantsGrantee = exports.toJson_BucketSpecLifecycleRulesFilterTag = exports.toJson_BucketSpecLifecycleRulesFilterAnd = exports.toJson_BucketSpecInventoryDestinationS3BucketDestinationEncryption = exports.toJson_BucketSpecIntelligentTieringFilterAndTags = exports.toJson_BucketSpecAnalyticsStorageClassAnalysisDataExportDestination = exports.toJson_BucketSpecAnalyticsFilterAndTags = exports.toJson_BucketSpecWebsiteRoutingRulesRedirect = exports.toJson_BucketSpecWebsiteRoutingRulesCondition = exports.toJson_BucketSpecReplicationRulesSourceSelectionCriteria = exports.toJson_BucketSpecReplicationRulesFilter = exports.toJson_BucketSpecReplicationRulesExistingObjectReplication = exports.toJson_BucketSpecReplicationRulesDestination = exports.toJson_BucketSpecReplicationRulesDeleteMarkerReplication = exports.toJson_BucketSpecNotificationTopicConfigurationsFilter = exports.toJson_BucketSpecNotificationQueueConfigurationsFilter = exports.toJson_BucketSpecNotificationLambdaFunctionConfigurationsFilter = exports.toJson_BucketSpecMetricsFilterTag = exports.toJson_BucketSpecMetricsFilterAnd = exports.toJson_BucketSpecLoggingLoggingEnabledTargetGrants = exports.toJson_BucketSpecLifecycleRulesTransitions = exports.toJson_BucketSpecLifecycleRulesNoncurrentVersionTransitions = exports.toJson_BucketSpecLifecycleRulesNoncurrentVersionExpiration = exports.toJson_BucketSpecLifecycleRulesFilter = exports.toJson_BucketSpecLifecycleRulesExpiration = exports.toJson_BucketSpecLifecycleRulesAbortIncompleteMultipartUpload = exports.toJson_BucketSpecInventoryDestinationS3BucketDestination = exports.toJson_BucketSpecIntelligentTieringFilterTag = exports.toJson_BucketSpecIntelligentTieringFilterAnd = exports.toJson_BucketSpecEncryptionRulesApplyServerSideEncryptionByDefault = exports.toJson_BucketSpecAnalyticsStorageClassAnalysisDataExport = exports.toJson_BucketSpecAnalyticsFilterTag = exports.toJson_BucketSpecAnalyticsFilterAnd = exports.toJson_BucketSpecWebsiteRoutingRules = exports.toJson_BucketSpecWebsiteRedirectAllRequestsTo = exports.toJson_BucketSpecWebsiteIndexDocument = exports.toJson_BucketSpecWebsiteErrorDocument = exports.toJson_BucketSpecTaggingTagSet = exports.toJson_BucketSpecReplicationRules = exports.toJson_BucketSpecOwnershipControlsRules = exports.toJson_BucketSpecNotificationTopicConfigurations = exports.toJson_BucketSpecNotificationQueueConfigurations = exports.toJson_BucketSpecNotificationLambdaFunctionConfigurations = exports.toJson_BucketSpecMetricsFilter = exports.toJson_BucketSpecLoggingLoggingEnabled = exports.toJson_BucketSpecLifecycleRules = exports.toJson_BucketSpecInventorySchedule = exports.toJson_BucketSpecInventoryFilter = exports.toJson_BucketSpecInventoryDestination = exports.toJson_BucketSpecIntelligentTieringTierings = exports.toJson_BucketSpecIntelligentTieringFilter = exports.toJson_BucketSpecEncryptionRules = exports.toJson_BucketSpecCorsCorsRules = exports.toJson_BucketSpecAnalyticsStorageClassAnalysis = exports.toJson_BucketSpecAnalyticsFilter = exports.toJson_BucketSpecWebsite = exports.toJson_BucketSpecVersioning = exports.toJson_BucketSpecTagging = exports.toJson_BucketSpecRequestPayment = exports.toJson_BucketSpecReplication = exports.toJson_BucketSpecPublicAccessBlock = exports.toJson_BucketSpecOwnershipControls = exports.toJson_BucketSpecNotification = exports.toJson_BucketSpecMetrics = exports.toJson_BucketSpecLogging = exports.toJson_BucketSpecLifecycle = exports.toJson_BucketSpecInventory = exports.toJson_BucketSpecIntelligentTiering = exports.toJson_BucketSpecEncryption = exports.toJson_BucketSpecCreateBucketConfiguration = exports.toJson_BucketSpecCors = exports.toJson_BucketSpecAnalytics = exports.toJson_BucketSpecAccelerate = exports.toJson_BucketSpec = exports.toJson_BucketProps = exports.Bucket = void 0;
4
+ // generated by cdk8s
5
+ const cdk8s_1 = require("cdk8s");
6
+ /**
7
+ * Bucket is the Schema for the Buckets API
8
+ *
9
+ * @schema Bucket
10
+ */
11
+ class Bucket extends cdk8s_1.ApiObject {
12
+ /**
13
+ * Defines a "Bucket" API object
14
+ * @param scope the scope in which to define this object
15
+ * @param id a scope-local name for the object
16
+ * @param props initialization props
17
+ */
18
+ constructor(scope, id, props = {}) {
19
+ super(scope, id, {
20
+ ...Bucket.GVK,
21
+ ...props,
22
+ });
23
+ }
24
+ /**
25
+ * Renders a Kubernetes manifest for "Bucket".
26
+ *
27
+ * This can be used to inline resource manifests inside other objects (e.g. as templates).
28
+ *
29
+ * @param props initialization props
30
+ */
31
+ static manifest(props = {}) {
32
+ return {
33
+ ...Bucket.GVK,
34
+ ...toJson_BucketProps(props),
35
+ };
36
+ }
37
+ /**
38
+ * Renders the object to Kubernetes JSON.
39
+ */
40
+ toJson() {
41
+ const resolved = super.toJson();
42
+ return {
43
+ ...Bucket.GVK,
44
+ ...toJson_BucketProps(resolved),
45
+ };
46
+ }
47
+ }
48
+ exports.Bucket = Bucket;
49
+ /**
50
+ * Returns the apiVersion and kind for "Bucket"
51
+ */
52
+ Bucket.GVK = {
53
+ apiVersion: 's3.services.k8s.aws/v1alpha1',
54
+ kind: 'Bucket',
55
+ };
56
+ /**
57
+ * Converts an object of type 'BucketProps' to JSON representation.
58
+ */
59
+ /* eslint-disable max-len, quote-props */
60
+ function toJson_BucketProps(obj) {
61
+ if (obj === undefined) {
62
+ return undefined;
63
+ }
64
+ const result = {
65
+ 'metadata': obj.metadata,
66
+ 'spec': toJson_BucketSpec(obj.spec),
67
+ };
68
+ // filter undefined values
69
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
70
+ }
71
+ exports.toJson_BucketProps = toJson_BucketProps;
72
+ /**
73
+ * Converts an object of type 'BucketSpec' to JSON representation.
74
+ */
75
+ /* eslint-disable max-len, quote-props */
76
+ function toJson_BucketSpec(obj) {
77
+ var _a, _b, _c, _d;
78
+ if (obj === undefined) {
79
+ return undefined;
80
+ }
81
+ const result = {
82
+ 'accelerate': toJson_BucketSpecAccelerate(obj.accelerate),
83
+ 'acl': obj.acl,
84
+ 'analytics': (_a = obj.analytics) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecAnalytics(y)),
85
+ 'cors': toJson_BucketSpecCors(obj.cors),
86
+ 'createBucketConfiguration': toJson_BucketSpecCreateBucketConfiguration(obj.createBucketConfiguration),
87
+ 'encryption': toJson_BucketSpecEncryption(obj.encryption),
88
+ 'grantFullControl': obj.grantFullControl,
89
+ 'grantRead': obj.grantRead,
90
+ 'grantReadACP': obj.grantReadAcp,
91
+ 'grantWrite': obj.grantWrite,
92
+ 'grantWriteACP': obj.grantWriteAcp,
93
+ 'intelligentTiering': (_b = obj.intelligentTiering) === null || _b === void 0 ? void 0 : _b.map(y => toJson_BucketSpecIntelligentTiering(y)),
94
+ 'inventory': (_c = obj.inventory) === null || _c === void 0 ? void 0 : _c.map(y => toJson_BucketSpecInventory(y)),
95
+ 'lifecycle': toJson_BucketSpecLifecycle(obj.lifecycle),
96
+ 'logging': toJson_BucketSpecLogging(obj.logging),
97
+ 'metrics': (_d = obj.metrics) === null || _d === void 0 ? void 0 : _d.map(y => toJson_BucketSpecMetrics(y)),
98
+ 'name': obj.name,
99
+ 'notification': toJson_BucketSpecNotification(obj.notification),
100
+ 'objectLockEnabledForBucket': obj.objectLockEnabledForBucket,
101
+ 'ownershipControls': toJson_BucketSpecOwnershipControls(obj.ownershipControls),
102
+ 'policy': obj.policy,
103
+ 'publicAccessBlock': toJson_BucketSpecPublicAccessBlock(obj.publicAccessBlock),
104
+ 'replication': toJson_BucketSpecReplication(obj.replication),
105
+ 'requestPayment': toJson_BucketSpecRequestPayment(obj.requestPayment),
106
+ 'tagging': toJson_BucketSpecTagging(obj.tagging),
107
+ 'versioning': toJson_BucketSpecVersioning(obj.versioning),
108
+ 'website': toJson_BucketSpecWebsite(obj.website),
109
+ };
110
+ // filter undefined values
111
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
112
+ }
113
+ exports.toJson_BucketSpec = toJson_BucketSpec;
114
+ /**
115
+ * Converts an object of type 'BucketSpecAccelerate' to JSON representation.
116
+ */
117
+ /* eslint-disable max-len, quote-props */
118
+ function toJson_BucketSpecAccelerate(obj) {
119
+ if (obj === undefined) {
120
+ return undefined;
121
+ }
122
+ const result = {
123
+ 'status': obj.status,
124
+ };
125
+ // filter undefined values
126
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
127
+ }
128
+ exports.toJson_BucketSpecAccelerate = toJson_BucketSpecAccelerate;
129
+ /**
130
+ * Converts an object of type 'BucketSpecAnalytics' to JSON representation.
131
+ */
132
+ /* eslint-disable max-len, quote-props */
133
+ function toJson_BucketSpecAnalytics(obj) {
134
+ if (obj === undefined) {
135
+ return undefined;
136
+ }
137
+ const result = {
138
+ 'filter': toJson_BucketSpecAnalyticsFilter(obj.filter),
139
+ 'id': obj.id,
140
+ 'storageClassAnalysis': toJson_BucketSpecAnalyticsStorageClassAnalysis(obj.storageClassAnalysis),
141
+ };
142
+ // filter undefined values
143
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
144
+ }
145
+ exports.toJson_BucketSpecAnalytics = toJson_BucketSpecAnalytics;
146
+ /**
147
+ * Converts an object of type 'BucketSpecCors' to JSON representation.
148
+ */
149
+ /* eslint-disable max-len, quote-props */
150
+ function toJson_BucketSpecCors(obj) {
151
+ var _a;
152
+ if (obj === undefined) {
153
+ return undefined;
154
+ }
155
+ const result = {
156
+ 'corsRules': (_a = obj.corsRules) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecCorsCorsRules(y)),
157
+ };
158
+ // filter undefined values
159
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
160
+ }
161
+ exports.toJson_BucketSpecCors = toJson_BucketSpecCors;
162
+ /**
163
+ * Converts an object of type 'BucketSpecCreateBucketConfiguration' to JSON representation.
164
+ */
165
+ /* eslint-disable max-len, quote-props */
166
+ function toJson_BucketSpecCreateBucketConfiguration(obj) {
167
+ if (obj === undefined) {
168
+ return undefined;
169
+ }
170
+ const result = {
171
+ 'locationConstraint': obj.locationConstraint,
172
+ };
173
+ // filter undefined values
174
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
175
+ }
176
+ exports.toJson_BucketSpecCreateBucketConfiguration = toJson_BucketSpecCreateBucketConfiguration;
177
+ /**
178
+ * Converts an object of type 'BucketSpecEncryption' to JSON representation.
179
+ */
180
+ /* eslint-disable max-len, quote-props */
181
+ function toJson_BucketSpecEncryption(obj) {
182
+ var _a;
183
+ if (obj === undefined) {
184
+ return undefined;
185
+ }
186
+ const result = {
187
+ 'rules': (_a = obj.rules) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecEncryptionRules(y)),
188
+ };
189
+ // filter undefined values
190
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
191
+ }
192
+ exports.toJson_BucketSpecEncryption = toJson_BucketSpecEncryption;
193
+ /**
194
+ * Converts an object of type 'BucketSpecIntelligentTiering' to JSON representation.
195
+ */
196
+ /* eslint-disable max-len, quote-props */
197
+ function toJson_BucketSpecIntelligentTiering(obj) {
198
+ var _a;
199
+ if (obj === undefined) {
200
+ return undefined;
201
+ }
202
+ const result = {
203
+ 'filter': toJson_BucketSpecIntelligentTieringFilter(obj.filter),
204
+ 'id': obj.id,
205
+ 'status': obj.status,
206
+ 'tierings': (_a = obj.tierings) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecIntelligentTieringTierings(y)),
207
+ };
208
+ // filter undefined values
209
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
210
+ }
211
+ exports.toJson_BucketSpecIntelligentTiering = toJson_BucketSpecIntelligentTiering;
212
+ /**
213
+ * Converts an object of type 'BucketSpecInventory' to JSON representation.
214
+ */
215
+ /* eslint-disable max-len, quote-props */
216
+ function toJson_BucketSpecInventory(obj) {
217
+ var _a;
218
+ if (obj === undefined) {
219
+ return undefined;
220
+ }
221
+ const result = {
222
+ 'destination': toJson_BucketSpecInventoryDestination(obj.destination),
223
+ 'filter': toJson_BucketSpecInventoryFilter(obj.filter),
224
+ 'id': obj.id,
225
+ 'includedObjectVersions': obj.includedObjectVersions,
226
+ 'isEnabled': obj.isEnabled,
227
+ 'optionalFields': (_a = obj.optionalFields) === null || _a === void 0 ? void 0 : _a.map(y => y),
228
+ 'schedule': toJson_BucketSpecInventorySchedule(obj.schedule),
229
+ };
230
+ // filter undefined values
231
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
232
+ }
233
+ exports.toJson_BucketSpecInventory = toJson_BucketSpecInventory;
234
+ /**
235
+ * Converts an object of type 'BucketSpecLifecycle' to JSON representation.
236
+ */
237
+ /* eslint-disable max-len, quote-props */
238
+ function toJson_BucketSpecLifecycle(obj) {
239
+ var _a;
240
+ if (obj === undefined) {
241
+ return undefined;
242
+ }
243
+ const result = {
244
+ 'rules': (_a = obj.rules) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecLifecycleRules(y)),
245
+ };
246
+ // filter undefined values
247
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
248
+ }
249
+ exports.toJson_BucketSpecLifecycle = toJson_BucketSpecLifecycle;
250
+ /**
251
+ * Converts an object of type 'BucketSpecLogging' to JSON representation.
252
+ */
253
+ /* eslint-disable max-len, quote-props */
254
+ function toJson_BucketSpecLogging(obj) {
255
+ if (obj === undefined) {
256
+ return undefined;
257
+ }
258
+ const result = {
259
+ 'loggingEnabled': toJson_BucketSpecLoggingLoggingEnabled(obj.loggingEnabled),
260
+ };
261
+ // filter undefined values
262
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
263
+ }
264
+ exports.toJson_BucketSpecLogging = toJson_BucketSpecLogging;
265
+ /**
266
+ * Converts an object of type 'BucketSpecMetrics' to JSON representation.
267
+ */
268
+ /* eslint-disable max-len, quote-props */
269
+ function toJson_BucketSpecMetrics(obj) {
270
+ if (obj === undefined) {
271
+ return undefined;
272
+ }
273
+ const result = {
274
+ 'filter': toJson_BucketSpecMetricsFilter(obj.filter),
275
+ 'id': obj.id,
276
+ };
277
+ // filter undefined values
278
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
279
+ }
280
+ exports.toJson_BucketSpecMetrics = toJson_BucketSpecMetrics;
281
+ /**
282
+ * Converts an object of type 'BucketSpecNotification' to JSON representation.
283
+ */
284
+ /* eslint-disable max-len, quote-props */
285
+ function toJson_BucketSpecNotification(obj) {
286
+ var _a, _b, _c;
287
+ if (obj === undefined) {
288
+ return undefined;
289
+ }
290
+ const result = {
291
+ 'lambdaFunctionConfigurations': (_a = obj.lambdaFunctionConfigurations) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecNotificationLambdaFunctionConfigurations(y)),
292
+ 'queueConfigurations': (_b = obj.queueConfigurations) === null || _b === void 0 ? void 0 : _b.map(y => toJson_BucketSpecNotificationQueueConfigurations(y)),
293
+ 'topicConfigurations': (_c = obj.topicConfigurations) === null || _c === void 0 ? void 0 : _c.map(y => toJson_BucketSpecNotificationTopicConfigurations(y)),
294
+ };
295
+ // filter undefined values
296
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
297
+ }
298
+ exports.toJson_BucketSpecNotification = toJson_BucketSpecNotification;
299
+ /**
300
+ * Converts an object of type 'BucketSpecOwnershipControls' to JSON representation.
301
+ */
302
+ /* eslint-disable max-len, quote-props */
303
+ function toJson_BucketSpecOwnershipControls(obj) {
304
+ var _a;
305
+ if (obj === undefined) {
306
+ return undefined;
307
+ }
308
+ const result = {
309
+ 'rules': (_a = obj.rules) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecOwnershipControlsRules(y)),
310
+ };
311
+ // filter undefined values
312
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
313
+ }
314
+ exports.toJson_BucketSpecOwnershipControls = toJson_BucketSpecOwnershipControls;
315
+ /**
316
+ * Converts an object of type 'BucketSpecPublicAccessBlock' to JSON representation.
317
+ */
318
+ /* eslint-disable max-len, quote-props */
319
+ function toJson_BucketSpecPublicAccessBlock(obj) {
320
+ if (obj === undefined) {
321
+ return undefined;
322
+ }
323
+ const result = {
324
+ 'blockPublicACLs': obj.blockPublicAcLs,
325
+ 'blockPublicPolicy': obj.blockPublicPolicy,
326
+ 'ignorePublicACLs': obj.ignorePublicAcLs,
327
+ 'restrictPublicBuckets': obj.restrictPublicBuckets,
328
+ };
329
+ // filter undefined values
330
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
331
+ }
332
+ exports.toJson_BucketSpecPublicAccessBlock = toJson_BucketSpecPublicAccessBlock;
333
+ /**
334
+ * Converts an object of type 'BucketSpecReplication' to JSON representation.
335
+ */
336
+ /* eslint-disable max-len, quote-props */
337
+ function toJson_BucketSpecReplication(obj) {
338
+ var _a;
339
+ if (obj === undefined) {
340
+ return undefined;
341
+ }
342
+ const result = {
343
+ 'role': obj.role,
344
+ 'rules': (_a = obj.rules) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecReplicationRules(y)),
345
+ };
346
+ // filter undefined values
347
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
348
+ }
349
+ exports.toJson_BucketSpecReplication = toJson_BucketSpecReplication;
350
+ /**
351
+ * Converts an object of type 'BucketSpecRequestPayment' to JSON representation.
352
+ */
353
+ /* eslint-disable max-len, quote-props */
354
+ function toJson_BucketSpecRequestPayment(obj) {
355
+ if (obj === undefined) {
356
+ return undefined;
357
+ }
358
+ const result = {
359
+ 'payer': obj.payer,
360
+ };
361
+ // filter undefined values
362
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
363
+ }
364
+ exports.toJson_BucketSpecRequestPayment = toJson_BucketSpecRequestPayment;
365
+ /**
366
+ * Converts an object of type 'BucketSpecTagging' to JSON representation.
367
+ */
368
+ /* eslint-disable max-len, quote-props */
369
+ function toJson_BucketSpecTagging(obj) {
370
+ var _a;
371
+ if (obj === undefined) {
372
+ return undefined;
373
+ }
374
+ const result = {
375
+ 'tagSet': (_a = obj.tagSet) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecTaggingTagSet(y)),
376
+ };
377
+ // filter undefined values
378
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
379
+ }
380
+ exports.toJson_BucketSpecTagging = toJson_BucketSpecTagging;
381
+ /**
382
+ * Converts an object of type 'BucketSpecVersioning' to JSON representation.
383
+ */
384
+ /* eslint-disable max-len, quote-props */
385
+ function toJson_BucketSpecVersioning(obj) {
386
+ if (obj === undefined) {
387
+ return undefined;
388
+ }
389
+ const result = {
390
+ 'status': obj.status,
391
+ };
392
+ // filter undefined values
393
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
394
+ }
395
+ exports.toJson_BucketSpecVersioning = toJson_BucketSpecVersioning;
396
+ /**
397
+ * Converts an object of type 'BucketSpecWebsite' to JSON representation.
398
+ */
399
+ /* eslint-disable max-len, quote-props */
400
+ function toJson_BucketSpecWebsite(obj) {
401
+ var _a;
402
+ if (obj === undefined) {
403
+ return undefined;
404
+ }
405
+ const result = {
406
+ 'errorDocument': toJson_BucketSpecWebsiteErrorDocument(obj.errorDocument),
407
+ 'indexDocument': toJson_BucketSpecWebsiteIndexDocument(obj.indexDocument),
408
+ 'redirectAllRequestsTo': toJson_BucketSpecWebsiteRedirectAllRequestsTo(obj.redirectAllRequestsTo),
409
+ 'routingRules': (_a = obj.routingRules) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecWebsiteRoutingRules(y)),
410
+ };
411
+ // filter undefined values
412
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
413
+ }
414
+ exports.toJson_BucketSpecWebsite = toJson_BucketSpecWebsite;
415
+ /**
416
+ * Converts an object of type 'BucketSpecAnalyticsFilter' to JSON representation.
417
+ */
418
+ /* eslint-disable max-len, quote-props */
419
+ function toJson_BucketSpecAnalyticsFilter(obj) {
420
+ if (obj === undefined) {
421
+ return undefined;
422
+ }
423
+ const result = {
424
+ 'and': toJson_BucketSpecAnalyticsFilterAnd(obj.and),
425
+ 'prefix': obj.prefix,
426
+ 'tag': toJson_BucketSpecAnalyticsFilterTag(obj.tag),
427
+ };
428
+ // filter undefined values
429
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
430
+ }
431
+ exports.toJson_BucketSpecAnalyticsFilter = toJson_BucketSpecAnalyticsFilter;
432
+ /**
433
+ * Converts an object of type 'BucketSpecAnalyticsStorageClassAnalysis' to JSON representation.
434
+ */
435
+ /* eslint-disable max-len, quote-props */
436
+ function toJson_BucketSpecAnalyticsStorageClassAnalysis(obj) {
437
+ if (obj === undefined) {
438
+ return undefined;
439
+ }
440
+ const result = {
441
+ 'dataExport': toJson_BucketSpecAnalyticsStorageClassAnalysisDataExport(obj.dataExport),
442
+ };
443
+ // filter undefined values
444
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
445
+ }
446
+ exports.toJson_BucketSpecAnalyticsStorageClassAnalysis = toJson_BucketSpecAnalyticsStorageClassAnalysis;
447
+ /**
448
+ * Converts an object of type 'BucketSpecCorsCorsRules' to JSON representation.
449
+ */
450
+ /* eslint-disable max-len, quote-props */
451
+ function toJson_BucketSpecCorsCorsRules(obj) {
452
+ var _a, _b, _c, _d;
453
+ if (obj === undefined) {
454
+ return undefined;
455
+ }
456
+ const result = {
457
+ 'allowedHeaders': (_a = obj.allowedHeaders) === null || _a === void 0 ? void 0 : _a.map(y => y),
458
+ 'allowedMethods': (_b = obj.allowedMethods) === null || _b === void 0 ? void 0 : _b.map(y => y),
459
+ 'allowedOrigins': (_c = obj.allowedOrigins) === null || _c === void 0 ? void 0 : _c.map(y => y),
460
+ 'exposeHeaders': (_d = obj.exposeHeaders) === null || _d === void 0 ? void 0 : _d.map(y => y),
461
+ 'id': obj.id,
462
+ 'maxAgeSeconds': obj.maxAgeSeconds,
463
+ };
464
+ // filter undefined values
465
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
466
+ }
467
+ exports.toJson_BucketSpecCorsCorsRules = toJson_BucketSpecCorsCorsRules;
468
+ /**
469
+ * Converts an object of type 'BucketSpecEncryptionRules' to JSON representation.
470
+ */
471
+ /* eslint-disable max-len, quote-props */
472
+ function toJson_BucketSpecEncryptionRules(obj) {
473
+ if (obj === undefined) {
474
+ return undefined;
475
+ }
476
+ const result = {
477
+ 'applyServerSideEncryptionByDefault': toJson_BucketSpecEncryptionRulesApplyServerSideEncryptionByDefault(obj.applyServerSideEncryptionByDefault),
478
+ 'bucketKeyEnabled': obj.bucketKeyEnabled,
479
+ };
480
+ // filter undefined values
481
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
482
+ }
483
+ exports.toJson_BucketSpecEncryptionRules = toJson_BucketSpecEncryptionRules;
484
+ /**
485
+ * Converts an object of type 'BucketSpecIntelligentTieringFilter' to JSON representation.
486
+ */
487
+ /* eslint-disable max-len, quote-props */
488
+ function toJson_BucketSpecIntelligentTieringFilter(obj) {
489
+ if (obj === undefined) {
490
+ return undefined;
491
+ }
492
+ const result = {
493
+ 'and': toJson_BucketSpecIntelligentTieringFilterAnd(obj.and),
494
+ 'prefix': obj.prefix,
495
+ 'tag': toJson_BucketSpecIntelligentTieringFilterTag(obj.tag),
496
+ };
497
+ // filter undefined values
498
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
499
+ }
500
+ exports.toJson_BucketSpecIntelligentTieringFilter = toJson_BucketSpecIntelligentTieringFilter;
501
+ /**
502
+ * Converts an object of type 'BucketSpecIntelligentTieringTierings' to JSON representation.
503
+ */
504
+ /* eslint-disable max-len, quote-props */
505
+ function toJson_BucketSpecIntelligentTieringTierings(obj) {
506
+ if (obj === undefined) {
507
+ return undefined;
508
+ }
509
+ const result = {
510
+ 'accessTier': obj.accessTier,
511
+ 'days': obj.days,
512
+ };
513
+ // filter undefined values
514
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
515
+ }
516
+ exports.toJson_BucketSpecIntelligentTieringTierings = toJson_BucketSpecIntelligentTieringTierings;
517
+ /**
518
+ * Converts an object of type 'BucketSpecInventoryDestination' to JSON representation.
519
+ */
520
+ /* eslint-disable max-len, quote-props */
521
+ function toJson_BucketSpecInventoryDestination(obj) {
522
+ if (obj === undefined) {
523
+ return undefined;
524
+ }
525
+ const result = {
526
+ 's3BucketDestination': toJson_BucketSpecInventoryDestinationS3BucketDestination(obj.s3BucketDestination),
527
+ };
528
+ // filter undefined values
529
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
530
+ }
531
+ exports.toJson_BucketSpecInventoryDestination = toJson_BucketSpecInventoryDestination;
532
+ /**
533
+ * Converts an object of type 'BucketSpecInventoryFilter' to JSON representation.
534
+ */
535
+ /* eslint-disable max-len, quote-props */
536
+ function toJson_BucketSpecInventoryFilter(obj) {
537
+ if (obj === undefined) {
538
+ return undefined;
539
+ }
540
+ const result = {
541
+ 'prefix': obj.prefix,
542
+ };
543
+ // filter undefined values
544
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
545
+ }
546
+ exports.toJson_BucketSpecInventoryFilter = toJson_BucketSpecInventoryFilter;
547
+ /**
548
+ * Converts an object of type 'BucketSpecInventorySchedule' to JSON representation.
549
+ */
550
+ /* eslint-disable max-len, quote-props */
551
+ function toJson_BucketSpecInventorySchedule(obj) {
552
+ if (obj === undefined) {
553
+ return undefined;
554
+ }
555
+ const result = {
556
+ 'frequency': obj.frequency,
557
+ };
558
+ // filter undefined values
559
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
560
+ }
561
+ exports.toJson_BucketSpecInventorySchedule = toJson_BucketSpecInventorySchedule;
562
+ /**
563
+ * Converts an object of type 'BucketSpecLifecycleRules' to JSON representation.
564
+ */
565
+ /* eslint-disable max-len, quote-props */
566
+ function toJson_BucketSpecLifecycleRules(obj) {
567
+ var _a, _b;
568
+ if (obj === undefined) {
569
+ return undefined;
570
+ }
571
+ const result = {
572
+ 'abortIncompleteMultipartUpload': toJson_BucketSpecLifecycleRulesAbortIncompleteMultipartUpload(obj.abortIncompleteMultipartUpload),
573
+ 'expiration': toJson_BucketSpecLifecycleRulesExpiration(obj.expiration),
574
+ 'filter': toJson_BucketSpecLifecycleRulesFilter(obj.filter),
575
+ 'id': obj.id,
576
+ 'noncurrentVersionExpiration': toJson_BucketSpecLifecycleRulesNoncurrentVersionExpiration(obj.noncurrentVersionExpiration),
577
+ 'noncurrentVersionTransitions': (_a = obj.noncurrentVersionTransitions) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecLifecycleRulesNoncurrentVersionTransitions(y)),
578
+ 'prefix': obj.prefix,
579
+ 'status': obj.status,
580
+ 'transitions': (_b = obj.transitions) === null || _b === void 0 ? void 0 : _b.map(y => toJson_BucketSpecLifecycleRulesTransitions(y)),
581
+ };
582
+ // filter undefined values
583
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
584
+ }
585
+ exports.toJson_BucketSpecLifecycleRules = toJson_BucketSpecLifecycleRules;
586
+ /**
587
+ * Converts an object of type 'BucketSpecLoggingLoggingEnabled' to JSON representation.
588
+ */
589
+ /* eslint-disable max-len, quote-props */
590
+ function toJson_BucketSpecLoggingLoggingEnabled(obj) {
591
+ var _a;
592
+ if (obj === undefined) {
593
+ return undefined;
594
+ }
595
+ const result = {
596
+ 'targetBucket': obj.targetBucket,
597
+ 'targetGrants': (_a = obj.targetGrants) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecLoggingLoggingEnabledTargetGrants(y)),
598
+ 'targetPrefix': obj.targetPrefix,
599
+ };
600
+ // filter undefined values
601
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
602
+ }
603
+ exports.toJson_BucketSpecLoggingLoggingEnabled = toJson_BucketSpecLoggingLoggingEnabled;
604
+ /**
605
+ * Converts an object of type 'BucketSpecMetricsFilter' to JSON representation.
606
+ */
607
+ /* eslint-disable max-len, quote-props */
608
+ function toJson_BucketSpecMetricsFilter(obj) {
609
+ if (obj === undefined) {
610
+ return undefined;
611
+ }
612
+ const result = {
613
+ 'accessPointARN': obj.accessPointArn,
614
+ 'and': toJson_BucketSpecMetricsFilterAnd(obj.and),
615
+ 'prefix': obj.prefix,
616
+ 'tag': toJson_BucketSpecMetricsFilterTag(obj.tag),
617
+ };
618
+ // filter undefined values
619
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
620
+ }
621
+ exports.toJson_BucketSpecMetricsFilter = toJson_BucketSpecMetricsFilter;
622
+ /**
623
+ * Converts an object of type 'BucketSpecNotificationLambdaFunctionConfigurations' to JSON representation.
624
+ */
625
+ /* eslint-disable max-len, quote-props */
626
+ function toJson_BucketSpecNotificationLambdaFunctionConfigurations(obj) {
627
+ var _a;
628
+ if (obj === undefined) {
629
+ return undefined;
630
+ }
631
+ const result = {
632
+ 'events': (_a = obj.events) === null || _a === void 0 ? void 0 : _a.map(y => y),
633
+ 'filter': toJson_BucketSpecNotificationLambdaFunctionConfigurationsFilter(obj.filter),
634
+ 'id': obj.id,
635
+ 'lambdaFunctionARN': obj.lambdaFunctionArn,
636
+ };
637
+ // filter undefined values
638
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
639
+ }
640
+ exports.toJson_BucketSpecNotificationLambdaFunctionConfigurations = toJson_BucketSpecNotificationLambdaFunctionConfigurations;
641
+ /**
642
+ * Converts an object of type 'BucketSpecNotificationQueueConfigurations' to JSON representation.
643
+ */
644
+ /* eslint-disable max-len, quote-props */
645
+ function toJson_BucketSpecNotificationQueueConfigurations(obj) {
646
+ var _a;
647
+ if (obj === undefined) {
648
+ return undefined;
649
+ }
650
+ const result = {
651
+ 'events': (_a = obj.events) === null || _a === void 0 ? void 0 : _a.map(y => y),
652
+ 'filter': toJson_BucketSpecNotificationQueueConfigurationsFilter(obj.filter),
653
+ 'id': obj.id,
654
+ 'queueARN': obj.queueArn,
655
+ };
656
+ // filter undefined values
657
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
658
+ }
659
+ exports.toJson_BucketSpecNotificationQueueConfigurations = toJson_BucketSpecNotificationQueueConfigurations;
660
+ /**
661
+ * Converts an object of type 'BucketSpecNotificationTopicConfigurations' to JSON representation.
662
+ */
663
+ /* eslint-disable max-len, quote-props */
664
+ function toJson_BucketSpecNotificationTopicConfigurations(obj) {
665
+ var _a;
666
+ if (obj === undefined) {
667
+ return undefined;
668
+ }
669
+ const result = {
670
+ 'events': (_a = obj.events) === null || _a === void 0 ? void 0 : _a.map(y => y),
671
+ 'filter': toJson_BucketSpecNotificationTopicConfigurationsFilter(obj.filter),
672
+ 'id': obj.id,
673
+ 'topicARN': obj.topicArn,
674
+ };
675
+ // filter undefined values
676
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
677
+ }
678
+ exports.toJson_BucketSpecNotificationTopicConfigurations = toJson_BucketSpecNotificationTopicConfigurations;
679
+ /**
680
+ * Converts an object of type 'BucketSpecOwnershipControlsRules' to JSON representation.
681
+ */
682
+ /* eslint-disable max-len, quote-props */
683
+ function toJson_BucketSpecOwnershipControlsRules(obj) {
684
+ if (obj === undefined) {
685
+ return undefined;
686
+ }
687
+ const result = {
688
+ 'objectOwnership': obj.objectOwnership,
689
+ };
690
+ // filter undefined values
691
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
692
+ }
693
+ exports.toJson_BucketSpecOwnershipControlsRules = toJson_BucketSpecOwnershipControlsRules;
694
+ /**
695
+ * Converts an object of type 'BucketSpecReplicationRules' to JSON representation.
696
+ */
697
+ /* eslint-disable max-len, quote-props */
698
+ function toJson_BucketSpecReplicationRules(obj) {
699
+ if (obj === undefined) {
700
+ return undefined;
701
+ }
702
+ const result = {
703
+ 'deleteMarkerReplication': toJson_BucketSpecReplicationRulesDeleteMarkerReplication(obj.deleteMarkerReplication),
704
+ 'destination': toJson_BucketSpecReplicationRulesDestination(obj.destination),
705
+ 'existingObjectReplication': toJson_BucketSpecReplicationRulesExistingObjectReplication(obj.existingObjectReplication),
706
+ 'filter': toJson_BucketSpecReplicationRulesFilter(obj.filter),
707
+ 'id': obj.id,
708
+ 'prefix': obj.prefix,
709
+ 'priority': obj.priority,
710
+ 'sourceSelectionCriteria': toJson_BucketSpecReplicationRulesSourceSelectionCriteria(obj.sourceSelectionCriteria),
711
+ 'status': obj.status,
712
+ };
713
+ // filter undefined values
714
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
715
+ }
716
+ exports.toJson_BucketSpecReplicationRules = toJson_BucketSpecReplicationRules;
717
+ /**
718
+ * Converts an object of type 'BucketSpecTaggingTagSet' to JSON representation.
719
+ */
720
+ /* eslint-disable max-len, quote-props */
721
+ function toJson_BucketSpecTaggingTagSet(obj) {
722
+ if (obj === undefined) {
723
+ return undefined;
724
+ }
725
+ const result = {
726
+ 'key': obj.key,
727
+ 'value': obj.value,
728
+ };
729
+ // filter undefined values
730
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
731
+ }
732
+ exports.toJson_BucketSpecTaggingTagSet = toJson_BucketSpecTaggingTagSet;
733
+ /**
734
+ * Converts an object of type 'BucketSpecWebsiteErrorDocument' to JSON representation.
735
+ */
736
+ /* eslint-disable max-len, quote-props */
737
+ function toJson_BucketSpecWebsiteErrorDocument(obj) {
738
+ if (obj === undefined) {
739
+ return undefined;
740
+ }
741
+ const result = {
742
+ 'key': obj.key,
743
+ };
744
+ // filter undefined values
745
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
746
+ }
747
+ exports.toJson_BucketSpecWebsiteErrorDocument = toJson_BucketSpecWebsiteErrorDocument;
748
+ /**
749
+ * Converts an object of type 'BucketSpecWebsiteIndexDocument' to JSON representation.
750
+ */
751
+ /* eslint-disable max-len, quote-props */
752
+ function toJson_BucketSpecWebsiteIndexDocument(obj) {
753
+ if (obj === undefined) {
754
+ return undefined;
755
+ }
756
+ const result = {
757
+ 'suffix': obj.suffix,
758
+ };
759
+ // filter undefined values
760
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
761
+ }
762
+ exports.toJson_BucketSpecWebsiteIndexDocument = toJson_BucketSpecWebsiteIndexDocument;
763
+ /**
764
+ * Converts an object of type 'BucketSpecWebsiteRedirectAllRequestsTo' to JSON representation.
765
+ */
766
+ /* eslint-disable max-len, quote-props */
767
+ function toJson_BucketSpecWebsiteRedirectAllRequestsTo(obj) {
768
+ if (obj === undefined) {
769
+ return undefined;
770
+ }
771
+ const result = {
772
+ 'hostName': obj.hostName,
773
+ 'protocol': obj.protocol,
774
+ };
775
+ // filter undefined values
776
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
777
+ }
778
+ exports.toJson_BucketSpecWebsiteRedirectAllRequestsTo = toJson_BucketSpecWebsiteRedirectAllRequestsTo;
779
+ /**
780
+ * Converts an object of type 'BucketSpecWebsiteRoutingRules' to JSON representation.
781
+ */
782
+ /* eslint-disable max-len, quote-props */
783
+ function toJson_BucketSpecWebsiteRoutingRules(obj) {
784
+ if (obj === undefined) {
785
+ return undefined;
786
+ }
787
+ const result = {
788
+ 'condition': toJson_BucketSpecWebsiteRoutingRulesCondition(obj.condition),
789
+ 'redirect': toJson_BucketSpecWebsiteRoutingRulesRedirect(obj.redirect),
790
+ };
791
+ // filter undefined values
792
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
793
+ }
794
+ exports.toJson_BucketSpecWebsiteRoutingRules = toJson_BucketSpecWebsiteRoutingRules;
795
+ /**
796
+ * Converts an object of type 'BucketSpecAnalyticsFilterAnd' to JSON representation.
797
+ */
798
+ /* eslint-disable max-len, quote-props */
799
+ function toJson_BucketSpecAnalyticsFilterAnd(obj) {
800
+ var _a;
801
+ if (obj === undefined) {
802
+ return undefined;
803
+ }
804
+ const result = {
805
+ 'prefix': obj.prefix,
806
+ 'tags': (_a = obj.tags) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecAnalyticsFilterAndTags(y)),
807
+ };
808
+ // filter undefined values
809
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
810
+ }
811
+ exports.toJson_BucketSpecAnalyticsFilterAnd = toJson_BucketSpecAnalyticsFilterAnd;
812
+ /**
813
+ * Converts an object of type 'BucketSpecAnalyticsFilterTag' to JSON representation.
814
+ */
815
+ /* eslint-disable max-len, quote-props */
816
+ function toJson_BucketSpecAnalyticsFilterTag(obj) {
817
+ if (obj === undefined) {
818
+ return undefined;
819
+ }
820
+ const result = {
821
+ 'key': obj.key,
822
+ 'value': obj.value,
823
+ };
824
+ // filter undefined values
825
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
826
+ }
827
+ exports.toJson_BucketSpecAnalyticsFilterTag = toJson_BucketSpecAnalyticsFilterTag;
828
+ /**
829
+ * Converts an object of type 'BucketSpecAnalyticsStorageClassAnalysisDataExport' to JSON representation.
830
+ */
831
+ /* eslint-disable max-len, quote-props */
832
+ function toJson_BucketSpecAnalyticsStorageClassAnalysisDataExport(obj) {
833
+ if (obj === undefined) {
834
+ return undefined;
835
+ }
836
+ const result = {
837
+ 'destination': toJson_BucketSpecAnalyticsStorageClassAnalysisDataExportDestination(obj.destination),
838
+ 'outputSchemaVersion': obj.outputSchemaVersion,
839
+ };
840
+ // filter undefined values
841
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
842
+ }
843
+ exports.toJson_BucketSpecAnalyticsStorageClassAnalysisDataExport = toJson_BucketSpecAnalyticsStorageClassAnalysisDataExport;
844
+ /**
845
+ * Converts an object of type 'BucketSpecEncryptionRulesApplyServerSideEncryptionByDefault' to JSON representation.
846
+ */
847
+ /* eslint-disable max-len, quote-props */
848
+ function toJson_BucketSpecEncryptionRulesApplyServerSideEncryptionByDefault(obj) {
849
+ if (obj === undefined) {
850
+ return undefined;
851
+ }
852
+ const result = {
853
+ 'kmsMasterKeyID': obj.kmsMasterKeyId,
854
+ 'sseAlgorithm': obj.sseAlgorithm,
855
+ };
856
+ // filter undefined values
857
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
858
+ }
859
+ exports.toJson_BucketSpecEncryptionRulesApplyServerSideEncryptionByDefault = toJson_BucketSpecEncryptionRulesApplyServerSideEncryptionByDefault;
860
+ /**
861
+ * Converts an object of type 'BucketSpecIntelligentTieringFilterAnd' to JSON representation.
862
+ */
863
+ /* eslint-disable max-len, quote-props */
864
+ function toJson_BucketSpecIntelligentTieringFilterAnd(obj) {
865
+ var _a;
866
+ if (obj === undefined) {
867
+ return undefined;
868
+ }
869
+ const result = {
870
+ 'prefix': obj.prefix,
871
+ 'tags': (_a = obj.tags) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecIntelligentTieringFilterAndTags(y)),
872
+ };
873
+ // filter undefined values
874
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
875
+ }
876
+ exports.toJson_BucketSpecIntelligentTieringFilterAnd = toJson_BucketSpecIntelligentTieringFilterAnd;
877
+ /**
878
+ * Converts an object of type 'BucketSpecIntelligentTieringFilterTag' to JSON representation.
879
+ */
880
+ /* eslint-disable max-len, quote-props */
881
+ function toJson_BucketSpecIntelligentTieringFilterTag(obj) {
882
+ if (obj === undefined) {
883
+ return undefined;
884
+ }
885
+ const result = {
886
+ 'key': obj.key,
887
+ 'value': obj.value,
888
+ };
889
+ // filter undefined values
890
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
891
+ }
892
+ exports.toJson_BucketSpecIntelligentTieringFilterTag = toJson_BucketSpecIntelligentTieringFilterTag;
893
+ /**
894
+ * Converts an object of type 'BucketSpecInventoryDestinationS3BucketDestination' to JSON representation.
895
+ */
896
+ /* eslint-disable max-len, quote-props */
897
+ function toJson_BucketSpecInventoryDestinationS3BucketDestination(obj) {
898
+ if (obj === undefined) {
899
+ return undefined;
900
+ }
901
+ const result = {
902
+ 'accountID': obj.accountId,
903
+ 'bucket': obj.bucket,
904
+ 'encryption': toJson_BucketSpecInventoryDestinationS3BucketDestinationEncryption(obj.encryption),
905
+ 'format': obj.format,
906
+ 'prefix': obj.prefix,
907
+ };
908
+ // filter undefined values
909
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
910
+ }
911
+ exports.toJson_BucketSpecInventoryDestinationS3BucketDestination = toJson_BucketSpecInventoryDestinationS3BucketDestination;
912
+ /**
913
+ * Converts an object of type 'BucketSpecLifecycleRulesAbortIncompleteMultipartUpload' to JSON representation.
914
+ */
915
+ /* eslint-disable max-len, quote-props */
916
+ function toJson_BucketSpecLifecycleRulesAbortIncompleteMultipartUpload(obj) {
917
+ if (obj === undefined) {
918
+ return undefined;
919
+ }
920
+ const result = {
921
+ 'daysAfterInitiation': obj.daysAfterInitiation,
922
+ };
923
+ // filter undefined values
924
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
925
+ }
926
+ exports.toJson_BucketSpecLifecycleRulesAbortIncompleteMultipartUpload = toJson_BucketSpecLifecycleRulesAbortIncompleteMultipartUpload;
927
+ /**
928
+ * Converts an object of type 'BucketSpecLifecycleRulesExpiration' to JSON representation.
929
+ */
930
+ /* eslint-disable max-len, quote-props */
931
+ function toJson_BucketSpecLifecycleRulesExpiration(obj) {
932
+ var _a;
933
+ if (obj === undefined) {
934
+ return undefined;
935
+ }
936
+ const result = {
937
+ 'date': (_a = obj.date) === null || _a === void 0 ? void 0 : _a.toISOString(),
938
+ 'days': obj.days,
939
+ 'expiredObjectDeleteMarker': obj.expiredObjectDeleteMarker,
940
+ };
941
+ // filter undefined values
942
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
943
+ }
944
+ exports.toJson_BucketSpecLifecycleRulesExpiration = toJson_BucketSpecLifecycleRulesExpiration;
945
+ /**
946
+ * Converts an object of type 'BucketSpecLifecycleRulesFilter' to JSON representation.
947
+ */
948
+ /* eslint-disable max-len, quote-props */
949
+ function toJson_BucketSpecLifecycleRulesFilter(obj) {
950
+ if (obj === undefined) {
951
+ return undefined;
952
+ }
953
+ const result = {
954
+ 'and': toJson_BucketSpecLifecycleRulesFilterAnd(obj.and),
955
+ 'prefix': obj.prefix,
956
+ 'tag': toJson_BucketSpecLifecycleRulesFilterTag(obj.tag),
957
+ };
958
+ // filter undefined values
959
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
960
+ }
961
+ exports.toJson_BucketSpecLifecycleRulesFilter = toJson_BucketSpecLifecycleRulesFilter;
962
+ /**
963
+ * Converts an object of type 'BucketSpecLifecycleRulesNoncurrentVersionExpiration' to JSON representation.
964
+ */
965
+ /* eslint-disable max-len, quote-props */
966
+ function toJson_BucketSpecLifecycleRulesNoncurrentVersionExpiration(obj) {
967
+ if (obj === undefined) {
968
+ return undefined;
969
+ }
970
+ const result = {
971
+ 'noncurrentDays': obj.noncurrentDays,
972
+ };
973
+ // filter undefined values
974
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
975
+ }
976
+ exports.toJson_BucketSpecLifecycleRulesNoncurrentVersionExpiration = toJson_BucketSpecLifecycleRulesNoncurrentVersionExpiration;
977
+ /**
978
+ * Converts an object of type 'BucketSpecLifecycleRulesNoncurrentVersionTransitions' to JSON representation.
979
+ */
980
+ /* eslint-disable max-len, quote-props */
981
+ function toJson_BucketSpecLifecycleRulesNoncurrentVersionTransitions(obj) {
982
+ if (obj === undefined) {
983
+ return undefined;
984
+ }
985
+ const result = {
986
+ 'noncurrentDays': obj.noncurrentDays,
987
+ 'storageClass': obj.storageClass,
988
+ };
989
+ // filter undefined values
990
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
991
+ }
992
+ exports.toJson_BucketSpecLifecycleRulesNoncurrentVersionTransitions = toJson_BucketSpecLifecycleRulesNoncurrentVersionTransitions;
993
+ /**
994
+ * Converts an object of type 'BucketSpecLifecycleRulesTransitions' to JSON representation.
995
+ */
996
+ /* eslint-disable max-len, quote-props */
997
+ function toJson_BucketSpecLifecycleRulesTransitions(obj) {
998
+ var _a;
999
+ if (obj === undefined) {
1000
+ return undefined;
1001
+ }
1002
+ const result = {
1003
+ 'date': (_a = obj.date) === null || _a === void 0 ? void 0 : _a.toISOString(),
1004
+ 'days': obj.days,
1005
+ 'storageClass': obj.storageClass,
1006
+ };
1007
+ // filter undefined values
1008
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1009
+ }
1010
+ exports.toJson_BucketSpecLifecycleRulesTransitions = toJson_BucketSpecLifecycleRulesTransitions;
1011
+ /**
1012
+ * Converts an object of type 'BucketSpecLoggingLoggingEnabledTargetGrants' to JSON representation.
1013
+ */
1014
+ /* eslint-disable max-len, quote-props */
1015
+ function toJson_BucketSpecLoggingLoggingEnabledTargetGrants(obj) {
1016
+ if (obj === undefined) {
1017
+ return undefined;
1018
+ }
1019
+ const result = {
1020
+ 'grantee': toJson_BucketSpecLoggingLoggingEnabledTargetGrantsGrantee(obj.grantee),
1021
+ 'permission': obj.permission,
1022
+ };
1023
+ // filter undefined values
1024
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1025
+ }
1026
+ exports.toJson_BucketSpecLoggingLoggingEnabledTargetGrants = toJson_BucketSpecLoggingLoggingEnabledTargetGrants;
1027
+ /**
1028
+ * Converts an object of type 'BucketSpecMetricsFilterAnd' to JSON representation.
1029
+ */
1030
+ /* eslint-disable max-len, quote-props */
1031
+ function toJson_BucketSpecMetricsFilterAnd(obj) {
1032
+ var _a;
1033
+ if (obj === undefined) {
1034
+ return undefined;
1035
+ }
1036
+ const result = {
1037
+ 'accessPointARN': obj.accessPointArn,
1038
+ 'prefix': obj.prefix,
1039
+ 'tags': (_a = obj.tags) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecMetricsFilterAndTags(y)),
1040
+ };
1041
+ // filter undefined values
1042
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1043
+ }
1044
+ exports.toJson_BucketSpecMetricsFilterAnd = toJson_BucketSpecMetricsFilterAnd;
1045
+ /**
1046
+ * Converts an object of type 'BucketSpecMetricsFilterTag' to JSON representation.
1047
+ */
1048
+ /* eslint-disable max-len, quote-props */
1049
+ function toJson_BucketSpecMetricsFilterTag(obj) {
1050
+ if (obj === undefined) {
1051
+ return undefined;
1052
+ }
1053
+ const result = {
1054
+ 'key': obj.key,
1055
+ 'value': obj.value,
1056
+ };
1057
+ // filter undefined values
1058
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1059
+ }
1060
+ exports.toJson_BucketSpecMetricsFilterTag = toJson_BucketSpecMetricsFilterTag;
1061
+ /**
1062
+ * Converts an object of type 'BucketSpecNotificationLambdaFunctionConfigurationsFilter' to JSON representation.
1063
+ */
1064
+ /* eslint-disable max-len, quote-props */
1065
+ function toJson_BucketSpecNotificationLambdaFunctionConfigurationsFilter(obj) {
1066
+ if (obj === undefined) {
1067
+ return undefined;
1068
+ }
1069
+ const result = {
1070
+ 'key': toJson_BucketSpecNotificationLambdaFunctionConfigurationsFilterKey(obj.key),
1071
+ };
1072
+ // filter undefined values
1073
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1074
+ }
1075
+ exports.toJson_BucketSpecNotificationLambdaFunctionConfigurationsFilter = toJson_BucketSpecNotificationLambdaFunctionConfigurationsFilter;
1076
+ /**
1077
+ * Converts an object of type 'BucketSpecNotificationQueueConfigurationsFilter' to JSON representation.
1078
+ */
1079
+ /* eslint-disable max-len, quote-props */
1080
+ function toJson_BucketSpecNotificationQueueConfigurationsFilter(obj) {
1081
+ if (obj === undefined) {
1082
+ return undefined;
1083
+ }
1084
+ const result = {
1085
+ 'key': toJson_BucketSpecNotificationQueueConfigurationsFilterKey(obj.key),
1086
+ };
1087
+ // filter undefined values
1088
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1089
+ }
1090
+ exports.toJson_BucketSpecNotificationQueueConfigurationsFilter = toJson_BucketSpecNotificationQueueConfigurationsFilter;
1091
+ /**
1092
+ * Converts an object of type 'BucketSpecNotificationTopicConfigurationsFilter' to JSON representation.
1093
+ */
1094
+ /* eslint-disable max-len, quote-props */
1095
+ function toJson_BucketSpecNotificationTopicConfigurationsFilter(obj) {
1096
+ if (obj === undefined) {
1097
+ return undefined;
1098
+ }
1099
+ const result = {
1100
+ 'key': toJson_BucketSpecNotificationTopicConfigurationsFilterKey(obj.key),
1101
+ };
1102
+ // filter undefined values
1103
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1104
+ }
1105
+ exports.toJson_BucketSpecNotificationTopicConfigurationsFilter = toJson_BucketSpecNotificationTopicConfigurationsFilter;
1106
+ /**
1107
+ * Converts an object of type 'BucketSpecReplicationRulesDeleteMarkerReplication' to JSON representation.
1108
+ */
1109
+ /* eslint-disable max-len, quote-props */
1110
+ function toJson_BucketSpecReplicationRulesDeleteMarkerReplication(obj) {
1111
+ if (obj === undefined) {
1112
+ return undefined;
1113
+ }
1114
+ const result = {
1115
+ 'status': obj.status,
1116
+ };
1117
+ // filter undefined values
1118
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1119
+ }
1120
+ exports.toJson_BucketSpecReplicationRulesDeleteMarkerReplication = toJson_BucketSpecReplicationRulesDeleteMarkerReplication;
1121
+ /**
1122
+ * Converts an object of type 'BucketSpecReplicationRulesDestination' to JSON representation.
1123
+ */
1124
+ /* eslint-disable max-len, quote-props */
1125
+ function toJson_BucketSpecReplicationRulesDestination(obj) {
1126
+ if (obj === undefined) {
1127
+ return undefined;
1128
+ }
1129
+ const result = {
1130
+ 'accessControlTranslation': toJson_BucketSpecReplicationRulesDestinationAccessControlTranslation(obj.accessControlTranslation),
1131
+ 'account': obj.account,
1132
+ 'bucket': obj.bucket,
1133
+ 'encryptionConfiguration': toJson_BucketSpecReplicationRulesDestinationEncryptionConfiguration(obj.encryptionConfiguration),
1134
+ 'metrics': toJson_BucketSpecReplicationRulesDestinationMetrics(obj.metrics),
1135
+ 'replicationTime': toJson_BucketSpecReplicationRulesDestinationReplicationTime(obj.replicationTime),
1136
+ 'storageClass': obj.storageClass,
1137
+ };
1138
+ // filter undefined values
1139
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1140
+ }
1141
+ exports.toJson_BucketSpecReplicationRulesDestination = toJson_BucketSpecReplicationRulesDestination;
1142
+ /**
1143
+ * Converts an object of type 'BucketSpecReplicationRulesExistingObjectReplication' to JSON representation.
1144
+ */
1145
+ /* eslint-disable max-len, quote-props */
1146
+ function toJson_BucketSpecReplicationRulesExistingObjectReplication(obj) {
1147
+ if (obj === undefined) {
1148
+ return undefined;
1149
+ }
1150
+ const result = {
1151
+ 'status': obj.status,
1152
+ };
1153
+ // filter undefined values
1154
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1155
+ }
1156
+ exports.toJson_BucketSpecReplicationRulesExistingObjectReplication = toJson_BucketSpecReplicationRulesExistingObjectReplication;
1157
+ /**
1158
+ * Converts an object of type 'BucketSpecReplicationRulesFilter' to JSON representation.
1159
+ */
1160
+ /* eslint-disable max-len, quote-props */
1161
+ function toJson_BucketSpecReplicationRulesFilter(obj) {
1162
+ if (obj === undefined) {
1163
+ return undefined;
1164
+ }
1165
+ const result = {
1166
+ 'and': toJson_BucketSpecReplicationRulesFilterAnd(obj.and),
1167
+ 'prefix': obj.prefix,
1168
+ 'tag': toJson_BucketSpecReplicationRulesFilterTag(obj.tag),
1169
+ };
1170
+ // filter undefined values
1171
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1172
+ }
1173
+ exports.toJson_BucketSpecReplicationRulesFilter = toJson_BucketSpecReplicationRulesFilter;
1174
+ /**
1175
+ * Converts an object of type 'BucketSpecReplicationRulesSourceSelectionCriteria' to JSON representation.
1176
+ */
1177
+ /* eslint-disable max-len, quote-props */
1178
+ function toJson_BucketSpecReplicationRulesSourceSelectionCriteria(obj) {
1179
+ if (obj === undefined) {
1180
+ return undefined;
1181
+ }
1182
+ const result = {
1183
+ 'replicaModifications': toJson_BucketSpecReplicationRulesSourceSelectionCriteriaReplicaModifications(obj.replicaModifications),
1184
+ 'sseKMSEncryptedObjects': toJson_BucketSpecReplicationRulesSourceSelectionCriteriaSseKmsEncryptedObjects(obj.sseKmsEncryptedObjects),
1185
+ };
1186
+ // filter undefined values
1187
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1188
+ }
1189
+ exports.toJson_BucketSpecReplicationRulesSourceSelectionCriteria = toJson_BucketSpecReplicationRulesSourceSelectionCriteria;
1190
+ /**
1191
+ * Converts an object of type 'BucketSpecWebsiteRoutingRulesCondition' to JSON representation.
1192
+ */
1193
+ /* eslint-disable max-len, quote-props */
1194
+ function toJson_BucketSpecWebsiteRoutingRulesCondition(obj) {
1195
+ if (obj === undefined) {
1196
+ return undefined;
1197
+ }
1198
+ const result = {
1199
+ 'httpErrorCodeReturnedEquals': obj.httpErrorCodeReturnedEquals,
1200
+ 'keyPrefixEquals': obj.keyPrefixEquals,
1201
+ };
1202
+ // filter undefined values
1203
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1204
+ }
1205
+ exports.toJson_BucketSpecWebsiteRoutingRulesCondition = toJson_BucketSpecWebsiteRoutingRulesCondition;
1206
+ /**
1207
+ * Converts an object of type 'BucketSpecWebsiteRoutingRulesRedirect' to JSON representation.
1208
+ */
1209
+ /* eslint-disable max-len, quote-props */
1210
+ function toJson_BucketSpecWebsiteRoutingRulesRedirect(obj) {
1211
+ if (obj === undefined) {
1212
+ return undefined;
1213
+ }
1214
+ const result = {
1215
+ 'hostName': obj.hostName,
1216
+ 'httpRedirectCode': obj.httpRedirectCode,
1217
+ 'protocol': obj.protocol,
1218
+ 'replaceKeyPrefixWith': obj.replaceKeyPrefixWith,
1219
+ 'replaceKeyWith': obj.replaceKeyWith,
1220
+ };
1221
+ // filter undefined values
1222
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1223
+ }
1224
+ exports.toJson_BucketSpecWebsiteRoutingRulesRedirect = toJson_BucketSpecWebsiteRoutingRulesRedirect;
1225
+ /**
1226
+ * Converts an object of type 'BucketSpecAnalyticsFilterAndTags' to JSON representation.
1227
+ */
1228
+ /* eslint-disable max-len, quote-props */
1229
+ function toJson_BucketSpecAnalyticsFilterAndTags(obj) {
1230
+ if (obj === undefined) {
1231
+ return undefined;
1232
+ }
1233
+ const result = {
1234
+ 'key': obj.key,
1235
+ 'value': obj.value,
1236
+ };
1237
+ // filter undefined values
1238
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1239
+ }
1240
+ exports.toJson_BucketSpecAnalyticsFilterAndTags = toJson_BucketSpecAnalyticsFilterAndTags;
1241
+ /**
1242
+ * Converts an object of type 'BucketSpecAnalyticsStorageClassAnalysisDataExportDestination' to JSON representation.
1243
+ */
1244
+ /* eslint-disable max-len, quote-props */
1245
+ function toJson_BucketSpecAnalyticsStorageClassAnalysisDataExportDestination(obj) {
1246
+ if (obj === undefined) {
1247
+ return undefined;
1248
+ }
1249
+ const result = {
1250
+ 's3BucketDestination': toJson_BucketSpecAnalyticsStorageClassAnalysisDataExportDestinationS3BucketDestination(obj.s3BucketDestination),
1251
+ };
1252
+ // filter undefined values
1253
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1254
+ }
1255
+ exports.toJson_BucketSpecAnalyticsStorageClassAnalysisDataExportDestination = toJson_BucketSpecAnalyticsStorageClassAnalysisDataExportDestination;
1256
+ /**
1257
+ * Converts an object of type 'BucketSpecIntelligentTieringFilterAndTags' to JSON representation.
1258
+ */
1259
+ /* eslint-disable max-len, quote-props */
1260
+ function toJson_BucketSpecIntelligentTieringFilterAndTags(obj) {
1261
+ if (obj === undefined) {
1262
+ return undefined;
1263
+ }
1264
+ const result = {
1265
+ 'key': obj.key,
1266
+ 'value': obj.value,
1267
+ };
1268
+ // filter undefined values
1269
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1270
+ }
1271
+ exports.toJson_BucketSpecIntelligentTieringFilterAndTags = toJson_BucketSpecIntelligentTieringFilterAndTags;
1272
+ /**
1273
+ * Converts an object of type 'BucketSpecInventoryDestinationS3BucketDestinationEncryption' to JSON representation.
1274
+ */
1275
+ /* eslint-disable max-len, quote-props */
1276
+ function toJson_BucketSpecInventoryDestinationS3BucketDestinationEncryption(obj) {
1277
+ if (obj === undefined) {
1278
+ return undefined;
1279
+ }
1280
+ const result = {
1281
+ 'sseKMS': toJson_BucketSpecInventoryDestinationS3BucketDestinationEncryptionSseKms(obj.sseKms),
1282
+ };
1283
+ // filter undefined values
1284
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1285
+ }
1286
+ exports.toJson_BucketSpecInventoryDestinationS3BucketDestinationEncryption = toJson_BucketSpecInventoryDestinationS3BucketDestinationEncryption;
1287
+ /**
1288
+ * Converts an object of type 'BucketSpecLifecycleRulesFilterAnd' to JSON representation.
1289
+ */
1290
+ /* eslint-disable max-len, quote-props */
1291
+ function toJson_BucketSpecLifecycleRulesFilterAnd(obj) {
1292
+ var _a;
1293
+ if (obj === undefined) {
1294
+ return undefined;
1295
+ }
1296
+ const result = {
1297
+ 'prefix': obj.prefix,
1298
+ 'tags': (_a = obj.tags) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecLifecycleRulesFilterAndTags(y)),
1299
+ };
1300
+ // filter undefined values
1301
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1302
+ }
1303
+ exports.toJson_BucketSpecLifecycleRulesFilterAnd = toJson_BucketSpecLifecycleRulesFilterAnd;
1304
+ /**
1305
+ * Converts an object of type 'BucketSpecLifecycleRulesFilterTag' to JSON representation.
1306
+ */
1307
+ /* eslint-disable max-len, quote-props */
1308
+ function toJson_BucketSpecLifecycleRulesFilterTag(obj) {
1309
+ if (obj === undefined) {
1310
+ return undefined;
1311
+ }
1312
+ const result = {
1313
+ 'key': obj.key,
1314
+ 'value': obj.value,
1315
+ };
1316
+ // filter undefined values
1317
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1318
+ }
1319
+ exports.toJson_BucketSpecLifecycleRulesFilterTag = toJson_BucketSpecLifecycleRulesFilterTag;
1320
+ /**
1321
+ * Converts an object of type 'BucketSpecLoggingLoggingEnabledTargetGrantsGrantee' to JSON representation.
1322
+ */
1323
+ /* eslint-disable max-len, quote-props */
1324
+ function toJson_BucketSpecLoggingLoggingEnabledTargetGrantsGrantee(obj) {
1325
+ if (obj === undefined) {
1326
+ return undefined;
1327
+ }
1328
+ const result = {
1329
+ 'displayName': obj.displayName,
1330
+ 'emailAddress': obj.emailAddress,
1331
+ 'id': obj.id,
1332
+ 'type_': obj.type,
1333
+ 'uRI': obj.uRi,
1334
+ };
1335
+ // filter undefined values
1336
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1337
+ }
1338
+ exports.toJson_BucketSpecLoggingLoggingEnabledTargetGrantsGrantee = toJson_BucketSpecLoggingLoggingEnabledTargetGrantsGrantee;
1339
+ /**
1340
+ * Converts an object of type 'BucketSpecMetricsFilterAndTags' to JSON representation.
1341
+ */
1342
+ /* eslint-disable max-len, quote-props */
1343
+ function toJson_BucketSpecMetricsFilterAndTags(obj) {
1344
+ if (obj === undefined) {
1345
+ return undefined;
1346
+ }
1347
+ const result = {
1348
+ 'key': obj.key,
1349
+ 'value': obj.value,
1350
+ };
1351
+ // filter undefined values
1352
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1353
+ }
1354
+ exports.toJson_BucketSpecMetricsFilterAndTags = toJson_BucketSpecMetricsFilterAndTags;
1355
+ /**
1356
+ * Converts an object of type 'BucketSpecNotificationLambdaFunctionConfigurationsFilterKey' to JSON representation.
1357
+ */
1358
+ /* eslint-disable max-len, quote-props */
1359
+ function toJson_BucketSpecNotificationLambdaFunctionConfigurationsFilterKey(obj) {
1360
+ var _a;
1361
+ if (obj === undefined) {
1362
+ return undefined;
1363
+ }
1364
+ const result = {
1365
+ 'filterRules': (_a = obj.filterRules) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecNotificationLambdaFunctionConfigurationsFilterKeyFilterRules(y)),
1366
+ };
1367
+ // filter undefined values
1368
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1369
+ }
1370
+ exports.toJson_BucketSpecNotificationLambdaFunctionConfigurationsFilterKey = toJson_BucketSpecNotificationLambdaFunctionConfigurationsFilterKey;
1371
+ /**
1372
+ * Converts an object of type 'BucketSpecNotificationQueueConfigurationsFilterKey' to JSON representation.
1373
+ */
1374
+ /* eslint-disable max-len, quote-props */
1375
+ function toJson_BucketSpecNotificationQueueConfigurationsFilterKey(obj) {
1376
+ var _a;
1377
+ if (obj === undefined) {
1378
+ return undefined;
1379
+ }
1380
+ const result = {
1381
+ 'filterRules': (_a = obj.filterRules) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecNotificationQueueConfigurationsFilterKeyFilterRules(y)),
1382
+ };
1383
+ // filter undefined values
1384
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1385
+ }
1386
+ exports.toJson_BucketSpecNotificationQueueConfigurationsFilterKey = toJson_BucketSpecNotificationQueueConfigurationsFilterKey;
1387
+ /**
1388
+ * Converts an object of type 'BucketSpecNotificationTopicConfigurationsFilterKey' to JSON representation.
1389
+ */
1390
+ /* eslint-disable max-len, quote-props */
1391
+ function toJson_BucketSpecNotificationTopicConfigurationsFilterKey(obj) {
1392
+ var _a;
1393
+ if (obj === undefined) {
1394
+ return undefined;
1395
+ }
1396
+ const result = {
1397
+ 'filterRules': (_a = obj.filterRules) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecNotificationTopicConfigurationsFilterKeyFilterRules(y)),
1398
+ };
1399
+ // filter undefined values
1400
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1401
+ }
1402
+ exports.toJson_BucketSpecNotificationTopicConfigurationsFilterKey = toJson_BucketSpecNotificationTopicConfigurationsFilterKey;
1403
+ /**
1404
+ * Converts an object of type 'BucketSpecReplicationRulesDestinationAccessControlTranslation' to JSON representation.
1405
+ */
1406
+ /* eslint-disable max-len, quote-props */
1407
+ function toJson_BucketSpecReplicationRulesDestinationAccessControlTranslation(obj) {
1408
+ if (obj === undefined) {
1409
+ return undefined;
1410
+ }
1411
+ const result = {
1412
+ 'owner': obj.owner,
1413
+ };
1414
+ // filter undefined values
1415
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1416
+ }
1417
+ exports.toJson_BucketSpecReplicationRulesDestinationAccessControlTranslation = toJson_BucketSpecReplicationRulesDestinationAccessControlTranslation;
1418
+ /**
1419
+ * Converts an object of type 'BucketSpecReplicationRulesDestinationEncryptionConfiguration' to JSON representation.
1420
+ */
1421
+ /* eslint-disable max-len, quote-props */
1422
+ function toJson_BucketSpecReplicationRulesDestinationEncryptionConfiguration(obj) {
1423
+ if (obj === undefined) {
1424
+ return undefined;
1425
+ }
1426
+ const result = {
1427
+ 'replicaKMSKeyID': obj.replicaKmsKeyId,
1428
+ };
1429
+ // filter undefined values
1430
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1431
+ }
1432
+ exports.toJson_BucketSpecReplicationRulesDestinationEncryptionConfiguration = toJson_BucketSpecReplicationRulesDestinationEncryptionConfiguration;
1433
+ /**
1434
+ * Converts an object of type 'BucketSpecReplicationRulesDestinationMetrics' to JSON representation.
1435
+ */
1436
+ /* eslint-disable max-len, quote-props */
1437
+ function toJson_BucketSpecReplicationRulesDestinationMetrics(obj) {
1438
+ if (obj === undefined) {
1439
+ return undefined;
1440
+ }
1441
+ const result = {
1442
+ 'eventThreshold': toJson_BucketSpecReplicationRulesDestinationMetricsEventThreshold(obj.eventThreshold),
1443
+ 'status': obj.status,
1444
+ };
1445
+ // filter undefined values
1446
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1447
+ }
1448
+ exports.toJson_BucketSpecReplicationRulesDestinationMetrics = toJson_BucketSpecReplicationRulesDestinationMetrics;
1449
+ /**
1450
+ * Converts an object of type 'BucketSpecReplicationRulesDestinationReplicationTime' to JSON representation.
1451
+ */
1452
+ /* eslint-disable max-len, quote-props */
1453
+ function toJson_BucketSpecReplicationRulesDestinationReplicationTime(obj) {
1454
+ if (obj === undefined) {
1455
+ return undefined;
1456
+ }
1457
+ const result = {
1458
+ 'status': obj.status,
1459
+ 'time': toJson_BucketSpecReplicationRulesDestinationReplicationTimeTime(obj.time),
1460
+ };
1461
+ // filter undefined values
1462
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1463
+ }
1464
+ exports.toJson_BucketSpecReplicationRulesDestinationReplicationTime = toJson_BucketSpecReplicationRulesDestinationReplicationTime;
1465
+ /**
1466
+ * Converts an object of type 'BucketSpecReplicationRulesFilterAnd' to JSON representation.
1467
+ */
1468
+ /* eslint-disable max-len, quote-props */
1469
+ function toJson_BucketSpecReplicationRulesFilterAnd(obj) {
1470
+ var _a;
1471
+ if (obj === undefined) {
1472
+ return undefined;
1473
+ }
1474
+ const result = {
1475
+ 'prefix': obj.prefix,
1476
+ 'tags': (_a = obj.tags) === null || _a === void 0 ? void 0 : _a.map(y => toJson_BucketSpecReplicationRulesFilterAndTags(y)),
1477
+ };
1478
+ // filter undefined values
1479
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1480
+ }
1481
+ exports.toJson_BucketSpecReplicationRulesFilterAnd = toJson_BucketSpecReplicationRulesFilterAnd;
1482
+ /**
1483
+ * Converts an object of type 'BucketSpecReplicationRulesFilterTag' to JSON representation.
1484
+ */
1485
+ /* eslint-disable max-len, quote-props */
1486
+ function toJson_BucketSpecReplicationRulesFilterTag(obj) {
1487
+ if (obj === undefined) {
1488
+ return undefined;
1489
+ }
1490
+ const result = {
1491
+ 'key': obj.key,
1492
+ 'value': obj.value,
1493
+ };
1494
+ // filter undefined values
1495
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1496
+ }
1497
+ exports.toJson_BucketSpecReplicationRulesFilterTag = toJson_BucketSpecReplicationRulesFilterTag;
1498
+ /**
1499
+ * Converts an object of type 'BucketSpecReplicationRulesSourceSelectionCriteriaReplicaModifications' to JSON representation.
1500
+ */
1501
+ /* eslint-disable max-len, quote-props */
1502
+ function toJson_BucketSpecReplicationRulesSourceSelectionCriteriaReplicaModifications(obj) {
1503
+ if (obj === undefined) {
1504
+ return undefined;
1505
+ }
1506
+ const result = {
1507
+ 'status': obj.status,
1508
+ };
1509
+ // filter undefined values
1510
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1511
+ }
1512
+ exports.toJson_BucketSpecReplicationRulesSourceSelectionCriteriaReplicaModifications = toJson_BucketSpecReplicationRulesSourceSelectionCriteriaReplicaModifications;
1513
+ /**
1514
+ * Converts an object of type 'BucketSpecReplicationRulesSourceSelectionCriteriaSseKmsEncryptedObjects' to JSON representation.
1515
+ */
1516
+ /* eslint-disable max-len, quote-props */
1517
+ function toJson_BucketSpecReplicationRulesSourceSelectionCriteriaSseKmsEncryptedObjects(obj) {
1518
+ if (obj === undefined) {
1519
+ return undefined;
1520
+ }
1521
+ const result = {
1522
+ 'status': obj.status,
1523
+ };
1524
+ // filter undefined values
1525
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1526
+ }
1527
+ exports.toJson_BucketSpecReplicationRulesSourceSelectionCriteriaSseKmsEncryptedObjects = toJson_BucketSpecReplicationRulesSourceSelectionCriteriaSseKmsEncryptedObjects;
1528
+ /**
1529
+ * Converts an object of type 'BucketSpecAnalyticsStorageClassAnalysisDataExportDestinationS3BucketDestination' to JSON representation.
1530
+ */
1531
+ /* eslint-disable max-len, quote-props */
1532
+ function toJson_BucketSpecAnalyticsStorageClassAnalysisDataExportDestinationS3BucketDestination(obj) {
1533
+ if (obj === undefined) {
1534
+ return undefined;
1535
+ }
1536
+ const result = {
1537
+ 'bucket': obj.bucket,
1538
+ 'bucketAccountID': obj.bucketAccountId,
1539
+ 'format': obj.format,
1540
+ 'prefix': obj.prefix,
1541
+ };
1542
+ // filter undefined values
1543
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1544
+ }
1545
+ exports.toJson_BucketSpecAnalyticsStorageClassAnalysisDataExportDestinationS3BucketDestination = toJson_BucketSpecAnalyticsStorageClassAnalysisDataExportDestinationS3BucketDestination;
1546
+ /**
1547
+ * Converts an object of type 'BucketSpecInventoryDestinationS3BucketDestinationEncryptionSseKms' to JSON representation.
1548
+ */
1549
+ /* eslint-disable max-len, quote-props */
1550
+ function toJson_BucketSpecInventoryDestinationS3BucketDestinationEncryptionSseKms(obj) {
1551
+ if (obj === undefined) {
1552
+ return undefined;
1553
+ }
1554
+ const result = {
1555
+ 'keyID': obj.keyId,
1556
+ };
1557
+ // filter undefined values
1558
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1559
+ }
1560
+ exports.toJson_BucketSpecInventoryDestinationS3BucketDestinationEncryptionSseKms = toJson_BucketSpecInventoryDestinationS3BucketDestinationEncryptionSseKms;
1561
+ /**
1562
+ * Converts an object of type 'BucketSpecLifecycleRulesFilterAndTags' to JSON representation.
1563
+ */
1564
+ /* eslint-disable max-len, quote-props */
1565
+ function toJson_BucketSpecLifecycleRulesFilterAndTags(obj) {
1566
+ if (obj === undefined) {
1567
+ return undefined;
1568
+ }
1569
+ const result = {
1570
+ 'key': obj.key,
1571
+ 'value': obj.value,
1572
+ };
1573
+ // filter undefined values
1574
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1575
+ }
1576
+ exports.toJson_BucketSpecLifecycleRulesFilterAndTags = toJson_BucketSpecLifecycleRulesFilterAndTags;
1577
+ /**
1578
+ * Converts an object of type 'BucketSpecNotificationLambdaFunctionConfigurationsFilterKeyFilterRules' to JSON representation.
1579
+ */
1580
+ /* eslint-disable max-len, quote-props */
1581
+ function toJson_BucketSpecNotificationLambdaFunctionConfigurationsFilterKeyFilterRules(obj) {
1582
+ if (obj === undefined) {
1583
+ return undefined;
1584
+ }
1585
+ const result = {
1586
+ 'name': obj.name,
1587
+ 'value': obj.value,
1588
+ };
1589
+ // filter undefined values
1590
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1591
+ }
1592
+ exports.toJson_BucketSpecNotificationLambdaFunctionConfigurationsFilterKeyFilterRules = toJson_BucketSpecNotificationLambdaFunctionConfigurationsFilterKeyFilterRules;
1593
+ /**
1594
+ * Converts an object of type 'BucketSpecNotificationQueueConfigurationsFilterKeyFilterRules' to JSON representation.
1595
+ */
1596
+ /* eslint-disable max-len, quote-props */
1597
+ function toJson_BucketSpecNotificationQueueConfigurationsFilterKeyFilterRules(obj) {
1598
+ if (obj === undefined) {
1599
+ return undefined;
1600
+ }
1601
+ const result = {
1602
+ 'name': obj.name,
1603
+ 'value': obj.value,
1604
+ };
1605
+ // filter undefined values
1606
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1607
+ }
1608
+ exports.toJson_BucketSpecNotificationQueueConfigurationsFilterKeyFilterRules = toJson_BucketSpecNotificationQueueConfigurationsFilterKeyFilterRules;
1609
+ /**
1610
+ * Converts an object of type 'BucketSpecNotificationTopicConfigurationsFilterKeyFilterRules' to JSON representation.
1611
+ */
1612
+ /* eslint-disable max-len, quote-props */
1613
+ function toJson_BucketSpecNotificationTopicConfigurationsFilterKeyFilterRules(obj) {
1614
+ if (obj === undefined) {
1615
+ return undefined;
1616
+ }
1617
+ const result = {
1618
+ 'name': obj.name,
1619
+ 'value': obj.value,
1620
+ };
1621
+ // filter undefined values
1622
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1623
+ }
1624
+ exports.toJson_BucketSpecNotificationTopicConfigurationsFilterKeyFilterRules = toJson_BucketSpecNotificationTopicConfigurationsFilterKeyFilterRules;
1625
+ /**
1626
+ * Converts an object of type 'BucketSpecReplicationRulesDestinationMetricsEventThreshold' to JSON representation.
1627
+ */
1628
+ /* eslint-disable max-len, quote-props */
1629
+ function toJson_BucketSpecReplicationRulesDestinationMetricsEventThreshold(obj) {
1630
+ if (obj === undefined) {
1631
+ return undefined;
1632
+ }
1633
+ const result = {
1634
+ 'minutes': obj.minutes,
1635
+ };
1636
+ // filter undefined values
1637
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1638
+ }
1639
+ exports.toJson_BucketSpecReplicationRulesDestinationMetricsEventThreshold = toJson_BucketSpecReplicationRulesDestinationMetricsEventThreshold;
1640
+ /**
1641
+ * Converts an object of type 'BucketSpecReplicationRulesDestinationReplicationTimeTime' to JSON representation.
1642
+ */
1643
+ /* eslint-disable max-len, quote-props */
1644
+ function toJson_BucketSpecReplicationRulesDestinationReplicationTimeTime(obj) {
1645
+ if (obj === undefined) {
1646
+ return undefined;
1647
+ }
1648
+ const result = {
1649
+ 'minutes': obj.minutes,
1650
+ };
1651
+ // filter undefined values
1652
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1653
+ }
1654
+ exports.toJson_BucketSpecReplicationRulesDestinationReplicationTimeTime = toJson_BucketSpecReplicationRulesDestinationReplicationTimeTime;
1655
+ /**
1656
+ * Converts an object of type 'BucketSpecReplicationRulesFilterAndTags' to JSON representation.
1657
+ */
1658
+ /* eslint-disable max-len, quote-props */
1659
+ function toJson_BucketSpecReplicationRulesFilterAndTags(obj) {
1660
+ if (obj === undefined) {
1661
+ return undefined;
1662
+ }
1663
+ const result = {
1664
+ 'key': obj.key,
1665
+ 'value': obj.value,
1666
+ };
1667
+ // filter undefined values
1668
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1669
+ }
1670
+ exports.toJson_BucketSpecReplicationRulesFilterAndTags = toJson_BucketSpecReplicationRulesFilterAndTags;
1671
+ /* eslint-enable max-len, quote-props */
1672
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczNidWNrZXRzLXMzLnNlcnZpY2VzLms4cy5hd3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW1wb3J0cy9zM2J1Y2tldHMtczMuc2VydmljZXMuazhzLmF3cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxQkFBcUI7QUFDckIsaUNBQXVFO0FBSXZFOzs7O0dBSUc7QUFDSCxNQUFhLE1BQU8sU0FBUSxpQkFBUztJQXVCbkM7Ozs7O09BS0c7SUFDSCxZQUFtQixLQUFnQixFQUFFLEVBQVUsRUFBRSxRQUFxQixFQUFFO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsR0FBRyxNQUFNLENBQUMsR0FBRztZQUNiLEdBQUcsS0FBSztTQUNULENBQUMsQ0FBQztJQUNMLENBQUM7SUF6QkQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFxQixFQUFFO1FBQzVDLE9BQU87WUFDTCxHQUFHLE1BQU0sQ0FBQyxHQUFHO1lBQ2IsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7U0FDN0IsQ0FBQztJQUNKLENBQUM7SUFlRDs7T0FFRztJQUNJLE1BQU07UUFDWCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFaEMsT0FBTztZQUNMLEdBQUcsTUFBTSxDQUFDLEdBQUc7WUFDYixHQUFHLGtCQUFrQixDQUFDLFFBQVEsQ0FBQztTQUNoQyxDQUFDO0lBQ0osQ0FBQzs7QUE5Q0gsd0JBK0NDO0FBOUNDOztHQUVHO0FBQ29CLFVBQUcsR0FBcUI7SUFDN0MsVUFBVSxFQUFFLDhCQUE4QjtJQUMxQyxJQUFJLEVBQUUsUUFBUTtDQUNmLENBQUM7QUErREo7O0dBRUc7QUFDSCx5Q0FBeUM7QUFDekMsU0FBZ0Isa0JBQWtCLENBQUMsR0FBNEI7SUFDN0QsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO1FBQUUsT0FBTyxTQUFTLENBQUM7S0FBRTtJQUM1QyxNQUFN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QUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBUkQsd0dBUUM7QUFDRCx3Q0FBd0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBnZW5lcmF0ZWQgYnkgY2RrOHNcbmltcG9ydCB7IEFwaU9iamVjdCwgQXBpT2JqZWN0TWV0YWRhdGEsIEdyb3VwVmVyc2lvbktpbmQgfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuXG4vKipcbiAqIEJ1Y2tldCBpcyB0aGUgU2NoZW1hIGZvciB0aGUgQnVja2V0cyBBUElcbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFxuICovXG5leHBvcnQgY2xhc3MgQnVja2V0IGV4dGVuZHMgQXBpT2JqZWN0IHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFwaVZlcnNpb24gYW5kIGtpbmQgZm9yIFwiQnVja2V0XCJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgR1ZLOiBHcm91cFZlcnNpb25LaW5kID0ge1xuICAgIGFwaVZlcnNpb246ICdzMy5zZXJ2aWNlcy5rOHMuYXdzL3YxYWxwaGExJyxcbiAgICBraW5kOiAnQnVja2V0JyxcbiAgfTtcblxuICAvKipcbiAgICogUmVuZGVycyBhIEt1YmVybmV0ZXMgbWFuaWZlc3QgZm9yIFwiQnVja2V0XCIuXG4gICAqXG4gICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW5saW5lIHJlc291cmNlIG1hbmlmZXN0cyBpbnNpZGUgb3RoZXIgb2JqZWN0cyAoZS5nLiBhcyB0ZW1wbGF0ZXMpLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgaW5pdGlhbGl6YXRpb24gcHJvcHNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbWFuaWZlc3QocHJvcHM6IEJ1Y2tldFByb3BzID0ge30pOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5CdWNrZXQuR1ZLLFxuICAgICAgLi4udG9Kc29uX0J1Y2tldFByb3BzKHByb3BzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZXMgYSBcIkJ1Y2tldFwiIEFQSSBvYmplY3RcbiAgICogQHBhcmFtIHNjb3BlIHRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBvYmplY3RcbiAgICogQHBhcmFtIGlkIGEgc2NvcGUtbG9jYWwgbmFtZSBmb3IgdGhlIG9iamVjdFxuICAgKiBAcGFyYW0gcHJvcHMgaW5pdGlhbGl6YXRpb24gcHJvcHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQnVja2V0UHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4uQnVja2V0LkdWSyxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIG9iamVjdCB0byBLdWJlcm5ldGVzIEpTT04uXG4gICAqL1xuICBwdWJsaWMgdG9Kc29uKCk6IGFueSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSBzdXBlci50b0pzb24oKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5CdWNrZXQuR1ZLLFxuICAgICAgLi4udG9Kc29uX0J1Y2tldFByb3BzKHJlc29sdmVkKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogQnVja2V0IGlzIHRoZSBTY2hlbWEgZm9yIHRoZSBCdWNrZXRzIEFQSVxuICpcbiAqIEBzY2hlbWEgQnVja2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0UHJvcHMge1xuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXQjbWV0YWRhdGFcbiAgICovXG4gIHJlYWRvbmx5IG1ldGFkYXRhPzogQXBpT2JqZWN0TWV0YWRhdGE7XG5cbiAgLyoqXG4gICAqIEJ1Y2tldFNwZWMgZGVmaW5lcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBCdWNrZXQuXG4gICAqIEluIHRlcm1zIG9mIGltcGxlbWVudGF0aW9uLCBhIEJ1Y2tldCBpcyBhIHJlc291cmNlLiBBbiBBbWF6b24gUzMgYnVja2V0IG5hbWUgaXMgZ2xvYmFsbHkgdW5pcXVlLCBhbmQgdGhlIG5hbWVzcGFjZSBpcyBzaGFyZWQgYnkgYWxsIEFtYXpvbiBXZWIgU2VydmljZXMgYWNjb3VudHMuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0I3NwZWNcbiAgICovXG4gIHJlYWRvbmx5IHNwZWM/OiBCdWNrZXRTcGVjO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFByb3BzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRQcm9wcyhvYmo6IEJ1Y2tldFByb3BzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWV0YWRhdGEnOiBvYmoubWV0YWRhdGEsXG4gICAgJ3NwZWMnOiB0b0pzb25fQnVja2V0U3BlYyhvYmouc3BlYyksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogQnVja2V0U3BlYyBkZWZpbmVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIEJ1Y2tldC5cbiAqIEluIHRlcm1zIG9mIGltcGxlbWVudGF0aW9uLCBhIEJ1Y2tldCBpcyBhIHJlc291cmNlLiBBbiBBbWF6b24gUzMgYnVja2V0IG5hbWUgaXMgZ2xvYmFsbHkgdW5pcXVlLCBhbmQgdGhlIG5hbWVzcGFjZSBpcyBzaGFyZWQgYnkgYWxsIEFtYXpvbiBXZWIgU2VydmljZXMgYWNjb3VudHMuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlYyB7XG4gIC8qKlxuICAgKiBDb250YWluZXIgZm9yIHNldHRpbmcgdGhlIHRyYW5zZmVyIGFjY2VsZXJhdGlvbiBzdGF0ZS5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjI2FjY2VsZXJhdGVcbiAgICovXG4gIHJlYWRvbmx5IGFjY2VsZXJhdGU/OiBCdWNrZXRTcGVjQWNjZWxlcmF0ZTtcblxuICAvKipcbiAgICogVGhlIGNhbm5lZCBBQ0wgdG8gYXBwbHkgdG8gdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjI2FjbFxuICAgKi9cbiAgcmVhZG9ubHkgYWNsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWMjYW5hbHl0aWNzXG4gICAqL1xuICByZWFkb25seSBhbmFseXRpY3M/OiBCdWNrZXRTcGVjQW5hbHl0aWNzW107XG5cbiAgLyoqXG4gICAqIERlc2NyaWJlcyB0aGUgY3Jvc3Mtb3JpZ2luIGFjY2VzcyBjb25maWd1cmF0aW9uIGZvciBvYmplY3RzIGluIGFuIEFtYXpvbiBTMyBidWNrZXQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgRW5hYmxpbmcgQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcgKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L2NvcnMuaHRtbCkgaW4gdGhlIEFtYXpvbiBTMyBVc2VyIEd1aWRlLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWMjY29yc1xuICAgKi9cbiAgcmVhZG9ubHkgY29ycz86IEJ1Y2tldFNwZWNDb3JzO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjI2NyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb24/OiBCdWNrZXRTcGVjQ3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBkZWZhdWx0IHNlcnZlci1zaWRlLWVuY3J5cHRpb24gY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjI2VuY3J5cHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb24/OiBCdWNrZXRTcGVjRW5jcnlwdGlvbjtcblxuICAvKipcbiAgICogQWxsb3dzIGdyYW50ZWUgdGhlIHJlYWQsIHdyaXRlLCByZWFkIEFDUCwgYW5kIHdyaXRlIEFDUCBwZXJtaXNzaW9ucyBvbiB0aGUgYnVja2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWMjZ3JhbnRGdWxsQ29udHJvbFxuICAgKi9cbiAgcmVhZG9ubHkgZ3JhbnRGdWxsQ29udHJvbD86IHN0cmluZztcblxuICAvKipcbiAgICogQWxsb3dzIGdyYW50ZWUgdG8gbGlzdCB0aGUgb2JqZWN0cyBpbiB0aGUgYnVja2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWMjZ3JhbnRSZWFkXG4gICAqL1xuICByZWFkb25seSBncmFudFJlYWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFsbG93cyBncmFudGVlIHRvIHJlYWQgdGhlIGJ1Y2tldCBBQ0wuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlYyNncmFudFJlYWRBQ1BcbiAgICovXG4gIHJlYWRvbmx5IGdyYW50UmVhZEFjcD86IHN0cmluZztcblxuICAvKipcbiAgICogQWxsb3dzIGdyYW50ZWUgdG8gY3JlYXRlIG5ldyBvYmplY3RzIGluIHRoZSBidWNrZXQuXG4gICAqIEZvciB0aGUgYnVja2V0IGFuZCBvYmplY3Qgb3duZXJzIG9mIGV4aXN0aW5nIG9iamVjdHMsIGFsc28gYWxsb3dzIGRlbGV0aW9ucyBhbmQgb3ZlcndyaXRlcyBvZiB0aG9zZSBvYmplY3RzLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWMjZ3JhbnRXcml0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZ3JhbnRXcml0ZT86IHN0cmluZztcblxuICAvKipcbiAgICogQWxsb3dzIGdyYW50ZWUgdG8gd3JpdGUgdGhlIEFDTCBmb3IgdGhlIGFwcGxpY2FibGUgYnVja2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWMjZ3JhbnRXcml0ZUFDUFxuICAgKi9cbiAgcmVhZG9ubHkgZ3JhbnRXcml0ZUFjcD86IHN0cmluZztcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjI2ludGVsbGlnZW50VGllcmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgaW50ZWxsaWdlbnRUaWVyaW5nPzogQnVja2V0U3BlY0ludGVsbGlnZW50VGllcmluZ1tdO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWMjaW52ZW50b3J5XG4gICAqL1xuICByZWFkb25seSBpbnZlbnRvcnk/OiBCdWNrZXRTcGVjSW52ZW50b3J5W107XG5cbiAgLyoqXG4gICAqIENvbnRhaW5lciBmb3IgbGlmZWN5Y2xlIHJ1bGVzLiBZb3UgY2FuIGFkZCBhcyBtYW55IGFzIDEsMDAwIHJ1bGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWMjbGlmZWN5Y2xlXG4gICAqL1xuICByZWFkb25seSBsaWZlY3ljbGU/OiBCdWNrZXRTcGVjTGlmZWN5Y2xlO1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgZm9yIGxvZ2dpbmcgc3RhdHVzIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWMjbG9nZ2luZ1xuICAgKi9cbiAgcmVhZG9ubHkgbG9nZ2luZz86IEJ1Y2tldFNwZWNMb2dnaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWMjbWV0cmljc1xuICAgKi9cbiAgcmVhZG9ubHkgbWV0cmljcz86IEJ1Y2tldFNwZWNNZXRyaWNzW107XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBidWNrZXQgdG8gY3JlYXRlLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWMjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRhaW5lciBmb3Igc3BlY2lmeWluZyB0aGUgbm90aWZpY2F0aW9uIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGJ1Y2tldC4gSWYgdGhpcyBlbGVtZW50IGlzIGVtcHR5LCBub3RpZmljYXRpb25zIGFyZSB0dXJuZWQgb2ZmIGZvciB0aGUgYnVja2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWMjbm90aWZpY2F0aW9uXG4gICAqL1xuICByZWFkb25seSBub3RpZmljYXRpb24/OiBCdWNrZXRTcGVjTm90aWZpY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCBTMyBPYmplY3QgTG9jayB0byBiZSBlbmFibGVkIGZvciB0aGUgbmV3IGJ1Y2tldC5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjI29iamVjdExvY2tFbmFibGVkRm9yQnVja2V0XG4gICAqL1xuICByZWFkb25seSBvYmplY3RMb2NrRW5hYmxlZEZvckJ1Y2tldD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBPd25lcnNoaXBDb250cm9scyAoQnVja2V0T3duZXJQcmVmZXJyZWQgb3IgT2JqZWN0V3JpdGVyKSB0aGF0IHlvdSB3YW50IHRvIGFwcGx5IHRvIHRoaXMgQW1hem9uIFMzIGJ1Y2tldC5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjI293bmVyc2hpcENvbnRyb2xzXG4gICAqL1xuICByZWFkb25seSBvd25lcnNoaXBDb250cm9scz86IEJ1Y2tldFNwZWNPd25lcnNoaXBDb250cm9scztcblxuICAvKipcbiAgICogVGhlIGJ1Y2tldCBwb2xpY3kgYXMgYSBKU09OIGRvY3VtZW50LlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWMjcG9saWN5XG4gICAqL1xuICByZWFkb25seSBwb2xpY3k/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBQdWJsaWNBY2Nlc3NCbG9jayBjb25maWd1cmF0aW9uIHRoYXQgeW91IHdhbnQgdG8gYXBwbHkgdG8gdGhpcyBBbWF6b24gUzMgYnVja2V0LiBZb3UgY2FuIGVuYWJsZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGluIGFueSBjb21iaW5hdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgd2hlbiBBbWF6b24gUzMgY29uc2lkZXJzIGEgYnVja2V0IG9yIG9iamVjdCBwdWJsaWMsIHNlZSBUaGUgTWVhbmluZyBvZiBcIlB1YmxpY1wiIChodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9hY2Nlc3MtY29udHJvbC1ibG9jay1wdWJsaWMtYWNjZXNzLmh0bWwjYWNjZXNzLWNvbnRyb2wtYmxvY2stcHVibGljLWFjY2Vzcy1wb2xpY3ktc3RhdHVzKSBpbiB0aGUgQW1hem9uIFMzIFVzZXIgR3VpZGUuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlYyNwdWJsaWNBY2Nlc3NCbG9ja1xuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljQWNjZXNzQmxvY2s/OiBCdWNrZXRTcGVjUHVibGljQWNjZXNzQmxvY2s7XG5cbiAgLyoqXG4gICAqIEEgY29udGFpbmVyIGZvciByZXBsaWNhdGlvbiBydWxlcy4gWW91IGNhbiBhZGQgdXAgdG8gMSwwMDAgcnVsZXMuIFRoZSBtYXhpbXVtIHNpemUgb2YgYSByZXBsaWNhdGlvbiBjb25maWd1cmF0aW9uIGlzIDIgTUIuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlYyNyZXBsaWNhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVwbGljYXRpb24/OiBCdWNrZXRTcGVjUmVwbGljYXRpb247XG5cbiAgLyoqXG4gICAqIENvbnRhaW5lciBmb3IgUGF5ZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlYyNyZXF1ZXN0UGF5bWVudFxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWVzdFBheW1lbnQ/OiBCdWNrZXRTcGVjUmVxdWVzdFBheW1lbnQ7XG5cbiAgLyoqXG4gICAqIENvbnRhaW5lciBmb3IgdGhlIFRhZ1NldCBhbmQgVGFnIGVsZW1lbnRzLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWMjdGFnZ2luZ1xuICAgKi9cbiAgcmVhZG9ubHkgdGFnZ2luZz86IEJ1Y2tldFNwZWNUYWdnaW5nO1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgZm9yIHNldHRpbmcgdGhlIHZlcnNpb25pbmcgc3RhdGUuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlYyN2ZXJzaW9uaW5nXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uaW5nPzogQnVja2V0U3BlY1ZlcnNpb25pbmc7XG5cbiAgLyoqXG4gICAqIENvbnRhaW5lciBmb3IgdGhlIHJlcXVlc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlYyN3ZWJzaXRlXG4gICAqL1xuICByZWFkb25seSB3ZWJzaXRlPzogQnVja2V0U3BlY1dlYnNpdGU7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlYycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlYyhvYmo6IEJ1Y2tldFNwZWMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhY2NlbGVyYXRlJzogdG9Kc29uX0J1Y2tldFNwZWNBY2NlbGVyYXRlKG9iai5hY2NlbGVyYXRlKSxcbiAgICAnYWNsJzogb2JqLmFjbCxcbiAgICAnYW5hbHl0aWNzJzogb2JqLmFuYWx5dGljcz8ubWFwKHkgPT4gdG9Kc29uX0J1Y2tldFNwZWNBbmFseXRpY3MoeSkpLFxuICAgICdjb3JzJzogdG9Kc29uX0J1Y2tldFNwZWNDb3JzKG9iai5jb3JzKSxcbiAgICAnY3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbic6IHRvSnNvbl9CdWNrZXRTcGVjQ3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbihvYmouY3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbiksXG4gICAgJ2VuY3J5cHRpb24nOiB0b0pzb25fQnVja2V0U3BlY0VuY3J5cHRpb24ob2JqLmVuY3J5cHRpb24pLFxuICAgICdncmFudEZ1bGxDb250cm9sJzogb2JqLmdyYW50RnVsbENvbnRyb2wsXG4gICAgJ2dyYW50UmVhZCc6IG9iai5ncmFudFJlYWQsXG4gICAgJ2dyYW50UmVhZEFDUCc6IG9iai5ncmFudFJlYWRBY3AsXG4gICAgJ2dyYW50V3JpdGUnOiBvYmouZ3JhbnRXcml0ZSxcbiAgICAnZ3JhbnRXcml0ZUFDUCc6IG9iai5ncmFudFdyaXRlQWNwLFxuICAgICdpbnRlbGxpZ2VudFRpZXJpbmcnOiBvYmouaW50ZWxsaWdlbnRUaWVyaW5nPy5tYXAoeSA9PiB0b0pzb25fQnVja2V0U3BlY0ludGVsbGlnZW50VGllcmluZyh5KSksXG4gICAgJ2ludmVudG9yeSc6IG9iai5pbnZlbnRvcnk/Lm1hcCh5ID0+IHRvSnNvbl9CdWNrZXRTcGVjSW52ZW50b3J5KHkpKSxcbiAgICAnbGlmZWN5Y2xlJzogdG9Kc29uX0J1Y2tldFNwZWNMaWZlY3ljbGUob2JqLmxpZmVjeWNsZSksXG4gICAgJ2xvZ2dpbmcnOiB0b0pzb25fQnVja2V0U3BlY0xvZ2dpbmcob2JqLmxvZ2dpbmcpLFxuICAgICdtZXRyaWNzJzogb2JqLm1ldHJpY3M/Lm1hcCh5ID0+IHRvSnNvbl9CdWNrZXRTcGVjTWV0cmljcyh5KSksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnbm90aWZpY2F0aW9uJzogdG9Kc29uX0J1Y2tldFNwZWNOb3RpZmljYXRpb24ob2JqLm5vdGlmaWNhdGlvbiksXG4gICAgJ29iamVjdExvY2tFbmFibGVkRm9yQnVja2V0Jzogb2JqLm9iamVjdExvY2tFbmFibGVkRm9yQnVja2V0LFxuICAgICdvd25lcnNoaXBDb250cm9scyc6IHRvSnNvbl9CdWNrZXRTcGVjT3duZXJzaGlwQ29udHJvbHMob2JqLm93bmVyc2hpcENvbnRyb2xzKSxcbiAgICAncG9saWN5Jzogb2JqLnBvbGljeSxcbiAgICAncHVibGljQWNjZXNzQmxvY2snOiB0b0pzb25fQnVja2V0U3BlY1B1YmxpY0FjY2Vzc0Jsb2NrKG9iai5wdWJsaWNBY2Nlc3NCbG9jayksXG4gICAgJ3JlcGxpY2F0aW9uJzogdG9Kc29uX0J1Y2tldFNwZWNSZXBsaWNhdGlvbihvYmoucmVwbGljYXRpb24pLFxuICAgICdyZXF1ZXN0UGF5bWVudCc6IHRvSnNvbl9CdWNrZXRTcGVjUmVxdWVzdFBheW1lbnQob2JqLnJlcXVlc3RQYXltZW50KSxcbiAgICAndGFnZ2luZyc6IHRvSnNvbl9CdWNrZXRTcGVjVGFnZ2luZyhvYmoudGFnZ2luZyksXG4gICAgJ3ZlcnNpb25pbmcnOiB0b0pzb25fQnVja2V0U3BlY1ZlcnNpb25pbmcob2JqLnZlcnNpb25pbmcpLFxuICAgICd3ZWJzaXRlJzogdG9Kc29uX0J1Y2tldFNwZWNXZWJzaXRlKG9iai53ZWJzaXRlKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBDb250YWluZXIgZm9yIHNldHRpbmcgdGhlIHRyYW5zZmVyIGFjY2VsZXJhdGlvbiBzdGF0ZS5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNBY2NlbGVyYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY0FjY2VsZXJhdGUge1xuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjQWNjZWxlcmF0ZSNzdGF0dXNcbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1cz86IHN0cmluZztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjQWNjZWxlcmF0ZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY0FjY2VsZXJhdGUob2JqOiBCdWNrZXRTcGVjQWNjZWxlcmF0ZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3N0YXR1cyc6IG9iai5zdGF0dXMsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBjb25maWd1cmF0aW9uIGFuZCBhbnkgYW5hbHlzZXMgZm9yIHRoZSBhbmFseXRpY3MgZmlsdGVyIG9mIGFuIEFtYXpvbiBTMyBidWNrZXQuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjQW5hbHl0aWNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY0FuYWx5dGljcyB7XG4gIC8qKlxuICAgKiBUaGUgZmlsdGVyIHVzZWQgdG8gZGVzY3JpYmUgYSBzZXQgb2Ygb2JqZWN0cyBmb3IgYW5hbHlzZXMuIEEgZmlsdGVyIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBwcmVmaXgsIG9uZSB0YWcsIG9yIG9uZSBjb25qdW5jdGlvbiAoQW5hbHl0aWNzQW5kT3BlcmF0b3IpLiBJZiBubyBmaWx0ZXIgaXMgcHJvdmlkZWQsIGFsbCBvYmplY3RzIHdpbGwgYmUgY29uc2lkZXJlZCBpbiBhbnkgYW5hbHlzaXMuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0FuYWx5dGljcyNmaWx0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGZpbHRlcj86IEJ1Y2tldFNwZWNBbmFseXRpY3NGaWx0ZXI7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0FuYWx5dGljcyNpZFxuICAgKi9cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBkYXRhIHJlbGF0ZWQgdG8gYWNjZXNzIHBhdHRlcm5zIHRvIGJlIGNvbGxlY3RlZCBhbmQgbWFkZSBhdmFpbGFibGUgdG8gYW5hbHl6ZSB0aGUgdHJhZGVvZmZzIGJldHdlZW4gZGlmZmVyZW50IHN0b3JhZ2UgY2xhc3NlcyBmb3IgYW4gQW1hem9uIFMzIGJ1Y2tldC5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjQW5hbHl0aWNzI3N0b3JhZ2VDbGFzc0FuYWx5c2lzXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlQ2xhc3NBbmFseXNpcz86IEJ1Y2tldFNwZWNBbmFseXRpY3NTdG9yYWdlQ2xhc3NBbmFseXNpcztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjQW5hbHl0aWNzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjQW5hbHl0aWNzKG9iajogQnVja2V0U3BlY0FuYWx5dGljcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2ZpbHRlcic6IHRvSnNvbl9CdWNrZXRTcGVjQW5hbHl0aWNzRmlsdGVyKG9iai5maWx0ZXIpLFxuICAgICdpZCc6IG9iai5pZCxcbiAgICAnc3RvcmFnZUNsYXNzQW5hbHlzaXMnOiB0b0pzb25fQnVja2V0U3BlY0FuYWx5dGljc1N0b3JhZ2VDbGFzc0FuYWx5c2lzKG9iai5zdG9yYWdlQ2xhc3NBbmFseXNpcyksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjcm9zcy1vcmlnaW4gYWNjZXNzIGNvbmZpZ3VyYXRpb24gZm9yIG9iamVjdHMgaW4gYW4gQW1hem9uIFMzIGJ1Y2tldC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBFbmFibGluZyBDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZyAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvY29ycy5odG1sKSBpbiB0aGUgQW1hem9uIFMzIFVzZXIgR3VpZGUuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjQ29yc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNDb3JzIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0NvcnMjY29yc1J1bGVzXG4gICAqL1xuICByZWFkb25seSBjb3JzUnVsZXM/OiBCdWNrZXRTcGVjQ29yc0NvcnNSdWxlc1tdO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNDb3JzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjQ29ycyhvYmo6IEJ1Y2tldFNwZWNDb3JzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY29yc1J1bGVzJzogb2JqLmNvcnNSdWxlcz8ubWFwKHkgPT4gdG9Kc29uX0J1Y2tldFNwZWNDb3JzQ29yc1J1bGVzKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGJ1Y2tldC5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNDcmVhdGVCdWNrZXRDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY0NyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjQ3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbiNsb2NhdGlvbkNvbnN0cmFpbnRcbiAgICovXG4gIHJlYWRvbmx5IGxvY2F0aW9uQ29uc3RyYWludD86IHN0cmluZztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjQ3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY0NyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb24ob2JqOiBCdWNrZXRTcGVjQ3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2xvY2F0aW9uQ29uc3RyYWludCc6IG9iai5sb2NhdGlvbkNvbnN0cmFpbnQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBkZWZhdWx0IHNlcnZlci1zaWRlLWVuY3J5cHRpb24gY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNFbmNyeXB0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY0VuY3J5cHRpb24ge1xuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjRW5jcnlwdGlvbiNydWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgcnVsZXM/OiBCdWNrZXRTcGVjRW5jcnlwdGlvblJ1bGVzW107XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY0VuY3J5cHRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNFbmNyeXB0aW9uKG9iajogQnVja2V0U3BlY0VuY3J5cHRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdydWxlcyc6IG9iai5ydWxlcz8ubWFwKHkgPT4gdG9Kc29uX0J1Y2tldFNwZWNFbmNyeXB0aW9uUnVsZXMoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgUzMgSW50ZWxsaWdlbnQtVGllcmluZyBjb25maWd1cmF0aW9uIGZvciBhbiBBbWF6b24gUzMgYnVja2V0LlxuICogRm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBTMyBJbnRlbGxpZ2VudC1UaWVyaW5nIHN0b3JhZ2UgY2xhc3MsIHNlZSBTdG9yYWdlIGNsYXNzIGZvciBhdXRvbWF0aWNhbGx5IG9wdGltaXppbmcgZnJlcXVlbnRseSBhbmQgaW5mcmVxdWVudGx5IGFjY2Vzc2VkIG9iamVjdHMgKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L3N0b3JhZ2UtY2xhc3MtaW50cm8uaHRtbCNzYy1keW5hbWljLWRhdGEtYWNjZXNzKS5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nIHtcbiAgLyoqXG4gICAqIFRoZSBGaWx0ZXIgaXMgdXNlZCB0byBpZGVudGlmeSBvYmplY3RzIHRoYXQgdGhlIFMzIEludGVsbGlnZW50LVRpZXJpbmcgY29uZmlndXJhdGlvbiBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmcjZmlsdGVyXG4gICAqL1xuICByZWFkb25seSBmaWx0ZXI/OiBCdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nRmlsdGVyO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmcjaWRcbiAgICovXG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmcjc3RhdHVzXG4gICAqL1xuICByZWFkb25seSBzdGF0dXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0ludGVsbGlnZW50VGllcmluZyN0aWVyaW5nc1xuICAgKi9cbiAgcmVhZG9ubHkgdGllcmluZ3M/OiBCdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nVGllcmluZ3NbXTtcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nKG9iajogQnVja2V0U3BlY0ludGVsbGlnZW50VGllcmluZyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2ZpbHRlcic6IHRvSnNvbl9CdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nRmlsdGVyKG9iai5maWx0ZXIpLFxuICAgICdpZCc6IG9iai5pZCxcbiAgICAnc3RhdHVzJzogb2JqLnN0YXR1cyxcbiAgICAndGllcmluZ3MnOiBvYmoudGllcmluZ3M/Lm1hcCh5ID0+IHRvSnNvbl9CdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nVGllcmluZ3MoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgaW52ZW50b3J5IGNvbmZpZ3VyYXRpb24gZm9yIGFuIEFtYXpvbiBTMyBidWNrZXQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgR0VUIEJ1Y2tldCBpbnZlbnRvcnkgKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvQVBJL1JFU1RCdWNrZXRHRVRJbnZlbnRvcnlDb25maWcuaHRtbCkgaW4gdGhlIEFtYXpvbiBTMyBBUEkgUmVmZXJlbmNlLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY0ludmVudG9yeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNJbnZlbnRvcnkge1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBpbnZlbnRvcnkgY29uZmlndXJhdGlvbiBmb3IgYW4gQW1hem9uIFMzIGJ1Y2tldC5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjSW52ZW50b3J5I2Rlc3RpbmF0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbj86IEJ1Y2tldFNwZWNJbnZlbnRvcnlEZXN0aW5hdGlvbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGFuIGludmVudG9yeSBmaWx0ZXIuIFRoZSBpbnZlbnRvcnkgb25seSBpbmNsdWRlcyBvYmplY3RzIHRoYXQgbWVldCB0aGUgZmlsdGVyJ3MgY3JpdGVyaWEuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0ludmVudG9yeSNmaWx0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGZpbHRlcj86IEJ1Y2tldFNwZWNJbnZlbnRvcnlGaWx0ZXI7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0ludmVudG9yeSNpZFxuICAgKi9cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0ludmVudG9yeSNpbmNsdWRlZE9iamVjdFZlcnNpb25zXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlZE9iamVjdFZlcnNpb25zPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNJbnZlbnRvcnkjaXNFbmFibGVkXG4gICAqL1xuICByZWFkb25seSBpc0VuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNJbnZlbnRvcnkjb3B0aW9uYWxGaWVsZHNcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsRmllbGRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgc2NoZWR1bGUgZm9yIGdlbmVyYXRpbmcgaW52ZW50b3J5IHJlc3VsdHMuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0ludmVudG9yeSNzY2hlZHVsZVxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGU/OiBCdWNrZXRTcGVjSW52ZW50b3J5U2NoZWR1bGU7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY0ludmVudG9yeScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY0ludmVudG9yeShvYmo6IEJ1Y2tldFNwZWNJbnZlbnRvcnkgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdkZXN0aW5hdGlvbic6IHRvSnNvbl9CdWNrZXRTcGVjSW52ZW50b3J5RGVzdGluYXRpb24ob2JqLmRlc3RpbmF0aW9uKSxcbiAgICAnZmlsdGVyJzogdG9Kc29uX0J1Y2tldFNwZWNJbnZlbnRvcnlGaWx0ZXIob2JqLmZpbHRlciksXG4gICAgJ2lkJzogb2JqLmlkLFxuICAgICdpbmNsdWRlZE9iamVjdFZlcnNpb25zJzogb2JqLmluY2x1ZGVkT2JqZWN0VmVyc2lvbnMsXG4gICAgJ2lzRW5hYmxlZCc6IG9iai5pc0VuYWJsZWQsXG4gICAgJ29wdGlvbmFsRmllbGRzJzogb2JqLm9wdGlvbmFsRmllbGRzPy5tYXAoeSA9PiB5KSxcbiAgICAnc2NoZWR1bGUnOiB0b0pzb25fQnVja2V0U3BlY0ludmVudG9yeVNjaGVkdWxlKG9iai5zY2hlZHVsZSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogQ29udGFpbmVyIGZvciBsaWZlY3ljbGUgcnVsZXMuIFlvdSBjYW4gYWRkIGFzIG1hbnkgYXMgMSwwMDAgcnVsZXMuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjTGlmZWN5Y2xlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY0xpZmVjeWNsZSB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMaWZlY3ljbGUjcnVsZXNcbiAgICovXG4gIHJlYWRvbmx5IHJ1bGVzPzogQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzW107XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY0xpZmVjeWNsZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY0xpZmVjeWNsZShvYmo6IEJ1Y2tldFNwZWNMaWZlY3ljbGUgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdydWxlcyc6IG9iai5ydWxlcz8ubWFwKHkgPT4gdG9Kc29uX0J1Y2tldFNwZWNMaWZlY3ljbGVSdWxlcyh5KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogQ29udGFpbmVyIGZvciBsb2dnaW5nIHN0YXR1cyBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNMb2dnaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY0xvZ2dpbmcge1xuICAvKipcbiAgICogRGVzY3JpYmVzIHdoZXJlIGxvZ3MgYXJlIHN0b3JlZCBhbmQgdGhlIHByZWZpeCB0aGF0IEFtYXpvbiBTMyBhc3NpZ25zIHRvIGFsbCBsb2cgb2JqZWN0IGtleXMgZm9yIGEgYnVja2V0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFBVVCBCdWNrZXQgbG9nZ2luZyAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvUkVTVEJ1Y2tldFBVVGxvZ2dpbmcuaHRtbCkgaW4gdGhlIEFtYXpvbiBTMyBBUEkgUmVmZXJlbmNlLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMb2dnaW5nI2xvZ2dpbmdFbmFibGVkXG4gICAqL1xuICByZWFkb25seSBsb2dnaW5nRW5hYmxlZD86IEJ1Y2tldFNwZWNMb2dnaW5nTG9nZ2luZ0VuYWJsZWQ7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY0xvZ2dpbmcnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNMb2dnaW5nKG9iajogQnVja2V0U3BlY0xvZ2dpbmcgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdsb2dnaW5nRW5hYmxlZCc6IHRvSnNvbl9CdWNrZXRTcGVjTG9nZ2luZ0xvZ2dpbmdFbmFibGVkKG9iai5sb2dnaW5nRW5hYmxlZCksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIGEgbWV0cmljcyBjb25maWd1cmF0aW9uIGZvciB0aGUgQ2xvdWRXYXRjaCByZXF1ZXN0IG1ldHJpY3MgKHNwZWNpZmllZCBieSB0aGUgbWV0cmljcyBjb25maWd1cmF0aW9uIElEKSBmcm9tIGFuIEFtYXpvbiBTMyBidWNrZXQuIElmIHlvdSdyZSB1cGRhdGluZyBhbiBleGlzdGluZyBtZXRyaWNzIGNvbmZpZ3VyYXRpb24sIG5vdGUgdGhhdCB0aGlzIGlzIGEgZnVsbCByZXBsYWNlbWVudCBvZiB0aGUgZXhpc3RpbmcgbWV0cmljcyBjb25maWd1cmF0aW9uLiBJZiB5b3UgZG9uJ3QgaW5jbHVkZSB0aGUgZWxlbWVudHMgeW91IHdhbnQgdG8ga2VlcCwgdGhleSBhcmUgZXJhc2VkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFB1dEJ1Y2tldE1ldHJpY3NDb25maWd1cmF0aW9uIChodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L0FQSS9SRVNUQnVja2V0UFVUTWV0cmljQ29uZmlndXJhdGlvbi5odG1sKS5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNNZXRyaWNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY01ldHJpY3Mge1xuICAvKipcbiAgICogU3BlY2lmaWVzIGEgbWV0cmljcyBjb25maWd1cmF0aW9uIGZpbHRlci4gVGhlIG1ldHJpY3MgY29uZmlndXJhdGlvbiBvbmx5IGluY2x1ZGVzIG9iamVjdHMgdGhhdCBtZWV0IHRoZSBmaWx0ZXIncyBjcml0ZXJpYS4gQSBmaWx0ZXIgbXVzdCBiZSBhIHByZWZpeCwgYW4gb2JqZWN0IHRhZywgYW4gYWNjZXNzIHBvaW50IEFSTiwgb3IgYSBjb25qdW5jdGlvbiAoTWV0cmljc0FuZE9wZXJhdG9yKS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBQdXRCdWNrZXRNZXRyaWNzQ29uZmlndXJhdGlvbiAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX1B1dEJ1Y2tldE1ldHJpY3NDb25maWd1cmF0aW9uLmh0bWwpLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNNZXRyaWNzI2ZpbHRlclxuICAgKi9cbiAgcmVhZG9ubHkgZmlsdGVyPzogQnVja2V0U3BlY01ldHJpY3NGaWx0ZXI7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY01ldHJpY3MjaWRcbiAgICovXG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNNZXRyaWNzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjTWV0cmljcyhvYmo6IEJ1Y2tldFNwZWNNZXRyaWNzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZmlsdGVyJzogdG9Kc29uX0J1Y2tldFNwZWNNZXRyaWNzRmlsdGVyKG9iai5maWx0ZXIpLFxuICAgICdpZCc6IG9iai5pZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGNvbnRhaW5lciBmb3Igc3BlY2lmeWluZyB0aGUgbm90aWZpY2F0aW9uIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGJ1Y2tldC4gSWYgdGhpcyBlbGVtZW50IGlzIGVtcHR5LCBub3RpZmljYXRpb25zIGFyZSB0dXJuZWQgb2ZmIGZvciB0aGUgYnVja2V0LlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY05vdGlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNOb3RpZmljYXRpb24ge1xuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTm90aWZpY2F0aW9uI2xhbWJkYUZ1bmN0aW9uQ29uZmlndXJhdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGxhbWJkYUZ1bmN0aW9uQ29uZmlndXJhdGlvbnM/OiBCdWNrZXRTcGVjTm90aWZpY2F0aW9uTGFtYmRhRnVuY3Rpb25Db25maWd1cmF0aW9uc1tdO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNOb3RpZmljYXRpb24jcXVldWVDb25maWd1cmF0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgcXVldWVDb25maWd1cmF0aW9ucz86IEJ1Y2tldFNwZWNOb3RpZmljYXRpb25RdWV1ZUNvbmZpZ3VyYXRpb25zW107XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY05vdGlmaWNhdGlvbiN0b3BpY0NvbmZpZ3VyYXRpb25zXG4gICAqL1xuICByZWFkb25seSB0b3BpY0NvbmZpZ3VyYXRpb25zPzogQnVja2V0U3BlY05vdGlmaWNhdGlvblRvcGljQ29uZmlndXJhdGlvbnNbXTtcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjTm90aWZpY2F0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjTm90aWZpY2F0aW9uKG9iajogQnVja2V0U3BlY05vdGlmaWNhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2xhbWJkYUZ1bmN0aW9uQ29uZmlndXJhdGlvbnMnOiBvYmoubGFtYmRhRnVuY3Rpb25Db25maWd1cmF0aW9ucz8ubWFwKHkgPT4gdG9Kc29uX0J1Y2tldFNwZWNOb3RpZmljYXRpb25MYW1iZGFGdW5jdGlvbkNvbmZpZ3VyYXRpb25zKHkpKSxcbiAgICAncXVldWVDb25maWd1cmF0aW9ucyc6IG9iai5xdWV1ZUNvbmZpZ3VyYXRpb25zPy5tYXAoeSA9PiB0b0pzb25fQnVja2V0U3BlY05vdGlmaWNhdGlvblF1ZXVlQ29uZmlndXJhdGlvbnMoeSkpLFxuICAgICd0b3BpY0NvbmZpZ3VyYXRpb25zJzogb2JqLnRvcGljQ29uZmlndXJhdGlvbnM/Lm1hcCh5ID0+IHRvSnNvbl9CdWNrZXRTcGVjTm90aWZpY2F0aW9uVG9waWNDb25maWd1cmF0aW9ucyh5KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogVGhlIE93bmVyc2hpcENvbnRyb2xzIChCdWNrZXRPd25lclByZWZlcnJlZCBvciBPYmplY3RXcml0ZXIpIHRoYXQgeW91IHdhbnQgdG8gYXBwbHkgdG8gdGhpcyBBbWF6b24gUzMgYnVja2V0LlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY093bmVyc2hpcENvbnRyb2xzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY093bmVyc2hpcENvbnRyb2xzIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY093bmVyc2hpcENvbnRyb2xzI3J1bGVzXG4gICAqL1xuICByZWFkb25seSBydWxlcz86IEJ1Y2tldFNwZWNPd25lcnNoaXBDb250cm9sc1J1bGVzW107XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY093bmVyc2hpcENvbnRyb2xzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjT3duZXJzaGlwQ29udHJvbHMob2JqOiBCdWNrZXRTcGVjT3duZXJzaGlwQ29udHJvbHMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdydWxlcyc6IG9iai5ydWxlcz8ubWFwKHkgPT4gdG9Kc29uX0J1Y2tldFNwZWNPd25lcnNoaXBDb250cm9sc1J1bGVzKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBUaGUgUHVibGljQWNjZXNzQmxvY2sgY29uZmlndXJhdGlvbiB0aGF0IHlvdSB3YW50IHRvIGFwcGx5IHRvIHRoaXMgQW1hem9uIFMzIGJ1Y2tldC4gWW91IGNhbiBlbmFibGUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbiBhbnkgY29tYmluYXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHdoZW4gQW1hem9uIFMzIGNvbnNpZGVycyBhIGJ1Y2tldCBvciBvYmplY3QgcHVibGljLCBzZWUgVGhlIE1lYW5pbmcgb2YgXCJQdWJsaWNcIiAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvYWNjZXNzLWNvbnRyb2wtYmxvY2stcHVibGljLWFjY2Vzcy5odG1sI2FjY2Vzcy1jb250cm9sLWJsb2NrLXB1YmxpYy1hY2Nlc3MtcG9saWN5LXN0YXR1cykgaW4gdGhlIEFtYXpvbiBTMyBVc2VyIEd1aWRlLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY1B1YmxpY0FjY2Vzc0Jsb2NrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY1B1YmxpY0FjY2Vzc0Jsb2NrIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1B1YmxpY0FjY2Vzc0Jsb2NrI2Jsb2NrUHVibGljQUNMc1xuICAgKi9cbiAgcmVhZG9ubHkgYmxvY2tQdWJsaWNBY0xzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUHVibGljQWNjZXNzQmxvY2sjYmxvY2tQdWJsaWNQb2xpY3lcbiAgICovXG4gIHJlYWRvbmx5IGJsb2NrUHVibGljUG9saWN5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUHVibGljQWNjZXNzQmxvY2sjaWdub3JlUHVibGljQUNMc1xuICAgKi9cbiAgcmVhZG9ubHkgaWdub3JlUHVibGljQWNMcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1B1YmxpY0FjY2Vzc0Jsb2NrI3Jlc3RyaWN0UHVibGljQnVja2V0c1xuICAgKi9cbiAgcmVhZG9ubHkgcmVzdHJpY3RQdWJsaWNCdWNrZXRzPzogYm9vbGVhbjtcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjUHVibGljQWNjZXNzQmxvY2snIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNQdWJsaWNBY2Nlc3NCbG9jayhvYmo6IEJ1Y2tldFNwZWNQdWJsaWNBY2Nlc3NCbG9jayB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2Jsb2NrUHVibGljQUNMcyc6IG9iai5ibG9ja1B1YmxpY0FjTHMsXG4gICAgJ2Jsb2NrUHVibGljUG9saWN5Jzogb2JqLmJsb2NrUHVibGljUG9saWN5LFxuICAgICdpZ25vcmVQdWJsaWNBQ0xzJzogb2JqLmlnbm9yZVB1YmxpY0FjTHMsXG4gICAgJ3Jlc3RyaWN0UHVibGljQnVja2V0cyc6IG9iai5yZXN0cmljdFB1YmxpY0J1Y2tldHMsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBjb250YWluZXIgZm9yIHJlcGxpY2F0aW9uIHJ1bGVzLiBZb3UgY2FuIGFkZCB1cCB0byAxLDAwMCBydWxlcy4gVGhlIG1heGltdW0gc2l6ZSBvZiBhIHJlcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gaXMgMiBNQi5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNSZXBsaWNhdGlvbiB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvbiNyb2xlXG4gICAqL1xuICByZWFkb25seSByb2xlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvbiNydWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgcnVsZXM/OiBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc1tdO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNSZXBsaWNhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY1JlcGxpY2F0aW9uKG9iajogQnVja2V0U3BlY1JlcGxpY2F0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncm9sZSc6IG9iai5yb2xlLFxuICAgICdydWxlcyc6IG9iai5ydWxlcz8ubWFwKHkgPT4gdG9Kc29uX0J1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBDb250YWluZXIgZm9yIFBheWVyLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY1JlcXVlc3RQYXltZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY1JlcXVlc3RQYXltZW50IHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1JlcXVlc3RQYXltZW50I3BheWVyXG4gICAqL1xuICByZWFkb25seSBwYXllcj86IHN0cmluZztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjUmVxdWVzdFBheW1lbnQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNSZXF1ZXN0UGF5bWVudChvYmo6IEJ1Y2tldFNwZWNSZXF1ZXN0UGF5bWVudCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3BheWVyJzogb2JqLnBheWVyLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIENvbnRhaW5lciBmb3IgdGhlIFRhZ1NldCBhbmQgVGFnIGVsZW1lbnRzLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY1RhZ2dpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjVGFnZ2luZyB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNUYWdnaW5nI3RhZ1NldFxuICAgKi9cbiAgcmVhZG9ubHkgdGFnU2V0PzogQnVja2V0U3BlY1RhZ2dpbmdUYWdTZXRbXTtcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjVGFnZ2luZycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY1RhZ2dpbmcob2JqOiBCdWNrZXRTcGVjVGFnZ2luZyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3RhZ1NldCc6IG9iai50YWdTZXQ/Lm1hcCh5ID0+IHRvSnNvbl9CdWNrZXRTcGVjVGFnZ2luZ1RhZ1NldCh5KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogQ29udGFpbmVyIGZvciBzZXR0aW5nIHRoZSB2ZXJzaW9uaW5nIHN0YXRlLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY1ZlcnNpb25pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjVmVyc2lvbmluZyB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNWZXJzaW9uaW5nI3N0YXR1c1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNWZXJzaW9uaW5nJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjVmVyc2lvbmluZyhvYmo6IEJ1Y2tldFNwZWNWZXJzaW9uaW5nIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnc3RhdHVzJzogb2JqLnN0YXR1cyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBDb250YWluZXIgZm9yIHRoZSByZXF1ZXN0LlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY1dlYnNpdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjV2Vic2l0ZSB7XG4gIC8qKlxuICAgKiBUaGUgZXJyb3IgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1dlYnNpdGUjZXJyb3JEb2N1bWVudFxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3JEb2N1bWVudD86IEJ1Y2tldFNwZWNXZWJzaXRlRXJyb3JEb2N1bWVudDtcblxuICAvKipcbiAgICogQ29udGFpbmVyIGZvciB0aGUgU3VmZml4IGVsZW1lbnQuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1dlYnNpdGUjaW5kZXhEb2N1bWVudFxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZXhEb2N1bWVudD86IEJ1Y2tldFNwZWNXZWJzaXRlSW5kZXhEb2N1bWVudDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSByZWRpcmVjdCBiZWhhdmlvciBvZiBhbGwgcmVxdWVzdHMgdG8gYSB3ZWJzaXRlIGVuZHBvaW50IG9mIGFuIEFtYXpvbiBTMyBidWNrZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1dlYnNpdGUjcmVkaXJlY3RBbGxSZXF1ZXN0c1RvXG4gICAqL1xuICByZWFkb25seSByZWRpcmVjdEFsbFJlcXVlc3RzVG8/OiBCdWNrZXRTcGVjV2Vic2l0ZVJlZGlyZWN0QWxsUmVxdWVzdHNUbztcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjV2Vic2l0ZSNyb3V0aW5nUnVsZXNcbiAgICovXG4gIHJlYWRvbmx5IHJvdXRpbmdSdWxlcz86IEJ1Y2tldFNwZWNXZWJzaXRlUm91dGluZ1J1bGVzW107XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY1dlYnNpdGUnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNXZWJzaXRlKG9iajogQnVja2V0U3BlY1dlYnNpdGUgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlcnJvckRvY3VtZW50JzogdG9Kc29uX0J1Y2tldFNwZWNXZWJzaXRlRXJyb3JEb2N1bWVudChvYmouZXJyb3JEb2N1bWVudCksXG4gICAgJ2luZGV4RG9jdW1lbnQnOiB0b0pzb25fQnVja2V0U3BlY1dlYnNpdGVJbmRleERvY3VtZW50KG9iai5pbmRleERvY3VtZW50KSxcbiAgICAncmVkaXJlY3RBbGxSZXF1ZXN0c1RvJzogdG9Kc29uX0J1Y2tldFNwZWNXZWJzaXRlUmVkaXJlY3RBbGxSZXF1ZXN0c1RvKG9iai5yZWRpcmVjdEFsbFJlcXVlc3RzVG8pLFxuICAgICdyb3V0aW5nUnVsZXMnOiBvYmoucm91dGluZ1J1bGVzPy5tYXAoeSA9PiB0b0pzb25fQnVja2V0U3BlY1dlYnNpdGVSb3V0aW5nUnVsZXMoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFRoZSBmaWx0ZXIgdXNlZCB0byBkZXNjcmliZSBhIHNldCBvZiBvYmplY3RzIGZvciBhbmFseXNlcy4gQSBmaWx0ZXIgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHByZWZpeCwgb25lIHRhZywgb3Igb25lIGNvbmp1bmN0aW9uIChBbmFseXRpY3NBbmRPcGVyYXRvcikuIElmIG5vIGZpbHRlciBpcyBwcm92aWRlZCwgYWxsIG9iamVjdHMgd2lsbCBiZSBjb25zaWRlcmVkIGluIGFueSBhbmFseXNpcy5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNBbmFseXRpY3NGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjQW5hbHl0aWNzRmlsdGVyIHtcbiAgLyoqXG4gICAqIEEgY29uanVuY3Rpb24gKGxvZ2ljYWwgQU5EKSBvZiBwcmVkaWNhdGVzLCB3aGljaCBpcyB1c2VkIGluIGV2YWx1YXRpbmcgYSBtZXRyaWNzIGZpbHRlci4gVGhlIG9wZXJhdG9yIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gcHJlZGljYXRlcyBpbiBhbnkgY29tYmluYXRpb24sIGFuZCBhbiBvYmplY3QgbXVzdCBtYXRjaCBhbGwgb2YgdGhlIHByZWRpY2F0ZXMgZm9yIHRoZSBmaWx0ZXIgdG8gYXBwbHkuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0FuYWx5dGljc0ZpbHRlciNhbmRcbiAgICovXG4gIHJlYWRvbmx5IGFuZD86IEJ1Y2tldFNwZWNBbmFseXRpY3NGaWx0ZXJBbmQ7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0FuYWx5dGljc0ZpbHRlciNwcmVmaXhcbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogQSBjb250YWluZXIgb2YgYSBrZXkgdmFsdWUgbmFtZSBwYWlyLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNBbmFseXRpY3NGaWx0ZXIjdGFnXG4gICAqL1xuICByZWFkb25seSB0YWc/OiBCdWNrZXRTcGVjQW5hbHl0aWNzRmlsdGVyVGFnO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNBbmFseXRpY3NGaWx0ZXInIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNBbmFseXRpY3NGaWx0ZXIob2JqOiBCdWNrZXRTcGVjQW5hbHl0aWNzRmlsdGVyIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYW5kJzogdG9Kc29uX0J1Y2tldFNwZWNBbmFseXRpY3NGaWx0ZXJBbmQob2JqLmFuZCksXG4gICAgJ3ByZWZpeCc6IG9iai5wcmVmaXgsXG4gICAgJ3RhZyc6IHRvSnNvbl9CdWNrZXRTcGVjQW5hbHl0aWNzRmlsdGVyVGFnKG9iai50YWcpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNwZWNpZmllcyBkYXRhIHJlbGF0ZWQgdG8gYWNjZXNzIHBhdHRlcm5zIHRvIGJlIGNvbGxlY3RlZCBhbmQgbWFkZSBhdmFpbGFibGUgdG8gYW5hbHl6ZSB0aGUgdHJhZGVvZmZzIGJldHdlZW4gZGlmZmVyZW50IHN0b3JhZ2UgY2xhc3NlcyBmb3IgYW4gQW1hem9uIFMzIGJ1Y2tldC5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNBbmFseXRpY3NTdG9yYWdlQ2xhc3NBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNBbmFseXRpY3NTdG9yYWdlQ2xhc3NBbmFseXNpcyB7XG4gIC8qKlxuICAgKiBDb250YWluZXIgZm9yIGRhdGEgcmVsYXRlZCB0byB0aGUgc3RvcmFnZSBjbGFzcyBhbmFseXNpcyBmb3IgYW4gQW1hem9uIFMzIGJ1Y2tldCBmb3IgZXhwb3J0LlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNBbmFseXRpY3NTdG9yYWdlQ2xhc3NBbmFseXNpcyNkYXRhRXhwb3J0XG4gICAqL1xuICByZWFkb25seSBkYXRhRXhwb3J0PzogQnVja2V0U3BlY0FuYWx5dGljc1N0b3JhZ2VDbGFzc0FuYWx5c2lzRGF0YUV4cG9ydDtcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjQW5hbHl0aWNzU3RvcmFnZUNsYXNzQW5hbHlzaXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNBbmFseXRpY3NTdG9yYWdlQ2xhc3NBbmFseXNpcyhvYmo6IEJ1Y2tldFNwZWNBbmFseXRpY3NTdG9yYWdlQ2xhc3NBbmFseXNpcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2RhdGFFeHBvcnQnOiB0b0pzb25fQnVja2V0U3BlY0FuYWx5dGljc1N0b3JhZ2VDbGFzc0FuYWx5c2lzRGF0YUV4cG9ydChvYmouZGF0YUV4cG9ydCksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIGEgY3Jvc3Mtb3JpZ2luIGFjY2VzcyBydWxlIGZvciBhbiBBbWF6b24gUzMgYnVja2V0LlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY0NvcnNDb3JzUnVsZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjQ29yc0NvcnNSdWxlcyB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNDb3JzQ29yc1J1bGVzI2FsbG93ZWRIZWFkZXJzXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkSGVhZGVycz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNDb3JzQ29yc1J1bGVzI2FsbG93ZWRNZXRob2RzXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkTWV0aG9kcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNDb3JzQ29yc1J1bGVzI2FsbG93ZWRPcmlnaW5zXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkT3JpZ2lucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNDb3JzQ29yc1J1bGVzI2V4cG9zZUhlYWRlcnNcbiAgICovXG4gIHJlYWRvbmx5IGV4cG9zZUhlYWRlcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjQ29yc0NvcnNSdWxlcyNpZFxuICAgKi9cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0NvcnNDb3JzUnVsZXMjbWF4QWdlU2Vjb25kc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4QWdlU2Vjb25kcz86IG51bWJlcjtcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjQ29yc0NvcnNSdWxlcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY0NvcnNDb3JzUnVsZXMob2JqOiBCdWNrZXRTcGVjQ29yc0NvcnNSdWxlcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FsbG93ZWRIZWFkZXJzJzogb2JqLmFsbG93ZWRIZWFkZXJzPy5tYXAoeSA9PiB5KSxcbiAgICAnYWxsb3dlZE1ldGhvZHMnOiBvYmouYWxsb3dlZE1ldGhvZHM/Lm1hcCh5ID0+IHkpLFxuICAgICdhbGxvd2VkT3JpZ2lucyc6IG9iai5hbGxvd2VkT3JpZ2lucz8ubWFwKHkgPT4geSksXG4gICAgJ2V4cG9zZUhlYWRlcnMnOiBvYmouZXhwb3NlSGVhZGVycz8ubWFwKHkgPT4geSksXG4gICAgJ2lkJzogb2JqLmlkLFxuICAgICdtYXhBZ2VTZWNvbmRzJzogb2JqLm1heEFnZVNlY29uZHMsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBkZWZhdWx0IHNlcnZlci1zaWRlIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNFbmNyeXB0aW9uUnVsZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjRW5jcnlwdGlvblJ1bGVzIHtcbiAgLyoqXG4gICAqIERlc2NyaWJlcyB0aGUgZGVmYXVsdCBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIHRvIGFwcGx5IHRvIG5ldyBvYmplY3RzIGluIHRoZSBidWNrZXQuIElmIGEgUFVUIE9iamVjdCByZXF1ZXN0IGRvZXNuJ3Qgc3BlY2lmeSBhbnkgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiwgdGhpcyBkZWZhdWx0IGVuY3J5cHRpb24gd2lsbCBiZSBhcHBsaWVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFBVVCBCdWNrZXQgZW5jcnlwdGlvbiAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvUkVTVEJ1Y2tldFBVVGVuY3J5cHRpb24uaHRtbCkgaW4gdGhlIEFtYXpvbiBTMyBBUEkgUmVmZXJlbmNlLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNFbmNyeXB0aW9uUnVsZXMjYXBwbHlTZXJ2ZXJTaWRlRW5jcnlwdGlvbkJ5RGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgYXBwbHlTZXJ2ZXJTaWRlRW5jcnlwdGlvbkJ5RGVmYXVsdD86IEJ1Y2tldFNwZWNFbmNyeXB0aW9uUnVsZXNBcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0O1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNFbmNyeXB0aW9uUnVsZXMjYnVja2V0S2V5RW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0S2V5RW5hYmxlZD86IGJvb2xlYW47XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY0VuY3J5cHRpb25SdWxlcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY0VuY3J5cHRpb25SdWxlcyhvYmo6IEJ1Y2tldFNwZWNFbmNyeXB0aW9uUnVsZXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0JzogdG9Kc29uX0J1Y2tldFNwZWNFbmNyeXB0aW9uUnVsZXNBcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0KG9iai5hcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0KSxcbiAgICAnYnVja2V0S2V5RW5hYmxlZCc6IG9iai5idWNrZXRLZXlFbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFRoZSBGaWx0ZXIgaXMgdXNlZCB0byBpZGVudGlmeSBvYmplY3RzIHRoYXQgdGhlIFMzIEludGVsbGlnZW50LVRpZXJpbmcgY29uZmlndXJhdGlvbiBhcHBsaWVzIHRvLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY0ludGVsbGlnZW50VGllcmluZ0ZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdGaWx0ZXIge1xuICAvKipcbiAgICogQSBjb250YWluZXIgZm9yIHNwZWNpZnlpbmcgUzMgSW50ZWxsaWdlbnQtVGllcmluZyBmaWx0ZXJzLiBUaGUgZmlsdGVycyBkZXRlcm1pbmUgdGhlIHN1YnNldCBvZiBvYmplY3RzIHRvIHdoaWNoIHRoZSBydWxlIGFwcGxpZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0ludGVsbGlnZW50VGllcmluZ0ZpbHRlciNhbmRcbiAgICovXG4gIHJlYWRvbmx5IGFuZD86IEJ1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdGaWx0ZXJBbmQ7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0ludGVsbGlnZW50VGllcmluZ0ZpbHRlciNwcmVmaXhcbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogQSBjb250YWluZXIgb2YgYSBrZXkgdmFsdWUgbmFtZSBwYWlyLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdGaWx0ZXIjdGFnXG4gICAqL1xuICByZWFkb25seSB0YWc/OiBCdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nRmlsdGVyVGFnO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdGaWx0ZXInIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdGaWx0ZXIob2JqOiBCdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nRmlsdGVyIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYW5kJzogdG9Kc29uX0J1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdGaWx0ZXJBbmQob2JqLmFuZCksXG4gICAgJ3ByZWZpeCc6IG9iai5wcmVmaXgsXG4gICAgJ3RhZyc6IHRvSnNvbl9CdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nRmlsdGVyVGFnKG9iai50YWcpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFRoZSBTMyBJbnRlbGxpZ2VudC1UaWVyaW5nIHN0b3JhZ2UgY2xhc3MgaXMgZGVzaWduZWQgdG8gb3B0aW1pemUgc3RvcmFnZSBjb3N0cyBieSBhdXRvbWF0aWNhbGx5IG1vdmluZyBkYXRhIHRvIHRoZSBtb3N0IGNvc3QtZWZmZWN0aXZlIHN0b3JhZ2UgYWNjZXNzIHRpZXIsIHdpdGhvdXQgYWRkaXRpb25hbCBvcGVyYXRpb25hbCBvdmVyaGVhZC5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdUaWVyaW5nc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdUaWVyaW5ncyB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdUaWVyaW5ncyNhY2Nlc3NUaWVyXG4gICAqL1xuICByZWFkb25seSBhY2Nlc3NUaWVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdUaWVyaW5ncyNkYXlzXG4gICAqL1xuICByZWFkb25seSBkYXlzPzogbnVtYmVyO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdUaWVyaW5ncycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY0ludGVsbGlnZW50VGllcmluZ1RpZXJpbmdzKG9iajogQnVja2V0U3BlY0ludGVsbGlnZW50VGllcmluZ1RpZXJpbmdzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWNjZXNzVGllcic6IG9iai5hY2Nlc3NUaWVyLFxuICAgICdkYXlzJzogb2JqLmRheXMsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBpbnZlbnRvcnkgY29uZmlndXJhdGlvbiBmb3IgYW4gQW1hem9uIFMzIGJ1Y2tldC5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNJbnZlbnRvcnlEZXN0aW5hdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNJbnZlbnRvcnlEZXN0aW5hdGlvbiB7XG4gIC8qKlxuICAgKiBDb250YWlucyB0aGUgYnVja2V0IG5hbWUsIGZpbGUgZm9ybWF0LCBidWNrZXQgb3duZXIgKG9wdGlvbmFsKSwgYW5kIHByZWZpeCAob3B0aW9uYWwpIHdoZXJlIGludmVudG9yeSByZXN1bHRzIGFyZSBwdWJsaXNoZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0ludmVudG9yeURlc3RpbmF0aW9uI3MzQnVja2V0RGVzdGluYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHMzQnVja2V0RGVzdGluYXRpb24/OiBCdWNrZXRTcGVjSW52ZW50b3J5RGVzdGluYXRpb25TM0J1Y2tldERlc3RpbmF0aW9uO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNJbnZlbnRvcnlEZXN0aW5hdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY0ludmVudG9yeURlc3RpbmF0aW9uKG9iajogQnVja2V0U3BlY0ludmVudG9yeURlc3RpbmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnczNCdWNrZXREZXN0aW5hdGlvbic6IHRvSnNvbl9CdWNrZXRTcGVjSW52ZW50b3J5RGVzdGluYXRpb25TM0J1Y2tldERlc3RpbmF0aW9uKG9iai5zM0J1Y2tldERlc3RpbmF0aW9uKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTcGVjaWZpZXMgYW4gaW52ZW50b3J5IGZpbHRlci4gVGhlIGludmVudG9yeSBvbmx5IGluY2x1ZGVzIG9iamVjdHMgdGhhdCBtZWV0IHRoZSBmaWx0ZXIncyBjcml0ZXJpYS5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNJbnZlbnRvcnlGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjSW52ZW50b3J5RmlsdGVyIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0ludmVudG9yeUZpbHRlciNwcmVmaXhcbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeD86IHN0cmluZztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjSW52ZW50b3J5RmlsdGVyJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjSW52ZW50b3J5RmlsdGVyKG9iajogQnVja2V0U3BlY0ludmVudG9yeUZpbHRlciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3ByZWZpeCc6IG9iai5wcmVmaXgsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBzY2hlZHVsZSBmb3IgZ2VuZXJhdGluZyBpbnZlbnRvcnkgcmVzdWx0cy5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNJbnZlbnRvcnlTY2hlZHVsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNJbnZlbnRvcnlTY2hlZHVsZSB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNJbnZlbnRvcnlTY2hlZHVsZSNmcmVxdWVuY3lcbiAgICovXG4gIHJlYWRvbmx5IGZyZXF1ZW5jeT86IHN0cmluZztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjSW52ZW50b3J5U2NoZWR1bGUnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNJbnZlbnRvcnlTY2hlZHVsZShvYmo6IEJ1Y2tldFNwZWNJbnZlbnRvcnlTY2hlZHVsZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2ZyZXF1ZW5jeSc6IG9iai5mcmVxdWVuY3ksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsaWZlY3ljbGUgcnVsZSBmb3IgaW5kaXZpZHVhbCBvYmplY3RzIGluIGFuIEFtYXpvbiBTMyBidWNrZXQuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXMge1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBkYXlzIHNpbmNlIHRoZSBpbml0aWF0aW9uIG9mIGFuIGluY29tcGxldGUgbXVsdGlwYXJ0IHVwbG9hZCB0aGF0IEFtYXpvbiBTMyB3aWxsIHdhaXQgYmVmb3JlIHBlcm1hbmVudGx5IHJlbW92aW5nIGFsbCBwYXJ0cyBvZiB0aGUgdXBsb2FkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIEFib3J0aW5nIEluY29tcGxldGUgTXVsdGlwYXJ0IFVwbG9hZHMgVXNpbmcgYSBCdWNrZXQgTGlmZWN5Y2xlIFBvbGljeSAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvbXB1b3ZlcnZpZXcuaHRtbCNtcHUtYWJvcnQtaW5jb21wbGV0ZS1tcHUtbGlmZWN5Y2xlLWNvbmZpZykgaW4gdGhlIEFtYXpvbiBTMyBVc2VyIEd1aWRlLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlcyNhYm9ydEluY29tcGxldGVNdWx0aXBhcnRVcGxvYWRcbiAgICovXG4gIHJlYWRvbmx5IGFib3J0SW5jb21wbGV0ZU11bHRpcGFydFVwbG9hZD86IEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0Fib3J0SW5jb21wbGV0ZU11bHRpcGFydFVwbG9hZDtcblxuICAvKipcbiAgICogQ29udGFpbmVyIGZvciB0aGUgZXhwaXJhdGlvbiBmb3IgdGhlIGxpZmVjeWNsZSBvZiB0aGUgb2JqZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlcyNleHBpcmF0aW9uXG4gICAqL1xuICByZWFkb25seSBleHBpcmF0aW9uPzogQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzRXhwaXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIEZpbHRlciBpcyB1c2VkIHRvIGlkZW50aWZ5IG9iamVjdHMgdGhhdCBhIExpZmVjeWNsZSBSdWxlIGFwcGxpZXMgdG8uIEEgRmlsdGVyIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBvZiBQcmVmaXgsIFRhZywgb3IgQW5kIHNwZWNpZmllZC5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXMjZmlsdGVyXG4gICAqL1xuICByZWFkb25seSBmaWx0ZXI/OiBCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNGaWx0ZXI7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzI2lkXG4gICAqL1xuICByZWFkb25seSBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZW4gbm9uY3VycmVudCBvYmplY3QgdmVyc2lvbnMgZXhwaXJlLiBVcG9uIGV4cGlyYXRpb24sIEFtYXpvbiBTMyBwZXJtYW5lbnRseSBkZWxldGVzIHRoZSBub25jdXJyZW50IG9iamVjdCB2ZXJzaW9ucy4gWW91IHNldCB0aGlzIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uIGFjdGlvbiBvbiBhIGJ1Y2tldCB0aGF0IGhhcyB2ZXJzaW9uaW5nIGVuYWJsZWQgKG9yIHN1c3BlbmRlZCkgdG8gcmVxdWVzdCB0aGF0IEFtYXpvbiBTMyBkZWxldGUgbm9uY3VycmVudCBvYmplY3QgdmVyc2lvbnMgYXQgYSBzcGVjaWZpYyBwZXJpb2QgaW4gdGhlIG9iamVjdCdzIGxpZmV0aW1lLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlcyNub25jdXJyZW50VmVyc2lvbkV4cGlyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IG5vbmN1cnJlbnRWZXJzaW9uRXhwaXJhdGlvbj86IEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc05vbmN1cnJlbnRWZXJzaW9uRXhwaXJhdGlvbjtcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXMjbm9uY3VycmVudFZlcnNpb25UcmFuc2l0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbm9uY3VycmVudFZlcnNpb25UcmFuc2l0aW9ucz86IEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc05vbmN1cnJlbnRWZXJzaW9uVHJhbnNpdGlvbnNbXTtcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXMjcHJlZml4XG4gICAqL1xuICByZWFkb25seSBwcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzI3N0YXR1c1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlcyN0cmFuc2l0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNpdGlvbnM/OiBCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNUcmFuc2l0aW9uc1tdO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNMaWZlY3ljbGVSdWxlcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzKG9iajogQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWJvcnRJbmNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkJzogdG9Kc29uX0J1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0Fib3J0SW5jb21wbGV0ZU11bHRpcGFydFVwbG9hZChvYmouYWJvcnRJbmNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkKSxcbiAgICAnZXhwaXJhdGlvbic6IHRvSnNvbl9CdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNFeHBpcmF0aW9uKG9iai5leHBpcmF0aW9uKSxcbiAgICAnZmlsdGVyJzogdG9Kc29uX0J1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlcihvYmouZmlsdGVyKSxcbiAgICAnaWQnOiBvYmouaWQsXG4gICAgJ25vbmN1cnJlbnRWZXJzaW9uRXhwaXJhdGlvbic6IHRvSnNvbl9CdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNOb25jdXJyZW50VmVyc2lvbkV4cGlyYXRpb24ob2JqLm5vbmN1cnJlbnRWZXJzaW9uRXhwaXJhdGlvbiksXG4gICAgJ25vbmN1cnJlbnRWZXJzaW9uVHJhbnNpdGlvbnMnOiBvYmoubm9uY3VycmVudFZlcnNpb25UcmFuc2l0aW9ucz8ubWFwKHkgPT4gdG9Kc29uX0J1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc05vbmN1cnJlbnRWZXJzaW9uVHJhbnNpdGlvbnMoeSkpLFxuICAgICdwcmVmaXgnOiBvYmoucHJlZml4LFxuICAgICdzdGF0dXMnOiBvYmouc3RhdHVzLFxuICAgICd0cmFuc2l0aW9ucyc6IG9iai50cmFuc2l0aW9ucz8ubWFwKHkgPT4gdG9Kc29uX0J1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc1RyYW5zaXRpb25zKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBEZXNjcmliZXMgd2hlcmUgbG9ncyBhcmUgc3RvcmVkIGFuZCB0aGUgcHJlZml4IHRoYXQgQW1hem9uIFMzIGFzc2lnbnMgdG8gYWxsIGxvZyBvYmplY3Qga2V5cyBmb3IgYSBidWNrZXQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgUFVUIEJ1Y2tldCBsb2dnaW5nIChodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L0FQSS9SRVNUQnVja2V0UFVUbG9nZ2luZy5odG1sKSBpbiB0aGUgQW1hem9uIFMzIEFQSSBSZWZlcmVuY2UuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjTG9nZ2luZ0xvZ2dpbmdFbmFibGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY0xvZ2dpbmdMb2dnaW5nRW5hYmxlZCB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMb2dnaW5nTG9nZ2luZ0VuYWJsZWQjdGFyZ2V0QnVja2V0XG4gICAqL1xuICByZWFkb25seSB0YXJnZXRCdWNrZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0xvZ2dpbmdMb2dnaW5nRW5hYmxlZCN0YXJnZXRHcmFudHNcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEdyYW50cz86IEJ1Y2tldFNwZWNMb2dnaW5nTG9nZ2luZ0VuYWJsZWRUYXJnZXRHcmFudHNbXTtcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTG9nZ2luZ0xvZ2dpbmdFbmFibGVkI3RhcmdldFByZWZpeFxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UHJlZml4Pzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNMb2dnaW5nTG9nZ2luZ0VuYWJsZWQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNMb2dnaW5nTG9nZ2luZ0VuYWJsZWQob2JqOiBCdWNrZXRTcGVjTG9nZ2luZ0xvZ2dpbmdFbmFibGVkIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAndGFyZ2V0QnVja2V0Jzogb2JqLnRhcmdldEJ1Y2tldCxcbiAgICAndGFyZ2V0R3JhbnRzJzogb2JqLnRhcmdldEdyYW50cz8ubWFwKHkgPT4gdG9Kc29uX0J1Y2tldFNwZWNMb2dnaW5nTG9nZ2luZ0VuYWJsZWRUYXJnZXRHcmFudHMoeSkpLFxuICAgICd0YXJnZXRQcmVmaXgnOiBvYmoudGFyZ2V0UHJlZml4LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNwZWNpZmllcyBhIG1ldHJpY3MgY29uZmlndXJhdGlvbiBmaWx0ZXIuIFRoZSBtZXRyaWNzIGNvbmZpZ3VyYXRpb24gb25seSBpbmNsdWRlcyBvYmplY3RzIHRoYXQgbWVldCB0aGUgZmlsdGVyJ3MgY3JpdGVyaWEuIEEgZmlsdGVyIG11c3QgYmUgYSBwcmVmaXgsIGFuIG9iamVjdCB0YWcsIGFuIGFjY2VzcyBwb2ludCBBUk4sIG9yIGEgY29uanVuY3Rpb24gKE1ldHJpY3NBbmRPcGVyYXRvcikuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgUHV0QnVja2V0TWV0cmljc0NvbmZpZ3VyYXRpb24gKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvQVBJL0FQSV9QdXRCdWNrZXRNZXRyaWNzQ29uZmlndXJhdGlvbi5odG1sKS5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNNZXRyaWNzRmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY01ldHJpY3NGaWx0ZXIge1xuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTWV0cmljc0ZpbHRlciNhY2Nlc3NQb2ludEFSTlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXNzUG9pbnRBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgY29uanVuY3Rpb24gKGxvZ2ljYWwgQU5EKSBvZiBwcmVkaWNhdGVzLCB3aGljaCBpcyB1c2VkIGluIGV2YWx1YXRpbmcgYSBtZXRyaWNzIGZpbHRlci4gVGhlIG9wZXJhdG9yIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gcHJlZGljYXRlcywgYW5kIGFuIG9iamVjdCBtdXN0IG1hdGNoIGFsbCBvZiB0aGUgcHJlZGljYXRlcyBpbiBvcmRlciBmb3IgdGhlIGZpbHRlciB0byBhcHBseS5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTWV0cmljc0ZpbHRlciNhbmRcbiAgICovXG4gIHJlYWRvbmx5IGFuZD86IEJ1Y2tldFNwZWNNZXRyaWNzRmlsdGVyQW5kO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNNZXRyaWNzRmlsdGVyI3ByZWZpeFxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRhaW5lciBvZiBhIGtleSB2YWx1ZSBuYW1lIHBhaXIuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY01ldHJpY3NGaWx0ZXIjdGFnXG4gICAqL1xuICByZWFkb25seSB0YWc/OiBCdWNrZXRTcGVjTWV0cmljc0ZpbHRlclRhZztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjTWV0cmljc0ZpbHRlcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY01ldHJpY3NGaWx0ZXIob2JqOiBCdWNrZXRTcGVjTWV0cmljc0ZpbHRlciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FjY2Vzc1BvaW50QVJOJzogb2JqLmFjY2Vzc1BvaW50QXJuLFxuICAgICdhbmQnOiB0b0pzb25fQnVja2V0U3BlY01ldHJpY3NGaWx0ZXJBbmQob2JqLmFuZCksXG4gICAgJ3ByZWZpeCc6IG9iai5wcmVmaXgsXG4gICAgJ3RhZyc6IHRvSnNvbl9CdWNrZXRTcGVjTWV0cmljc0ZpbHRlclRhZyhvYmoudGFnKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGNvbnRhaW5lciBmb3Igc3BlY2lmeWluZyB0aGUgY29uZmlndXJhdGlvbiBmb3IgTGFtYmRhIG5vdGlmaWNhdGlvbnMuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjTm90aWZpY2F0aW9uTGFtYmRhRnVuY3Rpb25Db25maWd1cmF0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNOb3RpZmljYXRpb25MYW1iZGFGdW5jdGlvbkNvbmZpZ3VyYXRpb25zIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY05vdGlmaWNhdGlvbkxhbWJkYUZ1bmN0aW9uQ29uZmlndXJhdGlvbnMjZXZlbnRzXG4gICAqL1xuICByZWFkb25seSBldmVudHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIG9iamVjdCBrZXkgbmFtZSBmaWx0ZXJpbmcgcnVsZXMuIEZvciBpbmZvcm1hdGlvbiBhYm91dCBrZXkgbmFtZSBmaWx0ZXJpbmcsIHNlZSBDb25maWd1cmluZyBFdmVudCBOb3RpZmljYXRpb25zIChodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9Ob3RpZmljYXRpb25Ib3dUby5odG1sKSBpbiB0aGUgQW1hem9uIFMzIFVzZXIgR3VpZGUuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY05vdGlmaWNhdGlvbkxhbWJkYUZ1bmN0aW9uQ29uZmlndXJhdGlvbnMjZmlsdGVyXG4gICAqL1xuICByZWFkb25seSBmaWx0ZXI/OiBCdWNrZXRTcGVjTm90aWZpY2F0aW9uTGFtYmRhRnVuY3Rpb25Db25maWd1cmF0aW9uc0ZpbHRlcjtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGNvbmZpZ3VyYXRpb25zIGluIGEgbm90aWZpY2F0aW9uIGNvbmZpZ3VyYXRpb24uIElmIHlvdSBkb24ndCBwcm92aWRlIG9uZSwgQW1hem9uIFMzIHdpbGwgYXNzaWduIGFuIElELlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNOb3RpZmljYXRpb25MYW1iZGFGdW5jdGlvbkNvbmZpZ3VyYXRpb25zI2lkXG4gICAqL1xuICByZWFkb25seSBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTm90aWZpY2F0aW9uTGFtYmRhRnVuY3Rpb25Db25maWd1cmF0aW9ucyNsYW1iZGFGdW5jdGlvbkFSTlxuICAgKi9cbiAgcmVhZG9ubHkgbGFtYmRhRnVuY3Rpb25Bcm4/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY05vdGlmaWNhdGlvbkxhbWJkYUZ1bmN0aW9uQ29uZmlndXJhdGlvbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNOb3RpZmljYXRpb25MYW1iZGFGdW5jdGlvbkNvbmZpZ3VyYXRpb25zKG9iajogQnVja2V0U3BlY05vdGlmaWNhdGlvbkxhbWJkYUZ1bmN0aW9uQ29uZmlndXJhdGlvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdldmVudHMnOiBvYmouZXZlbnRzPy5tYXAoeSA9PiB5KSxcbiAgICAnZmlsdGVyJzogdG9Kc29uX0J1Y2tldFNwZWNOb3RpZmljYXRpb25MYW1iZGFGdW5jdGlvbkNvbmZpZ3VyYXRpb25zRmlsdGVyKG9iai5maWx0ZXIpLFxuICAgICdpZCc6IG9iai5pZCxcbiAgICAnbGFtYmRhRnVuY3Rpb25BUk4nOiBvYmoubGFtYmRhRnVuY3Rpb25Bcm4sXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBjb25maWd1cmF0aW9uIGZvciBwdWJsaXNoaW5nIG1lc3NhZ2VzIHRvIGFuIEFtYXpvbiBTaW1wbGUgUXVldWUgU2VydmljZSAoQW1hem9uIFNRUykgcXVldWUgd2hlbiBBbWF6b24gUzMgZGV0ZWN0cyBzcGVjaWZpZWQgZXZlbnRzLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY05vdGlmaWNhdGlvblF1ZXVlQ29uZmlndXJhdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjTm90aWZpY2F0aW9uUXVldWVDb25maWd1cmF0aW9ucyB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNOb3RpZmljYXRpb25RdWV1ZUNvbmZpZ3VyYXRpb25zI2V2ZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgZXZlbnRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBvYmplY3Qga2V5IG5hbWUgZmlsdGVyaW5nIHJ1bGVzLiBGb3IgaW5mb3JtYXRpb24gYWJvdXQga2V5IG5hbWUgZmlsdGVyaW5nLCBzZWUgQ29uZmlndXJpbmcgRXZlbnQgTm90aWZpY2F0aW9ucyAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvTm90aWZpY2F0aW9uSG93VG8uaHRtbCkgaW4gdGhlIEFtYXpvbiBTMyBVc2VyIEd1aWRlLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNOb3RpZmljYXRpb25RdWV1ZUNvbmZpZ3VyYXRpb25zI2ZpbHRlclxuICAgKi9cbiAgcmVhZG9ubHkgZmlsdGVyPzogQnVja2V0U3BlY05vdGlmaWNhdGlvblF1ZXVlQ29uZmlndXJhdGlvbnNGaWx0ZXI7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBjb25maWd1cmF0aW9ucyBpbiBhIG5vdGlmaWNhdGlvbiBjb25maWd1cmF0aW9uLiBJZiB5b3UgZG9uJ3QgcHJvdmlkZSBvbmUsIEFtYXpvbiBTMyB3aWxsIGFzc2lnbiBhbiBJRC5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTm90aWZpY2F0aW9uUXVldWVDb25maWd1cmF0aW9ucyNpZFxuICAgKi9cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY05vdGlmaWNhdGlvblF1ZXVlQ29uZmlndXJhdGlvbnMjcXVldWVBUk5cbiAgICovXG4gIHJlYWRvbmx5IHF1ZXVlQXJuPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNOb3RpZmljYXRpb25RdWV1ZUNvbmZpZ3VyYXRpb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjTm90aWZpY2F0aW9uUXVldWVDb25maWd1cmF0aW9ucyhvYmo6IEJ1Y2tldFNwZWNOb3RpZmljYXRpb25RdWV1ZUNvbmZpZ3VyYXRpb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZXZlbnRzJzogb2JqLmV2ZW50cz8ubWFwKHkgPT4geSksXG4gICAgJ2ZpbHRlcic6IHRvSnNvbl9CdWNrZXRTcGVjTm90aWZpY2F0aW9uUXVldWVDb25maWd1cmF0aW9uc0ZpbHRlcihvYmouZmlsdGVyKSxcbiAgICAnaWQnOiBvYmouaWQsXG4gICAgJ3F1ZXVlQVJOJzogb2JqLnF1ZXVlQXJuLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgY29udGFpbmVyIGZvciBzcGVjaWZ5aW5nIHRoZSBjb25maWd1cmF0aW9uIGZvciBwdWJsaWNhdGlvbiBvZiBtZXNzYWdlcyB0byBhbiBBbWF6b24gU2ltcGxlIE5vdGlmaWNhdGlvbiBTZXJ2aWNlIChBbWF6b24gU05TKSB0b3BpYyB3aGVuIEFtYXpvbiBTMyBkZXRlY3RzIHNwZWNpZmllZCBldmVudHMuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjTm90aWZpY2F0aW9uVG9waWNDb25maWd1cmF0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNOb3RpZmljYXRpb25Ub3BpY0NvbmZpZ3VyYXRpb25zIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY05vdGlmaWNhdGlvblRvcGljQ29uZmlndXJhdGlvbnMjZXZlbnRzXG4gICAqL1xuICByZWFkb25seSBldmVudHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIG9iamVjdCBrZXkgbmFtZSBmaWx0ZXJpbmcgcnVsZXMuIEZvciBpbmZvcm1hdGlvbiBhYm91dCBrZXkgbmFtZSBmaWx0ZXJpbmcsIHNlZSBDb25maWd1cmluZyBFdmVudCBOb3RpZmljYXRpb25zIChodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9Ob3RpZmljYXRpb25Ib3dUby5odG1sKSBpbiB0aGUgQW1hem9uIFMzIFVzZXIgR3VpZGUuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY05vdGlmaWNhdGlvblRvcGljQ29uZmlndXJhdGlvbnMjZmlsdGVyXG4gICAqL1xuICByZWFkb25seSBmaWx0ZXI/OiBCdWNrZXRTcGVjTm90aWZpY2F0aW9uVG9waWNDb25maWd1cmF0aW9uc0ZpbHRlcjtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGNvbmZpZ3VyYXRpb25zIGluIGEgbm90aWZpY2F0aW9uIGNvbmZpZ3VyYXRpb24uIElmIHlvdSBkb24ndCBwcm92aWRlIG9uZSwgQW1hem9uIFMzIHdpbGwgYXNzaWduIGFuIElELlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNOb3RpZmljYXRpb25Ub3BpY0NvbmZpZ3VyYXRpb25zI2lkXG4gICAqL1xuICByZWFkb25seSBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTm90aWZpY2F0aW9uVG9waWNDb25maWd1cmF0aW9ucyN0b3BpY0FSTlxuICAgKi9cbiAgcmVhZG9ubHkgdG9waWNBcm4/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY05vdGlmaWNhdGlvblRvcGljQ29uZmlndXJhdGlvbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNOb3RpZmljYXRpb25Ub3BpY0NvbmZpZ3VyYXRpb25zKG9iajogQnVja2V0U3BlY05vdGlmaWNhdGlvblRvcGljQ29uZmlndXJhdGlvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdldmVudHMnOiBvYmouZXZlbnRzPy5tYXAoeSA9PiB5KSxcbiAgICAnZmlsdGVyJzogdG9Kc29uX0J1Y2tldFNwZWNOb3RpZmljYXRpb25Ub3BpY0NvbmZpZ3VyYXRpb25zRmlsdGVyKG9iai5maWx0ZXIpLFxuICAgICdpZCc6IG9iai5pZCxcbiAgICAndG9waWNBUk4nOiBvYmoudG9waWNBcm4sXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogVGhlIGNvbnRhaW5lciBlbGVtZW50IGZvciBhbiBvd25lcnNoaXAgY29udHJvbCBydWxlLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY093bmVyc2hpcENvbnRyb2xzUnVsZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjT3duZXJzaGlwQ29udHJvbHNSdWxlcyB7XG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVyIGVsZW1lbnQgZm9yIG9iamVjdCBvd25lcnNoaXAgZm9yIGEgYnVja2V0J3Mgb3duZXJzaGlwIGNvbnRyb2xzLlxuICAgKiBCdWNrZXRPd25lclByZWZlcnJlZCAtIE9iamVjdHMgdXBsb2FkZWQgdG8gdGhlIGJ1Y2tldCBjaGFuZ2Ugb3duZXJzaGlwIHRvIHRoZSBidWNrZXQgb3duZXIgaWYgdGhlIG9iamVjdHMgYXJlIHVwbG9hZGVkIHdpdGggdGhlIGJ1Y2tldC1vd25lci1mdWxsLWNvbnRyb2wgY2FubmVkIEFDTC5cbiAgICogT2JqZWN0V3JpdGVyIC0gVGhlIHVwbG9hZGluZyBhY2NvdW50IHdpbGwgb3duIHRoZSBvYmplY3QgaWYgdGhlIG9iamVjdCBpcyB1cGxvYWRlZCB3aXRoIHRoZSBidWNrZXQtb3duZXItZnVsbC1jb250cm9sIGNhbm5lZCBBQ0wuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY093bmVyc2hpcENvbnRyb2xzUnVsZXMjb2JqZWN0T3duZXJzaGlwXG4gICAqL1xuICByZWFkb25seSBvYmplY3RPd25lcnNoaXA/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY093bmVyc2hpcENvbnRyb2xzUnVsZXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNPd25lcnNoaXBDb250cm9sc1J1bGVzKG9iajogQnVja2V0U3BlY093bmVyc2hpcENvbnRyb2xzUnVsZXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdvYmplY3RPd25lcnNoaXAnOiBvYmoub2JqZWN0T3duZXJzaGlwLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNwZWNpZmllcyB3aGljaCBBbWF6b24gUzMgb2JqZWN0cyB0byByZXBsaWNhdGUgYW5kIHdoZXJlIHRvIHN0b3JlIHRoZSByZXBsaWNhcy5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXMge1xuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgQW1hem9uIFMzIHJlcGxpY2F0ZXMgZGVsZXRlIG1hcmtlcnMuIElmIHlvdSBzcGVjaWZ5IGEgRmlsdGVyIGluIHlvdXIgcmVwbGljYXRpb24gY29uZmlndXJhdGlvbiwgeW91IG11c3QgYWxzbyBpbmNsdWRlIGEgRGVsZXRlTWFya2VyUmVwbGljYXRpb24gZWxlbWVudC4gSWYgeW91ciBGaWx0ZXIgaW5jbHVkZXMgYSBUYWcgZWxlbWVudCwgdGhlIERlbGV0ZU1hcmtlclJlcGxpY2F0aW9uIFN0YXR1cyBtdXN0IGJlIHNldCB0byBEaXNhYmxlZCwgYmVjYXVzZSBBbWF6b24gUzMgZG9lcyBub3Qgc3VwcG9ydCByZXBsaWNhdGluZyBkZWxldGUgbWFya2VycyBmb3IgdGFnLWJhc2VkIHJ1bGVzLiBGb3IgYW4gZXhhbXBsZSBjb25maWd1cmF0aW9uLCBzZWUgQmFzaWMgUnVsZSBDb25maWd1cmF0aW9uIChodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9yZXBsaWNhdGlvbi1hZGQtY29uZmlnLmh0bWwjcmVwbGljYXRpb24tY29uZmlnLW1pbi1ydWxlLWNvbmZpZykuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGRlbGV0ZSBtYXJrZXIgcmVwbGljYXRpb24sIHNlZSBCYXNpYyBSdWxlIENvbmZpZ3VyYXRpb24gKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L2RlbGV0ZS1tYXJrZXItcmVwbGljYXRpb24uaHRtbCkuXG4gICAqIElmIHlvdSBhcmUgdXNpbmcgYW4gZWFybGllciB2ZXJzaW9uIG9mIHRoZSByZXBsaWNhdGlvbiBjb25maWd1cmF0aW9uLCBBbWF6b24gUzMgaGFuZGxlcyByZXBsaWNhdGlvbiBvZiBkZWxldGUgbWFya2VycyBkaWZmZXJlbnRseS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBCYWNrd2FyZCBDb21wYXRpYmlsaXR5IChodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9yZXBsaWNhdGlvbi1hZGQtY29uZmlnLmh0bWwjcmVwbGljYXRpb24tYmFja3dhcmQtY29tcGF0LWNvbnNpZGVyYXRpb25zKS5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlcyNkZWxldGVNYXJrZXJSZXBsaWNhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVsZXRlTWFya2VyUmVwbGljYXRpb24/OiBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0RlbGV0ZU1hcmtlclJlcGxpY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgd2hlcmUgdG8gcHVibGlzaCBhbmFseXNpcyBvciBjb25maWd1cmF0aW9uIHJlc3VsdHMgZm9yIGFuIEFtYXpvbiBTMyBidWNrZXQgYW5kIFMzIFJlcGxpY2F0aW9uIFRpbWUgQ29udHJvbCAoUzMgUlRDKS5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlcyNkZXN0aW5hdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb24/OiBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjb25maWd1cmF0aW9uIHRvIHJlcGxpY2F0ZSBleGlzdGluZyBzb3VyY2UgYnVja2V0IG9iamVjdHMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgUmVwbGljYXRpbmcgRXhpc3RpbmcgT2JqZWN0cyAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvcmVwbGljYXRpb24td2hhdC1pcy1pc25vdC1yZXBsaWNhdGVkLmh0bWwjZXhpc3Rpbmctb2JqZWN0LXJlcGxpY2F0aW9uKSBpbiB0aGUgQW1hem9uIFMzIFVzZXIgR3VpZGUuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXMjZXhpc3RpbmdPYmplY3RSZXBsaWNhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZXhpc3RpbmdPYmplY3RSZXBsaWNhdGlvbj86IEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRXhpc3RpbmdPYmplY3RSZXBsaWNhdGlvbjtcblxuICAvKipcbiAgICogQSBmaWx0ZXIgdGhhdCBpZGVudGlmaWVzIHRoZSBzdWJzZXQgb2Ygb2JqZWN0cyB0byB3aGljaCB0aGUgcmVwbGljYXRpb24gcnVsZSBhcHBsaWVzLiBBIEZpbHRlciBtdXN0IHNwZWNpZnkgZXhhY3RseSBvbmUgUHJlZml4LCBUYWcsIG9yIGFuIEFuZCBjaGlsZCBlbGVtZW50LlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzI2ZpbHRlclxuICAgKi9cbiAgcmVhZG9ubHkgZmlsdGVyPzogQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNGaWx0ZXI7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXMjaWRcbiAgICovXG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzI3ByZWZpeFxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzI3ByaW9yaXR5XG4gICAqL1xuICByZWFkb25seSBwcmlvcml0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogQSBjb250YWluZXIgdGhhdCBkZXNjcmliZXMgYWRkaXRpb25hbCBmaWx0ZXJzIGZvciBpZGVudGlmeWluZyB0aGUgc291cmNlIG9iamVjdHMgdGhhdCB5b3Ugd2FudCB0byByZXBsaWNhdGUuIFlvdSBjYW4gY2hvb3NlIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSByZXBsaWNhdGlvbiBvZiB0aGVzZSBvYmplY3RzLiBDdXJyZW50bHksIEFtYXpvbiBTMyBzdXBwb3J0cyBvbmx5IHRoZSBmaWx0ZXIgdGhhdCB5b3UgY2FuIHNwZWNpZnkgZm9yIG9iamVjdHMgY3JlYXRlZCB3aXRoIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gdXNpbmcgYSBjdXN0b21lciBtYW5hZ2VkIGtleSBzdG9yZWQgaW4gQW1hem9uIFdlYiBTZXJ2aWNlcyBLZXkgTWFuYWdlbWVudCBTZXJ2aWNlIChTU0UtS01TKS5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlcyNzb3VyY2VTZWxlY3Rpb25Dcml0ZXJpYVxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlU2VsZWN0aW9uQ3JpdGVyaWE/OiBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc1NvdXJjZVNlbGVjdGlvbkNyaXRlcmlhO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzI3N0YXR1c1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlcyhvYmo6IEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZGVsZXRlTWFya2VyUmVwbGljYXRpb24nOiB0b0pzb25fQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZWxldGVNYXJrZXJSZXBsaWNhdGlvbihvYmouZGVsZXRlTWFya2VyUmVwbGljYXRpb24pLFxuICAgICdkZXN0aW5hdGlvbic6IHRvSnNvbl9CdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uKG9iai5kZXN0aW5hdGlvbiksXG4gICAgJ2V4aXN0aW5nT2JqZWN0UmVwbGljYXRpb24nOiB0b0pzb25fQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNFeGlzdGluZ09iamVjdFJlcGxpY2F0aW9uKG9iai5leGlzdGluZ09iamVjdFJlcGxpY2F0aW9uKSxcbiAgICAnZmlsdGVyJzogdG9Kc29uX0J1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRmlsdGVyKG9iai5maWx0ZXIpLFxuICAgICdpZCc6IG9iai5pZCxcbiAgICAncHJlZml4Jzogb2JqLnByZWZpeCxcbiAgICAncHJpb3JpdHknOiBvYmoucHJpb3JpdHksXG4gICAgJ3NvdXJjZVNlbGVjdGlvbkNyaXRlcmlhJzogdG9Kc29uX0J1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzU291cmNlU2VsZWN0aW9uQ3JpdGVyaWEob2JqLnNvdXJjZVNlbGVjdGlvbkNyaXRlcmlhKSxcbiAgICAnc3RhdHVzJzogb2JqLnN0YXR1cyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGNvbnRhaW5lciBvZiBhIGtleSB2YWx1ZSBuYW1lIHBhaXIuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjVGFnZ2luZ1RhZ1NldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNUYWdnaW5nVGFnU2V0IHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1RhZ2dpbmdUYWdTZXQja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1RhZ2dpbmdUYWdTZXQjdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNUYWdnaW5nVGFnU2V0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjVGFnZ2luZ1RhZ1NldChvYmo6IEJ1Y2tldFNwZWNUYWdnaW5nVGFnU2V0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAndmFsdWUnOiBvYmoudmFsdWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogVGhlIGVycm9yIGluZm9ybWF0aW9uLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY1dlYnNpdGVFcnJvckRvY3VtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY1dlYnNpdGVFcnJvckRvY3VtZW50IHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1dlYnNpdGVFcnJvckRvY3VtZW50I2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5Pzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNXZWJzaXRlRXJyb3JEb2N1bWVudCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY1dlYnNpdGVFcnJvckRvY3VtZW50KG9iajogQnVja2V0U3BlY1dlYnNpdGVFcnJvckRvY3VtZW50IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBDb250YWluZXIgZm9yIHRoZSBTdWZmaXggZWxlbWVudC5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNXZWJzaXRlSW5kZXhEb2N1bWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNXZWJzaXRlSW5kZXhEb2N1bWVudCB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNXZWJzaXRlSW5kZXhEb2N1bWVudCNzdWZmaXhcbiAgICovXG4gIHJlYWRvbmx5IHN1ZmZpeD86IHN0cmluZztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjV2Vic2l0ZUluZGV4RG9jdW1lbnQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNXZWJzaXRlSW5kZXhEb2N1bWVudChvYmo6IEJ1Y2tldFNwZWNXZWJzaXRlSW5kZXhEb2N1bWVudCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3N1ZmZpeCc6IG9iai5zdWZmaXgsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSByZWRpcmVjdCBiZWhhdmlvciBvZiBhbGwgcmVxdWVzdHMgdG8gYSB3ZWJzaXRlIGVuZHBvaW50IG9mIGFuIEFtYXpvbiBTMyBidWNrZXQuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjV2Vic2l0ZVJlZGlyZWN0QWxsUmVxdWVzdHNUb1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNXZWJzaXRlUmVkaXJlY3RBbGxSZXF1ZXN0c1RvIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1dlYnNpdGVSZWRpcmVjdEFsbFJlcXVlc3RzVG8jaG9zdE5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGhvc3ROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNXZWJzaXRlUmVkaXJlY3RBbGxSZXF1ZXN0c1RvI3Byb3RvY29sXG4gICAqL1xuICByZWFkb25seSBwcm90b2NvbD86IHN0cmluZztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjV2Vic2l0ZVJlZGlyZWN0QWxsUmVxdWVzdHNUbycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY1dlYnNpdGVSZWRpcmVjdEFsbFJlcXVlc3RzVG8ob2JqOiBCdWNrZXRTcGVjV2Vic2l0ZVJlZGlyZWN0QWxsUmVxdWVzdHNUbyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2hvc3ROYW1lJzogb2JqLmhvc3ROYW1lLFxuICAgICdwcm90b2NvbCc6IG9iai5wcm90b2NvbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIHJlZGlyZWN0IGJlaGF2aW9yIGFuZCB3aGVuIGEgcmVkaXJlY3QgaXMgYXBwbGllZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcm91dGluZyBydWxlcywgc2VlIENvbmZpZ3VyaW5nIGFkdmFuY2VkIGNvbmRpdGlvbmFsIHJlZGlyZWN0cyAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvaG93LXRvLXBhZ2UtcmVkaXJlY3QuaHRtbCNhZHZhbmNlZC1jb25kaXRpb25hbC1yZWRpcmVjdHMpIGluIHRoZSBBbWF6b24gUzMgVXNlciBHdWlkZS5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNXZWJzaXRlUm91dGluZ1J1bGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY1dlYnNpdGVSb3V0aW5nUnVsZXMge1xuICAvKipcbiAgICogQSBjb250YWluZXIgZm9yIGRlc2NyaWJpbmcgYSBjb25kaXRpb24gdGhhdCBtdXN0IGJlIG1ldCBmb3IgdGhlIHNwZWNpZmllZCByZWRpcmVjdCB0byBhcHBseS4gRm9yIGV4YW1wbGUsIDEuIElmIHJlcXVlc3QgaXMgZm9yIHBhZ2VzIGluIHRoZSAvZG9jcyBmb2xkZXIsIHJlZGlyZWN0IHRvIHRoZSAvZG9jdW1lbnRzIGZvbGRlci4gMi4gSWYgcmVxdWVzdCByZXN1bHRzIGluIEhUVFAgZXJyb3IgNHh4LCByZWRpcmVjdCByZXF1ZXN0IHRvIGFub3RoZXIgaG9zdCB3aGVyZSB5b3UgbWlnaHQgcHJvY2VzcyB0aGUgZXJyb3IuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1dlYnNpdGVSb3V0aW5nUnVsZXMjY29uZGl0aW9uXG4gICAqL1xuICByZWFkb25seSBjb25kaXRpb24/OiBCdWNrZXRTcGVjV2Vic2l0ZVJvdXRpbmdSdWxlc0NvbmRpdGlvbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGhvdyByZXF1ZXN0cyBhcmUgcmVkaXJlY3RlZC4gSW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yLCB5b3UgY2FuIHNwZWNpZnkgYSBkaWZmZXJlbnQgZXJyb3IgY29kZSB0byByZXR1cm4uXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1dlYnNpdGVSb3V0aW5nUnVsZXMjcmVkaXJlY3RcbiAgICovXG4gIHJlYWRvbmx5IHJlZGlyZWN0PzogQnVja2V0U3BlY1dlYnNpdGVSb3V0aW5nUnVsZXNSZWRpcmVjdDtcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjV2Vic2l0ZVJvdXRpbmdSdWxlcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY1dlYnNpdGVSb3V0aW5nUnVsZXMob2JqOiBCdWNrZXRTcGVjV2Vic2l0ZVJvdXRpbmdSdWxlcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2NvbmRpdGlvbic6IHRvSnNvbl9CdWNrZXRTcGVjV2Vic2l0ZVJvdXRpbmdSdWxlc0NvbmRpdGlvbihvYmouY29uZGl0aW9uKSxcbiAgICAncmVkaXJlY3QnOiB0b0pzb25fQnVja2V0U3BlY1dlYnNpdGVSb3V0aW5nUnVsZXNSZWRpcmVjdChvYmoucmVkaXJlY3QpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgY29uanVuY3Rpb24gKGxvZ2ljYWwgQU5EKSBvZiBwcmVkaWNhdGVzLCB3aGljaCBpcyB1c2VkIGluIGV2YWx1YXRpbmcgYSBtZXRyaWNzIGZpbHRlci4gVGhlIG9wZXJhdG9yIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gcHJlZGljYXRlcyBpbiBhbnkgY29tYmluYXRpb24sIGFuZCBhbiBvYmplY3QgbXVzdCBtYXRjaCBhbGwgb2YgdGhlIHByZWRpY2F0ZXMgZm9yIHRoZSBmaWx0ZXIgdG8gYXBwbHkuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjQW5hbHl0aWNzRmlsdGVyQW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY0FuYWx5dGljc0ZpbHRlckFuZCB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNBbmFseXRpY3NGaWx0ZXJBbmQjcHJlZml4XG4gICAqL1xuICByZWFkb25seSBwcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0FuYWx5dGljc0ZpbHRlckFuZCN0YWdzXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogQnVja2V0U3BlY0FuYWx5dGljc0ZpbHRlckFuZFRhZ3NbXTtcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjQW5hbHl0aWNzRmlsdGVyQW5kJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjQW5hbHl0aWNzRmlsdGVyQW5kKG9iajogQnVja2V0U3BlY0FuYWx5dGljc0ZpbHRlckFuZCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3ByZWZpeCc6IG9iai5wcmVmaXgsXG4gICAgJ3RhZ3MnOiBvYmoudGFncz8ubWFwKHkgPT4gdG9Kc29uX0J1Y2tldFNwZWNBbmFseXRpY3NGaWx0ZXJBbmRUYWdzKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGNvbnRhaW5lciBvZiBhIGtleSB2YWx1ZSBuYW1lIHBhaXIuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjQW5hbHl0aWNzRmlsdGVyVGFnXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY0FuYWx5dGljc0ZpbHRlclRhZyB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNBbmFseXRpY3NGaWx0ZXJUYWcja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0FuYWx5dGljc0ZpbHRlclRhZyN2YWx1ZVxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY0FuYWx5dGljc0ZpbHRlclRhZycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY0FuYWx5dGljc0ZpbHRlclRhZyhvYmo6IEJ1Y2tldFNwZWNBbmFseXRpY3NGaWx0ZXJUYWcgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICd2YWx1ZSc6IG9iai52YWx1ZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBDb250YWluZXIgZm9yIGRhdGEgcmVsYXRlZCB0byB0aGUgc3RvcmFnZSBjbGFzcyBhbmFseXNpcyBmb3IgYW4gQW1hem9uIFMzIGJ1Y2tldCBmb3IgZXhwb3J0LlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY0FuYWx5dGljc1N0b3JhZ2VDbGFzc0FuYWx5c2lzRGF0YUV4cG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNBbmFseXRpY3NTdG9yYWdlQ2xhc3NBbmFseXNpc0RhdGFFeHBvcnQge1xuICAvKipcbiAgICogV2hlcmUgdG8gcHVibGlzaCB0aGUgYW5hbHl0aWNzIHJlc3VsdHMuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0FuYWx5dGljc1N0b3JhZ2VDbGFzc0FuYWx5c2lzRGF0YUV4cG9ydCNkZXN0aW5hdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb24/OiBCdWNrZXRTcGVjQW5hbHl0aWNzU3RvcmFnZUNsYXNzQW5hbHlzaXNEYXRhRXhwb3J0RGVzdGluYXRpb247XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0FuYWx5dGljc1N0b3JhZ2VDbGFzc0FuYWx5c2lzRGF0YUV4cG9ydCNvdXRwdXRTY2hlbWFWZXJzaW9uXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRTY2hlbWFWZXJzaW9uPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNBbmFseXRpY3NTdG9yYWdlQ2xhc3NBbmFseXNpc0RhdGFFeHBvcnQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNBbmFseXRpY3NTdG9yYWdlQ2xhc3NBbmFseXNpc0RhdGFFeHBvcnQob2JqOiBCdWNrZXRTcGVjQW5hbHl0aWNzU3RvcmFnZUNsYXNzQW5hbHlzaXNEYXRhRXhwb3J0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZGVzdGluYXRpb24nOiB0b0pzb25fQnVja2V0U3BlY0FuYWx5dGljc1N0b3JhZ2VDbGFzc0FuYWx5c2lzRGF0YUV4cG9ydERlc3RpbmF0aW9uKG9iai5kZXN0aW5hdGlvbiksXG4gICAgJ291dHB1dFNjaGVtYVZlcnNpb24nOiBvYmoub3V0cHV0U2NoZW1hVmVyc2lvbixcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGRlZmF1bHQgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB0byBhcHBseSB0byBuZXcgb2JqZWN0cyBpbiB0aGUgYnVja2V0LiBJZiBhIFBVVCBPYmplY3QgcmVxdWVzdCBkb2Vzbid0IHNwZWNpZnkgYW55IHNlcnZlci1zaWRlIGVuY3J5cHRpb24sIHRoaXMgZGVmYXVsdCBlbmNyeXB0aW9uIHdpbGwgYmUgYXBwbGllZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBQVVQgQnVja2V0IGVuY3J5cHRpb24gKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvQVBJL1JFU1RCdWNrZXRQVVRlbmNyeXB0aW9uLmh0bWwpIGluIHRoZSBBbWF6b24gUzMgQVBJIFJlZmVyZW5jZS5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNFbmNyeXB0aW9uUnVsZXNBcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY0VuY3J5cHRpb25SdWxlc0FwcGx5U2VydmVyU2lkZUVuY3J5cHRpb25CeURlZmF1bHQge1xuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjRW5jcnlwdGlvblJ1bGVzQXBwbHlTZXJ2ZXJTaWRlRW5jcnlwdGlvbkJ5RGVmYXVsdCNrbXNNYXN0ZXJLZXlJRFxuICAgKi9cbiAgcmVhZG9ubHkga21zTWFzdGVyS2V5SWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0VuY3J5cHRpb25SdWxlc0FwcGx5U2VydmVyU2lkZUVuY3J5cHRpb25CeURlZmF1bHQjc3NlQWxnb3JpdGhtXG4gICAqL1xuICByZWFkb25seSBzc2VBbGdvcml0aG0/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY0VuY3J5cHRpb25SdWxlc0FwcGx5U2VydmVyU2lkZUVuY3J5cHRpb25CeURlZmF1bHQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNFbmNyeXB0aW9uUnVsZXNBcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0KG9iajogQnVja2V0U3BlY0VuY3J5cHRpb25SdWxlc0FwcGx5U2VydmVyU2lkZUVuY3J5cHRpb25CeURlZmF1bHQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrbXNNYXN0ZXJLZXlJRCc6IG9iai5rbXNNYXN0ZXJLZXlJZCxcbiAgICAnc3NlQWxnb3JpdGhtJzogb2JqLnNzZUFsZ29yaXRobSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGNvbnRhaW5lciBmb3Igc3BlY2lmeWluZyBTMyBJbnRlbGxpZ2VudC1UaWVyaW5nIGZpbHRlcnMuIFRoZSBmaWx0ZXJzIGRldGVybWluZSB0aGUgc3Vic2V0IG9mIG9iamVjdHMgdG8gd2hpY2ggdGhlIHJ1bGUgYXBwbGllcy5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdGaWx0ZXJBbmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nRmlsdGVyQW5kIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0ludGVsbGlnZW50VGllcmluZ0ZpbHRlckFuZCNwcmVmaXhcbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nRmlsdGVyQW5kI3RhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiBCdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nRmlsdGVyQW5kVGFnc1tdO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdGaWx0ZXJBbmQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdGaWx0ZXJBbmQob2JqOiBCdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nRmlsdGVyQW5kIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncHJlZml4Jzogb2JqLnByZWZpeCxcbiAgICAndGFncyc6IG9iai50YWdzPy5tYXAoeSA9PiB0b0pzb25fQnVja2V0U3BlY0ludGVsbGlnZW50VGllcmluZ0ZpbHRlckFuZFRhZ3MoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgY29udGFpbmVyIG9mIGEga2V5IHZhbHVlIG5hbWUgcGFpci5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdGaWx0ZXJUYWdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nRmlsdGVyVGFnIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0ludGVsbGlnZW50VGllcmluZ0ZpbHRlclRhZyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleT86IHN0cmluZztcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nRmlsdGVyVGFnI3ZhbHVlXG4gICAqL1xuICByZWFkb25seSB2YWx1ZT86IHN0cmluZztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nRmlsdGVyVGFnJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nRmlsdGVyVGFnKG9iajogQnVja2V0U3BlY0ludGVsbGlnZW50VGllcmluZ0ZpbHRlclRhZyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ3ZhbHVlJzogb2JqLnZhbHVlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBidWNrZXQgbmFtZSwgZmlsZSBmb3JtYXQsIGJ1Y2tldCBvd25lciAob3B0aW9uYWwpLCBhbmQgcHJlZml4IChvcHRpb25hbCkgd2hlcmUgaW52ZW50b3J5IHJlc3VsdHMgYXJlIHB1Ymxpc2hlZC5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNJbnZlbnRvcnlEZXN0aW5hdGlvblMzQnVja2V0RGVzdGluYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjSW52ZW50b3J5RGVzdGluYXRpb25TM0J1Y2tldERlc3RpbmF0aW9uIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0ludmVudG9yeURlc3RpbmF0aW9uUzNCdWNrZXREZXN0aW5hdGlvbiNhY2NvdW50SURcbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnRJZD86IHN0cmluZztcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjSW52ZW50b3J5RGVzdGluYXRpb25TM0J1Y2tldERlc3RpbmF0aW9uI2J1Y2tldFxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb250YWlucyB0aGUgdHlwZSBvZiBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIHVzZWQgdG8gZW5jcnlwdCB0aGUgaW52ZW50b3J5IHJlc3VsdHMuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0ludmVudG9yeURlc3RpbmF0aW9uUzNCdWNrZXREZXN0aW5hdGlvbiNlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uPzogQnVja2V0U3BlY0ludmVudG9yeURlc3RpbmF0aW9uUzNCdWNrZXREZXN0aW5hdGlvbkVuY3J5cHRpb247XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0ludmVudG9yeURlc3RpbmF0aW9uUzNCdWNrZXREZXN0aW5hdGlvbiNmb3JtYXRcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdD86IHN0cmluZztcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjSW52ZW50b3J5RGVzdGluYXRpb25TM0J1Y2tldERlc3RpbmF0aW9uI3ByZWZpeFxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4Pzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNJbnZlbnRvcnlEZXN0aW5hdGlvblMzQnVja2V0RGVzdGluYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNJbnZlbnRvcnlEZXN0aW5hdGlvblMzQnVja2V0RGVzdGluYXRpb24ob2JqOiBCdWNrZXRTcGVjSW52ZW50b3J5RGVzdGluYXRpb25TM0J1Y2tldERlc3RpbmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWNjb3VudElEJzogb2JqLmFjY291bnRJZCxcbiAgICAnYnVja2V0Jzogb2JqLmJ1Y2tldCxcbiAgICAnZW5jcnlwdGlvbic6IHRvSnNvbl9CdWNrZXRTcGVjSW52ZW50b3J5RGVzdGluYXRpb25TM0J1Y2tldERlc3RpbmF0aW9uRW5jcnlwdGlvbihvYmouZW5jcnlwdGlvbiksXG4gICAgJ2Zvcm1hdCc6IG9iai5mb3JtYXQsXG4gICAgJ3ByZWZpeCc6IG9iai5wcmVmaXgsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBkYXlzIHNpbmNlIHRoZSBpbml0aWF0aW9uIG9mIGFuIGluY29tcGxldGUgbXVsdGlwYXJ0IHVwbG9hZCB0aGF0IEFtYXpvbiBTMyB3aWxsIHdhaXQgYmVmb3JlIHBlcm1hbmVudGx5IHJlbW92aW5nIGFsbCBwYXJ0cyBvZiB0aGUgdXBsb2FkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIEFib3J0aW5nIEluY29tcGxldGUgTXVsdGlwYXJ0IFVwbG9hZHMgVXNpbmcgYSBCdWNrZXQgTGlmZWN5Y2xlIFBvbGljeSAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvbXB1b3ZlcnZpZXcuaHRtbCNtcHUtYWJvcnQtaW5jb21wbGV0ZS1tcHUtbGlmZWN5Y2xlLWNvbmZpZykgaW4gdGhlIEFtYXpvbiBTMyBVc2VyIEd1aWRlLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzQWJvcnRJbmNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzQWJvcnRJbmNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzQWJvcnRJbmNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkI2RheXNBZnRlckluaXRpYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRheXNBZnRlckluaXRpYXRpb24/OiBudW1iZXI7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzQWJvcnRJbmNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNBYm9ydEluY29tcGxldGVNdWx0aXBhcnRVcGxvYWQob2JqOiBCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNBYm9ydEluY29tcGxldGVNdWx0aXBhcnRVcGxvYWQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdkYXlzQWZ0ZXJJbml0aWF0aW9uJzogb2JqLmRheXNBZnRlckluaXRpYXRpb24sXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogQ29udGFpbmVyIGZvciB0aGUgZXhwaXJhdGlvbiBmb3IgdGhlIGxpZmVjeWNsZSBvZiB0aGUgb2JqZWN0LlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzRXhwaXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0V4cGlyYXRpb24ge1xuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNFeHBpcmF0aW9uI2RhdGVcbiAgICovXG4gIHJlYWRvbmx5IGRhdGU/OiBEYXRlO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0V4cGlyYXRpb24jZGF5c1xuICAgKi9cbiAgcmVhZG9ubHkgZGF5cz86IG51bWJlcjtcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNFeHBpcmF0aW9uI2V4cGlyZWRPYmplY3REZWxldGVNYXJrZXJcbiAgICovXG4gIHJlYWRvbmx5IGV4cGlyZWRPYmplY3REZWxldGVNYXJrZXI/OiBib29sZWFuO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0V4cGlyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0V4cGlyYXRpb24ob2JqOiBCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNFeHBpcmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZGF0ZSc6IG9iai5kYXRlPy50b0lTT1N0cmluZygpLFxuICAgICdkYXlzJzogb2JqLmRheXMsXG4gICAgJ2V4cGlyZWRPYmplY3REZWxldGVNYXJrZXInOiBvYmouZXhwaXJlZE9iamVjdERlbGV0ZU1hcmtlcixcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBUaGUgRmlsdGVyIGlzIHVzZWQgdG8gaWRlbnRpZnkgb2JqZWN0cyB0aGF0IGEgTGlmZWN5Y2xlIFJ1bGUgYXBwbGllcyB0by4gQSBGaWx0ZXIgbXVzdCBoYXZlIGV4YWN0bHkgb25lIG9mIFByZWZpeCwgVGFnLCBvciBBbmQgc3BlY2lmaWVkLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzRmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzRmlsdGVyIHtcbiAgLyoqXG4gICAqIFRoaXMgaXMgdXNlZCBpbiBhIExpZmVjeWNsZSBSdWxlIEZpbHRlciB0byBhcHBseSBhIGxvZ2ljYWwgQU5EIHRvIHR3byBvciBtb3JlIHByZWRpY2F0ZXMuIFRoZSBMaWZlY3ljbGUgUnVsZSB3aWxsIGFwcGx5IHRvIGFueSBvYmplY3QgbWF0Y2hpbmcgYWxsIG9mIHRoZSBwcmVkaWNhdGVzIGNvbmZpZ3VyZWQgaW5zaWRlIHRoZSBBbmQgb3BlcmF0b3IuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzRmlsdGVyI2FuZFxuICAgKi9cbiAgcmVhZG9ubHkgYW5kPzogQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzRmlsdGVyQW5kO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlciNwcmVmaXhcbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogQSBjb250YWluZXIgb2YgYSBrZXkgdmFsdWUgbmFtZSBwYWlyLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlciN0YWdcbiAgICovXG4gIHJlYWRvbmx5IHRhZz86IEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlclRhZztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNGaWx0ZXInIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlcihvYmo6IEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FuZCc6IHRvSnNvbl9CdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNGaWx0ZXJBbmQob2JqLmFuZCksXG4gICAgJ3ByZWZpeCc6IG9iai5wcmVmaXgsXG4gICAgJ3RhZyc6IHRvSnNvbl9CdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNGaWx0ZXJUYWcob2JqLnRhZyksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIHdoZW4gbm9uY3VycmVudCBvYmplY3QgdmVyc2lvbnMgZXhwaXJlLiBVcG9uIGV4cGlyYXRpb24sIEFtYXpvbiBTMyBwZXJtYW5lbnRseSBkZWxldGVzIHRoZSBub25jdXJyZW50IG9iamVjdCB2ZXJzaW9ucy4gWW91IHNldCB0aGlzIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uIGFjdGlvbiBvbiBhIGJ1Y2tldCB0aGF0IGhhcyB2ZXJzaW9uaW5nIGVuYWJsZWQgKG9yIHN1c3BlbmRlZCkgdG8gcmVxdWVzdCB0aGF0IEFtYXpvbiBTMyBkZWxldGUgbm9uY3VycmVudCBvYmplY3QgdmVyc2lvbnMgYXQgYSBzcGVjaWZpYyBwZXJpb2QgaW4gdGhlIG9iamVjdCdzIGxpZmV0aW1lLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzTm9uY3VycmVudFZlcnNpb25FeHBpcmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzTm9uY3VycmVudFZlcnNpb25FeHBpcmF0aW9uIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzTm9uY3VycmVudFZlcnNpb25FeHBpcmF0aW9uI25vbmN1cnJlbnREYXlzXG4gICAqL1xuICByZWFkb25seSBub25jdXJyZW50RGF5cz86IG51bWJlcjtcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNOb25jdXJyZW50VmVyc2lvbkV4cGlyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc05vbmN1cnJlbnRWZXJzaW9uRXhwaXJhdGlvbihvYmo6IEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc05vbmN1cnJlbnRWZXJzaW9uRXhwaXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ25vbmN1cnJlbnREYXlzJzogb2JqLm5vbmN1cnJlbnREYXlzLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIENvbnRhaW5lciBmb3IgdGhlIHRyYW5zaXRpb24gcnVsZSB0aGF0IGRlc2NyaWJlcyB3aGVuIG5vbmN1cnJlbnQgb2JqZWN0cyB0cmFuc2l0aW9uIHRvIHRoZSBTVEFOREFSRF9JQSwgT05FWk9ORV9JQSwgSU5URUxMSUdFTlRfVElFUklORywgR0xBQ0lFUiwgb3IgREVFUF9BUkNISVZFIHN0b3JhZ2UgY2xhc3MuIElmIHlvdXIgYnVja2V0IGlzIHZlcnNpb25pbmctZW5hYmxlZCAob3IgdmVyc2lvbmluZyBpcyBzdXNwZW5kZWQpLCB5b3UgY2FuIHNldCB0aGlzIGFjdGlvbiB0byByZXF1ZXN0IHRoYXQgQW1hem9uIFMzIHRyYW5zaXRpb24gbm9uY3VycmVudCBvYmplY3QgdmVyc2lvbnMgdG8gdGhlIFNUQU5EQVJEX0lBLCBPTkVaT05FX0lBLCBJTlRFTExJR0VOVF9USUVSSU5HLCBHTEFDSUVSLCBvciBERUVQX0FSQ0hJVkUgc3RvcmFnZSBjbGFzcyBhdCBhIHNwZWNpZmljIHBlcmlvZCBpbiB0aGUgb2JqZWN0J3MgbGlmZXRpbWUuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNOb25jdXJyZW50VmVyc2lvblRyYW5zaXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzTm9uY3VycmVudFZlcnNpb25UcmFuc2l0aW9ucyB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc05vbmN1cnJlbnRWZXJzaW9uVHJhbnNpdGlvbnMjbm9uY3VycmVudERheXNcbiAgICovXG4gIHJlYWRvbmx5IG5vbmN1cnJlbnREYXlzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc05vbmN1cnJlbnRWZXJzaW9uVHJhbnNpdGlvbnMjc3RvcmFnZUNsYXNzXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlQ2xhc3M/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzTm9uY3VycmVudFZlcnNpb25UcmFuc2l0aW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzTm9uY3VycmVudFZlcnNpb25UcmFuc2l0aW9ucyhvYmo6IEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc05vbmN1cnJlbnRWZXJzaW9uVHJhbnNpdGlvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdub25jdXJyZW50RGF5cyc6IG9iai5ub25jdXJyZW50RGF5cyxcbiAgICAnc3RvcmFnZUNsYXNzJzogb2JqLnN0b3JhZ2VDbGFzcyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTcGVjaWZpZXMgd2hlbiBhbiBvYmplY3QgdHJhbnNpdGlvbnMgdG8gYSBzcGVjaWZpZWQgc3RvcmFnZSBjbGFzcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgQW1hem9uIFMzIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uIHJ1bGVzLCBzZWUgVHJhbnNpdGlvbmluZyBPYmplY3RzIFVzaW5nIEFtYXpvbiBTMyBMaWZlY3ljbGUgKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L2xpZmVjeWNsZS10cmFuc2l0aW9uLWdlbmVyYWwtY29uc2lkZXJhdGlvbnMuaHRtbCkgaW4gdGhlIEFtYXpvbiBTMyBVc2VyIEd1aWRlLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzVHJhbnNpdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNUcmFuc2l0aW9ucyB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc1RyYW5zaXRpb25zI2RhdGVcbiAgICovXG4gIHJlYWRvbmx5IGRhdGU/OiBEYXRlO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc1RyYW5zaXRpb25zI2RheXNcbiAgICovXG4gIHJlYWRvbmx5IGRheXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzVHJhbnNpdGlvbnMjc3RvcmFnZUNsYXNzXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlQ2xhc3M/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzVHJhbnNpdGlvbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc1RyYW5zaXRpb25zKG9iajogQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzVHJhbnNpdGlvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdkYXRlJzogb2JqLmRhdGU/LnRvSVNPU3RyaW5nKCksXG4gICAgJ2RheXMnOiBvYmouZGF5cyxcbiAgICAnc3RvcmFnZUNsYXNzJzogb2JqLnN0b3JhZ2VDbGFzcyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBDb250YWluZXIgZm9yIGdyYW50aW5nIGluZm9ybWF0aW9uLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY0xvZ2dpbmdMb2dnaW5nRW5hYmxlZFRhcmdldEdyYW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNMb2dnaW5nTG9nZ2luZ0VuYWJsZWRUYXJnZXRHcmFudHMge1xuICAvKipcbiAgICogQ29udGFpbmVyIGZvciB0aGUgcGVyc29uIGJlaW5nIGdyYW50ZWQgcGVybWlzc2lvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0xvZ2dpbmdMb2dnaW5nRW5hYmxlZFRhcmdldEdyYW50cyNncmFudGVlXG4gICAqL1xuICByZWFkb25seSBncmFudGVlPzogQnVja2V0U3BlY0xvZ2dpbmdMb2dnaW5nRW5hYmxlZFRhcmdldEdyYW50c0dyYW50ZWU7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0xvZ2dpbmdMb2dnaW5nRW5hYmxlZFRhcmdldEdyYW50cyNwZXJtaXNzaW9uXG4gICAqL1xuICByZWFkb25seSBwZXJtaXNzaW9uPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNMb2dnaW5nTG9nZ2luZ0VuYWJsZWRUYXJnZXRHcmFudHMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNMb2dnaW5nTG9nZ2luZ0VuYWJsZWRUYXJnZXRHcmFudHMob2JqOiBCdWNrZXRTcGVjTG9nZ2luZ0xvZ2dpbmdFbmFibGVkVGFyZ2V0R3JhbnRzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZ3JhbnRlZSc6IHRvSnNvbl9CdWNrZXRTcGVjTG9nZ2luZ0xvZ2dpbmdFbmFibGVkVGFyZ2V0R3JhbnRzR3JhbnRlZShvYmouZ3JhbnRlZSksXG4gICAgJ3Blcm1pc3Npb24nOiBvYmoucGVybWlzc2lvbixcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGNvbmp1bmN0aW9uIChsb2dpY2FsIEFORCkgb2YgcHJlZGljYXRlcywgd2hpY2ggaXMgdXNlZCBpbiBldmFsdWF0aW5nIGEgbWV0cmljcyBmaWx0ZXIuIFRoZSBvcGVyYXRvciBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIHByZWRpY2F0ZXMsIGFuZCBhbiBvYmplY3QgbXVzdCBtYXRjaCBhbGwgb2YgdGhlIHByZWRpY2F0ZXMgaW4gb3JkZXIgZm9yIHRoZSBmaWx0ZXIgdG8gYXBwbHkuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjTWV0cmljc0ZpbHRlckFuZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNNZXRyaWNzRmlsdGVyQW5kIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY01ldHJpY3NGaWx0ZXJBbmQjYWNjZXNzUG9pbnRBUk5cbiAgICovXG4gIHJlYWRvbmx5IGFjY2Vzc1BvaW50QXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNNZXRyaWNzRmlsdGVyQW5kI3ByZWZpeFxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNNZXRyaWNzRmlsdGVyQW5kI3RhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiBCdWNrZXRTcGVjTWV0cmljc0ZpbHRlckFuZFRhZ3NbXTtcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjTWV0cmljc0ZpbHRlckFuZCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY01ldHJpY3NGaWx0ZXJBbmQob2JqOiBCdWNrZXRTcGVjTWV0cmljc0ZpbHRlckFuZCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FjY2Vzc1BvaW50QVJOJzogb2JqLmFjY2Vzc1BvaW50QXJuLFxuICAgICdwcmVmaXgnOiBvYmoucHJlZml4LFxuICAgICd0YWdzJzogb2JqLnRhZ3M/Lm1hcCh5ID0+IHRvSnNvbl9CdWNrZXRTcGVjTWV0cmljc0ZpbHRlckFuZFRhZ3MoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgY29udGFpbmVyIG9mIGEga2V5IHZhbHVlIG5hbWUgcGFpci5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNNZXRyaWNzRmlsdGVyVGFnXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY01ldHJpY3NGaWx0ZXJUYWcge1xuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTWV0cmljc0ZpbHRlclRhZyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleT86IHN0cmluZztcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTWV0cmljc0ZpbHRlclRhZyN2YWx1ZVxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY01ldHJpY3NGaWx0ZXJUYWcnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNNZXRyaWNzRmlsdGVyVGFnKG9iajogQnVja2V0U3BlY01ldHJpY3NGaWx0ZXJUYWcgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICd2YWx1ZSc6IG9iai52YWx1ZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTcGVjaWZpZXMgb2JqZWN0IGtleSBuYW1lIGZpbHRlcmluZyBydWxlcy4gRm9yIGluZm9ybWF0aW9uIGFib3V0IGtleSBuYW1lIGZpbHRlcmluZywgc2VlIENvbmZpZ3VyaW5nIEV2ZW50IE5vdGlmaWNhdGlvbnMgKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L05vdGlmaWNhdGlvbkhvd1RvLmh0bWwpIGluIHRoZSBBbWF6b24gUzMgVXNlciBHdWlkZS5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNOb3RpZmljYXRpb25MYW1iZGFGdW5jdGlvbkNvbmZpZ3VyYXRpb25zRmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY05vdGlmaWNhdGlvbkxhbWJkYUZ1bmN0aW9uQ29uZmlndXJhdGlvbnNGaWx0ZXIge1xuICAvKipcbiAgICogQSBjb250YWluZXIgZm9yIG9iamVjdCBrZXkgbmFtZSBwcmVmaXggYW5kIHN1ZmZpeCBmaWx0ZXJpbmcgcnVsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY05vdGlmaWNhdGlvbkxhbWJkYUZ1bmN0aW9uQ29uZmlndXJhdGlvbnNGaWx0ZXIja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk/OiBCdWNrZXRTcGVjTm90aWZpY2F0aW9uTGFtYmRhRnVuY3Rpb25Db25maWd1cmF0aW9uc0ZpbHRlcktleTtcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjTm90aWZpY2F0aW9uTGFtYmRhRnVuY3Rpb25Db25maWd1cmF0aW9uc0ZpbHRlcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY05vdGlmaWNhdGlvbkxhbWJkYUZ1bmN0aW9uQ29uZmlndXJhdGlvbnNGaWx0ZXIob2JqOiBCdWNrZXRTcGVjTm90aWZpY2F0aW9uTGFtYmRhRnVuY3Rpb25Db25maWd1cmF0aW9uc0ZpbHRlciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IHRvSnNvbl9CdWNrZXRTcGVjTm90aWZpY2F0aW9uTGFtYmRhRnVuY3Rpb25Db25maWd1cmF0aW9uc0ZpbHRlcktleShvYmoua2V5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTcGVjaWZpZXMgb2JqZWN0IGtleSBuYW1lIGZpbHRlcmluZyBydWxlcy4gRm9yIGluZm9ybWF0aW9uIGFib3V0IGtleSBuYW1lIGZpbHRlcmluZywgc2VlIENvbmZpZ3VyaW5nIEV2ZW50IE5vdGlmaWNhdGlvbnMgKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L05vdGlmaWNhdGlvbkhvd1RvLmh0bWwpIGluIHRoZSBBbWF6b24gUzMgVXNlciBHdWlkZS5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNOb3RpZmljYXRpb25RdWV1ZUNvbmZpZ3VyYXRpb25zRmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY05vdGlmaWNhdGlvblF1ZXVlQ29uZmlndXJhdGlvbnNGaWx0ZXIge1xuICAvKipcbiAgICogQSBjb250YWluZXIgZm9yIG9iamVjdCBrZXkgbmFtZSBwcmVmaXggYW5kIHN1ZmZpeCBmaWx0ZXJpbmcgcnVsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY05vdGlmaWNhdGlvblF1ZXVlQ29uZmlndXJhdGlvbnNGaWx0ZXIja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk/OiBCdWNrZXRTcGVjTm90aWZpY2F0aW9uUXVldWVDb25maWd1cmF0aW9uc0ZpbHRlcktleTtcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjTm90aWZpY2F0aW9uUXVldWVDb25maWd1cmF0aW9uc0ZpbHRlcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY05vdGlmaWNhdGlvblF1ZXVlQ29uZmlndXJhdGlvbnNGaWx0ZXIob2JqOiBCdWNrZXRTcGVjTm90aWZpY2F0aW9uUXVldWVDb25maWd1cmF0aW9uc0ZpbHRlciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IHRvSnNvbl9CdWNrZXRTcGVjTm90aWZpY2F0aW9uUXVldWVDb25maWd1cmF0aW9uc0ZpbHRlcktleShvYmoua2V5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTcGVjaWZpZXMgb2JqZWN0IGtleSBuYW1lIGZpbHRlcmluZyBydWxlcy4gRm9yIGluZm9ybWF0aW9uIGFib3V0IGtleSBuYW1lIGZpbHRlcmluZywgc2VlIENvbmZpZ3VyaW5nIEV2ZW50IE5vdGlmaWNhdGlvbnMgKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L05vdGlmaWNhdGlvbkhvd1RvLmh0bWwpIGluIHRoZSBBbWF6b24gUzMgVXNlciBHdWlkZS5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNOb3RpZmljYXRpb25Ub3BpY0NvbmZpZ3VyYXRpb25zRmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY05vdGlmaWNhdGlvblRvcGljQ29uZmlndXJhdGlvbnNGaWx0ZXIge1xuICAvKipcbiAgICogQSBjb250YWluZXIgZm9yIG9iamVjdCBrZXkgbmFtZSBwcmVmaXggYW5kIHN1ZmZpeCBmaWx0ZXJpbmcgcnVsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY05vdGlmaWNhdGlvblRvcGljQ29uZmlndXJhdGlvbnNGaWx0ZXIja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk/OiBCdWNrZXRTcGVjTm90aWZpY2F0aW9uVG9waWNDb25maWd1cmF0aW9uc0ZpbHRlcktleTtcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjTm90aWZpY2F0aW9uVG9waWNDb25maWd1cmF0aW9uc0ZpbHRlcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY05vdGlmaWNhdGlvblRvcGljQ29uZmlndXJhdGlvbnNGaWx0ZXIob2JqOiBCdWNrZXRTcGVjTm90aWZpY2F0aW9uVG9waWNDb25maWd1cmF0aW9uc0ZpbHRlciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IHRvSnNvbl9CdWNrZXRTcGVjTm90aWZpY2F0aW9uVG9waWNDb25maWd1cmF0aW9uc0ZpbHRlcktleShvYmoua2V5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTcGVjaWZpZXMgd2hldGhlciBBbWF6b24gUzMgcmVwbGljYXRlcyBkZWxldGUgbWFya2Vycy4gSWYgeW91IHNwZWNpZnkgYSBGaWx0ZXIgaW4geW91ciByZXBsaWNhdGlvbiBjb25maWd1cmF0aW9uLCB5b3UgbXVzdCBhbHNvIGluY2x1ZGUgYSBEZWxldGVNYXJrZXJSZXBsaWNhdGlvbiBlbGVtZW50LiBJZiB5b3VyIEZpbHRlciBpbmNsdWRlcyBhIFRhZyBlbGVtZW50LCB0aGUgRGVsZXRlTWFya2VyUmVwbGljYXRpb24gU3RhdHVzIG11c3QgYmUgc2V0IHRvIERpc2FibGVkLCBiZWNhdXNlIEFtYXpvbiBTMyBkb2VzIG5vdCBzdXBwb3J0IHJlcGxpY2F0aW5nIGRlbGV0ZSBtYXJrZXJzIGZvciB0YWctYmFzZWQgcnVsZXMuIEZvciBhbiBleGFtcGxlIGNvbmZpZ3VyYXRpb24sIHNlZSBCYXNpYyBSdWxlIENvbmZpZ3VyYXRpb24gKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L3JlcGxpY2F0aW9uLWFkZC1jb25maWcuaHRtbCNyZXBsaWNhdGlvbi1jb25maWctbWluLXJ1bGUtY29uZmlnKS5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGRlbGV0ZSBtYXJrZXIgcmVwbGljYXRpb24sIHNlZSBCYXNpYyBSdWxlIENvbmZpZ3VyYXRpb24gKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L2RlbGV0ZS1tYXJrZXItcmVwbGljYXRpb24uaHRtbCkuXG4gKiBJZiB5b3UgYXJlIHVzaW5nIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiB0aGUgcmVwbGljYXRpb24gY29uZmlndXJhdGlvbiwgQW1hem9uIFMzIGhhbmRsZXMgcmVwbGljYXRpb24gb2YgZGVsZXRlIG1hcmtlcnMgZGlmZmVyZW50bHkuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgQmFja3dhcmQgQ29tcGF0aWJpbGl0eSAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvcmVwbGljYXRpb24tYWRkLWNvbmZpZy5odG1sI3JlcGxpY2F0aW9uLWJhY2t3YXJkLWNvbXBhdC1jb25zaWRlcmF0aW9ucykuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0RlbGV0ZU1hcmtlclJlcGxpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZWxldGVNYXJrZXJSZXBsaWNhdGlvbiB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVsZXRlTWFya2VyUmVwbGljYXRpb24jc3RhdHVzXG4gICAqL1xuICByZWFkb25seSBzdGF0dXM/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZWxldGVNYXJrZXJSZXBsaWNhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZWxldGVNYXJrZXJSZXBsaWNhdGlvbihvYmo6IEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVsZXRlTWFya2VyUmVwbGljYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdzdGF0dXMnOiBvYmouc3RhdHVzLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSB0byBwdWJsaXNoIGFuYWx5c2lzIG9yIGNvbmZpZ3VyYXRpb24gcmVzdWx0cyBmb3IgYW4gQW1hem9uIFMzIGJ1Y2tldCBhbmQgUzMgUmVwbGljYXRpb24gVGltZSBDb250cm9sIChTMyBSVEMpLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb24ge1xuICAvKipcbiAgICogQSBjb250YWluZXIgZm9yIGluZm9ybWF0aW9uIGFib3V0IGFjY2VzcyBjb250cm9sIGZvciByZXBsaWNhcy5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uI2FjY2Vzc0NvbnRyb2xUcmFuc2xhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXNzQ29udHJvbFRyYW5zbGF0aW9uPzogQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvbkFjY2Vzc0NvbnRyb2xUcmFuc2xhdGlvbjtcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uI2FjY291bnRcbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvbiNidWNrZXRcbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldD86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGVuY3J5cHRpb24tcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgYW4gQW1hem9uIFMzIGJ1Y2tldCB0aGF0IGlzIGEgZGVzdGluYXRpb24gZm9yIHJlcGxpY2F0ZWQgb2JqZWN0cy5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uI2VuY3J5cHRpb25Db25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uQ29uZmlndXJhdGlvbj86IEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25FbmNyeXB0aW9uQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQSBjb250YWluZXIgc3BlY2lmeWluZyByZXBsaWNhdGlvbiBtZXRyaWNzLXJlbGF0ZWQgc2V0dGluZ3MgZW5hYmxpbmcgcmVwbGljYXRpb24gbWV0cmljcyBhbmQgZXZlbnRzLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb24jbWV0cmljc1xuICAgKi9cbiAgcmVhZG9ubHkgbWV0cmljcz86IEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25NZXRyaWNzO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRhaW5lciBzcGVjaWZ5aW5nIFMzIFJlcGxpY2F0aW9uIFRpbWUgQ29udHJvbCAoUzMgUlRDKSByZWxhdGVkIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgd2hldGhlciBTMyBSVEMgaXMgZW5hYmxlZCBhbmQgdGhlIHRpbWUgd2hlbiBhbGwgb2JqZWN0cyBhbmQgb3BlcmF0aW9ucyBvbiBvYmplY3RzIG11c3QgYmUgcmVwbGljYXRlZC4gTXVzdCBiZSBzcGVjaWZpZWQgdG9nZXRoZXIgd2l0aCBhIE1ldHJpY3MgYmxvY2suXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvbiNyZXBsaWNhdGlvblRpbWVcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2F0aW9uVGltZT86IEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25SZXBsaWNhdGlvblRpbWU7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvbiNzdG9yYWdlQ2xhc3NcbiAgICovXG4gIHJlYWRvbmx5IHN0b3JhZ2VDbGFzcz86IHN0cmluZztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uKG9iajogQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FjY2Vzc0NvbnRyb2xUcmFuc2xhdGlvbic6IHRvSnNvbl9CdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uQWNjZXNzQ29udHJvbFRyYW5zbGF0aW9uKG9iai5hY2Nlc3NDb250cm9sVHJhbnNsYXRpb24pLFxuICAgICdhY2NvdW50Jzogb2JqLmFjY291bnQsXG4gICAgJ2J1Y2tldCc6IG9iai5idWNrZXQsXG4gICAgJ2VuY3J5cHRpb25Db25maWd1cmF0aW9uJzogdG9Kc29uX0J1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25FbmNyeXB0aW9uQ29uZmlndXJhdGlvbihvYmouZW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24pLFxuICAgICdtZXRyaWNzJzogdG9Kc29uX0J1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25NZXRyaWNzKG9iai5tZXRyaWNzKSxcbiAgICAncmVwbGljYXRpb25UaW1lJzogdG9Kc29uX0J1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25SZXBsaWNhdGlvblRpbWUob2JqLnJlcGxpY2F0aW9uVGltZSksXG4gICAgJ3N0b3JhZ2VDbGFzcyc6IG9iai5zdG9yYWdlQ2xhc3MsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9uYWwgY29uZmlndXJhdGlvbiB0byByZXBsaWNhdGUgZXhpc3Rpbmcgc291cmNlIGJ1Y2tldCBvYmplY3RzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFJlcGxpY2F0aW5nIEV4aXN0aW5nIE9iamVjdHMgKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L3JlcGxpY2F0aW9uLXdoYXQtaXMtaXNub3QtcmVwbGljYXRlZC5odG1sI2V4aXN0aW5nLW9iamVjdC1yZXBsaWNhdGlvbikgaW4gdGhlIEFtYXpvbiBTMyBVc2VyIEd1aWRlLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNFeGlzdGluZ09iamVjdFJlcGxpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNFeGlzdGluZ09iamVjdFJlcGxpY2F0aW9uIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNFeGlzdGluZ09iamVjdFJlcGxpY2F0aW9uI3N0YXR1c1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRXhpc3RpbmdPYmplY3RSZXBsaWNhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNFeGlzdGluZ09iamVjdFJlcGxpY2F0aW9uKG9iajogQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNFeGlzdGluZ09iamVjdFJlcGxpY2F0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnc3RhdHVzJzogb2JqLnN0YXR1cyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGZpbHRlciB0aGF0IGlkZW50aWZpZXMgdGhlIHN1YnNldCBvZiBvYmplY3RzIHRvIHdoaWNoIHRoZSByZXBsaWNhdGlvbiBydWxlIGFwcGxpZXMuIEEgRmlsdGVyIG11c3Qgc3BlY2lmeSBleGFjdGx5IG9uZSBQcmVmaXgsIFRhZywgb3IgYW4gQW5kIGNoaWxkIGVsZW1lbnQuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0ZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRmlsdGVyIHtcbiAgLyoqXG4gICAqIEEgY29udGFpbmVyIGZvciBzcGVjaWZ5aW5nIHJ1bGUgZmlsdGVycy4gVGhlIGZpbHRlcnMgZGV0ZXJtaW5lIHRoZSBzdWJzZXQgb2Ygb2JqZWN0cyB0byB3aGljaCB0aGUgcnVsZSBhcHBsaWVzLiBUaGlzIGVsZW1lbnQgaXMgcmVxdWlyZWQgb25seSBpZiB5b3Ugc3BlY2lmeSBtb3JlIHRoYW4gb25lIGZpbHRlci5cbiAgICogRm9yIGV4YW1wbGU6XG4gICAqICogSWYgeW91IHNwZWNpZnkgYm90aCBhIFByZWZpeCBhbmQgYSBUYWcgZmlsdGVyLCB3cmFwIHRoZXNlIGZpbHRlcnMgaW4gICAgYW4gQW5kIHRhZy5cbiAgICogKiBJZiB5b3Ugc3BlY2lmeSBhIGZpbHRlciBiYXNlZCBvbiBtdWx0aXBsZSB0YWdzLCB3cmFwIHRoZSBUYWcgZWxlbWVudHMgICAgaW4gYW4gQW5kIHRhZy5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0ZpbHRlciNhbmRcbiAgICovXG4gIHJlYWRvbmx5IGFuZD86IEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRmlsdGVyQW5kO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRmlsdGVyI3ByZWZpeFxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRhaW5lciBvZiBhIGtleSB2YWx1ZSBuYW1lIHBhaXIuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNGaWx0ZXIjdGFnXG4gICAqL1xuICByZWFkb25seSB0YWc/OiBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0ZpbHRlclRhZztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0ZpbHRlcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNGaWx0ZXIob2JqOiBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0ZpbHRlciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FuZCc6IHRvSnNvbl9CdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0ZpbHRlckFuZChvYmouYW5kKSxcbiAgICAncHJlZml4Jzogb2JqLnByZWZpeCxcbiAgICAndGFnJzogdG9Kc29uX0J1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRmlsdGVyVGFnKG9iai50YWcpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgY29udGFpbmVyIHRoYXQgZGVzY3JpYmVzIGFkZGl0aW9uYWwgZmlsdGVycyBmb3IgaWRlbnRpZnlpbmcgdGhlIHNvdXJjZSBvYmplY3RzIHRoYXQgeW91IHdhbnQgdG8gcmVwbGljYXRlLiBZb3UgY2FuIGNob29zZSB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgcmVwbGljYXRpb24gb2YgdGhlc2Ugb2JqZWN0cy4gQ3VycmVudGx5LCBBbWF6b24gUzMgc3VwcG9ydHMgb25seSB0aGUgZmlsdGVyIHRoYXQgeW91IGNhbiBzcGVjaWZ5IGZvciBvYmplY3RzIGNyZWF0ZWQgd2l0aCBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIHVzaW5nIGEgY3VzdG9tZXIgbWFuYWdlZCBrZXkgc3RvcmVkIGluIEFtYXpvbiBXZWIgU2VydmljZXMgS2V5IE1hbmFnZW1lbnQgU2VydmljZSAoU1NFLUtNUykuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc1NvdXJjZVNlbGVjdGlvbkNyaXRlcmlhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNTb3VyY2VTZWxlY3Rpb25Dcml0ZXJpYSB7XG4gIC8qKlxuICAgKiBBIGZpbHRlciB0aGF0IHlvdSBjYW4gc3BlY2lmeSBmb3Igc2VsZWN0aW9uIGZvciBtb2RpZmljYXRpb25zIG9uIHJlcGxpY2FzLiBBbWF6b24gUzMgZG9lc24ndCByZXBsaWNhdGUgcmVwbGljYSBtb2RpZmljYXRpb25zIGJ5IGRlZmF1bHQuIEluIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiByZXBsaWNhdGlvbiBjb25maWd1cmF0aW9uICh3aGVuIEZpbHRlciBpcyBzcGVjaWZpZWQpLCB5b3UgY2FuIHNwZWNpZnkgdGhpcyBlbGVtZW50IGFuZCBzZXQgdGhlIHN0YXR1cyB0byBFbmFibGVkIHRvIHJlcGxpY2F0ZSBtb2RpZmljYXRpb25zIG9uIHJlcGxpY2FzLlxuICAgKiBJZiB5b3UgZG9uJ3Qgc3BlY2lmeSB0aGUgRmlsdGVyIGVsZW1lbnQsIEFtYXpvbiBTMyBhc3N1bWVzIHRoYXQgdGhlIHJlcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gaXMgdGhlIGVhcmxpZXIgdmVyc2lvbiwgVjEuIEluIHRoZSBlYXJsaWVyIHZlcnNpb24sIHRoaXMgZWxlbWVudCBpcyBub3QgYWxsb3dlZC5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc1NvdXJjZVNlbGVjdGlvbkNyaXRlcmlhI3JlcGxpY2FNb2RpZmljYXRpb25zXG4gICAqL1xuICByZWFkb25seSByZXBsaWNhTW9kaWZpY2F0aW9ucz86IEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzU291cmNlU2VsZWN0aW9uQ3JpdGVyaWFSZXBsaWNhTW9kaWZpY2F0aW9ucztcblxuICAvKipcbiAgICogQSBjb250YWluZXIgZm9yIGZpbHRlciBpbmZvcm1hdGlvbiBmb3IgdGhlIHNlbGVjdGlvbiBvZiBTMyBvYmplY3RzIGVuY3J5cHRlZCB3aXRoIEFtYXpvbiBXZWIgU2VydmljZXMgS01TLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzU291cmNlU2VsZWN0aW9uQ3JpdGVyaWEjc3NlS01TRW5jcnlwdGVkT2JqZWN0c1xuICAgKi9cbiAgcmVhZG9ubHkgc3NlS21zRW5jcnlwdGVkT2JqZWN0cz86IEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzU291cmNlU2VsZWN0aW9uQ3JpdGVyaWFTc2VLbXNFbmNyeXB0ZWRPYmplY3RzO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzU291cmNlU2VsZWN0aW9uQ3JpdGVyaWEnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzU291cmNlU2VsZWN0aW9uQ3JpdGVyaWEob2JqOiBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc1NvdXJjZVNlbGVjdGlvbkNyaXRlcmlhIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncmVwbGljYU1vZGlmaWNhdGlvbnMnOiB0b0pzb25fQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNTb3VyY2VTZWxlY3Rpb25Dcml0ZXJpYVJlcGxpY2FNb2RpZmljYXRpb25zKG9iai5yZXBsaWNhTW9kaWZpY2F0aW9ucyksXG4gICAgJ3NzZUtNU0VuY3J5cHRlZE9iamVjdHMnOiB0b0pzb25fQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNTb3VyY2VTZWxlY3Rpb25Dcml0ZXJpYVNzZUttc0VuY3J5cHRlZE9iamVjdHMob2JqLnNzZUttc0VuY3J5cHRlZE9iamVjdHMpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgY29udGFpbmVyIGZvciBkZXNjcmliaW5nIGEgY29uZGl0aW9uIHRoYXQgbXVzdCBiZSBtZXQgZm9yIHRoZSBzcGVjaWZpZWQgcmVkaXJlY3QgdG8gYXBwbHkuIEZvciBleGFtcGxlLCAxLiBJZiByZXF1ZXN0IGlzIGZvciBwYWdlcyBpbiB0aGUgL2RvY3MgZm9sZGVyLCByZWRpcmVjdCB0byB0aGUgL2RvY3VtZW50cyBmb2xkZXIuIDIuIElmIHJlcXVlc3QgcmVzdWx0cyBpbiBIVFRQIGVycm9yIDR4eCwgcmVkaXJlY3QgcmVxdWVzdCB0byBhbm90aGVyIGhvc3Qgd2hlcmUgeW91IG1pZ2h0IHByb2Nlc3MgdGhlIGVycm9yLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY1dlYnNpdGVSb3V0aW5nUnVsZXNDb25kaXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjV2Vic2l0ZVJvdXRpbmdSdWxlc0NvbmRpdGlvbiB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNXZWJzaXRlUm91dGluZ1J1bGVzQ29uZGl0aW9uI2h0dHBFcnJvckNvZGVSZXR1cm5lZEVxdWFsc1xuICAgKi9cbiAgcmVhZG9ubHkgaHR0cEVycm9yQ29kZVJldHVybmVkRXF1YWxzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNXZWJzaXRlUm91dGluZ1J1bGVzQ29uZGl0aW9uI2tleVByZWZpeEVxdWFsc1xuICAgKi9cbiAgcmVhZG9ubHkga2V5UHJlZml4RXF1YWxzPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNXZWJzaXRlUm91dGluZ1J1bGVzQ29uZGl0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjV2Vic2l0ZVJvdXRpbmdSdWxlc0NvbmRpdGlvbihvYmo6IEJ1Y2tldFNwZWNXZWJzaXRlUm91dGluZ1J1bGVzQ29uZGl0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnaHR0cEVycm9yQ29kZVJldHVybmVkRXF1YWxzJzogb2JqLmh0dHBFcnJvckNvZGVSZXR1cm5lZEVxdWFscyxcbiAgICAna2V5UHJlZml4RXF1YWxzJzogb2JqLmtleVByZWZpeEVxdWFscyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTcGVjaWZpZXMgaG93IHJlcXVlc3RzIGFyZSByZWRpcmVjdGVkLiBJbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3IsIHlvdSBjYW4gc3BlY2lmeSBhIGRpZmZlcmVudCBlcnJvciBjb2RlIHRvIHJldHVybi5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNXZWJzaXRlUm91dGluZ1J1bGVzUmVkaXJlY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjV2Vic2l0ZVJvdXRpbmdSdWxlc1JlZGlyZWN0IHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1dlYnNpdGVSb3V0aW5nUnVsZXNSZWRpcmVjdCNob3N0TmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1dlYnNpdGVSb3V0aW5nUnVsZXNSZWRpcmVjdCNodHRwUmVkaXJlY3RDb2RlXG4gICAqL1xuICByZWFkb25seSBodHRwUmVkaXJlY3RDb2RlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNXZWJzaXRlUm91dGluZ1J1bGVzUmVkaXJlY3QjcHJvdG9jb2xcbiAgICovXG4gIHJlYWRvbmx5IHByb3RvY29sPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNXZWJzaXRlUm91dGluZ1J1bGVzUmVkaXJlY3QjcmVwbGFjZUtleVByZWZpeFdpdGhcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxhY2VLZXlQcmVmaXhXaXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNXZWJzaXRlUm91dGluZ1J1bGVzUmVkaXJlY3QjcmVwbGFjZUtleVdpdGhcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxhY2VLZXlXaXRoPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNXZWJzaXRlUm91dGluZ1J1bGVzUmVkaXJlY3QnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNXZWJzaXRlUm91dGluZ1J1bGVzUmVkaXJlY3Qob2JqOiBCdWNrZXRTcGVjV2Vic2l0ZVJvdXRpbmdSdWxlc1JlZGlyZWN0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnaG9zdE5hbWUnOiBvYmouaG9zdE5hbWUsXG4gICAgJ2h0dHBSZWRpcmVjdENvZGUnOiBvYmouaHR0cFJlZGlyZWN0Q29kZSxcbiAgICAncHJvdG9jb2wnOiBvYmoucHJvdG9jb2wsXG4gICAgJ3JlcGxhY2VLZXlQcmVmaXhXaXRoJzogb2JqLnJlcGxhY2VLZXlQcmVmaXhXaXRoLFxuICAgICdyZXBsYWNlS2V5V2l0aCc6IG9iai5yZXBsYWNlS2V5V2l0aCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGNvbnRhaW5lciBvZiBhIGtleSB2YWx1ZSBuYW1lIHBhaXIuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjQW5hbHl0aWNzRmlsdGVyQW5kVGFnc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNBbmFseXRpY3NGaWx0ZXJBbmRUYWdzIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0FuYWx5dGljc0ZpbHRlckFuZFRhZ3Mja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0FuYWx5dGljc0ZpbHRlckFuZFRhZ3MjdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNBbmFseXRpY3NGaWx0ZXJBbmRUYWdzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjQW5hbHl0aWNzRmlsdGVyQW5kVGFncyhvYmo6IEJ1Y2tldFNwZWNBbmFseXRpY3NGaWx0ZXJBbmRUYWdzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAndmFsdWUnOiBvYmoudmFsdWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogV2hlcmUgdG8gcHVibGlzaCB0aGUgYW5hbHl0aWNzIHJlc3VsdHMuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjQW5hbHl0aWNzU3RvcmFnZUNsYXNzQW5hbHlzaXNEYXRhRXhwb3J0RGVzdGluYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjQW5hbHl0aWNzU3RvcmFnZUNsYXNzQW5hbHlzaXNEYXRhRXhwb3J0RGVzdGluYXRpb24ge1xuICAvKipcbiAgICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgd2hlcmUgdG8gcHVibGlzaCB0aGUgYW5hbHl0aWNzIHJlc3VsdHMuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0FuYWx5dGljc1N0b3JhZ2VDbGFzc0FuYWx5c2lzRGF0YUV4cG9ydERlc3RpbmF0aW9uI3MzQnVja2V0RGVzdGluYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHMzQnVja2V0RGVzdGluYXRpb24/OiBCdWNrZXRTcGVjQW5hbHl0aWNzU3RvcmFnZUNsYXNzQW5hbHlzaXNEYXRhRXhwb3J0RGVzdGluYXRpb25TM0J1Y2tldERlc3RpbmF0aW9uO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNBbmFseXRpY3NTdG9yYWdlQ2xhc3NBbmFseXNpc0RhdGFFeHBvcnREZXN0aW5hdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY0FuYWx5dGljc1N0b3JhZ2VDbGFzc0FuYWx5c2lzRGF0YUV4cG9ydERlc3RpbmF0aW9uKG9iajogQnVja2V0U3BlY0FuYWx5dGljc1N0b3JhZ2VDbGFzc0FuYWx5c2lzRGF0YUV4cG9ydERlc3RpbmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnczNCdWNrZXREZXN0aW5hdGlvbic6IHRvSnNvbl9CdWNrZXRTcGVjQW5hbHl0aWNzU3RvcmFnZUNsYXNzQW5hbHlzaXNEYXRhRXhwb3J0RGVzdGluYXRpb25TM0J1Y2tldERlc3RpbmF0aW9uKG9iai5zM0J1Y2tldERlc3RpbmF0aW9uKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGNvbnRhaW5lciBvZiBhIGtleSB2YWx1ZSBuYW1lIHBhaXIuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nRmlsdGVyQW5kVGFnc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdGaWx0ZXJBbmRUYWdzIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0ludGVsbGlnZW50VGllcmluZ0ZpbHRlckFuZFRhZ3Mja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0ludGVsbGlnZW50VGllcmluZ0ZpbHRlckFuZFRhZ3MjdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdGaWx0ZXJBbmRUYWdzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjSW50ZWxsaWdlbnRUaWVyaW5nRmlsdGVyQW5kVGFncyhvYmo6IEJ1Y2tldFNwZWNJbnRlbGxpZ2VudFRpZXJpbmdGaWx0ZXJBbmRUYWdzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAndmFsdWUnOiBvYmoudmFsdWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogQ29udGFpbnMgdGhlIHR5cGUgb2Ygc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB1c2VkIHRvIGVuY3J5cHQgdGhlIGludmVudG9yeSByZXN1bHRzLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY0ludmVudG9yeURlc3RpbmF0aW9uUzNCdWNrZXREZXN0aW5hdGlvbkVuY3J5cHRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjSW52ZW50b3J5RGVzdGluYXRpb25TM0J1Y2tldERlc3RpbmF0aW9uRW5jcnlwdGlvbiB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHVzZSBvZiBTU0UtS01TIHRvIGVuY3J5cHQgZGVsaXZlcmVkIGludmVudG9yeSByZXBvcnRzLlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNJbnZlbnRvcnlEZXN0aW5hdGlvblMzQnVja2V0RGVzdGluYXRpb25FbmNyeXB0aW9uI3NzZUtNU1xuICAgKi9cbiAgcmVhZG9ubHkgc3NlS21zPzogQnVja2V0U3BlY0ludmVudG9yeURlc3RpbmF0aW9uUzNCdWNrZXREZXN0aW5hdGlvbkVuY3J5cHRpb25Tc2VLbXM7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY0ludmVudG9yeURlc3RpbmF0aW9uUzNCdWNrZXREZXN0aW5hdGlvbkVuY3J5cHRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNJbnZlbnRvcnlEZXN0aW5hdGlvblMzQnVja2V0RGVzdGluYXRpb25FbmNyeXB0aW9uKG9iajogQnVja2V0U3BlY0ludmVudG9yeURlc3RpbmF0aW9uUzNCdWNrZXREZXN0aW5hdGlvbkVuY3J5cHRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdzc2VLTVMnOiB0b0pzb25fQnVja2V0U3BlY0ludmVudG9yeURlc3RpbmF0aW9uUzNCdWNrZXREZXN0aW5hdGlvbkVuY3J5cHRpb25Tc2VLbXMob2JqLnNzZUttcyksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogVGhpcyBpcyB1c2VkIGluIGEgTGlmZWN5Y2xlIFJ1bGUgRmlsdGVyIHRvIGFwcGx5IGEgbG9naWNhbCBBTkQgdG8gdHdvIG9yIG1vcmUgcHJlZGljYXRlcy4gVGhlIExpZmVjeWNsZSBSdWxlIHdpbGwgYXBwbHkgdG8gYW55IG9iamVjdCBtYXRjaGluZyBhbGwgb2YgdGhlIHByZWRpY2F0ZXMgY29uZmlndXJlZCBpbnNpZGUgdGhlIEFuZCBvcGVyYXRvci5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlckFuZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlckFuZCB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlckFuZCNwcmVmaXhcbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNGaWx0ZXJBbmQjdGFnc1xuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlckFuZFRhZ3NbXTtcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNGaWx0ZXJBbmQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlckFuZChvYmo6IEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlckFuZCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3ByZWZpeCc6IG9iai5wcmVmaXgsXG4gICAgJ3RhZ3MnOiBvYmoudGFncz8ubWFwKHkgPT4gdG9Kc29uX0J1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlckFuZFRhZ3MoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgY29udGFpbmVyIG9mIGEga2V5IHZhbHVlIG5hbWUgcGFpci5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlclRhZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlclRhZyB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlclRhZyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleT86IHN0cmluZztcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNGaWx0ZXJUYWcjdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlclRhZycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzRmlsdGVyVGFnKG9iajogQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzRmlsdGVyVGFnIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAndmFsdWUnOiBvYmoudmFsdWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogQ29udGFpbmVyIGZvciB0aGUgcGVyc29uIGJlaW5nIGdyYW50ZWQgcGVybWlzc2lvbnMuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjTG9nZ2luZ0xvZ2dpbmdFbmFibGVkVGFyZ2V0R3JhbnRzR3JhbnRlZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNMb2dnaW5nTG9nZ2luZ0VuYWJsZWRUYXJnZXRHcmFudHNHcmFudGVlIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0xvZ2dpbmdMb2dnaW5nRW5hYmxlZFRhcmdldEdyYW50c0dyYW50ZWUjZGlzcGxheU5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMb2dnaW5nTG9nZ2luZ0VuYWJsZWRUYXJnZXRHcmFudHNHcmFudGVlI2VtYWlsQWRkcmVzc1xuICAgKi9cbiAgcmVhZG9ubHkgZW1haWxBZGRyZXNzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMb2dnaW5nTG9nZ2luZ0VuYWJsZWRUYXJnZXRHcmFudHNHcmFudGVlI2lkXG4gICAqL1xuICByZWFkb25seSBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTG9nZ2luZ0xvZ2dpbmdFbmFibGVkVGFyZ2V0R3JhbnRzR3JhbnRlZSN0eXBlX1xuICAgKi9cbiAgcmVhZG9ubHkgdHlwZT86IHN0cmluZztcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTG9nZ2luZ0xvZ2dpbmdFbmFibGVkVGFyZ2V0R3JhbnRzR3JhbnRlZSN1UklcbiAgICovXG4gIHJlYWRvbmx5IHVSaT86IHN0cmluZztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjTG9nZ2luZ0xvZ2dpbmdFbmFibGVkVGFyZ2V0R3JhbnRzR3JhbnRlZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY0xvZ2dpbmdMb2dnaW5nRW5hYmxlZFRhcmdldEdyYW50c0dyYW50ZWUob2JqOiBCdWNrZXRTcGVjTG9nZ2luZ0xvZ2dpbmdFbmFibGVkVGFyZ2V0R3JhbnRzR3JhbnRlZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2Rpc3BsYXlOYW1lJzogb2JqLmRpc3BsYXlOYW1lLFxuICAgICdlbWFpbEFkZHJlc3MnOiBvYmouZW1haWxBZGRyZXNzLFxuICAgICdpZCc6IG9iai5pZCxcbiAgICAndHlwZV8nOiBvYmoudHlwZSxcbiAgICAndVJJJzogb2JqLnVSaSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGNvbnRhaW5lciBvZiBhIGtleSB2YWx1ZSBuYW1lIHBhaXIuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjTWV0cmljc0ZpbHRlckFuZFRhZ3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjTWV0cmljc0ZpbHRlckFuZFRhZ3Mge1xuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTWV0cmljc0ZpbHRlckFuZFRhZ3Mja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY01ldHJpY3NGaWx0ZXJBbmRUYWdzI3ZhbHVlXG4gICAqL1xuICByZWFkb25seSB2YWx1ZT86IHN0cmluZztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjTWV0cmljc0ZpbHRlckFuZFRhZ3MnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNNZXRyaWNzRmlsdGVyQW5kVGFncyhvYmo6IEJ1Y2tldFNwZWNNZXRyaWNzRmlsdGVyQW5kVGFncyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ3ZhbHVlJzogb2JqLnZhbHVlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgY29udGFpbmVyIGZvciBvYmplY3Qga2V5IG5hbWUgcHJlZml4IGFuZCBzdWZmaXggZmlsdGVyaW5nIHJ1bGVzLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY05vdGlmaWNhdGlvbkxhbWJkYUZ1bmN0aW9uQ29uZmlndXJhdGlvbnNGaWx0ZXJLZXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjTm90aWZpY2F0aW9uTGFtYmRhRnVuY3Rpb25Db25maWd1cmF0aW9uc0ZpbHRlcktleSB7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgY29udGFpbmVycyBmb3IgdGhlIGtleS12YWx1ZSBwYWlyIHRoYXQgZGVmaW5lcyB0aGUgY3JpdGVyaWEgZm9yIHRoZSBmaWx0ZXIgcnVsZS5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTm90aWZpY2F0aW9uTGFtYmRhRnVuY3Rpb25Db25maWd1cmF0aW9uc0ZpbHRlcktleSNmaWx0ZXJSdWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZmlsdGVyUnVsZXM/OiBCdWNrZXRTcGVjTm90aWZpY2F0aW9uTGFtYmRhRnVuY3Rpb25Db25maWd1cmF0aW9uc0ZpbHRlcktleUZpbHRlclJ1bGVzW107XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY05vdGlmaWNhdGlvbkxhbWJkYUZ1bmN0aW9uQ29uZmlndXJhdGlvbnNGaWx0ZXJLZXknIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNOb3RpZmljYXRpb25MYW1iZGFGdW5jdGlvbkNvbmZpZ3VyYXRpb25zRmlsdGVyS2V5KG9iajogQnVja2V0U3BlY05vdGlmaWNhdGlvbkxhbWJkYUZ1bmN0aW9uQ29uZmlndXJhdGlvbnNGaWx0ZXJLZXkgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdmaWx0ZXJSdWxlcyc6IG9iai5maWx0ZXJSdWxlcz8ubWFwKHkgPT4gdG9Kc29uX0J1Y2tldFNwZWNOb3RpZmljYXRpb25MYW1iZGFGdW5jdGlvbkNvbmZpZ3VyYXRpb25zRmlsdGVyS2V5RmlsdGVyUnVsZXMoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgY29udGFpbmVyIGZvciBvYmplY3Qga2V5IG5hbWUgcHJlZml4IGFuZCBzdWZmaXggZmlsdGVyaW5nIHJ1bGVzLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY05vdGlmaWNhdGlvblF1ZXVlQ29uZmlndXJhdGlvbnNGaWx0ZXJLZXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjTm90aWZpY2F0aW9uUXVldWVDb25maWd1cmF0aW9uc0ZpbHRlcktleSB7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgY29udGFpbmVycyBmb3IgdGhlIGtleS12YWx1ZSBwYWlyIHRoYXQgZGVmaW5lcyB0aGUgY3JpdGVyaWEgZm9yIHRoZSBmaWx0ZXIgcnVsZS5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTm90aWZpY2F0aW9uUXVldWVDb25maWd1cmF0aW9uc0ZpbHRlcktleSNmaWx0ZXJSdWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZmlsdGVyUnVsZXM/OiBCdWNrZXRTcGVjTm90aWZpY2F0aW9uUXVldWVDb25maWd1cmF0aW9uc0ZpbHRlcktleUZpbHRlclJ1bGVzW107XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY05vdGlmaWNhdGlvblF1ZXVlQ29uZmlndXJhdGlvbnNGaWx0ZXJLZXknIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNOb3RpZmljYXRpb25RdWV1ZUNvbmZpZ3VyYXRpb25zRmlsdGVyS2V5KG9iajogQnVja2V0U3BlY05vdGlmaWNhdGlvblF1ZXVlQ29uZmlndXJhdGlvbnNGaWx0ZXJLZXkgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdmaWx0ZXJSdWxlcyc6IG9iai5maWx0ZXJSdWxlcz8ubWFwKHkgPT4gdG9Kc29uX0J1Y2tldFNwZWNOb3RpZmljYXRpb25RdWV1ZUNvbmZpZ3VyYXRpb25zRmlsdGVyS2V5RmlsdGVyUnVsZXMoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgY29udGFpbmVyIGZvciBvYmplY3Qga2V5IG5hbWUgcHJlZml4IGFuZCBzdWZmaXggZmlsdGVyaW5nIHJ1bGVzLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY05vdGlmaWNhdGlvblRvcGljQ29uZmlndXJhdGlvbnNGaWx0ZXJLZXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjTm90aWZpY2F0aW9uVG9waWNDb25maWd1cmF0aW9uc0ZpbHRlcktleSB7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgY29udGFpbmVycyBmb3IgdGhlIGtleS12YWx1ZSBwYWlyIHRoYXQgZGVmaW5lcyB0aGUgY3JpdGVyaWEgZm9yIHRoZSBmaWx0ZXIgcnVsZS5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTm90aWZpY2F0aW9uVG9waWNDb25maWd1cmF0aW9uc0ZpbHRlcktleSNmaWx0ZXJSdWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZmlsdGVyUnVsZXM/OiBCdWNrZXRTcGVjTm90aWZpY2F0aW9uVG9waWNDb25maWd1cmF0aW9uc0ZpbHRlcktleUZpbHRlclJ1bGVzW107XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY05vdGlmaWNhdGlvblRvcGljQ29uZmlndXJhdGlvbnNGaWx0ZXJLZXknIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNOb3RpZmljYXRpb25Ub3BpY0NvbmZpZ3VyYXRpb25zRmlsdGVyS2V5KG9iajogQnVja2V0U3BlY05vdGlmaWNhdGlvblRvcGljQ29uZmlndXJhdGlvbnNGaWx0ZXJLZXkgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdmaWx0ZXJSdWxlcyc6IG9iai5maWx0ZXJSdWxlcz8ubWFwKHkgPT4gdG9Kc29uX0J1Y2tldFNwZWNOb3RpZmljYXRpb25Ub3BpY0NvbmZpZ3VyYXRpb25zRmlsdGVyS2V5RmlsdGVyUnVsZXMoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgY29udGFpbmVyIGZvciBpbmZvcm1hdGlvbiBhYm91dCBhY2Nlc3MgY29udHJvbCBmb3IgcmVwbGljYXMuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uQWNjZXNzQ29udHJvbFRyYW5zbGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvbkFjY2Vzc0NvbnRyb2xUcmFuc2xhdGlvbiB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25BY2Nlc3NDb250cm9sVHJhbnNsYXRpb24jb3duZXJcbiAgICovXG4gIHJlYWRvbmx5IG93bmVyPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25BY2Nlc3NDb250cm9sVHJhbnNsYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25BY2Nlc3NDb250cm9sVHJhbnNsYXRpb24ob2JqOiBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uQWNjZXNzQ29udHJvbFRyYW5zbGF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnb3duZXInOiBvYmoub3duZXIsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIGVuY3J5cHRpb24tcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgYW4gQW1hem9uIFMzIGJ1Y2tldCB0aGF0IGlzIGEgZGVzdGluYXRpb24gZm9yIHJlcGxpY2F0ZWQgb2JqZWN0cy5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25FbmNyeXB0aW9uQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25FbmNyeXB0aW9uQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25FbmNyeXB0aW9uQ29uZmlndXJhdGlvbiNyZXBsaWNhS01TS2V5SURcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2FLbXNLZXlJZD86IHN0cmluZztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25FbmNyeXB0aW9uQ29uZmlndXJhdGlvbihvYmo6IEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25FbmNyeXB0aW9uQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3JlcGxpY2FLTVNLZXlJRCc6IG9iai5yZXBsaWNhS21zS2V5SWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBjb250YWluZXIgc3BlY2lmeWluZyByZXBsaWNhdGlvbiBtZXRyaWNzLXJlbGF0ZWQgc2V0dGluZ3MgZW5hYmxpbmcgcmVwbGljYXRpb24gbWV0cmljcyBhbmQgZXZlbnRzLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvbk1ldHJpY3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uTWV0cmljcyB7XG4gIC8qKlxuICAgKiBBIGNvbnRhaW5lciBzcGVjaWZ5aW5nIHRoZSB0aW1lIHZhbHVlIGZvciBTMyBSZXBsaWNhdGlvbiBUaW1lIENvbnRyb2wgKFMzIFJUQykgYW5kIHJlcGxpY2F0aW9uIG1ldHJpY3MgRXZlbnRUaHJlc2hvbGQuXG4gICAqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvbk1ldHJpY3MjZXZlbnRUaHJlc2hvbGRcbiAgICovXG4gIHJlYWRvbmx5IGV2ZW50VGhyZXNob2xkPzogQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvbk1ldHJpY3NFdmVudFRocmVzaG9sZDtcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uTWV0cmljcyNzdGF0dXNcbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1cz86IHN0cmluZztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uTWV0cmljcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvbk1ldHJpY3Mob2JqOiBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uTWV0cmljcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2V2ZW50VGhyZXNob2xkJzogdG9Kc29uX0J1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25NZXRyaWNzRXZlbnRUaHJlc2hvbGQob2JqLmV2ZW50VGhyZXNob2xkKSxcbiAgICAnc3RhdHVzJzogb2JqLnN0YXR1cyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGNvbnRhaW5lciBzcGVjaWZ5aW5nIFMzIFJlcGxpY2F0aW9uIFRpbWUgQ29udHJvbCAoUzMgUlRDKSByZWxhdGVkIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgd2hldGhlciBTMyBSVEMgaXMgZW5hYmxlZCBhbmQgdGhlIHRpbWUgd2hlbiBhbGwgb2JqZWN0cyBhbmQgb3BlcmF0aW9ucyBvbiBvYmplY3RzIG11c3QgYmUgcmVwbGljYXRlZC4gTXVzdCBiZSBzcGVjaWZpZWQgdG9nZXRoZXIgd2l0aCBhIE1ldHJpY3MgYmxvY2suXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uUmVwbGljYXRpb25UaW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvblJlcGxpY2F0aW9uVGltZSB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25SZXBsaWNhdGlvblRpbWUjc3RhdHVzXG4gICAqL1xuICByZWFkb25seSBzdGF0dXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgY29udGFpbmVyIHNwZWNpZnlpbmcgdGhlIHRpbWUgdmFsdWUgZm9yIFMzIFJlcGxpY2F0aW9uIFRpbWUgQ29udHJvbCAoUzMgUlRDKSBhbmQgcmVwbGljYXRpb24gbWV0cmljcyBFdmVudFRocmVzaG9sZC5cbiAgICpcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uUmVwbGljYXRpb25UaW1lI3RpbWVcbiAgICovXG4gIHJlYWRvbmx5IHRpbWU/OiBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uUmVwbGljYXRpb25UaW1lVGltZTtcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uUmVwbGljYXRpb25UaW1lJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uUmVwbGljYXRpb25UaW1lKG9iajogQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvblJlcGxpY2F0aW9uVGltZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3N0YXR1cyc6IG9iai5zdGF0dXMsXG4gICAgJ3RpbWUnOiB0b0pzb25fQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvblJlcGxpY2F0aW9uVGltZVRpbWUob2JqLnRpbWUpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgY29udGFpbmVyIGZvciBzcGVjaWZ5aW5nIHJ1bGUgZmlsdGVycy4gVGhlIGZpbHRlcnMgZGV0ZXJtaW5lIHRoZSBzdWJzZXQgb2Ygb2JqZWN0cyB0byB3aGljaCB0aGUgcnVsZSBhcHBsaWVzLiBUaGlzIGVsZW1lbnQgaXMgcmVxdWlyZWQgb25seSBpZiB5b3Ugc3BlY2lmeSBtb3JlIHRoYW4gb25lIGZpbHRlci5cbiAqIEZvciBleGFtcGxlOlxuICogKiBJZiB5b3Ugc3BlY2lmeSBib3RoIGEgUHJlZml4IGFuZCBhIFRhZyBmaWx0ZXIsIHdyYXAgdGhlc2UgZmlsdGVycyBpbiAgICBhbiBBbmQgdGFnLlxuICogKiBJZiB5b3Ugc3BlY2lmeSBhIGZpbHRlciBiYXNlZCBvbiBtdWx0aXBsZSB0YWdzLCB3cmFwIHRoZSBUYWcgZWxlbWVudHMgICAgaW4gYW4gQW5kIHRhZy5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRmlsdGVyQW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNGaWx0ZXJBbmQge1xuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0ZpbHRlckFuZCNwcmVmaXhcbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0ZpbHRlckFuZCN0YWdzXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNGaWx0ZXJBbmRUYWdzW107XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNGaWx0ZXJBbmQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRmlsdGVyQW5kKG9iajogQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNGaWx0ZXJBbmQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdwcmVmaXgnOiBvYmoucHJlZml4LFxuICAgICd0YWdzJzogb2JqLnRhZ3M/Lm1hcCh5ID0+IHRvSnNvbl9CdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0ZpbHRlckFuZFRhZ3MoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgY29udGFpbmVyIG9mIGEga2V5IHZhbHVlIG5hbWUgcGFpci5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRmlsdGVyVGFnXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNGaWx0ZXJUYWcge1xuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0ZpbHRlclRhZyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleT86IHN0cmluZztcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0ZpbHRlclRhZyN2YWx1ZVxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNGaWx0ZXJUYWcnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRmlsdGVyVGFnKG9iajogQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNGaWx0ZXJUYWcgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICd2YWx1ZSc6IG9iai52YWx1ZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGZpbHRlciB0aGF0IHlvdSBjYW4gc3BlY2lmeSBmb3Igc2VsZWN0aW9uIGZvciBtb2RpZmljYXRpb25zIG9uIHJlcGxpY2FzLiBBbWF6b24gUzMgZG9lc24ndCByZXBsaWNhdGUgcmVwbGljYSBtb2RpZmljYXRpb25zIGJ5IGRlZmF1bHQuIEluIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiByZXBsaWNhdGlvbiBjb25maWd1cmF0aW9uICh3aGVuIEZpbHRlciBpcyBzcGVjaWZpZWQpLCB5b3UgY2FuIHNwZWNpZnkgdGhpcyBlbGVtZW50IGFuZCBzZXQgdGhlIHN0YXR1cyB0byBFbmFibGVkIHRvIHJlcGxpY2F0ZSBtb2RpZmljYXRpb25zIG9uIHJlcGxpY2FzLlxuICogSWYgeW91IGRvbid0IHNwZWNpZnkgdGhlIEZpbHRlciBlbGVtZW50LCBBbWF6b24gUzMgYXNzdW1lcyB0aGF0IHRoZSByZXBsaWNhdGlvbiBjb25maWd1cmF0aW9uIGlzIHRoZSBlYXJsaWVyIHZlcnNpb24sIFYxLiBJbiB0aGUgZWFybGllciB2ZXJzaW9uLCB0aGlzIGVsZW1lbnQgaXMgbm90IGFsbG93ZWQuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc1NvdXJjZVNlbGVjdGlvbkNyaXRlcmlhUmVwbGljYU1vZGlmaWNhdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc1NvdXJjZVNlbGVjdGlvbkNyaXRlcmlhUmVwbGljYU1vZGlmaWNhdGlvbnMge1xuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc1NvdXJjZVNlbGVjdGlvbkNyaXRlcmlhUmVwbGljYU1vZGlmaWNhdGlvbnMjc3RhdHVzXG4gICAqL1xuICByZWFkb25seSBzdGF0dXM/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNTb3VyY2VTZWxlY3Rpb25Dcml0ZXJpYVJlcGxpY2FNb2RpZmljYXRpb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc1NvdXJjZVNlbGVjdGlvbkNyaXRlcmlhUmVwbGljYU1vZGlmaWNhdGlvbnMob2JqOiBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc1NvdXJjZVNlbGVjdGlvbkNyaXRlcmlhUmVwbGljYU1vZGlmaWNhdGlvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdzdGF0dXMnOiBvYmouc3RhdHVzLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgY29udGFpbmVyIGZvciBmaWx0ZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBzZWxlY3Rpb24gb2YgUzMgb2JqZWN0cyBlbmNyeXB0ZWQgd2l0aCBBbWF6b24gV2ViIFNlcnZpY2VzIEtNUy5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzU291cmNlU2VsZWN0aW9uQ3JpdGVyaWFTc2VLbXNFbmNyeXB0ZWRPYmplY3RzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNTb3VyY2VTZWxlY3Rpb25Dcml0ZXJpYVNzZUttc0VuY3J5cHRlZE9iamVjdHMge1xuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc1NvdXJjZVNlbGVjdGlvbkNyaXRlcmlhU3NlS21zRW5jcnlwdGVkT2JqZWN0cyNzdGF0dXNcbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1cz86IHN0cmluZztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc1NvdXJjZVNlbGVjdGlvbkNyaXRlcmlhU3NlS21zRW5jcnlwdGVkT2JqZWN0cycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNTb3VyY2VTZWxlY3Rpb25Dcml0ZXJpYVNzZUttc0VuY3J5cHRlZE9iamVjdHMob2JqOiBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc1NvdXJjZVNlbGVjdGlvbkNyaXRlcmlhU3NlS21zRW5jcnlwdGVkT2JqZWN0cyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3N0YXR1cyc6IG9iai5zdGF0dXMsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgd2hlcmUgdG8gcHVibGlzaCB0aGUgYW5hbHl0aWNzIHJlc3VsdHMuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjQW5hbHl0aWNzU3RvcmFnZUNsYXNzQW5hbHlzaXNEYXRhRXhwb3J0RGVzdGluYXRpb25TM0J1Y2tldERlc3RpbmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY0FuYWx5dGljc1N0b3JhZ2VDbGFzc0FuYWx5c2lzRGF0YUV4cG9ydERlc3RpbmF0aW9uUzNCdWNrZXREZXN0aW5hdGlvbiB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNBbmFseXRpY3NTdG9yYWdlQ2xhc3NBbmFseXNpc0RhdGFFeHBvcnREZXN0aW5hdGlvblMzQnVja2V0RGVzdGluYXRpb24jYnVja2V0XG4gICAqL1xuICByZWFkb25seSBidWNrZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0FuYWx5dGljc1N0b3JhZ2VDbGFzc0FuYWx5c2lzRGF0YUV4cG9ydERlc3RpbmF0aW9uUzNCdWNrZXREZXN0aW5hdGlvbiNidWNrZXRBY2NvdW50SURcbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldEFjY291bnRJZD86IHN0cmluZztcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjQW5hbHl0aWNzU3RvcmFnZUNsYXNzQW5hbHlzaXNEYXRhRXhwb3J0RGVzdGluYXRpb25TM0J1Y2tldERlc3RpbmF0aW9uI2Zvcm1hdFxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNBbmFseXRpY3NTdG9yYWdlQ2xhc3NBbmFseXNpc0RhdGFFeHBvcnREZXN0aW5hdGlvblMzQnVja2V0RGVzdGluYXRpb24jcHJlZml4XG4gICAqL1xuICByZWFkb25seSBwcmVmaXg/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY0FuYWx5dGljc1N0b3JhZ2VDbGFzc0FuYWx5c2lzRGF0YUV4cG9ydERlc3RpbmF0aW9uUzNCdWNrZXREZXN0aW5hdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY0FuYWx5dGljc1N0b3JhZ2VDbGFzc0FuYWx5c2lzRGF0YUV4cG9ydERlc3RpbmF0aW9uUzNCdWNrZXREZXN0aW5hdGlvbihvYmo6IEJ1Y2tldFNwZWNBbmFseXRpY3NTdG9yYWdlQ2xhc3NBbmFseXNpc0RhdGFFeHBvcnREZXN0aW5hdGlvblMzQnVja2V0RGVzdGluYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdidWNrZXQnOiBvYmouYnVja2V0LFxuICAgICdidWNrZXRBY2NvdW50SUQnOiBvYmouYnVja2V0QWNjb3VudElkLFxuICAgICdmb3JtYXQnOiBvYmouZm9ybWF0LFxuICAgICdwcmVmaXgnOiBvYmoucHJlZml4LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgdXNlIG9mIFNTRS1LTVMgdG8gZW5jcnlwdCBkZWxpdmVyZWQgaW52ZW50b3J5IHJlcG9ydHMuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjSW52ZW50b3J5RGVzdGluYXRpb25TM0J1Y2tldERlc3RpbmF0aW9uRW5jcnlwdGlvblNzZUttc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNJbnZlbnRvcnlEZXN0aW5hdGlvblMzQnVja2V0RGVzdGluYXRpb25FbmNyeXB0aW9uU3NlS21zIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY0ludmVudG9yeURlc3RpbmF0aW9uUzNCdWNrZXREZXN0aW5hdGlvbkVuY3J5cHRpb25Tc2VLbXMja2V5SURcbiAgICovXG4gIHJlYWRvbmx5IGtleUlkPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNJbnZlbnRvcnlEZXN0aW5hdGlvblMzQnVja2V0RGVzdGluYXRpb25FbmNyeXB0aW9uU3NlS21zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjSW52ZW50b3J5RGVzdGluYXRpb25TM0J1Y2tldERlc3RpbmF0aW9uRW5jcnlwdGlvblNzZUttcyhvYmo6IEJ1Y2tldFNwZWNJbnZlbnRvcnlEZXN0aW5hdGlvblMzQnVja2V0RGVzdGluYXRpb25FbmNyeXB0aW9uU3NlS21zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5SUQnOiBvYmoua2V5SWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBjb250YWluZXIgb2YgYSBrZXkgdmFsdWUgbmFtZSBwYWlyLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY0xpZmVjeWNsZVJ1bGVzRmlsdGVyQW5kVGFnc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlckFuZFRhZ3Mge1xuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNGaWx0ZXJBbmRUYWdzI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlckFuZFRhZ3MjdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlckFuZFRhZ3MnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNMaWZlY3ljbGVSdWxlc0ZpbHRlckFuZFRhZ3Mob2JqOiBCdWNrZXRTcGVjTGlmZWN5Y2xlUnVsZXNGaWx0ZXJBbmRUYWdzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAndmFsdWUnOiBvYmoudmFsdWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBBbWF6b24gUzMgb2JqZWN0IGtleSBuYW1lIHRvIGZpbHRlciBvbiBhbmQgd2hldGhlciB0byBmaWx0ZXIgb24gdGhlIHN1ZmZpeCBvciBwcmVmaXggb2YgdGhlIGtleSBuYW1lLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY05vdGlmaWNhdGlvbkxhbWJkYUZ1bmN0aW9uQ29uZmlndXJhdGlvbnNGaWx0ZXJLZXlGaWx0ZXJSdWxlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNOb3RpZmljYXRpb25MYW1iZGFGdW5jdGlvbkNvbmZpZ3VyYXRpb25zRmlsdGVyS2V5RmlsdGVyUnVsZXMge1xuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTm90aWZpY2F0aW9uTGFtYmRhRnVuY3Rpb25Db25maWd1cmF0aW9uc0ZpbHRlcktleUZpbHRlclJ1bGVzI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY05vdGlmaWNhdGlvbkxhbWJkYUZ1bmN0aW9uQ29uZmlndXJhdGlvbnNGaWx0ZXJLZXlGaWx0ZXJSdWxlcyN2YWx1ZVxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY05vdGlmaWNhdGlvbkxhbWJkYUZ1bmN0aW9uQ29uZmlndXJhdGlvbnNGaWx0ZXJLZXlGaWx0ZXJSdWxlcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY05vdGlmaWNhdGlvbkxhbWJkYUZ1bmN0aW9uQ29uZmlndXJhdGlvbnNGaWx0ZXJLZXlGaWx0ZXJSdWxlcyhvYmo6IEJ1Y2tldFNwZWNOb3RpZmljYXRpb25MYW1iZGFGdW5jdGlvbkNvbmZpZ3VyYXRpb25zRmlsdGVyS2V5RmlsdGVyUnVsZXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ3ZhbHVlJzogb2JqLnZhbHVlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgQW1hem9uIFMzIG9iamVjdCBrZXkgbmFtZSB0byBmaWx0ZXIgb24gYW5kIHdoZXRoZXIgdG8gZmlsdGVyIG9uIHRoZSBzdWZmaXggb3IgcHJlZml4IG9mIHRoZSBrZXkgbmFtZS5cbiAqXG4gKiBAc2NoZW1hIEJ1Y2tldFNwZWNOb3RpZmljYXRpb25RdWV1ZUNvbmZpZ3VyYXRpb25zRmlsdGVyS2V5RmlsdGVyUnVsZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjTm90aWZpY2F0aW9uUXVldWVDb25maWd1cmF0aW9uc0ZpbHRlcktleUZpbHRlclJ1bGVzIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY05vdGlmaWNhdGlvblF1ZXVlQ29uZmlndXJhdGlvbnNGaWx0ZXJLZXlGaWx0ZXJSdWxlcyNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNOb3RpZmljYXRpb25RdWV1ZUNvbmZpZ3VyYXRpb25zRmlsdGVyS2V5RmlsdGVyUnVsZXMjdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1Y2tldFNwZWNOb3RpZmljYXRpb25RdWV1ZUNvbmZpZ3VyYXRpb25zRmlsdGVyS2V5RmlsdGVyUnVsZXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNOb3RpZmljYXRpb25RdWV1ZUNvbmZpZ3VyYXRpb25zRmlsdGVyS2V5RmlsdGVyUnVsZXMob2JqOiBCdWNrZXRTcGVjTm90aWZpY2F0aW9uUXVldWVDb25maWd1cmF0aW9uc0ZpbHRlcktleUZpbHRlclJ1bGVzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICd2YWx1ZSc6IG9iai52YWx1ZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIEFtYXpvbiBTMyBvYmplY3Qga2V5IG5hbWUgdG8gZmlsdGVyIG9uIGFuZCB3aGV0aGVyIHRvIGZpbHRlciBvbiB0aGUgc3VmZml4IG9yIHByZWZpeCBvZiB0aGUga2V5IG5hbWUuXG4gKlxuICogQHNjaGVtYSBCdWNrZXRTcGVjTm90aWZpY2F0aW9uVG9waWNDb25maWd1cmF0aW9uc0ZpbHRlcktleUZpbHRlclJ1bGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY05vdGlmaWNhdGlvblRvcGljQ29uZmlndXJhdGlvbnNGaWx0ZXJLZXlGaWx0ZXJSdWxlcyB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNOb3RpZmljYXRpb25Ub3BpY0NvbmZpZ3VyYXRpb25zRmlsdGVyS2V5RmlsdGVyUnVsZXMjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjTm90aWZpY2F0aW9uVG9waWNDb25maWd1cmF0aW9uc0ZpbHRlcktleUZpbHRlclJ1bGVzI3ZhbHVlXG4gICAqL1xuICByZWFkb25seSB2YWx1ZT86IHN0cmluZztcblxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCdWNrZXRTcGVjTm90aWZpY2F0aW9uVG9waWNDb25maWd1cmF0aW9uc0ZpbHRlcktleUZpbHRlclJ1bGVzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjTm90aWZpY2F0aW9uVG9waWNDb25maWd1cmF0aW9uc0ZpbHRlcktleUZpbHRlclJ1bGVzKG9iajogQnVja2V0U3BlY05vdGlmaWNhdGlvblRvcGljQ29uZmlndXJhdGlvbnNGaWx0ZXJLZXlGaWx0ZXJSdWxlcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAndmFsdWUnOiBvYmoudmFsdWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBjb250YWluZXIgc3BlY2lmeWluZyB0aGUgdGltZSB2YWx1ZSBmb3IgUzMgUmVwbGljYXRpb24gVGltZSBDb250cm9sIChTMyBSVEMpIGFuZCByZXBsaWNhdGlvbiBtZXRyaWNzIEV2ZW50VGhyZXNob2xkLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvbk1ldHJpY3NFdmVudFRocmVzaG9sZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25NZXRyaWNzRXZlbnRUaHJlc2hvbGQge1xuICAvKipcbiAgICogQHNjaGVtYSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uTWV0cmljc0V2ZW50VGhyZXNob2xkI21pbnV0ZXNcbiAgICovXG4gIHJlYWRvbmx5IG1pbnV0ZXM/OiBudW1iZXI7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvbk1ldHJpY3NFdmVudFRocmVzaG9sZCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvbk1ldHJpY3NFdmVudFRocmVzaG9sZChvYmo6IEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25NZXRyaWNzRXZlbnRUaHJlc2hvbGQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtaW51dGVzJzogb2JqLm1pbnV0ZXMsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBjb250YWluZXIgc3BlY2lmeWluZyB0aGUgdGltZSB2YWx1ZSBmb3IgUzMgUmVwbGljYXRpb24gVGltZSBDb250cm9sIChTMyBSVEMpIGFuZCByZXBsaWNhdGlvbiBtZXRyaWNzIEV2ZW50VGhyZXNob2xkLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvblJlcGxpY2F0aW9uVGltZVRpbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0Rlc3RpbmF0aW9uUmVwbGljYXRpb25UaW1lVGltZSB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25SZXBsaWNhdGlvblRpbWVUaW1lI21pbnV0ZXNcbiAgICovXG4gIHJlYWRvbmx5IG1pbnV0ZXM/OiBudW1iZXI7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvblJlcGxpY2F0aW9uVGltZVRpbWUnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRGVzdGluYXRpb25SZXBsaWNhdGlvblRpbWVUaW1lKG9iajogQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNEZXN0aW5hdGlvblJlcGxpY2F0aW9uVGltZVRpbWUgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtaW51dGVzJzogb2JqLm1pbnV0ZXMsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBjb250YWluZXIgb2YgYSBrZXkgdmFsdWUgbmFtZSBwYWlyLlxuICpcbiAqIEBzY2hlbWEgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNGaWx0ZXJBbmRUYWdzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNGaWx0ZXJBbmRUYWdzIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNGaWx0ZXJBbmRUYWdzI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIEJ1Y2tldFNwZWNSZXBsaWNhdGlvblJ1bGVzRmlsdGVyQW5kVGFncyN2YWx1ZVxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQnVja2V0U3BlY1JlcGxpY2F0aW9uUnVsZXNGaWx0ZXJBbmRUYWdzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0ZpbHRlckFuZFRhZ3Mob2JqOiBCdWNrZXRTcGVjUmVwbGljYXRpb25SdWxlc0ZpbHRlckFuZFRhZ3MgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICd2YWx1ZSc6IG9iai52YWx1ZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuIl19