@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
package/lib/input.js
ADDED
|
@@ -0,0 +1,803 @@
|
|
|
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.Input = exports.InputConfiguration = exports.MulticastProtocol = exports.SrtDecryptionAlgorithm = exports.InputSource = exports.InputType = exports.InputNetworkLocation = 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_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
42
|
+
const aws_medialive_1 = require("aws-cdk-lib/aws-medialive");
|
|
43
|
+
const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
|
|
44
|
+
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
|
|
45
|
+
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
|
|
46
|
+
const shared_1 = require("./shared");
|
|
47
|
+
/**
|
|
48
|
+
* The network location of a MediaLive input — the AWS cloud, or an on-premises network for
|
|
49
|
+
* MediaLive Anywhere.
|
|
50
|
+
*/
|
|
51
|
+
class InputNetworkLocation {
|
|
52
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.InputNetworkLocation", version: "2.268.0-alpha.0" };
|
|
53
|
+
/** The input exists in the AWS cloud (the default). */
|
|
54
|
+
static AWS = new InputNetworkLocation('AWS');
|
|
55
|
+
/** The input exists in an on-premises network (MediaLive Anywhere). */
|
|
56
|
+
static ON_PREMISES = new InputNetworkLocation('ON_PREMISES');
|
|
57
|
+
/** A value not yet modelled by AWS CDK. */
|
|
58
|
+
static of(value) {
|
|
59
|
+
return new InputNetworkLocation(value);
|
|
60
|
+
}
|
|
61
|
+
/** The underlying string value passed to CloudFormation. */
|
|
62
|
+
value;
|
|
63
|
+
constructor(value) {
|
|
64
|
+
this.value = value;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.InputNetworkLocation = InputNetworkLocation;
|
|
68
|
+
/**
|
|
69
|
+
* The type of MediaLive input. Users select an input type via
|
|
70
|
+
* the `InputConfiguration` factory methods, never by passing this type directly.
|
|
71
|
+
* @internal
|
|
72
|
+
*/
|
|
73
|
+
var InputType;
|
|
74
|
+
(function (InputType) {
|
|
75
|
+
/** Push a UDP transport stream to MediaLive */
|
|
76
|
+
InputType["UDP_PUSH"] = "UDP_PUSH";
|
|
77
|
+
/** Push an RTP transport stream to MediaLive */
|
|
78
|
+
InputType["RTP_PUSH"] = "RTP_PUSH";
|
|
79
|
+
/** Push an RTMP stream to MediaLive */
|
|
80
|
+
InputType["RTMP_PUSH"] = "RTMP_PUSH";
|
|
81
|
+
/** Pull an RTMP stream from a server */
|
|
82
|
+
InputType["RTMP_PULL"] = "RTMP_PULL";
|
|
83
|
+
/** Pull HLS or TS content from a URL */
|
|
84
|
+
InputType["URL_PULL"] = "URL_PULL";
|
|
85
|
+
/** Pull an MP4 file from a URL */
|
|
86
|
+
InputType["MP4_FILE"] = "MP4_FILE";
|
|
87
|
+
/** Receive content from AWS Elemental MediaConnect */
|
|
88
|
+
InputType["MEDIACONNECT"] = "MEDIACONNECT";
|
|
89
|
+
/** Receive content from an Elemental Link device */
|
|
90
|
+
InputType["INPUT_DEVICE"] = "INPUT_DEVICE";
|
|
91
|
+
/** Receive uncompressed content via AWS CDI */
|
|
92
|
+
InputType["AWS_CDI"] = "AWS_CDI";
|
|
93
|
+
/** Pull a TS file from a URL */
|
|
94
|
+
InputType["TS_FILE"] = "TS_FILE";
|
|
95
|
+
/** Pull content from an SRT source (caller mode) */
|
|
96
|
+
InputType["SRT_CALLER"] = "SRT_CALLER";
|
|
97
|
+
/** Receive content pushed via SRT (listener mode) */
|
|
98
|
+
InputType["SRT_LISTENER"] = "SRT_LISTENER";
|
|
99
|
+
/** Receive multicast content. Requires `anywhereSettings` on the MediaLive Channel. */
|
|
100
|
+
InputType["MULTICAST"] = "MULTICAST";
|
|
101
|
+
/** Receive content via SMPTE 2110. Requires `anywhereSettings` on the MediaLive Channel. */
|
|
102
|
+
InputType["SMPTE_2110_RECEIVER_GROUP"] = "SMPTE_2110_RECEIVER_GROUP";
|
|
103
|
+
/** Receive content from an SDI source. Requires `anywhereSettings` on the MediaLive Channel. */
|
|
104
|
+
InputType["SDI"] = "SDI";
|
|
105
|
+
/** Receive content from a MediaConnect router */
|
|
106
|
+
InputType["MEDIACONNECT_ROUTER"] = "MEDIACONNECT_ROUTER";
|
|
107
|
+
})(InputType || (exports.InputType = InputType = {}));
|
|
108
|
+
/**
|
|
109
|
+
* A source for a pull-type input. Use the static factory methods to create.
|
|
110
|
+
*/
|
|
111
|
+
class InputSource {
|
|
112
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.InputSource", version: "2.268.0-alpha.0" };
|
|
113
|
+
/**
|
|
114
|
+
* Create a source from a URL.
|
|
115
|
+
* @param url The URL where MediaLive pulls the source content from.
|
|
116
|
+
* @param options Optional credentials.
|
|
117
|
+
*/
|
|
118
|
+
static url(url, options) {
|
|
119
|
+
try {
|
|
120
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_InputSourceOptions(options);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
124
|
+
Error.captureStackTrace(error, this.url);
|
|
125
|
+
}
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
return new UrlInputSource(url, options);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Create a source from an S3 bucket. Automatically grants read access
|
|
132
|
+
* to the channel's role.
|
|
133
|
+
*
|
|
134
|
+
* @param bucket The S3 bucket containing the source file.
|
|
135
|
+
* @param key The object key within the bucket (e.g. 'videos/intro.mp4').
|
|
136
|
+
*/
|
|
137
|
+
static fromBucket(bucket, key) {
|
|
138
|
+
return new S3InputSource(bucket, key);
|
|
139
|
+
}
|
|
140
|
+
/** @internal */
|
|
141
|
+
_grantRead(_role) { }
|
|
142
|
+
}
|
|
143
|
+
exports.InputSource = InputSource;
|
|
144
|
+
/** @internal */
|
|
145
|
+
class UrlInputSource extends InputSource {
|
|
146
|
+
url;
|
|
147
|
+
options;
|
|
148
|
+
constructor(url, options) {
|
|
149
|
+
super();
|
|
150
|
+
this.url = url;
|
|
151
|
+
this.options = options;
|
|
152
|
+
}
|
|
153
|
+
_bind() {
|
|
154
|
+
return { url: this.url, username: this.options?.username, passwordParam: this.options?.password?.parameterName };
|
|
155
|
+
}
|
|
156
|
+
_grantRead(role) {
|
|
157
|
+
// MediaLive reads the password from SSM Parameter Store at channel runtime, so the
|
|
158
|
+
// channel role needs read access to the parameter (scoped to the parameter ARN).
|
|
159
|
+
this.options?.password?.grantRead(role);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/** @internal */
|
|
163
|
+
class S3InputSource extends InputSource {
|
|
164
|
+
bucket;
|
|
165
|
+
url;
|
|
166
|
+
constructor(bucket, key) {
|
|
167
|
+
super();
|
|
168
|
+
this.bucket = bucket;
|
|
169
|
+
this.url = `s3ssl://${bucket.bucketName}/${key}`;
|
|
170
|
+
}
|
|
171
|
+
_bind() {
|
|
172
|
+
return { url: this.url };
|
|
173
|
+
}
|
|
174
|
+
_grantRead(role) {
|
|
175
|
+
this.bucket.grantRead(role);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/** The encryption algorithm for SRT decryption. */
|
|
179
|
+
class SrtDecryptionAlgorithm {
|
|
180
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.SrtDecryptionAlgorithm", version: "2.268.0-alpha.0" };
|
|
181
|
+
/** AES-128. */
|
|
182
|
+
static AES128 = new SrtDecryptionAlgorithm('AES128');
|
|
183
|
+
/** AES-192. */
|
|
184
|
+
static AES192 = new SrtDecryptionAlgorithm('AES192');
|
|
185
|
+
/** AES-256. */
|
|
186
|
+
static AES256 = new SrtDecryptionAlgorithm('AES256');
|
|
187
|
+
/** A value not yet modelled by AWS CDK. */
|
|
188
|
+
static of(value) {
|
|
189
|
+
return new SrtDecryptionAlgorithm(value);
|
|
190
|
+
}
|
|
191
|
+
/** The underlying string value passed to CloudFormation. */
|
|
192
|
+
value;
|
|
193
|
+
constructor(value) {
|
|
194
|
+
this.value = value;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
exports.SrtDecryptionAlgorithm = SrtDecryptionAlgorithm;
|
|
198
|
+
/** The transport protocol for a multicast source. */
|
|
199
|
+
class MulticastProtocol {
|
|
200
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.MulticastProtocol", version: "2.268.0-alpha.0" };
|
|
201
|
+
/** UDP transport. */
|
|
202
|
+
static UDP = new MulticastProtocol('udp');
|
|
203
|
+
/** RTP transport. */
|
|
204
|
+
static RTP = new MulticastProtocol('rtp');
|
|
205
|
+
/** A value not yet modelled by AWS CDK. */
|
|
206
|
+
static of(value) {
|
|
207
|
+
return new MulticastProtocol(value);
|
|
208
|
+
}
|
|
209
|
+
/** The underlying string value passed to CloudFormation. */
|
|
210
|
+
value;
|
|
211
|
+
constructor(value) {
|
|
212
|
+
this.value = value;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
exports.MulticastProtocol = MulticastProtocol;
|
|
216
|
+
/**
|
|
217
|
+
* Bind push-input destinations to their CFN shape.
|
|
218
|
+
* @internal
|
|
219
|
+
*/
|
|
220
|
+
function bindPushDestinations(destinations) {
|
|
221
|
+
return destinations?.map(d => ({
|
|
222
|
+
streamName: d.streamName,
|
|
223
|
+
network: d.network?.networkRef.networkId,
|
|
224
|
+
networkRoutes: d.networkRoutes?.map(r => ({ cidr: r.cidr, gateway: r.gateway })),
|
|
225
|
+
staticIpAddress: d.staticIpAddress,
|
|
226
|
+
}));
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Bind a SMPTE 2110 SDP location to its CFN shape.
|
|
230
|
+
* @internal
|
|
231
|
+
*/
|
|
232
|
+
function bindSdpLocation(loc) {
|
|
233
|
+
return { sdpUrl: loc.sdpUrl, mediaIndex: loc.mediaIndex };
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Defines the input configuration for a MediaLive Input.
|
|
237
|
+
*
|
|
238
|
+
* Use the static factory methods to create the appropriate configuration for your input type.
|
|
239
|
+
*/
|
|
240
|
+
class InputConfiguration {
|
|
241
|
+
_bindFn;
|
|
242
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.InputConfiguration", version: "2.268.0-alpha.0" };
|
|
243
|
+
/**
|
|
244
|
+
* Create a URL pull input for HLS or TS streams.
|
|
245
|
+
*
|
|
246
|
+
* @example
|
|
247
|
+
*
|
|
248
|
+
* InputConfiguration.urlPull([
|
|
249
|
+
* InputSource.url('https://example.com/stream.m3u8'),
|
|
250
|
+
* ]);
|
|
251
|
+
*
|
|
252
|
+
*/
|
|
253
|
+
static urlPull(sources) {
|
|
254
|
+
return InputConfiguration.createPullInput(InputType.URL_PULL, sources);
|
|
255
|
+
}
|
|
256
|
+
/** Create an RTMP pull input. */
|
|
257
|
+
static rtmpPull(sources) {
|
|
258
|
+
return InputConfiguration.createPullInput(InputType.RTMP_PULL, sources);
|
|
259
|
+
}
|
|
260
|
+
/** Create an MP4 file pull input. */
|
|
261
|
+
static mp4File(sources) {
|
|
262
|
+
return InputConfiguration.createPullInput(InputType.MP4_FILE, sources);
|
|
263
|
+
}
|
|
264
|
+
/** Create a TS file pull input. */
|
|
265
|
+
static tsFile(sources) {
|
|
266
|
+
return InputConfiguration.createPullInput(InputType.TS_FILE, sources);
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Create an RTMP push input.
|
|
270
|
+
*
|
|
271
|
+
* @example
|
|
272
|
+
*
|
|
273
|
+
* declare const securityGroup: InputSecurityGroup;
|
|
274
|
+
*
|
|
275
|
+
* InputConfiguration.rtmpPush({
|
|
276
|
+
* inputSecurityGroups: [securityGroup],
|
|
277
|
+
* });
|
|
278
|
+
*
|
|
279
|
+
*/
|
|
280
|
+
static rtmpPush(props) {
|
|
281
|
+
try {
|
|
282
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_PushInputProps(props);
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
286
|
+
Error.captureStackTrace(error, this.rtmpPush);
|
|
287
|
+
}
|
|
288
|
+
throw error;
|
|
289
|
+
}
|
|
290
|
+
return new InputConfiguration(() => ({
|
|
291
|
+
type: InputType.RTMP_PUSH,
|
|
292
|
+
inputClass: props.destinations?.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
|
|
293
|
+
inputSecurityGroups: props.inputSecurityGroups?.map(sg => sg.inputSecurityGroupRef.inputSecurityGroupId),
|
|
294
|
+
destinations: bindPushDestinations(props.destinations),
|
|
295
|
+
}));
|
|
296
|
+
}
|
|
297
|
+
/** Create an RTP push input. */
|
|
298
|
+
static rtpPush(props) {
|
|
299
|
+
try {
|
|
300
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_PushInputProps(props);
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
304
|
+
Error.captureStackTrace(error, this.rtpPush);
|
|
305
|
+
}
|
|
306
|
+
throw error;
|
|
307
|
+
}
|
|
308
|
+
return new InputConfiguration(() => ({
|
|
309
|
+
type: InputType.RTP_PUSH,
|
|
310
|
+
inputClass: props.destinations?.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
|
|
311
|
+
inputSecurityGroups: props.inputSecurityGroups?.map(sg => sg.inputSecurityGroupRef.inputSecurityGroupId),
|
|
312
|
+
destinations: bindPushDestinations(props.destinations),
|
|
313
|
+
}));
|
|
314
|
+
}
|
|
315
|
+
/** Create a UDP push input. */
|
|
316
|
+
static udpPush(props) {
|
|
317
|
+
try {
|
|
318
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_PushInputProps(props);
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
322
|
+
Error.captureStackTrace(error, this.udpPush);
|
|
323
|
+
}
|
|
324
|
+
throw error;
|
|
325
|
+
}
|
|
326
|
+
return new InputConfiguration(() => ({
|
|
327
|
+
type: InputType.UDP_PUSH,
|
|
328
|
+
inputClass: props.destinations?.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
|
|
329
|
+
inputSecurityGroups: props.inputSecurityGroups?.map(sg => sg.inputSecurityGroupRef.inputSecurityGroupId),
|
|
330
|
+
destinations: bindPushDestinations(props.destinations),
|
|
331
|
+
}));
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Create a MediaConnect router input configuration.
|
|
335
|
+
*
|
|
336
|
+
* @example
|
|
337
|
+
*
|
|
338
|
+
* // Single pipeline with default AZ
|
|
339
|
+
* InputConfiguration.mediaConnectRouter();
|
|
340
|
+
*
|
|
341
|
+
* @example
|
|
342
|
+
*
|
|
343
|
+
* // Redundant pipelines with explicit AZs
|
|
344
|
+
* InputConfiguration.mediaConnectRouter({
|
|
345
|
+
* availabilityZones: ['us-east-1a', 'us-east-1b'],
|
|
346
|
+
* });
|
|
347
|
+
*
|
|
348
|
+
*/
|
|
349
|
+
static mediaConnectRouter(props) {
|
|
350
|
+
try {
|
|
351
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_MediaConnectRouterInputProps(props);
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
355
|
+
Error.captureStackTrace(error, this.mediaConnectRouter);
|
|
356
|
+
}
|
|
357
|
+
throw error;
|
|
358
|
+
}
|
|
359
|
+
return new InputConfiguration((scope) => {
|
|
360
|
+
const stackAzs = scope ? aws_cdk_lib_1.Stack.of(scope).availabilityZones : [];
|
|
361
|
+
const azs = props?.availabilityZones ?? [stackAzs[0]];
|
|
362
|
+
if (azs.length < 1 || azs.length > 2) {
|
|
363
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `RouterAzCount`, 'MediaConnect Router input requires 1 or 2 availability zones.');
|
|
364
|
+
}
|
|
365
|
+
const destinations = azs.map(az => ({
|
|
366
|
+
availabilityZoneName: az,
|
|
367
|
+
}));
|
|
368
|
+
return {
|
|
369
|
+
type: InputType.MEDIACONNECT_ROUTER,
|
|
370
|
+
inputClass: azs.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
|
|
371
|
+
routerSettings: {
|
|
372
|
+
destinations,
|
|
373
|
+
encryptionType: props?.encryptionSecret ? 'CUSTOM' : 'AUTOMATIC',
|
|
374
|
+
secretArn: props?.encryptionSecret?.secretArn,
|
|
375
|
+
},
|
|
376
|
+
};
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Create a MediaConnect flow input configuration.
|
|
381
|
+
*
|
|
382
|
+
* @example
|
|
383
|
+
*
|
|
384
|
+
* declare const role: iam.IRole;
|
|
385
|
+
* declare const flow: mediaconnect.IFlowRef;
|
|
386
|
+
*
|
|
387
|
+
* InputConfiguration.mediaConnect({
|
|
388
|
+
* flows: [flow],
|
|
389
|
+
* role,
|
|
390
|
+
* });
|
|
391
|
+
*
|
|
392
|
+
*/
|
|
393
|
+
static mediaConnect(props) {
|
|
394
|
+
try {
|
|
395
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_MediaConnectInputProps(props);
|
|
396
|
+
}
|
|
397
|
+
catch (error) {
|
|
398
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
399
|
+
Error.captureStackTrace(error, this.mediaConnect);
|
|
400
|
+
}
|
|
401
|
+
throw error;
|
|
402
|
+
}
|
|
403
|
+
if (props.flows.length < 1 || props.flows.length > 2) {
|
|
404
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `MediaConnectFlowsLimit`, 'You must specify 1 or 2 MediaConnect flows.');
|
|
405
|
+
}
|
|
406
|
+
return new InputConfiguration((scope) => {
|
|
407
|
+
const role = props.role ?? createInputRole(scope, 'MediaConnectRole');
|
|
408
|
+
return {
|
|
409
|
+
type: InputType.MEDIACONNECT,
|
|
410
|
+
inputClass: props.flows.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
|
|
411
|
+
mediaConnectFlows: props.flows.map(f => ({ flowArn: f.flowRef.flowArn })),
|
|
412
|
+
roleArn: role.roleArn,
|
|
413
|
+
// Only auto-grant actions with auto-created role. A user-provided role
|
|
414
|
+
// is left alone — the caller adds its permissions.
|
|
415
|
+
mediaConnectFlowGrant: props.role === undefined ? { role } : undefined,
|
|
416
|
+
};
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
/** Create an SDI input configuration. */
|
|
420
|
+
static sdi(sources) {
|
|
421
|
+
return new InputConfiguration(() => ({
|
|
422
|
+
type: InputType.SDI,
|
|
423
|
+
inputClass: sources.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
|
|
424
|
+
// MediaLive's SdiSources property expects the numeric SDI source ID, not the ARN.
|
|
425
|
+
sdiSources: sources.map(s => s.sdiSourceId),
|
|
426
|
+
}));
|
|
427
|
+
}
|
|
428
|
+
/** Create an Elemental Link input from one or two registered Link device IDs. */
|
|
429
|
+
static inputDevice(props) {
|
|
430
|
+
try {
|
|
431
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_InputDeviceInputProps(props);
|
|
432
|
+
}
|
|
433
|
+
catch (error) {
|
|
434
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
435
|
+
Error.captureStackTrace(error, this.inputDevice);
|
|
436
|
+
}
|
|
437
|
+
throw error;
|
|
438
|
+
}
|
|
439
|
+
if (props.deviceIds.length < 1 || props.deviceIds.length > 2) {
|
|
440
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `InputDeviceCount`, 'You must specify 1 or 2 input devices.');
|
|
441
|
+
}
|
|
442
|
+
return new InputConfiguration(() => ({
|
|
443
|
+
type: InputType.INPUT_DEVICE,
|
|
444
|
+
inputClass: props.deviceIds.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
|
|
445
|
+
inputDevices: props.deviceIds.map(id => ({ id })),
|
|
446
|
+
}));
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Create a CDI (uncompressed) input delivered into a VPC.
|
|
450
|
+
*
|
|
451
|
+
* MediaLive creates network interfaces in the supplied subnets and hands back the CDI push
|
|
452
|
+
* endpoints. The required EC2 permissions are granted to the role automatically.
|
|
453
|
+
*/
|
|
454
|
+
static cdi(props) {
|
|
455
|
+
try {
|
|
456
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_CdiInputProps(props);
|
|
457
|
+
}
|
|
458
|
+
catch (error) {
|
|
459
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
460
|
+
Error.captureStackTrace(error, this.cdi);
|
|
461
|
+
}
|
|
462
|
+
throw error;
|
|
463
|
+
}
|
|
464
|
+
if (props.subnets.length !== 2) {
|
|
465
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `CdiSubnetCount`, 'CDI inputs require exactly 2 subnets in two different availability zones.');
|
|
466
|
+
}
|
|
467
|
+
const subnetIds = props.subnets.map(s => s.subnetRef.subnetId);
|
|
468
|
+
const securityGroupIds = props.securityGroups?.map(sg => sg.securityGroupRef.securityGroupId);
|
|
469
|
+
return new InputConfiguration((scope) => {
|
|
470
|
+
const role = props.role ?? createInputRole(scope, 'CdiRole');
|
|
471
|
+
return {
|
|
472
|
+
type: InputType.AWS_CDI,
|
|
473
|
+
inputClass: 'STANDARD',
|
|
474
|
+
roleArn: role.roleArn,
|
|
475
|
+
vpc: { subnetIds, securityGroupIds },
|
|
476
|
+
// Only auto-grant actions with auto-created role. A user-provided role
|
|
477
|
+
// is left alone — the caller adds its permissions.
|
|
478
|
+
vpcRoleGrant: props.role === undefined ? { role, subnetIds, securityGroupIds: securityGroupIds ?? [] } : undefined,
|
|
479
|
+
};
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
/** Create a multicast input. Requires `anywhereSettings` on the channel. */
|
|
483
|
+
static multicast(props) {
|
|
484
|
+
try {
|
|
485
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_MulticastInputProps(props);
|
|
486
|
+
}
|
|
487
|
+
catch (error) {
|
|
488
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
489
|
+
Error.captureStackTrace(error, this.multicast);
|
|
490
|
+
}
|
|
491
|
+
throw error;
|
|
492
|
+
}
|
|
493
|
+
if (props.sources.length < 1 || props.sources.length > 2) {
|
|
494
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `MulticastSourceCount`, 'You must specify 1 or 2 multicast sources.');
|
|
495
|
+
}
|
|
496
|
+
return new InputConfiguration(() => ({
|
|
497
|
+
type: InputType.MULTICAST,
|
|
498
|
+
inputClass: props.sources.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
|
|
499
|
+
multicastSettings: {
|
|
500
|
+
sources: props.sources.map(s => ({
|
|
501
|
+
url: `${(s.protocol ?? MulticastProtocol.UDP).value}://${s.address}:${s.port}`,
|
|
502
|
+
sourceIp: s.sourceIp,
|
|
503
|
+
})),
|
|
504
|
+
},
|
|
505
|
+
}));
|
|
506
|
+
}
|
|
507
|
+
/** Create a SMPTE 2110 receiver group input. Requires `anywhereSettings` on the channel. */
|
|
508
|
+
static smpte2110ReceiverGroup(props) {
|
|
509
|
+
try {
|
|
510
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_Smpte2110InputProps(props);
|
|
511
|
+
}
|
|
512
|
+
catch (error) {
|
|
513
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
514
|
+
Error.captureStackTrace(error, this.smpte2110ReceiverGroup);
|
|
515
|
+
}
|
|
516
|
+
throw error;
|
|
517
|
+
}
|
|
518
|
+
if ((props.audioSdps?.length ?? 0) > 50) {
|
|
519
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `Smpte2110AudioSdpCount`, 'A SMPTE 2110 input supports at most 50 audio SDPs.');
|
|
520
|
+
}
|
|
521
|
+
if ((props.ancillarySdps?.length ?? 0) > 50) {
|
|
522
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `Smpte2110AncillarySdpCount`, 'A SMPTE 2110 input supports at most 50 ancillary SDPs.');
|
|
523
|
+
}
|
|
524
|
+
return new InputConfiguration(() => ({
|
|
525
|
+
type: InputType.SMPTE_2110_RECEIVER_GROUP,
|
|
526
|
+
smpte2110ReceiverGroupSettings: {
|
|
527
|
+
smpte2110ReceiverGroups: [{
|
|
528
|
+
sdpSettings: {
|
|
529
|
+
videoSdp: props.videoSdp ? bindSdpLocation(props.videoSdp) : undefined,
|
|
530
|
+
audioSdps: props.audioSdps?.map(bindSdpLocation),
|
|
531
|
+
ancillarySdps: props.ancillarySdps?.map(bindSdpLocation),
|
|
532
|
+
},
|
|
533
|
+
}],
|
|
534
|
+
},
|
|
535
|
+
}));
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Create an SRT caller input configuration.
|
|
539
|
+
*
|
|
540
|
+
* @example
|
|
541
|
+
*
|
|
542
|
+
* InputConfiguration.srtCaller([{
|
|
543
|
+
* srtListenerAddress: '10.0.0.1',
|
|
544
|
+
* srtListenerPort: 5000,
|
|
545
|
+
* }]);
|
|
546
|
+
*
|
|
547
|
+
*/
|
|
548
|
+
static srtCaller(sources) {
|
|
549
|
+
if (sources.length < 1 || sources.length > 2) {
|
|
550
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `SrtCallerSourcesLimit`, 'You must specify 1 or 2 SRT caller sources.');
|
|
551
|
+
}
|
|
552
|
+
return new InputConfiguration(() => ({
|
|
553
|
+
type: InputType.SRT_CALLER,
|
|
554
|
+
inputClass: sources.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
|
|
555
|
+
srtSettings: {
|
|
556
|
+
srtCallerSources: sources.map(s => ({
|
|
557
|
+
srtListenerAddress: s.srtListenerAddress,
|
|
558
|
+
srtListenerPort: s.srtListenerPort.toString(),
|
|
559
|
+
minimumLatency: s.minimumLatency?.toMilliseconds(),
|
|
560
|
+
streamId: s.streamId,
|
|
561
|
+
decryption: s.decryption ? {
|
|
562
|
+
algorithm: s.decryption.algorithm?.value,
|
|
563
|
+
passphraseSecretArn: s.decryption.passphraseSecret?.secretArn,
|
|
564
|
+
} : undefined,
|
|
565
|
+
})),
|
|
566
|
+
},
|
|
567
|
+
}));
|
|
568
|
+
}
|
|
569
|
+
/** Create an SRT listener input configuration. */
|
|
570
|
+
static srtListener(props) {
|
|
571
|
+
try {
|
|
572
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_SrtListenerInputProps(props);
|
|
573
|
+
}
|
|
574
|
+
catch (error) {
|
|
575
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
576
|
+
Error.captureStackTrace(error, this.srtListener);
|
|
577
|
+
}
|
|
578
|
+
throw error;
|
|
579
|
+
}
|
|
580
|
+
return new InputConfiguration(() => ({
|
|
581
|
+
type: InputType.SRT_LISTENER,
|
|
582
|
+
inputClass: props.inputClass?.value ?? 'SINGLE_PIPELINE',
|
|
583
|
+
inputSecurityGroups: props.inputSecurityGroups.map(sg => sg.inputSecurityGroupRef.inputSecurityGroupId),
|
|
584
|
+
srtSettings: {
|
|
585
|
+
srtListenerSettings: {
|
|
586
|
+
minimumLatency: props.minimumLatency?.toMilliseconds(),
|
|
587
|
+
streamId: props.streamId,
|
|
588
|
+
decryption: props.decryption ? {
|
|
589
|
+
algorithm: props.decryption.algorithm?.value,
|
|
590
|
+
passphraseSecretArn: props.decryption.passphraseSecret?.secretArn,
|
|
591
|
+
} : undefined,
|
|
592
|
+
},
|
|
593
|
+
},
|
|
594
|
+
}));
|
|
595
|
+
}
|
|
596
|
+
static createPullInput(type, sources) {
|
|
597
|
+
if (sources.length < 1) {
|
|
598
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `PullInputSourcesMinimum`, 'You must specify at least 1 input source.');
|
|
599
|
+
}
|
|
600
|
+
if (sources.length > 2) {
|
|
601
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `PullInputSourcesLimit`, 'You cannot specify more than 2 input sources.');
|
|
602
|
+
}
|
|
603
|
+
return new InputConfiguration(() => {
|
|
604
|
+
return {
|
|
605
|
+
type,
|
|
606
|
+
inputClass: sources.length === 2 ? 'STANDARD' : 'SINGLE_PIPELINE',
|
|
607
|
+
inputSources: sources,
|
|
608
|
+
sources: sources.map(s => s._bind()),
|
|
609
|
+
};
|
|
610
|
+
});
|
|
611
|
+
}
|
|
612
|
+
constructor(_bindFn) {
|
|
613
|
+
this._bindFn = _bindFn;
|
|
614
|
+
}
|
|
615
|
+
/** @internal */
|
|
616
|
+
_bind(scope) {
|
|
617
|
+
return this._bindFn(scope);
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
exports.InputConfiguration = InputConfiguration;
|
|
621
|
+
/**
|
|
622
|
+
* Create the default IAM role for an input that MediaLive assumes (MediaConnect flow or CDI/VPC).
|
|
623
|
+
* The caller wires the specific managed/EC2 actions onto the role.
|
|
624
|
+
*/
|
|
625
|
+
function createInputRole(scope, id) {
|
|
626
|
+
if (!scope) {
|
|
627
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `InputRoleScope`, 'Cannot auto-create an input role without a construct scope; provide an explicit `role`.');
|
|
628
|
+
}
|
|
629
|
+
return new aws_iam_1.Role(scope, id, {
|
|
630
|
+
assumedBy: new aws_iam_1.ServicePrincipal('medialive.amazonaws.com', {
|
|
631
|
+
conditions: {
|
|
632
|
+
StringEquals: { 'aws:SourceAccount': aws_cdk_lib_1.Aws.ACCOUNT_ID },
|
|
633
|
+
ArnLike: {
|
|
634
|
+
'aws:SourceArn': aws_cdk_lib_1.Stack.of(scope).formatArn({
|
|
635
|
+
service: 'medialive',
|
|
636
|
+
resource: 'input',
|
|
637
|
+
resourceName: '*',
|
|
638
|
+
arnFormat: aws_cdk_lib_1.ArnFormat.COLON_RESOURCE_NAME,
|
|
639
|
+
}),
|
|
640
|
+
},
|
|
641
|
+
},
|
|
642
|
+
}),
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
/**
|
|
646
|
+
* Defines an AWS Elemental MediaLive Input.
|
|
647
|
+
*/
|
|
648
|
+
let Input = (() => {
|
|
649
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
650
|
+
let _classDescriptor;
|
|
651
|
+
let _classExtraInitializers = [];
|
|
652
|
+
let _classThis;
|
|
653
|
+
let _classSuper = aws_cdk_lib_1.Resource;
|
|
654
|
+
var Input = class extends _classSuper {
|
|
655
|
+
static { _classThis = this; }
|
|
656
|
+
static {
|
|
657
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
658
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
659
|
+
Input = _classThis = _classDescriptor.value;
|
|
660
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
661
|
+
}
|
|
662
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.Input", version: "2.268.0-alpha.0" };
|
|
663
|
+
/** Uniquely identifies this class. */
|
|
664
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-medialive-alpha.Input';
|
|
665
|
+
/** Import an existing input by its ARN. The id is parsed out of the ARN. */
|
|
666
|
+
static fromInputArn(scope, id, inputArn) {
|
|
667
|
+
const inputId = (0, shared_1.extractResourceId)(inputArn, 'Input');
|
|
668
|
+
class Import extends aws_cdk_lib_1.Resource {
|
|
669
|
+
inputArn = inputArn;
|
|
670
|
+
inputId = inputId;
|
|
671
|
+
inputClass = undefined;
|
|
672
|
+
inputType = undefined;
|
|
673
|
+
inputDestinations = undefined;
|
|
674
|
+
inputSources = undefined;
|
|
675
|
+
get inputRef() {
|
|
676
|
+
return { inputId: this.inputId, inputArn: this.inputArn };
|
|
677
|
+
}
|
|
678
|
+
/** @internal Imported inputs own no sources, so granting is a no-op. */
|
|
679
|
+
_grantPermissions(_role) { }
|
|
680
|
+
}
|
|
681
|
+
return new Import(scope, id);
|
|
682
|
+
}
|
|
683
|
+
inputArn;
|
|
684
|
+
inputId;
|
|
685
|
+
inputClass;
|
|
686
|
+
inputType;
|
|
687
|
+
inputDestinations;
|
|
688
|
+
inputSources;
|
|
689
|
+
/** A reference to this Input resource. */
|
|
690
|
+
get inputRef() {
|
|
691
|
+
return { inputId: this.inputId, inputArn: this.inputArn };
|
|
692
|
+
}
|
|
693
|
+
inputSourceRefs;
|
|
694
|
+
constructor(scope, id, props) {
|
|
695
|
+
super(scope, id, {
|
|
696
|
+
physicalName: props.inputName ?? aws_cdk_lib_1.Lazy.string({ produce: () => aws_cdk_lib_1.Names.uniqueResourceName(this, { maxLength: 256 }) }),
|
|
697
|
+
});
|
|
698
|
+
try {
|
|
699
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_InputProps(props);
|
|
700
|
+
}
|
|
701
|
+
catch (error) {
|
|
702
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
703
|
+
Error.captureStackTrace(error, Input);
|
|
704
|
+
}
|
|
705
|
+
throw error;
|
|
706
|
+
}
|
|
707
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
708
|
+
const config = props.input._bind(this);
|
|
709
|
+
// Security-group rules: on-premises inputs don't support security groups, while cloud push
|
|
710
|
+
// inputs require at least one. Both always fail at deploy otherwise, so validate at synth.
|
|
711
|
+
const isOnPremises = props.inputNetworkLocation?.value === InputNetworkLocation.ON_PREMISES.value;
|
|
712
|
+
const hasSecurityGroups = (config.inputSecurityGroups?.length ?? 0) > 0;
|
|
713
|
+
const isPushInput = config.type === InputType.RTMP_PUSH
|
|
714
|
+
|| config.type === InputType.RTP_PUSH
|
|
715
|
+
|| config.type === InputType.UDP_PUSH;
|
|
716
|
+
if (isOnPremises && hasSecurityGroups) {
|
|
717
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `OnPremisesInputSecurityGroups`, 'on-premises inputs do not support input security groups; remove inputSecurityGroups for an ON_PREMISES input', this);
|
|
718
|
+
}
|
|
719
|
+
if (!isOnPremises && isPushInput && !hasSecurityGroups) {
|
|
720
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `PushInputSecurityGroupsRequired`, 'cloud push inputs require at least one input security group', this);
|
|
721
|
+
}
|
|
722
|
+
// SDI inputs are on-premises hardware sources — MediaLive always rejects an SDI input
|
|
723
|
+
// whose network location isn't ON_PREMISES, so fail fast at synth.
|
|
724
|
+
if (config.type === InputType.SDI && !isOnPremises) {
|
|
725
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `SdiInputRequiresOnPremises`, "an SDI input's inputNetworkLocation must be InputNetworkLocation.ON_PREMISES", this);
|
|
726
|
+
}
|
|
727
|
+
const resource = new aws_medialive_1.CfnInput(this, 'Resource', {
|
|
728
|
+
name: this.physicalName,
|
|
729
|
+
type: config.type,
|
|
730
|
+
roleArn: config.roleArn,
|
|
731
|
+
sources: config.sources,
|
|
732
|
+
destinations: config.destinations,
|
|
733
|
+
mediaConnectFlows: config.mediaConnectFlows,
|
|
734
|
+
inputDevices: config.inputDevices,
|
|
735
|
+
multicastSettings: config.multicastSettings,
|
|
736
|
+
smpte2110ReceiverGroupSettings: config.smpte2110ReceiverGroupSettings,
|
|
737
|
+
routerSettings: config.routerSettings,
|
|
738
|
+
srtSettings: config.srtSettings,
|
|
739
|
+
sdiSources: config.sdiSources,
|
|
740
|
+
vpc: config.vpc,
|
|
741
|
+
inputSecurityGroups: config.inputSecurityGroups,
|
|
742
|
+
inputNetworkLocation: props.inputNetworkLocation?.value,
|
|
743
|
+
tags: props.tags,
|
|
744
|
+
});
|
|
745
|
+
this.inputArn = resource.inputRef.inputArn;
|
|
746
|
+
this.inputId = resource.inputRef.inputId;
|
|
747
|
+
this.inputClass = config.inputClass;
|
|
748
|
+
this.inputType = config.type;
|
|
749
|
+
this.inputDestinations = resource.attrDestinations;
|
|
750
|
+
this.inputSources = resource.attrSources;
|
|
751
|
+
this.inputSourceRefs = config.inputSources ?? [];
|
|
752
|
+
// MediaConnect flow inputs: grant managed flow-management actions.
|
|
753
|
+
// Resource is `*` — service rejects flow-ARN-scoped grants.
|
|
754
|
+
if (config.mediaConnectFlowGrant) {
|
|
755
|
+
aws_iam_1.Grant.addToPrincipal({
|
|
756
|
+
grantee: config.mediaConnectFlowGrant.role,
|
|
757
|
+
actions: [
|
|
758
|
+
'mediaconnect:ManagedDescribeFlow',
|
|
759
|
+
'mediaconnect:ManagedAddOutput',
|
|
760
|
+
'mediaconnect:ManagedRemoveOutput',
|
|
761
|
+
],
|
|
762
|
+
resourceArns: ['*'],
|
|
763
|
+
}).applyBefore(resource);
|
|
764
|
+
}
|
|
765
|
+
// CDI/VPC inputs: Create/Delete scoped to ENI + subnets + SGs; Describe* needs `*`.
|
|
766
|
+
if (config.vpcRoleGrant) {
|
|
767
|
+
const stack = aws_cdk_lib_1.Stack.of(this);
|
|
768
|
+
const grant = config.vpcRoleGrant;
|
|
769
|
+
const networkInterfaceArn = stack.formatArn({ service: 'ec2', resource: 'network-interface', resourceName: '*' });
|
|
770
|
+
const subnetArns = grant.subnetIds.map(s => stack.formatArn({ service: 'ec2', resource: 'subnet', resourceName: s }));
|
|
771
|
+
const securityGroupArns = grant.securityGroupIds.map(sg => stack.formatArn({ service: 'ec2', resource: 'security-group', resourceName: sg }));
|
|
772
|
+
aws_iam_1.Grant.addToPrincipal({
|
|
773
|
+
grantee: grant.role,
|
|
774
|
+
actions: [
|
|
775
|
+
'ec2:CreateNetworkInterface',
|
|
776
|
+
'ec2:CreateNetworkInterfacePermission',
|
|
777
|
+
'ec2:DeleteNetworkInterface',
|
|
778
|
+
],
|
|
779
|
+
resourceArns: [networkInterfaceArn, ...subnetArns, ...securityGroupArns],
|
|
780
|
+
}).applyBefore(resource);
|
|
781
|
+
aws_iam_1.Grant.addToPrincipal({
|
|
782
|
+
grantee: grant.role,
|
|
783
|
+
actions: [
|
|
784
|
+
'ec2:DescribeNetworkInterfaces',
|
|
785
|
+
'ec2:DescribeSubnets',
|
|
786
|
+
'ec2:DescribeSecurityGroups',
|
|
787
|
+
],
|
|
788
|
+
resourceArns: ['*'], // Describe* actions don't support resource-level permissions
|
|
789
|
+
}).applyBefore(resource);
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
/** @internal */
|
|
793
|
+
_grantPermissions(role) {
|
|
794
|
+
this.inputSourceRefs.forEach(s => s._grantRead(role));
|
|
795
|
+
}
|
|
796
|
+
static {
|
|
797
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
798
|
+
}
|
|
799
|
+
};
|
|
800
|
+
return Input = _classThis;
|
|
801
|
+
})();
|
|
802
|
+
exports.Input = Input;
|
|
803
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSw2Q0FBcUg7QUFHckgsaURBQW9FO0FBR3BFLDZEQUFxRDtBQUlyRCw0RUFBNEQ7QUFDNUQsOEVBQThFO0FBQzlFLDBFQUEwRTtBQUsxRSxxQ0FBNkM7QUFzRDdDOzs7R0FHRztBQUNILE1BQWEsb0JBQW9COztJQUMvQix1REFBdUQ7SUFDaEQsTUFBTSxDQUFVLEdBQUcsR0FBRyxJQUFJLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdELHVFQUF1RTtJQUNoRSxNQUFNLENBQVUsV0FBVyxHQUFHLElBQUksb0JBQW9CLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFN0UsMkNBQTJDO0lBQ3BDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBYTtRQUM1QixPQUFPLElBQUksb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDeEM7SUFFRCw0REFBNEQ7SUFDNUMsS0FBSyxDQUFTO0lBRTlCLFlBQW9CLEtBQWE7UUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7S0FDcEI7O0FBaEJILG9EQWlCQztBQTJCRDs7OztHQUlHO0FBQ0gsSUFBWSxTQWlDWDtBQWpDRCxXQUFZLFNBQVM7SUFDbkIsK0NBQStDO0lBQy9DLGtDQUFxQixDQUFBO0lBQ3JCLGdEQUFnRDtJQUNoRCxrQ0FBcUIsQ0FBQTtJQUNyQix1Q0FBdUM7SUFDdkMsb0NBQXVCLENBQUE7SUFDdkIsd0NBQXdDO0lBQ3hDLG9DQUF1QixDQUFBO0lBQ3ZCLHdDQUF3QztJQUN4QyxrQ0FBcUIsQ0FBQTtJQUNyQixrQ0FBa0M7SUFDbEMsa0NBQXFCLENBQUE7SUFDckIsc0RBQXNEO0lBQ3RELDBDQUE2QixDQUFBO0lBQzdCLG9EQUFvRDtJQUNwRCwwQ0FBNkIsQ0FBQTtJQUM3QiwrQ0FBK0M7SUFD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RSxHQUFHLFVBQVUsRUFBRSxHQUFHLGlCQUFpQixDQUFDO2lCQUN6RSxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6QixlQUFLLENBQUMsY0FBYyxDQUFDO29CQUNuQixPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUk7b0JBQ25CLE9BQU8sRUFBRTt3QkFDUCwrQkFBK0I7d0JBQy9CLHFCQUFxQjt3QkFDckIsNEJBQTRCO3FCQUM3QjtvQkFDRCxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSw2REFBNkQ7aUJBQ25GLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0IsQ0FBQztTQUNGO1FBRUQsZ0JBQWdCO1FBQ1QsaUJBQWlCLENBQUMsSUFBVztZQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN2RDs7WUF2SlUsdURBQUs7Ozs7O0FBQUwsc0JBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IER1cmF0aW9uLCBJUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBSZXNvdXJjZSwgTGF6eSwgTmFtZXMsIFN0YWNrLCBBd3MsIEFybkZvcm1hdCwgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlIHsgSVNlY3VyaXR5R3JvdXBSZWYsIElTdWJuZXRSZWYgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB0eXBlIHsgSVJvbGUsIElSb2xlUmVmIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBHcmFudCwgUm9sZSwgU2VydmljZVByaW5jaXBhbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHR5cGUgeyBJRmxvd1JlZiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1tZWRpYWNvbm5lY3QnO1xuaW1wb3J0IHR5cGUgeyBJSW5wdXRSZWYsIElucHV0UmVmZXJlbmNlLCBJSW5wdXRTZWN1cml0eUdyb3VwUmVmLCBJTmV0d29ya1JlZiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1tZWRpYWxpdmUnO1xuaW1wb3J0IHsgQ2ZuSW5wdXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbWVkaWFsaXZlJztcbmltcG9ydCB0eXBlIHsgSUJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgdHlwZSB7IElTZWNyZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXInO1xuaW1wb3J0IHR5cGUgeyBJU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgeyBsaXQgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgdHlwZSB7IENoYW5uZWxDbGFzcyB9IGZyb20gJy4vY2hhbm5lbCc7XG5pbXBvcnQgdHlwZSB7IE5ldHdvcmtSb3V0ZSB9IGZyb20gJy4vbmV0d29yayc7XG5pbXBvcnQgdHlwZSB7IElTZGlTb3VyY2UgfSBmcm9tICcuL3NkaS1zb3VyY2UnO1xuaW1wb3J0IHsgZXh0cmFjdFJlc291cmNlSWQgfSBmcm9tICcuL3NoYXJlZCc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIE1lZGlhTGl2ZSBJbnB1dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSW5wdXQgZXh0ZW5kcyBJUmVzb3VyY2UsIElJbnB1dFJlZiB7XG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGlucHV0LlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBpbnB1dEFybjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBpbnB1dC5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRJZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGlucHV0IGNsYXNzIChTVEFOREFSRCBvciBTSU5HTEVfUElQRUxJTkUpLlxuICAgKiBPbmx5IGF2YWlsYWJsZSBmb3IgaW5wdXQgdHlwZXMgd2hlcmUgdGhlIHBpcGVsaW5lIGNvdW50IGlzIGtub3duIGF0IGNvbnN0cnVjdCB0aW1lXG4gICAqIChlLmcuIG1lZGlhQ29ubmVjdFJvdXRlcikuIFVuZGVmaW5lZCBmb3IgaW1wb3J0ZWQgaW5wdXRzIGFuZCBvdGhlciB0eXBlcy5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRDbGFzcz86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCB0eXBlIChlLmcuIFNSVF9DQUxMRVIsIE1QNF9GSUxFLCBVUkxfUFVMTCkuXG4gICAqIFVuZGVmaW5lZCBmb3IgaW1wb3J0ZWQgaW5wdXRzLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBpbnB1dFR5cGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGb3IgcHVzaCBpbnB1dHMsIHRoZSBkZXN0aW5hdGlvbiBVUkxzIHdoZXJlIHRoZSB1cHN0cmVhbSBzeXN0ZW0gc2VuZHMgY29udGVudC5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXREZXN0aW5hdGlvbnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEZvciBwdWxsIGlucHV0cywgdGhlIHNvdXJjZSBVUkxzIHdoZXJlIE1lZGlhTGl2ZSBwdWxscyBjb250ZW50IGZyb20uXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGlucHV0U291cmNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgY2hhbm5lbCByb2xlIHJlYWQgYWNjZXNzIHRvIHRoaXMgaW5wdXQncyBzb3VyY2VzLlxuICAgKlxuICAgKiBPd25lZCBpbnB1dHMgZ3JhbnQgYWNjZXNzIHRvIHRoZSByZXNvdXJjZXMgYmFja2luZyB0aGVpciBzb3VyY2VzIChlLmcuIFMzIGJ1Y2tldHNcbiAgICogZm9yIGZpbGUgaW5wdXRzKTsgaW1wb3J0ZWQgaW5wdXRzIGFyZSBhIG5vLW9wLCBzaW5jZSB0aGVpciBzb3VyY2VzIGFyZW4ndCBvd25lZCBieVxuICAgKiB0aGlzIHN0YWNrLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlUmVmKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgbmV0d29yayBsb2NhdGlvbiBvZiBhIE1lZGlhTGl2ZSBpbnB1dCDigJQgdGhlIEFXUyBjbG91ZCwgb3IgYW4gb24tcHJlbWlzZXMgbmV0d29yayBmb3JcbiAqIE1lZGlhTGl2ZSBBbnl3aGVyZS5cbiAqL1xuZXhwb3J0IGNsYXNzIElucHV0TmV0d29ya0xvY2F0aW9uIHtcbiAgLyoqIFRoZSBpbnB1dCBleGlzdHMgaW4gdGhlIEFXUyBjbG91ZCAodGhlIGRlZmF1bHQpLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFXUyA9IG5ldyBJbnB1dE5ldHdvcmtMb2NhdGlvbignQVdTJyk7XG4gIC8qKiBUaGUgaW5wdXQgZXhpc3RzIGluIGFuIG9uLXByZW1pc2VzIG5ldHdvcmsgKE1lZGlhTGl2ZSBBbnl3aGVyZSkuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgT05fUFJFTUlTRVMgPSBuZXcgSW5wdXROZXR3b3JrTG9jYXRpb24oJ09OX1BSRU1JU0VTJyk7XG5cbiAgLyoqIEEgdmFsdWUgbm90IHlldCBtb2RlbGxlZCBieSBBV1MgQ0RLLiAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBJbnB1dE5ldHdvcmtMb2NhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBJbnB1dE5ldHdvcmtMb2NhdGlvbih2YWx1ZSk7XG4gIH1cblxuICAvKiogVGhlIHVuZGVybHlpbmcgc3RyaW5nIHZhbHVlIHBhc3NlZCB0byBDbG91ZEZvcm1hdGlvbi4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYSBNZWRpYUxpdmUgSW5wdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5wdXRQcm9wcyB7XG4gIC8qKlxuICAgKiBJbnB1dCBuYW1lLlxuICAgKiBAZGVmYXVsdCAtIGF1dG8tZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSBpbnB1dE5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJbnB1dCBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgaW5wdXQgdHlwZSBhbmQgc291cmNlIHNldHRpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXQ6IElucHV0Q29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBuZXR3b3JrIGxvY2F0aW9uIG9mIHRoZSBpbnB1dCDigJQgQVdTIGNsb3VkIG9yIG9uLXByZW1pc2VzIChNZWRpYUxpdmUgQW55d2hlcmUpLlxuICAgKiBAZGVmYXVsdCAtIEFXUywgYXBwbGllZCBieSBNZWRpYUxpdmVcbiAgICovXG4gIHJlYWRvbmx5IGlucHV0TmV0d29ya0xvY2F0aW9uPzogSW5wdXROZXR3b3JrTG9jYXRpb247XG4gIC8qKlxuICAgKiBUYWdzIHRvIGFkZCB0byB0aGUgaW5wdXQuXG4gICAqIEBkZWZhdWx0IC0gbm8gdGFnc1xuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgTWVkaWFMaXZlIGlucHV0LiBVc2VycyBzZWxlY3QgYW4gaW5wdXQgdHlwZSB2aWFcbiAqIHRoZSBgSW5wdXRDb25maWd1cmF0aW9uYCBmYWN0b3J5IG1ldGhvZHMsIG5ldmVyIGJ5IHBhc3NpbmcgdGhpcyB0eXBlIGRpcmVjdGx5LlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBlbnVtIElucHV0VHlwZSB7XG4gIC8qKiBQdXNoIGEgVURQIHRyYW5zcG9ydCBzdHJlYW0gdG8gTWVkaWFMaXZlICovXG4gIFVEUF9QVVNIID0gJ1VEUF9QVVNIJyxcbiAgLyoqIFB1c2ggYW4gUlRQIHRyYW5zcG9ydCBzdHJlYW0gdG8gTWVkaWFMaXZlICovXG4gIFJUUF9QVVNIID0gJ1JUUF9QVVNIJyxcbiAgLyoqIFB1c2ggYW4gUlRNUCBzdHJlYW0gdG8gTWVkaWFMaXZlICovXG4gIFJUTVBfUFVTSCA9ICdSVE1QX1BVU0gnLFxuICAvKiogUHVsbCBhbiBSVE1QIHN0cmVhbSBmcm9tIGEgc2VydmVyICovXG4gIFJUTVBfUFVMTCA9ICdSVE1QX1BVTEwnLFxuICAvKiogUHVsbCBITFMgb3IgVFMgY29udGVudCBmcm9tIGEgVVJMICovXG4gIFVSTF9QVUxMID0gJ1VSTF9QVUxMJyxcbiAgLyoqIFB1bGwgYW4gTVA0IGZpbGUgZnJvbSBhIFVSTCAqL1xuICBNUDRfRklMRSA9ICdNUDRfRklMRScsXG4gIC8qKiBSZWNlaXZlIGNvbnRlbnQgZnJvbSBBV1MgRWxlbWVudGFsIE1lZGlhQ29ubmVjdCAqL1xuICBNRURJQUNPTk5FQ1QgPSAnTUVESUFDT05ORUNUJyxcbiAgLyoqIFJlY2VpdmUgY29udGVudCBmcm9tIGFuIEVsZW1lbnRhbCBMaW5rIGRldmljZSAqL1xuICBJTlBVVF9ERVZJQ0UgPSAnSU5QVVRfREVWSUNFJyxcbiAgLyoqIFJlY2VpdmUgdW5jb21wcmVzc2VkIGNvbnRlbnQgdmlhIEFXUyBDREkgKi9cbiAgQVdTX0NESSA9ICdBV1NfQ0RJJyxcbiAgLyoqIFB1bGwgYSBUUyBmaWxlIGZyb20gYSBVUkwgKi9cbiAgVFNfRklMRSA9ICdUU19GSUxFJyxcbiAgLyoqIFB1bGwgY29udGVudCBmcm9tIGFuIFNSVCBzb3VyY2UgKGNhbGxlciBtb2RlKSAqL1xuICBTUlRfQ0FMTEVSID0gJ1NSVF9DQUxMRVInLFxuICAvKiogUmVjZWl2ZSBjb250ZW50IHB1c2hlZCB2aWEgU1JUIChsaXN0ZW5lciBtb2RlKSAqL1xuICBTUlRfTElTVEVORVIgPSAnU1JUX0xJU1RFTkVSJyxcbiAgLyoqIFJlY2VpdmUgbXVsdGljYXN0IGNvbnRlbnQuIFJlcXVpcmVzIGBhbnl3aGVyZVNldHRpbmdzYCBvbiB0aGUgTWVkaWFMaXZlIENoYW5uZWwuICovXG4gIE1VTFRJQ0FTVCA9ICdNVUxUSUNBU1QnLFxuICAvKiogUmVjZWl2ZSBjb250ZW50IHZpYSBTTVBURSAyMTEwLiBSZXF1aXJlcyBgYW55d2hlcmVTZXR0aW5nc2Agb24gdGhlIE1lZGlhTGl2ZSBDaGFubmVsLiAqL1xuICBTTVBURV8yMTEwX1JFQ0VJVkVSX0dST1VQID0gJ1NNUFRFXzIxMTBfUkVDRUlWRVJfR1JPVVAnLFxuICAvKiogUmVjZWl2ZSBjb250ZW50IGZyb20gYW4gU0RJIHNvdXJjZS4gUmVxdWlyZXMgYGFueXdoZXJlU2V0dGluZ3NgIG9uIHRoZSBNZWRpYUxpdmUgQ2hhbm5lbC4gKi9cbiAgU0RJID0gJ1NESScsXG4gIC8qKiBSZWNlaXZlIGNvbnRlbnQgZnJvbSBhIE1lZGlhQ29ubmVjdCByb3V0ZXIgKi9cbiAgTUVESUFDT05ORUNUX1JPVVRFUiA9ICdNRURJQUNPTk5FQ1RfUk9VVEVSJyxcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhIFVSTC1iYXNlZCBpbnB1dCBzb3VyY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5wdXRTb3VyY2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB1c2VybmFtZSBmb3IgYWNjZXNzaW5nIHRoZSB1cHN0cmVhbSBzeXN0ZW0uXG4gICAqIEBkZWZhdWx0IC0gbm8gdXNlcm5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHVzZXJuYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIFNTTSBwYXJhbWV0ZXIgdGhhdCBob2xkcyB0aGUgcGFzc3dvcmQgZm9yIGFjY2Vzc2luZyB0aGUgdXBzdHJlYW0gc3lzdGVtLlxuICAgKiBAZGVmYXVsdCAtIG5vIHBhc3N3b3JkXG4gICAqL1xuICByZWFkb25seSBwYXNzd29yZD86IElTdHJpbmdQYXJhbWV0ZXI7XG59XG5cbi8qKlxuICogQSBzb3VyY2UgZm9yIGEgcHVsbC10eXBlIGlucHV0LiBVc2UgdGhlIHN0YXRpYyBmYWN0b3J5IG1ldGhvZHMgdG8gY3JlYXRlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSW5wdXRTb3VyY2Uge1xuICAvKipcbiAgICogQ3JlYXRlIGEgc291cmNlIGZyb20gYSBVUkwuXG4gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCB3aGVyZSBNZWRpYUxpdmUgcHVsbHMgdGhlIHNvdXJjZSBjb250ZW50IGZyb20uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1cmwodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBJbnB1dFNvdXJjZU9wdGlvbnMpOiBJbnB1dFNvdXJjZSB7XG4gICAgcmV0dXJuIG5ldyBVcmxJbnB1dFNvdXJjZSh1cmwsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHNvdXJjZSBmcm9tIGFuIFMzIGJ1Y2tldC4gQXV0b21hdGljYWxseSBncmFudHMgcmVhZCBhY2Nlc3NcbiAgICogdG8gdGhlIGNoYW5uZWwncyByb2xlLlxuICAgKlxuICAgKiBAcGFyYW0gYnVja2V0IFRoZSBTMyBidWNrZXQgY29udGFpbmluZyB0aGUgc291cmNlIGZpbGUuXG4gICAqIEBwYXJhbSBrZXkgVGhlIG9iamVjdCBrZXkgd2l0aGluIHRoZSBidWNrZXQgKGUuZy4gJ3ZpZGVvcy9pbnRyby5tcDQnKS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUJ1Y2tldChidWNrZXQ6IElCdWNrZXQsIGtleTogc3RyaW5nKTogSW5wdXRTb3VyY2Uge1xuICAgIHJldHVybiBuZXcgUzNJbnB1dFNvdXJjZShidWNrZXQsIGtleSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfYmluZCgpOiB7IHVybDogc3RyaW5nOyB1c2VybmFtZT86IHN0cmluZzsgcGFzc3dvcmRQYXJhbT86IHN0cmluZyB9O1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9ncmFudFJlYWQoX3JvbGU6IElSb2xlKTogdm9pZCB7fVxufVxuXG4vKiogQGludGVybmFsICovXG5jbGFzcyBVcmxJbnB1dFNvdXJjZSBleHRlbmRzIElucHV0U291cmNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB1cmw6IHN0cmluZywgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zPzogSW5wdXRTb3VyY2VPcHRpb25zKSB7IHN1cGVyKCk7IH1cbiAgcHVibGljIF9iaW5kKCkge1xuICAgIHJldHVybiB7IHVybDogdGhpcy51cmwsIHVzZXJuYW1lOiB0aGlzLm9wdGlvbnM/LnVzZXJuYW1lLCBwYXNzd29yZFBhcmFtOiB0aGlzLm9wdGlvbnM/LnBhc3N3b3JkPy5wYXJhbWV0ZXJOYW1lIH07XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIF9ncmFudFJlYWQocm9sZTogSVJvbGUpOiB2b2lkIHtcbiAgICAvLyBNZWRpYUxpdmUgcmVhZHMgdGhlIHBhc3N3b3JkIGZyb20gU1NNIFBhcmFtZXRlciBTdG9yZSBhdCBjaGFubmVsIHJ1bnRpbWUsIHNvIHRoZVxuICAgIC8vIGNoYW5uZWwgcm9sZSBuZWVkcyByZWFkIGFjY2VzcyB0byB0aGUgcGFyYW1ldGVyIChzY29wZWQgdG8gdGhlIHBhcmFtZXRlciBBUk4pLlxuICAgIHRoaXMub3B0aW9ucz8ucGFzc3dvcmQ/LmdyYW50UmVhZChyb2xlKTtcbiAgfVxufVxuXG4vKiogQGludGVybmFsICovXG5jbGFzcyBTM0lucHV0U291cmNlIGV4dGVuZHMgSW5wdXRTb3VyY2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYnVja2V0OiBJQnVja2V0LCBrZXk6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy51cmwgPSBgczNzc2w6Ly8ke2J1Y2tldC5idWNrZXROYW1lfS8ke2tleX1gO1xuICB9XG4gIHB1YmxpYyBfYmluZCgpIHtcbiAgICByZXR1cm4geyB1cmw6IHRoaXMudXJsIH07XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIF9ncmFudFJlYWQocm9sZTogSVJvbGUpOiB2b2lkIHtcbiAgICB0aGlzLmJ1Y2tldC5ncmFudFJlYWQocm9sZSk7XG4gIH1cbn1cblxuLyoqIFByb3BlcnRpZXMgZm9yIGEgTWVkaWFDb25uZWN0IHJvdXRlciBpbnB1dC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVkaWFDb25uZWN0Um91dGVySW5wdXRQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgYXZhaWxhYmlsaXR5IHpvbmVzIGZvciB0aGUgcm91dGVyIGlucHV0IHBpcGVsaW5lcy5cbiAgICpcbiAgICogUHJvdmlkZSBvbmUgQVogZm9yIGEgc2luZ2xlIHBpcGVsaW5lLCBvciB0d28gZm9yIHJlZHVuZGFudCBwaXBlbGluZXMuXG4gICAqIElmIG9taXR0ZWQsIGRlZmF1bHRzIHRvIHRoZSBzdGFjaydzIGZpcnN0IGF2YWlsYWJpbGl0eSB6b25lIChzaW5nbGUgcGlwZWxpbmUpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHNpbmdsZSBwaXBlbGluZSB1c2luZyB0aGUgc3RhY2sncyBmaXJzdCBhdmFpbGFiaWxpdHkgem9uZVxuICAgKi9cbiAgcmVhZG9ubHkgYXZhaWxhYmlsaXR5Wm9uZXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IGZvciBjdXN0b20gZW5jcnlwdGlvbi5cbiAgICogSWYgbm90IHByb3ZpZGVkLCBhdXRvbWF0aWMgZW5jcnlwdGlvbiBpcyB1c2VkLlxuICAgKiBAZGVmYXVsdCAtIGF1dG9tYXRpYyBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uU2VjcmV0PzogSVNlY3JldDtcbn1cblxuLyoqIFByb3BlcnRpZXMgZm9yIGEgTWVkaWFDb25uZWN0IGlucHV0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZWRpYUNvbm5lY3RJbnB1dFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBNZWRpYUNvbm5lY3QgZmxvd3MgdG8gdXNlIGFzIHNvdXJjZXMgKG9uZSwgb3IgdHdvIGZvciBwaXBlbGluZSByZWR1bmRhbmN5KS5cbiAgICovXG4gIHJlYWRvbmx5IGZsb3dzOiBJRmxvd1JlZltdO1xuICAvKipcbiAgICogVGhlIElBTSByb2xlIE1lZGlhTGl2ZSB1c2VzIHRvIG1hbmFnZSB0aGUgb3V0cHV0IGl0IGFkZHMgdG8gdGhlIGZsb3cgZm9yIHRoaXMgaW5wdXQuXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgYSByb2xlIGlzIGNyZWF0ZWQgYW5kIGdyYW50ZWQgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zLlxuICAgKiBXaGVuIHlvdSBwcm92aWRlIGEgcm9sZSwgbm8gcGVybWlzc2lvbnMgYXJlIGFkZGVkIOKAlCB5b3Ugb3duIGFsbCB0aGUgcGVybWlzc2lvbnMgaXQgbmVlZHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSByb2xlIGlzIGNyZWF0ZWQgd2l0aCB0aGUgbWVkaWFsaXZlLmFtYXpvbmF3cy5jb20gc2VydmljZSBwcmluY2lwYWxcbiAgICpcbiAgICogW2Rpc2FibGUtYXdzbGludDpwcmVmZXItcmVmLWludGVyZmFjZV1cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBJUm9sZTtcbn1cblxuLyoqIFByb3BlcnRpZXMgZm9yIGFuIFNSVCBjYWxsZXIgaW5wdXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNydENhbGxlclNvdXJjZVByb3BzIHtcbiAgLyoqIFRoZSBhZGRyZXNzIG9mIHRoZSBTUlQgbGlzdGVuZXIgdG8gY29ubmVjdCB0by4gKi9cbiAgcmVhZG9ubHkgc3J0TGlzdGVuZXJBZGRyZXNzOiBzdHJpbmc7XG4gIC8qKiBUaGUgcG9ydCBvZiB0aGUgU1JUIGxpc3RlbmVyLiAqL1xuICByZWFkb25seSBzcnRMaXN0ZW5lclBvcnQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIGxhdGVuY3kuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBtaW5pbXVtTGF0ZW5jeT86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIHN0cmVhbSBJRCBmb3IgdGhlIFNSVCBjb25uZWN0aW9uLlxuICAgKiBAZGVmYXVsdCAtIG5vIHN0cmVhbSBJRFxuICAgKi9cbiAgcmVhZG9ubHkgc3RyZWFtSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEZWNyeXB0aW9uIHNldHRpbmdzIGZvciB0aGUgU1JUIGNvbm5lY3Rpb24uXG4gICAqIEBkZWZhdWx0IC0gbm8gZGVjcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVjcnlwdGlvbj86IFNydERlY3J5cHRpb25Qcm9wcztcbn1cblxuLyoqIFRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobSBmb3IgU1JUIGRlY3J5cHRpb24uICovXG5leHBvcnQgY2xhc3MgU3J0RGVjcnlwdGlvbkFsZ29yaXRobSB7XG4gIC8qKiBBRVMtMTI4LiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFFUzEyOCA9IG5ldyBTcnREZWNyeXB0aW9uQWxnb3JpdGhtKCdBRVMxMjgnKTtcbiAgLyoqIEFFUy0xOTIuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQUVTMTkyID0gbmV3IFNydERlY3J5cHRpb25BbGdvcml0aG0oJ0FFUzE5MicpO1xuICAvKiogQUVTLTI1Ni4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBBRVMyNTYgPSBuZXcgU3J0RGVjcnlwdGlvbkFsZ29yaXRobSgnQUVTMjU2Jyk7XG5cbiAgLyoqIEEgdmFsdWUgbm90IHlldCBtb2RlbGxlZCBieSBBV1MgQ0RLLiAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBTcnREZWNyeXB0aW9uQWxnb3JpdGhtIHtcbiAgICByZXR1cm4gbmV3IFNydERlY3J5cHRpb25BbGdvcml0aG0odmFsdWUpO1xuICB9XG5cbiAgLyoqIFRoZSB1bmRlcmx5aW5nIHN0cmluZyB2YWx1ZSBwYXNzZWQgdG8gQ2xvdWRGb3JtYXRpb24uICovXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxufVxuXG4vKiogUHJvcGVydGllcyBmb3IgU1JUIGRlY3J5cHRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFNydERlY3J5cHRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgZW5jcnlwdGlvbiBhbGdvcml0aG0uXG4gICAqIEBkZWZhdWx0IC0gbm8gYWxnb3JpdGhtXG4gICAqL1xuICByZWFkb25seSBhbGdvcml0aG0/OiBTcnREZWNyeXB0aW9uQWxnb3JpdGhtO1xuICAvKipcbiAgICogVGhlIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgY29udGFpbmluZyB0aGUgcGFzc3BocmFzZSB1c2VkIHRvIGRlY3J5cHQgdGhlIGNvbnRlbnQuXG4gICAqIEBkZWZhdWx0IC0gbm8gcGFzc3BocmFzZVxuICAgKi9cbiAgcmVhZG9ubHkgcGFzc3BocmFzZVNlY3JldD86IElTZWNyZXQ7XG59XG5cbi8qKiBQcm9wZXJ0aWVzIGZvciBhbiBTUlQgbGlzdGVuZXIgaW5wdXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNydExpc3RlbmVySW5wdXRQcm9wcyB7XG4gIC8qKlxuICAgKiBEZWNyeXB0aW9uIHNldHRpbmdzIGZvciB0aGUgU1JUIGNvbm5lY3Rpb24uXG4gICAqIEBkZWZhdWx0IC0gbm8gZGVjcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVjcnlwdGlvbj86IFNydERlY3J5cHRpb25Qcm9wcztcbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIGxhdGVuY3kuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBtaW5pbXVtTGF0ZW5jeT86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIHN0cmVhbSBJRCB0aGF0IHRoZSB1cHN0cmVhbSBzeXN0ZW0gdXNlcyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhpcyBsaXN0ZW5lci5cbiAgICogQGRlZmF1bHQgLSBubyBzdHJlYW0gSURcbiAgICovXG4gIHJlYWRvbmx5IHN0cmVhbUlkPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGlucHV0IHNlY3VyaXR5IGdyb3Vwcy4gUmVxdWlyZWQgZm9yIFNSVCBsaXN0ZW5lciBpbnB1dHMuXG4gICAqL1xuICByZWFkb25seSBpbnB1dFNlY3VyaXR5R3JvdXBzOiBJSW5wdXRTZWN1cml0eUdyb3VwUmVmW107XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBTVEFOREFSRCAodHdvLXBpcGVsaW5lKSBvciBTSU5HTEVfUElQRUxJTkUgaW5wdXQuIEEgU1RBTkRBUkQgaW5wdXQgY3JlYXRlc1xuICAgKiB0d28gbGlzdGVuZXIgZW5kcG9pbnRzIGZvciBwaXBlbGluZSByZWR1bmRhbmN5LlxuICAgKiBAZGVmYXVsdCBDaGFubmVsQ2xhc3MuU0lOR0xFX1BJUEVMSU5FXG4gICAqL1xuICByZWFkb25seSBpbnB1dENsYXNzPzogQ2hhbm5lbENsYXNzO1xufVxuXG4vKiogUHJvcGVydGllcyBmb3IgYW4gRWxlbWVudGFsIExpbmsgaW5wdXQgZGV2aWNlIGlucHV0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnB1dERldmljZUlucHV0UHJvcHMge1xuICAvKiogVGhlIElEcyBvZiBvbmUgb3IgdHdvIHJlZ2lzdGVyZWQgRWxlbWVudGFsIExpbmsgZGV2aWNlcy4gVHdvIHByb3ZpZGVzIHBpcGVsaW5lIHJlZHVuZGFuY3kuICovXG4gIHJlYWRvbmx5IGRldmljZUlkczogc3RyaW5nW107XG59XG5cbi8qKiBUaGUgdHJhbnNwb3J0IHByb3RvY29sIGZvciBhIG11bHRpY2FzdCBzb3VyY2UuICovXG5leHBvcnQgY2xhc3MgTXVsdGljYXN0UHJvdG9jb2wge1xuICAvKiogVURQIHRyYW5zcG9ydC4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBVRFAgPSBuZXcgTXVsdGljYXN0UHJvdG9jb2woJ3VkcCcpO1xuICAvKiogUlRQIHRyYW5zcG9ydC4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBSVFAgPSBuZXcgTXVsdGljYXN0UHJvdG9jb2woJ3J0cCcpO1xuXG4gIC8qKiBBIHZhbHVlIG5vdCB5ZXQgbW9kZWxsZWQgYnkgQVdTIENESy4gKi9cbiAgcHVibGljIHN0YXRpYyBvZih2YWx1ZTogc3RyaW5nKTogTXVsdGljYXN0UHJvdG9jb2wge1xuICAgIHJldHVybiBuZXcgTXVsdGljYXN0UHJvdG9jb2wodmFsdWUpO1xuICB9XG5cbiAgLyoqIFRoZSB1bmRlcmx5aW5nIHN0cmluZyB2YWx1ZSBwYXNzZWQgdG8gQ2xvdWRGb3JtYXRpb24uICovXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxufVxuXG4vKiogQSBzb3VyY2UgZm9yIGEgbXVsdGljYXN0IGlucHV0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdWx0aWNhc3RJbnB1dFNvdXJjZSB7XG4gIC8qKiBUaGUgbXVsdGljYXN0IGdyb3VwIGFkZHJlc3MuICovXG4gIHJlYWRvbmx5IGFkZHJlc3M6IHN0cmluZztcbiAgLyoqIFRoZSBtdWx0aWNhc3QgcG9ydC4gKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHRyYW5zcG9ydCBwcm90b2NvbC5cbiAgICogQGRlZmF1bHQgTXVsdGljYXN0UHJvdG9jb2wuVURQXG4gICAqL1xuICByZWFkb25seSBwcm90b2NvbD86IE11bHRpY2FzdFByb3RvY29sO1xuICAvKipcbiAgICogRmlsdGVyIHRvIGEgc3BlY2lmaWMgc291cmNlIElQIChzb3VyY2Utc3BlY2lmaWMgbXVsdGljYXN0KS5cbiAgICogQGRlZmF1bHQgLSBhY2NlcHQgYW55IHNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlSXA/OiBzdHJpbmc7XG59XG5cbi8qKiBQcm9wZXJ0aWVzIGZvciBhIG11bHRpY2FzdCBpbnB1dC4gUmVxdWlyZXMgYGFueXdoZXJlU2V0dGluZ3NgIG9uIHRoZSBjaGFubmVsLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdWx0aWNhc3RJbnB1dFByb3BzIHtcbiAgLyoqIFRoZSBtdWx0aWNhc3Qgc291cmNlcy4gUHJvdmlkZSB0d28gZm9yIGEgU1RBTkRBUkQgKHJlZHVuZGFudC1waXBlbGluZSkgY2hhbm5lbC4gKi9cbiAgcmVhZG9ubHkgc291cmNlczogTXVsdGljYXN0SW5wdXRTb3VyY2VbXTtcbn1cblxuLyoqIEEgcmVmZXJlbmNlIHRvIGFuIFNEUCBmaWxlIHRoYXQgZGVzY3JpYmVzIGEgU01QVEUgMjExMCBzdHJlYW0gdG8gaW5nZXN0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbXB0ZTIxMTBTZHBMb2NhdGlvbiB7XG4gIC8qKiBUaGUgVVJMIG9mIHRoZSBTRFAgZmlsZS4gKi9cbiAgcmVhZG9ubHkgc2RwVXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgdGhlIG1lZGlhIHN0cmVhbSB3aXRoaW4gdGhlIFNEUCB0byBpbmdlc3QuIFVzZSB3aGVuIHRoZSBTRFAgZGVzY3JpYmVzXG4gICAqIG1vcmUgdGhhbiBvbmUgc3RyZWFtIG9mIHRoYXQgbWVkaWEgdHlwZS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IG1lZGlhSW5kZXg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBTTVBURSAyMTEwIHJlY2VpdmVyIGdyb3VwIGlucHV0LiBSZXF1aXJlcyBgYW55d2hlcmVTZXR0aW5nc2Agb24gdGhlIGNoYW5uZWwuXG4gKlxuICogWW91IHNwZWNpZnkgdGhlIFNEUCBmaWxlcyB0aGF0IGRlc2NyaWJlIHRoZSBzdHJlYW1zIHRvIGluZ2VzdCDigJQgb25lIHZpZGVvIFNEUCwgYW5kIGFueVxuICogbnVtYmVyIG9mIGF1ZGlvIGFuZCBhbmNpbGxhcnkgU0RQcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbXB0ZTIxMTBJbnB1dFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBTRFAgZGVzY3JpYmluZyB0aGUgdmlkZW8gc3RyZWFtLlxuICAgKiBAZGVmYXVsdCAtIG5vIHZpZGVvIHN0cmVhbVxuICAgKi9cbiAgcmVhZG9ubHkgdmlkZW9TZHA/OiBTbXB0ZTIxMTBTZHBMb2NhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBTRFBzIGRlc2NyaWJpbmcgdGhlIGF1ZGlvIHN0cmVhbXMuIFVwIHRvIDUwLlxuICAgKiBAZGVmYXVsdCAtIG5vIGF1ZGlvIHN0cmVhbXNcbiAgICovXG4gIHJlYWRvbmx5IGF1ZGlvU2Rwcz86IFNtcHRlMjExMFNkcExvY2F0aW9uW107XG4gIC8qKlxuICAgKiBUaGUgU0RQcyBkZXNjcmliaW5nIHRoZSBhbmNpbGxhcnkgZGF0YSBzdHJlYW1zIChTQ1RFLTM1IG9yIGNhcHRpb25zKS4gVXAgdG8gNTAuXG4gICAqIEBkZWZhdWx0IC0gbm8gYW5jaWxsYXJ5IGRhdGEgc3RyZWFtc1xuICAgKi9cbiAgcmVhZG9ubHkgYW5jaWxsYXJ5U2Rwcz86IFNtcHRlMjExMFNkcExvY2F0aW9uW107XG59XG5cbi8qKiBQcm9wZXJ0aWVzIGZvciBhIENESSAodW5jb21wcmVzc2VkKSBpbnB1dC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RpSW5wdXRQcm9wcyB7XG4gIC8qKlxuICAgKiBUd28gVlBDIHN1Ym5ldHMsIGluIHR3byBkaWZmZXJlbnQgYXZhaWxhYmlsaXR5IHpvbmVzLCBmb3IgdGhlIENESSBpbnB1dCBuZXR3b3JrIGludGVyZmFjZXMuXG4gICAqL1xuICByZWFkb25seSBzdWJuZXRzOiBJU3VibmV0UmVmW107XG4gIC8qKlxuICAgKiBTZWN1cml0eSBncm91cHMgdG8gYXR0YWNoIHRvIHRoZSBDREkgaW5wdXQgbmV0d29yayBpbnRlcmZhY2VzLlxuICAgKiBAZGVmYXVsdCAtIFZQQyBkZWZhdWx0IHNlY3VyaXR5IGdyb3VwXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3Vwcz86IElTZWN1cml0eUdyb3VwUmVmW107XG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgTWVkaWFMaXZlIGFzc3VtZXMgdG8gY3JlYXRlIG5ldHdvcmsgaW50ZXJmYWNlcyBpbiB0aGUgVlBDLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGEgcm9sZSBpcyBjcmVhdGVkIGFuZCBncmFudGVkIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucy5cbiAgICogV2hlbiB5b3UgcHJvdmlkZSBhIHJvbGUsIG5vIHBlcm1pc3Npb25zIGFyZSBhZGRlZCDigJQgeW91IG93biBhbGwgdGhlIHBlcm1pc3Npb25zIGl0IG5lZWRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgcm9sZSBpcyBjcmVhdGVkIHdpdGggdGhlIG1lZGlhbGl2ZS5hbWF6b25hd3MuY29tIHNlcnZpY2UgcHJpbmNpcGFsXG4gICAqXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6cHJlZmVyLXJlZi1pbnRlcmZhY2VdXG4gICAqL1xuICByZWFkb25seSByb2xlPzogSVJvbGU7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgcHVzaC10eXBlIGlucHV0cyAoUlRNUF9QVVNILCBSVFBfUFVTSCwgVURQX1BVU0gpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFB1c2hJbnB1dFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBzZWN1cml0eSBncm91cHMgdGhhdCBjb250cm9sIHdoaWNoIENJRFIgYmxvY2tzIGNhbiBwdXNoIHRvIHRoaXMgaW5wdXQuIFJlcXVpcmVkIGZvclxuICAgKiBjbG91ZCBpbnB1dHM7IG11c3QgYmUgb21pdHRlZCBmb3Igb24tcHJlbWlzZXMgaW5wdXRzIChgSW5wdXROZXR3b3JrTG9jYXRpb24uT05fUFJFTUlTRVNgKSxcbiAgICogd2hpY2ggZG8gbm90IHN1cHBvcnQgc2VjdXJpdHkgZ3JvdXBzLlxuICAgKiBAZGVmYXVsdCAtIG5vbmUgKG9ubHkgdmFsaWQgZm9yIG9uLXByZW1pc2VzIGlucHV0cylcbiAgICovXG4gIHJlYWRvbmx5IGlucHV0U2VjdXJpdHlHcm91cHM/OiBJSW5wdXRTZWN1cml0eUdyb3VwUmVmW107XG4gIC8qKlxuICAgKiBUaGUgZGVzdGluYXRpb25zIGZvciBwdXNoIGlucHV0cy4gRm9yIFJUTVAgcHVzaCwgZWFjaCBkZXN0aW5hdGlvbiBjYW4gaGF2ZSBhIHN0cmVhbSBuYW1lLlxuICAgKiBAZGVmYXVsdCAtIE1lZGlhTGl2ZSBhdXRvLWdlbmVyYXRlcyBkZXN0aW5hdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9ucz86IFB1c2hJbnB1dERlc3RpbmF0aW9uW107XG59XG5cbi8qKlxuICogQSBkZXN0aW5hdGlvbiBmb3IgYSBwdXNoLXR5cGUgaW5wdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVzaElucHV0RGVzdGluYXRpb24ge1xuICAvKipcbiAgICogVGhlIHN0cmVhbSBuYW1lIGZvciBSVE1QIHB1c2ggZGVzdGluYXRpb25zIChhcHBsaWNhdGlvbiBuYW1lL2luc3RhbmNlKS5cbiAgICogQGRlZmF1bHQgLSBhdXRvLWdlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgc3RyZWFtTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBNZWRpYUxpdmUgQW55d2hlcmUgbmV0d29yayB0aGlzIHB1c2ggZGVzdGluYXRpb24gbGl2ZXMgb24uIFJlcXVpcmVkIHdoZW4gdGhlIGlucHV0J3NcbiAgICogYGlucHV0TmV0d29ya0xvY2F0aW9uYCBpcyBgT05fUFJFTUlTRVNgLlxuICAgKiBAZGVmYXVsdCAtIEFXUy1tYW5hZ2VkIG5ldHdvcmtcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcms/OiBJTmV0d29ya1JlZjtcbiAgLyoqXG4gICAqIFRoZSByb3V0ZXMgdG8gdGhlIHB1c2ggZGVzdGluYXRpb24gb24gdGhlIGxvY2FsIG5ldHdvcmsuIFJlcXVpcmVkIGZvclxuICAgKiBvbi1wcmVtaXNlcyAoYE9OX1BSRU1JU0VTYCkgcHVzaCBpbnB1dHMuXG4gICAqIEBkZWZhdWx0IC0gbm8gcm91dGVzXG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrUm91dGVzPzogTmV0d29ya1JvdXRlW107XG4gIC8qKlxuICAgKiBBIHN0YXRpYyBJUCBhZGRyZXNzIHRvIGFzc2lnbiB0byB0aGUgcHVzaCBkZXN0aW5hdGlvbiBvbiB0aGUgbG9jYWwgbmV0d29yay5cbiAgICogQGRlZmF1bHQgLSBNZWRpYUxpdmUgQW55d2hlcmUgdXNlcyBvbmUgZnJvbSB0aGUgSVAgcG9vbCBzcGVjaWZpZWQgb24gdGhlIHNlbGVjdGVkIG5ldHdvcmsgKHNlcnZpY2UgZGVmYXVsdClcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRpY0lwQWRkcmVzcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBCaW5kIHB1c2gtaW5wdXQgZGVzdGluYXRpb25zIHRvIHRoZWlyIENGTiBzaGFwZS5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBiaW5kUHVzaERlc3RpbmF0aW9ucyhkZXN0aW5hdGlvbnM/OiBQdXNoSW5wdXREZXN0aW5hdGlvbltdKTogQ2ZuSW5wdXQuSW5wdXREZXN0aW5hdGlvblJlcXVlc3RQcm9wZXJ0eVtdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGRlc3RpbmF0aW9ucz8ubWFwKGQgPT4gKHtcbiAgICBzdHJlYW1OYW1lOiBkLnN0cmVhbU5hbWUsXG4gICAgbmV0d29yazogZC5uZXR3b3JrPy5uZXR3b3JrUmVmLm5ldHdvcmtJZCxcbiAgICBuZXR3b3JrUm91dGVzOiBkLm5ldHdvcmtSb3V0ZXM/Lm1hcChyID0+ICh7IGNpZHI6IHIuY2lkciwgZ2F0ZXdheTogci5nYXRld2F5IH0pKSxcbiAgICBzdGF0aWNJcEFkZHJlc3M6IGQuc3RhdGljSXBBZGRyZXNzLFxuICB9KSk7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgYmluZCByZXN1bHQgZm9yIElucHV0Q29uZmlndXJhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG5pbnRlcmZhY2UgSW5wdXRCaW5kQ29uZmlnIHtcbiAgcmVhZG9ubHkgdHlwZTogSW5wdXRUeXBlO1xuICByZWFkb25seSBpbnB1dENsYXNzPzogc3RyaW5nO1xuICByZWFkb25seSBpbnB1dFNvdXJjZXM/OiBJbnB1dFNvdXJjZVtdO1xuICByZWFkb25seSBzb3VyY2VzPzogQ2ZuSW5wdXQuSW5wdXRTb3VyY2VSZXF1ZXN0UHJvcGVydHlbXTtcbiAgcmVhZG9ubHkgZGVzdGluYXRpb25zPzogQ2ZuSW5wdXQuSW5wdXREZXN0aW5hdGlvblJlcXVlc3RQcm9wZXJ0eVtdO1xuICByZWFkb25seSBtZWRpYUNvbm5lY3RGbG93cz86IENmbklucHV0Lk1lZGlhQ29ubmVjdEZsb3dSZXF1ZXN0UHJvcGVydHlbXTtcbiAgcmVhZG9ubHkgaW5wdXREZXZpY2VzPzogQ2ZuSW5wdXQuSW5wdXREZXZpY2VTZXR0aW5nc1Byb3BlcnR5W107XG4gIHJlYWRvbmx5IG11bHRpY2FzdFNldHRpbmdzPzogQ2ZuSW5wdXQuTXVsdGljYXN0U2V0dGluZ3NDcmVhdGVSZXF1ZXN0UHJvcGVydHk7XG4gIHJlYWRvbmx5IHNtcHRlMjExMFJlY2VpdmVyR3JvdXBTZXR0aW5ncz86IENmbklucHV0LlNtcHRlMjExMFJlY2VpdmVyR3JvdXBTZXR0aW5nc1Byb3BlcnR5O1xuICByZWFkb25seSByb3V0ZXJTZXR0aW5ncz86IENmbklucHV0LlJvdXRlclNldHRpbmdzUHJvcGVydHk7XG4gIHJlYWRvbmx5IHNydFNldHRpbmdzPzogQ2ZuSW5wdXQuU3J0U2V0dGluZ3NSZXF1ZXN0UHJvcGVydHk7XG4gIHJlYWRvbmx5IHNkaVNvdXJjZXM/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgdnBjPzogQ2ZuSW5wdXQuSW5wdXRWcGNSZXF1ZXN0UHJvcGVydHk7XG4gIHJlYWRvbmx5IHJvbGVBcm4/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlucHV0U2VjdXJpdHlHcm91cHM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSByb2xlIChhbmQgdGhlIGZsb3dzIGl0IG11c3QgbWFuYWdlKSBmb3IgYSBNZWRpYUNvbm5lY3QgZmxvdyBpbnB1dC4gTWVkaWFMaXZlXG4gICAqIGFzc3VtZXMgdGhpcyByb2xlIGF0IGlucHV0IGNyZWF0ZS9kZWxldGUgdGltZSB0byBhZGQvcmVtb3ZlIG91dHB1dHMgb24gdGhlIGZsb3dzLFxuICAgKiBzbyBpdCdzIGdyYW50ZWQgdGhlIGBtZWRpYWNvbm5lY3Q6TWFuYWdlZCpgIGZsb3ctbWFuYWdlbWVudCBhY3Rpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVkaWFDb25uZWN0Rmxvd0dyYW50PzogTWVkaWFDb25uZWN0Rmxvd0dyYW50O1xuICAvKipcbiAgICogVGhlIHJvbGUgYW5kIFZQQyBzY29wZSBmb3IgYSBDREkvVlBDIGlucHV0LiBNZWRpYUxpdmUgYXNzdW1lcyB0aGlzIHJvbGUgdG8gY3JlYXRlIHRoZVxuICAgKiBpbnB1dCdzIG5ldHdvcmsgaW50ZXJmYWNlcywgc28gaXQncyBncmFudGVkIHRoZSBFQzIgRU5JIGFjdGlvbnMgc2NvcGVkIHRvIHRoZSBWUEMuXG4gICAqL1xuICByZWFkb25seSB2cGNSb2xlR3JhbnQ/OiBWcGNJbnB1dFJvbGVHcmFudDtcbn1cblxuLyoqXG4gKiBUaGUgaW5wdXQgcm9sZSBhbmQgVlBDIHNjb3BlIGZvciBhIENESS9WUEMgaW5wdXQncyBFQzIgRU5JIGF1dG8tZ3JhbnQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuaW50ZXJmYWNlIFZwY0lucHV0Um9sZUdyYW50IHtcbiAgcmVhZG9ubHkgcm9sZTogSVJvbGU7XG4gIHJlYWRvbmx5IHN1Ym5ldElkczogc3RyaW5nW107XG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBJZHM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBpbnB1dCByb2xlIGZvciBhIE1lZGlhQ29ubmVjdCBmbG93IGlucHV0J3MgYXV0by1ncmFudC5cbiAqIEBpbnRlcm5hbFxuICovXG5pbnRlcmZhY2UgTWVkaWFDb25uZWN0Rmxvd0dyYW50IHtcbiAgcmVhZG9ubHkgcm9sZTogSVJvbGU7XG59XG5cbi8qKlxuICogQmluZCBhIFNNUFRFIDIxMTAgU0RQIGxvY2F0aW9uIHRvIGl0cyBDRk4gc2hhcGUuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gYmluZFNkcExvY2F0aW9uKGxvYzogU21wdGUyMTEwU2RwTG9jYXRpb24pOiBDZm5JbnB1dC5JbnB1dFNkcExvY2F0aW9uUHJvcGVydHkge1xuICByZXR1cm4geyBzZHBVcmw6IGxvYy5zZHBVcmwsIG1lZGlhSW5kZXg6IGxvYy5tZWRpYUluZGV4IH07XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgaW5wdXQgY29uZmlndXJhdGlvbiBmb3IgYSBNZWRpYUxpdmUgSW5wdXQuXG4gKlxuICogVXNlIHRoZSBzdGF0aWMgZmFjdG9yeSBtZXRob2RzIHRvIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgY29uZmlndXJhdGlvbiBmb3IgeW91ciBpbnB1dCB0eXBlLlxuICovXG5leHBvcnQgY2xhc3MgSW5wdXRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIFVSTCBwdWxsIGlucHV0IGZvciBITFMgb3IgVFMgc3RyZWFtcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICAgSW5wdXRDb25maWd1cmF0aW9uLnVybFB1bGwoW1xuICAgKiAgICAgIElucHV0U291cmNlLnVybCgnaHR0cHM6Ly9leGFtcGxlLmNvbS9zdHJlYW0ubTN1OCcpLFxuICAgKiAgICBdKTtcbiAgICpcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdXJsUHVsbChzb3VyY2VzOiBJbnB1dFNvdXJjZVtdKTogSW5wdXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gSW5wdXRDb25maWd1cmF0aW9uLmNyZWF0ZVB1bGxJbnB1dChJbnB1dFR5cGUuVVJMX1BVTEwsIHNvdXJjZXMpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhbiBSVE1QIHB1bGwgaW5wdXQuICovXG4gIHB1YmxpYyBzdGF0aWMgcnRtcFB1bGwoc291cmNlczogSW5wdXRTb3VyY2VbXSk6IElucHV0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIElucHV0Q29uZmlndXJhdGlvbi5jcmVhdGVQdWxsSW5wdXQoSW5wdXRUeXBlLlJUTVBfUFVMTCwgc291cmNlcyk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGFuIE1QNCBmaWxlIHB1bGwgaW5wdXQuICovXG4gIHB1YmxpYyBzdGF0aWMgbXA0RmlsZShzb3VyY2VzOiBJbnB1dFNvdXJjZVtdKTogSW5wdXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gSW5wdXRDb25maWd1cmF0aW9uLmNyZWF0ZVB1bGxJbnB1dChJbnB1dFR5cGUuTVA0X0ZJTEUsIHNvdXJjZXMpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIFRTIGZpbGUgcHVsbCBpbnB1dC4gKi9cbiAgcHVibGljIHN0YXRpYyB0c0ZpbGUoc291cmNlczogSW5wdXRTb3VyY2VbXSk6IElucHV0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIElucHV0Q29uZmlndXJhdGlvbi5jcmVhdGVQdWxsSW5wdXQoSW5wdXRUeXBlLlRTX0ZJTEUsIHNvdXJjZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBSVE1QIHB1c2ggaW5wdXQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGRlY2xhcmUgY29uc3Qgc2VjdXJpdHlHcm91cDogSW5wdXRTZWN1cml0eUdyb3VwO1xuICAgKlxuICAgKiAgICBJbnB1dENvbmZpZ3VyYXRpb24ucnRtcFB1c2goe1xuICAgKiAgICAgIGlucHV0U2VjdXJpdHlHcm91cHM6IFtzZWN1cml0eUdyb3VwXSxcbiAgICogICAgfSk7XG4gICAqXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJ0bXBQdXNoKHByb3BzOiBQdXNoSW5wdXRQcm9wcyk6IElucHV0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBJbnB1dENvbmZpZ3VyYXRpb24oKCkgPT4gKHtcbiAgICAgIHR5cGU6IElucHV0VHlwZS5SVE1QX1BVU0gsXG4gICAgICBpbnB1dENsYXNzOiBwcm9wcy5kZXN0aW5hdGlvbnM/Lmxlbmd0aCA9PT0gMiA/ICdTVEFOREFSRCcgOiAnU0lOR0xFX1BJUEVMSU5FJyxcbiAgICAgIGlucHV0U2VjdXJpdHlHcm91cHM6IHByb3BzLmlucHV0U2VjdXJpdHlHcm91cHM/Lm1hcChzZyA9PiBzZy5pbnB1dFNlY3VyaXR5R3JvdXBSZWYuaW5wdXRTZWN1cml0eUdyb3VwSWQpLFxuICAgICAgZGVzdGluYXRpb25zOiBiaW5kUHVzaERlc3RpbmF0aW9ucyhwcm9wcy5kZXN0aW5hdGlvbnMpLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYW4gUlRQIHB1c2ggaW5wdXQuICovXG4gIHB1YmxpYyBzdGF0aWMgcnRwUHVzaChwcm9wczogUHVzaElucHV0UHJvcHMpOiBJbnB1dENvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgSW5wdXRDb25maWd1cmF0aW9uKCgpID0+ICh7XG4gICAgICB0eXBlOiBJbnB1dFR5cGUuUlRQX1BVU0gsXG4gICAgICBpbnB1dENsYXNzOiBwcm9wcy5kZXN0aW5hdGlvbnM/Lmxlbmd0aCA9PT0gMiA/ICdTVEFOREFSRCcgOiAnU0lOR0xFX1BJUEVMSU5FJyxcbiAgICAgIGlucHV0U2VjdXJpdHlHcm91cHM6IHByb3BzLmlucHV0U2VjdXJpdHlHcm91cHM/Lm1hcChzZyA9PiBzZy5pbnB1dFNlY3VyaXR5R3JvdXBSZWYuaW5wdXRTZWN1cml0eUdyb3VwSWQpLFxuICAgICAgZGVzdGluYXRpb25zOiBiaW5kUHVzaERlc3RpbmF0aW9ucyhwcm9wcy5kZXN0aW5hdGlvbnMpLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYSBVRFAgcHVzaCBpbnB1dC4gKi9cbiAgcHVibGljIHN0YXRpYyB1ZHBQdXNoKHByb3BzOiBQdXNoSW5wdXRQcm9wcyk6IElucHV0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBJbnB1dENvbmZpZ3VyYXRpb24oKCkgPT4gKHtcbiAgICAgIHR5cGU6IElucHV0VHlwZS5VRFBfUFVTSCxcbiAgICAgIGlucHV0Q2xhc3M6IHByb3BzLmRlc3RpbmF0aW9ucz8ubGVuZ3RoID09PSAyID8gJ1NUQU5EQVJEJyA6ICdTSU5HTEVfUElQRUxJTkUnLFxuICAgICAgaW5wdXRTZWN1cml0eUdyb3VwczogcHJvcHMuaW5wdXRTZWN1cml0eUdyb3Vwcz8ubWFwKHNnID0+IHNnLmlucHV0U2VjdXJpdHlHcm91cFJlZi5pbnB1dFNlY3VyaXR5R3JvdXBJZCksXG4gICAgICBkZXN0aW5hdGlvbnM6IGJpbmRQdXNoRGVzdGluYXRpb25zKHByb3BzLmRlc3RpbmF0aW9ucyksXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIE1lZGlhQ29ubmVjdCByb3V0ZXIgaW5wdXQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICAgLy8gU2luZ2xlIHBpcGVsaW5lIHdpdGggZGVmYXVsdCBBWlxuICAgKiAgICBJbnB1dENvbmZpZ3VyYXRpb24ubWVkaWFDb25uZWN0Um91dGVyKCk7XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIC8vIFJlZHVuZGFudCBwaXBlbGluZXMgd2l0aCBleHBsaWNpdCBBWnNcbiAgICogICAgSW5wdXRDb25maWd1cmF0aW9uLm1lZGlhQ29ubmVjdFJvdXRlcih7XG4gICAqICAgICAgYXZhaWxhYmlsaXR5Wm9uZXM6IFsndXMtZWFzdC0xYScsICd1cy1lYXN0LTFiJ10sXG4gICAqICAgIH0pO1xuICAgKlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBtZWRpYUNvbm5lY3RSb3V0ZXIocHJvcHM/OiBNZWRpYUNvbm5lY3RSb3V0ZXJJbnB1dFByb3BzKTogSW5wdXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IElucHV0Q29uZmlndXJhdGlvbigoc2NvcGUpID0+IHtcbiAgICAgIGNvbnN0IHN0YWNrQXpzID0gc2NvcGUgPyBTdGFjay5vZihzY29wZSkuYXZhaWxhYmlsaXR5Wm9uZXMgOiBbXTtcbiAgICAgIGNvbnN0IGF6cyA9IHByb3BzPy5hdmFpbGFiaWxpdHlab25lcyA/PyBbc3RhY2tBenNbMF1dO1xuICAgICAgaWYgKGF6cy5sZW5ndGggPCAxIHx8IGF6cy5sZW5ndGggPiAyKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgUm91dGVyQXpDb3VudGAsICdNZWRpYUNvbm5lY3QgUm91dGVyIGlucHV0IHJlcXVpcmVzIDEgb3IgMiBhdmFpbGFiaWxpdHkgem9uZXMuJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBkZXN0aW5hdGlvbnM6IENmbklucHV0LlJvdXRlckRlc3RpbmF0aW9uU2V0dGluZ3NQcm9wZXJ0eVtdID0gYXpzLm1hcChheiA9PiAoe1xuICAgICAgICBhdmFpbGFiaWxpdHlab25lTmFtZTogYXosXG4gICAgICB9KSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBJbnB1dFR5cGUuTUVESUFDT05ORUNUX1JPVVRFUixcbiAgICAgICAgaW5wdXRDbGFzczogYXpzLmxlbmd0aCA9PT0gMiA/ICdTVEFOREFSRCcgOiAnU0lOR0xFX1BJUEVMSU5FJyxcbiAgICAgICAgcm91dGVyU2V0dGluZ3M6IHtcbiAgICAgICAgICBkZXN0aW5hdGlvbnMsXG4gICAgICAgICAgZW5jcnlwdGlvblR5cGU6IHByb3BzPy5lbmNyeXB0aW9uU2VjcmV0ID8gJ0NVU1RPTScgOiAnQVVUT01BVElDJyxcbiAgICAgICAgICBzZWNyZXRBcm46IHByb3BzPy5lbmNyeXB0aW9uU2VjcmV0Py5zZWNyZXRBcm4sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIE1lZGlhQ29ubmVjdCBmbG93IGlucHV0IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGRlY2xhcmUgY29uc3Qgcm9sZTogaWFtLklSb2xlO1xuICAgKiAgICBkZWNsYXJlIGNvbnN0IGZsb3c6IG1lZGlhY29ubmVjdC5JRmxvd1JlZjtcbiAgICpcbiAgICogICAgSW5wdXRDb25maWd1cmF0aW9uLm1lZGlhQ29ubmVjdCh7XG4gICAqICAgICAgZmxvd3M6IFtmbG93XSxcbiAgICogICAgICByb2xlLFxuICAgKiAgICB9KTtcbiAgICpcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbWVkaWFDb25uZWN0KHByb3BzOiBNZWRpYUNvbm5lY3RJbnB1dFByb3BzKTogSW5wdXRDb25maWd1cmF0aW9uIHtcbiAgICBpZiAocHJvcHMuZmxvd3MubGVuZ3RoIDwgMSB8fCBwcm9wcy5mbG93cy5sZW5ndGggPiAyKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YE1lZGlhQ29ubmVjdEZsb3dzTGltaXRgLCAnWW91IG11c3Qgc3BlY2lmeSAxIG9yIDIgTWVkaWFDb25uZWN0IGZsb3dzLicpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IElucHV0Q29uZmlndXJhdGlvbigoc2NvcGUpID0+IHtcbiAgICAgIGNvbnN0IHJvbGUgPSBwcm9wcy5yb2xlID8/IGNyZWF0ZUlucHV0Um9sZShzY29wZSwgJ01lZGlhQ29ubmVjdFJvbGUnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IElucHV0VHlwZS5NRURJQUNPTk5FQ1QsXG4gICAgICAgIGlucHV0Q2xhc3M6IHByb3BzLmZsb3dzLmxlbmd0aCA9PT0gMiA/ICdTVEFOREFSRCcgOiAnU0lOR0xFX1BJUEVMSU5FJyxcbiAgICAgICAgbWVkaWFDb25uZWN0Rmxvd3M6IHByb3BzLmZsb3dzLm1hcChmID0+ICh7IGZsb3dBcm46IGYuZmxvd1JlZi5mbG93QXJuIH0pKSxcbiAgICAgICAgcm9sZUFybjogcm9sZS5yb2xlQXJuLFxuICAgICAgICAvLyBPbmx5IGF1dG8tZ3JhbnQgYWN0aW9ucyB3aXRoIGF1dG8tY3JlYXRlZCByb2xlLiBBIHVzZXItcHJvdmlkZWQgcm9sZVxuICAgICAgICAvLyBpcyBsZWZ0IGFsb25lIOKAlCB0aGUgY2FsbGVyIGFkZHMgaXRzIHBlcm1pc3Npb25zLlxuICAgICAgICBtZWRpYUNvbm5lY3RGbG93R3JhbnQ6IHByb3BzLnJvbGUgPT09IHVuZGVmaW5lZCA/IHsgcm9sZSB9IDogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYW4gU0RJIGlucHV0IGNvbmZpZ3VyYXRpb24uICovXG4gIHB1YmxpYyBzdGF0aWMgc2RpKHNvdXJjZXM6IElTZGlTb3VyY2VbXSk6IElucHV0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBJbnB1dENvbmZpZ3VyYXRpb24oKCkgPT4gKHtcbiAgICAgIHR5cGU6IElucHV0VHlwZS5TREksXG4gICAgICBpbnB1dENsYXNzOiBzb3VyY2VzLmxlbmd0aCA9PT0gMiA/ICdTVEFOREFSRCcgOiAnU0lOR0xFX1BJUEVMSU5FJyxcbiAgICAgIC8vIE1lZGlhTGl2ZSdzIFNkaVNvdXJjZXMgcHJvcGVydHkgZXhwZWN0cyB0aGUgbnVtZXJpYyBTREkgc291cmNlIElELCBub3QgdGhlIEFSTi5cbiAgICAgIHNkaVNvdXJjZXM6IHNvdXJjZXMubWFwKHMgPT4gcy5zZGlTb3VyY2VJZCksXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhbiBFbGVtZW50YWwgTGluayBpbnB1dCBmcm9tIG9uZSBvciB0d28gcmVnaXN0ZXJlZCBMaW5rIGRldmljZSBJRHMuICovXG4gIHB1YmxpYyBzdGF0aWMgaW5wdXREZXZpY2UocHJvcHM6IElucHV0RGV2aWNlSW5wdXRQcm9wcyk6IElucHV0Q29uZmlndXJhdGlvbiB7XG4gICAgaWYgKHByb3BzLmRldmljZUlkcy5sZW5ndGggPCAxIHx8IHByb3BzLmRldmljZUlkcy5sZW5ndGggPiAyKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YElucHV0RGV2aWNlQ291bnRgLCAnWW91IG11c3Qgc3BlY2lmeSAxIG9yIDIgaW5wdXQgZGV2aWNlcy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbnB1dENvbmZpZ3VyYXRpb24oKCkgPT4gKHtcbiAgICAgIHR5cGU6IElucHV0VHlwZS5JTlBVVF9ERVZJQ0UsXG4gICAgICBpbnB1dENsYXNzOiBwcm9wcy5kZXZpY2VJZHMubGVuZ3RoID09PSAyID8gJ1NUQU5EQVJEJyA6ICdTSU5HTEVfUElQRUxJTkUnLFxuICAgICAgaW5wdXREZXZpY2VzOiBwcm9wcy5kZXZpY2VJZHMubWFwKGlkID0+ICh7IGlkIH0pKSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ0RJICh1bmNvbXByZXNzZWQpIGlucHV0IGRlbGl2ZXJlZCBpbnRvIGEgVlBDLlxuICAgKlxuICAgKiBNZWRpYUxpdmUgY3JlYXRlcyBuZXR3b3JrIGludGVyZmFjZXMgaW4gdGhlIHN1cHBsaWVkIHN1Ym5ldHMgYW5kIGhhbmRzIGJhY2sgdGhlIENESSBwdXNoXG4gICAqIGVuZHBvaW50cy4gVGhlIHJlcXVpcmVkIEVDMiBwZXJtaXNzaW9ucyBhcmUgZ3JhbnRlZCB0byB0aGUgcm9sZSBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjZGkocHJvcHM6IENkaUlucHV0UHJvcHMpOiBJbnB1dENvbmZpZ3VyYXRpb24ge1xuICAgIGlmIChwcm9wcy5zdWJuZXRzLmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBDZGlTdWJuZXRDb3VudGAsICdDREkgaW5wdXRzIHJlcXVpcmUgZXhhY3RseSAyIHN1Ym5ldHMgaW4gdHdvIGRpZmZlcmVudCBhdmFpbGFiaWxpdHkgem9uZXMuJyk7XG4gICAgfVxuICAgIGNvbnN0IHN1Ym5ldElkcyA9IHByb3BzLnN1Ym5ldHMubWFwKHMgPT4gcy5zdWJuZXRSZWYuc3VibmV0SWQpO1xuICAgIGNvbnN0IHNlY3VyaXR5R3JvdXBJZHMgPSBwcm9wcy5zZWN1cml0eUdyb3Vwcz8ubWFwKHNnID0+IHNnLnNlY3VyaXR5R3JvdXBSZWYuc2VjdXJpdHlHcm91cElkKTtcbiAgICByZXR1cm4gbmV3IElucHV0Q29uZmlndXJhdGlvbigoc2NvcGUpID0+IHtcbiAgICAgIGNvbnN0IHJvbGUgPSBwcm9wcy5yb2xlID8/IGNyZWF0ZUlucHV0Um9sZShzY29wZSwgJ0NkaVJvbGUnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IElucHV0VHlwZS5BV1NfQ0RJLFxuICAgICAgICBpbnB1dENsYXNzOiAnU1RBTkRBUkQnLFxuICAgICAgICByb2xlQXJuOiByb2xlLnJvbGVBcm4sXG4gICAgICAgIHZwYzogeyBzdWJuZXRJZHMsIHNlY3VyaXR5R3JvdXBJZHMgfSxcbiAgICAgICAgLy8gT25seSBhdXRvLWdyYW50IGFjdGlvbnMgd2l0aCBhdXRvLWNyZWF0ZWQgcm9sZS4gQSB1c2VyLXByb3ZpZGVkIHJvbGVcbiAgICAgICAgLy8gaXMgbGVmdCBhbG9uZSDigJQgdGhlIGNhbGxlciBhZGRzIGl0cyBwZXJtaXNzaW9ucy5cbiAgICAgICAgdnBjUm9sZUdyYW50OiBwcm9wcy5yb2xlID09PSB1bmRlZmluZWQgPyB7IHJvbGUsIHN1Ym5ldElkcywgc2VjdXJpdHlHcm91cElkczogc2VjdXJpdHlHcm91cElkcyA/PyBbXSB9IDogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYSBtdWx0aWNhc3QgaW5wdXQuIFJlcXVpcmVzIGBhbnl3aGVyZVNldHRpbmdzYCBvbiB0aGUgY2hhbm5lbC4gKi9cbiAgcHVibGljIHN0YXRpYyBtdWx0aWNhc3QocHJvcHM6IE11bHRpY2FzdElucHV0UHJvcHMpOiBJbnB1dENvbmZpZ3VyYXRpb24ge1xuICAgIGlmIChwcm9wcy5zb3VyY2VzLmxlbmd0aCA8IDEgfHwgcHJvcHMuc291cmNlcy5sZW5ndGggPiAyKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YE11bHRpY2FzdFNvdXJjZUNvdW50YCwgJ1lvdSBtdXN0IHNwZWNpZnkgMSBvciAyIG11bHRpY2FzdCBzb3VyY2VzLicpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IElucHV0Q29uZmlndXJhdGlvbigoKSA9PiAoe1xuICAgICAgdHlwZTogSW5wdXRUeXBlLk1VTFRJQ0FTVCxcbiAgICAgIGlucHV0Q2xhc3M6IHByb3BzLnNvdXJjZXMubGVuZ3RoID09PSAyID8gJ1NUQU5EQVJEJyA6ICdTSU5HTEVfUElQRUxJTkUnLFxuICAgICAgbXVsdGljYXN0U2V0dGluZ3M6IHtcbiAgICAgICAgc291cmNlczogcHJvcHMuc291cmNlcy5tYXAocyA9PiAoe1xuICAgICAgICAgIHVybDogYCR7KHMucHJvdG9jb2wgPz8gTXVsdGljYXN0UHJvdG9jb2wuVURQKS52YWx1ZX06Ly8ke3MuYWRkcmVzc306JHtzLnBvcnR9YCxcbiAgICAgICAgICBzb3VyY2VJcDogcy5zb3VyY2VJcCxcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICB9KSk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgU01QVEUgMjExMCByZWNlaXZlciBncm91cCBpbnB1dC4gUmVxdWlyZXMgYGFueXdoZXJlU2V0dGluZ3NgIG9uIHRoZSBjaGFubmVsLiAqL1xuICBwdWJsaWMgc3RhdGljIHNtcHRlMjExMFJlY2VpdmVyR3JvdXAocHJvcHM6IFNtcHRlMjExMElucHV0UHJvcHMpOiBJbnB1dENvbmZpZ3VyYXRpb24ge1xuICAgIGlmICgocHJvcHMuYXVkaW9TZHBzPy5sZW5ndGggPz8gMCkgPiA1MCkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBTbXB0ZTIxMTBBdWRpb1NkcENvdW50YCwgJ0EgU01QVEUgMjExMCBpbnB1dCBzdXBwb3J0cyBhdCBtb3N0IDUwIGF1ZGlvIFNEUHMuJyk7XG4gICAgfVxuICAgIGlmICgocHJvcHMuYW5jaWxsYXJ5U2Rwcz8ubGVuZ3RoID8/IDApID4gNTApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgU21wdGUyMTEwQW5jaWxsYXJ5U2RwQ291bnRgLCAnQSBTTVBURSAyMTEwIGlucHV0IHN1cHBvcnRzIGF0IG1vc3QgNTAgYW5jaWxsYXJ5IFNEUHMuJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW5wdXRDb25maWd1cmF0aW9uKCgpID0+ICh7XG4gICAgICB0eXBlOiBJbnB1dFR5cGUuU01QVEVfMjExMF9SRUNFSVZFUl9HUk9VUCxcbiAgICAgIHNtcHRlMjExMFJlY2VpdmVyR3JvdXBTZXR0aW5nczoge1xuICAgICAgICBzbXB0ZTIxMTBSZWNlaXZlckdyb3VwczogW3tcbiAgICAgICAgICBzZHBTZXR0aW5nczoge1xuICAgICAgICAgICAgdmlkZW9TZHA6IHByb3BzLnZpZGVvU2RwID8gYmluZFNkcExvY2F0aW9uKHByb3BzLnZpZGVvU2RwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGF1ZGlvU2RwczogcHJvcHMuYXVkaW9TZHBzPy5tYXAoYmluZFNkcExvY2F0aW9uKSxcbiAgICAgICAgICAgIGFuY2lsbGFyeVNkcHM6IHByb3BzLmFuY2lsbGFyeVNkcHM/Lm1hcChiaW5kU2RwTG9jYXRpb24pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH1dLFxuICAgICAgfSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIFNSVCBjYWxsZXIgaW5wdXQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICAgSW5wdXRDb25maWd1cmF0aW9uLnNydENhbGxlcihbe1xuICAgKiAgICAgIHNydExpc3RlbmVyQWRkcmVzczogJzEwLjAuMC4xJyxcbiAgICogICAgICBzcnRMaXN0ZW5lclBvcnQ6IDUwMDAsXG4gICAqICAgIH1dKTtcbiAgICpcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc3J0Q2FsbGVyKHNvdXJjZXM6IFNydENhbGxlclNvdXJjZVByb3BzW10pOiBJbnB1dENvbmZpZ3VyYXRpb24ge1xuICAgIGlmIChzb3VyY2VzLmxlbmd0aCA8IDEgfHwgc291cmNlcy5sZW5ndGggPiAyKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YFNydENhbGxlclNvdXJjZXNMaW1pdGAsICdZb3UgbXVzdCBzcGVjaWZ5IDEgb3IgMiBTUlQgY2FsbGVyIHNvdXJjZXMuJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW5wdXRDb25maWd1cmF0aW9uKCgpID0+ICh7XG4gICAgICB0eXBlOiBJbnB1dFR5cGUuU1JUX0NBTExFUixcbiAgICAgIGlucHV0Q2xhc3M6IHNvdXJjZXMubGVuZ3RoID09PSAyID8gJ1NUQU5EQVJEJyA6ICdTSU5HTEVfUElQRUxJTkUnLFxuICAgICAgc3J0U2V0dGluZ3M6IHtcbiAgICAgICAgc3J0Q2FsbGVyU291cmNlczogc291cmNlcy5tYXAocyA9PiAoe1xuICAgICAgICAgIHNydExpc3RlbmVyQWRkcmVzczogcy5zcnRMaXN0ZW5lckFkZHJlc3MsXG4gICAgICAgICAgc3J0TGlzdGVuZXJQb3J0OiBzLnNydExpc3RlbmVyUG9ydC50b1N0cmluZygpLFxuICAgICAgICAgIG1pbmltdW1MYXRlbmN5OiBzLm1pbmltdW1MYXRlbmN5Py50b01pbGxpc2Vjb25kcygpLFxuICAgICAgICAgIHN0cmVhbUlkOiBzLnN0cmVhbUlkLFxuICAgICAgICAgIGRlY3J5cHRpb246IHMuZGVjcnlwdGlvbiA/IHtcbiAgICAgICAgICAgIGFsZ29yaXRobTogcy5kZWNyeXB0aW9uLmFsZ29yaXRobT8udmFsdWUsXG4gICAgICAgICAgICBwYXNzcGhyYXNlU2VjcmV0QXJuOiBzLmRlY3J5cHRpb24ucGFzc3BocmFzZVNlY3JldD8uc2VjcmV0QXJuLFxuICAgICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhbiBTUlQgbGlzdGVuZXIgaW5wdXQgY29uZmlndXJhdGlvbi4gKi9cbiAgcHVibGljIHN0YXRpYyBzcnRMaXN0ZW5lcihwcm9wczogU3J0TGlzdGVuZXJJbnB1dFByb3BzKTogSW5wdXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IElucHV0Q29uZmlndXJhdGlvbigoKSA9PiAoe1xuICAgICAgdHlwZTogSW5wdXRUeXBlLlNSVF9MSVNURU5FUixcbiAgICAgIGlucHV0Q2xhc3M6IHByb3BzLmlucHV0Q2xhc3M/LnZhbHVlID8/ICdTSU5HTEVfUElQRUxJTkUnLFxuICAgICAgaW5wdXRTZWN1cml0eUdyb3VwczogcHJvcHMuaW5wdXRTZWN1cml0eUdyb3Vwcy5tYXAoc2cgPT4gc2cuaW5wdXRTZWN1cml0eUdyb3VwUmVmLmlucHV0U2VjdXJpdHlHcm91cElkKSxcbiAgICAgIHNydFNldHRpbmdzOiB7XG4gICAgICAgIHNydExpc3RlbmVyU2V0dGluZ3M6IHtcbiAgICAgICAgICBtaW5pbXVtTGF0ZW5jeTogcHJvcHMubWluaW11bUxhdGVuY3k/LnRvTWlsbGlzZWNvbmRzKCksXG4gICAgICAgICAgc3RyZWFtSWQ6IHByb3BzLnN0cmVhbUlkLFxuICAgICAgICAgIGRlY3J5cHRpb246IHByb3BzLmRlY3J5cHRpb24gPyB7XG4gICAgICAgICAgICBhbGdvcml0aG06IHByb3BzLmRlY3J5cHRpb24uYWxnb3JpdGhtPy52YWx1ZSxcbiAgICAgICAgICAgIHBhc3NwaHJhc2VTZWNyZXRBcm46IHByb3BzLmRlY3J5cHRpb24ucGFzc3BocmFzZVNlY3JldD8uc2VjcmV0QXJuLFxuICAgICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVB1bGxJbnB1dCh0eXBlOiBJbnB1dFR5cGUsIHNvdXJjZXM6IElucHV0U291cmNlW10pOiBJbnB1dENvbmZpZ3VyYXRpb24ge1xuICAgIGlmIChzb3VyY2VzLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgUHVsbElucHV0U291cmNlc01pbmltdW1gLCAnWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCAxIGlucHV0IHNvdXJjZS4nKTtcbiAgICB9XG4gICAgaWYgKHNvdXJjZXMubGVuZ3RoID4gMikge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBQdWxsSW5wdXRTb3VyY2VzTGltaXRgLCAnWW91IGNhbm5vdCBzcGVjaWZ5IG1vcmUgdGhhbiAyIGlucHV0IHNvdXJjZXMuJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW5wdXRDb25maWd1cmF0aW9uKCgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIGlucHV0Q2xhc3M6IHNvdXJjZXMubGVuZ3RoID09PSAyID8gJ1NUQU5EQVJEJyA6ICdTSU5HTEVfUElQRUxJTkUnLFxuICAgICAgICBpbnB1dFNvdXJjZXM6IHNvdXJjZXMsXG4gICAgICAgIHNvdXJjZXM6IHNvdXJjZXMubWFwKHMgPT4gcy5fYmluZCgpKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgX2JpbmRGbjogKHNjb3BlPzogQ29uc3RydWN0KSA9PiBJbnB1dEJpbmRDb25maWcpIHt9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2JpbmQoc2NvcGU/OiBDb25zdHJ1Y3QpOiBJbnB1dEJpbmRDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9iaW5kRm4oc2NvcGUpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBkZWZhdWx0IElBTSByb2xlIGZvciBhbiBpbnB1dCB0aGF0IE1lZGlhTGl2ZSBhc3N1bWVzIChNZWRpYUNvbm5lY3QgZmxvdyBvciBDREkvVlBDKS5cbiAqIFRoZSBjYWxsZXIgd2lyZXMgdGhlIHNwZWNpZmljIG1hbmFnZWQvRUMyIGFjdGlvbnMgb250byB0aGUgcm9sZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5wdXRSb2xlKHNjb3BlOiBDb25zdHJ1Y3QgfCB1bmRlZmluZWQsIGlkOiBzdHJpbmcpOiBJUm9sZSB7XG4gIGlmICghc2NvcGUpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBsaXRgSW5wdXRSb2xlU2NvcGVgLFxuICAgICAgJ0Nhbm5vdCBhdXRvLWNyZWF0ZSBhbiBpbnB1dCByb2xlIHdpdGhvdXQgYSBjb25zdHJ1Y3Qgc2NvcGU7IHByb3ZpZGUgYW4gZXhwbGljaXQgYHJvbGVgLicsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbmV3IFJvbGUoc2NvcGUsIGlkLCB7XG4gICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbCgnbWVkaWFsaXZlLmFtYXpvbmF3cy5jb20nLCB7XG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIFN0cmluZ0VxdWFsczogeyAnYXdzOlNvdXJjZUFjY291bnQnOiBBd3MuQUNDT1VOVF9JRCB9LFxuICAgICAgICBBcm5MaWtlOiB7XG4gICAgICAgICAgJ2F3czpTb3VyY2VBcm4nOiBTdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgICAgICAgIHNlcnZpY2U6ICdtZWRpYWxpdmUnLFxuICAgICAgICAgICAgcmVzb3VyY2U6ICdpbnB1dCcsXG4gICAgICAgICAgICByZXNvdXJjZU5hbWU6ICcqJyxcbiAgICAgICAgICAgIGFybkZvcm1hdDogQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pLFxuICB9KTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIGFuIEFXUyBFbGVtZW50YWwgTWVkaWFMaXZlIElucHV0LlxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgSW5wdXQgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElJbnB1dCB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLW1lZGlhbGl2ZS1hbHBoYS5JbnB1dCc7XG5cbiAgLyoqIEltcG9ydCBhbiBleGlzdGluZyBpbnB1dCBieSBpdHMgQVJOLiBUaGUgaWQgaXMgcGFyc2VkIG91dCBvZiB0aGUgQVJOLiAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21JbnB1dEFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBpbnB1dEFybjogc3RyaW5nKTogSUlucHV0IHtcbiAgICBjb25zdCBpbnB1dElkID0gZXh0cmFjdFJlc291cmNlSWQoaW5wdXRBcm4sICdJbnB1dCcpO1xuXG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJSW5wdXQge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGlucHV0QXJuID0gaW5wdXRBcm47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaW5wdXRJZCA9IGlucHV0SWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaW5wdXRDbGFzcyA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBpbnB1dFR5cGUgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaW5wdXREZXN0aW5hdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaW5wdXRTb3VyY2VzID0gdW5kZWZpbmVkO1xuICAgICAgcHVibGljIGdldCBpbnB1dFJlZigpOiBJbnB1dFJlZmVyZW5jZSB7XG4gICAgICAgIHJldHVybiB7IGlucHV0SWQ6IHRoaXMuaW5wdXRJZCwgaW5wdXRBcm46IHRoaXMuaW5wdXRBcm4gfTtcbiAgICAgIH1cbiAgICAgIC8qKiBAaW50ZXJuYWwgSW1wb3J0ZWQgaW5wdXRzIG93biBubyBzb3VyY2VzLCBzbyBncmFudGluZyBpcyBhIG5vLW9wLiAqL1xuICAgICAgcHVibGljIF9ncmFudFBlcm1pc3Npb25zKF9yb2xlOiBJUm9sZSk6IHZvaWQge31cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBpbnB1dEFybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgaW5wdXRJZDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgaW5wdXRDbGFzcz86IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGlucHV0VHlwZT86IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGlucHV0RGVzdGluYXRpb25zPzogc3RyaW5nW107XG4gIHB1YmxpYyByZWFkb25seSBpbnB1dFNvdXJjZXM/OiBzdHJpbmdbXTtcblxuICAvKiogQSByZWZlcmVuY2UgdG8gdGhpcyBJbnB1dCByZXNvdXJjZS4gKi9cbiAgcHVibGljIGdldCBpbnB1dFJlZigpOiBJbnB1dFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIHsgaW5wdXRJZDogdGhpcy5pbnB1dElkLCBpbnB1dEFybjogdGhpcy5pbnB1dEFybiB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnB1dFNvdXJjZVJlZnM6IElucHV0U291cmNlW107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElucHV0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMuaW5wdXROYW1lID8/IExhenkuc3RyaW5nKHsgcHJvZHVjZTogKCkgPT4gTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHsgbWF4TGVuZ3RoOiAyNTYgfSkgfSksXG4gICAgfSk7XG5cbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICBjb25zdCBjb25maWcgPSBwcm9wcy5pbnB1dC5fYmluZCh0aGlzKTtcblxuICAgIC8vIFNlY3VyaXR5LWdyb3VwIHJ1bGVzOiBvbi1wcmVtaXNlcyBpbnB1dHMgZG9uJ3Qgc3VwcG9ydCBzZWN1cml0eSBncm91cHMsIHdoaWxlIGNsb3VkIHB1c2hcbiAgICAvLyBpbnB1dHMgcmVxdWlyZSBhdCBsZWFzdCBvbmUuIEJvdGggYWx3YXlzIGZhaWwgYXQgZGVwbG95IG90aGVyd2lzZSwgc28gdmFsaWRhdGUgYXQgc3ludGguXG4gICAgY29uc3QgaXNPblByZW1pc2VzID0gcHJvcHMuaW5wdXROZXR3b3JrTG9jYXRpb24/LnZhbHVlID09PSBJbnB1dE5ldHdvcmtMb2NhdGlvbi5PTl9QUkVNSVNFUy52YWx1ZTtcbiAgICBjb25zdCBoYXNTZWN1cml0eUdyb3VwcyA9IChjb25maWcuaW5wdXRTZWN1cml0eUdyb3Vwcz8ubGVuZ3RoID8/IDApID4gMDtcbiAgICBjb25zdCBpc1B1c2hJbnB1dCA9IGNvbmZpZy50eXBlID09PSBJbnB1dFR5cGUuUlRNUF9QVVNIXG4gICAgICB8fCBjb25maWcudHlwZSA9PT0gSW5wdXRUeXBlLlJUUF9QVVNIXG4gICAgICB8fCBjb25maWcudHlwZSA9PT0gSW5wdXRUeXBlLlVEUF9QVVNIO1xuICAgIGlmIChpc09uUHJlbWlzZXMgJiYgaGFzU2VjdXJpdHlHcm91cHMpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBPblByZW1pc2VzSW5wdXRTZWN1cml0eUdyb3Vwc2AsXG4gICAgICAgICdvbi1wcmVtaXNlcyBpbnB1dHMgZG8gbm90IHN1cHBvcnQgaW5wdXQgc2VjdXJpdHkgZ3JvdXBzOyByZW1vdmUgaW5wdXRTZWN1cml0eUdyb3VwcyBmb3IgYW4gT05fUFJFTUlTRVMgaW5wdXQnLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFpc09uUHJlbWlzZXMgJiYgaXNQdXNoSW5wdXQgJiYgIWhhc1NlY3VyaXR5R3JvdXBzKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgUHVzaElucHV0U2VjdXJpdHlHcm91cHNSZXF1aXJlZGAsXG4gICAgICAgICdjbG91ZCBwdXNoIGlucHV0cyByZXF1aXJlIGF0IGxlYXN0IG9uZSBpbnB1dCBzZWN1cml0eSBncm91cCcsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBTREkgaW5wdXRzIGFyZSBvbi1wcmVtaXNlcyBoYXJkd2FyZSBzb3VyY2VzIOKAlCBNZWRpYUxpdmUgYWx3YXlzIHJlamVjdHMgYW4gU0RJIGlucHV0XG4gICAgLy8gd2hvc2UgbmV0d29yayBsb2NhdGlvbiBpc24ndCBPTl9QUkVNSVNFUywgc28gZmFpbCBmYXN0IGF0IHN5bnRoLlxuICAgIGlmIChjb25maWcudHlwZSA9PT0gSW5wdXRUeXBlLlNESSAmJiAhaXNPblByZW1pc2VzKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgU2RpSW5wdXRSZXF1aXJlc09uUHJlbWlzZXNgLFxuICAgICAgICBcImFuIFNESSBpbnB1dCdzIGlucHV0TmV0d29ya0xvY2F0aW9uIG11c3QgYmUgSW5wdXROZXR3b3JrTG9jYXRpb24uT05fUFJFTUlTRVNcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgQ2ZuSW5wdXQodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgbmFtZTogdGhpcy5waHlzaWNhbE5hbWUsXG4gICAgICB0eXBlOiBjb25maWcudHlwZSxcbiAgICAgIHJvbGVBcm46IGNvbmZpZy5yb2xlQXJuLFxuICAgICAgc291cmNlczogY29uZmlnLnNvdXJjZXMsXG4gICAgICBkZXN0aW5hdGlvbnM6IGNvbmZpZy5kZXN0aW5hdGlvbnMsXG4gICAgICBtZWRpYUNvbm5lY3RGbG93czogY29uZmlnLm1lZGlhQ29ubmVjdEZsb3dzLFxuICAgICAgaW5wdXREZXZpY2VzOiBjb25maWcuaW5wdXREZXZpY2VzLFxuICAgICAgbXVsdGljYXN0U2V0dGluZ3M6IGNvbmZpZy5tdWx0aWNhc3RTZXR0aW5ncyxcbiAgICAgIHNtcHRlMjExMFJlY2VpdmVyR3JvdXBTZXR0aW5nczogY29uZmlnLnNtcHRlMjExMFJlY2VpdmVyR3JvdXBTZXR0aW5ncyxcbiAgICAgIHJvdXRlclNldHRpbmdzOiBjb25maWcucm91dGVyU2V0dGluZ3MsXG4gICAgICBzcnRTZXR0aW5nczogY29uZmlnLnNydFNldHRpbmdzLFxuICAgICAgc2RpU291cmNlczogY29uZmlnLnNkaVNvdXJjZXMsXG4gICAgICB2cGM6IGNvbmZpZy52cGMsXG4gICAgICBpbnB1dFNlY3VyaXR5R3JvdXBzOiBjb25maWcuaW5wdXRTZWN1cml0eUdyb3VwcyxcbiAgICAgIGlucHV0TmV0d29ya0xvY2F0aW9uOiBwcm9wcy5pbnB1dE5ldHdvcmtMb2NhdGlvbj8udmFsdWUsXG4gICAgICB0YWdzOiBwcm9wcy50YWdzLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pbnB1dEFybiA9IHJlc291cmNlLmlucHV0UmVmLmlucHV0QXJuO1xuICAgIHRoaXMuaW5wdXRJZCA9IHJlc291cmNlLmlucHV0UmVmLmlucHV0SWQ7XG4gICAgdGhpcy5pbnB1dENsYXNzID0gY29uZmlnLmlucHV0Q2xhc3M7XG4gICAgdGhpcy5pbnB1dFR5cGUgPSBjb25maWcudHlwZTtcbiAgICB0aGlzLmlucHV0RGVzdGluYXRpb25zID0gcmVzb3VyY2UuYXR0ckRlc3RpbmF0aW9ucztcbiAgICB0aGlzLmlucHV0U291cmNlcyA9IHJlc291cmNlLmF0dHJTb3VyY2VzO1xuICAgIHRoaXMuaW5wdXRTb3VyY2VSZWZzID0gY29uZmlnLmlucHV0U291cmNlcyA/PyBbXTtcblxuICAgIC8vIE1lZGlhQ29ubmVjdCBmbG93IGlucHV0czogZ3JhbnQgbWFuYWdlZCBmbG93LW1hbmFnZW1lbnQgYWN0aW9ucy5cbiAgICAvLyBSZXNvdXJjZSBpcyBgKmAg4oCUIHNlcnZpY2UgcmVqZWN0cyBmbG93LUFSTi1zY29wZWQgZ3JhbnRzLlxuICAgIGlmIChjb25maWcubWVkaWFDb25uZWN0Rmxvd0dyYW50KSB7XG4gICAgICBHcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICAgIGdyYW50ZWU6IGNvbmZpZy5tZWRpYUNvbm5lY3RGbG93R3JhbnQucm9sZSxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdtZWRpYWNvbm5lY3Q6TWFuYWdlZERlc2NyaWJlRmxvdycsXG4gICAgICAgICAgJ21lZGlhY29ubmVjdDpNYW5hZ2VkQWRkT3V0cHV0JyxcbiAgICAgICAgICAnbWVkaWFjb25uZWN0Ok1hbmFnZWRSZW1vdmVPdXRwdXQnLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZUFybnM6IFsnKiddLFxuICAgICAgfSkuYXBwbHlCZWZvcmUocmVzb3VyY2UpO1xuICAgIH1cblxuICAgIC8vIENESS9WUEMgaW5wdXRzOiBDcmVhdGUvRGVsZXRlIHNjb3BlZCB0byBFTkkgKyBzdWJuZXRzICsgU0dzOyBEZXNjcmliZSogbmVlZHMgYCpgLlxuICAgIGlmIChjb25maWcudnBjUm9sZUdyYW50KSB7XG4gICAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHRoaXMpO1xuICAgICAgY29uc3QgZ3JhbnQgPSBjb25maWcudnBjUm9sZUdyYW50O1xuICAgICAgY29uc3QgbmV0d29ya0ludGVyZmFjZUFybiA9IHN0YWNrLmZvcm1hdEFybih7IHNlcnZpY2U6ICdlYzInLCByZXNvdXJjZTogJ25ldHdvcmstaW50ZXJmYWNlJywgcmVzb3VyY2VOYW1lOiAnKicgfSk7XG4gICAgICBjb25zdCBzdWJuZXRBcm5zID0gZ3JhbnQuc3VibmV0SWRzLm1hcChzID0+IHN0YWNrLmZvcm1hdEFybih7IHNlcnZpY2U6ICdlYzInLCByZXNvdXJjZTogJ3N1Ym5ldCcsIHJlc291cmNlTmFtZTogcyB9KSk7XG4gICAgICBjb25zdCBzZWN1cml0eUdyb3VwQXJucyA9IGdyYW50LnNlY3VyaXR5R3JvdXBJZHMubWFwKHNnID0+IHN0YWNrLmZvcm1hdEFybih7IHNlcnZpY2U6ICdlYzInLCByZXNvdXJjZTogJ3NlY3VyaXR5LWdyb3VwJywgcmVzb3VyY2VOYW1lOiBzZyB9KSk7XG5cbiAgICAgIEdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgICAgZ3JhbnRlZTogZ3JhbnQucm9sZSxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdlYzI6Q3JlYXRlTmV0d29ya0ludGVyZmFjZScsXG4gICAgICAgICAgJ2VjMjpDcmVhdGVOZXR3b3JrSW50ZXJmYWNlUGVybWlzc2lvbicsXG4gICAgICAgICAgJ2VjMjpEZWxldGVOZXR3b3JrSW50ZXJmYWNlJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VBcm5zOiBbbmV0d29ya0ludGVyZmFjZUFybiwgLi4uc3VibmV0QXJucywgLi4uc2VjdXJpdHlHcm91cEFybnNdLFxuICAgICAgfSkuYXBwbHlCZWZvcmUocmVzb3VyY2UpO1xuICAgICAgR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgICBncmFudGVlOiBncmFudC5yb2xlLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2VjMjpEZXNjcmliZU5ldHdvcmtJbnRlcmZhY2VzJyxcbiAgICAgICAgICAnZWMyOkRlc2NyaWJlU3VibmV0cycsXG4gICAgICAgICAgJ2VjMjpEZXNjcmliZVNlY3VyaXR5R3JvdXBzJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VBcm5zOiBbJyonXSwgLy8gRGVzY3JpYmUqIGFjdGlvbnMgZG9uJ3Qgc3VwcG9ydCByZXNvdXJjZS1sZXZlbCBwZXJtaXNzaW9uc1xuICAgICAgfSkuYXBwbHlCZWZvcmUocmVzb3VyY2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dFNvdXJjZVJlZnMuZm9yRWFjaChzID0+IHMuX2dyYW50UmVhZChyb2xlKSk7XG4gIH1cbn1cbiJdfQ==
|