@aws-cdk/aws-mediaconnect-alpha 2.263.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/shared.js ADDED
@@ -0,0 +1,668 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PixelAspectRatio = exports.Framerate = exports.EncryptionKeyType = exports.VpcInterface = exports.NetworkInterface = exports.MediaLivePipeline = exports.FailoverMode = exports.GatewayNetwork = exports.BridgeProtocol = exports.MaintenanceDay = exports.State = exports.KeyType = exports.EncryptionAlgorithm = void 0;
4
+ exports.renderTags = renderTags;
5
+ exports.toTitleCase = toTitleCase;
6
+ exports.validateMaintenanceTime = validateMaintenanceTime;
7
+ exports.resolveEncryptionRole = resolveEncryptionRole;
8
+ exports.renderStaticKeyEncryption = renderStaticKeyEncryption;
9
+ exports.renderSrtPasswordEncryption = renderSrtPasswordEncryption;
10
+ exports.renderRouterSrtEncryption = renderRouterSrtEncryption;
11
+ exports.renderTransitEncryption = renderTransitEncryption;
12
+ exports.resolveTransitEncryption = resolveTransitEncryption;
13
+ exports.resolveRouterSrtEncryption = resolveRouterSrtEncryption;
14
+ exports.exceedsRouterTierBitrate = exceedsRouterTierBitrate;
15
+ exports.isOpenCidr = isOpenCidr;
16
+ const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
17
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
18
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
19
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
20
+ const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
21
+ /**
22
+ * Encryption Algorithms used in AWS Elemental MediaConnect
23
+ */
24
+ class EncryptionAlgorithm {
25
+ value;
26
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.EncryptionAlgorithm", version: "2.263.0-alpha.0" };
27
+ /**
28
+ * Option for AES128
29
+ */
30
+ static AES128 = new EncryptionAlgorithm('aes128');
31
+ /**
32
+ * Option for AES192
33
+ */
34
+ static AES192 = new EncryptionAlgorithm('aes192');
35
+ /**
36
+ * Option for AES256
37
+ */
38
+ static AES256 = new EncryptionAlgorithm('aes256');
39
+ /**
40
+ * Use a custom encryption algorithm value
41
+ * @param value The encryption algorithm string value
42
+ */
43
+ static of(value) {
44
+ return new EncryptionAlgorithm(value);
45
+ }
46
+ /**
47
+ * @param value The encryption algorithm string value
48
+ */
49
+ constructor(value) {
50
+ this.value = value;
51
+ }
52
+ /** Returns the string value */
53
+ toString() {
54
+ return this.value;
55
+ }
56
+ }
57
+ exports.EncryptionAlgorithm = EncryptionAlgorithm;
58
+ /**
59
+ * Key types used across AWS Elemental MediaConnect
60
+ */
61
+ class KeyType {
62
+ value;
63
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.KeyType", version: "2.263.0-alpha.0" };
64
+ /**
65
+ * Option for Static Key
66
+ */
67
+ static STATIC_KEY = new KeyType('static-key');
68
+ /**
69
+ * Option for SRT Password
70
+ */
71
+ static SRT_PASSWORD = new KeyType('srt-password');
72
+ /**
73
+ * Use a custom key type value
74
+ * @param value The key type string value
75
+ */
76
+ static of(value) {
77
+ return new KeyType(value);
78
+ }
79
+ /**
80
+ * @param value The key type string value
81
+ */
82
+ constructor(value) {
83
+ this.value = value;
84
+ }
85
+ /** Returns the string value */
86
+ toString() {
87
+ return this.value;
88
+ }
89
+ }
90
+ exports.KeyType = KeyType;
91
+ /**
92
+ * State configuration used across AWS Elemental MediaConnect
93
+ */
94
+ var State;
95
+ (function (State) {
96
+ /**
97
+ * Option for Enabled
98
+ */
99
+ State["ENABLED"] = "ENABLED";
100
+ /**
101
+ * Option for Disabled
102
+ */
103
+ State["DISABLED"] = "DISABLED";
104
+ })(State || (exports.State = State = {}));
105
+ /**
106
+ * Days of the week for scheduled maintenance windows.
107
+ *
108
+ * Used by both Flow and Router maintenance configurations.
109
+ */
110
+ var MaintenanceDay;
111
+ (function (MaintenanceDay) {
112
+ /** Monday */
113
+ MaintenanceDay["MONDAY"] = "MONDAY";
114
+ /** Tuesday */
115
+ MaintenanceDay["TUESDAY"] = "TUESDAY";
116
+ /** Wednesday */
117
+ MaintenanceDay["WEDNESDAY"] = "WEDNESDAY";
118
+ /** Thursday */
119
+ MaintenanceDay["THURSDAY"] = "THURSDAY";
120
+ /** Friday */
121
+ MaintenanceDay["FRIDAY"] = "FRIDAY";
122
+ /** Saturday */
123
+ MaintenanceDay["SATURDAY"] = "SATURDAY";
124
+ /** Sunday */
125
+ MaintenanceDay["SUNDAY"] = "SUNDAY";
126
+ })(MaintenanceDay || (exports.MaintenanceDay = MaintenanceDay = {}));
127
+ /**
128
+ * Options for bridge network source and output protocols.
129
+ */
130
+ class BridgeProtocol {
131
+ value;
132
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.BridgeProtocol", version: "2.263.0-alpha.0" };
133
+ /**
134
+ * Option for RTP-FEC
135
+ */
136
+ static RTP_FEC = new BridgeProtocol('rtp-fec');
137
+ /**
138
+ * Option for RTP
139
+ */
140
+ static RTP = new BridgeProtocol('rtp');
141
+ /**
142
+ * Option for UDP
143
+ */
144
+ static UDP = new BridgeProtocol('udp');
145
+ /**
146
+ * Use a custom bridge protocol value
147
+ * @param value The bridge protocol string value
148
+ */
149
+ static of(value) {
150
+ return new BridgeProtocol(value);
151
+ }
152
+ /**
153
+ * @param value The bridge protocol string value
154
+ */
155
+ constructor(value) {
156
+ this.value = value;
157
+ }
158
+ /** Returns the string value */
159
+ toString() {
160
+ return this.value;
161
+ }
162
+ }
163
+ exports.BridgeProtocol = BridgeProtocol;
164
+ /**
165
+ * A network on a MediaConnect Gateway.
166
+ *
167
+ * Use {@link GatewayNetwork.define} to create a network and reference it from
168
+ * gateway, bridge source, and bridge output configurations.
169
+ *
170
+ * @example
171
+ *
172
+ * const productionNetwork = GatewayNetwork.define({
173
+ * name: 'production',
174
+ * cidrBlock: '10.0.0.0/16',
175
+ * });
176
+ */
177
+ class GatewayNetwork {
178
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.GatewayNetwork", version: "2.263.0-alpha.0" };
179
+ /**
180
+ * Define a new gateway network.
181
+ *
182
+ * @param props network properties
183
+ */
184
+ static define(props) {
185
+ try {
186
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_GatewayNetworkDefineProps(props);
187
+ }
188
+ catch (error) {
189
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
190
+ Error.captureStackTrace(error, this.define);
191
+ }
192
+ throw error;
193
+ }
194
+ if (!aws_cdk_lib_1.Token.isUnresolved(props.name)) {
195
+ if (props.name.length < 1 || props.name.length > 64) {
196
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `GatewayNetworkNameLength`, `Gateway network name must be between 1 and 64 characters, got ${props.name.length}`);
197
+ }
198
+ if (!/^[a-zA-Z0-9_-]+$/.test(props.name)) {
199
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `GatewayNetworkNameFormat`, `Gateway network name must contain only alphanumeric characters, hyphens, and underscores, got '${props.name}'`);
200
+ }
201
+ }
202
+ return new GatewayNetwork(props.name, props.cidrBlock);
203
+ }
204
+ /**
205
+ * The name of the network.
206
+ */
207
+ name;
208
+ /**
209
+ * A unique IP address range to use for this network in CIDR notation.
210
+ */
211
+ cidrBlock;
212
+ constructor(name, cidrBlock) {
213
+ this.name = name;
214
+ this.cidrBlock = cidrBlock;
215
+ }
216
+ }
217
+ exports.GatewayNetwork = GatewayNetwork;
218
+ /**
219
+ * Failover Mode
220
+ */
221
+ class FailoverMode {
222
+ value;
223
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.FailoverMode", version: "2.263.0-alpha.0" };
224
+ /**
225
+ * MERGE combines the source streams into a single stream, allowing graceful
226
+ * recovery from any single-source loss.
227
+ */
228
+ static MERGE = new FailoverMode('MERGE');
229
+ /**
230
+ * FAILOVER allows switching between different streams.
231
+ */
232
+ static FAILOVER = new FailoverMode('FAILOVER');
233
+ /**
234
+ * Use a custom failover mode value
235
+ * @param value The failover mode string value
236
+ */
237
+ static of(value) {
238
+ return new FailoverMode(value);
239
+ }
240
+ /**
241
+ * @param value The failover mode string value
242
+ */
243
+ constructor(value) {
244
+ this.value = value;
245
+ }
246
+ /** Returns the string value */
247
+ toString() {
248
+ return this.value;
249
+ }
250
+ }
251
+ exports.FailoverMode = FailoverMode;
252
+ /**
253
+ * Render tags for CloudFormation resources.
254
+ *
255
+ * @internal
256
+ */
257
+ function renderTags(tags) {
258
+ return Object.entries(tags).map(([key, value]) => ({
259
+ key,
260
+ value,
261
+ }));
262
+ }
263
+ /**
264
+ * Convert an uppercase enum value to title case (e.g. 'MONDAY' → 'Monday').
265
+ * Used at CFN boundaries where the API expects title-cased day names.
266
+ *
267
+ * @internal
268
+ */
269
+ function toTitleCase(day) {
270
+ return day.charAt(0) + day.slice(1).toLowerCase();
271
+ }
272
+ /**
273
+ * Validate a maintenance start hour string is in HH:00 format (24-hour, minutes must be 00).
274
+ * @param time The time string to validate
275
+ * @throws UnscopedValidationError if the format is invalid
276
+ *
277
+ * @internal
278
+ */
279
+ function validateMaintenanceTime(time) {
280
+ if (aws_cdk_lib_1.Token.isUnresolved(time)) {
281
+ return;
282
+ }
283
+ if (!/^([01]\d|2[0-3]):00$/.test(time)) {
284
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `MaintenanceTimeFormat`, `Maintenance time must be in HH:00 format (24-hour, minutes must be 00), got '${time}'`);
285
+ }
286
+ }
287
+ /**
288
+ * MediaLive pipeline options.
289
+ */
290
+ var MediaLivePipeline;
291
+ (function (MediaLivePipeline) {
292
+ /** Pipeline 0 */
293
+ MediaLivePipeline["PIPELINE_0"] = "PIPELINE_0";
294
+ /** Pipeline 1 */
295
+ MediaLivePipeline["PIPELINE_1"] = "PIPELINE_1";
296
+ })(MediaLivePipeline || (exports.MediaLivePipeline = MediaLivePipeline = {}));
297
+ /**
298
+ * Network interface options
299
+ */
300
+ class NetworkInterface {
301
+ value;
302
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.NetworkInterface", version: "2.263.0-alpha.0" };
303
+ /**
304
+ * Option for ENA
305
+ */
306
+ static ENA = new NetworkInterface('ena');
307
+ /**
308
+ * Option for EFA.
309
+ * For CDI ensure you use EFA.
310
+ */
311
+ static EFA = new NetworkInterface('efa');
312
+ /**
313
+ * Use a custom network interface value
314
+ * @param value The network interface string value
315
+ */
316
+ static of(value) {
317
+ return new NetworkInterface(value);
318
+ }
319
+ /**
320
+ * @param value The network interface string value
321
+ */
322
+ constructor(value) {
323
+ this.value = value;
324
+ }
325
+ /** Returns the string value */
326
+ toString() {
327
+ return this.value;
328
+ }
329
+ }
330
+ exports.NetworkInterface = NetworkInterface;
331
+ /**
332
+ * Factory class for creating VPC Interface configurations
333
+ */
334
+ class VpcInterface {
335
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.VpcInterface", version: "2.263.0-alpha.0" };
336
+ /**
337
+ * Define a new VPC Interface configuration. MediaConnect will create network interfaces automatically.
338
+ *
339
+ * @param props VPC Interface properties
340
+ * @returns VpcInterfaceConfig configuration object
341
+ */
342
+ static define(props) {
343
+ try {
344
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_VpcInterfaceDefineProps(props);
345
+ }
346
+ catch (error) {
347
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
348
+ Error.captureStackTrace(error, this.define);
349
+ }
350
+ throw error;
351
+ }
352
+ return {
353
+ name: props.vpcInterfaceName,
354
+ role: props.role,
355
+ securityGroups: props.securityGroups,
356
+ subnet: props.subnet,
357
+ networkInterfaceType: props.networkInterfaceType,
358
+ };
359
+ }
360
+ /**
361
+ * Create a VPC Interface configuration using existing network interfaces.
362
+ *
363
+ * @param props VPC Interface properties with existing network interface IDs
364
+ * @returns VpcInterfaceConfig configuration object
365
+ */
366
+ static fromNetworkInterfaces(props) {
367
+ try {
368
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_VpcInterfaceFromNetworkInterfacesProps(props);
369
+ }
370
+ catch (error) {
371
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
372
+ Error.captureStackTrace(error, this.fromNetworkInterfaces);
373
+ }
374
+ throw error;
375
+ }
376
+ return {
377
+ name: props.vpcInterfaceName,
378
+ role: props.role,
379
+ securityGroups: props.securityGroups,
380
+ subnet: props.subnet,
381
+ networkInterfaceIds: props.networkInterfaceIds,
382
+ };
383
+ }
384
+ }
385
+ exports.VpcInterface = VpcInterface;
386
+ /**
387
+ * Encryption key type for transit encryption
388
+ * @internal
389
+ */
390
+ var EncryptionKeyType;
391
+ (function (EncryptionKeyType) {
392
+ EncryptionKeyType["SECRETS_MANAGER"] = "SECRETS_MANAGER";
393
+ EncryptionKeyType["AUTOMATIC"] = "AUTOMATIC";
394
+ })(EncryptionKeyType || (exports.EncryptionKeyType = EncryptionKeyType = {}));
395
+ /**
396
+ * Resolve an IAM role for MediaConnect to access a Secrets Manager secret. Returns the
397
+ * user-provided `role` if present, otherwise auto-creates a scoped role: inline secret read,
398
+ * `kms:Decrypt` when the secret has a CMK, and a trust policy with `aws:SourceAccount`
399
+ * (plus `aws:SourceArn` when `sourceArn` is given). The returned `grant` lets callers order
400
+ * the role's secret-read policy before the consuming resource — required for router I/O.
401
+ *
402
+ * A provided role is used as-is and is not granted secret access — the caller is
403
+ * responsible for ensuring it can read the secret (and decrypt its KMS key, if any).
404
+ *
405
+ * @see https://docs.aws.amazon.com/mediaconnect/latest/ug/cross-service-confused-deputy-prevention.html
406
+ * @internal
407
+ */
408
+ function resolveEncryptionRole(scope, id, role, secret, sourceArn) {
409
+ if (role)
410
+ return { role };
411
+ const conditions = {
412
+ StringEquals: { 'aws:SourceAccount': aws_cdk_lib_1.Aws.ACCOUNT_ID },
413
+ };
414
+ if (sourceArn !== undefined) {
415
+ conditions.ArnLike = { 'aws:SourceArn': sourceArn };
416
+ }
417
+ const created = new aws_iam_1.Role(scope, id, {
418
+ assumedBy: new aws_iam_1.ServicePrincipal('mediaconnect.amazonaws.com', { conditions }),
419
+ description: 'Auto-generated MediaConnect role for accessing the encryption secret',
420
+ });
421
+ // Grant helper: adds secret read (GetSecretValue/DescribeSecret) plus kms:Decrypt
422
+ // (with a kms:ViaService condition) when the secret uses a customer-managed key.
423
+ const readGrant = secret.grantRead(created);
424
+ // grantRead covers 2 of the 4 secret-read actions MediaConnect's policy needs; add the
425
+ // other 2, scoped to the same secret. (Skipping the doc's `ListSecrets` — it needs
426
+ // `Resource: *` and isn't required to read a known secret.)
427
+ // https://docs.aws.amazon.com/mediaconnect/latest/ug/iam-policy-examples-asm-secrets.html
428
+ const extraGrant = aws_iam_1.Grant.addToPrincipal({
429
+ grantee: created,
430
+ actions: ['secretsmanager:GetResourcePolicy', 'secretsmanager:ListSecretVersionIds'],
431
+ resourceArns: [secret.secretArn],
432
+ });
433
+ return { role: created, grant: readGrant.combine(extraGrant) };
434
+ }
435
+ /**
436
+ * Render the CFN static-key encryption block, auto-creating a role when none is supplied.
437
+ * @internal
438
+ */
439
+ function renderStaticKeyEncryption(scope, encryption, sourceArn) {
440
+ const { role } = resolveEncryptionRole(scope, 'EncryptionRole', encryption.role, encryption.secret, sourceArn);
441
+ return {
442
+ keyType: KeyType.STATIC_KEY.value,
443
+ roleArn: role.roleArn,
444
+ secretArn: encryption.secret.secretArn,
445
+ algorithm: encryption.algorithm.value,
446
+ };
447
+ }
448
+ /**
449
+ * Render the CFN SRT-password encryption block, auto-creating a role when none is supplied.
450
+ * @internal
451
+ */
452
+ function renderSrtPasswordEncryption(scope, encryption, sourceArn) {
453
+ const { role } = resolveEncryptionRole(scope, 'EncryptionRole', encryption.role, encryption.secret, sourceArn);
454
+ return {
455
+ keyType: KeyType.SRT_PASSWORD.value,
456
+ roleArn: role.roleArn,
457
+ secretArn: encryption.secret.secretArn,
458
+ };
459
+ }
460
+ /**
461
+ * Render the CFN router SRT encryption block (inner `encryptionKey` object),
462
+ * auto-creating a role when none is supplied.
463
+ * @internal
464
+ */
465
+ function renderRouterSrtEncryption(scope, id, encryption, sourceArn) {
466
+ const { role } = resolveEncryptionRole(scope, id, encryption.role, encryption.secret, sourceArn);
467
+ return {
468
+ encryptionKey: {
469
+ roleArn: role.roleArn,
470
+ secretArn: encryption.secret.secretArn,
471
+ },
472
+ };
473
+ }
474
+ /**
475
+ * Render the CFN transit encryption block: SECRETS_MANAGER (auto-creating a role when
476
+ * none is supplied) when `encryption` is given, otherwise the AUTOMATIC default.
477
+ * @internal
478
+ */
479
+ function renderTransitEncryption(scope, id, encryption, sourceArn) {
480
+ if (encryption) {
481
+ const { role } = resolveEncryptionRole(scope, id, encryption.role, encryption.secret, sourceArn);
482
+ return {
483
+ encryptionKeyConfiguration: {
484
+ secretsManager: {
485
+ roleArn: role.roleArn,
486
+ secretArn: encryption.secret.secretArn,
487
+ },
488
+ },
489
+ encryptionKeyType: EncryptionKeyType.SECRETS_MANAGER,
490
+ };
491
+ }
492
+ return {
493
+ encryptionKeyType: EncryptionKeyType.AUTOMATIC,
494
+ encryptionKeyConfiguration: {
495
+ automatic: {},
496
+ },
497
+ };
498
+ }
499
+ /**
500
+ * Resolve transit encryption to its CFN config plus the auto-created role's secret-read
501
+ * grant (when a role was auto-created).
502
+ * @internal
503
+ */
504
+ function resolveTransitEncryption(scope, id, encryption, sourceArn) {
505
+ const resolved = encryption
506
+ ? resolveEncryptionRole(scope, id, encryption.role, encryption.secret, sourceArn)
507
+ : undefined;
508
+ const config = renderTransitEncryption(scope, id, encryption && resolved ? { ...encryption, role: resolved.role } : encryption, sourceArn);
509
+ return { config, grant: resolved?.grant };
510
+ }
511
+ /**
512
+ * Resolve router SRT encryption to its CFN config plus the auto-created role's secret-read
513
+ * grant (when a role was auto-created), so the consuming router I/O can order it before
514
+ * itself. See {@link resolveTransitEncryption} for why the ordering matters.
515
+ * @internal
516
+ */
517
+ function resolveRouterSrtEncryption(scope, id, encryption, sourceArn) {
518
+ const resolved = resolveEncryptionRole(scope, id, encryption.role, encryption.secret, sourceArn);
519
+ const config = renderRouterSrtEncryption(scope, id, { ...encryption, role: resolved.role }, sourceArn);
520
+ return { config, grant: resolved.grant };
521
+ }
522
+ /**
523
+ * A video frame rate expressed as a rational number (numerator/denominator).
524
+ *
525
+ * Use the predefined constants for standard rates, or {@link Framerate.of} for a custom rate.
526
+ */
527
+ class Framerate {
528
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.Framerate", version: "2.263.0-alpha.0" };
529
+ /** 24 fps (cinema) — `24/1`. */
530
+ static FPS_24 = new Framerate(24, 1);
531
+ /** 25 fps — `25/1`. */
532
+ static FPS_25 = new Framerate(25, 1);
533
+ /** 29.97 fps — `30000/1001`. */
534
+ static FPS_29_97 = new Framerate(30000, 1001);
535
+ /** 30 fps — `30/1`. */
536
+ static FPS_30 = new Framerate(30, 1);
537
+ /** 50 fps — `50/1`. */
538
+ static FPS_50 = new Framerate(50, 1);
539
+ /** 59.94 fps — `60000/1001`. */
540
+ static FPS_59_94 = new Framerate(60000, 1001);
541
+ /** 60 fps — `60/1`. */
542
+ static FPS_60 = new Framerate(60, 1);
543
+ /**
544
+ * Define a custom frame rate.
545
+ *
546
+ * @param numerator Numerator of the rate.
547
+ * @param denominator Denominator of the rate.
548
+ */
549
+ static of(numerator, denominator) {
550
+ if (!aws_cdk_lib_1.Token.isUnresolved(numerator) && (!Number.isInteger(numerator) || numerator <= 0)) {
551
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `FramerateNumerator`, `Frame rate numerator must be a positive integer, got ${numerator}`);
552
+ }
553
+ if (!aws_cdk_lib_1.Token.isUnresolved(denominator) && (!Number.isInteger(denominator) || denominator <= 0)) {
554
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `FramerateDenominator`, `Frame rate denominator must be a positive integer, got ${denominator}`);
555
+ }
556
+ return new Framerate(numerator, denominator);
557
+ }
558
+ /** @internal */
559
+ _numeratorValue;
560
+ /** @internal */
561
+ _denominatorValue;
562
+ constructor(numerator, denominator) {
563
+ this._numeratorValue = numerator;
564
+ this._denominatorValue = denominator;
565
+ }
566
+ /** Returns the string value. */
567
+ toString() {
568
+ return `${this._numeratorValue}/${this._denominatorValue}`;
569
+ }
570
+ /**
571
+ * Returns the number value.
572
+ * @internal
573
+ */
574
+ _numerator() {
575
+ return this._numeratorValue;
576
+ }
577
+ /**
578
+ * Returns the number value.
579
+ * @internal
580
+ */
581
+ _denominator() {
582
+ return this._denominatorValue;
583
+ }
584
+ }
585
+ exports.Framerate = Framerate;
586
+ /**
587
+ * The pixel aspect ratio (PAR) of the video.
588
+ *
589
+ * Use the predefined constants for standard ratios, or {@link PixelAspectRatio.of} for
590
+ * a custom ratio.
591
+ */
592
+ class PixelAspectRatio {
593
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.PixelAspectRatio", version: "2.263.0-alpha.0" };
594
+ /** Square pixels (`1:1`). */
595
+ static SQUARE = new PixelAspectRatio(1, 1);
596
+ /**
597
+ * Define a pixel aspect ratio.
598
+ *
599
+ * @param numerator Numerator of the ratio.
600
+ * @param denominator Denominator of the ratio.
601
+ */
602
+ static of(numerator, denominator) {
603
+ if (!aws_cdk_lib_1.Token.isUnresolved(numerator) && (!Number.isInteger(numerator) || numerator <= 0)) {
604
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `PixelAspectRatioNumerator`, `Pixel aspect ratio numerator must be a positive integer, got ${numerator}`);
605
+ }
606
+ if (!aws_cdk_lib_1.Token.isUnresolved(denominator) && (!Number.isInteger(denominator) || denominator <= 0)) {
607
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `PixelAspectRatioDenominator`, `Pixel aspect ratio denominator must be a positive integer, got ${denominator}`);
608
+ }
609
+ return new PixelAspectRatio(numerator, denominator);
610
+ }
611
+ /** @internal */
612
+ _numeratorValue;
613
+ /** @internal */
614
+ _denominatorValue;
615
+ /**
616
+ * @param numerator Numerator of the ratio.
617
+ * @param denominator Denominator of the ratio.
618
+ */
619
+ constructor(numerator, denominator) {
620
+ this._numeratorValue = numerator;
621
+ this._denominatorValue = denominator;
622
+ }
623
+ /** Returns the string value in `numerator:denominator` form. */
624
+ toString() {
625
+ return `${this._numeratorValue}:${this._denominatorValue}`;
626
+ }
627
+ /**
628
+ * The numerator of the ratio.
629
+ * @internal
630
+ */
631
+ _numerator() {
632
+ return this._numeratorValue;
633
+ }
634
+ /**
635
+ * The denominator of the ratio.
636
+ * @internal
637
+ */
638
+ _denominator() {
639
+ return this._denominatorValue;
640
+ }
641
+ }
642
+ exports.PixelAspectRatio = PixelAspectRatio;
643
+ /**
644
+ * Returns `true` when the given bitrate exceeds the specified tier's Mbps limit.
645
+ * Used by router input/output constructs to validate bitrate fits within the chosen tier.
646
+ *
647
+ * @param tierMbps The tier's bitrate limit in Mbps, or `undefined` for custom tiers.
648
+ * @param maximumBitrate The configured maximum bitrate.
649
+ * @returns `true` if the bitrate exceeds the tier limit; `false` otherwise (including custom tiers).
650
+ * @internal
651
+ */
652
+ function exceedsRouterTierBitrate(tierMbps, maximumBitrate) {
653
+ if (tierMbps === undefined || maximumBitrate.isUnresolved())
654
+ return false;
655
+ return maximumBitrate.toBps() > tierMbps * 1_000_000;
656
+ }
657
+ /**
658
+ * Returns `true` when the given CIDR literal is a fully-open range — any `/0`
659
+ * prefix, covering both IPv4 (`0.0.0.0/0`) and IPv6 (`::/0`). Callers are
660
+ * expected to pre-check for token-encoded values, since an unresolved token
661
+ * cannot be inspected.
662
+ *
663
+ * @internal
664
+ */
665
+ function isOpenCidr(cidr) {
666
+ return /\/0$/.test(cidr.trim());
667
+ }
668
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2hhcmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXFTQSxnQ0FLQztBQVFELGtDQUVDO0FBU0QsMERBVUM7QUFrVUQsc0RBb0NDO0FBTUQsOERBUUM7QUFNRCxrRUFPQztBQU9ELDhEQVFDO0FBT0QsMERBbUJDO0FBT0QsNERBV0M7QUFRRCxnRUFJQztBQThJRCw0REFHQztBQVVELGdDQUVDOzs7QUEzNkJELDZDQUFrRTtBQUVsRSxpREFBb0U7QUFHcEUsNEVBQTREO0FBRzVEOztHQUVHO0FBQ0gsTUFBYSxtQkFBbUI7SUF5Qk07O0lBeEJwQzs7T0FFRztJQUNJLE1BQU0sQ0FBVSxNQUFNLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRTs7T0FFRztJQUNJLE1BQU0sQ0FBVSxNQUFNLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRTs7T0FFRztJQUNJLE1BQU0sQ0FBVSxNQUFNLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVsRTs7O09BR0c7SUFDSSxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQWE7UUFDNUIsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3ZDO0lBRUQ7O09BRUc7SUFDSCxZQUFvQyxLQUFhO1FBQWIsVUFBSyxHQUFMLEtBQUssQ0FBUTtLQUFJO0lBRXJELCtCQUErQjtJQUN4QixRQUFRO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0tBQ25COztBQTlCSCxrREErQkM7QUFFRDs7R0FFRztBQUNILE1BQWEsT0FBTztJQXFCa0I7O0lBcEJwQzs7T0FFRztJQUNJLE1BQU0sQ0FBVSxVQUFVLEdBQUcsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDOUQ7O09BRUc7SUFDSSxNQUFNLENBQVUsWUFBWSxHQUFHLElBQUksT0FBTyxDQUFDLGNB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R0c7SUFDSSxZQUFZO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0tBQy9COztBQXJESCw0Q0FzREM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLHdCQUF3QixDQUFDLFFBQTRCLEVBQUUsY0FBdUI7SUFDNUYsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLGNBQWMsQ0FBQyxZQUFZLEVBQUU7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxRSxPQUFPLGNBQWMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxRQUFRLEdBQUcsU0FBUyxDQUFDO0FBQ3ZELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsVUFBVSxDQUFDLElBQVk7SUFDckMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJpdHJhdGUgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBBd3MsIFRva2VuLCBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlIHsgSVNlY3VyaXR5R3JvdXAsIElTdWJuZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7IEdyYW50LCBSb2xlLCBTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgdHlwZSB7IElSb2xlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgdHlwZSB7IElTZWNyZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXInO1xuaW1wb3J0IHsgbGl0IH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIEVuY3J5cHRpb24gQWxnb3JpdGhtcyB1c2VkIGluIEFXUyBFbGVtZW50YWwgTWVkaWFDb25uZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBFbmNyeXB0aW9uQWxnb3JpdGhtIHtcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgQUVTMTI4XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFFUzEyOCA9IG5ldyBFbmNyeXB0aW9uQWxnb3JpdGhtKCdhZXMxMjgnKTtcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgQUVTMTkyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFFUzE5MiA9IG5ldyBFbmNyeXB0aW9uQWxnb3JpdGhtKCdhZXMxOTInKTtcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgQUVTMjU2XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFFUzI1NiA9IG5ldyBFbmNyeXB0aW9uQWxnb3JpdGhtKCdhZXMyNTYnKTtcblxuICAvKipcbiAgICogVXNlIGEgY3VzdG9tIGVuY3J5cHRpb24gYWxnb3JpdGhtIHZhbHVlXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgZW5jcnlwdGlvbiBhbGdvcml0aG0gc3RyaW5nIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBFbmNyeXB0aW9uQWxnb3JpdGhtIHtcbiAgICByZXR1cm4gbmV3IEVuY3J5cHRpb25BbGdvcml0aG0odmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgZW5jcnlwdGlvbiBhbGdvcml0aG0gc3RyaW5nIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBLZXkgdHlwZXMgdXNlZCBhY3Jvc3MgQVdTIEVsZW1lbnRhbCBNZWRpYUNvbm5lY3RcbiAqL1xuZXhwb3J0IGNsYXNzIEtleVR5cGUge1xuICAvKipcbiAgICogT3B0aW9uIGZvciBTdGF0aWMgS2V5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNUQVRJQ19LRVkgPSBuZXcgS2V5VHlwZSgnc3RhdGljLWtleScpO1xuICAvKipcbiAgICogT3B0aW9uIGZvciBTUlQgUGFzc3dvcmRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1JUX1BBU1NXT1JEID0gbmV3IEtleVR5cGUoJ3NydC1wYXNzd29yZCcpO1xuXG4gIC8qKlxuICAgKiBVc2UgYSBjdXN0b20ga2V5IHR5cGUgdmFsdWVcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBrZXkgdHlwZSBzdHJpbmcgdmFsdWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyk6IEtleVR5cGUge1xuICAgIHJldHVybiBuZXcgS2V5VHlwZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBrZXkgdHlwZSBzdHJpbmcgdmFsdWVcbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmcpIHt9XG5cbiAgLyoqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFN0YXRlIGNvbmZpZ3VyYXRpb24gdXNlZCBhY3Jvc3MgQVdTIEVsZW1lbnRhbCBNZWRpYUNvbm5lY3RcbiAqL1xuZXhwb3J0IGVudW0gU3RhdGUge1xuICAvKipcbiAgICogT3B0aW9uIGZvciBFbmFibGVkXG4gICAqL1xuICBFTkFCTEVEPSdFTkFCTEVEJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgRGlzYWJsZWRcbiAgICovXG4gIERJU0FCTEVEPSdESVNBQkxFRCcsXG59XG5cbi8qKlxuICogRGF5cyBvZiB0aGUgd2VlayBmb3Igc2NoZWR1bGVkIG1haW50ZW5hbmNlIHdpbmRvd3MuXG4gKlxuICogVXNlZCBieSBib3RoIEZsb3cgYW5kIFJvdXRlciBtYWludGVuYW5jZSBjb25maWd1cmF0aW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gTWFpbnRlbmFuY2VEYXkge1xuICAvKiogTW9uZGF5ICovXG4gIE1PTkRBWT0nTU9OREFZJyxcbiAgLyoqIFR1ZXNkYXkgKi9cbiAgVFVFU0RBWT0nVFVFU0RBWScsXG4gIC8qKiBXZWRuZXNkYXkgKi9cbiAgV0VETkVTREFZPSdXRURORVNEQVknLFxuICAvKiogVGh1cnNkYXkgKi9cbiAgVEhVUlNEQVk9J1RIVVJTREFZJyxcbiAgLyoqIEZyaWRheSAqL1xuICBGUklEQVk9J0ZSSURBWScsXG4gIC8qKiBTYXR1cmRheSAqL1xuICBTQVRVUkRBWT0nU0FUVVJEQVknLFxuICAvKiogU3VuZGF5ICovXG4gIFNVTkRBWT0nU1VOREFZJyxcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBicmlkZ2UgbmV0d29yayBzb3VyY2UgYW5kIG91dHB1dCBwcm90b2NvbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCcmlkZ2VQcm90b2NvbCB7XG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIFJUUC1GRUNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUlRQX0ZFQyA9IG5ldyBCcmlkZ2VQcm90b2NvbCgncnRwLWZlYycpO1xuICAvKipcbiAgICogT3B0aW9uIGZvciBSVFBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUlRQID0gbmV3IEJyaWRnZVByb3RvY29sKCdydHAnKTtcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgVURQXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFVEUCA9IG5ldyBCcmlkZ2VQcm90b2NvbCgndWRwJyk7XG5cbiAgLyoqXG4gICAqIFVzZSBhIGN1c3RvbSBicmlkZ2UgcHJvdG9jb2wgdmFsdWVcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBicmlkZ2UgcHJvdG9jb2wgc3RyaW5nIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBCcmlkZ2VQcm90b2NvbCB7XG4gICAgcmV0dXJuIG5ldyBCcmlkZ2VQcm90b2NvbCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBicmlkZ2UgcHJvdG9jb2wgc3RyaW5nIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBkZWZpbmluZyBhIEdhdGV3YXkgbmV0d29yay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHYXRld2F5TmV0d29ya0RlZmluZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBuZXR3b3JrLiBVc2VkIHRvIHJlZmVyZW5jZSB0aGlzIG5ldHdvcmsgZnJvbSBicmlkZ2Ugc291cmNlc1xuICAgKiBhbmQgb3V0cHV0cywgYW5kIG11c3QgYmUgdW5pcXVlIGFtb25nIHRoZSBuZXR3b3JrcyBvbiB0aGUgZ2F0ZXdheS5cbiAgICpcbiAgICogTWF4aW11bSA2NCBjaGFyYWN0ZXJzOyBhbHBoYW51bWVyaWMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3JlcyBvbmx5LlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogQSB1bmlxdWUgSVAgYWRkcmVzcyByYW5nZSB0byB1c2UgZm9yIHRoaXMgbmV0d29yay4gTXVzdCBiZSBpbiBDSURSIG5vdGF0aW9uXG4gICAqIChmb3IgZXhhbXBsZSwgYDEwLjAuMC4wLzE2YCkuXG4gICAqL1xuICByZWFkb25seSBjaWRyQmxvY2s6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIG5ldHdvcmsgb24gYSBNZWRpYUNvbm5lY3QgR2F0ZXdheS5cbiAqXG4gKiBVc2Uge0BsaW5rIEdhdGV3YXlOZXR3b3JrLmRlZmluZX0gdG8gY3JlYXRlIGEgbmV0d29yayBhbmQgcmVmZXJlbmNlIGl0IGZyb21cbiAqIGdhdGV3YXksIGJyaWRnZSBzb3VyY2UsIGFuZCBicmlkZ2Ugb3V0cHV0IGNvbmZpZ3VyYXRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgY29uc3QgcHJvZHVjdGlvbk5ldHdvcmsgPSBHYXRld2F5TmV0d29yay5kZWZpbmUoe1xuICogICAgICBuYW1lOiAncHJvZHVjdGlvbicsXG4gKiAgICAgIGNpZHJCbG9jazogJzEwLjAuMC4wLzE2JyxcbiAqICAgIH0pO1xuICovXG5leHBvcnQgY2xhc3MgR2F0ZXdheU5ldHdvcmsge1xuICAvKipcbiAgICogRGVmaW5lIGEgbmV3IGdhdGV3YXkgbmV0d29yay5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIG5ldHdvcmsgcHJvcGVydGllc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWZpbmUocHJvcHM6IEdhdGV3YXlOZXR3b3JrRGVmaW5lUHJvcHMpOiBHYXRld2F5TmV0d29yayB7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMubmFtZSkpIHtcbiAgICAgIGlmIChwcm9wcy5uYW1lLmxlbmd0aCA8IDEgfHwgcHJvcHMubmFtZS5sZW5ndGggPiA2NCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YEdhdGV3YXlOZXR3b3JrTmFtZUxlbmd0aGAsXG4gICAgICAgICAgYEdhdGV3YXkgbmV0d29yayBuYW1lIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA2NCBjaGFyYWN0ZXJzLCBnb3QgJHtwcm9wcy5uYW1lLmxlbmd0aH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCEvXlthLXpBLVowLTlfLV0rJC8udGVzdChwcm9wcy5uYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YEdhdGV3YXlOZXR3b3JrTmFtZUZvcm1hdGAsXG4gICAgICAgICAgYEdhdGV3YXkgbmV0d29yayBuYW1lIG11c3QgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXMsIGdvdCAnJHtwcm9wcy5uYW1lfSdgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgR2F0ZXdheU5ldHdvcmsocHJvcHMubmFtZSwgcHJvcHMuY2lkckJsb2NrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbmV0d29yay5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdW5pcXVlIElQIGFkZHJlc3MgcmFuZ2UgdG8gdXNlIGZvciB0aGlzIG5ldHdvcmsgaW4gQ0lEUiBub3RhdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjaWRyQmxvY2s6IHN0cmluZztcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgY2lkckJsb2NrOiBzdHJpbmcpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY2lkckJsb2NrID0gY2lkckJsb2NrO1xuICB9XG59XG5cbi8qKlxuICogQnJpZGdlIG5ldHdvcmsgc291cmNlIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmlkZ2VOZXR3b3JrU291cmNlIHtcbiAgLyoqXG4gICAqIFRoZSBuZXR3b3JrIHNvdXJjZSBtdWx0aWNhc3QgSVAuXG4gICAqXG4gICAqIE11c3QgYmUgYSB2YWxpZCBNdWx0aWNhc3QgSVAgYWRkcmVzcy5cbiAgICovXG4gIHJlYWRvbmx5IG11bHRpY2FzdElwOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZyByZWxhdGVkIHRvIHRoZSBtdWx0aWNhc3Qgc291cmNlLlxuICAgKlxuICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgc291cmNlIGZvciBzb3VyY2Utc3BlY2lmaWMgbXVsdGljYXN0IChTU00pLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIG11bHRpY2FzdCBzb3VyY2UgSVBcbiAgICovXG4gIHJlYWRvbmx5IG11bHRpY2FzdFNvdXJjZUlwPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGdhdGV3YXkgbmV0d29yayB0aGlzIHNvdXJjZSBsaXN0ZW5zIG9uLlxuICAgKlxuICAgKiBVc2Uge0BsaW5rIEdhdGV3YXlOZXR3b3JrLmRlZmluZX0gdG8gY3JlYXRlIHRoZSBuZXR3b3JrIGFuZCBwYXNzIHRoZSBzYW1lXG4gICAqIGluc3RhbmNlIHRvIHRoZSBnYXRld2F5IGFuZCB0byBlYWNoIHNvdXJjZSB0aGF0IHVzZXMgaXQuXG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrOiBHYXRld2F5TmV0d29yaztcbiAgLyoqXG4gICAqIFRoZSBuZXR3b3JrIHNvdXJjZSBwb3J0LlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG5ldHdvcmsgc291cmNlIHByb3RvY29sLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdG9jb2w6IEJyaWRnZVByb3RvY29sO1xufVxuXG4vKipcbiAqIEZhaWxvdmVyIE1vZGVcbiAqL1xuZXhwb3J0IGNsYXNzIEZhaWxvdmVyTW9kZSB7XG4gIC8qKlxuICAgKiBNRVJHRSBjb21iaW5lcyB0aGUgc291cmNlIHN0cmVhbXMgaW50byBhIHNpbmdsZSBzdHJlYW0sIGFsbG93aW5nIGdyYWNlZnVsXG4gICAqIHJlY292ZXJ5IGZyb20gYW55IHNpbmdsZS1zb3VyY2UgbG9zcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTUVSR0UgPSBuZXcgRmFpbG92ZXJNb2RlKCdNRVJHRScpO1xuICAvKipcbiAgICogRkFJTE9WRVIgYWxsb3dzIHN3aXRjaGluZyBiZXR3ZWVuIGRpZmZlcmVudCBzdHJlYW1zLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBGQUlMT1ZFUiA9IG5ldyBGYWlsb3Zlck1vZGUoJ0ZBSUxPVkVSJyk7XG5cbiAgLyoqXG4gICAqIFVzZSBhIGN1c3RvbSBmYWlsb3ZlciBtb2RlIHZhbHVlXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgZmFpbG92ZXIgbW9kZSBzdHJpbmcgdmFsdWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyk6IEZhaWxvdmVyTW9kZSB7XG4gICAgcmV0dXJuIG5ldyBGYWlsb3Zlck1vZGUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgZmFpbG92ZXIgbW9kZSBzdHJpbmcgdmFsdWVcbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmcpIHt9XG5cbiAgLyoqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxufVxuLyoqXG4gKiBSZW5kZXIgdGFncyBmb3IgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2VzLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVGFncyh0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogQXJyYXk8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9PiB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyh0YWdzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICBrZXksXG4gICAgdmFsdWUsXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGFuIHVwcGVyY2FzZSBlbnVtIHZhbHVlIHRvIHRpdGxlIGNhc2UgKGUuZy4gJ01PTkRBWScg4oaSICdNb25kYXknKS5cbiAqIFVzZWQgYXQgQ0ZOIGJvdW5kYXJpZXMgd2hlcmUgdGhlIEFQSSBleHBlY3RzIHRpdGxlLWNhc2VkIGRheSBuYW1lcy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVGl0bGVDYXNlKGRheTogTWFpbnRlbmFuY2VEYXkpOiBzdHJpbmcge1xuICByZXR1cm4gZGF5LmNoYXJBdCgwKSArIGRheS5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgbWFpbnRlbmFuY2Ugc3RhcnQgaG91ciBzdHJpbmcgaXMgaW4gSEg6MDAgZm9ybWF0ICgyNC1ob3VyLCBtaW51dGVzIG11c3QgYmUgMDApLlxuICogQHBhcmFtIHRpbWUgVGhlIHRpbWUgc3RyaW5nIHRvIHZhbGlkYXRlXG4gKiBAdGhyb3dzIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yIGlmIHRoZSBmb3JtYXQgaXMgaW52YWxpZFxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNYWludGVuYW5jZVRpbWUodGltZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQodGltZSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCEvXihbMDFdXFxkfDJbMC0zXSk6MDAkLy50ZXN0KHRpbWUpKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgbGl0YE1haW50ZW5hbmNlVGltZUZvcm1hdGAsXG4gICAgICBgTWFpbnRlbmFuY2UgdGltZSBtdXN0IGJlIGluIEhIOjAwIGZvcm1hdCAoMjQtaG91ciwgbWludXRlcyBtdXN0IGJlIDAwKSwgZ290ICcke3RpbWV9J2AsXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIE1lZGlhTGl2ZSBwaXBlbGluZSBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBNZWRpYUxpdmVQaXBlbGluZSB7XG4gIC8qKiBQaXBlbGluZSAwICovXG4gIFBJUEVMSU5FXzAgPSAnUElQRUxJTkVfMCcsXG4gIC8qKiBQaXBlbGluZSAxICovXG4gIFBJUEVMSU5FXzEgPSAnUElQRUxJTkVfMScsXG59XG5cbi8qKlxuICogTmV0d29yayBpbnRlcmZhY2Ugb3B0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgTmV0d29ya0ludGVyZmFjZSB7XG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIEVOQVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBFTkEgPSBuZXcgTmV0d29ya0ludGVyZmFjZSgnZW5hJyk7XG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIEVGQS5cbiAgICogRm9yIENESSBlbnN1cmUgeW91IHVzZSBFRkEuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEVGQSA9IG5ldyBOZXR3b3JrSW50ZXJmYWNlKCdlZmEnKTtcblxuICAvKipcbiAgICogVXNlIGEgY3VzdG9tIG5ldHdvcmsgaW50ZXJmYWNlIHZhbHVlXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV0d29yayBpbnRlcmZhY2Ugc3RyaW5nIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBOZXR3b3JrSW50ZXJmYWNlIHtcbiAgICByZXR1cm4gbmV3IE5ldHdvcmtJbnRlcmZhY2UodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV0d29yayBpbnRlcmZhY2Ugc3RyaW5nIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBWUEMgSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWcGNJbnRlcmZhY2VDb25maWcge1xuICAvKipcbiAgICogVW5pcXVlIG5hbWUgZm9yIHRoaXMgVlBDIGludGVyZmFjZSB3aXRoaW4gdGhlIGZsb3cuIENhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIGNyZWF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogSURzIG9mIHRoZSBuZXR3b3JrIGludGVyZmFjZXMuIFNldCB0aGlzIHdoZW4gaW1wb3J0aW5nIGV4aXN0aW5nIEVOSXMgdmlhXG4gICAqIGBWcGNJbnRlcmZhY2UuZnJvbU5ldHdvcmtJbnRlcmZhY2VzKClgOyBsZWF2ZSB1bnNldCB0byBoYXZlIE1lZGlhQ29ubmVjdCBjcmVhdGUgdGhlbS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBNZWRpYUNvbm5lY3QgY3JlYXRlcyBuZXR3b3JrIGludGVyZmFjZXMgYXV0b21hdGljYWxseVxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya0ludGVyZmFjZUlkcz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgbmV0d29yayBpbnRlcmZhY2UuIFVzZSBgRUZBYCBmb3IgQ0RJIHdvcmtmbG93cy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQ7IHdoZW4gb21pdHRlZCwgTWVkaWFDb25uZWN0IGFwcGxpZXMgTmV0d29ya0ludGVyZmFjZS5FTkEgYXQgZGVwbG95IHRpbWVcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtJbnRlcmZhY2VUeXBlPzogTmV0d29ya0ludGVyZmFjZTtcbiAgLyoqXG4gICAqIElBTSByb2xlIHRoYXQgTWVkaWFDb25uZWN0IGFzc3VtZXMgdG8gY3JlYXRlIEVOSXMgaW4geW91ciBhY2NvdW50LlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZTogSVJvbGU7XG4gIC8qKlxuICAgKiBTZWN1cml0eSBncm91cHMgdG8gYXBwbHkgdG8gdGhlIEVOSS5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBzOiBJU2VjdXJpdHlHcm91cFtdO1xuICAvKipcbiAgICogU3VibmV0IHdoZXJlIHRoZSBFTkkgaXMgY3JlYXRlZC4gTXVzdCBiZSBpbiB0aGUgc2FtZSBBdmFpbGFiaWxpdHkgWm9uZSBhcyB0aGUgZmxvdy5cbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldDogSVN1Ym5ldDtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBkZWZpbmluZyBhIG5ldyBWUEMgSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWcGNJbnRlcmZhY2VEZWZpbmVQcm9wcyB7XG4gIC8qKlxuICAgKiBVbmlxdWUgbmFtZSBmb3IgdGhpcyBWUEMgaW50ZXJmYWNlIHdpdGhpbiB0aGUgZmxvdy4gQ2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIgY3JlYXRpb24uXG4gICAqL1xuICByZWFkb25seSB2cGNJbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJQU0gcm9sZSB0aGF0IE1lZGlhQ29ubmVjdCBhc3N1bWVzIHRvIGNyZWF0ZSBFTklzIGluIHlvdXIgYWNjb3VudC5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU6IElSb2xlO1xuICAvKipcbiAgICogU2VjdXJpdHkgZ3JvdXBzIHRvIGFwcGx5IHRvIHRoZSBFTkkuXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwczogSVNlY3VyaXR5R3JvdXBbXTtcbiAgLyoqXG4gICAqIFN1Ym5ldCB3aGVyZSB0aGUgRU5JIGlzIGNyZWF0ZWQuIE11c3QgYmUgaW4gdGhlIHNhbWUgQXZhaWxhYmlsaXR5IFpvbmUgYXMgdGhlIGZsb3cuXG4gICAqL1xuICByZWFkb25seSBzdWJuZXQ6IElTdWJuZXQ7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBuZXR3b3JrIGludGVyZmFjZS4gVXNlIGBFRkFgIGZvciBDREkgd29ya2Zsb3dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZDsgd2hlbiBvbWl0dGVkLCBNZWRpYUNvbm5lY3QgYXBwbGllcyBOZXR3b3JrSW50ZXJmYWNlLkVOQSBhdCBkZXBsb3kgdGltZVxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya0ludGVyZmFjZVR5cGU/OiBOZXR3b3JrSW50ZXJmYWNlO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGEgVlBDIEludGVyZmFjZSBmcm9tIGV4aXN0aW5nIG5ldHdvcmsgaW50ZXJmYWNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZwY0ludGVyZmFjZUZyb21OZXR3b3JrSW50ZXJmYWNlc1Byb3BzIHtcbiAgLyoqXG4gICAqIFVuaXF1ZSBuYW1lIGZvciB0aGlzIFZQQyBpbnRlcmZhY2Ugd2l0aGluIHRoZSBmbG93LiBDYW5ub3QgYmUgY2hhbmdlZCBhZnRlciBjcmVhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHZwY0ludGVyZmFjZU5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIElBTSByb2xlIHRoYXQgTWVkaWFDb25uZWN0IGFzc3VtZXMgdG8gYWNjZXNzIHRoZSBFTklzLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZTogSVJvbGU7XG4gIC8qKlxuICAgKiBTZWN1cml0eSBncm91cHMgYXBwbGllZCB0byB0aGUgZXhpc3RpbmcgRU5Jcy5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBzOiBJU2VjdXJpdHlHcm91cFtdO1xuICAvKipcbiAgICogU3VibmV0IHdoZXJlIHRoZSBleGlzdGluZyBFTklzIGxpdmUuIE11c3QgYmUgaW4gdGhlIHNhbWUgQXZhaWxhYmlsaXR5IFpvbmUgYXMgdGhlIGZsb3cuXG4gICAqL1xuICByZWFkb25seSBzdWJuZXQ6IElTdWJuZXQ7XG4gIC8qKlxuICAgKiBJRHMgb2YgdGhlIHByZS1jcmVhdGVkIG5ldHdvcmsgaW50ZXJmYWNlcyB0byByZXVzZS5cbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtJbnRlcmZhY2VJZHM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIFZQQyBJbnRlcmZhY2UgY29uZmlndXJhdGlvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIFZwY0ludGVyZmFjZSB7XG4gIC8qKlxuICAgKiBEZWZpbmUgYSBuZXcgVlBDIEludGVyZmFjZSBjb25maWd1cmF0aW9uLiBNZWRpYUNvbm5lY3Qgd2lsbCBjcmVhdGUgbmV0d29yayBpbnRlcmZhY2VzIGF1dG9tYXRpY2FsbHkuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyBWUEMgSW50ZXJmYWNlIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgVnBjSW50ZXJmYWNlQ29uZmlnIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRlZmluZShwcm9wczogVnBjSW50ZXJmYWNlRGVmaW5lUHJvcHMpOiBWcGNJbnRlcmZhY2VDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBwcm9wcy52cGNJbnRlcmZhY2VOYW1lLFxuICAgICAgcm9sZTogcHJvcHMucm9sZSxcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiBwcm9wcy5zZWN1cml0eUdyb3VwcyxcbiAgICAgIHN1Ym5ldDogcHJvcHMuc3VibmV0LFxuICAgICAgbmV0d29ya0ludGVyZmFjZVR5cGU6IHByb3BzLm5ldHdvcmtJbnRlcmZhY2VUeXBlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgVlBDIEludGVyZmFjZSBjb25maWd1cmF0aW9uIHVzaW5nIGV4aXN0aW5nIG5ldHdvcmsgaW50ZXJmYWNlcy5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIFZQQyBJbnRlcmZhY2UgcHJvcGVydGllcyB3aXRoIGV4aXN0aW5nIG5ldHdvcmsgaW50ZXJmYWNlIElEc1xuICAgKiBAcmV0dXJucyBWcGNJbnRlcmZhY2VDb25maWcgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbU5ldHdvcmtJbnRlcmZhY2VzKHByb3BzOiBWcGNJbnRlcmZhY2VGcm9tTmV0d29ya0ludGVyZmFjZXNQcm9wcyk6IFZwY0ludGVyZmFjZUNvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHByb3BzLnZwY0ludGVyZmFjZU5hbWUsXG4gICAgICByb2xlOiBwcm9wcy5yb2xlLFxuICAgICAgc2VjdXJpdHlHcm91cHM6IHByb3BzLnNlY3VyaXR5R3JvdXBzLFxuICAgICAgc3VibmV0OiBwcm9wcy5zdWJuZXQsXG4gICAgICBuZXR3b3JrSW50ZXJmYWNlSWRzOiBwcm9wcy5uZXR3b3JrSW50ZXJmYWNlSWRzLFxuICAgIH07XG4gIH1cbn1cbi8qKlxuICogU3RhdGljIGtleSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgWml4aSBwcm90b2NvbCBzb3VyY2VzIGFuZCBvdXRwdXRzLFxuICogYW5kIGZsb3cgZW50aXRsZW1lbnRzLlxuICpcbiAqIFRoZSBzZWNyZXQgbXVzdCBsaXZlIGluIHRoZSBzYW1lIEFXUyBhY2NvdW50IGFuZCBSZWdpb24gYXMgdGhlIHJlc291cmNlIChzb3VyY2UsXG4gKiBvdXRwdXQsIG9yIGVudGl0bGVtZW50KSB0aGF0IHVzZXMgaXQuIE1lZGlhQ29ubmVjdCBkb2VzIG5vdCBzdXBwb3J0IGNyb3NzLWFjY291bnQgb3JcbiAqIGNyb3NzLVJlZ2lvbiBzZWNyZXRzLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhY29ubmVjdC9sYXRlc3QvdWcvZW5jcnlwdGlvbi1zdGF0aWMta2V5LXNldC11cC5odG1sXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYWNvbm5lY3QvbGF0ZXN0L3VnL2Nyb3NzLXNlcnZpY2UtY29uZnVzZWQtZGVwdXR5LXByZXZlbnRpb24uaHRtbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRpY0tleUVuY3J5cHRpb24ge1xuICAvKipcbiAgICogSUFNIHJvbGUgdGhhdCBNZWRpYUNvbm5lY3QgYXNzdW1lcyB0byBhY2Nlc3MgdGhlIFNlY3JldHMgTWFuYWdlciBzZWNyZXQuXG4gICAqXG4gICAqIElmIHByb3ZpZGVkLCB0aGUgcm9sZSBpcyB1c2VkIGFzLWlzOyB5b3UgbXVzdCBncmFudCBpdCB0aGUgbmVjZXNzYXJ5IHBlcm1pc3Npb25zXG4gICAqIHlvdXJzZWxmLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgc2NvcGVkIHJvbGUgaXMgYXV0by1jcmVhdGVkIHdpdGggcmVhZCBhY2Nlc3MgdG8gdGhlIHNlY3JldCAoaW5jbHVkaW5nXG4gICAqIGBrbXM6RGVjcnlwdGAgZm9yIGEgY3VzdG9tZXItbWFuYWdlZCBrZXkpIGFuZCBhIGNvbmZ1c2VkLWRlcHV0eSB0cnVzdCBjb25kaXRpb24uIFNlZVxuICAgKiB0aGUgKipFbmNyeXB0aW9uKiogc2VjdGlvbiBvZiB0aGUgbW9kdWxlIFJFQURNRSBmb3IgdGhlIGdlbmVyYXRlZCB0cnVzdCBwb2xpY3kuXG4gICAqL1xuICByZWFkb25seSByb2xlPzogSVJvbGU7XG4gIC8qKlxuICAgKiBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IGNvbnRhaW5pbmcgdGhlIHN0YXRpYyBlbmNyeXB0aW9uIGtleS5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldDogSVNlY3JldDtcbiAgLyoqXG4gICAqIFRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobSB0byB1c2UuXG4gICAqL1xuICByZWFkb25seSBhbGdvcml0aG06IEVuY3J5cHRpb25BbGdvcml0aG07XG59XG5cbi8qKlxuICogU1JUIHBhc3N3b3JkIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBjb25maWd1cmF0aW9uIGZvciBTUlQgTGlzdGVuZXIgYW5kIFNSVCBDYWxsZXJcbiAqIHNvdXJjZXMgYW5kIG91dHB1dHMgb24gZmxvd3MuXG4gKlxuICogVGhlIHNlY3JldCBtdXN0IGxpdmUgaW4gdGhlIHNhbWUgQVdTIGFjY291bnQgYW5kIFJlZ2lvbiBhcyB0aGUgcmVzb3VyY2UgKHNvdXJjZSBvclxuICogb3V0cHV0KSB0aGF0IHVzZXMgaXQuIE1lZGlhQ29ubmVjdCBkb2VzIG5vdCBzdXBwb3J0IGNyb3NzLWFjY291bnQgb3IgY3Jvc3MtUmVnaW9uXG4gKiBzZWNyZXRzLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhY29ubmVjdC9sYXRlc3QvdWcvZW5jcnlwdGlvbi1zcnQtcGFzc3dvcmQtc2V0LXVwLmh0bWxcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhY29ubmVjdC9sYXRlc3QvdWcvY3Jvc3Mtc2VydmljZS1jb25mdXNlZC1kZXB1dHktcHJldmVudGlvbi5odG1sXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3J0UGFzc3dvcmRFbmNyeXB0aW9uIHtcbiAgLyoqXG4gICAqIElBTSByb2xlIHRoYXQgTWVkaWFDb25uZWN0IGFzc3VtZXMgdG8gYWNjZXNzIHRoZSBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0LlxuICAgKlxuICAgKiBJZiBwcm92aWRlZCwgdGhlIHJvbGUgaXMgdXNlZCBhcy1pczsgeW91IG11c3QgZ3JhbnQgaXQgdGhlIG5lY2Vzc2FyeSBwZXJtaXNzaW9uc1xuICAgKiB5b3Vyc2VsZi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIHNjb3BlZCByb2xlIGlzIGF1dG8tY3JlYXRlZCB3aXRoIHJlYWQgYWNjZXNzIHRvIHRoZSBzZWNyZXQgYW5kIGFcbiAgICogY29uZnVzZWQtZGVwdXR5IHRydXN0IGNvbmRpdGlvbi4gU2VlIHRoZSAqKkVuY3J5cHRpb24qKiBzZWN0aW9uIG9mIHRoZSBtb2R1bGUgUkVBRE1FXG4gICAqIGZvciB0aGUgZ2VuZXJhdGVkIHRydXN0IHBvbGljeS5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBJUm9sZTtcbiAgLyoqXG4gICAqIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgY29udGFpbmluZyB0aGUgU1JUIHBhc3NwaHJhc2UuXG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ6IElTZWNyZXQ7XG59XG5cbi8qKlxuICogVHJhbnNpdCBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHJvdXRlciBpbnRlZ3JhdGlvbnMg4oCUIHNlY3VyaW5nIHRoZSBsaW5rIGJldHdlZW4gYVxuICogcm91dGVyIGFuZCBhIGZsb3cgb3IgYSBNZWRpYUxpdmUgY2hhbm5lbC9pbnB1dC4gVXNlcyBBV1MgU2VjcmV0cyBNYW5hZ2VyIGZvciBrZXlcbiAqIG1hbmFnZW1lbnQuXG4gKlxuICogVGhlIHNlY3JldCBtdXN0IGxpdmUgaW4gdGhlIHNhbWUgQVdTIGFjY291bnQgYW5kIFJlZ2lvbiBhcyB0aGUgY29uc3VtaW5nIHJlc291cmNlLlxuICogTWVkaWFDb25uZWN0IGRvZXMgbm90IHN1cHBvcnQgY3Jvc3MtYWNjb3VudCBvciBjcm9zcy1SZWdpb24gc2VjcmV0cy5cbiAqXG4gKiAqKlRydXN0LXBvbGljeSBzY29wZSBvbiByb3V0ZXJzLioqIFJvdXRlciBJL08gaWRzIGFyZSBzZXJ2aWNlLWdlbmVyYXRlZCAodW5rbm93biBhdCBzeW50aFxuICogdGltZSksIGFuZCBwaW5uaW5nIHRoZSBsaXZlIEFSTiB3b3VsZCBjcmVhdGUgYSBDbG91ZEZvcm1hdGlvbiBkZXBlbmRlbmN5IGN5Y2xlIOKAlCBzbyB0aGVcbiAqIGF1dG8tY3JlYXRlZCByb2xlIHBpbnMgYGF3czpTb3VyY2VBcm5gIHRvIGEgd2lsZGNhcmRlZCBBUk4gKGBhcm46Li4uOnJvdXRlcklucHV0OipgIC9cbiAqIGBhcm46Li4uOnJvdXRlck91dHB1dDoqYCkgcGx1cyBgYXdzOlNvdXJjZUFjY291bnRgLiBUbyBwaW4gYSB0aWdodGVyIHRydXN0IHBvbGljeSwgc3VwcGx5XG4gKiB5b3VyIG93biBgcm9sZWAuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWVkaWFjb25uZWN0L2xhdGVzdC91Zy9jcm9zcy1zZXJ2aWNlLWNvbmZ1c2VkLWRlcHV0eS1wcmV2ZW50aW9uLmh0bWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2l0RW5jcnlwdGlvbiB7XG4gIC8qKlxuICAgKiBJQU0gcm9sZSB0aGF0IE1lZGlhQ29ubmVjdCBhc3N1bWVzIHRvIGFjY2VzcyB0aGUgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldC5cbiAgICpcbiAgICogSWYgcHJvdmlkZWQsIHRoZSByb2xlIGlzIHVzZWQgYXMtaXM7IHlvdSBtdXN0IGdyYW50IGl0IHRoZSBuZWNlc3NhcnkgcGVybWlzc2lvbnNcbiAgICogeW91cnNlbGYuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSBzY29wZWQgcm9sZSBpcyBhdXRvLWNyZWF0ZWQgd2l0aCByZWFkIGFjY2VzcyB0byB0aGUgc2VjcmV0IGFuZCBhXG4gICAqIGNvbmZ1c2VkLWRlcHV0eSB0cnVzdCBjb25kaXRpb24uIFNlZSB0aGUgKipFbmNyeXB0aW9uKiogc2VjdGlvbiBvZiB0aGUgbW9kdWxlIFJFQURNRVxuICAgKiBmb3IgdGhlIGdlbmVyYXRlZCB0cnVzdCBwb2xpY3kuXG4gICAqL1xuICByZWFkb25seSByb2xlPzogSVJvbGU7XG4gIC8qKlxuICAgKiBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IGNvbnRhaW5pbmcgdGhlIHRyYW5zaXQgZW5jcnlwdGlvbiBrZXkuXG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ6IElTZWNyZXQ7XG59XG5cbi8qKlxuICogU1JUIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3Igcm91dGVyIGlucHV0cyBhbmQgb3V0cHV0cyAoU1JUIExpc3RlbmVyIGFuZCBTUlRcbiAqIENhbGxlcikuIFVzZXMgQVdTIFNlY3JldHMgTWFuYWdlciBmb3Iga2V5IG1hbmFnZW1lbnQuIERpc3RpbmN0IGZyb21cbiAqIHtAbGluayBTcnRQYXNzd29yZEVuY3J5cHRpb259LCB3aGljaCBpcyB1c2VkIGZvciBmbG93IHNvdXJjZXMgYW5kIG91dHB1dHMuXG4gKlxuICogVGhlIHNlY3JldCBtdXN0IGxpdmUgaW4gdGhlIHNhbWUgQVdTIGFjY291bnQgYW5kIFJlZ2lvbiBhcyB0aGUgcm91dGVyIEkvTyB0aGF0IHVzZXNcbiAqIGl0LiBNZWRpYUNvbm5lY3QgZG9lcyBub3Qgc3VwcG9ydCBjcm9zcy1hY2NvdW50IG9yIGNyb3NzLVJlZ2lvbiBzZWNyZXRzLlxuICpcbiAqICoqVHJ1c3QtcG9saWN5IHNjb3BlIG9uIHJvdXRlcnMuKiogUm91dGVyIEkvTyBpZHMgYXJlIHNlcnZpY2UtZ2VuZXJhdGVkICh1bmtub3duIGF0IHN5bnRoXG4gKiB0aW1lKSwgYW5kIHBpbm5pbmcgdGhlIGxpdmUgQVJOIHdvdWxkIGNyZWF0ZSBhIENsb3VkRm9ybWF0aW9uIGRlcGVuZGVuY3kgY3ljbGUg4oCUIHNvIHRoZVxuICogYXV0by1jcmVhdGVkIHJvbGUgcGlucyBgYXdzOlNvdXJjZUFybmAgdG8gYSB3aWxkY2FyZGVkIEFSTiAoYGFybjouLi46cm91dGVySW5wdXQ6KmAgL1xuICogYGFybjouLi46cm91dGVyT3V0cHV0OipgKSBwbHVzIGBhd3M6U291cmNlQWNjb3VudGAuIFRvIHBpbiBhIHRpZ2h0ZXIgdHJ1c3QgcG9saWN5LCBzdXBwbHlcbiAqIHlvdXIgb3duIGByb2xlYC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYWNvbm5lY3QvbGF0ZXN0L3VnL2Nyb3NzLXNlcnZpY2UtY29uZnVzZWQtZGVwdXR5LXByZXZlbnRpb24uaHRtbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlclNydEVuY3J5cHRpb24ge1xuICAvKipcbiAgICogSUFNIHJvbGUgdGhhdCBNZWRpYUNvbm5lY3QgYXNzdW1lcyB0byBhY2Nlc3MgdGhlIFNlY3JldHMgTWFuYWdlciBzZWNyZXQuXG4gICAqXG4gICAqIElmIHByb3ZpZGVkLCB0aGUgcm9sZSBpcyB1c2VkIGFzLWlzOyB5b3UgbXVzdCBncmFudCBpdCB0aGUgbmVjZXNzYXJ5IHBlcm1pc3Npb25zXG4gICAqIHlvdXJzZWxmLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgc2NvcGVkIHJvbGUgaXMgYXV0by1jcmVhdGVkIHdpdGggcmVhZCBhY2Nlc3MgdG8gdGhlIHNlY3JldCBhbmQgYVxuICAgKiBjb25mdXNlZC1kZXB1dHkgdHJ1c3QgY29uZGl0aW9uLiBTZWUgdGhlICoqRW5jcnlwdGlvbioqIHNlY3Rpb24gb2YgdGhlIG1vZHVsZSBSRUFETUVcbiAgICogZm9yIHRoZSBnZW5lcmF0ZWQgdHJ1c3QgcG9saWN5LlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZT86IElSb2xlO1xuICAvKipcbiAgICogU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBjb250YWluaW5nIHRoZSBTUlQgcGFzc3BocmFzZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldDogSVNlY3JldDtcbn1cblxuLyoqXG4gKiBFbmNyeXB0aW9uIGtleSB0eXBlIGZvciB0cmFuc2l0IGVuY3J5cHRpb25cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZW51bSBFbmNyeXB0aW9uS2V5VHlwZSB7XG4gIFNFQ1JFVFNfTUFOQUdFUj0nU0VDUkVUU19NQU5BR0VSJyxcbiAgQVVUT01BVElDPSdBVVRPTUFUSUMnLFxufVxuXG4vKipcbiAqIFJlc29sdmUgYW4gSUFNIHJvbGUgZm9yIE1lZGlhQ29ubmVjdCB0byBhY2Nlc3MgYSBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0LiBSZXR1cm5zIHRoZVxuICogdXNlci1wcm92aWRlZCBgcm9sZWAgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGF1dG8tY3JlYXRlcyBhIHNjb3BlZCByb2xlOiBpbmxpbmUgc2VjcmV0IHJlYWQsXG4gKiBga21zOkRlY3J5cHRgIHdoZW4gdGhlIHNlY3JldCBoYXMgYSBDTUssIGFuZCBhIHRydXN0IHBvbGljeSB3aXRoIGBhd3M6U291cmNlQWNjb3VudGBcbiAqIChwbHVzIGBhd3M6U291cmNlQXJuYCB3aGVuIGBzb3VyY2VBcm5gIGlzIGdpdmVuKS4gVGhlIHJldHVybmVkIGBncmFudGAgbGV0cyBjYWxsZXJzIG9yZGVyXG4gKiB0aGUgcm9sZSdzIHNlY3JldC1yZWFkIHBvbGljeSBiZWZvcmUgdGhlIGNvbnN1bWluZyByZXNvdXJjZSDigJQgcmVxdWlyZWQgZm9yIHJvdXRlciBJL08uXG4gKlxuICogQSBwcm92aWRlZCByb2xlIGlzIHVzZWQgYXMtaXMgYW5kIGlzIG5vdCBncmFudGVkIHNlY3JldCBhY2Nlc3Mg4oCUIHRoZSBjYWxsZXIgaXNcbiAqIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyBpdCBjYW4gcmVhZCB0aGUgc2VjcmV0IChhbmQgZGVjcnlwdCBpdHMgS01TIGtleSwgaWYgYW55KS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYWNvbm5lY3QvbGF0ZXN0L3VnL2Nyb3NzLXNlcnZpY2UtY29uZnVzZWQtZGVwdXR5LXByZXZlbnRpb24uaHRtbFxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRW5jcnlwdGlvblJvbGUoXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIGlkOiBzdHJpbmcsXG4gIHJvbGU6IElSb2xlIHwgdW5kZWZpbmVkLFxuICBzZWNyZXQ6IElTZWNyZXQsXG4gIHNvdXJjZUFybj86IHN0cmluZyxcbik6IHsgcm9sZTogSVJvbGU7IGdyYW50PzogR3JhbnQgfSB7XG4gIGlmIChyb2xlKSByZXR1cm4geyByb2xlIH07XG5cbiAgY29uc3QgY29uZGl0aW9uczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPSB7XG4gICAgU3RyaW5nRXF1YWxzOiB7ICdhd3M6U291cmNlQWNjb3VudCc6IEF3cy5BQ0NPVU5UX0lEIH0sXG4gIH07XG4gIGlmIChzb3VyY2VBcm4gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMuQXJuTGlrZSA9IHsgJ2F3czpTb3VyY2VBcm4nOiBzb3VyY2VBcm4gfTtcbiAgfVxuXG4gIGNvbnN0IGNyZWF0ZWQgPSBuZXcgUm9sZShzY29wZSwgaWQsIHtcbiAgICBhc3N1bWVkQnk6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdtZWRpYWNvbm5lY3QuYW1hem9uYXdzLmNvbScsIHsgY29uZGl0aW9ucyB9KSxcbiAgICBkZXNjcmlwdGlvbjogJ0F1dG8tZ2VuZXJhdGVkIE1lZGlhQ29ubmVjdCByb2xlIGZvciBhY2Nlc3NpbmcgdGhlIGVuY3J5cHRpb24gc2VjcmV0JyxcbiAgfSk7XG5cbiAgLy8gR3JhbnQgaGVscGVyOiBhZGRzIHNlY3JldCByZWFkIChHZXRTZWNyZXRWYWx1ZS9EZXNjcmliZVNlY3JldCkgcGx1cyBrbXM6RGVjcnlwdFxuICAvLyAod2l0aCBhIGttczpWaWFTZXJ2aWNlIGNvbmRpdGlvbikgd2hlbiB0aGUgc2VjcmV0IHVzZXMgYSBjdXN0b21lci1tYW5hZ2VkIGtleS5cbiAgY29uc3QgcmVhZEdyYW50ID0gc2VjcmV0LmdyYW50UmVhZChjcmVhdGVkKTtcblxuICAvLyBncmFudFJlYWQgY292ZXJzIDIgb2YgdGhlIDQgc2VjcmV0LXJlYWQgYWN0aW9ucyBNZWRpYUNvbm5lY3QncyBwb2xpY3kgbmVlZHM7IGFkZCB0aGVcbiAgLy8gb3RoZXIgMiwgc2NvcGVkIHRvIHRoZSBzYW1lIHNlY3JldC4gKFNraXBwaW5nIHRoZSBkb2MncyBgTGlzdFNlY3JldHNgIOKAlCBpdCBuZWVkc1xuICAvLyBgUmVzb3VyY2U6ICpgIGFuZCBpc24ndCByZXF1aXJlZCB0byByZWFkIGEga25vd24gc2VjcmV0LilcbiAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhY29ubmVjdC9sYXRlc3QvdWcvaWFtLXBvbGljeS1leGFtcGxlcy1hc20tc2VjcmV0cy5odG1sXG4gIGNvbnN0IGV4dHJhR3JhbnQgPSBHcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgZ3JhbnRlZTogY3JlYXRlZCxcbiAgICBhY3Rpb25zOiBbJ3NlY3JldHNtYW5hZ2VyOkdldFJlc291cmNlUG9saWN5JywgJ3NlY3JldHNtYW5hZ2VyOkxpc3RTZWNyZXRWZXJzaW9uSWRzJ10sXG4gICAgcmVzb3VyY2VBcm5zOiBbc2VjcmV0LnNlY3JldEFybl0sXG4gIH0pO1xuXG4gIHJldHVybiB7IHJvbGU6IGNyZWF0ZWQsIGdyYW50OiByZWFkR3JhbnQuY29tYmluZShleHRyYUdyYW50KSB9O1xufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgQ0ZOIHN0YXRpYy1rZXkgZW5jcnlwdGlvbiBibG9jaywgYXV0by1jcmVhdGluZyBhIHJvbGUgd2hlbiBub25lIGlzIHN1cHBsaWVkLlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJTdGF0aWNLZXlFbmNyeXB0aW9uKHNjb3BlOiBDb25zdHJ1Y3QsIGVuY3J5cHRpb246IFN0YXRpY0tleUVuY3J5cHRpb24sIHNvdXJjZUFybj86IHN0cmluZykge1xuICBjb25zdCB7IHJvbGUgfSA9IHJlc29sdmVFbmNyeXB0aW9uUm9sZShzY29wZSwgJ0VuY3J5cHRpb25Sb2xlJywgZW5jcnlwdGlvbi5yb2xlLCBlbmNyeXB0aW9uLnNlY3JldCwgc291cmNlQXJuKTtcbiAgcmV0dXJuIHtcbiAgICBrZXlUeXBlOiBLZXlUeXBlLlNUQVRJQ19LRVkudmFsdWUsXG4gICAgcm9sZUFybjogcm9sZS5yb2xlQXJuLFxuICAgIHNlY3JldEFybjogZW5jcnlwdGlvbi5zZWNyZXQuc2VjcmV0QXJuLFxuICAgIGFsZ29yaXRobTogZW5jcnlwdGlvbi5hbGdvcml0aG0udmFsdWUsXG4gIH07XG59XG5cbi8qKlxuICogUmVuZGVyIHRoZSBDRk4gU1JULXBhc3N3b3JkIGVuY3J5cHRpb24gYmxvY2ssIGF1dG8tY3JlYXRpbmcgYSByb2xlIHdoZW4gbm9uZSBpcyBzdXBwbGllZC5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyU3J0UGFzc3dvcmRFbmNyeXB0aW9uKHNjb3BlOiBDb25zdHJ1Y3QsIGVuY3J5cHRpb246IFNydFBhc3N3b3JkRW5jcnlwdGlvbiwgc291cmNlQXJuPzogc3RyaW5nKSB7XG4gIGNvbnN0IHsgcm9sZSB9ID0gcmVzb2x2ZUVuY3J5cHRpb25Sb2xlKHNjb3BlLCAnRW5jcnlwdGlvblJvbGUnLCBlbmNyeXB0aW9uLnJvbGUsIGVuY3J5cHRpb24uc2VjcmV0LCBzb3VyY2VBcm4pO1xuICByZXR1cm4ge1xuICAgIGtleVR5cGU6IEtleVR5cGUuU1JUX1BBU1NXT1JELnZhbHVlLFxuICAgIHJvbGVBcm46IHJvbGUucm9sZUFybixcbiAgICBzZWNyZXRBcm46IGVuY3J5cHRpb24uc2VjcmV0LnNlY3JldEFybixcbiAgfTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgdGhlIENGTiByb3V0ZXIgU1JUIGVuY3J5cHRpb24gYmxvY2sgKGlubmVyIGBlbmNyeXB0aW9uS2V5YCBvYmplY3QpLFxuICogYXV0by1jcmVhdGluZyBhIHJvbGUgd2hlbiBub25lIGlzIHN1cHBsaWVkLlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJSb3V0ZXJTcnRFbmNyeXB0aW9uKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGVuY3J5cHRpb246IFJvdXRlclNydEVuY3J5cHRpb24sIHNvdXJjZUFybj86IHN0cmluZykge1xuICBjb25zdCB7IHJvbGUgfSA9IHJlc29sdmVFbmNyeXB0aW9uUm9sZShzY29wZSwgaWQsIGVuY3J5cHRpb24ucm9sZSwgZW5jcnlwdGlvbi5zZWNyZXQsIHNvdXJjZUFybik7XG4gIHJldHVybiB7XG4gICAgZW5jcnlwdGlvbktleToge1xuICAgICAgcm9sZUFybjogcm9sZS5yb2xlQXJuLFxuICAgICAgc2VjcmV0QXJuOiBlbmNyeXB0aW9uLnNlY3JldC5zZWNyZXRBcm4sXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgdGhlIENGTiB0cmFuc2l0IGVuY3J5cHRpb24gYmxvY2s6IFNFQ1JFVFNfTUFOQUdFUiAoYXV0by1jcmVhdGluZyBhIHJvbGUgd2hlblxuICogbm9uZSBpcyBzdXBwbGllZCkgd2hlbiBgZW5jcnlwdGlvbmAgaXMgZ2l2ZW4sIG90aGVyd2lzZSB0aGUgQVVUT01BVElDIGRlZmF1bHQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclRyYW5zaXRFbmNyeXB0aW9uKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGVuY3J5cHRpb24/OiBUcmFuc2l0RW5jcnlwdGlvbiwgc291cmNlQXJuPzogc3RyaW5nKSB7XG4gIGlmIChlbmNyeXB0aW9uKSB7XG4gICAgY29uc3QgeyByb2xlIH0gPSByZXNvbHZlRW5jcnlwdGlvblJvbGUoc2NvcGUsIGlkLCBlbmNyeXB0aW9uLnJvbGUsIGVuY3J5cHRpb24uc2VjcmV0LCBzb3VyY2VBcm4pO1xuICAgIHJldHVybiB7XG4gICAgICBlbmNyeXB0aW9uS2V5Q29uZmlndXJhdGlvbjoge1xuICAgICAgICBzZWNyZXRzTWFuYWdlcjoge1xuICAgICAgICAgIHJvbGVBcm46IHJvbGUucm9sZUFybixcbiAgICAgICAgICBzZWNyZXRBcm46IGVuY3J5cHRpb24uc2VjcmV0LnNlY3JldEFybixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBlbmNyeXB0aW9uS2V5VHlwZTogRW5jcnlwdGlvbktleVR5cGUuU0VDUkVUU19NQU5BR0VSLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBlbmNyeXB0aW9uS2V5VHlwZTogRW5jcnlwdGlvbktleVR5cGUuQVVUT01BVElDLFxuICAgIGVuY3J5cHRpb25LZXlDb25maWd1cmF0aW9uOiB7XG4gICAgICBhdXRvbWF0aWM6IHt9LFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0cmFuc2l0IGVuY3J5cHRpb24gdG8gaXRzIENGTiBjb25maWcgcGx1cyB0aGUgYXV0by1jcmVhdGVkIHJvbGUncyBzZWNyZXQtcmVhZFxuICogZ3JhbnQgKHdoZW4gYSByb2xlIHdhcyBhdXRvLWNyZWF0ZWQpLlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVHJhbnNpdEVuY3J5cHRpb24oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgZW5jcnlwdGlvbj86IFRyYW5zaXRFbmNyeXB0aW9uLCBzb3VyY2VBcm4/OiBzdHJpbmcpIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBlbmNyeXB0aW9uXG4gICAgPyByZXNvbHZlRW5jcnlwdGlvblJvbGUoc2NvcGUsIGlkLCBlbmNyeXB0aW9uLnJvbGUsIGVuY3J5cHRpb24uc2VjcmV0LCBzb3VyY2VBcm4pXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNvbmZpZyA9IHJlbmRlclRyYW5zaXRFbmNyeXB0aW9uKFxuICAgIHNjb3BlLFxuICAgIGlkLFxuICAgIGVuY3J5cHRpb24gJiYgcmVzb2x2ZWQgPyB7IC4uLmVuY3J5cHRpb24sIHJvbGU6IHJlc29sdmVkLnJvbGUgfSA6IGVuY3J5cHRpb24sXG4gICAgc291cmNlQXJuLFxuICApO1xuICByZXR1cm4geyBjb25maWcsIGdyYW50OiByZXNvbHZlZD8uZ3JhbnQgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHJvdXRlciBTUlQgZW5jcnlwdGlvbiB0byBpdHMgQ0ZOIGNvbmZpZyBwbHVzIHRoZSBhdXRvLWNyZWF0ZWQgcm9sZSdzIHNlY3JldC1yZWFkXG4gKiBncmFudCAod2hlbiBhIHJvbGUgd2FzIGF1dG8tY3JlYXRlZCksIHNvIHRoZSBjb25zdW1pbmcgcm91dGVyIEkvTyBjYW4gb3JkZXIgaXQgYmVmb3JlXG4gKiBpdHNlbGYuIFNlZSB7QGxpbmsgcmVzb2x2ZVRyYW5zaXRFbmNyeXB0aW9ufSBmb3Igd2h5IHRoZSBvcmRlcmluZyBtYXR0ZXJzLlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUm91dGVyU3J0RW5jcnlwdGlvbihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBlbmNyeXB0aW9uOiBSb3V0ZXJTcnRFbmNyeXB0aW9uLCBzb3VyY2VBcm4/OiBzdHJpbmcpIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRW5jcnlwdGlvblJvbGUoc2NvcGUsIGlkLCBlbmNyeXB0aW9uLnJvbGUsIGVuY3J5cHRpb24uc2VjcmV0LCBzb3VyY2VBcm4pO1xuICBjb25zdCBjb25maWcgPSByZW5kZXJSb3V0ZXJTcnRFbmNyeXB0aW9uKHNjb3BlLCBpZCwgeyAuLi5lbmNyeXB0aW9uLCByb2xlOiByZXNvbHZlZC5yb2xlIH0sIHNvdXJjZUFybik7XG4gIHJldHVybiB7IGNvbmZpZywgZ3JhbnQ6IHJlc29sdmVkLmdyYW50IH07XG59XG5cbi8qKlxuICogQSB2aWRlbyBmcmFtZSByYXRlIGV4cHJlc3NlZCBhcyBhIHJhdGlvbmFsIG51bWJlciAobnVtZXJhdG9yL2Rlbm9taW5hdG9yKS5cbiAqXG4gKiBVc2UgdGhlIHByZWRlZmluZWQgY29uc3RhbnRzIGZvciBzdGFuZGFyZCByYXRlcywgb3Ige0BsaW5rIEZyYW1lcmF0ZS5vZn0gZm9yIGEgY3VzdG9tIHJhdGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBGcmFtZXJhdGUge1xuICAvKiogMjQgZnBzIChjaW5lbWEpIOKAlCBgMjQvMWAuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRlBTXzI0ID0gbmV3IEZyYW1lcmF0ZSgyNCwgMSk7XG4gIC8qKiAyNSBmcHMg4oCUIGAyNS8xYC4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBGUFNfMjUgPSBuZXcgRnJhbWVyYXRlKDI1LCAxKTtcbiAgLyoqIDI5Ljk3IGZwcyDigJQgYDMwMDAwLzEwMDFgLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZQU18yOV85NyA9IG5ldyBGcmFtZXJhdGUoMzAwMDAsIDEwMDEpO1xuICAvKiogMzAgZnBzIOKAlCBgMzAvMWAuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRlBTXzMwID0gbmV3IEZyYW1lcmF0ZSgzMCwgMSk7XG4gIC8qKiA1MCBmcHMg4oCUIGA1MC8xYC4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBGUFNfNTAgPSBuZXcgRnJhbWVyYXRlKDUwLCAxKTtcbiAgLyoqIDU5Ljk0IGZwcyDigJQgYDYwMDAwLzEwMDFgLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZQU181OV85NCA9IG5ldyBGcmFtZXJhdGUoNjAwMDAsIDEwMDEpO1xuICAvKiogNjAgZnBzIOKAlCBgNjAvMWAuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRlBTXzYwID0gbmV3IEZyYW1lcmF0ZSg2MCwgMSk7XG5cbiAgLyoqXG4gICAqIERlZmluZSBhIGN1c3RvbSBmcmFtZSByYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gbnVtZXJhdG9yIE51bWVyYXRvciBvZiB0aGUgcmF0ZS5cbiAgICogQHBhcmFtIGRlbm9taW5hdG9yIERlbm9taW5hdG9yIG9mIHRoZSByYXRlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvZihudW1lcmF0b3I6IG51bWJlciwgZGVub21pbmF0b3I6IG51bWJlcik6IEZyYW1lcmF0ZSB7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQobnVtZXJhdG9yKSAmJiAoIU51bWJlci5pc0ludGVnZXIobnVtZXJhdG9yKSB8fCBudW1lcmF0b3IgPD0gMCkpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgRnJhbWVyYXRlTnVtZXJhdG9yYCwgYEZyYW1lIHJhdGUgbnVtZXJhdG9yIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBnb3QgJHtudW1lcmF0b3J9YCk7XG4gICAgfVxuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKGRlbm9taW5hdG9yKSAmJiAoIU51bWJlci5pc0ludGVnZXIoZGVub21pbmF0b3IpIHx8IGRlbm9taW5hdG9yIDw9IDApKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YEZyYW1lcmF0ZURlbm9taW5hdG9yYCwgYEZyYW1lIHJhdGUgZGVub21pbmF0b3IgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGdvdCAke2Rlbm9taW5hdG9yfWApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEZyYW1lcmF0ZShudW1lcmF0b3IsIGRlbm9taW5hdG9yKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbnVtZXJhdG9yVmFsdWU6IG51bWJlcjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZW5vbWluYXRvclZhbHVlOiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihudW1lcmF0b3I6IG51bWJlciwgZGVub21pbmF0b3I6IG51bWJlcikge1xuICAgIHRoaXMuX251bWVyYXRvclZhbHVlID0gbnVtZXJhdG9yO1xuICAgIHRoaXMuX2Rlbm9taW5hdG9yVmFsdWUgPSBkZW5vbWluYXRvcjtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUuICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLl9udW1lcmF0b3JWYWx1ZX0vJHt0aGlzLl9kZW5vbWluYXRvclZhbHVlfWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIHZhbHVlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfbnVtZXJhdG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX251bWVyYXRvclZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciB2YWx1ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2Rlbm9taW5hdG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlbm9taW5hdG9yVmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcGl4ZWwgYXNwZWN0IHJhdGlvIChQQVIpIG9mIHRoZSB2aWRlby5cbiAqXG4gKiBVc2UgdGhlIHByZWRlZmluZWQgY29uc3RhbnRzIGZvciBzdGFuZGFyZCByYXRpb3MsIG9yIHtAbGluayBQaXhlbEFzcGVjdFJhdGlvLm9mfSBmb3JcbiAqIGEgY3VzdG9tIHJhdGlvLlxuICovXG5leHBvcnQgY2xhc3MgUGl4ZWxBc3BlY3RSYXRpbyB7XG4gIC8qKiBTcXVhcmUgcGl4ZWxzIChgMToxYCkuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1FVQVJFID0gbmV3IFBpeGVsQXNwZWN0UmF0aW8oMSwgMSk7XG5cbiAgLyoqXG4gICAqIERlZmluZSBhIHBpeGVsIGFzcGVjdCByYXRpby5cbiAgICpcbiAgICogQHBhcmFtIG51bWVyYXRvciBOdW1lcmF0b3Igb2YgdGhlIHJhdGlvLlxuICAgKiBAcGFyYW0gZGVub21pbmF0b3IgRGVub21pbmF0b3Igb2YgdGhlIHJhdGlvLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvZihudW1lcmF0b3I6IG51bWJlciwgZGVub21pbmF0b3I6IG51bWJlcik6IFBpeGVsQXNwZWN0UmF0aW8ge1xuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKG51bWVyYXRvcikgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bWVyYXRvcikgfHwgbnVtZXJhdG9yIDw9IDApKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YFBpeGVsQXNwZWN0UmF0aW9OdW1lcmF0b3JgLCBgUGl4ZWwgYXNwZWN0IHJhdGlvIG51bWVyYXRvciBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgZ290ICR7bnVtZXJhdG9yfWApO1xuICAgIH1cbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChkZW5vbWluYXRvcikgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKGRlbm9taW5hdG9yKSB8fCBkZW5vbWluYXRvciA8PSAwKSkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBQaXhlbEFzcGVjdFJhdGlvRGVub21pbmF0b3JgLCBgUGl4ZWwgYXNwZWN0IHJhdGlvIGRlbm9taW5hdG9yIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBnb3QgJHtkZW5vbWluYXRvcn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQaXhlbEFzcGVjdFJhdGlvKG51bWVyYXRvciwgZGVub21pbmF0b3IpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9udW1lcmF0b3JWYWx1ZTogbnVtYmVyO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlbm9taW5hdG9yVmFsdWU6IG51bWJlcjtcblxuICAvKipcbiAgICogQHBhcmFtIG51bWVyYXRvciBOdW1lcmF0b3Igb2YgdGhlIHJhdGlvLlxuICAgKiBAcGFyYW0gZGVub21pbmF0b3IgRGVub21pbmF0b3Igb2YgdGhlIHJhdGlvLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihudW1lcmF0b3I6IG51bWJlciwgZGVub21pbmF0b3I6IG51bWJlcikge1xuICAgIHRoaXMuX251bWVyYXRvclZhbHVlID0gbnVtZXJhdG9yO1xuICAgIHRoaXMuX2Rlbm9taW5hdG9yVmFsdWUgPSBkZW5vbWluYXRvcjtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgaW4gYG51bWVyYXRvcjpkZW5vbWluYXRvcmAgZm9ybS4gKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuX251bWVyYXRvclZhbHVlfToke3RoaXMuX2Rlbm9taW5hdG9yVmFsdWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbnVtZXJhdG9yIG9mIHRoZSByYXRpby5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX251bWVyYXRvcigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9udW1lcmF0b3JWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGVub21pbmF0b3Igb2YgdGhlIHJhdGlvLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfZGVub21pbmF0b3IoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGVub21pbmF0b3JWYWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gdGhlIGdpdmVuIGJpdHJhdGUgZXhjZWVkcyB0aGUgc3BlY2lmaWVkIHRpZXIncyBNYnBzIGxpbWl0LlxuICogVXNlZCBieSByb3V0ZXIgaW5wdXQvb3V0cHV0IGNvbnN0cnVjdHMgdG8gdmFsaWRhdGUgYml0cmF0ZSBmaXRzIHdpdGhpbiB0aGUgY2hvc2VuIHRpZXIuXG4gKlxuICogQHBhcmFtIHRpZXJNYnBzIFRoZSB0aWVyJ3MgYml0cmF0ZSBsaW1pdCBpbiBNYnBzLCBvciBgdW5kZWZpbmVkYCBmb3IgY3VzdG9tIHRpZXJzLlxuICogQHBhcmFtIG1heGltdW1CaXRyYXRlIFRoZSBjb25maWd1cmVkIG1heGltdW0gYml0cmF0ZS5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYml0cmF0ZSBleGNlZWRzIHRoZSB0aWVyIGxpbWl0OyBgZmFsc2VgIG90aGVyd2lzZSAoaW5jbHVkaW5nIGN1c3RvbSB0aWVycykuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4Y2VlZHNSb3V0ZXJUaWVyQml0cmF0ZSh0aWVyTWJwczogbnVtYmVyIHwgdW5kZWZpbmVkLCBtYXhpbXVtQml0cmF0ZTogQml0cmF0ZSk6IGJvb2xlYW4ge1xuICBpZiAodGllck1icHMgPT09IHVuZGVmaW5lZCB8fCBtYXhpbXVtQml0cmF0ZS5pc1VucmVzb2x2ZWQoKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gbWF4aW11bUJpdHJhdGUudG9CcHMoKSA+IHRpZXJNYnBzICogMV8wMDBfMDAwO1xufVxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gdGhlIGdpdmVuIENJRFIgbGl0ZXJhbCBpcyBhIGZ1bGx5LW9wZW4gcmFuZ2Ug4oCUIGFueSBgLzBgXG4gKiBwcmVmaXgsIGNvdmVyaW5nIGJvdGggSVB2NCAoYDAuMC4wLjAvMGApIGFuZCBJUHY2IChgOjovMGApLiBDYWxsZXJzIGFyZVxuICogZXhwZWN0ZWQgdG8gcHJlLWNoZWNrIGZvciB0b2tlbi1lbmNvZGVkIHZhbHVlcywgc2luY2UgYW4gdW5yZXNvbHZlZCB0b2tlblxuICogY2Fubm90IGJlIGluc3BlY3RlZC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT3BlbkNpZHIoY2lkcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXFwvMCQvLnRlc3QoY2lkci50cmltKCkpO1xufVxuIl19