ec2-instance-running-scheduler 0.2.6 → 0.3.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.
@@ -14,20 +14,31 @@ const client_ec2_1 = require("@aws-sdk/client-ec2");
14
14
  const client_resource_groups_tagging_api_1 = require("@aws-sdk/client-resource-groups-tagging-api");
15
15
  const web_api_1 = require("@slack/web-api");
16
16
  const aws_lambda_secret_fetcher_1 = require("aws-lambda-secret-fetcher");
17
- const safe_env_getter_1 = require("safe-env-getter");
18
- const running_scheduler_polling_env_1 = require("./running-scheduler-polling-env");
17
+ const strict_env_resolver_1 = require("strict-env-resolver");
19
18
  const running_scheduler_predicates_1 = require("./running-scheduler-predicates");
19
+ const running_scheduler_wait_env_1 = require("./running-scheduler-wait-env");
20
20
  /** Mapping of EC2 instance state to display name and emoji for Slack. */
21
21
  const STATE_LIST = [
22
22
  { name: 'RUNNING', emoji: '😆', state: 'running' },
23
23
  { name: 'STOPPED', emoji: '😴', state: 'stopped' },
24
24
  ];
25
25
  /**
26
- * Seconds to wait between polling instance state after start/stop or while transitioning.
26
+ * Seconds to wait between describe iterations after start/stop or while transitioning.
27
27
  *
28
28
  * Used with {@link processOneResource} durable `wait` calls between describe iterations.
29
29
  */
30
30
  const STATUS_CHANGE_WAIT_SECONDS = 20;
31
+ /**
32
+ * Options passed to {@link secretFetcher.getSecretValue} when loading the Slack secret.
33
+ *
34
+ * Retries cover transient extension HTTP errors (5xx, 429) and the extension
35
+ * "not ready to serve traffic" response during cold starts.
36
+ */
37
+ const SLACK_SECRET_FETCH_OPTIONS = {
38
+ timeoutMs: 3000,
39
+ retries: 5,
40
+ baseBackoffMs: 300,
41
+ };
31
42
  /**
32
43
  * Returns display name and emoji for an EC2 instance state.
33
44
  *
@@ -39,22 +50,22 @@ const getStateDisplay = (current) => {
39
50
  return found ? { emoji: found.emoji, name: found.name } : undefined;
40
51
  };
41
52
  /**
42
- * Processes one EC2 instance: describes state, issues start/stop when needed, then polls until
53
+ * Processes one EC2 instance: describes state, issues start/stop when needed, then waits until
43
54
  * {@link isDesiredStableState} is satisfied (durable `step` / `wait` between attempts).
44
55
  *
45
- * Each loop iteration checks {@link getPollingAbortReason} before describe. Failures use
46
- * {@link formatResourcePollingFailure} (`ResourcePollingFailed:*` message prefix).
56
+ * Each loop iteration checks {@link getWaitAbortReason} before describe. Failures use
57
+ * {@link formatResourceWaitFailure} (`ResourceWaitFailed:*` message prefix).
47
58
  *
48
59
  * @param ctx - Durable execution context (child context per instance recommended).
49
60
  * @param targetResource - EC2 instance ARN.
50
61
  * @param params - Scheduler params (`TagKey`, `TagValues`, `Mode`).
51
62
  * @param resourceIndex - Index used in durable step names for this resource.
52
- * @param pollingLimits - Per-instance caps from {@link parseResourcePollingLimitsFromEnv} (set by the CDK construct).
63
+ * @param waitLimits - Per-instance caps from {@link parseResourceWaitLimitsFromEnv} (set by the CDK construct).
53
64
  * @returns Final resource ARN, EC2 state name, parsed account, region, and instance id.
54
- * @throws {Error} When polling limits are exceeded (`MaxLoopCountExceeded`, `MaxElapsedTimeExceeded`),
65
+ * @throws {Error} When wait limits are exceeded (`MaxLoopCountExceeded`, `MaxElapsedTimeExceeded`),
55
66
  * the instance is in an unexpected state (`UnexpectedInstanceState`), or the loop exits without a stable goal state.
56
67
  */
57
- const processOneResource = async (ctx, targetResource, params, resourceIndex, pollingLimits) => {
68
+ const processOneResource = async (ctx, targetResource, params, resourceIndex, waitLimits) => {
58
69
  const parts = targetResource.split('/');
59
70
  const identifier = parts[parts.length - 1] ?? 'unknown';
60
71
  const arnParts = targetResource.split(':');
@@ -67,29 +78,29 @@ const processOneResource = async (ctx, targetResource, params, resourceIndex, po
67
78
  region,
68
79
  account,
69
80
  mode: params.Mode,
70
- maxLoopCount: pollingLimits.maxLoopCount,
71
- maxElapsedSeconds: pollingLimits.maxElapsedSeconds,
81
+ maxLoopCount: waitLimits.maxLoopCount,
82
+ maxElapsedSeconds: waitLimits.maxElapsedSeconds,
72
83
  });
73
- const startedAtMs = await ctx.step(`${stepPrefix}-polling-started-at`, async () => Date.now());
84
+ const startedAtMs = await ctx.step(`${stepPrefix}-wait-started-at`, async () => Date.now());
74
85
  let loopCount = 0;
75
86
  let currentState = '';
76
87
  do {
77
- const abortReason = await ctx.step(`${stepPrefix}-poll-limit-check-${loopCount}`, async () => (0, running_scheduler_predicates_1.getPollingAbortReason)(loopCount, startedAtMs, Date.now(), pollingLimits));
88
+ const abortReason = await ctx.step(`${stepPrefix}-wait-limit-check-${loopCount}`, async () => (0, running_scheduler_predicates_1.getWaitAbortReason)(loopCount, startedAtMs, Date.now(), waitLimits));
78
89
  if (abortReason) {
79
- const message = (0, running_scheduler_predicates_1.formatResourcePollingFailure)(abortReason, {
90
+ const message = (0, running_scheduler_predicates_1.formatResourceWaitFailure)(abortReason, {
80
91
  identifier,
81
92
  mode: params.Mode,
82
93
  currentState: currentState || 'unknown',
83
94
  loopCount,
84
- limits: pollingLimits,
95
+ limits: waitLimits,
85
96
  });
86
- ctx.logger.error('processOneResource: polling limit exceeded', {
97
+ ctx.logger.error('processOneResource: wait limit exceeded', {
87
98
  identifier,
88
99
  abortReason,
89
100
  loopCount,
90
101
  currentState,
91
- maxLoopCount: pollingLimits.maxLoopCount,
92
- maxElapsedSeconds: pollingLimits.maxElapsedSeconds,
102
+ maxLoopCount: waitLimits.maxLoopCount,
103
+ maxElapsedSeconds: waitLimits.maxElapsedSeconds,
93
104
  });
94
105
  throw new Error(message);
95
106
  }
@@ -146,12 +157,12 @@ const processOneResource = async (ctx, targetResource, params, resourceIndex, po
146
157
  loopCount += 1;
147
158
  continue;
148
159
  }
149
- const message = (0, running_scheduler_predicates_1.formatResourcePollingFailure)('UnexpectedInstanceState', {
160
+ const message = (0, running_scheduler_predicates_1.formatResourceWaitFailure)('UnexpectedInstanceState', {
150
161
  identifier,
151
162
  mode,
152
163
  currentState,
153
164
  loopCount,
154
- limits: pollingLimits,
165
+ limits: waitLimits,
155
166
  });
156
167
  ctx.logger.error('processOneResource: unexpected state', {
157
168
  identifier,
@@ -183,16 +194,23 @@ const processOneResource = async (ctx, targetResource, params, resourceIndex, po
183
194
  * in parallel (bounded concurrency), posts a parent Slack message and per-instance thread replies,
184
195
  * and uses durable `step` / `wait` / `map` so the run can resume across suspensions.
185
196
  *
186
- * Reads per-instance polling limits from `PROCESS_RESOURCE_MAX_LOOP_COUNT` and
187
- * `PROCESS_RESOURCE_MAX_ELAPSED_SECONDS` via {@link parseResourcePollingLimitsFromEnv}.
197
+ * Reads per-instance wait limits from `PROCESS_RESOURCE_MAX_LOOP_COUNT` and
198
+ * `PROCESS_RESOURCE_MAX_ELAPSED_SECONDS` via {@link parseResourceWaitLimitsFromEnv}.
199
+ * Loads the Slack secret via {@link secretFetcher} (Parameters and Secrets Lambda Extension).
200
+ * Slack API failures are logged as `running-scheduler: Slack post failed` for CloudWatch log filters.
188
201
  *
189
202
  * @param event - Payload from EventBridge Scheduler; must include `Params.TagKey`, `Params.TagValues`, `Params.Mode`.
190
203
  * @param ctx - Root durable execution context.
191
204
  * @returns
192
205
  * - `{ status: 'TargetResourcesNotFound' }` when no instances match the tag filter.
193
206
  * - `{ status: 'Completed', processed, results }` when instances were handled (`results` entries match {@link processOneResource} return shape).
194
- * @throws {Error} If `Params` is invalid, polling env vars are invalid, `SLACK_SECRET_NAME` is unset,
195
- * the Slack secret is incomplete, or instance processing fails (including `ResourcePollingFailed:*` errors).
207
+ * @throws {Error} If `Params` is invalid, wait env vars are not positive integers,
208
+ * the Slack secret is incomplete, instance processing fails (including `ResourceWaitFailed:*` errors),
209
+ * or the secret cannot be read from the extension (e.g. outside Lambda or missing `AWS_SESSION_TOKEN`).
210
+ * @throws {import('strict-env-resolver').StrictEnvValidationError} When required env vars are missing or not valid numbers.
211
+ * @throws {import('fetch-retrier').FetchRetrierHttpError} When the extension returns a non-retriable HTTP error.
212
+ * @throws {import('fetch-retrier').FetchRetrierNetworkError} When extension requests fail at the network level.
213
+ * @throws {import('fetch-retrier').FetchRetrierAbortError} When extension requests time out after all retries.
196
214
  */
197
215
  exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (event, ctx) => {
198
216
  const params = event.Params;
@@ -204,12 +222,11 @@ exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (ev
204
222
  if (!params?.TagKey || !params?.TagValues || !params?.Mode) {
205
223
  throw new Error('Invalid event: Params.TagKey, Params.TagValues, Params.Mode are required.');
206
224
  }
207
- const pollingLimits = (0, running_scheduler_polling_env_1.parseResourcePollingLimitsFromEnv)();
208
- // safe get Secrets name from environment variable
209
- const slackSecretName = safe_env_getter_1.SafeEnvGetter.getEnv('SLACK_SECRET_NAME');
225
+ const waitLimits = (0, running_scheduler_wait_env_1.parseResourceWaitLimitsFromEnv)();
226
+ const slackSecretName = strict_env_resolver_1.StrictEnvResolver.resolve('SLACK_SECRET_NAME', strict_env_resolver_1.StrictEnvType.String);
210
227
  const slackSecretValue = await ctx.step('fetch-slack-secret', async () => {
211
228
  ctx.logger.info('running-scheduler: fetching Slack secret', { secretName: slackSecretName });
212
- return aws_lambda_secret_fetcher_1.secretFetcher.getSecretValue(slackSecretName);
229
+ return aws_lambda_secret_fetcher_1.secretFetcher.getSecretValue(slackSecretName, SLACK_SECRET_FETCH_OPTIONS);
213
230
  });
214
231
  ctx.logger.info('running-scheduler: Slack secret loaded');
215
232
  if (!slackSecretValue?.token || !slackSecretValue?.channel) {
@@ -238,10 +255,20 @@ exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (ev
238
255
  });
239
256
  // send slack message
240
257
  const slackParentMessageResult = await ctx.step('post-slack-messages', async () => {
241
- return client.chat.postMessage({
242
- channel,
243
- text: `${params.Mode === 'Start' ? '😆 Starts' : '🥱 Stops'} the scheduled EC2 Instance.`,
244
- });
258
+ try {
259
+ return await client.chat.postMessage({
260
+ channel,
261
+ text: `${params.Mode === 'Start' ? '😆 Starts' : '🥱 Stops'} the scheduled EC2 Instance.`,
262
+ });
263
+ }
264
+ catch (error) {
265
+ ctx.logger.error('running-scheduler: Slack post failed', {
266
+ step: 'post-slack-messages',
267
+ channel,
268
+ errorMessage: error instanceof Error ? error.message : String(error),
269
+ });
270
+ throw error;
271
+ }
245
272
  });
246
273
  ctx.logger.info('running-scheduler: parent Slack message posted', {
247
274
  threadTs: slackParentMessageResult?.ts ?? null,
@@ -257,7 +284,7 @@ exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (ev
257
284
  // ),
258
285
  async (mapCtx, targetResource, index) => {
259
286
  return mapCtx.runInChildContext(`resource-${index}`, async (childCtx) => {
260
- const result = await processOneResource(childCtx, targetResource, params, index, pollingLimits);
287
+ const result = await processOneResource(childCtx, targetResource, params, index, waitLimits);
261
288
  // if (result.status === 'skipped') {
262
289
  // return result;
263
290
  // }
@@ -269,22 +296,33 @@ exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (ev
269
296
  // send slack thread message
270
297
  await childCtx.step('post-slack-child-messages', async () => {
271
298
  const display = getStateDisplay(result.status);
272
- return client.chat.postMessage({
273
- channel,
274
- thread_ts: slackParentMessageResult?.ts,
275
- attachments: [
276
- {
277
- color: '#36a64f',
278
- pretext: `${display?.emoji} The status of the EC2 Instance ${result.identifier} changed to ${display?.name} due to the schedule.`,
279
- fields: [
280
- { title: 'Account', value: result.account, short: true },
281
- { title: 'Region', value: result.region, short: true },
282
- { title: 'Identifier', value: result.identifier, short: true },
283
- { title: 'Status', value: (display?.name ?? 'Unknown'), short: true },
284
- ],
285
- },
286
- ],
287
- });
299
+ try {
300
+ return await client.chat.postMessage({
301
+ channel,
302
+ thread_ts: slackParentMessageResult?.ts,
303
+ attachments: [
304
+ {
305
+ color: '#36a64f',
306
+ pretext: `${display?.emoji} The status of the EC2 Instance ${result.identifier} changed to ${display?.name} due to the schedule.`,
307
+ fields: [
308
+ { title: 'Account', value: result.account, short: true },
309
+ { title: 'Region', value: result.region, short: true },
310
+ { title: 'Identifier', value: result.identifier, short: true },
311
+ { title: 'Status', value: (display?.name ?? 'Unknown'), short: true },
312
+ ],
313
+ },
314
+ ],
315
+ });
316
+ }
317
+ catch (error) {
318
+ childCtx.logger.error('running-scheduler: Slack post failed', {
319
+ step: 'post-slack-child-messages',
320
+ channel,
321
+ identifier: result.identifier,
322
+ errorMessage: error instanceof Error ? error.message : String(error),
323
+ });
324
+ throw error;
325
+ }
288
326
  });
289
327
  return result;
290
328
  });
@@ -300,4 +338,4 @@ exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (ev
300
338
  results: resultList,
301
339
  };
302
340
  });
303
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXIubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Z1bmNzL3J1bm5pbmctc2NoZWR1bGVyLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7R0FPRzs7O0FBRUgsNEVBQTBGO0FBQzFGLG9EQUs2QjtBQUM3QixvR0FBa0g7QUFDbEgsNENBQTJDO0FBQzNDLHlFQUEwRDtBQUMxRCxxREFBZ0Q7QUFDaEQsbUZBQW9GO0FBQ3BGLGlGQU13QztBQUV4Qyx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLEdBQUc7SUFDakIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtJQUNsRCxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0NBQzFDLENBQUM7QUFFWDs7OztHQUlHO0FBQ0gsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUM7QUEyQnRDOzs7OztHQUtHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUFlLEVBQStDLEVBQUU7SUFDdkYsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsQ0FBQztJQUMxRCxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDdEUsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLEVBQzlCLEdBQW1CLEVBQ25CLGNBQXNCLEVBQ3RCLE1BQWdDLEVBQ2hDLGFBQXFCLEVBQ3JCLGFBQW9DLEVBQ2dFLEVBQUU7SUFDdEcsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUM7SUFDeEQsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakMsTUFBTSxVQUFVLEdBQUcsWUFBWSxhQUFhLElBQUksVUFBVSxFQUFFLENBQUM7SUFFN0QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUU7UUFDM0MsYUFBYTtRQUNiLFVBQVU7UUFDVixNQUFNO1FBQ04sT0FBTztRQUNQLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtRQUNqQixZQUFZLEVBQUUsYUFBYSxDQUFDLFlBQVk7UUFDeEMsaUJBQWlCLEVBQUUsYUFBYSxDQUFDLGlCQUFpQjtLQUNuRCxDQUFDLENBQUM7SUFFSCxNQUFNLFdBQVcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLHFCQUFxQixFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFFL0YsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUN0QixHQUFHLENBQUM7UUFDRixNQUFNLFdBQVcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLHFCQUFxQixTQUFTLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRSxDQUMzRixJQUFBLG9EQUFxQixFQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUN6RSxDQUFDO1FBQ0YsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixNQUFNLE9BQU8sR0FBRyxJQUFBLDJEQUE0QixFQUFDLFdBQVcsRUFBRTtnQkFDeEQsVUFBVTtnQkFDVixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLFlBQVksRUFBRSxZQUFZLElBQUksU0FBUztnQkFDdkMsU0FBUztnQkFDVCxNQUFNLEVBQUUsYUFBYTthQUN0QixDQUFDLENBQUM7WUFDSCxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw0Q0FBNEMsRUFBRTtnQkFDN0QsVUFBVTtnQkFDVixXQUFXO2dCQUNYLFNBQVM7Z0JBQ1QsWUFBWTtnQkFDWixZQUFZLEVBQUUsYUFBYSxDQUFDLFlBQVk7Z0JBQ3hDLGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxpQkFBaUI7YUFDbkQsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQsWUFBWSxHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsYUFBYSxTQUFTLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM5RSxNQUFNLEdBQUcsR0FBRyxJQUFJLHNCQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDOUIsTUFBTSxHQUFHLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUkscUNBQXdCLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4RixPQUFPLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FBQztRQUN6RSxDQUFDLENBQUMsQ0FBQztRQUVILEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixFQUFFO1lBQy9DLFVBQVU7WUFDVixTQUFTO1lBQ1QsWUFBWTtZQUNaLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtTQUNsQixDQUFDLENBQUM7UUFFSCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBRXpCLElBQUksSUFBSSxLQUFLLE9BQU8sSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUNBQXVDLEVBQUUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUNwRixNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLFVBQVUsU0FBUyxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQzVELE1BQU0sR0FBRyxHQUFHLElBQUksc0JBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDOUIsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksa0NBQXFCLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzRSxDQUFDLENBQUMsQ0FBQztZQUNILEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxFQUFFO2dCQUN0RCxVQUFVO2dCQUNWLE9BQU8sRUFBRSwwQkFBMEI7YUFDcEMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLENBQUMsQ0FBQztZQUN4RCxTQUFTLElBQUksQ0FBQyxDQUFDO1lBQ2YsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLElBQUksS0FBSyxNQUFNLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2xELEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDcEYsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxTQUFTLFNBQVMsRUFBRSxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUMzRCxNQUFNLEdBQUcsR0FBRyxJQUFJLHNCQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzlCLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLGlDQUFvQixDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDMUUsQ0FBQyxDQUFDLENBQUM7WUFDSCxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsRUFBRTtnQkFDckQsVUFBVTtnQkFDVixPQUFPLEVBQUUsMEJBQTBCO2FBQ3BDLENBQUMsQ0FBQztZQUNILE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxDQUFDLENBQUM7WUFDeEQsU0FBUyxJQUFJLENBQUMsQ0FBQztZQUNmLFNBQVM7UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUEsbURBQW9CLEVBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDOUMsSUFBSSxJQUFBLG1EQUFvQixFQUFDLElBQUksRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyw4Q0FBOEMsRUFBRTtvQkFDOUQsVUFBVTtvQkFDVixTQUFTO29CQUNULFlBQVk7b0JBQ1osSUFBSTtvQkFDSixPQUFPLEVBQUUsMEJBQTBCO2lCQUNwQyxDQUFDLENBQUM7Z0JBQ0gsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLENBQUMsQ0FBQztnQkFDeEQsU0FBUyxJQUFJLENBQUMsQ0FBQztnQkFDZixTQUFTO1lBQ1gsQ0FBQztZQUVELE1BQU0sT0FBTyxHQUFHLElBQUEsMkRBQTRCLEVBQUMseUJBQXlCLEVBQUU7Z0JBQ3RFLFVBQVU7Z0JBQ1YsSUFBSTtnQkFDSixZQUFZO2dCQUNaLFNBQVM7Z0JBQ1QsTUFBTSxFQUFFLGFBQWE7YUFDdEIsQ0FBQyxDQUFDO1lBQ0gsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLEVBQUU7Z0JBQ3ZELFVBQVU7Z0JBQ1YsSUFBSTtnQkFDSixZQUFZO2dCQUNaLFNBQVM7YUFDVixDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDLFFBQVEsQ0FBQyxJQUFBLG1EQUFvQixFQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLEVBQUU7SUFFM0QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0RBQWtELEVBQUU7UUFDbEUsVUFBVTtRQUNWLFVBQVUsRUFBRSxZQUFZO1FBQ3hCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtRQUNqQixTQUFTO0tBQ1YsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLFVBQVU7UUFDVixPQUFPO1FBQ1AsTUFBTTtRQUNOLFFBQVEsRUFBRSxjQUFjO1FBQ3hCLE1BQU0sRUFBRSxZQUFZO0tBQ3JCLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDVSxRQUFBLE9BQU8sR0FBRyxJQUFBLCtDQUFvQixFQUFDLEtBQUssRUFBRSxLQUFxQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUUvRixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBRTVCLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixFQUFFO1FBQy9DLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSTtRQUNsQixNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU07UUFDdEIsYUFBYSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUM7S0FDOUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzNELE1BQU0sSUFBSSxLQUFLLENBQUMsMkVBQTJFLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsSUFBQSxpRUFBaUMsR0FBRSxDQUFDO0lBRTFELGtEQUFrRDtJQUNsRCxNQUFNLGVBQWUsR0FBRywrQkFBYSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRWxFLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3ZFLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDBDQUEwQyxFQUFFLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDN0YsT0FBTyx5Q0FBYSxDQUFDLGNBQWMsQ0FBYyxlQUFlLENBQUMsQ0FBQztJQUNwRSxDQUFDLENBQUMsQ0FBQztJQUVILEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFFMUQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEtBQUssSUFBSSxDQUFDLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzNELE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsTUFBTSxlQUFlLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3hFLE1BQU0sTUFBTSxHQUFHLElBQUksbUVBQThCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUM5QixJQUFJLHdEQUFtQixDQUFDO1lBQ3RCLG1CQUFtQixFQUFFLENBQUMsY0FBYyxDQUFDO1lBQ3JDLFVBQVUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUMvRCxDQUFDLENBQ0gsQ0FBQztRQUNGLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLHNCQUFzQixJQUFJLEVBQUUsQ0FBQzthQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUEyQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO2FBQ25ELE1BQU0sQ0FBQyxDQUFDLEdBQXVCLEVBQWlCLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7UUFDbkUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsOENBQThDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDeEYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywwQ0FBMEMsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN2RixPQUFPLEVBQUUsTUFBTSxFQUFFLHlCQUFrQyxFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLElBQUksbUJBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyRCxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7SUFFekMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaURBQWlELEVBQUU7UUFDakUsYUFBYSxFQUFFLGVBQWUsQ0FBQyxNQUFNO0tBQ3RDLENBQUMsQ0FBQztJQUVILHFCQUFxQjtJQUNyQixNQUFNLHdCQUF3QixHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNoRixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQzdCLE9BQU87WUFDUCxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLDhCQUE4QjtTQUMxRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxFQUFFO1FBQ2hFLFFBQVEsRUFBRSx3QkFBd0IsRUFBRSxFQUFFLElBQUksSUFBSTtLQUMvQyxDQUFDLENBQUM7SUFFSCxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywwREFBMEQsRUFBRTtRQUMxRSxLQUFLLEVBQUUsZUFBZSxDQUFDLE1BQU07UUFDN0IsY0FBYyxFQUFFLEVBQUU7S0FDbkIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxPQUFPLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUMzQixlQUFlO0lBQ2Ysd0VBQXdFO0lBQ3hFLHNEQUFzRDtJQUN0RCw4REFBOEQ7SUFDOUQsT0FBTztJQUNQLEtBQUssRUFBRSxNQUFzQixFQUFFLGNBQXNCLEVBQUUsS0FBYSxFQUFFLEVBQUU7UUFDdEUsT0FBTyxNQUFNLENBQUMsaUJBQWlCLENBQUMsWUFBWSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBd0IsRUFBRSxFQUFFO1lBQ3RGLE1BQU0sTUFBTSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ2hHLHFDQUFxQztZQUNyQyxtQkFBbUI7WUFDbkIsSUFBSTtZQUNKLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlEQUFpRCxFQUFFO2dCQUN0RSxLQUFLO2dCQUNMLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtnQkFDN0IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO2FBQ3RCLENBQUMsQ0FBQztZQUNILDRCQUE0QjtZQUM1QixNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQzFELE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRS9DLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7b0JBQzdCLE9BQU87b0JBQ1AsU0FBUyxFQUFFLHdCQUF3QixFQUFFLEVBQUU7b0JBQ3ZDLFdBQVcsRUFBRTt3QkFDWDs0QkFDRSxLQUFLLEVBQUUsU0FBUzs0QkFDaEIsT0FBTyxFQUFFLEdBQUcsT0FBTyxFQUFFLEtBQUssbUNBQW1DLE1BQU0sQ0FBQyxVQUFVLGVBQWUsT0FBTyxFQUFFLElBQUksdUJBQXVCOzRCQUNqSSxNQUFNLEVBQUU7Z0NBQ04sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7Z0NBQ3hELEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO2dDQUN0RCxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtnQ0FDOUQsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTs2QkFDdEU7eUJBQ0Y7cUJBQ0Y7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsRUFDRCxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsQ0FDdkIsQ0FBQztJQUVGLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3pELEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDhCQUE4QixFQUFFO1FBQzlDLFNBQVMsRUFBRSxlQUFlLENBQUMsTUFBTTtRQUNqQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU07S0FDL0IsQ0FBQyxDQUFDO0lBQ0gsT0FBTztRQUNMLE1BQU0sRUFBRSxXQUFvQjtRQUM1QixTQUFTLEVBQUUsZUFBZSxDQUFDLE1BQU07UUFDakMsT0FBTyxFQUFFLFVBQVU7S0FDcEIsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFQzIgUnVubmluZyBTY2hlZHVsZXIg4oCTIER1cmFibGUgRnVuY3Rpb25zIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEltcGxlbWVudHMgdGhlIHJ1bm5pbmctY29udHJvbCBmbG93IHVzaW5nIEFXUyBMYW1iZGEgRHVyYWJsZSBFeGVjdXRpb24uXG4gKiBTdGVwIGNoZWNrcG9pbnRzLCB3YWl0IChubyBjaGFyZ2UpLCBhbmQgcGFyYWxsZWwgbWFwIHByb3ZpZGUgYSBmbG93IGVxdWl2YWxlbnQgdG8gU3RlcCBGdW5jdGlvbnMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFtYmRhL2xhdGVzdC9kZy9kdXJhYmxlLWV4ZWN1dGlvbi1zZGsuaHRtbFxuICovXG5cbmltcG9ydCB7IHdpdGhEdXJhYmxlRXhlY3V0aW9uLCB0eXBlIER1cmFibGVDb250ZXh0IH0gZnJvbSAnQGF3cy9kdXJhYmxlLWV4ZWN1dGlvbi1zZGstanMnO1xuaW1wb3J0IHtcbiAgRUMyQ2xpZW50LFxuICBEZXNjcmliZUluc3RhbmNlc0NvbW1hbmQsXG4gIFN0YXJ0SW5zdGFuY2VzQ29tbWFuZCxcbiAgU3RvcEluc3RhbmNlc0NvbW1hbmQsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1lYzInO1xuaW1wb3J0IHsgR2V0UmVzb3VyY2VzQ29tbWFuZCwgUmVzb3VyY2VHcm91cHNUYWdnaW5nQVBJQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXJlc291cmNlLWdyb3Vwcy10YWdnaW5nLWFwaSc7XG5pbXBvcnQgeyBXZWJDbGllbnQgfSBmcm9tICdAc2xhY2svd2ViLWFwaSc7XG5pbXBvcnQgeyBzZWNyZXRGZXRjaGVyIH0gZnJvbSAnYXdzLWxhbWJkYS1zZWNyZXQtZmV0Y2hlcic7XG5pbXBvcnQgeyBTYWZlRW52R2V0dGVyIH0gZnJvbSAnc2FmZS1lbnYtZ2V0dGVyJztcbmltcG9ydCB7IHBhcnNlUmVzb3VyY2VQb2xsaW5nTGltaXRzRnJvbUVudiB9IGZyb20gJy4vcnVubmluZy1zY2hlZHVsZXItcG9sbGluZy1lbnYnO1xuaW1wb3J0IHtcbiAgZm9ybWF0UmVzb3VyY2VQb2xsaW5nRmFpbHVyZSxcbiAgZ2V0UG9sbGluZ0Fib3J0UmVhc29uLFxuICBpc0Rlc2lyZWRTdGFibGVTdGF0ZSxcbiAgaXNUcmFuc2l0aW9uaW5nU3RhdGUsXG4gIHR5cGUgUmVzb3VyY2VQb2xsaW5nTGltaXRzLFxufSBmcm9tICcuL3J1bm5pbmctc2NoZWR1bGVyLXByZWRpY2F0ZXMnO1xuXG4vKiogTWFwcGluZyBvZiBFQzIgaW5zdGFuY2Ugc3RhdGUgdG8gZGlzcGxheSBuYW1lIGFuZCBlbW9qaSBmb3IgU2xhY2suICovXG5jb25zdCBTVEFURV9MSVNUID0gW1xuICB7IG5hbWU6ICdSVU5OSU5HJywgZW1vamk6ICfwn5iGJywgc3RhdGU6ICdydW5uaW5nJyB9LFxuICB7IG5hbWU6ICdTVE9QUEVEJywgZW1vamk6ICfwn5i0Jywgc3RhdGU6ICdzdG9wcGVkJyB9LFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBTZWNvbmRzIHRvIHdhaXQgYmV0d2VlbiBwb2xsaW5nIGluc3RhbmNlIHN0YXRlIGFmdGVyIHN0YXJ0L3N0b3Agb3Igd2hpbGUgdHJhbnNpdGlvbmluZy5cbiAqXG4gKiBVc2VkIHdpdGgge0BsaW5rIHByb2Nlc3NPbmVSZXNvdXJjZX0gZHVyYWJsZSBgd2FpdGAgY2FsbHMgYmV0d2VlbiBkZXNjcmliZSBpdGVyYXRpb25zLlxuICovXG5jb25zdCBTVEFUVVNfQ0hBTkdFX1dBSVRfU0VDT05EUyA9IDIwO1xuXG4vKipcbiAqIEV2ZW50IHBheWxvYWQgZnJvbSBFdmVudEJyaWRnZSBTY2hlZHVsZXIgaW52b2tpbmcgdGhpcyBMYW1iZGEuXG4gKlxuICogQHNlZSB7QGxpbmsgaGFuZGxlcn1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2hlZHVsZXJFdmVudCB7XG4gIC8qKiBTY2hlZHVsZXIgaW52b2NhdGlvbiBwYXJhbWV0ZXJzICh0YWcgZmlsdGVyIGFuZCBzdGFydC9zdG9wIG1vZGUpLiAqL1xuICBQYXJhbXM6IHtcbiAgICAvKiogVGFnIGtleSB1c2VkIHRvIHNlbGVjdCBFQzIgaW5zdGFuY2VzLiAqL1xuICAgIFRhZ0tleTogc3RyaW5nO1xuICAgIC8qKiBUYWcgdmFsdWVzIHRvIG1hdGNoLiAqL1xuICAgIFRhZ1ZhbHVlczogc3RyaW5nW107XG4gICAgLyoqIFdoZXRoZXIgdG8gc3RhcnQgb3Igc3RvcCBpbnN0YW5jZXMuICovXG4gICAgTW9kZTogJ1N0YXJ0JyB8ICdTdG9wJztcbiAgfTtcbn1cblxuLyoqIFNsYWNrIGNyZWRlbnRpYWxzIGFuZCBkZWZhdWx0IGNoYW5uZWwgbG9hZGVkIGZyb20gU2VjcmV0cyBNYW5hZ2VyIChgU0xBQ0tfU0VDUkVUX05BTUVgKS4gKi9cbmludGVyZmFjZSBTbGFja1NlY3JldCB7XG4gIC8qKiBTbGFjayBib3QgdG9rZW4gZm9yIHRoZSBTbGFjayBgV2ViQ2xpZW50YC4gKi9cbiAgdG9rZW46IHN0cmluZztcbiAgLyoqIENoYW5uZWwgSUQgb3IgbmFtZSBwYXNzZWQgdG8gYGNoYXQucG9zdE1lc3NhZ2VgLiAqL1xuICBjaGFubmVsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmV0dXJucyBkaXNwbGF5IG5hbWUgYW5kIGVtb2ppIGZvciBhbiBFQzIgaW5zdGFuY2Ugc3RhdGUuXG4gKlxuICogQHBhcmFtIGN1cnJlbnQgLSBDdXJyZW50IGluc3RhbmNlIHN0YXRlIChlLmcuICdydW5uaW5nJywgJ3N0b3BwZWQnKS5cbiAqIEByZXR1cm5zIERpc3BsYXkgaW5mbyBvciB1bmRlZmluZWQgaWYgc3RhdGUgaXMgbm90IGluIFNUQVRFX0xJU1QuXG4gKi9cbmNvbnN0IGdldFN0YXRlRGlzcGxheSA9IChjdXJyZW50OiBzdHJpbmcpOiB7IGVtb2ppOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9IHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgZm91bmQgPSBTVEFURV9MSVNULmZpbmQoKHMpID0+IHMuc3RhdGUgPT09IGN1cnJlbnQpO1xuICByZXR1cm4gZm91bmQgPyB7IGVtb2ppOiBmb3VuZC5lbW9qaSwgbmFtZTogZm91bmQubmFtZSB9IDogdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzZXMgb25lIEVDMiBpbnN0YW5jZTogZGVzY3JpYmVzIHN0YXRlLCBpc3N1ZXMgc3RhcnQvc3RvcCB3aGVuIG5lZWRlZCwgdGhlbiBwb2xscyB1bnRpbFxuICoge0BsaW5rIGlzRGVzaXJlZFN0YWJsZVN0YXRlfSBpcyBzYXRpc2ZpZWQgKGR1cmFibGUgYHN0ZXBgIC8gYHdhaXRgIGJldHdlZW4gYXR0ZW1wdHMpLlxuICpcbiAqIEVhY2ggbG9vcCBpdGVyYXRpb24gY2hlY2tzIHtAbGluayBnZXRQb2xsaW5nQWJvcnRSZWFzb259IGJlZm9yZSBkZXNjcmliZS4gRmFpbHVyZXMgdXNlXG4gKiB7QGxpbmsgZm9ybWF0UmVzb3VyY2VQb2xsaW5nRmFpbHVyZX0gKGBSZXNvdXJjZVBvbGxpbmdGYWlsZWQ6KmAgbWVzc2FnZSBwcmVmaXgpLlxuICpcbiAqIEBwYXJhbSBjdHggLSBEdXJhYmxlIGV4ZWN1dGlvbiBjb250ZXh0IChjaGlsZCBjb250ZXh0IHBlciBpbnN0YW5jZSByZWNvbW1lbmRlZCkuXG4gKiBAcGFyYW0gdGFyZ2V0UmVzb3VyY2UgLSBFQzIgaW5zdGFuY2UgQVJOLlxuICogQHBhcmFtIHBhcmFtcyAtIFNjaGVkdWxlciBwYXJhbXMgKGBUYWdLZXlgLCBgVGFnVmFsdWVzYCwgYE1vZGVgKS5cbiAqIEBwYXJhbSByZXNvdXJjZUluZGV4IC0gSW5kZXggdXNlZCBpbiBkdXJhYmxlIHN0ZXAgbmFtZXMgZm9yIHRoaXMgcmVzb3VyY2UuXG4gKiBAcGFyYW0gcG9sbGluZ0xpbWl0cyAtIFBlci1pbnN0YW5jZSBjYXBzIGZyb20ge0BsaW5rIHBhcnNlUmVzb3VyY2VQb2xsaW5nTGltaXRzRnJvbUVudn0gKHNldCBieSB0aGUgQ0RLIGNvbnN0cnVjdCkuXG4gKiBAcmV0dXJucyBGaW5hbCByZXNvdXJjZSBBUk4sIEVDMiBzdGF0ZSBuYW1lLCBwYXJzZWQgYWNjb3VudCwgcmVnaW9uLCBhbmQgaW5zdGFuY2UgaWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBwb2xsaW5nIGxpbWl0cyBhcmUgZXhjZWVkZWQgKGBNYXhMb29wQ291bnRFeGNlZWRlZGAsIGBNYXhFbGFwc2VkVGltZUV4Y2VlZGVkYCksXG4gKiAgIHRoZSBpbnN0YW5jZSBpcyBpbiBhbiB1bmV4cGVjdGVkIHN0YXRlIChgVW5leHBlY3RlZEluc3RhbmNlU3RhdGVgKSwgb3IgdGhlIGxvb3AgZXhpdHMgd2l0aG91dCBhIHN0YWJsZSBnb2FsIHN0YXRlLlxuICovXG5jb25zdCBwcm9jZXNzT25lUmVzb3VyY2UgPSBhc3luYyAoXG4gIGN0eDogRHVyYWJsZUNvbnRleHQsXG4gIHRhcmdldFJlc291cmNlOiBzdHJpbmcsXG4gIHBhcmFtczogU2NoZWR1bGVyRXZlbnRbJ1BhcmFtcyddLFxuICByZXNvdXJjZUluZGV4OiBudW1iZXIsXG4gIHBvbGxpbmdMaW1pdHM6IFJlc291cmNlUG9sbGluZ0xpbWl0cyxcbik6IFByb21pc2U8eyByZXNvdXJjZTogc3RyaW5nOyBzdGF0dXM6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nOyByZWdpb246IHN0cmluZzsgaWRlbnRpZmllcjogc3RyaW5nIH0+ID0+IHtcbiAgY29uc3QgcGFydHMgPSB0YXJnZXRSZXNvdXJjZS5zcGxpdCgnLycpO1xuICBjb25zdCBpZGVudGlmaWVyID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gPz8gJ3Vua25vd24nO1xuICBjb25zdCBhcm5QYXJ0cyA9IHRhcmdldFJlc291cmNlLnNwbGl0KCc6Jyk7XG4gIGNvbnN0IGFjY291bnQgPSBhcm5QYXJ0c1s0XSA/PyAnJztcbiAgY29uc3QgcmVnaW9uID0gYXJuUGFydHNbM10gPz8gJyc7XG4gIGNvbnN0IHN0ZXBQcmVmaXggPSBgcmVzb3VyY2UtJHtyZXNvdXJjZUluZGV4fS0ke2lkZW50aWZpZXJ9YDtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogc3RhcnQnLCB7XG4gICAgcmVzb3VyY2VJbmRleCxcbiAgICBpZGVudGlmaWVyLFxuICAgIHJlZ2lvbixcbiAgICBhY2NvdW50LFxuICAgIG1vZGU6IHBhcmFtcy5Nb2RlLFxuICAgIG1heExvb3BDb3VudDogcG9sbGluZ0xpbWl0cy5tYXhMb29wQ291bnQsXG4gICAgbWF4RWxhcHNlZFNlY29uZHM6IHBvbGxpbmdMaW1pdHMubWF4RWxhcHNlZFNlY29uZHMsXG4gIH0pO1xuXG4gIGNvbnN0IHN0YXJ0ZWRBdE1zID0gYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tcG9sbGluZy1zdGFydGVkLWF0YCwgYXN5bmMgKCkgPT4gRGF0ZS5ub3coKSk7XG5cbiAgbGV0IGxvb3BDb3VudCA9IDA7XG4gIGxldCBjdXJyZW50U3RhdGUgPSAnJztcbiAgZG8ge1xuICAgIGNvbnN0IGFib3J0UmVhc29uID0gYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tcG9sbC1saW1pdC1jaGVjay0ke2xvb3BDb3VudH1gLCBhc3luYyAoKSA9PlxuICAgICAgZ2V0UG9sbGluZ0Fib3J0UmVhc29uKGxvb3BDb3VudCwgc3RhcnRlZEF0TXMsIERhdGUubm93KCksIHBvbGxpbmdMaW1pdHMpLFxuICAgICk7XG4gICAgaWYgKGFib3J0UmVhc29uKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZm9ybWF0UmVzb3VyY2VQb2xsaW5nRmFpbHVyZShhYm9ydFJlYXNvbiwge1xuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBtb2RlOiBwYXJhbXMuTW9kZSxcbiAgICAgICAgY3VycmVudFN0YXRlOiBjdXJyZW50U3RhdGUgfHwgJ3Vua25vd24nLFxuICAgICAgICBsb29wQ291bnQsXG4gICAgICAgIGxpbWl0czogcG9sbGluZ0xpbWl0cyxcbiAgICAgIH0pO1xuICAgICAgY3R4LmxvZ2dlci5lcnJvcigncHJvY2Vzc09uZVJlc291cmNlOiBwb2xsaW5nIGxpbWl0IGV4Y2VlZGVkJywge1xuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBhYm9ydFJlYXNvbixcbiAgICAgICAgbG9vcENvdW50LFxuICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgIG1heExvb3BDb3VudDogcG9sbGluZ0xpbWl0cy5tYXhMb29wQ291bnQsXG4gICAgICAgIG1heEVsYXBzZWRTZWNvbmRzOiBwb2xsaW5nTGltaXRzLm1heEVsYXBzZWRTZWNvbmRzLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgY3VycmVudFN0YXRlID0gYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tZGVzY3JpYmUtJHtsb29wQ291bnR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZWMyID0gbmV3IEVDMkNsaWVudCh7fSk7XG4gICAgICBjb25zdCBvdXQgPSBhd2FpdCBlYzIuc2VuZChuZXcgRGVzY3JpYmVJbnN0YW5jZXNDb21tYW5kKHsgSW5zdGFuY2VJZHM6IFtpZGVudGlmaWVyXSB9KSk7XG4gICAgICByZXR1cm4gb3V0LlJlc2VydmF0aW9ucz8uWzBdPy5JbnN0YW5jZXM/LlswXT8uU3RhdGU/Lk5hbWUgPz8gJ3Vua25vd24nO1xuICAgIH0pO1xuXG4gICAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IGRlc2NyaWJlZCcsIHtcbiAgICAgIGlkZW50aWZpZXIsXG4gICAgICBsb29wQ291bnQsXG4gICAgICBjdXJyZW50U3RhdGUsXG4gICAgICBtb2RlOiBwYXJhbXMuTW9kZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1vZGUgPSBwYXJhbXMuTW9kZTtcblxuICAgIGlmIChtb2RlID09PSAnU3RhcnQnICYmIGN1cnJlbnRTdGF0ZSA9PT0gJ3N0b3BwZWQnKSB7XG4gICAgICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogc3RhcnRpbmcgaW5zdGFuY2UnLCB7IGlkZW50aWZpZXIsIGxvb3BDb3VudCB9KTtcbiAgICAgIGF3YWl0IGN0eC5zdGVwKGAke3N0ZXBQcmVmaXh9LXN0YXJ0LSR7bG9vcENvdW50fWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZWMyID0gbmV3IEVDMkNsaWVudCh7fSk7XG4gICAgICAgIGF3YWl0IGVjMi5zZW5kKG5ldyBTdGFydEluc3RhbmNlc0NvbW1hbmQoeyBJbnN0YW5jZUlkczogW2lkZW50aWZpZXJdIH0pKTtcbiAgICAgIH0pO1xuICAgICAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IHdhaXQgYWZ0ZXIgc3RhcnQnLCB7XG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIHNlY29uZHM6IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBjdHgud2FpdCh7IHNlY29uZHM6IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTIH0pO1xuICAgICAgbG9vcENvdW50ICs9IDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobW9kZSA9PT0gJ1N0b3AnICYmIGN1cnJlbnRTdGF0ZSA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogc3RvcHBpbmcgaW5zdGFuY2UnLCB7IGlkZW50aWZpZXIsIGxvb3BDb3VudCB9KTtcbiAgICAgIGF3YWl0IGN0eC5zdGVwKGAke3N0ZXBQcmVmaXh9LXN0b3AtJHtsb29wQ291bnR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlYzIgPSBuZXcgRUMyQ2xpZW50KHt9KTtcbiAgICAgICAgYXdhaXQgZWMyLnNlbmQobmV3IFN0b3BJbnN0YW5jZXNDb21tYW5kKHsgSW5zdGFuY2VJZHM6IFtpZGVudGlmaWVyXSB9KSk7XG4gICAgICB9KTtcbiAgICAgIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiB3YWl0IGFmdGVyIHN0b3AnLCB7XG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIHNlY29uZHM6IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBjdHgud2FpdCh7IHNlY29uZHM6IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTIH0pO1xuICAgICAgbG9vcENvdW50ICs9IDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzRGVzaXJlZFN0YWJsZVN0YXRlKG1vZGUsIGN1cnJlbnRTdGF0ZSkpIHtcbiAgICAgIGlmIChpc1RyYW5zaXRpb25pbmdTdGF0ZShtb2RlLCBjdXJyZW50U3RhdGUpKSB7XG4gICAgICAgIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiB3YWl0IHdoaWxlIHRyYW5zaXRpb25pbmcnLCB7XG4gICAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgICBsb29wQ291bnQsXG4gICAgICAgICAgY3VycmVudFN0YXRlLFxuICAgICAgICAgIG1vZGUsXG4gICAgICAgICAgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMsXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBjdHgud2FpdCh7IHNlY29uZHM6IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTIH0pO1xuICAgICAgICBsb29wQ291bnQgKz0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBmb3JtYXRSZXNvdXJjZVBvbGxpbmdGYWlsdXJlKCdVbmV4cGVjdGVkSW5zdGFuY2VTdGF0ZScsIHtcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgbW9kZSxcbiAgICAgICAgY3VycmVudFN0YXRlLFxuICAgICAgICBsb29wQ291bnQsXG4gICAgICAgIGxpbWl0czogcG9sbGluZ0xpbWl0cyxcbiAgICAgIH0pO1xuICAgICAgY3R4LmxvZ2dlci5lcnJvcigncHJvY2Vzc09uZVJlc291cmNlOiB1bmV4cGVjdGVkIHN0YXRlJywge1xuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBtb2RlLFxuICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgIGxvb3BDb3VudCxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgfSB3aGlsZSAoIWlzRGVzaXJlZFN0YWJsZVN0YXRlKHBhcmFtcy5Nb2RlLCBjdXJyZW50U3RhdGUpKTtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogcmVhY2hlZCBkZXNpcmVkIHN0YWJsZSBzdGF0ZScsIHtcbiAgICBpZGVudGlmaWVyLFxuICAgIGZpbmFsU3RhdGU6IGN1cnJlbnRTdGF0ZSxcbiAgICBtb2RlOiBwYXJhbXMuTW9kZSxcbiAgICBsb29wQ291bnQsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgaWRlbnRpZmllcixcbiAgICBhY2NvdW50LFxuICAgIHJlZ2lvbixcbiAgICByZXNvdXJjZTogdGFyZ2V0UmVzb3VyY2UsXG4gICAgc3RhdHVzOiBjdXJyZW50U3RhdGUsXG4gIH07XG59O1xuXG4vKipcbiAqIER1cmFibGUgTGFtYmRhIGVudHJ5IHBvaW50IGZvciB0aGUgRUMyIHJ1bm5pbmcgc2NoZWR1bGVyLlxuICpcbiAqIFJlc29sdmVzIGluc3RhbmNlcyB2aWEgUmVzb3VyY2UgR3JvdXBzIFRhZ2dpbmcgQVBJLCBydW5zIHtAbGluayBwcm9jZXNzT25lUmVzb3VyY2V9IGZvciBlYWNoIEFSTlxuICogaW4gcGFyYWxsZWwgKGJvdW5kZWQgY29uY3VycmVuY3kpLCBwb3N0cyBhIHBhcmVudCBTbGFjayBtZXNzYWdlIGFuZCBwZXItaW5zdGFuY2UgdGhyZWFkIHJlcGxpZXMsXG4gKiBhbmQgdXNlcyBkdXJhYmxlIGBzdGVwYCAvIGB3YWl0YCAvIGBtYXBgIHNvIHRoZSBydW4gY2FuIHJlc3VtZSBhY3Jvc3Mgc3VzcGVuc2lvbnMuXG4gKlxuICogUmVhZHMgcGVyLWluc3RhbmNlIHBvbGxpbmcgbGltaXRzIGZyb20gYFBST0NFU1NfUkVTT1VSQ0VfTUFYX0xPT1BfQ09VTlRgIGFuZFxuICogYFBST0NFU1NfUkVTT1VSQ0VfTUFYX0VMQVBTRURfU0VDT05EU2AgdmlhIHtAbGluayBwYXJzZVJlc291cmNlUG9sbGluZ0xpbWl0c0Zyb21FbnZ9LlxuICpcbiAqIEBwYXJhbSBldmVudCAtIFBheWxvYWQgZnJvbSBFdmVudEJyaWRnZSBTY2hlZHVsZXI7IG11c3QgaW5jbHVkZSBgUGFyYW1zLlRhZ0tleWAsIGBQYXJhbXMuVGFnVmFsdWVzYCwgYFBhcmFtcy5Nb2RlYC5cbiAqIEBwYXJhbSBjdHggLSBSb290IGR1cmFibGUgZXhlY3V0aW9uIGNvbnRleHQuXG4gKiBAcmV0dXJuc1xuICogLSBgeyBzdGF0dXM6ICdUYXJnZXRSZXNvdXJjZXNOb3RGb3VuZCcgfWAgd2hlbiBubyBpbnN0YW5jZXMgbWF0Y2ggdGhlIHRhZyBmaWx0ZXIuXG4gKiAtIGB7IHN0YXR1czogJ0NvbXBsZXRlZCcsIHByb2Nlc3NlZCwgcmVzdWx0cyB9YCB3aGVuIGluc3RhbmNlcyB3ZXJlIGhhbmRsZWQgKGByZXN1bHRzYCBlbnRyaWVzIG1hdGNoIHtAbGluayBwcm9jZXNzT25lUmVzb3VyY2V9IHJldHVybiBzaGFwZSkuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYFBhcmFtc2AgaXMgaW52YWxpZCwgcG9sbGluZyBlbnYgdmFycyBhcmUgaW52YWxpZCwgYFNMQUNLX1NFQ1JFVF9OQU1FYCBpcyB1bnNldCxcbiAqICAgdGhlIFNsYWNrIHNlY3JldCBpcyBpbmNvbXBsZXRlLCBvciBpbnN0YW5jZSBwcm9jZXNzaW5nIGZhaWxzIChpbmNsdWRpbmcgYFJlc291cmNlUG9sbGluZ0ZhaWxlZDoqYCBlcnJvcnMpLlxuICovXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IHdpdGhEdXJhYmxlRXhlY3V0aW9uKGFzeW5jIChldmVudDogU2NoZWR1bGVyRXZlbnQsIGN0eDogRHVyYWJsZUNvbnRleHQpID0+IHtcblxuICBjb25zdCBwYXJhbXMgPSBldmVudC5QYXJhbXM7XG5cbiAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogaW52b2NhdGlvbicsIHtcbiAgICBtb2RlOiBwYXJhbXM/Lk1vZGUsXG4gICAgdGFnS2V5OiBwYXJhbXM/LlRhZ0tleSxcbiAgICB0YWdWYWx1ZUNvdW50OiBwYXJhbXM/LlRhZ1ZhbHVlcz8ubGVuZ3RoID8/IDAsXG4gIH0pO1xuXG4gIGlmICghcGFyYW1zPy5UYWdLZXkgfHwgIXBhcmFtcz8uVGFnVmFsdWVzIHx8ICFwYXJhbXM/Lk1vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZXZlbnQ6IFBhcmFtcy5UYWdLZXksIFBhcmFtcy5UYWdWYWx1ZXMsIFBhcmFtcy5Nb2RlIGFyZSByZXF1aXJlZC4nKTtcbiAgfVxuXG4gIGNvbnN0IHBvbGxpbmdMaW1pdHMgPSBwYXJzZVJlc291cmNlUG9sbGluZ0xpbWl0c0Zyb21FbnYoKTtcblxuICAvLyBzYWZlIGdldCBTZWNyZXRzIG5hbWUgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICBjb25zdCBzbGFja1NlY3JldE5hbWUgPSBTYWZlRW52R2V0dGVyLmdldEVudignU0xBQ0tfU0VDUkVUX05BTUUnKTtcblxuICBjb25zdCBzbGFja1NlY3JldFZhbHVlID0gYXdhaXQgY3R4LnN0ZXAoJ2ZldGNoLXNsYWNrLXNlY3JldCcsIGFzeW5jICgpID0+IHtcbiAgICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBmZXRjaGluZyBTbGFjayBzZWNyZXQnLCB7IHNlY3JldE5hbWU6IHNsYWNrU2VjcmV0TmFtZSB9KTtcbiAgICByZXR1cm4gc2VjcmV0RmV0Y2hlci5nZXRTZWNyZXRWYWx1ZTxTbGFja1NlY3JldD4oc2xhY2tTZWNyZXROYW1lKTtcbiAgfSk7XG5cbiAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogU2xhY2sgc2VjcmV0IGxvYWRlZCcpO1xuXG4gIGlmICghc2xhY2tTZWNyZXRWYWx1ZT8udG9rZW4gfHwgIXNsYWNrU2VjcmV0VmFsdWU/LmNoYW5uZWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NsYWNrIHNlY3JldCBtdXN0IGNvbnRhaW4gdG9rZW4gYW5kIGNoYW5uZWwuJyk7XG4gIH1cblxuICBjb25zdCB0YXJnZXRSZXNvdXJjZXMgPSBhd2FpdCBjdHguc3RlcCgnZ2V0LXRhcmdldC1yZXNvdXJjZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFJlc291cmNlR3JvdXBzVGFnZ2luZ0FQSUNsaWVudCh7fSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnNlbmQoXG4gICAgICBuZXcgR2V0UmVzb3VyY2VzQ29tbWFuZCh7XG4gICAgICAgIFJlc291cmNlVHlwZUZpbHRlcnM6IFsnZWMyOmluc3RhbmNlJ10sXG4gICAgICAgIFRhZ0ZpbHRlcnM6IFt7IEtleTogcGFyYW1zLlRhZ0tleSwgVmFsdWVzOiBwYXJhbXMuVGFnVmFsdWVzIH1dLFxuICAgICAgfSksXG4gICAgKTtcbiAgICBjb25zdCBhcm5zID0gKHJlc3VsdC5SZXNvdXJjZVRhZ01hcHBpbmdMaXN0ID8/IFtdKVxuICAgICAgLm1hcCgobTogeyBSZXNvdXJjZUFSTj86IHN0cmluZyB9KSA9PiBtLlJlc291cmNlQVJOKVxuICAgICAgLmZpbHRlcigoYXJuOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhcm4gaXMgc3RyaW5nID0+IGFybiAhPSBudWxsKTtcbiAgICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBnZXQtdGFyZ2V0LXJlc291cmNlcyBkb25lJywgeyBjb3VudDogYXJucy5sZW5ndGggfSk7XG4gICAgcmV0dXJuIGFybnM7XG4gIH0pO1xuXG4gIGlmICh0YXJnZXRSZXNvdXJjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogbm8gbWF0Y2hpbmcgaW5zdGFuY2VzJywgeyB0YWdLZXk6IHBhcmFtcy5UYWdLZXkgfSk7XG4gICAgcmV0dXJuIHsgc3RhdHVzOiAnVGFyZ2V0UmVzb3VyY2VzTm90Rm91bmQnIGFzIGNvbnN0IH07XG4gIH1cblxuICBjb25zdCBjbGllbnQgPSBuZXcgV2ViQ2xpZW50KHNsYWNrU2VjcmV0VmFsdWUudG9rZW4pO1xuICBjb25zdCBjaGFubmVsID0gc2xhY2tTZWNyZXRWYWx1ZS5jaGFubmVsO1xuXG4gIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IHBvc3RpbmcgcGFyZW50IFNsYWNrIG1lc3NhZ2UnLCB7XG4gICAgaW5zdGFuY2VDb3VudDogdGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCxcbiAgfSk7XG5cbiAgLy8gc2VuZCBzbGFjayBtZXNzYWdlXG4gIGNvbnN0IHNsYWNrUGFyZW50TWVzc2FnZVJlc3VsdCA9IGF3YWl0IGN0eC5zdGVwKCdwb3N0LXNsYWNrLW1lc3NhZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIHJldHVybiBjbGllbnQuY2hhdC5wb3N0TWVzc2FnZSh7XG4gICAgICBjaGFubmVsLFxuICAgICAgdGV4dDogYCR7cGFyYW1zLk1vZGUgPT09ICdTdGFydCcgPyAn8J+YhiBTdGFydHMnIDogJ/CfpbEgU3RvcHMnfSB0aGUgc2NoZWR1bGVkIEVDMiBJbnN0YW5jZS5gLFxuICAgIH0pO1xuICB9KTtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBwYXJlbnQgU2xhY2sgbWVzc2FnZSBwb3N0ZWQnLCB7XG4gICAgdGhyZWFkVHM6IHNsYWNrUGFyZW50TWVzc2FnZVJlc3VsdD8udHMgPz8gbnVsbCxcbiAgfSk7XG5cbiAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogc3RhcnRpbmcgcGFyYWxsZWwgaW5zdGFuY2UgcHJvY2Vzc2luZycsIHtcbiAgICBjb3VudDogdGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCxcbiAgICBtYXhDb25jdXJyZW5jeTogMTAsXG4gIH0pO1xuXG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBjdHgubWFwKFxuICAgIHRhcmdldFJlc291cmNlcyxcbiAgICAvLyBhc3luYyAoY3R4OiBEdXJhYmxlQ29udGV4dCwgdGFyZ2V0UmVzb3VyY2U6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT5cbiAgICAvLyAgIGN0eC5zdGVwKGBwcm9jZXNzLXJlc291cmNlLSR7aW5kZXh9YCwgYXN5bmMgKCkgPT5cbiAgICAvLyAgICAgcHJvY2Vzc09uZVJlc291cmNlKGN0eCwgdGFyZ2V0UmVzb3VyY2UsIHBhcmFtcywgaW5kZXgpLFxuICAgIC8vICAgKSxcbiAgICBhc3luYyAobWFwQ3R4OiBEdXJhYmxlQ29udGV4dCwgdGFyZ2V0UmVzb3VyY2U6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgcmV0dXJuIG1hcEN0eC5ydW5JbkNoaWxkQ29udGV4dChgcmVzb3VyY2UtJHtpbmRleH1gLCBhc3luYyAoY2hpbGRDdHg6IER1cmFibGVDb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb2Nlc3NPbmVSZXNvdXJjZShjaGlsZEN0eCwgdGFyZ2V0UmVzb3VyY2UsIHBhcmFtcywgaW5kZXgsIHBvbGxpbmdMaW1pdHMpO1xuICAgICAgICAvLyBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ3NraXBwZWQnKSB7XG4gICAgICAgIC8vICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgLy8gfVxuICAgICAgICBjaGlsZEN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IHBvc3RpbmcgdGhyZWFkIFNsYWNrIG1lc3NhZ2UnLCB7XG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgaWRlbnRpZmllcjogcmVzdWx0LmlkZW50aWZpZXIsXG4gICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gc2VuZCBzbGFjayB0aHJlYWQgbWVzc2FnZVxuICAgICAgICBhd2FpdCBjaGlsZEN0eC5zdGVwKCdwb3N0LXNsYWNrLWNoaWxkLW1lc3NhZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRpc3BsYXkgPSBnZXRTdGF0ZURpc3BsYXkocmVzdWx0LnN0YXR1cyk7XG5cbiAgICAgICAgICByZXR1cm4gY2xpZW50LmNoYXQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgIHRocmVhZF90czogc2xhY2tQYXJlbnRNZXNzYWdlUmVzdWx0Py50cyxcbiAgICAgICAgICAgIGF0dGFjaG1lbnRzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb2xvcjogJyMzNmE2NGYnLFxuICAgICAgICAgICAgICAgIHByZXRleHQ6IGAke2Rpc3BsYXk/LmVtb2ppfSBUaGUgc3RhdHVzIG9mIHRoZSBFQzIgSW5zdGFuY2UgJHtyZXN1bHQuaWRlbnRpZmllcn0gY2hhbmdlZCB0byAke2Rpc3BsYXk/Lm5hbWV9IGR1ZSB0byB0aGUgc2NoZWR1bGUuYCxcbiAgICAgICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICAgICAgIHsgdGl0bGU6ICdBY2NvdW50JywgdmFsdWU6IHJlc3VsdC5hY2NvdW50LCBzaG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgeyB0aXRsZTogJ1JlZ2lvbicsIHZhbHVlOiByZXN1bHQucmVnaW9uLCBzaG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgeyB0aXRsZTogJ0lkZW50aWZpZXInLCB2YWx1ZTogcmVzdWx0LmlkZW50aWZpZXIsIHNob3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgICB7IHRpdGxlOiAnU3RhdHVzJywgdmFsdWU6IChkaXNwbGF5Py5uYW1lID8/ICdVbmtub3duJyksIHNob3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfSxcbiAgICB7IG1heENvbmN1cnJlbmN5OiAxMCB9LFxuICApO1xuXG4gIGNvbnN0IHJlc3VsdExpc3QgPSBBcnJheS5pc0FycmF5KHJlc3VsdHMpID8gcmVzdWx0cyA6IFtdO1xuICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBjb21wbGV0ZWQnLCB7XG4gICAgcHJvY2Vzc2VkOiB0YXJnZXRSZXNvdXJjZXMubGVuZ3RoLFxuICAgIHJlc3VsdENvdW50OiByZXN1bHRMaXN0Lmxlbmd0aCxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiAnQ29tcGxldGVkJyBhcyBjb25zdCxcbiAgICBwcm9jZXNzZWQ6IHRhcmdldFJlc291cmNlcy5sZW5ndGgsXG4gICAgcmVzdWx0czogcmVzdWx0TGlzdCxcbiAgfTtcbn0pO1xuIl19
341
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXIubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Z1bmNzL3J1bm5pbmctc2NoZWR1bGVyLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7R0FPRzs7O0FBRUgsNEVBQTBGO0FBQzFGLG9EQUs2QjtBQUM3QixvR0FBa0g7QUFDbEgsNENBQTJDO0FBQzNDLHlFQUFzRjtBQUN0Riw2REFBdUU7QUFDdkUsaUZBTXdDO0FBQ3hDLDZFQUE4RTtBQUU5RSx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLEdBQUc7SUFDakIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtJQUNsRCxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0NBQzFDLENBQUM7QUFFWDs7OztHQUlHO0FBQ0gsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUM7QUFFdEM7Ozs7O0dBS0c7QUFDSCxNQUFNLDBCQUEwQixHQUEwQjtJQUN4RCxTQUFTLEVBQUUsSUFBSTtJQUNmLE9BQU8sRUFBRSxDQUFDO0lBQ1YsYUFBYSxFQUFFLEdBQUc7Q0FDbkIsQ0FBQztBQTJCRjs7Ozs7R0FLRztBQUNILE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBZSxFQUErQyxFQUFFO0lBQ3ZGLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLENBQUM7SUFDMUQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3RFLENBQUMs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QUNwQixDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVDMiBSdW5uaW5nIFNjaGVkdWxlciDigJMgRHVyYWJsZSBGdW5jdGlvbnMgaW1wbGVtZW50YXRpb24uXG4gKlxuICogSW1wbGVtZW50cyB0aGUgcnVubmluZy1jb250cm9sIGZsb3cgdXNpbmcgQVdTIExhbWJkYSBEdXJhYmxlIEV4ZWN1dGlvbi5cbiAqIFN0ZXAgY2hlY2twb2ludHMsIHdhaXQgKG5vIGNoYXJnZSksIGFuZCBwYXJhbGxlbCBtYXAgcHJvdmlkZSBhIGZsb3cgZXF1aXZhbGVudCB0byBTdGVwIEZ1bmN0aW9ucy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYW1iZGEvbGF0ZXN0L2RnL2R1cmFibGUtZXhlY3V0aW9uLXNkay5odG1sXG4gKi9cblxuaW1wb3J0IHsgd2l0aER1cmFibGVFeGVjdXRpb24sIHR5cGUgRHVyYWJsZUNvbnRleHQgfSBmcm9tICdAYXdzL2R1cmFibGUtZXhlY3V0aW9uLXNkay1qcyc7XG5pbXBvcnQge1xuICBFQzJDbGllbnQsXG4gIERlc2NyaWJlSW5zdGFuY2VzQ29tbWFuZCxcbiAgU3RhcnRJbnN0YW5jZXNDb21tYW5kLFxuICBTdG9wSW5zdGFuY2VzQ29tbWFuZCxcbn0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWVjMic7XG5pbXBvcnQgeyBHZXRSZXNvdXJjZXNDb21tYW5kLCBSZXNvdXJjZUdyb3Vwc1RhZ2dpbmdBUElDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtcmVzb3VyY2UtZ3JvdXBzLXRhZ2dpbmctYXBpJztcbmltcG9ydCB7IFdlYkNsaWVudCB9IGZyb20gJ0BzbGFjay93ZWItYXBpJztcbmltcG9ydCB7IHNlY3JldEZldGNoZXIsIHR5cGUgR2V0U2VjcmV0VmFsdWVPcHRpb25zIH0gZnJvbSAnYXdzLWxhbWJkYS1zZWNyZXQtZmV0Y2hlcic7XG5pbXBvcnQgeyBTdHJpY3RFbnZSZXNvbHZlciwgU3RyaWN0RW52VHlwZSB9IGZyb20gJ3N0cmljdC1lbnYtcmVzb2x2ZXInO1xuaW1wb3J0IHtcbiAgZm9ybWF0UmVzb3VyY2VXYWl0RmFpbHVyZSxcbiAgZ2V0V2FpdEFib3J0UmVhc29uLFxuICBpc0Rlc2lyZWRTdGFibGVTdGF0ZSxcbiAgaXNUcmFuc2l0aW9uaW5nU3RhdGUsXG4gIHR5cGUgUmVzb3VyY2VXYWl0TGltaXRzLFxufSBmcm9tICcuL3J1bm5pbmctc2NoZWR1bGVyLXByZWRpY2F0ZXMnO1xuaW1wb3J0IHsgcGFyc2VSZXNvdXJjZVdhaXRMaW1pdHNGcm9tRW52IH0gZnJvbSAnLi9ydW5uaW5nLXNjaGVkdWxlci13YWl0LWVudic7XG5cbi8qKiBNYXBwaW5nIG9mIEVDMiBpbnN0YW5jZSBzdGF0ZSB0byBkaXNwbGF5IG5hbWUgYW5kIGVtb2ppIGZvciBTbGFjay4gKi9cbmNvbnN0IFNUQVRFX0xJU1QgPSBbXG4gIHsgbmFtZTogJ1JVTk5JTkcnLCBlbW9qaTogJ/CfmIYnLCBzdGF0ZTogJ3J1bm5pbmcnIH0sXG4gIHsgbmFtZTogJ1NUT1BQRUQnLCBlbW9qaTogJ/CfmLQnLCBzdGF0ZTogJ3N0b3BwZWQnIH0sXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIFNlY29uZHMgdG8gd2FpdCBiZXR3ZWVuIGRlc2NyaWJlIGl0ZXJhdGlvbnMgYWZ0ZXIgc3RhcnQvc3RvcCBvciB3aGlsZSB0cmFuc2l0aW9uaW5nLlxuICpcbiAqIFVzZWQgd2l0aCB7QGxpbmsgcHJvY2Vzc09uZVJlc291cmNlfSBkdXJhYmxlIGB3YWl0YCBjYWxscyBiZXR3ZWVuIGRlc2NyaWJlIGl0ZXJhdGlvbnMuXG4gKi9cbmNvbnN0IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTID0gMjA7XG5cbi8qKlxuICogT3B0aW9ucyBwYXNzZWQgdG8ge0BsaW5rIHNlY3JldEZldGNoZXIuZ2V0U2VjcmV0VmFsdWV9IHdoZW4gbG9hZGluZyB0aGUgU2xhY2sgc2VjcmV0LlxuICpcbiAqIFJldHJpZXMgY292ZXIgdHJhbnNpZW50IGV4dGVuc2lvbiBIVFRQIGVycm9ycyAoNXh4LCA0MjkpIGFuZCB0aGUgZXh0ZW5zaW9uXG4gKiBcIm5vdCByZWFkeSB0byBzZXJ2ZSB0cmFmZmljXCIgcmVzcG9uc2UgZHVyaW5nIGNvbGQgc3RhcnRzLlxuICovXG5jb25zdCBTTEFDS19TRUNSRVRfRkVUQ0hfT1BUSU9OUzogR2V0U2VjcmV0VmFsdWVPcHRpb25zID0ge1xuICB0aW1lb3V0TXM6IDMwMDAsXG4gIHJldHJpZXM6IDUsXG4gIGJhc2VCYWNrb2ZmTXM6IDMwMCxcbn07XG5cbi8qKlxuICogRXZlbnQgcGF5bG9hZCBmcm9tIEV2ZW50QnJpZGdlIFNjaGVkdWxlciBpbnZva2luZyB0aGlzIExhbWJkYS5cbiAqXG4gKiBAc2VlIHtAbGluayBoYW5kbGVyfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlckV2ZW50IHtcbiAgLyoqIFNjaGVkdWxlciBpbnZvY2F0aW9uIHBhcmFtZXRlcnMgKHRhZyBmaWx0ZXIgYW5kIHN0YXJ0L3N0b3AgbW9kZSkuICovXG4gIFBhcmFtczoge1xuICAgIC8qKiBUYWcga2V5IHVzZWQgdG8gc2VsZWN0IEVDMiBpbnN0YW5jZXMuICovXG4gICAgVGFnS2V5OiBzdHJpbmc7XG4gICAgLyoqIFRhZyB2YWx1ZXMgdG8gbWF0Y2guICovXG4gICAgVGFnVmFsdWVzOiBzdHJpbmdbXTtcbiAgICAvKiogV2hldGhlciB0byBzdGFydCBvciBzdG9wIGluc3RhbmNlcy4gKi9cbiAgICBNb2RlOiAnU3RhcnQnIHwgJ1N0b3AnO1xuICB9O1xufVxuXG4vKiogU2xhY2sgY3JlZGVudGlhbHMgYW5kIGRlZmF1bHQgY2hhbm5lbCBsb2FkZWQgZnJvbSBTZWNyZXRzIE1hbmFnZXIgKGBTTEFDS19TRUNSRVRfTkFNRWApLiAqL1xuaW50ZXJmYWNlIFNsYWNrU2VjcmV0IHtcbiAgLyoqIFNsYWNrIGJvdCB0b2tlbiBmb3IgdGhlIFNsYWNrIGBXZWJDbGllbnRgLiAqL1xuICB0b2tlbjogc3RyaW5nO1xuICAvKiogQ2hhbm5lbCBJRCBvciBuYW1lIHBhc3NlZCB0byBgY2hhdC5wb3N0TWVzc2FnZWAuICovXG4gIGNoYW5uZWw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGRpc3BsYXkgbmFtZSBhbmQgZW1vamkgZm9yIGFuIEVDMiBpbnN0YW5jZSBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0gY3VycmVudCAtIEN1cnJlbnQgaW5zdGFuY2Ugc3RhdGUgKGUuZy4gJ3J1bm5pbmcnLCAnc3RvcHBlZCcpLlxuICogQHJldHVybnMgRGlzcGxheSBpbmZvIG9yIHVuZGVmaW5lZCBpZiBzdGF0ZSBpcyBub3QgaW4gU1RBVEVfTElTVC5cbiAqL1xuY29uc3QgZ2V0U3RhdGVEaXNwbGF5ID0gKGN1cnJlbnQ6IHN0cmluZyk6IHsgZW1vamk6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0gfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBmb3VuZCA9IFNUQVRFX0xJU1QuZmluZCgocykgPT4gcy5zdGF0ZSA9PT0gY3VycmVudCk7XG4gIHJldHVybiBmb3VuZCA/IHsgZW1vamk6IGZvdW5kLmVtb2ppLCBuYW1lOiBmb3VuZC5uYW1lIH0gOiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBvbmUgRUMyIGluc3RhbmNlOiBkZXNjcmliZXMgc3RhdGUsIGlzc3VlcyBzdGFydC9zdG9wIHdoZW4gbmVlZGVkLCB0aGVuIHdhaXRzIHVudGlsXG4gKiB7QGxpbmsgaXNEZXNpcmVkU3RhYmxlU3RhdGV9IGlzIHNhdGlzZmllZCAoZHVyYWJsZSBgc3RlcGAgLyBgd2FpdGAgYmV0d2VlbiBhdHRlbXB0cykuXG4gKlxuICogRWFjaCBsb29wIGl0ZXJhdGlvbiBjaGVja3Mge0BsaW5rIGdldFdhaXRBYm9ydFJlYXNvbn0gYmVmb3JlIGRlc2NyaWJlLiBGYWlsdXJlcyB1c2VcbiAqIHtAbGluayBmb3JtYXRSZXNvdXJjZVdhaXRGYWlsdXJlfSAoYFJlc291cmNlV2FpdEZhaWxlZDoqYCBtZXNzYWdlIHByZWZpeCkuXG4gKlxuICogQHBhcmFtIGN0eCAtIER1cmFibGUgZXhlY3V0aW9uIGNvbnRleHQgKGNoaWxkIGNvbnRleHQgcGVyIGluc3RhbmNlIHJlY29tbWVuZGVkKS5cbiAqIEBwYXJhbSB0YXJnZXRSZXNvdXJjZSAtIEVDMiBpbnN0YW5jZSBBUk4uXG4gKiBAcGFyYW0gcGFyYW1zIC0gU2NoZWR1bGVyIHBhcmFtcyAoYFRhZ0tleWAsIGBUYWdWYWx1ZXNgLCBgTW9kZWApLlxuICogQHBhcmFtIHJlc291cmNlSW5kZXggLSBJbmRleCB1c2VkIGluIGR1cmFibGUgc3RlcCBuYW1lcyBmb3IgdGhpcyByZXNvdXJjZS5cbiAqIEBwYXJhbSB3YWl0TGltaXRzIC0gUGVyLWluc3RhbmNlIGNhcHMgZnJvbSB7QGxpbmsgcGFyc2VSZXNvdXJjZVdhaXRMaW1pdHNGcm9tRW52fSAoc2V0IGJ5IHRoZSBDREsgY29uc3RydWN0KS5cbiAqIEByZXR1cm5zIEZpbmFsIHJlc291cmNlIEFSTiwgRUMyIHN0YXRlIG5hbWUsIHBhcnNlZCBhY2NvdW50LCByZWdpb24sIGFuZCBpbnN0YW5jZSBpZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIHdhaXQgbGltaXRzIGFyZSBleGNlZWRlZCAoYE1heExvb3BDb3VudEV4Y2VlZGVkYCwgYE1heEVsYXBzZWRUaW1lRXhjZWVkZWRgKSxcbiAqICAgdGhlIGluc3RhbmNlIGlzIGluIGFuIHVuZXhwZWN0ZWQgc3RhdGUgKGBVbmV4cGVjdGVkSW5zdGFuY2VTdGF0ZWApLCBvciB0aGUgbG9vcCBleGl0cyB3aXRob3V0IGEgc3RhYmxlIGdvYWwgc3RhdGUuXG4gKi9cbmNvbnN0IHByb2Nlc3NPbmVSZXNvdXJjZSA9IGFzeW5jIChcbiAgY3R4OiBEdXJhYmxlQ29udGV4dCxcbiAgdGFyZ2V0UmVzb3VyY2U6IHN0cmluZyxcbiAgcGFyYW1zOiBTY2hlZHVsZXJFdmVudFsnUGFyYW1zJ10sXG4gIHJlc291cmNlSW5kZXg6IG51bWJlcixcbiAgd2FpdExpbWl0czogUmVzb3VyY2VXYWl0TGltaXRzLFxuKTogUHJvbWlzZTx7IHJlc291cmNlOiBzdHJpbmc7IHN0YXR1czogc3RyaW5nOyBhY2NvdW50OiBzdHJpbmc7IHJlZ2lvbjogc3RyaW5nOyBpZGVudGlmaWVyOiBzdHJpbmcgfT4gPT4ge1xuICBjb25zdCBwYXJ0cyA9IHRhcmdldFJlc291cmNlLnNwbGl0KCcvJyk7XG4gIGNvbnN0IGlkZW50aWZpZXIgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA/PyAndW5rbm93bic7XG4gIGNvbnN0IGFyblBhcnRzID0gdGFyZ2V0UmVzb3VyY2Uuc3BsaXQoJzonKTtcbiAgY29uc3QgYWNjb3VudCA9IGFyblBhcnRzWzRdID8/ICcnO1xuICBjb25zdCByZWdpb24gPSBhcm5QYXJ0c1szXSA/PyAnJztcbiAgY29uc3Qgc3RlcFByZWZpeCA9IGByZXNvdXJjZS0ke3Jlc291cmNlSW5kZXh9LSR7aWRlbnRpZmllcn1gO1xuXG4gIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiBzdGFydCcsIHtcbiAgICByZXNvdXJjZUluZGV4LFxuICAgIGlkZW50aWZpZXIsXG4gICAgcmVnaW9uLFxuICAgIGFjY291bnQsXG4gICAgbW9kZTogcGFyYW1zLk1vZGUsXG4gICAgbWF4TG9vcENvdW50OiB3YWl0TGltaXRzLm1heExvb3BDb3VudCxcbiAgICBtYXhFbGFwc2VkU2Vjb25kczogd2FpdExpbWl0cy5tYXhFbGFwc2VkU2Vjb25kcyxcbiAgfSk7XG5cbiAgY29uc3Qgc3RhcnRlZEF0TXMgPSBhd2FpdCBjdHguc3RlcChgJHtzdGVwUHJlZml4fS13YWl0LXN0YXJ0ZWQtYXRgLCBhc3luYyAoKSA9PiBEYXRlLm5vdygpKTtcblxuICBsZXQgbG9vcENvdW50ID0gMDtcbiAgbGV0IGN1cnJlbnRTdGF0ZSA9ICcnO1xuICBkbyB7XG4gICAgY29uc3QgYWJvcnRSZWFzb24gPSBhd2FpdCBjdHguc3RlcChgJHtzdGVwUHJlZml4fS13YWl0LWxpbWl0LWNoZWNrLSR7bG9vcENvdW50fWAsIGFzeW5jICgpID0+XG4gICAgICBnZXRXYWl0QWJvcnRSZWFzb24obG9vcENvdW50LCBzdGFydGVkQXRNcywgRGF0ZS5ub3coKSwgd2FpdExpbWl0cyksXG4gICAgKTtcbiAgICBpZiAoYWJvcnRSZWFzb24pIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBmb3JtYXRSZXNvdXJjZVdhaXRGYWlsdXJlKGFib3J0UmVhc29uLCB7XG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIG1vZGU6IHBhcmFtcy5Nb2RlLFxuICAgICAgICBjdXJyZW50U3RhdGU6IGN1cnJlbnRTdGF0ZSB8fCAndW5rbm93bicsXG4gICAgICAgIGxvb3BDb3VudCxcbiAgICAgICAgbGltaXRzOiB3YWl0TGltaXRzLFxuICAgICAgfSk7XG4gICAgICBjdHgubG9nZ2VyLmVycm9yKCdwcm9jZXNzT25lUmVzb3VyY2U6IHdhaXQgbGltaXQgZXhjZWVkZWQnLCB7XG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIGFib3J0UmVhc29uLFxuICAgICAgICBsb29wQ291bnQsXG4gICAgICAgIGN1cnJlbnRTdGF0ZSxcbiAgICAgICAgbWF4TG9vcENvdW50OiB3YWl0TGltaXRzLm1heExvb3BDb3VudCxcbiAgICAgICAgbWF4RWxhcHNlZFNlY29uZHM6IHdhaXRMaW1pdHMubWF4RWxhcHNlZFNlY29uZHMsXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBjdXJyZW50U3RhdGUgPSBhd2FpdCBjdHguc3RlcChgJHtzdGVwUHJlZml4fS1kZXNjcmliZS0ke2xvb3BDb3VudH1gLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlYzIgPSBuZXcgRUMyQ2xpZW50KHt9KTtcbiAgICAgIGNvbnN0IG91dCA9IGF3YWl0IGVjMi5zZW5kKG5ldyBEZXNjcmliZUluc3RhbmNlc0NvbW1hbmQoeyBJbnN0YW5jZUlkczogW2lkZW50aWZpZXJdIH0pKTtcbiAgICAgIHJldHVybiBvdXQuUmVzZXJ2YXRpb25zPy5bMF0/Lkluc3RhbmNlcz8uWzBdPy5TdGF0ZT8uTmFtZSA/PyAndW5rbm93bic7XG4gICAgfSk7XG5cbiAgICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogZGVzY3JpYmVkJywge1xuICAgICAgaWRlbnRpZmllcixcbiAgICAgIGxvb3BDb3VudCxcbiAgICAgIGN1cnJlbnRTdGF0ZSxcbiAgICAgIG1vZGU6IHBhcmFtcy5Nb2RlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbW9kZSA9IHBhcmFtcy5Nb2RlO1xuXG4gICAgaWYgKG1vZGUgPT09ICdTdGFydCcgJiYgY3VycmVudFN0YXRlID09PSAnc3RvcHBlZCcpIHtcbiAgICAgIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiBzdGFydGluZyBpbnN0YW5jZScsIHsgaWRlbnRpZmllciwgbG9vcENvdW50IH0pO1xuICAgICAgYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tc3RhcnQtJHtsb29wQ291bnR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlYzIgPSBuZXcgRUMyQ2xpZW50KHt9KTtcbiAgICAgICAgYXdhaXQgZWMyLnNlbmQobmV3IFN0YXJ0SW5zdGFuY2VzQ29tbWFuZCh7IEluc3RhbmNlSWRzOiBbaWRlbnRpZmllcl0gfSkpO1xuICAgICAgfSk7XG4gICAgICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogd2FpdCBhZnRlciBzdGFydCcsIHtcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGN0eC53YWl0KHsgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMgfSk7XG4gICAgICBsb29wQ291bnQgKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChtb2RlID09PSAnU3RvcCcgJiYgY3VycmVudFN0YXRlID09PSAncnVubmluZycpIHtcbiAgICAgIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiBzdG9wcGluZyBpbnN0YW5jZScsIHsgaWRlbnRpZmllciwgbG9vcENvdW50IH0pO1xuICAgICAgYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tc3RvcC0ke2xvb3BDb3VudH1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVjMiA9IG5ldyBFQzJDbGllbnQoe30pO1xuICAgICAgICBhd2FpdCBlYzIuc2VuZChuZXcgU3RvcEluc3RhbmNlc0NvbW1hbmQoeyBJbnN0YW5jZUlkczogW2lkZW50aWZpZXJdIH0pKTtcbiAgICAgIH0pO1xuICAgICAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IHdhaXQgYWZ0ZXIgc3RvcCcsIHtcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGN0eC53YWl0KHsgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMgfSk7XG4gICAgICBsb29wQ291bnQgKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghaXNEZXNpcmVkU3RhYmxlU3RhdGUobW9kZSwgY3VycmVudFN0YXRlKSkge1xuICAgICAgaWYgKGlzVHJhbnNpdGlvbmluZ1N0YXRlKG1vZGUsIGN1cnJlbnRTdGF0ZSkpIHtcbiAgICAgICAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IHdhaXQgd2hpbGUgdHJhbnNpdGlvbmluZycsIHtcbiAgICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICAgIGxvb3BDb3VudCxcbiAgICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgICAgbW9kZSxcbiAgICAgICAgICBzZWNvbmRzOiBTVEFUVVNfQ0hBTkdFX1dBSVRfU0VDT05EUyxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IGN0eC53YWl0KHsgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMgfSk7XG4gICAgICAgIGxvb3BDb3VudCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVzc2FnZSA9IGZvcm1hdFJlc291cmNlV2FpdEZhaWx1cmUoJ1VuZXhwZWN0ZWRJbnN0YW5jZVN0YXRlJywge1xuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBtb2RlLFxuICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgIGxvb3BDb3VudCxcbiAgICAgICAgbGltaXRzOiB3YWl0TGltaXRzLFxuICAgICAgfSk7XG4gICAgICBjdHgubG9nZ2VyLmVycm9yKCdwcm9jZXNzT25lUmVzb3VyY2U6IHVuZXhwZWN0ZWQgc3RhdGUnLCB7XG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIG1vZGUsXG4gICAgICAgIGN1cnJlbnRTdGF0ZSxcbiAgICAgICAgbG9vcENvdW50LFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9IHdoaWxlICghaXNEZXNpcmVkU3RhYmxlU3RhdGUocGFyYW1zLk1vZGUsIGN1cnJlbnRTdGF0ZSkpO1xuXG4gIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiByZWFjaGVkIGRlc2lyZWQgc3RhYmxlIHN0YXRlJywge1xuICAgIGlkZW50aWZpZXIsXG4gICAgZmluYWxTdGF0ZTogY3VycmVudFN0YXRlLFxuICAgIG1vZGU6IHBhcmFtcy5Nb2RlLFxuICAgIGxvb3BDb3VudCxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBpZGVudGlmaWVyLFxuICAgIGFjY291bnQsXG4gICAgcmVnaW9uLFxuICAgIHJlc291cmNlOiB0YXJnZXRSZXNvdXJjZSxcbiAgICBzdGF0dXM6IGN1cnJlbnRTdGF0ZSxcbiAgfTtcbn07XG5cbi8qKlxuICogRHVyYWJsZSBMYW1iZGEgZW50cnkgcG9pbnQgZm9yIHRoZSBFQzIgcnVubmluZyBzY2hlZHVsZXIuXG4gKlxuICogUmVzb2x2ZXMgaW5zdGFuY2VzIHZpYSBSZXNvdXJjZSBHcm91cHMgVGFnZ2luZyBBUEksIHJ1bnMge0BsaW5rIHByb2Nlc3NPbmVSZXNvdXJjZX0gZm9yIGVhY2ggQVJOXG4gKiBpbiBwYXJhbGxlbCAoYm91bmRlZCBjb25jdXJyZW5jeSksIHBvc3RzIGEgcGFyZW50IFNsYWNrIG1lc3NhZ2UgYW5kIHBlci1pbnN0YW5jZSB0aHJlYWQgcmVwbGllcyxcbiAqIGFuZCB1c2VzIGR1cmFibGUgYHN0ZXBgIC8gYHdhaXRgIC8gYG1hcGAgc28gdGhlIHJ1biBjYW4gcmVzdW1lIGFjcm9zcyBzdXNwZW5zaW9ucy5cbiAqXG4gKiBSZWFkcyBwZXItaW5zdGFuY2Ugd2FpdCBsaW1pdHMgZnJvbSBgUFJPQ0VTU19SRVNPVVJDRV9NQVhfTE9PUF9DT1VOVGAgYW5kXG4gKiBgUFJPQ0VTU19SRVNPVVJDRV9NQVhfRUxBUFNFRF9TRUNPTkRTYCB2aWEge0BsaW5rIHBhcnNlUmVzb3VyY2VXYWl0TGltaXRzRnJvbUVudn0uXG4gKiBMb2FkcyB0aGUgU2xhY2sgc2VjcmV0IHZpYSB7QGxpbmsgc2VjcmV0RmV0Y2hlcn0gKFBhcmFtZXRlcnMgYW5kIFNlY3JldHMgTGFtYmRhIEV4dGVuc2lvbikuXG4gKiBTbGFjayBBUEkgZmFpbHVyZXMgYXJlIGxvZ2dlZCBhcyBgcnVubmluZy1zY2hlZHVsZXI6IFNsYWNrIHBvc3QgZmFpbGVkYCBmb3IgQ2xvdWRXYXRjaCBsb2cgZmlsdGVycy5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgLSBQYXlsb2FkIGZyb20gRXZlbnRCcmlkZ2UgU2NoZWR1bGVyOyBtdXN0IGluY2x1ZGUgYFBhcmFtcy5UYWdLZXlgLCBgUGFyYW1zLlRhZ1ZhbHVlc2AsIGBQYXJhbXMuTW9kZWAuXG4gKiBAcGFyYW0gY3R4IC0gUm9vdCBkdXJhYmxlIGV4ZWN1dGlvbiBjb250ZXh0LlxuICogQHJldHVybnNcbiAqIC0gYHsgc3RhdHVzOiAnVGFyZ2V0UmVzb3VyY2VzTm90Rm91bmQnIH1gIHdoZW4gbm8gaW5zdGFuY2VzIG1hdGNoIHRoZSB0YWcgZmlsdGVyLlxuICogLSBgeyBzdGF0dXM6ICdDb21wbGV0ZWQnLCBwcm9jZXNzZWQsIHJlc3VsdHMgfWAgd2hlbiBpbnN0YW5jZXMgd2VyZSBoYW5kbGVkIChgcmVzdWx0c2AgZW50cmllcyBtYXRjaCB7QGxpbmsgcHJvY2Vzc09uZVJlc291cmNlfSByZXR1cm4gc2hhcGUpLlxuICogQHRocm93cyB7RXJyb3J9IElmIGBQYXJhbXNgIGlzIGludmFsaWQsIHdhaXQgZW52IHZhcnMgYXJlIG5vdCBwb3NpdGl2ZSBpbnRlZ2VycyxcbiAqICAgdGhlIFNsYWNrIHNlY3JldCBpcyBpbmNvbXBsZXRlLCBpbnN0YW5jZSBwcm9jZXNzaW5nIGZhaWxzIChpbmNsdWRpbmcgYFJlc291cmNlV2FpdEZhaWxlZDoqYCBlcnJvcnMpLFxuICogICBvciB0aGUgc2VjcmV0IGNhbm5vdCBiZSByZWFkIGZyb20gdGhlIGV4dGVuc2lvbiAoZS5nLiBvdXRzaWRlIExhbWJkYSBvciBtaXNzaW5nIGBBV1NfU0VTU0lPTl9UT0tFTmApLlxuICogQHRocm93cyB7aW1wb3J0KCdzdHJpY3QtZW52LXJlc29sdmVyJykuU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yfSBXaGVuIHJlcXVpcmVkIGVudiB2YXJzIGFyZSBtaXNzaW5nIG9yIG5vdCB2YWxpZCBudW1iZXJzLlxuICogQHRocm93cyB7aW1wb3J0KCdmZXRjaC1yZXRyaWVyJykuRmV0Y2hSZXRyaWVySHR0cEVycm9yfSBXaGVuIHRoZSBleHRlbnNpb24gcmV0dXJucyBhIG5vbi1yZXRyaWFibGUgSFRUUCBlcnJvci5cbiAqIEB0aHJvd3Mge2ltcG9ydCgnZmV0Y2gtcmV0cmllcicpLkZldGNoUmV0cmllck5ldHdvcmtFcnJvcn0gV2hlbiBleHRlbnNpb24gcmVxdWVzdHMgZmFpbCBhdCB0aGUgbmV0d29yayBsZXZlbC5cbiAqIEB0aHJvd3Mge2ltcG9ydCgnZmV0Y2gtcmV0cmllcicpLkZldGNoUmV0cmllckFib3J0RXJyb3J9IFdoZW4gZXh0ZW5zaW9uIHJlcXVlc3RzIHRpbWUgb3V0IGFmdGVyIGFsbCByZXRyaWVzLlxuICovXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IHdpdGhEdXJhYmxlRXhlY3V0aW9uKGFzeW5jIChldmVudDogU2NoZWR1bGVyRXZlbnQsIGN0eDogRHVyYWJsZUNvbnRleHQpID0+IHtcblxuICBjb25zdCBwYXJhbXMgPSBldmVudC5QYXJhbXM7XG5cbiAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogaW52b2NhdGlvbicsIHtcbiAgICBtb2RlOiBwYXJhbXM/Lk1vZGUsXG4gICAgdGFnS2V5OiBwYXJhbXM/LlRhZ0tleSxcbiAgICB0YWdWYWx1ZUNvdW50OiBwYXJhbXM/LlRhZ1ZhbHVlcz8ubGVuZ3RoID8/IDAsXG4gIH0pO1xuXG4gIGlmICghcGFyYW1zPy5UYWdLZXkgfHwgIXBhcmFtcz8uVGFnVmFsdWVzIHx8ICFwYXJhbXM/Lk1vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZXZlbnQ6IFBhcmFtcy5UYWdLZXksIFBhcmFtcy5UYWdWYWx1ZXMsIFBhcmFtcy5Nb2RlIGFyZSByZXF1aXJlZC4nKTtcbiAgfVxuXG4gIGNvbnN0IHdhaXRMaW1pdHMgPSBwYXJzZVJlc291cmNlV2FpdExpbWl0c0Zyb21FbnYoKTtcblxuICBjb25zdCBzbGFja1NlY3JldE5hbWUgPSBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlKCdTTEFDS19TRUNSRVRfTkFNRScsIFN0cmljdEVudlR5cGUuU3RyaW5nKTtcblxuICBjb25zdCBzbGFja1NlY3JldFZhbHVlID0gYXdhaXQgY3R4LnN0ZXAoJ2ZldGNoLXNsYWNrLXNlY3JldCcsIGFzeW5jICgpID0+IHtcbiAgICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBmZXRjaGluZyBTbGFjayBzZWNyZXQnLCB7IHNlY3JldE5hbWU6IHNsYWNrU2VjcmV0TmFtZSB9KTtcbiAgICByZXR1cm4gc2VjcmV0RmV0Y2hlci5nZXRTZWNyZXRWYWx1ZTxTbGFja1NlY3JldD4oc2xhY2tTZWNyZXROYW1lLCBTTEFDS19TRUNSRVRfRkVUQ0hfT1BUSU9OUyk7XG4gIH0pO1xuXG4gIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IFNsYWNrIHNlY3JldCBsb2FkZWQnKTtcblxuICBpZiAoIXNsYWNrU2VjcmV0VmFsdWU/LnRva2VuIHx8ICFzbGFja1NlY3JldFZhbHVlPy5jaGFubmVsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTbGFjayBzZWNyZXQgbXVzdCBjb250YWluIHRva2VuIGFuZCBjaGFubmVsLicpO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0UmVzb3VyY2VzID0gYXdhaXQgY3R4LnN0ZXAoJ2dldC10YXJnZXQtcmVzb3VyY2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBSZXNvdXJjZUdyb3Vwc1RhZ2dpbmdBUElDbGllbnQoe30pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5zZW5kKFxuICAgICAgbmV3IEdldFJlc291cmNlc0NvbW1hbmQoe1xuICAgICAgICBSZXNvdXJjZVR5cGVGaWx0ZXJzOiBbJ2VjMjppbnN0YW5jZSddLFxuICAgICAgICBUYWdGaWx0ZXJzOiBbeyBLZXk6IHBhcmFtcy5UYWdLZXksIFZhbHVlczogcGFyYW1zLlRhZ1ZhbHVlcyB9XSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgY29uc3QgYXJucyA9IChyZXN1bHQuUmVzb3VyY2VUYWdNYXBwaW5nTGlzdCA/PyBbXSlcbiAgICAgIC5tYXAoKG06IHsgUmVzb3VyY2VBUk4/OiBzdHJpbmcgfSkgPT4gbS5SZXNvdXJjZUFSTilcbiAgICAgIC5maWx0ZXIoKGFybjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYXJuIGlzIHN0cmluZyA9PiBhcm4gIT0gbnVsbCk7XG4gICAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogZ2V0LXRhcmdldC1yZXNvdXJjZXMgZG9uZScsIHsgY291bnQ6IGFybnMubGVuZ3RoIH0pO1xuICAgIHJldHVybiBhcm5zO1xuICB9KTtcblxuICBpZiAodGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IG5vIG1hdGNoaW5nIGluc3RhbmNlcycsIHsgdGFnS2V5OiBwYXJhbXMuVGFnS2V5IH0pO1xuICAgIHJldHVybiB7IHN0YXR1czogJ1RhcmdldFJlc291cmNlc05vdEZvdW5kJyBhcyBjb25zdCB9O1xuICB9XG5cbiAgY29uc3QgY2xpZW50ID0gbmV3IFdlYkNsaWVudChzbGFja1NlY3JldFZhbHVlLnRva2VuKTtcbiAgY29uc3QgY2hhbm5lbCA9IHNsYWNrU2VjcmV0VmFsdWUuY2hhbm5lbDtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBwb3N0aW5nIHBhcmVudCBTbGFjayBtZXNzYWdlJywge1xuICAgIGluc3RhbmNlQ291bnQ6IHRhcmdldFJlc291cmNlcy5sZW5ndGgsXG4gIH0pO1xuXG4gIC8vIHNlbmQgc2xhY2sgbWVzc2FnZVxuICBjb25zdCBzbGFja1BhcmVudE1lc3NhZ2VSZXN1bHQgPSBhd2FpdCBjdHguc3RlcCgncG9zdC1zbGFjay1tZXNzYWdlcycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNsaWVudC5jaGF0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgdGV4dDogYCR7cGFyYW1zLk1vZGUgPT09ICdTdGFydCcgPyAn8J+YhiBTdGFydHMnIDogJ/CfpbEgU3RvcHMnfSB0aGUgc2NoZWR1bGVkIEVDMiBJbnN0YW5jZS5gLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGN0eC5sb2dnZXIuZXJyb3IoJ3J1bm5pbmctc2NoZWR1bGVyOiBTbGFjayBwb3N0IGZhaWxlZCcsIHtcbiAgICAgICAgc3RlcDogJ3Bvc3Qtc2xhY2stbWVzc2FnZXMnLFxuICAgICAgICBjaGFubmVsLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9KTtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBwYXJlbnQgU2xhY2sgbWVzc2FnZSBwb3N0ZWQnLCB7XG4gICAgdGhyZWFkVHM6IHNsYWNrUGFyZW50TWVzc2FnZVJlc3VsdD8udHMgPz8gbnVsbCxcbiAgfSk7XG5cbiAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogc3RhcnRpbmcgcGFyYWxsZWwgaW5zdGFuY2UgcHJvY2Vzc2luZycsIHtcbiAgICBjb3VudDogdGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCxcbiAgICBtYXhDb25jdXJyZW5jeTogMTAsXG4gIH0pO1xuXG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBjdHgubWFwKFxuICAgIHRhcmdldFJlc291cmNlcyxcbiAgICAvLyBhc3luYyAoY3R4OiBEdXJhYmxlQ29udGV4dCwgdGFyZ2V0UmVzb3VyY2U6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT5cbiAgICAvLyAgIGN0eC5zdGVwKGBwcm9jZXNzLXJlc291cmNlLSR7aW5kZXh9YCwgYXN5bmMgKCkgPT5cbiAgICAvLyAgICAgcHJvY2Vzc09uZVJlc291cmNlKGN0eCwgdGFyZ2V0UmVzb3VyY2UsIHBhcmFtcywgaW5kZXgpLFxuICAgIC8vICAgKSxcbiAgICBhc3luYyAobWFwQ3R4OiBEdXJhYmxlQ29udGV4dCwgdGFyZ2V0UmVzb3VyY2U6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgcmV0dXJuIG1hcEN0eC5ydW5JbkNoaWxkQ29udGV4dChgcmVzb3VyY2UtJHtpbmRleH1gLCBhc3luYyAoY2hpbGRDdHg6IER1cmFibGVDb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb2Nlc3NPbmVSZXNvdXJjZShjaGlsZEN0eCwgdGFyZ2V0UmVzb3VyY2UsIHBhcmFtcywgaW5kZXgsIHdhaXRMaW1pdHMpO1xuICAgICAgICAvLyBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ3NraXBwZWQnKSB7XG4gICAgICAgIC8vICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgLy8gfVxuICAgICAgICBjaGlsZEN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IHBvc3RpbmcgdGhyZWFkIFNsYWNrIG1lc3NhZ2UnLCB7XG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgaWRlbnRpZmllcjogcmVzdWx0LmlkZW50aWZpZXIsXG4gICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gc2VuZCBzbGFjayB0aHJlYWQgbWVzc2FnZVxuICAgICAgICBhd2FpdCBjaGlsZEN0eC5zdGVwKCdwb3N0LXNsYWNrLWNoaWxkLW1lc3NhZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRpc3BsYXkgPSBnZXRTdGF0ZURpc3BsYXkocmVzdWx0LnN0YXR1cyk7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNsaWVudC5jaGF0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgdGhyZWFkX3RzOiBzbGFja1BhcmVudE1lc3NhZ2VSZXN1bHQ/LnRzLFxuICAgICAgICAgICAgICBhdHRhY2htZW50czogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzM2YTY0ZicsXG4gICAgICAgICAgICAgICAgICBwcmV0ZXh0OiBgJHtkaXNwbGF5Py5lbW9qaX0gVGhlIHN0YXR1cyBvZiB0aGUgRUMyIEluc3RhbmNlICR7cmVzdWx0LmlkZW50aWZpZXJ9IGNoYW5nZWQgdG8gJHtkaXNwbGF5Py5uYW1lfSBkdWUgdG8gdGhlIHNjaGVkdWxlLmAsXG4gICAgICAgICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyB0aXRsZTogJ0FjY291bnQnLCB2YWx1ZTogcmVzdWx0LmFjY291bnQsIHNob3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgdGl0bGU6ICdSZWdpb24nLCB2YWx1ZTogcmVzdWx0LnJlZ2lvbiwgc2hvcnQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgICAgeyB0aXRsZTogJ0lkZW50aWZpZXInLCB2YWx1ZTogcmVzdWx0LmlkZW50aWZpZXIsIHNob3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgdGl0bGU6ICdTdGF0dXMnLCB2YWx1ZTogKGRpc3BsYXk/Lm5hbWUgPz8gJ1Vua25vd24nKSwgc2hvcnQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICBjaGlsZEN0eC5sb2dnZXIuZXJyb3IoJ3J1bm5pbmctc2NoZWR1bGVyOiBTbGFjayBwb3N0IGZhaWxlZCcsIHtcbiAgICAgICAgICAgICAgc3RlcDogJ3Bvc3Qtc2xhY2stY2hpbGQtbWVzc2FnZXMnLFxuICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICBpZGVudGlmaWVyOiByZXN1bHQuaWRlbnRpZmllcixcbiAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHsgbWF4Q29uY3VycmVuY3k6IDEwIH0sXG4gICk7XG5cbiAgY29uc3QgcmVzdWx0TGlzdCA9IEFycmF5LmlzQXJyYXkocmVzdWx0cykgPyByZXN1bHRzIDogW107XG4gIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IGNvbXBsZXRlZCcsIHtcbiAgICBwcm9jZXNzZWQ6IHRhcmdldFJlc291cmNlcy5sZW5ndGgsXG4gICAgcmVzdWx0Q291bnQ6IHJlc3VsdExpc3QubGVuZ3RoLFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBzdGF0dXM6ICdDb21wbGV0ZWQnIGFzIGNvbnN0LFxuICAgIHByb2Nlc3NlZDogdGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCxcbiAgICByZXN1bHRzOiByZXN1bHRMaXN0LFxuICB9O1xufSk7XG4iXX0=
package/lib/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * Public API for the EC2 instance running scheduler CDK library.
3
3
  *
4
- * Exports {@link EC2InstanceRunningScheduler}, {@link EC2InstanceRunningScheduleStack}, and related prop types.
4
+ * Exports {@link EC2InstanceRunningScheduler}, {@link EC2InstanceRunningScheduleStack},
5
+ * optional {@link FailureDetectionAlarms} / {@link RunningSchedulerFailureDetection}, and related prop types.
5
6
  */
6
7
  export * from './constructs/ec2-instance-running-scheduler';
7
8
  export * from './stacks/ec2-instance-running-schedule-stack';
package/lib/index.js CHANGED
@@ -17,8 +17,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  /**
18
18
  * Public API for the EC2 instance running scheduler CDK library.
19
19
  *
20
- * Exports {@link EC2InstanceRunningScheduler}, {@link EC2InstanceRunningScheduleStack}, and related prop types.
20
+ * Exports {@link EC2InstanceRunningScheduler}, {@link EC2InstanceRunningScheduleStack},
21
+ * optional {@link FailureDetectionAlarms} / {@link RunningSchedulerFailureDetection}, and related prop types.
21
22
  */
22
23
  __exportStar(require("./constructs/ec2-instance-running-scheduler"), exports);
23
24
  __exportStar(require("./stacks/ec2-instance-running-schedule-stack"), exports);
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0dBSUc7QUFDSCw4RUFBNEQ7QUFDNUQsK0VBQTZEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQdWJsaWMgQVBJIGZvciB0aGUgRUMyIGluc3RhbmNlIHJ1bm5pbmcgc2NoZWR1bGVyIENESyBsaWJyYXJ5LlxuICpcbiAqIEV4cG9ydHMge0BsaW5rIEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlcn0sIHtAbGluayBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZVN0YWNrfSwgYW5kIHJlbGF0ZWQgcHJvcCB0eXBlcy5cbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdHJ1Y3RzL2VjMi1pbnN0YW5jZS1ydW5uaW5nLXNjaGVkdWxlcic7XG5leHBvcnQgKiBmcm9tICcuL3N0YWNrcy9lYzItaW5zdGFuY2UtcnVubmluZy1zY2hlZHVsZS1zdGFjayc7Il19
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7OztHQUtHO0FBQ0gsOEVBQTREO0FBQzVELCtFQUE2RCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHVibGljIEFQSSBmb3IgdGhlIEVDMiBpbnN0YW5jZSBydW5uaW5nIHNjaGVkdWxlciBDREsgbGlicmFyeS5cbiAqXG4gKiBFeHBvcnRzIHtAbGluayBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXJ9LCB7QGxpbmsgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVTdGFja30sXG4gKiBvcHRpb25hbCB7QGxpbmsgRmFpbHVyZURldGVjdGlvbkFsYXJtc30gLyB7QGxpbmsgUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb259LCBhbmQgcmVsYXRlZCBwcm9wIHR5cGVzLlxuICovXG5leHBvcnQgKiBmcm9tICcuL2NvbnN0cnVjdHMvZWMyLWluc3RhbmNlLXJ1bm5pbmctc2NoZWR1bGVyJztcbmV4cG9ydCAqIGZyb20gJy4vc3RhY2tzL2VjMi1pbnN0YW5jZS1ydW5uaW5nLXNjaGVkdWxlLXN0YWNrJzsiXX0=
@@ -1,10 +1,10 @@
1
1
  import { Stack, StackProps } from 'aws-cdk-lib';
2
2
  import { Construct } from 'constructs';
3
- import { TargetResource, Secrets, Schedule } from '../constructs/ec2-instance-running-scheduler';
3
+ import { TargetResource, Secrets, Schedule, type FailureDetectionAlarms } from '../constructs/ec2-instance-running-scheduler';
4
4
  /**
5
5
  * Props for the EC2 instance running schedule CDK stack.
6
6
  *
7
- * @see {@link EC2InstanceRunningSchedulerProps} for construct-level options not exposed here (e.g. `resourcePolling`).
7
+ * @see {@link EC2InstanceRunningSchedulerProps} for construct-level options not exposed here (e.g. `resourceWait`).
8
8
  */
9
9
  export interface EC2InstanceRunningScheduleStackProps extends StackProps {
10
10
  /** Tag-based target resource for EC2 instances to start/stop. */
@@ -17,9 +17,15 @@ export interface EC2InstanceRunningScheduleStackProps extends StackProps {
17
17
  readonly stopSchedule?: Schedule;
18
18
  /** Cron schedule for starting instances. */
19
19
  readonly startSchedule?: Schedule;
20
+ /** Optional CloudWatch failure detection alarms and log-based metrics. */
21
+ readonly failureDetection?: FailureDetectionAlarms;
20
22
  }
21
23
  /**
22
24
  * CDK stack that deploys the EC2 instance running scheduler (EventBridge Scheduler + Durable Lambda).
25
+ *
26
+ * Wires {@link EC2InstanceRunningScheduler} with targeting, schedules, secrets, scheduling toggle,
27
+ * and optional {@link FailureDetectionAlarms}. Does not expose {@link ResourceWaitLimits}; use the
28
+ * construct directly when custom per-instance wait limits are required.
23
29
  */
24
30
  export declare class EC2InstanceRunningScheduleStack extends Stack {
25
31
  /**
@@ -27,7 +33,7 @@ export declare class EC2InstanceRunningScheduleStack extends Stack {
27
33
  *
28
34
  * @param scope - Parent construct or app.
29
35
  * @param id - Stack id.
30
- * @param props - Target resource, schedules, secrets, and standard stack props.
36
+ * @param props - Target resource, schedules, secrets, optional failure detection, and standard stack props.
31
37
  */
32
38
  constructor(scope: Construct, id: string, props: EC2InstanceRunningScheduleStackProps);
33
39
  }
@@ -6,15 +6,19 @@ const aws_cdk_lib_1 = require("aws-cdk-lib");
6
6
  const ec2_instance_running_scheduler_1 = require("../constructs/ec2-instance-running-scheduler");
7
7
  /**
8
8
  * CDK stack that deploys the EC2 instance running scheduler (EventBridge Scheduler + Durable Lambda).
9
+ *
10
+ * Wires {@link EC2InstanceRunningScheduler} with targeting, schedules, secrets, scheduling toggle,
11
+ * and optional {@link FailureDetectionAlarms}. Does not expose {@link ResourceWaitLimits}; use the
12
+ * construct directly when custom per-instance wait limits are required.
9
13
  */
10
14
  class EC2InstanceRunningScheduleStack extends aws_cdk_lib_1.Stack {
11
- static [JSII_RTTI_SYMBOL_1] = { fqn: "ec2-instance-running-scheduler.EC2InstanceRunningScheduleStack", version: "0.2.6" };
15
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "ec2-instance-running-scheduler.EC2InstanceRunningScheduleStack", version: "0.3.0" };
12
16
  /**
13
17
  * Creates the stack and wires {@link EC2InstanceRunningScheduler}.
14
18
  *
15
19
  * @param scope - Parent construct or app.
16
20
  * @param id - Stack id.
17
- * @param props - Target resource, schedules, secrets, and standard stack props.
21
+ * @param props - Target resource, schedules, secrets, optional failure detection, and standard stack props.
18
22
  */
19
23
  constructor(scope, id, props) {
20
24
  super(scope, id, props);
@@ -24,8 +28,9 @@ class EC2InstanceRunningScheduleStack extends aws_cdk_lib_1.Stack {
24
28
  secrets: props.secrets,
25
29
  stopSchedule: props.stopSchedule,
26
30
  startSchedule: props.startSchedule,
31
+ failureDetection: props.failureDetection,
27
32
  });
28
33
  }
29
34
  }
30
35
  exports.EC2InstanceRunningScheduleStack = EC2InstanceRunningScheduleStack;
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWMyLWluc3RhbmNlLXJ1bm5pbmctc2NoZWR1bGUtc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RhY2tzL2VjMi1pbnN0YW5jZS1ydW5uaW5nLXNjaGVkdWxlLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBZ0Q7QUFFaEQsaUdBQThIO0FBb0I5SDs7R0FFRztBQUNILE1BQWEsK0JBQWdDLFNBQVEsbUJBQUs7O0lBQ3hEOzs7Ozs7T0FNRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMkM7UUFDbkYsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSw0REFBMkIsQ0FBQyxJQUFJLEVBQUUsNkJBQTZCLEVBQUU7WUFDbkUsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjO1lBQ3BDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7WUFDeEMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7U0FDbkMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFsQkgsMEVBbUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlciwgVGFyZ2V0UmVzb3VyY2UsIFNlY3JldHMsIFNjaGVkdWxlIH0gZnJvbSAnLi4vY29uc3RydWN0cy9lYzItaW5zdGFuY2UtcnVubmluZy1zY2hlZHVsZXInO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgRUMyIGluc3RhbmNlIHJ1bm5pbmcgc2NoZWR1bGUgQ0RLIHN0YWNrLlxuICpcbiAqIEBzZWUge0BsaW5rIEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlclByb3BzfSBmb3IgY29uc3RydWN0LWxldmVsIG9wdGlvbnMgbm90IGV4cG9zZWQgaGVyZSAoZS5nLiBgcmVzb3VyY2VQb2xsaW5nYCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVTdGFja1Byb3BzIGV4dGVuZHMgU3RhY2tQcm9wcyB7XG4gIC8qKiBUYWctYmFzZWQgdGFyZ2V0IHJlc291cmNlIGZvciBFQzIgaW5zdGFuY2VzIHRvIHN0YXJ0L3N0b3AuICovXG4gIHJlYWRvbmx5IHRhcmdldFJlc291cmNlOiBUYXJnZXRSZXNvdXJjZTtcbiAgLyoqIFdoZXRoZXIgc2NoZWR1bGluZyBpcyBlbmFibGVkLiBEZWZhdWx0cyB0byB0cnVlIGlmIG9taXR0ZWQuICovXG4gIHJlYWRvbmx5IGVuYWJsZVNjaGVkdWxpbmc/OiBib29sZWFuO1xuICAvKiogU2VjcmV0cyAoZS5nLiBTbGFjaykgZm9yIHRoZSBzY2hlZHVsZXIuICovXG4gIHJlYWRvbmx5IHNlY3JldHM6IFNlY3JldHM7XG4gIC8qKiBDcm9uIHNjaGVkdWxlIGZvciBzdG9wcGluZyBpbnN0YW5jZXMuICovXG4gIHJlYWRvbmx5IHN0b3BTY2hlZHVsZT86IFNjaGVkdWxlO1xuICAvKiogQ3JvbiBzY2hlZHVsZSBmb3Igc3RhcnRpbmcgaW5zdGFuY2VzLiAqL1xuICByZWFkb25seSBzdGFydFNjaGVkdWxlPzogU2NoZWR1bGU7XG59XG5cbi8qKlxuICogQ0RLIHN0YWNrIHRoYXQgZGVwbG95cyB0aGUgRUMyIGluc3RhbmNlIHJ1bm5pbmcgc2NoZWR1bGVyIChFdmVudEJyaWRnZSBTY2hlZHVsZXIgKyBEdXJhYmxlIExhbWJkYSkuXG4gKi9cbmV4cG9ydCBjbGFzcyBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZVN0YWNrIGV4dGVuZHMgU3RhY2sge1xuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgc3RhY2sgYW5kIHdpcmVzIHtAbGluayBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXJ9LlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBQYXJlbnQgY29uc3RydWN0IG9yIGFwcC5cbiAgICogQHBhcmFtIGlkIC0gU3RhY2sgaWQuXG4gICAqIEBwYXJhbSBwcm9wcyAtIFRhcmdldCByZXNvdXJjZSwgc2NoZWR1bGVzLCBzZWNyZXRzLCBhbmQgc3RhbmRhcmQgc3RhY2sgcHJvcHMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVTdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBuZXcgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyKHRoaXMsICdFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXInLCB7XG4gICAgICB0YXJnZXRSZXNvdXJjZTogcHJvcHMudGFyZ2V0UmVzb3VyY2UsXG4gICAgICBlbmFibGVTY2hlZHVsaW5nOiBwcm9wcy5lbmFibGVTY2hlZHVsaW5nLFxuICAgICAgc2VjcmV0czogcHJvcHMuc2VjcmV0cyxcbiAgICAgIHN0b3BTY2hlZHVsZTogcHJvcHMuc3RvcFNjaGVkdWxlLFxuICAgICAgc3RhcnRTY2hlZHVsZTogcHJvcHMuc3RhcnRTY2hlZHVsZSxcbiAgICB9KTtcbiAgfVxufSJdfQ==
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWMyLWluc3RhbmNlLXJ1bm5pbmctc2NoZWR1bGUtc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RhY2tzL2VjMi1pbnN0YW5jZS1ydW5uaW5nLXNjaGVkdWxlLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBZ0Q7QUFFaEQsaUdBQTJKO0FBc0IzSjs7Ozs7O0dBTUc7QUFDSCxNQUFhLCtCQUFnQyxTQUFRLG1CQUFLOztJQUN4RDs7Ozs7O09BTUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTJDO1FBQ25GLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksNERBQTJCLENBQUMsSUFBSSxFQUFFLDZCQUE2QixFQUFFO1lBQ25FLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYztZQUNwQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1lBQ3hDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1lBQ2xDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7U0FDekMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFuQkgsMEVBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlciwgVGFyZ2V0UmVzb3VyY2UsIFNlY3JldHMsIFNjaGVkdWxlLCB0eXBlIEZhaWx1cmVEZXRlY3Rpb25BbGFybXMgfSBmcm9tICcuLi9jb25zdHJ1Y3RzL2VjMi1pbnN0YW5jZS1ydW5uaW5nLXNjaGVkdWxlcic7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBFQzIgaW5zdGFuY2UgcnVubmluZyBzY2hlZHVsZSBDREsgc3RhY2suXG4gKlxuICogQHNlZSB7QGxpbmsgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyUHJvcHN9IGZvciBjb25zdHJ1Y3QtbGV2ZWwgb3B0aW9ucyBub3QgZXhwb3NlZCBoZXJlIChlLmcuIGByZXNvdXJjZVdhaXRgKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZVN0YWNrUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgLyoqIFRhZy1iYXNlZCB0YXJnZXQgcmVzb3VyY2UgZm9yIEVDMiBpbnN0YW5jZXMgdG8gc3RhcnQvc3RvcC4gKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UmVzb3VyY2U6IFRhcmdldFJlc291cmNlO1xuICAvKiogV2hldGhlciBzY2hlZHVsaW5nIGlzIGVuYWJsZWQuIERlZmF1bHRzIHRvIHRydWUgaWYgb21pdHRlZC4gKi9cbiAgcmVhZG9ubHkgZW5hYmxlU2NoZWR1bGluZz86IGJvb2xlYW47XG4gIC8qKiBTZWNyZXRzIChlLmcuIFNsYWNrKSBmb3IgdGhlIHNjaGVkdWxlci4gKi9cbiAgcmVhZG9ubHkgc2VjcmV0czogU2VjcmV0cztcbiAgLyoqIENyb24gc2NoZWR1bGUgZm9yIHN0b3BwaW5nIGluc3RhbmNlcy4gKi9cbiAgcmVhZG9ubHkgc3RvcFNjaGVkdWxlPzogU2NoZWR1bGU7XG4gIC8qKiBDcm9uIHNjaGVkdWxlIGZvciBzdGFydGluZyBpbnN0YW5jZXMuICovXG4gIHJlYWRvbmx5IHN0YXJ0U2NoZWR1bGU/OiBTY2hlZHVsZTtcbiAgLyoqIE9wdGlvbmFsIENsb3VkV2F0Y2ggZmFpbHVyZSBkZXRlY3Rpb24gYWxhcm1zIGFuZCBsb2ctYmFzZWQgbWV0cmljcy4gKi9cbiAgcmVhZG9ubHkgZmFpbHVyZURldGVjdGlvbj86IEZhaWx1cmVEZXRlY3Rpb25BbGFybXM7XG59XG5cbi8qKlxuICogQ0RLIHN0YWNrIHRoYXQgZGVwbG95cyB0aGUgRUMyIGluc3RhbmNlIHJ1bm5pbmcgc2NoZWR1bGVyIChFdmVudEJyaWRnZSBTY2hlZHVsZXIgKyBEdXJhYmxlIExhbWJkYSkuXG4gKlxuICogV2lyZXMge0BsaW5rIEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlcn0gd2l0aCB0YXJnZXRpbmcsIHNjaGVkdWxlcywgc2VjcmV0cywgc2NoZWR1bGluZyB0b2dnbGUsXG4gKiBhbmQgb3B0aW9uYWwge0BsaW5rIEZhaWx1cmVEZXRlY3Rpb25BbGFybXN9LiBEb2VzIG5vdCBleHBvc2Uge0BsaW5rIFJlc291cmNlV2FpdExpbWl0c307IHVzZSB0aGVcbiAqIGNvbnN0cnVjdCBkaXJlY3RseSB3aGVuIGN1c3RvbSBwZXItaW5zdGFuY2Ugd2FpdCBsaW1pdHMgYXJlIHJlcXVpcmVkLlxuICovXG5leHBvcnQgY2xhc3MgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVTdGFjayBleHRlbmRzIFN0YWNrIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHN0YWNrIGFuZCB3aXJlcyB7QGxpbmsgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyfS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIC0gUGFyZW50IGNvbnN0cnVjdCBvciBhcHAuXG4gICAqIEBwYXJhbSBpZCAtIFN0YWNrIGlkLlxuICAgKiBAcGFyYW0gcHJvcHMgLSBUYXJnZXQgcmVzb3VyY2UsIHNjaGVkdWxlcywgc2VjcmV0cywgb3B0aW9uYWwgZmFpbHVyZSBkZXRlY3Rpb24sIGFuZCBzdGFuZGFyZCBzdGFjayBwcm9wcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZVN0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIG5ldyBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXIodGhpcywgJ0VDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlcicsIHtcbiAgICAgIHRhcmdldFJlc291cmNlOiBwcm9wcy50YXJnZXRSZXNvdXJjZSxcbiAgICAgIGVuYWJsZVNjaGVkdWxpbmc6IHByb3BzLmVuYWJsZVNjaGVkdWxpbmcsXG4gICAgICBzZWNyZXRzOiBwcm9wcy5zZWNyZXRzLFxuICAgICAgc3RvcFNjaGVkdWxlOiBwcm9wcy5zdG9wU2NoZWR1bGUsXG4gICAgICBzdGFydFNjaGVkdWxlOiBwcm9wcy5zdGFydFNjaGVkdWxlLFxuICAgICAgZmFpbHVyZURldGVjdGlvbjogcHJvcHMuZmFpbHVyZURldGVjdGlvbixcbiAgICB9KTtcbiAgfVxufSJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ec2-instance-running-scheduler",
3
- "description": "AWS CDK construct library that starts and stops EC2 instances on a cron schedule using EventBridge Scheduler and a Durable Execution Lambda. The handler discovers instances with the Resource Groups Tagging API, issues start/stop, polls until each instance reaches a stable target state (durable step / wait), processes multiple instances in parallel (bounded concurrency), and posts Slack summary and per-instance thread messages using a secret from Secrets Manager. The Lambda emits structured application logs alongside JSON platform logs.",
3
+ "description": "AWS CDK construct library that starts and stops EC2 instances on a cron schedule using EventBridge Scheduler and a Durable Execution Lambda. The handler discovers instances with the Resource Groups Tagging API, issues start/stop, waits until each instance reaches a stable target state (durable step / wait), processes multiple instances in parallel (bounded concurrency), and posts Slack summary and per-instance thread messages using a secret from Secrets Manager. The Lambda emits structured application logs alongside JSON platform logs.",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/gammarers-aws-cdk-constructs/ec2-instance-running-scheduler.git"
@@ -49,7 +49,7 @@
49
49
  "@typescript-eslint/eslint-plugin": "^8",
50
50
  "@typescript-eslint/parser": "^8",
51
51
  "aws-cdk-lib": "2.232.0",
52
- "aws-lambda-secret-fetcher": "^0.3",
52
+ "aws-lambda-secret-fetcher": "^0.6.1",
53
53
  "aws-sdk-client-mock": "^2",
54
54
  "aws-sdk-client-mock-jest": "^2",
55
55
  "commit-and-tag-version": "^12",
@@ -61,12 +61,12 @@
61
61
  "jest": "^29.7.0",
62
62
  "jest-junit": "^17",
63
63
  "jsii": "5.9.x",
64
- "jsii-diff": "^1.137.0",
64
+ "jsii-diff": "^1.138.0",
65
65
  "jsii-docgen": "^10.5.0",
66
- "jsii-pacmak": "^1.137.0",
66
+ "jsii-pacmak": "^1.138.0",
67
67
  "jsii-rosetta": "5.9.x",
68
- "projen": "^0.100.7",
69
- "safe-env-getter": "^0.3.3",
68
+ "projen": "^0.101.4",
69
+ "strict-env-resolver": "^0.5.1",
70
70
  "ts-jest": "^29.4.11",
71
71
  "ts-node": "^10.9.2",
72
72
  "typescript": "5.9.x"
@@ -89,8 +89,7 @@
89
89
  },
90
90
  "devEngines": {
91
91
  "packageManager": {
92
- "name": "yarn",
93
- "version": "1.22.22",
92
+ "name": "npm",
94
93
  "onFail": "ignore"
95
94
  }
96
95
  },
@@ -100,7 +99,7 @@
100
99
  "publishConfig": {
101
100
  "access": "public"
102
101
  },
103
- "version": "0.2.6",
102
+ "version": "0.3.0",
104
103
  "jest": {
105
104
  "coverageProvider": "v8",
106
105
  "testMatch": [
@@ -1,17 +0,0 @@
1
- /**
2
- * Environment variable names for per-instance polling limits.
3
- *
4
- * Values are set by {@link EC2InstanceRunningScheduler} and read at handler cold start.
5
- */
6
- /**
7
- * Lambda environment variable name for max poll loop count.
8
- *
9
- * @see {@link parseResourcePollingLimitsFromEnv} in `running-scheduler-polling-env.ts`
10
- */
11
- export declare const PROCESS_RESOURCE_MAX_LOOP_COUNT_ENV = "PROCESS_RESOURCE_MAX_LOOP_COUNT";
12
- /**
13
- * Lambda environment variable name for max poll elapsed seconds.
14
- *
15
- * @see {@link parseResourcePollingLimitsFromEnv} in `running-scheduler-polling-env.ts`
16
- */
17
- export declare const PROCESS_RESOURCE_MAX_ELAPSED_SECONDS_ENV = "PROCESS_RESOURCE_MAX_ELAPSED_SECONDS";
@@ -1,21 +0,0 @@
1
- "use strict";
2
- /**
3
- * Environment variable names for per-instance polling limits.
4
- *
5
- * Values are set by {@link EC2InstanceRunningScheduler} and read at handler cold start.
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.PROCESS_RESOURCE_MAX_ELAPSED_SECONDS_ENV = exports.PROCESS_RESOURCE_MAX_LOOP_COUNT_ENV = void 0;
9
- /**
10
- * Lambda environment variable name for max poll loop count.
11
- *
12
- * @see {@link parseResourcePollingLimitsFromEnv} in `running-scheduler-polling-env.ts`
13
- */
14
- exports.PROCESS_RESOURCE_MAX_LOOP_COUNT_ENV = 'PROCESS_RESOURCE_MAX_LOOP_COUNT';
15
- /**
16
- * Lambda environment variable name for max poll elapsed seconds.
17
- *
18
- * @see {@link parseResourcePollingLimitsFromEnv} in `running-scheduler-polling-env.ts`
19
- */
20
- exports.PROCESS_RESOURCE_MAX_ELAPSED_SECONDS_ENV = 'PROCESS_RESOURCE_MAX_ELAPSED_SECONDS';
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXItcG9sbGluZy1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnVuY3MvcnVubmluZy1zY2hlZHVsZXItcG9sbGluZy1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQUVIOzs7O0dBSUc7QUFDVSxRQUFBLG1DQUFtQyxHQUFHLGlDQUFpQyxDQUFDO0FBRXJGOzs7O0dBSUc7QUFDVSxRQUFBLHdDQUF3QyxHQUFHLHNDQUFzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lcyBmb3IgcGVyLWluc3RhbmNlIHBvbGxpbmcgbGltaXRzLlxuICpcbiAqIFZhbHVlcyBhcmUgc2V0IGJ5IHtAbGluayBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXJ9IGFuZCByZWFkIGF0IGhhbmRsZXIgY29sZCBzdGFydC5cbiAqL1xuXG4vKipcbiAqIExhbWJkYSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGZvciBtYXggcG9sbCBsb29wIGNvdW50LlxuICpcbiAqIEBzZWUge0BsaW5rIHBhcnNlUmVzb3VyY2VQb2xsaW5nTGltaXRzRnJvbUVudn0gaW4gYHJ1bm5pbmctc2NoZWR1bGVyLXBvbGxpbmctZW52LnRzYFxuICovXG5leHBvcnQgY29uc3QgUFJPQ0VTU19SRVNPVVJDRV9NQVhfTE9PUF9DT1VOVF9FTlYgPSAnUFJPQ0VTU19SRVNPVVJDRV9NQVhfTE9PUF9DT1VOVCc7XG5cbi8qKlxuICogTGFtYmRhIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgZm9yIG1heCBwb2xsIGVsYXBzZWQgc2Vjb25kcy5cbiAqXG4gKiBAc2VlIHtAbGluayBwYXJzZVJlc291cmNlUG9sbGluZ0xpbWl0c0Zyb21FbnZ9IGluIGBydW5uaW5nLXNjaGVkdWxlci1wb2xsaW5nLWVudi50c2BcbiAqL1xuZXhwb3J0IGNvbnN0IFBST0NFU1NfUkVTT1VSQ0VfTUFYX0VMQVBTRURfU0VDT05EU19FTlYgPSAnUFJPQ0VTU19SRVNPVVJDRV9NQVhfRUxBUFNFRF9TRUNPTkRTJztcbiJdfQ==
@@ -1,8 +0,0 @@
1
- import { type ResourcePollingLimits } from './running-scheduler-predicates';
2
- /**
3
- * Reads per-instance polling limits from Lambda environment variables set by the CDK construct.
4
- *
5
- * @returns Parsed limits, using {@link DEFAULT_RESOURCE_POLLING_LIMITS} when variables are unset.
6
- * @throws {Error} When a set variable is not a positive integer.
7
- */
8
- export declare const parseResourcePollingLimitsFromEnv: () => ResourcePollingLimits;