@mnaoumov/typescript-dev-toolkit 3.2.0 → 3.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.
@@ -10,6 +10,7 @@
10
10
  * runs them in order through {@link runBuildSteps}.
11
11
  */
12
12
  import type { Plugin } from 'esbuild';
13
+ import type { PackageJson } from './npm.mjs';
13
14
  /**
14
15
  * The banner every emitted library module opens with.
15
16
  */
@@ -38,6 +39,12 @@ export interface BuildLibraryOptions {
38
39
  * Options for {@link generateLibraryExports}.
39
40
  */
40
41
  export interface GenerateLibraryExportsOptions {
42
+ /**
43
+ * Entries for files that are not built from a source folder (a folder of shared `tsconfig` presets, ambient `.d.ts`
44
+ * files), keyed by subpath. They go into the map after the generated entries, as given, and count toward its change
45
+ * check; no subpath stub is written for them. A key a source folder already generates throws.
46
+ */
47
+ readonly additionalExports?: Readonly<Record<string, PackageJson.Exports>> | undefined;
41
48
  /**
42
49
  * An export condition to put first in every entry, mapping the subpath onto its TypeScript source. Only a
43
50
  * repository holding several packages that import each other needs one; nothing outside it sets the condition, and
@@ -173,7 +173,7 @@ async function buildLibraryTypes() {
173
173
  }
174
174
  }
175
175
  async function generateLibraryExports(options = {}) {
176
- const { sourceCondition } = options;
176
+ const { additionalExports = {}, sourceCondition } = options;
177
177
  const srcFolders = [RepoPaths.Src];
178
178
  for (const dirent of await readdirPosix(RepoPaths.Src, { recursive: true, withFileTypes: true })) {
179
179
  if (!dirent.isDirectory()) {
@@ -195,6 +195,12 @@ async function generateLibraryExports(options = {}) {
195
195
  await setExport({ exportConditions, isWildcard: false, sourceCondition, srcFolder });
196
196
  await setExport({ exportConditions, isWildcard: true, sourceCondition, srcFolder });
197
197
  }
198
+ for (const [subpath, entry] of Object.entries(additionalExports)) {
199
+ if (exportConditions[subpath] !== void 0) {
200
+ throw new Error(`The additional export '${subpath}' collides with an entry generated from a source folder.`);
201
+ }
202
+ exportConditions[subpath] = entry;
203
+ }
198
204
  isChanged = !isDeepEqual(oldExports, packageJson.exports);
199
205
  });
200
206
  if (isChanged) {
@@ -520,4 +526,4 @@ export {
520
526
  generateLibraryIndex,
521
527
  runBuildSteps
522
528
  };
523
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWJyYXJ5LWJ1aWxkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYnVpbGQgcGlwZWxpbmUgb2YgYSBUeXBlU2NyaXB0IExJQlJBUlkgcGFja2FnZTogb25lIGBkaXN0L2xpYi97Y2pzLGVzbX1gIHRyZWUgb2YgdW5idW5kbGVkIG1vZHVsZXMgYmVzaWRlIGl0c1xuICogYC5kLmN0c2AgLyBgLmQubXRzYCBkZWNsYXJhdGlvbnMsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCBhbmQgdGhlIGdlbmVyYXRlZCBgcGFja2FnZS5qc29uYCBgZXhwb3J0c2AgbWFwLlxuICpcbiAqIEVhY2ggc3RlcCB3b3JrcyBvbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciwgd2hpY2ggaXMgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQuIEEgcmVwb3NpdG9yeSdzXG4gKiBgc2NyaXB0cy9idWlsZC0qLnRzYCBlbnRyeSBwb2ludHMgYXJlIHRoaW4gYHdyYXBDbGlUYXNrYCB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBhbmQgaXRzIGBidWlsZGAgc2NyaXB0XG4gKiBydW5zIHRoZW0gaW4gb3JkZXIgdGhyb3VnaCB7QGxpbmsgcnVuQnVpbGRTdGVwc30uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB0eXBlIHsgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFN5bWJvbCBhcyBUc1N5bWJvbCxcbiAgVHlwZUNoZWNrZXJcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzeW5jTWFwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGlzRGVlcEVxdWFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbm9ybWFsaXplSWZSZWxhdGl2ZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgcmVsYXRpdmUgYXMgcmVsYXRpdmVOYXRpdmUsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZU5hdGl2ZVxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVByb2dyYW0sXG4gIGZvckVhY2hDaGlsZCxcbiAgaXNJZGVudGlmaWVyLFxuICBpc1N0cmluZ0xpdGVyYWwsXG4gIFN5bWJvbEZsYWdzXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQgeyBidWlsZENsZWFuIH0gZnJvbSAnLi9idWlsZC50cyc7XG5pbXBvcnQgeyBjaGFuZ2VFeHRlbnNpb25QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9jaGFuZ2UtZXh0ZW5zaW9uLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBmaXhFc21QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9maXgtZXNtLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBwcmVwcm9jZXNzUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvcHJlcHJvY2Vzcy1wbHVnaW4udHMnO1xuaW1wb3J0IHsgcGFyc2VUc0NvbmZpZyB9IGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyB3cml0ZUpzb24gfSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICcuL25wbS1ydW4udHMnO1xuaW1wb3J0IHsgZWRpdFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRvb2xDb21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuaW1wb3J0IHsgUmVwb1BhdGhzIH0gZnJvbSAnLi9yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGV4ZWNGcm9tUm9vdCB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogVGhlIGJhbm5lciBldmVyeSBlbWl0dGVkIGxpYnJhcnkgbW9kdWxlIG9wZW5zIHdpdGguXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX0JBTk5FUiA9IGAvKlxuVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgRVNCVUlMRFxuaWYgeW91IHdhbnQgdG8gdmlldyB0aGUgc291cmNlLCBwbGVhc2UgdmlzaXQgdGhlIGdpdGh1YiByZXBvc2l0b3J5IG9mIHRoaXMgcGx1Z2luXG4qL1xuYDtcblxuLyoqXG4gKiBUaGUgc3RlcHMgb2YgYSBsaWJyYXJ5IGJ1aWxkLCBpbiB0aGUgb3JkZXIge0BsaW5rIHJ1bkJ1aWxkU3RlcHN9IHJ1bnMgdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IExJQlJBUllfQlVJTERfU1RFUFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnYnVpbGQ6Y2xlYW4nLFxuICAnYnVpbGQ6Z2VuZXJhdGUtaW5kZXgnLFxuICAnYnVpbGQ6Y29tcGlsZScsXG4gICdidWlsZDp0eXBlcycsXG4gICdidWlsZDp2YWxpZGF0ZS1kZWNsYXJhdGlvbnMnLFxuICAnYnVpbGQ6bGliJyxcbiAgJ2J1aWxkOmdlbmVyYXRlLWV4cG9ydHMnXG5dO1xuXG4vKipcbiAqIFRoZSBleHBvcnQgY29uZGl0aW9uIGEgcmVwb3NpdG9yeSBob2xkaW5nIHNldmVyYWwgcGFja2FnZXMgbWFwcyBldmVyeSBzdWJwYXRoIG9udG8gaXRzIFR5cGVTY3JpcHQgc291cmNlIHdpdGgsIHNvXG4gKiBhIHBhY2thZ2UgdGhlcmUgY2FuIGltcG9ydCBhIHNpYmxpbmcgcGFja2FnZSdzIHNvdXJjZSBiZWZvcmUgYW55dGhpbmcgaXMgYnVpbHQuIFBhc3MgaXQgdG9cbiAqIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzfSB0aHJvdWdoIHtAbGluayBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucy5zb3VyY2VDb25kaXRpb259LlxuICovXG5leHBvcnQgY29uc3QgU09VUkNFX0NPTkRJVElPTiA9ICdAbW5hb3Vtb3Yvc291cmNlJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgYnVpbGRMaWJyYXJ5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZExpYnJhcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHByZXByb2Nlc3MgcGx1Z2luIGZvciBvbmUgb3V0cHV0IGZvcm1hdC4gRGVmYXVsdHMgdG8gdGhlIGdlbmVyaWMgb25lLCB3aGljaCBjYXJyaWVzIG5vXG4gICAqIGVudmlyb25tZW50LXNwZWNpZmljIGByZXF1aXJlYCBwYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5PzogKGlzRXNtOiBib29sZWFuKSA9PiBQbHVnaW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdlbmVyYXRlTGlicmFyeUV4cG9ydHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIGV4cG9ydCBjb25kaXRpb24gdG8gcHV0IGZpcnN0IGluIGV2ZXJ5IGVudHJ5LCBtYXBwaW5nIHRoZSBzdWJwYXRoIG9udG8gaXRzIFR5cGVTY3JpcHQgc291cmNlLiBPbmx5IGFcbiAgICogcmVwb3NpdG9yeSBob2xkaW5nIHNldmVyYWwgcGFja2FnZXMgdGhhdCBpbXBvcnQgZWFjaCBvdGhlciBuZWVkcyBvbmU7IG5vdGhpbmcgb3V0c2lkZSBpdCBzZXRzIHRoZSBjb25kaXRpb24sIGFuZFxuICAgKiB0aGUgc291cmNlcyBpdCBwb2ludHMgYXQgZG8gbm90IHNoaXAsIHNvIHRoZSBwdWJsaXNoIGhhcyB0byBzdHJpcCBpdCBhZ2Fpbi4gT21pdHRlZCwgdGhlIG1hcCBoYXMgbm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUNvbmRpdGlvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxudHlwZSBNb2R1bGVGb3JtYXQgPSAnY2pzJyB8ICdlc20nO1xuXG5jb25zdCBERUNMQVJBVElPTl9SRUZFUkVOQ0VfVFlQRVMgPSBuZXcgU2V0KFsnbm9kZSddKTtcblxuLy8gVGhlIGxpYnMgdGhhdCBkZXNjcmliZSBhIGhvc3QncyBnbG9iYWxzIHJhdGhlciB0aGFuIHRoZSBsYW5ndWFnZSwgd2hpY2ggY29uc3VtZXJzIGNvbmZsaWN0IG92ZXIuIEVhY2ggZGVjbGFyYXRpb25cbi8vIGdldHMgdGhlIG9uZXMgaXQgdXNlczsgZXZlcnkgb3RoZXIgbGliIGlzIHNoYXJlZCB0aHJvdWdoIGBsaWJyYXJ5LXJlZmVyZW5jZXNgLlxuY29uc3QgRU5WSVJPTk1FTlRfTElCX1BSRUZJWEVTOiByZWFkb25seSBzdHJpbmdbXSA9IFsnZG9tJywgJ3NjcmlwdGhvc3QnLCAnd2Vid29ya2VyJ107XG5jb25zdCBOT0RFX1RZUEVTX1BBVEhfU0VHTUVOVCA9ICcvbm9kZV9tb2R1bGVzL0B0eXBlcy9ub2RlLyc7XG5jb25zdCBMSUJfUkVQTEFDRU1FTlRfUkVHX0VYUCA9IC9cXC9ub2RlX21vZHVsZXNcXC9AdHlwZXNjcmlwdFxcL2xpYi0oPzxMaWI+W14vXSspXFwvKD88U3ViTGliPi4rKVxcLmRcXC50cyQvO1xuXG4vLyBUaGUgZGVjbGFyYXRpb24gdGhhdCBjYXJyaWVzIG9ubHkgdGhlIGBsaWJgIGFuZCBgdHlwZXNgIHJlZmVyZW5jZXMuIEV2ZXJ5IGRlY2xhcmF0aW9uIGJ1dCB0aGUgcm9vdCBvbmUgcmVmZXJlbmNlc1xuLy8gaXQsIHJhdGhlciB0aGFuIHRoZSByb290IGJhcnJlbCwgd2hpY2ggd291bGQgbG9hZCBldmVyeSBtb2R1bGUgb2YgdGhlIHBhY2thZ2UsIG9wdGlvbmFsIHBlZXJzJyB0eXBlcyBpbmNsdWRlZC5cbmNvbnN0IExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgPSAnbGlicmFyeS1yZWZlcmVuY2VzJztcbi8vIFNwZWxsZWQgYXBhcnQgb24gcHVycG9zZToge0BsaW5rIGNvbGxlY3RBbGxMaWJzfSBzY2FucyBldmVyeSBzb3VyY2UgZmlsZSBvZiB0aGUgcGFja2FnZSBiZWluZyBidWlsdCBmb3IgdGhlXG4vLyBkaXJlY3RpdmUsIHRoaXMgb25lIGluY2x1ZGVkLCBzbyBhIGxpdGVyYWwgb25lIGhlcmUgd291bGQgYmUgcmVhZCBhcyBhIGxpYiB0aGlzIHBhY2thZ2UgbmVlZHMuXG5jb25zdCBSRUZFUkVOQ0VfTElCX0RJUkVDVElWRSA9IFsnPHJlZmVyZW5jZScsICdsaWI9J10uam9pbignICcpO1xuY29uc3QgUkVGRVJFTkNFX0xJQl9SRUdfRVhQID0gL1xcL1xcL1xcLyA8cmVmZXJlbmNlIGxpYj1cIig/PExpYj5bXlwiXSspXCIgXFwvPi9nbTtcblxuLy8gQSBiYXJlLXNwZWNpZmllciAobm9uLXJlbGF0aXZlKSB0eXBlLW9ubHkgaW1wb3J0LCBlLmcuIGBpbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO2AuXG5jb25zdCBCQVJFX1RZUEVfSU1QT1JUX1JFR19FWFAgPSAvXmltcG9ydCB0eXBlICg/PENsYXVzZT4uKz8pIGZyb20gJyg/PFNwZWNpZmllcj5bXi4nXVteJ10qKSc7JC9nbTtcblxuLy8gQSBiYXJlLXNwZWNpZmllciAobm9uLXJlbGF0aXZlKSBpbmxpbmUgaW1wb3J0IHR5cGUgbm9kZSwgZS5nLiBgaW1wb3J0KFwidHlwZS1mZXN0XCIpLlByb21pc2FibGVgLlxuY29uc3QgQkFSRV9JTkxJTkVfSU1QT1JUX1RZUEVfUkVHX0VYUCA9IC9pbXBvcnRcXChcIig/PFNwZWNpZmllcj5bXi5cIl1bXlwiXSopXCJcXCkvZztcblxuY29uc3QgU1RBVElDX0lNUE9SVF9SRUdfRVhQID0gL2Zyb20gJyg/PEltcG9ydFBhdGg+Lis/KVxcLnRzJzsvZ207XG5cbi8vIElubGluZSBpbXBvcnQtdHlwZSBub2RlcyAoYHR5cGVvZiBpbXBvcnQoJy4vZm9vLnRzJylgKSBwcmVzZXJ2ZSB0aGUgc291cmNlIHF1b3RlIHN0eWxlLlxuLy8gSGFuZC1hdXRob3JlZCBgLmQudHNgIGZpbGVzIGVtaXQgc2luZ2xlIHF1b3RlczsgdHNjLWdlbmVyYXRlZCBkZWNsYXJhdGlvbnMgZW1pdCBkb3VibGUgcXVvdGVzLlxuLy8gQ2FwdHVyZSB0aGUgcXVvdGUgYW5kIHJldXNlIGl0IGluIHRoZSByZXBsYWNlbWVudCBzbyBib3RoIHN0eWxlcyBhcmUgcmV3cml0dGVuLlxuY29uc3QgRFlOQU1JQ19JTVBPUlRfUkVHX0VYUCA9IC9pbXBvcnRcXCgoPzxRdW90ZT5bJ1wiXSkoPzxJbXBvcnRQYXRoPi4rPylcXC50c1xcazxRdW90ZT5cXCkvZ207XG5cbmVudW0gR2VuZXJhdGVJbmRleFJlc3VsdCB7XG4gIFNraXBwZWQgPSAnc2tpcHBlZCcsXG4gIFN1Y2Nlc3MgPSAnc3VjY2Vzcydcbn1cblxuaW50ZXJmYWNlIEFkZEVudmlyb25tZW50R2xvYmFsc1BhcmFtcyB7XG4gIHJlYWRvbmx5IGxpYnM6IFNldDxzdHJpbmc+O1xuICByZWFkb25seSBwcm9ncmFtOiBQcm9ncmFtO1xuICByZWFkb25seSBzeW1ib2w6IFRzU3ltYm9sO1xuICByZWFkb25seSB0eXBlczogU2V0PHN0cmluZz47XG59XG5cbmludGVyZmFjZSBCdWlsZExpYnJhcnlGb3JtYXRQYXJhbXMge1xuICByZWFkb25seSBmb3JtYXQ6IE1vZHVsZUZvcm1hdDtcbiAgcmVhZG9ubHkgbGliRmlsZXM6IHN0cmluZ1tdO1xuICByZWFkb25seSBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeTogKGlzRXNtOiBib29sZWFuKSA9PiBQbHVnaW47XG59XG5cbmludGVyZmFjZSBCdWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmVQYXJhbXMge1xuICByZWFkb25seSBkZWNsYXJhdGlvbkZpbGVQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV4dGVuc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBtb2R1bGVEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXNQYXJhbXMge1xuICByZWFkb25seSBhdmFpbGFibGVUeXBlczogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGRlY2xhcmF0aW9uRmlsZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2V0RXhwb3J0UGFyYW1zIHtcbiAgcmVhZG9ubHkgZXhwb3J0Q29uZGl0aW9uczogUGFja2FnZUpzb24uRXhwb3J0Q29uZGl0aW9ucztcbiAgcmVhZG9ubHkgaXNXaWxkY2FyZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc291cmNlQ29uZGl0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHNyY0ZvbGRlcjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVG9EaXN0UGF0aFBhcmFtcyB7XG4gIHJlYWRvbmx5IGZvcm1hdDogc3RyaW5nO1xuICByZWFkb25seSBpbXBvcnRQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGV2ZXJ5dGhpbmcgYW4gZWFybGllciBidWlsZCBsZWZ0OiBgZGlzdC9gLCB0aGUgZ2VuZXJhdGVkIGBpbmRleC50c2AgYmFycmVscywgdGhlIGAuZC50c2AgZmlsZXMgYHRzY2Agd3JvdGVcbiAqIGJlc2lkZSB0aGUgc291cmNlcyAoaGFuZC1hdXRob3JlZCBvbmVzIHVuZGVyIGBAdHlwZXNgIHN0YXkpLCBhbmQgdGhlIHBlci1zdWJwYXRoIGBwYWNrYWdlLmpzb25gIHN0dWJzLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeXRoaW5nIGhhcyBiZWVuIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENsZWFuTGlicmFyeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYnVpbGRDbGVhbigpO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlIH0pKSB7XG4gICAgaWYgKGJhc2VuYW1lKGZpbGUpID09PSBSZXBvUGF0aHMuSW5kZXhUcyBhcyBzdHJpbmcpIHtcbiAgICAgIGF3YWl0IHJtKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSkpO1xuICAgIH1cblxuICAgIGlmIChmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pICYmICFmaWxlLnNwbGl0KCcvJykuaW5jbHVkZXMoUmVwb1BhdGhzLlR5cGVzKSkge1xuICAgICAgYXdhaXQgcm0oam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuQ3VycmVudEZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoKGJhc2VuYW1lKGZpbGUpICE9PSBSZXBvUGF0aHMuUGFja2FnZUpzb24gYXMgc3RyaW5nKSB8fCAoZmlsZSA9PT0gUmVwb1BhdGhzLlBhY2thZ2VKc29uIGFzIHN0cmluZykgfHwgZmlsZS5zdGFydHNXaXRoKFJlcG9QYXRocy5Ob2RlTW9kdWxlcykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGF3YWl0IHJtKGZpbGUpO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIGV2ZXJ5IHNvdXJjZSBtb2R1bGUsIHVuYnVuZGxlZCwgaW50byBgZGlzdC9saWIvY2pzYCAoYC5janNgKSBhbmQgYGRpc3QvbGliL2VzbWAgKGAubWpzYCkuXG4gKlxuICogVGhlIG91dHB1dCBmb2xkZXJzIG11c3QgYWxyZWFkeSBleGlzdDsge0BsaW5rIGJ1aWxkTGlicmFyeVR5cGVzfSBjcmVhdGVzIHRoZW0uXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgYnVpbGQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBib3RoIGZvcm1hdHMgaGF2ZSBiZWVuIGJ1aWx0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRMaWJyYXJ5KG9wdGlvbnM6IEJ1aWxkTGlicmFyeU9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5ID0gKGlzRXNtOiBib29sZWFuKTogUGx1Z2luID0+IHByZXByb2Nlc3NQbHVnaW4oeyBpc0VzbSB9KSB9ID0gb3B0aW9ucztcbiAgY29uc3QgbGliRmlsZXMgPSBhd2FpdCBnZXRMaWJGaWxlcygpO1xuICBhd2FpdCBidWlsZExpYnJhcnlGb3JtYXQoeyBmb3JtYXQ6ICdjanMnLCBsaWJGaWxlcywgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgfSk7XG4gIGF3YWl0IGJ1aWxkTGlicmFyeUZvcm1hdCh7IGZvcm1hdDogJ2VzbScsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9KTtcbn1cblxuLyoqXG4gKiBFbWl0cyB0aGUgZGVjbGFyYXRpb25zIHdpdGggYHRzYyAtLXByb2plY3QgLi90c2NvbmZpZy50eXBlcy5qc29uYCwgdGhlbiBjb3BpZXMgZWFjaCBvbmUgaW50byBgZGlzdC9saWJgIHR3aWNlOiBhcyBhXG4gKiBgLmQuY3RzYCB3aG9zZSByZWxhdGl2ZSBpbXBvcnRzIG5hbWUgYC5janNgIGZpbGVzIGFuZCB3aG9zZSBiYXJlIHR5cGUgaW1wb3J0cyBjYXJyeSBgcmVzb2x1dGlvbi1tb2RlOiBpbXBvcnRgLCBhbmRcbiAqIGFzIGEgYC5kLm10c2Agd2hvc2UgcmVsYXRpdmUgaW1wb3J0cyBuYW1lIGAubWpzYCBmaWxlcy5cbiAqXG4gKiBUaGUgbGlicmFyeSdzIHJvb3QgZGVjbGFyYXRpb24gKGBsaWJyYXJ5LnRzYCB3aGVyZSB0aGUgcGFja2FnZSBoYXMgb25lLCBvdGhlcndpc2UgdGhlIGdlbmVyYXRlZCBgaW5kZXgudHNgKSBjYXJyaWVzXG4gKiBldmVyeSBgbGliYCBhbmQgYHR5cGVzYCByZWZlcmVuY2UgdGhlIHBhY2thZ2UgbmVlZHMuIEV2ZXJ5IG90aGVyIGRlY2xhcmF0aW9uIHJlZmVyZW5jZXMgYSBgbGlicmFyeS1yZWZlcmVuY2VzYFxuICogZGVjbGFyYXRpb24gYmVzaWRlIGl0IGJ5IHBhdGgsIG5ldmVyIHRoZSByb290OiB0aGUgcm9vdCBiYXJyZWwgcmUtZXhwb3J0cyBldmVyeSBtb2R1bGUsIHNvIHJlZmVyZW5jaW5nIGl0IG1hZGUgZWFjaFxuICogc3VicGF0aCBsb2FkIHRoZSB3aG9sZSBwYWNrYWdlLCBhbmQgYSBjb25zdW1lciB0eXBlLWNoZWNraW5nIHdpdGggYHNraXBMaWJDaGVjazogZmFsc2VgIHRoZW4gbmVlZGVkIGV2ZXJ5IG9wdGlvbmFsXG4gKiBwZWVyIGluc3RhbGxlZC5cbiAqXG4gKiBgbGlicmFyeS1yZWZlcmVuY2VzYCBjYXJyaWVzIG9ubHkgdGhlIGxpYnMgdGhhdCBkZXNjcmliZSB0aGUgbGFuZ3VhZ2UgKGBlczIwMjJgLCBgZXNuZXh0LmRpc3Bvc2FibGVgKSwgd2hpY2ggbm9cbiAqIGNvbnN1bWVyIGNvbmZsaWN0cyB3aXRoLiBUaGUgb25lcyB0aGF0IGRlc2NyaWJlIGEgaG9zdCAoYGRvbWAsIGBkb20uaXRlcmFibGVgLCBgd2Vid29ya2VyYCkgYW5kIGB0eXBlcz1cIm5vZGVcImAgZ29cbiAqIG9ubHkgaW50byB0aGUgZGVjbGFyYXRpb25zIHRoYXQgbmFtZSBvbmUgb2YgdGhlaXIgZ2xvYmFscywgZm91bmQgYnkgcmVzb2x2aW5nIGV2ZXJ5IG5hbWUgaW4gdGhlIGVtaXR0ZWRcbiAqIGRlY2xhcmF0aW9ucyB3aXRoIHRoZSB0eXBlIGNoZWNrZXIuIE90aGVyd2lzZSBhIGJyb3dzZXIgY29uc3VtZXIgb2YgYSBwdXJlIHN1YnBhdGggZ290IGFsbCBvZiBgQHR5cGVzL25vZGVgLCBhbmQgaXRzXG4gKiBgc2V0VGltZW91dGAgcmV0dXJuZWQgYE5vZGVKUy5UaW1lb3V0YC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRlY2xhcmF0aW9ucyBoYXZlIGJlZW4gd3JpdHRlbi5cbiAqIEB0aHJvd3MgSWYgYSBzb3VyY2UgbW9kdWxlIGlzIG5hbWVkIGBsaWJyYXJ5LXJlZmVyZW5jZXNgLCB3aGljaCB3b3VsZCBjb2xsaWRlIHdpdGggdGhlIGdlbmVyYXRlZCBkZWNsYXJhdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkTGlicmFyeVR5cGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZXhpc3RzU3luYyhqb2luKFJlcG9QYXRocy5TcmMsIGAke0xJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUV9JHtSZXBvUGF0aHMuVHNFeHRlbnNpb259YCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBzcmMvJHtMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FfSR7UmVwb1BhdGhzLlRzRXh0ZW5zaW9ufSBjb2xsaWRlcyB3aXRoIHRoZSBnZW5lcmF0ZWQgZGVjbGFyYXRpb24gb2YgdGhlIHNhbWUgbmFtZS5gKTtcbiAgfVxuXG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChbLi4ucmVzb2x2ZVRvb2xDb21tYW5kKHsgdG9vbDogJ3RzYycgfSksICctLXByb2plY3QnLCAnLi90c2NvbmZpZy50eXBlcy5qc29uJ10pO1xuXG4gIGNvbnN0IGxpYnJhcnlGaWxlTmFtZSA9IGV4aXN0c1N5bmMoam9pbihSZXBvUGF0aHMuU3JjLCAnbGlicmFyeS50cycpKSA/ICdsaWJyYXJ5JyA6ICdpbmRleCc7XG4gIGNvbnN0IGFsbExpYnMgPSBhd2FpdCBjb2xsZWN0QWxsTGlicygpO1xuICBjb25zdCBhbGxUeXBlcyA9IGNvbGxlY3RBbGxUeXBlcygpO1xuICBjb25zdCBkaXJlY3RpdmVzID0gYnVpbGRBbGxSZWZlcmVuY2VMaWJEaXJlY3RpdmVzKGFsbExpYnMpICsgYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXMoYWxsVHlwZXMpO1xuICAvLyBPbmx5IHRoZSBsaWJzIG5vIGNvbnN1bWVyIGNvbmZsaWN0cyB3aXRoLiBUaGUgZW52aXJvbm1lbnQgZ2xvYmFscyBnbyB0byB0aGUgZGVjbGFyYXRpb25zIHRoYXQgdXNlIHRoZW0uXG4gIGNvbnN0IHNoYXJlZERpcmVjdGl2ZXMgPSBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoYWxsTGlicy5maWx0ZXIoKGxpYikgPT4gIWlzRW52aXJvbm1lbnRMaWIobGliKSkpO1xuXG4gIGF3YWl0IG1rZGlyKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5DanMpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgbWtkaXIoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkVzbSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkNqcywgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSwgc2hhcmVkRGlyZWN0aXZlcyk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuRXNtLCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgUmVwb1BhdGhzLkRtdHNFeHRlbnNpb24pLCBzaGFyZWREaXJlY3RpdmVzKTtcblxuICBjb25zdCBzcmNGaWxlcyA9IGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgZGVjbGFyYXRpb25GaWxlcyA9IHNyY0ZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5zdGFydHNXaXRoKFJlcG9QYXRocy5UZXN0SGVscGVycykpO1xuICBjb25zdCBlbnZpcm9ubWVudERpcmVjdGl2ZXMgPSBjb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzKHsgYXZhaWxhYmxlVHlwZXM6IGFsbFR5cGVzLCBkZWNsYXJhdGlvbkZpbGVzIH0pO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBkZWNsYXJhdGlvbkZpbGVzKSB7XG4gICAgY29uc3QgZm9sZGVyID0gZGlybmFtZShmaWxlKTtcbiAgICBjb25zdCBuYW1lID0gYmFzZW5hbWUoZmlsZSwgUmVwb1BhdGhzLkR0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSksICd1dGYtOCcpO1xuXG4gICAgY29uc3QgY3RzUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5DanMsIGZvbGRlciwgbmFtZSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKTtcbiAgICBjb25zdCBtdHNQYXRoID0gam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkVzbSwgZm9sZGVyLCBuYW1lICsgUmVwb1BhdGhzLkRtdHNFeHRlbnNpb24pO1xuXG4gICAgYXdhaXQgbWtkaXIoZGlybmFtZShjdHNQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgbWtkaXIoZGlybmFtZShtdHNQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBsZXQgY3RzQ29udGVudCA9IHRvQ3RzQ29udGVudChjb250ZW50KTtcbiAgICBsZXQgbXRzQ29udGVudCA9IHRvTXRzQ29udGVudChjb250ZW50KTtcblxuICAgIGlmIChuYW1lID09PSBsaWJyYXJ5RmlsZU5hbWUgJiYgZm9sZGVyID09PSAnLicpIHtcbiAgICAgIGN0c0NvbnRlbnQgPSBkaXJlY3RpdmVzICsgY3RzQ29udGVudDtcbiAgICAgIG10c0NvbnRlbnQgPSBkaXJlY3RpdmVzICsgbXRzQ29udGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmlsZURpcmVjdGl2ZXMgPSBlbnZpcm9ubWVudERpcmVjdGl2ZXMuZ2V0KGZpbGUpID8/ICcnO1xuICAgICAgY3RzQ29udGVudCA9IGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZSh7IGRlY2xhcmF0aW9uRmlsZVBhdGg6IGN0c1BhdGgsIGV4dGVuc2lvbjogUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24sIG1vZHVsZURpcmVjdG9yeTogUmVwb1BhdGhzLkNqcyB9KVxuICAgICAgICArIGZpbGVEaXJlY3RpdmVzICsgY3RzQ29udGVudDtcbiAgICAgIG10c0NvbnRlbnQgPSBidWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmUoeyBkZWNsYXJhdGlvbkZpbGVQYXRoOiBtdHNQYXRoLCBleHRlbnNpb246IFJlcG9QYXRocy5EbXRzRXh0ZW5zaW9uLCBtb2R1bGVEaXJlY3Rvcnk6IFJlcG9QYXRocy5Fc20gfSlcbiAgICAgICAgKyBmaWxlRGlyZWN0aXZlcyArIG10c0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgYXdhaXQgd3JpdGVGaWxlKGN0c1BhdGgsIGN0c0NvbnRlbnQpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShtdHNQYXRoLCBtdHNDb250ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2VuZXJhdGVzIHRoZSBgZXhwb3J0c2AgbWFwIG9mIHRoZSBwYWNrYWdlJ3MgYHBhY2thZ2UuanNvbmAgZnJvbSBpdHMgc291cmNlIGZvbGRlcnMsIGFuZCB3cml0ZXMgYSBgcGFja2FnZS5qc29uYFxuICogc3R1YiBwZXIgc3VicGF0aCBmb3IgcmVzb2x2ZXJzIHRoYXQgZG8gbm90IHJlYWQgYGV4cG9ydHNgLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9uc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG1hcCBpcyBjdXJyZW50LlxuICogQHRocm93cyBJZiB0aGUgbWFwIGNoYW5nZWQsIHNvIHRoZSBjaGFuZ2UgZ2V0cyByZXZpZXdlZCBhbmQgY29tbWl0dGVkIHJhdGhlciB0aGFuIHNoaXBwZWQgdW5zZWVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaWJyYXJ5RXhwb3J0cyhvcHRpb25zOiBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc291cmNlQ29uZGl0aW9uIH0gPSBvcHRpb25zO1xuICBjb25zdCBzcmNGb2xkZXJzOiBzdHJpbmdbXSA9IFtSZXBvUGF0aHMuU3JjXTtcblxuICBmb3IgKGNvbnN0IGRpcmVudCBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUsIHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gam9pbihkaXJlbnQucGFyZW50UGF0aCwgZGlyZW50Lm5hbWUpO1xuXG4gICAgaWYgKHBhdGguaW5jbHVkZXMoUmVwb1BhdGhzLlN0eWxlcykgfHwgcGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuVGVzdEhlbHBlcnMpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBzcmNGb2xkZXJzLnB1c2gocGF0aCk7XG4gIH1cblxuICBzcmNGb2xkZXJzLnNvcnQoKTtcblxuICBsZXQgaXNDaGFuZ2VkID0gZmFsc2U7XG5cbiAgYXdhaXQgZWRpdFBhY2thZ2VKc29uKGFzeW5jIChwYWNrYWdlSnNvbikgPT4ge1xuICAgIGNvbnN0IG9sZEV4cG9ydHMgPSBwYWNrYWdlSnNvbi5leHBvcnRzO1xuICAgIGNvbnN0IGV4cG9ydENvbmRpdGlvbnM6IFBhY2thZ2VKc29uLkV4cG9ydENvbmRpdGlvbnMgPSB7fTtcbiAgICBwYWNrYWdlSnNvbi5leHBvcnRzID0gZXhwb3J0Q29uZGl0aW9ucztcbiAgICBmb3IgKGNvbnN0IHNyY0ZvbGRlciBvZiBzcmNGb2xkZXJzKSB7XG4gICAgICBhd2FpdCBzZXRFeHBvcnQoeyBleHBvcnRDb25kaXRpb25zLCBpc1dpbGRjYXJkOiBmYWxzZSwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSk7XG4gICAgICBhd2FpdCBzZXRFeHBvcnQoeyBleHBvcnRDb25kaXRpb25zLCBpc1dpbGRjYXJkOiB0cnVlLCBzb3VyY2VDb25kaXRpb24sIHNyY0ZvbGRlciB9KTtcbiAgICB9XG5cbiAgICBpc0NoYW5nZWQgPSAhaXNEZWVwRXF1YWwob2xkRXhwb3J0cywgcGFja2FnZUpzb24uZXhwb3J0cyk7XG4gIH0pO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IGNoYW5nZWQgaW4gdGhlIGBlZGl0UGFja2FnZUpzb25gLCBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gIGlmIChpc0NoYW5nZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhY2thZ2UgZXhwb3J0cyBoYXZlIGNoYW5nZWQuIFBsZWFzZSByZXZpZXcgdGhlIGNoYW5nZXMgYW5kIGNvbW1pdCB0aGVtLicpO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGFuIGBpbmRleC50c2AgYmFycmVsIGluIGV2ZXJ5IHNvdXJjZSBmb2xkZXIgdGhhdCBoYXMgc29tZXRoaW5nIHRvIGV4cG9ydCwgcmUtZXhwb3J0aW5nIGVhY2ggbW9kdWxlIGFuZFxuICogZWFjaCBzdWItYmFycmVsIHVuZGVyIGl0cyBvd24gbmFtZS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhcnJlbHMgaGF2ZSBiZWVuIHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpYnJhcnlJbmRleCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZ2VuZXJhdGVJbmRleChSZXBvUGF0aHMuU3JjKTtcbn1cblxuLyoqXG4gKiBSdW5zIGVhY2ggbmFtZWQgbnBtIHNjcmlwdCB0aGUgcGFja2FnZSBkZWZpbmVzLCBpbiBvcmRlciwgc2tpcHBpbmcgdGhlIG9uZXMgaXQgZG9lcyBub3QgZGVmaW5lLlxuICpcbiAqIEBwYXJhbSBzdGVwcyAtIFRoZSBucG0gc2NyaXB0IG5hbWVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5IHN0ZXAgaGFzIHJ1bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkJ1aWxkU3RlcHMoc3RlcHM6IHJlYWRvbmx5IHN0cmluZ1tdID0gTElCUkFSWV9CVUlMRF9TVEVQUyk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbChzdGVwKTtcbiAgfVxufVxuXG4vKipcbiAqIEFkZHMgd2hhdCBhIGNvbnN1bWVyIG5lZWRzIGxvYWRlZCBmb3Igb25lIHN5bWJvbCBhIGRlY2xhcmF0aW9uIG5hbWVzLiBBIHN5bWJvbCBhbnkgRVMgbGliIGRlY2xhcmVzIG5lZWRzIG5vdGhpbmcsXG4gKiBiZWNhdXNlIG5vIGNvbnN1bWVyIGNvbmZsaWN0cyB3aXRoIHRob3NlIGxpYnMuIE90aGVyd2lzZSBlYWNoIGVudmlyb25tZW50IGxpYiB0aGF0IGRlY2xhcmVzIGl0IGFkZHMgaXRzZWxmLCBhbmRcbiAqIGZhaWxpbmcgdGhhdCBgQHR5cGVzL25vZGVgIGFkZHMgYG5vZGVgLiBBIHN5bWJvbCBkZWNsYXJlZCBpbiB0aGUgcGFja2FnZSdzIG93biBmaWxlcyBhZGRzIG5vdGhpbmc6IHRoZSBkZWNsYXJhdGlvblxuICogdGhhdCBob2xkcyBpdCBjYXJyaWVzIGl0cyBvd24gZGlyZWN0aXZlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHN5bWJvbCwgdGhlIHByb2dyYW0gaXQgd2FzIHJlc29sdmVkIGluLCBhbmQgdGhlIHNldHMgdG8gYWRkIHRvLlxuICovXG5mdW5jdGlvbiBhZGRFbnZpcm9ubWVudEdsb2JhbHMocGFyYW1zOiBBZGRFbnZpcm9ubWVudEdsb2JhbHNQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgeyBsaWJzLCBwcm9ncmFtLCBzeW1ib2wsIHR5cGVzIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGVudmlyb25tZW50TGliczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGlzTm9kZSA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygc3ltYm9sLmRlY2xhcmF0aW9ucyA/PyBbXSkge1xuICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBkZWNsYXJhdGlvbi5nZXRTb3VyY2VGaWxlKCk7XG4gICAgaWYgKHByb2dyYW0uaXNTb3VyY2VGaWxlRGVmYXVsdExpYnJhcnkoc291cmNlRmlsZSkpIHtcbiAgICAgIGNvbnN0IGxpYiA9IHRvTGliTmFtZShzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICAgIGlmICghaXNFbnZpcm9ubWVudExpYihsaWIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVudmlyb25tZW50TGlicy5wdXNoKGxpYik7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VGaWxlLmZpbGVOYW1lLmluY2x1ZGVzKE5PREVfVFlQRVNfUEFUSF9TRUdNRU5UKSkge1xuICAgICAgaXNOb2RlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoZW52aXJvbm1lbnRMaWJzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IGxpYiBvZiBlbnZpcm9ubWVudExpYnMpIHtcbiAgICAgIGxpYnMuYWRkKGxpYik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTm9kZSkge1xuICAgIHR5cGVzLmFkZCgnbm9kZScpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhsaWJzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtcbiAgICBsaWJzXG4gICAgICAubWFwKChsaWIpID0+IGAvLy8gJHtSRUZFUkVOQ0VfTElCX0RJUkVDVElWRX1cIiR7bGlifVwiIC8+YClcbiAgICAgIC5qb2luKCdcXG4nKVxuICB9XFxuYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXModHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVzLmxlbmd0aCA9PT0gMFxuICAgID8gJydcbiAgICA6IGAke1xuICAgICAgdHlwZXNcbiAgICAgICAgLm1hcCgodHlwZSkgPT4gYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiJHt0eXBlfVwiIC8+YClcbiAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgfVxcbmA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkTGlicmFyeUZvcm1hdChwYXJhbXM6IEJ1aWxkTGlicmFyeUZvcm1hdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGZvcm1hdCwgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGZvcm1hdCA9PT0gJ2NqcycgPyBSZXBvUGF0aHMuQ2pzRXh0ZW5zaW9uIDogUmVwb1BhdGhzLk1qc0V4dGVuc2lvbjtcbiAgY29uc3QgYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnMgPSB7XG4gICAgLy8gRXhwbGljaXQsIGJlY2F1c2UgZXNidWlsZCBvdGhlcndpc2UgdGFrZXMgdGhlIGZvbGRlciBpdHMgc2VydmljZSBwcm9jZXNzIHN0YXJ0ZWQgaW4uXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gZXNidWlsZCdzIG93biBvcHRpb24gbmFtZS5cbiAgICBhYnNXb3JraW5nRGlyOiBwcm9jZXNzLmN3ZCgpLFxuICAgIGJhbm5lcjoge1xuICAgICAganM6IExJQlJBUllfQkFOTkVSXG4gICAgfSxcbiAgICBidW5kbGU6IGZhbHNlLFxuICAgIGVudHJ5UG9pbnRzOiBsaWJGaWxlcyxcbiAgICBmb3JtYXQsXG4gICAgbG9nTGV2ZWw6ICdpbmZvJyxcbiAgICBvdXRkaXI6IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIGZvcm1hdCksXG4gICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICBwbHVnaW5zOiBbXG4gICAgICBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeShmb3JtYXQgPT09ICdlc20nKSxcbiAgICAgIGZpeEVzbVBsdWdpbigpLFxuICAgICAgY2hhbmdlRXh0ZW5zaW9uUGx1Z2luKGV4dGVuc2lvbilcbiAgICBdLFxuICAgIHNvdXJjZW1hcDogJ2lubGluZScsXG4gICAgdGFyZ2V0OiAnRVMyMDIyJyxcbiAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICB3cml0ZTogZmFsc2VcbiAgfTtcblxuICBjb25zdCBidWlsZENvbnRleHQgPSBhd2FpdCBjb250ZXh0KGJ1aWxkT3B0aW9ucyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgYnVpbGRDb250ZXh0LnJlYnVpbGQoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBidWlsZENvbnRleHQuZGlzcG9zZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZShwYXJhbXM6IEJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZVBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgZGVjbGFyYXRpb25GaWxlUGF0aCwgZXh0ZW5zaW9uLCBtb2R1bGVEaXJlY3RvcnkgfSA9IHBhcmFtcztcbiAgY29uc3QgbGlicmFyeUZpbGVQYXRoID0gam9pbihSZXBvUGF0aHMuRGlzdExpYiwgbW9kdWxlRGlyZWN0b3J5LCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgZXh0ZW5zaW9uKTtcbiAgbGV0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlTmF0aXZlKGRpcm5hbWUoZGVjbGFyYXRpb25GaWxlUGF0aCksIGxpYnJhcnlGaWxlUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gIH1cbiAgcmV0dXJuIGAvLy8gPHJlZmVyZW5jZSBwYXRoPVwiJHtyZWxhdGl2ZVBhdGh9XCIgLz5cXG5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0QWxsTGlicygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIC8vIFRoZSBSRVNPTFZFRCBvcHRpb25zLCBiZWNhdXNlIGEgcGFja2FnZSdzIGB0c2NvbmZpZy5qc29uYCBpbmhlcml0cyBgbGliYCBmcm9tIHRoZSBzaGFyZWQgYmFzZS4gVGhlIHJlc29sdmVkXG4gIC8vIG5hbWVzIGFyZSBmaWxlIG5hbWVzIChgbGliLmRvbS5pdGVyYWJsZS5kLnRzYCksIHNvIHRoZXkgYXJlIG1hcHBlZCBiYWNrIG9udG8gdGhlIG5hbWVzIGEgZGlyZWN0aXZlIHRha2VzLlxuICBjb25zdCB7IG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcoUmVwb1BhdGhzLlRzQ29uZmlnSnNvbik7XG4gIGNvbnN0IGxpYnMgPSBuZXcgU2V0KChvcHRpb25zLmxpYiA/PyBbXSkubWFwKChsaWIpID0+IHRvTGliTmFtZShsaWIpKSk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmICghZmlsZS5lbmRzV2l0aCgnLnRzJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZUNvbnRlbnQgPSByZWFkRmlsZVN5bmMoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSwgJ3V0Zi04Jyk7XG4gICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHdheXMgY2FwdHVyZXMgaXRzIG9uZSBncm91cCwgc28gbm8gZmFsbGJhY2sgZm9yIGEgbWlzc2luZyBvbmUgaXMgbmVlZGVkLlxuICAgIGZvciAoY29uc3QgWywgbGliXSBvZiBzb3VyY2VDb250ZW50Lm1hdGNoQWxsKFJFRkVSRU5DRV9MSUJfUkVHX0VYUCkpIHtcbiAgICAgIGxpYnMuYWRkKFN0cmluZyhsaWIpLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbLi4ubGlic10uc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0QWxsVHlwZXMoKTogc3RyaW5nW10ge1xuICBjb25zdCB7IG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcoUmVwb1BhdGhzLlRzQ29uZmlnSnNvbik7XG4gIHJldHVybiAob3B0aW9ucy50eXBlcyA/PyBbXSlcbiAgICAuZmlsdGVyKCh0eXBlKSA9PiBERUNMQVJBVElPTl9SRUZFUkVOQ0VfVFlQRVMuaGFzKHR5cGUpKVxuICAgIC5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXMocGFyYW1zOiBDb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzUGFyYW1zKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHsgYXZhaWxhYmxlVHlwZXMsIGRlY2xhcmF0aW9uRmlsZXMgfSA9IHBhcmFtcztcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbSh7XG4gICAgb3B0aW9uczogeyAuLi5vcHRpb25zLCBub0VtaXQ6IHRydWUgfSxcbiAgICByb290TmFtZXM6IGRlY2xhcmF0aW9uRmlsZXMubWFwKChmaWxlKSA9PiByZXNvbHZlTmF0aXZlKFJlcG9QYXRocy5TcmMsIGZpbGUpKVxuICB9KTtcbiAgY29uc3QgY2hlY2tlciA9IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKTtcbiAgY29uc3QgZGlyZWN0aXZlc0J5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGRlY2xhcmF0aW9uRmlsZXMpIHtcbiAgICAvLyBUaGUgcHJvZ3JhbSB3YXMgaGFuZGVkIGV2ZXJ5IG9uZSBvZiB0aGVzZSBhcyBhIHJvb3QgbmFtZSwgc28gZWFjaCBvbmUgaXMgaW4gaXQuXG4gICAgY29uc3Qgc291cmNlRmlsZSA9IGVuc3VyZU5vbk51bGxhYmxlKHByb2dyYW0uZ2V0U291cmNlRmlsZShyZXNvbHZlTmF0aXZlKFJlcG9QYXRocy5TcmMsIGZpbGUpKSk7XG4gICAgY29uc3QgbGlicyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHR5cGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmdW5jdGlvbiB2aXNpdChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgICBpZiAoaXNJZGVudGlmaWVyKG5vZGUpIHx8IGlzU3RyaW5nTGl0ZXJhbChub2RlKSkge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24obm9kZSk7XG4gICAgICAgIGlmIChzeW1ib2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFkZEVudmlyb25tZW50R2xvYmFscyh7IGxpYnMsIHByb2dyYW0sIHN5bWJvbDogcmVzb2x2ZUFsaWFzKGNoZWNrZXIsIHN5bWJvbCksIHR5cGVzIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpO1xuICAgIH1cbiAgICB2aXNpdChzb3VyY2VGaWxlKTtcblxuICAgIGNvbnN0IG5lZWRlZFR5cGVzID0gWy4uLnR5cGVzXS5maWx0ZXIoKHR5cGUpID0+IGF2YWlsYWJsZVR5cGVzLmluY2x1ZGVzKHR5cGUpKTtcbiAgICBpZiAobGlicy5zaXplID4gMCB8fCBuZWVkZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICBkaXJlY3RpdmVzQnlGaWxlLnNldChcbiAgICAgICAgZmlsZSxcbiAgICAgICAgKGxpYnMuc2l6ZSA+IDAgPyBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoWy4uLmxpYnNdLnNvcnQoKSkgOiAnJykgKyBidWlsZEFsbFJlZmVyZW5jZVR5cGVzRGlyZWN0aXZlcyhuZWVkZWRUeXBlcy5zb3J0KCkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaXJlY3RpdmVzQnlGaWxlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4KGZvbGRlcjogc3RyaW5nKTogUHJvbWlzZTxHZW5lcmF0ZUluZGV4UmVzdWx0PiB7XG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCByZWFkZGlyUG9zaXgoZm9sZGVyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IG1heWJlTGluZXMgPSBhd2FpdCBhc3luY01hcChkaXJlbnRzLCAoZGlyZW50KSA9PiBoYW5kbGVJbmRleERpcmVudChmb2xkZXIsIGRpcmVudCkpO1xuICBjb25zdCBsaW5lcyA9IG1heWJlTGluZXMuZmlsdGVyKChsaW5lKSA9PiBsaW5lICE9PSB1bmRlZmluZWQpO1xuXG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gR2VuZXJhdGVJbmRleFJlc3VsdC5Ta2lwcGVkO1xuICB9XG5cbiAgYXdhaXQgZ2VuZXJhdGUoam9pbihmb2xkZXIsIFJlcG9QYXRocy5JbmRleFRzKSwgbGluZXMpO1xuICByZXR1cm4gR2VuZXJhdGVJbmRleFJlc3VsdC5TdWNjZXNzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMaWJGaWxlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGxldCBmaWxlcyA9IGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZmlsZXMgPSBmaWxlcy5tYXAoKGZpbGUpID0+IG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSkpO1xuICByZXR1cm4gZmlsZXMuZmlsdGVyKChmaWxlKSA9PlxuICAgIGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5lbmRzV2l0aCgnLnRlc3QudHMnKVxuICAgICYmICFmaWxlLmluY2x1ZGVzKGAvJHtSZXBvUGF0aHMuVGVzdEhlbHBlcnN9L2ApXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUluZGV4RGlyZW50KGZvbGRlcjogc3RyaW5nLCBkaXJlbnQ6IERpcmVudCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmIChpc0V4Y2x1ZGVkRnJvbUluZGV4KGZvbGRlciwgZGlyZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBzb3VyY2VGaWxlOiBzdHJpbmc7XG4gIGxldCBuYW1lOiBzdHJpbmc7XG4gIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdlbmVyYXRlSW5kZXgoam9pbihmb2xkZXIsIGRpcmVudC5uYW1lKSk7XG4gICAgaWYgKHJlc3VsdCAhPT0gR2VuZXJhdGVJbmRleFJlc3VsdC5TdWNjZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNvdXJjZUZpbGUgPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oZGlyZW50Lm5hbWUsIFJlcG9QYXRocy5JbmRleFRzKSk7XG4gICAgbmFtZSA9IGRpcmVudC5uYW1lO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUoZGlyZW50Lm5hbWUpO1xuICAgIG5hbWUgPSBiYXNlbmFtZShkaXJlbnQubmFtZSwgZXh0ZW5zaW9uKTtcbiAgICBzb3VyY2VGaWxlID0gbm9ybWFsaXplSWZSZWxhdGl2ZShkaXJlbnQubmFtZSk7XG4gIH1cblxuICByZXR1cm4gYGV4cG9ydCAqIGFzICcke25hbWV9JyBmcm9tICcke3NvdXJjZUZpbGV9JztgO1xufVxuXG5mdW5jdGlvbiBpc0Vudmlyb25tZW50TGliKGxpYjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBFTlZJUk9OTUVOVF9MSUJfUFJFRklYRVMuc29tZSgocHJlZml4KSA9PiBsaWIuc3RhcnRzV2l0aChwcmVmaXgpKTtcbn1cblxuZnVuY3Rpb24gaXNFeGNsdWRlZEZpbGVOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gIW5hbWUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSB8fCBuYW1lLmVuZHNXaXRoKCcudGVzdC50cycpIHx8IG5hbWUgPT09ICdzZXR1cC50cycgfHwgbmFtZS5lbmRzV2l0aCgnLXNldHVwLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzRXhjbHVkZWRGcm9tSW5kZXgoZm9sZGVyOiBzdHJpbmcsIGRpcmVudDogRGlyZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IGV4Y2x1ZGVkTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1JlcG9QYXRocy5JbmRleFRzLCBSZXBvUGF0aHMuVHlwZXMsIFJlcG9QYXRocy5TdHlsZXMsIFJlcG9QYXRocy5UZXN0SGVscGVyc107XG4gIGNvbnN0IGlzRXhjbHVkZWRFbnRyeSA9IGV4Y2x1ZGVkTmFtZXMuaW5jbHVkZXMoZGlyZW50Lm5hbWUpIHx8IGRpcmVudC5uYW1lLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pIHx8IGZvbGRlci5zcGxpdCgnLycpLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIHJldHVybiBpc0V4Y2x1ZGVkRW50cnkgfHwgKGRpcmVudC5pc0ZpbGUoKSAmJiBpc0V4Y2x1ZGVkRmlsZU5hbWUoZGlyZW50Lm5hbWUpKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFsaWFzKGNoZWNrZXI6IFR5cGVDaGVja2VyLCBzeW1ib2w6IFRzU3ltYm9sKTogVHNTeW1ib2wge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZSAtLSBgU3ltYm9sRmxhZ3NgIGlzIGEgYml0IHNldC5cbiAgcmV0dXJuIChzeW1ib2wuZmxhZ3MgJiBTeW1ib2xGbGFncy5BbGlhcykgPT09IDAgPyBzeW1ib2wgOiBjaGVja2VyLmdldEFsaWFzZWRTeW1ib2woc3ltYm9sKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0RXhwb3J0KHBhcmFtczogU2V0RXhwb3J0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZCwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgaW1wb3J0UGF0aCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IHNyY0ZvbGRlcixcbiAgICByZXBsYWNlcjogUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIsXG4gICAgc2VhcmNoVmFsdWU6IFJlcG9QYXRocy5TcmNcbiAgfSk7XG4gIGNvbnN0IGNvbmRpdGlvblBhdGggPSBpc1dpbGRjYXJkID8gYCR7aW1wb3J0UGF0aH0vJHtSZXBvUGF0aHMuQW55fWAgOiBpbXBvcnRQYXRoO1xuICBjb25zdCBkbXRzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5Fc20sIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55RG10cyA6IFJlcG9QYXRocy5JbmRleERtdHMgfSk7XG4gIGNvbnN0IGRjdHNQYXRoID0gdG9EaXN0UGF0aCh7IGZvcm1hdDogUmVwb1BhdGhzLkNqcywgaW1wb3J0UGF0aCwgbmFtZTogaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlEY3RzIDogUmVwb1BhdGhzLkluZGV4RGN0cyB9KTtcbiAgY29uc3QgZG10c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRtdHNQYXRoKTtcbiAgY29uc3QgZGN0c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRjdHNQYXRoKTtcblxuICBpZiAoIWlzV2lsZGNhcmQgJiYgIWV4aXN0c1N5bmMoZGN0c1BhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaXNUeXBlc09ubHkgPSBpbXBvcnRQYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIGNvbnN0IG1qc1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuRXNtLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueU1qcyA6IFJlcG9QYXRocy5JbmRleE1qcyB9KTtcbiAgY29uc3QgY2pzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5DanMsIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55Q2pzIDogUmVwb1BhdGhzLkluZGV4Q2pzIH0pO1xuXG4gIGlmIChpc1R5cGVzT25seSkge1xuICAgIGV4cG9ydENvbmRpdGlvbnNbY29uZGl0aW9uUGF0aF0gPSB7XG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGhcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNvdXJjZVBhdGggPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgaW1wb3J0UGF0aCwgaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlUcyA6IFJlcG9QYXRocy5JbmRleFRzKSk7XG5cbiAgICBleHBvcnRDb25kaXRpb25zW2NvbmRpdGlvblBhdGhdID0ge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgICAvLyBGaXJzdCwgc28gaXQgd2lucyB3aGVyZXZlciBpdCBpcyBzZXQ6IGluc2lkZSB0aGUgcmVwb3NpdG9yeSwgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LlxuICAgICAgLi4uKHNvdXJjZUNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkICYmIHsgW3NvdXJjZUNvbmRpdGlvbl06IHNvdXJjZVBhdGggfSksXG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoLFxuICAgICAgICBkZWZhdWx0OiBtanNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGgsXG4gICAgICAgIGRlZmF1bHQ6IGNqc1BhdGhcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpbXBvcnRQYXRoID09PSBSZXBvUGF0aHMuQ3VycmVudEZvbGRlciBhcyBzdHJpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWlzV2lsZGNhcmQpIHtcbiAgICBhd2FpdCB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihcbiAgICAgIGltcG9ydFBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzOiByZWxhdGl2ZShpbXBvcnRQYXRoLCBkY3RzUGF0aCkgfVxuICAgICAgICA6IHsgbWFpbjogcmVsYXRpdmUoaW1wb3J0UGF0aCwgY2pzUGF0aCksIG1vZHVsZTogcmVsYXRpdmUoaW1wb3J0UGF0aCwgbWpzUGF0aCksIHR5cGU6ICdtb2R1bGUnLCB0eXBlczogcmVsYXRpdmUoaW1wb3J0UGF0aCwgZGN0c1BhdGgpIH1cbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoZGN0c0ZvbGRlclBhdGgpKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgcGFja2FnZUpzb25Gb2xkZXJQYXRoID0gam9pbihpbXBvcnRQYXRoLCBuYW1lKTtcbiAgICBjb25zdCB0eXBlcyA9IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkY3RzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSk7XG4gICAgYXdhaXQgd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oXG4gICAgICBwYWNrYWdlSnNvbkZvbGRlclBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgbWFpbjogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRjdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLkNqc0V4dGVuc2lvbikpLFxuICAgICAgICAgIG1vZHVsZTogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRtdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLk1qc0V4dGVuc2lvbikpLFxuICAgICAgICAgIHR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgIHR5cGVzXG4gICAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ3RzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGNvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdmcm9tIFxcJyQ8SW1wb3J0UGF0aD4uY2pzXFwnOycsXG4gICAgc2VhcmNoVmFsdWU6IFNUQVRJQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQoJDxRdW90ZT4kPEltcG9ydFBhdGg+LmNqcyQ8UXVvdGU+KScsXG4gICAgc2VhcmNoVmFsdWU6IERZTkFNSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG5cbiAgLy8gQSBgLmQuY3RzYCBmaWxlIGlzIGEgQ29tbW9uSlMgbW9kdWxlLiBUeXBlLW9ubHkgaW1wb3J0cyBvZiBhIGJhcmUgc3BlY2lmaWVyIHJlc29sdmluZyB0byBhblxuICAvLyBFU00tb25seSBwYWNrYWdlIG5lZWQgYSBgcmVzb2x1dGlvbi1tb2RlYCBhdHRyaWJ1dGUsIGVsc2UgYHRzY2AgcmVwb3J0cyBUUzE1NDEgLyBUUzE1NDIuXG4gIC8vIFBhc3NpbmcgYCdpbXBvcnQnYCBpcyB2YWxpZCBmb3IgQ29tbW9uSlMgdGFyZ2V0cyB0b28sIHNvIGV2ZXJ5IGJhcmUgc3BlY2lmaWVyIHJlY2VpdmVzIGl0LlxuICAvLyBUaGUgRVNNIGAuZC5tdHNgIG5lZWRzIG5vIHN1Y2ggYXR0cmlidXRlLCBzbyB0aGlzIHRyYW5zZm9ybSBydW5zIG9uIENvbW1vbkpTIGNvbnRlbnQgb25seS5cbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQgdHlwZSAkPENsYXVzZT4gZnJvbSBcXCckPFNwZWNpZmllcj5cXCcgd2l0aCB7IFxcJ3Jlc29sdXRpb24tbW9kZVxcJzogXFwnaW1wb3J0XFwnIH07JyxcbiAgICBzZWFyY2hWYWx1ZTogQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY3RzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydChcIiQ8U3BlY2lmaWVyPlwiLCB7IHdpdGg6IHsgXFwncmVzb2x1dGlvbi1tb2RlXFwnOiBcXCdpbXBvcnRcXCcgfSB9KScsXG4gICAgc2VhcmNoVmFsdWU6IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvRGlzdFBhdGgocGFyYW1zOiBUb0Rpc3RQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgcGFyYW1zLmZvcm1hdCwgcGFyYW1zLmltcG9ydFBhdGgsIHBhcmFtcy5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHRvTGliTmFtZShsaWJGaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQSBsaWIgYSBwYWNrYWdlIHJlcGxhY2VkIChgQHR5cGVzY3JpcHQvbGliLWRvbWAsIGBAdHlwZXNjcmlwdC9saWItZG9tL2l0ZXJhYmxlLmQudHNgKSBpcyBuYW1lZCBieSBpdHMgcGF0aCwgbm90IGJ5XG4gIC8vIGl0cyBmaWxlIG5hbWUsIHdoaWNoIGlzIGBpbmRleC5kLnRzYCBmb3IgdGhlIGxpYidzIHJvb3QuXG4gIGNvbnN0IHJlcGxhY2VtZW50TWF0Y2ggPSBMSUJfUkVQTEFDRU1FTlRfUkVHX0VYUC5leGVjKGxpYkZpbGVQYXRoKTtcbiAgaWYgKHJlcGxhY2VtZW50TWF0Y2g/Lmdyb3VwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHdheXMgY2FwdHVyZXMgYm90aCBncm91cHMuXG4gICAgY29uc3QgbGliID0gU3RyaW5nKHJlcGxhY2VtZW50TWF0Y2guZ3JvdXBzWydMaWInXSk7XG4gICAgY29uc3Qgc3ViTGliID0gU3RyaW5nKHJlcGxhY2VtZW50TWF0Y2guZ3JvdXBzWydTdWJMaWInXSk7XG4gICAgcmV0dXJuIChzdWJMaWIgPT09ICdpbmRleCcgPyBsaWIgOiBgJHtsaWJ9LiR7c3ViTGliLnJlcGxhY2VBbGwoJy8nLCAnLicpfWApLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcmV0dXJuIGJhc2VuYW1lKGxpYkZpbGVQYXRoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15saWJcXC4vLCAnJykucmVwbGFjZSgvXFwuZFxcLnRzJC8sICcnKTtcbn1cblxuZnVuY3Rpb24gdG9NdHNDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG10c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjb250ZW50LFxuICAgIHJlcGxhY2VyOiAnZnJvbSBcXCckPEltcG9ydFBhdGg+Lm1qc1xcJzsnLFxuICAgIHNlYXJjaFZhbHVlOiBTVEFUSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG4gIHJldHVybiByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBtdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0KCQ8UXVvdGU+JDxJbXBvcnRQYXRoPi5tanMkPFF1b3RlPiknLFxuICAgIHNlYXJjaFZhbHVlOiBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihmb2xkZXI6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG1rZGlyKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlSnNvbihqb2luKGZvbGRlciwgUmVwb1BhdGhzLlBhY2thZ2VKc29uKSwgcGFja2FnZUpzb24pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQSxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLG1CQUFtQjtBQUM1QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGtCQUFrQjtBQUMzQixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGVBQWU7QUFDeEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFLFlBQVk7QUFBQSxFQUNaLFdBQVc7QUFBQSxPQUNOO0FBQ1AsT0FBTyxhQUFhO0FBQ3BCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBSVAsU0FBUyxrQkFBa0I7QUFDM0IsU0FBUyw2QkFBNkI7QUFDdEMsU0FBUyxvQkFBb0I7QUFDN0IsU0FBUyx3QkFBd0I7QUFDakMsU0FBUyxxQkFBcUI7QUFDOUIsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyxvQkFBb0I7QUFDN0IsU0FBUyxpQkFBaUI7QUFDMUIsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUywwQkFBMEI7QUFDbkMsU0FBUyxpQkFBaUI7QUFDMUIsU0FBUyxvQkFBb0I7QUFLdEIsTUFBTSxpQkFBaUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVN2QixNQUFNLHNCQUF5QztBQUFBLEVBQ3BEO0FB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
529
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWJyYXJ5LWJ1aWxkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYnVpbGQgcGlwZWxpbmUgb2YgYSBUeXBlU2NyaXB0IExJQlJBUlkgcGFja2FnZTogb25lIGBkaXN0L2xpYi97Y2pzLGVzbX1gIHRyZWUgb2YgdW5idW5kbGVkIG1vZHVsZXMgYmVzaWRlIGl0c1xuICogYC5kLmN0c2AgLyBgLmQubXRzYCBkZWNsYXJhdGlvbnMsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCBhbmQgdGhlIGdlbmVyYXRlZCBgcGFja2FnZS5qc29uYCBgZXhwb3J0c2AgbWFwLlxuICpcbiAqIEVhY2ggc3RlcCB3b3JrcyBvbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciwgd2hpY2ggaXMgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQuIEEgcmVwb3NpdG9yeSdzXG4gKiBgc2NyaXB0cy9idWlsZC0qLnRzYCBlbnRyeSBwb2ludHMgYXJlIHRoaW4gYHdyYXBDbGlUYXNrYCB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBhbmQgaXRzIGBidWlsZGAgc2NyaXB0XG4gKiBydW5zIHRoZW0gaW4gb3JkZXIgdGhyb3VnaCB7QGxpbmsgcnVuQnVpbGRTdGVwc30uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB0eXBlIHsgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFN5bWJvbCBhcyBUc1N5bWJvbCxcbiAgVHlwZUNoZWNrZXJcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzeW5jTWFwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGlzRGVlcEVxdWFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbm9ybWFsaXplSWZSZWxhdGl2ZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgcmVsYXRpdmUgYXMgcmVsYXRpdmVOYXRpdmUsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZU5hdGl2ZVxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVByb2dyYW0sXG4gIGZvckVhY2hDaGlsZCxcbiAgaXNJZGVudGlmaWVyLFxuICBpc1N0cmluZ0xpdGVyYWwsXG4gIFN5bWJvbEZsYWdzXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQgeyBidWlsZENsZWFuIH0gZnJvbSAnLi9idWlsZC50cyc7XG5pbXBvcnQgeyBjaGFuZ2VFeHRlbnNpb25QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9jaGFuZ2UtZXh0ZW5zaW9uLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBmaXhFc21QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9maXgtZXNtLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBwcmVwcm9jZXNzUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvcHJlcHJvY2Vzcy1wbHVnaW4udHMnO1xuaW1wb3J0IHsgcGFyc2VUc0NvbmZpZyB9IGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyB3cml0ZUpzb24gfSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICcuL25wbS1ydW4udHMnO1xuaW1wb3J0IHsgZWRpdFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRvb2xDb21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuaW1wb3J0IHsgUmVwb1BhdGhzIH0gZnJvbSAnLi9yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGV4ZWNGcm9tUm9vdCB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogVGhlIGJhbm5lciBldmVyeSBlbWl0dGVkIGxpYnJhcnkgbW9kdWxlIG9wZW5zIHdpdGguXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX0JBTk5FUiA9IGAvKlxuVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgRVNCVUlMRFxuaWYgeW91IHdhbnQgdG8gdmlldyB0aGUgc291cmNlLCBwbGVhc2UgdmlzaXQgdGhlIGdpdGh1YiByZXBvc2l0b3J5IG9mIHRoaXMgcGx1Z2luXG4qL1xuYDtcblxuLyoqXG4gKiBUaGUgc3RlcHMgb2YgYSBsaWJyYXJ5IGJ1aWxkLCBpbiB0aGUgb3JkZXIge0BsaW5rIHJ1bkJ1aWxkU3RlcHN9IHJ1bnMgdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IExJQlJBUllfQlVJTERfU1RFUFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnYnVpbGQ6Y2xlYW4nLFxuICAnYnVpbGQ6Z2VuZXJhdGUtaW5kZXgnLFxuICAnYnVpbGQ6Y29tcGlsZScsXG4gICdidWlsZDp0eXBlcycsXG4gICdidWlsZDp2YWxpZGF0ZS1kZWNsYXJhdGlvbnMnLFxuICAnYnVpbGQ6bGliJyxcbiAgJ2J1aWxkOmdlbmVyYXRlLWV4cG9ydHMnXG5dO1xuXG4vKipcbiAqIFRoZSBleHBvcnQgY29uZGl0aW9uIGEgcmVwb3NpdG9yeSBob2xkaW5nIHNldmVyYWwgcGFja2FnZXMgbWFwcyBldmVyeSBzdWJwYXRoIG9udG8gaXRzIFR5cGVTY3JpcHQgc291cmNlIHdpdGgsIHNvXG4gKiBhIHBhY2thZ2UgdGhlcmUgY2FuIGltcG9ydCBhIHNpYmxpbmcgcGFja2FnZSdzIHNvdXJjZSBiZWZvcmUgYW55dGhpbmcgaXMgYnVpbHQuIFBhc3MgaXQgdG9cbiAqIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzfSB0aHJvdWdoIHtAbGluayBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucy5zb3VyY2VDb25kaXRpb259LlxuICovXG5leHBvcnQgY29uc3QgU09VUkNFX0NPTkRJVElPTiA9ICdAbW5hb3Vtb3Yvc291cmNlJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgYnVpbGRMaWJyYXJ5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZExpYnJhcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHByZXByb2Nlc3MgcGx1Z2luIGZvciBvbmUgb3V0cHV0IGZvcm1hdC4gRGVmYXVsdHMgdG8gdGhlIGdlbmVyaWMgb25lLCB3aGljaCBjYXJyaWVzIG5vXG4gICAqIGVudmlyb25tZW50LXNwZWNpZmljIGByZXF1aXJlYCBwYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5PzogKGlzRXNtOiBib29sZWFuKSA9PiBQbHVnaW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdlbmVyYXRlTGlicmFyeUV4cG9ydHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIEVudHJpZXMgZm9yIGZpbGVzIHRoYXQgYXJlIG5vdCBidWlsdCBmcm9tIGEgc291cmNlIGZvbGRlciAoYSBmb2xkZXIgb2Ygc2hhcmVkIGB0c2NvbmZpZ2AgcHJlc2V0cywgYW1iaWVudCBgLmQudHNgXG4gICAqIGZpbGVzKSwga2V5ZWQgYnkgc3VicGF0aC4gVGhleSBnbyBpbnRvIHRoZSBtYXAgYWZ0ZXIgdGhlIGdlbmVyYXRlZCBlbnRyaWVzLCBhcyBnaXZlbiwgYW5kIGNvdW50IHRvd2FyZCBpdHMgY2hhbmdlXG4gICAqIGNoZWNrOyBubyBzdWJwYXRoIHN0dWIgaXMgd3JpdHRlbiBmb3IgdGhlbS4gQSBrZXkgYSBzb3VyY2UgZm9sZGVyIGFscmVhZHkgZ2VuZXJhdGVzIHRocm93cy5cbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxFeHBvcnRzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUGFja2FnZUpzb24uRXhwb3J0cz4+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBbiBleHBvcnQgY29uZGl0aW9uIHRvIHB1dCBmaXJzdCBpbiBldmVyeSBlbnRyeSwgbWFwcGluZyB0aGUgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZS4gT25seSBhXG4gICAqIHJlcG9zaXRvcnkgaG9sZGluZyBzZXZlcmFsIHBhY2thZ2VzIHRoYXQgaW1wb3J0IGVhY2ggb3RoZXIgbmVlZHMgb25lOyBub3RoaW5nIG91dHNpZGUgaXQgc2V0cyB0aGUgY29uZGl0aW9uLCBhbmRcbiAgICogdGhlIHNvdXJjZXMgaXQgcG9pbnRzIGF0IGRvIG5vdCBzaGlwLCBzbyB0aGUgcHVibGlzaCBoYXMgdG8gc3RyaXAgaXQgYWdhaW4uIE9taXR0ZWQsIHRoZSBtYXAgaGFzIG5vbmUuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VDb25kaXRpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTW9kdWxlRm9ybWF0ID0gJ2NqcycgfCAnZXNtJztcblxuY29uc3QgREVDTEFSQVRJT05fUkVGRVJFTkNFX1RZUEVTID0gbmV3IFNldChbJ25vZGUnXSk7XG5cbi8vIFRoZSBsaWJzIHRoYXQgZGVzY3JpYmUgYSBob3N0J3MgZ2xvYmFscyByYXRoZXIgdGhhbiB0aGUgbGFuZ3VhZ2UsIHdoaWNoIGNvbnN1bWVycyBjb25mbGljdCBvdmVyLiBFYWNoIGRlY2xhcmF0aW9uXG4vLyBnZXRzIHRoZSBvbmVzIGl0IHVzZXM7IGV2ZXJ5IG90aGVyIGxpYiBpcyBzaGFyZWQgdGhyb3VnaCBgbGlicmFyeS1yZWZlcmVuY2VzYC5cbmNvbnN0IEVOVklST05NRU5UX0xJQl9QUkVGSVhFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbJ2RvbScsICdzY3JpcHRob3N0JywgJ3dlYndvcmtlciddO1xuY29uc3QgTk9ERV9UWVBFU19QQVRIX1NFR01FTlQgPSAnL25vZGVfbW9kdWxlcy9AdHlwZXMvbm9kZS8nO1xuY29uc3QgTElCX1JFUExBQ0VNRU5UX1JFR19FWFAgPSAvXFwvbm9kZV9tb2R1bGVzXFwvQHR5cGVzY3JpcHRcXC9saWItKD88TGliPlteL10rKVxcLyg/PFN1YkxpYj4uKylcXC5kXFwudHMkLztcblxuLy8gVGhlIGRlY2xhcmF0aW9uIHRoYXQgY2FycmllcyBvbmx5IHRoZSBgbGliYCBhbmQgYHR5cGVzYCByZWZlcmVuY2VzLiBFdmVyeSBkZWNsYXJhdGlvbiBidXQgdGhlIHJvb3Qgb25lIHJlZmVyZW5jZXNcbi8vIGl0LCByYXRoZXIgdGhhbiB0aGUgcm9vdCBiYXJyZWwsIHdoaWNoIHdvdWxkIGxvYWQgZXZlcnkgbW9kdWxlIG9mIHRoZSBwYWNrYWdlLCBvcHRpb25hbCBwZWVycycgdHlwZXMgaW5jbHVkZWQuXG5jb25zdCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FID0gJ2xpYnJhcnktcmVmZXJlbmNlcyc7XG4vLyBTcGVsbGVkIGFwYXJ0IG9uIHB1cnBvc2U6IHtAbGluayBjb2xsZWN0QWxsTGlic30gc2NhbnMgZXZlcnkgc291cmNlIGZpbGUgb2YgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQgZm9yIHRoZVxuLy8gZGlyZWN0aXZlLCB0aGlzIG9uZSBpbmNsdWRlZCwgc28gYSBsaXRlcmFsIG9uZSBoZXJlIHdvdWxkIGJlIHJlYWQgYXMgYSBsaWIgdGhpcyBwYWNrYWdlIG5lZWRzLlxuY29uc3QgUkVGRVJFTkNFX0xJQl9ESVJFQ1RJVkUgPSBbJzxyZWZlcmVuY2UnLCAnbGliPSddLmpvaW4oJyAnKTtcbmNvbnN0IFJFRkVSRU5DRV9MSUJfUkVHX0VYUCA9IC9cXC9cXC9cXC8gPHJlZmVyZW5jZSBsaWI9XCIoPzxMaWI+W15cIl0rKVwiIFxcLz4vZ207XG5cbi8vIEEgYmFyZS1zcGVjaWZpZXIgKG5vbi1yZWxhdGl2ZSkgdHlwZS1vbmx5IGltcG9ydCwgZS5nLiBgaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztgLlxuY29uc3QgQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQID0gL15pbXBvcnQgdHlwZSAoPzxDbGF1c2U+Lis/KSBmcm9tICcoPzxTcGVjaWZpZXI+W14uJ11bXiddKiknOyQvZ207XG5cbi8vIEEgYmFyZS1zcGVjaWZpZXIgKG5vbi1yZWxhdGl2ZSkgaW5saW5lIGltcG9ydCB0eXBlIG5vZGUsIGUuZy4gYGltcG9ydChcInR5cGUtZmVzdFwiKS5Qcm9taXNhYmxlYC5cbmNvbnN0IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFAgPSAvaW1wb3J0XFwoXCIoPzxTcGVjaWZpZXI+W14uXCJdW15cIl0qKVwiXFwpL2c7XG5cbmNvbnN0IFNUQVRJQ19JTVBPUlRfUkVHX0VYUCA9IC9mcm9tICcoPzxJbXBvcnRQYXRoPi4rPylcXC50cyc7L2dtO1xuXG4vLyBJbmxpbmUgaW1wb3J0LXR5cGUgbm9kZXMgKGB0eXBlb2YgaW1wb3J0KCcuL2Zvby50cycpYCkgcHJlc2VydmUgdGhlIHNvdXJjZSBxdW90ZSBzdHlsZS5cbi8vIEhhbmQtYXV0aG9yZWQgYC5kLnRzYCBmaWxlcyBlbWl0IHNpbmdsZSBxdW90ZXM7IHRzYy1nZW5lcmF0ZWQgZGVjbGFyYXRpb25zIGVtaXQgZG91YmxlIHF1b3Rlcy5cbi8vIENhcHR1cmUgdGhlIHF1b3RlIGFuZCByZXVzZSBpdCBpbiB0aGUgcmVwbGFjZW1lbnQgc28gYm90aCBzdHlsZXMgYXJlIHJld3JpdHRlbi5cbmNvbnN0IERZTkFNSUNfSU1QT1JUX1JFR19FWFAgPSAvaW1wb3J0XFwoKD88UXVvdGU+WydcIl0pKD88SW1wb3J0UGF0aD4uKz8pXFwudHNcXGs8UXVvdGU+XFwpL2dtO1xuXG5lbnVtIEdlbmVyYXRlSW5kZXhSZXN1bHQge1xuICBTa2lwcGVkID0gJ3NraXBwZWQnLFxuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnXG59XG5cbmludGVyZmFjZSBBZGRFbnZpcm9ubWVudEdsb2JhbHNQYXJhbXMge1xuICByZWFkb25seSBsaWJzOiBTZXQ8c3RyaW5nPjtcbiAgcmVhZG9ubHkgcHJvZ3JhbTogUHJvZ3JhbTtcbiAgcmVhZG9ubHkgc3ltYm9sOiBUc1N5bWJvbDtcbiAgcmVhZG9ubHkgdHlwZXM6IFNldDxzdHJpbmc+O1xufVxuXG5pbnRlcmZhY2UgQnVpbGRMaWJyYXJ5Rm9ybWF0UGFyYW1zIHtcbiAgcmVhZG9ubHkgZm9ybWF0OiBNb2R1bGVGb3JtYXQ7XG4gIHJlYWRvbmx5IGxpYkZpbGVzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgcHJlcHJvY2Vzc1BsdWdpbkZhY3Rvcnk6IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlUGFyYW1zIHtcbiAgcmVhZG9ubHkgZGVjbGFyYXRpb25GaWxlUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBleHRlbnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kdWxlRGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXZhaWxhYmxlVHlwZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBkZWNsYXJhdGlvbkZpbGVzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNldEV4cG9ydFBhcmFtcyB7XG4gIHJlYWRvbmx5IGV4cG9ydENvbmRpdGlvbnM6IFBhY2thZ2VKc29uLkV4cG9ydENvbmRpdGlvbnM7XG4gIHJlYWRvbmx5IGlzV2lsZGNhcmQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNvdXJjZUNvbmRpdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBzcmNGb2xkZXI6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFRvRGlzdFBhdGhQYXJhbXMge1xuICByZWFkb25seSBmb3JtYXQ6IHN0cmluZztcbiAgcmVhZG9ubHkgaW1wb3J0UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBldmVyeXRoaW5nIGFuIGVhcmxpZXIgYnVpbGQgbGVmdDogYGRpc3QvYCwgdGhlIGdlbmVyYXRlZCBgaW5kZXgudHNgIGJhcnJlbHMsIHRoZSBgLmQudHNgIGZpbGVzIGB0c2NgIHdyb3RlXG4gKiBiZXNpZGUgdGhlIHNvdXJjZXMgKGhhbmQtYXV0aG9yZWQgb25lcyB1bmRlciBgQHR5cGVzYCBzdGF5KSwgYW5kIHRoZSBwZXItc3VicGF0aCBgcGFja2FnZS5qc29uYCBzdHVicy5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gZXZlcnl0aGluZyBoYXMgYmVlbiByZW1vdmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDbGVhbkxpYnJhcnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGJ1aWxkQ2xlYW4oKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmIChiYXNlbmFtZShmaWxlKSA9PT0gUmVwb1BhdGhzLkluZGV4VHMgYXMgc3RyaW5nKSB7XG4gICAgICBhd2FpdCBybShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpKTtcbiAgICB9XG5cbiAgICBpZiAoZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5zcGxpdCgnLycpLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcykpIHtcbiAgICAgIGF3YWl0IHJtKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSkpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pKSB7XG4gICAgaWYgKChiYXNlbmFtZShmaWxlKSAhPT0gUmVwb1BhdGhzLlBhY2thZ2VKc29uIGFzIHN0cmluZykgfHwgKGZpbGUgPT09IFJlcG9QYXRocy5QYWNrYWdlSnNvbiBhcyBzdHJpbmcpIHx8IGZpbGUuc3RhcnRzV2l0aChSZXBvUGF0aHMuTm9kZU1vZHVsZXMpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBhd2FpdCBybShmaWxlKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBldmVyeSBzb3VyY2UgbW9kdWxlLCB1bmJ1bmRsZWQsIGludG8gYGRpc3QvbGliL2Nqc2AgKGAuY2pzYCkgYW5kIGBkaXN0L2xpYi9lc21gIChgLm1qc2ApLlxuICpcbiAqIFRoZSBvdXRwdXQgZm9sZGVycyBtdXN0IGFscmVhZHkgZXhpc3Q7IHtAbGluayBidWlsZExpYnJhcnlUeXBlc30gY3JlYXRlcyB0aGVtLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGJ1aWxkIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYm90aCBmb3JtYXRzIGhhdmUgYmVlbiBidWlsdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkTGlicmFyeShvcHRpb25zOiBCdWlsZExpYnJhcnlPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSA9IChpc0VzbTogYm9vbGVhbik6IFBsdWdpbiA9PiBwcmVwcm9jZXNzUGx1Z2luKHsgaXNFc20gfSkgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxpYkZpbGVzID0gYXdhaXQgZ2V0TGliRmlsZXMoKTtcbiAgYXdhaXQgYnVpbGRMaWJyYXJ5Rm9ybWF0KHsgZm9ybWF0OiAnY2pzJywgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0pO1xuICBhd2FpdCBidWlsZExpYnJhcnlGb3JtYXQoeyBmb3JtYXQ6ICdlc20nLCBsaWJGaWxlcywgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgfSk7XG59XG5cbi8qKlxuICogRW1pdHMgdGhlIGRlY2xhcmF0aW9ucyB3aXRoIGB0c2MgLS1wcm9qZWN0IC4vdHNjb25maWcudHlwZXMuanNvbmAsIHRoZW4gY29waWVzIGVhY2ggb25lIGludG8gYGRpc3QvbGliYCB0d2ljZTogYXMgYVxuICogYC5kLmN0c2Agd2hvc2UgcmVsYXRpdmUgaW1wb3J0cyBuYW1lIGAuY2pzYCBmaWxlcyBhbmQgd2hvc2UgYmFyZSB0eXBlIGltcG9ydHMgY2FycnkgYHJlc29sdXRpb24tbW9kZTogaW1wb3J0YCwgYW5kXG4gKiBhcyBhIGAuZC5tdHNgIHdob3NlIHJlbGF0aXZlIGltcG9ydHMgbmFtZSBgLm1qc2AgZmlsZXMuXG4gKlxuICogVGhlIGxpYnJhcnkncyByb290IGRlY2xhcmF0aW9uIChgbGlicmFyeS50c2Agd2hlcmUgdGhlIHBhY2thZ2UgaGFzIG9uZSwgb3RoZXJ3aXNlIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCkgY2Fycmllc1xuICogZXZlcnkgYGxpYmAgYW5kIGB0eXBlc2AgcmVmZXJlbmNlIHRoZSBwYWNrYWdlIG5lZWRzLiBFdmVyeSBvdGhlciBkZWNsYXJhdGlvbiByZWZlcmVuY2VzIGEgYGxpYnJhcnktcmVmZXJlbmNlc2BcbiAqIGRlY2xhcmF0aW9uIGJlc2lkZSBpdCBieSBwYXRoLCBuZXZlciB0aGUgcm9vdDogdGhlIHJvb3QgYmFycmVsIHJlLWV4cG9ydHMgZXZlcnkgbW9kdWxlLCBzbyByZWZlcmVuY2luZyBpdCBtYWRlIGVhY2hcbiAqIHN1YnBhdGggbG9hZCB0aGUgd2hvbGUgcGFja2FnZSwgYW5kIGEgY29uc3VtZXIgdHlwZS1jaGVja2luZyB3aXRoIGBza2lwTGliQ2hlY2s6IGZhbHNlYCB0aGVuIG5lZWRlZCBldmVyeSBvcHRpb25hbFxuICogcGVlciBpbnN0YWxsZWQuXG4gKlxuICogYGxpYnJhcnktcmVmZXJlbmNlc2AgY2FycmllcyBvbmx5IHRoZSBsaWJzIHRoYXQgZGVzY3JpYmUgdGhlIGxhbmd1YWdlIChgZXMyMDIyYCwgYGVzbmV4dC5kaXNwb3NhYmxlYCksIHdoaWNoIG5vXG4gKiBjb25zdW1lciBjb25mbGljdHMgd2l0aC4gVGhlIG9uZXMgdGhhdCBkZXNjcmliZSBhIGhvc3QgKGBkb21gLCBgZG9tLml0ZXJhYmxlYCwgYHdlYndvcmtlcmApIGFuZCBgdHlwZXM9XCJub2RlXCJgIGdvXG4gKiBvbmx5IGludG8gdGhlIGRlY2xhcmF0aW9ucyB0aGF0IG5hbWUgb25lIG9mIHRoZWlyIGdsb2JhbHMsIGZvdW5kIGJ5IHJlc29sdmluZyBldmVyeSBuYW1lIGluIHRoZSBlbWl0dGVkXG4gKiBkZWNsYXJhdGlvbnMgd2l0aCB0aGUgdHlwZSBjaGVja2VyLiBPdGhlcndpc2UgYSBicm93c2VyIGNvbnN1bWVyIG9mIGEgcHVyZSBzdWJwYXRoIGdvdCBhbGwgb2YgYEB0eXBlcy9ub2RlYCwgYW5kIGl0c1xuICogYHNldFRpbWVvdXRgIHJldHVybmVkIGBOb2RlSlMuVGltZW91dGAuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkZWNsYXJhdGlvbnMgaGF2ZSBiZWVuIHdyaXR0ZW4uXG4gKiBAdGhyb3dzIElmIGEgc291cmNlIG1vZHVsZSBpcyBuYW1lZCBgbGlicmFyeS1yZWZlcmVuY2VzYCwgd2hpY2ggd291bGQgY29sbGlkZSB3aXRoIHRoZSBnZW5lcmF0ZWQgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnlUeXBlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGV4aXN0c1N5bmMoam9pbihSZXBvUGF0aHMuU3JjLCBgJHtMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FfSR7UmVwb1BhdGhzLlRzRXh0ZW5zaW9ufWApKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgc3JjLyR7TElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRX0ke1JlcG9QYXRocy5Uc0V4dGVuc2lvbn0gY29sbGlkZXMgd2l0aCB0aGUgZ2VuZXJhdGVkIGRlY2xhcmF0aW9uIG9mIHRoZSBzYW1lIG5hbWUuYCk7XG4gIH1cblxuICBhd2FpdCBleGVjRnJvbVJvb3QoWy4uLnJlc29sdmVUb29sQ29tbWFuZCh7IHRvb2w6ICd0c2MnIH0pLCAnLS1wcm9qZWN0JywgJy4vdHNjb25maWcudHlwZXMuanNvbiddKTtcblxuICBjb25zdCBsaWJyYXJ5RmlsZU5hbWUgPSBleGlzdHNTeW5jKGpvaW4oUmVwb1BhdGhzLlNyYywgJ2xpYnJhcnkudHMnKSkgPyAnbGlicmFyeScgOiAnaW5kZXgnO1xuICBjb25zdCBhbGxMaWJzID0gYXdhaXQgY29sbGVjdEFsbExpYnMoKTtcbiAgY29uc3QgYWxsVHlwZXMgPSBjb2xsZWN0QWxsVHlwZXMoKTtcbiAgY29uc3QgZGlyZWN0aXZlcyA9IGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhhbGxMaWJzKSArIGJ1aWxkQWxsUmVmZXJlbmNlVHlwZXNEaXJlY3RpdmVzKGFsbFR5cGVzKTtcbiAgLy8gT25seSB0aGUgbGlicyBubyBjb25zdW1lciBjb25mbGljdHMgd2l0aC4gVGhlIGVudmlyb25tZW50IGdsb2JhbHMgZ28gdG8gdGhlIGRlY2xhcmF0aW9ucyB0aGF0IHVzZSB0aGVtLlxuICBjb25zdCBzaGFyZWREaXJlY3RpdmVzID0gYnVpbGRBbGxSZWZlcmVuY2VMaWJEaXJlY3RpdmVzKGFsbExpYnMuZmlsdGVyKChsaWIpID0+ICFpc0Vudmlyb25tZW50TGliKGxpYikpKTtcblxuICBhd2FpdCBta2Rpcihqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IG1rZGlyKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20pLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5DanMsIExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgKyBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbiksIHNoYXJlZERpcmVjdGl2ZXMpO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkVzbSwgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSArIFJlcG9QYXRocy5EbXRzRXh0ZW5zaW9uKSwgc2hhcmVkRGlyZWN0aXZlcyk7XG5cbiAgY29uc3Qgc3JjRmlsZXMgPSBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGRlY2xhcmF0aW9uRmlsZXMgPSBzcmNGaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuc3RhcnRzV2l0aChSZXBvUGF0aHMuVGVzdEhlbHBlcnMpKTtcbiAgY29uc3QgZW52aXJvbm1lbnREaXJlY3RpdmVzID0gY29sbGVjdEVudmlyb25tZW50RGlyZWN0aXZlcyh7IGF2YWlsYWJsZVR5cGVzOiBhbGxUeXBlcywgZGVjbGFyYXRpb25GaWxlcyB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZGVjbGFyYXRpb25GaWxlcykge1xuICAgIGNvbnN0IGZvbGRlciA9IGRpcm5hbWUoZmlsZSk7XG4gICAgY29uc3QgbmFtZSA9IGJhc2VuYW1lKGZpbGUsIFJlcG9QYXRocy5EdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpLCAndXRmLTgnKTtcblxuICAgIGNvbnN0IGN0c1BhdGggPSBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzLCBmb2xkZXIsIG5hbWUgKyBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgbXRzUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20sIGZvbGRlciwgbmFtZSArIFJlcG9QYXRocy5EbXRzRXh0ZW5zaW9uKTtcblxuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUoY3RzUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUobXRzUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgbGV0IGN0c0NvbnRlbnQgPSB0b0N0c0NvbnRlbnQoY29udGVudCk7XG4gICAgbGV0IG10c0NvbnRlbnQgPSB0b010c0NvbnRlbnQoY29udGVudCk7XG5cbiAgICBpZiAobmFtZSA9PT0gbGlicmFyeUZpbGVOYW1lICYmIGZvbGRlciA9PT0gJy4nKSB7XG4gICAgICBjdHNDb250ZW50ID0gZGlyZWN0aXZlcyArIGN0c0NvbnRlbnQ7XG4gICAgICBtdHNDb250ZW50ID0gZGlyZWN0aXZlcyArIG10c0NvbnRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpbGVEaXJlY3RpdmVzID0gZW52aXJvbm1lbnREaXJlY3RpdmVzLmdldChmaWxlKSA/PyAnJztcbiAgICAgIGN0c0NvbnRlbnQgPSBidWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmUoeyBkZWNsYXJhdGlvbkZpbGVQYXRoOiBjdHNQYXRoLCBleHRlbnNpb246IFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uLCBtb2R1bGVEaXJlY3Rvcnk6IFJlcG9QYXRocy5DanMgfSlcbiAgICAgICAgKyBmaWxlRGlyZWN0aXZlcyArIGN0c0NvbnRlbnQ7XG4gICAgICBtdHNDb250ZW50ID0gYnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlKHsgZGVjbGFyYXRpb25GaWxlUGF0aDogbXRzUGF0aCwgZXh0ZW5zaW9uOiBSZXBvUGF0aHMuRG10c0V4dGVuc2lvbiwgbW9kdWxlRGlyZWN0b3J5OiBSZXBvUGF0aHMuRXNtIH0pXG4gICAgICAgICsgZmlsZURpcmVjdGl2ZXMgKyBtdHNDb250ZW50O1xuICAgIH1cblxuICAgIGF3YWl0IHdyaXRlRmlsZShjdHNQYXRoLCBjdHNDb250ZW50KTtcbiAgICBhd2FpdCB3cml0ZUZpbGUobXRzUGF0aCwgbXRzQ29udGVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdlbmVyYXRlcyB0aGUgYGV4cG9ydHNgIG1hcCBvZiB0aGUgcGFja2FnZSdzIGBwYWNrYWdlLmpzb25gIGZyb20gaXRzIHNvdXJjZSBmb2xkZXJzLCBhbmQgd3JpdGVzIGEgYHBhY2thZ2UuanNvbmBcbiAqIHN0dWIgcGVyIHN1YnBhdGggZm9yIHJlc29sdmVycyB0aGF0IGRvIG5vdCByZWFkIGBleHBvcnRzYC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBtYXAgaXMgY3VycmVudC5cbiAqIEB0aHJvd3MgSWYgdGhlIG1hcCBjaGFuZ2VkLCBzbyB0aGUgY2hhbmdlIGdldHMgcmV2aWV3ZWQgYW5kIGNvbW1pdHRlZCByYXRoZXIgdGhhbiBzaGlwcGVkIHVuc2Vlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGlicmFyeUV4cG9ydHMob3B0aW9uczogR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFkZGl0aW9uYWxFeHBvcnRzID0ge30sIHNvdXJjZUNvbmRpdGlvbiB9ID0gb3B0aW9ucztcbiAgY29uc3Qgc3JjRm9sZGVyczogc3RyaW5nW10gPSBbUmVwb1BhdGhzLlNyY107XG5cbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlLCB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFkaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGpvaW4oZGlyZW50LnBhcmVudFBhdGgsIGRpcmVudC5uYW1lKTtcblxuICAgIGlmIChwYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5TdHlsZXMpIHx8IHBhdGguaW5jbHVkZXMoUmVwb1BhdGhzLlRlc3RIZWxwZXJzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgc3JjRm9sZGVycy5wdXNoKHBhdGgpO1xuICB9XG5cbiAgc3JjRm9sZGVycy5zb3J0KCk7XG5cbiAgbGV0IGlzQ2hhbmdlZCA9IGZhbHNlO1xuXG4gIGF3YWl0IGVkaXRQYWNrYWdlSnNvbihhc3luYyAocGFja2FnZUpzb24pID0+IHtcbiAgICBjb25zdCBvbGRFeHBvcnRzID0gcGFja2FnZUpzb24uZXhwb3J0cztcbiAgICBjb25zdCBleHBvcnRDb25kaXRpb25zOiBQYWNrYWdlSnNvbi5FeHBvcnRDb25kaXRpb25zID0ge307XG4gICAgcGFja2FnZUpzb24uZXhwb3J0cyA9IGV4cG9ydENvbmRpdGlvbnM7XG4gICAgZm9yIChjb25zdCBzcmNGb2xkZXIgb2Ygc3JjRm9sZGVycykge1xuICAgICAgYXdhaXQgc2V0RXhwb3J0KHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZDogZmFsc2UsIHNvdXJjZUNvbmRpdGlvbiwgc3JjRm9sZGVyIH0pO1xuICAgICAgYXdhaXQgc2V0RXhwb3J0KHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZDogdHJ1ZSwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbc3VicGF0aCwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKGFkZGl0aW9uYWxFeHBvcnRzKSkge1xuICAgICAgaWYgKGV4cG9ydENvbmRpdGlvbnNbc3VicGF0aF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBhZGRpdGlvbmFsIGV4cG9ydCAnJHtzdWJwYXRofScgY29sbGlkZXMgd2l0aCBhbiBlbnRyeSBnZW5lcmF0ZWQgZnJvbSBhIHNvdXJjZSBmb2xkZXIuYCk7XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydENvbmRpdGlvbnNbc3VicGF0aF0gPSBlbnRyeTtcbiAgICB9XG5cbiAgICBpc0NoYW5nZWQgPSAhaXNEZWVwRXF1YWwob2xkRXhwb3J0cywgcGFja2FnZUpzb24uZXhwb3J0cyk7XG4gIH0pO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IGNoYW5nZWQgaW4gdGhlIGBlZGl0UGFja2FnZUpzb25gLCBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gIGlmIChpc0NoYW5nZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhY2thZ2UgZXhwb3J0cyBoYXZlIGNoYW5nZWQuIFBsZWFzZSByZXZpZXcgdGhlIGNoYW5nZXMgYW5kIGNvbW1pdCB0aGVtLicpO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGFuIGBpbmRleC50c2AgYmFycmVsIGluIGV2ZXJ5IHNvdXJjZSBmb2xkZXIgdGhhdCBoYXMgc29tZXRoaW5nIHRvIGV4cG9ydCwgcmUtZXhwb3J0aW5nIGVhY2ggbW9kdWxlIGFuZFxuICogZWFjaCBzdWItYmFycmVsIHVuZGVyIGl0cyBvd24gbmFtZS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhcnJlbHMgaGF2ZSBiZWVuIHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpYnJhcnlJbmRleCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZ2VuZXJhdGVJbmRleChSZXBvUGF0aHMuU3JjKTtcbn1cblxuLyoqXG4gKiBSdW5zIGVhY2ggbmFtZWQgbnBtIHNjcmlwdCB0aGUgcGFja2FnZSBkZWZpbmVzLCBpbiBvcmRlciwgc2tpcHBpbmcgdGhlIG9uZXMgaXQgZG9lcyBub3QgZGVmaW5lLlxuICpcbiAqIEBwYXJhbSBzdGVwcyAtIFRoZSBucG0gc2NyaXB0IG5hbWVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5IHN0ZXAgaGFzIHJ1bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkJ1aWxkU3RlcHMoc3RlcHM6IHJlYWRvbmx5IHN0cmluZ1tdID0gTElCUkFSWV9CVUlMRF9TVEVQUyk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbChzdGVwKTtcbiAgfVxufVxuXG4vKipcbiAqIEFkZHMgd2hhdCBhIGNvbnN1bWVyIG5lZWRzIGxvYWRlZCBmb3Igb25lIHN5bWJvbCBhIGRlY2xhcmF0aW9uIG5hbWVzLiBBIHN5bWJvbCBhbnkgRVMgbGliIGRlY2xhcmVzIG5lZWRzIG5vdGhpbmcsXG4gKiBiZWNhdXNlIG5vIGNvbnN1bWVyIGNvbmZsaWN0cyB3aXRoIHRob3NlIGxpYnMuIE90aGVyd2lzZSBlYWNoIGVudmlyb25tZW50IGxpYiB0aGF0IGRlY2xhcmVzIGl0IGFkZHMgaXRzZWxmLCBhbmRcbiAqIGZhaWxpbmcgdGhhdCBgQHR5cGVzL25vZGVgIGFkZHMgYG5vZGVgLiBBIHN5bWJvbCBkZWNsYXJlZCBpbiB0aGUgcGFja2FnZSdzIG93biBmaWxlcyBhZGRzIG5vdGhpbmc6IHRoZSBkZWNsYXJhdGlvblxuICogdGhhdCBob2xkcyBpdCBjYXJyaWVzIGl0cyBvd24gZGlyZWN0aXZlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHN5bWJvbCwgdGhlIHByb2dyYW0gaXQgd2FzIHJlc29sdmVkIGluLCBhbmQgdGhlIHNldHMgdG8gYWRkIHRvLlxuICovXG5mdW5jdGlvbiBhZGRFbnZpcm9ubWVudEdsb2JhbHMocGFyYW1zOiBBZGRFbnZpcm9ubWVudEdsb2JhbHNQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgeyBsaWJzLCBwcm9ncmFtLCBzeW1ib2wsIHR5cGVzIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGVudmlyb25tZW50TGliczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGlzTm9kZSA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygc3ltYm9sLmRlY2xhcmF0aW9ucyA/PyBbXSkge1xuICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBkZWNsYXJhdGlvbi5nZXRTb3VyY2VGaWxlKCk7XG4gICAgaWYgKHByb2dyYW0uaXNTb3VyY2VGaWxlRGVmYXVsdExpYnJhcnkoc291cmNlRmlsZSkpIHtcbiAgICAgIGNvbnN0IGxpYiA9IHRvTGliTmFtZShzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICAgIGlmICghaXNFbnZpcm9ubWVudExpYihsaWIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVudmlyb25tZW50TGlicy5wdXNoKGxpYik7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VGaWxlLmZpbGVOYW1lLmluY2x1ZGVzKE5PREVfVFlQRVNfUEFUSF9TRUdNRU5UKSkge1xuICAgICAgaXNOb2RlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoZW52aXJvbm1lbnRMaWJzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IGxpYiBvZiBlbnZpcm9ubWVudExpYnMpIHtcbiAgICAgIGxpYnMuYWRkKGxpYik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTm9kZSkge1xuICAgIHR5cGVzLmFkZCgnbm9kZScpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhsaWJzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtcbiAgICBsaWJzXG4gICAgICAubWFwKChsaWIpID0+IGAvLy8gJHtSRUZFUkVOQ0VfTElCX0RJUkVDVElWRX1cIiR7bGlifVwiIC8+YClcbiAgICAgIC5qb2luKCdcXG4nKVxuICB9XFxuYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXModHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVzLmxlbmd0aCA9PT0gMFxuICAgID8gJydcbiAgICA6IGAke1xuICAgICAgdHlwZXNcbiAgICAgICAgLm1hcCgodHlwZSkgPT4gYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiJHt0eXBlfVwiIC8+YClcbiAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgfVxcbmA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkTGlicmFyeUZvcm1hdChwYXJhbXM6IEJ1aWxkTGlicmFyeUZvcm1hdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGZvcm1hdCwgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGZvcm1hdCA9PT0gJ2NqcycgPyBSZXBvUGF0aHMuQ2pzRXh0ZW5zaW9uIDogUmVwb1BhdGhzLk1qc0V4dGVuc2lvbjtcbiAgY29uc3QgYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnMgPSB7XG4gICAgLy8gRXhwbGljaXQsIGJlY2F1c2UgZXNidWlsZCBvdGhlcndpc2UgdGFrZXMgdGhlIGZvbGRlciBpdHMgc2VydmljZSBwcm9jZXNzIHN0YXJ0ZWQgaW4uXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gZXNidWlsZCdzIG93biBvcHRpb24gbmFtZS5cbiAgICBhYnNXb3JraW5nRGlyOiBwcm9jZXNzLmN3ZCgpLFxuICAgIGJhbm5lcjoge1xuICAgICAganM6IExJQlJBUllfQkFOTkVSXG4gICAgfSxcbiAgICBidW5kbGU6IGZhbHNlLFxuICAgIGVudHJ5UG9pbnRzOiBsaWJGaWxlcyxcbiAgICBmb3JtYXQsXG4gICAgbG9nTGV2ZWw6ICdpbmZvJyxcbiAgICBvdXRkaXI6IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIGZvcm1hdCksXG4gICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICBwbHVnaW5zOiBbXG4gICAgICBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeShmb3JtYXQgPT09ICdlc20nKSxcbiAgICAgIGZpeEVzbVBsdWdpbigpLFxuICAgICAgY2hhbmdlRXh0ZW5zaW9uUGx1Z2luKGV4dGVuc2lvbilcbiAgICBdLFxuICAgIHNvdXJjZW1hcDogJ2lubGluZScsXG4gICAgdGFyZ2V0OiAnRVMyMDIyJyxcbiAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICB3cml0ZTogZmFsc2VcbiAgfTtcblxuICBjb25zdCBidWlsZENvbnRleHQgPSBhd2FpdCBjb250ZXh0KGJ1aWxkT3B0aW9ucyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgYnVpbGRDb250ZXh0LnJlYnVpbGQoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBidWlsZENvbnRleHQuZGlzcG9zZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZShwYXJhbXM6IEJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZVBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgZGVjbGFyYXRpb25GaWxlUGF0aCwgZXh0ZW5zaW9uLCBtb2R1bGVEaXJlY3RvcnkgfSA9IHBhcmFtcztcbiAgY29uc3QgbGlicmFyeUZpbGVQYXRoID0gam9pbihSZXBvUGF0aHMuRGlzdExpYiwgbW9kdWxlRGlyZWN0b3J5LCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgZXh0ZW5zaW9uKTtcbiAgbGV0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlTmF0aXZlKGRpcm5hbWUoZGVjbGFyYXRpb25GaWxlUGF0aCksIGxpYnJhcnlGaWxlUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gIH1cbiAgcmV0dXJuIGAvLy8gPHJlZmVyZW5jZSBwYXRoPVwiJHtyZWxhdGl2ZVBhdGh9XCIgLz5cXG5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0QWxsTGlicygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIC8vIFRoZSBSRVNPTFZFRCBvcHRpb25zLCBiZWNhdXNlIGEgcGFja2FnZSdzIGB0c2NvbmZpZy5qc29uYCBpbmhlcml0cyBgbGliYCBmcm9tIHRoZSBzaGFyZWQgYmFzZS4gVGhlIHJlc29sdmVkXG4gIC8vIG5hbWVzIGFyZSBmaWxlIG5hbWVzIChgbGliLmRvbS5pdGVyYWJsZS5kLnRzYCksIHNvIHRoZXkgYXJlIG1hcHBlZCBiYWNrIG9udG8gdGhlIG5hbWVzIGEgZGlyZWN0aXZlIHRha2VzLlxuICBjb25zdCB7IG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcoUmVwb1BhdGhzLlRzQ29uZmlnSnNvbik7XG4gIGNvbnN0IGxpYnMgPSBuZXcgU2V0KChvcHRpb25zLmxpYiA/PyBbXSkubWFwKChsaWIpID0+IHRvTGliTmFtZShsaWIpKSk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmICghZmlsZS5lbmRzV2l0aCgnLnRzJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZUNvbnRlbnQgPSByZWFkRmlsZVN5bmMoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSwgJ3V0Zi04Jyk7XG4gICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHdheXMgY2FwdHVyZXMgaXRzIG9uZSBncm91cCwgc28gbm8gZmFsbGJhY2sgZm9yIGEgbWlzc2luZyBvbmUgaXMgbmVlZGVkLlxuICAgIGZvciAoY29uc3QgWywgbGliXSBvZiBzb3VyY2VDb250ZW50Lm1hdGNoQWxsKFJFRkVSRU5DRV9MSUJfUkVHX0VYUCkpIHtcbiAgICAgIGxpYnMuYWRkKFN0cmluZyhsaWIpLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbLi4ubGlic10uc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0QWxsVHlwZXMoKTogc3RyaW5nW10ge1xuICBjb25zdCB7IG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcoUmVwb1BhdGhzLlRzQ29uZmlnSnNvbik7XG4gIHJldHVybiAob3B0aW9ucy50eXBlcyA/PyBbXSlcbiAgICAuZmlsdGVyKCh0eXBlKSA9PiBERUNMQVJBVElPTl9SRUZFUkVOQ0VfVFlQRVMuaGFzKHR5cGUpKVxuICAgIC5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXMocGFyYW1zOiBDb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzUGFyYW1zKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHsgYXZhaWxhYmxlVHlwZXMsIGRlY2xhcmF0aW9uRmlsZXMgfSA9IHBhcmFtcztcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbSh7XG4gICAgb3B0aW9uczogeyAuLi5vcHRpb25zLCBub0VtaXQ6IHRydWUgfSxcbiAgICByb290TmFtZXM6IGRlY2xhcmF0aW9uRmlsZXMubWFwKChmaWxlKSA9PiByZXNvbHZlTmF0aXZlKFJlcG9QYXRocy5TcmMsIGZpbGUpKVxuICB9KTtcbiAgY29uc3QgY2hlY2tlciA9IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKTtcbiAgY29uc3QgZGlyZWN0aXZlc0J5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGRlY2xhcmF0aW9uRmlsZXMpIHtcbiAgICAvLyBUaGUgcHJvZ3JhbSB3YXMgaGFuZGVkIGV2ZXJ5IG9uZSBvZiB0aGVzZSBhcyBhIHJvb3QgbmFtZSwgc28gZWFjaCBvbmUgaXMgaW4gaXQuXG4gICAgY29uc3Qgc291cmNlRmlsZSA9IGVuc3VyZU5vbk51bGxhYmxlKHByb2dyYW0uZ2V0U291cmNlRmlsZShyZXNvbHZlTmF0aXZlKFJlcG9QYXRocy5TcmMsIGZpbGUpKSk7XG4gICAgY29uc3QgbGlicyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHR5cGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmdW5jdGlvbiB2aXNpdChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgICBpZiAoaXNJZGVudGlmaWVyKG5vZGUpIHx8IGlzU3RyaW5nTGl0ZXJhbChub2RlKSkge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24obm9kZSk7XG4gICAgICAgIGlmIChzeW1ib2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFkZEVudmlyb25tZW50R2xvYmFscyh7IGxpYnMsIHByb2dyYW0sIHN5bWJvbDogcmVzb2x2ZUFsaWFzKGNoZWNrZXIsIHN5bWJvbCksIHR5cGVzIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpO1xuICAgIH1cbiAgICB2aXNpdChzb3VyY2VGaWxlKTtcblxuICAgIGNvbnN0IG5lZWRlZFR5cGVzID0gWy4uLnR5cGVzXS5maWx0ZXIoKHR5cGUpID0+IGF2YWlsYWJsZVR5cGVzLmluY2x1ZGVzKHR5cGUpKTtcbiAgICBpZiAobGlicy5zaXplID4gMCB8fCBuZWVkZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICBkaXJlY3RpdmVzQnlGaWxlLnNldChcbiAgICAgICAgZmlsZSxcbiAgICAgICAgKGxpYnMuc2l6ZSA+IDAgPyBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoWy4uLmxpYnNdLnNvcnQoKSkgOiAnJykgKyBidWlsZEFsbFJlZmVyZW5jZVR5cGVzRGlyZWN0aXZlcyhuZWVkZWRUeXBlcy5zb3J0KCkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaXJlY3RpdmVzQnlGaWxlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4KGZvbGRlcjogc3RyaW5nKTogUHJvbWlzZTxHZW5lcmF0ZUluZGV4UmVzdWx0PiB7XG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCByZWFkZGlyUG9zaXgoZm9sZGVyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IG1heWJlTGluZXMgPSBhd2FpdCBhc3luY01hcChkaXJlbnRzLCAoZGlyZW50KSA9PiBoYW5kbGVJbmRleERpcmVudChmb2xkZXIsIGRpcmVudCkpO1xuICBjb25zdCBsaW5lcyA9IG1heWJlTGluZXMuZmlsdGVyKChsaW5lKSA9PiBsaW5lICE9PSB1bmRlZmluZWQpO1xuXG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gR2VuZXJhdGVJbmRleFJlc3VsdC5Ta2lwcGVkO1xuICB9XG5cbiAgYXdhaXQgZ2VuZXJhdGUoam9pbihmb2xkZXIsIFJlcG9QYXRocy5JbmRleFRzKSwgbGluZXMpO1xuICByZXR1cm4gR2VuZXJhdGVJbmRleFJlc3VsdC5TdWNjZXNzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMaWJGaWxlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGxldCBmaWxlcyA9IGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZmlsZXMgPSBmaWxlcy5tYXAoKGZpbGUpID0+IG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSkpO1xuICByZXR1cm4gZmlsZXMuZmlsdGVyKChmaWxlKSA9PlxuICAgIGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5lbmRzV2l0aCgnLnRlc3QudHMnKVxuICAgICYmICFmaWxlLmluY2x1ZGVzKGAvJHtSZXBvUGF0aHMuVGVzdEhlbHBlcnN9L2ApXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUluZGV4RGlyZW50KGZvbGRlcjogc3RyaW5nLCBkaXJlbnQ6IERpcmVudCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmIChpc0V4Y2x1ZGVkRnJvbUluZGV4KGZvbGRlciwgZGlyZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBzb3VyY2VGaWxlOiBzdHJpbmc7XG4gIGxldCBuYW1lOiBzdHJpbmc7XG4gIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdlbmVyYXRlSW5kZXgoam9pbihmb2xkZXIsIGRpcmVudC5uYW1lKSk7XG4gICAgaWYgKHJlc3VsdCAhPT0gR2VuZXJhdGVJbmRleFJlc3VsdC5TdWNjZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNvdXJjZUZpbGUgPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oZGlyZW50Lm5hbWUsIFJlcG9QYXRocy5JbmRleFRzKSk7XG4gICAgbmFtZSA9IGRpcmVudC5uYW1lO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUoZGlyZW50Lm5hbWUpO1xuICAgIG5hbWUgPSBiYXNlbmFtZShkaXJlbnQubmFtZSwgZXh0ZW5zaW9uKTtcbiAgICBzb3VyY2VGaWxlID0gbm9ybWFsaXplSWZSZWxhdGl2ZShkaXJlbnQubmFtZSk7XG4gIH1cblxuICByZXR1cm4gYGV4cG9ydCAqIGFzICcke25hbWV9JyBmcm9tICcke3NvdXJjZUZpbGV9JztgO1xufVxuXG5mdW5jdGlvbiBpc0Vudmlyb25tZW50TGliKGxpYjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBFTlZJUk9OTUVOVF9MSUJfUFJFRklYRVMuc29tZSgocHJlZml4KSA9PiBsaWIuc3RhcnRzV2l0aChwcmVmaXgpKTtcbn1cblxuZnVuY3Rpb24gaXNFeGNsdWRlZEZpbGVOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gIW5hbWUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSB8fCBuYW1lLmVuZHNXaXRoKCcudGVzdC50cycpIHx8IG5hbWUgPT09ICdzZXR1cC50cycgfHwgbmFtZS5lbmRzV2l0aCgnLXNldHVwLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzRXhjbHVkZWRGcm9tSW5kZXgoZm9sZGVyOiBzdHJpbmcsIGRpcmVudDogRGlyZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IGV4Y2x1ZGVkTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1JlcG9QYXRocy5JbmRleFRzLCBSZXBvUGF0aHMuVHlwZXMsIFJlcG9QYXRocy5TdHlsZXMsIFJlcG9QYXRocy5UZXN0SGVscGVyc107XG4gIGNvbnN0IGlzRXhjbHVkZWRFbnRyeSA9IGV4Y2x1ZGVkTmFtZXMuaW5jbHVkZXMoZGlyZW50Lm5hbWUpIHx8IGRpcmVudC5uYW1lLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pIHx8IGZvbGRlci5zcGxpdCgnLycpLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIHJldHVybiBpc0V4Y2x1ZGVkRW50cnkgfHwgKGRpcmVudC5pc0ZpbGUoKSAmJiBpc0V4Y2x1ZGVkRmlsZU5hbWUoZGlyZW50Lm5hbWUpKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFsaWFzKGNoZWNrZXI6IFR5cGVDaGVja2VyLCBzeW1ib2w6IFRzU3ltYm9sKTogVHNTeW1ib2wge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZSAtLSBgU3ltYm9sRmxhZ3NgIGlzIGEgYml0IHNldC5cbiAgcmV0dXJuIChzeW1ib2wuZmxhZ3MgJiBTeW1ib2xGbGFncy5BbGlhcykgPT09IDAgPyBzeW1ib2wgOiBjaGVja2VyLmdldEFsaWFzZWRTeW1ib2woc3ltYm9sKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0RXhwb3J0KHBhcmFtczogU2V0RXhwb3J0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZCwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgaW1wb3J0UGF0aCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IHNyY0ZvbGRlcixcbiAgICByZXBsYWNlcjogUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIsXG4gICAgc2VhcmNoVmFsdWU6IFJlcG9QYXRocy5TcmNcbiAgfSk7XG4gIGNvbnN0IGNvbmRpdGlvblBhdGggPSBpc1dpbGRjYXJkID8gYCR7aW1wb3J0UGF0aH0vJHtSZXBvUGF0aHMuQW55fWAgOiBpbXBvcnRQYXRoO1xuICBjb25zdCBkbXRzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5Fc20sIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55RG10cyA6IFJlcG9QYXRocy5JbmRleERtdHMgfSk7XG4gIGNvbnN0IGRjdHNQYXRoID0gdG9EaXN0UGF0aCh7IGZvcm1hdDogUmVwb1BhdGhzLkNqcywgaW1wb3J0UGF0aCwgbmFtZTogaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlEY3RzIDogUmVwb1BhdGhzLkluZGV4RGN0cyB9KTtcbiAgY29uc3QgZG10c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRtdHNQYXRoKTtcbiAgY29uc3QgZGN0c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRjdHNQYXRoKTtcblxuICBpZiAoIWlzV2lsZGNhcmQgJiYgIWV4aXN0c1N5bmMoZGN0c1BhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaXNUeXBlc09ubHkgPSBpbXBvcnRQYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIGNvbnN0IG1qc1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuRXNtLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueU1qcyA6IFJlcG9QYXRocy5JbmRleE1qcyB9KTtcbiAgY29uc3QgY2pzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5DanMsIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55Q2pzIDogUmVwb1BhdGhzLkluZGV4Q2pzIH0pO1xuXG4gIGlmIChpc1R5cGVzT25seSkge1xuICAgIGV4cG9ydENvbmRpdGlvbnNbY29uZGl0aW9uUGF0aF0gPSB7XG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGhcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNvdXJjZVBhdGggPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgaW1wb3J0UGF0aCwgaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlUcyA6IFJlcG9QYXRocy5JbmRleFRzKSk7XG5cbiAgICBleHBvcnRDb25kaXRpb25zW2NvbmRpdGlvblBhdGhdID0ge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgICAvLyBGaXJzdCwgc28gaXQgd2lucyB3aGVyZXZlciBpdCBpcyBzZXQ6IGluc2lkZSB0aGUgcmVwb3NpdG9yeSwgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LlxuICAgICAgLi4uKHNvdXJjZUNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkICYmIHsgW3NvdXJjZUNvbmRpdGlvbl06IHNvdXJjZVBhdGggfSksXG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoLFxuICAgICAgICBkZWZhdWx0OiBtanNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGgsXG4gICAgICAgIGRlZmF1bHQ6IGNqc1BhdGhcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpbXBvcnRQYXRoID09PSBSZXBvUGF0aHMuQ3VycmVudEZvbGRlciBhcyBzdHJpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWlzV2lsZGNhcmQpIHtcbiAgICBhd2FpdCB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihcbiAgICAgIGltcG9ydFBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzOiByZWxhdGl2ZShpbXBvcnRQYXRoLCBkY3RzUGF0aCkgfVxuICAgICAgICA6IHsgbWFpbjogcmVsYXRpdmUoaW1wb3J0UGF0aCwgY2pzUGF0aCksIG1vZHVsZTogcmVsYXRpdmUoaW1wb3J0UGF0aCwgbWpzUGF0aCksIHR5cGU6ICdtb2R1bGUnLCB0eXBlczogcmVsYXRpdmUoaW1wb3J0UGF0aCwgZGN0c1BhdGgpIH1cbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoZGN0c0ZvbGRlclBhdGgpKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgcGFja2FnZUpzb25Gb2xkZXJQYXRoID0gam9pbihpbXBvcnRQYXRoLCBuYW1lKTtcbiAgICBjb25zdCB0eXBlcyA9IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkY3RzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSk7XG4gICAgYXdhaXQgd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oXG4gICAgICBwYWNrYWdlSnNvbkZvbGRlclBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgbWFpbjogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRjdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLkNqc0V4dGVuc2lvbikpLFxuICAgICAgICAgIG1vZHVsZTogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRtdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLk1qc0V4dGVuc2lvbikpLFxuICAgICAgICAgIHR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgIHR5cGVzXG4gICAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ3RzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGNvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdmcm9tIFxcJyQ8SW1wb3J0UGF0aD4uY2pzXFwnOycsXG4gICAgc2VhcmNoVmFsdWU6IFNUQVRJQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQoJDxRdW90ZT4kPEltcG9ydFBhdGg+LmNqcyQ8UXVvdGU+KScsXG4gICAgc2VhcmNoVmFsdWU6IERZTkFNSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG5cbiAgLy8gQSBgLmQuY3RzYCBmaWxlIGlzIGEgQ29tbW9uSlMgbW9kdWxlLiBUeXBlLW9ubHkgaW1wb3J0cyBvZiBhIGJhcmUgc3BlY2lmaWVyIHJlc29sdmluZyB0byBhblxuICAvLyBFU00tb25seSBwYWNrYWdlIG5lZWQgYSBgcmVzb2x1dGlvbi1tb2RlYCBhdHRyaWJ1dGUsIGVsc2UgYHRzY2AgcmVwb3J0cyBUUzE1NDEgLyBUUzE1NDIuXG4gIC8vIFBhc3NpbmcgYCdpbXBvcnQnYCBpcyB2YWxpZCBmb3IgQ29tbW9uSlMgdGFyZ2V0cyB0b28sIHNvIGV2ZXJ5IGJhcmUgc3BlY2lmaWVyIHJlY2VpdmVzIGl0LlxuICAvLyBUaGUgRVNNIGAuZC5tdHNgIG5lZWRzIG5vIHN1Y2ggYXR0cmlidXRlLCBzbyB0aGlzIHRyYW5zZm9ybSBydW5zIG9uIENvbW1vbkpTIGNvbnRlbnQgb25seS5cbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQgdHlwZSAkPENsYXVzZT4gZnJvbSBcXCckPFNwZWNpZmllcj5cXCcgd2l0aCB7IFxcJ3Jlc29sdXRpb24tbW9kZVxcJzogXFwnaW1wb3J0XFwnIH07JyxcbiAgICBzZWFyY2hWYWx1ZTogQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY3RzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydChcIiQ8U3BlY2lmaWVyPlwiLCB7IHdpdGg6IHsgXFwncmVzb2x1dGlvbi1tb2RlXFwnOiBcXCdpbXBvcnRcXCcgfSB9KScsXG4gICAgc2VhcmNoVmFsdWU6IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvRGlzdFBhdGgocGFyYW1zOiBUb0Rpc3RQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgcGFyYW1zLmZvcm1hdCwgcGFyYW1zLmltcG9ydFBhdGgsIHBhcmFtcy5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHRvTGliTmFtZShsaWJGaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQSBsaWIgYSBwYWNrYWdlIHJlcGxhY2VkIChgQHR5cGVzY3JpcHQvbGliLWRvbWAsIGBAdHlwZXNjcmlwdC9saWItZG9tL2l0ZXJhYmxlLmQudHNgKSBpcyBuYW1lZCBieSBpdHMgcGF0aCwgbm90IGJ5XG4gIC8vIGl0cyBmaWxlIG5hbWUsIHdoaWNoIGlzIGBpbmRleC5kLnRzYCBmb3IgdGhlIGxpYidzIHJvb3QuXG4gIGNvbnN0IHJlcGxhY2VtZW50TWF0Y2ggPSBMSUJfUkVQTEFDRU1FTlRfUkVHX0VYUC5leGVjKGxpYkZpbGVQYXRoKTtcbiAgaWYgKHJlcGxhY2VtZW50TWF0Y2g/Lmdyb3VwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHdheXMgY2FwdHVyZXMgYm90aCBncm91cHMuXG4gICAgY29uc3QgbGliID0gU3RyaW5nKHJlcGxhY2VtZW50TWF0Y2guZ3JvdXBzWydMaWInXSk7XG4gICAgY29uc3Qgc3ViTGliID0gU3RyaW5nKHJlcGxhY2VtZW50TWF0Y2guZ3JvdXBzWydTdWJMaWInXSk7XG4gICAgcmV0dXJuIChzdWJMaWIgPT09ICdpbmRleCcgPyBsaWIgOiBgJHtsaWJ9LiR7c3ViTGliLnJlcGxhY2VBbGwoJy8nLCAnLicpfWApLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcmV0dXJuIGJhc2VuYW1lKGxpYkZpbGVQYXRoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15saWJcXC4vLCAnJykucmVwbGFjZSgvXFwuZFxcLnRzJC8sICcnKTtcbn1cblxuZnVuY3Rpb24gdG9NdHNDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG10c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjb250ZW50LFxuICAgIHJlcGxhY2VyOiAnZnJvbSBcXCckPEltcG9ydFBhdGg+Lm1qc1xcJzsnLFxuICAgIHNlYXJjaFZhbHVlOiBTVEFUSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG4gIHJldHVybiByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBtdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0KCQ8UXVvdGU+JDxJbXBvcnRQYXRoPi5tanMkPFF1b3RlPiknLFxuICAgIHNlYXJjaFZhbHVlOiBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihmb2xkZXI6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG1rZGlyKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlSnNvbihqb2luKGZvbGRlciwg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
@@ -0,0 +1,34 @@
1
+ /// <reference path="./library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The `sync-upstreams` command: reads its arguments, wires {@link syncUpstreams} to the real git, `gh`, GitHub API and
6
+ * npm registry, and turns the results into an exit code.
7
+ */
8
+ import type { SyncDependencies, SyncUpstreamsOptions } from './upstream-sync.mjs';
9
+ /**
10
+ * Creates the sync's outside world: commands run with `spawnSync`, JSON fetched with `fetch`, output to stdout.
11
+ * `GITHUB_TOKEN`, when set, is sent to the GitHub API and nowhere else.
12
+ *
13
+ * @returns The dependencies.
14
+ */
15
+ export declare function createNodeSyncDependencies(): SyncDependencies;
16
+ /**
17
+ * Builds the sync options from the command line.
18
+ *
19
+ * `--dry-run` prints each PR it would open and changes nothing. `--only=<name>[,<name>]` limits the sync to those
20
+ * entries, `--base=<branch>` names the branch the PRs target (`main` by default), and `--config=<path>` names the
21
+ * `upstreams.json` (the one in the working directory by default).
22
+ *
23
+ * @param cliArguments - The arguments after the command name.
24
+ * @returns The options.
25
+ */
26
+ export declare function parseSyncUpstreamsArguments(cliArguments: readonly string[]): SyncUpstreamsOptions;
27
+ /**
28
+ * Runs the `sync-upstreams` command.
29
+ *
30
+ * @param cliArguments - The arguments after the command name.
31
+ * @param dependencies - The outside world. The real one when omitted.
32
+ * @returns The exit code: `1` when the arguments or `upstreams.json` are wrong or any entry failed, `0` otherwise.
33
+ */
34
+ export declare function runSyncUpstreamsCli(cliArguments: readonly string[], dependencies?: SyncDependencies): Promise<number>;
@@ -0,0 +1,77 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ import { spawnSync } from "node:child_process";
7
+ import process from "node:process";
8
+ import { syncUpstreams } from "./upstream-sync.mjs";
9
+ const DEFAULT_BASE_BRANCH = "main";
10
+ const DEFAULT_CONFIG_PATH = "upstreams.json";
11
+ function createNodeSyncDependencies() {
12
+ return {
13
+ exec(file, arguments_, env) {
14
+ return toResult(spawnSync(file, arguments_, { encoding: "utf-8", env: { ...process.env, ...env } }));
15
+ },
16
+ async fetchJson(url) {
17
+ const headers = { Accept: "application/vnd.github+json" };
18
+ const token = process.env["GITHUB_TOKEN"];
19
+ if (token && url.startsWith("https://api.github.com/")) {
20
+ headers["Authorization"] = `Bearer ${token}`;
21
+ }
22
+ const response = await fetch(url, { headers });
23
+ if (!response.ok) {
24
+ throw new Error(`GET ${url} failed: HTTP ${String(response.status)}.`);
25
+ }
26
+ return await response.json();
27
+ },
28
+ log(text) {
29
+ process.stdout.write(`${text}
30
+ `);
31
+ },
32
+ shell(command, env) {
33
+ process.stdout.write(`> ${command}
34
+ `);
35
+ const result = toResult(spawnSync(command, { encoding: "utf-8", env: { ...process.env, ...env }, shell: true }));
36
+ process.stdout.write(result.output);
37
+ return result;
38
+ }
39
+ };
40
+ }
41
+ function parseSyncUpstreamsArguments(cliArguments) {
42
+ const known = ["--dry-run", "--only=", "--base=", "--config="];
43
+ const unknown = cliArguments.filter((argument) => known.every((prefix) => !(prefix.endsWith("=") ? argument.startsWith(prefix) : argument === prefix)));
44
+ if (unknown.length > 0) {
45
+ throw new Error(`sync-upstreams: unknown argument ${unknown.map((argument) => `"${argument}"`).join(", ")}. Known: --dry-run, --only=, --base=, --config=.`);
46
+ }
47
+ return {
48
+ baseBranch: readOption(cliArguments, "base") ?? DEFAULT_BASE_BRANCH,
49
+ configPath: readOption(cliArguments, "config") ?? DEFAULT_CONFIG_PATH,
50
+ dryRun: cliArguments.includes("--dry-run"),
51
+ only: readOption(cliArguments, "only")?.split(",").filter((name) => name !== "") ?? []
52
+ };
53
+ }
54
+ async function runSyncUpstreamsCli(cliArguments, dependencies = createNodeSyncDependencies()) {
55
+ try {
56
+ const results = await syncUpstreams(parseSyncUpstreamsArguments(cliArguments), dependencies);
57
+ return results.some((result) => result.outcome === "error") ? 1 : 0;
58
+ } catch (error) {
59
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}
60
+ `);
61
+ return 1;
62
+ }
63
+ }
64
+ function readOption(cliArguments, name) {
65
+ const prefix = `--${name}=`;
66
+ const value = cliArguments.find((argument) => argument.startsWith(prefix))?.slice(prefix.length);
67
+ return value === "" ? void 0 : value;
68
+ }
69
+ function toResult(result) {
70
+ return result.error ? { exitCode: 1, output: result.error.message } : { exitCode: result.status ?? 1, output: `${result.stdout}${result.stderr}` };
71
+ }
72
+ export {
73
+ createNodeSyncDependencies,
74
+ parseSyncUpstreamsArguments,
75
+ runSyncUpstreamsCli
76
+ };
77
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3Vwc3RyZWFtLXN5bmMtY2xpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGBzeW5jLXVwc3RyZWFtc2AgY29tbWFuZDogcmVhZHMgaXRzIGFyZ3VtZW50cywgd2lyZXMge0BsaW5rIHN5bmNVcHN0cmVhbXN9IHRvIHRoZSByZWFsIGdpdCwgYGdoYCwgR2l0SHViIEFQSSBhbmRcbiAqIG5wbSByZWdpc3RyeSwgYW5kIHR1cm5zIHRoZSByZXN1bHRzIGludG8gYW4gZXhpdCBjb2RlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3Bhd25TeW5jUmV0dXJucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIENvbW1hbmRSZXN1bHQsXG4gIFN5bmNEZXBlbmRlbmNpZXMsXG4gIFN5bmNVcHN0cmVhbXNPcHRpb25zXG59IGZyb20gJy4vdXBzdHJlYW0tc3luYy50cyc7XG5cbmltcG9ydCB7IHN5bmNVcHN0cmVhbXMgfSBmcm9tICcuL3Vwc3RyZWFtLXN5bmMudHMnO1xuXG5jb25zdCBERUZBVUxUX0JBU0VfQlJBTkNIID0gJ21haW4nO1xuY29uc3QgREVGQVVMVF9DT05GSUdfUEFUSCA9ICd1cHN0cmVhbXMuanNvbic7XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgc3luYydzIG91dHNpZGUgd29ybGQ6IGNvbW1hbmRzIHJ1biB3aXRoIGBzcGF3blN5bmNgLCBKU09OIGZldGNoZWQgd2l0aCBgZmV0Y2hgLCBvdXRwdXQgdG8gc3Rkb3V0LlxuICogYEdJVEhVQl9UT0tFTmAsIHdoZW4gc2V0LCBpcyBzZW50IHRvIHRoZSBHaXRIdWIgQVBJIGFuZCBub3doZXJlIGVsc2UuXG4gKlxuICogQHJldHVybnMgVGhlIGRlcGVuZGVuY2llcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5vZGVTeW5jRGVwZW5kZW5jaWVzKCk6IFN5bmNEZXBlbmRlbmNpZXMge1xuICByZXR1cm4ge1xuICAgIGV4ZWMoZmlsZSwgYXJndW1lbnRzXywgZW52KTogQ29tbWFuZFJlc3VsdCB7XG4gICAgICByZXR1cm4gdG9SZXN1bHQoc3Bhd25TeW5jKGZpbGUsIGFyZ3VtZW50c18sIHsgZW5jb2Rpbmc6ICd1dGYtOCcsIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZW52IH0gfSkpO1xuICAgIH0sXG4gICAgYXN5bmMgZmV0Y2hKc29uKHVybCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgQWNjZXB0OiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uJyB9O1xuICAgICAgY29uc3QgdG9rZW4gPSBwcm9jZXNzLmVudlsnR0lUSFVCX1RPS0VOJ107XG4gICAgICBpZiAodG9rZW4gJiYgdXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vJykpIHtcbiAgICAgICAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke3Rva2VufWA7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdFVCAke3VybH0gZmFpbGVkOiBIVFRQICR7U3RyaW5nKHJlc3BvbnNlLnN0YXR1cyl9LmApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICB9LFxuICAgIGxvZyh0ZXh0KTogdm9pZCB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgJHt0ZXh0fVxcbmApO1xuICAgIH0sXG4gICAgc2hlbGwoY29tbWFuZCwgZW52KTogQ29tbWFuZFJlc3VsdCB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgPiAke2NvbW1hbmR9XFxuYCk7XG4gICAgICBjb25zdCByZXN1bHQgPSB0b1Jlc3VsdChzcGF3blN5bmMoY29tbWFuZCwgeyBlbmNvZGluZzogJ3V0Zi04JywgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi5lbnYgfSwgc2hlbGw6IHRydWUgfSkpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUocmVzdWx0Lm91dHB1dCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHN5bmMgb3B0aW9ucyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuXG4gKlxuICogYC0tZHJ5LXJ1bmAgcHJpbnRzIGVhY2ggUFIgaXQgd291bGQgb3BlbiBhbmQgY2hhbmdlcyBub3RoaW5nLiBgLS1vbmx5PTxuYW1lPlssPG5hbWU+XWAgbGltaXRzIHRoZSBzeW5jIHRvIHRob3NlXG4gKiBlbnRyaWVzLCBgLS1iYXNlPTxicmFuY2g+YCBuYW1lcyB0aGUgYnJhbmNoIHRoZSBQUnMgdGFyZ2V0IChgbWFpbmAgYnkgZGVmYXVsdCksIGFuZCBgLS1jb25maWc9PHBhdGg+YCBuYW1lcyB0aGVcbiAqIGB1cHN0cmVhbXMuanNvbmAgKHRoZSBvbmUgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGJ5IGRlZmF1bHQpLlxuICpcbiAqIEBwYXJhbSBjbGlBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIGFmdGVyIHRoZSBjb21tYW5kIG5hbWUuXG4gKiBAcmV0dXJucyBUaGUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3luY1Vwc3RyZWFtc0FyZ3VtZW50cyhjbGlBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogU3luY1Vwc3RyZWFtc09wdGlvbnMge1xuICBjb25zdCBrbm93biA9IFsnLS1kcnktcnVuJywgJy0tb25seT0nLCAnLS1iYXNlPScsICctLWNvbmZpZz0nXTtcbiAgY29uc3QgdW5rbm93biA9IGNsaUFyZ3VtZW50cy5maWx0ZXIoKGFyZ3VtZW50KSA9PiBrbm93bi5ldmVyeSgocHJlZml4KSA9PiAhKHByZWZpeC5lbmRzV2l0aCgnPScpID8gYXJndW1lbnQuc3RhcnRzV2l0aChwcmVmaXgpIDogYXJndW1lbnQgPT09IHByZWZpeCkpKTtcbiAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgc3luYy11cHN0cmVhbXM6IHVua25vd24gYXJndW1lbnQgJHt1bmtub3duLm1hcCgoYXJndW1lbnQpID0+IGBcIiR7YXJndW1lbnR9XCJgKS5qb2luKCcsICcpfS4gS25vd246IC0tZHJ5LXJ1biwgLS1vbmx5PSwgLS1iYXNlPSwgLS1jb25maWc9LmApO1xuICB9XG4gIHJldHVybiB7XG4gICAgYmFzZUJyYW5jaDogcmVhZE9wdGlvbihjbGlBcmd1bWVudHMsICdiYXNlJykgPz8gREVGQVVMVF9CQVNFX0JSQU5DSCxcbiAgICBjb25maWdQYXRoOiByZWFkT3B0aW9uKGNsaUFyZ3VtZW50cywgJ2NvbmZpZycpID8/IERFRkFVTFRfQ09ORklHX1BBVEgsXG4gICAgZHJ5UnVuOiBjbGlBcmd1bWVudHMuaW5jbHVkZXMoJy0tZHJ5LXJ1bicpLFxuICAgIG9ubHk6IHJlYWRPcHRpb24oY2xpQXJndW1lbnRzLCAnb25seScpPy5zcGxpdCgnLCcpLmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gJycpID8/IFtdXG4gIH07XG59XG5cbi8qKlxuICogUnVucyB0aGUgYHN5bmMtdXBzdHJlYW1zYCBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBjbGlBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIGFmdGVyIHRoZSBjb21tYW5kIG5hbWUuXG4gKiBAcGFyYW0gZGVwZW5kZW5jaWVzIC0gVGhlIG91dHNpZGUgd29ybGQuIFRoZSByZWFsIG9uZSB3aGVuIG9taXR0ZWQuXG4gKiBAcmV0dXJucyBUaGUgZXhpdCBjb2RlOiBgMWAgd2hlbiB0aGUgYXJndW1lbnRzIG9yIGB1cHN0cmVhbXMuanNvbmAgYXJlIHdyb25nIG9yIGFueSBlbnRyeSBmYWlsZWQsIGAwYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5TeW5jVXBzdHJlYW1zQ2xpKGNsaUFyZ3VtZW50czogcmVhZG9ubHkgc3RyaW5nW10sIGRlcGVuZGVuY2llczogU3luY0RlcGVuZGVuY2llcyA9IGNyZWF0ZU5vZGVTeW5jRGVwZW5kZW5jaWVzKCkpOiBQcm9taXNlPG51bWJlcj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBzeW5jVXBzdHJlYW1zKHBhcnNlU3luY1Vwc3RyZWFtc0FyZ3VtZW50cyhjbGlBcmd1bWVudHMpLCBkZXBlbmRlbmNpZXMpO1xuICAgIHJldHVybiByZXN1bHRzLnNvbWUoKHJlc3VsdCkgPT4gcmVzdWx0Lm91dGNvbWUgPT09ICdlcnJvcicpID8gMSA6IDA7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gQSB3cm9uZyBhcmd1bWVudCBvciBjb25maWcgaXMgdGhlIHVzZXIncyB0byBmaXgsIHNvIGl0IGdldHMgaXRzIG1lc3NhZ2UgcmF0aGVyIHRoYW4gYSBzdGFjayB0cmFjZS5cbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9XFxuYCk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn1cblxuLy8gQW4gZW1wdHkgdmFsdWUgY291bnRzIGFzIGFic2VudCwgYmVjYXVzZSBhIHdvcmtmbG93IHBhc3NlcyBhbiB1bnNldCBpbnB1dCBhcyBvbmUuXG5mdW5jdGlvbiByZWFkT3B0aW9uKGNsaUFyZ3VtZW50czogcmVhZG9ubHkgc3RyaW5nW10sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByZWZpeCA9IGAtLSR7bmFtZX09YDtcbiAgY29uc3QgdmFsdWUgPSBjbGlBcmd1bWVudHMuZmluZCgoYXJndW1lbnQpID0+IGFyZ3VtZW50LnN0YXJ0c1dpdGgocHJlZml4KSk/LnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICByZXR1cm4gdmFsdWUgPT09ICcnID8gdW5kZWZpbmVkIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHRvUmVzdWx0KHJlc3VsdDogU3Bhd25TeW5jUmV0dXJuczxzdHJpbmc+KTogQ29tbWFuZFJlc3VsdCB7XG4gIHJldHVybiByZXN1bHQuZXJyb3IgPyB7IGV4aXRDb2RlOiAxLCBvdXRwdXQ6IHJlc3VsdC5lcnJvci5tZXNzYWdlIH0gOiB7IGV4aXRDb2RlOiByZXN1bHQuc3RhdHVzID8/IDEsIG91dHB1dDogYCR7cmVzdWx0LnN0ZG91dH0ke3Jlc3VsdC5zdGRlcnJ9YCB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFTQSxTQUFTLGlCQUFpQjtBQUMxQixPQUFPLGFBQWE7QUFRcEIsU0FBUyxxQkFBcUI7QUFFOUIsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxzQkFBc0I7QUFRckIsU0FBUyw2QkFBK0M7QUFDN0QsU0FBTztBQUFBLElBQ0wsS0FBSyxNQUFNLFlBQVksS0FBb0I7QUFDekMsYUFBTyxTQUFTLFVBQVUsTUFBTSxZQUFZLEVBQUUsVUFBVSxTQUFTLEtBQUssRUFBRSxHQUFHLFFBQVEsS0FBSyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7QUFBQSxJQUNyRztBQUFBLElBQ0EsTUFBTSxVQUFVLEtBQXVCO0FBQ3JDLFlBQU0sVUFBa0MsRUFBRSxRQUFRLDhCQUE4QjtBQUNoRixZQUFNLFFBQVEsUUFBUSxJQUFJLGNBQWM7QUFDeEMsVUFBSSxTQUFTLElBQUksV0FBVyx5QkFBeUIsR0FBRztBQUN0RCxnQkFBUSxlQUFlLElBQUksVUFBVSxLQUFLO0FBQUEsTUFDNUM7QUFDQSxZQUFNLFdBQVcsTUFBTSxNQUFNLEtBQUssRUFBRSxRQUFRLENBQUM7QUFDN0MsVUFBSSxDQUFDLFNBQVMsSUFBSTtBQUNoQixjQUFNLElBQUksTUFBTSxPQUFPLEdBQUcs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