@pipeline-builder/pipeline-manager 4.5.2 → 4.5.3

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.
@@ -1,6 +1,6 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { ErrorCode, errorMessage } from '@pipeline-builder/api-core';
3
+ import { ErrorCode, errorMessage, isManagedToolchainPlugin } from '@pipeline-builder/api-core';
4
4
  import { collectPluginSteps, exactPinNotFoundMessage, lookupNotFoundState, pluginArtifactAlias, pluginLookupFilter, summarizeLookupWarnings, unwrapLookup, } from '@pipeline-builder/pipeline-core';
5
5
  import pico from 'picocolors';
6
6
  import { ApiClient } from './api-client.js';
@@ -100,6 +100,29 @@ function exactVersionPin(ref) {
100
100
  const version = ref.filter?.version;
101
101
  return typeof version === 'string' && /^\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?$/.test(version) ? version : null;
102
102
  }
103
+ /**
104
+ * Whether a reference names a managed toolchain half (`cdk-synth`): the
105
+ * system org's, never a listing — so no publisher. It resolves through the
106
+ * toolchain release (the pipeline's `toolchain.release` pin, else the org /
107
+ * canary / platform default), never by its own version.
108
+ */
109
+ export function isManagedToolchainRef(ref) {
110
+ if (ref.publisher)
111
+ return false;
112
+ const name = typeof ref.filter?.name === 'string' ? ref.filter.name : ref.name;
113
+ return isManagedToolchainPlugin(name);
114
+ }
115
+ /** The pipeline's toolchain release pin (`props.toolchain.release`), when set. */
116
+ export function toolchainReleasePin(props) {
117
+ const toolchain = props.toolchain;
118
+ return typeof toolchain?.release === 'string' && toolchain.release.length > 0 ? toolchain.release : undefined;
119
+ }
120
+ /** The plugin service's error code on a refused answer, when it carries one. */
121
+ export function serviceErrorCode(err) {
122
+ const data = err?.response?.data;
123
+ const code = data && typeof data === 'object' ? data.code : undefined;
124
+ return typeof code === 'string' && code.length > 0 ? code : null;
125
+ }
103
126
  /**
104
127
  * Every fatal refusal of one pre-resolution pass. Carries the structured list
105
128
  * as well as the human message, so the synth can emit a machine-readable
@@ -156,14 +179,16 @@ function serviceMessage(err) {
156
179
  * the deploy-time custom resource Lambda uses. Returning the full Plugin
157
180
  * record at synth time is what allows the resulting CFN template to ship
158
181
  * with real CodeBuild image URIs (`<host>/<ns>/<name>:<version>`) rather than
159
- * the `aws/codebuild/standard:7.0` fallback that the synth-time token path
160
- * forces.
182
+ * the pipeline's default image that the synth-time token path forces.
161
183
  *
162
184
  * Failures are non-fatal: a missing plugin or unreachable API logs a warning
163
185
  * and falls through to the deploy-time custom resource path so partial
164
186
  * platform outages don't block synth/deploy. The exceptions abort the synth:
165
- * the {@link FATAL_LOOKUP_CODES} refusals, and an exact version pin that does
166
- * not exist.
187
+ * the {@link FATAL_LOOKUP_CODES} refusals, an exact version pin that does
188
+ * not exist, and ANY failure on a managed toolchain reference (`cdk-synth`),
189
+ * which has no deploy-time fallback (D2). A managed reference sends the
190
+ * pipeline's `toolchain.release` as `releasePin` — the same pin the bootstrap
191
+ * lookup sends — and its resolved release lands in `toolchainSink` by key.
167
192
  *
168
193
  * Every reference is looked up before anything is thrown, and ALL fatal
169
194
  * refusals are reported together. Stopping at the first meant a pipeline with
@@ -182,11 +207,12 @@ function serviceMessage(err) {
182
207
  *
183
208
  * Keyed by `alias || name` to match `PluginLookup.plugin()`.
184
209
  */
185
- export async function resolvePluginsForProps(client, props, warningSink) {
210
+ export async function resolvePluginsForProps(client, props, warningSink, toolchainSink) {
186
211
  const refs = collectPluginRefs(props);
187
212
  if (refs.length === 0)
188
213
  return {};
189
214
  const pipelineId = typeof props.pipelineId === 'string' && props.pipelineId.length > 0 ? props.pipelineId : undefined;
215
+ const releasePin = toolchainReleasePin(props);
190
216
  // One lookup per alias may serve several steps: the labels of each, by alias.
191
217
  const stepKeys = new Map();
192
218
  for (const step of collectPluginSteps(props)) {
@@ -209,18 +235,29 @@ export async function resolvePluginsForProps(client, props, warningSink) {
209
235
  const filter = pluginLookupFilter(ref);
210
236
  const pin = exactVersionPin(ref);
211
237
  const refuse = (code, message) => { fatal.push({ plugin: label, code, message }); };
238
+ // A managed toolchain half (cdk-synth) resolves through the RELEASE — the
239
+ // same `releasePin` the bootstrap lookup sends, so both halves come from
240
+ // one release — and it has no deploy-time fallback: any failure is fatal.
241
+ const managed = isManagedToolchainRef(ref);
242
+ const refuseManaged = (code, why) => refuse(code, `Toolchain plugin "${label}"${releasePin ? ` (release ${releasePin})` : ''} could not be resolved: ${why}`);
212
243
  try {
213
244
  const res = await client.post('/api/plugins/lookup', {
214
245
  filter,
246
+ ...(managed && releasePin ? { releasePin } : {}),
215
247
  ...(pipelineId && stepKeys.has(key) ? { context: { pipelineId, stepKeys: stepKeys.get(key) } } : {}),
216
248
  });
217
- const { plugin, warnings } = unwrapLookup(res);
249
+ const { plugin, warnings, toolchain } = unwrapLookup(res);
218
250
  for (const warning of warnings) {
219
251
  printLookupWarning(label, warning);
220
252
  warningSink?.push(warning);
221
253
  }
222
- if (plugin) {
254
+ if (managed && (!plugin || !toolchain)) {
255
+ refuseManaged(ErrorCode.BOOTSTRAP_IMAGE_UNRESOLVED, plugin ? 'the answer carried no toolchain release' : 'the lookup returned no record');
256
+ }
257
+ else if (plugin) {
223
258
  resolved[key] = plugin;
259
+ if (managed && toolchain && toolchainSink)
260
+ toolchainSink[key] = toolchain;
224
261
  }
225
262
  else if (pin) {
226
263
  refuse('PLUGIN_VERSION_NOT_FOUND', pinNotFoundMessage(label, pin));
@@ -230,6 +267,10 @@ export async function resolvePluginsForProps(client, props, warningSink) {
230
267
  }
231
268
  }
232
269
  catch (err) {
270
+ if (managed) {
271
+ refuseManaged(serviceErrorCode(err) ?? ErrorCode.BOOTSTRAP_IMAGE_UNRESOLVED, serviceMessage(err) ?? errorMessage(err));
272
+ return;
273
+ }
233
274
  // A plugin whose image signature doesn't verify, or a listing the org
234
275
  // can't use, is NOT an outage to ride out: falling back would quietly
235
276
  // turn it into an unresolved step. Stop.
@@ -254,4 +295,4 @@ export async function resolvePluginsForProps(client, props, warningSink) {
254
295
  throw new PluginResolutionError(fatal);
255
296
  return resolved;
256
297
  }
257
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdmVyLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvcGx1Z2luLXJlc29sdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRSxPQUFPLEVBQ0wsa0JBQWtCLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQ2hFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLHVCQUF1QixFQUFFLFlBQVksR0FDL0UsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLElBQUksTUFBTSxZQUFZLENBQUM7QUFDOUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQVdqRDs7OztHQUlHO0FBQ0gsU0FBUyxRQUFRLENBQUMsR0FBYztJQUM5QixPQUFPLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBOEI7SUFDdkQsTUFBTSxJQUFJLEdBQWdCLEVBQUUsQ0FBQztJQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUV2QyxNQUFNLElBQUksR0FBRyxDQUFDLEdBQVksRUFBUSxFQUFFO1FBQ2xDLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtZQUFFLE9BQU87UUFDNUMsTUFBTSxDQUFDLEdBQUcsR0FBZ0IsQ0FBQztRQUMzQixJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ3BCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4Qix3RUFBd0U7UUFDeEUsMkVBQTJFO1FBQzNFLE1BQU0sSUFBSSxHQUFJLENBQUMsQ0FB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QUFDLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxDQUFDLDBCQUEwQixFQUFFLGtCQUFrQixDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDeEUsT0FBTztZQUNULENBQUM7WUFDRCxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsWUFBWSxDQUFDLFdBQVcsS0FBSyw0QkFBNEIsR0FBRyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQzVHLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRUosSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxNQUFNLElBQUkscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBFcnJvckNvZGUsIGVycm9yTWVzc2FnZSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7XG4gIGNvbGxlY3RQbHVnaW5TdGVwcywgZXhhY3RQaW5Ob3RGb3VuZE1lc3NhZ2UsIGxvb2t1cE5vdEZvdW5kU3RhdGUsIHR5cGUgTG9va3VwV2FybmluZywgdHlwZSBMb29rdXBXYXJuaW5nU2V2ZXJpdHksXG4gIHBsdWdpbkFydGlmYWN0QWxpYXMsIHBsdWdpbkxvb2t1cEZpbHRlciwgc3VtbWFyaXplTG9va3VwV2FybmluZ3MsIHVud3JhcExvb2t1cCxcbn0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZSc7XG5pbXBvcnQgcGljbyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCB7IEFwaUNsaWVudCB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBwcmludFdhcm5pbmcgfSBmcm9tICcuL291dHB1dC11dGlscy5qcyc7XG5cbi8qKiBNaW5pbWFsIHBsdWdpbiByZWZlcmVuY2Ugc2hhcGUg4oCUIG1hdGNoZXMgUGx1Z2luT3B0aW9ucyBmcm9tIHBpcGVsaW5lLWNvcmUuICovXG5pbnRlcmZhY2UgUGx1Z2luUmVmIHtcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogUHVibGlzaGVyIGhhbmRsZSBvZiBhbiBpbnN0YWxsZWQgbGlzdGluZy4gKi9cbiAgcHVibGlzaGVyPzogc3RyaW5nO1xuICBhbGlhcz86IHN0cmluZztcbiAgZmlsdGVyPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogQ2FjaGUga2V5IG1hdGNoaW5nIGBQbHVnaW5Mb29rdXAubm9ybWFsaXplKClgOiB0aGUgZXhwbGljaXQgYWxpYXMgd2hlbiBzZXQsXG4gKiBvdGhlcndpc2UgYFs8cHVibGlzaGVyPi1dPG5hbWU+LWFsaWFzYCDigJQgcGlwZWxpbmUtY29yZSdzXG4gKiBgcGx1Z2luQXJ0aWZhY3RBbGlhc2AsIHRoZSBvbmUgcnVsZSBldmVyeSBjb25zdW1lciBvZiB0aGlzIG1hcCB1c2VzLlxuICovXG5mdW5jdGlvbiBjYWNoZUtleShyZWY6IFBsdWdpblJlZik6IHN0cmluZyB7XG4gIHJldHVybiBwbHVnaW5BcnRpZmFjdEFsaWFzKHJlZik7XG59XG5cbi8qKlxuICogV2FsayB0aGUgcGlwZWxpbmUgcHJvcHMgdHJlZSB0byBjb2xsZWN0IGV2ZXJ5IHBsdWdpbiByZWZlcmVuY2UuIFBsdWdpbnNcbiAqIGFwcGVhciBhdCBgc3ludGgucGx1Z2luYCBhbmQgYXQgYHN0YWdlc1tdLnN0ZXBzW10ucGx1Z2luYC4gRW50cmllcyBhcmVcbiAqIGRlLWR1cGxpY2F0ZWQgYnkgYGNhY2hlS2V5KClgIOKAlCB0aGUgc2FtZSBrZXkgYFBsdWdpbkxvb2t1cC5wbHVnaW4oKWAgdXNlcyxcbiAqIHNvIHRoZSByZXNvbHZlZC1wbHVnaW5zIG1hcCBsb29rdXBzIG1hdGNoIGRvd25zdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RQbHVnaW5SZWZzKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFBsdWdpblJlZltdIHtcbiAgY29uc3QgcmVmczogUGx1Z2luUmVmW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgY29uc3QgcHVzaCA9IChyYXc6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgIGNvbnN0IHIgPSByYXcgYXMgUGx1Z2luUmVmO1xuICAgIGlmICghci5uYW1lKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gY2FjaGVLZXkocik7XG4gICAgLy8gVGhlIG5hbWUgdGhlIGxvb2t1cCB3aWxsIFRBUkdFVCDigJQgYW4gZXhwbGljaXQgYGZpbHRlci5uYW1lYCB3aW5zIChzZWVcbiAgICAvLyBiZWxvdyksIHNvIHR3byByZWZzIHRoYXQgcmVzb2x2ZSB0byB0aGUgc2FtZSBwbHVnaW4gYXJlIG5vdCBhIGNvbGxpc2lvbi5cbiAgICBjb25zdCBuYW1lID0gKHIuZmlsdGVyPy5uYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gci5uYW1lO1xuICAgIGNvbnN0IHRhcmdldCA9IHIucHVibGlzaGVyID8gYCR7ci5wdWJsaXNoZXJ9LyR7bmFtZX1gIDogbmFtZTtcbiAgICBjb25zdCBob2xkZXIgPSBzZWVuLmdldChrZXkpO1xuICAgIGlmIChob2xkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gT25lIGFsaWFzIGNhbiBvbmx5IGV2ZXIgbWVhbiBvbmUgcGx1Z2luLiBEZWR1cGxpY2F0aW5nIG9uIHRoZSBhbGlhc1xuICAgICAgLy8gYWxvbmUga2VwdCB0aGUgRklSU1QgcGx1Z2luIGFuZCBzaWxlbnRseSBkcm9wcGVkIHRoZSBzZWNvbmQsIHNvIGEgc3RlcFxuICAgICAgLy8gZGVjbGFyaW5nIGB7IG5hbWU6ICdtYXZlbi1idWlsZCcsIGFsaWFzOiAnYnVpbGQnIH1gIGFmdGVyIGFub3RoZXJcbiAgICAgIC8vIGRlY2xhcmluZyBgeyBuYW1lOiAnbm9kZWpzLWJ1aWxkJywgYWxpYXM6ICdidWlsZCcgfWAgcmFuIG5vZGVqcy1idWlsZCdzXG4gICAgICAvLyBpbWFnZSBhbmQgY29tbWFuZHMg4oCUIG5vIGVycm9yLCBqdXN0IHRoZSB3cm9uZyBidWlsZC5cbiAgICAgIGlmIChob2xkZXIgIT09IHRhcmdldCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBsdWdpbiBhbGlhcyBcIiR7a2V5fVwiIGlzIHVzZWQgZm9yIHR3byBkaWZmZXJlbnQgcGx1Z2lucyAoXCIke2hvbGRlcn1cIiBhbmQgXCIke3RhcmdldH1cIikuIGBcbiAgICAgICAgICArICdHaXZlIGVhY2ggcGx1Z2luIGl0cyBvd24gYWxpYXMuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2Vlbi5zZXQoa2V5LCB0YXJnZXQpO1xuICAgIHJlZnMucHVzaChyKTtcbiAgfTtcblxuICBjb25zdCBzeW50aCA9IHByb3BzLnN5bnRoIGFzIHsgcGx1Z2luPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICBwdXNoKHN5bnRoPy5wbHVnaW4pO1xuXG4gIGNvbnN0IHN0YWdlcyA9IHByb3BzLnN0YWdlcyBhcyBBcnJheTx7IHN0ZXBzPzogQXJyYXk8eyBwbHVnaW4/OiB1bmtub3duIH0+IH0+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHN0YWdlIG9mIHN0YWdlcyA/PyBbXSkge1xuICAgIGZvciAoY29uc3Qgc3RlcCBvZiBzdGFnZS5zdGVwcyA/PyBbXSkge1xuICAgICAgcHVzaChzdGVwLnBsdWdpbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlZnM7XG59XG5cbi8qKlxuICogTG9va3VwIHJlZnVzYWxzIHRoYXQgbXVzdCBTVE9QIHRoZSBzeW50aCByYXRoZXIgdGhhbiBmYWxsIGJhY2sgdG9cbiAqIGRlcGxveS10aW1lIHJlc29sdXRpb246IGFuIGltYWdlIHdob3NlIHNpZ25hdHVyZSBkb2Vzbid0IHZlcmlmeSwgYSBsaXN0aW5nXG4gKiB0aGUgb3JnIGNhbid0IHVzZSAobm90IGluc3RhbGxlZCwgYmxvY2tlZCBieSBpdHMgYWxsb3cvZGVueSBwb2xpY3ksIHlhbmtlZFxuICogb3Igc3VzcGVuZGVkKSwgYW5kIGFuIG9yZyBwbHVnaW4gdGhhdCB3YXMgZGVsZXRlZC4gRmFsbGluZyBiYWNrIHdvdWxkXG4gKiBxdWlldGx5IHR1cm4gZWFjaCBpbnRvIGFuIHVucmVzb2x2ZWQgc3RlcCB0aGF0IGZhaWxzIGF0IHJ1biB0aW1lIGluc3RlYWQgb2ZcbiAqIG5vdy4gVnVsbmVyYWJpbGl0eSBzdGF0ZSBpcyBORVZFUiBvbmUgb2YgdGhlc2U6IGl0IGFycml2ZXMgYXMgZ3JhZGVkXG4gKiB3YXJuaW5ncyBiZXNpZGUgYSByZXNvbHZlZCBwbHVnaW4uXG4gKi9cbmNvbnN0IEZBVEFMX0xPT0tVUF9DT0RFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIEVycm9yQ29kZS5JTUFHRV9WRVJJRklDQVRJT05fRkFJTEVELFxuICBFcnJvckNvZGUuUExVR0lOX05PVF9JTlNUQUxMRUQsXG4gIEVycm9yQ29kZS5QTFVHSU5fQkxPQ0tFRF9CWV9QT0xJQ1ksXG4gIEVycm9yQ29kZS5QTFVHSU5fVU5BVkFJTEFCTEUsXG4gIC8vIFRoZSBvcmcncyBvd24gcGx1Z2luIHdhcyBkZWxldGVkOiB0aGUgbG9va3VwIHJlZnVzZXMgaXQgcmF0aGVyIHRoYW4gZmFsbFxuICAvLyB0aHJvdWdoIHRvIGEgc2FtZS1uYW1lIGxpc3RpbmcuIChQbHVnaW4gc2VydmljZSBjb2RlOyBtYXRjaGVkIGFzIGEgc3RyaW5nLilcbiAgJ1BMVUdJTl9ERUxFVEVEJyxcbl07XG5cbi8qKiBUaGUgZXJyb3IgY29kZSBvZiBhIHBsdWdpbiBzZXJ2aWNlIGFuc3dlciwgd2hlbiBpdCBpcyBvbmUgb2Yge0BsaW5rIEZBVEFMX0xPT0tVUF9DT0RFU30uICovXG5mdW5jdGlvbiBmYXRhbExvb2t1cENvZGUoZXJyOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGRhdGEgPSAoZXJyIGFzIHsgcmVzcG9uc2U/OiB7IGRhdGE/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJlc3BvbnNlPy5kYXRhO1xuICBjb25zdCBjb2RlID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyAoZGF0YSBhcyB7IGNvZGU/OiB1bmtub3duIH0pLmNvZGUgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2YgY29kZSA9PT0gJ3N0cmluZycgJiYgRkFUQUxfTE9PS1VQX0NPREVTLmluY2x1ZGVzKGNvZGUpID8gY29kZSA6IG51bGw7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBwbHVnaW4gc2VydmljZSBhbnN3ZXJlZCBcIm5vIHN1Y2ggcGx1Z2luL3ZlcnNpb25cIiAoNDA0IE5PVF9GT1VORCkuICovXG5mdW5jdGlvbiBpc05vdEZvdW5kKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBjb25zdCByZXNwb25zZSA9IChlcnIgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogdW5rbm93bjsgZGF0YT86IHVua25vd24gfSB9IHwgdW5kZWZpbmVkKT8ucmVzcG9uc2U7XG4gIGNvbnN0IGNvZGUgPSByZXNwb25zZT8uZGF0YSAmJiB0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ29iamVjdCcgPyAocmVzcG9uc2UuZGF0YSBhcyB7IGNvZGU/OiB1bmtub3duIH0pLmNvZGUgOiB1bmRlZmluZWQ7XG4gIHJldHVybiByZXNwb25zZT8uc3RhdHVzID09PSA0MDQgfHwgY29kZSA9PT0gRXJyb3JDb2RlLk5PVF9GT1VORDtcbn1cblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBhIHJlZmVyZW5jZSBQSU5TIOKAlCBvbmUgZXhhY3QgYHgueS56Wy1wcmVdYCwgbm90IGEgcmFuZ2Ugb3JcbiAqIGBsYXRlc3RgLiBBIHBpbiBuYW1lcyBhIHZlcnNpb24gdGhhdCBtdXN0IGV4aXN0OiBpZiBpdCBkb2Vzbid0IChuZXZlclxuICogcHVibGlzaGVkLCBvciByZWZ1c2VkIGJ5IHRoZSBidWlsZCdzIHZ1bG5lcmFiaWxpdHkgZ2F0ZSwgd2hpY2ggc2F2ZXNcbiAqIG5vdGhpbmcpLCB0aGVyZSBpcyBubyBvdXRhZ2UgdG8gcmlkZSBvdXQgYW5kIG5vdGhpbmcgZm9yIHRoZSBkZXBsb3ktdGltZVxuICogbG9va3VwIHRvIGZpbmQgZWl0aGVyLlxuICovXG5mdW5jdGlvbiBleGFjdFZlcnNpb25QaW4ocmVmOiBQbHVnaW5SZWYpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgdmVyc2lvbiA9IHJlZi5maWx0ZXI/LnZlcnNpb247XG4gIHJldHVybiB0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycgJiYgL15cXGQrXFwuXFxkK1xcLlxcZCsoLVswLTlBLVphLXouLV0rKT8kLy50ZXN0KHZlcnNpb24pID8gdmVyc2lvbiA6IG51bGw7XG59XG5cbi8qKiBPbmUgcGx1Z2luIHRoZSBzeW50aCBjb3VsZCBub3QgdXNlLCBhcyB7QGxpbmsgUGx1Z2luUmVzb2x1dGlvbkVycm9yfSByZXBvcnRzIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5SZWZ1c2FsIHtcbiAgLyoqIGBbPHB1Ymxpc2hlcj4vXTxuYW1lPmAgb2YgdGhlIHJlZmVyZW5jZS4gKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBzdHJpbmc7XG4gIC8qKiBUaGUgcGx1Z2luIHNlcnZpY2UncyBlcnJvciBjb2RlLCBvciBhIGxvY2FsIG9uZSAoYFBMVUdJTl9WRVJTSU9OX05PVF9GT1VORGApLiAqL1xuICByZWFkb25seSBjb2RlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBFdmVyeSBmYXRhbCByZWZ1c2FsIG9mIG9uZSBwcmUtcmVzb2x1dGlvbiBwYXNzLiBDYXJyaWVzIHRoZSBzdHJ1Y3R1cmVkIGxpc3RcbiAqIGFzIHdlbGwgYXMgdGhlIGh1bWFuIG1lc3NhZ2UsIHNvIHRoZSBzeW50aCBjYW4gZW1pdCBhIG1hY2hpbmUtcmVhZGFibGVcbiAqIGZhaWx1cmUgbGluZSAoYFBCX1NZTlRIX0ZBSUxVUkVgKSB0aGUgZXhlY3V0aW9uIGV2ZW50cyBwaWNrIHVwLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luUmVzb2x1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSByZWZ1c2FsczogcmVhZG9ubHkgUGx1Z2luUmVmdXNhbFtdKSB7XG4gICAgc3VwZXIocmVmdXNhbHMubGVuZ3RoID09PSAxXG4gICAgICA/IHJlZnVzYWxzWzBdIS5tZXNzYWdlXG4gICAgICA6IGAke3JlZnVzYWxzLmxlbmd0aH0gcGx1Z2lucyBjYW4ndCBiZSB1c2VkOlxcbiR7cmVmdXNhbHMubWFwKChyKSA9PiBgICAtICR7ci5tZXNzYWdlfWApLmpvaW4oJ1xcbicpfWApO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5SZXNvbHV0aW9uRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogV2h5IGFuIGV4YWN0IHBpbiB3YXMgbm90IGZvdW5kLCBwaHJhc2VkIGZyb20gdGhlIDQwNCdzIGBkZXRhaWxzLnN0YXRlYFxuICogKGBkZWxldGVkYCAvIGBpbmFjdGl2ZWAgLyBgeWFua2VkYCAvIGBtaXNzaW5nYCkuIFdpdGhvdXQgYSBzdGF0ZSB0aGUgYW5zd2VyXG4gKiBjYW5ub3QgdGVsbCB0aGUgY2FzZXMgYXBhcnQsIHNvIHRoZSBtZXNzYWdlIG5hbWVzIHRoZSB0d28gbGlrZWxpZXN0LlxuICogU2hhcmVkIHdpdGggdGhlIGRlcGxveS10aW1lIExhbWJkYSdzIENsb3VkRm9ybWF0aW9uIHJlYXNvbiAocGlwZWxpbmUtY29yZSkuXG4gKi9cbmZ1bmN0aW9uIHBpbk5vdEZvdW5kTWVzc2FnZShsYWJlbDogc3RyaW5nLCBwaW46IHN0cmluZywgZXJyPzogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiBleGFjdFBpbk5vdEZvdW5kTWVzc2FnZShsYWJlbCwgcGluLCBsb29rdXBOb3RGb3VuZFN0YXRlKGVycikpO1xufVxuXG5jb25zdCBTRVZFUklUWV9TVFlMRTogUmVjb3JkPExvb2t1cFdhcm5pbmdTZXZlcml0eSwgKHM6IHN0cmluZykgPT4gc3RyaW5nPiA9IHtcbiAgaW5mbzogcGljby5jeWFuLFxuICB3YXJuaW5nOiBwaWNvLnllbGxvdyxcbiAgZXJyb3I6IHBpY28ucmVkLFxuICBjcml0aWNhbDogKHQpID0+IHBpY28uYm9sZChwaWNvLnJlZCh0KSksXG59O1xuXG4vKiogUHJpbnQgb25lIGxvb2t1cCB3YXJuaW5nLCBwcmVmaXhlZCBhbmQgY29sb3VyZWQgYnkgaXRzIHNldmVyaXR5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50TG9va3VwV2FybmluZyhsYWJlbDogc3RyaW5nLCB3YXJuaW5nOiBMb29rdXBXYXJuaW5nKTogdm9pZCB7XG4gIGNvbnN0IHRhZyA9IFNFVkVSSVRZX1NUWUxFW3dhcm5pbmcuc2V2ZXJpdHldKGBbJHt3YXJuaW5nLnNldmVyaXR5LnRvVXBwZXJDYXNlKCl9XWApO1xuICBwcmludFdhcm5pbmcoYCR7dGFnfSBQbHVnaW4gXCIke2xhYmVsfVwiOiAke3dhcm5pbmcubWVzc2FnZX1gKTtcbn1cblxuLyoqIFByaW50IHRoZSBvbmUtbGluZSBzZXZlcml0eSBzdW1tYXJ5IG9mIGEgc3ludGgncyBsb29rdXAgd2FybmluZ3MgKG5vdGhpbmcgd2hlbiBub25lKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmludExvb2t1cFdhcm5pbmdTdW1tYXJ5KHdhcm5pbmdzOiByZWFkb25seSBMb29rdXBXYXJuaW5nW10pOiB2b2lkIHtcbiAgY29uc3QgbGluZSA9IHN1bW1hcml6ZUxvb2t1cFdhcm5pbmdzKHdhcm5pbmdzKTtcbiAgaWYgKCFsaW5lKSByZXR1cm47XG4gIGNvbnN0IHdvcnN0ID0gd2FybmluZ3Muc29tZSgodykgPT4gdy5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykgPyAnY3JpdGljYWwnXG4gICAgOiB3YXJuaW5ncy5zb21lKCh3KSA9PiB3LnNldmVyaXR5ID09PSAnZXJyb3InKSA/ICdlcnJvcidcbiAgICAgIDogd2FybmluZ3Muc29tZSgodykgPT4gdy5zZXZlcml0eSA9PT0gJ3dhcm5pbmcnKSA/ICd3YXJuaW5nJyA6ICdpbmZvJztcbiAgcHJpbnRXYXJuaW5nKFNFVkVSSVRZX1NUWUxFW3dvcnN0XShsaW5lKSk7XG59XG5cbi8qKiBUaGUgcGx1Z2luIHNlcnZpY2UncyBvd24gcmVmdXNhbCBtZXNzYWdlLCB3aGVuIHRoZSBhbnN3ZXIgY2FycmllcyBvbmUuICovXG5mdW5jdGlvbiBzZXJ2aWNlTWVzc2FnZShlcnI6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZGF0YSA9IChlcnIgYXMgeyByZXNwb25zZT86IHsgZGF0YT86IHVua25vd24gfSB9IHwgdW5kZWZpbmVkKT8ucmVzcG9uc2U/LmRhdGE7XG4gIGNvbnN0IG1lc3NhZ2UgPSBkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IChkYXRhIGFzIHsgbWVzc2FnZT86IHVua25vd24gfSkubWVzc2FnZSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyAmJiBtZXNzYWdlLmxlbmd0aCA+IDAgPyBtZXNzYWdlIDogbnVsbDtcbn1cblxuLyoqXG4gKiBQcmUtcmVzb2x2ZSBwbHVnaW5zIGJ5IGNhbGxpbmcgdGhlIHNhbWUgYFBPU1QgL2FwaS9wbHVnaW5zL2xvb2t1cGAgZW5kcG9pbnRcbiAqIHRoZSBkZXBsb3ktdGltZSBjdXN0b20gcmVzb3VyY2UgTGFtYmRhIHVzZXMuIFJldHVybmluZyB0aGUgZnVsbCBQbHVnaW5cbiAqIHJlY29yZCBhdCBzeW50aCB0aW1lIGlzIHdoYXQgYWxsb3dzIHRoZSByZXN1bHRpbmcgQ0ZOIHRlbXBsYXRlIHRvIHNoaXBcbiAqIHdpdGggcmVhbCBDb2RlQnVpbGQgaW1hZ2UgVVJJcyAoYDxob3N0Pi88bnM+LzxuYW1lPjo8dmVyc2lvbj5gKSByYXRoZXIgdGhhblxuICogdGhlIGBhd3MvY29kZWJ1aWxkL3N0YW5kYXJkOjcuMGAgZmFsbGJhY2sgdGhhdCB0aGUgc3ludGgtdGltZSB0b2tlbiBwYXRoXG4gKiBmb3JjZXMuXG4gKlxuICogRmFpbHVyZXMgYXJlIG5vbi1mYXRhbDogYSBtaXNzaW5nIHBsdWdpbiBvciB1bnJlYWNoYWJsZSBBUEkgbG9ncyBhIHdhcm5pbmdcbiAqIGFuZCBmYWxscyB0aHJvdWdoIHRvIHRoZSBkZXBsb3ktdGltZSBjdXN0b20gcmVzb3VyY2UgcGF0aCBzbyBwYXJ0aWFsXG4gKiBwbGF0Zm9ybSBvdXRhZ2VzIGRvbid0IGJsb2NrIHN5bnRoL2RlcGxveS4gVGhlIGV4Y2VwdGlvbnMgYWJvcnQgdGhlIHN5bnRoOlxuICogdGhlIHtAbGluayBGQVRBTF9MT09LVVBfQ09ERVN9IHJlZnVzYWxzLCBhbmQgYW4gZXhhY3QgdmVyc2lvbiBwaW4gdGhhdCBkb2VzXG4gKiBub3QgZXhpc3QuXG4gKlxuICogRXZlcnkgcmVmZXJlbmNlIGlzIGxvb2tlZCB1cCBiZWZvcmUgYW55dGhpbmcgaXMgdGhyb3duLCBhbmQgQUxMIGZhdGFsXG4gKiByZWZ1c2FscyBhcmUgcmVwb3J0ZWQgdG9nZXRoZXIuIFN0b3BwaW5nIGF0IHRoZSBmaXJzdCBtZWFudCBhIHBpcGVsaW5lIHdpdGhcbiAqIHRocmVlIHJlZnVzZWQgcGx1Z2lucyB0b29rIHRocmVlIHN5bnRoIGF0dGVtcHRzIHRvIGxlYXJuIGFib3V0IGFsbCB0aHJlZS5cbiAqXG4gKiBFdmVyeSBsb29rdXAgd2FybmluZyBpcyBwcmludGVkLCBncmFkZWQgYnkgc2V2ZXJpdHksIGFuZCBhcHBlbmRlZCB0b1xuICogYHdhcm5pbmdTaW5rYCB3aGVuIGdpdmVuICh0aGUgc3ludGggcHJpbnRzIGEgb25lLWxpbmUgc3VtbWFyeSBhdCBpdHMgZW5kKS5cbiAqIEEgd2FybmluZyBuZXZlciBmYWlscyB0aGUgc3ludGgg4oCUIHZ1bG5lcmFiaWxpdHkgc3RhdGUgaXMgcmVwb3J0ZWQsIG5vdFxuICogZW5mb3JjZWQuXG4gKlxuICogV2hlbiB0aGUgcHJvcHMgY2FycnkgYSBgcGlwZWxpbmVJZGAsIGVhY2ggbG9va3VwIGFsc28gc2VuZHNcbiAqIGBjb250ZXh0OiB7IHBpcGVsaW5lSWQsIHN0ZXBLZXlzIH1gIOKAlCB0aGUgbGFiZWwgKGBwbHVnaW5TdGVwTGFiZWxgOiBgc3ludGhgIG9yXG4gKiBgPHN0YWdlPi88YWxpYXMgPz8gbmFtZT5gKSBvZiBFVkVSWSBzdGVwIHRoZSBkZS1kdXBsaWNhdGVkIHJlZmVyZW5jZSBzZXJ2ZXMg4oCUXG4gKiBzbyB0aGUgcGx1Z2luIHNlcnZpY2UgY2FuIHJlY29yZCB0aGUgd2FybmluZ3MgaXQgcmV0dXJucyBhZ2FpbnN0IGVhY2ggb2ZcbiAqIHRob3NlIHBpcGVsaW5lIHN0ZXBzLCBub3Qgb25seSBwcmludCB0aGVtIGludG8gdGhpcyBzeW50aCdzIGxvZy5cbiAqXG4gKiBLZXllZCBieSBgYWxpYXMgfHwgbmFtZWAgdG8gbWF0Y2ggYFBsdWdpbkxvb2t1cC5wbHVnaW4oKWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlUGx1Z2luc0ZvclByb3BzKFxuICBjbGllbnQ6IEFwaUNsaWVudCxcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB3YXJuaW5nU2luaz86IExvb2t1cFdhcm5pbmdbXSxcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgcmVmcyA9IGNvbGxlY3RQbHVnaW5SZWZzKHByb3BzKTtcbiAgaWYgKHJlZnMubGVuZ3RoID09PSAwKSByZXR1cm4ge307XG5cbiAgY29uc3QgcGlwZWxpbmVJZCA9IHR5cGVvZiBwcm9wcy5waXBlbGluZUlkID09PSAnc3RyaW5nJyAmJiBwcm9wcy5waXBlbGluZUlkLmxlbmd0aCA+IDAgPyBwcm9wcy5waXBlbGluZUlkIDogdW5kZWZpbmVkO1xuICAvLyBPbmUgbG9va3VwIHBlciBhbGlhcyBtYXkgc2VydmUgc2V2ZXJhbCBzdGVwczogdGhlIGxhYmVscyBvZiBlYWNoLCBieSBhbGlhcy5cbiAgY29uc3Qgc3RlcEtleXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIGZvciAoY29uc3Qgc3RlcCBvZiBjb2xsZWN0UGx1Z2luU3RlcHMocHJvcHMpKSB7XG4gICAgY29uc3Qga2V5ID0gY2FjaGVLZXkoc3RlcCk7XG4gICAgc3RlcEtleXMuc2V0KGtleSwgWy4uLihzdGVwS2V5cy5nZXQoa2V5KSA/PyBbXSksIHN0ZXAubGFiZWxdKTtcbiAgfVxuICBjb25zdCByZXNvbHZlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgY29uc3QgZmF0YWw6IFBsdWdpblJlZnVzYWxbXSA9IFtdO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKHJlZnMubWFwKGFzeW5jIChyZWYpID0+IHtcbiAgICBjb25zdCBrZXkgPSBjYWNoZUtleShyZWYpO1xuICAgIGNvbnN0IGxhYmVsID0gcmVmLnB1Ymxpc2hlciA/IGAke3JlZi5wdWJsaXNoZXJ9LyR7cmVmLm5hbWV9YCA6IHJlZi5uYW1lO1xuICAgIC8vIFRoZSBwbHVnaW4gTkFNRSBsaXZlcyBvbiB0aGUgcmVmIChhIHNpYmxpbmcgb2YgYGZpbHRlcmApLCBOT1QgaW5zaWRlIHRoZVxuICAgIC8vIGZpbHRlciBvYmplY3Qg4oCUIGJ1dCB0aGUgbG9va3VwIG1hdGNoZXMgb24gdGhlIGZpbHRlci4gQSBmaWx0ZXIgd2l0aG91dFxuICAgIC8vIGBuYW1lYCAoZS5nLiBge3ZlcnNpb24sIHZpc2liaWxpdHksIGlzQWN0aXZlLCBpc0RlZmF1bHR9YCkgbWF0Y2hlcyBBTllcbiAgICAvLyBwbHVnaW4gd2l0aCB0aG9zZSBhdHRyaWJ1dGVzLCBhbmQgdGhlIGVuZHBvaW50IHJldHVybnMgYW4gYXJiaXRyYXJ5IG9uZVxuICAgIC8vIChzZWVuOiBgZG9ja2VyZmlsZS1tdWx0aS1wcm92aWRlcmApLiBUaGF0IG1hZGUgdGhlIHN5bnRoIGFuZCBldmVyeSBzdGVwXG4gICAgLy8gcmVzb2x2ZSB0byB0aGUgV1JPTkcgcGx1Z2luLiBTbyB3aGVuIHRoZSBmaWx0ZXIgb21pdHMgYG5hbWVgLCBmYWxsIGJhY2sgdG9cbiAgICAvLyB0aGUgcmVmJ3MgcGx1Z2luIG5hbWU7IGFuIGV4cGxpY2l0IGZpbHRlciBgbmFtZWAgc3RpbGwgdGFrZXMgcHJlY2VkZW5jZS5cbiAgICAvLyBTaGFyZWQgd2l0aCB0aGUgcGlwZWxpbmUgc2VydmljZSdzIGNvbnRyYWN0IGNoZWNrIChzYW1lIGZpbHRlciwgc2FtZSBwbHVnaW4pLlxuICAgIGNvbnN0IGZpbHRlciA9IHBsdWdpbkxvb2t1cEZpbHRlcihyZWYpO1xuICAgIGNvbnN0IHBpbiA9IGV4YWN0VmVyc2lvblBpbihyZWYpO1xuICAgIGNvbnN0IHJlZnVzZSA9IChjb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQgPT4geyBmYXRhbC5wdXNoKHsgcGx1Z2luOiBsYWJlbCwgY29kZSwgbWVzc2FnZSB9KTsgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgY2xpZW50LnBvc3Q8dW5rbm93bj4oJy9hcGkvcGx1Z2lucy9sb29rdXAnLCB7XG4gICAgICAgIGZpbHRlcixcbiAgICAgICAgLi4uKHBpcGVsaW5lSWQgJiYgc3RlcEtleXMuaGFzKGtleSkgPyB7IGNvbnRleHQ6IHsgcGlwZWxpbmVJZCwgc3RlcEtleXM6IHN0ZXBLZXlzLmdldChrZXkpIH0gfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgeyBwbHVnaW4sIHdhcm5pbmdzIH0gPSB1bndyYXBMb29rdXAocmVzKTtcbiAgICAgIGZvciAoY29uc3Qgd2FybmluZyBvZiB3YXJuaW5ncykge1xuICAgICAgICBwcmludExvb2t1cFdhcm5pbmcobGFiZWwsIHdhcm5pbmcpO1xuICAgICAgICB3YXJuaW5nU2luaz8ucHVzaCh3YXJuaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmIChwbHVnaW4pIHtcbiAgICAgICAgcmVzb2x2ZWRba2V5XSA9IHBsdWdpbjtcbiAgICAgIH0gZWxzZSBpZiAocGluKSB7XG4gICAgICAgIHJlZnVzZSgnUExVR0lOX1ZFUlNJT05fTk9UX0ZPVU5EJywgcGluTm90Rm91bmRNZXNzYWdlKGxhYmVsLCBwaW4pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByaW50V2FybmluZyhgUGx1Z2luIFwiJHtsYWJlbH1cIiBsb29rdXAgcmV0dXJuZWQgbm8gcmVjb3JkIOKAlCBmYWxsaW5nIGJhY2sgdG8gZGVwbG95LXRpbWUgcmVzb2x1dGlvbmApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gQSBwbHVnaW4gd2hvc2UgaW1hZ2Ugc2lnbmF0dXJlIGRvZXNuJ3QgdmVyaWZ5LCBvciBhIGxpc3RpbmcgdGhlIG9yZ1xuICAgICAgLy8gY2FuJ3QgdXNlLCBpcyBOT1QgYW4gb3V0YWdlIHRvIHJpZGUgb3V0OiBmYWxsaW5nIGJhY2sgd291bGQgcXVpZXRseVxuICAgICAgLy8gdHVybiBpdCBpbnRvIGFuIHVucmVzb2x2ZWQgc3RlcC4gU3RvcC5cbiAgICAgIGNvbnN0IGNvZGUgPSBmYXRhbExvb2t1cENvZGUoZXJyKTtcbiAgICAgIGlmIChjb2RlID09PSBFcnJvckNvZGUuSU1BR0VfVkVSSUZJQ0FUSU9OX0ZBSUxFRCkge1xuICAgICAgICByZWZ1c2UoY29kZSwgYFBsdWdpbiBcIiR7bGFiZWx9XCIgaW1hZ2UgZmFpbGVkIHNpZ25hdHVyZSB2ZXJpZmljYXRpb246ICR7ZXJyb3JNZXNzYWdlKGVycil9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb2RlKSB7XG4gICAgICAgIHJlZnVzZShjb2RlLCBgUGx1Z2luIFwiJHtsYWJlbH1cIiBjYW4ndCBiZSB1c2VkICgke2NvZGV9KTogJHtzZXJ2aWNlTWVzc2FnZShlcnIpID8/IGVycm9yTWVzc2FnZShlcnIpfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocGluICYmIGlzTm90Rm91bmQoZXJyKSkge1xuICAgICAgICByZWZ1c2UoJ1BMVUdJTl9WRVJTSU9OX05PVF9GT1VORCcsIHBpbk5vdEZvdW5kTWVzc2FnZShsYWJlbCwgcGluLCBlcnIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbXNnID0gZXJyb3JNZXNzYWdlKGVycik7XG4gICAgICBwcmludFdhcm5pbmcoYFBsdWdpbiBcIiR7bGFiZWx9XCIgcHJlLXJlc29sdXRpb24gZmFpbGVkICgke21zZ30pIOKAlCBmYWxsaW5nIGJhY2sgdG8gZGVwbG95LXRpbWUgcmVzb2x1dGlvbmApO1xuICAgIH1cbiAgfSkpO1xuXG4gIGlmIChmYXRhbC5sZW5ndGggPiAwKSB0aHJvdyBuZXcgUGx1Z2luUmVzb2x1dGlvbkVycm9yKGZhdGFsKTtcbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuIl19
298
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdmVyLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvcGx1Z2luLXJlc29sdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRixPQUFPLEVBQ0wsa0JBQWtCLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQ2hFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLHVCQUF1QixFQUFFLFlBQVksR0FDL0UsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLElBQUksTUFBTSxZQUFZLENBQUM7QUFDOUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQVdqRDs7OztHQUlHO0FBQ0gsU0FBUyxRQUFRLENBQUMsR0FBYztJQUM5QixPQUFPLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBOEI7SUFDdkQsTUFBTSxJQUFJLEdBQWdCLEVBQUUsQ0FBQztJQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUV2QyxNQUFNLElBQUksR0FBRyxDQUFDLEdBQVksRUFBUSxFQUFFO1FBQ2xDLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtZQUFFLE9BQU87UUFDNUMsTUFBTSxDQUFDLEdBQUcsR0FBZ0IsQ0FBQztRQUMzQixJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ3BCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4Qix3RUFBd0U7UUFDeEUsMkVBQTJFO1FBQzNFLE1BQU0sSUFBSSxH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LENBQUM7WUFDRCxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsWUFBWSxDQUFDLFdBQVcsS0FBSyw0QkFBNEIsR0FBRyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQzVHLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRUosSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxNQUFNLElBQUkscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBFcnJvckNvZGUsIGVycm9yTWVzc2FnZSwgaXNNYW5hZ2VkVG9vbGNoYWluUGx1Z2luIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHtcbiAgY29sbGVjdFBsdWdpblN0ZXBzLCBleGFjdFBpbk5vdEZvdW5kTWVzc2FnZSwgbG9va3VwTm90Rm91bmRTdGF0ZSwgdHlwZSBMb29rdXBUb29sY2hhaW4sIHR5cGUgTG9va3VwV2FybmluZywgdHlwZSBMb29rdXBXYXJuaW5nU2V2ZXJpdHksXG4gIHBsdWdpbkFydGlmYWN0QWxpYXMsIHBsdWdpbkxvb2t1cEZpbHRlciwgc3VtbWFyaXplTG9va3VwV2FybmluZ3MsIHVud3JhcExvb2t1cCxcbn0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZSc7XG5pbXBvcnQgcGljbyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCB7IEFwaUNsaWVudCB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBwcmludFdhcm5pbmcgfSBmcm9tICcuL291dHB1dC11dGlscy5qcyc7XG5cbi8qKiBNaW5pbWFsIHBsdWdpbiByZWZlcmVuY2Ugc2hhcGUg4oCUIG1hdGNoZXMgUGx1Z2luT3B0aW9ucyBmcm9tIHBpcGVsaW5lLWNvcmUuICovXG5pbnRlcmZhY2UgUGx1Z2luUmVmIHtcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogUHVibGlzaGVyIGhhbmRsZSBvZiBhbiBpbnN0YWxsZWQgbGlzdGluZy4gKi9cbiAgcHVibGlzaGVyPzogc3RyaW5nO1xuICBhbGlhcz86IHN0cmluZztcbiAgZmlsdGVyPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogQ2FjaGUga2V5IG1hdGNoaW5nIGBQbHVnaW5Mb29rdXAubm9ybWFsaXplKClgOiB0aGUgZXhwbGljaXQgYWxpYXMgd2hlbiBzZXQsXG4gKiBvdGhlcndpc2UgYFs8cHVibGlzaGVyPi1dPG5hbWU+LWFsaWFzYCDigJQgcGlwZWxpbmUtY29yZSdzXG4gKiBgcGx1Z2luQXJ0aWZhY3RBbGlhc2AsIHRoZSBvbmUgcnVsZSBldmVyeSBjb25zdW1lciBvZiB0aGlzIG1hcCB1c2VzLlxuICovXG5mdW5jdGlvbiBjYWNoZUtleShyZWY6IFBsdWdpblJlZik6IHN0cmluZyB7XG4gIHJldHVybiBwbHVnaW5BcnRpZmFjdEFsaWFzKHJlZik7XG59XG5cbi8qKlxuICogV2FsayB0aGUgcGlwZWxpbmUgcHJvcHMgdHJlZSB0byBjb2xsZWN0IGV2ZXJ5IHBsdWdpbiByZWZlcmVuY2UuIFBsdWdpbnNcbiAqIGFwcGVhciBhdCBgc3ludGgucGx1Z2luYCBhbmQgYXQgYHN0YWdlc1tdLnN0ZXBzW10ucGx1Z2luYC4gRW50cmllcyBhcmVcbiAqIGRlLWR1cGxpY2F0ZWQgYnkgYGNhY2hlS2V5KClgIOKAlCB0aGUgc2FtZSBrZXkgYFBsdWdpbkxvb2t1cC5wbHVnaW4oKWAgdXNlcyxcbiAqIHNvIHRoZSByZXNvbHZlZC1wbHVnaW5zIG1hcCBsb29rdXBzIG1hdGNoIGRvd25zdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RQbHVnaW5SZWZzKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFBsdWdpblJlZltdIHtcbiAgY29uc3QgcmVmczogUGx1Z2luUmVmW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgY29uc3QgcHVzaCA9IChyYXc6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgIGNvbnN0IHIgPSByYXcgYXMgUGx1Z2luUmVmO1xuICAgIGlmICghci5uYW1lKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gY2FjaGVLZXkocik7XG4gICAgLy8gVGhlIG5hbWUgdGhlIGxvb2t1cCB3aWxsIFRBUkdFVCDigJQgYW4gZXhwbGljaXQgYGZpbHRlci5uYW1lYCB3aW5zIChzZWVcbiAgICAvLyBiZWxvdyksIHNvIHR3byByZWZzIHRoYXQgcmVzb2x2ZSB0byB0aGUgc2FtZSBwbHVnaW4gYXJlIG5vdCBhIGNvbGxpc2lvbi5cbiAgICBjb25zdCBuYW1lID0gKHIuZmlsdGVyPy5uYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gci5uYW1lO1xuICAgIGNvbnN0IHRhcmdldCA9IHIucHVibGlzaGVyID8gYCR7ci5wdWJsaXNoZXJ9LyR7bmFtZX1gIDogbmFtZTtcbiAgICBjb25zdCBob2xkZXIgPSBzZWVuLmdldChrZXkpO1xuICAgIGlmIChob2xkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gT25lIGFsaWFzIGNhbiBvbmx5IGV2ZXIgbWVhbiBvbmUgcGx1Z2luLiBEZWR1cGxpY2F0aW5nIG9uIHRoZSBhbGlhc1xuICAgICAgLy8gYWxvbmUga2VwdCB0aGUgRklSU1QgcGx1Z2luIGFuZCBzaWxlbnRseSBkcm9wcGVkIHRoZSBzZWNvbmQsIHNvIGEgc3RlcFxuICAgICAgLy8gZGVjbGFyaW5nIGB7IG5hbWU6ICdtYXZlbi1idWlsZCcsIGFsaWFzOiAnYnVpbGQnIH1gIGFmdGVyIGFub3RoZXJcbiAgICAgIC8vIGRlY2xhcmluZyBgeyBuYW1lOiAnbm9kZWpzLWJ1aWxkJywgYWxpYXM6ICdidWlsZCcgfWAgcmFuIG5vZGVqcy1idWlsZCdzXG4gICAgICAvLyBpbWFnZSBhbmQgY29tbWFuZHMg4oCUIG5vIGVycm9yLCBqdXN0IHRoZSB3cm9uZyBidWlsZC5cbiAgICAgIGlmIChob2xkZXIgIT09IHRhcmdldCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBsdWdpbiBhbGlhcyBcIiR7a2V5fVwiIGlzIHVzZWQgZm9yIHR3byBkaWZmZXJlbnQgcGx1Z2lucyAoXCIke2hvbGRlcn1cIiBhbmQgXCIke3RhcmdldH1cIikuIGBcbiAgICAgICAgICArICdHaXZlIGVhY2ggcGx1Z2luIGl0cyBvd24gYWxpYXMuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2Vlbi5zZXQoa2V5LCB0YXJnZXQpO1xuICAgIHJlZnMucHVzaChyKTtcbiAgfTtcblxuICBjb25zdCBzeW50aCA9IHByb3BzLnN5bnRoIGFzIHsgcGx1Z2luPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICBwdXNoKHN5bnRoPy5wbHVnaW4pO1xuXG4gIGNvbnN0IHN0YWdlcyA9IHByb3BzLnN0YWdlcyBhcyBBcnJheTx7IHN0ZXBzPzogQXJyYXk8eyBwbHVnaW4/OiB1bmtub3duIH0+IH0+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHN0YWdlIG9mIHN0YWdlcyA/PyBbXSkge1xuICAgIGZvciAoY29uc3Qgc3RlcCBvZiBzdGFnZS5zdGVwcyA/PyBbXSkge1xuICAgICAgcHVzaChzdGVwLnBsdWdpbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlZnM7XG59XG5cbi8qKlxuICogTG9va3VwIHJlZnVzYWxzIHRoYXQgbXVzdCBTVE9QIHRoZSBzeW50aCByYXRoZXIgdGhhbiBmYWxsIGJhY2sgdG9cbiAqIGRlcGxveS10aW1lIHJlc29sdXRpb246IGFuIGltYWdlIHdob3NlIHNpZ25hdHVyZSBkb2Vzbid0IHZlcmlmeSwgYSBsaXN0aW5nXG4gKiB0aGUgb3JnIGNhbid0IHVzZSAobm90IGluc3RhbGxlZCwgYmxvY2tlZCBieSBpdHMgYWxsb3cvZGVueSBwb2xpY3ksIHlhbmtlZFxuICogb3Igc3VzcGVuZGVkKSwgYW5kIGFuIG9yZyBwbHVnaW4gdGhhdCB3YXMgZGVsZXRlZC4gRmFsbGluZyBiYWNrIHdvdWxkXG4gKiBxdWlldGx5IHR1cm4gZWFjaCBpbnRvIGFuIHVucmVzb2x2ZWQgc3RlcCB0aGF0IGZhaWxzIGF0IHJ1biB0aW1lIGluc3RlYWQgb2ZcbiAqIG5vdy4gVnVsbmVyYWJpbGl0eSBzdGF0ZSBpcyBORVZFUiBvbmUgb2YgdGhlc2U6IGl0IGFycml2ZXMgYXMgZ3JhZGVkXG4gKiB3YXJuaW5ncyBiZXNpZGUgYSByZXNvbHZlZCBwbHVnaW4uXG4gKi9cbmNvbnN0IEZBVEFMX0xPT0tVUF9DT0RFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIEVycm9yQ29kZS5JTUFHRV9WRVJJRklDQVRJT05fRkFJTEVELFxuICBFcnJvckNvZGUuUExVR0lOX05PVF9JTlNUQUxMRUQsXG4gIEVycm9yQ29kZS5QTFVHSU5fQkxPQ0tFRF9CWV9QT0xJQ1ksXG4gIEVycm9yQ29kZS5QTFVHSU5fVU5BVkFJTEFCTEUsXG4gIC8vIFRoZSBvcmcncyBvd24gcGx1Z2luIHdhcyBkZWxldGVkOiB0aGUgbG9va3VwIHJlZnVzZXMgaXQgcmF0aGVyIHRoYW4gZmFsbFxuICAvLyB0aHJvdWdoIHRvIGEgc2FtZS1uYW1lIGxpc3RpbmcuIChQbHVnaW4gc2VydmljZSBjb2RlOyBtYXRjaGVkIGFzIGEgc3RyaW5nLilcbiAgJ1BMVUdJTl9ERUxFVEVEJyxcbl07XG5cbi8qKiBUaGUgZXJyb3IgY29kZSBvZiBhIHBsdWdpbiBzZXJ2aWNlIGFuc3dlciwgd2hlbiBpdCBpcyBvbmUgb2Yge0BsaW5rIEZBVEFMX0xPT0tVUF9DT0RFU30uICovXG5mdW5jdGlvbiBmYXRhbExvb2t1cENvZGUoZXJyOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGRhdGEgPSAoZXJyIGFzIHsgcmVzcG9uc2U/OiB7IGRhdGE/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJlc3BvbnNlPy5kYXRhO1xuICBjb25zdCBjb2RlID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyAoZGF0YSBhcyB7IGNvZGU/OiB1bmtub3duIH0pLmNvZGUgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2YgY29kZSA9PT0gJ3N0cmluZycgJiYgRkFUQUxfTE9PS1VQX0NPREVTLmluY2x1ZGVzKGNvZGUpID8gY29kZSA6IG51bGw7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBwbHVnaW4gc2VydmljZSBhbnN3ZXJlZCBcIm5vIHN1Y2ggcGx1Z2luL3ZlcnNpb25cIiAoNDA0IE5PVF9GT1VORCkuICovXG5mdW5jdGlvbiBpc05vdEZvdW5kKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBjb25zdCByZXNwb25zZSA9IChlcnIgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogdW5rbm93bjsgZGF0YT86IHVua25vd24gfSB9IHwgdW5kZWZpbmVkKT8ucmVzcG9uc2U7XG4gIGNvbnN0IGNvZGUgPSByZXNwb25zZT8uZGF0YSAmJiB0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ29iamVjdCcgPyAocmVzcG9uc2UuZGF0YSBhcyB7IGNvZGU/OiB1bmtub3duIH0pLmNvZGUgOiB1bmRlZmluZWQ7XG4gIHJldHVybiByZXNwb25zZT8uc3RhdHVzID09PSA0MDQgfHwgY29kZSA9PT0gRXJyb3JDb2RlLk5PVF9GT1VORDtcbn1cblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBhIHJlZmVyZW5jZSBQSU5TIOKAlCBvbmUgZXhhY3QgYHgueS56Wy1wcmVdYCwgbm90IGEgcmFuZ2Ugb3JcbiAqIGBsYXRlc3RgLiBBIHBpbiBuYW1lcyBhIHZlcnNpb24gdGhhdCBtdXN0IGV4aXN0OiBpZiBpdCBkb2Vzbid0IChuZXZlclxuICogcHVibGlzaGVkLCBvciByZWZ1c2VkIGJ5IHRoZSBidWlsZCdzIHZ1bG5lcmFiaWxpdHkgZ2F0ZSwgd2hpY2ggc2F2ZXNcbiAqIG5vdGhpbmcpLCB0aGVyZSBpcyBubyBvdXRhZ2UgdG8gcmlkZSBvdXQgYW5kIG5vdGhpbmcgZm9yIHRoZSBkZXBsb3ktdGltZVxuICogbG9va3VwIHRvIGZpbmQgZWl0aGVyLlxuICovXG5mdW5jdGlvbiBleGFjdFZlcnNpb25QaW4ocmVmOiBQbHVnaW5SZWYpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgdmVyc2lvbiA9IHJlZi5maWx0ZXI/LnZlcnNpb247XG4gIHJldHVybiB0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycgJiYgL15cXGQrXFwuXFxkK1xcLlxcZCsoLVswLTlBLVphLXouLV0rKT8kLy50ZXN0KHZlcnNpb24pID8gdmVyc2lvbiA6IG51bGw7XG59XG5cbi8qKlxuICogV2hldGhlciBhIHJlZmVyZW5jZSBuYW1lcyBhIG1hbmFnZWQgdG9vbGNoYWluIGhhbGYgKGBjZGstc3ludGhgKTogdGhlXG4gKiBzeXN0ZW0gb3JnJ3MsIG5ldmVyIGEgbGlzdGluZyDigJQgc28gbm8gcHVibGlzaGVyLiBJdCByZXNvbHZlcyB0aHJvdWdoIHRoZVxuICogdG9vbGNoYWluIHJlbGVhc2UgKHRoZSBwaXBlbGluZSdzIGB0b29sY2hhaW4ucmVsZWFzZWAgcGluLCBlbHNlIHRoZSBvcmcgL1xuICogY2FuYXJ5IC8gcGxhdGZvcm0gZGVmYXVsdCksIG5ldmVyIGJ5IGl0cyBvd24gdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWFuYWdlZFRvb2xjaGFpblJlZihyZWY6IHsgbmFtZT86IHN0cmluZzsgcHVibGlzaGVyPzogc3RyaW5nOyBmaWx0ZXI/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9KTogYm9vbGVhbiB7XG4gIGlmIChyZWYucHVibGlzaGVyKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IG5hbWUgPSB0eXBlb2YgcmVmLmZpbHRlcj8ubmFtZSA9PT0gJ3N0cmluZycgPyByZWYuZmlsdGVyLm5hbWUgOiByZWYubmFtZTtcbiAgcmV0dXJuIGlzTWFuYWdlZFRvb2xjaGFpblBsdWdpbihuYW1lKTtcbn1cblxuLyoqIFRoZSBwaXBlbGluZSdzIHRvb2xjaGFpbiByZWxlYXNlIHBpbiAoYHByb3BzLnRvb2xjaGFpbi5yZWxlYXNlYCksIHdoZW4gc2V0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvb2xjaGFpblJlbGVhc2VQaW4ocHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdG9vbGNoYWluID0gcHJvcHMudG9vbGNoYWluIGFzIHsgcmVsZWFzZT86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiB0b29sY2hhaW4/LnJlbGVhc2UgPT09ICdzdHJpbmcnICYmIHRvb2xjaGFpbi5yZWxlYXNlLmxlbmd0aCA+IDAgPyB0b29sY2hhaW4ucmVsZWFzZSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFRoZSBwbHVnaW4gc2VydmljZSdzIGVycm9yIGNvZGUgb24gYSByZWZ1c2VkIGFuc3dlciwgd2hlbiBpdCBjYXJyaWVzIG9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aWNlRXJyb3JDb2RlKGVycjogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBkYXRhID0gKGVyciBhcyB7IHJlc3BvbnNlPzogeyBkYXRhPzogdW5rbm93biB9IH0gfCB1bmRlZmluZWQpPy5yZXNwb25zZT8uZGF0YTtcbiAgY29uc3QgY29kZSA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gKGRhdGEgYXMgeyBjb2RlPzogdW5rbm93biB9KS5jb2RlIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnICYmIGNvZGUubGVuZ3RoID4gMCA/IGNvZGUgOiBudWxsO1xufVxuXG4vKiogT25lIHBsdWdpbiB0aGUgc3ludGggY291bGQgbm90IHVzZSwgYXMge0BsaW5rIFBsdWdpblJlc29sdXRpb25FcnJvcn0gcmVwb3J0cyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luUmVmdXNhbCB7XG4gIC8qKiBgWzxwdWJsaXNoZXI+L108bmFtZT5gIG9mIHRoZSByZWZlcmVuY2UuICovXG4gIHJlYWRvbmx5IHBsdWdpbjogc3RyaW5nO1xuICAvKiogVGhlIHBsdWdpbiBzZXJ2aWNlJ3MgZXJyb3IgY29kZSwgb3IgYSBsb2NhbCBvbmUgKGBQTFVHSU5fVkVSU0lPTl9OT1RfRk9VTkRgKS4gKi9cbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXZlcnkgZmF0YWwgcmVmdXNhbCBvZiBvbmUgcHJlLXJlc29sdXRpb24gcGFzcy4gQ2FycmllcyB0aGUgc3RydWN0dXJlZCBsaXN0XG4gKiBhcyB3ZWxsIGFzIHRoZSBodW1hbiBtZXNzYWdlLCBzbyB0aGUgc3ludGggY2FuIGVtaXQgYSBtYWNoaW5lLXJlYWRhYmxlXG4gKiBmYWlsdXJlIGxpbmUgKGBQQl9TWU5USF9GQUlMVVJFYCkgdGhlIGV4ZWN1dGlvbiBldmVudHMgcGljayB1cC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpblJlc29sdXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocmVhZG9ubHkgcmVmdXNhbHM6IHJlYWRvbmx5IFBsdWdpblJlZnVzYWxbXSkge1xuICAgIHN1cGVyKHJlZnVzYWxzLmxlbmd0aCA9PT0gMVxuICAgICAgPyByZWZ1c2Fsc1swXSEubWVzc2FnZVxuICAgICAgOiBgJHtyZWZ1c2Fscy5sZW5ndGh9IHBsdWdpbnMgY2FuJ3QgYmUgdXNlZDpcXG4ke3JlZnVzYWxzLm1hcCgocikgPT4gYCAgLSAke3IubWVzc2FnZX1gKS5qb2luKCdcXG4nKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luUmVzb2x1dGlvbkVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFdoeSBhbiBleGFjdCBwaW4gd2FzIG5vdCBmb3VuZCwgcGhyYXNlZCBmcm9tIHRoZSA0MDQncyBgZGV0YWlscy5zdGF0ZWBcbiAqIChgZGVsZXRlZGAgLyBgaW5hY3RpdmVgIC8gYHlhbmtlZGAgLyBgbWlzc2luZ2ApLiBXaXRob3V0IGEgc3RhdGUgdGhlIGFuc3dlclxuICogY2Fubm90IHRlbGwgdGhlIGNhc2VzIGFwYXJ0LCBzbyB0aGUgbWVzc2FnZSBuYW1lcyB0aGUgdHdvIGxpa2VsaWVzdC5cbiAqIFNoYXJlZCB3aXRoIHRoZSBkZXBsb3ktdGltZSBMYW1iZGEncyBDbG91ZEZvcm1hdGlvbiByZWFzb24gKHBpcGVsaW5lLWNvcmUpLlxuICovXG5mdW5jdGlvbiBwaW5Ob3RGb3VuZE1lc3NhZ2UobGFiZWw6IHN0cmluZywgcGluOiBzdHJpbmcsIGVycj86IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gZXhhY3RQaW5Ob3RGb3VuZE1lc3NhZ2UobGFiZWwsIHBpbiwgbG9va3VwTm90Rm91bmRTdGF0ZShlcnIpKTtcbn1cblxuY29uc3QgU0VWRVJJVFlfU1RZTEU6IFJlY29yZDxMb29rdXBXYXJuaW5nU2V2ZXJpdHksIChzOiBzdHJpbmcpID0+IHN0cmluZz4gPSB7XG4gIGluZm86IHBpY28uY3lhbixcbiAgd2FybmluZzogcGljby55ZWxsb3csXG4gIGVycm9yOiBwaWNvLnJlZCxcbiAgY3JpdGljYWw6ICh0KSA9PiBwaWNvLmJvbGQocGljby5yZWQodCkpLFxufTtcblxuLyoqIFByaW50IG9uZSBsb29rdXAgd2FybmluZywgcHJlZml4ZWQgYW5kIGNvbG91cmVkIGJ5IGl0cyBzZXZlcml0eS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmludExvb2t1cFdhcm5pbmcobGFiZWw6IHN0cmluZywgd2FybmluZzogTG9va3VwV2FybmluZyk6IHZvaWQge1xuICBjb25zdCB0YWcgPSBTRVZFUklUWV9TVFlMRVt3YXJuaW5nLnNldmVyaXR5XShgWyR7d2FybmluZy5zZXZlcml0eS50b1VwcGVyQ2FzZSgpfV1gKTtcbiAgcHJpbnRXYXJuaW5nKGAke3RhZ30gUGx1Z2luIFwiJHtsYWJlbH1cIjogJHt3YXJuaW5nLm1lc3NhZ2V9YCk7XG59XG5cbi8qKiBQcmludCB0aGUgb25lLWxpbmUgc2V2ZXJpdHkgc3VtbWFyeSBvZiBhIHN5bnRoJ3MgbG9va3VwIHdhcm5pbmdzIChub3RoaW5nIHdoZW4gbm9uZSkuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRMb29rdXBXYXJuaW5nU3VtbWFyeSh3YXJuaW5nczogcmVhZG9ubHkgTG9va3VwV2FybmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGxpbmUgPSBzdW1tYXJpemVMb29rdXBXYXJuaW5ncyh3YXJuaW5ncyk7XG4gIGlmICghbGluZSkgcmV0dXJuO1xuICBjb25zdCB3b3JzdCA9IHdhcm5pbmdzLnNvbWUoKHcpID0+IHcuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpID8gJ2NyaXRpY2FsJ1xuICAgIDogd2FybmluZ3Muc29tZSgodykgPT4gdy5zZXZlcml0eSA9PT0gJ2Vycm9yJykgPyAnZXJyb3InXG4gICAgICA6IHdhcm5pbmdzLnNvbWUoKHcpID0+IHcuc2V2ZXJpdHkgPT09ICd3YXJuaW5nJykgPyAnd2FybmluZycgOiAnaW5mbyc7XG4gIHByaW50V2FybmluZyhTRVZFUklUWV9TVFlMRVt3b3JzdF0obGluZSkpO1xufVxuXG4vKiogVGhlIHBsdWdpbiBzZXJ2aWNlJ3Mgb3duIHJlZnVzYWwgbWVzc2FnZSwgd2hlbiB0aGUgYW5zd2VyIGNhcnJpZXMgb25lLiAqL1xuZnVuY3Rpb24gc2VydmljZU1lc3NhZ2UoZXJyOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGRhdGEgPSAoZXJyIGFzIHsgcmVzcG9uc2U/OiB7IGRhdGE/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJlc3BvbnNlPy5kYXRhO1xuICBjb25zdCBtZXNzYWdlID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyAoZGF0YSBhcyB7IG1lc3NhZ2U/OiB1bmtub3duIH0pLm1lc3NhZ2UgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgbWVzc2FnZS5sZW5ndGggPiAwID8gbWVzc2FnZSA6IG51bGw7XG59XG5cbi8qKlxuICogUHJlLXJlc29sdmUgcGx1Z2lucyBieSBjYWxsaW5nIHRoZSBzYW1lIGBQT1NUIC9hcGkvcGx1Z2lucy9sb29rdXBgIGVuZHBvaW50XG4gKiB0aGUgZGVwbG95LXRpbWUgY3VzdG9tIHJlc291cmNlIExhbWJkYSB1c2VzLiBSZXR1cm5pbmcgdGhlIGZ1bGwgUGx1Z2luXG4gKiByZWNvcmQgYXQgc3ludGggdGltZSBpcyB3aGF0IGFsbG93cyB0aGUgcmVzdWx0aW5nIENGTiB0ZW1wbGF0ZSB0byBzaGlwXG4gKiB3aXRoIHJlYWwgQ29kZUJ1aWxkIGltYWdlIFVSSXMgKGA8aG9zdD4vPG5zPi88bmFtZT46PHZlcnNpb24+YCkgcmF0aGVyIHRoYW5cbiAqIHRoZSBwaXBlbGluZSdzIGRlZmF1bHQgaW1hZ2UgdGhhdCB0aGUgc3ludGgtdGltZSB0b2tlbiBwYXRoIGZvcmNlcy5cbiAqXG4gKiBGYWlsdXJlcyBhcmUgbm9uLWZhdGFsOiBhIG1pc3NpbmcgcGx1Z2luIG9yIHVucmVhY2hhYmxlIEFQSSBsb2dzIGEgd2FybmluZ1xuICogYW5kIGZhbGxzIHRocm91Z2ggdG8gdGhlIGRlcGxveS10aW1lIGN1c3RvbSByZXNvdXJjZSBwYXRoIHNvIHBhcnRpYWxcbiAqIHBsYXRmb3JtIG91dGFnZXMgZG9uJ3QgYmxvY2sgc3ludGgvZGVwbG95LiBUaGUgZXhjZXB0aW9ucyBhYm9ydCB0aGUgc3ludGg6XG4gKiB0aGUge0BsaW5rIEZBVEFMX0xPT0tVUF9DT0RFU30gcmVmdXNhbHMsIGFuIGV4YWN0IHZlcnNpb24gcGluIHRoYXQgZG9lc1xuICogbm90IGV4aXN0LCBhbmQgQU5ZIGZhaWx1cmUgb24gYSBtYW5hZ2VkIHRvb2xjaGFpbiByZWZlcmVuY2UgKGBjZGstc3ludGhgKSxcbiAqIHdoaWNoIGhhcyBubyBkZXBsb3ktdGltZSBmYWxsYmFjayAoRDIpLiBBIG1hbmFnZWQgcmVmZXJlbmNlIHNlbmRzIHRoZVxuICogcGlwZWxpbmUncyBgdG9vbGNoYWluLnJlbGVhc2VgIGFzIGByZWxlYXNlUGluYCDigJQgdGhlIHNhbWUgcGluIHRoZSBib290c3RyYXBcbiAqIGxvb2t1cCBzZW5kcyDigJQgYW5kIGl0cyByZXNvbHZlZCByZWxlYXNlIGxhbmRzIGluIGB0b29sY2hhaW5TaW5rYCBieSBrZXkuXG4gKlxuICogRXZlcnkgcmVmZXJlbmNlIGlzIGxvb2tlZCB1cCBiZWZvcmUgYW55dGhpbmcgaXMgdGhyb3duLCBhbmQgQUxMIGZhdGFsXG4gKiByZWZ1c2FscyBhcmUgcmVwb3J0ZWQgdG9nZXRoZXIuIFN0b3BwaW5nIGF0IHRoZSBmaXJzdCBtZWFudCBhIHBpcGVsaW5lIHdpdGhcbiAqIHRocmVlIHJlZnVzZWQgcGx1Z2lucyB0b29rIHRocmVlIHN5bnRoIGF0dGVtcHRzIHRvIGxlYXJuIGFib3V0IGFsbCB0aHJlZS5cbiAqXG4gKiBFdmVyeSBsb29rdXAgd2FybmluZyBpcyBwcmludGVkLCBncmFkZWQgYnkgc2V2ZXJpdHksIGFuZCBhcHBlbmRlZCB0b1xuICogYHdhcm5pbmdTaW5rYCB3aGVuIGdpdmVuICh0aGUgc3ludGggcHJpbnRzIGEgb25lLWxpbmUgc3VtbWFyeSBhdCBpdHMgZW5kKS5cbiAqIEEgd2FybmluZyBuZXZlciBmYWlscyB0aGUgc3ludGgg4oCUIHZ1bG5lcmFiaWxpdHkgc3RhdGUgaXMgcmVwb3J0ZWQsIG5vdFxuICogZW5mb3JjZWQuXG4gKlxuICogV2hlbiB0aGUgcHJvcHMgY2FycnkgYSBgcGlwZWxpbmVJZGAsIGVhY2ggbG9va3VwIGFsc28gc2VuZHNcbiAqIGBjb250ZXh0OiB7IHBpcGVsaW5lSWQsIHN0ZXBLZXlzIH1gIOKAlCB0aGUgbGFiZWwgKGBwbHVnaW5TdGVwTGFiZWxgOiBgc3ludGhgIG9yXG4gKiBgPHN0YWdlPi88YWxpYXMgPz8gbmFtZT5gKSBvZiBFVkVSWSBzdGVwIHRoZSBkZS1kdXBsaWNhdGVkIHJlZmVyZW5jZSBzZXJ2ZXMg4oCUXG4gKiBzbyB0aGUgcGx1Z2luIHNlcnZpY2UgY2FuIHJlY29yZCB0aGUgd2FybmluZ3MgaXQgcmV0dXJucyBhZ2FpbnN0IGVhY2ggb2ZcbiAqIHRob3NlIHBpcGVsaW5lIHN0ZXBzLCBub3Qgb25seSBwcmludCB0aGVtIGludG8gdGhpcyBzeW50aCdzIGxvZy5cbiAqXG4gKiBLZXllZCBieSBgYWxpYXMgfHwgbmFtZWAgdG8gbWF0Y2ggYFBsdWdpbkxvb2t1cC5wbHVnaW4oKWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlUGx1Z2luc0ZvclByb3BzKFxuICBjbGllbnQ6IEFwaUNsaWVudCxcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB3YXJuaW5nU2luaz86IExvb2t1cFdhcm5pbmdbXSxcbiAgdG9vbGNoYWluU2luaz86IFJlY29yZDxzdHJpbmcsIExvb2t1cFRvb2xjaGFpbj4sXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IHJlZnMgPSBjb2xsZWN0UGx1Z2luUmVmcyhwcm9wcyk7XG4gIGlmIChyZWZzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9O1xuXG4gIGNvbnN0IHBpcGVsaW5lSWQgPSB0eXBlb2YgcHJvcHMucGlwZWxpbmVJZCA9PT0gJ3N0cmluZycgJiYgcHJvcHMucGlwZWxpbmVJZC5sZW5ndGggPiAwID8gcHJvcHMucGlwZWxpbmVJZCA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVsZWFzZVBpbiA9IHRvb2xjaGFpblJlbGVhc2VQaW4ocHJvcHMpO1xuICAvLyBPbmUgbG9va3VwIHBlciBhbGlhcyBtYXkgc2VydmUgc2V2ZXJhbCBzdGVwczogdGhlIGxhYmVscyBvZiBlYWNoLCBieSBhbGlhcy5cbiAgY29uc3Qgc3RlcEtleXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIGZvciAoY29uc3Qgc3RlcCBvZiBjb2xsZWN0UGx1Z2luU3RlcHMocHJvcHMpKSB7XG4gICAgY29uc3Qga2V5ID0gY2FjaGVLZXkoc3RlcCk7XG4gICAgc3RlcEtleXMuc2V0KGtleSwgWy4uLihzdGVwS2V5cy5nZXQoa2V5KSA/PyBbXSksIHN0ZXAubGFiZWxdKTtcbiAgfVxuICBjb25zdCByZXNvbHZlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgY29uc3QgZmF0YWw6IFBsdWdpblJlZnVzYWxbXSA9IFtdO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKHJlZnMubWFwKGFzeW5jIChyZWYpID0+IHtcbiAgICBjb25zdCBrZXkgPSBjYWNoZUtleShyZWYpO1xuICAgIGNvbnN0IGxhYmVsID0gcmVmLnB1Ymxpc2hlciA/IGAke3JlZi5wdWJsaXNoZXJ9LyR7cmVmLm5hbWV9YCA6IHJlZi5uYW1lO1xuICAgIC8vIFRoZSBwbHVnaW4gTkFNRSBsaXZlcyBvbiB0aGUgcmVmIChhIHNpYmxpbmcgb2YgYGZpbHRlcmApLCBOT1QgaW5zaWRlIHRoZVxuICAgIC8vIGZpbHRlciBvYmplY3Qg4oCUIGJ1dCB0aGUgbG9va3VwIG1hdGNoZXMgb24gdGhlIGZpbHRlci4gQSBmaWx0ZXIgd2l0aG91dFxuICAgIC8vIGBuYW1lYCAoZS5nLiBge3ZlcnNpb24sIHZpc2liaWxpdHksIGlzQWN0aXZlLCBpc0RlZmF1bHR9YCkgbWF0Y2hlcyBBTllcbiAgICAvLyBwbHVnaW4gd2l0aCB0aG9zZSBhdHRyaWJ1dGVzLCBhbmQgdGhlIGVuZHBvaW50IHJldHVybnMgYW4gYXJiaXRyYXJ5IG9uZVxuICAgIC8vIChzZWVuOiBgZG9ja2VyZmlsZS1tdWx0aS1wcm92aWRlcmApLiBUaGF0IG1hZGUgdGhlIHN5bnRoIGFuZCBldmVyeSBzdGVwXG4gICAgLy8gcmVzb2x2ZSB0byB0aGUgV1JPTkcgcGx1Z2luLiBTbyB3aGVuIHRoZSBmaWx0ZXIgb21pdHMgYG5hbWVgLCBmYWxsIGJhY2sgdG9cbiAgICAvLyB0aGUgcmVmJ3MgcGx1Z2luIG5hbWU7IGFuIGV4cGxpY2l0IGZpbHRlciBgbmFtZWAgc3RpbGwgdGFrZXMgcHJlY2VkZW5jZS5cbiAgICAvLyBTaGFyZWQgd2l0aCB0aGUgcGlwZWxpbmUgc2VydmljZSdzIGNvbnRyYWN0IGNoZWNrIChzYW1lIGZpbHRlciwgc2FtZSBwbHVnaW4pLlxuICAgIGNvbnN0IGZpbHRlciA9IHBsdWdpbkxvb2t1cEZpbHRlcihyZWYpO1xuICAgIGNvbnN0IHBpbiA9IGV4YWN0VmVyc2lvblBpbihyZWYpO1xuICAgIGNvbnN0IHJlZnVzZSA9IChjb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQgPT4geyBmYXRhbC5wdXNoKHsgcGx1Z2luOiBsYWJlbCwgY29kZSwgbWVzc2FnZSB9KTsgfTtcbiAgICAvLyBBIG1hbmFnZWQgdG9vbGNoYWluIGhhbGYgKGNkay1zeW50aCkgcmVzb2x2ZXMgdGhyb3VnaCB0aGUgUkVMRUFTRSDigJQgdGhlXG4gICAgLy8gc2FtZSBgcmVsZWFzZVBpbmAgdGhlIGJvb3RzdHJhcCBsb29rdXAgc2VuZHMsIHNvIGJvdGggaGFsdmVzIGNvbWUgZnJvbVxuICAgIC8vIG9uZSByZWxlYXNlIOKAlCBhbmQgaXQgaGFzIG5vIGRlcGxveS10aW1lIGZhbGxiYWNrOiBhbnkgZmFpbHVyZSBpcyBmYXRhbC5cbiAgICBjb25zdCBtYW5hZ2VkID0gaXNNYW5hZ2VkVG9vbGNoYWluUmVmKHJlZik7XG4gICAgY29uc3QgcmVmdXNlTWFuYWdlZCA9IChjb2RlOiBzdHJpbmcsIHdoeTogc3RyaW5nKTogdm9pZCA9PiByZWZ1c2UoY29kZSxcbiAgICAgIGBUb29sY2hhaW4gcGx1Z2luIFwiJHtsYWJlbH1cIiR7cmVsZWFzZVBpbiA/IGAgKHJlbGVhc2UgJHtyZWxlYXNlUGlufSlgIDogJyd9IGNvdWxkIG5vdCBiZSByZXNvbHZlZDogJHt3aHl9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5wb3N0PHVua25vd24+KCcvYXBpL3BsdWdpbnMvbG9va3VwJywge1xuICAgICAgICBmaWx0ZXIsXG4gICAgICAgIC4uLihtYW5hZ2VkICYmIHJlbGVhc2VQaW4gPyB7IHJlbGVhc2VQaW4gfSA6IHt9KSxcbiAgICAgICAgLi4uKHBpcGVsaW5lSWQgJiYgc3RlcEtleXMuaGFzKGtleSkgPyB7IGNvbnRleHQ6IHsgcGlwZWxpbmVJZCwgc3RlcEtleXM6IHN0ZXBLZXlzLmdldChrZXkpIH0gfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgeyBwbHVnaW4sIHdhcm5pbmdzLCB0b29sY2hhaW4gfSA9IHVud3JhcExvb2t1cChyZXMpO1xuICAgICAgZm9yIChjb25zdCB3YXJuaW5nIG9mIHdhcm5pbmdzKSB7XG4gICAgICAgIHByaW50TG9va3VwV2FybmluZyhsYWJlbCwgd2FybmluZyk7XG4gICAgICAgIHdhcm5pbmdTaW5rPy5wdXNoKHdhcm5pbmcpO1xuICAgICAgfVxuICAgICAgaWYgKG1hbmFnZWQgJiYgKCFwbHVnaW4gfHwgIXRvb2xjaGFpbikpIHtcbiAgICAgICAgcmVmdXNlTWFuYWdlZChFcnJvckNvZGUuQk9PVFNUUkFQX0lNQUdFX1VOUkVTT0xWRUQsIHBsdWdpbiA/ICd0aGUgYW5zd2VyIGNhcnJpZWQgbm8gdG9vbGNoYWluIHJlbGVhc2UnIDogJ3RoZSBsb29rdXAgcmV0dXJuZWQgbm8gcmVjb3JkJyk7XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbikge1xuICAgICAgICByZXNvbHZlZFtrZXldID0gcGx1Z2luO1xuICAgICAgICBpZiAobWFuYWdlZCAmJiB0b29sY2hhaW4gJiYgdG9vbGNoYWluU2luaykgdG9vbGNoYWluU2lua1trZXldID0gdG9vbGNoYWluO1xuICAgICAgfSBlbHNlIGlmIChwaW4pIHtcbiAgICAgICAgcmVmdXNlKCdQTFVHSU5fVkVSU0lPTl9OT1RfRk9VTkQnLCBwaW5Ob3RGb3VuZE1lc3NhZ2UobGFiZWwsIHBpbikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJpbnRXYXJuaW5nKGBQbHVnaW4gXCIke2xhYmVsfVwiIGxvb2t1cCByZXR1cm5lZCBubyByZWNvcmQg4oCUIGZhbGxpbmcgYmFjayB0byBkZXBsb3ktdGltZSByZXNvbHV0aW9uYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAobWFuYWdlZCkge1xuICAgICAgICByZWZ1c2VNYW5hZ2VkKHNlcnZpY2VFcnJvckNvZGUoZXJyKSA/PyBFcnJvckNvZGUuQk9PVFNUUkFQX0lNQUdFX1VOUkVTT0xWRUQsIHNlcnZpY2VNZXNzYWdlKGVycikgPz8gZXJyb3JNZXNzYWdlKGVycikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBBIHBsdWdpbiB3aG9zZSBpbWFnZSBzaWduYXR1cmUgZG9lc24ndCB2ZXJpZnksIG9yIGEgbGlzdGluZyB0aGUgb3JnXG4gICAgICAvLyBjYW4ndCB1c2UsIGlzIE5PVCBhbiBvdXRhZ2UgdG8gcmlkZSBvdXQ6IGZhbGxpbmcgYmFjayB3b3VsZCBxdWlldGx5XG4gICAgICAvLyB0dXJuIGl0IGludG8gYW4gdW5yZXNvbHZlZCBzdGVwLiBTdG9wLlxuICAgICAgY29uc3QgY29kZSA9IGZhdGFsTG9va3VwQ29kZShlcnIpO1xuICAgICAgaWYgKGNvZGUgPT09IEVycm9yQ29kZS5JTUFHRV9WRVJJRklDQVRJT05fRkFJTEVEKSB7XG4gICAgICAgIHJlZnVzZShjb2RlLCBgUGx1Z2luIFwiJHtsYWJlbH1cIiBpbWFnZSBmYWlsZWQgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbjogJHtlcnJvck1lc3NhZ2UoZXJyKX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgcmVmdXNlKGNvZGUsIGBQbHVnaW4gXCIke2xhYmVsfVwiIGNhbid0IGJlIHVzZWQgKCR7Y29kZX0pOiAke3NlcnZpY2VNZXNzYWdlKGVycikgPz8gZXJyb3JNZXNzYWdlKGVycil9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChwaW4gJiYgaXNOb3RGb3VuZChlcnIpKSB7XG4gICAgICAgIHJlZnVzZSgnUExVR0lOX1ZFUlNJT05fTk9UX0ZPVU5EJywgcGluTm90Rm91bmRNZXNzYWdlKGxhYmVsLCBwaW4sIGVycikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtc2cgPSBlcnJvck1lc3NhZ2UoZXJyKTtcbiAgICAgIHByaW50V2FybmluZyhgUGx1Z2luIFwiJHtsYWJlbH1cIiBwcmUtcmVzb2x1dGlvbiBmYWlsZWQgKCR7bXNnfSkg4oCUIGZhbGxpbmcgYmFjayB0byBkZXBsb3ktdGltZSByZXNvbHV0aW9uYCk7XG4gICAgfVxuICB9KSk7XG5cbiAgaWYgKGZhdGFsLmxlbmd0aCA+IDApIHRocm93IG5ldyBQbHVnaW5SZXNvbHV0aW9uRXJyb3IoZmF0YWwpO1xuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG4iXX0=
@@ -0,0 +1,80 @@
1
+ import { type LookupToolchain, type LookupWarning, type ResolvedBootstrap } from '@pipeline-builder/pipeline-core';
2
+ import type { ApiClient } from './api-client.js';
3
+ import { PluginResolutionError } from './plugin-resolver.js';
4
+ export declare const BOOTSTRAP_PLUGIN = "pipeline-bootstrap";
5
+ export declare const SYNTH_PLUGIN = "cdk-synth";
6
+ /** `toolchain export` file format version. */
7
+ export declare const TOOLCHAIN_FILE_FORMAT = 1;
8
+ /** A plugin record as the lookup returned it (opaque here; pipeline-core reads it). */
9
+ type PluginRecord = ResolvedBootstrap['plugin'];
10
+ /** One half of an exported release. */
11
+ export interface ToolchainFileHalf {
12
+ readonly name: string;
13
+ readonly version: string;
14
+ readonly imageRepository: string;
15
+ readonly imageDigest: string;
16
+ /** The full lookup record — what the synth consumes. */
17
+ readonly plugin: PluginRecord;
18
+ }
19
+ /** What `pipeline-manager toolchain export` writes and `--toolchain-file` reads. */
20
+ export interface ToolchainFile {
21
+ readonly format: typeof TOOLCHAIN_FILE_FORMAT;
22
+ readonly releaseVersion: string;
23
+ readonly resolvedVia: LookupToolchain['resolvedVia'];
24
+ readonly toolchain: LookupToolchain['versions'];
25
+ readonly exportedAt: string;
26
+ /**
27
+ * The platform the release was exported from. Its host is the registry
28
+ * CodeBuild pulls both images from, so a local-spec deploy bakes it as the
29
+ * pull host (unless IMAGE_REGISTRY_PULL_HOST is set), like a platform deploy.
30
+ */
31
+ readonly platformBaseUrl?: string;
32
+ readonly bootstrap: ToolchainFileHalf;
33
+ readonly synth: ToolchainFileHalf;
34
+ }
35
+ /** The refusal every failure here raises — one code, so `PB_SYNTH_FAILURE` reports it uniformly. */
36
+ export declare function bootstrapUnresolved(message: string, code?: string): PluginResolutionError;
37
+ /**
38
+ * Resolve the pipeline's `pipeline-bootstrap` through `/plugins/lookup` with
39
+ * `releasePin = props.toolchain?.release`. FATAL on any failure
40
+ * (`BOOTSTRAP_IMAGE_UNRESOLVED`): unreachable platform, no default (409
41
+ * `TOOLCHAIN_NO_DEFAULT`), a deleted pin (404), a refused signature, or an
42
+ * answer without a release. Warnings are printed, appended to `warningSink`,
43
+ * and — with a `pipelineId` — recorded by the platform on the pipeline's
44
+ * "Build image" row (`context.stepKeys: ['build-image']`).
45
+ */
46
+ export declare function resolveBootstrapImage(client: ApiClient, props: Record<string, unknown>, warningSink?: LookupWarning[]): Promise<ResolvedBootstrap>;
47
+ /** The managed synth reference of a pipeline's props, when its synth plugin is `cdk-synth`. */
48
+ export declare function managedSynthKey(props: Record<string, unknown>): string | null;
49
+ /**
50
+ * Both halves of one release must agree. A managed `cdk-synth` that resolved
51
+ * to a different release than the bootstrap is refused (never served).
52
+ */
53
+ export declare function assertOneRelease(bootstrap: ResolvedBootstrap, synthToolchains: Record<string, LookupToolchain>): void;
54
+ /**
55
+ * Resolve both halves of a release for export: `release` when given, else
56
+ * whatever the caller's org resolves to now (its default, canary or the
57
+ * platform default). Both lookups send the same pin; when no pin is given the
58
+ * bootstrap's release becomes the synth's pin, so the halves always match.
59
+ */
60
+ export declare function exportToolchain(client: ApiClient, release?: string): Promise<ToolchainFile>;
61
+ /** The local-spec refusal when no `--toolchain-file` was given. */
62
+ export declare function toolchainFileRequired(): PluginResolutionError;
63
+ /**
64
+ * Read and check a `toolchain export` file: both halves present, named right,
65
+ * digest-pinned, and of one release. Any problem is `BOOTSTRAP_IMAGE_UNRESOLVED`.
66
+ */
67
+ export declare function readToolchainFile(file: string): {
68
+ bootstrap: ResolvedBootstrap;
69
+ synth: PluginRecord;
70
+ platformBaseUrl?: string;
71
+ };
72
+ /**
73
+ * Apply a toolchain file to local-spec props: the bootstrap as
74
+ * `resolvedBootstrap`, the exporting platform as the registry pull host, and —
75
+ * when the synth plugin is the managed `cdk-synth` — the exported synth half
76
+ * as its pre-resolved plugin.
77
+ */
78
+ export declare function applyToolchainFile(props: Record<string, unknown>, file: string): ToolchainFile['releaseVersion'];
79
+ export {};
80
+ //# sourceMappingURL=toolchain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolchain.d.ts","sources":["../../src/utils/toolchain.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,KAAK,iBAAiB,EACjE,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAoF,MAAM,sBAAsB,CAAC;AAG/I,eAAO,MAAM,gBAAgB,uBAAuB,CAAC;AACrD,eAAO,MAAM,YAAY,cAAc,CAAC;AAExC,8CAA8C;AAC9C,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC,uFAAuF;AACvF,KAAK,YAAY,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AAEhD,uCAAuC;AACvC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;CAC/B;AAED,oFAAoF;AACpF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,qBAAqB,CAAC;IAC9C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC;IACrD,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;CACnC;AAED,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAA6C,GAAG,qBAAqB,CAE/H;AAoCD;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,WAAW,CAAC,EAAE,aAAa,EAAE,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CAY5B;AAED,+FAA+F;AAC/F,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAI7E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI,CASrH;AAaD;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAcjG;AAKD,mEAAmE;AACnE,wBAAgB,qBAAqB,IAAI,qBAAqB,CAE7D;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,YAAY,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CA0B/H;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAiBhH"}
@@ -0,0 +1,196 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * The pipeline's toolchain release (docs/plans/bootstrap-image-versioning.md §2, D2).
5
+ *
6
+ * `pipeline-bootstrap` (the default CodeBuild image) and `cdk-synth` (the synth
7
+ * step) are one release. The bootstrap is not a step, so nothing else resolves
8
+ * it: {@link resolveBootstrapImage} looks it up with the pipeline's
9
+ * `toolchain.release` pin, and ANY failure stops the synth — the template has
10
+ * no other image to fall back to.
11
+ *
12
+ * `pipeline deploy --local-spec` never contacts the platform, so it reads the
13
+ * release from a file `pipeline-manager toolchain export` wrote instead.
14
+ */
15
+ import * as fs from 'node:fs';
16
+ import * as path from 'node:path';
17
+ import { BUILD_IMAGE_STEP_KEY, ErrorCode, errorMessage } from '@pipeline-builder/api-core';
18
+ import { parseLookupToolchain, pluginArtifactAlias, unwrapLookup, } from '@pipeline-builder/pipeline-core';
19
+ import { PluginResolutionError, isManagedToolchainRef, printLookupWarning, serviceErrorCode, toolchainReleasePin } from './plugin-resolver.js';
20
+ import { bakePlatformRegistry } from './registry.js';
21
+ export const BOOTSTRAP_PLUGIN = 'pipeline-bootstrap';
22
+ export const SYNTH_PLUGIN = 'cdk-synth';
23
+ /** `toolchain export` file format version. */
24
+ export const TOOLCHAIN_FILE_FORMAT = 1;
25
+ /** The refusal every failure here raises — one code, so `PB_SYNTH_FAILURE` reports it uniformly. */
26
+ export function bootstrapUnresolved(message, code = ErrorCode.BOOTSTRAP_IMAGE_UNRESOLVED) {
27
+ return new PluginResolutionError([{ plugin: BOOTSTRAP_PLUGIN, code, message }]);
28
+ }
29
+ /** Look up one managed half. Throws {@link bootstrapUnresolved} on any failure. */
30
+ async function lookupManaged(client, name, releasePin, context) {
31
+ const what = `${name}${releasePin ? ` (release ${releasePin})` : ''}`;
32
+ let res;
33
+ try {
34
+ res = await client.post('/api/plugins/lookup', {
35
+ filter: { name },
36
+ ...(releasePin ? { releasePin } : {}),
37
+ ...(context ? { context } : {}),
38
+ });
39
+ }
40
+ catch (err) {
41
+ const code = serviceErrorCode(err);
42
+ const status = err?.response?.status;
43
+ const why = code === ErrorCode.TOOLCHAIN_NO_DEFAULT
44
+ ? 'the platform has no default toolchain release (an operator sets one with `deploy/bin/init-platform.sh` or the Toolchain console)'
45
+ : status === 404 && releasePin
46
+ ? `release ${releasePin} does not exist (deleted) — pin another release or clear the pipeline's toolchain.release`
47
+ : errorMessage(err);
48
+ throw bootstrapUnresolved(`Toolchain ${what} could not be resolved: ${why}`);
49
+ }
50
+ const { plugin, warnings, toolchain } = unwrapLookup(res);
51
+ if (!plugin || plugin.name !== name)
52
+ throw bootstrapUnresolved(`Toolchain ${what} could not be resolved: the lookup returned no ${name} record`);
53
+ if (!toolchain)
54
+ throw bootstrapUnresolved(`Toolchain ${what} could not be resolved: the answer carried no toolchain release`);
55
+ if (releasePin && toolchain.releaseVersion !== releasePin) {
56
+ throw bootstrapUnresolved(`Toolchain ${what} resolved to release ${toolchain.releaseVersion}, not the pinned ${releasePin}`, ErrorCode.TOOLCHAIN_PAIR_MISMATCH);
57
+ }
58
+ return { plugin, toolchain, warnings };
59
+ }
60
+ /**
61
+ * Resolve the pipeline's `pipeline-bootstrap` through `/plugins/lookup` with
62
+ * `releasePin = props.toolchain?.release`. FATAL on any failure
63
+ * (`BOOTSTRAP_IMAGE_UNRESOLVED`): unreachable platform, no default (409
64
+ * `TOOLCHAIN_NO_DEFAULT`), a deleted pin (404), a refused signature, or an
65
+ * answer without a release. Warnings are printed, appended to `warningSink`,
66
+ * and — with a `pipelineId` — recorded by the platform on the pipeline's
67
+ * "Build image" row (`context.stepKeys: ['build-image']`).
68
+ */
69
+ export async function resolveBootstrapImage(client, props, warningSink) {
70
+ const pipelineId = typeof props.pipelineId === 'string' && props.pipelineId.length > 0 ? props.pipelineId : undefined;
71
+ const { plugin, toolchain, warnings } = await lookupManaged(client, BOOTSTRAP_PLUGIN, toolchainReleasePin(props),
72
+ // Recorded against the pipeline's "Build image" row (api-core BUILD_IMAGE_STEP_KEY).
73
+ pipelineId ? { pipelineId, stepKeys: [BUILD_IMAGE_STEP_KEY] } : undefined);
74
+ for (const warning of warnings) {
75
+ printLookupWarning(BOOTSTRAP_PLUGIN, warning);
76
+ warningSink?.push(warning);
77
+ }
78
+ return { plugin, toolchain };
79
+ }
80
+ /** The managed synth reference of a pipeline's props, when its synth plugin is `cdk-synth`. */
81
+ export function managedSynthKey(props) {
82
+ const ref = props.synth?.plugin;
83
+ if (!ref?.name || !isManagedToolchainRef(ref))
84
+ return null;
85
+ return pluginArtifactAlias(ref);
86
+ }
87
+ /**
88
+ * Both halves of one release must agree. A managed `cdk-synth` that resolved
89
+ * to a different release than the bootstrap is refused (never served).
90
+ */
91
+ export function assertOneRelease(bootstrap, synthToolchains) {
92
+ for (const [key, synth] of Object.entries(synthToolchains)) {
93
+ if (synth.releaseVersion !== bootstrap.toolchain.releaseVersion) {
94
+ throw bootstrapUnresolved(`Toolchain halves disagree: pipeline-bootstrap is release ${bootstrap.toolchain.releaseVersion} but "${key}" is ${synth.releaseVersion}`, ErrorCode.TOOLCHAIN_PAIR_MISMATCH);
95
+ }
96
+ }
97
+ }
98
+ function half(plugin) {
99
+ const rec = plugin;
100
+ return {
101
+ name: rec.name,
102
+ version: rec.version,
103
+ imageRepository: rec.imageRepository ?? '',
104
+ imageDigest: rec.imageDigest ?? '',
105
+ plugin,
106
+ };
107
+ }
108
+ /**
109
+ * Resolve both halves of a release for export: `release` when given, else
110
+ * whatever the caller's org resolves to now (its default, canary or the
111
+ * platform default). Both lookups send the same pin; when no pin is given the
112
+ * bootstrap's release becomes the synth's pin, so the halves always match.
113
+ */
114
+ export async function exportToolchain(client, release) {
115
+ const bootstrap = await lookupManaged(client, BOOTSTRAP_PLUGIN, release);
116
+ const synth = await lookupManaged(client, SYNTH_PLUGIN, release ?? bootstrap.toolchain.releaseVersion);
117
+ assertOneRelease({ plugin: bootstrap.plugin, toolchain: bootstrap.toolchain }, { [SYNTH_PLUGIN]: synth.toolchain });
118
+ return {
119
+ format: TOOLCHAIN_FILE_FORMAT,
120
+ releaseVersion: bootstrap.toolchain.releaseVersion,
121
+ resolvedVia: bootstrap.toolchain.resolvedVia,
122
+ toolchain: { ...synth.toolchain.versions, ...bootstrap.toolchain.versions },
123
+ exportedAt: new Date().toISOString(),
124
+ ...(client.getConfig().api.baseUrl ? { platformBaseUrl: client.getConfig().api.baseUrl } : {}),
125
+ bootstrap: half(bootstrap.plugin),
126
+ synth: half(synth.plugin),
127
+ };
128
+ }
129
+ const HOW_TO_EXPORT = 'Produce one with `pipeline-manager toolchain export --output toolchain.json` (add `--release <V>` to pin a release) '
130
+ + 'against the platform, then pass `--toolchain-file toolchain.json`.';
131
+ /** The local-spec refusal when no `--toolchain-file` was given. */
132
+ export function toolchainFileRequired() {
133
+ return bootstrapUnresolved(`--local-spec deploys without the platform, so the toolchain release must come from --toolchain-file. ${HOW_TO_EXPORT}`);
134
+ }
135
+ const DIGEST_RE = /^sha256:[0-9a-f]{64}$/;
136
+ /**
137
+ * Read and check a `toolchain export` file: both halves present, named right,
138
+ * digest-pinned, and of one release. Any problem is `BOOTSTRAP_IMAGE_UNRESOLVED`.
139
+ */
140
+ export function readToolchainFile(file) {
141
+ const abs = path.resolve(file);
142
+ let raw;
143
+ try {
144
+ raw = JSON.parse(fs.readFileSync(abs, 'utf-8'));
145
+ }
146
+ catch (err) {
147
+ throw bootstrapUnresolved(`Can't read --toolchain-file ${abs}: ${errorMessage(err)}. ${HOW_TO_EXPORT}`);
148
+ }
149
+ const bad = (why) => { throw bootstrapUnresolved(`--toolchain-file ${abs} is not a toolchain export: ${why}. ${HOW_TO_EXPORT}`); };
150
+ const f = raw;
151
+ if (!f || typeof f !== 'object')
152
+ bad('not a JSON object');
153
+ if (f.format !== TOOLCHAIN_FILE_FORMAT)
154
+ bad(`unsupported format ${String(f.format)}`);
155
+ const toolchain = parseLookupToolchain({ releaseVersion: f.releaseVersion, resolvedVia: f.resolvedVia, versions: f.toolchain });
156
+ if (!toolchain)
157
+ bad('missing releaseVersion / resolvedVia');
158
+ const check = (h, name) => {
159
+ if (!h?.plugin || h.plugin.name !== name || h.name !== name)
160
+ bad(`missing the ${name} half`);
161
+ if (h.version !== toolchain.releaseVersion || h.plugin.version !== toolchain.releaseVersion)
162
+ bad(`${name} is not release ${toolchain.releaseVersion}`);
163
+ const rec = h.plugin;
164
+ if (!rec.imageDigest || !DIGEST_RE.test(rec.imageDigest) || rec.imageDigest !== h.imageDigest)
165
+ bad(`${name} has no signed image digest`);
166
+ if (rec.imageRepository !== `system/${name}` || h.imageRepository !== rec.imageRepository)
167
+ bad(`${name} is not system/${name}`);
168
+ return h.plugin;
169
+ };
170
+ const bootstrap = check(f.bootstrap, BOOTSTRAP_PLUGIN);
171
+ const synth = check(f.synth, SYNTH_PLUGIN);
172
+ const platformBaseUrl = typeof f.platformBaseUrl === 'string' && f.platformBaseUrl.length > 0 ? f.platformBaseUrl : undefined;
173
+ return { bootstrap: { plugin: bootstrap, toolchain: toolchain }, synth, ...(platformBaseUrl && { platformBaseUrl }) };
174
+ }
175
+ /**
176
+ * Apply a toolchain file to local-spec props: the bootstrap as
177
+ * `resolvedBootstrap`, the exporting platform as the registry pull host, and —
178
+ * when the synth plugin is the managed `cdk-synth` — the exported synth half
179
+ * as its pre-resolved plugin.
180
+ */
181
+ export function applyToolchainFile(props, file) {
182
+ const { bootstrap, synth, platformBaseUrl } = readToolchainFile(file);
183
+ const pin = toolchainReleasePin(props);
184
+ if (pin && pin !== bootstrap.toolchain.releaseVersion) {
185
+ throw bootstrapUnresolved(`The pipeline pins toolchain release ${pin} but --toolchain-file holds ${bootstrap.toolchain.releaseVersion}. `
186
+ + `Export the pinned one: \`pipeline-manager toolchain export --release ${pin}\`.`, ErrorCode.TOOLCHAIN_PAIR_MISMATCH);
187
+ }
188
+ props.resolvedBootstrap = bootstrap;
189
+ bakePlatformRegistry(props, platformBaseUrl);
190
+ const synthKey = managedSynthKey(props);
191
+ if (synthKey) {
192
+ props.resolvedPlugins = { ...props.resolvedPlugins, [synthKey]: synth };
193
+ }
194
+ return bootstrap.toolchain.releaseVersion;
195
+ }
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGNoYWluLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdG9vbGNoYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNGLE9BQU8sRUFDNkQsb0JBQW9CLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxHQUMxSCxNQUFNLGlDQUFpQyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9JLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxvQkFBb0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDO0FBRXhDLDhDQUE4QztBQUM5QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFnQ3ZDLG9HQUFvRztBQUNwRyxNQUFNLFVBQVUsbUJBQW1CLENBQUMsT0FBZSxFQUFFLElBQUksR0FBVyxTQUFTLENBQUMsMEJBQTBCO0lBQ3RHLE9BQU8sSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbEYsQ0FBQztBQUVELG1GQUFtRjtBQUNuRixLQUFLLFVBQVUsYUFBYSxDQUMxQixNQUFpQixFQUNqQixJQUFZLEVBQ1osVUFBOEIsRUFDOUIsT0FBb0Q7SUFFcEQs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QztJQUNwQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDN0MsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLElBQUksUUFBUSxFQUFFLENBQUM7UUFDYixLQUFLLENBQUMsZUFBZSxHQUFHLEVBQUUsR0FBSSxLQUFLLENBQUMsZUFBdUQsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ25ILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUaGUgcGlwZWxpbmUncyB0b29sY2hhaW4gcmVsZWFzZSAoZG9jcy9wbGFucy9ib290c3RyYXAtaW1hZ2UtdmVyc2lvbmluZy5tZCDCpzIsIEQyKS5cbiAqXG4gKiBgcGlwZWxpbmUtYm9vdHN0cmFwYCAodGhlIGRlZmF1bHQgQ29kZUJ1aWxkIGltYWdlKSBhbmQgYGNkay1zeW50aGAgKHRoZSBzeW50aFxuICogc3RlcCkgYXJlIG9uZSByZWxlYXNlLiBUaGUgYm9vdHN0cmFwIGlzIG5vdCBhIHN0ZXAsIHNvIG5vdGhpbmcgZWxzZSByZXNvbHZlc1xuICogaXQ6IHtAbGluayByZXNvbHZlQm9vdHN0cmFwSW1hZ2V9IGxvb2tzIGl0IHVwIHdpdGggdGhlIHBpcGVsaW5lJ3NcbiAqIGB0b29sY2hhaW4ucmVsZWFzZWAgcGluLCBhbmQgQU5ZIGZhaWx1cmUgc3RvcHMgdGhlIHN5bnRoIOKAlCB0aGUgdGVtcGxhdGUgaGFzXG4gKiBubyBvdGhlciBpbWFnZSB0byBmYWxsIGJhY2sgdG8uXG4gKlxuICogYHBpcGVsaW5lIGRlcGxveSAtLWxvY2FsLXNwZWNgIG5ldmVyIGNvbnRhY3RzIHRoZSBwbGF0Zm9ybSwgc28gaXQgcmVhZHMgdGhlXG4gKiByZWxlYXNlIGZyb20gYSBmaWxlIGBwaXBlbGluZS1tYW5hZ2VyIHRvb2xjaGFpbiBleHBvcnRgIHdyb3RlIGluc3RlYWQuXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBCVUlMRF9JTUFHRV9TVEVQX0tFWSwgRXJyb3JDb2RlLCBlcnJvck1lc3NhZ2UgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQge1xuICB0eXBlIExvb2t1cFRvb2xjaGFpbiwgdHlwZSBMb29rdXBXYXJuaW5nLCB0eXBlIFJlc29sdmVkQm9vdHN0cmFwLCBwYXJzZUxvb2t1cFRvb2xjaGFpbiwgcGx1Z2luQXJ0aWZhY3RBbGlhcywgdW53cmFwTG9va3VwLFxufSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlJztcbmltcG9ydCB0eXBlIHsgQXBpQ2xpZW50IH0gZnJvbSAnLi9hcGktY2xpZW50LmpzJztcbmltcG9ydCB7IFBsdWdpblJlc29sdXRpb25FcnJvciwgaXNNYW5hZ2VkVG9vbGNoYWluUmVmLCBwcmludExvb2t1cFdhcm5pbmcsIHNlcnZpY2VFcnJvckNvZGUsIHRvb2xjaGFpblJlbGVhc2VQaW4gfSBmcm9tICcuL3BsdWdpbi1yZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBiYWtlUGxhdGZvcm1SZWdpc3RyeSB9IGZyb20gJy4vcmVnaXN0cnkuanMnO1xuXG5leHBvcnQgY29uc3QgQk9PVFNUUkFQX1BMVUdJTiA9ICdwaXBlbGluZS1ib290c3RyYXAnO1xuZXhwb3J0IGNvbnN0IFNZTlRIX1BMVUdJTiA9ICdjZGstc3ludGgnO1xuXG4vKiogYHRvb2xjaGFpbiBleHBvcnRgIGZpbGUgZm9ybWF0IHZlcnNpb24uICovXG5leHBvcnQgY29uc3QgVE9PTENIQUlOX0ZJTEVfRk9STUFUID0gMTtcblxuLyoqIEEgcGx1Z2luIHJlY29yZCBhcyB0aGUgbG9va3VwIHJldHVybmVkIGl0IChvcGFxdWUgaGVyZTsgcGlwZWxpbmUtY29yZSByZWFkcyBpdCkuICovXG50eXBlIFBsdWdpblJlY29yZCA9IFJlc29sdmVkQm9vdHN0cmFwWydwbHVnaW4nXTtcblxuLyoqIE9uZSBoYWxmIG9mIGFuIGV4cG9ydGVkIHJlbGVhc2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xjaGFpbkZpbGVIYWxmIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltYWdlUmVwb3NpdG9yeTogc3RyaW5nO1xuICByZWFkb25seSBpbWFnZURpZ2VzdDogc3RyaW5nO1xuICAvKiogVGhlIGZ1bGwgbG9va3VwIHJlY29yZCDigJQgd2hhdCB0aGUgc3ludGggY29uc3VtZXMuICovXG4gIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luUmVjb3JkO1xufVxuXG4vKiogV2hhdCBgcGlwZWxpbmUtbWFuYWdlciB0b29sY2hhaW4gZXhwb3J0YCB3cml0ZXMgYW5kIGAtLXRvb2xjaGFpbi1maWxlYCByZWFkcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbGNoYWluRmlsZSB7XG4gIHJlYWRvbmx5IGZvcm1hdDogdHlwZW9mIFRPT0xDSEFJTl9GSUxFX0ZPUk1BVDtcbiAgcmVhZG9ubHkgcmVsZWFzZVZlcnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgcmVzb2x2ZWRWaWE6IExvb2t1cFRvb2xjaGFpblsncmVzb2x2ZWRWaWEnXTtcbiAgcmVhZG9ubHkgdG9vbGNoYWluOiBMb29rdXBUb29sY2hhaW5bJ3ZlcnNpb25zJ107XG4gIHJlYWRvbmx5IGV4cG9ydGVkQXQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF0Zm9ybSB0aGUgcmVsZWFzZSB3YXMgZXhwb3J0ZWQgZnJvbS4gSXRzIGhvc3QgaXMgdGhlIHJlZ2lzdHJ5XG4gICAqIENvZGVCdWlsZCBwdWxscyBib3RoIGltYWdlcyBmcm9tLCBzbyBhIGxvY2FsLXNwZWMgZGVwbG95IGJha2VzIGl0IGFzIHRoZVxuICAgKiBwdWxsIGhvc3QgKHVubGVzcyBJTUFHRV9SRUdJU1RSWV9QVUxMX0hPU1QgaXMgc2V0KSwgbGlrZSBhIHBsYXRmb3JtIGRlcGxveS5cbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtQmFzZVVybD86IHN0cmluZztcbiAgcmVhZG9ubHkgYm9vdHN0cmFwOiBUb29sY2hhaW5GaWxlSGFsZjtcbiAgcmVhZG9ubHkgc3ludGg6IFRvb2xjaGFpbkZpbGVIYWxmO1xufVxuXG4vKiogVGhlIHJlZnVzYWwgZXZlcnkgZmFpbHVyZSBoZXJlIHJhaXNlcyDigJQgb25lIGNvZGUsIHNvIGBQQl9TWU5USF9GQUlMVVJFYCByZXBvcnRzIGl0IHVuaWZvcm1seS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXBVbnJlc29sdmVkKG1lc3NhZ2U6IHN0cmluZywgY29kZTogc3RyaW5nID0gRXJyb3JDb2RlLkJPT1RTVFJBUF9JTUFHRV9VTlJFU09MVkVEKTogUGx1Z2luUmVzb2x1dGlvbkVycm9yIHtcbiAgcmV0dXJuIG5ldyBQbHVnaW5SZXNvbHV0aW9uRXJyb3IoW3sgcGx1Z2luOiBCT09UU1RSQVBfUExVR0lOLCBjb2RlLCBtZXNzYWdlIH1dKTtcbn1cblxuLyoqIExvb2sgdXAgb25lIG1hbmFnZWQgaGFsZi4gVGhyb3dzIHtAbGluayBib290c3RyYXBVbnJlc29sdmVkfSBvbiBhbnkgZmFpbHVyZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvb2t1cE1hbmFnZWQoXG4gIGNsaWVudDogQXBpQ2xpZW50LFxuICBuYW1lOiBzdHJpbmcsXG4gIHJlbGVhc2VQaW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY29udGV4dD86IHsgcGlwZWxpbmVJZDogc3RyaW5nOyBzdGVwS2V5czogc3RyaW5nW10gfSxcbik6IFByb21pc2U8eyBwbHVnaW46IFBsdWdpblJlY29yZDsgdG9vbGNoYWluOiBMb29rdXBUb29sY2hhaW47IHdhcm5pbmdzOiBMb29rdXBXYXJuaW5nW10gfT4ge1xuICBjb25zdCB3aGF0ID0gYCR7bmFtZX0ke3JlbGVhc2VQaW4gPyBgIChyZWxlYXNlICR7cmVsZWFzZVBpbn0pYCA6ICcnfWA7XG4gIGxldCByZXM6IHVua25vd247XG4gIHRyeSB7XG4gICAgcmVzID0gYXdhaXQgY2xpZW50LnBvc3Q8dW5rbm93bj4oJy9hcGkvcGx1Z2lucy9sb29rdXAnLCB7XG4gICAgICBmaWx0ZXI6IHsgbmFtZSB9LFxuICAgICAgLi4uKHJlbGVhc2VQaW4gPyB7IHJlbGVhc2VQaW4gfSA6IHt9KSxcbiAgICAgIC4uLihjb250ZXh0ID8geyBjb250ZXh0IH0gOiB7fSksXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnN0IGNvZGUgPSBzZXJ2aWNlRXJyb3JDb2RlKGVycik7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVyciBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJlc3BvbnNlPy5zdGF0dXM7XG4gICAgY29uc3Qgd2h5ID0gY29kZSA9PT0gRXJyb3JDb2RlLlRPT0xDSEFJTl9OT19ERUZBVUxUXG4gICAgICA/ICd0aGUgcGxhdGZvcm0gaGFzIG5vIGRlZmF1bHQgdG9vbGNoYWluIHJlbGVhc2UgKGFuIG9wZXJhdG9yIHNldHMgb25lIHdpdGggYGRlcGxveS9iaW4vaW5pdC1wbGF0Zm9ybS5zaGAgb3IgdGhlIFRvb2xjaGFpbiBjb25zb2xlKSdcbiAgICAgIDogc3RhdHVzID09PSA0MDQgJiYgcmVsZWFzZVBpblxuICAgICAgICA/IGByZWxlYXNlICR7cmVsZWFzZVBpbn0gZG9lcyBub3QgZXhpc3QgKGRlbGV0ZWQpIOKAlCBwaW4gYW5vdGhlciByZWxlYXNlIG9yIGNsZWFyIHRoZSBwaXBlbGluZSdzIHRvb2xjaGFpbi5yZWxlYXNlYFxuICAgICAgICA6IGVycm9yTWVzc2FnZShlcnIpO1xuICAgIHRocm93IGJvb3RzdHJhcFVucmVzb2x2ZWQoYFRvb2xjaGFpbiAke3doYXR9IGNvdWxkIG5vdCBiZSByZXNvbHZlZDogJHt3aHl9YCk7XG4gIH1cbiAgY29uc3QgeyBwbHVnaW4sIHdhcm5pbmdzLCB0b29sY2hhaW4gfSA9IHVud3JhcExvb2t1cChyZXMpO1xuICBpZiAoIXBsdWdpbiB8fCBwbHVnaW4ubmFtZSAhPT0gbmFtZSkgdGhyb3cgYm9vdHN0cmFwVW5yZXNvbHZlZChgVG9vbGNoYWluICR7d2hhdH0gY291bGQgbm90IGJlIHJlc29sdmVkOiB0aGUgbG9va3VwIHJldHVybmVkIG5vICR7bmFtZX0gcmVjb3JkYCk7XG4gIGlmICghdG9vbGNoYWluKSB0aHJvdyBib290c3RyYXBVbnJlc29sdmVkKGBUb29sY2hhaW4gJHt3aGF0fSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQ6IHRoZSBhbnN3ZXIgY2FycmllZCBubyB0b29sY2hhaW4gcmVsZWFzZWApO1xuICBpZiAocmVsZWFzZVBpbiAmJiB0b29sY2hhaW4ucmVsZWFzZVZlcnNpb24gIT09IHJlbGVhc2VQaW4pIHtcbiAgICB0aHJvdyBib290c3RyYXBVbnJlc29sdmVkKGBUb29sY2hhaW4gJHt3aGF0fSByZXNvbHZlZCB0byByZWxlYXNlICR7dG9vbGNoYWluLnJlbGVhc2VWZXJzaW9ufSwgbm90IHRoZSBwaW5uZWQgJHtyZWxlYXNlUGlufWAsIEVycm9yQ29kZS5UT09MQ0hBSU5fUEFJUl9NSVNNQVRDSCk7XG4gIH1cbiAgcmV0dXJuIHsgcGx1Z2luLCB0b29sY2hhaW4sIHdhcm5pbmdzIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgcGlwZWxpbmUncyBgcGlwZWxpbmUtYm9vdHN0cmFwYCB0aHJvdWdoIGAvcGx1Z2lucy9sb29rdXBgIHdpdGhcbiAqIGByZWxlYXNlUGluID0gcHJvcHMudG9vbGNoYWluPy5yZWxlYXNlYC4gRkFUQUwgb24gYW55IGZhaWx1cmVcbiAqIChgQk9PVFNUUkFQX0lNQUdFX1VOUkVTT0xWRURgKTogdW5yZWFjaGFibGUgcGxhdGZvcm0sIG5vIGRlZmF1bHQgKDQwOVxuICogYFRPT0xDSEFJTl9OT19ERUZBVUxUYCksIGEgZGVsZXRlZCBwaW4gKDQwNCksIGEgcmVmdXNlZCBzaWduYXR1cmUsIG9yIGFuXG4gKiBhbnN3ZXIgd2l0aG91dCBhIHJlbGVhc2UuIFdhcm5pbmdzIGFyZSBwcmludGVkLCBhcHBlbmRlZCB0byBgd2FybmluZ1NpbmtgLFxuICogYW5kIOKAlCB3aXRoIGEgYHBpcGVsaW5lSWRgIOKAlCByZWNvcmRlZCBieSB0aGUgcGxhdGZvcm0gb24gdGhlIHBpcGVsaW5lJ3NcbiAqIFwiQnVpbGQgaW1hZ2VcIiByb3cgKGBjb250ZXh0LnN0ZXBLZXlzOiBbJ2J1aWxkLWltYWdlJ11gKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVCb290c3RyYXBJbWFnZShcbiAgY2xpZW50OiBBcGlDbGllbnQsXG4gIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgd2FybmluZ1Npbms/OiBMb29rdXBXYXJuaW5nW10sXG4pOiBQcm9taXNlPFJlc29sdmVkQm9vdHN0cmFwPiB7XG4gIGNvbnN0IHBpcGVsaW5lSWQgPSB0eXBlb2YgcHJvcHMucGlwZWxpbmVJZCA9PT0gJ3N0cmluZycgJiYgcHJvcHMucGlwZWxpbmVJZC5sZW5ndGggPiAwID8gcHJvcHMucGlwZWxpbmVJZCA6IHVuZGVmaW5lZDtcbiAgY29uc3QgeyBwbHVnaW4sIHRvb2xjaGFpbiwgd2FybmluZ3MgfSA9IGF3YWl0IGxvb2t1cE1hbmFnZWQoXG4gICAgY2xpZW50LCBCT09UU1RSQVBfUExVR0lOLCB0b29sY2hhaW5SZWxlYXNlUGluKHByb3BzKSxcbiAgICAvLyBSZWNvcmRlZCBhZ2FpbnN0IHRoZSBwaXBlbGluZSdzIFwiQnVpbGQgaW1hZ2VcIiByb3cgKGFwaS1jb3JlIEJVSUxEX0lNQUdFX1NURVBfS0VZKS5cbiAgICBwaXBlbGluZUlkID8geyBwaXBlbGluZUlkLCBzdGVwS2V5czogW0JVSUxEX0lNQUdFX1NURVBfS0VZXSB9IDogdW5kZWZpbmVkLFxuICApO1xuICBmb3IgKGNvbnN0IHdhcm5pbmcgb2Ygd2FybmluZ3MpIHtcbiAgICBwcmludExvb2t1cFdhcm5pbmcoQk9PVFNUUkFQX1BMVUdJTiwgd2FybmluZyk7XG4gICAgd2FybmluZ1Npbms/LnB1c2god2FybmluZyk7XG4gIH1cbiAgcmV0dXJuIHsgcGx1Z2luLCB0b29sY2hhaW4gfTtcbn1cblxuLyoqIFRoZSBtYW5hZ2VkIHN5bnRoIHJlZmVyZW5jZSBvZiBhIHBpcGVsaW5lJ3MgcHJvcHMsIHdoZW4gaXRzIHN5bnRoIHBsdWdpbiBpcyBgY2RrLXN5bnRoYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYW5hZ2VkU3ludGhLZXkocHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHJlZiA9IChwcm9wcy5zeW50aCBhcyB7IHBsdWdpbj86IHsgbmFtZT86IHN0cmluZzsgcHVibGlzaGVyPzogc3RyaW5nOyBhbGlhcz86IHN0cmluZzsgZmlsdGVyPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSB9IHwgdW5kZWZpbmVkKT8ucGx1Z2luO1xuICBpZiAoIXJlZj8ubmFtZSB8fCAhaXNNYW5hZ2VkVG9vbGNoYWluUmVmKHJlZikpIHJldHVybiBudWxsO1xuICByZXR1cm4gcGx1Z2luQXJ0aWZhY3RBbGlhcyhyZWYgYXMgeyBuYW1lOiBzdHJpbmcgfSk7XG59XG5cbi8qKlxuICogQm90aCBoYWx2ZXMgb2Ygb25lIHJlbGVhc2UgbXVzdCBhZ3JlZS4gQSBtYW5hZ2VkIGBjZGstc3ludGhgIHRoYXQgcmVzb2x2ZWRcbiAqIHRvIGEgZGlmZmVyZW50IHJlbGVhc2UgdGhhbiB0aGUgYm9vdHN0cmFwIGlzIHJlZnVzZWQgKG5ldmVyIHNlcnZlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRPbmVSZWxlYXNlKGJvb3RzdHJhcDogUmVzb2x2ZWRCb290c3RyYXAsIHN5bnRoVG9vbGNoYWluczogUmVjb3JkPHN0cmluZywgTG9va3VwVG9vbGNoYWluPik6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtrZXksIHN5bnRoXSBvZiBPYmplY3QuZW50cmllcyhzeW50aFRvb2xjaGFpbnMpKSB7XG4gICAgaWYgKHN5bnRoLnJlbGVhc2VWZXJzaW9uICE9PSBib290c3RyYXAudG9vbGNoYWluLnJlbGVhc2VWZXJzaW9uKSB7XG4gICAgICB0aHJvdyBib290c3RyYXBVbnJlc29sdmVkKFxuICAgICAgICBgVG9vbGNoYWluIGhhbHZlcyBkaXNhZ3JlZTogcGlwZWxpbmUtYm9vdHN0cmFwIGlzIHJlbGVhc2UgJHtib290c3RyYXAudG9vbGNoYWluLnJlbGVhc2VWZXJzaW9ufSBidXQgXCIke2tleX1cIiBpcyAke3N5bnRoLnJlbGVhc2VWZXJzaW9ufWAsXG4gICAgICAgIEVycm9yQ29kZS5UT09MQ0hBSU5fUEFJUl9NSVNNQVRDSCxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGhhbGYocGx1Z2luOiBQbHVnaW5SZWNvcmQpOiBUb29sY2hhaW5GaWxlSGFsZiB7XG4gIGNvbnN0IHJlYyA9IHBsdWdpbiBhcyBQbHVnaW5SZWNvcmQgJiB7IGltYWdlUmVwb3NpdG9yeT86IHN0cmluZyB8IG51bGw7IGltYWdlRGlnZXN0Pzogc3RyaW5nIHwgbnVsbCB9O1xuICByZXR1cm4ge1xuICAgIG5hbWU6IHJlYy5uYW1lLFxuICAgIHZlcnNpb246IHJlYy52ZXJzaW9uLFxuICAgIGltYWdlUmVwb3NpdG9yeTogcmVjLmltYWdlUmVwb3NpdG9yeSA/PyAnJyxcbiAgICBpbWFnZURpZ2VzdDogcmVjLmltYWdlRGlnZXN0ID8/ICcnLFxuICAgIHBsdWdpbixcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGJvdGggaGFsdmVzIG9mIGEgcmVsZWFzZSBmb3IgZXhwb3J0OiBgcmVsZWFzZWAgd2hlbiBnaXZlbiwgZWxzZVxuICogd2hhdGV2ZXIgdGhlIGNhbGxlcidzIG9yZyByZXNvbHZlcyB0byBub3cgKGl0cyBkZWZhdWx0LCBjYW5hcnkgb3IgdGhlXG4gKiBwbGF0Zm9ybSBkZWZhdWx0KS4gQm90aCBsb29rdXBzIHNlbmQgdGhlIHNhbWUgcGluOyB3aGVuIG5vIHBpbiBpcyBnaXZlbiB0aGVcbiAqIGJvb3RzdHJhcCdzIHJlbGVhc2UgYmVjb21lcyB0aGUgc3ludGgncyBwaW4sIHNvIHRoZSBoYWx2ZXMgYWx3YXlzIG1hdGNoLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwb3J0VG9vbGNoYWluKGNsaWVudDogQXBpQ2xpZW50LCByZWxlYXNlPzogc3RyaW5nKTogUHJvbWlzZTxUb29sY2hhaW5GaWxlPiB7XG4gIGNvbnN0IGJvb3RzdHJhcCA9IGF3YWl0IGxvb2t1cE1hbmFnZWQoY2xpZW50LCBCT09UU1RSQVBfUExVR0lOLCByZWxlYXNlKTtcbiAgY29uc3Qgc3ludGggPSBhd2FpdCBsb29rdXBNYW5hZ2VkKGNsaWVudCwgU1lOVEhfUExVR0lOLCByZWxlYXNlID8/IGJvb3RzdHJhcC50b29sY2hhaW4ucmVsZWFzZVZlcnNpb24pO1xuICBhc3NlcnRPbmVSZWxlYXNlKHsgcGx1Z2luOiBib290c3RyYXAucGx1Z2luLCB0b29sY2hhaW46IGJvb3RzdHJhcC50b29sY2hhaW4gfSwgeyBbU1lOVEhfUExVR0lOXTogc3ludGgudG9vbGNoYWluIH0pO1xuICByZXR1cm4ge1xuICAgIGZvcm1hdDogVE9PTENIQUlOX0ZJTEVfRk9STUFULFxuICAgIHJlbGVhc2VWZXJzaW9uOiBib290c3RyYXAudG9vbGNoYWluLnJlbGVhc2VWZXJzaW9uLFxuICAgIHJlc29sdmVkVmlhOiBib290c3RyYXAudG9vbGNoYWluLnJlc29sdmVkVmlhLFxuICAgIHRvb2xjaGFpbjogeyAuLi5zeW50aC50b29sY2hhaW4udmVyc2lvbnMsIC4uLmJvb3RzdHJhcC50b29sY2hhaW4udmVyc2lvbnMgfSxcbiAgICBleHBvcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgLi4uKGNsaWVudC5nZXRDb25maWcoKS5hcGkuYmFzZVVybCA/IHsgcGxhdGZvcm1CYXNlVXJsOiBjbGllbnQuZ2V0Q29uZmlnKCkuYXBpLmJhc2VVcmwgfSA6IHt9KSxcbiAgICBib290c3RyYXA6IGhhbGYoYm9vdHN0cmFwLnBsdWdpbiksXG4gICAgc3ludGg6IGhhbGYoc3ludGgucGx1Z2luKSxcbiAgfTtcbn1cblxuY29uc3QgSE9XX1RPX0VYUE9SVCA9ICdQcm9kdWNlIG9uZSB3aXRoIGBwaXBlbGluZS1tYW5hZ2VyIHRvb2xjaGFpbiBleHBvcnQgLS1vdXRwdXQgdG9vbGNoYWluLmpzb25gIChhZGQgYC0tcmVsZWFzZSA8Vj5gIHRvIHBpbiBhIHJlbGVhc2UpICdcbiAgKyAnYWdhaW5zdCB0aGUgcGxhdGZvcm0sIHRoZW4gcGFzcyBgLS10b29sY2hhaW4tZmlsZSB0b29sY2hhaW4uanNvbmAuJztcblxuLyoqIFRoZSBsb2NhbC1zcGVjIHJlZnVzYWwgd2hlbiBubyBgLS10b29sY2hhaW4tZmlsZWAgd2FzIGdpdmVuLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvb2xjaGFpbkZpbGVSZXF1aXJlZCgpOiBQbHVnaW5SZXNvbHV0aW9uRXJyb3Ige1xuICByZXR1cm4gYm9vdHN0cmFwVW5yZXNvbHZlZChgLS1sb2NhbC1zcGVjIGRlcGxveXMgd2l0aG91dCB0aGUgcGxhdGZvcm0sIHNvIHRoZSB0b29sY2hhaW4gcmVsZWFzZSBtdXN0IGNvbWUgZnJvbSAtLXRvb2xjaGFpbi1maWxlLiAke0hPV19UT19FWFBPUlR9YCk7XG59XG5cbmNvbnN0IERJR0VTVF9SRSA9IC9ec2hhMjU2OlswLTlhLWZdezY0fSQvO1xuXG4vKipcbiAqIFJlYWQgYW5kIGNoZWNrIGEgYHRvb2xjaGFpbiBleHBvcnRgIGZpbGU6IGJvdGggaGFsdmVzIHByZXNlbnQsIG5hbWVkIHJpZ2h0LFxuICogZGlnZXN0LXBpbm5lZCwgYW5kIG9mIG9uZSByZWxlYXNlLiBBbnkgcHJvYmxlbSBpcyBgQk9PVFNUUkFQX0lNQUdFX1VOUkVTT0xWRURgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFRvb2xjaGFpbkZpbGUoZmlsZTogc3RyaW5nKTogeyBib290c3RyYXA6IFJlc29sdmVkQm9vdHN0cmFwOyBzeW50aDogUGx1Z2luUmVjb3JkOyBwbGF0Zm9ybUJhc2VVcmw/OiBzdHJpbmcgfSB7XG4gIGNvbnN0IGFicyA9IHBhdGgucmVzb2x2ZShmaWxlKTtcbiAgbGV0IHJhdzogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICByYXcgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhhYnMsICd1dGYtOCcpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgYm9vdHN0cmFwVW5yZXNvbHZlZChgQ2FuJ3QgcmVhZCAtLXRvb2xjaGFpbi1maWxlICR7YWJzfTogJHtlcnJvck1lc3NhZ2UoZXJyKX0uICR7SE9XX1RPX0VYUE9SVH1gKTtcbiAgfVxuICBjb25zdCBiYWQgPSAod2h5OiBzdHJpbmcpOiBuZXZlciA9PiB7IHRocm93IGJvb3RzdHJhcFVucmVzb2x2ZWQoYC0tdG9vbGNoYWluLWZpbGUgJHthYnN9IGlzIG5vdCBhIHRvb2xjaGFpbiBleHBvcnQ6ICR7d2h5fS4gJHtIT1dfVE9fRVhQT1JUfWApOyB9O1xuICBjb25zdCBmID0gcmF3IGFzIFBhcnRpYWw8VG9vbGNoYWluRmlsZT4gfCBudWxsO1xuICBpZiAoIWYgfHwgdHlwZW9mIGYgIT09ICdvYmplY3QnKSBiYWQoJ25vdCBhIEpTT04gb2JqZWN0Jyk7XG4gIGlmIChmIS5mb3JtYXQgIT09IFRPT0xDSEFJTl9GSUxFX0ZPUk1BVCkgYmFkKGB1bnN1cHBvcnRlZCBmb3JtYXQgJHtTdHJpbmcoZiEuZm9ybWF0KX1gKTtcbiAgY29uc3QgdG9vbGNoYWluID0gcGFyc2VMb29rdXBUb29sY2hhaW4oeyByZWxlYXNlVmVyc2lvbjogZiEucmVsZWFzZVZlcnNpb24sIHJlc29sdmVkVmlhOiBmIS5yZXNvbHZlZFZpYSwgdmVyc2lvbnM6IGYhLnRvb2xjaGFpbiB9KTtcbiAgaWYgKCF0b29sY2hhaW4pIGJhZCgnbWlzc2luZyByZWxlYXNlVmVyc2lvbiAvIHJlc29sdmVkVmlhJyk7XG4gIGNvbnN0IGNoZWNrID0gKGg6IFRvb2xjaGFpbkZpbGVIYWxmIHwgdW5kZWZpbmVkLCBuYW1lOiBzdHJpbmcpOiBQbHVnaW5SZWNvcmQgPT4ge1xuICAgIGlmICghaD8ucGx1Z2luIHx8IGgucGx1Z2luLm5hbWUgIT09IG5hbWUgfHwgaC5uYW1lICE9PSBuYW1lKSBiYWQoYG1pc3NpbmcgdGhlICR7bmFtZX0gaGFsZmApO1xuICAgIGlmIChoIS52ZXJzaW9uICE9PSB0b29sY2hhaW4hLnJlbGVhc2VWZXJzaW9uIHx8IGghLnBsdWdpbi52ZXJzaW9uICE9PSB0b29sY2hhaW4hLnJlbGVhc2VWZXJzaW9uKSBiYWQoYCR7bmFtZX0gaXMgbm90IHJlbGVhc2UgJHt0b29sY2hhaW4hLnJlbGVhc2VWZXJzaW9ufWApO1xuICAgIGNvbnN0IHJlYyA9IGghLnBsdWdpbiBhcyBQbHVnaW5SZWNvcmQgJiB7IGltYWdlRGlnZXN0Pzogc3RyaW5nIHwgbnVsbDsgaW1hZ2VSZXBvc2l0b3J5Pzogc3RyaW5nIHwgbnVsbCB9O1xuICAgIGlmICghcmVjLmltYWdlRGlnZXN0IHx8ICFESUdFU1RfUkUudGVzdChyZWMuaW1hZ2VEaWdlc3QpIHx8IHJlYy5pbWFnZURpZ2VzdCAhPT0gaCEuaW1hZ2VEaWdlc3QpIGJhZChgJHtuYW1lfSBoYXMgbm8gc2lnbmVkIGltYWdlIGRpZ2VzdGApO1xuICAgIGlmIChyZWMuaW1hZ2VSZXBvc2l0b3J5ICE9PSBgc3lzdGVtLyR7bmFtZX1gIHx8IGghLmltYWdlUmVwb3NpdG9yeSAhPT0gcmVjLmltYWdlUmVwb3NpdG9yeSkgYmFkKGAke25hbWV9IGlzIG5vdCBzeXN0ZW0vJHtuYW1lfWApO1xuICAgIHJldHVybiBoIS5wbHVnaW47XG4gIH07XG4gIGNvbnN0IGJvb3RzdHJhcCA9IGNoZWNrKGYhLmJvb3RzdHJhcCwgQk9PVFNUUkFQX1BMVUdJTik7XG4gIGNvbnN0IHN5bnRoID0gY2hlY2soZiEuc3ludGgsIFNZTlRIX1BMVUdJTik7XG4gIGNvbnN0IHBsYXRmb3JtQmFzZVVybCA9IHR5cGVvZiBmIS5wbGF0Zm9ybUJhc2VVcmwgPT09ICdzdHJpbmcnICYmIGYhLnBsYXRmb3JtQmFzZVVybC5sZW5ndGggPiAwID8gZiEucGxhdGZvcm1CYXNlVXJsIDogdW5kZWZpbmVkO1xuICByZXR1cm4geyBib290c3RyYXA6IHsgcGx1Z2luOiBib290c3RyYXAsIHRvb2xjaGFpbjogdG9vbGNoYWluISB9LCBzeW50aCwgLi4uKHBsYXRmb3JtQmFzZVVybCAmJiB7IHBsYXRmb3JtQmFzZVVybCB9KSB9O1xufVxuXG4vKipcbiAqIEFwcGx5IGEgdG9vbGNoYWluIGZpbGUgdG8gbG9jYWwtc3BlYyBwcm9wczogdGhlIGJvb3RzdHJhcCBhc1xuICogYHJlc29sdmVkQm9vdHN0cmFwYCwgdGhlIGV4cG9ydGluZyBwbGF0Zm9ybSBhcyB0aGUgcmVnaXN0cnkgcHVsbCBob3N0LCBhbmQg4oCUXG4gKiB3aGVuIHRoZSBzeW50aCBwbHVnaW4gaXMgdGhlIG1hbmFnZWQgYGNkay1zeW50aGAg4oCUIHRoZSBleHBvcnRlZCBzeW50aCBoYWxmXG4gKiBhcyBpdHMgcHJlLXJlc29sdmVkIHBsdWdpbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VG9vbGNoYWluRmlsZShwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGZpbGU6IHN0cmluZyk6IFRvb2xjaGFpbkZpbGVbJ3JlbGVhc2VWZXJzaW9uJ10ge1xuICBjb25zdCB7IGJvb3RzdHJhcCwgc3ludGgsIHBsYXRmb3JtQmFzZVVybCB9ID0gcmVhZFRvb2xjaGFpbkZpbGUoZmlsZSk7XG4gIGNvbnN0IHBpbiA9IHRvb2xjaGFpblJlbGVhc2VQaW4ocHJvcHMpO1xuICBpZiAocGluICYmIHBpbiAhPT0gYm9vdHN0cmFwLnRvb2xjaGFpbi5yZWxlYXNlVmVyc2lvbikge1xuICAgIHRocm93IGJvb3RzdHJhcFVucmVzb2x2ZWQoXG4gICAgICBgVGhlIHBpcGVsaW5lIHBpbnMgdG9vbGNoYWluIHJlbGVhc2UgJHtwaW59IGJ1dCAtLXRvb2xjaGFpbi1maWxlIGhvbGRzICR7Ym9vdHN0cmFwLnRvb2xjaGFpbi5yZWxlYXNlVmVyc2lvbn0uIGBcbiAgICAgICsgYEV4cG9ydCB0aGUgcGlubmVkIG9uZTogXFxgcGlwZWxpbmUtbWFuYWdlciB0b29sY2hhaW4gZXhwb3J0IC0tcmVsZWFzZSAke3Bpbn1cXGAuYCxcbiAgICAgIEVycm9yQ29kZS5UT09MQ0hBSU5fUEFJUl9NSVNNQVRDSCxcbiAgICApO1xuICB9XG4gIHByb3BzLnJlc29sdmVkQm9vdHN0cmFwID0gYm9vdHN0cmFwO1xuICBiYWtlUGxhdGZvcm1SZWdpc3RyeShwcm9wcywgcGxhdGZvcm1CYXNlVXJsKTtcbiAgY29uc3Qgc3ludGhLZXkgPSBtYW5hZ2VkU3ludGhLZXkocHJvcHMpO1xuICBpZiAoc3ludGhLZXkpIHtcbiAgICBwcm9wcy5yZXNvbHZlZFBsdWdpbnMgPSB7IC4uLihwcm9wcy5yZXNvbHZlZFBsdWdpbnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpLCBbc3ludGhLZXldOiBzeW50aCB9O1xuICB9XG4gIHJldHVybiBib290c3RyYXAudG9vbGNoYWluLnJlbGVhc2VWZXJzaW9uO1xufVxuIl19
package/package.json CHANGED
@@ -33,9 +33,9 @@
33
33
  "@aws-sdk/client-secrets-manager": "3.1160.0",
34
34
  "@aws-sdk/client-sqs": "3.1160.0",
35
35
  "@aws-sdk/client-sts": "3.1160.0",
36
- "@pipeline-builder/ai-core": "4.3.10",
37
- "@pipeline-builder/api-core": "5.2.10",
38
- "@pipeline-builder/pipeline-core": "4.4.11",
36
+ "@pipeline-builder/ai-core": "4.3.11",
37
+ "@pipeline-builder/api-core": "5.2.11",
38
+ "@pipeline-builder/pipeline-core": "4.4.12",
39
39
  "aws-cdk-lib": "2.275.0",
40
40
  "axios": "1.21.1",
41
41
  "commander": "15.1.0",
@@ -106,7 +106,7 @@
106
106
  "registry": "https://registry.npmjs.org/",
107
107
  "provenance": true
108
108
  },
109
- "version": "4.5.2",
109
+ "version": "4.5.3",
110
110
  "bugs": {
111
111
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
112
112
  },