@aws-cdk/aws-glue-alpha 2.268.0-alpha.0 → 2.270.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +1820 -1612
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +1649 -10
- package/README.md +105 -35
- package/adr/job-arguments.md +212 -0
- package/lib/catalog.js +88 -4
- package/lib/code.js +59 -4
- package/lib/connection.d.ts +44 -29
- package/lib/connection.js +147 -31
- package/lib/constants.d.ts +17 -0
- package/lib/constants.js +20 -2
- package/lib/data-format.js +43 -6
- package/lib/data-quality-ruleset.js +60 -4
- package/lib/database.js +48 -2
- package/lib/external-table.js +48 -2
- package/lib/jobs/job.d.ts +90 -9
- package/lib/jobs/job.js +219 -38
- package/lib/jobs/pyspark-etl-job.d.ts +1 -3
- package/lib/jobs/pyspark-etl-job.js +28 -14
- package/lib/jobs/pyspark-flex-etl-job.d.ts +1 -3
- package/lib/jobs/pyspark-flex-etl-job.js +28 -14
- package/lib/jobs/pyspark-streaming-job.d.ts +1 -3
- package/lib/jobs/pyspark-streaming-job.js +28 -14
- package/lib/jobs/python-shell-job.d.ts +20 -7
- package/lib/jobs/python-shell-job.js +49 -33
- package/lib/jobs/ray-job.js +8 -13
- package/lib/jobs/scala-spark-etl-job.d.ts +1 -3
- package/lib/jobs/scala-spark-etl-job.js +29 -14
- package/lib/jobs/scala-spark-flex-etl-job.d.ts +1 -3
- package/lib/jobs/scala-spark-flex-etl-job.js +29 -14
- package/lib/jobs/scala-spark-streaming-job.d.ts +1 -3
- package/lib/jobs/scala-spark-streaming-job.js +29 -14
- package/lib/jobs/spark-job.d.ts +9 -7
- package/lib/jobs/spark-job.js +26 -32
- package/lib/partition-projection.d.ts +36 -47
- package/lib/partition-projection.js +34 -40
- package/lib/s3-table.js +106 -5
- package/lib/schema.js +50 -3
- package/lib/security-configuration.js +60 -5
- package/lib/storage-parameter.js +91 -2
- package/lib/table-base.js +32 -2
- package/lib/triggers/trigger-options.d.ts +102 -42
- package/lib/triggers/trigger-options.js +242 -3
- package/lib/triggers/workflow.d.ts +31 -47
- package/lib/triggers/workflow.js +87 -142
- package/package.json +10 -10
package/lib/table-base.js
CHANGED
|
@@ -48,8 +48,17 @@ const partition_index_provider_generated_1 = require("../custom-resource-handler
|
|
|
48
48
|
* A Glue table.
|
|
49
49
|
*/
|
|
50
50
|
class TableBase extends core_1.Resource {
|
|
51
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.TableBase", version: "2.
|
|
51
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.TableBase", version: "2.270.0-alpha.0" };
|
|
52
52
|
static fromTableArn(scope, id, tableArn) {
|
|
53
|
+
try {
|
|
54
|
+
jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.TableBase#fromTableArn", "");
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
58
|
+
Error.captureStackTrace(error, this.fromTableArn);
|
|
59
|
+
}
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
53
62
|
const tableName = core_1.Fn.select(1, core_1.Fn.split('/', core_1.Stack.of(scope).splitArn(tableArn, core_1.ArnFormat.SLASH_RESOURCE_NAME).resourceName));
|
|
54
63
|
return TableBase.fromTableAttributes(scope, id, {
|
|
55
64
|
tableArn,
|
|
@@ -65,6 +74,7 @@ class TableBase extends core_1.Resource {
|
|
|
65
74
|
*/
|
|
66
75
|
static fromTableAttributes(scope, id, attrs) {
|
|
67
76
|
try {
|
|
77
|
+
jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.TableBase#fromTableAttributes", "");
|
|
68
78
|
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_TableAttributes(attrs);
|
|
69
79
|
}
|
|
70
80
|
catch (error) {
|
|
@@ -131,6 +141,7 @@ class TableBase extends core_1.Resource {
|
|
|
131
141
|
}),
|
|
132
142
|
});
|
|
133
143
|
try {
|
|
144
|
+
jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.TableBase", "");
|
|
134
145
|
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_TableBaseProps(props);
|
|
135
146
|
}
|
|
136
147
|
catch (error) {
|
|
@@ -161,6 +172,7 @@ class TableBase extends core_1.Resource {
|
|
|
161
172
|
*/
|
|
162
173
|
addPartitionIndex(index) {
|
|
163
174
|
try {
|
|
175
|
+
jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.TableBase#addPartitionIndex", "");
|
|
164
176
|
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_PartitionIndex(index);
|
|
165
177
|
}
|
|
166
178
|
catch (error) {
|
|
@@ -340,6 +352,15 @@ class TableBase extends core_1.Resource {
|
|
|
340
352
|
* @param actions the set of Glue actions to allow (for example `glue:GetTable`)
|
|
341
353
|
*/
|
|
342
354
|
grant(grantee, actions) {
|
|
355
|
+
try {
|
|
356
|
+
jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.TableBase#grant", "");
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
360
|
+
Error.captureStackTrace(error, this.grant);
|
|
361
|
+
}
|
|
362
|
+
throw error;
|
|
363
|
+
}
|
|
343
364
|
return iam.Grant.addToPrincipal({
|
|
344
365
|
grantee,
|
|
345
366
|
resourceArns: [this.tableArn],
|
|
@@ -363,6 +384,15 @@ class TableBase extends core_1.Resource {
|
|
|
363
384
|
* @param actions the set of Glue actions to allow (for example `glue:GetTable`)
|
|
364
385
|
*/
|
|
365
386
|
grantToUnderlyingResources(grantee, actions) {
|
|
387
|
+
try {
|
|
388
|
+
jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.TableBase#grantToUnderlyingResources", "");
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
392
|
+
Error.captureStackTrace(error, this.grantToUnderlyingResources);
|
|
393
|
+
}
|
|
394
|
+
throw error;
|
|
395
|
+
}
|
|
366
396
|
return iam.Grant.addToPrincipal({
|
|
367
397
|
grantee,
|
|
368
398
|
resourceArns: [
|
|
@@ -437,4 +467,4 @@ function validateSchema(columns, partitionKeys) {
|
|
|
437
467
|
names.add(column.name);
|
|
438
468
|
});
|
|
439
469
|
}
|
|
440
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRhYmxlLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSx5REFBMkM7QUFDM0MsaURBQWdEO0FBR2hELDJDQUEwSjtBQUMxSiw0RUFBcUU7QUFDckUsaUVBQW1EO0FBQ25ELDJDQUF1QztBQUd2QyxpRUFBeUc7QUFHekcsMklBQXFLO0FBcUxySzs7R0FFRztBQUNILE1BQXNCLFNBQVUsU0FBUSxlQUFROztJQUN2QyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQWdCLEVBQUUsRUFBVSxFQUFFLFFBQWdCO1FBQ3ZFLE1BQU0sU0FBUyxHQUFHLFNBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFNBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFlBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxnQkFBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsWUFBYSxDQUFDLENBQUMsQ0FBQztRQUUvSCxPQUFPLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQzlDLFFBQVE7WUFDUixTQUFTO1NBQ1YsQ0FBQyxDQUFDO0tBQ0o7SUFFRDs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBc0I7Ozs7Ozs7Ozs7UUFDcEYsTUFBTSxNQUFPLFNBQVEsZUFBUTtZQUNYLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQzFCLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1NBQzdDO1FBRUQsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDOUI7SUFPRDs7T0FFRztJQUNhLFFBQVEsQ0FBWTtJQUVwQzs7T0FFRztJQUNhLFVBQVUs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RSxDQUFDO1lBQzNCLE1BQU0sSUFBSSw4QkFBdUIsQ0FBQyxJQUFBLHNCQUFHLEVBQUEscUJBQXFCLEVBQUUseURBQXlELE1BQU0sQ0FBQyxJQUFJLGtCQUFrQixDQUFDLENBQUM7UUFDdEosQ0FBQztRQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2ZuVGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZ2x1ZSc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBLZXlHcmFudHMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB0eXBlICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHR5cGUgeyBJUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IEFybkZvcm1hdCwgQ3VzdG9tUmVzb3VyY2UsIER1cmF0aW9uLCBGbiwgTGF6eSwgTmFtZXMsIFJlc291cmNlLCBTdGFjaywgVG9rZW4sIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IGxpdCwgbWQ1aGFzaCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0ICogYXMgY3IgZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB0eXBlIHsgRGF0YUZvcm1hdCB9IGZyb20gJy4vZGF0YS1mb3JtYXQnO1xuaW1wb3J0IHR5cGUgeyBJRGF0YWJhc2UgfSBmcm9tICcuL2RhdGFiYXNlJztcbmltcG9ydCB7IGdlbmVyYXRlUGFydGl0aW9uUHJvamVjdGlvblBhcmFtZXRlcnMsIHR5cGUgUGFydGl0aW9uUHJvamVjdGlvbiB9IGZyb20gJy4vcGFydGl0aW9uLXByb2plY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW4gfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgdHlwZSB7IFN0b3JhZ2VQYXJhbWV0ZXIgfSBmcm9tICcuL3N0b3JhZ2UtcGFyYW1ldGVyJztcbmltcG9ydCB7IFBhcnRpdGlvbkluZGV4SXNDb21wbGV0ZUZ1bmN0aW9uLCBQYXJ0aXRpb25JbmRleE9uRXZlbnRGdW5jdGlvbiB9IGZyb20gJy4uL2N1c3RvbS1yZXNvdXJjZS1oYW5kbGVycy9kaXN0L2F3cy1nbHVlLWFscGhhL3BhcnRpdGlvbi1pbmRleC1wcm92aWRlci5nZW5lcmF0ZWQnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgb2YgYSBQYXJ0aXRpb24gSW5kZXguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydGl0aW9uSW5kZXgge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHBhcnRpdGlvbiBpbmRleC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG5hbWUgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIHlvdS5cbiAgICovXG4gIHJlYWRvbmx5IGluZGV4TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhcnRpdGlvbiBrZXkgbmFtZXMgdGhhdCBjb21wcmlzZSB0aGUgcGFydGl0aW9uXG4gICAqIGluZGV4LiBUaGUgbmFtZXMgbXVzdCBjb3JyZXNwb25kIHRvIGEgbmFtZSBpbiB0aGVcbiAgICogdGFibGUncyBwYXJ0aXRpb24ga2V5cy5cbiAgICovXG4gIHJlYWRvbmx5IGtleU5hbWVzOiBzdHJpbmdbXTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVRhYmxlIGV4dGVuZHMgSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQXR0cmlidXRlcyB7XG4gIHJlYWRvbmx5IHRhYmxlQXJuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGdlbmVyYXRlZCBieSBDREsuXG4gICAqL1xuICByZWFkb25seSB0YWJsZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHRoZSB0YWJsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogRGF0YWJhc2UgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2U6IElEYXRhYmFzZTtcblxuICAvKipcbiAgICogQ29sdW1ucyBvZiB0aGUgdGFibGUuXG4gICAqL1xuICByZWFkb25seSBjb2x1bW5zOiBDb2x1bW5bXTtcblxuICAvKipcbiAgICogUGFydGl0aW9uIGNvbHVtbnMgb2YgdGhlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0YWJsZSBpcyBub3QgcGFydGl0aW9uZWRcbiAgICovXG4gIHJlYWRvbmx5IHBhcnRpdGlvbktleXM/OiBDb2x1bW5bXTtcblxuICAvKipcbiAgICogUGFydGl0aW9uIGluZGV4ZXMgb24gdGhlIHRhYmxlLiBBIG1heGltdW0gb2YgMyBpbmRleGVzXG4gICAqIGFyZSBhbGxvd2VkIG9uIGEgdGFibGUuIEtleXMgaW4gdGhlIGluZGV4IG11c3QgYmUgcGFydFxuICAgKiBvZiB0aGUgdGFibGUncyBwYXJ0aXRpb24ga2V5cy5cbiAgICpcbiAgICogQGRlZmF1bHQgdGFibGUgaGFzIG5vIHBhcnRpdGlvbiBpbmRleGVzXG4gICAqL1xuICByZWFkb25seSBwYXJ0aXRpb25JbmRleGVzPzogUGFydGl0aW9uSW5kZXhbXTtcblxuICAvKipcbiAgICogU3RvcmFnZSB0eXBlIG9mIHRoZSB0YWJsZSdzIGRhdGEuXG4gICAqL1xuICByZWFkb25seSBkYXRhRm9ybWF0OiBEYXRhRm9ybWF0O1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdGFibGUncyBkYXRhIGlzIGNvbXByZXNzZWQgb3Igbm90LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgY29tcHJlc3NlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0YWJsZSBkYXRhIGlzIHN0b3JlZCBpbiBzdWJkaXJlY3Rvcmllcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHN0b3JlZEFzU3ViRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIHBhcnRpdGlvbiBmaWx0ZXJpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvZ2x1ZS1iZXN0LXByYWN0aWNlcy5odG1sI2dsdWUtYmVzdC1wcmFjdGljZXMtcGFydGl0aW9uLWluZGV4XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIHBhcmFtZXRlciBpcyBub3QgZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlUGFydGl0aW9uRmlsdGVyaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHVzZXItc3VwcGxpZWQgcHJvcGVydGllcyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwaHlzaWNhbCBzdG9yYWdlIG9mIHRoaXMgdGFibGUuIFRoZXNlIHByb3BlcnRpZXMgaGVscCBkZXNjcmliZSB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIHRoYXQgaXMgc3RvcmVkIHdpdGhpbiB0aGUgY3Jhd2xlZCBkYXRhIHNvdXJjZXMuXG4gICAqXG4gICAqIFRoZSBrZXkvdmFsdWUgcGFpcnMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBzdWJtaXR0ZWQgYXJlIG5vdCBsaW1pdGVkLCBob3dldmVyIHRoZWlyIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGd1YXJhbnRlZWQuXG4gICAqXG4gICAqIFNvbWUga2V5cyB3aWxsIGJlIGF1dG8tcG9wdWxhdGVkIGJ5IGdsdWUgY3Jhd2xlcnMsIGhvd2V2ZXIsIHlvdSBjYW4gb3ZlcnJpZGUgdGhlbSBieSBzcGVjaWZ5aW5nIHRoZSBrZXkgYW5kIHZhbHVlIGluIHRoaXMgcHJvcGVydHkuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL3RhYmxlLXByb3BlcnRpZXMtY3Jhd2xlci5odG1sXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3JlZHNoaWZ0L2xhdGVzdC9kZy9yX0NSRUFURV9FWFRFUk5BTF9UQUJMRS5odG1sI3JfQ1JFQVRFX0VYVEVSTkFMX1RBQkxFLXBhcmFtZXRlcnMgLSB1bmRlciBfXCJUQUJMRSBQUk9QRVJUSUVTXCJfXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGRlY2xhcmUgY29uc3QgZ2x1ZURhdGFiYXNlOiBnbHVlLklEYXRhYmFzZTtcbiAgICogICAgY29uc3QgdGFibGUgPSBuZXcgZ2x1ZS5TM1RhYmxlKHRoaXMsICdUYWJsZScsIHtcbiAgICogICAgICBzdG9yYWdlUGFyYW1ldGVyczogW1xuICAgKiAgICAgICAgICBnbHVlLlN0b3JhZ2VQYXJhbWV0ZXIuc2tpcEhlYWRlckxpbmVDb3VudCgxKSxcbiAgICogICAgICAgICAgZ2x1ZS5TdG9yYWdlUGFyYW1ldGVyLmNvbXByZXNzaW9uVHlwZShnbHVlLkNvbXByZXNzaW9uVHlwZS5HWklQKSxcbiAgICogICAgICAgICAgZ2x1ZS5TdG9yYWdlUGFyYW1ldGVyLmN1c3RvbSgnZm9vJywgJ2JhcicpLCAvLyBXaWxsIGhhdmUgbm8gZWZmZWN0XG4gICAqICAgICAgICAgIGdsdWUuU3RvcmFnZVBhcmFtZXRlci5jdXN0b20oJ3NlcGFyYXRvckNoYXInLCAnLCcpLCAvLyBXaWxsIGRlc2NyaWJlIHRoZSBzZXBhcmF0b3IgY2hhciB1c2VkIGluIHRoZSBkYXRhXG4gICAqICAgICAgICAgIGdsdWUuU3RvcmFnZVBhcmFtZXRlci5jdXN0b20oZ2x1ZS5TdG9yYWdlUGFyYW1ldGVycy5XUklURV9QQVJBTExFTCwgJ29mZicpLFxuICAgKiAgICAgIF0sXG4gICAqICAgICAgLy8gLi4uXG4gICAqICAgICAgZGF0YWJhc2U6IGdsdWVEYXRhYmFzZSxcbiAgICogICAgICBjb2x1bW5zOiBbe1xuICAgKiAgICAgICAgICBuYW1lOiAnY29sMScsXG4gICAqICAgICAgICAgIHR5cGU6IGdsdWUuU2NoZW1hLlNUUklORyxcbiAgICogICAgICB9XSxcbiAgICogICAgICBkYXRhRm9ybWF0OiBnbHVlLkRhdGFGb3JtYXQuQ1NWLFxuICAgKiAgICB9KTtcbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgcGFyYW1ldGVyIGlzIG5vdCBkZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlUGFyYW1ldGVycz86IFN0b3JhZ2VQYXJhbWV0ZXJbXTtcblxuICAvKipcbiAgICogVGhlIGtleS92YWx1ZSBwYWlycyBkZWZpbmUgcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhYmxlLlxuICAgKiBUaGUga2V5L3ZhbHVlIHBhaXJzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgc3VibWl0dGVkIGFyZSBub3QgbGltaXRlZCwgaG93ZXZlciB0aGVpciBmdW5jdGlvbmFsaXR5IGlzIG5vdCBndWFyYW50ZWVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWdsdWUtdGFibGUtdGFibGVpbnB1dC5odG1sI2Nmbi1nbHVlLXRhYmxlLXRhYmxlaW5wdXQtcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBwYXJhbWV0ZXIgaXMgbm90IGRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgdGFibGUgaXMgZW5jcnlwdGVkLlxuICAgKlxuICAgKiBUaGlzIHNldHMgdGhlIGBoYXNfZW5jcnlwdGVkX2RhdGFgIHRhYmxlIHBhcmFtZXRlci4gQXRoZW5hIHJlYWRzIGl0IHdoZW5cbiAgICogcXVlcnlpbmcgY2xpZW50LXNpZGUgKENTRS1LTVMpIGVuY3J5cHRlZCBkYXRhc2V0czsgZm9yIHNlcnZlci1zaWRlXG4gICAqIGVuY3J5cHRlZCAoU1NFLVMzIC8gU1NFLUtNUykgb3IgdW5lbmNyeXB0ZWQgZGF0YSBpdCBoYXMgbm8gZWZmZWN0LCBzaW5jZVxuICAgKiBBbWF6b24gUzMgZGVjcnlwdHMgc2VydmVyLXNpZGUgZW5jcnlwdGVkIG9iamVjdHMgdHJhbnNwYXJlbnRseS5cbiAgICpcbiAgICogRG8gbm90IGFsc28gc2V0IGBoYXNfZW5jcnlwdGVkX2RhdGFgIHRocm91Z2ggYHBhcmFtZXRlcnNgIC0gdXNlIHRoaXNcbiAgICogcHJvcGVydHkgaW5zdGVhZC4gQSBjb25mbGljdGluZyB2YWx1ZSBpbiBgcGFyYW1ldGVyc2AgaXMgcmVqZWN0ZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvY3JlYXRpbmctdGFibGVzLWJhc2VkLW9uLWVuY3J5cHRlZC1kYXRhc2V0cy1pbi1zMy5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGhhc0VuY3J5cHRlZERhdGE/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGlzIHRhYmxlLlxuICAgKlxuICAgKiBQYXJ0aXRpb24gcHJvamVjdGlvbiBhbGxvd3MgQXRoZW5hIHRvIGF1dG9tYXRpY2FsbHkgYWRkIG5ldyBwYXJ0aXRpb25zXG4gICAqIHdpdGhvdXQgcmVxdWlyaW5nIGBBTFRFUiBUQUJMRSBBREQgUEFSVElUSU9OYCBzdGF0ZW1lbnRzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hdGhlbmEvbGF0ZXN0L3VnL3BhcnRpdGlvbi1wcm9qZWN0aW9uLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwYXJ0aXRpb24gcHJvamVjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcGFydGl0aW9uUHJvamVjdGlvbj86IFBhcnRpdGlvblByb2plY3Rpb247XG59XG5cbi8qKlxuICogQSBHbHVlIHRhYmxlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGFibGVCYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJVGFibGUge1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZUFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCB0YWJsZUFybjogc3RyaW5nKTogSVRhYmxlIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBGbi5zZWxlY3QoMSwgRm4uc3BsaXQoJy8nLCBTdGFjay5vZihzY29wZSkuc3BsaXRBcm4odGFibGVBcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKS5yZXNvdXJjZU5hbWUhKSk7XG5cbiAgICByZXR1cm4gVGFibGVCYXNlLmZyb21UYWJsZUF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICB0YWJsZUFybixcbiAgICAgIHRhYmxlTmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgVGFibGUgY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBjcmVhdGluZyBjb25zdHJ1Y3QgKHVzdWFsbHkgYHRoaXNgKS5cbiAgICogQHBhcmFtIGlkIFRoZSBjb25zdHJ1Y3QncyBpZC5cbiAgICogQHBhcmFtIGF0dHJzIEltcG9ydCBhdHRyaWJ1dGVzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZUF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IFRhYmxlQXR0cmlidXRlcyk6IElUYWJsZSB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJVGFibGUge1xuICAgICAgcHVibGljIHJlYWRvbmx5IHRhYmxlQXJuID0gYXR0cnMudGFibGVBcm47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdGFibGVOYW1lID0gYXR0cnMudGFibGVOYW1lO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgdGFibGVSZXNvdXJjZTogQ2ZuVGFibGU7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB0YWJsZU5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHRhYmxlQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBwYXJ0aXRpb25JbmRleGVzPzogUGFydGl0aW9uSW5kZXhbXTtcblxuICAvKipcbiAgICogRGF0YWJhc2UgdGhpcyB0YWJsZSBiZWxvbmdzIHRvLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRhdGFiYXNlOiBJRGF0YWJhc2U7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0YWJsZSdzIGRhdGEgaXMgY29tcHJlc3NlZCBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcHJlc3NlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogRm9ybWF0IG9mIHRoaXMgdGFibGUncyBkYXRhIGZpbGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQ7XG5cbiAgLyoqXG4gICAqIFRoaXMgdGFibGUncyBjb2x1bW5zLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbHVtbnM6IENvbHVtbltdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHRhYmxlJ3MgcGFydGl0aW9uIGtleXMgaWYgdGhlIHRhYmxlIGlzIHBhcnRpdGlvbmVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhcnRpdGlvbktleXM/OiBDb2x1bW5bXTtcblxuICAvKipcbiAgICogVGhlIHRhYmxlcycgc3RvcmFnZSBkZXNjcmlwdG9yIHByb3BlcnRpZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RvcmFnZVBhcmFtZXRlcnM/OiBTdG9yYWdlUGFyYW1ldGVyW107XG5cbiAgLyoqXG4gICAqIFRoaXMgdGFibGUncyBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uIGlmIGVuYWJsZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFydGl0aW9uUHJvamVjdGlvbj86IFBhcnRpdGlvblByb2plY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSB0YWJsZXMnIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YWJsZS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1nbHVlLXRhYmxlLXRhYmxlaW5wdXQuaHRtbCNjZm4tZ2x1ZS10YWJsZS10YWJsZWlucHV0LXBhcmFtZXRlcnNcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgdGFibGUgaXMgZW5jcnlwdGVkLiBFbWl0dGVkIGFzIHRoZVxuICAgKiBgaGFzX2VuY3J5cHRlZF9kYXRhYCB0YWJsZSBwYXJhbWV0ZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFzRW5jcnlwdGVkRGF0YTogYm9vbGVhbjtcblxuICAvKipcbiAgICogUGFydGl0aW9uIGluZGV4ZXMgbXVzdCBiZSBjcmVhdGVkIG9uZSBhdCBhIHRpbWUuIFRvIGF2b2lkXG4gICAqIHJhY2UgY29uZGl0aW9ucywgd2Ugc3RvcmUgdGhlIHJlc291cmNlIGFuZCBhZGQgZGVwZW5kZW5jaWVzXG4gICAqIGVhY2ggdGltZSBhIG5ldyBwYXJ0aXRpb24gaW5kZXggaXMgY3JlYXRlZC5cbiAgICovXG4gIHByaXZhdGUgcGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZXM6IEN1c3RvbVJlc291cmNlW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVGFibGVCYXNlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMudGFibGVOYW1lID8/XG4gICAgICAgIExhenkuc3RyaW5nKHtcbiAgICAgICAgICBwcm9kdWNlOiAoKSA9PiBOYW1lcy51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywge30pLnRvTG93ZXJDYXNlKCksXG4gICAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kYXRhYmFzZSA9IHByb3BzLmRhdGFiYXNlO1xuICAgIHRoaXMuZGF0YUZvcm1hdCA9IHByb3BzLmRhdGFGb3JtYXQ7XG5cbiAgICB2YWxpZGF0ZVNjaGVtYShwcm9wcy5jb2x1bW5zLCBwcm9wcy5wYXJ0aXRpb25LZXlzKTtcbiAgICB0aGlzLmNvbHVtbnMgPSBwcm9wcy5jb2x1bW5zO1xuICAgIHRoaXMucGFydGl0aW9uS2V5cyA9IHByb3BzLnBhcnRpdGlvbktleXM7XG4gICAgdGhpcy5zdG9yYWdlUGFyYW1ldGVycyA9IHByb3BzLnN0b3JhZ2VQYXJhbWV0ZXJzO1xuICAgIHRoaXMucGFydGl0aW9uUHJvamVjdGlvbiA9IHByb3BzLnBhcnRpdGlvblByb2plY3Rpb247XG4gICAgdGhpcy5wYXJhbWV0ZXJzID0gcHJvcHMucGFyYW1ldGVycyA/PyB7fTtcblxuICAgIHRoaXMuaGFzRW5jcnlwdGVkRGF0YSA9IHByb3BzLmhhc0VuY3J5cHRlZERhdGEgPz8gdHJ1ZTtcbiAgICB0aGlzLnJlY29uY2lsZUhhc0VuY3J5cHRlZERhdGEoKTtcblxuICAgIHRoaXMuY29tcHJlc3NlZCA9IHByb3BzLmNvbXByZXNzZWQgPz8gZmFsc2U7XG5cbiAgICB0aGlzLnZhbGlkYXRlQW5kR2VuZXJhdGVQYXJ0aXRpb25Qcm9qZWN0aW9uKCk7XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgZ3JhbnRSZWFkKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuICBwdWJsaWMgYWJzdHJhY3QgZ3JhbnRXcml0ZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcbiAgcHVibGljIGFic3RyYWN0IGdyYW50UmVhZFdyaXRlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXJ0aXRpb24gaW5kZXggdG8gdGhlIHRhYmxlLiBZb3UgY2FuIGhhdmUgYSBtYXhpbXVtIG9mIDMgcGFydGl0aW9uXG4gICAqIGluZGV4ZXMgdG8gYSB0YWJsZS4gUGFydGl0aW9uIGluZGV4IGtleXMgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgdGFibGUnc1xuICAgKiBwYXJ0aXRpb24ga2V5cy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvcGFydGl0aW9uLWluZGV4ZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIGFkZFBhcnRpdGlvbkluZGV4KGluZGV4OiBQYXJ0aXRpb25JbmRleCkge1xuICAgIGNvbnN0IG51bVBhcnRpdGlvbnMgPSB0aGlzLnBhcnRpdGlvbkluZGV4Q3VzdG9tUmVzb3VyY2VzLmxlbmd0aDtcbiAgICBpZiAobnVtUGFydGl0aW9ucyA+PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBNYXhQYXJ0aXRpb25JbmRleGVzRXhjZWVkZWRgLCAnTWF4aW11bSBudW1iZXIgb2YgcGFydGl0aW9uIGluZGV4ZXMgYWxsb3dlZCBpcyAzJywgdGhpcyk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVQYXJ0aXRpb25JbmRleChpbmRleCk7XG5cbiAgICBjb25zdCBpbmRleE5hbWUgPSBpbmRleC5pbmRleE5hbWUgPz8gdGhpcy5nZW5lcmF0ZUluZGV4TmFtZShpbmRleC5rZXlOYW1lcyk7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBQYXJ0aXRpb25JbmRleFByb3ZpZGVyLmdldE9yQ3JlYXRlKHRoaXMpO1xuXG4gICAgLy8gVGhlIGdyYW50cyBhcmUgaWRlbnRpY2FsIGZvciBldmVyeSBpbmRleCBvbiB0aGlzIHRhYmxlLCBzbyBvbmx5IGFkZCB0aGVtXG4gICAgLy8gb25jZS5cbiAgICBpZiAobnVtUGFydGl0aW9ucyA9PT0gMCkge1xuICAgICAgLy8gQWRkIHNjb3BlZCBwZXJtaXNzaW9ucyBmb3IgdGhpcyB0YWJsZSdzIEdsdWUgcmVzb3VyY2VzXG4gICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9hd3NnbHVlLmh0bWxcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IFt0aGlzLnRhYmxlQXJuLCB0aGlzLmRhdGFiYXNlLmRhdGFiYXNlQXJuLCB0aGlzLmRhdGFiYXNlLmNhdGFsb2cuY2F0YWxvZ0Fybl07XG5cbiAgICAgIC8vIFRoZSBjYXRhbG9nJ3MgZW5jcnlwdGlvbiBpcyBmaXhlZCBhdCBjb25zdHJ1Y3Rpb24sIHNvIHRoZSBlbmNyeXB0aW9uIGtleVxuICAgICAgLy8gKGlmIGFueSkgaXMga25vd24gaGVyZS4gR3JhbnQgdGhlIGhhbmRsZXJzIGFjY2VzcyB0byBpdC4gTm8tb3Agd2hlbiB0aGVcbiAgICAgIC8vIGNhdGFsb2cgdXNlcyBhbiBBV1MtbWFuYWdlZCBrZXkgb3Igbm8gZW5jcnlwdGlvbi5cbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuZGF0YWJhc2UuY2F0YWxvZy5lbmNyeXB0aW9uS2V5O1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBjb25zdCBncmFudHMgPSBLZXlHcmFudHMuZnJvbUtleShrZXkpO1xuICAgICAgICBncmFudHMuZGVjcnlwdChwcm92aWRlci5vbkV2ZW50SGFuZGxlcik7XG4gICAgICAgIGdyYW50cy5kZWNyeXB0KHByb3ZpZGVyLmlzQ29tcGxldGVIYW5kbGVyKTtcbiAgICAgIH1cblxuICAgICAgLy8gQm90aCBoYW5kbGVycyBjcmVhdGUsIGRlbGV0ZSwgYW5kIGluc3BlY3QgaW5kZXhlczogb25FdmVudCBjcmVhdGVzL2RlbGV0ZXMgb25cbiAgICAgIC8vIENyZWF0ZS9EZWxldGUvVXBkYXRlLCBhbmQgaXNDb21wbGV0ZSByZWNyZWF0ZXMgdGhlIGluZGV4IHdoaWxlIGRyaXZpbmcgYVxuICAgICAgLy8ga2V5LWNoYW5nZSB1cGRhdGUgKGRlbGV0ZSAtPiByZWNyZWF0ZSAtPiBBQ1RJVkUpLiBVcGRhdGVUYWJsZS9HZXRUYWJsZSBhcmVcbiAgICAgIC8vIHJlcXVpcmVkIGJ5IHRoZSBDcmVhdGVQYXJ0aXRpb25JbmRleC9EZWxldGVQYXJ0aXRpb25JbmRleCBBUElzLlxuICAgICAgY29uc3QgYWN0aW9ucyA9IFtcbiAgICAgICAgJ2dsdWU6R2V0UGFydGl0aW9uSW5kZXhlcycsXG4gICAgICAgICdnbHVlOkNyZWF0ZVBhcnRpdGlvbkluZGV4JyxcbiAgICAgICAgJ2dsdWU6RGVsZXRlUGFydGl0aW9uSW5kZXgnLFxuICAgICAgICAnZ2x1ZTpHZXRUYWJsZScsXG4gICAgICAgICdnbHVlOlVwZGF0ZVRhYmxlJyxcbiAgICAgIF07XG4gICAgICBwcm92aWRlci5vbkV2ZW50SGFuZGxlci5hZGRUb1JvbGVQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoeyBhY3Rpb25zLCByZXNvdXJjZXMgfSkpO1xuICAgICAgcHJvdmlkZXIuaXNDb21wbGV0ZUhhbmRsZXIuYWRkVG9Sb2xlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHsgYWN0aW9ucywgcmVzb3VyY2VzIH0pKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aXRpb25JbmRleEN1c3RvbVJlc291cmNlID0gbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsIGBwYXJ0aXRpb24taW5kZXgtJHtpbmRleE5hbWV9YCwge1xuICAgICAgcmVzb3VyY2VUeXBlOiAnQ3VzdG9tOjpHbHVlUGFydGl0aW9uSW5kZXgnLFxuICAgICAgc2VydmljZVRva2VuOiBwcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIERhdGFiYXNlTmFtZTogdGhpcy5kYXRhYmFzZS5kYXRhYmFzZU5hbWUsXG4gICAgICAgIFRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsXG4gICAgICAgIEluZGV4TmFtZTogaW5kZXhOYW1lLFxuICAgICAgICBLZXlzOiBpbmRleC5rZXlOYW1lcyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBFbnN1cmUgSUFNIHBvbGljaWVzIGFyZSBjcmVhdGVkIGJlZm9yZSB0aGUgY3VzdG9tIHJlc291cmNlIGludm9rZXMgdGhlIGhhbmRsZXJzXG4gICAgcGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3kocHJvdmlkZXIub25FdmVudEhhbmRsZXIucm9sZSEpO1xuICAgIHBhcnRpdGlvbkluZGV4Q3VzdG9tUmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KHByb3ZpZGVyLmlzQ29tcGxldGVIYW5kbGVyLnJvbGUhKTtcblxuICAgIC8vIERlcGVuZCBvbiBwcmV2aW91cyBwYXJ0aXRpb24gaW5kZXggdG8gYXZvaWQgcmFjZSBjb25kaXRpb25cbiAgICBpZiAobnVtUGFydGl0aW9ucyA+IDApIHtcbiAgICAgIHBhcnRpdGlvbkluZGV4Q3VzdG9tUmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMucGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZXNbbnVtUGFydGl0aW9ucy0xXSk7XG4gICAgfVxuICAgIHRoaXMucGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZXMucHVzaChwYXJ0aXRpb25JbmRleEN1c3RvbVJlc291cmNlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVJbmRleE5hbWUoa2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IG1heEluZGV4TGVuZ3RoID0gODA7XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChrZXlzKSB8fCBrZXlzLnNvbWUoayA9PiBUb2tlbi5pc1VucmVzb2x2ZWQoaykpKSB7XG4gICAgICAvLyBUaGUgaW5kZXggbmFtZSBpcyBkZXJpdmVkIGZyb20gdGhlIGtleSBuYW1lcywgc28gdG9rZW5pemVkIGtleXMgbGVhdmVcbiAgICAgIC8vIG5vdGhpbmcgc3RhYmxlIHRvIGdlbmVyYXRlIGZyb206IGFueSBhdXRvLWdlbmVyYXRlZCBuYW1lIHdvdWxkIGhhdmUgdG9cbiAgICAgIC8vIGZhbGwgYmFjayB0byB0aGUgaW5kZXgncyBwb3NpdGlvbiBvbiB0aGUgdGFibGUsIHdoaWNoIHNoaWZ0cyBpZiBpbmRleGVzXG4gICAgICAvLyBhcmUgYWRkZWQsIHJlbW92ZWQsIG9yIHJlb3JkZXJlZCAtIHNpbGVudGx5IHJlcGxhY2luZyBpbmRleGVzIHRoYXQgZGlkXG4gICAgICAvLyBub3QgYWN0dWFsbHkgY2hhbmdlLiBSZXF1aXJlIGFuIGV4cGxpY2l0LCBzdGFibGUgbmFtZSBpbnN0ZWFkLlxuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YFRva2VuaXplZEluZGV4S2V5c1JlcXVpcmVOYW1lYCxcbiAgICAgICAgJ2Nhbm5vdCBhdXRvLWdlbmVyYXRlIGEgc3RhYmxlIHBhcnRpdGlvbiBpbmRleCBuYW1lIGZyb20gdG9rZW5pemVkIGtleSBuYW1lczsgJyArXG4gICAgICAgICAgJ3NwZWNpZnkgYGluZGV4TmFtZWAgZXhwbGljaXRseSB3aGVuIGluZGV4IGtleXMgYXJlIG5vdCBrbm93biBhdCBzeW50aGVzaXMgdGltZScsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBwcmVmaXggPSBrZXlzLmpvaW4oJy0nKSArICctJztcbiAgICBjb25zdCB1bmlxdWVJZCA9IE5hbWVzLnVuaXF1ZUlkKHRoaXMpO1xuICAgIGlmIChwcmVmaXgubGVuZ3RoIDwgbWF4SW5kZXhMZW5ndGgpIHtcbiAgICAgIC8vIENvbW1vbiBjYXNlOiB0cmltIHRoZSB1bmlxdWVJZCB0YWlsIHNvIHRoZSB3aG9sZSBuYW1lIGZpdHMgdW5kZXIgdGhlIGNhcC5cbiAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBNYXRoLm1heCgwLCB1bmlxdWVJZC5sZW5ndGggLSAobWF4SW5kZXhMZW5ndGggLSBwcmVmaXgubGVuZ3RoKSk7XG4gICAgICByZXR1cm4gcHJlZml4ICsgdW5pcXVlSWQuc3Vic3RyaW5nKHN0YXJ0SW5kZXgpO1xuICAgIH1cbiAgICAvLyBUaGUgam9pbmVkIGtleSBuYW1lcyBhbG9uZSBleGNlZWQgdGhlIGJ1ZGdldCAobG9uZyBrZXkgbmFtZXMpLCBzbyB0cmltbWluZ1xuICAgIC8vIHRoZSB1bmlxdWVJZCBpcyBub3QgZW5vdWdoLiBUcnVuY2F0ZSB0aGUgcHJlZml4IGFuZCBhcHBlbmQgYSBoYXNoIG9mIHRoZVxuICAgIC8vIHRhYmxlIHBhdGggcGx1cyB0aGUgZnVsbCBrZXkgbGlzdCwgc28gdHdvIGRpZmZlcmVudCAobG9uZykga2V5IHNldHMgY2Fubm90XG4gICAgLy8gY29sbGlkZSBhZnRlciB0cnVuY2F0aW9uLlxuICAgIGNvbnN0IGhhc2ggPSBtZDVoYXNoKHVuaXF1ZUlkICsgJy0nICsga2V5cy5qb2luKCctJykpLnNsaWNlKDAsIDgpO1xuICAgIHJldHVybiBwcmVmaXguc3Vic3RyaW5nKDAsIG1heEluZGV4TGVuZ3RoIC0gaGFzaC5sZW5ndGggLSAxKSArICctJyArIGhhc2g7XG4gIH1cblxuICAvKipcbiAgICogUmVjb25jaWxlIGEgYGhhc19lbmNyeXB0ZWRfZGF0YWAgdmFsdWUgc3VwcGxpZWQgdGhyb3VnaCB0aGUgZnJlZS1mb3JtXG4gICAqIGBwYXJhbWV0ZXJzYCBtYXAgd2l0aCB0aGUgdHlwZWQgYGhhc0VuY3J5cHRlZERhdGFgIHByb3BlcnR5LlxuICAgKlxuICAgKiBgaGFzX2VuY3J5cHRlZF9kYXRhYCBpcyBtYW5hZ2VkIGJ5IHRoaXMgY29uc3RydWN0IGFuZCBlbWl0dGVkIGF1dGhvcml0YXRpdmVseVxuICAgKiBmcm9tIGBoYXNFbmNyeXB0ZWREYXRhYC4gU3VwcGx5aW5nIGl0IHRocm91Z2ggYHBhcmFtZXRlcnNgIGFzIHdlbGwgaXMgb25seVxuICAgKiB0b2xlcmF0ZWQgd2hlbiB0aGUgdmFsdWUgaXMgaWRlbnRpY2FsOyBhIGRpZmZlcmluZyAob3IgdW5yZXNvbHZlZCkgdmFsdWUgaXNcbiAgICogcmVqZWN0ZWQgc28gdGhlIHR3byBpbnB1dHMgY2FuIG5ldmVyIHNpbGVudGx5IGRpc2FncmVlLiBPbiBzdWNjZXNzIHRoZSBrZXkgaXNcbiAgICogcmVtb3ZlZCBmcm9tIHRoZSBmcmVlLWZvcm0gbWFwIHNvIHRoZSBtYW5hZ2VkIHZhbHVlIGlzIHRoZSBzaW5nbGUgc291cmNlIG9mXG4gICAqIHRydXRoLlxuICAgKi9cbiAgcHJpdmF0ZSByZWNvbmNpbGVIYXNFbmNyeXB0ZWREYXRhKCk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9ICdoYXNfZW5jcnlwdGVkX2RhdGEnO1xuICAgIGlmICghKGtleSBpbiB0aGlzLnBhcmFtZXRlcnMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN1cHBsaWVkID0gdGhpcy5wYXJhbWV0ZXJzW2tleV07XG4gICAgY29uc3QgbWFuYWdlZCA9IFN0cmluZyh0aGlzLmhhc0VuY3J5cHRlZERhdGEpO1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoc3VwcGxpZWQpIHx8IHN1cHBsaWVkICE9PSBtYW5hZ2VkKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgSGFzRW5jcnlwdGVkRGF0YUNvbmZsaWN0YCxcbiAgICAgICAgYHRoZSBcXGAke2tleX1cXGAgdGFibGUgcGFyYW1ldGVyIGlzIG1hbmFnZWQgYnkgdGhlIFxcYGhhc0VuY3J5cHRlZERhdGFcXGAgcHJvcGVydHk7IGAgK1xuICAgICAgICAgIGByZW1vdmUgaXQgZnJvbSBcXGBwYXJhbWV0ZXJzXFxgIGFuZCB1c2UgdGhlIGJvb2xlYW4gXFxgaGFzRW5jcnlwdGVkRGF0YVxcYCBwcm9wZXJ0eSBpbnN0ZWFkIChnb3QgJHtKU09OLnN0cmluZ2lmeShzdXBwbGllZCl9LCBleHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KG1hbmFnZWQpfSlgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgZGVsZXRlIHRoaXMucGFyYW1ldGVyc1trZXldO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBhcnRpdGlvbkluZGV4KGluZGV4OiBQYXJ0aXRpb25JbmRleCkge1xuICAgIGlmIChpbmRleC5pbmRleE5hbWUgIT09IHVuZGVmaW5lZCAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKGluZGV4LmluZGV4TmFtZSkgJiYgKGluZGV4LmluZGV4TmFtZS5sZW5ndGggPCAxIHx8IGluZGV4LmluZGV4TmFtZS5sZW5ndGggPiAyNTUpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBJbmRleE5hbWVMZW5ndGhJbnZhbGlkYCwgYEluZGV4IG5hbWUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDI1NSBjaGFyYWN0ZXJzLCBidXQgZ290ICR7aW5kZXguaW5kZXhOYW1lLmxlbmd0aH1gLCB0aGlzKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBhcnRpdGlvbktleXMgfHwgdGhpcy5wYXJ0aXRpb25LZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgTm9QYXJ0aXRpb25LZXlzRm9ySW5kZXhgLCAnVGhlIHRhYmxlIG11c3QgaGF2ZSBwYXJ0aXRpb24ga2V5cyB0byBjcmVhdGUgYSBwYXJ0aXRpb24gaW5kZXgnLCB0aGlzKTtcbiAgICB9XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoaW5kZXgua2V5TmFtZXMpKSB7XG4gICAgICBjb25zdCBrZXlOYW1lcyA9IHRoaXMucGFydGl0aW9uS2V5cy5tYXAocGsgPT4gcGsubmFtZSk7XG4gICAgICBjb25zdCBjb25jcmV0ZUtleXMgPSBpbmRleC5rZXlOYW1lcy5maWx0ZXIoayA9PiAhVG9rZW4uaXNVbnJlc29sdmVkKGspKTtcbiAgICAgIGlmIChjb25jcmV0ZUtleXMubGVuZ3RoID4gMCAmJiAhY29uY3JldGVLZXlzLmV2ZXJ5KGsgPT4ga2V5TmFtZXMuaW5jbHVkZXMoaykpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YEluZGV4S2V5c05vdFBhcnRpdGlvbktleXNgLCBgQWxsIGluZGV4IGtleXMgbXVzdCBhbHNvIGJlIHBhcnRpdGlvbiBrZXlzLiBHb3QgJHtpbmRleC5rZXlOYW1lc30gYnV0IHBhcnRpdGlvbiBrZXkgbmFtZXMgYXJlICR7a2V5TmFtZXN9YCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24gYW5kIG1lcmdlIGdlbmVyYXRlZCBwYXJhbWV0ZXJzIGludG8gdGhpcy5wYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFuZEdlbmVyYXRlUGFydGl0aW9uUHJvamVjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGFydGl0aW9uUHJvamVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgcGFydGl0aW9uIGtleXMgZXhpc3RcbiAgICBpZiAoIXRoaXMucGFydGl0aW9uS2V5cyB8fCB0aGlzLnBhcnRpdGlvbktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgTm9QYXJ0aXRpb25LZXlzRm9yUHJvamVjdGlvbmAsXG4gICAgICAgICdUaGUgdGFibGUgbXVzdCBoYXZlIHBhcnRpdGlvbiBrZXlzIHRvIHVzZSBwYXJ0aXRpb24gcHJvamVjdGlvbicsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRpdGlvbktleU5hbWVzID0gdGhpcy5wYXJ0aXRpb25LZXlzLm1hcChwayA9PiBway5uYW1lKTtcblxuICAgIC8vIFZhbGlkYXRlIGVhY2ggcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvblxuICAgIGZvciAoY29uc3QgW2NvbHVtbk5hbWUsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5wYXJ0aXRpb25Qcm9qZWN0aW9uKSkge1xuICAgICAgLy8gVmFsaWRhdGUgdGhhdCBjb2x1bW4gaXMgYSBwYXJ0aXRpb24ga2V5XG4gICAgICBpZiAoIXBhcnRpdGlvbktleU5hbWVzLmluY2x1ZGVzKGNvbHVtbk5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YFByb2plY3Rpb25Db2x1bW5Ob3RQYXJ0aXRpb25LZXlgLFxuICAgICAgICAgIGBQYXJ0aXRpb24gcHJvamVjdGlvbiBjb2x1bW4gXCIke2NvbHVtbk5hbWV9XCIgbXVzdCBiZSBhIHBhcnRpdGlvbiBrZXkuIGAgK1xuICAgICAgICAgIGBQYXJ0aXRpb24ga2V5cyBhcmU6ICR7cGFydGl0aW9uS2V5TmFtZXMuam9pbignLCAnKX1gLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIENsb3VkRm9ybWF0aW9uIHBhcmFtZXRlcnNcbiAgICAgIGNvbnN0IGdlbmVyYXRlZFBhcmFtcyA9IGdlbmVyYXRlUGFydGl0aW9uUHJvamVjdGlvblBhcmFtZXRlcnMoY29sdW1uTmFtZSwgY29uZmlnKTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGNvbmZsaWN0cyB3aXRoIG1hbnVhbGx5IHNwZWNpZmllZCBwYXJhbWV0ZXJzXG4gICAgICBjb25zdCBjb25mbGljdGluZ0tleXMgPSBPYmplY3Qua2V5cyhnZW5lcmF0ZWRQYXJhbXMpLmZpbHRlcihrZXkgPT4ga2V5IGluIHRoaXMucGFyYW1ldGVycyk7XG4gICAgICBpZiAoY29uZmxpY3RpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgUHJvamVjdGlvblBhcmFtZXRlcnNDb25mbGljdGAsXG4gICAgICAgICAgYFBhcnRpdGlvbiBwcm9qZWN0aW9uIHBhcmFtZXRlcnMgY29uZmxpY3Qgd2l0aCBtYW51YWxseSBzcGVjaWZpZWQgcGFyYW1ldGVyczogJHtjb25mbGljdGluZ0tleXMuam9pbignLCAnKX0uIGAgK1xuICAgICAgICAgICdVc2UgdGhlIHBhcnRpdGlvblByb2plY3Rpb24gcHJvcGVydHkgaW5zdGVhZCBvZiBtYW51YWxseSBzcGVjaWZ5aW5nIHByb2plY3Rpb24gcGFyYW1ldGVycy4nLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1lcmdlIGludG8gdGhpcy5wYXJhbWV0ZXJzXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMucGFyYW1ldGVycywgZ2VuZXJhdGVkUGFyYW1zKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgY29uZmxpY3Qgd2l0aCBwcm9qZWN0aW9uLmVuYWJsZWRcbiAgICBpZiAoJ3Byb2plY3Rpb24uZW5hYmxlZCcgaW4gdGhpcy5wYXJhbWV0ZXJzKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgUHJvamVjdGlvbkVuYWJsZWRDb25mbGljdGAsXG4gICAgICAgICdQYXJhbWV0ZXIgXCJwcm9qZWN0aW9uLmVuYWJsZWRcIiBjb25mbGljdHMgd2l0aCBwYXJ0aXRpb25Qcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uICcgK1xuICAgICAgICAnVXNlIHRoZSBwYXJ0aXRpb25Qcm9qZWN0aW9uIHByb3BlcnR5IGluc3RlYWQgb2YgbWFudWFsbHkgc3BlY2lmeWluZyBwcm9qZWN0aW9uLmVuYWJsZWQuJyxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRW5hYmxlIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGdsb2JhbGx5XG4gICAgdGhpcy5wYXJhbWV0ZXJzWydwcm9qZWN0aW9uLmVuYWJsZWQnXSA9ICd0cnVlJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gaWRlbnRpdHkgY3VzdG9tIHBlcm1pc3Npb25zIG9uIHRoaXMgdGFibGUuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBsb3ctbGV2ZWwgZXNjYXBlIGhhdGNoOiB0aGUgYGFjdGlvbnNgIGFyZSBhcHBsaWVkIHZlcmJhdGltLFxuICAgKiBzY29wZWQgdG8gdGhpcyB0YWJsZSdzIEFSTi4gUHJlZmVyIHRoZSBpbnRlbnQtYmFzZWQgYGdyYW50UmVhZGAgL1xuICAgKiBgZ3JhbnRXcml0ZWAgLyBgZ3JhbnRSZWFkV3JpdGVgIG1ldGhvZHMsIHdoaWNoIGdyYW50IGEgY3VyYXRlZCBzZXQgb2ZcbiAgICogYWN0aW9ucyBhbmQgYWxzbyBjb3ZlciB0aGUgdW5kZXJseWluZyBTMyBkYXRhLiBPbmx5IHBhc3MgdGhlIHNwZWNpZmljXG4gICAqIGFjdGlvbnMgdGhlIGdyYW50ZWUgbmVlZHMgLSBhdm9pZCBzZXJ2aWNlIHdpbGRjYXJkcyBzdWNoIGFzIGBnbHVlOipgLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgdGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gYWN0aW9ucyB0aGUgc2V0IG9mIEdsdWUgYWN0aW9ucyB0byBhbGxvdyAoZm9yIGV4YW1wbGUgYGdsdWU6R2V0VGFibGVgKVxuICAgKi9cbiAgcHVibGljIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCBhY3Rpb25zOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMudGFibGVBcm5dLFxuICAgICAgYWN0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gaWRlbnRpdHkgY3VzdG9tIHBlcm1pc3Npb25zIG9uIHRoaXMgdGFibGUgQU5EIGl0cyBwYXJlbnRcbiAgICogY2F0YWxvZyBhbmQgZGF0YWJhc2UuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBsb3ctbGV2ZWwgZXNjYXBlIGhhdGNoIGZvciBhY3Rpb25zIChzdWNoIGFzIGNlcnRhaW4gTGFrZVxuICAgKiBGb3JtYXRpb24gb3IgY3Jhd2xlciBvcGVyYXRpb25zKSB0aGF0IG11c3QgYmUgYXV0aG9yaXplZCBhZ2FpbnN0IHRoZVxuICAgKiBjYXRhbG9nIGFuZCBkYXRhYmFzZSBpbiBhZGRpdGlvbiB0byB0aGUgdGFibGUuIFRoZSBgYWN0aW9uc2AgYXJlIGFwcGxpZWRcbiAgICogdmVyYmF0aW0gdG8gYWxsIHRocmVlIEFSTnMgKHRhYmxlLCBjYXRhbG9nLCBkYXRhYmFzZSksIHNvIHNjb3BlIHRoZW1cbiAgICogdGlnaHRseTogcGFzcyBvbmx5IHRoZSBzcGVjaWZpYyBhY3Rpb25zIHRoZSBncmFudGVlIG5lZWRzIGFuZCBhdm9pZFxuICAgKiBzZXJ2aWNlIHdpbGRjYXJkcyBzdWNoIGFzIGBnbHVlOipgLCB3aGljaCB3b3VsZCBncmFudCBicm9hZCBhY2Nlc3MgYWNyb3NzXG4gICAqIGV2ZXJ5IHJlc291cmNlIGluIHRoZSBjYXRhbG9nIGFuZCBkYXRhYmFzZS5cbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIHRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIGFjdGlvbnMgdGhlIHNldCBvZiBHbHVlIGFjdGlvbnMgdG8gYWxsb3cgKGZvciBleGFtcGxlIGBnbHVlOkdldFRhYmxlYClcbiAgICovXG4gIHB1YmxpYyBncmFudFRvVW5kZXJseWluZ1Jlc291cmNlcyhncmFudGVlOiBpYW0uSUdyYW50YWJsZSwgYWN0aW9uczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICByZXNvdXJjZUFybnM6IFtcbiAgICAgICAgdGhpcy50YWJsZUFybixcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5jYXRhbG9nLmNhdGFsb2dBcm4sXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZGF0YWJhc2VBcm4sXG4gICAgICBdLFxuICAgICAgYWN0aW9ucyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEEgc3RhY2stc2luZ2xldG9uIGN1c3RvbSByZXNvdXJjZSBwcm92aWRlciB0aGF0IG1hbmFnZXMgR2x1ZSBwYXJ0aXRpb24gaW5kZXhlcy5cbiAqXG4gKiBBbGwgcGFydGl0aW9uLWluZGV4ZWQgdGFibGVzIGluIGEgc3RhY2sgc2hhcmUgYSBzaW5nbGUgcHJvdmlkZXIgKGFuZCBpdHMgdHdvXG4gKiBMYW1iZGEgaGFuZGxlcnMpIHRvIGF2b2lkIHByb3Zpc2lvbmluZyBhIHByb3ZpZGVyIGZyYW1ld29yayBwZXIgdGFibGUuIFRoZVxuICogcHJvdmlkZXIgYW5kIGhhbmRsZXJzIGFyZSBncm91cGVkIHVuZGVyIHRoaXMgc2luZ2xlIGNvbnN0cnVjdCBzbyBvbmx5IG9uZVxuICogaWQgaXMgcGxhY2VkIGF0IHN0YWNrIHNjb3BlLlxuICovXG5jbGFzcyBQYXJ0aXRpb25JbmRleFByb3ZpZGVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0YWNrLXNpbmdsZXRvbiBwcm92aWRlciwgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgeWV0IGV4aXN0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRPckNyZWF0ZShzY29wZTogQ29uc3RydWN0KTogUGFydGl0aW9uSW5kZXhQcm92aWRlciB7XG4gICAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZihzY29wZSk7XG4gICAgLy8gQSBmaXhlZCwgbmFtZXNwYWNlZCBpZCBtYWtlcyB0aGlzIGEgc3RhY2sgc2luZ2xldG9uOiBldmVyeSBjYWxsIHdpdGhpbiB0aGVcbiAgICAvLyBzYW1lIHN0YWNrIHJlc29sdmVzIHRvIHRoZSBzYW1lIGNoaWxkIHZpYSBgdHJ5RmluZENoaWxkYC5cbiAgICBjb25zdCBpZCA9ICdAYXdzLWNkay9hd3MtZ2x1ZS1hbHBoYS5QYXJ0aXRpb25JbmRleFByb3ZpZGVyJztcbiAgICByZXR1cm4gKHN0YWNrLm5vZGUudHJ5RmluZENoaWxkKGlkKSBhcyBQYXJ0aXRpb25JbmRleFByb3ZpZGVyKSA/PyBuZXcgUGFydGl0aW9uSW5kZXhQcm92aWRlcihzdGFjaywgaWQpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IG9uRXZlbnRIYW5kbGVyOiBsYW1iZGEuRnVuY3Rpb247XG4gIHB1YmxpYyByZWFkb25seSBpc0NvbXBsZXRlSGFuZGxlcjogbGFtYmRhLkZ1bmN0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3ZpZGVyOiBjci5Qcm92aWRlcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIFRoZSBoYW5kbGVyIHNvdXJjZSBsaXZlcyBpbiBgQGF3cy1jZGsvY3VzdG9tLXJlc291cmNlLWhhbmRsZXJzYCBhbmQgaXMgY29kZVxuICAgIC8vIGdlbmVyYXRlZCArIGFpcmxpZnRlZCBpbnRvIHRoaXMgcGFja2FnZSBhdCBidWlsZCB0aW1lIChzZWVcbiAgICAvLyBzY3JpcHRzL2FpcmxpZnQtY3VzdG9tLXJlc291cmNlLWhhbmRsZXJzLnNoKSwgZm9sbG93aW5nIHRoZSBwYXR0ZXJuIHVzZWQgYnkgdGhlXG4gICAgLy8gb3RoZXIgYWxwaGEgbW9kdWxlcyAoYXdzLWFtcGxpZnktYWxwaGEsIGF3cy1yZWRzaGlmdC1hbHBoYSkuIFRoZSBAYXdzLXNkay9jbGllbnQtZ2x1ZVxuICAgIC8vIG1vZHVsZSBpcyBwcm92aWRlZCBieSB0aGUgTGFtYmRhIHJ1bnRpbWUgcmF0aGVyIHRoYW4gYnVuZGxlZCBpbnRvIHRoZSBhc3NldC5cbiAgICB0aGlzLm9uRXZlbnRIYW5kbGVyID0gbmV3IFBhcnRpdGlvbkluZGV4T25FdmVudEZ1bmN0aW9uKHRoaXMsICdIYW5kbGVyJywge1xuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxKSxcbiAgICB9KTtcbiAgICB0aGlzLmlzQ29tcGxldGVIYW5kbGVyID0gbmV3IFBhcnRpdGlvbkluZGV4SXNDb21wbGV0ZUZ1bmN0aW9uKHRoaXMsICdJc0NvbXBsZXRlJywge1xuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxKSxcbiAgICB9KTtcblxuICAgIHRoaXMucHJvdmlkZXIgPSBuZXcgY3IuUHJvdmlkZXIodGhpcywgJ1Byb3ZpZGVyJywge1xuICAgICAgb25FdmVudEhhbmRsZXI6IHRoaXMub25FdmVudEhhbmRsZXIsXG4gICAgICBpc0NvbXBsZXRlSGFuZGxlcjogdGhpcy5pc0NvbXBsZXRlSGFuZGxlcixcbiAgICAgIHF1ZXJ5SW50ZXJ2YWw6IER1cmF0aW9uLnNlY29uZHMoMTApLFxuICAgICAgdG90YWxUaW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDE1KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VydmljZSB0b2tlbiB0byB3aXJlIGludG8gcGFydGl0aW9uIGluZGV4IGN1c3RvbSByZXNvdXJjZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VUb2tlbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3ZpZGVyLnNlcnZpY2VUb2tlbjtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNjaGVtYShjb2x1bW5zOiBDb2x1bW5bXSwgcGFydGl0aW9uS2V5cz86IENvbHVtbltdKTogdm9pZCB7XG4gIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTm9Db2x1bW5zU3BlY2lmaWVkYCwgJ3lvdSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIGNvbHVtbiBmb3IgdGhlIHRhYmxlJyk7XG4gIH1cbiAgLy8gQ2hlY2sgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNvbHVtbiBhbmQgbm8gZHVwbGljYXRlZCBjb2x1bW4gbmFtZXMgb3IgcGFydGl0aW9uIGtleXMuXG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIChjb2x1bW5zLmNvbmNhdChwYXJ0aXRpb25LZXlzIHx8IFtdKSkuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgIGlmIChuYW1lcy5oYXMoY29sdW1uLm5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YER1cGxpY2F0ZUNvbHVtbk5hbWVgLCBgY29sdW1uIG5hbWVzIGFuZCBwYXJ0aXRpb24ga2V5cyBtdXN0IGJlIHVuaXF1ZSwgYnV0IFxcJyR7Y29sdW1uLm5hbWV9XFwnIGlzIGR1cGxpY2F0ZWRgKTtcbiAgICB9XG4gICAgbmFtZXMuYWRkKGNvbHVtbi5uYW1lKTtcbiAgfSk7XG59XG4iXX0=
|
|
470
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRhYmxlLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSx5REFBMkM7QUFDM0MsaURBQWdEO0FBR2hELDJDQUEwSjtBQUMxSiw0RUFBcUU7QUFDckUsaUVBQW1EO0FBQ25ELDJDQUF1QztBQUd2QyxpRUFBeUc7QUFHekcsMklBQXFLO0FBcUxySzs7R0FFRztBQUNILE1BQXNCLFNBQVUsU0FBUSxlQUFROztJQUN2QyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQWdCLEVBQUUsRUFBVSxFQUFFLFFBQWdCOzs7Ozs7Ozs7O1FBQ3ZFLE1BQU0sU0FBUyxHQUFHLFNBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFNBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFlBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxnQkFBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsWUFBYSxDQUFDLENBQUMsQ0FBQztRQUUvSCxPQUFPLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQzlDLFFBQVE7WUFDUixTQUFTO1NBQ1YsQ0FBQyxDQUFDO0tBQ0o7SUFFRDs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBc0I7Ozs7Ozs7Ozs7O1FBQ3BGLE1BQU0sTUFBTyxTQUFRLGVBQVE7WUFDWCxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztZQUMxQixTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztTQUM3QztRQUVELE9BQU8sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzlCO0lBT0Q7O09BRUc7SUFDYSxRQUFRLENBQVk7SUFFcEM7O09BRUc7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RyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSw4QkFBdUIsQ0FBQyxJQUFBLHNCQUFHLEVBQUEscUJBQXFCLEVBQUUseURBQXlELE1BQU0sQ0FBQyxJQUFJLGtCQUFrQixDQUFDLENBQUM7UUFDdEosQ0FBQztRQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2ZuVGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZ2x1ZSc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBLZXlHcmFudHMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB0eXBlICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHR5cGUgeyBJUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IEFybkZvcm1hdCwgQ3VzdG9tUmVzb3VyY2UsIER1cmF0aW9uLCBGbiwgTGF6eSwgTmFtZXMsIFJlc291cmNlLCBTdGFjaywgVG9rZW4sIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IGxpdCwgbWQ1aGFzaCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0ICogYXMgY3IgZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB0eXBlIHsgRGF0YUZvcm1hdCB9IGZyb20gJy4vZGF0YS1mb3JtYXQnO1xuaW1wb3J0IHR5cGUgeyBJRGF0YWJhc2UgfSBmcm9tICcuL2RhdGFiYXNlJztcbmltcG9ydCB7IGdlbmVyYXRlUGFydGl0aW9uUHJvamVjdGlvblBhcmFtZXRlcnMsIHR5cGUgUGFydGl0aW9uUHJvamVjdGlvbiB9IGZyb20gJy4vcGFydGl0aW9uLXByb2plY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW4gfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgdHlwZSB7IFN0b3JhZ2VQYXJhbWV0ZXIgfSBmcm9tICcuL3N0b3JhZ2UtcGFyYW1ldGVyJztcbmltcG9ydCB7IFBhcnRpdGlvbkluZGV4SXNDb21wbGV0ZUZ1bmN0aW9uLCBQYXJ0aXRpb25JbmRleE9uRXZlbnRGdW5jdGlvbiB9IGZyb20gJy4uL2N1c3RvbS1yZXNvdXJjZS1oYW5kbGVycy9kaXN0L2F3cy1nbHVlLWFscGhhL3BhcnRpdGlvbi1pbmRleC1wcm92aWRlci5nZW5lcmF0ZWQnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgb2YgYSBQYXJ0aXRpb24gSW5kZXguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydGl0aW9uSW5kZXgge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHBhcnRpdGlvbiBpbmRleC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG5hbWUgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIHlvdS5cbiAgICovXG4gIHJlYWRvbmx5IGluZGV4TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhcnRpdGlvbiBrZXkgbmFtZXMgdGhhdCBjb21wcmlzZSB0aGUgcGFydGl0aW9uXG4gICAqIGluZGV4LiBUaGUgbmFtZXMgbXVzdCBjb3JyZXNwb25kIHRvIGEgbmFtZSBpbiB0aGVcbiAgICogdGFibGUncyBwYXJ0aXRpb24ga2V5cy5cbiAgICovXG4gIHJlYWRvbmx5IGtleU5hbWVzOiBzdHJpbmdbXTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVRhYmxlIGV4dGVuZHMgSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQXR0cmlidXRlcyB7XG4gIHJlYWRvbmx5IHRhYmxlQXJuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGdlbmVyYXRlZCBieSBDREsuXG4gICAqL1xuICByZWFkb25seSB0YWJsZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHRoZSB0YWJsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogRGF0YWJhc2UgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2U6IElEYXRhYmFzZTtcblxuICAvKipcbiAgICogQ29sdW1ucyBvZiB0aGUgdGFibGUuXG4gICAqL1xuICByZWFkb25seSBjb2x1bW5zOiBDb2x1bW5bXTtcblxuICAvKipcbiAgICogUGFydGl0aW9uIGNvbHVtbnMgb2YgdGhlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0YWJsZSBpcyBub3QgcGFydGl0aW9uZWRcbiAgICovXG4gIHJlYWRvbmx5IHBhcnRpdGlvbktleXM/OiBDb2x1bW5bXTtcblxuICAvKipcbiAgICogUGFydGl0aW9uIGluZGV4ZXMgb24gdGhlIHRhYmxlLiBBIG1heGltdW0gb2YgMyBpbmRleGVzXG4gICAqIGFyZSBhbGxvd2VkIG9uIGEgdGFibGUuIEtleXMgaW4gdGhlIGluZGV4IG11c3QgYmUgcGFydFxuICAgKiBvZiB0aGUgdGFibGUncyBwYXJ0aXRpb24ga2V5cy5cbiAgICpcbiAgICogQGRlZmF1bHQgdGFibGUgaGFzIG5vIHBhcnRpdGlvbiBpbmRleGVzXG4gICAqL1xuICByZWFkb25seSBwYXJ0aXRpb25JbmRleGVzPzogUGFydGl0aW9uSW5kZXhbXTtcblxuICAvKipcbiAgICogU3RvcmFnZSB0eXBlIG9mIHRoZSB0YWJsZSdzIGRhdGEuXG4gICAqL1xuICByZWFkb25seSBkYXRhRm9ybWF0OiBEYXRhRm9ybWF0O1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdGFibGUncyBkYXRhIGlzIGNvbXByZXNzZWQgb3Igbm90LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgY29tcHJlc3NlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0YWJsZSBkYXRhIGlzIHN0b3JlZCBpbiBzdWJkaXJlY3Rvcmllcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHN0b3JlZEFzU3ViRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIHBhcnRpdGlvbiBmaWx0ZXJpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvZ2x1ZS1iZXN0LXByYWN0aWNlcy5odG1sI2dsdWUtYmVzdC1wcmFjdGljZXMtcGFydGl0aW9uLWluZGV4XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIHBhcmFtZXRlciBpcyBub3QgZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlUGFydGl0aW9uRmlsdGVyaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHVzZXItc3VwcGxpZWQgcHJvcGVydGllcyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwaHlzaWNhbCBzdG9yYWdlIG9mIHRoaXMgdGFibGUuIFRoZXNlIHByb3BlcnRpZXMgaGVscCBkZXNjcmliZSB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIHRoYXQgaXMgc3RvcmVkIHdpdGhpbiB0aGUgY3Jhd2xlZCBkYXRhIHNvdXJjZXMuXG4gICAqXG4gICAqIFRoZSBrZXkvdmFsdWUgcGFpcnMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBzdWJtaXR0ZWQgYXJlIG5vdCBsaW1pdGVkLCBob3dldmVyIHRoZWlyIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGd1YXJhbnRlZWQuXG4gICAqXG4gICAqIFNvbWUga2V5cyB3aWxsIGJlIGF1dG8tcG9wdWxhdGVkIGJ5IGdsdWUgY3Jhd2xlcnMsIGhvd2V2ZXIsIHlvdSBjYW4gb3ZlcnJpZGUgdGhlbSBieSBzcGVjaWZ5aW5nIHRoZSBrZXkgYW5kIHZhbHVlIGluIHRoaXMgcHJvcGVydHkuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL3RhYmxlLXByb3BlcnRpZXMtY3Jhd2xlci5odG1sXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3JlZHNoaWZ0L2xhdGVzdC9kZy9yX0NSRUFURV9FWFRFUk5BTF9UQUJMRS5odG1sI3JfQ1JFQVRFX0VYVEVSTkFMX1RBQkxFLXBhcmFtZXRlcnMgLSB1bmRlciBfXCJUQUJMRSBQUk9QRVJUSUVTXCJfXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGRlY2xhcmUgY29uc3QgZ2x1ZURhdGFiYXNlOiBnbHVlLklEYXRhYmFzZTtcbiAgICogICAgY29uc3QgdGFibGUgPSBuZXcgZ2x1ZS5TM1RhYmxlKHRoaXMsICdUYWJsZScsIHtcbiAgICogICAgICBzdG9yYWdlUGFyYW1ldGVyczogW1xuICAgKiAgICAgICAgICBnbHVlLlN0b3JhZ2VQYXJhbWV0ZXIuc2tpcEhlYWRlckxpbmVDb3VudCgxKSxcbiAgICogICAgICAgICAgZ2x1ZS5TdG9yYWdlUGFyYW1ldGVyLmNvbXByZXNzaW9uVHlwZShnbHVlLkNvbXByZXNzaW9uVHlwZS5HWklQKSxcbiAgICogICAgICAgICAgZ2x1ZS5TdG9yYWdlUGFyYW1ldGVyLmN1c3RvbSgnZm9vJywgJ2JhcicpLCAvLyBXaWxsIGhhdmUgbm8gZWZmZWN0XG4gICAqICAgICAgICAgIGdsdWUuU3RvcmFnZVBhcmFtZXRlci5jdXN0b20oJ3NlcGFyYXRvckNoYXInLCAnLCcpLCAvLyBXaWxsIGRlc2NyaWJlIHRoZSBzZXBhcmF0b3IgY2hhciB1c2VkIGluIHRoZSBkYXRhXG4gICAqICAgICAgICAgIGdsdWUuU3RvcmFnZVBhcmFtZXRlci5jdXN0b20oZ2x1ZS5TdG9yYWdlUGFyYW1ldGVycy5XUklURV9QQVJBTExFTCwgJ29mZicpLFxuICAgKiAgICAgIF0sXG4gICAqICAgICAgLy8gLi4uXG4gICAqICAgICAgZGF0YWJhc2U6IGdsdWVEYXRhYmFzZSxcbiAgICogICAgICBjb2x1bW5zOiBbe1xuICAgKiAgICAgICAgICBuYW1lOiAnY29sMScsXG4gICAqICAgICAgICAgIHR5cGU6IGdsdWUuU2NoZW1hLlNUUklORyxcbiAgICogICAgICB9XSxcbiAgICogICAgICBkYXRhRm9ybWF0OiBnbHVlLkRhdGFGb3JtYXQuQ1NWLFxuICAgKiAgICB9KTtcbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgcGFyYW1ldGVyIGlzIG5vdCBkZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlUGFyYW1ldGVycz86IFN0b3JhZ2VQYXJhbWV0ZXJbXTtcblxuICAvKipcbiAgICogVGhlIGtleS92YWx1ZSBwYWlycyBkZWZpbmUgcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhYmxlLlxuICAgKiBUaGUga2V5L3ZhbHVlIHBhaXJzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgc3VibWl0dGVkIGFyZSBub3QgbGltaXRlZCwgaG93ZXZlciB0aGVpciBmdW5jdGlvbmFsaXR5IGlzIG5vdCBndWFyYW50ZWVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWdsdWUtdGFibGUtdGFibGVpbnB1dC5odG1sI2Nmbi1nbHVlLXRhYmxlLXRhYmxlaW5wdXQtcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBwYXJhbWV0ZXIgaXMgbm90IGRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgdGFibGUgaXMgZW5jcnlwdGVkLlxuICAgKlxuICAgKiBUaGlzIHNldHMgdGhlIGBoYXNfZW5jcnlwdGVkX2RhdGFgIHRhYmxlIHBhcmFtZXRlci4gQXRoZW5hIHJlYWRzIGl0IHdoZW5cbiAgICogcXVlcnlpbmcgY2xpZW50LXNpZGUgKENTRS1LTVMpIGVuY3J5cHRlZCBkYXRhc2V0czsgZm9yIHNlcnZlci1zaWRlXG4gICAqIGVuY3J5cHRlZCAoU1NFLVMzIC8gU1NFLUtNUykgb3IgdW5lbmNyeXB0ZWQgZGF0YSBpdCBoYXMgbm8gZWZmZWN0LCBzaW5jZVxuICAgKiBBbWF6b24gUzMgZGVjcnlwdHMgc2VydmVyLXNpZGUgZW5jcnlwdGVkIG9iamVjdHMgdHJhbnNwYXJlbnRseS5cbiAgICpcbiAgICogRG8gbm90IGFsc28gc2V0IGBoYXNfZW5jcnlwdGVkX2RhdGFgIHRocm91Z2ggYHBhcmFtZXRlcnNgIC0gdXNlIHRoaXNcbiAgICogcHJvcGVydHkgaW5zdGVhZC4gQSBjb25mbGljdGluZyB2YWx1ZSBpbiBgcGFyYW1ldGVyc2AgaXMgcmVqZWN0ZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvY3JlYXRpbmctdGFibGVzLWJhc2VkLW9uLWVuY3J5cHRlZC1kYXRhc2V0cy1pbi1zMy5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGhhc0VuY3J5cHRlZERhdGE/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGlzIHRhYmxlLlxuICAgKlxuICAgKiBQYXJ0aXRpb24gcHJvamVjdGlvbiBhbGxvd3MgQXRoZW5hIHRvIGF1dG9tYXRpY2FsbHkgYWRkIG5ldyBwYXJ0aXRpb25zXG4gICAqIHdpdGhvdXQgcmVxdWlyaW5nIGBBTFRFUiBUQUJMRSBBREQgUEFSVElUSU9OYCBzdGF0ZW1lbnRzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hdGhlbmEvbGF0ZXN0L3VnL3BhcnRpdGlvbi1wcm9qZWN0aW9uLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwYXJ0aXRpb24gcHJvamVjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcGFydGl0aW9uUHJvamVjdGlvbj86IFBhcnRpdGlvblByb2plY3Rpb247XG59XG5cbi8qKlxuICogQSBHbHVlIHRhYmxlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGFibGVCYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJVGFibGUge1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZUFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCB0YWJsZUFybjogc3RyaW5nKTogSVRhYmxlIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBGbi5zZWxlY3QoMSwgRm4uc3BsaXQoJy8nLCBTdGFjay5vZihzY29wZSkuc3BsaXRBcm4odGFibGVBcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKS5yZXNvdXJjZU5hbWUhKSk7XG5cbiAgICByZXR1cm4gVGFibGVCYXNlLmZyb21UYWJsZUF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICB0YWJsZUFybixcbiAgICAgIHRhYmxlTmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgVGFibGUgY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBjcmVhdGluZyBjb25zdHJ1Y3QgKHVzdWFsbHkgYHRoaXNgKS5cbiAgICogQHBhcmFtIGlkIFRoZSBjb25zdHJ1Y3QncyBpZC5cbiAgICogQHBhcmFtIGF0dHJzIEltcG9ydCBhdHRyaWJ1dGVzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZUF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IFRhYmxlQXR0cmlidXRlcyk6IElUYWJsZSB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJVGFibGUge1xuICAgICAgcHVibGljIHJlYWRvbmx5IHRhYmxlQXJuID0gYXR0cnMudGFibGVBcm47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdGFibGVOYW1lID0gYXR0cnMudGFibGVOYW1lO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgdGFibGVSZXNvdXJjZTogQ2ZuVGFibGU7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB0YWJsZU5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHRhYmxlQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBwYXJ0aXRpb25JbmRleGVzPzogUGFydGl0aW9uSW5kZXhbXTtcblxuICAvKipcbiAgICogRGF0YWJhc2UgdGhpcyB0YWJsZSBiZWxvbmdzIHRvLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRhdGFiYXNlOiBJRGF0YWJhc2U7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0YWJsZSdzIGRhdGEgaXMgY29tcHJlc3NlZCBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcHJlc3NlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogRm9ybWF0IG9mIHRoaXMgdGFibGUncyBkYXRhIGZpbGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQ7XG5cbiAgLyoqXG4gICAqIFRoaXMgdGFibGUncyBjb2x1bW5zLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbHVtbnM6IENvbHVtbltdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHRhYmxlJ3MgcGFydGl0aW9uIGtleXMgaWYgdGhlIHRhYmxlIGlzIHBhcnRpdGlvbmVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhcnRpdGlvbktleXM/OiBDb2x1bW5bXTtcblxuICAvKipcbiAgICogVGhlIHRhYmxlcycgc3RvcmFnZSBkZXNjcmlwdG9yIHByb3BlcnRpZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RvcmFnZVBhcmFtZXRlcnM/OiBTdG9yYWdlUGFyYW1ldGVyW107XG5cbiAgLyoqXG4gICAqIFRoaXMgdGFibGUncyBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uIGlmIGVuYWJsZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFydGl0aW9uUHJvamVjdGlvbj86IFBhcnRpdGlvblByb2plY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSB0YWJsZXMnIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YWJsZS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1nbHVlLXRhYmxlLXRhYmxlaW5wdXQuaHRtbCNjZm4tZ2x1ZS10YWJsZS10YWJsZWlucHV0LXBhcmFtZXRlcnNcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgdGFibGUgaXMgZW5jcnlwdGVkLiBFbWl0dGVkIGFzIHRoZVxuICAgKiBgaGFzX2VuY3J5cHRlZF9kYXRhYCB0YWJsZSBwYXJhbWV0ZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFzRW5jcnlwdGVkRGF0YTogYm9vbGVhbjtcblxuICAvKipcbiAgICogUGFydGl0aW9uIGluZGV4ZXMgbXVzdCBiZSBjcmVhdGVkIG9uZSBhdCBhIHRpbWUuIFRvIGF2b2lkXG4gICAqIHJhY2UgY29uZGl0aW9ucywgd2Ugc3RvcmUgdGhlIHJlc291cmNlIGFuZCBhZGQgZGVwZW5kZW5jaWVzXG4gICAqIGVhY2ggdGltZSBhIG5ldyBwYXJ0aXRpb24gaW5kZXggaXMgY3JlYXRlZC5cbiAgICovXG4gIHByaXZhdGUgcGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZXM6IEN1c3RvbVJlc291cmNlW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVGFibGVCYXNlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMudGFibGVOYW1lID8/XG4gICAgICAgIExhenkuc3RyaW5nKHtcbiAgICAgICAgICBwcm9kdWNlOiAoKSA9PiBOYW1lcy51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywge30pLnRvTG93ZXJDYXNlKCksXG4gICAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kYXRhYmFzZSA9IHByb3BzLmRhdGFiYXNlO1xuICAgIHRoaXMuZGF0YUZvcm1hdCA9IHByb3BzLmRhdGFGb3JtYXQ7XG5cbiAgICB2YWxpZGF0ZVNjaGVtYShwcm9wcy5jb2x1bW5zLCBwcm9wcy5wYXJ0aXRpb25LZXlzKTtcbiAgICB0aGlzLmNvbHVtbnMgPSBwcm9wcy5jb2x1bW5zO1xuICAgIHRoaXMucGFydGl0aW9uS2V5cyA9IHByb3BzLnBhcnRpdGlvbktleXM7XG4gICAgdGhpcy5zdG9yYWdlUGFyYW1ldGVycyA9IHByb3BzLnN0b3JhZ2VQYXJhbWV0ZXJzO1xuICAgIHRoaXMucGFydGl0aW9uUHJvamVjdGlvbiA9IHByb3BzLnBhcnRpdGlvblByb2plY3Rpb247XG4gICAgdGhpcy5wYXJhbWV0ZXJzID0gcHJvcHMucGFyYW1ldGVycyA/PyB7fTtcblxuICAgIHRoaXMuaGFzRW5jcnlwdGVkRGF0YSA9IHByb3BzLmhhc0VuY3J5cHRlZERhdGEgPz8gdHJ1ZTtcbiAgICB0aGlzLnJlY29uY2lsZUhhc0VuY3J5cHRlZERhdGEoKTtcblxuICAgIHRoaXMuY29tcHJlc3NlZCA9IHByb3BzLmNvbXByZXNzZWQgPz8gZmFsc2U7XG5cbiAgICB0aGlzLnZhbGlkYXRlQW5kR2VuZXJhdGVQYXJ0aXRpb25Qcm9qZWN0aW9uKCk7XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgZ3JhbnRSZWFkKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuICBwdWJsaWMgYWJzdHJhY3QgZ3JhbnRXcml0ZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcbiAgcHVibGljIGFic3RyYWN0IGdyYW50UmVhZFdyaXRlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXJ0aXRpb24gaW5kZXggdG8gdGhlIHRhYmxlLiBZb3UgY2FuIGhhdmUgYSBtYXhpbXVtIG9mIDMgcGFydGl0aW9uXG4gICAqIGluZGV4ZXMgdG8gYSB0YWJsZS4gUGFydGl0aW9uIGluZGV4IGtleXMgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgdGFibGUnc1xuICAgKiBwYXJ0aXRpb24ga2V5cy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvcGFydGl0aW9uLWluZGV4ZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIGFkZFBhcnRpdGlvbkluZGV4KGluZGV4OiBQYXJ0aXRpb25JbmRleCkge1xuICAgIGNvbnN0IG51bVBhcnRpdGlvbnMgPSB0aGlzLnBhcnRpdGlvbkluZGV4Q3VzdG9tUmVzb3VyY2VzLmxlbmd0aDtcbiAgICBpZiAobnVtUGFydGl0aW9ucyA+PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBNYXhQYXJ0aXRpb25JbmRleGVzRXhjZWVkZWRgLCAnTWF4aW11bSBudW1iZXIgb2YgcGFydGl0aW9uIGluZGV4ZXMgYWxsb3dlZCBpcyAzJywgdGhpcyk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVQYXJ0aXRpb25JbmRleChpbmRleCk7XG5cbiAgICBjb25zdCBpbmRleE5hbWUgPSBpbmRleC5pbmRleE5hbWUgPz8gdGhpcy5nZW5lcmF0ZUluZGV4TmFtZShpbmRleC5rZXlOYW1lcyk7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBQYXJ0aXRpb25JbmRleFByb3ZpZGVyLmdldE9yQ3JlYXRlKHRoaXMpO1xuXG4gICAgLy8gVGhlIGdyYW50cyBhcmUgaWRlbnRpY2FsIGZvciBldmVyeSBpbmRleCBvbiB0aGlzIHRhYmxlLCBzbyBvbmx5IGFkZCB0aGVtXG4gICAgLy8gb25jZS5cbiAgICBpZiAobnVtUGFydGl0aW9ucyA9PT0gMCkge1xuICAgICAgLy8gQWRkIHNjb3BlZCBwZXJtaXNzaW9ucyBmb3IgdGhpcyB0YWJsZSdzIEdsdWUgcmVzb3VyY2VzXG4gICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9hd3NnbHVlLmh0bWxcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IFt0aGlzLnRhYmxlQXJuLCB0aGlzLmRhdGFiYXNlLmRhdGFiYXNlQXJuLCB0aGlzLmRhdGFiYXNlLmNhdGFsb2cuY2F0YWxvZ0Fybl07XG5cbiAgICAgIC8vIFRoZSBjYXRhbG9nJ3MgZW5jcnlwdGlvbiBpcyBmaXhlZCBhdCBjb25zdHJ1Y3Rpb24sIHNvIHRoZSBlbmNyeXB0aW9uIGtleVxuICAgICAgLy8gKGlmIGFueSkgaXMga25vd24gaGVyZS4gR3JhbnQgdGhlIGhhbmRsZXJzIGFjY2VzcyB0byBpdC4gTm8tb3Agd2hlbiB0aGVcbiAgICAgIC8vIGNhdGFsb2cgdXNlcyBhbiBBV1MtbWFuYWdlZCBrZXkgb3Igbm8gZW5jcnlwdGlvbi5cbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuZGF0YWJhc2UuY2F0YWxvZy5lbmNyeXB0aW9uS2V5O1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBjb25zdCBncmFudHMgPSBLZXlHcmFudHMuZnJvbUtleShrZXkpO1xuICAgICAgICBncmFudHMuZGVjcnlwdChwcm92aWRlci5vbkV2ZW50SGFuZGxlcik7XG4gICAgICAgIGdyYW50cy5kZWNyeXB0KHByb3ZpZGVyLmlzQ29tcGxldGVIYW5kbGVyKTtcbiAgICAgIH1cblxuICAgICAgLy8gQm90aCBoYW5kbGVycyBjcmVhdGUsIGRlbGV0ZSwgYW5kIGluc3BlY3QgaW5kZXhlczogb25FdmVudCBjcmVhdGVzL2RlbGV0ZXMgb25cbiAgICAgIC8vIENyZWF0ZS9EZWxldGUvVXBkYXRlLCBhbmQgaXNDb21wbGV0ZSByZWNyZWF0ZXMgdGhlIGluZGV4IHdoaWxlIGRyaXZpbmcgYVxuICAgICAgLy8ga2V5LWNoYW5nZSB1cGRhdGUgKGRlbGV0ZSAtPiByZWNyZWF0ZSAtPiBBQ1RJVkUpLiBVcGRhdGVUYWJsZS9HZXRUYWJsZSBhcmVcbiAgICAgIC8vIHJlcXVpcmVkIGJ5IHRoZSBDcmVhdGVQYXJ0aXRpb25JbmRleC9EZWxldGVQYXJ0aXRpb25JbmRleCBBUElzLlxuICAgICAgY29uc3QgYWN0aW9ucyA9IFtcbiAgICAgICAgJ2dsdWU6R2V0UGFydGl0aW9uSW5kZXhlcycsXG4gICAgICAgICdnbHVlOkNyZWF0ZVBhcnRpdGlvbkluZGV4JyxcbiAgICAgICAgJ2dsdWU6RGVsZXRlUGFydGl0aW9uSW5kZXgnLFxuICAgICAgICAnZ2x1ZTpHZXRUYWJsZScsXG4gICAgICAgICdnbHVlOlVwZGF0ZVRhYmxlJyxcbiAgICAgIF07XG4gICAgICBwcm92aWRlci5vbkV2ZW50SGFuZGxlci5hZGRUb1JvbGVQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoeyBhY3Rpb25zLCByZXNvdXJjZXMgfSkpO1xuICAgICAgcHJvdmlkZXIuaXNDb21wbGV0ZUhhbmRsZXIuYWRkVG9Sb2xlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHsgYWN0aW9ucywgcmVzb3VyY2VzIH0pKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aXRpb25JbmRleEN1c3RvbVJlc291cmNlID0gbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsIGBwYXJ0aXRpb24taW5kZXgtJHtpbmRleE5hbWV9YCwge1xuICAgICAgcmVzb3VyY2VUeXBlOiAnQ3VzdG9tOjpHbHVlUGFydGl0aW9uSW5kZXgnLFxuICAgICAgc2VydmljZVRva2VuOiBwcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIERhdGFiYXNlTmFtZTogdGhpcy5kYXRhYmFzZS5kYXRhYmFzZU5hbWUsXG4gICAgICAgIFRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsXG4gICAgICAgIEluZGV4TmFtZTogaW5kZXhOYW1lLFxuICAgICAgICBLZXlzOiBpbmRleC5rZXlOYW1lcyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBFbnN1cmUgSUFNIHBvbGljaWVzIGFyZSBjcmVhdGVkIGJlZm9yZSB0aGUgY3VzdG9tIHJlc291cmNlIGludm9rZXMgdGhlIGhhbmRsZXJzXG4gICAgcGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3kocHJvdmlkZXIub25FdmVudEhhbmRsZXIucm9sZSEpO1xuICAgIHBhcnRpdGlvbkluZGV4Q3VzdG9tUmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KHByb3ZpZGVyLmlzQ29tcGxldGVIYW5kbGVyLnJvbGUhKTtcblxuICAgIC8vIERlcGVuZCBvbiBwcmV2aW91cyBwYXJ0aXRpb24gaW5kZXggdG8gYXZvaWQgcmFjZSBjb25kaXRpb25cbiAgICBpZiAobnVtUGFydGl0aW9ucyA+IDApIHtcbiAgICAgIHBhcnRpdGlvbkluZGV4Q3VzdG9tUmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMucGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZXNbbnVtUGFydGl0aW9ucy0xXSk7XG4gICAgfVxuICAgIHRoaXMucGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZXMucHVzaChwYXJ0aXRpb25JbmRleEN1c3RvbVJlc291cmNlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVJbmRleE5hbWUoa2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IG1heEluZGV4TGVuZ3RoID0gODA7XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChrZXlzKSB8fCBrZXlzLnNvbWUoayA9PiBUb2tlbi5pc1VucmVzb2x2ZWQoaykpKSB7XG4gICAgICAvLyBUaGUgaW5kZXggbmFtZSBpcyBkZXJpdmVkIGZyb20gdGhlIGtleSBuYW1lcywgc28gdG9rZW5pemVkIGtleXMgbGVhdmVcbiAgICAgIC8vIG5vdGhpbmcgc3RhYmxlIHRvIGdlbmVyYXRlIGZyb206IGFueSBhdXRvLWdlbmVyYXRlZCBuYW1lIHdvdWxkIGhhdmUgdG9cbiAgICAgIC8vIGZhbGwgYmFjayB0byB0aGUgaW5kZXgncyBwb3NpdGlvbiBvbiB0aGUgdGFibGUsIHdoaWNoIHNoaWZ0cyBpZiBpbmRleGVzXG4gICAgICAvLyBhcmUgYWRkZWQsIHJlbW92ZWQsIG9yIHJlb3JkZXJlZCAtIHNpbGVudGx5IHJlcGxhY2luZyBpbmRleGVzIHRoYXQgZGlkXG4gICAgICAvLyBub3QgYWN0dWFsbHkgY2hhbmdlLiBSZXF1aXJlIGFuIGV4cGxpY2l0LCBzdGFibGUgbmFtZSBpbnN0ZWFkLlxuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YFRva2VuaXplZEluZGV4S2V5c1JlcXVpcmVOYW1lYCxcbiAgICAgICAgJ2Nhbm5vdCBhdXRvLWdlbmVyYXRlIGEgc3RhYmxlIHBhcnRpdGlvbiBpbmRleCBuYW1lIGZyb20gdG9rZW5pemVkIGtleSBuYW1lczsgJyArXG4gICAgICAgICAgJ3NwZWNpZnkgYGluZGV4TmFtZWAgZXhwbGljaXRseSB3aGVuIGluZGV4IGtleXMgYXJlIG5vdCBrbm93biBhdCBzeW50aGVzaXMgdGltZScsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBwcmVmaXggPSBrZXlzLmpvaW4oJy0nKSArICctJztcbiAgICBjb25zdCB1bmlxdWVJZCA9IE5hbWVzLnVuaXF1ZUlkKHRoaXMpO1xuICAgIGlmIChwcmVmaXgubGVuZ3RoIDwgbWF4SW5kZXhMZW5ndGgpIHtcbiAgICAgIC8vIENvbW1vbiBjYXNlOiB0cmltIHRoZSB1bmlxdWVJZCB0YWlsIHNvIHRoZSB3aG9sZSBuYW1lIGZpdHMgdW5kZXIgdGhlIGNhcC5cbiAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBNYXRoLm1heCgwLCB1bmlxdWVJZC5sZW5ndGggLSAobWF4SW5kZXhMZW5ndGggLSBwcmVmaXgubGVuZ3RoKSk7XG4gICAgICByZXR1cm4gcHJlZml4ICsgdW5pcXVlSWQuc3Vic3RyaW5nKHN0YXJ0SW5kZXgpO1xuICAgIH1cbiAgICAvLyBUaGUgam9pbmVkIGtleSBuYW1lcyBhbG9uZSBleGNlZWQgdGhlIGJ1ZGdldCAobG9uZyBrZXkgbmFtZXMpLCBzbyB0cmltbWluZ1xuICAgIC8vIHRoZSB1bmlxdWVJZCBpcyBub3QgZW5vdWdoLiBUcnVuY2F0ZSB0aGUgcHJlZml4IGFuZCBhcHBlbmQgYSBoYXNoIG9mIHRoZVxuICAgIC8vIHRhYmxlIHBhdGggcGx1cyB0aGUgZnVsbCBrZXkgbGlzdCwgc28gdHdvIGRpZmZlcmVudCAobG9uZykga2V5IHNldHMgY2Fubm90XG4gICAgLy8gY29sbGlkZSBhZnRlciB0cnVuY2F0aW9uLlxuICAgIGNvbnN0IGhhc2ggPSBtZDVoYXNoKHVuaXF1ZUlkICsgJy0nICsga2V5cy5qb2luKCctJykpLnNsaWNlKDAsIDgpO1xuICAgIHJldHVybiBwcmVmaXguc3Vic3RyaW5nKDAsIG1heEluZGV4TGVuZ3RoIC0gaGFzaC5sZW5ndGggLSAxKSArICctJyArIGhhc2g7XG4gIH1cblxuICAvKipcbiAgICogUmVjb25jaWxlIGEgYGhhc19lbmNyeXB0ZWRfZGF0YWAgdmFsdWUgc3VwcGxpZWQgdGhyb3VnaCB0aGUgZnJlZS1mb3JtXG4gICAqIGBwYXJhbWV0ZXJzYCBtYXAgd2l0aCB0aGUgdHlwZWQgYGhhc0VuY3J5cHRlZERhdGFgIHByb3BlcnR5LlxuICAgKlxuICAgKiBgaGFzX2VuY3J5cHRlZF9kYXRhYCBpcyBtYW5hZ2VkIGJ5IHRoaXMgY29uc3RydWN0IGFuZCBlbWl0dGVkIGF1dGhvcml0YXRpdmVseVxuICAgKiBmcm9tIGBoYXNFbmNyeXB0ZWREYXRhYC4gU3VwcGx5aW5nIGl0IHRocm91Z2ggYHBhcmFtZXRlcnNgIGFzIHdlbGwgaXMgb25seVxuICAgKiB0b2xlcmF0ZWQgd2hlbiB0aGUgdmFsdWUgaXMgaWRlbnRpY2FsOyBhIGRpZmZlcmluZyAob3IgdW5yZXNvbHZlZCkgdmFsdWUgaXNcbiAgICogcmVqZWN0ZWQgc28gdGhlIHR3byBpbnB1dHMgY2FuIG5ldmVyIHNpbGVudGx5IGRpc2FncmVlLiBPbiBzdWNjZXNzIHRoZSBrZXkgaXNcbiAgICogcmVtb3ZlZCBmcm9tIHRoZSBmcmVlLWZvcm0gbWFwIHNvIHRoZSBtYW5hZ2VkIHZhbHVlIGlzIHRoZSBzaW5nbGUgc291cmNlIG9mXG4gICAqIHRydXRoLlxuICAgKi9cbiAgcHJpdmF0ZSByZWNvbmNpbGVIYXNFbmNyeXB0ZWREYXRhKCk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9ICdoYXNfZW5jcnlwdGVkX2RhdGEnO1xuICAgIGlmICghKGtleSBpbiB0aGlzLnBhcmFtZXRlcnMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN1cHBsaWVkID0gdGhpcy5wYXJhbWV0ZXJzW2tleV07XG4gICAgY29uc3QgbWFuYWdlZCA9IFN0cmluZyh0aGlzLmhhc0VuY3J5cHRlZERhdGEpO1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoc3VwcGxpZWQpIHx8IHN1cHBsaWVkICE9PSBtYW5hZ2VkKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgSGFzRW5jcnlwdGVkRGF0YUNvbmZsaWN0YCxcbiAgICAgICAgYHRoZSBcXGAke2tleX1cXGAgdGFibGUgcGFyYW1ldGVyIGlzIG1hbmFnZWQgYnkgdGhlIFxcYGhhc0VuY3J5cHRlZERhdGFcXGAgcHJvcGVydHk7IGAgK1xuICAgICAgICAgIGByZW1vdmUgaXQgZnJvbSBcXGBwYXJhbWV0ZXJzXFxgIGFuZCB1c2UgdGhlIGJvb2xlYW4gXFxgaGFzRW5jcnlwdGVkRGF0YVxcYCBwcm9wZXJ0eSBpbnN0ZWFkIChnb3QgJHtKU09OLnN0cmluZ2lmeShzdXBwbGllZCl9LCBleHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KG1hbmFnZWQpfSlgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgZGVsZXRlIHRoaXMucGFyYW1ldGVyc1trZXldO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBhcnRpdGlvbkluZGV4KGluZGV4OiBQYXJ0aXRpb25JbmRleCkge1xuICAgIGlmIChpbmRleC5pbmRleE5hbWUgIT09IHVuZGVmaW5lZCAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKGluZGV4LmluZGV4TmFtZSkgJiYgKGluZGV4LmluZGV4TmFtZS5sZW5ndGggPCAxIHx8IGluZGV4LmluZGV4TmFtZS5sZW5ndGggPiAyNTUpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBJbmRleE5hbWVMZW5ndGhJbnZhbGlkYCwgYEluZGV4IG5hbWUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDI1NSBjaGFyYWN0ZXJzLCBidXQgZ290ICR7aW5kZXguaW5kZXhOYW1lLmxlbmd0aH1gLCB0aGlzKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBhcnRpdGlvbktleXMgfHwgdGhpcy5wYXJ0aXRpb25LZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgTm9QYXJ0aXRpb25LZXlzRm9ySW5kZXhgLCAnVGhlIHRhYmxlIG11c3QgaGF2ZSBwYXJ0aXRpb24ga2V5cyB0byBjcmVhdGUgYSBwYXJ0aXRpb24gaW5kZXgnLCB0aGlzKTtcbiAgICB9XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoaW5kZXgua2V5TmFtZXMpKSB7XG4gICAgICBjb25zdCBrZXlOYW1lcyA9IHRoaXMucGFydGl0aW9uS2V5cy5tYXAocGsgPT4gcGsubmFtZSk7XG4gICAgICBjb25zdCBjb25jcmV0ZUtleXMgPSBpbmRleC5rZXlOYW1lcy5maWx0ZXIoayA9PiAhVG9rZW4uaXNVbnJlc29sdmVkKGspKTtcbiAgICAgIGlmIChjb25jcmV0ZUtleXMubGVuZ3RoID4gMCAmJiAhY29uY3JldGVLZXlzLmV2ZXJ5KGsgPT4ga2V5TmFtZXMuaW5jbHVkZXMoaykpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YEluZGV4S2V5c05vdFBhcnRpdGlvbktleXNgLCBgQWxsIGluZGV4IGtleXMgbXVzdCBhbHNvIGJlIHBhcnRpdGlvbiBrZXlzLiBHb3QgJHtpbmRleC5rZXlOYW1lc30gYnV0IHBhcnRpdGlvbiBrZXkgbmFtZXMgYXJlICR7a2V5TmFtZXN9YCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24gYW5kIG1lcmdlIGdlbmVyYXRlZCBwYXJhbWV0ZXJzIGludG8gdGhpcy5wYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFuZEdlbmVyYXRlUGFydGl0aW9uUHJvamVjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGFydGl0aW9uUHJvamVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgcGFydGl0aW9uIGtleXMgZXhpc3RcbiAgICBpZiAoIXRoaXMucGFydGl0aW9uS2V5cyB8fCB0aGlzLnBhcnRpdGlvbktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgTm9QYXJ0aXRpb25LZXlzRm9yUHJvamVjdGlvbmAsXG4gICAgICAgICdUaGUgdGFibGUgbXVzdCBoYXZlIHBhcnRpdGlvbiBrZXlzIHRvIHVzZSBwYXJ0aXRpb24gcHJvamVjdGlvbicsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRpdGlvbktleU5hbWVzID0gdGhpcy5wYXJ0aXRpb25LZXlzLm1hcChwayA9PiBway5uYW1lKTtcblxuICAgIC8vIFZhbGlkYXRlIGVhY2ggcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvblxuICAgIGZvciAoY29uc3QgW2NvbHVtbk5hbWUsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5wYXJ0aXRpb25Qcm9qZWN0aW9uKSkge1xuICAgICAgLy8gVmFsaWRhdGUgdGhhdCBjb2x1bW4gaXMgYSBwYXJ0aXRpb24ga2V5XG4gICAgICBpZiAoIXBhcnRpdGlvbktleU5hbWVzLmluY2x1ZGVzKGNvbHVtbk5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YFByb2plY3Rpb25Db2x1bW5Ob3RQYXJ0aXRpb25LZXlgLFxuICAgICAgICAgIGBQYXJ0aXRpb24gcHJvamVjdGlvbiBjb2x1bW4gXCIke2NvbHVtbk5hbWV9XCIgbXVzdCBiZSBhIHBhcnRpdGlvbiBrZXkuIGAgK1xuICAgICAgICAgIGBQYXJ0aXRpb24ga2V5cyBhcmU6ICR7cGFydGl0aW9uS2V5TmFtZXMuam9pbignLCAnKX1gLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIENsb3VkRm9ybWF0aW9uIHBhcmFtZXRlcnNcbiAgICAgIGNvbnN0IGdlbmVyYXRlZFBhcmFtcyA9IGdlbmVyYXRlUGFydGl0aW9uUHJvamVjdGlvblBhcmFtZXRlcnMoY29sdW1uTmFtZSwgY29uZmlnKTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGNvbmZsaWN0cyB3aXRoIG1hbnVhbGx5IHNwZWNpZmllZCBwYXJhbWV0ZXJzXG4gICAgICBjb25zdCBjb25mbGljdGluZ0tleXMgPSBPYmplY3Qua2V5cyhnZW5lcmF0ZWRQYXJhbXMpLmZpbHRlcihrZXkgPT4ga2V5IGluIHRoaXMucGFyYW1ldGVycyk7XG4gICAgICBpZiAoY29uZmxpY3RpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgUHJvamVjdGlvblBhcmFtZXRlcnNDb25mbGljdGAsXG4gICAgICAgICAgYFBhcnRpdGlvbiBwcm9qZWN0aW9uIHBhcmFtZXRlcnMgY29uZmxpY3Qgd2l0aCBtYW51YWxseSBzcGVjaWZpZWQgcGFyYW1ldGVyczogJHtjb25mbGljdGluZ0tleXMuam9pbignLCAnKX0uIGAgK1xuICAgICAgICAgICdVc2UgdGhlIHBhcnRpdGlvblByb2plY3Rpb24gcHJvcGVydHkgaW5zdGVhZCBvZiBtYW51YWxseSBzcGVjaWZ5aW5nIHByb2plY3Rpb24gcGFyYW1ldGVycy4nLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1lcmdlIGludG8gdGhpcy5wYXJhbWV0ZXJzXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMucGFyYW1ldGVycywgZ2VuZXJhdGVkUGFyYW1zKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgY29uZmxpY3Qgd2l0aCBwcm9qZWN0aW9uLmVuYWJsZWRcbiAgICBpZiAoJ3Byb2plY3Rpb24uZW5hYmxlZCcgaW4gdGhpcy5wYXJhbWV0ZXJzKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgUHJvamVjdGlvbkVuYWJsZWRDb25mbGljdGAsXG4gICAgICAgICdQYXJhbWV0ZXIgXCJwcm9qZWN0aW9uLmVuYWJsZWRcIiBjb25mbGljdHMgd2l0aCBwYXJ0aXRpb25Qcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uICcgK1xuICAgICAgICAnVXNlIHRoZSBwYXJ0aXRpb25Qcm9qZWN0aW9uIHByb3BlcnR5IGluc3RlYWQgb2YgbWFudWFsbHkgc3BlY2lmeWluZyBwcm9qZWN0aW9uLmVuYWJsZWQuJyxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRW5hYmxlIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGdsb2JhbGx5XG4gICAgdGhpcy5wYXJhbWV0ZXJzWydwcm9qZWN0aW9uLmVuYWJsZWQnXSA9ICd0cnVlJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gaWRlbnRpdHkgY3VzdG9tIHBlcm1pc3Npb25zIG9uIHRoaXMgdGFibGUuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBsb3ctbGV2ZWwgZXNjYXBlIGhhdGNoOiB0aGUgYGFjdGlvbnNgIGFyZSBhcHBsaWVkIHZlcmJhdGltLFxuICAgKiBzY29wZWQgdG8gdGhpcyB0YWJsZSdzIEFSTi4gUHJlZmVyIHRoZSBpbnRlbnQtYmFzZWQgYGdyYW50UmVhZGAgL1xuICAgKiBgZ3JhbnRXcml0ZWAgLyBgZ3JhbnRSZWFkV3JpdGVgIG1ldGhvZHMsIHdoaWNoIGdyYW50IGEgY3VyYXRlZCBzZXQgb2ZcbiAgICogYWN0aW9ucyBhbmQgYWxzbyBjb3ZlciB0aGUgdW5kZXJseWluZyBTMyBkYXRhLiBPbmx5IHBhc3MgdGhlIHNwZWNpZmljXG4gICAqIGFjdGlvbnMgdGhlIGdyYW50ZWUgbmVlZHMgLSBhdm9pZCBzZXJ2aWNlIHdpbGRjYXJkcyBzdWNoIGFzIGBnbHVlOipgLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgdGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gYWN0aW9ucyB0aGUgc2V0IG9mIEdsdWUgYWN0aW9ucyB0byBhbGxvdyAoZm9yIGV4YW1wbGUgYGdsdWU6R2V0VGFibGVgKVxuICAgKi9cbiAgcHVibGljIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCBhY3Rpb25zOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMudGFibGVBcm5dLFxuICAgICAgYWN0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gaWRlbnRpdHkgY3VzdG9tIHBlcm1pc3Npb25zIG9uIHRoaXMgdGFibGUgQU5EIGl0cyBwYXJlbnRcbiAgICogY2F0YWxvZyBhbmQgZGF0YWJhc2UuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBsb3ctbGV2ZWwgZXNjYXBlIGhhdGNoIGZvciBhY3Rpb25zIChzdWNoIGFzIGNlcnRhaW4gTGFrZVxuICAgKiBGb3JtYXRpb24gb3IgY3Jhd2xlciBvcGVyYXRpb25zKSB0aGF0IG11c3QgYmUgYXV0aG9yaXplZCBhZ2FpbnN0IHRoZVxuICAgKiBjYXRhbG9nIGFuZCBkYXRhYmFzZSBpbiBhZGRpdGlvbiB0byB0aGUgdGFibGUuIFRoZSBgYWN0aW9uc2AgYXJlIGFwcGxpZWRcbiAgICogdmVyYmF0aW0gdG8gYWxsIHRocmVlIEFSTnMgKHRhYmxlLCBjYXRhbG9nLCBkYXRhYmFzZSksIHNvIHNjb3BlIHRoZW1cbiAgICogdGlnaHRseTogcGFzcyBvbmx5IHRoZSBzcGVjaWZpYyBhY3Rpb25zIHRoZSBncmFudGVlIG5lZWRzIGFuZCBhdm9pZFxuICAgKiBzZXJ2aWNlIHdpbGRjYXJkcyBzdWNoIGFzIGBnbHVlOipgLCB3aGljaCB3b3VsZCBncmFudCBicm9hZCBhY2Nlc3MgYWNyb3NzXG4gICAqIGV2ZXJ5IHJlc291cmNlIGluIHRoZSBjYXRhbG9nIGFuZCBkYXRhYmFzZS5cbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIHRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIGFjdGlvbnMgdGhlIHNldCBvZiBHbHVlIGFjdGlvbnMgdG8gYWxsb3cgKGZvciBleGFtcGxlIGBnbHVlOkdldFRhYmxlYClcbiAgICovXG4gIHB1YmxpYyBncmFudFRvVW5kZXJseWluZ1Jlc291cmNlcyhncmFudGVlOiBpYW0uSUdyYW50YWJsZSwgYWN0aW9uczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICByZXNvdXJjZUFybnM6IFtcbiAgICAgICAgdGhpcy50YWJsZUFybixcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5jYXRhbG9nLmNhdGFsb2dBcm4sXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZGF0YWJhc2VBcm4sXG4gICAgICBdLFxuICAgICAgYWN0aW9ucyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEEgc3RhY2stc2luZ2xldG9uIGN1c3RvbSByZXNvdXJjZSBwcm92aWRlciB0aGF0IG1hbmFnZXMgR2x1ZSBwYXJ0aXRpb24gaW5kZXhlcy5cbiAqXG4gKiBBbGwgcGFydGl0aW9uLWluZGV4ZWQgdGFibGVzIGluIGEgc3RhY2sgc2hhcmUgYSBzaW5nbGUgcHJvdmlkZXIgKGFuZCBpdHMgdHdvXG4gKiBMYW1iZGEgaGFuZGxlcnMpIHRvIGF2b2lkIHByb3Zpc2lvbmluZyBhIHByb3ZpZGVyIGZyYW1ld29yayBwZXIgdGFibGUuIFRoZVxuICogcHJvdmlkZXIgYW5kIGhhbmRsZXJzIGFyZSBncm91cGVkIHVuZGVyIHRoaXMgc2luZ2xlIGNvbnN0cnVjdCBzbyBvbmx5IG9uZVxuICogaWQgaXMgcGxhY2VkIGF0IHN0YWNrIHNjb3BlLlxuICovXG5jbGFzcyBQYXJ0aXRpb25JbmRleFByb3ZpZGVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0YWNrLXNpbmdsZXRvbiBwcm92aWRlciwgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgeWV0IGV4aXN0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRPckNyZWF0ZShzY29wZTogQ29uc3RydWN0KTogUGFydGl0aW9uSW5kZXhQcm92aWRlciB7XG4gICAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZihzY29wZSk7XG4gICAgLy8gQSBmaXhlZCwgbmFtZXNwYWNlZCBpZCBtYWtlcyB0aGlzIGEgc3RhY2sgc2luZ2xldG9uOiBldmVyeSBjYWxsIHdpdGhpbiB0aGVcbiAgICAvLyBzYW1lIHN0YWNrIHJlc29sdmVzIHRvIHRoZSBzYW1lIGNoaWxkIHZpYSBgdHJ5RmluZENoaWxkYC5cbiAgICBjb25zdCBpZCA9ICdAYXdzLWNkay9hd3MtZ2x1ZS1hbHBoYS5QYXJ0aXRpb25JbmRleFByb3ZpZGVyJztcbiAgICByZXR1cm4gKHN0YWNrLm5vZGUudHJ5RmluZENoaWxkKGlkKSBhcyBQYXJ0aXRpb25JbmRleFByb3ZpZGVyKSA/PyBuZXcgUGFydGl0aW9uSW5kZXhQcm92aWRlcihzdGFjaywgaWQpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IG9uRXZlbnRIYW5kbGVyOiBsYW1iZGEuRnVuY3Rpb247XG4gIHB1YmxpYyByZWFkb25seSBpc0NvbXBsZXRlSGFuZGxlcjogbGFtYmRhLkZ1bmN0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3ZpZGVyOiBjci5Qcm92aWRlcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIFRoZSBoYW5kbGVyIHNvdXJjZSBsaXZlcyBpbiBgQGF3cy1jZGsvY3VzdG9tLXJlc291cmNlLWhhbmRsZXJzYCBhbmQgaXMgY29kZVxuICAgIC8vIGdlbmVyYXRlZCArIGFpcmxpZnRlZCBpbnRvIHRoaXMgcGFja2FnZSBhdCBidWlsZCB0aW1lIChzZWVcbiAgICAvLyBzY3JpcHRzL2FpcmxpZnQtY3VzdG9tLXJlc291cmNlLWhhbmRsZXJzLnNoKSwgZm9sbG93aW5nIHRoZSBwYXR0ZXJuIHVzZWQgYnkgdGhlXG4gICAgLy8gb3RoZXIgYWxwaGEgbW9kdWxlcyAoYXdzLWFtcGxpZnktYWxwaGEsIGF3cy1yZWRzaGlmdC1hbHBoYSkuIFRoZSBAYXdzLXNkay9jbGllbnQtZ2x1ZVxuICAgIC8vIG1vZHVsZSBpcyBwcm92aWRlZCBieSB0aGUgTGFtYmRhIHJ1bnRpbWUgcmF0aGVyIHRoYW4gYnVuZGxlZCBpbnRvIHRoZSBhc3NldC5cbiAgICB0aGlzLm9uRXZlbnRIYW5kbGVyID0gbmV3IFBhcnRpdGlvbkluZGV4T25FdmVudEZ1bmN0aW9uKHRoaXMsICdIYW5kbGVyJywge1xuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxKSxcbiAgICB9KTtcbiAgICB0aGlzLmlzQ29tcGxldGVIYW5kbGVyID0gbmV3IFBhcnRpdGlvbkluZGV4SXNDb21wbGV0ZUZ1bmN0aW9uKHRoaXMsICdJc0NvbXBsZXRlJywge1xuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxKSxcbiAgICB9KTtcblxuICAgIHRoaXMucHJvdmlkZXIgPSBuZXcgY3IuUHJvdmlkZXIodGhpcywgJ1Byb3ZpZGVyJywge1xuICAgICAgb25FdmVudEhhbmRsZXI6IHRoaXMub25FdmVudEhhbmRsZXIsXG4gICAgICBpc0NvbXBsZXRlSGFuZGxlcjogdGhpcy5pc0NvbXBsZXRlSGFuZGxlcixcbiAgICAgIHF1ZXJ5SW50ZXJ2YWw6IER1cmF0aW9uLnNlY29uZHMoMTApLFxuICAgICAgdG90YWxUaW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDE1KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VydmljZSB0b2tlbiB0byB3aXJlIGludG8gcGFydGl0aW9uIGluZGV4IGN1c3RvbSByZXNvdXJjZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VUb2tlbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3ZpZGVyLnNlcnZpY2VUb2tlbjtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNjaGVtYShjb2x1bW5zOiBDb2x1bW5bXSwgcGFydGl0aW9uS2V5cz86IENvbHVtbltdKTogdm9pZCB7XG4gIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTm9Db2x1bW5zU3BlY2lmaWVkYCwgJ3lvdSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIGNvbHVtbiBmb3IgdGhlIHRhYmxlJyk7XG4gIH1cbiAgLy8gQ2hlY2sgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNvbHVtbiBhbmQgbm8gZHVwbGljYXRlZCBjb2x1bW4gbmFtZXMgb3IgcGFydGl0aW9uIGtleXMuXG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIChjb2x1bW5zLmNvbmNhdChwYXJ0aXRpb25LZXlzIHx8IFtdKSkuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgIGlmIChuYW1lcy5oYXMoY29sdW1uLm5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YER1cGxpY2F0ZUNvbHVtbk5hbWVgLCBgY29sdW1uIG5hbWVzIGFuZCBwYXJ0aXRpb24ga2V5cyBtdXN0IGJlIHVuaXF1ZSwgYnV0IFxcJyR7Y29sdW1uLm5hbWV9XFwnIGlzIGR1cGxpY2F0ZWRgKTtcbiAgICB9XG4gICAgbmFtZXMuYWRkKGNvbHVtbi5uYW1lKTtcbiAgfSk7XG59XG4iXX0=
|
|
@@ -1,21 +1,40 @@
|
|
|
1
1
|
import * as events from 'aws-cdk-lib/aws-events';
|
|
2
|
-
import type {
|
|
2
|
+
import type { CfnTrigger, ICrawlerRef, IJobRef } from 'aws-cdk-lib/aws-glue';
|
|
3
3
|
import type * as cdk from 'aws-cdk-lib/core';
|
|
4
|
-
import
|
|
5
|
-
import type {
|
|
4
|
+
import { ConditionLogicalOperator } from '../constants';
|
|
5
|
+
import type { JobState, CrawlerState, PredicateLogical } from '../constants';
|
|
6
6
|
import type { ISecurityConfiguration } from '../security-configuration';
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
8
|
+
* Options for the execution of a crawler.
|
|
9
9
|
*/
|
|
10
|
-
export interface
|
|
10
|
+
export interface CrawlerActionOptions {
|
|
11
11
|
/**
|
|
12
|
-
* The
|
|
12
|
+
* The arguments used when this trigger fires.
|
|
13
13
|
*
|
|
14
|
-
* @default - no
|
|
14
|
+
* @default - no arguments are passed to the job
|
|
15
|
+
*/
|
|
16
|
+
readonly arguments?: {
|
|
17
|
+
[key: string]: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* The run timeout. This is the maximum time that a run can consume resources before it is terminated and enters TIMEOUT status.
|
|
21
|
+
*
|
|
22
|
+
* @default - the default timeout value set in the job definition
|
|
15
23
|
*/
|
|
16
|
-
readonly
|
|
24
|
+
readonly timeout?: cdk.Duration;
|
|
17
25
|
/**
|
|
18
|
-
* The
|
|
26
|
+
* The `SecurityConfiguration` to be used with this action.
|
|
27
|
+
*
|
|
28
|
+
* @default - no security configuration is used
|
|
29
|
+
*/
|
|
30
|
+
readonly securityConfiguration?: ISecurityConfiguration;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Options for the execution of a job.
|
|
34
|
+
*/
|
|
35
|
+
export interface JobActionOptions {
|
|
36
|
+
/**
|
|
37
|
+
* The arguments used when this trigger fires.
|
|
19
38
|
*
|
|
20
39
|
* @default - no arguments are passed to the job
|
|
21
40
|
*/
|
|
@@ -23,7 +42,7 @@ export interface Action {
|
|
|
23
42
|
[key: string]: string;
|
|
24
43
|
};
|
|
25
44
|
/**
|
|
26
|
-
* The
|
|
45
|
+
* The run timeout. This is the maximum time that a run can consume resources before it is terminated and enters TIMEOUT status.
|
|
27
46
|
*
|
|
28
47
|
* @default - the default timeout value set in the job definition
|
|
29
48
|
*/
|
|
@@ -34,12 +53,35 @@ export interface Action {
|
|
|
34
53
|
* @default - no security configuration is used
|
|
35
54
|
*/
|
|
36
55
|
readonly securityConfiguration?: ISecurityConfiguration;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* An action initiated by a trigger.
|
|
59
|
+
*
|
|
60
|
+
* An action runs exactly one target: use {@link Action.job} to run a job or
|
|
61
|
+
* {@link Action.crawler} to run a crawler. Because these are separate factory
|
|
62
|
+
* methods, an action can never target both or neither.
|
|
63
|
+
*/
|
|
64
|
+
export declare abstract class Action {
|
|
37
65
|
/**
|
|
38
|
-
*
|
|
66
|
+
* Create an action that runs a job.
|
|
39
67
|
*
|
|
40
|
-
* @
|
|
68
|
+
* @param job the job to run when the trigger fires.
|
|
69
|
+
* @param options additional options for the action.
|
|
41
70
|
*/
|
|
42
|
-
|
|
71
|
+
static job(job: IJobRef, options?: JobActionOptions): Action;
|
|
72
|
+
/**
|
|
73
|
+
* Create an action that runs a crawler.
|
|
74
|
+
*
|
|
75
|
+
* @param crawler the crawler to run when the trigger fires.
|
|
76
|
+
* @param options additional options for the action.
|
|
77
|
+
*/
|
|
78
|
+
static crawler(crawler: ICrawlerRef, options?: CrawlerActionOptions): Action;
|
|
79
|
+
/**
|
|
80
|
+
* Render this action to its CloudFormation representation.
|
|
81
|
+
*
|
|
82
|
+
* @internal
|
|
83
|
+
*/
|
|
84
|
+
abstract _render(): CfnTrigger.ActionProperty;
|
|
43
85
|
}
|
|
44
86
|
/**
|
|
45
87
|
* Represents a trigger schedule.
|
|
@@ -60,6 +102,18 @@ export declare class TriggerSchedule {
|
|
|
60
102
|
* @returns A new TriggerSchedule instance.
|
|
61
103
|
*/
|
|
62
104
|
static expression(expression: string): TriggerSchedule;
|
|
105
|
+
/**
|
|
106
|
+
* Creates a schedule that fires once a day, at midnight UTC.
|
|
107
|
+
*
|
|
108
|
+
* @returns A new TriggerSchedule instance.
|
|
109
|
+
*/
|
|
110
|
+
static daily(): TriggerSchedule;
|
|
111
|
+
/**
|
|
112
|
+
* Creates a schedule that fires once a week, at midnight UTC on Sunday.
|
|
113
|
+
*
|
|
114
|
+
* @returns A new TriggerSchedule instance.
|
|
115
|
+
*/
|
|
116
|
+
static weekly(): TriggerSchedule;
|
|
63
117
|
/**
|
|
64
118
|
* @param expressionString The expression string for the schedule.
|
|
65
119
|
*/
|
|
@@ -83,39 +137,47 @@ export interface Predicate {
|
|
|
83
137
|
readonly conditions?: Condition[];
|
|
84
138
|
}
|
|
85
139
|
/**
|
|
86
|
-
*
|
|
140
|
+
* Options shared by all trigger conditions.
|
|
87
141
|
*/
|
|
88
|
-
export interface
|
|
142
|
+
export interface ConditionOptions {
|
|
89
143
|
/**
|
|
90
144
|
* The logical operator for the condition.
|
|
91
145
|
*
|
|
92
146
|
* @default ConditionLogicalOperator.EQUALS
|
|
93
147
|
*/
|
|
94
148
|
readonly logicalOperator?: ConditionLogicalOperator;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* A condition that determines when a conditional trigger fires.
|
|
152
|
+
*
|
|
153
|
+
* A condition watches exactly one target in exactly one state: use
|
|
154
|
+
* {@link Condition.job} to watch a job or {@link Condition.crawler} to watch a
|
|
155
|
+
* crawler. Because the state is a required argument of each factory, a condition
|
|
156
|
+
* can never reference a target without its state, or both a job and a crawler.
|
|
157
|
+
*/
|
|
158
|
+
export declare abstract class Condition {
|
|
95
159
|
/**
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
* @default - no job is specified
|
|
99
|
-
*/
|
|
100
|
-
readonly job?: IJob;
|
|
101
|
-
/**
|
|
102
|
-
* The condition job state.
|
|
160
|
+
* Create a condition on the state of a job.
|
|
103
161
|
*
|
|
104
|
-
* @
|
|
162
|
+
* @param job the job to watch.
|
|
163
|
+
* @param state the job state that satisfies the condition.
|
|
164
|
+
* @param options additional options for the condition.
|
|
105
165
|
*/
|
|
106
|
-
|
|
166
|
+
static job(job: IJobRef, state: JobState, options?: ConditionOptions): Condition;
|
|
107
167
|
/**
|
|
108
|
-
*
|
|
168
|
+
* Create a condition on the state of a crawler.
|
|
109
169
|
*
|
|
110
|
-
* @
|
|
170
|
+
* @param crawler the crawler to watch.
|
|
171
|
+
* @param crawlState the crawler state that satisfies the condition.
|
|
172
|
+
* @param options additional options for the condition.
|
|
111
173
|
*/
|
|
112
|
-
|
|
174
|
+
static crawler(crawler: ICrawlerRef, crawlState: CrawlerState, options?: ConditionOptions): Condition;
|
|
113
175
|
/**
|
|
114
|
-
*
|
|
176
|
+
* Render this condition to its CloudFormation representation.
|
|
115
177
|
*
|
|
116
|
-
* @
|
|
178
|
+
* @internal
|
|
117
179
|
*/
|
|
118
|
-
|
|
180
|
+
abstract _render(): CfnTrigger.ConditionProperty;
|
|
119
181
|
}
|
|
120
182
|
/**
|
|
121
183
|
* Represents event trigger batch condition.
|
|
@@ -159,9 +221,9 @@ export interface TriggerOptions {
|
|
|
159
221
|
export interface OnDemandTriggerOptions extends TriggerOptions {
|
|
160
222
|
}
|
|
161
223
|
/**
|
|
162
|
-
*
|
|
224
|
+
* Base options for triggers that can be started when they are created.
|
|
163
225
|
*/
|
|
164
|
-
export interface
|
|
226
|
+
export interface StartableTriggerOptions extends TriggerOptions {
|
|
165
227
|
/**
|
|
166
228
|
* Whether to start the trigger on creation or not.
|
|
167
229
|
*
|
|
@@ -170,23 +232,21 @@ export interface DailyScheduleTriggerOptions extends TriggerOptions {
|
|
|
170
232
|
readonly startOnCreation?: boolean;
|
|
171
233
|
}
|
|
172
234
|
/**
|
|
173
|
-
* Properties for configuring a
|
|
235
|
+
* Properties for configuring a scheduled Glue Trigger.
|
|
174
236
|
*/
|
|
175
|
-
export interface
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Properties for configuring a custom-scheduled Glue Trigger.
|
|
179
|
-
*/
|
|
180
|
-
export interface CustomScheduledTriggerOptions extends WeeklyScheduleTriggerOptions {
|
|
237
|
+
export interface ScheduledTriggerOptions extends StartableTriggerOptions {
|
|
181
238
|
/**
|
|
182
|
-
* The
|
|
239
|
+
* The schedule on which this trigger fires.
|
|
240
|
+
*
|
|
241
|
+
* Build one with {@link TriggerSchedule.daily}, {@link TriggerSchedule.weekly},
|
|
242
|
+
* {@link TriggerSchedule.cron}, or {@link TriggerSchedule.expression}.
|
|
183
243
|
*/
|
|
184
244
|
readonly schedule: TriggerSchedule;
|
|
185
245
|
}
|
|
186
246
|
/**
|
|
187
247
|
* Properties for configuring an Event Bridge based Glue Trigger.
|
|
188
248
|
*/
|
|
189
|
-
export interface
|
|
249
|
+
export interface EventTriggerOptions extends TriggerOptions {
|
|
190
250
|
/**
|
|
191
251
|
* Batch condition for the trigger.
|
|
192
252
|
*
|
|
@@ -197,7 +257,7 @@ export interface NotifyEventTriggerOptions extends TriggerOptions {
|
|
|
197
257
|
/**
|
|
198
258
|
* Properties for configuring a Condition (Predicate) based Glue Trigger.
|
|
199
259
|
*/
|
|
200
|
-
export interface ConditionalTriggerOptions extends
|
|
260
|
+
export interface ConditionalTriggerOptions extends StartableTriggerOptions {
|
|
201
261
|
/**
|
|
202
262
|
* The predicate for the trigger.
|
|
203
263
|
*/
|