@aws-cdk/aws-glue-alpha 2.176.0-alpha.0 → 2.178.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 (54) hide show
  1. package/.jsii +6187 -3907
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +525 -235
  4. package/README.md +422 -159
  5. package/awslint.json +5 -5
  6. package/lib/code.js +4 -5
  7. package/lib/connection.js +15 -3
  8. package/lib/constants.d.ts +261 -0
  9. package/lib/constants.js +281 -0
  10. package/lib/data-format.js +5 -5
  11. package/lib/data-quality-ruleset.js +6 -3
  12. package/lib/database.js +5 -2
  13. package/lib/external-table.js +20 -2
  14. package/lib/index.d.ts +13 -2
  15. package/lib/index.js +14 -3
  16. package/lib/jobs/job.d.ts +393 -0
  17. package/lib/jobs/job.js +298 -0
  18. package/lib/jobs/pyspark-etl-job.d.ts +81 -0
  19. package/lib/jobs/pyspark-etl-job.js +130 -0
  20. package/lib/jobs/pyspark-flex-etl-job.d.ts +83 -0
  21. package/lib/jobs/pyspark-flex-etl-job.js +137 -0
  22. package/lib/jobs/pyspark-streaming-job.d.ts +81 -0
  23. package/lib/jobs/pyspark-streaming-job.js +130 -0
  24. package/lib/jobs/python-shell-job.d.ts +55 -0
  25. package/lib/jobs/python-shell-job.js +99 -0
  26. package/lib/jobs/ray-job.d.ts +44 -0
  27. package/lib/jobs/ray-job.js +89 -0
  28. package/lib/jobs/scala-spark-etl-job.d.ts +78 -0
  29. package/lib/jobs/scala-spark-etl-job.js +134 -0
  30. package/lib/jobs/scala-spark-flex-etl-job.d.ts +109 -0
  31. package/lib/jobs/scala-spark-flex-etl-job.js +143 -0
  32. package/lib/jobs/scala-spark-streaming-job.d.ts +77 -0
  33. package/lib/jobs/scala-spark-streaming-job.js +131 -0
  34. package/lib/jobs/spark-ui-utils.d.ts +53 -0
  35. package/lib/jobs/spark-ui-utils.js +26 -0
  36. package/lib/s3-table.d.ts +4 -4
  37. package/lib/s3-table.js +20 -2
  38. package/lib/schema.d.ts +1 -1
  39. package/lib/schema.js +2 -2
  40. package/lib/security-configuration.js +5 -2
  41. package/lib/storage-parameter.js +1 -1
  42. package/lib/table-base.d.ts +1 -1
  43. package/lib/table-base.js +2 -2
  44. package/lib/table-deprecated.js +1 -1
  45. package/lib/triggers/trigger-options.d.ts +205 -0
  46. package/lib/triggers/trigger-options.js +39 -0
  47. package/lib/triggers/workflow.d.ts +203 -0
  48. package/lib/triggers/workflow.js +371 -0
  49. package/package.json +8 -8
  50. package/rosetta/default.ts-fixture +1 -1
  51. package/lib/job-executable.d.ts +0 -384
  52. package/lib/job-executable.js +0 -348
  53. package/lib/job.d.ts +0 -574
  54. package/lib/job.js +0 -531
@@ -0,0 +1,371 @@
1
+ "use strict";
2
+ var _a, _b;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Workflow = exports.WorkflowBase = void 0;
5
+ const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
6
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
7
+ const cdk = require("aws-cdk-lib/core");
8
+ const aws_glue_1 = require("aws-cdk-lib/aws-glue");
9
+ const constants_1 = require("../constants");
10
+ const trigger_options_1 = require("./trigger-options");
11
+ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
12
+ /**
13
+ * Base abstract class for Workflow
14
+ *
15
+ * @see https://docs.aws.amazon.com/glue/latest/dg/about-triggers.html
16
+ */
17
+ class WorkflowBase extends cdk.Resource {
18
+ /**
19
+ * Extract workflowName from arn
20
+ */
21
+ static extractNameFromArn(scope, workflowArn) {
22
+ return cdk.Stack.of(scope).splitArn(workflowArn, cdk.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
23
+ }
24
+ /**
25
+ * Add an on-demand trigger to the workflow.
26
+ *
27
+ * @param id The id of the trigger.
28
+ * @param options Additional options for the trigger.
29
+ * @throws If both job and crawler are provided, or if neither job nor crawler is provided.
30
+ * @returns The created CfnTrigger resource.
31
+ */
32
+ addOnDemandTrigger(id, options) {
33
+ try {
34
+ jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_OnDemandTriggerOptions(options);
35
+ }
36
+ catch (error) {
37
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
38
+ Error.captureStackTrace(error, this.addOnDemandTrigger);
39
+ }
40
+ throw error;
41
+ }
42
+ const trigger = new aws_glue_1.CfnTrigger(this, id, {
43
+ ...options,
44
+ workflowName: this.workflowName,
45
+ type: 'ON_DEMAND',
46
+ actions: options.actions?.map(this.renderAction),
47
+ description: options.description || undefined,
48
+ });
49
+ return trigger;
50
+ }
51
+ /**
52
+ * Add a daily-scheduled trigger to the workflow.
53
+ *
54
+ * @param id The id of the trigger.
55
+ * @param options Additional options for the trigger.
56
+ * @throws If both job and crawler are provided, or if neither job nor crawler is provided.
57
+ * @returns The created CfnTrigger resource.
58
+ */
59
+ addDailyScheduledTrigger(id, options) {
60
+ try {
61
+ jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_DailyScheduleTriggerOptions(options);
62
+ }
63
+ catch (error) {
64
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
65
+ Error.captureStackTrace(error, this.addDailyScheduledTrigger);
66
+ }
67
+ throw error;
68
+ }
69
+ const dailySchedule = trigger_options_1.TriggerSchedule.cron({
70
+ minute: '0',
71
+ hour: '0',
72
+ });
73
+ const trigger = new aws_glue_1.CfnTrigger(this, id, {
74
+ ...options,
75
+ workflowName: this.workflowName,
76
+ type: 'SCHEDULED',
77
+ actions: options.actions?.map(this.renderAction),
78
+ schedule: dailySchedule.expressionString,
79
+ startOnCreation: options.startOnCreation ?? false,
80
+ });
81
+ return trigger;
82
+ }
83
+ /**
84
+ * Add a weekly-scheduled trigger to the workflow.
85
+ *
86
+ * @param id The id of the trigger.
87
+ * @param options Additional options for the trigger.
88
+ * @throws If both job and crawler are provided, or if neither job nor crawler is provided.
89
+ * @returns The created CfnTrigger resource.
90
+ */
91
+ addWeeklyScheduledTrigger(id, options) {
92
+ try {
93
+ jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_WeeklyScheduleTriggerOptions(options);
94
+ }
95
+ catch (error) {
96
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
97
+ Error.captureStackTrace(error, this.addWeeklyScheduledTrigger);
98
+ }
99
+ throw error;
100
+ }
101
+ const weeklySchedule = trigger_options_1.TriggerSchedule.cron({
102
+ minute: '0',
103
+ hour: '0',
104
+ weekDay: 'SUN',
105
+ });
106
+ const trigger = new aws_glue_1.CfnTrigger(this, id, {
107
+ ...options,
108
+ workflowName: this.workflowName,
109
+ type: 'SCHEDULED',
110
+ actions: options.actions?.map(this.renderAction),
111
+ schedule: weeklySchedule.expressionString,
112
+ startOnCreation: options.startOnCreation ?? false,
113
+ });
114
+ return trigger;
115
+ }
116
+ /**
117
+ * Add a custom-scheduled trigger to the workflow.
118
+ *
119
+ * @param id The id of the trigger.
120
+ * @param options Additional options for the trigger.
121
+ * @throws If both job and crawler are provided, or if neither job nor crawler is provided.
122
+ * @returns The created CfnTrigger resource.
123
+ */
124
+ addCustomScheduledTrigger(id, options) {
125
+ try {
126
+ jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_CustomScheduledTriggerOptions(options);
127
+ }
128
+ catch (error) {
129
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
130
+ Error.captureStackTrace(error, this.addCustomScheduledTrigger);
131
+ }
132
+ throw error;
133
+ }
134
+ const trigger = new aws_glue_1.CfnTrigger(this, id, {
135
+ ...options,
136
+ workflowName: this.workflowName,
137
+ type: 'SCHEDULED',
138
+ actions: options.actions?.map(this.renderAction),
139
+ schedule: options.schedule.expressionString,
140
+ startOnCreation: options.startOnCreation ?? false,
141
+ });
142
+ return trigger;
143
+ }
144
+ /**
145
+ * Add an Event Bridge based trigger to the workflow.
146
+ *
147
+ * @param id The id of the trigger.
148
+ * @param options Additional options for the trigger.
149
+ * @throws If both job and crawler are provided, or if neither job nor crawler is provided.
150
+ * @returns The created CfnTrigger resource.
151
+ */
152
+ addNotifyEventTrigger(id, options) {
153
+ try {
154
+ jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_NotifyEventTriggerOptions(options);
155
+ }
156
+ catch (error) {
157
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
158
+ Error.captureStackTrace(error, this.addNotifyEventTrigger);
159
+ }
160
+ throw error;
161
+ }
162
+ const trigger = new aws_glue_1.CfnTrigger(this, id, {
163
+ ...options,
164
+ workflowName: this.workflowName,
165
+ type: 'EVENT',
166
+ actions: options.actions?.map(this.renderAction),
167
+ eventBatchingCondition: this.renderEventBatchingCondition(options),
168
+ description: options.description ?? undefined,
169
+ });
170
+ return trigger;
171
+ }
172
+ /**
173
+ * Add a Condition (Predicate) based trigger to the workflow.
174
+ *
175
+ * @param id The id of the trigger.
176
+ * @param options Additional options for the trigger.
177
+ * @throws If both job and crawler are provided, or if neither job nor crawler is provided for any condition.
178
+ * @throws If a job is provided without a job state, or if a crawler is provided without a crawler state for any condition.
179
+ * @returns The created CfnTrigger resource.
180
+ */
181
+ addconditionalTrigger(id, options) {
182
+ try {
183
+ jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_ConditionalTriggerOptions(options);
184
+ }
185
+ catch (error) {
186
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
187
+ Error.captureStackTrace(error, this.addconditionalTrigger);
188
+ }
189
+ throw error;
190
+ }
191
+ const trigger = new aws_glue_1.CfnTrigger(this, id, {
192
+ ...options,
193
+ workflowName: this.workflowName,
194
+ type: 'CONDITIONAL',
195
+ actions: options.actions?.map(this.renderAction),
196
+ predicate: this.renderPredicate(options),
197
+ eventBatchingCondition: this.renderEventBatchingCondition(options),
198
+ description: options.description ?? undefined,
199
+ });
200
+ return trigger;
201
+ }
202
+ renderAction(action) {
203
+ // Validate that either job or crawler is provided, but not both
204
+ if (!action.job && !action.crawler) {
205
+ throw new Error('You must provide either a job or a crawler for the action.');
206
+ }
207
+ else if (action.job && action.crawler) {
208
+ throw new Error('You cannot provide both a job and a crawler for the action.');
209
+ }
210
+ return {
211
+ jobName: action.job?.jobName,
212
+ arguments: action.arguments,
213
+ timeout: action.timeout?.toMinutes(),
214
+ securityConfiguration: action.securityConfiguration?.securityConfigurationName,
215
+ crawlerName: action.crawler?.name,
216
+ };
217
+ }
218
+ renderPredicate(props) {
219
+ const conditions = props.predicate.conditions?.map(condition => {
220
+ // Validate that either job or crawler is provided, but not both
221
+ if (!condition.job && !condition.crawlerName) {
222
+ throw new Error('You must provide either a job or a crawler for the condition.');
223
+ }
224
+ else if (condition.job && condition.crawlerName) {
225
+ throw new Error('You cannot provide both a job and a crawler for the condition.');
226
+ }
227
+ // Validate that if job is provided, job state is also provided
228
+ if (condition.job && !condition.state) {
229
+ throw new Error('If you provide a job for the condition, you must also provide a job state.');
230
+ }
231
+ // Validate that if crawler is provided, crawler state is also provided
232
+ if (condition.crawlerName && !condition.crawlState) {
233
+ throw new Error('If you provide a crawler for the condition, you must also provide a crawler state.');
234
+ }
235
+ return {
236
+ logicalOperator: condition.logicalOperator ?? constants_1.ConditionLogicalOperator.EQUALS,
237
+ jobName: condition.job?.jobName ?? undefined,
238
+ state: condition.state ?? undefined,
239
+ crawlerName: condition.crawlerName ?? undefined,
240
+ crawlState: condition.crawlState ?? undefined,
241
+ };
242
+ });
243
+ return {
244
+ logical: props.predicate.conditions?.length === 1 ? undefined : props.predicate.logical ?? constants_1.PredicateLogical.AND,
245
+ conditions: conditions,
246
+ };
247
+ }
248
+ renderEventBatchingCondition(props) {
249
+ const defaultBatchSize = 1;
250
+ const defaultBatchWindow = cdk.Duration.seconds(900).toSeconds();
251
+ if (!props.eventBatchingCondition) {
252
+ return {
253
+ batchSize: defaultBatchSize,
254
+ batchWindow: defaultBatchWindow,
255
+ };
256
+ }
257
+ return {
258
+ batchSize: props.eventBatchingCondition.batchSize || defaultBatchSize,
259
+ batchWindow: props.eventBatchingCondition.batchWindow?.toSeconds() || defaultBatchWindow,
260
+ };
261
+ }
262
+ buildWorkflowArn(scope, workflowName) {
263
+ return cdk.Stack.of(scope).formatArn({
264
+ service: 'glue',
265
+ resource: 'workflow',
266
+ resourceName: workflowName,
267
+ });
268
+ }
269
+ }
270
+ exports.WorkflowBase = WorkflowBase;
271
+ _a = JSII_RTTI_SYMBOL_1;
272
+ WorkflowBase[_a] = { fqn: "@aws-cdk/aws-glue-alpha.WorkflowBase", version: "2.178.0-alpha.0" };
273
+ /**
274
+ * This module defines a construct for creating and managing AWS Glue Workflows and Triggers.
275
+ *
276
+ * AWS Glue Workflows are orchestration services that allow you to create, manage, and monitor complex extract, transform, and load (ETL) activities involving multiple crawlers, jobs, and triggers. Workflows are designed to allow you to manage interdependent jobs and crawlers as a single unit, making it easier to orchestrate and monitor complex ETL pipelines.
277
+ *
278
+ * Triggers are used to initiate an AWS Glue Workflow. You can configure different types of triggers, such as on-demand, scheduled, event-based, or conditional triggers, to start your Workflow based on specific conditions or events.
279
+ *
280
+ * @see https://docs.aws.amazon.com/glue/latest/dg/workflows_overview.html
281
+ * @see https://docs.aws.amazon.com/glue/latest/dg/about-triggers.html
282
+ *
283
+ * ## Usage Example
284
+ *
285
+ * ```ts
286
+ * const app = new App();
287
+ * const stack = new Stack(app, 'TestStack');
288
+ *
289
+ * // Create a Glue Job
290
+ * declare const role: iam.IRole;
291
+ * declare const script: glue.Code;
292
+ * const job = new glue.PySparkStreamingJob(stack, 'ImportedJob', { role, script });
293
+ *
294
+ * // Create a Glue Workflow
295
+ * const workflow = new glue.Workflow(stack, 'TestWorkflow');
296
+ *
297
+ * // Add an on-demand trigger to the Workflow
298
+ * workflow.addOnDemandTrigger('OnDemandTrigger', {
299
+ * actions: [{ job: job }],
300
+ * });
301
+ * ```
302
+ */
303
+ class Workflow extends WorkflowBase {
304
+ /**
305
+ * Import a workflow from its name
306
+ */
307
+ static fromWorkflowName(scope, id, workflowName) {
308
+ return this.fromWorkflowAttributes(scope, id, {
309
+ workflowName,
310
+ });
311
+ }
312
+ /**
313
+ * Import an workflow from it's name
314
+ */
315
+ static fromWorkflowArn(scope, id, workflowArn) {
316
+ return this.fromWorkflowAttributes(scope, id, {
317
+ workflowName: this.extractNameFromArn(scope, workflowArn),
318
+ workflowArn,
319
+ });
320
+ }
321
+ /**
322
+ * Import an existing workflow
323
+ */
324
+ static fromWorkflowAttributes(scope, id, attrs) {
325
+ try {
326
+ jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_WorkflowAttributes(attrs);
327
+ }
328
+ catch (error) {
329
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
330
+ Error.captureStackTrace(error, this.fromWorkflowAttributes);
331
+ }
332
+ throw error;
333
+ }
334
+ class Import extends WorkflowBase {
335
+ constructor() {
336
+ super(...arguments);
337
+ this.workflowName = attrs.workflowName;
338
+ this.workflowArn = this.buildWorkflowArn(scope, this.workflowName);
339
+ }
340
+ }
341
+ return new Import(scope, id);
342
+ }
343
+ constructor(scope, id, props) {
344
+ super(scope, id, {
345
+ physicalName: props?.workflowName,
346
+ });
347
+ try {
348
+ jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_WorkflowProps(props);
349
+ }
350
+ catch (error) {
351
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
352
+ Error.captureStackTrace(error, Workflow);
353
+ }
354
+ throw error;
355
+ }
356
+ // Enhanced CDK Analytics Telemetry
357
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
358
+ const resource = new aws_glue_1.CfnWorkflow(this, 'Resource', {
359
+ name: this.physicalName,
360
+ description: props?.description,
361
+ defaultRunProperties: props?.defaultRunProperties,
362
+ maxConcurrentRuns: props?.maxConcurrentRuns,
363
+ });
364
+ this.workflowName = this.getResourceNameAttribute(resource.ref);
365
+ this.workflowArn = this.buildWorkflowArn(this, this.workflowName);
366
+ }
367
+ }
368
+ exports.Workflow = Workflow;
369
+ _b = JSII_RTTI_SYMBOL_1;
370
+ Workflow[_b] = { fqn: "@aws-cdk/aws-glue-alpha.Workflow", version: "2.178.0-alpha.0" };
371
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3b3JrZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx3Q0FBd0M7QUFFeEMsbURBQStEO0FBQy9ELDRDQUdzQjtBQUN0Qix1REFTMkI7QUFDM0IsOEVBQThFO0FBMkY5RTs7OztHQUlHO0FBQ0gsTUFBc0IsWUFBYSxTQUFRLEdBQUcsQ0FBQyxRQUFRO0lBQ3JEOztPQUVHO0lBQ08sTUFBTSxDQUFDLGtCQUFrQixDQUFDLEtBQTJCLEVBQUUsV0FBbUI7UUFDbEYsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQ2pDLFdBQVcsRUFDWCxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsWUFBYSxDQUFDO0tBQ3BEO0lBS0Q7Ozs7Ozs7T0FPRztJQUNJLGtCQUFrQixDQUFDLEVBQVUsRUFBRSxPQUErQjs7Ozs7Ozs7OztRQUNuRSxNQUFNLE9BQU8sR0FBRyxJQUFJLHFCQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUN2QyxHQUFHLE9BQU87WUFDVixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDL0IsSUFBSSxFQUFFLFdBQVc7WUFDakIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDaEQsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXLElBQUksU0FBUztTQUM5QyxDQUFDLENBQUM7UUFFSCxPQUFPLE9BQU8sQ0FBQztLQUNoQjtJQUVEOzs7Ozs7O09BT0c7SUFDSSx3QkFBd0IsQ0FBQyxFQUFVLEVBQUUsT0FBb0M7Ozs7Ozs7Ozs7UUFDOUUsTUFBTSxhQUFhLEdBQUcsaUNBQWUsQ0FBQyxJQUFJLENBQUM7WUFDekMsTUFBTSxFQUFFLEdBQUc7WUFDWCxJQUFJLEVBQUUsR0FBRztTQUNWLENBQUMsQ0FBQztRQUVILE1B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OztBQW5ESCw0QkFvREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQ2ZuV29ya2Zsb3csIENmblRyaWdnZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZ2x1ZSc7XG5pbXBvcnQge1xuICBDb25kaXRpb25Mb2dpY2FsT3BlcmF0b3IsXG4gIFByZWRpY2F0ZUxvZ2ljYWwsXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBBY3Rpb24sXG4gIFRyaWdnZXJTY2hlZHVsZSxcbiAgT25EZW1hbmRUcmlnZ2VyT3B0aW9ucyxcbiAgV2Vla2x5U2NoZWR1bGVUcmlnZ2VyT3B0aW9ucyxcbiAgRGFpbHlTY2hlZHVsZVRyaWdnZXJPcHRpb25zLFxuICBDdXN0b21TY2hlZHVsZWRUcmlnZ2VyT3B0aW9ucyxcbiAgTm90aWZ5RXZlbnRUcmlnZ2VyT3B0aW9ucyxcbiAgQ29uZGl0aW9uYWxUcmlnZ2VyT3B0aW9ucyxcbn0gZnJvbSAnLi90cmlnZ2VyLW9wdGlvbnMnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW50ZXJmYWNlIGZvciBHbHVlIFdvcmtmbG93XG4gKlxuICogQHNlZSB7QGxpbmsgV29ya2Zsb3d9XG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy93b3JrZmxvd3Nfb3ZlcnZpZXcuaHRtbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElXb3JrZmxvdyBleHRlbmRzIGNkay5JUmVzb3VyY2Uge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHdvcmtmbG93XG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSB3b3JrZmxvd1xuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd0Fybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGQgYW4gb24tZGVtYW5kIHRyaWdnZXIgdG8gdGhlIHdvcmtmbG93XG4gICAqL1xuICBhZGRPbkRlbWFuZFRyaWdnZXIoaWQ6IHN0cmluZywgb3B0aW9uczogT25EZW1hbmRUcmlnZ2VyT3B0aW9ucyk6IENmblRyaWdnZXI7XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBkYWlseS1zY2hlZHVsZWQgdHJpZ2dlciB0byB0aGUgd29ya2Zsb3dcbiAgICovXG4gIGFkZERhaWx5U2NoZWR1bGVkVHJpZ2dlcihpZDogc3RyaW5nLCBvcHRpb25zOiBEYWlseVNjaGVkdWxlVHJpZ2dlck9wdGlvbnMpOiBDZm5UcmlnZ2VyO1xuXG4gIC8qKlxuICAgKiBBZGQgYW4gd2Vla2x5LXNjaGVkdWxlZCB0cmlnZ2VyIHRvIHRoZSB3b3JrZmxvd1xuICAgKi9cbiAgYWRkV2Vla2x5U2NoZWR1bGVkVHJpZ2dlcihpZDogc3RyaW5nLCBvcHRpb25zOiBXZWVrbHlTY2hlZHVsZVRyaWdnZXJPcHRpb25zKTogQ2ZuVHJpZ2dlcjtcblxuICAvKipcbiAgICogQWRkIGFuIGN1c3RvbS1zY2hlZHVsZWQgdHJpZ2dlciB0byB0aGUgd29ya2Zsb3dcbiAgICovXG4gIGFkZEN1c3RvbVNjaGVkdWxlZFRyaWdnZXIoaWQ6IHN0cmluZywgb3B0aW9uczogQ3VzdG9tU2NoZWR1bGVkVHJpZ2dlck9wdGlvbnMpOiBDZm5UcmlnZ2VyO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGltcG9ydGluZyBhIFdvcmtmbG93IHVzaW5nIGl0cyBhdHRyaWJ1dGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB3b3JrZmxvdyB0byBpbXBvcnRcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93TmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgd29ya2Zsb3cgdG8gaW1wb3J0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVyaXZlZCBmcm9tIHRoZSB3b3JrZmxvdyBuYW1lXG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd0Fybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBkZWZpbmluZyBhIFdvcmtmbG93XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dQcm9wcyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSB3b3JrZmxvd1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgbmFtZSB3aWxsIGJlIGdlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSB3b3JrZmxvd1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQSBtYXAgb2YgcHJvcGVydGllcyB0byB1c2Ugd2hlbiB0aGlzIHdvcmtmbG93IGlzIGV4ZWN1dGVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZGVmYXVsdCBydW4gcHJvcGVydGllc1xuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdFJ1blByb3BlcnRpZXM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCBydW5zIGFsbG93ZWQgZm9yIHRoZSB3b3JrZmxvd1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGxpbWl0XG4gICAqL1xuICByZWFkb25seSBtYXhDb25jdXJyZW50UnVucz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBCYXNlIGFic3RyYWN0IGNsYXNzIGZvciBXb3JrZmxvd1xuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2Fib3V0LXRyaWdnZXJzLmh0bWxcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFdvcmtmbG93QmFzZSBleHRlbmRzIGNkay5SZXNvdXJjZSBpbXBsZW1lbnRzIElXb3JrZmxvdyB7XG4gIC8qKlxuICAgKiBFeHRyYWN0IHdvcmtmbG93TmFtZSBmcm9tIGFyblxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBleHRyYWN0TmFtZUZyb21Bcm4oc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LCB3b3JrZmxvd0Fybjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY2RrLlN0YWNrLm9mKHNjb3BlKS5zcGxpdEFybihcbiAgICAgIHdvcmtmbG93QXJuLFxuICAgICAgY2RrLkFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKS5yZXNvdXJjZU5hbWUhO1xuICB9XG5cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHdvcmtmbG93TmFtZTogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgd29ya2Zsb3dBcm46IHN0cmluZztcblxuICAvKipcbiAgICogQWRkIGFuIG9uLWRlbWFuZCB0cmlnZ2VyIHRvIHRoZSB3b3JrZmxvdy5cbiAgICpcbiAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgdHJpZ2dlci5cbiAgICogQHBhcmFtIG9wdGlvbnMgQWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgdHJpZ2dlci5cbiAgICogQHRocm93cyBJZiBib3RoIGpvYiBhbmQgY3Jhd2xlciBhcmUgcHJvdmlkZWQsIG9yIGlmIG5laXRoZXIgam9iIG5vciBjcmF3bGVyIGlzIHByb3ZpZGVkLlxuICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBDZm5UcmlnZ2VyIHJlc291cmNlLlxuICAgKi9cbiAgcHVibGljIGFkZE9uRGVtYW5kVHJpZ2dlcihpZDogc3RyaW5nLCBvcHRpb25zOiBPbkRlbWFuZFRyaWdnZXJPcHRpb25zKTogQ2ZuVHJpZ2dlciB7XG4gICAgY29uc3QgdHJpZ2dlciA9IG5ldyBDZm5UcmlnZ2VyKHRoaXMsIGlkLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgd29ya2Zsb3dOYW1lOiB0aGlzLndvcmtmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdPTl9ERU1BTkQnLFxuICAgICAgYWN0aW9uczogb3B0aW9ucy5hY3Rpb25zPy5tYXAodGhpcy5yZW5kZXJBY3Rpb24pLFxuICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24gfHwgdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRyaWdnZXI7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgZGFpbHktc2NoZWR1bGVkIHRyaWdnZXIgdG8gdGhlIHdvcmtmbG93LlxuICAgKlxuICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSB0cmlnZ2VyLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSB0cmlnZ2VyLlxuICAgKiBAdGhyb3dzIElmIGJvdGggam9iIGFuZCBjcmF3bGVyIGFyZSBwcm92aWRlZCwgb3IgaWYgbmVpdGhlciBqb2Igbm9yIGNyYXdsZXIgaXMgcHJvdmlkZWQuXG4gICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIENmblRyaWdnZXIgcmVzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgYWRkRGFpbHlTY2hlZHVsZWRUcmlnZ2VyKGlkOiBzdHJpbmcsIG9wdGlvbnM6IERhaWx5U2NoZWR1bGVUcmlnZ2VyT3B0aW9ucyk6IENmblRyaWdnZXIge1xuICAgIGNvbnN0IGRhaWx5U2NoZWR1bGUgPSBUcmlnZ2VyU2NoZWR1bGUuY3Jvbih7XG4gICAgICBtaW51dGU6ICcwJyxcbiAgICAgIGhvdXI6ICcwJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRyaWdnZXIgPSBuZXcgQ2ZuVHJpZ2dlcih0aGlzLCBpZCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHdvcmtmbG93TmFtZTogdGhpcy53b3JrZmxvd05hbWUsXG4gICAgICB0eXBlOiAnU0NIRURVTEVEJyxcbiAgICAgIGFjdGlvbnM6IG9wdGlvbnMuYWN0aW9ucz8ubWFwKHRoaXMucmVuZGVyQWN0aW9uKSxcbiAgICAgIHNjaGVkdWxlOiBkYWlseVNjaGVkdWxlLmV4cHJlc3Npb25TdHJpbmcsXG4gICAgICBzdGFydE9uQ3JlYXRpb246IG9wdGlvbnMuc3RhcnRPbkNyZWF0aW9uID8/IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRyaWdnZXI7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgd2Vla2x5LXNjaGVkdWxlZCB0cmlnZ2VyIHRvIHRoZSB3b3JrZmxvdy5cbiAgICpcbiAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgdHJpZ2dlci5cbiAgICogQHBhcmFtIG9wdGlvbnMgQWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgdHJpZ2dlci5cbiAgICogQHRocm93cyBJZiBib3RoIGpvYiBhbmQgY3Jhd2xlciBhcmUgcHJvdmlkZWQsIG9yIGlmIG5laXRoZXIgam9iIG5vciBjcmF3bGVyIGlzIHByb3ZpZGVkLlxuICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBDZm5UcmlnZ2VyIHJlc291cmNlLlxuICAgKi9cbiAgcHVibGljIGFkZFdlZWtseVNjaGVkdWxlZFRyaWdnZXIoaWQ6IHN0cmluZywgb3B0aW9uczogV2Vla2x5U2NoZWR1bGVUcmlnZ2VyT3B0aW9ucyk6IENmblRyaWdnZXIge1xuICAgIGNvbnN0IHdlZWtseVNjaGVkdWxlID0gVHJpZ2dlclNjaGVkdWxlLmNyb24oe1xuICAgICAgbWludXRlOiAnMCcsXG4gICAgICBob3VyOiAnMCcsXG4gICAgICB3ZWVrRGF5OiAnU1VOJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRyaWdnZXIgPSBuZXcgQ2ZuVHJpZ2dlcih0aGlzLCBpZCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHdvcmtmbG93TmFtZTogdGhpcy53b3JrZmxvd05hbWUsXG4gICAgICB0eXBlOiAnU0NIRURVTEVEJyxcbiAgICAgIGFjdGlvbnM6IG9wdGlvbnMuYWN0aW9ucz8ubWFwKHRoaXMucmVuZGVyQWN0aW9uKSxcbiAgICAgIHNjaGVkdWxlOiB3ZWVrbHlTY2hlZHVsZS5leHByZXNzaW9uU3RyaW5nLFxuICAgICAgc3RhcnRPbkNyZWF0aW9uOiBvcHRpb25zLnN0YXJ0T25DcmVhdGlvbiA/PyBmYWxzZSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0cmlnZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGN1c3RvbS1zY2hlZHVsZWQgdHJpZ2dlciB0byB0aGUgd29ya2Zsb3cuXG4gICAqXG4gICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIHRyaWdnZXIuXG4gICAqIEBwYXJhbSBvcHRpb25zIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGhlIHRyaWdnZXIuXG4gICAqIEB0aHJvd3MgSWYgYm90aCBqb2IgYW5kIGNyYXdsZXIgYXJlIHByb3ZpZGVkLCBvciBpZiBuZWl0aGVyIGpvYiBub3IgY3Jhd2xlciBpcyBwcm92aWRlZC5cbiAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgQ2ZuVHJpZ2dlciByZXNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyBhZGRDdXN0b21TY2hlZHVsZWRUcmlnZ2VyKGlkOiBzdHJpbmcsIG9wdGlvbnM6IEN1c3RvbVNjaGVkdWxlZFRyaWdnZXJPcHRpb25zKTogQ2ZuVHJpZ2dlciB7XG4gICAgY29uc3QgdHJpZ2dlciA9IG5ldyBDZm5UcmlnZ2VyKHRoaXMsIGlkLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgd29ya2Zsb3dOYW1lOiB0aGlzLndvcmtmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdTQ0hFRFVMRUQnLFxuICAgICAgYWN0aW9uczogb3B0aW9ucy5hY3Rpb25zPy5tYXAodGhpcy5yZW5kZXJBY3Rpb24pLFxuICAgICAgc2NoZWR1bGU6IG9wdGlvbnMuc2NoZWR1bGUuZXhwcmVzc2lvblN0cmluZyxcbiAgICAgIHN0YXJ0T25DcmVhdGlvbjogb3B0aW9ucy5zdGFydE9uQ3JlYXRpb24gPz8gZmFsc2UsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJpZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gRXZlbnQgQnJpZGdlIGJhc2VkIHRyaWdnZXIgdG8gdGhlIHdvcmtmbG93LlxuICAgKlxuICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSB0cmlnZ2VyLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSB0cmlnZ2VyLlxuICAgKiBAdGhyb3dzIElmIGJvdGggam9iIGFuZCBjcmF3bGVyIGFyZSBwcm92aWRlZCwgb3IgaWYgbmVpdGhlciBqb2Igbm9yIGNyYXdsZXIgaXMgcHJvdmlkZWQuXG4gICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIENmblRyaWdnZXIgcmVzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgYWRkTm90aWZ5RXZlbnRUcmlnZ2VyKGlkOiBzdHJpbmcsIG9wdGlvbnM6IE5vdGlmeUV2ZW50VHJpZ2dlck9wdGlvbnMpOiBDZm5UcmlnZ2VyIHtcbiAgICBjb25zdCB0cmlnZ2VyID0gbmV3IENmblRyaWdnZXIodGhpcywgaWQsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB3b3JrZmxvd05hbWU6IHRoaXMud29ya2Zsb3dOYW1lLFxuICAgICAgdHlwZTogJ0VWRU5UJyxcbiAgICAgIGFjdGlvbnM6IG9wdGlvbnMuYWN0aW9ucz8ubWFwKHRoaXMucmVuZGVyQWN0aW9uKSxcbiAgICAgIGV2ZW50QmF0Y2hpbmdDb25kaXRpb246IHRoaXMucmVuZGVyRXZlbnRCYXRjaGluZ0NvbmRpdGlvbihvcHRpb25zKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uID8/IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIHJldHVybiB0cmlnZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIENvbmRpdGlvbiAoUHJlZGljYXRlKSBiYXNlZCB0cmlnZ2VyIHRvIHRoZSB3b3JrZmxvdy5cbiAgICpcbiAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgdHJpZ2dlci5cbiAgICogQHBhcmFtIG9wdGlvbnMgQWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgdHJpZ2dlci5cbiAgICogQHRocm93cyBJZiBib3RoIGpvYiBhbmQgY3Jhd2xlciBhcmUgcHJvdmlkZWQsIG9yIGlmIG5laXRoZXIgam9iIG5vciBjcmF3bGVyIGlzIHByb3ZpZGVkIGZvciBhbnkgY29uZGl0aW9uLlxuICAgKiBAdGhyb3dzIElmIGEgam9iIGlzIHByb3ZpZGVkIHdpdGhvdXQgYSBqb2Igc3RhdGUsIG9yIGlmIGEgY3Jhd2xlciBpcyBwcm92aWRlZCB3aXRob3V0IGEgY3Jhd2xlciBzdGF0ZSBmb3IgYW55IGNvbmRpdGlvbi5cbiAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgQ2ZuVHJpZ2dlciByZXNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyBhZGRjb25kaXRpb25hbFRyaWdnZXIoaWQ6IHN0cmluZywgb3B0aW9uczogQ29uZGl0aW9uYWxUcmlnZ2VyT3B0aW9ucyk6IENmblRyaWdnZXIge1xuICAgIGNvbnN0IHRyaWdnZXIgPSBuZXcgQ2ZuVHJpZ2dlcih0aGlzLCBpZCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHdvcmtmbG93TmFtZTogdGhpcy53b3JrZmxvd05hbWUsXG4gICAgICB0eXBlOiAnQ09ORElUSU9OQUwnLFxuICAgICAgYWN0aW9uczogb3B0aW9ucy5hY3Rpb25zPy5tYXAodGhpcy5yZW5kZXJBY3Rpb24pLFxuICAgICAgcHJlZGljYXRlOiB0aGlzLnJlbmRlclByZWRpY2F0ZShvcHRpb25zKSxcbiAgICAgIGV2ZW50QmF0Y2hpbmdDb25kaXRpb246IHRoaXMucmVuZGVyRXZlbnRCYXRjaGluZ0NvbmRpdGlvbihvcHRpb25zKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uID8/IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIHJldHVybiB0cmlnZ2VyO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJBY3Rpb24oYWN0aW9uOiBBY3Rpb24pOiBDZm5UcmlnZ2VyLkFjdGlvblByb3BlcnR5IHtcbiAgICAvLyBWYWxpZGF0ZSB0aGF0IGVpdGhlciBqb2Igb3IgY3Jhd2xlciBpcyBwcm92aWRlZCwgYnV0IG5vdCBib3RoXG4gICAgaWYgKCFhY3Rpb24uam9iICYmICFhY3Rpb24uY3Jhd2xlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBwcm92aWRlIGVpdGhlciBhIGpvYiBvciBhIGNyYXdsZXIgZm9yIHRoZSBhY3Rpb24uJyk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24uam9iICYmIGFjdGlvbi5jcmF3bGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3QgcHJvdmlkZSBib3RoIGEgam9iIGFuZCBhIGNyYXdsZXIgZm9yIHRoZSBhY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGpvYk5hbWU6IGFjdGlvbi5qb2I/LmpvYk5hbWUsXG4gICAgICBhcmd1bWVudHM6IGFjdGlvbi5hcmd1bWVudHMsXG4gICAgICB0aW1lb3V0OiBhY3Rpb24udGltZW91dD8udG9NaW51dGVzKCksXG4gICAgICBzZWN1cml0eUNvbmZpZ3VyYXRpb246IGFjdGlvbi5zZWN1cml0eUNvbmZpZ3VyYXRpb24/LnNlY3VyaXR5Q29uZmlndXJhdGlvbk5hbWUsXG4gICAgICBjcmF3bGVyTmFtZTogYWN0aW9uLmNyYXdsZXI/Lm5hbWUsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyUHJlZGljYXRlKHByb3BzOiBDb25kaXRpb25hbFRyaWdnZXJPcHRpb25zKTogQ2ZuVHJpZ2dlci5QcmVkaWNhdGVQcm9wZXJ0eSB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHByb3BzLnByZWRpY2F0ZS5jb25kaXRpb25zPy5tYXAoY29uZGl0aW9uID0+IHtcbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgZWl0aGVyIGpvYiBvciBjcmF3bGVyIGlzIHByb3ZpZGVkLCBidXQgbm90IGJvdGhcbiAgICAgIGlmICghY29uZGl0aW9uLmpvYiAmJiAhY29uZGl0aW9uLmNyYXdsZXJOYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYSBqb2Igb3IgYSBjcmF3bGVyIGZvciB0aGUgY29uZGl0aW9uLicpO1xuICAgICAgfSBlbHNlIGlmIChjb25kaXRpb24uam9iICYmIGNvbmRpdGlvbi5jcmF3bGVyTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3QgcHJvdmlkZSBib3RoIGEgam9iIGFuZCBhIGNyYXdsZXIgZm9yIHRoZSBjb25kaXRpb24uJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgaWYgam9iIGlzIHByb3ZpZGVkLCBqb2Igc3RhdGUgaXMgYWxzbyBwcm92aWRlZFxuICAgICAgaWYgKGNvbmRpdGlvbi5qb2IgJiYgIWNvbmRpdGlvbi5zdGF0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lmIHlvdSBwcm92aWRlIGEgam9iIGZvciB0aGUgY29uZGl0aW9uLCB5b3UgbXVzdCBhbHNvIHByb3ZpZGUgYSBqb2Igc3RhdGUuJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgaWYgY3Jhd2xlciBpcyBwcm92aWRlZCwgY3Jhd2xlciBzdGF0ZSBpcyBhbHNvIHByb3ZpZGVkXG4gICAgICBpZiAoY29uZGl0aW9uLmNyYXdsZXJOYW1lICYmICFjb25kaXRpb24uY3Jhd2xTdGF0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lmIHlvdSBwcm92aWRlIGEgY3Jhd2xlciBmb3IgdGhlIGNvbmRpdGlvbiwgeW91IG11c3QgYWxzbyBwcm92aWRlIGEgY3Jhd2xlciBzdGF0ZS4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9naWNhbE9wZXJhdG9yOiBjb25kaXRpb24ubG9naWNhbE9wZXJhdG9yID8/IENvbmRpdGlvbkxvZ2ljYWxPcGVyYXRvci5FUVVBTFMsXG4gICAgICAgIGpvYk5hbWU6IGNvbmRpdGlvbi5qb2I/LmpvYk5hbWUgPz8gdW5kZWZpbmVkLFxuICAgICAgICBzdGF0ZTogY29uZGl0aW9uLnN0YXRlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgY3Jhd2xlck5hbWU6IGNvbmRpdGlvbi5jcmF3bGVyTmFtZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIGNyYXdsU3RhdGU6IGNvbmRpdGlvbi5jcmF3bFN0YXRlID8/IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbG9naWNhbDogcHJvcHMucHJlZGljYXRlLmNvbmRpdGlvbnM/Lmxlbmd0aCA9PT0gMSA/IHVuZGVmaW5lZCA6IHByb3BzLnByZWRpY2F0ZS5sb2dpY2FsID8/IFByZWRpY2F0ZUxvZ2ljYWwuQU5ELFxuICAgICAgY29uZGl0aW9uczogY29uZGl0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJFdmVudEJhdGNoaW5nQ29uZGl0aW9uKHByb3BzOiBOb3RpZnlFdmVudFRyaWdnZXJPcHRpb25zKTogQ2ZuVHJpZ2dlci5FdmVudEJhdGNoaW5nQ29uZGl0aW9uUHJvcGVydHkge1xuICAgIGNvbnN0IGRlZmF1bHRCYXRjaFNpemUgPSAxO1xuICAgIGNvbnN0IGRlZmF1bHRCYXRjaFdpbmRvdyA9IGNkay5EdXJhdGlvbi5zZWNvbmRzKDkwMCkudG9TZWNvbmRzKCk7XG5cbiAgICBpZiAoIXByb3BzLmV2ZW50QmF0Y2hpbmdDb25kaXRpb24pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJhdGNoU2l6ZTogZGVmYXVsdEJhdGNoU2l6ZSxcbiAgICAgICAgYmF0Y2hXaW5kb3c6IGRlZmF1bHRCYXRjaFdpbmRvdyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJhdGNoU2l6ZTogcHJvcHMuZXZlbnRCYXRjaGluZ0NvbmRpdGlvbi5iYXRjaFNpemUgfHwgZGVmYXVsdEJhdGNoU2l6ZSxcbiAgICAgIGJhdGNoV2luZG93OiBwcm9wcy5ldmVudEJhdGNoaW5nQ29uZGl0aW9uLmJhdGNoV2luZG93Py50b1NlY29uZHMoKSB8fCBkZWZhdWx0QmF0Y2hXaW5kb3csXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZFdvcmtmbG93QXJuKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgd29ya2Zsb3dOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjZGsuU3RhY2sub2Yoc2NvcGUpLmZvcm1hdEFybih7XG4gICAgICBzZXJ2aWNlOiAnZ2x1ZScsXG4gICAgICByZXNvdXJjZTogJ3dvcmtmbG93JyxcbiAgICAgIHJlc291cmNlTmFtZTogd29ya2Zsb3dOYW1lLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGNvbnN0cnVjdCBmb3IgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIEFXUyBHbHVlIFdvcmtmbG93cyBhbmQgVHJpZ2dlcnMuXG4gKlxuICogQVdTIEdsdWUgV29ya2Zsb3dzIGFyZSBvcmNoZXN0cmF0aW9uIHNlcnZpY2VzIHRoYXQgYWxsb3cgeW91IHRvIGNyZWF0ZSwgbWFuYWdlLCBhbmQgbW9uaXRvciBjb21wbGV4IGV4dHJhY3QsIHRyYW5zZm9ybSwgYW5kIGxvYWQgKEVUTCkgYWN0aXZpdGllcyBpbnZvbHZpbmcgbXVsdGlwbGUgY3Jhd2xlcnMsIGpvYnMsIGFuZCB0cmlnZ2Vycy4gV29ya2Zsb3dzIGFyZSBkZXNpZ25lZCB0byBhbGxvdyB5b3UgdG8gbWFuYWdlIGludGVyZGVwZW5kZW50IGpvYnMgYW5kIGNyYXdsZXJzIGFzIGEgc2luZ2xlIHVuaXQsIG1ha2luZyBpdCBlYXNpZXIgdG8gb3JjaGVzdHJhdGUgYW5kIG1vbml0b3IgY29tcGxleCBFVEwgcGlwZWxpbmVzLlxuICpcbiAqIFRyaWdnZXJzIGFyZSB1c2VkIHRvIGluaXRpYXRlIGFuIEFXUyBHbHVlIFdvcmtmbG93LiBZb3UgY2FuIGNvbmZpZ3VyZSBkaWZmZXJlbnQgdHlwZXMgb2YgdHJpZ2dlcnMsIHN1Y2ggYXMgb24tZGVtYW5kLCBzY2hlZHVsZWQsIGV2ZW50LWJhc2VkLCBvciBjb25kaXRpb25hbCB0cmlnZ2VycywgdG8gc3RhcnQgeW91ciBXb3JrZmxvdyBiYXNlZCBvbiBzcGVjaWZpYyBjb25kaXRpb25zIG9yIGV2ZW50cy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy93b3JrZmxvd3Nfb3ZlcnZpZXcuaHRtbFxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYWJvdXQtdHJpZ2dlcnMuaHRtbFxuICpcbiAqICMjIFVzYWdlIEV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgYXBwID0gbmV3IEFwcCgpO1xuICogY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnVGVzdFN0YWNrJyk7XG4gKlxuICogLy8gQ3JlYXRlIGEgR2x1ZSBKb2JcbiAqIGRlY2xhcmUgY29uc3Qgcm9sZTogaWFtLklSb2xlO1xuICogZGVjbGFyZSBjb25zdCBzY3JpcHQ6IGdsdWUuQ29kZTtcbiAqIGNvbnN0IGpvYiA9IG5ldyBnbHVlLlB5U3BhcmtTdHJlYW1pbmdKb2Ioc3RhY2ssICdJbXBvcnRlZEpvYicsIHsgcm9sZSwgc2NyaXB0IH0pO1xuICpcbiAqIC8vIENyZWF0ZSBhIEdsdWUgV29ya2Zsb3dcbiAqIGNvbnN0IHdvcmtmbG93ID0gbmV3IGdsdWUuV29ya2Zsb3coc3RhY2ssICdUZXN0V29ya2Zsb3cnKTtcbiAqXG4gKiAvLyBBZGQgYW4gb24tZGVtYW5kIHRyaWdnZXIgdG8gdGhlIFdvcmtmbG93XG4gKiB3b3JrZmxvdy5hZGRPbkRlbWFuZFRyaWdnZXIoJ09uRGVtYW5kVHJpZ2dlcicsIHtcbiAqICAgYWN0aW9uczogW3sgam9iOiBqb2IgfV0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3cgZXh0ZW5kcyBXb3JrZmxvd0Jhc2Uge1xuICAvKipcbiAgICogSW1wb3J0IGEgd29ya2Zsb3cgZnJvbSBpdHMgbmFtZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tV29ya2Zsb3dOYW1lKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgaWQ6IHN0cmluZywgd29ya2Zsb3dOYW1lOiBzdHJpbmcpOiBJV29ya2Zsb3cge1xuICAgIHJldHVybiB0aGlzLmZyb21Xb3JrZmxvd0F0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICB3b3JrZmxvd05hbWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGFuIHdvcmtmbG93IGZyb20gaXQncyBuYW1lXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Xb3JrZmxvd0FybihzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHdvcmtmbG93QXJuOiBzdHJpbmcpOiBJV29ya2Zsb3cge1xuICAgIHJldHVybiB0aGlzLmZyb21Xb3JrZmxvd0F0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICB3b3JrZmxvd05hbWU6IHRoaXMuZXh0cmFjdE5hbWVGcm9tQXJuKHNjb3BlLCB3b3JrZmxvd0FybiksXG4gICAgICB3b3JrZmxvd0FybixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3Rpbmcgd29ya2Zsb3dcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVdvcmtmbG93QXR0cmlidXRlcyhzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBXb3JrZmxvd0F0dHJpYnV0ZXMpOiBJV29ya2Zsb3cge1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIFdvcmtmbG93QmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dOYW1lID0gYXR0cnMud29ya2Zsb3dOYW1lO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93QXJuID0gdGhpcy5idWlsZFdvcmtmbG93QXJuKHNjb3BlLCB0aGlzLndvcmtmbG93TmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSB3b3JrZmxvd05hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93QXJuOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IFdvcmtmbG93UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHM/LndvcmtmbG93TmFtZSxcbiAgICB9KTtcbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIGNvbnN0IHJlc291cmNlID0gbmV3IENmbldvcmtmbG93KHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIG5hbWU6IHRoaXMucGh5c2ljYWxOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzPy5kZXNjcmlwdGlvbixcbiAgICAgIGRlZmF1bHRSdW5Qcm9wZXJ0aWVzOiBwcm9wcz8uZGVmYXVsdFJ1blByb3BlcnRpZXMsXG4gICAgICBtYXhDb25jdXJyZW50UnVuczogcHJvcHM/Lm1heENvbmN1cnJlbnRSdW5zLFxuICAgIH0pO1xuXG4gICAgdGhpcy53b3JrZmxvd05hbWUgPSB0aGlzLmdldFJlc291cmNlTmFtZUF0dHJpYnV0ZShyZXNvdXJjZS5yZWYpO1xuICAgIHRoaXMud29ya2Zsb3dBcm4gPSB0aGlzLmJ1aWxkV29ya2Zsb3dBcm4odGhpcywgdGhpcy53b3JrZmxvd05hbWUpO1xuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws-cdk/aws-glue-alpha",
3
- "version": "2.176.0-alpha.0",
3
+ "version": "2.178.0-alpha.0",
4
4
  "private": false,
5
5
  "description": "The CDK Construct Library for AWS::Glue",
6
6
  "main": "lib/index.js",
@@ -81,18 +81,18 @@
81
81
  },
82
82
  "license": "Apache-2.0",
83
83
  "devDependencies": {
84
- "@aws-cdk/cdk-build-tools": "2.176.0-alpha.0",
85
- "@aws-cdk/integ-runner": "2.176.0-alpha.0",
86
- "@aws-cdk/integ-tests-alpha": "2.176.0-alpha.0",
87
- "@aws-cdk/pkglint": "2.176.0-alpha.0",
88
- "@types/jest": "^29.5.14",
89
- "aws-cdk-lib": "2.176.0",
84
+ "@aws-cdk/cdk-build-tools": "2.178.0-alpha.0",
85
+ "@aws-cdk/integ-runner": "2.178.0-alpha.0",
86
+ "@aws-cdk/integ-tests-alpha": "2.178.0-alpha.0",
87
+ "@aws-cdk/pkglint": "2.178.0-alpha.0",
88
+ "@types/jest": "^29.5.12",
89
+ "aws-cdk-lib": "2.178.0",
90
90
  "constructs": "^10.0.0",
91
91
  "jest": "^29.7.0"
92
92
  },
93
93
  "homepage": "https://github.com/aws/aws-cdk",
94
94
  "peerDependencies": {
95
- "aws-cdk-lib": "^2.176.0",
95
+ "aws-cdk-lib": "^2.178.0",
96
96
  "constructs": "^10.0.0"
97
97
  },
98
98
  "engines": {
@@ -1,7 +1,7 @@
1
1
  // Fixture with packages imported, but nothing else
2
2
  import * as path from 'path';
3
3
  import { Construct } from 'constructs';
4
- import { Stack } from 'aws-cdk-lib';
4
+ import { App, Stack } from 'aws-cdk-lib';
5
5
  import * as glue from '@aws-cdk/aws-glue-alpha';
6
6
  import * as s3 from 'aws-cdk-lib/aws-s3';
7
7
  import * as ec2 from 'aws-cdk-lib/aws-ec2';