@aws-cdk/aws-glue-alpha 2.267.0-alpha.0 → 2.269.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 (50) hide show
  1. package/.jsii +1691 -1261
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +1 -79
  4. package/README.md +106 -33
  5. package/adr/job-arguments.md +212 -0
  6. package/lib/catalog.d.ts +2 -2
  7. package/lib/catalog.js +4 -4
  8. package/lib/code.js +3 -3
  9. package/lib/connection.d.ts +44 -29
  10. package/lib/connection.js +66 -32
  11. package/lib/constants.d.ts +17 -0
  12. package/lib/constants.js +20 -2
  13. package/lib/data-format.js +5 -5
  14. package/lib/data-quality-ruleset.d.ts +20 -9
  15. package/lib/data-quality-ruleset.js +33 -6
  16. package/lib/database.d.ts +3 -1
  17. package/lib/database.js +8 -2
  18. package/lib/external-table.js +1 -1
  19. package/lib/jobs/job.d.ts +91 -10
  20. package/lib/jobs/job.js +115 -38
  21. package/lib/jobs/pyspark-etl-job.d.ts +2 -4
  22. package/lib/jobs/pyspark-etl-job.js +10 -15
  23. package/lib/jobs/pyspark-flex-etl-job.d.ts +2 -4
  24. package/lib/jobs/pyspark-flex-etl-job.js +10 -15
  25. package/lib/jobs/pyspark-streaming-job.d.ts +2 -4
  26. package/lib/jobs/pyspark-streaming-job.js +10 -15
  27. package/lib/jobs/python-shell-job.d.ts +20 -7
  28. package/lib/jobs/python-shell-job.js +30 -33
  29. package/lib/jobs/ray-job.js +8 -13
  30. package/lib/jobs/scala-spark-etl-job.d.ts +4 -5
  31. package/lib/jobs/scala-spark-etl-job.js +13 -16
  32. package/lib/jobs/scala-spark-flex-etl-job.d.ts +12 -23
  33. package/lib/jobs/scala-spark-flex-etl-job.js +20 -23
  34. package/lib/jobs/scala-spark-streaming-job.d.ts +4 -5
  35. package/lib/jobs/scala-spark-streaming-job.js +13 -16
  36. package/lib/jobs/spark-job.d.ts +9 -7
  37. package/lib/jobs/spark-job.js +23 -32
  38. package/lib/partition-projection.d.ts +36 -47
  39. package/lib/partition-projection.js +22 -40
  40. package/lib/s3-table.d.ts +7 -4
  41. package/lib/s3-table.js +12 -9
  42. package/lib/schema.js +2 -2
  43. package/lib/security-configuration.js +4 -4
  44. package/lib/storage-parameter.js +1 -1
  45. package/lib/table-base.js +1 -1
  46. package/lib/triggers/trigger-options.d.ts +103 -43
  47. package/lib/triggers/trigger-options.js +202 -3
  48. package/lib/triggers/workflow.d.ts +31 -47
  49. package/lib/triggers/workflow.js +27 -142
  50. package/package.json +7 -7
@@ -46,7 +46,7 @@ const job_1 = require("./job");
46
46
  * Base class for different types of Spark Jobs.
47
47
  */
48
48
  class SparkJob extends job_1.Job {
49
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.SparkJob", version: "2.267.0-alpha.0" };
49
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.SparkJob", version: "2.269.0-alpha.0" };
50
50
  role;
51
51
  grantPrincipal;
52
52
  /**
@@ -75,6 +75,12 @@ class SparkJob extends job_1.Job {
75
75
  this.grantPrincipal = this.role;
76
76
  this.sparkUILoggingLocation = props.sparkUI ? this.setupSparkUILoggingLocation(props.sparkUI) : undefined;
77
77
  }
78
+ /**
79
+ * Register the arguments this construct manages for a Spark job. These are owned by the construct
80
+ * (derived from typed props). Each key is declared via {@link setManagedArgument} whether or not
81
+ * the current configuration emits a value, so a disabled feature (e.g. `enableMetrics: false`)
82
+ * cannot be silently re-enabled through `defaultArguments`.
83
+ */
78
84
  nonExecutableCommonArguments(props) {
79
85
  try {
80
86
  jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_SparkJobProps(props);
@@ -86,27 +92,20 @@ class SparkJob extends job_1.Job {
86
92
  throw error;
87
93
  }
88
94
  // Enable CloudWatch metrics and continuous logging by default as a best practice
89
- const continuousLoggingArgs = this.setupContinuousLogging(this.role, props.continuousLogging);
90
- // Conditionally include metrics arguments (default to enabled for backward compatibility)
91
- const profilingMetricsArgs = (props.enableMetrics ?? true) ? { '--enable-metrics': '' } : {};
92
- const observabilityMetricsArgs = (props.enableObservabilityMetrics ?? true) ? { '--enable-observability-metrics': 'true' } : {};
93
- // Set spark ui args, if spark ui logging had been setup
94
- const sparkUIArgs = this.sparkUILoggingLocation ? ({
95
- '--enable-spark-ui': 'true',
96
- '--spark-event-logs-path': this.sparkUILoggingLocation.bucket.s3UrlForObject(this.sparkUILoggingLocation.prefix).replace(/\/?$/, '/'), // path will always end with a slash
97
- }) : {};
98
- return {
99
- ...continuousLoggingArgs,
100
- ...profilingMetricsArgs,
101
- ...observabilityMetricsArgs,
102
- ...sparkUIArgs,
103
- ...this.checkNoReservedArgs(props.defaultArguments),
104
- };
95
+ this.setupContinuousLogging(this.role, props.continuousLogging, props.securityConfiguration);
96
+ // Conditionally emit metrics arguments (default to enabled for backward compatibility)
97
+ this.setManagedArgument('--enable-metrics', (props.enableMetrics ?? true) ? '' : undefined);
98
+ this.setManagedArgument('--enable-observability-metrics', (props.enableObservabilityMetrics ?? true) ? 'true' : undefined);
99
+ // Emit Spark UI args only when Spark UI logging has been set up
100
+ this.setManagedArgument('--enable-spark-ui', this.sparkUILoggingLocation ? 'true' : undefined);
101
+ this.setManagedArgument('--spark-event-logs-path', this.sparkUILoggingLocation
102
+ ? this.sparkUILoggingLocation.bucket.s3UrlForObject(this.sparkUILoggingLocation.prefix).replace(/\/?$/, '/') // path will always end with a slash
103
+ : undefined);
105
104
  }
106
105
  /**
107
- * Set the arguments for extra {@link Code}-related properties
106
+ * Register the arguments for extra {@link Code}-related properties
108
107
  */
109
- setupExtraCodeArguments(args, props) {
108
+ setupExtraCodeArguments(props) {
110
109
  try {
111
110
  jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_SparkExtraCodeProps(props);
112
111
  }
@@ -116,18 +115,10 @@ class SparkJob extends job_1.Job {
116
115
  }
117
116
  throw error;
118
117
  }
119
- if (props.extraJars && props.extraJars.length > 0) {
120
- args['--extra-jars'] = props.extraJars.map(code => this.codeS3ObjectUrl(code)).join(',');
121
- }
122
- if (props.extraJarsFirst) {
123
- args['--user-jars-first'] = 'true';
124
- }
125
- if (props.extraPythonFiles && props.extraPythonFiles.length > 0) {
126
- args['--extra-py-files'] = props.extraPythonFiles.map(code => this.codeS3ObjectUrl(code)).join(',');
127
- }
128
- if (props.extraFiles && props.extraFiles.length > 0) {
129
- args['--extra-files'] = props.extraFiles.map(code => this.codeS3ObjectUrl(code)).join(',');
130
- }
118
+ this.setManagedArgument('--extra-jars', props.extraJars && props.extraJars.length > 0 ? props.extraJars.map(code => this.codeS3ObjectUrl(code)).join(',') : undefined);
119
+ this.setManagedArgument('--user-jars-first', props.extraJarsFirst ? 'true' : undefined);
120
+ this.setManagedArgument('--extra-py-files', props.extraPythonFiles && props.extraPythonFiles.length > 0 ? props.extraPythonFiles.map(code => this.codeS3ObjectUrl(code)).join(',') : undefined);
121
+ this.setManagedArgument('--extra-files', props.extraFiles && props.extraFiles.length > 0 ? props.extraFiles.map(code => this.codeS3ObjectUrl(code)).join(',') : undefined);
131
122
  }
132
123
  setupSparkUILoggingLocation(props) {
133
124
  validateSparkUiPrefix(props.prefix);
@@ -159,4 +150,4 @@ function validateSparkUiPrefix(prefix) {
159
150
  function cleanSparkUiPrefixForGrant(prefix) {
160
151
  return prefix !== undefined ? prefix.slice(1) + '/*' : undefined;
161
152
  }
162
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bhcmstam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3Bhcmstam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkJBQXlCO0FBQ3pCLDZDQUE2RDtBQUU3RCx1REFBeUM7QUFDekMsNEVBQTREO0FBQzVELDhFQUE4RTtBQUs5RSwrQkFBNEI7QUFnSjVCOztHQUVHO0FBQ0gsTUFBc0IsUUFBUyxTQUFRLFNBQUc7O0lBQ3hCLElBQUksQ0FBWTtJQUNoQixjQUFjLENBQWlCO0lBRS9DOzs7OztPQUtHO0lBQ2Esc0JBQXNCLENBQTBCO0lBRWhFLFlBQVksS0FBMkIsRUFBRSxFQUFVLEVBQUUsS0FBb0I7UUFDdkUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU87U0FDNUIsQ0FBQyxDQUFDOzs7Ozs7K0NBZmUsUUFBUTs7OztRQWdCMUIsbUNBQW1DO1FBQ25DLElBQUEsd0NBQW9CLEVBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWxDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFaEMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztLQUMzRztJQUVTLDRCQUE0QixDQUFDLEtBQW9COzs7Ozs7Ozs7O1FBQ3pELGlGQUFpRjtRQUNqRixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTlGLDBGQUEwRjtRQUMx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LENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN0RSxPQUFPO1lBQ0wsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLE1BQU07U0FDUCxDQUFDO0tBQ0g7O0FBMUVILDRCQTJFQztBQUVELFNBQVMscUJBQXFCLENBQUMsTUFBZTtJQUM1QyxJQUFJLENBQUMsTUFBTSxJQUFJLG1CQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDMUMsMkRBQTJEO1FBQzNELE9BQU87SUFDVCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBRTVCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUkscUNBQXVCLENBQUMsSUFBQSxzQkFBRyxFQUFBLHNCQUFzQixFQUFFLGlDQUFpQyxNQUFNLElBQUksUUFBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BJLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUywwQkFBMEIsQ0FBQyxNQUFlO0lBQ2pELE9BQU8sTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNuRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRU9MIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHsgVG9rZW4sIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHR5cGUgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgbGl0IH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB0eXBlICogYXMgY29uc3RydWN0cyBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB0eXBlIHsgQ29kZSB9IGZyb20gJy4uL2NvZGUnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZXJUeXBlIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB0eXBlIHsgSm9iUHJvcHMgfSBmcm9tICcuL2pvYic7XG5pbXBvcnQgeyBKb2IgfSBmcm9tICcuL2pvYic7XG5cbi8qKlxuICogQ29kZSBwcm9wcyBmb3IgZGlmZmVyZW50IHtAbGluayBDb2RlfSBhc3NldHMgdXNlZCBieSBkaWZmZXJlbnQgdHlwZXMgb2YgU3Bhcmsgam9icy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGFya0V4dHJhQ29kZVByb3BzIHtcbiAgLyoqXG4gICAqIEV4dHJhIFB5dGhvbiBGaWxlcyBTMyBVUkwgKG9wdGlvbmFsKVxuICAgKiBTMyBVUkwgd2hlcmUgYWRkaXRpb25hbCBweXRob24gZGVwZW5kZW5jaWVzIGFyZSBsb2NhdGVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZXh0cmEgZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhUHl0aG9uRmlsZXM/OiBDb2RlW107XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgZmlsZXMsIHN1Y2ggYXMgY29uZmlndXJhdGlvbiBmaWxlcyB0aGF0IEFXUyBHbHVlIGNvcGllcyB0byB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgeW91ciBzY3JpcHQgYmVmb3JlIGV4ZWN1dGluZyBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBleHRyYSBmaWxlcyBzcGVjaWZpZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqL1xuICByZWFkb25seSBleHRyYUZpbGVzPzogQ29kZVtdO1xuXG4gIC8qKlxuICAgKiBFeHRyYSBKYXJzIFMzIFVSTCAob3B0aW9uYWwpXG4gICAqIFMzIFVSTCB3aGVyZSBhZGRpdGlvbmFsIGphciBkZXBlbmRlbmNpZXMgYXJlIGxvY2F0ZWRcbiAgICogQGRlZmF1bHQgLSBubyBleHRyYSBqYXIgZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhSmFycz86IENvZGVbXTtcblxuICAvKipcbiAgICogU2V0dGluZyB0aGlzIHZhbHVlIHRvIHRydWUgcHJpb3JpdGl6ZXMgdGhlIGN1c3RvbWVyJ3MgZXh0cmEgSkFSIGZpbGVzIGluIHRoZSBjbGFzc3BhdGguXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlIC0gcHJpb3JpdHkgaXMgbm90IGdpdmVuIHRvIHVzZXItcHJvdmlkZWQgamFyc1xuICAgKlxuICAgKiBAc2VlIGAtLXVzZXItamFycy1maXJzdGAgaW4gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqL1xuICByZWFkb25seSBleHRyYUphcnNGaXJzdD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgZW5hYmxpbmcgU3BhcmsgVUkgbW9uaXRvcmluZyBmZWF0dXJlIGZvciBTcGFyay1iYXNlZCBHbHVlIGpvYnMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvbW9uaXRvci1zcGFyay11aS1qb2JzLmh0bWxcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhcmtVSVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBidWNrZXQgd2hlcmUgdGhlIEdsdWUgam9iIHN0b3JlcyB0aGUgbG9ncy5cbiAgICpcbiAgICogQGRlZmF1bHQgYSBuZXcgYnVja2V0IHdpbGwgYmUgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldD86IHMzLklCdWNrZXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIGluc2lkZSB0aGUgYnVja2V0IChvYmplY3RzIHByZWZpeCkgd2hlcmUgdGhlIEdsdWUgam9iIHN0b3JlcyB0aGUgbG9ncy5cbiAgICogVXNlIGZvcm1hdCBgJy9mb28vYmFyJ2BcbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgbG9ncyB3aWxsIGJlIHdyaXR0ZW4gYXQgdGhlIHJvb3Qgb2YgdGhlIGJ1Y2tldFxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBTcGFyayBVSSBsb2dnaW5nIGxvY2F0aW9uLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL21vbml0b3Itc3BhcmstdWktam9icy5odG1sXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXJrVUlMb2dnaW5nTG9jYXRpb24ge1xuICAvKipcbiAgICogVGhlIGJ1Y2tldCB3aGVyZSB0aGUgR2x1ZSBqb2Igc3RvcmVzIHRoZSBsb2dzLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0OiBzMy5JQnVja2V0O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBpbnNpZGUgdGhlIGJ1Y2tldCAob2JqZWN0cyBwcmVmaXgpIHdoZXJlIHRoZSBHbHVlIGpvYiBzdG9yZXMgdGhlIGxvZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0ICcvJyAtIHRoZSBsb2dzIHdpbGwgYmUgd3JpdHRlbiBhdCB0aGUgcm9vdCBvZiB0aGUgYnVja2V0XG4gICAqL1xuICByZWFkb25seSBwcmVmaXg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHdvcmtlciBjb25maWd1cmF0aW9uIGZvciBhIFNwYXJrIGpvYi5cbiAqXG4gKiBUaGUgd29ya2VyIHR5cGUgYW5kIHRoZSBudW1iZXIgb2Ygd29ya2VycyBhcmUgc2V0IHRvZ2V0aGVyOiBwcm92aWRpbmcgdGhpc1xuICogY29uZmlndXJhdGlvbiByZXF1aXJlcyBib3RoIHZhbHVlcywgc28gYSBTcGFyayBqb2IgY2FuIG5ldmVyIGJlIGdpdmVuIG9uZVxuICogd2l0aG91dCB0aGUgb3RoZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2VyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBwcmVkZWZpbmVkIHdvcmtlciB0aGF0IGlzIGFsbG9jYXRlZCB3aGVuIGEgam9iIHJ1bnMuXG4gICAqXG4gICAqIEVudW0gb3B0aW9uczogU3RhbmRhcmQsIEdfMVgsIEdfMlgsIEdfMDI1WCwgR180WCwgR184WCwgWl8yWFxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2VyVHlwZTogV29ya2VyVHlwZTtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiB3b3JrZXJzIG9mIHRoZSBnaXZlbiBgd29ya2VyVHlwZWAgdGhhdCBhcmUgYWxsb2NhdGVkIHdoZW4gYSBqb2IgcnVucy5cbiAgICovXG4gIHJlYWRvbmx5IG51bWJlck9mV29ya2VyczogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbW1vbiBwcm9wZXJ0aWVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgU3Bhcmsgam9icy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGFya0pvYlByb3BzIGV4dGVuZHMgSm9iUHJvcHMge1xuICAvKipcbiAgICogVGhlIHdvcmtlciB0eXBlIGFuZCB0aGUgbnVtYmVyIG9mIHdvcmtlcnMgYWxsb2NhdGVkIHdoZW4gYSBqb2IgcnVucy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgam9iIHJ1bnMgd2l0aCB0aGUgR18xWCB3b3JrZXIgdHlwZSBhbmQgMTAgd29ya2Vycy5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtlckNvbmZpZ3VyYXRpb24/OiBXb3JrZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIHRoZSBTcGFyayBVSSBkZWJ1Z2dpbmcgYW5kIG1vbml0b3Jpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNwYXJrIFVJIGRlYnVnZ2luZyBhbmQgbW9uaXRvcmluZyBpcyBkaXNhYmxlZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvbW9uaXRvci1zcGFyay11aS1qb2JzLmh0bWxcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IHNwYXJrVUk/OiBTcGFya1VJUHJvcHM7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBwcm9maWxpbmcgbWV0cmljcyBmb3IgdGhlIEdsdWUgam9iLlxuICAgKlxuICAgKiBXaGVuIGVuYWJsZWQsIGFkZHMgJy0tZW5hYmxlLW1ldHJpY3MnIHRvIGpvYiBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZU1ldHJpY3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgb2JzZXJ2YWJpbGl0eSBtZXRyaWNzIGZvciB0aGUgR2x1ZSBqb2IuXG4gICAqXG4gICAqIFdoZW4gZW5hYmxlZCwgYWRkcyAnLS1lbmFibGUtb2JzZXJ2YWJpbGl0eS1tZXRyaWNzJzogJ3RydWUnIHRvIGpvYiBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZU9ic2VydmFiaWxpdHlNZXRyaWNzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgU3BhcmsgSm9icy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNwYXJrSm9iIGV4dGVuZHMgSm9iIHtcbiAgcHVibGljIHJlYWRvbmx5IHJvbGU6IGlhbS5JUm9sZTtcbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogVGhlIFNwYXJrIFVJIGxvZ3MgbG9jYXRpb24gaWYgU3BhcmsgVUkgbW9uaXRvcmluZyBhbmQgZGVidWdnaW5nIGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL21vbml0b3Itc3BhcmstdWktam9icy5odG1sXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3BhcmtVSUxvZ2dpbmdMb2NhdGlvbj86IFNwYXJrVUlMb2dnaW5nTG9jYXRpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU3BhcmtKb2JQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy5qb2JOYW1lLFxuICAgIH0pO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgdGhpcy5yb2xlID0gcHJvcHMucm9sZTtcbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuXG4gICAgdGhpcy5zcGFya1VJTG9nZ2luZ0xvY2F0aW9uID0gcHJvcHMuc3BhcmtVSSA/IHRoaXMuc2V0dXBTcGFya1VJTG9nZ2luZ0xvY2F0aW9uKHByb3BzLnNwYXJrVUkpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5vbkV4ZWN1dGFibGVDb21tb25Bcmd1bWVudHMocHJvcHM6IFNwYXJrSm9iUHJvcHMpOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSB7XG4gICAgLy8gRW5hYmxlIENsb3VkV2F0Y2ggbWV0cmljcyBhbmQgY29udGludW91cyBsb2dnaW5nIGJ5IGRlZmF1bHQgYXMgYSBiZXN0IHByYWN0aWNlXG4gICAgY29uc3QgY29udGludW91c0xvZ2dpbmdBcmdzID0gdGhpcy5zZXR1cENvbnRpbnVvdXNMb2dnaW5nKHRoaXMucm9sZSwgcHJvcHMuY29udGludW91c0xvZ2dpbmcpO1xuXG4gICAgLy8gQ29uZGl0aW9uYWxseSBpbmNsdWRlIG1ldHJpY3MgYXJndW1lbnRzIChkZWZhdWx0IHRvIGVuYWJsZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgY29uc3QgcHJvZmlsaW5nTWV0cmljc0FyZ3MgPSAocHJvcHMuZW5hYmxlTWV0cmljcyA/PyB0cnVlKSA/IHsgJy0tZW5hYmxlLW1ldHJpY3MnOiAnJyB9IDoge307XG4gICAgY29uc3Qgb2JzZXJ2YWJpbGl0eU1ldHJpY3NBcmdzID0gKHByb3BzLmVuYWJsZU9ic2VydmFiaWxpdHlNZXRyaWNzID8/IHRydWUpID8geyAnLS1lbmFibGUtb2JzZXJ2YWJpbGl0eS1tZXRyaWNzJzogJ3RydWUnIH0gOiB7fTtcblxuICAgIC8vIFNldCBzcGFyayB1aSBhcmdzLCBpZiBzcGFyayB1aSBsb2dnaW5nIGhhZCBiZWVuIHNldHVwXG4gICAgY29uc3Qgc3BhcmtVSUFyZ3MgPSB0aGlzLnNwYXJrVUlMb2dnaW5nTG9jYXRpb24gPyAoe1xuICAgICAgJy0tZW5hYmxlLXNwYXJrLXVpJzogJ3RydWUnLFxuICAgICAgJy0tc3BhcmstZXZlbnQtbG9ncy1wYXRoJzogdGhpcy5zcGFya1VJTG9nZ2luZ0xvY2F0aW9uLmJ1Y2tldC5zM1VybEZvck9iamVjdCh0aGlzLnNwYXJrVUlMb2dnaW5nTG9jYXRpb24ucHJlZml4KS5yZXBsYWNlKC9cXC8/JC8sICcvJyksIC8vIHBhdGggd2lsbCBhbHdheXMgZW5kIHdpdGggYSBzbGFzaFxuICAgIH0pOiB7fTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb250aW51b3VzTG9nZ2luZ0FyZ3MsXG4gICAgICAuLi5wcm9maWxpbmdNZXRyaWNzQXJncyxcbiAgICAgIC4uLm9ic2VydmFiaWxpdHlNZXRyaWNzQXJncyxcbiAgICAgIC4uLnNwYXJrVUlBcmdzLFxuICAgICAgLi4udGhpcy5jaGVja05vUmVzZXJ2ZWRBcmdzKHByb3BzLmRlZmF1bHRBcmd1bWVudHMpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBhcmd1bWVudHMgZm9yIGV4dHJhIHtAbGluayBDb2RlfS1yZWxhdGVkIHByb3BlcnRpZXNcbiAgICovXG4gIHByb3RlY3RlZCBzZXR1cEV4dHJhQ29kZUFyZ3VtZW50cyhhcmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9LCBwcm9wczogU3BhcmtFeHRyYUNvZGVQcm9wcykge1xuICAgIGlmIChwcm9wcy5leHRyYUphcnMgJiYgcHJvcHMuZXh0cmFKYXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGFyZ3NbJy0tZXh0cmEtamFycyddID0gcHJvcHMuZXh0cmFKYXJzLm1hcChjb2RlID0+IHRoaXMuY29kZVMzT2JqZWN0VXJsKGNvZGUpKS5qb2luKCcsJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5leHRyYUphcnNGaXJzdCkge1xuICAgICAgYXJnc1snLS11c2VyLWphcnMtZmlyc3QnXSA9ICd0cnVlJztcbiAgICB9XG4gICAgaWYgKHByb3BzLmV4dHJhUHl0aG9uRmlsZXMgJiYgcHJvcHMuZXh0cmFQeXRob25GaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBhcmdzWyctLWV4dHJhLXB5LWZpbGVzJ10gPSBwcm9wcy5leHRyYVB5dGhvbkZpbGVzLm1hcChjb2RlID0+IHRoaXMuY29kZVMzT2JqZWN0VXJsKGNvZGUpKS5qb2luKCcsJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5leHRyYUZpbGVzICYmIHByb3BzLmV4dHJhRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXJnc1snLS1leHRyYS1maWxlcyddID0gcHJvcHMuZXh0cmFGaWxlcy5tYXAoY29kZSA9PiB0aGlzLmNvZGVTM09iamVjdFVybChjb2RlKSkuam9pbignLCcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBTcGFya1VJTG9nZ2luZ0xvY2F0aW9uKHByb3BzOiBTcGFya1VJUHJvcHMpOiBTcGFya1VJTG9nZ2luZ0xvY2F0aW9uIHtcbiAgICB2YWxpZGF0ZVNwYXJrVWlQcmVmaXgocHJvcHMucHJlZml4KTtcbiAgICBjb25zdCBidWNrZXQgPSBwcm9wcy5idWNrZXQgPz8gbmV3IHMzLkJ1Y2tldCh0aGlzLCAnU3BhcmtVSUJ1Y2tldCcsIHsgZW5mb3JjZVNTTDogdHJ1ZSwgZW5jcnlwdGlvbjogczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VEIH0pO1xuICAgIGJ1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLCBjbGVhblNwYXJrVWlQcmVmaXhGb3JHcmFudChwcm9wcy5wcmVmaXgpKTtcbiAgICByZXR1cm4ge1xuICAgICAgcHJlZml4OiBwcm9wcy5wcmVmaXgsXG4gICAgICBidWNrZXQsXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNwYXJrVWlQcmVmaXgocHJlZml4Pzogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghcHJlZml4IHx8IFRva2VuLmlzVW5yZXNvbHZlZChwcmVmaXgpKSB7XG4gICAgLy8gc2tpcCB2YWxpZGF0aW9uIGlmIHByZWZpeCBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIGEgdG9rZW5cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKCFwcmVmaXguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgZXJyb3JzLnB1c2goJ1ByZWZpeCBtdXN0IGJlZ2luIHdpdGggXFwnL1xcJycpO1xuICB9XG5cbiAgaWYgKHByZWZpeC5lbmRzV2l0aCgnLycpKSB7XG4gICAgZXJyb3JzLnB1c2goJ1ByZWZpeCBtdXN0IG5vdCBlbmQgd2l0aCBcXCcvXFwnJyk7XG4gIH1cblxuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YEludmFsaWRTcGFya1VpUHJlZml4YCwgYEludmFsaWQgcHJlZml4IGZvcm1hdCAodmFsdWU6ICR7cHJlZml4fSkke0VPTH0ke2Vycm9ycy5qb2luKEVPTCl9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYW5TcGFya1VpUHJlZml4Rm9yR3JhbnQocHJlZml4Pzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHByZWZpeCAhPT0gdW5kZWZpbmVkID8gcHJlZml4LnNsaWNlKDEpICsgJy8qJyA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
153
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bhcmstam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3Bhcmstam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkJBQXlCO0FBQ3pCLDZDQUE2RDtBQUU3RCx1REFBeUM7QUFDekMsNEVBQTREO0FBQzVELDhFQUE4RTtBQUs5RSwrQkFBNEI7QUFnSjVCOztHQUVHO0FBQ0gsTUFBc0IsUUFBUyxTQUFRLFNBQUc7O0lBQ3hCLElBQUksQ0FBWTtJQUNoQixjQUFjLENBQWlCO0lBRS9DOzs7OztPQUtHO0lBQ2Esc0JBQXNCLENBQTBCO0lBRWhFLFlBQVksS0FBMkIsRUFBRSxFQUFVLEVBQUUsS0FBb0I7UUFDdkUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU87U0FDNUIsQ0FBQyxDQUFDOzs7Ozs7K0NBZmUsUUFBUTs7OztRQWdCMUIsbUNBQW1DO1FBQ25DLElBQUEsd0NBQW9CLEVBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWxDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFaEMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztLQUMzRztJQUVEOzs7OztPQUtHO0lBQ08sNEJBQTRCLENBQUMsS0FBb0I7Ozs7Ozs7Ozs7UUFDekQsaUZBQWlGO1FBQ2pGLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FB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LENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDdEUsT0FBTztZQUNMLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtZQUNwQixNQUFNO1NBQ1AsQ0FBQztLQUNIOztBQTVFSCw0QkE2RUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLE1BQWU7SUFDNUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxtQkFBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzFDLDJEQUEyRDtRQUMzRCxPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUU1QixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLHFDQUF1QixDQUFDLElBQUEsc0JBQUcsRUFBQSxzQkFBc0IsRUFBRSxpQ0FBaUMsTUFBTSxJQUFJLFFBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwSSxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsMEJBQTBCLENBQUMsTUFBZTtJQUNqRCxPQUFPLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDbkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVPTCB9IGZyb20gJ29zJztcbmltcG9ydCB7IFRva2VuLCBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgdHlwZSAqIGFzIGNvbnN0cnVjdHMgZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgdHlwZSB7IENvZGUgfSBmcm9tICcuLi9jb2RlJztcbmltcG9ydCB0eXBlIHsgV29ya2VyVHlwZSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgdHlwZSB7IEpvYlByb3BzIH0gZnJvbSAnLi9qb2InO1xuaW1wb3J0IHsgSm9iIH0gZnJvbSAnLi9qb2InO1xuXG4vKipcbiAqIENvZGUgcHJvcHMgZm9yIGRpZmZlcmVudCB7QGxpbmsgQ29kZX0gYXNzZXRzIHVzZWQgYnkgZGlmZmVyZW50IHR5cGVzIG9mIFNwYXJrIGpvYnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhcmtFeHRyYUNvZGVQcm9wcyB7XG4gIC8qKlxuICAgKiBFeHRyYSBQeXRob24gRmlsZXMgUzMgVVJMIChvcHRpb25hbClcbiAgICogUzMgVVJMIHdoZXJlIGFkZGl0aW9uYWwgcHl0aG9uIGRlcGVuZGVuY2llcyBhcmUgbG9jYXRlZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4dHJhIGZpbGVzXG4gICAqL1xuICByZWFkb25seSBleHRyYVB5dGhvbkZpbGVzPzogQ29kZVtdO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGZpbGVzLCBzdWNoIGFzIGNvbmZpZ3VyYXRpb24gZmlsZXMgdGhhdCBBV1MgR2x1ZSBjb3BpZXMgdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHlvdXIgc2NyaXB0IGJlZm9yZSBleGVjdXRpbmcgaXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZXh0cmEgZmlsZXMgc3BlY2lmaWVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFGaWxlcz86IENvZGVbXTtcblxuICAvKipcbiAgICogRXh0cmEgSmFycyBTMyBVUkwgKG9wdGlvbmFsKVxuICAgKiBTMyBVUkwgd2hlcmUgYWRkaXRpb25hbCBqYXIgZGVwZW5kZW5jaWVzIGFyZSBsb2NhdGVkXG4gICAqIEBkZWZhdWx0IC0gbm8gZXh0cmEgamFyIGZpbGVzXG4gICAqL1xuICByZWFkb25seSBleHRyYUphcnM/OiBDb2RlW107XG5cbiAgLyoqXG4gICAqIFNldHRpbmcgdGhpcyB2YWx1ZSB0byB0cnVlIHByaW9yaXRpemVzIHRoZSBjdXN0b21lcidzIGV4dHJhIEpBUiBmaWxlcyBpbiB0aGUgY2xhc3NwYXRoLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZSAtIHByaW9yaXR5IGlzIG5vdCBnaXZlbiB0byB1c2VyLXByb3ZpZGVkIGphcnNcbiAgICpcbiAgICogQHNlZSBgLS11c2VyLWphcnMtZmlyc3RgIGluIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFKYXJzRmlyc3Q/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGVuYWJsaW5nIFNwYXJrIFVJIG1vbml0b3JpbmcgZmVhdHVyZSBmb3IgU3BhcmstYmFzZWQgR2x1ZSBqb2JzLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL21vbml0b3Itc3BhcmstdWktam9icy5odG1sXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXJrVUlQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgYnVja2V0IHdoZXJlIHRoZSBHbHVlIGpvYiBzdG9yZXMgdGhlIGxvZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGEgbmV3IGJ1Y2tldCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqL1xuICByZWFkb25seSBidWNrZXQ/OiBzMy5JQnVja2V0O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBpbnNpZGUgdGhlIGJ1Y2tldCAob2JqZWN0cyBwcmVmaXgpIHdoZXJlIHRoZSBHbHVlIGpvYiBzdG9yZXMgdGhlIGxvZ3MuXG4gICAqIFVzZSBmb3JtYXQgYCcvZm9vL2JhcidgXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGxvZ3Mgd2lsbCBiZSB3cml0dGVuIGF0IHRoZSByb290IG9mIHRoZSBidWNrZXRcbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgU3BhcmsgVUkgbG9nZ2luZyBsb2NhdGlvbi5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9tb25pdG9yLXNwYXJrLXVpLWpvYnMuaHRtbFxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGFya1VJTG9nZ2luZ0xvY2F0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBidWNrZXQgd2hlcmUgdGhlIEdsdWUgam9iIHN0b3JlcyB0aGUgbG9ncy5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldDogczMuSUJ1Y2tldDtcblxuICAvKipcbiAgICogVGhlIHBhdGggaW5zaWRlIHRoZSBidWNrZXQgKG9iamVjdHMgcHJlZml4KSB3aGVyZSB0aGUgR2x1ZSBqb2Igc3RvcmVzIHRoZSBsb2dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnLycgLSB0aGUgbG9ncyB3aWxsIGJlIHdyaXR0ZW4gYXQgdGhlIHJvb3Qgb2YgdGhlIGJ1Y2tldFxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSB3b3JrZXIgY29uZmlndXJhdGlvbiBmb3IgYSBTcGFyayBqb2IuXG4gKlxuICogVGhlIHdvcmtlciB0eXBlIGFuZCB0aGUgbnVtYmVyIG9mIHdvcmtlcnMgYXJlIHNldCB0b2dldGhlcjogcHJvdmlkaW5nIHRoaXNcbiAqIGNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgYm90aCB2YWx1ZXMsIHNvIGEgU3Bhcmsgam9iIGNhbiBuZXZlciBiZSBnaXZlbiBvbmVcbiAqIHdpdGhvdXQgdGhlIG90aGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgcHJlZGVmaW5lZCB3b3JrZXIgdGhhdCBpcyBhbGxvY2F0ZWQgd2hlbiBhIGpvYiBydW5zLlxuICAgKlxuICAgKiBFbnVtIG9wdGlvbnM6IFN0YW5kYXJkLCBHXzFYLCBHXzJYLCBHXzAyNVgsIEdfNFgsIEdfOFgsIFpfMlhcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtlclR5cGU6IFdvcmtlclR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2Ygd29ya2VycyBvZiB0aGUgZ2l2ZW4gYHdvcmtlclR5cGVgIHRoYXQgYXJlIGFsbG9jYXRlZCB3aGVuIGEgam9iIHJ1bnMuXG4gICAqL1xuICByZWFkb25seSBudW1iZXJPZldvcmtlcnM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb21tb24gcHJvcGVydGllcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIFNwYXJrIGpvYnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhcmtKb2JQcm9wcyBleHRlbmRzIEpvYlByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSB3b3JrZXIgdHlwZSBhbmQgdGhlIG51bWJlciBvZiB3b3JrZXJzIGFsbG9jYXRlZCB3aGVuIGEgam9iIHJ1bnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGpvYiBydW5zIHdpdGggdGhlIEdfMVggd29ya2VyIHR5cGUgYW5kIDEwIHdvcmtlcnMuXG4gICAqL1xuICByZWFkb25seSB3b3JrZXJDb25maWd1cmF0aW9uPzogV29ya2VyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogRW5hYmxlcyB0aGUgU3BhcmsgVUkgZGVidWdnaW5nIGFuZCBtb25pdG9yaW5nIHdpdGggdGhlIHNwZWNpZmllZCBwcm9wcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBTcGFyayBVSSBkZWJ1Z2dpbmcgYW5kIG1vbml0b3JpbmcgaXMgZGlzYWJsZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL21vbml0b3Itc3BhcmstdWktam9icy5odG1sXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqL1xuICByZWFkb25seSBzcGFya1VJPzogU3BhcmtVSVByb3BzO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgcHJvZmlsaW5nIG1ldHJpY3MgZm9yIHRoZSBHbHVlIGpvYi5cbiAgICpcbiAgICogV2hlbiBlbmFibGVkLCBhZGRzICctLWVuYWJsZS1tZXRyaWNzJyB0byBqb2IgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVNZXRyaWNzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlIG9ic2VydmFiaWxpdHkgbWV0cmljcyBmb3IgdGhlIEdsdWUgam9iLlxuICAgKlxuICAgKiBXaGVuIGVuYWJsZWQsIGFkZHMgJy0tZW5hYmxlLW9ic2VydmFiaWxpdHktbWV0cmljcyc6ICd0cnVlJyB0byBqb2IgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVPYnNlcnZhYmlsaXR5TWV0cmljcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIFNwYXJrIEpvYnMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTcGFya0pvYiBleHRlbmRzIEpvYiB7XG4gIHB1YmxpYyByZWFkb25seSByb2xlOiBpYW0uSVJvbGU7XG4gIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBTcGFyayBVSSBsb2dzIGxvY2F0aW9uIGlmIFNwYXJrIFVJIG1vbml0b3JpbmcgYW5kIGRlYnVnZ2luZyBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9tb25pdG9yLXNwYXJrLXVpLWpvYnMuaHRtbFxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNwYXJrVUlMb2dnaW5nTG9jYXRpb24/OiBTcGFya1VJTG9nZ2luZ0xvY2F0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFNwYXJrSm9iUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMuam9iTmFtZSxcbiAgICB9KTtcbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIHRoaXMucm9sZSA9IHByb3BzLnJvbGU7XG4gICAgdGhpcy5ncmFudFByaW5jaXBhbCA9IHRoaXMucm9sZTtcblxuICAgIHRoaXMuc3BhcmtVSUxvZ2dpbmdMb2NhdGlvbiA9IHByb3BzLnNwYXJrVUkgPyB0aGlzLnNldHVwU3BhcmtVSUxvZ2dpbmdMb2NhdGlvbihwcm9wcy5zcGFya1VJKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciB0aGUgYXJndW1lbnRzIHRoaXMgY29uc3RydWN0IG1hbmFnZXMgZm9yIGEgU3Bhcmsgam9iLiBUaGVzZSBhcmUgb3duZWQgYnkgdGhlIGNvbnN0cnVjdFxuICAgKiAoZGVyaXZlZCBmcm9tIHR5cGVkIHByb3BzKS4gRWFjaCBrZXkgaXMgZGVjbGFyZWQgdmlhIHtAbGluayBzZXRNYW5hZ2VkQXJndW1lbnR9IHdoZXRoZXIgb3Igbm90XG4gICAqIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gZW1pdHMgYSB2YWx1ZSwgc28gYSBkaXNhYmxlZCBmZWF0dXJlIChlLmcuIGBlbmFibGVNZXRyaWNzOiBmYWxzZWApXG4gICAqIGNhbm5vdCBiZSBzaWxlbnRseSByZS1lbmFibGVkIHRocm91Z2ggYGRlZmF1bHRBcmd1bWVudHNgLlxuICAgKi9cbiAgcHJvdGVjdGVkIG5vbkV4ZWN1dGFibGVDb21tb25Bcmd1bWVudHMocHJvcHM6IFNwYXJrSm9iUHJvcHMpOiB2b2lkIHtcbiAgICAvLyBFbmFibGUgQ2xvdWRXYXRjaCBtZXRyaWNzIGFuZCBjb250aW51b3VzIGxvZ2dpbmcgYnkgZGVmYXVsdCBhcyBhIGJlc3QgcHJhY3RpY2VcbiAgICB0aGlzLnNldHVwQ29udGludW91c0xvZ2dpbmcodGhpcy5yb2xlLCBwcm9wcy5jb250aW51b3VzTG9nZ2luZywgcHJvcHMuc2VjdXJpdHlDb25maWd1cmF0aW9uKTtcblxuICAgIC8vIENvbmRpdGlvbmFsbHkgZW1pdCBtZXRyaWNzIGFyZ3VtZW50cyAoZGVmYXVsdCB0byBlbmFibGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgIHRoaXMuc2V0TWFuYWdlZEFyZ3VtZW50KCctLWVuYWJsZS1tZXRyaWNzJywgKHByb3BzLmVuYWJsZU1ldHJpY3MgPz8gdHJ1ZSkgPyAnJyA6IHVuZGVmaW5lZCk7XG4gICAgdGhpcy5zZXRNYW5hZ2VkQXJndW1lbnQoJy0tZW5hYmxlLW9ic2VydmFiaWxpdHktbWV0cmljcycsIChwcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5TWV0cmljcyA/PyB0cnVlKSA/ICd0cnVlJyA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyBFbWl0IFNwYXJrIFVJIGFyZ3Mgb25seSB3aGVuIFNwYXJrIFVJIGxvZ2dpbmcgaGFzIGJlZW4gc2V0IHVwXG4gICAgdGhpcy5zZXRNYW5hZ2VkQXJndW1lbnQoJy0tZW5hYmxlLXNwYXJrLXVpJywgdGhpcy5zcGFya1VJTG9nZ2luZ0xvY2F0aW9uID8gJ3RydWUnIDogdW5kZWZpbmVkKTtcbiAgICB0aGlzLnNldE1hbmFnZWRBcmd1bWVudChcbiAgICAgICctLXNwYXJrLWV2ZW50LWxvZ3MtcGF0aCcsXG4gICAgICB0aGlzLnNwYXJrVUlMb2dnaW5nTG9jYXRpb25cbiAgICAgICAgPyB0aGlzLnNwYXJrVUlMb2dnaW5nTG9jYXRpb24uYnVja2V0LnMzVXJsRm9yT2JqZWN0KHRoaXMuc3BhcmtVSUxvZ2dpbmdMb2NhdGlvbi5wcmVmaXgpLnJlcGxhY2UoL1xcLz8kLywgJy8nKSAvLyBwYXRoIHdpbGwgYWx3YXlzIGVuZCB3aXRoIGEgc2xhc2hcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciB0aGUgYXJndW1lbnRzIGZvciBleHRyYSB7QGxpbmsgQ29kZX0tcmVsYXRlZCBwcm9wZXJ0aWVzXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0dXBFeHRyYUNvZGVBcmd1bWVudHMocHJvcHM6IFNwYXJrRXh0cmFDb2RlUHJvcHMpIHtcbiAgICB0aGlzLnNldE1hbmFnZWRBcmd1bWVudChcbiAgICAgICctLWV4dHJhLWphcnMnLFxuICAgICAgcHJvcHMuZXh0cmFKYXJzICYmIHByb3BzLmV4dHJhSmFycy5sZW5ndGggPiAwID8gcHJvcHMuZXh0cmFKYXJzLm1hcChjb2RlID0+IHRoaXMuY29kZVMzT2JqZWN0VXJsKGNvZGUpKS5qb2luKCcsJykgOiB1bmRlZmluZWQsXG4gICAgKTtcbiAgICB0aGlzLnNldE1hbmFnZWRBcmd1bWVudCgnLS11c2VyLWphcnMtZmlyc3QnLCBwcm9wcy5leHRyYUphcnNGaXJzdCA/ICd0cnVlJyA6IHVuZGVmaW5lZCk7XG4gICAgdGhpcy5zZXRNYW5hZ2VkQXJndW1lbnQoXG4gICAgICAnLS1leHRyYS1weS1maWxlcycsXG4gICAgICBwcm9wcy5leHRyYVB5dGhvbkZpbGVzICYmIHByb3BzLmV4dHJhUHl0aG9uRmlsZXMubGVuZ3RoID4gMCA/IHByb3BzLmV4dHJhUHl0aG9uRmlsZXMubWFwKGNvZGUgPT4gdGhpcy5jb2RlUzNPYmplY3RVcmwoY29kZSkpLmpvaW4oJywnKSA6IHVuZGVmaW5lZCxcbiAgICApO1xuICAgIHRoaXMuc2V0TWFuYWdlZEFyZ3VtZW50KFxuICAgICAgJy0tZXh0cmEtZmlsZXMnLFxuICAgICAgcHJvcHMuZXh0cmFGaWxlcyAmJiBwcm9wcy5leHRyYUZpbGVzLmxlbmd0aCA+IDAgPyBwcm9wcy5leHRyYUZpbGVzLm1hcChjb2RlID0+IHRoaXMuY29kZVMzT2JqZWN0VXJsKGNvZGUpKS5qb2luKCcsJykgOiB1bmRlZmluZWQsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBTcGFya1VJTG9nZ2luZ0xvY2F0aW9uKHByb3BzOiBTcGFya1VJUHJvcHMpOiBTcGFya1VJTG9nZ2luZ0xvY2F0aW9uIHtcbiAgICB2YWxpZGF0ZVNwYXJrVWlQcmVmaXgocHJvcHMucHJlZml4KTtcbiAgICBjb25zdCBidWNrZXQgPSBwcm9wcy5idWNrZXQgPz8gbmV3IHMzLkJ1Y2tldCh0aGlzLCAnU3BhcmtVSUJ1Y2tldCcsIHsgZW5mb3JjZVNTTDogdHJ1ZSwgZW5jcnlwdGlvbjogczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VEIH0pO1xuICAgIGJ1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLCBjbGVhblNwYXJrVWlQcmVmaXhGb3JHcmFudChwcm9wcy5wcmVmaXgpKTtcbiAgICByZXR1cm4ge1xuICAgICAgcHJlZml4OiBwcm9wcy5wcmVmaXgsXG4gICAgICBidWNrZXQsXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNwYXJrVWlQcmVmaXgocHJlZml4Pzogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghcHJlZml4IHx8IFRva2VuLmlzVW5yZXNvbHZlZChwcmVmaXgpKSB7XG4gICAgLy8gc2tpcCB2YWxpZGF0aW9uIGlmIHByZWZpeCBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIGEgdG9rZW5cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKCFwcmVmaXguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgZXJyb3JzLnB1c2goJ1ByZWZpeCBtdXN0IGJlZ2luIHdpdGggXFwnL1xcJycpO1xuICB9XG5cbiAgaWYgKHByZWZpeC5lbmRzV2l0aCgnLycpKSB7XG4gICAgZXJyb3JzLnB1c2goJ1ByZWZpeCBtdXN0IG5vdCBlbmQgd2l0aCBcXCcvXFwnJyk7XG4gIH1cblxuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YEludmFsaWRTcGFya1VpUHJlZml4YCwgYEludmFsaWQgcHJlZml4IGZvcm1hdCAodmFsdWU6ICR7cHJlZml4fSkke0VPTH0ke2Vycm9ycy5qb2luKEVPTCl9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYW5TcGFya1VpUHJlZml4Rm9yR3JhbnQocHJlZml4Pzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHByZWZpeCAhPT0gdW5kZWZpbmVkID8gcHJlZml4LnNsaWNlKDEpICsgJy8qJyA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
@@ -85,6 +85,22 @@ export interface IntegerPartitionProjectionConfigurationProps {
85
85
  */
86
86
  readonly digits?: number;
87
87
  }
88
+ /**
89
+ * A required-together interval step for DATE partition projection.
90
+ *
91
+ * Bundling `interval` and `intervalUnit` into one value makes a partial step
92
+ * (one without the other) unrepresentable.
93
+ */
94
+ export interface DateProjectionStep {
95
+ /**
96
+ * Interval between partition values.
97
+ */
98
+ readonly interval: number;
99
+ /**
100
+ * Unit for the interval.
101
+ */
102
+ readonly intervalUnit: DateIntervalUnit;
103
+ }
88
104
  /**
89
105
  * Properties for DATE partition projection configuration.
90
106
  */
@@ -120,25 +136,16 @@ export interface DatePartitionProjectionConfigurationProps {
120
136
  */
121
137
  readonly format: string;
122
138
  /**
123
- * Interval between partition values.
139
+ * Interval step (`interval` + `intervalUnit`) between partition values.
124
140
  *
125
- * Required (together with `intervalUnit`) when `format` carries sub-day
126
- * precision — i.e. a field finer than a day, such as hours or AM/PM. At day
127
- * or coarser precision Athena defaults the step, so it is optional.
141
+ * The two are supplied together, so a partial step cannot be expressed.
142
+ * Required when `format` carries sub-day precision — a field finer than a
143
+ * day, such as hours or AM/PM; at day or coarser precision Athena defaults
144
+ * the step, so it may be omitted.
128
145
  *
129
146
  * @default - Athena's default step for the format's precision; required when `format` is sub-day precision
130
147
  */
131
- readonly interval?: number;
132
- /**
133
- * Unit for the interval.
134
- *
135
- * Required (together with `interval`) when `format` carries sub-day
136
- * precision — i.e. a field finer than a day, such as hours or AM/PM. At day
137
- * or coarser precision Athena defaults the step, so it is optional.
138
- *
139
- * @default - Athena's default unit for the format's precision; required when `format` is sub-day precision
140
- */
141
- readonly intervalUnit?: DateIntervalUnit;
148
+ readonly step?: DateProjectionStep;
142
149
  }
143
150
  /**
144
151
  * Properties for ENUM partition projection configuration.
@@ -179,38 +186,20 @@ export declare class PartitionProjectionConfiguration {
179
186
  * The type of partition projection.
180
187
  */
181
188
  readonly type: PartitionProjectionType;
182
- /**
183
- * Range of partition values for INTEGER type.
184
- *
185
- * Array of [min, max] as numbers.
186
- */
187
- readonly integerRange?: number[];
188
- /**
189
- * Range of partition values for DATE type.
190
- *
191
- * Array of [start, end] as date strings.
192
- */
193
- readonly dateRange?: string[];
194
- /**
195
- * Interval between partition values.
196
- */
197
- readonly interval?: number;
198
- /**
199
- * Number of digits to pad INTEGER partition values.
200
- */
201
- readonly digits?: number;
202
- /**
203
- * Date format for DATE partition values (Java SimpleDateFormat).
204
- */
205
- readonly format?: string;
206
- /**
207
- * Unit for DATE partition interval.
208
- */
209
- readonly intervalUnit?: DateIntervalUnit;
210
- /**
211
- * Explicit list of values for ENUM partitions.
212
- */
213
- readonly values?: string[];
189
+ /** Range [min, max] for INTEGER type. */
190
+ private readonly integerRange?;
191
+ /** Range [start, end] for DATE type. */
192
+ private readonly dateRange?;
193
+ /** Interval between partition values (INTEGER, or DATE step). */
194
+ private readonly interval?;
195
+ /** Number of digits to pad INTEGER partition values. */
196
+ private readonly digits?;
197
+ /** Date format for DATE partition values. */
198
+ private readonly format?;
199
+ /** Unit for the DATE partition interval. */
200
+ private readonly intervalUnit?;
201
+ /** Explicit list of values for ENUM partitions. */
202
+ private readonly values?;
214
203
  private constructor();
215
204
  /**
216
205
  * Renders CloudFormation parameters for this partition projection configuration.
@@ -111,7 +111,7 @@ 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.267.0-alpha.0" };
114
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.PartitionProjectionConfiguration", version: "2.269.0-alpha.0" };
115
115
  /**
116
116
  * Create an INTEGER partition projection configuration.
117
117
  */
@@ -210,25 +210,25 @@ class PartitionProjectionConfiguration {
210
210
  }
211
211
  }
212
212
  // 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}`);
213
+ if (props.step !== undefined &&
214
+ !aws_cdk_lib_1.Token.isUnresolved(props.step.interval) &&
215
+ (!Number.isInteger(props.step.interval) || props.step.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.step.interval}`);
217
217
  }
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
- }
218
+ // For sub-day precision (a field finer than a day), Athena requires a step;
219
+ // at day or coarser precision it defaults one. The interval/unit pairing is
220
+ // now guaranteed by the `step` type, so only the "sub-day format needs a
221
+ // step at all" requirement remains. Enforce only when the format is a
222
+ // resolved literal we can inspect.
223
+ if (!aws_cdk_lib_1.Token.isUnresolved(props.format) && dateFormatRequiresInterval(props.format) && props.step === undefined) {
224
+ 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
225
  }
226
226
  return new PartitionProjectionConfiguration({
227
227
  type: PartitionProjectionType.DATE,
228
228
  dateRange: [props.min, props.max],
229
- interval: props.interval,
229
+ interval: props.step?.interval,
230
230
  format: props.format,
231
- intervalUnit: props.intervalUnit,
231
+ intervalUnit: props.step?.intervalUnit,
232
232
  });
233
233
  }
234
234
  /**
@@ -280,37 +280,19 @@ class PartitionProjectionConfiguration {
280
280
  * The type of partition projection.
281
281
  */
282
282
  type;
283
- /**
284
- * Range of partition values for INTEGER type.
285
- *
286
- * Array of [min, max] as numbers.
287
- */
283
+ /** Range [min, max] for INTEGER type. */
288
284
  integerRange;
289
- /**
290
- * Range of partition values for DATE type.
291
- *
292
- * Array of [start, end] as date strings.
293
- */
285
+ /** Range [start, end] for DATE type. */
294
286
  dateRange;
295
- /**
296
- * Interval between partition values.
297
- */
287
+ /** Interval between partition values (INTEGER, or DATE step). */
298
288
  interval;
299
- /**
300
- * Number of digits to pad INTEGER partition values.
301
- */
289
+ /** Number of digits to pad INTEGER partition values. */
302
290
  digits;
303
- /**
304
- * Date format for DATE partition values (Java SimpleDateFormat).
305
- */
291
+ /** Date format for DATE partition values. */
306
292
  format;
307
- /**
308
- * Unit for DATE partition interval.
309
- */
293
+ /** Unit for the DATE partition interval. */
310
294
  intervalUnit;
311
- /**
312
- * Explicit list of values for ENUM partitions.
313
- */
295
+ /** Explicit list of values for ENUM partitions. */
314
296
  values;
315
297
  constructor(props) {
316
298
  this.type = props.type;
@@ -384,4 +366,4 @@ exports.PartitionProjectionConfiguration = PartitionProjectionConfiguration;
384
366
  function generatePartitionProjectionParameters(columnName, config) {
385
367
  return config._renderParameters(columnName);
386
368
  }
387
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFydGl0aW9uLXByb2plY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwYXJ0aXRpb24tcHJvamVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFzbEJBLHNGQUtDOzs7QUEzbEJELDZDQUE2RDtBQUM3RCw0RUFBNEQ7QUFFNUQ7Ozs7OztHQU1HO0FBQ0gsSUFBWSx1QkFvQlg7QUFwQkQsV0FBWSx1QkFBdUI7SUFDakM7O09BRUc7SUFDSCw4Q0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILHdDQUFhLENBQUE7SUFFYjs7T0FFRztJQUNILHdDQUFhLENBQUE7SUFFYjs7T0FFRztJQUNILGdEQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFwQlcsdUJBQXVCLHVDQUF2Qix1QkFBdUIsUUFvQmxDO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksZ0JBbUNYO0FBbkNELFdBQVksZ0JBQWdCO0lBQzFCOztPQUVHO0lBQ0gsbUNBQWUsQ0FBQTtJQUVmOztPQUVHO0lBQ0gscUNBQWlCLENBQUE7SUFFakI7O09BRUc7SUFDSCxtQ0FBZSxDQUFBO0lBRWY7O09BRUc7SUFDSCxpQ0FBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCxtQ0FBZSxDQUFBO0lBRWY7O09BRUc7SUFDSCx1Q0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILHVDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFuQ1csZ0JBQWdCLGdDQUFoQixnQkFBZ0IsUUFtQzNCO0FBMEpEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLDBCQUEwQixDQUFDLE1BQWM7SUFDaEQsNEVBQTRFO0lBQzVFLHFFQUFxRTtJQUNyRSxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ2xDLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZD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UUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN6RSxDQUFDO2dCQUNELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsTUFBTSxDQUFDLGNBQWMsVUFBVSxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZFLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLE1BQU0sQ0FBQyxjQUFjLFVBQVUsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25FLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUN0Qyx3Q0FBd0M7Z0JBQ3hDLE1BQU07WUFDUixDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDUixrQ0FBa0M7Z0JBQ2xDLE1BQU0sZUFBZSxHQUFVLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3pDLE1BQU0sSUFBSSxxQ0FBdUIsQ0FDL0IsSUFBQSxzQkFBRyxFQUFBLHVCQUF1QixFQUMxQiwwQ0FBMEMsVUFBVSxNQUFNLGVBQWUsRUFBRSxDQUM1RSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztLQUNmOztBQXRUSCw0RUF1VEM7QUFZRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixxQ0FBcUMsQ0FDbkQsVUFBa0IsRUFDbEIsTUFBd0M7SUFFeEMsT0FBTyxNQUFNLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRva2VuLCBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuXG4vKipcbiAqIFBhcnRpdGlvbiBwcm9qZWN0aW9uIHR5cGUuXG4gKlxuICogRGV0ZXJtaW5lcyBob3cgQXRoZW5hIHByb2plY3RzIHBhcnRpdGlvbiB2YWx1ZXMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXRoZW5hL2xhdGVzdC91Zy9wYXJ0aXRpb24tcHJvamVjdGlvbi1zdXBwb3J0ZWQtdHlwZXMuaHRtbFxuICovXG5leHBvcnQgZW51bSBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZSB7XG4gIC8qKlxuICAgKiBQcm9qZWN0IHBhcnRpdGlvbiB2YWx1ZXMgYXMgaW50ZWdlcnMgd2l0aGluIGEgcmFuZ2UuXG4gICAqL1xuICBJTlRFR0VSID0gJ2ludGVnZXInLFxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IHBhcnRpdGlvbiB2YWx1ZXMgYXMgZGF0ZXMgd2l0aGluIGEgcmFuZ2UuXG4gICAqL1xuICBEQVRFID0gJ2RhdGUnLFxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IHBhcnRpdGlvbiB2YWx1ZXMgZnJvbSBhbiBleHBsaWNpdCBsaXN0IG9mIHZhbHVlcy5cbiAgICovXG4gIEVOVU0gPSAnZW51bScsXG5cbiAgLyoqXG4gICAqIFByb2plY3QgcGFydGl0aW9uIHZhbHVlcyB0aGF0IGFyZSBpbmplY3RlZCBhdCBxdWVyeSB0aW1lLlxuICAgKi9cbiAgSU5KRUNURUQgPSAnaW5qZWN0ZWQnLFxufVxuXG4vKipcbiAqIERhdGUgaW50ZXJ2YWwgdW5pdCBmb3IgcGFydGl0aW9uIHByb2plY3Rpb24uXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXRoZW5hL2xhdGVzdC91Zy9wYXJ0aXRpb24tcHJvamVjdGlvbi1zdXBwb3J0ZWQtdHlwZXMuaHRtbCNwYXJ0aXRpb24tcHJvamVjdGlvbi1kYXRlLXR5cGVcbiAqL1xuZXhwb3J0IGVudW0gRGF0ZUludGVydmFsVW5pdCB7XG4gIC8qKlxuICAgKiBZZWFyIGludGVydmFsLlxuICAgKi9cbiAgWUVBUlMgPSAnWUVBUlMnLFxuXG4gIC8qKlxuICAgKiBNb250aCBpbnRlcnZhbC5cbiAgICovXG4gIE1PTlRIUyA9ICdNT05USFMnLFxuXG4gIC8qKlxuICAgKiBXZWVrIGludGVydmFsLlxuICAgKi9cbiAgV0VFS1MgPSAnV0VFS1MnLFxuXG4gIC8qKlxuICAgKiBEYXkgaW50ZXJ2YWwgKGRlZmF1bHQpLlxuICAgKi9cbiAgREFZUyA9ICdEQVlTJyxcblxuICAvKipcbiAgICogSG91ciBpbnRlcnZhbC5cbiAgICovXG4gIEhPVVJTID0gJ0hPVVJTJyxcblxuICAvKipcbiAgICogTWludXRlIGludGVydmFsLlxuICAgKi9cbiAgTUlOVVRFUyA9ICdNSU5VVEVTJyxcblxuICAvKipcbiAgICogU2Vjb25kIGludGVydmFsLlxuICAgKi9cbiAgU0VDT05EUyA9ICdTRUNPTkRTJyxcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBJTlRFR0VSIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZWdlclBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMge1xuICAvKipcbiAgICogTWluaW11bSB2YWx1ZSBmb3IgdGhlIGludGVnZXIgcGFydGl0aW9uIHJhbmdlIChpbmNsdXNpdmUpLlxuICAgKi9cbiAgcmVhZG9ubHkgbWluOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdmFsdWUgZm9yIHRoZSBpbnRlZ2VyIHBhcnRpdGlvbiByYW5nZSAoaW5jbHVzaXZlKS5cbiAgICovXG4gIHJlYWRvbmx5IG1heDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJbnRlcnZhbCBiZXR3ZWVuIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIHJlYWRvbmx5IGludGVydmFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZGlnaXRzIHRvIHBhZCB0aGUgcGFydGl0aW9uIHZhbHVlIHdpdGggbGVhZGluZyB6ZXJvcy5cbiAgICpcbiAgICogV2l0aCBkaWdpdHM6IDQsIHBhcnRpdGlvbiB2YWx1ZXM6IDAwMDEsIDAwMDIsIC4uLiwgMDEwMFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHN0YXRpYyBudW1iZXIgb2YgZGlnaXRzIGFuZCBubyBsZWFkaW5nIHplcm9lc1xuICAgKi9cbiAgcmVhZG9ubHkgZGlnaXRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIERBVEUgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRlUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBTdGFydCBkYXRlIGZvciB0aGUgcGFydGl0aW9uIHJhbmdlIChpbmNsdXNpdmUpLlxuICAgKlxuICAgKiBDYW4gYmUgZWl0aGVyOlxuICAgKiAtIEZpeGVkIGRhdGUgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgYnkgYGZvcm1hdGAgcHJvcGVydHlcbiAgICogICAoZS5nLiwgJzIwMjAtMDEtMDEnIGZvciBmb3JtYXQgJ3l5eXktTU0tZGQnKVxuICAgKiAtIFJlbGF0aXZlIGRhdGUgdXNpbmcgTk9XIHN5bnRheFxuICAgKiAgIChlLmcuLCAnTk9XJywgJ05PVy0zWUVBUlMnLCAnTk9XKzFNT05USCcpXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvcGFydGl0aW9uLXByb2plY3Rpb24tc3VwcG9ydGVkLXR5cGVzLmh0bWwjcGFydGl0aW9uLXByb2plY3Rpb24tZGF0ZS10eXBlXG4gICAqL1xuICByZWFkb25seSBtaW46IHN0cmluZztcblxuICAvKipcbiAgICogRW5kIGRhdGUgZm9yIHRoZSBwYXJ0aXRpb24gcmFuZ2UgKGluY2x1c2l2ZSkuXG4gICAqXG4gICAqIENhbiBiZSBlaXRoZXI6XG4gICAqIC0gRml4ZWQgZGF0ZSBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSBgZm9ybWF0YCBwcm9wZXJ0eVxuICAgKiAtIFJlbGF0aXZlIGRhdGUgdXNpbmcgTk9XIHN5bnRheFxuICAgKlxuICAgKiBTYW1lIGZvcm1hdCBjb25zdHJhaW50cyBhcyBgbWluYC5cbiAgICovXG4gIHJlYWRvbmx5IG1heDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEYXRlIGZvcm1hdCBmb3IgcGFydGl0aW9uIHZhbHVlcy5cbiAgICpcbiAgICogVXNlcyBKYXZhIFNpbXBsZURhdGVGb3JtYXQgcGF0dGVybnMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy9hcGkvamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXQuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEludGVydmFsIGJldHdlZW4gcGFydGl0aW9uIHZhbHVlcy5cbiAgICpcbiAgICogUmVxdWlyZWQgKHRvZ2V0aGVyIHdpdGggYGludGVydmFsVW5pdGApIHdoZW4gYGZvcm1hdGAgY2FycmllcyBzdWItZGF5XG4gICAqIHByZWNpc2lvbiDigJQgaS5lLiBhIGZpZWxkIGZpbmVyIHRoYW4gYSBkYXksIHN1Y2ggYXMgaG91cnMgb3IgQU0vUE0uIEF0IGRheVxuICAgKiBvciBjb2Fyc2VyIHByZWNpc2lvbiBBdGhlbmEgZGVmYXVsdHMgdGhlIHN0ZXAsIHNvIGl0IGlzIG9wdGlvbmFsLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEF0aGVuYSdzIGRlZmF1bHQgc3RlcCBmb3IgdGhlIGZvcm1hdCdzIHByZWNpc2lvbjsgcmVxdWlyZWQgd2hlbiBgZm9ybWF0YCBpcyBzdWItZGF5IHByZWNpc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFVuaXQgZm9yIHRoZSBpbnRlcnZhbC5cbiAgICpcbiAgICogUmVxdWlyZWQgKHRvZ2V0aGVyIHdpdGggYGludGVydmFsYCkgd2hlbiBgZm9ybWF0YCBjYXJyaWVzIHN1Yi1kYXlcbiAgICogcHJlY2lzaW9uIOKAlCBpLmUuIGEgZmllbGQgZmluZXIgdGhhbiBhIGRheSwgc3VjaCBhcyBob3VycyBvciBBTS9QTS4gQXQgZGF5XG4gICAqIG9yIGNvYXJzZXIgcHJlY2lzaW9uIEF0aGVuYSBkZWZhdWx0cyB0aGUgc3RlcCwgc28gaXQgaXMgb3B0aW9uYWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQXRoZW5hJ3MgZGVmYXVsdCB1bml0IGZvciB0aGUgZm9ybWF0J3MgcHJlY2lzaW9uOyByZXF1aXJlZCB3aGVuIGBmb3JtYXRgIGlzIHN1Yi1kYXkgcHJlY2lzaW9uXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbFVuaXQ/OiBEYXRlSW50ZXJ2YWxVbml0O1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIEVOVU0gcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnVtUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBFeHBsaWNpdCBsaXN0IG9mIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlIFsndXMtZWFzdC0xJywgJ3VzLXdlc3QtMicsICdldS13ZXN0LTEnXVxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBwcm9wZXJ0aWVzIGZvciBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbi5cbiAqL1xuaW50ZXJmYWNlIFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgcGFydGl0aW9uIHByb2plY3Rpb24uXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZTtcblxuICAvKipcbiAgICogUmFuZ2Ugb2YgcGFydGl0aW9uIHZhbHVlcyBmb3IgSU5URUdFUiB0eXBlLlxuICAgKlxuICAgKiBBcnJheSBvZiBbbWluLCBtYXhdIGFzIG51bWJlcnMuXG4gICAqL1xuICByZWFkb25seSBpbnRlZ2VyUmFuZ2U/OiBudW1iZXJbXTtcblxuICAvKipcbiAgICogUmFuZ2Ugb2YgcGFydGl0aW9uIHZhbHVlcyBmb3IgREFURSB0eXBlLlxuICAgKlxuICAgKiBBcnJheSBvZiBbc3RhcnQsIGVuZF0gYXMgZGF0ZSBzdHJpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0ZVJhbmdlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEludGVydmFsIGJldHdlZW4gcGFydGl0aW9uIHZhbHVlcy5cbiAgICovXG4gIHJlYWRvbmx5IGludGVydmFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZGlnaXRzIHRvIHBhZCBJTlRFR0VSIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqL1xuICByZWFkb25seSBkaWdpdHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERhdGUgZm9ybWF0IGZvciBEQVRFIHBhcnRpdGlvbiB2YWx1ZXMgKEphdmEgU2ltcGxlRGF0ZUZvcm1hdCkuXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVuaXQgZm9yIERBVEUgcGFydGl0aW9uIGludGVydmFsLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWxVbml0PzogRGF0ZUludGVydmFsVW5pdDtcblxuICAvKipcbiAgICogRXhwbGljaXQgbGlzdCBvZiB2YWx1ZXMgZm9yIEVOVU0gcGFydGl0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBEQVRFIHByb2plY3Rpb24gYGZvcm1hdGAgY2FycmllcyBzdWItZGF5IHByZWNpc2lvbiwgaW4gd2hpY2ggY2FzZVxuICogQXRoZW5hIHJlcXVpcmVzIGJvdGggYGludGVydmFsYCBhbmQgYGludGVydmFsVW5pdGAuXG4gKlxuICogQXRoZW5hIG9ubHkgcmVxdWlyZXMgdGhlIHR3byB3aGVuIHRoZSBmb3JtYXQgY29udGFpbnMgYSBmaWVsZCBmaW5lciB0aGFuIGFcbiAqIGRheSAoaG91ci9taW51dGUvc2Vjb25kL2ZyYWN0aW9uLCBvciBBTS9QTSkuIEF0IGRheSwgbW9udGgsIG9yIGNvYXJzZXJcbiAqIHByZWNpc2lvbiBpdCBkZWZhdWx0cyB0aGUgc3RlcCBhbmQgYWNjZXB0cyB0aGUgZm9ybWF0IHdpdGhvdXQgdGhlbSDigJQgc28sIGUuZy5cbiAqIGEgcGxhaW4gYHl5eXlgIG5lZWRzIG5vIGludGVydmFsLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvcGFydGl0aW9uLXByb2plY3Rpb24tc3VwcG9ydGVkLXR5cGVzLmh0bWwjcGFydGl0aW9uLXByb2plY3Rpb24tZGF0ZS10eXBlXG4gKi9cbmZ1bmN0aW9uIGRhdGVGb3JtYXRSZXF1aXJlc0ludGVydmFsKGZvcm1hdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENvbGxlY3QgdGhlIHVucXVvdGVkIEphdmEgRGF0ZVRpbWVGb3JtYXR0ZXIgcGF0dGVybiBsZXR0ZXJzLCBob25vcmluZyB0aGVcbiAgLy8gc2FtZSBzaW5nbGUtcXVvdGUgbGl0ZXJhbCBlc2NhcGluZyBhcyB0aGUgZm9ybWF0IHZhbGlkYXRpb24gYWJvdmUuXG4gIGNvbnN0IGxldHRlcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgbGV0IGluUXVvdGUgPSBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaCA9IGZvcm1hdFtpXTtcbiAgICBpZiAoY2ggPT09IFwiJ1wiKSB7XG4gICAgICBpZiAoaSArIDEgPCBmb3JtYXQubGVuZ3RoICYmIGZvcm1hdFtpICsgMV0gPT09IFwiJ1wiKSB7XG4gICAgICAgIGkrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluUXVvdGUgPSAhaW5RdW90ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpblF1b3RlICYmIC9bYS16QS1aXS8udGVzdChjaCkpIHtcbiAgICAgIGxldHRlcnMuYWRkKGNoKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdWItZGF5IGZpZWxkcyDigJQgYW55dGhpbmcgZmluZXIgdGhhbiBhIGRheS4gYGFgIChBTS9QTS1vZi1kYXkpIHNwbGl0cyB0aGVcbiAgLy8gZGF5IGluIHR3bywgc28gaXQgY291bnRzIGFsb25nc2lkZSBob3VyL21pbnV0ZS9zZWNvbmQvZnJhY3Rpb24vbmFubzpcbiAgLy8gICBhIGFtL3BtICBoIGNsb2NrLWhvdXIoMS0xMikgIEsgaG91ci1vZi1hbS1wbSgwLTExKSAgayBjbG9jay1ob3VyKDEtMjQpXG4gIC8vICAgSCBob3VyLW9mLWRheSgwLTIzKSAgbSBtaW51dGUgIHMgc2Vjb25kICBTIGZyYWN0aW9uICBBIG1pbGxpLW9mLWRheVxuICAvLyAgIG4gbmFuby1vZi1zZWNvbmQgIE4gbmFuby1vZi1kYXlcbiAgLy8gRXZlcnkgY29hcnNlciBmaWVsZCAoZGF5LCBtb250aCwgeWVhciwgd2VlaywgcXVhcnRlciwgZGF5LW9mLXdlZWspIGlzXG4gIC8vIGFjY2VwdGVkIGJ5IEF0aGVuYSB3aXRob3V0IGFuIGludGVydmFsLCBzbyBvbmx5IHRoZSBzdWItZGF5IHNldCByZXF1aXJlcyBpdC5cbiAgcmV0dXJuIFsuLi4nYWhLa0htc1NBbk4nXS5zb21lKGMgPT4gbGV0dGVycy5oYXMoYykpO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGFuIElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaW50ZWdlcihwcm9wczogSW50ZWdlclBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMpOiBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gICAgLy8gVmFsaWRhdGUgbWluL21heCBhcmUgaW50ZWdlcnNcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5taW4pICYmICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMubWF4KSkge1xuICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHByb3BzLm1pbikgfHwgIU51bWJlci5pc0ludGVnZXIocHJvcHMubWF4KSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YEludGVnZXJSYW5nZU5vdEludGVnZXJzYCxcbiAgICAgICAgICBgSU5URUdFUiBwYXJ0aXRpb24gcHJvamVjdGlvbiByYW5nZSBtdXN0IGNvbnRhaW4gaW50ZWdlcnMsIGJ1dCBnb3QgWyR7cHJvcHMubWlufSwgJHtwcm9wcy5tYXh9XWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIG1pbiA8PSBtYXhcbiAgICAgIGlmIChwcm9wcy5taW4gPiBwcm9wcy5tYXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBJbnRlZ2VyUmFuZ2VNaW5HcmVhdGVyVGhhbk1heGAsXG4gICAgICAgICAgYElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gcmFuZ2UgbXVzdCBiZSBbbWluLCBtYXhdIHdoZXJlIG1pbiA8PSBtYXgsIGJ1dCBnb3QgWyR7cHJvcHMubWlufSwgJHtwcm9wcy5tYXh9XWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW50ZXJ2YWxcbiAgICBpZiAoXG4gICAgICBwcm9wcy5pbnRlcnZhbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLmludGVydmFsKSAmJlxuICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKHByb3BzLmludGVydmFsKSB8fCBwcm9wcy5pbnRlcnZhbCA8PSAwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgSW50ZWdlckludGVydmFsSW52YWxpZGAsXG4gICAgICAgIGBJTlRFR0VSIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGludGVydmFsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBidXQgZ290ICR7cHJvcHMuaW50ZXJ2YWx9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZGlnaXRzXG4gICAgaWYgKFxuICAgICAgcHJvcHMuZGlnaXRzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuZGlnaXRzKSAmJlxuICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKHByb3BzLmRpZ2l0cykgfHwgcHJvcHMuZGlnaXRzIDwgMSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YEludGVnZXJEaWdpdHNJbnZhbGlkYCxcbiAgICAgICAgYElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gZGlnaXRzIG11c3QgYmUgYW4gaW50ZWdlciA+PSAxLCBidXQgZ290ICR7cHJvcHMuZGlnaXRzfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24oe1xuICAgICAgdHlwZTogUGFydGl0aW9uUHJvamVjdGlvblR5cGUuSU5URUdFUixcbiAgICAgIGludGVnZXJSYW5nZTogW3Byb3BzLm1pbiwgcHJvcHMubWF4XSxcbiAgICAgIGludGVydmFsOiBwcm9wcy5pbnRlcnZhbCxcbiAgICAgIGRpZ2l0czogcHJvcHMuZGlnaXRzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERBVEUgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZShwcm9wczogRGF0ZVBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMpOiBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gICAgLy8gVmFsaWRhdGUgbWluL21heCBhcmUgbm90IGVtcHR5XG4gICAgaWYgKFxuICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5taW4pICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLm1heCkgJiZcbiAgICAgIChwcm9wcy5taW4udHJpbSgpID09PSAnJyB8fCBwcm9wcy5tYXgudHJpbSgpID09PSAnJylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YERhdGVSYW5nZUVtcHR5YCxcbiAgICAgICAgJ0RBVEUgcGFydGl0aW9uIHByb2plY3Rpb24gcmFuZ2UgbXVzdCBub3QgY29udGFpbiBlbXB0eSBzdHJpbmdzJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZm9ybWF0XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuZm9ybWF0KSkge1xuICAgICAgLy8gVmFsaWRhdGUgZm9ybWF0IGlzIG5vdCBlbXB0eVxuICAgICAgaWYgKHByb3BzLmZvcm1hdC50cmltKCkgPT09ICcnKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgRGF0ZUZvcm1hdEVtcHR5YCxcbiAgICAgICAgICAnREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBmb3JtYXQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBmb3JtYXQgcGF0dGVybiBjaGFyYWN0ZXJzIChKYXZhIDggRGF0ZVRpbWVGb3JtYXR0ZXIpXG4gICAgICBjb25zdCB2YWxpZFBhdHRlcm5MZXR0ZXJzID0gJ0d5dVlETUxkUXF3V0VlY0ZhaEtrSG1zU0FuTlZ6T1h4WnAnO1xuICAgICAgY29uc3QgZm9ybWF0ID0gcHJvcHMuZm9ybWF0O1xuICAgICAgbGV0IGluUXVvdGUgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGludmFsaWRDaGFyczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2ggPSBmb3JtYXRbaV07XG4gICAgICAgIGlmIChjaCA9PT0gXCInXCIpIHtcbiAgICAgICAgICBpZiAoaSArIDEgPCBmb3JtYXQubGVuZ3RoICYmIGZvcm1hdFtpICsgMV0gPT09IFwiJ1wiKSB7XG4gICAgICAgICAgICAvLyAnJyBpcyBhbiBlc2NhcGVkIHNpbmdsZSBxdW90ZSBsaXRlcmFsLCBza2lwIGJvdGhcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5RdW90ZSA9ICFpblF1b3RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaW5RdW90ZSAmJiAvW2EtekEtWl0vLnRlc3QoY2gpKSB7XG4gICAgICAgICAgaWYgKCF2YWxpZFBhdHRlcm5MZXR0ZXJzLmluY2x1ZGVzKGNoKSkge1xuICAgICAgICAgICAgaW52YWxpZENoYXJzLnB1c2goY2gpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5RdW90ZSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YERhdGVGb3JtYXRVbmNsb3NlZFF1b3RlYCxcbiAgICAgICAgICBgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBmb3JtYXQgaGFzIGFuIHVuY2xvc2VkIHNpbmdsZSBxdW90ZTogJyR7Zm9ybWF0fSdgLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW52YWxpZENoYXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdW5pcXVlID0gWy4uLm5ldyBTZXQoaW52YWxpZENoYXJzKV07XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgRGF0ZUZvcm1hdEludmFsaWRDaGFyYWN0ZXJzYCxcbiAgICAgICAgICBgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBmb3JtYXQgY29udGFpbnMgaW52YWxpZCBwYXR0ZXJuIGNoYXJhY3RlcnM6ICR7dW5pcXVlLmpvaW4oJywgJyl9LiBNdXN0IHVzZSBKYXZhIERhdGVUaW1lRm9ybWF0dGVyIHZhbGlkIHBhdHRlcm4gbGV0dGVycy5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGludGVydmFsXG4gICAgaWYgKFxuICAgICAgcHJvcHMuaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5pbnRlcnZhbCkgJiZcbiAgICAgICghTnVtYmVyLmlzSW50ZWdlcihwcm9wcy5pbnRlcnZhbCkgfHwgcHJvcHMuaW50ZXJ2YWwgPD0gMClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YERhdGVJbnRlcnZhbEludmFsaWRgLFxuICAgICAgICBgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBpbnRlcnZhbCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgYnV0IGdvdCAke3Byb3BzLmludGVydmFsfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEZvciBzdWItZGF5IHByZWNpc2lvbiAoYSBmaWVsZCBmaW5lciB0aGFuIGEgZGF5KSwgQXRoZW5hIHJlcXVpcmVzIGJvdGhcbiAgICAvLyBgaW50ZXJ2YWxgIGFuZCBgaW50ZXJ2YWxVbml0YDsgYXQgZGF5IG9yIGNvYXJzZXIgcHJlY2lzaW9uIGl0IGRlZmF1bHRzXG4gICAgLy8gdGhlbS4gT25seSBlbmZvcmNlIHdoZW4gdGhlIGZvcm1hdCBpcyBhIHJlc29sdmVkIGxpdGVyYWwgd2UgY2FuIGluc3BlY3QuXG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuZm9ybWF0KSAmJiBkYXRlRm9ybWF0UmVxdWlyZXNJbnRlcnZhbChwcm9wcy5mb3JtYXQpKSB7XG4gICAgICBpZiAocHJvcHMuaW50ZXJ2YWwgPT09IHVuZGVmaW5lZCB8fCBwcm9wcy5pbnRlcnZhbFVuaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YERhdGVJbnRlcnZhbFJlcXVpcmVkYCxcbiAgICAgICAgICBgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiB3aXRoIGZvcm1hdCAnJHtwcm9wcy5mb3JtYXR9JyBoYXMgc3ViLWRheSBwcmVjaXNpb24sIHNvIGJvdGggJ2ludGVydmFsJyBhbmQgJ2ludGVydmFsVW5pdCcgYXJlIHJlcXVpcmVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uKHtcbiAgICAgIHR5cGU6IFBhcnRpdGlvblByb2plY3Rpb25UeXBlLkRBVEUsXG4gICAgICBkYXRlUmFuZ2U6IFtwcm9wcy5taW4sIHByb3BzLm1heF0sXG4gICAgICBpbnRlcnZhbDogcHJvcHMuaW50ZXJ2YWwsXG4gICAgICBmb3JtYXQ6IHByb3BzLmZvcm1hdCxcbiAgICAgIGludGVydmFsVW5pdDogcHJvcHMuaW50ZXJ2YWxVbml0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBFTlVNIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGVudW0ocHJvcHM6IEVudW1QYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvblByb3BzKTogUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAgIC8vIFZhbGlkYXRlIHZhbHVlcyBpcyBub3QgZW1wdHlcbiAgICBpZiAocHJvcHMudmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgRW51bVZhbHVlc0VtcHR5YCxcbiAgICAgICAgJ0VOVU0gcGFydGl0aW9uIHByb2plY3Rpb24gdmFsdWVzIG11c3QgYmUgYSBub24tZW1wdHkgYXJyYXknLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmFsdWUgPSBwcm9wcy52YWx1ZXNbaV07XG4gICAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZCh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICBsaXRgRW51bVZhbHVlRW1wdHlgLFxuICAgICAgICAgICAgJ0VOVU0gcGFydGl0aW9uIHByb2plY3Rpb24gdmFsdWVzIG11c3Qgbm90IGNvbnRhaW4gZW1wdHkgc3RyaW5ncycsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoJywnKSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIGxpdGBFbnVtVmFsdWVDb250YWluc0NvbW1hYCxcbiAgICAgICAgICAgIGBFTlVNIHBhcnRpdGlvbiBwcm9qZWN0aW9uIHZhbHVlcyBtdXN0IG5vdCBjb250YWluIGNvbW1hcyBiZWNhdXNlIHRoZSB2YWx1ZXMgYXJlIHNlcmlhbGl6ZWQgYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCwgZ290OiAnJHt2YWx1ZX0nYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbih7XG4gICAgICB0eXBlOiBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5FTlVNLFxuICAgICAgdmFsdWVzOiBwcm9wcy52YWx1ZXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIElOSkVDVEVEIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFBhcnRpdGlvbiB2YWx1ZXMgYXJlIGluamVjdGVkIGF0IHF1ZXJ5IHRpbWUgdGhyb3VnaCB0aGUgcXVlcnkgc3RhdGVtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hdGhlbmEvbGF0ZXN0L3VnL3BhcnRpdGlvbi1wcm9qZWN0aW9uLXN1cHBvcnRlZC10eXBlcy5odG1sI3BhcnRpdGlvbi1wcm9qZWN0aW9uLWluamVjdGVkLXR5cGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaW5qZWN0ZWQoKTogUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24oe1xuICAgICAgdHlwZTogUGFydGl0aW9uUHJvamVjdGlvblR5cGUuSU5KRUNURUQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgcGFydGl0aW9uIHByb2plY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogUGFydGl0aW9uUHJvamVjdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIFJhbmdlIG9mIHBhcnRpdGlvbiB2YWx1ZXMgZm9yIElOVEVHRVIgdHlwZS5cbiAgICpcbiAgICogQXJyYXkgb2YgW21pbiwgbWF4XSBhcyBudW1iZXJzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGludGVnZXJSYW5nZT86IG51bWJlcltdO1xuXG4gIC8qKlxuICAgKiBSYW5nZSBvZiBwYXJ0aXRpb24gdmFsdWVzIGZvciBEQVRFIHR5cGUuXG4gICAqXG4gICAqIEFycmF5IG9mIFtzdGFydCwgZW5kXSBhcyBkYXRlIHN0cmluZ3MuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0ZVJhbmdlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEludGVydmFsIGJldHdlZW4gcGFydGl0aW9uIHZhbHVlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbnRlcnZhbD86IG51bWJlcjtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIGRpZ2l0cyB0byBwYWQgSU5URUdFUiBwYXJ0aXRpb24gdmFsdWVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpZ2l0cz86IG51bWJlcjtcblxuICAvKipcbiAgICogRGF0ZSBmb3JtYXQgZm9yIERBVEUgcGFydGl0aW9uIHZhbHVlcyAoSmF2YSBTaW1wbGVEYXRlRm9ybWF0KS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVuaXQgZm9yIERBVEUgcGFydGl0aW9uIGludGVydmFsLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGludGVydmFsVW5pdD86IERhdGVJbnRlcnZhbFVuaXQ7XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0IGxpc3Qgb2YgdmFsdWVzIGZvciBFTlVNIHBhcnRpdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcm9wczogUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb25Qcm9wcykge1xuICAgIHRoaXMudHlwZSA9IHByb3BzLnR5cGU7XG4gICAgdGhpcy5pbnRlZ2VyUmFuZ2UgPSBwcm9wcy5pbnRlZ2VyUmFuZ2U7XG4gICAgdGhpcy5kYXRlUmFuZ2UgPSBwcm9wcy5kYXRlUmFuZ2U7XG4gICAgdGhpcy5pbnRlcnZhbCA9IHByb3BzLmludGVydmFsO1xuICAgIHRoaXMuZGlnaXRzID0gcHJvcHMuZGlnaXRzO1xuICAgIHRoaXMuZm9ybWF0ID0gcHJvcHMuZm9ybWF0O1xuICAgIHRoaXMuaW50ZXJ2YWxVbml0ID0gcHJvcHMuaW50ZXJ2YWxVbml0O1xuICAgIHRoaXMudmFsdWVzID0gcHJvcHMudmFsdWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgQ2xvdWRGb3JtYXRpb24gcGFyYW1ldGVycyBmb3IgdGhpcyBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uTmFtZSAtIFRoZSBwYXJ0aXRpb24gY29sdW1uIG5hbWVcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3JlbmRlclBhcmFtZXRlcnMoY29sdW1uTmFtZTogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgcGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0udHlwZWBdOiB0aGlzLnR5cGUsXG4gICAgfTtcblxuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFBhcnRpdGlvblByb2plY3Rpb25UeXBlLklOVEVHRVI6IHtcbiAgICAgICAgY29uc3QgW21pbiwgbWF4XSA9IHRoaXMuaW50ZWdlclJhbmdlITtcbiAgICAgICAgcGFyYW1zW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0ucmFuZ2VgXSA9IGAke21pbn0sJHttYXh9YDtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LmludGVydmFsYF0gPSB0aGlzLmludGVydmFsLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGlnaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS5kaWdpdHNgXSA9IHRoaXMuZGlnaXRzLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFBhcnRpdGlvblByb2plY3Rpb25UeXBlLkRBVEU6IHtcbiAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdGhpcy5kYXRlUmFuZ2UhO1xuICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS5yYW5nZWBdID0gYCR7c3RhcnR9LCR7ZW5kfWA7XG4gICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LmZvcm1hdGBdID0gdGhpcy5mb3JtYXQhO1xuICAgICAgICBpZiAodGhpcy5pbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcGFyYW1zW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0uaW50ZXJ2YWxgXSA9IHRoaXMuaW50ZXJ2YWwudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbnRlcnZhbFVuaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LmludGVydmFsLnVuaXRgXSA9IHRoaXMuaW50ZXJ2YWxVbml0O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5FTlVNOiB7XG4gICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LnZhbHVlc2BdID0gdGhpcy52YWx1ZXMhLmpvaW4oJywnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFBhcnRpdGlvblByb2plY3Rpb25UeXBlLklOSkVDVEVEOiB7XG4gICAgICAgIC8vIElOSkVDVEVEIGhhcyBubyBhZGRpdGlvbmFsIHBhcmFtZXRlcnNcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIFR5cGVTY3JpcHQgZXhoYXVzdGl2ZW5lc3MgY2hlY2tcbiAgICAgICAgY29uc3QgZXhoYXVzdGl2ZUNoZWNrOiBuZXZlciA9IHRoaXMudHlwZTtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBVbmtub3duUHJvamVjdGlvblR5cGVgLFxuICAgICAgICAgIGBVbmtub3duIHBhcnRpdGlvbiBwcm9qZWN0aW9uIHR5cGUgZm9yIFwiJHtjb2x1bW5OYW1lfVwiOiAke2V4aGF1c3RpdmVDaGVja31gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uIGZvciBhIHRhYmxlLlxuICpcbiAqIE1hcHMgcGFydGl0aW9uIGNvbHVtbiBuYW1lcyB0byB0aGVpciBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICogVGhlIGtleSBpcyB0aGUgcGFydGl0aW9uIGNvbHVtbiBuYW1lLCB0aGUgdmFsdWUgaXMgdGhlIHBhcnRpdGlvbiBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgdHlwZSBQYXJ0aXRpb25Qcm9qZWN0aW9uID0ge1xuICBbY29sdW1uTmFtZTogc3RyaW5nXTogUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb247XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBDbG91ZEZvcm1hdGlvbiBwYXJhbWV0ZXJzIGZvciBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uLlxuICpcbiAqIEBwYXJhbSBjb2x1bW5OYW1lIC0gVGhlIHBhcnRpdGlvbiBjb2x1bW4gbmFtZVxuICogQHBhcmFtIGNvbmZpZyAtIFRoZSBwYXJ0aXRpb24gY29uZmlndXJhdGlvblxuICogQHJldHVybnMgQ2xvdWRGb3JtYXRpb24gcGFyYW1ldGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVQYXJ0aXRpb25Qcm9qZWN0aW9uUGFyYW1ldGVycyhcbiAgY29sdW1uTmFtZTogc3RyaW5nLFxuICBjb25maWc6IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uLFxuKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gIHJldHVybiBjb25maWcuX3JlbmRlclBhcmFtZXRlcnMoY29sdW1uTmFtZSk7XG59XG4iXX0=
369
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFydGl0aW9uLXByb2plY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwYXJ0aXRpb24tcHJvamVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE0a0JBLHNGQUtDOzs7QUFqbEJELDZDQUE2RDtBQUM3RCw0RUFBNEQ7QUFFNUQ7Ozs7OztHQU1HO0FBQ0gsSUFBWSx1QkFvQlg7QUFwQkQsV0FBWSx1QkFBdUI7SUFDakM7O09BRUc7SUFDSCw4Q0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILHdDQUFhLENBQUE7SUFFYjs7T0FFRztJQUNILHdDQUFhLENBQUE7SUFFYjs7T0FFRztJQUNILGdEQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFwQlcsdUJBQXVCLHVDQUF2Qix1QkFBdUIsUUFvQmxDO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksZ0JBbUNYO0FBbkNELFdBQVksZ0JBQWdCO0lBQzFCOztPQUVHO0lBQ0gsbUNBQWUsQ0FBQTtJQUVmOztPQUVHO0lBQ0gscUNBQWlCLENBQUE7SUFFakI7O09BRUc7SUFDSCxtQ0FBZSxDQUFBO0lBRWY7O09BRUc7SUFDSCxpQ0FBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCxtQ0FBZSxDQUFBO0lBRWY7O09BRUc7SUFDSCx1Q0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILHVDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFuQ1csZ0JBQWdCLGdDQUFoQixnQkFBZ0IsUUFtQzNCO0FBa0tEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLDBCQUEwQixDQUFDLE1BQWM7SUFDaEQsNEVBQTRFO0lBQzVFLHFFQUFxRTtJQUNyRSxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ2xDLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZD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QUFDLGNBQWMsVUFBVSxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN6RSxDQUFDO2dCQUNELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsTUFBTSxDQUFDLGNBQWMsVUFBVSxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZFLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLE1BQU0sQ0FBQyxjQUFjLFVBQVUsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25FLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUN0Qyx3Q0FBd0M7Z0JBQ3hDLE1BQU07WUFDUixDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDUixrQ0FBa0M7Z0JBQ2xDLE1BQU0sZUFBZSxHQUFVLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3pDLE1BQU0sSUFBSSxxQ0FBdUIsQ0FDL0IsSUFBQSxzQkFBRyxFQUFBLHVCQUF1QixFQUMxQiwwQ0FBMEMsVUFBVSxNQUFNLGVBQWUsRUFBRSxDQUM1RSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztLQUNmOztBQXBTSCw0RUFxU0M7QUFZRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixxQ0FBcUMsQ0FDbkQsVUFBa0IsRUFDbEIsTUFBd0M7SUFFeEMsT0FBTyxNQUFNLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRva2VuLCBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuXG4vKipcbiAqIFBhcnRpdGlvbiBwcm9qZWN0aW9uIHR5cGUuXG4gKlxuICogRGV0ZXJtaW5lcyBob3cgQXRoZW5hIHByb2plY3RzIHBhcnRpdGlvbiB2YWx1ZXMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXRoZW5hL2xhdGVzdC91Zy9wYXJ0aXRpb24tcHJvamVjdGlvbi1zdXBwb3J0ZWQtdHlwZXMuaHRtbFxuICovXG5leHBvcnQgZW51bSBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZSB7XG4gIC8qKlxuICAgKiBQcm9qZWN0IHBhcnRpdGlvbiB2YWx1ZXMgYXMgaW50ZWdlcnMgd2l0aGluIGEgcmFuZ2UuXG4gICAqL1xuICBJTlRFR0VSID0gJ2ludGVnZXInLFxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IHBhcnRpdGlvbiB2YWx1ZXMgYXMgZGF0ZXMgd2l0aGluIGEgcmFuZ2UuXG4gICAqL1xuICBEQVRFID0gJ2RhdGUnLFxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IHBhcnRpdGlvbiB2YWx1ZXMgZnJvbSBhbiBleHBsaWNpdCBsaXN0IG9mIHZhbHVlcy5cbiAgICovXG4gIEVOVU0gPSAnZW51bScsXG5cbiAgLyoqXG4gICAqIFByb2plY3QgcGFydGl0aW9uIHZhbHVlcyB0aGF0IGFyZSBpbmplY3RlZCBhdCBxdWVyeSB0aW1lLlxuICAgKi9cbiAgSU5KRUNURUQgPSAnaW5qZWN0ZWQnLFxufVxuXG4vKipcbiAqIERhdGUgaW50ZXJ2YWwgdW5pdCBmb3IgcGFydGl0aW9uIHByb2plY3Rpb24uXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXRoZW5hL2xhdGVzdC91Zy9wYXJ0aXRpb24tcHJvamVjdGlvbi1zdXBwb3J0ZWQtdHlwZXMuaHRtbCNwYXJ0aXRpb24tcHJvamVjdGlvbi1kYXRlLXR5cGVcbiAqL1xuZXhwb3J0IGVudW0gRGF0ZUludGVydmFsVW5pdCB7XG4gIC8qKlxuICAgKiBZZWFyIGludGVydmFsLlxuICAgKi9cbiAgWUVBUlMgPSAnWUVBUlMnLFxuXG4gIC8qKlxuICAgKiBNb250aCBpbnRlcnZhbC5cbiAgICovXG4gIE1PTlRIUyA9ICdNT05USFMnLFxuXG4gIC8qKlxuICAgKiBXZWVrIGludGVydmFsLlxuICAgKi9cbiAgV0VFS1MgPSAnV0VFS1MnLFxuXG4gIC8qKlxuICAgKiBEYXkgaW50ZXJ2YWwgKGRlZmF1bHQpLlxuICAgKi9cbiAgREFZUyA9ICdEQVlTJyxcblxuICAvKipcbiAgICogSG91ciBpbnRlcnZhbC5cbiAgICovXG4gIEhPVVJTID0gJ0hPVVJTJyxcblxuICAvKipcbiAgICogTWludXRlIGludGVydmFsLlxuICAgKi9cbiAgTUlOVVRFUyA9ICdNSU5VVEVTJyxcblxuICAvKipcbiAgICogU2Vjb25kIGludGVydmFsLlxuICAgKi9cbiAgU0VDT05EUyA9ICdTRUNPTkRTJyxcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBJTlRFR0VSIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZWdlclBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMge1xuICAvKipcbiAgICogTWluaW11bSB2YWx1ZSBmb3IgdGhlIGludGVnZXIgcGFydGl0aW9uIHJhbmdlIChpbmNsdXNpdmUpLlxuICAgKi9cbiAgcmVhZG9ubHkgbWluOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdmFsdWUgZm9yIHRoZSBpbnRlZ2VyIHBhcnRpdGlvbiByYW5nZSAoaW5jbHVzaXZlKS5cbiAgICovXG4gIHJlYWRvbmx5IG1heDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJbnRlcnZhbCBiZXR3ZWVuIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIHJlYWRvbmx5IGludGVydmFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZGlnaXRzIHRvIHBhZCB0aGUgcGFydGl0aW9uIHZhbHVlIHdpdGggbGVhZGluZyB6ZXJvcy5cbiAgICpcbiAgICogV2l0aCBkaWdpdHM6IDQsIHBhcnRpdGlvbiB2YWx1ZXM6IDAwMDEsIDAwMDIsIC4uLiwgMDEwMFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHN0YXRpYyBudW1iZXIgb2YgZGlnaXRzIGFuZCBubyBsZWFkaW5nIHplcm9lc1xuICAgKi9cbiAgcmVhZG9ubHkgZGlnaXRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgcmVxdWlyZWQtdG9nZXRoZXIgaW50ZXJ2YWwgc3RlcCBmb3IgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbi5cbiAqXG4gKiBCdW5kbGluZyBgaW50ZXJ2YWxgIGFuZCBgaW50ZXJ2YWxVbml0YCBpbnRvIG9uZSB2YWx1ZSBtYWtlcyBhIHBhcnRpYWwgc3RlcFxuICogKG9uZSB3aXRob3V0IHRoZSBvdGhlcikgdW5yZXByZXNlbnRhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGVQcm9qZWN0aW9uU3RlcCB7XG4gIC8qKlxuICAgKiBJbnRlcnZhbCBiZXR3ZWVuIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBVbml0IGZvciB0aGUgaW50ZXJ2YWwuXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbFVuaXQ6IERhdGVJbnRlcnZhbFVuaXQ7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGVQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvblByb3BzIHtcbiAgLyoqXG4gICAqIFN0YXJ0IGRhdGUgZm9yIHRoZSBwYXJ0aXRpb24gcmFuZ2UgKGluY2x1c2l2ZSkuXG4gICAqXG4gICAqIENhbiBiZSBlaXRoZXI6XG4gICAqIC0gRml4ZWQgZGF0ZSBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSBgZm9ybWF0YCBwcm9wZXJ0eVxuICAgKiAgIChlLmcuLCAnMjAyMC0wMS0wMScgZm9yIGZvcm1hdCAneXl5eS1NTS1kZCcpXG4gICAqIC0gUmVsYXRpdmUgZGF0ZSB1c2luZyBOT1cgc3ludGF4XG4gICAqICAgKGUuZy4sICdOT1cnLCAnTk9XLTNZRUFSUycsICdOT1crMU1PTlRIJylcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXRoZW5hL2xhdGVzdC91Zy9wYXJ0aXRpb24tcHJvamVjdGlvbi1zdXBwb3J0ZWQtdHlwZXMuaHRtbCNwYXJ0aXRpb24tcHJvamVjdGlvbi1kYXRlLXR5cGVcbiAgICovXG4gIHJlYWRvbmx5IG1pbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbmQgZGF0ZSBmb3IgdGhlIHBhcnRpdGlvbiByYW5nZSAoaW5jbHVzaXZlKS5cbiAgICpcbiAgICogQ2FuIGJlIGVpdGhlcjpcbiAgICogLSBGaXhlZCBkYXRlIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IGBmb3JtYXRgIHByb3BlcnR5XG4gICAqIC0gUmVsYXRpdmUgZGF0ZSB1c2luZyBOT1cgc3ludGF4XG4gICAqXG4gICAqIFNhbWUgZm9ybWF0IGNvbnN0cmFpbnRzIGFzIGBtaW5gLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERhdGUgZm9ybWF0IGZvciBwYXJ0aXRpb24gdmFsdWVzLlxuICAgKlxuICAgKiBVc2VzIEphdmEgU2ltcGxlRGF0ZUZvcm1hdCBwYXR0ZXJucy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL2FwaS9qYXZhL3RleHQvU2ltcGxlRGF0ZUZvcm1hdC5odG1sXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ6IHN0cmluZztcblxuICAvKipcbiAgICogSW50ZXJ2YWwgc3RlcCAoYGludGVydmFsYCArIGBpbnRlcnZhbFVuaXRgKSBiZXR3ZWVuIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqXG4gICAqIFRoZSB0d28gYXJlIHN1cHBsaWVkIHRvZ2V0aGVyLCBzbyBhIHBhcnRpYWwgc3RlcCBjYW5ub3QgYmUgZXhwcmVzc2VkLlxuICAgKiBSZXF1aXJlZCB3aGVuIGBmb3JtYXRgIGNhcnJpZXMgc3ViLWRheSBwcmVjaXNpb24g4oCUIGEgZmllbGQgZmluZXIgdGhhbiBhXG4gICAqIGRheSwgc3VjaCBhcyBob3VycyBvciBBTS9QTTsgYXQgZGF5IG9yIGNvYXJzZXIgcHJlY2lzaW9uIEF0aGVuYSBkZWZhdWx0c1xuICAgKiB0aGUgc3RlcCwgc28gaXQgbWF5IGJlIG9taXR0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQXRoZW5hJ3MgZGVmYXVsdCBzdGVwIGZvciB0aGUgZm9ybWF0J3MgcHJlY2lzaW9uOyByZXF1aXJlZCB3aGVuIGBmb3JtYXRgIGlzIHN1Yi1kYXkgcHJlY2lzaW9uXG4gICAqL1xuICByZWFkb25seSBzdGVwPzogRGF0ZVByb2plY3Rpb25TdGVwO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIEVOVU0gcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnVtUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBFeHBsaWNpdCBsaXN0IG9mIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlIFsndXMtZWFzdC0xJywgJ3VzLXdlc3QtMicsICdldS13ZXN0LTEnXVxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBwcm9wZXJ0aWVzIGZvciBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbi5cbiAqL1xuaW50ZXJmYWNlIFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgcGFydGl0aW9uIHByb2plY3Rpb24uXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZTtcblxuICAvKipcbiAgICogUmFuZ2Ugb2YgcGFydGl0aW9uIHZhbHVlcyBmb3IgSU5URUdFUiB0eXBlLlxuICAgKlxuICAgKiBBcnJheSBvZiBbbWluLCBtYXhdIGFzIG51bWJlcnMuXG4gICAqL1xuICByZWFkb25seSBpbnRlZ2VyUmFuZ2U/OiBudW1iZXJbXTtcblxuICAvKipcbiAgICogUmFuZ2Ugb2YgcGFydGl0aW9uIHZhbHVlcyBmb3IgREFURSB0eXBlLlxuICAgKlxuICAgKiBBcnJheSBvZiBbc3RhcnQsIGVuZF0gYXMgZGF0ZSBzdHJpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0ZVJhbmdlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEludGVydmFsIGJldHdlZW4gcGFydGl0aW9uIHZhbHVlcy5cbiAgICovXG4gIHJlYWRvbmx5IGludGVydmFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZGlnaXRzIHRvIHBhZCBJTlRFR0VSIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqL1xuICByZWFkb25seSBkaWdpdHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERhdGUgZm9ybWF0IGZvciBEQVRFIHBhcnRpdGlvbiB2YWx1ZXMgKEphdmEgU2ltcGxlRGF0ZUZvcm1hdCkuXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVuaXQgZm9yIERBVEUgcGFydGl0aW9uIGludGVydmFsLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWxVbml0PzogRGF0ZUludGVydmFsVW5pdDtcblxuICAvKipcbiAgICogRXhwbGljaXQgbGlzdCBvZiB2YWx1ZXMgZm9yIEVOVU0gcGFydGl0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBEQVRFIHByb2plY3Rpb24gYGZvcm1hdGAgY2FycmllcyBzdWItZGF5IHByZWNpc2lvbiwgaW4gd2hpY2ggY2FzZVxuICogQXRoZW5hIHJlcXVpcmVzIGJvdGggYGludGVydmFsYCBhbmQgYGludGVydmFsVW5pdGAuXG4gKlxuICogQXRoZW5hIG9ubHkgcmVxdWlyZXMgdGhlIHR3byB3aGVuIHRoZSBmb3JtYXQgY29udGFpbnMgYSBmaWVsZCBmaW5lciB0aGFuIGFcbiAqIGRheSAoaG91ci9taW51dGUvc2Vjb25kL2ZyYWN0aW9uLCBvciBBTS9QTSkuIEF0IGRheSwgbW9udGgsIG9yIGNvYXJzZXJcbiAqIHByZWNpc2lvbiBpdCBkZWZhdWx0cyB0aGUgc3RlcCBhbmQgYWNjZXB0cyB0aGUgZm9ybWF0IHdpdGhvdXQgdGhlbSDigJQgc28sIGUuZy5cbiAqIGEgcGxhaW4gYHl5eXlgIG5lZWRzIG5vIGludGVydmFsLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvcGFydGl0aW9uLXByb2plY3Rpb24tc3VwcG9ydGVkLXR5cGVzLmh0bWwjcGFydGl0aW9uLXByb2plY3Rpb24tZGF0ZS10eXBlXG4gKi9cbmZ1bmN0aW9uIGRhdGVGb3JtYXRSZXF1aXJlc0ludGVydmFsKGZvcm1hdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENvbGxlY3QgdGhlIHVucXVvdGVkIEphdmEgRGF0ZVRpbWVGb3JtYXR0ZXIgcGF0dGVybiBsZXR0ZXJzLCBob25vcmluZyB0aGVcbiAgLy8gc2FtZSBzaW5nbGUtcXVvdGUgbGl0ZXJhbCBlc2NhcGluZyBhcyB0aGUgZm9ybWF0IHZhbGlkYXRpb24gYWJvdmUuXG4gIGNvbnN0IGxldHRlcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgbGV0IGluUXVvdGUgPSBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaCA9IGZvcm1hdFtpXTtcbiAgICBpZiAoY2ggPT09IFwiJ1wiKSB7XG4gICAgICBpZiAoaSArIDEgPCBmb3JtYXQubGVuZ3RoICYmIGZvcm1hdFtpICsgMV0gPT09IFwiJ1wiKSB7XG4gICAgICAgIGkrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluUXVvdGUgPSAhaW5RdW90ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpblF1b3RlICYmIC9bYS16QS1aXS8udGVzdChjaCkpIHtcbiAgICAgIGxldHRlcnMuYWRkKGNoKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdWItZGF5IGZpZWxkcyDigJQgYW55dGhpbmcgZmluZXIgdGhhbiBhIGRheS4gYGFgIChBTS9QTS1vZi1kYXkpIHNwbGl0cyB0aGVcbiAgLy8gZGF5IGluIHR3bywgc28gaXQgY291bnRzIGFsb25nc2lkZSBob3VyL21pbnV0ZS9zZWNvbmQvZnJhY3Rpb24vbmFubzpcbiAgLy8gICBhIGFtL3BtICBoIGNsb2NrLWhvdXIoMS0xMikgIEsgaG91ci1vZi1hbS1wbSgwLTExKSAgayBjbG9jay1ob3VyKDEtMjQpXG4gIC8vICAgSCBob3VyLW9mLWRheSgwLTIzKSAgbSBtaW51dGUgIHMgc2Vjb25kICBTIGZyYWN0aW9uICBBIG1pbGxpLW9mLWRheVxuICAvLyAgIG4gbmFuby1vZi1zZWNvbmQgIE4gbmFuby1vZi1kYXlcbiAgLy8gRXZlcnkgY29hcnNlciBmaWVsZCAoZGF5LCBtb250aCwgeWVhciwgd2VlaywgcXVhcnRlciwgZGF5LW9mLXdlZWspIGlzXG4gIC8vIGFjY2VwdGVkIGJ5IEF0aGVuYSB3aXRob3V0IGFuIGludGVydmFsLCBzbyBvbmx5IHRoZSBzdWItZGF5IHNldCByZXF1aXJlcyBpdC5cbiAgcmV0dXJuIFsuLi4nYWhLa0htc1NBbk4nXS5zb21lKGMgPT4gbGV0dGVycy5oYXMoYykpO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGFuIElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaW50ZWdlcihwcm9wczogSW50ZWdlclBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMpOiBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gICAgLy8gVmFsaWRhdGUgbWluL21heCBhcmUgaW50ZWdlcnNcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5taW4pICYmICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMubWF4KSkge1xuICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHByb3BzLm1pbikgfHwgIU51bWJlci5pc0ludGVnZXIocHJvcHMubWF4KSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YEludGVnZXJSYW5nZU5vdEludGVnZXJzYCxcbiAgICAgICAgICBgSU5URUdFUiBwYXJ0aXRpb24gcHJvamVjdGlvbiByYW5nZSBtdXN0IGNvbnRhaW4gaW50ZWdlcnMsIGJ1dCBnb3QgWyR7cHJvcHMubWlufSwgJHtwcm9wcy5tYXh9XWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIG1pbiA8PSBtYXhcbiAgICAgIGlmIChwcm9wcy5taW4gPiBwcm9wcy5tYXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBJbnRlZ2VyUmFuZ2VNaW5HcmVhdGVyVGhhbk1heGAsXG4gICAgICAgICAgYElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gcmFuZ2UgbXVzdCBiZSBbbWluLCBtYXhdIHdoZXJlIG1pbiA8PSBtYXgsIGJ1dCBnb3QgWyR7cHJvcHMubWlufSwgJHtwcm9wcy5tYXh9XWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW50ZXJ2YWxcbiAgICBpZiAoXG4gICAgICBwcm9wcy5pbnRlcnZhbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLmludGVydmFsKSAmJlxuICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKHByb3BzLmludGVydmFsKSB8fCBwcm9wcy5pbnRlcnZhbCA8PSAwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgSW50ZWdlckludGVydmFsSW52YWxpZGAsXG4gICAgICAgIGBJTlRFR0VSIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGludGVydmFsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBidXQgZ290ICR7cHJvcHMuaW50ZXJ2YWx9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZGlnaXRzXG4gICAgaWYgKFxuICAgICAgcHJvcHMuZGlnaXRzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuZGlnaXRzKSAmJlxuICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKHByb3BzLmRpZ2l0cykgfHwgcHJvcHMuZGlnaXRzIDwgMSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YEludGVnZXJEaWdpdHNJbnZhbGlkYCxcbiAgICAgICAgYElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gZGlnaXRzIG11c3QgYmUgYW4gaW50ZWdlciA+PSAxLCBidXQgZ290ICR7cHJvcHMuZGlnaXRzfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24oe1xuICAgICAgdHlwZTogUGFydGl0aW9uUHJvamVjdGlvblR5cGUuSU5URUdFUixcbiAgICAgIGludGVnZXJSYW5nZTogW3Byb3BzLm1pbiwgcHJvcHMubWF4XSxcbiAgICAgIGludGVydmFsOiBwcm9wcy5pbnRlcnZhbCxcbiAgICAgIGRpZ2l0czogcHJvcHMuZGlnaXRzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERBVEUgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZShwcm9wczogRGF0ZVBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMpOiBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gICAgLy8gVmFsaWRhdGUgbWluL21heCBhcmUgbm90IGVtcHR5XG4gICAgaWYgKFxuICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5taW4pICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLm1heCkgJiZcbiAgICAgIChwcm9wcy5taW4udHJpbSgpID09PSAnJyB8fCBwcm9wcy5tYXgudHJpbSgpID09PSAnJylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YERhdGVSYW5nZUVtcHR5YCxcbiAgICAgICAgJ0RBVEUgcGFydGl0aW9uIHByb2plY3Rpb24gcmFuZ2UgbXVzdCBub3QgY29udGFpbiBlbXB0eSBzdHJpbmdzJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZm9ybWF0XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuZm9ybWF0KSkge1xuICAgICAgLy8gVmFsaWRhdGUgZm9ybWF0IGlzIG5vdCBlbXB0eVxuICAgICAgaWYgKHByb3BzLmZvcm1hdC50cmltKCkgPT09ICcnKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgRGF0ZUZvcm1hdEVtcHR5YCxcbiAgICAgICAgICAnREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBmb3JtYXQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBmb3JtYXQgcGF0dGVybiBjaGFyYWN0ZXJzIChKYXZhIDggRGF0ZVRpbWVGb3JtYXR0ZXIpXG4gICAgICBjb25zdCB2YWxpZFBhdHRlcm5MZXR0ZXJzID0gJ0d5dVlETUxkUXF3V0VlY0ZhaEtrSG1zU0FuTlZ6T1h4WnAnO1xuICAgICAgY29uc3QgZm9ybWF0ID0gcHJvcHMuZm9ybWF0O1xuICAgICAgbGV0IGluUXVvdGUgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGludmFsaWRDaGFyczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2ggPSBmb3JtYXRbaV07XG4gICAgICAgIGlmIChjaCA9PT0gXCInXCIpIHtcbiAgICAgICAgICBpZiAoaSArIDEgPCBmb3JtYXQubGVuZ3RoICYmIGZvcm1hdFtpICsgMV0gPT09IFwiJ1wiKSB7XG4gICAgICAgICAgICAvLyAnJyBpcyBhbiBlc2NhcGVkIHNpbmdsZSBxdW90ZSBsaXRlcmFsLCBza2lwIGJvdGhcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5RdW90ZSA9ICFpblF1b3RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaW5RdW90ZSAmJiAvW2EtekEtWl0vLnRlc3QoY2gpKSB7XG4gICAgICAgICAgaWYgKCF2YWxpZFBhdHRlcm5MZXR0ZXJzLmluY2x1ZGVzKGNoKSkge1xuICAgICAgICAgICAgaW52YWxpZENoYXJzLnB1c2goY2gpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5RdW90ZSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YERhdGVGb3JtYXRVbmNsb3NlZFF1b3RlYCxcbiAgICAgICAgICBgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBmb3JtYXQgaGFzIGFuIHVuY2xvc2VkIHNpbmdsZSBxdW90ZTogJyR7Zm9ybWF0fSdgLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW52YWxpZENoYXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdW5pcXVlID0gWy4uLm5ldyBTZXQoaW52YWxpZENoYXJzKV07XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgRGF0ZUZvcm1hdEludmFsaWRDaGFyYWN0ZXJzYCxcbiAgICAgICAgICBgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBmb3JtYXQgY29udGFpbnMgaW52YWxpZCBwYXR0ZXJuIGNoYXJhY3RlcnM6ICR7dW5pcXVlLmpvaW4oJywgJyl9LiBNdXN0IHVzZSBKYXZhIERhdGVUaW1lRm9ybWF0dGVyIHZhbGlkIHBhdHRlcm4gbGV0dGVycy5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGludGVydmFsXG4gICAgaWYgKFxuICAgICAgcHJvcHMuc3RlcCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLnN0ZXAuaW50ZXJ2YWwpICYmXG4gICAgICAoIU51bWJlci5pc0ludGVnZXIocHJvcHMuc3RlcC5pbnRlcnZhbCkgfHwgcHJvcHMuc3RlcC5pbnRlcnZhbCA8PSAwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgRGF0ZUludGVydmFsSW52YWxpZGAsXG4gICAgICAgIGBEQVRFIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGludGVydmFsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBidXQgZ290ICR7cHJvcHMuc3RlcC5pbnRlcnZhbH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGb3Igc3ViLWRheSBwcmVjaXNpb24gKGEgZmllbGQgZmluZXIgdGhhbiBhIGRheSksIEF0aGVuYSByZXF1aXJlcyBhIHN0ZXA7XG4gICAgLy8gYXQgZGF5IG9yIGNvYXJzZXIgcHJlY2lzaW9uIGl0IGRlZmF1bHRzIG9uZS4gVGhlIGludGVydmFsL3VuaXQgcGFpcmluZyBpc1xuICAgIC8vIG5vdyBndWFyYW50ZWVkIGJ5IHRoZSBgc3RlcGAgdHlwZSwgc28gb25seSB0aGUgXCJzdWItZGF5IGZvcm1hdCBuZWVkcyBhXG4gICAgLy8gc3RlcCBhdCBhbGxcIiByZXF1aXJlbWVudCByZW1haW5zLiBFbmZvcmNlIG9ubHkgd2hlbiB0aGUgZm9ybWF0IGlzIGFcbiAgICAvLyByZXNvbHZlZCBsaXRlcmFsIHdlIGNhbiBpbnNwZWN0LlxuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLmZvcm1hdCkgJiYgZGF0ZUZvcm1hdFJlcXVpcmVzSW50ZXJ2YWwocHJvcHMuZm9ybWF0KSAmJiBwcm9wcy5zdGVwID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YERhdGVTdGVwUmVxdWlyZWRgLFxuICAgICAgICBgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiB3aXRoIGZvcm1hdCAnJHtwcm9wcy5mb3JtYXR9JyBoYXMgc3ViLWRheSBwcmVjaXNpb24sIHNvICdzdGVwJyAoaW50ZXJ2YWwgYW5kIGludGVydmFsVW5pdCkgaXMgcmVxdWlyZWRgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uKHtcbiAgICAgIHR5cGU6IFBhcnRpdGlvblByb2plY3Rpb25UeXBlLkRBVEUsXG4gICAgICBkYXRlUmFuZ2U6IFtwcm9wcy5taW4sIHByb3BzLm1heF0sXG4gICAgICBpbnRlcnZhbDogcHJvcHMuc3RlcD8uaW50ZXJ2YWwsXG4gICAgICBmb3JtYXQ6IHByb3BzLmZvcm1hdCxcbiAgICAgIGludGVydmFsVW5pdDogcHJvcHMuc3RlcD8uaW50ZXJ2YWxVbml0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBFTlVNIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGVudW0ocHJvcHM6IEVudW1QYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvblByb3BzKTogUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAgIC8vIFZhbGlkYXRlIHZhbHVlcyBpcyBub3QgZW1wdHlcbiAgICBpZiAocHJvcHMudmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgRW51bVZhbHVlc0VtcHR5YCxcbiAgICAgICAgJ0VOVU0gcGFydGl0aW9uIHByb2plY3Rpb24gdmFsdWVzIG11c3QgYmUgYSBub24tZW1wdHkgYXJyYXknLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmFsdWUgPSBwcm9wcy52YWx1ZXNbaV07XG4gICAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZCh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICBsaXRgRW51bVZhbHVlRW1wdHlgLFxuICAgICAgICAgICAgJ0VOVU0gcGFydGl0aW9uIHByb2plY3Rpb24gdmFsdWVzIG11c3Qgbm90IGNvbnRhaW4gZW1wdHkgc3RyaW5ncycsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoJywnKSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIGxpdGBFbnVtVmFsdWVDb250YWluc0NvbW1hYCxcbiAgICAgICAgICAgIGBFTlVNIHBhcnRpdGlvbiBwcm9qZWN0aW9uIHZhbHVlcyBtdXN0IG5vdCBjb250YWluIGNvbW1hcyBiZWNhdXNlIHRoZSB2YWx1ZXMgYXJlIHNlcmlhbGl6ZWQgYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCwgZ290OiAnJHt2YWx1ZX0nYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbih7XG4gICAgICB0eXBlOiBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5FTlVNLFxuICAgICAgdmFsdWVzOiBwcm9wcy52YWx1ZXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIElOSkVDVEVEIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFBhcnRpdGlvbiB2YWx1ZXMgYXJlIGluamVjdGVkIGF0IHF1ZXJ5IHRpbWUgdGhyb3VnaCB0aGUgcXVlcnkgc3RhdGVtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hdGhlbmEvbGF0ZXN0L3VnL3BhcnRpdGlvbi1wcm9qZWN0aW9uLXN1cHBvcnRlZC10eXBlcy5odG1sI3BhcnRpdGlvbi1wcm9qZWN0aW9uLWluamVjdGVkLXR5cGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaW5qZWN0ZWQoKTogUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24oe1xuICAgICAgdHlwZTogUGFydGl0aW9uUHJvamVjdGlvblR5cGUuSU5KRUNURUQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgcGFydGl0aW9uIHByb2plY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogUGFydGl0aW9uUHJvamVjdGlvblR5cGU7XG5cbiAgLyoqIFJhbmdlIFttaW4sIG1heF0gZm9yIElOVEVHRVIgdHlwZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlZ2VyUmFuZ2U/OiBudW1iZXJbXTtcblxuICAvKiogUmFuZ2UgW3N0YXJ0LCBlbmRdIGZvciBEQVRFIHR5cGUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0ZVJhbmdlPzogc3RyaW5nW107XG5cbiAgLyoqIEludGVydmFsIGJldHdlZW4gcGFydGl0aW9uIHZhbHVlcyAoSU5URUdFUiwgb3IgREFURSBzdGVwKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnZhbD86IG51bWJlcjtcblxuICAvKiogTnVtYmVyIG9mIGRpZ2l0cyB0byBwYWQgSU5URUdFUiBwYXJ0aXRpb24gdmFsdWVzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRpZ2l0cz86IG51bWJlcjtcblxuICAvKiogRGF0ZSBmb3JtYXQgZm9yIERBVEUgcGFydGl0aW9uIHZhbHVlcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqIFVuaXQgZm9yIHRoZSBEQVRFIHBhcnRpdGlvbiBpbnRlcnZhbC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnZhbFVuaXQ/OiBEYXRlSW50ZXJ2YWxVbml0O1xuXG4gIC8qKiBFeHBsaWNpdCBsaXN0IG9mIHZhbHVlcyBmb3IgRU5VTSBwYXJ0aXRpb25zLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJvcHM6IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMpIHtcbiAgICB0aGlzLnR5cGUgPSBwcm9wcy50eXBlO1xuICAgIHRoaXMuaW50ZWdlclJhbmdlID0gcHJvcHMuaW50ZWdlclJhbmdlO1xuICAgIHRoaXMuZGF0ZVJhbmdlID0gcHJvcHMuZGF0ZVJhbmdlO1xuICAgIHRoaXMuaW50ZXJ2YWwgPSBwcm9wcy5pbnRlcnZhbDtcbiAgICB0aGlzLmRpZ2l0cyA9IHByb3BzLmRpZ2l0cztcbiAgICB0aGlzLmZvcm1hdCA9IHByb3BzLmZvcm1hdDtcbiAgICB0aGlzLmludGVydmFsVW5pdCA9IHByb3BzLmludGVydmFsVW5pdDtcbiAgICB0aGlzLnZhbHVlcyA9IHByb3BzLnZhbHVlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIENsb3VkRm9ybWF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoaXMgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNvbHVtbk5hbWUgLSBUaGUgcGFydGl0aW9uIGNvbHVtbiBuYW1lXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9yZW5kZXJQYXJhbWV0ZXJzKGNvbHVtbk5hbWU6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgIFtgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LnR5cGVgXTogdGhpcy50eXBlLFxuICAgIH07XG5cbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5JTlRFR0VSOiB7XG4gICAgICAgIGNvbnN0IFttaW4sIG1heF0gPSB0aGlzLmludGVnZXJSYW5nZSE7XG4gICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LnJhbmdlYF0gPSBgJHttaW59LCR7bWF4fWA7XG4gICAgICAgIGlmICh0aGlzLmludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS5pbnRlcnZhbGBdID0gdGhpcy5pbnRlcnZhbC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRpZ2l0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcGFyYW1zW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0uZGlnaXRzYF0gPSB0aGlzLmRpZ2l0cy50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5EQVRFOiB7XG4gICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMuZGF0ZVJhbmdlITtcbiAgICAgICAgcGFyYW1zW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0ucmFuZ2VgXSA9IGAke3N0YXJ0fSwke2VuZH1gO1xuICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS5mb3JtYXRgXSA9IHRoaXMuZm9ybWF0ITtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LmludGVydmFsYF0gPSB0aGlzLmludGVydmFsLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWxVbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS5pbnRlcnZhbC51bml0YF0gPSB0aGlzLmludGVydmFsVW5pdDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgUGFydGl0aW9uUHJvamVjdGlvblR5cGUuRU5VTToge1xuICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS52YWx1ZXNgXSA9IHRoaXMudmFsdWVzIS5qb2luKCcsJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5JTkpFQ1RFRDoge1xuICAgICAgICAvLyBJTkpFQ1RFRCBoYXMgbm8gYWRkaXRpb25hbCBwYXJhbWV0ZXJzXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBUeXBlU2NyaXB0IGV4aGF1c3RpdmVuZXNzIGNoZWNrXG4gICAgICAgIGNvbnN0IGV4aGF1c3RpdmVDaGVjazogbmV2ZXIgPSB0aGlzLnR5cGU7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgVW5rbm93blByb2plY3Rpb25UeXBlYCxcbiAgICAgICAgICBgVW5rbm93biBwYXJ0aXRpb24gcHJvamVjdGlvbiB0eXBlIGZvciBcIiR7Y29sdW1uTmFtZX1cIjogJHtleGhhdXN0aXZlQ2hlY2t9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG59XG5cbi8qKlxuICogUGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbiBmb3IgYSB0YWJsZS5cbiAqXG4gKiBNYXBzIHBhcnRpdGlvbiBjb2x1bW4gbmFtZXMgdG8gdGhlaXIgcHJvamVjdGlvbiBjb25maWd1cmF0aW9ucy5cbiAqIFRoZSBrZXkgaXMgdGhlIHBhcnRpdGlvbiBjb2x1bW4gbmFtZSwgdGhlIHZhbHVlIGlzIHRoZSBwYXJ0aXRpb24gY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgUGFydGl0aW9uUHJvamVjdGlvbiA9IHtcbiAgW2NvbHVtbk5hbWU6IHN0cmluZ106IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgQ2xvdWRGb3JtYXRpb24gcGFyYW1ldGVycyBmb3IgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gY29sdW1uTmFtZSAtIFRoZSBwYXJ0aXRpb24gY29sdW1uIG5hbWVcbiAqIEBwYXJhbSBjb25maWcgLSBUaGUgcGFydGl0aW9uIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIENsb3VkRm9ybWF0aW9uIHBhcmFtZXRlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUGFydGl0aW9uUHJvamVjdGlvblBhcmFtZXRlcnMoXG4gIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgY29uZmlnOiBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbixcbik6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICByZXR1cm4gY29uZmlnLl9yZW5kZXJQYXJhbWV0ZXJzKGNvbHVtbk5hbWUpO1xufVxuIl19
package/lib/s3-table.d.ts CHANGED
@@ -29,7 +29,10 @@ export declare class S3TableEncryption {
29
29
  static kmsManaged(): S3TableEncryption;
30
30
  /** @internal */
31
31
  readonly _bucketEncryption: s3.BucketEncryption;
32
- /** @internal */
32
+ /**
33
+ * @internal
34
+ * Typed `kms.IKey` (not `IKeyRef`) because it is forwarded to `s3.Bucket`, whose `encryptionKey` prop requires `IKey`.
35
+ */
33
36
  readonly _kmsKey?: kms.IKey;
34
37
  private constructor();
35
38
  }
@@ -82,9 +85,9 @@ export declare class TableClientSideEncryption {
82
85
  *
83
86
  * @param key the KMS key used to encrypt the data. A key is created if one is not provided.
84
87
  */
85
- static kms(key?: kms.IKey): TableClientSideEncryption;
88
+ static kms(key?: kms.IKeyRef): TableClientSideEncryption;
86
89
  /** @internal */
87
- readonly _kmsKey?: kms.IKey;
90
+ readonly _kmsKey?: kms.IKeyRef;
88
91
  private constructor();
89
92
  }
90
93
  export interface S3TableProps extends TableBaseProps {
@@ -137,7 +140,7 @@ export declare class S3Table extends TableBase {
137
140
  *
138
141
  * For server-side (bucket) encryption, read `bucket.encryptionKey` instead.
139
142
  */
140
- readonly clientSideEncryptionKey?: kms.IKey;
143
+ readonly clientSideEncryptionKey?: kms.IKeyRef;
141
144
  /**
142
145
  * This table's partition indexes.
143
146
  */