@jsii/kernel 1.58.0 → 1.60.1

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.
@@ -39,7 +39,7 @@ exports.EMPTY_OBJECT_FQN = 'Object';
39
39
  exports.SYMBOL_WIRE_TYPE = Symbol.for('$jsii$wireType$');
40
40
  exports.SERIALIZERS = {
41
41
  // ----------------------------------------------------------------------
42
- ["Void" /* Void */]: {
42
+ ["Void" /* SerializationClass.Void */]: {
43
43
  serialize(value, _type, host) {
44
44
  if (value != null) {
45
45
  host.debug('Expected void, got', value);
@@ -54,7 +54,7 @@ exports.SERIALIZERS = {
54
54
  },
55
55
  },
56
56
  // ----------------------------------------------------------------------
57
- ["Date" /* Date */]: {
57
+ ["Date" /* SerializationClass.Date */]: {
58
58
  serialize(value, optionalValue) {
59
59
  if (nullAndOk(value, optionalValue)) {
60
60
  return undefined;
@@ -71,14 +71,14 @@ exports.SERIALIZERS = {
71
71
  if (nullAndOk(value, optionalValue)) {
72
72
  return undefined;
73
73
  }
74
- if (!api_1.isWireDate(value)) {
74
+ if (!(0, api_1.isWireDate)(value)) {
75
75
  throw new Error(`Expected Date, got ${JSON.stringify(value)}`);
76
76
  }
77
77
  return deserializeDate(value);
78
78
  },
79
79
  },
80
80
  // ----------------------------------------------------------------------
81
- ["Scalar" /* Scalar */]: {
81
+ ["Scalar" /* SerializationClass.Scalar */]: {
82
82
  serialize(value, optionalValue) {
83
83
  if (nullAndOk(value, optionalValue)) {
84
84
  return undefined;
@@ -113,7 +113,7 @@ exports.SERIALIZERS = {
113
113
  },
114
114
  },
115
115
  // ----------------------------------------------------------------------
116
- ["Json" /* Json */]: {
116
+ ["Json" /* SerializationClass.Json */]: {
117
117
  serialize(value) {
118
118
  // Just whatever. Dates will automatically serialize themselves to strings.
119
119
  return value;
@@ -127,8 +127,8 @@ exports.SERIALIZERS = {
127
127
  // is passed into a JSON transfer point. Indeed, those are also valid JSON! For example, Python "dicts" will be
128
128
  // serialized (by the Python runtime) as a $jsii.map (the mapping object). We need to de-serialize that as a
129
129
  // Map<string, JSON> in order to obtain the correct output behavior here!
130
- if (api_1.isWireMap(value)) {
131
- return exports.SERIALIZERS["Map" /* Map */].deserialize(value, {
130
+ if ((0, api_1.isWireMap)(value)) {
131
+ return exports.SERIALIZERS["Map" /* SerializationClass.Map */].deserialize(value, {
132
132
  optional: false,
133
133
  type: {
134
134
  collection: {
@@ -156,7 +156,7 @@ exports.SERIALIZERS = {
156
156
  },
157
157
  },
158
158
  // ----------------------------------------------------------------------
159
- ["Enum" /* Enum */]: {
159
+ ["Enum" /* SerializationClass.Enum */]: {
160
160
  serialize(value, optionalValue, host) {
161
161
  if (nullAndOk(value, optionalValue)) {
162
162
  return undefined;
@@ -180,14 +180,14 @@ exports.SERIALIZERS = {
180
180
  if (nullAndOk(value, optionalValue)) {
181
181
  return undefined;
182
182
  }
183
- if (!api_1.isWireEnum(value)) {
183
+ if (!(0, api_1.isWireEnum)(value)) {
184
184
  throw new Error(`Expected enum value, got ${JSON.stringify(value)}`);
185
185
  }
186
186
  return deserializeEnum(value, host.findSymbol);
187
187
  },
188
188
  },
189
189
  // ----------------------------------------------------------------------
190
- ["Array" /* Array */]: {
190
+ ["Array" /* SerializationClass.Array */]: {
191
191
  serialize(value, optionalValue, host) {
192
192
  if (nullAndOk(value, optionalValue)) {
193
193
  return undefined;
@@ -216,7 +216,7 @@ exports.SERIALIZERS = {
216
216
  },
217
217
  },
218
218
  // ----------------------------------------------------------------------
219
- ["Map" /* Map */]: {
219
+ ["Map" /* SerializationClass.Map */]: {
220
220
  serialize(value, optionalValue, host) {
221
221
  if (nullAndOk(value, optionalValue)) {
222
222
  return undefined;
@@ -237,7 +237,7 @@ exports.SERIALIZERS = {
237
237
  throw new Error('Encountered unexpected `void` type');
238
238
  }
239
239
  const mapType = optionalValue.type;
240
- if (!api_1.isWireMap(value)) {
240
+ if (!(0, api_1.isWireMap)(value)) {
241
241
  // Compatibility mode with older versions that didn't wrap in [TOKEN_MAP]
242
242
  return mapValues(value, (v) => host.recurse(v, { type: mapType.collection.elementtype }));
243
243
  }
@@ -252,7 +252,7 @@ exports.SERIALIZERS = {
252
252
  },
253
253
  },
254
254
  // ----------------------------------------------------------------------
255
- ["Struct" /* Struct */]: {
255
+ ["Struct" /* SerializationClass.Struct */]: {
256
256
  serialize(value, optionalValue, host) {
257
257
  if (nullAndOk(value, optionalValue)) {
258
258
  return undefined;
@@ -283,7 +283,7 @@ exports.SERIALIZERS = {
283
283
  ]);
284
284
  },
285
285
  deserialize(value, optionalValue, host) {
286
- if (typeof value === 'object' && Object.keys(value !== null && value !== void 0 ? value : {}).length === 0) {
286
+ if (typeof value === 'object' && Object.keys(value ?? {}).length === 0) {
287
287
  // Treat empty structs as `undefined` (see https://github.com/aws/jsii/issues/411)
288
288
  value = undefined;
289
289
  }
@@ -304,7 +304,7 @@ exports.SERIALIZERS = {
304
304
  // Similarly to serialization, we might be getting a reference type where we're
305
305
  // expecting a value type. Accept this for now (but also validate that object
306
306
  // for presence of the right properties).
307
- if (api_1.isObjRef(value)) {
307
+ if ((0, api_1.isObjRef)(value)) {
308
308
  host.debug('Expected value type but got reference type, accepting for now (awslabs/jsii#400)');
309
309
  // Return same INSTANCE (shouldn't matter but we don't know for sure that it doesn't)
310
310
  return validateRequiredProps(host.objects.findObject(value).instance, namedType.fqn, props);
@@ -331,9 +331,8 @@ exports.SERIALIZERS = {
331
331
  },
332
332
  },
333
333
  // ----------------------------------------------------------------------
334
- ["RefType" /* ReferenceType */]: {
334
+ ["RefType" /* SerializationClass.ReferenceType */]: {
335
335
  serialize(value, optionalValue, host) {
336
- var _a;
337
336
  if (nullAndOk(value, optionalValue)) {
338
337
  return undefined;
339
338
  }
@@ -347,7 +346,8 @@ exports.SERIALIZERS = {
347
346
  const interfaces = spec.isInterfaceType(expectedType)
348
347
  ? [expectedType.fqn]
349
348
  : undefined;
350
- const jsiiType = (_a = objects_1.jsiiTypeFqn(value)) !== null && _a !== void 0 ? _a : (spec.isClassType(expectedType) ? expectedType.fqn : exports.EMPTY_OBJECT_FQN);
349
+ const jsiiType = (0, objects_1.jsiiTypeFqn)(value) ??
350
+ (spec.isClassType(expectedType) ? expectedType.fqn : exports.EMPTY_OBJECT_FQN);
351
351
  return host.objects.registerObject(value, jsiiType, interfaces);
352
352
  },
353
353
  deserialize(value, optionalValue, host) {
@@ -359,7 +359,7 @@ exports.SERIALIZERS = {
359
359
  }
360
360
  // The only way to pass a by-ref object is to have created it
361
361
  // previously inside JSII kernel, so it must have an objref already.
362
- if (!api_1.isObjRef(value)) {
362
+ if (!(0, api_1.isObjRef)(value)) {
363
363
  throw new Error(`Expected object reference, got ${JSON.stringify(value)}`);
364
364
  }
365
365
  const { instance, fqn } = host.objects.findObject(value);
@@ -380,9 +380,8 @@ exports.SERIALIZERS = {
380
380
  },
381
381
  },
382
382
  // ----------------------------------------------------------------------
383
- ["Any" /* Any */]: {
383
+ ["Any" /* SerializationClass.Any */]: {
384
384
  serialize(value, _type, host) {
385
- var _a;
386
385
  if (value == null) {
387
386
  return undefined;
388
387
  }
@@ -405,7 +404,7 @@ exports.SERIALIZERS = {
405
404
  }
406
405
  if (exports.SYMBOL_WIRE_TYPE in value &&
407
406
  value[exports.SYMBOL_WIRE_TYPE] === api_1.TOKEN_MAP) {
408
- return exports.SERIALIZERS["Map" /* Map */].serialize(value, {
407
+ return exports.SERIALIZERS["Map" /* SerializationClass.Map */].serialize(value, {
409
408
  type: {
410
409
  collection: {
411
410
  kind: spec.CollectionKind.Map,
@@ -423,13 +422,14 @@ exports.SERIALIZERS = {
423
422
  // Use a previous reference to maintain object identity. NOTE: this may cause us to return
424
423
  // a different type than requested! This is just how it is right now.
425
424
  // https://github.com/aws/jsii/issues/399
426
- const prevRef = objects_1.objectReference(value);
425
+ const prevRef = (0, objects_1.objectReference)(value);
427
426
  if (prevRef) {
428
427
  return prevRef;
429
428
  }
430
429
  // If this is or should be a reference type, pass or make the reference
431
430
  // (Like regular reftype serialization, but without the type derivation to an interface)
432
- const jsiiType = (_a = objects_1.jsiiTypeFqn(value)) !== null && _a !== void 0 ? _a : (isByReferenceOnly(value) ? exports.EMPTY_OBJECT_FQN : undefined);
431
+ const jsiiType = (0, objects_1.jsiiTypeFqn)(value) ??
432
+ (isByReferenceOnly(value) ? exports.EMPTY_OBJECT_FQN : undefined);
433
433
  if (jsiiType) {
434
434
  return host.objects.registerObject(value, jsiiType);
435
435
  }
@@ -444,7 +444,7 @@ exports.SERIALIZERS = {
444
444
  if (value == null) {
445
445
  return undefined;
446
446
  }
447
- if (api_1.isWireDate(value)) {
447
+ if ((0, api_1.isWireDate)(value)) {
448
448
  host.debug('ANY is a Date');
449
449
  return deserializeDate(value);
450
450
  }
@@ -456,11 +456,11 @@ exports.SERIALIZERS = {
456
456
  host.debug('ANY is an Array');
457
457
  return value.map((e) => host.recurse(e, { type: spec.CANONICAL_ANY }));
458
458
  }
459
- if (api_1.isWireEnum(value)) {
459
+ if ((0, api_1.isWireEnum)(value)) {
460
460
  host.debug('ANY is an Enum');
461
461
  return deserializeEnum(value, host.findSymbol);
462
462
  }
463
- if (api_1.isWireMap(value)) {
463
+ if ((0, api_1.isWireMap)(value)) {
464
464
  host.debug('ANY is a Map');
465
465
  const mapOfAny = {
466
466
  collection: {
@@ -468,19 +468,19 @@ exports.SERIALIZERS = {
468
468
  elementtype: spec.CANONICAL_ANY,
469
469
  },
470
470
  };
471
- return exports.SERIALIZERS["Map" /* Map */].deserialize(value, { type: mapOfAny }, host);
471
+ return exports.SERIALIZERS["Map" /* SerializationClass.Map */].deserialize(value, { type: mapOfAny }, host);
472
472
  }
473
- if (api_1.isObjRef(value)) {
473
+ if ((0, api_1.isObjRef)(value)) {
474
474
  host.debug('ANY is a Ref');
475
475
  return host.objects.findObject(value).instance;
476
476
  }
477
477
  // if the value has a struct token, it was serialized by a typed jsii
478
478
  // struct, but since the deserialization target is ANY, all we can do is
479
479
  // strip the data from $jsii.struct and continue to deserialize as ANY.
480
- if (api_1.isWireStruct(value)) {
480
+ if ((0, api_1.isWireStruct)(value)) {
481
481
  const { fqn, data } = value[api_1.TOKEN_STRUCT];
482
482
  host.debug(`ANY is a struct of type ${fqn}`);
483
- return exports.SERIALIZERS["Struct" /* Struct */].deserialize(data, { type: { fqn } }, host);
483
+ return exports.SERIALIZERS["Struct" /* SerializationClass.Struct */].deserialize(data, { type: { fqn } }, host);
484
484
  }
485
485
  // At this point again, deserialize by-value.
486
486
  host.debug('ANY is a Map');
@@ -518,20 +518,20 @@ function serializationType(typeRef, lookup) {
518
518
  throw new Error("Kernel error: expected type information, got 'undefined'");
519
519
  }
520
520
  if (typeRef === 'void') {
521
- return [{ serializationClass: "Void" /* Void */, typeRef }];
521
+ return [{ serializationClass: "Void" /* SerializationClass.Void */, typeRef }];
522
522
  }
523
523
  if (spec.isPrimitiveTypeReference(typeRef.type)) {
524
524
  switch (typeRef.type.primitive) {
525
525
  case spec.PrimitiveType.Any:
526
- return [{ serializationClass: "Any" /* Any */, typeRef }];
526
+ return [{ serializationClass: "Any" /* SerializationClass.Any */, typeRef }];
527
527
  case spec.PrimitiveType.Date:
528
- return [{ serializationClass: "Date" /* Date */, typeRef }];
528
+ return [{ serializationClass: "Date" /* SerializationClass.Date */, typeRef }];
529
529
  case spec.PrimitiveType.Json:
530
- return [{ serializationClass: "Json" /* Json */, typeRef }];
530
+ return [{ serializationClass: "Json" /* SerializationClass.Json */, typeRef }];
531
531
  case spec.PrimitiveType.Boolean:
532
532
  case spec.PrimitiveType.Number:
533
533
  case spec.PrimitiveType.String:
534
- return [{ serializationClass: "Scalar" /* Scalar */, typeRef }];
534
+ return [{ serializationClass: "Scalar" /* SerializationClass.Scalar */, typeRef }];
535
535
  }
536
536
  throw new Error('Unknown primitive type');
537
537
  }
@@ -539,8 +539,8 @@ function serializationType(typeRef, lookup) {
539
539
  return [
540
540
  {
541
541
  serializationClass: typeRef.type.collection.kind === spec.CollectionKind.Array
542
- ? "Array" /* Array */
543
- : "Map" /* Map */,
542
+ ? "Array" /* SerializationClass.Array */
543
+ : "Map" /* SerializationClass.Map */,
544
544
  typeRef,
545
545
  },
546
546
  ];
@@ -558,12 +558,12 @@ function serializationType(typeRef, lookup) {
558
558
  // The next part of the conversion is lookup-dependent
559
559
  const type = lookup(typeRef.type.fqn);
560
560
  if (spec.isEnumType(type)) {
561
- return [{ serializationClass: "Enum" /* Enum */, typeRef }];
561
+ return [{ serializationClass: "Enum" /* SerializationClass.Enum */, typeRef }];
562
562
  }
563
563
  if (spec.isInterfaceType(type) && type.datatype) {
564
- return [{ serializationClass: "Struct" /* Struct */, typeRef }];
564
+ return [{ serializationClass: "Struct" /* SerializationClass.Struct */, typeRef }];
565
565
  }
566
- return [{ serializationClass: "RefType" /* ReferenceType */, typeRef }];
566
+ return [{ serializationClass: "RefType" /* SerializationClass.ReferenceType */, typeRef }];
567
567
  }
568
568
  exports.serializationType = serializationType;
569
569
  function nullAndOk(x, type) {
@@ -607,7 +607,6 @@ function mapValues(value, fn) {
607
607
  return out;
608
608
  }
609
609
  function propertiesOf(t, lookup) {
610
- var _a;
611
610
  if (!spec.isClassOrInterfaceType(t)) {
612
611
  return {};
613
612
  }
@@ -620,7 +619,7 @@ function propertiesOf(t, lookup) {
620
619
  if (spec.isClassType(t) && t.base) {
621
620
  ret = { ...ret, ...propertiesOf(lookup(t.base), lookup) };
622
621
  }
623
- for (const prop of (_a = t.properties) !== null && _a !== void 0 ? _a : []) {
622
+ for (const prop of t.properties ?? []) {
624
623
  ret[prop.name] = prop;
625
624
  }
626
625
  return ret;
@@ -666,16 +665,16 @@ function validateRequiredProps(actualProps, typeName, specProps) {
666
665
  }
667
666
  function compareSerializationClasses(l, r) {
668
667
  const order = [
669
- "Void" /* Void */,
670
- "Date" /* Date */,
671
- "Scalar" /* Scalar */,
672
- "Json" /* Json */,
673
- "Enum" /* Enum */,
674
- "Array" /* Array */,
675
- "Map" /* Map */,
676
- "Struct" /* Struct */,
677
- "RefType" /* ReferenceType */,
678
- "Any" /* Any */,
668
+ "Void" /* SerializationClass.Void */,
669
+ "Date" /* SerializationClass.Date */,
670
+ "Scalar" /* SerializationClass.Scalar */,
671
+ "Json" /* SerializationClass.Json */,
672
+ "Enum" /* SerializationClass.Enum */,
673
+ "Array" /* SerializationClass.Array */,
674
+ "Map" /* SerializationClass.Map */,
675
+ "Struct" /* SerializationClass.Struct */,
676
+ "RefType" /* SerializationClass.ReferenceType */,
677
+ "Any" /* SerializationClass.Any */,
679
678
  ];
680
679
  return order.indexOf(l) - order.indexOf(r);
681
680
  }
@@ -698,9 +697,9 @@ function isByReferenceOnly(obj) {
698
697
  do {
699
698
  for (const prop of Object.getOwnPropertyNames(curr)) {
700
699
  const descr = Object.getOwnPropertyDescriptor(curr, prop);
701
- if ((descr === null || descr === void 0 ? void 0 : descr.get) != null ||
702
- (descr === null || descr === void 0 ? void 0 : descr.set) != null ||
703
- typeof (descr === null || descr === void 0 ? void 0 : descr.value) === 'function') {
700
+ if (descr?.get != null ||
701
+ descr?.set != null ||
702
+ typeof descr?.value === 'function') {
704
703
  // Property has a dynamic getter, setter or is a constructor/method, so by-ref required!
705
704
  return true;
706
705
  }
@@ -709,4 +708,4 @@ function isByReferenceOnly(obj) {
709
708
  } while (Object.getPrototypeOf((curr = Object.getPrototypeOf(curr))) != null);
710
709
  return false;
711
710
  }
712
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNlcmlhbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRzs7O0FBRUgsbUNBQW1DO0FBRW5DLCtCQWFlO0FBQ2YsdUNBQXNFO0FBRXRFLHdCQUF3QjtBQW9CeEI7O0dBRUc7QUFDVSxRQUFBLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztBQUU1QixRQUFBLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQTBDakQsUUFBQSxXQUFXLEdBQWdDO0lBQ3RELHlFQUF5RTtJQUN6RSxtQkFBeUIsRUFBRTtRQUN6QixTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJO1lBQzFCLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtnQkFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN6QztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJO1lBQzVCLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtnQkFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN6QztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7S0FDRjtJQUVELHlFQUF5RTtJQUN6RSxtQkFBeUIsRUFBRTtRQUN6QixTQUFTLENBQUMsS0FBSyxFQUFFLGFBQWE7WUFDNUIsSUFBSSxTQUFTLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxFQUFFO2dCQUNuQyxPQUFPLFNBQVMsQ0FBQzthQUNsQjtZQUNELElBQUksYUFBYSxLQUFLLE1BQU0sRUFBRTtnQkFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO2FBQ3ZE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TUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ25ELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUQsSUFDRSxDQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxHQUFHLEtBQUksSUFBSTtnQkFDbEIsQ0FBQSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsR0FBRyxLQUFJLElBQUk7Z0JBQ2xCLFFBQU8sS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLEtBQUssQ0FBQSxLQUFLLFVBQVUsRUFDbEM7Z0JBQ0Esd0ZBQXdGO2dCQUN4RixPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFDRCwyRUFBMkU7S0FDNUUsUUFBUSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRTtJQUU5RSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEhhbmRsaW5nIG9mIHR5cGVzIGluIEpTSUlcbiAqXG4gKiBUeXBlcyB3aWxsIGJlIHNlcmlhbGl6ZWQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgdGFibGU6XG4gKlxuICogICAgICAgICAgICAgICAgICAgICAgICAg4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICDilIIgSkFWQVNDUklQVCBUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICogICAgICAgICAgICAgICAgICAgICAgICAg4pS84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICDilIIgdW5kZWZpbmVkL251bGwg4pSCICAgZGF0ZSAgICDilIIgc2NhbGFyICgqKSDilIIgICAgIGFycmF5ICAgICDilIIgSlNJSS1jbGFzcyBvYmplY3Qg4pSCIGxpdGVyYWwgb2JqZWN0ICDilIJcbiAqIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpFxuICog4pSCIERFQ0xBUkVEIOKUgiB2b2lkICAgICAgIOKUgiB1bmRlZmluZWQgICAgICDilIIgdW5kZWZpbmVkIOKUgiB1bmRlZmluZWQgIOKUgiB1bmRlZmluZWQgICAgIOKUgiB1bmRlZmluZWQgICAgICAgICDilIIgdW5kZWZpbmVkICAgICAgIOKUglxuICog4pSCIFRZUEUgICAgIOKUgiBkYXRlICAgICAgIOKUgiB1bmRlZmluZWQo4oCgKSAgIOKUgiB7IGRhdGUgfSAg4pSCIC0gICAgICAgICAg4pSCIC0gICAgICAgICAgICAg4pSCIC0gICAgICAgICAgICAgICAgIOKUgiAtICAgICAgICAgICAgICAg4pSCXG4gKiDilIIgICAgICAgICAg4pSCIHNjYWxhciAoKikg4pSCIHVuZGVmaW5lZCjigKApICAg4pSCIC0gICAgICAgICDilIIgdmFsdWUgICAgICDilIIgLSAgICAgICAgICAgICDilIIgLSAgICAgICAgICAgICAgICAg4pSCIC0gICAgICAgICAgICAgICDilIJcbiAqIOKUgiAgICAgICAgICDilIIganNvbiAgICAgICDilIIgdW5kZWZpbmVkICAgICAg4pSCIHN0cmluZyAgICDilIIgdmFsdWUgICAgICDilIIgYXJyYXkvUihqc29uKSDilIIgLSAgICAgICAgICAgICAgICAg4pSCIGJ5dmFsdWUvUihqc29uKSDilIJcbiAqIOKUgiAgICAgICAgICDilIIgZW51bSAgICAgICDilIIgdW5kZWZpbmVkKOKAoCkgICDilIIgLSAgICAgICAgIOKUgiB7IGVudW0gfSAgIOKUgiAtICAgICAgICAgICAgIOKUgiAtICAgICAgICAgICAgICAgICDilIIgLSAgICAgICAgICAgICAgIOKUglxuICog4pSCICAgICAgICAgIOKUgiBhcnJheSBvZiBUIOKUgiB1bmRlZmluZWQo4oCgKSAgIOKUgiAtICAgICAgICAg4pSCIC0gICAgICAgICAg4pSCIGFycmF5L1IoVCkgICAg4pSCIC0gICAgICAgICAgICAgICAgIOKUgiAtICAgICAgICAgICAgICAg4pSCXG4gKiDilIIgICAgICAgICAg4pSCIG1hcCBvZiBUICAg4pSCIHVuZGVmaW5lZCjigKApICAg4pSCIC0gICAgICAgICDilIIgLSAgICAgICAgICDilIIgLSAgICAgICAgICAgICDilIIgLSAgICAgICAgICAgICAgICAg4pSCIGJ5dmFsdWUvUihUKSAgICDilIJcbiAqIOKUgiAgICAgICAgICDilIIgaW50ZXJmYWNlICDilIIgdW5kZWZpbmVkKOKAoCkgICDilIIgLSAgICAgICAgIOKUgiAtICAgICAgICAgIOKUgiAtICAgICAgICAgICAgIOKUgiB7IHJlZiB9ICAgICAgICAgICDilIIgeyByZWY6IHByb3h5IH0gIOKUglxuICog4pSCICAgICAgICAgIOKUgiBzdHJ1Y3QgICAgIOKUgiB1bmRlZmluZWQo4oCgKSAgIOKUgiAtICAgICAgICAg4pSCIC0gICAgICAgICAg4pSCIC0gICAgICAgICAgICAg4pSCIC0gICAgICAgICAgICAgICAgIOKUgiBieXZhbHVlL1IoVFtrXSkg4pSCXG4gKiDilIIgICAgICAgICAg4pSCIGNsYXNzICAgICAg4pSCIHVuZGVmaW5lZCjigKApICAg4pSCIC0gICAgICAgICDilIIgLSAgICAgICAgICDilIIgLSAgICAgICAgICAgICDilIIgeyByZWYgfSAgICAgICAgICAg4pSCIHsgcmVmOiBwcm94eSB9ICDilIJcbiAqIOKUgiAgICAgICAgICDilIIgYW55ICAgICAgICDilIIgdW5kZWZpbmVkICAgICAg4pSCIHsgZGF0ZSB9ICDilIIgdmFsdWUgICAgICDilIIgYXJyYXkvUihhbnkpICDilIIgeyByZWYgfSAgICAgICAgICAg4pSCIGJ5dmFsdWUvUihhbnkpICDilIJcbiAqIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICpcbiAqICAtICgqKSBzY2FsYXIgbWVhbnMgJ3N0cmluZyB8IG51bWJlciB8IGJvb2xlYW4nXG4gKiAgLSAo4oCgKSB0aHJvdyBpZiBub3QgbnVsbGFibGVcbiAqICAtIC9SKHQpIHJlY3Vyc2Ugd2l0aCBkZWNsYXJlZCB0eXBlIHRcbiAqL1xuXG5pbXBvcnQgKiBhcyBzcGVjIGZyb20gJ0Bqc2lpL3NwZWMnO1xuXG5pbXBvcnQge1xuICBpc09ialJlZixcbiAgaXNXaXJlRGF0ZSxcbiAgaXNXaXJlRW51bSxcbiAgaXNXaXJlTWFwLFxuICBPYmpSZWYsXG4gIFRPS0VOX0RBVEUsXG4gIFRPS0VOX0VOVU0sXG4gIFRPS0VOX01BUCxcbiAgV2lyZURhdGUsXG4gIFdpcmVFbnVtLFxuICBpc1dpcmVTdHJ1Y3QsXG4gIFRPS0VOX1NUUlVDVCxcbn0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsganNpaVR5cGVGcW4sIG9iamVjdFJlZmVyZW5jZSwgT2JqZWN0VGFibGUgfSBmcm9tICcuL29iamVjdHMnO1xuXG5pbXBvcnQgeyBhcGkgfSBmcm9tICcuJztcblxuLyoqXG4gKiBBIHNwZWNpZmljIHNpbmdsZXRvbiB0eXBlIHRvIGJlIGV4cGxpY2l0IGFib3V0IGEgVm9pZCB0eXBlXG4gKlxuICogSW4gdGhlIHNwZWMsICd2b2lkJyBpcyByZXByZXNlbnRlZCBhcyAndW5kZWZpbmVkJygqKSwgYnV0IGFsbG93aW5nIHRoZVxuICogdmFsdWUgJ3VuZGVmaW5lZCcgaW4gZnVuY3Rpb24gY2FsbHMgaGFzIGxlYWQgdG8gY29uc3VtZXJzIGZhaWxpbmcgdG8gcGFzc1xuICogdHlwZSBpbmZvcm1hdGlvbiB0aGF0IHRoZXkgaGFkLCBqdXN0IGJlY2F1c2UgdGhleSBkaWRuJ3QgXCJoYXZlIHRvXCIgKHRoZVxuICogcGFyYW1ldGVyIHdhcyBvcHRpb25hbCkuXG4gKlxuICogKCopIEFzIGluLCBkZWNsYXJhdGlvbiBvZiBhIG1ldGhvZCBsb29rcyBsaWtlIHsgcmV0dXJucz86IFR5cGVSZWZlcmVuY2UgfVxuICogYW5kIHRoZSBhYnNlbmNlIG9mIGEgdHlwZSBtZWFucyBpdCByZXR1cm5zICd2b2lkJy5cbiAqL1xuZXhwb3J0IHR5cGUgVm9pZCA9ICd2b2lkJztcblxuLyoqXG4gKiBBIHR5cGUgaW5zdGFuY2UsIG9yIFZvaWRcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9uYWxWYWx1ZU9yVm9pZCA9IHNwZWMuT3B0aW9uYWxWYWx1ZSB8IFZvaWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsIEZRTiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBlbXB0eSBqYXZhc2NyaXB0IG9iamVjdHMuXG4gKi9cbmV4cG9ydCBjb25zdCBFTVBUWV9PQkpFQ1RfRlFOID0gJ09iamVjdCc7XG5cbmV4cG9ydCBjb25zdCBTWU1CT0xfV0lSRV9UWVBFID0gU3ltYm9sLmZvcignJGpzaWkkd2lyZVR5cGUkJyk7XG5cbi8qKlxuICogVGhlIHR5cGUga2luZCwgdGhhdCBjb250cm9scyBob3cgaXQgd2lsbCBiZSBzZXJpYWxpemVkIGFjY29yZGluZyB0byB0aGUgYWJvdmUgdGFibGVcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gU2VyaWFsaXphdGlvbkNsYXNzIHtcbiAgVm9pZCA9ICdWb2lkJyxcbiAgRGF0ZSA9ICdEYXRlJyxcbiAgU2NhbGFyID0gJ1NjYWxhcicsXG4gIEpzb24gPSAnSnNvbicsXG4gIEVudW0gPSAnRW51bScsXG4gIEFycmF5ID0gJ0FycmF5JyxcbiAgTWFwID0gJ01hcCcsXG4gIFN0cnVjdCA9ICdTdHJ1Y3QnLFxuICBSZWZlcmVuY2VUeXBlID0gJ1JlZlR5cGUnLFxuICBBbnkgPSAnQW55Jyxcbn1cblxudHlwZSBUeXBlTG9va3VwID0gKGZxbjogc3BlYy5GUU4pID0+IHNwZWMuVHlwZTtcbnR5cGUgU3ltYm9sTG9va3VwID0gKGZxbjogc3BlYy5GUU4pID0+IGFueTtcblxuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemVySG9zdCB7XG4gIHJlYWRvbmx5IG9iamVjdHM6IE9iamVjdFRhYmxlO1xuICBkZWJ1ZyguLi5hcmdzOiBhbnlbXSk6IHZvaWQ7XG4gIGxvb2t1cFR5cGUoZnFuOiBzdHJpbmcpOiBzcGVjLlR5cGU7XG4gIHJlY3Vyc2UoeDogYW55LCB0eXBlOiBPcHRpb25hbFZhbHVlT3JWb2lkKTogYW55O1xuICBmaW5kU3ltYm9sKGZxbjogc3BlYy5GUU4pOiBhbnk7XG59XG5cbmludGVyZmFjZSBTZXJpYWxpemVyIHtcbiAgc2VyaWFsaXplKFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHR5cGU6IE9wdGlvbmFsVmFsdWVPclZvaWQsXG4gICAgaG9zdDogU2VyaWFsaXplckhvc3QsXG4gICk6IGFueTtcbiAgZGVzZXJpYWxpemUoXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgdHlwZTogT3B0aW9uYWxWYWx1ZU9yVm9pZCxcbiAgICBob3N0OiBTZXJpYWxpemVySG9zdCxcbiAgKTogYW55O1xufVxuXG5leHBvcnQgY29uc3QgU0VSSUFMSVpFUlM6IHsgW2s6IHN0cmluZ106IFNlcmlhbGl6ZXIgfSA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBbU2VyaWFsaXphdGlvbkNsYXNzLlZvaWRdOiB7XG4gICAgc2VyaWFsaXplKHZhbHVlLCBfdHlwZSwgaG9zdCkge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgaG9zdC5kZWJ1ZygnRXhwZWN0ZWQgdm9pZCwgZ290JywgdmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgZGVzZXJpYWxpemUodmFsdWUsIF90eXBlLCBob3N0KSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICBob3N0LmRlYnVnKCdFeHBlY3RlZCB2b2lkLCBnb3QnLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG4gIH0sXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBbU2VyaWFsaXphdGlvbkNsYXNzLkRhdGVdOiB7XG4gICAgc2VyaWFsaXplKHZhbHVlLCBvcHRpb25hbFZhbHVlKTogV2lyZURhdGUgfCB1bmRlZmluZWQge1xuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25hbFZhbHVlID09PSAndm9pZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGB2b2lkYCB0eXBlJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNEYXRlKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIERhdGUsIGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZXJpYWxpemVEYXRlKHZhbHVlKTtcbiAgICB9LFxuXG4gICAgZGVzZXJpYWxpemUodmFsdWUsIG9wdGlvbmFsVmFsdWUpIHtcbiAgICAgIGlmIChudWxsQW5kT2sodmFsdWUsIG9wdGlvbmFsVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNXaXJlRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBEYXRlLCBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVzZXJpYWxpemVEYXRlKHZhbHVlKTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgW1NlcmlhbGl6YXRpb25DbGFzcy5TY2FsYXJdOiB7XG4gICAgc2VyaWFsaXplKHZhbHVlLCBvcHRpb25hbFZhbHVlKSB7XG4gICAgICBpZiAobnVsbEFuZE9rKHZhbHVlLCBvcHRpb25hbFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbmFsVmFsdWUgPT09ICd2b2lkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY291bnRlcmVkIHVuZXhwZWN0ZWQgYHZvaWRgIHR5cGUnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJpbWl0aXZlVHlwZSA9IG9wdGlvbmFsVmFsdWUudHlwZSBhcyBzcGVjLlByaW1pdGl2ZVR5cGVSZWZlcmVuY2U7XG5cbiAgICAgIGlmICghaXNTY2FsYXIodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXhwZWN0ZWQgJHtzcGVjLmRlc2NyaWJlVHlwZVJlZmVyZW5jZShcbiAgICAgICAgICAgIG9wdGlvbmFsVmFsdWUudHlwZSxcbiAgICAgICAgICApfSwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBwcmltaXRpdmVUeXBlLnByaW1pdGl2ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEV4cGVjdGVkIGEgJHtzcGVjLmRlc2NyaWJlVHlwZVJlZmVyZW5jZShcbiAgICAgICAgICAgIG9wdGlvbmFsVmFsdWUudHlwZSxcbiAgICAgICAgICApfSwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSAoJHt0eXBlb2YgdmFsdWV9KWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcblxuICAgIGRlc2VyaWFsaXplKHZhbHVlLCBvcHRpb25hbFZhbHVlKSB7XG4gICAgICBpZiAobnVsbEFuZE9rKHZhbHVlLCBvcHRpb25hbFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbmFsVmFsdWUgPT09ICd2b2lkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY291bnRlcmVkIHVuZXhwZWN0ZWQgYHZvaWRgIHR5cGUnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJpbWl0aXZlVHlwZSA9IG9wdGlvbmFsVmFsdWUudHlwZSBhcyBzcGVjLlByaW1pdGl2ZVR5cGVSZWZlcmVuY2U7XG5cbiAgICAgIGlmICghaXNTY2FsYXIodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXhwZWN0ZWQgYSAke3NwZWMuZGVzY3JpYmVUeXBlUmVmZXJlbmNlKFxuICAgICAgICAgICAgb3B0aW9uYWxWYWx1ZS50eXBlLFxuICAgICAgICAgICl9LCBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IHByaW1pdGl2ZVR5cGUucHJpbWl0aXZlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXhwZWN0ZWQgYSAke3NwZWMuZGVzY3JpYmVUeXBlUmVmZXJlbmNlKFxuICAgICAgICAgICAgb3B0aW9uYWxWYWx1ZS50eXBlLFxuICAgICAgICAgICl9LCBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9ICgke3R5cGVvZiB2YWx1ZX0pYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gIH0sXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBbU2VyaWFsaXphdGlvbkNsYXNzLkpzb25dOiB7XG4gICAgc2VyaWFsaXplKHZhbHVlKSB7XG4gICAgICAvLyBKdXN0IHdoYXRldmVyLiBEYXRlcyB3aWxsIGF1dG9tYXRpY2FsbHkgc2VyaWFsaXplIHRoZW1zZWx2ZXMgdG8gc3RyaW5ncy5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHZhbHVlLCBvcHRpb25hbFZhbHVlLCBob3N0KSB7XG4gICAgICAvLyAvIVxcIFRvcC1sZXZlbCBcIm51bGxcIiB3aWxsIHR1cm4gdG8gdW5kZWZpbmVkLCBidXQgYW55IG51bGwgbmVzdGVkIGluIHRoZSB2YWx1ZSBpcyB2YWxpZCBKU09OLCBzbyBpdCdsbCBzdGF5IVxuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gQSBtYXBwaW5nIG9iamVjdCBjYW4gYXJyaXZlIHRob3VnaCBoZXJlLiBUaGlzIHdvdWxkIGJlIHRoZSBjYXNlIGlmIGFueXRoaW5nIHRoYXQgaXMgdmFsaWQgaW50byBhIE1hcDxzdHJpbmcsID8+XG4gICAgICAvLyBpcyBwYXNzZWQgaW50byBhIEpTT04gdHJhbnNmZXIgcG9pbnQuIEluZGVlZCwgdGhvc2UgYXJlIGFsc28gdmFsaWQgSlNPTiEgRm9yIGV4YW1wbGUsIFB5dGhvbiBcImRpY3RzXCIgd2lsbCBiZVxuICAgICAgLy8gc2VyaWFsaXplZCAoYnkgdGhlIFB5dGhvbiBydW50aW1lKSBhcyBhICRqc2lpLm1hcCAodGhlIG1hcHBpbmcgb2JqZWN0KS4gV2UgbmVlZCB0byBkZS1zZXJpYWxpemUgdGhhdCBhcyBhXG4gICAgICAvLyBNYXA8c3RyaW5nLCBKU09OPiBpbiBvcmRlciB0byBvYnRhaW4gdGhlIGNvcnJlY3Qgb3V0cHV0IGJlaGF2aW9yIGhlcmUhXG4gICAgICBpZiAoaXNXaXJlTWFwKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gU0VSSUFMSVpFUlNbU2VyaWFsaXphdGlvbkNsYXNzLk1hcF0uZGVzZXJpYWxpemUoXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAga2luZDogc3BlYy5Db2xsZWN0aW9uS2luZC5NYXAsXG4gICAgICAgICAgICAgICAgZWxlbWVudHR5cGU6IHsgcHJpbWl0aXZlOiBzcGVjLlByaW1pdGl2ZVR5cGUuSnNvbiB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhvc3QsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAobWFwSnNvblZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hcFZhbHVlcyh2YWx1ZSwgbWFwSnNvblZhbHVlKTtcblxuICAgICAgZnVuY3Rpb24gbWFwSnNvblZhbHVlKHRvTWFwOiBhbnkpIHtcbiAgICAgICAgaWYgKHRvTWFwID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gdG9NYXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhvc3QucmVjdXJzZSh0b01hcCwge1xuICAgICAgICAgIHR5cGU6IHsgcHJpbWl0aXZlOiBzcGVjLlByaW1pdGl2ZVR5cGUuSnNvbiB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgW1NlcmlhbGl6YXRpb25DbGFzcy5FbnVtXToge1xuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSwgaG9zdCk6IFdpcmVFbnVtIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmIChudWxsQW5kT2sodmFsdWUsIG9wdGlvbmFsVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9uYWxWYWx1ZSA9PT0gJ3ZvaWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRW5jb3VudGVyZWQgdW5leHBlY3RlZCBgdm9pZGAgdHlwZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZW51bSB2YWx1ZSwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgICAgfVxuXG4gICAgICBob3N0LmRlYnVnKCdTZXJpYWxpemluZyBlbnVtJyk7XG5cbiAgICAgIGNvbnN0IGVudW1UeXBlID0gb3B0aW9uYWxWYWx1ZS50eXBlIGFzIHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlO1xuICAgICAgY29uc3QgZW51bU1hcCA9IGhvc3QuZmluZFN5bWJvbChlbnVtVHlwZS5mcW4pO1xuICAgICAgY29uc3QgZW51bUVudHJ5ID0gT2JqZWN0LmVudHJpZXMoZW51bU1hcCkuZmluZCgoWywgdl0pID0+IHYgPT09IHZhbHVlKTtcbiAgICAgIGlmICghZW51bUVudHJ5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZW50cnkgaW4gJHtlbnVtVHlwZS5mcW59IGhhcyB2YWx1ZSAke3ZhbHVlfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgW1RPS0VOX0VOVU1dOiBgJHtlbnVtVHlwZS5mcW59LyR7ZW51bUVudHJ5WzBdfWAgfTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHZhbHVlLCBvcHRpb25hbFZhbHVlLCBob3N0KSB7XG4gICAgICBpZiAobnVsbEFuZE9rKHZhbHVlLCBvcHRpb25hbFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzV2lyZUVudW0odmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZW51bSB2YWx1ZSwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVzZXJpYWxpemVFbnVtKHZhbHVlLCBob3N0LmZpbmRTeW1ib2wpO1xuICAgIH0sXG4gIH0sXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBbU2VyaWFsaXphdGlvbkNsYXNzLkFycmF5XToge1xuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSwgaG9zdCkge1xuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25hbFZhbHVlID09PSAndm9pZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGB2b2lkYCB0eXBlJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhcnJheSB0eXBlLCBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFycmF5VHlwZSA9IG9wdGlvbmFsVmFsdWUudHlwZSBhcyBzcGVjLkNvbGxlY3Rpb25UeXBlUmVmZXJlbmNlO1xuXG4gICAgICByZXR1cm4gdmFsdWUubWFwKCh4KSA9PlxuICAgICAgICBob3N0LnJlY3Vyc2UoeCwgeyB0eXBlOiBhcnJheVR5cGUuY29sbGVjdGlvbi5lbGVtZW50dHlwZSB9KSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSwgaG9zdCkge1xuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25hbFZhbHVlID09PSAndm9pZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGB2b2lkYCB0eXBlJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhcnJheSB0eXBlLCBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFycmF5VHlwZSA9IG9wdGlvbmFsVmFsdWUudHlwZSBhcyBzcGVjLkNvbGxlY3Rpb25UeXBlUmVmZXJlbmNlO1xuXG4gICAgICByZXR1cm4gdmFsdWUubWFwKCh4KSA9PlxuICAgICAgICBob3N0LnJlY3Vyc2UoeCwgeyB0eXBlOiBhcnJheVR5cGUuY29sbGVjdGlvbi5lbGVtZW50dHlwZSB9KSxcbiAgICAgICk7XG4gICAgfSxcbiAgfSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIFtTZXJpYWxpemF0aW9uQ2xhc3MuTWFwXToge1xuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSwgaG9zdCkge1xuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25hbFZhbHVlID09PSAndm9pZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGB2b2lkYCB0eXBlJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hcFR5cGUgPSBvcHRpb25hbFZhbHVlLnR5cGUgYXMgc3BlYy5Db2xsZWN0aW9uVHlwZVJlZmVyZW5jZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtUT0tFTl9NQVBdOiBtYXBWYWx1ZXModmFsdWUsICh2KSA9PlxuICAgICAgICAgIGhvc3QucmVjdXJzZSh2LCB7IHR5cGU6IG1hcFR5cGUuY29sbGVjdGlvbi5lbGVtZW50dHlwZSB9KSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSwgaG9zdCkge1xuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25hbFZhbHVlID09PSAndm9pZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGB2b2lkYCB0eXBlJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hcFR5cGUgPSBvcHRpb25hbFZhbHVlLnR5cGUgYXMgc3BlYy5Db2xsZWN0aW9uVHlwZVJlZmVyZW5jZTtcbiAgICAgIGlmICghaXNXaXJlTWFwKHZhbHVlKSkge1xuICAgICAgICAvLyBDb21wYXRpYmlsaXR5IG1vZGUgd2l0aCBvbGRlciB2ZXJzaW9ucyB0aGF0IGRpZG4ndCB3cmFwIGluIFtUT0tFTl9NQVBdXG4gICAgICAgIHJldHVybiBtYXBWYWx1ZXModmFsdWUsICh2KSA9PlxuICAgICAgICAgIGhvc3QucmVjdXJzZSh2LCB7IHR5cGU6IG1hcFR5cGUuY29sbGVjdGlvbi5lbGVtZW50dHlwZSB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IG1hcFZhbHVlcyh2YWx1ZVtUT0tFTl9NQVBdLCAodikgPT5cbiAgICAgICAgaG9zdC5yZWN1cnNlKHYsIHsgdHlwZTogbWFwVHlwZS5jb2xsZWN0aW9uLmVsZW1lbnR0eXBlIH0pLFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIFNZTUJPTF9XSVJFX1RZUEUsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBUT0tFTl9NQVAsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICB9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgW1NlcmlhbGl6YXRpb25DbGFzcy5TdHJ1Y3RdOiB7XG4gICAgc2VyaWFsaXplKHZhbHVlLCBvcHRpb25hbFZhbHVlLCBob3N0KSB7XG4gICAgICBpZiAobnVsbEFuZE9rKHZhbHVlLCBvcHRpb25hbFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbmFsVmFsdWUgPT09ICd2b2lkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY291bnRlcmVkIHVuZXhwZWN0ZWQgYHZvaWRgIHR5cGUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG9iamVjdCwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICBUaGlzIGlzIHdoYXQgd2UnZCBsaWtlIHRvIGRvLCBidXQgd2UgY2FuJ3QgYmVjYXVzZSBhdCBsZWFzdCB0aGUgSmF2YSBjbGllbnRcbiAgICAgICAgZG9lcyBub3QgdW5kZXJzdGFuZCBieS12YWx1ZSBzZXJpYWxpemVkIGludGVyZmFjZSB0eXBlcywgc28gd2UnbGwgaGF2ZSB0b1xuICAgICAgICBzZXJpYWxpemUgYnktcmVmZXJlbmNlLiBBZGRpdGlvbmFsbHksIHNlcmlhbGl6aW5nIGtub3duIHByb3BlcnRpZXMgd291bGRcbiAgICAgICAgY2F1c2UgcHJvYmxlbXMgd2hlbiB0aGUgcmV0dXJuIHR5cGUgb2YgYSBtZXRob2QgaXMgYSBVTklPTiBvZiBzdHJ1Y3RzLlxuICAgICAgICBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvNDAwXG5cbiAgICAgIGNvbnN0IHByb3BzID0gcHJvcGVydGllc09mKG5hbWVkVHlwZSk7XG5cbiAgICAgIHJldHVybiBtYXBWYWx1ZXModmFsdWUsICh2LCBrZXkpID0+IHtcbiAgICAgICAgaWYgKCFwcm9wc1trZXldKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gLy8gRG9uJ3QgbWFwIGlmIHVua25vd24gcHJvcGVydHlcbiAgICAgICAgcmV0dXJuIGhvc3QucmVjdXJzZSh2LCBwcm9wc1trZXldLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICAqL1xuXG4gICAgICBob3N0LmRlYnVnKCdSZXR1cm5pbmcgdmFsdWUgdHlwZSBieSByZWZlcmVuY2UnKTtcbiAgICAgIHJldHVybiBob3N0Lm9iamVjdHMucmVnaXN0ZXJPYmplY3QodmFsdWUsIEVNUFRZX09CSkVDVF9GUU4sIFtcbiAgICAgICAgKG9wdGlvbmFsVmFsdWUudHlwZSBhcyBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSkuZnFuLFxuICAgICAgXSk7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSwgaG9zdCkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXModmFsdWUgPz8ge30pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBUcmVhdCBlbXB0eSBzdHJ1Y3RzIGFzIGB1bmRlZmluZWRgIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy80MTEpXG4gICAgICAgIHZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25hbFZhbHVlID09PSAndm9pZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGB2b2lkYCB0eXBlJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFeHBlY3RlZCBvYmplY3QgcmVmZXJlbmNlLCBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmFtZWRUeXBlID0gaG9zdC5sb29rdXBUeXBlKFxuICAgICAgICAob3B0aW9uYWxWYWx1ZS50eXBlIGFzIHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlKS5mcW4sXG4gICAgICApO1xuICAgICAgY29uc3QgcHJvcHMgPSBwcm9wZXJ0aWVzT2YobmFtZWRUeXBlLCBob3N0Lmxvb2t1cFR5cGUpO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBHb3QgYW4gYXJyYXkgd2hlcmUgYSAke25hbWVkVHlwZS5mcW59IHdhcyBleHBlY3RlZC4gRGlkIHlvdSBtZWFuIHRvIHBhc3MgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzP2AsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNpbWlsYXJseSB0byBzZXJpYWxpemF0aW9uLCB3ZSBtaWdodCBiZSBnZXR0aW5nIGEgcmVmZXJlbmNlIHR5cGUgd2hlcmUgd2UncmVcbiAgICAgIC8vIGV4cGVjdGluZyBhIHZhbHVlIHR5cGUuIEFjY2VwdCB0aGlzIGZvciBub3cgKGJ1dCBhbHNvIHZhbGlkYXRlIHRoYXQgb2JqZWN0XG4gICAgICAvLyBmb3IgcHJlc2VuY2Ugb2YgdGhlIHJpZ2h0IHByb3BlcnRpZXMpLlxuICAgICAgaWYgKGlzT2JqUmVmKHZhbHVlKSkge1xuICAgICAgICBob3N0LmRlYnVnKFxuICAgICAgICAgICdFeHBlY3RlZCB2YWx1ZSB0eXBlIGJ1dCBnb3QgcmVmZXJlbmNlIHR5cGUsIGFjY2VwdGluZyBmb3Igbm93IChhd3NsYWJzL2pzaWkjNDAwKScsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmV0dXJuIHNhbWUgSU5TVEFOQ0UgKHNob3VsZG4ndCBtYXR0ZXIgYnV0IHdlIGRvbid0IGtub3cgZm9yIHN1cmUgdGhhdCBpdCBkb2Vzbid0KVxuICAgICAgICByZXR1cm4gdmFsaWRhdGVSZXF1aXJlZFByb3BzKFxuICAgICAgICAgIGhvc3Qub2JqZWN0cy5maW5kT2JqZWN0KHZhbHVlKS5pbnN0YW5jZSxcbiAgICAgICAgICBuYW1lZFR5cGUuZnFuLFxuICAgICAgICAgIHByb3BzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXBpLmlzV2lyZVN0cnVjdCh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgeyBmcW4sIGRhdGEgfSA9IHZhbHVlW2FwaS5UT0tFTl9TVFJVQ1RdO1xuICAgICAgICBpZiAoIWlzQXNzaWduYWJsZShmcW4sIG5hbWVkVHlwZSwgaG9zdC5sb29rdXBUeXBlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBXaXJlIHN0cnVjdCB0eXBlICcke2Zxbn0nIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkICcke25hbWVkVHlwZS5mcW59J2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSA9IGRhdGE7XG4gICAgICB9XG5cbiAgICAgIC8vIFB5dGhvbiwgZm9yIGV4YW1wbGUsIGFsbG93cyB1c2luZyBwbGFpbiBtYXBwaW5nIG9iamVjdHMgaW5zdGVhZCBvZiBTdHJ1Y3RzIChkeWFubWljIHR5cGluZywgWU9MTyEpXG4gICAgICBpZiAoYXBpLmlzV2lyZU1hcCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZVthcGkuVE9LRU5fTUFQXTtcbiAgICAgIH1cblxuICAgICAgdmFsdWUgPSB2YWxpZGF0ZVJlcXVpcmVkUHJvcHModmFsdWUgYXMgYW55LCBuYW1lZFR5cGUuZnFuLCBwcm9wcyk7XG5cbiAgICAgIC8vIFJldHVybiBhIGRpY3QgQ09QWSwgd2UgaGF2ZSBieS12YWx1ZSBzZW1hbnRpY3MgYW55d2F5LlxuICAgICAgcmV0dXJuIG1hcFZhbHVlcyh2YWx1ZSwgKHYsIGtleSkgPT4ge1xuICAgICAgICBpZiAoIXByb3BzW2tleV0pIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9IC8vIERvbid0IG1hcCBpZiB1bmtub3duIHByb3BlcnR5XG4gICAgICAgIHJldHVybiBob3N0LnJlY3Vyc2UodiwgcHJvcHNba2V5XSk7XG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgW1NlcmlhbGl6YXRpb25DbGFzcy5SZWZlcmVuY2VUeXBlXToge1xuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSwgaG9zdCk6IE9ialJlZiB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAobnVsbEFuZE9rKHZhbHVlLCBvcHRpb25hbFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbmFsVmFsdWUgPT09ICd2b2lkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY291bnRlcmVkIHVuZXhwZWN0ZWQgYHZvaWRgIHR5cGUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEV4cGVjdGVkIG9iamVjdCByZWZlcmVuY2UsIGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHBlY3RlZFR5cGUgPSBob3N0Lmxvb2t1cFR5cGUoXG4gICAgICAgIChvcHRpb25hbFZhbHVlLnR5cGUgYXMgc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UpLmZxbixcbiAgICAgICk7XG4gICAgICBjb25zdCBpbnRlcmZhY2VzID0gc3BlYy5pc0ludGVyZmFjZVR5cGUoZXhwZWN0ZWRUeXBlKVxuICAgICAgICA/IFtleHBlY3RlZFR5cGUuZnFuXVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGpzaWlUeXBlID1cbiAgICAgICAganNpaVR5cGVGcW4odmFsdWUpID8/XG4gICAgICAgIChzcGVjLmlzQ2xhc3NUeXBlKGV4cGVjdGVkVHlwZSkgPyBleHBlY3RlZFR5cGUuZnFuIDogRU1QVFlfT0JKRUNUX0ZRTik7XG5cbiAgICAgIHJldHVybiBob3N0Lm9iamVjdHMucmVnaXN0ZXJPYmplY3QodmFsdWUsIGpzaWlUeXBlLCBpbnRlcmZhY2VzKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHZhbHVlLCBvcHRpb25hbFZhbHVlLCBob3N0KSB7XG4gICAgICBpZiAobnVsbEFuZE9rKHZhbHVlLCBvcHRpb25hbFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbmFsVmFsdWUgPT09ICd2b2lkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY291bnRlcmVkIHVuZXhwZWN0ZWQgYHZvaWRgIHR5cGUnKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHBhc3MgYSBieS1yZWYgb2JqZWN0IGlzIHRvIGhhdmUgY3JlYXRlZCBpdFxuICAgICAgLy8gcHJldmlvdXNseSBpbnNpZGUgSlNJSSBrZXJuZWwsIHNvIGl0IG11c3QgaGF2ZSBhbiBvYmpyZWYgYWxyZWFkeS5cblxuICAgICAgaWYgKCFpc09ialJlZih2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFeHBlY3RlZCBvYmplY3QgcmVmZXJlbmNlLCBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBpbnN0YW5jZSwgZnFuIH0gPSBob3N0Lm9iamVjdHMuZmluZE9iamVjdCh2YWx1ZSk7XG5cbiAgICAgIGNvbnN0IG5hbWVkVHlwZVJlZiA9IG9wdGlvbmFsVmFsdWUudHlwZSBhcyBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZTtcbiAgICAgIGlmIChuYW1lZFR5cGVSZWYuZnFuICE9PSBFTVBUWV9PQkpFQ1RfRlFOKSB7XG4gICAgICAgIGNvbnN0IG5hbWVkVHlwZSA9IGhvc3QubG9va3VwVHlwZShuYW1lZFR5cGVSZWYuZnFuKTtcblxuICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBvYmplY3Qgd2UgZ290IGlzIG9mIHRoZSByaWdodCB0eXBlXG4gICAgICAgIC8vIFdlIG9ubHkgZG8gdGhpcyBmb3IgY2xhc3Nlcywgbm90IGludGVyZmFjZXMsIHNpbmNlIEphdmEgbWlnaHQgcGFzcyB1cyBvYmplY3RzIHRoYXRcbiAgICAgICAgLy8gcHJpdmF0ZWx5IGltcGxlbWVudCBzb21lIGludGVyZmFjZSBhbmQgd2UgY2FuJ3QgcHJvdmUgdGhleSBkb24ndC5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy8zOTlcbiAgICAgICAgY29uc3QgZGVjbGFyZWRUeXBlID0gb3B0aW9uYWxWYWx1ZS50eXBlIGFzIHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc3BlYy5pc0NsYXNzVHlwZShuYW1lZFR5cGUpICYmXG4gICAgICAgICAgIWlzQXNzaWduYWJsZShmcW4sIGRlY2xhcmVkVHlwZSwgaG9zdC5sb29rdXBUeXBlKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgT2JqZWN0IG9mIHR5cGUgJHtmcW59IGlzIG5vdCBjb252ZXJ0aWJsZSB0byAke2RlY2xhcmVkVHlwZS5mcW59YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgW1NlcmlhbGl6YXRpb25DbGFzcy5BbnldOiB7XG4gICAgc2VyaWFsaXplKHZhbHVlLCBfdHlwZSwgaG9zdCkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZURhdGUodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKGlzU2NhbGFyKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCgoZSkgPT4gaG9zdC5yZWN1cnNlKGUsIHsgdHlwZTogc3BlYy5DQU5PTklDQUxfQU5ZIH0pKTtcbiAgICAgIH1cblxuICAgICAgLy8gTm90ZTogbm8gY2FzZSBmb3IgXCJFTlVNXCIgaGVyZSwgd2l0aG91dCB0eXBlIGRlY2xhcmF0aW9uIHdlIGNhbid0IHRlbGwgdGhlIGRpZmZlcmVuY2VcbiAgICAgIC8vIGJldHdlZW4gYW4gZW51bSBtZW1iZXIgYW5kIGEgc2NhbGFyLlxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnSlNJSSBLZXJuZWwgaXMgdW5hYmxlIHRvIHNlcmlhbGl6ZSBgZnVuY3Rpb25gLiBBbiBpbnN0YW5jZSB3aXRoIG1ldGhvZHMgbWlnaHQgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IGFuIGBhbnlgIG1ldGhvZD8nLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSlNJSSBrZXJuZWwgYXNzdW1wdGlvbiB2aW9sYXRlZCwgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICl9IGlzIG5vdCBhbiBvYmplY3RgLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIFNZTUJPTF9XSVJFX1RZUEUgaW4gdmFsdWUgJiZcbiAgICAgICAgKHZhbHVlIGFzIGFueSlbU1lNQk9MX1dJUkVfVFlQRV0gPT09IFRPS0VOX01BUFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBTRVJJQUxJWkVSU1tTZXJpYWxpemF0aW9uQ2xhc3MuTWFwXS5zZXJpYWxpemUoXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAga2luZDogc3BlYy5Db2xsZWN0aW9uS2luZC5NYXAsXG4gICAgICAgICAgICAgICAgZWxlbWVudHR5cGU6IHNwZWMuQ0FOT05JQ0FMX0FOWSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBob3N0LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBUbyBtYWtlIHN1cmUgcGVvcGxlIGFyZW4ndCBnb2luZyB0byB0cnkgYW5kIHJldHVybiBNYXA8PiBvciBTZXQ8PiBvdXQsIHRlc3QgZm9yXG4gICAgICAvLyB0aG9zZSBhbmQgdGhyb3cgYSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlLiBXZSBjYW4ndCBkZXRlY3QgdGhlc2UgY2FzZXMgYW55IG90aGVyXG4gICAgICAvLyB3YXksIGFuZCB0aGUgYnktdmFsdWUgc2VyaWFsaXplZCBvYmplY3Qgd2lsbCBiZSBxdWl0ZSB1c2VsZXNzLlxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0IHx8IHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHJldHVybiBvYmplY3RzIG9mIHR5cGUgU2V0IG9yIE1hcFwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIGEgcHJldmlvdXMgcmVmZXJlbmNlIHRvIG1haW50YWluIG9iamVjdCBpZGVudGl0eS4gTk9URTogdGhpcyBtYXkgY2F1c2UgdXMgdG8gcmV0dXJuXG4gICAgICAvLyBhIGRpZmZlcmVudCB0eXBlIHRoYW4gcmVxdWVzdGVkISBUaGlzIGlzIGp1c3QgaG93IGl0IGlzIHJpZ2h0IG5vdy5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMzk5XG4gICAgICBjb25zdCBwcmV2UmVmID0gb2JqZWN0UmVmZXJlbmNlKHZhbHVlKTtcbiAgICAgIGlmIChwcmV2UmVmKSB7XG4gICAgICAgIHJldHVybiBwcmV2UmVmO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGlzIGlzIG9yIHNob3VsZCBiZSBhIHJlZmVyZW5jZSB0eXBlLCBwYXNzIG9yIG1ha2UgdGhlIHJlZmVyZW5jZVxuICAgICAgLy8gKExpa2UgcmVndWxhciByZWZ0eXBlIHNlcmlhbGl6YXRpb24sIGJ1dCB3aXRob3V0IHRoZSB0eXBlIGRlcml2YXRpb24gdG8gYW4gaW50ZXJmYWNlKVxuICAgICAgY29uc3QganNpaVR5cGUgPVxuICAgICAgICBqc2lpVHlwZUZxbih2YWx1ZSkgPz9cbiAgICAgICAgKGlzQnlSZWZlcmVuY2VPbmx5KHZhbHVlKSA/IEVNUFRZX09CSkVDVF9GUU4gOiB1bmRlZmluZWQpO1xuICAgICAgaWYgKGpzaWlUeXBlKSB7XG4gICAgICAgIHJldHVybiBob3N0Lm9iamVjdHMucmVnaXN0ZXJPYmplY3QodmFsdWUsIGpzaWlUeXBlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGFuIG9iamVjdCB0aGF0IGlzIG5vdCBvZiBhbiBleHBvcnRlZCB0eXBlLiBFaXRoZXIgYW4gb2JqZWN0XG4gICAgICAvLyBsaXRlcmFsLCBvciBhbiBpbnN0YW5jZSBvZiBhIGZ1bGx5IHByaXZhdGUgY2xhc3MgKGNhbm5vdCBkaXN0aW5ndWlzaCB0aG9zZSBjYXNlcykuXG5cbiAgICAgIC8vIFdlIHdpbGwgc2VyaWFsaXplIGJ5LXZhbHVlLCBidXQgcmVjdXJzZSBmb3Igc2VyaWFsaXphdGlvbiBzbyB0aGF0IGlmXG4gICAgICAvLyB0aGUgb2JqZWN0IGNvbnRhaW5zIHJlZmVyZW5jZSBvYmplY3RzLCB0aGV5IHdpbGwgYmUgc2VyaWFsaXplZCBhcHByb3ByaWF0ZWx5LlxuICAgICAgLy8gKEJhc2ljYWxseSwgc2VyaWFsaXplIGFueXRoaW5nIGVsc2UgYXMgYSBtYXAgb2YgJ2FueScpLlxuICAgICAgcmV0dXJuIG1hcFZhbHVlcyh2YWx1ZSwgKHYpID0+XG4gICAgICAgIGhvc3QucmVjdXJzZSh2LCB7IHR5cGU6IHNwZWMuQ0FOT05JQ0FMX0FOWSB9KSxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGRlc2VyaWFsaXplKHZhbHVlLCBfdHlwZSwgaG9zdCkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzV2lyZURhdGUodmFsdWUpKSB7XG4gICAgICAgIGhvc3QuZGVidWcoJ0FOWSBpcyBhIERhdGUnKTtcbiAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplRGF0ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNTY2FsYXIodmFsdWUpKSB7XG4gICAgICAgIGhvc3QuZGVidWcoJ0FOWSBpcyBhIFNjYWxhcicpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgaG9zdC5kZWJ1ZygnQU5ZIGlzIGFuIEFycmF5Jyk7XG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGUpID0+IGhvc3QucmVjdXJzZShlLCB7IHR5cGU6IHNwZWMuQ0FOT05JQ0FMX0FOWSB9KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1dpcmVFbnVtKHZhbHVlKSkge1xuICAgICAgICBob3N0LmRlYnVnKCdBTlkgaXMgYW4gRW51bScpO1xuICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVFbnVtKHZhbHVlLCBob3N0LmZpbmRTeW1ib2wpO1xuICAgICAgfVxuICAgICAgaWYgKGlzV2lyZU1hcCh2YWx1ZSkpIHtcbiAgICAgICAgaG9zdC5kZWJ1ZygnQU5ZIGlzIGEgTWFwJyk7XG4gICAgICAgIGNvbnN0IG1hcE9mQW55OiBzcGVjLkNvbGxlY3Rpb25UeXBlUmVmZXJlbmNlID0ge1xuICAgICAgICAgIGNvbGxlY3Rpb246IHtcbiAgICAgICAgICAgIGtpbmQ6IHNwZWMuQ29sbGVjdGlvbktpbmQuTWFwLFxuICAgICAgICAgICAgZWxlbWVudHR5cGU6IHNwZWMuQ0FOT05JQ0FMX0FOWSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gU0VSSUFMSVpFUlNbU2VyaWFsaXphdGlvbkNsYXNzLk1hcF0uZGVzZXJpYWxpemUoXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgeyB0eXBlOiBtYXBPZkFueSB9LFxuICAgICAgICAgIGhvc3QsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoaXNPYmpSZWYodmFsdWUpKSB7XG4gICAgICAgIGhvc3QuZGVidWcoJ0FOWSBpcyBhIFJlZicpO1xuICAgICAgICByZXR1cm4gaG9zdC5vYmplY3RzLmZpbmRPYmplY3QodmFsdWUpLmluc3RhbmNlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgdmFsdWUgaGFzIGEgc3RydWN0IHRva2VuLCBpdCB3YXMgc2VyaWFsaXplZCBieSBhIHR5cGVkIGpzaWlcbiAgICAgIC8vIHN0cnVjdCwgYnV0IHNpbmNlIHRoZSBkZXNlcmlhbGl6YXRpb24gdGFyZ2V0IGlzIEFOWSwgYWxsIHdlIGNhbiBkbyBpc1xuICAgICAgLy8gc3RyaXAgdGhlIGRhdGEgZnJvbSAkanNpaS5zdHJ1Y3QgYW5kIGNvbnRpbnVlIHRvIGRlc2VyaWFsaXplIGFzIEFOWS5cbiAgICAgIGlmIChpc1dpcmVTdHJ1Y3QodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHsgZnFuLCBkYXRhIH0gPSB2YWx1ZVtUT0tFTl9TVFJVQ1RdO1xuICAgICAgICBob3N0LmRlYnVnKGBBTlkgaXMgYSBzdHJ1Y3Qgb2YgdHlwZSAke2Zxbn1gKTtcbiAgICAgICAgcmV0dXJuIFNFUklBTElaRVJTW1NlcmlhbGl6YXRpb25DbGFzcy5TdHJ1Y3RdLmRlc2VyaWFsaXplKFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgeyB0eXBlOiB7IGZxbiB9IH0sXG4gICAgICAgICAgaG9zdCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXQgdGhpcyBwb2ludCBhZ2FpbiwgZGVzZXJpYWxpemUgYnktdmFsdWUuXG4gICAgICBob3N0LmRlYnVnKCdBTlkgaXMgYSBNYXAnKTtcbiAgICAgIHJldHVybiBtYXBWYWx1ZXModmFsdWUsICh2KSA9PlxuICAgICAgICBob3N0LnJlY3Vyc2UodiwgeyB0eXBlOiBzcGVjLkNBTk9OSUNBTF9BTlkgfSksXG4gICAgICApO1xuICAgIH0sXG4gIH0sXG59O1xuXG5mdW5jdGlvbiBzZXJpYWxpemVEYXRlKHZhbHVlOiBEYXRlKTogV2lyZURhdGUge1xuICByZXR1cm4geyBbVE9LRU5fREFURV06IHZhbHVlLnRvSVNPU3RyaW5nKCkgfTtcbn1cblxuZnVuY3Rpb24gZGVzZXJpYWxpemVEYXRlKHZhbHVlOiBXaXJlRGF0ZSk6IERhdGUge1xuICByZXR1cm4gbmV3IERhdGUodmFsdWVbVE9LRU5fREFURV0pO1xufVxuXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZUVudW0odmFsdWU6IFdpcmVFbnVtLCBsb29rdXA6IFN5bWJvbExvb2t1cCkge1xuICBjb25zdCBlbnVtTG9jYXRvciA9IHZhbHVlW1RPS0VOX0VOVU1dO1xuICBjb25zdCBzZXAgPSBlbnVtTG9jYXRvci5sYXN0SW5kZXhPZignLycpO1xuICBpZiAoc2VwID09PSAtMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWFsZm9ybWVkIGVudW0gdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICB9XG5cbiAgY29uc3QgdHlwZU5hbWUgPSBlbnVtTG9jYXRvci5zbGljZSgwLCBzZXApO1xuICBjb25zdCB2YWx1ZU5hbWUgPSBlbnVtTG9jYXRvci5zbGljZShzZXAgKyAxKTtcblxuICBjb25zdCBlbnVtVmFsdWUgPSBsb29rdXAodHlwZU5hbWUpW3ZhbHVlTmFtZV07XG4gIGlmIChlbnVtVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gZW51bSBtZW1iZXIgbmFtZWQgJHt2YWx1ZU5hbWV9IGluICR7dHlwZU5hbWV9YCk7XG4gIH1cbiAgcmV0dXJuIGVudW1WYWx1ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlU2VyaWFsaXphdGlvbiB7XG4gIHNlcmlhbGl6YXRpb25DbGFzczogU2VyaWFsaXphdGlvbkNsYXNzO1xuICB0eXBlUmVmOiBPcHRpb25hbFZhbHVlT3JWb2lkO1xufVxuXG4vKipcbiAqIEZyb20gYSB0eXBlIHJlZmVyZW5jZSwgcmV0dXJuIHRoZSBwb3NzaWJsZSBzZXJpYWxpemF0aW9uIHR5cGVzXG4gKlxuICogVGhlcmUgY2FuIGJlIG11bHRpcGxlLCBiZWNhdXNlIHRoZSB0eXBlIGNhbiBiZSBhIHR5cGUgdW5pb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemF0aW9uVHlwZShcbiAgdHlwZVJlZjogT3B0aW9uYWxWYWx1ZU9yVm9pZCxcbiAgbG9va3VwOiBUeXBlTG9va3VwLFxuKTogVHlwZVNlcmlhbGl6YXRpb25bXSB7XG4gIGlmICh0eXBlUmVmID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJLZXJuZWwgZXJyb3I6IGV4cGVjdGVkIHR5cGUgaW5mb3JtYXRpb24sIGdvdCAndW5kZWZpbmVkJ1wiKTtcbiAgfVxuICBpZiAodHlwZVJlZiA9PT0gJ3ZvaWQnKSB7XG4gICAgcmV0dXJuIFt7IHNlcmlhbGl6YXRpb25DbGFzczogU2VyaWFsaXphdGlvbkNsYXNzLlZvaWQsIHR5cGVSZWYgfV07XG4gIH1cbiAgaWYgKHNwZWMuaXNQcmltaXRpdmVUeXBlUmVmZXJlbmNlKHR5cGVSZWYudHlwZSkpIHtcbiAgICBzd2l0Y2ggKHR5cGVSZWYudHlwZS5wcmltaXRpdmUpIHtcbiAgICAgIGNhc2Ugc3BlYy5QcmltaXRpdmVUeXBlLkFueTpcbiAgICAgICAgcmV0dXJuIFt7IHNlcmlhbGl6YXRpb25DbGFzczogU2VyaWFsaXphdGlvbkNsYXNzLkFueSwgdHlwZVJlZiB9XTtcbiAgICAgIGNhc2Ugc3BlYy5QcmltaXRpdmVUeXBlLkRhdGU6XG4gICAgICAgIHJldHVybiBbeyBzZXJpYWxpemF0aW9uQ2xhc3M6IFNlcmlhbGl6YXRpb25DbGFzcy5EYXRlLCB0eXBlUmVmIH1dO1xuICAgICAgY2FzZSBzcGVjLlByaW1pdGl2ZVR5cGUuSnNvbjpcbiAgICAgICAgcmV0dXJuIFt7IHNlcmlhbGl6YXRpb25DbGFzczogU2VyaWFsaXphdGlvbkNsYXNzLkpzb24sIHR5cGVSZWYgfV07XG4gICAgICBjYXNlIHNwZWMuUHJpbWl0aXZlVHlwZS5Cb29sZWFuOlxuICAgICAgY2FzZSBzcGVjLlByaW1pdGl2ZVR5cGUuTnVtYmVyOlxuICAgICAgY2FzZSBzcGVjLlByaW1pdGl2ZVR5cGUuU3RyaW5nOlxuICAgICAgICByZXR1cm4gW3sgc2VyaWFsaXphdGlvbkNsYXNzOiBTZXJpYWxpemF0aW9uQ2xhc3MuU2NhbGFyLCB0eXBlUmVmIH1dO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBwcmltaXRpdmUgdHlwZScpO1xuICB9XG4gIGlmIChzcGVjLmlzQ29sbGVjdGlvblR5cGVSZWZlcmVuY2UodHlwZVJlZi50eXBlKSkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHNlcmlhbGl6YXRpb25DbGFzczpcbiAgICAgICAgICB0eXBlUmVmLnR5cGUuY29sbGVjdGlvbi5raW5kID09PSBzcGVjLkNvbGxlY3Rpb25LaW5kLkFycmF5XG4gICAgICAgICAgICA/IFNlcmlhbGl6YXRpb25DbGFzcy5BcnJheVxuICAgICAgICAgICAgOiBTZXJpYWxpemF0aW9uQ2xhc3MuTWFwLFxuICAgICAgICB0eXBlUmVmLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG4gIGlmIChzcGVjLmlzVW5pb25UeXBlUmVmZXJlbmNlKHR5cGVSZWYudHlwZSkpIHtcbiAgICBjb25zdCBjb21wb3VuZFR5cGVzID0gZmxhdE1hcCh0eXBlUmVmLnR5cGUudW5pb24udHlwZXMsICh0KSA9PlxuICAgICAgc2VyaWFsaXphdGlvblR5cGUoeyB0eXBlOiB0IH0sIGxvb2t1cCksXG4gICAgKTtcbiAgICAvLyBQcm9wYWdhdGUgdGhlIHRvcC1sZXZlbCAnb3B0aW9uYWwnIGZpZWxkIHRvIGVhY2ggaW5kaXZpZHVhbCBzdWJ0eXBlXG4gICAgZm9yIChjb25zdCB0IG9mIGNvbXBvdW5kVHlwZXMpIHtcbiAgICAgIGlmICh0LnR5cGVSZWYgIT09ICd2b2lkJykge1xuICAgICAgICB0LnR5cGVSZWYub3B0aW9uYWwgPSB0eXBlUmVmLm9wdGlvbmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29tcG91bmRUeXBlcy5zb3J0KChsLCByKSA9PlxuICAgICAgY29tcGFyZVNlcmlhbGl6YXRpb25DbGFzc2VzKGwuc2VyaWFsaXphdGlvbkNsYXNzLCByLnNlcmlhbGl6YXRpb25DbGFzcyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBuZXh0IHBhcnQgb2YgdGhlIGNvbnZlcnNpb24gaXMgbG9va3VwLWRlcGVuZGVudFxuICBjb25zdCB0eXBlID0gbG9va3VwKHR5cGVSZWYudHlwZS5mcW4pO1xuXG4gIGlmIChzcGVjLmlzRW51bVR5cGUodHlwZSkpIHtcbiAgICByZXR1cm4gW3sgc2VyaWFsaXphdGlvbkNsYXNzOiBTZXJpYWxpemF0aW9uQ2xhc3MuRW51bSwgdHlwZVJlZiB9XTtcbiAgfVxuXG4gIGlmIChzcGVjLmlzSW50ZXJmYWNlVHlwZSh0eXBlKSAmJiB0eXBlLmRhdGF0eXBlKSB7XG4gICAgcmV0dXJuIFt7IHNlcmlhbGl6YXRpb25DbGFzczogU2VyaWFsaXphdGlvbkNsYXNzLlN0cnVjdCwgdHlwZVJlZiB9XTtcbiAgfVxuXG4gIHJldHVybiBbeyBzZXJpYWxpemF0aW9uQ2xhc3M6IFNlcmlhbGl6YXRpb25DbGFzcy5SZWZlcmVuY2VUeXBlLCB0eXBlUmVmIH1dO1xufVxuXG5mdW5jdGlvbiBudWxsQW5kT2soeDogdW5rbm93biwgdHlwZTogT3B0aW9uYWxWYWx1ZU9yVm9pZCk6IGJvb2xlYW4ge1xuICBpZiAoeCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGUgIT09ICd2b2lkJyAmJiAhdHlwZS5vcHRpb25hbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBHb3QgJ3VuZGVmaW5lZCcgZm9yIG5vbi1vcHRpb25hbCBpbnN0YW5jZSBvZiAke0pTT04uc3RyaW5naWZ5KHR5cGUpfWAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0RhdGUoeDogdW5rbm93bik6IHggaXMgRGF0ZSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHggPT09ICdvYmplY3QnICYmXG4gICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBEYXRlXSdcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNTY2FsYXIoeDogdW5rbm93bik6IHggaXMgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHggPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB4ID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgeCA9PT0gJ2Jvb2xlYW4nXG4gICk7XG59XG5cbmZ1bmN0aW9uIGZsYXRNYXA8VCwgVT4oeHM6IFRbXSwgZm46ICh4OiBUKSA9PiBVW10pOiBVW10ge1xuICBjb25zdCByZXQgPSBuZXcgQXJyYXk8VT4oKTtcbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgcmV0LnB1c2goLi4uZm4oeCkpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogTWFwIGFuIG9iamVjdCdzIHZhbHVlcywgc2tpcHBpbmcgJ3VuZGVmaW5lZCcgdmFsdWVzJ1xuICovXG5mdW5jdGlvbiBtYXBWYWx1ZXMoXG4gIHZhbHVlOiB1bmtub3duLFxuICBmbjogKHZhbHVlOiBhbnksIGZpZWxkOiBzdHJpbmcpID0+IGFueSxcbik6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvYmplY3QgdHlwZSwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICB9XG5cbiAgY29uc3Qgb3V0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgIGNvbnN0IHdpcmVWYWx1ZSA9IGZuKHYsIGspO1xuICAgIGlmICh3aXJlVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIG91dFtrXSA9IHdpcmVWYWx1ZTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0aWVzT2YoXG4gIHQ6IHNwZWMuVHlwZSxcbiAgbG9va3VwOiBUeXBlTG9va3VwLFxuKTogeyBbbmFtZTogc3RyaW5nXTogc3BlYy5Qcm9wZXJ0eSB9IHtcbiAgaWYgKCFzcGVjLmlzQ2xhc3NPckludGVyZmFjZVR5cGUodCkpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBsZXQgcmV0OiB7IFtuYW1lOiBzdHJpbmddOiBzcGVjLlByb3BlcnR5IH0gPSB7fTtcblxuICBpZiAodC5pbnRlcmZhY2VzKSB7XG4gICAgZm9yIChjb25zdCBpZmFjZSBvZiB0LmludGVyZmFjZXMpIHtcbiAgICAgIHJldCA9IHsgLi4ucmV0LCAuLi5wcm9wZXJ0aWVzT2YobG9va3VwKGlmYWNlKSwgbG9va3VwKSB9O1xuICAgIH1cbiAgfVxuICBpZiAoc3BlYy5pc0NsYXNzVHlwZSh0KSAmJiB0LmJhc2UpIHtcbiAgICByZXQgPSB7IC4uLnJldCwgLi4ucHJvcGVydGllc09mKGxvb2t1cCh0LmJhc2UpLCBsb29rdXApIH07XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb3Agb2YgdC5wcm9wZXJ0aWVzID8/IFtdKSB7XG4gICAgcmV0W3Byb3AubmFtZV0gPSBwcm9wO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgZ2l2ZW4gdHlwZSAoYnkgaXQncyBGUU4pIGNhbiBiZSBhc3NpZ25lZCB0byBhIG5hbWVkIHR5cGUgcmVmZXJlbmNlLlxuICpcbiAqIEBwYXJhbSBhY3R1YWxUeXBlRnFuIHRoZSBGUU4gb2YgdGhlIHR5cGUgdGhhdCBpcyBiZWluZyB0ZXN0ZWQuXG4gKiBAcGFyYW0gcmVxdWlyZWRUeXBlICB0aGUgcmVxdWlyZWQgcmVmZXJlbmNlIHR5cGUuXG4gKlxuICogQHJldHVybnMgdHJ1ZSBpZiBgYHJlcXVpcmVkVHlwZWBgIGlzIGEgc3VwZXItdHlwZSAoYmFzZSBjbGFzcyBvciBpbXBsZW1lbnRlZCBpbnRlcmZhY2UpIG9mIHRoZSB0eXBlIGRlc2lnbmF0ZWQgYnlcbiAqICAgICAgICAgIGBgYWN0dWFsVHlwZUZxbmBgLlxuICovXG5mdW5jdGlvbiBpc0Fzc2lnbmFibGUoXG4gIGFjdHVhbFR5cGVGcW46IHN0cmluZyxcbiAgcmVxdWlyZWRUeXBlOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSxcbiAgbG9va3VwOiBUeXBlTG9va3VwLFxuKTogYm9vbGVhbiB7XG4gIC8vIFRoZSBlbXB0eSBvYmplY3QgaXMgYXNzaWduYWJsZSB0byBldmVyeXRoaW5nXG4gIGlmIChhY3R1YWxUeXBlRnFuID09PSBFTVBUWV9PQkpFQ1RfRlFOKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAocmVxdWlyZWRUeXBlLmZxbiA9PT0gYWN0dWFsVHlwZUZxbikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IGFjdHVhbFR5cGUgPSBsb29rdXAoYWN0dWFsVHlwZUZxbik7XG4gIGlmIChzcGVjLmlzQ2xhc3NUeXBlKGFjdHVhbFR5cGUpKSB7XG4gICAgaWYgKFxuICAgICAgYWN0dWFsVHlwZS5iYXNlICYmXG4gICAgICBpc0Fzc2lnbmFibGUoYWN0dWFsVHlwZS5iYXNlLCByZXF1aXJlZFR5cGUsIGxvb2t1cClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAoc3BlYy5pc0NsYXNzT3JJbnRlcmZhY2VUeXBlKGFjdHVhbFR5cGUpICYmIGFjdHVhbFR5cGUuaW50ZXJmYWNlcykge1xuICAgIHJldHVybiAoXG4gICAgICBhY3R1YWxUeXBlLmludGVyZmFjZXMuZmluZCgoaWZhY2UpID0+XG4gICAgICAgIGlzQXNzaWduYWJsZShpZmFjZSwgcmVxdWlyZWRUeXBlLCBsb29rdXApLFxuICAgICAgKSAhPSBudWxsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUmVxdWlyZWRQcm9wcyhcbiAgYWN0dWFsUHJvcHM6IHsgW2tleTogc3RyaW5nXTogYW55IH0sXG4gIHR5cGVOYW1lOiBzdHJpbmcsXG4gIHNwZWNQcm9wczogeyBba2V5OiBzdHJpbmddOiBzcGVjLlByb3BlcnR5IH0sXG4pIHtcbiAgLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHByb3BlcnRpZXNcbiAgY29uc3QgbWlzc2luZ1JlcXVpcmVkUHJvcHMgPSBPYmplY3Qua2V5cyhzcGVjUHJvcHMpXG4gICAgLmZpbHRlcigobmFtZSkgPT4gIXNwZWNQcm9wc1tuYW1lXS5vcHRpb25hbClcbiAgICAuZmlsdGVyKChuYW1lKSA9PiAhKG5hbWUgaW4gYWN0dWFsUHJvcHMpKTtcblxuICBpZiAobWlzc2luZ1JlcXVpcmVkUHJvcHMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNaXNzaW5nIHJlcXVpcmVkIHByb3BlcnRpZXMgZm9yICR7dHlwZU5hbWV9OiAke21pc3NpbmdSZXF1aXJlZFByb3BzLmpvaW4oXG4gICAgICAgICcsICcsXG4gICAgICApfWAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBhY3R1YWxQcm9wcztcbn1cblxuZnVuY3Rpb24gY29tcGFyZVNlcmlhbGl6YXRpb25DbGFzc2VzKFxuICBsOiBTZXJpYWxpemF0aW9uQ2xhc3MsXG4gIHI6IFNlcmlhbGl6YXRpb25DbGFzcyxcbik6IG51bWJlciB7XG4gIGNvbnN0IG9yZGVyID0gW1xuICAgIFNlcmlhbGl6YXRpb25DbGFzcy5Wb2lkLFxuICAgIFNlcmlhbGl6YXRpb25DbGFzcy5EYXRlLFxuICAgIFNlcmlhbGl6YXRpb25DbGFzcy5TY2FsYXIsXG4gICAgU2VyaWFsaXphdGlvbkNsYXNzLkpzb24sXG4gICAgU2VyaWFsaXphdGlvbkNsYXNzLkVudW0sXG4gICAgU2VyaWFsaXphdGlvbkNsYXNzLkFycmF5LFxuICAgIFNlcmlhbGl6YXRpb25DbGFzcy5NYXAsXG4gICAgU2VyaWFsaXphdGlvbkNsYXNzLlN0cnVjdCxcbiAgICBTZXJpYWxpemF0aW9uQ2xhc3MuUmVmZXJlbmNlVHlwZSxcbiAgICBTZXJpYWxpemF0aW9uQ2xhc3MuQW55LFxuICBdO1xuICByZXR1cm4gb3JkZXIuaW5kZXhPZihsKSAtIG9yZGVyLmluZGV4T2Yocik7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGBvYmpgIG11c3QgYmUgcGFzc2VkIGJ5LXJlZmVyZW5jZSBvciBpZiBieS12YWx1ZSBpcyBhY2NlcHRhYmxlLiBGb3IgZXhhbXBsZSxcbiAqIG9iamVjdHMgd2l0aCBtZXRob2RzLCBvciBkeW5hbWljIGdldHRlcnMgKG9yIHNldHRlcnMpIHNob3VsZCBiZSBwYXNzZWQgYnktcmVmZXJlbmNlIGFzIGEgbWF0dGVyXG4gKiBvZiBzZWN1cml0eS4gVGhlIGJlaGF2aW9yIGluIG5vbi1KUyBydW50aW1lcyBjb3VsZCBvdGhlcndpc2UgZGlmZmVyIGZyb20gdGhhdCBpbiBwdXJlIEpTIChpZlxuICogZ2V0dGVycyBhcmUgbm90IHN0YWJsZSwgZXRjLi4uKS5cbiAqXG4gKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmUgdGVzdGVkLlxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgYG9iamAgbXVzdCBiZSBwYXNzZWQgYnktcmVmZXJlbmNlLlxuICovXG5mdW5jdGlvbiBpc0J5UmVmZXJlbmNlT25seShvYmo6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGN1cnIgPSBvYmo7XG4gIC8vIENyYXdsIHVwIHRoZSBwcm90b3R5cGUgY2hhaW4gdG8gbG9vayBmb3IgZHluYW1pYyBwcm9wZXJ0aWVzIG9yIG1ldGhvZHMuXG4gIGRvIHtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY3VycikpIHtcbiAgICAgIGNvbnN0IGRlc2NyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjdXJyLCBwcm9wKTtcbiAgICAgIGlmIChcbiAgICAgICAgZGVzY3I/LmdldCAhPSBudWxsIHx8XG4gICAgICAgIGRlc2NyPy5zZXQgIT0gbnVsbCB8fFxuICAgICAgICB0eXBlb2YgZGVzY3I/LnZhbHVlID09PSAnZnVuY3Rpb24nXG4gICAgICApIHtcbiAgICAgICAgLy8gUHJvcGVydHkgaGFzIGEgZHluYW1pYyBnZXR0ZXIsIHNldHRlciBvciBpcyBhIGNvbnN0cnVjdG9yL21ldGhvZCwgc28gYnktcmVmIHJlcXVpcmVkIVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRW5kIHdoZW4gdGhlIHBhcmVudCBwcm90byBpcyBgT2JqZWN0YCwgd2hpY2ggaGFzIG5vIHBhcmVudCBwcm90byBpdHNlbGYuXG4gIH0gd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZigoY3VyciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyKSkpICE9IG51bGwpO1xuXG4gIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==
711
+ //# sourceMappingURL=serialization.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsii/kernel",
3
- "version": "1.58.0",
3
+ "version": "1.60.1",
4
4
  "description": "kernel for jsii execution environment",
5
5
  "license": "Apache-2.0",
6
6
  "author": {
@@ -17,7 +17,7 @@
17
17
  "directory": "packages/@jsii/kernel"
18
18
  },
19
19
  "engines": {
20
- "node": ">= 12.7.0"
20
+ "node": ">= 14.5.0"
21
21
  },
22
22
  "main": "lib/index.js",
23
23
  "types": "lib/index.d.ts",
@@ -31,24 +31,17 @@
31
31
  "package": "package-js"
32
32
  },
33
33
  "dependencies": {
34
- "@jsii/spec": "^1.58.0",
35
- "fs-extra": "^9.1.0",
34
+ "@jsii/spec": "^1.60.1",
35
+ "fs-extra": "^10.1.0",
36
36
  "tar": "^6.1.11"
37
37
  },
38
38
  "devDependencies": {
39
- "@scope/jsii-calc-base": "^1.58.0",
40
- "@scope/jsii-calc-lib": "^1.58.0",
39
+ "@scope/jsii-calc-base": "^1.60.1",
40
+ "@scope/jsii-calc-lib": "^1.60.1",
41
41
  "@types/fs-extra": "^9.0.13",
42
- "@types/jest": "^27.4.1",
43
- "@types/node": "^12.20.48",
44
42
  "@types/tar": "^6.1.1",
45
- "eslint": "^8.13.0",
46
- "jest": "^27.5.1",
47
43
  "jest-expect-message": "^1.0.2",
48
- "jsii-build-tools": "^1.58.0",
49
- "jsii-calc": "^3.20.120",
50
- "prettier": "^2.6.2",
51
- "ts-jest": "^27.1.4",
52
- "typescript": "~3.9.10"
44
+ "jsii-build-tools": "^1.60.1",
45
+ "jsii-calc": "^3.20.120"
53
46
  }
54
47
  }
@@ -1 +0,0 @@
1
- export declare function deepEqualWithRegex(lvalue: any, rvalue: any): boolean;