semantifold 0.12.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 (73) hide show
  1. package/README.md +2 -0
  2. package/build/src/backends/effects.js +5 -2
  3. package/build/src/backends/java.js +33 -14
  4. package/build/src/backends/javascript.js +83 -18
  5. package/build/src/backends/php.d.ts.map +1 -1
  6. package/build/src/backends/php.js +88 -16
  7. package/build/src/backends/ruby.js +37 -12
  8. package/build/src/backends/scalars.js +2 -2
  9. package/build/src/backends/shared.d.ts +2 -1
  10. package/build/src/backends/shared.d.ts.map +1 -1
  11. package/build/src/backends/shared.js +299 -42
  12. package/build/src/backends/typescript.js +83 -18
  13. package/build/src/backends/writer.d.ts +18 -4
  14. package/build/src/backends/writer.d.ts.map +1 -1
  15. package/build/src/backends/writer.js +40 -4
  16. package/build/src/frontends/java.d.ts +9 -1
  17. package/build/src/frontends/java.d.ts.map +1 -1
  18. package/build/src/frontends/java.js +90 -43
  19. package/build/src/frontends/javascript-typescript.d.ts +3 -1
  20. package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
  21. package/build/src/frontends/javascript-typescript.js +133 -52
  22. package/build/src/frontends/php.d.ts +13 -1
  23. package/build/src/frontends/php.d.ts.map +1 -1
  24. package/build/src/frontends/php.js +226 -59
  25. package/build/src/frontends/ruby.d.ts +4 -1
  26. package/build/src/frontends/ruby.d.ts.map +1 -1
  27. package/build/src/frontends/ruby.js +113 -37
  28. package/build/src/frontends/types.d.ts +9 -2
  29. package/build/src/frontends/types.d.ts.map +1 -1
  30. package/build/src/frontends/types.js +26 -9
  31. package/build/src/language-registry.d.ts.map +1 -1
  32. package/build/src/language-registry.js +14 -6
  33. package/build/src/mapping.d.ts.map +1 -1
  34. package/build/src/mapping.js +4 -2
  35. package/build/src/semantic/effects.d.ts.map +1 -1
  36. package/build/src/semantic/effects.js +20 -6
  37. package/build/src/semantic/lifetime.js +28 -4
  38. package/build/src/semantic/provenance.d.ts.map +1 -1
  39. package/build/src/semantic/provenance.js +61 -9
  40. package/build/src/semantic/types.d.ts +214 -23
  41. package/build/src/semantic/types.d.ts.map +1 -1
  42. package/build/src/semantic/types.js +58 -11
  43. package/build/src/semantic/validate.d.ts +31 -2
  44. package/build/src/semantic/validate.d.ts.map +1 -1
  45. package/build/src/semantic/validate.js +450 -60
  46. package/docs/adr/20261026-typed-error-handling-extension.md +55 -0
  47. package/docs/adr-bounded-subtyping.md +180 -0
  48. package/docs/adr-numeric-tower.md +156 -0
  49. package/docs/architecture.md +1 -1
  50. package/docs/language-support.md +8 -8
  51. package/docs/testing.md +5 -3
  52. package/package.json +1 -1
  53. package/src/backends/effects.js +3 -1
  54. package/src/backends/java.js +33 -14
  55. package/src/backends/javascript.js +83 -18
  56. package/src/backends/php.js +89 -16
  57. package/src/backends/ruby.js +36 -12
  58. package/src/backends/scalars.js +1 -1
  59. package/src/backends/shared.js +298 -47
  60. package/src/backends/typescript.js +83 -18
  61. package/src/backends/writer.js +41 -3
  62. package/src/frontends/java.js +95 -43
  63. package/src/frontends/javascript-typescript.js +145 -53
  64. package/src/frontends/php.js +243 -58
  65. package/src/frontends/ruby.js +117 -35
  66. package/src/frontends/types.js +26 -8
  67. package/src/language-registry.js +13 -5
  68. package/src/mapping.js +3 -1
  69. package/src/semantic/effects.js +18 -5
  70. package/src/semantic/lifetime.js +29 -3
  71. package/src/semantic/provenance.js +60 -14
  72. package/src/semantic/types.js +62 -10
  73. package/src/semantic/validate.js +481 -61
@@ -7,8 +7,8 @@
7
7
  /** @typedef {SemanticTypeName | "void"} FunctionReturnTypeName */
8
8
  /** @typedef {"IntegerNegate" | "BooleanNot"} SemanticUnaryOperation */
9
9
  /** @typedef {"IntegerAdd" | "IntegerSubtract" | "IntegerMultiply" | "BooleanAnd" | "BooleanOr" | "IntegerEqual" | "IntegerNotEqual" | "BooleanEqual" | "BooleanNotEqual" | "StringEqual" | "StringNotEqual" | "IntegerLessThan" | "IntegerLessThanOrEqual" | "IntegerGreaterThan" | "IntegerGreaterThanOrEqual" | "StringConcat"} SemanticBinaryOperation */
10
- /** @typedef {"capability" | "resource" | "failure" | "operation" | "record" | "class" | "error" | "field" | "constructor" | "method" | "function" | "typeParameter" | "parameter" | "local" | "iteration" | "catch"} SemanticSymbolKind */
11
- /** @typedef {"record" | "class" | "error" | "function"} SemanticDeclarationKind */
10
+ /** @typedef {"capability" | "resource" | "failure" | "operation" | "record" | "interface" | "interfaceMethod" | "class" | "error" | "field" | "constructor" | "method" | "function" | "typeParameter" | "parameter" | "local" | "iteration" | "catch"} SemanticSymbolKind */
11
+ /** @typedef {"record" | "interface" | "class" | "error" | "function"} SemanticDeclarationKind */
12
12
  /** @typedef {"declaration" | "type" | "construct" | "member" | "read" | "write" | "call"} SemanticSymbolRole */
13
13
  /** @typedef {"parse" | "generate" | "restore" | "compile" | "link" | "validate" | "instantiate" | "execute"} AcceptanceStage */
14
14
  /** @typedef {"entry" | "source" | "manifest" | "support" | "mapping" | "resource" | "loader"} GeneratedArtifactRole */
@@ -171,6 +171,7 @@
171
171
  * @property {boolean} typedErrors - Task 011 nominal unchecked errors, raises, and exact typed catches.
172
172
  * @property {boolean} typeParametersAndGenerics - Task 012 invariant unbounded type parameters and closed generic applications.
173
173
  * @property {boolean} referenceClasses - Task 033 nominal reference classes, private instance state, exact constructors, and receiver methods.
174
+ * @property {boolean} boundedSubtyping - Task 048 nominal interfaces with exact implementation contracts and implicit upcast (requires referenceClasses).
174
175
  * @property {boolean} effectfulCapabilitiesAndResources - Task 034 authorized host effects, typed failures, and owned resources.
175
176
  */
176
177
  /**
@@ -621,7 +622,13 @@
621
622
  * @property {string} declarationId - Exact owned class declaration identity.
622
623
  * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned type-name range.
623
624
  */
624
- /** @typedef {TypeReference | TypeVariableReference | ListType | MapType | OrderedMapType | OptionalType | RecordType | ReferenceType | OwnedResourceType | OwnedReferenceType} SemanticValueType */
625
+ /**
626
+ * @typedef InterfaceType
627
+ * @property {"InterfaceType"} kind - Nominal bounded-subtyping interface type discriminator.
628
+ * @property {string} declarationId - Stable module-local interface declaration identity.
629
+ * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned type-name range.
630
+ */
631
+ /** @typedef {TypeReference | TypeVariableReference | ListType | MapType | OrderedMapType | OptionalType | RecordType | ReferenceType | OwnedResourceType | OwnedReferenceType | InterfaceType} SemanticValueType */
625
632
  /** @typedef {SemanticValueType | ErrorType} SemanticBindingType */
626
633
  /**
627
634
  * @typedef FunctionReturnTypeReference
@@ -630,7 +637,7 @@
630
637
  * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance that survives semantic transforms.
631
638
  */
632
639
  /** @typedef {SemanticValueType | FunctionReturnTypeReference} SemanticFunctionReturnType */
633
- /** @typedef {SemanticTypeName | {kind: "TypeVariableReference", parameterId: string} | {kind: "ListType", elementType: SemanticTypeIdentity} | {kind: "MapType", keyType: SemanticTypeIdentity, valueType: SemanticTypeIdentity} | {kind: "OrderedMapType", keyType: SemanticTypeIdentity, valueType: SemanticTypeIdentity, order: "insertion"} | {kind: "OptionalType", valueType: SemanticTypeIdentity} | {kind: "RecordType", declarationId: string, arguments?: SemanticTypeIdentity[]} | {kind: "ReferenceType", declarationId: string} | {kind: "OwnedResourceType", resourceId: string} | {kind: "OwnedReferenceType", declarationId: string}} SemanticTypeIdentity */
640
+ /** @typedef {SemanticTypeName | {kind: "TypeVariableReference", parameterId: string} | {kind: "ListType", elementType: SemanticTypeIdentity} | {kind: "MapType", keyType: SemanticTypeIdentity, valueType: SemanticTypeIdentity} | {kind: "OrderedMapType", keyType: SemanticTypeIdentity, valueType: SemanticTypeIdentity, order: "insertion"} | {kind: "OptionalType", valueType: SemanticTypeIdentity} | {kind: "RecordType", declarationId: string, arguments?: SemanticTypeIdentity[]} | {kind: "ReferenceType", declarationId: string} | {kind: "OwnedResourceType", resourceId: string} | {kind: "OwnedReferenceType", declarationId: string} | {kind: "InterfaceType", declarationId: string}} SemanticTypeIdentity */
634
641
  /** @typedef {SemanticTypeIdentity | "void"} FunctionReturnTypeIdentity */
635
642
  /**
636
643
  * @typedef ResolvedFunctionSignature
@@ -1089,6 +1096,14 @@
1089
1096
  * @property {SourceLocation} location - Complete raise source location.
1090
1097
  * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned raise range.
1091
1098
  */
1099
+ /**
1100
+ * @typedef RethrowStatement
1101
+ * @property {"RethrowStatement"} kind - Re-propagation of the exact caught binding in scope.
1102
+ * @property {string} binding - Name of the lexically visible immutable catch binding being re-raised.
1103
+ * @property {CatchBinding} bindingNode - Exact catch binding node being re-raised.
1104
+ * @property {SourceLocation} location - Complete rethrow source location.
1105
+ * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned rethrow range.
1106
+ */
1092
1107
  /**
1093
1108
  * @typedef CatchBinding
1094
1109
  * @property {"CatchBinding"} kind - Exact-handler binding discriminator.
@@ -1099,17 +1114,25 @@
1099
1114
  * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned binding range.
1100
1115
  */
1101
1116
  /**
1102
- * @typedef TryStatement
1103
- * @property {"TryStatement"} kind - One body and one exact typed handler.
1104
- * @property {Block} body - Protected body.
1117
+ * @typedef CatchHandler
1118
+ * @property {"CatchHandler"} kind - One exact nominal handler within an ordered handler list.
1105
1119
  * @property {ErrorType} catchType - Exact caught nominal error type.
1106
1120
  * @property {CatchBinding} catchBinding - Immutable handler-local binding.
1107
1121
  * @property {Block} catchBody - Handler body.
1122
+ * @property {SourceLocation} location - Complete handler source location.
1123
+ * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned catch ranges.
1124
+ */
1125
+ /**
1126
+ * @typedef TryStatement
1127
+ * @property {"TryStatement"} kind - One body, an ordered list of exact typed handlers, and an optional completion block.
1128
+ * @property {Block} body - Protected body.
1129
+ * @property {CatchHandler[]} handlers - Ordered exact handlers, evaluated top to bottom with exact nominal matching.
1130
+ * @property {Block} [finallyBody] - Completion block executed on every normal and abrupt completion of the try.
1108
1131
  * @property {SourceLocation} location - Complete try/handler source location.
1109
- * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned try/catch ranges.
1132
+ * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned try/catch/finally ranges.
1110
1133
  */
1111
1134
  /** @typedef {LocalDeclaration | AssignmentStatement} LocalStatement */
1112
- /** @typedef {LocalStatement | PrivateFieldWriteStatement | ExpressionStatement | IfStatement | ForEachStatement | ForEachMapStatement | WhileStatement | BreakStatement | ContinueStatement | ReturnStatement | PrintStatement | RaiseStatement | TryStatement} Statement */
1135
+ /** @typedef {LocalStatement | PrivateFieldWriteStatement | ExpressionStatement | IfStatement | ForEachStatement | ForEachMapStatement | WhileStatement | BreakStatement | ContinueStatement | ReturnStatement | PrintStatement | RaiseStatement | RethrowStatement | TryStatement} Statement */
1113
1136
  /**
1114
1137
  * @typedef Block
1115
1138
  * @property {"Block"} kind - Node discriminator.
@@ -1178,9 +1201,30 @@
1178
1201
  * @property {Block} body - Method body.
1179
1202
  * @property {readonly ["host"]} [effects] - Inferred checked host-effect fact.
1180
1203
  * @property {string[]} [failureIds] - Ordered capability failures reachable through the method.
1204
+ * @property {{interfaceId: string, methodId: string}} [implements] - Exact satisfied interface member, required after validation when the method satisfies an interface contract.
1181
1205
  * @property {SourceLocation} location - Complete method location.
1182
1206
  * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned method-name range.
1183
1207
  */
1208
+ /**
1209
+ * @typedef InterfaceMethodDeclaration
1210
+ * @property {"InterfaceMethodDeclaration"} kind - Signature-only interface contract member.
1211
+ * @property {string} [id] - Stable interface-scoped method identity, required after validation.
1212
+ * @property {string} name - Source-visible method name.
1213
+ * @property {Parameter[]} parameters - Exact positional required parameters with explicit types.
1214
+ * @property {SemanticFunctionReturnType} returnType - Exact value or void return.
1215
+ * @property {SourceLocation} location - Complete interface method location.
1216
+ * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned method-name range.
1217
+ */
1218
+ /**
1219
+ * @typedef InterfaceDeclaration
1220
+ * @property {"InterfaceDeclaration"} kind - Closed signature-only nominal interface with exact implementation contracts.
1221
+ * @property {string} [id] - Stable module-local interface identity, required after validation.
1222
+ * @property {string} name - Source-visible interface name.
1223
+ * @property {InterfaceType[]} [extends] - Direct interface parents in source order; omitted when empty.
1224
+ * @property {InterfaceMethodDeclaration[]} methods - Ordered closed signature set.
1225
+ * @property {SourceLocation} location - Complete interface location.
1226
+ * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned interface-name range.
1227
+ */
1184
1228
  /**
1185
1229
  * @typedef ClassDeclaration
1186
1230
  * @property {"ClassDeclaration"} kind - Nominal reference class with private mutable state.
@@ -1189,6 +1233,7 @@
1189
1233
  * @property {PrivateField[]} fields - Ordered private instance state.
1190
1234
  * @property {ConstructorDeclaration} constructor - Sole exact constructor.
1191
1235
  * @property {MethodDeclaration[]} methods - Ordered receiver methods.
1236
+ * @property {InterfaceType[]} [implements] - Direct interface contracts in source order; omitted when empty.
1192
1237
  * @property {{kind: "ordinary"} | {kind: "ownedResource", fieldId: string, resourceId: string}} [ownership] - Explicit class ownership profile.
1193
1238
  * @property {SourceLocation} location - Complete class location.
1194
1239
  * @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned class-name range.
@@ -1219,6 +1264,7 @@
1219
1264
  * @typedef SemanticModule
1220
1265
  * @property {"Module"} kind - Node discriminator.
1221
1266
  * @property {RecordDeclaration[]} [records] - Top-level nominal record declarations in source order; omitted when empty.
1267
+ * @property {InterfaceDeclaration[]} [interfaces] - Top-level nominal interface declarations in source order; omitted when empty.
1222
1268
  * @property {ClassDeclaration[]} [classes] - Top-level nominal reference classes in source order; omitted when empty.
1223
1269
  * @property {ErrorDeclaration[]} [errors] - Top-level nominal unchecked error declarations in source order; omitted when empty.
1224
1270
  * @property {EffectCapabilityDeclaration[]} [capabilities] - Compiler-authorized Task 034 declarations; omission is the legacy empty set.
@@ -1265,6 +1311,7 @@
1265
1311
  * @property {string} id - Stable caller-supplied logical module identity.
1266
1312
  * @property {string} sourceFilename - Explicit source filename; never an implicit read request.
1267
1313
  * @property {RecordDeclaration[]} [records] - Top-level nominal record declarations.
1314
+ * @property {InterfaceDeclaration[]} [interfaces] - Top-level nominal interface declarations.
1268
1315
  * @property {ClassDeclaration[]} [classes] - Compiler-owned facade reference classes.
1269
1316
  * @property {ErrorDeclaration[]} [errors] - Top-level nominal unchecked error declarations.
1270
1317
  * @property {FunctionDeclaration[]} functions - Top-level functions.
@@ -1306,7 +1353,7 @@
1306
1353
  * @property {{contractVersion?: string, identity: string}[]} [stdlibContracts] - Ordered declared standard-library contracts; plain, never frozen.
1307
1354
  * @property {StdlibFacadeProgramDescriptor} [stdlibFacades] - Complete selected source-language facade closure.
1308
1355
  */
1309
- /** @typedef {SemanticModule | SemanticProgramModule | SemanticImport | SemanticExport | RecordDeclaration | ClassDeclaration | ErrorDeclaration | EffectCapabilityDeclaration | EffectResourceDeclaration | EffectFailureDeclaration | EffectOperationDeclaration | RecordField | PrivateField | ConstructorDeclaration | MethodDeclaration | FunctionDeclaration | TypeParameter | Parameter | ValueBinding | CatchBinding | Block | Statement | EntryPoint | Expression | ErrorConstruction | ErrorType | MapEntry | SemanticValueType | FunctionReturnTypeReference} SemanticNode */
1356
+ /** @typedef {SemanticModule | SemanticProgramModule | SemanticImport | SemanticExport | RecordDeclaration | InterfaceDeclaration | InterfaceMethodDeclaration | ClassDeclaration | ErrorDeclaration | EffectCapabilityDeclaration | EffectResourceDeclaration | EffectFailureDeclaration | EffectOperationDeclaration | RecordField | PrivateField | ConstructorDeclaration | MethodDeclaration | FunctionDeclaration | TypeParameter | Parameter | ValueBinding | CatchBinding | CatchHandler | Block | Statement | EntryPoint | Expression | ErrorConstruction | ErrorType | MapEntry | SemanticValueType | FunctionReturnTypeReference} SemanticNode */
1310
1357
  /** @typedef {SemanticNode} SemanticNodeWithoutLocations */
1311
1358
  export {};
1312
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvdHlwZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLGtMQUFrTDtBQUNsTCxzREFBc0Q7QUFDdEQsOEZBQThGO0FBQzlGLGlFQUFpRTtBQUNqRSxtRUFBbUU7QUFDbkUsa0VBQWtFO0FBQ2xFLHVFQUF1RTtBQUN2RSw2VkFBNlY7QUFDN1YsMk9BQTJPO0FBQzNPLG1GQUFtRjtBQUNuRixnSEFBZ0g7QUFDaEgsZ0lBQWdJO0FBQ2hJLHVIQUF1SDtBQUV2SDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVIOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7R0FJRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7R0FJRztBQUVIOzs7OztHQUtHO0FBRUgsK0VBQStFO0FBRS9FOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7OztHQVFHO0FBRUgsOERBQThEO0FBRTlEOzs7Ozs7Ozs7R0FTRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7R0FJRztBQUVIOzs7OztHQUtHO0FBRUgsa0hBQWtIO0FBRWxIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVILG1MQUFtTDtBQUVuTCx5RUFBeUU7QUFFekU7Ozs7Ozs7O0dBUUc7QUFFSDs7OztHQUlHO0FBRUg7OztHQUdHO0FBRUg7Ozs7R0FJRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUgsb01BQW9NO0FBQ3BNLG1FQUFtRTtBQUVuRTs7Ozs7R0FLRztBQUVILDRGQUE0RjtBQUU1Riw4b0JBQThvQjtBQUM5b0IsMEVBQTBFO0FBRTFFOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7O0dBSUc7QUFFSCwyS0FBMks7QUFFM0s7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVILG9GQUFvRjtBQUNwRiw2TkFBNk47QUFDN04scURBQXFEO0FBQ3JELDRQQUE0UDtBQUM1UCwyWUFBMlk7QUFDM1ksd0tBQXdLO0FBQ3hLLHdJQUF3STtBQUN4SSwrU0FBK1M7QUFFL1M7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSCwyakJBQTJqQjtBQUUzakI7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVILHVFQUF1RTtBQUN2RSw2UUFBNlE7QUFFN1E7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7Ozs7Ozs7Ozs7R0FZRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7Ozs7Ozs7R0FZRztBQUVIOzs7Ozs7Ozs7Ozs7R0FZRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVILHdqQkFBd2pCO0FBQ3hqQiwyREFBMkQ7QUFFM0QsT0FBTyxFQUFFLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqIEB0eXBlZGVmIHtcInBocFwiIHwgXCJydWJ5XCIgfCBcImphdmFzY3JpcHRcIiB8IFwidHlwZXNjcmlwdFwiIHwgXCJqYXZhXCIgfCBcImtvdGxpblwiIHwgXCJweXRob25cIiB8IFwiY3NoYXJwXCIgfCBcImdvXCIgfCBcImNcIiB8IFwiY3BwXCIgfCBcInJ1c3RcIiB8IFwic3dpZnRcIiB8IFwiZGFydFwiIHwgXCJ6aWdcIn0gU2VtYW50aWNMYW5ndWFnZSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY0xhbmd1YWdlfSBUZXh0QmFja2VuZExhbmd1YWdlICovXG4vKiogQHR5cGVkZWYge1RleHRCYWNrZW5kTGFuZ3VhZ2UgfCBcIndhc21cIiB8IFwiaW9zXCIgfCBcImFuZHJvaWRcIiB8IFwiZmx1dHRlclwifSBCYWNrZW5kTGFuZ3VhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNMYW5ndWFnZSB8IFwiaHRtbFwifSBHZW5lcmF0ZWRUZXh0TGFuZ3VhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7XCJpbnRlZ2VyXCIgfCBcImJvb2xlYW5cIiB8IFwic3RyaW5nXCJ9IFNlbWFudGljVHlwZU5hbWUgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNUeXBlTmFtZSB8IFwidm9pZFwifSBGdW5jdGlvblJldHVyblR5cGVOYW1lICovXG4vKiogQHR5cGVkZWYge1wiSW50ZWdlck5lZ2F0ZVwiIHwgXCJCb29sZWFuTm90XCJ9IFNlbWFudGljVW5hcnlPcGVyYXRpb24gKi9cbi8qKiBAdHlwZWRlZiB7XCJJbnRlZ2VyQWRkXCIgfCBcIkludGVnZXJTdWJ0cmFjdFwiIHwgXCJJbnRlZ2VyTXVsdGlwbHlcIiB8IFwiQm9vbGVhbkFuZFwiIHwgXCJCb29sZWFuT3JcIiB8IFwiSW50ZWdlckVxdWFsXCIgfCBcIkludGVnZXJOb3RFcXVhbFwiIHwgXCJCb29sZWFuRXF1YWxcIiB8IFwiQm9vbGVhbk5vdEVxdWFsXCIgfCBcIlN0cmluZ0VxdWFsXCIgfCBcIlN0cmluZ05vdEVxdWFsXCIgfCBcIkludGVnZXJMZXNzVGhhblwiIHwgXCJJbnRlZ2VyTGVzc1RoYW5PckVxdWFsXCIgfCBcIkludGVnZXJHcmVhdGVyVGhhblwiIHwgXCJJbnRlZ2VyR3JlYXRlclRoYW5PckVxdWFsXCIgfCBcIlN0cmluZ0NvbmNhdFwifSBTZW1hbnRpY0JpbmFyeU9wZXJhdGlvbiAqL1xuLyoqIEB0eXBlZGVmIHtcImNhcGFiaWxpdHlcIiB8IFwicmVzb3VyY2VcIiB8IFwiZmFpbHVyZVwiIHwgXCJvcGVyYXRpb25cIiB8IFwicmVjb3JkXCIgfCBcImNsYXNzXCIgfCBcImVycm9yXCIgfCBcImZpZWxkXCIgfCBcImNvbnN0cnVjdG9yXCIgfCBcIm1ldGhvZFwiIHwgXCJmdW5jdGlvblwiIHwgXCJ0eXBlUGFyYW1ldGVyXCIgfCBcInBhcmFtZXRlclwiIHwgXCJsb2NhbFwiIHwgXCJpdGVyYXRpb25cIiB8IFwiY2F0Y2hcIn0gU2VtYW50aWNTeW1ib2xLaW5kICovXG4vKiogQHR5cGVkZWYge1wicmVjb3JkXCIgfCBcImNsYXNzXCIgfCBcImVycm9yXCIgfCBcImZ1bmN0aW9uXCJ9IFNlbWFudGljRGVjbGFyYXRpb25LaW5kICovXG4vKiogQHR5cGVkZWYge1wiZGVjbGFyYXRpb25cIiB8IFwidHlwZVwiIHwgXCJjb25zdHJ1Y3RcIiB8IFwibWVtYmVyXCIgfCBcInJlYWRcIiB8IFwid3JpdGVcIiB8IFwiY2FsbFwifSBTZW1hbnRpY1N5bWJvbFJvbGUgKi9cbi8qKiBAdHlwZWRlZiB7XCJwYXJzZVwiIHwgXCJnZW5lcmF0ZVwiIHwgXCJyZXN0b3JlXCIgfCBcImNvbXBpbGVcIiB8IFwibGlua1wiIHwgXCJ2YWxpZGF0ZVwiIHwgXCJpbnN0YW50aWF0ZVwiIHwgXCJleGVjdXRlXCJ9IEFjY2VwdGFuY2VTdGFnZSAqL1xuLyoqIEB0eXBlZGVmIHtcImVudHJ5XCIgfCBcInNvdXJjZVwiIHwgXCJtYW5pZmVzdFwiIHwgXCJzdXBwb3J0XCIgfCBcIm1hcHBpbmdcIiB8IFwicmVzb3VyY2VcIiB8IFwibG9hZGVyXCJ9IEdlbmVyYXRlZEFydGlmYWN0Um9sZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIElvc0FwcGxpY2F0aW9uQ29uZmlndXJhdGlvbklucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvZHVjdE5hbWUgLSBTYWZlIFhjb2RlIHByb2R1Y3QvcGF0aCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2R1bGVOYW1lIC0gU2FmZSBTd2lmdCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3JnYW5pemF0aW9uUHJlZml4IC0gQ2FsbGVyLXN1cHBsaWVkIHJldmVyc2UtRE5TIG9yZ2FuaXphdGlvbiBwcmVmaXguXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnVuZGxlSWRlbnRpZmllciAtIENhbGxlci1zdXBwbGllZCByZXZlcnNlLUROUyBhcHBsaWNhdGlvbiBidW5kbGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVwbG95bWVudFRhcmdldCAtIENhbGxlci1zdXBwbGllZCBtYWpvci5taW5vciBpT1MgZGVwbG95bWVudCB0YXJnZXQ7IG5ldmVyIGluZmVycmVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpc3BsYXlOYW1lIC0gVXNlci12aXNpYmxlIGFwcGxpY2F0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge1wiU291cmNlc1wifSBbc291cmNlUm9vdF0gLSBGaXhlZCBnZW5lcmF0ZWQtc291cmNlIHJvb3QuXG4gKiBAcHJvcGVydHkge1wiQXNzZXRzLnhjYXNzZXRzXCJ9IFtyZXNvdXJjZVJvb3RdIC0gRml4ZWQgY2FsbGVyLXJlc291cmNlIHJvb3QuXG4gKiBAcHJvcGVydHkge1wic3dpZnR1aVwifSBbbGlmZWN5Y2xlXSAtIFNvbGUgc3VwcG9ydGVkIGxpZmVjeWNsZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgbmV2ZXI+fSBbaW5mb1BsaXN0XSAtIENsb3NlZCBiYXNlbGluZSBjYWxsZXIgcGxpc3QgZXh0ZW5zaW9uOyBjdXJyZW50bHkgZW1wdHkuXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gW3Blcm1pc3Npb25zXSAtIFZhbGlkYXRlZCBhcyB0aGUgY2xvc2VkIGVtcHR5IGJhc2VsaW5lIHBlcm1pc3Npb25zLlxuICogQHByb3BlcnR5IHt1bmtub3duW119IFtlbnRpdGxlbWVudHNdIC0gVmFsaWRhdGVkIGFzIHRoZSBjbG9zZWQgZW1wdHkgYmFzZWxpbmUgZW50aXRsZW1lbnRzLlxuICogQHByb3BlcnR5IHt1bmtub3duW119IFtwcml2YWN5RGVjbGFyYXRpb25zXSAtIFZhbGlkYXRlZCBhcyB0aGUgY2xvc2VkIGVtcHR5IGJhc2VsaW5lIHByaXZhY3kgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHt1bmtub3duW119IFtjYXBhYmlsaXRpZXNdIC0gVmFsaWRhdGVkIGFzIHRoZSBjbG9zZWQgZW1wdHkgYmFzZWxpbmUgQXBwbGUgY2FwYWJpbGl0aWVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSW9zQXBwbGljYXRpb25Db25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvZHVjdE5hbWUgLSBWYWxpZGF0ZWQgWGNvZGUgcHJvZHVjdC9wYXRoIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZHVsZU5hbWUgLSBWYWxpZGF0ZWQgU3dpZnQgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9yZ2FuaXphdGlvblByZWZpeCAtIFZhbGlkYXRlZCByZXZlcnNlLUROUyBvcmdhbml6YXRpb24gcHJlZml4LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJ1bmRsZUlkZW50aWZpZXIgLSBWYWxpZGF0ZWQgcmV2ZXJzZS1ETlMgYXBwbGljYXRpb24gYnVuZGxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlcGxveW1lbnRUYXJnZXQgLSBWYWxpZGF0ZWQgY2FsbGVyLXN1cHBsaWVkIGRlcGxveW1lbnQgdGFyZ2V0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpc3BsYXlOYW1lIC0gVmFsaWRhdGVkIGRpc3BsYXkgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7XCJTb3VyY2VzXCJ9IHNvdXJjZVJvb3QgLSBHZW5lcmF0ZWQtc291cmNlIHJvb3QuXG4gKiBAcHJvcGVydHkge1wiQXNzZXRzLnhjYXNzZXRzXCJ9IHJlc291cmNlUm9vdCAtIENhbGxlci1yZXNvdXJjZSByb290LlxuICogQHByb3BlcnR5IHtcInN3aWZ0dWlcIn0gbGlmZWN5Y2xlIC0gU29sZSBzdXBwb3J0ZWQgbGlmZWN5Y2xlLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBuZXZlcj4+fSBpbmZvUGxpc3QgLSBFbXB0eSBjYWxsZXIgcGxpc3QgZXh0ZW5zaW9uLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBuZXZlcltdfSBwZXJtaXNzaW9ucyAtIEVtcHR5IGJhc2VsaW5lIHBlcm1pc3Npb25zLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBuZXZlcltdfSBlbnRpdGxlbWVudHMgLSBFbXB0eSBiYXNlbGluZSBlbnRpdGxlbWVudHMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IG5ldmVyW119IHByaXZhY3lEZWNsYXJhdGlvbnMgLSBFbXB0eSBiYXNlbGluZSBwcml2YWN5IGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgbmV2ZXJbXX0gY2FwYWJpbGl0aWVzIC0gRW1wdHkgYmFzZWxpbmUgQXBwbGUgY2FwYWJpbGl0aWVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSW9zQXBwbGljYXRpb25Bc3NldElucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIEZ1bGwgc2FmZSBkZXN0aW5hdGlvbiBiZWxvdyBBc3NldHMueGNhc3NldHMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGNvbnRlbnQgLSBFeGFjdCBjYWxsZXItcHJvdmlkZWQgdGV4dCBvciBieXRlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZWRpYVR5cGUgLSBFeHBsaWNpdCBhcnRpZmFjdCBtZWRpYSB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNoYTI1NiAtIExvd2VyY2FzZSBTSEEtMjU2IG9mIGV4YWN0IFVURi04IHRleHQgb3IgYnl0ZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBbmRyb2lkQXBwbGljYXRpb25Db25maWd1cmF0aW9uSW5wdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYXBwbGljYXRpb25JZF0gLSBMb3dlcmNhc2UgcmV2ZXJzZS1ETlMgQW5kcm9pZCBhcHBsaWNhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZXNwYWNlXSAtIEtvdGxpbi9BbmRyb2lkIG5hbWVzcGFjZTsgZGVmYXVsdHMgdG8gYXBwbGljYXRpb25JZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGFja2FnZU5hbWVdIC0gR2VuZXJhdGVkIEtvdGxpbiBwYWNrYWdlOyBkZWZhdWx0cyB0byBuYW1lc3BhY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FjdGl2aXR5Q2xhc3NOYW1lXSAtIExhdW5jaGVyIEFjdGl2aXR5IGNsYXNzIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Byb2R1Y3ROYW1lXSAtIERldGVybWluaXN0aWMgcHJvamVjdCBwcm9kdWN0IG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Rpc3BsYXlOYW1lXSAtIFVzZXItdmlzaWJsZSBhcHBsaWNhdGlvbiBsYWJlbC5cbiAqIEBwcm9wZXJ0eSB7MjN9IFttaW5pbXVtU2RrXSAtIFF1YWxpZmllZCBtaW5pbXVtIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gW3RhcmdldFNka10gLSBRdWFsaWZpZWQgdGFyZ2V0IEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gW2NvbXBpbGVTZGtdIC0gUXVhbGlmaWVkIGNvbXBpbGUgQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkge1wiMzUuMC4wXCJ9IFtidWlsZFRvb2xzVmVyc2lvbl0gLSBRdWFsaWZpZWQgQW5kcm9pZCBCdWlsZCBUb29scyB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt2ZXJzaW9uQ29kZV0gLSBQb3NpdGl2ZSBBbmRyb2lkIHZlcnNpb24gY29kZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyc2lvbk5hbWVdIC0gQ2Fub25pY2FsIGFwcGxpY2F0aW9uIHZlcnNpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7XCJ1bnNwZWNpZmllZFwifSBbb3JpZW50YXRpb25dIC0gQmFzZWxpbmUgb3JpZW50YXRpb24gYmVoYXZpb3IuXG4gKiBAcHJvcGVydHkge1wic3lzdGVtXCJ9IFt0aGVtZV0gLSBCYXNlbGluZSBwbGF0Zm9ybS1uYXRpdmUgdGhlbWUuXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gW3Blcm1pc3Npb25zXSAtIFZhbGlkYXRlZCBhcyB0aGUgY2xvc2VkIGVtcHR5IHBlcm1pc3Npb24gc2V0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQW5kcm9pZEFwcGxpY2F0aW9uQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcGxpY2F0aW9uSWQgLSBWYWxpZGF0ZWQgQW5kcm9pZCBhcHBsaWNhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lc3BhY2UgLSBWYWxpZGF0ZWQgQW5kcm9pZCBuYW1lc3BhY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGFja2FnZU5hbWUgLSBHZW5lcmF0ZWQgS290bGluIHBhY2thZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aXZpdHlDbGFzc05hbWUgLSBMYXVuY2hlciBBY3Rpdml0eSBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2R1Y3ROYW1lIC0gUHJvamVjdCBwcm9kdWN0IG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGlzcGxheU5hbWUgLSBVc2VyLXZpc2libGUgYXBwbGljYXRpb24gbGFiZWwuXG4gKiBAcHJvcGVydHkgezIzfSBtaW5pbXVtU2RrIC0gUXVhbGlmaWVkIG1pbmltdW0gQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkgezM1fSB0YXJnZXRTZGsgLSBRdWFsaWZpZWQgdGFyZ2V0IEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gY29tcGlsZVNkayAtIFF1YWxpZmllZCBjb21waWxlIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHtcIjM1LjAuMFwifSBidWlsZFRvb2xzVmVyc2lvbiAtIFF1YWxpZmllZCBBbmRyb2lkIEJ1aWxkIFRvb2xzIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyc2lvbkNvZGUgLSBQb3NpdGl2ZSBBbmRyb2lkIHZlcnNpb24gY29kZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uTmFtZSAtIENhbm9uaWNhbCBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge1widW5zcGVjaWZpZWRcIn0gb3JpZW50YXRpb24gLSBCYXNlbGluZSBvcmllbnRhdGlvbiBiZWhhdmlvci5cbiAqIEBwcm9wZXJ0eSB7XCJzeXN0ZW1cIn0gdGhlbWUgLSBQbGF0Zm9ybS1uYXRpdmUgdGhlbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBbmRyb2lkQXBwbGljYXRpb25JbnB1dEZpbGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gU2FmZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzZWxlY3RlZCBmaXhlZCBBbmRyb2lkIHJlc291cmNlIG9yIGFzc2V0IHJvb3QuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGNvbnRlbnQgLSBFeGFjdCBjYWxsZXItcHJvdmlkZWQgdGV4dCBvciBieXRlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZWRpYVR5cGUgLSBFeHBsaWNpdCBhcnRpZmFjdCBtZWRpYSB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNoYTI1NiAtIExvd2VyY2FzZSBTSEEtMjU2IG9mIGV4YWN0IFVURi04IHRleHQgb3IgYnl0ZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBGbHV0dGVyQXBwbGljYXRpb25Db25maWd1cmF0aW9uSW5wdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGFja2FnZU5hbWVdIC0gTG93ZXJjYXNlIERhcnQgcGFja2FnZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbb3JnYW5pemF0aW9uXSAtIExvd2VyY2FzZSByZXZlcnNlLUROUyBvd25pbmcgb3JnYW5pemF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthcHBsaWNhdGlvbklkXSAtIExvd2VyY2FzZSByZXZlcnNlLUROUyBBbmRyb2lkIGFwcGxpY2F0aW9uIGlkZW50aXR5IGV4dGVuZGluZyB0aGUgb3JnYW5pemF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthY3Rpdml0eUNsYXNzTmFtZV0gLSBHZW5lcmF0ZWQgSmF2YSBsYXVuY2hlciBBY3Rpdml0eSBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkaXNwbGF5TmFtZV0gLSBVc2VyLXZpc2libGUgYXBwbGljYXRpb24gbGFiZWwuXG4gKiBAcHJvcGVydHkgezIzfSBbbWluaW11bVNka10gLSBRdWFsaWZpZWQgbWluaW11bSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7MzV9IFt0YXJnZXRTZGtdIC0gUXVhbGlmaWVkIHRhcmdldCBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7MzV9IFtjb21waWxlU2RrXSAtIFF1YWxpZmllZCBjb21waWxlIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHtcIjM1LjAuMFwifSBbYnVpbGRUb29sc1ZlcnNpb25dIC0gUXVhbGlmaWVkIEFuZHJvaWQgQnVpbGQgVG9vbHMgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdmVyc2lvbkNvZGVdIC0gUG9zaXRpdmUgQW5kcm9pZC9GbHV0dGVyIGJ1aWxkIG51bWJlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyc2lvbk5hbWVdIC0gQ2Fub25pY2FsIGFwcGxpY2F0aW9uIHZlcnNpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7dW5rbm93bltdfSBbcGVybWlzc2lvbnNdIC0gVmFsaWRhdGVkIGFzIHRoZSBjbG9zZWQgZW1wdHkgcGVybWlzc2lvbiBzZXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBGbHV0dGVyQXBwbGljYXRpb25Db25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGFja2FnZU5hbWUgLSBWYWxpZGF0ZWQgRGFydCBwYWNrYWdlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9yZ2FuaXphdGlvbiAtIFZhbGlkYXRlZCBvd25pbmcgb3JnYW5pemF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcGxpY2F0aW9uSWQgLSBWYWxpZGF0ZWQgQW5kcm9pZCBhcHBsaWNhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3Rpdml0eUNsYXNzTmFtZSAtIEdlbmVyYXRlZCBKYXZhIGxhdW5jaGVyIEFjdGl2aXR5IGNsYXNzIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGlzcGxheU5hbWUgLSBVc2VyLXZpc2libGUgYXBwbGljYXRpb24gbGFiZWwuXG4gKiBAcHJvcGVydHkgezIzfSBtaW5pbXVtU2RrIC0gUXVhbGlmaWVkIG1pbmltdW0gQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkgezM1fSB0YXJnZXRTZGsgLSBRdWFsaWZpZWQgdGFyZ2V0IEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gY29tcGlsZVNkayAtIFF1YWxpZmllZCBjb21waWxlIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHtcIjM1LjAuMFwifSBidWlsZFRvb2xzVmVyc2lvbiAtIFF1YWxpZmllZCBBbmRyb2lkIEJ1aWxkIFRvb2xzIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyc2lvbkNvZGUgLSBQb3NpdGl2ZSBBbmRyb2lkL0ZsdXR0ZXIgYnVpbGQgbnVtYmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb25OYW1lIC0gQ2Fub25pY2FsIGFwcGxpY2F0aW9uIHZlcnNpb24gbmFtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEZsdXR0ZXJBcHBsaWNhdGlvbkFzc2V0SW5wdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gU2FmZSBwYXRoIGJlbG93IHRoZSBnZW5lcmF0ZWQgRmx1dHRlciBhc3NldHMgcm9vdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudCAtIEV4YWN0IGNhbGxlci1wcm92aWRlZCB0ZXh0IG9yIGJ5dGVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIEV4cGxpY2l0IGFydGlmYWN0IG1lZGlhIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2hhMjU2IC0gTG93ZXJjYXNlIFNIQS0yNTYgb2YgZXhhY3QgVVRGLTggdGV4dCBvciBieXRlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlUm9sZUNhcGFiaWxpdGllc1xuICogQHByb3BlcnR5IHtib29sZWFufSBmcm9udGVuZCAtIFBhcnNlciBhZGFwdGVyIGF2YWlsYWJpbGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdGV4dEJhY2tlbmQgLSBTaW5nbGUtIG9yIG11bHRpLWZpbGUgdGV4dCBiYWNrZW5kIGF2YWlsYWJpbGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYmluYXJ5QmFja2VuZCAtIEJpbmFyeSBiYWNrZW5kIGF2YWlsYWJpbGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYXBwbGljYXRpb25CYWNrZW5kIC0gQXBwbGljYXRpb24tYXJ0aWZhY3QgYmFja2VuZCBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGludGVyb3BlcmFiaWxpdHkgLSBJbnRlcm9wZXJhYmlsaXR5IGJyaWRnZSBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHByb3ZpZGVyIC0gVGFyZ2V0IGhvc3Qgc3RkbGliIHByb3ZpZGVyL25hdGl2ZS1iaW5kaW5nIGF2YWlsYWJpbGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlTWFwcGluZ0NhcGFiaWxpdGllc1xuICogQHByb3BlcnR5IHtib29sZWFufSByaWNoVGV4dCAtIEF1dGhvcml0YXRpdmUgcmljaCB0ZXh0IG1hcHBpbmdzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBzb3VyY2VNYXBWMyAtIFNvdXJjZSBNYXAgdjMgcHJvamVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYmluYXJ5UmFuZ2VzIC0gQnl0ZS1jb29yZGluYXRlIGJpbmFyeS9yZXNvdXJjZSBtYXBwaW5ncy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlQWNjZXB0YW5jZUNhcGFiaWxpdGllc1xuICogQHByb3BlcnR5IHtyZWFkb25seSBBY2NlcHRhbmNlU3RhZ2VbXX0gc3RhZ2VzIC0gQXBwbGljYWJsZSBvcmRlcmVkIGFjY2VwdGFuY2Ugc3RhZ2VzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gdG9vbGNoYWlucyAtIFJlcXVpcmVkIGNhbm9uaWNhbCB0b29sY2hhaW4gSURzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VDaGVja0NhcGFiaWxpdGllc1xuICogQHByb3BlcnR5IHtib29sZWFufSBzdXBwb3J0ZWQgLSBXaGV0aGVyIHRoZSB0YXJnZXQgb3ducyBhIGRldmVsb3BlciBjaGVjayBwbGFuLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBBY2NlcHRhbmNlU3RhZ2VbXX0gc3RhZ2VzIC0gT3JkZXJlZCBub24tZXhlY3V0aW5nIGRldmVsb3Blci1jaGVjayBzdGFnZXMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSB0b29sY2hhaW5zIC0gRXhhY3QgY2Fub25pY2FsIHRvb2xzIHJlcXVpcmVkIHRvIGNvbnN0cnVjdCB0aGUgcGxhbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlRmVhdHVyZUNhcGFiaWxpdGllc1xuICogQHByb3BlcnR5IHtib29sZWFufSBnZW5lcmFsRnVuY3Rpb25zQW5kQ2FsbHMgLSBUYXNrIDAwNSBhcmJpdHJhcnkgcmVxdWlyZWQgc2lnbmF0dXJlcywgcmVzb2x2ZWQgZGlyZWN0IGNhbGxzLCBhbmQgdm9pZCBmdW5jdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGltbXV0YWJsZUNvbGxlY3Rpb25zIC0gVGFzayAwMDYgcmVjdXJzaXZlIGltbXV0YWJsZSBsaXN0cy9tYXBzLCB0b3RhbCBhY2Nlc3MsIGFuZCBzaXplLlxuICogQHByb3BlcnR5IHtib29sZWFufSBvcHRpb25hbFZhbHVlcyAtIFRhc2sgMDA3IGV4cGxpY2l0IG9wdGlvbmFsIHZhbHVlcywgcHJlc2VuY2UgdGVzdHMsIGFuZCBndWFyZGVkIHVud3JhcC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gb3JkZXJlZExpc3RJdGVyYXRpb24gLSBUYXNrIDAwOCBvcmRlcmVkIGltbXV0YWJsZS1saXN0IGl0ZXJhdGlvbiBhbmQgbmVhcmVzdC1sb29wIGNvbnRyb2wuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG9yZGVyZWRNYXBJdGVyYXRpb24gLSBUYXNrIDAxNCBpbnNlcnRpb24tb3JkZXJlZCBpbW11dGFibGUtbWFwIHBhaXIgaXRlcmF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBjb25kaXRpb25Db250cm9sbGVkTG9vcHMgLSBUYXNrIDAzMiBzdHJpY3QtQm9vbGVhbiBwcmUtY29uZGl0aW9uIGxvb3BzIGFuZCByZXNvbHZlZCBjb250cm9sLlxuICogQHByb3BlcnR5IHtib29sZWFufSBjb25kaXRpb25hbEV4cHJlc3Npb25zIC0gVGFzayAwNDggc3RyaWN0LUJvb2xlYW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMgd2l0aCBqb2luZWQgYXJtIHR5cGVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBzdHJpbmdJbnRlcnBvbGF0aW9uIC0gVGFzayAwNDggcGFyc2VyLXByb3ZlZCBzdHJpbmcgaW50ZXJwb2xhdGlvbiBsb3dlcmVkIHRvIGNoZWNrZWQgc3RyaW5nIGNvbmNhdGVuYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNsb3NlZFJlY29yZHMgLSBUYXNrIDAwOSBub21pbmFsIGNsb3NlZCBpbW11dGFibGUgcmVjb3JkcywgY29uc3RydWN0aW9uLCBhbmQgbWVtYmVyIHJlYWRzLlxuICogQHByb3BlcnR5IHtib29sZWFufSB0eXBlZEVycm9ycyAtIFRhc2sgMDExIG5vbWluYWwgdW5jaGVja2VkIGVycm9ycywgcmFpc2VzLCBhbmQgZXhhY3QgdHlwZWQgY2F0Y2hlcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdHlwZVBhcmFtZXRlcnNBbmRHZW5lcmljcyAtIFRhc2sgMDEyIGludmFyaWFudCB1bmJvdW5kZWQgdHlwZSBwYXJhbWV0ZXJzIGFuZCBjbG9zZWQgZ2VuZXJpYyBhcHBsaWNhdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlZmVyZW5jZUNsYXNzZXMgLSBUYXNrIDAzMyBub21pbmFsIHJlZmVyZW5jZSBjbGFzc2VzLCBwcml2YXRlIGluc3RhbmNlIHN0YXRlLCBleGFjdCBjb25zdHJ1Y3RvcnMsIGFuZCByZWNlaXZlciBtZXRob2RzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBlZmZlY3RmdWxDYXBhYmlsaXRpZXNBbmRSZXNvdXJjZXMgLSBUYXNrIDAzNCBhdXRob3JpemVkIGhvc3QgZWZmZWN0cywgdHlwZWQgZmFpbHVyZXMsIGFuZCBvd25lZCByZXNvdXJjZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZUNhcGFiaWxpdGllc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gU3RhYmxlIHJlZ2lzdHJ5IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtSZWFkb25seTxMYW5ndWFnZVJvbGVDYXBhYmlsaXRpZXM+fSByb2xlcyAtIEluZGVwZW5kZW50bHkgcmVnaXN0ZXJlZCByb2xlcy5cbiAqIEBwcm9wZXJ0eSB7XCJzaW5nbGVcIiB8IFwibXVsdGlwbGVcIn0gYXJ0aWZhY3RNdWx0aXBsaWNpdHkgLSBUYXJnZXQgYXJ0aWZhY3QgbXVsdGlwbGljaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSByb3VuZFRyaXAgLSBXaGV0aGVyIGZyb250ZW5kL2JhY2tlbmQgcm91bmQtdHJpcCBhY2NlcHRhbmNlIGlzIGRlY2xhcmVkLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxMYW5ndWFnZUZlYXR1cmVDYXBhYmlsaXRpZXM+fSBmZWF0dXJlcyAtIFNlbWFudGljIGZlYXR1cmUgY2FwYWJpbGl0aWVzLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxMYW5ndWFnZU1hcHBpbmdDYXBhYmlsaXRpZXM+fSBtYXBwaW5nIC0gTWFwcGluZyBmb3Jtcy5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8TGFuZ3VhZ2VBY2NlcHRhbmNlQ2FwYWJpbGl0aWVzPn0gYWNjZXB0YW5jZSAtIFN0YWdlcyBhbmQgdG9vbGNoYWlucy5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8TGFuZ3VhZ2VDaGVja0NhcGFiaWxpdGllcz59IGNoZWNrIC0gTm9uLWV4ZWN1dGluZyBkZXZlbG9wZXItY2hlY2sgY2FwYWJpbGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNvdXJjZVBvaW50XG4gKiBAcHJvcGVydHkge251bWJlcn0gbGluZSAtIE9uZS1iYXNlZCBsaW5lLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvbHVtbiAtIE9uZS1iYXNlZCBVVEYtMTYgY29kZS11bml0IGNvbHVtbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvZmZzZXQgLSBaZXJvLWJhc2VkIFVURi0xNiBzb3VyY2Ugb2Zmc2V0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU291cmNlTG9jYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIE9yaWdpbmF0aW5nIGZpbGVuYW1lLlxuICogQHByb3BlcnR5IHtTb3VyY2VQb2ludH0gc3RhcnQgLSBJbmNsdXNpdmUgc3RhcnQuXG4gKiBAcHJvcGVydHkge1NvdXJjZVBvaW50fSBlbmQgLSBFeGNsdXNpdmUgZW5kLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVnaXN0ZXJlZFNvdXJjZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gUmVnaXN0cnktbG9jYWwgZGV0ZXJtaW5pc3RpYyBzb3VyY2UgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZW5hbWUgLSBPcmlnaW5hbCBmaWxlbmFtZSwgcHJlc2VydmVkIHZlcmJhdGltLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBjb250ZW50IC0gT3JpZ2luYWwgc291cmNlIGNvbnRlbnQsIHByZXNlcnZlZCB2ZXJiYXRpbSB3aGVuIGF2YWlsYWJsZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNMYW5ndWFnZSB8IG51bGx9IGxhbmd1YWdlIC0gUGFyc2VyIGxhbmd1YWdlIHdoZW4ga25vd24uXG4gKiBAcHJvcGVydHkge1wiYXBwbGljYXRpb25cIiB8IFwiZmFjYWRlXCJ9IFtvd25lcnNoaXBdIC0gQ2FsbGVyIG9yIGNvbXBpbGVyLW93bmVkIHNvdXJjZSByb2xlIGZvciBzZW1hbnRpYyBwcm9ncmFtcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNvdXJjZU9yaWdpblxuICogQHByb3BlcnR5IHtcInNvdXJjZVwifSBraW5kIC0gRGlyZWN0IHNvdXJjZSBwcm92ZW5hbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZUlkIC0gUmVnaXN0ZXJlZCBzb3VyY2UgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IG9yaWdpbmFsIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVsYXRlZE9yaWdpblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZUlkIC0gUmVnaXN0ZXJlZCBzb3VyY2UgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFJlbGF0ZWQgb3JpZ2luYWwgcmFuZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25vZGVJZF0gLSBSZWxhdGVkIHNlbWFudGljIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N5bWJvbElkXSAtIFJlbGF0ZWQgc2VtYW50aWMgc3ltYm9sIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb2xlXSAtIFJlbGF0aW9uc2hpcCByb2xlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRGVyaXZlZE9yaWdpblxuICogQHByb3BlcnR5IHtcImRlcml2ZWRcIn0ga2luZCAtIFByb3ZlbmFuY2UgZGVyaXZlZCBmcm9tIG9uZSBvciBtb3JlIG9yaWdpbnMuXG4gKiBAcHJvcGVydHkge1JlbGF0ZWRPcmlnaW5bXX0gb3JpZ2lucyAtIE9yZGVyZWQsIG5vbi1lbXB0eSBvcmlnaW5hbCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTeW50aGV0aWNPcmlnaW5cbiAqIEBwcm9wZXJ0eSB7XCJzeW50aGV0aWNcIn0ga2luZCAtIFNvdXJjZS1mcmVlIGdlbmVyYXRlZCBvciBzZW1hbnRpYyBzY2FmZm9sZGluZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWFzb24gLSBTdGFibGUgaHVtYW4tcmVhZGFibGUgcmVhc29uLlxuICogQHByb3BlcnR5IHtSZWxhdGVkT3JpZ2luW119IHJlbGF0ZWRPcmlnaW5zIC0gT3JkZXJlZCByZWxhdGVkIHJhbmdlcywgcG9zc2libHkgZW1wdHkuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtTb3VyY2VPcmlnaW4gfCBEZXJpdmVkT3JpZ2luIHwgU3ludGhldGljT3JpZ2lufSBTZW1hbnRpY09yaWdpbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZEJ5dGVSYW5nZVxuICogQHByb3BlcnR5IHt7c3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXJ9fSBnZW5lcmF0ZWQgLSBIYWxmLW9wZW4gZ2VuZXJhdGVkIGJ5dGUgb2Zmc2V0cy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIFNlbWFudGljIG9yIGV4cGxpY2l0IHN5bnRoZXRpYyBwcm92ZW5hbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub2RlSWRdIC0gT3JpZ2luYXRpbmcgc2VtYW50aWMgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3ltYm9sSWRdIC0gT3JpZ2luYXRpbmcgc2VtYW50aWMgc3ltYm9sIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb2xlXSAtIFNlbWFudGljIG9yIGJpbmFyeS1yZWdpb24gcm9sZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGlmb2xkQnl0ZU1hcHBpbmdcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZEJ5dGVNYXBwaW5nXCJ9IHNjaGVtYSAtIFNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gU2NoZW1hIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1wiYnl0ZXNcIn0gY29vcmRpbmF0ZVN5c3RlbSAtIEdlbmVyYXRlZCBvZmZzZXRzIGFyZSBieXRlcywgbmV2ZXIgdGV4dCBjb2x1bW5zLlxuICogQHByb3BlcnR5IHt7cGF0aDogc3RyaW5nLCBieXRlTGVuZ3RoOiBudW1iZXJ9fSBnZW5lcmF0ZWQgLSBHZW5lcmF0ZWQgYXJ0aWZhY3QgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEdlbmVyYXRlZEJ5dGVSYW5nZVtdfSByYW5nZXMgLSBPcmRlcmVkIG5vbi1vdmVybGFwcGluZyByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGROb2RlUHJvdmVuYW5jZVwifSBzY2hlbWEgLSBBc3NvY2lhdGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gQXNzb2NpYXRpb24gdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIFNvdXJjZSBhc3NvY2lhdGlvbiBpbmRlcGVuZGVudCBvZiB0cmF2ZXJzYWwgcG9zaXRpb24uXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFNvdXJjZUxvY2F0aW9uPj59IHJhbmdlcyAtIEV4YWN0IHNlbWFudGljLXRva2VuIHN1YnJhbmdlcyBieSByb2xlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNOb2RlUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gSlNPTiBQb2ludGVyIGZyb20gdGhlIHNlbWFudGljIG1vZHVsZSByb290LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVbXCJraW5kXCJdIHwgXCJUeXBlUmVmZXJlbmNlXCJ9IGtpbmQgLSBTZW1hbnRpYyBub2RlIGtpbmQuXG4gKiBAcHJvcGVydHkge1NlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgcHJvdmVuYW5jZSB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgU291cmNlTG9jYXRpb24+Pn0gcmFuZ2VzIC0gRXhhY3Qgc2VtYW50aWMtdG9rZW4gc3VicmFuZ2VzIGJ5IHJvbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N5bWJvbElkXSAtIFJlc29sdmVkIGRlY2xhcmVkL3JlZmVyZW5jZWQgc3ltYm9sIGlkZW50aXR5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNTeW1ib2xSZWZlcmVuY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBub2RlSWQgLSBSZWZlcnJpbmcgc2VtYW50aWMgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xSb2xlfSByb2xlIC0gUmVmZXJlbmNlIHJvbGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IHJlZmVyZW5jZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljU3ltYm9sUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgc3ltYm9sIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTZW1hbnRpYyBzeW1ib2wgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xLaW5kfSBraW5kIC0gU3ltYm9sIGNhdGVnb3J5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uTm9kZUlkIC0gRGVjbGFyaW5nIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbWFudGljRGVjbGFyYXRpb25JZF0gLSBTdGFibGUgc2VtYW50aWMgZGVjbGFyYXRpb24gaWRlbnRpdHkgZm9yIHJlY29yZCwgZmllbGQsIGFuZCBmdW5jdGlvbiBzeW1ib2xzLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCBkZWNsYXJhdGlvbi1uYW1lIHJhbmdlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1N5bWJvbFJlZmVyZW5jZVtdfSByZWZlcmVuY2VzIC0gT3JkZXJlZCByZXNvbHZlZCByZWZlcmVuY2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRQcm92ZW5hbmNlXCJ9IHNjaGVtYSAtIFNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gU2NoZW1hIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1widXRmMTZcIn0gY29vcmRpbmF0ZVN5c3RlbSAtIE9mZnNldCBhbmQgY29sdW1uIHVuaXQuXG4gKiBAcHJvcGVydHkge1JlZ2lzdGVyZWRTb3VyY2VbXX0gc291cmNlcyAtIFZlcnNpb25lZCBzb3VyY2UgcmVnaXN0cnkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVByb3ZlbmFuY2VbXX0gbm9kZXMgLSBEZXRlcm1pbmlzdGljIG5vZGUgaW5kZXguXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUHJvdmVuYW5jZVtdfSBzeW1ib2xzIC0gRGV0ZXJtaW5pc3RpYyBzeW1ib2wgaW5kZXguXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtcImV4YWN0XCIgfCBcImFuY2hvclwiIHwgXCJzeW50aGV0aWNcIn0gTWFwcGluZ0tpbmQgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpZm9sZE1hcHBpbmdTcGFuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBnZW5lcmF0ZWQgLSBHZW5lcmF0ZWQgaGFsZi1vcGVuIHJhbmdlLlxuICogQHByb3BlcnR5IHtNYXBwaW5nS2luZH0gbWFwcGluZ0tpbmQgLSBNYXBwaW5nIHByZWNpc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIENsb3NlZCBvcmlnaW5hbCBwcm92ZW5hbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub2RlSWRdIC0gUmVsYXRlZCBjYW5vbmljYWwgc2VtYW50aWMgbm9kZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3ltYm9sSWRdIC0gUmVsYXRlZCBjYW5vbmljYWwgc2VtYW50aWMgc3ltYm9sLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb2xlXSAtIFNlbWFudGljIHRva2VuIHJvbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gVXNlZnVsIHN5bWJvbCBuYW1lIGZvciBTb3VyY2UgTWFwIHYzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGVkU291cmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZW5hbWUgLSBPdXRwdXQgZmlsZW5hbWUuXG4gKiBAcHJvcGVydHkge0dlbmVyYXRlZFRleHRMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBPdXRwdXQgdGV4dCBsYW5ndWFnZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250ZW50IC0gRXhhY3QgZ2VuZXJhdGVkIExGIHNvdXJjZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGlmb2xkTWFwcGluZ1xuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkTWFwcGluZ1wifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIFNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtcInV0ZjE2XCJ9IGNvb3JkaW5hdGVTeXN0ZW0gLSBPZmZzZXQgYW5kIGNvbHVtbiB1bml0LlxuICogQHByb3BlcnR5IHtHZW5lcmF0ZWRTb3VyY2V9IGdlbmVyYXRlZCAtIEdlbmVyYXRlZCBwcm9ncmFtIGlkZW50aXR5IGFuZCBjb250ZW50LlxuICogQHByb3BlcnR5IHtSZWdpc3RlcmVkU291cmNlW119IHNvdXJjZXMgLSBPcmlnaW5hbCBzb3VyY2UgcmVnaXN0cnkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVByb3ZlbmFuY2VbXX0gbm9kZXMgLSBDYW5vbmljYWwgc2VtYW50aWMgbm9kZSBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xQcm92ZW5hbmNlW119IHN5bWJvbHMgLSBDYW5vbmljYWwgc2VtYW50aWMgc3ltYm9sIGluZGV4LlxuICogQHByb3BlcnR5IHtTZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119IHNwYW5zIC0gT3JkZXJlZCBnZW5lcmF0ZWQgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGVkQXJ0aWZhY3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb2RlIC0gR2VuZXJhdGVkIG91dHB1dCBwcm9ncmFtLCBpbmNsdWRpbmcgYW55IHJlcXVlc3RlZCBkaXJlY3RpdmUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZW5hbWUgLSBHZW5lcmF0ZWQgb3V0cHV0IGZpbGVuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIE91dHB1dCBsYW5ndWFnZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gQXV0aG9yaXRhdGl2ZSByaWNoIG1hcHBpbmcuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nXCIpLkVuY29kZWRTb3VyY2VNYXB9IHNvdXJjZU1hcCAtIFNvdXJjZSBNYXAgdjMgcHJvamVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VNYXBGaWxlbmFtZSAtIERlZmF1bHQgZXh0ZXJuYWwgU291cmNlIE1hcCBmaWxlbmFtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFRleHRBcnRpZmFjdFByb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7XCJ0ZXh0XCJ9IGtpbmQgLSBSaWNoIHRleHQgcHJvdmVuYW5jZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpZm9sZE1hcHBpbmd9IG1hcHBpbmcgLSBBdXRob3JpdGF0aXZlIHJhbmdlIG1hcHBpbmcuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nXCIpLkVuY29kZWRTb3VyY2VNYXB9IHNvdXJjZU1hcCAtIEludGVyb3BlcmFibGUgcHJvamVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc291cmNlTWFwRmlsZW5hbWVdIC0gTG9naWNhbCBTb3VyY2UgTWFwIHNpZGVjYXIgcGF0aC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJ5dGVBcnRpZmFjdFByb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7XCJieXRlc1wifSBraW5kIC0gQnl0ZSBwcm92ZW5hbmNlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGlmb2xkQnl0ZU1hcHBpbmd9IG1hcHBpbmcgLSBBdXRob3JpdGF0aXZlIGJ5dGUgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQXJ0aWZhY3RTeW50aGV0aWNQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1wic3ludGhldGljXCJ9IGtpbmQgLSBTeW50aGV0aWMgYXJ0aWZhY3QgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWFzb24gLSBFeHBsaWNpdCB0YXJnZXQtc2NhZmZvbGRpbmcgcmVhc29uLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBSZWxhdGVkT3JpZ2luW119IHJlbGF0ZWRPcmlnaW5zIC0gUmVsYXRlZCBzZW1hbnRpYyBzb3VyY2UgcmFuZ2VzLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7VGV4dEFydGlmYWN0UHJvdmVuYW5jZSB8IEJ5dGVBcnRpZmFjdFByb3ZlbmFuY2UgfCBBcnRpZmFjdFN5bnRoZXRpY1Byb3ZlbmFuY2V9IEFydGlmYWN0UHJvdmVuYW5jZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZFNldEFydGlmYWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIFVuaXF1ZSBzYWZlIHJlbGF0aXZlIFBPU0lYIHBhdGguXG4gKiBAcHJvcGVydHkge1widGV4dFwiIHwgXCJiaW5hcnlcIn0gY29udGVudEtpbmQgLSBDb250ZW50IHJlcHJlc2VudGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBVaW50OEFycmF5fSBjb250ZW50IC0gVGV4dCBvciBhIGRldGFjaGVkIGNvcHkgb2YgdGhlIGV4YWN0IGdlbmVyYXRlZCBieXRlcyBvbiBldmVyeSBiaW5hcnkgcmVhZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZWRpYVR5cGUgLSBBcnRpZmFjdCBtZWRpYSB0eXBlLlxuICogQHByb3BlcnR5IHtHZW5lcmF0ZWRBcnRpZmFjdFJvbGV9IHJvbGUgLSBBcnRpZmFjdCByb2xlOyBleGFjdGx5IG9uZSBzZXQgYXJ0aWZhY3QgaXMgZW50cnkuXG4gKiBAcHJvcGVydHkge1wiZ2VuZXJhdGVkXCJ9IG93bmVyc2hpcCAtIFRhc2stMDE1IG93bmVyc2hpcCBjb250cmFjdC5cbiAqIEBwcm9wZXJ0eSB7QXJ0aWZhY3RQcm92ZW5hbmNlfSBwcm92ZW5hbmNlIC0gVGV4dCwgYnl0ZS1yYW5nZSwgb3Igc3ludGhldGljIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRBcnRpZmFjdFNldFxuICogQHByb3BlcnR5IHtcIkdlbmVyYXRlZEFydGlmYWN0U2V0XCJ9IHNjaGVtYSAtIFNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gU2NoZW1hIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0IC0gU3RhYmxlIGxhbmd1YWdlIG9yIHRhcmdldCBJRC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlbnRyeSAtIFBhdGggb2YgdGhlIHNvbGUgZGVjbGFyZWQgZW50cnkgYXJ0aWZhY3QuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEdlbmVyYXRlZFNldEFydGlmYWN0W119IGFydGlmYWN0cyAtIERldGVybWluaXN0aWMgYXJ0aWZhY3Qgb3JkZXIuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pn0gW21ldGFkYXRhXSAtIERldGFjaGVkIHRhcmdldC1zcGVjaWZpYyBKU09OIG1ldGFkYXRhLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHVibGljYXRpb25CdWlsZEFydGlmYWN0SW5wdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gTm9ybWFsaXplZCBwYXRoIHJlbGF0aXZlIHRvIHRoZSB0YXJnZXQgYnVpbGQgcHJvamVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZWRpYVR5cGUgLSBTdGFibGUgbWVkaWEgdHlwZSBmb3IgdGhlIHZhbGlkYXRvci9jb21waWxlciBvdXRwdXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcm9sZSAtIFN0YWJsZSBsYW5ndWFnZS1uZXV0cmFsIHJvbGUgZm9yIHRoZSB2YWxpZGF0b3IvY29tcGlsZXIgb3V0cHV0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHVibGljYXRpb25WYWxpZGF0b3JDb250ZXh0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0SWQgLSBFeHBsaWNpdCB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlUGF0aCAtIEV4YWN0IGdlbmVyYXRpb24tc2NvcGVkIGdlbmVyYXRlZC1zb3VyY2UgZGlyZWN0b3J5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJ1aWxkUGF0aCAtIEV4YWN0IGdlbmVyYXRpb24tc2NvcGVkIGNvbXBpbGVyLW91dHB1dCBkaXJlY3RvcnkuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHsoY29udGV4dDogUmVhZG9ubHk8UHVibGljYXRpb25WYWxpZGF0b3JDb250ZXh0PikgPT4gUHJvbWlzZTxQdWJsaWNhdGlvbkJ1aWxkQXJ0aWZhY3RJbnB1dFtdIHwgdm9pZD4gfCBQdWJsaWNhdGlvbkJ1aWxkQXJ0aWZhY3RJbnB1dFtdIHwgdm9pZH0gUHVibGljYXRpb25WYWxpZGF0b3IgKi9cblxuLyoqIEB0eXBlZGVmIHtcInRleHRcIiB8IFwiYmluYXJ5XCIgfCBcImFwcGxpY2F0aW9uXCJ9IFB1YmxpY2F0aW9uVGFyZ2V0Um9sZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFB1YmxpY2F0aW9uVGFyZ2V0SW5wdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIEV4cGxpY2l0IHByb2plY3QgdGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtHZW5lcmF0ZWRBcnRpZmFjdFNldH0gYXJ0aWZhY3RTZXQgLSBDb21wbGV0ZSBhbHJlYWR5LXZhbGlkYXRlZCBnZW5lcmF0ZWQgYXJ0aWZhY3RzLlxuICogQHByb3BlcnR5IHtQdWJsaWNhdGlvblRhcmdldFJvbGV9IHJvbGUgLSBFeHBsaWNpdCBsYW5ndWFnZS1uZXV0cmFsIHRhcmdldCByb2xlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZVByb2plY3Rpb24gLSBHZW5lcmF0aW9uLXJlbGF0aXZlIGdlbmVyYXRlZC1zb3VyY2UgcHJvamVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBidWlsZFByb2plY3Rpb24gLSBHZW5lcmF0aW9uLXJlbGF0aXZlIGNvbXBpbGVyLW91dHB1dCBwcm9qZWN0aW9uLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBQdWJsaWNhdGlvblZhbGlkYXRvcltdfSBbdmFsaWRhdG9yc10gLSBPcmRlcmVkIGNhbmRpZGF0ZSB2YWxpZGF0b3JzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHVibGljYXRpb25SZXF1ZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZ2VuZXJhdGlvbklkIC0gRXhwbGljaXQgZ2VuZXJhdGlvbi9jeWNsZSBpZGVudGl0eSwgZnJlc2ggb3IgYW4gZXhhY3QgcmV0YWluZWQgdmFsaWRhdG9yLWZyZWUgY2FuZGlkYXRlLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBQdWJsaWNhdGlvblRhcmdldElucHV0W119IHRhcmdldHMgLSBDb21wbGV0ZSBvcmRlcmVkIHByb2plY3QgdGFyZ2V0cy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFB1YmxpY2F0aW9uT3B0aW9uc1xuICogQHByb3BlcnR5IHtBYm9ydFNpZ25hbH0gW3NpZ25hbF0gLSBDYW5jZWxsYXRpb24gYXV0aG9yaXR5IHRocm91Z2ggdGhlIGFjdGl2ZS1wb2ludGVyIGNvbW1pdCBib3VuZGFyeS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRpb25Db250ZW50SGFzaFxuICogQHByb3BlcnR5IHtcInNoYTI1NlwifSBhbGdvcml0aG0gLSBIYXNoIGFsZ29yaXRobS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2YWx1ZSAtIExvd2VyY2FzZSBoZXhhZGVjaW1hbCBkaWdlc3QuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0aW9uQXJ0aWZhY3RNYW5pZmVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBBcnRpZmFjdC1zZXQtcmVsYXRpdmUgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7XCJ0ZXh0XCIgfCBcImJpbmFyeVwifSBjb250ZW50S2luZCAtIE9yaWdpbmFsIGFydGlmYWN0IGNvbnRlbnQgcmVwcmVzZW50YXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gRGVjbGFyZWQgYXJ0aWZhY3QgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGVkQXJ0aWZhY3RSb2xlfSByb2xlIC0gRGVjbGFyZWQgYXJ0aWZhY3Qgcm9sZS5cbiAqIEBwcm9wZXJ0eSB7QXJ0aWZhY3RQcm92ZW5hbmNlfSBwcm92ZW5hbmNlIC0gQ29tcGxldGUgcGVyc2lzdGVkIHJpY2gsIGJ5dGUsIG9yIHN5bnRoZXRpYyBwcm92ZW5hbmNlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJ5dGVMZW5ndGggLSBFeGFjdCBzdGFnZWQgYnl0ZSBsZW5ndGguXG4gKiBAcHJvcGVydHkge0dlbmVyYXRpb25Db250ZW50SGFzaH0gaGFzaCAtIEV4YWN0IHN0YWdlZCBieXRlIGhhc2guXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0aW9uQnVpbGRBcnRpZmFjdE1hbmlmZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIEJ1aWxkLXByb2plY3Rpb24tcmVsYXRpdmUgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZWRpYVR5cGUgLSBEZWNsYXJlZCB2YWxpZGF0b3IvY29tcGlsZXIgb3V0cHV0IG1lZGlhIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcm9sZSAtIERlY2xhcmVkIGxhbmd1YWdlLW5ldXRyYWwgdmFsaWRhdG9yL2NvbXBpbGVyIG91dHB1dCByb2xlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJ5dGVMZW5ndGggLSBFeGFjdCBzdGFnZWQgYnl0ZSBsZW5ndGguXG4gKiBAcHJvcGVydHkge0dlbmVyYXRpb25Db250ZW50SGFzaH0gaGFzaCAtIEV4YWN0IHN0YWdlZCBieXRlIGhhc2guXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0aW9uVGFyZ2V0TWFuaWZlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIEV4cGxpY2l0IHByb2plY3QgdGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtQdWJsaWNhdGlvblRhcmdldFJvbGV9IHJvbGUgLSBFeHBsaWNpdCBsYW5ndWFnZS1uZXV0cmFsIHRhcmdldCByb2xlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldCAtIEFydGlmYWN0LXNldCBiYWNrZW5kIHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7e3NvdXJjZTogc3RyaW5nLCBidWlsZDogc3RyaW5nfX0gcHJvamVjdGlvbnMgLSBEaXNqb2ludCBnZW5lcmF0aW9uLXJlbGF0aXZlIHByb2plY3Rpb25zLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBHZW5lcmF0aW9uQXJ0aWZhY3RNYW5pZmVzdFtdfSBhcnRpZmFjdHMgLSBPcmRlcmVkIGdlbmVyYXRlZCBhcnRpZmFjdHMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEdlbmVyYXRpb25CdWlsZEFydGlmYWN0TWFuaWZlc3RbXX0gYnVpbGRBcnRpZmFjdHMgLSBPcmRlcmVkIHZhbGlkYXRvci9jb21waWxlciBvdXRwdXRzLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj59IFttZXRhZGF0YV0gLSBQZXJzaXN0ZWQgdGFyZ2V0LXNwZWNpZmljIGFydGlmYWN0LXNldCBtZXRhZGF0YS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRpb25NYW5pZmVzdFxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkR2VuZXJhdGlvbk1hbmlmZXN0XCJ9IHNjaGVtYSAtIFNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gTWFuaWZlc3Qgc2NoZW1hIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvamVjdElkIC0gRXhwbGljaXQgcHJvamVjdCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBnZW5lcmF0aW9uSWQgLSBFeHBsaWNpdCBnZW5lcmF0aW9uL2N5Y2xlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBHZW5lcmF0aW9uVGFyZ2V0TWFuaWZlc3RbXX0gdGFyZ2V0cyAtIENvbXBsZXRlIG9yZGVyZWQgdGFyZ2V0IHJlY29yZHMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQdWJsaXNoZWRUYXJnZXRQYXRoc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRXhwbGljaXQgcHJvamVjdCB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1B1YmxpY2F0aW9uVGFyZ2V0Um9sZX0gcm9sZSAtIEV4cGxpY2l0IGxhbmd1YWdlLW5ldXRyYWwgdGFyZ2V0IHJvbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlUGF0aCAtIEV4YWN0IGltbXV0YWJsZSBnZW5lcmF0ZWQtc291cmNlIGRpcmVjdG9yeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBidWlsZFBhdGggLSBFeGFjdCBpbW11dGFibGUgY29tcGlsZXItb3V0cHV0IGRpcmVjdG9yeS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFB1Ymxpc2hlZEdlbmVyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBnZW5lcmF0aW9uSWQgLSBSZXNvbHZlZCBnZW5lcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGdlbmVyYXRpb25QYXRoIC0gRXhhY3QgaW1tdXRhYmxlIGdlbmVyYXRpb24gZGlyZWN0b3J5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1hbmlmZXN0UGF0aCAtIEV4YWN0IGdlbmVyYXRpb24gbWFuaWZlc3QgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGlvbk1hbmlmZXN0fSBtYW5pZmVzdCAtIFZlcmlmaWVkIGltbXV0YWJsZSBnZW5lcmF0aW9uIG1hbmlmZXN0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBQdWJsaXNoZWRUYXJnZXRQYXRoc1tdfSB0YXJnZXRzIC0gRXhhY3QgZ2VuZXJhdGlvbi1zY29wZWQgdGFyZ2V0IHBhdGhzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBjbGVhbnVwUGVuZGluZyAtIFdoZXRoZXIgcG9zdC1jb21taXQgam91cm5hbCBjbGVhbnVwIHJlbWFpbnMgZm9yIHJlY292ZXJ5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRGlzY292ZXJlZFRvb2xjaGFpblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gVG9vbGNoYWluIElELlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbW1hbmQgLSBEb2N1bWVudGVkIGNhbm9uaWNhbCBjb21tYW5kLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4ZWN1dGFibGUgLSBFeGFjdCBhYnNvbHV0ZSBleGVjdXRhYmxlIHBhdGguXG4gKiBAcHJvcGVydHkge1wib3ZlcnJpZGVcIiB8IFwiY2Fub25pY2FsXCJ9IHNvdXJjZSAtIFJlc29sdXRpb24gcm91dGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbiAtIEZpcnN0IHNlbGVjdGVkLXN0cmVhbSB2ZXJzaW9uIGxpbmUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbk91dHB1dCAtIENvbXBsZXRlIG5vcm1hbGl6ZWQgc3Rkb3V0LCBvciBub3JtYWxpemVkIHN0ZGVyciB3aGVuIHN0ZG91dCBpcyBlbXB0eS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IHZlcnNpb25Bcmd1bWVudHMgLSBFeGFjdCB2ZXJzaW9uIGFyZ3VtZW50IGFycmF5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVGFyZ2V0Q2hlY2tQYXRoQXJndW1lbnRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpbmRleCAtIEV4YWN0IGFyZ3YgaW5kZXggY29udGFpbmluZyB0aGUgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7XCJzb3VyY2VcIiB8IFwiYnVpbGRcIn0gb3duZXJzaGlwIC0gQ2FuZGlkYXRlIHN1YnRyZWUgdGhhdCBvd25zIHRoZSBwYXRoLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwcmVmaXhdIC0gRXhhY3Qgbm9uLXBhdGggYXJndiBwcmVmaXggcHJlY2VkaW5nIGFuIG93bmVkIGFic29sdXRlIHBhdGguXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUYXJnZXRDaGVja0Vudmlyb25tZW50UGF0aFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBFeGFjdCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb250YWluaW5nIGFuIG93bmVkIGFic29sdXRlIHBhdGguXG4gKiBAcHJvcGVydHkge1wic291cmNlXCIgfCBcImJ1aWxkXCIgfCBcInRvb2xcIn0gb3duZXJzaGlwIC0gQ2FuZGlkYXRlIHN1YnRyZWUgb3IgZGlzY292ZXJlZCB0b29sIHRoYXQgb3ducyB0aGUgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7RGlzY292ZXJlZFRvb2xjaGFpbn0gW3Rvb2xdIC0gRXhhY3QgdG9vbCBleGVjdXRhYmxlIGJvdW5kIGJ5IGEgdG9vbC1vd25lZCBlbnZpcm9ubWVudCB2YWx1ZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFRhcmdldENoZWNrT3V0cHV0T3duZXJzaGlwXG4gKiBAcHJvcGVydHkge1wiYnVpbGRcIn0gb3duZXJzaGlwIC0gQ29tcGlsZXIgb3V0cHV0cyBiZWxvbmcgb25seSB0byB0aGUgY2FuZGlkYXRlIGJ1aWxkIHN1YnRyZWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIEV4YWN0IGdlbmVyYXRpb24tc2NvcGVkIGJ1aWxkIHJvb3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gTWVkaWEgdHlwZSBhc3NpZ25lZCB0byBldmVyeSBwcm9kdWNlZCByZWd1bGFyIGZpbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcm9sZSAtIExhbmd1YWdlLW5ldXRyYWwgY29tcGlsZXItb3V0cHV0IHJvbGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUYXJnZXRDaGVja1N0YWdlUmVxdWVzdFxuICogQHByb3BlcnR5IHtBY2NlcHRhbmNlU3RhZ2V9IHN0YWdlIC0gRGVjbGFyZWQgbm9uLWV4ZWN1dGluZyBhY2NlcHRhbmNlIHN0YWdlLlxuICogQHByb3BlcnR5IHtEaXNjb3ZlcmVkVG9vbGNoYWlufSB0b29sIC0gRXhhY3QgaW1tdXRhYmxlIGRpc2NvdmVyZWQgdG9vbCByZWNvcmQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXhlY3V0YWJsZSAtIEV4YWN0IGV4ZWN1dGFibGUgY29waWVkIGZyb20gdGhlIHRvb2wgcmVjb3JkLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gYXJndiAtIEV4YWN0IHNoZWxsLWZyZWUgYXJndW1lbnQgdmVjdG9yLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBUYXJnZXRDaGVja1BhdGhBcmd1bWVudFtdfSBwYXRoQXJndW1lbnRzIC0gQ29tcGxldGUgb3duZXJzaGlwIGRlY2xhcmF0aW9uIGZvciBhcmd2IHBhdGhzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGN3ZCAtIEV4YWN0IGNhbmRpZGF0ZS1zY29wZWQgd29ya2luZyBkaXJlY3RvcnkuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+fSBlbnZpcm9ubWVudCAtIEV4YWN0IGRldGVybWluaXN0aWMgZW52aXJvbm1lbnQuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFRhcmdldENoZWNrRW52aXJvbm1lbnRQYXRoW119IGVudmlyb25tZW50UGF0aHMgLSBPd25lZCBhYnNvbHV0ZSBlbnZpcm9ubWVudCBwYXRocy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gaW5wdXRIYXNoIC0gU0hBLTI1NiBvZiBkZWNsYXJlZCByZXN0b3JlIGlucHV0cywgb3IgbnVsbCBmb3IgdW5jb25kaXRpb25hbCBzdGFnZXMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSBpbnB1dHMgLSBDb21wbGV0ZSBzdGFnZWQgYXJ0aWZhY3QgaW5wdXRzIHJlYWQgYnkgdGhlIHN0YWdlLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxUYXJnZXRDaGVja091dHB1dE93bmVyc2hpcD4gfCBudWxsfSBvdXRwdXQgLSBCdWlsZCBvdXRwdXQgb3duZXJzaGlwLCBvciBudWxsIGZvciBub24tcHJvZHVjaW5nIGNoZWNrcy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IHRyYW5zaWVudFBhdGhzIC0gQ2FuZGlkYXRlIHNvdXJjZS9idWlsZCBjYWNoZSBvciBpbnRlcm1lZGlhdGUgZGlyZWN0b3JpZXMgcmVtb3ZlZCBhZnRlciBjaGVja2luZy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFRhcmdldENoZWNrUGxhblxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkVGFyZ2V0Q2hlY2tQbGFuXCJ9IHNjaGVtYSAtIFBsYW4gc2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBQbGFuIHNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtcImRldmVsb3Blci1jaGVja1wifSBtb2RlIC0gTm9uLWV4ZWN1dGluZyBkZXZlbG9wZXItY2hlY2sgbW9kZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9qZWN0SWQgLSBFeGFjdCBwcm9qZWN0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldElkIC0gRXhhY3QgcHJvamVjdCB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0IC0gUmVnaXN0ZXJlZCBiYWNrZW5kIHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VQYXRoIC0gRXhhY3Qgc3RhZ2VkIGdlbmVyYXRlZC1zb3VyY2Ugcm9vdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBidWlsZFBhdGggLSBFeGFjdCBzdGFnZWQgY29tcGlsZXItb3V0cHV0IHJvb3QuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSBhcnRpZmFjdFBhdGhzIC0gRXhhY3Qgc3RhZ2VkIGFydGlmYWN0IHBhdGhzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBUYXJnZXRDaGVja1N0YWdlUmVxdWVzdFtdfSBzdGFnZXMgLSBPcmRlcmVkIHRhcmdldC1vd25lZCByZXF1ZXN0cy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFRhcmdldENoZWNrU3RhZ2VSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7QWNjZXB0YW5jZVN0YWdlfSBzdGFnZSAtIENvbXBsZXRlZCBzdGFnZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8e2NvbW1hbmQ6IHN0cmluZywgZXhlY3V0YWJsZTogc3RyaW5nLCBpZDogc3RyaW5nLCBzb3VyY2U6IFwib3ZlcnJpZGVcIiB8IFwiY2Fub25pY2FsXCIsIHZlcnNpb246IHN0cmluZ30+fSB0b29sIC0gRXhhY3QgdG9vbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IGFyZ3YgLSBFeGFjdCBleGVjdXRlZCBhcmd1bWVudCB2ZWN0b3IuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZXhpdENvZGUgLSBTdWNjZXNzZnVsIHByb2Nlc3MgZXhpdCBjb2RlLlxuICogQHByb3BlcnR5IHtudWxsfSBzaWduYWwgLSBTdWNjZXNzZnVsIHByb2Nlc3Mgc2lnbmFsIHN0YXRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0ZG91dCAtIEJvdW5kZWQgY2FwdHVyZWQgc3RhbmRhcmQgb3V0cHV0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0ZGVyciAtIEJvdW5kZWQgY2FwdHVyZWQgc3RhbmRhcmQgZXJyb3IuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZHVyYXRpb25NcyAtIE5vbi1uZWdhdGl2ZSBzdGFnZSBkdXJhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFRhcmdldENoZWNrUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvamVjdElkIC0gRXhhY3QgcHJvamVjdCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXRJZCAtIEV4YWN0IHByb2plY3QgdGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldCAtIFJlZ2lzdGVyZWQgYmFja2VuZCB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFRhcmdldENoZWNrU3RhZ2VSZXN1bHRbXX0gc3RhZ2VzIC0gT3JkZXJlZCBzdWNjZXNzZnVsIHN0YWdlIGV2aWRlbmNlLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBQdWJsaWNhdGlvbkJ1aWxkQXJ0aWZhY3RJbnB1dFtdfSBvdXRwdXRzIC0gQ29tcGxldGUgY29tcGlsZXItb3duZWQgYnVpbGQgZmlsZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBY2NlcHRhbmNlU3RhZ2VSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7QWNjZXB0YW5jZVN0YWdlfSBzdGFnZSAtIENvbXBsZXRlZCBzdGFnZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleGVjdXRhYmxlIC0gRXhhY3QgZXhlY3V0YWJsZSB1c2VkLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gYXJndW1lbnRzIC0gRXhhY3QgYXJndW1lbnQgYXJyYXkgdXNlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uIC0gRGlzY292ZXJlZCB0b29sIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3Rkb3V0IC0gQ2FwdHVyZWQgc3RhbmRhcmQgb3V0cHV0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0ZGVyciAtIENhcHR1cmVkIHN0YW5kYXJkIGVycm9yLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQWNjZXB0YW5jZVJlc3VsdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldCAtIFRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkaXJlY3RvcnkgLSBSZW1vdmVkIGlzb2xhdGVkIHByb2plY3QgZGlyZWN0b3J5IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBBY2NlcHRhbmNlU3RhZ2VSZXN1bHRbXX0gc3RhZ2VzIC0gT3JkZXJlZCBjb21wbGV0ZWQgc3RhZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVHlwZVJlZmVyZW5jZVxuICogQHByb3BlcnR5IHtcIlR5cGVSZWZlcmVuY2VcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlTmFtZX0gbmFtZSAtIE5vcm1hbGl6ZWQgc2NhbGFyIHZhbHVlIHR5cGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UgdGhhdCBzdXJ2aXZlcyBzZW1hbnRpYyB0cmFuc2Zvcm1zLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVHlwZVBhcmFtZXRlclxuICogQHByb3BlcnR5IHtcIlR5cGVQYXJhbWV0ZXJcIn0ga2luZCAtIERlY2xhcmF0aW9uLXNjb3BlZCBpbnZhcmlhbnQgdW5ib3VuZGVkIHR5cGUgcGFyYW1ldGVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgZGVjbGFyYXRpb24tc2NvcGVkIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSB0eXBlIHBhcmFtZXRlciBuYW1lLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBQYXJzZXItb3duZWQgZGVjbGFyYXRpb24gbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBkZWNsYXJhdGlvbi1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVHlwZVZhcmlhYmxlUmVmZXJlbmNlXG4gKiBAcHJvcGVydHkge1wiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCJ9IGtpbmQgLSBSZWZlcmVuY2UgdG8gb25lIGRlY2xhcmF0aW9uLXNjb3BlZCB0eXBlIHBhcmFtZXRlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXJhbWV0ZXJJZCAtIFN0YWJsZSByZWZlcmVuY2VkIHR5cGUtcGFyYW1ldGVyIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBQYXJzZXItb3duZWQgcmVmZXJlbmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHlwZS1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGlzdFR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJMaXN0VHlwZVwifSBraW5kIC0gUmVjdXJzaXZlIGxpc3QtdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gZWxlbWVudFR5cGUgLSBIb21vZ2VuZW91cyBlbGVtZW50IHR5cGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBvdXRlciBhbmQgYXJndW1lbnQgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWFwVHlwZVxuICogQHByb3BlcnR5IHtcIk1hcFR5cGVcIn0ga2luZCAtIFJlY3Vyc2l2ZSBtYXAtdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtUeXBlUmVmZXJlbmNlfSBrZXlUeXBlIC0gRXhhY3Qgc3RyaW5nIGtleSB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdmFsdWVUeXBlIC0gSG9tb2dlbmVvdXMgdmFsdWUgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG91dGVyIGFuZCBhcmd1bWVudCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcmRlcmVkTWFwVHlwZVxuICogQHByb3BlcnR5IHtcIk9yZGVyZWRNYXBUeXBlXCJ9IGtpbmQgLSBEaXN0aW5jdCBpbnNlcnRpb24tb3JkZXJlZCBtYXAtdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtUeXBlUmVmZXJlbmNlfSBrZXlUeXBlIC0gRXhhY3Qgc3VwcG9ydGVkIHN0cmluZyBrZXkgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGV9IHZhbHVlVHlwZSAtIEhvbW9nZW5lb3VzIHZhbHVlIHR5cGUuXG4gKiBAcHJvcGVydHkge1wiaW5zZXJ0aW9uXCJ9IG9yZGVyIC0gQ2Fub25pY2FsIGZpcnN0LWluc2VydGlvbiBlbmNvdW50ZXIgb3JkZXIuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBvdXRlciBhbmQgYXJndW1lbnQgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3B0aW9uYWxUeXBlXG4gKiBAcHJvcGVydHkge1wiT3B0aW9uYWxUeXBlXCJ9IGtpbmQgLSBFeHBsaWNpdCBwcmVzZW5jZS9hYnNlbmNlIHR5cGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGV9IHZhbHVlVHlwZSAtIEV4YWN0IHByZXNlbnQtdmFsdWUgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG91dGVyIGFuZCBjb25zdGl0dWVudCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWNvcmRUeXBlXG4gKiBAcHJvcGVydHkge1wiUmVjb3JkVHlwZVwifSBraW5kIC0gTm9taW5hbCByZWNvcmQtdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgbW9kdWxlLWxvY2FsIHJlY29yZCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGVbXX0gW2FyZ3VtZW50c10gLSBFeGFjdCBpbnZhcmlhbnQgdHlwZSBhcmd1bWVudHM7IHJlcXVpcmVkIGZvciBnZW5lcmljIGRlY2xhcmF0aW9ucyBhbmQgYWJzZW50IGZvciBub24tZ2VuZXJpYyBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFcnJvclR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJFcnJvclR5cGVcIn0ga2luZCAtIE5vbWluYWwgdW5jaGVja2VkLWVycm9yIHR5cGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIGVycm9yIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHlwZS1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVmZXJlbmNlVHlwZVxuICogQHByb3BlcnR5IHtcIlJlZmVyZW5jZVR5cGVcIn0ga2luZCAtIE5vbWluYWwgcmVmZXJlbmNlLWNsYXNzIHR5cGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIG1vZHVsZS1sb2NhbCBjbGFzcyBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE93bmVkUmVzb3VyY2VUeXBlXG4gKiBAcHJvcGVydHkge1wiT3duZWRSZXNvdXJjZVR5cGVcIn0ga2luZCAtIENvbXBpbGVyLW93bmVkIGxpbmVhciByZXNvdXJjZSB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlc291cmNlSWQgLSBFeGFjdCBhdXRob3JpdHkgcmVzb3VyY2UgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPd25lZFJlZmVyZW5jZVR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJPd25lZFJlZmVyZW5jZVR5cGVcIn0ga2luZCAtIExpbmVhciByZWZlcmVuY2UgdGhhdCBvd25zIG9uZSBwcm90ZWN0ZWQgcmVzb3VyY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIEV4YWN0IG93bmVkIGNsYXNzIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHlwZS1uYW1lIHJhbmdlLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7VHlwZVJlZmVyZW5jZSB8IFR5cGVWYXJpYWJsZVJlZmVyZW5jZSB8IExpc3RUeXBlIHwgTWFwVHlwZSB8IE9yZGVyZWRNYXBUeXBlIHwgT3B0aW9uYWxUeXBlIHwgUmVjb3JkVHlwZSB8IFJlZmVyZW5jZVR5cGUgfCBPd25lZFJlc291cmNlVHlwZSB8IE93bmVkUmVmZXJlbmNlVHlwZX0gU2VtYW50aWNWYWx1ZVR5cGUgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNWYWx1ZVR5cGUgfCBFcnJvclR5cGV9IFNlbWFudGljQmluZGluZ1R5cGUgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBGdW5jdGlvblJldHVyblR5cGVSZWZlcmVuY2VcbiAqIEBwcm9wZXJ0eSB7XCJUeXBlUmVmZXJlbmNlXCJ9IGtpbmQgLSBWb2lkIHJldHVybiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtcInZvaWRcIn0gbmFtZSAtIE5vcm1hbGl6ZWQgbm9uLXZhbHVlIGZ1bmN0aW9uIHJldHVybi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UgdGhhdCBzdXJ2aXZlcyBzZW1hbnRpYyB0cmFuc2Zvcm1zLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNWYWx1ZVR5cGUgfCBGdW5jdGlvblJldHVyblR5cGVSZWZlcmVuY2V9IFNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlICovXG5cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNUeXBlTmFtZSB8IHtraW5kOiBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiLCBwYXJhbWV0ZXJJZDogc3RyaW5nfSB8IHtraW5kOiBcIkxpc3RUeXBlXCIsIGVsZW1lbnRUeXBlOiBTZW1hbnRpY1R5cGVJZGVudGl0eX0gfCB7a2luZDogXCJNYXBUeXBlXCIsIGtleVR5cGU6IFNlbWFudGljVHlwZUlkZW50aXR5LCB2YWx1ZVR5cGU6IFNlbWFudGljVHlwZUlkZW50aXR5fSB8IHtraW5kOiBcIk9yZGVyZWRNYXBUeXBlXCIsIGtleVR5cGU6IFNlbWFudGljVHlwZUlkZW50aXR5LCB2YWx1ZVR5cGU6IFNlbWFudGljVHlwZUlkZW50aXR5LCBvcmRlcjogXCJpbnNlcnRpb25cIn0gfCB7a2luZDogXCJPcHRpb25hbFR5cGVcIiwgdmFsdWVUeXBlOiBTZW1hbnRpY1R5cGVJZGVudGl0eX0gfCB7a2luZDogXCJSZWNvcmRUeXBlXCIsIGRlY2xhcmF0aW9uSWQ6IHN0cmluZywgYXJndW1lbnRzPzogU2VtYW50aWNUeXBlSWRlbnRpdHlbXX0gfCB7a2luZDogXCJSZWZlcmVuY2VUeXBlXCIsIGRlY2xhcmF0aW9uSWQ6IHN0cmluZ30gfCB7a2luZDogXCJPd25lZFJlc291cmNlVHlwZVwiLCByZXNvdXJjZUlkOiBzdHJpbmd9IHwge2tpbmQ6IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIsIGRlY2xhcmF0aW9uSWQ6IHN0cmluZ319IFNlbWFudGljVHlwZUlkZW50aXR5ICovXG4vKiogQHR5cGVkZWYge1NlbWFudGljVHlwZUlkZW50aXR5IHwgXCJ2b2lkXCJ9IEZ1bmN0aW9uUmV0dXJuVHlwZUlkZW50aXR5ICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVzb2x2ZWRGdW5jdGlvblNpZ25hdHVyZVxuICogQHByb3BlcnR5IHtcIlJlc29sdmVkRnVuY3Rpb25TaWduYXR1cmVcIn0ga2luZCAtIFJlc29sdXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZUlkZW50aXR5W119IHBhcmFtZXRlclR5cGVzIC0gRXhhY3QgcmVxdWlyZWQgcG9zaXRpb25hbCBwYXJhbWV0ZXIgdHlwZXMuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uUmV0dXJuVHlwZUlkZW50aXR5fSByZXR1cm5UeXBlIC0gRXhhY3QgcmVzb2x2ZWQgcmV0dXJuIHR5cGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZUlkZW50aXR5W119IFt0eXBlQXJndW1lbnRzXSAtIEluZmVycmVkIGRlY2xhcmF0aW9uLW9yZGVyIHR5cGUgYXJndW1lbnRzIGZvciBhIGdlbmVyaWMgY2FsbC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFBhcmFtZXRlclxuICogQHByb3BlcnR5IHtcIlBhcmFtZXRlclwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBQYXJhbWV0ZXIgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGV9IHR5cGUgLSBQYXJhbWV0ZXIgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlc29sdmVkRWZmZWN0T3BlcmF0aW9uU2lnbmF0dXJlXG4gKiBAcHJvcGVydHkge1wiUmVzb2x2ZWRFZmZlY3RPcGVyYXRpb25TaWduYXR1cmVcIn0ga2luZCAtIFJlc29sdXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjYXBhYmlsaXR5SWQgLSBFeGFjdCBjYXBhYmlsaXR5IGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9wZXJhdGlvbklkIC0gRXhhY3Qgb3BlcmF0aW9uIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVJZGVudGl0eVtdfSBwYXJhbWV0ZXJUeXBlcyAtIEV4YWN0IG9yZGVyZWQgcGFyYW1ldGVyIHR5cGVzLlxuICogQHByb3BlcnR5IHtGdW5jdGlvblJldHVyblR5cGVJZGVudGl0eX0gcmV0dXJuVHlwZSAtIEV4YWN0IG9wZXJhdGlvbiByZXN1bHQuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFtcImhvc3RcIl19IGVmZmVjdHMgLSBDbG9zZWQgaW5pdGlhbCBlZmZlY3Qgc2V0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gZmFpbHVyZUlkcyAtIEV4YWN0IG9yZGVyZWQgZGVjbGFyZWQgZmFpbHVyZXMuXG4gKiBAcHJvcGVydHkge0VmZmVjdFJlc291cmNlRmxvd30gcmVzb3VyY2VGbG93IC0gRXhhY3Qgb3duZXJzaGlwIHRyYW5zaXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPd25lZE1vdmVFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiT3duZWRNb3ZlRXhwcmVzc2lvblwifSBraW5kIC0gRXhwbGljaXQgbGluZWFyIG93bmVyc2hpcCB0cmFuc2Zlci5cbiAqIEBwcm9wZXJ0eSB7SWRlbnRpZmllckV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBNb3ZlZCBvd25lci5cbiAqIEBwcm9wZXJ0eSB7T3duZWRSZXNvdXJjZVR5cGUgfCBPd25lZFJlZmVyZW5jZVR5cGV9IHR5cGUgLSBFeGFjdCBvd25lZCB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCB0cmFuc2ZlciBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gRGVyaXZlZCBzb3VyY2UgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE93bmVkQm9ycm93RXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIk93bmVkQm9ycm93RXhwcmVzc2lvblwifSBraW5kIC0gSW1tZWRpYXRlIG5vbmVzY2FwaW5nIHJlc291cmNlIGJvcnJvdy5cbiAqIEBwcm9wZXJ0eSB7XCJzaGFyZWRcIiB8IFwiZXhjbHVzaXZlXCJ9IG1vZGUgLSBCb3Jyb3cgbW9kZS5cbiAqIEBwcm9wZXJ0eSB7SWRlbnRpZmllckV4cHJlc3Npb24gfCBSZWNlaXZlckV4cHJlc3Npb24gfCBQcml2YXRlRmllbGRSZWFkfSBleHByZXNzaW9uIC0gQm9ycm93ZWQgcGxhY2UuXG4gKiBAcHJvcGVydHkge093bmVkUmVzb3VyY2VUeXBlIHwgT3duZWRSZWZlcmVuY2VUeXBlfSB0eXBlIC0gRXhhY3Qgb3duZWQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRXhhY3QgYm9ycm93IGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBEZXJpdmVkIHNvdXJjZSBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRWZmZWN0Q2FsbEV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJFZmZlY3RDYWxsRXhwcmVzc2lvblwifSBraW5kIC0gQ29tcGlsZXItYXV0aG9yaXplZCBlZmZlY3QgaW52b2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcGVyYXRpb24gLSBFeGFjdCBvcGVyYXRpb24gZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb25bXX0gYXJndW1lbnRzIC0gU291cmNlLW9yZGVyZWQgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVmZmVjdFNpdGVJZCAtIERldGVybWluaXN0aWMgc2VtYW50aWMgZXZhbHVhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7UmVzb2x2ZWRFZmZlY3RPcGVyYXRpb25TaWduYXR1cmV9IHJlc29sdXRpb24gLSBDb21wbGV0ZSBhdXRob3JpdHkgcmVzb2x1dGlvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY2FsbCBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG9wZXJhdGlvbi1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRWZmZWN0UGFyYW1ldGVyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFN0YWJsZSBwYXJhbWV0ZXIgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGV9IHR5cGUgLSBFeGFjdCBvcmRlcmVkIHBhcmFtZXRlciB0eXBlLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7e2tpbmQ6IFwibm9uZVwifSB8IHtraW5kOiBcImFjcXVpcmVcIiwgcmVzb3VyY2VJZDogc3RyaW5nfSB8IHtraW5kOiBcImJvcnJvd1wiIHwgXCJjbG9zZVwiLCBwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCB0ZXJtaW5hbEZhaWx1cmVJZDogc3RyaW5nfX0gRWZmZWN0UmVzb3VyY2VGbG93ICovXG5cbi8qKlxuICogQHR5cGVkZWYgRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb25cIn0ga2luZCAtIENhcGFiaWxpdHkgcmVzb3VyY2UgZGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBEZXRlcm1pbmlzdGljIGF1dGhvcml0eS1sb2NhbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU291cmNlLXZpc2libGUgbm9taW5hbCByZXNvdXJjZSBuYW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRWZmZWN0RmFpbHVyZURlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiRWZmZWN0RmFpbHVyZURlY2xhcmF0aW9uXCJ9IGtpbmQgLSBDYXBhYmlsaXR5IGZhaWx1cmUgZGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBEZXRlcm1pbmlzdGljIGF1dGhvcml0eS1sb2NhbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU291cmNlLXZpc2libGUgbm9taW5hbCBmYWlsdXJlIG5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RPcGVyYXRpb25EZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkVmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9uXCJ9IGtpbmQgLSBDb21waWxlci1hdXRob3JpemVkIG9wZXJhdGlvbiBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgYXV0aG9yaXR5LWxvY2FsIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBvcGVyYXRpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0UGFyYW1ldGVyW119IHBhcmFtZXRlcnMgLSBFeGFjdCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMuXG4gKiBAcHJvcGVydHkge1NlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSByZXR1cm5UeXBlIC0gRXhhY3QgcmVzdWx0IHR5cGUuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFtcImhvc3RcIl19IGVmZmVjdHMgLSBDbG9zZWQgaW5pdGlhbCBlZmZlY3Qgc2V0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gZmFpbHVyZUlkcyAtIE9yZGVyZWQgbm9taW5hbCBmYWlsdXJlIGlkZW50aXRpZXMuXG4gKiBAcHJvcGVydHkge0VmZmVjdFJlc291cmNlRmxvd30gcmVzb3VyY2VGbG93IC0gRXhhY3Qgb3duZXJzaGlwIHRyYW5zaXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25cIn0ga2luZCAtIEF1dGhvcml6ZWQgY2FwYWJpbGl0eSBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGF1dGhvcml0eUlkIC0gT3BhcXVlIGF1dGhvcml0eSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gQ2FwYWJpbGl0eSBuYW1lLlxuICogQHByb3BlcnR5IHtFZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uW119IHJlc291cmNlcyAtIE9yZGVyZWQgcmVzb3VyY2VzLlxuICogQHByb3BlcnR5IHtFZmZlY3RGYWlsdXJlRGVjbGFyYXRpb25bXX0gZmFpbHVyZXMgLSBPcmRlcmVkIGZhaWx1cmVzLlxuICogQHByb3BlcnR5IHtFZmZlY3RPcGVyYXRpb25EZWNsYXJhdGlvbltdfSBvcGVyYXRpb25zIC0gT3JkZXJlZCBvcGVyYXRpb25zLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ2FwYWJpbGl0eUF1dGhvcml0eVxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkQ2FwYWJpbGl0eUF1dGhvcml0eVwifSBzY2hlbWEgLSBBdXRob3JpdHkgc2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezEgfCAyfSBzY2hlbWFWZXJzaW9uIC0gQXV0aG9yaXR5IHBheWxvYWQgdmVyc2lvbiwgbm90IGEgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdCB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gT3BhcXVlIGNhbGxlci1zdXBwbGllZCBhdXRob3JpdHkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge0VmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbltdfSBjYXBhYmlsaXRpZXMgLSBOb3JtYWxpemVkIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29udHJhY3RWZXJzaW9uXSAtIERlY2xhcmVkIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QgdmVyc2lvbiwgcHJlc2VudCBvbmx5IHdoZW4gdGhlIGNhbGxlciBzdXBwbGllZCBvbmUuXG4gKiBAcHJvcGVydHkge3tpZGVudGl0eTogc3RyaW5nLCBjb250cmFjdFZlcnNpb246IHN0cmluZywgY2FwYWJpbGl0aWVzOiBFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX1bXX0gW21vZHVsZXNdIC0gU2NoZW1hLXYyIGNhbm9uaWNhbCBtb2R1bGUgYXV0aG9yaXRpZXMuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7bW9kdWxlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0ICovXG4vKiogQHR5cGVkZWYge3tuYW1lOiBzdHJpbmcsIHR5cGU6IFNlbWFudGljVHlwZU5hbWUgfCB7a2luZDogXCJPd25lZFJlc291cmNlVHlwZVwiLCByZXNvdXJjZTogc3RyaW5nIHwgQ2FwYWJpbGl0eURlY2xhcmF0aW9uUmVmZXJlbmNlSW5wdXR9IHwge2tpbmQ6IFwiT3B0aW9uYWxUeXBlXCIsIHZhbHVlVHlwZTogU2VtYW50aWNUeXBlTmFtZX19fSBDYXBhYmlsaXR5UGFyYW1ldGVySW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e25hbWU6IHN0cmluZ319IENhcGFiaWxpdHlOYW1lZElucHV0ICovXG4vKiogQHR5cGVkZWYge3traW5kOiBcIm5vbmVcIn0gfCB7a2luZDogXCJhY3F1aXJlXCIsIHJlc291cmNlOiBzdHJpbmcgfCBDYXBhYmlsaXR5RGVjbGFyYXRpb25SZWZlcmVuY2VJbnB1dH0gfCB7a2luZDogXCJib3Jyb3dcIiB8IFwiY2xvc2VcIiwgcGFyYW1ldGVySW5kZXg6IG51bWJlciwgdGVybWluYWxGYWlsdXJlOiBzdHJpbmcgfCBDYXBhYmlsaXR5RGVjbGFyYXRpb25SZWZlcmVuY2VJbnB1dH19IENhcGFiaWxpdHlSZXNvdXJjZUZsb3dJbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7bmFtZTogc3RyaW5nLCBwYXJhbWV0ZXJzOiBDYXBhYmlsaXR5UGFyYW1ldGVySW5wdXRbXSwgcmV0dXJuVHlwZTogRnVuY3Rpb25SZXR1cm5UeXBlTmFtZSB8IHtraW5kOiBcIk93bmVkUmVzb3VyY2VUeXBlXCIsIHJlc291cmNlOiBzdHJpbmcgfCBDYXBhYmlsaXR5RGVjbGFyYXRpb25SZWZlcmVuY2VJbnB1dH0gfCB7a2luZDogXCJPcHRpb25hbFR5cGVcIiwgdmFsdWVUeXBlOiBTZW1hbnRpY1R5cGVOYW1lfSwgZWZmZWN0czogW1wiaG9zdFwiXSwgZmFpbHVyZXM6IChzdHJpbmcgfCBDYXBhYmlsaXR5RGVjbGFyYXRpb25SZWZlcmVuY2VJbnB1dClbXSwgcmVzb3VyY2VGbG93OiBDYXBhYmlsaXR5UmVzb3VyY2VGbG93SW5wdXR9fSBDYXBhYmlsaXR5T3BlcmF0aW9uSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e25hbWU6IHN0cmluZywgcmVzb3VyY2VzOiBDYXBhYmlsaXR5TmFtZWRJbnB1dFtdLCBmYWlsdXJlczogQ2FwYWJpbGl0eU5hbWVkSW5wdXRbXSwgb3BlcmF0aW9uczogQ2FwYWJpbGl0eU9wZXJhdGlvbklucHV0W119fSBDYXBhYmlsaXR5RGVjbGFyYXRpb25JbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7aWRlbnRpdHk6IHN0cmluZywgY29udHJhY3RWZXJzaW9uOiBzdHJpbmcsIGNhcGFiaWxpdGllczogQ2FwYWJpbGl0eURlY2xhcmF0aW9uSW5wdXRbXX19IENhcGFiaWxpdHlBdXRob3JpdHlNb2R1bGVJbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7c2NoZW1hOiBcIlNlbWFudGlmb2xkQ2FwYWJpbGl0eUF1dGhvcml0eVwiLCBzY2hlbWFWZXJzaW9uOiAxLCBpZDogc3RyaW5nLCBjYXBhYmlsaXRpZXM6IENhcGFiaWxpdHlEZWNsYXJhdGlvbklucHV0W10sIGNvbnRyYWN0VmVyc2lvbj86IHN0cmluZ30gfCB7c2NoZW1hOiBcIlNlbWFudGlmb2xkQ2FwYWJpbGl0eUF1dGhvcml0eVwiLCBzY2hlbWFWZXJzaW9uOiAyLCBpZDogc3RyaW5nLCBtb2R1bGVzOiBDYXBhYmlsaXR5QXV0aG9yaXR5TW9kdWxlSW5wdXRbXX19IENhcGFiaWxpdHlBdXRob3JpdHlJbnB1dCAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExpc3RMaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiTGlzdExpdGVyYWxcIn0ga2luZCAtIE9yZGVyZWQgaW1tdXRhYmxlIGxpc3QgbGl0ZXJhbC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBlbGVtZW50cyAtIFNvdXJjZS1vcmRlcmVkLCBkdXBsaWNhdGUtcHJlc2VydmluZyBlbGVtZW50cy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1hcEVudHJ5XG4gKiBAcHJvcGVydHkge1wiTWFwRW50cnlcIn0ga2luZCAtIFNvdXJjZS1vcmRlcmVkIG1hcCBpbml0aWFsaXplciBlbnRyeS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nTGl0ZXJhbH0ga2V5IC0gTGl0ZXJhbCBub25udW1lcmljIHN0cmluZyBrZXkuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IHZhbHVlIC0gRW50cnkgdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBNYXBMaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiTWFwTGl0ZXJhbFwifSBraW5kIC0gSW1tdXRhYmxlIG1hcCBsaXRlcmFsOyBlbnRyeSBvcmRlciBpcyBkaWFnbm9zdGljLW9ubHkuXG4gKiBAcHJvcGVydHkge01hcEVudHJ5W119IGVudHJpZXMgLSBTb3VyY2UgaW5pdGlhbGl6ZXIgb3JkZXIuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcmRlcmVkTWFwTGl0ZXJhbFxuICogQHByb3BlcnR5IHtcIk9yZGVyZWRNYXBMaXRlcmFsXCJ9IGtpbmQgLSBJbW11dGFibGUgbWFwIGxpdGVyYWwgd2l0aCBvYnNlcnZhYmxlIGZpcnN0LWluc2VydGlvbiBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7TWFwRW50cnlbXX0gZW50cmllcyAtIFNvdXJjZS1vcmRlcmVkIHVuaXF1ZSBlbnRyaWVzLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBvcmRlcmVkIGNvbnN0cnVjdGlvbiBib3VuZGFyeS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMaXN0SW5kZXhFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiTGlzdEluZGV4RXhwcmVzc2lvblwifSBraW5kIC0gVG90YWwgemVyby1iYXNlZCBsaXN0IGluZGV4LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBjb2xsZWN0aW9uIC0gTGlzdC12YWx1ZWQgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGluZGV4IC0gSW50ZWdlciBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7XCJwcm92ZW5cIiB8IFwiZmFpbC1vbi1hYnNlbmNlXCJ9IHRvdGFsaXR5IC0gQWRtaXNzaW9uIGJhc2lzOyBuZXZlciBvcHRpb25hbC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1hcExvb2t1cEV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJNYXBMb29rdXBFeHByZXNzaW9uXCJ9IGtpbmQgLSBUb3RhbCBzdHJpbmcta2V5IG1hcCBsb29rdXAuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbGxlY3Rpb24gLSBNYXAtdmFsdWVkIHJlY2VpdmVyLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBrZXkgLSBTdHJpbmcga2V5IGV4cHJlc3Npb24uXG4gKiBAcHJvcGVydHkge1wicHJvdmVuXCIgfCBcImZhaWwtb24tYWJzZW5jZVwifSB0b3RhbGl0eSAtIEFkbWlzc2lvbiBiYXNpczsgbmV2ZXIgb3B0aW9uYWwuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDb2xsZWN0aW9uU2l6ZUV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJDb2xsZWN0aW9uU2l6ZUV4cHJlc3Npb25cIn0ga2luZCAtIEZpbml0ZSBjb2xsZWN0aW9uIHNpemUuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbGxlY3Rpb24gLSBMaXN0LSBvciBtYXAtdmFsdWVkIHJlY2VpdmVyLlxuICogQHByb3BlcnR5IHtcImxpc3RcIiB8IFwibWFwXCJ9IFtjb2xsZWN0aW9uS2luZF0gLSBWYWxpZGF0ZWQgcmVjZWl2ZXIga2luZCBmb3IgdGFyZ2V0IHNwZWxsaW5nLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSWRlbnRpZmllckV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJJZGVudGlmaWVyRXhwcmVzc2lvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBSZWZlcmVuY2VkIG5hbWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJbnRlZ2VyTGl0ZXJhbFxuICogQHByb3BlcnR5IHtcIkludGVnZXJMaXRlcmFsXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmFsdWUgLSBKYXZhU2NyaXB0LXNhZmUgaW50ZWdlciB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJvb2xlYW5MaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiQm9vbGVhbkxpdGVyYWxcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdmFsdWUgLSBCb29sZWFuIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU3RyaW5nTGl0ZXJhbFxuICogQHByb3BlcnR5IHtcIlN0cmluZ0xpdGVyYWxcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2YWx1ZSAtIFVuaWNvZGUgc3RyaW5nIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3B0aW9uYWxOb25lXG4gKiBAcHJvcGVydHkge1wiT3B0aW9uYWxOb25lXCJ9IGtpbmQgLSBDb250ZXh0dWFsbHkgdHlwZWQgYWJzZW5jZSB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9wdGlvbmFsU29tZVxuICogQHByb3BlcnR5IHtcIk9wdGlvbmFsU29tZVwifSBraW5kIC0gRXhwbGljaXQgcHJlc2VudCBvcHRpb25hbCB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gdmFsdWUgLSBFeGFjdCBub24tb3B0aW9uYWwgcHJlc2VudCB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9wdGlvbmFsSXNQcmVzZW50XG4gKiBAcHJvcGVydHkge1wiT3B0aW9uYWxJc1ByZXNlbnRcIn0ga2luZCAtIFByZXNlbmNlIHRlc3QgZm9yIG9uZSBzaW1wbGUgaWRlbnRpZmllci5cbiAqIEBwcm9wZXJ0eSB7SWRlbnRpZmllckV4cHJlc3Npb259IG9wZXJhbmQgLSBUZXN0ZWQgb3B0aW9uYWwgYmluZGluZy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9wdGlvbmFsVW53cmFwXG4gKiBAcHJvcGVydHkge1wiT3B0aW9uYWxVbndyYXBcIn0ga2luZCAtIEd1YXJkZWQgdW53cmFwIG9mIG9uZSBzaW1wbGUgaWRlbnRpZmllci5cbiAqIEBwcm9wZXJ0eSB7SWRlbnRpZmllckV4cHJlc3Npb259IG9wZXJhbmQgLSBQcm92ZW4tcHJlc2VudCBvcHRpb25hbCBiaW5kaW5nLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVW5hcnlFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiVW5hcnlFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVW5hcnlPcGVyYXRpb259IG9wZXJhdGlvbiAtIENsb3NlZCBzZW1hbnRpYyBvcGVyYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IG9wZXJhbmQgLSBPcGVyYW5kIGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZU5hbWV9IHR5cGUgLSBFeHBsaWNpdCBvcGVyYXRpb24gcmVzdWx0IHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCaW5hcnlFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiQmluYXJ5RXhwcmVzc2lvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0JpbmFyeU9wZXJhdGlvbn0gb3BlcmF0aW9uIC0gQ2xvc2VkIHNlbWFudGljIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gbGVmdCAtIExlZnQgb3BlcmFuZC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gcmlnaHQgLSBSaWdodCBvcGVyYW5kLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVOYW1lfSB0eXBlIC0gRXhwbGljaXQgb3BlcmF0aW9uIHJlc3VsdCB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ29uZGl0aW9uYWxFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbmRpdGlvbiAtIFN0cmljdCBib29sZWFuIHRlc3QgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29uc2VxdWVudCAtIEFybSBldmFsdWF0ZWQgd2hlbiB0aGUgdGVzdCBpcyB0cnVlLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBhbHRlcm5hdGUgLSBBcm0gZXZhbHVhdGVkIHdoZW4gdGhlIHRlc3QgaXMgZmFsc2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZU5hbWV9IHR5cGUgLSBKb2luZWQgYXJtIHJlc3VsdCB0eXBlIGFzc2lnbmVkIGJ5IHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDYWxsRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkNhbGxFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2FsbGVlIC0gRnVuY3Rpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBQb3NpdGlvbmFsIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7UmVzb2x2ZWRGdW5jdGlvblNpZ25hdHVyZX0gW3Jlc29sdXRpb25dIC0gRGV0ZXJtaW5pc3RpYyBkZWNsYXJhdGlvbiBhbmQgc2lnbmF0dXJlIGJpbmRpbmcsIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2VmZmVjdFNpdGVJZF0gLSBEZXRlcm1pbmlzdGljIHNpdGUgaWRlbnRpdHkgd2hlbiB0aGUgcmVzb2x2ZWQgZnVuY3Rpb24gcmVhY2hlcyBhIGhvc3QgZWZmZWN0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBbZWZmZWN0c10gLSBJbmZlcnJlZCBjaGVja2VkIGhvc3QtZWZmZWN0IGZhY3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZmFpbHVyZUlkc10gLSBPcmRlcmVkIGNhcGFiaWxpdHkgZmFpbHVyZXMgcmVhY2hhYmxlIHRocm91Z2ggdGhpcyBjYWxsLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVzb2x2ZWRDb25zdHJ1Y3RvclNpZ25hdHVyZVxuICogQHByb3BlcnR5IHtcIlJlc29sdmVkQ29uc3RydWN0b3JTaWduYXR1cmVcIn0ga2luZCAtIFJlc29sdXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gRXhhY3QgY29uc3RydWN0b3IgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZUlkZW50aXR5W119IHBhcmFtZXRlclR5cGVzIC0gRXhhY3QgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVzb2x2ZWRNZXRob2RTaWduYXR1cmVcbiAqIEBwcm9wZXJ0eSB7XCJSZXNvbHZlZE1ldGhvZFNpZ25hdHVyZVwifSBraW5kIC0gUmVzb2x1dGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBFeGFjdCByZXNvbHZlZCBtZXRob2QgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZUlkZW50aXR5W119IHBhcmFtZXRlclR5cGVzIC0gRXhhY3QgbWV0aG9kIHBhcmFtZXRlciB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHl9IHJldHVyblR5cGUgLSBFeGFjdCBtZXRob2QgcmV0dXJuIHR5cGUuXG4gKiBAcHJvcGVydHkge3traW5kOiBcInByZXNlcnZlXCIgfCBcInRlcm1pbmFsXCIsIHRlcm1pbmFsRmFpbHVyZUlkPzogc3RyaW5nfX0gW3Jlc291cmNlRmxvd10gLSBPd25lZCByZWNlaXZlciB0cmFuc2l0aW9uIGFuZCBkZWNsYXJlZCB0ZXJtaW5hbC11c2UgZmFpbHVyZSB3aGVuIGFwcGxpY2FibGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWNlaXZlckV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJSZWNlaXZlckV4cHJlc3Npb25cIn0ga2luZCAtIFRoZSBkZWNsYXJpbmcgY2xhc3MgaW5zdGFuY2UgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2xhc3NJZCAtIFN0YWJsZSBkZWNsYXJpbmcgY2xhc3MgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSByZWNlaXZlciBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHJlY2VpdmVyIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVmZXJlbmNlQ29uc3RydWN0aW9uXG4gKiBAcHJvcGVydHkge1wiUmVmZXJlbmNlQ29uc3RydWN0aW9uXCJ9IGtpbmQgLSBGcmVzaCBub21pbmFsIHJlZmVyZW5jZSBjb25zdHJ1Y3Rpb24uXG4gKiBAcHJvcGVydHkge1JlZmVyZW5jZVR5cGUgfCBPd25lZFJlZmVyZW5jZVR5cGV9IHJlZmVyZW5jZSAtIEV4YWN0IGNsYXNzIHR5cGUuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb25bXX0gYXJndW1lbnRzIC0gU291cmNlLW9yZGVyZWQgY29uc3RydWN0b3IgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtSZXNvbHZlZENvbnN0cnVjdG9yU2lnbmF0dXJlfSBbcmVzb2x1dGlvbl0gLSBFeGFjdCBjb25zdHJ1Y3RvciBiaW5kaW5nLCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlZmZlY3RTaXRlSWRdIC0gRGV0ZXJtaW5pc3RpYyBzaXRlIGlkZW50aXR5IHdoZW4gY29uc3RydWN0aW9uIHJlYWNoZXMgYSBob3N0IGVmZmVjdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIGNvbnN0cnVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY29uc3RydWN0aW9uIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgY2xhc3MtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1ldGhvZENhbGxFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIn0ga2luZCAtIFJlc29sdmVkIHJlY2VpdmVyLW1ldGhvZCBpbnZvY2F0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSByZWNlaXZlciAtIFJlY2VpdmVyIGV2YWx1YXRlZCBvbmNlIGJlZm9yZSBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWV0aG9kIC0gU3RhYmxlIG1ldGhvZCBpZGVudGl0eSBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGFyZ3VtZW50cyAtIFNvdXJjZS1vcmRlcmVkIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7UmVzb2x2ZWRNZXRob2RTaWduYXR1cmV9IFtyZXNvbHV0aW9uXSAtIEV4YWN0IG1ldGhvZCBiaW5kaW5nLCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlZmZlY3RTaXRlSWRdIC0gRGV0ZXJtaW5pc3RpYyBzaXRlIGlkZW50aXR5IHdoZW4gdGhlIG1ldGhvZCByZWFjaGVzIGEgaG9zdCBlZmZlY3QuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFtcImhvc3RcIl19IFtlZmZlY3RzXSAtIEluZmVycmVkIGNoZWNrZWQgaG9zdC1lZmZlY3QgZmFjdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtmYWlsdXJlSWRzXSAtIE9yZGVyZWQgY2FwYWJpbGl0eSBmYWlsdXJlcyByZWFjaGFibGUgdGhyb3VnaCB0aGUgbWV0aG9kLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBjYWxsIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbWV0aG9kLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQcml2YXRlRmllbGRSZWFkXG4gKiBAcHJvcGVydHkge1wiUHJpdmF0ZUZpZWxkUmVhZFwifSBraW5kIC0gRGVjbGFyaW5nLXJlY2VpdmVyLW9ubHkgcHJpdmF0ZSBmaWVsZCByZWFkLlxuICogQHByb3BlcnR5IHtSZWNlaXZlckV4cHJlc3Npb259IHJlY2VpdmVyIC0gRXhhY3QgZGVjbGFyaW5nIHJlY2VpdmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpZWxkIC0gU3RhYmxlIHByaXZhdGUgZmllbGQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIHJlYWQgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBmaWVsZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVjb3JkQ29uc3RydWN0aW9uXG4gKiBAcHJvcGVydHkge1wiUmVjb3JkQ29uc3RydWN0aW9uXCJ9IGtpbmQgLSBOb21pbmFsIHJlY29yZCBjb25zdHJ1Y3Rpb24uXG4gKiBAcHJvcGVydHkge1JlY29yZFR5cGV9IHJlY29yZCAtIFJlc29sdmVkIHJlY29yZCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBDb21wbGV0ZSBmaWVsZC1vcmRlcmVkIGNvbnN0cnVjdG9yIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY29uc3RydWN0aW9uIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHJlY29yZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWVtYmVyUmVhZFxuICogQHByb3BlcnR5IHtcIk1lbWJlclJlYWRcIn0ga2luZCAtIE5vbWluYWwgaW1tdXRhYmxlIHJlY29yZC1maWVsZCByZWFkLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSByZWNlaXZlciAtIFJlY29yZC12YWx1ZWQgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmllbGQgLSBTdGFibGUgcmVzb2x2ZWQgZmllbGQgaWRlbnRpdHkgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbWVtYmVyLXJlYWQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbWVtYmVyLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFcnJvck1lc3NhZ2VSZWFkXG4gKiBAcHJvcGVydHkge1wiRXJyb3JNZXNzYWdlUmVhZFwifSBraW5kIC0gVGhlIHNvbGUgcG9ydGFibGUgZXJyb3IgbWVtYmVyIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7SWRlbnRpZmllckV4cHJlc3Npb259IHJlY2VpdmVyIC0gQ2F0Y2ggYmluZGluZyB3aG9zZSBpbW11dGFibGUgbWVzc2FnZSBpcyByZWFkLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBtZXNzYWdlLXJlYWQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbWVzc2FnZS1tZW1iZXIgcmFuZ2UuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtJZGVudGlmaWVyRXhwcmVzc2lvbiB8IFJlY2VpdmVyRXhwcmVzc2lvbiB8IEludGVnZXJMaXRlcmFsIHwgQm9vbGVhbkxpdGVyYWwgfCBTdHJpbmdMaXRlcmFsIHwgT3B0aW9uYWxOb25lIHwgT3B0aW9uYWxTb21lIHwgT3B0aW9uYWxJc1ByZXNlbnQgfCBPcHRpb25hbFVud3JhcCB8IExpc3RMaXRlcmFsIHwgTWFwTGl0ZXJhbCB8IE9yZGVyZWRNYXBMaXRlcmFsIHwgTGlzdEluZGV4RXhwcmVzc2lvbiB8IE1hcExvb2t1cEV4cHJlc3Npb24gfCBDb2xsZWN0aW9uU2l6ZUV4cHJlc3Npb24gfCBVbmFyeUV4cHJlc3Npb24gfCBCaW5hcnlFeHByZXNzaW9uIHwgQ29uZGl0aW9uYWxFeHByZXNzaW9uIHwgQ2FsbEV4cHJlc3Npb24gfCBFZmZlY3RDYWxsRXhwcmVzc2lvbiB8IE93bmVkTW92ZUV4cHJlc3Npb24gfCBPd25lZEJvcnJvd0V4cHJlc3Npb24gfCBNZXRob2RDYWxsRXhwcmVzc2lvbiB8IFJlZmVyZW5jZUNvbnN0cnVjdGlvbiB8IFJlY29yZENvbnN0cnVjdGlvbiB8IE1lbWJlclJlYWQgfCBQcml2YXRlRmllbGRSZWFkIHwgRXJyb3JNZXNzYWdlUmVhZH0gRXhwcmVzc2lvbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExvY2FsRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJMb2NhbERlY2xhcmF0aW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIERlY2xhcmVkIGxvY2FsIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhwbGljaXQgbG9jYWwgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbXV0YWJsZSAtIFdoZXRoZXIgbGF0ZXIgYXNzaWdubWVudCBpcyBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBpbml0aWFsaXplciAtIFJlcXVpcmVkIGluaXRpYWxpemVyIGV4cHJlc3Npb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIERlY2xhcmF0aW9uIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBc3NpZ25tZW50U3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiQXNzaWdubWVudFN0YXRlbWVudFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gdGFyZ2V0IC0gU2ltcGxlIGxvY2FsIGFzc2lnbm1lbnQgdGFyZ2V0LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gQXNzaWduZWQgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQXNzaWdubWVudCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwifSBraW5kIC0gRGVjbGFyaW5nLXJlY2VpdmVyLW9ubHkgcHJpdmF0ZSBmaWVsZCBtdXRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVjZWl2ZXJFeHByZXNzaW9ufSByZWNlaXZlciAtIEV4YWN0IGRlY2xhcmluZyByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWVsZCAtIFN0YWJsZSBwcml2YXRlIGZpZWxkIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gTmV3IGZpZWxkIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBBc3NpZ25tZW50IHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGZpZWxkLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXR1cm5TdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJSZXR1cm5TdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gW2V4cHJlc3Npb25dIC0gUmV0dXJuZWQgZXhwcmVzc2lvbjsgYWJzZW50IGV4YWN0bHkgZm9yIGEgYmFyZSB2b2lkIHJldHVybi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEV4cHJlc3Npb25TdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJFeHByZXNzaW9uU3RhdGVtZW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0NhbGxFeHByZXNzaW9uIHwgTWV0aG9kQ2FsbEV4cHJlc3Npb24gfCBFZmZlY3RDYWxsRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEEgZGlyZWN0LCByZWNlaXZlciwgb3IgYXV0aG9yaXplZCBjYWxsIHdob3NlIHJlc29sdmVkIHJldHVybiB0eXBlIGlzIHZvaWQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJZlN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIklmU3RhdGVtZW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbmRpdGlvbiAtIEJyYW5jaCBjb25kaXRpb24uXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBjb25zZXF1ZW50IC0gVHJ1ZSBicmFuY2guXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBbYWx0ZXJuYXRlXSAtIEZhbHNlIGJyYW5jaCwgYWJzZW50IHdoZW4gZXhlY3V0aW9uIGZhbGxzIHRocm91Z2guXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBWYWx1ZUJpbmRpbmdcbiAqIEBwcm9wZXJ0eSB7XCJWYWx1ZUJpbmRpbmdcIn0ga2luZCAtIEl0ZXJhdGlvbi1iaW5kaW5nIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEJvZHktbG9jYWwgYmluZGluZyBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIEV4YWN0IGxpc3QgZWxlbWVudCB0eXBlLlxuICogQHByb3BlcnR5IHtmYWxzZX0gbXV0YWJsZSAtIEl0ZXJhdGlvbiBiaW5kaW5ncyBhcmUgYWx3YXlzIGltbXV0YWJsZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQmluZGluZyBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRm9yRWFjaFN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkZvckVhY2hTdGF0ZW1lbnRcIn0ga2luZCAtIE9yZGVyZWQgbGlzdC1pdGVyYXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgbG9vcCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gbGlzdCAtIExpc3QgZXhwcmVzc2lvbiBldmFsdWF0ZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0cmF2ZXJzYWwuXG4gKiBAcHJvcGVydHkge1ZhbHVlQmluZGluZ30gdmFsdWVCaW5kaW5nIC0gSW1tdXRhYmxlIGJpbmRpbmcgc2NvcGVkIHRvIHRoZSBib2R5LlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIExvb3AgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbG9vcCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRm9yRWFjaE1hcFN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIn0ga2luZCAtIEluc2VydGlvbi1vcmRlcmVkIG1hcCBwYWlyLWl0ZXJhdGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBsb29wIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBtYXAgLSBPcmRlcmVkLW1hcCBleHByZXNzaW9uIGV2YWx1YXRlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRyYXZlcnNhbC5cbiAqIEBwcm9wZXJ0eSB7VmFsdWVCaW5kaW5nfSBrZXlCaW5kaW5nIC0gSW1tdXRhYmxlIHN0cmluZy1rZXkgYmluZGluZyBzY29wZWQgdG8gdGhlIGJvZHkuXG4gKiBAcHJvcGVydHkge1ZhbHVlQmluZGluZ30gdmFsdWVCaW5kaW5nIC0gSW1tdXRhYmxlIGhvbW9nZW5lb3VzIHZhbHVlIGJpbmRpbmcgc2NvcGVkIHRvIHRoZSBib2R5LlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIExvb3AgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbG9vcCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgV2hpbGVTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJXaGlsZVN0YXRlbWVudFwifSBraW5kIC0gU3RyaWN0LUJvb2xlYW4gcHJlLWNvbmRpdGlvbiBsb29wIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIGxvb3AgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbmRpdGlvbiAtIEJvb2xlYW4gZXhwcmVzc2lvbiBldmFsdWF0ZWQgYmVmb3JlIGV2ZXJ5IGl0ZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBPcmRlcmVkIGxvb3AgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbG9vcCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQnJlYWtTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJCcmVha1N0YXRlbWVudFwifSBraW5kIC0gTmVhcmVzdC1sb29wIGJyZWFrIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldExvb3BJZF0gLSBSZXNvbHZlZCBuZWFyZXN0LWxvb3AgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24gaW4gbG9vcCBjb250ZXh0LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBLZXl3b3JkIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDb250aW51ZVN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkNvbnRpbnVlU3RhdGVtZW50XCJ9IGtpbmQgLSBOZWFyZXN0LWxvb3AgY29udGludWUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0TG9vcElkXSAtIFJlc29sdmVkIG5lYXJlc3QtbG9vcCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbiBpbiBsb29wIGNvbnRleHQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEtleXdvcmQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yQ29uc3RydWN0aW9uXG4gKiBAcHJvcGVydHkge1wiRXJyb3JDb25zdHJ1Y3Rpb25cIn0ga2luZCAtIENvbnN0cnVjdGlvbiBvZiBvbmUgZGVjbGFyZWQgdW5jaGVja2VkIGVycm9yLlxuICogQHByb3BlcnR5IHtFcnJvclR5cGV9IGVycm9yIC0gRXhhY3Qgbm9taW5hbCBlcnJvciB0eXBlLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBtZXNzYWdlIC0gU29sZSBpbW11dGFibGUgc3RyaW5nIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNvbnN0cnVjdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlIGFuZCBtZXNzYWdlIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJhaXNlU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUmFpc2VTdGF0ZW1lbnRcIn0ga2luZCAtIEFicnVwdCB1bmNoZWNrZWQtZXJyb3IgcHJvcGFnYXRpb24uXG4gKiBAcHJvcGVydHkge0Vycm9yQ29uc3RydWN0aW9ufSBlcnJvciAtIEV4YWN0IGNvbnN0cnVjdGVkIHNlbWFudGljIGVycm9yLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSByYWlzZSBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCByYWlzZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENhdGNoQmluZGluZ1xuICogQHByb3BlcnR5IHtcIkNhdGNoQmluZGluZ1wifSBraW5kIC0gRXhhY3QtaGFuZGxlciBiaW5kaW5nIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEhhbmRsZXItbG9jYWwgYmluZGluZyBuYW1lLlxuICogQHByb3BlcnR5IHtFcnJvclR5cGV9IHR5cGUgLSBFeGFjdCBjYXVnaHQgbm9taW5hbCBlcnJvciB0eXBlLlxuICogQHByb3BlcnR5IHtmYWxzZX0gbXV0YWJsZSAtIENhdGNoIGJpbmRpbmdzIGFyZSBpbW11dGFibGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEJpbmRpbmcgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgYmluZGluZyByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFRyeVN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIlRyeVN0YXRlbWVudFwifSBraW5kIC0gT25lIGJvZHkgYW5kIG9uZSBleGFjdCB0eXBlZCBoYW5kbGVyLlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIFByb3RlY3RlZCBib2R5LlxuICogQHByb3BlcnR5IHtFcnJvclR5cGV9IGNhdGNoVHlwZSAtIEV4YWN0IGNhdWdodCBub21pbmFsIGVycm9yIHR5cGUuXG4gKiBAcHJvcGVydHkge0NhdGNoQmluZGluZ30gY2F0Y2hCaW5kaW5nIC0gSW1tdXRhYmxlIGhhbmRsZXItbG9jYWwgYmluZGluZy5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGNhdGNoQm9keSAtIEhhbmRsZXIgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgdHJ5L2hhbmRsZXIgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHJ5L2NhdGNoIHJhbmdlcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge0xvY2FsRGVjbGFyYXRpb24gfCBBc3NpZ25tZW50U3RhdGVtZW50fSBMb2NhbFN0YXRlbWVudCAqL1xuLyoqIEB0eXBlZGVmIHtMb2NhbFN0YXRlbWVudCB8IFByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50IHwgRXhwcmVzc2lvblN0YXRlbWVudCB8IElmU3RhdGVtZW50IHwgRm9yRWFjaFN0YXRlbWVudCB8IEZvckVhY2hNYXBTdGF0ZW1lbnQgfCBXaGlsZVN0YXRlbWVudCB8IEJyZWFrU3RhdGVtZW50IHwgQ29udGludWVTdGF0ZW1lbnQgfCBSZXR1cm5TdGF0ZW1lbnQgfCBQcmludFN0YXRlbWVudCB8IFJhaXNlU3RhdGVtZW50IHwgVHJ5U3RhdGVtZW50fSBTdGF0ZW1lbnQgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCbG9ja1xuICogQHByb3BlcnR5IHtcIkJsb2NrXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1N0YXRlbWVudFtdfSBzdGF0ZW1lbnRzIC0gT3JkZXJlZCBzdGF0ZW1lbnRzIGluIG9uZSBsZXhpY2FsIHNjb3BlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRnVuY3Rpb25EZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgZGVjbGFyYXRpb24gaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEZ1bmN0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge1R5cGVQYXJhbWV0ZXJbXX0gW3R5cGVQYXJhbWV0ZXJzXSAtIE9yZGVyZWQgZGVjbGFyYXRpb24tc2NvcGVkIGludmFyaWFudCB1bmJvdW5kZWQgcGFyYW1ldGVycy5cbiAqIEBwcm9wZXJ0eSB7UGFyYW1ldGVyW119IHBhcmFtZXRlcnMgLSBGdW5jdGlvbiBwYXJhbWV0ZXJzLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gcmV0dXJuVHlwZSAtIFJldHVybiB0eXBlLlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIEZ1bmN0aW9uIGJvZHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWNvcmRGaWVsZFxuICogQHByb3BlcnR5IHtcIlJlY29yZEZpZWxkXCJ9IGtpbmQgLSBDbG9zZWQgcmVjb3JkLWZpZWxkIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgZmllbGQgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEZpZWxkIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhhY3QgZmllbGQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRmllbGQgZGVjbGFyYXRpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbmFtZS90eXBlIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlY29yZERlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiUmVjb3JkRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vbWluYWwgY2xvc2VkIGltbXV0YWJsZSByZWNvcmQgZGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgZGVjbGFyYXRpb24gaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFJlY29yZCBuYW1lLlxuICogQHByb3BlcnR5IHtUeXBlUGFyYW1ldGVyW119IFt0eXBlUGFyYW1ldGVyc10gLSBPcmRlcmVkIGRlY2xhcmF0aW9uLXNjb3BlZCBpbnZhcmlhbnQgdW5ib3VuZGVkIHBhcmFtZXRlcnMuXG4gKiBAcHJvcGVydHkge1JlY29yZEZpZWxkW119IGZpZWxkcyAtIE9yZGVyZWQgdW5pcXVlIHZpc2libGUgZmllbGRzLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBkZWNsYXJhdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBkZWNsYXJhdGlvbi1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHJpdmF0ZUZpZWxkXG4gKiBAcHJvcGVydHkge1wiUHJpdmF0ZUZpZWxkXCJ9IGtpbmQgLSBEZWNsYXJpbmctY2xhc3MtcHJpdmF0ZSBtdXRhYmxlIGluc3RhbmNlIGZpZWxkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgY2xhc3Mtc2NvcGVkIGZpZWxkIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBmaWVsZCBuYW1lIGluc2lkZSB0aGUgZGVjbGFyaW5nIGNsYXNzIG9ubHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhhY3QgZmllbGQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRmllbGQgZGVjbGFyYXRpb24gbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBuYW1lL3R5cGUgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ29uc3RydWN0b3JEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkNvbnN0cnVjdG9yRGVjbGFyYXRpb25cIn0ga2luZCAtIEV4YWN0IGNvbXBsZXRlIHByaXZhdGUtc3RhdGUgaW5pdGlhbGl6ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBjbGFzcy1zY29wZWQgY29uc3RydWN0b3IgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge1BhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gRXhhY3QgcG9zaXRpb25hbCBjb25zdHJ1Y3RvciBzaWduYXR1cmUuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gRmllbGQtb3JkZXIgaW5pdGlhbGl6YXRpb24gYm9keS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIGNvbnN0cnVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY29uc3RydWN0b3IgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBjb25zdHJ1Y3RvciByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1ldGhvZERlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiTWV0aG9kRGVjbGFyYXRpb25cIn0ga2luZCAtIFJlY2VpdmVyLWJvdW5kIGNsYXNzIG1ldGhvZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIGNsYXNzLXNjb3BlZCBtZXRob2QgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIG1ldGhvZCBuYW1lLlxuICogQHByb3BlcnR5IHtQYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIEV4YWN0IHBvc2l0aW9uYWwgbWV0aG9kIHNpZ25hdHVyZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHJldHVyblR5cGUgLSBFeGFjdCByZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBNZXRob2QgYm9keS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIHRoZSBtZXRob2QuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIG1ldGhvZCBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG1ldGhvZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ2xhc3NEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkNsYXNzRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vbWluYWwgcmVmZXJlbmNlIGNsYXNzIHdpdGggcHJpdmF0ZSBtdXRhYmxlIHN0YXRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgbW9kdWxlLWxvY2FsIGNsYXNzIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtQcml2YXRlRmllbGRbXX0gZmllbGRzIC0gT3JkZXJlZCBwcml2YXRlIGluc3RhbmNlIHN0YXRlLlxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvckRlY2xhcmF0aW9ufSBjb25zdHJ1Y3RvciAtIFNvbGUgZXhhY3QgY29uc3RydWN0b3IuXG4gKiBAcHJvcGVydHkge01ldGhvZERlY2xhcmF0aW9uW119IG1ldGhvZHMgLSBPcmRlcmVkIHJlY2VpdmVyIG1ldGhvZHMuXG4gKiBAcHJvcGVydHkge3traW5kOiBcIm9yZGluYXJ5XCJ9IHwge2tpbmQ6IFwib3duZWRSZXNvdXJjZVwiLCBmaWVsZElkOiBzdHJpbmcsIHJlc291cmNlSWQ6IHN0cmluZ319IFtvd25lcnNoaXBdIC0gRXhwbGljaXQgY2xhc3Mgb3duZXJzaGlwIHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNsYXNzIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgY2xhc3MtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFcnJvckRlY2xhcmF0aW9uXCJ9IGtpbmQgLSBOb21pbmFsIHVuY2hlY2tlZCBlcnJvciB3aXRoIG9uZSBpbW11dGFibGUgc3RyaW5nIG1lc3NhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgZGVjbGFyYXRpb24gaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEVycm9yIHR5cGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgZGVjbGFyYXRpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgZGVjbGFyYXRpb24tbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByaW50U3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUHJpbnRTdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFByaW50ZWQgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVudHJ5UG9pbnRcbiAqIEBwcm9wZXJ0eSB7XCJFbnRyeVBvaW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gRW50cnktcG9pbnQgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljTW9kdWxlXG4gKiBAcHJvcGVydHkge1wiTW9kdWxlXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1JlY29yZERlY2xhcmF0aW9uW119IFtyZWNvcmRzXSAtIFRvcC1sZXZlbCBub21pbmFsIHJlY29yZCBkZWNsYXJhdGlvbnMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge0NsYXNzRGVjbGFyYXRpb25bXX0gW2NsYXNzZXNdIC0gVG9wLWxldmVsIG5vbWluYWwgcmVmZXJlbmNlIGNsYXNzZXMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge0Vycm9yRGVjbGFyYXRpb25bXX0gW2Vycm9yc10gLSBUb3AtbGV2ZWwgbm9taW5hbCB1bmNoZWNrZWQgZXJyb3IgZGVjbGFyYXRpb25zIGluIHNvdXJjZSBvcmRlcjsgb21pdHRlZCB3aGVuIGVtcHR5LlxuICogQHByb3BlcnR5IHtFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gW2NhcGFiaWxpdGllc10gLSBDb21waWxlci1hdXRob3JpemVkIFRhc2sgMDM0IGRlY2xhcmF0aW9uczsgb21pc3Npb24gaXMgdGhlIGxlZ2FjeSBlbXB0eSBzZXQuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uRGVjbGFyYXRpb25bXX0gZnVuY3Rpb25zIC0gVG9wLWxldmVsIGZ1bmN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7RW50cnlQb2ludH0gZW50cnlQb2ludCAtIEV4ZWN1dGFibGUgZW50cnkgcG9pbnQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljUHJvdmVuYW5jZX0gW3Byb3ZlbmFuY2VdIC0gUGFyc2VyLWF1dGhvcmVkIHNvdXJjZSBhbmQgaWRlbnRpdHkgaW5kZXg7IG9wdGlvbmFsIGZvciBsZWdhY3kgY2FsbGVyLWF1dGhvcmVkIG1vZHVsZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY0ltcG9ydFxuICogQHByb3BlcnR5IHtcIkltcG9ydFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZHVsZUlkIC0gU3RhYmxlIGltcG9ydGVkIHNlbWFudGljIG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbXBvcnRlZE5hbWUgLSBFeHBvcnRlZCBkZWNsYXJhdGlvbiBuYW1lIGluIHRoZSBzb3VyY2UgbW9kdWxlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxvY2FsTmFtZSAtIEJpbmRpbmcgbmFtZSB2aXNpYmxlIGluIHRoZSBpbXBvcnRpbmcgbW9kdWxlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0RlY2xhcmF0aW9uS2luZH0gc3ltYm9sS2luZCAtIEltcG9ydGVkIGRlY2xhcmF0aW9uIG5hbWVzcGFjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIHJlc29sdmVkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSB0eXBlT25seSAtIFdoZXRoZXIgc291cmNlIHN5bnRheCBhZG1pdHRlZCBvbmx5IHR5cGUtcG9zaXRpb24gdXNlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBpbXBvcnQgZGVjbGFyYXRpb24vc3BlY2lmaWVyIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgaW1wb3J0IHJhbmdlcy5cbiAqIEBwcm9wZXJ0eSB7U3RkbGliRmFjYWRlUmVzb2x1dGlvbkV2aWRlbmNlfSBbc3RkbGliRmFjYWRlXSAtIEV4YWN0IHBhcnNlci1wcm92ZWQgbmF0aXZlIGZhY2FkZSBpZGVudGl0eSBldmlkZW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN0ZGxpYkZhY2FkZVJlc29sdXRpb25FdmlkZW5jZVxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkU3RkbGliRmFjYWRlUmVzb2x1dGlvblwifSBzY2hlbWEgLSBFdmlkZW5jZSBzY2hlbWEuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBFdmlkZW5jZSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZhY2FkZUlkZW50aXR5IC0gU2VsZWN0ZWQgZmFjYWRlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZhY2FkZVZlcnNpb24gLSBTZWxlY3RlZCBleGFjdCBmYWNhZGUgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYXRpdmVNb2R1bGUgLSBQYXJzZXItcHJvdmVkIHNvdXJjZSBzdGRsaWIgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hdGl2ZVN5bWJvbCAtIFBhcnNlci1wcm92ZWQgc291cmNlIHN0ZGxpYiBzeW1ib2wgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY0V4cG9ydFxuICogQHByb3BlcnR5IHtcIkV4cG9ydFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4cG9ydGVkTmFtZSAtIE5hbWUgdmlzaWJsZSB0byBpbXBvcnRpbmcgbW9kdWxlcy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNEZWNsYXJhdGlvbktpbmR9IHN5bWJvbEtpbmQgLSBFeHBvcnRlZCBkZWNsYXJhdGlvbiBuYW1lc3BhY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBleHBvcnRlZCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgZXhwb3J0IGRlY2xhcmF0aW9uL3NwZWNpZmllciBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGV4cG9ydCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1Byb2dyYW1Nb2R1bGVcbiAqIEBwcm9wZXJ0eSB7XCJNb2R1bGVcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFN0YWJsZSBjYWxsZXItc3VwcGxpZWQgbG9naWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlRmlsZW5hbWUgLSBFeHBsaWNpdCBzb3VyY2UgZmlsZW5hbWU7IG5ldmVyIGFuIGltcGxpY2l0IHJlYWQgcmVxdWVzdC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkRGVjbGFyYXRpb25bXX0gW3JlY29yZHNdIC0gVG9wLWxldmVsIG5vbWluYWwgcmVjb3JkIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Q2xhc3NEZWNsYXJhdGlvbltdfSBbY2xhc3Nlc10gLSBDb21waWxlci1vd25lZCBmYWNhZGUgcmVmZXJlbmNlIGNsYXNzZXMuXG4gKiBAcHJvcGVydHkge0Vycm9yRGVjbGFyYXRpb25bXX0gW2Vycm9yc10gLSBUb3AtbGV2ZWwgbm9taW5hbCB1bmNoZWNrZWQgZXJyb3IgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtGdW5jdGlvbkRlY2xhcmF0aW9uW119IGZ1bmN0aW9ucyAtIFRvcC1sZXZlbCBmdW5jdGlvbnMuXG4gKiBAcHJvcGVydHkge1NlbWFudGljSW1wb3J0W119IGltcG9ydHMgLSBSZXNvbHZlZCBpbXBvcnRzIGluIHNvdXJjZSBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNFeHBvcnRbXX0gZXhwb3J0cyAtIFJlc29sdmVkIGV4cG9ydHMgaW4gc291cmNlIG9yZGVyLlxuICogQHByb3BlcnR5IHtFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gW2NhcGFiaWxpdGllc10gLSBBdXRob3JpdHkgZGVjbGFyYXRpb25zIHNoYXJlZCBieSByZWZlcmVuY2Ugd2hlbiB0aGUgcHJvZ3JhbSBkZWNsYXJlcyBhIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QuXG4gKiBAcHJvcGVydHkge0VudHJ5UG9pbnR9IFtlbnRyeVBvaW50XSAtIFNvbGUgZXhlY3V0YWJsZSBlbnRyeSBwb2ludCwgcHJlc2VudCBvbmx5IG9uIHRoZSBzZWxlY3RlZCBtb2R1bGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljUHJvdmVuYW5jZX0gW3Byb3ZlbmFuY2VdIC0gUGFyc2VyLWF1dGhvcmVkIHNvdXJjZSBhbmQgaWRlbnRpdHkgaW5kZXguXG4gKiBAcHJvcGVydHkge3tpZGVudGl0eTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9fSBbc3RkbGliRmFjYWRlXSAtIFNlbGVjdGVkIGNvbXBpbGVyLW93bmVkIGZhY2FkZSBtb2R1bGUgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdGRsaWJGYWNhZGVQcm9ncmFtTW9kdWxlRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHt7aWRlbnRpdHk6IHN0cmluZywgcmFuZ2U6IHN0cmluZ31bXX0gZGVwZW5kZW5jaWVzIC0gVmVyc2lvbmVkIGZhY2FkZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWRlbnRpdHkgLSBGYWNhZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkgeyh7aWRlbnRpdHk6IHN0cmluZywga2luZDogXCJtb2R1bGVcIiwgc3ltYm9sczogc3RyaW5nW119IHwge2Zvcm1zOiAoXCJ1bnF1YWxpZmllZC1jYWxsXCIgfCBcInJlY2VpdmVyLWNhbGxcIilbXSwgaWRlbnRpdHk6IHN0cmluZywga2luZDogXCJidWlsdGluXCIsIHN5bWJvbHM6IHN0cmluZ1tdfSlbXX0gbmF0aXZlTW9kdWxlcyAtIEV4YWN0IG5hdGl2ZSBzb3VyY2UgaWRlbnRpdGllcy5cbiAqIEBwcm9wZXJ0eSB7KHtlZmZlY3RzOiBzdHJpbmdbXSwgZmFpbHVyZXM6IHN0cmluZ1tdLCBmb3JtczogKFwiZGlyZWN0LWNhbGxcIiB8IFwidW5xdWFsaWZpZWQtY2FsbFwiIHwgXCJyZWNlaXZlci1jYWxsXCIpW10sIGtpbmQ6IFwiZnVuY3Rpb25cIiwgbmFtZTogc3RyaW5nLCBvd25lcnNoaXA6IFwibm90LWFwcGxpY2FibGVcIiwgcGFyYW1ldGVyczoge25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfVtdLCByZXR1cm5UeXBlOiBzdHJpbmd9IHwge2NvbnN0cnVjdG9yOiB7ZWZmZWN0czogc3RyaW5nW10sIGZhaWx1cmVzOiBzdHJpbmdbXSwgb3duZXJzaGlwOiBcImFjcXVpcmVkXCIsIHBhcmFtZXRlcnM6IHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ31bXX0sIGZvcm1zOiBbXCJjb25zdHJ1Y3Rvci1jYWxsXCJdLCBraW5kOiBcImNsYXNzXCIsIG1ldGhvZHM6IHtlZmZlY3RzOiBzdHJpbmdbXSwgZmFpbHVyZXM6IHN0cmluZ1tdLCBmb3JtczogW1wicmVjZWl2ZXItY2FsbFwiXSwgbmFtZTogc3RyaW5nLCBvd25lcnNoaXA6IFwiYm9ycm93ZWRcIiB8IFwiY29uc3VtZWRcIiwgcGFyYW1ldGVyczoge25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfVtdLCByZXR1cm5UeXBlOiBzdHJpbmd9W10sIG5hbWU6IHN0cmluZywgb3duZXJzaGlwOiBcIm93bmVkLXJlZmVyZW5jZVwifSlbXX0gcHVibGljRGVjbGFyYXRpb25zIC0gUHVibGljIHNvdXJjZSBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge3ttb2R1bGU6IHN0cmluZywgb3BlcmF0aW9uczogc3RyaW5nW10sIHJhbmdlOiBzdHJpbmd9W119IHJlcXVpcmVtZW50cyAtIENhbm9uaWNhbCBjYXBhYmlsaXR5IHJlcXVpcmVtZW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBydW50aW1lUHJvZmlsZSAtIEV4YWN0IHNvdXJjZSBydW50aW1lIHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlTW9kdWxlIC0gQ29tcGlsZXItb3duZWQgc2VtYW50aWMgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBFeGFjdCBmYWNhZGUgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJpbnRlcm5hbFwiIHwgXCJwdWJsaWNcIn0gdmlzaWJpbGl0eSAtIE5hdGl2ZS1zZWxlY3RhYmxlIHZpc2liaWxpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdGRsaWJGYWNhZGVQcm9ncmFtRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkU3RkbGliRmFjYWRlc1wifSBzY2hlbWEgLSBGYWNhZGUgZGVzY3JpcHRvciBzY2hlbWEuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBGYWNhZGUgZGVzY3JpcHRvciB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFNvdXJjZS1sYW5ndWFnZSBjb21wYXRpYmlsaXR5IHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge1N0ZGxpYkZhY2FkZVByb2dyYW1Nb2R1bGVEZXNjcmlwdG9yW119IG1vZHVsZXMgLSBEZXBlbmRlbmN5LWZpcnN0IHNlbGVjdGVkIGV4ZWN1dGFibGUgY2xvc3VyZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljUHJvZ3JhbVxuICogQHByb3BlcnR5IHtcIlByb2dyYW1cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNQcm9ncmFtTW9kdWxlW119IG1vZHVsZXMgLSBEZXBlbmRlbmN5LWZpcnN0IGRldGVybWluaXN0aWMgbW9kdWxlIG9yZGVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudHJ5TW9kdWxlIC0gU3RhYmxlIGlkZW50aXR5IG9mIHRoZSBzb2xlIGVudHJ5IG1vZHVsZS5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gQ2FsbGVyLW9yZGVyIGNvbXBsZXRlIHNvdXJjZSByZWdpc3RyeS5cbiAqIEBwcm9wZXJ0eSB7e2NvbnRyYWN0VmVyc2lvbj86IHN0cmluZywgaWRlbnRpdHk6IHN0cmluZ319IFtzdGRsaWJDb250cmFjdF0gLSBEZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0OyBwbGFpbiwgbmV2ZXIgZnJvemVuLlxuICogQHByb3BlcnR5IHt7Y29udHJhY3RWZXJzaW9uPzogc3RyaW5nLCBpZGVudGl0eTogc3RyaW5nfVtdfSBbc3RkbGliQ29udHJhY3RzXSAtIE9yZGVyZWQgZGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdHM7IHBsYWluLCBuZXZlciBmcm96ZW4uXG4gKiBAcHJvcGVydHkge1N0ZGxpYkZhY2FkZVByb2dyYW1EZXNjcmlwdG9yfSBbc3RkbGliRmFjYWRlc10gLSBDb21wbGV0ZSBzZWxlY3RlZCBzb3VyY2UtbGFuZ3VhZ2UgZmFjYWRlIGNsb3N1cmUuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY01vZHVsZSB8IFNlbWFudGljUHJvZ3JhbU1vZHVsZSB8IFNlbWFudGljSW1wb3J0IHwgU2VtYW50aWNFeHBvcnQgfCBSZWNvcmREZWNsYXJhdGlvbiB8IENsYXNzRGVjbGFyYXRpb24gfCBFcnJvckRlY2xhcmF0aW9uIHwgRWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uIHwgRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbiB8IEVmZmVjdEZhaWx1cmVEZWNsYXJhdGlvbiB8IEVmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9uIHwgUmVjb3JkRmllbGQgfCBQcml2YXRlRmllbGQgfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgVHlwZVBhcmFtZXRlciB8IFBhcmFtZXRlciB8IFZhbHVlQmluZGluZyB8IENhdGNoQmluZGluZyB8IEJsb2NrIHwgU3RhdGVtZW50IHwgRW50cnlQb2ludCB8IEV4cHJlc3Npb24gfCBFcnJvckNvbnN0cnVjdGlvbiB8IEVycm9yVHlwZSB8IE1hcEVudHJ5IHwgU2VtYW50aWNWYWx1ZVR5cGUgfCBGdW5jdGlvblJldHVyblR5cGVSZWZlcmVuY2V9IFNlbWFudGljTm9kZSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY05vZGV9IFNlbWFudGljTm9kZVdpdGhvdXRMb2NhdGlvbnMgKi9cblxuZXhwb3J0IHt9XG4iXX0=
1359
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvdHlwZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLGtMQUFrTDtBQUNsTCxzREFBc0Q7QUFDdEQsOEZBQThGO0FBQzlGLGlFQUFpRTtBQUNqRSxtRUFBbUU7QUFDbkUsa0VBQWtFO0FBQ2xFLHVFQUF1RTtBQUN2RSw2VkFBNlY7QUFDN1YsNlFBQTZRO0FBQzdRLGlHQUFpRztBQUNqRyxnSEFBZ0g7QUFDaEgsZ0lBQWdJO0FBQ2hJLHVIQUF1SDtBQUV2SDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVIOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7R0FJRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7OztHQUlHO0FBRUg7Ozs7O0dBS0c7QUFFSCwrRUFBK0U7QUFFL0U7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSCw4REFBOEQ7QUFFOUQ7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7OztHQUlHO0FBRUg7Ozs7O0dBS0c7QUFFSCxrSEFBa0g7QUFFbEg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUgsbUxBQW1MO0FBRW5MLHlFQUF5RTtBQUV6RTs7Ozs7Ozs7R0FRRztBQUVIOzs7O0dBSUc7QUFFSDs7O0dBR0c7QUFFSDs7OztHQUlHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVIOzs7Ozs7Ozs7Ozs7R0FZRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVILG9OQUFvTjtBQUNwTixtRUFBbUU7QUFFbkU7Ozs7O0dBS0c7QUFFSCw0RkFBNEY7QUFFNUYsK3JCQUErckI7QUFDL3JCLDBFQUEwRTtBQUUxRTs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7OztHQUlHO0FBRUgsMktBQTJLO0FBRTNLOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSCxvRkFBb0Y7QUFDcEYsNk5BQTZOO0FBQzdOLHFEQUFxRDtBQUNyRCw0UEFBNFA7QUFDNVAsMllBQTJZO0FBQzNZLHdLQUF3SztBQUN4Syx3SUFBd0k7QUFDeEksK1NBQStTO0FBRS9TOzs7Ozs7R0FNRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUgsMmpCQUEyakI7QUFFM2pCOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVILHVFQUF1RTtBQUN2RSxnU0FBZ1M7QUFFaFM7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUVIOzs7Ozs7Ozs7Ozs7R0FZRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSCwybkJBQTJuQjtBQUMzbkIsMkRBQTJEO0FBRTNELE9BQU8sRUFBRSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKiBAdHlwZWRlZiB7XCJwaHBcIiB8IFwicnVieVwiIHwgXCJqYXZhc2NyaXB0XCIgfCBcInR5cGVzY3JpcHRcIiB8IFwiamF2YVwiIHwgXCJrb3RsaW5cIiB8IFwicHl0aG9uXCIgfCBcImNzaGFycFwiIHwgXCJnb1wiIHwgXCJjXCIgfCBcImNwcFwiIHwgXCJydXN0XCIgfCBcInN3aWZ0XCIgfCBcImRhcnRcIiB8IFwiemlnXCJ9IFNlbWFudGljTGFuZ3VhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNMYW5ndWFnZX0gVGV4dEJhY2tlbmRMYW5ndWFnZSAqL1xuLyoqIEB0eXBlZGVmIHtUZXh0QmFja2VuZExhbmd1YWdlIHwgXCJ3YXNtXCIgfCBcImlvc1wiIHwgXCJhbmRyb2lkXCIgfCBcImZsdXR0ZXJcIn0gQmFja2VuZExhbmd1YWdlICovXG4vKiogQHR5cGVkZWYge1NlbWFudGljTGFuZ3VhZ2UgfCBcImh0bWxcIn0gR2VuZXJhdGVkVGV4dExhbmd1YWdlICovXG4vKiogQHR5cGVkZWYge1wiaW50ZWdlclwiIHwgXCJib29sZWFuXCIgfCBcInN0cmluZ1wifSBTZW1hbnRpY1R5cGVOYW1lICovXG4vKiogQHR5cGVkZWYge1NlbWFudGljVHlwZU5hbWUgfCBcInZvaWRcIn0gRnVuY3Rpb25SZXR1cm5UeXBlTmFtZSAqL1xuLyoqIEB0eXBlZGVmIHtcIkludGVnZXJOZWdhdGVcIiB8IFwiQm9vbGVhbk5vdFwifSBTZW1hbnRpY1VuYXJ5T3BlcmF0aW9uICovXG4vKiogQHR5cGVkZWYge1wiSW50ZWdlckFkZFwiIHwgXCJJbnRlZ2VyU3VidHJhY3RcIiB8IFwiSW50ZWdlck11bHRpcGx5XCIgfCBcIkJvb2xlYW5BbmRcIiB8IFwiQm9vbGVhbk9yXCIgfCBcIkludGVnZXJFcXVhbFwiIHwgXCJJbnRlZ2VyTm90RXF1YWxcIiB8IFwiQm9vbGVhbkVxdWFsXCIgfCBcIkJvb2xlYW5Ob3RFcXVhbFwiIHwgXCJTdHJpbmdFcXVhbFwiIHwgXCJTdHJpbmdOb3RFcXVhbFwiIHwgXCJJbnRlZ2VyTGVzc1RoYW5cIiB8IFwiSW50ZWdlckxlc3NUaGFuT3JFcXVhbFwiIHwgXCJJbnRlZ2VyR3JlYXRlclRoYW5cIiB8IFwiSW50ZWdlckdyZWF0ZXJUaGFuT3JFcXVhbFwiIHwgXCJTdHJpbmdDb25jYXRcIn0gU2VtYW50aWNCaW5hcnlPcGVyYXRpb24gKi9cbi8qKiBAdHlwZWRlZiB7XCJjYXBhYmlsaXR5XCIgfCBcInJlc291cmNlXCIgfCBcImZhaWx1cmVcIiB8IFwib3BlcmF0aW9uXCIgfCBcInJlY29yZFwiIHwgXCJpbnRlcmZhY2VcIiB8IFwiaW50ZXJmYWNlTWV0aG9kXCIgfCBcImNsYXNzXCIgfCBcImVycm9yXCIgfCBcImZpZWxkXCIgfCBcImNvbnN0cnVjdG9yXCIgfCBcIm1ldGhvZFwiIHwgXCJmdW5jdGlvblwiIHwgXCJ0eXBlUGFyYW1ldGVyXCIgfCBcInBhcmFtZXRlclwiIHwgXCJsb2NhbFwiIHwgXCJpdGVyYXRpb25cIiB8IFwiY2F0Y2hcIn0gU2VtYW50aWNTeW1ib2xLaW5kICovXG4vKiogQHR5cGVkZWYge1wicmVjb3JkXCIgfCBcImludGVyZmFjZVwiIHwgXCJjbGFzc1wiIHwgXCJlcnJvclwiIHwgXCJmdW5jdGlvblwifSBTZW1hbnRpY0RlY2xhcmF0aW9uS2luZCAqL1xuLyoqIEB0eXBlZGVmIHtcImRlY2xhcmF0aW9uXCIgfCBcInR5cGVcIiB8IFwiY29uc3RydWN0XCIgfCBcIm1lbWJlclwiIHwgXCJyZWFkXCIgfCBcIndyaXRlXCIgfCBcImNhbGxcIn0gU2VtYW50aWNTeW1ib2xSb2xlICovXG4vKiogQHR5cGVkZWYge1wicGFyc2VcIiB8IFwiZ2VuZXJhdGVcIiB8IFwicmVzdG9yZVwiIHwgXCJjb21waWxlXCIgfCBcImxpbmtcIiB8IFwidmFsaWRhdGVcIiB8IFwiaW5zdGFudGlhdGVcIiB8IFwiZXhlY3V0ZVwifSBBY2NlcHRhbmNlU3RhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7XCJlbnRyeVwiIHwgXCJzb3VyY2VcIiB8IFwibWFuaWZlc3RcIiB8IFwic3VwcG9ydFwiIHwgXCJtYXBwaW5nXCIgfCBcInJlc291cmNlXCIgfCBcImxvYWRlclwifSBHZW5lcmF0ZWRBcnRpZmFjdFJvbGUgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJb3NBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb25JbnB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2R1Y3ROYW1lIC0gU2FmZSBYY29kZSBwcm9kdWN0L3BhdGggaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kdWxlTmFtZSAtIFNhZmUgU3dpZnQgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9yZ2FuaXphdGlvblByZWZpeCAtIENhbGxlci1zdXBwbGllZCByZXZlcnNlLUROUyBvcmdhbml6YXRpb24gcHJlZml4LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJ1bmRsZUlkZW50aWZpZXIgLSBDYWxsZXItc3VwcGxpZWQgcmV2ZXJzZS1ETlMgYXBwbGljYXRpb24gYnVuZGxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlcGxveW1lbnRUYXJnZXQgLSBDYWxsZXItc3VwcGxpZWQgbWFqb3IubWlub3IgaU9TIGRlcGxveW1lbnQgdGFyZ2V0OyBuZXZlciBpbmZlcnJlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkaXNwbGF5TmFtZSAtIFVzZXItdmlzaWJsZSBhcHBsaWNhdGlvbiBuYW1lLlxuICogQHByb3BlcnR5IHtcIlNvdXJjZXNcIn0gW3NvdXJjZVJvb3RdIC0gRml4ZWQgZ2VuZXJhdGVkLXNvdXJjZSByb290LlxuICogQHByb3BlcnR5IHtcIkFzc2V0cy54Y2Fzc2V0c1wifSBbcmVzb3VyY2VSb290XSAtIEZpeGVkIGNhbGxlci1yZXNvdXJjZSByb290LlxuICogQHByb3BlcnR5IHtcInN3aWZ0dWlcIn0gW2xpZmVjeWNsZV0gLSBTb2xlIHN1cHBvcnRlZCBsaWZlY3ljbGUuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIG5ldmVyPn0gW2luZm9QbGlzdF0gLSBDbG9zZWQgYmFzZWxpbmUgY2FsbGVyIHBsaXN0IGV4dGVuc2lvbjsgY3VycmVudGx5IGVtcHR5LlxuICogQHByb3BlcnR5IHt1bmtub3duW119IFtwZXJtaXNzaW9uc10gLSBWYWxpZGF0ZWQgYXMgdGhlIGNsb3NlZCBlbXB0eSBiYXNlbGluZSBwZXJtaXNzaW9ucy5cbiAqIEBwcm9wZXJ0eSB7dW5rbm93bltdfSBbZW50aXRsZW1lbnRzXSAtIFZhbGlkYXRlZCBhcyB0aGUgY2xvc2VkIGVtcHR5IGJhc2VsaW5lIGVudGl0bGVtZW50cy5cbiAqIEBwcm9wZXJ0eSB7dW5rbm93bltdfSBbcHJpdmFjeURlY2xhcmF0aW9uc10gLSBWYWxpZGF0ZWQgYXMgdGhlIGNsb3NlZCBlbXB0eSBiYXNlbGluZSBwcml2YWN5IGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7dW5rbm93bltdfSBbY2FwYWJpbGl0aWVzXSAtIFZhbGlkYXRlZCBhcyB0aGUgY2xvc2VkIGVtcHR5IGJhc2VsaW5lIEFwcGxlIGNhcGFiaWxpdGllcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIElvc0FwcGxpY2F0aW9uQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2R1Y3ROYW1lIC0gVmFsaWRhdGVkIFhjb2RlIHByb2R1Y3QvcGF0aCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2R1bGVOYW1lIC0gVmFsaWRhdGVkIFN3aWZ0IG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcmdhbml6YXRpb25QcmVmaXggLSBWYWxpZGF0ZWQgcmV2ZXJzZS1ETlMgb3JnYW5pemF0aW9uIHByZWZpeC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBidW5kbGVJZGVudGlmaWVyIC0gVmFsaWRhdGVkIHJldmVyc2UtRE5TIGFwcGxpY2F0aW9uIGJ1bmRsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXBsb3ltZW50VGFyZ2V0IC0gVmFsaWRhdGVkIGNhbGxlci1zdXBwbGllZCBkZXBsb3ltZW50IHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkaXNwbGF5TmFtZSAtIFZhbGlkYXRlZCBkaXNwbGF5IG5hbWUuXG4gKiBAcHJvcGVydHkge1wiU291cmNlc1wifSBzb3VyY2VSb290IC0gR2VuZXJhdGVkLXNvdXJjZSByb290LlxuICogQHByb3BlcnR5IHtcIkFzc2V0cy54Y2Fzc2V0c1wifSByZXNvdXJjZVJvb3QgLSBDYWxsZXItcmVzb3VyY2Ugcm9vdC5cbiAqIEBwcm9wZXJ0eSB7XCJzd2lmdHVpXCJ9IGxpZmVjeWNsZSAtIFNvbGUgc3VwcG9ydGVkIGxpZmVjeWNsZS5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgbmV2ZXI+Pn0gaW5mb1BsaXN0IC0gRW1wdHkgY2FsbGVyIHBsaXN0IGV4dGVuc2lvbi5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgbmV2ZXJbXX0gcGVybWlzc2lvbnMgLSBFbXB0eSBiYXNlbGluZSBwZXJtaXNzaW9ucy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgbmV2ZXJbXX0gZW50aXRsZW1lbnRzIC0gRW1wdHkgYmFzZWxpbmUgZW50aXRsZW1lbnRzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBuZXZlcltdfSBwcml2YWN5RGVjbGFyYXRpb25zIC0gRW1wdHkgYmFzZWxpbmUgcHJpdmFjeSBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IG5ldmVyW119IGNhcGFiaWxpdGllcyAtIEVtcHR5IGJhc2VsaW5lIEFwcGxlIGNhcGFiaWxpdGllcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIElvc0FwcGxpY2F0aW9uQXNzZXRJbnB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBGdWxsIHNhZmUgZGVzdGluYXRpb24gYmVsb3cgQXNzZXRzLnhjYXNzZXRzLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBVaW50OEFycmF5fSBjb250ZW50IC0gRXhhY3QgY2FsbGVyLXByb3ZpZGVkIHRleHQgb3IgYnl0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gRXhwbGljaXQgYXJ0aWZhY3QgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzaGEyNTYgLSBMb3dlcmNhc2UgU0hBLTI1NiBvZiBleGFjdCBVVEYtOCB0ZXh0IG9yIGJ5dGVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQW5kcm9pZEFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbklucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FwcGxpY2F0aW9uSWRdIC0gTG93ZXJjYXNlIHJldmVyc2UtRE5TIEFuZHJvaWQgYXBwbGljYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVzcGFjZV0gLSBLb3RsaW4vQW5kcm9pZCBuYW1lc3BhY2U7IGRlZmF1bHRzIHRvIGFwcGxpY2F0aW9uSWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BhY2thZ2VOYW1lXSAtIEdlbmVyYXRlZCBLb3RsaW4gcGFja2FnZTsgZGVmYXVsdHMgdG8gbmFtZXNwYWNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthY3Rpdml0eUNsYXNzTmFtZV0gLSBMYXVuY2hlciBBY3Rpdml0eSBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwcm9kdWN0TmFtZV0gLSBEZXRlcm1pbmlzdGljIHByb2plY3QgcHJvZHVjdCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkaXNwbGF5TmFtZV0gLSBVc2VyLXZpc2libGUgYXBwbGljYXRpb24gbGFiZWwuXG4gKiBAcHJvcGVydHkgezIzfSBbbWluaW11bVNka10gLSBRdWFsaWZpZWQgbWluaW11bSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7MzV9IFt0YXJnZXRTZGtdIC0gUXVhbGlmaWVkIHRhcmdldCBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7MzV9IFtjb21waWxlU2RrXSAtIFF1YWxpZmllZCBjb21waWxlIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHtcIjM1LjAuMFwifSBbYnVpbGRUb29sc1ZlcnNpb25dIC0gUXVhbGlmaWVkIEFuZHJvaWQgQnVpbGQgVG9vbHMgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdmVyc2lvbkNvZGVdIC0gUG9zaXRpdmUgQW5kcm9pZCB2ZXJzaW9uIGNvZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ZlcnNpb25OYW1lXSAtIENhbm9uaWNhbCBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge1widW5zcGVjaWZpZWRcIn0gW29yaWVudGF0aW9uXSAtIEJhc2VsaW5lIG9yaWVudGF0aW9uIGJlaGF2aW9yLlxuICogQHByb3BlcnR5IHtcInN5c3RlbVwifSBbdGhlbWVdIC0gQmFzZWxpbmUgcGxhdGZvcm0tbmF0aXZlIHRoZW1lLlxuICogQHByb3BlcnR5IHt1bmtub3duW119IFtwZXJtaXNzaW9uc10gLSBWYWxpZGF0ZWQgYXMgdGhlIGNsb3NlZCBlbXB0eSBwZXJtaXNzaW9uIHNldC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFuZHJvaWRBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBsaWNhdGlvbklkIC0gVmFsaWRhdGVkIEFuZHJvaWQgYXBwbGljYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZXNwYWNlIC0gVmFsaWRhdGVkIEFuZHJvaWQgbmFtZXNwYWNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhY2thZ2VOYW1lIC0gR2VuZXJhdGVkIEtvdGxpbiBwYWNrYWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGl2aXR5Q2xhc3NOYW1lIC0gTGF1bmNoZXIgQWN0aXZpdHkgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9kdWN0TmFtZSAtIFByb2plY3QgcHJvZHVjdCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpc3BsYXlOYW1lIC0gVXNlci12aXNpYmxlIGFwcGxpY2F0aW9uIGxhYmVsLlxuICogQHByb3BlcnR5IHsyM30gbWluaW11bVNkayAtIFF1YWxpZmllZCBtaW5pbXVtIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gdGFyZ2V0U2RrIC0gUXVhbGlmaWVkIHRhcmdldCBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7MzV9IGNvbXBpbGVTZGsgLSBRdWFsaWZpZWQgY29tcGlsZSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7XCIzNS4wLjBcIn0gYnVpbGRUb29sc1ZlcnNpb24gLSBRdWFsaWZpZWQgQW5kcm9pZCBCdWlsZCBUb29scyB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZlcnNpb25Db2RlIC0gUG9zaXRpdmUgQW5kcm9pZCB2ZXJzaW9uIGNvZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbk5hbWUgLSBDYW5vbmljYWwgYXBwbGljYXRpb24gdmVyc2lvbiBuYW1lLlxuICogQHByb3BlcnR5IHtcInVuc3BlY2lmaWVkXCJ9IG9yaWVudGF0aW9uIC0gQmFzZWxpbmUgb3JpZW50YXRpb24gYmVoYXZpb3IuXG4gKiBAcHJvcGVydHkge1wic3lzdGVtXCJ9IHRoZW1lIC0gUGxhdGZvcm0tbmF0aXZlIHRoZW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQW5kcm9pZEFwcGxpY2F0aW9uSW5wdXRGaWxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIFNhZmUgcGF0aCByZWxhdGl2ZSB0byB0aGUgc2VsZWN0ZWQgZml4ZWQgQW5kcm9pZCByZXNvdXJjZSBvciBhc3NldCByb290LlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBVaW50OEFycmF5fSBjb250ZW50IC0gRXhhY3QgY2FsbGVyLXByb3ZpZGVkIHRleHQgb3IgYnl0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gRXhwbGljaXQgYXJ0aWZhY3QgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzaGEyNTYgLSBMb3dlcmNhc2UgU0hBLTI1NiBvZiBleGFjdCBVVEYtOCB0ZXh0IG9yIGJ5dGVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRmx1dHRlckFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbklucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BhY2thZ2VOYW1lXSAtIExvd2VyY2FzZSBEYXJ0IHBhY2thZ2UgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW29yZ2FuaXphdGlvbl0gLSBMb3dlcmNhc2UgcmV2ZXJzZS1ETlMgb3duaW5nIG9yZ2FuaXphdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYXBwbGljYXRpb25JZF0gLSBMb3dlcmNhc2UgcmV2ZXJzZS1ETlMgQW5kcm9pZCBhcHBsaWNhdGlvbiBpZGVudGl0eSBleHRlbmRpbmcgdGhlIG9yZ2FuaXphdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYWN0aXZpdHlDbGFzc05hbWVdIC0gR2VuZXJhdGVkIEphdmEgbGF1bmNoZXIgQWN0aXZpdHkgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGlzcGxheU5hbWVdIC0gVXNlci12aXNpYmxlIGFwcGxpY2F0aW9uIGxhYmVsLlxuICogQHByb3BlcnR5IHsyM30gW21pbmltdW1TZGtdIC0gUXVhbGlmaWVkIG1pbmltdW0gQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkgezM1fSBbdGFyZ2V0U2RrXSAtIFF1YWxpZmllZCB0YXJnZXQgQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkgezM1fSBbY29tcGlsZVNka10gLSBRdWFsaWZpZWQgY29tcGlsZSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7XCIzNS4wLjBcIn0gW2J1aWxkVG9vbHNWZXJzaW9uXSAtIFF1YWxpZmllZCBBbmRyb2lkIEJ1aWxkIFRvb2xzIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3ZlcnNpb25Db2RlXSAtIFBvc2l0aXZlIEFuZHJvaWQvRmx1dHRlciBidWlsZCBudW1iZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ZlcnNpb25OYW1lXSAtIENhbm9uaWNhbCBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gW3Blcm1pc3Npb25zXSAtIFZhbGlkYXRlZCBhcyB0aGUgY2xvc2VkIGVtcHR5IHBlcm1pc3Npb24gc2V0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRmx1dHRlckFwcGxpY2F0aW9uQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhY2thZ2VOYW1lIC0gVmFsaWRhdGVkIERhcnQgcGFja2FnZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcmdhbml6YXRpb24gLSBWYWxpZGF0ZWQgb3duaW5nIG9yZ2FuaXphdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBsaWNhdGlvbklkIC0gVmFsaWRhdGVkIEFuZHJvaWQgYXBwbGljYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aXZpdHlDbGFzc05hbWUgLSBHZW5lcmF0ZWQgSmF2YSBsYXVuY2hlciBBY3Rpdml0eSBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpc3BsYXlOYW1lIC0gVXNlci12aXNpYmxlIGFwcGxpY2F0aW9uIGxhYmVsLlxuICogQHByb3BlcnR5IHsyM30gbWluaW11bVNkayAtIFF1YWxpZmllZCBtaW5pbXVtIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gdGFyZ2V0U2RrIC0gUXVhbGlmaWVkIHRhcmdldCBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7MzV9IGNvbXBpbGVTZGsgLSBRdWFsaWZpZWQgY29tcGlsZSBBbmRyb2lkIEFQSS5cbiAqIEBwcm9wZXJ0eSB7XCIzNS4wLjBcIn0gYnVpbGRUb29sc1ZlcnNpb24gLSBRdWFsaWZpZWQgQW5kcm9pZCBCdWlsZCBUb29scyB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZlcnNpb25Db2RlIC0gUG9zaXRpdmUgQW5kcm9pZC9GbHV0dGVyIGJ1aWxkIG51bWJlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uTmFtZSAtIENhbm9uaWNhbCBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBGbHV0dGVyQXBwbGljYXRpb25Bc3NldElucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIFNhZmUgcGF0aCBiZWxvdyB0aGUgZ2VuZXJhdGVkIEZsdXR0ZXIgYXNzZXRzIHJvb3QuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGNvbnRlbnQgLSBFeGFjdCBjYWxsZXItcHJvdmlkZWQgdGV4dCBvciBieXRlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZWRpYVR5cGUgLSBFeHBsaWNpdCBhcnRpZmFjdCBtZWRpYSB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNoYTI1NiAtIExvd2VyY2FzZSBTSEEtMjU2IG9mIGV4YWN0IFVURi04IHRleHQgb3IgYnl0ZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZVJvbGVDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZnJvbnRlbmQgLSBQYXJzZXIgYWRhcHRlciBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHRleHRCYWNrZW5kIC0gU2luZ2xlLSBvciBtdWx0aS1maWxlIHRleHQgYmFja2VuZCBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJpbmFyeUJhY2tlbmQgLSBCaW5hcnkgYmFja2VuZCBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFwcGxpY2F0aW9uQmFja2VuZCAtIEFwcGxpY2F0aW9uLWFydGlmYWN0IGJhY2tlbmQgYXZhaWxhYmlsaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBpbnRlcm9wZXJhYmlsaXR5IC0gSW50ZXJvcGVyYWJpbGl0eSBicmlkZ2UgYXZhaWxhYmlsaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBwcm92aWRlciAtIFRhcmdldCBob3N0IHN0ZGxpYiBwcm92aWRlci9uYXRpdmUtYmluZGluZyBhdmFpbGFiaWxpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZU1hcHBpbmdDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmljaFRleHQgLSBBdXRob3JpdGF0aXZlIHJpY2ggdGV4dCBtYXBwaW5ncy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc291cmNlTWFwVjMgLSBTb3VyY2UgTWFwIHYzIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJpbmFyeVJhbmdlcyAtIEJ5dGUtY29vcmRpbmF0ZSBiaW5hcnkvcmVzb3VyY2UgbWFwcGluZ3MuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZUFjY2VwdGFuY2VDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgQWNjZXB0YW5jZVN0YWdlW119IHN0YWdlcyAtIEFwcGxpY2FibGUgb3JkZXJlZCBhY2NlcHRhbmNlIHN0YWdlcy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IHRvb2xjaGFpbnMgLSBSZXF1aXJlZCBjYW5vbmljYWwgdG9vbGNoYWluIElEcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlQ2hlY2tDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3VwcG9ydGVkIC0gV2hldGhlciB0aGUgdGFyZ2V0IG93bnMgYSBkZXZlbG9wZXIgY2hlY2sgcGxhbi5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgQWNjZXB0YW5jZVN0YWdlW119IHN0YWdlcyAtIE9yZGVyZWQgbm9uLWV4ZWN1dGluZyBkZXZlbG9wZXItY2hlY2sgc3RhZ2VzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gdG9vbGNoYWlucyAtIEV4YWN0IGNhbm9uaWNhbCB0b29scyByZXF1aXJlZCB0byBjb25zdHJ1Y3QgdGhlIHBsYW4uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZUZlYXR1cmVDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzIC0gVGFzayAwMDUgYXJiaXRyYXJ5IHJlcXVpcmVkIHNpZ25hdHVyZXMsIHJlc29sdmVkIGRpcmVjdCBjYWxscywgYW5kIHZvaWQgZnVuY3Rpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSBpbW11dGFibGVDb2xsZWN0aW9ucyAtIFRhc2sgMDA2IHJlY3Vyc2l2ZSBpbW11dGFibGUgbGlzdHMvbWFwcywgdG90YWwgYWNjZXNzLCBhbmQgc2l6ZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gb3B0aW9uYWxWYWx1ZXMgLSBUYXNrIDAwNyBleHBsaWNpdCBvcHRpb25hbCB2YWx1ZXMsIHByZXNlbmNlIHRlc3RzLCBhbmQgZ3VhcmRlZCB1bndyYXAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG9yZGVyZWRMaXN0SXRlcmF0aW9uIC0gVGFzayAwMDggb3JkZXJlZCBpbW11dGFibGUtbGlzdCBpdGVyYXRpb24gYW5kIG5lYXJlc3QtbG9vcCBjb250cm9sLlxuICogQHByb3BlcnR5IHtib29sZWFufSBvcmRlcmVkTWFwSXRlcmF0aW9uIC0gVGFzayAwMTQgaW5zZXJ0aW9uLW9yZGVyZWQgaW1tdXRhYmxlLW1hcCBwYWlyIGl0ZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY29uZGl0aW9uQ29udHJvbGxlZExvb3BzIC0gVGFzayAwMzIgc3RyaWN0LUJvb2xlYW4gcHJlLWNvbmRpdGlvbiBsb29wcyBhbmQgcmVzb2x2ZWQgY29udHJvbC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY29uZGl0aW9uYWxFeHByZXNzaW9ucyAtIFRhc2sgMDQ4IHN0cmljdC1Cb29sZWFuIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zIHdpdGggam9pbmVkIGFybSB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3RyaW5nSW50ZXJwb2xhdGlvbiAtIFRhc2sgMDQ4IHBhcnNlci1wcm92ZWQgc3RyaW5nIGludGVycG9sYXRpb24gbG93ZXJlZCB0byBjaGVja2VkIHN0cmluZyBjb25jYXRlbmF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBjbG9zZWRSZWNvcmRzIC0gVGFzayAwMDkgbm9taW5hbCBjbG9zZWQgaW1tdXRhYmxlIHJlY29yZHMsIGNvbnN0cnVjdGlvbiwgYW5kIG1lbWJlciByZWFkcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdHlwZWRFcnJvcnMgLSBUYXNrIDAxMSBub21pbmFsIHVuY2hlY2tlZCBlcnJvcnMsIHJhaXNlcywgYW5kIGV4YWN0IHR5cGVkIGNhdGNoZXMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3MgLSBUYXNrIDAxMiBpbnZhcmlhbnQgdW5ib3VuZGVkIHR5cGUgcGFyYW1ldGVycyBhbmQgY2xvc2VkIGdlbmVyaWMgYXBwbGljYXRpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSByZWZlcmVuY2VDbGFzc2VzIC0gVGFzayAwMzMgbm9taW5hbCByZWZlcmVuY2UgY2xhc3NlcywgcHJpdmF0ZSBpbnN0YW5jZSBzdGF0ZSwgZXhhY3QgY29uc3RydWN0b3JzLCBhbmQgcmVjZWl2ZXIgbWV0aG9kcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm91bmRlZFN1YnR5cGluZyAtIFRhc2sgMDQ4IG5vbWluYWwgaW50ZXJmYWNlcyB3aXRoIGV4YWN0IGltcGxlbWVudGF0aW9uIGNvbnRyYWN0cyBhbmQgaW1wbGljaXQgdXBjYXN0IChyZXF1aXJlcyByZWZlcmVuY2VDbGFzc2VzKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZWZmZWN0ZnVsQ2FwYWJpbGl0aWVzQW5kUmVzb3VyY2VzIC0gVGFzayAwMzQgYXV0aG9yaXplZCBob3N0IGVmZmVjdHMsIHR5cGVkIGZhaWx1cmVzLCBhbmQgb3duZWQgcmVzb3VyY2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFN0YWJsZSByZWdpc3RyeSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8TGFuZ3VhZ2VSb2xlQ2FwYWJpbGl0aWVzPn0gcm9sZXMgLSBJbmRlcGVuZGVudGx5IHJlZ2lzdGVyZWQgcm9sZXMuXG4gKiBAcHJvcGVydHkge1wic2luZ2xlXCIgfCBcIm11bHRpcGxlXCJ9IGFydGlmYWN0TXVsdGlwbGljaXR5IC0gVGFyZ2V0IGFydGlmYWN0IG11bHRpcGxpY2l0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcm91bmRUcmlwIC0gV2hldGhlciBmcm9udGVuZC9iYWNrZW5kIHJvdW5kLXRyaXAgYWNjZXB0YW5jZSBpcyBkZWNsYXJlZC5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8TGFuZ3VhZ2VGZWF0dXJlQ2FwYWJpbGl0aWVzPn0gZmVhdHVyZXMgLSBTZW1hbnRpYyBmZWF0dXJlIGNhcGFiaWxpdGllcy5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8TGFuZ3VhZ2VNYXBwaW5nQ2FwYWJpbGl0aWVzPn0gbWFwcGluZyAtIE1hcHBpbmcgZm9ybXMuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlQWNjZXB0YW5jZUNhcGFiaWxpdGllcz59IGFjY2VwdGFuY2UgLSBTdGFnZXMgYW5kIHRvb2xjaGFpbnMuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlQ2hlY2tDYXBhYmlsaXRpZXM+fSBjaGVjayAtIE5vbi1leGVjdXRpbmcgZGV2ZWxvcGVyLWNoZWNrIGNhcGFiaWxpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTb3VyY2VQb2ludFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxpbmUgLSBPbmUtYmFzZWQgbGluZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjb2x1bW4gLSBPbmUtYmFzZWQgVVRGLTE2IGNvZGUtdW5pdCBjb2x1bW4uXG4gKiBAcHJvcGVydHkge251bWJlcn0gb2Zmc2V0IC0gWmVyby1iYXNlZCBVVEYtMTYgc291cmNlIG9mZnNldC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNvdXJjZUxvY2F0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZW5hbWUgLSBPcmlnaW5hdGluZyBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlUG9pbnR9IHN0YXJ0IC0gSW5jbHVzaXZlIHN0YXJ0LlxuICogQHByb3BlcnR5IHtTb3VyY2VQb2ludH0gZW5kIC0gRXhjbHVzaXZlIGVuZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlZ2lzdGVyZWRTb3VyY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFJlZ2lzdHJ5LWxvY2FsIGRldGVybWluaXN0aWMgc291cmNlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gT3JpZ2luYWwgZmlsZW5hbWUsIHByZXNlcnZlZCB2ZXJiYXRpbS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gY29udGVudCAtIE9yaWdpbmFsIHNvdXJjZSBjb250ZW50LCBwcmVzZXJ2ZWQgdmVyYmF0aW0gd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTGFuZ3VhZ2UgfCBudWxsfSBsYW5ndWFnZSAtIFBhcnNlciBsYW5ndWFnZSB3aGVuIGtub3duLlxuICogQHByb3BlcnR5IHtcImFwcGxpY2F0aW9uXCIgfCBcImZhY2FkZVwifSBbb3duZXJzaGlwXSAtIENhbGxlciBvciBjb21waWxlci1vd25lZCBzb3VyY2Ugcm9sZSBmb3Igc2VtYW50aWMgcHJvZ3JhbXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTb3VyY2VPcmlnaW5cbiAqIEBwcm9wZXJ0eSB7XCJzb3VyY2VcIn0ga2luZCAtIERpcmVjdCBzb3VyY2UgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VJZCAtIFJlZ2lzdGVyZWQgc291cmNlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCBvcmlnaW5hbCByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlbGF0ZWRPcmlnaW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VJZCAtIFJlZ2lzdGVyZWQgc291cmNlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBSZWxhdGVkIG9yaWdpbmFsIHJhbmdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub2RlSWRdIC0gUmVsYXRlZCBzZW1hbnRpYyBub2RlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzeW1ib2xJZF0gLSBSZWxhdGVkIHNlbWFudGljIHN5bWJvbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9sZV0gLSBSZWxhdGlvbnNoaXAgcm9sZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIERlcml2ZWRPcmlnaW5cbiAqIEBwcm9wZXJ0eSB7XCJkZXJpdmVkXCJ9IGtpbmQgLSBQcm92ZW5hbmNlIGRlcml2ZWQgZnJvbSBvbmUgb3IgbW9yZSBvcmlnaW5zLlxuICogQHByb3BlcnR5IHtSZWxhdGVkT3JpZ2luW119IG9yaWdpbnMgLSBPcmRlcmVkLCBub24tZW1wdHkgb3JpZ2luYWwgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU3ludGhldGljT3JpZ2luXG4gKiBAcHJvcGVydHkge1wic3ludGhldGljXCJ9IGtpbmQgLSBTb3VyY2UtZnJlZSBnZW5lcmF0ZWQgb3Igc2VtYW50aWMgc2NhZmZvbGRpbmcuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVhc29uIC0gU3RhYmxlIGh1bWFuLXJlYWRhYmxlIHJlYXNvbi5cbiAqIEBwcm9wZXJ0eSB7UmVsYXRlZE9yaWdpbltdfSByZWxhdGVkT3JpZ2lucyAtIE9yZGVyZWQgcmVsYXRlZCByYW5nZXMsIHBvc3NpYmx5IGVtcHR5LlxuICovXG5cbi8qKiBAdHlwZWRlZiB7U291cmNlT3JpZ2luIHwgRGVyaXZlZE9yaWdpbiB8IFN5bnRoZXRpY09yaWdpbn0gU2VtYW50aWNPcmlnaW4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRCeXRlUmFuZ2VcbiAqIEBwcm9wZXJ0eSB7e3N0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyfX0gZ2VuZXJhdGVkIC0gSGFsZi1vcGVuIGdlbmVyYXRlZCBieXRlIG9mZnNldHMuXG4gKiBAcHJvcGVydHkge1NlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBTZW1hbnRpYyBvciBleHBsaWNpdCBzeW50aGV0aWMgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9kZUlkXSAtIE9yaWdpbmF0aW5nIHNlbWFudGljIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N5bWJvbElkXSAtIE9yaWdpbmF0aW5nIHNlbWFudGljIHN5bWJvbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9sZV0gLSBTZW1hbnRpYyBvciBiaW5hcnktcmVnaW9uIHJvbGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpZm9sZEJ5dGVNYXBwaW5nXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRCeXRlTWFwcGluZ1wifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIFNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtcImJ5dGVzXCJ9IGNvb3JkaW5hdGVTeXN0ZW0gLSBHZW5lcmF0ZWQgb2Zmc2V0cyBhcmUgYnl0ZXMsIG5ldmVyIHRleHQgY29sdW1ucy5cbiAqIEBwcm9wZXJ0eSB7e3BhdGg6IHN0cmluZywgYnl0ZUxlbmd0aDogbnVtYmVyfX0gZ2VuZXJhdGVkIC0gR2VuZXJhdGVkIGFydGlmYWN0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBHZW5lcmF0ZWRCeXRlUmFuZ2VbXX0gcmFuZ2VzIC0gT3JkZXJlZCBub24tb3ZlcmxhcHBpbmcgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkTm9kZVByb3ZlbmFuY2VcIn0gc2NoZW1hIC0gQXNzb2NpYXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIEFzc29jaWF0aW9uIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBTb3VyY2UgYXNzb2NpYXRpb24gaW5kZXBlbmRlbnQgb2YgdHJhdmVyc2FsIHBvc2l0aW9uLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBTb3VyY2VMb2NhdGlvbj4+fSByYW5nZXMgLSBFeGFjdCBzZW1hbnRpYy10b2tlbiBzdWJyYW5nZXMgYnkgcm9sZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljTm9kZVByb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIEpTT04gUG9pbnRlciBmcm9tIHRoZSBzZW1hbnRpYyBtb2R1bGUgcm9vdC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlW1wia2luZFwiXSB8IFwiVHlwZVJlZmVyZW5jZVwifSBraW5kIC0gU2VtYW50aWMgbm9kZSBraW5kLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gQ2xvc2VkIHByb3ZlbmFuY2UgdmFsdWUuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFNvdXJjZUxvY2F0aW9uPj59IHJhbmdlcyAtIEV4YWN0IHNlbWFudGljLXRva2VuIHN1YnJhbmdlcyBieSByb2xlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzeW1ib2xJZF0gLSBSZXNvbHZlZCBkZWNsYXJlZC9yZWZlcmVuY2VkIHN5bWJvbCBpZGVudGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljU3ltYm9sUmVmZXJlbmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbm9kZUlkIC0gUmVmZXJyaW5nIHNlbWFudGljIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUm9sZX0gcm9sZSAtIFJlZmVyZW5jZSByb2xlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCByZWZlcmVuY2UgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1N5bWJvbFByb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIHN5bWJvbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU2VtYW50aWMgc3ltYm9sIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sS2luZH0ga2luZCAtIFN5bWJvbCBjYXRlZ29yeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbk5vZGVJZCAtIERlY2xhcmluZyBub2RlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZW1hbnRpY0RlY2xhcmF0aW9uSWRdIC0gU3RhYmxlIHNlbWFudGljIGRlY2xhcmF0aW9uIGlkZW50aXR5IGZvciByZWNvcmQsIGZpZWxkLCBhbmQgZnVuY3Rpb24gc3ltYm9scy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRXhhY3QgZGVjbGFyYXRpb24tbmFtZSByYW5nZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xSZWZlcmVuY2VbXX0gcmVmZXJlbmNlcyAtIE9yZGVyZWQgcmVzb2x2ZWQgcmVmZXJlbmNlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkUHJvdmVuYW5jZVwifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIFNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtcInV0ZjE2XCJ9IGNvb3JkaW5hdGVTeXN0ZW0gLSBPZmZzZXQgYW5kIGNvbHVtbiB1bml0LlxuICogQHByb3BlcnR5IHtSZWdpc3RlcmVkU291cmNlW119IHNvdXJjZXMgLSBWZXJzaW9uZWQgc291cmNlIHJlZ2lzdHJ5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVQcm92ZW5hbmNlW119IG5vZGVzIC0gRGV0ZXJtaW5pc3RpYyBub2RlIGluZGV4LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1N5bWJvbFByb3ZlbmFuY2VbXX0gc3ltYm9scyAtIERldGVybWluaXN0aWMgc3ltYm9sIGluZGV4LlxuICovXG5cbi8qKiBAdHlwZWRlZiB7XCJleGFjdFwiIHwgXCJhbmNob3JcIiB8IFwic3ludGhldGljXCJ9IE1hcHBpbmdLaW5kICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWZvbGRNYXBwaW5nU3BhblxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gZ2VuZXJhdGVkIC0gR2VuZXJhdGVkIGhhbGYtb3BlbiByYW5nZS5cbiAqIEBwcm9wZXJ0eSB7TWFwcGluZ0tpbmR9IG1hcHBpbmdLaW5kIC0gTWFwcGluZyBwcmVjaXNpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgb3JpZ2luYWwgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9kZUlkXSAtIFJlbGF0ZWQgY2Fub25pY2FsIHNlbWFudGljIG5vZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N5bWJvbElkXSAtIFJlbGF0ZWQgY2Fub25pY2FsIHNlbWFudGljIHN5bWJvbC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9sZV0gLSBTZW1hbnRpYyB0b2tlbiByb2xlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSAtIFVzZWZ1bCBzeW1ib2wgbmFtZSBmb3IgU291cmNlIE1hcCB2My5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZFNvdXJjZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gT3V0cHV0IGZpbGVuYW1lLlxuICogQHByb3BlcnR5IHtHZW5lcmF0ZWRUZXh0TGFuZ3VhZ2V9IGxhbmd1YWdlIC0gT3V0cHV0IHRleHQgbGFuZ3VhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29udGVudCAtIEV4YWN0IGdlbmVyYXRlZCBMRiBzb3VyY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpZm9sZE1hcHBpbmdcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZE1hcHBpbmdcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBTY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJ1dGYxNlwifSBjb29yZGluYXRlU3lzdGVtIC0gT2Zmc2V0IGFuZCBjb2x1bW4gdW5pdC5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGVkU291cmNlfSBnZW5lcmF0ZWQgLSBHZW5lcmF0ZWQgcHJvZ3JhbSBpZGVudGl0eSBhbmQgY29udGVudC5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gT3JpZ2luYWwgc291cmNlIHJlZ2lzdHJ5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVQcm92ZW5hbmNlW119IG5vZGVzIC0gQ2Fub25pY2FsIHNlbWFudGljIG5vZGUgaW5kZXguXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUHJvdmVuYW5jZVtdfSBzeW1ib2xzIC0gQ2Fub25pY2FsIHNlbWFudGljIHN5bWJvbCBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWZvbGRNYXBwaW5nU3BhbltdfSBzcGFucyAtIE9yZGVyZWQgZ2VuZXJhdGVkIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZEFydGlmYWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29kZSAtIEdlbmVyYXRlZCBvdXRwdXQgcHJvZ3JhbSwgaW5jbHVkaW5nIGFueSByZXF1ZXN0ZWQgZGlyZWN0aXZlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gR2VuZXJhdGVkIG91dHB1dCBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBPdXRwdXQgbGFuZ3VhZ2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIEF1dGhvcml0YXRpdmUgcmljaCBtYXBwaW5nLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJAanJpZGdld2VsbC9nZW4tbWFwcGluZ1wiKS5FbmNvZGVkU291cmNlTWFwfSBzb3VyY2VNYXAgLSBTb3VyY2UgTWFwIHYzIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlTWFwRmlsZW5hbWUgLSBEZWZhdWx0IGV4dGVybmFsIFNvdXJjZSBNYXAgZmlsZW5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUZXh0QXJ0aWZhY3RQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1widGV4dFwifSBraW5kIC0gUmljaCB0ZXh0IHByb3ZlbmFuY2UgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gQXV0aG9yaXRhdGl2ZSByYW5nZSBtYXBwaW5nLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJAanJpZGdld2VsbC9nZW4tbWFwcGluZ1wiKS5FbmNvZGVkU291cmNlTWFwfSBzb3VyY2VNYXAgLSBJbnRlcm9wZXJhYmxlIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NvdXJjZU1hcEZpbGVuYW1lXSAtIExvZ2ljYWwgU291cmNlIE1hcCBzaWRlY2FyIHBhdGguXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCeXRlQXJ0aWZhY3RQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1wiYnl0ZXNcIn0ga2luZCAtIEJ5dGUgcHJvdmVuYW5jZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpZm9sZEJ5dGVNYXBwaW5nfSBtYXBwaW5nIC0gQXV0aG9yaXRhdGl2ZSBieXRlIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFydGlmYWN0U3ludGhldGljUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcInN5bnRoZXRpY1wifSBraW5kIC0gU3ludGhldGljIGFydGlmYWN0IGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVhc29uIC0gRXhwbGljaXQgdGFyZ2V0LXNjYWZmb2xkaW5nIHJlYXNvbi5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgUmVsYXRlZE9yaWdpbltdfSByZWxhdGVkT3JpZ2lucyAtIFJlbGF0ZWQgc2VtYW50aWMgc291cmNlIHJhbmdlcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1RleHRBcnRpZmFjdFByb3ZlbmFuY2UgfCBCeXRlQXJ0aWZhY3RQcm92ZW5hbmNlIHwgQXJ0aWZhY3RTeW50aGV0aWNQcm92ZW5hbmNlfSBBcnRpZmFjdFByb3ZlbmFuY2UgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRTZXRBcnRpZmFjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBVbmlxdWUgc2FmZSByZWxhdGl2ZSBQT1NJWCBwYXRoLlxuICogQHByb3BlcnR5IHtcInRleHRcIiB8IFwiYmluYXJ5XCJ9IGNvbnRlbnRLaW5kIC0gQ29udGVudCByZXByZXNlbnRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudCAtIFRleHQgb3IgYSBkZXRhY2hlZCBjb3B5IG9mIHRoZSBleGFjdCBnZW5lcmF0ZWQgYnl0ZXMgb24gZXZlcnkgYmluYXJ5IHJlYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gQXJ0aWZhY3QgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGVkQXJ0aWZhY3RSb2xlfSByb2xlIC0gQXJ0aWZhY3Qgcm9sZTsgZXhhY3RseSBvbmUgc2V0IGFydGlmYWN0IGlzIGVudHJ5LlxuICogQHByb3BlcnR5IHtcImdlbmVyYXRlZFwifSBvd25lcnNoaXAgLSBUYXNrLTAxNSBvd25lcnNoaXAgY29udHJhY3QuXG4gKiBAcHJvcGVydHkge0FydGlmYWN0UHJvdmVuYW5jZX0gcHJvdmVuYW5jZSAtIFRleHQsIGJ5dGUtcmFuZ2UsIG9yIHN5bnRoZXRpYyBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGVkQXJ0aWZhY3RTZXRcbiAqIEBwcm9wZXJ0eSB7XCJHZW5lcmF0ZWRBcnRpZmFjdFNldFwifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIFNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldCAtIFN0YWJsZSBsYW5ndWFnZSBvciB0YXJnZXQgSUQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZW50cnkgLSBQYXRoIG9mIHRoZSBzb2xlIGRlY2xhcmVkIGVudHJ5IGFydGlmYWN0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBHZW5lcmF0ZWRTZXRBcnRpZmFjdFtdfSBhcnRpZmFjdHMgLSBEZXRlcm1pbmlzdGljIGFydGlmYWN0IG9yZGVyLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj59IFttZXRhZGF0YV0gLSBEZXRhY2hlZCB0YXJnZXQtc3BlY2lmaWMgSlNPTiBtZXRhZGF0YS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFB1YmxpY2F0aW9uQnVpbGRBcnRpZmFjdElucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIE5vcm1hbGl6ZWQgcGF0aCByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0IGJ1aWxkIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gU3RhYmxlIG1lZGlhIHR5cGUgZm9yIHRoZSB2YWxpZGF0b3IvY29tcGlsZXIgb3V0cHV0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJvbGUgLSBTdGFibGUgbGFuZ3VhZ2UtbmV1dHJhbCByb2xlIGZvciB0aGUgdmFsaWRhdG9yL2NvbXBpbGVyIG91dHB1dC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFB1YmxpY2F0aW9uVmFsaWRhdG9yQ29udGV4dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldElkIC0gRXhwbGljaXQgdGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZVBhdGggLSBFeGFjdCBnZW5lcmF0aW9uLXNjb3BlZCBnZW5lcmF0ZWQtc291cmNlIGRpcmVjdG9yeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBidWlsZFBhdGggLSBFeGFjdCBnZW5lcmF0aW9uLXNjb3BlZCBjb21waWxlci1vdXRwdXQgZGlyZWN0b3J5LlxuICovXG5cbi8qKiBAdHlwZWRlZiB7KGNvbnRleHQ6IFJlYWRvbmx5PFB1YmxpY2F0aW9uVmFsaWRhdG9yQ29udGV4dD4pID0+IFByb21pc2U8UHVibGljYXRpb25CdWlsZEFydGlmYWN0SW5wdXRbXSB8IHZvaWQ+IHwgUHVibGljYXRpb25CdWlsZEFydGlmYWN0SW5wdXRbXSB8IHZvaWR9IFB1YmxpY2F0aW9uVmFsaWRhdG9yICovXG5cbi8qKiBAdHlwZWRlZiB7XCJ0ZXh0XCIgfCBcImJpbmFyeVwiIHwgXCJhcHBsaWNhdGlvblwifSBQdWJsaWNhdGlvblRhcmdldFJvbGUgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQdWJsaWNhdGlvblRhcmdldElucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBFeHBsaWNpdCBwcm9qZWN0IHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGVkQXJ0aWZhY3RTZXR9IGFydGlmYWN0U2V0IC0gQ29tcGxldGUgYWxyZWFkeS12YWxpZGF0ZWQgZ2VuZXJhdGVkIGFydGlmYWN0cy5cbiAqIEBwcm9wZXJ0eSB7UHVibGljYXRpb25UYXJnZXRSb2xlfSByb2xlIC0gRXhwbGljaXQgbGFuZ3VhZ2UtbmV1dHJhbCB0YXJnZXQgcm9sZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VQcm9qZWN0aW9uIC0gR2VuZXJhdGlvbi1yZWxhdGl2ZSBnZW5lcmF0ZWQtc291cmNlIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnVpbGRQcm9qZWN0aW9uIC0gR2VuZXJhdGlvbi1yZWxhdGl2ZSBjb21waWxlci1vdXRwdXQgcHJvamVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgUHVibGljYXRpb25WYWxpZGF0b3JbXX0gW3ZhbGlkYXRvcnNdIC0gT3JkZXJlZCBjYW5kaWRhdGUgdmFsaWRhdG9ycy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFB1YmxpY2F0aW9uUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGdlbmVyYXRpb25JZCAtIEV4cGxpY2l0IGdlbmVyYXRpb24vY3ljbGUgaWRlbnRpdHksIGZyZXNoIG9yIGFuIGV4YWN0IHJldGFpbmVkIHZhbGlkYXRvci1mcmVlIGNhbmRpZGF0ZS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgUHVibGljYXRpb25UYXJnZXRJbnB1dFtdfSB0YXJnZXRzIC0gQ29tcGxldGUgb3JkZXJlZCBwcm9qZWN0IHRhcmdldHMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQdWJsaWNhdGlvbk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7QWJvcnRTaWduYWx9IFtzaWduYWxdIC0gQ2FuY2VsbGF0aW9uIGF1dGhvcml0eSB0aHJvdWdoIHRoZSBhY3RpdmUtcG9pbnRlciBjb21taXQgYm91bmRhcnkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0aW9uQ29udGVudEhhc2hcbiAqIEBwcm9wZXJ0eSB7XCJzaGEyNTZcIn0gYWxnb3JpdGhtIC0gSGFzaCBhbGdvcml0aG0uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmFsdWUgLSBMb3dlcmNhc2UgaGV4YWRlY2ltYWwgZGlnZXN0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGlvbkFydGlmYWN0TWFuaWZlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gQXJ0aWZhY3Qtc2V0LXJlbGF0aXZlIHBhdGguXG4gKiBAcHJvcGVydHkge1widGV4dFwiIHwgXCJiaW5hcnlcIn0gY29udGVudEtpbmQgLSBPcmlnaW5hbCBhcnRpZmFjdCBjb250ZW50IHJlcHJlc2VudGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIERlY2xhcmVkIGFydGlmYWN0IG1lZGlhIHR5cGUuXG4gKiBAcHJvcGVydHkge0dlbmVyYXRlZEFydGlmYWN0Um9sZX0gcm9sZSAtIERlY2xhcmVkIGFydGlmYWN0IHJvbGUuXG4gKiBAcHJvcGVydHkge0FydGlmYWN0UHJvdmVuYW5jZX0gcHJvdmVuYW5jZSAtIENvbXBsZXRlIHBlcnNpc3RlZCByaWNoLCBieXRlLCBvciBzeW50aGV0aWMgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBieXRlTGVuZ3RoIC0gRXhhY3Qgc3RhZ2VkIGJ5dGUgbGVuZ3RoLlxuICogQHByb3BlcnR5IHtHZW5lcmF0aW9uQ29udGVudEhhc2h9IGhhc2ggLSBFeGFjdCBzdGFnZWQgYnl0ZSBoYXNoLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGlvbkJ1aWxkQXJ0aWZhY3RNYW5pZmVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBCdWlsZC1wcm9qZWN0aW9uLXJlbGF0aXZlIHBhdGguXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gRGVjbGFyZWQgdmFsaWRhdG9yL2NvbXBpbGVyIG91dHB1dCBtZWRpYSB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJvbGUgLSBEZWNsYXJlZCBsYW5ndWFnZS1uZXV0cmFsIHZhbGlkYXRvci9jb21waWxlciBvdXRwdXQgcm9sZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBieXRlTGVuZ3RoIC0gRXhhY3Qgc3RhZ2VkIGJ5dGUgbGVuZ3RoLlxuICogQHByb3BlcnR5IHtHZW5lcmF0aW9uQ29udGVudEhhc2h9IGhhc2ggLSBFeGFjdCBzdGFnZWQgYnl0ZSBoYXNoLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGlvblRhcmdldE1hbmlmZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBFeHBsaWNpdCBwcm9qZWN0IHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7UHVibGljYXRpb25UYXJnZXRSb2xlfSByb2xlIC0gRXhwbGljaXQgbGFuZ3VhZ2UtbmV1dHJhbCB0YXJnZXQgcm9sZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXQgLSBBcnRpZmFjdC1zZXQgYmFja2VuZCB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3tzb3VyY2U6IHN0cmluZywgYnVpbGQ6IHN0cmluZ319IHByb2plY3Rpb25zIC0gRGlzam9pbnQgZ2VuZXJhdGlvbi1yZWxhdGl2ZSBwcm9qZWN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgR2VuZXJhdGlvbkFydGlmYWN0TWFuaWZlc3RbXX0gYXJ0aWZhY3RzIC0gT3JkZXJlZCBnZW5lcmF0ZWQgYXJ0aWZhY3RzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBHZW5lcmF0aW9uQnVpbGRBcnRpZmFjdE1hbmlmZXN0W119IGJ1aWxkQXJ0aWZhY3RzIC0gT3JkZXJlZCB2YWxpZGF0b3IvY29tcGlsZXIgb3V0cHV0cy5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+fSBbbWV0YWRhdGFdIC0gUGVyc2lzdGVkIHRhcmdldC1zcGVjaWZpYyBhcnRpZmFjdC1zZXQgbWV0YWRhdGEuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0aW9uTWFuaWZlc3RcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZEdlbmVyYXRpb25NYW5pZmVzdFwifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIE1hbmlmZXN0IHNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2plY3RJZCAtIEV4cGxpY2l0IHByb2plY3QgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZ2VuZXJhdGlvbklkIC0gRXhwbGljaXQgZ2VuZXJhdGlvbi9jeWNsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgR2VuZXJhdGlvblRhcmdldE1hbmlmZXN0W119IHRhcmdldHMgLSBDb21wbGV0ZSBvcmRlcmVkIHRhcmdldCByZWNvcmRzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHVibGlzaGVkVGFyZ2V0UGF0aHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIEV4cGxpY2l0IHByb2plY3QgdGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtQdWJsaWNhdGlvblRhcmdldFJvbGV9IHJvbGUgLSBFeHBsaWNpdCBsYW5ndWFnZS1uZXV0cmFsIHRhcmdldCByb2xlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZVBhdGggLSBFeGFjdCBpbW11dGFibGUgZ2VuZXJhdGVkLXNvdXJjZSBkaXJlY3RvcnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnVpbGRQYXRoIC0gRXhhY3QgaW1tdXRhYmxlIGNvbXBpbGVyLW91dHB1dCBkaXJlY3RvcnkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQdWJsaXNoZWRHZW5lcmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZ2VuZXJhdGlvbklkIC0gUmVzb2x2ZWQgZ2VuZXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBnZW5lcmF0aW9uUGF0aCAtIEV4YWN0IGltbXV0YWJsZSBnZW5lcmF0aW9uIGRpcmVjdG9yeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtYW5pZmVzdFBhdGggLSBFeGFjdCBnZW5lcmF0aW9uIG1hbmlmZXN0IHBhdGguXG4gKiBAcHJvcGVydHkge0dlbmVyYXRpb25NYW5pZmVzdH0gbWFuaWZlc3QgLSBWZXJpZmllZCBpbW11dGFibGUgZ2VuZXJhdGlvbiBtYW5pZmVzdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgUHVibGlzaGVkVGFyZ2V0UGF0aHNbXX0gdGFyZ2V0cyAtIEV4YWN0IGdlbmVyYXRpb24tc2NvcGVkIHRhcmdldCBwYXRocy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY2xlYW51cFBlbmRpbmcgLSBXaGV0aGVyIHBvc3QtY29tbWl0IGpvdXJuYWwgY2xlYW51cCByZW1haW5zIGZvciByZWNvdmVyeS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIERpc2NvdmVyZWRUb29sY2hhaW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBJRC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb21tYW5kIC0gRG9jdW1lbnRlZCBjYW5vbmljYWwgY29tbWFuZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleGVjdXRhYmxlIC0gRXhhY3QgYWJzb2x1dGUgZXhlY3V0YWJsZSBwYXRoLlxuICogQHByb3BlcnR5IHtcIm92ZXJyaWRlXCIgfCBcImNhbm9uaWNhbFwifSBzb3VyY2UgLSBSZXNvbHV0aW9uIHJvdXRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBGaXJzdCBzZWxlY3RlZC1zdHJlYW0gdmVyc2lvbiBsaW5lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb25PdXRwdXQgLSBDb21wbGV0ZSBub3JtYWxpemVkIHN0ZG91dCwgb3Igbm9ybWFsaXplZCBzdGRlcnIgd2hlbiBzdGRvdXQgaXMgZW1wdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSB2ZXJzaW9uQXJndW1lbnRzIC0gRXhhY3QgdmVyc2lvbiBhcmd1bWVudCBhcnJheS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFRhcmdldENoZWNrUGF0aEFyZ3VtZW50XG4gKiBAcHJvcGVydHkge251bWJlcn0gaW5kZXggLSBFeGFjdCBhcmd2IGluZGV4IGNvbnRhaW5pbmcgdGhlIHBhdGguXG4gKiBAcHJvcGVydHkge1wic291cmNlXCIgfCBcImJ1aWxkXCJ9IG93bmVyc2hpcCAtIENhbmRpZGF0ZSBzdWJ0cmVlIHRoYXQgb3ducyB0aGUgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHJlZml4XSAtIEV4YWN0IG5vbi1wYXRoIGFyZ3YgcHJlZml4IHByZWNlZGluZyBhbiBvd25lZCBhYnNvbHV0ZSBwYXRoLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVGFyZ2V0Q2hlY2tFbnZpcm9ubWVudFBhdGhcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gRXhhY3QgZW52aXJvbm1lbnQgdmFyaWFibGUgY29udGFpbmluZyBhbiBvd25lZCBhYnNvbHV0ZSBwYXRoLlxuICogQHByb3BlcnR5IHtcInNvdXJjZVwiIHwgXCJidWlsZFwiIHwgXCJ0b29sXCJ9IG93bmVyc2hpcCAtIENhbmRpZGF0ZSBzdWJ0cmVlIG9yIGRpc2NvdmVyZWQgdG9vbCB0aGF0IG93bnMgdGhlIHBhdGguXG4gKiBAcHJvcGVydHkge0Rpc2NvdmVyZWRUb29sY2hhaW59IFt0b29sXSAtIEV4YWN0IHRvb2wgZXhlY3V0YWJsZSBib3VuZCBieSBhIHRvb2wtb3duZWQgZW52aXJvbm1lbnQgdmFsdWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUYXJnZXRDaGVja091dHB1dE93bmVyc2hpcFxuICogQHByb3BlcnR5IHtcImJ1aWxkXCJ9IG93bmVyc2hpcCAtIENvbXBpbGVyIG91dHB1dHMgYmVsb25nIG9ubHkgdG8gdGhlIGNhbmRpZGF0ZSBidWlsZCBzdWJ0cmVlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBFeGFjdCBnZW5lcmF0aW9uLXNjb3BlZCBidWlsZCByb290LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhVHlwZSAtIE1lZGlhIHR5cGUgYXNzaWduZWQgdG8gZXZlcnkgcHJvZHVjZWQgcmVndWxhciBmaWxlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJvbGUgLSBMYW5ndWFnZS1uZXV0cmFsIGNvbXBpbGVyLW91dHB1dCByb2xlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVGFyZ2V0Q2hlY2tTdGFnZVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7QWNjZXB0YW5jZVN0YWdlfSBzdGFnZSAtIERlY2xhcmVkIG5vbi1leGVjdXRpbmcgYWNjZXB0YW5jZSBzdGFnZS5cbiAqIEBwcm9wZXJ0eSB7RGlzY292ZXJlZFRvb2xjaGFpbn0gdG9vbCAtIEV4YWN0IGltbXV0YWJsZSBkaXNjb3ZlcmVkIHRvb2wgcmVjb3JkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4ZWN1dGFibGUgLSBFeGFjdCBleGVjdXRhYmxlIGNvcGllZCBmcm9tIHRoZSB0b29sIHJlY29yZC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IGFyZ3YgLSBFeGFjdCBzaGVsbC1mcmVlIGFyZ3VtZW50IHZlY3Rvci5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgVGFyZ2V0Q2hlY2tQYXRoQXJndW1lbnRbXX0gcGF0aEFyZ3VtZW50cyAtIENvbXBsZXRlIG93bmVyc2hpcCBkZWNsYXJhdGlvbiBmb3IgYXJndiBwYXRocy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjd2QgLSBFeGFjdCBjYW5kaWRhdGUtc2NvcGVkIHdvcmtpbmcgZGlyZWN0b3J5LlxuICogQHByb3BlcnR5IHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pn0gZW52aXJvbm1lbnQgLSBFeGFjdCBkZXRlcm1pbmlzdGljIGVudmlyb25tZW50LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBUYXJnZXRDaGVja0Vudmlyb25tZW50UGF0aFtdfSBlbnZpcm9ubWVudFBhdGhzIC0gT3duZWQgYWJzb2x1dGUgZW52aXJvbm1lbnQgcGF0aHMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGlucHV0SGFzaCAtIFNIQS0yNTYgb2YgZGVjbGFyZWQgcmVzdG9yZSBpbnB1dHMsIG9yIG51bGwgZm9yIHVuY29uZGl0aW9uYWwgc3RhZ2VzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gaW5wdXRzIC0gQ29tcGxldGUgc3RhZ2VkIGFydGlmYWN0IGlucHV0cyByZWFkIGJ5IHRoZSBzdGFnZS5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8VGFyZ2V0Q2hlY2tPdXRwdXRPd25lcnNoaXA+IHwgbnVsbH0gb3V0cHV0IC0gQnVpbGQgb3V0cHV0IG93bmVyc2hpcCwgb3IgbnVsbCBmb3Igbm9uLXByb2R1Y2luZyBjaGVja3MuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSB0cmFuc2llbnRQYXRocyAtIENhbmRpZGF0ZSBzb3VyY2UvYnVpbGQgY2FjaGUgb3IgaW50ZXJtZWRpYXRlIGRpcmVjdG9yaWVzIHJlbW92ZWQgYWZ0ZXIgY2hlY2tpbmcuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUYXJnZXRDaGVja1BsYW5cbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZFRhcmdldENoZWNrUGxhblwifSBzY2hlbWEgLSBQbGFuIHNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gUGxhbiBzY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJkZXZlbG9wZXItY2hlY2tcIn0gbW9kZSAtIE5vbi1leGVjdXRpbmcgZGV2ZWxvcGVyLWNoZWNrIG1vZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvamVjdElkIC0gRXhhY3QgcHJvamVjdCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXRJZCAtIEV4YWN0IHByb2plY3QgdGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldCAtIFJlZ2lzdGVyZWQgYmFja2VuZCB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlUGF0aCAtIEV4YWN0IHN0YWdlZCBnZW5lcmF0ZWQtc291cmNlIHJvb3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnVpbGRQYXRoIC0gRXhhY3Qgc3RhZ2VkIGNvbXBpbGVyLW91dHB1dCByb290LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gYXJ0aWZhY3RQYXRocyAtIEV4YWN0IHN0YWdlZCBhcnRpZmFjdCBwYXRocy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgVGFyZ2V0Q2hlY2tTdGFnZVJlcXVlc3RbXX0gc3RhZ2VzIC0gT3JkZXJlZCB0YXJnZXQtb3duZWQgcmVxdWVzdHMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUYXJnZXRDaGVja1N0YWdlUmVzdWx0XG4gKiBAcHJvcGVydHkge0FjY2VwdGFuY2VTdGFnZX0gc3RhZ2UgLSBDb21wbGV0ZWQgc3RhZ2UgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PHtjb21tYW5kOiBzdHJpbmcsIGV4ZWN1dGFibGU6IHN0cmluZywgaWQ6IHN0cmluZywgc291cmNlOiBcIm92ZXJyaWRlXCIgfCBcImNhbm9uaWNhbFwiLCB2ZXJzaW9uOiBzdHJpbmd9Pn0gdG9vbCAtIEV4YWN0IHRvb2wgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSBhcmd2IC0gRXhhY3QgZXhlY3V0ZWQgYXJndW1lbnQgdmVjdG9yLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGV4aXRDb2RlIC0gU3VjY2Vzc2Z1bCBwcm9jZXNzIGV4aXQgY29kZS5cbiAqIEBwcm9wZXJ0eSB7bnVsbH0gc2lnbmFsIC0gU3VjY2Vzc2Z1bCBwcm9jZXNzIHNpZ25hbCBzdGF0ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGRvdXQgLSBCb3VuZGVkIGNhcHR1cmVkIHN0YW5kYXJkIG91dHB1dC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGRlcnIgLSBCb3VuZGVkIGNhcHR1cmVkIHN0YW5kYXJkIGVycm9yLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGR1cmF0aW9uTXMgLSBOb24tbmVnYXRpdmUgc3RhZ2UgZHVyYXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUYXJnZXRDaGVja1Jlc3VsdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2plY3RJZCAtIEV4YWN0IHByb2plY3QgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0SWQgLSBFeGFjdCBwcm9qZWN0IHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXQgLSBSZWdpc3RlcmVkIGJhY2tlbmQgdGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBUYXJnZXRDaGVja1N0YWdlUmVzdWx0W119IHN0YWdlcyAtIE9yZGVyZWQgc3VjY2Vzc2Z1bCBzdGFnZSBldmlkZW5jZS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgUHVibGljYXRpb25CdWlsZEFydGlmYWN0SW5wdXRbXX0gb3V0cHV0cyAtIENvbXBsZXRlIGNvbXBpbGVyLW93bmVkIGJ1aWxkIGZpbGVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQWNjZXB0YW5jZVN0YWdlUmVzdWx0XG4gKiBAcHJvcGVydHkge0FjY2VwdGFuY2VTdGFnZX0gc3RhZ2UgLSBDb21wbGV0ZWQgc3RhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXhlY3V0YWJsZSAtIEV4YWN0IGV4ZWN1dGFibGUgdXNlZC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IGFyZ3VtZW50cyAtIEV4YWN0IGFyZ3VtZW50IGFycmF5IHVzZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbiAtIERpc2NvdmVyZWQgdG9vbCB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0ZG91dCAtIENhcHR1cmVkIHN0YW5kYXJkIG91dHB1dC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGRlcnIgLSBDYXB0dXJlZCBzdGFuZGFyZCBlcnJvci5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFjY2VwdGFuY2VSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXQgLSBUYXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGlyZWN0b3J5IC0gUmVtb3ZlZCBpc29sYXRlZCBwcm9qZWN0IGRpcmVjdG9yeSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgQWNjZXB0YW5jZVN0YWdlUmVzdWx0W119IHN0YWdlcyAtIE9yZGVyZWQgY29tcGxldGVkIHN0YWdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFR5cGVSZWZlcmVuY2VcbiAqIEBwcm9wZXJ0eSB7XCJUeXBlUmVmZXJlbmNlXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZU5hbWV9IG5hbWUgLSBOb3JtYWxpemVkIHNjYWxhciB2YWx1ZSB0eXBlIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlIHRoYXQgc3Vydml2ZXMgc2VtYW50aWMgdHJhbnNmb3Jtcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFR5cGVQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7XCJUeXBlUGFyYW1ldGVyXCJ9IGtpbmQgLSBEZWNsYXJhdGlvbi1zY29wZWQgaW52YXJpYW50IHVuYm91bmRlZCB0eXBlIHBhcmFtZXRlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIGRlY2xhcmF0aW9uLXNjb3BlZCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU291cmNlLXZpc2libGUgdHlwZSBwYXJhbWV0ZXIgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gUGFyc2VyLW93bmVkIGRlY2xhcmF0aW9uIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgZGVjbGFyYXRpb24tbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFR5cGVWYXJpYWJsZVJlZmVyZW5jZVxuICogQHByb3BlcnR5IHtcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwifSBraW5kIC0gUmVmZXJlbmNlIHRvIG9uZSBkZWNsYXJhdGlvbi1zY29wZWQgdHlwZSBwYXJhbWV0ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGFyYW1ldGVySWQgLSBTdGFibGUgcmVmZXJlbmNlZCB0eXBlLXBhcmFtZXRlciBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gUGFyc2VyLW93bmVkIHJlZmVyZW5jZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExpc3RUeXBlXG4gKiBAcHJvcGVydHkge1wiTGlzdFR5cGVcIn0ga2luZCAtIFJlY3Vyc2l2ZSBsaXN0LXR5cGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGV9IGVsZW1lbnRUeXBlIC0gSG9tb2dlbmVvdXMgZWxlbWVudCB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3V0ZXIgYW5kIGFyZ3VtZW50IHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1hcFR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJNYXBUeXBlXCJ9IGtpbmQgLSBSZWN1cnNpdmUgbWFwLXR5cGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7VHlwZVJlZmVyZW5jZX0ga2V5VHlwZSAtIEV4YWN0IHN0cmluZyBrZXkgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGV9IHZhbHVlVHlwZSAtIEhvbW9nZW5lb3VzIHZhbHVlIHR5cGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBvdXRlciBhbmQgYXJndW1lbnQgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3JkZXJlZE1hcFR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJPcmRlcmVkTWFwVHlwZVwifSBraW5kIC0gRGlzdGluY3QgaW5zZXJ0aW9uLW9yZGVyZWQgbWFwLXR5cGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7VHlwZVJlZmVyZW5jZX0ga2V5VHlwZSAtIEV4YWN0IHN1cHBvcnRlZCBzdHJpbmcga2V5IHR5cGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB2YWx1ZVR5cGUgLSBIb21vZ2VuZW91cyB2YWx1ZSB0eXBlLlxuICogQHByb3BlcnR5IHtcImluc2VydGlvblwifSBvcmRlciAtIENhbm9uaWNhbCBmaXJzdC1pbnNlcnRpb24gZW5jb3VudGVyIG9yZGVyLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3V0ZXIgYW5kIGFyZ3VtZW50IHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9wdGlvbmFsVHlwZVxuICogQHByb3BlcnR5IHtcIk9wdGlvbmFsVHlwZVwifSBraW5kIC0gRXhwbGljaXQgcHJlc2VuY2UvYWJzZW5jZSB0eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB2YWx1ZVR5cGUgLSBFeGFjdCBwcmVzZW50LXZhbHVlIHR5cGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBvdXRlciBhbmQgY29uc3RpdHVlbnQgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVjb3JkVHlwZVxuICogQHByb3BlcnR5IHtcIlJlY29yZFR5cGVcIn0ga2luZCAtIE5vbWluYWwgcmVjb3JkLXR5cGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIG1vZHVsZS1sb2NhbCByZWNvcmQgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlW119IFthcmd1bWVudHNdIC0gRXhhY3QgaW52YXJpYW50IHR5cGUgYXJndW1lbnRzOyByZXF1aXJlZCBmb3IgZ2VuZXJpYyBkZWNsYXJhdGlvbnMgYW5kIGFic2VudCBmb3Igbm9uLWdlbmVyaWMgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHlwZS1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRXJyb3JUeXBlXG4gKiBAcHJvcGVydHkge1wiRXJyb3JUeXBlXCJ9IGtpbmQgLSBOb21pbmFsIHVuY2hlY2tlZC1lcnJvciB0eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBlcnJvciBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlZmVyZW5jZVR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJSZWZlcmVuY2VUeXBlXCJ9IGtpbmQgLSBOb21pbmFsIHJlZmVyZW5jZS1jbGFzcyB0eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgY2xhc3MgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPd25lZFJlc291cmNlVHlwZVxuICogQHByb3BlcnR5IHtcIk93bmVkUmVzb3VyY2VUeXBlXCJ9IGtpbmQgLSBDb21waWxlci1vd25lZCBsaW5lYXIgcmVzb3VyY2UgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZXNvdXJjZUlkIC0gRXhhY3QgYXV0aG9yaXR5IHJlc291cmNlIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHlwZS1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3duZWRSZWZlcmVuY2VUeXBlXG4gKiBAcHJvcGVydHkge1wiT3duZWRSZWZlcmVuY2VUeXBlXCJ9IGtpbmQgLSBMaW5lYXIgcmVmZXJlbmNlIHRoYXQgb3ducyBvbmUgcHJvdGVjdGVkIHJlc291cmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBFeGFjdCBvd25lZCBjbGFzcyBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEludGVyZmFjZVR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJJbnRlcmZhY2VUeXBlXCJ9IGtpbmQgLSBOb21pbmFsIGJvdW5kZWQtc3VidHlwaW5nIGludGVyZmFjZSB0eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgaW50ZXJmYWNlIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHlwZS1uYW1lIHJhbmdlLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7VHlwZVJlZmVyZW5jZSB8IFR5cGVWYXJpYWJsZVJlZmVyZW5jZSB8IExpc3RUeXBlIHwgTWFwVHlwZSB8IE9yZGVyZWRNYXBUeXBlIHwgT3B0aW9uYWxUeXBlIHwgUmVjb3JkVHlwZSB8IFJlZmVyZW5jZVR5cGUgfCBPd25lZFJlc291cmNlVHlwZSB8IE93bmVkUmVmZXJlbmNlVHlwZSB8IEludGVyZmFjZVR5cGV9IFNlbWFudGljVmFsdWVUeXBlICovXG4vKiogQHR5cGVkZWYge1NlbWFudGljVmFsdWVUeXBlIHwgRXJyb3JUeXBlfSBTZW1hbnRpY0JpbmRpbmdUeXBlICovXG5cbi8qKlxuICogQHR5cGVkZWYgRnVuY3Rpb25SZXR1cm5UeXBlUmVmZXJlbmNlXG4gKiBAcHJvcGVydHkge1wiVHlwZVJlZmVyZW5jZVwifSBraW5kIC0gVm9pZCByZXR1cm4gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7XCJ2b2lkXCJ9IG5hbWUgLSBOb3JtYWxpemVkIG5vbi12YWx1ZSBmdW5jdGlvbiByZXR1cm4uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlIHRoYXQgc3Vydml2ZXMgc2VtYW50aWMgdHJhbnNmb3Jtcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1NlbWFudGljVmFsdWVUeXBlIHwgRnVuY3Rpb25SZXR1cm5UeXBlUmVmZXJlbmNlfSBTZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZSAqL1xuXG4vKiogQHR5cGVkZWYge1NlbWFudGljVHlwZU5hbWUgfCB7a2luZDogXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIiwgcGFyYW1ldGVySWQ6IHN0cmluZ30gfCB7a2luZDogXCJMaXN0VHlwZVwiLCBlbGVtZW50VHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHl9IHwge2tpbmQ6IFwiTWFwVHlwZVwiLCBrZXlUeXBlOiBTZW1hbnRpY1R5cGVJZGVudGl0eSwgdmFsdWVUeXBlOiBTZW1hbnRpY1R5cGVJZGVudGl0eX0gfCB7a2luZDogXCJPcmRlcmVkTWFwVHlwZVwiLCBrZXlUeXBlOiBTZW1hbnRpY1R5cGVJZGVudGl0eSwgdmFsdWVUeXBlOiBTZW1hbnRpY1R5cGVJZGVudGl0eSwgb3JkZXI6IFwiaW5zZXJ0aW9uXCJ9IHwge2tpbmQ6IFwiT3B0aW9uYWxUeXBlXCIsIHZhbHVlVHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHl9IHwge2tpbmQ6IFwiUmVjb3JkVHlwZVwiLCBkZWNsYXJhdGlvbklkOiBzdHJpbmcsIGFyZ3VtZW50cz86IFNlbWFudGljVHlwZUlkZW50aXR5W119IHwge2tpbmQ6IFwiUmVmZXJlbmNlVHlwZVwiLCBkZWNsYXJhdGlvbklkOiBzdHJpbmd9IHwge2tpbmQ6IFwiT3duZWRSZXNvdXJjZVR5cGVcIiwgcmVzb3VyY2VJZDogc3RyaW5nfSB8IHtraW5kOiBcIk93bmVkUmVmZXJlbmNlVHlwZVwiLCBkZWNsYXJhdGlvbklkOiBzdHJpbmd9IHwge2tpbmQ6IFwiSW50ZXJmYWNlVHlwZVwiLCBkZWNsYXJhdGlvbklkOiBzdHJpbmd9fSBTZW1hbnRpY1R5cGVJZGVudGl0eSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1R5cGVJZGVudGl0eSB8IFwidm9pZFwifSBGdW5jdGlvblJldHVyblR5cGVJZGVudGl0eSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlc29sdmVkRnVuY3Rpb25TaWduYXR1cmVcbiAqIEBwcm9wZXJ0eSB7XCJSZXNvbHZlZEZ1bmN0aW9uU2lnbmF0dXJlXCJ9IGtpbmQgLSBSZXNvbHV0aW9uIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVJZGVudGl0eVtdfSBwYXJhbWV0ZXJUeXBlcyAtIEV4YWN0IHJlcXVpcmVkIHBvc2l0aW9uYWwgcGFyYW1ldGVyIHR5cGVzLlxuICogQHByb3BlcnR5IHtGdW5jdGlvblJldHVyblR5cGVJZGVudGl0eX0gcmV0dXJuVHlwZSAtIEV4YWN0IHJlc29sdmVkIHJldHVybiB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVJZGVudGl0eVtdfSBbdHlwZUFyZ3VtZW50c10gLSBJbmZlcnJlZCBkZWNsYXJhdGlvbi1vcmRlciB0eXBlIGFyZ3VtZW50cyBmb3IgYSBnZW5lcmljIGNhbGwuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7XCJQYXJhbWV0ZXJcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gUGFyYW1ldGVyIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gUGFyYW1ldGVyIHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXNvbHZlZEVmZmVjdE9wZXJhdGlvblNpZ25hdHVyZVxuICogQHByb3BlcnR5IHtcIlJlc29sdmVkRWZmZWN0T3BlcmF0aW9uU2lnbmF0dXJlXCJ9IGtpbmQgLSBSZXNvbHV0aW9uIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2FwYWJpbGl0eUlkIC0gRXhhY3QgY2FwYWJpbGl0eSBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcGVyYXRpb25JZCAtIEV4YWN0IG9wZXJhdGlvbiBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlSWRlbnRpdHlbXX0gcGFyYW1ldGVyVHlwZXMgLSBFeGFjdCBvcmRlcmVkIHBhcmFtZXRlciB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHl9IHJldHVyblR5cGUgLSBFeGFjdCBvcGVyYXRpb24gcmVzdWx0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBlZmZlY3RzIC0gQ2xvc2VkIGluaXRpYWwgZWZmZWN0IHNldC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGZhaWx1cmVJZHMgLSBFeGFjdCBvcmRlcmVkIGRlY2xhcmVkIGZhaWx1cmVzLlxuICogQHByb3BlcnR5IHtFZmZlY3RSZXNvdXJjZUZsb3d9IHJlc291cmNlRmxvdyAtIEV4YWN0IG93bmVyc2hpcCB0cmFuc2l0aW9uLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3duZWRNb3ZlRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIk93bmVkTW92ZUV4cHJlc3Npb25cIn0ga2luZCAtIEV4cGxpY2l0IGxpbmVhciBvd25lcnNoaXAgdHJhbnNmZXIuXG4gKiBAcHJvcGVydHkge0lkZW50aWZpZXJFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gTW92ZWQgb3duZXIuXG4gKiBAcHJvcGVydHkge093bmVkUmVzb3VyY2VUeXBlIHwgT3duZWRSZWZlcmVuY2VUeXBlfSB0eXBlIC0gRXhhY3Qgb3duZWQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRXhhY3QgdHJhbnNmZXIgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIERlcml2ZWQgc291cmNlIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPd25lZEJvcnJvd0V4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJPd25lZEJvcnJvd0V4cHJlc3Npb25cIn0ga2luZCAtIEltbWVkaWF0ZSBub25lc2NhcGluZyByZXNvdXJjZSBib3Jyb3cuXG4gKiBAcHJvcGVydHkge1wic2hhcmVkXCIgfCBcImV4Y2x1c2l2ZVwifSBtb2RlIC0gQm9ycm93IG1vZGUuXG4gKiBAcHJvcGVydHkge0lkZW50aWZpZXJFeHByZXNzaW9uIHwgUmVjZWl2ZXJFeHByZXNzaW9uIHwgUHJpdmF0ZUZpZWxkUmVhZH0gZXhwcmVzc2lvbiAtIEJvcnJvd2VkIHBsYWNlLlxuICogQHByb3BlcnR5IHtPd25lZFJlc291cmNlVHlwZSB8IE93bmVkUmVmZXJlbmNlVHlwZX0gdHlwZSAtIEV4YWN0IG93bmVkIHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IGJvcnJvdyBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gRGVyaXZlZCBzb3VyY2UgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdENhbGxFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiRWZmZWN0Q2FsbEV4cHJlc3Npb25cIn0ga2luZCAtIENvbXBpbGVyLWF1dGhvcml6ZWQgZWZmZWN0IGludm9jYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uIC0gRXhhY3Qgb3BlcmF0aW9uIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGFyZ3VtZW50cyAtIFNvdXJjZS1vcmRlcmVkIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlZmZlY3RTaXRlSWQgLSBEZXRlcm1pbmlzdGljIHNlbWFudGljIGV2YWx1YXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1Jlc29sdmVkRWZmZWN0T3BlcmF0aW9uU2lnbmF0dXJlfSByZXNvbHV0aW9uIC0gQ29tcGxldGUgYXV0aG9yaXR5IHJlc29sdXRpb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNhbGwgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBvcGVyYXRpb24tbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdFBhcmFtZXRlclxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTdGFibGUgcGFyYW1ldGVyIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhhY3Qgb3JkZXJlZCBwYXJhbWV0ZXIgdHlwZS5cbiAqL1xuXG4vKiogQHR5cGVkZWYge3traW5kOiBcIm5vbmVcIn0gfCB7a2luZDogXCJhY3F1aXJlXCIsIHJlc291cmNlSWQ6IHN0cmluZ30gfCB7a2luZDogXCJib3Jyb3dcIiB8IFwiY2xvc2VcIiwgcGFyYW1ldGVySW5kZXg6IG51bWJlciwgdGVybWluYWxGYWlsdXJlSWQ6IHN0cmluZ319IEVmZmVjdFJlc291cmNlRmxvdyAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdFJlc291cmNlRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uXCJ9IGtpbmQgLSBDYXBhYmlsaXR5IHJlc291cmNlIGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBhdXRob3JpdHktbG9jYWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIG5vbWluYWwgcmVzb3VyY2UgbmFtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdEZhaWx1cmVEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkVmZmVjdEZhaWx1cmVEZWNsYXJhdGlvblwifSBraW5kIC0gQ2FwYWJpbGl0eSBmYWlsdXJlIGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBhdXRob3JpdHktbG9jYWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIG5vbWluYWwgZmFpbHVyZSBuYW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFZmZlY3RPcGVyYXRpb25EZWNsYXJhdGlvblwifSBraW5kIC0gQ29tcGlsZXItYXV0aG9yaXplZCBvcGVyYXRpb24gZGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBEZXRlcm1pbmlzdGljIGF1dGhvcml0eS1sb2NhbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU291cmNlLXZpc2libGUgb3BlcmF0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge0VmZmVjdFBhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gRXhhY3QgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gcmV0dXJuVHlwZSAtIEV4YWN0IHJlc3VsdCB0eXBlLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBlZmZlY3RzIC0gQ2xvc2VkIGluaXRpYWwgZWZmZWN0IHNldC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGZhaWx1cmVJZHMgLSBPcmRlcmVkIG5vbWluYWwgZmFpbHVyZSBpZGVudGl0aWVzLlxuICogQHByb3BlcnR5IHtFZmZlY3RSZXNvdXJjZUZsb3d9IHJlc291cmNlRmxvdyAtIEV4YWN0IG93bmVyc2hpcCB0cmFuc2l0aW9uLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiRWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uXCJ9IGtpbmQgLSBBdXRob3JpemVkIGNhcGFiaWxpdHkgZGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdXRob3JpdHlJZCAtIE9wYXF1ZSBhdXRob3JpdHkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIENhcGFiaWxpdHkgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbltdfSByZXNvdXJjZXMgLSBPcmRlcmVkIHJlc291cmNlcy5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0RmFpbHVyZURlY2xhcmF0aW9uW119IGZhaWx1cmVzIC0gT3JkZXJlZCBmYWlsdXJlcy5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb25bXX0gb3BlcmF0aW9ucyAtIE9yZGVyZWQgb3BlcmF0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENhcGFiaWxpdHlBdXRob3JpdHlcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZENhcGFiaWxpdHlBdXRob3JpdHlcIn0gc2NoZW1hIC0gQXV0aG9yaXR5IHNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxIHwgMn0gc2NoZW1hVmVyc2lvbiAtIEF1dGhvcml0eSBwYXlsb2FkIHZlcnNpb24sIG5vdCBhIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIE9wYXF1ZSBjYWxsZXItc3VwcGxpZWQgYXV0aG9yaXR5IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gY2FwYWJpbGl0aWVzIC0gTm9ybWFsaXplZCBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbnRyYWN0VmVyc2lvbl0gLSBEZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0IHZlcnNpb24sIHByZXNlbnQgb25seSB3aGVuIHRoZSBjYWxsZXIgc3VwcGxpZWQgb25lLlxuICogQHByb3BlcnR5IHt7aWRlbnRpdHk6IHN0cmluZywgY29udHJhY3RWZXJzaW9uOiBzdHJpbmcsIGNhcGFiaWxpdGllczogRWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uW119W119IFttb2R1bGVzXSAtIFNjaGVtYS12MiBjYW5vbmljYWwgbW9kdWxlIGF1dGhvcml0aWVzLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7e21vZHVsZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fSBDYXBhYmlsaXR5RGVjbGFyYXRpb25SZWZlcmVuY2VJbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7bmFtZTogc3RyaW5nLCB0eXBlOiBTZW1hbnRpY1R5cGVOYW1lIHwge2tpbmQ6IFwiT3duZWRSZXNvdXJjZVR5cGVcIiwgcmVzb3VyY2U6IHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0fSB8IHtraW5kOiBcIk9wdGlvbmFsVHlwZVwiLCB2YWx1ZVR5cGU6IFNlbWFudGljVHlwZU5hbWV9fX0gQ2FwYWJpbGl0eVBhcmFtZXRlcklucHV0ICovXG4vKiogQHR5cGVkZWYge3tuYW1lOiBzdHJpbmd9fSBDYXBhYmlsaXR5TmFtZWRJbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7a2luZDogXCJub25lXCJ9IHwge2tpbmQ6IFwiYWNxdWlyZVwiLCByZXNvdXJjZTogc3RyaW5nIHwgQ2FwYWJpbGl0eURlY2xhcmF0aW9uUmVmZXJlbmNlSW5wdXR9IHwge2tpbmQ6IFwiYm9ycm93XCIgfCBcImNsb3NlXCIsIHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHRlcm1pbmFsRmFpbHVyZTogc3RyaW5nIHwgQ2FwYWJpbGl0eURlY2xhcmF0aW9uUmVmZXJlbmNlSW5wdXR9fSBDYXBhYmlsaXR5UmVzb3VyY2VGbG93SW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e25hbWU6IHN0cmluZywgcGFyYW1ldGVyczogQ2FwYWJpbGl0eVBhcmFtZXRlcklucHV0W10sIHJldHVyblR5cGU6IEZ1bmN0aW9uUmV0dXJuVHlwZU5hbWUgfCB7a2luZDogXCJPd25lZFJlc291cmNlVHlwZVwiLCByZXNvdXJjZTogc3RyaW5nIHwgQ2FwYWJpbGl0eURlY2xhcmF0aW9uUmVmZXJlbmNlSW5wdXR9IHwge2tpbmQ6IFwiT3B0aW9uYWxUeXBlXCIsIHZhbHVlVHlwZTogU2VtYW50aWNUeXBlTmFtZX0sIGVmZmVjdHM6IFtcImhvc3RcIl0sIGZhaWx1cmVzOiAoc3RyaW5nIHwgQ2FwYWJpbGl0eURlY2xhcmF0aW9uUmVmZXJlbmNlSW5wdXQpW10sIHJlc291cmNlRmxvdzogQ2FwYWJpbGl0eVJlc291cmNlRmxvd0lucHV0fX0gQ2FwYWJpbGl0eU9wZXJhdGlvbklucHV0ICovXG4vKiogQHR5cGVkZWYge3tuYW1lOiBzdHJpbmcsIHJlc291cmNlczogQ2FwYWJpbGl0eU5hbWVkSW5wdXRbXSwgZmFpbHVyZXM6IENhcGFiaWxpdHlOYW1lZElucHV0W10sIG9wZXJhdGlvbnM6IENhcGFiaWxpdHlPcGVyYXRpb25JbnB1dFtdfX0gQ2FwYWJpbGl0eURlY2xhcmF0aW9uSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e2lkZW50aXR5OiBzdHJpbmcsIGNvbnRyYWN0VmVyc2lvbjogc3RyaW5nLCBjYXBhYmlsaXRpZXM6IENhcGFiaWxpdHlEZWNsYXJhdGlvbklucHV0W119fSBDYXBhYmlsaXR5QXV0aG9yaXR5TW9kdWxlSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e3NjaGVtYTogXCJTZW1hbnRpZm9sZENhcGFiaWxpdHlBdXRob3JpdHlcIiwgc2NoZW1hVmVyc2lvbjogMSwgaWQ6IHN0cmluZywgY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXR5RGVjbGFyYXRpb25JbnB1dFtdLCBjb250cmFjdFZlcnNpb24/OiBzdHJpbmd9IHwge3NjaGVtYTogXCJTZW1hbnRpZm9sZENhcGFiaWxpdHlBdXRob3JpdHlcIiwgc2NoZW1hVmVyc2lvbjogMiwgaWQ6IHN0cmluZywgbW9kdWxlczogQ2FwYWJpbGl0eUF1dGhvcml0eU1vZHVsZUlucHV0W119fSBDYXBhYmlsaXR5QXV0aG9yaXR5SW5wdXQgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMaXN0TGl0ZXJhbFxuICogQHByb3BlcnR5IHtcIkxpc3RMaXRlcmFsXCJ9IGtpbmQgLSBPcmRlcmVkIGltbXV0YWJsZSBsaXN0IGxpdGVyYWwuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb25bXX0gZWxlbWVudHMgLSBTb3VyY2Utb3JkZXJlZCwgZHVwbGljYXRlLXByZXNlcnZpbmcgZWxlbWVudHMuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBNYXBFbnRyeVxuICogQHByb3BlcnR5IHtcIk1hcEVudHJ5XCJ9IGtpbmQgLSBTb3VyY2Utb3JkZXJlZCBtYXAgaW5pdGlhbGl6ZXIgZW50cnkuXG4gKiBAcHJvcGVydHkge1N0cmluZ0xpdGVyYWx9IGtleSAtIExpdGVyYWwgbm9ubnVtZXJpYyBzdHJpbmcga2V5LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSB2YWx1ZSAtIEVudHJ5IHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWFwTGl0ZXJhbFxuICogQHByb3BlcnR5IHtcIk1hcExpdGVyYWxcIn0ga2luZCAtIEltbXV0YWJsZSBtYXAgbGl0ZXJhbDsgZW50cnkgb3JkZXIgaXMgZGlhZ25vc3RpYy1vbmx5LlxuICogQHByb3BlcnR5IHtNYXBFbnRyeVtdfSBlbnRyaWVzIC0gU291cmNlIGluaXRpYWxpemVyIG9yZGVyLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3JkZXJlZE1hcExpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJPcmRlcmVkTWFwTGl0ZXJhbFwifSBraW5kIC0gSW1tdXRhYmxlIG1hcCBsaXRlcmFsIHdpdGggb2JzZXJ2YWJsZSBmaXJzdC1pbnNlcnRpb24gb3JkZXIuXG4gKiBAcHJvcGVydHkge01hcEVudHJ5W119IGVudHJpZXMgLSBTb3VyY2Utb3JkZXJlZCB1bmlxdWUgZW50cmllcy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgb3JkZXJlZCBjb25zdHJ1Y3Rpb24gYm91bmRhcnkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGlzdEluZGV4RXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkxpc3RJbmRleEV4cHJlc3Npb25cIn0ga2luZCAtIFRvdGFsIHplcm8tYmFzZWQgbGlzdCBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29sbGVjdGlvbiAtIExpc3QtdmFsdWVkIHJlY2VpdmVyLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBpbmRleCAtIEludGVnZXIgaW5kZXguXG4gKiBAcHJvcGVydHkge1wicHJvdmVuXCIgfCBcImZhaWwtb24tYWJzZW5jZVwifSB0b3RhbGl0eSAtIEFkbWlzc2lvbiBiYXNpczsgbmV2ZXIgb3B0aW9uYWwuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBNYXBMb29rdXBFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiTWFwTG9va3VwRXhwcmVzc2lvblwifSBraW5kIC0gVG90YWwgc3RyaW5nLWtleSBtYXAgbG9va3VwLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBjb2xsZWN0aW9uIC0gTWFwLXZhbHVlZCByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0ga2V5IC0gU3RyaW5nIGtleSBleHByZXNzaW9uLlxuICogQHByb3BlcnR5IHtcInByb3ZlblwiIHwgXCJmYWlsLW9uLWFic2VuY2VcIn0gdG90YWxpdHkgLSBBZG1pc3Npb24gYmFzaXM7IG5ldmVyIG9wdGlvbmFsLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ29sbGVjdGlvblNpemVFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiQ29sbGVjdGlvblNpemVFeHByZXNzaW9uXCJ9IGtpbmQgLSBGaW5pdGUgY29sbGVjdGlvbiBzaXplLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBjb2xsZWN0aW9uIC0gTGlzdC0gb3IgbWFwLXZhbHVlZCByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7XCJsaXN0XCIgfCBcIm1hcFwifSBbY29sbGVjdGlvbktpbmRdIC0gVmFsaWRhdGVkIHJlY2VpdmVyIGtpbmQgZm9yIHRhcmdldCBzcGVsbGluZy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIElkZW50aWZpZXJFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiSWRlbnRpZmllckV4cHJlc3Npb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gUmVmZXJlbmNlZCBuYW1lLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSW50ZWdlckxpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJJbnRlZ2VyTGl0ZXJhbFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZhbHVlIC0gSmF2YVNjcmlwdC1zYWZlIGludGVnZXIgdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCb29sZWFuTGl0ZXJhbFxuICogQHByb3BlcnR5IHtcIkJvb2xlYW5MaXRlcmFsXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHZhbHVlIC0gQm9vbGVhbiB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN0cmluZ0xpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJTdHJpbmdMaXRlcmFsXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmFsdWUgLSBVbmljb2RlIHN0cmluZyB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9wdGlvbmFsTm9uZVxuICogQHByb3BlcnR5IHtcIk9wdGlvbmFsTm9uZVwifSBraW5kIC0gQ29udGV4dHVhbGx5IHR5cGVkIGFic2VuY2UgdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbFNvbWVcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbFNvbWVcIn0ga2luZCAtIEV4cGxpY2l0IHByZXNlbnQgb3B0aW9uYWwgdmFsdWUuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IHZhbHVlIC0gRXhhY3Qgbm9uLW9wdGlvbmFsIHByZXNlbnQgdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbElzUHJlc2VudFxuICogQHByb3BlcnR5IHtcIk9wdGlvbmFsSXNQcmVzZW50XCJ9IGtpbmQgLSBQcmVzZW5jZSB0ZXN0IGZvciBvbmUgc2ltcGxlIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkge0lkZW50aWZpZXJFeHByZXNzaW9ufSBvcGVyYW5kIC0gVGVzdGVkIG9wdGlvbmFsIGJpbmRpbmcuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbFVud3JhcFxuICogQHByb3BlcnR5IHtcIk9wdGlvbmFsVW53cmFwXCJ9IGtpbmQgLSBHdWFyZGVkIHVud3JhcCBvZiBvbmUgc2ltcGxlIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkge0lkZW50aWZpZXJFeHByZXNzaW9ufSBvcGVyYW5kIC0gUHJvdmVuLXByZXNlbnQgb3B0aW9uYWwgYmluZGluZy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFVuYXJ5RXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIlVuYXJ5RXhwcmVzc2lvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1VuYXJ5T3BlcmF0aW9ufSBvcGVyYXRpb24gLSBDbG9zZWQgc2VtYW50aWMgb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBvcGVyYW5kIC0gT3BlcmFuZCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVOYW1lfSB0eXBlIC0gRXhwbGljaXQgb3BlcmF0aW9uIHJlc3VsdCB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQmluYXJ5RXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkJpbmFyeUV4cHJlc3Npb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNCaW5hcnlPcGVyYXRpb259IG9wZXJhdGlvbiAtIENsb3NlZCBzZW1hbnRpYyBvcGVyYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGxlZnQgLSBMZWZ0IG9wZXJhbmQuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IHJpZ2h0IC0gUmlnaHQgb3BlcmFuZC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlTmFtZX0gdHlwZSAtIEV4cGxpY2l0IG9wZXJhdGlvbiByZXN1bHQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENvbmRpdGlvbmFsRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBjb25kaXRpb24gLSBTdHJpY3QgYm9vbGVhbiB0ZXN0IGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbnNlcXVlbnQgLSBBcm0gZXZhbHVhdGVkIHdoZW4gdGhlIHRlc3QgaXMgdHJ1ZS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gYWx0ZXJuYXRlIC0gQXJtIGV2YWx1YXRlZCB3aGVuIHRoZSB0ZXN0IGlzIGZhbHNlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVOYW1lfSB0eXBlIC0gSm9pbmVkIGFybSByZXN1bHQgdHlwZSBhc3NpZ25lZCBieSB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ2FsbEV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJDYWxsRXhwcmVzc2lvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNhbGxlZSAtIEZ1bmN0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb25bXX0gYXJndW1lbnRzIC0gUG9zaXRpb25hbCBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge1Jlc29sdmVkRnVuY3Rpb25TaWduYXR1cmV9IFtyZXNvbHV0aW9uXSAtIERldGVybWluaXN0aWMgZGVjbGFyYXRpb24gYW5kIHNpZ25hdHVyZSBiaW5kaW5nLCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlZmZlY3RTaXRlSWRdIC0gRGV0ZXJtaW5pc3RpYyBzaXRlIGlkZW50aXR5IHdoZW4gdGhlIHJlc29sdmVkIGZ1bmN0aW9uIHJlYWNoZXMgYSBob3N0IGVmZmVjdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIHRoaXMgY2FsbC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlc29sdmVkQ29uc3RydWN0b3JTaWduYXR1cmVcbiAqIEBwcm9wZXJ0eSB7XCJSZXNvbHZlZENvbnN0cnVjdG9yU2lnbmF0dXJlXCJ9IGtpbmQgLSBSZXNvbHV0aW9uIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIEV4YWN0IGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVJZGVudGl0eVtdfSBwYXJhbWV0ZXJUeXBlcyAtIEV4YWN0IGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlc29sdmVkTWV0aG9kU2lnbmF0dXJlXG4gKiBAcHJvcGVydHkge1wiUmVzb2x2ZWRNZXRob2RTaWduYXR1cmVcIn0ga2luZCAtIFJlc29sdXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gRXhhY3QgcmVzb2x2ZWQgbWV0aG9kIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVJZGVudGl0eVtdfSBwYXJhbWV0ZXJUeXBlcyAtIEV4YWN0IG1ldGhvZCBwYXJhbWV0ZXIgdHlwZXMuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uUmV0dXJuVHlwZUlkZW50aXR5fSByZXR1cm5UeXBlIC0gRXhhY3QgbWV0aG9kIHJldHVybiB0eXBlLlxuICogQHByb3BlcnR5IHt7a2luZDogXCJwcmVzZXJ2ZVwiIHwgXCJ0ZXJtaW5hbFwiLCB0ZXJtaW5hbEZhaWx1cmVJZD86IHN0cmluZ319IFtyZXNvdXJjZUZsb3ddIC0gT3duZWQgcmVjZWl2ZXIgdHJhbnNpdGlvbiBhbmQgZGVjbGFyZWQgdGVybWluYWwtdXNlIGZhaWx1cmUgd2hlbiBhcHBsaWNhYmxlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVjZWl2ZXJFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiUmVjZWl2ZXJFeHByZXNzaW9uXCJ9IGtpbmQgLSBUaGUgZGVjbGFyaW5nIGNsYXNzIGluc3RhbmNlIHJlY2VpdmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNsYXNzSWQgLSBTdGFibGUgZGVjbGFyaW5nIGNsYXNzIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgcmVjZWl2ZXIgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCByZWNlaXZlciByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlZmVyZW5jZUNvbnN0cnVjdGlvblxuICogQHByb3BlcnR5IHtcIlJlZmVyZW5jZUNvbnN0cnVjdGlvblwifSBraW5kIC0gRnJlc2ggbm9taW5hbCByZWZlcmVuY2UgY29uc3RydWN0aW9uLlxuICogQHByb3BlcnR5IHtSZWZlcmVuY2VUeXBlIHwgT3duZWRSZWZlcmVuY2VUeXBlfSByZWZlcmVuY2UgLSBFeGFjdCBjbGFzcyB0eXBlLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGFyZ3VtZW50cyAtIFNvdXJjZS1vcmRlcmVkIGNvbnN0cnVjdG9yIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7UmVzb2x2ZWRDb25zdHJ1Y3RvclNpZ25hdHVyZX0gW3Jlc29sdXRpb25dIC0gRXhhY3QgY29uc3RydWN0b3IgYmluZGluZywgcmVxdWlyZWQgYWZ0ZXIgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZWZmZWN0U2l0ZUlkXSAtIERldGVybWluaXN0aWMgc2l0ZSBpZGVudGl0eSB3aGVuIGNvbnN0cnVjdGlvbiByZWFjaGVzIGEgaG9zdCBlZmZlY3QuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFtcImhvc3RcIl19IFtlZmZlY3RzXSAtIEluZmVycmVkIGNoZWNrZWQgaG9zdC1lZmZlY3QgZmFjdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtmYWlsdXJlSWRzXSAtIE9yZGVyZWQgY2FwYWJpbGl0eSBmYWlsdXJlcyByZWFjaGFibGUgdGhyb3VnaCBjb25zdHJ1Y3Rpb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNvbnN0cnVjdGlvbiBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGNsYXNzLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBNZXRob2RDYWxsRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIk1ldGhvZENhbGxFeHByZXNzaW9uXCJ9IGtpbmQgLSBSZXNvbHZlZCByZWNlaXZlci1tZXRob2QgaW52b2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gcmVjZWl2ZXIgLSBSZWNlaXZlciBldmFsdWF0ZWQgb25jZSBiZWZvcmUgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1ldGhvZCAtIFN0YWJsZSBtZXRob2QgaWRlbnRpdHkgYWZ0ZXIgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBTb3VyY2Utb3JkZXJlZCBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge1Jlc29sdmVkTWV0aG9kU2lnbmF0dXJlfSBbcmVzb2x1dGlvbl0gLSBFeGFjdCBtZXRob2QgYmluZGluZywgcmVxdWlyZWQgYWZ0ZXIgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZWZmZWN0U2l0ZUlkXSAtIERldGVybWluaXN0aWMgc2l0ZSBpZGVudGl0eSB3aGVuIHRoZSBtZXRob2QgcmVhY2hlcyBhIGhvc3QgZWZmZWN0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBbZWZmZWN0c10gLSBJbmZlcnJlZCBjaGVja2VkIGhvc3QtZWZmZWN0IGZhY3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZmFpbHVyZUlkc10gLSBPcmRlcmVkIGNhcGFiaWxpdHkgZmFpbHVyZXMgcmVhY2hhYmxlIHRocm91Z2ggdGhlIG1ldGhvZC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY2FsbCBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG1ldGhvZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHJpdmF0ZUZpZWxkUmVhZFxuICogQHByb3BlcnR5IHtcIlByaXZhdGVGaWVsZFJlYWRcIn0ga2luZCAtIERlY2xhcmluZy1yZWNlaXZlci1vbmx5IHByaXZhdGUgZmllbGQgcmVhZC5cbiAqIEBwcm9wZXJ0eSB7UmVjZWl2ZXJFeHByZXNzaW9ufSByZWNlaXZlciAtIEV4YWN0IGRlY2xhcmluZyByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWVsZCAtIFN0YWJsZSBwcml2YXRlIGZpZWxkIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSByZWFkIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgZmllbGQtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlY29yZENvbnN0cnVjdGlvblxuICogQHByb3BlcnR5IHtcIlJlY29yZENvbnN0cnVjdGlvblwifSBraW5kIC0gTm9taW5hbCByZWNvcmQgY29uc3RydWN0aW9uLlxuICogQHByb3BlcnR5IHtSZWNvcmRUeXBlfSByZWNvcmQgLSBSZXNvbHZlZCByZWNvcmQgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb25bXX0gYXJndW1lbnRzIC0gQ29tcGxldGUgZmllbGQtb3JkZXJlZCBjb25zdHJ1Y3RvciBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNvbnN0cnVjdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCByZWNvcmQtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1lbWJlclJlYWRcbiAqIEBwcm9wZXJ0eSB7XCJNZW1iZXJSZWFkXCJ9IGtpbmQgLSBOb21pbmFsIGltbXV0YWJsZSByZWNvcmQtZmllbGQgcmVhZC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gcmVjZWl2ZXIgLSBSZWNvcmQtdmFsdWVkIHJlY2VpdmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpZWxkIC0gU3RhYmxlIHJlc29sdmVkIGZpZWxkIGlkZW50aXR5IGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIG1lbWJlci1yZWFkIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG1lbWJlci1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRXJyb3JNZXNzYWdlUmVhZFxuICogQHByb3BlcnR5IHtcIkVycm9yTWVzc2FnZVJlYWRcIn0ga2luZCAtIFRoZSBzb2xlIHBvcnRhYmxlIGVycm9yIG1lbWJlciBvcGVyYXRpb24uXG4gKiBAcHJvcGVydHkge0lkZW50aWZpZXJFeHByZXNzaW9ufSByZWNlaXZlciAtIENhdGNoIGJpbmRpbmcgd2hvc2UgaW1tdXRhYmxlIG1lc3NhZ2UgaXMgcmVhZC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbWVzc2FnZS1yZWFkIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG1lc3NhZ2UtbWVtYmVyIHJhbmdlLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7SWRlbnRpZmllckV4cHJlc3Npb24gfCBSZWNlaXZlckV4cHJlc3Npb24gfCBJbnRlZ2VyTGl0ZXJhbCB8IEJvb2xlYW5MaXRlcmFsIHwgU3RyaW5nTGl0ZXJhbCB8IE9wdGlvbmFsTm9uZSB8IE9wdGlvbmFsU29tZSB8IE9wdGlvbmFsSXNQcmVzZW50IHwgT3B0aW9uYWxVbndyYXAgfCBMaXN0TGl0ZXJhbCB8IE1hcExpdGVyYWwgfCBPcmRlcmVkTWFwTGl0ZXJhbCB8IExpc3RJbmRleEV4cHJlc3Npb24gfCBNYXBMb29rdXBFeHByZXNzaW9uIHwgQ29sbGVjdGlvblNpemVFeHByZXNzaW9uIHwgVW5hcnlFeHByZXNzaW9uIHwgQmluYXJ5RXhwcmVzc2lvbiB8IENvbmRpdGlvbmFsRXhwcmVzc2lvbiB8IENhbGxFeHByZXNzaW9uIHwgRWZmZWN0Q2FsbEV4cHJlc3Npb24gfCBPd25lZE1vdmVFeHByZXNzaW9uIHwgT3duZWRCb3Jyb3dFeHByZXNzaW9uIHwgTWV0aG9kQ2FsbEV4cHJlc3Npb24gfCBSZWZlcmVuY2VDb25zdHJ1Y3Rpb24gfCBSZWNvcmRDb25zdHJ1Y3Rpb24gfCBNZW1iZXJSZWFkIHwgUHJpdmF0ZUZpZWxkUmVhZCB8IEVycm9yTWVzc2FnZVJlYWR9IEV4cHJlc3Npb24gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMb2NhbERlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiTG9jYWxEZWNsYXJhdGlvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBEZWNsYXJlZCBsb2NhbCBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIEV4cGxpY2l0IGxvY2FsIHR5cGUuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG11dGFibGUgLSBXaGV0aGVyIGxhdGVyIGFzc2lnbm1lbnQgaXMgYWxsb3dlZC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gaW5pdGlhbGl6ZXIgLSBSZXF1aXJlZCBpbml0aWFsaXplciBleHByZXNzaW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBEZWNsYXJhdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQXNzaWdubWVudFN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7SWRlbnRpZmllckV4cHJlc3Npb259IHRhcmdldCAtIFNpbXBsZSBsb2NhbCBhc3NpZ25tZW50IHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEFzc2lnbmVkIGV4cHJlc3Npb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEFzc2lnbm1lbnQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcIn0ga2luZCAtIERlY2xhcmluZy1yZWNlaXZlci1vbmx5IHByaXZhdGUgZmllbGQgbXV0YXRpb24uXG4gKiBAcHJvcGVydHkge1JlY2VpdmVyRXhwcmVzc2lvbn0gcmVjZWl2ZXIgLSBFeGFjdCBkZWNsYXJpbmcgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmllbGQgLSBTdGFibGUgcHJpdmF0ZSBmaWVsZCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIE5ldyBmaWVsZCB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQXNzaWdubWVudCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBmaWVsZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmV0dXJuU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUmV0dXJuU3RhdGVtZW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IFtleHByZXNzaW9uXSAtIFJldHVybmVkIGV4cHJlc3Npb247IGFic2VudCBleGFjdGx5IGZvciBhIGJhcmUgdm9pZCByZXR1cm4uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFeHByZXNzaW9uU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiRXhwcmVzc2lvblN0YXRlbWVudFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtDYWxsRXhwcmVzc2lvbiB8IE1ldGhvZENhbGxFeHByZXNzaW9uIHwgRWZmZWN0Q2FsbEV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBBIGRpcmVjdCwgcmVjZWl2ZXIsIG9yIGF1dGhvcml6ZWQgY2FsbCB3aG9zZSByZXNvbHZlZCByZXR1cm4gdHlwZSBpcyB2b2lkLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSWZTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJJZlN0YXRlbWVudFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBjb25kaXRpb24gLSBCcmFuY2ggY29uZGl0aW9uLlxuICogQHByb3BlcnR5IHtCbG9ja30gY29uc2VxdWVudCAtIFRydWUgYnJhbmNoLlxuICogQHByb3BlcnR5IHtCbG9ja30gW2FsdGVybmF0ZV0gLSBGYWxzZSBicmFuY2gsIGFic2VudCB3aGVuIGV4ZWN1dGlvbiBmYWxscyB0aHJvdWdoLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVmFsdWVCaW5kaW5nXG4gKiBAcHJvcGVydHkge1wiVmFsdWVCaW5kaW5nXCJ9IGtpbmQgLSBJdGVyYXRpb24tYmluZGluZyBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBCb2R5LWxvY2FsIGJpbmRpbmcgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNWYWx1ZVR5cGV9IHR5cGUgLSBFeGFjdCBsaXN0IGVsZW1lbnQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7ZmFsc2V9IG11dGFibGUgLSBJdGVyYXRpb24gYmluZGluZ3MgYXJlIGFsd2F5cyBpbW11dGFibGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEJpbmRpbmcgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEZvckVhY2hTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJGb3JFYWNoU3RhdGVtZW50XCJ9IGtpbmQgLSBPcmRlcmVkIGxpc3QtaXRlcmF0aW9uIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIGxvb3AgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGxpc3QgLSBMaXN0IGV4cHJlc3Npb24gZXZhbHVhdGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdHJhdmVyc2FsLlxuICogQHByb3BlcnR5IHtWYWx1ZUJpbmRpbmd9IHZhbHVlQmluZGluZyAtIEltbXV0YWJsZSBiaW5kaW5nIHNjb3BlZCB0byB0aGUgYm9keS5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBMb29wIGJvZHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGxvb3Agc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEZvckVhY2hNYXBTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJGb3JFYWNoTWFwU3RhdGVtZW50XCJ9IGtpbmQgLSBJbnNlcnRpb24tb3JkZXJlZCBtYXAgcGFpci1pdGVyYXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgbG9vcCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gbWFwIC0gT3JkZXJlZC1tYXAgZXhwcmVzc2lvbiBldmFsdWF0ZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0cmF2ZXJzYWwuXG4gKiBAcHJvcGVydHkge1ZhbHVlQmluZGluZ30ga2V5QmluZGluZyAtIEltbXV0YWJsZSBzdHJpbmcta2V5IGJpbmRpbmcgc2NvcGVkIHRvIHRoZSBib2R5LlxuICogQHByb3BlcnR5IHtWYWx1ZUJpbmRpbmd9IHZhbHVlQmluZGluZyAtIEltbXV0YWJsZSBob21vZ2VuZW91cyB2YWx1ZSBiaW5kaW5nIHNjb3BlZCB0byB0aGUgYm9keS5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBMb29wIGJvZHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGxvb3Agc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFdoaWxlU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiV2hpbGVTdGF0ZW1lbnRcIn0ga2luZCAtIFN0cmljdC1Cb29sZWFuIHByZS1jb25kaXRpb24gbG9vcCBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBsb29wIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBjb25kaXRpb24gLSBCb29sZWFuIGV4cHJlc3Npb24gZXZhbHVhdGVkIGJlZm9yZSBldmVyeSBpdGVyYXRpb24uXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gT3JkZXJlZCBsb29wIGJvZHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGxvb3Agc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJyZWFrU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiQnJlYWtTdGF0ZW1lbnRcIn0ga2luZCAtIE5lYXJlc3QtbG9vcCBicmVhayBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRMb29wSWRdIC0gUmVzb2x2ZWQgbmVhcmVzdC1sb29wIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uIGluIGxvb3AgY29udGV4dC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gS2V5d29yZCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ29udGludWVTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJDb250aW51ZVN0YXRlbWVudFwifSBraW5kIC0gTmVhcmVzdC1sb29wIGNvbnRpbnVlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldExvb3BJZF0gLSBSZXNvbHZlZCBuZWFyZXN0LWxvb3AgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24gaW4gbG9vcCBjb250ZXh0LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBLZXl3b3JkIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFcnJvckNvbnN0cnVjdGlvblxuICogQHByb3BlcnR5IHtcIkVycm9yQ29uc3RydWN0aW9uXCJ9IGtpbmQgLSBDb25zdHJ1Y3Rpb24gb2Ygb25lIGRlY2xhcmVkIHVuY2hlY2tlZCBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7RXJyb3JUeXBlfSBlcnJvciAtIEV4YWN0IG5vbWluYWwgZXJyb3IgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gbWVzc2FnZSAtIFNvbGUgaW1tdXRhYmxlIHN0cmluZyBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBjb25zdHJ1Y3Rpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHlwZSBhbmQgbWVzc2FnZSByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSYWlzZVN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIlJhaXNlU3RhdGVtZW50XCJ9IGtpbmQgLSBBYnJ1cHQgdW5jaGVja2VkLWVycm9yIHByb3BhZ2F0aW9uLlxuICogQHByb3BlcnR5IHtFcnJvckNvbnN0cnVjdGlvbn0gZXJyb3IgLSBFeGFjdCBjb25zdHJ1Y3RlZCBzZW1hbnRpYyBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgcmFpc2Ugc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgcmFpc2UgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXRocm93U3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUmV0aHJvd1N0YXRlbWVudFwifSBraW5kIC0gUmUtcHJvcGFnYXRpb24gb2YgdGhlIGV4YWN0IGNhdWdodCBiaW5kaW5nIGluIHNjb3BlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJpbmRpbmcgLSBOYW1lIG9mIHRoZSBsZXhpY2FsbHkgdmlzaWJsZSBpbW11dGFibGUgY2F0Y2ggYmluZGluZyBiZWluZyByZS1yYWlzZWQuXG4gKiBAcHJvcGVydHkge0NhdGNoQmluZGluZ30gYmluZGluZ05vZGUgLSBFeGFjdCBjYXRjaCBiaW5kaW5nIG5vZGUgYmVpbmcgcmUtcmFpc2VkLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSByZXRocm93IHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHJldGhyb3cgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDYXRjaEJpbmRpbmdcbiAqIEBwcm9wZXJ0eSB7XCJDYXRjaEJpbmRpbmdcIn0ga2luZCAtIEV4YWN0LWhhbmRsZXIgYmluZGluZyBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBIYW5kbGVyLWxvY2FsIGJpbmRpbmcgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7RXJyb3JUeXBlfSB0eXBlIC0gRXhhY3QgY2F1Z2h0IG5vbWluYWwgZXJyb3IgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7ZmFsc2V9IG11dGFibGUgLSBDYXRjaCBiaW5kaW5ncyBhcmUgaW1tdXRhYmxlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBCaW5kaW5nIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGJpbmRpbmcgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDYXRjaEhhbmRsZXJcbiAqIEBwcm9wZXJ0eSB7XCJDYXRjaEhhbmRsZXJcIn0ga2luZCAtIE9uZSBleGFjdCBub21pbmFsIGhhbmRsZXIgd2l0aGluIGFuIG9yZGVyZWQgaGFuZGxlciBsaXN0LlxuICogQHByb3BlcnR5IHtFcnJvclR5cGV9IGNhdGNoVHlwZSAtIEV4YWN0IGNhdWdodCBub21pbmFsIGVycm9yIHR5cGUuXG4gKiBAcHJvcGVydHkge0NhdGNoQmluZGluZ30gY2F0Y2hCaW5kaW5nIC0gSW1tdXRhYmxlIGhhbmRsZXItbG9jYWwgYmluZGluZy5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGNhdGNoQm9keSAtIEhhbmRsZXIgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgaGFuZGxlciBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBjYXRjaCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUcnlTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJUcnlTdGF0ZW1lbnRcIn0ga2luZCAtIE9uZSBib2R5LCBhbiBvcmRlcmVkIGxpc3Qgb2YgZXhhY3QgdHlwZWQgaGFuZGxlcnMsIGFuZCBhbiBvcHRpb25hbCBjb21wbGV0aW9uIGJsb2NrLlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIFByb3RlY3RlZCBib2R5LlxuICogQHByb3BlcnR5IHtDYXRjaEhhbmRsZXJbXX0gaGFuZGxlcnMgLSBPcmRlcmVkIGV4YWN0IGhhbmRsZXJzLCBldmFsdWF0ZWQgdG9wIHRvIGJvdHRvbSB3aXRoIGV4YWN0IG5vbWluYWwgbWF0Y2hpbmcuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBbZmluYWxseUJvZHldIC0gQ29tcGxldGlvbiBibG9jayBleGVjdXRlZCBvbiBldmVyeSBub3JtYWwgYW5kIGFicnVwdCBjb21wbGV0aW9uIG9mIHRoZSB0cnkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIHRyeS9oYW5kbGVyIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHRyeS9jYXRjaC9maW5hbGx5IHJhbmdlcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge0xvY2FsRGVjbGFyYXRpb24gfCBBc3NpZ25tZW50U3RhdGVtZW50fSBMb2NhbFN0YXRlbWVudCAqL1xuLyoqIEB0eXBlZGVmIHtMb2NhbFN0YXRlbWVudCB8IFByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50IHwgRXhwcmVzc2lvblN0YXRlbWVudCB8IElmU3RhdGVtZW50IHwgRm9yRWFjaFN0YXRlbWVudCB8IEZvckVhY2hNYXBTdGF0ZW1lbnQgfCBXaGlsZVN0YXRlbWVudCB8IEJyZWFrU3RhdGVtZW50IHwgQ29udGludWVTdGF0ZW1lbnQgfCBSZXR1cm5TdGF0ZW1lbnQgfCBQcmludFN0YXRlbWVudCB8IFJhaXNlU3RhdGVtZW50IHwgUmV0aHJvd1N0YXRlbWVudCB8IFRyeVN0YXRlbWVudH0gU3RhdGVtZW50ICovXG5cbi8qKlxuICogQHR5cGVkZWYgQmxvY2tcbiAqIEBwcm9wZXJ0eSB7XCJCbG9ja1wifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTdGF0ZW1lbnRbXX0gc3RhdGVtZW50cyAtIE9yZGVyZWQgc3RhdGVtZW50cyBpbiBvbmUgbGV4aWNhbCBzY29wZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEZ1bmN0aW9uRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJGdW5jdGlvbkRlY2xhcmF0aW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIGRlY2xhcmF0aW9uIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBGdW5jdGlvbiBuYW1lLlxuICogQHByb3BlcnR5IHtUeXBlUGFyYW1ldGVyW119IFt0eXBlUGFyYW1ldGVyc10gLSBPcmRlcmVkIGRlY2xhcmF0aW9uLXNjb3BlZCBpbnZhcmlhbnQgdW5ib3VuZGVkIHBhcmFtZXRlcnMuXG4gKiBAcHJvcGVydHkge1BhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gRnVuY3Rpb24gcGFyYW1ldGVycy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHJldHVyblR5cGUgLSBSZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBGdW5jdGlvbiBib2R5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVjb3JkRmllbGRcbiAqIEBwcm9wZXJ0eSB7XCJSZWNvcmRGaWVsZFwifSBraW5kIC0gQ2xvc2VkIHJlY29yZC1maWVsZCBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgbW9kdWxlLWxvY2FsIGZpZWxkIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBGaWVsZCBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIEV4YWN0IGZpZWxkIHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEZpZWxkIGRlY2xhcmF0aW9uIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG5hbWUvdHlwZSByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWNvcmREZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIlJlY29yZERlY2xhcmF0aW9uXCJ9IGtpbmQgLSBOb21pbmFsIGNsb3NlZCBpbW11dGFibGUgcmVjb3JkIGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgbW9kdWxlLWxvY2FsIGRlY2xhcmF0aW9uIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBSZWNvcmQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7VHlwZVBhcmFtZXRlcltdfSBbdHlwZVBhcmFtZXRlcnNdIC0gT3JkZXJlZCBkZWNsYXJhdGlvbi1zY29wZWQgaW52YXJpYW50IHVuYm91bmRlZCBwYXJhbWV0ZXJzLlxuICogQHByb3BlcnR5IHtSZWNvcmRGaWVsZFtdfSBmaWVsZHMgLSBPcmRlcmVkIHVuaXF1ZSB2aXNpYmxlIGZpZWxkcy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgZGVjbGFyYXRpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgZGVjbGFyYXRpb24tbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByaXZhdGVGaWVsZFxuICogQHByb3BlcnR5IHtcIlByaXZhdGVGaWVsZFwifSBraW5kIC0gRGVjbGFyaW5nLWNsYXNzLXByaXZhdGUgbXV0YWJsZSBpbnN0YW5jZSBmaWVsZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIGNsYXNzLXNjb3BlZCBmaWVsZCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU291cmNlLXZpc2libGUgZmllbGQgbmFtZSBpbnNpZGUgdGhlIGRlY2xhcmluZyBjbGFzcyBvbmx5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIEV4YWN0IGZpZWxkIHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEZpZWxkIGRlY2xhcmF0aW9uIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbmFtZS90eXBlIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENvbnN0cnVjdG9yRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uXCJ9IGtpbmQgLSBFeGFjdCBjb21wbGV0ZSBwcml2YXRlLXN0YXRlIGluaXRpYWxpemVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgY2xhc3Mtc2NvcGVkIGNvbnN0cnVjdG9yIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtQYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIEV4YWN0IHBvc2l0aW9uYWwgY29uc3RydWN0b3Igc2lnbmF0dXJlLlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIEZpZWxkLW9yZGVyIGluaXRpYWxpemF0aW9uIGJvZHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFtcImhvc3RcIl19IFtlZmZlY3RzXSAtIEluZmVycmVkIGNoZWNrZWQgaG9zdC1lZmZlY3QgZmFjdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtmYWlsdXJlSWRzXSAtIE9yZGVyZWQgY2FwYWJpbGl0eSBmYWlsdXJlcyByZWFjaGFibGUgdGhyb3VnaCBjb25zdHJ1Y3Rpb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNvbnN0cnVjdG9yIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgY29uc3RydWN0b3IgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBNZXRob2REZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIk1ldGhvZERlY2xhcmF0aW9uXCJ9IGtpbmQgLSBSZWNlaXZlci1ib3VuZCBjbGFzcyBtZXRob2QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBjbGFzcy1zY29wZWQgbWV0aG9kIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBtZXRob2QgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7UGFyYW1ldGVyW119IHBhcmFtZXRlcnMgLSBFeGFjdCBwb3NpdGlvbmFsIG1ldGhvZCBzaWduYXR1cmUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSByZXR1cm5UeXBlIC0gRXhhY3QgcmV0dXJuIHR5cGUuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gTWV0aG9kIGJvZHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFtcImhvc3RcIl19IFtlZmZlY3RzXSAtIEluZmVycmVkIGNoZWNrZWQgaG9zdC1lZmZlY3QgZmFjdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtmYWlsdXJlSWRzXSAtIE9yZGVyZWQgY2FwYWJpbGl0eSBmYWlsdXJlcyByZWFjaGFibGUgdGhyb3VnaCB0aGUgbWV0aG9kLlxuICogQHByb3BlcnR5IHt7aW50ZXJmYWNlSWQ6IHN0cmluZywgbWV0aG9kSWQ6IHN0cmluZ319IFtpbXBsZW1lbnRzXSAtIEV4YWN0IHNhdGlzZmllZCBpbnRlcmZhY2UgbWVtYmVyLCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uIHdoZW4gdGhlIG1ldGhvZCBzYXRpc2ZpZXMgYW4gaW50ZXJmYWNlIGNvbnRyYWN0LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBtZXRob2QgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBtZXRob2QtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEludGVyZmFjZU1ldGhvZERlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRpb25cIn0ga2luZCAtIFNpZ25hdHVyZS1vbmx5IGludGVyZmFjZSBjb250cmFjdCBtZW1iZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBpbnRlcmZhY2Utc2NvcGVkIG1ldGhvZCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU291cmNlLXZpc2libGUgbWV0aG9kIG5hbWUuXG4gKiBAcHJvcGVydHkge1BhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gRXhhY3QgcG9zaXRpb25hbCByZXF1aXJlZCBwYXJhbWV0ZXJzIHdpdGggZXhwbGljaXQgdHlwZXMuXG4gKiBAcHJvcGVydHkge1NlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSByZXR1cm5UeXBlIC0gRXhhY3QgdmFsdWUgb3Igdm9pZCByZXR1cm4uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGludGVyZmFjZSBtZXRob2QgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBtZXRob2QtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEludGVyZmFjZURlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiSW50ZXJmYWNlRGVjbGFyYXRpb25cIn0ga2luZCAtIENsb3NlZCBzaWduYXR1cmUtb25seSBub21pbmFsIGludGVyZmFjZSB3aXRoIGV4YWN0IGltcGxlbWVudGF0aW9uIGNvbnRyYWN0cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIG1vZHVsZS1sb2NhbCBpbnRlcmZhY2UgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIGludGVyZmFjZSBuYW1lLlxuICogQHByb3BlcnR5IHtJbnRlcmZhY2VUeXBlW119IFtleHRlbmRzXSAtIERpcmVjdCBpbnRlcmZhY2UgcGFyZW50cyBpbiBzb3VyY2Ugb3JkZXI7IG9taXR0ZWQgd2hlbiBlbXB0eS5cbiAqIEBwcm9wZXJ0eSB7SW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRpb25bXX0gbWV0aG9kcyAtIE9yZGVyZWQgY2xvc2VkIHNpZ25hdHVyZSBzZXQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGludGVyZmFjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGludGVyZmFjZS1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ2xhc3NEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkNsYXNzRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vbWluYWwgcmVmZXJlbmNlIGNsYXNzIHdpdGggcHJpdmF0ZSBtdXRhYmxlIHN0YXRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgbW9kdWxlLWxvY2FsIGNsYXNzIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtQcml2YXRlRmllbGRbXX0gZmllbGRzIC0gT3JkZXJlZCBwcml2YXRlIGluc3RhbmNlIHN0YXRlLlxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvckRlY2xhcmF0aW9ufSBjb25zdHJ1Y3RvciAtIFNvbGUgZXhhY3QgY29uc3RydWN0b3IuXG4gKiBAcHJvcGVydHkge01ldGhvZERlY2xhcmF0aW9uW119IG1ldGhvZHMgLSBPcmRlcmVkIHJlY2VpdmVyIG1ldGhvZHMuXG4gKiBAcHJvcGVydHkge0ludGVyZmFjZVR5cGVbXX0gW2ltcGxlbWVudHNdIC0gRGlyZWN0IGludGVyZmFjZSBjb250cmFjdHMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge3traW5kOiBcIm9yZGluYXJ5XCJ9IHwge2tpbmQ6IFwib3duZWRSZXNvdXJjZVwiLCBmaWVsZElkOiBzdHJpbmcsIHJlc291cmNlSWQ6IHN0cmluZ319IFtvd25lcnNoaXBdIC0gRXhwbGljaXQgY2xhc3Mgb3duZXJzaGlwIHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNsYXNzIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgY2xhc3MtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFcnJvckRlY2xhcmF0aW9uXCJ9IGtpbmQgLSBOb21pbmFsIHVuY2hlY2tlZCBlcnJvciB3aXRoIG9uZSBpbW11dGFibGUgc3RyaW5nIG1lc3NhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgZGVjbGFyYXRpb24gaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEVycm9yIHR5cGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgZGVjbGFyYXRpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgZGVjbGFyYXRpb24tbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByaW50U3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUHJpbnRTdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFByaW50ZWQgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVudHJ5UG9pbnRcbiAqIEBwcm9wZXJ0eSB7XCJFbnRyeVBvaW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gRW50cnktcG9pbnQgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljTW9kdWxlXG4gKiBAcHJvcGVydHkge1wiTW9kdWxlXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1JlY29yZERlY2xhcmF0aW9uW119IFtyZWNvcmRzXSAtIFRvcC1sZXZlbCBub21pbmFsIHJlY29yZCBkZWNsYXJhdGlvbnMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge0ludGVyZmFjZURlY2xhcmF0aW9uW119IFtpbnRlcmZhY2VzXSAtIFRvcC1sZXZlbCBub21pbmFsIGludGVyZmFjZSBkZWNsYXJhdGlvbnMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge0NsYXNzRGVjbGFyYXRpb25bXX0gW2NsYXNzZXNdIC0gVG9wLWxldmVsIG5vbWluYWwgcmVmZXJlbmNlIGNsYXNzZXMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge0Vycm9yRGVjbGFyYXRpb25bXX0gW2Vycm9yc10gLSBUb3AtbGV2ZWwgbm9taW5hbCB1bmNoZWNrZWQgZXJyb3IgZGVjbGFyYXRpb25zIGluIHNvdXJjZSBvcmRlcjsgb21pdHRlZCB3aGVuIGVtcHR5LlxuICogQHByb3BlcnR5IHtFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gW2NhcGFiaWxpdGllc10gLSBDb21waWxlci1hdXRob3JpemVkIFRhc2sgMDM0IGRlY2xhcmF0aW9uczsgb21pc3Npb24gaXMgdGhlIGxlZ2FjeSBlbXB0eSBzZXQuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uRGVjbGFyYXRpb25bXX0gZnVuY3Rpb25zIC0gVG9wLWxldmVsIGZ1bmN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7RW50cnlQb2ludH0gZW50cnlQb2ludCAtIEV4ZWN1dGFibGUgZW50cnkgcG9pbnQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljUHJvdmVuYW5jZX0gW3Byb3ZlbmFuY2VdIC0gUGFyc2VyLWF1dGhvcmVkIHNvdXJjZSBhbmQgaWRlbnRpdHkgaW5kZXg7IG9wdGlvbmFsIGZvciBsZWdhY3kgY2FsbGVyLWF1dGhvcmVkIG1vZHVsZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY0ltcG9ydFxuICogQHByb3BlcnR5IHtcIkltcG9ydFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZHVsZUlkIC0gU3RhYmxlIGltcG9ydGVkIHNlbWFudGljIG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbXBvcnRlZE5hbWUgLSBFeHBvcnRlZCBkZWNsYXJhdGlvbiBuYW1lIGluIHRoZSBzb3VyY2UgbW9kdWxlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxvY2FsTmFtZSAtIEJpbmRpbmcgbmFtZSB2aXNpYmxlIGluIHRoZSBpbXBvcnRpbmcgbW9kdWxlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0RlY2xhcmF0aW9uS2luZH0gc3ltYm9sS2luZCAtIEltcG9ydGVkIGRlY2xhcmF0aW9uIG5hbWVzcGFjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIHJlc29sdmVkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSB0eXBlT25seSAtIFdoZXRoZXIgc291cmNlIHN5bnRheCBhZG1pdHRlZCBvbmx5IHR5cGUtcG9zaXRpb24gdXNlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBpbXBvcnQgZGVjbGFyYXRpb24vc3BlY2lmaWVyIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgaW1wb3J0IHJhbmdlcy5cbiAqIEBwcm9wZXJ0eSB7U3RkbGliRmFjYWRlUmVzb2x1dGlvbkV2aWRlbmNlfSBbc3RkbGliRmFjYWRlXSAtIEV4YWN0IHBhcnNlci1wcm92ZWQgbmF0aXZlIGZhY2FkZSBpZGVudGl0eSBldmlkZW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN0ZGxpYkZhY2FkZVJlc29sdXRpb25FdmlkZW5jZVxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkU3RkbGliRmFjYWRlUmVzb2x1dGlvblwifSBzY2hlbWEgLSBFdmlkZW5jZSBzY2hlbWEuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBFdmlkZW5jZSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZhY2FkZUlkZW50aXR5IC0gU2VsZWN0ZWQgZmFjYWRlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZhY2FkZVZlcnNpb24gLSBTZWxlY3RlZCBleGFjdCBmYWNhZGUgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYXRpdmVNb2R1bGUgLSBQYXJzZXItcHJvdmVkIHNvdXJjZSBzdGRsaWIgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hdGl2ZVN5bWJvbCAtIFBhcnNlci1wcm92ZWQgc291cmNlIHN0ZGxpYiBzeW1ib2wgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY0V4cG9ydFxuICogQHByb3BlcnR5IHtcIkV4cG9ydFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4cG9ydGVkTmFtZSAtIE5hbWUgdmlzaWJsZSB0byBpbXBvcnRpbmcgbW9kdWxlcy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNEZWNsYXJhdGlvbktpbmR9IHN5bWJvbEtpbmQgLSBFeHBvcnRlZCBkZWNsYXJhdGlvbiBuYW1lc3BhY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBleHBvcnRlZCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgZXhwb3J0IGRlY2xhcmF0aW9uL3NwZWNpZmllciBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGV4cG9ydCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1Byb2dyYW1Nb2R1bGVcbiAqIEBwcm9wZXJ0eSB7XCJNb2R1bGVcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFN0YWJsZSBjYWxsZXItc3VwcGxpZWQgbG9naWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlRmlsZW5hbWUgLSBFeHBsaWNpdCBzb3VyY2UgZmlsZW5hbWU7IG5ldmVyIGFuIGltcGxpY2l0IHJlYWQgcmVxdWVzdC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkRGVjbGFyYXRpb25bXX0gW3JlY29yZHNdIC0gVG9wLWxldmVsIG5vbWluYWwgcmVjb3JkIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7SW50ZXJmYWNlRGVjbGFyYXRpb25bXX0gW2ludGVyZmFjZXNdIC0gVG9wLWxldmVsIG5vbWluYWwgaW50ZXJmYWNlIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Q2xhc3NEZWNsYXJhdGlvbltdfSBbY2xhc3Nlc10gLSBDb21waWxlci1vd25lZCBmYWNhZGUgcmVmZXJlbmNlIGNsYXNzZXMuXG4gKiBAcHJvcGVydHkge0Vycm9yRGVjbGFyYXRpb25bXX0gW2Vycm9yc10gLSBUb3AtbGV2ZWwgbm9taW5hbCB1bmNoZWNrZWQgZXJyb3IgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtGdW5jdGlvbkRlY2xhcmF0aW9uW119IGZ1bmN0aW9ucyAtIFRvcC1sZXZlbCBmdW5jdGlvbnMuXG4gKiBAcHJvcGVydHkge1NlbWFudGljSW1wb3J0W119IGltcG9ydHMgLSBSZXNvbHZlZCBpbXBvcnRzIGluIHNvdXJjZSBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNFeHBvcnRbXX0gZXhwb3J0cyAtIFJlc29sdmVkIGV4cG9ydHMgaW4gc291cmNlIG9yZGVyLlxuICogQHByb3BlcnR5IHtFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gW2NhcGFiaWxpdGllc10gLSBBdXRob3JpdHkgZGVjbGFyYXRpb25zIHNoYXJlZCBieSByZWZlcmVuY2Ugd2hlbiB0aGUgcHJvZ3JhbSBkZWNsYXJlcyBhIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QuXG4gKiBAcHJvcGVydHkge0VudHJ5UG9pbnR9IFtlbnRyeVBvaW50XSAtIFNvbGUgZXhlY3V0YWJsZSBlbnRyeSBwb2ludCwgcHJlc2VudCBvbmx5IG9uIHRoZSBzZWxlY3RlZCBtb2R1bGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljUHJvdmVuYW5jZX0gW3Byb3ZlbmFuY2VdIC0gUGFyc2VyLWF1dGhvcmVkIHNvdXJjZSBhbmQgaWRlbnRpdHkgaW5kZXguXG4gKiBAcHJvcGVydHkge3tpZGVudGl0eTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9fSBbc3RkbGliRmFjYWRlXSAtIFNlbGVjdGVkIGNvbXBpbGVyLW93bmVkIGZhY2FkZSBtb2R1bGUgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdGRsaWJGYWNhZGVQcm9ncmFtTW9kdWxlRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHt7aWRlbnRpdHk6IHN0cmluZywgcmFuZ2U6IHN0cmluZ31bXX0gZGVwZW5kZW5jaWVzIC0gVmVyc2lvbmVkIGZhY2FkZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWRlbnRpdHkgLSBGYWNhZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkgeyh7aWRlbnRpdHk6IHN0cmluZywga2luZDogXCJtb2R1bGVcIiwgc3ltYm9sczogc3RyaW5nW119IHwge2Zvcm1zOiAoXCJ1bnF1YWxpZmllZC1jYWxsXCIgfCBcInJlY2VpdmVyLWNhbGxcIilbXSwgaWRlbnRpdHk6IHN0cmluZywga2luZDogXCJidWlsdGluXCIsIHN5bWJvbHM6IHN0cmluZ1tdfSlbXX0gbmF0aXZlTW9kdWxlcyAtIEV4YWN0IG5hdGl2ZSBzb3VyY2UgaWRlbnRpdGllcy5cbiAqIEBwcm9wZXJ0eSB7KHtlZmZlY3RzOiBzdHJpbmdbXSwgZmFpbHVyZXM6IHN0cmluZ1tdLCBmb3JtczogKFwiZGlyZWN0LWNhbGxcIiB8IFwidW5xdWFsaWZpZWQtY2FsbFwiIHwgXCJyZWNlaXZlci1jYWxsXCIpW10sIGtpbmQ6IFwiZnVuY3Rpb25cIiwgbmFtZTogc3RyaW5nLCBvd25lcnNoaXA6IFwibm90LWFwcGxpY2FibGVcIiwgcGFyYW1ldGVyczoge25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfVtdLCByZXR1cm5UeXBlOiBzdHJpbmd9IHwge2NvbnN0cnVjdG9yOiB7ZWZmZWN0czogc3RyaW5nW10sIGZhaWx1cmVzOiBzdHJpbmdbXSwgb3duZXJzaGlwOiBcImFjcXVpcmVkXCIsIHBhcmFtZXRlcnM6IHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ31bXX0sIGZvcm1zOiBbXCJjb25zdHJ1Y3Rvci1jYWxsXCJdLCBraW5kOiBcImNsYXNzXCIsIG1ldGhvZHM6IHtlZmZlY3RzOiBzdHJpbmdbXSwgZmFpbHVyZXM6IHN0cmluZ1tdLCBmb3JtczogW1wicmVjZWl2ZXItY2FsbFwiXSwgbmFtZTogc3RyaW5nLCBvd25lcnNoaXA6IFwiYm9ycm93ZWRcIiB8IFwiY29uc3VtZWRcIiwgcGFyYW1ldGVyczoge25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfVtdLCByZXR1cm5UeXBlOiBzdHJpbmd9W10sIG5hbWU6IHN0cmluZywgb3duZXJzaGlwOiBcIm93bmVkLXJlZmVyZW5jZVwifSlbXX0gcHVibGljRGVjbGFyYXRpb25zIC0gUHVibGljIHNvdXJjZSBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge3ttb2R1bGU6IHN0cmluZywgb3BlcmF0aW9uczogc3RyaW5nW10sIHJhbmdlOiBzdHJpbmd9W119IHJlcXVpcmVtZW50cyAtIENhbm9uaWNhbCBjYXBhYmlsaXR5IHJlcXVpcmVtZW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBydW50aW1lUHJvZmlsZSAtIEV4YWN0IHNvdXJjZSBydW50aW1lIHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlTW9kdWxlIC0gQ29tcGlsZXItb3duZWQgc2VtYW50aWMgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBFeGFjdCBmYWNhZGUgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJpbnRlcm5hbFwiIHwgXCJwdWJsaWNcIn0gdmlzaWJpbGl0eSAtIE5hdGl2ZS1zZWxlY3RhYmxlIHZpc2liaWxpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdGRsaWJGYWNhZGVQcm9ncmFtRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkU3RkbGliRmFjYWRlc1wifSBzY2hlbWEgLSBGYWNhZGUgZGVzY3JpcHRvciBzY2hlbWEuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBGYWNhZGUgZGVzY3JpcHRvciB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFNvdXJjZS1sYW5ndWFnZSBjb21wYXRpYmlsaXR5IHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge1N0ZGxpYkZhY2FkZVByb2dyYW1Nb2R1bGVEZXNjcmlwdG9yW119IG1vZHVsZXMgLSBEZXBlbmRlbmN5LWZpcnN0IHNlbGVjdGVkIGV4ZWN1dGFibGUgY2xvc3VyZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljUHJvZ3JhbVxuICogQHByb3BlcnR5IHtcIlByb2dyYW1cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNQcm9ncmFtTW9kdWxlW119IG1vZHVsZXMgLSBEZXBlbmRlbmN5LWZpcnN0IGRldGVybWluaXN0aWMgbW9kdWxlIG9yZGVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudHJ5TW9kdWxlIC0gU3RhYmxlIGlkZW50aXR5IG9mIHRoZSBzb2xlIGVudHJ5IG1vZHVsZS5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gQ2FsbGVyLW9yZGVyIGNvbXBsZXRlIHNvdXJjZSByZWdpc3RyeS5cbiAqIEBwcm9wZXJ0eSB7e2NvbnRyYWN0VmVyc2lvbj86IHN0cmluZywgaWRlbnRpdHk6IHN0cmluZ319IFtzdGRsaWJDb250cmFjdF0gLSBEZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0OyBwbGFpbiwgbmV2ZXIgZnJvemVuLlxuICogQHByb3BlcnR5IHt7Y29udHJhY3RWZXJzaW9uPzogc3RyaW5nLCBpZGVudGl0eTogc3RyaW5nfVtdfSBbc3RkbGliQ29udHJhY3RzXSAtIE9yZGVyZWQgZGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdHM7IHBsYWluLCBuZXZlciBmcm96ZW4uXG4gKiBAcHJvcGVydHkge1N0ZGxpYkZhY2FkZVByb2dyYW1EZXNjcmlwdG9yfSBbc3RkbGliRmFjYWRlc10gLSBDb21wbGV0ZSBzZWxlY3RlZCBzb3VyY2UtbGFuZ3VhZ2UgZmFjYWRlIGNsb3N1cmUuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY01vZHVsZSB8IFNlbWFudGljUHJvZ3JhbU1vZHVsZSB8IFNlbWFudGljSW1wb3J0IHwgU2VtYW50aWNFeHBvcnQgfCBSZWNvcmREZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRpb24gfCBDbGFzc0RlY2xhcmF0aW9uIHwgRXJyb3JEZWNsYXJhdGlvbiB8IEVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbiB8IEVmZmVjdFJlc291cmNlRGVjbGFyYXRpb24gfCBFZmZlY3RGYWlsdXJlRGVjbGFyYXRpb24gfCBFZmZlY3RPcGVyYXRpb25EZWNsYXJhdGlvbiB8IFJlY29yZEZpZWxkIHwgUHJpdmF0ZUZpZWxkIHwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB8IE1ldGhvZERlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IFR5cGVQYXJhbWV0ZXIgfCBQYXJhbWV0ZXIgfCBWYWx1ZUJpbmRpbmcgfCBDYXRjaEJpbmRpbmcgfCBDYXRjaEhhbmRsZXIgfCBCbG9jayB8IFN0YXRlbWVudCB8IEVudHJ5UG9pbnQgfCBFeHByZXNzaW9uIHwgRXJyb3JDb25zdHJ1Y3Rpb24gfCBFcnJvclR5cGUgfCBNYXBFbnRyeSB8IFNlbWFudGljVmFsdWVUeXBlIHwgRnVuY3Rpb25SZXR1cm5UeXBlUmVmZXJlbmNlfSBTZW1hbnRpY05vZGUgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNOb2RlfSBTZW1hbnRpY05vZGVXaXRob3V0TG9jYXRpb25zICovXG5cbmV4cG9ydCB7fVxuIl19