@aws-cdk/aws-glue-alpha 2.268.0-alpha.0 → 2.270.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/.jsii +1820 -1612
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +1649 -10
  4. package/README.md +105 -35
  5. package/adr/job-arguments.md +212 -0
  6. package/lib/catalog.js +88 -4
  7. package/lib/code.js +59 -4
  8. package/lib/connection.d.ts +44 -29
  9. package/lib/connection.js +147 -31
  10. package/lib/constants.d.ts +17 -0
  11. package/lib/constants.js +20 -2
  12. package/lib/data-format.js +43 -6
  13. package/lib/data-quality-ruleset.js +60 -4
  14. package/lib/database.js +48 -2
  15. package/lib/external-table.js +48 -2
  16. package/lib/jobs/job.d.ts +90 -9
  17. package/lib/jobs/job.js +219 -38
  18. package/lib/jobs/pyspark-etl-job.d.ts +1 -3
  19. package/lib/jobs/pyspark-etl-job.js +28 -14
  20. package/lib/jobs/pyspark-flex-etl-job.d.ts +1 -3
  21. package/lib/jobs/pyspark-flex-etl-job.js +28 -14
  22. package/lib/jobs/pyspark-streaming-job.d.ts +1 -3
  23. package/lib/jobs/pyspark-streaming-job.js +28 -14
  24. package/lib/jobs/python-shell-job.d.ts +20 -7
  25. package/lib/jobs/python-shell-job.js +49 -33
  26. package/lib/jobs/ray-job.js +8 -13
  27. package/lib/jobs/scala-spark-etl-job.d.ts +1 -3
  28. package/lib/jobs/scala-spark-etl-job.js +29 -14
  29. package/lib/jobs/scala-spark-flex-etl-job.d.ts +1 -3
  30. package/lib/jobs/scala-spark-flex-etl-job.js +29 -14
  31. package/lib/jobs/scala-spark-streaming-job.d.ts +1 -3
  32. package/lib/jobs/scala-spark-streaming-job.js +29 -14
  33. package/lib/jobs/spark-job.d.ts +9 -7
  34. package/lib/jobs/spark-job.js +26 -32
  35. package/lib/partition-projection.d.ts +36 -47
  36. package/lib/partition-projection.js +34 -40
  37. package/lib/s3-table.js +106 -5
  38. package/lib/schema.js +50 -3
  39. package/lib/security-configuration.js +60 -5
  40. package/lib/storage-parameter.js +91 -2
  41. package/lib/table-base.js +32 -2
  42. package/lib/triggers/trigger-options.d.ts +102 -42
  43. package/lib/triggers/trigger-options.js +242 -3
  44. package/lib/triggers/workflow.d.ts +31 -47
  45. package/lib/triggers/workflow.js +87 -142
  46. package/package.json +10 -10
@@ -111,12 +111,13 @@ function dateFormatRequiresInterval(format) {
111
111
  * Factory class for creating partition projection configurations.
112
112
  */
113
113
  class PartitionProjectionConfiguration {
114
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.PartitionProjectionConfiguration", version: "2.268.0-alpha.0" };
114
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.PartitionProjectionConfiguration", version: "2.270.0-alpha.0" };
115
115
  /**
116
116
  * Create an INTEGER partition projection configuration.
117
117
  */
118
118
  static integer(props) {
119
119
  try {
120
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.PartitionProjectionConfiguration#integer", "");
120
121
  jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_IntegerPartitionProjectionConfigurationProps(props);
121
122
  }
122
123
  catch (error) {
@@ -159,6 +160,7 @@ class PartitionProjectionConfiguration {
159
160
  */
160
161
  static date(props) {
161
162
  try {
163
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.PartitionProjectionConfiguration#date", "");
162
164
  jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_DatePartitionProjectionConfigurationProps(props);
163
165
  }
164
166
  catch (error) {
@@ -210,25 +212,25 @@ class PartitionProjectionConfiguration {
210
212
  }
211
213
  }
212
214
  // Validate interval
213
- if (props.interval !== undefined &&
214
- !aws_cdk_lib_1.Token.isUnresolved(props.interval) &&
215
- (!Number.isInteger(props.interval) || props.interval <= 0)) {
216
- throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `DateIntervalInvalid`, `DATE partition projection interval must be a positive integer, but got ${props.interval}`);
215
+ if (props.step !== undefined &&
216
+ !aws_cdk_lib_1.Token.isUnresolved(props.step.interval) &&
217
+ (!Number.isInteger(props.step.interval) || props.step.interval <= 0)) {
218
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `DateIntervalInvalid`, `DATE partition projection interval must be a positive integer, but got ${props.step.interval}`);
217
219
  }
218
- // For sub-day precision (a field finer than a day), Athena requires both
219
- // `interval` and `intervalUnit`; at day or coarser precision it defaults
220
- // them. Only enforce when the format is a resolved literal we can inspect.
221
- if (!aws_cdk_lib_1.Token.isUnresolved(props.format) && dateFormatRequiresInterval(props.format)) {
222
- if (props.interval === undefined || props.intervalUnit === undefined) {
223
- throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `DateIntervalRequired`, `DATE partition projection with format '${props.format}' has sub-day precision, so both 'interval' and 'intervalUnit' are required`);
224
- }
220
+ // For sub-day precision (a field finer than a day), Athena requires a step;
221
+ // at day or coarser precision it defaults one. The interval/unit pairing is
222
+ // now guaranteed by the `step` type, so only the "sub-day format needs a
223
+ // step at all" requirement remains. Enforce only when the format is a
224
+ // resolved literal we can inspect.
225
+ if (!aws_cdk_lib_1.Token.isUnresolved(props.format) && dateFormatRequiresInterval(props.format) && props.step === undefined) {
226
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `DateStepRequired`, `DATE partition projection with format '${props.format}' has sub-day precision, so 'step' (interval and intervalUnit) is required`);
225
227
  }
226
228
  return new PartitionProjectionConfiguration({
227
229
  type: PartitionProjectionType.DATE,
228
230
  dateRange: [props.min, props.max],
229
- interval: props.interval,
231
+ interval: props.step?.interval,
230
232
  format: props.format,
231
- intervalUnit: props.intervalUnit,
233
+ intervalUnit: props.step?.intervalUnit,
232
234
  });
233
235
  }
234
236
  /**
@@ -236,6 +238,7 @@ class PartitionProjectionConfiguration {
236
238
  */
237
239
  static enum(props) {
238
240
  try {
241
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.PartitionProjectionConfiguration#enum", "");
239
242
  jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_EnumPartitionProjectionConfigurationProps(props);
240
243
  }
241
244
  catch (error) {
@@ -272,6 +275,15 @@ class PartitionProjectionConfiguration {
272
275
  * @see https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html#partition-projection-injected-type
273
276
  */
274
277
  static injected() {
278
+ try {
279
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.PartitionProjectionConfiguration#injected", "");
280
+ }
281
+ catch (error) {
282
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
283
+ Error.captureStackTrace(error, this.injected);
284
+ }
285
+ throw error;
286
+ }
275
287
  return new PartitionProjectionConfiguration({
276
288
  type: PartitionProjectionType.INJECTED,
277
289
  });
@@ -280,37 +292,19 @@ class PartitionProjectionConfiguration {
280
292
  * The type of partition projection.
281
293
  */
282
294
  type;
283
- /**
284
- * Range of partition values for INTEGER type.
285
- *
286
- * Array of [min, max] as numbers.
287
- */
295
+ /** Range [min, max] for INTEGER type. */
288
296
  integerRange;
289
- /**
290
- * Range of partition values for DATE type.
291
- *
292
- * Array of [start, end] as date strings.
293
- */
297
+ /** Range [start, end] for DATE type. */
294
298
  dateRange;
295
- /**
296
- * Interval between partition values.
297
- */
299
+ /** Interval between partition values (INTEGER, or DATE step). */
298
300
  interval;
299
- /**
300
- * Number of digits to pad INTEGER partition values.
301
- */
301
+ /** Number of digits to pad INTEGER partition values. */
302
302
  digits;
303
- /**
304
- * Date format for DATE partition values (Java SimpleDateFormat).
305
- */
303
+ /** Date format for DATE partition values. */
306
304
  format;
307
- /**
308
- * Unit for DATE partition interval.
309
- */
305
+ /** Unit for the DATE partition interval. */
310
306
  intervalUnit;
311
- /**
312
- * Explicit list of values for ENUM partitions.
313
- */
307
+ /** Explicit list of values for ENUM partitions. */
314
308
  values;
315
309
  constructor(props) {
316
310
  this.type = props.type;
@@ -384,4 +378,4 @@ exports.PartitionProjectionConfiguration = PartitionProjectionConfiguration;
384
378
  function generatePartitionProjectionParameters(columnName, config) {
385
379
  return config._renderParameters(columnName);
386
380
  }
387
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFydGl0aW9uLXByb2plY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwYXJ0aXRpb24tcHJvamVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFzbEJBLHNGQUtDOzs7QUEzbEJELDZDQUE2RDtBQUM3RCw0RUFBNEQ7QUFFNUQ7Ozs7OztHQU1HO0FBQ0gsSUFBWSx1QkFvQlg7QUFwQkQsV0FBWSx1QkFBdUI7SUFDakM7O09BRUc7SUFDSCw4Q0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILHdDQUFhLENBQUE7SUFFYjs7T0FFRztJQUNILHdDQUFhLENBQUE7SUFFYjs7T0FFRztJQUNILGdEQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFwQlcsdUJBQXVCLHVDQUF2Qix1QkFBdUIsUUFvQmxDO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksZ0JBbUNYO0FBbkNELFdBQVksZ0JBQWdCO0lBQzFCOztPQUVHO0lBQ0gsbUNBQWUsQ0FBQTtJQUVmOztPQUVHO0lBQ0gscUNBQWlCLENBQUE7SUFFakI7O09BRUc7SUFDSCxtQ0FBZSxDQUFBO0lBRWY7O09BRUc7SUFDSCxpQ0FBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCxtQ0FBZSxDQUFBO0lBRWY7O09BRUc7SUFDSCx1Q0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILHVDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFuQ1csZ0JBQWdCLGdDQUFoQixnQkFBZ0IsUUFtQzNCO0FBMEpEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLDBCQUEwQixDQUFDLE1BQWM7SUFDaEQsNEVBQTRFO0lBQzVFLHFFQUFxRTtJQUNyRSxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ2xDLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixJQUFJLEVBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ25ELENBQUMsRUFBRSxDQUFDO1lBQ04sQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUNyQixDQUFDO1FBQ0gsQ0FBQzthQUFNLElBQUksQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsdUVBQXVFO0lBQ3ZFLDJFQUEyRTtJQUMzRSx3RUFBd0U7SUFDeEUsb0NBQW9DO0lBQ3BDLHdFQUF3RTtJQUN4RSwrRUFBK0U7SUFDL0UsT0FBTyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7R0FFRztBQUNILE1BQWEsZ0NBQWdDOztJQUMzQzs7T0FFRztJQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBbUQ7Ozs7Ozs7Ozs7UUFDdkUsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNqRSxNQUFNLElBQUkscUNBQXVCLENBQy9CLElBQUEsc0JBQUcsRUFBQSx5QkFBeUIsRUFDNUIsc0VBQXNFLEtBQUssQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUNqRyxDQUFDO1lBQ0osQ0FBQztZQUVELHNCQUFzQjtZQUN0QixJQUFJLEtBQUssQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUMxQixNQUFNLElBQUkscUNBQXVCLENBQy9CLElBQUEsc0JBQUcsRUFBQSwrQkFBK0IsRUFDbEMsb0ZBQW9GLEtBQUssQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUMvRyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxvQkFBb0I7UUFDcEIsSUFDRSxLQUFLLENBQUMsUUFBUSxLQUFLLFNBQVM7WUFDNUIsQ0FBQyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQ25DLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxFQUMxRCxDQUFDO1lBQ0QsTUFBTSxJQUFJLHFDQUF1QixDQUMvQixJQUFBLHNCQUFHLEVBQUEsd0JBQXdCLEVBQzNCLDZFQUE2RSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQzlGLENBQUM7UUFDSixDQUFDO1FBRUQsa0JBQWtCO1FBQ2xCLElBQ0UsS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTO1lBQzFCLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNqQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFDckQsQ0FBQztZQUNELE1BQU0sSUFBSSxxQ0FBdUIsQ0FDL0IsSUFBQSxzQkFBRyxFQUFBLHNCQUFzQixFQUN6Qix3RUFBd0UsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUN2RixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sSUFBSSxnQ0FBZ0MsQ0FBQztZQUMxQyxJQUFJLEVBQUUsdUJBQXVCLENBQUMsT0FBTztZQUNyQyxZQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDcEMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtTQUNyQixDQUFDLENBQUM7S0FDSjtJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFnRDs7Ozs7Ozs7OztRQUNqRSxpQ0FBaUM7UUFDakMsSUFDRSxDQUFDLG1CQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDOUIsQ0FBQyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQzlCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFDcEQsQ0FBQztZQUNELE1BQU0sSUFBSSxxQ0FBdUIsQ0FDL0IsSUFBQSxzQkFBRyxFQUFBLGdCQUFnQixFQUNuQixnRUFBZ0UsQ0FDakUsQ0FBQztRQUNKLENBQUM7UUFFRCxrQkFBa0I7UUFDbEIsSUFBSSxDQUFDLG1CQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3RDLCtCQUErQjtZQUMvQixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sSUFBSSxxQ0FBdUIsQ0FDL0IsSUFBQSxzQkFBRyxFQUFBLGlCQUFpQixFQUNwQiw2REFBNkQsQ0FDOUQsQ0FBQztZQUNKLENBQUM7WUFFRCxnRUFBZ0U7WUFDaEUsTUFBTSxtQkFBbUIsR0FBRyxvQ0FBb0MsQ0FBQztZQUNqRSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzVCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNwQixNQUFNLFlBQVksR0FBYSxFQUFFLENBQUM7WUFFbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDdkMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixJQUFJLEVBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFDZixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO3dCQUNuRCxtREFBbUQ7d0JBQ25ELENBQUMsRUFBRSxDQUFDO29CQUNOLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUM7b0JBQ3JCLENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxJQUFJLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDM0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO3dCQUN0QyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUN4QixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixNQUFNLElBQUkscUNBQXVCLENBQy9CLElBQUEsc0JBQUcsRUFBQSx5QkFBeUIsRUFDNUIsbUVBQW1FLE1BQU0sR0FBRyxDQUM3RSxDQUFDO1lBQ0osQ0FBQztZQUVELElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQzFDLE1BQU0sSUFBSSxxQ0FBdUIsQ0FDL0IsSUFBQSxzQkFBRyxFQUFBLDZCQUE2QixFQUNoQyx5RUFBeUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsMERBQTBELENBQ3JKLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELG9CQUFvQjtRQUNwQixJQUNFLEtBQUssQ0FBQyxRQUFRLEtBQUssU0FBUztZQUM1QixDQUFDLG1CQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDbkMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLEVBQzFELENBQUM7WUFDRCxNQUFNLElBQUkscUNBQXVCLENBQy9CLElBQUEsc0JBQUcsRUFBQSxxQkFBcUIsRUFDeEIsMEVBQTBFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FDM0YsQ0FBQztRQUNKLENBQUM7UUFFRCx5RUFBeUU7UUFDekUseUVBQXlFO1FBQ3pFLDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2xGLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDckUsTUFBTSxJQUFJLHFDQUF1QixDQUMvQixJQUFBLHNCQUFHLEVBQUEsc0JBQXNCLEVBQ3pCLDBDQUEwQyxLQUFLLENBQUMsTUFBTSw2RUFBNkUsQ0FDcEksQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLGdDQUFnQyxDQUFDO1lBQzFDLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxJQUFJO1lBQ2xDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQztZQUNqQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDeEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtTQUNqQyxDQUFDLENBQUM7S0FDSjtJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFnRDs7Ozs7Ozs7OztRQUNqRSwrQkFBK0I7UUFDL0IsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUkscUNBQXVCLENBQy9CLElBQUEsc0JBQUcsRUFBQSxpQkFBaUIsRUFDcEIsNERBQTRELENBQzdELENBQUM7UUFDSixDQUFDO1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0MsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7b0JBQ3hCLE1BQU0sSUFBSSxxQ0FBdUIsQ0FDL0IsSUFBQSxzQkFBRyxFQUFBLGdCQUFnQixFQUNuQixpRUFBaUUsQ0FDbEUsQ0FBQztnQkFDSixDQUFDO2dCQUNELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN4QixNQUFNLElBQUkscUNBQXVCLENBQy9CLElBQUEsc0JBQUcsRUFBQSx3QkFBd0IsRUFDM0IsK0hBQStILEtBQUssR0FBRyxDQUN4SSxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxnQ0FBZ0MsQ0FBQztZQUMxQyxJQUFJLEVBQUUsdUJBQXVCLENBQUMsSUFBSTtZQUNsQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07U0FDckIsQ0FBQyxDQUFDO0tBQ0o7SUFFRDs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsUUFBUTtRQUNwQixPQUFPLElBQUksZ0NBQWdDLENBQUM7WUFDMUMsSUFBSSxFQUFFLHVCQUF1QixDQUFDLFFBQVE7U0FDdkMsQ0FBQyxDQUFDO0tBQ0o7SUFFRDs7T0FFRztJQUNhLElBQUksQ0FBMEI7SUFFOUM7Ozs7T0FJRztJQUNhLFlBQVksQ0FBWTtJQUV4Qzs7OztPQUlHO0lBQ2EsU0FBUyxDQUFZO0lBRXJDOztPQUVHO0lBQ2EsUUFBUSxDQUFVO0lBRWxDOztPQUVHO0lBQ2EsTUFBTSxDQUFVO0lBRWhDOztPQUVHO0lBQ2EsTUFBTSxDQUFVO0lBRWhDOztPQUVHO0lBQ2EsWUFBWSxDQUFvQjtJQUVoRDs7T0FFRztJQUNhLE1BQU0sQ0FBWTtJQUVsQyxZQUFvQixLQUE0QztRQUM5RCxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDdkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0tBQzVCO0lBRUQ7Ozs7O09BS0c7SUFDSSxpQkFBaUIsQ0FBQyxVQUFrQjtRQUN6QyxNQUFNLE1BQU0sR0FBOEI7WUFDeEMsQ0FBQyxjQUFjLFVBQVUsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDN0MsQ0FBQztRQUVGLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xCLEtBQUssdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDckMsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBYSxDQUFDO2dCQUN0QyxNQUFNLENBQUMsY0FBYyxVQUFVLFFBQVEsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUMzRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ2hDLE1BQU0sQ0FBQyxjQUFjLFVBQVUsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDekUsQ0FBQztnQkFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQzlCLE1BQU0sQ0FBQyxjQUFjLFVBQVUsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDckUsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDbEMsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBVSxDQUFDO2dCQUNyQyxNQUFNLENBQUMsY0FBYyxVQUFVLFFBQVEsQ0FBQyxHQUFHLEdBQUcsS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUM3RCxNQUFNLENBQUMsY0FBYyxVQUFVLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFPLENBQUM7Z0JBQ3pELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDaEMsTUFBTSxDQUFDLGNBQWMsVUFBVSxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN6RSxDQUFDO2dCQUNELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsTUFBTSxDQUFDLGNBQWMsVUFBVSxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZFLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLE1BQU0sQ0FBQyxjQUFjLFVBQVUsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25FLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUN0Qyx3Q0FBd0M7Z0JBQ3hDLE1BQU07WUFDUixDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDUixrQ0FBa0M7Z0JBQ2xDLE1BQU0sZUFBZSxHQUFVLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3pDLE1BQU0sSUFBSSxxQ0FBdUIsQ0FDL0IsSUFBQSxzQkFBRyxFQUFBLHVCQUF1QixFQUMxQiwwQ0FBMEMsVUFBVSxNQUFNLGVBQWUsRUFBRSxDQUM1RSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztLQUNmOztBQXRUSCw0RUF1VEM7QUFZRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixxQ0FBcUMsQ0FDbkQsVUFBa0IsRUFDbEIsTUFBd0M7SUFFeEMsT0FBTyxNQUFNLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRva2VuLCBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuXG4vKipcbiAqIFBhcnRpdGlvbiBwcm9qZWN0aW9uIHR5cGUuXG4gKlxuICogRGV0ZXJtaW5lcyBob3cgQXRoZW5hIHByb2plY3RzIHBhcnRpdGlvbiB2YWx1ZXMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXRoZW5hL2xhdGVzdC91Zy9wYXJ0aXRpb24tcHJvamVjdGlvbi1zdXBwb3J0ZWQtdHlwZXMuaHRtbFxuICovXG5leHBvcnQgZW51bSBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZSB7XG4gIC8qKlxuICAgKiBQcm9qZWN0IHBhcnRpdGlvbiB2YWx1ZXMgYXMgaW50ZWdlcnMgd2l0aGluIGEgcmFuZ2UuXG4gICAqL1xuICBJTlRFR0VSID0gJ2ludGVnZXInLFxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IHBhcnRpdGlvbiB2YWx1ZXMgYXMgZGF0ZXMgd2l0aGluIGEgcmFuZ2UuXG4gICAqL1xuICBEQVRFID0gJ2RhdGUnLFxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IHBhcnRpdGlvbiB2YWx1ZXMgZnJvbSBhbiBleHBsaWNpdCBsaXN0IG9mIHZhbHVlcy5cbiAgICovXG4gIEVOVU0gPSAnZW51bScsXG5cbiAgLyoqXG4gICAqIFByb2plY3QgcGFydGl0aW9uIHZhbHVlcyB0aGF0IGFyZSBpbmplY3RlZCBhdCBxdWVyeSB0aW1lLlxuICAgKi9cbiAgSU5KRUNURUQgPSAnaW5qZWN0ZWQnLFxufVxuXG4vKipcbiAqIERhdGUgaW50ZXJ2YWwgdW5pdCBmb3IgcGFydGl0aW9uIHByb2plY3Rpb24uXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXRoZW5hL2xhdGVzdC91Zy9wYXJ0aXRpb24tcHJvamVjdGlvbi1zdXBwb3J0ZWQtdHlwZXMuaHRtbCNwYXJ0aXRpb24tcHJvamVjdGlvbi1kYXRlLXR5cGVcbiAqL1xuZXhwb3J0IGVudW0gRGF0ZUludGVydmFsVW5pdCB7XG4gIC8qKlxuICAgKiBZZWFyIGludGVydmFsLlxuICAgKi9cbiAgWUVBUlMgPSAnWUVBUlMnLFxuXG4gIC8qKlxuICAgKiBNb250aCBpbnRlcnZhbC5cbiAgICovXG4gIE1PTlRIUyA9ICdNT05USFMnLFxuXG4gIC8qKlxuICAgKiBXZWVrIGludGVydmFsLlxuICAgKi9cbiAgV0VFS1MgPSAnV0VFS1MnLFxuXG4gIC8qKlxuICAgKiBEYXkgaW50ZXJ2YWwgKGRlZmF1bHQpLlxuICAgKi9cbiAgREFZUyA9ICdEQVlTJyxcblxuICAvKipcbiAgICogSG91ciBpbnRlcnZhbC5cbiAgICovXG4gIEhPVVJTID0gJ0hPVVJTJyxcblxuICAvKipcbiAgICogTWludXRlIGludGVydmFsLlxuICAgKi9cbiAgTUlOVVRFUyA9ICdNSU5VVEVTJyxcblxuICAvKipcbiAgICogU2Vjb25kIGludGVydmFsLlxuICAgKi9cbiAgU0VDT05EUyA9ICdTRUNPTkRTJyxcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBJTlRFR0VSIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZWdlclBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMge1xuICAvKipcbiAgICogTWluaW11bSB2YWx1ZSBmb3IgdGhlIGludGVnZXIgcGFydGl0aW9uIHJhbmdlIChpbmNsdXNpdmUpLlxuICAgKi9cbiAgcmVhZG9ubHkgbWluOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdmFsdWUgZm9yIHRoZSBpbnRlZ2VyIHBhcnRpdGlvbiByYW5nZSAoaW5jbHVzaXZlKS5cbiAgICovXG4gIHJlYWRvbmx5IG1heDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJbnRlcnZhbCBiZXR3ZWVuIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIHJlYWRvbmx5IGludGVydmFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZGlnaXRzIHRvIHBhZCB0aGUgcGFydGl0aW9uIHZhbHVlIHdpdGggbGVhZGluZyB6ZXJvcy5cbiAgICpcbiAgICogV2l0aCBkaWdpdHM6IDQsIHBhcnRpdGlvbiB2YWx1ZXM6IDAwMDEsIDAwMDIsIC4uLiwgMDEwMFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHN0YXRpYyBudW1iZXIgb2YgZGlnaXRzIGFuZCBubyBsZWFkaW5nIHplcm9lc1xuICAgKi9cbiAgcmVhZG9ubHkgZGlnaXRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIERBVEUgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRlUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBTdGFydCBkYXRlIGZvciB0aGUgcGFydGl0aW9uIHJhbmdlIChpbmNsdXNpdmUpLlxuICAgKlxuICAgKiBDYW4gYmUgZWl0aGVyOlxuICAgKiAtIEZpeGVkIGRhdGUgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgYnkgYGZvcm1hdGAgcHJvcGVydHlcbiAgICogICAoZS5nLiwgJzIwMjAtMDEtMDEnIGZvciBmb3JtYXQgJ3l5eXktTU0tZGQnKVxuICAgKiAtIFJlbGF0aXZlIGRhdGUgdXNpbmcgTk9XIHN5bnRheFxuICAgKiAgIChlLmcuLCAnTk9XJywgJ05PVy0zWUVBUlMnLCAnTk9XKzFNT05USCcpXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvcGFydGl0aW9uLXByb2plY3Rpb24tc3VwcG9ydGVkLXR5cGVzLmh0bWwjcGFydGl0aW9uLXByb2plY3Rpb24tZGF0ZS10eXBlXG4gICAqL1xuICByZWFkb25seSBtaW46IHN0cmluZztcblxuICAvKipcbiAgICogRW5kIGRhdGUgZm9yIHRoZSBwYXJ0aXRpb24gcmFuZ2UgKGluY2x1c2l2ZSkuXG4gICAqXG4gICAqIENhbiBiZSBlaXRoZXI6XG4gICAqIC0gRml4ZWQgZGF0ZSBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSBgZm9ybWF0YCBwcm9wZXJ0eVxuICAgKiAtIFJlbGF0aXZlIGRhdGUgdXNpbmcgTk9XIHN5bnRheFxuICAgKlxuICAgKiBTYW1lIGZvcm1hdCBjb25zdHJhaW50cyBhcyBgbWluYC5cbiAgICovXG4gIHJlYWRvbmx5IG1heDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEYXRlIGZvcm1hdCBmb3IgcGFydGl0aW9uIHZhbHVlcy5cbiAgICpcbiAgICogVXNlcyBKYXZhIFNpbXBsZURhdGVGb3JtYXQgcGF0dGVybnMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy9hcGkvamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXQuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEludGVydmFsIGJldHdlZW4gcGFydGl0aW9uIHZhbHVlcy5cbiAgICpcbiAgICogUmVxdWlyZWQgKHRvZ2V0aGVyIHdpdGggYGludGVydmFsVW5pdGApIHdoZW4gYGZvcm1hdGAgY2FycmllcyBzdWItZGF5XG4gICAqIHByZWNpc2lvbiDigJQgaS5lLiBhIGZpZWxkIGZpbmVyIHRoYW4gYSBkYXksIHN1Y2ggYXMgaG91cnMgb3IgQU0vUE0uIEF0IGRheVxuICAgKiBvciBjb2Fyc2VyIHByZWNpc2lvbiBBdGhlbmEgZGVmYXVsdHMgdGhlIHN0ZXAsIHNvIGl0IGlzIG9wdGlvbmFsLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEF0aGVuYSdzIGRlZmF1bHQgc3RlcCBmb3IgdGhlIGZvcm1hdCdzIHByZWNpc2lvbjsgcmVxdWlyZWQgd2hlbiBgZm9ybWF0YCBpcyBzdWItZGF5IHByZWNpc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFVuaXQgZm9yIHRoZSBpbnRlcnZhbC5cbiAgICpcbiAgICogUmVxdWlyZWQgKHRvZ2V0aGVyIHdpdGggYGludGVydmFsYCkgd2hlbiBgZm9ybWF0YCBjYXJyaWVzIHN1Yi1kYXlcbiAgICogcHJlY2lzaW9uIOKAlCBpLmUuIGEgZmllbGQgZmluZXIgdGhhbiBhIGRheSwgc3VjaCBhcyBob3VycyBvciBBTS9QTS4gQXQgZGF5XG4gICAqIG9yIGNvYXJzZXIgcHJlY2lzaW9uIEF0aGVuYSBkZWZhdWx0cyB0aGUgc3RlcCwgc28gaXQgaXMgb3B0aW9uYWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQXRoZW5hJ3MgZGVmYXVsdCB1bml0IGZvciB0aGUgZm9ybWF0J3MgcHJlY2lzaW9uOyByZXF1aXJlZCB3aGVuIGBmb3JtYXRgIGlzIHN1Yi1kYXkgcHJlY2lzaW9uXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbFVuaXQ/OiBEYXRlSW50ZXJ2YWxVbml0O1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIEVOVU0gcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnVtUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBFeHBsaWNpdCBsaXN0IG9mIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlIFsndXMtZWFzdC0xJywgJ3VzLXdlc3QtMicsICdldS13ZXN0LTEnXVxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBwcm9wZXJ0aWVzIGZvciBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbi5cbiAqL1xuaW50ZXJmYWNlIFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgcGFydGl0aW9uIHByb2plY3Rpb24uXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZTtcblxuICAvKipcbiAgICogUmFuZ2Ugb2YgcGFydGl0aW9uIHZhbHVlcyBmb3IgSU5URUdFUiB0eXBlLlxuICAgKlxuICAgKiBBcnJheSBvZiBbbWluLCBtYXhdIGFzIG51bWJlcnMuXG4gICAqL1xuICByZWFkb25seSBpbnRlZ2VyUmFuZ2U/OiBudW1iZXJbXTtcblxuICAvKipcbiAgICogUmFuZ2Ugb2YgcGFydGl0aW9uIHZhbHVlcyBmb3IgREFURSB0eXBlLlxuICAgKlxuICAgKiBBcnJheSBvZiBbc3RhcnQsIGVuZF0gYXMgZGF0ZSBzdHJpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0ZVJhbmdlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEludGVydmFsIGJldHdlZW4gcGFydGl0aW9uIHZhbHVlcy5cbiAgICovXG4gIHJlYWRvbmx5IGludGVydmFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZGlnaXRzIHRvIHBhZCBJTlRFR0VSIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqL1xuICByZWFkb25seSBkaWdpdHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERhdGUgZm9ybWF0IGZvciBEQVRFIHBhcnRpdGlvbiB2YWx1ZXMgKEphdmEgU2ltcGxlRGF0ZUZvcm1hdCkuXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVuaXQgZm9yIERBVEUgcGFydGl0aW9uIGludGVydmFsLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWxVbml0PzogRGF0ZUludGVydmFsVW5pdDtcblxuICAvKipcbiAgICogRXhwbGljaXQgbGlzdCBvZiB2YWx1ZXMgZm9yIEVOVU0gcGFydGl0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBEQVRFIHByb2plY3Rpb24gYGZvcm1hdGAgY2FycmllcyBzdWItZGF5IHByZWNpc2lvbiwgaW4gd2hpY2ggY2FzZVxuICogQXRoZW5hIHJlcXVpcmVzIGJvdGggYGludGVydmFsYCBhbmQgYGludGVydmFsVW5pdGAuXG4gKlxuICogQXRoZW5hIG9ubHkgcmVxdWlyZXMgdGhlIHR3byB3aGVuIHRoZSBmb3JtYXQgY29udGFpbnMgYSBmaWVsZCBmaW5lciB0aGFuIGFcbiAqIGRheSAoaG91ci9taW51dGUvc2Vjb25kL2ZyYWN0aW9uLCBvciBBTS9QTSkuIEF0IGRheSwgbW9udGgsIG9yIGNvYXJzZXJcbiAqIHByZWNpc2lvbiBpdCBkZWZhdWx0cyB0aGUgc3RlcCBhbmQgYWNjZXB0cyB0aGUgZm9ybWF0IHdpdGhvdXQgdGhlbSDigJQgc28sIGUuZy5cbiAqIGEgcGxhaW4gYHl5eXlgIG5lZWRzIG5vIGludGVydmFsLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvcGFydGl0aW9uLXByb2plY3Rpb24tc3VwcG9ydGVkLXR5cGVzLmh0bWwjcGFydGl0aW9uLXByb2plY3Rpb24tZGF0ZS10eXBlXG4gKi9cbmZ1bmN0aW9uIGRhdGVGb3JtYXRSZXF1aXJlc0ludGVydmFsKGZvcm1hdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENvbGxlY3QgdGhlIHVucXVvdGVkIEphdmEgRGF0ZVRpbWVGb3JtYXR0ZXIgcGF0dGVybiBsZXR0ZXJzLCBob25vcmluZyB0aGVcbiAgLy8gc2FtZSBzaW5nbGUtcXVvdGUgbGl0ZXJhbCBlc2NhcGluZyBhcyB0aGUgZm9ybWF0IHZhbGlkYXRpb24gYWJvdmUuXG4gIGNvbnN0IGxldHRlcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgbGV0IGluUXVvdGUgPSBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaCA9IGZvcm1hdFtpXTtcbiAgICBpZiAoY2ggPT09IFwiJ1wiKSB7XG4gICAgICBpZiAoaSArIDEgPCBmb3JtYXQubGVuZ3RoICYmIGZvcm1hdFtpICsgMV0gPT09IFwiJ1wiKSB7XG4gICAgICAgIGkrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluUXVvdGUgPSAhaW5RdW90ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpblF1b3RlICYmIC9bYS16QS1aXS8udGVzdChjaCkpIHtcbiAgICAgIGxldHRlcnMuYWRkKGNoKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdWItZGF5IGZpZWxkcyDigJQgYW55dGhpbmcgZmluZXIgdGhhbiBhIGRheS4gYGFgIChBTS9QTS1vZi1kYXkpIHNwbGl0cyB0aGVcbiAgLy8gZGF5IGluIHR3bywgc28gaXQgY291bnRzIGFsb25nc2lkZSBob3VyL21pbnV0ZS9zZWNvbmQvZnJhY3Rpb24vbmFubzpcbiAgLy8gICBhIGFtL3BtICBoIGNsb2NrLWhvdXIoMS0xMikgIEsgaG91ci1vZi1hbS1wbSgwLTExKSAgayBjbG9jay1ob3VyKDEtMjQpXG4gIC8vICAgSCBob3VyLW9mLWRheSgwLTIzKSAgbSBtaW51dGUgIHMgc2Vjb25kICBTIGZyYWN0aW9uICBBIG1pbGxpLW9mLWRheVxuICAvLyAgIG4gbmFuby1vZi1zZWNvbmQgIE4gbmFuby1vZi1kYXlcbiAgLy8gRXZlcnkgY29hcnNlciBmaWVsZCAoZGF5LCBtb250aCwgeWVhciwgd2VlaywgcXVhcnRlciwgZGF5LW9mLXdlZWspIGlzXG4gIC8vIGFjY2VwdGVkIGJ5IEF0aGVuYSB3aXRob3V0IGFuIGludGVydmFsLCBzbyBvbmx5IHRoZSBzdWItZGF5IHNldCByZXF1aXJlcyBpdC5cbiAgcmV0dXJuIFsuLi4nYWhLa0htc1NBbk4nXS5zb21lKGMgPT4gbGV0dGVycy5oYXMoYykpO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGFuIElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaW50ZWdlcihwcm9wczogSW50ZWdlclBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMpOiBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gICAgLy8gVmFsaWRhdGUgbWluL21heCBhcmUgaW50ZWdlcnNcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5taW4pICYmICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMubWF4KSkge1xuICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHByb3BzLm1pbikgfHwgIU51bWJlci5pc0ludGVnZXIocHJvcHMubWF4KSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YEludGVnZXJSYW5nZU5vdEludGVnZXJzYCxcbiAgICAgICAgICBgSU5URUdFUiBwYXJ0aXRpb24gcHJvamVjdGlvbiByYW5nZSBtdXN0IGNvbnRhaW4gaW50ZWdlcnMsIGJ1dCBnb3QgWyR7cHJvcHMubWlufSwgJHtwcm9wcy5tYXh9XWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIG1pbiA8PSBtYXhcbiAgICAgIGlmIChwcm9wcy5taW4gPiBwcm9wcy5tYXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBJbnRlZ2VyUmFuZ2VNaW5HcmVhdGVyVGhhbk1heGAsXG4gICAgICAgICAgYElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gcmFuZ2UgbXVzdCBiZSBbbWluLCBtYXhdIHdoZXJlIG1pbiA8PSBtYXgsIGJ1dCBnb3QgWyR7cHJvcHMubWlufSwgJHtwcm9wcy5tYXh9XWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW50ZXJ2YWxcbiAgICBpZiAoXG4gICAgICBwcm9wcy5pbnRlcnZhbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLmludGVydmFsKSAmJlxuICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKHByb3BzLmludGVydmFsKSB8fCBwcm9wcy5pbnRlcnZhbCA8PSAwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgSW50ZWdlckludGVydmFsSW52YWxpZGAsXG4gICAgICAgIGBJTlRFR0VSIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGludGVydmFsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBidXQgZ290ICR7cHJvcHMuaW50ZXJ2YWx9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZGlnaXRzXG4gICAgaWYgKFxuICAgICAgcHJvcHMuZGlnaXRzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuZGlnaXRzKSAmJlxuICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKHByb3BzLmRpZ2l0cykgfHwgcHJvcHMuZGlnaXRzIDwgMSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YEludGVnZXJEaWdpdHNJbnZhbGlkYCxcbiAgICAgICAgYElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gZGlnaXRzIG11c3QgYmUgYW4gaW50ZWdlciA+PSAxLCBidXQgZ290ICR7cHJvcHMuZGlnaXRzfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24oe1xuICAgICAgdHlwZTogUGFydGl0aW9uUHJvamVjdGlvblR5cGUuSU5URUdFUixcbiAgICAgIGludGVnZXJSYW5nZTogW3Byb3BzLm1pbiwgcHJvcHMubWF4XSxcbiAgICAgIGludGVydmFsOiBwcm9wcy5pbnRlcnZhbCxcbiAgICAgIGRpZ2l0czogcHJvcHMuZGlnaXRzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERBVEUgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZShwcm9wczogRGF0ZVBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMpOiBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gICAgLy8gVmFsaWRhdGUgbWluL21heCBhcmUgbm90IGVtcHR5XG4gICAgaWYgKFxuICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5taW4pICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLm1heCkgJiZcbiAgICAgIChwcm9wcy5taW4udHJpbSgpID09PSAnJyB8fCBwcm9wcy5tYXgudHJpbSgpID09PSAnJylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YERhdGVSYW5nZUVtcHR5YCxcbiAgICAgICAgJ0RBVEUgcGFydGl0aW9uIHByb2plY3Rpb24gcmFuZ2UgbXVzdCBub3QgY29udGFpbiBlbXB0eSBzdHJpbmdzJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZm9ybWF0XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuZm9ybWF0KSkge1xuICAgICAgLy8gVmFsaWRhdGUgZm9ybWF0IGlzIG5vdCBlbXB0eVxuICAgICAgaWYgKHByb3BzLmZvcm1hdC50cmltKCkgPT09ICcnKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgRGF0ZUZvcm1hdEVtcHR5YCxcbiAgICAgICAgICAnREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBmb3JtYXQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBmb3JtYXQgcGF0dGVybiBjaGFyYWN0ZXJzIChKYXZhIDggRGF0ZVRpbWVGb3JtYXR0ZXIpXG4gICAgICBjb25zdCB2YWxpZFBhdHRlcm5MZXR0ZXJzID0gJ0d5dVlETUxkUXF3V0VlY0ZhaEtrSG1zU0FuTlZ6T1h4WnAnO1xuICAgICAgY29uc3QgZm9ybWF0ID0gcHJvcHMuZm9ybWF0O1xuICAgICAgbGV0IGluUXVvdGUgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGludmFsaWRDaGFyczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2ggPSBmb3JtYXRbaV07XG4gICAgICAgIGlmIChjaCA9PT0gXCInXCIpIHtcbiAgICAgICAgICBpZiAoaSArIDEgPCBmb3JtYXQubGVuZ3RoICYmIGZvcm1hdFtpICsgMV0gPT09IFwiJ1wiKSB7XG4gICAgICAgICAgICAvLyAnJyBpcyBhbiBlc2NhcGVkIHNpbmdsZSBxdW90ZSBsaXRlcmFsLCBza2lwIGJvdGhcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5RdW90ZSA9ICFpblF1b3RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaW5RdW90ZSAmJiAvW2EtekEtWl0vLnRlc3QoY2gpKSB7XG4gICAgICAgICAgaWYgKCF2YWxpZFBhdHRlcm5MZXR0ZXJzLmluY2x1ZGVzKGNoKSkge1xuICAgICAgICAgICAgaW52YWxpZENoYXJzLnB1c2goY2gpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5RdW90ZSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YERhdGVGb3JtYXRVbmNsb3NlZFF1b3RlYCxcbiAgICAgICAgICBgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBmb3JtYXQgaGFzIGFuIHVuY2xvc2VkIHNpbmdsZSBxdW90ZTogJyR7Zm9ybWF0fSdgLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW52YWxpZENoYXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdW5pcXVlID0gWy4uLm5ldyBTZXQoaW52YWxpZENoYXJzKV07XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgRGF0ZUZvcm1hdEludmFsaWRDaGFyYWN0ZXJzYCxcbiAgICAgICAgICBgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBmb3JtYXQgY29udGFpbnMgaW52YWxpZCBwYXR0ZXJuIGNoYXJhY3RlcnM6ICR7dW5pcXVlLmpvaW4oJywgJyl9LiBNdXN0IHVzZSBKYXZhIERhdGVUaW1lRm9ybWF0dGVyIHZhbGlkIHBhdHRlcm4gbGV0dGVycy5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGludGVydmFsXG4gICAgaWYgKFxuICAgICAgcHJvcHMuaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5pbnRlcnZhbCkgJiZcbiAgICAgICghTnVtYmVyLmlzSW50ZWdlcihwcm9wcy5pbnRlcnZhbCkgfHwgcHJvcHMuaW50ZXJ2YWwgPD0gMClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YERhdGVJbnRlcnZhbEludmFsaWRgLFxuICAgICAgICBgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBpbnRlcnZhbCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgYnV0IGdvdCAke3Byb3BzLmludGVydmFsfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEZvciBzdWItZGF5IHByZWNpc2lvbiAoYSBmaWVsZCBmaW5lciB0aGFuIGEgZGF5KSwgQXRoZW5hIHJlcXVpcmVzIGJvdGhcbiAgICAvLyBgaW50ZXJ2YWxgIGFuZCBgaW50ZXJ2YWxVbml0YDsgYXQgZGF5IG9yIGNvYXJzZXIgcHJlY2lzaW9uIGl0IGRlZmF1bHRzXG4gICAgLy8gdGhlbS4gT25seSBlbmZvcmNlIHdoZW4gdGhlIGZvcm1hdCBpcyBhIHJlc29sdmVkIGxpdGVyYWwgd2UgY2FuIGluc3BlY3QuXG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuZm9ybWF0KSAmJiBkYXRlRm9ybWF0UmVxdWlyZXNJbnRlcnZhbChwcm9wcy5mb3JtYXQpKSB7XG4gICAgICBpZiAocHJvcHMuaW50ZXJ2YWwgPT09IHVuZGVmaW5lZCB8fCBwcm9wcy5pbnRlcnZhbFVuaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YERhdGVJbnRlcnZhbFJlcXVpcmVkYCxcbiAgICAgICAgICBgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiB3aXRoIGZvcm1hdCAnJHtwcm9wcy5mb3JtYXR9JyBoYXMgc3ViLWRheSBwcmVjaXNpb24sIHNvIGJvdGggJ2ludGVydmFsJyBhbmQgJ2ludGVydmFsVW5pdCcgYXJlIHJlcXVpcmVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uKHtcbiAgICAgIHR5cGU6IFBhcnRpdGlvblByb2plY3Rpb25UeXBlLkRBVEUsXG4gICAgICBkYXRlUmFuZ2U6IFtwcm9wcy5taW4sIHByb3BzLm1heF0sXG4gICAgICBpbnRlcnZhbDogcHJvcHMuaW50ZXJ2YWwsXG4gICAgICBmb3JtYXQ6IHByb3BzLmZvcm1hdCxcbiAgICAgIGludGVydmFsVW5pdDogcHJvcHMuaW50ZXJ2YWxVbml0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBFTlVNIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGVudW0ocHJvcHM6IEVudW1QYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvblByb3BzKTogUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAgIC8vIFZhbGlkYXRlIHZhbHVlcyBpcyBub3QgZW1wdHlcbiAgICBpZiAocHJvcHMudmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgRW51bVZhbHVlc0VtcHR5YCxcbiAgICAgICAgJ0VOVU0gcGFydGl0aW9uIHByb2plY3Rpb24gdmFsdWVzIG11c3QgYmUgYSBub24tZW1wdHkgYXJyYXknLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmFsdWUgPSBwcm9wcy52YWx1ZXNbaV07XG4gICAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZCh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICBsaXRgRW51bVZhbHVlRW1wdHlgLFxuICAgICAgICAgICAgJ0VOVU0gcGFydGl0aW9uIHByb2plY3Rpb24gdmFsdWVzIG11c3Qgbm90IGNvbnRhaW4gZW1wdHkgc3RyaW5ncycsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoJywnKSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIGxpdGBFbnVtVmFsdWVDb250YWluc0NvbW1hYCxcbiAgICAgICAgICAgIGBFTlVNIHBhcnRpdGlvbiBwcm9qZWN0aW9uIHZhbHVlcyBtdXN0IG5vdCBjb250YWluIGNvbW1hcyBiZWNhdXNlIHRoZSB2YWx1ZXMgYXJlIHNlcmlhbGl6ZWQgYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCwgZ290OiAnJHt2YWx1ZX0nYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbih7XG4gICAgICB0eXBlOiBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5FTlVNLFxuICAgICAgdmFsdWVzOiBwcm9wcy52YWx1ZXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIElOSkVDVEVEIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFBhcnRpdGlvbiB2YWx1ZXMgYXJlIGluamVjdGVkIGF0IHF1ZXJ5IHRpbWUgdGhyb3VnaCB0aGUgcXVlcnkgc3RhdGVtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hdGhlbmEvbGF0ZXN0L3VnL3BhcnRpdGlvbi1wcm9qZWN0aW9uLXN1cHBvcnRlZC10eXBlcy5odG1sI3BhcnRpdGlvbi1wcm9qZWN0aW9uLWluamVjdGVkLXR5cGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaW5qZWN0ZWQoKTogUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24oe1xuICAgICAgdHlwZTogUGFydGl0aW9uUHJvamVjdGlvblR5cGUuSU5KRUNURUQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgcGFydGl0aW9uIHByb2plY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogUGFydGl0aW9uUHJvamVjdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIFJhbmdlIG9mIHBhcnRpdGlvbiB2YWx1ZXMgZm9yIElOVEVHRVIgdHlwZS5cbiAgICpcbiAgICogQXJyYXkgb2YgW21pbiwgbWF4XSBhcyBudW1iZXJzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGludGVnZXJSYW5nZT86IG51bWJlcltdO1xuXG4gIC8qKlxuICAgKiBSYW5nZSBvZiBwYXJ0aXRpb24gdmFsdWVzIGZvciBEQVRFIHR5cGUuXG4gICAqXG4gICAqIEFycmF5IG9mIFtzdGFydCwgZW5kXSBhcyBkYXRlIHN0cmluZ3MuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0ZVJhbmdlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEludGVydmFsIGJldHdlZW4gcGFydGl0aW9uIHZhbHVlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbnRlcnZhbD86IG51bWJlcjtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIGRpZ2l0cyB0byBwYWQgSU5URUdFUiBwYXJ0aXRpb24gdmFsdWVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpZ2l0cz86IG51bWJlcjtcblxuICAvKipcbiAgICogRGF0ZSBmb3JtYXQgZm9yIERBVEUgcGFydGl0aW9uIHZhbHVlcyAoSmF2YSBTaW1wbGVEYXRlRm9ybWF0KS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVuaXQgZm9yIERBVEUgcGFydGl0aW9uIGludGVydmFsLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGludGVydmFsVW5pdD86IERhdGVJbnRlcnZhbFVuaXQ7XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0IGxpc3Qgb2YgdmFsdWVzIGZvciBFTlVNIHBhcnRpdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcm9wczogUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb25Qcm9wcykge1xuICAgIHRoaXMudHlwZSA9IHByb3BzLnR5cGU7XG4gICAgdGhpcy5pbnRlZ2VyUmFuZ2UgPSBwcm9wcy5pbnRlZ2VyUmFuZ2U7XG4gICAgdGhpcy5kYXRlUmFuZ2UgPSBwcm9wcy5kYXRlUmFuZ2U7XG4gICAgdGhpcy5pbnRlcnZhbCA9IHByb3BzLmludGVydmFsO1xuICAgIHRoaXMuZGlnaXRzID0gcHJvcHMuZGlnaXRzO1xuICAgIHRoaXMuZm9ybWF0ID0gcHJvcHMuZm9ybWF0O1xuICAgIHRoaXMuaW50ZXJ2YWxVbml0ID0gcHJvcHMuaW50ZXJ2YWxVbml0O1xuICAgIHRoaXMudmFsdWVzID0gcHJvcHMudmFsdWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgQ2xvdWRGb3JtYXRpb24gcGFyYW1ldGVycyBmb3IgdGhpcyBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uTmFtZSAtIFRoZSBwYXJ0aXRpb24gY29sdW1uIG5hbWVcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3JlbmRlclBhcmFtZXRlcnMoY29sdW1uTmFtZTogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgcGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0udHlwZWBdOiB0aGlzLnR5cGUsXG4gICAgfTtcblxuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFBhcnRpdGlvblByb2plY3Rpb25UeXBlLklOVEVHRVI6IHtcbiAgICAgICAgY29uc3QgW21pbiwgbWF4XSA9IHRoaXMuaW50ZWdlclJhbmdlITtcbiAgICAgICAgcGFyYW1zW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0ucmFuZ2VgXSA9IGAke21pbn0sJHttYXh9YDtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LmludGVydmFsYF0gPSB0aGlzLmludGVydmFsLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGlnaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS5kaWdpdHNgXSA9IHRoaXMuZGlnaXRzLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFBhcnRpdGlvblByb2plY3Rpb25UeXBlLkRBVEU6IHtcbiAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdGhpcy5kYXRlUmFuZ2UhO1xuICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS5yYW5nZWBdID0gYCR7c3RhcnR9LCR7ZW5kfWA7XG4gICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LmZvcm1hdGBdID0gdGhpcy5mb3JtYXQhO1xuICAgICAgICBpZiAodGhpcy5pbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcGFyYW1zW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0uaW50ZXJ2YWxgXSA9IHRoaXMuaW50ZXJ2YWwudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbnRlcnZhbFVuaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LmludGVydmFsLnVuaXRgXSA9IHRoaXMuaW50ZXJ2YWxVbml0O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5FTlVNOiB7XG4gICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LnZhbHVlc2BdID0gdGhpcy52YWx1ZXMhLmpvaW4oJywnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFBhcnRpdGlvblByb2plY3Rpb25UeXBlLklOSkVDVEVEOiB7XG4gICAgICAgIC8vIElOSkVDVEVEIGhhcyBubyBhZGRpdGlvbmFsIHBhcmFtZXRlcnNcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIFR5cGVTY3JpcHQgZXhoYXVzdGl2ZW5lc3MgY2hlY2tcbiAgICAgICAgY29uc3QgZXhoYXVzdGl2ZUNoZWNrOiBuZXZlciA9IHRoaXMudHlwZTtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBVbmtub3duUHJvamVjdGlvblR5cGVgLFxuICAgICAgICAgIGBVbmtub3duIHBhcnRpdGlvbiBwcm9qZWN0aW9uIHR5cGUgZm9yIFwiJHtjb2x1bW5OYW1lfVwiOiAke2V4aGF1c3RpdmVDaGVja31gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uIGZvciBhIHRhYmxlLlxuICpcbiAqIE1hcHMgcGFydGl0aW9uIGNvbHVtbiBuYW1lcyB0byB0aGVpciBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICogVGhlIGtleSBpcyB0aGUgcGFydGl0aW9uIGNvbHVtbiBuYW1lLCB0aGUgdmFsdWUgaXMgdGhlIHBhcnRpdGlvbiBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgdHlwZSBQYXJ0aXRpb25Qcm9qZWN0aW9uID0ge1xuICBbY29sdW1uTmFtZTogc3RyaW5nXTogUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb247XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBDbG91ZEZvcm1hdGlvbiBwYXJhbWV0ZXJzIGZvciBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uLlxuICpcbiAqIEBwYXJhbSBjb2x1bW5OYW1lIC0gVGhlIHBhcnRpdGlvbiBjb2x1bW4gbmFtZVxuICogQHBhcmFtIGNvbmZpZyAtIFRoZSBwYXJ0aXRpb24gY29uZmlndXJhdGlvblxuICogQHJldHVybnMgQ2xvdWRGb3JtYXRpb24gcGFyYW1ldGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVQYXJ0aXRpb25Qcm9qZWN0aW9uUGFyYW1ldGVycyhcbiAgY29sdW1uTmFtZTogc3RyaW5nLFxuICBjb25maWc6IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uLFxuKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gIHJldHVybiBjb25maWcuX3JlbmRlclBhcmFtZXRlcnMoY29sdW1uTmFtZSk7XG59XG4iXX0=
381
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFydGl0aW9uLXByb2plY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwYXJ0aXRpb24tcHJvamVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE0a0JBLHNGQUtDOzs7QUFqbEJELDZDQUE2RDtBQUM3RCw0RUFBNEQ7QUFFNUQ7Ozs7OztHQU1HO0FBQ0gsSUFBWSx1QkFvQlg7QUFwQkQsV0FBWSx1QkFBdUI7SUFDakM7O09BRUc7SUFDSCw4Q0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILHdDQUFhLENBQUE7SUFFYjs7T0FFRztJQUNILHdDQUFhLENBQUE7SUFFYjs7T0FFRztJQUNILGdEQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFwQlcsdUJBQXVCLHVDQUF2Qix1QkFBdUIsUUFvQmxDO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksZ0JBbUNYO0FBbkNELFdBQVksZ0JBQWdCO0lBQzFCOztPQUVHO0lBQ0gsbUNBQWUsQ0FBQTtJQUVmOztPQUVHO0lBQ0gscUNBQWlCLENBQUE7SUFFakI7O09BRUc7SUFDSCxtQ0FBZSxDQUFBO0lBRWY7O09BRUc7SUFDSCxpQ0FBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCxtQ0FBZSxDQUFBO0lBRWY7O09BRUc7SUFDSCx1Q0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILHVDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFuQ1csZ0JBQWdCLGdDQUFoQixnQkFBZ0IsUUFtQzNCO0FBa0tEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLDBCQUEwQixDQUFDLE1BQWM7SUFDaEQsNEVBQTRFO0lBQzVFLHFFQUFxRTtJQUNyRSxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ2xDLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZD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QkFDaEMsTUFBTSxDQUFDLGNBQWMsVUFBVSxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN6RSxDQUFDO2dCQUNELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsTUFBTSxDQUFDLGNBQWMsVUFBVSxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZFLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLE1BQU0sQ0FBQyxjQUFjLFVBQVUsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25FLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUN0Qyx3Q0FBd0M7Z0JBQ3hDLE1BQU07WUFDUixDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDUixrQ0FBa0M7Z0JBQ2xDLE1BQU0sZUFBZSxHQUFVLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3pDLE1BQU0sSUFBSSxxQ0FBdUIsQ0FDL0IsSUFBQSxzQkFBRyxFQUFBLHVCQUF1QixFQUMxQiwwQ0FBMEMsVUFBVSxNQUFNLGVBQWUsRUFBRSxDQUM1RSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztLQUNmOztBQXBTSCw0RUFxU0M7QUFZRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixxQ0FBcUMsQ0FDbkQsVUFBa0IsRUFDbEIsTUFBd0M7SUFFeEMsT0FBTyxNQUFNLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRva2VuLCBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuXG4vKipcbiAqIFBhcnRpdGlvbiBwcm9qZWN0aW9uIHR5cGUuXG4gKlxuICogRGV0ZXJtaW5lcyBob3cgQXRoZW5hIHByb2plY3RzIHBhcnRpdGlvbiB2YWx1ZXMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXRoZW5hL2xhdGVzdC91Zy9wYXJ0aXRpb24tcHJvamVjdGlvbi1zdXBwb3J0ZWQtdHlwZXMuaHRtbFxuICovXG5leHBvcnQgZW51bSBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZSB7XG4gIC8qKlxuICAgKiBQcm9qZWN0IHBhcnRpdGlvbiB2YWx1ZXMgYXMgaW50ZWdlcnMgd2l0aGluIGEgcmFuZ2UuXG4gICAqL1xuICBJTlRFR0VSID0gJ2ludGVnZXInLFxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IHBhcnRpdGlvbiB2YWx1ZXMgYXMgZGF0ZXMgd2l0aGluIGEgcmFuZ2UuXG4gICAqL1xuICBEQVRFID0gJ2RhdGUnLFxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IHBhcnRpdGlvbiB2YWx1ZXMgZnJvbSBhbiBleHBsaWNpdCBsaXN0IG9mIHZhbHVlcy5cbiAgICovXG4gIEVOVU0gPSAnZW51bScsXG5cbiAgLyoqXG4gICAqIFByb2plY3QgcGFydGl0aW9uIHZhbHVlcyB0aGF0IGFyZSBpbmplY3RlZCBhdCBxdWVyeSB0aW1lLlxuICAgKi9cbiAgSU5KRUNURUQgPSAnaW5qZWN0ZWQnLFxufVxuXG4vKipcbiAqIERhdGUgaW50ZXJ2YWwgdW5pdCBmb3IgcGFydGl0aW9uIHByb2plY3Rpb24uXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXRoZW5hL2xhdGVzdC91Zy9wYXJ0aXRpb24tcHJvamVjdGlvbi1zdXBwb3J0ZWQtdHlwZXMuaHRtbCNwYXJ0aXRpb24tcHJvamVjdGlvbi1kYXRlLXR5cGVcbiAqL1xuZXhwb3J0IGVudW0gRGF0ZUludGVydmFsVW5pdCB7XG4gIC8qKlxuICAgKiBZZWFyIGludGVydmFsLlxuICAgKi9cbiAgWUVBUlMgPSAnWUVBUlMnLFxuXG4gIC8qKlxuICAgKiBNb250aCBpbnRlcnZhbC5cbiAgICovXG4gIE1PTlRIUyA9ICdNT05USFMnLFxuXG4gIC8qKlxuICAgKiBXZWVrIGludGVydmFsLlxuICAgKi9cbiAgV0VFS1MgPSAnV0VFS1MnLFxuXG4gIC8qKlxuICAgKiBEYXkgaW50ZXJ2YWwgKGRlZmF1bHQpLlxuICAgKi9cbiAgREFZUyA9ICdEQVlTJyxcblxuICAvKipcbiAgICogSG91ciBpbnRlcnZhbC5cbiAgICovXG4gIEhPVVJTID0gJ0hPVVJTJyxcblxuICAvKipcbiAgICogTWludXRlIGludGVydmFsLlxuICAgKi9cbiAgTUlOVVRFUyA9ICdNSU5VVEVTJyxcblxuICAvKipcbiAgICogU2Vjb25kIGludGVydmFsLlxuICAgKi9cbiAgU0VDT05EUyA9ICdTRUNPTkRTJyxcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBJTlRFR0VSIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZWdlclBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMge1xuICAvKipcbiAgICogTWluaW11bSB2YWx1ZSBmb3IgdGhlIGludGVnZXIgcGFydGl0aW9uIHJhbmdlIChpbmNsdXNpdmUpLlxuICAgKi9cbiAgcmVhZG9ubHkgbWluOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdmFsdWUgZm9yIHRoZSBpbnRlZ2VyIHBhcnRpdGlvbiByYW5nZSAoaW5jbHVzaXZlKS5cbiAgICovXG4gIHJlYWRvbmx5IG1heDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJbnRlcnZhbCBiZXR3ZWVuIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIHJlYWRvbmx5IGludGVydmFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZGlnaXRzIHRvIHBhZCB0aGUgcGFydGl0aW9uIHZhbHVlIHdpdGggbGVhZGluZyB6ZXJvcy5cbiAgICpcbiAgICogV2l0aCBkaWdpdHM6IDQsIHBhcnRpdGlvbiB2YWx1ZXM6IDAwMDEsIDAwMDIsIC4uLiwgMDEwMFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHN0YXRpYyBudW1iZXIgb2YgZGlnaXRzIGFuZCBubyBsZWFkaW5nIHplcm9lc1xuICAgKi9cbiAgcmVhZG9ubHkgZGlnaXRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgcmVxdWlyZWQtdG9nZXRoZXIgaW50ZXJ2YWwgc3RlcCBmb3IgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbi5cbiAqXG4gKiBCdW5kbGluZyBgaW50ZXJ2YWxgIGFuZCBgaW50ZXJ2YWxVbml0YCBpbnRvIG9uZSB2YWx1ZSBtYWtlcyBhIHBhcnRpYWwgc3RlcFxuICogKG9uZSB3aXRob3V0IHRoZSBvdGhlcikgdW5yZXByZXNlbnRhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGVQcm9qZWN0aW9uU3RlcCB7XG4gIC8qKlxuICAgKiBJbnRlcnZhbCBiZXR3ZWVuIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBVbml0IGZvciB0aGUgaW50ZXJ2YWwuXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbFVuaXQ6IERhdGVJbnRlcnZhbFVuaXQ7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGVQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvblByb3BzIHtcbiAgLyoqXG4gICAqIFN0YXJ0IGRhdGUgZm9yIHRoZSBwYXJ0aXRpb24gcmFuZ2UgKGluY2x1c2l2ZSkuXG4gICAqXG4gICAqIENhbiBiZSBlaXRoZXI6XG4gICAqIC0gRml4ZWQgZGF0ZSBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSBgZm9ybWF0YCBwcm9wZXJ0eVxuICAgKiAgIChlLmcuLCAnMjAyMC0wMS0wMScgZm9yIGZvcm1hdCAneXl5eS1NTS1kZCcpXG4gICAqIC0gUmVsYXRpdmUgZGF0ZSB1c2luZyBOT1cgc3ludGF4XG4gICAqICAgKGUuZy4sICdOT1cnLCAnTk9XLTNZRUFSUycsICdOT1crMU1PTlRIJylcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXRoZW5hL2xhdGVzdC91Zy9wYXJ0aXRpb24tcHJvamVjdGlvbi1zdXBwb3J0ZWQtdHlwZXMuaHRtbCNwYXJ0aXRpb24tcHJvamVjdGlvbi1kYXRlLXR5cGVcbiAgICovXG4gIHJlYWRvbmx5IG1pbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbmQgZGF0ZSBmb3IgdGhlIHBhcnRpdGlvbiByYW5nZSAoaW5jbHVzaXZlKS5cbiAgICpcbiAgICogQ2FuIGJlIGVpdGhlcjpcbiAgICogLSBGaXhlZCBkYXRlIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IGBmb3JtYXRgIHByb3BlcnR5XG4gICAqIC0gUmVsYXRpdmUgZGF0ZSB1c2luZyBOT1cgc3ludGF4XG4gICAqXG4gICAqIFNhbWUgZm9ybWF0IGNvbnN0cmFpbnRzIGFzIGBtaW5gLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERhdGUgZm9ybWF0IGZvciBwYXJ0aXRpb24gdmFsdWVzLlxuICAgKlxuICAgKiBVc2VzIEphdmEgU2ltcGxlRGF0ZUZvcm1hdCBwYXR0ZXJucy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL2FwaS9qYXZhL3RleHQvU2ltcGxlRGF0ZUZvcm1hdC5odG1sXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ6IHN0cmluZztcblxuICAvKipcbiAgICogSW50ZXJ2YWwgc3RlcCAoYGludGVydmFsYCArIGBpbnRlcnZhbFVuaXRgKSBiZXR3ZWVuIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqXG4gICAqIFRoZSB0d28gYXJlIHN1cHBsaWVkIHRvZ2V0aGVyLCBzbyBhIHBhcnRpYWwgc3RlcCBjYW5ub3QgYmUgZXhwcmVzc2VkLlxuICAgKiBSZXF1aXJlZCB3aGVuIGBmb3JtYXRgIGNhcnJpZXMgc3ViLWRheSBwcmVjaXNpb24g4oCUIGEgZmllbGQgZmluZXIgdGhhbiBhXG4gICAqIGRheSwgc3VjaCBhcyBob3VycyBvciBBTS9QTTsgYXQgZGF5IG9yIGNvYXJzZXIgcHJlY2lzaW9uIEF0aGVuYSBkZWZhdWx0c1xuICAgKiB0aGUgc3RlcCwgc28gaXQgbWF5IGJlIG9taXR0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQXRoZW5hJ3MgZGVmYXVsdCBzdGVwIGZvciB0aGUgZm9ybWF0J3MgcHJlY2lzaW9uOyByZXF1aXJlZCB3aGVuIGBmb3JtYXRgIGlzIHN1Yi1kYXkgcHJlY2lzaW9uXG4gICAqL1xuICByZWFkb25seSBzdGVwPzogRGF0ZVByb2plY3Rpb25TdGVwO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIEVOVU0gcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnVtUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBFeHBsaWNpdCBsaXN0IG9mIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlIFsndXMtZWFzdC0xJywgJ3VzLXdlc3QtMicsICdldS13ZXN0LTEnXVxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBwcm9wZXJ0aWVzIGZvciBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbi5cbiAqL1xuaW50ZXJmYWNlIFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgcGFydGl0aW9uIHByb2plY3Rpb24uXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZTtcblxuICAvKipcbiAgICogUmFuZ2Ugb2YgcGFydGl0aW9uIHZhbHVlcyBmb3IgSU5URUdFUiB0eXBlLlxuICAgKlxuICAgKiBBcnJheSBvZiBbbWluLCBtYXhdIGFzIG51bWJlcnMuXG4gICAqL1xuICByZWFkb25seSBpbnRlZ2VyUmFuZ2U/OiBudW1iZXJbXTtcblxuICAvKipcbiAgICogUmFuZ2Ugb2YgcGFydGl0aW9uIHZhbHVlcyBmb3IgREFURSB0eXBlLlxuICAgKlxuICAgKiBBcnJheSBvZiBbc3RhcnQsIGVuZF0gYXMgZGF0ZSBzdHJpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0ZVJhbmdlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEludGVydmFsIGJldHdlZW4gcGFydGl0aW9uIHZhbHVlcy5cbiAgICovXG4gIHJlYWRvbmx5IGludGVydmFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZGlnaXRzIHRvIHBhZCBJTlRFR0VSIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqL1xuICByZWFkb25seSBkaWdpdHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERhdGUgZm9ybWF0IGZvciBEQVRFIHBhcnRpdGlvbiB2YWx1ZXMgKEphdmEgU2ltcGxlRGF0ZUZvcm1hdCkuXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVuaXQgZm9yIERBVEUgcGFydGl0aW9uIGludGVydmFsLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWxVbml0PzogRGF0ZUludGVydmFsVW5pdDtcblxuICAvKipcbiAgICogRXhwbGljaXQgbGlzdCBvZiB2YWx1ZXMgZm9yIEVOVU0gcGFydGl0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBEQVRFIHByb2plY3Rpb24gYGZvcm1hdGAgY2FycmllcyBzdWItZGF5IHByZWNpc2lvbiwgaW4gd2hpY2ggY2FzZVxuICogQXRoZW5hIHJlcXVpcmVzIGJvdGggYGludGVydmFsYCBhbmQgYGludGVydmFsVW5pdGAuXG4gKlxuICogQXRoZW5hIG9ubHkgcmVxdWlyZXMgdGhlIHR3byB3aGVuIHRoZSBmb3JtYXQgY29udGFpbnMgYSBmaWVsZCBmaW5lciB0aGFuIGFcbiAqIGRheSAoaG91ci9taW51dGUvc2Vjb25kL2ZyYWN0aW9uLCBvciBBTS9QTSkuIEF0IGRheSwgbW9udGgsIG9yIGNvYXJzZXJcbiAqIHByZWNpc2lvbiBpdCBkZWZhdWx0cyB0aGUgc3RlcCBhbmQgYWNjZXB0cyB0aGUgZm9ybWF0IHdpdGhvdXQgdGhlbSDigJQgc28sIGUuZy5cbiAqIGEgcGxhaW4gYHl5eXlgIG5lZWRzIG5vIGludGVydmFsLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvcGFydGl0aW9uLXByb2plY3Rpb24tc3VwcG9ydGVkLXR5cGVzLmh0bWwjcGFydGl0aW9uLXByb2plY3Rpb24tZGF0ZS10eXBlXG4gKi9cbmZ1bmN0aW9uIGRhdGVGb3JtYXRSZXF1aXJlc0ludGVydmFsKGZvcm1hdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENvbGxlY3QgdGhlIHVucXVvdGVkIEphdmEgRGF0ZVRpbWVGb3JtYXR0ZXIgcGF0dGVybiBsZXR0ZXJzLCBob25vcmluZyB0aGVcbiAgLy8gc2FtZSBzaW5nbGUtcXVvdGUgbGl0ZXJhbCBlc2NhcGluZyBhcyB0aGUgZm9ybWF0IHZhbGlkYXRpb24gYWJvdmUuXG4gIGNvbnN0IGxldHRlcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgbGV0IGluUXVvdGUgPSBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaCA9IGZvcm1hdFtpXTtcbiAgICBpZiAoY2ggPT09IFwiJ1wiKSB7XG4gICAgICBpZiAoaSArIDEgPCBmb3JtYXQubGVuZ3RoICYmIGZvcm1hdFtpICsgMV0gPT09IFwiJ1wiKSB7XG4gICAgICAgIGkrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluUXVvdGUgPSAhaW5RdW90ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpblF1b3RlICYmIC9bYS16QS1aXS8udGVzdChjaCkpIHtcbiAgICAgIGxldHRlcnMuYWRkKGNoKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdWItZGF5IGZpZWxkcyDigJQgYW55dGhpbmcgZmluZXIgdGhhbiBhIGRheS4gYGFgIChBTS9QTS1vZi1kYXkpIHNwbGl0cyB0aGVcbiAgLy8gZGF5IGluIHR3bywgc28gaXQgY291bnRzIGFsb25nc2lkZSBob3VyL21pbnV0ZS9zZWNvbmQvZnJhY3Rpb24vbmFubzpcbiAgLy8gICBhIGFtL3BtICBoIGNsb2NrLWhvdXIoMS0xMikgIEsgaG91ci1vZi1hbS1wbSgwLTExKSAgayBjbG9jay1ob3VyKDEtMjQpXG4gIC8vICAgSCBob3VyLW9mLWRheSgwLTIzKSAgbSBtaW51dGUgIHMgc2Vjb25kICBTIGZyYWN0aW9uICBBIG1pbGxpLW9mLWRheVxuICAvLyAgIG4gbmFuby1vZi1zZWNvbmQgIE4gbmFuby1vZi1kYXlcbiAgLy8gRXZlcnkgY29hcnNlciBmaWVsZCAoZGF5LCBtb250aCwgeWVhciwgd2VlaywgcXVhcnRlciwgZGF5LW9mLXdlZWspIGlzXG4gIC8vIGFjY2VwdGVkIGJ5IEF0aGVuYSB3aXRob3V0IGFuIGludGVydmFsLCBzbyBvbmx5IHRoZSBzdWItZGF5IHNldCByZXF1aXJlcyBpdC5cbiAgcmV0dXJuIFsuLi4nYWhLa0htc1NBbk4nXS5zb21lKGMgPT4gbGV0dGVycy5oYXMoYykpO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGFuIElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaW50ZWdlcihwcm9wczogSW50ZWdlclBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMpOiBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gICAgLy8gVmFsaWRhdGUgbWluL21heCBhcmUgaW50ZWdlcnNcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5taW4pICYmICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMubWF4KSkge1xuICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHByb3BzLm1pbikgfHwgIU51bWJlci5pc0ludGVnZXIocHJvcHMubWF4KSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YEludGVnZXJSYW5nZU5vdEludGVnZXJzYCxcbiAgICAgICAgICBgSU5URUdFUiBwYXJ0aXRpb24gcHJvamVjdGlvbiByYW5nZSBtdXN0IGNvbnRhaW4gaW50ZWdlcnMsIGJ1dCBnb3QgWyR7cHJvcHMubWlufSwgJHtwcm9wcy5tYXh9XWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIG1pbiA8PSBtYXhcbiAgICAgIGlmIChwcm9wcy5taW4gPiBwcm9wcy5tYXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBJbnRlZ2VyUmFuZ2VNaW5HcmVhdGVyVGhhbk1heGAsXG4gICAgICAgICAgYElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gcmFuZ2UgbXVzdCBiZSBbbWluLCBtYXhdIHdoZXJlIG1pbiA8PSBtYXgsIGJ1dCBnb3QgWyR7cHJvcHMubWlufSwgJHtwcm9wcy5tYXh9XWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW50ZXJ2YWxcbiAgICBpZiAoXG4gICAgICBwcm9wcy5pbnRlcnZhbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLmludGVydmFsKSAmJlxuICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKHByb3BzLmludGVydmFsKSB8fCBwcm9wcy5pbnRlcnZhbCA8PSAwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgSW50ZWdlckludGVydmFsSW52YWxpZGAsXG4gICAgICAgIGBJTlRFR0VSIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGludGVydmFsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBidXQgZ290ICR7cHJvcHMuaW50ZXJ2YWx9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZGlnaXRzXG4gICAgaWYgKFxuICAgICAgcHJvcHMuZGlnaXRzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuZGlnaXRzKSAmJlxuICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKHByb3BzLmRpZ2l0cykgfHwgcHJvcHMuZGlnaXRzIDwgMSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YEludGVnZXJEaWdpdHNJbnZhbGlkYCxcbiAgICAgICAgYElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gZGlnaXRzIG11c3QgYmUgYW4gaW50ZWdlciA+PSAxLCBidXQgZ290ICR7cHJvcHMuZGlnaXRzfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24oe1xuICAgICAgdHlwZTogUGFydGl0aW9uUHJvamVjdGlvblR5cGUuSU5URUdFUixcbiAgICAgIGludGVnZXJSYW5nZTogW3Byb3BzLm1pbiwgcHJvcHMubWF4XSxcbiAgICAgIGludGVydmFsOiBwcm9wcy5pbnRlcnZhbCxcbiAgICAgIGRpZ2l0czogcHJvcHMuZGlnaXRzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERBVEUgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZShwcm9wczogRGF0ZVBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMpOiBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gICAgLy8gVmFsaWRhdGUgbWluL21heCBhcmUgbm90IGVtcHR5XG4gICAgaWYgKFxuICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5taW4pICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLm1heCkgJiZcbiAgICAgIChwcm9wcy5taW4udHJpbSgpID09PSAnJyB8fCBwcm9wcy5tYXgudHJpbSgpID09PSAnJylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YERhdGVSYW5nZUVtcHR5YCxcbiAgICAgICAgJ0RBVEUgcGFydGl0aW9uIHByb2plY3Rpb24gcmFuZ2UgbXVzdCBub3QgY29udGFpbiBlbXB0eSBzdHJpbmdzJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZm9ybWF0XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuZm9ybWF0KSkge1xuICAgICAgLy8gVmFsaWRhdGUgZm9ybWF0IGlzIG5vdCBlbXB0eVxuICAgICAgaWYgKHByb3BzLmZvcm1hdC50cmltKCkgPT09ICcnKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgRGF0ZUZvcm1hdEVtcHR5YCxcbiAgICAgICAgICAnREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBmb3JtYXQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBmb3JtYXQgcGF0dGVybiBjaGFyYWN0ZXJzIChKYXZhIDggRGF0ZVRpbWVGb3JtYXR0ZXIpXG4gICAgICBjb25zdCB2YWxpZFBhdHRlcm5MZXR0ZXJzID0gJ0d5dVlETUxkUXF3V0VlY0ZhaEtrSG1zU0FuTlZ6T1h4WnAnO1xuICAgICAgY29uc3QgZm9ybWF0ID0gcHJvcHMuZm9ybWF0O1xuICAgICAgbGV0IGluUXVvdGUgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGludmFsaWRDaGFyczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2ggPSBmb3JtYXRbaV07XG4gICAgICAgIGlmIChjaCA9PT0gXCInXCIpIHtcbiAgICAgICAgICBpZiAoaSArIDEgPCBmb3JtYXQubGVuZ3RoICYmIGZvcm1hdFtpICsgMV0gPT09IFwiJ1wiKSB7XG4gICAgICAgICAgICAvLyAnJyBpcyBhbiBlc2NhcGVkIHNpbmdsZSBxdW90ZSBsaXRlcmFsLCBza2lwIGJvdGhcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5RdW90ZSA9ICFpblF1b3RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaW5RdW90ZSAmJiAvW2EtekEtWl0vLnRlc3QoY2gpKSB7XG4gICAgICAgICAgaWYgKCF2YWxpZFBhdHRlcm5MZXR0ZXJzLmluY2x1ZGVzKGNoKSkge1xuICAgICAgICAgICAgaW52YWxpZENoYXJzLnB1c2goY2gpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5RdW90ZSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YERhdGVGb3JtYXRVbmNsb3NlZFF1b3RlYCxcbiAgICAgICAgICBgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBmb3JtYXQgaGFzIGFuIHVuY2xvc2VkIHNpbmdsZSBxdW90ZTogJyR7Zm9ybWF0fSdgLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW52YWxpZENoYXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdW5pcXVlID0gWy4uLm5ldyBTZXQoaW52YWxpZENoYXJzKV07XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgRGF0ZUZvcm1hdEludmFsaWRDaGFyYWN0ZXJzYCxcbiAgICAgICAgICBgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBmb3JtYXQgY29udGFpbnMgaW52YWxpZCBwYXR0ZXJuIGNoYXJhY3RlcnM6ICR7dW5pcXVlLmpvaW4oJywgJyl9LiBNdXN0IHVzZSBKYXZhIERhdGVUaW1lRm9ybWF0dGVyIHZhbGlkIHBhdHRlcm4gbGV0dGVycy5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGludGVydmFsXG4gICAgaWYgKFxuICAgICAgcHJvcHMuc3RlcCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLnN0ZXAuaW50ZXJ2YWwpICYmXG4gICAgICAoIU51bWJlci5pc0ludGVnZXIocHJvcHMuc3RlcC5pbnRlcnZhbCkgfHwgcHJvcHMuc3RlcC5pbnRlcnZhbCA8PSAwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgRGF0ZUludGVydmFsSW52YWxpZGAsXG4gICAgICAgIGBEQVRFIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGludGVydmFsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBidXQgZ290ICR7cHJvcHMuc3RlcC5pbnRlcnZhbH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGb3Igc3ViLWRheSBwcmVjaXNpb24gKGEgZmllbGQgZmluZXIgdGhhbiBhIGRheSksIEF0aGVuYSByZXF1aXJlcyBhIHN0ZXA7XG4gICAgLy8gYXQgZGF5IG9yIGNvYXJzZXIgcHJlY2lzaW9uIGl0IGRlZmF1bHRzIG9uZS4gVGhlIGludGVydmFsL3VuaXQgcGFpcmluZyBpc1xuICAgIC8vIG5vdyBndWFyYW50ZWVkIGJ5IHRoZSBgc3RlcGAgdHlwZSwgc28gb25seSB0aGUgXCJzdWItZGF5IGZvcm1hdCBuZWVkcyBhXG4gICAgLy8gc3RlcCBhdCBhbGxcIiByZXF1aXJlbWVudCByZW1haW5zLiBFbmZvcmNlIG9ubHkgd2hlbiB0aGUgZm9ybWF0IGlzIGFcbiAgICAvLyByZXNvbHZlZCBsaXRlcmFsIHdlIGNhbiBpbnNwZWN0LlxuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLmZvcm1hdCkgJiYgZGF0ZUZvcm1hdFJlcXVpcmVzSW50ZXJ2YWwocHJvcHMuZm9ybWF0KSAmJiBwcm9wcy5zdGVwID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YERhdGVTdGVwUmVxdWlyZWRgLFxuICAgICAgICBgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiB3aXRoIGZvcm1hdCAnJHtwcm9wcy5mb3JtYXR9JyBoYXMgc3ViLWRheSBwcmVjaXNpb24sIHNvICdzdGVwJyAoaW50ZXJ2YWwgYW5kIGludGVydmFsVW5pdCkgaXMgcmVxdWlyZWRgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uKHtcbiAgICAgIHR5cGU6IFBhcnRpdGlvblByb2plY3Rpb25UeXBlLkRBVEUsXG4gICAgICBkYXRlUmFuZ2U6IFtwcm9wcy5taW4sIHByb3BzLm1heF0sXG4gICAgICBpbnRlcnZhbDogcHJvcHMuc3RlcD8uaW50ZXJ2YWwsXG4gICAgICBmb3JtYXQ6IHByb3BzLmZvcm1hdCxcbiAgICAgIGludGVydmFsVW5pdDogcHJvcHMuc3RlcD8uaW50ZXJ2YWxVbml0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBFTlVNIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGVudW0ocHJvcHM6IEVudW1QYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvblByb3BzKTogUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAgIC8vIFZhbGlkYXRlIHZhbHVlcyBpcyBub3QgZW1wdHlcbiAgICBpZiAocHJvcHMudmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgRW51bVZhbHVlc0VtcHR5YCxcbiAgICAgICAgJ0VOVU0gcGFydGl0aW9uIHByb2plY3Rpb24gdmFsdWVzIG11c3QgYmUgYSBub24tZW1wdHkgYXJyYXknLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmFsdWUgPSBwcm9wcy52YWx1ZXNbaV07XG4gICAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZCh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICBsaXRgRW51bVZhbHVlRW1wdHlgLFxuICAgICAgICAgICAgJ0VOVU0gcGFydGl0aW9uIHByb2plY3Rpb24gdmFsdWVzIG11c3Qgbm90IGNvbnRhaW4gZW1wdHkgc3RyaW5ncycsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoJywnKSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIGxpdGBFbnVtVmFsdWVDb250YWluc0NvbW1hYCxcbiAgICAgICAgICAgIGBFTlVNIHBhcnRpdGlvbiBwcm9qZWN0aW9uIHZhbHVlcyBtdXN0IG5vdCBjb250YWluIGNvbW1hcyBiZWNhdXNlIHRoZSB2YWx1ZXMgYXJlIHNlcmlhbGl6ZWQgYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCwgZ290OiAnJHt2YWx1ZX0nYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbih7XG4gICAgICB0eXBlOiBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5FTlVNLFxuICAgICAgdmFsdWVzOiBwcm9wcy52YWx1ZXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIElOSkVDVEVEIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFBhcnRpdGlvbiB2YWx1ZXMgYXJlIGluamVjdGVkIGF0IHF1ZXJ5IHRpbWUgdGhyb3VnaCB0aGUgcXVlcnkgc3RhdGVtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hdGhlbmEvbGF0ZXN0L3VnL3BhcnRpdGlvbi1wcm9qZWN0aW9uLXN1cHBvcnRlZC10eXBlcy5odG1sI3BhcnRpdGlvbi1wcm9qZWN0aW9uLWluamVjdGVkLXR5cGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaW5qZWN0ZWQoKTogUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24oe1xuICAgICAgdHlwZTogUGFydGl0aW9uUHJvamVjdGlvblR5cGUuSU5KRUNURUQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgcGFydGl0aW9uIHByb2plY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogUGFydGl0aW9uUHJvamVjdGlvblR5cGU7XG5cbiAgLyoqIFJhbmdlIFttaW4sIG1heF0gZm9yIElOVEVHRVIgdHlwZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlZ2VyUmFuZ2U/OiBudW1iZXJbXTtcblxuICAvKiogUmFuZ2UgW3N0YXJ0LCBlbmRdIGZvciBEQVRFIHR5cGUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0ZVJhbmdlPzogc3RyaW5nW107XG5cbiAgLyoqIEludGVydmFsIGJldHdlZW4gcGFydGl0aW9uIHZhbHVlcyAoSU5URUdFUiwgb3IgREFURSBzdGVwKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnZhbD86IG51bWJlcjtcblxuICAvKiogTnVtYmVyIG9mIGRpZ2l0cyB0byBwYWQgSU5URUdFUiBwYXJ0aXRpb24gdmFsdWVzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRpZ2l0cz86IG51bWJlcjtcblxuICAvKiogRGF0ZSBmb3JtYXQgZm9yIERBVEUgcGFydGl0aW9uIHZhbHVlcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqIFVuaXQgZm9yIHRoZSBEQVRFIHBhcnRpdGlvbiBpbnRlcnZhbC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnZhbFVuaXQ/OiBEYXRlSW50ZXJ2YWxVbml0O1xuXG4gIC8qKiBFeHBsaWNpdCBsaXN0IG9mIHZhbHVlcyBmb3IgRU5VTSBwYXJ0aXRpb25zLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJvcHM6IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMpIHtcbiAgICB0aGlzLnR5cGUgPSBwcm9wcy50eXBlO1xuICAgIHRoaXMuaW50ZWdlclJhbmdlID0gcHJvcHMuaW50ZWdlclJhbmdlO1xuICAgIHRoaXMuZGF0ZVJhbmdlID0gcHJvcHMuZGF0ZVJhbmdlO1xuICAgIHRoaXMuaW50ZXJ2YWwgPSBwcm9wcy5pbnRlcnZhbDtcbiAgICB0aGlzLmRpZ2l0cyA9IHByb3BzLmRpZ2l0cztcbiAgICB0aGlzLmZvcm1hdCA9IHByb3BzLmZvcm1hdDtcbiAgICB0aGlzLmludGVydmFsVW5pdCA9IHByb3BzLmludGVydmFsVW5pdDtcbiAgICB0aGlzLnZhbHVlcyA9IHByb3BzLnZhbHVlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIENsb3VkRm9ybWF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoaXMgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNvbHVtbk5hbWUgLSBUaGUgcGFydGl0aW9uIGNvbHVtbiBuYW1lXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9yZW5kZXJQYXJhbWV0ZXJzKGNvbHVtbk5hbWU6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgIFtgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LnR5cGVgXTogdGhpcy50eXBlLFxuICAgIH07XG5cbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5JTlRFR0VSOiB7XG4gICAgICAgIGNvbnN0IFttaW4sIG1heF0gPSB0aGlzLmludGVnZXJSYW5nZSE7XG4gICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LnJhbmdlYF0gPSBgJHttaW59LCR7bWF4fWA7XG4gICAgICAgIGlmICh0aGlzLmludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS5pbnRlcnZhbGBdID0gdGhpcy5pbnRlcnZhbC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRpZ2l0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcGFyYW1zW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0uZGlnaXRzYF0gPSB0aGlzLmRpZ2l0cy50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5EQVRFOiB7XG4gICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMuZGF0ZVJhbmdlITtcbiAgICAgICAgcGFyYW1zW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0ucmFuZ2VgXSA9IGAke3N0YXJ0fSwke2VuZH1gO1xuICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS5mb3JtYXRgXSA9IHRoaXMuZm9ybWF0ITtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LmludGVydmFsYF0gPSB0aGlzLmludGVydmFsLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWxVbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS5pbnRlcnZhbC51bml0YF0gPSB0aGlzLmludGVydmFsVW5pdDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgUGFydGl0aW9uUHJvamVjdGlvblR5cGUuRU5VTToge1xuICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS52YWx1ZXNgXSA9IHRoaXMudmFsdWVzIS5qb2luKCcsJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5JTkpFQ1RFRDoge1xuICAgICAgICAvLyBJTkpFQ1RFRCBoYXMgbm8gYWRkaXRpb25hbCBwYXJhbWV0ZXJzXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBUeXBlU2NyaXB0IGV4aGF1c3RpdmVuZXNzIGNoZWNrXG4gICAgICAgIGNvbnN0IGV4aGF1c3RpdmVDaGVjazogbmV2ZXIgPSB0aGlzLnR5cGU7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgVW5rbm93blByb2plY3Rpb25UeXBlYCxcbiAgICAgICAgICBgVW5rbm93biBwYXJ0aXRpb24gcHJvamVjdGlvbiB0eXBlIGZvciBcIiR7Y29sdW1uTmFtZX1cIjogJHtleGhhdXN0aXZlQ2hlY2t9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG59XG5cbi8qKlxuICogUGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbiBmb3IgYSB0YWJsZS5cbiAqXG4gKiBNYXBzIHBhcnRpdGlvbiBjb2x1bW4gbmFtZXMgdG8gdGhlaXIgcHJvamVjdGlvbiBjb25maWd1cmF0aW9ucy5cbiAqIFRoZSBrZXkgaXMgdGhlIHBhcnRpdGlvbiBjb2x1bW4gbmFtZSwgdGhlIHZhbHVlIGlzIHRoZSBwYXJ0aXRpb24gY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgUGFydGl0aW9uUHJvamVjdGlvbiA9IHtcbiAgW2NvbHVtbk5hbWU6IHN0cmluZ106IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgQ2xvdWRGb3JtYXRpb24gcGFyYW1ldGVycyBmb3IgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gY29sdW1uTmFtZSAtIFRoZSBwYXJ0aXRpb24gY29sdW1uIG5hbWVcbiAqIEBwYXJhbSBjb25maWcgLSBUaGUgcGFydGl0aW9uIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIENsb3VkRm9ybWF0aW9uIHBhcmFtZXRlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUGFydGl0aW9uUHJvamVjdGlvblBhcmFtZXRlcnMoXG4gIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgY29uZmlnOiBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbixcbik6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICByZXR1cm4gY29uZmlnLl9yZW5kZXJQYXJhbWV0ZXJzKGNvbHVtbk5hbWUpO1xufVxuIl19