semantifold 0.13.0 → 0.14.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.
Files changed (59) hide show
  1. package/README.md +1 -0
  2. package/build/src/backends/effects.js +3 -1
  3. package/build/src/backends/php.d.ts.map +1 -1
  4. package/build/src/backends/php.js +56 -3
  5. package/build/src/backends/scalars.js +2 -2
  6. package/build/src/backends/shared.d.ts +2 -1
  7. package/build/src/backends/shared.d.ts.map +1 -1
  8. package/build/src/backends/shared.js +209 -7
  9. package/build/src/backends/writer.d.ts +18 -4
  10. package/build/src/backends/writer.d.ts.map +1 -1
  11. package/build/src/backends/writer.js +40 -4
  12. package/build/src/frontends/java.d.ts +1 -1
  13. package/build/src/frontends/java.d.ts.map +1 -1
  14. package/build/src/frontends/java.js +14 -11
  15. package/build/src/frontends/javascript-typescript.d.ts +1 -1
  16. package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
  17. package/build/src/frontends/javascript-typescript.js +17 -17
  18. package/build/src/frontends/php.d.ts +5 -1
  19. package/build/src/frontends/php.d.ts.map +1 -1
  20. package/build/src/frontends/php.js +159 -31
  21. package/build/src/frontends/ruby.d.ts +1 -1
  22. package/build/src/frontends/ruby.d.ts.map +1 -1
  23. package/build/src/frontends/ruby.js +12 -9
  24. package/build/src/frontends/types.d.ts +9 -2
  25. package/build/src/frontends/types.d.ts.map +1 -1
  26. package/build/src/frontends/types.js +26 -9
  27. package/build/src/language-registry.d.ts.map +1 -1
  28. package/build/src/language-registry.js +14 -6
  29. package/build/src/mapping.d.ts.map +1 -1
  30. package/build/src/mapping.js +4 -2
  31. package/build/src/semantic/effects.d.ts.map +1 -1
  32. package/build/src/semantic/effects.js +3 -1
  33. package/build/src/semantic/provenance.d.ts.map +1 -1
  34. package/build/src/semantic/provenance.js +37 -4
  35. package/build/src/semantic/types.d.ts +140 -9
  36. package/build/src/semantic/types.d.ts.map +1 -1
  37. package/build/src/semantic/types.js +37 -6
  38. package/build/src/semantic/validate.d.ts +31 -2
  39. package/build/src/semantic/validate.d.ts.map +1 -1
  40. package/build/src/semantic/validate.js +346 -27
  41. package/docs/adr-bounded-subtyping.md +180 -0
  42. package/docs/language-support.md +1 -1
  43. package/package.json +1 -1
  44. package/src/backends/effects.js +1 -0
  45. package/src/backends/php.js +56 -2
  46. package/src/backends/scalars.js +1 -1
  47. package/src/backends/shared.js +210 -6
  48. package/src/backends/writer.js +41 -3
  49. package/src/frontends/java.js +13 -10
  50. package/src/frontends/javascript-typescript.js +16 -16
  51. package/src/frontends/php.js +175 -31
  52. package/src/frontends/ruby.js +11 -8
  53. package/src/frontends/types.js +26 -8
  54. package/src/language-registry.js +13 -5
  55. package/src/mapping.js +3 -1
  56. package/src/semantic/effects.js +1 -0
  57. package/src/semantic/provenance.js +34 -3
  58. package/src/semantic/types.js +39 -5
  59. package/src/semantic/validate.js +377 -26
@@ -11,7 +11,7 @@ import { hasExactEffectSupport } from "../backends/effects.js";
11
11
  import { hasOnlyUnicodeScalars, scalarType } from "../semantic/scalars.js";
12
12
  import { typeContainsAnyVariable } from "../semantic/generics.js";
13
13
  import { requireSourceReturnType, requireSourceScalarType, sourceScalarType } from "./scalars.js";
14
- import { capabilityFunctionSignatures, documentedValueType, instantiatedRecordFieldType, iterationBindingType, iterationOperandType, knownCallParameterTypes, knownCallReturnType, optionalType, orderedMapTypeFromMap, ownedResourceType, preservesGenericOptionalEvidence, recordType, referenceType, sameValueType } from "./types.js";
14
+ import { capabilityFunctionSignatures, documentedValueType, instantiatedRecordFieldType, interfaceType, iterationBindingType, iterationOperandType, knownCallParameterTypes, knownCallReturnType, optionalType, orderedMapTypeFromMap, ownedResourceType, preservesGenericOptionalEvidence, recordType, referenceType, sameValueType } from "./types.js";
15
15
  const parser = new PhpParser.Engine({
16
16
  ast: { withPositions: true },
17
17
  parser: { extractDoc: true, suppressErrors: false }
@@ -41,11 +41,12 @@ const phpBinaryOperations = new Map([
41
41
  * @property {Map<string, import("../semantic/types.js").CatchBinding>} [catchBindingNodes] - Exact catch binding nodes by visible name.
42
42
  * @property {Map<string, import("../semantic/types.js").ClassDeclaration>} classes - Reference classes by identity.
43
43
  * @property {import("../semantic/types.js").ClassDeclaration} [currentClass] - Enclosing reference class.
44
+ * @property {Map<string, import("../semantic/types.js").InterfaceDeclaration>} interfaces - Interface declarations by identity.
44
45
  * @property {Map<string, import("../semantic/types.js").ErrorDeclaration>} errorNames - Error declarations by source name.
45
46
  * @property {Map<string, import("../semantic/types.js").ErrorDeclaration>} errors - Error declarations by identity.
46
47
  * @property {Map<string, PhpFunctionSignature>} functions - Explicit module function signatures.
47
48
  * @property {Set<object>} [orderedMapDeclarations] - Exact local declarations selected by parser-owned pair iteration.
48
- * @property {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} recordNames - Nominal declarations by source name.
49
+ * @property {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} recordNames - Nominal declarations by source name.
49
50
  * @property {Map<string, import("../semantic/types.js").RecordDeclaration>} records - Record declarations by identity.
50
51
  * @property {import("../semantic/types.js").SemanticFunctionReturnType | undefined} returnType - Enclosing return type.
51
52
  * @property {Map<string, import("../semantic/types.js").TypeParameter>} [typeParameters] - Declaration-scoped parameters.
@@ -286,6 +287,9 @@ function convertExpression(node, filename, source, context, expectedType, preser
286
287
  const declaration = context.recordNames.get(name.name);
287
288
  if (!declaration)
288
289
  return unsupportedSyntax("php", "construction of an unknown nominal class", nodeLocation(construction.what, filename, source));
290
+ if (declaration.kind == "InterfaceDeclaration") {
291
+ return unsupportedSyntax("php", "construction of an interface", nodeLocation(construction.what, filename, source));
292
+ }
289
293
  if (declaration.kind == "ClassDeclaration") {
290
294
  const unsupportedArgument = construction.arguments.find((argument) => argument.kind == "namedargument" || argument.kind == "variadic" || Reflect.get(argument, "byref") === true);
291
295
  if (unsupportedArgument)
@@ -332,6 +336,9 @@ function convertExpression(node, filename, source, context, expectedType, preser
332
336
  if (receiverType?.kind == "ReferenceType") {
333
337
  return unsupportedSyntax("php", "private reference-class field access", location);
334
338
  }
339
+ if (receiverType?.kind == "InterfaceType") {
340
+ return unsupportedSyntax("php", "interface receiver member access", location);
341
+ }
335
342
  const receiverRecord = receiverType?.kind == "OptionalType" ? receiverType.valueType : receiverType;
336
343
  const declaration = receiverRecord?.kind == "RecordType" ? context.records.get(receiverRecord.declarationId) : undefined;
337
344
  if ((declaration?.typeParameters?.length ?? 0) > 0) {
@@ -443,8 +450,10 @@ function convertExpression(node, filename, source, context, expectedType, preser
443
450
  const lookup = /** @type {import("php-parser").PropertyLookup} */ ( /** @type {unknown} */(call.what));
444
451
  const member = lookup.offset.kind == "identifier" ? /** @type {import("php-parser").Identifier} */ (lookup.offset) : undefined;
445
452
  const receiverType = knownExpressionType(lookup.what, context);
446
- if (member && typeof member.name == "string" && receiverType?.kind == "ReferenceType") {
447
- const method = context.classes.get(receiverType.declarationId)?.methods.find((candidate) => candidate.name == member.name);
453
+ if (member && typeof member.name == "string" && (receiverType?.kind == "ReferenceType" || receiverType?.kind == "InterfaceType")) {
454
+ const method = receiverType.kind == "ReferenceType"
455
+ ? context.classes.get(receiverType.declarationId)?.methods.find((candidate) => candidate.name == member.name)
456
+ : context.interfaces.get(receiverType.declarationId)?.methods.find((candidate) => candidate.name == member.name);
448
457
  const unsupportedArgument = call.arguments.find((argument) => argument.kind == "namedargument" || argument.kind == "variadic" || Reflect.get(argument, "byref") === true);
449
458
  if (unsupportedArgument)
450
459
  return unsupportedSyntax("php", "non-positional method argument", nodeLocation(unsupportedArgument, filename, source));
@@ -543,6 +552,9 @@ function knownExpressionType(node, context) {
543
552
  if (receiver?.kind == "ReferenceType" && member && typeof member.name == "string") {
544
553
  return context.classes.get(receiver.declarationId)?.methods.find((method) => method.name == member.name)?.returnType;
545
554
  }
555
+ if (receiver?.kind == "InterfaceType" && member && typeof member.name == "string") {
556
+ return context.interfaces.get(receiver.declarationId)?.methods.find((method) => method.name == member.name)?.returnType;
557
+ }
546
558
  }
547
559
  }
548
560
  if (node.kind == "offsetlookup") {
@@ -560,7 +572,9 @@ function knownExpressionType(node, context) {
560
572
  if (declaration?.id)
561
573
  return declaration.kind == "ClassDeclaration"
562
574
  ? { declarationId: declaration.id, kind: "ReferenceType" }
563
- : { declarationId: declaration.id, kind: "RecordType" };
575
+ : declaration.kind == "InterfaceDeclaration"
576
+ ? { declarationId: declaration.id, kind: "InterfaceType" }
577
+ : { declarationId: declaration.id, kind: "RecordType" };
564
578
  }
565
579
  if (node.kind == "propertylookup") {
566
580
  const read = /** @type {import("php-parser").PropertyLookup} */ (node);
@@ -654,7 +668,7 @@ function convertReturn(node, filename, source, context) {
654
668
  * @param {string} name - Local name.
655
669
  * @param {string} filename - Source filename.
656
670
  * @param {string} source - Complete source.
657
- * @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} recordNames - Nominal declarations by source name.
671
+ * @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} recordNames - Nominal declarations by source name.
658
672
  * @param {Map<string, import("../semantic/types.js").TypeParameter>} [typeParameters] - Declaration-scoped parameters.
659
673
  * @returns {{immutable: boolean, type: import("../semantic/types.js").SemanticValueType} | undefined} Metadata when present.
660
674
  */
@@ -757,7 +771,7 @@ function convertLocalStatement(node, filename, source, context) {
757
771
  }
758
772
  const inferredType = knownExpressionType(assignment.right, context);
759
773
  if (inferredType?.kind == "RecordType" || inferredType?.kind == "ReferenceType" ||
760
- inferredType?.kind == "OwnedResourceType") {
774
+ inferredType?.kind == "InterfaceType" || inferredType?.kind == "OwnedResourceType") {
761
775
  const initializer = convertExpression(assignment.right, filename, source, context, inferredType);
762
776
  context.bindings.set(variable.name, inferredType);
763
777
  return withParserRanges({
@@ -1056,7 +1070,7 @@ function convertBlock(node, filename, source, context) {
1056
1070
  * @param {import("../semantic/types.js").SourceLocation} location - Source location.
1057
1071
  * @param {string} filename - Source filename.
1058
1072
  * @param {string} source - Complete source.
1059
- * @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} [recordNames] - Nominal declarations by source name.
1073
+ * @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} [recordNames] - Nominal declarations by source name.
1060
1074
  * @returns {import("../semantic/types.js").SemanticValueType} Semantic type.
1061
1075
  */
1062
1076
  function convertType(sourceType, subject, location, filename, source, recordNames = new Map()) {
@@ -1071,9 +1085,11 @@ function convertType(sourceType, subject, location, filename, source, recordName
1071
1085
  if (declaration?.id)
1072
1086
  return declaration.kind == "ClassDeclaration"
1073
1087
  ? referenceType(declaration.id, typeLocation)
1074
- : declaration.kind == "EffectResourceDeclaration"
1075
- ? ownedResourceType(declaration.id, typeLocation)
1076
- : recordType(declaration.id, typeLocation);
1088
+ : declaration.kind == "InterfaceDeclaration"
1089
+ ? interfaceType(declaration.id, typeLocation)
1090
+ : declaration.kind == "EffectResourceDeclaration"
1091
+ ? ownedResourceType(declaration.id, typeLocation)
1092
+ : recordType(declaration.id, typeLocation);
1077
1093
  return requireSourceScalarType("php", typeName, subject, location, typeLocation);
1078
1094
  }
1079
1095
  /**
@@ -1175,7 +1191,7 @@ function nullableType(valueType, sourceType, ownerStart, filename, source) {
1175
1191
  * @param {import("../semantic/types.js").SourceLocation} location - Function location.
1176
1192
  * @param {string} filename - Source filename.
1177
1193
  * @param {string} source - Complete source.
1178
- * @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} [recordNames] - Nominal declarations by source name.
1194
+ * @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} [recordNames] - Nominal declarations by source name.
1179
1195
  * @returns {import("../semantic/types.js").SemanticFunctionReturnType} Semantic return type.
1180
1196
  */
1181
1197
  function convertReturnType(sourceType, subject, location, filename, source, recordNames = new Map()) {
@@ -1189,9 +1205,11 @@ function convertReturnType(sourceType, subject, location, filename, source, reco
1189
1205
  if (declaration?.id)
1190
1206
  return declaration.kind == "ClassDeclaration"
1191
1207
  ? referenceType(declaration.id, nodeLocation(sourceType, filename, source))
1192
- : declaration.kind == "EffectResourceDeclaration"
1193
- ? ownedResourceType(declaration.id, nodeLocation(sourceType, filename, source))
1194
- : recordType(declaration.id, nodeLocation(sourceType, filename, source));
1208
+ : declaration.kind == "InterfaceDeclaration"
1209
+ ? interfaceType(declaration.id, nodeLocation(sourceType, filename, source))
1210
+ : declaration.kind == "EffectResourceDeclaration"
1211
+ ? ownedResourceType(declaration.id, nodeLocation(sourceType, filename, source))
1212
+ : recordType(declaration.id, nodeLocation(sourceType, filename, source));
1195
1213
  return requireSourceReturnType("php", typeName, subject, location, nodeLocation(sourceType, filename, source));
1196
1214
  }
1197
1215
  /**
@@ -1199,7 +1217,7 @@ function convertReturnType(sourceType, subject, location, filename, source, reco
1199
1217
  * @param {import("php-parser").Function} node - PHP function node.
1200
1218
  * @param {string} filename - Source filename.
1201
1219
  * @param {string} source - Complete source.
1202
- * @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} recordNames - Nominal declarations by source name.
1220
+ * @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} recordNames - Nominal declarations by source name.
1203
1221
  * @param {string} ownerId - Stable function identity.
1204
1222
  * @returns {PhpFunctionSignature} Typed function signature.
1205
1223
  */
@@ -1294,7 +1312,7 @@ function convertFunctionSignature(node, filename, source, recordNames, ownerId)
1294
1312
  * @param {string | undefined} nativeType - Native PHP type name.
1295
1313
  * @param {boolean} nativeNullable - Whether the native carrier has PHP's nullable marker.
1296
1314
  * @param {import("../semantic/types.js").SemanticValueType} documentedType - Exact semantic document type.
1297
- * @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} records - Visible nominal declarations by name.
1315
+ * @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} records - Visible nominal declarations by name.
1298
1316
  * @returns {boolean} Whether the native carrier agrees without changing meaning.
1299
1317
  */
1300
1318
  function phpDocumentedNativeTypeMatches(nativeType, nativeNullable, documentedType, records) {
@@ -1320,6 +1338,9 @@ function phpDocumentedNativeTypeMatches(nativeType, nativeNullable, documentedTy
1320
1338
  if (documentedType.kind == "ReferenceType") {
1321
1339
  return nativeType !== undefined && records.get(nativeType)?.id == documentedType.declarationId;
1322
1340
  }
1341
+ if (documentedType.kind == "InterfaceType") {
1342
+ return nativeType !== undefined && records.get(nativeType)?.id == documentedType.declarationId;
1343
+ }
1323
1344
  return false;
1324
1345
  }
1325
1346
  /**
@@ -1327,16 +1348,17 @@ function phpDocumentedNativeTypeMatches(nativeType, nativeNullable, documentedTy
1327
1348
  * @param {import("php-parser").Function} node - PHP function node.
1328
1349
  * @param {PhpFunctionSignature} signature - Preconverted explicit signature.
1329
1350
  * @param {Map<string, PhpFunctionSignature>} functions - Module function signatures.
1330
- * @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} recordNames - Nominal declarations by source name.
1351
+ * @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} recordNames - Nominal declarations by source name.
1331
1352
  * @param {Map<string, import("../semantic/types.js").RecordDeclaration>} records - Record declarations by identity.
1332
1353
  * @param {Map<string, import("../semantic/types.js").ClassDeclaration>} classes - Reference classes by identity.
1354
+ * @param {Map<string, import("../semantic/types.js").InterfaceDeclaration>} interfaces - Interface declarations by identity.
1333
1355
  * @param {Map<string, import("../semantic/types.js").ErrorDeclaration>} errorNames - Error declarations by source name.
1334
1356
  * @param {Map<string, import("../semantic/types.js").ErrorDeclaration>} errors - Error declarations by identity.
1335
1357
  * @param {string} filename - Source filename.
1336
1358
  * @param {string} source - Complete source.
1337
1359
  * @returns {import("../semantic/types.js").FunctionDeclaration} Semantic function.
1338
1360
  */
1339
- function convertFunction(node, signature, functions, recordNames, records, classes, errorNames, errors, filename, source) {
1361
+ function convertFunction(node, signature, functions, recordNames, records, classes, interfaces, errorNames, errors, filename, source) {
1340
1362
  if (!node.body)
1341
1363
  return unsupportedSyntax("php", "function body", signature.location);
1342
1364
  const context = {
@@ -1352,7 +1374,7 @@ function convertFunction(node, signature, functions, recordNames, records, class
1352
1374
  typeParameters: new Map((signature.typeParameters ?? []).map((parameter) => [parameter.name, parameter]))
1353
1375
  };
1354
1376
  return withParserRanges({
1355
- body: convertBlock(node.body, filename, source, context),
1377
+ body: convertBlock(node.body, filename, source, { ...context, interfaces }),
1356
1378
  kind: "FunctionDeclaration",
1357
1379
  location: signature.location,
1358
1380
  name: signature.name,
@@ -1447,7 +1469,7 @@ function convertPhpError(node, declaration, filename, source) {
1447
1469
  /**
1448
1470
  * Reads one exact public PHP constructor or instance-method signature.
1449
1471
  * @param {import("php-parser").Method} node - Parser-owned method.
1450
- * @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} nominalNames - Visible nominal declarations.
1472
+ * @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} nominalNames - Visible nominal declarations.
1451
1473
  * @param {string} ownerId - Stable callable identity.
1452
1474
  * @param {boolean} constructor - Whether this is the sole constructor.
1453
1475
  * @param {string} filename - Source filename.
@@ -1529,13 +1551,93 @@ function convertPhpClassCallableSignature(node, nominalNames, ownerId, construct
1529
1551
  }
1530
1552
  return { location, name, nameLocation: nodeLocation(nameNode, filename, source), parameters, returnType };
1531
1553
  }
1554
+ /**
1555
+ * Converts the signature-only PHP interface profile.
1556
+ * @param {import("php-parser").Class} node - Parser interface.
1557
+ * @param {import("../semantic/types.js").InterfaceDeclaration} declaration - Predeclared interface identity.
1558
+ * @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} nominalNames - Visible nominal declarations.
1559
+ * @param {string} filename - Source filename.
1560
+ * @param {string} source - Complete source.
1561
+ * @returns {import("../semantic/types.js").InterfaceDeclaration} Semantic interface.
1562
+ */
1563
+ function convertPhpInterface(node, declaration, nominalNames, filename, source) {
1564
+ const location = nodeLocation(node, filename, source);
1565
+ const parents = /** @type {readonly import("php-parser").Name[]} */ ( /** @type {unknown} */(node.extends ?? []));
1566
+ if (node.isAnonymous || node.attrGroups.length)
1567
+ return unsupportedSyntax("php", "malformed interface declaration", location);
1568
+ const parentReferences = parents.map((parent) => {
1569
+ if (parent.kind != "name" || parent.resolution != "uqn" || typeof parent.name != "string") {
1570
+ return unsupportedSyntax("php", "qualified or dynamic interface parent", nodeLocation(parent, filename, source));
1571
+ }
1572
+ const parentDeclaration = nominalNames.get(parent.name);
1573
+ if (!parentDeclaration?.id || parentDeclaration.kind != "InterfaceDeclaration") {
1574
+ return unsupportedSyntax("php", `interface parent '${parent.name}' is not a declared interface`, nodeLocation(parent, filename, source));
1575
+ }
1576
+ return interfaceType(/** @type {string} */ (parentDeclaration.id), nodeLocation(parent, filename, source));
1577
+ });
1578
+ const methodNodes = /** @type {import("php-parser").Method[]} */ (node.body.filter((member) => member.kind == "method"));
1579
+ if (methodNodes.length != node.body.length) {
1580
+ return unsupportedSyntax("php", "interface member outside one signature-only public method", nodeLocation(node.body.find((member) => member.kind != "method") ?? node, filename, source));
1581
+ }
1582
+ declaration.methods = methodNodes.map((method, index) => convertPhpInterfaceMethodSignature(method, nominalNames, `${declaration.id}:method:${index}`, filename, source));
1583
+ const nameNode = typeof node.name == "string" ? node : node.name;
1584
+ return withParserRanges({
1585
+ ...declaration,
1586
+ ...(parentReferences.length > 0 ? { extends: parentReferences } : {})
1587
+ }, { name: nodeLocation(nameNode, filename, source) });
1588
+ }
1589
+ /**
1590
+ * Reads one exact signature-only PHP interface method.
1591
+ * @param {import("php-parser").Method} node - Parser interface method.
1592
+ * @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} nominalNames - Visible nominal declarations.
1593
+ * @param {string} ownerId - Stable interface method identity.
1594
+ * @param {string} filename - Source filename.
1595
+ * @param {string} source - Complete source.
1596
+ * @returns {import("../semantic/types.js").InterfaceMethodDeclaration} Semantic interface method.
1597
+ */
1598
+ function convertPhpInterfaceMethodSignature(node, nominalNames, ownerId, filename, source) {
1599
+ const location = nodeLocation(node, filename, source);
1600
+ const name = typeof node.name == "string" ? node.name : node.name.name;
1601
+ if (node.visibility != "public" || node.isStatic || node.isAbstract || node.isFinal || Reflect.get(node, "isReadonly") ||
1602
+ node.byref || node.nullable || node.attrGroups.length || node.body !== null) {
1603
+ return unsupportedSyntax("php", "interface method outside one public signature-only declaration", location);
1604
+ }
1605
+ const documented = functionDocumentedTypes(/** @type {import("php-parser").Function} */ ( /** @type {unknown} */(node)), filename, source, ownerId);
1606
+ if (documented.parameters.size > 0 || documented.returnType || documented.typeParameters?.length) {
1607
+ return unsupportedSyntax("php", "documented interface method type annotation", location);
1608
+ }
1609
+ if (!node.type)
1610
+ return missingType("php", `Interface method '${name}' return`, location);
1611
+ const parameters = node.arguments.map((parameter) => {
1612
+ const parameterLocation = nodeLocation(parameter, filename, source);
1613
+ const parameterName = typeof parameter.name == "string" ? parameter.name : parameter.name.name;
1614
+ if (parameter.byref || parameter.variadic || parameter.value || parameter.flags || parameter.readonly || parameter.nullable ||
1615
+ parameter.hooks.length || parameter.attrGroups.length) {
1616
+ return unsupportedSyntax("php", "noncanonical interface method parameter", parameterLocation);
1617
+ }
1618
+ if (!parameter.type)
1619
+ return missingType("php", `Parameter '${parameterName}'`, parameterLocation);
1620
+ const type = convertType(parameter.type, `Parameter '${parameterName}'`, parameterLocation, filename, source, nominalNames);
1621
+ if (type.kind == "OptionalType")
1622
+ return unsupportedSyntax("php", "optional interface method parameter", parameterLocation);
1623
+ const nameNode = typeof parameter.name == "string" ? parameter : parameter.name;
1624
+ return withParserRanges({ kind: /** @type {const} */ ("Parameter"), location: parameterLocation,
1625
+ name: parameterName, type }, { name: nodeLocation(nameNode, filename, source) });
1626
+ });
1627
+ const returnType = convertReturnType(node.type, `Interface method '${name}' return`, location, filename, source, nominalNames);
1628
+ if (returnType.kind == "OptionalType")
1629
+ return unsupportedSyntax("php", "optional interface method return", location);
1630
+ const nameNode = typeof node.name == "string" ? node : node.name;
1631
+ return withParserRanges({ kind: /** @type {const} */ ("InterfaceMethodDeclaration"), location, name, parameters, returnType }, { name: nodeLocation(nameNode, filename, source) });
1632
+ }
1532
1633
  /**
1533
1634
  * Converts the bounded final/private-field PHP reference-class profile.
1534
1635
  * @param {import("php-parser").Class} node - Parser class.
1535
1636
  * @param {import("../semantic/types.js").ClassDeclaration} declaration - Predeclared class identity.
1536
- * @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} nominalNames - Visible nominal declarations.
1637
+ * @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} nominalNames - Visible nominal declarations.
1537
1638
  * @param {Map<string, import("../semantic/types.js").RecordDeclaration>} records - Records by identity.
1538
1639
  * @param {Map<string, import("../semantic/types.js").ClassDeclaration>} classes - Classes by identity.
1640
+ * @param {Map<string, import("../semantic/types.js").InterfaceDeclaration>} interfaces - Interfaces by identity.
1539
1641
  * @param {Map<string, PhpFunctionSignature>} functions - Top-level signatures.
1540
1642
  * @param {Map<string, import("../semantic/types.js").ErrorDeclaration>} errorNames - Errors by name.
1541
1643
  * @param {Map<string, import("../semantic/types.js").ErrorDeclaration>} errors - Errors by identity.
@@ -1543,11 +1645,23 @@ function convertPhpClassCallableSignature(node, nominalNames, ownerId, construct
1543
1645
  * @param {string} source - Complete source.
1544
1646
  * @returns {import("../semantic/types.js").ClassDeclaration} Semantic class.
1545
1647
  */
1546
- function convertPhpReferenceClass(node, declaration, nominalNames, records, classes, functions, errorNames, errors, filename, source) {
1648
+ function convertPhpReferenceClass(node, declaration, nominalNames, records, classes, interfaces, functions, errorNames, errors, filename, source) {
1547
1649
  const location = nodeLocation(node, filename, source);
1548
- if (node.isAnonymous || !node.isFinal || node.isReadonly || node.isAbstract || node.extends || node.implements?.length ||
1549
- node.attrGroups.length)
1650
+ if (node.isAnonymous || !node.isFinal || node.isReadonly || node.isAbstract || node.extends || node.attrGroups.length) {
1550
1651
  return unsupportedSyntax("php", "reference class inheritance or noncanonical modifier", location);
1652
+ }
1653
+ const implementedReferences = /** @type {readonly import("php-parser").Name[]} */ ( /** @type {unknown} */(node.implements ?? []))
1654
+ .map((implemented) => {
1655
+ const implementedLocation = nodeLocation(implemented, filename, source);
1656
+ if (implemented.kind != "name" || implemented.resolution != "uqn" || typeof implemented.name != "string") {
1657
+ return unsupportedSyntax("php", "qualified or dynamic interface implementation", implementedLocation);
1658
+ }
1659
+ const implementedDeclaration = nominalNames.get(implemented.name);
1660
+ if (!implementedDeclaration?.id || implementedDeclaration.kind != "InterfaceDeclaration") {
1661
+ return unsupportedSyntax("php", `implemented interface '${implemented.name}' is not a declared interface`, implementedLocation);
1662
+ }
1663
+ return interfaceType(/** @type {string} */ (implementedDeclaration.id), implementedLocation);
1664
+ });
1551
1665
  const fieldStatements = node.body.filter((member) => member.kind == "propertystatement");
1552
1666
  const methodNodes = /** @type {import("php-parser").Method[]} */ (node.body.filter((member) => member.kind == "method"));
1553
1667
  const constructors = methodNodes.filter((method) => (typeof method.name == "string" ? method.name : method.name.name) == "__construct");
@@ -1582,8 +1696,10 @@ function convertPhpReferenceClass(node, declaration, nominalNames, records, clas
1582
1696
  parameters: signature.parameters,
1583
1697
  returnType: /** @type {import("../semantic/types.js").SemanticFunctionReturnType} */ (signature.returnType)
1584
1698
  }, { name: signature.nameLocation }));
1699
+ if (implementedReferences.length > 0)
1700
+ declaration.implements = implementedReferences;
1585
1701
  const base = { bindings: new Map(), classes, currentClass: declaration, errorNames, errors, functions,
1586
- recordNames: nominalNames, records };
1702
+ interfaces, recordNames: nominalNames, records };
1587
1703
  declaration.constructor.body = convertBlock(/** @type {import("php-parser").Block} */ (constructorNode.body), filename, source, { ...base, bindings: new Map(declaration.constructor.parameters.map((parameter) => [parameter.name, parameter.type])),
1588
1704
  returnType: { kind: /** @type {const} */ ("TypeReference"), name: /** @type {const} */ ("void") } });
1589
1705
  for (let index = 0; index < ordinaryMethods.length; index += 1) {
@@ -1808,6 +1924,7 @@ export function parsePhp({ capabilities = [], filename, source, program: program
1808
1924
  const namespace = /** @type {import("php-parser").Namespace} */ (body.find((node) => node.kind == "namespace"));
1809
1925
  body = namespace.children.filter((node) => node.kind != "usegroup" && !isPhpRequireOnce(node));
1810
1926
  }
1927
+ const interfaceNodes = /** @type {import("php-parser").Class[]} */ (body.filter((node) => node.kind == "interface"));
1811
1928
  const classNodes = /** @type {import("php-parser").Class[]} */ (body.filter((node) => node.kind == "class"));
1812
1929
  const errorNodes = classNodes.filter((node) => node.extends?.kind == "name" &&
1813
1930
  ["RuntimeException", "\\RuntimeException"].includes(node.extends.name));
@@ -1838,7 +1955,12 @@ export function parsePhp({ capabilities = [], filename, source, program: program
1838
1955
  location: nodeLocation(node, filename, source), methods: [],
1839
1956
  name: typeof node.name == "string" ? node.name : node.name.name
1840
1957
  }));
1841
- const recordNames = /** @type {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} */ (new Map(programContext?.records ?? []));
1958
+ const interfaceDeclarations = interfaceNodes.map((node, index) => ({
1959
+ id: `interface:${index}`, kind: /** @type {const} */ ("InterfaceDeclaration"),
1960
+ location: nodeLocation(node, filename, source), methods: [],
1961
+ name: typeof node.name == "string" ? node.name : node.name.name
1962
+ }));
1963
+ const recordNames = /** @type {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} */ (new Map(programContext?.records ?? []));
1842
1964
  for (const resource of capabilities.flatMap(({ resources }) => resources))
1843
1965
  recordNames.set(resource.name, resource);
1844
1966
  const errorNames = new Map(programContext?.errors ?? []);
@@ -1853,10 +1975,13 @@ export function parsePhp({ capabilities = [], filename, source, program: program
1853
1975
  recordNames.set(declaration.name, declaration);
1854
1976
  for (const declaration of classDeclarations)
1855
1977
  recordNames.set(declaration.name, declaration);
1978
+ for (const declaration of interfaceDeclarations)
1979
+ recordNames.set(declaration.name, declaration);
1856
1980
  const recordsById = new Map([...recordNames.values()]
1857
1981
  .filter((declaration) => declaration.kind == "RecordDeclaration")
1858
1982
  .map((declaration) => [/** @type {string} */ (declaration.id), declaration]));
1859
1983
  const classesById = new Map(classDeclarations.map((declaration) => [/** @type {string} */ (declaration.id), declaration]));
1984
+ const interfacesById = new Map(interfaceDeclarations.map((declaration) => [/** @type {string} */ (declaration.id), declaration]));
1860
1985
  const records = recordNodes.map((node, index) => convertPhpRecord(node, recordDeclarations[index],
1861
1986
  /** @type {Map<string, import("../semantic/types.js").RecordDeclaration>} */ ( /** @type {unknown} */(recordNames)), filename, source));
1862
1987
  const functionNodes = /** @type {import("php-parser").Function[]} */ (body.filter((node) => node.kind == "function"));
@@ -1872,9 +1997,10 @@ export function parsePhp({ capabilities = [], filename, source, program: program
1872
1997
  }]));
1873
1998
  for (const signature of signatures)
1874
1999
  functionSignatures.set(signature.name, signature);
1875
- const classes = referenceClassNodes.map((node, index) => convertPhpReferenceClass(node, classDeclarations[index], recordNames, recordsById, classesById, functionSignatures, errorNames, errorsById, filename, source));
1876
- const functions = functionNodes.map((node, index) => convertFunction(node, signatures[index], functionSignatures, recordNames, recordsById, classesById, errorNames, errorsById, filename, source));
1877
- const executableNodes = body.filter((node) => !["class", "function", "declare", "noop"].includes(node.kind));
2000
+ const interfaces = interfaceNodes.map((node, index) => convertPhpInterface(node, interfaceDeclarations[index], recordNames, filename, source));
2001
+ const classes = referenceClassNodes.map((node, index) => convertPhpReferenceClass(node, classDeclarations[index], recordNames, recordsById, classesById, interfacesById, functionSignatures, errorNames, errorsById, filename, source));
2002
+ const functions = functionNodes.map((node, index) => convertFunction(node, signatures[index], functionSignatures, recordNames, recordsById, classesById, interfacesById, errorNames, errorsById, filename, source));
2003
+ const executableNodes = body.filter((node) => !["class", "function", "interface", "declare", "noop"].includes(node.kind));
1878
2004
  const location = moduleLocation(filename, source);
1879
2005
  if (programContext && !programContext.isEntry && executableNodes.length > 0) {
1880
2006
  return unsupportedSyntax("php", "top-level side effect outside the selected entry module", nodeLocation(executableNodes[0], filename, source));
@@ -1890,6 +2016,7 @@ export function parsePhp({ capabilities = [], filename, source, program: program
1890
2016
  errorNames,
1891
2017
  errors: errorsById,
1892
2018
  functions: functionSignatures,
2019
+ interfaces: interfacesById,
1893
2020
  orderedMapDeclarations: orderedMapDeclarationsForPhp(executableNodes),
1894
2021
  recordNames,
1895
2022
  records: recordsById,
@@ -1914,6 +2041,7 @@ export function parsePhp({ capabilities = [], filename, source, program: program
1914
2041
  location,
1915
2042
  ...(errors.length > 0 ? { errors } : {}),
1916
2043
  ...(classes.length > 0 ? { classes } : {}),
2044
+ ...(interfaces.length > 0 ? { interfaces } : {}),
1917
2045
  ...(records.length > 0 ? { records } : {})
1918
2046
  };
1919
2047
  }
@@ -2117,4 +2245,4 @@ function phpParserFailureLocation(error, filename, source) {
2117
2245
  const offset = Math.min(lineStart + column, boundedEnd);
2118
2246
  return locationFromOffsets(filename, source, offset, Math.min(offset + 1, source.length));
2119
2247
  }
2120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Zyb250ZW5kcy9waHAuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQTtBQUNsQyxPQUFPLEVBQUMsS0FBSyxJQUFJLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFBO0FBQ3BELE9BQU8sRUFBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDN0UsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDcEUsT0FBTyxFQUFDLG1CQUFtQixFQUFFLGNBQWMsRUFBQyxNQUFNLHlCQUF5QixDQUFBO0FBQzNFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBQzdELE9BQU8sRUFBQyxlQUFlLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQTtBQUMzRSxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQTtBQUNsRSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUM1RCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsVUFBVSxFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDeEUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0seUJBQXlCLENBQUE7QUFDL0QsT0FBTyxFQUFDLHVCQUF1QixFQUFFLHVCQUF1QixFQUFFLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFBO0FBQy9GLE9BQU8sRUFBQyw0QkFBNEIsRUFBRSxtQkFBbUIsRUFBRSwyQkFBMkIsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSx1QkFBdUIsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsZ0NBQWdDLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVB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RCxTQUFTLEVBQUUsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztZQUM1SSxLQUFLLEVBQUUsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztZQUN4SSxTQUFTLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtZQUNyRixVQUFVLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtZQUM5RixRQUFRLEVBQUUsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztTQUN2SSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSx3QkFBd0IsSUFBSSxJQUFJLENBQUMsSUFBSSxJ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QUMzRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBQaHBQYXJzZXIgZnJvbSBcInBocC1wYXJzZXJcIlxuaW1wb3J0IHtwYXJzZSBhcyBwYXJzZUNvbW1lbnR9IGZyb20gXCJjb21tZW50LXBhcnNlclwiXG5pbXBvcnQge21pc3NpbmdUeXBlLCBwYXJzZUZhaWx1cmUsIHVuc3VwcG9ydGVkU3ludGF4fSBmcm9tIFwiLi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge2Jsb2NrUmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5fSBmcm9tIFwiLi4vc2VtYW50aWMvZWZmZWN0cy5qc1wiXG5pbXBvcnQge2xvY2F0aW9uRnJvbU9mZnNldHMsIG1vZHVsZUxvY2F0aW9ufSBmcm9tIFwiLi4vc2VtYW50aWMvbG9jYXRpb24uanNcIlxuaW1wb3J0IHt3aXRoQWRhcHRlZE9wZXJhdGlvbn0gZnJvbSBcIi4uL3NlbWFudGljL29wZXJhdG9ycy5qc1wiXG5pbXBvcnQge3NldFBhcnNlclJhbmdlcywgd2l0aFBhcnNlclJhbmdlc30gZnJvbSBcIi4uL3NlbWFudGljL3Byb3ZlbmFuY2UuanNcIlxuaW1wb3J0IHtpc1Rhc2swMzRSZXNvdXJjZVByb2JlfSBmcm9tIFwiLi4vc2VtYW50aWMvY2FwYWJpbGl0aWVzLmpzXCJcbmltcG9ydCB7aGFzRXhhY3RFZmZlY3RTdXBwb3J0fSBmcm9tIFwiLi4vYmFja2VuZHMvZWZmZWN0cy5qc1wiXG5pbXBvcnQge2hhc09ubHlVbmljb2RlU2NhbGFycywgc2NhbGFyVHlwZX0gZnJvbSBcIi4uL3NlbWFudGljL3NjYWxhcnMuanNcIlxuaW1wb3J0IHt0eXBlQ29udGFpbnNBbnlWYXJpYWJsZX0gZnJvbSBcIi4uL3NlbWFudGljL2dlbmVyaWNzLmpzXCJcbmltcG9ydCB7cmVxdWlyZVNvdXJjZVJldHVyblR5cGUsIHJlcXVpcmVTb3VyY2VTY2FsYXJUeXBlLCBzb3VyY2VTY2FsYXJUeXBlfSBmcm9tIFwiLi9zY2FsYXJzLmpzXCJcbmltcG9ydCB7Y2FwYWJpbGl0eUZ1bmN0aW9uU2lnbmF0dXJlcywgZG9jdW1lbnRlZFZhbHVlVHlwZSwgaW5zdGFudGlhdGVkUmVjb3JkRmllbGRUeXBlLCBpdGVyYXRpb25CaW5kaW5nVHlwZSwgaXRlcmF0aW9uT3BlcmFuZFR5cGUsIGtub3duQ2FsbFBhcmFtZXRlclR5cGVzLCBrbm93bkNhbGxSZXR1cm5UeXBlLCBvcHRpb25hbFR5cGUsIG9yZGVyZWRNYXBUeXBlRnJvbU1hcCwgb3duZWRSZXNvdXJjZVR5cGUsIHByZXNlcnZlc0dlbmVyaWNPcHRpb25hbEV2aWRlbmNlLCByZWNvcmRUeXBlLCByZWZlcmVuY2VUeXBlLCBzYW1lVmFsdWVUeXBlfSBmcm9tIFwiLi90eXBlcy5qc1wiXG5jb25zdCBwYXJzZXIgPSBuZXcgUGhwUGFyc2VyLkVuZ2luZSh7XG4gIGFzdDoge3dpdGhQb3NpdGlvbnM6IHRydWV9LFxuICBwYXJzZXI6IHtleHRyYWN0RG9jOiB0cnVlLCBzdXBwcmVzc0Vycm9yczogZmFsc2V9XG59KVxuLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG5sZXQgY2FjaGVkVG9rZW5Tb3VyY2Vcbi8qKiBAdHlwZSB7e2VuZDogbnVtYmVyLCBzdGFydDogbnVtYmVyLCB0ZXh0OiBzdHJpbmd9W119ICovXG5sZXQgY2FjaGVkVG9rZW5SYW5nZXMgPSBbXVxuY29uc3QgcGhwQmluYXJ5T3BlcmF0aW9ucyA9IG5ldyBNYXAoW1xuICBbXCIrXCIsIFwiUGhwQWRkXCJdLFxuICBbXCItXCIsIFwiU3VidHJhY3RcIl0sXG4gIFtcIipcIiwgXCJNdWx0aXBseVwiXSxcbiAgW1wiJiZcIiwgXCJBbmRcIl0sXG4gIFtcInx8XCIsIFwiT3JcIl0sXG4gIFtcIj09PVwiLCBcIkVxdWFsXCJdLFxuICBbXCIhPT1cIiwgXCJOb3RFcXVhbFwiXSxcbiAgW1wiPFwiLCBcIkxlc3NUaGFuXCJdLFxuICBbXCI8PVwiLCBcIkxlc3NUaGFuT3JFcXVhbFwiXSxcbiAgW1wiPlwiLCBcIkdyZWF0ZXJUaGFuXCJdLFxuICBbXCI+PVwiLCBcIkdyZWF0ZXJUaGFuT3JFcXVhbFwiXSxcbiAgW1wiLlwiLCBcIlN0cmluZ0NvbmNhdFwiXVxuXSlcblxuLyoqXG4gKiBAdHlwZWRlZiBQaHBDb252ZXJzaW9uQ29udGV4dFxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0JpbmRpbmdUeXBlPn0gYmluZGluZ3MgLSBFeHBsaWNpdGx5IHR5cGVkIHZpc2libGUgYmluZGluZ3MuXG4gKiBAcHJvcGVydHkge1NldDxzdHJpbmc+fSBbY2F0Y2hCaW5kaW5nTmFtZXNdIC0gTGV4aWNhbGx5IHZpc2libGUgZXhhY3QgY2F0Y2ggYmluZGluZyBuYW1lcy5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2F0Y2hCaW5kaW5nPn0gW2NhdGNoQmluZGluZ05vZGVzXSAtIEV4YWN0IGNhdGNoIGJpbmRpbmcgbm9kZXMgYnkgdmlzaWJsZSBuYW1lLlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uPn0gY2xhc3NlcyAtIFJlZmVyZW5jZSBjbGFzc2VzIGJ5IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9ufSBbY3VycmVudENsYXNzXSAtIEVuY2xvc2luZyByZWZlcmVuY2UgY2xhc3MuXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24+fSBlcnJvck5hbWVzIC0gRXJyb3IgZGVjbGFyYXRpb25zIGJ5IHNvdXJjZSBuYW1lLlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uPn0gZXJyb3JzIC0gRXJyb3IgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBQaHBGdW5jdGlvblNpZ25hdHVyZT59IGZ1bmN0aW9ucyAtIEV4cGxpY2l0IG1vZHVsZSBmdW5jdGlvbiBzaWduYXR1cmVzLlxuICogQHByb3BlcnR5IHtTZXQ8b2JqZWN0Pn0gW29yZGVyZWRNYXBEZWNsYXJhdGlvbnNdIC0gRXhhY3QgbG9jYWwgZGVjbGFyYXRpb25zIHNlbGVjdGVkIGJ5IHBhcnNlci1vd25lZCBwYWlyIGl0ZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbj59IHJlY29yZE5hbWVzIC0gTm9taW5hbCBkZWNsYXJhdGlvbnMgYnkgc291cmNlIG5hbWUuXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uPn0gcmVjb3JkcyAtIFJlY29yZCBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlIHwgdW5kZWZpbmVkfSByZXR1cm5UeXBlIC0gRW5jbG9zaW5nIHJldHVybiB0eXBlLlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5UeXBlUGFyYW1ldGVyPn0gW3R5cGVQYXJhbWV0ZXJzXSAtIERlY2xhcmF0aW9uLXNjb3BlZCBwYXJhbWV0ZXJzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUGhwRnVuY3Rpb25TaWduYXR1cmVcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgZGVjbGFyYXRpb24gbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBuYW1lTG9jYXRpb24gLSBQYXJzZXItb3duZWQgbmFtZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gRnVuY3Rpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUGFyYW1ldGVyW119IHBhcmFtZXRlcnMgLSBTZW1hbnRpYyBwYXJhbWV0ZXJzLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gcmV0dXJuVHlwZSAtIFNlbWFudGljIHJldHVybiB0eXBlLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5UeXBlUGFyYW1ldGVyW119IFt0eXBlUGFyYW1ldGVyc10gLSBEZWNsYXJhdGlvbi1zY29wZWQgcGFyYW1ldGVycy5cbiAqL1xuXG4vKipcbiAqIFJldHVybnMgYSBub3JtYWxpemVkIFBIUCBub2RlIGxvY2F0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGV9IG5vZGUgLSBQSFAgcGFyc2VyIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBTb3VyY2UgbG9jYXRpb24uXG4gKi9cbmZ1bmN0aW9uIG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGlmICghbm9kZS5sb2MpIHRocm93IG5ldyBFcnJvcihgUEhQIHBhcnNlciBvbWl0dGVkIHNvdXJjZSBsb2NhdGlvbiBmb3IgJHtub2RlLmtpbmR9LmApXG5cbiAgcmV0dXJuIGxvY2F0aW9uRnJvbU9mZnNldHMoZmlsZW5hbWUsIHNvdXJjZSwgbm9kZS5sb2Muc3RhcnQub2Zmc2V0LCBub2RlLmxvYy5lbmQub2Zmc2V0KVxufVxuXG4vKipcbiAqIExvY2F0ZXMgYSBjb21tZW50LXBhcnNlciB0b2tlbiBpbnNpZGUgYSBQSFAgcGFyc2VyLW93bmVkIGRvYyBjb21tZW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkNvbW1lbnRCbG9ja30gY29tbWVudCAtIFBIUCBkb2MgY29tbWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiY29tbWVudC1wYXJzZXJcIikuU3BlY30gdGFnIC0gUGFyc2VkIGRvYyB0YWcuXG4gKiBAcGFyYW0ge1wibmFtZVwiIHwgXCJ0eXBlXCJ9IGZpZWxkIC0gVG9rZW4gZmllbGQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBFeGFjdCB0b2tlbiBsb2NhdGlvbi5cbiAqL1xuZnVuY3Rpb24gY29tbWVudFRhZ0xvY2F0aW9uKGNvbW1lbnQsIHRhZywgZmllbGQsIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgY29uc3QgbGluZSA9IHRhZy5zb3VyY2VbMF1cblxuICBpZiAoIWNvbW1lbnQubG9jIHx8ICFsaW5lKSB0aHJvdyBuZXcgRXJyb3IoYENvbW1lbnQgcGFyc2VyIG9taXR0ZWQgdGhlIEAke3RhZy50YWd9IHNvdXJjZSB0b2tlbi5gKVxuXG4gIGxldCBsaW5lU3RhcnQgPSBjb21tZW50LmxvYy5zdGFydC5vZmZzZXRcblxuICBmb3IgKGxldCBsaW5lTnVtYmVyID0gMDsgbGluZU51bWJlciA8IGxpbmUubnVtYmVyOyBsaW5lTnVtYmVyKyspIHtcbiAgICB3aGlsZSAobGluZVN0YXJ0IDwgc291cmNlLmxlbmd0aCAmJiBzb3VyY2VbbGluZVN0YXJ0XSAhPSBcIlxcclwiICYmIHNvdXJjZVtsaW5lU3RhcnRdICE9IFwiXFxuXCIpIGxpbmVTdGFydCsrXG4gICAgaWYgKHNvdXJjZVtsaW5lU3RhcnRdID09IFwiXFxyXCIgJiYgc291cmNlW2xpbmVTdGFydCArIDFdID09IFwiXFxuXCIpIGxpbmVTdGFydCArPSAyXG4gICAgZWxzZSBsaW5lU3RhcnQrK1xuICB9XG5cbiAgY29uc3Qgb3JkZXJlZEZpZWxkcyA9IFtcInN0YXJ0XCIsIFwiZGVsaW1pdGVyXCIsIFwicG9zdERlbGltaXRlclwiLCBcInRhZ1wiLCBcInBvc3RUYWdcIiwgXCJuYW1lXCIsIFwicG9zdE5hbWVcIiwgXCJ0eXBlXCJdXG4gIGNvbnN0IGZpZWxkSW5kZXggPSBvcmRlcmVkRmllbGRzLmluZGV4T2YoZmllbGQpXG4gIGNvbnN0IHN0YXJ0ID0gbGluZVN0YXJ0ICsgb3JkZXJlZEZpZWxkcy5zbGljZSgwLCBmaWVsZEluZGV4KS5yZWR1Y2UoKGxlbmd0aCwga2V5KSA9PlxuICAgIGxlbmd0aCArIGxpbmUudG9rZW5zWy8qKiBAdHlwZSB7a2V5b2YgdHlwZW9mIGxpbmUudG9rZW5zfSAqLyAoa2V5KV0ubGVuZ3RoLCAwKVxuICBjb25zdCB2YWx1ZSA9IGxpbmUudG9rZW5zW2ZpZWxkXVxuXG4gIHJldHVybiBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBzb3VyY2UsIHN0YXJ0LCBzdGFydCArIHZhbHVlLmxlbmd0aClcbn1cblxuLyoqXG4gKiBGaW5kcyBvbmUgcGFyc2VyIHRva2VuIGJldHdlZW4gcGFyc2VyLW93bmVkIG5vZGUgYm91bmRhcmllcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblRleHQgLSBFeGFjdCB0b2tlbiB0ZXh0LlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0T2Zmc2V0IC0gSW5jbHVzaXZlIHNlYXJjaCBib3VuZGFyeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmRPZmZzZXQgLSBFeGNsdXNpdmUgc2VhcmNoIGJvdW5kYXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gVG9rZW4gbG9jYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHRva2VuTG9jYXRpb24odG9rZW5UZXh0LCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0LCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGlmIChjYWNoZWRUb2tlblNvdXJjZSAhPSBzb3VyY2UpIHtcbiAgICBsZXQgb2Zmc2V0ID0gMFxuXG4gICAgY2FjaGVkVG9rZW5SYW5nZXMgPSBwYXJzZXIudG9rZW5HZXRBbGwoc291cmNlKS5tYXAoKHRva2VuKSA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gdHlwZW9mIHRva2VuID09IFwic3RyaW5nXCIgPyB0b2tlbiA6IHRva2VuWzFdXG4gICAgICBjb25zdCByYW5nZSA9IHtlbmQ6IG9mZnNldCArIHRleHQubGVuZ3RoLCBzdGFydDogb2Zmc2V0LCB0ZXh0fVxuXG4gICAgICBvZmZzZXQgPSByYW5nZS5lbmRcblxuICAgICAgcmV0dXJuIHJhbmdlXG4gICAgfSlcbiAgICBjYWNoZWRUb2tlblNvdXJjZSA9IHNvdXJjZVxuICB9XG5cbiAgY29uc3QgdG9rZW4gPSBjYWNoZWRUb2tlblJhbmdlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS50ZXh0ID09IHRva2VuVGV4dCAmJiBjYW5kaWRhdGUuc3RhcnQgPj0gc3RhcnRPZmZzZXQgJiZcbiAgICBjYW5kaWRhdGUuZW5kIDw9IGVuZE9mZnNldClcblxuICBpZiAodG9rZW4pIHJldHVybiBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBzb3VyY2UsIHRva2VuLnN0YXJ0LCB0b2tlbi5lbmQpXG5cbiAgdGhyb3cgbmV3IEVycm9yKGBQSFAgcGFyc2VyIG9taXR0ZWQgdG9rZW4gJyR7dG9rZW5UZXh0fScgYmV0d2VlbiAke3N0YXJ0T2Zmc2V0fSBhbmQgJHtlbmRPZmZzZXR9LmApXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzdXBwb3J0ZWQgUEhQIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuRXhwcmVzc2lvbn0gbm9kZSAtIFBIUCBleHByZXNzaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEBwYXJhbSB7UGhwQ29udmVyc2lvbkNvbnRleHR9IGNvbnRleHQgLSBUeXBlZCBjb252ZXJzaW9uIGNvbnRleHQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSBbZXhwZWN0ZWRUeXBlXSAtIENvbnRleHR1YWwgdHlwZSBmb3IgZW1wdHkgUEhQIGFycmF5cy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ByZXNlcnZlT3B0aW9uYWxdIC0gV2hldGhlciBhbiBvcHRpb25hbCBpZGVudGlmaWVyIHJlbWFpbnMgd3JhcHBlZC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBTZW1hbnRpYyBleHByZXNzaW9uLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0RXhwcmVzc2lvbihub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCBleHBlY3RlZFR5cGUsIHByZXNlcnZlT3B0aW9uYWwgPSBmYWxzZSkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIGlmIChleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgIGlmIChub2RlLmtpbmQgPT0gXCJudWxsa2V5d29yZFwiKSB7XG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiT3B0aW9uYWxOb25lXCIpLCBsb2NhdGlvbn0sIHthYnNlbmNlOiBsb2NhdGlvbn0pXG4gICAgfVxuICAgIGlmIChrbm93bkV4cHJlc3Npb25UeXBlKG5vZGUsIGNvbnRleHQpPy5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIHJldHVybiBjb252ZXJ0RXhwcmVzc2lvbihub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCB1bmRlZmluZWQsIHRydWUpXG4gICAgfVxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIk9wdGlvbmFsU29tZVwiKSxcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgdmFsdWU6IGNvbnZlcnRFeHByZXNzaW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsIGV4cGVjdGVkVHlwZS52YWx1ZVR5cGUpXG4gICAgfSwge3NvbWU6IGxvY2F0aW9ufSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJudWxsa2V5d29yZFwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJudWxsIG91dHNpZGUgYW4gZXhwbGljaXQgb3B0aW9uYWwgY29udGV4dFwiLCBsb2NhdGlvbilcblxuICBpZiAobm9kZS5raW5kID09IFwidmFyaWFibGVcIikge1xuICAgIGNvbnN0IHZhcmlhYmxlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlZhcmlhYmxlfSAqLyAobm9kZSlcblxuICAgIGlmICh0eXBlb2YgdmFyaWFibGUubmFtZSAhPSBcInN0cmluZ1wiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkeW5hbWljIHZhcmlhYmxlXCIsIGxvY2F0aW9uKVxuICAgIGlmICh2YXJpYWJsZS5uYW1lID09IFwidGhpc1wiKSB7XG4gICAgICBpZiAoIWNvbnRleHQuY3VycmVudENsYXNzKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJyZWNlaXZlciBvdXRzaWRlIGEgcmVmZXJlbmNlIGNsYXNzXCIsIGxvY2F0aW9uKVxuICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2NsYXNzSWQ6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoY29udGV4dC5jdXJyZW50Q2xhc3MuaWQpLFxuICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJSZWNlaXZlckV4cHJlc3Npb25cIiksIGxvY2F0aW9ufSwge3JlY2VpdmVyOiBsb2NhdGlvbn0pXG4gICAgfVxuXG4gICAgY29uc3QgaWRlbnRpZmllciA9IHdpdGhQYXJzZXJSYW5nZXMoe2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIklkZW50aWZpZXJFeHByZXNzaW9uXCIpLCBsb2NhdGlvbiwgbmFtZTogdmFyaWFibGUubmFtZX0sIHtuYW1lOiBsb2NhdGlvbn0pXG5cbiAgICBpZiAoIXByZXNlcnZlT3B0aW9uYWwgJiYgY29udGV4dC5iaW5kaW5ncy5nZXQodmFyaWFibGUubmFtZSk/LmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIk9wdGlvbmFsVW53cmFwXCIpLCBsb2NhdGlvbiwgb3BlcmFuZDogaWRlbnRpZmllcn0sIHt1bndyYXA6IGxvY2F0aW9ufSlcbiAgICB9XG5cbiAgICByZXR1cm4gaWRlbnRpZmllclxuICB9XG5cbiAgaWYgKG5vZGUua2luZCA9PSBcIm51bWJlclwiKSB7XG4gICAgY29uc3QgbGl0ZXJhbCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5OdW1iZXJ9ICovIChub2RlKVxuICAgIGNvbnN0IHZhbHVlID0gTnVtYmVyKGxpdGVyYWwudmFsdWUpXG5cbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibm9uLXNhZmUgaW50ZWdlciBsaXRlcmFsXCIsIGxvY2F0aW9uKVxuXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkludGVnZXJMaXRlcmFsXCIpLCBsb2NhdGlvbiwgdmFsdWV9LCB7bGl0ZXJhbDogbG9jYXRpb259KVxuICB9XG5cbiAgaWYgKG5vZGUua2luZCA9PSBcImJvb2xlYW5cIikge1xuICAgIGNvbnN0IGxpdGVyYWwgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQm9vbGVhbn0gKi8gKG5vZGUpXG5cbiAgICBpZiAodHlwZW9mIGxpdGVyYWwudmFsdWUgIT0gXCJib29sZWFuXCIpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImludmFsaWQgYm9vbGVhbiBsaXRlcmFsIHZhbHVlXCIsIGxvY2F0aW9uKVxuXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkJvb2xlYW5MaXRlcmFsXCIpLCBsb2NhdGlvbiwgdmFsdWU6IGxpdGVyYWwudmFsdWV9LCB7bGl0ZXJhbDogbG9jYXRpb259KVxuICB9XG5cbiAgaWYgKG5vZGUua2luZCA9PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgbGl0ZXJhbCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5TdHJpbmd9ICovIChub2RlKVxuXG4gICAgaWYgKHR5cGVvZiBsaXRlcmFsLnJhdyA9PSBcInN0cmluZ1wiICYmIGxpdGVyYWwucmF3LnN0YXJ0c1dpdGgoXCI8PDxcIikpIHtcbiAgICAgIGNvbnN0IGRldGFpbCA9IGxpdGVyYWwucmF3LnN0YXJ0c1dpdGgoXCI8PDwnXCIpID8gXCJub3dkb2Mgc3RyaW5nXCIgOiBcImhlcmVkb2Mgc3RyaW5nXCJcblxuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGRldGFpbCwgbG9jYXRpb24pXG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGl0ZXJhbC5yYXcgPT0gXCJzdHJpbmdcIiAmJiBbXCJiXFxcIlwiLCBcIkJcXFwiXCIsIFwiYidcIiwgXCJCJ1wiXS5zb21lKChwcmVmaXgpID0+IGxpdGVyYWwucmF3LnN0YXJ0c1dpdGgocHJlZml4KSkpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImJpbmFyeSBzdHJpbmcgbGl0ZXJhbFwiLCBsb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBsaXRlcmFsLnZhbHVlICE9IFwic3RyaW5nXCIgfHwgIWhhc09ubHlVbmljb2RlU2NhbGFycyhsaXRlcmFsLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiaW52YWxpZCBVbmljb2RlIHN0cmluZyBsaXRlcmFsXCIsIGxvY2F0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJTdHJpbmdMaXRlcmFsXCIpLCBsb2NhdGlvbiwgdmFsdWU6IGxpdGVyYWwudmFsdWV9LCB7bGl0ZXJhbDogbG9jYXRpb259KVxuICB9XG5cbiAgaWYgKG5vZGUua2luZCA9PSBcImVuY2Fwc2VkXCIpIHtcbiAgICBjb25zdCBsaXRlcmFsID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkVuY2Fwc2VkfSAqLyAobm9kZSlcblxuICAgIGlmIChsaXRlcmFsLnR5cGUgIT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGAke2xpdGVyYWwudHlwZX0gc3RyaW5nYCwgbG9jYXRpb24pXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGxpdGVyYWwudmFsdWUpKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpbnRlcnBvbGF0ZWQgc3RyaW5nXCIsIGxvY2F0aW9uKVxuXG4gICAgY29uc3QgcGFydHMgPSBsaXRlcmFsLnZhbHVlLm1hcCgocGFydCkgPT4ge1xuICAgICAgaWYgKHBhcnQua2luZCAhPSBcImVuY2Fwc2VkcGFydFwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYGludGVycG9sYXRlZCBzdHJpbmcgcGFydCAke3BhcnQua2luZH1gLCBub2RlTG9jYXRpb24ocGFydCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgICBjb25zdCBlbmNhcHNlZFBhcnQgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRW5jYXBzZWRQYXJ0fSAqLyAocGFydClcblxuICAgICAgaWYgKCFlbmNhcHNlZFBhcnQuZXhwcmVzc2lvbikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiaW50ZXJwb2xhdGVkIHN0cmluZyBwYXJ0IHdpdGhvdXQgZXhwcmVzc2lvblwiLCBub2RlTG9jYXRpb24oZW5jYXBzZWRQYXJ0LCBmaWxlbmFtZSwgc291cmNlKSlcblxuICAgICAgcmV0dXJuIGNvbnZlcnRFeHByZXNzaW9uKGVuY2Fwc2VkUGFydC5leHByZXNzaW9uLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCBzY2FsYXJUeXBlKFwic3RyaW5nXCIpKVxuICAgIH0pXG5cbiAgICBpZiAocGFydHMubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJTdHJpbmdMaXRlcmFsXCIpLCBsb2NhdGlvbiwgdmFsdWU6IFwiXCJ9LCB7bGl0ZXJhbDogbG9jYXRpb259KVxuICAgIH1cblxuICAgIGxldCBsb3dlcmVkID0gcGFydHNbMF1cblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cy5zbGljZSgxKSkge1xuICAgICAgY29uc3Qgc2VtYW50aWMgPSB3aXRoQWRhcHRlZE9wZXJhdGlvbih7XG4gICAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkJpbmFyeUV4cHJlc3Npb25cIiksXG4gICAgICAgIGxlZnQ6IGxvd2VyZWQsXG4gICAgICAgIGxvY2F0aW9uLFxuICAgICAgICByaWdodDogcGFydFxuICAgICAgfSwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy9vcGVyYXRvcnMuanNcIikuQWRhcHRlZE9wZXJhdGlvbn0gKi8gKFwiU3RyaW5nQ29uY2F0XCIpKVxuXG4gICAgICBsb3dlcmVkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoc2VtYW50aWMpKVxuICAgIH1cblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKGxvd2VyZWQsIHtsaXRlcmFsOiBsb2NhdGlvbn0pXG4gIH1cblxuICBpZiAobm9kZS5raW5kID09IFwibm93ZG9jXCIpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm5vd2RvYyBzdHJpbmdcIiwgbG9jYXRpb24pXG5cbiAgaWYgKG5vZGUua2luZCA9PSBcImFycmF5XCIpIHtcbiAgICBjb25zdCBsaXRlcmFsID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkFycmF5fSAqLyAobm9kZSlcbiAgICBjb25zdCBpbnZhbGlkRW50cnkgPSBsaXRlcmFsLml0ZW1zLmZpbmQoKGVudHJ5KSA9PiB7XG4gICAgICBpZiAoZW50cnkua2luZCAhPSBcImVudHJ5XCIpIHJldHVybiB0cnVlXG4gICAgICBjb25zdCBjYW5kaWRhdGUgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRW50cnl9ICovIChlbnRyeSlcblxuICAgICAgcmV0dXJuIGNhbmRpZGF0ZS5ieVJlZiB8fCBjYW5kaWRhdGUudW5wYWNrXG4gICAgfSlcblxuICAgIGlmIChpbnZhbGlkRW50cnkpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImFycmF5IHJlZmVyZW5jZSBvciB1bnBhY2tpbmdcIiwgbm9kZUxvY2F0aW9uKGludmFsaWRFbnRyeSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgY29uc3QgZW50cmllcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5FbnRyeVtdfSAqLyAobGl0ZXJhbC5pdGVtcylcbiAgICBjb25zdCBoYXNLZXlzID0gZW50cmllcy5zb21lKChlbnRyeSkgPT4gZW50cnkua2V5ICE9IG51bGwpXG4gICAgY29uc3QgaGFzSW1wbGljaXQgPSBlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5rZXkgPT0gbnVsbClcbiAgICBjb25zdCBjb2xsZWN0aW9uS2luZCA9IGVudHJpZXMubGVuZ3RoID09IDAgPyBleHBlY3RlZFR5cGU/LmtpbmQgOiBoYXNLZXlzICYmICFoYXNJbXBsaWNpdFxuICAgICAgPyBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiID8gXCJPcmRlcmVkTWFwVHlwZVwiIDogXCJNYXBUeXBlXCJcbiAgICAgIDogIWhhc0tleXMgPyBcIkxpc3RUeXBlXCIgOiBcIm1peGVkXCJcblxuICAgIGlmIChjb2xsZWN0aW9uS2luZCA9PSBcIm1peGVkXCIpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm1peGVkIGxpc3QvbWFwIGFycmF5IGxpdGVyYWxcIiwgbG9jYXRpb24pXG4gICAgaWYgKGNvbGxlY3Rpb25LaW5kID09IFwiTGlzdFR5cGVcIikge1xuICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJMaXN0VHlwZVwiID8gZXhwZWN0ZWRUeXBlLmVsZW1lbnRUeXBlIDogdW5kZWZpbmVkXG5cbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgICAgZWxlbWVudHM6IGVudHJpZXMubWFwKChlbnRyeSkgPT4gY29udmVydEV4cHJlc3Npb24oZW50cnkudmFsdWUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsIGVsZW1lbnRUeXBlKSksXG4gICAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkxpc3RMaXRlcmFsXCIpLFxuICAgICAgICBsb2NhdGlvblxuICAgICAgfSwge2xpdGVyYWw6IGxvY2F0aW9ufSlcbiAgICB9XG4gICAgaWYgKGNvbGxlY3Rpb25LaW5kID09IFwiTWFwVHlwZVwiIHx8IGNvbGxlY3Rpb25LaW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIikge1xuICAgICAgY29uc3QgdmFsdWVUeXBlID0gZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiTWFwVHlwZVwiIHx8IGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCJcbiAgICAgICAgPyBleHBlY3RlZFR5cGUudmFsdWVUeXBlIDogdW5kZWZpbmVkXG4gICAgICBjb25zdCBzZW1hbnRpY0VudHJpZXMgPSBlbnRyaWVzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgICAgaWYgKCFlbnRyeS5rZXkgfHwgZW50cnkua2V5LmtpbmQgIT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm1hcCBrZXkgb3RoZXIgdGhhbiBhIGxpdGVyYWwgc3RyaW5nXCIsIGVudHJ5LmtleSA/IG5vZGVMb2NhdGlvbihlbnRyeS5rZXksIGZpbGVuYW1lLCBzb3VyY2UpIDogbm9kZUxvY2F0aW9uKGVudHJ5LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSBjb252ZXJ0RXhwcmVzc2lvbihlbnRyeS5rZXksIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG5cbiAgICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgICAgIGtleTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TdHJpbmdMaXRlcmFsfSAqLyAoa2V5KSxcbiAgICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJNYXBFbnRyeVwiKSxcbiAgICAgICAgICBsb2NhdGlvbjogbm9kZUxvY2F0aW9uKGVudHJ5LCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgICAgICB2YWx1ZTogY29udmVydEV4cHJlc3Npb24oZW50cnkudmFsdWUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsIHZhbHVlVHlwZSlcbiAgICAgICAgfSwge29wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiPT5cIiwgZW50cnkua2V5LmxvYz8uZW5kLm9mZnNldCA/PyAwLCBlbnRyeS52YWx1ZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICAgIGVudHJpZXM6IHNlbWFudGljRW50cmllcyxcbiAgICAgICAga2luZDogY29sbGVjdGlvbktpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiXG4gICAgICAgICAgPyAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJPcmRlcmVkTWFwTGl0ZXJhbFwiKVxuICAgICAgICAgIDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiTWFwTGl0ZXJhbFwiKSxcbiAgICAgICAgbG9jYXRpb25cbiAgICAgIH0sIHtsaXRlcmFsOiBsb2NhdGlvbn0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZW1wdHkgYXJyYXkgd2l0aG91dCBhIGxpc3Qgb3IgbWFwIHR5cGVcIiwgbG9jYXRpb24pXG4gIH1cblxuICBpZiAobm9kZS5raW5kID09IFwibmV3XCIpIHtcbiAgICBjb25zdCBjb25zdHJ1Y3Rpb24gPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTmV3fSAqLyAobm9kZSlcbiAgICBjb25zdCBuYW1lID0gY29uc3RydWN0aW9uLndoYXQua2luZCA9PSBcIm5hbWVcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5OYW1lfSAqLyAoY29uc3RydWN0aW9uLndoYXQpIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoIW5hbWUgfHwgbmFtZS5yZXNvbHV0aW9uICE9IFwidXFuXCIgfHwgdHlwZW9mIG5hbWUubmFtZSAhPSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkeW5hbWljIG9yIHF1YWxpZmllZCByZWNvcmQgY29uc3RydWN0aW9uXCIsIG5vZGVMb2NhdGlvbihjb25zdHJ1Y3Rpb24ud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gY29udGV4dC5yZWNvcmROYW1lcy5nZXQobmFtZS5uYW1lKVxuXG4gICAgaWYgKCFkZWNsYXJhdGlvbikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiY29uc3RydWN0aW9uIG9mIGFuIHVua25vd24gbm9taW5hbCBjbGFzc1wiLCBub2RlTG9jYXRpb24oY29uc3RydWN0aW9uLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIGlmIChkZWNsYXJhdGlvbi5raW5kID09IFwiQ2xhc3NEZWNsYXJhdGlvblwiKSB7XG4gICAgICBjb25zdCB1bnN1cHBvcnRlZEFyZ3VtZW50ID0gY29uc3RydWN0aW9uLmFyZ3VtZW50cy5maW5kKChhcmd1bWVudCkgPT5cbiAgICAgICAgYXJndW1lbnQua2luZCA9PSBcIm5hbWVkYXJndW1lbnRcIiB8fCBhcmd1bWVudC5raW5kID09IFwidmFyaWFkaWNcIiB8fCBSZWZsZWN0LmdldChhcmd1bWVudCwgXCJieXJlZlwiKSA9PT0gdHJ1ZSlcblxuICAgICAgaWYgKHVuc3VwcG9ydGVkQXJndW1lbnQpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm5vbi1wb3NpdGlvbmFsIHJlZmVyZW5jZSBjb25zdHJ1Y3RvciBhcmd1bWVudFwiLFxuICAgICAgICBub2RlTG9jYXRpb24odW5zdXBwb3J0ZWRBcmd1bWVudCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgICBjb25zdCBjbGFzc0xvY2F0aW9uID0gbm9kZUxvY2F0aW9uKGNvbnN0cnVjdGlvbi53aGF0LCBmaWxlbmFtZSwgc291cmNlKVxuXG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7YXJndW1lbnRzOiBjb25zdHJ1Y3Rpb24uYXJndW1lbnRzLm1hcCgoYXJndW1lbnQsIGluZGV4KSA9PlxuICAgICAgICBjb252ZXJ0RXhwcmVzc2lvbihhcmd1bWVudCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCwgZGVjbGFyYXRpb24uY29uc3RydWN0b3IucGFyYW1ldGVyc1tpbmRleF0/LnR5cGUpKSxcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlJlZmVyZW5jZUNvbnN0cnVjdGlvblwiKSwgbG9jYXRpb24sXG4gICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZVR5cGUoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIGNsYXNzTG9jYXRpb24pfSwge2NsYXNzOiBjbGFzc0xvY2F0aW9ufSlcbiAgICB9XG4gICAgaWYgKGRlY2xhcmF0aW9uLmtpbmQgPT0gXCJFZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm93bmVkIHJlc291cmNlIGNvbnN0cnVjdGlvblwiLCBub2RlTG9jYXRpb24oY29uc3RydWN0aW9uLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gICAgY29uc3QgY29udGV4dHVhbFR5cGVBcmd1bWVudHMgPSBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJSZWNvcmRUeXBlXCIgJiYgZXhwZWN0ZWRUeXBlLmRlY2xhcmF0aW9uSWQgPT0gZGVjbGFyYXRpb24uaWRcbiAgICAgID8gZXhwZWN0ZWRUeXBlLmFyZ3VtZW50c1xuICAgICAgOiB1bmRlZmluZWRcbiAgICBjb25zdCB2aXNpYmxlVHlwZVBhcmFtZXRlcklkcyA9IG5ldyBTZXQoWy4uLmNvbnRleHQudHlwZVBhcmFtZXRlcnM/LnZhbHVlcygpID8/IFtdXVxuICAgICAgLm1hcCgocGFyYW1ldGVyKSA9PiAvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhcmFtZXRlci5pZCkpKVxuICAgIGNvbnN0IHR5cGVBcmd1bWVudHMgPSBjb250ZXh0dWFsVHlwZUFyZ3VtZW50cyAmJlxuICAgICAgIWNvbnRleHR1YWxUeXBlQXJndW1lbnRzLnNvbWUoKGFyZ3VtZW50KSA9PiB0eXBlQ29udGFpbnNBbnlWYXJpYWJsZShhcmd1bWVudCwgdmlzaWJsZVR5cGVQYXJhbWV0ZXJJZHMpKVxuICAgICAgPyBjb250ZXh0dWFsVHlwZUFyZ3VtZW50c1xuICAgICAgOiB1bmRlZmluZWRcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGFyZ3VtZW50czogY29uc3RydWN0aW9uLmFyZ3VtZW50cy5tYXAoKGFyZ3VtZW50LCBpbmRleCkgPT5cbiAgICAgICAgY29udmVydEV4cHJlc3Npb24oYXJndW1lbnQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsXG4gICAgICAgICAgaW5zdGFudGlhdGVkUmVjb3JkRmllbGRUeXBlKGRlY2xhcmF0aW9uLCB0eXBlQXJndW1lbnRzLCBpbmRleCkpKSxcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlJlY29yZENvbnN0cnVjdGlvblwiKSxcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgcmVjb3JkOiByZWNvcmRUeXBlKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBub2RlTG9jYXRpb24oY29uc3RydWN0aW9uLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UpLFxuICAgICAgICB0eXBlQXJndW1lbnRzKVxuICAgIH0sIHtyZWNvcmQ6IG5vZGVMb2NhdGlvbihjb25zdHJ1Y3Rpb24ud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICB9XG5cbiAgaWYgKG5vZGUua2luZCA9PSBcInByb3BlcnR5bG9va3VwXCIpIHtcbiAgICBjb25zdCByZWFkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlByb3BlcnR5TG9va3VwfSAqLyAobm9kZSlcbiAgICBjb25zdCBvZmZzZXQgPSByZWFkLm9mZnNldC5raW5kID09IFwiaWRlbnRpZmllclwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklkZW50aWZpZXJ9ICovIChyZWFkLm9mZnNldCkgOiB1bmRlZmluZWRcblxuICAgIGlmICghb2Zmc2V0IHx8IHR5cGVvZiBvZmZzZXQubmFtZSAhPSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkeW5hbWljIG9yIGNvbXB1dGVkIG1lbWJlciBhY2Nlc3NcIiwgbm9kZUxvY2F0aW9uKHJlYWQub2Zmc2V0LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gICAgaWYgKHJlYWQud2hhdC5raW5kID09IFwidmFyaWFibGVcIiAmJiAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVmFyaWFibGV9ICovIChyZWFkLndoYXQpLm5hbWUgPT0gXCJ0aGlzXCIgJiZcbiAgICAgIGNvbnRleHQuY3VycmVudENsYXNzKSB7XG4gICAgICBjb25zdCBmaWVsZCA9IGNvbnRleHQuY3VycmVudENsYXNzLmZpZWxkcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09IG9mZnNldC5uYW1lKVxuXG4gICAgICBpZiAoIWZpZWxkKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYHVua25vd24gcHJpdmF0ZSBmaWVsZCAnJHtvZmZzZXQubmFtZX0nYCwgbm9kZUxvY2F0aW9uKG9mZnNldCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7ZmllbGQ6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZmllbGQuaWQpLCBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJQcml2YXRlRmllbGRSZWFkXCIpLCBsb2NhdGlvbixcbiAgICAgICAgcmVjZWl2ZXI6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjZWl2ZXJFeHByZXNzaW9ufSAqLyAoXG4gICAgICAgICAgY29udmVydEV4cHJlc3Npb24ocmVhZC53aGF0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSl9LCB7bWVtYmVyOiBub2RlTG9jYXRpb24ob2Zmc2V0LCBmaWxlbmFtZSwgc291cmNlKX0pXG4gICAgfVxuICAgIGNvbnN0IHJlY2VpdmVyVHlwZSA9IGtub3duRXhwcmVzc2lvblR5cGUocmVhZC53aGF0LCBjb250ZXh0KVxuICAgIGlmIChyZWNlaXZlclR5cGU/LmtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInByaXZhdGUgcmVmZXJlbmNlLWNsYXNzIGZpZWxkIGFjY2Vzc1wiLCBsb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgcmVjZWl2ZXJSZWNvcmQgPSByZWNlaXZlclR5cGU/LmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIiA/IHJlY2VpdmVyVHlwZS52YWx1ZVR5cGUgOiByZWNlaXZlclR5cGVcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHJlY2VpdmVyUmVjb3JkPy5raW5kID09IFwiUmVjb3JkVHlwZVwiID8gY29udGV4dC5yZWNvcmRzLmdldChyZWNlaXZlclJlY29yZC5kZWNsYXJhdGlvbklkKSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKChkZWNsYXJhdGlvbj8udHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCA/PyAwKSA+IDApIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImdlbmVyaWMgcmVjb3JkIHByb3BlcnR5IGFjY2Vzc1wiLCBub2RlTG9jYXRpb24ocmVhZC5vZmZzZXQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBmaWVsZDogb2Zmc2V0Lm5hbWUsXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJNZW1iZXJSZWFkXCIpLFxuICAgICAgbG9jYXRpb24sXG4gICAgICByZWNlaXZlcjogY29udmVydEV4cHJlc3Npb24ocmVhZC53aGF0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuICAgIH0sIHttZW1iZXI6IG5vZGVMb2NhdGlvbihyZWFkLm9mZnNldCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICB9XG5cbiAgaWYgKG5vZGUua2luZCA9PSBcIm9mZnNldGxvb2t1cFwiKSB7XG4gICAgY29uc3QgbG9va3VwID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk9mZnNldExvb2t1cH0gKi8gKG5vZGUpXG5cbiAgICBpZiAoIWxvb2t1cC5vZmZzZXQpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImFwcGVuZCBvciBtaXNzaW5nIGFycmF5IGluZGV4XCIsIGxvY2F0aW9uKVxuICAgIGNvbnN0IHJlY2VpdmVyID0gbG9va3VwLndoYXQua2luZCA9PSBcInZhcmlhYmxlXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVmFyaWFibGV9ICovIChsb29rdXAud2hhdCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCByZWNlaXZlclR5cGUgPSByZWNlaXZlciAmJiB0eXBlb2YgcmVjZWl2ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gY29udGV4dC5iaW5kaW5ncy5nZXQocmVjZWl2ZXIubmFtZSkgOiB1bmRlZmluZWRcbiAgICBjb25zdCBhY2Nlc3NLaW5kID0gcmVjZWl2ZXJUeXBlPy5raW5kID09IFwiTGlzdFR5cGVcIiA/IFwibGlzdFwiIDpcbiAgICAgIHJlY2VpdmVyVHlwZT8ua2luZCA9PSBcIk1hcFR5cGVcIiB8fCByZWNlaXZlclR5cGU/LmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiID8gXCJtYXBcIiA6XG4gICAgICBsb29rdXAub2Zmc2V0LmtpbmQgPT0gXCJudW1iZXJcIiA/IFwibGlzdFwiIDogbG9va3VwLm9mZnNldC5raW5kID09IFwic3RyaW5nXCIgPyBcIm1hcFwiIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoYWNjZXNzS2luZCA9PSBcImxpc3RcIiAmJiBbXCJudW1iZXJcIiwgXCJzdHJpbmdcIiwgXCJ2YXJpYWJsZVwiXS5pbmNsdWRlcyhsb29rdXAub2Zmc2V0LmtpbmQpKSB7XG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICAgIGNvbGxlY3Rpb246IGNvbnZlcnRFeHByZXNzaW9uKGxvb2t1cC53aGF0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSxcbiAgICAgICAgaW5kZXg6IGNvbnZlcnRFeHByZXNzaW9uKGxvb2t1cC5vZmZzZXQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpLFxuICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJMaXN0SW5kZXhFeHByZXNzaW9uXCIpLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgdG90YWxpdHk6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInByb3ZlblwiKVxuICAgICAgfSwge29wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiW1wiLCBsb29rdXAud2hhdC5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgbG9va3VwLm9mZnNldC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gICAgfVxuICAgIGlmIChhY2Nlc3NLaW5kID09IFwibWFwXCIgJiYgW1wibnVtYmVyXCIsIFwic3RyaW5nXCIsIFwidmFyaWFibGVcIl0uaW5jbHVkZXMobG9va3VwLm9mZnNldC5raW5kKSkge1xuICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgICBjb2xsZWN0aW9uOiBjb252ZXJ0RXhwcmVzc2lvbihsb29rdXAud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCksXG4gICAgICAgIGtleTogY29udmVydEV4cHJlc3Npb24obG9va3VwLm9mZnNldCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCksXG4gICAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIk1hcExvb2t1cEV4cHJlc3Npb25cIiksXG4gICAgICAgIGxvY2F0aW9uLFxuICAgICAgICB0b3RhbGl0eTogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwicHJvdmVuXCIpXG4gICAgICB9LCB7b3BlcmF0b3I6IHRva2VuTG9jYXRpb24oXCJbXCIsIGxvb2t1cC53aGF0LmxvYz8uZW5kLm9mZnNldCA/PyAwLCBsb29rdXAub2Zmc2V0LmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25saXRlcmFsIGFycmF5IGFjY2Vzc1wiLCBub2RlTG9jYXRpb24obG9va3VwLm9mZnNldCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cblxuICBpZiAobm9kZS5raW5kID09IFwidW5hcnlcIikge1xuICAgIGNvbnN0IHVuYXJ5ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlVuYXJ5fSAqLyAobm9kZSlcblxuICAgIGlmICghW1wiIVwiLCBcIi1cIl0uaW5jbHVkZXModW5hcnkudHlwZSkpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBgdW5hcnkgJHt1bmFyeS50eXBlfWAsIGxvY2F0aW9uKVxuXG4gICAgY29uc3Qgc2VtYW50aWMgPSB3aXRoQWRhcHRlZE9wZXJhdGlvbih3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGtpbmQ6IFwiVW5hcnlFeHByZXNzaW9uXCIsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIG9wZXJhbmQ6IGNvbnZlcnRFeHByZXNzaW9uKHVuYXJ5LndoYXQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gICAgfSwge1xuICAgICAgb3BlcmF0b3I6IHRva2VuTG9jYXRpb24odW5hcnkudHlwZSwgdW5hcnkubG9jPy5zdGFydC5vZmZzZXQgPz8gMCwgdW5hcnkud2hhdC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyB1bmFyeS5sb2M/LmVuZC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICB9KSwgdW5hcnkudHlwZSA9PSBcIiFcIiA/IFwiTm90XCIgOiBcIk5lZ2F0ZVwiKVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHNlbWFudGljKSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJyZXRpZlwiKSB7XG4gICAgY29uc3QgdGVybmFyeSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5SZXRJZn0gKi8gKG5vZGUpXG5cbiAgICBpZiAoIXRlcm5hcnkudGVzdCB8fCAhdGVybmFyeS50cnVlRXhwciB8fCAhdGVybmFyeS5mYWxzZUV4cHIpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInNob3J0IHRlcm5hcnlcIiwgbG9jYXRpb24pXG4gICAgaWYgKHRlcm5hcnkudGVzdC5raW5kID09IFwidmFyaWFibGVcIikge1xuICAgICAgY29uc3QgdGVzdGVkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlZhcmlhYmxlfSAqLyAodGVybmFyeS50ZXN0KVxuXG4gICAgICBpZiAodHlwZW9mIHRlc3RlZC5uYW1lID09IFwic3RyaW5nXCIgJiYgY29udGV4dC5iaW5kaW5ncy5nZXQodGVzdGVkLm5hbWUpPy5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwib3B0aW9uYWwgdHJ1dGhpbmVzcyBjb25kaXRpb25cIiwgbm9kZUxvY2F0aW9uKHRlc3RlZCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgYWx0ZXJuYXRlOiBjb252ZXJ0RXhwcmVzc2lvbih0ZXJuYXJ5LmZhbHNlRXhwciwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCksXG4gICAgICBjb25kaXRpb246IGNvbnZlcnRFeHByZXNzaW9uKHRlcm5hcnkudGVzdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCksXG4gICAgICBjb25zZXF1ZW50OiBjb252ZXJ0RXhwcmVzc2lvbih0ZXJuYXJ5LnRydWVFeHByLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSxcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiKSxcbiAgICAgIGxvY2F0aW9uXG4gICAgfSwge1xuICAgICAgYWx0ZXJuYXRlOiB0b2tlbkxvY2F0aW9uKFwiOlwiLCB0ZXJuYXJ5LnRydWVFeHByLmxvYz8uZW5kLm9mZnNldCA/PyAwLCB0ZXJuYXJ5LmZhbHNlRXhwci5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIGNvbG9uOiB0b2tlbkxvY2F0aW9uKFwiOlwiLCB0ZXJuYXJ5LnRydWVFeHByLmxvYz8uZW5kLm9mZnNldCA/PyAwLCB0ZXJuYXJ5LmZhbHNlRXhwci5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIGNvbmRpdGlvbjogdGVybmFyeS50ZXN0LmxvYyA/IG5vZGVMb2NhdGlvbih0ZXJuYXJ5LnRlc3QsIGZpbGVuYW1lLCBzb3VyY2UpIDogbG9jYXRpb24sXG4gICAgICBjb25zZXF1ZW50OiB0ZXJuYXJ5LnRydWVFeHByLmxvYyA/IG5vZGVMb2NhdGlvbih0ZXJuYXJ5LnRydWVFeHByLCBmaWxlbmFtZSwgc291cmNlKSA6IGxvY2F0aW9uLFxuICAgICAgb3BlcmF0b3I6IHRva2VuTG9jYXRpb24oXCI/XCIsIHRlcm5hcnkudGVzdC5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgdGVybmFyeS50cnVlRXhwci5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIH0pKSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJudWxsc2FmZXByb3BlcnR5bG9va3VwXCIgfHwgbm9kZS5raW5kID09IFwibnVsbHNhZmVtZXRob2RjYWxsXCIpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJzYWZlIG5hdmlnYXRpb25cIiwgbG9jYXRpb24pXG4gIH1cblxuICBpZiAobm9kZS5raW5kID09IFwiYmluXCIpIHtcbiAgICBjb25zdCBiaW5hcnkgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQmlufSAqLyAobm9kZSlcbiAgICBpZiAoYmluYXJ5LnR5cGUgPT0gXCIhPT1cIiAmJiBiaW5hcnkubGVmdC5raW5kID09IFwidmFyaWFibGVcIiAmJiBiaW5hcnkucmlnaHQua2luZCA9PSBcIm51bGxrZXl3b3JkXCIpIHtcbiAgICAgIGNvbnN0IG9wZXJhbmQgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLklkZW50aWZpZXJFeHByZXNzaW9ufSAqLyAoXG4gICAgICAgIGNvbnZlcnRFeHByZXNzaW9uKGJpbmFyeS5sZWZ0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCB1bmRlZmluZWQsIHRydWUpXG4gICAgICApXG5cbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJPcHRpb25hbElzUHJlc2VudFwiKSwgbG9jYXRpb24sIG9wZXJhbmR9LCB7XG4gICAgICAgIG9wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKGJpbmFyeS50eXBlLCBiaW5hcnkubGVmdC5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgYmluYXJ5LnJpZ2h0LmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoW1wiPT1cIiwgXCIhPVwiXS5pbmNsdWRlcyhiaW5hcnkudHlwZSkpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBgY29lcmNpdmUgZXF1YWxpdHkgJHtiaW5hcnkudHlwZX1gLCBsb2NhdGlvbilcbiAgICBpZiAoW1wiYW5kXCIsIFwib3JcIl0uaW5jbHVkZXMoYmluYXJ5LnR5cGUpKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYHByZWNlZGVuY2Utc2Vuc2l0aXZlIGJvb2xlYW4gJHtiaW5hcnkudHlwZX1gLCBsb2NhdGlvbilcbiAgICBpZiAoIXBocEJpbmFyeU9wZXJhdGlvbnMuaGFzKGJpbmFyeS50eXBlKSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGBiaW5hcnkgJHtiaW5hcnkudHlwZX1gLCBsb2NhdGlvbilcblxuICAgIGNvbnN0IHNlbWFudGljID0gd2l0aEFkYXB0ZWRPcGVyYXRpb24oe1xuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiQmluYXJ5RXhwcmVzc2lvblwiKSxcbiAgICAgIGxlZnQ6IGNvbnZlcnRFeHByZXNzaW9uKGJpbmFyeS5sZWZ0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSxcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgcmlnaHQ6IGNvbnZlcnRFeHByZXNzaW9uKGJpbmFyeS5yaWdodCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgICB9LCAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL29wZXJhdG9ycy5qc1wiKS5BZGFwdGVkT3BlcmF0aW9ufSAqLyAocGhwQmluYXJ5T3BlcmF0aW9ucy5nZXQoYmluYXJ5LnR5cGUpKSlcblxuICAgIHJldHVybiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh3aXRoUGFyc2VyUmFuZ2VzKHNlbWFudGljLCB7XG4gICAgICBvcGVyYXRvcjogdG9rZW5Mb2NhdGlvbihiaW5hcnkudHlwZSwgYmluYXJ5LmxlZnQubG9jPy5lbmQub2Zmc2V0ID8/IDAsIGJpbmFyeS5yaWdodC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIH0pKSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJjYWxsXCIpIHtcbiAgICBjb25zdCBjYWxsID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkNhbGx9ICovIChub2RlKVxuXG4gICAgaWYgKGNhbGwud2hhdC5raW5kID09IFwicHJvcGVydHlsb29rdXBcIikge1xuICAgICAgY29uc3QgbG9va3VwID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlByb3BlcnR5TG9va3VwfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoY2FsbC53aGF0KSlcbiAgICAgIGNvbnN0IG1lbWJlciA9IGxvb2t1cC5vZmZzZXQua2luZCA9PSBcImlkZW50aWZpZXJcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAobG9va3VwLm9mZnNldCkgOiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHJlY2VpdmVyVHlwZSA9IGtub3duRXhwcmVzc2lvblR5cGUobG9va3VwLndoYXQsIGNvbnRleHQpXG5cbiAgICAgIGlmIChtZW1iZXIgJiYgdHlwZW9mIG1lbWJlci5uYW1lID09IFwic3RyaW5nXCIgJiYgcmVjZWl2ZXJUeXBlPy5raW5kID09IFwiUmVmZXJlbmNlVHlwZVwiKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IGNvbnRleHQuY2xhc3Nlcy5nZXQocmVjZWl2ZXJUeXBlLmRlY2xhcmF0aW9uSWQpPy5tZXRob2RzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT0gbWVtYmVyLm5hbWUpXG4gICAgICAgIGNvbnN0IHVuc3VwcG9ydGVkQXJndW1lbnQgPSBjYWxsLmFyZ3VtZW50cy5maW5kKChhcmd1bWVudCkgPT5cbiAgICAgICAgICBhcmd1bWVudC5raW5kID09IFwibmFtZWRhcmd1bWVudFwiIHx8IGFyZ3VtZW50LmtpbmQgPT0gXCJ2YXJpYWRpY1wiIHx8IFJlZmxlY3QuZ2V0KGFyZ3VtZW50LCBcImJ5cmVmXCIpID09PSB0cnVlKVxuXG4gICAgICAgIGlmICh1bnN1cHBvcnRlZEFyZ3VtZW50KSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub24tcG9zaXRpb25hbCBtZXRob2QgYXJndW1lbnRcIixcbiAgICAgICAgICBub2RlTG9jYXRpb24odW5zdXBwb3J0ZWRBcmd1bWVudCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHthcmd1bWVudHM6IGNhbGwuYXJndW1lbnRzLm1hcCgoYXJndW1lbnQsIGluZGV4KSA9PlxuICAgICAgICAgIGNvbnZlcnRFeHByZXNzaW9uKGFyZ3VtZW50LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCBtZXRob2Q/LnBhcmFtZXRlcnNbaW5kZXhdPy50eXBlKSksXG4gICAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIk1ldGhvZENhbGxFeHByZXNzaW9uXCIpLCBsb2NhdGlvbiwgbWV0aG9kOiBtZXRob2Q/LmlkID8/IG1lbWJlci5uYW1lLFxuICAgICAgICByZWNlaXZlcjogY29udmVydEV4cHJlc3Npb24obG9va3VwLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpfSwge21lbWJlcjogbm9kZUxvY2F0aW9uKG1lbWJlciwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjYWxsLndoYXQua2luZCA9PSBcInByb3BlcnR5bG9va3VwXCIgJiYgY2FsbC5hcmd1bWVudHMubGVuZ3RoID09IDApIHtcbiAgICAgIGNvbnN0IGxvb2t1cCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Qcm9wZXJ0eUxvb2t1cH0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGNhbGwud2hhdCkpXG4gICAgICBjb25zdCByZWNlaXZlciA9IGxvb2t1cC53aGF0LmtpbmQgPT0gXCJ2YXJpYWJsZVwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlZhcmlhYmxlfSAqLyAobG9va3VwLndoYXQpIDogdW5kZWZpbmVkXG4gICAgICBjb25zdCBtZW1iZXIgPSBsb29rdXAub2Zmc2V0LmtpbmQgPT0gXCJpZGVudGlmaWVyXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKGxvb2t1cC5vZmZzZXQpIDogdW5kZWZpbmVkXG5cbiAgICAgIGlmIChyZWNlaXZlciAmJiB0eXBlb2YgcmVjZWl2ZXIubmFtZSA9PSBcInN0cmluZ1wiICYmIG1lbWJlcj8ubmFtZSA9PSBcImdldE1lc3NhZ2VcIiAmJiBjb250ZXh0LmJpbmRpbmdzLmdldChyZWNlaXZlci5uYW1lKT8ua2luZCA9PSBcIkVycm9yVHlwZVwiKSB7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVyTG9jYXRpb24gPSBub2RlTG9jYXRpb24ocmVjZWl2ZXIsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkVycm9yTWVzc2FnZVJlYWRcIiksXG4gICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgcmVjZWl2ZXI6IHdpdGhQYXJzZXJSYW5nZXMoe2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIklkZW50aWZpZXJFeHByZXNzaW9uXCIpLCBsb2NhdGlvbjogcmVjZWl2ZXJMb2NhdGlvbiwgbmFtZTogcmVjZWl2ZXIubmFtZX0sIHtcbiAgICAgICAgICAgIG5hbWU6IHJlY2VpdmVyTG9jYXRpb25cbiAgICAgICAgICB9KVxuICAgICAgICB9LCB7bWVtYmVyOiBub2RlTG9jYXRpb24obWVtYmVyLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gICAgICB9XG4gICAgICBpZiAobWVtYmVyICYmIHR5cGVvZiBtZW1iZXIubmFtZSA9PSBcInN0cmluZ1wiICYmIGtub3duR2VuZXJpY1JlY29yZEFjY2Vzc29yVHlwZShsb29rdXAsIGNvbnRleHQpKSB7XG4gICAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgICAgICBmaWVsZDogbWVtYmVyLm5hbWUsXG4gICAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiTWVtYmVyUmVhZFwiKSxcbiAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICByZWNlaXZlcjogY29udmVydEV4cHJlc3Npb24obG9va3VwLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gICAgICAgIH0sIHttZW1iZXI6IG5vZGVMb2NhdGlvbihtZW1iZXIsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2FsbC53aGF0LmtpbmQgPT0gXCJuYW1lXCIgJiYgY2FsbC53aGF0Lm5hbWUgPT0gXCJjb3VudFwiICYmIGNhbGwuYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7XG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICAgIGNvbGxlY3Rpb246IGNvbnZlcnRFeHByZXNzaW9uKGNhbGwuYXJndW1lbnRzWzBdLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSxcbiAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiQ29sbGVjdGlvblNpemVFeHByZXNzaW9uXCIpLFxuICAgICAgICBsb2NhdGlvblxuICAgICAgfSwge29wZXJhdG9yOiBub2RlTG9jYXRpb24oY2FsbC53aGF0LCBmaWxlbmFtZSwgc291cmNlKX0pXG4gICAgfVxuXG4gICAgaWYgKGNhbGwud2hhdC5raW5kICE9IFwibmFtZVwiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkeW5hbWljIGNhbGxcIiwgbG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGNhbGxlZE5hbWUgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTmFtZX0gKi8gKGNhbGwud2hhdClcblxuICAgIGlmIChjYWxsZWROYW1lLnJlc29sdXRpb24gIT0gXCJ1cW5cIiB8fCBjYWxsZWROYW1lLm5hbWUuaW5jbHVkZXMoXCJcXFxcXCIpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJxdWFsaWZpZWQgY2FsbFwiLCBub2RlTG9jYXRpb24oY2FsbC53aGF0LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gICAgY29uc3QgdW5zdXBwb3J0ZWRBcmd1bWVudCA9IGNhbGwuYXJndW1lbnRzLmZpbmQoKGFyZ3VtZW50KSA9PlxuICAgICAgYXJndW1lbnQua2luZCA9PSBcIm5hbWVkYXJndW1lbnRcIiB8fCBhcmd1bWVudC5raW5kID09IFwidmFyaWFkaWNcIiB8fCBSZWZsZWN0LmdldChhcmd1bWVudCwgXCJieXJlZlwiKSA9PT0gdHJ1ZSlcblxuICAgIGlmICh1bnN1cHBvcnRlZEFyZ3VtZW50KSB7XG4gICAgICBjb25zdCBkZXRhaWwgPSB1bnN1cHBvcnRlZEFyZ3VtZW50LmtpbmQgPT0gXCJuYW1lZGFyZ3VtZW50XCIgPyBcIm5hbWVkIGFyZ3VtZW50XCIgOlxuICAgICAgICB1bnN1cHBvcnRlZEFyZ3VtZW50LmtpbmQgPT0gXCJ2YXJpYWRpY1wiID8gXCJ1bnBhY2tlZCBhcmd1bWVudFwiIDogXCJieS1yZWZlcmVuY2UgYXJndW1lbnRcIlxuXG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgZGV0YWlsLCBub2RlTG9jYXRpb24odW5zdXBwb3J0ZWRBcmd1bWVudCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuXG4gICAgY29uc3QgY2FsbGVlID0gY2FsbGVkTmFtZS5uYW1lXG5cbiAgICBjb25zdCBzaWduYXR1cmUgPSBjb250ZXh0LmZ1bmN0aW9ucy5nZXQoY2FsbGVlKVxuICAgIGNvbnN0IGtub3duQXJndW1lbnRzID0gY2FsbC5hcmd1bWVudHMubWFwKChhcmd1bWVudCkgPT4ga25vd25DYWxsQXJndW1lbnRUeXBlKGFyZ3VtZW50LCBjb250ZXh0KSlcbiAgICBjb25zdCBwYXJhbWV0ZXJUeXBlcyA9IHNpZ25hdHVyZSA/IGtub3duQ2FsbFBhcmFtZXRlclR5cGVzKHNpZ25hdHVyZSwga25vd25Bcmd1bWVudHMpIDogdW5kZWZpbmVkXG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBhcmd1bWVudHM6IGNhbGwuYXJndW1lbnRzLm1hcCgoYXJndW1lbnQsIGluZGV4KSA9PlxuICAgICAgICBjb252ZXJ0RXhwcmVzc2lvbihhcmd1bWVudCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCxcbiAgICAgICAgICBwYXJhbWV0ZXJUeXBlcz8uW2luZGV4XSA/PyBzaWduYXR1cmU/LnBhcmFtZXRlcnNbaW5kZXhdPy50eXBlLFxuICAgICAgICAgIHByZXNlcnZlc0dlbmVyaWNPcHRpb25hbEV2aWRlbmNlKHNpZ25hdHVyZSwgaW5kZXgpKSksXG4gICAgICBjYWxsZWUsXG4gICAgICBraW5kOiBcIkNhbGxFeHByZXNzaW9uXCIsXG4gICAgICBsb2NhdGlvblxuICAgIH0sIHtjYWxsZWU6IG5vZGVMb2NhdGlvbihjYWxsLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgfVxuXG4gIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBub2RlLmtpbmQsIGxvY2F0aW9uKVxufVxuXG4vKipcbiAqIFJlc29sdmVzIG9ubHkgcmVzdWx0IHR5cGVzIGVzdGFibGlzaGVkIGJ5IGV4cGxpY2l0IHNpZ25hdHVyZXMgYW5kIGJpbmRpbmdzLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkV4cHJlc3Npb259IG5vZGUgLSBQYXJzZXItb3duZWQgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7UGhwQ29udmVyc2lvbkNvbnRleHR9IGNvbnRleHQgLSBUeXBlZCBjb252ZXJzaW9uIGNvbnRleHQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGUgfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvclR5cGUgfCB1bmRlZmluZWR9IEtub3duIHJlc3VsdCB0eXBlLlxuICovXG5mdW5jdGlvbiBrbm93bkV4cHJlc3Npb25UeXBlKG5vZGUsIGNvbnRleHQpIHtcbiAgaWYgKG5vZGUua2luZCA9PSBcInZhcmlhYmxlXCIpIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5WYXJpYWJsZX0gKi8gKG5vZGUpXG5cbiAgICBpZiAodmFyaWFibGUubmFtZSA9PSBcInRoaXNcIiAmJiBjb250ZXh0LmN1cnJlbnRDbGFzcz8uaWQpIHtcbiAgICAgIHJldHVybiB7ZGVjbGFyYXRpb25JZDogY29udGV4dC5jdXJyZW50Q2xhc3MuaWQsIGtpbmQ6IFwiUmVmZXJlbmNlVHlwZVwifVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhcmlhYmxlLm5hbWUgPT0gXCJzdHJpbmdcIikgcmV0dXJuIGNvbnRleHQuYmluZGluZ3MuZ2V0KHZhcmlhYmxlLm5hbWUpXG4gIH1cbiAgaWYgKG5vZGUua2luZCA9PSBcImNhbGxcIikge1xuICAgIGNvbnN0IGNhbGwgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQ2FsbH0gKi8gKG5vZGUpXG4gICAgY29uc3QgbmFtZSA9IGNhbGwud2hhdC5raW5kID09IFwibmFtZVwiICYmIHR5cGVvZiBjYWxsLndoYXQubmFtZSA9PSBcInN0cmluZ1wiID8gY2FsbC53aGF0Lm5hbWUgOiB1bmRlZmluZWRcblxuICAgIGlmIChuYW1lKSB7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBjb250ZXh0LmZ1bmN0aW9ucy5nZXQobmFtZSlcblxuICAgICAgaWYgKHNpZ25hdHVyZSkgcmV0dXJuIGtub3duQ2FsbFJldHVyblR5cGUoc2lnbmF0dXJlLCBjYWxsLmFyZ3VtZW50cy5tYXAoKGFyZ3VtZW50KSA9PiBrbm93bkV4cHJlc3Npb25UeXBlKGFyZ3VtZW50LCBjb250ZXh0KSkpXG4gICAgfVxuICAgIGlmIChjYWxsLndoYXQua2luZCA9PSBcInByb3BlcnR5bG9va3VwXCIgJiYgY2FsbC5hcmd1bWVudHMubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiBrbm93bkdlbmVyaWNSZWNvcmRBY2Nlc3NvclR5cGUoXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Qcm9wZXJ0eUxvb2t1cH0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGNhbGwud2hhdCkpLCBjb250ZXh0KVxuICAgIH1cbiAgICBpZiAoY2FsbC53aGF0LmtpbmQgPT0gXCJwcm9wZXJ0eWxvb2t1cFwiKSB7XG4gICAgICBjb25zdCBsb29rdXAgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuUHJvcGVydHlMb29rdXB9ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChjYWxsLndoYXQpKVxuICAgICAgY29uc3QgcmVjZWl2ZXIgPSBrbm93bkV4cHJlc3Npb25UeXBlKGxvb2t1cC53aGF0LCBjb250ZXh0KVxuICAgICAgY29uc3QgbWVtYmVyID0gbG9va3VwLm9mZnNldC5raW5kID09IFwiaWRlbnRpZmllclwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklkZW50aWZpZXJ9ICovIChsb29rdXAub2Zmc2V0KSA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAocmVjZWl2ZXI/LmtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIgJiYgbWVtYmVyICYmIHR5cGVvZiBtZW1iZXIubmFtZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmNsYXNzZXMuZ2V0KHJlY2VpdmVyLmRlY2xhcmF0aW9uSWQpPy5tZXRob2RzLmZpbmQoKG1ldGhvZCkgPT4gbWV0aG9kLm5hbWUgPT0gbWVtYmVyLm5hbWUpPy5yZXR1cm5UeXBlXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChub2RlLmtpbmQgPT0gXCJvZmZzZXRsb29rdXBcIikge1xuICAgIGNvbnN0IGxvb2t1cCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5PZmZzZXRMb29rdXB9ICovIChub2RlKVxuICAgIGNvbnN0IGNvbGxlY3Rpb25UeXBlID0ga25vd25FeHByZXNzaW9uVHlwZShsb29rdXAud2hhdCwgY29udGV4dClcblxuICAgIGlmIChjb2xsZWN0aW9uVHlwZT8ua2luZCA9PSBcIkxpc3RUeXBlXCIpIHJldHVybiBjb2xsZWN0aW9uVHlwZS5lbGVtZW50VHlwZVxuICAgIGlmIChjb2xsZWN0aW9uVHlwZT8ua2luZCA9PSBcIk1hcFR5cGVcIiB8fCBjb2xsZWN0aW9uVHlwZT8ua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIpIHJldHVybiBjb2xsZWN0aW9uVHlwZS52YWx1ZVR5cGVcbiAgfVxuICBpZiAobm9kZS5raW5kID09IFwibmV3XCIpIHtcbiAgICBjb25zdCBjb25zdHJ1Y3Rpb24gPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTmV3fSAqLyAobm9kZSlcbiAgICBjb25zdCBuYW1lID0gY29uc3RydWN0aW9uLndoYXQua2luZCA9PSBcIm5hbWVcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5OYW1lfSAqLyAoY29uc3RydWN0aW9uLndoYXQpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSBuYW1lICYmIHR5cGVvZiBuYW1lLm5hbWUgPT0gXCJzdHJpbmdcIiA/IGNvbnRleHQucmVjb3JkTmFtZXMuZ2V0KG5hbWUubmFtZSkgOiB1bmRlZmluZWRcblxuICAgIGlmIChkZWNsYXJhdGlvbj8uaWQpIHJldHVybiBkZWNsYXJhdGlvbi5raW5kID09IFwiQ2xhc3NEZWNsYXJhdGlvblwiXG4gICAgICA/IHtkZWNsYXJhdGlvbklkOiBkZWNsYXJhdGlvbi5pZCwga2luZDogXCJSZWZlcmVuY2VUeXBlXCJ9XG4gICAgICA6IHtkZWNsYXJhdGlvbklkOiBkZWNsYXJhdGlvbi5pZCwga2luZDogXCJSZWNvcmRUeXBlXCJ9XG4gIH1cbiAgaWYgKG5vZGUua2luZCA9PSBcInByb3BlcnR5bG9va3VwXCIpIHtcbiAgICBjb25zdCByZWFkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlByb3BlcnR5TG9va3VwfSAqLyAobm9kZSlcbiAgICBjb25zdCByZWNlaXZlciA9IGtub3duRXhwcmVzc2lvblR5cGUocmVhZC53aGF0LCBjb250ZXh0KVxuXG4gICAgaWYgKHJlYWQud2hhdC5raW5kID09IFwidmFyaWFibGVcIiAmJiAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVmFyaWFibGV9ICovIChyZWFkLndoYXQpLm5hbWUgPT0gXCJ0aGlzXCIgJiZcbiAgICAgIGNvbnRleHQuY3VycmVudENsYXNzKSB7XG4gICAgICBjb25zdCBvZmZzZXQgPSByZWFkLm9mZnNldC5raW5kID09IFwiaWRlbnRpZmllclwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklkZW50aWZpZXJ9ICovIChyZWFkLm9mZnNldCkgOiB1bmRlZmluZWRcblxuICAgICAgcmV0dXJuIGNvbnRleHQuY3VycmVudENsYXNzLmZpZWxkcy5maW5kKChmaWVsZCkgPT4gZmllbGQubmFtZSA9PSBvZmZzZXQ/Lm5hbWUpPy50eXBlXG4gICAgfVxuXG4gICAgaWYgKHJlY2VpdmVyPy5raW5kICE9IFwiUmVjb3JkVHlwZVwiKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSBjb250ZXh0LnJlY29yZHMuZ2V0KHJlY2VpdmVyLmRlY2xhcmF0aW9uSWQpXG4gICAgY29uc3Qgb2Zmc2V0ID0gcmVhZC5vZmZzZXQua2luZCA9PSBcImlkZW50aWZpZXJcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAocmVhZC5vZmZzZXQpIDogdW5kZWZpbmVkXG5cbiAgICBjb25zdCBtZW1iZXJOYW1lID0gb2Zmc2V0ICYmIHR5cGVvZiBvZmZzZXQubmFtZSA9PSBcInN0cmluZ1wiID8gb2Zmc2V0Lm5hbWUgOiB1bmRlZmluZWRcblxuICAgIGlmIChtZW1iZXJOYW1lICYmIGRlY2xhcmF0aW9uKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGRlY2xhcmF0aW9uLmZpZWxkcy5maW5kSW5kZXgoKGZpZWxkKSA9PiBmaWVsZC5uYW1lID09IG1lbWJlck5hbWUpXG5cbiAgICAgIHJldHVybiBpbnN0YW50aWF0ZWRSZWNvcmRGaWVsZFR5cGUoZGVjbGFyYXRpb24sIHJlY2VpdmVyLmFyZ3VtZW50cywgaW5kZXgpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIFJlc29sdmVzIGV4YWN0IHBhcnNlci1rbm93biBhcmd1bWVudCBldmlkZW5jZSB3aXRob3V0IGNoYW5naW5nIHRoZSBlc3RhYmxpc2hlZFxuICogZXhwcmVzc2lvbi1yZXN1bHQgY2xhc3NpZmllciB1c2VkIGZvciBvcHRpb25hbCBjb252ZXJzaW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkV4cHJlc3Npb259IG5vZGUgLSBQYXJzZXItb3duZWQgY2FsbCBhcmd1bWVudC5cbiAqIEBwYXJhbSB7UGhwQ29udmVyc2lvbkNvbnRleHR9IGNvbnRleHQgLSBUeXBlZCBjb252ZXJzaW9uIGNvbnRleHQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGUgfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvclR5cGUgfCB1bmRlZmluZWR9IEtub3duIGFyZ3VtZW50IHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGtub3duQ2FsbEFyZ3VtZW50VHlwZShub2RlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGtub3duID0ga25vd25FeHByZXNzaW9uVHlwZShub2RlLCBjb250ZXh0KVxuXG4gIGlmIChrbm93bikgcmV0dXJuIGtub3duXG4gIGlmIChub2RlLmtpbmQgPT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcihOdW1iZXIoLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk51bWJlcn0gKi8gKG5vZGUpLnZhbHVlKSkpIHtcbiAgICByZXR1cm4gc2NhbGFyVHlwZShcImludGVnZXJcIilcbiAgfVxuICBpZiAobm9kZS5raW5kID09IFwiYm9vbGVhblwiICYmIHR5cGVvZiAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQm9vbGVhbn0gKi8gKG5vZGUpLnZhbHVlID09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIHNjYWxhclR5cGUoXCJib29sZWFuXCIpXG4gIH1cbiAgaWYgKG5vZGUua2luZCA9PSBcInN0cmluZ1wiICYmIHR5cGVvZiAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuU3RyaW5nfSAqLyAobm9kZSkudmFsdWUgPT0gXCJzdHJpbmdcIiAmJlxuICAgIGhhc09ubHlVbmljb2RlU2NhbGFycygvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuU3RyaW5nfSAqLyAobm9kZSkudmFsdWUpKSB7XG4gICAgcmV0dXJuIHNjYWxhclR5cGUoXCJzdHJpbmdcIilcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBQSFAncyBleGFjdCB6ZXJvLWFyZ3VtZW50IGFjY2Vzc29yIGNhcnJpZXIgYWdhaW5zdCBpdHMgcmVjZWl2ZXInc1xuICogZ2VuZXJpYyByZWNvcmQgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuUHJvcGVydHlMb29rdXB9IGxvb2t1cCAtIFBhcnNlci1vd25lZCBtZXRob2QgbG9va3VwLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZSB8IHVuZGVmaW5lZH0gSW5zdGFudGlhdGVkIGZpZWxkIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGtub3duR2VuZXJpY1JlY29yZEFjY2Vzc29yVHlwZShsb29rdXAsIGNvbnRleHQpIHtcbiAgY29uc3QgcmVjZWl2ZXIgPSBrbm93bkV4cHJlc3Npb25UeXBlKGxvb2t1cC53aGF0LCBjb250ZXh0KVxuICBjb25zdCByZWNlaXZlclJlY29yZCA9IHJlY2VpdmVyPy5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIgPyByZWNlaXZlci52YWx1ZVR5cGUgOiByZWNlaXZlclxuXG4gIGlmIChyZWNlaXZlclJlY29yZD8ua2luZCAhPSBcIlJlY29yZFR5cGVcIikgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBkZWNsYXJhdGlvbiA9IGNvbnRleHQucmVjb3Jkcy5nZXQocmVjZWl2ZXJSZWNvcmQuZGVjbGFyYXRpb25JZClcbiAgY29uc3QgbWVtYmVyID0gbG9va3VwLm9mZnNldC5raW5kID09IFwiaWRlbnRpZmllclwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklkZW50aWZpZXJ9ICovIChsb29rdXAub2Zmc2V0KSA6IHVuZGVmaW5lZFxuICBjb25zdCBpbmRleCA9IG1lbWJlciAmJiB0eXBlb2YgbWVtYmVyLm5hbWUgPT0gXCJzdHJpbmdcIlxuICAgID8gZGVjbGFyYXRpb24/LmZpZWxkcy5maW5kSW5kZXgoKGZpZWxkKSA9PiBmaWVsZC5uYW1lID09IG1lbWJlci5uYW1lKSA/PyAtMVxuICAgIDogLTFcblxuICBpZiAoIWRlY2xhcmF0aW9uIHx8IChkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycz8ubGVuZ3RoID8/IDApID09IDAgfHwgaW5kZXggPCAwKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIGluc3RhbnRpYXRlZFJlY29yZEZpZWxkVHlwZShkZWNsYXJhdGlvbiwgcmVjZWl2ZXJSZWNvcmQuYXJndW1lbnRzLCBpbmRleClcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBvbmUgZXhwbGljaXQgUEhQIHJldHVybi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Ob2RlfSBub2RlIC0gUEhQIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZXR1cm5TdGF0ZW1lbnR9IFNlbWFudGljIHJldHVybi5cbiAqL1xuZnVuY3Rpb24gY29udmVydFJldHVybihub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKG5vZGUua2luZCAhPSBcInJldHVyblwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgbm9kZS5raW5kLCBsb2NhdGlvbilcblxuICBjb25zdCByZXR1cm5Ob2RlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlJldHVybn0gKi8gKG5vZGUpXG4gIGNvbnN0IGV4cGVjdGVkVHlwZSA9IGNvbnRleHQucmV0dXJuVHlwZT8ua2luZCA9PSBcIlR5cGVSZWZlcmVuY2VcIiAmJiBjb250ZXh0LnJldHVyblR5cGUubmFtZSA9PSBcInZvaWRcIlxuICAgID8gdW5kZWZpbmVkXG4gICAgOiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlIHwgdW5kZWZpbmVkfSAqLyAoY29udGV4dC5yZXR1cm5UeXBlKVxuXG4gIHJldHVybiB7XG4gICAgLi4uKHJldHVybk5vZGUuZXhwciA/IHtleHByZXNzaW9uOiBjb252ZXJ0RXhwcmVzc2lvbihyZXR1cm5Ob2RlLmV4cHIsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsIGV4cGVjdGVkVHlwZSl9IDoge30pLFxuICAgIGtpbmQ6IFwiUmV0dXJuU3RhdGVtZW50XCIsXG4gICAgbG9jYXRpb25cbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIG9uZSBleGFjdCBQSFAgbG9jYWwgYEB2YXJgIGNhcnJpZXIgYW5kIGltbXV0YWJpbGl0eSBtYXJrZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZX0gbm9kZSAtIEFzc2lnbm1lbnQtb3duaW5nIHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jYWwgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb24+fSByZWNvcmROYW1lcyAtIE5vbWluYWwgZGVjbGFyYXRpb25zIGJ5IHNvdXJjZSBuYW1lLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5UeXBlUGFyYW1ldGVyPn0gW3R5cGVQYXJhbWV0ZXJzXSAtIERlY2xhcmF0aW9uLXNjb3BlZCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMge3tpbW11dGFibGU6IGJvb2xlYW4sIHR5cGU6IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSB8IHVuZGVmaW5lZH0gTWV0YWRhdGEgd2hlbiBwcmVzZW50LlxuICovXG5mdW5jdGlvbiBsb2NhbE1ldGFkYXRhKG5vZGUsIG5hbWUsIGZpbGVuYW1lLCBzb3VyY2UsIHJlY29yZE5hbWVzLCB0eXBlUGFyYW1ldGVycyA9IG5ldyBNYXAoKSkge1xuICBjb25zdCBjb21tZW50cyA9IG5vZGUubGVhZGluZ0NvbW1lbnRzID8/IFtdXG4gIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50cy5hdCgtMSlcblxuICBpZiAoIWNvbW1lbnQgfHwgY29tbWVudC5raW5kICE9IFwiY29tbWVudGJsb2NrXCIgfHwgIWNvbW1lbnQubG9jIHx8ICFub2RlLmxvYykgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IGdhcCA9IHNvdXJjZS5zbGljZShjb21tZW50LmxvYy5lbmQub2Zmc2V0LCBub2RlLmxvYy5zdGFydC5vZmZzZXQpXG5cbiAgaWYgKCEvXlxccyokL3UudGVzdChnYXApIHx8IChnYXAubWF0Y2goL1xcbi9ndSk/Lmxlbmd0aCA/PyAwKSA+IDEpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBibG9jayA9IHBhcnNlQ29tbWVudChjb21tZW50LnZhbHVlKVswXVxuICBjb25zdCB0YWdzID0gYmxvY2s/LnRhZ3MgPz8gW11cbiAgY29uc3QgdmFyaWFibGVzID0gdGFncy5maWx0ZXIoKHRhZykgPT4gdGFnLnRhZyA9PSBcInZhclwiKVxuICBjb25zdCBpbW11dGFibGUgPSB0YWdzLmZpbHRlcigodGFnKSA9PiB0YWcudGFnID09IFwic2VtYW50aWZvbGQtaW1tdXRhYmxlXCIpXG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKHZhcmlhYmxlcy5sZW5ndGggPT0gMCAmJiBpbW11dGFibGUubGVuZ3RoID09IDApIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBleGFjdFZhcmlhYmxlID0gdmFyaWFibGVzLmxlbmd0aCA9PSAxICYmIHZhcmlhYmxlc1swXS50eXBlID09IFwiXCIgJiYgdmFyaWFibGVzWzBdLmRlc2NyaXB0aW9uID09IGAkJHtuYW1lfWBcbiAgY29uc3QgZXhhY3RJbW11dGFibGUgPSBpbW11dGFibGUubGVuZ3RoIDw9IDEgJiYgaW1tdXRhYmxlLmV2ZXJ5KCh0YWcpID0+IHRhZy5uYW1lID09IFwiXCIgJiYgdGFnLnR5cGUgPT0gXCJcIiAmJiB0YWcuZGVzY3JpcHRpb24gPT0gXCJcIilcbiAgY29uc3Qga25vd25UYWdzID0gdGFncy5ldmVyeSgodGFnKSA9PiB0YWcudGFnID09IFwidmFyXCIgfHwgdGFnLnRhZyA9PSBcInNlbWFudGlmb2xkLWltbXV0YWJsZVwiKVxuXG4gIGlmICghZXhhY3RWYXJpYWJsZSB8fCAhZXhhY3RJbW11dGFibGUgfHwgIWtub3duVGFncykge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm1hbGZvcm1lZCBsb2NhbCB0eXBlIG1ldGFkYXRhXCIsIGxvY2F0aW9uKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpbW11dGFibGU6IGltbXV0YWJsZS5sZW5ndGggPT0gMSxcbiAgICB0eXBlOiBkb2N1bWVudGVkVmFsdWVUeXBlKHtcbiAgICAgIGxhbmd1YWdlOiBcInBocFwiLFxuICAgICAgbG9jYXRpb246IGNvbW1lbnRUYWdMb2NhdGlvbihjb21tZW50LCB2YXJpYWJsZXNbMF0sIFwibmFtZVwiLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIG93bmVyTG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgcmVjb3JkczogcmVjb3JkTmFtZXMsXG4gICAgICBzb3VyY2UsXG4gICAgICBzb3VyY2VUeXBlOiB2YXJpYWJsZXNbMF0ubmFtZSxcbiAgICAgIHN1YmplY3Q6IGBMb2NhbCAnJHtuYW1lfSdgLFxuICAgICAgdHlwZVBhcmFtZXRlcnNcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgb25lIFBIUCBsb2NhbCBkZWNsYXJhdGlvbiBvciBhc3NpZ25tZW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGV9IG5vZGUgLSBQSFAgc3RhdGVtZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEBwYXJhbSB7UGhwQ29udmVyc2lvbkNvbnRleHR9IGNvbnRleHQgLSBUeXBlZCBjb252ZXJzaW9uIGNvbnRleHQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuTG9jYWxTdGF0ZW1lbnQgfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Qcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudH0gU2VtYW50aWMgbG9jYWwgb3IgcHJpdmF0ZS1maWVsZCBzdGF0ZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRMb2NhbFN0YXRlbWVudChub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKG5vZGUua2luZCAhPSBcImV4cHJlc3Npb25zdGF0ZW1lbnRcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIG5vZGUua2luZCwgbG9jYXRpb24pXG5cbiAgY29uc3QgZXhwcmVzc2lvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5FeHByZXNzaW9uU3RhdGVtZW50fSAqLyAobm9kZSkuZXhwcmVzc2lvblxuXG4gIGlmIChleHByZXNzaW9uLmtpbmQgIT0gXCJhc3NpZ25cIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGV4cHJlc3Npb24ua2luZCwgbm9kZUxvY2F0aW9uKGV4cHJlc3Npb24sIGZpbGVuYW1lLCBzb3VyY2UpKVxuXG4gIGNvbnN0IGFzc2lnbm1lbnQgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQXNzaWdufSAqLyAoZXhwcmVzc2lvbilcblxuICBpZiAoYXNzaWdubWVudC5vcGVyYXRvciAhPSBcIj1cIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGBhc3NpZ25tZW50ICR7YXNzaWdubWVudC5vcGVyYXRvcn1gLCBsb2NhdGlvbilcbiAgaWYgKGFzc2lnbm1lbnQubGVmdC5raW5kID09IFwicHJvcGVydHlsb29rdXBcIiAmJiBjb250ZXh0LmN1cnJlbnRDbGFzcykge1xuICAgIGNvbnN0IGxvb2t1cCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Qcm9wZXJ0eUxvb2t1cH0gKi8gKGFzc2lnbm1lbnQubGVmdClcbiAgICBjb25zdCByZWNlaXZlciA9IGxvb2t1cC53aGF0LmtpbmQgPT0gXCJ2YXJpYWJsZVwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlZhcmlhYmxlfSAqLyAobG9va3VwLndoYXQpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgbWVtYmVyID0gbG9va3VwLm9mZnNldC5raW5kID09IFwiaWRlbnRpZmllclwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklkZW50aWZpZXJ9ICovIChsb29rdXAub2Zmc2V0KSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGZpZWxkID0gcmVjZWl2ZXI/Lm5hbWUgPT0gXCJ0aGlzXCIgJiYgbWVtYmVyICYmIHR5cGVvZiBtZW1iZXIubmFtZSA9PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbnRleHQuY3VycmVudENsYXNzLmZpZWxkcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09IG1lbWJlci5uYW1lKVxuICAgICAgOiB1bmRlZmluZWRcblxuICAgIGlmICghZmllbGQpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInByaXZhdGUgZmllbGQgd3JpdGUgb3V0c2lkZSB0aGUgZGVjbGFyaW5nIHJlY2VpdmVyXCIsIG5vZGVMb2NhdGlvbihhc3NpZ25tZW50LmxlZnQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtleHByZXNzaW9uOiBjb252ZXJ0RXhwcmVzc2lvbihhc3NpZ25tZW50LnJpZ2h0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCBmaWVsZC50eXBlKSxcbiAgICAgIGZpZWxkOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGZpZWxkLmlkKSwga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcIiksIGxvY2F0aW9uLFxuICAgICAgcmVjZWl2ZXI6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjZWl2ZXJFeHByZXNzaW9ufSAqLyAoXG4gICAgICAgIGNvbnZlcnRFeHByZXNzaW9uKGxvb2t1cC53aGF0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSl9LFxuICAgIHttZW1iZXI6IG5vZGVMb2NhdGlvbigvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKG1lbWJlciksIGZpbGVuYW1lLCBzb3VyY2UpLCBvcGVyYXRvcjogdG9rZW5Mb2NhdGlvbihcIj1cIiwgYXNzaWdubWVudC5sZWZ0LmxvYz8uZW5kLm9mZnNldCA/PyAwLFxuICAgICAgYXNzaWdubWVudC5yaWdodC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gIH1cbiAgaWYgKGFzc2lnbm1lbnQubGVmdC5raW5kICE9IFwidmFyaWFibGVcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGFzc2lnbm1lbnQubGVmdC5raW5kLCBub2RlTG9jYXRpb24oYXNzaWdubWVudC5sZWZ0LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgaWYgKGFzc2lnbm1lbnQucmlnaHQua2luZCA9PSBcInRocm93XCIpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJ0aHJvdyBleHByZXNzaW9uIGluIGEgdmFsdWUgY29udGV4dFwiLCBub2RlTG9jYXRpb24oYXNzaWdubWVudC5yaWdodCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cblxuICBjb25zdCB2YXJpYWJsZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5WYXJpYWJsZX0gKi8gKGFzc2lnbm1lbnQubGVmdClcbiAgY29uc3QgdGFyZ2V0TG9jYXRpb24gPSBub2RlTG9jYXRpb24odmFyaWFibGUsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKHR5cGVvZiB2YXJpYWJsZS5uYW1lICE9IFwic3RyaW5nXCIgfHwgdmFyaWFibGUuY3VybHkpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImR5bmFtaWMgdmFyaWFibGVcIiwgdGFyZ2V0TG9jYXRpb24pXG5cbiAgY29uc3QgbWV0YWRhdGEgPSBsb2NhbE1ldGFkYXRhKG5vZGUsIHZhcmlhYmxlLm5hbWUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQucmVjb3JkTmFtZXMsIGNvbnRleHQudHlwZVBhcmFtZXRlcnMpXG5cbiAgaWYgKG1ldGFkYXRhKSB7XG4gICAgbGV0IGRlY2xhcmVkVHlwZSA9IG1ldGFkYXRhLnR5cGVcbiAgICBsZXQgb3JkZXJlZCA9IGZhbHNlXG5cbiAgICBpZiAoZGVjbGFyZWRUeXBlLmtpbmQgPT0gXCJNYXBUeXBlXCIgJiYgY29udGV4dC5vcmRlcmVkTWFwRGVjbGFyYXRpb25zPy5oYXMoYXNzaWdubWVudCkgJiYgYXNzaWdubWVudC5yaWdodC5raW5kID09IFwiYXJyYXlcIikge1xuICAgICAgZGVjbGFyZWRUeXBlID0gb3JkZXJlZE1hcFR5cGVGcm9tTWFwKGRlY2xhcmVkVHlwZSwgbG9jYXRpb24pXG4gICAgICBvcmRlcmVkID0gdHJ1ZVxuICAgIH1cbiAgICBjb25zdCBpbml0aWFsaXplciA9IGNvbnZlcnRFeHByZXNzaW9uKGFzc2lnbm1lbnQucmlnaHQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsIGRlY2xhcmVkVHlwZSlcblxuICAgIGNvbnRleHQuYmluZGluZ3Muc2V0KHZhcmlhYmxlLm5hbWUsIGRlY2xhcmVkVHlwZSlcbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBpbml0aWFsaXplcixcbiAgICAgIGtpbmQ6IFwiTG9jYWxEZWNsYXJhdGlvblwiLFxuICAgICAgbG9jYXRpb24sXG4gICAgICBtdXRhYmxlOiBvcmRlcmVkID8gZmFsc2UgOiAhbWV0YWRhdGEuaW1tdXRhYmxlLFxuICAgICAgbmFtZTogdmFyaWFibGUubmFtZSxcbiAgICAgIHR5cGU6IGRlY2xhcmVkVHlwZVxuICAgIH0sIHtcbiAgICAgIG5hbWU6IHRhcmdldExvY2F0aW9uLFxuICAgICAgb3BlcmF0b3I6IHRva2VuTG9jYXRpb24oXCI9XCIsIGFzc2lnbm1lbnQubGVmdC5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgYXNzaWdubWVudC5yaWdodC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIH0pXG4gIH1cblxuICBjb25zdCBpbmZlcnJlZFR5cGUgPSBrbm93bkV4cHJlc3Npb25UeXBlKGFzc2lnbm1lbnQucmlnaHQsIGNvbnRleHQpXG5cbiAgaWYgKGluZmVycmVkVHlwZT8ua2luZCA9PSBcIlJlY29yZFR5cGVcIiB8fCBpbmZlcnJlZFR5cGU/LmtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIgfHxcbiAgICBpbmZlcnJlZFR5cGU/LmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiKSB7XG4gICAgY29uc3QgaW5pdGlhbGl6ZXIgPSBjb252ZXJ0RXhwcmVzc2lvbihhc3NpZ25tZW50LnJpZ2h0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCBpbmZlcnJlZFR5cGUpXG5cbiAgICBjb250ZXh0LmJpbmRpbmdzLnNldCh2YXJpYWJsZS5uYW1lLCBpbmZlcnJlZFR5cGUpXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgaW5pdGlhbGl6ZXIsXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJMb2NhbERlY2xhcmF0aW9uXCIpLFxuICAgICAgbG9jYXRpb24sXG4gICAgICBtdXRhYmxlOiBmYWxzZSxcbiAgICAgIG5hbWU6IHZhcmlhYmxlLm5hbWUsXG4gICAgICB0eXBlOiBpbmZlcnJlZFR5cGVcbiAgICB9LCB7XG4gICAgICBuYW1lOiB0YXJnZXRMb2NhdGlvbixcbiAgICAgIG9wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiPVwiLCBhc3NpZ25tZW50LmxlZnQubG9jPy5lbmQub2Zmc2V0ID8/IDAsIGFzc2lnbm1lbnQucmlnaHQubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgYmluZGluZ1R5cGUgPSBjb250ZXh0LmJpbmRpbmdzLmdldCh2YXJpYWJsZS5uYW1lKVxuXG4gIGlmICghYmluZGluZ1R5cGUpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgTG9jYWwgJyR7dmFyaWFibGUubmFtZX0nYCwgbG9jYXRpb24pXG5cbiAgY29uc3QgdGFyZ2V0ID0gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiksIGxvY2F0aW9uOiB0YXJnZXRMb2NhdGlvbiwgbmFtZTogdmFyaWFibGUubmFtZX0sIHtcbiAgICBuYW1lOiB0YXJnZXRMb2NhdGlvblxuICB9KVxuICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRFeHByZXNzaW9uKGFzc2lnbm1lbnQucmlnaHQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsXG4gICAgYmluZGluZ1R5cGUua2luZCA9PSBcIkVycm9yVHlwZVwiID8gdW5kZWZpbmVkIDogYmluZGluZ1R5cGUpXG5cbiAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIGV4cHJlc3Npb246IHZhbHVlLFxuICAgIGtpbmQ6IFwiQXNzaWdubWVudFN0YXRlbWVudFwiLFxuICAgIGxvY2F0aW9uLFxuICAgIHRhcmdldFxuICB9LCB7XG4gICAgb3BlcmF0b3I6IHRva2VuTG9jYXRpb24oXCI9XCIsIGFzc2lnbm1lbnQubGVmdC5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgYXNzaWdubWVudC5yaWdodC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKVxuICB9KVxufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBleGhhdXN0aXZlIFBIUCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZX0gbm9kZSAtIFBIUCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IFNlbWFudGljIHN0YXRlbWVudC5cbiAqL1xuZnVuY3Rpb24gY29udmVydFN0YXRlbWVudChub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIGlmIChub2RlLmtpbmQgPT0gXCJyZXR1cm5cIikgcmV0dXJuIGNvbnZlcnRSZXR1cm4obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgaWYgKG5vZGUua2luZCA9PSBcImlmXCIpIHJldHVybiBjb252ZXJ0SWYoLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklmfSAqLyAobm9kZSksIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gIGlmIChub2RlLmtpbmQgPT0gXCJ0aHJvd1wiKSByZXR1cm4gY29udmVydFBocFJhaXNlKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gIGlmIChub2RlLmtpbmQgPT0gXCJ0cnlcIikgcmV0dXJuIGNvbnZlcnRQaHBUcnkobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgaWYgKG5vZGUua2luZCA9PSBcIndoaWxlXCIpIHJldHVybiBjb252ZXJ0V2hpbGUoLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLldoaWxlfSAqLyAobm9kZSksIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gIGlmIChub2RlLmtpbmQgPT0gXCJmb3JlYWNoXCIpIHJldHVybiBjb252ZXJ0Rm9yRWFjaCgvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRm9yZWFjaH0gKi8gKG5vZGUpLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuICBpZiAobm9kZS5raW5kID09IFwiYnJlYWtcIiB8fCBub2RlLmtpbmQgPT0gXCJjb250aW51ZVwiKSB7XG4gICAgY29uc3QgY29udHJvbCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5CcmVhayB8IGltcG9ydChcInBocC1wYXJzZXJcIikuQ29udGludWV9ICovIChub2RlKVxuXG4gICAgaWYgKGNvbnRyb2wubGV2ZWwpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBgJHtub2RlLmtpbmR9IGxldmVsYCwgbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIGNvbnN0IGxvY2F0aW9uID0gdG9rZW5Mb2NhdGlvbihub2RlLmtpbmQsIG5vZGUubG9jPy5zdGFydC5vZmZzZXQgPz8gMCwgbm9kZS5sb2M/LmVuZC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7XCJCcmVha1N0YXRlbWVudFwiIHwgXCJDb250aW51ZVN0YXRlbWVudFwifSAqLyAobm9kZS5raW5kID09IFwiYnJlYWtcIiA/IFwiQnJlYWtTdGF0ZW1lbnRcIiA6IFwiQ29udGludWVTdGF0ZW1lbnRcIiksXG4gICAgICBsb2NhdGlvblxuICAgIH0sIHtrZXl3b3JkOiBsb2NhdGlvbn0pXG4gIH1cbiAgaWYgKG5vZGUua2luZCA9PSBcImVjaG9cIikgcmV0dXJuIGNvbnZlcnRQcmludCgvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRWNob30gKi8gKG5vZGUpLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuICBpZiAobm9kZS5raW5kID09IFwiZXhwcmVzc2lvbnN0YXRlbWVudFwiKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5FeHByZXNzaW9uU3RhdGVtZW50fSAqLyAobm9kZSkuZXhwcmVzc2lvblxuXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcImNhbGxcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhwcmVzc2lvbjogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DYWxsRXhwcmVzc2lvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLk1ldGhvZENhbGxFeHByZXNzaW9ufSAqLyAoXG4gICAgICAgICAgY29udmVydEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgICAgICAgKSxcbiAgICAgICAga2luZDogXCJFeHByZXNzaW9uU3RhdGVtZW50XCIsXG4gICAgICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29udmVydExvY2FsU3RhdGVtZW50KG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gIH1cblxuICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgbm9kZS5raW5kLCBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG59XG5cbi8qKlxuICogQ29udmVydHMgZXhhY3QgYHRocm93IG5ldyBEZWNsYXJlZEVycm9yKG1lc3NhZ2UpYC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Ob2RlfSBub2RlIC0gUEhQIHRocm93IG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGxleGljYWwgY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SYWlzZVN0YXRlbWVudCB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJldGhyb3dTdGF0ZW1lbnR9IFNlbWFudGljIHJhaXNlIG9yIHJldGhyb3cuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRQaHBSYWlzZShub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGNvbnN0cnVjdGlvbiA9IFJlZmxlY3QuZ2V0KG5vZGUsIFwid2hhdFwiKVxuXG4gIGlmIChjb25zdHJ1Y3Rpb24/LmtpbmQgPT0gXCJ2YXJpYWJsZVwiICYmIHR5cGVvZiBjb25zdHJ1Y3Rpb24ubmFtZSA9PSBcInN0cmluZ1wiICYmICFjb25zdHJ1Y3Rpb24uY3VybHkgJiZcbiAgICBjb250ZXh0LmJpbmRpbmdzLmdldChjb25zdHJ1Y3Rpb24ubmFtZSk/LmtpbmQgPT0gXCJFcnJvclR5cGVcIiAmJiBjb250ZXh0LmNhdGNoQmluZGluZ05hbWVzPy5oYXMoY29uc3RydWN0aW9uLm5hbWUpKSB7XG4gICAgY29uc3QgYmluZGluZ05vZGUgPSBjb250ZXh0LmNhdGNoQmluZGluZ05vZGVzPy5nZXQoY29uc3RydWN0aW9uLm5hbWUpXG5cbiAgICBpZiAoIWJpbmRpbmdOb2RlKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJ0aHJvdyBvZiBhIGNhdGNoIGJpbmRpbmcgd2l0aG91dCBhbiBleGFjdCBoYW5kbGVyIGJpbmRpbmdcIiwgbG9jYXRpb24pXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgYmluZGluZzogY29uc3RydWN0aW9uLm5hbWUsXG4gICAgICBiaW5kaW5nTm9kZSxcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlJldGhyb3dTdGF0ZW1lbnRcIiksXG4gICAgICBsb2NhdGlvblxuICAgIH0sIHtrZXl3b3JkOiB0b2tlbkxvY2F0aW9uKFwidGhyb3dcIiwgbm9kZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCBjb25zdHJ1Y3Rpb24ubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICB9XG4gIGlmICghY29uc3RydWN0aW9uIHx8IGNvbnN0cnVjdGlvbi5raW5kICE9IFwibmV3XCIgfHwgY29uc3RydWN0aW9uLndoYXQ/LmtpbmQgIT0gXCJuYW1lXCIgfHxcbiAgICBjb25zdHJ1Y3Rpb24ud2hhdC5yZXNvbHV0aW9uICE9IFwidXFuXCIgfHwgIWNvbnRleHQuZXJyb3JOYW1lcy5oYXMoY29uc3RydWN0aW9uLndoYXQubmFtZSkgfHxcbiAgICAhQXJyYXkuaXNBcnJheShjb25zdHJ1Y3Rpb24uYXJndW1lbnRzKSB8fCBjb25zdHJ1Y3Rpb24uYXJndW1lbnRzLmxlbmd0aCAhPSAxIHx8XG4gICAgY29uc3RydWN0aW9uLmFyZ3VtZW50c1swXS5raW5kID09IFwibmFtZWRhcmd1bWVudFwiIHx8IGNvbnN0cnVjdGlvbi5hcmd1bWVudHNbMF0ua2luZCA9PSBcInZhcmlhZGljXCIpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJ0aHJvdyBvdGhlciB0aGFuIGV4YWN0IGRlY2xhcmVkIGVycm9yIGNvbnN0cnVjdGlvblwiLCBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBkZWNsYXJhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbn0gKi8gKGNvbnRleHQuZXJyb3JOYW1lcy5nZXQoY29uc3RydWN0aW9uLndoYXQubmFtZSkpXG4gIGNvbnN0IHR5cGVMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihjb25zdHJ1Y3Rpb24ud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgZXJyb3I6IHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgZXJyb3I6IHdpdGhQYXJzZXJSYW5nZXMoe2RlY2xhcmF0aW9uSWQ6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJFcnJvclR5cGVcIil9LCB7dHlwZTogdHlwZUxvY2F0aW9ufSksXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJFcnJvckNvbnN0cnVjdGlvblwiKSxcbiAgICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24oY29uc3RydWN0aW9uLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIG1lc3NhZ2U6IGNvbnZlcnRFeHByZXNzaW9uKGNvbnN0cnVjdGlvbi5hcmd1bWVudHNbMF0sIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gICAgfSwge3R5cGU6IHR5cGVMb2NhdGlvbn0pLFxuICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlJhaXNlU3RhdGVtZW50XCIpLFxuICAgIGxvY2F0aW9uXG4gIH0sIHtrZXl3b3JkOiB0b2tlbkxvY2F0aW9uKFwidGhyb3dcIiwgbm9kZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCBjb25zdHJ1Y3Rpb24ubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBleGFjdCB0eXBlZCBjYXRjaCB3aXRoIG5vIGZpbmFsbHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZX0gbm9kZSAtIFBIUCB0cnkgbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge1BocENvbnZlcnNpb25Db250ZXh0fSBjb250ZXh0IC0gVHlwZWQgbGV4aWNhbCBjb250ZXh0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlRyeVN0YXRlbWVudH0gU2VtYW50aWMgZXhhY3QgaGFuZGxlci5cbiAqL1xuZnVuY3Rpb24gY29udmVydFBocFRyeShub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGNhdGNoZXMgPSBSZWZsZWN0LmdldChub2RlLCBcImNhdGNoZXNcIilcbiAgY29uc3QgYm9keSA9IFJlZmxlY3QuZ2V0KG5vZGUsIFwiYm9keVwiKVxuICBjb25zdCBhbHdheXMgPSBSZWZsZWN0LmdldChub2RlLCBcImFsd2F5c1wiKVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShjYXRjaGVzKSB8fCAoY2F0Y2hlcy5sZW5ndGggPT0gMCAmJiAhYWx3YXlzKSB8fCBib2R5Py5raW5kICE9IFwiYmxvY2tcIikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInRyeSB3aXRob3V0IHR5cGVkIGNhdGNoZXMgb3IgZmluYWxseVwiLCBsb2NhdGlvbilcbiAgfVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNhdGNoSGFuZGxlcltdfSAqL1xuICBjb25zdCBoYW5kbGVycyA9IFtdXG4gIGNvbnN0IHNlZW5IYW5kbGVyTmFtZXMgPSBuZXcgU2V0KGNvbnRleHQuY2F0Y2hCaW5kaW5nTmFtZXMgPz8gW10pXG5cbiAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGNhdGNoZXMpIHtcbiAgICBjb25zdCBjYXVnaHQgPSBoYW5kbGVyLndoYXQ/LlswXVxuICAgIGNvbnN0IGJpbmRpbmcgPSBoYW5kbGVyLnZhcmlhYmxlXG5cbiAgICBpZiAoaGFuZGxlci53aGF0Py5sZW5ndGggIT0gMSB8fCBjYXVnaHQ/LmtpbmQgIT0gXCJuYW1lXCIgfHwgY2F1Z2h0LnJlc29sdXRpb24gIT0gXCJ1cW5cIiB8fFxuICAgICAgIWNvbnRleHQuZXJyb3JOYW1lcy5oYXMoY2F1Z2h0Lm5hbWUpIHx8IGJpbmRpbmc/LmtpbmQgIT0gXCJ2YXJpYWJsZVwiIHx8IHR5cGVvZiBiaW5kaW5nLm5hbWUgIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgYmluZGluZy5jdXJseSB8fCBoYW5kbGVyLmJvZHk/LmtpbmQgIT0gXCJibG9ja1wiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJicm9hZCwgbXVsdGlwbGUsIG9yIG1hbGZvcm1lZCBjYXRjaFwiLCBub2RlTG9jYXRpb24oaGFuZGxlciwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIGlmIChzZWVuSGFuZGxlck5hbWVzLmhhcyhiaW5kaW5nLm5hbWUpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYGNhdGNoIGJpbmRpbmcgJyR7YmluZGluZy5uYW1lfScgc2hhZG93cyBhbiBvdXRlciBoYW5kbGVyIGJpbmRpbmdgLCBub2RlTG9jYXRpb24oYmluZGluZywgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIHNlZW5IYW5kbGVyTmFtZXMuYWRkKGJpbmRpbmcubmFtZSlcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbn0gKi8gKGNvbnRleHQuZXJyb3JOYW1lcy5nZXQoY2F1Z2h0Lm5hbWUpKVxuICAgIGNvbnN0IGNhdWdodExvY2F0aW9uID0gbm9kZUxvY2F0aW9uKGNhdWdodCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICBjb25zdCBjYXRjaFR5cGUgPSB3aXRoUGFyc2VyUmFuZ2VzKHtkZWNsYXJhdGlvbklkOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiRXJyb3JUeXBlXCIpfSwge1xuICAgICAgdHlwZTogY2F1Z2h0TG9jYXRpb25cbiAgICB9KVxuICAgIGNvbnN0IGNhdGNoQ29udGV4dCA9IHsuLi5jb250ZXh0LCBiaW5kaW5nczogbmV3IE1hcChjb250ZXh0LmJpbmRpbmdzKSwgY2F0Y2hCaW5kaW5nTmFtZXM6IG5ldyBTZXQoc2VlbkhhbmRsZXJOYW1lcyksXG4gICAgICBjYXRjaEJpbmRpbmdOb2RlczogbmV3IE1hcChjb250ZXh0LmNhdGNoQmluZGluZ05vZGVzKX1cblxuICAgIGNhdGNoQ29udGV4dC5iaW5kaW5ncy5zZXQoYmluZGluZy5uYW1lLCBjYXRjaFR5cGUpXG4gICAgY29uc3QgY2F0Y2hCaW5kaW5nTm9kZSA9IHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiQ2F0Y2hCaW5kaW5nXCIpLFxuICAgICAgbG9jYXRpb246IG5vZGVMb2NhdGlvbihiaW5kaW5nLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIG11dGFibGU6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChmYWxzZSksXG4gICAgICBuYW1lOiBiaW5kaW5nLm5hbWUsXG4gICAgICB0eXBlOiBjYXRjaFR5cGVcbiAgICB9LCB7bmFtZTogbm9kZUxvY2F0aW9uKGJpbmRpbmcsIGZpbGVuYW1lLCBzb3VyY2UpfSlcblxuICAgIGNhdGNoQ29udGV4dC5jYXRjaEJpbmRpbmdOb2Rlcy5zZXQoYmluZGluZy5uYW1lLCBjYXRjaEJpbmRpbmdOb2RlKVxuICAgIGhhbmRsZXJzLnB1c2god2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBjYXRjaEJpbmRpbmc6IGNhdGNoQmluZGluZ05vZGUsXG4gICAgICBjYXRjaEJvZHk6IGNvbnZlcnRCbG9jayhoYW5kbGVyLmJvZHksIGZpbGVuYW1lLCBzb3VyY2UsIGNhdGNoQ29udGV4dCksXG4gICAgICBjYXRjaFR5cGUsXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJDYXRjaEhhbmRsZXJcIiksXG4gICAgICBsb2NhdGlvbjogbm9kZUxvY2F0aW9uKGhhbmRsZXIsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgfSwge2NhdGNoOiBub2RlTG9jYXRpb24oaGFuZGxlciwgZmlsZW5hbWUsIHNvdXJjZSl9KSlcbiAgfVxuICBjb25zdCBib2R5Q29udGV4dCA9IHsuLi5jb250ZXh0LCBiaW5kaW5nczogbmV3IE1hcChjb250ZXh0LmJpbmRpbmdzKX1cbiAgY29uc3Qgc2VtYW50aWMgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlRyeVN0YXRlbWVudH0gKi8gKHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIGJvZHk6IGNvbnZlcnRCbG9jayhib2R5LCBmaWxlbmFtZSwgc291cmNlLCBib2R5Q29udGV4dCksXG4gICAgaGFuZGxlcnMsXG4gICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiVHJ5U3RhdGVtZW50XCIpLFxuICAgIGxvY2F0aW9uXG4gIH0sIHt0cnk6IHRva2VuTG9jYXRpb24oXCJ0cnlcIiwgbm9kZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCBib2R5LmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpfSkpXG5cbiAgaWYgKGFsd2F5cykge1xuICAgIGlmIChhbHdheXMua2luZCAhPSBcImJsb2NrXCIpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm1hbGZvcm1lZCBmaW5hbGx5IGJsb2NrXCIsIG5vZGVMb2NhdGlvbihhbHdheXMsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIHNlbWFudGljLmZpbmFsbHlCb2R5ID0gY29udmVydEJsb2NrKGFsd2F5cywgZmlsZW5hbWUsIHNvdXJjZSwgYm9keUNvbnRleHQpXG4gICAgc2V0UGFyc2VyUmFuZ2VzKHNlbWFudGljLCB7ZmluYWxseTogbm9kZUxvY2F0aW9uKGFsd2F5cywgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICB0cnk6IHRva2VuTG9jYXRpb24oXCJ0cnlcIiwgbm9kZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCBib2R5LmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgfVxuICByZXR1cm4gc2VtYW50aWNcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBleGFjdCBibG9jay1mb3JtIFBIUCBgZm9yZWFjaCAoJGxpc3QgYXMgJHZhbHVlKWAuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuRm9yZWFjaH0gbm9kZSAtIFBIUCBmb3JlYWNoIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Gb3JFYWNoU3RhdGVtZW50IHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRm9yRWFjaE1hcFN0YXRlbWVudH0gU2VtYW50aWMgbG9vcC5cbiAqL1xuZnVuY3Rpb24gY29udmVydEZvckVhY2gobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIGlmIChub2RlLnNob3J0Rm9ybSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiYWx0ZXJuYXRpdmUgZm9yZWFjaCBzeW50YXhcIiwgbG9jYXRpb24pXG4gIGlmIChub2RlLnZhbHVlLmtpbmQgIT0gXCJ2YXJpYWJsZVwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJmb3JlYWNoIGRlc3RydWN0dXJpbmdcIiwgbm9kZUxvY2F0aW9uKG5vZGUudmFsdWUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICBjb25zdCB2YXJpYWJsZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5WYXJpYWJsZX0gKi8gKG5vZGUudmFsdWUpXG5cbiAgaWYgKFJlZmxlY3QuZ2V0KHZhcmlhYmxlLCBcImJ5cmVmXCIpID09PSB0cnVlKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJieS1yZWZlcmVuY2UgZm9yZWFjaFwiLCBub2RlTG9jYXRpb24odmFyaWFibGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICBpZiAodHlwZW9mIHZhcmlhYmxlLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCB2YXJpYWJsZS5jdXJseSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZHluYW1pYyBmb3JlYWNoIGJpbmRpbmdcIiwgbm9kZUxvY2F0aW9uKHZhcmlhYmxlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgaWYgKCFub2RlLmJvZHkgfHwgbm9kZS5ib2R5LmtpbmQgIT0gXCJibG9ja1wiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZm9yZWFjaCB3aXRob3V0IGJsb2NrIGJvZHlcIiwgbm9kZS5ib2R5ID8gbm9kZUxvY2F0aW9uKG5vZGUuYm9keSwgZmlsZW5hbWUsIHNvdXJjZSkgOiBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBib2R5ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJsb2NrfSAqLyAobm9kZS5ib2R5KVxuICBjb25zdCBjb2xsZWN0aW9uVHlwZSA9IGl0ZXJhdGlvbk9wZXJhbmRUeXBlKGtub3duRXhwcmVzc2lvblR5cGUobm9kZS5zb3VyY2UsIGNvbnRleHQpKVxuXG4gIGlmIChub2RlLmtleSkge1xuICAgIGlmIChub2RlLmtleS5raW5kICE9IFwidmFyaWFibGVcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZm9yZWFjaCBrZXkgYmluZGluZyBzaGFwZVwiLCBub2RlTG9jYXRpb24obm9kZS5rZXksIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIGNvbnN0IGtleVZhcmlhYmxlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlZhcmlhYmxlfSAqLyAobm9kZS5rZXkpXG5cbiAgICBpZiAoUmVmbGVjdC5nZXQoa2V5VmFyaWFibGUsIFwiYnlyZWZcIikgPT09IHRydWUgfHwgdHlwZW9mIGtleVZhcmlhYmxlLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBrZXlWYXJpYWJsZS5jdXJseSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiaW52YWxpZCBmb3JlYWNoIGtleSBiaW5kaW5nXCIsIG5vZGVMb2NhdGlvbihrZXlWYXJpYWJsZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIGlmIChjb2xsZWN0aW9uVHlwZT8ua2luZCA9PSBcIk1hcFR5cGVcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwidW5vcmRlcmVkIG1hcCBpdGVyYXRpb25cIiwgbm9kZUxvY2F0aW9uKG5vZGUuc291cmNlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gICAgaWYgKCFjb2xsZWN0aW9uVHlwZSB8fCBjb2xsZWN0aW9uVHlwZS5raW5kICE9IFwiT3JkZXJlZE1hcFR5cGVcIikge1xuICAgICAgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIFwiT3JkZXJlZCBtYXAgaXRlcmF0aW9uIGNvbGxlY3Rpb25cIiwgbm9kZUxvY2F0aW9uKG5vZGUuc291cmNlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gICAgY29uc3Qga2V5TG9jYXRpb24gPSBub2RlTG9jYXRpb24oa2V5VmFyaWFibGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgY29uc3QgdmFsdWVMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbih2YXJpYWJsZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICBjb25zdCBrZXlUeXBlID0gaXRlcmF0aW9uQmluZGluZ1R5cGUoY29sbGVjdGlvblR5cGUua2V5VHlwZSwga2V5TG9jYXRpb24pXG4gICAgY29uc3QgdmFsdWVUeXBlID0gaXRlcmF0aW9uQmluZGluZ1R5cGUoY29sbGVjdGlvblR5cGUudmFsdWVUeXBlLCB2YWx1ZUxvY2F0aW9uKVxuICAgIGNvbnN0IGtleUJpbmRpbmcgPSB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlZhbHVlQmluZGluZ1wiKSwgbG9jYXRpb246IGtleUxvY2F0aW9uLCBtdXRhYmxlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoZmFsc2UpLFxuICAgICAgbmFtZToga2V5VmFyaWFibGUubmFtZSwgdHlwZToga2V5VHlwZVxuICAgIH0sIHtuYW1lOiBrZXlMb2NhdGlvbn0pXG4gICAgY29uc3QgdmFsdWVCaW5kaW5nID0gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJWYWx1ZUJpbmRpbmdcIiksIGxvY2F0aW9uOiB2YWx1ZUxvY2F0aW9uLCBtdXRhYmxlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoZmFsc2UpLFxuICAgICAgbmFtZTogdmFyaWFibGUubmFtZSwgdHlwZTogdmFsdWVUeXBlXG4gICAgfSwge25hbWU6IHZhbHVlTG9jYXRpb259KVxuICAgIGNvbnN0IGJvZHlDb250ZXh0ID0gey4uLmNvbnRleHQsIGJpbmRpbmdzOiBuZXcgTWFwKGNvbnRleHQuYmluZGluZ3MpfVxuXG4gICAgYm9keUNvbnRleHQuYmluZGluZ3Muc2V0KGtleVZhcmlhYmxlLm5hbWUsIGtleVR5cGUpXG4gICAgYm9keUNvbnRleHQuYmluZGluZ3Muc2V0KHZhcmlhYmxlLm5hbWUsIHZhbHVlVHlwZSlcbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBib2R5OiBjb252ZXJ0QmxvY2soYm9keSwgZmlsZW5hbWUsIHNvdXJjZSwgYm9keUNvbnRleHQpLFxuICAgICAga2V5QmluZGluZyxcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIiksXG4gICAgICBsb2NhdGlvbixcbiAgICAgIG1hcDogY29udmVydEV4cHJlc3Npb24obm9kZS5zb3VyY2UsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpLFxuICAgICAgdmFsdWVCaW5kaW5nXG4gICAgfSwge29wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiZm9yZWFjaFwiLCBub2RlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIG5vZGUuc291cmNlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsXG4gICAgICBmaWxlbmFtZSwgc291cmNlKX0pXG4gIH1cblxuICBpZiAoY29sbGVjdGlvblR5cGU/LmtpbmQgPT0gXCJNYXBUeXBlXCIgfHwgY29sbGVjdGlvblR5cGU/LmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibWFwIGl0ZXJhdGlvbiB3aXRob3V0IGtleS92YWx1ZSBwYWlyIGJpbmRpbmdcIiwgbm9kZUxvY2F0aW9uKG5vZGUuc291cmNlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBpZiAoIWNvbGxlY3Rpb25UeXBlIHx8IGNvbGxlY3Rpb25UeXBlLmtpbmQgIT0gXCJMaXN0VHlwZVwiKSB7XG4gICAgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIFwiSXRlcmF0aW9uIGNvbGxlY3Rpb25cIiwgbm9kZUxvY2F0aW9uKG5vZGUuc291cmNlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBjb25zdCBiaW5kaW5nTG9jYXRpb24gPSBub2RlTG9jYXRpb24odmFyaWFibGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGluZmVycmVkVHlwZSA9IGNvbGxlY3Rpb25UeXBlLmVsZW1lbnRUeXBlXG4gIGNvbnN0IGJpbmRpbmdUeXBlID0gaXRlcmF0aW9uQmluZGluZ1R5cGUoaW5mZXJyZWRUeXBlLCBiaW5kaW5nTG9jYXRpb24pXG4gIGNvbnN0IHZhbHVlQmluZGluZyA9IHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlZhbHVlQmluZGluZ1wiKSxcbiAgICBsb2NhdGlvbjogYmluZGluZ0xvY2F0aW9uLFxuICAgIG11dGFibGU6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChmYWxzZSksXG4gICAgbmFtZTogdmFyaWFibGUubmFtZSxcbiAgICB0eXBlOiBiaW5kaW5nVHlwZVxuICB9LCB7bmFtZTogYmluZGluZ0xvY2F0aW9ufSlcbiAgY29uc3QgYm9keUNvbnRleHQgPSB7Li4uY29udGV4dCwgYmluZGluZ3M6IG5ldyBNYXAoY29udGV4dC5iaW5kaW5ncyl9XG5cbiAgYm9keUNvbnRleHQuYmluZGluZ3Muc2V0KHZhcmlhYmxlLm5hbWUsIGJpbmRpbmdUeXBlKVxuICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgYm9keTogY29udmVydEJsb2NrKGJvZHksIGZpbGVuYW1lLCBzb3VyY2UsIGJvZHlDb250ZXh0KSxcbiAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJGb3JFYWNoU3RhdGVtZW50XCIpLFxuICAgIGxpc3Q6IGNvbnZlcnRFeHByZXNzaW9uKG5vZGUuc291cmNlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSxcbiAgICBsb2NhdGlvbixcbiAgICB2YWx1ZUJpbmRpbmdcbiAgfSwge29wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiZm9yZWFjaFwiLCBub2RlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIG5vZGUuc291cmNlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvcmRlcmVkIFBIUCBibG9jayB3aXRoIGl0cyBvd24gYWRhcHRhdGlvbiBzY29wZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5CbG9ja30gbm9kZSAtIFBIUCBwYXJzZXIgYmxvY2suXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CbG9ja30gU2VtYW50aWMgYmxvY2suXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRCbG9jayhub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIHJldHVybiB7XG4gICAga2luZDogXCJCbG9ja1wiLFxuICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgc3RhdGVtZW50czogbm9kZS5jaGlsZHJlbi5tYXAoKHN0YXRlbWVudCkgPT4gY29udmVydFN0YXRlbWVudChzdGF0ZW1lbnQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpKVxuICB9XG59XG5cbi8qKlxuICogUmVxdWlyZXMgYW4gZXhhY3QgUEhQIHNjYWxhciBkZWNsYXJhdGlvbiB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGUgfCBudWxsfSBzb3VyY2VUeXBlIC0gUEhQIHR5cGUgbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdWJqZWN0IC0gVHlwZWQgc3ViamVjdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbj59IFtyZWNvcmROYW1lc10gLSBOb21pbmFsIGRlY2xhcmF0aW9ucyBieSBzb3VyY2UgbmFtZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gU2VtYW50aWMgdHlwZS5cbiAqL1xuZnVuY3Rpb24gY29udmVydFR5cGUoc291cmNlVHlwZSwgc3ViamVjdCwgbG9jYXRpb24sIGZpbGVuYW1lLCBzb3VyY2UsIHJlY29yZE5hbWVzID0gbmV3IE1hcCgpKSB7XG4gIGlmICghc291cmNlVHlwZSkgcmV0dXJuIHJlcXVpcmVTb3VyY2VTY2FsYXJUeXBlKFwicGhwXCIsIHVuZGVmaW5lZCwgc3ViamVjdCwgbG9jYXRpb24pXG4gIGlmIChzb3VyY2VUeXBlLmtpbmQgIT0gXCJ0eXBlcmVmZXJlbmNlXCIgJiYgc291cmNlVHlwZS5raW5kICE9IFwibmFtZVwiICYmIHNvdXJjZVR5cGUua2luZCAhPSBcImlkZW50aWZpZXJcIikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInVuc3VwcG9ydGVkIHNjYWxhciB0eXBlXCIsIG5vZGVMb2NhdGlvbihzb3VyY2VUeXBlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuXG4gIGNvbnN0IHR5cGVOYW1lID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlR5cGVSZWZlcmVuY2UgfCBpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5hbWUgfCBpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklkZW50aWZpZXJ9ICovIChzb3VyY2VUeXBlKS5uYW1lXG5cbiAgY29uc3QgdHlwZUxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKHNvdXJjZVR5cGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gcmVjb3JkTmFtZXMuZ2V0KHR5cGVOYW1lKVxuXG4gIGlmIChkZWNsYXJhdGlvbj8uaWQpIHJldHVybiBkZWNsYXJhdGlvbi5raW5kID09IFwiQ2xhc3NEZWNsYXJhdGlvblwiXG4gICAgPyByZWZlcmVuY2VUeXBlKGRlY2xhcmF0aW9uLmlkLCB0eXBlTG9jYXRpb24pXG4gICAgOiBkZWNsYXJhdGlvbi5raW5kID09IFwiRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvblwiXG4gICAgICA/IG93bmVkUmVzb3VyY2VUeXBlKGRlY2xhcmF0aW9uLmlkLCB0eXBlTG9jYXRpb24pXG4gICAgICA6IHJlY29yZFR5cGUoZGVjbGFyYXRpb24uaWQsIHR5cGVMb2NhdGlvbilcblxuICByZXR1cm4gcmVxdWlyZVNvdXJjZVNjYWxhclR5cGUoXCJwaHBcIiwgdHlwZU5hbWUsIHN1YmplY3QsIGxvY2F0aW9uLCB0eXBlTG9jYXRpb24pXG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGV4YWN0IFBIUERvYyBjb250YWluZXIgc2lnbmF0dXJlIGF0dGFjaGVkIHRvIG9uZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5GdW5jdGlvbn0gbm9kZSAtIEZ1bmN0aW9uIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3duZXJJZF0gLSBTdGFibGUgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7e3BhcmFtZXRlcnM6IE1hcDxzdHJpbmcsIHtsb2NhdGlvbjogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIHNvdXJjZVR5cGU6IHN0cmluZ30+LCByZXR1cm5UeXBlOiB7bG9jYXRpb246IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uLCBzb3VyY2VUeXBlOiBzdHJpbmd9IHwgdW5kZWZpbmVkLCB0eXBlUGFyYW1ldGVycz86IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlR5cGVQYXJhbWV0ZXJbXX19IERvY3VtZW50ZWQgdHlwZXMuXG4gKi9cbmZ1bmN0aW9uIGZ1bmN0aW9uRG9jdW1lbnRlZFR5cGVzKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIG93bmVySWQpIHtcbiAgY29uc3QgY29tbWVudCA9IG5vZGUubGVhZGluZ0NvbW1lbnRzPy5hdCgtMSlcblxuICBpZiAoIWNvbW1lbnQgfHwgY29tbWVudC5raW5kICE9IFwiY29tbWVudGJsb2NrXCIgfHwgIWNvbW1lbnQubG9jIHx8ICFub2RlLmxvYyB8fFxuICAgICEvXlxccyokL3UudGVzdChzb3VyY2Uuc2xpY2UoY29tbWVudC5sb2MuZW5kLm9mZnNldCwgbm9kZS5sb2Muc3RhcnQub2Zmc2V0KSkpIHJldHVybiB7cGFyYW1ldGVyczogbmV3IE1hcCgpLCByZXR1cm5UeXBlOiB1bmRlZmluZWR9XG4gIGNvbnN0IGJsb2NrID0gcGFyc2VDb21tZW50KGNvbW1lbnQudmFsdWUpWzBdXG4gIGNvbnN0IHRhZ3MgPSBibG9jaz8udGFncyA/PyBbXVxuICBjb25zdCBwYXJhbWV0ZXJUYWdzID0gdGFncy5maWx0ZXIoKHRhZykgPT4gdGFnLnRhZyA9PSBcInBhcmFtXCIpXG4gIGNvbnN0IHJldHVyblRhZ3MgPSB0YWdzLmZpbHRlcigodGFnKSA9PiB0YWcudGFnID09IFwicmV0dXJuXCIgfHwgdGFnLnRhZyA9PSBcInJldHVybnNcIilcbiAgY29uc3QgdGVtcGxhdGVUYWdzID0gdGFncy5maWx0ZXIoKHRhZykgPT4gdGFnLnRhZyA9PSBcInRlbXBsYXRlXCIpXG4gIGNvbnN0IG1hbGZvcm1lZFRlbXBsYXRlID0gdGFncy5maW5kKCh0YWcpID0+IHRhZy50YWcuc3RhcnRzV2l0aChcInRlbXBsYXRlXCIpICYmIHRhZy50YWcgIT0gXCJ0ZW1wbGF0ZVwiKVxuICBjb25zdCBtYWxmb3JtZWQgPSB0YWdzLnNvbWUoKHRhZykgPT4gIVtcInBhcmFtXCIsIFwicmV0dXJuXCIsIFwicmV0dXJuc1wiLCBcInRlbXBsYXRlXCJdLmluY2x1ZGVzKHRhZy50YWcpKSB8fCByZXR1cm5UYWdzLmxlbmd0aCA+IDEgfHxcbiAgICBwYXJhbWV0ZXJUYWdzLnNvbWUoKHRhZykgPT4gdGFnLnR5cGUgIT0gXCJcIiB8fCAhL15cXCRbQS1aYS16X11bQS1aYS16MC05X10qJC91LnRlc3QodGFnLmRlc2NyaXB0aW9uKSkgfHxcbiAgICByZXR1cm5UYWdzLnNvbWUoKHRhZykgPT4gdGFnLnR5cGUgIT0gXCJcIiB8fCB0YWcuZGVzY3JpcHRpb24gIT0gXCJcIikgfHwgbWFsZm9ybWVkVGVtcGxhdGUgfHxcbiAgICB0ZW1wbGF0ZVRhZ3Muc29tZSgodGFnKSA9PiAhL15bQS1aYS16X11bQS1aYS16MC05X10qJC91LnRlc3QodGFnLm5hbWUpIHx8IHRhZy50eXBlICE9IFwiXCIgfHwgdGFnLmRlc2NyaXB0aW9uICE9IFwiXCIpIHx8XG4gICAgdGVtcGxhdGVUYWdzLmxlbmd0aCA+IDAgJiYgIW93bmVySWRcblxuICBpZiAobWFsZm9ybWVkKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJtYWxmb3JtZWQgZnVuY3Rpb24gdHlwZSBhbm5vdGF0aW9uXCIsIG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgY29uc3QgcGFyYW1ldGVycyA9IG5ldyBNYXAocGFyYW1ldGVyVGFncy5tYXAoKHRhZykgPT4gW3RhZy5kZXNjcmlwdGlvbi5zbGljZSgxKSwge1xuICAgIGxvY2F0aW9uOiBjb21tZW50VGFnTG9jYXRpb24oY29tbWVudCwgdGFnLCBcIm5hbWVcIiwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgc291cmNlVHlwZTogdGFnLm5hbWVcbiAgfV0pKVxuXG4gIGlmIChwYXJhbWV0ZXJzLnNpemUgIT0gcGFyYW1ldGVyVGFncy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkdXBsaWNhdGUgcGFyYW1ldGVyIGFubm90YXRpb25cIiwgbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG4gIGNvbnN0IHJldHVyblRhZyA9IHJldHVyblRhZ3NbMF1cbiAgY29uc3QgdHlwZVBhcmFtZXRlcnMgPSB0ZW1wbGF0ZVRhZ3MubWFwKCh0YWcsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgbG9jYXRpb24gPSBjb21tZW50VGFnTG9jYXRpb24oY29tbWVudCwgdGFnLCBcIm5hbWVcIiwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtpZDogYCR7b3duZXJJZH06dHlwZToke2luZGV4fWAsIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlR5cGVQYXJhbWV0ZXJcIiksIGxvY2F0aW9uLCBuYW1lOiB0YWcubmFtZX0sIHtuYW1lOiBsb2NhdGlvbn0pXG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICBwYXJhbWV0ZXJzLFxuICAgIHJldHVyblR5cGU6IHJldHVyblRhZyA/IHtcbiAgICAgIGxvY2F0aW9uOiBjb21tZW50VGFnTG9jYXRpb24oY29tbWVudCwgcmV0dXJuVGFnLCBcIm5hbWVcIiwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICBzb3VyY2VUeXBlOiByZXR1cm5UYWcubmFtZVxuICAgIH0gOiB1bmRlZmluZWQsXG4gICAgLi4uKHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDAgPyB7dHlwZVBhcmFtZXRlcnN9IDoge30pXG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkcyBhbiBvcHRpb25hbCBleGFjdCBjbGFzcy1sZXZlbCBQSFBEb2MgdGVtcGxhdGUgbGlzdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5DbGFzc30gbm9kZSAtIENsYXNzIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IG93bmVySWQgLSBTdGFibGUgcmVjb3JkIGlkZW50aXR5LlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5UeXBlUGFyYW1ldGVyW10gfCB1bmRlZmluZWR9IE9yZGVyZWQgcGFyYW1ldGVycy5cbiAqL1xuZnVuY3Rpb24gY2xhc3NEb2N1bWVudGVkVHlwZVBhcmFtZXRlcnMobm9kZSwgb3duZXJJZCwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBjb25zdCBkb2N1bWVudGVkID0gZnVuY3Rpb25Eb2N1bWVudGVkVHlwZXMoXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkZ1bmN0aW9ufSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAobm9kZSkpLCBmaWxlbmFtZSwgc291cmNlLCBvd25lcklkKVxuXG4gIGlmIChkb2N1bWVudGVkLnBhcmFtZXRlcnMuc2l6ZSB8fCBkb2N1bWVudGVkLnJldHVyblR5cGUpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJmdW5jdGlvbiB0eXBlIGFubm90YXRpb24gb24gcmVjb3JkIGRlY2xhcmF0aW9uXCIsIG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuXG4gIHJldHVybiBkb2N1bWVudGVkLnR5cGVQYXJhbWV0ZXJzXG59XG5cbi8qKlxuICogUmV0dXJucyBhIG5hdGl2ZSBQSFAgdHlwZSBuYW1lIGZyb20gb25lIHN1cHBvcnRlZCBwYXJzZXIgbm9kZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Ob2RlIHwgbnVsbH0gdHlwZSAtIE5hdGl2ZSB0eXBlIG5vZGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBUeXBlIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIHBocFR5cGVOYW1lKHR5cGUpIHtcbiAgaWYgKCF0eXBlIHx8ICFbXCJ0eXBlcmVmZXJlbmNlXCIsIFwibmFtZVwiLCBcImlkZW50aWZpZXJcIl0uaW5jbHVkZXModHlwZS5raW5kKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIHJldHVybiAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVHlwZVJlZmVyZW5jZSB8IGltcG9ydChcInBocC1wYXJzZXJcIikuTmFtZSB8IGltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKHR5cGUpLm5hbWVcbn1cblxuLyoqXG4gKiBXcmFwcyBvbmUgcGFyc2VyLWRlY2xhcmVkIGNhbm9uaWNhbCBQSFAgbnVsbGFibGUgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9IHZhbHVlVHlwZSAtIFByZXNlbnQtdmFsdWUgc2VtYW50aWMgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Ob2RlfSBzb3VyY2VUeXBlIC0gTmF0aXZlIHBhcnNlciB0eXBlIG5vZGUuXG4gKiBAcGFyYW0ge251bWJlcn0gb3duZXJTdGFydCAtIEVhcmxpZXN0IG93bmluZyBwYXJzZXIgb2Zmc2V0LlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5PcHRpb25hbFR5cGV9IE9wdGlvbmFsIHNlbWFudGljIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIG51bGxhYmxlVHlwZSh2YWx1ZVR5cGUsIHNvdXJjZVR5cGUsIG93bmVyU3RhcnQsIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgaWYgKCFzb3VyY2VUeXBlLmxvYykgdGhyb3cgbmV3IEVycm9yKFwiUEhQIHBhcnNlciBvbWl0dGVkIG51bGxhYmxlIHR5cGUgbG9jYXRpb24uXCIpXG4gIGNvbnN0IHZhbHVlTG9jYXRpb24gPSBub2RlTG9jYXRpb24oc291cmNlVHlwZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgbWFya2VyID0gdG9rZW5Mb2NhdGlvbihcIj9cIiwgb3duZXJTdGFydCwgc291cmNlVHlwZS5sb2Muc3RhcnQub2Zmc2V0LCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIGlmIChtYXJrZXIuZW5kLm9mZnNldCAhPSB2YWx1ZUxvY2F0aW9uLnN0YXJ0Lm9mZnNldCkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm5vbmNhbm9uaWNhbCBudWxsYWJsZSB0eXBlXCIsIG1hcmtlcilcbiAgfVxuXG4gIHJldHVybiBvcHRpb25hbFR5cGUoXG4gICAgdmFsdWVUeXBlLFxuICAgIGxvY2F0aW9uRnJvbU9mZnNldHMoZmlsZW5hbWUsIHNvdXJjZSwgbWFya2VyLnN0YXJ0Lm9mZnNldCwgdmFsdWVMb2NhdGlvbi5lbmQub2Zmc2V0KSxcbiAgICB2YWx1ZUxvY2F0aW9uXG4gIClcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBvbmUgZXhwbGljaXQgUEhQIGZ1bmN0aW9uIHJldHVybiB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGUgfCBudWxsfSBzb3VyY2VUeXBlIC0gUEhQIHJldHVybiB0eXBlIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3ViamVjdCAtIFR5cGVkIGZ1bmN0aW9uIHJldHVybi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRnVuY3Rpb24gbG9jYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uPn0gW3JlY29yZE5hbWVzXSAtIE5vbWluYWwgZGVjbGFyYXRpb25zIGJ5IHNvdXJjZSBuYW1lLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSBTZW1hbnRpYyByZXR1cm4gdHlwZS5cbiAqL1xuZnVuY3Rpb24gY29udmVydFJldHVyblR5cGUoc291cmNlVHlwZSwgc3ViamVjdCwgbG9jYXRpb24sIGZpbGVuYW1lLCBzb3VyY2UsIHJlY29yZE5hbWVzID0gbmV3IE1hcCgpKSB7XG4gIGlmICghc291cmNlVHlwZSkgcmV0dXJuIHJlcXVpcmVTb3VyY2VSZXR1cm5UeXBlKFwicGhwXCIsIHVuZGVmaW5lZCwgc3ViamVjdCwgbG9jYXRpb24pXG4gIGlmIChzb3VyY2VUeXBlLmtpbmQgIT0gXCJ0eXBlcmVmZXJlbmNlXCIgJiYgc291cmNlVHlwZS5raW5kICE9IFwibmFtZVwiICYmIHNvdXJjZVR5cGUua2luZCAhPSBcImlkZW50aWZpZXJcIikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInVuc3VwcG9ydGVkIHJldHVybiB0eXBlXCIsIG5vZGVMb2NhdGlvbihzb3VyY2VUeXBlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBjb25zdCB0eXBlTmFtZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5UeXBlUmVmZXJlbmNlIHwgaW1wb3J0KFwicGhwLXBhcnNlclwiKS5OYW1lIHwgaW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAoc291cmNlVHlwZSkubmFtZVxuICBjb25zdCBkZWNsYXJhdGlvbiA9IHJlY29yZE5hbWVzLmdldCh0eXBlTmFtZSlcblxuICBpZiAoZGVjbGFyYXRpb24/LmlkKSByZXR1cm4gZGVjbGFyYXRpb24ua2luZCA9PSBcIkNsYXNzRGVjbGFyYXRpb25cIlxuICAgID8gcmVmZXJlbmNlVHlwZShkZWNsYXJhdGlvbi5pZCwgbm9kZUxvY2F0aW9uKHNvdXJjZVR5cGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIDogZGVjbGFyYXRpb24ua2luZCA9PSBcIkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb25cIlxuICAgICAgPyBvd25lZFJlc291cmNlVHlwZShkZWNsYXJhdGlvbi5pZCwgbm9kZUxvY2F0aW9uKHNvdXJjZVR5cGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgICAgOiByZWNvcmRUeXBlKGRlY2xhcmF0aW9uLmlkLCBub2RlTG9jYXRpb24oc291cmNlVHlwZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG5cbiAgcmV0dXJuIHJlcXVpcmVTb3VyY2VSZXR1cm5UeXBlKFwicGhwXCIsIHR5cGVOYW1lLCBzdWJqZWN0LCBsb2NhdGlvbiwgbm9kZUxvY2F0aW9uKHNvdXJjZVR5cGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBleHBsaWNpdCB0eXBlIHNpZ25hdHVyZSBvZiBvbmUgUEhQIGZ1bmN0aW9uIGJlZm9yZSBhbnkgYm9keSBleHByZXNzaW9ucy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5GdW5jdGlvbn0gbm9kZSAtIFBIUCBmdW5jdGlvbiBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbj59IHJlY29yZE5hbWVzIC0gTm9taW5hbCBkZWNsYXJhdGlvbnMgYnkgc291cmNlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3duZXJJZCAtIFN0YWJsZSBmdW5jdGlvbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtQaHBGdW5jdGlvblNpZ25hdHVyZX0gVHlwZWQgZnVuY3Rpb24gc2lnbmF0dXJlLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0RnVuY3Rpb25TaWduYXR1cmUobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgcmVjb3JkTmFtZXMsIG93bmVySWQpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgbmFtZSA9IHR5cGVvZiBub2RlLm5hbWUgPT0gXCJzdHJpbmdcIiA/IG5vZGUubmFtZSA6IG5vZGUubmFtZS5uYW1lXG5cbiAgaWYgKCFub2RlLmJvZHkpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJmdW5jdGlvbiBib2R5XCIsIGxvY2F0aW9uKVxuICB9XG5cbiAgY29uc3QgZG9jdW1lbnRlZCA9IGZ1bmN0aW9uRG9jdW1lbnRlZFR5cGVzKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIG93bmVySWQpXG4gIGNvbnN0IHR5cGVQYXJhbWV0ZXJOYW1lcyA9IG5ldyBNYXAoKGRvY3VtZW50ZWQudHlwZVBhcmFtZXRlcnMgPz8gW10pLm1hcCgocGFyYW1ldGVyKSA9PiBbcGFyYW1ldGVyLm5hbWUsIHBhcmFtZXRlcl0pKVxuICBjb25zdCBwYXJhbWV0ZXJzID0gbm9kZS5hcmd1bWVudHMubWFwKChwYXJhbWV0ZXIpID0+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihwYXJhbWV0ZXIsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgY29uc3QgcGFyYW1ldGVyTmFtZSA9IHR5cGVvZiBwYXJhbWV0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gcGFyYW1ldGVyLm5hbWUgOiBwYXJhbWV0ZXIubmFtZS5uYW1lXG5cbiAgICBpZiAocGFyYW1ldGVyLmJ5cmVmKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJieS1yZWZlcmVuY2UgcGFyYW1ldGVyXCIsIHBhcmFtZXRlckxvY2F0aW9uKVxuICAgIGlmIChwYXJhbWV0ZXIudmFyaWFkaWMpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInZhcmlhZGljIHBhcmFtZXRlclwiLCBwYXJhbWV0ZXJMb2NhdGlvbilcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkZWZhdWx0IHBhcmFtZXRlclwiLCBwYXJhbWV0ZXJMb2NhdGlvbilcbiAgICBjb25zdCBwYXJhbWV0ZXJOb2RlID0gdHlwZW9mIHBhcmFtZXRlci5uYW1lID09IFwic3RyaW5nXCIgPyBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXIubmFtZVxuICAgIGNvbnN0IGRvY3VtZW50ZWRUeXBlID0gZG9jdW1lbnRlZC5wYXJhbWV0ZXJzLmdldChwYXJhbWV0ZXJOYW1lKVxuICAgIGNvbnN0IG5hdGl2ZVR5cGUgPSBwaHBUeXBlTmFtZShwYXJhbWV0ZXIudHlwZSlcblxuICAgIGxldCBwYXJhbWV0ZXJUeXBlID0gZG9jdW1lbnRlZFR5cGVcbiAgICAgID8gZG9jdW1lbnRlZFZhbHVlVHlwZSh7bGFuZ3VhZ2U6IFwicGhwXCIsIGxvY2F0aW9uOiBkb2N1bWVudGVkVHlwZS5sb2NhdGlvbiwgb3duZXJMb2NhdGlvbjogcGFyYW1ldGVyTG9jYXRpb24sIHNvdXJjZSxcbiAgICAgICAgcmVjb3JkczogcmVjb3JkTmFtZXMsIHNvdXJjZVR5cGU6IGRvY3VtZW50ZWRUeXBlLnNvdXJjZVR5cGUsIHN1YmplY3Q6IGBQYXJhbWV0ZXIgJyR7cGFyYW1ldGVyTmFtZX0nYCwgdHlwZVBhcmFtZXRlcnM6IHR5cGVQYXJhbWV0ZXJOYW1lc30pXG4gICAgICA6IGNvbnZlcnRUeXBlKHBhcmFtZXRlci50eXBlLCBgUGFyYW1ldGVyICcke3BhcmFtZXRlck5hbWV9J2AsIHBhcmFtZXRlckxvY2F0aW9uLCBmaWxlbmFtZSwgc291cmNlLCByZWNvcmROYW1lcylcblxuICAgIGlmIChuYXRpdmVUeXBlID09IFwiYXJyYXlcIiAmJiAhZG9jdW1lbnRlZFR5cGUpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgUGFyYW1ldGVyICcke3BhcmFtZXRlck5hbWV9J2AsIHBhcmFtZXRlckxvY2F0aW9uKVxuICAgIGlmIChkb2N1bWVudGVkVHlwZSAmJiAhcGhwRG9jdW1lbnRlZE5hdGl2ZVR5cGVNYXRjaGVzKG5hdGl2ZVR5cGUsIHBhcmFtZXRlci5udWxsYWJsZSwgcGFyYW1ldGVyVHlwZSwgcmVjb3JkTmFtZXMpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkb2N1bWVudGVkIHBhcmFtZXRlciB0eXBlIGluY29tcGF0aWJsZSB3aXRoIG5hdGl2ZSB0eXBlXCIsIGRvY3VtZW50ZWRUeXBlLmxvY2F0aW9uKVxuICAgIH1cblxuICAgIGlmIChwYXJhbWV0ZXIubnVsbGFibGUgJiYgcGFyYW1ldGVyVHlwZS5raW5kICE9IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIGlmICghcGFyYW1ldGVyLnR5cGUpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgUGFyYW1ldGVyICcke3BhcmFtZXRlck5hbWV9J2AsIHBhcmFtZXRlckxvY2F0aW9uKVxuICAgICAgcGFyYW1ldGVyVHlwZSA9IG51bGxhYmxlVHlwZShwYXJhbWV0ZXJUeXBlLCBwYXJhbWV0ZXIudHlwZSwgcGFyYW1ldGVyLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgfSBlbHNlIGlmICghcGFyYW1ldGVyLm51bGxhYmxlICYmIHBhcmFtZXRlclR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmXG4gICAgICBwYXJhbWV0ZXJUeXBlLnZhbHVlVHlwZS5raW5kICE9IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm9wdGlvbmFsIGFubm90YXRpb24gd2l0aG91dCBudWxsYWJsZSBuYXRpdmUgdHlwZVwiLCBkb2N1bWVudGVkVHlwZT8ubG9jYXRpb24gPz8gcGFyYW1ldGVyTG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IHNlbWFudGljUGFyYW1ldGVyID0ge1xuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUGFyYW1ldGVyXCIpLFxuICAgICAgbG9jYXRpb246IHBhcmFtZXRlckxvY2F0aW9uLFxuICAgICAgbmFtZTogcGFyYW1ldGVyTmFtZSxcbiAgICAgIHR5cGU6IHBhcmFtZXRlclR5cGVcbiAgICB9XG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyhzZW1hbnRpY1BhcmFtZXRlciwge25hbWU6IG5vZGVMb2NhdGlvbihwYXJhbWV0ZXJOb2RlLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gIH0pXG4gIGNvbnN0IGV4dHJhRG9jdW1lbnRlZFBhcmFtZXRlciA9IFsuLi5kb2N1bWVudGVkLnBhcmFtZXRlcnMua2V5cygpXS5maW5kKChuYW1lKSA9PlxuICAgICFub2RlLmFyZ3VtZW50cy5zb21lKChwYXJhbWV0ZXIpID0+ICh0eXBlb2YgcGFyYW1ldGVyLm5hbWUgPT0gXCJzdHJpbmdcIiA/IHBhcmFtZXRlci5uYW1lIDogcGFyYW1ldGVyLm5hbWUubmFtZSkgPT0gbmFtZSkpXG5cbiAgaWYgKGV4dHJhRG9jdW1lbnRlZFBhcmFtZXRlcikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGBhbm5vdGF0aW9uIGZvciB1bmtub3duIHBhcmFtZXRlciAnJHtleHRyYURvY3VtZW50ZWRQYXJhbWV0ZXJ9J2AsIGxvY2F0aW9uKVxuICBpZiAobm9kZS5ieXJlZikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiYnktcmVmZXJlbmNlIHJldHVyblwiLCBsb2NhdGlvbilcbiAgY29uc3QgbmFtZU5vZGUgPSB0eXBlb2Ygbm9kZS5uYW1lID09IFwic3RyaW5nXCIgPyBub2RlIDogbm9kZS5uYW1lXG4gIGNvbnN0IG5hdGl2ZVJldHVyblR5cGUgPSBwaHBUeXBlTmFtZShub2RlLnR5cGUpXG4gIGxldCByZXR1cm5UeXBlXG5cbiAgaWYgKGRvY3VtZW50ZWQucmV0dXJuVHlwZSkge1xuICAgIHJldHVyblR5cGUgPSBkb2N1bWVudGVkVmFsdWVUeXBlKHtsYW5ndWFnZTogXCJwaHBcIiwgbG9jYXRpb246IGRvY3VtZW50ZWQucmV0dXJuVHlwZS5sb2NhdGlvbiwgb3duZXJMb2NhdGlvbjogbG9jYXRpb24sIHNvdXJjZSxcbiAgICAgIHJlY29yZHM6IHJlY29yZE5hbWVzLCBzb3VyY2VUeXBlOiBkb2N1bWVudGVkLnJldHVyblR5cGUuc291cmNlVHlwZSwgc3ViamVjdDogYEZ1bmN0aW9uICcke25hbWV9JyByZXR1cm5gLCB0eXBlUGFyYW1ldGVyczogdHlwZVBhcmFtZXRlck5hbWVzfSlcbiAgICBpZiAoIXBocERvY3VtZW50ZWROYXRpdmVUeXBlTWF0Y2hlcyhuYXRpdmVSZXR1cm5UeXBlLCBub2RlLm51bGxhYmxlLCByZXR1cm5UeXBlLCByZWNvcmROYW1lcykpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImRvY3VtZW50ZWQgcmV0dXJuIHR5cGUgaW5jb21wYXRpYmxlIHdpdGggbmF0aXZlIHR5cGVcIiwgZG9jdW1lbnRlZC5yZXR1cm5UeXBlLmxvY2F0aW9uKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAobmF0aXZlUmV0dXJuVHlwZSA9PSBcImFycmF5XCIpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgRnVuY3Rpb24gJyR7bmFtZX0nIHJldHVybmAsIGxvY2F0aW9uKVxuICAgIHJldHVyblR5cGUgPSBjb252ZXJ0UmV0dXJuVHlwZShub2RlLnR5cGUsIGBGdW5jdGlvbiAnJHtuYW1lfScgcmV0dXJuYCwgbG9jYXRpb24sIGZpbGVuYW1lLCBzb3VyY2UsIHJlY29yZE5hbWVzKVxuICB9XG4gIGlmIChub2RlLm51bGxhYmxlICYmIHJldHVyblR5cGUua2luZCAhPSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgaWYgKCFub2RlLnR5cGUpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgRnVuY3Rpb24gJyR7bmFtZX0nIHJldHVybmAsIGxvY2F0aW9uKVxuICAgIGNvbnN0IHR5cGVTdGFydCA9IG5vZGUudHlwZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwXG5cbiAgICByZXR1cm5UeXBlID0gbnVsbGFibGVUeXBlKFxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gKi8gKHJldHVyblR5cGUpLFxuICAgICAgbm9kZS50eXBlLFxuICAgICAgTWF0aC5tYXgobm9kZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCB0eXBlU3RhcnQgLSAyKSxcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgc291cmNlXG4gICAgKVxuICB9IGVsc2UgaWYgKCFub2RlLm51bGxhYmxlICYmIHJldHVyblR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmXG4gICAgcmV0dXJuVHlwZS52YWx1ZVR5cGUua2luZCAhPSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwib3B0aW9uYWwgYW5ub3RhdGlvbiB3aXRob3V0IG51bGxhYmxlIG5hdGl2ZSByZXR1cm4gdHlwZVwiLCBkb2N1bWVudGVkLnJldHVyblR5cGU/LmxvY2F0aW9uID8/IGxvY2F0aW9uKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBsb2NhdGlvbixcbiAgICBuYW1lLFxuICAgIG5hbWVMb2NhdGlvbjogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICBwYXJhbWV0ZXJzLFxuICAgIHJldHVyblR5cGUsXG4gICAgLi4uKGRvY3VtZW50ZWQudHlwZVBhcmFtZXRlcnMgPyB7dHlwZVBhcmFtZXRlcnM6IGRvY3VtZW50ZWQudHlwZVBhcmFtZXRlcnN9IDoge30pXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIGV4YWN0IHJ1bnRpbWUgY2FycmllciBwZXJtaXR0ZWQgYmVzaWRlIGEgcHJlY2lzZSBQSFBEb2MgdHlwZS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBuYXRpdmVUeXBlIC0gTmF0aXZlIFBIUCB0eXBlIG5hbWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG5hdGl2ZU51bGxhYmxlIC0gV2hldGhlciB0aGUgbmF0aXZlIGNhcnJpZXIgaGFzIFBIUCdzIG51bGxhYmxlIG1hcmtlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9IGRvY3VtZW50ZWRUeXBlIC0gRXhhY3Qgc2VtYW50aWMgZG9jdW1lbnQgdHlwZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbj59IHJlY29yZHMgLSBWaXNpYmxlIG5vbWluYWwgZGVjbGFyYXRpb25zIGJ5IG5hbWUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgbmF0aXZlIGNhcnJpZXIgYWdyZWVzIHdpdGhvdXQgY2hhbmdpbmcgbWVhbmluZy5cbiAqL1xuZnVuY3Rpb24gcGhwRG9jdW1lbnRlZE5hdGl2ZVR5cGVNYXRjaGVzKG5hdGl2ZVR5cGUsIG5hdGl2ZU51bGxhYmxlLCBkb2N1bWVudGVkVHlwZSwgcmVjb3Jkcykge1xuICBpZiAoZG9jdW1lbnRlZFR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgaWYgKGRvY3VtZW50ZWRUeXBlLnZhbHVlVHlwZS5raW5kID09IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIpIHtcbiAgICAgIHJldHVybiBuYXRpdmVUeXBlID09PSB1bmRlZmluZWQgJiYgIW5hdGl2ZU51bGxhYmxlXG4gICAgfVxuXG4gICAgcmV0dXJuIG5hdGl2ZU51bGxhYmxlICYmIHBocERvY3VtZW50ZWROYXRpdmVUeXBlTWF0Y2hlcyhuYXRpdmVUeXBlLCBmYWxzZSwgZG9jdW1lbnRlZFR5cGUudmFsdWVUeXBlLCByZWNvcmRzKVxuICB9XG4gIGlmIChuYXRpdmVOdWxsYWJsZSkgcmV0dXJuIGZhbHNlXG4gIGlmIChkb2N1bWVudGVkVHlwZS5raW5kID09IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIpIHJldHVybiBuYXRpdmVUeXBlID09PSB1bmRlZmluZWRcbiAgaWYgKGRvY3VtZW50ZWRUeXBlLmtpbmQgPT0gXCJUeXBlUmVmZXJlbmNlXCIpIHtcbiAgICByZXR1cm4gbmF0aXZlVHlwZSAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZVNjYWxhclR5cGUoXCJwaHBcIiwgbmF0aXZlVHlwZSk/Lm5hbWUgPT0gZG9jdW1lbnRlZFR5cGUubmFtZVxuICB9XG4gIGlmIChkb2N1bWVudGVkVHlwZS5raW5kID09IFwiTGlzdFR5cGVcIiB8fCBkb2N1bWVudGVkVHlwZS5raW5kID09IFwiTWFwVHlwZVwiIHx8IGRvY3VtZW50ZWRUeXBlLmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiKSB7XG4gICAgcmV0dXJuIG5hdGl2ZVR5cGUgPT0gXCJhcnJheVwiXG4gIH1cbiAgaWYgKGRvY3VtZW50ZWRUeXBlLmtpbmQgPT0gXCJSZWNvcmRUeXBlXCIpIHtcbiAgICByZXR1cm4gbmF0aXZlVHlwZSAhPT0gdW5kZWZpbmVkICYmIHJlY29yZHMuZ2V0KG5hdGl2ZVR5cGUpPy5pZCA9PSBkb2N1bWVudGVkVHlwZS5kZWNsYXJhdGlvbklkXG4gIH1cbiAgaWYgKGRvY3VtZW50ZWRUeXBlLmtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIpIHtcbiAgICByZXR1cm4gbmF0aXZlVHlwZSAhPT0gdW5kZWZpbmVkICYmIHJlY29yZHMuZ2V0KG5hdGl2ZVR5cGUpPy5pZCA9PSBkb2N1bWVudGVkVHlwZS5kZWNsYXJhdGlvbklkXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIFBIUCBmdW5jdGlvbiBib2R5IHVzaW5nIHRoZSBhbHJlYWR5LXByb3ZlZCBtb2R1bGUgc2lnbmF0dXJlcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5GdW5jdGlvbn0gbm9kZSAtIFBIUCBmdW5jdGlvbiBub2RlLlxuICogQHBhcmFtIHtQaHBGdW5jdGlvblNpZ25hdHVyZX0gc2lnbmF0dXJlIC0gUHJlY29udmVydGVkIGV4cGxpY2l0IHNpZ25hdHVyZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgUGhwRnVuY3Rpb25TaWduYXR1cmU+fSBmdW5jdGlvbnMgLSBNb2R1bGUgZnVuY3Rpb24gc2lnbmF0dXJlcy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbj59IHJlY29yZE5hbWVzIC0gTm9taW5hbCBkZWNsYXJhdGlvbnMgYnkgc291cmNlIG5hbWUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uPn0gcmVjb3JkcyAtIFJlY29yZCBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24+fSBjbGFzc2VzIC0gUmVmZXJlbmNlIGNsYXNzZXMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24+fSBlcnJvck5hbWVzIC0gRXJyb3IgZGVjbGFyYXRpb25zIGJ5IHNvdXJjZSBuYW1lLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uPn0gZXJyb3JzIC0gRXJyb3IgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9ufSBTZW1hbnRpYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY29udmVydEZ1bmN0aW9uKG5vZGUsIHNpZ25hdHVyZSwgZnVuY3Rpb25zLCByZWNvcmROYW1lcywgcmVjb3JkcywgY2xhc3NlcywgZXJyb3JOYW1lcywgZXJyb3JzLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGlmICghbm9kZS5ib2R5KSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJmdW5jdGlvbiBib2R5XCIsIHNpZ25hdHVyZS5sb2NhdGlvbilcbiAgY29uc3QgY29udGV4dCA9IHtcbiAgICBiaW5kaW5nczogbmV3IE1hcChzaWduYXR1cmUucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gW3BhcmFtZXRlci5uYW1lLCBwYXJhbWV0ZXIudHlwZV0pKSxcbiAgICBjbGFzc2VzLFxuICAgIGVycm9yTmFtZXMsXG4gICAgZXJyb3JzLFxuICAgIGZ1bmN0aW9ucyxcbiAgICBvcmRlcmVkTWFwRGVjbGFyYXRpb25zOiBvcmRlcmVkTWFwRGVjbGFyYXRpb25zRm9yUGhwKG5vZGUuYm9keSksXG4gICAgcmVjb3JkTmFtZXMsXG4gICAgcmVjb3JkcyxcbiAgICByZXR1cm5UeXBlOiBzaWduYXR1cmUucmV0dXJuVHlwZSxcbiAgICB0eXBlUGFyYW1ldGVyczogbmV3IE1hcCgoc2lnbmF0dXJlLnR5cGVQYXJhbWV0ZXJzID8/IFtdKS5tYXAoKHBhcmFtZXRlcikgPT4gW3BhcmFtZXRlci5uYW1lLCBwYXJhbWV0ZXJdKSlcbiAgfVxuXG4gIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICBib2R5OiBjb252ZXJ0QmxvY2sobm9kZS5ib2R5LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSxcbiAgICBraW5kOiBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIixcbiAgICBsb2NhdGlvbjogc2lnbmF0dXJlLmxvY2F0aW9uLFxuICAgIG5hbWU6IHNpZ25hdHVyZS5uYW1lLFxuICAgIHBhcmFtZXRlcnM6IHNpZ25hdHVyZS5wYXJhbWV0ZXJzLFxuICAgIHJldHVyblR5cGU6IHNpZ25hdHVyZS5yZXR1cm5UeXBlLFxuICAgIC4uLihzaWduYXR1cmUudHlwZVBhcmFtZXRlcnMgPyB7dHlwZVBhcmFtZXRlcnM6IHNpZ25hdHVyZS50eXBlUGFyYW1ldGVyc30gOiB7fSlcbiAgfSwge25hbWU6IHNpZ25hdHVyZS5uYW1lTG9jYXRpb259KVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHBhcnNlci1vd25lZCBrZXkvdmFsdWUgbG9vcHMgdG8gZXhhY3QgZGVjbGFyYXRpb25zIGluc2lkZSBvbmUgbGV4aWNhbCBvd25lci5cbiAqIEFtYmlndW91cyBzYW1lLW5hbWUgZGVjbGFyYXRpb25zIHByb2R1Y2Ugbm8gZXZpZGVuY2UgYW5kIGZhaWwgZHVyaW5nIGxvb3AgY29udmVyc2lvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBGdW5jdGlvbiBib2R5IG9yIGVudHJ5LXBvaW50IHN1YnRyZWUuXG4gKiBAcmV0dXJucyB7U2V0PG9iamVjdD59IEV4YWN0IHBhaXItaXRlcmF0ZWQgcGFyc2VyIGRlY2xhcmF0aW9ucy5cbiAqL1xuZnVuY3Rpb24gb3JkZXJlZE1hcERlY2xhcmF0aW9uc0ZvclBocCh2YWx1ZSkge1xuICAvKiogQHR5cGUge3tkZWNsYXJhdGlvbjogb2JqZWN0LCBuYW1lOiBzdHJpbmcsIG9mZnNldDogbnVtYmVyfVtdfSAqL1xuICBjb25zdCBkZWNsYXJhdGlvbnMgPSBbXVxuICAvKiogQHR5cGUge3tuYW1lOiBzdHJpbmcsIG9mZnNldDogbnVtYmVyfVtdfSAqL1xuICBjb25zdCByZWNlaXZlcnMgPSBbXVxuICBjb25zdCBzZWVuID0gbmV3IFdlYWtTZXQoKVxuICAvKipcbiAgICogVmlzaXRzIG9uZSBwYXJzZXIgY2FuZGlkYXRlLlxuICAgKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZSAtIFBhcnNlciBjYW5kaWRhdGUuXG4gICAqL1xuICBjb25zdCB2aXNpdCA9IChjYW5kaWRhdGUpID0+IHtcbiAgICBpZiAoIWNhbmRpZGF0ZSB8fCB0eXBlb2YgY2FuZGlkYXRlICE9IFwib2JqZWN0XCIgfHwgc2Vlbi5oYXMoY2FuZGlkYXRlKSkgcmV0dXJuXG4gICAgc2Vlbi5hZGQoY2FuZGlkYXRlKVxuICAgIGNvbnN0IGtpbmQgPSBSZWZsZWN0LmdldChjYW5kaWRhdGUsIFwia2luZFwiKVxuXG4gICAgaWYgKGtpbmQgPT0gXCJmdW5jdGlvblwiIHx8IGtpbmQgPT0gXCJjbGFzc1wiKSByZXR1cm5cbiAgICBpZiAoa2luZCA9PSBcImFzc2lnblwiKSB7XG4gICAgICBjb25zdCB2YXJpYWJsZSA9IFJlZmxlY3QuZ2V0KGNhbmRpZGF0ZSwgXCJsZWZ0XCIpXG5cbiAgICAgIGlmIChSZWZsZWN0LmdldCh2YXJpYWJsZSwgXCJraW5kXCIpID09IFwidmFyaWFibGVcIiAmJiB0eXBlb2YgUmVmbGVjdC5nZXQodmFyaWFibGUsIFwibmFtZVwiKSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGRlY2xhcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICBkZWNsYXJhdGlvbjogY2FuZGlkYXRlLFxuICAgICAgICAgIG5hbWU6IFJlZmxlY3QuZ2V0KHZhcmlhYmxlLCBcIm5hbWVcIiksXG4gICAgICAgICAgb2Zmc2V0OiBSZWZsZWN0LmdldCh2YXJpYWJsZSwgXCJsb2NcIik/LnN0YXJ0Lm9mZnNldFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2luZCA9PSBcImZvcmVhY2hcIikge1xuICAgICAgY29uc3QgcmVjZWl2ZXIgPSBSZWZsZWN0LmdldChjYW5kaWRhdGUsIFwic291cmNlXCIpXG5cbiAgICAgIGlmIChSZWZsZWN0LmdldChyZWNlaXZlciwgXCJraW5kXCIpID09IFwidmFyaWFibGVcIiAmJiB0eXBlb2YgUmVmbGVjdC5nZXQocmVjZWl2ZXIsIFwibmFtZVwiKSA9PSBcInN0cmluZ1wiICYmXG4gICAgICAgIFJlZmxlY3QuZ2V0KGNhbmRpZGF0ZSwgXCJrZXlcIikpIHJlY2VpdmVycy5wdXNoKHtcbiAgICAgICAgbmFtZTogUmVmbGVjdC5nZXQocmVjZWl2ZXIsIFwibmFtZVwiKSxcbiAgICAgICAgb2Zmc2V0OiBSZWZsZWN0LmdldChjYW5kaWRhdGUsIFwibG9jXCIpPy5zdGFydC5vZmZzZXRcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKGNhbmRpZGF0ZSkpIHtcbiAgICAgIGlmIChbXCJsb2NcIiwgXCJsZWFkaW5nQ29tbWVudHNcIiwgXCJ0cmFpbGluZ0NvbW1lbnRzXCJdLmluY2x1ZGVzKGtleSkpIGNvbnRpbnVlXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNoaWxkKSB2aXNpdChpdGVtKVxuICAgICAgfSBlbHNlIHZpc2l0KGNoaWxkKVxuICAgIH1cbiAgfVxuXG4gIHZpc2l0KHZhbHVlKVxuICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQoKVxuICBmb3IgKGNvbnN0IHJlY2VpdmVyIG9mIHJlY2VpdmVycykge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBkZWNsYXJhdGlvbnMuZmlsdGVyKCh7bmFtZSwgb2Zmc2V0fSkgPT4gbmFtZSA9PSByZWNlaXZlci5uYW1lICYmIG9mZnNldCA8IHJlY2VpdmVyLm9mZnNldClcblxuICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PSAxKSBzZWxlY3RlZC5hZGQobWF0Y2hlc1swXS5kZWNsYXJhdGlvbilcbiAgfVxuXG4gIHJldHVybiBzZWxlY3RlZFxufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBleGFjdCBmaW5hbCBSdW50aW1lRXhjZXB0aW9uIHN1YmNsYXNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkNsYXNzfSBub2RlIC0gUEhQIGNsYXNzIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9ufSBkZWNsYXJhdGlvbiAtIFByZWRlY2xhcmVkIHNlbWFudGljIGVycm9yLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9ufSBTZW1hbnRpYyBlcnJvciBkZWNsYXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gY29udmVydFBocEVycm9yKG5vZGUsIGRlY2xhcmF0aW9uLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IHBhcmVudCA9IG5vZGUuZXh0ZW5kc1xuICBjb25zdCBwYXJlbnROYW1lID0gcGFyZW50Py5raW5kID09IFwibmFtZVwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5hbWV9ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChwYXJlbnQpKSA6IHVuZGVmaW5lZFxuXG4gIGlmIChub2RlLmlzQW5vbnltb3VzIHx8ICFub2RlLmlzRmluYWwgfHwgbm9kZS5pc1JlYWRvbmx5IHx8IG5vZGUuaXNBYnN0cmFjdCB8fCBub2RlLmltcGxlbWVudHM/Lmxlbmd0aCB8fFxuICAgIG5vZGUuYXR0ckdyb3Vwcy5sZW5ndGggfHwgbm9kZS5ib2R5Lmxlbmd0aCAhPSAwIHx8ICFwYXJlbnROYW1lIHx8XG4gICAgIShwYXJlbnROYW1lLm5hbWUgPT0gXCJSdW50aW1lRXhjZXB0aW9uXCIgJiYgcGFyZW50TmFtZS5yZXNvbHV0aW9uID09IFwidXFuXCIgfHxcbiAgICAgIHBhcmVudE5hbWUubmFtZSA9PSBcIlxcXFxSdW50aW1lRXhjZXB0aW9uXCIgJiYgcGFyZW50TmFtZS5yZXNvbHV0aW9uID09IFwiZnFuXCIpKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibm9uY2Fub25pY2FsIHR5cGVkIGVycm9yIGRlY2xhcmF0aW9uXCIsIGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IG5hbWVOb2RlID0gdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZSA6IG5vZGUubmFtZVxuXG4gIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKGRlY2xhcmF0aW9uLCB7bmFtZTogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKSwgdHlwZTogbm9kZUxvY2F0aW9uKHBhcmVudE5hbWUsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbn1cblxuLyoqXG4gKiBSZWFkcyBvbmUgZXhhY3QgcHVibGljIFBIUCBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZS1tZXRob2Qgc2lnbmF0dXJlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk1ldGhvZH0gbm9kZSAtIFBhcnNlci1vd25lZCBtZXRob2QuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb24+fSBub21pbmFsTmFtZXMgLSBWaXNpYmxlIG5vbWluYWwgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IG93bmVySWQgLSBTdGFibGUgY2FsbGFibGUgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNvbnN0cnVjdG9yIC0gV2hldGhlciB0aGlzIGlzIHRoZSBzb2xlIGNvbnN0cnVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHt7bG9jYXRpb246IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uLCBuYW1lOiBzdHJpbmcsIG5hbWVMb2NhdGlvbjogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIHBhcmFtZXRlcnM6IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlBhcmFtZXRlcltdLCByZXR1cm5UeXBlPzogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9fSBFeGFjdCBzaWduYXR1cmUuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRQaHBDbGFzc0NhbGxhYmxlU2lnbmF0dXJlKG5vZGUsIG5vbWluYWxOYW1lcywgb3duZXJJZCwgY29uc3RydWN0b3IsIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgbmFtZSA9IHR5cGVvZiBub2RlLm5hbWUgPT0gXCJzdHJpbmdcIiA/IG5vZGUubmFtZSA6IG5vZGUubmFtZS5uYW1lXG5cbiAgaWYgKCFjb25zdHJ1Y3RvciAmJiAvXl9fL3UudGVzdChuYW1lKSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGByZXNlcnZlZCByZWZlcmVuY2UgbWV0aG9kICcke25hbWV9J2AsIGxvY2F0aW9uKVxuICBpZiAobm9kZS52aXNpYmlsaXR5ICE9IFwicHVibGljXCIgfHwgbm9kZS5pc1N0YXRpYyB8fCBub2RlLmlzQWJzdHJhY3QgfHwgbm9kZS5pc0ZpbmFsIHx8IFJlZmxlY3QuZ2V0KG5vZGUsIFwiaXNSZWFkb25seVwiKSB8fCBub2RlLmJ5cmVmIHx8XG4gICAgbm9kZS5hdHRyR3JvdXBzLmxlbmd0aCB8fCAhbm9kZS5ib2R5IHx8IGNvbnN0cnVjdG9yICE9IChuYW1lID09IFwiX19jb25zdHJ1Y3RcIikpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgcmVmZXJlbmNlIGNsYXNzIGNhbGxhYmxlXCIsIGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGRvY3VtZW50ZWQgPSBmdW5jdGlvbkRvY3VtZW50ZWRUeXBlcygvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRnVuY3Rpb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChub2RlKSksXG4gICAgZmlsZW5hbWUsIHNvdXJjZSwgb3duZXJJZClcbiAgaWYgKGRvY3VtZW50ZWQudHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZ2VuZXJpYyByZWZlcmVuY2UgY2xhc3MgY2FsbGFibGVcIiwgbG9jYXRpb24pXG4gIGlmIChjb25zdHJ1Y3RvciAmJiAobm9kZS50eXBlIHx8IG5vZGUubnVsbGFibGUgfHwgZG9jdW1lbnRlZC5yZXR1cm5UeXBlKSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImNvbnN0cnVjdG9yIHJldHVybiBhbm5vdGF0aW9uXCIsIGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IHBhcmFtZXRlcnMgPSBub2RlLmFyZ3VtZW50cy5tYXAoKHBhcmFtZXRlcikgPT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlckxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKHBhcmFtZXRlciwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICBjb25zdCBwYXJhbWV0ZXJOYW1lID0gdHlwZW9mIHBhcmFtZXRlci5uYW1lID09IFwic3RyaW5nXCIgPyBwYXJhbWV0ZXIubmFtZSA6IHBhcmFtZXRlci5uYW1lLm5hbWVcblxuICAgIGlmIChwYXJhbWV0ZXIuYnlyZWYgfHwgcGFyYW1ldGVyLnZhcmlhZGljIHx8IHBhcmFtZXRlci52YWx1ZSB8fCBwYXJhbWV0ZXIuZmxhZ3MgfHwgcGFyYW1ldGVyLnJlYWRvbmx5IHx8XG4gICAgICBwYXJhbWV0ZXIuaG9va3MubGVuZ3RoIHx8IHBhcmFtZXRlci5hdHRyR3JvdXBzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibm9uY2Fub25pY2FsIHJlZmVyZW5jZSBjbGFzcyBwYXJhbWV0ZXJcIiwgcGFyYW1ldGVyTG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGRvY3VtZW50ZWRUeXBlID0gZG9jdW1lbnRlZC5wYXJhbWV0ZXJzLmdldChwYXJhbWV0ZXJOYW1lKVxuICAgIGNvbnN0IG5hdGl2ZVR5cGUgPSBwaHBUeXBlTmFtZShwYXJhbWV0ZXIudHlwZSlcbiAgICBsZXQgdHlwZSA9IGRvY3VtZW50ZWRUeXBlXG4gICAgICA/IGRvY3VtZW50ZWRWYWx1ZVR5cGUoe2xhbmd1YWdlOiBcInBocFwiLCBsb2NhdGlvbjogZG9jdW1lbnRlZFR5cGUubG9jYXRpb24sIG93bmVyTG9jYXRpb246IHBhcmFtZXRlckxvY2F0aW9uLFxuICAgICAgICByZWNvcmRzOiBub21pbmFsTmFtZXMsIHNvdXJjZSwgc291cmNlVHlwZTogZG9jdW1lbnRlZFR5cGUuc291cmNlVHlwZSwgc3ViamVjdDogYFBhcmFtZXRlciAnJHtwYXJhbWV0ZXJOYW1lfSdgfSlcbiAgICAgIDogY29udmVydFR5cGUocGFyYW1ldGVyLnR5cGUsIGBQYXJhbWV0ZXIgJyR7cGFyYW1ldGVyTmFtZX0nYCwgcGFyYW1ldGVyTG9jYXRpb24sIGZpbGVuYW1lLCBzb3VyY2UsIG5vbWluYWxOYW1lcylcblxuICAgIGlmIChuYXRpdmVUeXBlID09IFwiYXJyYXlcIiAmJiAhZG9jdW1lbnRlZFR5cGUpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgUGFyYW1ldGVyICcke3BhcmFtZXRlck5hbWV9J2AsIHBhcmFtZXRlckxvY2F0aW9uKVxuICAgIGlmIChkb2N1bWVudGVkVHlwZSAmJiAhcGhwRG9jdW1lbnRlZE5hdGl2ZVR5cGVNYXRjaGVzKG5hdGl2ZVR5cGUsIHBhcmFtZXRlci5udWxsYWJsZSwgdHlwZSwgbm9taW5hbE5hbWVzKSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZG9jdW1lbnRlZCBwYXJhbWV0ZXIgdHlwZSBpbmNvbXBhdGlibGUgd2l0aCBuYXRpdmUgdHlwZVwiLCBkb2N1bWVudGVkVHlwZS5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKHBhcmFtZXRlci5udWxsYWJsZSAmJiB0eXBlLmtpbmQgIT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgICAgaWYgKCFwYXJhbWV0ZXIudHlwZSkgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIGBQYXJhbWV0ZXIgJyR7cGFyYW1ldGVyTmFtZX0nYCwgcGFyYW1ldGVyTG9jYXRpb24pXG4gICAgICB0eXBlID0gbnVsbGFibGVUeXBlKHR5cGUsIHBhcmFtZXRlci50eXBlLCBwYXJhbWV0ZXIubG9jPy5zdGFydC5vZmZzZXQgPz8gMCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICB9IGVsc2UgaWYgKCFwYXJhbWV0ZXIubnVsbGFibGUgJiYgdHlwZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm9wdGlvbmFsIGFubm90YXRpb24gd2l0aG91dCBudWxsYWJsZSBuYXRpdmUgdHlwZVwiLCBkb2N1bWVudGVkVHlwZT8ubG9jYXRpb24gPz8gcGFyYW1ldGVyTG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IG5hbWVOb2RlID0gdHlwZW9mIHBhcmFtZXRlci5uYW1lID09IFwic3RyaW5nXCIgPyBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXIubmFtZVxuXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlBhcmFtZXRlclwiKSwgbG9jYXRpb246IHBhcmFtZXRlckxvY2F0aW9uLFxuICAgICAgbmFtZTogcGFyYW1ldGVyTmFtZSwgdHlwZX0sIHtuYW1lOiBub2RlTG9jYXRpb24obmFtZU5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgfSlcbiAgaWYgKFsuLi5kb2N1bWVudGVkLnBhcmFtZXRlcnMua2V5cygpXS5zb21lKChwYXJhbWV0ZXJOYW1lKSA9PlxuICAgICFub2RlLmFyZ3VtZW50cy5zb21lKChwYXJhbWV0ZXIpID0+ICh0eXBlb2YgcGFyYW1ldGVyLm5hbWUgPT0gXCJzdHJpbmdcIiA/IHBhcmFtZXRlci5uYW1lIDogcGFyYW1ldGVyLm5hbWUubmFtZSkgPT0gcGFyYW1ldGVyTmFtZSkpKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibWV0aG9kIFBIUERvYyBwYXJhbWV0ZXIgbWlzbWF0Y2hcIiwgbG9jYXRpb24pXG4gIH1cbiAgY29uc3QgbmFtZU5vZGUgPSB0eXBlb2Ygbm9kZS5uYW1lID09IFwic3RyaW5nXCIgPyBub2RlIDogbm9kZS5uYW1lXG5cbiAgaWYgKGNvbnN0cnVjdG9yKSByZXR1cm4ge2xvY2F0aW9uLCBuYW1lOiBcImNvbnN0cnVjdG9yXCIsIG5hbWVMb2NhdGlvbjogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKSwgcGFyYW1ldGVyc31cbiAgbGV0IHJldHVyblR5cGVcbiAgY29uc3QgbmF0aXZlUmV0dXJuVHlwZSA9IHBocFR5cGVOYW1lKG5vZGUudHlwZSlcblxuICBpZiAoZG9jdW1lbnRlZC5yZXR1cm5UeXBlKSB7XG4gICAgcmV0dXJuVHlwZSA9IGRvY3VtZW50ZWRWYWx1ZVR5cGUoe2xhbmd1YWdlOiBcInBocFwiLCBsb2NhdGlvbjogZG9jdW1lbnRlZC5yZXR1cm5UeXBlLmxvY2F0aW9uLCBvd25lckxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgIHJlY29yZHM6IG5vbWluYWxOYW1lcywgc291cmNlLCBzb3VyY2VUeXBlOiBkb2N1bWVudGVkLnJldHVyblR5cGUuc291cmNlVHlwZSwgc3ViamVjdDogYE1ldGhvZCAnJHtuYW1lfScgcmV0dXJuYH0pXG4gICAgaWYgKCFwaHBEb2N1bWVudGVkTmF0aXZlVHlwZU1hdGNoZXMobmF0aXZlUmV0dXJuVHlwZSwgbm9kZS5udWxsYWJsZSwgcmV0dXJuVHlwZSwgbm9taW5hbE5hbWVzKSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZG9jdW1lbnRlZCBtZXRob2QgcmV0dXJuIHR5cGUgaW5jb21wYXRpYmxlIHdpdGggbmF0aXZlIHR5cGVcIiwgZG9jdW1lbnRlZC5yZXR1cm5UeXBlLmxvY2F0aW9uKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAobmF0aXZlUmV0dXJuVHlwZSA9PSBcImFycmF5XCIpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgTWV0aG9kICcke25hbWV9JyByZXR1cm5gLCBsb2NhdGlvbilcbiAgICByZXR1cm5UeXBlID0gY29udmVydFJldHVyblR5cGUobm9kZS50eXBlLCBgTWV0aG9kICcke25hbWV9JyByZXR1cm5gLCBsb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSwgbm9taW5hbE5hbWVzKVxuICB9XG4gIGlmIChub2RlLm51bGxhYmxlICYmIHJldHVyblR5cGUua2luZCAhPSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgaWYgKCFub2RlLnR5cGUpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgTWV0aG9kICcke25hbWV9JyByZXR1cm5gLCBsb2NhdGlvbilcbiAgICByZXR1cm5UeXBlID0gbnVsbGFibGVUeXBlKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9ICovIChyZXR1cm5UeXBlKSwgbm9kZS50eXBlLFxuICAgICAgbm9kZS50eXBlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIH0gZWxzZSBpZiAoIW5vZGUubnVsbGFibGUgJiYgcmV0dXJuVHlwZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJvcHRpb25hbCBhbm5vdGF0aW9uIHdpdGhvdXQgbnVsbGFibGUgbmF0aXZlIHJldHVybiB0eXBlXCIsIGRvY3VtZW50ZWQucmV0dXJuVHlwZT8ubG9jYXRpb24gPz8gbG9jYXRpb24pXG4gIH1cblxuICByZXR1cm4ge2xvY2F0aW9uLCBuYW1lLCBuYW1lTG9jYXRpb246IG5vZGVMb2NhdGlvbihuYW1lTm9kZSwgZmlsZW5hbWUsIHNvdXJjZSksIHBhcmFtZXRlcnMsIHJldHVyblR5cGV9XG59XG5cbi8qKlxuICogQ29udmVydHMgdGhlIGJvdW5kZWQgZmluYWwvcHJpdmF0ZS1maWVsZCBQSFAgcmVmZXJlbmNlLWNsYXNzIHByb2ZpbGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuQ2xhc3N9IG5vZGUgLSBQYXJzZXIgY2xhc3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gUHJlZGVjbGFyZWQgY2xhc3MgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb24+fSBub21pbmFsTmFtZXMgLSBWaXNpYmxlIG5vbWluYWwgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj59IHJlY29yZHMgLSBSZWNvcmRzIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uPn0gY2xhc3NlcyAtIENsYXNzZXMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIFBocEZ1bmN0aW9uU2lnbmF0dXJlPn0gZnVuY3Rpb25zIC0gVG9wLWxldmVsIHNpZ25hdHVyZXMuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24+fSBlcnJvck5hbWVzIC0gRXJyb3JzIGJ5IG5hbWUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24+fSBlcnJvcnMgLSBFcnJvcnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb259IFNlbWFudGljIGNsYXNzLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0UGhwUmVmZXJlbmNlQ2xhc3Mobm9kZSwgZGVjbGFyYXRpb24sIG5vbWluYWxOYW1lcywgcmVjb3JkcywgY2xhc3NlcywgZnVuY3Rpb25zLCBlcnJvck5hbWVzLCBlcnJvcnMsXG4gIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAobm9kZS5pc0Fub255bW91cyB8fCAhbm9kZS5pc0ZpbmFsIHx8IG5vZGUuaXNSZWFkb25seSB8fCBub2RlLmlzQWJzdHJhY3QgfHwgbm9kZS5leHRlbmRzIHx8IG5vZGUuaW1wbGVtZW50cz8ubGVuZ3RoIHx8XG4gICAgbm9kZS5hdHRyR3JvdXBzLmxlbmd0aCkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwicmVmZXJlbmNlIGNsYXNzIGluaGVyaXRhbmNlIG9yIG5vbmNhbm9uaWNhbCBtb2RpZmllclwiLCBsb2NhdGlvbilcbiAgY29uc3QgZmllbGRTdGF0ZW1lbnRzID0gbm9kZS5ib2R5LmZpbHRlcigobWVtYmVyKSA9PiBtZW1iZXIua2luZCA9PSBcInByb3BlcnR5c3RhdGVtZW50XCIpXG4gIGNvbnN0IG1ldGhvZE5vZGVzID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk1ldGhvZFtdfSAqLyAobm9kZS5ib2R5LmZpbHRlcigobWVtYmVyKSA9PiBtZW1iZXIua2luZCA9PSBcIm1ldGhvZFwiKSlcbiAgY29uc3QgY29uc3RydWN0b3JzID0gbWV0aG9kTm9kZXMuZmlsdGVyKChtZXRob2QpID0+ICh0eXBlb2YgbWV0aG9kLm5hbWUgPT0gXCJzdHJpbmdcIiA/IG1ldGhvZC5uYW1lIDogbWV0aG9kLm5hbWUubmFtZSkgPT0gXCJfX2NvbnN0cnVjdFwiKVxuICBjb25zdCBvcmRpbmFyeU1ldGhvZHMgPSBtZXRob2ROb2Rlcy5maWx0ZXIoKG1ldGhvZCkgPT4gIWNvbnN0cnVjdG9ycy5pbmNsdWRlcyhtZXRob2QpKVxuXG4gIGlmIChjb25zdHJ1Y3RvcnMubGVuZ3RoICE9IDEgfHwgZmllbGRTdGF0ZW1lbnRzLmxlbmd0aCA9PSAwIHx8IGZpZWxkU3RhdGVtZW50cy5sZW5ndGggKyBtZXRob2ROb2Rlcy5sZW5ndGggIT0gbm9kZS5ib2R5Lmxlbmd0aCkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInJlZmVyZW5jZSBjbGFzcyByZXF1aXJlcyBwcml2YXRlIGZpZWxkcywgb25lIGNvbnN0cnVjdG9yLCBhbmQgb3JkaW5hcnkgbWV0aG9kc1wiLCBsb2NhdGlvbilcbiAgfVxuICBkZWNsYXJhdGlvbi5maWVsZHMgPSBmaWVsZFN0YXRlbWVudHMubWFwKChzdGF0ZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZmllbGRMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihzdGF0ZW1lbnQsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgY29uc3QgcHJvcGVydGllcyA9IFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJwcm9wZXJ0aWVzXCIpXG4gICAgY29uc3QgcHJvcGVydHkgPSBBcnJheS5pc0FycmF5KHByb3BlcnRpZXMpICYmIHByb3BlcnRpZXMubGVuZ3RoID09IDEgPyBwcm9wZXJ0aWVzWzBdIDogdW5kZWZpbmVkXG4gICAgY29uc3QgbmFtZU5vZGUgPSBwcm9wZXJ0eT8ubmFtZVxuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgbmFtZU5vZGUgPT0gXCJzdHJpbmdcIiA/IG5hbWVOb2RlIDogbmFtZU5vZGU/Lm5hbWVcblxuICAgIGlmIChSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwidmlzaWJpbGl0eVwiKSAhPSBcInByaXZhdGVcIiB8fCBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiaXNTdGF0aWNcIikgfHxcbiAgICAgIFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJpc0Fic3RyYWN0XCIpIHx8IFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJpc0ZpbmFsXCIpIHx8ICFwcm9wZXJ0eSB8fFxuICAgICAgdHlwZW9mIG5hbWUgIT0gXCJzdHJpbmdcIiB8fCBwcm9wZXJ0eS52YWx1ZSB8fCBwcm9wZXJ0eS5yZWFkb25seSB8fCBwcm9wZXJ0eS5udWxsYWJsZSB8fCBwcm9wZXJ0eS5hdHRyR3JvdXBzPy5sZW5ndGggfHxcbiAgICAgIHByb3BlcnR5Lmhvb2tzPy5sZW5ndGgpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm5vbmNhbm9uaWNhbCBwcml2YXRlIGluc3RhbmNlIGZpZWxkXCIsIGZpZWxkTG9jYXRpb24pXG4gICAgY29uc3QgdHlwZSA9IGNvbnZlcnRUeXBlKHByb3BlcnR5LnR5cGUsIGBQcml2YXRlIGZpZWxkICcke25hbWV9J2AsIGZpZWxkTG9jYXRpb24sIGZpbGVuYW1lLCBzb3VyY2UsIG5vbWluYWxOYW1lcylcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtpZDogYCR7ZGVjbGFyYXRpb24uaWR9OmZpZWxkOiR7aW5kZXh9YCwga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUHJpdmF0ZUZpZWxkXCIpLFxuICAgICAgbG9jYXRpb246IGZpZWxkTG9jYXRpb24sIG5hbWUsIHR5cGV9LCB7bmFtZTogbm9kZUxvY2F0aW9uKHR5cGVvZiBuYW1lTm9kZSA9PSBcInN0cmluZ1wiID8gcHJvcGVydHkgOiBuYW1lTm9kZSwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICB9KVxuICBjb25zdCBjb25zdHJ1Y3Rvck5vZGUgPSBjb25zdHJ1Y3RvcnNbMF1cbiAgY29uc3QgY29uc3RydWN0b3JTaWduYXR1cmUgPSBjb252ZXJ0UGhwQ2xhc3NDYWxsYWJsZVNpZ25hdHVyZShjb25zdHJ1Y3Rvck5vZGUsIG5vbWluYWxOYW1lcyxcbiAgICBgJHtkZWNsYXJhdGlvbi5pZH06Y29uc3RydWN0b3JgLCB0cnVlLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yID0gd2l0aFBhcnNlclJhbmdlcyh7Ym9keTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CbG9ja30gKi8gKHt9KSxcbiAgICBpZDogYCR7ZGVjbGFyYXRpb24uaWR9OmNvbnN0cnVjdG9yYCwga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiQ29uc3RydWN0b3JEZWNsYXJhdGlvblwiKSxcbiAgICBsb2NhdGlvbjogY29uc3RydWN0b3JTaWduYXR1cmUubG9jYXRpb24sIHBhcmFtZXRlcnM6IGNvbnN0cnVjdG9yU2lnbmF0dXJlLnBhcmFtZXRlcnN9LCB7Y29uc3RydWN0b3I6IGNvbnN0cnVjdG9yU2lnbmF0dXJlLm5hbWVMb2NhdGlvbn0pXG4gIGNvbnN0IG1ldGhvZFNpZ25hdHVyZXMgPSBvcmRpbmFyeU1ldGhvZHMubWFwKChtZXRob2QsIGluZGV4KSA9PiBjb252ZXJ0UGhwQ2xhc3NDYWxsYWJsZVNpZ25hdHVyZShtZXRob2QsIG5vbWluYWxOYW1lcyxcbiAgICBgJHtkZWNsYXJhdGlvbi5pZH06bWV0aG9kOiR7aW5kZXh9YCwgZmFsc2UsIGZpbGVuYW1lLCBzb3VyY2UpKVxuXG4gIGRlY2xhcmF0aW9uLm1ldGhvZHMgPSBtZXRob2RTaWduYXR1cmVzLm1hcCgoc2lnbmF0dXJlLCBpbmRleCkgPT4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgYm9keTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CbG9ja30gKi8gKHt9KSwgaWQ6IGAke2RlY2xhcmF0aW9uLmlkfTptZXRob2Q6JHtpbmRleH1gLFxuICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIk1ldGhvZERlY2xhcmF0aW9uXCIpLCBsb2NhdGlvbjogc2lnbmF0dXJlLmxvY2F0aW9uLCBuYW1lOiBzaWduYXR1cmUubmFtZSxcbiAgICBwYXJhbWV0ZXJzOiBzaWduYXR1cmUucGFyYW1ldGVycyxcbiAgICByZXR1cm5UeXBlOiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSAqLyAoc2lnbmF0dXJlLnJldHVyblR5cGUpXG4gIH0sIHtuYW1lOiBzaWduYXR1cmUubmFtZUxvY2F0aW9ufSkpXG4gIGNvbnN0IGJhc2UgPSB7YmluZGluZ3M6IG5ldyBNYXAoKSwgY2xhc3NlcywgY3VycmVudENsYXNzOiBkZWNsYXJhdGlvbiwgZXJyb3JOYW1lcywgZXJyb3JzLCBmdW5jdGlvbnMsXG4gICAgcmVjb3JkTmFtZXM6IG5vbWluYWxOYW1lcywgcmVjb3Jkc31cblxuICBkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5ib2R5ID0gY29udmVydEJsb2NrKC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5CbG9ja30gKi8gKGNvbnN0cnVjdG9yTm9kZS5ib2R5KSwgZmlsZW5hbWUsIHNvdXJjZSxcbiAgICB7Li4uYmFzZSwgYmluZGluZ3M6IG5ldyBNYXAoZGVjbGFyYXRpb24uY29uc3RydWN0b3IucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gW3BhcmFtZXRlci5uYW1lLCBwYXJhbWV0ZXIudHlwZV0pKSxcbiAgICAgIHJldHVyblR5cGU6IHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJUeXBlUmVmZXJlbmNlXCIpLCBuYW1lOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJ2b2lkXCIpfX0pXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvcmRpbmFyeU1ldGhvZHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgbWV0aG9kID0gZGVjbGFyYXRpb24ubWV0aG9kc1tpbmRleF1cblxuICAgIG1ldGhvZC5ib2R5ID0gY29udmVydEJsb2NrKC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5CbG9ja30gKi8gKG9yZGluYXJ5TWV0aG9kc1tpbmRleF0uYm9keSksIGZpbGVuYW1lLCBzb3VyY2UsXG4gICAgICB7Li4uYmFzZSwgYmluZGluZ3M6IG5ldyBNYXAobWV0aG9kLnBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIubmFtZSwgcGFyYW1ldGVyLnR5cGVdKSksIHJldHVyblR5cGU6IG1ldGhvZC5yZXR1cm5UeXBlfSlcbiAgfVxuICBjb25zdCBuYW1lTm9kZSA9IHR5cGVvZiBub2RlLm5hbWUgPT0gXCJzdHJpbmdcIiA/IG5vZGUgOiBub2RlLm5hbWVcblxuICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyhkZWNsYXJhdGlvbiwge25hbWU6IG5vZGVMb2NhdGlvbihuYW1lTm9kZSwgZmlsZW5hbWUsIHNvdXJjZSl9KVxufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBleGFjdCBmaW5hbCByZWFkb25seSBwcm9tb3RlZC1wcm9wZXJ0eSBQSFAgcmVjb3JkLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkNsYXNzfSBub2RlIC0gUEhQIGNsYXNzIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbn0gZGVjbGFyYXRpb24gLSBQcmVkZWNsYXJlZCBub21pbmFsIGlkZW50aXR5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj59IHJlY29yZE5hbWVzIC0gUmVjb3JkIGRlY2xhcmF0aW9ucyBieSBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbn0gU2VtYW50aWMgcmVjb3JkLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0UGhwUmVjb3JkKG5vZGUsIGRlY2xhcmF0aW9uLCByZWNvcmROYW1lcywgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBnZW5lcmljID0gKGRlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzPy5sZW5ndGggPz8gMCkgPiAwXG5cbiAgaWYgKG5vZGUuaXNBbm9ueW1vdXMgfHwgIW5vZGUuaXNGaW5hbCB8fCBub2RlLmlzUmVhZG9ubHkgPT0gZ2VuZXJpYyB8fCBub2RlLmlzQWJzdHJhY3QgfHwgbm9kZS5leHRlbmRzIHx8IG5vZGUuaW1wbGVtZW50cz8ubGVuZ3RoIHx8XG4gICAgbm9kZS5hdHRyR3JvdXBzLmxlbmd0aCkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibm9uY2Fub25pY2FsIHJlY29yZCBjbGFzcyBtb2RpZmllcnNcIiwgbG9jYXRpb24pXG4gIGlmIChub2RlLmJvZHkubGVuZ3RoIDwgMSB8fCBub2RlLmJvZHlbMF0ua2luZCAhPSBcIm1ldGhvZFwiIHx8ICFnZW5lcmljICYmIG5vZGUuYm9keS5sZW5ndGggIT0gMSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInJlY29yZCBjbGFzcyBib2R5IG91dHNpZGUgb25lIGNvbnN0cnVjdG9yXCIsIG5vZGVMb2NhdGlvbihub2RlLmJvZHlbMV0gPz8gbm9kZS5ib2R5WzBdID8/IG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG4gIGNvbnN0IGNvbnN0cnVjdG9yID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk1ldGhvZH0gKi8gKG5vZGUuYm9keVswXSlcbiAgY29uc3QgdHlwZVBhcmFtZXRlck5hbWVzID0gbmV3IE1hcCgoZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMgPz8gW10pLm1hcCgocGFyYW1ldGVyKSA9PiBbcGFyYW1ldGVyLm5hbWUsIHBhcmFtZXRlcl0pKVxuICBjb25zdCBjb25zdHJ1Y3Rvck5hbWUgPSB0eXBlb2YgY29uc3RydWN0b3IubmFtZSA9PSBcInN0cmluZ1wiID8gY29uc3RydWN0b3IubmFtZSA6IGNvbnN0cnVjdG9yLm5hbWUubmFtZVxuXG4gIGlmIChjb25zdHJ1Y3Rvck5hbWUgIT0gXCJfX2NvbnN0cnVjdFwiIHx8IGNvbnN0cnVjdG9yLnZpc2liaWxpdHkgIT0gXCJwdWJsaWNcIiB8fCBjb25zdHJ1Y3Rvci5pc1N0YXRpYyB8fCBjb25zdHJ1Y3Rvci5pc0Fic3RyYWN0IHx8XG4gICAgY29uc3RydWN0b3IuaXNGaW5hbCB8fCBSZWZsZWN0LmdldChjb25zdHJ1Y3RvciwgXCJpc1JlYWRvbmx5XCIpIHx8IGNvbnN0cnVjdG9yLmJ5cmVmIHx8IGNvbnN0cnVjdG9yLnR5cGUgfHwgY29uc3RydWN0b3IubnVsbGFibGUgfHxcbiAgICBjb25zdHJ1Y3Rvci5hdHRyR3JvdXBzLmxlbmd0aCB8fCAhY29uc3RydWN0b3IuYm9keSB8fCBjb25zdHJ1Y3Rvci5ib2R5LmNoaWxkcmVuLmxlbmd0aCAhPSAwKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibm9uY2Fub25pY2FsIHJlY29yZCBjb25zdHJ1Y3RvclwiLCBub2RlTG9jYXRpb24oY29uc3RydWN0b3IsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG4gIGNvbnN0IGRvY3VtZW50ZWQgPSBmdW5jdGlvbkRvY3VtZW50ZWRUeXBlcygvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRnVuY3Rpb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChjb25zdHJ1Y3RvcikpLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIGRlY2xhcmF0aW9uLmZpZWxkcyA9IGNvbnN0cnVjdG9yLmFyZ3VtZW50cy5tYXAoKHBhcmFtZXRlcikgPT4ge1xuICAgIGNvbnN0IGZpZWxkTG9jYXRpb24gPSBub2RlTG9jYXRpb24ocGFyYW1ldGVyLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgcGFyYW1ldGVyLm5hbWUgPT0gXCJzdHJpbmdcIiA/IHBhcmFtZXRlci5uYW1lIDogcGFyYW1ldGVyLm5hbWUubmFtZVxuICAgIGNvbnN0IGRvY3VtZW50ZWRUeXBlID0gZG9jdW1lbnRlZC5wYXJhbWV0ZXJzLmdldChuYW1lKVxuICAgIGNvbnN0IG5hdGl2ZVR5cGUgPSBwaHBUeXBlTmFtZShwYXJhbWV0ZXIudHlwZSlcblxuICAgIGlmIChwYXJhbWV0ZXIuZmxhZ3MgIT0gKGdlbmVyaWMgPyA0IDogMSkgfHwgcGFyYW1ldGVyLmJ5cmVmIHx8IHBhcmFtZXRlci52YXJpYWRpYyB8fCBwYXJhbWV0ZXIudmFsdWUgfHwgcGFyYW1ldGVyLnJlYWRvbmx5IHx8XG4gICAgICBwYXJhbWV0ZXIuaG9va3MubGVuZ3RoIHx8IHBhcmFtZXRlci5hdHRyR3JvdXBzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwicmVjb3JkIGZpZWxkIG91dHNpZGUgcHVibGljIHByb21vdGVkLXByb3BlcnR5IHByb2ZpbGVcIiwgZmllbGRMb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKG5hdGl2ZVR5cGUgPT0gXCJhcnJheVwiICYmICFkb2N1bWVudGVkVHlwZSkgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIGBSZWNvcmQgZmllbGQgJyR7bmFtZX0nYCwgZmllbGRMb2NhdGlvbilcbiAgICBsZXQgdHlwZSA9IGRvY3VtZW50ZWRUeXBlXG4gICAgICA/IGRvY3VtZW50ZWRWYWx1ZVR5cGUoe2xhbmd1YWdlOiBcInBocFwiLCBsb2NhdGlvbjogZG9jdW1lbnRlZFR5cGUubG9jYXRpb24sIG93bmVyTG9jYXRpb246IGZpZWxkTG9jYXRpb24sIHJlY29yZHM6IHJlY29yZE5hbWVzLFxuICAgICAgICBzb3VyY2UsIHNvdXJjZVR5cGU6IGRvY3VtZW50ZWRUeXBlLnNvdXJjZVR5cGUsIHN1YmplY3Q6IGBSZWNvcmQgZmllbGQgJyR7bmFtZX0nYCwgdHlwZVBhcmFtZXRlcnM6IHR5cGVQYXJhbWV0ZXJOYW1lc30pXG4gICAgICA6IGNvbnZlcnRUeXBlKHBhcmFtZXRlci50eXBlLCBgUmVjb3JkIGZpZWxkICcke25hbWV9J2AsIGZpZWxkTG9jYXRpb24sIGZpbGVuYW1lLCBzb3VyY2UsIHJlY29yZE5hbWVzKVxuXG4gICAgaWYgKGRvY3VtZW50ZWRUeXBlICYmICFwaHBEb2N1bWVudGVkTmF0aXZlVHlwZU1hdGNoZXMobmF0aXZlVHlwZSwgcGFyYW1ldGVyLm51bGxhYmxlLCB0eXBlLCByZWNvcmROYW1lcykpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImRvY3VtZW50ZWQgcmVjb3JkIGZpZWxkIHR5cGUgaW5jb21wYXRpYmxlIHdpdGggbmF0aXZlIHR5cGVcIiwgZG9jdW1lbnRlZFR5cGUubG9jYXRpb24pXG4gICAgfVxuXG4gICAgaWYgKHBhcmFtZXRlci5udWxsYWJsZSAmJiB0eXBlLmtpbmQgIT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgICAgaWYgKCFwYXJhbWV0ZXIudHlwZSkgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIGBSZWNvcmQgZmllbGQgJyR7bmFtZX0nYCwgZmllbGRMb2NhdGlvbilcbiAgICAgIHR5cGUgPSBudWxsYWJsZVR5cGUodHlwZSwgcGFyYW1ldGVyLnR5cGUsIHBhcmFtZXRlci5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIH0gZWxzZSBpZiAoIXBhcmFtZXRlci5udWxsYWJsZSAmJiB0eXBlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIiAmJiB0eXBlLnZhbHVlVHlwZS5raW5kICE9IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm9wdGlvbmFsIGFubm90YXRpb24gd2l0aG91dCBudWxsYWJsZSBuYXRpdmUgcmVjb3JkIGZpZWxkXCIsIGRvY3VtZW50ZWRUeXBlPy5sb2NhdGlvbiA/PyBmaWVsZExvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBmaWVsZCA9IHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJSZWNvcmRGaWVsZFwiKSwgbG9jYXRpb246IGZpZWxkTG9jYXRpb24sIG5hbWUsIHR5cGV9XG4gICAgY29uc3QgbmFtZU5vZGUgPSB0eXBlb2YgcGFyYW1ldGVyLm5hbWUgPT0gXCJzdHJpbmdcIiA/IHBhcmFtZXRlciA6IHBhcmFtZXRlci5uYW1lXG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyhmaWVsZCwge25hbWU6IG5vZGVMb2NhdGlvbihuYW1lTm9kZSwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICB9KVxuICBjb25zdCBleHRyYURvY3VtZW50ZWQgPSBbLi4uZG9jdW1lbnRlZC5wYXJhbWV0ZXJzLmtleXMoKV0uZmluZCgobmFtZSkgPT5cbiAgICAhY29uc3RydWN0b3IuYXJndW1lbnRzLnNvbWUoKHBhcmFtZXRlcikgPT4gKHR5cGVvZiBwYXJhbWV0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gcGFyYW1ldGVyLm5hbWUgOiBwYXJhbWV0ZXIubmFtZS5uYW1lKSA9PSBuYW1lKSlcblxuICBpZiAoZXh0cmFEb2N1bWVudGVkIHx8IGRvY3VtZW50ZWQucmV0dXJuVHlwZSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiaW52YWxpZCByZWNvcmQgY29uc3RydWN0b3IgYW5ub3RhdGlvblwiLCBsb2NhdGlvbilcbiAgaWYgKGdlbmVyaWMpIHZhbGlkYXRlUGhwR2VuZXJpY1JlY29yZEdldHRlcnMobm9kZSwgZGVjbGFyYXRpb24sIHJlY29yZE5hbWVzLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBuYW1lTm9kZSA9IHR5cGVvZiBub2RlLm5hbWUgPT0gXCJzdHJpbmdcIiA/IG5vZGUgOiBub2RlLm5hbWVcblxuICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyhkZWNsYXJhdGlvbiwge25hbWU6IG5vZGVMb2NhdGlvbihuYW1lTm9kZSwgZmlsZW5hbWUsIHNvdXJjZSl9KVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgZXhhY3QgYWNjZXNzb3IgaGFsZiBvZiBQSFAncyBkb2N1bWVudGVkIGdlbmVyaWMtcmVjb3JkIHByb2ZpbGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuQ2xhc3N9IG5vZGUgLSBQSFAgY2xhc3MgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSBkZWNsYXJhdGlvbiAtIENvbnZlcnRlZCByZWNvcmQuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uPn0gcmVjb3JkTmFtZXMgLSBWaXNpYmxlIHJlY29yZHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUGhwR2VuZXJpY1JlY29yZEdldHRlcnMobm9kZSwgZGVjbGFyYXRpb24sIHJlY29yZE5hbWVzLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGdldHRlcnMgPSBub2RlLmJvZHkuc2xpY2UoMSlcbiAgY29uc3QgdHlwZVBhcmFtZXRlcnMgPSBuZXcgTWFwKChkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA/PyBbXSkubWFwKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIubmFtZSwgcGFyYW1ldGVyXSkpXG5cbiAgaWYgKGdldHRlcnMubGVuZ3RoICE9IGRlY2xhcmF0aW9uLmZpZWxkcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJnZW5lcmljIHJlY29yZCBnZXR0ZXIgY291bnRcIiwgbm9kZUxvY2F0aW9uKGdldHRlcnNbZGVjbGFyYXRpb24uZmllbGRzLmxlbmd0aF0gPz8gbm9kZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgZ2V0dGVycy5mb3JFYWNoKChjYW5kaWRhdGUsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZmllbGQgPSBkZWNsYXJhdGlvbi5maWVsZHNbaW5kZXhdXG5cbiAgICBpZiAoY2FuZGlkYXRlLmtpbmQgIT0gXCJtZXRob2RcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibm9uY2Fub25pY2FsIGdlbmVyaWMgcmVjb3JkIGdldHRlclwiLCBub2RlTG9jYXRpb24oY2FuZGlkYXRlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICBjb25zdCBnZXR0ZXIgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTWV0aG9kfSAqLyAoY2FuZGlkYXRlKVxuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgZ2V0dGVyLm5hbWUgPT0gXCJzdHJpbmdcIiA/IGdldHRlci5uYW1lIDogZ2V0dGVyLm5hbWUubmFtZVxuICAgIGNvbnN0IHN0YXRlbWVudCA9IGdldHRlci5ib2R5Py5jaGlsZHJlblswXVxuICAgIGNvbnN0IHJldHVybmVkID0gc3RhdGVtZW50Py5raW5kID09IFwicmV0dXJuXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuUmV0dXJufSAqLyAoc3RhdGVtZW50KS5leHByIDogdW5kZWZpbmVkXG4gICAgY29uc3QgbG9va3VwID0gcmV0dXJuZWQ/LmtpbmQgPT0gXCJwcm9wZXJ0eWxvb2t1cFwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlByb3BlcnR5TG9va3VwfSAqLyAocmV0dXJuZWQpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgcmVjZWl2ZXIgPSBsb29rdXA/LndoYXQua2luZCA9PSBcInZhcmlhYmxlXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVmFyaWFibGV9ICovIChsb29rdXAud2hhdCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCBtZW1iZXIgPSBsb29rdXA/Lm9mZnNldC5raW5kID09IFwiaWRlbnRpZmllclwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklkZW50aWZpZXJ9ICovIChsb29rdXAub2Zmc2V0KSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKG5hbWUgIT0gZmllbGQubmFtZSB8fCBnZXR0ZXIudmlzaWJpbGl0eSAhPSBcInB1YmxpY1wiIHx8IGdldHRlci5pc1N0YXRpYyB8fCBnZXR0ZXIuaXNBYnN0cmFjdCB8fCBnZXR0ZXIuaXNGaW5hbCB8fFxuICAgICAgUmVmbGVjdC5nZXQoZ2V0dGVyLCBcImlzUmVhZG9ubHlcIikgfHwgZ2V0dGVyLmJ5cmVmIHx8IGdldHRlci5hcmd1bWVudHMubGVuZ3RoIHx8IGdldHRlci5hdHRyR3JvdXBzLmxlbmd0aCB8fFxuICAgICAgIWdldHRlci5ib2R5IHx8IGdldHRlci5ib2R5LmNoaWxkcmVuLmxlbmd0aCAhPSAxIHx8IHJlY2VpdmVyPy5uYW1lICE9IFwidGhpc1wiIHx8IG1lbWJlcj8ubmFtZSAhPSBmaWVsZC5uYW1lKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgZ2VuZXJpYyByZWNvcmQgZ2V0dGVyXCIsIG5vZGVMb2NhdGlvbihnZXR0ZXIsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICBjb25zdCBkb2N1bWVudGVkID0gZnVuY3Rpb25Eb2N1bWVudGVkVHlwZXMoXG4gICAgICAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRnVuY3Rpb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChnZXR0ZXIpKSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICAgIGlmIChkb2N1bWVudGVkLnBhcmFtZXRlcnMuc2l6ZSB8fCBkb2N1bWVudGVkLnR5cGVQYXJhbWV0ZXJzIHx8ICFkb2N1bWVudGVkLnJldHVyblR5cGUpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm1pc3Npbmcgb3IgaW52YWxpZCBnZW5lcmljIHJlY29yZCBnZXR0ZXIgdHlwZVwiLCBub2RlTG9jYXRpb24oZ2V0dGVyLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IGRvY3VtZW50ZWRWYWx1ZVR5cGUoe2xhbmd1YWdlOiBcInBocFwiLCBsb2NhdGlvbjogZG9jdW1lbnRlZC5yZXR1cm5UeXBlLmxvY2F0aW9uLFxuICAgICAgb3duZXJMb2NhdGlvbjogbm9kZUxvY2F0aW9uKGdldHRlciwgZmlsZW5hbWUsIHNvdXJjZSksIHJlY29yZHM6IHJlY29yZE5hbWVzLCBzb3VyY2UsXG4gICAgICBzb3VyY2VUeXBlOiBkb2N1bWVudGVkLnJldHVyblR5cGUuc291cmNlVHlwZSwgc3ViamVjdDogYFJlY29yZCBnZXR0ZXIgJyR7bmFtZX0nYCwgdHlwZVBhcmFtZXRlcnN9KVxuICAgIGNvbnN0IG5hdGl2ZVR5cGUgPSBwaHBUeXBlTmFtZShnZXR0ZXIudHlwZSlcblxuICAgIGlmICghcGhwRG9jdW1lbnRlZE5hdGl2ZVR5cGVNYXRjaGVzKG5hdGl2ZVR5cGUsIGdldHRlci5udWxsYWJsZSwgcmV0dXJuVHlwZSwgcmVjb3JkTmFtZXMpIHx8XG4gICAgICAhc2FtZVZhbHVlVHlwZShyZXR1cm5UeXBlLCBmaWVsZC50eXBlKSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZ2VuZXJpYyByZWNvcmQgZ2V0dGVyIHR5cGUgbWlzbWF0Y2hcIiwgZG9jdW1lbnRlZC5yZXR1cm5UeXBlLmxvY2F0aW9uKVxuICAgIH1cbiAgfSlcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgZXhpc3RpbmcgUEhQIGlmL2Vsc2UgdGVybWluYWwgd2l0aCByZXN0cmljdGVkIGJyYW5jaCBwcmVmaXhlcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZn0gbm9kZSAtIFBIUCBpZiBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEBwYXJhbSB7UGhwQ29udmVyc2lvbkNvbnRleHR9IGNvbnRleHQgLSBUeXBlZCBjb252ZXJzaW9uIGNvbnRleHQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuSWZTdGF0ZW1lbnR9IFNlbWFudGljIGJyYW5jaC5cbiAqL1xuZnVuY3Rpb24gY29udmVydElmKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAobm9kZS5zaG9ydEZvcm0pIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImFsdGVybmF0aXZlIGlmIHN5bnRheFwiLCBsb2NhdGlvbilcbiAgaWYgKG5vZGUuYm9keS5raW5kICE9IFwiYmxvY2tcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiaWYgd2l0aG91dCBibG9jayBjb25zZXF1ZW50XCIsIGxvY2F0aW9uKVxuICBpZiAobm9kZS50ZXN0LmtpbmQgPT0gXCJ2YXJpYWJsZVwiKSB7XG4gICAgY29uc3QgdGVzdGVkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlZhcmlhYmxlfSAqLyAobm9kZS50ZXN0KVxuXG4gICAgaWYgKHR5cGVvZiB0ZXN0ZWQubmFtZSA9PSBcInN0cmluZ1wiICYmIGNvbnRleHQuYmluZGluZ3MuZ2V0KHRlc3RlZC5uYW1lKT8ua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJvcHRpb25hbCB0cnV0aGluZXNzIGNvbmRpdGlvblwiLCBub2RlTG9jYXRpb24odGVzdGVkLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb25kaXRpb24gPSBjb252ZXJ0RXhwcmVzc2lvbihub2RlLnRlc3QsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gIGNvbnN0IGNvbnNlcXVlbnRDb250ZXh0ID0gey4uLmNvbnRleHQsIGJpbmRpbmdzOiBuZXcgTWFwKGNvbnRleHQuYmluZGluZ3MpfVxuICBjb25zdCBhbHRlcm5hdGVDb250ZXh0ID0gey4uLmNvbnRleHQsIGJpbmRpbmdzOiBuZXcgTWFwKGNvbnRleHQuYmluZGluZ3MpfVxuICBsZXQgYWx0ZXJuYXRlXG5cbiAgaWYgKG5vZGUuYWx0ZXJuYXRlKSB7XG4gICAgaWYgKG5vZGUuYWx0ZXJuYXRlLmtpbmQgPT0gXCJibG9ja1wiKSB7XG4gICAgICBhbHRlcm5hdGUgPSBjb252ZXJ0QmxvY2soLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJsb2NrfSAqLyAobm9kZS5hbHRlcm5hdGUpLCBmaWxlbmFtZSwgc291cmNlLCBhbHRlcm5hdGVDb250ZXh0KVxuICAgIH0gZWxzZSBpZiAobm9kZS5hbHRlcm5hdGUua2luZCA9PSBcImlmXCIpIHtcbiAgICAgIGNvbnN0IG5lc3RlZCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZn0gKi8gKG5vZGUuYWx0ZXJuYXRlKVxuXG4gICAgICBhbHRlcm5hdGUgPSB7XG4gICAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkJsb2NrXCIpLFxuICAgICAgICBsb2NhdGlvbjogbm9kZUxvY2F0aW9uKG5lc3RlZCwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICAgIHN0YXRlbWVudHM6IFtjb252ZXJ0SWYobmVzdGVkLCBmaWxlbmFtZSwgc291cmNlLCBhbHRlcm5hdGVDb250ZXh0KV1cbiAgICAgIH1cbiAgICB9IGVsc2UgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGBpZiBhbHRlcm5hdGUgJHtub2RlLmFsdGVybmF0ZS5raW5kfWAsIG5vZGVMb2NhdGlvbihub2RlLmFsdGVybmF0ZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLihhbHRlcm5hdGUgPyB7YWx0ZXJuYXRlfSA6IHt9KSxcbiAgICBjb25kaXRpb24sXG4gICAgY29uc2VxdWVudDogY29udmVydEJsb2NrKG5vZGUuYm9keSwgZmlsZW5hbWUsIHNvdXJjZSwgY29uc2VxdWVudENvbnRleHQpLFxuICAgIGtpbmQ6IFwiSWZTdGF0ZW1lbnRcIixcbiAgICBsb2NhdGlvblxuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgZXhhY3QgYnJhY2VkIFBIUCBgd2hpbGUgKCRjb25kaXRpb24pIHsgLi4uIH1gIHN5bnRheC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5XaGlsZX0gbm9kZSAtIFBIUCB3aGlsZSBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEBwYXJhbSB7UGhwQ29udmVyc2lvbkNvbnRleHR9IGNvbnRleHQgLSBUeXBlZCBjb252ZXJzaW9uIGNvbnRleHQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuV2hpbGVTdGF0ZW1lbnR9IFNlbWFudGljIGxvb3AuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRXaGlsZShub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKG5vZGUuc2hvcnRGb3JtKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJhbHRlcm5hdGl2ZSB3aGlsZSBzeW50YXhcIiwgbG9jYXRpb24pXG4gIGlmICghbm9kZS5ib2R5IHx8IG5vZGUuYm9keS5raW5kICE9IFwiYmxvY2tcIikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIndoaWxlIHdpdGhvdXQgYmxvY2sgYm9keVwiLCBub2RlLmJvZHkgPyBub2RlTG9jYXRpb24obm9kZS5ib2R5LCBmaWxlbmFtZSwgc291cmNlKSA6IGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGJvZHlDb250ZXh0ID0gey4uLmNvbnRleHQsIGJpbmRpbmdzOiBuZXcgTWFwKGNvbnRleHQuYmluZGluZ3MpfVxuXG4gIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICBib2R5OiBjb252ZXJ0QmxvY2soLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJsb2NrfSAqLyAobm9kZS5ib2R5KSwgZmlsZW5hbWUsIHNvdXJjZSwgYm9keUNvbnRleHQpLFxuICAgIGNvbmRpdGlvbjogY29udmVydEV4cHJlc3Npb24obm9kZS50ZXN0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCB1bmRlZmluZWQsIHRydWUpLFxuICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIldoaWxlU3RhdGVtZW50XCIpLFxuICAgIGxvY2F0aW9uXG4gIH0sIHtrZXl3b3JkOiB0b2tlbkxvY2F0aW9uKFwid2hpbGVcIiwgbm9kZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCBub2RlLnRlc3QubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgUEhQIGVjaG8gZW50cnkgcG9pbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuRWNob30gbm9kZSAtIFBIUCBlY2hvIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5QcmludFN0YXRlbWVudH0gUHJpbnQgc3RhdGVtZW50LlxuICovXG5mdW5jdGlvbiBjb252ZXJ0UHJpbnQobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIGlmIChub2RlLmV4cHJlc3Npb25zLmxlbmd0aCAhPSAyIHx8IG5vZGUuZXhwcmVzc2lvbnNbMV0ua2luZCAhPSBcIm5hbWVcIiB8fFxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5OYW1lfSAqLyAobm9kZS5leHByZXNzaW9uc1sxXSkubmFtZSAhPSBcIlBIUF9FT0xcIikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImVjaG8gd2l0aG91dCBvbmUgZXhwcmVzc2lvbiBhbmQgUEhQX0VPTFwiLCBsb2NhdGlvbilcbiAgfVxuXG4gIHJldHVybiB7ZXhwcmVzc2lvbjogY29udmVydEV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uc1swXSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCksIGtpbmQ6IFwiUHJpbnRTdGF0ZW1lbnRcIiwgbG9jYXRpb259XG59XG5cbi8qKlxuICogUGFyc2VzIFBIUCBpbnRvIHRoZSBzaGFyZWQgc2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHtvYmplY3R9IGlucHV0IC0gUGFyc2VyIGlucHV0LlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LmZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LnNvdXJjZSAtIFNvdXJjZSB0ZXh0LlxuICogQHBhcmFtIHtyZWFkb25seSBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gW2lucHV0LmNhcGFiaWxpdGllc10gLSBDb21waWxlci1hdXRob3JpemVkIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7e2lzRW50cnk6IGJvb2xlYW4sIGZ1bmN0aW9uczogTWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbj4sIHJlY29yZHM6IE1hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uPiwgZXJyb3JzPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj59fSBbaW5wdXQucHJvZ3JhbV0gLSBSZXNvbHZlZCBwcm9ncmFtIGltcG9ydHMgYW5kIGVudHJ5IHJvbGUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IFNlbWFudGljIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGhwKHtjYXBhYmlsaXRpZXMgPSBbXSwgZmlsZW5hbWUsIHNvdXJjZSwgcHJvZ3JhbTogcHJvZ3JhbUNvbnRleHR9KSB7XG4gIGNvbnN0IHByb2dyYW0gPSBwYXJzZVBocFByb2dyYW0oZmlsZW5hbWUsIHNvdXJjZSlcbiAgdmFsaWRhdGVEZWNsYXJlTm9kZXMocHJvZ3JhbS5jaGlsZHJlbiwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgbGV0IGJvZHkgPSB0YXNrMDM0UGhwQm9keShwcm9ncmFtLmNoaWxkcmVuLCBjYXBhYmlsaXRpZXMsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKHByb2dyYW1Db250ZXh0KSB7XG4gICAgaW5zcGVjdFBocE1vZHVsZSh7ZmlsZW5hbWUsIHNvdXJjZX0pXG4gICAgY29uc3QgbmFtZXNwYWNlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5hbWVzcGFjZX0gKi8gKGJvZHkuZmluZCgobm9kZSkgPT4gbm9kZS5raW5kID09IFwibmFtZXNwYWNlXCIpKVxuXG4gICAgYm9keSA9IG5hbWVzcGFjZS5jaGlsZHJlbi5maWx0ZXIoKG5vZGUpID0+IG5vZGUua2luZCAhPSBcInVzZWdyb3VwXCIgJiYgIWlzUGhwUmVxdWlyZU9uY2Uobm9kZSkpXG4gIH1cbiAgY29uc3QgY2xhc3NOb2RlcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5DbGFzc1tdfSAqLyAoYm9keS5maWx0ZXIoKG5vZGUpID0+IG5vZGUua2luZCA9PSBcImNsYXNzXCIpKVxuICBjb25zdCBlcnJvck5vZGVzID0gY2xhc3NOb2Rlcy5maWx0ZXIoKG5vZGUpID0+IG5vZGUuZXh0ZW5kcz8ua2luZCA9PSBcIm5hbWVcIiAmJlxuICAgIFtcIlJ1bnRpbWVFeGNlcHRpb25cIiwgXCJcXFxcUnVudGltZUV4Y2VwdGlvblwiXS5pbmNsdWRlcyhub2RlLmV4dGVuZHMubmFtZSkpXG4gIGNvbnN0IHJlZmVyZW5jZUNsYXNzTm9kZXMgPSBjbGFzc05vZGVzLmZpbHRlcigobm9kZSkgPT4gIWVycm9yTm9kZXMuaW5jbHVkZXMobm9kZSkgJiZcbiAgICBub2RlLmJvZHkuc29tZSgobWVtYmVyKSA9PiBtZW1iZXIua2luZCA9PSBcInByb3BlcnR5c3RhdGVtZW50XCIpKVxuICBjb25zdCByZWNvcmROb2RlcyA9IGNsYXNzTm9kZXMuZmlsdGVyKChub2RlKSA9PiAhZXJyb3JOb2Rlcy5pbmNsdWRlcyhub2RlKSAmJiAhcmVmZXJlbmNlQ2xhc3NOb2Rlcy5pbmNsdWRlcyhub2RlKSlcbiAgY29uc3QgZXJyb3JEZWNsYXJhdGlvbnMgPSBlcnJvck5vZGVzLm1hcCgobm9kZSwgaW5kZXgpID0+ICh7XG4gICAgaWQ6IGBlcnJvcjoke2luZGV4fWAsXG4gICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiRXJyb3JEZWNsYXJhdGlvblwiKSxcbiAgICBsb2NhdGlvbjogbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpLFxuICAgIG5hbWU6IHR5cGVvZiBub2RlLm5hbWUgPT0gXCJzdHJpbmdcIiA/IG5vZGUubmFtZSA6IG5vZGUubmFtZS5uYW1lXG4gIH0pKVxuICBjb25zdCByZWNvcmREZWNsYXJhdGlvbnMgPSByZWNvcmROb2Rlcy5tYXAoKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgaWQgPSBgcmVjb3JkOiR7aW5kZXh9YFxuICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJzID0gY2xhc3NEb2N1bWVudGVkVHlwZVBhcmFtZXRlcnMobm9kZSwgaWQsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgICByZXR1cm4ge1xuICAgICAgZmllbGRzOiBbXSxcbiAgICAgIGlkLFxuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUmVjb3JkRGVjbGFyYXRpb25cIiksXG4gICAgICBsb2NhdGlvbjogbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpLFxuICAgICAgbmFtZTogdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZS5uYW1lIDogbm9kZS5uYW1lLm5hbWUsXG4gICAgICAuLi4odHlwZVBhcmFtZXRlcnMgPyB7dHlwZVBhcmFtZXRlcnN9IDoge30pXG4gICAgfVxuICB9KVxuICBjb25zdCBjbGFzc0RlY2xhcmF0aW9ucyA9IHJlZmVyZW5jZUNsYXNzTm9kZXMubWFwKChub2RlLCBpbmRleCkgPT4gKHtcbiAgICBjb25zdHJ1Y3RvcjogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9ufSAqLyAoe30pLFxuICAgIGZpZWxkczogW10sIGlkOiBgY2xhc3M6JHtpbmRleH1gLCBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJDbGFzc0RlY2xhcmF0aW9uXCIpLFxuICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSksIG1ldGhvZHM6IFtdLFxuICAgIG5hbWU6IHR5cGVvZiBub2RlLm5hbWUgPT0gXCJzdHJpbmdcIiA/IG5vZGUubmFtZSA6IG5vZGUubmFtZS5uYW1lXG4gIH0pKVxuICBjb25zdCByZWNvcmROYW1lcyA9IC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbj59ICovIChcbiAgICBuZXcgTWFwKHByb2dyYW1Db250ZXh0Py5yZWNvcmRzID8/IFtdKSlcbiAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBjYXBhYmlsaXRpZXMuZmxhdE1hcCgoe3Jlc291cmNlc30pID0+IHJlc291cmNlcykpIHJlY29yZE5hbWVzLnNldChyZXNvdXJjZS5uYW1lLCByZXNvdXJjZSlcbiAgY29uc3QgZXJyb3JOYW1lcyA9IG5ldyBNYXAocHJvZ3JhbUNvbnRleHQ/LmVycm9ycyA/PyBbXSlcbiAgZm9yIChjb25zdCBmYWlsdXJlIG9mIGNhcGFiaWxpdGllcy5mbGF0TWFwKCh7ZmFpbHVyZXN9KSA9PiBmYWlsdXJlcykpIHtcbiAgICBlcnJvck5hbWVzLnNldChmYWlsdXJlLm5hbWUsIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGZhaWx1cmUpKSlcbiAgfVxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIGVycm9yRGVjbGFyYXRpb25zKSBlcnJvck5hbWVzLnNldChkZWNsYXJhdGlvbi5uYW1lLCBkZWNsYXJhdGlvbilcbiAgY29uc3QgZXJyb3JzQnlJZCA9IG5ldyBNYXAoWy4uLmVycm9yTmFtZXMudmFsdWVzKCldLm1hcCgoZGVjbGFyYXRpb24pID0+IFsvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgZGVjbGFyYXRpb25dKSlcbiAgY29uc3QgZXJyb3JzID0gZXJyb3JOb2Rlcy5tYXAoKG5vZGUsIGluZGV4KSA9PiBjb252ZXJ0UGhwRXJyb3Iobm9kZSwgZXJyb3JEZWNsYXJhdGlvbnNbaW5kZXhdLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiByZWNvcmREZWNsYXJhdGlvbnMpIHJlY29yZE5hbWVzLnNldChkZWNsYXJhdGlvbi5uYW1lLCBkZWNsYXJhdGlvbilcbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBjbGFzc0RlY2xhcmF0aW9ucykgcmVjb3JkTmFtZXMuc2V0KGRlY2xhcmF0aW9uLm5hbWUsIGRlY2xhcmF0aW9uKVxuICBjb25zdCByZWNvcmRzQnlJZCA9IG5ldyBNYXAoWy4uLnJlY29yZE5hbWVzLnZhbHVlcygpXVxuICAgIC5maWx0ZXIoKGRlY2xhcmF0aW9uKSA9PiBkZWNsYXJhdGlvbi5raW5kID09IFwiUmVjb3JkRGVjbGFyYXRpb25cIilcbiAgICAubWFwKChkZWNsYXJhdGlvbikgPT4gWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBkZWNsYXJhdGlvbl0pKVxuICBjb25zdCBjbGFzc2VzQnlJZCA9IG5ldyBNYXAoY2xhc3NEZWNsYXJhdGlvbnMubWFwKChkZWNsYXJhdGlvbikgPT4gWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBkZWNsYXJhdGlvbl0pKVxuICBjb25zdCByZWNvcmRzID0gcmVjb3JkTm9kZXMubWFwKChub2RlLCBpbmRleCkgPT4gY29udmVydFBocFJlY29yZChub2RlLCByZWNvcmREZWNsYXJhdGlvbnNbaW5kZXhdLFxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24+fSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAocmVjb3JkTmFtZXMpKSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIGNvbnN0IGZ1bmN0aW9uTm9kZXMgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRnVuY3Rpb25bXX0gKi8gKGJvZHkuZmlsdGVyKChub2RlKSA9PiBub2RlLmtpbmQgPT0gXCJmdW5jdGlvblwiKSlcbiAgY29uc3Qgc2lnbmF0dXJlcyA9IGZ1bmN0aW9uTm9kZXMubWFwKChub2RlLCBpbmRleCkgPT4gY29udmVydEZ1bmN0aW9uU2lnbmF0dXJlKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIHJlY29yZE5hbWVzLCBgZnVuY3Rpb246JHtpbmRleH1gKSlcbiAgY29uc3QgZnVuY3Rpb25TaWduYXR1cmVzID0gbmV3IE1hcChbLi4uY2FwYWJpbGl0eUZ1bmN0aW9uU2lnbmF0dXJlcyhjYXBhYmlsaXRpZXMsIG1vZHVsZUxvY2F0aW9uKGZpbGVuYW1lLCBzb3VyY2UpKSxcbiAgICAuLi4ocHJvZ3JhbUNvbnRleHQ/LmZ1bmN0aW9ucyA/PyBbXSldLm1hcCgoW2xvY2FsTmFtZSwgZGVjbGFyYXRpb25dKSA9PiBbbG9jYWxOYW1lLCB7XG4gICAgbG9jYXRpb246IGRlY2xhcmF0aW9uLmxvY2F0aW9uLFxuICAgIG5hbWU6IGxvY2FsTmFtZSxcbiAgICBuYW1lTG9jYXRpb246IGRlY2xhcmF0aW9uLmxvY2F0aW9uLFxuICAgIHBhcmFtZXRlcnM6IGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMsXG4gICAgcmV0dXJuVHlwZTogZGVjbGFyYXRpb24ucmV0dXJuVHlwZSxcbiAgICAuLi4oZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMgPyB7dHlwZVBhcmFtZXRlcnM6IGRlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzfSA6IHt9KVxuICB9XSkpXG4gIGZvciAoY29uc3Qgc2lnbmF0dXJlIG9mIHNpZ25hdHVyZXMpIGZ1bmN0aW9uU2lnbmF0dXJlcy5zZXQoc2lnbmF0dXJlLm5hbWUsIHNpZ25hdHVyZSlcbiAgY29uc3QgY2xhc3NlcyA9IHJlZmVyZW5jZUNsYXNzTm9kZXMubWFwKChub2RlLCBpbmRleCkgPT4gY29udmVydFBocFJlZmVyZW5jZUNsYXNzKG5vZGUsIGNsYXNzRGVjbGFyYXRpb25zW2luZGV4XSxcbiAgICByZWNvcmROYW1lcywgcmVjb3Jkc0J5SWQsIGNsYXNzZXNCeUlkLCBmdW5jdGlvblNpZ25hdHVyZXMsIGVycm9yTmFtZXMsIGVycm9yc0J5SWQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICBjb25zdCBmdW5jdGlvbnMgPSBmdW5jdGlvbk5vZGVzLm1hcCgobm9kZSwgaW5kZXgpID0+XG4gICAgY29udmVydEZ1bmN0aW9uKG5vZGUsIHNpZ25hdHVyZXNbaW5kZXhdLCBmdW5jdGlvblNpZ25hdHVyZXMsIHJlY29yZE5hbWVzLCByZWNvcmRzQnlJZCwgY2xhc3Nlc0J5SWQsIGVycm9yTmFtZXMsIGVycm9yc0J5SWQsXG4gICAgICBmaWxlbmFtZSwgc291cmNlKSlcbiAgY29uc3QgZXhlY3V0YWJsZU5vZGVzID0gYm9keS5maWx0ZXIoKG5vZGUpID0+ICFbXCJjbGFzc1wiLCBcImZ1bmN0aW9uXCIsIFwiZGVjbGFyZVwiLCBcIm5vb3BcIl0uaW5jbHVkZXMobm9kZS5raW5kKSlcbiAgY29uc3QgbG9jYXRpb24gPSBtb2R1bGVMb2NhdGlvbihmaWxlbmFtZSwgc291cmNlKVxuXG4gIGlmIChwcm9ncmFtQ29udGV4dCAmJiAhcHJvZ3JhbUNvbnRleHQuaXNFbnRyeSAmJiBleGVjdXRhYmxlTm9kZXMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInRvcC1sZXZlbCBzaWRlIGVmZmVjdCBvdXRzaWRlIHRoZSBzZWxlY3RlZCBlbnRyeSBtb2R1bGVcIiwgbm9kZUxvY2F0aW9uKGV4ZWN1dGFibGVOb2Rlc1swXSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgY29uc3QgZmlyc3QgPSBleGVjdXRhYmxlTm9kZXNbMF1cbiAgY29uc3QgbGFzdCA9IGV4ZWN1dGFibGVOb2Rlcy5hdCgtMSkgPz8gZmlyc3RcbiAgY29uc3QgZW50cnlMb2NhdGlvbiA9IGZpcnN0XG4gICAgPyBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBzb3VyY2UsIGZpcnN0LmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIGxhc3Q/LmxvYz8uZW5kLm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoKVxuICAgIDogbG9jYXRpb25cbiAgY29uc3QgZW50cnlDb250ZXh0ID0ge1xuICAgIGJpbmRpbmdzOiBuZXcgTWFwKCksXG4gICAgY2xhc3NlczogY2xhc3Nlc0J5SWQsXG4gICAgZXJyb3JOYW1lcyxcbiAgICBlcnJvcnM6IGVycm9yc0J5SWQsXG4gICAgZnVuY3Rpb25zOiBmdW5jdGlvblNpZ25hdHVyZXMsXG4gICAgb3JkZXJlZE1hcERlY2xhcmF0aW9uczogb3JkZXJlZE1hcERlY2xhcmF0aW9uc0ZvclBocChleGVjdXRhYmxlTm9kZXMpLFxuICAgIHJlY29yZE5hbWVzLFxuICAgIHJlY29yZHM6IHJlY29yZHNCeUlkLFxuICAgIHJldHVyblR5cGU6IHVuZGVmaW5lZFxuICB9XG4gIGNvbnN0IGVudHJ5QmxvY2sgPSB7XG4gICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiQmxvY2tcIiksXG4gICAgbG9jYXRpb246IGVudHJ5TG9jYXRpb24sXG4gICAgc3RhdGVtZW50czogZXhlY3V0YWJsZU5vZGVzLm1hcCgobm9kZSkgPT4gY29udmVydFN0YXRlbWVudChub2RlLCBmaWxlbmFtZSwgc291cmNlLCBlbnRyeUNvbnRleHQpKVxuICB9XG5cbiAgaWYgKCFwcm9ncmFtQ29udGV4dCAmJiBmdW5jdGlvbnMubGVuZ3RoID09IDAgJiYgY2FwYWJpbGl0aWVzLmxlbmd0aCA9PSAwICYmICFibG9ja1JlZmVyZW5jZXNQcm90ZWN0ZWRFbnRyeShlbnRyeUJsb2NrKSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm1vZHVsZSB3aXRob3V0IGEgZnVuY3Rpb25cIiwgbG9jYXRpb24pXG4gIH1cbiAgcmV0dXJuIHtcbiAgICBlbnRyeVBvaW50OiB7XG4gICAgICBib2R5OiBlbnRyeUJsb2NrLFxuICAgICAga2luZDogXCJFbnRyeVBvaW50XCIsXG4gICAgICBsb2NhdGlvbjogZW50cnlMb2NhdGlvblxuICAgIH0sXG4gICAgZnVuY3Rpb25zLFxuICAgIGtpbmQ6IFwiTW9kdWxlXCIsXG4gICAgbG9jYXRpb24sXG4gICAgLi4uKGVycm9ycy5sZW5ndGggPiAwID8ge2Vycm9yc30gOiB7fSksXG4gICAgLi4uKGNsYXNzZXMubGVuZ3RoID4gMCA/IHtjbGFzc2VzfSA6IHt9KSxcbiAgICAuLi4ocmVjb3Jkcy5sZW5ndGggPiAwID8ge3JlY29yZHN9IDoge30pXG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmVzIGV4YWN0IHByb3RlY3RlZCBQSFAgcHJvYmUgc3VwcG9ydCBiZWZvcmUgcG9ydGFibGUgY29udmVyc2lvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5TdGF0ZW1lbnRbXX0gYm9keSAtIFBhcnNlZCB0b3AtbGV2ZWwgc3RhdGVtZW50cy5cbiAqIEBwYXJhbSB7cmVhZG9ubHkgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uW119IGNhcGFiaWxpdGllcyAtIEF1dGhvcml6ZWQgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlN0YXRlbWVudFtdfSBQb3J0YWJsZSBzdGF0ZW1lbnRzLlxuICovXG5mdW5jdGlvbiB0YXNrMDM0UGhwQm9keShib2R5LCBjYXBhYmlsaXRpZXMsIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgaWYgKCFpc1Rhc2swMzRSZXNvdXJjZVByb2JlKGNhcGFiaWxpdGllcykpIHJldHVybiBib2R5XG4gIGNvbnN0IHN0YXJ0ID0gYm9keS5maW5kSW5kZXgoKG5vZGUpID0+IG5vZGUubGVhZGluZ0NvbW1lbnRzPy5zb21lKCh7dmFsdWV9KSA9PiB2YWx1ZSA9PSBcIi8qIHNlbWFudGlmb2xkLXRhc2swMzQtc3VwcG9ydCAqL1wiKSlcblxuICBpZiAoc3RhcnQgPCAwKSByZXR1cm4gYm9keVxuICBpZiAoIWhhc0V4YWN0RWZmZWN0U3VwcG9ydChzb3VyY2UsIFwicGhwXCIpKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibWFsZm9ybWVkIHByb3RlY3RlZCBUYXNrIDAzNCBzdXBwb3J0XCIsIG5vZGVMb2NhdGlvbihib2R5W3N0YXJ0XSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgY29uc3QgZXhwZWN0ZWQgPSBbXG4gICAgW1wiY2xhc3NcIiwgXCJQcm9iZU9wZXJhdGlvbkZhaWx1cmVcIl0sIFtcImNsYXNzXCIsIFwiUHJvYmVBY3F1aXJlRmFpbHVyZVwiXSwgW1wiY2xhc3NcIiwgXCJQcm9iZVJlYWRGYWlsdXJlXCJdLFxuICAgIFtcImNsYXNzXCIsIFwiUHJvYmVDbG9zZUZhaWx1cmVcIl0sIFtcImNsYXNzXCIsIFwiUHJvYmVSZXNvdXJjZUNsb3NlZFwiXSwgW1wiY2xhc3NcIiwgXCJQcm9iZVJlc291cmNlXCJdLFxuICAgIFtcImV4cHJlc3Npb25zdGF0ZW1lbnRcIiwgdW5kZWZpbmVkXSwgW1wiZnVuY3Rpb25cIiwgXCJwcm9iZUVmZmVjdFwiXSwgW1wiZnVuY3Rpb25cIiwgXCJwcm9iZUFjcXVpcmVcIl0sXG4gICAgW1wiZnVuY3Rpb25cIiwgXCJwcm9iZVJlYWRcIl0sIFtcImZ1bmN0aW9uXCIsIFwicHJvYmVDbG9zZVwiXSwgW1wiZnVuY3Rpb25cIiwgXCJwcm9iZVRyYWNlXCJdXG4gIF1cbiAgY29uc3QgbWF0Y2hlcyA9IGV4cGVjdGVkLmV2ZXJ5KChba2luZCwgbmFtZV0sIGluZGV4KSA9PiB7XG4gICAgY29uc3Qgbm9kZSA9IGJvZHlbc3RhcnQgKyBpbmRleF1cbiAgICBjb25zdCByYXdOYW1lID0gbm9kZSA/IFJlZmxlY3QuZ2V0KG5vZGUsIFwibmFtZVwiKSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGFjdHVhbE5hbWUgPSB0eXBlb2YgcmF3TmFtZSA9PSBcInN0cmluZ1wiID8gcmF3TmFtZSA6IHJhd05hbWUgJiYgdHlwZW9mIHJhd05hbWUgPT0gXCJvYmplY3RcIiA/IFJlZmxlY3QuZ2V0KHJhd05hbWUsIFwibmFtZVwiKSA6IHVuZGVmaW5lZFxuICAgIHJldHVybiBub2RlPy5raW5kID09IGtpbmQgJiYgYWN0dWFsTmFtZSA9PSBuYW1lXG4gIH0pXG4gIGNvbnN0IG5leHQgPSBib2R5W3N0YXJ0ICsgZXhwZWN0ZWQubGVuZ3RoXVxuXG4gIGlmICghbWF0Y2hlcyB8fCBuZXh0ICYmICFuZXh0LmxlYWRpbmdDb21tZW50cz8uc29tZSgoe3ZhbHVlfSkgPT4gdmFsdWUgPT0gXCIvKiBzZW1hbnRpZm9sZC10YXNrMDM0LXN1cHBvcnQtZW5kICovXCIpKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibWFsZm9ybWVkIHByb3RlY3RlZCBUYXNrIDAzNCBzdXBwb3J0XCIsIG5vZGVMb2NhdGlvbihib2R5W3N0YXJ0XSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgcmV0dXJuIFsuLi5ib2R5LnNsaWNlKDAsIHN0YXJ0KSwgLi4uYm9keS5zbGljZShzdGFydCArIGV4cGVjdGVkLmxlbmd0aCldXG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGNhbm9uaWNhbCBwYXJzZXItb3duZWQgUEhQIG5hbWVzcGFjZSwgdXNlIGJpbmRpbmdzLCBhbmQgbGl0ZXJhbCByZXF1aXJlX29uY2UgZWRnZXMuXG4gKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBQYXJzZXIgaW5wdXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuc291cmNlIC0gU291cmNlIHRleHQuXG4gKiBAcmV0dXJucyB7e2JpbmRpbmdzOiB7aW1wb3J0ZWROYW1lOiBzdHJpbmcsIGxvY2FsTmFtZTogc3RyaW5nLCBsb2NhdGlvbjogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIG5hdGl2ZU5hbWU6IHN0cmluZywgc3ltYm9sS2luZDogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNEZWNsYXJhdGlvbktpbmQsIHR5cGVPbmx5OiBmYWxzZX1bXSwgaW1wb3J0czoge2ltcG9ydGVkTmFtZTogc3RyaW5nLCBsb2NhbE5hbWU6IHN0cmluZywgbG9jYXRpb246IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uLCBuYW1lc3BhY2U6IHRydWUsIHBhdGhMb2NhdGlvbjogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIHNwZWNpZmllcjogc3RyaW5nLCB0eXBlT25seTogZmFsc2V9W10sIGV4cG9ydHM6IHtleHBvcnRlZE5hbWU6IHN0cmluZywgbG9jYWxOYW1lOiBzdHJpbmcsIGxvY2F0aW9uOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgdHlwZU9ubHk6IGZhbHNlfVtdLCBuYXRpdmVOYW1lOiBzdHJpbmd9fSBQYXJzZXItb3duZWQgUEhQIG1vZHVsZSBoZWFkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNwZWN0UGhwTW9kdWxlKHtmaWxlbmFtZSwgc291cmNlfSkge1xuICBjb25zdCBwcm9ncmFtID0gcGFyc2VQaHBQcm9ncmFtKGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgdmFsaWRhdGVEZWNsYXJlTm9kZXMocHJvZ3JhbS5jaGlsZHJlbiwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgbmFtZXNwYWNlcyA9IHByb2dyYW0uY2hpbGRyZW4uZmlsdGVyKChub2RlKSA9PiBub2RlLmtpbmQgPT0gXCJuYW1lc3BhY2VcIilcbiAgY29uc3QgaW52YWxpZE91dGVyID0gcHJvZ3JhbS5jaGlsZHJlbi5maW5kKChub2RlKSA9PiAhW1wiZGVjbGFyZVwiLCBcIm5hbWVzcGFjZVwiLCBcIm5vb3BcIl0uaW5jbHVkZXMobm9kZS5raW5kKSlcbiAgY29uc3QgbmFtZXNwYWNlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5hbWVzcGFjZSB8IHVuZGVmaW5lZH0gKi8gKG5hbWVzcGFjZXNbMF0pXG5cbiAgaWYgKCFuYW1lc3BhY2UgfHwgbmFtZXNwYWNlcy5sZW5ndGggIT0gMSB8fCBuYW1lc3BhY2Uud2l0aEJyYWNrZXRzIHx8IHR5cGVvZiBuYW1lc3BhY2UubmFtZSAhPSBcInN0cmluZ1wiIHx8IGludmFsaWRPdXRlcikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm9uZSBjYW5vbmljYWwgdW5icmFja2V0ZWQgbmFtZXNwYWNlXCIsXG4gICAgICBub2RlTG9jYXRpb24oaW52YWxpZE91dGVyID8/IG5hbWVzcGFjZXNbMV0gPz8gbmFtZXNwYWNlID8/IHByb2dyYW0sIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG4gIGNvbnN0IGJpbmRpbmdzID0gW11cblxuICBmb3IgKGNvbnN0IG5vZGUgb2YgbmFtZXNwYWNlLmNoaWxkcmVuLmZpbHRlcigoY2hpbGQpID0+IGNoaWxkLmtpbmQgPT0gXCJ1c2Vncm91cFwiKSkge1xuICAgIGNvbnN0IGdyb3VwID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlVzZUdyb3VwfSAqLyAobm9kZSlcblxuICAgIGlmIChncm91cC5uYW1lICE9PSBudWxsIHx8ICFbbnVsbCwgXCJmdW5jdGlvblwiXS5pbmNsdWRlcyhncm91cC50eXBlKSB8fCBncm91cC5pdGVtcy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZ3JvdXBlZCwgY29uc3RhbnQsIG9yIGVtcHR5IHVzZSBkZWNsYXJhdGlvblwiLCBub2RlTG9jYXRpb24oZ3JvdXAsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZ3JvdXAuaXRlbXMpIHtcbiAgICAgIGlmIChpdGVtLnR5cGUgIT09IG51bGwgfHwgdHlwZW9mIGl0ZW0ubmFtZSAhPSBcInN0cmluZ1wiIHx8ICFpdGVtLm5hbWUuaW5jbHVkZXMoXCJcXFxcXCIpKSB7XG4gICAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImdyb3VwZWQgb3IgdW5xdWFsaWZpZWQgdXNlIGl0ZW1cIiwgbm9kZUxvY2F0aW9uKGl0ZW0sIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgICAgfVxuICAgICAgY29uc3QgaW1wb3J0ZWROYW1lID0gaXRlbS5uYW1lLnNwbGl0KFwiXFxcXFwiKS5hdCgtMSlcbiAgICAgIGNvbnN0IGFsaWFzID0gaXRlbS5hbGlhc1xuXG4gICAgICBpZiAoIWltcG9ydGVkTmFtZSB8fCBhbGlhcyAmJiBhbGlhcy5raW5kICE9IFwiaWRlbnRpZmllclwiKSB7XG4gICAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImludmFsaWQgdXNlIGFsaWFzXCIsIG5vZGVMb2NhdGlvbihpdGVtLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICAgIH1cbiAgICAgIGJpbmRpbmdzLnB1c2goe1xuICAgICAgICBpbXBvcnRlZE5hbWUsXG4gICAgICAgIGxvY2FsTmFtZTogYWxpYXMgPyBhbGlhcy5uYW1lIDogaW1wb3J0ZWROYW1lLFxuICAgICAgICBsb2NhdGlvbjogbm9kZUxvY2F0aW9uKGl0ZW0sIGZpbGVuYW1lLCBzb3VyY2UpLFxuICAgICAgICBuYXRpdmVOYW1lOiBpdGVtLm5hbWUsXG4gICAgICAgIHN5bWJvbEtpbmQ6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNEZWNsYXJhdGlvbktpbmR9ICovIChncm91cC50eXBlID09IFwiZnVuY3Rpb25cIiA/IFwiZnVuY3Rpb25cIiA6IFwicmVjb3JkXCIpLFxuICAgICAgICB0eXBlT25seTogLyoqIEB0eXBlIHtjb25zdH0gKi8gKGZhbHNlKVxuICAgICAgfSlcbiAgICB9XG4gIH1cbiAgY29uc3QgaW1wb3J0cyA9IG5hbWVzcGFjZS5jaGlsZHJlbi5maWx0ZXIoaXNQaHBJbmNsdWRlU3RhdGVtZW50KS5tYXAoKG5vZGUpID0+IHtcbiAgICBpZiAoIWlzUGhwUmVxdWlyZU9uY2Uobm9kZSkpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImluY2x1ZGUvcmVxdWlyZSBvdXRzaWRlIGxpdGVyYWwgcmVxdWlyZV9vbmNlIF9fRElSX18gcHJvZmlsZVwiLCBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIGNvbnN0IHN0YXRlbWVudCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5FeHByZXNzaW9uU3RhdGVtZW50fSAqLyAobm9kZSlcbiAgICBjb25zdCBpbmNsdWRlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkluY2x1ZGV9ICovIChzdGF0ZW1lbnQuZXhwcmVzc2lvbilcbiAgICBjb25zdCB0YXJnZXQgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQmlufSAqLyAoaW5jbHVkZS50YXJnZXQpXG4gICAgY29uc3QgcGF0aCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5TdHJpbmd9ICovICh0YXJnZXQucmlnaHQpXG5cbiAgICBpZiAoIXBhdGgudmFsdWUuc3RhcnRzV2l0aChcIi9cIikgfHwgcGF0aC52YWx1ZS5pbmNsdWRlcyhcIlxcMFwiKSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwidW5zYWZlIHJlcXVpcmVfb25jZSBwYXRoXCIsIG5vZGVMb2NhdGlvbihwYXRoLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW1wb3J0ZWROYW1lOiBcIipcIixcbiAgICAgIGxvY2FsTmFtZTogXCJcIixcbiAgICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICBuYW1lc3BhY2U6IC8qKiBAdHlwZSB7Y29uc3R9ICovICh0cnVlKSxcbiAgICAgIHBhdGhMb2NhdGlvbjogbm9kZUxvY2F0aW9uKHBhdGgsIGZpbGVuYW1lLCBzb3VyY2UpLFxuICAgICAgc3BlY2lmaWVyOiBgLiR7cGF0aC52YWx1ZX1gLFxuICAgICAgdHlwZU9ubHk6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChmYWxzZSlcbiAgICB9XG4gIH0pXG4gIGNvbnN0IGV4cG9ydHMgPSBuYW1lc3BhY2UuY2hpbGRyZW4uZmxhdE1hcCgobm9kZSkgPT4ge1xuICAgIGlmIChub2RlLmtpbmQgIT0gXCJjbGFzc1wiICYmIG5vZGUua2luZCAhPSBcImZ1bmN0aW9uXCIpIHJldHVybiBbXVxuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkNsYXNzIHwgaW1wb3J0KFwicGhwLXBhcnNlclwiKS5GdW5jdGlvbn0gKi8gKG5vZGUpXG4gICAgY29uc3QgbmFtZSA9IHR5cGVvZiBkZWNsYXJhdGlvbi5uYW1lID09IFwic3RyaW5nXCIgPyBkZWNsYXJhdGlvbi5uYW1lIDogZGVjbGFyYXRpb24ubmFtZS5uYW1lXG5cbiAgICByZXR1cm4gW3tleHBvcnRlZE5hbWU6IG5hbWUsIGxvY2FsTmFtZTogbmFtZSwgbG9jYXRpb246IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKSwgdHlwZU9ubHk6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChmYWxzZSl9XVxuICB9KVxuXG4gIHJldHVybiB7YmluZGluZ3MsIGV4cG9ydHMsIGltcG9ydHMsIG5hdGl2ZU5hbWU6IG5hbWVzcGFjZS5uYW1lfVxufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciBhIFBIUCBzdGF0ZW1lbnQgaXMgYW55IGluY2x1ZGUvcmVxdWlyZSBleHByZXNzaW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGV9IG5vZGUgLSBDYW5kaWRhdGUgc3RhdGVtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG5vZGUgaXMgYW4gaW5jbHVkZSBleHByZXNzaW9uIHN0YXRlbWVudC5cbiAqL1xuZnVuY3Rpb24gaXNQaHBJbmNsdWRlU3RhdGVtZW50KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUua2luZCA9PSBcImV4cHJlc3Npb25zdGF0ZW1lbnRcIiAmJlxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5FeHByZXNzaW9uU3RhdGVtZW50fSAqLyAobm9kZSkuZXhwcmVzc2lvbi5raW5kID09IFwiaW5jbHVkZVwiXG59XG5cbi8qKlxuICogUmVwb3J0cyB3aGV0aGVyIGEgUEhQIHN0YXRlbWVudCBpcyB0aGUgY2Fub25pY2FsIGxpdGVyYWwgcHJvamVjdCBsb2FkIGVkZ2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZX0gbm9kZSAtIENhbmRpZGF0ZSBzdGF0ZW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgbm9kZSBpcyBhIHN1cHBvcnRlZCByZXF1aXJlLW9uY2Ugc3RhdGVtZW50LlxuICovXG5mdW5jdGlvbiBpc1BocFJlcXVpcmVPbmNlKG5vZGUpIHtcbiAgaWYgKCFpc1BocEluY2x1ZGVTdGF0ZW1lbnQobm9kZSkpIHJldHVybiBmYWxzZVxuICBjb25zdCBzdGF0ZW1lbnQgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRXhwcmVzc2lvblN0YXRlbWVudH0gKi8gKG5vZGUpXG4gIGNvbnN0IGluY2x1ZGUgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuSW5jbHVkZX0gKi8gKHN0YXRlbWVudC5leHByZXNzaW9uKVxuICBjb25zdCB0YXJnZXQgPSBpbmNsdWRlLnRhcmdldC5raW5kID09IFwiYmluXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQmlufSAqLyAoaW5jbHVkZS50YXJnZXQpIDogdW5kZWZpbmVkXG4gIGNvbnN0IGxlZnQgPSB0YXJnZXQ/LmxlZnQua2luZCA9PSBcIm1hZ2ljXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTWFnaWN9ICovICh0YXJnZXQubGVmdCkgOiB1bmRlZmluZWRcblxuICByZXR1cm4gaW5jbHVkZS5vbmNlICYmIGluY2x1ZGUucmVxdWlyZSAmJiB0YXJnZXQ/LnR5cGUgPT0gXCIuXCIgJiZcbiAgICBsZWZ0Py52YWx1ZSA9PSBcIl9fRElSX19cIiAmJiB0YXJnZXQucmlnaHQua2luZCA9PSBcInN0cmluZ1wiXG59XG5cbi8qKlxuICogQWNjZXB0cyBvbmx5IGFuIG9wdGlvbmFsIHNpbmdsZSBgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSlgIGRpcmVjdGl2ZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Ob2RlW119IG5vZGVzIC0gVG9wLWxldmVsIFBIUCBub2Rlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVEZWNsYXJlTm9kZXMobm9kZXMsIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgY29uc3QgZGVjbGFyYXRpb25zID0gbm9kZXMuZmlsdGVyKChub2RlKSA9PiBub2RlLmtpbmQgPT0gXCJkZWNsYXJlXCIpXG5cbiAgaWYgKGRlY2xhcmF0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJtdWx0aXBsZSBkZWNsYXJlIGRpcmVjdGl2ZXNcIiwgbm9kZUxvY2F0aW9uKGRlY2xhcmF0aW9uc1sxXSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cblxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uTm9kZSBvZiBkZWNsYXJhdGlvbnMpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5EZWNsYXJlfSAqLyAoZGVjbGFyYXRpb25Ob2RlKVxuICAgIGNvbnN0IGRpcmVjdGl2ZSA9IGRlY2xhcmF0aW9uLmRpcmVjdGl2ZXNbMF1cbiAgICBjb25zdCBrZXkgPSBkaXJlY3RpdmU/LmtleVxuICAgIGNvbnN0IHZhbHVlID0gZGlyZWN0aXZlPy52YWx1ZVxuICAgIGNvbnN0IG51bWVyaWNWYWx1ZSA9IHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIHZhbHVlLmtpbmQgPT0gXCJudW1iZXJcIlxuICAgICAgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTnVtYmVyfSAqLyAodmFsdWUpXG4gICAgICA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IHZhbHVlSXNPbmUgPSBudW1lcmljVmFsdWU/LmxvYyAmJiBzb3VyY2Uuc2xpY2UobnVtZXJpY1ZhbHVlLmxvYy5zdGFydC5vZmZzZXQsIG51bWVyaWNWYWx1ZS5sb2MuZW5kLm9mZnNldCkgPT0gXCIxXCJcbiAgICBjb25zdCB2YWxpZCA9IGRlY2xhcmF0aW9uLm1vZGUgPT0gXCJub25lXCIgJiYgZGVjbGFyYXRpb24uY2hpbGRyZW4ubGVuZ3RoID09IDAgJiYgZGVjbGFyYXRpb24uZGlyZWN0aXZlcy5sZW5ndGggPT0gMSAmJlxuICAgICAga2V5LmtpbmQgPT0gXCJpZGVudGlmaWVyXCIgJiYga2V5Lm5hbWUgPT0gXCJzdHJpY3RfdHlwZXNcIiAmJiB2YWx1ZUlzT25lXG5cbiAgICBpZiAoIXZhbGlkKSB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImRlY2xhcmUgb3RoZXIgdGhhbiBzdHJpY3RfdHlwZXM9MVwiLCBub2RlTG9jYXRpb24oZGVjbGFyYXRpb24sIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG59XG5cbi8qKlxuICogSW52b2tlcyBwaHAtcGFyc2VyIGFuZCBub3JtYWxpemVzIHN5bnRheCBmYWlsdXJlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBTb3VyY2UgdGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlByb2dyYW19IFBIUCBwcm9ncmFtLlxuICovXG5mdW5jdGlvbiBwYXJzZVBocFByb2dyYW0oZmlsZW5hbWUsIHNvdXJjZSkge1xuICB0cnkge1xuICAgIHJldHVybiBwYXJzZXIucGFyc2VDb2RlKHNvdXJjZSwgZmlsZW5hbWUpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHBhcnNlRmFpbHVyZShcInBocFwiLCBlcnJvciwgcGhwUGFyc2VyRmFpbHVyZUxvY2F0aW9uKGVycm9yLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgcGhwLXBhcnNlcidzIG9uZS1iYXNlZCBsaW5lIGFuZCB6ZXJvLWJhc2VkIGNvbHVtbiB3aGVuIHByZXNlbnQuXG4gKiBBIG1vZHVsZSByYW5nZSByZW1haW5zIHRoZSBkZXRlcm1pbmlzdGljIGZhbGxiYWNrIGZvciBvcGFxdWUgcGFyc2VyIGVycm9ycy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBOYXRpdmUgcGFyc2VyIGVycm9yLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gUmVxdWVzdGVkIHNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IEZhaWx1cmUgcmFuZ2UuXG4gKi9cbmZ1bmN0aW9uIHBocFBhcnNlckZhaWx1cmVMb2NhdGlvbihlcnJvciwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPSBcIm9iamVjdFwiKSByZXR1cm4gbW9kdWxlTG9jYXRpb24oZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgbGluZSA9IFJlZmxlY3QuZ2V0KGVycm9yLCBcImxpbmVOdW1iZXJcIilcbiAgY29uc3QgY29sdW1uID0gUmVmbGVjdC5nZXQoZXJyb3IsIFwiY29sdW1uTnVtYmVyXCIpXG5cbiAgaWYgKHR5cGVvZiBsaW5lICE9IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKGxpbmUpIHx8IGxpbmUgPCAxIHx8XG4gICAgdHlwZW9mIGNvbHVtbiAhPSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihjb2x1bW4pIHx8IGNvbHVtbiA8IDApIHtcbiAgICByZXR1cm4gbW9kdWxlTG9jYXRpb24oZmlsZW5hbWUsIHNvdXJjZSlcbiAgfVxuICBsZXQgbGluZVN0YXJ0ID0gMFxuXG4gIGZvciAobGV0IGN1cnJlbnQgPSAxOyBjdXJyZW50IDwgbGluZTsgY3VycmVudCsrKSB7XG4gICAgY29uc3QgbmV3bGluZSA9IHNvdXJjZS5pbmRleE9mKFwiXFxuXCIsIGxpbmVTdGFydClcblxuICAgIGlmIChuZXdsaW5lIDwgMCkgcmV0dXJuIG1vZHVsZUxvY2F0aW9uKGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgbGluZVN0YXJ0ID0gbmV3bGluZSArIDFcbiAgfVxuICBjb25zdCBsaW5lRW5kID0gc291cmNlLmluZGV4T2YoXCJcXG5cIiwgbGluZVN0YXJ0KVxuICBjb25zdCBib3VuZGVkRW5kID0gbGluZUVuZCA8IDAgPyBzb3VyY2UubGVuZ3RoIDogbGluZUVuZFxuICBjb25zdCBvZmZzZXQgPSBNYXRoLm1pbihsaW5lU3RhcnQgKyBjb2x1bW4sIGJvdW5kZWRFbmQpXG5cbiAgcmV0dXJuIGxvY2F0aW9uRnJvbU9mZnNldHMoZmlsZW5hbWUsIHNvdXJjZSwgb2Zmc2V0LCBNYXRoLm1pbihvZmZzZXQgKyAxLCBzb3VyY2UubGVuZ3RoKSlcbn1cbiJdfQ==
2248
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Zyb250ZW5kcy9waHAuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQTtBQUNsQyxPQUFPLEVBQUMsS0FBSyxJQUFJLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFBO0FBQ3BELE9BQU8sRUFBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDN0UsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDcEUsT0FBTyxFQUFDLG1CQUFtQixFQUFFLGNBQWMsRUFBQyxNQUFNLHlCQUF5QixDQUFBO0FBQzNFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBQzdELE9BQU8sRUFBQyxlQUFlLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQTtBQUMzRSxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQTtBQUNsRSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUM1RCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsVUFBVSxFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDeEUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0seUJBQXlCLENBQUE7QUFDL0QsT0FBTyxFQUFDLHVCQUF1QixFQUFFLHVCQUF1QixFQUFFLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFBO0FBQy9GLE9BQU8sRUFBQyw0QkFBNEIsRUFBRSxtQkFBbUIsRUFBRSwyQkFBMkIsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLGlCQUFpQixFQUFFLGdDQUFnQyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVB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LENBQUMsTUFBTSxDQUFDLENBQUM7UUFBRSxPQUFPLEVBQUMsVUFBVSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBQyxDQUFBO0lBQ3BJLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDNUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUE7SUFDOUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQTtJQUM5RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLFFBQVEsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFBO0lBQ3BGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksVUFBVSxDQUFDLENBQUE7SUFDaEUsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFBO0lBQ3JHLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQzFILGFBQWEsQ0FBQyxJQUFJ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QUFNLENBQUMsQ0FBQTtJQUN6QyxDQUFDO0lBQ0QsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFBO0lBRWpCLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNoRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUUvQyxJQUFJLE9BQU8sR0FBRyxDQUFDO1lBQUUsT0FBTyxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3hELFNBQVMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFBO0lBQ3pCLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUMvQyxNQUFNLFVBQVUsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUE7SUFDeEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBRXZELE9BQU8sbUJBQW1CLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0FBQzNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IFBocFBhcnNlciBmcm9tIFwicGhwLXBhcnNlclwiXG5pbXBvcnQge3BhcnNlIGFzIHBhcnNlQ29tbWVudH0gZnJvbSBcImNvbW1lbnQtcGFyc2VyXCJcbmltcG9ydCB7bWlzc2luZ1R5cGUsIHBhcnNlRmFpbHVyZSwgdW5zdXBwb3J0ZWRTeW50YXh9IGZyb20gXCIuLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7YmxvY2tSZWZlcmVuY2VzUHJvdGVjdGVkRW50cnl9IGZyb20gXCIuLi9zZW1hbnRpYy9lZmZlY3RzLmpzXCJcbmltcG9ydCB7bG9jYXRpb25Gcm9tT2Zmc2V0cywgbW9kdWxlTG9jYXRpb259IGZyb20gXCIuLi9zZW1hbnRpYy9sb2NhdGlvbi5qc1wiXG5pbXBvcnQge3dpdGhBZGFwdGVkT3BlcmF0aW9ufSBmcm9tIFwiLi4vc2VtYW50aWMvb3BlcmF0b3JzLmpzXCJcbmltcG9ydCB7c2V0UGFyc2VyUmFuZ2VzLCB3aXRoUGFyc2VyUmFuZ2VzfSBmcm9tIFwiLi4vc2VtYW50aWMvcHJvdmVuYW5jZS5qc1wiXG5pbXBvcnQge2lzVGFzazAzNFJlc291cmNlUHJvYmV9IGZyb20gXCIuLi9zZW1hbnRpYy9jYXBhYmlsaXRpZXMuanNcIlxuaW1wb3J0IHtoYXNFeGFjdEVmZmVjdFN1cHBvcnR9IGZyb20gXCIuLi9iYWNrZW5kcy9lZmZlY3RzLmpzXCJcbmltcG9ydCB7aGFzT25seVVuaWNvZGVTY2FsYXJzLCBzY2FsYXJUeXBlfSBmcm9tIFwiLi4vc2VtYW50aWMvc2NhbGFycy5qc1wiXG5pbXBvcnQge3R5cGVDb250YWluc0FueVZhcmlhYmxlfSBmcm9tIFwiLi4vc2VtYW50aWMvZ2VuZXJpY3MuanNcIlxuaW1wb3J0IHtyZXF1aXJlU291cmNlUmV0dXJuVHlwZSwgcmVxdWlyZVNvdXJjZVNjYWxhclR5cGUsIHNvdXJjZVNjYWxhclR5cGV9IGZyb20gXCIuL3NjYWxhcnMuanNcIlxuaW1wb3J0IHtjYXBhYmlsaXR5RnVuY3Rpb25TaWduYXR1cmVzLCBkb2N1bWVudGVkVmFsdWVUeXBlLCBpbnN0YW50aWF0ZWRSZWNvcmRGaWVsZFR5cGUsIGludGVyZmFjZVR5cGUsIGl0ZXJhdGlvbkJpbmRpbmdUeXBlLCBpdGVyYXRpb25PcGVyYW5kVHlwZSwga25vd25DYWxsUGFyYW1ldGVyVHlwZXMsIGtub3duQ2FsbFJldHVyblR5cGUsIG9wdGlvbmFsVHlwZSwgb3JkZXJlZE1hcFR5cGVGcm9tTWFwLCBvd25lZFJlc291cmNlVHlwZSwgcHJlc2VydmVzR2VuZXJpY09wdGlvbmFsRXZpZGVuY2UsIHJlY29yZFR5cGUsIHJlZmVyZW5jZVR5cGUsIHNhbWVWYWx1ZVR5cGV9IGZyb20gXCIuL3R5cGVzLmpzXCJcbmNvbnN0IHBhcnNlciA9IG5ldyBQaHBQYXJzZXIuRW5naW5lKHtcbiAgYXN0OiB7d2l0aFBvc2l0aW9uczogdHJ1ZX0sXG4gIHBhcnNlcjoge2V4dHJhY3REb2M6IHRydWUsIHN1cHByZXNzRXJyb3JzOiBmYWxzZX1cbn0pXG4vKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi9cbmxldCBjYWNoZWRUb2tlblNvdXJjZVxuLyoqIEB0eXBlIHt7ZW5kOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIHRleHQ6IHN0cmluZ31bXX0gKi9cbmxldCBjYWNoZWRUb2tlblJhbmdlcyA9IFtdXG5jb25zdCBwaHBCaW5hcnlPcGVyYXRpb25zID0gbmV3IE1hcChbXG4gIFtcIitcIiwgXCJQaHBBZGRcIl0sXG4gIFtcIi1cIiwgXCJTdWJ0cmFjdFwiXSxcbiAgW1wiKlwiLCBcIk11bHRpcGx5XCJdLFxuICBbXCImJlwiLCBcIkFuZFwiXSxcbiAgW1wifHxcIiwgXCJPclwiXSxcbiAgW1wiPT09XCIsIFwiRXF1YWxcIl0sXG4gIFtcIiE9PVwiLCBcIk5vdEVxdWFsXCJdLFxuICBbXCI8XCIsIFwiTGVzc1RoYW5cIl0sXG4gIFtcIjw9XCIsIFwiTGVzc1RoYW5PckVxdWFsXCJdLFxuICBbXCI+XCIsIFwiR3JlYXRlclRoYW5cIl0sXG4gIFtcIj49XCIsIFwiR3JlYXRlclRoYW5PckVxdWFsXCJdLFxuICBbXCIuXCIsIFwiU3RyaW5nQ29uY2F0XCJdXG5dKVxuXG4vKipcbiAqIEB0eXBlZGVmIFBocENvbnZlcnNpb25Db250ZXh0XG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljQmluZGluZ1R5cGU+fSBiaW5kaW5ncyAtIEV4cGxpY2l0bHkgdHlwZWQgdmlzaWJsZSBiaW5kaW5ncy5cbiAqIEBwcm9wZXJ0eSB7U2V0PHN0cmluZz59IFtjYXRjaEJpbmRpbmdOYW1lc10gLSBMZXhpY2FsbHkgdmlzaWJsZSBleGFjdCBjYXRjaCBiaW5kaW5nIG5hbWVzLlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DYXRjaEJpbmRpbmc+fSBbY2F0Y2hCaW5kaW5nTm9kZXNdIC0gRXhhY3QgY2F0Y2ggYmluZGluZyBub2RlcyBieSB2aXNpYmxlIG5hbWUuXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24+fSBjbGFzc2VzIC0gUmVmZXJlbmNlIGNsYXNzZXMgYnkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb259IFtjdXJyZW50Q2xhc3NdIC0gRW5jbG9zaW5nIHJlZmVyZW5jZSBjbGFzcy5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuSW50ZXJmYWNlRGVjbGFyYXRpb24+fSBpbnRlcmZhY2VzIC0gSW50ZXJmYWNlIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj59IGVycm9yTmFtZXMgLSBFcnJvciBkZWNsYXJhdGlvbnMgYnkgc291cmNlIG5hbWUuXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24+fSBlcnJvcnMgLSBFcnJvciBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIFBocEZ1bmN0aW9uU2lnbmF0dXJlPn0gZnVuY3Rpb25zIC0gRXhwbGljaXQgbW9kdWxlIGZ1bmN0aW9uIHNpZ25hdHVyZXMuXG4gKiBAcHJvcGVydHkge1NldDxvYmplY3Q+fSBbb3JkZXJlZE1hcERlY2xhcmF0aW9uc10gLSBFeGFjdCBsb2NhbCBkZWNsYXJhdGlvbnMgc2VsZWN0ZWQgYnkgcGFyc2VyLW93bmVkIHBhaXIgaXRlcmF0aW9uLlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuSW50ZXJmYWNlRGVjbGFyYXRpb24+fSByZWNvcmROYW1lcyAtIE5vbWluYWwgZGVjbGFyYXRpb25zIGJ5IHNvdXJjZSBuYW1lLlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj59IHJlY29yZHMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZSB8IHVuZGVmaW5lZH0gcmV0dXJuVHlwZSAtIEVuY2xvc2luZyByZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuVHlwZVBhcmFtZXRlcj59IFt0eXBlUGFyYW1ldGVyc10gLSBEZWNsYXJhdGlvbi1zY29wZWQgcGFyYW1ldGVycy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFBocEZ1bmN0aW9uU2lnbmF0dXJlXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGRlY2xhcmF0aW9uIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbmFtZUxvY2F0aW9uIC0gUGFyc2VyLW93bmVkIG5hbWUgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEZ1bmN0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlBhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gU2VtYW50aWMgcGFyYW1ldGVycy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHJldHVyblR5cGUgLSBTZW1hbnRpYyByZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuVHlwZVBhcmFtZXRlcltdfSBbdHlwZVBhcmFtZXRlcnNdIC0gRGVjbGFyYXRpb24tc2NvcGVkIHBhcmFtZXRlcnMuXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgbm9ybWFsaXplZCBQSFAgbm9kZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Ob2RlfSBub2RlIC0gUEhQIHBhcnNlciBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gU291cmNlIGxvY2F0aW9uLlxuICovXG5mdW5jdGlvbiBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBpZiAoIW5vZGUubG9jKSB0aHJvdyBuZXcgRXJyb3IoYFBIUCBwYXJzZXIgb21pdHRlZCBzb3VyY2UgbG9jYXRpb24gZm9yICR7bm9kZS5raW5kfS5gKVxuXG4gIHJldHVybiBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBzb3VyY2UsIG5vZGUubG9jLnN0YXJ0Lm9mZnNldCwgbm9kZS5sb2MuZW5kLm9mZnNldClcbn1cblxuLyoqXG4gKiBMb2NhdGVzIGEgY29tbWVudC1wYXJzZXIgdG9rZW4gaW5zaWRlIGEgUEhQIHBhcnNlci1vd25lZCBkb2MgY29tbWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Db21tZW50QmxvY2t9IGNvbW1lbnQgLSBQSFAgZG9jIGNvbW1lbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcImNvbW1lbnQtcGFyc2VyXCIpLlNwZWN9IHRhZyAtIFBhcnNlZCBkb2MgdGFnLlxuICogQHBhcmFtIHtcIm5hbWVcIiB8IFwidHlwZVwifSBmaWVsZCAtIFRva2VuIGZpZWxkLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gRXhhY3QgdG9rZW4gbG9jYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNvbW1lbnRUYWdMb2NhdGlvbihjb21tZW50LCB0YWcsIGZpZWxkLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGxpbmUgPSB0YWcuc291cmNlWzBdXG5cbiAgaWYgKCFjb21tZW50LmxvYyB8fCAhbGluZSkgdGhyb3cgbmV3IEVycm9yKGBDb21tZW50IHBhcnNlciBvbWl0dGVkIHRoZSBAJHt0YWcudGFnfSBzb3VyY2UgdG9rZW4uYClcblxuICBsZXQgbGluZVN0YXJ0ID0gY29tbWVudC5sb2Muc3RhcnQub2Zmc2V0XG5cbiAgZm9yIChsZXQgbGluZU51bWJlciA9IDA7IGxpbmVOdW1iZXIgPCBsaW5lLm51bWJlcjsgbGluZU51bWJlcisrKSB7XG4gICAgd2hpbGUgKGxpbmVTdGFydCA8IHNvdXJjZS5sZW5ndGggJiYgc291cmNlW2xpbmVTdGFydF0gIT0gXCJcXHJcIiAmJiBzb3VyY2VbbGluZVN0YXJ0XSAhPSBcIlxcblwiKSBsaW5lU3RhcnQrK1xuICAgIGlmIChzb3VyY2VbbGluZVN0YXJ0XSA9PSBcIlxcclwiICYmIHNvdXJjZVtsaW5lU3RhcnQgKyAxXSA9PSBcIlxcblwiKSBsaW5lU3RhcnQgKz0gMlxuICAgIGVsc2UgbGluZVN0YXJ0KytcbiAgfVxuXG4gIGNvbnN0IG9yZGVyZWRGaWVsZHMgPSBbXCJzdGFydFwiLCBcImRlbGltaXRlclwiLCBcInBvc3REZWxpbWl0ZXJcIiwgXCJ0YWdcIiwgXCJwb3N0VGFnXCIsIFwibmFtZVwiLCBcInBvc3ROYW1lXCIsIFwidHlwZVwiXVxuICBjb25zdCBmaWVsZEluZGV4ID0gb3JkZXJlZEZpZWxkcy5pbmRleE9mKGZpZWxkKVxuICBjb25zdCBzdGFydCA9IGxpbmVTdGFydCArIG9yZGVyZWRGaWVsZHMuc2xpY2UoMCwgZmllbGRJbmRleCkucmVkdWNlKChsZW5ndGgsIGtleSkgPT5cbiAgICBsZW5ndGggKyBsaW5lLnRva2Vuc1svKiogQHR5cGUge2tleW9mIHR5cGVvZiBsaW5lLnRva2Vuc30gKi8gKGtleSldLmxlbmd0aCwgMClcbiAgY29uc3QgdmFsdWUgPSBsaW5lLnRva2Vuc1tmaWVsZF1cblxuICByZXR1cm4gbG9jYXRpb25Gcm9tT2Zmc2V0cyhmaWxlbmFtZSwgc291cmNlLCBzdGFydCwgc3RhcnQgKyB2YWx1ZS5sZW5ndGgpXG59XG5cbi8qKlxuICogRmluZHMgb25lIHBhcnNlciB0b2tlbiBiZXR3ZWVuIHBhcnNlci1vd25lZCBub2RlIGJvdW5kYXJpZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5UZXh0IC0gRXhhY3QgdG9rZW4gdGV4dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydE9mZnNldCAtIEluY2x1c2l2ZSBzZWFyY2ggYm91bmRhcnkuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kT2Zmc2V0IC0gRXhjbHVzaXZlIHNlYXJjaCBib3VuZGFyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IFRva2VuIGxvY2F0aW9uLlxuICovXG5mdW5jdGlvbiB0b2tlbkxvY2F0aW9uKHRva2VuVGV4dCwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBpZiAoY2FjaGVkVG9rZW5Tb3VyY2UgIT0gc291cmNlKSB7XG4gICAgbGV0IG9mZnNldCA9IDBcblxuICAgIGNhY2hlZFRva2VuUmFuZ2VzID0gcGFyc2VyLnRva2VuR2V0QWxsKHNvdXJjZSkubWFwKCh0b2tlbikgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IHR5cGVvZiB0b2tlbiA9PSBcInN0cmluZ1wiID8gdG9rZW4gOiB0b2tlblsxXVxuICAgICAgY29uc3QgcmFuZ2UgPSB7ZW5kOiBvZmZzZXQgKyB0ZXh0Lmxlbmd0aCwgc3RhcnQ6IG9mZnNldCwgdGV4dH1cblxuICAgICAgb2Zmc2V0ID0gcmFuZ2UuZW5kXG5cbiAgICAgIHJldHVybiByYW5nZVxuICAgIH0pXG4gICAgY2FjaGVkVG9rZW5Tb3VyY2UgPSBzb3VyY2VcbiAgfVxuXG4gIGNvbnN0IHRva2VuID0gY2FjaGVkVG9rZW5SYW5nZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUudGV4dCA9PSB0b2tlblRleHQgJiYgY2FuZGlkYXRlLnN0YXJ0ID49IHN0YXJ0T2Zmc2V0ICYmXG4gICAgY2FuZGlkYXRlLmVuZCA8PSBlbmRPZmZzZXQpXG5cbiAgaWYgKHRva2VuKSByZXR1cm4gbG9jYXRpb25Gcm9tT2Zmc2V0cyhmaWxlbmFtZSwgc291cmNlLCB0b2tlbi5zdGFydCwgdG9rZW4uZW5kKVxuXG4gIHRocm93IG5ldyBFcnJvcihgUEhQIHBhcnNlciBvbWl0dGVkIHRva2VuICcke3Rva2VuVGV4dH0nIGJldHdlZW4gJHtzdGFydE9mZnNldH0gYW5kICR7ZW5kT2Zmc2V0fS5gKVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3VwcG9ydGVkIFBIUCBleHByZXNzaW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkV4cHJlc3Npb259IG5vZGUgLSBQSFAgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge1BocENvbnZlcnNpb25Db250ZXh0fSBjb250ZXh0IC0gVHlwZWQgY29udmVyc2lvbiBjb250ZXh0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gW2V4cGVjdGVkVHlwZV0gLSBDb250ZXh0dWFsIHR5cGUgZm9yIGVtcHR5IFBIUCBhcnJheXMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVzZXJ2ZU9wdGlvbmFsXSAtIFdoZXRoZXIgYW4gb3B0aW9uYWwgaWRlbnRpZmllciByZW1haW5zIHdyYXBwZWQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gU2VtYW50aWMgZXhwcmVzc2lvbi5cbiAqL1xuZnVuY3Rpb24gY29udmVydEV4cHJlc3Npb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCwgZXhwZWN0ZWRUeXBlLCBwcmVzZXJ2ZU9wdGlvbmFsID0gZmFsc2UpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAoZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICBpZiAobm9kZS5raW5kID09IFwibnVsbGtleXdvcmRcIikge1xuICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIk9wdGlvbmFsTm9uZVwiKSwgbG9jYXRpb259LCB7YWJzZW5jZTogbG9jYXRpb259KVxuICAgIH1cbiAgICBpZiAoa25vd25FeHByZXNzaW9uVHlwZShub2RlLCBjb250ZXh0KT8ua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICByZXR1cm4gY29udmVydEV4cHJlc3Npb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCwgdW5kZWZpbmVkLCB0cnVlKVxuICAgIH1cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJPcHRpb25hbFNvbWVcIiksXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHZhbHVlOiBjb252ZXJ0RXhwcmVzc2lvbihub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCBleHBlY3RlZFR5cGUudmFsdWVUeXBlKVxuICAgIH0sIHtzb21lOiBsb2NhdGlvbn0pXG4gIH1cblxuICBpZiAobm9kZS5raW5kID09IFwibnVsbGtleXdvcmRcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibnVsbCBvdXRzaWRlIGFuIGV4cGxpY2l0IG9wdGlvbmFsIGNvbnRleHRcIiwgbG9jYXRpb24pXG5cbiAgaWYgKG5vZGUua2luZCA9PSBcInZhcmlhYmxlXCIpIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5WYXJpYWJsZX0gKi8gKG5vZGUpXG5cbiAgICBpZiAodHlwZW9mIHZhcmlhYmxlLm5hbWUgIT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZHluYW1pYyB2YXJpYWJsZVwiLCBsb2NhdGlvbilcbiAgICBpZiAodmFyaWFibGUubmFtZSA9PSBcInRoaXNcIikge1xuICAgICAgaWYgKCFjb250ZXh0LmN1cnJlbnRDbGFzcykgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwicmVjZWl2ZXIgb3V0c2lkZSBhIHJlZmVyZW5jZSBjbGFzc1wiLCBsb2NhdGlvbilcbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtjbGFzc0lkOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGNvbnRleHQuY3VycmVudENsYXNzLmlkKSxcbiAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUmVjZWl2ZXJFeHByZXNzaW9uXCIpLCBsb2NhdGlvbn0sIHtyZWNlaXZlcjogbG9jYXRpb259KVxuICAgIH1cblxuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSwgbG9jYXRpb24sIG5hbWU6IHZhcmlhYmxlLm5hbWV9LCB7bmFtZTogbG9jYXRpb259KVxuXG4gICAgaWYgKCFwcmVzZXJ2ZU9wdGlvbmFsICYmIGNvbnRleHQuYmluZGluZ3MuZ2V0KHZhcmlhYmxlLm5hbWUpPy5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJPcHRpb25hbFVud3JhcFwiKSwgbG9jYXRpb24sIG9wZXJhbmQ6IGlkZW50aWZpZXJ9LCB7dW53cmFwOiBsb2NhdGlvbn0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGlkZW50aWZpZXJcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJudW1iZXJcIikge1xuICAgIGNvbnN0IGxpdGVyYWwgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTnVtYmVyfSAqLyAobm9kZSlcbiAgICBjb25zdCB2YWx1ZSA9IE51bWJlcihsaXRlcmFsLnZhbHVlKVxuXG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm5vbi1zYWZlIGludGVnZXIgbGl0ZXJhbFwiLCBsb2NhdGlvbilcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJJbnRlZ2VyTGl0ZXJhbFwiKSwgbG9jYXRpb24sIHZhbHVlfSwge2xpdGVyYWw6IGxvY2F0aW9ufSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJib29sZWFuXCIpIHtcbiAgICBjb25zdCBsaXRlcmFsID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJvb2xlYW59ICovIChub2RlKVxuXG4gICAgaWYgKHR5cGVvZiBsaXRlcmFsLnZhbHVlICE9IFwiYm9vbGVhblwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpbnZhbGlkIGJvb2xlYW4gbGl0ZXJhbCB2YWx1ZVwiLCBsb2NhdGlvbilcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJCb29sZWFuTGl0ZXJhbFwiKSwgbG9jYXRpb24sIHZhbHVlOiBsaXRlcmFsLnZhbHVlfSwge2xpdGVyYWw6IGxvY2F0aW9ufSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGxpdGVyYWwgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuU3RyaW5nfSAqLyAobm9kZSlcblxuICAgIGlmICh0eXBlb2YgbGl0ZXJhbC5yYXcgPT0gXCJzdHJpbmdcIiAmJiBsaXRlcmFsLnJhdy5zdGFydHNXaXRoKFwiPDw8XCIpKSB7XG4gICAgICBjb25zdCBkZXRhaWwgPSBsaXRlcmFsLnJhdy5zdGFydHNXaXRoKFwiPDw8J1wiKSA/IFwibm93ZG9jIHN0cmluZ1wiIDogXCJoZXJlZG9jIHN0cmluZ1wiXG5cbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBkZXRhaWwsIGxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGxpdGVyYWwucmF3ID09IFwic3RyaW5nXCIgJiYgW1wiYlxcXCJcIiwgXCJCXFxcIlwiLCBcImInXCIsIFwiQidcIl0uc29tZSgocHJlZml4KSA9PiBsaXRlcmFsLnJhdy5zdGFydHNXaXRoKHByZWZpeCkpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJiaW5hcnkgc3RyaW5nIGxpdGVyYWxcIiwgbG9jYXRpb24pXG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGl0ZXJhbC52YWx1ZSAhPSBcInN0cmluZ1wiIHx8ICFoYXNPbmx5VW5pY29kZVNjYWxhcnMobGl0ZXJhbC52YWx1ZSkpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImludmFsaWQgVW5pY29kZSBzdHJpbmcgbGl0ZXJhbFwiLCBsb2NhdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiU3RyaW5nTGl0ZXJhbFwiKSwgbG9jYXRpb24sIHZhbHVlOiBsaXRlcmFsLnZhbHVlfSwge2xpdGVyYWw6IGxvY2F0aW9ufSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJlbmNhcHNlZFwiKSB7XG4gICAgY29uc3QgbGl0ZXJhbCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5FbmNhcHNlZH0gKi8gKG5vZGUpXG5cbiAgICBpZiAobGl0ZXJhbC50eXBlICE9IFwic3RyaW5nXCIpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBgJHtsaXRlcmFsLnR5cGV9IHN0cmluZ2AsIGxvY2F0aW9uKVxuICAgIGlmICghQXJyYXkuaXNBcnJheShsaXRlcmFsLnZhbHVlKSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiaW50ZXJwb2xhdGVkIHN0cmluZ1wiLCBsb2NhdGlvbilcblxuICAgIGNvbnN0IHBhcnRzID0gbGl0ZXJhbC52YWx1ZS5tYXAoKHBhcnQpID0+IHtcbiAgICAgIGlmIChwYXJ0LmtpbmQgIT0gXCJlbmNhcHNlZHBhcnRcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGBpbnRlcnBvbGF0ZWQgc3RyaW5nIHBhcnQgJHtwYXJ0LmtpbmR9YCwgbm9kZUxvY2F0aW9uKHBhcnQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgICAgY29uc3QgZW5jYXBzZWRQYXJ0ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkVuY2Fwc2VkUGFydH0gKi8gKHBhcnQpXG5cbiAgICAgIGlmICghZW5jYXBzZWRQYXJ0LmV4cHJlc3Npb24pIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImludGVycG9sYXRlZCBzdHJpbmcgcGFydCB3aXRob3V0IGV4cHJlc3Npb25cIiwgbm9kZUxvY2F0aW9uKGVuY2Fwc2VkUGFydCwgZmlsZW5hbWUsIHNvdXJjZSkpXG5cbiAgICAgIHJldHVybiBjb252ZXJ0RXhwcmVzc2lvbihlbmNhcHNlZFBhcnQuZXhwcmVzc2lvbiwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCwgc2NhbGFyVHlwZShcInN0cmluZ1wiKSlcbiAgICB9KVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiU3RyaW5nTGl0ZXJhbFwiKSwgbG9jYXRpb24sIHZhbHVlOiBcIlwifSwge2xpdGVyYWw6IGxvY2F0aW9ufSlcbiAgICB9XG5cbiAgICBsZXQgbG93ZXJlZCA9IHBhcnRzWzBdXG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMuc2xpY2UoMSkpIHtcbiAgICAgIGNvbnN0IHNlbWFudGljID0gd2l0aEFkYXB0ZWRPcGVyYXRpb24oe1xuICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJCaW5hcnlFeHByZXNzaW9uXCIpLFxuICAgICAgICBsZWZ0OiBsb3dlcmVkLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgcmlnaHQ6IHBhcnRcbiAgICAgIH0sIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvb3BlcmF0b3JzLmpzXCIpLkFkYXB0ZWRPcGVyYXRpb259ICovIChcIlN0cmluZ0NvbmNhdFwiKSlcblxuICAgICAgbG93ZXJlZCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHNlbWFudGljKSlcbiAgICB9XG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyhsb3dlcmVkLCB7bGl0ZXJhbDogbG9jYXRpb259KVxuICB9XG5cbiAgaWYgKG5vZGUua2luZCA9PSBcIm5vd2RvY1wiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub3dkb2Mgc3RyaW5nXCIsIGxvY2F0aW9uKVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJhcnJheVwiKSB7XG4gICAgY29uc3QgbGl0ZXJhbCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5BcnJheX0gKi8gKG5vZGUpXG4gICAgY29uc3QgaW52YWxpZEVudHJ5ID0gbGl0ZXJhbC5pdGVtcy5maW5kKChlbnRyeSkgPT4ge1xuICAgICAgaWYgKGVudHJ5LmtpbmQgIT0gXCJlbnRyeVwiKSByZXR1cm4gdHJ1ZVxuICAgICAgY29uc3QgY2FuZGlkYXRlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkVudHJ5fSAqLyAoZW50cnkpXG5cbiAgICAgIHJldHVybiBjYW5kaWRhdGUuYnlSZWYgfHwgY2FuZGlkYXRlLnVucGFja1xuICAgIH0pXG5cbiAgICBpZiAoaW52YWxpZEVudHJ5KSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJhcnJheSByZWZlcmVuY2Ugb3IgdW5wYWNraW5nXCIsIG5vZGVMb2NhdGlvbihpbnZhbGlkRW50cnksIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIGNvbnN0IGVudHJpZXMgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRW50cnlbXX0gKi8gKGxpdGVyYWwuaXRlbXMpXG4gICAgY29uc3QgaGFzS2V5cyA9IGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LmtleSAhPSBudWxsKVxuICAgIGNvbnN0IGhhc0ltcGxpY2l0ID0gZW50cmllcy5zb21lKChlbnRyeSkgPT4gZW50cnkua2V5ID09IG51bGwpXG4gICAgY29uc3QgY29sbGVjdGlvbktpbmQgPSBlbnRyaWVzLmxlbmd0aCA9PSAwID8gZXhwZWN0ZWRUeXBlPy5raW5kIDogaGFzS2V5cyAmJiAhaGFzSW1wbGljaXRcbiAgICAgID8gZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiA/IFwiT3JkZXJlZE1hcFR5cGVcIiA6IFwiTWFwVHlwZVwiXG4gICAgICA6ICFoYXNLZXlzID8gXCJMaXN0VHlwZVwiIDogXCJtaXhlZFwiXG5cbiAgICBpZiAoY29sbGVjdGlvbktpbmQgPT0gXCJtaXhlZFwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJtaXhlZCBsaXN0L21hcCBhcnJheSBsaXRlcmFsXCIsIGxvY2F0aW9uKVxuICAgIGlmIChjb2xsZWN0aW9uS2luZCA9PSBcIkxpc3RUeXBlXCIpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiTGlzdFR5cGVcIiA/IGV4cGVjdGVkVHlwZS5lbGVtZW50VHlwZSA6IHVuZGVmaW5lZFxuXG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICAgIGVsZW1lbnRzOiBlbnRyaWVzLm1hcCgoZW50cnkpID0+IGNvbnZlcnRFeHByZXNzaW9uKGVudHJ5LnZhbHVlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCBlbGVtZW50VHlwZSkpLFxuICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJMaXN0TGl0ZXJhbFwiKSxcbiAgICAgICAgbG9jYXRpb25cbiAgICAgIH0sIHtsaXRlcmFsOiBsb2NhdGlvbn0pXG4gICAgfVxuICAgIGlmIChjb2xsZWN0aW9uS2luZCA9PSBcIk1hcFR5cGVcIiB8fCBjb2xsZWN0aW9uS2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIk1hcFR5cGVcIiB8fCBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiXG4gICAgICAgID8gZXhwZWN0ZWRUeXBlLnZhbHVlVHlwZSA6IHVuZGVmaW5lZFxuICAgICAgY29uc3Qgc2VtYW50aWNFbnRyaWVzID0gZW50cmllcy5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICAgIGlmICghZW50cnkua2V5IHx8IGVudHJ5LmtleS5raW5kICE9IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJtYXAga2V5IG90aGVyIHRoYW4gYSBsaXRlcmFsIHN0cmluZ1wiLCBlbnRyeS5rZXkgPyBub2RlTG9jYXRpb24oZW50cnkua2V5LCBmaWxlbmFtZSwgc291cmNlKSA6IG5vZGVMb2NhdGlvbihlbnRyeSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gY29udmVydEV4cHJlc3Npb24oZW50cnkua2V5LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuXG4gICAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgICAgICBrZXk6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU3RyaW5nTGl0ZXJhbH0gKi8gKGtleSksXG4gICAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiTWFwRW50cnlcIiksXG4gICAgICAgICAgbG9jYXRpb246IG5vZGVMb2NhdGlvbihlbnRyeSwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICAgICAgdmFsdWU6IGNvbnZlcnRFeHByZXNzaW9uKGVudHJ5LnZhbHVlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCB2YWx1ZVR5cGUpXG4gICAgICAgIH0sIHtvcGVyYXRvcjogdG9rZW5Mb2NhdGlvbihcIj0+XCIsIGVudHJ5LmtleS5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgZW50cnkudmFsdWUubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgICBlbnRyaWVzOiBzZW1hbnRpY0VudHJpZXMsXG4gICAgICAgIGtpbmQ6IGNvbGxlY3Rpb25LaW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIlxuICAgICAgICAgID8gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiT3JkZXJlZE1hcExpdGVyYWxcIilcbiAgICAgICAgICA6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIk1hcExpdGVyYWxcIiksXG4gICAgICAgIGxvY2F0aW9uXG4gICAgICB9LCB7bGl0ZXJhbDogbG9jYXRpb259KVxuICAgIH1cblxuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImVtcHR5IGFycmF5IHdpdGhvdXQgYSBsaXN0IG9yIG1hcCB0eXBlXCIsIGxvY2F0aW9uKVxuICB9XG5cbiAgaWYgKG5vZGUua2luZCA9PSBcIm5ld1wiKSB7XG4gICAgY29uc3QgY29uc3RydWN0aW9uID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5ld30gKi8gKG5vZGUpXG4gICAgY29uc3QgbmFtZSA9IGNvbnN0cnVjdGlvbi53aGF0LmtpbmQgPT0gXCJuYW1lXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTmFtZX0gKi8gKGNvbnN0cnVjdGlvbi53aGF0KSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKCFuYW1lIHx8IG5hbWUucmVzb2x1dGlvbiAhPSBcInVxblwiIHx8IHR5cGVvZiBuYW1lLm5hbWUgIT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZHluYW1pYyBvciBxdWFsaWZpZWQgcmVjb3JkIGNvbnN0cnVjdGlvblwiLCBub2RlTG9jYXRpb24oY29uc3RydWN0aW9uLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IGNvbnRleHQucmVjb3JkTmFtZXMuZ2V0KG5hbWUubmFtZSlcblxuICAgIGlmICghZGVjbGFyYXRpb24pIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImNvbnN0cnVjdGlvbiBvZiBhbiB1bmtub3duIG5vbWluYWwgY2xhc3NcIiwgbm9kZUxvY2F0aW9uKGNvbnN0cnVjdGlvbi53aGF0LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICBpZiAoZGVjbGFyYXRpb24ua2luZCA9PSBcIkludGVyZmFjZURlY2xhcmF0aW9uXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImNvbnN0cnVjdGlvbiBvZiBhbiBpbnRlcmZhY2VcIiwgbm9kZUxvY2F0aW9uKGNvbnN0cnVjdGlvbi53aGF0LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gICAgaWYgKGRlY2xhcmF0aW9uLmtpbmQgPT0gXCJDbGFzc0RlY2xhcmF0aW9uXCIpIHtcbiAgICAgIGNvbnN0IHVuc3VwcG9ydGVkQXJndW1lbnQgPSBjb25zdHJ1Y3Rpb24uYXJndW1lbnRzLmZpbmQoKGFyZ3VtZW50KSA9PlxuICAgICAgICBhcmd1bWVudC5raW5kID09IFwibmFtZWRhcmd1bWVudFwiIHx8IGFyZ3VtZW50LmtpbmQgPT0gXCJ2YXJpYWRpY1wiIHx8IFJlZmxlY3QuZ2V0KGFyZ3VtZW50LCBcImJ5cmVmXCIpID09PSB0cnVlKVxuXG4gICAgICBpZiAodW5zdXBwb3J0ZWRBcmd1bWVudCkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibm9uLXBvc2l0aW9uYWwgcmVmZXJlbmNlIGNvbnN0cnVjdG9yIGFyZ3VtZW50XCIsXG4gICAgICAgIG5vZGVMb2NhdGlvbih1bnN1cHBvcnRlZEFyZ3VtZW50LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICAgIGNvbnN0IGNsYXNzTG9jYXRpb24gPSBub2RlTG9jYXRpb24oY29uc3RydWN0aW9uLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHthcmd1bWVudHM6IGNvbnN0cnVjdGlvbi5hcmd1bWVudHMubWFwKChhcmd1bWVudCwgaW5kZXgpID0+XG4gICAgICAgIGNvbnZlcnRFeHByZXNzaW9uKGFyZ3VtZW50LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCBkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzW2luZGV4XT8udHlwZSkpLFxuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUmVmZXJlbmNlQ29uc3RydWN0aW9uXCIpLCBsb2NhdGlvbixcbiAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlVHlwZSgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgY2xhc3NMb2NhdGlvbil9LCB7Y2xhc3M6IGNsYXNzTG9jYXRpb259KVxuICAgIH1cbiAgICBpZiAoZGVjbGFyYXRpb24ua2luZCA9PSBcIkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb25cIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwib3duZWQgcmVzb3VyY2UgY29uc3RydWN0aW9uXCIsIG5vZGVMb2NhdGlvbihjb25zdHJ1Y3Rpb24sIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICBjb25zdCBjb250ZXh0dWFsVHlwZUFyZ3VtZW50cyA9IGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIlJlY29yZFR5cGVcIiAmJiBleHBlY3RlZFR5cGUuZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbi5pZFxuICAgICAgPyBleHBlY3RlZFR5cGUuYXJndW1lbnRzXG4gICAgICA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IHZpc2libGVUeXBlUGFyYW1ldGVySWRzID0gbmV3IFNldChbLi4uY29udGV4dC50eXBlUGFyYW1ldGVycz8udmFsdWVzKCkgPz8gW11dXG4gICAgICAubWFwKChwYXJhbWV0ZXIpID0+IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFyYW1ldGVyLmlkKSkpXG4gICAgY29uc3QgdHlwZUFyZ3VtZW50cyA9IGNvbnRleHR1YWxUeXBlQXJndW1lbnRzICYmXG4gICAgICAhY29udGV4dHVhbFR5cGVBcmd1bWVudHMuc29tZSgoYXJndW1lbnQpID0+IHR5cGVDb250YWluc0FueVZhcmlhYmxlKGFyZ3VtZW50LCB2aXNpYmxlVHlwZVBhcmFtZXRlcklkcykpXG4gICAgICA/IGNvbnRleHR1YWxUeXBlQXJndW1lbnRzXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgYXJndW1lbnRzOiBjb25zdHJ1Y3Rpb24uYXJndW1lbnRzLm1hcCgoYXJndW1lbnQsIGluZGV4KSA9PlxuICAgICAgICBjb252ZXJ0RXhwcmVzc2lvbihhcmd1bWVudCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCxcbiAgICAgICAgICBpbnN0YW50aWF0ZWRSZWNvcmRGaWVsZFR5cGUoZGVjbGFyYXRpb24sIHR5cGVBcmd1bWVudHMsIGluZGV4KSkpLFxuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUmVjb3JkQ29uc3RydWN0aW9uXCIpLFxuICAgICAgbG9jYXRpb24sXG4gICAgICByZWNvcmQ6IHJlY29yZFR5cGUoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIG5vZGVMb2NhdGlvbihjb25zdHJ1Y3Rpb24ud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICAgIHR5cGVBcmd1bWVudHMpXG4gICAgfSwge3JlY29yZDogbm9kZUxvY2F0aW9uKGNvbnN0cnVjdGlvbi53aGF0LCBmaWxlbmFtZSwgc291cmNlKX0pXG4gIH1cblxuICBpZiAobm9kZS5raW5kID09IFwicHJvcGVydHlsb29rdXBcIikge1xuICAgIGNvbnN0IHJlYWQgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuUHJvcGVydHlMb29rdXB9ICovIChub2RlKVxuICAgIGNvbnN0IG9mZnNldCA9IHJlYWQub2Zmc2V0LmtpbmQgPT0gXCJpZGVudGlmaWVyXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKHJlYWQub2Zmc2V0KSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKCFvZmZzZXQgfHwgdHlwZW9mIG9mZnNldC5uYW1lICE9IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImR5bmFtaWMgb3IgY29tcHV0ZWQgbWVtYmVyIGFjY2Vzc1wiLCBub2RlTG9jYXRpb24ocmVhZC5vZmZzZXQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICBpZiAocmVhZC53aGF0LmtpbmQgPT0gXCJ2YXJpYWJsZVwiICYmIC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5WYXJpYWJsZX0gKi8gKHJlYWQud2hhdCkubmFtZSA9PSBcInRoaXNcIiAmJlxuICAgICAgY29udGV4dC5jdXJyZW50Q2xhc3MpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gY29udGV4dC5jdXJyZW50Q2xhc3MuZmllbGRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT0gb2Zmc2V0Lm5hbWUpXG5cbiAgICAgIGlmICghZmllbGQpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBgdW5rbm93biBwcml2YXRlIGZpZWxkICcke29mZnNldC5uYW1lfSdgLCBub2RlTG9jYXRpb24ob2Zmc2V0LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtmaWVsZDogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChmaWVsZC5pZCksIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlByaXZhdGVGaWVsZFJlYWRcIiksIGxvY2F0aW9uLFxuICAgICAgICByZWNlaXZlcjogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNlaXZlckV4cHJlc3Npb259ICovIChcbiAgICAgICAgICBjb252ZXJ0RXhwcmVzc2lvbihyZWFkLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpKX0sIHttZW1iZXI6IG5vZGVMb2NhdGlvbihvZmZzZXQsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgICB9XG4gICAgY29uc3QgcmVjZWl2ZXJUeXBlID0ga25vd25FeHByZXNzaW9uVHlwZShyZWFkLndoYXQsIGNvbnRleHQpXG4gICAgaWYgKHJlY2VpdmVyVHlwZT8ua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwicHJpdmF0ZSByZWZlcmVuY2UtY2xhc3MgZmllbGQgYWNjZXNzXCIsIGxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAocmVjZWl2ZXJUeXBlPy5raW5kID09IFwiSW50ZXJmYWNlVHlwZVwiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpbnRlcmZhY2UgcmVjZWl2ZXIgbWVtYmVyIGFjY2Vzc1wiLCBsb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgcmVjZWl2ZXJSZWNvcmQgPSByZWNlaXZlclR5cGU/LmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIiA/IHJlY2VpdmVyVHlwZS52YWx1ZVR5cGUgOiByZWNlaXZlclR5cGVcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHJlY2VpdmVyUmVjb3JkPy5raW5kID09IFwiUmVjb3JkVHlwZVwiID8gY29udGV4dC5yZWNvcmRzLmdldChyZWNlaXZlclJlY29yZC5kZWNsYXJhdGlvbklkKSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKChkZWNsYXJhdGlvbj8udHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCA/PyAwKSA+IDApIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImdlbmVyaWMgcmVjb3JkIHByb3BlcnR5IGFjY2Vzc1wiLCBub2RlTG9jYXRpb24ocmVhZC5vZmZzZXQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBmaWVsZDogb2Zmc2V0Lm5hbWUsXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJNZW1iZXJSZWFkXCIpLFxuICAgICAgbG9jYXRpb24sXG4gICAgICByZWNlaXZlcjogY29udmVydEV4cHJlc3Npb24ocmVhZC53aGF0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuICAgIH0sIHttZW1iZXI6IG5vZGVMb2NhdGlvbihyZWFkLm9mZnNldCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICB9XG5cbiAgaWYgKG5vZGUua2luZCA9PSBcIm9mZnNldGxvb2t1cFwiKSB7XG4gICAgY29uc3QgbG9va3VwID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk9mZnNldExvb2t1cH0gKi8gKG5vZGUpXG5cbiAgICBpZiAoIWxvb2t1cC5vZmZzZXQpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImFwcGVuZCBvciBtaXNzaW5nIGFycmF5IGluZGV4XCIsIGxvY2F0aW9uKVxuICAgIGNvbnN0IHJlY2VpdmVyID0gbG9va3VwLndoYXQua2luZCA9PSBcInZhcmlhYmxlXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVmFyaWFibGV9ICovIChsb29rdXAud2hhdCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCByZWNlaXZlclR5cGUgPSByZWNlaXZlciAmJiB0eXBlb2YgcmVjZWl2ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gY29udGV4dC5iaW5kaW5ncy5nZXQocmVjZWl2ZXIubmFtZSkgOiB1bmRlZmluZWRcbiAgICBjb25zdCBhY2Nlc3NLaW5kID0gcmVjZWl2ZXJUeXBlPy5raW5kID09IFwiTGlzdFR5cGVcIiA/IFwibGlzdFwiIDpcbiAgICAgIHJlY2VpdmVyVHlwZT8ua2luZCA9PSBcIk1hcFR5cGVcIiB8fCByZWNlaXZlclR5cGU/LmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiID8gXCJtYXBcIiA6XG4gICAgICBsb29rdXAub2Zmc2V0LmtpbmQgPT0gXCJudW1iZXJcIiA/IFwibGlzdFwiIDogbG9va3VwLm9mZnNldC5raW5kID09IFwic3RyaW5nXCIgPyBcIm1hcFwiIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoYWNjZXNzS2luZCA9PSBcImxpc3RcIiAmJiBbXCJudW1iZXJcIiwgXCJzdHJpbmdcIiwgXCJ2YXJpYWJsZVwiXS5pbmNsdWRlcyhsb29rdXAub2Zmc2V0LmtpbmQpKSB7XG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICAgIGNvbGxlY3Rpb246IGNvbnZlcnRFeHByZXNzaW9uKGxvb2t1cC53aGF0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSxcbiAgICAgICAgaW5kZXg6IGNvbnZlcnRFeHByZXNzaW9uKGxvb2t1cC5vZmZzZXQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpLFxuICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJMaXN0SW5kZXhFeHByZXNzaW9uXCIpLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgdG90YWxpdHk6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInByb3ZlblwiKVxuICAgICAgfSwge29wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiW1wiLCBsb29rdXAud2hhdC5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgbG9va3VwLm9mZnNldC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gICAgfVxuICAgIGlmIChhY2Nlc3NLaW5kID09IFwibWFwXCIgJiYgW1wibnVtYmVyXCIsIFwic3RyaW5nXCIsIFwidmFyaWFibGVcIl0uaW5jbHVkZXMobG9va3VwLm9mZnNldC5raW5kKSkge1xuICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgICBjb2xsZWN0aW9uOiBjb252ZXJ0RXhwcmVzc2lvbihsb29rdXAud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCksXG4gICAgICAgIGtleTogY29udmVydEV4cHJlc3Npb24obG9va3VwLm9mZnNldCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCksXG4gICAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIk1hcExvb2t1cEV4cHJlc3Npb25cIiksXG4gICAgICAgIGxvY2F0aW9uLFxuICAgICAgICB0b3RhbGl0eTogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwicHJvdmVuXCIpXG4gICAgICB9LCB7b3BlcmF0b3I6IHRva2VuTG9jYXRpb24oXCJbXCIsIGxvb2t1cC53aGF0LmxvYz8uZW5kLm9mZnNldCA/PyAwLCBsb29rdXAub2Zmc2V0LmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25saXRlcmFsIGFycmF5IGFjY2Vzc1wiLCBub2RlTG9jYXRpb24obG9va3VwLm9mZnNldCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cblxuICBpZiAobm9kZS5raW5kID09IFwidW5hcnlcIikge1xuICAgIGNvbnN0IHVuYXJ5ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlVuYXJ5fSAqLyAobm9kZSlcblxuICAgIGlmICghW1wiIVwiLCBcIi1cIl0uaW5jbHVkZXModW5hcnkudHlwZSkpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBgdW5hcnkgJHt1bmFyeS50eXBlfWAsIGxvY2F0aW9uKVxuXG4gICAgY29uc3Qgc2VtYW50aWMgPSB3aXRoQWRhcHRlZE9wZXJhdGlvbih3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGtpbmQ6IFwiVW5hcnlFeHByZXNzaW9uXCIsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIG9wZXJhbmQ6IGNvbnZlcnRFeHByZXNzaW9uKHVuYXJ5LndoYXQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gICAgfSwge1xuICAgICAgb3BlcmF0b3I6IHRva2VuTG9jYXRpb24odW5hcnkudHlwZSwgdW5hcnkubG9jPy5zdGFydC5vZmZzZXQgPz8gMCwgdW5hcnkud2hhdC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyB1bmFyeS5sb2M/LmVuZC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICB9KSwgdW5hcnkudHlwZSA9PSBcIiFcIiA/IFwiTm90XCIgOiBcIk5lZ2F0ZVwiKVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHNlbWFudGljKSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJyZXRpZlwiKSB7XG4gICAgY29uc3QgdGVybmFyeSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5SZXRJZn0gKi8gKG5vZGUpXG5cbiAgICBpZiAoIXRlcm5hcnkudGVzdCB8fCAhdGVybmFyeS50cnVlRXhwciB8fCAhdGVybmFyeS5mYWxzZUV4cHIpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInNob3J0IHRlcm5hcnlcIiwgbG9jYXRpb24pXG4gICAgaWYgKHRlcm5hcnkudGVzdC5raW5kID09IFwidmFyaWFibGVcIikge1xuICAgICAgY29uc3QgdGVzdGVkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlZhcmlhYmxlfSAqLyAodGVybmFyeS50ZXN0KVxuXG4gICAgICBpZiAodHlwZW9mIHRlc3RlZC5uYW1lID09IFwic3RyaW5nXCIgJiYgY29udGV4dC5iaW5kaW5ncy5nZXQodGVzdGVkLm5hbWUpPy5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwib3B0aW9uYWwgdHJ1dGhpbmVzcyBjb25kaXRpb25cIiwgbm9kZUxvY2F0aW9uKHRlc3RlZCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgYWx0ZXJuYXRlOiBjb252ZXJ0RXhwcmVzc2lvbih0ZXJuYXJ5LmZhbHNlRXhwciwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCksXG4gICAgICBjb25kaXRpb246IGNvbnZlcnRFeHByZXNzaW9uKHRlcm5hcnkudGVzdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCksXG4gICAgICBjb25zZXF1ZW50OiBjb252ZXJ0RXhwcmVzc2lvbih0ZXJuYXJ5LnRydWVFeHByLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSxcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiKSxcbiAgICAgIGxvY2F0aW9uXG4gICAgfSwge1xuICAgICAgYWx0ZXJuYXRlOiB0b2tlbkxvY2F0aW9uKFwiOlwiLCB0ZXJuYXJ5LnRydWVFeHByLmxvYz8uZW5kLm9mZnNldCA/PyAwLCB0ZXJuYXJ5LmZhbHNlRXhwci5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIGNvbG9uOiB0b2tlbkxvY2F0aW9uKFwiOlwiLCB0ZXJuYXJ5LnRydWVFeHByLmxvYz8uZW5kLm9mZnNldCA/PyAwLCB0ZXJuYXJ5LmZhbHNlRXhwci5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIGNvbmRpdGlvbjogdGVybmFyeS50ZXN0LmxvYyA/IG5vZGVMb2NhdGlvbih0ZXJuYXJ5LnRlc3QsIGZpbGVuYW1lLCBzb3VyY2UpIDogbG9jYXRpb24sXG4gICAgICBjb25zZXF1ZW50OiB0ZXJuYXJ5LnRydWVFeHByLmxvYyA/IG5vZGVMb2NhdGlvbih0ZXJuYXJ5LnRydWVFeHByLCBmaWxlbmFtZSwgc291cmNlKSA6IGxvY2F0aW9uLFxuICAgICAgb3BlcmF0b3I6IHRva2VuTG9jYXRpb24oXCI/XCIsIHRlcm5hcnkudGVzdC5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgdGVybmFyeS50cnVlRXhwci5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIH0pKSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJudWxsc2FmZXByb3BlcnR5bG9va3VwXCIgfHwgbm9kZS5raW5kID09IFwibnVsbHNhZmVtZXRob2RjYWxsXCIpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJzYWZlIG5hdmlnYXRpb25cIiwgbG9jYXRpb24pXG4gIH1cblxuICBpZiAobm9kZS5raW5kID09IFwiYmluXCIpIHtcbiAgICBjb25zdCBiaW5hcnkgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQmlufSAqLyAobm9kZSlcbiAgICBpZiAoYmluYXJ5LnR5cGUgPT0gXCIhPT1cIiAmJiBiaW5hcnkubGVmdC5raW5kID09IFwidmFyaWFibGVcIiAmJiBiaW5hcnkucmlnaHQua2luZCA9PSBcIm51bGxrZXl3b3JkXCIpIHtcbiAgICAgIGNvbnN0IG9wZXJhbmQgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLklkZW50aWZpZXJFeHByZXNzaW9ufSAqLyAoXG4gICAgICAgIGNvbnZlcnRFeHByZXNzaW9uKGJpbmFyeS5sZWZ0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCB1bmRlZmluZWQsIHRydWUpXG4gICAgICApXG5cbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJPcHRpb25hbElzUHJlc2VudFwiKSwgbG9jYXRpb24sIG9wZXJhbmR9LCB7XG4gICAgICAgIG9wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKGJpbmFyeS50eXBlLCBiaW5hcnkubGVmdC5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgYmluYXJ5LnJpZ2h0LmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoW1wiPT1cIiwgXCIhPVwiXS5pbmNsdWRlcyhiaW5hcnkudHlwZSkpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBgY29lcmNpdmUgZXF1YWxpdHkgJHtiaW5hcnkudHlwZX1gLCBsb2NhdGlvbilcbiAgICBpZiAoW1wiYW5kXCIsIFwib3JcIl0uaW5jbHVkZXMoYmluYXJ5LnR5cGUpKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYHByZWNlZGVuY2Utc2Vuc2l0aXZlIGJvb2xlYW4gJHtiaW5hcnkudHlwZX1gLCBsb2NhdGlvbilcbiAgICBpZiAoIXBocEJpbmFyeU9wZXJhdGlvbnMuaGFzKGJpbmFyeS50eXBlKSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGBiaW5hcnkgJHtiaW5hcnkudHlwZX1gLCBsb2NhdGlvbilcblxuICAgIGNvbnN0IHNlbWFudGljID0gd2l0aEFkYXB0ZWRPcGVyYXRpb24oe1xuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiQmluYXJ5RXhwcmVzc2lvblwiKSxcbiAgICAgIGxlZnQ6IGNvbnZlcnRFeHByZXNzaW9uKGJpbmFyeS5sZWZ0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSxcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgcmlnaHQ6IGNvbnZlcnRFeHByZXNzaW9uKGJpbmFyeS5yaWdodCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgICB9LCAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL29wZXJhdG9ycy5qc1wiKS5BZGFwdGVkT3BlcmF0aW9ufSAqLyAocGhwQmluYXJ5T3BlcmF0aW9ucy5nZXQoYmluYXJ5LnR5cGUpKSlcblxuICAgIHJldHVybiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh3aXRoUGFyc2VyUmFuZ2VzKHNlbWFudGljLCB7XG4gICAgICBvcGVyYXRvcjogdG9rZW5Mb2NhdGlvbihiaW5hcnkudHlwZSwgYmluYXJ5LmxlZnQubG9jPy5lbmQub2Zmc2V0ID8/IDAsIGJpbmFyeS5yaWdodC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIH0pKSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJjYWxsXCIpIHtcbiAgICBjb25zdCBjYWxsID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkNhbGx9ICovIChub2RlKVxuXG4gICAgaWYgKGNhbGwud2hhdC5raW5kID09IFwicHJvcGVydHlsb29rdXBcIikge1xuICAgICAgY29uc3QgbG9va3VwID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlByb3BlcnR5TG9va3VwfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoY2FsbC53aGF0KSlcbiAgICAgIGNvbnN0IG1lbWJlciA9IGxvb2t1cC5vZmZzZXQua2luZCA9PSBcImlkZW50aWZpZXJcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAobG9va3VwLm9mZnNldCkgOiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHJlY2VpdmVyVHlwZSA9IGtub3duRXhwcmVzc2lvblR5cGUobG9va3VwLndoYXQsIGNvbnRleHQpXG5cbiAgICAgIGlmIChtZW1iZXIgJiYgdHlwZW9mIG1lbWJlci5uYW1lID09IFwic3RyaW5nXCIgJiYgKHJlY2VpdmVyVHlwZT8ua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIiB8fCByZWNlaXZlclR5cGU/LmtpbmQgPT0gXCJJbnRlcmZhY2VUeXBlXCIpKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IHJlY2VpdmVyVHlwZS5raW5kID09IFwiUmVmZXJlbmNlVHlwZVwiXG4gICAgICAgICAgPyBjb250ZXh0LmNsYXNzZXMuZ2V0KHJlY2VpdmVyVHlwZS5kZWNsYXJhdGlvbklkKT8ubWV0aG9kcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09IG1lbWJlci5uYW1lKVxuICAgICAgICAgIDogY29udGV4dC5pbnRlcmZhY2VzLmdldChyZWNlaXZlclR5cGUuZGVjbGFyYXRpb25JZCk/Lm1ldGhvZHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PSBtZW1iZXIubmFtZSlcbiAgICAgICAgY29uc3QgdW5zdXBwb3J0ZWRBcmd1bWVudCA9IGNhbGwuYXJndW1lbnRzLmZpbmQoKGFyZ3VtZW50KSA9PlxuICAgICAgICAgIGFyZ3VtZW50LmtpbmQgPT0gXCJuYW1lZGFyZ3VtZW50XCIgfHwgYXJndW1lbnQua2luZCA9PSBcInZhcmlhZGljXCIgfHwgUmVmbGVjdC5nZXQoYXJndW1lbnQsIFwiYnlyZWZcIikgPT09IHRydWUpXG5cbiAgICAgICAgaWYgKHVuc3VwcG9ydGVkQXJndW1lbnQpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm5vbi1wb3NpdGlvbmFsIG1ldGhvZCBhcmd1bWVudFwiLFxuICAgICAgICAgIG5vZGVMb2NhdGlvbih1bnN1cHBvcnRlZEFyZ3VtZW50LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2FyZ3VtZW50czogY2FsbC5hcmd1bWVudHMubWFwKChhcmd1bWVudCwgaW5kZXgpID0+XG4gICAgICAgICAgY29udmVydEV4cHJlc3Npb24oYXJndW1lbnQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsIG1ldGhvZD8ucGFyYW1ldGVyc1tpbmRleF0/LnR5cGUpKSxcbiAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIiksIGxvY2F0aW9uLCBtZXRob2Q6IG1ldGhvZD8uaWQgPz8gbWVtYmVyLm5hbWUsXG4gICAgICAgIHJlY2VpdmVyOiBjb252ZXJ0RXhwcmVzc2lvbihsb29rdXAud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCl9LCB7bWVtYmVyOiBub2RlTG9jYXRpb24obWVtYmVyLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNhbGwud2hhdC5raW5kID09IFwicHJvcGVydHlsb29rdXBcIiAmJiBjYWxsLmFyZ3VtZW50cy5sZW5ndGggPT0gMCkge1xuICAgICAgY29uc3QgbG9va3VwID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlByb3BlcnR5TG9va3VwfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoY2FsbC53aGF0KSlcbiAgICAgIGNvbnN0IHJlY2VpdmVyID0gbG9va3VwLndoYXQua2luZCA9PSBcInZhcmlhYmxlXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVmFyaWFibGV9ICovIChsb29rdXAud2hhdCkgOiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IG1lbWJlciA9IGxvb2t1cC5vZmZzZXQua2luZCA9PSBcImlkZW50aWZpZXJcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAobG9va3VwLm9mZnNldCkgOiB1bmRlZmluZWRcblxuICAgICAgaWYgKHJlY2VpdmVyICYmIHR5cGVvZiByZWNlaXZlci5uYW1lID09IFwic3RyaW5nXCIgJiYgbWVtYmVyPy5uYW1lID09IFwiZ2V0TWVzc2FnZVwiICYmIGNvbnRleHQuYmluZGluZ3MuZ2V0KHJlY2VpdmVyLm5hbWUpPy5raW5kID09IFwiRXJyb3JUeXBlXCIpIHtcbiAgICAgICAgY29uc3QgcmVjZWl2ZXJMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihyZWNlaXZlciwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICAgICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiRXJyb3JNZXNzYWdlUmVhZFwiKSxcbiAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICByZWNlaXZlcjogd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiksIGxvY2F0aW9uOiByZWNlaXZlckxvY2F0aW9uLCBuYW1lOiByZWNlaXZlci5uYW1lfSwge1xuICAgICAgICAgICAgbmFtZTogcmVjZWl2ZXJMb2NhdGlvblxuICAgICAgICAgIH0pXG4gICAgICAgIH0sIHttZW1iZXI6IG5vZGVMb2NhdGlvbihtZW1iZXIsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgICAgIH1cbiAgICAgIGlmIChtZW1iZXIgJiYgdHlwZW9mIG1lbWJlci5uYW1lID09IFwic3RyaW5nXCIgJiYga25vd25HZW5lcmljUmVjb3JkQWNjZXNzb3JUeXBlKGxvb2t1cCwgY29udGV4dCkpIHtcbiAgICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgICAgIGZpZWxkOiBtZW1iZXIubmFtZSxcbiAgICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJNZW1iZXJSZWFkXCIpLFxuICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgIHJlY2VpdmVyOiBjb252ZXJ0RXhwcmVzc2lvbihsb29rdXAud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgICAgICAgfSwge21lbWJlcjogbm9kZUxvY2F0aW9uKG1lbWJlciwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjYWxsLndoYXQua2luZCA9PSBcIm5hbWVcIiAmJiBjYWxsLndoYXQubmFtZSA9PSBcImNvdW50XCIgJiYgY2FsbC5hcmd1bWVudHMubGVuZ3RoID09IDEpIHtcbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgICAgY29sbGVjdGlvbjogY29udmVydEV4cHJlc3Npb24oY2FsbC5hcmd1bWVudHNbMF0sIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpLFxuICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJDb2xsZWN0aW9uU2l6ZUV4cHJlc3Npb25cIiksXG4gICAgICAgIGxvY2F0aW9uXG4gICAgICB9LCB7b3BlcmF0b3I6IG5vZGVMb2NhdGlvbihjYWxsLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgICB9XG5cbiAgICBpZiAoY2FsbC53aGF0LmtpbmQgIT0gXCJuYW1lXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImR5bmFtaWMgY2FsbFwiLCBsb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgY2FsbGVkTmFtZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5OYW1lfSAqLyAoY2FsbC53aGF0KVxuXG4gICAgaWYgKGNhbGxlZE5hbWUucmVzb2x1dGlvbiAhPSBcInVxblwiIHx8IGNhbGxlZE5hbWUubmFtZS5pbmNsdWRlcyhcIlxcXFxcIikpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInF1YWxpZmllZCBjYWxsXCIsIG5vZGVMb2NhdGlvbihjYWxsLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICBjb25zdCB1bnN1cHBvcnRlZEFyZ3VtZW50ID0gY2FsbC5hcmd1bWVudHMuZmluZCgoYXJndW1lbnQpID0+XG4gICAgICBhcmd1bWVudC5raW5kID09IFwibmFtZWRhcmd1bWVudFwiIHx8IGFyZ3VtZW50LmtpbmQgPT0gXCJ2YXJpYWRpY1wiIHx8IFJlZmxlY3QuZ2V0KGFyZ3VtZW50LCBcImJ5cmVmXCIpID09PSB0cnVlKVxuXG4gICAgaWYgKHVuc3VwcG9ydGVkQXJndW1lbnQpIHtcbiAgICAgIGNvbnN0IGRldGFpbCA9IHVuc3VwcG9ydGVkQXJndW1lbnQua2luZCA9PSBcIm5hbWVkYXJndW1lbnRcIiA/IFwibmFtZWQgYXJndW1lbnRcIiA6XG4gICAgICAgIHVuc3VwcG9ydGVkQXJndW1lbnQua2luZCA9PSBcInZhcmlhZGljXCIgPyBcInVucGFja2VkIGFyZ3VtZW50XCIgOiBcImJ5LXJlZmVyZW5jZSBhcmd1bWVudFwiXG5cbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBkZXRhaWwsIG5vZGVMb2NhdGlvbih1bnN1cHBvcnRlZEFyZ3VtZW50LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG5cbiAgICBjb25zdCBjYWxsZWUgPSBjYWxsZWROYW1lLm5hbWVcblxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGNvbnRleHQuZnVuY3Rpb25zLmdldChjYWxsZWUpXG4gICAgY29uc3Qga25vd25Bcmd1bWVudHMgPSBjYWxsLmFyZ3VtZW50cy5tYXAoKGFyZ3VtZW50KSA9PiBrbm93bkNhbGxBcmd1bWVudFR5cGUoYXJndW1lbnQsIGNvbnRleHQpKVxuICAgIGNvbnN0IHBhcmFtZXRlclR5cGVzID0gc2lnbmF0dXJlID8ga25vd25DYWxsUGFyYW1ldGVyVHlwZXMoc2lnbmF0dXJlLCBrbm93bkFyZ3VtZW50cykgOiB1bmRlZmluZWRcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGFyZ3VtZW50czogY2FsbC5hcmd1bWVudHMubWFwKChhcmd1bWVudCwgaW5kZXgpID0+XG4gICAgICAgIGNvbnZlcnRFeHByZXNzaW9uKGFyZ3VtZW50LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LFxuICAgICAgICAgIHBhcmFtZXRlclR5cGVzPy5baW5kZXhdID8/IHNpZ25hdHVyZT8ucGFyYW1ldGVyc1tpbmRleF0/LnR5cGUsXG4gICAgICAgICAgcHJlc2VydmVzR2VuZXJpY09wdGlvbmFsRXZpZGVuY2Uoc2lnbmF0dXJlLCBpbmRleCkpKSxcbiAgICAgIGNhbGxlZSxcbiAgICAgIGtpbmQ6IFwiQ2FsbEV4cHJlc3Npb25cIixcbiAgICAgIGxvY2F0aW9uXG4gICAgfSwge2NhbGxlZTogbm9kZUxvY2F0aW9uKGNhbGwud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICB9XG5cbiAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIG5vZGUua2luZCwgbG9jYXRpb24pXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25seSByZXN1bHQgdHlwZXMgZXN0YWJsaXNoZWQgYnkgZXhwbGljaXQgc2lnbmF0dXJlcyBhbmQgYmluZGluZ3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuRXhwcmVzc2lvbn0gbm9kZSAtIFBhcnNlci1vd25lZCBleHByZXNzaW9uLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZSB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yVHlwZSB8IHVuZGVmaW5lZH0gS25vd24gcmVzdWx0IHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGtub3duRXhwcmVzc2lvblR5cGUobm9kZSwgY29udGV4dCkge1xuICBpZiAobm9kZS5raW5kID09IFwidmFyaWFibGVcIikge1xuICAgIGNvbnN0IHZhcmlhYmxlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlZhcmlhYmxlfSAqLyAobm9kZSlcblxuICAgIGlmICh2YXJpYWJsZS5uYW1lID09IFwidGhpc1wiICYmIGNvbnRleHQuY3VycmVudENsYXNzPy5pZCkge1xuICAgICAgcmV0dXJuIHtkZWNsYXJhdGlvbklkOiBjb250ZXh0LmN1cnJlbnRDbGFzcy5pZCwga2luZDogXCJSZWZlcmVuY2VUeXBlXCJ9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFyaWFibGUubmFtZSA9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udGV4dC5iaW5kaW5ncy5nZXQodmFyaWFibGUubmFtZSlcbiAgfVxuICBpZiAobm9kZS5raW5kID09IFwiY2FsbFwiKSB7XG4gICAgY29uc3QgY2FsbCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5DYWxsfSAqLyAobm9kZSlcbiAgICBjb25zdCBuYW1lID0gY2FsbC53aGF0LmtpbmQgPT0gXCJuYW1lXCIgJiYgdHlwZW9mIGNhbGwud2hhdC5uYW1lID09IFwic3RyaW5nXCIgPyBjYWxsLndoYXQubmFtZSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGNvbnRleHQuZnVuY3Rpb25zLmdldChuYW1lKVxuXG4gICAgICBpZiAoc2lnbmF0dXJlKSByZXR1cm4ga25vd25DYWxsUmV0dXJuVHlwZShzaWduYXR1cmUsIGNhbGwuYXJndW1lbnRzLm1hcCgoYXJndW1lbnQpID0+IGtub3duRXhwcmVzc2lvblR5cGUoYXJndW1lbnQsIGNvbnRleHQpKSlcbiAgICB9XG4gICAgaWYgKGNhbGwud2hhdC5raW5kID09IFwicHJvcGVydHlsb29rdXBcIiAmJiBjYWxsLmFyZ3VtZW50cy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIGtub3duR2VuZXJpY1JlY29yZEFjY2Vzc29yVHlwZShcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlByb3BlcnR5TG9va3VwfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoY2FsbC53aGF0KSksIGNvbnRleHQpXG4gICAgfVxuICAgIGlmIChjYWxsLndoYXQua2luZCA9PSBcInByb3BlcnR5bG9va3VwXCIpIHtcbiAgICAgIGNvbnN0IGxvb2t1cCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Qcm9wZXJ0eUxvb2t1cH0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGNhbGwud2hhdCkpXG4gICAgICBjb25zdCByZWNlaXZlciA9IGtub3duRXhwcmVzc2lvblR5cGUobG9va3VwLndoYXQsIGNvbnRleHQpXG4gICAgICBjb25zdCBtZW1iZXIgPSBsb29rdXAub2Zmc2V0LmtpbmQgPT0gXCJpZGVudGlmaWVyXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKGxvb2t1cC5vZmZzZXQpIDogdW5kZWZpbmVkXG5cbiAgICAgIGlmIChyZWNlaXZlcj8ua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIiAmJiBtZW1iZXIgJiYgdHlwZW9mIG1lbWJlci5uYW1lID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuY2xhc3Nlcy5nZXQocmVjZWl2ZXIuZGVjbGFyYXRpb25JZCk/Lm1ldGhvZHMuZmluZCgobWV0aG9kKSA9PiBtZXRob2QubmFtZSA9PSBtZW1iZXIubmFtZSk/LnJldHVyblR5cGVcbiAgICAgIH1cbiAgICAgIGlmIChyZWNlaXZlcj8ua2luZCA9PSBcIkludGVyZmFjZVR5cGVcIiAmJiBtZW1iZXIgJiYgdHlwZW9mIG1lbWJlci5uYW1lID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuaW50ZXJmYWNlcy5nZXQocmVjZWl2ZXIuZGVjbGFyYXRpb25JZCk/Lm1ldGhvZHMuZmluZCgobWV0aG9kKSA9PiBtZXRob2QubmFtZSA9PSBtZW1iZXIubmFtZSk/LnJldHVyblR5cGVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKG5vZGUua2luZCA9PSBcIm9mZnNldGxvb2t1cFwiKSB7XG4gICAgY29uc3QgbG9va3VwID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk9mZnNldExvb2t1cH0gKi8gKG5vZGUpXG4gICAgY29uc3QgY29sbGVjdGlvblR5cGUgPSBrbm93bkV4cHJlc3Npb25UeXBlKGxvb2t1cC53aGF0LCBjb250ZXh0KVxuXG4gICAgaWYgKGNvbGxlY3Rpb25UeXBlPy5raW5kID09IFwiTGlzdFR5cGVcIikgcmV0dXJuIGNvbGxlY3Rpb25UeXBlLmVsZW1lbnRUeXBlXG4gICAgaWYgKGNvbGxlY3Rpb25UeXBlPy5raW5kID09IFwiTWFwVHlwZVwiIHx8IGNvbGxlY3Rpb25UeXBlPy5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIikgcmV0dXJuIGNvbGxlY3Rpb25UeXBlLnZhbHVlVHlwZVxuICB9XG4gIGlmIChub2RlLmtpbmQgPT0gXCJuZXdcIikge1xuICAgIGNvbnN0IGNvbnN0cnVjdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5OZXd9ICovIChub2RlKVxuICAgIGNvbnN0IG5hbWUgPSBjb25zdHJ1Y3Rpb24ud2hhdC5raW5kID09IFwibmFtZVwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5hbWV9ICovIChjb25zdHJ1Y3Rpb24ud2hhdCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IG5hbWUgJiYgdHlwZW9mIG5hbWUubmFtZSA9PSBcInN0cmluZ1wiID8gY29udGV4dC5yZWNvcmROYW1lcy5nZXQobmFtZS5uYW1lKSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKGRlY2xhcmF0aW9uPy5pZCkgcmV0dXJuIGRlY2xhcmF0aW9uLmtpbmQgPT0gXCJDbGFzc0RlY2xhcmF0aW9uXCJcbiAgICAgID8ge2RlY2xhcmF0aW9uSWQ6IGRlY2xhcmF0aW9uLmlkLCBraW5kOiBcIlJlZmVyZW5jZVR5cGVcIn1cbiAgICAgIDogZGVjbGFyYXRpb24ua2luZCA9PSBcIkludGVyZmFjZURlY2xhcmF0aW9uXCJcbiAgICAgICAgPyB7ZGVjbGFyYXRpb25JZDogZGVjbGFyYXRpb24uaWQsIGtpbmQ6IFwiSW50ZXJmYWNlVHlwZVwifVxuICAgICAgICA6IHtkZWNsYXJhdGlvbklkOiBkZWNsYXJhdGlvbi5pZCwga2luZDogXCJSZWNvcmRUeXBlXCJ9XG4gIH1cbiAgaWYgKG5vZGUua2luZCA9PSBcInByb3BlcnR5bG9va3VwXCIpIHtcbiAgICBjb25zdCByZWFkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlByb3BlcnR5TG9va3VwfSAqLyAobm9kZSlcbiAgICBjb25zdCByZWNlaXZlciA9IGtub3duRXhwcmVzc2lvblR5cGUocmVhZC53aGF0LCBjb250ZXh0KVxuXG4gICAgaWYgKHJlYWQud2hhdC5raW5kID09IFwidmFyaWFibGVcIiAmJiAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVmFyaWFibGV9ICovIChyZWFkLndoYXQpLm5hbWUgPT0gXCJ0aGlzXCIgJiZcbiAgICAgIGNvbnRleHQuY3VycmVudENsYXNzKSB7XG4gICAgICBjb25zdCBvZmZzZXQgPSByZWFkLm9mZnNldC5raW5kID09IFwiaWRlbnRpZmllclwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklkZW50aWZpZXJ9ICovIChyZWFkLm9mZnNldCkgOiB1bmRlZmluZWRcblxuICAgICAgcmV0dXJuIGNvbnRleHQuY3VycmVudENsYXNzLmZpZWxkcy5maW5kKChmaWVsZCkgPT4gZmllbGQubmFtZSA9PSBvZmZzZXQ/Lm5hbWUpPy50eXBlXG4gICAgfVxuXG4gICAgaWYgKHJlY2VpdmVyPy5raW5kICE9IFwiUmVjb3JkVHlwZVwiKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSBjb250ZXh0LnJlY29yZHMuZ2V0KHJlY2VpdmVyLmRlY2xhcmF0aW9uSWQpXG4gICAgY29uc3Qgb2Zmc2V0ID0gcmVhZC5vZmZzZXQua2luZCA9PSBcImlkZW50aWZpZXJcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAocmVhZC5vZmZzZXQpIDogdW5kZWZpbmVkXG5cbiAgICBjb25zdCBtZW1iZXJOYW1lID0gb2Zmc2V0ICYmIHR5cGVvZiBvZmZzZXQubmFtZSA9PSBcInN0cmluZ1wiID8gb2Zmc2V0Lm5hbWUgOiB1bmRlZmluZWRcblxuICAgIGlmIChtZW1iZXJOYW1lICYmIGRlY2xhcmF0aW9uKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGRlY2xhcmF0aW9uLmZpZWxkcy5maW5kSW5kZXgoKGZpZWxkKSA9PiBmaWVsZC5uYW1lID09IG1lbWJlck5hbWUpXG5cbiAgICAgIHJldHVybiBpbnN0YW50aWF0ZWRSZWNvcmRGaWVsZFR5cGUoZGVjbGFyYXRpb24sIHJlY2VpdmVyLmFyZ3VtZW50cywgaW5kZXgpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIFJlc29sdmVzIGV4YWN0IHBhcnNlci1rbm93biBhcmd1bWVudCBldmlkZW5jZSB3aXRob3V0IGNoYW5naW5nIHRoZSBlc3RhYmxpc2hlZFxuICogZXhwcmVzc2lvbi1yZXN1bHQgY2xhc3NpZmllciB1c2VkIGZvciBvcHRpb25hbCBjb252ZXJzaW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkV4cHJlc3Npb259IG5vZGUgLSBQYXJzZXItb3duZWQgY2FsbCBhcmd1bWVudC5cbiAqIEBwYXJhbSB7UGhwQ29udmVyc2lvbkNvbnRleHR9IGNvbnRleHQgLSBUeXBlZCBjb252ZXJzaW9uIGNvbnRleHQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGUgfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvclR5cGUgfCB1bmRlZmluZWR9IEtub3duIGFyZ3VtZW50IHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGtub3duQ2FsbEFyZ3VtZW50VHlwZShub2RlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGtub3duID0ga25vd25FeHByZXNzaW9uVHlwZShub2RlLCBjb250ZXh0KVxuXG4gIGlmIChrbm93bikgcmV0dXJuIGtub3duXG4gIGlmIChub2RlLmtpbmQgPT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcihOdW1iZXIoLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk51bWJlcn0gKi8gKG5vZGUpLnZhbHVlKSkpIHtcbiAgICByZXR1cm4gc2NhbGFyVHlwZShcImludGVnZXJcIilcbiAgfVxuICBpZiAobm9kZS5raW5kID09IFwiYm9vbGVhblwiICYmIHR5cGVvZiAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQm9vbGVhbn0gKi8gKG5vZGUpLnZhbHVlID09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIHNjYWxhclR5cGUoXCJib29sZWFuXCIpXG4gIH1cbiAgaWYgKG5vZGUua2luZCA9PSBcInN0cmluZ1wiICYmIHR5cGVvZiAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuU3RyaW5nfSAqLyAobm9kZSkudmFsdWUgPT0gXCJzdHJpbmdcIiAmJlxuICAgIGhhc09ubHlVbmljb2RlU2NhbGFycygvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuU3RyaW5nfSAqLyAobm9kZSkudmFsdWUpKSB7XG4gICAgcmV0dXJuIHNjYWxhclR5cGUoXCJzdHJpbmdcIilcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBQSFAncyBleGFjdCB6ZXJvLWFyZ3VtZW50IGFjY2Vzc29yIGNhcnJpZXIgYWdhaW5zdCBpdHMgcmVjZWl2ZXInc1xuICogZ2VuZXJpYyByZWNvcmQgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuUHJvcGVydHlMb29rdXB9IGxvb2t1cCAtIFBhcnNlci1vd25lZCBtZXRob2QgbG9va3VwLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZSB8IHVuZGVmaW5lZH0gSW5zdGFudGlhdGVkIGZpZWxkIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGtub3duR2VuZXJpY1JlY29yZEFjY2Vzc29yVHlwZShsb29rdXAsIGNvbnRleHQpIHtcbiAgY29uc3QgcmVjZWl2ZXIgPSBrbm93bkV4cHJlc3Npb25UeXBlKGxvb2t1cC53aGF0LCBjb250ZXh0KVxuICBjb25zdCByZWNlaXZlclJlY29yZCA9IHJlY2VpdmVyPy5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIgPyByZWNlaXZlci52YWx1ZVR5cGUgOiByZWNlaXZlclxuXG4gIGlmIChyZWNlaXZlclJlY29yZD8ua2luZCAhPSBcIlJlY29yZFR5cGVcIikgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBkZWNsYXJhdGlvbiA9IGNvbnRleHQucmVjb3Jkcy5nZXQocmVjZWl2ZXJSZWNvcmQuZGVjbGFyYXRpb25JZClcbiAgY29uc3QgbWVtYmVyID0gbG9va3VwLm9mZnNldC5raW5kID09IFwiaWRlbnRpZmllclwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklkZW50aWZpZXJ9ICovIChsb29rdXAub2Zmc2V0KSA6IHVuZGVmaW5lZFxuICBjb25zdCBpbmRleCA9IG1lbWJlciAmJiB0eXBlb2YgbWVtYmVyLm5hbWUgPT0gXCJzdHJpbmdcIlxuICAgID8gZGVjbGFyYXRpb24/LmZpZWxkcy5maW5kSW5kZXgoKGZpZWxkKSA9PiBmaWVsZC5uYW1lID09IG1lbWJlci5uYW1lKSA/PyAtMVxuICAgIDogLTFcblxuICBpZiAoIWRlY2xhcmF0aW9uIHx8IChkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycz8ubGVuZ3RoID8/IDApID09IDAgfHwgaW5kZXggPCAwKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIGluc3RhbnRpYXRlZFJlY29yZEZpZWxkVHlwZShkZWNsYXJhdGlvbiwgcmVjZWl2ZXJSZWNvcmQuYXJndW1lbnRzLCBpbmRleClcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBvbmUgZXhwbGljaXQgUEhQIHJldHVybi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Ob2RlfSBub2RlIC0gUEhQIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZXR1cm5TdGF0ZW1lbnR9IFNlbWFudGljIHJldHVybi5cbiAqL1xuZnVuY3Rpb24gY29udmVydFJldHVybihub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKG5vZGUua2luZCAhPSBcInJldHVyblwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgbm9kZS5raW5kLCBsb2NhdGlvbilcblxuICBjb25zdCByZXR1cm5Ob2RlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlJldHVybn0gKi8gKG5vZGUpXG4gIGNvbnN0IGV4cGVjdGVkVHlwZSA9IGNvbnRleHQucmV0dXJuVHlwZT8ua2luZCA9PSBcIlR5cGVSZWZlcmVuY2VcIiAmJiBjb250ZXh0LnJldHVyblR5cGUubmFtZSA9PSBcInZvaWRcIlxuICAgID8gdW5kZWZpbmVkXG4gICAgOiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlIHwgdW5kZWZpbmVkfSAqLyAoY29udGV4dC5yZXR1cm5UeXBlKVxuXG4gIHJldHVybiB7XG4gICAgLi4uKHJldHVybk5vZGUuZXhwciA/IHtleHByZXNzaW9uOiBjb252ZXJ0RXhwcmVzc2lvbihyZXR1cm5Ob2RlLmV4cHIsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsIGV4cGVjdGVkVHlwZSl9IDoge30pLFxuICAgIGtpbmQ6IFwiUmV0dXJuU3RhdGVtZW50XCIsXG4gICAgbG9jYXRpb25cbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIG9uZSBleGFjdCBQSFAgbG9jYWwgYEB2YXJgIGNhcnJpZXIgYW5kIGltbXV0YWJpbGl0eSBtYXJrZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZX0gbm9kZSAtIEFzc2lnbm1lbnQtb3duaW5nIHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jYWwgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JbnRlcmZhY2VEZWNsYXJhdGlvbj59IHJlY29yZE5hbWVzIC0gTm9taW5hbCBkZWNsYXJhdGlvbnMgYnkgc291cmNlIG5hbWUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlR5cGVQYXJhbWV0ZXI+fSBbdHlwZVBhcmFtZXRlcnNdIC0gRGVjbGFyYXRpb24tc2NvcGVkIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyB7e2ltbXV0YWJsZTogYm9vbGVhbiwgdHlwZTogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9IHwgdW5kZWZpbmVkfSBNZXRhZGF0YSB3aGVuIHByZXNlbnQuXG4gKi9cbmZ1bmN0aW9uIGxvY2FsTWV0YWRhdGEobm9kZSwgbmFtZSwgZmlsZW5hbWUsIHNvdXJjZSwgcmVjb3JkTmFtZXMsIHR5cGVQYXJhbWV0ZXJzID0gbmV3IE1hcCgpKSB7XG4gIGNvbnN0IGNvbW1lbnRzID0gbm9kZS5sZWFkaW5nQ29tbWVudHMgPz8gW11cbiAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRzLmF0KC0xKVxuXG4gIGlmICghY29tbWVudCB8fCBjb21tZW50LmtpbmQgIT0gXCJjb21tZW50YmxvY2tcIiB8fCAhY29tbWVudC5sb2MgfHwgIW5vZGUubG9jKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3QgZ2FwID0gc291cmNlLnNsaWNlKGNvbW1lbnQubG9jLmVuZC5vZmZzZXQsIG5vZGUubG9jLnN0YXJ0Lm9mZnNldClcblxuICBpZiAoIS9eXFxzKiQvdS50ZXN0KGdhcCkgfHwgKGdhcC5tYXRjaCgvXFxuL2d1KT8ubGVuZ3RoID8/IDApID4gMSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IGJsb2NrID0gcGFyc2VDb21tZW50KGNvbW1lbnQudmFsdWUpWzBdXG4gIGNvbnN0IHRhZ3MgPSBibG9jaz8udGFncyA/PyBbXVxuICBjb25zdCB2YXJpYWJsZXMgPSB0YWdzLmZpbHRlcigodGFnKSA9PiB0YWcudGFnID09IFwidmFyXCIpXG4gIGNvbnN0IGltbXV0YWJsZSA9IHRhZ3MuZmlsdGVyKCh0YWcpID0+IHRhZy50YWcgPT0gXCJzZW1hbnRpZm9sZC1pbW11dGFibGVcIilcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAodmFyaWFibGVzLmxlbmd0aCA9PSAwICYmIGltbXV0YWJsZS5sZW5ndGggPT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IGV4YWN0VmFyaWFibGUgPSB2YXJpYWJsZXMubGVuZ3RoID09IDEgJiYgdmFyaWFibGVzWzBdLnR5cGUgPT0gXCJcIiAmJiB2YXJpYWJsZXNbMF0uZGVzY3JpcHRpb24gPT0gYCQke25hbWV9YFxuICBjb25zdCBleGFjdEltbXV0YWJsZSA9IGltbXV0YWJsZS5sZW5ndGggPD0gMSAmJiBpbW11dGFibGUuZXZlcnkoKHRhZykgPT4gdGFnLm5hbWUgPT0gXCJcIiAmJiB0YWcudHlwZSA9PSBcIlwiICYmIHRhZy5kZXNjcmlwdGlvbiA9PSBcIlwiKVxuICBjb25zdCBrbm93blRhZ3MgPSB0YWdzLmV2ZXJ5KCh0YWcpID0+IHRhZy50YWcgPT0gXCJ2YXJcIiB8fCB0YWcudGFnID09IFwic2VtYW50aWZvbGQtaW1tdXRhYmxlXCIpXG5cbiAgaWYgKCFleGFjdFZhcmlhYmxlIHx8ICFleGFjdEltbXV0YWJsZSB8fCAha25vd25UYWdzKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibWFsZm9ybWVkIGxvY2FsIHR5cGUgbWV0YWRhdGFcIiwgbG9jYXRpb24pXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGltbXV0YWJsZTogaW1tdXRhYmxlLmxlbmd0aCA9PSAxLFxuICAgIHR5cGU6IGRvY3VtZW50ZWRWYWx1ZVR5cGUoe1xuICAgICAgbGFuZ3VhZ2U6IFwicGhwXCIsXG4gICAgICBsb2NhdGlvbjogY29tbWVudFRhZ0xvY2F0aW9uKGNvbW1lbnQsIHZhcmlhYmxlc1swXSwgXCJuYW1lXCIsIGZpbGVuYW1lLCBzb3VyY2UpLFxuICAgICAgb3duZXJMb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICByZWNvcmRzOiByZWNvcmROYW1lcyxcbiAgICAgIHNvdXJjZSxcbiAgICAgIHNvdXJjZVR5cGU6IHZhcmlhYmxlc1swXS5uYW1lLFxuICAgICAgc3ViamVjdDogYExvY2FsICcke25hbWV9J2AsXG4gICAgICB0eXBlUGFyYW1ldGVyc1xuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBvbmUgUEhQIGxvY2FsIGRlY2xhcmF0aW9uIG9yIGFzc2lnbm1lbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZX0gbm9kZSAtIFBIUCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Mb2NhbFN0YXRlbWVudCB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50fSBTZW1hbnRpYyBsb2NhbCBvciBwcml2YXRlLWZpZWxkIHN0YXRlbWVudC5cbiAqL1xuZnVuY3Rpb24gY29udmVydExvY2FsU3RhdGVtZW50KG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAobm9kZS5raW5kICE9IFwiZXhwcmVzc2lvbnN0YXRlbWVudFwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgbm9kZS5raW5kLCBsb2NhdGlvbilcblxuICBjb25zdCBleHByZXNzaW9uID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkV4cHJlc3Npb25TdGF0ZW1lbnR9ICovIChub2RlKS5leHByZXNzaW9uXG5cbiAgaWYgKGV4cHJlc3Npb24ua2luZCAhPSBcImFzc2lnblwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgZXhwcmVzc2lvbi5raW5kLCBub2RlTG9jYXRpb24oZXhwcmVzc2lvbiwgZmlsZW5hbWUsIHNvdXJjZSkpXG5cbiAgY29uc3QgYXNzaWdubWVudCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Bc3NpZ259ICovIChleHByZXNzaW9uKVxuXG4gIGlmIChhc3NpZ25tZW50Lm9wZXJhdG9yICE9IFwiPVwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYGFzc2lnbm1lbnQgJHthc3NpZ25tZW50Lm9wZXJhdG9yfWAsIGxvY2F0aW9uKVxuICBpZiAoYXNzaWdubWVudC5sZWZ0LmtpbmQgPT0gXCJwcm9wZXJ0eWxvb2t1cFwiICYmIGNvbnRleHQuY3VycmVudENsYXNzKSB7XG4gICAgY29uc3QgbG9va3VwID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlByb3BlcnR5TG9va3VwfSAqLyAoYXNzaWdubWVudC5sZWZ0KVxuICAgIGNvbnN0IHJlY2VpdmVyID0gbG9va3VwLndoYXQua2luZCA9PSBcInZhcmlhYmxlXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVmFyaWFibGV9ICovIChsb29rdXAud2hhdCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCBtZW1iZXIgPSBsb29rdXAub2Zmc2V0LmtpbmQgPT0gXCJpZGVudGlmaWVyXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKGxvb2t1cC5vZmZzZXQpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgZmllbGQgPSByZWNlaXZlcj8ubmFtZSA9PSBcInRoaXNcIiAmJiBtZW1iZXIgJiYgdHlwZW9mIG1lbWJlci5uYW1lID09IFwic3RyaW5nXCJcbiAgICAgID8gY29udGV4dC5jdXJyZW50Q2xhc3MuZmllbGRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT0gbWVtYmVyLm5hbWUpXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKCFmaWVsZCkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwicHJpdmF0ZSBmaWVsZCB3cml0ZSBvdXRzaWRlIHRoZSBkZWNsYXJpbmcgcmVjZWl2ZXJcIiwgbm9kZUxvY2F0aW9uKGFzc2lnbm1lbnQubGVmdCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2V4cHJlc3Npb246IGNvbnZlcnRFeHByZXNzaW9uKGFzc2lnbm1lbnQucmlnaHQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsIGZpZWxkLnR5cGUpLFxuICAgICAgZmllbGQ6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZmllbGQuaWQpLCBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwiKSwgbG9jYXRpb24sXG4gICAgICByZWNlaXZlcjogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNlaXZlckV4cHJlc3Npb259ICovIChcbiAgICAgICAgY29udmVydEV4cHJlc3Npb24obG9va3VwLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpKX0sXG4gICAge21lbWJlcjogbm9kZUxvY2F0aW9uKC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAobWVtYmVyKSwgZmlsZW5hbWUsIHNvdXJjZSksIG9wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiPVwiLCBhc3NpZ25tZW50LmxlZnQubG9jPy5lbmQub2Zmc2V0ID8/IDAsXG4gICAgICBhc3NpZ25tZW50LnJpZ2h0LmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgfVxuICBpZiAoYXNzaWdubWVudC5sZWZ0LmtpbmQgIT0gXCJ2YXJpYWJsZVwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYXNzaWdubWVudC5sZWZ0LmtpbmQsIG5vZGVMb2NhdGlvbihhc3NpZ25tZW50LmxlZnQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICBpZiAoYXNzaWdubWVudC5yaWdodC5raW5kID09IFwidGhyb3dcIikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInRocm93IGV4cHJlc3Npb24gaW4gYSB2YWx1ZSBjb250ZXh0XCIsIG5vZGVMb2NhdGlvbihhc3NpZ25tZW50LnJpZ2h0LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuXG4gIGNvbnN0IHZhcmlhYmxlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlZhcmlhYmxlfSAqLyAoYXNzaWdubWVudC5sZWZ0KVxuICBjb25zdCB0YXJnZXRMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbih2YXJpYWJsZSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAodHlwZW9mIHZhcmlhYmxlLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCB2YXJpYWJsZS5jdXJseSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZHluYW1pYyB2YXJpYWJsZVwiLCB0YXJnZXRMb2NhdGlvbilcblxuICBjb25zdCBtZXRhZGF0YSA9IGxvY2FsTWV0YWRhdGEobm9kZSwgdmFyaWFibGUubmFtZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dC5yZWNvcmROYW1lcywgY29udGV4dC50eXBlUGFyYW1ldGVycylcblxuICBpZiAobWV0YWRhdGEpIHtcbiAgICBsZXQgZGVjbGFyZWRUeXBlID0gbWV0YWRhdGEudHlwZVxuICAgIGxldCBvcmRlcmVkID0gZmFsc2VcblxuICAgIGlmIChkZWNsYXJlZFR5cGUua2luZCA9PSBcIk1hcFR5cGVcIiAmJiBjb250ZXh0Lm9yZGVyZWRNYXBEZWNsYXJhdGlvbnM/Lmhhcyhhc3NpZ25tZW50KSAmJiBhc3NpZ25tZW50LnJpZ2h0LmtpbmQgPT0gXCJhcnJheVwiKSB7XG4gICAgICBkZWNsYXJlZFR5cGUgPSBvcmRlcmVkTWFwVHlwZUZyb21NYXAoZGVjbGFyZWRUeXBlLCBsb2NhdGlvbilcbiAgICAgIG9yZGVyZWQgPSB0cnVlXG4gICAgfVxuICAgIGNvbnN0IGluaXRpYWxpemVyID0gY29udmVydEV4cHJlc3Npb24oYXNzaWdubWVudC5yaWdodCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCwgZGVjbGFyZWRUeXBlKVxuXG4gICAgY29udGV4dC5iaW5kaW5ncy5zZXQodmFyaWFibGUubmFtZSwgZGVjbGFyZWRUeXBlKVxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGluaXRpYWxpemVyLFxuICAgICAga2luZDogXCJMb2NhbERlY2xhcmF0aW9uXCIsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIG11dGFibGU6IG9yZGVyZWQgPyBmYWxzZSA6ICFtZXRhZGF0YS5pbW11dGFibGUsXG4gICAgICBuYW1lOiB2YXJpYWJsZS5uYW1lLFxuICAgICAgdHlwZTogZGVjbGFyZWRUeXBlXG4gICAgfSwge1xuICAgICAgbmFtZTogdGFyZ2V0TG9jYXRpb24sXG4gICAgICBvcGVyYXRvcjogdG9rZW5Mb2NhdGlvbihcIj1cIiwgYXNzaWdubWVudC5sZWZ0LmxvYz8uZW5kLm9mZnNldCA/PyAwLCBhc3NpZ25tZW50LnJpZ2h0LmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGluZmVycmVkVHlwZSA9IGtub3duRXhwcmVzc2lvblR5cGUoYXNzaWdubWVudC5yaWdodCwgY29udGV4dClcblxuICBpZiAoaW5mZXJyZWRUeXBlPy5raW5kID09IFwiUmVjb3JkVHlwZVwiIHx8IGluZmVycmVkVHlwZT8ua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIiB8fFxuICAgIGluZmVycmVkVHlwZT8ua2luZCA9PSBcIkludGVyZmFjZVR5cGVcIiB8fCBpbmZlcnJlZFR5cGU/LmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiKSB7XG4gICAgY29uc3QgaW5pdGlhbGl6ZXIgPSBjb252ZXJ0RXhwcmVzc2lvbihhc3NpZ25tZW50LnJpZ2h0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCBpbmZlcnJlZFR5cGUpXG5cbiAgICBjb250ZXh0LmJpbmRpbmdzLnNldCh2YXJpYWJsZS5uYW1lLCBpbmZlcnJlZFR5cGUpXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgaW5pdGlhbGl6ZXIsXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJMb2NhbERlY2xhcmF0aW9uXCIpLFxuICAgICAgbG9jYXRpb24sXG4gICAgICBtdXRhYmxlOiBmYWxzZSxcbiAgICAgIG5hbWU6IHZhcmlhYmxlLm5hbWUsXG4gICAgICB0eXBlOiBpbmZlcnJlZFR5cGVcbiAgICB9LCB7XG4gICAgICBuYW1lOiB0YXJnZXRMb2NhdGlvbixcbiAgICAgIG9wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiPVwiLCBhc3NpZ25tZW50LmxlZnQubG9jPy5lbmQub2Zmc2V0ID8/IDAsIGFzc2lnbm1lbnQucmlnaHQubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgYmluZGluZ1R5cGUgPSBjb250ZXh0LmJpbmRpbmdzLmdldCh2YXJpYWJsZS5uYW1lKVxuXG4gIGlmICghYmluZGluZ1R5cGUpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgTG9jYWwgJyR7dmFyaWFibGUubmFtZX0nYCwgbG9jYXRpb24pXG5cbiAgY29uc3QgdGFyZ2V0ID0gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiksIGxvY2F0aW9uOiB0YXJnZXRMb2NhdGlvbiwgbmFtZTogdmFyaWFibGUubmFtZX0sIHtcbiAgICBuYW1lOiB0YXJnZXRMb2NhdGlvblxuICB9KVxuICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRFeHByZXNzaW9uKGFzc2lnbm1lbnQucmlnaHQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsXG4gICAgYmluZGluZ1R5cGUua2luZCA9PSBcIkVycm9yVHlwZVwiID8gdW5kZWZpbmVkIDogYmluZGluZ1R5cGUpXG5cbiAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIGV4cHJlc3Npb246IHZhbHVlLFxuICAgIGtpbmQ6IFwiQXNzaWdubWVudFN0YXRlbWVudFwiLFxuICAgIGxvY2F0aW9uLFxuICAgIHRhcmdldFxuICB9LCB7XG4gICAgb3BlcmF0b3I6IHRva2VuTG9jYXRpb24oXCI9XCIsIGFzc2lnbm1lbnQubGVmdC5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgYXNzaWdubWVudC5yaWdodC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKVxuICB9KVxufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBleGhhdXN0aXZlIFBIUCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZX0gbm9kZSAtIFBIUCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IFNlbWFudGljIHN0YXRlbWVudC5cbiAqL1xuZnVuY3Rpb24gY29udmVydFN0YXRlbWVudChub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIGlmIChub2RlLmtpbmQgPT0gXCJyZXR1cm5cIikgcmV0dXJuIGNvbnZlcnRSZXR1cm4obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgaWYgKG5vZGUua2luZCA9PSBcImlmXCIpIHJldHVybiBjb252ZXJ0SWYoLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklmfSAqLyAobm9kZSksIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gIGlmIChub2RlLmtpbmQgPT0gXCJ0aHJvd1wiKSByZXR1cm4gY29udmVydFBocFJhaXNlKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gIGlmIChub2RlLmtpbmQgPT0gXCJ0cnlcIikgcmV0dXJuIGNvbnZlcnRQaHBUcnkobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgaWYgKG5vZGUua2luZCA9PSBcIndoaWxlXCIpIHJldHVybiBjb252ZXJ0V2hpbGUoLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLldoaWxlfSAqLyAobm9kZSksIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gIGlmIChub2RlLmtpbmQgPT0gXCJmb3JlYWNoXCIpIHJldHVybiBjb252ZXJ0Rm9yRWFjaCgvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRm9yZWFjaH0gKi8gKG5vZGUpLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuICBpZiAobm9kZS5raW5kID09IFwiYnJlYWtcIiB8fCBub2RlLmtpbmQgPT0gXCJjb250aW51ZVwiKSB7XG4gICAgY29uc3QgY29udHJvbCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5CcmVhayB8IGltcG9ydChcInBocC1wYXJzZXJcIikuQ29udGludWV9ICovIChub2RlKVxuXG4gICAgaWYgKGNvbnRyb2wubGV2ZWwpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBgJHtub2RlLmtpbmR9IGxldmVsYCwgbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIGNvbnN0IGxvY2F0aW9uID0gdG9rZW5Mb2NhdGlvbihub2RlLmtpbmQsIG5vZGUubG9jPy5zdGFydC5vZmZzZXQgPz8gMCwgbm9kZS5sb2M/LmVuZC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7XCJCcmVha1N0YXRlbWVudFwiIHwgXCJDb250aW51ZVN0YXRlbWVudFwifSAqLyAobm9kZS5raW5kID09IFwiYnJlYWtcIiA/IFwiQnJlYWtTdGF0ZW1lbnRcIiA6IFwiQ29udGludWVTdGF0ZW1lbnRcIiksXG4gICAgICBsb2NhdGlvblxuICAgIH0sIHtrZXl3b3JkOiBsb2NhdGlvbn0pXG4gIH1cbiAgaWYgKG5vZGUua2luZCA9PSBcImVjaG9cIikgcmV0dXJuIGNvbnZlcnRQcmludCgvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRWNob30gKi8gKG5vZGUpLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuICBpZiAobm9kZS5raW5kID09IFwiZXhwcmVzc2lvbnN0YXRlbWVudFwiKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5FeHByZXNzaW9uU3RhdGVtZW50fSAqLyAobm9kZSkuZXhwcmVzc2lvblxuXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcImNhbGxcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhwcmVzc2lvbjogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DYWxsRXhwcmVzc2lvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLk1ldGhvZENhbGxFeHByZXNzaW9ufSAqLyAoXG4gICAgICAgICAgY29udmVydEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgICAgICAgKSxcbiAgICAgICAga2luZDogXCJFeHByZXNzaW9uU3RhdGVtZW50XCIsXG4gICAgICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29udmVydExvY2FsU3RhdGVtZW50KG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gIH1cblxuICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgbm9kZS5raW5kLCBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG59XG5cbi8qKlxuICogQ29udmVydHMgZXhhY3QgYHRocm93IG5ldyBEZWNsYXJlZEVycm9yKG1lc3NhZ2UpYC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Ob2RlfSBub2RlIC0gUEhQIHRocm93IG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGxleGljYWwgY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SYWlzZVN0YXRlbWVudCB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJldGhyb3dTdGF0ZW1lbnR9IFNlbWFudGljIHJhaXNlIG9yIHJldGhyb3cuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRQaHBSYWlzZShub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGNvbnN0cnVjdGlvbiA9IFJlZmxlY3QuZ2V0KG5vZGUsIFwid2hhdFwiKVxuXG4gIGlmIChjb25zdHJ1Y3Rpb24/LmtpbmQgPT0gXCJ2YXJpYWJsZVwiICYmIHR5cGVvZiBjb25zdHJ1Y3Rpb24ubmFtZSA9PSBcInN0cmluZ1wiICYmICFjb25zdHJ1Y3Rpb24uY3VybHkgJiZcbiAgICBjb250ZXh0LmJpbmRpbmdzLmdldChjb25zdHJ1Y3Rpb24ubmFtZSk/LmtpbmQgPT0gXCJFcnJvclR5cGVcIiAmJiBjb250ZXh0LmNhdGNoQmluZGluZ05hbWVzPy5oYXMoY29uc3RydWN0aW9uLm5hbWUpKSB7XG4gICAgY29uc3QgYmluZGluZ05vZGUgPSBjb250ZXh0LmNhdGNoQmluZGluZ05vZGVzPy5nZXQoY29uc3RydWN0aW9uLm5hbWUpXG5cbiAgICBpZiAoIWJpbmRpbmdOb2RlKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJ0aHJvdyBvZiBhIGNhdGNoIGJpbmRpbmcgd2l0aG91dCBhbiBleGFjdCBoYW5kbGVyIGJpbmRpbmdcIiwgbG9jYXRpb24pXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgYmluZGluZzogY29uc3RydWN0aW9uLm5hbWUsXG4gICAgICBiaW5kaW5nTm9kZSxcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlJldGhyb3dTdGF0ZW1lbnRcIiksXG4gICAgICBsb2NhdGlvblxuICAgIH0sIHtrZXl3b3JkOiB0b2tlbkxvY2F0aW9uKFwidGhyb3dcIiwgbm9kZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCBjb25zdHJ1Y3Rpb24ubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICB9XG4gIGlmICghY29uc3RydWN0aW9uIHx8IGNvbnN0cnVjdGlvbi5raW5kICE9IFwibmV3XCIgfHwgY29uc3RydWN0aW9uLndoYXQ/LmtpbmQgIT0gXCJuYW1lXCIgfHxcbiAgICBjb25zdHJ1Y3Rpb24ud2hhdC5yZXNvbHV0aW9uICE9IFwidXFuXCIgfHwgIWNvbnRleHQuZXJyb3JOYW1lcy5oYXMoY29uc3RydWN0aW9uLndoYXQubmFtZSkgfHxcbiAgICAhQXJyYXkuaXNBcnJheShjb25zdHJ1Y3Rpb24uYXJndW1lbnRzKSB8fCBjb25zdHJ1Y3Rpb24uYXJndW1lbnRzLmxlbmd0aCAhPSAxIHx8XG4gICAgY29uc3RydWN0aW9uLmFyZ3VtZW50c1swXS5raW5kID09IFwibmFtZWRhcmd1bWVudFwiIHx8IGNvbnN0cnVjdGlvbi5hcmd1bWVudHNbMF0ua2luZCA9PSBcInZhcmlhZGljXCIpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJ0aHJvdyBvdGhlciB0aGFuIGV4YWN0IGRlY2xhcmVkIGVycm9yIGNvbnN0cnVjdGlvblwiLCBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBkZWNsYXJhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbn0gKi8gKGNvbnRleHQuZXJyb3JOYW1lcy5nZXQoY29uc3RydWN0aW9uLndoYXQubmFtZSkpXG4gIGNvbnN0IHR5cGVMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihjb25zdHJ1Y3Rpb24ud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgZXJyb3I6IHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgZXJyb3I6IHdpdGhQYXJzZXJSYW5nZXMoe2RlY2xhcmF0aW9uSWQ6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJFcnJvclR5cGVcIil9LCB7dHlwZTogdHlwZUxvY2F0aW9ufSksXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJFcnJvckNvbnN0cnVjdGlvblwiKSxcbiAgICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24oY29uc3RydWN0aW9uLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIG1lc3NhZ2U6IGNvbnZlcnRFeHByZXNzaW9uKGNvbnN0cnVjdGlvbi5hcmd1bWVudHNbMF0sIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gICAgfSwge3R5cGU6IHR5cGVMb2NhdGlvbn0pLFxuICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlJhaXNlU3RhdGVtZW50XCIpLFxuICAgIGxvY2F0aW9uXG4gIH0sIHtrZXl3b3JkOiB0b2tlbkxvY2F0aW9uKFwidGhyb3dcIiwgbm9kZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCBjb25zdHJ1Y3Rpb24ubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBleGFjdCB0eXBlZCBjYXRjaCB3aXRoIG5vIGZpbmFsbHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZX0gbm9kZSAtIFBIUCB0cnkgbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge1BocENvbnZlcnNpb25Db250ZXh0fSBjb250ZXh0IC0gVHlwZWQgbGV4aWNhbCBjb250ZXh0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlRyeVN0YXRlbWVudH0gU2VtYW50aWMgZXhhY3QgaGFuZGxlci5cbiAqL1xuZnVuY3Rpb24gY29udmVydFBocFRyeShub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGNhdGNoZXMgPSBSZWZsZWN0LmdldChub2RlLCBcImNhdGNoZXNcIilcbiAgY29uc3QgYm9keSA9IFJlZmxlY3QuZ2V0KG5vZGUsIFwiYm9keVwiKVxuICBjb25zdCBhbHdheXMgPSBSZWZsZWN0LmdldChub2RlLCBcImFsd2F5c1wiKVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShjYXRjaGVzKSB8fCAoY2F0Y2hlcy5sZW5ndGggPT0gMCAmJiAhYWx3YXlzKSB8fCBib2R5Py5raW5kICE9IFwiYmxvY2tcIikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInRyeSB3aXRob3V0IHR5cGVkIGNhdGNoZXMgb3IgZmluYWxseVwiLCBsb2NhdGlvbilcbiAgfVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNhdGNoSGFuZGxlcltdfSAqL1xuICBjb25zdCBoYW5kbGVycyA9IFtdXG4gIGNvbnN0IHNlZW5IYW5kbGVyTmFtZXMgPSBuZXcgU2V0KGNvbnRleHQuY2F0Y2hCaW5kaW5nTmFtZXMgPz8gW10pXG5cbiAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGNhdGNoZXMpIHtcbiAgICBjb25zdCBjYXVnaHQgPSBoYW5kbGVyLndoYXQ/LlswXVxuICAgIGNvbnN0IGJpbmRpbmcgPSBoYW5kbGVyLnZhcmlhYmxlXG5cbiAgICBpZiAoaGFuZGxlci53aGF0Py5sZW5ndGggIT0gMSB8fCBjYXVnaHQ/LmtpbmQgIT0gXCJuYW1lXCIgfHwgY2F1Z2h0LnJlc29sdXRpb24gIT0gXCJ1cW5cIiB8fFxuICAgICAgIWNvbnRleHQuZXJyb3JOYW1lcy5oYXMoY2F1Z2h0Lm5hbWUpIHx8IGJpbmRpbmc/LmtpbmQgIT0gXCJ2YXJpYWJsZVwiIHx8IHR5cGVvZiBiaW5kaW5nLm5hbWUgIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgYmluZGluZy5jdXJseSB8fCBoYW5kbGVyLmJvZHk/LmtpbmQgIT0gXCJibG9ja1wiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJicm9hZCwgbXVsdGlwbGUsIG9yIG1hbGZvcm1lZCBjYXRjaFwiLCBub2RlTG9jYXRpb24oaGFuZGxlciwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIGlmIChzZWVuSGFuZGxlck5hbWVzLmhhcyhiaW5kaW5nLm5hbWUpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYGNhdGNoIGJpbmRpbmcgJyR7YmluZGluZy5uYW1lfScgc2hhZG93cyBhbiBvdXRlciBoYW5kbGVyIGJpbmRpbmdgLCBub2RlTG9jYXRpb24oYmluZGluZywgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIHNlZW5IYW5kbGVyTmFtZXMuYWRkKGJpbmRpbmcubmFtZSlcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbn0gKi8gKGNvbnRleHQuZXJyb3JOYW1lcy5nZXQoY2F1Z2h0Lm5hbWUpKVxuICAgIGNvbnN0IGNhdWdodExvY2F0aW9uID0gbm9kZUxvY2F0aW9uKGNhdWdodCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICBjb25zdCBjYXRjaFR5cGUgPSB3aXRoUGFyc2VyUmFuZ2VzKHtkZWNsYXJhdGlvbklkOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiRXJyb3JUeXBlXCIpfSwge1xuICAgICAgdHlwZTogY2F1Z2h0TG9jYXRpb25cbiAgICB9KVxuICAgIGNvbnN0IGNhdGNoQ29udGV4dCA9IHsuLi5jb250ZXh0LCBiaW5kaW5nczogbmV3IE1hcChjb250ZXh0LmJpbmRpbmdzKSwgY2F0Y2hCaW5kaW5nTmFtZXM6IG5ldyBTZXQoc2VlbkhhbmRsZXJOYW1lcyksXG4gICAgICBjYXRjaEJpbmRpbmdOb2RlczogbmV3IE1hcChjb250ZXh0LmNhdGNoQmluZGluZ05vZGVzKX1cblxuICAgIGNhdGNoQ29udGV4dC5iaW5kaW5ncy5zZXQoYmluZGluZy5uYW1lLCBjYXRjaFR5cGUpXG4gICAgY29uc3QgY2F0Y2hCaW5kaW5nTm9kZSA9IHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiQ2F0Y2hCaW5kaW5nXCIpLFxuICAgICAgbG9jYXRpb246IG5vZGVMb2NhdGlvbihiaW5kaW5nLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIG11dGFibGU6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChmYWxzZSksXG4gICAgICBuYW1lOiBiaW5kaW5nLm5hbWUsXG4gICAgICB0eXBlOiBjYXRjaFR5cGVcbiAgICB9LCB7bmFtZTogbm9kZUxvY2F0aW9uKGJpbmRpbmcsIGZpbGVuYW1lLCBzb3VyY2UpfSlcblxuICAgIGNhdGNoQ29udGV4dC5jYXRjaEJpbmRpbmdOb2Rlcy5zZXQoYmluZGluZy5uYW1lLCBjYXRjaEJpbmRpbmdOb2RlKVxuICAgIGhhbmRsZXJzLnB1c2god2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBjYXRjaEJpbmRpbmc6IGNhdGNoQmluZGluZ05vZGUsXG4gICAgICBjYXRjaEJvZHk6IGNvbnZlcnRCbG9jayhoYW5kbGVyLmJvZHksIGZpbGVuYW1lLCBzb3VyY2UsIGNhdGNoQ29udGV4dCksXG4gICAgICBjYXRjaFR5cGUsXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJDYXRjaEhhbmRsZXJcIiksXG4gICAgICBsb2NhdGlvbjogbm9kZUxvY2F0aW9uKGhhbmRsZXIsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgfSwge2NhdGNoOiBub2RlTG9jYXRpb24oaGFuZGxlciwgZmlsZW5hbWUsIHNvdXJjZSl9KSlcbiAgfVxuICBjb25zdCBib2R5Q29udGV4dCA9IHsuLi5jb250ZXh0LCBiaW5kaW5nczogbmV3IE1hcChjb250ZXh0LmJpbmRpbmdzKX1cbiAgY29uc3Qgc2VtYW50aWMgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlRyeVN0YXRlbWVudH0gKi8gKHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIGJvZHk6IGNvbnZlcnRCbG9jayhib2R5LCBmaWxlbmFtZSwgc291cmNlLCBib2R5Q29udGV4dCksXG4gICAgaGFuZGxlcnMsXG4gICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiVHJ5U3RhdGVtZW50XCIpLFxuICAgIGxvY2F0aW9uXG4gIH0sIHt0cnk6IHRva2VuTG9jYXRpb24oXCJ0cnlcIiwgbm9kZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCBib2R5LmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpfSkpXG5cbiAgaWYgKGFsd2F5cykge1xuICAgIGlmIChhbHdheXMua2luZCAhPSBcImJsb2NrXCIpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm1hbGZvcm1lZCBmaW5hbGx5IGJsb2NrXCIsIG5vZGVMb2NhdGlvbihhbHdheXMsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIHNlbWFudGljLmZpbmFsbHlCb2R5ID0gY29udmVydEJsb2NrKGFsd2F5cywgZmlsZW5hbWUsIHNvdXJjZSwgYm9keUNvbnRleHQpXG4gICAgc2V0UGFyc2VyUmFuZ2VzKHNlbWFudGljLCB7ZmluYWxseTogbm9kZUxvY2F0aW9uKGFsd2F5cywgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICB0cnk6IHRva2VuTG9jYXRpb24oXCJ0cnlcIiwgbm9kZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCBib2R5LmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgfVxuICByZXR1cm4gc2VtYW50aWNcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBleGFjdCBibG9jay1mb3JtIFBIUCBgZm9yZWFjaCAoJGxpc3QgYXMgJHZhbHVlKWAuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuRm9yZWFjaH0gbm9kZSAtIFBIUCBmb3JlYWNoIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Gb3JFYWNoU3RhdGVtZW50IHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRm9yRWFjaE1hcFN0YXRlbWVudH0gU2VtYW50aWMgbG9vcC5cbiAqL1xuZnVuY3Rpb24gY29udmVydEZvckVhY2gobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIGlmIChub2RlLnNob3J0Rm9ybSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiYWx0ZXJuYXRpdmUgZm9yZWFjaCBzeW50YXhcIiwgbG9jYXRpb24pXG4gIGlmIChub2RlLnZhbHVlLmtpbmQgIT0gXCJ2YXJpYWJsZVwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJmb3JlYWNoIGRlc3RydWN0dXJpbmdcIiwgbm9kZUxvY2F0aW9uKG5vZGUudmFsdWUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICBjb25zdCB2YXJpYWJsZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5WYXJpYWJsZX0gKi8gKG5vZGUudmFsdWUpXG5cbiAgaWYgKFJlZmxlY3QuZ2V0KHZhcmlhYmxlLCBcImJ5cmVmXCIpID09PSB0cnVlKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJieS1yZWZlcmVuY2UgZm9yZWFjaFwiLCBub2RlTG9jYXRpb24odmFyaWFibGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICBpZiAodHlwZW9mIHZhcmlhYmxlLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCB2YXJpYWJsZS5jdXJseSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZHluYW1pYyBmb3JlYWNoIGJpbmRpbmdcIiwgbm9kZUxvY2F0aW9uKHZhcmlhYmxlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgaWYgKCFub2RlLmJvZHkgfHwgbm9kZS5ib2R5LmtpbmQgIT0gXCJibG9ja1wiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZm9yZWFjaCB3aXRob3V0IGJsb2NrIGJvZHlcIiwgbm9kZS5ib2R5ID8gbm9kZUxvY2F0aW9uKG5vZGUuYm9keSwgZmlsZW5hbWUsIHNvdXJjZSkgOiBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBib2R5ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJsb2NrfSAqLyAobm9kZS5ib2R5KVxuICBjb25zdCBjb2xsZWN0aW9uVHlwZSA9IGl0ZXJhdGlvbk9wZXJhbmRUeXBlKGtub3duRXhwcmVzc2lvblR5cGUobm9kZS5zb3VyY2UsIGNvbnRleHQpKVxuXG4gIGlmIChub2RlLmtleSkge1xuICAgIGlmIChub2RlLmtleS5raW5kICE9IFwidmFyaWFibGVcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZm9yZWFjaCBrZXkgYmluZGluZyBzaGFwZVwiLCBub2RlTG9jYXRpb24obm9kZS5rZXksIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIGNvbnN0IGtleVZhcmlhYmxlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlZhcmlhYmxlfSAqLyAobm9kZS5rZXkpXG5cbiAgICBpZiAoUmVmbGVjdC5nZXQoa2V5VmFyaWFibGUsIFwiYnlyZWZcIikgPT09IHRydWUgfHwgdHlwZW9mIGtleVZhcmlhYmxlLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBrZXlWYXJpYWJsZS5jdXJseSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiaW52YWxpZCBmb3JlYWNoIGtleSBiaW5kaW5nXCIsIG5vZGVMb2NhdGlvbihrZXlWYXJpYWJsZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIGlmIChjb2xsZWN0aW9uVHlwZT8ua2luZCA9PSBcIk1hcFR5cGVcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwidW5vcmRlcmVkIG1hcCBpdGVyYXRpb25cIiwgbm9kZUxvY2F0aW9uKG5vZGUuc291cmNlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gICAgaWYgKCFjb2xsZWN0aW9uVHlwZSB8fCBjb2xsZWN0aW9uVHlwZS5raW5kICE9IFwiT3JkZXJlZE1hcFR5cGVcIikge1xuICAgICAgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIFwiT3JkZXJlZCBtYXAgaXRlcmF0aW9uIGNvbGxlY3Rpb25cIiwgbm9kZUxvY2F0aW9uKG5vZGUuc291cmNlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gICAgY29uc3Qga2V5TG9jYXRpb24gPSBub2RlTG9jYXRpb24oa2V5VmFyaWFibGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgY29uc3QgdmFsdWVMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbih2YXJpYWJsZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICBjb25zdCBrZXlUeXBlID0gaXRlcmF0aW9uQmluZGluZ1R5cGUoY29sbGVjdGlvblR5cGUua2V5VHlwZSwga2V5TG9jYXRpb24pXG4gICAgY29uc3QgdmFsdWVUeXBlID0gaXRlcmF0aW9uQmluZGluZ1R5cGUoY29sbGVjdGlvblR5cGUudmFsdWVUeXBlLCB2YWx1ZUxvY2F0aW9uKVxuICAgIGNvbnN0IGtleUJpbmRpbmcgPSB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlZhbHVlQmluZGluZ1wiKSwgbG9jYXRpb246IGtleUxvY2F0aW9uLCBtdXRhYmxlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoZmFsc2UpLFxuICAgICAgbmFtZToga2V5VmFyaWFibGUubmFtZSwgdHlwZToga2V5VHlwZVxuICAgIH0sIHtuYW1lOiBrZXlMb2NhdGlvbn0pXG4gICAgY29uc3QgdmFsdWVCaW5kaW5nID0gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJWYWx1ZUJpbmRpbmdcIiksIGxvY2F0aW9uOiB2YWx1ZUxvY2F0aW9uLCBtdXRhYmxlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoZmFsc2UpLFxuICAgICAgbmFtZTogdmFyaWFibGUubmFtZSwgdHlwZTogdmFsdWVUeXBlXG4gICAgfSwge25hbWU6IHZhbHVlTG9jYXRpb259KVxuICAgIGNvbnN0IGJvZHlDb250ZXh0ID0gey4uLmNvbnRleHQsIGJpbmRpbmdzOiBuZXcgTWFwKGNvbnRleHQuYmluZGluZ3MpfVxuXG4gICAgYm9keUNvbnRleHQuYmluZGluZ3Muc2V0KGtleVZhcmlhYmxlLm5hbWUsIGtleVR5cGUpXG4gICAgYm9keUNvbnRleHQuYmluZGluZ3Muc2V0KHZhcmlhYmxlLm5hbWUsIHZhbHVlVHlwZSlcbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBib2R5OiBjb252ZXJ0QmxvY2soYm9keSwgZmlsZW5hbWUsIHNvdXJjZSwgYm9keUNvbnRleHQpLFxuICAgICAga2V5QmluZGluZyxcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIiksXG4gICAgICBsb2NhdGlvbixcbiAgICAgIG1hcDogY29udmVydEV4cHJlc3Npb24obm9kZS5zb3VyY2UsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpLFxuICAgICAgdmFsdWVCaW5kaW5nXG4gICAgfSwge29wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiZm9yZWFjaFwiLCBub2RlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIG5vZGUuc291cmNlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsXG4gICAgICBmaWxlbmFtZSwgc291cmNlKX0pXG4gIH1cblxuICBpZiAoY29sbGVjdGlvblR5cGU/LmtpbmQgPT0gXCJNYXBUeXBlXCIgfHwgY29sbGVjdGlvblR5cGU/LmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibWFwIGl0ZXJhdGlvbiB3aXRob3V0IGtleS92YWx1ZSBwYWlyIGJpbmRpbmdcIiwgbm9kZUxvY2F0aW9uKG5vZGUuc291cmNlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBpZiAoIWNvbGxlY3Rpb25UeXBlIHx8IGNvbGxlY3Rpb25UeXBlLmtpbmQgIT0gXCJMaXN0VHlwZVwiKSB7XG4gICAgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIFwiSXRlcmF0aW9uIGNvbGxlY3Rpb25cIiwgbm9kZUxvY2F0aW9uKG5vZGUuc291cmNlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBjb25zdCBiaW5kaW5nTG9jYXRpb24gPSBub2RlTG9jYXRpb24odmFyaWFibGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGluZmVycmVkVHlwZSA9IGNvbGxlY3Rpb25UeXBlLmVsZW1lbnRUeXBlXG4gIGNvbnN0IGJpbmRpbmdUeXBlID0gaXRlcmF0aW9uQmluZGluZ1R5cGUoaW5mZXJyZWRUeXBlLCBiaW5kaW5nTG9jYXRpb24pXG4gIGNvbnN0IHZhbHVlQmluZGluZyA9IHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlZhbHVlQmluZGluZ1wiKSxcbiAgICBsb2NhdGlvbjogYmluZGluZ0xvY2F0aW9uLFxuICAgIG11dGFibGU6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChmYWxzZSksXG4gICAgbmFtZTogdmFyaWFibGUubmFtZSxcbiAgICB0eXBlOiBiaW5kaW5nVHlwZVxuICB9LCB7bmFtZTogYmluZGluZ0xvY2F0aW9ufSlcbiAgY29uc3QgYm9keUNvbnRleHQgPSB7Li4uY29udGV4dCwgYmluZGluZ3M6IG5ldyBNYXAoY29udGV4dC5iaW5kaW5ncyl9XG5cbiAgYm9keUNvbnRleHQuYmluZGluZ3Muc2V0KHZhcmlhYmxlLm5hbWUsIGJpbmRpbmdUeXBlKVxuICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgYm9keTogY29udmVydEJsb2NrKGJvZHksIGZpbGVuYW1lLCBzb3VyY2UsIGJvZHlDb250ZXh0KSxcbiAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJGb3JFYWNoU3RhdGVtZW50XCIpLFxuICAgIGxpc3Q6IGNvbnZlcnRFeHByZXNzaW9uKG5vZGUuc291cmNlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSxcbiAgICBsb2NhdGlvbixcbiAgICB2YWx1ZUJpbmRpbmdcbiAgfSwge29wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiZm9yZWFjaFwiLCBub2RlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIG5vZGUuc291cmNlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvcmRlcmVkIFBIUCBibG9jayB3aXRoIGl0cyBvd24gYWRhcHRhdGlvbiBzY29wZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5CbG9ja30gbm9kZSAtIFBIUCBwYXJzZXIgYmxvY2suXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CbG9ja30gU2VtYW50aWMgYmxvY2suXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRCbG9jayhub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIHJldHVybiB7XG4gICAga2luZDogXCJCbG9ja1wiLFxuICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgc3RhdGVtZW50czogbm9kZS5jaGlsZHJlbi5tYXAoKHN0YXRlbWVudCkgPT4gY29udmVydFN0YXRlbWVudChzdGF0ZW1lbnQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpKVxuICB9XG59XG5cbi8qKlxuICogUmVxdWlyZXMgYW4gZXhhY3QgUEhQIHNjYWxhciBkZWNsYXJhdGlvbiB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGUgfCBudWxsfSBzb3VyY2VUeXBlIC0gUEhQIHR5cGUgbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdWJqZWN0IC0gVHlwZWQgc3ViamVjdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkludGVyZmFjZURlY2xhcmF0aW9uPn0gW3JlY29yZE5hbWVzXSAtIE5vbWluYWwgZGVjbGFyYXRpb25zIGJ5IHNvdXJjZSBuYW1lLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSBTZW1hbnRpYyB0eXBlLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0VHlwZShzb3VyY2VUeXBlLCBzdWJqZWN0LCBsb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSwgcmVjb3JkTmFtZXMgPSBuZXcgTWFwKCkpIHtcbiAgaWYgKCFzb3VyY2VUeXBlKSByZXR1cm4gcmVxdWlyZVNvdXJjZVNjYWxhclR5cGUoXCJwaHBcIiwgdW5kZWZpbmVkLCBzdWJqZWN0LCBsb2NhdGlvbilcbiAgaWYgKHNvdXJjZVR5cGUua2luZCAhPSBcInR5cGVyZWZlcmVuY2VcIiAmJiBzb3VyY2VUeXBlLmtpbmQgIT0gXCJuYW1lXCIgJiYgc291cmNlVHlwZS5raW5kICE9IFwiaWRlbnRpZmllclwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwidW5zdXBwb3J0ZWQgc2NhbGFyIHR5cGVcIiwgbm9kZUxvY2F0aW9uKHNvdXJjZVR5cGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG5cbiAgY29uc3QgdHlwZU5hbWUgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVHlwZVJlZmVyZW5jZSB8IGltcG9ydChcInBocC1wYXJzZXJcIikuTmFtZSB8IGltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKHNvdXJjZVR5cGUpLm5hbWVcblxuICBjb25zdCB0eXBlTG9jYXRpb24gPSBub2RlTG9jYXRpb24oc291cmNlVHlwZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgZGVjbGFyYXRpb24gPSByZWNvcmROYW1lcy5nZXQodHlwZU5hbWUpXG5cbiAgaWYgKGRlY2xhcmF0aW9uPy5pZCkgcmV0dXJuIGRlY2xhcmF0aW9uLmtpbmQgPT0gXCJDbGFzc0RlY2xhcmF0aW9uXCJcbiAgICA/IHJlZmVyZW5jZVR5cGUoZGVjbGFyYXRpb24uaWQsIHR5cGVMb2NhdGlvbilcbiAgICA6IGRlY2xhcmF0aW9uLmtpbmQgPT0gXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiXG4gICAgICA/IGludGVyZmFjZVR5cGUoZGVjbGFyYXRpb24uaWQsIHR5cGVMb2NhdGlvbilcbiAgICAgIDogZGVjbGFyYXRpb24ua2luZCA9PSBcIkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb25cIlxuICAgICAgICA/IG93bmVkUmVzb3VyY2VUeXBlKGRlY2xhcmF0aW9uLmlkLCB0eXBlTG9jYXRpb24pXG4gICAgICAgIDogcmVjb3JkVHlwZShkZWNsYXJhdGlvbi5pZCwgdHlwZUxvY2F0aW9uKVxuXG4gIHJldHVybiByZXF1aXJlU291cmNlU2NhbGFyVHlwZShcInBocFwiLCB0eXBlTmFtZSwgc3ViamVjdCwgbG9jYXRpb24sIHR5cGVMb2NhdGlvbilcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgZXhhY3QgUEhQRG9jIGNvbnRhaW5lciBzaWduYXR1cmUgYXR0YWNoZWQgdG8gb25lIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkZ1bmN0aW9ufSBub2RlIC0gRnVuY3Rpb24gZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvd25lcklkXSAtIFN0YWJsZSBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHt7cGFyYW1ldGVyczogTWFwPHN0cmluZywge2xvY2F0aW9uOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgc291cmNlVHlwZTogc3RyaW5nfT4sIHJldHVyblR5cGU6IHtsb2NhdGlvbjogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIHNvdXJjZVR5cGU6IHN0cmluZ30gfCB1bmRlZmluZWQsIHR5cGVQYXJhbWV0ZXJzPzogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuVHlwZVBhcmFtZXRlcltdfX0gRG9jdW1lbnRlZCB0eXBlcy5cbiAqL1xuZnVuY3Rpb24gZnVuY3Rpb25Eb2N1bWVudGVkVHlwZXMobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgb3duZXJJZCkge1xuICBjb25zdCBjb21tZW50ID0gbm9kZS5sZWFkaW5nQ29tbWVudHM/LmF0KC0xKVxuXG4gIGlmICghY29tbWVudCB8fCBjb21tZW50LmtpbmQgIT0gXCJjb21tZW50YmxvY2tcIiB8fCAhY29tbWVudC5sb2MgfHwgIW5vZGUubG9jIHx8XG4gICAgIS9eXFxzKiQvdS50ZXN0KHNvdXJjZS5zbGljZShjb21tZW50LmxvYy5lbmQub2Zmc2V0LCBub2RlLmxvYy5zdGFydC5vZmZzZXQpKSkgcmV0dXJuIHtwYXJhbWV0ZXJzOiBuZXcgTWFwKCksIHJldHVyblR5cGU6IHVuZGVmaW5lZH1cbiAgY29uc3QgYmxvY2sgPSBwYXJzZUNvbW1lbnQoY29tbWVudC52YWx1ZSlbMF1cbiAgY29uc3QgdGFncyA9IGJsb2NrPy50YWdzID8/IFtdXG4gIGNvbnN0IHBhcmFtZXRlclRhZ3MgPSB0YWdzLmZpbHRlcigodGFnKSA9PiB0YWcudGFnID09IFwicGFyYW1cIilcbiAgY29uc3QgcmV0dXJuVGFncyA9IHRhZ3MuZmlsdGVyKCh0YWcpID0+IHRhZy50YWcgPT0gXCJyZXR1cm5cIiB8fCB0YWcudGFnID09IFwicmV0dXJuc1wiKVxuICBjb25zdCB0ZW1wbGF0ZVRhZ3MgPSB0YWdzLmZpbHRlcigodGFnKSA9PiB0YWcudGFnID09IFwidGVtcGxhdGVcIilcbiAgY29uc3QgbWFsZm9ybWVkVGVtcGxhdGUgPSB0YWdzLmZpbmQoKHRhZykgPT4gdGFnLnRhZy5zdGFydHNXaXRoKFwidGVtcGxhdGVcIikgJiYgdGFnLnRhZyAhPSBcInRlbXBsYXRlXCIpXG4gIGNvbnN0IG1hbGZvcm1lZCA9IHRhZ3Muc29tZSgodGFnKSA9PiAhW1wicGFyYW1cIiwgXCJyZXR1cm5cIiwgXCJyZXR1cm5zXCIsIFwidGVtcGxhdGVcIl0uaW5jbHVkZXModGFnLnRhZykpIHx8IHJldHVyblRhZ3MubGVuZ3RoID4gMSB8fFxuICAgIHBhcmFtZXRlclRhZ3Muc29tZSgodGFnKSA9PiB0YWcudHlwZSAhPSBcIlwiIHx8ICEvXlxcJFtBLVphLXpfXVtBLVphLXowLTlfXSokL3UudGVzdCh0YWcuZGVzY3JpcHRpb24pKSB8fFxuICAgIHJldHVyblRhZ3Muc29tZSgodGFnKSA9PiB0YWcudHlwZSAhPSBcIlwiIHx8IHRhZy5kZXNjcmlwdGlvbiAhPSBcIlwiKSB8fCBtYWxmb3JtZWRUZW1wbGF0ZSB8fFxuICAgIHRlbXBsYXRlVGFncy5zb21lKCh0YWcpID0+ICEvXltBLVphLXpfXVtBLVphLXowLTlfXSokL3UudGVzdCh0YWcubmFtZSkgfHwgdGFnLnR5cGUgIT0gXCJcIiB8fCB0YWcuZGVzY3JpcHRpb24gIT0gXCJcIikgfHxcbiAgICB0ZW1wbGF0ZVRhZ3MubGVuZ3RoID4gMCAmJiAhb3duZXJJZFxuXG4gIGlmIChtYWxmb3JtZWQpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm1hbGZvcm1lZCBmdW5jdGlvbiB0eXBlIGFubm90YXRpb25cIiwgbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICBjb25zdCBwYXJhbWV0ZXJzID0gbmV3IE1hcChwYXJhbWV0ZXJUYWdzLm1hcCgodGFnKSA9PiBbdGFnLmRlc2NyaXB0aW9uLnNsaWNlKDEpLCB7XG4gICAgbG9jYXRpb246IGNvbW1lbnRUYWdMb2NhdGlvbihjb21tZW50LCB0YWcsIFwibmFtZVwiLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICBzb3VyY2VUeXBlOiB0YWcubmFtZVxuICB9XSkpXG5cbiAgaWYgKHBhcmFtZXRlcnMuc2l6ZSAhPSBwYXJhbWV0ZXJUYWdzLmxlbmd0aCkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImR1cGxpY2F0ZSBwYXJhbWV0ZXIgYW5ub3RhdGlvblwiLCBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgY29uc3QgcmV0dXJuVGFnID0gcmV0dXJuVGFnc1swXVxuICBjb25zdCB0eXBlUGFyYW1ldGVycyA9IHRlbXBsYXRlVGFncy5tYXAoKHRhZywgaW5kZXgpID0+IHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IGNvbW1lbnRUYWdMb2NhdGlvbihjb21tZW50LCB0YWcsIFwibmFtZVwiLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2lkOiBgJHtvd25lcklkfTp0eXBlOiR7aW5kZXh9YCwga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiVHlwZVBhcmFtZXRlclwiKSwgbG9jYXRpb24sIG5hbWU6IHRhZy5uYW1lfSwge25hbWU6IGxvY2F0aW9ufSlcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIHBhcmFtZXRlcnMsXG4gICAgcmV0dXJuVHlwZTogcmV0dXJuVGFnID8ge1xuICAgICAgbG9jYXRpb246IGNvbW1lbnRUYWdMb2NhdGlvbihjb21tZW50LCByZXR1cm5UYWcsIFwibmFtZVwiLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIHNvdXJjZVR5cGU6IHJldHVyblRhZy5uYW1lXG4gICAgfSA6IHVuZGVmaW5lZCxcbiAgICAuLi4odHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCA/IHt0eXBlUGFyYW1ldGVyc30gOiB7fSlcbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIGFuIG9wdGlvbmFsIGV4YWN0IGNsYXNzLWxldmVsIFBIUERvYyB0ZW1wbGF0ZSBsaXN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkNsYXNzfSBub2RlIC0gQ2xhc3MgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gb3duZXJJZCAtIFN0YWJsZSByZWNvcmQgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlR5cGVQYXJhbWV0ZXJbXSB8IHVuZGVmaW5lZH0gT3JkZXJlZCBwYXJhbWV0ZXJzLlxuICovXG5mdW5jdGlvbiBjbGFzc0RvY3VtZW50ZWRUeXBlUGFyYW1ldGVycyhub2RlLCBvd25lcklkLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGRvY3VtZW50ZWQgPSBmdW5jdGlvbkRvY3VtZW50ZWRUeXBlcyhcbiAgICAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRnVuY3Rpb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChub2RlKSksIGZpbGVuYW1lLCBzb3VyY2UsIG93bmVySWQpXG5cbiAgaWYgKGRvY3VtZW50ZWQucGFyYW1ldGVycy5zaXplIHx8IGRvY3VtZW50ZWQucmV0dXJuVHlwZSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImZ1bmN0aW9uIHR5cGUgYW5ub3RhdGlvbiBvbiByZWNvcmQgZGVjbGFyYXRpb25cIiwgbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG5cbiAgcmV0dXJuIGRvY3VtZW50ZWQudHlwZVBhcmFtZXRlcnNcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbmF0aXZlIFBIUCB0eXBlIG5hbWUgZnJvbSBvbmUgc3VwcG9ydGVkIHBhcnNlciBub2RlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGUgfCBudWxsfSB0eXBlIC0gTmF0aXZlIHR5cGUgbm9kZS5cbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IFR5cGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gcGhwVHlwZU5hbWUodHlwZSkge1xuICBpZiAoIXR5cGUgfHwgIVtcInR5cGVyZWZlcmVuY2VcIiwgXCJuYW1lXCIsIFwiaWRlbnRpZmllclwiXS5pbmNsdWRlcyh0eXBlLmtpbmQpKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5UeXBlUmVmZXJlbmNlIHwgaW1wb3J0KFwicGhwLXBhcnNlclwiKS5OYW1lIHwgaW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAodHlwZSkubmFtZVxufVxuXG4vKipcbiAqIFdyYXBzIG9uZSBwYXJzZXItZGVjbGFyZWQgY2Fub25pY2FsIFBIUCBudWxsYWJsZSB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gdmFsdWVUeXBlIC0gUHJlc2VudC12YWx1ZSBzZW1hbnRpYyB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGV9IHNvdXJjZVR5cGUgLSBOYXRpdmUgcGFyc2VyIHR5cGUgbm9kZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBvd25lclN0YXJ0IC0gRWFybGllc3Qgb3duaW5nIHBhcnNlciBvZmZzZXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLk9wdGlvbmFsVHlwZX0gT3B0aW9uYWwgc2VtYW50aWMgdHlwZS5cbiAqL1xuZnVuY3Rpb24gbnVsbGFibGVUeXBlKHZhbHVlVHlwZSwgc291cmNlVHlwZSwgb3duZXJTdGFydCwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBpZiAoIXNvdXJjZVR5cGUubG9jKSB0aHJvdyBuZXcgRXJyb3IoXCJQSFAgcGFyc2VyIG9taXR0ZWQgbnVsbGFibGUgdHlwZSBsb2NhdGlvbi5cIilcbiAgY29uc3QgdmFsdWVMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihzb3VyY2VUeXBlLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBtYXJrZXIgPSB0b2tlbkxvY2F0aW9uKFwiP1wiLCBvd25lclN0YXJ0LCBzb3VyY2VUeXBlLmxvYy5zdGFydC5vZmZzZXQsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKG1hcmtlci5lbmQub2Zmc2V0ICE9IHZhbHVlTG9jYXRpb24uc3RhcnQub2Zmc2V0KSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibm9uY2Fub25pY2FsIG51bGxhYmxlIHR5cGVcIiwgbWFya2VyKVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbmFsVHlwZShcbiAgICB2YWx1ZVR5cGUsXG4gICAgbG9jYXRpb25Gcm9tT2Zmc2V0cyhmaWxlbmFtZSwgc291cmNlLCBtYXJrZXIuc3RhcnQub2Zmc2V0LCB2YWx1ZUxvY2F0aW9uLmVuZC5vZmZzZXQpLFxuICAgIHZhbHVlTG9jYXRpb25cbiAgKVxufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBleHBsaWNpdCBQSFAgZnVuY3Rpb24gcmV0dXJuIHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZSB8IG51bGx9IHNvdXJjZVR5cGUgLSBQSFAgcmV0dXJuIHR5cGUgbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdWJqZWN0IC0gVHlwZWQgZnVuY3Rpb24gcmV0dXJuLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBGdW5jdGlvbiBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JbnRlcmZhY2VEZWNsYXJhdGlvbj59IFtyZWNvcmROYW1lc10gLSBOb21pbmFsIGRlY2xhcmF0aW9ucyBieSBzb3VyY2UgbmFtZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gU2VtYW50aWMgcmV0dXJuIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRSZXR1cm5UeXBlKHNvdXJjZVR5cGUsIHN1YmplY3QsIGxvY2F0aW9uLCBmaWxlbmFtZSwgc291cmNlLCByZWNvcmROYW1lcyA9IG5ldyBNYXAoKSkge1xuICBpZiAoIXNvdXJjZVR5cGUpIHJldHVybiByZXF1aXJlU291cmNlUmV0dXJuVHlwZShcInBocFwiLCB1bmRlZmluZWQsIHN1YmplY3QsIGxvY2F0aW9uKVxuICBpZiAoc291cmNlVHlwZS5raW5kICE9IFwidHlwZXJlZmVyZW5jZVwiICYmIHNvdXJjZVR5cGUua2luZCAhPSBcIm5hbWVcIiAmJiBzb3VyY2VUeXBlLmtpbmQgIT0gXCJpZGVudGlmaWVyXCIpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJ1bnN1cHBvcnRlZCByZXR1cm4gdHlwZVwiLCBub2RlTG9jYXRpb24oc291cmNlVHlwZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgY29uc3QgdHlwZU5hbWUgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVHlwZVJlZmVyZW5jZSB8IGltcG9ydChcInBocC1wYXJzZXJcIikuTmFtZSB8IGltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKHNvdXJjZVR5cGUpLm5hbWVcbiAgY29uc3QgZGVjbGFyYXRpb24gPSByZWNvcmROYW1lcy5nZXQodHlwZU5hbWUpXG5cbiAgaWYgKGRlY2xhcmF0aW9uPy5pZCkgcmV0dXJuIGRlY2xhcmF0aW9uLmtpbmQgPT0gXCJDbGFzc0RlY2xhcmF0aW9uXCJcbiAgICA/IHJlZmVyZW5jZVR5cGUoZGVjbGFyYXRpb24uaWQsIG5vZGVMb2NhdGlvbihzb3VyY2VUeXBlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICA6IGRlY2xhcmF0aW9uLmtpbmQgPT0gXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiXG4gICAgICA/IGludGVyZmFjZVR5cGUoZGVjbGFyYXRpb24uaWQsIG5vZGVMb2NhdGlvbihzb3VyY2VUeXBlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICAgIDogZGVjbGFyYXRpb24ua2luZCA9PSBcIkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb25cIlxuICAgICAgICA/IG93bmVkUmVzb3VyY2VUeXBlKGRlY2xhcmF0aW9uLmlkLCBub2RlTG9jYXRpb24oc291cmNlVHlwZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgICAgIDogcmVjb3JkVHlwZShkZWNsYXJhdGlvbi5pZCwgbm9kZUxvY2F0aW9uKHNvdXJjZVR5cGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuXG4gIHJldHVybiByZXF1aXJlU291cmNlUmV0dXJuVHlwZShcInBocFwiLCB0eXBlTmFtZSwgc3ViamVjdCwgbG9jYXRpb24sIG5vZGVMb2NhdGlvbihzb3VyY2VUeXBlLCBmaWxlbmFtZSwgc291cmNlKSlcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgZXhwbGljaXQgdHlwZSBzaWduYXR1cmUgb2Ygb25lIFBIUCBmdW5jdGlvbiBiZWZvcmUgYW55IGJvZHkgZXhwcmVzc2lvbnMuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuRnVuY3Rpb259IG5vZGUgLSBQSFAgZnVuY3Rpb24gbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JbnRlcmZhY2VEZWNsYXJhdGlvbj59IHJlY29yZE5hbWVzIC0gTm9taW5hbCBkZWNsYXJhdGlvbnMgYnkgc291cmNlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3duZXJJZCAtIFN0YWJsZSBmdW5jdGlvbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtQaHBGdW5jdGlvblNpZ25hdHVyZX0gVHlwZWQgZnVuY3Rpb24gc2lnbmF0dXJlLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0RnVuY3Rpb25TaWduYXR1cmUobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgcmVjb3JkTmFtZXMsIG93bmVySWQpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgbmFtZSA9IHR5cGVvZiBub2RlLm5hbWUgPT0gXCJzdHJpbmdcIiA/IG5vZGUubmFtZSA6IG5vZGUubmFtZS5uYW1lXG5cbiAgaWYgKCFub2RlLmJvZHkpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJmdW5jdGlvbiBib2R5XCIsIGxvY2F0aW9uKVxuICB9XG5cbiAgY29uc3QgZG9jdW1lbnRlZCA9IGZ1bmN0aW9uRG9jdW1lbnRlZFR5cGVzKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIG93bmVySWQpXG4gIGNvbnN0IHR5cGVQYXJhbWV0ZXJOYW1lcyA9IG5ldyBNYXAoKGRvY3VtZW50ZWQudHlwZVBhcmFtZXRlcnMgPz8gW10pLm1hcCgocGFyYW1ldGVyKSA9PiBbcGFyYW1ldGVyLm5hbWUsIHBhcmFtZXRlcl0pKVxuICBjb25zdCBwYXJhbWV0ZXJzID0gbm9kZS5hcmd1bWVudHMubWFwKChwYXJhbWV0ZXIpID0+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihwYXJhbWV0ZXIsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgY29uc3QgcGFyYW1ldGVyTmFtZSA9IHR5cGVvZiBwYXJhbWV0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gcGFyYW1ldGVyLm5hbWUgOiBwYXJhbWV0ZXIubmFtZS5uYW1lXG5cbiAgICBpZiAocGFyYW1ldGVyLmJ5cmVmKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJieS1yZWZlcmVuY2UgcGFyYW1ldGVyXCIsIHBhcmFtZXRlckxvY2F0aW9uKVxuICAgIGlmIChwYXJhbWV0ZXIudmFyaWFkaWMpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInZhcmlhZGljIHBhcmFtZXRlclwiLCBwYXJhbWV0ZXJMb2NhdGlvbilcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkZWZhdWx0IHBhcmFtZXRlclwiLCBwYXJhbWV0ZXJMb2NhdGlvbilcbiAgICBjb25zdCBwYXJhbWV0ZXJOb2RlID0gdHlwZW9mIHBhcmFtZXRlci5uYW1lID09IFwic3RyaW5nXCIgPyBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXIubmFtZVxuICAgIGNvbnN0IGRvY3VtZW50ZWRUeXBlID0gZG9jdW1lbnRlZC5wYXJhbWV0ZXJzLmdldChwYXJhbWV0ZXJOYW1lKVxuICAgIGNvbnN0IG5hdGl2ZVR5cGUgPSBwaHBUeXBlTmFtZShwYXJhbWV0ZXIudHlwZSlcblxuICAgIGxldCBwYXJhbWV0ZXJUeXBlID0gZG9jdW1lbnRlZFR5cGVcbiAgICAgID8gZG9jdW1lbnRlZFZhbHVlVHlwZSh7bGFuZ3VhZ2U6IFwicGhwXCIsIGxvY2F0aW9uOiBkb2N1bWVudGVkVHlwZS5sb2NhdGlvbiwgb3duZXJMb2NhdGlvbjogcGFyYW1ldGVyTG9jYXRpb24sIHNvdXJjZSxcbiAgICAgICAgcmVjb3JkczogcmVjb3JkTmFtZXMsIHNvdXJjZVR5cGU6IGRvY3VtZW50ZWRUeXBlLnNvdXJjZVR5cGUsIHN1YmplY3Q6IGBQYXJhbWV0ZXIgJyR7cGFyYW1ldGVyTmFtZX0nYCwgdHlwZVBhcmFtZXRlcnM6IHR5cGVQYXJhbWV0ZXJOYW1lc30pXG4gICAgICA6IGNvbnZlcnRUeXBlKHBhcmFtZXRlci50eXBlLCBgUGFyYW1ldGVyICcke3BhcmFtZXRlck5hbWV9J2AsIHBhcmFtZXRlckxvY2F0aW9uLCBmaWxlbmFtZSwgc291cmNlLCByZWNvcmROYW1lcylcblxuICAgIGlmIChuYXRpdmVUeXBlID09IFwiYXJyYXlcIiAmJiAhZG9jdW1lbnRlZFR5cGUpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgUGFyYW1ldGVyICcke3BhcmFtZXRlck5hbWV9J2AsIHBhcmFtZXRlckxvY2F0aW9uKVxuICAgIGlmIChkb2N1bWVudGVkVHlwZSAmJiAhcGhwRG9jdW1lbnRlZE5hdGl2ZVR5cGVNYXRjaGVzKG5hdGl2ZVR5cGUsIHBhcmFtZXRlci5udWxsYWJsZSwgcGFyYW1ldGVyVHlwZSwgcmVjb3JkTmFtZXMpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkb2N1bWVudGVkIHBhcmFtZXRlciB0eXBlIGluY29tcGF0aWJsZSB3aXRoIG5hdGl2ZSB0eXBlXCIsIGRvY3VtZW50ZWRUeXBlLmxvY2F0aW9uKVxuICAgIH1cblxuICAgIGlmIChwYXJhbWV0ZXIubnVsbGFibGUgJiYgcGFyYW1ldGVyVHlwZS5raW5kICE9IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIGlmICghcGFyYW1ldGVyLnR5cGUpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgUGFyYW1ldGVyICcke3BhcmFtZXRlck5hbWV9J2AsIHBhcmFtZXRlckxvY2F0aW9uKVxuICAgICAgcGFyYW1ldGVyVHlwZSA9IG51bGxhYmxlVHlwZShwYXJhbWV0ZXJUeXBlLCBwYXJhbWV0ZXIudHlwZSwgcGFyYW1ldGVyLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgfSBlbHNlIGlmICghcGFyYW1ldGVyLm51bGxhYmxlICYmIHBhcmFtZXRlclR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmXG4gICAgICBwYXJhbWV0ZXJUeXBlLnZhbHVlVHlwZS5raW5kICE9IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm9wdGlvbmFsIGFubm90YXRpb24gd2l0aG91dCBudWxsYWJsZSBuYXRpdmUgdHlwZVwiLCBkb2N1bWVudGVkVHlwZT8ubG9jYXRpb24gPz8gcGFyYW1ldGVyTG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IHNlbWFudGljUGFyYW1ldGVyID0ge1xuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUGFyYW1ldGVyXCIpLFxuICAgICAgbG9jYXRpb246IHBhcmFtZXRlckxvY2F0aW9uLFxuICAgICAgbmFtZTogcGFyYW1ldGVyTmFtZSxcbiAgICAgIHR5cGU6IHBhcmFtZXRlclR5cGVcbiAgICB9XG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyhzZW1hbnRpY1BhcmFtZXRlciwge25hbWU6IG5vZGVMb2NhdGlvbihwYXJhbWV0ZXJOb2RlLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gIH0pXG4gIGNvbnN0IGV4dHJhRG9jdW1lbnRlZFBhcmFtZXRlciA9IFsuLi5kb2N1bWVudGVkLnBhcmFtZXRlcnMua2V5cygpXS5maW5kKChuYW1lKSA9PlxuICAgICFub2RlLmFyZ3VtZW50cy5zb21lKChwYXJhbWV0ZXIpID0+ICh0eXBlb2YgcGFyYW1ldGVyLm5hbWUgPT0gXCJzdHJpbmdcIiA/IHBhcmFtZXRlci5uYW1lIDogcGFyYW1ldGVyLm5hbWUubmFtZSkgPT0gbmFtZSkpXG5cbiAgaWYgKGV4dHJhRG9jdW1lbnRlZFBhcmFtZXRlcikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGBhbm5vdGF0aW9uIGZvciB1bmtub3duIHBhcmFtZXRlciAnJHtleHRyYURvY3VtZW50ZWRQYXJhbWV0ZXJ9J2AsIGxvY2F0aW9uKVxuICBpZiAobm9kZS5ieXJlZikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiYnktcmVmZXJlbmNlIHJldHVyblwiLCBsb2NhdGlvbilcbiAgY29uc3QgbmFtZU5vZGUgPSB0eXBlb2Ygbm9kZS5uYW1lID09IFwic3RyaW5nXCIgPyBub2RlIDogbm9kZS5uYW1lXG4gIGNvbnN0IG5hdGl2ZVJldHVyblR5cGUgPSBwaHBUeXBlTmFtZShub2RlLnR5cGUpXG4gIGxldCByZXR1cm5UeXBlXG5cbiAgaWYgKGRvY3VtZW50ZWQucmV0dXJuVHlwZSkge1xuICAgIHJldHVyblR5cGUgPSBkb2N1bWVudGVkVmFsdWVUeXBlKHtsYW5ndWFnZTogXCJwaHBcIiwgbG9jYXRpb246IGRvY3VtZW50ZWQucmV0dXJuVHlwZS5sb2NhdGlvbiwgb3duZXJMb2NhdGlvbjogbG9jYXRpb24sIHNvdXJjZSxcbiAgICAgIHJlY29yZHM6IHJlY29yZE5hbWVzLCBzb3VyY2VUeXBlOiBkb2N1bWVudGVkLnJldHVyblR5cGUuc291cmNlVHlwZSwgc3ViamVjdDogYEZ1bmN0aW9uICcke25hbWV9JyByZXR1cm5gLCB0eXBlUGFyYW1ldGVyczogdHlwZVBhcmFtZXRlck5hbWVzfSlcbiAgICBpZiAoIXBocERvY3VtZW50ZWROYXRpdmVUeXBlTWF0Y2hlcyhuYXRpdmVSZXR1cm5UeXBlLCBub2RlLm51bGxhYmxlLCByZXR1cm5UeXBlLCByZWNvcmROYW1lcykpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImRvY3VtZW50ZWQgcmV0dXJuIHR5cGUgaW5jb21wYXRpYmxlIHdpdGggbmF0aXZlIHR5cGVcIiwgZG9jdW1lbnRlZC5yZXR1cm5UeXBlLmxvY2F0aW9uKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAobmF0aXZlUmV0dXJuVHlwZSA9PSBcImFycmF5XCIpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgRnVuY3Rpb24gJyR7bmFtZX0nIHJldHVybmAsIGxvY2F0aW9uKVxuICAgIHJldHVyblR5cGUgPSBjb252ZXJ0UmV0dXJuVHlwZShub2RlLnR5cGUsIGBGdW5jdGlvbiAnJHtuYW1lfScgcmV0dXJuYCwgbG9jYXRpb24sIGZpbGVuYW1lLCBzb3VyY2UsIHJlY29yZE5hbWVzKVxuICB9XG4gIGlmIChub2RlLm51bGxhYmxlICYmIHJldHVyblR5cGUua2luZCAhPSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgaWYgKCFub2RlLnR5cGUpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgRnVuY3Rpb24gJyR7bmFtZX0nIHJldHVybmAsIGxvY2F0aW9uKVxuICAgIGNvbnN0IHR5cGVTdGFydCA9IG5vZGUudHlwZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwXG5cbiAgICByZXR1cm5UeXBlID0gbnVsbGFibGVUeXBlKFxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gKi8gKHJldHVyblR5cGUpLFxuICAgICAgbm9kZS50eXBlLFxuICAgICAgTWF0aC5tYXgobm9kZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCB0eXBlU3RhcnQgLSAyKSxcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgc291cmNlXG4gICAgKVxuICB9IGVsc2UgaWYgKCFub2RlLm51bGxhYmxlICYmIHJldHVyblR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmXG4gICAgcmV0dXJuVHlwZS52YWx1ZVR5cGUua2luZCAhPSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwib3B0aW9uYWwgYW5ub3RhdGlvbiB3aXRob3V0IG51bGxhYmxlIG5hdGl2ZSByZXR1cm4gdHlwZVwiLCBkb2N1bWVudGVkLnJldHVyblR5cGU/LmxvY2F0aW9uID8/IGxvY2F0aW9uKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBsb2NhdGlvbixcbiAgICBuYW1lLFxuICAgIG5hbWVMb2NhdGlvbjogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICBwYXJhbWV0ZXJzLFxuICAgIHJldHVyblR5cGUsXG4gICAgLi4uKGRvY3VtZW50ZWQudHlwZVBhcmFtZXRlcnMgPyB7dHlwZVBhcmFtZXRlcnM6IGRvY3VtZW50ZWQudHlwZVBhcmFtZXRlcnN9IDoge30pXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIGV4YWN0IHJ1bnRpbWUgY2FycmllciBwZXJtaXR0ZWQgYmVzaWRlIGEgcHJlY2lzZSBQSFBEb2MgdHlwZS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBuYXRpdmVUeXBlIC0gTmF0aXZlIFBIUCB0eXBlIG5hbWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG5hdGl2ZU51bGxhYmxlIC0gV2hldGhlciB0aGUgbmF0aXZlIGNhcnJpZXIgaGFzIFBIUCdzIG51bGxhYmxlIG1hcmtlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9IGRvY3VtZW50ZWRUeXBlIC0gRXhhY3Qgc2VtYW50aWMgZG9jdW1lbnQgdHlwZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkludGVyZmFjZURlY2xhcmF0aW9uPn0gcmVjb3JkcyAtIFZpc2libGUgbm9taW5hbCBkZWNsYXJhdGlvbnMgYnkgbmFtZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBuYXRpdmUgY2FycmllciBhZ3JlZXMgd2l0aG91dCBjaGFuZ2luZyBtZWFuaW5nLlxuICovXG5mdW5jdGlvbiBwaHBEb2N1bWVudGVkTmF0aXZlVHlwZU1hdGNoZXMobmF0aXZlVHlwZSwgbmF0aXZlTnVsbGFibGUsIGRvY3VtZW50ZWRUeXBlLCByZWNvcmRzKSB7XG4gIGlmIChkb2N1bWVudGVkVHlwZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICBpZiAoZG9jdW1lbnRlZFR5cGUudmFsdWVUeXBlLmtpbmQgPT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIikge1xuICAgICAgcmV0dXJuIG5hdGl2ZVR5cGUgPT09IHVuZGVmaW5lZCAmJiAhbmF0aXZlTnVsbGFibGVcbiAgICB9XG5cbiAgICByZXR1cm4gbmF0aXZlTnVsbGFibGUgJiYgcGhwRG9jdW1lbnRlZE5hdGl2ZVR5cGVNYXRjaGVzKG5hdGl2ZVR5cGUsIGZhbHNlLCBkb2N1bWVudGVkVHlwZS52YWx1ZVR5cGUsIHJlY29yZHMpXG4gIH1cbiAgaWYgKG5hdGl2ZU51bGxhYmxlKSByZXR1cm4gZmFsc2VcbiAgaWYgKGRvY3VtZW50ZWRUeXBlLmtpbmQgPT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIikgcmV0dXJuIG5hdGl2ZVR5cGUgPT09IHVuZGVmaW5lZFxuICBpZiAoZG9jdW1lbnRlZFR5cGUua2luZCA9PSBcIlR5cGVSZWZlcmVuY2VcIikge1xuICAgIHJldHVybiBuYXRpdmVUeXBlICE9PSB1bmRlZmluZWQgJiYgc291cmNlU2NhbGFyVHlwZShcInBocFwiLCBuYXRpdmVUeXBlKT8ubmFtZSA9PSBkb2N1bWVudGVkVHlwZS5uYW1lXG4gIH1cbiAgaWYgKGRvY3VtZW50ZWRUeXBlLmtpbmQgPT0gXCJMaXN0VHlwZVwiIHx8IGRvY3VtZW50ZWRUeXBlLmtpbmQgPT0gXCJNYXBUeXBlXCIgfHwgZG9jdW1lbnRlZFR5cGUua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICByZXR1cm4gbmF0aXZlVHlwZSA9PSBcImFycmF5XCJcbiAgfVxuICBpZiAoZG9jdW1lbnRlZFR5cGUua2luZCA9PSBcIlJlY29yZFR5cGVcIikge1xuICAgIHJldHVybiBuYXRpdmVUeXBlICE9PSB1bmRlZmluZWQgJiYgcmVjb3Jkcy5nZXQobmF0aXZlVHlwZSk/LmlkID09IGRvY3VtZW50ZWRUeXBlLmRlY2xhcmF0aW9uSWRcbiAgfVxuICBpZiAoZG9jdW1lbnRlZFR5cGUua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIikge1xuICAgIHJldHVybiBuYXRpdmVUeXBlICE9PSB1bmRlZmluZWQgJiYgcmVjb3Jkcy5nZXQobmF0aXZlVHlwZSk/LmlkID09IGRvY3VtZW50ZWRUeXBlLmRlY2xhcmF0aW9uSWRcbiAgfVxuICBpZiAoZG9jdW1lbnRlZFR5cGUua2luZCA9PSBcIkludGVyZmFjZVR5cGVcIikge1xuICAgIHJldHVybiBuYXRpdmVUeXBlICE9PSB1bmRlZmluZWQgJiYgcmVjb3Jkcy5nZXQobmF0aXZlVHlwZSk/LmlkID09IGRvY3VtZW50ZWRUeXBlLmRlY2xhcmF0aW9uSWRcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgUEhQIGZ1bmN0aW9uIGJvZHkgdXNpbmcgdGhlIGFscmVhZHktcHJvdmVkIG1vZHVsZSBzaWduYXR1cmVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkZ1bmN0aW9ufSBub2RlIC0gUEhQIGZ1bmN0aW9uIG5vZGUuXG4gKiBAcGFyYW0ge1BocEZ1bmN0aW9uU2lnbmF0dXJlfSBzaWduYXR1cmUgLSBQcmVjb252ZXJ0ZWQgZXhwbGljaXQgc2lnbmF0dXJlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBQaHBGdW5jdGlvblNpZ25hdHVyZT59IGZ1bmN0aW9ucyAtIE1vZHVsZSBmdW5jdGlvbiBzaWduYXR1cmVzLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuSW50ZXJmYWNlRGVjbGFyYXRpb24+fSByZWNvcmROYW1lcyAtIE5vbWluYWwgZGVjbGFyYXRpb25zIGJ5IHNvdXJjZSBuYW1lLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj59IHJlY29yZHMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uPn0gY2xhc3NlcyAtIFJlZmVyZW5jZSBjbGFzc2VzIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JbnRlcmZhY2VEZWNsYXJhdGlvbj59IGludGVyZmFjZXMgLSBJbnRlcmZhY2UgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uPn0gZXJyb3JOYW1lcyAtIEVycm9yIGRlY2xhcmF0aW9ucyBieSBzb3VyY2UgbmFtZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj59IGVycm9ycyAtIEVycm9yIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbn0gU2VtYW50aWMgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRGdW5jdGlvbihub2RlLCBzaWduYXR1cmUsIGZ1bmN0aW9ucywgcmVjb3JkTmFtZXMsIHJlY29yZHMsIGNsYXNzZXMsIGludGVyZmFjZXMsIGVycm9yTmFtZXMsIGVycm9ycywgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBpZiAoIW5vZGUuYm9keSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZnVuY3Rpb24gYm9keVwiLCBzaWduYXR1cmUubG9jYXRpb24pXG4gIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgYmluZGluZ3M6IG5ldyBNYXAoc2lnbmF0dXJlLnBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIubmFtZSwgcGFyYW1ldGVyLnR5cGVdKSksXG4gICAgY2xhc3NlcyxcbiAgICBlcnJvck5hbWVzLFxuICAgIGVycm9ycyxcbiAgICBmdW5jdGlvbnMsXG4gICAgb3JkZXJlZE1hcERlY2xhcmF0aW9uczogb3JkZXJlZE1hcERlY2xhcmF0aW9uc0ZvclBocChub2RlLmJvZHkpLFxuICAgIHJlY29yZE5hbWVzLFxuICAgIHJlY29yZHMsXG4gICAgcmV0dXJuVHlwZTogc2lnbmF0dXJlLnJldHVyblR5cGUsXG4gICAgdHlwZVBhcmFtZXRlcnM6IG5ldyBNYXAoKHNpZ25hdHVyZS50eXBlUGFyYW1ldGVycyA/PyBbXSkubWFwKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIubmFtZSwgcGFyYW1ldGVyXSkpXG4gIH1cblxuICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgYm9keTogY29udmVydEJsb2NrKG5vZGUuYm9keSwgZmlsZW5hbWUsIHNvdXJjZSwgey4uLmNvbnRleHQsIGludGVyZmFjZXN9KSxcbiAgICBraW5kOiBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIixcbiAgICBsb2NhdGlvbjogc2lnbmF0dXJlLmxvY2F0aW9uLFxuICAgIG5hbWU6IHNpZ25hdHVyZS5uYW1lLFxuICAgIHBhcmFtZXRlcnM6IHNpZ25hdHVyZS5wYXJhbWV0ZXJzLFxuICAgIHJldHVyblR5cGU6IHNpZ25hdHVyZS5yZXR1cm5UeXBlLFxuICAgIC4uLihzaWduYXR1cmUudHlwZVBhcmFtZXRlcnMgPyB7dHlwZVBhcmFtZXRlcnM6IHNpZ25hdHVyZS50eXBlUGFyYW1ldGVyc30gOiB7fSlcbiAgfSwge25hbWU6IHNpZ25hdHVyZS5uYW1lTG9jYXRpb259KVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHBhcnNlci1vd25lZCBrZXkvdmFsdWUgbG9vcHMgdG8gZXhhY3QgZGVjbGFyYXRpb25zIGluc2lkZSBvbmUgbGV4aWNhbCBvd25lci5cbiAqIEFtYmlndW91cyBzYW1lLW5hbWUgZGVjbGFyYXRpb25zIHByb2R1Y2Ugbm8gZXZpZGVuY2UgYW5kIGZhaWwgZHVyaW5nIGxvb3AgY29udmVyc2lvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBGdW5jdGlvbiBib2R5IG9yIGVudHJ5LXBvaW50IHN1YnRyZWUuXG4gKiBAcmV0dXJucyB7U2V0PG9iamVjdD59IEV4YWN0IHBhaXItaXRlcmF0ZWQgcGFyc2VyIGRlY2xhcmF0aW9ucy5cbiAqL1xuZnVuY3Rpb24gb3JkZXJlZE1hcERlY2xhcmF0aW9uc0ZvclBocCh2YWx1ZSkge1xuICAvKiogQHR5cGUge3tkZWNsYXJhdGlvbjogb2JqZWN0LCBuYW1lOiBzdHJpbmcsIG9mZnNldDogbnVtYmVyfVtdfSAqL1xuICBjb25zdCBkZWNsYXJhdGlvbnMgPSBbXVxuICAvKiogQHR5cGUge3tuYW1lOiBzdHJpbmcsIG9mZnNldDogbnVtYmVyfVtdfSAqL1xuICBjb25zdCByZWNlaXZlcnMgPSBbXVxuICBjb25zdCBzZWVuID0gbmV3IFdlYWtTZXQoKVxuICAvKipcbiAgICogVmlzaXRzIG9uZSBwYXJzZXIgY2FuZGlkYXRlLlxuICAgKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZSAtIFBhcnNlciBjYW5kaWRhdGUuXG4gICAqL1xuICBjb25zdCB2aXNpdCA9IChjYW5kaWRhdGUpID0+IHtcbiAgICBpZiAoIWNhbmRpZGF0ZSB8fCB0eXBlb2YgY2FuZGlkYXRlICE9IFwib2JqZWN0XCIgfHwgc2Vlbi5oYXMoY2FuZGlkYXRlKSkgcmV0dXJuXG4gICAgc2Vlbi5hZGQoY2FuZGlkYXRlKVxuICAgIGNvbnN0IGtpbmQgPSBSZWZsZWN0LmdldChjYW5kaWRhdGUsIFwia2luZFwiKVxuXG4gICAgaWYgKGtpbmQgPT0gXCJmdW5jdGlvblwiIHx8IGtpbmQgPT0gXCJjbGFzc1wiKSByZXR1cm5cbiAgICBpZiAoa2luZCA9PSBcImFzc2lnblwiKSB7XG4gICAgICBjb25zdCB2YXJpYWJsZSA9IFJlZmxlY3QuZ2V0KGNhbmRpZGF0ZSwgXCJsZWZ0XCIpXG5cbiAgICAgIGlmIChSZWZsZWN0LmdldCh2YXJpYWJsZSwgXCJraW5kXCIpID09IFwidmFyaWFibGVcIiAmJiB0eXBlb2YgUmVmbGVjdC5nZXQodmFyaWFibGUsIFwibmFtZVwiKSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGRlY2xhcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICBkZWNsYXJhdGlvbjogY2FuZGlkYXRlLFxuICAgICAgICAgIG5hbWU6IFJlZmxlY3QuZ2V0KHZhcmlhYmxlLCBcIm5hbWVcIiksXG4gICAgICAgICAgb2Zmc2V0OiBSZWZsZWN0LmdldCh2YXJpYWJsZSwgXCJsb2NcIik/LnN0YXJ0Lm9mZnNldFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2luZCA9PSBcImZvcmVhY2hcIikge1xuICAgICAgY29uc3QgcmVjZWl2ZXIgPSBSZWZsZWN0LmdldChjYW5kaWRhdGUsIFwic291cmNlXCIpXG5cbiAgICAgIGlmIChSZWZsZWN0LmdldChyZWNlaXZlciwgXCJraW5kXCIpID09IFwidmFyaWFibGVcIiAmJiB0eXBlb2YgUmVmbGVjdC5nZXQocmVjZWl2ZXIsIFwibmFtZVwiKSA9PSBcInN0cmluZ1wiICYmXG4gICAgICAgIFJlZmxlY3QuZ2V0KGNhbmRpZGF0ZSwgXCJrZXlcIikpIHJlY2VpdmVycy5wdXNoKHtcbiAgICAgICAgbmFtZTogUmVmbGVjdC5nZXQocmVjZWl2ZXIsIFwibmFtZVwiKSxcbiAgICAgICAgb2Zmc2V0OiBSZWZsZWN0LmdldChjYW5kaWRhdGUsIFwibG9jXCIpPy5zdGFydC5vZmZzZXRcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKGNhbmRpZGF0ZSkpIHtcbiAgICAgIGlmIChbXCJsb2NcIiwgXCJsZWFkaW5nQ29tbWVudHNcIiwgXCJ0cmFpbGluZ0NvbW1lbnRzXCJdLmluY2x1ZGVzKGtleSkpIGNvbnRpbnVlXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNoaWxkKSB2aXNpdChpdGVtKVxuICAgICAgfSBlbHNlIHZpc2l0KGNoaWxkKVxuICAgIH1cbiAgfVxuXG4gIHZpc2l0KHZhbHVlKVxuICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQoKVxuICBmb3IgKGNvbnN0IHJlY2VpdmVyIG9mIHJlY2VpdmVycykge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBkZWNsYXJhdGlvbnMuZmlsdGVyKCh7bmFtZSwgb2Zmc2V0fSkgPT4gbmFtZSA9PSByZWNlaXZlci5uYW1lICYmIG9mZnNldCA8IHJlY2VpdmVyLm9mZnNldClcblxuICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PSAxKSBzZWxlY3RlZC5hZGQobWF0Y2hlc1swXS5kZWNsYXJhdGlvbilcbiAgfVxuXG4gIHJldHVybiBzZWxlY3RlZFxufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBleGFjdCBmaW5hbCBSdW50aW1lRXhjZXB0aW9uIHN1YmNsYXNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkNsYXNzfSBub2RlIC0gUEhQIGNsYXNzIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9ufSBkZWNsYXJhdGlvbiAtIFByZWRlY2xhcmVkIHNlbWFudGljIGVycm9yLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9ufSBTZW1hbnRpYyBlcnJvciBkZWNsYXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gY29udmVydFBocEVycm9yKG5vZGUsIGRlY2xhcmF0aW9uLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IHBhcmVudCA9IG5vZGUuZXh0ZW5kc1xuICBjb25zdCBwYXJlbnROYW1lID0gcGFyZW50Py5raW5kID09IFwibmFtZVwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5hbWV9ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChwYXJlbnQpKSA6IHVuZGVmaW5lZFxuXG4gIGlmIChub2RlLmlzQW5vbnltb3VzIHx8ICFub2RlLmlzRmluYWwgfHwgbm9kZS5pc1JlYWRvbmx5IHx8IG5vZGUuaXNBYnN0cmFjdCB8fCBub2RlLmltcGxlbWVudHM/Lmxlbmd0aCB8fFxuICAgIG5vZGUuYXR0ckdyb3Vwcy5sZW5ndGggfHwgbm9kZS5ib2R5Lmxlbmd0aCAhPSAwIHx8ICFwYXJlbnROYW1lIHx8XG4gICAgIShwYXJlbnROYW1lLm5hbWUgPT0gXCJSdW50aW1lRXhjZXB0aW9uXCIgJiYgcGFyZW50TmFtZS5yZXNvbHV0aW9uID09IFwidXFuXCIgfHxcbiAgICAgIHBhcmVudE5hbWUubmFtZSA9PSBcIlxcXFxSdW50aW1lRXhjZXB0aW9uXCIgJiYgcGFyZW50TmFtZS5yZXNvbHV0aW9uID09IFwiZnFuXCIpKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibm9uY2Fub25pY2FsIHR5cGVkIGVycm9yIGRlY2xhcmF0aW9uXCIsIGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IG5hbWVOb2RlID0gdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZSA6IG5vZGUubmFtZVxuXG4gIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKGRlY2xhcmF0aW9uLCB7bmFtZTogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKSwgdHlwZTogbm9kZUxvY2F0aW9uKHBhcmVudE5hbWUsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbn1cblxuLyoqXG4gKiBSZWFkcyBvbmUgZXhhY3QgcHVibGljIFBIUCBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZS1tZXRob2Qgc2lnbmF0dXJlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk1ldGhvZH0gbm9kZSAtIFBhcnNlci1vd25lZCBtZXRob2QuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JbnRlcmZhY2VEZWNsYXJhdGlvbj59IG5vbWluYWxOYW1lcyAtIFZpc2libGUgbm9taW5hbCBkZWNsYXJhdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3duZXJJZCAtIFN0YWJsZSBjYWxsYWJsZSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY29uc3RydWN0b3IgLSBXaGV0aGVyIHRoaXMgaXMgdGhlIHNvbGUgY29uc3RydWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge3tsb2NhdGlvbjogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIG5hbWU6IHN0cmluZywgbmFtZUxvY2F0aW9uOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgcGFyYW1ldGVyczogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUGFyYW1ldGVyW10sIHJldHVyblR5cGU/OiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX19IEV4YWN0IHNpZ25hdHVyZS5cbiAqL1xuZnVuY3Rpb24gY29udmVydFBocENsYXNzQ2FsbGFibGVTaWduYXR1cmUobm9kZSwgbm9taW5hbE5hbWVzLCBvd25lcklkLCBjb25zdHJ1Y3RvciwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBuYW1lID0gdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZS5uYW1lIDogbm9kZS5uYW1lLm5hbWVcblxuICBpZiAoIWNvbnN0cnVjdG9yICYmIC9eX18vdS50ZXN0KG5hbWUpKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYHJlc2VydmVkIHJlZmVyZW5jZSBtZXRob2QgJyR7bmFtZX0nYCwgbG9jYXRpb24pXG4gIGlmIChub2RlLnZpc2liaWxpdHkgIT0gXCJwdWJsaWNcIiB8fCBub2RlLmlzU3RhdGljIHx8IG5vZGUuaXNBYnN0cmFjdCB8fCBub2RlLmlzRmluYWwgfHwgUmVmbGVjdC5nZXQobm9kZSwgXCJpc1JlYWRvbmx5XCIpIHx8IG5vZGUuYnlyZWYgfHxcbiAgICBub2RlLmF0dHJHcm91cHMubGVuZ3RoIHx8ICFub2RlLmJvZHkgfHwgY29uc3RydWN0b3IgIT0gKG5hbWUgPT0gXCJfX2NvbnN0cnVjdFwiKSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm5vbmNhbm9uaWNhbCByZWZlcmVuY2UgY2xhc3MgY2FsbGFibGVcIiwgbG9jYXRpb24pXG4gIH1cbiAgY29uc3QgZG9jdW1lbnRlZCA9IGZ1bmN0aW9uRG9jdW1lbnRlZFR5cGVzKC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5GdW5jdGlvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKG5vZGUpKSxcbiAgICBmaWxlbmFtZSwgc291cmNlLCBvd25lcklkKVxuICBpZiAoZG9jdW1lbnRlZC50eXBlUGFyYW1ldGVycz8ubGVuZ3RoKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJnZW5lcmljIHJlZmVyZW5jZSBjbGFzcyBjYWxsYWJsZVwiLCBsb2NhdGlvbilcbiAgaWYgKGNvbnN0cnVjdG9yICYmIChub2RlLnR5cGUgfHwgbm9kZS5udWxsYWJsZSB8fCBkb2N1bWVudGVkLnJldHVyblR5cGUpKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiY29uc3RydWN0b3IgcmV0dXJuIGFubm90YXRpb25cIiwgbG9jYXRpb24pXG4gIH1cbiAgY29uc3QgcGFyYW1ldGVycyA9IG5vZGUuYXJndW1lbnRzLm1hcCgocGFyYW1ldGVyKSA9PiB7XG4gICAgY29uc3QgcGFyYW1ldGVyTG9jYXRpb24gPSBub2RlTG9jYXRpb24ocGFyYW1ldGVyLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIGNvbnN0IHBhcmFtZXRlck5hbWUgPSB0eXBlb2YgcGFyYW1ldGVyLm5hbWUgPT0gXCJzdHJpbmdcIiA/IHBhcmFtZXRlci5uYW1lIDogcGFyYW1ldGVyLm5hbWUubmFtZVxuXG4gICAgaWYgKHBhcmFtZXRlci5ieXJlZiB8fCBwYXJhbWV0ZXIudmFyaWFkaWMgfHwgcGFyYW1ldGVyLnZhbHVlIHx8IHBhcmFtZXRlci5mbGFncyB8fCBwYXJhbWV0ZXIucmVhZG9ubHkgfHxcbiAgICAgIHBhcmFtZXRlci5ob29rcy5sZW5ndGggfHwgcGFyYW1ldGVyLmF0dHJHcm91cHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgcmVmZXJlbmNlIGNsYXNzIHBhcmFtZXRlclwiLCBwYXJhbWV0ZXJMb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgZG9jdW1lbnRlZFR5cGUgPSBkb2N1bWVudGVkLnBhcmFtZXRlcnMuZ2V0KHBhcmFtZXRlck5hbWUpXG4gICAgY29uc3QgbmF0aXZlVHlwZSA9IHBocFR5cGVOYW1lKHBhcmFtZXRlci50eXBlKVxuICAgIGxldCB0eXBlID0gZG9jdW1lbnRlZFR5cGVcbiAgICAgID8gZG9jdW1lbnRlZFZhbHVlVHlwZSh7bGFuZ3VhZ2U6IFwicGhwXCIsIGxvY2F0aW9uOiBkb2N1bWVudGVkVHlwZS5sb2NhdGlvbiwgb3duZXJMb2NhdGlvbjogcGFyYW1ldGVyTG9jYXRpb24sXG4gICAgICAgIHJlY29yZHM6IG5vbWluYWxOYW1lcywgc291cmNlLCBzb3VyY2VUeXBlOiBkb2N1bWVudGVkVHlwZS5zb3VyY2VUeXBlLCBzdWJqZWN0OiBgUGFyYW1ldGVyICcke3BhcmFtZXRlck5hbWV9J2B9KVxuICAgICAgOiBjb252ZXJ0VHlwZShwYXJhbWV0ZXIudHlwZSwgYFBhcmFtZXRlciAnJHtwYXJhbWV0ZXJOYW1lfSdgLCBwYXJhbWV0ZXJMb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSwgbm9taW5hbE5hbWVzKVxuXG4gICAgaWYgKG5hdGl2ZVR5cGUgPT0gXCJhcnJheVwiICYmICFkb2N1bWVudGVkVHlwZSkgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIGBQYXJhbWV0ZXIgJyR7cGFyYW1ldGVyTmFtZX0nYCwgcGFyYW1ldGVyTG9jYXRpb24pXG4gICAgaWYgKGRvY3VtZW50ZWRUeXBlICYmICFwaHBEb2N1bWVudGVkTmF0aXZlVHlwZU1hdGNoZXMobmF0aXZlVHlwZSwgcGFyYW1ldGVyLm51bGxhYmxlLCB0eXBlLCBub21pbmFsTmFtZXMpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkb2N1bWVudGVkIHBhcmFtZXRlciB0eXBlIGluY29tcGF0aWJsZSB3aXRoIG5hdGl2ZSB0eXBlXCIsIGRvY3VtZW50ZWRUeXBlLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAocGFyYW1ldGVyLm51bGxhYmxlICYmIHR5cGUua2luZCAhPSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICBpZiAoIXBhcmFtZXRlci50eXBlKSByZXR1cm4gbWlzc2luZ1R5cGUoXCJwaHBcIiwgYFBhcmFtZXRlciAnJHtwYXJhbWV0ZXJOYW1lfSdgLCBwYXJhbWV0ZXJMb2NhdGlvbilcbiAgICAgIHR5cGUgPSBudWxsYWJsZVR5cGUodHlwZSwgcGFyYW1ldGVyLnR5cGUsIHBhcmFtZXRlci5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIH0gZWxzZSBpZiAoIXBhcmFtZXRlci5udWxsYWJsZSAmJiB0eXBlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwib3B0aW9uYWwgYW5ub3RhdGlvbiB3aXRob3V0IG51bGxhYmxlIG5hdGl2ZSB0eXBlXCIsIGRvY3VtZW50ZWRUeXBlPy5sb2NhdGlvbiA/PyBwYXJhbWV0ZXJMb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgbmFtZU5vZGUgPSB0eXBlb2YgcGFyYW1ldGVyLm5hbWUgPT0gXCJzdHJpbmdcIiA/IHBhcmFtZXRlciA6IHBhcmFtZXRlci5uYW1lXG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUGFyYW1ldGVyXCIpLCBsb2NhdGlvbjogcGFyYW1ldGVyTG9jYXRpb24sXG4gICAgICBuYW1lOiBwYXJhbWV0ZXJOYW1lLCB0eXBlfSwge25hbWU6IG5vZGVMb2NhdGlvbihuYW1lTm9kZSwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICB9KVxuICBpZiAoWy4uLmRvY3VtZW50ZWQucGFyYW1ldGVycy5rZXlzKCldLnNvbWUoKHBhcmFtZXRlck5hbWUpID0+XG4gICAgIW5vZGUuYXJndW1lbnRzLnNvbWUoKHBhcmFtZXRlcikgPT4gKHR5cGVvZiBwYXJhbWV0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gcGFyYW1ldGVyLm5hbWUgOiBwYXJhbWV0ZXIubmFtZS5uYW1lKSA9PSBwYXJhbWV0ZXJOYW1lKSkpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJtZXRob2QgUEhQRG9jIHBhcmFtZXRlciBtaXNtYXRjaFwiLCBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBuYW1lTm9kZSA9IHR5cGVvZiBub2RlLm5hbWUgPT0gXCJzdHJpbmdcIiA/IG5vZGUgOiBub2RlLm5hbWVcblxuICBpZiAoY29uc3RydWN0b3IpIHJldHVybiB7bG9jYXRpb24sIG5hbWU6IFwiY29uc3RydWN0b3JcIiwgbmFtZUxvY2F0aW9uOiBub2RlTG9jYXRpb24obmFtZU5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpLCBwYXJhbWV0ZXJzfVxuICBsZXQgcmV0dXJuVHlwZVxuICBjb25zdCBuYXRpdmVSZXR1cm5UeXBlID0gcGhwVHlwZU5hbWUobm9kZS50eXBlKVxuXG4gIGlmIChkb2N1bWVudGVkLnJldHVyblR5cGUpIHtcbiAgICByZXR1cm5UeXBlID0gZG9jdW1lbnRlZFZhbHVlVHlwZSh7bGFuZ3VhZ2U6IFwicGhwXCIsIGxvY2F0aW9uOiBkb2N1bWVudGVkLnJldHVyblR5cGUubG9jYXRpb24sIG93bmVyTG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgcmVjb3Jkczogbm9taW5hbE5hbWVzLCBzb3VyY2UsIHNvdXJjZVR5cGU6IGRvY3VtZW50ZWQucmV0dXJuVHlwZS5zb3VyY2VUeXBlLCBzdWJqZWN0OiBgTWV0aG9kICcke25hbWV9JyByZXR1cm5gfSlcbiAgICBpZiAoIXBocERvY3VtZW50ZWROYXRpdmVUeXBlTWF0Y2hlcyhuYXRpdmVSZXR1cm5UeXBlLCBub2RlLm51bGxhYmxlLCByZXR1cm5UeXBlLCBub21pbmFsTmFtZXMpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkb2N1bWVudGVkIG1ldGhvZCByZXR1cm4gdHlwZSBpbmNvbXBhdGlibGUgd2l0aCBuYXRpdmUgdHlwZVwiLCBkb2N1bWVudGVkLnJldHVyblR5cGUubG9jYXRpb24pXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChuYXRpdmVSZXR1cm5UeXBlID09IFwiYXJyYXlcIikgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIGBNZXRob2QgJyR7bmFtZX0nIHJldHVybmAsIGxvY2F0aW9uKVxuICAgIHJldHVyblR5cGUgPSBjb252ZXJ0UmV0dXJuVHlwZShub2RlLnR5cGUsIGBNZXRob2QgJyR7bmFtZX0nIHJldHVybmAsIGxvY2F0aW9uLCBmaWxlbmFtZSwgc291cmNlLCBub21pbmFsTmFtZXMpXG4gIH1cbiAgaWYgKG5vZGUubnVsbGFibGUgJiYgcmV0dXJuVHlwZS5raW5kICE9IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICBpZiAoIW5vZGUudHlwZSkgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIGBNZXRob2QgJyR7bmFtZX0nIHJldHVybmAsIGxvY2F0aW9uKVxuICAgIHJldHVyblR5cGUgPSBudWxsYWJsZVR5cGUoLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gKi8gKHJldHVyblR5cGUpLCBub2RlLnR5cGUsXG4gICAgICBub2RlLnR5cGUubG9jPy5zdGFydC5vZmZzZXQgPz8gMCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgfSBlbHNlIGlmICghbm9kZS5udWxsYWJsZSAmJiByZXR1cm5UeXBlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm9wdGlvbmFsIGFubm90YXRpb24gd2l0aG91dCBudWxsYWJsZSBuYXRpdmUgcmV0dXJuIHR5cGVcIiwgZG9jdW1lbnRlZC5yZXR1cm5UeXBlPy5sb2NhdGlvbiA/PyBsb2NhdGlvbilcbiAgfVxuXG4gIHJldHVybiB7bG9jYXRpb24sIG5hbWUsIG5hbWVMb2NhdGlvbjogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKSwgcGFyYW1ldGVycywgcmV0dXJuVHlwZX1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgc2lnbmF0dXJlLW9ubHkgUEhQIGludGVyZmFjZSBwcm9maWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkNsYXNzfSBub2RlIC0gUGFyc2VyIGludGVyZmFjZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuSW50ZXJmYWNlRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gUHJlZGVjbGFyZWQgaW50ZXJmYWNlIGlkZW50aXR5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuSW50ZXJmYWNlRGVjbGFyYXRpb24+fSBub21pbmFsTmFtZXMgLSBWaXNpYmxlIG5vbWluYWwgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JbnRlcmZhY2VEZWNsYXJhdGlvbn0gU2VtYW50aWMgaW50ZXJmYWNlLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0UGhwSW50ZXJmYWNlKG5vZGUsIGRlY2xhcmF0aW9uLCBub21pbmFsTmFtZXMsIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgcGFyZW50cyA9IC8qKiBAdHlwZSB7cmVhZG9ubHkgaW1wb3J0KFwicGhwLXBhcnNlclwiKS5OYW1lW119ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChub2RlLmV4dGVuZHMgPz8gW10pKVxuXG4gIGlmIChub2RlLmlzQW5vbnltb3VzIHx8IG5vZGUuYXR0ckdyb3Vwcy5sZW5ndGgpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm1hbGZvcm1lZCBpbnRlcmZhY2UgZGVjbGFyYXRpb25cIiwgbG9jYXRpb24pXG4gIGNvbnN0IHBhcmVudFJlZmVyZW5jZXMgPSBwYXJlbnRzLm1hcCgocGFyZW50KSA9PiB7XG4gICAgaWYgKHBhcmVudC5raW5kICE9IFwibmFtZVwiIHx8IHBhcmVudC5yZXNvbHV0aW9uICE9IFwidXFuXCIgfHwgdHlwZW9mIHBhcmVudC5uYW1lICE9IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInF1YWxpZmllZCBvciBkeW5hbWljIGludGVyZmFjZSBwYXJlbnRcIiwgbm9kZUxvY2F0aW9uKHBhcmVudCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIGNvbnN0IHBhcmVudERlY2xhcmF0aW9uID0gbm9taW5hbE5hbWVzLmdldChwYXJlbnQubmFtZSlcblxuICAgIGlmICghcGFyZW50RGVjbGFyYXRpb24/LmlkIHx8IHBhcmVudERlY2xhcmF0aW9uLmtpbmQgIT0gXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYGludGVyZmFjZSBwYXJlbnQgJyR7cGFyZW50Lm5hbWV9JyBpcyBub3QgYSBkZWNsYXJlZCBpbnRlcmZhY2VgLCBub2RlTG9jYXRpb24ocGFyZW50LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJmYWNlVHlwZSgvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhcmVudERlY2xhcmF0aW9uLmlkKSwgbm9kZUxvY2F0aW9uKHBhcmVudCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH0pXG4gIGNvbnN0IG1ldGhvZE5vZGVzID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk1ldGhvZFtdfSAqLyAobm9kZS5ib2R5LmZpbHRlcigobWVtYmVyKSA9PiBtZW1iZXIua2luZCA9PSBcIm1ldGhvZFwiKSlcblxuICBpZiAobWV0aG9kTm9kZXMubGVuZ3RoICE9IG5vZGUuYm9keS5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpbnRlcmZhY2UgbWVtYmVyIG91dHNpZGUgb25lIHNpZ25hdHVyZS1vbmx5IHB1YmxpYyBtZXRob2RcIixcbiAgICAgIG5vZGVMb2NhdGlvbihub2RlLmJvZHkuZmluZCgobWVtYmVyKSA9PiBtZW1iZXIua2luZCAhPSBcIm1ldGhvZFwiKSA/PyBub2RlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBkZWNsYXJhdGlvbi5tZXRob2RzID0gbWV0aG9kTm9kZXMubWFwKChtZXRob2QsIGluZGV4KSA9PiBjb252ZXJ0UGhwSW50ZXJmYWNlTWV0aG9kU2lnbmF0dXJlKG1ldGhvZCwgbm9taW5hbE5hbWVzLFxuICAgIGAke2RlY2xhcmF0aW9uLmlkfTptZXRob2Q6JHtpbmRleH1gLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgY29uc3QgbmFtZU5vZGUgPSB0eXBlb2Ygbm9kZS5uYW1lID09IFwic3RyaW5nXCIgPyBub2RlIDogbm9kZS5uYW1lXG5cbiAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIC4uLmRlY2xhcmF0aW9uLFxuICAgIC4uLihwYXJlbnRSZWZlcmVuY2VzLmxlbmd0aCA+IDAgPyB7ZXh0ZW5kczogcGFyZW50UmVmZXJlbmNlc30gOiB7fSlcbiAgfSwge25hbWU6IG5vZGVMb2NhdGlvbihuYW1lTm9kZSwgZmlsZW5hbWUsIHNvdXJjZSl9KVxufVxuXG4vKipcbiAqIFJlYWRzIG9uZSBleGFjdCBzaWduYXR1cmUtb25seSBQSFAgaW50ZXJmYWNlIG1ldGhvZC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5NZXRob2R9IG5vZGUgLSBQYXJzZXIgaW50ZXJmYWNlIG1ldGhvZC5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkludGVyZmFjZURlY2xhcmF0aW9uPn0gbm9taW5hbE5hbWVzIC0gVmlzaWJsZSBub21pbmFsIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvd25lcklkIC0gU3RhYmxlIGludGVyZmFjZSBtZXRob2QgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkludGVyZmFjZU1ldGhvZERlY2xhcmF0aW9ufSBTZW1hbnRpYyBpbnRlcmZhY2UgbWV0aG9kLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0UGhwSW50ZXJmYWNlTWV0aG9kU2lnbmF0dXJlKG5vZGUsIG5vbWluYWxOYW1lcywgb3duZXJJZCwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBuYW1lID0gdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZS5uYW1lIDogbm9kZS5uYW1lLm5hbWVcblxuICBpZiAobm9kZS52aXNpYmlsaXR5ICE9IFwicHVibGljXCIgfHwgbm9kZS5pc1N0YXRpYyB8fCBub2RlLmlzQWJzdHJhY3QgfHwgbm9kZS5pc0ZpbmFsIHx8IFJlZmxlY3QuZ2V0KG5vZGUsIFwiaXNSZWFkb25seVwiKSB8fFxuICAgIG5vZGUuYnlyZWYgfHwgbm9kZS5udWxsYWJsZSB8fCBub2RlLmF0dHJHcm91cHMubGVuZ3RoIHx8IG5vZGUuYm9keSAhPT0gbnVsbCkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImludGVyZmFjZSBtZXRob2Qgb3V0c2lkZSBvbmUgcHVibGljIHNpZ25hdHVyZS1vbmx5IGRlY2xhcmF0aW9uXCIsIGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGRvY3VtZW50ZWQgPSBmdW5jdGlvbkRvY3VtZW50ZWRUeXBlcygvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRnVuY3Rpb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChub2RlKSksXG4gICAgZmlsZW5hbWUsIHNvdXJjZSwgb3duZXJJZClcblxuICBpZiAoZG9jdW1lbnRlZC5wYXJhbWV0ZXJzLnNpemUgPiAwIHx8IGRvY3VtZW50ZWQucmV0dXJuVHlwZSB8fCBkb2N1bWVudGVkLnR5cGVQYXJhbWV0ZXJzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkb2N1bWVudGVkIGludGVyZmFjZSBtZXRob2QgdHlwZSBhbm5vdGF0aW9uXCIsIGxvY2F0aW9uKVxuICB9XG4gIGlmICghbm9kZS50eXBlKSByZXR1cm4gbWlzc2luZ1R5cGUoXCJwaHBcIiwgYEludGVyZmFjZSBtZXRob2QgJyR7bmFtZX0nIHJldHVybmAsIGxvY2F0aW9uKVxuICBjb25zdCBwYXJhbWV0ZXJzID0gbm9kZS5hcmd1bWVudHMubWFwKChwYXJhbWV0ZXIpID0+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihwYXJhbWV0ZXIsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgY29uc3QgcGFyYW1ldGVyTmFtZSA9IHR5cGVvZiBwYXJhbWV0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gcGFyYW1ldGVyLm5hbWUgOiBwYXJhbWV0ZXIubmFtZS5uYW1lXG5cbiAgICBpZiAocGFyYW1ldGVyLmJ5cmVmIHx8IHBhcmFtZXRlci52YXJpYWRpYyB8fCBwYXJhbWV0ZXIudmFsdWUgfHwgcGFyYW1ldGVyLmZsYWdzIHx8IHBhcmFtZXRlci5yZWFkb25seSB8fCBwYXJhbWV0ZXIubnVsbGFibGUgfHxcbiAgICAgIHBhcmFtZXRlci5ob29rcy5sZW5ndGggfHwgcGFyYW1ldGVyLmF0dHJHcm91cHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgaW50ZXJmYWNlIG1ldGhvZCBwYXJhbWV0ZXJcIiwgcGFyYW1ldGVyTG9jYXRpb24pXG4gICAgfVxuICAgIGlmICghcGFyYW1ldGVyLnR5cGUpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgUGFyYW1ldGVyICcke3BhcmFtZXRlck5hbWV9J2AsIHBhcmFtZXRlckxvY2F0aW9uKVxuICAgIGNvbnN0IHR5cGUgPSBjb252ZXJ0VHlwZShwYXJhbWV0ZXIudHlwZSwgYFBhcmFtZXRlciAnJHtwYXJhbWV0ZXJOYW1lfSdgLCBwYXJhbWV0ZXJMb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSwgbm9taW5hbE5hbWVzKVxuXG4gICAgaWYgKHR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJvcHRpb25hbCBpbnRlcmZhY2UgbWV0aG9kIHBhcmFtZXRlclwiLCBwYXJhbWV0ZXJMb2NhdGlvbilcbiAgICBjb25zdCBuYW1lTm9kZSA9IHR5cGVvZiBwYXJhbWV0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gcGFyYW1ldGVyIDogcGFyYW1ldGVyLm5hbWVcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJQYXJhbWV0ZXJcIiksIGxvY2F0aW9uOiBwYXJhbWV0ZXJMb2NhdGlvbixcbiAgICAgIG5hbWU6IHBhcmFtZXRlck5hbWUsIHR5cGV9LCB7bmFtZTogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gIH0pXG4gIGNvbnN0IHJldHVyblR5cGUgPSBjb252ZXJ0UmV0dXJuVHlwZShub2RlLnR5cGUsIGBJbnRlcmZhY2UgbWV0aG9kICcke25hbWV9JyByZXR1cm5gLCBsb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSwgbm9taW5hbE5hbWVzKVxuXG4gIGlmIChyZXR1cm5UeXBlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwib3B0aW9uYWwgaW50ZXJmYWNlIG1ldGhvZCByZXR1cm5cIiwgbG9jYXRpb24pXG4gIGNvbnN0IG5hbWVOb2RlID0gdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZSA6IG5vZGUubmFtZVxuXG4gIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJJbnRlcmZhY2VNZXRob2REZWNsYXJhdGlvblwiKSwgbG9jYXRpb24sIG5hbWUsIHBhcmFtZXRlcnMsIHJldHVyblR5cGV9LFxuICAgIHtuYW1lOiBub2RlTG9jYXRpb24obmFtZU5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgYm91bmRlZCBmaW5hbC9wcml2YXRlLWZpZWxkIFBIUCByZWZlcmVuY2UtY2xhc3MgcHJvZmlsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5DbGFzc30gbm9kZSAtIFBhcnNlciBjbGFzcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbn0gZGVjbGFyYXRpb24gLSBQcmVkZWNsYXJlZCBjbGFzcyBpZGVudGl0eS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkludGVyZmFjZURlY2xhcmF0aW9uPn0gbm9taW5hbE5hbWVzIC0gVmlzaWJsZSBub21pbmFsIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24+fSByZWNvcmRzIC0gUmVjb3JkcyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbj59IGNsYXNzZXMgLSBDbGFzc2VzIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JbnRlcmZhY2VEZWNsYXJhdGlvbj59IGludGVyZmFjZXMgLSBJbnRlcmZhY2VzIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBQaHBGdW5jdGlvblNpZ25hdHVyZT59IGZ1bmN0aW9ucyAtIFRvcC1sZXZlbCBzaWduYXR1cmVzLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uPn0gZXJyb3JOYW1lcyAtIEVycm9ycyBieSBuYW1lLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uPn0gZXJyb3JzIC0gRXJyb3JzIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9ufSBTZW1hbnRpYyBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gY29udmVydFBocFJlZmVyZW5jZUNsYXNzKG5vZGUsIGRlY2xhcmF0aW9uLCBub21pbmFsTmFtZXMsIHJlY29yZHMsIGNsYXNzZXMsIGludGVyZmFjZXMsIGZ1bmN0aW9ucywgZXJyb3JOYW1lcywgZXJyb3JzLFxuICBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKG5vZGUuaXNBbm9ueW1vdXMgfHwgIW5vZGUuaXNGaW5hbCB8fCBub2RlLmlzUmVhZG9ubHkgfHwgbm9kZS5pc0Fic3RyYWN0IHx8IG5vZGUuZXh0ZW5kcyB8fCBub2RlLmF0dHJHcm91cHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwicmVmZXJlbmNlIGNsYXNzIGluaGVyaXRhbmNlIG9yIG5vbmNhbm9uaWNhbCBtb2RpZmllclwiLCBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBpbXBsZW1lbnRlZFJlZmVyZW5jZXMgPSAvKiogQHR5cGUge3JlYWRvbmx5IGltcG9ydChcInBocC1wYXJzZXJcIikuTmFtZVtdfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAobm9kZS5pbXBsZW1lbnRzID8/IFtdKSlcbiAgICAubWFwKChpbXBsZW1lbnRlZCkgPT4ge1xuICAgIGNvbnN0IGltcGxlbWVudGVkTG9jYXRpb24gPSBub2RlTG9jYXRpb24oaW1wbGVtZW50ZWQsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgICBpZiAoaW1wbGVtZW50ZWQua2luZCAhPSBcIm5hbWVcIiB8fCBpbXBsZW1lbnRlZC5yZXNvbHV0aW9uICE9IFwidXFuXCIgfHwgdHlwZW9mIGltcGxlbWVudGVkLm5hbWUgIT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwicXVhbGlmaWVkIG9yIGR5bmFtaWMgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uXCIsIGltcGxlbWVudGVkTG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGltcGxlbWVudGVkRGVjbGFyYXRpb24gPSBub21pbmFsTmFtZXMuZ2V0KGltcGxlbWVudGVkLm5hbWUpXG5cbiAgICBpZiAoIWltcGxlbWVudGVkRGVjbGFyYXRpb24/LmlkIHx8IGltcGxlbWVudGVkRGVjbGFyYXRpb24ua2luZCAhPSBcIkludGVyZmFjZURlY2xhcmF0aW9uXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBgaW1wbGVtZW50ZWQgaW50ZXJmYWNlICcke2ltcGxlbWVudGVkLm5hbWV9JyBpcyBub3QgYSBkZWNsYXJlZCBpbnRlcmZhY2VgLCBpbXBsZW1lbnRlZExvY2F0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiBpbnRlcmZhY2VUeXBlKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoaW1wbGVtZW50ZWREZWNsYXJhdGlvbi5pZCksIGltcGxlbWVudGVkTG9jYXRpb24pXG4gIH0pXG4gIGNvbnN0IGZpZWxkU3RhdGVtZW50cyA9IG5vZGUuYm9keS5maWx0ZXIoKG1lbWJlcikgPT4gbWVtYmVyLmtpbmQgPT0gXCJwcm9wZXJ0eXN0YXRlbWVudFwiKVxuICBjb25zdCBtZXRob2ROb2RlcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5NZXRob2RbXX0gKi8gKG5vZGUuYm9keS5maWx0ZXIoKG1lbWJlcikgPT4gbWVtYmVyLmtpbmQgPT0gXCJtZXRob2RcIikpXG4gIGNvbnN0IGNvbnN0cnVjdG9ycyA9IG1ldGhvZE5vZGVzLmZpbHRlcigobWV0aG9kKSA9PiAodHlwZW9mIG1ldGhvZC5uYW1lID09IFwic3RyaW5nXCIgPyBtZXRob2QubmFtZSA6IG1ldGhvZC5uYW1lLm5hbWUpID09IFwiX19jb25zdHJ1Y3RcIilcbiAgY29uc3Qgb3JkaW5hcnlNZXRob2RzID0gbWV0aG9kTm9kZXMuZmlsdGVyKChtZXRob2QpID0+ICFjb25zdHJ1Y3RvcnMuaW5jbHVkZXMobWV0aG9kKSlcblxuICBpZiAoY29uc3RydWN0b3JzLmxlbmd0aCAhPSAxIHx8IGZpZWxkU3RhdGVtZW50cy5sZW5ndGggPT0gMCB8fCBmaWVsZFN0YXRlbWVudHMubGVuZ3RoICsgbWV0aG9kTm9kZXMubGVuZ3RoICE9IG5vZGUuYm9keS5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJyZWZlcmVuY2UgY2xhc3MgcmVxdWlyZXMgcHJpdmF0ZSBmaWVsZHMsIG9uZSBjb25zdHJ1Y3RvciwgYW5kIG9yZGluYXJ5IG1ldGhvZHNcIiwgbG9jYXRpb24pXG4gIH1cbiAgZGVjbGFyYXRpb24uZmllbGRzID0gZmllbGRTdGF0ZW1lbnRzLm1hcCgoc3RhdGVtZW50LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkTG9jYXRpb24gPSBub2RlTG9jYXRpb24oc3RhdGVtZW50LCBmaWxlbmFtZSwgc291cmNlKVxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwicHJvcGVydGllc1wiKVxuICAgIGNvbnN0IHByb3BlcnR5ID0gQXJyYXkuaXNBcnJheShwcm9wZXJ0aWVzKSAmJiBwcm9wZXJ0aWVzLmxlbmd0aCA9PSAxID8gcHJvcGVydGllc1swXSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG5hbWVOb2RlID0gcHJvcGVydHk/Lm5hbWVcbiAgICBjb25zdCBuYW1lID0gdHlwZW9mIG5hbWVOb2RlID09IFwic3RyaW5nXCIgPyBuYW1lTm9kZSA6IG5hbWVOb2RlPy5uYW1lXG5cbiAgICBpZiAoUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBcInZpc2liaWxpdHlcIikgIT0gXCJwcml2YXRlXCIgfHwgUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBcImlzU3RhdGljXCIpIHx8XG4gICAgICBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiaXNBYnN0cmFjdFwiKSB8fCBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiaXNGaW5hbFwiKSB8fCAhcHJvcGVydHkgfHxcbiAgICAgIHR5cGVvZiBuYW1lICE9IFwic3RyaW5nXCIgfHwgcHJvcGVydHkudmFsdWUgfHwgcHJvcGVydHkucmVhZG9ubHkgfHwgcHJvcGVydHkubnVsbGFibGUgfHwgcHJvcGVydHkuYXR0ckdyb3Vwcz8ubGVuZ3RoIHx8XG4gICAgICBwcm9wZXJ0eS5ob29rcz8ubGVuZ3RoKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgcHJpdmF0ZSBpbnN0YW5jZSBmaWVsZFwiLCBmaWVsZExvY2F0aW9uKVxuICAgIGNvbnN0IHR5cGUgPSBjb252ZXJ0VHlwZShwcm9wZXJ0eS50eXBlLCBgUHJpdmF0ZSBmaWVsZCAnJHtuYW1lfSdgLCBmaWVsZExvY2F0aW9uLCBmaWxlbmFtZSwgc291cmNlLCBub21pbmFsTmFtZXMpXG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7aWQ6IGAke2RlY2xhcmF0aW9uLmlkfTpmaWVsZDoke2luZGV4fWAsIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlByaXZhdGVGaWVsZFwiKSxcbiAgICAgIGxvY2F0aW9uOiBmaWVsZExvY2F0aW9uLCBuYW1lLCB0eXBlfSwge25hbWU6IG5vZGVMb2NhdGlvbih0eXBlb2YgbmFtZU5vZGUgPT0gXCJzdHJpbmdcIiA/IHByb3BlcnR5IDogbmFtZU5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgfSlcbiAgY29uc3QgY29uc3RydWN0b3JOb2RlID0gY29uc3RydWN0b3JzWzBdXG4gIGNvbnN0IGNvbnN0cnVjdG9yU2lnbmF0dXJlID0gY29udmVydFBocENsYXNzQ2FsbGFibGVTaWduYXR1cmUoY29uc3RydWN0b3JOb2RlLCBub21pbmFsTmFtZXMsXG4gICAgYCR7ZGVjbGFyYXRpb24uaWR9OmNvbnN0cnVjdG9yYCwgdHJ1ZSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBkZWNsYXJhdGlvbi5jb25zdHJ1Y3RvciA9IHdpdGhQYXJzZXJSYW5nZXMoe2JvZHk6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmxvY2t9ICovICh7fSksXG4gICAgaWQ6IGAke2RlY2xhcmF0aW9uLmlkfTpjb25zdHJ1Y3RvcmAsIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkNvbnN0cnVjdG9yRGVjbGFyYXRpb25cIiksXG4gICAgbG9jYXRpb246IGNvbnN0cnVjdG9yU2lnbmF0dXJlLmxvY2F0aW9uLCBwYXJhbWV0ZXJzOiBjb25zdHJ1Y3RvclNpZ25hdHVyZS5wYXJhbWV0ZXJzfSwge2NvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvclNpZ25hdHVyZS5uYW1lTG9jYXRpb259KVxuICBjb25zdCBtZXRob2RTaWduYXR1cmVzID0gb3JkaW5hcnlNZXRob2RzLm1hcCgobWV0aG9kLCBpbmRleCkgPT4gY29udmVydFBocENsYXNzQ2FsbGFibGVTaWduYXR1cmUobWV0aG9kLCBub21pbmFsTmFtZXMsXG4gICAgYCR7ZGVjbGFyYXRpb24uaWR9Om1ldGhvZDoke2luZGV4fWAsIGZhbHNlLCBmaWxlbmFtZSwgc291cmNlKSlcblxuICBkZWNsYXJhdGlvbi5tZXRob2RzID0gbWV0aG9kU2lnbmF0dXJlcy5tYXAoKHNpZ25hdHVyZSwgaW5kZXgpID0+IHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIGJvZHk6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmxvY2t9ICovICh7fSksIGlkOiBgJHtkZWNsYXJhdGlvbi5pZH06bWV0aG9kOiR7aW5kZXh9YCxcbiAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJNZXRob2REZWNsYXJhdGlvblwiKSwgbG9jYXRpb246IHNpZ25hdHVyZS5sb2NhdGlvbiwgbmFtZTogc2lnbmF0dXJlLm5hbWUsXG4gICAgcGFyYW1ldGVyczogc2lnbmF0dXJlLnBhcmFtZXRlcnMsXG4gICAgcmV0dXJuVHlwZTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gKi8gKHNpZ25hdHVyZS5yZXR1cm5UeXBlKVxuICB9LCB7bmFtZTogc2lnbmF0dXJlLm5hbWVMb2NhdGlvbn0pKVxuICBpZiAoaW1wbGVtZW50ZWRSZWZlcmVuY2VzLmxlbmd0aCA+IDApIGRlY2xhcmF0aW9uLmltcGxlbWVudHMgPSBpbXBsZW1lbnRlZFJlZmVyZW5jZXNcbiAgY29uc3QgYmFzZSA9IHtiaW5kaW5nczogbmV3IE1hcCgpLCBjbGFzc2VzLCBjdXJyZW50Q2xhc3M6IGRlY2xhcmF0aW9uLCBlcnJvck5hbWVzLCBlcnJvcnMsIGZ1bmN0aW9ucyxcbiAgICBpbnRlcmZhY2VzLCByZWNvcmROYW1lczogbm9taW5hbE5hbWVzLCByZWNvcmRzfVxuXG4gIGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmJvZHkgPSBjb252ZXJ0QmxvY2soLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJsb2NrfSAqLyAoY29uc3RydWN0b3JOb2RlLmJvZHkpLCBmaWxlbmFtZSwgc291cmNlLFxuICAgIHsuLi5iYXNlLCBiaW5kaW5nczogbmV3IE1hcChkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PiBbcGFyYW1ldGVyLm5hbWUsIHBhcmFtZXRlci50eXBlXSkpLFxuICAgICAgcmV0dXJuVHlwZToge2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlR5cGVSZWZlcmVuY2VcIiksIG5hbWU6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInZvaWRcIil9fSlcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG9yZGluYXJ5TWV0aG9kcy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCBtZXRob2QgPSBkZWNsYXJhdGlvbi5tZXRob2RzW2luZGV4XVxuXG4gICAgbWV0aG9kLmJvZHkgPSBjb252ZXJ0QmxvY2soLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJsb2NrfSAqLyAob3JkaW5hcnlNZXRob2RzW2luZGV4XS5ib2R5KSwgZmlsZW5hbWUsIHNvdXJjZSxcbiAgICAgIHsuLi5iYXNlLCBiaW5kaW5nczogbmV3IE1hcChtZXRob2QucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gW3BhcmFtZXRlci5uYW1lLCBwYXJhbWV0ZXIudHlwZV0pKSwgcmV0dXJuVHlwZTogbWV0aG9kLnJldHVyblR5cGV9KVxuICB9XG4gIGNvbnN0IG5hbWVOb2RlID0gdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZSA6IG5vZGUubmFtZVxuXG4gIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKGRlY2xhcmF0aW9uLCB7bmFtZTogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKX0pXG59XG5cbi8qKlxuICogQ29udmVydHMgb25lIGV4YWN0IGZpbmFsIHJlYWRvbmx5IHByb21vdGVkLXByb3BlcnR5IFBIUCByZWNvcmQuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuQ2xhc3N9IG5vZGUgLSBQSFAgY2xhc3MgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSBkZWNsYXJhdGlvbiAtIFByZWRlY2xhcmVkIG5vbWluYWwgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uPn0gcmVjb3JkTmFtZXMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSBTZW1hbnRpYyByZWNvcmQuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRQaHBSZWNvcmQobm9kZSwgZGVjbGFyYXRpb24sIHJlY29yZE5hbWVzLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGdlbmVyaWMgPSAoZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCA/PyAwKSA+IDBcblxuICBpZiAobm9kZS5pc0Fub255bW91cyB8fCAhbm9kZS5pc0ZpbmFsIHx8IG5vZGUuaXNSZWFkb25seSA9PSBnZW5lcmljIHx8IG5vZGUuaXNBYnN0cmFjdCB8fCBub2RlLmV4dGVuZHMgfHwgbm9kZS5pbXBsZW1lbnRzPy5sZW5ndGggfHxcbiAgICBub2RlLmF0dHJHcm91cHMubGVuZ3RoKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgcmVjb3JkIGNsYXNzIG1vZGlmaWVyc1wiLCBsb2NhdGlvbilcbiAgaWYgKG5vZGUuYm9keS5sZW5ndGggPCAxIHx8IG5vZGUuYm9keVswXS5raW5kICE9IFwibWV0aG9kXCIgfHwgIWdlbmVyaWMgJiYgbm9kZS5ib2R5Lmxlbmd0aCAhPSAxKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwicmVjb3JkIGNsYXNzIGJvZHkgb3V0c2lkZSBvbmUgY29uc3RydWN0b3JcIiwgbm9kZUxvY2F0aW9uKG5vZGUuYm9keVsxXSA/PyBub2RlLmJvZHlbMF0gPz8gbm9kZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgY29uc3QgY29uc3RydWN0b3IgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTWV0aG9kfSAqLyAobm9kZS5ib2R5WzBdKVxuICBjb25zdCB0eXBlUGFyYW1ldGVyTmFtZXMgPSBuZXcgTWFwKChkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA/PyBbXSkubWFwKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIubmFtZSwgcGFyYW1ldGVyXSkpXG4gIGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IHR5cGVvZiBjb25zdHJ1Y3Rvci5uYW1lID09IFwic3RyaW5nXCIgPyBjb25zdHJ1Y3Rvci5uYW1lIDogY29uc3RydWN0b3IubmFtZS5uYW1lXG5cbiAgaWYgKGNvbnN0cnVjdG9yTmFtZSAhPSBcIl9fY29uc3RydWN0XCIgfHwgY29uc3RydWN0b3IudmlzaWJpbGl0eSAhPSBcInB1YmxpY1wiIHx8IGNvbnN0cnVjdG9yLmlzU3RhdGljIHx8IGNvbnN0cnVjdG9yLmlzQWJzdHJhY3QgfHxcbiAgICBjb25zdHJ1Y3Rvci5pc0ZpbmFsIHx8IFJlZmxlY3QuZ2V0KGNvbnN0cnVjdG9yLCBcImlzUmVhZG9ubHlcIikgfHwgY29uc3RydWN0b3IuYnlyZWYgfHwgY29uc3RydWN0b3IudHlwZSB8fCBjb25zdHJ1Y3Rvci5udWxsYWJsZSB8fFxuICAgIGNvbnN0cnVjdG9yLmF0dHJHcm91cHMubGVuZ3RoIHx8ICFjb25zdHJ1Y3Rvci5ib2R5IHx8IGNvbnN0cnVjdG9yLmJvZHkuY2hpbGRyZW4ubGVuZ3RoICE9IDApIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgcmVjb3JkIGNvbnN0cnVjdG9yXCIsIG5vZGVMb2NhdGlvbihjb25zdHJ1Y3RvciwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgY29uc3QgZG9jdW1lbnRlZCA9IGZ1bmN0aW9uRG9jdW1lbnRlZFR5cGVzKC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5GdW5jdGlvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGNvbnN0cnVjdG9yKSksIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgZGVjbGFyYXRpb24uZmllbGRzID0gY29uc3RydWN0b3IuYXJndW1lbnRzLm1hcCgocGFyYW1ldGVyKSA9PiB7XG4gICAgY29uc3QgZmllbGRMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihwYXJhbWV0ZXIsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgY29uc3QgbmFtZSA9IHR5cGVvZiBwYXJhbWV0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gcGFyYW1ldGVyLm5hbWUgOiBwYXJhbWV0ZXIubmFtZS5uYW1lXG4gICAgY29uc3QgZG9jdW1lbnRlZFR5cGUgPSBkb2N1bWVudGVkLnBhcmFtZXRlcnMuZ2V0KG5hbWUpXG4gICAgY29uc3QgbmF0aXZlVHlwZSA9IHBocFR5cGVOYW1lKHBhcmFtZXRlci50eXBlKVxuXG4gICAgaWYgKHBhcmFtZXRlci5mbGFncyAhPSAoZ2VuZXJpYyA/IDQgOiAxKSB8fCBwYXJhbWV0ZXIuYnlyZWYgfHwgcGFyYW1ldGVyLnZhcmlhZGljIHx8IHBhcmFtZXRlci52YWx1ZSB8fCBwYXJhbWV0ZXIucmVhZG9ubHkgfHxcbiAgICAgIHBhcmFtZXRlci5ob29rcy5sZW5ndGggfHwgcGFyYW1ldGVyLmF0dHJHcm91cHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJyZWNvcmQgZmllbGQgb3V0c2lkZSBwdWJsaWMgcHJvbW90ZWQtcHJvcGVydHkgcHJvZmlsZVwiLCBmaWVsZExvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAobmF0aXZlVHlwZSA9PSBcImFycmF5XCIgJiYgIWRvY3VtZW50ZWRUeXBlKSByZXR1cm4gbWlzc2luZ1R5cGUoXCJwaHBcIiwgYFJlY29yZCBmaWVsZCAnJHtuYW1lfSdgLCBmaWVsZExvY2F0aW9uKVxuICAgIGxldCB0eXBlID0gZG9jdW1lbnRlZFR5cGVcbiAgICAgID8gZG9jdW1lbnRlZFZhbHVlVHlwZSh7bGFuZ3VhZ2U6IFwicGhwXCIsIGxvY2F0aW9uOiBkb2N1bWVudGVkVHlwZS5sb2NhdGlvbiwgb3duZXJMb2NhdGlvbjogZmllbGRMb2NhdGlvbiwgcmVjb3JkczogcmVjb3JkTmFtZXMsXG4gICAgICAgIHNvdXJjZSwgc291cmNlVHlwZTogZG9jdW1lbnRlZFR5cGUuc291cmNlVHlwZSwgc3ViamVjdDogYFJlY29yZCBmaWVsZCAnJHtuYW1lfSdgLCB0eXBlUGFyYW1ldGVyczogdHlwZVBhcmFtZXRlck5hbWVzfSlcbiAgICAgIDogY29udmVydFR5cGUocGFyYW1ldGVyLnR5cGUsIGBSZWNvcmQgZmllbGQgJyR7bmFtZX0nYCwgZmllbGRMb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSwgcmVjb3JkTmFtZXMpXG5cbiAgICBpZiAoZG9jdW1lbnRlZFR5cGUgJiYgIXBocERvY3VtZW50ZWROYXRpdmVUeXBlTWF0Y2hlcyhuYXRpdmVUeXBlLCBwYXJhbWV0ZXIubnVsbGFibGUsIHR5cGUsIHJlY29yZE5hbWVzKSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZG9jdW1lbnRlZCByZWNvcmQgZmllbGQgdHlwZSBpbmNvbXBhdGlibGUgd2l0aCBuYXRpdmUgdHlwZVwiLCBkb2N1bWVudGVkVHlwZS5sb2NhdGlvbilcbiAgICB9XG5cbiAgICBpZiAocGFyYW1ldGVyLm51bGxhYmxlICYmIHR5cGUua2luZCAhPSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICBpZiAoIXBhcmFtZXRlci50eXBlKSByZXR1cm4gbWlzc2luZ1R5cGUoXCJwaHBcIiwgYFJlY29yZCBmaWVsZCAnJHtuYW1lfSdgLCBmaWVsZExvY2F0aW9uKVxuICAgICAgdHlwZSA9IG51bGxhYmxlVHlwZSh0eXBlLCBwYXJhbWV0ZXIudHlwZSwgcGFyYW1ldGVyLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgfSBlbHNlIGlmICghcGFyYW1ldGVyLm51bGxhYmxlICYmIHR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmIHR5cGUudmFsdWVUeXBlLmtpbmQgIT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwib3B0aW9uYWwgYW5ub3RhdGlvbiB3aXRob3V0IG51bGxhYmxlIG5hdGl2ZSByZWNvcmQgZmllbGRcIiwgZG9jdW1lbnRlZFR5cGU/LmxvY2F0aW9uID8/IGZpZWxkTG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGZpZWxkID0ge2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlJlY29yZEZpZWxkXCIpLCBsb2NhdGlvbjogZmllbGRMb2NhdGlvbiwgbmFtZSwgdHlwZX1cbiAgICBjb25zdCBuYW1lTm9kZSA9IHR5cGVvZiBwYXJhbWV0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gcGFyYW1ldGVyIDogcGFyYW1ldGVyLm5hbWVcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKGZpZWxkLCB7bmFtZTogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gIH0pXG4gIGNvbnN0IGV4dHJhRG9jdW1lbnRlZCA9IFsuLi5kb2N1bWVudGVkLnBhcmFtZXRlcnMua2V5cygpXS5maW5kKChuYW1lKSA9PlxuICAgICFjb25zdHJ1Y3Rvci5hcmd1bWVudHMuc29tZSgocGFyYW1ldGVyKSA9PiAodHlwZW9mIHBhcmFtZXRlci5uYW1lID09IFwic3RyaW5nXCIgPyBwYXJhbWV0ZXIubmFtZSA6IHBhcmFtZXRlci5uYW1lLm5hbWUpID09IG5hbWUpKVxuXG4gIGlmIChleHRyYURvY3VtZW50ZWQgfHwgZG9jdW1lbnRlZC5yZXR1cm5UeXBlKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpbnZhbGlkIHJlY29yZCBjb25zdHJ1Y3RvciBhbm5vdGF0aW9uXCIsIGxvY2F0aW9uKVxuICBpZiAoZ2VuZXJpYykgdmFsaWRhdGVQaHBHZW5lcmljUmVjb3JkR2V0dGVycyhub2RlLCBkZWNsYXJhdGlvbiwgcmVjb3JkTmFtZXMsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IG5hbWVOb2RlID0gdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZSA6IG5vZGUubmFtZVxuXG4gIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKGRlY2xhcmF0aW9uLCB7bmFtZTogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKX0pXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBleGFjdCBhY2Nlc3NvciBoYWxmIG9mIFBIUCdzIGRvY3VtZW50ZWQgZ2VuZXJpYy1yZWNvcmQgcHJvZmlsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5DbGFzc30gbm9kZSAtIFBIUCBjbGFzcyBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gQ29udmVydGVkIHJlY29yZC5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24+fSByZWNvcmROYW1lcyAtIFZpc2libGUgcmVjb3Jkcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQaHBHZW5lcmljUmVjb3JkR2V0dGVycyhub2RlLCBkZWNsYXJhdGlvbiwgcmVjb3JkTmFtZXMsIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgY29uc3QgZ2V0dGVycyA9IG5vZGUuYm9keS5zbGljZSgxKVxuICBjb25zdCB0eXBlUGFyYW1ldGVycyA9IG5ldyBNYXAoKGRlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzID8/IFtdKS5tYXAoKHBhcmFtZXRlcikgPT4gW3BhcmFtZXRlci5uYW1lLCBwYXJhbWV0ZXJdKSlcblxuICBpZiAoZ2V0dGVycy5sZW5ndGggIT0gZGVjbGFyYXRpb24uZmllbGRzLmxlbmd0aCkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImdlbmVyaWMgcmVjb3JkIGdldHRlciBjb3VudFwiLCBub2RlTG9jYXRpb24oZ2V0dGVyc1tkZWNsYXJhdGlvbi5maWVsZHMubGVuZ3RoXSA/PyBub2RlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBnZXR0ZXJzLmZvckVhY2goKGNhbmRpZGF0ZSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IGRlY2xhcmF0aW9uLmZpZWxkc1tpbmRleF1cblxuICAgIGlmIChjYW5kaWRhdGUua2luZCAhPSBcIm1ldGhvZFwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgZ2VuZXJpYyByZWNvcmQgZ2V0dGVyXCIsIG5vZGVMb2NhdGlvbihjYW5kaWRhdGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIGNvbnN0IGdldHRlciA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5NZXRob2R9ICovIChjYW5kaWRhdGUpXG4gICAgY29uc3QgbmFtZSA9IHR5cGVvZiBnZXR0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gZ2V0dGVyLm5hbWUgOiBnZXR0ZXIubmFtZS5uYW1lXG4gICAgY29uc3Qgc3RhdGVtZW50ID0gZ2V0dGVyLmJvZHk/LmNoaWxkcmVuWzBdXG4gICAgY29uc3QgcmV0dXJuZWQgPSBzdGF0ZW1lbnQ/LmtpbmQgPT0gXCJyZXR1cm5cIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5SZXR1cm59ICovIChzdGF0ZW1lbnQpLmV4cHIgOiB1bmRlZmluZWRcbiAgICBjb25zdCBsb29rdXAgPSByZXR1cm5lZD8ua2luZCA9PSBcInByb3BlcnR5bG9va3VwXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuUHJvcGVydHlMb29rdXB9ICovIChyZXR1cm5lZCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCByZWNlaXZlciA9IGxvb2t1cD8ud2hhdC5raW5kID09IFwidmFyaWFibGVcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5WYXJpYWJsZX0gKi8gKGxvb2t1cC53aGF0KSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG1lbWJlciA9IGxvb2t1cD8ub2Zmc2V0LmtpbmQgPT0gXCJpZGVudGlmaWVyXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKGxvb2t1cC5vZmZzZXQpIDogdW5kZWZpbmVkXG5cbiAgICBpZiAobmFtZSAhPSBmaWVsZC5uYW1lIHx8IGdldHRlci52aXNpYmlsaXR5ICE9IFwicHVibGljXCIgfHwgZ2V0dGVyLmlzU3RhdGljIHx8IGdldHRlci5pc0Fic3RyYWN0IHx8IGdldHRlci5pc0ZpbmFsIHx8XG4gICAgICBSZWZsZWN0LmdldChnZXR0ZXIsIFwiaXNSZWFkb25seVwiKSB8fCBnZXR0ZXIuYnlyZWYgfHwgZ2V0dGVyLmFyZ3VtZW50cy5sZW5ndGggfHwgZ2V0dGVyLmF0dHJHcm91cHMubGVuZ3RoIHx8XG4gICAgICAhZ2V0dGVyLmJvZHkgfHwgZ2V0dGVyLmJvZHkuY2hpbGRyZW4ubGVuZ3RoICE9IDEgfHwgcmVjZWl2ZXI/Lm5hbWUgIT0gXCJ0aGlzXCIgfHwgbWVtYmVyPy5uYW1lICE9IGZpZWxkLm5hbWUpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm5vbmNhbm9uaWNhbCBnZW5lcmljIHJlY29yZCBnZXR0ZXJcIiwgbm9kZUxvY2F0aW9uKGdldHRlciwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIGNvbnN0IGRvY3VtZW50ZWQgPSBmdW5jdGlvbkRvY3VtZW50ZWRUeXBlcyhcbiAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5GdW5jdGlvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGdldHRlcikpLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gICAgaWYgKGRvY3VtZW50ZWQucGFyYW1ldGVycy5zaXplIHx8IGRvY3VtZW50ZWQudHlwZVBhcmFtZXRlcnMgfHwgIWRvY3VtZW50ZWQucmV0dXJuVHlwZSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibWlzc2luZyBvciBpbnZhbGlkIGdlbmVyaWMgcmVjb3JkIGdldHRlciB0eXBlXCIsIG5vZGVMb2NhdGlvbihnZXR0ZXIsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICBjb25zdCByZXR1cm5UeXBlID0gZG9jdW1lbnRlZFZhbHVlVHlwZSh7bGFuZ3VhZ2U6IFwicGhwXCIsIGxvY2F0aW9uOiBkb2N1bWVudGVkLnJldHVyblR5cGUubG9jYXRpb24sXG4gICAgICBvd25lckxvY2F0aW9uOiBub2RlTG9jYXRpb24oZ2V0dGVyLCBmaWxlbmFtZSwgc291cmNlKSwgcmVjb3JkczogcmVjb3JkTmFtZXMsIHNvdXJjZSxcbiAgICAgIHNvdXJjZVR5cGU6IGRvY3VtZW50ZWQucmV0dXJuVHlwZS5zb3VyY2VUeXBlLCBzdWJqZWN0OiBgUmVjb3JkIGdldHRlciAnJHtuYW1lfSdgLCB0eXBlUGFyYW1ldGVyc30pXG4gICAgY29uc3QgbmF0aXZlVHlwZSA9IHBocFR5cGVOYW1lKGdldHRlci50eXBlKVxuXG4gICAgaWYgKCFwaHBEb2N1bWVudGVkTmF0aXZlVHlwZU1hdGNoZXMobmF0aXZlVHlwZSwgZ2V0dGVyLm51bGxhYmxlLCByZXR1cm5UeXBlLCByZWNvcmROYW1lcykgfHxcbiAgICAgICFzYW1lVmFsdWVUeXBlKHJldHVyblR5cGUsIGZpZWxkLnR5cGUpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJnZW5lcmljIHJlY29yZCBnZXR0ZXIgdHlwZSBtaXNtYXRjaFwiLCBkb2N1bWVudGVkLnJldHVyblR5cGUubG9jYXRpb24pXG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBleGlzdGluZyBQSFAgaWYvZWxzZSB0ZXJtaW5hbCB3aXRoIHJlc3RyaWN0ZWQgYnJhbmNoIHByZWZpeGVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklmfSBub2RlIC0gUEhQIGlmIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JZlN0YXRlbWVudH0gU2VtYW50aWMgYnJhbmNoLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0SWYobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIGlmIChub2RlLnNob3J0Rm9ybSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiYWx0ZXJuYXRpdmUgaWYgc3ludGF4XCIsIGxvY2F0aW9uKVxuICBpZiAobm9kZS5ib2R5LmtpbmQgIT0gXCJibG9ja1wiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpZiB3aXRob3V0IGJsb2NrIGNvbnNlcXVlbnRcIiwgbG9jYXRpb24pXG4gIGlmIChub2RlLnRlc3Qua2luZCA9PSBcInZhcmlhYmxlXCIpIHtcbiAgICBjb25zdCB0ZXN0ZWQgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVmFyaWFibGV9ICovIChub2RlLnRlc3QpXG5cbiAgICBpZiAodHlwZW9mIHRlc3RlZC5uYW1lID09IFwic3RyaW5nXCIgJiYgY29udGV4dC5iaW5kaW5ncy5nZXQodGVzdGVkLm5hbWUpPy5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm9wdGlvbmFsIHRydXRoaW5lc3MgY29uZGl0aW9uXCIsIG5vZGVMb2NhdGlvbih0ZXN0ZWQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbmRpdGlvbiA9IGNvbnZlcnRFeHByZXNzaW9uKG5vZGUudGVzdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgY29uc3QgY29uc2VxdWVudENvbnRleHQgPSB7Li4uY29udGV4dCwgYmluZGluZ3M6IG5ldyBNYXAoY29udGV4dC5iaW5kaW5ncyl9XG4gIGNvbnN0IGFsdGVybmF0ZUNvbnRleHQgPSB7Li4uY29udGV4dCwgYmluZGluZ3M6IG5ldyBNYXAoY29udGV4dC5iaW5kaW5ncyl9XG4gIGxldCBhbHRlcm5hdGVcblxuICBpZiAobm9kZS5hbHRlcm5hdGUpIHtcbiAgICBpZiAobm9kZS5hbHRlcm5hdGUua2luZCA9PSBcImJsb2NrXCIpIHtcbiAgICAgIGFsdGVybmF0ZSA9IGNvbnZlcnRCbG9jaygvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQmxvY2t9ICovIChub2RlLmFsdGVybmF0ZSksIGZpbGVuYW1lLCBzb3VyY2UsIGFsdGVybmF0ZUNvbnRleHQpXG4gICAgfSBlbHNlIGlmIChub2RlLmFsdGVybmF0ZS5raW5kID09IFwiaWZcIikge1xuICAgICAgY29uc3QgbmVzdGVkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklmfSAqLyAobm9kZS5hbHRlcm5hdGUpXG5cbiAgICAgIGFsdGVybmF0ZSA9IHtcbiAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiQmxvY2tcIiksXG4gICAgICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24obmVzdGVkLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgICAgc3RhdGVtZW50czogW2NvbnZlcnRJZihuZXN0ZWQsIGZpbGVuYW1lLCBzb3VyY2UsIGFsdGVybmF0ZUNvbnRleHQpXVxuICAgICAgfVxuICAgIH0gZWxzZSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYGlmIGFsdGVybmF0ZSAke25vZGUuYWx0ZXJuYXRlLmtpbmR9YCwgbm9kZUxvY2F0aW9uKG5vZGUuYWx0ZXJuYXRlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uKGFsdGVybmF0ZSA/IHthbHRlcm5hdGV9IDoge30pLFxuICAgIGNvbmRpdGlvbixcbiAgICBjb25zZXF1ZW50OiBjb252ZXJ0QmxvY2sobm9kZS5ib2R5LCBmaWxlbmFtZSwgc291cmNlLCBjb25zZXF1ZW50Q29udGV4dCksXG4gICAga2luZDogXCJJZlN0YXRlbWVudFwiLFxuICAgIGxvY2F0aW9uXG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBleGFjdCBicmFjZWQgUEhQIGB3aGlsZSAoJGNvbmRpdGlvbikgeyAuLi4gfWAgc3ludGF4LlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLldoaWxlfSBub2RlIC0gUEhQIHdoaWxlIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5XaGlsZVN0YXRlbWVudH0gU2VtYW50aWMgbG9vcC5cbiAqL1xuZnVuY3Rpb24gY29udmVydFdoaWxlKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAobm9kZS5zaG9ydEZvcm0pIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImFsdGVybmF0aXZlIHdoaWxlIHN5bnRheFwiLCBsb2NhdGlvbilcbiAgaWYgKCFub2RlLmJvZHkgfHwgbm9kZS5ib2R5LmtpbmQgIT0gXCJibG9ja1wiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwid2hpbGUgd2l0aG91dCBibG9jayBib2R5XCIsIG5vZGUuYm9keSA/IG5vZGVMb2NhdGlvbihub2RlLmJvZHksIGZpbGVuYW1lLCBzb3VyY2UpIDogbG9jYXRpb24pXG4gIH1cbiAgY29uc3QgYm9keUNvbnRleHQgPSB7Li4uY29udGV4dCwgYmluZGluZ3M6IG5ldyBNYXAoY29udGV4dC5iaW5kaW5ncyl9XG5cbiAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIGJvZHk6IGNvbnZlcnRCbG9jaygvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQmxvY2t9ICovIChub2RlLmJvZHkpLCBmaWxlbmFtZSwgc291cmNlLCBib2R5Q29udGV4dCksXG4gICAgY29uZGl0aW9uOiBjb252ZXJ0RXhwcmVzc2lvbihub2RlLnRlc3QsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsIHVuZGVmaW5lZCwgdHJ1ZSksXG4gICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiV2hpbGVTdGF0ZW1lbnRcIiksXG4gICAgbG9jYXRpb25cbiAgfSwge2tleXdvcmQ6IHRva2VuTG9jYXRpb24oXCJ3aGlsZVwiLCBub2RlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIG5vZGUudGVzdC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKX0pXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBQSFAgZWNobyBlbnRyeSBwb2ludC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5FY2hvfSBub2RlIC0gUEhQIGVjaG8gbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge1BocENvbnZlcnNpb25Db250ZXh0fSBjb250ZXh0IC0gVHlwZWQgY29udmVyc2lvbiBjb250ZXh0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlByaW50U3RhdGVtZW50fSBQcmludCBzdGF0ZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRQcmludChub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKG5vZGUuZXhwcmVzc2lvbnMubGVuZ3RoICE9IDIgfHwgbm9kZS5leHByZXNzaW9uc1sxXS5raW5kICE9IFwibmFtZVwiIHx8XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5hbWV9ICovIChub2RlLmV4cHJlc3Npb25zWzFdKS5uYW1lICE9IFwiUEhQX0VPTFwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZWNobyB3aXRob3V0IG9uZSBleHByZXNzaW9uIGFuZCBQSFBfRU9MXCIsIGxvY2F0aW9uKVxuICB9XG5cbiAgcmV0dXJuIHtleHByZXNzaW9uOiBjb252ZXJ0RXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb25zWzBdLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSwga2luZDogXCJQcmludFN0YXRlbWVudFwiLCBsb2NhdGlvbn1cbn1cblxuLyoqXG4gKiBQYXJzZXMgUEhQIGludG8gdGhlIHNoYXJlZCBzZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBQYXJzZXIgaW5wdXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuc291cmNlIC0gU291cmNlIHRleHQuXG4gKiBAcGFyYW0ge3JlYWRvbmx5IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbltdfSBbaW5wdXQuY2FwYWJpbGl0aWVzXSAtIENvbXBpbGVyLWF1dGhvcml6ZWQgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHt7aXNFbnRyeTogYm9vbGVhbiwgZnVuY3Rpb25zOiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPiwgcmVjb3JkczogTWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24+LCBlcnJvcnM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uPn19IFtpbnB1dC5wcm9ncmFtXSAtIFJlc29sdmVkIHByb2dyYW0gaW1wb3J0cyBhbmQgZW50cnkgcm9sZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gU2VtYW50aWMgbW9kdWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQaHAoe2NhcGFiaWxpdGllcyA9IFtdLCBmaWxlbmFtZSwgc291cmNlLCBwcm9ncmFtOiBwcm9ncmFtQ29udGV4dH0pIHtcbiAgY29uc3QgcHJvZ3JhbSA9IHBhcnNlUGhwUHJvZ3JhbShmaWxlbmFtZSwgc291cmNlKVxuICB2YWxpZGF0ZURlY2xhcmVOb2Rlcyhwcm9ncmFtLmNoaWxkcmVuLCBmaWxlbmFtZSwgc291cmNlKVxuICBsZXQgYm9keSA9IHRhc2swMzRQaHBCb2R5KHByb2dyYW0uY2hpbGRyZW4sIGNhcGFiaWxpdGllcywgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAocHJvZ3JhbUNvbnRleHQpIHtcbiAgICBpbnNwZWN0UGhwTW9kdWxlKHtmaWxlbmFtZSwgc291cmNlfSlcbiAgICBjb25zdCBuYW1lc3BhY2UgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTmFtZXNwYWNlfSAqLyAoYm9keS5maW5kKChub2RlKSA9PiBub2RlLmtpbmQgPT0gXCJuYW1lc3BhY2VcIikpXG5cbiAgICBib2R5ID0gbmFtZXNwYWNlLmNoaWxkcmVuLmZpbHRlcigobm9kZSkgPT4gbm9kZS5raW5kICE9IFwidXNlZ3JvdXBcIiAmJiAhaXNQaHBSZXF1aXJlT25jZShub2RlKSlcbiAgfVxuICBjb25zdCBpbnRlcmZhY2VOb2RlcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5DbGFzc1tdfSAqLyAoYm9keS5maWx0ZXIoKG5vZGUpID0+IG5vZGUua2luZCA9PSBcImludGVyZmFjZVwiKSlcbiAgY29uc3QgY2xhc3NOb2RlcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5DbGFzc1tdfSAqLyAoYm9keS5maWx0ZXIoKG5vZGUpID0+IG5vZGUua2luZCA9PSBcImNsYXNzXCIpKVxuICBjb25zdCBlcnJvck5vZGVzID0gY2xhc3NOb2Rlcy5maWx0ZXIoKG5vZGUpID0+IG5vZGUuZXh0ZW5kcz8ua2luZCA9PSBcIm5hbWVcIiAmJlxuICAgIFtcIlJ1bnRpbWVFeGNlcHRpb25cIiwgXCJcXFxcUnVudGltZUV4Y2VwdGlvblwiXS5pbmNsdWRlcyhub2RlLmV4dGVuZHMubmFtZSkpXG4gIGNvbnN0IHJlZmVyZW5jZUNsYXNzTm9kZXMgPSBjbGFzc05vZGVzLmZpbHRlcigobm9kZSkgPT4gIWVycm9yTm9kZXMuaW5jbHVkZXMobm9kZSkgJiZcbiAgICBub2RlLmJvZHkuc29tZSgobWVtYmVyKSA9PiBtZW1iZXIua2luZCA9PSBcInByb3BlcnR5c3RhdGVtZW50XCIpKVxuICBjb25zdCByZWNvcmROb2RlcyA9IGNsYXNzTm9kZXMuZmlsdGVyKChub2RlKSA9PiAhZXJyb3JOb2Rlcy5pbmNsdWRlcyhub2RlKSAmJiAhcmVmZXJlbmNlQ2xhc3NOb2Rlcy5pbmNsdWRlcyhub2RlKSlcbiAgY29uc3QgZXJyb3JEZWNsYXJhdGlvbnMgPSBlcnJvck5vZGVzLm1hcCgobm9kZSwgaW5kZXgpID0+ICh7XG4gICAgaWQ6IGBlcnJvcjoke2luZGV4fWAsXG4gICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiRXJyb3JEZWNsYXJhdGlvblwiKSxcbiAgICBsb2NhdGlvbjogbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpLFxuICAgIG5hbWU6IHR5cGVvZiBub2RlLm5hbWUgPT0gXCJzdHJpbmdcIiA/IG5vZGUubmFtZSA6IG5vZGUubmFtZS5uYW1lXG4gIH0pKVxuICBjb25zdCByZWNvcmREZWNsYXJhdGlvbnMgPSByZWNvcmROb2Rlcy5tYXAoKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgaWQgPSBgcmVjb3JkOiR7aW5kZXh9YFxuICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJzID0gY2xhc3NEb2N1bWVudGVkVHlwZVBhcmFtZXRlcnMobm9kZSwgaWQsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgICByZXR1cm4ge1xuICAgICAgZmllbGRzOiBbXSxcbiAgICAgIGlkLFxuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUmVjb3JkRGVjbGFyYXRpb25cIiksXG4gICAgICBsb2NhdGlvbjogbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpLFxuICAgICAgbmFtZTogdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZS5uYW1lIDogbm9kZS5uYW1lLm5hbWUsXG4gICAgICAuLi4odHlwZVBhcmFtZXRlcnMgPyB7dHlwZVBhcmFtZXRlcnN9IDoge30pXG4gICAgfVxuICB9KVxuICBjb25zdCBjbGFzc0RlY2xhcmF0aW9ucyA9IHJlZmVyZW5jZUNsYXNzTm9kZXMubWFwKChub2RlLCBpbmRleCkgPT4gKHtcbiAgICBjb25zdHJ1Y3RvcjogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9ufSAqLyAoe30pLFxuICAgIGZpZWxkczogW10sIGlkOiBgY2xhc3M6JHtpbmRleH1gLCBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJDbGFzc0RlY2xhcmF0aW9uXCIpLFxuICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSksIG1ldGhvZHM6IFtdLFxuICAgIG5hbWU6IHR5cGVvZiBub2RlLm5hbWUgPT0gXCJzdHJpbmdcIiA/IG5vZGUubmFtZSA6IG5vZGUubmFtZS5uYW1lXG4gIH0pKVxuICBjb25zdCBpbnRlcmZhY2VEZWNsYXJhdGlvbnMgPSBpbnRlcmZhY2VOb2Rlcy5tYXAoKG5vZGUsIGluZGV4KSA9PiAoe1xuICAgIGlkOiBgaW50ZXJmYWNlOiR7aW5kZXh9YCwga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiSW50ZXJmYWNlRGVjbGFyYXRpb25cIiksXG4gICAgbG9jYXRpb246IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKSwgbWV0aG9kczogW10sXG4gICAgbmFtZTogdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZS5uYW1lIDogbm9kZS5uYW1lLm5hbWVcbiAgfSkpXG4gIGNvbnN0IHJlY29yZE5hbWVzID0gLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuSW50ZXJmYWNlRGVjbGFyYXRpb24+fSAqLyAoXG4gICAgbmV3IE1hcChwcm9ncmFtQ29udGV4dD8ucmVjb3JkcyA/PyBbXSkpXG4gIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgY2FwYWJpbGl0aWVzLmZsYXRNYXAoKHtyZXNvdXJjZXN9KSA9PiByZXNvdXJjZXMpKSByZWNvcmROYW1lcy5zZXQocmVzb3VyY2UubmFtZSwgcmVzb3VyY2UpXG4gIGNvbnN0IGVycm9yTmFtZXMgPSBuZXcgTWFwKHByb2dyYW1Db250ZXh0Py5lcnJvcnMgPz8gW10pXG4gIGZvciAoY29uc3QgZmFpbHVyZSBvZiBjYXBhYmlsaXRpZXMuZmxhdE1hcCgoe2ZhaWx1cmVzfSkgPT4gZmFpbHVyZXMpKSB7XG4gICAgZXJyb3JOYW1lcy5zZXQoZmFpbHVyZS5uYW1lLCAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChmYWlsdXJlKSkpXG4gIH1cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBlcnJvckRlY2xhcmF0aW9ucykgZXJyb3JOYW1lcy5zZXQoZGVjbGFyYXRpb24ubmFtZSwgZGVjbGFyYXRpb24pXG4gIGNvbnN0IGVycm9yc0J5SWQgPSBuZXcgTWFwKFsuLi5lcnJvck5hbWVzLnZhbHVlcygpXS5tYXAoKGRlY2xhcmF0aW9uKSA9PiBbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIGRlY2xhcmF0aW9uXSkpXG4gIGNvbnN0IGVycm9ycyA9IGVycm9yTm9kZXMubWFwKChub2RlLCBpbmRleCkgPT4gY29udmVydFBocEVycm9yKG5vZGUsIGVycm9yRGVjbGFyYXRpb25zW2luZGV4XSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgcmVjb3JkRGVjbGFyYXRpb25zKSByZWNvcmROYW1lcy5zZXQoZGVjbGFyYXRpb24ubmFtZSwgZGVjbGFyYXRpb24pXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgY2xhc3NEZWNsYXJhdGlvbnMpIHJlY29yZE5hbWVzLnNldChkZWNsYXJhdGlvbi5uYW1lLCBkZWNsYXJhdGlvbilcbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBpbnRlcmZhY2VEZWNsYXJhdGlvbnMpIHJlY29yZE5hbWVzLnNldChkZWNsYXJhdGlvbi5uYW1lLCBkZWNsYXJhdGlvbilcbiAgY29uc3QgcmVjb3Jkc0J5SWQgPSBuZXcgTWFwKFsuLi5yZWNvcmROYW1lcy52YWx1ZXMoKV1cbiAgICAuZmlsdGVyKChkZWNsYXJhdGlvbikgPT4gZGVjbGFyYXRpb24ua2luZCA9PSBcIlJlY29yZERlY2xhcmF0aW9uXCIpXG4gICAgLm1hcCgoZGVjbGFyYXRpb24pID0+IFsvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgZGVjbGFyYXRpb25dKSlcbiAgY29uc3QgY2xhc3Nlc0J5SWQgPSBuZXcgTWFwKGNsYXNzRGVjbGFyYXRpb25zLm1hcCgoZGVjbGFyYXRpb24pID0+IFsvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgZGVjbGFyYXRpb25dKSlcbiAgY29uc3QgaW50ZXJmYWNlc0J5SWQgPSBuZXcgTWFwKGludGVyZmFjZURlY2xhcmF0aW9ucy5tYXAoKGRlY2xhcmF0aW9uKSA9PiBbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIGRlY2xhcmF0aW9uXSkpXG4gIGNvbnN0IHJlY29yZHMgPSByZWNvcmROb2Rlcy5tYXAoKG5vZGUsIGluZGV4KSA9PiBjb252ZXJ0UGhwUmVjb3JkKG5vZGUsIHJlY29yZERlY2xhcmF0aW9uc1tpbmRleF0sXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj59ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChyZWNvcmROYW1lcykpLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgY29uc3QgZnVuY3Rpb25Ob2RlcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5GdW5jdGlvbltdfSAqLyAoYm9keS5maWx0ZXIoKG5vZGUpID0+IG5vZGUua2luZCA9PSBcImZ1bmN0aW9uXCIpKVxuICBjb25zdCBzaWduYXR1cmVzID0gZnVuY3Rpb25Ob2Rlcy5tYXAoKG5vZGUsIGluZGV4KSA9PiBjb252ZXJ0RnVuY3Rpb25TaWduYXR1cmUobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgcmVjb3JkTmFtZXMsIGBmdW5jdGlvbjoke2luZGV4fWApKVxuICBjb25zdCBmdW5jdGlvblNpZ25hdHVyZXMgPSBuZXcgTWFwKFsuLi5jYXBhYmlsaXR5RnVuY3Rpb25TaWduYXR1cmVzKGNhcGFiaWxpdGllcywgbW9kdWxlTG9jYXRpb24oZmlsZW5hbWUsIHNvdXJjZSkpLFxuICAgIC4uLihwcm9ncmFtQ29udGV4dD8uZnVuY3Rpb25zID8/IFtdKV0ubWFwKChbbG9jYWxOYW1lLCBkZWNsYXJhdGlvbl0pID0+IFtsb2NhbE5hbWUsIHtcbiAgICBsb2NhdGlvbjogZGVjbGFyYXRpb24ubG9jYXRpb24sXG4gICAgbmFtZTogbG9jYWxOYW1lLFxuICAgIG5hbWVMb2NhdGlvbjogZGVjbGFyYXRpb24ubG9jYXRpb24sXG4gICAgcGFyYW1ldGVyczogZGVjbGFyYXRpb24ucGFyYW1ldGVycyxcbiAgICByZXR1cm5UeXBlOiBkZWNsYXJhdGlvbi5yZXR1cm5UeXBlLFxuICAgIC4uLihkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA/IHt0eXBlUGFyYW1ldGVyczogZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnN9IDoge30pXG4gIH1dKSlcbiAgZm9yIChjb25zdCBzaWduYXR1cmUgb2Ygc2lnbmF0dXJlcykgZnVuY3Rpb25TaWduYXR1cmVzLnNldChzaWduYXR1cmUubmFtZSwgc2lnbmF0dXJlKVxuICBjb25zdCBpbnRlcmZhY2VzID0gaW50ZXJmYWNlTm9kZXMubWFwKChub2RlLCBpbmRleCkgPT4gY29udmVydFBocEludGVyZmFjZShub2RlLCBpbnRlcmZhY2VEZWNsYXJhdGlvbnNbaW5kZXhdLFxuICAgIHJlY29yZE5hbWVzLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgY29uc3QgY2xhc3NlcyA9IHJlZmVyZW5jZUNsYXNzTm9kZXMubWFwKChub2RlLCBpbmRleCkgPT4gY29udmVydFBocFJlZmVyZW5jZUNsYXNzKG5vZGUsIGNsYXNzRGVjbGFyYXRpb25zW2luZGV4XSxcbiAgICByZWNvcmROYW1lcywgcmVjb3Jkc0J5SWQsIGNsYXNzZXNCeUlkLCBpbnRlcmZhY2VzQnlJZCwgZnVuY3Rpb25TaWduYXR1cmVzLCBlcnJvck5hbWVzLCBlcnJvcnNCeUlkLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgY29uc3QgZnVuY3Rpb25zID0gZnVuY3Rpb25Ob2Rlcy5tYXAoKG5vZGUsIGluZGV4KSA9PlxuICAgIGNvbnZlcnRGdW5jdGlvbihub2RlLCBzaWduYXR1cmVzW2luZGV4XSwgZnVuY3Rpb25TaWduYXR1cmVzLCByZWNvcmROYW1lcywgcmVjb3Jkc0J5SWQsIGNsYXNzZXNCeUlkLCBpbnRlcmZhY2VzQnlJZCxcbiAgICAgIGVycm9yTmFtZXMsIGVycm9yc0J5SWQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICBjb25zdCBleGVjdXRhYmxlTm9kZXMgPSBib2R5LmZpbHRlcigobm9kZSkgPT4gIVtcImNsYXNzXCIsIFwiZnVuY3Rpb25cIiwgXCJpbnRlcmZhY2VcIiwgXCJkZWNsYXJlXCIsIFwibm9vcFwiXS5pbmNsdWRlcyhub2RlLmtpbmQpKVxuICBjb25zdCBsb2NhdGlvbiA9IG1vZHVsZUxvY2F0aW9uKGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKHByb2dyYW1Db250ZXh0ICYmICFwcm9ncmFtQ29udGV4dC5pc0VudHJ5ICYmIGV4ZWN1dGFibGVOb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwidG9wLWxldmVsIHNpZGUgZWZmZWN0IG91dHNpZGUgdGhlIHNlbGVjdGVkIGVudHJ5IG1vZHVsZVwiLCBub2RlTG9jYXRpb24oZXhlY3V0YWJsZU5vZGVzWzBdLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBjb25zdCBmaXJzdCA9IGV4ZWN1dGFibGVOb2Rlc1swXVxuICBjb25zdCBsYXN0ID0gZXhlY3V0YWJsZU5vZGVzLmF0KC0xKSA/PyBmaXJzdFxuICBjb25zdCBlbnRyeUxvY2F0aW9uID0gZmlyc3RcbiAgICA/IGxvY2F0aW9uRnJvbU9mZnNldHMoZmlsZW5hbWUsIHNvdXJjZSwgZmlyc3QubG9jPy5zdGFydC5vZmZzZXQgPz8gMCwgbGFzdD8ubG9jPy5lbmQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgpXG4gICAgOiBsb2NhdGlvblxuICBjb25zdCBlbnRyeUNvbnRleHQgPSB7XG4gICAgYmluZGluZ3M6IG5ldyBNYXAoKSxcbiAgICBjbGFzc2VzOiBjbGFzc2VzQnlJZCxcbiAgICBlcnJvck5hbWVzLFxuICAgIGVycm9yczogZXJyb3JzQnlJZCxcbiAgICBmdW5jdGlvbnM6IGZ1bmN0aW9uU2lnbmF0dXJlcyxcbiAgICBpbnRlcmZhY2VzOiBpbnRlcmZhY2VzQnlJZCxcbiAgICBvcmRlcmVkTWFwRGVjbGFyYXRpb25zOiBvcmRlcmVkTWFwRGVjbGFyYXRpb25zRm9yUGhwKGV4ZWN1dGFibGVOb2RlcyksXG4gICAgcmVjb3JkTmFtZXMsXG4gICAgcmVjb3JkczogcmVjb3Jkc0J5SWQsXG4gICAgcmV0dXJuVHlwZTogdW5kZWZpbmVkXG4gIH1cbiAgY29uc3QgZW50cnlCbG9jayA9IHtcbiAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJCbG9ja1wiKSxcbiAgICBsb2NhdGlvbjogZW50cnlMb2NhdGlvbixcbiAgICBzdGF0ZW1lbnRzOiBleGVjdXRhYmxlTm9kZXMubWFwKChub2RlKSA9PiBjb252ZXJ0U3RhdGVtZW50KG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGVudHJ5Q29udGV4dCkpXG4gIH1cblxuICBpZiAoIXByb2dyYW1Db250ZXh0ICYmIGZ1bmN0aW9ucy5sZW5ndGggPT0gMCAmJiBjYXBhYmlsaXRpZXMubGVuZ3RoID09IDAgJiYgIWJsb2NrUmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KGVudHJ5QmxvY2spKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibW9kdWxlIHdpdGhvdXQgYSBmdW5jdGlvblwiLCBsb2NhdGlvbilcbiAgfVxuICByZXR1cm4ge1xuICAgIGVudHJ5UG9pbnQ6IHtcbiAgICAgIGJvZHk6IGVudHJ5QmxvY2ssXG4gICAgICBraW5kOiBcIkVudHJ5UG9pbnRcIixcbiAgICAgIGxvY2F0aW9uOiBlbnRyeUxvY2F0aW9uXG4gICAgfSxcbiAgICBmdW5jdGlvbnMsXG4gICAga2luZDogXCJNb2R1bGVcIixcbiAgICBsb2NhdGlvbixcbiAgICAuLi4oZXJyb3JzLmxlbmd0aCA+IDAgPyB7ZXJyb3JzfSA6IHt9KSxcbiAgICAuLi4oY2xhc3Nlcy5sZW5ndGggPiAwID8ge2NsYXNzZXN9IDoge30pLFxuICAgIC4uLihpbnRlcmZhY2VzLmxlbmd0aCA+IDAgPyB7aW50ZXJmYWNlc30gOiB7fSksXG4gICAgLi4uKHJlY29yZHMubGVuZ3RoID4gMCA/IHtyZWNvcmRzfSA6IHt9KVxuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlcyBleGFjdCBwcm90ZWN0ZWQgUEhQIHByb2JlIHN1cHBvcnQgYmVmb3JlIHBvcnRhYmxlIGNvbnZlcnNpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuU3RhdGVtZW50W119IGJvZHkgLSBQYXJzZWQgdG9wLWxldmVsIHN0YXRlbWVudHMuXG4gKiBAcGFyYW0ge3JlYWRvbmx5IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbltdfSBjYXBhYmlsaXRpZXMgLSBBdXRob3JpemVkIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5TdGF0ZW1lbnRbXX0gUG9ydGFibGUgc3RhdGVtZW50cy5cbiAqL1xuZnVuY3Rpb24gdGFzazAzNFBocEJvZHkoYm9keSwgY2FwYWJpbGl0aWVzLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGlmICghaXNUYXNrMDM0UmVzb3VyY2VQcm9iZShjYXBhYmlsaXRpZXMpKSByZXR1cm4gYm9keVxuICBjb25zdCBzdGFydCA9IGJvZHkuZmluZEluZGV4KChub2RlKSA9PiBub2RlLmxlYWRpbmdDb21tZW50cz8uc29tZSgoe3ZhbHVlfSkgPT4gdmFsdWUgPT0gXCIvKiBzZW1hbnRpZm9sZC10YXNrMDM0LXN1cHBvcnQgKi9cIikpXG5cbiAgaWYgKHN0YXJ0IDwgMCkgcmV0dXJuIGJvZHlcbiAgaWYgKCFoYXNFeGFjdEVmZmVjdFN1cHBvcnQoc291cmNlLCBcInBocFwiKSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm1hbGZvcm1lZCBwcm90ZWN0ZWQgVGFzayAwMzQgc3VwcG9ydFwiLCBub2RlTG9jYXRpb24oYm9keVtzdGFydF0sIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG4gIGNvbnN0IGV4cGVjdGVkID0gW1xuICAgIFtcImNsYXNzXCIsIFwiUHJvYmVPcGVyYXRpb25GYWlsdXJlXCJdLCBbXCJjbGFzc1wiLCBcIlByb2JlQWNxdWlyZUZhaWx1cmVcIl0sIFtcImNsYXNzXCIsIFwiUHJvYmVSZWFkRmFpbHVyZVwiXSxcbiAgICBbXCJjbGFzc1wiLCBcIlByb2JlQ2xvc2VGYWlsdXJlXCJdLCBbXCJjbGFzc1wiLCBcIlByb2JlUmVzb3VyY2VDbG9zZWRcIl0sIFtcImNsYXNzXCIsIFwiUHJvYmVSZXNvdXJjZVwiXSxcbiAgICBbXCJleHByZXNzaW9uc3RhdGVtZW50XCIsIHVuZGVmaW5lZF0sIFtcImZ1bmN0aW9uXCIsIFwicHJvYmVFZmZlY3RcIl0sIFtcImZ1bmN0aW9uXCIsIFwicHJvYmVBY3F1aXJlXCJdLFxuICAgIFtcImZ1bmN0aW9uXCIsIFwicHJvYmVSZWFkXCJdLCBbXCJmdW5jdGlvblwiLCBcInByb2JlQ2xvc2VcIl0sIFtcImZ1bmN0aW9uXCIsIFwicHJvYmVUcmFjZVwiXVxuICBdXG4gIGNvbnN0IG1hdGNoZXMgPSBleHBlY3RlZC5ldmVyeSgoW2tpbmQsIG5hbWVdLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSBib2R5W3N0YXJ0ICsgaW5kZXhdXG4gICAgY29uc3QgcmF3TmFtZSA9IG5vZGUgPyBSZWZsZWN0LmdldChub2RlLCBcIm5hbWVcIikgOiB1bmRlZmluZWRcbiAgICBjb25zdCBhY3R1YWxOYW1lID0gdHlwZW9mIHJhd05hbWUgPT0gXCJzdHJpbmdcIiA/IHJhd05hbWUgOiByYXdOYW1lICYmIHR5cGVvZiByYXdOYW1lID09IFwib2JqZWN0XCIgPyBSZWZsZWN0LmdldChyYXdOYW1lLCBcIm5hbWVcIikgOiB1bmRlZmluZWRcbiAgICByZXR1cm4gbm9kZT8ua2luZCA9PSBraW5kICYmIGFjdHVhbE5hbWUgPT0gbmFtZVxuICB9KVxuICBjb25zdCBuZXh0ID0gYm9keVtzdGFydCArIGV4cGVjdGVkLmxlbmd0aF1cblxuICBpZiAoIW1hdGNoZXMgfHwgbmV4dCAmJiAhbmV4dC5sZWFkaW5nQ29tbWVudHM/LnNvbWUoKHt2YWx1ZX0pID0+IHZhbHVlID09IFwiLyogc2VtYW50aWZvbGQtdGFzazAzNC1zdXBwb3J0LWVuZCAqL1wiKSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm1hbGZvcm1lZCBwcm90ZWN0ZWQgVGFzayAwMzQgc3VwcG9ydFwiLCBub2RlTG9jYXRpb24oYm9keVtzdGFydF0sIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG4gIHJldHVybiBbLi4uYm9keS5zbGljZSgwLCBzdGFydCksIC4uLmJvZHkuc2xpY2Uoc3RhcnQgKyBleHBlY3RlZC5sZW5ndGgpXVxufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBjYW5vbmljYWwgcGFyc2VyLW93bmVkIFBIUCBuYW1lc3BhY2UsIHVzZSBiaW5kaW5ncywgYW5kIGxpdGVyYWwgcmVxdWlyZV9vbmNlIGVkZ2VzLlxuICogQHBhcmFtIHtvYmplY3R9IGlucHV0IC0gUGFyc2VyIGlucHV0LlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LmZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LnNvdXJjZSAtIFNvdXJjZSB0ZXh0LlxuICogQHJldHVybnMge3tiaW5kaW5nczoge2ltcG9ydGVkTmFtZTogc3RyaW5nLCBsb2NhbE5hbWU6IHN0cmluZywgbG9jYXRpb246IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uLCBuYXRpdmVOYW1lOiBzdHJpbmcsIHN5bWJvbEtpbmQ6IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljRGVjbGFyYXRpb25LaW5kLCB0eXBlT25seTogZmFsc2V9W10sIGltcG9ydHM6IHtpbXBvcnRlZE5hbWU6IHN0cmluZywgbG9jYWxOYW1lOiBzdHJpbmcsIGxvY2F0aW9uOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgbmFtZXNwYWNlOiB0cnVlLCBwYXRoTG9jYXRpb246IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uLCBzcGVjaWZpZXI6IHN0cmluZywgdHlwZU9ubHk6IGZhbHNlfVtdLCBleHBvcnRzOiB7ZXhwb3J0ZWROYW1lOiBzdHJpbmcsIGxvY2FsTmFtZTogc3RyaW5nLCBsb2NhdGlvbjogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIHR5cGVPbmx5OiBmYWxzZX1bXSwgbmF0aXZlTmFtZTogc3RyaW5nfX0gUGFyc2VyLW93bmVkIFBIUCBtb2R1bGUgaGVhZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zcGVjdFBocE1vZHVsZSh7ZmlsZW5hbWUsIHNvdXJjZX0pIHtcbiAgY29uc3QgcHJvZ3JhbSA9IHBhcnNlUGhwUHJvZ3JhbShmaWxlbmFtZSwgc291cmNlKVxuXG4gIHZhbGlkYXRlRGVjbGFyZU5vZGVzKHByb2dyYW0uY2hpbGRyZW4sIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IG5hbWVzcGFjZXMgPSBwcm9ncmFtLmNoaWxkcmVuLmZpbHRlcigobm9kZSkgPT4gbm9kZS5raW5kID09IFwibmFtZXNwYWNlXCIpXG4gIGNvbnN0IGludmFsaWRPdXRlciA9IHByb2dyYW0uY2hpbGRyZW4uZmluZCgobm9kZSkgPT4gIVtcImRlY2xhcmVcIiwgXCJuYW1lc3BhY2VcIiwgXCJub29wXCJdLmluY2x1ZGVzKG5vZGUua2luZCkpXG4gIGNvbnN0IG5hbWVzcGFjZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5OYW1lc3BhY2UgfCB1bmRlZmluZWR9ICovIChuYW1lc3BhY2VzWzBdKVxuXG4gIGlmICghbmFtZXNwYWNlIHx8IG5hbWVzcGFjZXMubGVuZ3RoICE9IDEgfHwgbmFtZXNwYWNlLndpdGhCcmFja2V0cyB8fCB0eXBlb2YgbmFtZXNwYWNlLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBpbnZhbGlkT3V0ZXIpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJvbmUgY2Fub25pY2FsIHVuYnJhY2tldGVkIG5hbWVzcGFjZVwiLFxuICAgICAgbm9kZUxvY2F0aW9uKGludmFsaWRPdXRlciA/PyBuYW1lc3BhY2VzWzFdID8/IG5hbWVzcGFjZSA/PyBwcm9ncmFtLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBjb25zdCBiaW5kaW5ncyA9IFtdXG5cbiAgZm9yIChjb25zdCBub2RlIG9mIG5hbWVzcGFjZS5jaGlsZHJlbi5maWx0ZXIoKGNoaWxkKSA9PiBjaGlsZC5raW5kID09IFwidXNlZ3JvdXBcIikpIHtcbiAgICBjb25zdCBncm91cCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Vc2VHcm91cH0gKi8gKG5vZGUpXG5cbiAgICBpZiAoZ3JvdXAubmFtZSAhPT0gbnVsbCB8fCAhW251bGwsIFwiZnVuY3Rpb25cIl0uaW5jbHVkZXMoZ3JvdXAudHlwZSkgfHwgZ3JvdXAuaXRlbXMubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImdyb3VwZWQsIGNvbnN0YW50LCBvciBlbXB0eSB1c2UgZGVjbGFyYXRpb25cIiwgbm9kZUxvY2F0aW9uKGdyb3VwLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGdyb3VwLml0ZW1zKSB7XG4gICAgICBpZiAoaXRlbS50eXBlICE9PSBudWxsIHx8IHR5cGVvZiBpdGVtLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCAhaXRlbS5uYW1lLmluY2x1ZGVzKFwiXFxcXFwiKSkge1xuICAgICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJncm91cGVkIG9yIHVucXVhbGlmaWVkIHVzZSBpdGVtXCIsIG5vZGVMb2NhdGlvbihpdGVtLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IGltcG9ydGVkTmFtZSA9IGl0ZW0ubmFtZS5zcGxpdChcIlxcXFxcIikuYXQoLTEpXG4gICAgICBjb25zdCBhbGlhcyA9IGl0ZW0uYWxpYXNcblxuICAgICAgaWYgKCFpbXBvcnRlZE5hbWUgfHwgYWxpYXMgJiYgYWxpYXMua2luZCAhPSBcImlkZW50aWZpZXJcIikge1xuICAgICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpbnZhbGlkIHVzZSBhbGlhc1wiLCBub2RlTG9jYXRpb24oaXRlbSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgICB9XG4gICAgICBiaW5kaW5ncy5wdXNoKHtcbiAgICAgICAgaW1wb3J0ZWROYW1lLFxuICAgICAgICBsb2NhbE5hbWU6IGFsaWFzID8gYWxpYXMubmFtZSA6IGltcG9ydGVkTmFtZSxcbiAgICAgICAgbG9jYXRpb246IG5vZGVMb2NhdGlvbihpdGVtLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgICAgbmF0aXZlTmFtZTogaXRlbS5uYW1lLFxuICAgICAgICBzeW1ib2xLaW5kOiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljRGVjbGFyYXRpb25LaW5kfSAqLyAoZ3JvdXAudHlwZSA9PSBcImZ1bmN0aW9uXCIgPyBcImZ1bmN0aW9uXCIgOiBcInJlY29yZFwiKSxcbiAgICAgICAgdHlwZU9ubHk6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChmYWxzZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG4gIGNvbnN0IGltcG9ydHMgPSBuYW1lc3BhY2UuY2hpbGRyZW4uZmlsdGVyKGlzUGhwSW5jbHVkZVN0YXRlbWVudCkubWFwKChub2RlKSA9PiB7XG4gICAgaWYgKCFpc1BocFJlcXVpcmVPbmNlKG5vZGUpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpbmNsdWRlL3JlcXVpcmUgb3V0c2lkZSBsaXRlcmFsIHJlcXVpcmVfb25jZSBfX0RJUl9fIHByb2ZpbGVcIiwgbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICBjb25zdCBzdGF0ZW1lbnQgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRXhwcmVzc2lvblN0YXRlbWVudH0gKi8gKG5vZGUpXG4gICAgY29uc3QgaW5jbHVkZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JbmNsdWRlfSAqLyAoc3RhdGVtZW50LmV4cHJlc3Npb24pXG4gICAgY29uc3QgdGFyZ2V0ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJpbn0gKi8gKGluY2x1ZGUudGFyZ2V0KVxuICAgIGNvbnN0IHBhdGggPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuU3RyaW5nfSAqLyAodGFyZ2V0LnJpZ2h0KVxuXG4gICAgaWYgKCFwYXRoLnZhbHVlLnN0YXJ0c1dpdGgoXCIvXCIpIHx8IHBhdGgudmFsdWUuaW5jbHVkZXMoXCJcXDBcIikpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInVuc2FmZSByZXF1aXJlX29uY2UgcGF0aFwiLCBub2RlTG9jYXRpb24ocGF0aCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGltcG9ydGVkTmFtZTogXCIqXCIsXG4gICAgICBsb2NhbE5hbWU6IFwiXCIsXG4gICAgICBsb2NhdGlvbjogbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpLFxuICAgICAgbmFtZXNwYWNlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAodHJ1ZSksXG4gICAgICBwYXRoTG9jYXRpb246IG5vZGVMb2NhdGlvbihwYXRoLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIHNwZWNpZmllcjogYC4ke3BhdGgudmFsdWV9YCxcbiAgICAgIHR5cGVPbmx5OiAvKiogQHR5cGUge2NvbnN0fSAqLyAoZmFsc2UpXG4gICAgfVxuICB9KVxuICBjb25zdCBleHBvcnRzID0gbmFtZXNwYWNlLmNoaWxkcmVuLmZsYXRNYXAoKG5vZGUpID0+IHtcbiAgICBpZiAobm9kZS5raW5kICE9IFwiY2xhc3NcIiAmJiBub2RlLmtpbmQgIT0gXCJmdW5jdGlvblwiKSByZXR1cm4gW11cbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5DbGFzcyB8IGltcG9ydChcInBocC1wYXJzZXJcIikuRnVuY3Rpb259ICovIChub2RlKVxuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgZGVjbGFyYXRpb24ubmFtZSA9PSBcInN0cmluZ1wiID8gZGVjbGFyYXRpb24ubmFtZSA6IGRlY2xhcmF0aW9uLm5hbWUubmFtZVxuXG4gICAgcmV0dXJuIFt7ZXhwb3J0ZWROYW1lOiBuYW1lLCBsb2NhbE5hbWU6IG5hbWUsIGxvY2F0aW9uOiBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSksIHR5cGVPbmx5OiAvKiogQHR5cGUge2NvbnN0fSAqLyAoZmFsc2UpfV1cbiAgfSlcblxuICByZXR1cm4ge2JpbmRpbmdzLCBleHBvcnRzLCBpbXBvcnRzLCBuYXRpdmVOYW1lOiBuYW1lc3BhY2UubmFtZX1cbn1cblxuLyoqXG4gKiBSZXBvcnRzIHdoZXRoZXIgYSBQSFAgc3RhdGVtZW50IGlzIGFueSBpbmNsdWRlL3JlcXVpcmUgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Ob2RlfSBub2RlIC0gQ2FuZGlkYXRlIHN0YXRlbWVudC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBub2RlIGlzIGFuIGluY2x1ZGUgZXhwcmVzc2lvbiBzdGF0ZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGlzUGhwSW5jbHVkZVN0YXRlbWVudChub2RlKSB7XG4gIHJldHVybiBub2RlLmtpbmQgPT0gXCJleHByZXNzaW9uc3RhdGVtZW50XCIgJiZcbiAgICAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRXhwcmVzc2lvblN0YXRlbWVudH0gKi8gKG5vZGUpLmV4cHJlc3Npb24ua2luZCA9PSBcImluY2x1ZGVcIlxufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciBhIFBIUCBzdGF0ZW1lbnQgaXMgdGhlIGNhbm9uaWNhbCBsaXRlcmFsIHByb2plY3QgbG9hZCBlZGdlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGV9IG5vZGUgLSBDYW5kaWRhdGUgc3RhdGVtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG5vZGUgaXMgYSBzdXBwb3J0ZWQgcmVxdWlyZS1vbmNlIHN0YXRlbWVudC5cbiAqL1xuZnVuY3Rpb24gaXNQaHBSZXF1aXJlT25jZShub2RlKSB7XG4gIGlmICghaXNQaHBJbmNsdWRlU3RhdGVtZW50KG5vZGUpKSByZXR1cm4gZmFsc2VcbiAgY29uc3Qgc3RhdGVtZW50ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkV4cHJlc3Npb25TdGF0ZW1lbnR9ICovIChub2RlKVxuICBjb25zdCBpbmNsdWRlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkluY2x1ZGV9ICovIChzdGF0ZW1lbnQuZXhwcmVzc2lvbilcbiAgY29uc3QgdGFyZ2V0ID0gaW5jbHVkZS50YXJnZXQua2luZCA9PSBcImJpblwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJpbn0gKi8gKGluY2x1ZGUudGFyZ2V0KSA6IHVuZGVmaW5lZFxuICBjb25zdCBsZWZ0ID0gdGFyZ2V0Py5sZWZ0LmtpbmQgPT0gXCJtYWdpY1wiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk1hZ2ljfSAqLyAodGFyZ2V0LmxlZnQpIDogdW5kZWZpbmVkXG5cbiAgcmV0dXJuIGluY2x1ZGUub25jZSAmJiBpbmNsdWRlLnJlcXVpcmUgJiYgdGFyZ2V0Py50eXBlID09IFwiLlwiICYmXG4gICAgbGVmdD8udmFsdWUgPT0gXCJfX0RJUl9fXCIgJiYgdGFyZ2V0LnJpZ2h0LmtpbmQgPT0gXCJzdHJpbmdcIlxufVxuXG4vKipcbiAqIEFjY2VwdHMgb25seSBhbiBvcHRpb25hbCBzaW5nbGUgYGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpYCBkaXJlY3RpdmUuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZVtdfSBub2RlcyAtIFRvcC1sZXZlbCBQSFAgbm9kZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRGVjbGFyZU5vZGVzKG5vZGVzLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGRlY2xhcmF0aW9ucyA9IG5vZGVzLmZpbHRlcigobm9kZSkgPT4gbm9kZS5raW5kID09IFwiZGVjbGFyZVwiKVxuXG4gIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoID4gMSkge1xuICAgIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibXVsdGlwbGUgZGVjbGFyZSBkaXJlY3RpdmVzXCIsIG5vZGVMb2NhdGlvbihkZWNsYXJhdGlvbnNbMV0sIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbk5vZGUgb2YgZGVjbGFyYXRpb25zKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRGVjbGFyZX0gKi8gKGRlY2xhcmF0aW9uTm9kZSlcbiAgICBjb25zdCBkaXJlY3RpdmUgPSBkZWNsYXJhdGlvbi5kaXJlY3RpdmVzWzBdXG4gICAgY29uc3Qga2V5ID0gZGlyZWN0aXZlPy5rZXlcbiAgICBjb25zdCB2YWx1ZSA9IGRpcmVjdGl2ZT8udmFsdWVcbiAgICBjb25zdCBudW1lcmljVmFsdWUgPSB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIiAmJiB2YWx1ZS5raW5kID09IFwibnVtYmVyXCJcbiAgICAgID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk51bWJlcn0gKi8gKHZhbHVlKVxuICAgICAgOiB1bmRlZmluZWRcbiAgICBjb25zdCB2YWx1ZUlzT25lID0gbnVtZXJpY1ZhbHVlPy5sb2MgJiYgc291cmNlLnNsaWNlKG51bWVyaWNWYWx1ZS5sb2Muc3RhcnQub2Zmc2V0LCBudW1lcmljVmFsdWUubG9jLmVuZC5vZmZzZXQpID09IFwiMVwiXG4gICAgY29uc3QgdmFsaWQgPSBkZWNsYXJhdGlvbi5tb2RlID09IFwibm9uZVwiICYmIGRlY2xhcmF0aW9uLmNoaWxkcmVuLmxlbmd0aCA9PSAwICYmIGRlY2xhcmF0aW9uLmRpcmVjdGl2ZXMubGVuZ3RoID09IDEgJiZcbiAgICAgIGtleS5raW5kID09IFwiaWRlbnRpZmllclwiICYmIGtleS5uYW1lID09IFwic3RyaWN0X3R5cGVzXCIgJiYgdmFsdWVJc09uZVxuXG4gICAgaWYgKCF2YWxpZCkgdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkZWNsYXJlIG90aGVyIHRoYW4gc3RyaWN0X3R5cGVzPTFcIiwgbm9kZUxvY2F0aW9uKGRlY2xhcmF0aW9uLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxufVxuXG4vKipcbiAqIEludm9rZXMgcGhwLXBhcnNlciBhbmQgbm9ybWFsaXplcyBzeW50YXggZmFpbHVyZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gU291cmNlIHRleHQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Qcm9ncmFtfSBQSFAgcHJvZ3JhbS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VQaHBQcm9ncmFtKGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlQ29kZShzb3VyY2UsIGZpbGVuYW1lKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBwYXJzZUZhaWx1cmUoXCJwaHBcIiwgZXJyb3IsIHBocFBhcnNlckZhaWx1cmVMb2NhdGlvbihlcnJvciwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHBocC1wYXJzZXIncyBvbmUtYmFzZWQgbGluZSBhbmQgemVyby1iYXNlZCBjb2x1bW4gd2hlbiBwcmVzZW50LlxuICogQSBtb2R1bGUgcmFuZ2UgcmVtYWlucyB0aGUgZGV0ZXJtaW5pc3RpYyBmYWxsYmFjayBmb3Igb3BhcXVlIHBhcnNlciBlcnJvcnMuXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yIC0gTmF0aXZlIHBhcnNlciBlcnJvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFJlcXVlc3RlZCBzb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBGYWlsdXJlIHJhbmdlLlxuICovXG5mdW5jdGlvbiBwaHBQYXJzZXJGYWlsdXJlTG9jYXRpb24oZXJyb3IsIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT0gXCJvYmplY3RcIikgcmV0dXJuIG1vZHVsZUxvY2F0aW9uKGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGxpbmUgPSBSZWZsZWN0LmdldChlcnJvciwgXCJsaW5lTnVtYmVyXCIpXG4gIGNvbnN0IGNvbHVtbiA9IFJlZmxlY3QuZ2V0KGVycm9yLCBcImNvbHVtbk51bWJlclwiKVxuXG4gIGlmICh0eXBlb2YgbGluZSAhPSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihsaW5lKSB8fCBsaW5lIDwgMSB8fFxuICAgIHR5cGVvZiBjb2x1bW4gIT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzU2FmZUludGVnZXIoY29sdW1uKSB8fCBjb2x1bW4gPCAwKSB7XG4gICAgcmV0dXJuIG1vZHVsZUxvY2F0aW9uKGZpbGVuYW1lLCBzb3VyY2UpXG4gIH1cbiAgbGV0IGxpbmVTdGFydCA9IDBcblxuICBmb3IgKGxldCBjdXJyZW50ID0gMTsgY3VycmVudCA8IGxpbmU7IGN1cnJlbnQrKykge1xuICAgIGNvbnN0IG5ld2xpbmUgPSBzb3VyY2UuaW5kZXhPZihcIlxcblwiLCBsaW5lU3RhcnQpXG5cbiAgICBpZiAobmV3bGluZSA8IDApIHJldHVybiBtb2R1bGVMb2NhdGlvbihmaWxlbmFtZSwgc291cmNlKVxuICAgIGxpbmVTdGFydCA9IG5ld2xpbmUgKyAxXG4gIH1cbiAgY29uc3QgbGluZUVuZCA9IHNvdXJjZS5pbmRleE9mKFwiXFxuXCIsIGxpbmVTdGFydClcbiAgY29uc3QgYm91bmRlZEVuZCA9IGxpbmVFbmQgPCAwID8gc291cmNlLmxlbmd0aCA6IGxpbmVFbmRcbiAgY29uc3Qgb2Zmc2V0ID0gTWF0aC5taW4obGluZVN0YXJ0ICsgY29sdW1uLCBib3VuZGVkRW5kKVxuXG4gIHJldHVybiBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBzb3VyY2UsIG9mZnNldCwgTWF0aC5taW4ob2Zmc2V0ICsgMSwgc291cmNlLmxlbmd0aCkpXG59XG4iXX0=