projen 0.100.2 → 0.100.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/.jsii +137 -76
  2. package/lib/ai-instructions.js +2 -2
  3. package/lib/awscdk/auto-discover.js +6 -6
  4. package/lib/awscdk/awscdk-app-java.js +1 -1
  5. package/lib/awscdk/awscdk-app-py.js +1 -1
  6. package/lib/awscdk/awscdk-app-ts.js +4 -4
  7. package/lib/awscdk/awscdk-construct.js +1 -1
  8. package/lib/awscdk/awscdk-deps-java.js +1 -1
  9. package/lib/awscdk/awscdk-deps-js.js +1 -1
  10. package/lib/awscdk/awscdk-deps-py.js +1 -1
  11. package/lib/awscdk/awscdk-deps.js +1 -1
  12. package/lib/awscdk/cdk-config.js +3 -3
  13. package/lib/awscdk/cdk-tasks.js +1 -1
  14. package/lib/awscdk/integration-test.js +1 -1
  15. package/lib/awscdk/lambda-extension.js +1 -1
  16. package/lib/awscdk/lambda-function.js +2 -2
  17. package/lib/build/build-workflow.js +1 -1
  18. package/lib/cdk/auto-discover-base.js +2 -2
  19. package/lib/cdk/construct-lib.js +1 -1
  20. package/lib/cdk/integration-test-base.js +1 -1
  21. package/lib/cdk/jsii-build.js +1 -1
  22. package/lib/cdk/jsii-docgen.js +1 -1
  23. package/lib/cdk/jsii-project.js +1 -1
  24. package/lib/cdk8s/auto-discover.js +2 -2
  25. package/lib/cdk8s/cdk8s-app-py.js +1 -1
  26. package/lib/cdk8s/cdk8s-app-ts.js +1 -1
  27. package/lib/cdk8s/cdk8s-construct.js +1 -1
  28. package/lib/cdk8s/cdk8s-deps-py.js +1 -1
  29. package/lib/cdk8s/cdk8s-deps.js +1 -1
  30. package/lib/cdk8s/integration-test.js +1 -1
  31. package/lib/cdktf/cdktf-construct.js +1 -1
  32. package/lib/circleci/circleci.js +1 -1
  33. package/lib/component.js +1 -1
  34. package/lib/dependencies.js +1 -1
  35. package/lib/dev-env.js +1 -1
  36. package/lib/docker-compose/docker-compose-service.js +1 -1
  37. package/lib/docker-compose/docker-compose.js +1 -1
  38. package/lib/file.js +1 -1
  39. package/lib/gitattributes.js +1 -1
  40. package/lib/github/actions-provider.js +1 -1
  41. package/lib/github/auto-approve.js +1 -1
  42. package/lib/github/auto-merge.js +1 -1
  43. package/lib/github/auto-queue.js +1 -1
  44. package/lib/github/dependabot.js +1 -1
  45. package/lib/github/dependency-review.js +1 -1
  46. package/lib/github/github-credentials.js +1 -1
  47. package/lib/github/github-project.js +1 -1
  48. package/lib/github/github.js +1 -1
  49. package/lib/github/merge-queue.js +1 -1
  50. package/lib/github/mergify.js +1 -1
  51. package/lib/github/pr-template.js +1 -1
  52. package/lib/github/pull-request-backport.js +1 -1
  53. package/lib/github/pull-request-lint.js +1 -1
  54. package/lib/github/stale.js +1 -1
  55. package/lib/github/task-workflow-job.js +1 -1
  56. package/lib/github/task-workflow.js +1 -1
  57. package/lib/github/workflow-actions.js +1 -1
  58. package/lib/github/workflow-jobs.js +1 -1
  59. package/lib/github/workflow-steps.js +1 -1
  60. package/lib/github/workflows.js +1 -1
  61. package/lib/gitlab/configuration.js +1 -1
  62. package/lib/gitlab/gitlab-configuration.js +1 -1
  63. package/lib/gitlab/nested-configuration.js +1 -1
  64. package/lib/gitpod.js +1 -1
  65. package/lib/ignore-file.js +1 -1
  66. package/lib/ini.js +1 -1
  67. package/lib/java/java-project.js +1 -1
  68. package/lib/java/junit.js +1 -1
  69. package/lib/java/maven-compile.js +1 -1
  70. package/lib/java/maven-packaging.js +1 -1
  71. package/lib/java/maven-sample.js +1 -1
  72. package/lib/java/pom.js +2 -2
  73. package/lib/java/projenrc.js +1 -1
  74. package/lib/javascript/biome/biome.js +1 -1
  75. package/lib/javascript/bundler.js +1 -1
  76. package/lib/javascript/eslint.d.ts +36 -0
  77. package/lib/javascript/eslint.js +40 -3
  78. package/lib/javascript/jest.js +4 -4
  79. package/lib/javascript/license-checker.js +1 -1
  80. package/lib/javascript/node-package.js +1 -1
  81. package/lib/javascript/node-project.js +1 -1
  82. package/lib/javascript/npm-config.js +1 -1
  83. package/lib/javascript/prettier.js +1 -1
  84. package/lib/javascript/projenrc.js +1 -1
  85. package/lib/javascript/typescript-config.js +2 -2
  86. package/lib/javascript/upgrade-dependencies.js +2 -2
  87. package/lib/javascript/yarnrc.js +1 -1
  88. package/lib/json-patch.js +1 -1
  89. package/lib/json.js +1 -1
  90. package/lib/license.js +1 -1
  91. package/lib/logger.js +1 -1
  92. package/lib/makefile.js +1 -1
  93. package/lib/object-file.js +1 -1
  94. package/lib/project-build.js +1 -1
  95. package/lib/project-tree.js +1 -1
  96. package/lib/project.js +1 -1
  97. package/lib/projects.js +1 -1
  98. package/lib/projenrc-json.js +1 -1
  99. package/lib/projenrc.js +1 -1
  100. package/lib/python/pip.js +1 -1
  101. package/lib/python/poetry.js +2 -2
  102. package/lib/python/projenrc.js +1 -1
  103. package/lib/python/pyproject-toml-file.js +1 -1
  104. package/lib/python/pytest-sample.js +1 -1
  105. package/lib/python/pytest.js +1 -1
  106. package/lib/python/python-project.js +1 -1
  107. package/lib/python/python-sample.js +1 -1
  108. package/lib/python/requirements-file.js +1 -1
  109. package/lib/python/setuppy.js +1 -1
  110. package/lib/python/setuptools.js +1 -1
  111. package/lib/python/uv.js +1 -1
  112. package/lib/python/venv.js +1 -1
  113. package/lib/readme.js +1 -1
  114. package/lib/release/publisher.js +1 -1
  115. package/lib/release/release-trigger.js +1 -1
  116. package/lib/release/release.js +1 -1
  117. package/lib/renovatebot.js +1 -1
  118. package/lib/run-task.cjs +3 -3
  119. package/lib/sample-file.js +2 -2
  120. package/lib/source-code.js +1 -1
  121. package/lib/task.js +1 -1
  122. package/lib/tasks.js +1 -1
  123. package/lib/testing.js +1 -1
  124. package/lib/textfile.js +1 -1
  125. package/lib/toml.js +1 -1
  126. package/lib/typescript/projenrc-ts.js +1 -1
  127. package/lib/typescript/projenrc.d.ts +2 -0
  128. package/lib/typescript/projenrc.js +27 -6
  129. package/lib/typescript/typescript-typedoc.js +1 -1
  130. package/lib/typescript/typescript.d.ts +27 -3
  131. package/lib/typescript/typescript.js +87 -28
  132. package/lib/version.js +2 -2
  133. package/lib/vscode/devcontainer.js +1 -1
  134. package/lib/vscode/extensions.js +1 -1
  135. package/lib/vscode/launch-config.js +1 -1
  136. package/lib/vscode/settings.js +1 -1
  137. package/lib/vscode/vscode.js +1 -1
  138. package/lib/web/next.js +3 -3
  139. package/lib/web/postcss.js +1 -1
  140. package/lib/web/react.js +3 -3
  141. package/lib/web/tailwind.js +1 -1
  142. package/lib/xmlfile.js +1 -1
  143. package/lib/yaml.js +1 -1
  144. package/node_modules/semver/classes/range.js +6 -2
  145. package/node_modules/semver/package.json +1 -1
  146. package/package.json +3 -3
@@ -52,7 +52,7 @@ const util_2 = require("../util");
52
52
  */
53
53
  class TsJestBabelConfig {
54
54
  config;
55
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TsJestBabelConfig", version: "0.100.2" };
55
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TsJestBabelConfig", version: "0.100.4" };
56
56
  /**
57
57
  * Disables the use of Babel
58
58
  */
@@ -99,7 +99,7 @@ exports.TsJestBabelConfig = TsJestBabelConfig;
99
99
  */
100
100
  class TsJestDiagnostics {
101
101
  config;
102
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TsJestDiagnostics", version: "0.100.2" };
102
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TsJestDiagnostics", version: "0.100.4" };
103
103
  /**
104
104
  * Enable all diagnostics.
105
105
  */
@@ -137,7 +137,7 @@ exports.TsJestDiagnostics = TsJestDiagnostics;
137
137
  */
138
138
  class TsJestTsconfig {
139
139
  config;
140
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TsJestTsconfig", version: "0.100.2" };
140
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TsJestTsconfig", version: "0.100.4" };
141
141
  /**
142
142
  * Uses `tsconfig.json` if found, or the built-in default TypeScript compiler options.
143
143
  */
@@ -183,7 +183,7 @@ exports.TsJestTsconfig = TsJestTsconfig;
183
183
  * @pjid typescript
184
184
  */
185
185
  class TypeScriptProject extends javascript_1.NodeProject {
186
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TypeScriptProject", version: "0.100.2" };
186
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TypeScriptProject", version: "0.100.4" };
187
187
  static DEFAULT_TS_JEST_TRANFORM_PATTERN = "^.+\\.[t]sx?$";
188
188
  docgen;
189
189
  docsDirectory;
@@ -250,28 +250,22 @@ class TypeScriptProject extends javascript_1.NodeProject {
250
250
  if (options.disableTsconfigDev && options.disableTsconfig) {
251
251
  throw new Error("Cannot specify both 'disableTsconfigDev' and 'disableTsconfig' fields.");
252
252
  }
253
- if (!options.disableTsconfig) {
254
- this.tsconfig = new javascript_1.TypescriptConfig(this, mergeTsconfigOptions({
255
- include: [`${this.srcdir}/**/*.ts`],
256
- exclude: ["node_modules"],
257
- compilerOptions: {
258
- rootDir: this.srcdir,
259
- outDir: this.libdir,
260
- ...this.defaultTypeScriptCompilerOptions(),
261
- },
262
- }, options.tsconfig));
253
+ const shouldHaveTsconfig = !options.disableTsconfig;
254
+ const shouldHaveDevTsconfig = !options.disableTsconfigDev;
255
+ if (shouldHaveTsconfig) {
256
+ this.tsconfig = this.makeTsconfig(options);
263
257
  }
264
- if (options.disableTsconfigDev) {
265
- this.tsconfigDev = this.tsconfig;
258
+ if (shouldHaveDevTsconfig) {
259
+ // When a root tsconfig exists, the dev/test config lives inside the test
260
+ // directory and extends it; otherwise it is a self-contained config at
261
+ // the repository root.
262
+ this.tsconfigDev = this.tsconfig
263
+ ? this.makeDevTsconfig(options, this.tsconfig)
264
+ : this.makeStandaloneDevTsconfig(options);
266
265
  }
267
266
  else {
268
- const tsconfigDevFile = options.tsconfigDevFile ?? "tsconfig.dev.json";
269
- this.tsconfigDev = new javascript_1.TypescriptConfig(this, mergeTsconfigOptions({
270
- fileName: tsconfigDevFile,
271
- include: [`${this.srcdir}/**/*.ts`, `${this.testdir}/**/*.ts`],
272
- exclude: ["node_modules"],
273
- compilerOptions: this.defaultTypeScriptCompilerOptions(),
274
- }, options.tsconfig, options.tsconfigDev));
267
+ // `disableTsconfigDev`: reuse the main tsconfig as the dev config.
268
+ this.tsconfigDev = this.tsconfig;
275
269
  }
276
270
  this.gitignore.include(`/${this.srcdir}/`);
277
271
  this.npmignore?.exclude(`/${this.srcdir}/`);
@@ -313,7 +307,8 @@ class TypeScriptProject extends javascript_1.NodeProject {
313
307
  }
314
308
  if (eslintEnabled) {
315
309
  this.eslint = new javascript_1.Eslint(this, {
316
- tsconfigPath: `./${this.tsconfigDev.fileName}`,
310
+ tsconfigPath: `./${(this.tsconfig ?? this.tsconfigDev).fileName}`,
311
+ projectService: true,
317
312
  dirs: [this.srcdir],
318
313
  devdirs: [this.testdir, "build-tools"],
319
314
  fileExtensions: [".ts", ".tsx"],
@@ -331,9 +326,12 @@ class TypeScriptProject extends javascript_1.NodeProject {
331
326
  new typescript_1.Projenrc(this, options.projenrcTsOptions);
332
327
  }
333
328
  else {
334
- // projenrc.js created in NodeProject needs to be added in tsconfigDev
329
+ // projenrc.js created in NodeProject needs to be added in tsconfigDev.
330
+ // Only relevant when the dev config lives at the repository root
331
+ // (i.e. it was not relocated into the test directory or aliased to the
332
+ // root tsconfig); otherwise the include path would not resolve.
335
333
  const projenrcJs = javascript_1.Projenrc.of(this);
336
- if (projenrcJs) {
334
+ if (projenrcJs && shouldHaveDevTsconfig && !shouldHaveTsconfig) {
337
335
  this.tsconfigDev.addInclude(projenrcJs.filePath);
338
336
  }
339
337
  }
@@ -351,6 +349,67 @@ class TypeScriptProject extends javascript_1.NodeProject {
351
349
  new typescript_1.TypedocDocgen(this);
352
350
  }
353
351
  }
352
+ /**
353
+ * The main `tsconfig.json` used to compile the project (src -> lib).
354
+ */
355
+ makeTsconfig(options) {
356
+ return new javascript_1.TypescriptConfig(this, mergeTsconfigOptions({
357
+ include: [`${this.srcdir}/**/*.ts`],
358
+ exclude: ["node_modules"],
359
+ compilerOptions: {
360
+ rootDir: this.srcdir,
361
+ outDir: this.libdir,
362
+ ...this.defaultTypeScriptCompilerOptions(),
363
+ },
364
+ }, options.tsconfig));
365
+ }
366
+ /**
367
+ * The development/test tsconfig, placed inside the test directory so that the
368
+ * TypeScript language service picks it up for test files. `tsserver` (and
369
+ * editors like VS Code >= 1.114, which bundle TypeScript 6) resolve the
370
+ * nearest `tsconfig.json` starting from the source file and no longer
371
+ * discover a differently-named config (e.g. `tsconfig.dev.json`) at the root.
372
+ *
373
+ * It extends the root tsconfig and is type-check only (`noEmit`), so it never
374
+ * participates in the build.
375
+ */
376
+ makeDevTsconfig(options, tsconfig) {
377
+ const tsconfigDevFile = options.tsconfigDevFile ?? `${this.testdir}/tsconfig.json`;
378
+ // The root tsconfig sets `rootDir` to the source directory. Since this
379
+ // config also type-checks files outside `src` (the tests, and `src` files
380
+ // pulled in via imports), point `rootDir` at the project root relative to
381
+ // the config's own location to avoid TS6059 ("not under rootDir"). This
382
+ // only affects the (suppressed) emit layout.
383
+ const rootDir = path.posix.relative(path.posix.dirname(tsconfigDevFile), ".") || ".";
384
+ const devTsconfig = new javascript_1.TypescriptConfig(this, mergeTsconfigOptions({
385
+ fileName: tsconfigDevFile,
386
+ // include is relative to the config's directory (the test dir)
387
+ include: ["**/*.ts"],
388
+ exclude: ["node_modules"],
389
+ compilerOptions: {
390
+ // type-check only; the root tsconfig owns compilation
391
+ noEmit: true,
392
+ rootDir,
393
+ },
394
+ }, options.tsconfigDev));
395
+ // inherit all compiler options (including the dynamically resolved `types`)
396
+ // from the root tsconfig.
397
+ devTsconfig.addExtends(tsconfig);
398
+ return devTsconfig;
399
+ }
400
+ /**
401
+ * A self-contained development tsconfig at the repository root, used when
402
+ * there is no root tsconfig to extend (e.g. `disableTsconfig`).
403
+ */
404
+ makeStandaloneDevTsconfig(options) {
405
+ const tsconfigDevFile = options.tsconfigDevFile ?? "tsconfig.dev.json";
406
+ return new javascript_1.TypescriptConfig(this, mergeTsconfigOptions({
407
+ fileName: tsconfigDevFile,
408
+ include: [`${this.srcdir}/**/*.ts`, `${this.testdir}/**/*.ts`],
409
+ exclude: ["node_modules"],
410
+ compilerOptions: this.defaultTypeScriptCompilerOptions(),
411
+ }, options.tsconfig, options.tsconfigDev));
412
+ }
354
413
  /**
355
414
  * Projen default Typescript compiler options.
356
415
  */
@@ -557,7 +616,7 @@ class SampleCode extends component_1.Component {
557
616
  * @pjid typescript-app
558
617
  */
559
618
  class TypeScriptAppProject extends TypeScriptProject {
560
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TypeScriptAppProject", version: "0.100.2" };
619
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TypeScriptAppProject", version: "0.100.4" };
561
620
  constructor(options) {
562
621
  // Releasing and packaging are coupled. If one is disabled, disable the other by default.
563
622
  const shouldRelease = options.release ?? false;
@@ -587,4 +646,4 @@ function mergeTsconfigOptions(...options) {
587
646
  },
588
647
  }), { compilerOptions: {} });
589
648
  }
590
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlc2NyaXB0L3R5cGVzY3JpcHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbzJCQSxvREFpQkM7O0FBcjNCRCwyQ0FBNkI7QUFDN0IsK0NBQWlDO0FBQ2pDLHNDQUF1QztBQUN2Qyw0Q0FBeUM7QUFDekMsa0RBQWlEO0FBUWpELDhDQU11QjtBQUN2Qiw2Q0FBMEQ7QUFDMUQsZ0RBQTJDO0FBRTNDLDBDQUF1QztBQUV2Qyw4Q0FBc0U7QUFDdEUsa0NBQThFO0FBRTlFOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFtQ1Q7O0lBbENuQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxRQUFRO1FBQ3BCLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxnQkFBZ0I7UUFDNUIsT0FBTyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFnQjtRQUNyQyxPQUFPLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBMkI7UUFDOUMsT0FBTyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxZQUNtQixNQUE4QztRQUE5QyxXQUFNLEdBQU4sTUFBTSxDQUF3QztJQUM5RCxDQUFDO0lBRUo7OztPQUdHO0lBQ0ksTUFBTTtRQUNYLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDOztBQTVDSCw4Q0E2Q0M7QUFFRDs7R0FFRztBQUNILE1BQWEsaUJBQWlCO0lBd0JTOztJQXZCckM7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QUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLGVBQWUsRUFBRTtZQUNmLEdBQUcsUUFBUSxDQUFDLGVBQWU7WUFDM0IsR0FBRyxPQUFPLENBQUMsZUFBZTtTQUMzQjtLQUNGLENBQUMsRUFDRixFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsQ0FDeEIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBzZW12ZXIgZnJvbSBcInNlbXZlclwiO1xuaW1wb3J0IHsgUFJPSkVOX0RJUiB9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIuLi9jb21wb25lbnRcIjtcbmltcG9ydCB7IERlcGVuZGVuY3lUeXBlIH0gZnJvbSBcIi4uL2RlcGVuZGVuY2llc1wiO1xuaW1wb3J0IHR5cGUge1xuICBFc2xpbnRPcHRpb25zLFxuICBKZXN0LFxuICBOb2RlUHJvamVjdE9wdGlvbnMsXG4gIFR5cGVTY3JpcHRDb21waWxlck9wdGlvbnMsXG4gIFR5cGVzY3JpcHRDb25maWdPcHRpb25zLFxufSBmcm9tIFwiLi4vamF2YXNjcmlwdFwiO1xuaW1wb3J0IHtcbiAgRXNsaW50LFxuICBOb2RlUHJvamVjdCxcbiAgUHJvamVucmMgYXMgTm9kZVByb2plY3RQcm9qZW5yYyxcbiAgVHJhbnNmb3JtLFxuICBUeXBlc2NyaXB0Q29uZmlnLFxufSBmcm9tIFwiLi4vamF2YXNjcmlwdFwiO1xuaW1wb3J0IHsgaGFzRGVwZW5kZW5jeVZlcnNpb24gfSBmcm9tIFwiLi4vamF2YXNjcmlwdC91dGlsXCI7XG5pbXBvcnQgeyBTYW1wbGVEaXIgfSBmcm9tIFwiLi4vc2FtcGxlLWZpbGVcIjtcbmltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gXCIuLi90YXNrXCI7XG5pbXBvcnQgeyBUZXh0RmlsZSB9IGZyb20gXCIuLi90ZXh0ZmlsZVwiO1xuaW1wb3J0IHR5cGUgeyBQcm9qZW5yY09wdGlvbnMgYXMgUHJvamVucmNUc09wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNjcmlwdFwiO1xuaW1wb3J0IHsgUHJvamVucmMgYXMgUHJvamVucmNUcywgVHlwZWRvY0RvY2dlbiB9IGZyb20gXCIuLi90eXBlc2NyaXB0XCI7XG5pbXBvcnQgeyBkZWVwTWVyZ2UsIG11bHRpcGxlU2VsZWN0ZWQsIG5vcm1hbGl6ZVBlcnNpc3RlZFBhdGggfSBmcm9tIFwiLi4vdXRpbFwiO1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9rdWxzaGVraGFyLmdpdGh1Yi5pby90cy1qZXN0L2RvY3MvZ2V0dGluZy1zdGFydGVkL29wdGlvbnMvYmFiZWxDb25maWcvXG4gKi9cbmV4cG9ydCBjbGFzcyBUc0plc3RCYWJlbENvbmZpZyB7XG4gIC8qKlxuICAgKiBEaXNhYmxlcyB0aGUgdXNlIG9mIEJhYmVsXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRpc2FibGVkKCkge1xuICAgIHJldHVybiBuZXcgVHNKZXN0QmFiZWxDb25maWcoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgQmFiZWwgcHJvY2Vzc2luZ1xuICAgKlxuICAgKiBgdHMtamVzdGAgd2lsbCB0cnkgdG8gZmluZCBhbiBleGlzdGluZyBCYWJlbCBjb25maWd1cmF0aW9uIGFuZCBwYXNzIGl0IHRvIHRoZSBgYmFiZWwtamVzdGAgcHJvY2Vzc29yLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhdXRvRGV0ZWN0Q29uZmlnKCkge1xuICAgIHJldHVybiBuZXcgVHNKZXN0QmFiZWxDb25maWcodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUGF0aCB0byBhIGJhYmVscmMgZmlsZVxuICAgKlxuICAgKiBUaGUgcGF0aCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgd2hlcmUgeW91IHN0YXJ0IEplc3QgZnJvbS4gWW91IGNhbiBhbHNvIHVzZSBgPHJvb3REaXI+YCBpbiB0aGUgcGF0aC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUZpbGUoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgVHNKZXN0QmFiZWxDb25maWcoZmlsZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIElubGluZSBjb21waWxlciBvcHRpb25zXG4gICAqIEBzZWUgaHR0cHM6Ly9iYWJlbGpzLmlvL2RvY3Mvb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjdXN0b20oY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgcmV0dXJuIG5ldyBUc0plc3RCYWJlbENvbmZpZyhjb25maWcpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogYm9vbGVhbiB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICkge31cblxuICAvKipcbiAgICogQGpzaWkgaWdub3JlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpOiBib29sZWFuIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2t1bHNoZWtoYXIuZ2l0aHViLmlvL3RzLWplc3QvZG9jcy9nZXR0aW5nLXN0YXJ0ZWQvb3B0aW9ucy9kaWFnbm9zdGljcy9cbiAqL1xuZXhwb3J0IGNsYXNzIFRzSmVzdERpYWdub3N0aWNzIHtcbiAgLyoqXG4gICAqIEVuYWJsZSBhbGwgZGlhZ25vc3RpY3MuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFsbCgpIHtcbiAgICByZXR1cm4gbmV3IFRzSmVzdERpYWdub3N0aWNzKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgYWxsIGRpYWdub3N0aWNzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBub25lKCkge1xuICAgIHJldHVybiBuZXcgVHNKZXN0RGlhZ25vc3RpY3MoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgYSBjdXN0b20gZGlhZ25vc3RpY3MgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2t1bHNoZWtoYXIuZ2l0aHViLmlvL3RzLWplc3QvZG9jcy9nZXR0aW5nLXN0YXJ0ZWQvb3B0aW9ucy9kaWFnbm9zdGljcy9cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3VzdG9tKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHJldHVybiBuZXcgVHNKZXN0RGlhZ25vc3RpY3MoY29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb25maWc6IGJvb2xlYW4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7fVxuXG4gIC8qKlxuICAgKiBAanNpaSBpZ25vcmVcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgdG9KU09OKCk6IGJvb2xlYW4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8va3Vsc2hla2hhci5naXRodWIuaW8vdHMtamVzdC9kb2NzL2dldHRpbmctc3RhcnRlZC9vcHRpb25zL3RzY29uZmlnL1xuICovXG5leHBvcnQgY2xhc3MgVHNKZXN0VHNjb25maWcge1xuICAvKipcbiAgICogVXNlcyBgdHNjb25maWcuanNvbmAgaWYgZm91bmQsIG9yIHRoZSBidWlsdC1pbiBkZWZhdWx0IFR5cGVTY3JpcHQgY29tcGlsZXIgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXV0bygpIHtcbiAgICByZXR1cm4gbmV3IFRzSmVzdFRzY29uZmlnKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlYCB0cy1qZXN0YCB0byB1c2UgaXRzIGJ1aWx0LWluIGRlZmF1bHRzIGV2ZW4gaWYgdGhlcmUgaXMgYSBgdHNjb25maWcuanNvbmAgaW4geW91ciBwcm9qZWN0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBidWlsdEluRGVmYXVsdHMoKSB7XG4gICAgcmV0dXJuIG5ldyBUc0plc3RUc2NvbmZpZyhmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogUGF0aCB0byBhIGB0c2NvbmZpZ2AgZmlsZVxuICAgKlxuICAgKiBUaGUgcGF0aCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgd2hlcmUgeW91IHN0YXJ0IEplc3QgZnJvbS4gWW91IGNhbiBhbHNvIHVzZSBgPHJvb3REaXI+YCBpbiB0aGUgcGF0aCB0byBzdGFydCBmcm9tIHRoZSBwcm9qZWN0IHJvb3QgZGlyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRmlsZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBUc0plc3RUc2NvbmZpZyhmaWxlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogSW5saW5lIGNvbXBpbGVyIG9wdGlvbnNcbiAgICpcbiAgICogQHNlZSBUeXBlU2NyaXB0Q29tcGlsZXJPcHRpb25zXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGN1c3RvbShjb25maWc6IFR5cGVTY3JpcHRDb21waWxlck9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFRzSmVzdFRzY29uZmlnKGNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBib29sZWFuIHwgc3RyaW5nIHwgVHlwZVNjcmlwdENvbXBpbGVyT3B0aW9ucyxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBAanNpaSBpZ25vcmVcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgdG9KU09OKCk6IGJvb2xlYW4gfCBzdHJpbmcgfCBUeXBlU2NyaXB0Q29tcGlsZXJPcHRpb25zIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8va3Vsc2hla2hhci5naXRodWIuaW8vdHMtamVzdC9kb2NzL2dldHRpbmctc3RhcnRlZC9vcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHNKZXN0VHJhbnNmb3JtT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDdXN0b20gVHlwZVNjcmlwdCBBU1QgdHJhbnNmb3JtZXJzXG4gICAqXG4gICAqIEBkZWZhdWx0IGF1dG9cbiAgICovXG4gIHJlYWRvbmx5IGFzdFRyYW5zZm9ybWVycz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKlxuICAgKiBCYWJlbChKZXN0KSByZWxhdGVkIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IFRzSmVzdEJhYmVsQ29uZmlnLmRpc2FibGVkKClcbiAgICovXG4gIHJlYWRvbmx5IGJhYmVsQ29uZmlnPzogVHNKZXN0QmFiZWxDb25maWc7XG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IG1vZHVsZSB0byB1c2UgYXMgY29tcGlsZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwidHlwZXNjcmlwdFwiXG4gICAqL1xuICByZWFkb25seSBjb21waWxlcj86IHN0cmluZztcbiAgLyoqXG4gICAqIERpYWdub3N0aWNzIHJlbGF0ZWQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgVHNKZXN0RGlhZ25vc3RpY3MuYWxsKClcbiAgICovXG4gIHJlYWRvbmx5IGRpYWdub3N0aWNzPzogVHNKZXN0RGlhZ25vc3RpY3M7XG4gIC8qKlxuICAgKiBSdW4gdHMtamVzdCB0ZXN0cyB3aXRoIHRoaXMgVFNDb25maWcgaXNvbGF0ZWRNb2R1bGVzIHNldHRpbmcuXG4gICAqXG4gICAqIFlvdSdsbCBsb3NlIHR5cGUtY2hlY2tpbmcgYWJpbGl0eSBhbmQgc29tZSBmZWF0dXJlcyBzdWNoIGFzIGNvbnN0IGVudW0sIGJ1dCBpbiB0aGUgY2FzZSB5b3UgcGxhbiBvbiB1c2luZyBKZXN0IHdpdGggdGhlIGNhY2hlIGRpc2FibGVkIChqZXN0IC0tbm8tY2FjaGUpLCB5b3VyIHRlc3RzIHdpbGwgdGhlbiBydW4gbXVjaCBmYXN0ZXIuXG4gICAqIEBzZWUgaHR0cHM6Ly9rdWxzaGVraGFyLmdpdGh1Yi5pby90cy1qZXN0L2RvY3MvZ2V0dGluZy1zdGFydGVkL29wdGlvbnMvaXNvbGF0ZWRNb2R1bGVzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpc29sYXRlZE1vZHVsZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogRmlsZXMgd2hpY2ggd2lsbCBiZWNvbWUgbW9kdWxlcyByZXR1cm5pbmcgc2VsZiBjb250ZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBkaXNhYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgc3RyaW5naWZ5Q29udGVudFBhdGhSZWdleD86IHN0cmluZztcbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgY29tcGlsZXIgcmVsYXRlZCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFlvdXIgcHJvamVjdCdzIGB0c2NvbmZpZ0RldmAgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRzY29uZmlnPzogVHNKZXN0VHNjb25maWc7XG4gIC8qKlxuICAgKiBFbmFibGUgRVNNIHN1cHBvcnRcbiAgICpcbiAgICogQGRlZmF1bHQgYXV0b1xuICAgKi9cbiAgcmVhZG9ubHkgdXNlRVNNPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUc0plc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoaWNoIGZpbGVzIHNob3VsZCB0cy1qZXN0IGFjdCB1cG9uLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vamVzdGpzLmlvL2RvY3MvY29uZmlndXJhdGlvbiN0cmFuc2Zvcm0tb2JqZWN0c3RyaW5nLXBhdGh0b3RyYW5zZm9ybWVyLS1wYXRodG90cmFuc2Zvcm1lci1vYmplY3RcbiAgICpcbiAgICogQGRlZmF1bHQgXCJeLitcXFxcLlt0XXN4PyRcIlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNmb3JtUGF0dGVybj86IHN0cmluZztcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHRzLWplc3QgdHJhbnNmb3JtZXIgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zZm9ybU9wdGlvbnM/OiBUc0plc3RUcmFuc2Zvcm1PcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucyBleHRlbmRzIE5vZGVQcm9qZWN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUeXBlc2NyaXB0ICBhcnRpZmFjdHMgb3V0cHV0IGRpcmVjdG9yeVxuICAgKlxuICAgKiBAZGVmYXVsdCBcImxpYlwiXG4gICAqL1xuICByZWFkb25seSBsaWJkaXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFR5cGVzY3JpcHQgc291cmNlcyBkaXJlY3RvcnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwic3JjXCJcbiAgICovXG4gIHJlYWRvbmx5IHNyY2Rpcj86IHN0cmluZztcblxuICAvKipcbiAgICogSmVzdCB0ZXN0cyBkaXJlY3RvcnkuIFRlc3RzIGZpbGVzIHNob3VsZCBiZSBuYW1lZCBgeHh4LnRlc3QudHNgLlxuICAgKlxuICAgKiBJZiB0aGlzIGRpcmVjdG9yeSBpcyB1bmRlciBgc3JjZGlyYCAoZS5nLiBgc3JjL3Rlc3RgLCBgc3JjL19fdGVzdHNfX2ApLFxuICAgKiB0aGVuIHRlc3RzIGFyZSBnb2luZyB0byBiZSBjb21waWxlZCBpbnRvIGBsaWIvYCBhbmQgZXhlY3V0ZWQgYXMgamF2YXNjcmlwdC5cbiAgICogSWYgdGhlIHRlc3QgZGlyZWN0b3J5IGlzIG91dHNpZGUgb2YgYHNyY2AsIHRoZW4gd2UgY29uZmlndXJlIGplc3QgdG9cbiAgICogY29tcGlsZSB0aGUgY29kZSBpbi1tZW1vcnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwidGVzdFwiXG4gICAqL1xuICByZWFkb25seSB0ZXN0ZGlyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZXR1cCBlc2xpbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdHJ1ZSwgdW5sZXNzIGJpb21lIGlzIGVuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVzbGludD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVzbGludCBvcHRpb25zXG4gICAqIEBkZWZhdWx0IC0gb3BpbmlvbmF0ZWQgZGVmYXVsdCBvcHRpb25zXG4gICAqL1xuICByZWFkb25seSBlc2xpbnRPcHRpb25zPzogRXNsaW50T3B0aW9ucztcblxuICAvKipcbiAgICogVHlwZVNjcmlwdCB2ZXJzaW9uIHRvIHVzZS5cbiAgICpcbiAgICogTk9URTogVHlwZXNjcmlwdCBpcyBub3Qgc2VtYW50aWNhbGx5IHZlcnNpb25lZCBhbmQgc2hvdWxkIHJlbWFpbiBvbiB0aGVcbiAgICogc2FtZSBtaW5vciwgc28gd2UgcmVjb21tZW5kIHVzaW5nIGEgYH5gIGRlcGVuZGVuY3kgKGUuZy4gYH4xLjIuM2ApLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImxhdGVzdFwiXG4gICAqL1xuICByZWFkb25seSB0eXBlc2NyaXB0VmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogRG9jZ2VuIGJ5IFR5cGVkb2NcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRvY2dlbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERvY3MgZGlyZWN0b3J5XG4gICAqXG4gICAqIEBkZWZhdWx0IFwiZG9jc1wiXG4gICAqL1xuICByZWFkb25seSBkb2NzRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gVFNDb25maWdcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IHRzY29uZmlnPzogVHlwZXNjcmlwdENvbmZpZ09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSB0c2NvbmZpZyBvcHRpb25zIGZvciB0aGUgZGV2ZWxvcG1lbnQgdHNjb25maWcuanNvbiBmaWxlICh1c2VkIGZvciB0ZXN0aW5nKS5cbiAgICogQGRlZmF1bHQgLSB1c2UgdGhlIHByb2R1Y3Rpb24gdHNjb25maWcgb3B0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgdHNjb25maWdEZXY/OiBUeXBlc2NyaXB0Q29uZmlnT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGRldmVsb3BtZW50IHRzY29uZmlnLmpzb24gZmlsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJ0c2NvbmZpZy5kZXYuanNvblwiXG4gICAqL1xuICByZWFkb25seSB0c2NvbmZpZ0RldkZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERvIG5vdCBnZW5lcmF0ZSBhIGB0c2NvbmZpZy5qc29uYCBmaWxlICh1c2VkIGJ5IGpzaWkgcHJvamVjdHMgc2luY2VcbiAgICogdHNjb25maWcuanNvbiBpcyBnZW5lcmF0ZWQgYnkgdGhlIGpzaWkgY29tcGlsZXIpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZVRzY29uZmlnPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIERvIG5vdCBnZW5lcmF0ZSBhIGB0c2NvbmZpZy5kZXYuanNvbmAgZmlsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRpc2FibGVUc2NvbmZpZ0Rldj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIG9uZS10aW1lIHNhbXBsZSBpbiBgc3JjL2AgYW5kIGB0ZXN0L2AgaWYgdGhlcmUgYXJlIG5vIGZpbGVzIHRoZXJlLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBzYW1wbGVDb2RlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIC5kLnRzIGZpbGUgdGhhdCBpbmNsdWRlcyB0aGUgdHlwZSBkZWNsYXJhdGlvbnMgZm9yIHRoaXMgbW9kdWxlLlxuICAgKiBAZGVmYXVsdCAtIC5kLnRzIGZpbGUgZGVyaXZlZCBmcm9tIHRoZSBwcm9qZWN0J3MgZW50cnlwb2ludCAodXN1YWxseSBsaWIvaW5kZXguZC50cylcbiAgICovXG4gIHJlYWRvbmx5IGVudHJ5cG9pbnRUeXBlcz86IHN0cmluZztcblxuICAvKipcbiAgICogVXNlIFR5cGVTY3JpcHQgZm9yIHlvdXIgcHJvamVucmMgZmlsZSAoYC5wcm9qZW5yYy50c2ApLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAcGpuZXcgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVucmNUcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIC5wcm9qZW5yYy50c1xuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVucmNUc09wdGlvbnM/OiBQcm9qZW5yY1RzT3B0aW9ucztcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3IgdHMtamVzdFxuICAgKi9cbiAgcmVhZG9ubHkgdHNKZXN0T3B0aW9ucz86IFRzSmVzdE9wdGlvbnM7XG59XG5cbi8qKlxuICogVHlwZVNjcmlwdCBwcm9qZWN0XG4gKiBAcGppZCB0eXBlc2NyaXB0XG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlU2NyaXB0UHJvamVjdCBleHRlbmRzIE5vZGVQcm9qZWN0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1RTX0pFU1RfVFJBTkZPUk1fUEFUVEVSTiA9IFwiXi4rXFxcXC5bdF1zeD8kXCI7XG5cbiAgcHVibGljIHJlYWRvbmx5IGRvY2dlbj86IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSBkb2NzRGlyZWN0b3J5OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBlc2xpbnQ/OiBFc2xpbnQ7XG4gIHB1YmxpYyByZWFkb25seSB0c2NvbmZpZ0VzbGludD86IFR5cGVzY3JpcHRDb25maWc7XG4gIHB1YmxpYyByZWFkb25seSB0c2NvbmZpZz86IFR5cGVzY3JpcHRDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgdHlwZXNjcmlwdCBjb25maWd1cmF0aW9uIGZpbGUgd2hpY2ggY292ZXJzIGFsbCBmaWxlcyAoc291cmNlcywgdGVzdHMsIHByb2plbikuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHNjb25maWdEZXY6IFR5cGVzY3JpcHRDb25maWc7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIC50cyBzb3VyY2VzIHJlc2lkZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzcmNkaXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpcmVjdG9yeSBpbiB3aGljaCBjb21waWxlZCAuanMgZmlsZXMgcmVzaWRlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxpYmRpcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIHRlc3RzIHJlc2lkZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0ZXN0ZGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBcIndhdGNoXCIgdGFzay5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB3YXRjaFRhc2s6IFRhc2s7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogVHlwZVNjcmlwdFByb2plY3RPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcblxuICAgICAgLy8gZGlzYWJsZSAucHJvamVucmMuanMgaWYgdHlwZXNjcmlwdCBpcyBlbmFibGVkXG4gICAgICBwcm9qZW5yY0pzOiBvcHRpb25zLnByb2plbnJjVHMgPyBmYWxzZSA6IG9wdGlvbnMucHJvamVucmNKcyxcblxuICAgICAgamVzdE9wdGlvbnM6IHtcbiAgICAgICAgLi4ub3B0aW9ucy5qZXN0T3B0aW9ucyxcbiAgICAgICAgamVzdENvbmZpZzoge1xuICAgICAgICAgIC4uLm9wdGlvbnMuamVzdE9wdGlvbnM/Lmplc3RDb25maWcsXG4gICAgICAgICAgdGVzdE1hdGNoOiBvcHRpb25zLmplc3RPcHRpb25zPy5qZXN0Q29uZmlnPy50ZXN0TWF0Y2ggPz8gW10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5zcmNkaXIgPSBvcHRpb25zLnNyY2RpciA/PyBcInNyY1wiO1xuICAgIHRoaXMubGliZGlyID0gb3B0aW9ucy5saWJkaXIgPz8gXCJsaWJcIjtcblxuICAgIHRoaXMuZG9jZ2VuID0gb3B0aW9ucy5kb2NnZW47XG4gICAgdGhpcy5kb2NzRGlyZWN0b3J5ID0gb3B0aW9ucy5kb2NzRGlyZWN0b3J5ID8/IFwiZG9jcy9cIjtcblxuICAgIGNvbnN0IHRzY29uZmlnRmlsZW5hbWUgPSBvcHRpb25zLnRzY29uZmlnPy5maWxlTmFtZTtcbiAgICB0aGlzLmNvbXBpbGVUYXNrLmV4ZWMoXG4gICAgICBbXCJ0c2NcIiwgXCItLWJ1aWxkXCIsIHRzY29uZmlnRmlsZW5hbWVdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKSxcbiAgICApO1xuXG4gICAgdGhpcy53YXRjaFRhc2sgPSB0aGlzLmFkZFRhc2soXCJ3YXRjaFwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJXYXRjaCAmIGNvbXBpbGUgaW4gdGhlIGJhY2tncm91bmRcIixcbiAgICAgIGV4ZWM6IFtcInRzY1wiLCBcIi0tYnVpbGRcIiwgXCItd1wiLCB0c2NvbmZpZ0ZpbGVuYW1lXVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5qb2luKFwiIFwiKSxcbiAgICB9KTtcblxuICAgIHRoaXMudGVzdGRpciA9IG9wdGlvbnMudGVzdGRpciA/PyBcInRlc3RcIjtcbiAgICB0aGlzLmdpdGlnbm9yZS5pbmNsdWRlKGAvJHt0aGlzLnRlc3RkaXJ9L2ApO1xuICAgIHRoaXMubnBtaWdub3JlPy5leGNsdWRlKGAvJHt0aGlzLnRlc3RkaXJ9L2ApO1xuXG4gICAgLy8gaWYgdGhlIHRlc3QgZGlyZWN0b3J5IGlzIHVuZGVyIGBzcmMvYCwgdGhlbiB3ZSB3aWxsIHJ1biBvdXIgdGVzdHMgYWdhaW5zdFxuICAgIC8vIHRoZSBqYXZhc2NyaXB0IGZpbGVzIGFuZCBub3QgbGV0IGplc3QgY29tcGlsZSBpdCBmb3IgdXMuXG4gICAgY29uc3QgY29tcGlsZWRUZXN0cyA9IHRoaXMudGVzdGRpci5zdGFydHNXaXRoKHRoaXMuc3JjZGlyICsgcGF0aC5wb3NpeC5zZXApO1xuXG4gICAgaWYgKG9wdGlvbnMuZW50cnlwb2ludFR5cGVzIHx8IHRoaXMucGFja2FnZS5lbnRyeXBvaW50ICE9PSBcIlwiKSB7XG4gICAgICBjb25zdCBlbnRyeXBvaW50UGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgcGF0aC5kaXJuYW1lKHRoaXMucGFja2FnZS5lbnRyeXBvaW50KSxcbiAgICAgICAgcGF0aC5iYXNlbmFtZSh0aGlzLnBhY2thZ2UuZW50cnlwb2ludCwgXCIuanNcIiksXG4gICAgICApO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVQZXJzaXN0ZWRQYXRoKGVudHJ5cG9pbnRQYXRoKTtcbiAgICAgIGNvbnN0IGVudHJ5cG9pbnRUeXBlcyA9XG4gICAgICAgIG9wdGlvbnMuZW50cnlwb2ludFR5cGVzID8/IGAke25vcm1hbGl6ZWRQYXRofS5kLnRzYDtcbiAgICAgIHRoaXMucGFja2FnZS5hZGRGaWVsZChcInR5cGVzXCIsIGVudHJ5cG9pbnRUeXBlcyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZGlzYWJsZVRzY29uZmlnRGV2ICYmIG9wdGlvbnMuZGlzYWJsZVRzY29uZmlnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IHNwZWNpZnkgYm90aCAnZGlzYWJsZVRzY29uZmlnRGV2JyBhbmQgJ2Rpc2FibGVUc2NvbmZpZycgZmllbGRzLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuZGlzYWJsZVRzY29uZmlnKSB7XG4gICAgICB0aGlzLnRzY29uZmlnID0gbmV3IFR5cGVzY3JpcHRDb25maWcoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIG1lcmdlVHNjb25maWdPcHRpb25zKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGluY2x1ZGU6IFtgJHt0aGlzLnNyY2Rpcn0vKiovKi50c2BdLFxuICAgICAgICAgICAgZXhjbHVkZTogW1wibm9kZV9tb2R1bGVzXCJdLFxuICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgICAgICAgIHJvb3REaXI6IHRoaXMuc3JjZGlyLFxuICAgICAgICAgICAgICBvdXREaXI6IHRoaXMubGliZGlyLFxuICAgICAgICAgICAgICAuLi50aGlzLmRlZmF1bHRUeXBlU2NyaXB0Q29tcGlsZXJPcHRpb25zKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgb3B0aW9ucy50c2NvbmZpZyxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZGlzYWJsZVRzY29uZmlnRGV2KSB7XG4gICAgICB0aGlzLnRzY29uZmlnRGV2ID0gdGhpcy50c2NvbmZpZyE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRzY29uZmlnRGV2RmlsZSA9IG9wdGlvbnMudHNjb25maWdEZXZGaWxlID8/IFwidHNjb25maWcuZGV2Lmpzb25cIjtcbiAgICAgIHRoaXMudHNjb25maWdEZXYgPSBuZXcgVHlwZXNjcmlwdENvbmZpZyhcbiAgICAgICAgdGhpcyxcbiAgICAgICAgbWVyZ2VUc2NvbmZpZ09wdGlvbnMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmlsZU5hbWU6IHRzY29uZmlnRGV2RmlsZSxcbiAgICAgICAgICAgIGluY2x1ZGU6IFtgJHt0aGlzLnNyY2Rpcn0vKiovKi50c2AsIGAke3RoaXMudGVzdGRpcn0vKiovKi50c2BdLFxuXG4gICAgICAgICAgICBleGNsdWRlOiBbXCJub2RlX21vZHVsZXNcIl0sXG4gICAgICAgICAgICBjb21waWxlck9wdGlvbnM6IHRoaXMuZGVmYXVsdFR5cGVTY3JpcHRDb21waWxlck9wdGlvbnMoKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wdGlvbnMudHNjb25maWcsXG4gICAgICAgICAgb3B0aW9ucy50c2NvbmZpZ0RldixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5naXRpZ25vcmUuaW5jbHVkZShgLyR7dGhpcy5zcmNkaXJ9L2ApO1xuICAgIHRoaXMubnBtaWdub3JlPy5leGNsdWRlKGAvJHt0aGlzLnNyY2Rpcn0vYCk7XG5cbiAgICBpZiAodGhpcy5zcmNkaXIgIT09IHRoaXMubGliZGlyKSB7XG4gICAgICAvLyBzZXBhcmF0ZWQsIGNhbiBpZ25vcmUgdGhlIGVudGlyZSBsaWJkaXJcbiAgICAgIHRoaXMuZ2l0aWdub3JlLmV4Y2x1ZGUoYC8ke3RoaXMubGliZGlyfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb2xsb2NhdGVkLCBjYW4gb25seSBpZ25vcmUgdGhlIGNvbXBpbGVkIG91dHB1dFxuICAgICAgdGhpcy5naXRpZ25vcmUuZXhjbHVkZShgLyR7dGhpcy5saWJkaXJ9LyoqLyouanNgKTtcbiAgICAgIHRoaXMuZ2l0aWdub3JlLmV4Y2x1ZGUoYC8ke3RoaXMubGliZGlyfS8qKi8qLmQudHNgKTtcbiAgICAgIHRoaXMuZ2l0aWdub3JlLmV4Y2x1ZGUoYC8ke3RoaXMubGliZGlyfS8qKi8qLmQudHMubWFwYCk7XG4gICAgfVxuXG4gICAgdGhpcy5ucG1pZ25vcmU/LmluY2x1ZGUoYC8ke3RoaXMubGliZGlyfS9gKTtcblxuICAgIHRoaXMubnBtaWdub3JlPy5pbmNsdWRlKGAvJHt0aGlzLmxpYmRpcn0vKiovKi5qc2ApO1xuICAgIHRoaXMubnBtaWdub3JlPy5pbmNsdWRlKGAvJHt0aGlzLmxpYmRpcn0vKiovKi5kLnRzYCk7XG5cbiAgICB0aGlzLmdpdGlnbm9yZS5leGNsdWRlKFwiL2Rpc3QvXCIpO1xuICAgIHRoaXMubnBtaWdub3JlPy5leGNsdWRlKFwiZGlzdFwiKTsgLy8ganNpaS1wYWNtYWsgZXhwZWN0cyB0aGlzIHRvIGJlIFwiZGlzdFwiIGFuZCBub3QgXCIvZGlzdFwiLiBvdGhlcndpc2UgaXQgd2lsbCB0YW1wZXIgd2l0aCBpdFxuXG4gICAgdGhpcy5ucG1pZ25vcmU/LmV4Y2x1ZGUoXCIvdHNjb25maWcuanNvblwiKTtcbiAgICB0aGlzLm5wbWlnbm9yZT8uZXhjbHVkZShcIi8uZ2l0aHViL1wiKTtcbiAgICB0aGlzLm5wbWlnbm9yZT8uZXhjbHVkZShcIi8udnNjb2RlL1wiKTtcbiAgICB0aGlzLm5wbWlnbm9yZT8uZXhjbHVkZShcIi8uaWRlYS9cIik7XG4gICAgdGhpcy5ucG1pZ25vcmU/LmV4Y2x1ZGUoXCIvLnByb2plbnJjLmpzXCIpO1xuICAgIHRoaXMubnBtaWdub3JlPy5leGNsdWRlKFwidHNjb25maWcudHNidWlsZGluZm9cIik7XG5cbiAgICBpZiAodGhpcy5qZXN0KSB7XG4gICAgICBpZiAoY29tcGlsZWRUZXN0cykge1xuICAgICAgICB0aGlzLmFkZEplc3RDb21waWxlZCh0aGlzLmplc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hZGRKZXN0Tm9Db21waWxlKHRoaXMuamVzdCwgb3B0aW9ucz8udHNKZXN0T3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGludGVyIHRvb2wgc2VsZWN0aW9uXG4gICAgLy8gZXNsaW50IGlzIHRoZSBkZWZhdWx0LCBidXQgaWYgYmlvbWUgaGFzIGJlZW4gZW5hYmxlZCBpbiB0aGUgcGFyZW50IGNsYXNzIGFuZCBlc2xpbnQgdW5zZXQsIHdlIGRlZmF1bHQgdG8gYmlvbWVcbiAgICBjb25zdCBiaW9tZUVuYWJsZWQgPSB0aGlzLmJpb21lICE9IG51bGw7XG4gICAgY29uc3QgZXNsaW50RW5hYmxlZCA9IG9wdGlvbnMuZXNsaW50ID8/ICFiaW9tZUVuYWJsZWQ7IC8vIGVzbGludCBkZWZhdWx0cyB0byB0aGUgb3Bwb3NpdGUgb2YgYmlvbWVcblxuICAgIGlmIChtdWx0aXBsZVNlbGVjdGVkKFtiaW9tZUVuYWJsZWQsIGVzbGludEVuYWJsZWRdKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT25seSBvbmUgb2YgYmlvbWUgYW5kIGVzbGludCBjYW4gYmUgZW5hYmxlZC5cIik7XG4gICAgfVxuXG4gICAgaWYgKGVzbGludEVuYWJsZWQpIHtcbiAgICAgIHRoaXMuZXNsaW50ID0gbmV3IEVzbGludCh0aGlzLCB7XG4gICAgICAgIHRzY29uZmlnUGF0aDogYC4vJHt0aGlzLnRzY29uZmlnRGV2LmZpbGVOYW1lfWAsXG4gICAgICAgIGRpcnM6IFt0aGlzLnNyY2Rpcl0sXG4gICAgICAgIGRldmRpcnM6IFt0aGlzLnRlc3RkaXIsIFwiYnVpbGQtdG9vbHNcIl0sXG4gICAgICAgIGZpbGVFeHRlbnNpb25zOiBbXCIudHNcIiwgXCIudHN4XCJdLFxuICAgICAgICAuLi5vcHRpb25zLmVzbGludE9wdGlvbnMsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy50c2NvbmZpZ0VzbGludCA9IHRoaXMudHNjb25maWdEZXY7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBzcmMgYW5kIHRlc3QgZGlyZWN0b3JpZXNcbiAgICAvLyBubyBuZWVkIHRvIGV4Y2x1ZGUgYnVpbGQgYXJ0aWZhY3RzOiBiaW9tZSBpZ25vcmVzIGZpbGVzIGluIC5naXRpZ25vcmVcbiAgICB0aGlzLmJpb21lPy5hZGRGaWxlUGF0dGVybihgJHt0aGlzLnNyY2Rpcn0vKipgKTtcbiAgICB0aGlzLmJpb21lPy5hZGRGaWxlUGF0dGVybihgJHt0aGlzLnRlc3RkaXJ9LyoqYCk7XG5cbiAgICAvLyB3aGVuIHRoaXMgaXMgYSByb290IHByb2plY3RcbiAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICBpZiAob3B0aW9ucy5wcm9qZW5yY1RzKSB7XG4gICAgICAgIG5ldyBQcm9qZW5yY1RzKHRoaXMsIG9wdGlvbnMucHJvamVucmNUc09wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcHJvamVucmMuanMgY3JlYXRlZCBpbiBOb2RlUHJvamVjdCBuZWVkcyB0byBiZSBhZGRlZCBpbiB0c2NvbmZpZ0RldlxuICAgICAgICBjb25zdCBwcm9qZW5yY0pzID0gTm9kZVByb2plY3RQcm9qZW5yYy5vZih0aGlzKTtcbiAgICAgICAgaWYgKHByb2plbnJjSnMpIHtcbiAgICAgICAgICB0aGlzLnRzY29uZmlnRGV2LmFkZEluY2x1ZGUocHJvamVucmNKcy5maWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0c0RlcCA9IG9wdGlvbnMudHlwZXNjcmlwdFZlcnNpb25cbiAgICAgID8gYHR5cGVzY3JpcHRAJHtvcHRpb25zLnR5cGVzY3JpcHRWZXJzaW9ufWBcbiAgICAgIDogXCJ0eXBlc2NyaXB0XCI7XG4gICAgdGhpcy5hZGREZXZEZXBzKHRzRGVwKTtcblxuICAgIHRoaXMuYWRkTm9kZVR5cGVzVmVyc2lvbihvcHRpb25zLnR5cGVzY3JpcHRWZXJzaW9uLCBvcHRpb25zLm1pbk5vZGVWZXJzaW9uKTtcblxuICAgIC8vIGdlbmVyYXRlIHNhbXBsZSBjb2RlIGluIGBzcmNgIGFuZCBgbGliYCBpZiB0aGVzZSBkaXJlY3RvcmllcyBhcmUgZW1wdHkgb3Igbm9uLWV4aXN0ZW50LlxuICAgIGlmIChvcHRpb25zLnNhbXBsZUNvZGUgPz8gdHJ1ZSkge1xuICAgICAgbmV3IFNhbXBsZUNvZGUodGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZG9jZ2VuKSB7XG4gICAgICBuZXcgVHlwZWRvY0RvY2dlbih0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvamVuIGRlZmF1bHQgVHlwZXNjcmlwdCBjb21waWxlciBvcHRpb25zLlxuICAgKi9cbiAgcHJvdGVjdGVkIGRlZmF1bHRUeXBlU2NyaXB0Q29tcGlsZXJPcHRpb25zKCk6IFR5cGVTY3JpcHRDb21waWxlck9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSxcbiAgICAgIGV4cGVyaW1lbnRhbERlY29yYXRvcnM6IHRydWUsXG4gICAgICBpbmxpbmVTb3VyY2VNYXA6IHRydWUsXG4gICAgICBpbmxpbmVTb3VyY2VzOiB0cnVlLFxuICAgICAgbGliOiBbXCJlczIwMjBcIl0sXG4gICAgICBtb2R1bGU6IFwiQ29tbW9uSlNcIixcbiAgICAgIG5vRW1pdE9uRXJyb3I6IGZhbHNlLFxuICAgICAgbm9GYWxsdGhyb3VnaENhc2VzSW5Td2l0Y2g6IHRydWUsXG4gICAgICBub0ltcGxpY2l0QW55OiB0cnVlLFxuICAgICAgbm9JbXBsaWNpdFJldHVybnM6IHRydWUsXG4gICAgICBub0ltcGxpY2l0VGhpczogdHJ1ZSxcbiAgICAgIG5vVW51c2VkTG9jYWxzOiB0cnVlLFxuICAgICAgbm9VbnVzZWRQYXJhbWV0ZXJzOiB0cnVlLFxuICAgICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsXG4gICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICBzdHJpY3ROdWxsQ2hlY2tzOiB0cnVlLFxuICAgICAgc3RyaWN0UHJvcGVydHlJbml0aWFsaXphdGlvbjogdHJ1ZSxcbiAgICAgIHN0cmlwSW50ZXJuYWw6IHRydWUsXG4gICAgICB0YXJnZXQ6IFwiRVMyMDIwXCIsXG4gICAgICB0eXBlczogKCgpID0+IHRoaXMucmVzb2x2ZUluc3RhbGxlZFR5cGVzKCkpIGFzIGFueSwgLy8gVFM2LjAgY29tcGF0LCBAc2VlIGh0dHBzOi8vZGV2YmxvZ3MubWljcm9zb2Z0LmNvbS90eXBlc2NyaXB0L2Fubm91bmNpbmctdHlwZXNjcmlwdC02LTAvI3VwLWZyb250LWFkanVzdG1lbnRzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYEB0eXBlcy9ub2RlYCB0byB0aGlzIHByb2plY3QuXG4gICAqXG4gICAqIElmIHRoZSB1c2VyIGhhcyBhbHJlYWR5IGFkZGVkIHRoaXMgZGVwZW5kZW5jeSwgZG8gbm90aGluZy5cbiAgICogT3RoZXJ3aXNlIHVzZSB0aGUgbWFqb3IgdmVyc2lvbiBvZiBgbWluTm9kZVZlcnNpb25gLlxuICAgKiBJZiB0aGF0J3Mgbm90IGF2YWlsYWJsZSwgbWF0Y2ggdGhlIHZlcnNpb24gdG8gdGhlIHVzZWQgdHlwZXNjcmlwdCB2ZXJzaW9uLlxuICAgKiBBbmQgaWYgdGhhdCBpcyBhbHNvIG5vdCBhdmFpbGFibGUsIHdlIHVzZSBsYXRlc3QgYW5kIGxldCB0aGUgdXNlciBtYW5hZ2UgdGhlIHZlcnNpb24uXG4gICAqL1xuICBwcml2YXRlIGFkZE5vZGVUeXBlc1ZlcnNpb24odHNWZXJzaW9uPzogc3RyaW5nLCBtaW5Ob2RlVmVyc2lvbj86IHN0cmluZykge1xuICAgIGNvbnN0IG5hbWUgPSBcIkB0eXBlcy9ub2RlXCI7XG5cbiAgICBpZiAodGhpcy5kZXBzLnRyeUdldERlcGVuZGVuY3kobmFtZSwgRGVwZW5kZW5jeVR5cGUuQlVJTEQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG1pbk5vZGVWZXJzaW9uKSB7XG4gICAgICBjb25zdCBtaW5Ob2RlUGFyc2VkID0gc2VtdmVyLm1pblZlcnNpb24obWluTm9kZVZlcnNpb24pO1xuICAgICAgaWYgKG1pbk5vZGVQYXJzZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRGV2RGVwcyhgJHtuYW1lfUBeJHttaW5Ob2RlUGFyc2VkLm1ham9yfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvZXJjZSB2ZXJzaW9uLCBzaW5jZSB0aGUgdHMgdmVyc2lvbiBsaWtlbHkgc29tZXRoaW5nIGxpa2UgfjUuMy4wXG4gICAgY29uc3QgdHNQYXJzZWQgPSBzZW12ZXIuY29lcmNlKHRzVmVyc2lvbik7XG4gICAgaWYgKHRzUGFyc2VkKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGREZXZEZXBzKGAke25hbWV9QHRzJHt0c1BhcnNlZC5tYWpvcn0uJHt0c1BhcnNlZC5taW5vcn1gKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERldkRlcHMobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgYHR5cGVzYCBjb21waWxlciBvcHRpb24gZnJvbSBhbGwgaW5zdGFsbGVkIGBAdHlwZXNgIGRlcGVuZGVuY2llcy5cbiAgICogQ2FsbGVkIGxhemlseSBhdCBzeW50aCB0aW1lIHNvIGFsbCBkZXBzIGFyZSBhdmFpbGFibGUuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVJbnN0YWxsZWRUeXBlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGVwcy5hbGxcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChkKSA9PlxuICAgICAgICAgIGQubmFtZS5zdGFydHNXaXRoKFwiQHR5cGVzL1wiKSAmJiBkLnR5cGUgIT09IERlcGVuZGVuY3lUeXBlLk9WRVJSSURFLFxuICAgICAgKVxuICAgICAgLm1hcCgoZCkgPT4gZC5uYW1lLnJlcGxhY2UoXCJAdHlwZXMvXCIsIFwiXCIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0cyBhcmUgY29tcGlsZWQgdG8gYGxpYi9URVNURElSYCwgc28gd2UgZG9uJ3QgbmVlZCBqZXN0IHRvIGNvbXBpbGUgdGhlbVxuICAgKiBmb3IgdXMuIGp1c3QgcnVuIHRoZW0gZGlyZWN0bHkgZnJvbSBqYXZhc2NyaXB0LlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRKZXN0Q29tcGlsZWQoamVzdDogSmVzdCkge1xuICAgIHRoaXMuYWRkRGV2RGVwcyhgQHR5cGVzL2plc3Qke2plc3QuamVzdFZlcnNpb259YCk7XG5cbiAgICBjb25zdCB0ZXN0b3V0ID0gcGF0aC5wb3NpeC5yZWxhdGl2ZSh0aGlzLnNyY2RpciwgdGhpcy50ZXN0ZGlyKTtcbiAgICBjb25zdCBsaWJ0ZXN0ID0gcGF0aC5wb3NpeC5qb2luKHRoaXMubGliZGlyLCB0ZXN0b3V0KTtcbiAgICBjb25zdCBzcmN0ZXN0ID0gdGhpcy50ZXN0ZGlyO1xuXG4gICAgdGhpcy5ucG1pZ25vcmU/LmV4Y2x1ZGUoYC8ke2xpYnRlc3R9L2ApO1xuICAgIGplc3QuZGlzY292ZXJUZXN0TWF0Y2hQYXR0ZXJuc0ZvckRpcnMoW2xpYnRlc3RdLCB7XG4gICAgICBmaWxlRXh0ZW5zaW9uUGF0dGVybjogdGhpcy50c2NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5hbGxvd0pzXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogXCJqcz8oeClcIixcbiAgICB9KTtcbiAgICBqZXN0LmFkZFdhdGNoSWdub3JlUGF0dGVybihgLyR7dGhpcy5zcmNkaXJ9L2ApO1xuXG4gICAgY29uc3QgcmVzb2x2ZVNuYXBzaG90UGF0aCA9ICh0ZXN0OiBzdHJpbmcsIGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBmdWxscGF0aCA9IHRlc3QucmVwbGFjZShsaWJ0ZXN0LCBzcmN0ZXN0KTtcbiAgICAgIHJldHVybiBwYXRoLmpvaW4oXG4gICAgICAgIHBhdGguZGlybmFtZShmdWxscGF0aCksXG4gICAgICAgIFwiX19zbmFwc2hvdHNfX1wiLFxuICAgICAgICBwYXRoLmJhc2VuYW1lKGZ1bGxwYXRoLCBcIi5qc1wiKSArIFwiLnRzXCIgKyBleHQsXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCByZXNvbHZlVGVzdFBhdGggPSAoc25hcDogc3RyaW5nLCBleHQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKHNuYXAsIFwiLnRzXCIgKyBleHQpICsgXCIuanNcIjtcbiAgICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUoc25hcCkpLnJlcGxhY2Uoc3JjdGVzdCwgbGlidGVzdCk7XG4gICAgICByZXR1cm4gcGF0aC5qb2luKGRpciwgZmlsZW5hbWUpO1xuICAgIH07XG5cbiAgICBjb25zdCByZXNvbHZlciA9IG5ldyBUZXh0RmlsZShcbiAgICAgIHRoaXMsXG4gICAgICBwYXRoLnBvc2l4LmpvaW4oUFJPSkVOX0RJUiwgXCJqZXN0LXNuYXBzaG90LXJlc29sdmVyLmpzXCIpLFxuICAgICk7XG4gICAgaWYgKCFyZXNvbHZlci5tYXJrZXIpIHtcbiAgICAgIHJlc29sdmVyLmFkZExpbmUoYC8vICR7cmVzb2x2ZXIubWFya2VyfWApO1xuICAgIH1cbiAgICByZXNvbHZlci5hZGRMaW5lKCdjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7Jyk7XG4gICAgcmVzb2x2ZXIuYWRkTGluZShgY29uc3QgbGlidGVzdCA9IFwiJHtsaWJ0ZXN0fVwiO2ApO1xuICAgIHJlc29sdmVyLmFkZExpbmUoYGNvbnN0IHNyY3Rlc3Q9IFwiJHtzcmN0ZXN0fVwiO2ApO1xuICAgIHJlc29sdmVyLmFkZExpbmUoXCJtb2R1bGUuZXhwb3J0cyA9IHtcIik7XG4gICAgcmVzb2x2ZXIuYWRkTGluZShcbiAgICAgIGAgIHJlc29sdmVTbmFwc2hvdFBhdGg6ICR7cmVzb2x2ZVNuYXBzaG90UGF0aC50b1N0cmluZygpfSxgLFxuICAgICk7XG4gICAgcmVzb2x2ZXIuYWRkTGluZShgICByZXNvbHZlVGVzdFBhdGg6ICR7cmVzb2x2ZVRlc3RQYXRoLnRvU3RyaW5nKCl9LGApO1xuICAgIHJlc29sdmVyLmFkZExpbmUoXG4gICAgICBcIiAgdGVzdFBhdGhGb3JDb25zaXN0ZW5jeUNoZWNrOiBwYXRoLmpvaW4oJ3NvbWUnLCAnX190ZXN0c19fJywgJ2V4YW1wbGUudGVzdC5qcycpXCIsXG4gICAgKTtcbiAgICByZXNvbHZlci5hZGRMaW5lKFwifTtcIik7XG5cbiAgICBqZXN0LmFkZFNuYXBzaG90UmVzb2x2ZXIoYC4vJHtyZXNvbHZlci5wYXRofWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRKZXN0Tm9Db21waWxlKFxuICAgIGplc3Q6IEplc3QsXG4gICAgdHNKZXN0T3B0aW9uczogVHNKZXN0T3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgLy8gVHMtamVzdCBkb2Vzbid0IGZvbGxvdyBzZW12ZXIsIGJ1dCBtYWpvciBzaG91bGQgbWF0Y2ggdG8gSmVzdCdzIG1ham9yLlxuICAgIC8vIEZvciBzb21lIHJlYXNvbiB0aGlzIGlzIG5vdCB0aGUgY2FzZSB3aXRoIEplc3QgMzAgYW55bW9yZS5cbiAgICBjb25zdCBqZXN0TWFqb3IgPSBzZW12ZXIuY29lcmNlKGplc3QuamVzdFZlcnNpb24pPy5tYWpvciA/PyAwO1xuICAgIGNvbnN0IHRzSmVzdFZlcnNpb24gPSBqZXN0TWFqb3IgPiAyOSA/IFwiQF4yOVwiIDogamVzdC5qZXN0VmVyc2lvbjtcbiAgICB0aGlzLmFkZERldkRlcHMoXG4gICAgICBgQHR5cGVzL2plc3Qke2plc3QuamVzdFZlcnNpb259YCxcbiAgICAgIGB0cy1qZXN0JHt0c0plc3RWZXJzaW9ufWAsXG4gICAgKTtcblxuICAgIGplc3QuZGlzY292ZXJUZXN0TWF0Y2hQYXR0ZXJuc0ZvckRpcnMoW3RoaXMuc3JjZGlyLCB0aGlzLnRlc3RkaXJdLCB7XG4gICAgICBmaWxlRXh0ZW5zaW9uUGF0dGVybjogdGhpcy50c2NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5hbGxvd0pzXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogXCJ0cz8oeClcIixcbiAgICB9KTtcblxuICAgIC8vIFRlc3QgZm9yIHRoZSB0cy1qZXN0IHZlcnNpb24gdGhhdCB3YXMgcmVxdWVzdGVkO1xuICAgIC8vXG4gICAgLy8gLSBGaXJzdCwgY2hlY2sgdGhlIGBqZXN0YCB2ZXJzaW9uIHRoYXQgaXMgcmVxdWVzdGVkIHZpYSBwcm9qZW4gcHJvcGVydGllcy4gVGhpc1xuICAgIC8vICAgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBgdHMtamVzdGAgdmVyc2lvbiBhbnl3YXkuXG4gICAgLy8gLSBJZiBub25lIGZvdW5kLCBmYWxsIGJhY2sgdG8gaW5zcGVjdGluZyB0aGUgYWN0dWFsIGB0cy1qZXN0YCB2ZXJzaW9uXG4gICAgLy8gICB0aGF0IGhhcHBlbnMgdG8gYmUgaW5zdGFsbGVkLlxuICAgIGxldCBoYXNUc0plc3QyOTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoamVzdC5qZXN0VmVyc2lvbikge1xuICAgICAgLy8gV2UgY291bGQgbWF5YmUgcmVwbGFjZSB0aGlzIHdpbGwgZnVsbCBcImFjdHVhbCB2ZXJzaW9uXCIgY2hlY2tpbmcsIGJ1dFxuICAgICAgLy8gdGhlIHRlc3RzIGRlcGVuZCBvbiB0aGlzIGFuZCB0aGUgcmVhZGluZyBvZiAncGFja2FnZS5qc29uJyBpcyB2ZXJ5XG4gICAgICAvLyBhd2t3YXJkIHRvIHRlc3QuXG4gICAgICAvLyBOb3RlIHRoYXQgd2UgdXNlIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiBvZiBgamVzdGAgYXMgYSBwcm94eSBmb3IgdGhlXG4gICAgICAvLyB2ZXJzaW9uIG9mIGB0cy1qZXN0YCwgd2hpY2ggaXMgd2hhdCB3ZSdyZSBhY3R1YWxseSBpbnRlcmVzdGVkIGluLlxuICAgICAgY29uc3QgbWFqb3IgPSBzZW12ZXIuY29lcmNlKGplc3QuamVzdFZlcnNpb24pPy5tYWpvcjtcbiAgICAgIGhhc1RzSmVzdDI5ID0gbWFqb3IgPyBtYWpvciA+PSAyOSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGhhc1RzSmVzdDI5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc1RzSmVzdDI5ID0gaGFzRGVwZW5kZW5jeVZlcnNpb24odGhpcywgXCJ0cy1qZXN0XCIsIFwiPj0gMjlcIik7XG4gICAgfVxuXG4gICAgLy8gYWRkIHJlbGV2YW50IGRlcHMgKHdlIHRyZWF0IFwidW5rbm93blwiIGFzIGhhdmluZyBhIG1vZGVybiB0cy1qZXN0KVxuICAgIGlmIChoYXNUc0plc3QyOSAhPT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkZEplc3ROb0NvbXBpbGVNb2Rlcm4oamVzdCwgdHNKZXN0T3B0aW9ucyk7XG4gICAgfVxuICAgIHRoaXMuYWRkSmVzdE5vQ29tcGlsZUxlZ2FjeShqZXN0LCB0c0plc3RPcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkSmVzdE5vQ29tcGlsZU1vZGVybihcbiAgICBqZXN0OiBKZXN0LFxuICAgIHRzSmVzdE9wdGlvbnM6IFRzSmVzdE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIGplc3QuY29uZmlnLnRyYW5zZm9ybSA9IGRlZXBNZXJnZShbXG4gICAgICB7XG4gICAgICAgIFt0c0plc3RPcHRpb25zPy50cmFuc2Zvcm1QYXR0ZXJuID8/XG4gICAgICAgIFR5cGVTY3JpcHRQcm9qZWN0LkRFRkFVTFRfVFNfSkVTVF9UUkFORk9STV9QQVRURVJOXTogbmV3IFRyYW5zZm9ybShcbiAgICAgICAgICBcInRzLWplc3RcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0c2NvbmZpZzogVHNKZXN0VHNjb25maWcuZnJvbUZpbGUodGhpcy50c2NvbmZpZ0Rldi5maWxlTmFtZSksXG4gICAgICAgICAgICAuLi4odHNKZXN0T3B0aW9ucz8udHJhbnNmb3JtT3B0aW9ucyA/PyB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICBqZXN0LmNvbmZpZy50cmFuc2Zvcm0sXG4gICAgXSk7XG4gIH1cblxuICBwcml2YXRlIGFkZEplc3ROb0NvbXBpbGVMZWdhY3koXG4gICAgamVzdDogSmVzdCxcbiAgICB0c0plc3RPcHRpb25zOiBUc0plc3RPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICBpZiAodHNKZXN0T3B0aW9ucykge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgXCJZb3UgYXJlIHVzaW5nIGEgbGVnYWN5IHZlcnNpb24gKDwyOSkgb2YgamVzdCBhbmQgdHMtamVzdCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdHNKZXN0T3B0aW9ucywgdGhleSB3aWxsIGJlIGlnbm9yZWQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIWplc3QuY29uZmlnLnByZXNldCkge1xuICAgICAgamVzdC5jb25maWcucHJlc2V0ID0gXCJ0cy1qZXN0XCI7XG4gICAgfVxuICAgIGplc3QuY29uZmlnLmdsb2JhbHMgPSBkZWVwTWVyZ2UoW1xuICAgICAge1xuICAgICAgICBcInRzLWplc3RcIjoge1xuICAgICAgICAgIHRzY29uZmlnOiB0aGlzLnRzY29uZmlnRGV2LmZpbGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGplc3QuY29uZmlnLmdsb2JhbHMsXG4gICAgXSk7XG4gIH1cbn1cblxuY2xhc3MgU2FtcGxlQ29kZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFR5cGVTY3JpcHRQcm9qZWN0KSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG4gICAgY29uc3Qgc3JjQ29kZSA9IFtcbiAgICAgIFwiZXhwb3J0IGNsYXNzIEhlbGxvIHtcIixcbiAgICAgIFwiICBwdWJsaWMgc2F5SGVsbG8oKSB7XCIsXG4gICAgICBcIiAgICByZXR1cm4gJ2hlbGxvLCB3b3JsZCEnO1wiLFxuICAgICAgXCIgIH1cIixcbiAgICAgIFwifVwiLFxuICAgIF0uam9pbihcIlxcblwiKTtcblxuICAgIGNvbnN0IHRlc3RDb2RlID0gW1xuICAgICAgXCJpbXBvcnQgeyBIZWxsbyB9IGZyb20gJy4uL3NyYyc7XCIsXG4gICAgICBcIlwiLFxuICAgICAgXCJ0ZXN0KCdoZWxsbycsICgpID0+IHtcIixcbiAgICAgIFwiICBleHBlY3QobmV3IEhlbGxvKCkuc2F5SGVsbG8oKSkudG9CZSgnaGVsbG8sIHdvcmxkIScpO1wiLFxuICAgICAgXCJ9KTtcIixcbiAgICBdLmpvaW4oXCJcXG5cIik7XG5cbiAgICBuZXcgU2FtcGxlRGlyKHByb2plY3QsIHByb2plY3Quc3JjZGlyLCB7XG4gICAgICBmaWxlczoge1xuICAgICAgICBcImluZGV4LnRzXCI6IHNyY0NvZGUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKHByb2plY3QuamVzdCkge1xuICAgICAgbmV3IFNhbXBsZURpcihwcm9qZWN0LCBwcm9qZWN0LnRlc3RkaXIsIHtcbiAgICAgICAgZmlsZXM6IHtcbiAgICAgICAgICBcImhlbGxvLnRlc3QudHNcIjogdGVzdENvZGUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUeXBlU2NyaXB0IGFwcC5cbiAqXG4gKiBAcGppZCB0eXBlc2NyaXB0LWFwcFxuICovXG5leHBvcnQgY2xhc3MgVHlwZVNjcmlwdEFwcFByb2plY3QgZXh0ZW5kcyBUeXBlU2NyaXB0UHJvamVjdCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFR5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucykge1xuICAgIC8vIFJlbGVhc2luZyBhbmQgcGFja2FnaW5nIGFyZSBjb3VwbGVkLiBJZiBvbmUgaXMgZGlzYWJsZWQsIGRpc2FibGUgdGhlIG90aGVyIGJ5IGRlZmF1bHQuXG4gICAgY29uc3Qgc2hvdWxkUmVsZWFzZSA9IG9wdGlvbnMucmVsZWFzZSA/PyBmYWxzZTtcblxuICAgIHN1cGVyKHtcbiAgICAgIHJlbGVhc2U6IHNob3VsZFJlbGVhc2UsXG4gICAgICBwYWNrYWdlOiBzaG91bGRSZWxlYXNlLFxuICAgICAgYWxsb3dMaWJyYXJ5RGVwZW5kZW5jaWVzOiBmYWxzZSxcbiAgICAgIGVudHJ5cG9pbnQ6IFwiXCIsIC8vIFwibWFpblwiIGlzIG5vdCBuZWVkZWQgaW4gdHlwZXNjcmlwdCBhcHBzXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVRzY29uZmlnT3B0aW9ucyhcbiAgLi4ub3B0aW9uczogKFR5cGVzY3JpcHRDb25maWdPcHRpb25zIHwgdW5kZWZpbmVkKVtdXG4pOiBUeXBlc2NyaXB0Q29uZmlnT3B0aW9ucyB7XG4gIGNvbnN0IGRlZmluZWRPcHRpb25zID0gb3B0aW9ucy5maWx0ZXIoQm9vbGVhbikgYXMgVHlwZXNjcmlwdENvbmZpZ09wdGlvbnNbXTtcbiAgcmV0dXJuIGRlZmluZWRPcHRpb25zLnJlZHVjZTxUeXBlc2NyaXB0Q29uZmlnT3B0aW9ucz4oXG4gICAgKHByZXZpb3VzLCBjdXJyZW50KSA9PiAoe1xuICAgICAgLi4ucHJldmlvdXMsXG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgaW5jbHVkZTogWy4uLihwcmV2aW91cy5pbmNsdWRlID8/IFtdKSwgLi4uKGN1cnJlbnQuaW5jbHVkZSA/PyBbXSldLFxuICAgICAgZXhjbHVkZTogWy4uLihwcmV2aW91cy5leGNsdWRlID8/IFtdKSwgLi4uKGN1cnJlbnQuZXhjbHVkZSA/PyBbXSldLFxuICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgIC4uLnByZXZpb3VzLmNvbXBpbGVyT3B0aW9ucyxcbiAgICAgICAgLi4uY3VycmVudC5jb21waWxlck9wdGlvbnMsXG4gICAgICB9LFxuICAgIH0pLFxuICAgIHsgY29tcGlsZXJPcHRpb25zOiB7fSB9LFxuICApO1xufVxuIl19
649
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlc2NyaXB0L3R5cGVzY3JpcHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbTdCQSxvREFpQkM7O0FBcDhCRCwyQ0FBNkI7QUFDN0IsK0NBQWlDO0FBQ2pDLHNDQUF1QztBQUN2Qyw0Q0FBeUM7QUFDekMsa0RBQWlEO0FBUWpELDhDQU11QjtBQUN2Qiw2Q0FBMEQ7QUFDMUQsZ0RBQTJDO0FBRTNDLDBDQUF1QztBQUV2Qyw4Q0FBc0U7QUFDdEUsa0NBQThFO0FBRTlFOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFtQ1Q7O0lBbENuQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxRQUFRO1FBQ3BCLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxnQkFBZ0I7UUFDNUIsT0FBTyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFnQjtRQUNyQyxPQUFPLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBMkI7UUFDOUMsT0FBTyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxZQUNtQixNQUE4QztRQUE5QyxXQUFNLEdBQU4sTUFBTSxDQUF3QztJQUM5RCxDQUFDO0lBRUo7OztPQUdHO0lBQ0ksTUFBTTtRQUNYLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDOztBQTVDSCw4Q0E2Q0M7QUFFRDs7R0FFRztBQUNILE1BQWEsaUJBQWlCO0lBd0JTOztJQXZCckM7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QyxNQUFNLENBQUMsT0FBTyxDQUE4QixDQUFDO0lBQzVFLE9BQU8sY0FBYyxDQUFDLE1BQU0sQ0FDMUIsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsUUFBUTtRQUNYLEdBQUcsT0FBTztRQUNWLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLGVBQWUsRUFBRTtZQUNmLEdBQUcsUUFBUSxDQUFDLGVBQWU7WUFDM0IsR0FBRyxPQUFPLENBQUMsZUFBZTtTQUMzQjtLQUNGLENBQUMsRUFDRixFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsQ0FDeEIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBzZW12ZXIgZnJvbSBcInNlbXZlclwiO1xuaW1wb3J0IHsgUFJPSkVOX0RJUiB9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIuLi9jb21wb25lbnRcIjtcbmltcG9ydCB7IERlcGVuZGVuY3lUeXBlIH0gZnJvbSBcIi4uL2RlcGVuZGVuY2llc1wiO1xuaW1wb3J0IHR5cGUge1xuICBFc2xpbnRPcHRpb25zLFxuICBKZXN0LFxuICBOb2RlUHJvamVjdE9wdGlvbnMsXG4gIFR5cGVTY3JpcHRDb21waWxlck9wdGlvbnMsXG4gIFR5cGVzY3JpcHRDb25maWdPcHRpb25zLFxufSBmcm9tIFwiLi4vamF2YXNjcmlwdFwiO1xuaW1wb3J0IHtcbiAgRXNsaW50LFxuICBOb2RlUHJvamVjdCxcbiAgUHJvamVucmMgYXMgTm9kZVByb2plY3RQcm9qZW5yYyxcbiAgVHJhbnNmb3JtLFxuICBUeXBlc2NyaXB0Q29uZmlnLFxufSBmcm9tIFwiLi4vamF2YXNjcmlwdFwiO1xuaW1wb3J0IHsgaGFzRGVwZW5kZW5jeVZlcnNpb24gfSBmcm9tIFwiLi4vamF2YXNjcmlwdC91dGlsXCI7XG5pbXBvcnQgeyBTYW1wbGVEaXIgfSBmcm9tIFwiLi4vc2FtcGxlLWZpbGVcIjtcbmltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gXCIuLi90YXNrXCI7XG5pbXBvcnQgeyBUZXh0RmlsZSB9IGZyb20gXCIuLi90ZXh0ZmlsZVwiO1xuaW1wb3J0IHR5cGUgeyBQcm9qZW5yY09wdGlvbnMgYXMgUHJvamVucmNUc09wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNjcmlwdFwiO1xuaW1wb3J0IHsgUHJvamVucmMgYXMgUHJvamVucmNUcywgVHlwZWRvY0RvY2dlbiB9IGZyb20gXCIuLi90eXBlc2NyaXB0XCI7XG5pbXBvcnQgeyBkZWVwTWVyZ2UsIG11bHRpcGxlU2VsZWN0ZWQsIG5vcm1hbGl6ZVBlcnNpc3RlZFBhdGggfSBmcm9tIFwiLi4vdXRpbFwiO1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9rdWxzaGVraGFyLmdpdGh1Yi5pby90cy1qZXN0L2RvY3MvZ2V0dGluZy1zdGFydGVkL29wdGlvbnMvYmFiZWxDb25maWcvXG4gKi9cbmV4cG9ydCBjbGFzcyBUc0plc3RCYWJlbENvbmZpZyB7XG4gIC8qKlxuICAgKiBEaXNhYmxlcyB0aGUgdXNlIG9mIEJhYmVsXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRpc2FibGVkKCkge1xuICAgIHJldHVybiBuZXcgVHNKZXN0QmFiZWxDb25maWcoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgQmFiZWwgcHJvY2Vzc2luZ1xuICAgKlxuICAgKiBgdHMtamVzdGAgd2lsbCB0cnkgdG8gZmluZCBhbiBleGlzdGluZyBCYWJlbCBjb25maWd1cmF0aW9uIGFuZCBwYXNzIGl0IHRvIHRoZSBgYmFiZWwtamVzdGAgcHJvY2Vzc29yLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhdXRvRGV0ZWN0Q29uZmlnKCkge1xuICAgIHJldHVybiBuZXcgVHNKZXN0QmFiZWxDb25maWcodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUGF0aCB0byBhIGJhYmVscmMgZmlsZVxuICAgKlxuICAgKiBUaGUgcGF0aCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgd2hlcmUgeW91IHN0YXJ0IEplc3QgZnJvbS4gWW91IGNhbiBhbHNvIHVzZSBgPHJvb3REaXI+YCBpbiB0aGUgcGF0aC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUZpbGUoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgVHNKZXN0QmFiZWxDb25maWcoZmlsZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIElubGluZSBjb21waWxlciBvcHRpb25zXG4gICAqIEBzZWUgaHR0cHM6Ly9iYWJlbGpzLmlvL2RvY3Mvb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjdXN0b20oY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgcmV0dXJuIG5ldyBUc0plc3RCYWJlbENvbmZpZyhjb25maWcpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogYm9vbGVhbiB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICkge31cblxuICAvKipcbiAgICogQGpzaWkgaWdub3JlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpOiBib29sZWFuIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2t1bHNoZWtoYXIuZ2l0aHViLmlvL3RzLWplc3QvZG9jcy9nZXR0aW5nLXN0YXJ0ZWQvb3B0aW9ucy9kaWFnbm9zdGljcy9cbiAqL1xuZXhwb3J0IGNsYXNzIFRzSmVzdERpYWdub3N0aWNzIHtcbiAgLyoqXG4gICAqIEVuYWJsZSBhbGwgZGlhZ25vc3RpY3MuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFsbCgpIHtcbiAgICByZXR1cm4gbmV3IFRzSmVzdERpYWdub3N0aWNzKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgYWxsIGRpYWdub3N0aWNzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBub25lKCkge1xuICAgIHJldHVybiBuZXcgVHNKZXN0RGlhZ25vc3RpY3MoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgYSBjdXN0b20gZGlhZ25vc3RpY3MgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2t1bHNoZWtoYXIuZ2l0aHViLmlvL3RzLWplc3QvZG9jcy9nZXR0aW5nLXN0YXJ0ZWQvb3B0aW9ucy9kaWFnbm9zdGljcy9cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3VzdG9tKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHJldHVybiBuZXcgVHNKZXN0RGlhZ25vc3RpY3MoY29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb25maWc6IGJvb2xlYW4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7fVxuXG4gIC8qKlxuICAgKiBAanNpaSBpZ25vcmVcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgdG9KU09OKCk6IGJvb2xlYW4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8va3Vsc2hla2hhci5naXRodWIuaW8vdHMtamVzdC9kb2NzL2dldHRpbmctc3RhcnRlZC9vcHRpb25zL3RzY29uZmlnL1xuICovXG5leHBvcnQgY2xhc3MgVHNKZXN0VHNjb25maWcge1xuICAvKipcbiAgICogVXNlcyBgdHNjb25maWcuanNvbmAgaWYgZm91bmQsIG9yIHRoZSBidWlsdC1pbiBkZWZhdWx0IFR5cGVTY3JpcHQgY29tcGlsZXIgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXV0bygpIHtcbiAgICByZXR1cm4gbmV3IFRzSmVzdFRzY29uZmlnKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlYCB0cy1qZXN0YCB0byB1c2UgaXRzIGJ1aWx0LWluIGRlZmF1bHRzIGV2ZW4gaWYgdGhlcmUgaXMgYSBgdHNjb25maWcuanNvbmAgaW4geW91ciBwcm9qZWN0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBidWlsdEluRGVmYXVsdHMoKSB7XG4gICAgcmV0dXJuIG5ldyBUc0plc3RUc2NvbmZpZyhmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogUGF0aCB0byBhIGB0c2NvbmZpZ2AgZmlsZVxuICAgKlxuICAgKiBUaGUgcGF0aCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgd2hlcmUgeW91IHN0YXJ0IEplc3QgZnJvbS4gWW91IGNhbiBhbHNvIHVzZSBgPHJvb3REaXI+YCBpbiB0aGUgcGF0aCB0byBzdGFydCBmcm9tIHRoZSBwcm9qZWN0IHJvb3QgZGlyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRmlsZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBUc0plc3RUc2NvbmZpZyhmaWxlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogSW5saW5lIGNvbXBpbGVyIG9wdGlvbnNcbiAgICpcbiAgICogQHNlZSBUeXBlU2NyaXB0Q29tcGlsZXJPcHRpb25zXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGN1c3RvbShjb25maWc6IFR5cGVTY3JpcHRDb21waWxlck9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFRzSmVzdFRzY29uZmlnKGNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBib29sZWFuIHwgc3RyaW5nIHwgVHlwZVNjcmlwdENvbXBpbGVyT3B0aW9ucyxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBAanNpaSBpZ25vcmVcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgdG9KU09OKCk6IGJvb2xlYW4gfCBzdHJpbmcgfCBUeXBlU2NyaXB0Q29tcGlsZXJPcHRpb25zIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8va3Vsc2hla2hhci5naXRodWIuaW8vdHMtamVzdC9kb2NzL2dldHRpbmctc3RhcnRlZC9vcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHNKZXN0VHJhbnNmb3JtT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDdXN0b20gVHlwZVNjcmlwdCBBU1QgdHJhbnNmb3JtZXJzXG4gICAqXG4gICAqIEBkZWZhdWx0IGF1dG9cbiAgICovXG4gIHJlYWRvbmx5IGFzdFRyYW5zZm9ybWVycz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKlxuICAgKiBCYWJlbChKZXN0KSByZWxhdGVkIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IFRzSmVzdEJhYmVsQ29uZmlnLmRpc2FibGVkKClcbiAgICovXG4gIHJlYWRvbmx5IGJhYmVsQ29uZmlnPzogVHNKZXN0QmFiZWxDb25maWc7XG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IG1vZHVsZSB0byB1c2UgYXMgY29tcGlsZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwidHlwZXNjcmlwdFwiXG4gICAqL1xuICByZWFkb25seSBjb21waWxlcj86IHN0cmluZztcbiAgLyoqXG4gICAqIERpYWdub3N0aWNzIHJlbGF0ZWQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgVHNKZXN0RGlhZ25vc3RpY3MuYWxsKClcbiAgICovXG4gIHJlYWRvbmx5IGRpYWdub3N0aWNzPzogVHNKZXN0RGlhZ25vc3RpY3M7XG4gIC8qKlxuICAgKiBSdW4gdHMtamVzdCB0ZXN0cyB3aXRoIHRoaXMgVFNDb25maWcgaXNvbGF0ZWRNb2R1bGVzIHNldHRpbmcuXG4gICAqXG4gICAqIFlvdSdsbCBsb3NlIHR5cGUtY2hlY2tpbmcgYWJpbGl0eSBhbmQgc29tZSBmZWF0dXJlcyBzdWNoIGFzIGNvbnN0IGVudW0sIGJ1dCBpbiB0aGUgY2FzZSB5b3UgcGxhbiBvbiB1c2luZyBKZXN0IHdpdGggdGhlIGNhY2hlIGRpc2FibGVkIChqZXN0IC0tbm8tY2FjaGUpLCB5b3VyIHRlc3RzIHdpbGwgdGhlbiBydW4gbXVjaCBmYXN0ZXIuXG4gICAqIEBzZWUgaHR0cHM6Ly9rdWxzaGVraGFyLmdpdGh1Yi5pby90cy1qZXN0L2RvY3MvZ2V0dGluZy1zdGFydGVkL29wdGlvbnMvaXNvbGF0ZWRNb2R1bGVzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpc29sYXRlZE1vZHVsZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogRmlsZXMgd2hpY2ggd2lsbCBiZWNvbWUgbW9kdWxlcyByZXR1cm5pbmcgc2VsZiBjb250ZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBkaXNhYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgc3RyaW5naWZ5Q29udGVudFBhdGhSZWdleD86IHN0cmluZztcbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgY29tcGlsZXIgcmVsYXRlZCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFlvdXIgcHJvamVjdCdzIGB0c2NvbmZpZ0RldmAgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRzY29uZmlnPzogVHNKZXN0VHNjb25maWc7XG4gIC8qKlxuICAgKiBFbmFibGUgRVNNIHN1cHBvcnRcbiAgICpcbiAgICogQGRlZmF1bHQgYXV0b1xuICAgKi9cbiAgcmVhZG9ubHkgdXNlRVNNPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUc0plc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoaWNoIGZpbGVzIHNob3VsZCB0cy1qZXN0IGFjdCB1cG9uLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vamVzdGpzLmlvL2RvY3MvY29uZmlndXJhdGlvbiN0cmFuc2Zvcm0tb2JqZWN0c3RyaW5nLXBhdGh0b3RyYW5zZm9ybWVyLS1wYXRodG90cmFuc2Zvcm1lci1vYmplY3RcbiAgICpcbiAgICogQGRlZmF1bHQgXCJeLitcXFxcLlt0XXN4PyRcIlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNmb3JtUGF0dGVybj86IHN0cmluZztcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHRzLWplc3QgdHJhbnNmb3JtZXIgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zZm9ybU9wdGlvbnM/OiBUc0plc3RUcmFuc2Zvcm1PcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucyBleHRlbmRzIE5vZGVQcm9qZWN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUeXBlc2NyaXB0ICBhcnRpZmFjdHMgb3V0cHV0IGRpcmVjdG9yeVxuICAgKlxuICAgKiBAZGVmYXVsdCBcImxpYlwiXG4gICAqL1xuICByZWFkb25seSBsaWJkaXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFR5cGVzY3JpcHQgc291cmNlcyBkaXJlY3RvcnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwic3JjXCJcbiAgICovXG4gIHJlYWRvbmx5IHNyY2Rpcj86IHN0cmluZztcblxuICAvKipcbiAgICogSmVzdCB0ZXN0cyBkaXJlY3RvcnkuIFRlc3RzIGZpbGVzIHNob3VsZCBiZSBuYW1lZCBgeHh4LnRlc3QudHNgLlxuICAgKlxuICAgKiBJZiB0aGlzIGRpcmVjdG9yeSBpcyB1bmRlciBgc3JjZGlyYCAoZS5nLiBgc3JjL3Rlc3RgLCBgc3JjL19fdGVzdHNfX2ApLFxuICAgKiB0aGVuIHRlc3RzIGFyZSBnb2luZyB0byBiZSBjb21waWxlZCBpbnRvIGBsaWIvYCBhbmQgZXhlY3V0ZWQgYXMgamF2YXNjcmlwdC5cbiAgICogSWYgdGhlIHRlc3QgZGlyZWN0b3J5IGlzIG91dHNpZGUgb2YgYHNyY2AsIHRoZW4gd2UgY29uZmlndXJlIGplc3QgdG9cbiAgICogY29tcGlsZSB0aGUgY29kZSBpbi1tZW1vcnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwidGVzdFwiXG4gICAqL1xuICByZWFkb25seSB0ZXN0ZGlyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZXR1cCBlc2xpbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdHJ1ZSwgdW5sZXNzIGJpb21lIGlzIGVuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVzbGludD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVzbGludCBvcHRpb25zXG4gICAqIEBkZWZhdWx0IC0gb3BpbmlvbmF0ZWQgZGVmYXVsdCBvcHRpb25zXG4gICAqL1xuICByZWFkb25seSBlc2xpbnRPcHRpb25zPzogRXNsaW50T3B0aW9ucztcblxuICAvKipcbiAgICogVHlwZVNjcmlwdCB2ZXJzaW9uIHRvIHVzZS5cbiAgICpcbiAgICogTk9URTogVHlwZXNjcmlwdCBpcyBub3Qgc2VtYW50aWNhbGx5IHZlcnNpb25lZCBhbmQgc2hvdWxkIHJlbWFpbiBvbiB0aGVcbiAgICogc2FtZSBtaW5vciwgc28gd2UgcmVjb21tZW5kIHVzaW5nIGEgYH5gIGRlcGVuZGVuY3kgKGUuZy4gYH4xLjIuM2ApLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImxhdGVzdFwiXG4gICAqL1xuICByZWFkb25seSB0eXBlc2NyaXB0VmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogRG9jZ2VuIGJ5IFR5cGVkb2NcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRvY2dlbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERvY3MgZGlyZWN0b3J5XG4gICAqXG4gICAqIEBkZWZhdWx0IFwiZG9jc1wiXG4gICAqL1xuICByZWFkb25seSBkb2NzRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gVFNDb25maWdcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IHRzY29uZmlnPzogVHlwZXNjcmlwdENvbmZpZ09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSB0c2NvbmZpZyBvcHRpb25zIGZvciB0aGUgZGV2ZWxvcG1lbnQgdHNjb25maWcuanNvbiBmaWxlICh1c2VkIGZvciB0ZXN0aW5nKS5cbiAgICogQGRlZmF1bHQgLSB1c2UgdGhlIHByb2R1Y3Rpb24gdHNjb25maWcgb3B0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgdHNjb25maWdEZXY/OiBUeXBlc2NyaXB0Q29uZmlnT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIG5hbWUgKGFuZCBwYXRoKSBvZiB0aGUgZGV2ZWxvcG1lbnQgdHNjb25maWcgZmlsZS5cbiAgICpcbiAgICogQnkgZGVmYXVsdCB0aGlzIGxpdmVzIGluc2lkZSB0aGUgdGVzdCBkaXJlY3RvcnkgKGUuZy4gYHRlc3QvdHNjb25maWcuanNvbmApXG4gICAqIHNvIHRoYXQgdGhlIFR5cGVTY3JpcHQgbGFuZ3VhZ2Ugc2VydmljZSByZXNvbHZlcyBpdCBhcyB0aGUgbmVhcmVzdCBjb25maWdcbiAgICogZm9yIHRlc3QgZmlsZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gXCJ7dGVzdGRpcn0vdHNjb25maWcuanNvblwiXG4gICAqL1xuICByZWFkb25seSB0c2NvbmZpZ0RldkZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERvIG5vdCBnZW5lcmF0ZSBhIGB0c2NvbmZpZy5qc29uYCBmaWxlICh1c2VkIGJ5IGpzaWkgcHJvamVjdHMgc2luY2VcbiAgICogdHNjb25maWcuanNvbiBpcyBnZW5lcmF0ZWQgYnkgdGhlIGpzaWkgY29tcGlsZXIpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZVRzY29uZmlnPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIERvIG5vdCBnZW5lcmF0ZSBhIGRldmVsb3BtZW50IHRzY29uZmlnIGZpbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkaXNhYmxlVHNjb25maWdEZXY/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBvbmUtdGltZSBzYW1wbGUgaW4gYHNyYy9gIGFuZCBgdGVzdC9gIGlmIHRoZXJlIGFyZSBubyBmaWxlcyB0aGVyZS5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2FtcGxlQ29kZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSAuZC50cyBmaWxlIHRoYXQgaW5jbHVkZXMgdGhlIHR5cGUgZGVjbGFyYXRpb25zIGZvciB0aGlzIG1vZHVsZS5cbiAgICogQGRlZmF1bHQgLSAuZC50cyBmaWxlIGRlcml2ZWQgZnJvbSB0aGUgcHJvamVjdCdzIGVudHJ5cG9pbnQgKHVzdWFsbHkgbGliL2luZGV4LmQudHMpXG4gICAqL1xuICByZWFkb25seSBlbnRyeXBvaW50VHlwZXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVzZSBUeXBlU2NyaXB0IGZvciB5b3VyIHByb2plbnJjIGZpbGUgKGAucHJvamVucmMudHNgKS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQHBqbmV3IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHByb2plbnJjVHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciAucHJvamVucmMudHNcbiAgICovXG4gIHJlYWRvbmx5IHByb2plbnJjVHNPcHRpb25zPzogUHJvamVucmNUc09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIHRzLWplc3RcbiAgICovXG4gIHJlYWRvbmx5IHRzSmVzdE9wdGlvbnM/OiBUc0plc3RPcHRpb25zO1xufVxuXG4vKipcbiAqIFR5cGVTY3JpcHQgcHJvamVjdFxuICogQHBqaWQgdHlwZXNjcmlwdFxuICovXG5leHBvcnQgY2xhc3MgVHlwZVNjcmlwdFByb2plY3QgZXh0ZW5kcyBOb2RlUHJvamVjdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9UU19KRVNUX1RSQU5GT1JNX1BBVFRFUk4gPSBcIl4uK1xcXFwuW3Rdc3g/JFwiO1xuXG4gIHB1YmxpYyByZWFkb25seSBkb2NnZW4/OiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgZG9jc0RpcmVjdG9yeTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgZXNsaW50PzogRXNsaW50O1xuICBwdWJsaWMgcmVhZG9ubHkgdHNjb25maWdFc2xpbnQ/OiBUeXBlc2NyaXB0Q29uZmlnO1xuICBwdWJsaWMgcmVhZG9ubHkgdHNjb25maWc/OiBUeXBlc2NyaXB0Q29uZmlnO1xuXG4gIC8qKlxuICAgKiBBIHR5cGVzY3JpcHQgY29uZmlndXJhdGlvbiBmaWxlIHdoaWNoIGNvdmVycyBhbGwgZmlsZXMgKHNvdXJjZXMsIHRlc3RzLCBwcm9qZW4pLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRzY29uZmlnRGV2OiBUeXBlc2NyaXB0Q29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSAudHMgc291cmNlcyByZXNpZGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3JjZGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggY29tcGlsZWQgLmpzIGZpbGVzIHJlc2lkZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsaWJkaXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0ZXN0cyByZXNpZGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGVzdGRpcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgXCJ3YXRjaFwiIHRhc2suXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd2F0Y2hUYXNrOiBUYXNrO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFR5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG5cbiAgICAgIC8vIGRpc2FibGUgLnByb2plbnJjLmpzIGlmIHR5cGVzY3JpcHQgaXMgZW5hYmxlZFxuICAgICAgcHJvamVucmNKczogb3B0aW9ucy5wcm9qZW5yY1RzID8gZmFsc2UgOiBvcHRpb25zLnByb2plbnJjSnMsXG5cbiAgICAgIGplc3RPcHRpb25zOiB7XG4gICAgICAgIC4uLm9wdGlvbnMuamVzdE9wdGlvbnMsXG4gICAgICAgIGplc3RDb25maWc6IHtcbiAgICAgICAgICAuLi5vcHRpb25zLmplc3RPcHRpb25zPy5qZXN0Q29uZmlnLFxuICAgICAgICAgIHRlc3RNYXRjaDogb3B0aW9ucy5qZXN0T3B0aW9ucz8uamVzdENvbmZpZz8udGVzdE1hdGNoID8/IFtdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuc3JjZGlyID0gb3B0aW9ucy5zcmNkaXIgPz8gXCJzcmNcIjtcbiAgICB0aGlzLmxpYmRpciA9IG9wdGlvbnMubGliZGlyID8/IFwibGliXCI7XG5cbiAgICB0aGlzLmRvY2dlbiA9IG9wdGlvbnMuZG9jZ2VuO1xuICAgIHRoaXMuZG9jc0RpcmVjdG9yeSA9IG9wdGlvbnMuZG9jc0RpcmVjdG9yeSA/PyBcImRvY3MvXCI7XG5cbiAgICBjb25zdCB0c2NvbmZpZ0ZpbGVuYW1lID0gb3B0aW9ucy50c2NvbmZpZz8uZmlsZU5hbWU7XG4gICAgdGhpcy5jb21waWxlVGFzay5leGVjKFxuICAgICAgW1widHNjXCIsIFwiLS1idWlsZFwiLCB0c2NvbmZpZ0ZpbGVuYW1lXS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiBcIiksXG4gICAgKTtcblxuICAgIHRoaXMud2F0Y2hUYXNrID0gdGhpcy5hZGRUYXNrKFwid2F0Y2hcIiwge1xuICAgICAgZGVzY3JpcHRpb246IFwiV2F0Y2ggJiBjb21waWxlIGluIHRoZSBiYWNrZ3JvdW5kXCIsXG4gICAgICBleGVjOiBbXCJ0c2NcIiwgXCItLWJ1aWxkXCIsIFwiLXdcIiwgdHNjb25maWdGaWxlbmFtZV1cbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAuam9pbihcIiBcIiksXG4gICAgfSk7XG5cbiAgICB0aGlzLnRlc3RkaXIgPSBvcHRpb25zLnRlc3RkaXIgPz8gXCJ0ZXN0XCI7XG4gICAgdGhpcy5naXRpZ25vcmUuaW5jbHVkZShgLyR7dGhpcy50ZXN0ZGlyfS9gKTtcbiAgICB0aGlzLm5wbWlnbm9yZT8uZXhjbHVkZShgLyR7dGhpcy50ZXN0ZGlyfS9gKTtcblxuICAgIC8vIGlmIHRoZSB0ZXN0IGRpcmVjdG9yeSBpcyB1bmRlciBgc3JjL2AsIHRoZW4gd2Ugd2lsbCBydW4gb3VyIHRlc3RzIGFnYWluc3RcbiAgICAvLyB0aGUgamF2YXNjcmlwdCBmaWxlcyBhbmQgbm90IGxldCBqZXN0IGNvbXBpbGUgaXQgZm9yIHVzLlxuICAgIGNvbnN0IGNvbXBpbGVkVGVzdHMgPSB0aGlzLnRlc3RkaXIuc3RhcnRzV2l0aCh0aGlzLnNyY2RpciArIHBhdGgucG9zaXguc2VwKTtcblxuICAgIGlmIChvcHRpb25zLmVudHJ5cG9pbnRUeXBlcyB8fCB0aGlzLnBhY2thZ2UuZW50cnlwb2ludCAhPT0gXCJcIikge1xuICAgICAgY29uc3QgZW50cnlwb2ludFBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIHBhdGguZGlybmFtZSh0aGlzLnBhY2thZ2UuZW50cnlwb2ludCksXG4gICAgICAgIHBhdGguYmFzZW5hbWUodGhpcy5wYWNrYWdlLmVudHJ5cG9pbnQsIFwiLmpzXCIpLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplUGVyc2lzdGVkUGF0aChlbnRyeXBvaW50UGF0aCk7XG4gICAgICBjb25zdCBlbnRyeXBvaW50VHlwZXMgPVxuICAgICAgICBvcHRpb25zLmVudHJ5cG9pbnRUeXBlcyA/PyBgJHtub3JtYWxpemVkUGF0aH0uZC50c2A7XG4gICAgICB0aGlzLnBhY2thZ2UuYWRkRmllbGQoXCJ0eXBlc1wiLCBlbnRyeXBvaW50VHlwZXMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmRpc2FibGVUc2NvbmZpZ0RldiAmJiBvcHRpb25zLmRpc2FibGVUc2NvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkNhbm5vdCBzcGVjaWZ5IGJvdGggJ2Rpc2FibGVUc2NvbmZpZ0RldicgYW5kICdkaXNhYmxlVHNjb25maWcnIGZpZWxkcy5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkSGF2ZVRzY29uZmlnID0gIW9wdGlvbnMuZGlzYWJsZVRzY29uZmlnO1xuICAgIGNvbnN0IHNob3VsZEhhdmVEZXZUc2NvbmZpZyA9ICFvcHRpb25zLmRpc2FibGVUc2NvbmZpZ0RldjtcblxuICAgIGlmIChzaG91bGRIYXZlVHNjb25maWcpIHtcbiAgICAgIHRoaXMudHNjb25maWcgPSB0aGlzLm1ha2VUc2NvbmZpZyhvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkSGF2ZURldlRzY29uZmlnKSB7XG4gICAgICAvLyBXaGVuIGEgcm9vdCB0c2NvbmZpZyBleGlzdHMsIHRoZSBkZXYvdGVzdCBjb25maWcgbGl2ZXMgaW5zaWRlIHRoZSB0ZXN0XG4gICAgICAvLyBkaXJlY3RvcnkgYW5kIGV4dGVuZHMgaXQ7IG90aGVyd2lzZSBpdCBpcyBhIHNlbGYtY29udGFpbmVkIGNvbmZpZyBhdFxuICAgICAgLy8gdGhlIHJlcG9zaXRvcnkgcm9vdC5cbiAgICAgIHRoaXMudHNjb25maWdEZXYgPSB0aGlzLnRzY29uZmlnXG4gICAgICAgID8gdGhpcy5tYWtlRGV2VHNjb25maWcob3B0aW9ucywgdGhpcy50c2NvbmZpZylcbiAgICAgICAgOiB0aGlzLm1ha2VTdGFuZGFsb25lRGV2VHNjb25maWcob3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGBkaXNhYmxlVHNjb25maWdEZXZgOiByZXVzZSB0aGUgbWFpbiB0c2NvbmZpZyBhcyB0aGUgZGV2IGNvbmZpZy5cbiAgICAgIHRoaXMudHNjb25maWdEZXYgPSB0aGlzLnRzY29uZmlnITtcbiAgICB9XG5cbiAgICB0aGlzLmdpdGlnbm9yZS5pbmNsdWRlKGAvJHt0aGlzLnNyY2Rpcn0vYCk7XG4gICAgdGhpcy5ucG1pZ25vcmU/LmV4Y2x1ZGUoYC8ke3RoaXMuc3JjZGlyfS9gKTtcblxuICAgIGlmICh0aGlzLnNyY2RpciAhPT0gdGhpcy5saWJkaXIpIHtcbiAgICAgIC8vIHNlcGFyYXRlZCwgY2FuIGlnbm9yZSB0aGUgZW50aXJlIGxpYmRpclxuICAgICAgdGhpcy5naXRpZ25vcmUuZXhjbHVkZShgLyR7dGhpcy5saWJkaXJ9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbGxvY2F0ZWQsIGNhbiBvbmx5IGlnbm9yZSB0aGUgY29tcGlsZWQgb3V0cHV0XG4gICAgICB0aGlzLmdpdGlnbm9yZS5leGNsdWRlKGAvJHt0aGlzLmxpYmRpcn0vKiovKi5qc2ApO1xuICAgICAgdGhpcy5naXRpZ25vcmUuZXhjbHVkZShgLyR7dGhpcy5saWJkaXJ9LyoqLyouZC50c2ApO1xuICAgICAgdGhpcy5naXRpZ25vcmUuZXhjbHVkZShgLyR7dGhpcy5saWJkaXJ9LyoqLyouZC50cy5tYXBgKTtcbiAgICB9XG5cbiAgICB0aGlzLm5wbWlnbm9yZT8uaW5jbHVkZShgLyR7dGhpcy5saWJkaXJ9L2ApO1xuXG4gICAgdGhpcy5ucG1pZ25vcmU/LmluY2x1ZGUoYC8ke3RoaXMubGliZGlyfS8qKi8qLmpzYCk7XG4gICAgdGhpcy5ucG1pZ25vcmU/LmluY2x1ZGUoYC8ke3RoaXMubGliZGlyfS8qKi8qLmQudHNgKTtcblxuICAgIHRoaXMuZ2l0aWdub3JlLmV4Y2x1ZGUoXCIvZGlzdC9cIik7XG4gICAgdGhpcy5ucG1pZ25vcmU/LmV4Y2x1ZGUoXCJkaXN0XCIpOyAvLyBqc2lpLXBhY21hayBleHBlY3RzIHRoaXMgdG8gYmUgXCJkaXN0XCIgYW5kIG5vdCBcIi9kaXN0XCIuIG90aGVyd2lzZSBpdCB3aWxsIHRhbXBlciB3aXRoIGl0XG5cbiAgICB0aGlzLm5wbWlnbm9yZT8uZXhjbHVkZShcIi90c2NvbmZpZy5qc29uXCIpO1xuICAgIHRoaXMubnBtaWdub3JlPy5leGNsdWRlKFwiLy5naXRodWIvXCIpO1xuICAgIHRoaXMubnBtaWdub3JlPy5leGNsdWRlKFwiLy52c2NvZGUvXCIpO1xuICAgIHRoaXMubnBtaWdub3JlPy5leGNsdWRlKFwiLy5pZGVhL1wiKTtcbiAgICB0aGlzLm5wbWlnbm9yZT8uZXhjbHVkZShcIi8ucHJvamVucmMuanNcIik7XG4gICAgdGhpcy5ucG1pZ25vcmU/LmV4Y2x1ZGUoXCJ0c2NvbmZpZy50c2J1aWxkaW5mb1wiKTtcblxuICAgIGlmICh0aGlzLmplc3QpIHtcbiAgICAgIGlmIChjb21waWxlZFRlc3RzKSB7XG4gICAgICAgIHRoaXMuYWRkSmVzdENvbXBpbGVkKHRoaXMuamVzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkZEplc3ROb0NvbXBpbGUodGhpcy5qZXN0LCBvcHRpb25zPy50c0plc3RPcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMaW50ZXIgdG9vbCBzZWxlY3Rpb25cbiAgICAvLyBlc2xpbnQgaXMgdGhlIGRlZmF1bHQsIGJ1dCBpZiBiaW9tZSBoYXMgYmVlbiBlbmFibGVkIGluIHRoZSBwYXJlbnQgY2xhc3MgYW5kIGVzbGludCB1bnNldCwgd2UgZGVmYXVsdCB0byBiaW9tZVxuICAgIGNvbnN0IGJpb21lRW5hYmxlZCA9IHRoaXMuYmlvbWUgIT0gbnVsbDtcbiAgICBjb25zdCBlc2xpbnRFbmFibGVkID0gb3B0aW9ucy5lc2xpbnQgPz8gIWJpb21lRW5hYmxlZDsgLy8gZXNsaW50IGRlZmF1bHRzIHRvIHRoZSBvcHBvc2l0ZSBvZiBiaW9tZVxuXG4gICAgaWYgKG11bHRpcGxlU2VsZWN0ZWQoW2Jpb21lRW5hYmxlZCwgZXNsaW50RW5hYmxlZF0pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPbmx5IG9uZSBvZiBiaW9tZSBhbmQgZXNsaW50IGNhbiBiZSBlbmFibGVkLlwiKTtcbiAgICB9XG5cbiAgICBpZiAoZXNsaW50RW5hYmxlZCkge1xuICAgICAgdGhpcy5lc2xpbnQgPSBuZXcgRXNsaW50KHRoaXMsIHtcbiAgICAgICAgdHNjb25maWdQYXRoOiBgLi8keyh0aGlzLnRzY29uZmlnID8/IHRoaXMudHNjb25maWdEZXYpLmZpbGVOYW1lfWAsXG4gICAgICAgIHByb2plY3RTZXJ2aWNlOiB0cnVlLFxuICAgICAgICBkaXJzOiBbdGhpcy5zcmNkaXJdLFxuICAgICAgICBkZXZkaXJzOiBbdGhpcy50ZXN0ZGlyLCBcImJ1aWxkLXRvb2xzXCJdLFxuICAgICAgICBmaWxlRXh0ZW5zaW9uczogW1wiLnRzXCIsIFwiLnRzeFwiXSxcbiAgICAgICAgLi4ub3B0aW9ucy5lc2xpbnRPcHRpb25zLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMudHNjb25maWdFc2xpbnQgPSB0aGlzLnRzY29uZmlnRGV2O1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgc3JjIGFuZCB0ZXN0IGRpcmVjdG9yaWVzXG4gICAgLy8gbm8gbmVlZCB0byBleGNsdWRlIGJ1aWxkIGFydGlmYWN0czogYmlvbWUgaWdub3JlcyBmaWxlcyBpbiAuZ2l0aWdub3JlXG4gICAgdGhpcy5iaW9tZT8uYWRkRmlsZVBhdHRlcm4oYCR7dGhpcy5zcmNkaXJ9LyoqYCk7XG4gICAgdGhpcy5iaW9tZT8uYWRkRmlsZVBhdHRlcm4oYCR7dGhpcy50ZXN0ZGlyfS8qKmApO1xuXG4gICAgLy8gd2hlbiB0aGlzIGlzIGEgcm9vdCBwcm9qZWN0XG4gICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgaWYgKG9wdGlvbnMucHJvamVucmNUcykge1xuICAgICAgICBuZXcgUHJvamVucmNUcyh0aGlzLCBvcHRpb25zLnByb2plbnJjVHNPcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHByb2plbnJjLmpzIGNyZWF0ZWQgaW4gTm9kZVByb2plY3QgbmVlZHMgdG8gYmUgYWRkZWQgaW4gdHNjb25maWdEZXYuXG4gICAgICAgIC8vIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgZGV2IGNvbmZpZyBsaXZlcyBhdCB0aGUgcmVwb3NpdG9yeSByb290XG4gICAgICAgIC8vIChpLmUuIGl0IHdhcyBub3QgcmVsb2NhdGVkIGludG8gdGhlIHRlc3QgZGlyZWN0b3J5IG9yIGFsaWFzZWQgdG8gdGhlXG4gICAgICAgIC8vIHJvb3QgdHNjb25maWcpOyBvdGhlcndpc2UgdGhlIGluY2x1ZGUgcGF0aCB3b3VsZCBub3QgcmVzb2x2ZS5cbiAgICAgICAgY29uc3QgcHJvamVucmNKcyA9IE5vZGVQcm9qZWN0UHJvamVucmMub2YodGhpcyk7XG4gICAgICAgIGlmIChwcm9qZW5yY0pzICYmIHNob3VsZEhhdmVEZXZUc2NvbmZpZyAmJiAhc2hvdWxkSGF2ZVRzY29uZmlnKSB7XG4gICAgICAgICAgdGhpcy50c2NvbmZpZ0Rldi5hZGRJbmNsdWRlKHByb2plbnJjSnMuZmlsZVBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdHNEZXAgPSBvcHRpb25zLnR5cGVzY3JpcHRWZXJzaW9uXG4gICAgICA/IGB0eXBlc2NyaXB0QCR7b3B0aW9ucy50eXBlc2NyaXB0VmVyc2lvbn1gXG4gICAgICA6IFwidHlwZXNjcmlwdFwiO1xuICAgIHRoaXMuYWRkRGV2RGVwcyh0c0RlcCk7XG5cbiAgICB0aGlzLmFkZE5vZGVUeXBlc1ZlcnNpb24ob3B0aW9ucy50eXBlc2NyaXB0VmVyc2lvbiwgb3B0aW9ucy5taW5Ob2RlVmVyc2lvbik7XG5cbiAgICAvLyBnZW5lcmF0ZSBzYW1wbGUgY29kZSBpbiBgc3JjYCBhbmQgYGxpYmAgaWYgdGhlc2UgZGlyZWN0b3JpZXMgYXJlIGVtcHR5IG9yIG5vbi1leGlzdGVudC5cbiAgICBpZiAob3B0aW9ucy5zYW1wbGVDb2RlID8/IHRydWUpIHtcbiAgICAgIG5ldyBTYW1wbGVDb2RlKHRoaXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRvY2dlbikge1xuICAgICAgbmV3IFR5cGVkb2NEb2NnZW4odGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtYWluIGB0c2NvbmZpZy5qc29uYCB1c2VkIHRvIGNvbXBpbGUgdGhlIHByb2plY3QgKHNyYyAtPiBsaWIpLlxuICAgKi9cbiAgcHJpdmF0ZSBtYWtlVHNjb25maWcob3B0aW9uczogVHlwZVNjcmlwdFByb2plY3RPcHRpb25zKTogVHlwZXNjcmlwdENvbmZpZyB7XG4gICAgcmV0dXJuIG5ldyBUeXBlc2NyaXB0Q29uZmlnKFxuICAgICAgdGhpcyxcbiAgICAgIG1lcmdlVHNjb25maWdPcHRpb25zKFxuICAgICAgICB7XG4gICAgICAgICAgaW5jbHVkZTogW2Ake3RoaXMuc3JjZGlyfS8qKi8qLnRzYF0sXG4gICAgICAgICAgZXhjbHVkZTogW1wibm9kZV9tb2R1bGVzXCJdLFxuICAgICAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICAgICAgcm9vdERpcjogdGhpcy5zcmNkaXIsXG4gICAgICAgICAgICBvdXREaXI6IHRoaXMubGliZGlyLFxuICAgICAgICAgICAgLi4udGhpcy5kZWZhdWx0VHlwZVNjcmlwdENvbXBpbGVyT3B0aW9ucygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMudHNjb25maWcsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRldmVsb3BtZW50L3Rlc3QgdHNjb25maWcsIHBsYWNlZCBpbnNpZGUgdGhlIHRlc3QgZGlyZWN0b3J5IHNvIHRoYXQgdGhlXG4gICAqIFR5cGVTY3JpcHQgbGFuZ3VhZ2Ugc2VydmljZSBwaWNrcyBpdCB1cCBmb3IgdGVzdCBmaWxlcy4gYHRzc2VydmVyYCAoYW5kXG4gICAqIGVkaXRvcnMgbGlrZSBWUyBDb2RlID49IDEuMTE0LCB3aGljaCBidW5kbGUgVHlwZVNjcmlwdCA2KSByZXNvbHZlIHRoZVxuICAgKiBuZWFyZXN0IGB0c2NvbmZpZy5qc29uYCBzdGFydGluZyBmcm9tIHRoZSBzb3VyY2UgZmlsZSBhbmQgbm8gbG9uZ2VyXG4gICAqIGRpc2NvdmVyIGEgZGlmZmVyZW50bHktbmFtZWQgY29uZmlnIChlLmcuIGB0c2NvbmZpZy5kZXYuanNvbmApIGF0IHRoZSByb290LlxuICAgKlxuICAgKiBJdCBleHRlbmRzIHRoZSByb290IHRzY29uZmlnIGFuZCBpcyB0eXBlLWNoZWNrIG9ubHkgKGBub0VtaXRgKSwgc28gaXQgbmV2ZXJcbiAgICogcGFydGljaXBhdGVzIGluIHRoZSBidWlsZC5cbiAgICovXG4gIHByaXZhdGUgbWFrZURldlRzY29uZmlnKFxuICAgIG9wdGlvbnM6IFR5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucyxcbiAgICB0c2NvbmZpZzogVHlwZXNjcmlwdENvbmZpZyxcbiAgKTogVHlwZXNjcmlwdENvbmZpZyB7XG4gICAgY29uc3QgdHNjb25maWdEZXZGaWxlID1cbiAgICAgIG9wdGlvbnMudHNjb25maWdEZXZGaWxlID8/IGAke3RoaXMudGVzdGRpcn0vdHNjb25maWcuanNvbmA7XG4gICAgLy8gVGhlIHJvb3QgdHNjb25maWcgc2V0cyBgcm9vdERpcmAgdG8gdGhlIHNvdXJjZSBkaXJlY3RvcnkuIFNpbmNlIHRoaXNcbiAgICAvLyBjb25maWcgYWxzbyB0eXBlLWNoZWNrcyBmaWxlcyBvdXRzaWRlIGBzcmNgICh0aGUgdGVzdHMsIGFuZCBgc3JjYCBmaWxlc1xuICAgIC8vIHB1bGxlZCBpbiB2aWEgaW1wb3J0cyksIHBvaW50IGByb290RGlyYCBhdCB0aGUgcHJvamVjdCByb290IHJlbGF0aXZlIHRvXG4gICAgLy8gdGhlIGNvbmZpZydzIG93biBsb2NhdGlvbiB0byBhdm9pZCBUUzYwNTkgKFwibm90IHVuZGVyIHJvb3REaXJcIikuIFRoaXNcbiAgICAvLyBvbmx5IGFmZmVjdHMgdGhlIChzdXBwcmVzc2VkKSBlbWl0IGxheW91dC5cbiAgICBjb25zdCByb290RGlyID1cbiAgICAgIHBhdGgucG9zaXgucmVsYXRpdmUocGF0aC5wb3NpeC5kaXJuYW1lKHRzY29uZmlnRGV2RmlsZSksIFwiLlwiKSB8fCBcIi5cIjtcbiAgICBjb25zdCBkZXZUc2NvbmZpZyA9IG5ldyBUeXBlc2NyaXB0Q29uZmlnKFxuICAgICAgdGhpcyxcbiAgICAgIG1lcmdlVHNjb25maWdPcHRpb25zKFxuICAgICAgICB7XG4gICAgICAgICAgZmlsZU5hbWU6IHRzY29uZmlnRGV2RmlsZSxcbiAgICAgICAgICAvLyBpbmNsdWRlIGlzIHJlbGF0aXZlIHRvIHRoZSBjb25maWcncyBkaXJlY3RvcnkgKHRoZSB0ZXN0IGRpcilcbiAgICAgICAgICBpbmNsdWRlOiBbXCIqKi8qLnRzXCJdLFxuICAgICAgICAgIGV4Y2x1ZGU6IFtcIm5vZGVfbW9kdWxlc1wiXSxcbiAgICAgICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgICAgIC8vIHR5cGUtY2hlY2sgb25seTsgdGhlIHJvb3QgdHNjb25maWcgb3ducyBjb21waWxhdGlvblxuICAgICAgICAgICAgbm9FbWl0OiB0cnVlLFxuICAgICAgICAgICAgcm9vdERpcixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLnRzY29uZmlnRGV2LFxuICAgICAgKSxcbiAgICApO1xuICAgIC8vIGluaGVyaXQgYWxsIGNvbXBpbGVyIG9wdGlvbnMgKGluY2x1ZGluZyB0aGUgZHluYW1pY2FsbHkgcmVzb2x2ZWQgYHR5cGVzYClcbiAgICAvLyBmcm9tIHRoZSByb290IHRzY29uZmlnLlxuICAgIGRldlRzY29uZmlnLmFkZEV4dGVuZHModHNjb25maWcpO1xuICAgIHJldHVybiBkZXZUc2NvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNlbGYtY29udGFpbmVkIGRldmVsb3BtZW50IHRzY29uZmlnIGF0IHRoZSByZXBvc2l0b3J5IHJvb3QsIHVzZWQgd2hlblxuICAgKiB0aGVyZSBpcyBubyByb290IHRzY29uZmlnIHRvIGV4dGVuZCAoZS5nLiBgZGlzYWJsZVRzY29uZmlnYCkuXG4gICAqL1xuICBwcml2YXRlIG1ha2VTdGFuZGFsb25lRGV2VHNjb25maWcoXG4gICAgb3B0aW9uczogVHlwZVNjcmlwdFByb2plY3RPcHRpb25zLFxuICApOiBUeXBlc2NyaXB0Q29uZmlnIHtcbiAgICBjb25zdCB0c2NvbmZpZ0RldkZpbGUgPSBvcHRpb25zLnRzY29uZmlnRGV2RmlsZSA/PyBcInRzY29uZmlnLmRldi5qc29uXCI7XG4gICAgcmV0dXJuIG5ldyBUeXBlc2NyaXB0Q29uZmlnKFxuICAgICAgdGhpcyxcbiAgICAgIG1lcmdlVHNjb25maWdPcHRpb25zKFxuICAgICAgICB7XG4gICAgICAgICAgZmlsZU5hbWU6IHRzY29uZmlnRGV2RmlsZSxcbiAgICAgICAgICBpbmNsdWRlOiBbYCR7dGhpcy5zcmNkaXJ9LyoqLyoudHNgLCBgJHt0aGlzLnRlc3RkaXJ9LyoqLyoudHNgXSxcbiAgICAgICAgICBleGNsdWRlOiBbXCJub2RlX21vZHVsZXNcIl0sXG4gICAgICAgICAgY29tcGlsZXJPcHRpb25zOiB0aGlzLmRlZmF1bHRUeXBlU2NyaXB0Q29tcGlsZXJPcHRpb25zKCksXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMudHNjb25maWcsXG4gICAgICAgIG9wdGlvbnMudHNjb25maWdEZXYsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUHJvamVuIGRlZmF1bHQgVHlwZXNjcmlwdCBjb21waWxlciBvcHRpb25zLlxuICAgKi9cbiAgcHJvdGVjdGVkIGRlZmF1bHRUeXBlU2NyaXB0Q29tcGlsZXJPcHRpb25zKCk6IFR5cGVTY3JpcHRDb21waWxlck9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSxcbiAgICAgIGV4cGVyaW1lbnRhbERlY29yYXRvcnM6IHRydWUsXG4gICAgICBpbmxpbmVTb3VyY2VNYXA6IHRydWUsXG4gICAgICBpbmxpbmVTb3VyY2VzOiB0cnVlLFxuICAgICAgbGliOiBbXCJlczIwMjBcIl0sXG4gICAgICBtb2R1bGU6IFwiQ29tbW9uSlNcIixcbiAgICAgIG5vRW1pdE9uRXJyb3I6IGZhbHNlLFxuICAgICAgbm9GYWxsdGhyb3VnaENhc2VzSW5Td2l0Y2g6IHRydWUsXG4gICAgICBub0ltcGxpY2l0QW55OiB0cnVlLFxuICAgICAgbm9JbXBsaWNpdFJldHVybnM6IHRydWUsXG4gICAgICBub0ltcGxpY2l0VGhpczogdHJ1ZSxcbiAgICAgIG5vVW51c2VkTG9jYWxzOiB0cnVlLFxuICAgICAgbm9VbnVzZWRQYXJhbWV0ZXJzOiB0cnVlLFxuICAgICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsXG4gICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICBzdHJpY3ROdWxsQ2hlY2tzOiB0cnVlLFxuICAgICAgc3RyaWN0UHJvcGVydHlJbml0aWFsaXphdGlvbjogdHJ1ZSxcbiAgICAgIHN0cmlwSW50ZXJuYWw6IHRydWUsXG4gICAgICB0YXJnZXQ6IFwiRVMyMDIwXCIsXG4gICAgICB0eXBlczogKCgpID0+IHRoaXMucmVzb2x2ZUluc3RhbGxlZFR5cGVzKCkpIGFzIGFueSwgLy8gVFM2LjAgY29tcGF0LCBAc2VlIGh0dHBzOi8vZGV2YmxvZ3MubWljcm9zb2Z0LmNvbS90eXBlc2NyaXB0L2Fubm91bmNpbmctdHlwZXNjcmlwdC02LTAvI3VwLWZyb250LWFkanVzdG1lbnRzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYEB0eXBlcy9ub2RlYCB0byB0aGlzIHByb2plY3QuXG4gICAqXG4gICAqIElmIHRoZSB1c2VyIGhhcyBhbHJlYWR5IGFkZGVkIHRoaXMgZGVwZW5kZW5jeSwgZG8gbm90aGluZy5cbiAgICogT3RoZXJ3aXNlIHVzZSB0aGUgbWFqb3IgdmVyc2lvbiBvZiBgbWluTm9kZVZlcnNpb25gLlxuICAgKiBJZiB0aGF0J3Mgbm90IGF2YWlsYWJsZSwgbWF0Y2ggdGhlIHZlcnNpb24gdG8gdGhlIHVzZWQgdHlwZXNjcmlwdCB2ZXJzaW9uLlxuICAgKiBBbmQgaWYgdGhhdCBpcyBhbHNvIG5vdCBhdmFpbGFibGUsIHdlIHVzZSBsYXRlc3QgYW5kIGxldCB0aGUgdXNlciBtYW5hZ2UgdGhlIHZlcnNpb24uXG4gICAqL1xuICBwcml2YXRlIGFkZE5vZGVUeXBlc1ZlcnNpb24odHNWZXJzaW9uPzogc3RyaW5nLCBtaW5Ob2RlVmVyc2lvbj86IHN0cmluZykge1xuICAgIGNvbnN0IG5hbWUgPSBcIkB0eXBlcy9ub2RlXCI7XG5cbiAgICBpZiAodGhpcy5kZXBzLnRyeUdldERlcGVuZGVuY3kobmFtZSwgRGVwZW5kZW5jeVR5cGUuQlVJTEQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG1pbk5vZGVWZXJzaW9uKSB7XG4gICAgICBjb25zdCBtaW5Ob2RlUGFyc2VkID0gc2VtdmVyLm1pblZlcnNpb24obWluTm9kZVZlcnNpb24pO1xuICAgICAgaWYgKG1pbk5vZGVQYXJzZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRGV2RGVwcyhgJHtuYW1lfUBeJHttaW5Ob2RlUGFyc2VkLm1ham9yfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvZXJjZSB2ZXJzaW9uLCBzaW5jZSB0aGUgdHMgdmVyc2lvbiBsaWtlbHkgc29tZXRoaW5nIGxpa2UgfjUuMy4wXG4gICAgY29uc3QgdHNQYXJzZWQgPSBzZW12ZXIuY29lcmNlKHRzVmVyc2lvbik7XG4gICAgaWYgKHRzUGFyc2VkKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGREZXZEZXBzKGAke25hbWV9QHRzJHt0c1BhcnNlZC5tYWpvcn0uJHt0c1BhcnNlZC5taW5vcn1gKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERldkRlcHMobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgYHR5cGVzYCBjb21waWxlciBvcHRpb24gZnJvbSBhbGwgaW5zdGFsbGVkIGBAdHlwZXNgIGRlcGVuZGVuY2llcy5cbiAgICogQ2FsbGVkIGxhemlseSBhdCBzeW50aCB0aW1lIHNvIGFsbCBkZXBzIGFyZSBhdmFpbGFibGUuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVJbnN0YWxsZWRUeXBlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGVwcy5hbGxcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChkKSA9PlxuICAgICAgICAgIGQubmFtZS5zdGFydHNXaXRoKFwiQHR5cGVzL1wiKSAmJiBkLnR5cGUgIT09IERlcGVuZGVuY3lUeXBlLk9WRVJSSURFLFxuICAgICAgKVxuICAgICAgLm1hcCgoZCkgPT4gZC5uYW1lLnJlcGxhY2UoXCJAdHlwZXMvXCIsIFwiXCIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0cyBhcmUgY29tcGlsZWQgdG8gYGxpYi9URVNURElSYCwgc28gd2UgZG9uJ3QgbmVlZCBqZXN0IHRvIGNvbXBpbGUgdGhlbVxuICAgKiBmb3IgdXMuIGp1c3QgcnVuIHRoZW0gZGlyZWN0bHkgZnJvbSBqYXZhc2NyaXB0LlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRKZXN0Q29tcGlsZWQoamVzdDogSmVzdCkge1xuICAgIHRoaXMuYWRkRGV2RGVwcyhgQHR5cGVzL2plc3Qke2plc3QuamVzdFZlcnNpb259YCk7XG5cbiAgICBjb25zdCB0ZXN0b3V0ID0gcGF0aC5wb3NpeC5yZWxhdGl2ZSh0aGlzLnNyY2RpciwgdGhpcy50ZXN0ZGlyKTtcbiAgICBjb25zdCBsaWJ0ZXN0ID0gcGF0aC5wb3NpeC5qb2luKHRoaXMubGliZGlyLCB0ZXN0b3V0KTtcbiAgICBjb25zdCBzcmN0ZXN0ID0gdGhpcy50ZXN0ZGlyO1xuXG4gICAgdGhpcy5ucG1pZ25vcmU/LmV4Y2x1ZGUoYC8ke2xpYnRlc3R9L2ApO1xuICAgIGplc3QuZGlzY292ZXJUZXN0TWF0Y2hQYXR0ZXJuc0ZvckRpcnMoW2xpYnRlc3RdLCB7XG4gICAgICBmaWxlRXh0ZW5zaW9uUGF0dGVybjogdGhpcy50c2NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5hbGxvd0pzXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogXCJqcz8oeClcIixcbiAgICB9KTtcbiAgICBqZXN0LmFkZFdhdGNoSWdub3JlUGF0dGVybihgLyR7dGhpcy5zcmNkaXJ9L2ApO1xuXG4gICAgY29uc3QgcmVzb2x2ZVNuYXBzaG90UGF0aCA9ICh0ZXN0OiBzdHJpbmcsIGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBmdWxscGF0aCA9IHRlc3QucmVwbGFjZShsaWJ0ZXN0LCBzcmN0ZXN0KTtcbiAgICAgIHJldHVybiBwYXRoLmpvaW4oXG4gICAgICAgIHBhdGguZGlybmFtZShmdWxscGF0aCksXG4gICAgICAgIFwiX19zbmFwc2hvdHNfX1wiLFxuICAgICAgICBwYXRoLmJhc2VuYW1lKGZ1bGxwYXRoLCBcIi5qc1wiKSArIFwiLnRzXCIgKyBleHQsXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCByZXNvbHZlVGVzdFBhdGggPSAoc25hcDogc3RyaW5nLCBleHQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKHNuYXAsIFwiLnRzXCIgKyBleHQpICsgXCIuanNcIjtcbiAgICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUoc25hcCkpLnJlcGxhY2Uoc3JjdGVzdCwgbGlidGVzdCk7XG4gICAgICByZXR1cm4gcGF0aC5qb2luKGRpciwgZmlsZW5hbWUpO1xuICAgIH07XG5cbiAgICBjb25zdCByZXNvbHZlciA9IG5ldyBUZXh0RmlsZShcbiAgICAgIHRoaXMsXG4gICAgICBwYXRoLnBvc2l4LmpvaW4oUFJPSkVOX0RJUiwgXCJqZXN0LXNuYXBzaG90LXJlc29sdmVyLmpzXCIpLFxuICAgICk7XG4gICAgaWYgKCFyZXNvbHZlci5tYXJrZXIpIHtcbiAgICAgIHJlc29sdmVyLmFkZExpbmUoYC8vICR7cmVzb2x2ZXIubWFya2VyfWApO1xuICAgIH1cbiAgICByZXNvbHZlci5hZGRMaW5lKCdjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7Jyk7XG4gICAgcmVzb2x2ZXIuYWRkTGluZShgY29uc3QgbGlidGVzdCA9IFwiJHtsaWJ0ZXN0fVwiO2ApO1xuICAgIHJlc29sdmVyLmFkZExpbmUoYGNvbnN0IHNyY3Rlc3Q9IFwiJHtzcmN0ZXN0fVwiO2ApO1xuICAgIHJlc29sdmVyLmFkZExpbmUoXCJtb2R1bGUuZXhwb3J0cyA9IHtcIik7XG4gICAgcmVzb2x2ZXIuYWRkTGluZShcbiAgICAgIGAgIHJlc29sdmVTbmFwc2hvdFBhdGg6ICR7cmVzb2x2ZVNuYXBzaG90UGF0aC50b1N0cmluZygpfSxgLFxuICAgICk7XG4gICAgcmVzb2x2ZXIuYWRkTGluZShgICByZXNvbHZlVGVzdFBhdGg6ICR7cmVzb2x2ZVRlc3RQYXRoLnRvU3RyaW5nKCl9LGApO1xuICAgIHJlc29sdmVyLmFkZExpbmUoXG4gICAgICBcIiAgdGVzdFBhdGhGb3JDb25zaXN0ZW5jeUNoZWNrOiBwYXRoLmpvaW4oJ3NvbWUnLCAnX190ZXN0c19fJywgJ2V4YW1wbGUudGVzdC5qcycpXCIsXG4gICAgKTtcbiAgICByZXNvbHZlci5hZGRMaW5lKFwifTtcIik7XG5cbiAgICBqZXN0LmFkZFNuYXBzaG90UmVzb2x2ZXIoYC4vJHtyZXNvbHZlci5wYXRofWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRKZXN0Tm9Db21waWxlKFxuICAgIGplc3Q6IEplc3QsXG4gICAgdHNKZXN0T3B0aW9uczogVHNKZXN0T3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgLy8gVHMtamVzdCBkb2Vzbid0IGZvbGxvdyBzZW12ZXIsIGJ1dCBtYWpvciBzaG91bGQgbWF0Y2ggdG8gSmVzdCdzIG1ham9yLlxuICAgIC8vIEZvciBzb21lIHJlYXNvbiB0aGlzIGlzIG5vdCB0aGUgY2FzZSB3aXRoIEplc3QgMzAgYW55bW9yZS5cbiAgICBjb25zdCBqZXN0TWFqb3IgPSBzZW12ZXIuY29lcmNlKGplc3QuamVzdFZlcnNpb24pPy5tYWpvciA/PyAwO1xuICAgIGNvbnN0IHRzSmVzdFZlcnNpb24gPSBqZXN0TWFqb3IgPiAyOSA/IFwiQF4yOVwiIDogamVzdC5qZXN0VmVyc2lvbjtcbiAgICB0aGlzLmFkZERldkRlcHMoXG4gICAgICBgQHR5cGVzL2plc3Qke2plc3QuamVzdFZlcnNpb259YCxcbiAgICAgIGB0cy1qZXN0JHt0c0plc3RWZXJzaW9ufWAsXG4gICAgKTtcblxuICAgIGplc3QuZGlzY292ZXJUZXN0TWF0Y2hQYXR0ZXJuc0ZvckRpcnMoW3RoaXMuc3JjZGlyLCB0aGlzLnRlc3RkaXJdLCB7XG4gICAgICBmaWxlRXh0ZW5zaW9uUGF0dGVybjogdGhpcy50c2NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5hbGxvd0pzXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogXCJ0cz8oeClcIixcbiAgICB9KTtcblxuICAgIC8vIFRlc3QgZm9yIHRoZSB0cy1qZXN0IHZlcnNpb24gdGhhdCB3YXMgcmVxdWVzdGVkO1xuICAgIC8vXG4gICAgLy8gLSBGaXJzdCwgY2hlY2sgdGhlIGBqZXN0YCB2ZXJzaW9uIHRoYXQgaXMgcmVxdWVzdGVkIHZpYSBwcm9qZW4gcHJvcGVydGllcy4gVGhpc1xuICAgIC8vICAgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBgdHMtamVzdGAgdmVyc2lvbiBhbnl3YXkuXG4gICAgLy8gLSBJZiBub25lIGZvdW5kLCBmYWxsIGJhY2sgdG8gaW5zcGVjdGluZyB0aGUgYWN0dWFsIGB0cy1qZXN0YCB2ZXJzaW9uXG4gICAgLy8gICB0aGF0IGhhcHBlbnMgdG8gYmUgaW5zdGFsbGVkLlxuICAgIGxldCBoYXNUc0plc3QyOTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoamVzdC5qZXN0VmVyc2lvbikge1xuICAgICAgLy8gV2UgY291bGQgbWF5YmUgcmVwbGFjZSB0aGlzIHdpbGwgZnVsbCBcImFjdHVhbCB2ZXJzaW9uXCIgY2hlY2tpbmcsIGJ1dFxuICAgICAgLy8gdGhlIHRlc3RzIGRlcGVuZCBvbiB0aGlzIGFuZCB0aGUgcmVhZGluZyBvZiAncGFja2FnZS5qc29uJyBpcyB2ZXJ5XG4gICAgICAvLyBhd2t3YXJkIHRvIHRlc3QuXG4gICAgICAvLyBOb3RlIHRoYXQgd2UgdXNlIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiBvZiBgamVzdGAgYXMgYSBwcm94eSBmb3IgdGhlXG4gICAgICAvLyB2ZXJzaW9uIG9mIGB0cy1qZXN0YCwgd2hpY2ggaXMgd2hhdCB3ZSdyZSBhY3R1YWxseSBpbnRlcmVzdGVkIGluLlxuICAgICAgY29uc3QgbWFqb3IgPSBzZW12ZXIuY29lcmNlKGplc3QuamVzdFZlcnNpb24pPy5tYWpvcjtcbiAgICAgIGhhc1RzSmVzdDI5ID0gbWFqb3IgPyBtYWpvciA+PSAyOSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGhhc1RzSmVzdDI5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc1RzSmVzdDI5ID0gaGFzRGVwZW5kZW5jeVZlcnNpb24odGhpcywgXCJ0cy1qZXN0XCIsIFwiPj0gMjlcIik7XG4gICAgfVxuXG4gICAgLy8gYWRkIHJlbGV2YW50IGRlcHMgKHdlIHRyZWF0IFwidW5rbm93blwiIGFzIGhhdmluZyBhIG1vZGVybiB0cy1qZXN0KVxuICAgIGlmIChoYXNUc0plc3QyOSAhPT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkZEplc3ROb0NvbXBpbGVNb2Rlcm4oamVzdCwgdHNKZXN0T3B0aW9ucyk7XG4gICAgfVxuICAgIHRoaXMuYWRkSmVzdE5vQ29tcGlsZUxlZ2FjeShqZXN0LCB0c0plc3RPcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkSmVzdE5vQ29tcGlsZU1vZGVybihcbiAgICBqZXN0OiBKZXN0LFxuICAgIHRzSmVzdE9wdGlvbnM6IFRzSmVzdE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIGplc3QuY29uZmlnLnRyYW5zZm9ybSA9IGRlZXBNZXJnZShbXG4gICAgICB7XG4gICAgICAgIFt0c0plc3RPcHRpb25zPy50cmFuc2Zvcm1QYXR0ZXJuID8/XG4gICAgICAgIFR5cGVTY3JpcHRQcm9qZWN0LkRFRkFVTFRfVFNfSkVTVF9UUkFORk9STV9QQVRURVJOXTogbmV3IFRyYW5zZm9ybShcbiAgICAgICAgICBcInRzLWplc3RcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0c2NvbmZpZzogVHNKZXN0VHNjb25maWcuZnJvbUZpbGUodGhpcy50c2NvbmZpZ0Rldi5maWxlTmFtZSksXG4gICAgICAgICAgICAuLi4odHNKZXN0T3B0aW9ucz8udHJhbnNmb3JtT3B0aW9ucyA/PyB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICBqZXN0LmNvbmZpZy50cmFuc2Zvcm0sXG4gICAgXSk7XG4gIH1cblxuICBwcml2YXRlIGFkZEplc3ROb0NvbXBpbGVMZWdhY3koXG4gICAgamVzdDogSmVzdCxcbiAgICB0c0plc3RPcHRpb25zOiBUc0plc3RPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICBpZiAodHNKZXN0T3B0aW9ucykge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgXCJZb3UgYXJlIHVzaW5nIGEgbGVnYWN5IHZlcnNpb24gKDwyOSkgb2YgamVzdCBhbmQgdHMtamVzdCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdHNKZXN0T3B0aW9ucywgdGhleSB3aWxsIGJlIGlnbm9yZWQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIWplc3QuY29uZmlnLnByZXNldCkge1xuICAgICAgamVzdC5jb25maWcucHJlc2V0ID0gXCJ0cy1qZXN0XCI7XG4gICAgfVxuICAgIGplc3QuY29uZmlnLmdsb2JhbHMgPSBkZWVwTWVyZ2UoW1xuICAgICAge1xuICAgICAgICBcInRzLWplc3RcIjoge1xuICAgICAgICAgIHRzY29uZmlnOiB0aGlzLnRzY29uZmlnRGV2LmZpbGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGplc3QuY29uZmlnLmdsb2JhbHMsXG4gICAgXSk7XG4gIH1cbn1cblxuY2xhc3MgU2FtcGxlQ29kZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFR5cGVTY3JpcHRQcm9qZWN0KSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG4gICAgY29uc3Qgc3JjQ29kZSA9IFtcbiAgICAgIFwiZXhwb3J0IGNsYXNzIEhlbGxvIHtcIixcbiAgICAgIFwiICBwdWJsaWMgc2F5SGVsbG8oKSB7XCIsXG4gICAgICBcIiAgICByZXR1cm4gJ2hlbGxvLCB3b3JsZCEnO1wiLFxuICAgICAgXCIgIH1cIixcbiAgICAgIFwifVwiLFxuICAgIF0uam9pbihcIlxcblwiKTtcblxuICAgIGNvbnN0IHRlc3RDb2RlID0gW1xuICAgICAgXCJpbXBvcnQgeyBIZWxsbyB9IGZyb20gJy4uL3NyYyc7XCIsXG4gICAgICBcIlwiLFxuICAgICAgXCJ0ZXN0KCdoZWxsbycsICgpID0+IHtcIixcbiAgICAgIFwiICBleHBlY3QobmV3IEhlbGxvKCkuc2F5SGVsbG8oKSkudG9CZSgnaGVsbG8sIHdvcmxkIScpO1wiLFxuICAgICAgXCJ9KTtcIixcbiAgICBdLmpvaW4oXCJcXG5cIik7XG5cbiAgICBuZXcgU2FtcGxlRGlyKHByb2plY3QsIHByb2plY3Quc3JjZGlyLCB7XG4gICAgICBmaWxlczoge1xuICAgICAgICBcImluZGV4LnRzXCI6IHNyY0NvZGUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKHByb2plY3QuamVzdCkge1xuICAgICAgbmV3IFNhbXBsZURpcihwcm9qZWN0LCBwcm9qZWN0LnRlc3RkaXIsIHtcbiAgICAgICAgZmlsZXM6IHtcbiAgICAgICAgICBcImhlbGxvLnRlc3QudHNcIjogdGVzdENvZGUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUeXBlU2NyaXB0IGFwcC5cbiAqXG4gKiBAcGppZCB0eXBlc2NyaXB0LWFwcFxuICovXG5leHBvcnQgY2xhc3MgVHlwZVNjcmlwdEFwcFByb2plY3QgZXh0ZW5kcyBUeXBlU2NyaXB0UHJvamVjdCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFR5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucykge1xuICAgIC8vIFJlbGVhc2luZyBhbmQgcGFja2FnaW5nIGFyZSBjb3VwbGVkLiBJZiBvbmUgaXMgZGlzYWJsZWQsIGRpc2FibGUgdGhlIG90aGVyIGJ5IGRlZmF1bHQuXG4gICAgY29uc3Qgc2hvdWxkUmVsZWFzZSA9IG9wdGlvbnMucmVsZWFzZSA/PyBmYWxzZTtcblxuICAgIHN1cGVyKHtcbiAgICAgIHJlbGVhc2U6IHNob3VsZFJlbGVhc2UsXG4gICAgICBwYWNrYWdlOiBzaG91bGRSZWxlYXNlLFxuICAgICAgYWxsb3dMaWJyYXJ5RGVwZW5kZW5jaWVzOiBmYWxzZSxcbiAgICAgIGVudHJ5cG9pbnQ6IFwiXCIsIC8vIFwibWFpblwiIGlzIG5vdCBuZWVkZWQgaW4gdHlwZXNjcmlwdCBhcHBzXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVRzY29uZmlnT3B0aW9ucyhcbiAgLi4ub3B0aW9uczogKFR5cGVzY3JpcHRDb25maWdPcHRpb25zIHwgdW5kZWZpbmVkKVtdXG4pOiBUeXBlc2NyaXB0Q29uZmlnT3B0aW9ucyB7XG4gIGNvbnN0IGRlZmluZWRPcHRpb25zID0gb3B0aW9ucy5maWx0ZXIoQm9vbGVhbikgYXMgVHlwZXNjcmlwdENvbmZpZ09wdGlvbnNbXTtcbiAgcmV0dXJuIGRlZmluZWRPcHRpb25zLnJlZHVjZTxUeXBlc2NyaXB0Q29uZmlnT3B0aW9ucz4oXG4gICAgKHByZXZpb3VzLCBjdXJyZW50KSA9PiAoe1xuICAgICAgLi4ucHJldmlvdXMsXG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgaW5jbHVkZTogWy4uLihwcmV2aW91cy5pbmNsdWRlID8/IFtdKSwgLi4uKGN1cnJlbnQuaW5jbHVkZSA/PyBbXSldLFxuICAgICAgZXhjbHVkZTogWy4uLihwcmV2aW91cy5leGNsdWRlID8/IFtdKSwgLi4uKGN1cnJlbnQuZXhjbHVkZSA/PyBbXSldLFxuICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgIC4uLnByZXZpb3VzLmNvbXBpbGVyT3B0aW9ucyxcbiAgICAgICAgLi4uY3VycmVudC5jb21waWxlck9wdGlvbnMsXG4gICAgICB9LFxuICAgIH0pLFxuICAgIHsgY29tcGlsZXJPcHRpb25zOiB7fSB9LFxuICApO1xufVxuIl19
package/lib/version.js CHANGED
@@ -24,7 +24,7 @@ exports.CHANGES_SINCE_LAST_RELEASE = 'git log --oneline -1 | grep -qv "chore(rel
24
24
  */
25
25
  const COMMIT_AND_TAG_VERSION_DEFAULT = "commit-and-tag-version@^12";
26
26
  class Version extends component_1.Component {
27
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Version", version: "0.100.2" };
27
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Version", version: "0.100.4" };
28
28
  bumpTask;
29
29
  unbumpTask;
30
30
  /**
@@ -141,7 +141,7 @@ exports.Version = Version;
141
141
  */
142
142
  class ReleasableCommits {
143
143
  cmd;
144
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.ReleasableCommits", version: "0.100.2" };
144
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.ReleasableCommits", version: "0.100.4" };
145
145
  /**
146
146
  * Release every commit
147
147
  *
@@ -13,7 +13,7 @@ const DEVCONTAINER_FILE = ".devcontainer.json";
13
13
  * codespaces.
14
14
  */
15
15
  class DevContainer extends component_1.Component {
16
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.vscode.DevContainer", version: "0.100.2" };
16
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.vscode.DevContainer", version: "0.100.4" };
17
17
  dockerImage;
18
18
  postCreateTasks;
19
19
  ports;
@@ -9,7 +9,7 @@ const json_1 = require("../json");
9
9
  * Source: https://code.visualstudio.com/docs/editor/extension-marketplace#_workspace-recommended-extensions
10
10
  */
11
11
  class VsCodeRecommendedExtensions extends component_1.Component {
12
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.vscode.VsCodeRecommendedExtensions", version: "0.100.2" };
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.vscode.VsCodeRecommendedExtensions", version: "0.100.4" };
13
13
  /**
14
14
  * List of extensions which should be recommended for users of this workspace.
15
15
  * The identifier of an extension is always '${publisher}.${name}'. For example: 'ms-python.python'.
@@ -28,7 +28,7 @@ var InternalConsoleOptions;
28
28
  * VSCode launch configuration file (launch.json), useful for enabling in-editor debugger
29
29
  */
30
30
  class VsCodeLaunchConfig extends component_1.Component {
31
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.vscode.VsCodeLaunchConfig", version: "0.100.2" };
31
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.vscode.VsCodeLaunchConfig", version: "0.100.4" };
32
32
  static renderLaunchConfig(cfg) {
33
33
  if (!cfg.env) {
34
34
  return cfg;
@@ -9,7 +9,7 @@ const json_1 = require("../json");
9
9
  * Source: https://code.visualstudio.com/docs/getstarted/settings#_workspace-settings
10
10
  */
11
11
  class VsCodeSettings extends component_1.Component {
12
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.vscode.VsCodeSettings", version: "0.100.2" };
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.vscode.VsCodeSettings", version: "0.100.4" };
13
13
  content;
14
14
  file;
15
15
  constructor(vscode) {
@@ -7,7 +7,7 @@ const launch_config_1 = require("./launch-config");
7
7
  const settings_1 = require("./settings");
8
8
  const component_1 = require("../component");
9
9
  class VsCode extends component_1.Component {
10
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.vscode.VsCode", version: "0.100.2" };
10
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.vscode.VsCode", version: "0.100.4" };
11
11
  _launchConfig;
12
12
  _settings;
13
13
  _extensions;
package/lib/web/next.js CHANGED
@@ -15,7 +15,7 @@ const MINIMUM_NEXT_JS_NODE_VERSION = "16.14.0"; // https://nextjs.org/docs/pages
15
15
  * @pjid nextjs
16
16
  */
17
17
  class NextJsProject extends javascript_1.NodeProject {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.NextJsProject", version: "0.100.2" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.NextJsProject", version: "0.100.4" };
19
19
  /**
20
20
  * The directory in which source files reside.
21
21
  */
@@ -59,7 +59,7 @@ exports.NextJsProject = NextJsProject;
59
59
  * @pjid nextjs-ts
60
60
  */
61
61
  class NextJsTypeScriptProject extends typescript_1.TypeScriptAppProject {
62
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.NextJsTypeScriptProject", version: "0.100.2" };
62
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.NextJsTypeScriptProject", version: "0.100.4" };
63
63
  /**
64
64
  * The directory in which source files reside.
65
65
  */
@@ -150,7 +150,7 @@ class NextJsTypeScriptProject extends typescript_1.TypeScriptAppProject {
150
150
  }
151
151
  exports.NextJsTypeScriptProject = NextJsTypeScriptProject;
152
152
  class NextComponent extends component_1.Component {
153
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.NextComponent", version: "0.100.2" };
153
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.NextComponent", version: "0.100.4" };
154
154
  typescript;
155
155
  tailwind;
156
156
  constructor(project, options) {
@@ -8,7 +8,7 @@ const json_1 = require("../json");
8
8
  * Declares a PostCSS dependency with a default config file.
9
9
  */
10
10
  class PostCss {
11
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.PostCss", version: "0.100.2" };
11
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.PostCss", version: "0.100.4" };
12
12
  fileName;
13
13
  file;
14
14
  tailwind;
package/lib/web/react.js CHANGED
@@ -48,7 +48,7 @@ const util_1 = require("../util");
48
48
  * @pjid react
49
49
  */
50
50
  class ReactProject extends javascript_1.NodeProject {
51
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.ReactProject", version: "0.100.2" };
51
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.ReactProject", version: "0.100.4" };
52
52
  /**
53
53
  * The directory in which source files reside.
54
54
  * @default "src"
@@ -80,7 +80,7 @@ exports.ReactProject = ReactProject;
80
80
  * @pjid react-ts
81
81
  */
82
82
  class ReactTypeScriptProject extends typescript_1.TypeScriptAppProject {
83
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.ReactTypeScriptProject", version: "0.100.2" };
83
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.ReactTypeScriptProject", version: "0.100.4" };
84
84
  /**
85
85
  * The directory in which source files reside.
86
86
  */
@@ -147,7 +147,7 @@ class ReactTypeScriptProject extends typescript_1.TypeScriptAppProject {
147
147
  }
148
148
  exports.ReactTypeScriptProject = ReactTypeScriptProject;
149
149
  class ReactComponent extends component_1.Component {
150
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.ReactComponent", version: "0.100.2" };
150
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.ReactComponent", version: "0.100.4" };
151
151
  typescript;
152
152
  constructor(project, options) {
153
153
  super(project);
@@ -12,7 +12,7 @@ const json_1 = require("../json");
12
12
  * @see PostCss
13
13
  */
14
14
  class TailwindConfig {
15
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.TailwindConfig", version: "0.100.2" };
15
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.TailwindConfig", version: "0.100.4" };
16
16
  fileName;
17
17
  file;
18
18
  constructor(project, options) {
package/lib/xmlfile.js CHANGED
@@ -11,7 +11,7 @@ const object_file_1 = require("./object-file");
11
11
  * @see https://www.npmjs.com/package/xml
12
12
  */
13
13
  class XmlFile extends object_file_1.ObjectFile {
14
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.XmlFile", version: "0.100.2" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.XmlFile", version: "0.100.4" };
15
15
  constructor(project, filePath, options = {}) {
16
16
  super(project, filePath, options);
17
17
  }
package/lib/yaml.js CHANGED
@@ -41,7 +41,7 @@ const object_file_1 = require("./object-file");
41
41
  * Represents a YAML file.
42
42
  */
43
43
  class YamlFile extends object_file_1.ObjectFile {
44
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.YamlFile", version: "0.100.2" };
44
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.YamlFile", version: "0.100.4" };
45
45
  /**
46
46
  * Maximum line width (set to 0 to disable folding).
47
47
  */