@aws-cdk/aws-mediaconnect-alpha 2.263.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.
@@ -0,0 +1,415 @@
1
+ "use strict";
2
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
3
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
4
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
5
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
6
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
7
+ var _, done = false;
8
+ for (var i = decorators.length - 1; i >= 0; i--) {
9
+ var context = {};
10
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
11
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
12
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
13
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
14
+ if (kind === "accessor") {
15
+ if (result === void 0) continue;
16
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
17
+ if (_ = accept(result.get)) descriptor.get = _;
18
+ if (_ = accept(result.set)) descriptor.set = _;
19
+ if (_ = accept(result.init)) initializers.unshift(_);
20
+ }
21
+ else if (_ = accept(result)) {
22
+ if (kind === "field") initializers.unshift(_);
23
+ else descriptor[key] = _;
24
+ }
25
+ }
26
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
27
+ done = true;
28
+ };
29
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
30
+ var useValue = arguments.length > 2;
31
+ for (var i = 0; i < initializers.length; i++) {
32
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
33
+ }
34
+ return useValue ? value : void 0;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.FlowOutput = exports.OutputConfiguration = void 0;
38
+ const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
39
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
40
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
41
+ const aws_mediaconnect_1 = require("aws-cdk-lib/aws-mediaconnect");
42
+ const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
43
+ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
44
+ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
45
+ const shared_1 = require("./shared");
46
+ /**
47
+ * Flow output protocol options.
48
+ */
49
+ var FlowOutputProtocol;
50
+ (function (FlowOutputProtocol) {
51
+ /**
52
+ * ZIXI_PUSH option
53
+ */
54
+ FlowOutputProtocol["ZIXI_PUSH"] = "zixi-push";
55
+ /**
56
+ * RTP_FEC option
57
+ */
58
+ FlowOutputProtocol["RTP_FEC"] = "rtp-fec";
59
+ /**
60
+ * RTP option
61
+ */
62
+ FlowOutputProtocol["RTP"] = "rtp";
63
+ /**
64
+ * ZIXI_PULL option
65
+ */
66
+ FlowOutputProtocol["ZIXI_PULL"] = "zixi-pull";
67
+ /**
68
+ * RIST option
69
+ */
70
+ FlowOutputProtocol["RIST"] = "rist";
71
+ /**
72
+ * SRT_LISTENER option
73
+ */
74
+ FlowOutputProtocol["SRT_LISTENER"] = "srt-listener";
75
+ /**
76
+ * SRT_CALLER option
77
+ */
78
+ FlowOutputProtocol["SRT_CALLER"] = "srt-caller";
79
+ /**
80
+ * NDI option
81
+ */
82
+ FlowOutputProtocol["NDI"] = "ndi-speed-hq";
83
+ })(FlowOutputProtocol || (FlowOutputProtocol = {}));
84
+ /**
85
+ * Configuration options to define a FlowOutput by protocol.
86
+ */
87
+ class OutputConfiguration {
88
+ _output;
89
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.OutputConfiguration", version: "2.263.0-alpha.0" };
90
+ /**
91
+ * The source configuration for flows receiving a stream from router.
92
+ */
93
+ static router(input) {
94
+ try {
95
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_RouterTransitConfig(input);
96
+ }
97
+ catch (error) {
98
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
99
+ Error.captureStackTrace(error, this.router);
100
+ }
101
+ throw error;
102
+ }
103
+ return new OutputConfiguration({
104
+ routerIntegrationState: shared_1.State.ENABLED,
105
+ routerIntegrationTransitEncryption: input?.encryption,
106
+ });
107
+ }
108
+ /**
109
+ * Option for RTP configuration
110
+ */
111
+ static rtp(input) {
112
+ try {
113
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_RtpOutputConfig(input);
114
+ }
115
+ catch (error) {
116
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
117
+ Error.captureStackTrace(error, this.rtp);
118
+ }
119
+ throw error;
120
+ }
121
+ return new OutputConfiguration({
122
+ protocol: FlowOutputProtocol.RTP,
123
+ destination: input.destination,
124
+ port: input.port,
125
+ smoothingLatency: input.smoothingLatency?.toMilliseconds(),
126
+ vpcInterfaceAttachment: parseVpcInterfaceAttachment(input.vpcInterfaceAttachment),
127
+ });
128
+ }
129
+ /**
130
+ * Option for RTP-FEC configuration
131
+ */
132
+ static rtpFec(input) {
133
+ try {
134
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_RtpFecOutputConfig(input);
135
+ }
136
+ catch (error) {
137
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
138
+ Error.captureStackTrace(error, this.rtpFec);
139
+ }
140
+ throw error;
141
+ }
142
+ return new OutputConfiguration({
143
+ protocol: FlowOutputProtocol.RTP_FEC,
144
+ destination: input.destination,
145
+ port: input.port,
146
+ smoothingLatency: input.smoothingLatency?.toMilliseconds(),
147
+ vpcInterfaceAttachment: parseVpcInterfaceAttachment(input.vpcInterfaceAttachment),
148
+ });
149
+ }
150
+ /**
151
+ * Option for RIST configuration
152
+ */
153
+ static rist(input) {
154
+ try {
155
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_RistOutputConfig(input);
156
+ }
157
+ catch (error) {
158
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
159
+ Error.captureStackTrace(error, this.rist);
160
+ }
161
+ throw error;
162
+ }
163
+ return new OutputConfiguration({
164
+ protocol: FlowOutputProtocol.RIST,
165
+ destination: input.destination,
166
+ port: input.port,
167
+ smoothingLatency: input.smoothingLatency?.toMilliseconds(),
168
+ vpcInterfaceAttachment: parseVpcInterfaceAttachment(input.vpcInterfaceAttachment),
169
+ });
170
+ }
171
+ /**
172
+ * Option for Zixi Push configuration
173
+ */
174
+ static zixiPush(input) {
175
+ try {
176
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_ZixiPushOutputConfig(input);
177
+ }
178
+ catch (error) {
179
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
180
+ Error.captureStackTrace(error, this.zixiPush);
181
+ }
182
+ throw error;
183
+ }
184
+ return new OutputConfiguration({
185
+ protocol: FlowOutputProtocol.ZIXI_PUSH,
186
+ destination: input.destination,
187
+ port: input.port,
188
+ streamId: input.streamId,
189
+ maxLatency: input.maxLatency.toMilliseconds(),
190
+ cidrAllowList: input.cidrAllowList,
191
+ staticKeyEncryption: input.encryption,
192
+ vpcInterfaceAttachment: parseVpcInterfaceAttachment(input.vpcInterfaceAttachment),
193
+ });
194
+ }
195
+ /**
196
+ * Option for Zixi Pull configuration
197
+ */
198
+ static zixiPull(input) {
199
+ try {
200
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_ZixiPullOutputConfig(input);
201
+ }
202
+ catch (error) {
203
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
204
+ Error.captureStackTrace(error, this.zixiPull);
205
+ }
206
+ throw error;
207
+ }
208
+ return new OutputConfiguration({
209
+ protocol: FlowOutputProtocol.ZIXI_PULL,
210
+ streamId: input.streamId,
211
+ remoteId: input.remoteId,
212
+ maxLatency: input.maxLatency.toMilliseconds(),
213
+ cidrAllowList: input.cidrAllowList,
214
+ staticKeyEncryption: input.encryption,
215
+ vpcInterfaceAttachment: parseVpcInterfaceAttachment(input.vpcInterfaceAttachment),
216
+ });
217
+ }
218
+ /**
219
+ * Option for SRT Caller configuration
220
+ */
221
+ static srtCaller(input) {
222
+ try {
223
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_SrtCallerOutputConfig(input);
224
+ }
225
+ catch (error) {
226
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
227
+ Error.captureStackTrace(error, this.srtCaller);
228
+ }
229
+ throw error;
230
+ }
231
+ return new OutputConfiguration({
232
+ protocol: FlowOutputProtocol.SRT_CALLER,
233
+ destination: input.destination,
234
+ port: input.port,
235
+ minLatency: input.minLatency?.toMilliseconds(),
236
+ streamId: input.streamId,
237
+ srtPasswordEncryption: input.encryption,
238
+ vpcInterfaceAttachment: parseVpcInterfaceAttachment(input.vpcInterfaceAttachment),
239
+ });
240
+ }
241
+ /**
242
+ * Option for SRT Listener configuration
243
+ */
244
+ static srtListener(input) {
245
+ try {
246
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_SrtListenerOutputConfig(input);
247
+ }
248
+ catch (error) {
249
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
250
+ Error.captureStackTrace(error, this.srtListener);
251
+ }
252
+ throw error;
253
+ }
254
+ return new OutputConfiguration({
255
+ protocol: FlowOutputProtocol.SRT_LISTENER,
256
+ port: input.port,
257
+ minLatency: input.minLatency?.toMilliseconds(),
258
+ cidrAllowList: input.cidrAllowList,
259
+ srtPasswordEncryption: input.encryption,
260
+ vpcInterfaceAttachment: parseVpcInterfaceAttachment(input.vpcInterfaceAttachment),
261
+ });
262
+ }
263
+ /**
264
+ * Option for NDI configuration
265
+ */
266
+ static ndi(input = {}) {
267
+ try {
268
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_NdiOutputConfig(input);
269
+ }
270
+ catch (error) {
271
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
272
+ Error.captureStackTrace(error, this.ndi);
273
+ }
274
+ throw error;
275
+ }
276
+ if (input.ndiSpeedHqQuality !== undefined
277
+ && !aws_cdk_lib_1.Token.isUnresolved(input.ndiSpeedHqQuality)
278
+ && (input.ndiSpeedHqQuality < 100 || input.ndiSpeedHqQuality > 200)) {
279
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `NdiSpeedHqQualityRange`, `NDI Speed HQ quality must be between 100 and 200, got ${input.ndiSpeedHqQuality}`);
280
+ }
281
+ return new OutputConfiguration({
282
+ protocol: FlowOutputProtocol.NDI,
283
+ ndiProgramName: input.ndiProgramName,
284
+ ndiSpeedHqQuality: input.ndiSpeedHqQuality,
285
+ });
286
+ }
287
+ /**
288
+ * @param output - Configuration for outputs in output
289
+ */
290
+ constructor(_output) {
291
+ this._output = _output;
292
+ }
293
+ /**
294
+ * Called when the output configuration is bound to a FlowOutput.
295
+ * @internal
296
+ */
297
+ _bind() {
298
+ return { ...this._output };
299
+ }
300
+ }
301
+ exports.OutputConfiguration = OutputConfiguration;
302
+ /**
303
+ * Shared base for both real and imported flow outputs.
304
+ * @internal
305
+ */
306
+ class FlowOutputBase extends aws_cdk_lib_1.Resource {
307
+ get flowOutputRef() {
308
+ return { outputArn: this.flowOutputArn };
309
+ }
310
+ }
311
+ /**
312
+ * Resource defines the destination address, protocol, and port that
313
+ * AWS Elemental MediaConnect sends the ingested video to.
314
+ */
315
+ let FlowOutput = (() => {
316
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
317
+ let _classDescriptor;
318
+ let _classExtraInitializers = [];
319
+ let _classThis;
320
+ let _classSuper = FlowOutputBase;
321
+ var FlowOutput = class extends _classSuper {
322
+ static { _classThis = this; }
323
+ static {
324
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
325
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
326
+ FlowOutput = _classThis = _classDescriptor.value;
327
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
328
+ }
329
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.FlowOutput", version: "2.263.0-alpha.0" };
330
+ /** Uniquely identifies this class. */
331
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-mediaconnect-alpha.FlowOutput';
332
+ /**
333
+ * Creates a Flow Ouput construct that represents an external (imported) Flow Output.
334
+ */
335
+ static fromFlowOutputArn(scope, id, flowOutputArn) {
336
+ class Import extends FlowOutputBase {
337
+ flowOutputArn = flowOutputArn;
338
+ }
339
+ return new Import(scope, id);
340
+ }
341
+ flowOutputArn;
342
+ constructor(scope, id, props) {
343
+ super(scope, id, {
344
+ physicalName: props?.flowOutputName ?? aws_cdk_lib_1.Lazy.string({ produce: () => aws_cdk_lib_1.Names.uniqueResourceName(this, { maxLength: 128 }) }),
345
+ });
346
+ try {
347
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_FlowOutputProps(props);
348
+ }
349
+ catch (error) {
350
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
351
+ Error.captureStackTrace(error, FlowOutput);
352
+ }
353
+ throw error;
354
+ }
355
+ // Validate flow output name if provided
356
+ if (props.flowOutputName != null && props.flowOutputName !== '' && !aws_cdk_lib_1.Token.isUnresolved(props.flowOutputName)) {
357
+ if (props.flowOutputName.length > 128) {
358
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `FlowOutputNameLength`, `Flow output name must be between 1 and 128 characters, got ${props.flowOutputName.length}`, this);
359
+ }
360
+ if (!/^[a-zA-Z0-9-]+$/.test(props.flowOutputName)) {
361
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `FlowOutputNameFormat`, `Flow output name must contain only alphanumeric characters and hyphens, got '${props.flowOutputName}'`, this);
362
+ }
363
+ }
364
+ // Enhanced CDK Analytics Telemetry
365
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
366
+ const outputConfig = props.output._bind();
367
+ // Warn on fully-open CIDR allow lists.
368
+ if (outputConfig.cidrAllowList !== undefined && !aws_cdk_lib_1.Token.isUnresolved(outputConfig.cidrAllowList)) {
369
+ for (const cidr of outputConfig.cidrAllowList) {
370
+ if (!aws_cdk_lib_1.Token.isUnresolved(cidr) && (0, shared_1.isOpenCidr)(cidr)) {
371
+ aws_cdk_lib_1.Annotations.of(this).addWarningV2('@aws-cdk/aws-mediaconnect-alpha:openOutputCidr', `Output CIDR allow list '${cidr}' allows pull requests from any IP. Restrict to the narrowest range your consumers need.`);
372
+ }
373
+ }
374
+ }
375
+ const { staticKeyEncryption, srtPasswordEncryption, routerIntegrationTransitEncryption, ...cfnOutputConfig } = outputConfig;
376
+ const resource = new aws_mediaconnect_1.CfnFlowOutput(this, 'Resource', {
377
+ ...cfnOutputConfig,
378
+ encryption: renderOutputEncryption(this, staticKeyEncryption, srtPasswordEncryption, props.flow.flowArn),
379
+ name: this.physicalName,
380
+ flowArn: props.flow.flowArn,
381
+ description: props.description,
382
+ outputStatus: props.outputStatus,
383
+ routerIntegrationTransitEncryption: outputConfig.routerIntegrationState === shared_1.State.ENABLED
384
+ ? (0, shared_1.renderTransitEncryption)(this, 'RouterTransitEncryptionRole', routerIntegrationTransitEncryption, props.flow.flowArn)
385
+ : undefined,
386
+ });
387
+ this.flowOutputArn = resource.attrOutputArn;
388
+ }
389
+ static {
390
+ __runInitializers(_classThis, _classExtraInitializers);
391
+ }
392
+ };
393
+ return FlowOutput = _classThis;
394
+ })();
395
+ exports.FlowOutput = FlowOutput;
396
+ /**
397
+ * Resolve the output's key-based encryption (either static-key or SRT-password) to its
398
+ * CFN shape. At most one of the two encryption fields is set on a given output.
399
+ */
400
+ function renderOutputEncryption(scope, staticKey, srtPassword, sourceArn) {
401
+ if (staticKey)
402
+ return (0, shared_1.renderStaticKeyEncryption)(scope, staticKey, sourceArn);
403
+ if (srtPassword)
404
+ return (0, shared_1.renderSrtPasswordEncryption)(scope, srtPassword, sourceArn);
405
+ return undefined;
406
+ }
407
+ /**
408
+ * Helper function to parse VPC interface attachment from L2 type to L1 property.
409
+ */
410
+ function parseVpcInterfaceAttachment(vpcInterface) {
411
+ if (!vpcInterface)
412
+ return undefined;
413
+ return { vpcInterfaceName: vpcInterface.name };
414
+ }
415
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvdy1vdXRwdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmbG93LW91dHB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSw2Q0FBa0g7QUFDbEgsbUVBQTZEO0FBRTdELDRFQUE0RDtBQUM1RCw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBSTFFLHFDQUE4SDtBQW9EOUg7O0dBRUc7QUFDSCxJQUFLLGtCQWlDSjtBQWpDRCxXQUFLLGtCQUFrQjtJQUNyQjs7T0FFRztJQUNILDZDQUFxQixDQUFBO0lBQ3JCOztPQUVHO0lBQ0gseUNBQWlCLENBQUE7SUFDakI7O09BRUc7SUFDSCxpQ0FBUyxDQUFBO0lBQ1Q7O09BRUc7SUFDSCw2Q0FBcUIsQ0FBQTtJQUNyQjs7T0FFRztJQUNILG1DQUFXLENBQUE7SUFDWDs7T0FFRztJQUNILG1EQUEyQixDQUFBO0lBQzNCOztPQUVHO0lBQ0gsK0NBQXVCLENBQUE7SUFDdkI7O09BRUc7SUFDSCwwQ0FBa0IsQ0FBQTtBQUNwQixDQUFDLEVBakNJLGtCQUFrQixLQUFsQixrQkFBa0IsUUFpQ3RCO0FBNlBEOztHQUVHO0FBQ0gsTUFBYSxtQkFBbUI7SUFxSU87O0lBcElyQzs7T0FFRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBMkI7Ozs7Ozs7Ozs7UUFDOUMsT0FBTyxJQUFJLG1CQUFtQixDQUFDO1lBQzdCLHNCQUFzQixFQUFFLGNBQUssQ0FBQyxPQUFPO1lBQ3JDLGtDQUFrQyxFQUFFLEtBQUssRUFBRSxVQUFVO1NBQ3RELENBQUMsQ0FBQztLQUNKO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQXNCOzs7Ozs7Ozs7O1FBQ3RDLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQztZQUM3QixRQUFRLEVBQUUsa0JBQWtCLENBQUMsR0FBRztZQUNoQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsSUFBSSxF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V0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ25GLE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsMkJBQTJCLENBQUMsWUFBaUM7SUFDcEUsSUFBSSxDQUFDLFlBQVk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IER1cmF0aW9uLCBJUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBBbm5vdGF0aW9ucywgTGF6eSwgTmFtZXMsIFJlc291cmNlLCBUb2tlbiwgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENmbkZsb3dPdXRwdXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbWVkaWFjb25uZWN0JztcbmltcG9ydCB0eXBlIHsgSUZsb3dPdXRwdXRSZWYsIEZsb3dPdXRwdXRSZWZlcmVuY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbWVkaWFjb25uZWN0JztcbmltcG9ydCB7IGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB0eXBlIHsgSUZsb3cgfSBmcm9tICcuL2Zsb3cnO1xuaW1wb3J0IHR5cGUgeyBTcnRQYXNzd29yZEVuY3J5cHRpb24sIFN0YXRpY0tleUVuY3J5cHRpb24sIFRyYW5zaXRFbmNyeXB0aW9uLCBWcGNJbnRlcmZhY2VDb25maWcgfSBmcm9tICcuL3NoYXJlZCc7XG5pbXBvcnQgeyBTdGF0ZSwgaXNPcGVuQ2lkciwgcmVuZGVyU3J0UGFzc3dvcmRFbmNyeXB0aW9uLCByZW5kZXJTdGF0aWNLZXlFbmNyeXB0aW9uLCByZW5kZXJUcmFuc2l0RW5jcnlwdGlvbiB9IGZyb20gJy4vc2hhcmVkJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIEZsb3cgT3V0cHV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUZsb3dPdXRwdXQgZXh0ZW5kcyBJUmVzb3VyY2UsIElGbG93T3V0cHV0UmVmIHtcbiAgLyoqXG4gICAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgZmxvdyBvdXRwdXQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGZsb3dPdXRwdXRBcm46IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBmbG93IG91dHB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dPdXRwdXRQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGF1dG8tZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSBmbG93T3V0cHV0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgb3V0cHV0LlxuICAgKlxuICAgKiBUaGlzIGRlc2NyaXB0aW9uIGFwcGVhcnMgb25seSBvbiB0aGUgTWVkaWFDb25uZWN0IGNvbnNvbGUgYW5kIHdpbGwgbm90IGJlIHNlZW4gYnkgdGhlIGVuZCB1c2VyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBvdXRwdXQgc2hvdWxkIHRyYW5zbWl0IGRhdGEgb3Igbm90LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZDsgd2hlbiBvbWl0dGVkLCBNZWRpYUNvbm5lY3QgZW5hYmxlcyB0aGUgb3V0cHV0IChFTkFCTEVEKSBhdCBkZXBsb3kgdGltZVxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0U3RhdHVzPzogU3RhdGU7XG5cbiAgLyoqXG4gICAqIFRoZSBmbG93IHRoaXMgb3V0cHV0IGlzIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgZmxvdzogSUZsb3c7XG5cbiAgLyoqXG4gICAqIE91dHB1dCBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ6IE91dHB1dENvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogRmxvdyBvdXRwdXQgcHJvdG9jb2wgb3B0aW9ucy5cbiAqL1xuZW51bSBGbG93T3V0cHV0UHJvdG9jb2wge1xuICAvKipcbiAgICogWklYSV9QVVNIIG9wdGlvblxuICAgKi9cbiAgWklYSV9QVVNIPSd6aXhpLXB1c2gnLFxuICAvKipcbiAgICogUlRQX0ZFQyBvcHRpb25cbiAgICovXG4gIFJUUF9GRUM9J3J0cC1mZWMnLFxuICAvKipcbiAgICogUlRQIG9wdGlvblxuICAgKi9cbiAgUlRQPSdydHAnLFxuICAvKipcbiAgICogWklYSV9QVUxMIG9wdGlvblxuICAgKi9cbiAgWklYSV9QVUxMPSd6aXhpLXB1bGwnLFxuICAvKipcbiAgICogUklTVCBvcHRpb25cbiAgICovXG4gIFJJU1Q9J3Jpc3QnLFxuICAvKipcbiAgICogU1JUX0xJU1RFTkVSIG9wdGlvblxuICAgKi9cbiAgU1JUX0xJU1RFTkVSPSdzcnQtbGlzdGVuZXInLFxuICAvKipcbiAgICogU1JUX0NBTExFUiBvcHRpb25cbiAgICovXG4gIFNSVF9DQUxMRVI9J3NydC1jYWxsZXInLFxuICAvKipcbiAgICogTkRJIG9wdGlvblxuICAgKi9cbiAgTkRJPSduZGktc3BlZWQtaHEnLFxufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgUlRQIG91dHB1dHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnRwT3V0cHV0Q29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBzbW9vdGhpbmcgbGF0ZW5jeSBmb3IgUklTVCwgUlRQLCBhbmQgUlRQLUZFQyBzdHJlYW1zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHNtb290aGluZyBsYXRlbmN5XG4gICAqL1xuICByZWFkb25seSBzbW9vdGhpbmdMYXRlbmN5PzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgSVAgYWRkcmVzcyB3aGVyZSB5b3Ugd2FudCB0byBzZW5kIHRoZSBvdXRwdXQuXG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBvcnQgdG8gdXNlIHdoZW4gY29udGVudCBpcyBkaXN0cmlidXRlZCB0byB0aGlzIG91dHB1dC5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBWUEMgaW50ZXJmYWNlIGF0dGFjaG1lbnQgdG8gdXNlIGZvciB0aGlzIG91dHB1dC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBWUEMgaW50ZXJmYWNlIGF0dGFjaG1lbnRcbiAgICovXG4gIHJlYWRvbmx5IHZwY0ludGVyZmFjZUF0dGFjaG1lbnQ/OiBWcGNJbnRlcmZhY2VDb25maWc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBSVFAtRkVDIG91dHB1dHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnRwRmVjT3V0cHV0Q29uZmlnIGV4dGVuZHMgUnRwT3V0cHV0Q29uZmlnIHsgfVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIFJJU1Qgb3V0cHV0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXN0T3V0cHV0Q29uZmlnIGV4dGVuZHMgUnRwT3V0cHV0Q29uZmlnIHsgfVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgWml4aSBQdWxsIG91dHB1dHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgWml4aVB1bGxPdXRwdXRDb25maWcge1xuICAvKipcbiAgICogVGhlIHN0cmVhbSBJRCB0aGF0IHlvdSB3YW50IHRvIHVzZSBmb3IgdGhpcyB0cmFuc3BvcnQuXG4gICAqL1xuICByZWFkb25seSBzdHJlYW1JZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJlbW90ZSBJRCBmb3IgdGhlIFppeGktcHVsbCBzdHJlYW0uXG4gICAqL1xuICByZWFkb25seSByZW1vdGVJZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbGF0ZW5jeSBmb3IgWml4aS1iYXNlZCBzdHJlYW1zLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4TGF0ZW5jeTogRHVyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgcmFuZ2Ugb2YgSVAgYWRkcmVzc2VzIHRoYXQgc2hvdWxkIGJlIGFsbG93ZWQgdG8gaW5pdGlhdGUgb3V0cHV0IHJlcXVlc3RzIHRvIHRoaXMgZmxvdy5cbiAgICogVGhlc2UgSVAgYWRkcmVzc2VzIHNob3VsZCBiZSBpbiB0aGUgZm9ybSBvZiBhIENsYXNzbGVzcyBJbnRlci1Eb21haW4gUm91dGluZyAoQ0lEUikgYmxvY2s7IGZvciBleGFtcGxlLCAxMC4wLjAuMC8xNi5cbiAgICpcbiAgICogUmVxdWlyZWQgYnkgdGhlIE1lZGlhQ29ubmVjdCBzZXJ2aWNlIGZvciBaaXhpIFB1bGwgb3V0cHV0cy5cbiAgICovXG4gIHJlYWRvbmx5IGNpZHJBbGxvd0xpc3Q6IHN0cmluZ1tdO1xuICAvKipcbiAgICogU3RhdGljIGtleSBlbmNyeXB0aW9uIGZvciB0aGlzIG91dHB1dC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uPzogU3RhdGljS2V5RW5jcnlwdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBWUEMgaW50ZXJmYWNlIGF0dGFjaG1lbnQgdG8gdXNlIGZvciB0aGlzIG91dHB1dC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBWUEMgaW50ZXJmYWNlIGF0dGFjaG1lbnRcbiAgICovXG4gIHJlYWRvbmx5IHZwY0ludGVyZmFjZUF0dGFjaG1lbnQ/OiBWcGNJbnRlcmZhY2VDb25maWc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBaaXhpIFB1c2ggb3V0cHV0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBaaXhpUHVzaE91dHB1dENvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgc3RyZWFtIElEIHRoYXQgeW91IHdhbnQgdG8gdXNlIGZvciB0aGlzIHRyYW5zcG9ydC5cbiAgICovXG4gIHJlYWRvbmx5IHN0cmVhbUlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBsYXRlbmN5IGZvciBaaXhpLWJhc2VkIHN0cmVhbXMuXG4gICAqL1xuICByZWFkb25seSBtYXhMYXRlbmN5OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSByYW5nZSBvZiBJUCBhZGRyZXNzZXMgdGhhdCBzaG91bGQgYmUgYWxsb3dlZCB0byBpbml0aWF0ZSBvdXRwdXQgcmVxdWVzdHMgdG8gdGhpcyBmbG93LlxuICAgKiBUaGVzZSBJUCBhZGRyZXNzZXMgc2hvdWxkIGJlIGluIHRoZSBmb3JtIG9mIGEgQ2xhc3NsZXNzIEludGVyLURvbWFpbiBSb3V0aW5nIChDSURSKSBibG9jazsgZm9yIGV4YW1wbGUsIDEwLjAuMC4wLzE2LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIENJRFIgYWxsb3cgbGlzdFxuICAgKi9cbiAgcmVhZG9ubHkgY2lkckFsbG93TGlzdD86IHN0cmluZ1tdO1xuICAvKipcbiAgICogU3RhdGljIGtleSBlbmNyeXB0aW9uIGZvciB0aGlzIG91dHB1dC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uPzogU3RhdGljS2V5RW5jcnlwdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBJUCBhZGRyZXNzIHdoZXJlIHlvdSB3YW50IHRvIHNlbmQgdGhlIG91dHB1dC5cbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcG9ydCB0byB1c2Ugd2hlbiBjb250ZW50IGlzIGRpc3RyaWJ1dGVkIHRvIHRoaXMgb3V0cHV0LlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIFZQQyBpbnRlcmZhY2UgYXR0YWNobWVudCB0byB1c2UgZm9yIHRoaXMgb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIFZQQyBpbnRlcmZhY2UgYXR0YWNobWVudFxuICAgKi9cbiAgcmVhZG9ubHkgdnBjSW50ZXJmYWNlQXR0YWNobWVudD86IFZwY0ludGVyZmFjZUNvbmZpZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIFNSVCBDYWxsZXIgb3V0cHV0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcnRDYWxsZXJPdXRwdXRDb25maWcge1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMgZm9yIFNSVC1iYXNlZCBzdHJlYW1zLiBUaGUgdmFsdWUgeW91IHNldCBvbiB5b3VyXG4gICAqIE1lZGlhQ29ubmVjdCBvdXRwdXQgcmVwcmVzZW50cyB0aGUgbWluaW1hbCBwb3RlbnRpYWwgbGF0ZW5jeSBvZiB0aGF0IGNvbm5lY3Rpb24uIFRoZVxuICAgKiBsYXRlbmN5IG9mIHRoZSBzdHJlYW0gaXMgc2V0IHRvIHRoZSBoaWdoZXIgb2YgdGhlIHNlbmRlcidzIG1pbmltdW0gbGF0ZW5jeSBhbmQgdGhlXG4gICAqIHJlY2VpdmVyJ3MgbWluaW11bSBsYXRlbmN5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIG1pbmltdW0gbGF0ZW5jeVxuICAgKi9cbiAgcmVhZG9ubHkgbWluTGF0ZW5jeT86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIHN0cmVhbSBJRCB0aGF0IHlvdSB3YW50IHRvIHVzZSBmb3IgdGhpcyB0cmFuc3BvcnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gc3RyZWFtIElEXG4gICAqL1xuICByZWFkb25seSBzdHJlYW1JZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBJUCBhZGRyZXNzIHdoZXJlIHlvdSB3YW50IHRvIHNlbmQgdGhlIG91dHB1dC5cbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcG9ydCB0byB1c2Ugd2hlbiBjb250ZW50IGlzIGRpc3RyaWJ1dGVkIHRvIHRoaXMgb3V0cHV0LlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICAvKipcbiAgICogU1JUIHBhc3N3b3JkIGVuY3J5cHRpb24gZm9yIHRoaXMgb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGVuY3J5cHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb24/OiBTcnRQYXNzd29yZEVuY3J5cHRpb247XG4gIC8qKlxuICAgKiBUaGUgVlBDIGludGVyZmFjZSBhdHRhY2htZW50IHRvIHVzZSBmb3IgdGhpcyBvdXRwdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gVlBDIGludGVyZmFjZSBhdHRhY2htZW50XG4gICAqL1xuICByZWFkb25seSB2cGNJbnRlcmZhY2VBdHRhY2htZW50PzogVnBjSW50ZXJmYWNlQ29uZmlnO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgU1JUIExpc3RlbmVyIG91dHB1dHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3J0TGlzdGVuZXJPdXRwdXRDb25maWcge1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMgZm9yIFNSVC1iYXNlZCBzdHJlYW1zLiBUaGUgdmFsdWUgeW91IHNldCBvbiB5b3VyXG4gICAqIE1lZGlhQ29ubmVjdCBvdXRwdXQgcmVwcmVzZW50cyB0aGUgbWluaW1hbCBwb3RlbnRpYWwgbGF0ZW5jeSBvZiB0aGF0IGNvbm5lY3Rpb24uIFRoZVxuICAgKiBsYXRlbmN5IG9mIHRoZSBzdHJlYW0gaXMgc2V0IHRvIHRoZSBoaWdoZXIgb2YgdGhlIHNlbmRlcidzIG1pbmltdW0gbGF0ZW5jeSBhbmQgdGhlXG4gICAqIHJlY2VpdmVyJ3MgbWluaW11bSBsYXRlbmN5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIG1pbmltdW0gbGF0ZW5jeVxuICAgKi9cbiAgcmVhZG9ubHkgbWluTGF0ZW5jeT86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIHBvcnQgdG8gdXNlIHdoZW4gY29udGVudCBpcyBkaXN0cmlidXRlZCB0byB0aGlzIG91dHB1dC5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSByYW5nZSBvZiBJUCBhZGRyZXNzZXMgdGhhdCBzaG91bGQgYmUgYWxsb3dlZCB0byBpbml0aWF0ZSBvdXRwdXQgcmVxdWVzdHMgdG8gdGhpcyBmbG93LlxuICAgKiBUaGVzZSBJUCBhZGRyZXNzZXMgc2hvdWxkIGJlIGluIHRoZSBmb3JtIG9mIGEgQ2xhc3NsZXNzIEludGVyLURvbWFpbiBSb3V0aW5nIChDSURSKSBibG9jazsgZm9yIGV4YW1wbGUsIDEwLjAuMC4wLzE2LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIENJRFIgYWxsb3cgbGlzdFxuICAgKi9cbiAgcmVhZG9ubHkgY2lkckFsbG93TGlzdD86IHN0cmluZ1tdO1xuICAvKipcbiAgICogU1JUIHBhc3N3b3JkIGVuY3J5cHRpb24gZm9yIHRoaXMgb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGVuY3J5cHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb24/OiBTcnRQYXNzd29yZEVuY3J5cHRpb247XG4gIC8qKlxuICAgKiBUaGUgVlBDIGludGVyZmFjZSBhdHRhY2htZW50IHRvIHVzZSBmb3IgdGhpcyBvdXRwdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gVlBDIGludGVyZmFjZSBhdHRhY2htZW50XG4gICAqL1xuICByZWFkb25seSB2cGNJbnRlcmZhY2VBdHRhY2htZW50PzogVnBjSW50ZXJmYWNlQ29uZmlnO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgTkRJIG91dHB1dHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmRpT3V0cHV0Q29uZmlnIHtcbiAgLyoqXG4gICAqIEEgc3VmZml4IGZvciB0aGUgbmFtZXMgb2YgdGhlIE5ESSBzb3VyY2VzIHRoYXQgdGhlIGZsb3cgY3JlYXRlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgb3V0cHV0IG5hbWUgaXMgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgbmRpUHJvZ3JhbU5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBIHF1YWxpdHkgc2V0dGluZyBmb3IgdGhlIE5ESSBTcGVlZCBIUSBlbmNvZGVyLCBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlLlxuICAgKlxuICAgKiBWYWxpZCByYW5nZTogMTAwLTIwMC4gSGlnaGVyIHZhbHVlcyBwcm9kdWNlIGhpZ2hlciBxdWFsaXR5IGFuZCBsYXJnZXIgYml0cmF0ZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL2Fib3V0LWF3cy93aGF0cy1uZXcvMjAyNS8wMy9hd3MtZWxlbWVudGFsLW1lZGlhY29ubmVjdC1zdXBwb3J0LW5kaS1vdXRwdXRzL1xuICAgKiBAZGVmYXVsdCAtIHRoZSBNZWRpYUNvbm5lY3Qgc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBuZGlTcGVlZEhxUXVhbGl0eT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBmbG93IG91dHB1dCBjb25maWd1cmF0aW9uLiBDRk4tYm91bmQgZmllbGRzIHVzZSBMMSBwcm9wZXJ0eSB0eXBlczsgZW5jcnlwdGlvblxuICogZmllbGRzIGFyZSBrZXB0IGFzIEwyIGNsYXNzZXMgKHJlc29sdmVkIHRvIENGTiBzaGFwZSBpbiB0aGUgRmxvd091dHB1dCBjb25zdHJ1Y3RvcikuXG4gKiBAaW50ZXJuYWxcbiAqL1xuaW50ZXJmYWNlIEZsb3dPdXRwdXRDb25maWcge1xuICByZWFkb25seSBjaWRyQWxsb3dMaXN0Pzogc3RyaW5nW107XG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uPzogc3RyaW5nO1xuICAvKiogU3RhdGljLWtleSBlbmNyeXB0aW9uIGZvciBaaXhpIFB1bGwgb3V0cHV0cy4gU2V0IGF0IG1vc3Qgb25lIG9mIHRoZXNlIHR3byBmaWVsZHMuICovXG4gIHJlYWRvbmx5IHN0YXRpY0tleUVuY3J5cHRpb24/OiBTdGF0aWNLZXlFbmNyeXB0aW9uO1xuICAvKiogU1JULXBhc3N3b3JkIGVuY3J5cHRpb24gZm9yIFNSVCBvdXRwdXRzLiBTZXQgYXQgbW9zdCBvbmUgb2YgdGhlc2UgdHdvIGZpZWxkcy4gKi9cbiAgcmVhZG9ubHkgc3J0UGFzc3dvcmRFbmNyeXB0aW9uPzogU3J0UGFzc3dvcmRFbmNyeXB0aW9uO1xuICByZWFkb25seSBtYXhMYXRlbmN5PzogbnVtYmVyO1xuICByZWFkb25seSBtaW5MYXRlbmN5PzogbnVtYmVyO1xuICByZWFkb25seSBuZGlQcm9ncmFtTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgbmRpU3BlZWRIcVF1YWxpdHk/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHByb3RvY29sPzogc3RyaW5nO1xuICByZWFkb25seSByZW1vdGVJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgc21vb3RoaW5nTGF0ZW5jeT86IG51bWJlcjtcbiAgcmVhZG9ubHkgc3RyZWFtSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZwY0ludGVyZmFjZUF0dGFjaG1lbnQ/OiBDZm5GbG93T3V0cHV0LlZwY0ludGVyZmFjZUF0dGFjaG1lbnRQcm9wZXJ0eTtcbiAgcmVhZG9ubHkgcm91dGVySW50ZWdyYXRpb25TdGF0ZT86IFN0YXRlO1xuICByZWFkb25seSByb3V0ZXJJbnRlZ3JhdGlvblRyYW5zaXRFbmNyeXB0aW9uPzogVHJhbnNpdEVuY3J5cHRpb247XG59XG5cbi8qKlxuICogT3V0cHV0IGNvbmZpZ3VyYXRpb24gdG8gUm91dGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVyVHJhbnNpdENvbmZpZyB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciBlbmNyeXB0aW9uIGlzIHRvIGJlIHVzZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IG5vIGVuY3J5cHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb24/OiBUcmFuc2l0RW5jcnlwdGlvbjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gZGVmaW5lIGEgRmxvd091dHB1dCBieSBwcm90b2NvbC5cbiAqL1xuZXhwb3J0IGNsYXNzIE91dHB1dENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIHNvdXJjZSBjb25maWd1cmF0aW9uIGZvciBmbG93cyByZWNlaXZpbmcgYSBzdHJlYW0gZnJvbSByb3V0ZXIuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJvdXRlcihpbnB1dD86IFJvdXRlclRyYW5zaXRDb25maWcpOiBPdXRwdXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IE91dHB1dENvbmZpZ3VyYXRpb24oe1xuICAgICAgcm91dGVySW50ZWdyYXRpb25TdGF0ZTogU3RhdGUuRU5BQkxFRCxcbiAgICAgIHJvdXRlckludGVncmF0aW9uVHJhbnNpdEVuY3J5cHRpb246IGlucHV0Py5lbmNyeXB0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgUlRQIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcnRwKGlucHV0OiBSdHBPdXRwdXRDb25maWcpOiBPdXRwdXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IE91dHB1dENvbmZpZ3VyYXRpb24oe1xuICAgICAgcHJvdG9jb2w6IEZsb3dPdXRwdXRQcm90b2NvbC5SVFAsXG4gICAgICBkZXN0aW5hdGlvbjogaW5wdXQuZGVzdGluYXRpb24sXG4gICAgICBwb3J0OiBpbnB1dC5wb3J0LFxuICAgICAgc21vb3RoaW5nTGF0ZW5jeTogaW5wdXQuc21vb3RoaW5nTGF0ZW5jeT8udG9NaWxsaXNlY29uZHMoKSxcbiAgICAgIHZwY0ludGVyZmFjZUF0dGFjaG1lbnQ6IHBhcnNlVnBjSW50ZXJmYWNlQXR0YWNobWVudChpbnB1dC52cGNJbnRlcmZhY2VBdHRhY2htZW50KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIFJUUC1GRUMgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBydHBGZWMoaW5wdXQ6IFJ0cEZlY091dHB1dENvbmZpZyk6IE91dHB1dENvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgT3V0cHV0Q29uZmlndXJhdGlvbih7XG4gICAgICBwcm90b2NvbDogRmxvd091dHB1dFByb3RvY29sLlJUUF9GRUMsXG4gICAgICBkZXN0aW5hdGlvbjogaW5wdXQuZGVzdGluYXRpb24sXG4gICAgICBwb3J0OiBpbnB1dC5wb3J0LFxuICAgICAgc21vb3RoaW5nTGF0ZW5jeTogaW5wdXQuc21vb3RoaW5nTGF0ZW5jeT8udG9NaWxsaXNlY29uZHMoKSxcbiAgICAgIHZwY0ludGVyZmFjZUF0dGFjaG1lbnQ6IHBhcnNlVnBjSW50ZXJmYWNlQXR0YWNobWVudChpbnB1dC52cGNJbnRlcmZhY2VBdHRhY2htZW50KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIFJJU1QgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByaXN0KGlucHV0OiBSaXN0T3V0cHV0Q29uZmlnKTogT3V0cHV0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBPdXRwdXRDb25maWd1cmF0aW9uKHtcbiAgICAgIHByb3RvY29sOiBGbG93T3V0cHV0UHJvdG9jb2wuUklTVCxcbiAgICAgIGRlc3RpbmF0aW9uOiBpbnB1dC5kZXN0aW5hdGlvbixcbiAgICAgIHBvcnQ6IGlucHV0LnBvcnQsXG4gICAgICBzbW9vdGhpbmdMYXRlbmN5OiBpbnB1dC5zbW9vdGhpbmdMYXRlbmN5Py50b01pbGxpc2Vjb25kcygpLFxuICAgICAgdnBjSW50ZXJmYWNlQXR0YWNobWVudDogcGFyc2VWcGNJbnRlcmZhY2VBdHRhY2htZW50KGlucHV0LnZwY0ludGVyZmFjZUF0dGFjaG1lbnQpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgWml4aSBQdXNoIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgeml4aVB1c2goaW5wdXQ6IFppeGlQdXNoT3V0cHV0Q29uZmlnKTogT3V0cHV0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBPdXRwdXRDb25maWd1cmF0aW9uKHtcbiAgICAgIHByb3RvY29sOiBGbG93T3V0cHV0UHJvdG9jb2wuWklYSV9QVVNILFxuICAgICAgZGVzdGluYXRpb246IGlucHV0LmRlc3RpbmF0aW9uLFxuICAgICAgcG9ydDogaW5wdXQucG9ydCxcbiAgICAgIHN0cmVhbUlkOiBpbnB1dC5zdHJlYW1JZCxcbiAgICAgIG1heExhdGVuY3k6IGlucHV0Lm1heExhdGVuY3kudG9NaWxsaXNlY29uZHMoKSxcbiAgICAgIGNpZHJBbGxvd0xpc3Q6IGlucHV0LmNpZHJBbGxvd0xpc3QsXG4gICAgICBzdGF0aWNLZXlFbmNyeXB0aW9uOiBpbnB1dC5lbmNyeXB0aW9uLFxuICAgICAgdnBjSW50ZXJmYWNlQXR0YWNobWVudDogcGFyc2VWcGNJbnRlcmZhY2VBdHRhY2htZW50KGlucHV0LnZwY0ludGVyZmFjZUF0dGFjaG1lbnQpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgWml4aSBQdWxsIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgeml4aVB1bGwoaW5wdXQ6IFppeGlQdWxsT3V0cHV0Q29uZmlnKTogT3V0cHV0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBPdXRwdXRDb25maWd1cmF0aW9uKHtcbiAgICAgIHByb3RvY29sOiBGbG93T3V0cHV0UHJvdG9jb2wuWklYSV9QVUxMLFxuICAgICAgc3RyZWFtSWQ6IGlucHV0LnN0cmVhbUlkLFxuICAgICAgcmVtb3RlSWQ6IGlucHV0LnJlbW90ZUlkLFxuICAgICAgbWF4TGF0ZW5jeTogaW5wdXQubWF4TGF0ZW5jeS50b01pbGxpc2Vjb25kcygpLFxuICAgICAgY2lkckFsbG93TGlzdDogaW5wdXQuY2lkckFsbG93TGlzdCxcbiAgICAgIHN0YXRpY0tleUVuY3J5cHRpb246IGlucHV0LmVuY3J5cHRpb24sXG4gICAgICB2cGNJbnRlcmZhY2VBdHRhY2htZW50OiBwYXJzZVZwY0ludGVyZmFjZUF0dGFjaG1lbnQoaW5wdXQudnBjSW50ZXJmYWNlQXR0YWNobWVudCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3B0aW9uIGZvciBTUlQgQ2FsbGVyIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc3J0Q2FsbGVyKGlucHV0OiBTcnRDYWxsZXJPdXRwdXRDb25maWcpOiBPdXRwdXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IE91dHB1dENvbmZpZ3VyYXRpb24oe1xuICAgICAgcHJvdG9jb2w6IEZsb3dPdXRwdXRQcm90b2NvbC5TUlRfQ0FMTEVSLFxuICAgICAgZGVzdGluYXRpb246IGlucHV0LmRlc3RpbmF0aW9uLFxuICAgICAgcG9ydDogaW5wdXQucG9ydCxcbiAgICAgIG1pbkxhdGVuY3k6IGlucHV0Lm1pbkxhdGVuY3k/LnRvTWlsbGlzZWNvbmRzKCksXG4gICAgICBzdHJlYW1JZDogaW5wdXQuc3RyZWFtSWQsXG4gICAgICBzcnRQYXNzd29yZEVuY3J5cHRpb246IGlucHV0LmVuY3J5cHRpb24sXG4gICAgICB2cGNJbnRlcmZhY2VBdHRhY2htZW50OiBwYXJzZVZwY0ludGVyZmFjZUF0dGFjaG1lbnQoaW5wdXQudnBjSW50ZXJmYWNlQXR0YWNobWVudCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3B0aW9uIGZvciBTUlQgTGlzdGVuZXIgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzcnRMaXN0ZW5lcihpbnB1dDogU3J0TGlzdGVuZXJPdXRwdXRDb25maWcpOiBPdXRwdXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IE91dHB1dENvbmZpZ3VyYXRpb24oe1xuICAgICAgcHJvdG9jb2w6IEZsb3dPdXRwdXRQcm90b2NvbC5TUlRfTElTVEVORVIsXG4gICAgICBwb3J0OiBpbnB1dC5wb3J0LFxuICAgICAgbWluTGF0ZW5jeTogaW5wdXQubWluTGF0ZW5jeT8udG9NaWxsaXNlY29uZHMoKSxcbiAgICAgIGNpZHJBbGxvd0xpc3Q6IGlucHV0LmNpZHJBbGxvd0xpc3QsXG4gICAgICBzcnRQYXNzd29yZEVuY3J5cHRpb246IGlucHV0LmVuY3J5cHRpb24sXG4gICAgICB2cGNJbnRlcmZhY2VBdHRhY2htZW50OiBwYXJzZVZwY0ludGVyZmFjZUF0dGFjaG1lbnQoaW5wdXQudnBjSW50ZXJmYWNlQXR0YWNobWVudCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3B0aW9uIGZvciBOREkgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBuZGkoaW5wdXQ6IE5kaU91dHB1dENvbmZpZyA9IHt9KTogT3V0cHV0Q29uZmlndXJhdGlvbiB7XG4gICAgaWYgKGlucHV0Lm5kaVNwZWVkSHFRdWFsaXR5ICE9PSB1bmRlZmluZWRcbiAgICAgICYmICFUb2tlbi5pc1VucmVzb2x2ZWQoaW5wdXQubmRpU3BlZWRIcVF1YWxpdHkpXG4gICAgICAmJiAoaW5wdXQubmRpU3BlZWRIcVF1YWxpdHkgPCAxMDAgfHwgaW5wdXQubmRpU3BlZWRIcVF1YWxpdHkgPiAyMDApKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBOZGlTcGVlZEhxUXVhbGl0eVJhbmdlYCxcbiAgICAgICAgYE5ESSBTcGVlZCBIUSBxdWFsaXR5IG11c3QgYmUgYmV0d2VlbiAxMDAgYW5kIDIwMCwgZ290ICR7aW5wdXQubmRpU3BlZWRIcVF1YWxpdHl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBPdXRwdXRDb25maWd1cmF0aW9uKHtcbiAgICAgIHByb3RvY29sOiBGbG93T3V0cHV0UHJvdG9jb2wuTkRJLFxuICAgICAgbmRpUHJvZ3JhbU5hbWU6IGlucHV0Lm5kaVByb2dyYW1OYW1lLFxuICAgICAgbmRpU3BlZWRIcVF1YWxpdHk6IGlucHV0Lm5kaVNwZWVkSHFRdWFsaXR5LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBvdXRwdXQgLSBDb25maWd1cmF0aW9uIGZvciBvdXRwdXRzIGluIG91dHB1dFxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IF9vdXRwdXQ6IEZsb3dPdXRwdXRDb25maWcpIHsgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24gaXMgYm91bmQgdG8gYSBGbG93T3V0cHV0LlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfYmluZCgpOiBGbG93T3V0cHV0Q29uZmlnIHtcbiAgICByZXR1cm4geyAuLi50aGlzLl9vdXRwdXQgfTtcbiAgfVxufVxuXG4vKipcbiAqIFNoYXJlZCBiYXNlIGZvciBib3RoIHJlYWwgYW5kIGltcG9ydGVkIGZsb3cgb3V0cHV0cy5cbiAqIEBpbnRlcm5hbFxuICovXG5hYnN0cmFjdCBjbGFzcyBGbG93T3V0cHV0QmFzZSBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSUZsb3dPdXRwdXQge1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZmxvd091dHB1dEFybjogc3RyaW5nO1xuXG4gIHB1YmxpYyBnZXQgZmxvd091dHB1dFJlZigpOiBGbG93T3V0cHV0UmVmZXJlbmNlIHtcbiAgICByZXR1cm4geyBvdXRwdXRBcm46IHRoaXMuZmxvd091dHB1dEFybiB9O1xuICB9XG59XG5cbi8qKlxuICogUmVzb3VyY2UgZGVmaW5lcyB0aGUgZGVzdGluYXRpb24gYWRkcmVzcywgcHJvdG9jb2wsIGFuZCBwb3J0IHRoYXRcbiAqIEFXUyBFbGVtZW50YWwgTWVkaWFDb25uZWN0IHNlbmRzIHRoZSBpbmdlc3RlZCB2aWRlbyB0by5cbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIEZsb3dPdXRwdXQgZXh0ZW5kcyBGbG93T3V0cHV0QmFzZSB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLW1lZGlhY29ubmVjdC1hbHBoYS5GbG93T3V0cHV0JztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIEZsb3cgT3VwdXQgY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCAoaW1wb3J0ZWQpIEZsb3cgT3V0cHV0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRmxvd091dHB1dEFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBmbG93T3V0cHV0QXJuOiBzdHJpbmcpOiBJRmxvd091dHB1dCB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgRmxvd091dHB1dEJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGZsb3dPdXRwdXRBcm4gPSBmbG93T3V0cHV0QXJuO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgZmxvd091dHB1dEFybjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBGbG93T3V0cHV0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHM/LmZsb3dPdXRwdXROYW1lID8/IExhenkuc3RyaW5nKHsgcHJvZHVjZTogKCkgPT4gTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHsgbWF4TGVuZ3RoOiAxMjggfSkgfSksXG4gICAgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBmbG93IG91dHB1dCBuYW1lIGlmIHByb3ZpZGVkXG4gICAgaWYgKHByb3BzLmZsb3dPdXRwdXROYW1lICE9IG51bGwgJiYgcHJvcHMuZmxvd091dHB1dE5hbWUgIT09ICcnICYmICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuZmxvd091dHB1dE5hbWUpKSB7XG4gICAgICBpZiAocHJvcHMuZmxvd091dHB1dE5hbWUubGVuZ3RoID4gMTI4KSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YEZsb3dPdXRwdXROYW1lTGVuZ3RoYCwgYEZsb3cgb3V0cHV0IG5hbWUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEyOCBjaGFyYWN0ZXJzLCBnb3QgJHtwcm9wcy5mbG93T3V0cHV0TmFtZS5sZW5ndGh9YCwgdGhpcyk7XG4gICAgICB9XG4gICAgICBpZiAoIS9eW2EtekEtWjAtOS1dKyQvLnRlc3QocHJvcHMuZmxvd091dHB1dE5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YEZsb3dPdXRwdXROYW1lRm9ybWF0YCwgYEZsb3cgb3V0cHV0IG5hbWUgbXVzdCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIGh5cGhlbnMsIGdvdCAnJHtwcm9wcy5mbG93T3V0cHV0TmFtZX0nYCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICBjb25zdCBvdXRwdXRDb25maWcgPSBwcm9wcy5vdXRwdXQuX2JpbmQoKTtcblxuICAgIC8vIFdhcm4gb24gZnVsbHktb3BlbiBDSURSIGFsbG93IGxpc3RzLlxuICAgIGlmIChvdXRwdXRDb25maWcuY2lkckFsbG93TGlzdCAhPT0gdW5kZWZpbmVkICYmICFUb2tlbi5pc1VucmVzb2x2ZWQob3V0cHV0Q29uZmlnLmNpZHJBbGxvd0xpc3QpKSB7XG4gICAgICBmb3IgKGNvbnN0IGNpZHIgb2Ygb3V0cHV0Q29uZmlnLmNpZHJBbGxvd0xpc3QpIHtcbiAgICAgICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoY2lkcikgJiYgaXNPcGVuQ2lkcihjaWRyKSkge1xuICAgICAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMihcbiAgICAgICAgICAgICdAYXdzLWNkay9hd3MtbWVkaWFjb25uZWN0LWFscGhhOm9wZW5PdXRwdXRDaWRyJyxcbiAgICAgICAgICAgIGBPdXRwdXQgQ0lEUiBhbGxvdyBsaXN0ICcke2NpZHJ9JyBhbGxvd3MgcHVsbCByZXF1ZXN0cyBmcm9tIGFueSBJUC4gUmVzdHJpY3QgdG8gdGhlIG5hcnJvd2VzdCByYW5nZSB5b3VyIGNvbnN1bWVycyBuZWVkLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB7IHN0YXRpY0tleUVuY3J5cHRpb24sIHNydFBhc3N3b3JkRW5jcnlwdGlvbiwgcm91dGVySW50ZWdyYXRpb25UcmFuc2l0RW5jcnlwdGlvbiwgLi4uY2ZuT3V0cHV0Q29uZmlnIH0gPSBvdXRwdXRDb25maWc7XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IG5ldyBDZm5GbG93T3V0cHV0KHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIC4uLmNmbk91dHB1dENvbmZpZyxcbiAgICAgIGVuY3J5cHRpb246IHJlbmRlck91dHB1dEVuY3J5cHRpb24odGhpcywgc3RhdGljS2V5RW5jcnlwdGlvbiwgc3J0UGFzc3dvcmRFbmNyeXB0aW9uLCBwcm9wcy5mbG93LmZsb3dBcm4pLFxuICAgICAgbmFtZTogdGhpcy5waHlzaWNhbE5hbWUsXG4gICAgICBmbG93QXJuOiBwcm9wcy5mbG93LmZsb3dBcm4sXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBvdXRwdXRTdGF0dXM6IHByb3BzLm91dHB1dFN0YXR1cyxcbiAgICAgIHJvdXRlckludGVncmF0aW9uVHJhbnNpdEVuY3J5cHRpb246IG91dHB1dENvbmZpZy5yb3V0ZXJJbnRlZ3JhdGlvblN0YXRlID09PSBTdGF0ZS5FTkFCTEVEXG4gICAgICAgID8gcmVuZGVyVHJhbnNpdEVuY3J5cHRpb24odGhpcywgJ1JvdXRlclRyYW5zaXRFbmNyeXB0aW9uUm9sZScsIHJvdXRlckludGVncmF0aW9uVHJhbnNpdEVuY3J5cHRpb24sIHByb3BzLmZsb3cuZmxvd0FybilcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLmZsb3dPdXRwdXRBcm4gPSByZXNvdXJjZS5hdHRyT3V0cHV0QXJuO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgb3V0cHV0J3Mga2V5LWJhc2VkIGVuY3J5cHRpb24gKGVpdGhlciBzdGF0aWMta2V5IG9yIFNSVC1wYXNzd29yZCkgdG8gaXRzXG4gKiBDRk4gc2hhcGUuIEF0IG1vc3Qgb25lIG9mIHRoZSB0d28gZW5jcnlwdGlvbiBmaWVsZHMgaXMgc2V0IG9uIGEgZ2l2ZW4gb3V0cHV0LlxuICovXG5mdW5jdGlvbiByZW5kZXJPdXRwdXRFbmNyeXB0aW9uKFxuICBzY29wZTogQ29uc3RydWN0LFxuICBzdGF0aWNLZXk6IFN0YXRpY0tleUVuY3J5cHRpb24gfCB1bmRlZmluZWQsXG4gIHNydFBhc3N3b3JkOiBTcnRQYXNzd29yZEVuY3J5cHRpb24gfCB1bmRlZmluZWQsXG4gIHNvdXJjZUFybj86IHN0cmluZyxcbik6IENmbkZsb3dPdXRwdXQuRW5jcnlwdGlvblByb3BlcnR5IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHN0YXRpY0tleSkgcmV0dXJuIHJlbmRlclN0YXRpY0tleUVuY3J5cHRpb24oc2NvcGUsIHN0YXRpY0tleSwgc291cmNlQXJuKTtcbiAgaWYgKHNydFBhc3N3b3JkKSByZXR1cm4gcmVuZGVyU3J0UGFzc3dvcmRFbmNyeXB0aW9uKHNjb3BlLCBzcnRQYXNzd29yZCwgc291cmNlQXJuKTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gcGFyc2UgVlBDIGludGVyZmFjZSBhdHRhY2htZW50IGZyb20gTDIgdHlwZSB0byBMMSBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VWcGNJbnRlcmZhY2VBdHRhY2htZW50KHZwY0ludGVyZmFjZT86IFZwY0ludGVyZmFjZUNvbmZpZyk6IENmbkZsb3dPdXRwdXQuVnBjSW50ZXJmYWNlQXR0YWNobWVudFByb3BlcnR5IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2cGNJbnRlcmZhY2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7IHZwY0ludGVyZmFjZU5hbWU6IHZwY0ludGVyZmFjZS5uYW1lIH07XG59XG5cbiJdfQ==