@xpertss/projen-types 0.0.13 → 0.0.14

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 (59) hide show
  1. package/.jsii +2598 -746
  2. package/API.md +5752 -1419
  3. package/README.md +274 -35
  4. package/lib/actions/action-build-workflow.js +1 -1
  5. package/lib/actions/action-dogfood-workflow.js +1 -1
  6. package/lib/actions/action-sonar-workflow.js +1 -1
  7. package/lib/actions/github-action-project.d.ts +5 -0
  8. package/lib/actions/github-action-project.js +10 -3
  9. package/lib/cdk/app-runtime-scaffold.js +1 -1
  10. package/lib/cdk/cdk-app-project.js +1 -1
  11. package/lib/cdk/cdk-infra-project.js +1 -1
  12. package/lib/cdk/cdk-typescript-base.js +10 -3
  13. package/lib/cdk/components/ecr-ecs-constructs.js +1 -1
  14. package/lib/cdk/components/edge-networking-constructs.js +1 -1
  15. package/lib/cdk/database-component.js +1 -1
  16. package/lib/cdk/options.d.ts +5 -0
  17. package/lib/cdk/options.js +1 -1
  18. package/lib/common/ci-steps.d.ts +14 -0
  19. package/lib/common/ci-steps.js +30 -0
  20. package/lib/common/editorconfig.d.ts +12 -0
  21. package/lib/common/editorconfig.js +44 -0
  22. package/lib/common/projen-drift-check-workflow.js +5 -15
  23. package/lib/common/workflow-change-notice-workflow.js +1 -1
  24. package/lib/index.d.ts +4 -0
  25. package/lib/index.js +5 -1
  26. package/lib/java/components/cdk-deploy-hook.d.ts +2 -2
  27. package/lib/java/components/cdk-deploy-hook.js +2 -2
  28. package/lib/java/components/code-index-workflow.d.ts +2 -2
  29. package/lib/java/components/code-index-workflow.js +5 -3
  30. package/lib/java/components/docker-publish.d.ts +2 -2
  31. package/lib/java/components/docker-publish.js +2 -2
  32. package/lib/java/components/flyway-migration.d.ts +8 -3
  33. package/lib/java/components/flyway-migration.js +11 -5
  34. package/lib/java/components/github-packages-publish.d.ts +2 -2
  35. package/lib/java/components/github-packages-publish.js +2 -2
  36. package/lib/java/components/maven-central-publish.d.ts +2 -2
  37. package/lib/java/components/maven-central-publish.js +2 -2
  38. package/lib/java/components/maven-upgrade-report.d.ts +22 -0
  39. package/lib/java/components/maven-upgrade-report.js +61 -0
  40. package/lib/java/java-app-project.js +1 -1
  41. package/lib/java/java-library-project.d.ts +5 -1
  42. package/lib/java/java-library-project.js +14 -3
  43. package/lib/java/java-maven-base.d.ts +91 -8
  44. package/lib/java/java-maven-base.js +339 -24
  45. package/lib/java/java-service-project.d.ts +17 -5
  46. package/lib/java/java-service-project.js +20 -7
  47. package/lib/java/java-spring-boot-project.d.ts +30 -0
  48. package/lib/java/java-spring-boot-project.js +68 -0
  49. package/lib/java/java-versions.d.ts +40 -0
  50. package/lib/java/java-versions.js +106 -0
  51. package/lib/java/maven/maven-module.d.ts +47 -0
  52. package/lib/java/maven/maven-module.js +99 -0
  53. package/lib/java/maven/maven-pom.d.ts +143 -0
  54. package/lib/java/maven/maven-pom.js +337 -0
  55. package/lib/java/options.d.ts +128 -1
  56. package/lib/java/options.js +1 -1
  57. package/package.json +1 -1
  58. package/lib/common/upgrade-workflow.d.ts +0 -18
  59. package/lib/common/upgrade-workflow.js +0 -45
@@ -2,59 +2,149 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.JavaMavenProject = void 0;
4
4
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
+ const path_1 = require("path");
5
6
  const projen_1 = require("projen");
7
+ const maven_upgrade_report_1 = require("./components/maven-upgrade-report");
8
+ const java_versions_1 = require("./java-versions");
9
+ const maven_module_1 = require("./maven/maven-module");
10
+ const maven_pom_1 = require("./maven/maven-pom");
11
+ const ci_steps_1 = require("../common/ci-steps");
6
12
  const constants_1 = require("../common/constants");
13
+ const editorconfig_1 = require("../common/editorconfig");
7
14
  const internal_actions_1 = require("../common/internal-actions");
8
15
  const projen_drift_check_workflow_1 = require("../common/projen-drift-check-workflow");
9
16
  const projenrc_ts_1 = require("../common/projenrc-ts");
10
- const upgrade_workflow_1 = require("../common/upgrade-workflow");
11
17
  const workflow_change_notice_workflow_1 = require("../common/workflow-change-notice-workflow");
12
18
  const workflow_purpose_1 = require("../common/workflow-purpose");
19
+ // `require(...)` resolves through Node's normal module resolution, so in a
20
+ // *published* package these are the versions installed in the consuming
21
+ // repo - exactly what its package.json must pin (same as
22
+ // `GitHubActionProject`).
23
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
24
+ const PROJEN_VERSION = require('projen/package.json').version;
25
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
26
+ const PROJEN_TYPES_VERSION = require('../../package.json').version;
13
27
  /**
14
- * Shared Maven build skeleton for all three Java project types: standard
15
- * `pom.xml`/directory layout (via `java.JavaProject`), a PR-triggered
16
- * build+test(+SonarQube) workflow that hard-fails on projen drift, and a
17
- * nightly dependency-upgrade workflow.
28
+ * Baseline Maven project, single- or multi-module, with no framework
29
+ * assumptions. It is the base of every Java type in this package and is
30
+ * usable on its own (`projen new ... java_maven`).
31
+ *
32
+ * - The pom is written by this package (`MavenPom`), not projen's
33
+ * `java.Pom`: exact versions only, BOM imports, `<modules>`,
34
+ * `<dependencyManagement>`, `<pluginManagement>`.
35
+ * - Everything Java-version-dependent (compiler level, enforcer rule, JUnit
36
+ * line, CI JDK) follows `javaVersion`.
37
+ * - With no `addModule()` calls the root pom is the artifact. After the
38
+ * first `addModule()` it is a `pom`-packaged reactor parent and the
39
+ * modules inherit its plugins and test dependencies.
40
+ * - `npx projen build` synthesizes, then runs Maven once: `mvn -B verify`
41
+ * (unit tests via surefire, `*IT` tests via failsafe).
42
+ * - CI: a PR build (with an optional SonarQube scan), the projen drift
43
+ * check, and a nightly report-only update check.
18
44
  */
19
- class JavaMavenProject extends projen_1.java.JavaProject {
20
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.JavaMavenProject", version: "0.0.13" };
45
+ class JavaMavenProject extends projen_1.github.GitHubProject {
46
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.JavaMavenProject", version: "0.0.14" };
47
+ /** The root `pom.xml`. */
48
+ pom;
49
+ /** The canonical Java line the build targets (`1.8`, `17`, `21`, `25`). */
50
+ javaVersion;
51
+ /** Prints available dependency/plugin updates (`npx projen upgrade`). */
21
52
  upgradeTask;
53
+ /**
54
+ * The PR build workflow (`build.yml`). Add jobs to it with
55
+ * `buildVerifyWorkflow.addJob(id, job)`; use `ciSetupSteps` for a job that
56
+ * needs Node, the projen toolchain, and the JDK.
57
+ */
22
58
  buildVerifyWorkflow;
59
+ /**
60
+ * Steps that install Node (pinned), `npm ci`, and the project's JDK with a
61
+ * Maven cache - the setup every Maven CI job in this repo needs.
62
+ */
63
+ ciSetupSteps;
64
+ javaLine;
65
+ rootPackaging;
66
+ groupId;
67
+ sample;
68
+ mavenModules = [];
23
69
  constructor(options) {
24
70
  super({
25
71
  // Spread first, overrides after: forwarding the caller's options is
26
- // what lets `projen new --from @xpertss/projen-types java_library`
27
- // work - projen smuggles its bootstrap marker (`__new__`) through the
72
+ // what lets `projen new --from @xpertss/projen-types java_maven` work
73
+ // - projen smuggles its bootstrap marker (`__new__`) through the
28
74
  // options object, and it is that marker which makes the
29
75
  // `ProjenrcFile` component write the initial `.projenrc.ts`. Drop it
30
76
  // and `projen new` scaffolds a repo with no projenrc at all.
31
- ...options,
77
+ ...stringifyProjenNewArgs(options),
32
78
  name: options.name,
33
- groupId: options.groupId,
34
- artifactId: options.artifactId,
35
- version: options.version ?? '0.1.0',
36
79
  // PR titles are not gated: `feat:`/`fix:` matter only because they drive
37
80
  // the release workflow (via `releasableCommits`), not PR checks. The
38
81
  // conventional-commit PR-title lint is added by the `GitHub` component
39
82
  // unless `githubOptions.pullRequestLint` is `false` (it defaults true).
40
83
  githubOptions: { pullRequestLint: false },
41
- // Consumers author their config as a Node-side `.projenrc.ts` (this
42
- // package only publishes an npm jsii target, no java target), not a
43
- // hand-written `src/test/java/projenrc.java` - so java.JavaProject's
44
- // own Java-native projenrc (which wires the default task to `mvn
45
- // compiler:testCompile && mvn exec:java ...`) would be wrong here.
46
- // Disable it and attach the TypeScript one instead.
47
- projenrcJava: false,
48
84
  projenCredentials: projen_1.github.GithubCredentials.fromPersonalAccessToken({
49
85
  secret: options.gheTokenSecret ?? constants_1.DEFAULT_GHE_TOKEN_SECRET,
50
86
  }),
51
87
  });
88
+ for (const version of Object.values(options.pluginVersions ?? {})) {
89
+ (0, maven_pom_1.assertExactVersion)(version, 'pluginVersions');
90
+ }
91
+ this.javaLine = (0, java_versions_1.resolveJavaLine)(options.javaVersion, options.pluginVersions);
92
+ this.javaVersion = this.javaLine.line;
93
+ this.rootPackaging = options.packaging;
94
+ this.groupId = options.groupId;
95
+ this.sample = options.sample ?? false;
52
96
  // `.projenrc.ts` + `npx projen`, same as every other type here. The
53
97
  // Maven repo needs no TypeScript toolchain of its own - the runner is
54
98
  // fetched (pinned) by npx at synth time.
55
99
  (0, projenrc_ts_1.attachTypeScriptProjenrc)(this);
56
- // JetBrains IDE state (.idea/) is never tracked in generated repos.
100
+ // The projen toolchain `npx projen` runs, pinned exactly so every
101
+ // machine and CI resolve the same generator. Owner-writable on disk so
102
+ // the documented update flow (`npm i -D -E @xpertss/projen-types@<v>`)
103
+ // can rewrite it; hand-edits are still caught by the drift check.
104
+ new projen_1.JsonFile(this, 'package.json', {
105
+ obj: {
106
+ name: options.name,
107
+ version: '0.0.0',
108
+ private: true,
109
+ devDependencies: {
110
+ 'projen': PROJEN_VERSION,
111
+ '@xpertss/projen-types': PROJEN_TYPES_VERSION,
112
+ },
113
+ },
114
+ readonly: false,
115
+ });
116
+ // JetBrains IDE state (.idea/) is never tracked in generated repos, and
117
+ // neither is /spec/ (local plans and specs; the pattern covers every
118
+ // subdirectory).
57
119
  this.addGitIgnore('/.idea/*');
120
+ this.addGitIgnore('/spec/');
121
+ this.addGitIgnore('target/');
122
+ this.addGitIgnore('.classpath');
123
+ this.addGitIgnore('.project');
124
+ this.addGitIgnore('.settings');
125
+ if (options.licensed ?? true) {
126
+ new projen_1.License(this, {
127
+ spdx: options.license ?? 'MIT',
128
+ copyrightOwner: options.copyrightOwner ?? 'xpertss',
129
+ copyrightPeriod: options.copyrightPeriod,
130
+ });
131
+ }
132
+ if (options.editorconfig ?? true) {
133
+ (0, editorconfig_1.addEditorConfig)(this);
134
+ }
135
+ this.pom = new maven_pom_1.MavenPom(this, {
136
+ groupId: options.groupId,
137
+ artifactId: options.artifactId,
138
+ version: options.version ?? '0.1.0',
139
+ packaging: this.rootPackaging ?? 'jar',
140
+ name: options.name,
141
+ description: options.description,
142
+ url: options.url,
143
+ });
144
+ this.configureBuild(options);
145
+ // One Maven run per build: `verify` runs every earlier phase (compile,
146
+ // unit tests, package) plus integration tests. Nothing deploys.
147
+ this.testTask.exec('mvn -B verify');
58
148
  const gh = this.github;
59
149
  if (!gh) {
60
150
  throw new Error('JavaMavenProject requires GitHub integration');
@@ -64,6 +154,19 @@ class JavaMavenProject extends projen_1.java.JavaProject {
64
154
  gheTokenSecret: options.gheTokenSecret ?? constants_1.DEFAULT_GHE_TOKEN_SECRET,
65
155
  });
66
156
  new workflow_change_notice_workflow_1.WorkflowChangeNoticeWorkflow(this);
157
+ this.ciSetupSteps = [
158
+ ci_steps_1.SETUP_NODE_STEP,
159
+ ci_steps_1.NPM_CI_STEP,
160
+ {
161
+ name: 'Setup Java',
162
+ uses: 'actions/setup-java@v6',
163
+ with: {
164
+ 'distribution': options.javaDistribution ?? 'temurin',
165
+ 'java-version': this.javaLine.setupJavaVersion,
166
+ 'cache': 'maven',
167
+ },
168
+ },
169
+ ];
67
170
  const postBuildSteps = [];
68
171
  if (options.sonarProjectKey) {
69
172
  postBuildSteps.push({
@@ -78,14 +181,226 @@ class JavaMavenProject extends projen_1.java.JavaProject {
78
181
  task: this.buildTask,
79
182
  triggers: { pullRequest: {}, workflowDispatch: {} },
80
183
  permissions: { contents: projen_1.github.workflows.JobPermission.READ },
184
+ preBuildSteps: this.ciSetupSteps,
81
185
  postBuildSteps,
82
186
  });
83
187
  (0, workflow_purpose_1.noteWorkflowPurpose)(this.buildVerifyWorkflow.file, 'Build and test the Maven project on pull requests, with an optional SonarQube scan.');
188
+ const versionsPlugin = `org.codehaus.mojo:versions-maven-plugin:${this.pinnedVersion(java_versions_1.VERSIONS_MAVEN_PLUGIN)}`;
84
189
  this.upgradeTask = this.addTask('upgrade', {
85
- exec: 'mvn -B versions:use-latest-releases versions:update-properties',
190
+ exec: `mvn -B ${versionsPlugin}:display-dependency-updates ${versionsPlugin}:display-plugin-updates`,
191
+ });
192
+ if (options.upgradeWorkflow ?? true) {
193
+ new maven_upgrade_report_1.MavenUpgradeReport(this, {
194
+ task: this.upgradeTask,
195
+ setupSteps: this.ciSetupSteps,
196
+ });
197
+ }
198
+ }
199
+ /** The modules added with `addModule()`, in order. */
200
+ get modules() {
201
+ return [...this.mavenModules];
202
+ }
203
+ /**
204
+ * Adds a Maven module in `dir` (relative to the repo root; may be nested,
205
+ * e.g. `tools/stub-model`) and turns the root pom into the reactor parent
206
+ * (`packaging=pom`, `<modules>` in the order added). The parent manages
207
+ * every module at `${project.version}`, so modules depend on each other
208
+ * with `addModuleDependency()`, versionless.
209
+ */
210
+ addModule(options) {
211
+ if (this.rootPackaging !== undefined && this.rootPackaging !== 'pom') {
212
+ throw new Error(`A multi-module project's root pom is packaged as "pom"; remove packaging: "${this.rootPackaging}".`);
213
+ }
214
+ const dir = normalizeModuleDir(options.dir);
215
+ for (const m of this.mavenModules) {
216
+ if (m.artifactId === options.artifactId) {
217
+ throw new Error(`Duplicate module artifactId "${options.artifactId}" (dirs "${m.dir}" and "${dir}").`);
218
+ }
219
+ if (m.dir === dir || dir.startsWith(`${m.dir}/`) || m.dir.startsWith(`${dir}/`)) {
220
+ throw new Error(`Module dir "${dir}" overlaps module dir "${m.dir}": module dirs must be distinct and not nested.`);
221
+ }
222
+ }
223
+ const module = new maven_module_1.MavenModule(this, this.pom, { ...options, dir });
224
+ this.mavenModules.push(module);
225
+ this.pom.packaging = 'pom';
226
+ this.pom.managePluginVersions = true;
227
+ this.pom.addModule(dir);
228
+ this.pom.addManagedDependency(`${this.groupId}/${options.artifactId}@\${project.version}`);
229
+ return module;
230
+ }
231
+ /**
232
+ * Imports a BOM into the root `<dependencyManagement>` (`type=pom`,
233
+ * `scope=import`).
234
+ *
235
+ * @param spec `groupId/artifactId@version`
236
+ */
237
+ addBom(spec) {
238
+ this.pom.addBom(spec);
239
+ }
240
+ /**
241
+ * Pins a version in the root `<dependencyManagement>` without adding the
242
+ * dependency, so modules (or the root) can use it versionless.
243
+ *
244
+ * @param spec `groupId/artifactId@version`
245
+ */
246
+ addManagedDependency(spec) {
247
+ this.pom.addManagedDependency(spec);
248
+ }
249
+ /**
250
+ * Adds a compile-scope dependency to the root pom. In a multi-module
251
+ * project every module inherits it; use `MavenModule.addDependency` for
252
+ * one module.
253
+ *
254
+ * @param spec `groupId/artifactId[@version]` - exact version, or none when
255
+ * a BOM manages it
256
+ */
257
+ addDependency(spec) {
258
+ this.pom.addDependency(spec);
259
+ }
260
+ /** Adds a test-scope dependency to the root pom (inherited by every module). */
261
+ addTestDependency(spec) {
262
+ this.pom.addTestDependency(spec);
263
+ }
264
+ /** Adds a build plugin to the root pom (inherited by every module). */
265
+ addPlugin(spec, options = {}) {
266
+ this.pom.addPlugin(spec, options);
267
+ }
268
+ preSynthesize() {
269
+ super.preSynthesize();
270
+ if (this.sample && this.mavenModules.length === 0) {
271
+ this.addSample();
272
+ }
273
+ }
274
+ /**
275
+ * The exact version this project uses for a `groupId/artifactId` it pins
276
+ * by default: the `pluginVersions` override if set, otherwise the
277
+ * default for `javaVersion`.
278
+ */
279
+ pinnedVersion(coordinates) {
280
+ const version = this.javaLine.versions[coordinates];
281
+ if (!version) {
282
+ throw new Error(`No default version for ${coordinates}.`);
283
+ }
284
+ return version;
285
+ }
286
+ /**
287
+ * The newest Spring Boot major version `javaVersion` supports, or
288
+ * undefined when this package knows of no cap.
289
+ */
290
+ maxSpringBootMajor() {
291
+ return this.javaLine.maxSpringBootMajor;
292
+ }
293
+ configureBuild(options) {
294
+ this.pom.addProperty('project.build.sourceEncoding', 'UTF-8');
295
+ for (const [name, value] of Object.entries(this.javaLine.compilerProperties)) {
296
+ this.pom.addProperty(name, value);
297
+ }
298
+ // JUnit's version comes from its BOM (or from a framework BOM that
299
+ // manages it - see JavaSpringBootProject), never from a dependency.
300
+ this.pom.addBom(`${java_versions_1.JUNIT_BOM}@${this.pinnedVersion(java_versions_1.JUNIT_BOM)}`);
301
+ this.pom.addTestDependency('org.junit.jupiter/junit-jupiter');
302
+ this.addPlugin(`${java_versions_1.MAVEN_COMPILER_PLUGIN}@${this.pinnedVersion(java_versions_1.MAVEN_COMPILER_PLUGIN)}`);
303
+ this.addPlugin(`${java_versions_1.MAVEN_SUREFIRE_PLUGIN}@${this.pinnedVersion(java_versions_1.MAVEN_SUREFIRE_PLUGIN)}`);
304
+ // failsafe has no default lifecycle binding; bind it so `*IT` tests run
305
+ // in `mvn verify`.
306
+ this.addPlugin(`${java_versions_1.MAVEN_FAILSAFE_PLUGIN}@${this.pinnedVersion(java_versions_1.MAVEN_FAILSAFE_PLUGIN)}`, {
307
+ executions: [{ id: 'integration-tests', goals: ['integration-test', 'verify'] }],
308
+ });
309
+ this.addPlugin(`${java_versions_1.MAVEN_JAR_PLUGIN}@${this.pinnedVersion(java_versions_1.MAVEN_JAR_PLUGIN)}`, {
310
+ configuration: {
311
+ archive: {
312
+ manifest: {
313
+ addDefaultImplementationEntries: true,
314
+ addDefaultSpecificationEntries: true,
315
+ },
316
+ },
317
+ },
318
+ });
319
+ if (options.enforcer ?? true) {
320
+ const minMaven = options.minMavenVersion ?? java_versions_1.DEFAULT_MIN_MAVEN_VERSION;
321
+ (0, maven_pom_1.assertExactVersion)(minMaven, 'minMavenVersion');
322
+ this.addPlugin(`${java_versions_1.MAVEN_ENFORCER_PLUGIN}@${this.pinnedVersion(java_versions_1.MAVEN_ENFORCER_PLUGIN)}`, {
323
+ executions: [{ id: 'enforce-versions', goals: ['enforce'] }],
324
+ configuration: {
325
+ rules: {
326
+ requireMavenVersion: { version: `[${minMaven},)` },
327
+ requireJavaVersion: { version: this.javaLine.enforcerJavaRange },
328
+ },
329
+ },
330
+ });
331
+ }
332
+ }
333
+ addSample() {
334
+ const pkg = this.groupId.replace(/[^A-Za-z0-9_.]/g, '_');
335
+ const path = pkg.split('.');
336
+ new projen_1.SampleDir(this, path_1.posix.join('src/main/java', ...path), {
337
+ files: {
338
+ 'Main.java': [
339
+ `package ${pkg};`,
340
+ '',
341
+ 'public class Main {',
342
+ ' public static void main(String[] args) {',
343
+ ' System.out.println("Hello, world!");',
344
+ ' }',
345
+ '}',
346
+ '',
347
+ ].join('\n'),
348
+ },
349
+ });
350
+ new projen_1.SampleDir(this, path_1.posix.join('src/test/java', ...path), {
351
+ files: {
352
+ 'MainTest.java': [
353
+ `package ${pkg};`,
354
+ '',
355
+ 'import org.junit.jupiter.api.Test;',
356
+ '',
357
+ 'class MainTest {',
358
+ ' @Test',
359
+ ' void runs() {',
360
+ ' Main.main(new String[0]);',
361
+ ' }',
362
+ '}',
363
+ '',
364
+ ].join('\n'),
365
+ },
86
366
  });
87
- new upgrade_workflow_1.UpgradeWorkflow(this, { task: this.upgradeTask });
88
367
  }
89
368
  }
90
369
  exports.JavaMavenProject = JavaMavenProject;
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YS1tYXZlbi1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2phdmEvamF2YS1tYXZlbi1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FBNEM7QUFFNUMsbURBQStEO0FBQy9ELGlFQUEwRTtBQUMxRSx1RkFBaUY7QUFDakYsdURBQWlFO0FBQ2pFLGlFQUE2RDtBQUM3RCwrRkFBeUY7QUFDekYsaUVBQWlFO0FBSWpFOzs7OztHQUtHO0FBQ0gsTUFBYSxnQkFBaUIsU0FBUSxhQUFJLENBQUMsV0FBVzs7SUFDcEMsV0FBVyxDQUFPO0lBQ2xCLG1CQUFtQixDQUFzQjtJQUV6RCxZQUFZLE9BQWdDO1FBQzFDLEtBQUssQ0FBQztZQUNKLG9FQUFvRTtZQUNwRSxtRUFBbUU7WUFDbkUsc0VBQXNFO1lBQ3RFLHdEQUF3RDtZQUN4RCxxRUFBcUU7WUFDckUsNkRBQTZEO1lBQzdELEdBQUcsT0FBTztZQUNWLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtZQUNsQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDeEIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO1lBQzlCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU87WUFDbkMseUVBQXlFO1lBQ3pFLHFFQUFxRTtZQUNyRSx1RUFBdUU7WUFDdkUsd0VBQXdFO1lBQ3hFLGFBQWEsRUFBRSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUU7WUFDekMsb0VBQW9FO1lBQ3BFLG9FQUFvRTtZQUNwRSxxRUFBcUU7WUFDckUsaUVBQWlFO1lBQ2pFLG1FQUFtRTtZQUNuRSxvREFBb0Q7WUFDcEQsWUFBWSxFQUFFLEtBQUs7WUFDbkIsaUJBQWlCLEVBQUUsZUFBTSxDQUFDLGlCQUFpQixDQUFDLHVCQUF1QixDQUFDO2dCQUNsRSxNQUFNLEVBQUUsT0FBTyxDQUFDLGNBQWMsSUFBSSxvQ0FBd0I7YUFDM0QsQ0FBQztTQUNILENBQUMsQ0FBQztRQUVILG9FQUFvRTtRQUNwRSxzRUFBc0U7UUFDdEUseUNBQXlDO1FBQ3pDLElBQUEsc0NBQXdCLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFFL0Isb0VBQW9FO1FBQ3BFLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFOUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN2QixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDUixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUVELElBQUEsK0NBQTRCLEVBQUMsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxzREFBd0IsQ0FBQyxJQUFJLEVBQUU7WUFDakMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLElBQUksb0NBQXdCO1NBQ25FLENBQUMsQ0FBQztRQUNILElBQUksOERBQTRCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdkMsTUFBTSxjQUFjLEdBQStCLEVBQUUsQ0FBQztRQUN0RCxJQUFJLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM1QixjQUFjLENBQUMsSUFBSSxDQUFDO2dCQUNsQixJQUFJLEVBQUUsZ0JBQWdCO2dCQUN0QixHQUFHLEVBQUUseUNBQXlDLE9BQU8sQ0FBQyxlQUFlLEVBQUU7Z0JBQ3ZFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSw0QkFBNEIsRUFBRTthQUNuRCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksZUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUU7WUFDckQsSUFBSSxFQUFFLE9BQU87WUFDYixLQUFLLEVBQUUsT0FBTztZQUNkLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUztZQUNwQixRQUFRLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRTtZQUNuRCxXQUFXLEVBQUUsRUFBRSxRQUFRLEVBQUUsZUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFO1lBQzlELGNBQWM7U0FDZixDQUFDLENBQUM7UUFDSCxJQUFBLHNDQUFtQixFQUNqQixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUM3QixxRkFBcUYsQ0FDdEYsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDekMsSUFBSSxFQUFFLGdFQUFnRTtTQUN2RSxDQUFDLENBQUM7UUFDSCxJQUFJLGtDQUFlLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7O0FBaEZILDRDQWlGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRhc2ssIGdpdGh1YiwgamF2YSB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBDb21tb25KYXZhT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQgeyBERUZBVUxUX0dIRV9UT0tFTl9TRUNSRVQgfSBmcm9tICcuLi9jb21tb24vY29uc3RhbnRzJztcbmltcG9ydCB7IGFwcGx5SW50ZXJuYWxBY3Rpb25PdmVycmlkZXMgfSBmcm9tICcuLi9jb21tb24vaW50ZXJuYWwtYWN0aW9ucyc7XG5pbXBvcnQgeyBQcm9qZW5EcmlmdENoZWNrV29ya2Zsb3cgfSBmcm9tICcuLi9jb21tb24vcHJvamVuLWRyaWZ0LWNoZWNrLXdvcmtmbG93JztcbmltcG9ydCB7IGF0dGFjaFR5cGVTY3JpcHRQcm9qZW5yYyB9IGZyb20gJy4uL2NvbW1vbi9wcm9qZW5yYy10cyc7XG5pbXBvcnQgeyBVcGdyYWRlV29ya2Zsb3cgfSBmcm9tICcuLi9jb21tb24vdXBncmFkZS13b3JrZmxvdyc7XG5pbXBvcnQgeyBXb3JrZmxvd0NoYW5nZU5vdGljZVdvcmtmbG93IH0gZnJvbSAnLi4vY29tbW9uL3dvcmtmbG93LWNoYW5nZS1ub3RpY2Utd29ya2Zsb3cnO1xuaW1wb3J0IHsgbm90ZVdvcmtmbG93UHVycG9zZSB9IGZyb20gJy4uL2NvbW1vbi93b3JrZmxvdy1wdXJwb3NlJztcblxuZXhwb3J0IGludGVyZmFjZSBKYXZhTWF2ZW5Qcm9qZWN0T3B0aW9ucyBleHRlbmRzIENvbW1vbkphdmFPcHRpb25zIHt9XG5cbi8qKlxuICogU2hhcmVkIE1hdmVuIGJ1aWxkIHNrZWxldG9uIGZvciBhbGwgdGhyZWUgSmF2YSBwcm9qZWN0IHR5cGVzOiBzdGFuZGFyZFxuICogYHBvbS54bWxgL2RpcmVjdG9yeSBsYXlvdXQgKHZpYSBgamF2YS5KYXZhUHJvamVjdGApLCBhIFBSLXRyaWdnZXJlZFxuICogYnVpbGQrdGVzdCgrU29uYXJRdWJlKSB3b3JrZmxvdyB0aGF0IGhhcmQtZmFpbHMgb24gcHJvamVuIGRyaWZ0LCBhbmQgYVxuICogbmlnaHRseSBkZXBlbmRlbmN5LXVwZ3JhZGUgd29ya2Zsb3cuXG4gKi9cbmV4cG9ydCBjbGFzcyBKYXZhTWF2ZW5Qcm9qZWN0IGV4dGVuZHMgamF2YS5KYXZhUHJvamVjdCB7XG4gIHB1YmxpYyByZWFkb25seSB1cGdyYWRlVGFzazogVGFzaztcbiAgcHVibGljIHJlYWRvbmx5IGJ1aWxkVmVyaWZ5V29ya2Zsb3c6IGdpdGh1Yi5UYXNrV29ya2Zsb3c7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSmF2YU1hdmVuUHJvamVjdE9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAvLyBTcHJlYWQgZmlyc3QsIG92ZXJyaWRlcyBhZnRlcjogZm9yd2FyZGluZyB0aGUgY2FsbGVyJ3Mgb3B0aW9ucyBpc1xuICAgICAgLy8gd2hhdCBsZXRzIGBwcm9qZW4gbmV3IC0tZnJvbSBAeHBlcnRzcy9wcm9qZW4tdHlwZXMgamF2YV9saWJyYXJ5YFxuICAgICAgLy8gd29yayAtIHByb2plbiBzbXVnZ2xlcyBpdHMgYm9vdHN0cmFwIG1hcmtlciAoYF9fbmV3X19gKSB0aHJvdWdoIHRoZVxuICAgICAgLy8gb3B0aW9ucyBvYmplY3QsIGFuZCBpdCBpcyB0aGF0IG1hcmtlciB3aGljaCBtYWtlcyB0aGVcbiAgICAgIC8vIGBQcm9qZW5yY0ZpbGVgIGNvbXBvbmVudCB3cml0ZSB0aGUgaW5pdGlhbCBgLnByb2plbnJjLnRzYC4gRHJvcCBpdFxuICAgICAgLy8gYW5kIGBwcm9qZW4gbmV3YCBzY2FmZm9sZHMgYSByZXBvIHdpdGggbm8gcHJvamVucmMgYXQgYWxsLlxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgIGdyb3VwSWQ6IG9wdGlvbnMuZ3JvdXBJZCxcbiAgICAgIGFydGlmYWN0SWQ6IG9wdGlvbnMuYXJ0aWZhY3RJZCxcbiAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyAnMC4xLjAnLFxuICAgICAgLy8gUFIgdGl0bGVzIGFyZSBub3QgZ2F0ZWQ6IGBmZWF0OmAvYGZpeDpgIG1hdHRlciBvbmx5IGJlY2F1c2UgdGhleSBkcml2ZVxuICAgICAgLy8gdGhlIHJlbGVhc2Ugd29ya2Zsb3cgKHZpYSBgcmVsZWFzYWJsZUNvbW1pdHNgKSwgbm90IFBSIGNoZWNrcy4gVGhlXG4gICAgICAvLyBjb252ZW50aW9uYWwtY29tbWl0IFBSLXRpdGxlIGxpbnQgaXMgYWRkZWQgYnkgdGhlIGBHaXRIdWJgIGNvbXBvbmVudFxuICAgICAgLy8gdW5sZXNzIGBnaXRodWJPcHRpb25zLnB1bGxSZXF1ZXN0TGludGAgaXMgYGZhbHNlYCAoaXQgZGVmYXVsdHMgdHJ1ZSkuXG4gICAgICBnaXRodWJPcHRpb25zOiB7IHB1bGxSZXF1ZXN0TGludDogZmFsc2UgfSxcbiAgICAgIC8vIENvbnN1bWVycyBhdXRob3IgdGhlaXIgY29uZmlnIGFzIGEgTm9kZS1zaWRlIGAucHJvamVucmMudHNgICh0aGlzXG4gICAgICAvLyBwYWNrYWdlIG9ubHkgcHVibGlzaGVzIGFuIG5wbSBqc2lpIHRhcmdldCwgbm8gamF2YSB0YXJnZXQpLCBub3QgYVxuICAgICAgLy8gaGFuZC13cml0dGVuIGBzcmMvdGVzdC9qYXZhL3Byb2plbnJjLmphdmFgIC0gc28gamF2YS5KYXZhUHJvamVjdCdzXG4gICAgICAvLyBvd24gSmF2YS1uYXRpdmUgcHJvamVucmMgKHdoaWNoIHdpcmVzIHRoZSBkZWZhdWx0IHRhc2sgdG8gYG12blxuICAgICAgLy8gY29tcGlsZXI6dGVzdENvbXBpbGUgJiYgbXZuIGV4ZWM6amF2YSAuLi5gKSB3b3VsZCBiZSB3cm9uZyBoZXJlLlxuICAgICAgLy8gRGlzYWJsZSBpdCBhbmQgYXR0YWNoIHRoZSBUeXBlU2NyaXB0IG9uZSBpbnN0ZWFkLlxuICAgICAgcHJvamVucmNKYXZhOiBmYWxzZSxcbiAgICAgIHByb2plbkNyZWRlbnRpYWxzOiBnaXRodWIuR2l0aHViQ3JlZGVudGlhbHMuZnJvbVBlcnNvbmFsQWNjZXNzVG9rZW4oe1xuICAgICAgICBzZWNyZXQ6IG9wdGlvbnMuZ2hlVG9rZW5TZWNyZXQgPz8gREVGQVVMVF9HSEVfVE9LRU5fU0VDUkVULFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICAvLyBgLnByb2plbnJjLnRzYCArIGBucHggcHJvamVuYCwgc2FtZSBhcyBldmVyeSBvdGhlciB0eXBlIGhlcmUuIFRoZVxuICAgIC8vIE1hdmVuIHJlcG8gbmVlZHMgbm8gVHlwZVNjcmlwdCB0b29sY2hhaW4gb2YgaXRzIG93biAtIHRoZSBydW5uZXIgaXNcbiAgICAvLyBmZXRjaGVkIChwaW5uZWQpIGJ5IG5weCBhdCBzeW50aCB0aW1lLlxuICAgIGF0dGFjaFR5cGVTY3JpcHRQcm9qZW5yYyh0aGlzKTtcblxuICAgIC8vIEpldEJyYWlucyBJREUgc3RhdGUgKC5pZGVhLykgaXMgbmV2ZXIgdHJhY2tlZCBpbiBnZW5lcmF0ZWQgcmVwb3MuXG4gICAgdGhpcy5hZGRHaXRJZ25vcmUoJy8uaWRlYS8qJyk7XG5cbiAgICBjb25zdCBnaCA9IHRoaXMuZ2l0aHViO1xuICAgIGlmICghZ2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSmF2YU1hdmVuUHJvamVjdCByZXF1aXJlcyBHaXRIdWIgaW50ZWdyYXRpb24nKTtcbiAgICB9XG5cbiAgICBhcHBseUludGVybmFsQWN0aW9uT3ZlcnJpZGVzKGdoKTtcblxuICAgIG5ldyBQcm9qZW5EcmlmdENoZWNrV29ya2Zsb3codGhpcywge1xuICAgICAgZ2hlVG9rZW5TZWNyZXQ6IG9wdGlvbnMuZ2hlVG9rZW5TZWNyZXQgPz8gREVGQVVMVF9HSEVfVE9LRU5fU0VDUkVULFxuICAgIH0pO1xuICAgIG5ldyBXb3JrZmxvd0NoYW5nZU5vdGljZVdvcmtmbG93KHRoaXMpO1xuXG4gICAgY29uc3QgcG9zdEJ1aWxkU3RlcHM6IGdpdGh1Yi53b3JrZmxvd3MuSm9iU3RlcFtdID0gW107XG4gICAgaWYgKG9wdGlvbnMuc29uYXJQcm9qZWN0S2V5KSB7XG4gICAgICBwb3N0QnVpbGRTdGVwcy5wdXNoKHtcbiAgICAgICAgbmFtZTogJ1NvbmFyUXViZSBzY2FuJyxcbiAgICAgICAgcnVuOiBgbXZuIC1CIHNvbmFyOnNvbmFyIC1Ec29uYXIucHJvamVjdEtleT0ke29wdGlvbnMuc29uYXJQcm9qZWN0S2V5fWAsXG4gICAgICAgIGVudjogeyBTT05BUl9UT0tFTjogJyR7eyBzZWNyZXRzLlNPTkFSX1RPS0VOIH19JyB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5idWlsZFZlcmlmeVdvcmtmbG93ID0gbmV3IGdpdGh1Yi5UYXNrV29ya2Zsb3coZ2gsIHtcbiAgICAgIG5hbWU6ICdidWlsZCcsXG4gICAgICBqb2JJZDogJ2J1aWxkJyxcbiAgICAgIHRhc2s6IHRoaXMuYnVpbGRUYXNrLFxuICAgICAgdHJpZ2dlcnM6IHsgcHVsbFJlcXVlc3Q6IHt9LCB3b3JrZmxvd0Rpc3BhdGNoOiB7fSB9LFxuICAgICAgcGVybWlzc2lvbnM6IHsgY29udGVudHM6IGdpdGh1Yi53b3JrZmxvd3MuSm9iUGVybWlzc2lvbi5SRUFEIH0sXG4gICAgICBwb3N0QnVpbGRTdGVwcyxcbiAgICB9KTtcbiAgICBub3RlV29ya2Zsb3dQdXJwb3NlKFxuICAgICAgdGhpcy5idWlsZFZlcmlmeVdvcmtmbG93LmZpbGUsXG4gICAgICAnQnVpbGQgYW5kIHRlc3QgdGhlIE1hdmVuIHByb2plY3Qgb24gcHVsbCByZXF1ZXN0cywgd2l0aCBhbiBvcHRpb25hbCBTb25hclF1YmUgc2Nhbi4nLFxuICAgICk7XG5cbiAgICB0aGlzLnVwZ3JhZGVUYXNrID0gdGhpcy5hZGRUYXNrKCd1cGdyYWRlJywge1xuICAgICAgZXhlYzogJ212biAtQiB2ZXJzaW9uczp1c2UtbGF0ZXN0LXJlbGVhc2VzIHZlcnNpb25zOnVwZGF0ZS1wcm9wZXJ0aWVzJyxcbiAgICB9KTtcbiAgICBuZXcgVXBncmFkZVdvcmtmbG93KHRoaXMsIHsgdGFzazogdGhpcy51cGdyYWRlVGFzayB9KTtcbiAgfVxufVxuIl19
370
+ /**
371
+ * `projen new ... --java-version 21` (or `1.8`, or `--min-maven-version 3.9`)
372
+ * reaches the options as a *number*: yargs parses numeric-looking flags, and
373
+ * projen passes string-typed options through unchanged. The initial
374
+ * `.projenrc.ts` is rendered from the same args, so it would read
375
+ * `javaVersion: 21` and fail to type-check. No Java option is number-typed,
376
+ * so every numeric arg is turned back into the string the user typed. This
377
+ * runs before the Project constructor, which is where projen captures the
378
+ * args it renders. Options from a hand-written projenrc are never numbers
379
+ * (they type-check as strings) and are left alone.
380
+ */
381
+ function stringifyProjenNewArgs(options) {
382
+ const marker = options.__new__;
383
+ if (!marker?.args) {
384
+ return options;
385
+ }
386
+ for (const target of [options, marker.args]) {
387
+ for (const [name, value] of Object.entries(target)) {
388
+ if (typeof value === 'number') {
389
+ target[name] = String(value);
390
+ }
391
+ }
392
+ }
393
+ return options;
394
+ }
395
+ function normalizeModuleDir(dir) {
396
+ const unix = dir.replace(/\\/g, '/');
397
+ if (unix.startsWith('/') || /^[A-Za-z]:/.test(unix)) {
398
+ throw new Error(`Module dir "${dir}" must be relative to the repo root.`);
399
+ }
400
+ const normalized = path_1.posix.normalize(unix).replace(/\/+$/, '');
401
+ if (normalized === '.' || normalized === '' || normalized.split('/').includes('..')) {
402
+ throw new Error(`Module dir "${dir}" must be a subdirectory of the repo root.`);
403
+ }
404
+ return normalized;
405
+ }
406
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YS1tYXZlbi1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2phdmEvamF2YS1tYXZlbi1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSwrQkFBNkI7QUFDN0IsbUNBQTBFO0FBQzFFLDRFQUF1RTtBQUN2RSxtREFXeUI7QUFDekIsdURBQW1EO0FBQ25ELGlEQUFpRTtBQUVqRSxpREFBa0U7QUFDbEUsbURBQStEO0FBQy9ELHlEQUF5RDtBQUN6RCxpRUFBMEU7QUFDMUUsdUZBQWlGO0FBQ2pGLHVEQUFpRTtBQUNqRSwrRkFBeUY7QUFDekYsaUVBQWlFO0FBRWpFLDJFQUEyRTtBQUMzRSx3RUFBd0U7QUFDeEUseURBQXlEO0FBQ3pELDBCQUEwQjtBQUMxQixpRUFBaUU7QUFDakUsTUFBTSxjQUFjLEdBQVcsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxDQUFDO0FBQ3RFLGlFQUFpRTtBQUNqRSxNQUFNLG9CQUFvQixHQUFXLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUUzRTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFhLGdCQUFpQixTQUFRLGVBQU0sQ0FBQyxhQUFhOztJQUN4RCwwQkFBMEI7SUFDVixHQUFHLENBQVc7SUFFOUIsMkVBQTJFO0lBQzNELFdBQVcsQ0FBUztJQUVwQyx5RUFBeUU7SUFDekQsV0FBVyxDQUFPO0lBRWxDOzs7O09BSUc7SUFDYSxtQkFBbUIsQ0FBc0I7SUFFekQ7OztPQUdHO0lBQ2EsWUFBWSxDQUE2QjtJQUV4QyxRQUFRLENBQWtCO0lBQzFCLGFBQWEsQ0FBVTtJQUN2QixPQUFPLENBQVM7SUFDaEIsTUFBTSxDQUFVO0lBQ2hCLFlBQVksR0FBa0IsRUFBRSxDQUFDO0lBRWxELFlBQVksT0FBZ0M7UUFDMUMsS0FBSyxDQUFDO1lBQ0osb0VBQW9FO1lBQ3BFLHNFQUFzRTtZQUN0RSxpRUFBaUU7WUFDakUsd0RBQXdEO1lB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QUM3RCxJQUFJLFVBQVUsS0FBSyxHQUFHLElBQUksVUFBVSxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3BGLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxHQUFHLDRDQUE0QyxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwb3NpeCB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgSnNvbkZpbGUsIExpY2Vuc2UsIFNhbXBsZURpciwgVGFzaywgZ2l0aHViLCBqYXZhIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IE1hdmVuVXBncmFkZVJlcG9ydCB9IGZyb20gJy4vY29tcG9uZW50cy9tYXZlbi11cGdyYWRlLXJlcG9ydCc7XG5pbXBvcnQge1xuICBERUZBVUxUX01JTl9NQVZFTl9WRVJTSU9OLFxuICBKVU5JVF9CT00sXG4gIEphdmFMaW5lUHJvZmlsZSxcbiAgTUFWRU5fQ09NUElMRVJfUExVR0lOLFxuICBNQVZFTl9FTkZPUkNFUl9QTFVHSU4sXG4gIE1BVkVOX0ZBSUxTQUZFX1BMVUdJTixcbiAgTUFWRU5fSkFSX1BMVUdJTixcbiAgTUFWRU5fU1VSRUZJUkVfUExVR0lOLFxuICBWRVJTSU9OU19NQVZFTl9QTFVHSU4sXG4gIHJlc29sdmVKYXZhTGluZSxcbn0gZnJvbSAnLi9qYXZhLXZlcnNpb25zJztcbmltcG9ydCB7IE1hdmVuTW9kdWxlIH0gZnJvbSAnLi9tYXZlbi9tYXZlbi1tb2R1bGUnO1xuaW1wb3J0IHsgTWF2ZW5Qb20sIGFzc2VydEV4YWN0VmVyc2lvbiB9IGZyb20gJy4vbWF2ZW4vbWF2ZW4tcG9tJztcbmltcG9ydCB7IEphdmFNYXZlblByb2plY3RPcHRpb25zLCBNYXZlbk1vZHVsZU9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IHsgTlBNX0NJX1NURVAsIFNFVFVQX05PREVfU1RFUCB9IGZyb20gJy4uL2NvbW1vbi9jaS1zdGVwcyc7XG5pbXBvcnQgeyBERUZBVUxUX0dIRV9UT0tFTl9TRUNSRVQgfSBmcm9tICcuLi9jb21tb24vY29uc3RhbnRzJztcbmltcG9ydCB7IGFkZEVkaXRvckNvbmZpZyB9IGZyb20gJy4uL2NvbW1vbi9lZGl0b3Jjb25maWcnO1xuaW1wb3J0IHsgYXBwbHlJbnRlcm5hbEFjdGlvbk92ZXJyaWRlcyB9IGZyb20gJy4uL2NvbW1vbi9pbnRlcm5hbC1hY3Rpb25zJztcbmltcG9ydCB7IFByb2plbkRyaWZ0Q2hlY2tXb3JrZmxvdyB9IGZyb20gJy4uL2NvbW1vbi9wcm9qZW4tZHJpZnQtY2hlY2std29ya2Zsb3cnO1xuaW1wb3J0IHsgYXR0YWNoVHlwZVNjcmlwdFByb2plbnJjIH0gZnJvbSAnLi4vY29tbW9uL3Byb2plbnJjLXRzJztcbmltcG9ydCB7IFdvcmtmbG93Q2hhbmdlTm90aWNlV29ya2Zsb3cgfSBmcm9tICcuLi9jb21tb24vd29ya2Zsb3ctY2hhbmdlLW5vdGljZS13b3JrZmxvdyc7XG5pbXBvcnQgeyBub3RlV29ya2Zsb3dQdXJwb3NlIH0gZnJvbSAnLi4vY29tbW9uL3dvcmtmbG93LXB1cnBvc2UnO1xuXG4vLyBgcmVxdWlyZSguLi4pYCByZXNvbHZlcyB0aHJvdWdoIE5vZGUncyBub3JtYWwgbW9kdWxlIHJlc29sdXRpb24sIHNvIGluIGFcbi8vICpwdWJsaXNoZWQqIHBhY2thZ2UgdGhlc2UgYXJlIHRoZSB2ZXJzaW9ucyBpbnN0YWxsZWQgaW4gdGhlIGNvbnN1bWluZ1xuLy8gcmVwbyAtIGV4YWN0bHkgd2hhdCBpdHMgcGFja2FnZS5qc29uIG11c3QgcGluIChzYW1lIGFzXG4vLyBgR2l0SHViQWN0aW9uUHJvamVjdGApLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IFBST0pFTl9WRVJTSU9OOiBzdHJpbmcgPSByZXF1aXJlKCdwcm9qZW4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5jb25zdCBQUk9KRU5fVFlQRVNfVkVSU0lPTjogc3RyaW5nID0gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcblxuLyoqXG4gKiBCYXNlbGluZSBNYXZlbiBwcm9qZWN0LCBzaW5nbGUtIG9yIG11bHRpLW1vZHVsZSwgd2l0aCBubyBmcmFtZXdvcmtcbiAqIGFzc3VtcHRpb25zLiBJdCBpcyB0aGUgYmFzZSBvZiBldmVyeSBKYXZhIHR5cGUgaW4gdGhpcyBwYWNrYWdlIGFuZCBpc1xuICogdXNhYmxlIG9uIGl0cyBvd24gKGBwcm9qZW4gbmV3IC4uLiBqYXZhX21hdmVuYCkuXG4gKlxuICogLSBUaGUgcG9tIGlzIHdyaXR0ZW4gYnkgdGhpcyBwYWNrYWdlIChgTWF2ZW5Qb21gKSwgbm90IHByb2plbidzXG4gKiAgIGBqYXZhLlBvbWA6IGV4YWN0IHZlcnNpb25zIG9ubHksIEJPTSBpbXBvcnRzLCBgPG1vZHVsZXM+YCxcbiAqICAgYDxkZXBlbmRlbmN5TWFuYWdlbWVudD5gLCBgPHBsdWdpbk1hbmFnZW1lbnQ+YC5cbiAqIC0gRXZlcnl0aGluZyBKYXZhLXZlcnNpb24tZGVwZW5kZW50IChjb21waWxlciBsZXZlbCwgZW5mb3JjZXIgcnVsZSwgSlVuaXRcbiAqICAgbGluZSwgQ0kgSkRLKSBmb2xsb3dzIGBqYXZhVmVyc2lvbmAuXG4gKiAtIFdpdGggbm8gYGFkZE1vZHVsZSgpYCBjYWxscyB0aGUgcm9vdCBwb20gaXMgdGhlIGFydGlmYWN0LiBBZnRlciB0aGVcbiAqICAgZmlyc3QgYGFkZE1vZHVsZSgpYCBpdCBpcyBhIGBwb21gLXBhY2thZ2VkIHJlYWN0b3IgcGFyZW50IGFuZCB0aGVcbiAqICAgbW9kdWxlcyBpbmhlcml0IGl0cyBwbHVnaW5zIGFuZCB0ZXN0IGRlcGVuZGVuY2llcy5cbiAqIC0gYG5weCBwcm9qZW4gYnVpbGRgIHN5bnRoZXNpemVzLCB0aGVuIHJ1bnMgTWF2ZW4gb25jZTogYG12biAtQiB2ZXJpZnlgXG4gKiAgICh1bml0IHRlc3RzIHZpYSBzdXJlZmlyZSwgYCpJVGAgdGVzdHMgdmlhIGZhaWxzYWZlKS5cbiAqIC0gQ0k6IGEgUFIgYnVpbGQgKHdpdGggYW4gb3B0aW9uYWwgU29uYXJRdWJlIHNjYW4pLCB0aGUgcHJvamVuIGRyaWZ0XG4gKiAgIGNoZWNrLCBhbmQgYSBuaWdodGx5IHJlcG9ydC1vbmx5IHVwZGF0ZSBjaGVjay5cbiAqL1xuZXhwb3J0IGNsYXNzIEphdmFNYXZlblByb2plY3QgZXh0ZW5kcyBnaXRodWIuR2l0SHViUHJvamVjdCB7XG4gIC8qKiBUaGUgcm9vdCBgcG9tLnhtbGAuICovXG4gIHB1YmxpYyByZWFkb25seSBwb206IE1hdmVuUG9tO1xuXG4gIC8qKiBUaGUgY2Fub25pY2FsIEphdmEgbGluZSB0aGUgYnVpbGQgdGFyZ2V0cyAoYDEuOGAsIGAxN2AsIGAyMWAsIGAyNWApLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgamF2YVZlcnNpb246IHN0cmluZztcblxuICAvKiogUHJpbnRzIGF2YWlsYWJsZSBkZXBlbmRlbmN5L3BsdWdpbiB1cGRhdGVzIChgbnB4IHByb2plbiB1cGdyYWRlYCkuICovXG4gIHB1YmxpYyByZWFkb25seSB1cGdyYWRlVGFzazogVGFzaztcblxuICAvKipcbiAgICogVGhlIFBSIGJ1aWxkIHdvcmtmbG93IChgYnVpbGQueW1sYCkuIEFkZCBqb2JzIHRvIGl0IHdpdGhcbiAgICogYGJ1aWxkVmVyaWZ5V29ya2Zsb3cuYWRkSm9iKGlkLCBqb2IpYDsgdXNlIGBjaVNldHVwU3RlcHNgIGZvciBhIGpvYiB0aGF0XG4gICAqIG5lZWRzIE5vZGUsIHRoZSBwcm9qZW4gdG9vbGNoYWluLCBhbmQgdGhlIEpESy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBidWlsZFZlcmlmeVdvcmtmbG93OiBnaXRodWIuVGFza1dvcmtmbG93O1xuXG4gIC8qKlxuICAgKiBTdGVwcyB0aGF0IGluc3RhbGwgTm9kZSAocGlubmVkKSwgYG5wbSBjaWAsIGFuZCB0aGUgcHJvamVjdCdzIEpESyB3aXRoIGFcbiAgICogTWF2ZW4gY2FjaGUgLSB0aGUgc2V0dXAgZXZlcnkgTWF2ZW4gQ0kgam9iIGluIHRoaXMgcmVwbyBuZWVkcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjaVNldHVwU3RlcHM6IGdpdGh1Yi53b3JrZmxvd3MuSm9iU3RlcFtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgamF2YUxpbmU6IEphdmFMaW5lUHJvZmlsZTtcbiAgcHJpdmF0ZSByZWFkb25seSByb290UGFja2FnaW5nPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGdyb3VwSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzYW1wbGU6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF2ZW5Nb2R1bGVzOiBNYXZlbk1vZHVsZVtdID0gW107XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSmF2YU1hdmVuUHJvamVjdE9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAvLyBTcHJlYWQgZmlyc3QsIG92ZXJyaWRlcyBhZnRlcjogZm9yd2FyZGluZyB0aGUgY2FsbGVyJ3Mgb3B0aW9ucyBpc1xuICAgICAgLy8gd2hhdCBsZXRzIGBwcm9qZW4gbmV3IC0tZnJvbSBAeHBlcnRzcy9wcm9qZW4tdHlwZXMgamF2YV9tYXZlbmAgd29ya1xuICAgICAgLy8gLSBwcm9qZW4gc211Z2dsZXMgaXRzIGJvb3RzdHJhcCBtYXJrZXIgKGBfX25ld19fYCkgdGhyb3VnaCB0aGVcbiAgICAgIC8vIG9wdGlvbnMgb2JqZWN0LCBhbmQgaXQgaXMgdGhhdCBtYXJrZXIgd2hpY2ggbWFrZXMgdGhlXG4gICAgICAvLyBgUHJvamVucmNGaWxlYCBjb21wb25lbnQgd3JpdGUgdGhlIGluaXRpYWwgYC5wcm9qZW5yYy50c2AuIERyb3AgaXRcbiAgICAgIC8vIGFuZCBgcHJvamVuIG5ld2Agc2NhZmZvbGRzIGEgcmVwbyB3aXRoIG5vIHByb2plbnJjIGF0IGFsbC5cbiAgICAgIC4uLnN0cmluZ2lmeVByb2plbk5ld0FyZ3Mob3B0aW9ucyksXG4gICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAvLyBQUiB0aXRsZXMgYXJlIG5vdCBnYXRlZDogYGZlYXQ6YC9gZml4OmAgbWF0dGVyIG9ubHkgYmVjYXVzZSB0aGV5IGRyaXZlXG4gICAgICAvLyB0aGUgcmVsZWFzZSB3b3JrZmxvdyAodmlhIGByZWxlYXNhYmxlQ29tbWl0c2ApLCBub3QgUFIgY2hlY2tzLiBUaGVcbiAgICAgIC8vIGNvbnZlbnRpb25hbC1jb21taXQgUFItdGl0bGUgbGludCBpcyBhZGRlZCBieSB0aGUgYEdpdEh1YmAgY29tcG9uZW50XG4gICAgICAvLyB1bmxlc3MgYGdpdGh1Yk9wdGlvbnMucHVsbFJlcXVlc3RMaW50YCBpcyBgZmFsc2VgIChpdCBkZWZhdWx0cyB0cnVlKS5cbiAgICAgIGdpdGh1Yk9wdGlvbnM6IHsgcHVsbFJlcXVlc3RMaW50OiBmYWxzZSB9LFxuICAgICAgcHJvamVuQ3JlZGVudGlhbHM6IGdpdGh1Yi5HaXRodWJDcmVkZW50aWFscy5mcm9tUGVyc29uYWxBY2Nlc3NUb2tlbih7XG4gICAgICAgIHNlY3JldDogb3B0aW9ucy5naGVUb2tlblNlY3JldCA/PyBERUZBVUxUX0dIRV9UT0tFTl9TRUNSRVQsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgdmVyc2lvbiBvZiBPYmplY3QudmFsdWVzKG9wdGlvbnMucGx1Z2luVmVyc2lvbnMgPz8ge30pKSB7XG4gICAgICBhc3NlcnRFeGFjdFZlcnNpb24odmVyc2lvbiwgJ3BsdWdpblZlcnNpb25zJyk7XG4gICAgfVxuICAgIHRoaXMuamF2YUxpbmUgPSByZXNvbHZlSmF2YUxpbmUob3B0aW9ucy5qYXZhVmVyc2lvbiwgb3B0aW9ucy5wbHVnaW5WZXJzaW9ucyk7XG4gICAgdGhpcy5qYXZhVmVyc2lvbiA9IHRoaXMuamF2YUxpbmUubGluZTtcbiAgICB0aGlzLnJvb3RQYWNrYWdpbmcgPSBvcHRpb25zLnBhY2thZ2luZztcbiAgICB0aGlzLmdyb3VwSWQgPSBvcHRpb25zLmdyb3VwSWQ7XG4gICAgdGhpcy5zYW1wbGUgPSBvcHRpb25zLnNhbXBsZSA/PyBmYWxzZTtcblxuICAgIC8vIGAucHJvamVucmMudHNgICsgYG5weCBwcm9qZW5gLCBzYW1lIGFzIGV2ZXJ5IG90aGVyIHR5cGUgaGVyZS4gVGhlXG4gICAgLy8gTWF2ZW4gcmVwbyBuZWVkcyBubyBUeXBlU2NyaXB0IHRvb2xjaGFpbiBvZiBpdHMgb3duIC0gdGhlIHJ1bm5lciBpc1xuICAgIC8vIGZldGNoZWQgKHBpbm5lZCkgYnkgbnB4IGF0IHN5bnRoIHRpbWUuXG4gICAgYXR0YWNoVHlwZVNjcmlwdFByb2plbnJjKHRoaXMpO1xuXG4gICAgLy8gVGhlIHByb2plbiB0b29sY2hhaW4gYG5weCBwcm9qZW5gIHJ1bnMsIHBpbm5lZCBleGFjdGx5IHNvIGV2ZXJ5XG4gICAgLy8gbWFjaGluZSBhbmQgQ0kgcmVzb2x2ZSB0aGUgc2FtZSBnZW5lcmF0b3IuIE93bmVyLXdyaXRhYmxlIG9uIGRpc2sgc29cbiAgICAvLyB0aGUgZG9jdW1lbnRlZCB1cGRhdGUgZmxvdyAoYG5wbSBpIC1EIC1FIEB4cGVydHNzL3Byb2plbi10eXBlc0A8dj5gKVxuICAgIC8vIGNhbiByZXdyaXRlIGl0OyBoYW5kLWVkaXRzIGFyZSBzdGlsbCBjYXVnaHQgYnkgdGhlIGRyaWZ0IGNoZWNrLlxuICAgIG5ldyBKc29uRmlsZSh0aGlzLCAncGFja2FnZS5qc29uJywge1xuICAgICAgb2JqOiB7XG4gICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgdmVyc2lvbjogJzAuMC4wJyxcbiAgICAgICAgcHJpdmF0ZTogdHJ1ZSxcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzOiB7XG4gICAgICAgICAgJ3Byb2plbic6IFBST0pFTl9WRVJTSU9OLFxuICAgICAgICAgICdAeHBlcnRzcy9wcm9qZW4tdHlwZXMnOiBQUk9KRU5fVFlQRVNfVkVSU0lPTixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZWFkb25seTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvLyBKZXRCcmFpbnMgSURFIHN0YXRlICguaWRlYS8pIGlzIG5ldmVyIHRyYWNrZWQgaW4gZ2VuZXJhdGVkIHJlcG9zLCBhbmRcbiAgICAvLyBuZWl0aGVyIGlzIC9zcGVjLyAobG9jYWwgcGxhbnMgYW5kIHNwZWNzOyB0aGUgcGF0dGVybiBjb3ZlcnMgZXZlcnlcbiAgICAvLyBzdWJkaXJlY3RvcnkpLlxuICAgIHRoaXMuYWRkR2l0SWdub3JlKCcvLmlkZWEvKicpO1xuICAgIHRoaXMuYWRkR2l0SWdub3JlKCcvc3BlYy8nKTtcbiAgICB0aGlzLmFkZEdpdElnbm9yZSgndGFyZ2V0LycpO1xuICAgIHRoaXMuYWRkR2l0SWdub3JlKCcuY2xhc3NwYXRoJyk7XG4gICAgdGhpcy5hZGRHaXRJZ25vcmUoJy5wcm9qZWN0Jyk7XG4gICAgdGhpcy5hZGRHaXRJZ25vcmUoJy5zZXR0aW5ncycpO1xuXG4gICAgaWYgKG9wdGlvbnMubGljZW5zZWQgPz8gdHJ1ZSkge1xuICAgICAgbmV3IExpY2Vuc2UodGhpcywge1xuICAgICAgICBzcGR4OiBvcHRpb25zLmxpY2Vuc2UgPz8gJ01JVCcsXG4gICAgICAgIGNvcHlyaWdodE93bmVyOiBvcHRpb25zLmNvcHlyaWdodE93bmVyID8/ICd4cGVydHNzJyxcbiAgICAgICAgY29weXJpZ2h0UGVyaW9kOiBvcHRpb25zLmNvcHlyaWdodFBlcmlvZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5lZGl0b3Jjb25maWcgPz8gdHJ1ZSkge1xuICAgICAgYWRkRWRpdG9yQ29uZmlnKHRoaXMpO1xuICAgIH1cblxuICAgIHRoaXMucG9tID0gbmV3IE1hdmVuUG9tKHRoaXMsIHtcbiAgICAgIGdyb3VwSWQ6IG9wdGlvbnMuZ3JvdXBJZCxcbiAgICAgIGFydGlmYWN0SWQ6IG9wdGlvbnMuYXJ0aWZhY3RJZCxcbiAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyAnMC4xLjAnLFxuICAgICAgcGFja2FnaW5nOiB0aGlzLnJvb3RQYWNrYWdpbmcgPz8gJ2phcicsXG4gICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogb3B0aW9ucy5kZXNjcmlwdGlvbixcbiAgICAgIHVybDogb3B0aW9ucy51cmwsXG4gICAgfSk7XG4gICAgdGhpcy5jb25maWd1cmVCdWlsZChvcHRpb25zKTtcblxuICAgIC8vIE9uZSBNYXZlbiBydW4gcGVyIGJ1aWxkOiBgdmVyaWZ5YCBydW5zIGV2ZXJ5IGVhcmxpZXIgcGhhc2UgKGNvbXBpbGUsXG4gICAgLy8gdW5pdCB0ZXN0cywgcGFja2FnZSkgcGx1cyBpbnRlZ3JhdGlvbiB0ZXN0cy4gTm90aGluZyBkZXBsb3lzLlxuICAgIHRoaXMudGVzdFRhc2suZXhlYygnbXZuIC1CIHZlcmlmeScpO1xuXG4gICAgY29uc3QgZ2ggPSB0aGlzLmdpdGh1YjtcbiAgICBpZiAoIWdoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0phdmFNYXZlblByb2plY3QgcmVxdWlyZXMgR2l0SHViIGludGVncmF0aW9uJyk7XG4gICAgfVxuICAgIGFwcGx5SW50ZXJuYWxBY3Rpb25PdmVycmlkZXMoZ2gpO1xuXG4gICAgbmV3IFByb2plbkRyaWZ0Q2hlY2tXb3JrZmxvdyh0aGlzLCB7XG4gICAgICBnaGVUb2tlblNlY3JldDogb3B0aW9ucy5naGVUb2tlblNlY3JldCA/PyBERUZBVUxUX0dIRV9UT0tFTl9TRUNSRVQsXG4gICAgfSk7XG4gICAgbmV3IFdvcmtmbG93Q2hhbmdlTm90aWNlV29ya2Zsb3codGhpcyk7XG5cbiAgICB0aGlzLmNpU2V0dXBTdGVwcyA9IFtcbiAgICAgIFNFVFVQX05PREVfU1RFUCxcbiAgICAgIE5QTV9DSV9TVEVQLFxuICAgICAge1xuICAgICAgICBuYW1lOiAnU2V0dXAgSmF2YScsXG4gICAgICAgIHVzZXM6ICdhY3Rpb25zL3NldHVwLWphdmFAdjYnLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgJ2Rpc3RyaWJ1dGlvbic6IG9wdGlvbnMuamF2YURpc3RyaWJ1dGlvbiA/PyAndGVtdXJpbicsXG4gICAgICAgICAgJ2phdmEtdmVyc2lvbic6IHRoaXMuamF2YUxpbmUuc2V0dXBKYXZhVmVyc2lvbixcbiAgICAgICAgICAnY2FjaGUnOiAnbWF2ZW4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgcG9zdEJ1aWxkU3RlcHM6IGdpdGh1Yi53b3JrZmxvd3MuSm9iU3RlcFtdID0gW107XG4gICAgaWYgKG9wdGlvbnMuc29uYXJQcm9qZWN0S2V5KSB7XG4gICAgICBwb3N0QnVpbGRTdGVwcy5wdXNoKHtcbiAgICAgICAgbmFtZTogJ1NvbmFyUXViZSBzY2FuJyxcbiAgICAgICAgcnVuOiBgbXZuIC1CIHNvbmFyOnNvbmFyIC1Ec29uYXIucHJvamVjdEtleT0ke29wdGlvbnMuc29uYXJQcm9qZWN0S2V5fWAsXG4gICAgICAgIGVudjogeyBTT05BUl9UT0tFTjogJyR7eyBzZWNyZXRzLlNPTkFSX1RPS0VOIH19JyB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5idWlsZFZlcmlmeVdvcmtmbG93ID0gbmV3IGdpdGh1Yi5UYXNrV29ya2Zsb3coZ2gsIHtcbiAgICAgIG5hbWU6ICdidWlsZCcsXG4gICAgICBqb2JJZDogJ2J1aWxkJyxcbiAgICAgIHRhc2s6IHRoaXMuYnVpbGRUYXNrLFxuICAgICAgdHJpZ2dlcnM6IHsgcHVsbFJlcXVlc3Q6IHt9LCB3b3JrZmxvd0Rpc3BhdGNoOiB7fSB9LFxuICAgICAgcGVybWlzc2lvbnM6IHsgY29udGVudHM6IGdpdGh1Yi53b3JrZmxvd3MuSm9iUGVybWlzc2lvbi5SRUFEIH0sXG4gICAgICBwcmVCdWlsZFN0ZXBzOiB0aGlzLmNpU2V0dXBTdGVwcyxcbiAgICAgIHBvc3RCdWlsZFN0ZXBzLFxuICAgIH0pO1xuICAgIG5vdGVXb3JrZmxvd1B1cnBvc2UoXG4gICAgICB0aGlzLmJ1aWxkVmVyaWZ5V29ya2Zsb3cuZmlsZSxcbiAgICAgICdCdWlsZCBhbmQgdGVzdCB0aGUgTWF2ZW4gcHJvamVjdCBvbiBwdWxsIHJlcXVlc3RzLCB3aXRoIGFuIG9wdGlvbmFsIFNvbmFyUXViZSBzY2FuLicsXG4gICAgKTtcblxuICAgIGNvbnN0IHZlcnNpb25zUGx1Z2luID0gYG9yZy5jb2RlaGF1cy5tb2pvOnZlcnNpb25zLW1hdmVuLXBsdWdpbjoke3RoaXMucGlubmVkVmVyc2lvbihWRVJTSU9OU19NQVZFTl9QTFVHSU4pfWA7XG4gICAgdGhpcy51cGdyYWRlVGFzayA9IHRoaXMuYWRkVGFzaygndXBncmFkZScsIHtcbiAgICAgIGV4ZWM6IGBtdm4gLUIgJHt2ZXJzaW9uc1BsdWdpbn06ZGlzcGxheS1kZXBlbmRlbmN5LXVwZGF0ZXMgJHt2ZXJzaW9uc1BsdWdpbn06ZGlzcGxheS1wbHVnaW4tdXBkYXRlc2AsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMudXBncmFkZVdvcmtmbG93ID8/IHRydWUpIHtcbiAgICAgIG5ldyBNYXZlblVwZ3JhZGVSZXBvcnQodGhpcywge1xuICAgICAgICB0YXNrOiB0aGlzLnVwZ3JhZGVUYXNrLFxuICAgICAgICBzZXR1cFN0ZXBzOiB0aGlzLmNpU2V0dXBTdGVwcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgbW9kdWxlcyBhZGRlZCB3aXRoIGBhZGRNb2R1bGUoKWAsIGluIG9yZGVyLiAqL1xuICBwdWJsaWMgZ2V0IG1vZHVsZXMoKTogTWF2ZW5Nb2R1bGVbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLm1hdmVuTW9kdWxlc107XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIE1hdmVuIG1vZHVsZSBpbiBgZGlyYCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdDsgbWF5IGJlIG5lc3RlZCxcbiAgICogZS5nLiBgdG9vbHMvc3R1Yi1tb2RlbGApIGFuZCB0dXJucyB0aGUgcm9vdCBwb20gaW50byB0aGUgcmVhY3RvciBwYXJlbnRcbiAgICogKGBwYWNrYWdpbmc9cG9tYCwgYDxtb2R1bGVzPmAgaW4gdGhlIG9yZGVyIGFkZGVkKS4gVGhlIHBhcmVudCBtYW5hZ2VzXG4gICAqIGV2ZXJ5IG1vZHVsZSBhdCBgJHtwcm9qZWN0LnZlcnNpb259YCwgc28gbW9kdWxlcyBkZXBlbmQgb24gZWFjaCBvdGhlclxuICAgKiB3aXRoIGBhZGRNb2R1bGVEZXBlbmRlbmN5KClgLCB2ZXJzaW9ubGVzcy5cbiAgICovXG4gIHB1YmxpYyBhZGRNb2R1bGUob3B0aW9uczogTWF2ZW5Nb2R1bGVPcHRpb25zKTogTWF2ZW5Nb2R1bGUge1xuICAgIGlmICh0aGlzLnJvb3RQYWNrYWdpbmcgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJvb3RQYWNrYWdpbmcgIT09ICdwb20nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBIG11bHRpLW1vZHVsZSBwcm9qZWN0J3Mgcm9vdCBwb20gaXMgcGFja2FnZWQgYXMgXCJwb21cIjsgcmVtb3ZlIHBhY2thZ2luZzogXCIke3RoaXMucm9vdFBhY2thZ2luZ31cIi5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZGlyID0gbm9ybWFsaXplTW9kdWxlRGlyKG9wdGlvbnMuZGlyKTtcbiAgICBmb3IgKGNvbnN0IG0gb2YgdGhpcy5tYXZlbk1vZHVsZXMpIHtcbiAgICAgIGlmIChtLmFydGlmYWN0SWQgPT09IG9wdGlvbnMuYXJ0aWZhY3RJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYER1cGxpY2F0ZSBtb2R1bGUgYXJ0aWZhY3RJZCBcIiR7b3B0aW9ucy5hcnRpZmFjdElkfVwiIChkaXJzIFwiJHttLmRpcn1cIiBhbmQgXCIke2Rpcn1cIikuYCk7XG4gICAgICB9XG4gICAgICBpZiAobS5kaXIgPT09IGRpciB8fCBkaXIuc3RhcnRzV2l0aChgJHttLmRpcn0vYCkgfHwgbS5kaXIuc3RhcnRzV2l0aChgJHtkaXJ9L2ApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kdWxlIGRpciBcIiR7ZGlyfVwiIG92ZXJsYXBzIG1vZHVsZSBkaXIgXCIke20uZGlyfVwiOiBtb2R1bGUgZGlycyBtdXN0IGJlIGRpc3RpbmN0IGFuZCBub3QgbmVzdGVkLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1vZHVsZSA9IG5ldyBNYXZlbk1vZHVsZSh0aGlzLCB0aGlzLnBvbSwgeyAuLi5vcHRpb25zLCBkaXIgfSk7XG4gICAgdGhpcy5tYXZlbk1vZHVsZXMucHVzaChtb2R1bGUpO1xuICAgIHRoaXMucG9tLnBhY2thZ2luZyA9ICdwb20nO1xuICAgIHRoaXMucG9tLm1hbmFnZVBsdWdpblZlcnNpb25zID0gdHJ1ZTtcbiAgICB0aGlzLnBvbS5hZGRNb2R1bGUoZGlyKTtcbiAgICB0aGlzLnBvbS5hZGRNYW5hZ2VkRGVwZW5kZW5jeShgJHt0aGlzLmdyb3VwSWR9LyR7b3B0aW9ucy5hcnRpZmFjdElkfUBcXCR7cHJvamVjdC52ZXJzaW9ufWApO1xuICAgIHJldHVybiBtb2R1bGU7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyBhIEJPTSBpbnRvIHRoZSByb290IGA8ZGVwZW5kZW5jeU1hbmFnZW1lbnQ+YCAoYHR5cGU9cG9tYCxcbiAgICogYHNjb3BlPWltcG9ydGApLlxuICAgKlxuICAgKiBAcGFyYW0gc3BlYyBgZ3JvdXBJZC9hcnRpZmFjdElkQHZlcnNpb25gXG4gICAqL1xuICBwdWJsaWMgYWRkQm9tKHNwZWM6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucG9tLmFkZEJvbShzcGVjKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaW5zIGEgdmVyc2lvbiBpbiB0aGUgcm9vdCBgPGRlcGVuZGVuY3lNYW5hZ2VtZW50PmAgd2l0aG91dCBhZGRpbmcgdGhlXG4gICAqIGRlcGVuZGVuY3ksIHNvIG1vZHVsZXMgKG9yIHRoZSByb290KSBjYW4gdXNlIGl0IHZlcnNpb25sZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gc3BlYyBgZ3JvdXBJZC9hcnRpZmFjdElkQHZlcnNpb25gXG4gICAqL1xuICBwdWJsaWMgYWRkTWFuYWdlZERlcGVuZGVuY3koc3BlYzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wb20uYWRkTWFuYWdlZERlcGVuZGVuY3koc3BlYyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbXBpbGUtc2NvcGUgZGVwZW5kZW5jeSB0byB0aGUgcm9vdCBwb20uIEluIGEgbXVsdGktbW9kdWxlXG4gICAqIHByb2plY3QgZXZlcnkgbW9kdWxlIGluaGVyaXRzIGl0OyB1c2UgYE1hdmVuTW9kdWxlLmFkZERlcGVuZGVuY3lgIGZvclxuICAgKiBvbmUgbW9kdWxlLlxuICAgKlxuICAgKiBAcGFyYW0gc3BlYyBgZ3JvdXBJZC9hcnRpZmFjdElkW0B2ZXJzaW9uXWAgLSBleGFjdCB2ZXJzaW9uLCBvciBub25lIHdoZW5cbiAgICogYSBCT00gbWFuYWdlcyBpdFxuICAgKi9cbiAgcHVibGljIGFkZERlcGVuZGVuY3koc3BlYzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wb20uYWRkRGVwZW5kZW5jeShzcGVjKTtcbiAgfVxuXG4gIC8qKiBBZGRzIGEgdGVzdC1zY29wZSBkZXBlbmRlbmN5IHRvIHRoZSByb290IHBvbSAoaW5oZXJpdGVkIGJ5IGV2ZXJ5IG1vZHVsZSkuICovXG4gIHB1YmxpYyBhZGRUZXN0RGVwZW5kZW5jeShzcGVjOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnBvbS5hZGRUZXN0RGVwZW5kZW5jeShzcGVjKTtcbiAgfVxuXG4gIC8qKiBBZGRzIGEgYnVpbGQgcGx1Z2luIHRvIHRoZSByb290IHBvbSAoaW5oZXJpdGVkIGJ5IGV2ZXJ5IG1vZHVsZSkuICovXG4gIHB1YmxpYyBhZGRQbHVnaW4oc3BlYzogc3RyaW5nLCBvcHRpb25zOiBqYXZhLlBsdWdpbk9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIHRoaXMucG9tLmFkZFBsdWdpbihzcGVjLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVTeW50aGVzaXplKCk6IHZvaWQge1xuICAgIHN1cGVyLnByZVN5bnRoZXNpemUoKTtcbiAgICBpZiAodGhpcy5zYW1wbGUgJiYgdGhpcy5tYXZlbk1vZHVsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmFkZFNhbXBsZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZXhhY3QgdmVyc2lvbiB0aGlzIHByb2plY3QgdXNlcyBmb3IgYSBgZ3JvdXBJZC9hcnRpZmFjdElkYCBpdCBwaW5zXG4gICAqIGJ5IGRlZmF1bHQ6IHRoZSBgcGx1Z2luVmVyc2lvbnNgIG92ZXJyaWRlIGlmIHNldCwgb3RoZXJ3aXNlIHRoZVxuICAgKiBkZWZhdWx0IGZvciBgamF2YVZlcnNpb25gLlxuICAgKi9cbiAgcHVibGljIHBpbm5lZFZlcnNpb24oY29vcmRpbmF0ZXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdmVyc2lvbiA9IHRoaXMuamF2YUxpbmUudmVyc2lvbnNbY29vcmRpbmF0ZXNdO1xuICAgIGlmICghdmVyc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBkZWZhdWx0IHZlcnNpb24gZm9yICR7Y29vcmRpbmF0ZXN9LmApO1xuICAgIH1cbiAgICByZXR1cm4gdmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmV3ZXN0IFNwcmluZyBCb290IG1ham9yIHZlcnNpb24gYGphdmFWZXJzaW9uYCBzdXBwb3J0cywgb3JcbiAgICogdW5kZWZpbmVkIHdoZW4gdGhpcyBwYWNrYWdlIGtub3dzIG9mIG5vIGNhcC5cbiAgICovXG4gIHByb3RlY3RlZCBtYXhTcHJpbmdCb290TWFqb3IoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5qYXZhTGluZS5tYXhTcHJpbmdCb290TWFqb3I7XG4gIH1cblxuICBwcml2YXRlIGNvbmZpZ3VyZUJ1aWxkKG9wdGlvbnM6IEphdmFNYXZlblByb2plY3RPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5wb20uYWRkUHJvcGVydHkoJ3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2RpbmcnLCAnVVRGLTgnKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5qYXZhTGluZS5jb21waWxlclByb3BlcnRpZXMpKSB7XG4gICAgICB0aGlzLnBvbS5hZGRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gSlVuaXQncyB2ZXJzaW9uIGNvbWVzIGZyb20gaXRzIEJPTSAob3IgZnJvbSBhIGZyYW1ld29yayBCT00gdGhhdFxuICAgIC8vIG1hbmFnZXMgaXQgLSBzZWUgSmF2YVNwcmluZ0Jvb3RQcm9qZWN0KSwgbmV2ZXIgZnJvbSBhIGRlcGVuZGVuY3kuXG4gICAgdGhpcy5wb20uYWRkQm9tKGAke0pVTklUX0JPTX1AJHt0aGlzLnBpbm5lZFZlcnNpb24oSlVOSVRfQk9NKX1gKTtcbiAgICB0aGlzLnBvbS5hZGRUZXN0RGVwZW5kZW5jeSgnb3JnLmp1bml0Lmp1cGl0ZXIvanVuaXQtanVwaXRlcicpO1xuXG4gICAgdGhpcy5hZGRQbHVnaW4oYCR7TUFWRU5fQ09NUElMRVJfUExVR0lOfUAke3RoaXMucGlubmVkVmVyc2lvbihNQVZFTl9DT01QSUxFUl9QTFVHSU4pfWApO1xuICAgIHRoaXMuYWRkUGx1Z2luKGAke01BVkVOX1NVUkVGSVJFX1BMVUdJTn1AJHt0aGlzLnBpbm5lZFZlcnNpb24oTUFWRU5fU1VSRUZJUkVfUExVR0lOKX1gKTtcbiAgICAvLyBmYWlsc2FmZSBoYXMgbm8gZGVmYXVsdCBsaWZlY3ljbGUgYmluZGluZzsgYmluZCBpdCBzbyBgKklUYCB0ZXN0cyBydW5cbiAgICAvLyBpbiBgbXZuIHZlcmlmeWAuXG4gICAgdGhpcy5hZGRQbHVnaW4oYCR7TUFWRU5fRkFJTFNBRkVfUExVR0lOfUAke3RoaXMucGlubmVkVmVyc2lvbihNQVZFTl9GQUlMU0FGRV9QTFVHSU4pfWAsIHtcbiAgICAgIGV4ZWN1dGlvbnM6IFt7IGlkOiAnaW50ZWdyYXRpb24tdGVzdHMnLCBnb2FsczogWydpbnRlZ3JhdGlvbi10ZXN0JywgJ3ZlcmlmeSddIH1dLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkUGx1Z2luKGAke01BVkVOX0pBUl9QTFVHSU59QCR7dGhpcy5waW5uZWRWZXJzaW9uKE1BVkVOX0pBUl9QTFVHSU4pfWAsIHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgYXJjaGl2ZToge1xuICAgICAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgICAgICBhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzOiB0cnVlLFxuICAgICAgICAgICAgYWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKG9wdGlvbnMuZW5mb3JjZXIgPz8gdHJ1ZSkge1xuICAgICAgY29uc3QgbWluTWF2ZW4gPSBvcHRpb25zLm1pbk1hdmVuVmVyc2lvbiA/PyBERUZBVUxUX01JTl9NQVZFTl9WRVJTSU9OO1xuICAgICAgYXNzZXJ0RXhhY3RWZXJzaW9uKG1pbk1hdmVuLCAnbWluTWF2ZW5WZXJzaW9uJyk7XG4gICAgICB0aGlzLmFkZFBsdWdpbihgJHtNQVZFTl9FTkZPUkNFUl9QTFVHSU59QCR7dGhpcy5waW5uZWRWZXJzaW9uKE1BVkVOX0VORk9SQ0VSX1BMVUdJTil9YCwge1xuICAgICAgICBleGVjdXRpb25zOiBbeyBpZDogJ2VuZm9yY2UtdmVyc2lvbnMnLCBnb2FsczogWydlbmZvcmNlJ10gfV0sXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBydWxlczoge1xuICAgICAgICAgICAgcmVxdWlyZU1hdmVuVmVyc2lvbjogeyB2ZXJzaW9uOiBgWyR7bWluTWF2ZW59LClgIH0sXG4gICAgICAgICAgICByZXF1aXJlSmF2YVZlcnNpb246IHsgdmVyc2lvbjogdGhpcy5qYXZhTGluZS5lbmZvcmNlckphdmFSYW5nZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFNhbXBsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBwa2cgPSB0aGlzLmdyb3VwSWQucmVwbGFjZSgvW15BLVphLXowLTlfLl0vZywgJ18nKTtcbiAgICBjb25zdCBwYXRoID0gcGtnLnNwbGl0KCcuJyk7XG4gICAgbmV3IFNhbXBsZURpcih0aGlzLCBwb3NpeC5qb2luKCdzcmMvbWFpbi9qYXZhJywgLi4ucGF0aCksIHtcbiAgICAgIGZpbGVzOiB7XG4gICAgICAgICdNYWluLmphdmEnOiBbXG4gICAgICAgICAgYHBhY2thZ2UgJHtwa2d9O2AsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ3B1YmxpYyBjbGFzcyBNYWluIHsnLFxuICAgICAgICAgICcgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeycsXG4gICAgICAgICAgJyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiSGVsbG8sIHdvcmxkIVwiKTsnLFxuICAgICAgICAgICcgICAgfScsXG4gICAgICAgICAgJ30nLFxuICAgICAgICAgICcnLFxuICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBuZXcgU2FtcGxlRGlyKHRoaXMsIHBvc2l4LmpvaW4oJ3NyYy90ZXN0L2phdmEnLCAuLi5wYXRoKSwge1xuICAgICAgZmlsZXM6IHtcbiAgICAgICAgJ01haW5UZXN0LmphdmEnOiBbXG4gICAgICAgICAgYHBhY2thZ2UgJHtwa2d9O2AsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5hcGkuVGVzdDsnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICdjbGFzcyBNYWluVGVzdCB7JyxcbiAgICAgICAgICAnICAgIEBUZXN0JyxcbiAgICAgICAgICAnICAgIHZvaWQgcnVucygpIHsnLFxuICAgICAgICAgICcgICAgICAgIE1haW4ubWFpbihuZXcgU3RyaW5nWzBdKTsnLFxuICAgICAgICAgICcgICAgfScsXG4gICAgICAgICAgJ30nLFxuICAgICAgICAgICcnLFxuICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIGBwcm9qZW4gbmV3IC4uLiAtLWphdmEtdmVyc2lvbiAyMWAgKG9yIGAxLjhgLCBvciBgLS1taW4tbWF2ZW4tdmVyc2lvbiAzLjlgKVxuICogcmVhY2hlcyB0aGUgb3B0aW9ucyBhcyBhICpudW1iZXIqOiB5YXJncyBwYXJzZXMgbnVtZXJpYy1sb29raW5nIGZsYWdzLCBhbmRcbiAqIHByb2plbiBwYXNzZXMgc3RyaW5nLXR5cGVkIG9wdGlvbnMgdGhyb3VnaCB1bmNoYW5nZWQuIFRoZSBpbml0aWFsXG4gKiBgLnByb2plbnJjLnRzYCBpcyByZW5kZXJlZCBmcm9tIHRoZSBzYW1lIGFyZ3MsIHNvIGl0IHdvdWxkIHJlYWRcbiAqIGBqYXZhVmVyc2lvbjogMjFgIGFuZCBmYWlsIHRvIHR5cGUtY2hlY2suIE5vIEphdmEgb3B0aW9uIGlzIG51bWJlci10eXBlZCxcbiAqIHNvIGV2ZXJ5IG51bWVyaWMgYXJnIGlzIHR1cm5lZCBiYWNrIGludG8gdGhlIHN0cmluZyB0aGUgdXNlciB0eXBlZC4gVGhpc1xuICogcnVucyBiZWZvcmUgdGhlIFByb2plY3QgY29uc3RydWN0b3IsIHdoaWNoIGlzIHdoZXJlIHByb2plbiBjYXB0dXJlcyB0aGVcbiAqIGFyZ3MgaXQgcmVuZGVycy4gT3B0aW9ucyBmcm9tIGEgaGFuZC13cml0dGVuIHByb2plbnJjIGFyZSBuZXZlciBudW1iZXJzXG4gKiAodGhleSB0eXBlLWNoZWNrIGFzIHN0cmluZ3MpIGFuZCBhcmUgbGVmdCBhbG9uZS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5UHJvamVuTmV3QXJnczxUIGV4dGVuZHMgb2JqZWN0PihvcHRpb25zOiBUKTogVCB7XG4gIGNvbnN0IG1hcmtlciA9IChvcHRpb25zIGFzIGFueSkuX19uZXdfXztcbiAgaWYgKCFtYXJrZXI/LmFyZ3MpIHtcbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuICBmb3IgKGNvbnN0IHRhcmdldCBvZiBbb3B0aW9ucyBhcyBhbnksIG1hcmtlci5hcmdzXSkge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0YXJnZXQpKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTW9kdWxlRGlyKGRpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdW5peCA9IGRpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gIGlmICh1bml4LnN0YXJ0c1dpdGgoJy8nKSB8fCAvXltBLVphLXpdOi8udGVzdCh1bml4KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTW9kdWxlIGRpciBcIiR7ZGlyfVwiIG11c3QgYmUgcmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdC5gKTtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkID0gcG9zaXgubm9ybWFsaXplKHVuaXgpLnJlcGxhY2UoL1xcLyskLywgJycpO1xuICBpZiAobm9ybWFsaXplZCA9PT0gJy4nIHx8IG5vcm1hbGl6ZWQgPT09ICcnIHx8IG5vcm1hbGl6ZWQuc3BsaXQoJy8nKS5pbmNsdWRlcygnLi4nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTW9kdWxlIGRpciBcIiR7ZGlyfVwiIG11c3QgYmUgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIHJlcG8gcm9vdC5gKTtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cbiJdfQ==
@@ -1,9 +1,21 @@
1
- import { JavaMavenProject } from './java-maven-base';
2
- import { JavaServiceProjectOptions } from './options';
1
+ import { JavaSpringBootProject } from './java-spring-boot-project';
2
+ import { MavenModule } from './maven/maven-module';
3
+ import { JavaServiceProjectOptions, MavenModuleOptions } from './options';
3
4
  /**
4
- * Springboot service application. Publishes to Docker Hub (never Maven
5
- * Central); publish and deploy are both manual-dispatch, not on every merge.
5
+ * Spring Boot service application deployed as a container:
6
+ * `JavaSpringBootProject` plus Docker publishing (Docker Hub by default -
7
+ * never Maven Central), Flyway, and a CDK deploy hook. Publish and deploy
8
+ * are both manual-dispatch, not on every merge.
9
+ *
10
+ * Single-module only: the Docker build, Flyway migrations and deploy hook
11
+ * all assume one deployable at the repo root. For a multi-module Spring Boot
12
+ * repo use `JavaSpringBootProject`.
6
13
  */
7
- export declare class JavaServiceProject extends JavaMavenProject {
14
+ export declare class JavaServiceProject extends JavaSpringBootProject {
8
15
  constructor(options: JavaServiceProjectOptions);
16
+ /**
17
+ * Not supported: `JavaServiceProject` is single-module. Use
18
+ * `JavaSpringBootProject` for a multi-module Spring Boot repo.
19
+ */
20
+ addModule(_options: MavenModuleOptions): MavenModule;
9
21
  }
@@ -5,16 +5,22 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
5
  const cdk_deploy_hook_1 = require("./components/cdk-deploy-hook");
6
6
  const docker_publish_1 = require("./components/docker-publish");
7
7
  const flyway_migration_1 = require("./components/flyway-migration");
8
- const java_maven_base_1 = require("./java-maven-base");
8
+ const java_spring_boot_project_1 = require("./java-spring-boot-project");
9
9
  /**
10
- * Springboot service application. Publishes to Docker Hub (never Maven
11
- * Central); publish and deploy are both manual-dispatch, not on every merge.
10
+ * Spring Boot service application deployed as a container:
11
+ * `JavaSpringBootProject` plus Docker publishing (Docker Hub by default -
12
+ * never Maven Central), Flyway, and a CDK deploy hook. Publish and deploy
13
+ * are both manual-dispatch, not on every merge.
14
+ *
15
+ * Single-module only: the Docker build, Flyway migrations and deploy hook
16
+ * all assume one deployable at the repo root. For a multi-module Spring Boot
17
+ * repo use `JavaSpringBootProject`.
12
18
  */
13
- class JavaServiceProject extends java_maven_base_1.JavaMavenProject {
14
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.JavaServiceProject", version: "0.0.13" };
19
+ class JavaServiceProject extends java_spring_boot_project_1.JavaSpringBootProject {
20
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.JavaServiceProject", version: "0.0.14" };
15
21
  constructor(options) {
16
22
  super(options);
17
- this.pom.addDependency('org.springframework.boot/spring-boot-starter-web@^3');
23
+ this.addDependency('org.springframework.boot/spring-boot-starter-web');
18
24
  new docker_publish_1.DockerPublish(this, { dockerRegistry: options.dockerRegistry });
19
25
  if (options.useFlyway ?? true) {
20
26
  new flyway_migration_1.FlywayMigration(this);
@@ -25,6 +31,13 @@ class JavaServiceProject extends java_maven_base_1.JavaMavenProject {
25
31
  });
26
32
  }
27
33
  }
34
+ /**
35
+ * Not supported: `JavaServiceProject` is single-module. Use
36
+ * `JavaSpringBootProject` for a multi-module Spring Boot repo.
37
+ */
38
+ addModule(_options) {
39
+ throw new Error('JavaServiceProject is single-module (its Docker build, Flyway migrations and deploy hook assume one deployable at the repo root). Use JavaSpringBootProject for a multi-module Spring Boot repo.');
40
+ }
28
41
  }
29
42
  exports.JavaServiceProject = JavaServiceProject;
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YS1zZXJ2aWNlLXByb2plY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvamF2YS9qYXZhLXNlcnZpY2UtcHJvamVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsa0VBQTZEO0FBQzdELGdFQUE0RDtBQUM1RCxvRUFBZ0U7QUFDaEUsdURBQXFEO0FBR3JEOzs7R0FHRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsa0NBQWdCOztJQUN0RCxZQUFZLE9BQWtDO1FBQzVDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVmLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLHFEQUFxRCxDQUFDLENBQUM7UUFFOUUsSUFBSSw4QkFBYSxDQUFDLElBQUksRUFBRSxFQUFFLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUVwRSxJQUFJLE9BQU8sQ0FBQyxTQUFTLElBQUksSUFBSSxFQUFFLENBQUM7WUFDOUIsSUFBSSxrQ0FBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEMsSUFBSSwrQkFBYSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsWUFBWSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3hELFVBQVUsRUFBRSxPQUFPLENBQUMsbUJBQW1CO2FBQ3hDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDOztBQWpCSCxnREFrQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtEZXBsb3lIb29rIH0gZnJvbSAnLi9jb21wb25lbnRzL2Nkay1kZXBsb3ktaG9vayc7XG5pbXBvcnQgeyBEb2NrZXJQdWJsaXNoIH0gZnJvbSAnLi9jb21wb25lbnRzL2RvY2tlci1wdWJsaXNoJztcbmltcG9ydCB7IEZseXdheU1pZ3JhdGlvbiB9IGZyb20gJy4vY29tcG9uZW50cy9mbHl3YXktbWlncmF0aW9uJztcbmltcG9ydCB7IEphdmFNYXZlblByb2plY3QgfSBmcm9tICcuL2phdmEtbWF2ZW4tYmFzZSc7XG5pbXBvcnQgeyBKYXZhU2VydmljZVByb2plY3RPcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zJztcblxuLyoqXG4gKiBTcHJpbmdib290IHNlcnZpY2UgYXBwbGljYXRpb24uIFB1Ymxpc2hlcyB0byBEb2NrZXIgSHViIChuZXZlciBNYXZlblxuICogQ2VudHJhbCk7IHB1Ymxpc2ggYW5kIGRlcGxveSBhcmUgYm90aCBtYW51YWwtZGlzcGF0Y2gsIG5vdCBvbiBldmVyeSBtZXJnZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEphdmFTZXJ2aWNlUHJvamVjdCBleHRlbmRzIEphdmFNYXZlblByb2plY3Qge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBKYXZhU2VydmljZVByb2plY3RPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICB0aGlzLnBvbS5hZGREZXBlbmRlbmN5KCdvcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3Qvc3ByaW5nLWJvb3Qtc3RhcnRlci13ZWJAXjMnKTtcblxuICAgIG5ldyBEb2NrZXJQdWJsaXNoKHRoaXMsIHsgZG9ja2VyUmVnaXN0cnk6IG9wdGlvbnMuZG9ja2VyUmVnaXN0cnkgfSk7XG5cbiAgICBpZiAob3B0aW9ucy51c2VGbHl3YXkgPz8gdHJ1ZSkge1xuICAgICAgbmV3IEZseXdheU1pZ3JhdGlvbih0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5jZGtEZXBsb3lIb29rID8/IHRydWUpIHtcbiAgICAgIG5ldyBDZGtEZXBsb3lIb29rKHRoaXMsIG9wdGlvbnMuZW52aXJvbm1lbnRzID8/IFsncHJvZCddLCB7XG4gICAgICAgIHRhcmdldFJlcG86IG9wdGlvbnMuY2RrRGVwbG95VGFyZ2V0UmVwbyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YS1zZXJ2aWNlLXByb2plY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvamF2YS9qYXZhLXNlcnZpY2UtcHJvamVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsa0VBQTZEO0FBQzdELGdFQUE0RDtBQUM1RCxvRUFBZ0U7QUFDaEUseUVBQW1FO0FBSW5FOzs7Ozs7Ozs7R0FTRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsZ0RBQXFCOztJQUMzRCxZQUFZLE9BQWtDO1FBQzVDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVmLElBQUksQ0FBQyxhQUFhLENBQUMsa0RBQWtELENBQUMsQ0FBQztRQUV2RSxJQUFJLDhCQUFhLENBQUMsSUFBSSxFQUFFLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBRXBFLElBQUksT0FBTyxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM5QixJQUFJLGtDQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLGFBQWEsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsQyxJQUFJLCtCQUFhLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxZQUFZLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDeEQsVUFBVSxFQUFFLE9BQU8sQ0FBQyxtQkFBbUI7YUFDeEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSxTQUFTLENBQUMsUUFBNEI7UUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FDYixrTUFBa00sQ0FDbk0sQ0FBQztJQUNKLENBQUM7O0FBM0JILGdEQTRCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka0RlcGxveUhvb2sgfSBmcm9tICcuL2NvbXBvbmVudHMvY2RrLWRlcGxveS1ob29rJztcbmltcG9ydCB7IERvY2tlclB1Ymxpc2ggfSBmcm9tICcuL2NvbXBvbmVudHMvZG9ja2VyLXB1Ymxpc2gnO1xuaW1wb3J0IHsgRmx5d2F5TWlncmF0aW9uIH0gZnJvbSAnLi9jb21wb25lbnRzL2ZseXdheS1taWdyYXRpb24nO1xuaW1wb3J0IHsgSmF2YVNwcmluZ0Jvb3RQcm9qZWN0IH0gZnJvbSAnLi9qYXZhLXNwcmluZy1ib290LXByb2plY3QnO1xuaW1wb3J0IHsgTWF2ZW5Nb2R1bGUgfSBmcm9tICcuL21hdmVuL21hdmVuLW1vZHVsZSc7XG5pbXBvcnQgeyBKYXZhU2VydmljZVByb2plY3RPcHRpb25zLCBNYXZlbk1vZHVsZU9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMnO1xuXG4vKipcbiAqIFNwcmluZyBCb290IHNlcnZpY2UgYXBwbGljYXRpb24gZGVwbG95ZWQgYXMgYSBjb250YWluZXI6XG4gKiBgSmF2YVNwcmluZ0Jvb3RQcm9qZWN0YCBwbHVzIERvY2tlciBwdWJsaXNoaW5nIChEb2NrZXIgSHViIGJ5IGRlZmF1bHQgLVxuICogbmV2ZXIgTWF2ZW4gQ2VudHJhbCksIEZseXdheSwgYW5kIGEgQ0RLIGRlcGxveSBob29rLiBQdWJsaXNoIGFuZCBkZXBsb3lcbiAqIGFyZSBib3RoIG1hbnVhbC1kaXNwYXRjaCwgbm90IG9uIGV2ZXJ5IG1lcmdlLlxuICpcbiAqIFNpbmdsZS1tb2R1bGUgb25seTogdGhlIERvY2tlciBidWlsZCwgRmx5d2F5IG1pZ3JhdGlvbnMgYW5kIGRlcGxveSBob29rXG4gKiBhbGwgYXNzdW1lIG9uZSBkZXBsb3lhYmxlIGF0IHRoZSByZXBvIHJvb3QuIEZvciBhIG11bHRpLW1vZHVsZSBTcHJpbmcgQm9vdFxuICogcmVwbyB1c2UgYEphdmFTcHJpbmdCb290UHJvamVjdGAuXG4gKi9cbmV4cG9ydCBjbGFzcyBKYXZhU2VydmljZVByb2plY3QgZXh0ZW5kcyBKYXZhU3ByaW5nQm9vdFByb2plY3Qge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBKYXZhU2VydmljZVByb2plY3RPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICB0aGlzLmFkZERlcGVuZGVuY3koJ29yZy5zcHJpbmdmcmFtZXdvcmsuYm9vdC9zcHJpbmctYm9vdC1zdGFydGVyLXdlYicpO1xuXG4gICAgbmV3IERvY2tlclB1Ymxpc2godGhpcywgeyBkb2NrZXJSZWdpc3RyeTogb3B0aW9ucy5kb2NrZXJSZWdpc3RyeSB9KTtcblxuICAgIGlmIChvcHRpb25zLnVzZUZseXdheSA/PyB0cnVlKSB7XG4gICAgICBuZXcgRmx5d2F5TWlncmF0aW9uKHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmNka0RlcGxveUhvb2sgPz8gdHJ1ZSkge1xuICAgICAgbmV3IENka0RlcGxveUhvb2sodGhpcywgb3B0aW9ucy5lbnZpcm9ubWVudHMgPz8gWydwcm9kJ10sIHtcbiAgICAgICAgdGFyZ2V0UmVwbzogb3B0aW9ucy5jZGtEZXBsb3lUYXJnZXRSZXBvLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vdCBzdXBwb3J0ZWQ6IGBKYXZhU2VydmljZVByb2plY3RgIGlzIHNpbmdsZS1tb2R1bGUuIFVzZVxuICAgKiBgSmF2YVNwcmluZ0Jvb3RQcm9qZWN0YCBmb3IgYSBtdWx0aS1tb2R1bGUgU3ByaW5nIEJvb3QgcmVwby5cbiAgICovXG4gIHB1YmxpYyBhZGRNb2R1bGUoX29wdGlvbnM6IE1hdmVuTW9kdWxlT3B0aW9ucyk6IE1hdmVuTW9kdWxlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnSmF2YVNlcnZpY2VQcm9qZWN0IGlzIHNpbmdsZS1tb2R1bGUgKGl0cyBEb2NrZXIgYnVpbGQsIEZseXdheSBtaWdyYXRpb25zIGFuZCBkZXBsb3kgaG9vayBhc3N1bWUgb25lIGRlcGxveWFibGUgYXQgdGhlIHJlcG8gcm9vdCkuIFVzZSBKYXZhU3ByaW5nQm9vdFByb2plY3QgZm9yIGEgbXVsdGktbW9kdWxlIFNwcmluZyBCb290IHJlcG8uJyxcbiAgICApO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,30 @@
1
+ import { JavaMavenProject } from './java-maven-base';
2
+ import { MavenModule } from './maven/maven-module';
3
+ import { JavaSpringBootProjectOptions, MavenModuleOptions } from './options';
4
+ /**
5
+ * Spring Boot on Maven, single- or multi-module, with no Docker, Flyway or
6
+ * CDK - `JavaMavenProject` plus Spring Boot dependency management.
7
+ *
8
+ * - `spring-boot-dependencies` is imported as the first BOM, so starters and
9
+ * the libraries Boot manages (JUnit included) are added versionless.
10
+ * - `spring-boot-maven-plugin` is versioned in `<pluginManagement>`. A
11
+ * single-module project repackages its root jar into an executable one.
12
+ * In a multi-module project only modules added with
13
+ * `addSpringBootModule()` are repackaged; `addModule()` modules stay plain
14
+ * jars (shared libraries, clients, ...).
15
+ *
16
+ * `JavaServiceProject` builds on this and adds Docker publishing, Flyway,
17
+ * and a CDK deploy hook.
18
+ */
19
+ export declare class JavaSpringBootProject extends JavaMavenProject {
20
+ /** The Spring Boot version (BOM and Maven plugin). */
21
+ readonly springBootVersion: string;
22
+ constructor(options: JavaSpringBootProjectOptions);
23
+ /**
24
+ * Adds a module that is a Spring Boot application: like `addModule()`, plus
25
+ * `spring-boot-maven-plugin`'s `repackage`, which turns the module's jar
26
+ * into an executable one.
27
+ */
28
+ addSpringBootModule(options: MavenModuleOptions): MavenModule;
29
+ preSynthesize(): void;
30
+ }