@aws-cdk/aws-medialive-alpha 2.268.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +60888 -0
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +524 -0
- package/LICENSE +201 -0
- package/NOTICE +2 -0
- package/README.md +1297 -0
- package/grants.json +27 -0
- package/lib/audio-codec-settings.d.ts +901 -0
- package/lib/audio-codec-settings.js +1098 -0
- package/lib/audio-selector.d.ts +170 -0
- package/lib/audio-selector.js +306 -0
- package/lib/avail-settings.d.ts +231 -0
- package/lib/avail-settings.js +226 -0
- package/lib/caption-selector.d.ts +234 -0
- package/lib/caption-selector.js +413 -0
- package/lib/caption-settings.d.ts +349 -0
- package/lib/caption-settings.js +482 -0
- package/lib/channel-features.d.ts +106 -0
- package/lib/channel-features.js +85 -0
- package/lib/channel-placement-group.d.ts +73 -0
- package/lib/channel-placement-group.js +132 -0
- package/lib/channel.d.ts +687 -0
- package/lib/channel.js +1096 -0
- package/lib/cluster.d.ts +129 -0
- package/lib/cluster.js +158 -0
- package/lib/color-correction.d.ts +39 -0
- package/lib/color-correction.js +29 -0
- package/lib/destinations.d.ts +242 -0
- package/lib/destinations.js +455 -0
- package/lib/encode-configuration.d.ts +615 -0
- package/lib/encode-configuration.js +629 -0
- package/lib/enums.d.ts +698 -0
- package/lib/enums.js +1045 -0
- package/lib/file-location.d.ts +65 -0
- package/lib/file-location.js +150 -0
- package/lib/framerate.d.ts +31 -0
- package/lib/framerate.js +71 -0
- package/lib/index.d.ts +26 -0
- package/lib/index.js +43 -0
- package/lib/input-attachment.d.ts +319 -0
- package/lib/input-attachment.js +228 -0
- package/lib/input-security-group.d.ts +51 -0
- package/lib/input-security-group.js +123 -0
- package/lib/input-specification.d.ts +111 -0
- package/lib/input-specification.js +181 -0
- package/lib/input.d.ts +505 -0
- package/lib/input.js +803 -0
- package/lib/m2ts-settings.d.ts +421 -0
- package/lib/m2ts-settings.js +469 -0
- package/lib/m3u8-settings.d.ts +272 -0
- package/lib/m3u8-settings.js +304 -0
- package/lib/medialive-grants.generated.d.ts +30 -0
- package/lib/medialive-grants.generated.js +92 -0
- package/lib/network.d.ts +83 -0
- package/lib/network.js +132 -0
- package/lib/output-group.d.ts +924 -0
- package/lib/output-group.js +941 -0
- package/lib/outputs.d.ts +304 -0
- package/lib/outputs.js +598 -0
- package/lib/sdi-source.d.ts +124 -0
- package/lib/sdi-source.js +180 -0
- package/lib/shared.d.ts +44 -0
- package/lib/shared.js +146 -0
- package/lib/video-codec-settings.d.ts +1500 -0
- package/lib/video-codec-settings.js +1722 -0
- package/lib/video-selection.d.ts +92 -0
- package/lib/video-selection.js +95 -0
- package/package.json +135 -0
- package/rosetta/_generated.ts-fixture +6 -0
- package/rosetta/default.ts-fixture +21 -0
|
@@ -0,0 +1,941 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.OutputGroup = exports.HlsCdnSettings = exports.HlsKeyProviderSettings = exports.OutputGroupConfiguration = void 0;
|
|
18
|
+
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
19
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
20
|
+
__exportStar(require("./destinations"), exports);
|
|
21
|
+
__exportStar(require("./enums"), exports);
|
|
22
|
+
__exportStar(require("./outputs"), exports);
|
|
23
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
24
|
+
const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
|
|
25
|
+
const destinations_1 = require("./destinations");
|
|
26
|
+
const enums_1 = require("./enums");
|
|
27
|
+
const outputs_1 = require("./outputs");
|
|
28
|
+
/** @internal */
|
|
29
|
+
function validateDestinationCount(groupName, channelClass, destinationCount, additionalCount, allowAdditional) {
|
|
30
|
+
const isStandard = channelClass === 'STANDARD';
|
|
31
|
+
const requiredPrimary = isStandard ? 2 : 1;
|
|
32
|
+
if (destinationCount !== requiredPrimary) {
|
|
33
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `DestinationCount`, `Output group '${groupName}' requires exactly ${requiredPrimary}`
|
|
34
|
+
+ ` primary destination(s) for a ${channelClass} channel, but ${destinationCount} provided.`);
|
|
35
|
+
}
|
|
36
|
+
if (additionalCount > 0 && !allowAdditional) {
|
|
37
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `AdditionalDestinations`, `Output group '${groupName}' does not support additional destinations.`);
|
|
38
|
+
}
|
|
39
|
+
const maxAdditional = isStandard ? 2 : 1;
|
|
40
|
+
if (additionalCount > maxAdditional) {
|
|
41
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `AdditionalDestinationCount`, `Output group '${groupName}' allows at most ${maxAdditional}`
|
|
42
|
+
+ ` additional destination(s) for a ${channelClass} channel, but ${additionalCount} provided.`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// =============================================================================
|
|
46
|
+
// OutputGroupConfiguration (abstract base + subclasses)
|
|
47
|
+
// =============================================================================
|
|
48
|
+
/**
|
|
49
|
+
* Configuration for an output group. Use the static factory methods to create.
|
|
50
|
+
*/
|
|
51
|
+
class OutputGroupConfiguration {
|
|
52
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.OutputGroupConfiguration", version: "2.268.0-alpha.0" };
|
|
53
|
+
/**
|
|
54
|
+
* Create a MediaPackage V2 output group that delivers to a single channel, auto-mapping each
|
|
55
|
+
* pipeline to a MediaPackage ingest endpoint based on the channel class.
|
|
56
|
+
*/
|
|
57
|
+
static mediaPackageV2(props) {
|
|
58
|
+
try {
|
|
59
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_MediaPackageV2OutputGroupProps(props);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
63
|
+
Error.captureStackTrace(error, this.mediaPackageV2);
|
|
64
|
+
}
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
return new MediaPackageV2OutputGroupConfiguration(props, props.channel, undefined);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Create a MediaPackage V2 output group with explicit per-pipeline destinations (channel +
|
|
71
|
+
* endpoint per pipeline). Use for cross-region delivery or pinning a pipeline to an endpoint.
|
|
72
|
+
*/
|
|
73
|
+
static mediaPackageV2PerPipeline(props) {
|
|
74
|
+
try {
|
|
75
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_MediaPackageV2PerPipelineOutputGroupProps(props);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
79
|
+
Error.captureStackTrace(error, this.mediaPackageV2PerPipeline);
|
|
80
|
+
}
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
return new MediaPackageV2OutputGroupConfiguration(props, undefined, props.destinations);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Create a MediaConnect Router output group, delivering each channel pipeline to a MediaConnect
|
|
87
|
+
* Router. Transit encryption defaults to AUTOMATIC; override per pipeline via `routerSettings`.
|
|
88
|
+
*
|
|
89
|
+
* The downstream wiring (which router input each pipeline feeds) is configured on the
|
|
90
|
+
* MediaConnect side, referencing this output group by `name` and the pipeline id.
|
|
91
|
+
*/
|
|
92
|
+
static mediaConnectRouter(props) {
|
|
93
|
+
try {
|
|
94
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_MediaConnectRouterOutputGroupProps(props);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
98
|
+
Error.captureStackTrace(error, this.mediaConnectRouter);
|
|
99
|
+
}
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
return new MediaConnectRouterOutputGroupConfiguration(props);
|
|
103
|
+
}
|
|
104
|
+
/** Create an HLS output group configuration. */
|
|
105
|
+
static hls(props) {
|
|
106
|
+
try {
|
|
107
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_HlsOutputGroupProps(props);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
111
|
+
Error.captureStackTrace(error, this.hls);
|
|
112
|
+
}
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
return new HlsOutputGroupConfiguration(props);
|
|
116
|
+
}
|
|
117
|
+
/** Create a UDP output group configuration. */
|
|
118
|
+
static udp(props) {
|
|
119
|
+
try {
|
|
120
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_UdpOutputGroupProps(props);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
124
|
+
Error.captureStackTrace(error, this.udp);
|
|
125
|
+
}
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
return new UdpOutputGroupConfiguration(props);
|
|
129
|
+
}
|
|
130
|
+
/** Create an Archive (S3) output group configuration. */
|
|
131
|
+
static archive(props) {
|
|
132
|
+
try {
|
|
133
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_ArchiveOutputGroupProps(props);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
137
|
+
Error.captureStackTrace(error, this.archive);
|
|
138
|
+
}
|
|
139
|
+
throw error;
|
|
140
|
+
}
|
|
141
|
+
return new ArchiveOutputGroupConfiguration(props);
|
|
142
|
+
}
|
|
143
|
+
/** Create an RTMP output group configuration. */
|
|
144
|
+
static rtmp(props) {
|
|
145
|
+
try {
|
|
146
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_RtmpOutputGroupProps(props);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
150
|
+
Error.captureStackTrace(error, this.rtmp);
|
|
151
|
+
}
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
return new RtmpOutputGroupConfiguration(props);
|
|
155
|
+
}
|
|
156
|
+
/** Create an SRT output group configuration. */
|
|
157
|
+
static srt(props) {
|
|
158
|
+
try {
|
|
159
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_SrtOutputGroupProps(props);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
163
|
+
Error.captureStackTrace(error, this.srt);
|
|
164
|
+
}
|
|
165
|
+
throw error;
|
|
166
|
+
}
|
|
167
|
+
return new SrtOutputGroupConfiguration(props);
|
|
168
|
+
}
|
|
169
|
+
/** Create a CMAF Ingest output group configuration. */
|
|
170
|
+
static cmafIngest(props) {
|
|
171
|
+
try {
|
|
172
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_CmafIngestOutputGroupProps(props);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
176
|
+
Error.captureStackTrace(error, this.cmafIngest);
|
|
177
|
+
}
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
return new CmafIngestOutputGroupConfiguration(props);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Create a Frame Capture output group configuration.
|
|
184
|
+
*
|
|
185
|
+
* A channel that includes a Frame Capture output group must also include
|
|
186
|
+
* a separate video output group (e.g. Archive, HLS, UDP). Frame Capture
|
|
187
|
+
* cannot be the channel's only output group.
|
|
188
|
+
*/
|
|
189
|
+
static frameCapture(props) {
|
|
190
|
+
try {
|
|
191
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_FrameCaptureOutputGroupProps(props);
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
195
|
+
Error.captureStackTrace(error, this.frameCapture);
|
|
196
|
+
}
|
|
197
|
+
throw error;
|
|
198
|
+
}
|
|
199
|
+
return new FrameCaptureOutputGroupConfiguration(props);
|
|
200
|
+
}
|
|
201
|
+
/** Create an MS Smooth output group configuration. */
|
|
202
|
+
static msSmooth(props) {
|
|
203
|
+
try {
|
|
204
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_MsSmoothOutputGroupProps(props);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
208
|
+
Error.captureStackTrace(error, this.msSmooth);
|
|
209
|
+
}
|
|
210
|
+
throw error;
|
|
211
|
+
}
|
|
212
|
+
return new MsSmoothOutputGroupConfiguration(props);
|
|
213
|
+
}
|
|
214
|
+
/** @internal - Grant permissions to the channel role for resources referenced by destinations. */
|
|
215
|
+
_grantPermissions(_role) { }
|
|
216
|
+
/**
|
|
217
|
+
* Whether any output in this group has an SRT listener-mode destination. Used by the channel to
|
|
218
|
+
* decide whether channel security groups are required, without triggering destination binding.
|
|
219
|
+
* @internal
|
|
220
|
+
*/
|
|
221
|
+
_hasSrtListenerDestination() { return false; }
|
|
222
|
+
/**
|
|
223
|
+
* HLS uses this to select a compatible default program-date-time clock
|
|
224
|
+
* (the service requires INITIALIZE_FROM_OUTPUT_TIMECODE for epoch locking).
|
|
225
|
+
* @internal
|
|
226
|
+
*/
|
|
227
|
+
_setEpochLocking(_active) { }
|
|
228
|
+
/**
|
|
229
|
+
* Whether this group explicitly requests an HLS program date time clock of SYSTEM_CLOCK, which
|
|
230
|
+
* is incompatible with epoch output locking. Only HLS groups can return true.
|
|
231
|
+
* @internal
|
|
232
|
+
*/
|
|
233
|
+
_hasExplicitSystemClock() { return false; }
|
|
234
|
+
}
|
|
235
|
+
exports.OutputGroupConfiguration = OutputGroupConfiguration;
|
|
236
|
+
/**
|
|
237
|
+
* Key provider settings for HLS encryption.
|
|
238
|
+
*/
|
|
239
|
+
class HlsKeyProviderSettings {
|
|
240
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.HlsKeyProviderSettings", version: "2.268.0-alpha.0" };
|
|
241
|
+
/** Use a static key for HLS encryption. */
|
|
242
|
+
static staticKey(props) {
|
|
243
|
+
try {
|
|
244
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_HlsStaticKeyProps(props);
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
248
|
+
Error.captureStackTrace(error, this.staticKey);
|
|
249
|
+
}
|
|
250
|
+
throw error;
|
|
251
|
+
}
|
|
252
|
+
return new HlsKeyProviderSettings({
|
|
253
|
+
staticKeySettings: {
|
|
254
|
+
keyProviderServer: { uri: props.keyProviderServerUrl },
|
|
255
|
+
staticKeyValue: props.staticKeyValue.unsafeUnwrap(), // Safe usage: rendered as CFN dynamic reference
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
config;
|
|
260
|
+
constructor(config) { this.config = config; }
|
|
261
|
+
/** @internal */
|
|
262
|
+
_bind() { return this.config; }
|
|
263
|
+
}
|
|
264
|
+
exports.HlsKeyProviderSettings = HlsKeyProviderSettings;
|
|
265
|
+
/**
|
|
266
|
+
* CDN settings for HLS output groups.
|
|
267
|
+
*/
|
|
268
|
+
class HlsCdnSettings {
|
|
269
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.HlsCdnSettings", version: "2.268.0-alpha.0" };
|
|
270
|
+
/** Use Amazon S3 as the CDN for HLS output. */
|
|
271
|
+
static s3(props) {
|
|
272
|
+
try {
|
|
273
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_HlsS3CdnProps(props);
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
277
|
+
Error.captureStackTrace(error, this.s3);
|
|
278
|
+
}
|
|
279
|
+
throw error;
|
|
280
|
+
}
|
|
281
|
+
return new HlsCdnSettings({ hlsS3Settings: { cannedAcl: props?.cannedAcl?.value } });
|
|
282
|
+
}
|
|
283
|
+
/** Use a basic HTTP PUT for HLS output. */
|
|
284
|
+
static basicPut(props) {
|
|
285
|
+
try {
|
|
286
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_HlsBasicPutCdnProps(props);
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
290
|
+
Error.captureStackTrace(error, this.basicPut);
|
|
291
|
+
}
|
|
292
|
+
throw error;
|
|
293
|
+
}
|
|
294
|
+
return new HlsCdnSettings({
|
|
295
|
+
hlsBasicPutSettings: {
|
|
296
|
+
connectionRetryInterval: props?.connectionRetryInterval ?? 1,
|
|
297
|
+
filecacheDuration: props?.filecacheDuration?.toSeconds() ?? 300,
|
|
298
|
+
numRetries: props?.numRetries ?? 10,
|
|
299
|
+
restartDelay: props?.restartDelay ?? 1,
|
|
300
|
+
},
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
/** Use Akamai as the CDN for HLS output. */
|
|
304
|
+
static akamai(props) {
|
|
305
|
+
try {
|
|
306
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_HlsAkamaiCdnProps(props);
|
|
307
|
+
}
|
|
308
|
+
catch (error) {
|
|
309
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
310
|
+
Error.captureStackTrace(error, this.akamai);
|
|
311
|
+
}
|
|
312
|
+
throw error;
|
|
313
|
+
}
|
|
314
|
+
return new HlsCdnSettings({
|
|
315
|
+
hlsAkamaiSettings: {
|
|
316
|
+
connectionRetryInterval: props?.connectionRetryInterval ?? 1,
|
|
317
|
+
filecacheDuration: props?.filecacheDuration?.toSeconds() ?? 300,
|
|
318
|
+
numRetries: props?.numRetries ?? 10,
|
|
319
|
+
restartDelay: props?.restartDelay ?? 1,
|
|
320
|
+
httpTransferMode: (props?.httpTransferMode ?? enums_1.HttpTransferMode.NON_CHUNKED).value,
|
|
321
|
+
salt: props?.salt,
|
|
322
|
+
token: props?.token,
|
|
323
|
+
},
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
/** Use WebDAV as the CDN for HLS output. */
|
|
327
|
+
static webdav(props) {
|
|
328
|
+
try {
|
|
329
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_HlsWebdavCdnProps(props);
|
|
330
|
+
}
|
|
331
|
+
catch (error) {
|
|
332
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
333
|
+
Error.captureStackTrace(error, this.webdav);
|
|
334
|
+
}
|
|
335
|
+
throw error;
|
|
336
|
+
}
|
|
337
|
+
return new HlsCdnSettings({
|
|
338
|
+
hlsWebdavSettings: {
|
|
339
|
+
connectionRetryInterval: props?.connectionRetryInterval ?? 1,
|
|
340
|
+
filecacheDuration: props?.filecacheDuration?.toSeconds() ?? 300,
|
|
341
|
+
numRetries: props?.numRetries ?? 10,
|
|
342
|
+
restartDelay: props?.restartDelay ?? 1,
|
|
343
|
+
httpTransferMode: (props?.httpTransferMode ?? enums_1.HttpTransferMode.NON_CHUNKED).value,
|
|
344
|
+
},
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
config;
|
|
348
|
+
constructor(config) { this.config = config; }
|
|
349
|
+
/** @internal */
|
|
350
|
+
_bind() { return this.config; }
|
|
351
|
+
}
|
|
352
|
+
exports.HlsCdnSettings = HlsCdnSettings;
|
|
353
|
+
// =============================================================================
|
|
354
|
+
// OutputGroupConfiguration subclasses
|
|
355
|
+
// =============================================================================
|
|
356
|
+
/** @internal */
|
|
357
|
+
class MediaPackageV2OutputGroupConfiguration extends OutputGroupConfiguration {
|
|
358
|
+
props;
|
|
359
|
+
autoChannel;
|
|
360
|
+
explicitDestinations;
|
|
361
|
+
_name;
|
|
362
|
+
constructor(props, autoChannel, explicitDestinations) {
|
|
363
|
+
super();
|
|
364
|
+
this.props = props;
|
|
365
|
+
this.autoChannel = autoChannel;
|
|
366
|
+
this.explicitDestinations = explicitDestinations;
|
|
367
|
+
this._name = props.name;
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* The primary destinations. For the auto variant they are derived from the channel class
|
|
371
|
+
* (one per pipeline, each with its endpoint); for the custom variant they are user-supplied.
|
|
372
|
+
*/
|
|
373
|
+
primaryDestinations(channelClass) {
|
|
374
|
+
if (this.autoChannel) {
|
|
375
|
+
return channelClass === 'STANDARD'
|
|
376
|
+
? [
|
|
377
|
+
destinations_1.MediaPackageV2Destination.channel(this.autoChannel, destinations_1.MediaPackageV2EndpointId.ENDPOINT_1),
|
|
378
|
+
destinations_1.MediaPackageV2Destination.channel(this.autoChannel, destinations_1.MediaPackageV2EndpointId.ENDPOINT_2),
|
|
379
|
+
]
|
|
380
|
+
: [destinations_1.MediaPackageV2Destination.channel(this.autoChannel, destinations_1.MediaPackageV2EndpointId.ENDPOINT_1)];
|
|
381
|
+
}
|
|
382
|
+
return this.explicitDestinations ?? [];
|
|
383
|
+
}
|
|
384
|
+
_createInitialOutputs() {
|
|
385
|
+
return this.props.outputs.map(def => new outputs_1.MediaPackageV2Output(def, this._name));
|
|
386
|
+
}
|
|
387
|
+
_bind() {
|
|
388
|
+
const additional = this.props.additionalDestinations ?? [];
|
|
389
|
+
return {
|
|
390
|
+
mediaPackageGroupSettings: {
|
|
391
|
+
destination: { destinationRefId: (0, outputs_1.toDestinationId)(this.props.name) },
|
|
392
|
+
mediapackageV2GroupSettings: {
|
|
393
|
+
additionalDestinations: additional.length > 0
|
|
394
|
+
? additional.map((_dest, i) => ({
|
|
395
|
+
destination: { destinationRefId: `${(0, outputs_1.toDestinationId)(this.props.name)}-additional-${i}` },
|
|
396
|
+
}))
|
|
397
|
+
: undefined,
|
|
398
|
+
segmentLength: this.props.segment?._length() ?? 1,
|
|
399
|
+
segmentLengthUnits: this.props.segment?._units() ?? enums_1.SegmentLengthUnits.SECONDS,
|
|
400
|
+
id3Behavior: (this.props.id3Behavior ?? enums_1.Id3Behavior.DISABLED).value,
|
|
401
|
+
klvBehavior: (this.props.klvBehavior ?? enums_1.KlvBehavior.NO_PASSTHROUGH).value,
|
|
402
|
+
nielsenId3Behavior: (this.props.nielsenId3Behavior ?? enums_1.NielsenId3Behavior.NO_PASSTHROUGH).value,
|
|
403
|
+
scte35Type: (this.props.scte35Type ?? enums_1.Scte35Type.SCTE_35_WITHOUT_SEGMENTATION).value,
|
|
404
|
+
timedMetadataId3Frame: (this.props.timedMetadataId3Frame ?? enums_1.TimedMetadataId3Frame.NONE).value,
|
|
405
|
+
timedMetadataId3Period: this.props.timedMetadataId3Period?.toSeconds() ?? 10,
|
|
406
|
+
timedMetadataPassthrough: (this.props.timedMetadataPassthrough ?? enums_1.TimedMetadataPassthrough.DISABLED).value,
|
|
407
|
+
captionLanguageMappings: this.props.captionLanguageMappings,
|
|
408
|
+
},
|
|
409
|
+
},
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
_bindDestination(_channelClass) {
|
|
413
|
+
const additional = this.props.additionalDestinations ?? [];
|
|
414
|
+
const primaries = this.primaryDestinations(_channelClass);
|
|
415
|
+
// For the auto variant the primary count is correct by construction; for the custom variant
|
|
416
|
+
// this enforces the per-pipeline count the user supplied.
|
|
417
|
+
validateDestinationCount(this._name, _channelClass, primaries.length, additional.length, true);
|
|
418
|
+
// Primary destinations share the output group's destination ID
|
|
419
|
+
const primarySettings = primaries.map(dest => dest._bind());
|
|
420
|
+
const result = [
|
|
421
|
+
{ id: (0, outputs_1.toDestinationId)(this.props.name), mediaPackageSettings: primarySettings },
|
|
422
|
+
];
|
|
423
|
+
// Each additional destination is a separate top-level Destinations entry
|
|
424
|
+
additional.forEach((dest, i) => {
|
|
425
|
+
result.push({
|
|
426
|
+
id: `${(0, outputs_1.toDestinationId)(this.props.name)}-additional-${i}`,
|
|
427
|
+
mediaPackageSettings: [dest._bind()],
|
|
428
|
+
});
|
|
429
|
+
});
|
|
430
|
+
return result;
|
|
431
|
+
}
|
|
432
|
+
_grantPermissions(role) {
|
|
433
|
+
const primaries = this.autoChannel
|
|
434
|
+
? [destinations_1.MediaPackageV2Destination.channel(this.autoChannel)]
|
|
435
|
+
: (this.explicitDestinations ?? []);
|
|
436
|
+
[...primaries, ...(this.props.additionalDestinations ?? [])].forEach(d => d._grantPermissions(role));
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
/** @internal */
|
|
440
|
+
class MediaConnectRouterOutputGroupConfiguration extends OutputGroupConfiguration {
|
|
441
|
+
props;
|
|
442
|
+
_name;
|
|
443
|
+
constructor(props) {
|
|
444
|
+
super();
|
|
445
|
+
this.props = props;
|
|
446
|
+
this._name = props.name;
|
|
447
|
+
if (props.outputs.length > 1) {
|
|
448
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `MediaConnectRouterSingleOutput`, `MediaConnect Router output group '${props.name}' may contain at most one output, but ${props.outputs.length} were provided`);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
_createInitialOutputs() {
|
|
452
|
+
return this.props.outputs.map(def => new outputs_1.MediaConnectRouterOutput(def, this._name));
|
|
453
|
+
}
|
|
454
|
+
_bind() {
|
|
455
|
+
return {
|
|
456
|
+
mediaConnectRouterGroupSettings: {
|
|
457
|
+
availabilityZones: this.props.availabilityZones,
|
|
458
|
+
},
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
_bindDestination(channelClass) {
|
|
462
|
+
const pipelineCount = channelClass === 'STANDARD' ? 2 : 1;
|
|
463
|
+
const azCount = this.props.availabilityZones.length;
|
|
464
|
+
if (azCount !== pipelineCount) {
|
|
465
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `MediaConnectRouterAvailabilityZones`, `MediaConnect Router output group '${this._name}' requires exactly ${pipelineCount} availabilityZone(s)`
|
|
466
|
+
+ ` for a ${channelClass} channel, but ${azCount} provided`);
|
|
467
|
+
}
|
|
468
|
+
const settings = this.props.routerSettings ?? destinations_1.MediaConnectRouterSettings.shared();
|
|
469
|
+
return [
|
|
470
|
+
{ id: (0, outputs_1.toDestinationId)(this._name), mediaConnectRouterSettings: settings._bind(pipelineCount) },
|
|
471
|
+
];
|
|
472
|
+
}
|
|
473
|
+
_grantPermissions(role) {
|
|
474
|
+
this.props.routerSettings?._secrets().forEach(secret => secret.grantRead(role));
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
/** @internal */
|
|
478
|
+
class HlsOutputGroupConfiguration extends OutputGroupConfiguration {
|
|
479
|
+
props;
|
|
480
|
+
_name;
|
|
481
|
+
epochLocking = false;
|
|
482
|
+
constructor(props) {
|
|
483
|
+
super();
|
|
484
|
+
this.props = props;
|
|
485
|
+
this._name = props.name;
|
|
486
|
+
}
|
|
487
|
+
_setEpochLocking(active) {
|
|
488
|
+
this.epochLocking = active;
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* The default program date time clock. Epoch output locking requires
|
|
492
|
+
* INITIALIZE_FROM_OUTPUT_TIMECODE; otherwise SYSTEM_CLOCK.
|
|
493
|
+
*/
|
|
494
|
+
_defaultProgramDateTimeClock() {
|
|
495
|
+
return this.epochLocking
|
|
496
|
+
? enums_1.HlsProgramDateTimeClock.INITIALIZE_FROM_OUTPUT_TIMECODE
|
|
497
|
+
: enums_1.HlsProgramDateTimeClock.SYSTEM_CLOCK;
|
|
498
|
+
}
|
|
499
|
+
/** Whether the user explicitly set an incompatible SYSTEM_CLOCK program-date-time clock. @internal */
|
|
500
|
+
_hasExplicitSystemClock() {
|
|
501
|
+
return this.props.programDateTimeClock?.value === enums_1.HlsProgramDateTimeClock.SYSTEM_CLOCK.value;
|
|
502
|
+
}
|
|
503
|
+
_createInitialOutputs() {
|
|
504
|
+
return (this.props.outputs ?? []).map(def => new outputs_1.HlsOutput(def));
|
|
505
|
+
}
|
|
506
|
+
_bind() {
|
|
507
|
+
return {
|
|
508
|
+
hlsGroupSettings: {
|
|
509
|
+
destination: { destinationRefId: (0, outputs_1.toDestinationId)(this.props.name) },
|
|
510
|
+
segmentLength: this.props.segment?._toSeconds() ?? 2,
|
|
511
|
+
keepSegments: this.props.keepSegments ?? 21,
|
|
512
|
+
indexNSegments: this.props.indexNSegments ?? 10,
|
|
513
|
+
mode: (this.props.mode ?? enums_1.HlsMode.LIVE).value,
|
|
514
|
+
minSegmentLength: this.props.minSegment?._toSeconds(),
|
|
515
|
+
inputLossAction: (this.props.inputLossAction ?? enums_1.HlsInputLossAction.EMIT_OUTPUT).value,
|
|
516
|
+
adMarkers: this.props.adMarkers?.map(m => m.value),
|
|
517
|
+
baseUrlContent: this.props.baseUrlContent,
|
|
518
|
+
baseUrlContent1: this.props.baseUrlContent1,
|
|
519
|
+
baseUrlManifest: this.props.baseUrlManifest,
|
|
520
|
+
baseUrlManifest1: this.props.baseUrlManifest1,
|
|
521
|
+
captionLanguageMappings: this.props.captionLanguageMappings,
|
|
522
|
+
captionLanguageSetting: this.props.captionLanguageSetting?.value,
|
|
523
|
+
clientCache: (this.props.clientCache ?? enums_1.HlsClientCache.ENABLED).value,
|
|
524
|
+
codecSpecification: (this.props.codecSpecification ?? enums_1.HlsCodecSpecification.RFC_4281).value,
|
|
525
|
+
constantIv: this.props.constantIv,
|
|
526
|
+
directoryStructure: (this.props.directoryStructure ?? enums_1.HlsDirectoryStructure.SINGLE_DIRECTORY).value,
|
|
527
|
+
discontinuityTags: (this.props.discontinuityTags ?? enums_1.HlsDiscontinuityTags.INSERT).value,
|
|
528
|
+
encryptionType: this.props.encryptionType?.value,
|
|
529
|
+
hlsCdnSettings: this.props.hlsCdnSettings?._bind(),
|
|
530
|
+
hlsId3SegmentTagging: (this.props.hlsId3SegmentTagging ?? enums_1.HlsId3SegmentTaggingState.DISABLED).value,
|
|
531
|
+
iFrameOnlyPlaylists: (this.props.iFrameOnlyPlaylists ?? enums_1.HlsIFrameOnlyPlaylists.DISABLED).value,
|
|
532
|
+
incompleteSegmentBehavior: (this.props.incompleteSegmentBehavior ?? enums_1.HlsIncompleteSegmentBehavior.AUTO).value,
|
|
533
|
+
ivInManifest: this.props.ivInManifest?.value,
|
|
534
|
+
ivSource: this.props.ivSource?.value,
|
|
535
|
+
keyFormat: this.props.keyFormat,
|
|
536
|
+
keyFormatVersions: this.props.keyFormatVersions,
|
|
537
|
+
keyProviderSettings: this.props.keyProviderSettings?._bind(),
|
|
538
|
+
manifestCompression: (this.props.manifestCompression ?? enums_1.HlsManifestCompression.NONE).value,
|
|
539
|
+
manifestDurationFormat: (this.props.manifestDurationFormat ?? enums_1.HlsManifestDurationFormat.FLOATING_POINT).value,
|
|
540
|
+
outputSelection: (this.props.outputSelection ?? enums_1.HlsOutputSelection.MANIFESTS_AND_SEGMENTS).value,
|
|
541
|
+
programDateTime: (this.props.programDateTime ?? enums_1.HlsProgramDateTime.INCLUDE).value,
|
|
542
|
+
programDateTimeClock: (this.props.programDateTimeClock ?? this._defaultProgramDateTimeClock()).value,
|
|
543
|
+
programDateTimePeriod: this.props.programDateTimePeriod?.toSeconds() ?? 600,
|
|
544
|
+
redundantManifest: (this.props.redundantManifest ?? enums_1.HlsRedundantManifest.DISABLED).value,
|
|
545
|
+
segmentationMode: (this.props.segmentationMode ?? enums_1.HlsSegmentationMode.USE_SEGMENT_DURATION).value,
|
|
546
|
+
segmentsPerSubdirectory: this.props.segmentsPerSubdirectory ?? 10_000,
|
|
547
|
+
streamInfResolution: (this.props.streamInfResolution ?? enums_1.HlsStreamInfResolution.INCLUDE).value,
|
|
548
|
+
timedMetadataId3Frame: (this.props.timedMetadataId3Frame ?? enums_1.HlsTimedMetadataId3Frame.PRIV).value,
|
|
549
|
+
timedMetadataId3Period: this.props.timedMetadataId3Period?.toSeconds() ?? 10,
|
|
550
|
+
timestampDeltaMilliseconds: this.props.timestampDelta?.toMilliseconds(),
|
|
551
|
+
tsFileMode: (this.props.tsFileMode ?? enums_1.HlsTsFileMode.SEGMENTED_FILES).value,
|
|
552
|
+
},
|
|
553
|
+
};
|
|
554
|
+
}
|
|
555
|
+
_bindDestination(_channelClass) {
|
|
556
|
+
validateDestinationCount(this._name, _channelClass, this.props.destinations.length, 0, false);
|
|
557
|
+
const settings = this.props.destinations.map(d => {
|
|
558
|
+
const bound = d._bind();
|
|
559
|
+
if (bound.url && !aws_cdk_lib_1.Token.isUnresolved(bound.url) && bound.url.endsWith('/')) {
|
|
560
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `HlsDestinationTrailingSlash`, `HLS output group '${this._name}' destination URL must be a file prefix, not a folder (got '${bound.url}'). Remove the trailing slash.`);
|
|
561
|
+
}
|
|
562
|
+
// An https destination pushes to a CDN/web server, which requires hlsCdnSettings.
|
|
563
|
+
if (bound.url && !aws_cdk_lib_1.Token.isUnresolved(bound.url) && bound.url.startsWith('https://')
|
|
564
|
+
&& this.props.hlsCdnSettings === undefined) {
|
|
565
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `HlsHttpsDestinationRequiresCdnSettings`, `HLS output group '${this._name}' uses an https destination URL, which requires hlsCdnSettings to be set (e.g. HlsCdnSettings.basicPut(), .akamai(), or .webdav()).`);
|
|
566
|
+
}
|
|
567
|
+
return bound;
|
|
568
|
+
});
|
|
569
|
+
return [{ id: (0, outputs_1.toDestinationId)(this.props.name), settings }];
|
|
570
|
+
}
|
|
571
|
+
_grantPermissions(role) {
|
|
572
|
+
this.props.destinations.forEach(d => d._grantPermissions(role));
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
/** @internal */
|
|
576
|
+
class UdpOutputGroupConfiguration extends OutputGroupConfiguration {
|
|
577
|
+
props;
|
|
578
|
+
_name;
|
|
579
|
+
constructor(props) {
|
|
580
|
+
super();
|
|
581
|
+
this.props = props;
|
|
582
|
+
this._name = props.name;
|
|
583
|
+
}
|
|
584
|
+
_createInitialOutputs() {
|
|
585
|
+
return (this.props.outputs ?? []).map(def => new outputs_1.UdpOutput(def, this.props));
|
|
586
|
+
}
|
|
587
|
+
_bind() {
|
|
588
|
+
return {
|
|
589
|
+
udpGroupSettings: {
|
|
590
|
+
inputLossAction: (this.props.inputLossAction ?? enums_1.UdpInputLossAction.EMIT_PROGRAM).value,
|
|
591
|
+
timedMetadataId3Frame: (this.props.timedMetadataId3Frame ?? enums_1.UdpTimedMetadataId3Frame.PRIV).value,
|
|
592
|
+
timedMetadataId3Period: this.props.timedMetadataId3Period?.toSeconds() ?? 10,
|
|
593
|
+
},
|
|
594
|
+
};
|
|
595
|
+
}
|
|
596
|
+
_bindDestination(_channelClass) {
|
|
597
|
+
validateDestinationCount(this._name, _channelClass, this.props.destinations.length, 0, false);
|
|
598
|
+
const settings = this.props.destinations.map(d => d._bind());
|
|
599
|
+
return [{ id: (0, outputs_1.toDestinationId)(this.props.name), settings }];
|
|
600
|
+
}
|
|
601
|
+
_grantPermissions(role) {
|
|
602
|
+
this.props.destinations.forEach(d => d._grantPermissions(role));
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
/** @internal */
|
|
606
|
+
class ArchiveOutputGroupConfiguration extends OutputGroupConfiguration {
|
|
607
|
+
props;
|
|
608
|
+
_name;
|
|
609
|
+
constructor(props) {
|
|
610
|
+
super();
|
|
611
|
+
this.props = props;
|
|
612
|
+
this._name = props.name;
|
|
613
|
+
// An archive group must contain at least one output with a video encode (raw-container
|
|
614
|
+
// outputs are audio-only, so a group of only raw outputs is rejected by the service).
|
|
615
|
+
const outputs = props.outputs ?? [];
|
|
616
|
+
if (outputs.length > 0 && !outputs.some(o => o.encodes.some(e => e._bindVideo() !== undefined))) {
|
|
617
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `ArchiveGroupRequiresVideo`, `Archive output group '${props.name}' must contain at least one output with a video encode`);
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
_createInitialOutputs() {
|
|
621
|
+
return (this.props.outputs ?? []).map(def => new outputs_1.ArchiveOutput(def));
|
|
622
|
+
}
|
|
623
|
+
_bind() {
|
|
624
|
+
return {
|
|
625
|
+
archiveGroupSettings: {
|
|
626
|
+
destination: { destinationRefId: (0, outputs_1.toDestinationId)(this.props.name) },
|
|
627
|
+
rolloverInterval: this.props.rolloverInterval?.toSeconds() ?? 300,
|
|
628
|
+
archiveCdnSettings: this.props.archiveS3CannedAcl ? {
|
|
629
|
+
archiveS3Settings: { cannedAcl: this.props.archiveS3CannedAcl.value },
|
|
630
|
+
} : undefined,
|
|
631
|
+
},
|
|
632
|
+
};
|
|
633
|
+
}
|
|
634
|
+
_bindDestination(_channelClass) {
|
|
635
|
+
validateDestinationCount(this._name, _channelClass, this.props.destinations.length, 0, false);
|
|
636
|
+
const settings = this.props.destinations.map(d => d._bind());
|
|
637
|
+
return [{ id: (0, outputs_1.toDestinationId)(this.props.name), settings }];
|
|
638
|
+
}
|
|
639
|
+
_grantPermissions(role) {
|
|
640
|
+
this.props.destinations.forEach(d => d._grantPermissions(role));
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
/** @internal */
|
|
644
|
+
class RtmpOutputGroupConfiguration extends OutputGroupConfiguration {
|
|
645
|
+
props;
|
|
646
|
+
_name;
|
|
647
|
+
constructor(props) {
|
|
648
|
+
super();
|
|
649
|
+
this.props = props;
|
|
650
|
+
this._name = props.name;
|
|
651
|
+
}
|
|
652
|
+
_createInitialOutputs() {
|
|
653
|
+
return this.props.outputs.map(def => new outputs_1.RtmpOutput(def, this._name));
|
|
654
|
+
}
|
|
655
|
+
_bind() {
|
|
656
|
+
return {
|
|
657
|
+
rtmpGroupSettings: {
|
|
658
|
+
authenticationScheme: (this.props.authenticationScheme ?? enums_1.RtmpAuthenticationScheme.COMMON).value,
|
|
659
|
+
restartDelay: this.props.restartDelay?.toSeconds() ?? 1,
|
|
660
|
+
adMarkers: this.props.adMarkers?.map(m => m.value),
|
|
661
|
+
cacheFullBehavior: this.props.cacheFullBehavior?.value,
|
|
662
|
+
cacheLength: this.props.cacheLength?.toSeconds(),
|
|
663
|
+
captionData: this.props.captionData?.value,
|
|
664
|
+
includeFillerNalUnits: this.props.includeFillerNalUnits?.value,
|
|
665
|
+
inputLossAction: this.props.inputLossAction?.value,
|
|
666
|
+
},
|
|
667
|
+
};
|
|
668
|
+
}
|
|
669
|
+
_bindDestination(channelClass) {
|
|
670
|
+
const expected = channelClass === 'STANDARD' ? 2 : 1;
|
|
671
|
+
const seenIds = new Set();
|
|
672
|
+
return this.props.outputs.map((def) => {
|
|
673
|
+
if (def.destinations.length !== expected) {
|
|
674
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `RtmpDestinationCount`, `RTMP output '${def.outputName}' in group '${this._name}' requires exactly ${expected} destination(s) (one per pipeline) for a ${channelClass} channel, got ${def.destinations.length}`);
|
|
675
|
+
}
|
|
676
|
+
const id = (0, outputs_1.toDestinationId)(def.outputName);
|
|
677
|
+
if (id === '') {
|
|
678
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `RtmpDestinationIdEmpty`, `RTMP output in group '${this._name}' outputName must contain at least one alphanumeric character`);
|
|
679
|
+
}
|
|
680
|
+
if (seenIds.has(id)) {
|
|
681
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `RtmpDestinationIdCollision`, `RTMP outputs in group '${this._name}' produce the same destination id '${id}' after sanitising output names; rename the outputs so they differ by more than '_' vs '-'`);
|
|
682
|
+
}
|
|
683
|
+
seenIds.add(id);
|
|
684
|
+
return { id, settings: def.destinations.map(d => d._bind()) };
|
|
685
|
+
});
|
|
686
|
+
}
|
|
687
|
+
_grantPermissions(role) {
|
|
688
|
+
this.props.outputs.forEach(o => o.destinations.forEach(d => d._grantPermissions(role)));
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
/** @internal */
|
|
692
|
+
class SrtOutputGroupConfiguration extends OutputGroupConfiguration {
|
|
693
|
+
props;
|
|
694
|
+
_name;
|
|
695
|
+
_outputs;
|
|
696
|
+
constructor(props) {
|
|
697
|
+
super();
|
|
698
|
+
this.props = props;
|
|
699
|
+
this._name = props.name;
|
|
700
|
+
this._outputs = props.outputs.map(def => new outputs_1.SrtOutput(def, this._name));
|
|
701
|
+
}
|
|
702
|
+
_createInitialOutputs() {
|
|
703
|
+
return this._outputs;
|
|
704
|
+
}
|
|
705
|
+
_bind() {
|
|
706
|
+
return {
|
|
707
|
+
srtGroupSettings: {
|
|
708
|
+
inputLossAction: (this.props.inputLossAction ?? enums_1.SrtInputLossAction.EMIT_PROGRAM).value,
|
|
709
|
+
},
|
|
710
|
+
};
|
|
711
|
+
}
|
|
712
|
+
_bindDestination(channelClass) {
|
|
713
|
+
const expected = channelClass === 'STANDARD' ? 2 : 1;
|
|
714
|
+
const seenIds = new Set();
|
|
715
|
+
return this.props.outputs.map((def) => {
|
|
716
|
+
if (def.destinations.length !== expected) {
|
|
717
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `SrtDestinationCount`, `SRT output '${def.outputName}' in group '${this._name}' requires exactly ${expected} destination(s) (one per pipeline) for a ${channelClass} channel, got ${def.destinations.length}`);
|
|
718
|
+
}
|
|
719
|
+
const id = (0, outputs_1.toDestinationId)(def.outputName);
|
|
720
|
+
if (id === '') {
|
|
721
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `SrtDestinationIdEmpty`, `SRT output in group '${this._name}' outputName must contain at least one alphanumeric character`);
|
|
722
|
+
}
|
|
723
|
+
if (seenIds.has(id)) {
|
|
724
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `SrtDestinationIdCollision`, `SRT outputs in group '${this._name}' produce the same destination id '${id}' after sanitising output names; rename the outputs so they differ by more than '_' vs '-'`);
|
|
725
|
+
}
|
|
726
|
+
seenIds.add(id);
|
|
727
|
+
return { id, srtSettings: def.destinations.map(d => d._bind()) };
|
|
728
|
+
});
|
|
729
|
+
}
|
|
730
|
+
_grantPermissions(role) {
|
|
731
|
+
this.props.outputs.forEach(o => o.destinations.forEach(d => d._grantPermissions(role)));
|
|
732
|
+
}
|
|
733
|
+
_hasSrtListenerDestination() {
|
|
734
|
+
return this.props.outputs.some(o => o.destinations.some(d => d._bind().connectionMode === 'LISTENER'));
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
/** @internal */
|
|
738
|
+
class CmafIngestOutputGroupConfiguration extends OutputGroupConfiguration {
|
|
739
|
+
props;
|
|
740
|
+
_name;
|
|
741
|
+
constructor(props) {
|
|
742
|
+
super();
|
|
743
|
+
this.props = props;
|
|
744
|
+
this._name = props.name;
|
|
745
|
+
// Eagerly reject destination URLs that don't end with '/' — this is API misuse that always
|
|
746
|
+
// fails at deploy, so fail fast at construction rather than at synth.
|
|
747
|
+
[...props.destinations, ...(props.additionalDestinations ?? [])].forEach(d => {
|
|
748
|
+
const { url } = d._bind();
|
|
749
|
+
if (url && !aws_cdk_lib_1.Token.isUnresolved(url) && !url.endsWith('/')) {
|
|
750
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `CmafIngestDestinationTrailingSlash`, `CMAF Ingest output group '${this._name}' destination URL path must end with '/' (got '${url}').`);
|
|
751
|
+
}
|
|
752
|
+
});
|
|
753
|
+
}
|
|
754
|
+
_createInitialOutputs() {
|
|
755
|
+
return this.props.outputs.map(def => new outputs_1.CmafIngestOutput(def));
|
|
756
|
+
}
|
|
757
|
+
_bind() {
|
|
758
|
+
return {
|
|
759
|
+
cmafIngestGroupSettings: {
|
|
760
|
+
destination: { destinationRefId: (0, outputs_1.toDestinationId)(this.props.name) },
|
|
761
|
+
segmentLength: this.props.segment?._length() ?? 1,
|
|
762
|
+
segmentLengthUnits: this.props.segment?._units() ?? enums_1.SegmentLengthUnits.SECONDS,
|
|
763
|
+
id3Behavior: (this.props.id3Behavior ?? enums_1.Id3Behavior.DISABLED).value,
|
|
764
|
+
id3NameModifier: this.props.id3NameModifier,
|
|
765
|
+
klvBehavior: (this.props.klvBehavior ?? enums_1.KlvBehavior.NO_PASSTHROUGH).value,
|
|
766
|
+
klvNameModifier: this.props.klvNameModifier,
|
|
767
|
+
nielsenId3Behavior: (this.props.nielsenId3Behavior ?? enums_1.NielsenId3Behavior.NO_PASSTHROUGH).value,
|
|
768
|
+
nielsenId3NameModifier: this.props.nielsenId3NameModifier,
|
|
769
|
+
scte35NameModifier: this.props.scte35NameModifier,
|
|
770
|
+
scte35Type: (this.props.scte35Type ?? enums_1.Scte35Type.SCTE_35_WITHOUT_SEGMENTATION).value,
|
|
771
|
+
sendDelayMs: this.props.sendDelayMs,
|
|
772
|
+
timedMetadataId3Frame: (this.props.timedMetadataId3Frame ?? enums_1.TimedMetadataId3Frame.NONE).value,
|
|
773
|
+
timedMetadataId3Period: this.props.timedMetadataId3Period?.toSeconds() ?? 10,
|
|
774
|
+
timedMetadataPassthrough: (this.props.timedMetadataPassthrough ?? enums_1.TimedMetadataPassthrough.DISABLED).value,
|
|
775
|
+
captionLanguageMappings: this.props.captionLanguageMappings,
|
|
776
|
+
},
|
|
777
|
+
};
|
|
778
|
+
}
|
|
779
|
+
_bindDestination(_channelClass) {
|
|
780
|
+
const additional = this.props.additionalDestinations ?? [];
|
|
781
|
+
validateDestinationCount(this._name, _channelClass, this.props.destinations.length, additional.length, true);
|
|
782
|
+
const primarySettings = this.props.destinations.map(d => d._bind());
|
|
783
|
+
const result = [
|
|
784
|
+
{ id: (0, outputs_1.toDestinationId)(this.props.name), settings: primarySettings },
|
|
785
|
+
];
|
|
786
|
+
additional.forEach((dest, i) => {
|
|
787
|
+
result.push({
|
|
788
|
+
id: `${(0, outputs_1.toDestinationId)(this.props.name)}-additional-${i}`,
|
|
789
|
+
settings: [dest._bind()],
|
|
790
|
+
});
|
|
791
|
+
});
|
|
792
|
+
return result;
|
|
793
|
+
}
|
|
794
|
+
_grantPermissions(role) {
|
|
795
|
+
[...this.props.destinations, ...(this.props.additionalDestinations ?? [])].forEach(d => d._grantPermissions(role));
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
/** @internal */
|
|
799
|
+
class FrameCaptureOutputGroupConfiguration extends OutputGroupConfiguration {
|
|
800
|
+
props;
|
|
801
|
+
_name;
|
|
802
|
+
constructor(props) {
|
|
803
|
+
super();
|
|
804
|
+
this.props = props;
|
|
805
|
+
this._name = props.name;
|
|
806
|
+
}
|
|
807
|
+
_createInitialOutputs() {
|
|
808
|
+
return (this.props.outputs ?? []).map(def => new outputs_1.FrameCaptureOutput(def));
|
|
809
|
+
}
|
|
810
|
+
_bind() {
|
|
811
|
+
return {
|
|
812
|
+
frameCaptureGroupSettings: {
|
|
813
|
+
destination: { destinationRefId: (0, outputs_1.toDestinationId)(this.props.name) },
|
|
814
|
+
frameCaptureCdnSettings: this.props.frameCaptureS3CannedAcl ? {
|
|
815
|
+
frameCaptureS3Settings: { cannedAcl: this.props.frameCaptureS3CannedAcl.value },
|
|
816
|
+
} : undefined,
|
|
817
|
+
},
|
|
818
|
+
};
|
|
819
|
+
}
|
|
820
|
+
_bindDestination(_channelClass) {
|
|
821
|
+
validateDestinationCount(this._name, _channelClass, this.props.destinations.length, 0, false);
|
|
822
|
+
const settings = this.props.destinations.map(d => d._bind());
|
|
823
|
+
return [{ id: (0, outputs_1.toDestinationId)(this.props.name), settings }];
|
|
824
|
+
}
|
|
825
|
+
_grantPermissions(role) {
|
|
826
|
+
this.props.destinations.forEach(d => d._grantPermissions(role));
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
/** @internal */
|
|
830
|
+
class MsSmoothOutputGroupConfiguration extends OutputGroupConfiguration {
|
|
831
|
+
props;
|
|
832
|
+
_name;
|
|
833
|
+
constructor(props) {
|
|
834
|
+
super();
|
|
835
|
+
this.props = props;
|
|
836
|
+
this._name = props.name;
|
|
837
|
+
// All outputs in an MS Smooth group share the group's single destination, so MediaLive
|
|
838
|
+
// distinguishes them by nameModifier alone — it must be set and unique across outputs.
|
|
839
|
+
// Otherwise this fails at deploy with "Outputs must have unique destinations".
|
|
840
|
+
const outputs = props.outputs ?? [];
|
|
841
|
+
if (outputs.length > 1) {
|
|
842
|
+
const seenModifiers = new Set();
|
|
843
|
+
outputs.forEach(def => {
|
|
844
|
+
if (!def.nameModifier) {
|
|
845
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `MsSmoothNameModifierRequired`, `MS Smooth output group '${this._name}' has multiple outputs sharing one destination;`
|
|
846
|
+
+ ` output '${def.outputName}' must set a unique 'nameModifier'.`);
|
|
847
|
+
}
|
|
848
|
+
if (seenModifiers.has(def.nameModifier)) {
|
|
849
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `MsSmoothNameModifierCollision`, `MS Smooth output group '${this._name}' has more than one output with nameModifier`
|
|
850
|
+
+ ` '${def.nameModifier}'; each output's nameModifier must be unique within the group.`);
|
|
851
|
+
}
|
|
852
|
+
seenModifiers.add(def.nameModifier);
|
|
853
|
+
});
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
_createInitialOutputs() {
|
|
857
|
+
return (this.props.outputs ?? []).map(def => new outputs_1.MsSmoothOutput(def));
|
|
858
|
+
}
|
|
859
|
+
_bind() {
|
|
860
|
+
return {
|
|
861
|
+
msSmoothGroupSettings: {
|
|
862
|
+
destination: { destinationRefId: (0, outputs_1.toDestinationId)(this.props.name) },
|
|
863
|
+
acquisitionPointId: this.props.acquisitionPointId,
|
|
864
|
+
audioOnlyTimecodeControl: this.props.audioOnlyTimecodeControl?.value,
|
|
865
|
+
certificateMode: this.props.certificateMode?.value,
|
|
866
|
+
connectionRetryInterval: this.props.connectionRetryInterval?.toSeconds(),
|
|
867
|
+
eventId: this.props.eventId,
|
|
868
|
+
eventIdMode: this.props.eventIdMode?.value,
|
|
869
|
+
eventStopBehavior: this.props.eventStopBehavior?.value,
|
|
870
|
+
filecacheDuration: this.props.filecacheDuration?.toSeconds(),
|
|
871
|
+
fragmentLength: this.props.fragmentLength?.toSeconds(),
|
|
872
|
+
inputLossAction: this.props.inputLossAction?.value,
|
|
873
|
+
numRetries: this.props.numRetries ?? 10,
|
|
874
|
+
restartDelay: this.props.restartDelay?.toSeconds() ?? 1,
|
|
875
|
+
segmentationMode: this.props.segmentationMode?.value,
|
|
876
|
+
sendDelayMs: this.props.sendDelayMs,
|
|
877
|
+
sparseTrackType: this.props.sparseTrackType?.value,
|
|
878
|
+
streamManifestBehavior: this.props.streamManifestBehavior?.value,
|
|
879
|
+
timestampOffset: this.props.timestampOffset,
|
|
880
|
+
timestampOffsetMode: this.props.timestampOffsetMode?.value,
|
|
881
|
+
},
|
|
882
|
+
};
|
|
883
|
+
}
|
|
884
|
+
_bindDestination(_channelClass) {
|
|
885
|
+
validateDestinationCount(this._name, _channelClass, this.props.destinations.length, 0, false);
|
|
886
|
+
const settings = this.props.destinations.map(d => d._bind());
|
|
887
|
+
return [{ id: (0, outputs_1.toDestinationId)(this.props.name), settings }];
|
|
888
|
+
}
|
|
889
|
+
_grantPermissions(role) {
|
|
890
|
+
this.props.destinations.forEach(d => d._grantPermissions(role));
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
// =============================================================================
|
|
894
|
+
// OutputGroup (orchestrates outputs within a group)
|
|
895
|
+
// =============================================================================
|
|
896
|
+
/**
|
|
897
|
+
* An output group within a MediaLive channel.
|
|
898
|
+
*
|
|
899
|
+
* @internal
|
|
900
|
+
*/
|
|
901
|
+
class OutputGroup {
|
|
902
|
+
config;
|
|
903
|
+
outputs = [];
|
|
904
|
+
constructor(config) {
|
|
905
|
+
this.config = config;
|
|
906
|
+
this.outputs.push(...config._createInitialOutputs());
|
|
907
|
+
}
|
|
908
|
+
/** @internal */
|
|
909
|
+
_bind() {
|
|
910
|
+
return {
|
|
911
|
+
name: this.config._name,
|
|
912
|
+
outputGroupSettings: this.config._bind(),
|
|
913
|
+
outputs: this.outputs.map(o => o._bind()),
|
|
914
|
+
};
|
|
915
|
+
}
|
|
916
|
+
/** @internal */
|
|
917
|
+
_bindDestination(channelClass) {
|
|
918
|
+
return this.config._bindDestination(channelClass);
|
|
919
|
+
}
|
|
920
|
+
/** @internal */
|
|
921
|
+
_collectEncodes() {
|
|
922
|
+
return this.outputs.flatMap(o => o._getEncodes());
|
|
923
|
+
}
|
|
924
|
+
/** @internal - Propagate epoch-locking state to the underlying config. */
|
|
925
|
+
_setEpochLocking(active) {
|
|
926
|
+
this.config._setEpochLocking(active);
|
|
927
|
+
}
|
|
928
|
+
/** @internal - Whether the underlying config explicitly requests an incompatible SYSTEM_CLOCK. */
|
|
929
|
+
_hasExplicitSystemClock() {
|
|
930
|
+
return this.config._hasExplicitSystemClock();
|
|
931
|
+
}
|
|
932
|
+
/** @internal */
|
|
933
|
+
_grantPermissions(role) {
|
|
934
|
+
this.config._grantPermissions(role);
|
|
935
|
+
// Grant read access to any external files referenced by the outputs (burn-in caption fonts,
|
|
936
|
+
// audio-only cover-art images) sourced from S3 buckets.
|
|
937
|
+
this.outputs.forEach(o => o._grantPermissions(role));
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
exports.OutputGroup = OutputGroup;
|
|
941
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LWdyb3VwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsib3V0cHV0LWdyb3VwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBK0I7QUFDL0IsMENBQXdCO0FBQ3hCLDRDQUEwQjtBQUkxQiw2Q0FBNkQ7QUFHN0QsNEVBQTREO0FBSzVELGlEQUFpSDtBQUVqSCxtQ0FnQ2lCO0FBY2pCLHVDQUltQjtBQVluQixnQkFBZ0I7QUFDaEIsU0FBUyx3QkFBd0IsQ0FDL0IsU0FBaUIsRUFDakIsWUFBb0IsRUFDcEIsZ0JBQXdCLEVBQ3hCLGVBQXVCLEVBQ3ZCLGVBQXdCO0lBRXhCLE1BQU0sVUFBVSxHQUFHLFlBQVksS0FBSyxVQUFVLENBQUM7SUFDL0MsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQyxJQUFJLGdCQUFnQixLQUFLLGVBQWUsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxxQ0FBdUIsQ0FDL0IsSUFBQSxzQkFBRyxFQUFBLGtCQUFrQixFQUNyQixpQkFBaUIsU0FBUyxzQkFBc0IsZUFBZSxFQUFFO2NBQy9ELGlDQUFpQyxZQUFZLGlCQUFpQixnQkFBZ0IsWUFBWSxDQUM3RixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksZUFBZSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxxQ0FBdUIsQ0FDL0IsSUFBQSxzQkFBRyxFQUFBLHdCQUF3QixFQUMzQixpQkFBaUIsU0FBUyw2Q0FBNkMsQ0FDeEUsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLElBQUksZUFBZSxHQUFHLGFBQWEsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxxQ0FBdUIsQ0FDL0Is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QUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDdEM7SUFFRCxrR0FBa0c7SUFDM0YsdUJBQXVCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0tBQzlDO0lBRUQsZ0JBQWdCO0lBQ1QsaUJBQWlCLENBQUMsSUFBYztRQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLDRGQUE0RjtRQUM1Rix3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUN0RDtDQUNGO0FBM0NELGtDQTJDQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZGVzdGluYXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vZW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi9vdXRwdXRzJztcblxuaW1wb3J0IHR5cGUgeyBJQ2hhbm5lbCBhcyBJTWVkaWFQYWNrYWdlVjJDaGFubmVsIH0gZnJvbSAnQGF3cy1jZGsvYXdzLW1lZGlhcGFja2FnZXYyLWFscGhhJztcbmltcG9ydCB0eXBlIHsgRHVyYXRpb24sIFNlY3JldFZhbHVlIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IsIFRva2VuIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHR5cGUgeyBJUm9sZSwgSVJvbGVSZWYgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB0eXBlIHsgQ2ZuQ2hhbm5lbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1tZWRpYWxpdmUnO1xuaW1wb3J0IHsgbGl0IH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgdHlwZSB7XG4gIE91dHB1dERlc3RpbmF0aW9uLCBTM091dHB1dERlc3RpbmF0aW9uLFxuICBVZHBPdXRwdXREZXN0aW5hdGlvbixcbn0gZnJvbSAnLi9kZXN0aW5hdGlvbnMnO1xuaW1wb3J0IHsgTWVkaWFQYWNrYWdlVjJEZXN0aW5hdGlvbiwgTWVkaWFQYWNrYWdlVjJFbmRwb2ludElkLCBNZWRpYUNvbm5lY3RSb3V0ZXJTZXR0aW5ncyB9IGZyb20gJy4vZGVzdGluYXRpb25zJztcbmltcG9ydCB0eXBlIHsgRW5jb2RlQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vZW5jb2RlLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHtcbiAgSGxzTW9kZSxcbiAgSGxzSW5wdXRMb3NzQWN0aW9uLFxuICBSdG1wQXV0aGVudGljYXRpb25TY2hlbWUsXG4gIEhsc0NsaWVudENhY2hlLFxuICBIbHNDb2RlY1NwZWNpZmljYXRpb24sXG4gIEhsc0RpcmVjdG9yeVN0cnVjdHVyZSxcbiAgSGxzRGlzY29udGludWl0eVRhZ3MsXG4gIEhsc0lkM1NlZ21lbnRUYWdnaW5nU3RhdGUsXG4gIEhsc0lGcmFtZU9ubHlQbGF5bGlzdHMsXG4gIEhsc0luY29tcGxldGVTZWdtZW50QmVoYXZpb3IsXG4gIEhsc01hbmlmZXN0Q29tcHJlc3Npb24sXG4gIEhsc01hbmlmZXN0RHVyYXRpb25Gb3JtYXQsXG4gIEhsc091dHB1dFNlbGVjdGlvbixcbiAgSGxzUHJvZ3JhbURhdGVUaW1lLFxuICBIbHNQcm9ncmFtRGF0ZVRpbWVDbG9jayxcbiAgSGxzUmVkdW5kYW50TWFuaWZlc3QsXG4gIEhsc1NlZ21lbnRhdGlvbk1vZGUsXG4gIEhsc1N0cmVhbUluZlJlc29sdXRpb24sXG4gIEhsc1RzRmlsZU1vZGUsXG4gIEh0dHBUcmFuc2Zlck1vZGUsXG4gIEhsc1RpbWVkTWV0YWRhdGFJZDNGcmFtZSxcbiAgVWRwSW5wdXRMb3NzQWN0aW9uLFxuICBTZWdtZW50TGVuZ3RoVW5pdHMsXG4gIElkM0JlaGF2aW9yLFxuICBLbHZCZWhhdmlvcixcbiAgTmllbHNlbklkM0JlaGF2aW9yLFxuICBTY3RlMzVUeXBlLFxuICBUaW1lZE1ldGFkYXRhSWQzRnJhbWUsXG4gIFRpbWVkTWV0YWRhdGFQYXNzdGhyb3VnaCxcbiAgVWRwVGltZWRNZXRhZGF0YUlkM0ZyYW1lLFxuICBTcnRJbnB1dExvc3NBY3Rpb24sXG59IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHR5cGUge1xuICBTM0Nhbm5lZEFjbCxcbiAgSGxzRW5jcnlwdGlvblR5cGUsIEhsc0l2SW5NYW5pZmVzdCwgSGxzSXZTb3VyY2UsXG4gIEhsc0NhcHRpb25MYW5ndWFnZVNldHRpbmcsXG4gIFJ0bXBDYWNoZUZ1bGxCZWhhdmlvciwgUnRtcENhcHRpb25EYXRhLCBSdG1wSW5wdXRMb3NzQWN0aW9uLFxuICBSdG1wSW5jbHVkZUZpbGxlck5hbFVuaXRzLFxuICBNc1Ntb290aEF1ZGlvT25seVRpbWVjb2RlQ29udHJvbCwgTXNTbW9vdGhDZXJ0aWZpY2F0ZU1vZGUsXG4gIE1zU21vb3RoRXZlbnRJZE1vZGUsIE1zU21vb3RoRXZlbnRTdG9wQmVoYXZpb3IsXG4gIE1zU21vb3RoSW5wdXRMb3NzQWN0aW9uLCBNc1Ntb290aFNlZ21lbnRhdGlvbk1vZGUsXG4gIE1zU21vb3RoU3BhcnNlVHJhY2tUeXBlLCBNc1Ntb290aFN0cmVhbU1hbmlmZXN0QmVoYXZpb3IsXG4gIE1zU21vb3RoVGltZXN0YW1wT2Zmc2V0TW9kZSxcbiAgSGxzQWRNYXJrZXJzLCBSdG1wQWRNYXJrZXJzLFxufSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7XG4gIE1lZGlhUGFja2FnZVYyT3V0cHV0LCBIbHNPdXRwdXQsIFVkcE91dHB1dCwgQXJjaGl2ZU91dHB1dCxcbiAgUnRtcE91dHB1dCwgU3J0T3V0cHV0LCBDbWFmSW5nZXN0T3V0cHV0LCBGcmFtZUNhcHR1cmVPdXRwdXQsXG4gIE1zU21vb3RoT3V0cHV0LCBNZWRpYUNvbm5lY3RSb3V0ZXJPdXRwdXQsIHRvRGVzdGluYXRpb25JZCxcbn0gZnJvbSAnLi9vdXRwdXRzJztcbmltcG9ydCB0eXBlIHtcbiAgT3V0cHV0LFxuICBNZWRpYUNvbm5lY3RSb3V0ZXJPdXRwdXREZWZpbml0aW9uLFxuICBNZWRpYVBhY2thZ2VWMk91dHB1dERlZmluaXRpb24sIEhsc091dHB1dERlZmluaXRpb24sXG4gIFVkcE91dHB1dERlZmluaXRpb24sIEFyY2hpdmVPdXRwdXREZWZpbml0aW9uLFxuICBSdG1wT3V0cHV0RGVmaW5pdGlvbiwgU3J0T3V0cHV0RGVmaW5pdGlvbixcbiAgQ21hZkluZ2VzdE91dHB1dERlZmluaXRpb24sIEZyYW1lQ2FwdHVyZU91dHB1dERlZmluaXRpb24sXG4gIE1zU21vb3RoT3V0cHV0RGVmaW5pdGlvbixcbn0gZnJvbSAnLi9vdXRwdXRzJztcbmltcG9ydCB0eXBlIHsgU2VnbWVudCB9IGZyb20gJy4vc2hhcmVkJztcblxuLyoqIEBpbnRlcm5hbCAqL1xuZnVuY3Rpb24gdmFsaWRhdGVEZXN0aW5hdGlvbkNvdW50KFxuICBncm91cE5hbWU6IHN0cmluZyxcbiAgY2hhbm5lbENsYXNzOiBzdHJpbmcsXG4gIGRlc3RpbmF0aW9uQ291bnQ6IG51bWJlcixcbiAgYWRkaXRpb25hbENvdW50OiBudW1iZXIsXG4gIGFsbG93QWRkaXRpb25hbDogYm9vbGVhbixcbik6IHZvaWQge1xuICBjb25zdCBpc1N0YW5kYXJkID0gY2hhbm5lbENsYXNzID09PSAnU1RBTkRBUkQnO1xuICBjb25zdCByZXF1aXJlZFByaW1hcnkgPSBpc1N0YW5kYXJkID8gMiA6IDE7XG4gIGlmIChkZXN0aW5hdGlvbkNvdW50ICE9PSByZXF1aXJlZFByaW1hcnkpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBsaXRgRGVzdGluYXRpb25Db3VudGAsXG4gICAgICBgT3V0cHV0IGdyb3VwICcke2dyb3VwTmFtZX0nIHJlcXVpcmVzIGV4YWN0bHkgJHtyZXF1aXJlZFByaW1hcnl9YFxuICAgICAgKyBgIHByaW1hcnkgZGVzdGluYXRpb24ocykgZm9yIGEgJHtjaGFubmVsQ2xhc3N9IGNoYW5uZWwsIGJ1dCAke2Rlc3RpbmF0aW9uQ291bnR9IHByb3ZpZGVkLmAsXG4gICAgKTtcbiAgfVxuICBpZiAoYWRkaXRpb25hbENvdW50ID4gMCAmJiAhYWxsb3dBZGRpdGlvbmFsKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgbGl0YEFkZGl0aW9uYWxEZXN0aW5hdGlvbnNgLFxuICAgICAgYE91dHB1dCBncm91cCAnJHtncm91cE5hbWV9JyBkb2VzIG5vdCBzdXBwb3J0IGFkZGl0aW9uYWwgZGVzdGluYXRpb25zLmAsXG4gICAgKTtcbiAgfVxuICBjb25zdCBtYXhBZGRpdGlvbmFsID0gaXNTdGFuZGFyZCA/IDIgOiAxO1xuICBpZiAoYWRkaXRpb25hbENvdW50ID4gbWF4QWRkaXRpb25hbCkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGxpdGBBZGRpdGlvbmFsRGVzdGluYXRpb25Db3VudGAsXG4gICAgICBgT3V0cHV0IGdyb3VwICcke2dyb3VwTmFtZX0nIGFsbG93cyBhdCBtb3N0ICR7bWF4QWRkaXRpb25hbH1gXG4gICAgICArIGAgYWRkaXRpb25hbCBkZXN0aW5hdGlvbihzKSBmb3IgYSAke2NoYW5uZWxDbGFzc30gY2hhbm5lbCwgYnV0ICR7YWRkaXRpb25hbENvdW50fSBwcm92aWRlZC5gLFxuICAgICk7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiAoYWJzdHJhY3QgYmFzZSArIHN1YmNsYXNzZXMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGFuIG91dHB1dCBncm91cC4gVXNlIHRoZSBzdGF0aWMgZmFjdG9yeSBtZXRob2RzIHRvIGNyZWF0ZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBNZWRpYVBhY2thZ2UgVjIgb3V0cHV0IGdyb3VwIHRoYXQgZGVsaXZlcnMgdG8gYSBzaW5nbGUgY2hhbm5lbCwgYXV0by1tYXBwaW5nIGVhY2hcbiAgICogcGlwZWxpbmUgdG8gYSBNZWRpYVBhY2thZ2UgaW5nZXN0IGVuZHBvaW50IGJhc2VkIG9uIHRoZSBjaGFubmVsIGNsYXNzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBtZWRpYVBhY2thZ2VWMihwcm9wczogTWVkaWFQYWNrYWdlVjJPdXRwdXRHcm91cFByb3BzKTogT3V0cHV0R3JvdXBDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IE1lZGlhUGFja2FnZVYyT3V0cHV0R3JvdXBDb25maWd1cmF0aW9uKHByb3BzLCBwcm9wcy5jaGFubmVsLCB1bmRlZmluZWQpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBNZWRpYVBhY2thZ2UgVjIgb3V0cHV0IGdyb3VwIHdpdGggZXhwbGljaXQgcGVyLXBpcGVsaW5lIGRlc3RpbmF0aW9ucyAoY2hhbm5lbCArXG4gICAqIGVuZHBvaW50IHBlciBwaXBlbGluZSkuIFVzZSBmb3IgY3Jvc3MtcmVnaW9uIGRlbGl2ZXJ5IG9yIHBpbm5pbmcgYSBwaXBlbGluZSB0byBhbiBlbmRwb2ludC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbWVkaWFQYWNrYWdlVjJQZXJQaXBlbGluZShwcm9wczogTWVkaWFQYWNrYWdlVjJQZXJQaXBlbGluZU91dHB1dEdyb3VwUHJvcHMpOiBPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgTWVkaWFQYWNrYWdlVjJPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ocHJvcHMsIHVuZGVmaW5lZCwgcHJvcHMuZGVzdGluYXRpb25zKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgTWVkaWFDb25uZWN0IFJvdXRlciBvdXRwdXQgZ3JvdXAsIGRlbGl2ZXJpbmcgZWFjaCBjaGFubmVsIHBpcGVsaW5lIHRvIGEgTWVkaWFDb25uZWN0XG4gICAqIFJvdXRlci4gVHJhbnNpdCBlbmNyeXB0aW9uIGRlZmF1bHRzIHRvIEFVVE9NQVRJQzsgb3ZlcnJpZGUgcGVyIHBpcGVsaW5lIHZpYSBgcm91dGVyU2V0dGluZ3NgLlxuICAgKlxuICAgKiBUaGUgZG93bnN0cmVhbSB3aXJpbmcgKHdoaWNoIHJvdXRlciBpbnB1dCBlYWNoIHBpcGVsaW5lIGZlZWRzKSBpcyBjb25maWd1cmVkIG9uIHRoZVxuICAgKiBNZWRpYUNvbm5lY3Qgc2lkZSwgcmVmZXJlbmNpbmcgdGhpcyBvdXRwdXQgZ3JvdXAgYnkgYG5hbWVgIGFuZCB0aGUgcGlwZWxpbmUgaWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1lZGlhQ29ubmVjdFJvdXRlcihwcm9wczogTWVkaWFDb25uZWN0Um91dGVyT3V0cHV0R3JvdXBQcm9wcyk6IE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBNZWRpYUNvbm5lY3RSb3V0ZXJPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ocHJvcHMpO1xuICB9XG4gIC8qKiBDcmVhdGUgYW4gSExTIG91dHB1dCBncm91cCBjb25maWd1cmF0aW9uLiAqL1xuICBwdWJsaWMgc3RhdGljIGhscyhwcm9wczogSGxzT3V0cHV0R3JvdXBQcm9wcyk6IE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBIbHNPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ocHJvcHMpO1xuICB9XG4gIC8qKiBDcmVhdGUgYSBVRFAgb3V0cHV0IGdyb3VwIGNvbmZpZ3VyYXRpb24uICovXG4gIHB1YmxpYyBzdGF0aWMgdWRwKHByb3BzOiBVZHBPdXRwdXRHcm91cFByb3BzKTogT3V0cHV0R3JvdXBDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IFVkcE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbihwcm9wcyk7XG4gIH1cbiAgLyoqIENyZWF0ZSBhbiBBcmNoaXZlIChTMykgb3V0cHV0IGdyb3VwIGNvbmZpZ3VyYXRpb24uICovXG4gIHB1YmxpYyBzdGF0aWMgYXJjaGl2ZShwcm9wczogQXJjaGl2ZU91dHB1dEdyb3VwUHJvcHMpOiBPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZU91dHB1dEdyb3VwQ29uZmlndXJhdGlvbihwcm9wcyk7XG4gIH1cbiAgLyoqIENyZWF0ZSBhbiBSVE1QIG91dHB1dCBncm91cCBjb25maWd1cmF0aW9uLiAqL1xuICBwdWJsaWMgc3RhdGljIHJ0bXAocHJvcHM6IFJ0bXBPdXRwdXRHcm91cFByb3BzKTogT3V0cHV0R3JvdXBDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IFJ0bXBPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ocHJvcHMpO1xuICB9XG4gIC8qKiBDcmVhdGUgYW4gU1JUIG91dHB1dCBncm91cCBjb25maWd1cmF0aW9uLiAqL1xuICBwdWJsaWMgc3RhdGljIHNydChwcm9wczogU3J0T3V0cHV0R3JvdXBQcm9wcyk6IE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBTcnRPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ocHJvcHMpO1xuICB9XG4gIC8qKiBDcmVhdGUgYSBDTUFGIEluZ2VzdCBvdXRwdXQgZ3JvdXAgY29uZmlndXJhdGlvbi4gKi9cbiAgcHVibGljIHN0YXRpYyBjbWFmSW5nZXN0KHByb3BzOiBDbWFmSW5nZXN0T3V0cHV0R3JvdXBQcm9wcyk6IE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBDbWFmSW5nZXN0T3V0cHV0R3JvdXBDb25maWd1cmF0aW9uKHByb3BzKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgRnJhbWUgQ2FwdHVyZSBvdXRwdXQgZ3JvdXAgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQSBjaGFubmVsIHRoYXQgaW5jbHVkZXMgYSBGcmFtZSBDYXB0dXJlIG91dHB1dCBncm91cCBtdXN0IGFsc28gaW5jbHVkZVxuICAgKiBhIHNlcGFyYXRlIHZpZGVvIG91dHB1dCBncm91cCAoZS5nLiBBcmNoaXZlLCBITFMsIFVEUCkuIEZyYW1lIENhcHR1cmVcbiAgICogY2Fubm90IGJlIHRoZSBjaGFubmVsJ3Mgb25seSBvdXRwdXQgZ3JvdXAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyYW1lQ2FwdHVyZShwcm9wczogRnJhbWVDYXB0dXJlT3V0cHV0R3JvdXBQcm9wcyk6IE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBGcmFtZUNhcHR1cmVPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ocHJvcHMpO1xuICB9XG4gIC8qKiBDcmVhdGUgYW4gTVMgU21vb3RoIG91dHB1dCBncm91cCBjb25maWd1cmF0aW9uLiAqL1xuICBwdWJsaWMgc3RhdGljIG1zU21vb3RoKHByb3BzOiBNc1Ntb290aE91dHB1dEdyb3VwUHJvcHMpOiBPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgTXNTbW9vdGhPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ocHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgb3V0cHV0IGdyb3VwLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIGFic3RyYWN0IF9iaW5kKCk6IENmbkNoYW5uZWwuT3V0cHV0R3JvdXBTZXR0aW5nc1Byb3BlcnR5O1xuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfYmluZERlc3RpbmF0aW9uKGNoYW5uZWxDbGFzczogc3RyaW5nKTogQ2ZuQ2hhbm5lbC5PdXRwdXREZXN0aW5hdGlvblByb3BlcnR5W107XG4gIC8qKiBAaW50ZXJuYWwgLSBHcmFudCBwZXJtaXNzaW9ucyB0byB0aGUgY2hhbm5lbCByb2xlIGZvciByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSBkZXN0aW5hdGlvbnMuICovXG4gIHB1YmxpYyBfZ3JhbnRQZXJtaXNzaW9ucyhfcm9sZTogSVJvbGVSZWYpOiB2b2lkIHt9XG4gIC8qKiBAaW50ZXJuYWwgLSBDcmVhdGUgdGhlIGluaXRpYWwgT3V0cHV0IGluc3RhbmNlcyBmcm9tIHRoZSBjb25maWcncyBvdXRwdXQgZGVmaW5pdGlvbnMuICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfY3JlYXRlSW5pdGlhbE91dHB1dHMoKTogT3V0cHV0W107XG4gIC8qKlxuICAgKiBXaGV0aGVyIGFueSBvdXRwdXQgaW4gdGhpcyBncm91cCBoYXMgYW4gU1JUIGxpc3RlbmVyLW1vZGUgZGVzdGluYXRpb24uIFVzZWQgYnkgdGhlIGNoYW5uZWwgdG9cbiAgICogZGVjaWRlIHdoZXRoZXIgY2hhbm5lbCBzZWN1cml0eSBncm91cHMgYXJlIHJlcXVpcmVkLCB3aXRob3V0IHRyaWdnZXJpbmcgZGVzdGluYXRpb24gYmluZGluZy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2hhc1NydExpc3RlbmVyRGVzdGluYXRpb24oKTogYm9vbGVhbiB7IHJldHVybiBmYWxzZTsgfVxuICAvKipcbiAgICogSExTIHVzZXMgdGhpcyB0byBzZWxlY3QgYSBjb21wYXRpYmxlIGRlZmF1bHQgcHJvZ3JhbS1kYXRlLXRpbWUgY2xvY2tcbiAgICogKHRoZSBzZXJ2aWNlIHJlcXVpcmVzIElOSVRJQUxJWkVfRlJPTV9PVVRQVVRfVElNRUNPREUgZm9yIGVwb2NoIGxvY2tpbmcpLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfc2V0RXBvY2hMb2NraW5nKF9hY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHt9XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZ3JvdXAgZXhwbGljaXRseSByZXF1ZXN0cyBhbiBITFMgcHJvZ3JhbSBkYXRlIHRpbWUgY2xvY2sgb2YgU1lTVEVNX0NMT0NLLCB3aGljaFxuICAgKiBpcyBpbmNvbXBhdGlibGUgd2l0aCBlcG9jaCBvdXRwdXQgbG9ja2luZy4gT25seSBITFMgZ3JvdXBzIGNhbiByZXR1cm4gdHJ1ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2hhc0V4cGxpY2l0U3lzdGVtQ2xvY2soKTogYm9vbGVhbiB7IHJldHVybiBmYWxzZTsgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gT3V0cHV0IGdyb3VwIHByb3BzIGludGVyZmFjZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogTWFwcyBhIGNhcHRpb25zIGNoYW5uZWwgdG8gYW4gSVNPIDY5My0yIGxhbmd1YWdlIGNvZGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FwdGlvbkxhbmd1YWdlTWFwcGluZyB7XG4gIC8qKiBUaGUgY2xvc2VkIGNhcHRpb24gY2hhbm5lbCBudW1iZXIgKDEtNCkuICovXG4gIHJlYWRvbmx5IGNhcHRpb25DaGFubmVsOiBudW1iZXI7XG4gIC8qKiBBIHRocmVlLWNoYXJhY3RlciBJU08gNjM5LTIgbGFuZ3VhZ2UgY29kZS4gKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2VDb2RlOiBzdHJpbmc7XG4gIC8qKiBUaGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgbGFuZ3VhZ2UuICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlRGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBNYXBzIGEgY2FwdGlvbnMgY2hhbm5lbCB0byBhbiBJU08gNjM5LTIgbGFuZ3VhZ2UgY29kZSBmb3IgYSBDTUFGIEluZ2VzdCBvdXRwdXQgZ3JvdXAuXG4gKlxuICogVW5saWtlIGBDYXB0aW9uTGFuZ3VhZ2VNYXBwaW5nYCwgdGhlIENNQUYgSW5nZXN0IHZhcmlhbnQgaGFzIG5vIGxhbmd1YWdlIGRlc2NyaXB0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENtYWZDYXB0aW9uTGFuZ3VhZ2VNYXBwaW5nIHtcbiAgLyoqIFRoZSBjbG9zZWQgY2FwdGlvbiBjaGFubmVsIG51bWJlciAoMS00KS4gKi9cbiAgcmVhZG9ubHkgY2FwdGlvbkNoYW5uZWw6IG51bWJlcjtcbiAgLyoqIEEgdGhyZWUtY2hhcmFjdGVyIElTTyA2MzktMiBsYW5ndWFnZSBjb2RlLiAqL1xuICByZWFkb25seSBsYW5ndWFnZUNvZGU6IHN0cmluZztcbn1cblxuLyoqIFByb3BlcnRpZXMgZm9yIEhMUyBzdGF0aWMga2V5IGVuY3J5cHRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIEhsc1N0YXRpY0tleVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBVUkwgb2YgdGhlIGxpY2Vuc2Ugc2VydmVyIHRoYXQgc2VydmVzIHRoZSBzdGF0aWMga2V5LlxuICAgKlxuICAgKiBSZXF1aXJlZCDigJQgTWVkaWFMaXZlIHJlamVjdHMgdGhpcyB3aXRob3V0IGEgc2VydmVyIFVSTCwgZXZlbiB0aG91Z2ggdGhlIHVuZGVybHlpbmdcbiAgICogQ2xvdWRGb3JtYXRpb24gcHJvcGVydHkgaXMgdHlwZWQgYXMgb3B0aW9uYWwuXG4gICAqL1xuICByZWFkb25seSBrZXlQcm92aWRlclNlcnZlclVybDogc3RyaW5nO1xuICAvKiogVGhlIHN0YXRpYyBrZXkgdmFsdWUgYXMgYSAzMi1jaGFyYWN0ZXIgaGV4YWRlY2ltYWwgc3RyaW5nLiAqL1xuICByZWFkb25seSBzdGF0aWNLZXlWYWx1ZTogU2VjcmV0VmFsdWU7XG59XG5cbi8qKiBQcm9wZXJ0aWVzIGZvciBITFMgUzMgQ0ROIHNldHRpbmdzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIbHNTM0NkblByb3BzIHtcbiAgLyoqIFRoZSBTMyBjYW5uZWQgQUNMIHRvIGFwcGx5IHRvIGVhY2ggb3V0cHV0LiBAZGVmYXVsdCAtIG5vIGNhbm5lZCBBQ0wgKi9cbiAgcmVhZG9ubHkgY2FubmVkQWNsPzogUzNDYW5uZWRBY2w7XG59XG5cbi8qKiBQcm9wZXJ0aWVzIGZvciBITFMgQmFzaWMgUFVUIENETiBzZXR0aW5ncy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGxzQmFzaWNQdXRDZG5Qcm9wcyB7XG4gIC8qKiBUaGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgYSBjb25uZWN0aW9uIHRvIHRoZSBDRE4uIEBkZWZhdWx0IDEgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvblJldHJ5SW50ZXJ2YWw/OiBudW1iZXI7XG4gIC8qKiBUaGUgc2l6ZSBvZiB0aGUgZmlsZSBjYWNoZSBmb3Igc3RyZWFtaW5nIG91dHB1dHMuIEBkZWZhdWx0IER1cmF0aW9uLnNlY29uZHMoMzAwKSAqL1xuICByZWFkb25seSBmaWxlY2FjaGVEdXJhdGlvbj86IER1cmF0aW9uO1xuICAvKiogVGhlIG51bWJlciBvZiByZXRyeSBhdHRlbXB0cy4gQGRlZmF1bHQgMTAgKi9cbiAgcmVhZG9ubHkgbnVtUmV0cmllcz86IG51bWJlcjtcbiAgLyoqIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGJlZm9yZSByZXN0YXJ0aW5nIGFmdGVyIGEgZmFpbHVyZS4gQGRlZmF1bHQgMSAqL1xuICByZWFkb25seSByZXN0YXJ0RGVsYXk/OiBudW1iZXI7XG59XG5cbi8qKiBQcm9wZXJ0aWVzIGZvciBITFMgQWthbWFpIENETiBzZXR0aW5ncy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGxzQWthbWFpQ2RuUHJvcHMge1xuICAvKiogVGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIGEgY29ubmVjdGlvbiB0byB0aGUgQ0ROLiBAZGVmYXVsdCAxICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25SZXRyeUludGVydmFsPzogbnVtYmVyO1xuICAvKiogVGhlIHNpemUgb2YgdGhlIGZpbGUgY2FjaGUgZm9yIHN0cmVhbWluZyBvdXRwdXRzLiBAZGVmYXVsdCBEdXJhdGlvbi5zZWNvbmRzKDMwMCkgKi9cbiAgcmVhZG9ubHkgZmlsZWNhY2hlRHVyYXRpb24/OiBEdXJhdGlvbjtcbiAgLyoqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nLiBAZGVmYXVsdCBIdHRwVHJhbnNmZXJNb2RlLk5PTl9DSFVOS0VEICovXG4gIHJlYWRvbmx5IGh0dHBUcmFuc2Zlck1vZGU/OiBIdHRwVHJhbnNmZXJNb2RlO1xuICAvKiogVGhlIG51bWJlciBvZiByZXRyeSBhdHRlbXB0cy4gQGRlZmF1bHQgMTAgKi9cbiAgcmVhZG9ubHkgbnVtUmV0cmllcz86IG51bWJlcjtcbiAgLyoqIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGJlZm9yZSByZXN0YXJ0aW5nIGFmdGVyIGEgZmFpbHVyZS4gQGRlZmF1bHQgMSAqL1xuICByZWFkb25seSByZXN0YXJ0RGVsYXk/OiBudW1iZXI7XG4gIC8qKiBUaGUgc2FsdCBmb3IgQWthbWFpIGF1dGhlbnRpY2F0aW9uLiBAZGVmYXVsdCAtIG5vIHNhbHQgKi9cbiAgcmVhZG9ubHkgc2FsdD86IHN0cmluZztcbiAgLyoqIFRoZSB0b2tlbiBmb3IgQWthbWFpIGF1dGhlbnRpY2F0aW9uLiBAZGVmYXVsdCAtIG5vIHRva2VuICovXG4gIHJlYWRvbmx5IHRva2VuPzogc3RyaW5nO1xufVxuXG4vKiogUHJvcGVydGllcyBmb3IgSExTIFdlYkRBViBDRE4gc2V0dGluZ3MuICovXG5leHBvcnQgaW50ZXJmYWNlIEhsc1dlYmRhdkNkblByb3BzIHtcbiAgLyoqIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGJlZm9yZSByZXRyeWluZyBhIGNvbm5lY3Rpb24gdG8gdGhlIENETi4gQGRlZmF1bHQgMSAqL1xuICByZWFkb25seSBjb25uZWN0aW9uUmV0cnlJbnRlcnZhbD86IG51bWJlcjtcbiAgLyoqIFRoZSBzaXplIG9mIHRoZSBmaWxlIGNhY2hlIGZvciBzdHJlYW1pbmcgb3V0cHV0cy4gQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcygzMDApICovXG4gIHJlYWRvbmx5IGZpbGVjYWNoZUR1cmF0aW9uPzogRHVyYXRpb247XG4gIC8qKiBTcGVjaWZpZXMgd2hldGhlciB0byB1c2UgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZy4gQGRlZmF1bHQgSHR0cFRyYW5zZmVyTW9kZS5OT05fQ0hVTktFRCAqL1xuICByZWFkb25seSBodHRwVHJhbnNmZXJNb2RlPzogSHR0cFRyYW5zZmVyTW9kZTtcbiAgLyoqIFRoZSBudW1iZXIgb2YgcmV0cnkgYXR0ZW1wdHMuIEBkZWZhdWx0IDEwICovXG4gIHJlYWRvbmx5IG51bVJldHJpZXM/OiBudW1iZXI7XG4gIC8qKiBUaGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBiZWZvcmUgcmVzdGFydGluZyBhZnRlciBhIGZhaWx1cmUuIEBkZWZhdWx0IDEgKi9cbiAgcmVhZG9ubHkgcmVzdGFydERlbGF5PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEtleSBwcm92aWRlciBzZXR0aW5ncyBmb3IgSExTIGVuY3J5cHRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBIbHNLZXlQcm92aWRlclNldHRpbmdzIHtcbiAgLyoqIFVzZSBhIHN0YXRpYyBrZXkgZm9yIEhMUyBlbmNyeXB0aW9uLiAqL1xuICBwdWJsaWMgc3RhdGljIHN0YXRpY0tleShwcm9wczogSGxzU3RhdGljS2V5UHJvcHMpOiBIbHNLZXlQcm92aWRlclNldHRpbmdzIHtcbiAgICByZXR1cm4gbmV3IEhsc0tleVByb3ZpZGVyU2V0dGluZ3Moe1xuICAgICAgc3RhdGljS2V5U2V0dGluZ3M6IHtcbiAgICAgICAga2V5UHJvdmlkZXJTZXJ2ZXI6IHsgdXJpOiBwcm9wcy5rZXlQcm92aWRlclNlcnZlclVybCB9LFxuICAgICAgICBzdGF0aWNLZXlWYWx1ZTogcHJvcHMuc3RhdGljS2V5VmFsdWUudW5zYWZlVW53cmFwKCksIC8vIFNhZmUgdXNhZ2U6IHJlbmRlcmVkIGFzIENGTiBkeW5hbWljIHJlZmVyZW5jZVxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBDZm5DaGFubmVsLktleVByb3ZpZGVyU2V0dGluZ3NQcm9wZXJ0eTtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihjb25maWc6IENmbkNoYW5uZWwuS2V5UHJvdmlkZXJTZXR0aW5nc1Byb3BlcnR5KSB7IHRoaXMuY29uZmlnID0gY29uZmlnOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2JpbmQoKTogQ2ZuQ2hhbm5lbC5LZXlQcm92aWRlclNldHRpbmdzUHJvcGVydHkgeyByZXR1cm4gdGhpcy5jb25maWc7IH1cbn1cblxuLyoqXG4gKiBDRE4gc2V0dGluZ3MgZm9yIEhMUyBvdXRwdXQgZ3JvdXBzLlxuICovXG5leHBvcnQgY2xhc3MgSGxzQ2RuU2V0dGluZ3Mge1xuICAvKiogVXNlIEFtYXpvbiBTMyBhcyB0aGUgQ0ROIGZvciBITFMgb3V0cHV0LiAqL1xuICBwdWJsaWMgc3RhdGljIHMzKHByb3BzPzogSGxzUzNDZG5Qcm9wcyk6IEhsc0NkblNldHRpbmdzIHtcbiAgICByZXR1cm4gbmV3IEhsc0NkblNldHRpbmdzKHsgaGxzUzNTZXR0aW5nczogeyBjYW5uZWRBY2w6IHByb3BzPy5jYW5uZWRBY2w/LnZhbHVlIH0gfSk7XG4gIH1cbiAgLyoqIFVzZSBhIGJhc2ljIEhUVFAgUFVUIGZvciBITFMgb3V0cHV0LiAqL1xuICBwdWJsaWMgc3RhdGljIGJhc2ljUHV0KHByb3BzPzogSGxzQmFzaWNQdXRDZG5Qcm9wcyk6IEhsc0NkblNldHRpbmdzIHtcbiAgICByZXR1cm4gbmV3IEhsc0NkblNldHRpbmdzKHtcbiAgICAgIGhsc0Jhc2ljUHV0U2V0dGluZ3M6IHtcbiAgICAgICAgY29ubmVjdGlvblJldHJ5SW50ZXJ2YWw6IHByb3BzPy5jb25uZWN0aW9uUmV0cnlJbnRlcnZhbCA/PyAxLFxuICAgICAgICBmaWxlY2FjaGVEdXJhdGlvbjogcHJvcHM/LmZpbGVjYWNoZUR1cmF0aW9uPy50b1NlY29uZHMoKSA/PyAzMDAsXG4gICAgICAgIG51bVJldHJpZXM6IHByb3BzPy5udW1SZXRyaWVzID8/IDEwLFxuICAgICAgICByZXN0YXJ0RGVsYXk6IHByb3BzPy5yZXN0YXJ0RGVsYXkgPz8gMSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgLyoqIFVzZSBBa2FtYWkgYXMgdGhlIENETiBmb3IgSExTIG91dHB1dC4gKi9cbiAgcHVibGljIHN0YXRpYyBha2FtYWkocHJvcHM/OiBIbHNBa2FtYWlDZG5Qcm9wcyk6IEhsc0NkblNldHRpbmdzIHtcbiAgICByZXR1cm4gbmV3IEhsc0NkblNldHRpbmdzKHtcbiAgICAgIGhsc0FrYW1haVNldHRpbmdzOiB7XG4gICAgICAgIGNvbm5lY3Rpb25SZXRyeUludGVydmFsOiBwcm9wcz8uY29ubmVjdGlvblJldHJ5SW50ZXJ2YWwgPz8gMSxcbiAgICAgICAgZmlsZWNhY2hlRHVyYXRpb246IHByb3BzPy5maWxlY2FjaGVEdXJhdGlvbj8udG9TZWNvbmRzKCkgPz8gMzAwLFxuICAgICAgICBudW1SZXRyaWVzOiBwcm9wcz8ubnVtUmV0cmllcyA/PyAxMCxcbiAgICAgICAgcmVzdGFydERlbGF5OiBwcm9wcz8ucmVzdGFydERlbGF5ID8/IDEsXG4gICAgICAgIGh0dHBUcmFuc2Zlck1vZGU6IChwcm9wcz8uaHR0cFRyYW5zZmVyTW9kZSA/PyBIdHRwVHJhbnNmZXJNb2RlLk5PTl9DSFVOS0VEKS52YWx1ZSxcbiAgICAgICAgc2FsdDogcHJvcHM/LnNhbHQsXG4gICAgICAgIHRva2VuOiBwcm9wcz8udG9rZW4sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG4gIC8qKiBVc2UgV2ViREFWIGFzIHRoZSBDRE4gZm9yIEhMUyBvdXRwdXQuICovXG4gIHB1YmxpYyBzdGF0aWMgd2ViZGF2KHByb3BzPzogSGxzV2ViZGF2Q2RuUHJvcHMpOiBIbHNDZG5TZXR0aW5ncyB7XG4gICAgcmV0dXJuIG5ldyBIbHNDZG5TZXR0aW5ncyh7XG4gICAgICBobHNXZWJkYXZTZXR0aW5nczoge1xuICAgICAgICBjb25uZWN0aW9uUmV0cnlJbnRlcnZhbDogcHJvcHM/LmNvbm5lY3Rpb25SZXRyeUludGVydmFsID8/IDEsXG4gICAgICAgIGZpbGVjYWNoZUR1cmF0aW9uOiBwcm9wcz8uZmlsZWNhY2hlRHVyYXRpb24/LnRvU2Vjb25kcygpID8/IDMwMCxcbiAgICAgICAgbnVtUmV0cmllczogcHJvcHM/Lm51bVJldHJpZXMgPz8gMTAsXG4gICAgICAgIHJlc3RhcnREZWxheTogcHJvcHM/LnJlc3RhcnREZWxheSA/PyAxLFxuICAgICAgICBodHRwVHJhbnNmZXJNb2RlOiAocHJvcHM/Lmh0dHBUcmFuc2Zlck1vZGUgPz8gSHR0cFRyYW5zZmVyTW9kZS5OT05fQ0hVTktFRCkudmFsdWUsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IENmbkNoYW5uZWwuSGxzQ2RuU2V0dGluZ3NQcm9wZXJ0eTtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihjb25maWc6IENmbkNoYW5uZWwuSGxzQ2RuU2V0dGluZ3NQcm9wZXJ0eSkgeyB0aGlzLmNvbmZpZyA9IGNvbmZpZzsgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9iaW5kKCk6IENmbkNoYW5uZWwuSGxzQ2RuU2V0dGluZ3NQcm9wZXJ0eSB7IHJldHVybiB0aGlzLmNvbmZpZzsgfVxufVxuXG4vKipcbiAqIENvbW1vbiBwcm9wZXJ0aWVzIHNoYXJlZCBieSB0aGUgTWVkaWFQYWNrYWdlIFYyIG91dHB1dCBncm91cCB2YXJpYW50cy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYWxpdmUvbGF0ZXN0L3VnL2NyZWF0aW5nLW1lZGlhcGFja2FnZS1vdXRwdXQtZ3JvdXAuaHRtbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lZGlhUGFja2FnZVYyT3V0cHV0R3JvdXBCYXNlUHJvcHMge1xuICAvKiogVGhlIG5hbWUgb2YgdGhpcyBvdXRwdXQgZ3JvdXAuIFVzZWQgYXMgdGhlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBJRC4gVW5kZXJzY29yZXMgYXJlIG5vcm1hbGlzZWQgdG8gaHlwaGVucyBpbnRlcm5hbGx5LiAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb25maWd1cmUgYWRkaXRpb25hbCBkZXN0aW5hdGlvbnMgdG8gZmFuIG91dCB0aGUgb3V0cHV0IHRvIGV4dHJhIE1lZGlhUGFja2FnZSBWMlxuICAgKiBjaGFubmVscywgZm9yIGV4YW1wbGUgZm9yIGNyb3NzLXJlZ2lvbiBkZWxpdmVyeSBvciBiYWNrdXAgcGFja2FnaW5nLlxuICAgKiBUaGVzZSBjb3JyZXNwb25kIHRvIERlc3RpbmF0aW9uIDMvNCBpbiB0aGUgQVdTIGNvbnNvbGUuIEVhY2ggYWRkaXRpb25hbCBkZXN0aW5hdGlvbiBpcyBhXG4gICAqIHNpbmdsZSwgZXhwbGljaXQgZW50cnkgKGNoYW5uZWwgKyBlbmRwb2ludCksIGluZGVwZW5kZW50IG9mIHRoZSBjaGFubmVsIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYWxpdmUvbGF0ZXN0L3VnL2NyZWF0aW5nLW1lZGlhcGFja2FnZS1vdXRwdXQtZ3JvdXAuaHRtbFxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgZGVzdGluYXRpb25zXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsRGVzdGluYXRpb25zPzogTWVkaWFQYWNrYWdlVjJEZXN0aW5hdGlvbltdO1xuICAvKipcbiAgICogVGhlIGxlbmd0aCBvZiBlYWNoIG1lZGlhIHNlZ21lbnQuXG4gICAqIEBkZWZhdWx0IC0gU2VnbWVudC5zZWNvbmRzKDEpXG4gICAqL1xuICByZWFkb25seSBzZWdtZW50PzogU2VnbWVudDtcbiAgLyoqXG4gICAqIFRoZSBJRDMgYmVoYXZpb3IuXG4gICAqIEBkZWZhdWx0IElkM0JlaGF2aW9yLkRJU0FCTEVEXG4gICAqL1xuICByZWFkb25seSBpZDNCZWhhdmlvcj86IElkM0JlaGF2aW9yO1xuICAvKipcbiAgICogVGhlIEtMViBiZWhhdmlvci5cbiAgICogQGRlZmF1bHQgS2x2QmVoYXZpb3IuTk9fUEFTU1RIUk9VR0hcbiAgICovXG4gIHJlYWRvbmx5IGtsdkJlaGF2aW9yPzogS2x2QmVoYXZpb3I7XG4gIC8qKlxuICAgKiBUaGUgTmllbHNlbiBJRDMgYmVoYXZpb3IuXG4gICAqIEBkZWZhdWx0IE5pZWxzZW5JZDNCZWhhdmlvci5OT19QQVNTVEhST1VHSFxuICAgKi9cbiAgcmVhZG9ubHkgbmllbHNlbklkM0JlaGF2aW9yPzogTmllbHNlbklkM0JlaGF2aW9yO1xuICAvKipcbiAgICogVGhlIFNDVEUtMzUgdHlwZS5cbiAgICogQGRlZmF1bHQgU2N0ZTM1VHlwZS5TQ1RFXzM1X1dJVEhPVVRfU0VHTUVOVEFUSU9OXG4gICAqL1xuICByZWFkb25seSBzY3RlMzVUeXBlPzogU2N0ZTM1VHlwZTtcbiAgLyoqXG4gICAqIFRoZSB0aW1lZCBtZXRhZGF0YSBJRDMgZnJhbWUuXG4gICAqIEBkZWZhdWx0IFRpbWVkTWV0YWRhdGFJZDNGcmFtZS5OT05FXG4gICAqL1xuICByZWFkb25seSB0aW1lZE1ldGFkYXRhSWQzRnJhbWU/OiBUaW1lZE1ldGFkYXRhSWQzRnJhbWU7XG4gIC8qKlxuICAgKiBUaGUgdGltZWQgbWV0YWRhdGEgaW50ZXJ2YWwuXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLnNlY29uZHMoMTApXG4gICAqL1xuICByZWFkb25seSB0aW1lZE1ldGFkYXRhSWQzUGVyaW9kPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRpbWVkIG1ldGFkYXRhIGlzIHBhc3NlZCB0aHJvdWdoLlxuICAgKiBAZGVmYXVsdCBUaW1lZE1ldGFkYXRhUGFzc3Rocm91Z2guRElTQUJMRURcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVkTWV0YWRhdGFQYXNzdGhyb3VnaD86IFRpbWVkTWV0YWRhdGFQYXNzdGhyb3VnaDtcbiAgLyoqXG4gICAqIENhcHRpb24gbGFuZ3VhZ2UgbWFwcGluZ3MgZm9yIHRoZSBNZWRpYVBhY2thZ2UgVjIgb3V0cHV0LlxuICAgKiBAZGVmYXVsdCAtIG5vIGNhcHRpb24gbGFuZ3VhZ2UgbWFwcGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IGNhcHRpb25MYW5ndWFnZU1hcHBpbmdzPzogQ2FwdGlvbkxhbmd1YWdlTWFwcGluZ1tdO1xuICAvKipcbiAgICogVGhlIG91dHB1dHMgZm9yIHRoaXMgb3V0cHV0IGdyb3VwLlxuICAgKlxuICAgKiBNZWRpYVBhY2thZ2UgVjIgdXNlcyBDTUFGIGluZ2VzdCB3aGljaCByZXF1aXJlcyBvbmUgdHJhY2sgcGVyIG91dHB1dC5cbiAgICogQ3JlYXRlIGEgc2VwYXJhdGUgb3V0cHV0IGZvciBlYWNoIGVuY29kZSAoZS5nLiBvbmUgZm9yIEhEIHZpZGVvLCBvbmUgZm9yIFNEIHZpZGVvLCBvbmUgZm9yIGF1ZGlvKS5cbiAgICogRG8gTk9UIHB1dCBtdWx0aXBsZSBlbmNvZGVzIGluIGEgc2luZ2xlIG91dHB1dC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dHM6IE1lZGlhUGFja2FnZVYyT3V0cHV0RGVmaW5pdGlvbltdO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGEgTWVkaWFQYWNrYWdlIFYyIG91dHB1dCBncm91cC5cbiAqXG4gKiBSZWZlcmVuY2UgYSBzaW5nbGUgTWVkaWFQYWNrYWdlIFYyIGNoYW5uZWw7IE1lZGlhTGl2ZSB3aXJlcyBlYWNoIGNoYW5uZWwgcGlwZWxpbmUgdG8gYVxuICogTWVkaWFQYWNrYWdlIGluZ2VzdCBlbmRwb2ludCBhdXRvbWF0aWNhbGx5IChvbmUgZm9yIFNJTkdMRV9QSVBFTElORSwgYm90aCBmb3IgU1RBTkRBUkQpLiBGb3JcbiAqIHBlci1waXBlbGluZSBjb250cm9sIOKAlCBmb3IgZXhhbXBsZSBzZW5kaW5nIHBpcGVsaW5lIDAgdG8gYSBzcGVjaWZpYyBlbmRwb2ludCBvZiBhIGNoYW5uZWwgaW5cbiAqIGFub3RoZXIgcmVnaW9uIOKAlCB1c2UgYE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbi5tZWRpYVBhY2thZ2VWMlBlclBpcGVsaW5lKClgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVkaWFQYWNrYWdlVjJPdXRwdXRHcm91cFByb3BzIGV4dGVuZHMgTWVkaWFQYWNrYWdlVjJPdXRwdXRHcm91cEJhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgTWVkaWFQYWNrYWdlIFYyIGNoYW5uZWwgdG8gZGVsaXZlciB0by4gTWVkaWFMaXZlIG1hcHMgdGhlIGNoYW5uZWwgcGlwZWxpbmVzIHRvIHRoZVxuICAgKiBjaGFubmVsJ3MgaW5nZXN0IGVuZHBvaW50cyBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSBjaGFubmVsIGNsYXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbDogSU1lZGlhUGFja2FnZVYyQ2hhbm5lbDtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIE1lZGlhUGFja2FnZSBWMiBvdXRwdXQgZ3JvdXAgd2l0aCBleHBsaWNpdCBwZXItcGlwZWxpbmUgZGVzdGluYXRpb25zLlxuICpcbiAqIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgdG8gY29udHJvbCB0aGUgY2hhbm5lbCBhbmQgZW5kcG9pbnQgZWFjaCBwaXBlbGluZSBkZWxpdmVycyB0byDigJQgZm9yXG4gKiBleGFtcGxlIGNyb3NzLXJlZ2lvbiBkZWxpdmVyeSwgb3IgcGlubmluZyBwaXBlbGluZSAwIHRvIGEgc3BlY2lmaWMgZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVkaWFQYWNrYWdlVjJQZXJQaXBlbGluZU91dHB1dEdyb3VwUHJvcHMgZXh0ZW5kcyBNZWRpYVBhY2thZ2VWMk91dHB1dEdyb3VwQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBwcmltYXJ5IE1lZGlhUGFja2FnZSBWMiBkZXN0aW5hdGlvbnMg4oCUIG9uZSBwZXIgcGlwZWxpbmUuXG4gICAqXG4gICAqIEFycmF5IHBvc2l0aW9uIGRldGVybWluZXMgdGhlIHBpcGVsaW5lIG1hcHBpbmc6XG4gICAqIC0gYGRlc3RpbmF0aW9uc1swXWAg4oaSIFBpcGVsaW5lIDBcbiAgICogLSBgZGVzdGluYXRpb25zWzFdYCDihpIgUGlwZWxpbmUgMSAoU1RBTkRBUkQgY2hhbm5lbHMgb25seSlcbiAgICpcbiAgICogRm9yIGEgU0lOR0xFX1BJUEVMSU5FIGNoYW5uZWwsIHByb3ZpZGUgZXhhY3RseSAxIGRlc3RpbmF0aW9uLlxuICAgKiBGb3IgYSBTVEFOREFSRCBjaGFubmVsLCBwcm92aWRlIGV4YWN0bHkgMiBkZXN0aW5hdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbnM6IE1lZGlhUGFja2FnZVYyRGVzdGluYXRpb25bXTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIE1lZGlhQ29ubmVjdCBSb3V0ZXIgb3V0cHV0IGdyb3VwLlxuICpcbiAqIERlbGl2ZXJzIGVhY2ggY2hhbm5lbCBwaXBlbGluZSB0byBhIE1lZGlhQ29ubmVjdCBSb3V0ZXIuIFRoZSBkb3duc3RyZWFtIHJvdXRpbmcgKHdoaWNoIHJvdXRlclxuICogaW5wdXQgZWFjaCBwaXBlbGluZSBmZWVkcykgaXMgY29uZmlndXJlZCBvbiB0aGUgTWVkaWFDb25uZWN0IHNpZGUsIHJlZmVyZW5jaW5nIHRoaXMgZ3JvdXAgYnlcbiAqIGBuYW1lYCBhbmQgcGlwZWxpbmUgaWQuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1tZWRpYWxpdmUtY2hhbm5lbC1tZWRpYWNvbm5lY3Ryb3V0ZXJncm91cHNldHRpbmdzLmh0bWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZWRpYUNvbm5lY3RSb3V0ZXJPdXRwdXRHcm91cFByb3BzIHtcbiAgLyoqIFRoZSBuYW1lIG9mIHRoaXMgb3V0cHV0IGdyb3VwLiBVc2VkIGFzIHRoZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgSUQuIFVuZGVyc2NvcmVzIGFyZSBub3JtYWxpc2VkIHRvIGh5cGhlbnMgaW50ZXJuYWxseS4gKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIEF2YWlsYWJpbGl0eSBab25lcyBpbiB3aGljaCB0byB3cml0ZSBvdXRwdXQgdG8gdGhlIE1lZGlhQ29ubmVjdCBSb3V0ZXIuIFByb3ZpZGUgZXhhY3RseVxuICAgKiBvbmUgQVogZm9yIGEgYFNJTkdMRV9QSVBFTElORWAgY2hhbm5lbCwgb3IgdHdvIChvbmUgcGVyIHBpcGVsaW5lKSBmb3IgYSBgU1RBTkRBUkRgIGNoYW5uZWwuXG4gICAqL1xuICByZWFkb25seSBhdmFpbGFiaWxpdHlab25lczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUcmFuc2l0LWVuY3J5cHRpb24gc2V0dGluZ3MsIGFwcGxpZWQgcGVyIGNoYW5uZWwgcGlwZWxpbmUuXG4gICAqIEBkZWZhdWx0IC0gQVVUT01BVElDIChzZXJ2aWNlLW1hbmFnZWQpIHRyYW5zaXQgZW5jcnlwdGlvbiBvbiBldmVyeSBwaXBlbGluZVxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyU2V0dGluZ3M/OiBNZWRpYUNvbm5lY3RSb3V0ZXJTZXR0aW5ncztcbiAgLyoqXG4gICAqIFRoZSBvdXRwdXRzIGZvciB0aGlzIG91dHB1dCBncm91cC5cbiAgICpcbiAgICogTWVkaWFDb25uZWN0IFJvdXRlciBvdXRwdXRzIHVzZSBhbiBNUEVHLVRTIGNvbnRhaW5lciwgc28gZWFjaCBvdXRwdXQgbWF5IG11bHRpcGxleCBvbmUgdmlkZW9cbiAgICogZW5jb2RlIGFuZCBvbmUgb3IgbW9yZSBhdWRpbyBlbmNvZGVzIChhcyB3aXRoIFVEUCkuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRzOiBNZWRpYUNvbm5lY3RSb3V0ZXJPdXRwdXREZWZpbml0aW9uW107XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYW4gSExTIG91dHB1dCBncm91cC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIbHNPdXRwdXRHcm91cFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgb3V0cHV0IGdyb3VwLiBVc2VkIGFzIHRoZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgSUQuIFVuZGVyc2NvcmVzIGFyZSBub3JtYWxpc2VkIHRvIGh5cGhlbnMgaW50ZXJuYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkZXN0aW5hdGlvbnMgZm9yIHRoaXMgb3V0cHV0IGdyb3VwIOKAlCBvbmUgcGVyIHBpcGVsaW5lLlxuICAgKlxuICAgKiBBcnJheSBwb3NpdGlvbiBkZXRlcm1pbmVzIHRoZSBwaXBlbGluZSBtYXBwaW5nOlxuICAgKiAtIGBkZXN0aW5hdGlvbnNbMF1gIOKGkiBQaXBlbGluZSAwXG4gICAqIC0gYGRlc3RpbmF0aW9uc1sxXWAg4oaSIFBpcGVsaW5lIDEgKFNUQU5EQVJEIGNoYW5uZWxzIG9ubHkpXG4gICAqXG4gICAqIEZvciBhIFNJTkdMRV9QSVBFTElORSBjaGFubmVsLCBwcm92aWRlIGV4YWN0bHkgMSBkZXN0aW5hdGlvbi5cbiAgICogRm9yIGEgU1RBTkRBUkQgY2hhbm5lbCwgcHJvdmlkZSBleGFjdGx5IDIgZGVzdGluYXRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb25zOiBPdXRwdXREZXN0aW5hdGlvbltdO1xuICAvKipcbiAgICogVGhlIGxlbmd0aCBvZiBlYWNoIG1lZGlhIHNlZ21lbnQuIEhMUyBzdXBwb3J0cyB3aG9sZS1zZWNvbmQgc2VnbWVudHMgb25seS5cbiAgICogQGRlZmF1bHQgLSBTZWdtZW50LnNlY29uZHMoMilcbiAgICovXG4gIHJlYWRvbmx5IHNlZ21lbnQ/OiBTZWdtZW50O1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBzZWdtZW50cyB0byByZXRhaW4gaW4gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSAoTElWRSBtb2RlIG9ubHkpLlxuICAgKiBAZGVmYXVsdCAyMVxuICAgKi9cbiAgcmVhZG9ubHkga2VlcFNlZ21lbnRzPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHNlZ21lbnRzIGluIHRoZSBtZWRpYSBtYW5pZmVzdCAoTElWRSBtb2RlIG9ubHkpLlxuICAgKiBAZGVmYXVsdCAxMFxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZXhOU2VnbWVudHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgb3V0cHV0IG1vZGUg4oCUIExJVkUgb3IgVk9ELlxuICAgKiBAZGVmYXVsdCBIbHNNb2RlLkxJVkVcbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBIbHNNb2RlO1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gc2VnbWVudCBsZW5ndGguIEhMUyBzdXBwb3J0cyB3aG9sZS1zZWNvbmQgc2VnbWVudHMgb25seS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IG1pblNlZ21lbnQ/OiBTZWdtZW50O1xuICAvKipcbiAgICogQWN0aW9uIHRvIHRha2Ugd2hlbiB0aGUgaW5wdXQgaXMgbG9zdC5cbiAgICogQGRlZmF1bHQgSGxzSW5wdXRMb3NzQWN0aW9uLkVNSVRfT1VUUFVUXG4gICAqL1xuICByZWFkb25seSBpbnB1dExvc3NBY3Rpb24/OiBIbHNJbnB1dExvc3NBY3Rpb247XG4gIC8qKlxuICAgKiBDaG9vc2VzIG9uZSBvciBtb3JlIGFkIG1hcmtlciB0eXBlcyB0byBwYXNzIFNDVEUzNSBzaWduYWxzIHRocm91Z2ggdG8gdGhpcyBncm91cCBvZiBBcHBsZSBITFMgb3V0cHV0cy5cbiAgICogQGRlZmF1bHQgLSBubyBhZCBtYXJrZXJzXG4gICAqL1xuICByZWFkb25seSBhZE1hcmtlcnM/OiBIbHNBZE1hcmtlcnNbXTtcbiAgLyoqXG4gICAqIEEgcGFydGlhbCBVUkkgcHJlZml4IHRoYXQgd2lsbCBiZSBwcmVwZW5kZWQgdG8gZWFjaCBvdXRwdXQgaW4gdGhlIG1lZGlhIC5tM3U4IGZpbGUuXG4gICAqIEBkZWZhdWx0IC0gbm8gYmFzZSBVUkwgY29udGVudCBwcmVmaXhcbiAgICovXG4gIHJlYWRvbmx5IGJhc2VVcmxDb250ZW50Pzogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgYmFzZSBVUkwgY29udGVudCBmb3IgcGlwZWxpbmUgMSBpZiBkaWZmZXJlbnQgZnJvbSBwaXBlbGluZSAwLlxuICAgKiBAZGVmYXVsdCAtIG5vIGJhc2UgVVJMIGNvbnRlbnQgMVxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVVybENvbnRlbnQxPzogc3RyaW5nO1xuICAvKipcbiAgICogQSBwYXJ0aWFsIFVSSSBwcmVmaXggdGhhdCB3aWxsIGJlIHByZXBlbmRlZCB0byBlYWNoIG91dHB1dCBpbiB0aGUgbWVkaWEgLm0zdTggZmlsZSBmb3IgdGhlIG1hbmlmZXN0LlxuICAgKiBAZGVmYXVsdCAtIG5vIGJhc2UgVVJMIG1hbmlmZXN0IHByZWZpeFxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVVybE1hbmlmZXN0Pzogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgYmFzZSBVUkwgbWFuaWZlc3QgZm9yIHBpcGVsaW5lIDEgaWYgZGlmZmVyZW50IGZyb20gcGlwZWxpbmUgMC5cbiAgICogQGRlZmF1bHQgLSBubyBiYXNlIFVSTCBtYW5pZmVzdCAxXG4gICAqL1xuICByZWFkb25seSBiYXNlVXJsTWFuaWZlc3QxPzogc3RyaW5nO1xuICAvKipcbiAgICogQSBtYXBwaW5nIG9mIHVwIHRvIDQgY2FwdGlvbnMgY2hhbm5lbHMgdG8gY2FwdGlvbnMgbGFuZ3VhZ2VzLlxuICAgKiBNZWFuaW5nZnVsIG9ubHkgaWYgY2FwdGlvbkxhbmd1YWdlU2V0dGluZyBpcyBzZXQgdG8gSU5TRVJULlxuICAgKiBAZGVmYXVsdCAtIG5vIGNhcHRpb24gbGFuZ3VhZ2UgbWFwcGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IGNhcHRpb25MYW5ndWFnZU1hcHBpbmdzPzogQ2FwdGlvbkxhbmd1YWdlTWFwcGluZ1tdO1xuICAvKipcbiAgICogQXBwbGllcyBvbmx5IHRvIDYwOCBlbWJlZGRlZCBvdXRwdXQgY2FwdGlvbnMuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBjYXB0aW9uTGFuZ3VhZ2VTZXR0aW5nPzogSGxzQ2FwdGlvbkxhbmd1YWdlU2V0dGluZztcbiAgLyoqXG4gICAqIFdoZW4gc2V0IHRvIERJU0FCTEVELCBzZXRzIHRoZSAjRVhULVgtQUxMT1ctQ0FDSEU6bm8gdGFnIGluIHRoZSBtYW5pZmVzdC5cbiAgICogQGRlZmF1bHQgSGxzQ2xpZW50Q2FjaGUuRU5BQkxFRFxuICAgKi9cbiAgcmVhZG9ubHkgY2xpZW50Q2FjaGU/OiBIbHNDbGllbnRDYWNoZTtcbiAgLyoqXG4gICAqIFRoZSBzcGVjaWZpY2F0aW9uIHRvIHVzZSAoUkZDLTYzODEgb3IgdGhlIGRlZmF1bHQgUkZDLTQyODEpIGR1cmluZyBtM3U4IHBsYXlsaXN0IGdlbmVyYXRpb24uXG4gICAqIEBkZWZhdWx0IEhsc0NvZGVjU3BlY2lmaWNhdGlvbi5SRkNfNDI4MVxuICAgKi9cbiAgcmVhZG9ubHkgY29kZWNTcGVjaWZpY2F0aW9uPzogSGxzQ29kZWNTcGVjaWZpY2F0aW9uO1xuICAvKipcbiAgICogQSAxMjgtYml0LCAxNi1ieXRlIGhleCB2YWx1ZSByZXByZXNlbnRlZCBieSBhIDMyLWNoYXJhY3RlciB0ZXh0IHN0cmluZyB1c2VkIGFzIHRoZSBJViBmb3IgZW5jcnlwdGlvbi5cbiAgICogVXNlZCB3aXRoIGVuY3J5cHRpb25UeXBlIHdoZW4gaXZTb3VyY2UgaXMgc2V0IHRvIEVYUExJQ0lULlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbnN0YW50IElWXG4gICAqL1xuICByZWFkb25seSBjb25zdGFudEl2Pzogc3RyaW5nO1xuICAvKipcbiAgICogUGxhY2VzIHNlZ21lbnRzIGluIHN1YmRpcmVjdG9yaWVzLlxuICAgKiBAZGVmYXVsdCBIbHNEaXJlY3RvcnlTdHJ1Y3R1cmUuU0lOR0xFX0RJUkVDVE9SWVxuICAgKi9cbiAgcmVhZG9ubHkgZGlyZWN0b3J5U3RydWN0dXJlPzogSGxzRGlyZWN0b3J5U3RydWN0dXJlO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gaW5zZXJ0IEVYVC1YLURJU0NPTlRJTlVJVFkgdGFncyBpbiB0aGUgSExTIGNoaWxkIG1hbmlmZXN0cy5cbiAgICogQGRlZmF1bHQgSGxzRGlzY29udGludWl0eVRhZ3MuSU5TRVJUXG4gICAqL1xuICByZWFkb25seSBkaXNjb250aW51aXR5VGFncz86IEhsc0Rpc2NvbnRpbnVpdHlUYWdzO1xuICAvKipcbiAgICogRW5jcnlwdHMgdGhlIHNlZ21lbnRzIHdpdGggdGhlIHNwZWNpZmllZCBlbmNyeXB0aW9uIHNjaGVtZS5cbiAgICogQGRlZmF1bHQgLSBubyBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uVHlwZT86IEhsc0VuY3J5cHRpb25UeXBlO1xuICAvKipcbiAgICogU2V0dGluZ3MgdG8gY29uZmlndXJlIHRoZSBDRE4gZm9yIHRoZSBITFMgb3V0cHV0LlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgaGxzQ2RuU2V0dGluZ3M/OiBIbHNDZG5TZXR0aW5ncztcbiAgLyoqXG4gICAqIFN0YXRlIG9mIEhMUyBJRDMgU2VnbWVudCBUYWdnaW5nLlxuICAgKiBAZGVmYXVsdCBIbHNJZDNTZWdtZW50VGFnZ2luZ1N0YXRlLkRJU0FCTEVEXG4gICAqL1xuICByZWFkb25seSBobHNJZDNTZWdtZW50VGFnZ2luZz86IEhsc0lkM1NlZ21lbnRUYWdnaW5nU3RhdGU7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNyZWF0ZSBhbiBJLWZyYW1lLW9ubHkgbWFuaWZlc3QuXG4gICAqIEBkZWZhdWx0IEhsc0lGcmFtZU9ubHlQbGF5bGlzdHMuRElTQUJMRURcbiAgICovXG4gIHJlYWRvbmx5IGlGcmFtZU9ubHlQbGF5bGlzdHM/OiBIbHNJRnJhbWVPbmx5UGxheWxpc3RzO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgZmluYWwgKGluY29tcGxldGUpIHNlZ21lbnQgaW4gdGhlIG1lZGlhIG91dHB1dC5cbiAgICogQGRlZmF1bHQgSGxzSW5jb21wbGV0ZVNlZ21lbnRCZWhhdmlvci5BVVRPXG4gICAqL1xuICByZWFkb25seSBpbmNvbXBsZXRlU2VnbWVudEJlaGF2aW9yPzogSGxzSW5jb21wbGV0ZVNlZ21lbnRCZWhhdmlvcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIElWIGlzIGxpc3RlZCBpbiB0aGUgbWFuaWZlc3QuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBpdkluTWFuaWZlc3Q/OiBIbHNJdkluTWFuaWZlc3Q7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBJViBmb2xsb3dzIHRoZSBzZWdtZW50IG51bWJlciBvciBpcyBleHBsaWNpdC5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGl2U291cmNlPzogSGxzSXZTb3VyY2U7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaG93IHRoZSBrZXkgaXMgcmVwcmVzZW50ZWQgaW4gdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhlIFVSSS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGtleUZvcm1hdD86IHN0cmluZztcbiAgLyoqXG4gICAqIEVpdGhlciBhIHNpbmdsZSBwb3NpdGl2ZSBpbnRlZ2VyIHZlcnNpb24gdmFsdWUgb3IgYSBzbGFzaC1kZWxpbWl0ZWQgbGlzdCBvZiB2ZXJzaW9uIHZhbHVlcyAoMS8yLzMpLlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkga2V5Rm9ybWF0VmVyc2lvbnM/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUga2V5IHByb3ZpZGVyIHNldHRpbmdzIGZvciBITFMgZW5jcnlwdGlvbi5cbiAgICogQGRlZmF1bHQgLSBubyBrZXkgcHJvdmlkZXIgc2V0dGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IGtleVByb3ZpZGVyU2V0dGluZ3M/OiBIbHNLZXlQcm92aWRlclNldHRpbmdzO1xuICAvKipcbiAgICogV2hlbiBzZXQgdG8gR1pJUCwgY29tcHJlc3NlcyBITFMgcGxheWxpc3QuXG4gICAqIEBkZWZhdWx0IEhsc01hbmlmZXN0Q29tcHJlc3Npb24uTk9ORVxuICAgKi9cbiAgcmVhZG9ubHkgbWFuaWZlc3RDb21wcmVzc2lvbj86IEhsc01hbmlmZXN0Q29tcHJlc3Npb247XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgb3V0cHV0IG1hbmlmZXN0IHNob3VsZCB1c2UgZmxvYXRpbmcgcG9pbnQgb3IgaW50ZWdlciB2YWx1ZXMgZm9yIHNlZ21lbnQgZHVyYXRpb24uXG4gICAqIEBkZWZhdWx0IEhsc01hbmlmZXN0RHVyYXRpb25Gb3JtYXQuRkxPQVRJTkdfUE9JTlRcbiAgICovXG4gIHJlYWRvbmx5IG1hbmlmZXN0RHVyYXRpb25Gb3JtYXQ/OiBIbHNNYW5pZmVzdER1cmF0aW9uRm9ybWF0O1xuICAvKipcbiAgICogQ29udHJvbHMgd2hpY2ggbWFuaWZlc3RzIGFuZCBzZWdtZW50cyBhcmUgZ2VuZXJhdGVkLlxuICAgKiBAZGVmYXVsdCBIbHNPdXRwdXRTZWxlY3Rpb24uTUFOSUZFU1RTX0FORF9TRUdNRU5UU1xuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0U2VsZWN0aW9uPzogSGxzT3V0cHV0U2VsZWN0aW9uO1xuICAvKipcbiAgICogSW5jbHVkZXMgb3IgZXhjbHVkZXMgdGhlIEVYVC1YLVBST0dSQU0tREFURS1USU1FIHRhZyBpbiAubTN1OCBtYW5pZmVzdCBmaWxlcy5cbiAgICogQGRlZmF1bHQgSGxzUHJvZ3JhbURhdGVUaW1lLklOQ0xVREVcbiAgICovXG4gIHJlYWRvbmx5IHByb2dyYW1EYXRlVGltZT86IEhsc1Byb2dyYW1EYXRlVGltZTtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgYWxnb3JpdGhtIHVzZWQgdG8gZHJpdmUgdGhlIEhMUyBFWFQtWC1QUk9HUkFNLURBVEUtVElNRSBjbG9jay5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBIbHNQcm9ncmFtRGF0ZVRpbWVDbG9jay5TWVNURU1fQ0xPQ0ssIG9yIElOSVRJQUxJWkVfRlJPTV9PVVRQVVRfVElNRUNPREUgd2l0aCBlcG9jaCBsb2NraW5nXG4gICAqL1xuICByZWFkb25seSBwcm9ncmFtRGF0ZVRpbWVDbG9jaz86IEhsc1Byb2dyYW1EYXRlVGltZUNsb2NrO1xuICAvKipcbiAgICogVGhlIHBlcmlvZCBvZiBpbnNlcnRpb24gb2YgdGhlIEVYVC1YLVBST0dSQU0tREFURS1USU1FIGVudHJ5LlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5taW51dGVzKDEwKVxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZ3JhbURhdGVUaW1lUGVyaW9kPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBtYXN0ZXIgbWFuaWZlc3QgaW5jbHVkZXMgaW5mb3JtYXRpb24gYWJvdXQgYm90aCBwaXBlbGluZXMuXG4gICAqIEBkZWZhdWx0IEhsc1JlZHVuZGFudE1hbmlmZXN0LkRJU0FCTEVEXG4gICAqL1xuICByZWFkb25seSByZWR1bmRhbnRNYW5pZmVzdD86IEhsc1JlZHVuZGFudE1hbmlmZXN0O1xuICAvKipcbiAgICogVGhlIHNlZ21lbnRhdGlvbiBtb2RlLlxuICAgKiBAZGVmYXVsdCBIbHNTZWdtZW50YXRpb25Nb2RlLlVTRV9TRUdNRU5UX0RVUkFUSU9OXG4gICAqL1xuICByZWFkb25seSBzZWdtZW50YXRpb25Nb2RlPzogSGxzU2VnbWVudGF0aW9uTW9kZTtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2Ygc2VnbWVudHMgdG8gd3JpdGUgdG8gYSBzdWJkaXJlY3RvcnkgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IG9uZS5cbiAgICogQGRlZmF1bHQgMTAwMDBcbiAgICovXG4gIHJlYWRvbmx5IHNlZ21lbnRzUGVyU3ViZGlyZWN0b3J5PzogbnVtYmVyO1xuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIG9yIGV4Y2x1ZGUgdGhlIFJFU09MVVRJT04gYXR0cmlidXRlIGZvciBhIHZpZGVvIGluIHRoZSBFWFQtWC1TVFJFQU0tSU5GIHRhZy5cbiAgICogQGRlZmF1bHQgSGxzU3RyZWFtSW5mUmVzb2x1dGlvbi5JTkNMVURFXG4gICAqL1xuICByZWFkb25seSBzdHJlYW1JbmZSZXNvbHV0aW9uPzogSGxzU3RyZWFtSW5mUmVzb2x1dGlvbjtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgSUQzIGZyYW1lIHRoYXQgaGFzIHRoZSB0aW1lY29kZS5cbiAgICogQGRlZmF1bHQgSGxzVGltZWRNZXRhZGF0YUlkM0ZyYW1lLlBSSVZcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVkTWV0YWRhdGFJZDNGcmFtZT86IEhsc1RpbWVkTWV0YWRhdGFJZDNGcmFtZTtcbiAgLyoqXG4gICAqIFRoZSB0aW1lZCBtZXRhZGF0YSBpbnRlcnZhbC5cbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcygxMClcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVkTWV0YWRhdGFJZDNQZXJpb2Q/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFByb3ZpZGVzIGFuIGV4dHJhIGRlbHRhIG9mZnNldCB0byBmaW5lIHR1bmUgdGhlIHRpbWVzdGFtcHMuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSB0aW1lc3RhbXBEZWx0YT86IER1cmF0aW9uO1xuICAvKipcbiAgICogV2hldGhlciB0byBlbWl0IHNlZ21lbnRlZCBmaWxlcyBvciBhIHNpbmdsZSBmaWxlLlxuICAgKiBAZGVmYXVsdCBIbHNUc0ZpbGVNb2RlLlNFR01FTlRFRF9GSUxFU1xuICAgKi9cbiAgcmVhZG9ubHkgdHNGaWxlTW9kZT86IEhsc1RzRmlsZU1vZGU7XG4gIC8qKlxuICAgKiBUaGUgb3V0cHV0cyBmb3IgdGhpcyBITFMgb3V0cHV0IGdyb3VwLlxuICAgKiBAZGVmYXVsdCAtIG5vIGluaXRpYWwgb3V0cHV0c1xuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0cz86IEhsc091dHB1dERlZmluaXRpb25bXTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIFVEUCBvdXRwdXQgZ3JvdXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVWRwT3V0cHV0R3JvdXBQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGlzIG91dHB1dCBncm91cC4gVXNlZCBhcyB0aGUgZGVzdGluYXRpb24gcmVmZXJlbmNlIElELiBVbmRlcnNjb3JlcyBhcmUgbm9ybWFsaXNlZCB0byBoeXBoZW5zIGludGVybmFsbHkuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzdGluYXRpb25zIGZvciB0aGlzIG91dHB1dCBncm91cCDigJQgb25lIHBlciBwaXBlbGluZS5cbiAgICpcbiAgICogQXJyYXkgcG9zaXRpb24gZGV0ZXJtaW5lcyB0aGUgcGlwZWxpbmUgbWFwcGluZzpcbiAgICogLSBgZGVzdGluYXRpb25zWzBdYCDihpIgUGlwZWxpbmUgMFxuICAgKiAtIGBkZXN0aW5hdGlvbnNbMV1gIOKGkiBQaXBlbGluZSAxIChTVEFOREFSRCBjaGFubmVscyBvbmx5KVxuICAgKlxuICAgKiBGb3IgYSBTSU5HTEVfUElQRUxJTkUgY2hhbm5lbCwgcHJvdmlkZSBleGFjdGx5IDEgZGVzdGluYXRpb24uXG4gICAqIEZvciBhIFNUQU5EQVJEIGNoYW5uZWwsIHByb3ZpZGUgZXhhY3RseSAyIGRlc3RpbmF0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uczogVWRwT3V0cHV0RGVzdGluYXRpb25bXTtcbiAgLyoqXG4gICAqIFRoZSBvdXRwdXQgYnVmZmVyaW5nLiBBcHBsaWVkIGF0IG1pbGxpc2Vjb25kIGdyYW51bGFyaXR5LlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgYnVmZmVyPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBBY3Rpb24gdG8gdGFrZSB3aGVuIHRoZSBpbnB1dCBpcyBsb3N0LlxuICAgKiBAZGVmYXVsdCBVZHBJbnB1dExvc3NBY3Rpb24uRU1JVF9QUk9HUkFNXG4gICAqL1xuICByZWFkb25seSBpbnB1dExvc3NBY3Rpb24/OiBVZHBJbnB1dExvc3NBY3Rpb247XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIElEMyBmcmFtZSB0aGF0IGhhcyB0aGUgdGltZWNvZGUuXG4gICAqIEBkZWZhdWx0IFVkcFRpbWVkTWV0YWRhdGFJZDNGcmFtZS5QUklWXG4gICAqL1xuICByZWFkb25seSB0aW1lZE1ldGFkYXRhSWQzRnJhbWU/OiBVZHBUaW1lZE1ldGFkYXRhSWQzRnJhbWU7XG4gIC8qKlxuICAgKiBUaGUgdGltZWQgbWV0YWRhdGEgaW50ZXJ2YWwuXG4gICAqIEBkZWZhdWx0IC0gRHVyYXRpb24uc2Vjb25kcygxMClcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVkTWV0YWRhdGFJZDNQZXJpb2Q/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBvdXRwdXRzIGZvciB0aGlzIFVEUCBvdXRwdXQgZ3JvdXAuXG4gICAqIEBkZWZhdWx0IC0gbm8gaW5pdGlhbCBvdXRwdXRzXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRzPzogVWRwT3V0cHV0RGVmaW5pdGlvbltdO1xufVxuXG4vKiogUHJvcGVydGllcyBmb3IgYW4gQXJjaGl2ZSAoUzMpIG91dHB1dCBncm91cC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXJjaGl2ZU91dHB1dEdyb3VwUHJvcHMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhpcyBvdXRwdXQgZ3JvdXAuIFVzZWQgYXMgdGhlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBJRC4gVW5kZXJzY29yZXMgYXJlIG5vcm1hbGlzZWQgdG8gaHlwaGVucyBpbnRlcm5hbGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGRlc3RpbmF0aW9ucyBmb3IgdGhpcyBvdXRwdXQgZ3JvdXAg4oCUIG9uZSBwZXIgcGlwZWxpbmUuXG4gICAqXG4gICAqIEFycmF5IHBvc2l0aW9uIGRldGVybWluZXMgdGhlIHBpcGVsaW5lIG1hcHBpbmc6XG4gICAqIC0gYGRlc3RpbmF0aW9uc1swXWAg4oaSIFBpcGVsaW5lIDBcbiAgICogLSBgZGVzdGluYXRpb25zWzFdYCDihpIgUGlwZWxpbmUgMSAoU1RBTkRBUkQgY2hhbm5lbHMgb25seSlcbiAgICpcbiAgICogRm9yIGEgU0lOR0xFX1BJUEVMSU5FIGNoYW5uZWwsIHByb3ZpZGUgZXhhY3RseSAxIGRlc3RpbmF0aW9uLlxuICAgKiBGb3IgYSBTVEFOREFSRCBjaGFubmVsLCBwcm92aWRlIGV4YWN0bHkgMiBkZXN0aW5hdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbnM6IFMzT3V0cHV0RGVzdGluYXRpb25bXTtcbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvbiBvZiBlYWNoIGFyY2hpdmUgZmlsZSAocm9sbG92ZXIgaW50ZXJ2YWwpLlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5zZWNvbmRzKDMwMClcbiAgICovXG4gIHJlYWRvbmx5IHJvbGxvdmVySW50ZXJ2YWw/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBTMyBjYW5uZWQgQUNMIHRvIGFwcGx5IHRvIGVhY2ggYXJjaGl2ZSBvdXRwdXQuXG4gICAqIEBkZWZhdWx0IC0gbm8gY2FubmVkIEFDTFxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl2ZVMzQ2FubmVkQWNsPzogUzNDYW5uZWRBY2w7XG4gIC8qKlxuICAgKiBUaGUgb3V0cHV0cyBmb3IgdGhpcyBBcmNoaXZlIG91dHB1dCBncm91cC5cbiAgICogQGRlZmF1bHQgLSBubyBpbml0aWFsIG91dHB1dHNcbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dHM/OiBBcmNoaXZlT3V0cHV0RGVmaW5pdGlvbltdO1xufVxuXG4vKiogUHJvcGVydGllcyBmb3IgYW4gUlRNUCBvdXRwdXQgZ3JvdXAuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ0bXBPdXRwdXRHcm91cFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgb3V0cHV0IGdyb3VwLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGF1dGhlbnRpY2F0aW9uIHNjaGVtZSBmb3IgdGhlIFJUTVAgY29ubmVjdGlvbi5cbiAgICogQGRlZmF1bHQgUnRtcEF1dGhlbnRpY2F0aW9uU2NoZW1lLkNPTU1PTlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aGVudGljYXRpb25TY2hlbWU/OiBSdG1wQXV0aGVudGljYXRpb25TY2hlbWU7XG4gIC8qKlxuICAgKiBUaGUgZGVsYXkgYmVmb3JlIHJlc3RhcnRpbmcgYWZ0ZXIgYSBzdHJlYW1pbmcgb3V0cHV0IGZhaWx1cmUuIEEgdmFsdWUgb2ZcbiAgICogYER1cmF0aW9uLnNlY29uZHMoMClgIG1lYW5zIG5ldmVyIHJlc3RhcnQuXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLnNlY29uZHMoMSlcbiAgICovXG4gIHJlYWRvbmx5IHJlc3RhcnREZWxheT86IER1cmF0aW9uO1xuICAvKipcbiAgICogQ2hvb3NlIHRoZSBhZCBtYXJrZXIgdHlwZSBmb3IgdGhpcyBvdXRwdXQgZ3JvdXAuXG4gICAqIEBkZWZhdWx0IC0gbm8gYWQgbWFya2Vyc1xuICAgKi9cbiAgcmVhZG9ubHkgYWRNYXJrZXJzPzogUnRtcEFkTWFya2Vyc1tdO1xuICAvKipcbiAgICogQ29udHJvbHMgYmVoYXZpb3Igd2hlbiB0aGUgY29udGVudCBjYWNoZSBmaWxscyB1cC5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlRnVsbEJlaGF2aW9yPzogUnRtcENhY2hlRnVsbEJlaGF2aW9yO1xuICAvKipcbiAgICogVGhlIGNhY2hlIGxlbmd0aCwgaW4gc2Vjb25kcywgdGhhdCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSBidWZmZXIgc2l6ZS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlTGVuZ3RoPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBDb250cm9scyB0aGUgdHlwZXMgb2YgZGF0YSB0aGF0IHBhc3MgdG8gb25DYXB0aW9uSW5mbyBvdXRwdXRzLlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgY2FwdGlvbkRhdGE/OiBSdG1wQ2FwdGlvbkRhdGE7XG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIGZpbGxlciBOQUwgdW5pdHMgYXJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlRmlsbGVyTmFsVW5pdHM/OiBSdG1wSW5jbHVkZUZpbGxlck5hbFVuaXRzO1xuICAvKipcbiAgICogQ29udHJvbHMgdGhlIGJlaGF2aW9yIG9mIHRoaXMgUlRNUCBncm91cCBpZiB0aGUgaW5wdXQgYmVjb21lcyB1bmF2YWlsYWJsZS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGlucHV0TG9zc0FjdGlvbj86IFJ0bXBJbnB1dExvc3NBY3Rpb247XG4gIC8qKlxuICAgKiBUaGUgb3V0cHV0cyBmb3IgdGhpcyBSVE1QIG91dHB1dCBncm91cC4gRWFjaCBvdXRwdXQgaW5jbHVkZXMgaXRzIG93biBSVE1QIGRlc3RpbmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0czogUnRtcE91dHB1dERlZmluaXRpb25bXTtcbn1cblxuLyoqIFByb3BlcnRpZXMgZm9yIGFuIFNSVCBvdXRwdXQgZ3JvdXAuICovXG5leHBvcnQgaW50ZXJmYWNlIFNydE91dHB1dEdyb3VwUHJvcHMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhpcyBvdXRwdXQgZ3JvdXAuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb250cm9scyB0aGUgYmVoYXZpb3Igb2YgdGhpcyBTUlQgZ3JvdXAgaWYgdGhlIGlucHV0IGJlY29tZXMgdW5hdmFpbGFibGUuXG4gICAqIEBkZWZhdWx0IFNydElucHV0TG9zc0FjdGlvbi5FTUlUX1BST0dSQU1cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0TG9zc0FjdGlvbj86IFNydElucHV0TG9zc0FjdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBvdXRwdXRzIGZvciB0aGlzIFNSVCBvdXRwdXQgZ3JvdXAuIEVhY2ggb3V0cHV0IGluY2x1ZGVzIGl0cyBvd24gU1JUIGRlc3RpbmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0czogU3J0T3V0cHV0RGVmaW5pdGlvbltdO1xufVxuXG4vKiogUHJvcGVydGllcyBmb3IgYSBDTUFGIEluZ2VzdCBvdXRwdXQgZ3JvdXAuICovXG5leHBvcnQgaW50ZXJmYWNlIENtYWZJbmdlc3RPdXRwdXRHcm91cFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgb3V0cHV0IGdyb3VwLiBVc2VkIGFzIHRoZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgSUQuIFVuZGVyc2NvcmVzIGFyZSBub3JtYWxpc2VkIHRvIGh5cGhlbnMgaW50ZXJuYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwcmltYXJ5IENNQUYgaW5nZXN0IGRlc3RpbmF0aW9ucyDigJQgb25lIHBlciBwaXBlbGluZS5cbiAgICpcbiAgICogQXJyYXkgcG9zaXRpb24gZGV0ZXJtaW5lcyB0aGUgcGlwZWxpbmUgbWFwcGluZzpcbiAgICogLSBgZGVzdGluYXRpb25zWzBdYCDihpIgUGlwZWxpbmUgMFxuICAgKiAtIGBkZXN0aW5hdGlvbnNbMV1gIOKGkiBQaXBlbGluZSAxIChTVEFOREFSRCBjaGFubmVscyBvbmx5KVxuICAgKlxuICAgKiBGb3IgYSBTSU5HTEVfUElQRUxJTkUgY2hhbm5lbCwgcHJvdmlkZSBleGFjdGx5IDEgZGVzdGluYXRpb24uXG4gICAqIEZvciBhIFNUQU5EQVJEIGNoYW5uZWwsIHByb3ZpZGUgZXhhY3RseSAyIGRlc3RpbmF0aW9ucyB0byB1dGlsaXNlIGJvdGhcbiAgICogcGlwZWxpbmVzIGZvciByZWR1bmRhbmN5LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb25zOiBPdXRwdXREZXN0aW5hdGlvbltdO1xuICAvKipcbiAgICogQ29uZmlndXJlIGFkZGl0aW9uYWwgZGVzdGluYXRpb25zIHRvIGZhbiBvdXQgdGhlIENNQUYgaW5nZXN0IG91dHB1dCB0byBleHRyYVxuICAgKiBlbmRwb2ludHMsIGZvciBleGFtcGxlIGZvciBjcm9zcy1yZWdpb24gZGVsaXZlcnkgb3IgYmFja3VwIHBhY2thZ2luZy5cbiAgICpcbiAgICogU3RhbmRhcmQgY2hhbm5lbHMgc3VwcG9ydCB1cCB0byAyIGFkZGl0aW9uYWwgZGVzdGluYXRpb25zLlxuICAgKiBTaW5nbGUgcGlwZWxpbmUgY2hhbm5lbHMgc3VwcG9ydCAxIGFkZGl0aW9uYWwgZGVzdGluYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCBkZXN0aW5hdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxEZXN0aW5hdGlvbnM/OiBPdXRwdXREZXN0aW5hdGlvbltdO1xuICAvKipcbiAgICogVGhlIGxlbmd0aCBvZiBlYWNoIG1lZGlhIHNlZ21lbnQuXG4gICAqIEBkZWZhdWx0IC0gU2VnbWVudC5zZWNvbmRzKDEpXG4gICAqL1xuICByZWFkb25seSBzZWdtZW50PzogU2VnbWVudDtcbiAgLyoqXG4gICAqIFRoZSBJRDMgYmVoYXZpb3IgZm9yIHRoZSBDTUFGIGluZ2VzdCBvdXRwdXQuXG4gICAqIEBkZWZhdWx0IElkM0JlaGF2aW9yLkRJU0FCTEVEXG4gICAqL1xuICByZWFkb25seSBpZDNCZWhhdmlvcj86IElkM0JlaGF2aW9yO1xuICAvKipcbiAgICogVGhlIG5hbWUgbW9kaWZpZXIgZm9yIElEMyBtZXRhZGF0YS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGlkM05hbWVNb2RpZmllcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBLTFYgYmVoYXZpb3IgZm9yIHRoZSBDTUFGIGluZ2VzdCBvdXRwdXQuXG4gICAqIEBkZWZhdWx0IEtsdkJlaGF2aW9yLk5PX1BBU1NUSFJPVUdIXG4gICAqL1xuICByZWFkb25seSBrbHZCZWhhdmlvcj86IEtsdkJlaGF2aW9yO1xuICAvKipcbiAgICogVGhlIG5hbWUgbW9kaWZpZXIgZm9yIEtMViBtZXRhZGF0YS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGtsdk5hbWVNb2RpZmllcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBOaWVsc2VuIElEMyBiZWhhdmlvciBmb3IgdGhlIENNQUYgaW5nZXN0IG91dHB1dC5cbiAgICogQGRlZmF1bHQgTmllbHNlbklkM0JlaGF2aW9yLk5PX1BBU1NUSFJPVUdIXG4gICAqL1xuICByZWFkb25seSBuaWVsc2VuSWQzQmVoYXZpb3I/OiBOaWVsc2VuSWQzQmVoYXZpb3I7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBtb2RpZmllciBmb3IgTmllbHNlbiBJRDMgbWV0YWRhdGEuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBuaWVsc2VuSWQzTmFtZU1vZGlmaWVyPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgbW9kaWZpZXIgZm9yIFNDVEUtMzUgbWVzc2FnZXMuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBzY3RlMzVOYW1lTW9kaWZpZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgU0NURS0zNSB0eXBlIGZvciB0aGUgQ01BRiBpbmdlc3Qgb3V0cHV0LlxuICAgKiBAZGVmYXVsdCBTY3RlMzVUeXBlLlNDVEVfMzVfV0lUSE9VVF9TRUdNRU5UQVRJT05cbiAgICovXG4gIHJlYWRvbmx5IHNjdGUzNVR5cGU/OiBTY3RlMzVUeXBlO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgdGhlIG91dHB1dCBmcm9tIHRoZSBzZWNvbmQgcGlwZWxpbmUuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBzZW5kRGVsYXlNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgSUQzIGZyYW1lIHRoYXQgaGFzIHRoZSB0aW1lY29kZS5cbiAgICogQGRlZmF1bHQgVGltZWRNZXRhZGF0YUlkM0ZyYW1lLk5PTkVcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVkTWV0YWRhdGFJZDNGcmFtZT86IFRpbWVkTWV0YWRhdGFJZDNGcmFtZTtcbiAgLyoqXG4gICAqIFRoZSB0aW1lZCBtZXRhZGF0YSBpbnRlcnZhbC5cbiAgICogQGRlZmF1bHQgLSBEdXJhdGlvbi5zZWNvbmRzKDEwKVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZWRNZXRhZGF0YUlkM1BlcmlvZD86IER1cmF0aW9uO1xuICAvKipcbiAgICogV2hldGhlciB0aW1lZCBtZXRhZGF0YSBpcyBwYXNzZWQgdGhyb3VnaC5cbiAgICogQGRlZmF1bHQgVGltZWRNZXRhZGF0YVBhc3N0aHJvdWdoLkRJU0FCTEVEXG4gICAqL1xuICByZWFkb25seSB0aW1lZE1ldGFkYXRhUGFzc3Rocm91Z2g/OiBUaW1lZE1ldGFkYXRhUGFzc3Rocm91Z2g7XG4gIC8qKlxuICAgKiBNYXBzIGNhcHRpb25zIGNoYW5uZWxzIHRvIGxhbmd1YWdlcyBmb3IgdGhpcyBDTUFGIEluZ2VzdCBvdXRwdXQgZ3JvdXAuXG4gICAqIEBkZWZhdWx0IC0gbm8gY2FwdGlvbiBsYW5ndWFnZSBtYXBwaW5nc1xuICAgKi9cbiAgcmVhZG9ubHkgY2FwdGlvbkxhbmd1YWdlTWFwcGluZ3M/OiBDbWFmQ2FwdGlvbkxhbmd1YWdlTWFwcGluZ1tdO1xuICAvKipcbiAgICogVGhlIG91dHB1dHMgZm9yIHRoaXMgQ01BRiBJbmdlc3Qgb3V0cHV0IGdyb3VwLiBFYWNoIG91dHB1dCBzaG91bGQgY29udGFpbiBhIHNpbmdsZSBlbmNvZGUuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRzOiBDbWFmSW5nZXN0T3V0cHV0RGVmaW5pdGlvbltdO1xufVxuXG4vKiogUHJvcGVydGllcyBmb3IgYSBGcmFtZSBDYXB0dXJlIG91dHB1dCBncm91cC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnJhbWVDYXB0dXJlT3V0cHV0R3JvdXBQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGlzIG91dHB1dCBncm91cC4gVXNlZCBhcyB0aGUgZGVzdGluYXRpb24gcmVmZXJlbmNlIElELiBVbmRlcnNjb3JlcyBhcmUgbm9ybWFsaXNlZCB0byBoeXBoZW5zIGludGVybmFsbHkuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzdGluYXRpb25zIGZvciB0aGlzIG91dHB1dCBncm91cCDigJQgb25lIHBlciBwaXBlbGluZS5cbiAgICpcbiAgICogQXJyYXkgcG9zaXRpb24gZGV0ZXJtaW5lcyB0aGUgcGlwZWxpbmUgbWFwcGluZzpcbiAgICogLSBgZGVzdGluYXRpb25zWzBdYCDihpIgUGlwZWxpbmUgMFxuICAgKiAtIGBkZXN0aW5hdGlvbnNbMV1gIOKGkiBQaXBlbGluZSAxIChTVEFOREFSRCBjaGFubmVscyBvbmx5KVxuICAgKlxuICAgKiBGb3IgYSBTSU5HTEVfUElQRUxJTkUgY2hhbm5lbCwgcHJvdmlkZSBleGFjdGx5IDEgZGVzdGluYXRpb24uXG4gICAqIEZvciBhIFNUQU5EQVJEIGNoYW5uZWwsIHByb3ZpZGUgZXhhY3RseSAyIGRlc3RpbmF0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uczogUzNPdXRwdXREZXN0aW5hdGlvbltdO1xuICAvKipcbiAgICogVGhlIFMzIGNhbm5lZCBBQ0wgdG8gYXBwbHkgdG8gZWFjaCBmcmFtZSBjYXB0dXJlIG91dHB1dC5cbiAgICogQGRlZmF1bHQgLSBubyBjYW5uZWQgQUNMXG4gICAqL1xuICByZWFkb25seSBmcmFtZUNhcHR1cmVTM0Nhbm5lZEFjbD86IFMzQ2FubmVkQWNsO1xuICAvKipcbiAgICogVGhlIG91dHB1dHMgZm9yIHRoaXMgRnJhbWUgQ2FwdHVyZSBvdXRwdXQgZ3JvdXAuXG4gICAqIEBkZWZhdWx0IC0gbm8gaW5pdGlhbCBvdXRwdXRzXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRzPzogRnJhbWVDYXB0dXJlT3V0cHV0RGVmaW5pdGlvbltdO1xufVxuXG4vKiogUHJvcGVydGllcyBmb3IgYW4gTVMgU21vb3RoIG91dHB1dCBncm91cC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTXNTbW9vdGhPdXRwdXRHcm91cFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgb3V0cHV0IGdyb3VwLiBVc2VkIGFzIHRoZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgSUQuIFVuZGVyc2NvcmVzIGFyZSBub3JtYWxpc2VkIHRvIGh5cGhlbnMgaW50ZXJuYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkZXN0aW5hdGlvbnMgZm9yIHRoaXMgb3V0cHV0IGdyb3VwIOKAlCBvbmUgcGVyIHBpcGVsaW5lLlxuICAgKlxuICAgKiBBcnJheSBwb3NpdGlvbiBkZXRlcm1pbmVzIHRoZSBwaXBlbGluZSBtYXBwaW5nOlxuICAgKiAtIGBkZXN0aW5hdGlvbnNbMF1gIOKGkiBQaXBlbGluZSAwXG4gICAqIC0gYGRlc3RpbmF0aW9uc1sxXWAg4oaSIFBpcGVsaW5lIDEgKFNUQU5EQVJEIGNoYW5uZWxzIG9ubHkpXG4gICAqXG4gICAqIEZvciBhIFNJTkdMRV9QSVBFTElORSBjaGFubmVsLCBwcm92aWRlIGV4YWN0bHkgMSBkZXN0aW5hdGlvbi5cbiAgICogRm9yIGEgU1RBTkRBUkQgY2hhbm5lbCwgcHJvdmlkZSBleGFjdGx5IDIgZGVzdGluYXRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb25zOiBPdXRwdXREZXN0aW5hdGlvbltdO1xuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBBY3F1aXNpdGlvbiBQb2ludCBJZGVudGl0eSBlbGVtZW50IHVzZWQgaW4gZWFjaCBtZXNzYWdlIHBsYWNlZCBpbiB0aGUgc3BhcnNlIHRyYWNrLlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgYWNxdWlzaXRpb25Qb2ludElkPzogc3RyaW5nO1xuICAvKipcbiAgICogSWYgc2V0IHRvIHBhc3N0aHJvdWdoIGZvciBhbiBhdWRpby1vbmx5IG91dHB1dCwgdGhlIGZyYWdtZW50IGFic29sdXRlIHRpbWUgaXMgc2V0IHRvIHRoZSBjdXJyZW50IHRpbWVjb2RlLlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgYXVkaW9Pbmx5VGltZWNvZGVDb250cm9sPzogTXNTbW9vdGhBdWRpb09ubHlUaW1lY29kZUNvbnRyb2w7XG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gVkVSSUZZX0FVVEhFTlRJQ0lUWSwgdmVyaWZpZXMgdGhlIEhUVFBTIGNlcnRpZmljYXRlIGNoYWluIHRvIGEgdHJ1c3RlZCBDQS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGNlcnRpZmljYXRlTW9kZT86IE1zU21vb3RoQ2VydGlmaWNhdGVNb2RlO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBJSVMgc2VydmVyIGlmIHRoZSBjb25uZWN0aW9uIGlzIGxvc3QuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBjb25uZWN0aW9uUmV0cnlJbnRlcnZhbD86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIE1pY3Jvc29mdCBTbW9vdGggY2hhbm5lbCBJRCB0aGF0IGlzIHNlbnQgdG8gdGhlIElJUyBzZXJ2ZXIuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBldmVudElkPzogc3RyaW5nO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gc2VuZCBhIGNoYW5uZWwgSUQgdG8gdGhlIElJUyBzZXJ2ZXIuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBldmVudElkTW9kZT86IE1zU21vb3RoRXZlbnRJZE1vZGU7XG4gIC8qKlxuICAgKiBXaGVuIHNldCB0byBTRU5EX0VPUywgc2VuZHMgYW4gRU9TIHNpZ25hbCB0byBhbiBJSVMgc2VydmVyIHdoZW4gc3RvcHBpbmcgdGhlIGNoYW5uZWwuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBldmVudFN0b3BCZWhhdmlvcj86IE1zU21vb3RoRXZlbnRTdG9wQmVoYXZpb3I7XG4gIC8qKlxuICAgKiBUaGUgc2l6ZSwgaW4gc2Vjb25kcywgb2YgdGhlIGZpbGUgY2FjaGUgZm9yIHN0cmVhbWluZyBvdXRwdXRzLlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZWNhY2hlRHVyYXRpb24/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBsZW5ndGgsIGluIHNlY29uZHMsIG9mIG1wNCBmcmFnbWVudHMgdG8gZ2VuZXJhdGUuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBmcmFnbWVudExlbmd0aD86IER1cmF0aW9uO1xuICAvKipcbiAgICogQSBwYXJhbWV0ZXIgdGhhdCBjb250cm9scyBvdXRwdXQgZ3JvdXAgYmVoYXZpb3Igb24gYW4gaW5wdXQgbG9zcy5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGlucHV0TG9zc0FjdGlvbj86IE1zU21vb3RoSW5wdXRMb3NzQWN0aW9uO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiByZXRyeSBhdHRlbXB0cy5cbiAgICogQGRlZmF1bHQgMTBcbiAgICovXG4gIHJlYWRvbmx5IG51bVJldHJpZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHNlY29uZHMgYmVmb3JlIGluaXRpYXRpbmcgYSByZXN0YXJ0IGR1ZSB0byBvdXRwdXQgZmFpbHVyZS5cbiAgICogQGRlZmF1bHQgLSBEdXJhdGlvbi5zZWNvbmRzKDEpXG4gICAqL1xuICByZWFkb25seSByZXN0YXJ0RGVsYXk/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBzZWdtZW50YXRpb24gbW9kZS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IHNlZ21lbnRhdGlvbk1vZGU/OiBNc1Ntb290aFNlZ21lbnRhdGlvbk1vZGU7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSB0aGUgb3V0cHV0IGZyb20gdGhlIHNlY29uZCBwaXBlbGluZS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IHNlbmREZWxheU1zPzogbnVtYmVyO1xuICAvKipcbiAgICogSWYgc2V0IHRvIFNDVEVfMzUsIHVzZXMgaW5jb21pbmcgU0NURS0zNSBtZXNzYWdlcyB0byBnZW5lcmF0ZSBhIHNwYXJzZSB0cmFjay5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IHNwYXJzZVRyYWNrVHlwZT86IE1zU21vb3RoU3BhcnNlVHJhY2tUeXBlO1xuICAvKipcbiAgICogV2hlbiBzZXQgdG8gU0VORCwgc2VuZHMgYSBzdHJlYW0gbWFuaWZlc3Qgc28gdGhhdCB0aGUgcHVibGlzaGluZyBwb2ludCBkb2Vzbid0IHN0YXJ0IHVudGlsIGFsbCBzdHJlYW1zIHN0YXJ0LlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgc3RyZWFtTWFuaWZlc3RCZWhhdmlvcj86IE1zU21vb3RoU3RyZWFtTWFuaWZlc3RCZWhhdmlvcjtcbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgb2Zmc2V0IGZvciB0aGUgY2hhbm5lbC4gVXNlZCBvbmx5IGlmIHRpbWVzdGFtcE9mZnNldE1vZGUgaXMgc2V0IHRvIFVTRV9DT05GSUdVUkVEX09GRlNFVC5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVzdGFtcE9mZnNldD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRpbWVzdGFtcCBkYXRlIG9mZnNldCB0byB1c2UuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSB0aW1lc3RhbXBPZmZzZXRNb2RlPzogTXNTbW9vdGhUaW1lc3RhbXBPZmZzZXRNb2RlO1xuICAvKipcbiAgICogVGhlIG91dHB1dHMgZm9yIHRoaXMgTVMgU21vb3RoIG91dHB1dCBncm91cC5cbiAgICogQGRlZmF1bHQgLSBubyBpbml0aWFsIG91dHB1dHNcbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dHM/OiBNc1Ntb290aE91dHB1dERlZmluaXRpb25bXTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiBzdWJjbGFzc2VzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGludGVybmFsICovXG5jbGFzcyBNZWRpYVBhY2thZ2VWMk91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiBleHRlbmRzIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBNZWRpYVBhY2thZ2VWMk91dHB1dEdyb3VwQmFzZVByb3BzLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0b0NoYW5uZWw/OiBJTWVkaWFQYWNrYWdlVjJDaGFubmVsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXhwbGljaXREZXN0aW5hdGlvbnM/OiBNZWRpYVBhY2thZ2VWMkRlc3RpbmF0aW9uW10sXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fbmFtZSA9IHByb3BzLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHByaW1hcnkgZGVzdGluYXRpb25zLiBGb3IgdGhlIGF1dG8gdmFyaWFudCB0aGV5IGFyZSBkZXJpdmVkIGZyb20gdGhlIGNoYW5uZWwgY2xhc3NcbiAgICogKG9uZSBwZXIgcGlwZWxpbmUsIGVhY2ggd2l0aCBpdHMgZW5kcG9pbnQpOyBmb3IgdGhlIGN1c3RvbSB2YXJpYW50IHRoZXkgYXJlIHVzZXItc3VwcGxpZWQuXG4gICAqL1xuICBwcml2YXRlIHByaW1hcnlEZXN0aW5hdGlvbnMoY2hhbm5lbENsYXNzOiBzdHJpbmcpOiBNZWRpYVBhY2thZ2VWMkRlc3RpbmF0aW9uW10ge1xuICAgIGlmICh0aGlzLmF1dG9DaGFubmVsKSB7XG4gICAgICByZXR1cm4gY2hhbm5lbENsYXNzID09PSAnU1RBTkRBUkQnXG4gICAgICAgID8gW1xuICAgICAgICAgIE1lZGlhUGFja2FnZVYyRGVzdGluYXRpb24uY2hhbm5lbCh0aGlzLmF1dG9DaGFubmVsLCBNZWRpYVBhY2thZ2VWMkVuZHBvaW50SWQuRU5EUE9JTlRfMSksXG4gICAgICAgICAgTWVkaWFQYWNrYWdlVjJEZXN0aW5hdGlvbi5jaGFubmVsKHRoaXMuYXV0b0NoYW5uZWwsIE1lZGlhUGFja2FnZVYyRW5kcG9pbnRJZC5FTkRQT0lOVF8yKSxcbiAgICAgICAgXVxuICAgICAgICA6IFtNZWRpYVBhY2thZ2VWMkRlc3RpbmF0aW9uLmNoYW5uZWwodGhpcy5hdXRvQ2hhbm5lbCwgTWVkaWFQYWNrYWdlVjJFbmRwb2ludElkLkVORFBPSU5UXzEpXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhwbGljaXREZXN0aW5hdGlvbnMgPz8gW107XG4gIH1cblxuICBwdWJsaWMgX2NyZWF0ZUluaXRpYWxPdXRwdXRzKCk6IE91dHB1dFtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5vdXRwdXRzLm1hcChkZWYgPT4gbmV3IE1lZGlhUGFja2FnZVYyT3V0cHV0KGRlZiwgdGhpcy5fbmFtZSkpO1xuICB9XG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLk91dHB1dEdyb3VwU2V0dGluZ3NQcm9wZXJ0eSB7XG4gICAgY29uc3QgYWRkaXRpb25hbCA9IHRoaXMucHJvcHMuYWRkaXRpb25hbERlc3RpbmF0aW9ucyA/PyBbXTtcbiAgICByZXR1cm4ge1xuICAgICAgbWVkaWFQYWNrYWdlR3JvdXBTZXR0aW5nczoge1xuICAgICAgICBkZXN0aW5hdGlvbjogeyBkZXN0aW5hdGlvblJlZklkOiB0b0Rlc3RpbmF0aW9uSWQodGhpcy5wcm9wcy5uYW1lKSB9LFxuICAgICAgICBtZWRpYXBhY2thZ2VWMkdyb3VwU2V0dGluZ3M6IHtcbiAgICAgICAgICBhZGRpdGlvbmFsRGVzdGluYXRpb25zOiBhZGRpdGlvbmFsLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gYWRkaXRpb25hbC5tYXAoKF9kZXN0LCBpKSA9PiAoe1xuICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogeyBkZXN0aW5hdGlvblJlZklkOiBgJHt0b0Rlc3RpbmF0aW9uSWQodGhpcy5wcm9wcy5uYW1lKX0tYWRkaXRpb25hbC0ke2l9YCB9LFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzZWdtZW50TGVuZ3RoOiB0aGlzLnByb3BzLnNlZ21lbnQ/Ll9sZW5ndGgoKSA/PyAxLFxuICAgICAgICAgIHNlZ21lbnRMZW5ndGhVbml0czogdGhpcy5wcm9wcy5zZWdtZW50Py5fdW5pdHMoKSA/PyBTZWdtZW50TGVuZ3RoVW5pdHMuU0VDT05EUyxcbiAgICAgICAgICBpZDNCZWhhdmlvcjogKHRoaXMucHJvcHMuaWQzQmVoYXZpb3IgPz8gSWQzQmVoYXZpb3IuRElTQUJMRUQpLnZhbHVlLFxuICAgICAgICAgIGtsdkJlaGF2aW9yOiAodGhpcy5wcm9wcy5rbHZCZWhhdmlvciA/PyBLbHZCZWhhdmlvci5OT19QQVNTVEhST1VHSCkudmFsdWUsXG4gICAgICAgICAgbmllbHNlbklkM0JlaGF2aW9yOiAodGhpcy5wcm9wcy5uaWVsc2VuSWQzQmVoYXZpb3IgPz8gTmllbHNlbklkM0JlaGF2aW9yLk5PX1BBU1NUSFJPVUdIKS52YWx1ZSxcbiAgICAgICAgICBzY3RlMzVUeXBlOiAodGhpcy5wcm9wcy5zY3RlMzVUeXBlID8/IFNjdGUzNVR5cGUuU0NURV8zNV9XSVRIT1VUX1NFR01FTlRBVElPTikudmFsdWUsXG4gICAgICAgICAgdGltZWRNZXRhZGF0YUlkM0ZyYW1lOiAodGhpcy5wcm9wcy50aW1lZE1ldGFkYXRhSWQzRnJhbWUgPz8gVGltZWRNZXRhZGF0YUlkM0ZyYW1lLk5PTkUpLnZhbHVlLFxuICAgICAgICAgIHRpbWVkTWV0YWRhdGFJZDNQZXJpb2Q6IHRoaXMucHJvcHMudGltZWRNZXRhZGF0YUlkM1BlcmlvZD8udG9TZWNvbmRzKCkgPz8gMTAsXG4gICAgICAgICAgdGltZWRNZXRhZGF0YVBhc3N0aHJvdWdoOiAodGhpcy5wcm9wcy50aW1lZE1ldGFkYXRhUGFzc3Rocm91Z2ggPz8gVGltZWRNZXRhZGF0YVBhc3N0aHJvdWdoLkRJU0FCTEVEKS52YWx1ZSxcbiAgICAgICAgICBjYXB0aW9uTGFuZ3VhZ2VNYXBwaW5nczogdGhpcy5wcm9wcy5jYXB0aW9uTGFuZ3VhZ2VNYXBwaW5ncyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgX2JpbmREZXN0aW5hdGlvbihfY2hhbm5lbENsYXNzOiBzdHJpbmcpOiBDZm5DaGFubmVsLk91dHB1dERlc3RpbmF0aW9uUHJvcGVydHlbXSB7XG4gICAgY29uc3QgYWRkaXRpb25hbCA9IHRoaXMucHJvcHMuYWRkaXRpb25hbERlc3RpbmF0aW9ucyA/PyBbXTtcbiAgICBjb25zdCBwcmltYXJpZXMgPSB0aGlzLnByaW1hcnlEZXN0aW5hdGlvbnMoX2NoYW5uZWxDbGFzcyk7XG4gICAgLy8gRm9yIHRoZSBhdXRvIHZhcmlhbnQgdGhlIHByaW1hcnkgY291bnQgaXMgY29ycmVjdCBieSBjb25zdHJ1Y3Rpb247IGZvciB0aGUgY3VzdG9tIHZhcmlhbnRcbiAgICAvLyB0aGlzIGVuZm9yY2VzIHRoZSBwZXItcGlwZWxpbmUgY291bnQgdGhlIHVzZXIgc3VwcGxpZWQuXG4gICAgdmFsaWRhdGVEZXN0aW5hdGlvbkNvdW50KHRoaXMuX25hbWUsIF9jaGFubmVsQ2xhc3MsIHByaW1hcmllcy5sZW5ndGgsIGFkZGl0aW9uYWwubGVuZ3RoLCB0cnVlKTtcblxuICAgIC8vIFByaW1hcnkgZGVzdGluYXRpb25zIHNoYXJlIHRoZSBvdXRwdXQgZ3JvdXAncyBkZXN0aW5hdGlvbiBJRFxuICAgIGNvbnN0IHByaW1hcnlTZXR0aW5nczogQ2ZuQ2hhbm5lbC5NZWRpYVBhY2thZ2VPdXRwdXREZXN0aW5hdGlvblNldHRpbmdzUHJvcGVydHlbXSA9XG4gICAgICBwcmltYXJpZXMubWFwKGRlc3QgPT4gZGVzdC5fYmluZCgpKTtcbiAgICBjb25zdCByZXN1bHQ6IENmbkNoYW5uZWwuT3V0cHV0RGVzdGluYXRpb25Qcm9wZXJ0eVtdID0gW1xuICAgICAgeyBpZDogdG9EZXN0aW5hdGlvbklkKHRoaXMucHJvcHMubmFtZSksIG1lZGlhUGFja2FnZVNldHRpbmdzOiBwcmltYXJ5U2V0dGluZ3MgfSxcbiAgICBdO1xuXG4gICAgLy8gRWFjaCBhZGRpdGlvbmFsIGRlc3RpbmF0aW9uIGlzIGEgc2VwYXJhdGUgdG9wLWxldmVsIERlc3RpbmF0aW9ucyBlbnRyeVxuICAgIGFkZGl0aW9uYWwuZm9yRWFjaCgoZGVzdCwgaSkgPT4ge1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICBpZDogYCR7dG9EZXN0aW5hdGlvbklkKHRoaXMucHJvcHMubmFtZSl9LWFkZGl0aW9uYWwtJHtpfWAsXG4gICAgICAgIG1lZGlhUGFja2FnZVNldHRpbmdzOiBbZGVzdC5fYmluZCgpXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGUgX2dyYW50UGVybWlzc2lvbnMocm9sZTogSVJvbGUpOiB2b2lkIHtcbiAgICBjb25zdCBwcmltYXJpZXMgPSB0aGlzLmF1dG9DaGFubmVsXG4gICAgICA/IFtNZWRpYVBhY2thZ2VWMkRlc3RpbmF0aW9uLmNoYW5uZWwodGhpcy5hdXRvQ2hhbm5lbCldXG4gICAgICA6ICh0aGlzLmV4cGxpY2l0RGVzdGluYXRpb25zID8/IFtdKTtcbiAgICBbLi4ucHJpbWFyaWVzLCAuLi4odGhpcy5wcm9wcy5hZGRpdGlvbmFsRGVzdGluYXRpb25zID8/IFtdKV0uZm9yRWFjaChkID0+IGQuX2dyYW50UGVybWlzc2lvbnMocm9sZSkpO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIE1lZGlhQ29ubmVjdFJvdXRlck91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiBleHRlbmRzIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBNZWRpYUNvbm5lY3RSb3V0ZXJPdXRwdXRHcm91cFByb3BzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9uYW1lID0gcHJvcHMubmFtZTtcbiAgICBpZiAocHJvcHMub3V0cHV0cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBNZWRpYUNvbm5lY3RSb3V0ZXJTaW5nbGVPdXRwdXRgLFxuICAgICAgICBgTWVkaWFDb25uZWN0IFJvdXRlciBvdXRwdXQgZ3JvdXAgJyR7cHJvcHMubmFtZX0nIG1heSBjb250YWluIGF0IG1vc3Qgb25lIG91dHB1dCwgYnV0ICR7cHJvcHMub3V0cHV0cy5sZW5ndGh9IHdlcmUgcHJvdmlkZWRgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgX2NyZWF0ZUluaXRpYWxPdXRwdXRzKCk6IE91dHB1dFtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5vdXRwdXRzLm1hcChkZWYgPT4gbmV3IE1lZGlhQ29ubmVjdFJvdXRlck91dHB1dChkZWYsIHRoaXMuX25hbWUpKTtcbiAgfVxuXG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLk91dHB1dEdyb3VwU2V0dGluZ3NQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lZGlhQ29ubmVjdFJvdXRlckdyb3VwU2V0dGluZ3M6IHtcbiAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZXM6IHRoaXMucHJvcHMuYXZhaWxhYmlsaXR5Wm9uZXMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgX2JpbmREZXN0aW5hdGlvbihjaGFubmVsQ2xhc3M6IHN0cmluZyk6IENmbkNoYW5uZWwuT3V0cHV0RGVzdGluYXRpb25Qcm9wZXJ0eVtdIHtcbiAgICBjb25zdCBwaXBlbGluZUNvdW50ID0gY2hhbm5lbENsYXNzID09PSAnU1RBTkRBUkQnID8gMiA6IDE7XG4gICAgY29uc3QgYXpDb3VudCA9IHRoaXMucHJvcHMuYXZhaWxhYmlsaXR5Wm9uZXMubGVuZ3RoO1xuICAgIGlmIChhekNvdW50ICE9PSBwaXBlbGluZUNvdW50KSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBNZWRpYUNvbm5lY3RSb3V0ZXJBdmFpbGFiaWxpdHlab25lc2AsXG4gICAgICAgIGBNZWRpYUNvbm5lY3QgUm91dGVyIG91dHB1dCBncm91cCAnJHt0aGlzLl9uYW1lfScgcmVxdWlyZXMgZXhhY3RseSAke3BpcGVsaW5lQ291bnR9IGF2YWlsYWJpbGl0eVpvbmUocylgXG4gICAgICAgICsgYCBmb3IgYSAke2NoYW5uZWxDbGFzc30gY2hhbm5lbCwgYnV0ICR7YXpDb3VudH0gcHJvdmlkZWRgLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnByb3BzLnJvdXRlclNldHRpbmdzID8/IE1lZGlhQ29ubmVjdFJvdXRlclNldHRpbmdzLnNoYXJlZCgpO1xuICAgIHJldHVybiBbXG4gICAgICB7IGlkOiB0b0Rlc3RpbmF0aW9uSWQodGhpcy5fbmFtZSksIG1lZGlhQ29ubmVjdFJvdXRlclNldHRpbmdzOiBzZXR0aW5ncy5fYmluZChwaXBlbGluZUNvdW50KSB9LFxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgX2dyYW50UGVybWlzc2lvbnMocm9sZTogSVJvbGUpOiB2b2lkIHtcbiAgICB0aGlzLnByb3BzLnJvdXRlclNldHRpbmdzPy5fc2VjcmV0cygpLmZvckVhY2goc2VjcmV0ID0+IHNlY3JldC5ncmFudFJlYWQocm9sZSkpO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIEhsc091dHB1dEdyb3VwQ29uZmlndXJhdGlvbiBleHRlbmRzIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGVwb2NoTG9ja2luZyA9IGZhbHNlO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBIbHNPdXRwdXRHcm91cFByb3BzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9uYW1lID0gcHJvcHMubmFtZTtcbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGUgX3NldEVwb2NoTG9ja2luZyhhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmVwb2NoTG9ja2luZyA9IGFjdGl2ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgcHJvZ3JhbSBkYXRlIHRpbWUgY2xvY2suIEVwb2NoIG91dHB1dCBsb2NraW5nIHJlcXVpcmVzXG4gICAqIElOSVRJQUxJWkVfRlJPTV9PVVRQVVRfVElNRUNPREU7IG90aGVyd2lzZSBTWVNURU1fQ0xPQ0suXG4gICAqL1xuICBwcml2YXRlIF9kZWZhdWx0UHJvZ3JhbURhdGVUaW1lQ2xvY2soKTogSGxzUHJvZ3JhbURhdGVUaW1lQ2xvY2sge1xuICAgIHJldHVybiB0aGlzLmVwb2NoTG9ja2luZ1xuICAgICAgPyBIbHNQcm9ncmFtRGF0ZVRpbWVDbG9jay5JTklUSUFMSVpFX0ZST01fT1VUUFVUX1RJTUVDT0RFXG4gICAgICA6IEhsc1Byb2dyYW1EYXRlVGltZUNsb2NrLlNZU1RFTV9DTE9DSztcbiAgfVxuICAvKiogV2hldGhlciB0aGUgdXNlciBleHBsaWNpdGx5IHNldCBhbiBpbmNvbXBhdGlibGUgU1lTVEVNX0NMT0NLIHByb2dyYW0tZGF0ZS10aW1lIGNsb2NrLiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9oYXNFeHBsaWNpdFN5c3RlbUNsb2NrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnByb2dyYW1EYXRlVGltZUNsb2NrPy52YWx1ZSA9PT0gSGxzUHJvZ3JhbURhdGVUaW1lQ2xvY2suU1lTVEVNX0NMT0NLLnZhbHVlO1xuICB9XG4gIHB1YmxpYyBfY3JlYXRlSW5pdGlhbE91dHB1dHMoKTogT3V0cHV0W10ge1xuICAgIHJldHVybiAodGhpcy5wcm9wcy5vdXRwdXRzID8/IFtdKS5tYXAoZGVmID0+IG5ldyBIbHNPdXRwdXQoZGVmKSk7XG4gIH1cbiAgcHVibGljIF9iaW5kKCk6IENmbkNoYW5uZWwuT3V0cHV0R3JvdXBTZXR0aW5nc1Byb3BlcnR5IHtcbiAgICByZXR1cm4ge1xuICAgICAgaGxzR3JvdXBTZXR0aW5nczoge1xuICAgICAgICBkZXN0aW5hdGlvbjogeyBkZXN0aW5hdGlvblJlZklkOiB0b0Rlc3RpbmF0aW9uSWQodGhpcy5wcm9wcy5uYW1lKSB9LFxuICAgICAgICBzZWdtZW50TGVuZ3RoOiB0aGlzLnByb3BzLnNlZ21lbnQ/Ll90b1NlY29uZHMoKSA/PyAyLFxuICAgICAgICBrZWVwU2VnbWVudHM6IHRoaXMucHJvcHMua2VlcFNlZ21lbnRzID8/IDIxLFxuICAgICAgICBpbmRleE5TZWdtZW50czogdGhpcy5wcm9wcy5pbmRleE5TZWdtZW50cyA/PyAxMCxcbiAgICAgICAgbW9kZTogKHRoaXMucHJvcHMubW9kZSA/PyBIbHNNb2RlLkxJVkUpLnZhbHVlLFxuICAgICAgICBtaW5TZWdtZW50TGVuZ3RoOiB0aGlzLnByb3BzLm1pblNlZ21lbnQ/Ll90b1NlY29uZHMoKSxcbiAgICAgICAgaW5wdXRMb3NzQWN0aW9uOiAodGhpcy5wcm9wcy5pbnB1dExvc3NBY3Rpb24gPz8gSGxzSW5wdXRMb3NzQWN0aW9uLkVNSVRfT1VUUFVUKS52YWx1ZSxcbiAgICAgICAgYWRNYXJrZXJzOiB0aGlzLnByb3BzLmFkTWFya2Vycz8ubWFwKG0gPT4gbS52YWx1ZSksXG4gICAgICAgIGJhc2VVcmxDb250ZW50OiB0aGlzLnByb3BzLmJhc2VVcmxDb250ZW50LFxuICAgICAgICBiYXNlVXJsQ29udGVudDE6IHRoaXMucHJvcHMuYmFzZVVybENvbnRlbnQxLFxuICAgICAgICBiYXNlVXJsTWFuaWZlc3Q6IHRoaXMucHJvcHMuYmFzZVVybE1hbmlmZXN0LFxuICAgICAgICBiYXNlVXJsTWFuaWZlc3QxOiB0aGlzLnByb3BzLmJhc2VVcmxNYW5pZmVzdDEsXG4gICAgICAgIGNhcHRpb25MYW5ndWFnZU1hcHBpbmdzOiB0aGlzLnByb3BzLmNhcHRpb25MYW5ndWFnZU1hcHBpbmdzLFxuICAgICAgICBjYXB0aW9uTGFuZ3VhZ2VTZXR0aW5nOiB0aGlzLnByb3BzLmNhcHRpb25MYW5ndWFnZVNldHRpbmc/LnZhbHVlLFxuICAgICAgICBjbGllbnRDYWNoZTogKHRoaXMucHJvcHMuY2xpZW50Q2FjaGUgPz8gSGxzQ2xpZW50Q2FjaGUuRU5BQkxFRCkudmFsdWUsXG4gICAgICAgIGNvZGVjU3BlY2lmaWNhdGlvbjogKHRoaXMucHJvcHMuY29kZWNTcGVjaWZpY2F0aW9uID8/IEhsc0NvZGVjU3BlY2lmaWNhdGlvbi5SRkNfNDI4MSkudmFsdWUsXG4gICAgICAgIGNvbnN0YW50SXY6IHRoaXMucHJvcHMuY29uc3RhbnRJdixcbiAgICAgICAgZGlyZWN0b3J5U3RydWN0dXJlOiAodGhpcy5wcm9wcy5kaXJlY3RvcnlTdHJ1Y3R1cmUgPz8gSGxzRGlyZWN0b3J5U3RydWN0dXJlLlNJTkdMRV9ESVJFQ1RPUlkpLnZhbHVlLFxuICAgICAgICBkaXNjb250aW51aXR5VGFnczogKHRoaXMucHJvcHMuZGlzY29udGludWl0eVRhZ3MgPz8gSGxzRGlzY29udGludWl0eVRhZ3MuSU5TRVJUKS52YWx1ZSxcbiAgICAgICAgZW5jcnlwdGlvblR5cGU6IHRoaXMucHJvcHMuZW5jcnlwdGlvblR5cGU/LnZhbHVlLFxuICAgICAgICBobHNDZG5TZXR0aW5nczogdGhpcy5wcm9wcy5obHNDZG5TZXR0aW5ncz8uX2JpbmQoKSxcbiAgICAgICAgaGxzSWQzU2VnbWVudFRhZ2dpbmc6ICh0aGlzLnByb3BzLmhsc0lkM1NlZ21lbnRUYWdnaW5nID8/IEhsc0lkM1NlZ21lbnRUYWdnaW5nU3RhdGUuRElTQUJMRUQpLnZhbHVlLFxuICAgICAgICBpRnJhbWVPbmx5UGxheWxpc3RzOiAodGhpcy5wcm9wcy5pRnJhbWVPbmx5UGxheWxpc3RzID8/IEhsc0lGcmFtZU9ubHlQbGF5bGlzdHMuRElTQUJMRUQpLnZhbHVlLFxuICAgICAgICBpbmNvbXBsZXRlU2VnbWVudEJlaGF2aW9yOiAodGhpcy5wcm9wcy5pbmNvbXBsZXRlU2VnbWVudEJlaGF2aW9yID8/IEhsc0luY29tcGxldGVTZWdtZW50QmVoYXZpb3IuQVVUTykudmFsdWUsXG4gICAgICAgIGl2SW5NYW5pZmVzdDogdGhpcy5wcm9wcy5pdkluTWFuaWZlc3Q/LnZhbHVlLFxuICAgICAgICBpdlNvdXJjZTogdGhpcy5wcm9wcy5pdlNvdXJjZT8udmFsdWUsXG4gICAgICAgIGtleUZvcm1hdDogdGhpcy5wcm9wcy5rZXlGb3JtYXQsXG4gICAgICAgIGtleUZvcm1hdFZlcnNpb25zOiB0aGlzLnByb3BzLmtleUZvcm1hdFZlcnNpb25zLFxuICAgICAgICBrZXlQcm92aWRlclNldHRpbmdzOiB0aGlzLnByb3BzLmtleVByb3ZpZGVyU2V0dGluZ3M/Ll9iaW5kKCksXG4gICAgICAgIG1hbmlmZXN0Q29tcHJlc3Npb246ICh0aGlzLnByb3BzLm1hbmlmZXN0Q29tcHJlc3Npb24gPz8gSGxzTWFuaWZlc3RDb21wcmVzc2lvbi5OT05FKS52YWx1ZSxcbiAgICAgICAgbWFuaWZlc3REdXJhdGlvbkZvcm1hdDogKHRoaXMucHJvcHMubWFuaWZlc3REdXJhdGlvbkZvcm1hdCA/PyBIbHNNYW5pZmVzdER1cmF0aW9uRm9ybWF0LkZMT0FUSU5HX1BPSU5UKS52YWx1ZSxcbiAgICAgICAgb3V0cHV0U2VsZWN0aW9uOiAodGhpcy5wcm9wcy5vdXRwdXRTZWxlY3Rpb24gPz8gSGxzT3V0cHV0U2VsZWN0aW9uLk1BTklGRVNUU19BTkRfU0VHTUVOVFMpLnZhbHVlLFxuICAgICAgICBwcm9ncmFtRGF0ZVRpbWU6ICh0aGlzLnByb3BzLnByb2dyYW1EYXRlVGltZSA/PyBIbHNQcm9ncmFtRGF0ZVRpbWUuSU5DTFVERSkudmFsdWUsXG4gICAgICAgIHByb2dyYW1EYXRlVGltZUNsb2NrOiAodGhpcy5wcm9wcy5wcm9ncmFtRGF0ZVRpbWVDbG9jayA/PyB0aGlzLl9kZWZhdWx0UHJvZ3JhbURhdGVUaW1lQ2xvY2soKSkudmFsdWUsXG4gICAgICAgIHByb2dyYW1EYXRlVGltZVBlcmlvZDogdGhpcy5wcm9wcy5wcm9ncmFtRGF0ZVRpbWVQZXJpb2Q/LnRvU2Vjb25kcygpID8/IDYwMCxcbiAgICAgICAgcmVkdW5kYW50TWFuaWZlc3Q6ICh0aGlzLnByb3BzLnJlZHVuZGFudE1hbmlmZXN0ID8/IEhsc1JlZHVuZGFudE1hbmlmZXN0LkRJU0FCTEVEKS52YWx1ZSxcbiAgICAgICAgc2VnbWVudGF0aW9uTW9kZTogKHRoaXMucHJvcHMuc2VnbWVudGF0aW9uTW9kZSA/PyBIbHNTZWdtZW50YXRpb25Nb2RlLlVTRV9TRUdNRU5UX0RVUkFUSU9OKS52YWx1ZSxcbiAgICAgICAgc2VnbWVudHNQZXJTdWJkaXJlY3Rvcnk6IHRoaXMucHJvcHMuc2VnbWVudHNQZXJTdWJkaXJlY3RvcnkgPz8gMTBfMDAwLFxuICAgICAgICBzdHJlYW1JbmZSZXNvbHV0aW9uOiAodGhpcy5wcm9wcy5zdHJlYW1JbmZSZXNvbHV0aW9uID8/IEhsc1N0cmVhbUluZlJlc29sdXRpb24uSU5DTFVERSkudmFsdWUsXG4gICAgICAgIHRpbWVkTWV0YWRhdGFJZDNGcmFtZTogKHRoaXMucHJvcHMudGltZWRNZXRhZGF0YUlkM0ZyYW1lID8/IEhsc1RpbWVkTWV0YWRhdGFJZDNGcmFtZS5QUklWKS52YWx1ZSxcbiAgICAgICAgdGltZWRNZXRhZGF0YUlkM1BlcmlvZDogdGhpcy5wcm9wcy50aW1lZE1ldGFkYXRhSWQzUGVyaW9kPy50b1NlY29uZHMoKSA/PyAxMCxcbiAgICAgICAgdGltZXN0YW1wRGVsdGFNaWxsaXNlY29uZHM6IHRoaXMucHJvcHMudGltZXN0YW1wRGVsdGE/LnRvTWlsbGlzZWNvbmRzKCksXG4gICAgICAgIHRzRmlsZU1vZGU6ICh0aGlzLnByb3BzLnRzRmlsZU1vZGUgPz8gSGxzVHNGaWxlTW9kZS5TRUdNRU5URURfRklMRVMpLnZhbHVlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBfYmluZERlc3RpbmF0aW9uKF9jaGFubmVsQ2xhc3M6IHN0cmluZyk6IENmbkNoYW5uZWwuT3V0cHV0RGVzdGluYXRpb25Qcm9wZXJ0eVtdIHtcbiAgICB2YWxpZGF0ZURlc3RpbmF0aW9uQ291bnQodGhpcy5fbmFtZSwgX2NoYW5uZWxDbGFzcywgdGhpcy5wcm9wcy5kZXN0aW5hdGlvbnMubGVuZ3RoLCAwLCBmYWxzZSk7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnByb3BzLmRlc3RpbmF0aW9ucy5tYXAoZCA9PiB7XG4gICAgICBjb25zdCBib3VuZCA9IGQuX2JpbmQoKTtcbiAgICAgIGlmIChib3VuZC51cmwgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChib3VuZC51cmwpICYmIGJvdW5kLnVybC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgSGxzRGVzdGluYXRpb25UcmFpbGluZ1NsYXNoYCxcbiAgICAgICAgICBgSExTIG91dHB1dCBncm91cCAnJHt0aGlzLl9uYW1lfScgZGVzdGluYXRpb24gVVJMIG11c3QgYmUgYSBmaWxlIHByZWZpeCwgbm90IGEgZm9sZGVyIChnb3QgJyR7Ym91bmQudXJsfScpLiBSZW1vdmUgdGhlIHRyYWlsaW5nIHNsYXNoLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBBbiBodHRwcyBkZXN0aW5hdGlvbiBwdXNoZXMgdG8gYSBDRE4vd2ViIHNlcnZlciwgd2hpY2ggcmVxdWlyZXMgaGxzQ2RuU2V0dGluZ3MuXG4gICAgICBpZiAoYm91bmQudXJsICYmICFUb2tlbi5pc1VucmVzb2x2ZWQoYm91bmQudXJsKSAmJiBib3VuZC51cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKVxuICAgICAgICAmJiB0aGlzLnByb3BzLmhsc0NkblNldHRpbmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBIbHNIdHRwc0Rlc3RpbmF0aW9uUmVxdWlyZXNDZG5TZXR0aW5nc2AsXG4gICAgICAgICAgYEhMUyBvdXRwdXQgZ3JvdXAgJyR7dGhpcy5fbmFtZX0nIHVzZXMgYW4gaHR0cHMgZGVzdGluYXRpb24gVVJMLCB3aGljaCByZXF1aXJlcyBobHNDZG5TZXR0aW5ncyB0byBiZSBzZXQgKGUuZy4gSGxzQ2RuU2V0dGluZ3MuYmFzaWNQdXQoKSwgLmFrYW1haSgpLCBvciAud2ViZGF2KCkpLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYm91bmQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIFt7IGlkOiB0b0Rlc3RpbmF0aW9uSWQodGhpcy5wcm9wcy5uYW1lKSwgc2V0dGluZ3MgfV07XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlKTogdm9pZCB7XG4gICAgdGhpcy5wcm9wcy5kZXN0aW5hdGlvbnMuZm9yRWFjaChkID0+IGQuX2dyYW50UGVybWlzc2lvbnMocm9sZSkpO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIFVkcE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiBleHRlbmRzIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBVZHBPdXRwdXRHcm91cFByb3BzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9uYW1lID0gcHJvcHMubmFtZTtcbiAgfVxuICBwdWJsaWMgX2NyZWF0ZUluaXRpYWxPdXRwdXRzKCk6IE91dHB1dFtdIHtcbiAgICByZXR1cm4gKHRoaXMucHJvcHMub3V0cHV0cyA/PyBbXSkubWFwKGRlZiA9PiBuZXcgVWRwT3V0cHV0KGRlZiwgdGhpcy5wcm9wcykpO1xuICB9XG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLk91dHB1dEdyb3VwU2V0dGluZ3NQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVkcEdyb3VwU2V0dGluZ3M6IHtcbiAgICAgICAgaW5wdXRMb3NzQWN0aW9uOiAodGhpcy5wcm9wcy5pbnB1dExvc3NBY3Rpb24gPz8gVWRwSW5wdXRMb3NzQWN0aW9uLkVNSVRfUFJPR1JBTSkudmFsdWUsXG4gICAgICAgIHRpbWVkTWV0YWRhdGFJZDNGcmFtZTogKHRoaXMucHJvcHMudGltZWRNZXRhZGF0YUlkM0ZyYW1lID8/IFVkcFRpbWVkTWV0YWRhdGFJZDNGcmFtZS5QUklWKS52YWx1ZSxcbiAgICAgICAgdGltZWRNZXRhZGF0YUlkM1BlcmlvZDogdGhpcy5wcm9wcy50aW1lZE1ldGFkYXRhSWQzUGVyaW9kPy50b1NlY29uZHMoKSA/PyAxMCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgX2JpbmREZXN0aW5hdGlvbihfY2hhbm5lbENsYXNzOiBzdHJpbmcpOiBDZm5DaGFubmVsLk91dHB1dERlc3RpbmF0aW9uUHJvcGVydHlbXSB7XG4gICAgdmFsaWRhdGVEZXN0aW5hdGlvbkNvdW50KHRoaXMuX25hbWUsIF9jaGFubmVsQ2xhc3MsIHRoaXMucHJvcHMuZGVzdGluYXRpb25zLmxlbmd0aCwgMCwgZmFsc2UpO1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5wcm9wcy5kZXN0aW5hdGlvbnMubWFwKGQgPT4gZC5fYmluZCgpKTtcbiAgICByZXR1cm4gW3sgaWQ6IHRvRGVzdGluYXRpb25JZCh0aGlzLnByb3BzLm5hbWUpLCBzZXR0aW5ncyB9XTtcbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGUgX2dyYW50UGVybWlzc2lvbnMocm9sZTogSVJvbGUpOiB2b2lkIHtcbiAgICB0aGlzLnByb3BzLmRlc3RpbmF0aW9ucy5mb3JFYWNoKGQgPT4gZC5fZ3JhbnRQZXJtaXNzaW9ucyhyb2xlKSk7XG4gIH1cbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuY2xhc3MgQXJjaGl2ZU91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiBleHRlbmRzIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBBcmNoaXZlT3V0cHV0R3JvdXBQcm9wcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fbmFtZSA9IHByb3BzLm5hbWU7XG4gICAgLy8gQW4gYXJjaGl2ZSBncm91cCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIG91dHB1dCB3aXRoIGEgdmlkZW8gZW5jb2RlIChyYXctY29udGFpbmVyXG4gICAgLy8gb3V0cHV0cyBhcmUgYXVkaW8tb25seSwgc28gYSBncm91cCBvZiBvbmx5IHJhdyBvdXRwdXRzIGlzIHJlamVjdGVkIGJ5IHRoZSBzZXJ2aWNlKS5cbiAgICBjb25zdCBvdXRwdXRzID0gcHJvcHMub3V0cHV0cyA/PyBbXTtcbiAgICBpZiAob3V0cHV0cy5sZW5ndGggPiAwICYmICFvdXRwdXRzLnNvbWUobyA9PiBvLmVuY29kZXMuc29tZShlID0+IGUuX2JpbmRWaWRlbygpICE9PSB1bmRlZmluZWQpKSkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgQXJjaGl2ZUdyb3VwUmVxdWlyZXNWaWRlb2AsXG4gICAgICAgIGBBcmNoaXZlIG91dHB1dCBncm91cCAnJHtwcm9wcy5uYW1lfScgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBvdXRwdXQgd2l0aCBhIHZpZGVvIGVuY29kZWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgX2NyZWF0ZUluaXRpYWxPdXRwdXRzKCk6IE91dHB1dFtdIHtcbiAgICByZXR1cm4gKHRoaXMucHJvcHMub3V0cHV0cyA/PyBbXSkubWFwKGRlZiA9PiBuZXcgQXJjaGl2ZU91dHB1dChkZWYpKTtcbiAgfVxuICBwdWJsaWMgX2JpbmQoKTogQ2ZuQ2hhbm5lbC5PdXRwdXRHcm91cFNldHRpbmdzUHJvcGVydHkge1xuICAgIHJldHVybiB7XG4gICAgICBhcmNoaXZlR3JvdXBTZXR0aW5nczoge1xuICAgICAgICBkZXN0aW5hdGlvbjogeyBkZXN0aW5hdGlvblJlZklkOiB0b0Rlc3RpbmF0aW9uSWQodGhpcy5wcm9wcy5uYW1lKSB9LFxuICAgICAgICByb2xsb3ZlckludGVydmFsOiB0aGlzLnByb3BzLnJvbGxvdmVySW50ZXJ2YWw/LnRvU2Vjb25kcygpID8/IDMwMCxcbiAgICAgICAgYXJjaGl2ZUNkblNldHRpbmdzOiB0aGlzLnByb3BzLmFyY2hpdmVTM0Nhbm5lZEFjbCA/IHtcbiAgICAgICAgICBhcmNoaXZlUzNTZXR0aW5nczogeyBjYW5uZWRBY2w6IHRoaXMucHJvcHMuYXJjaGl2ZVMzQ2FubmVkQWNsLnZhbHVlIH0sXG4gICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcHVibGljIF9iaW5kRGVzdGluYXRpb24oX2NoYW5uZWxDbGFzczogc3RyaW5nKTogQ2ZuQ2hhbm5lbC5PdXRwdXREZXN0aW5hdGlvblByb3BlcnR5W10ge1xuICAgIHZhbGlkYXRlRGVzdGluYXRpb25Db3VudCh0aGlzLl9uYW1lLCBfY2hhbm5lbENsYXNzLCB0aGlzLnByb3BzLmRlc3RpbmF0aW9ucy5sZW5ndGgsIDAsIGZhbHNlKTtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMucHJvcHMuZGVzdGluYXRpb25zLm1hcChkID0+IGQuX2JpbmQoKSk7XG4gICAgcmV0dXJuIFt7IGlkOiB0b0Rlc3RpbmF0aW9uSWQodGhpcy5wcm9wcy5uYW1lKSwgc2V0dGluZ3MgfV07XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlKTogdm9pZCB7XG4gICAgdGhpcy5wcm9wcy5kZXN0aW5hdGlvbnMuZm9yRWFjaChkID0+IGQuX2dyYW50UGVybWlzc2lvbnMocm9sZSkpO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIFJ0bXBPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgcmVhZG9ubHkgX25hbWU6IHN0cmluZztcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogUnRtcE91dHB1dEdyb3VwUHJvcHMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX25hbWUgPSBwcm9wcy5uYW1lO1xuICB9XG4gIHB1YmxpYyBfY3JlYXRlSW5pdGlhbE91dHB1dHMoKTogT3V0cHV0W10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLm91dHB1dHMubWFwKGRlZiA9PiBuZXcgUnRtcE91dHB1dChkZWYsIHRoaXMuX25hbWUpKTtcbiAgfVxuICBwdWJsaWMgX2JpbmQoKTogQ2ZuQ2hhbm5lbC5PdXRwdXRHcm91cFNldHRpbmdzUHJvcGVydHkge1xuICAgIHJldHVybiB7XG4gICAgICBydG1wR3JvdXBTZXR0aW5nczoge1xuICAgICAgICBhdXRoZW50aWNhdGlvblNjaGVtZTogKHRoaXMucHJvcHMuYXV0aGVudGljYXRpb25TY2hlbWUgPz8gUnRtcEF1dGhlbnRpY2F0aW9uU2NoZW1lLkNPTU1PTikudmFsdWUsXG4gICAgICAgIHJlc3RhcnREZWxheTogdGhpcy5wcm9wcy5yZXN0YXJ0RGVsYXk/LnRvU2Vjb25kcygpID8/IDEsXG4gICAgICAgIGFkTWFya2VyczogdGhpcy5wcm9wcy5hZE1hcmtlcnM/Lm1hcChtID0+IG0udmFsdWUpLFxuICAgICAgICBjYWNoZUZ1bGxCZWhhdmlvcjogdGhpcy5wcm9wcy5jYWNoZUZ1bGxCZWhhdmlvcj8udmFsdWUsXG4gICAgICAgIGNhY2hlTGVuZ3RoOiB0aGlzLnByb3BzLmNhY2hlTGVuZ3RoPy50b1NlY29uZHMoKSxcbiAgICAgICAgY2FwdGlvbkRhdGE6IHRoaXMucHJvcHMuY2FwdGlvbkRhdGE/LnZhbHVlLFxuICAgICAgICBpbmNsdWRlRmlsbGVyTmFsVW5pdHM6IHRoaXMucHJvcHMuaW5jbHVkZUZpbGxlck5hbFVuaXRzPy52YWx1ZSxcbiAgICAgICAgaW5wdXRMb3NzQWN0aW9uOiB0aGlzLnByb3BzLmlucHV0TG9zc0FjdGlvbj8udmFsdWUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcHVibGljIF9iaW5kRGVzdGluYXRpb24oY2hhbm5lbENsYXNzOiBzdHJpbmcpOiBDZm5DaGFubmVsLk91dHB1dERlc3RpbmF0aW9uUHJvcGVydHlbXSB7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSBjaGFubmVsQ2xhc3MgPT09ICdTVEFOREFSRCcgPyAyIDogMTtcbiAgICBjb25zdCBzZWVuSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMub3V0cHV0cy5tYXAoKGRlZikgPT4ge1xuICAgICAgaWYgKGRlZi5kZXN0aW5hdGlvbnMubGVuZ3RoICE9PSBleHBlY3RlZCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YFJ0bXBEZXN0aW5hdGlvbkNvdW50YCxcbiAgICAgICAgICBgUlRNUCBvdXRwdXQgJyR7ZGVmLm91dHB1dE5hbWV9JyBpbiBncm91cCAnJHt0aGlzLl9uYW1lfScgcmVxdWlyZXMgZXhhY3RseSAke2V4cGVjdGVkfSBkZXN0aW5hdGlvbihzKSAob25lIHBlciBwaXBlbGluZSkgZm9yIGEgJHtjaGFubmVsQ2xhc3N9IGNoYW5uZWwsIGdvdCAke2RlZi5kZXN0aW5hdGlvbnMubGVuZ3RofWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBpZCA9IHRvRGVzdGluYXRpb25JZChkZWYub3V0cHV0TmFtZSk7XG4gICAgICBpZiAoaWQgPT09ICcnKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgUnRtcERlc3RpbmF0aW9uSWRFbXB0eWAsXG4gICAgICAgICAgYFJUTVAgb3V0cHV0IGluIGdyb3VwICcke3RoaXMuX25hbWV9JyBvdXRwdXROYW1lIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgYWxwaGFudW1lcmljIGNoYXJhY3RlcmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc2Vlbklkcy5oYXMoaWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgUnRtcERlc3RpbmF0aW9uSWRDb2xsaXNpb25gLFxuICAgICAgICAgIGBSVE1QIG91dHB1dHMgaW4gZ3JvdXAgJyR7dGhpcy5fbmFtZX0nIHByb2R1Y2UgdGhlIHNhbWUgZGVzdGluYXRpb24gaWQgJyR7aWR9JyBhZnRlciBzYW5pdGlzaW5nIG91dHB1dCBuYW1lczsgcmVuYW1lIHRoZSBvdXRwdXRzIHNvIHRoZXkgZGlmZmVyIGJ5IG1vcmUgdGhhbiAnXycgdnMgJy0nYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHNlZW5JZHMuYWRkKGlkKTtcbiAgICAgIHJldHVybiB7IGlkLCBzZXR0aW5nczogZGVmLmRlc3RpbmF0aW9ucy5tYXAoZCA9PiBkLl9iaW5kKCkpIH07XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlKTogdm9pZCB7XG4gICAgdGhpcy5wcm9wcy5vdXRwdXRzLmZvckVhY2gobyA9PiBvLmRlc3RpbmF0aW9ucy5mb3JFYWNoKGQgPT4gZC5fZ3JhbnRQZXJtaXNzaW9ucyhyb2xlKSkpO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIFNydE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiBleHRlbmRzIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9vdXRwdXRzOiBTcnRPdXRwdXRbXTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogU3J0T3V0cHV0R3JvdXBQcm9wcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fbmFtZSA9IHByb3BzLm5hbWU7XG4gICAgdGhpcy5fb3V0cHV0cyA9IHByb3BzLm91dHB1dHMubWFwKGRlZiA9PiBuZXcgU3J0T3V0cHV0KGRlZiwgdGhpcy5fbmFtZSkpO1xuICB9XG4gIHB1YmxpYyBfY3JlYXRlSW5pdGlhbE91dHB1dHMoKTogT3V0cHV0W10ge1xuICAgIHJldHVybiB0aGlzLl9vdXRwdXRzO1xuICB9XG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLk91dHB1dEdyb3VwU2V0dGluZ3NQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNydEdyb3VwU2V0dGluZ3M6IHtcbiAgICAgICAgaW5wdXRMb3NzQWN0aW9uOiAodGhpcy5wcm9wcy5pbnB1dExvc3NBY3Rpb24gPz8gU3J0SW5wdXRMb3NzQWN0aW9uLkVNSVRfUFJPR1JBTSkudmFsdWUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcHVibGljIF9iaW5kRGVzdGluYXRpb24oY2hhbm5lbENsYXNzOiBzdHJpbmcpOiBDZm5DaGFubmVsLk91dHB1dERlc3RpbmF0aW9uUHJvcGVydHlbXSB7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSBjaGFubmVsQ2xhc3MgPT09ICdTVEFOREFSRCcgPyAyIDogMTtcbiAgICBjb25zdCBzZWVuSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMub3V0cHV0cy5tYXAoKGRlZikgPT4ge1xuICAgICAgaWYgKGRlZi5kZXN0aW5hdGlvbnMubGVuZ3RoICE9PSBleHBlY3RlZCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YFNydERlc3RpbmF0aW9uQ291bnRgLFxuICAgICAgICAgIGBTUlQgb3V0cHV0ICcke2RlZi5vdXRwdXROYW1lfScgaW4gZ3JvdXAgJyR7dGhpcy5fbmFtZX0nIHJlcXVpcmVzIGV4YWN0bHkgJHtleHBlY3RlZH0gZGVzdGluYXRpb24ocykgKG9uZSBwZXIgcGlwZWxpbmUpIGZvciBhICR7Y2hhbm5lbENsYXNzfSBjaGFubmVsLCBnb3QgJHtkZWYuZGVzdGluYXRpb25zLmxlbmd0aH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgaWQgPSB0b0Rlc3RpbmF0aW9uSWQoZGVmLm91dHB1dE5hbWUpO1xuICAgICAgaWYgKGlkID09PSAnJykge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YFNydERlc3RpbmF0aW9uSWRFbXB0eWAsXG4gICAgICAgICAgYFNSVCBvdXRwdXQgaW4gZ3JvdXAgJyR7dGhpcy5fbmFtZX0nIG91dHB1dE5hbWUgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVyYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWVuSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBTcnREZXN0aW5hdGlvbklkQ29sbGlzaW9uYCxcbiAgICAgICAgICBgU1JUIG91dHB1dHMgaW4gZ3JvdXAgJyR7dGhpcy5fbmFtZX0nIHByb2R1Y2UgdGhlIHNhbWUgZGVzdGluYXRpb24gaWQgJyR7aWR9JyBhZnRlciBzYW5pdGlzaW5nIG91dHB1dCBuYW1lczsgcmVuYW1lIHRoZSBvdXRwdXRzIHNvIHRoZXkgZGlmZmVyIGJ5IG1vcmUgdGhhbiAnXycgdnMgJy0nYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHNlZW5JZHMuYWRkKGlkKTtcbiAgICAgIHJldHVybiB7IGlkLCBzcnRTZXR0aW5nczogZGVmLmRlc3RpbmF0aW9ucy5tYXAoZCA9PiBkLl9iaW5kKCkpIH07XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlKTogdm9pZCB7XG4gICAgdGhpcy5wcm9wcy5vdXRwdXRzLmZvckVhY2gobyA9PiBvLmRlc3RpbmF0aW9ucy5mb3JFYWNoKGQgPT4gZC5fZ3JhbnRQZXJtaXNzaW9ucyhyb2xlKSkpO1xuICB9XG4gIHB1YmxpYyBvdmVycmlkZSBfaGFzU3J0TGlzdGVuZXJEZXN0aW5hdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5vdXRwdXRzLnNvbWUobyA9PiBvLmRlc3RpbmF0aW9ucy5zb21lKGQgPT4gZC5fYmluZCgpLmNvbm5lY3Rpb25Nb2RlID09PSAnTElTVEVORVInKSk7XG4gIH1cbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuY2xhc3MgQ21hZkluZ2VzdE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiBleHRlbmRzIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBDbWFmSW5nZXN0T3V0cHV0R3JvdXBQcm9wcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fbmFtZSA9IHByb3BzLm5hbWU7XG4gICAgLy8gRWFnZXJseSByZWplY3QgZGVzdGluYXRpb24gVVJMcyB0aGF0IGRvbid0IGVuZCB3aXRoICcvJyDigJQgdGhpcyBpcyBBUEkgbWlzdXNlIHRoYXQgYWx3YXlzXG4gICAgLy8gZmFpbHMgYXQgZGVwbG95LCBzbyBmYWlsIGZhc3QgYXQgY29uc3RydWN0aW9uIHJhdGhlciB0aGFuIGF0IHN5bnRoLlxuICAgIFsuLi5wcm9wcy5kZXN0aW5hdGlvbnMsIC4uLihwcm9wcy5hZGRpdGlvbmFsRGVzdGluYXRpb25zID8/IFtdKV0uZm9yRWFjaChkID0+IHtcbiAgICAgIGNvbnN0IHsgdXJsIH0gPSBkLl9iaW5kKCk7XG4gICAgICBpZiAodXJsICYmICFUb2tlbi5pc1VucmVzb2x2ZWQodXJsKSAmJiAhdXJsLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBDbWFmSW5nZXN0RGVzdGluYXRpb25UcmFpbGluZ1NsYXNoYCxcbiAgICAgICAgICBgQ01BRiBJbmdlc3Qgb3V0cHV0IGdyb3VwICcke3RoaXMuX25hbWV9JyBkZXN0aW5hdGlvbiBVUkwgcGF0aCBtdXN0IGVuZCB3aXRoICcvJyAoZ290ICcke3VybH0nKS5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBfY3JlYXRlSW5pdGlhbE91dHB1dHMoKTogT3V0cHV0W10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLm91dHB1dHMubWFwKGRlZiA9PiBuZXcgQ21hZkluZ2VzdE91dHB1dChkZWYpKTtcbiAgfVxuICBwdWJsaWMgX2JpbmQoKTogQ2ZuQ2hhbm5lbC5PdXRwdXRHcm91cFNldHRpbmdzUHJvcGVydHkge1xuICAgIHJldHVybiB7XG4gICAgICBjbWFmSW5nZXN0R3JvdXBTZXR0aW5nczoge1xuICAgICAgICBkZXN0aW5hdGlvbjogeyBkZXN0aW5hdGlvblJlZklkOiB0b0Rlc3RpbmF0aW9uSWQodGhpcy5wcm9wcy5uYW1lKSB9LFxuICAgICAgICBzZWdtZW50TGVuZ3RoOiB0aGlzLnByb3BzLnNlZ21lbnQ/Ll9sZW5ndGgoKSA/PyAxLFxuICAgICAgICBzZWdtZW50TGVuZ3RoVW5pdHM6IHRoaXMucHJvcHMuc2VnbWVudD8uX3VuaXRzKCkgPz8gU2VnbWVudExlbmd0aFVuaXRzLlNFQ09ORFMsXG4gICAgICAgIGlkM0JlaGF2aW9yOiAodGhpcy5wcm9wcy5pZDNCZWhhdmlvciA/PyBJZDNCZWhhdmlvci5ESVNBQkxFRCkudmFsdWUsXG4gICAgICAgIGlkM05hbWVNb2RpZmllcjogdGhpcy5wcm9wcy5pZDNOYW1lTW9kaWZpZXIsXG4gICAgICAgIGtsdkJlaGF2aW9yOiAodGhpcy5wcm9wcy5rbHZCZWhhdmlvciA/PyBLbHZCZWhhdmlvci5OT19QQVNTVEhST1VHSCkudmFsdWUsXG4gICAgICAgIGtsdk5hbWVNb2RpZmllcjogdGhpcy5wcm9wcy5rbHZOYW1lTW9kaWZpZXIsXG4gICAgICAgIG5pZWxzZW5JZDNCZWhhdmlvcjogKHRoaXMucHJvcHMubmllbHNlbklkM0JlaGF2aW9yID8/IE5pZWxzZW5JZDNCZWhhdmlvci5OT19QQVNTVEhST1VHSCkudmFsdWUsXG4gICAgICAgIG5pZWxzZW5JZDNOYW1lTW9kaWZpZXI6IHRoaXMucHJvcHMubmllbHNlbklkM05hbWVNb2RpZmllcixcbiAgICAgICAgc2N0ZTM1TmFtZU1vZGlmaWVyOiB0aGlzLnByb3BzLnNjdGUzNU5hbWVNb2RpZmllcixcbiAgICAgICAgc2N0ZTM1VHlwZTogKHRoaXMucHJvcHMuc2N0ZTM1VHlwZSA/PyBTY3RlMzVUeXBlLlNDVEVfMzVfV0lUSE9VVF9TRUdNRU5UQVRJT04pLnZhbHVlLFxuICAgICAgICBzZW5kRGVsYXlNczogdGhpcy5wcm9wcy5zZW5kRGVsYXlNcyxcbiAgICAgICAgdGltZWRNZXRhZGF0YUlkM0ZyYW1lOiAodGhpcy5wcm9wcy50aW1lZE1ldGFkYXRhSWQzRnJhbWUgPz8gVGltZWRNZXRhZGF0YUlkM0ZyYW1lLk5PTkUpLnZhbHVlLFxuICAgICAgICB0aW1lZE1ldGFkYXRhSWQzUGVyaW9kOiB0aGlzLnByb3BzLnRpbWVkTWV0YWRhdGFJZDNQZXJpb2Q/LnRvU2Vjb25kcygpID8/IDEwLFxuICAgICAgICB0aW1lZE1ldGFkYXRhUGFzc3Rocm91Z2g6ICh0aGlzLnByb3BzLnRpbWVkTWV0YWRhdGFQYXNzdGhyb3VnaCA/PyBUaW1lZE1ldGFkYXRhUGFzc3Rocm91Z2guRElTQUJMRUQpLnZhbHVlLFxuICAgICAgICBjYXB0aW9uTGFuZ3VhZ2VNYXBwaW5nczogdGhpcy5wcm9wcy5jYXB0aW9uTGFuZ3VhZ2VNYXBwaW5ncyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgX2JpbmREZXN0aW5hdGlvbihfY2hhbm5lbENsYXNzOiBzdHJpbmcpOiBDZm5DaGFubmVsLk91dHB1dERlc3RpbmF0aW9uUHJvcGVydHlbXSB7XG4gICAgY29uc3QgYWRkaXRpb25hbCA9IHRoaXMucHJvcHMuYWRkaXRpb25hbERlc3RpbmF0aW9ucyA/PyBbXTtcbiAgICB2YWxpZGF0ZURlc3RpbmF0aW9uQ291bnQodGhpcy5fbmFtZSwgX2NoYW5uZWxDbGFzcywgdGhpcy5wcm9wcy5kZXN0aW5hdGlvbnMubGVuZ3RoLCBhZGRpdGlvbmFsLmxlbmd0aCwgdHJ1ZSk7XG5cbiAgICBjb25zdCBwcmltYXJ5U2V0dGluZ3MgPSB0aGlzLnByb3BzLmRlc3RpbmF0aW9ucy5tYXAoZCA9PiBkLl9iaW5kKCkpO1xuICAgIGNvbnN0IHJlc3VsdDogQ2ZuQ2hhbm5lbC5PdXRwdXREZXN0aW5hdGlvblByb3BlcnR5W10gPSBbXG4gICAgICB7IGlkOiB0b0Rlc3RpbmF0aW9uSWQodGhpcy5wcm9wcy5uYW1lKSwgc2V0dGluZ3M6IHByaW1hcnlTZXR0aW5ncyB9LFxuICAgIF07XG5cbiAgICBhZGRpdGlvbmFsLmZvckVhY2goKGRlc3QsIGkpID0+IHtcbiAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgaWQ6IGAke3RvRGVzdGluYXRpb25JZCh0aGlzLnByb3BzLm5hbWUpfS1hZGRpdGlvbmFsLSR7aX1gLFxuICAgICAgICBzZXR0aW5nczogW2Rlc3QuX2JpbmQoKV0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlKTogdm9pZCB7XG4gICAgWy4uLnRoaXMucHJvcHMuZGVzdGluYXRpb25zLCAuLi4odGhpcy5wcm9wcy5hZGRpdGlvbmFsRGVzdGluYXRpb25zID8/IFtdKV0uZm9yRWFjaChkID0+IGQuX2dyYW50UGVybWlzc2lvbnMocm9sZSkpO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIEZyYW1lQ2FwdHVyZU91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiBleHRlbmRzIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBGcmFtZUNhcHR1cmVPdXRwdXRHcm91cFByb3BzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9uYW1lID0gcHJvcHMubmFtZTtcbiAgfVxuICBwdWJsaWMgX2NyZWF0ZUluaXRpYWxPdXRwdXRzKCk6IE91dHB1dFtdIHtcbiAgICByZXR1cm4gKHRoaXMucHJvcHMub3V0cHV0cyA/PyBbXSkubWFwKGRlZiA9PiBuZXcgRnJhbWVDYXB0dXJlT3V0cHV0KGRlZikpO1xuICB9XG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLk91dHB1dEdyb3VwU2V0dGluZ3NQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyYW1lQ2FwdHVyZUdyb3VwU2V0dGluZ3M6IHtcbiAgICAgICAgZGVzdGluYXRpb246IHsgZGVzdGluYXRpb25SZWZJZDogdG9EZXN0aW5hdGlvbklkKHRoaXMucHJvcHMubmFtZSkgfSxcbiAgICAgICAgZnJhbWVDYXB0dXJlQ2RuU2V0dGluZ3M6IHRoaXMucHJvcHMuZnJhbWVDYXB0dXJlUzNDYW5uZWRBY2wgPyB7XG4gICAgICAgICAgZnJhbWVDYXB0dXJlUzNTZXR0aW5nczogeyBjYW5uZWRBY2w6IHRoaXMucHJvcHMuZnJhbWVDYXB0dXJlUzNDYW5uZWRBY2wudmFsdWUgfSxcbiAgICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgX2JpbmREZXN0aW5hdGlvbihfY2hhbm5lbENsYXNzOiBzdHJpbmcpOiBDZm5DaGFubmVsLk91dHB1dERlc3RpbmF0aW9uUHJvcGVydHlbXSB7XG4gICAgdmFsaWRhdGVEZXN0aW5hdGlvbkNvdW50KHRoaXMuX25hbWUsIF9jaGFubmVsQ2xhc3MsIHRoaXMucHJvcHMuZGVzdGluYXRpb25zLmxlbmd0aCwgMCwgZmFsc2UpO1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5wcm9wcy5kZXN0aW5hdGlvbnMubWFwKGQgPT4gZC5fYmluZCgpKTtcbiAgICByZXR1cm4gW3sgaWQ6IHRvRGVzdGluYXRpb25JZCh0aGlzLnByb3BzLm5hbWUpLCBzZXR0aW5ncyB9XTtcbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGUgX2dyYW50UGVybWlzc2lvbnMocm9sZTogSVJvbGUpOiB2b2lkIHtcbiAgICB0aGlzLnByb3BzLmRlc3RpbmF0aW9ucy5mb3JFYWNoKGQgPT4gZC5fZ3JhbnRQZXJtaXNzaW9ucyhyb2xlKSk7XG4gIH1cbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuY2xhc3MgTXNTbW9vdGhPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgcmVhZG9ubHkgX25hbWU6IHN0cmluZztcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogTXNTbW9vdGhPdXRwdXRHcm91cFByb3BzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9uYW1lID0gcHJvcHMubmFtZTtcblxuICAgIC8vIEFsbCBvdXRwdXRzIGluIGFuIE1TIFNtb290aCBncm91cCBzaGFyZSB0aGUgZ3JvdXAncyBzaW5nbGUgZGVzdGluYXRpb24sIHNvIE1lZGlhTGl2ZVxuICAgIC8vIGRpc3Rpbmd1aXNoZXMgdGhlbSBieSBuYW1lTW9kaWZpZXIgYWxvbmUg4oCUIGl0IG11c3QgYmUgc2V0IGFuZCB1bmlxdWUgYWNyb3NzIG91dHB1dHMuXG4gICAgLy8gT3RoZXJ3aXNlIHRoaXMgZmFpbHMgYXQgZGVwbG95IHdpdGggXCJPdXRwdXRzIG11c3QgaGF2ZSB1bmlxdWUgZGVzdGluYXRpb25zXCIuXG4gICAgY29uc3Qgb3V0cHV0cyA9IHByb3BzLm91dHB1dHMgPz8gW107XG4gICAgaWYgKG91dHB1dHMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3Qgc2Vlbk1vZGlmaWVycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgb3V0cHV0cy5mb3JFYWNoKGRlZiA9PiB7XG4gICAgICAgIGlmICghZGVmLm5hbWVNb2RpZmllcikge1xuICAgICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIGxpdGBNc1Ntb290aE5hbWVNb2RpZmllclJlcXVpcmVkYCxcbiAgICAgICAgICAgIGBNUyBTbW9vdGggb3V0cHV0IGdyb3VwICcke3RoaXMuX25hbWV9JyBoYXMgbXVsdGlwbGUgb3V0cHV0cyBzaGFyaW5nIG9uZSBkZXN0aW5hdGlvbjtgXG4gICAgICAgICAgICArIGAgb3V0cHV0ICcke2RlZi5vdXRwdXROYW1lfScgbXVzdCBzZXQgYSB1bmlxdWUgJ25hbWVNb2RpZmllcicuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWVuTW9kaWZpZXJzLmhhcyhkZWYubmFtZU1vZGlmaWVyKSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIGxpdGBNc1Ntb290aE5hbWVNb2RpZmllckNvbGxpc2lvbmAsXG4gICAgICAgICAgICBgTVMgU21vb3RoIG91dHB1dCBncm91cCAnJHt0aGlzLl9uYW1lfScgaGFzIG1vcmUgdGhhbiBvbmUgb3V0cHV0IHdpdGggbmFtZU1vZGlmaWVyYFxuICAgICAgICAgICAgKyBgICcke2RlZi5uYW1lTW9kaWZpZXJ9JzsgZWFjaCBvdXRwdXQncyBuYW1lTW9kaWZpZXIgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBncm91cC5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgc2Vlbk1vZGlmaWVycy5hZGQoZGVmLm5hbWVNb2RpZmllcik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIF9jcmVhdGVJbml0aWFsT3V0cHV0cygpOiBPdXRwdXRbXSB7XG4gICAgcmV0dXJuICh0aGlzLnByb3BzLm91dHB1dHMgPz8gW10pLm1hcChkZWYgPT4gbmV3IE1zU21vb3RoT3V0cHV0KGRlZikpO1xuICB9XG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLk91dHB1dEdyb3VwU2V0dGluZ3NQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1zU21vb3RoR3JvdXBTZXR0aW5nczoge1xuICAgICAgICBkZXN0aW5hdGlvbjogeyBkZXN0aW5hdGlvblJlZklkOiB0b0Rlc3RpbmF0aW9uSWQodGhpcy5wcm9wcy5uYW1lKSB9LFxuICAgICAgICBhY3F1aXNpdGlvblBvaW50SWQ6IHRoaXMucHJvcHMuYWNxdWlzaXRpb25Qb2ludElkLFxuICAgICAgICBhdWRpb09ubHlUaW1lY29kZUNvbnRyb2w6IHRoaXMucHJvcHMuYXVkaW9Pbmx5VGltZWNvZGVDb250cm9sPy52YWx1ZSxcbiAgICAgICAgY2VydGlmaWNhdGVNb2RlOiB0aGlzLnByb3BzLmNlcnRpZmljYXRlTW9kZT8udmFsdWUsXG4gICAgICAgIGNvbm5lY3Rpb25SZXRyeUludGVydmFsOiB0aGlzLnByb3BzLmNvbm5lY3Rpb25SZXRyeUludGVydmFsPy50b1NlY29uZHMoKSxcbiAgICAgICAgZXZlbnRJZDogdGhpcy5wcm9wcy5ldmVudElkLFxuICAgICAgICBldmVudElkTW9kZTogdGhpcy5wcm9wcy5ldmVudElkTW9kZT8udmFsdWUsXG4gICAgICAgIGV2ZW50U3RvcEJlaGF2aW9yOiB0aGlzLnByb3BzLmV2ZW50U3RvcEJlaGF2aW9yPy52YWx1ZSxcbiAgICAgICAgZmlsZWNhY2hlRHVyYXRpb246IHRoaXMucHJvcHMuZmlsZWNhY2hlRHVyYXRpb24/LnRvU2Vjb25kcygpLFxuICAgICAgICBmcmFnbWVudExlbmd0aDogdGhpcy5wcm9wcy5mcmFnbWVudExlbmd0aD8udG9TZWNvbmRzKCksXG4gICAgICAgIGlucHV0TG9zc0FjdGlvbjogdGhpcy5wcm9wcy5pbnB1dExvc3NBY3Rpb24/LnZhbHVlLFxuICAgICAgICBudW1SZXRyaWVzOiB0aGlzLnByb3BzLm51bVJldHJpZXMgPz8gMTAsXG4gICAgICAgIHJlc3RhcnREZWxheTogdGhpcy5wcm9wcy5yZXN0YXJ0RGVsYXk/LnRvU2Vjb25kcygpID8/IDEsXG4gICAgICAgIHNlZ21lbnRhdGlvbk1vZGU6IHRoaXMucHJvcHMuc2VnbWVudGF0aW9uTW9kZT8udmFsdWUsXG4gICAgICAgIHNlbmREZWxheU1zOiB0aGlzLnByb3BzLnNlbmREZWxheU1zLFxuICAgICAgICBzcGFyc2VUcmFja1R5cGU6IHRoaXMucHJvcHMuc3BhcnNlVHJhY2tUeXBlPy52YWx1ZSxcbiAgICAgICAgc3RyZWFtTWFuaWZlc3RCZWhhdmlvcjogdGhpcy5wcm9wcy5zdHJlYW1NYW5pZmVzdEJlaGF2aW9yPy52YWx1ZSxcbiAgICAgICAgdGltZXN0YW1wT2Zmc2V0OiB0aGlzLnByb3BzLnRpbWVzdGFtcE9mZnNldCxcbiAgICAgICAgdGltZXN0YW1wT2Zmc2V0TW9kZTogdGhpcy5wcm9wcy50aW1lc3RhbXBPZmZzZXRNb2RlPy52YWx1ZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgX2JpbmREZXN0aW5hdGlvbihfY2hhbm5lbENsYXNzOiBzdHJpbmcpOiBDZm5DaGFubmVsLk91dHB1dERlc3RpbmF0aW9uUHJvcGVydHlbXSB7XG4gICAgdmFsaWRhdGVEZXN0aW5hdGlvbkNvdW50KHRoaXMuX25hbWUsIF9jaGFubmVsQ2xhc3MsIHRoaXMucHJvcHMuZGVzdGluYXRpb25zLmxlbmd0aCwgMCwgZmFsc2UpO1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5wcm9wcy5kZXN0aW5hdGlvbnMubWFwKGQgPT4gZC5fYmluZCgpKTtcbiAgICByZXR1cm4gW3sgaWQ6IHRvRGVzdGluYXRpb25JZCh0aGlzLnByb3BzLm5hbWUpLCBzZXR0aW5ncyB9XTtcbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGUgX2dyYW50UGVybWlzc2lvbnMocm9sZTogSVJvbGUpOiB2b2lkIHtcbiAgICB0aGlzLnByb3BzLmRlc3RpbmF0aW9ucy5mb3JFYWNoKGQgPT4gZC5fZ3JhbnRQZXJtaXNzaW9ucyhyb2xlKSk7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE91dHB1dEdyb3VwIChvcmNoZXN0cmF0ZXMgb3V0cHV0cyB3aXRoaW4gYSBncm91cClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQW4gb3V0cHV0IGdyb3VwIHdpdGhpbiBhIE1lZGlhTGl2ZSBjaGFubmVsLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgT3V0cHV0R3JvdXAge1xuICBwcml2YXRlIHJlYWRvbmx5IG91dHB1dHM6IE91dHB1dFtdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb25maWc6IE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbikge1xuICAgIHRoaXMub3V0cHV0cy5wdXNoKC4uLmNvbmZpZy5fY3JlYXRlSW5pdGlhbE91dHB1dHMoKSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLk91dHB1dEdyb3VwUHJvcGVydHkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0aGlzLmNvbmZpZy5fbmFtZSxcbiAgICAgIG91dHB1dEdyb3VwU2V0dGluZ3M6IHRoaXMuY29uZmlnLl9iaW5kKCksXG4gICAgICBvdXRwdXRzOiB0aGlzLm91dHB1dHMubWFwKG8gPT4gby5fYmluZCgpKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2JpbmREZXN0aW5hdGlvbihjaGFubmVsQ2xhc3M6IHN0cmluZyk6IENmbkNoYW5uZWwuT3V0cHV0RGVzdGluYXRpb25Qcm9wZXJ0eVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuX2JpbmREZXN0aW5hdGlvbihjaGFubmVsQ2xhc3MpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2NvbGxlY3RFbmNvZGVzKCk6IEVuY29kZUNvbmZpZ3VyYXRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMub3V0cHV0cy5mbGF0TWFwKG8gPT4gby5fZ2V0RW5jb2RlcygpKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgLSBQcm9wYWdhdGUgZXBvY2gtbG9ja2luZyBzdGF0ZSB0byB0aGUgdW5kZXJseWluZyBjb25maWcuICovXG4gIHB1YmxpYyBfc2V0RXBvY2hMb2NraW5nKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLl9zZXRFcG9jaExvY2tpbmcoYWN0aXZlKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgLSBXaGV0aGVyIHRoZSB1bmRlcmx5aW5nIGNvbmZpZyBleHBsaWNpdGx5IHJlcXVlc3RzIGFuIGluY29tcGF0aWJsZSBTWVNURU1fQ0xPQ0suICovXG4gIHB1YmxpYyBfaGFzRXhwbGljaXRTeXN0ZW1DbG9jaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuX2hhc0V4cGxpY2l0U3lzdGVtQ2xvY2soKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlUmVmKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuX2dyYW50UGVybWlzc2lvbnMocm9sZSk7XG4gICAgLy8gR3JhbnQgcmVhZCBhY2Nlc3MgdG8gYW55IGV4dGVybmFsIGZpbGVzIHJlZmVyZW5jZWQgYnkgdGhlIG91dHB1dHMgKGJ1cm4taW4gY2FwdGlvbiBmb250cyxcbiAgICAvLyBhdWRpby1vbmx5IGNvdmVyLWFydCBpbWFnZXMpIHNvdXJjZWQgZnJvbSBTMyBidWNrZXRzLlxuICAgIHRoaXMub3V0cHV0cy5mb3JFYWNoKG8gPT4gby5fZ3JhbnRQZXJtaXNzaW9ucyhyb2xlKSk7XG4gIH1cbn1cbiJdfQ==
|