@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
package/README.md CHANGED
@@ -10,12 +10,26 @@ Instead of hand-maintaining `pom.xml`, `cdk.json`, and GitHub workflows, you dec
10
10
  | --- | --- | --- | --- |
11
11
  | `CdkInfraProject` | Pure-infrastructure CDK stacks (CloudFront, Route53, SQS, API Gateway, Cognito, ECR/ECS for externally-built images) | - | `build` (PR checks), `deploy` (manual dispatch) |
12
12
  | `CdkAppProject` | Full TypeScript service behind API Gateway: infra + app source + database | - | `build`, `deploy`, `app-build` (PR checks) |
13
- | `JavaLibraryProject` | Reusable Java library | Maven Central | `build`, `upgrade` (nightly), `publish-maven-central`, `codeindex` |
14
- | `JavaServiceProject` | Spring Boot service | Docker Hub | `build`, `upgrade` (nightly), `publish-docker`, `deploy-cdk` |
15
- | `JavaAppProject` | GUI/TUI/CLI Java application | GitHub Packages | `build`, `upgrade` (nightly), `publish-ghpackages` |
13
+ | `JavaMavenProject` | Plain Maven project, single- or multi-module, no framework | - | `build`, `upgrade` (nightly report) |
14
+ | `JavaLibraryProject` | Reusable Java library | Maven Central | `build`, `upgrade` (nightly report), `publish-maven-central`, `codeindex` |
15
+ | `JavaAppProject` | GUI/TUI/CLI Java application | GitHub Packages | `build`, `upgrade` (nightly report), `publish-ghpackages` |
16
+ | `JavaSpringBootProject` | Spring Boot on Maven, single- or multi-module, **no Docker** | - | `build`, `upgrade` (nightly report) |
17
+ | `JavaServiceProject` | Spring Boot service deployed as a container | Docker Hub | `build`, `upgrade` (nightly report), `publish-docker`, `deploy-cdk` |
16
18
  | `GitHubActionProject` | Reusable GitHub Action or Workflow | GitHub Releases | `build`, `test-dogfood`, `sonar`, `release` |
17
19
 
18
- Two foundation classes are also exported for advanced use: `CdkTypescriptProject` (shared CDK + TypeScript base for the CDK types) and `JavaMavenProject` (shared Maven base for the Java types).
20
+ The Java types are layered, so pick the lowest layer that does what you need:
21
+
22
+ ```text
23
+ JavaMavenProject java_maven Maven only; single- or multi-module; any supported Java line
24
+ ├── JavaLibraryProject java_library + Maven Central publish, source/javadoc jars, code index
25
+ ├── JavaAppProject java_app + GitHub Packages publish
26
+ └── JavaSpringBootProject java_spring_boot + Spring Boot BOM and executable-jar repackaging; no Docker/Flyway/CDK
27
+ └── JavaServiceProject java_service + Docker publish, Flyway, CDK deploy hook (single-module)
28
+ ```
29
+
30
+ Every Java type targets a configurable Java line (`javaVersion`: `1.8`, `17`, `21` or `25`; see [Java version support](#java-version-support)), and every one except `JavaServiceProject` can be a multi-module Maven reactor (see [JavaMavenProject](#javamavenproject)).
31
+
32
+ One foundation class is also exported for advanced use: `CdkTypescriptProject` (shared CDK + TypeScript base for the CDK types).
19
33
 
20
34
  All project types:
21
35
 
@@ -35,12 +49,34 @@ npx projen new --from @xpertss/projen-types cdk_infra --name my-project
35
49
 
36
50
  That writes a starter `.projenrc.ts`, synthesizes the whole scaffold and
37
51
  installs dependencies. The type names `projen new` accepts are `cdk_infra`,
38
- `cdk_app`, `java_library`, `java_service`, `java_app` and
39
- `git_hub_action`; pass a bogus one to have it list them. Required options
40
- become flags: `--name` for every type, plus `--group-id`/`--artifact-id`
41
- (Java) and `--sonar-host-url` (`git_hub_action`). Any other plainly-typed
42
- option can be passed the same way - `--cdk-deploy-target-repo owner/repo`,
43
- `--docker-registry ghcr.io`, `--no-use-flyway`, and so on.
52
+ `cdk_app`, `java_maven`, `java_library`, `java_app`, `java_spring_boot`,
53
+ `java_service` and `git_hub_action`; pass a bogus one to have it list them.
54
+ Required options become flags: `--name` for every type, plus
55
+ `--group-id`/`--artifact-id` (Java) and `--sonar-host-url`
56
+ (`git_hub_action`). Any other plainly-typed option can be passed the same
57
+ way - `--java-version 1.8`, `--cdk-deploy-target-repo owner/repo`,
58
+ `--docker-registry ghcr.io`, `--no-use-flyway`, and so on. Modules can't be
59
+ passed on the command line; add them to `.projenrc.ts` afterwards (see
60
+ [JavaMavenProject](#javamavenproject)).
61
+
62
+ **Adding projen to a repo that already has content.** `projen new` runs
63
+ `git init` and commits the scaffold by default. In a repo with existing work,
64
+ pass `--no-git` so it writes the files and leaves committing to you:
65
+
66
+ ```bash
67
+ cd existing-repo
68
+ npx projen new --from @xpertss/projen-types java_spring_boot --name obeya --group-id org.xpertss.obeya --artifact-id obeya-parent --no-git
69
+ ```
70
+
71
+ **Commit a lockfile.** The generated `build.yml` and drift check install the
72
+ toolchain with `npm ci`, which needs a committed `package-lock.json`, and
73
+ `projen new` doesn't always leave one behind. Run `npm install` once and
74
+ commit `package-lock.json` along with the scaffold. Without it those
75
+ workflows fail with an `::error::` that says exactly this. For the Java
76
+ types, `package.json` is generated, and it pins `projen` and
77
+ `@xpertss/projen-types` to **exact** versions (no `^`), so every machine and
78
+ CI run uses the same generator. A floating range would make the drift check
79
+ report the differences between generator versions as drift.
44
80
 
45
81
  Commit the result. From then on, every change to the scaffold goes through
46
82
  `.projenrc.ts` followed by `npx projen`:
@@ -59,7 +95,9 @@ deploy workflow; leaving `dogfood` out (or a service's
59
95
  fails and tells you what to add - a gate this package considers load-bearing
60
96
  is allowed to be missing loudly, never silently.
61
97
 
62
- The `name` option must match the `name` field in the project's `package.json` (for the CDK types) or the project name used by projen's `java.JavaProject` (for the Java types).
98
+ The `name` option must match the `name` field in the project's `package.json` (for the CDK types). For the Java types it becomes the root pom's `<name>` and the generated `package.json` name.
99
+
100
+ > **Never write projen's generated-file marker text literally in `.projenrc.ts`.** projen deletes, as an orphaned generated file, any file containing the marker line (`~~ Generated by projen. To modify, ...`), and that includes `.projenrc.ts` itself. When you generate a file yourself (for example with `TextFile`), insert the marker through the file's `marker` property: ``file.addLine(`# ${file.marker}`)``.
63
101
 
64
102
  ## Updating an existing project when this package changes
65
103
 
@@ -147,6 +185,90 @@ Everything from `CdkInfraProject`, plus:
147
185
  - `src/constructs/database.ts` - a `Database` construct stub for the chosen engine (`postgres`/`mysql` -> RDS, `dynamodb` -> DynamoDB). `migrationTool` (no default, intentionally) is added as a dev dependency and referenced in the stub - wiring it up is left to you.
148
186
  - `.github/workflows/app-build.yml` - runs the project's test task on every PR, then checks for projen drift.
149
187
 
188
+ ### JavaMavenProject
189
+
190
+ A plain Maven build with no framework and no publish target. It's the base of every other Java type, and it's usable on its own. It's single-module until you add a module, then it's a multi-module reactor.
191
+
192
+ Scaffold it with the `java_maven` type:
193
+
194
+ ```bash
195
+ npx projen new --from @xpertss/projen-types java_maven --name legacy-tools --group-id org.xpertss --artifact-id legacy-tools --java-version 1.8
196
+ ```
197
+
198
+ **Single module:**
199
+
200
+ ```typescript
201
+ // .projenrc.ts
202
+ import { JavaMavenProject } from '@xpertss/projen-types';
203
+
204
+ const project = new JavaMavenProject({
205
+ name: 'legacy-tools',
206
+ groupId: 'org.xpertss',
207
+ artifactId: 'legacy-tools',
208
+ javaVersion: '1.8',
209
+ });
210
+
211
+ project.addDependency('commons-io/commons-io@2.20.0'); // exact version
212
+ project.addTestDependency('org.assertj/assertj-core@3.27.3');
213
+
214
+ project.synth();
215
+ ```
216
+
217
+ **Multi-module:** each `addModule()` call adds a module directory with its own generated `pom.xml`. The root pom becomes the `pom`-packaged reactor parent. Everything stays one projen project, with one `.projen/`, one `.gitignore` and one `tasks.json`.
218
+
219
+ ```typescript
220
+ // .projenrc.ts
221
+ import { JavaMavenProject } from '@xpertss/projen-types';
222
+
223
+ const project = new JavaMavenProject({
224
+ name: 'toolkit',
225
+ groupId: 'org.xpertss.toolkit',
226
+ artifactId: 'toolkit-parent',
227
+ version: '0.1.0-SNAPSHOT',
228
+ javaVersion: '17',
229
+ });
230
+
231
+ const model = project.addModule({ dir: 'toolkit-model', artifactId: 'toolkit-model', description: 'Domain model' });
232
+ const stub = project.addModule({ dir: 'tools/stub-model', artifactId: 'toolkit-stub-model' }); // nested dirs are fine
233
+ const cli = project.addModule({ dir: 'toolkit-cli', artifactId: 'toolkit-cli' });
234
+
235
+ stub.addModuleDependency(model); // sibling module: versionless
236
+ cli.addModuleDependency(model);
237
+ cli.addDependency('info.picocli/picocli@4.7.7'); // pinned: the version moves to the parent
238
+ cli.addDependency('org.yaml/snakeyaml'); // versionless: managed below
239
+ project.addManagedDependency('org.yaml/snakeyaml@2.4');
240
+ project.addBom('org.testcontainers/testcontainers-bom@1.21.3');
241
+
242
+ project.synth();
243
+ ```
244
+
245
+ What the reactor looks like:
246
+
247
+ - **Root `pom.xml`:**
248
+ - `<packaging>pom</packaging>`, with `<modules>` in `addModule` order.
249
+ - `<dependencyManagement>` holds the BOM imports first (`type=pom`, `scope=import`), then every module at `${project.version}`, then every pinned version.
250
+ - `<pluginManagement>` holds the plugin versions, and versionless `<plugins>` are inherited by every module: compiler, surefire, failsafe, jar, and enforcer.
251
+ - `junit-jupiter` is a test dependency every module inherits. Its version comes from `junit-bom`, or from the Spring Boot BOM in the Spring Boot types.
252
+ - **Module `pom.xml`:** `<parent>` with the right `relativePath` (`tools/stub-model` → `../../pom.xml`), then `artifactId`, `name`, `description`, and versionless `<dependencies>`. Nothing else, unless the module adds plugins.
253
+ - A version given to `module.addDependency`/`addTestDependency`/`addPlugin` is moved into the parent's `<dependencyManagement>`/`<pluginManagement>`, so every module that uses an artifact gets the same version. Pinning one artifact at two different versions fails the synth.
254
+ - The synth fails with a clear message on:
255
+ - two modules with the same `artifactId`
256
+ - two modules with the same `dir`, or one `dir` nested inside another
257
+ - a `dir` outside the repo
258
+ - a module depending on itself
259
+ - `packaging` set to anything but `pom` on a project with modules
260
+
261
+ You get:
262
+
263
+ - the root `pom.xml` (and one per module), written by this package:
264
+ - **exact versions only**: a range such as `^1`, `~1.2` or `[1,2)` fails the synth
265
+ - the compiler level, enforcer rule and JUnit line all follow `javaVersion`
266
+ - one Maven run per build. `npx projen build` synthesizes, then runs `mvn -B verify`: compile, unit tests (surefire), package, and `*IT` integration tests (failsafe). There is no `mvn deploy` and no `dist/`.
267
+ - `.github/workflows/build.yml`: a PR build that installs the pinned Node toolchain (`npm ci`) and the project's JDK (`actions/setup-java`, Maven cache), then runs `npx projen build`, plus a SonarQube step when `sonarProjectKey` is set. See [Adding CI jobs](#adding-ci-jobs-to-a-java-project).
268
+ - `.github/workflows/upgrade.yml`: a nightly (03:00 UTC) **report** of available dependency and plugin updates in the job summary. It changes nothing, because every version comes from `.projenrc.ts`; apply an update there. Turn it off with `upgradeWorkflow: false`. The same report runs locally with `npx projen upgrade`.
269
+ - the projen drift check, `LICENSE` (MIT by default), `.editorconfig`, and a generated `package.json` that pins the projen toolchain exactly.
270
+ - no sample code, unless `sample: true` on a single-module project.
271
+
150
272
  ### JavaLibraryProject
151
273
 
152
274
  A reusable Java library published to Maven Central.
@@ -173,17 +295,64 @@ const project = new JavaLibraryProject({
173
295
  project.synth();
174
296
  ```
175
297
 
176
- You get:
298
+ You get everything from [`JavaMavenProject`](#javamavenproject), so modules work here too, plus:
177
299
 
178
- - `pom.xml` (via projen's `java.JavaProject`) with the given GAV coordinates.
179
- - `.github/workflows/build.yml` - PR build + projen drift check, plus a SonarQube scan step when `sonarProjectKey` is set (needs a `SONAR_TOKEN` secret).
180
- - `.github/workflows/upgrade.yml` - nightly (03:00 UTC) PR running `mvn versions:use-latest-releases versions:update-properties`.
300
+ - `maven-source-plugin` and `maven-javadoc-plugin`, attaching the `-sources`/`-javadoc` jars Maven Central requires. In a multi-module library every module attaches them.
181
301
  - `.github/workflows/publish-maven-central.yml` - manual dispatch running `mvn -B deploy -P release`. With `mavenCentralOidc: true` it uses Maven Central's OIDC trusted publishing (no GPG secrets needed); otherwise it expects the secrets `MAVEN_GPG_PRIVATE_KEY`, `MAVEN_GPG_PASSPHRASE`, `MAVEN_CENTRAL_USERNAME`, `MAVEN_CENTRAL_PASSWORD`.
182
- - `.github/workflows/codeindex.yml` - on push to `main`, generates a Java source index under `.cai/` (disable with `publishCodeIndex: false`).
302
+ - `.github/workflows/codeindex.yml` - on push to `main`, generates a Java source index under `.cai/` covering every module (disable with `publishCodeIndex: false`).
303
+
304
+ ### JavaSpringBootProject
305
+
306
+ Spring Boot on Maven, single- or multi-module, **without** Docker, Flyway or a deploy hook. It's [`JavaMavenProject`](#javamavenproject) plus Spring Boot dependency management. Use it for a Spring Boot repo that ships something other than this package's container image, such as a multi-module control plane, or for a Boot app you deploy your own way.
307
+
308
+ Scaffold it with the `java_spring_boot` type:
309
+
310
+ ```bash
311
+ npx projen new --from @xpertss/projen-types java_spring_boot --name obeya --group-id org.xpertss.obeya --artifact-id obeya-parent
312
+ ```
313
+
314
+ ```typescript
315
+ // .projenrc.ts
316
+ import { JavaSpringBootProject } from '@xpertss/projen-types';
317
+
318
+ const project = new JavaSpringBootProject({
319
+ name: 'obeya',
320
+ groupId: 'org.xpertss.obeya',
321
+ artifactId: 'obeya-parent',
322
+ version: '0.1.0-SNAPSHOT',
323
+ javaVersion: '21',
324
+ copyrightOwner: 'Xpert Software',
325
+ });
326
+
327
+ // plain jar modules: shared libraries, clients, tools
328
+ const model = project.addModule({ dir: 'obeya-model', artifactId: 'obeya-model' });
329
+ const client = project.addModule({ dir: 'obeya-api-client', artifactId: 'obeya-api-client' });
330
+ client.addModuleDependency(model);
331
+
332
+ // a Spring Boot application module, repackaged into an executable jar
333
+ const server = project.addSpringBootModule({ dir: 'obeya-server', artifactId: 'obeya-server' });
334
+ server.addModuleDependency(model);
335
+ server.addDependency('org.springframework.boot/spring-boot-starter-web'); // versionless: Boot's BOM manages it
336
+ server.addTestDependency('org.springframework.boot/spring-boot-starter-test');
337
+
338
+ project.addBom('org.testcontainers/testcontainers-bom@1.21.3');
339
+
340
+ project.synth();
341
+ ```
342
+
343
+ You get everything from [`JavaMavenProject`](#javamavenproject), plus:
344
+
345
+ - `spring-boot-dependencies` imported as the **first** BOM, so starters and every library Boot manages (JUnit included) are added without a version. `springBootVersion` sets it; the default is the newest release of the line that supports `javaVersion` (see [Java version support](#java-version-support)).
346
+ - `spring-boot-maven-plugin`, versioned in `<pluginManagement>`:
347
+ - In a **single-module** project the root jar is repackaged into an executable jar.
348
+ - In a **multi-module** project only modules added with `addSpringBootModule()` are repackaged; `addModule()` modules stay plain jars.
349
+ - A repackaged module needs its `@SpringBootApplication` class before `mvn verify` passes, because `repackage` fails with `Unable to find main class` until one exists. Add a module as a plain `addModule()` while it's still empty.
350
+ - failsafe configured to run integration tests against the compiled classes rather than the repackaged jar (as `spring-boot-starter-parent` does).
351
+ - no starters, no Docker, no Flyway, no CDK. Add the starters you need with `addDependency`.
183
352
 
184
353
  ### JavaServiceProject
185
354
 
186
- A Spring Boot service that publishes a Docker image and can trigger deploys in a companion CDK repo.
355
+ A Spring Boot service that publishes a Docker image and can trigger deploys in a companion CDK repo. It is [`JavaSpringBootProject`](#javaspringbootproject) plus Docker, Flyway and a deploy hook. It is **single-module**, because the Docker build, the migrations and the deploy hook all assume one deployable at the repo root; `addModule()` fails and points you to `JavaSpringBootProject`.
187
356
 
188
357
  Scaffold it with the `java_service` type:
189
358
 
@@ -207,11 +376,11 @@ const project = new JavaServiceProject({
207
376
  project.synth();
208
377
  ```
209
378
 
210
- You get (everything from `JavaMavenProject` - `pom.xml`, `build` + drift check, nightly `upgrade` - plus):
379
+ You get everything from [`JavaSpringBootProject`](#javaspringbootproject) (and so from `JavaMavenProject`), plus:
211
380
 
212
- - `spring-boot-starter-web` added to the pom.
381
+ - `spring-boot-starter-web` added to the pom (versionless; Boot's BOM manages it).
213
382
  - `.github/workflows/publish-docker.yml` - manual dispatch: `mvn -B package && docker build -t <registry>/<name>:<sha>`, logged in with the `DOCKER_USERNAME` / `DOCKER_PASSWORD` secrets. `dockerRegistry` defaults to `docker.io`.
214
- - Flyway wiring when `useFlyway` (default `true`): `flyway-maven-plugin` ^10 + `flyway-core` ^10 in the pom, and `src/main/resources/db/migration/V1__init.sql`.
383
+ - Flyway wiring when `useFlyway` (default `true`): `flyway-core` (versionless, so it matches what Boot's Flyway auto-configuration expects), `flyway-maven-plugin` pinned for the Java line, and `src/main/resources/db/migration/V1__init.sql`.
215
384
  - `.github/workflows/deploy-cdk.yml` (the `CdkDeployHook`, generated by default) - manual dispatch with an environment selector; each job sends a `workflow_dispatch` to `deploy.yml` in the companion `cdkDeployTargetRepo` (a `CdkInfraProject`/`CdkAppProject` repo). With no `cdkDeployTargetRepo` set, the workflow is still generated but each job's only step fails with instructions - it is dispatch-only, so that lands on whoever tries to deploy rather than on every PR. Turn the workflow off entirely with `cdkDeployHook: false`. `environments` defaults to `['prod']`.
216
385
 
217
386
  ### JavaAppProject
@@ -238,7 +407,7 @@ const project = new JavaAppProject({
238
407
  project.synth();
239
408
  ```
240
409
 
241
- You get everything from `JavaMavenProject`, plus `.github/workflows/publish-ghpackages.yml` - manual dispatch running `mvn -B deploy -DaltDeploymentRepository=github::<registry>`, authenticated with `GITHUB_TOKEN`. `ghPackagesRegistry` defaults to `https://maven.pkg.github.com/<repo>` derived from the repository URL.
410
+ You get everything from [`JavaMavenProject`](#javamavenproject) (modules included), plus `.github/workflows/publish-ghpackages.yml` - manual dispatch running `mvn -B deploy -DaltDeploymentRepository=github::<registry>`, authenticated with `GITHUB_TOKEN`. `ghPackagesRegistry` defaults to `https://maven.pkg.github.com/<repo>` derived from the repository URL.
242
411
 
243
412
  ### GitHubActionProject
244
413
 
@@ -312,6 +481,60 @@ You get:
312
481
 
313
482
  Needs the same two secrets as everything else in this package: `PROJEN_GITHUB_TOKEN` (used for automated PR comments) and `SONAR_TOKEN` (the Sonar scan). Onboard a brand-new action repo following [Getting started](#getting-started), write the `.projenrc.ts` above, then hand-write `action.yml`/`auto-commit.sh`/`test/fixtures/`.
314
483
 
484
+ ## Java version support
485
+
486
+ `javaVersion` picks the Java line a Java project targets. It defaults to `21`; the supported lines are `1.8` (alias `8`), `17`, `21` and `25`, and any other value fails the synth with that list. **Nothing in the generated build is hard-coded to one Java line.** Everything that depends on it comes from one table in this package, grouped by line:
487
+
488
+ | | `1.8` | `17` | `21` | `25` |
489
+ | --- | --- | --- | --- | --- |
490
+ | Compiler level | `maven.compiler.source`/`target` = `1.8` (javac 8 has no `--release`) | `maven.compiler.release` = `17` | `release` = `21` | `release` = `25` |
491
+ | Enforcer `requireJavaVersion` | `[1.8,)` | `[17,)` | `[21,)` | `[25,)` |
492
+ | JUnit (`junit-bom`) | 5.14.4 (JUnit 6 needs Java 17) | 6.1.3 | 6.1.3 | 6.1.3 |
493
+ | Default Spring Boot (`JavaSpringBootProject`) | 2.7.18 (Boot 3+ needs Java 17; a 3.x+ `springBootVersion` fails the synth) | 4.1.1 | 4.1.1 | 4.1.1 |
494
+ | `flyway-maven-plugin` (`JavaServiceProject`) | 9.22.3 | 13.9.0 | 13.9.0 | 13.9.0 |
495
+ | CI JDK (`actions/setup-java` `java-version`) | `8` | `17` | `21` | `25` |
496
+
497
+ Maven plugins (the same on every line, because all of them run on JDK 8): `maven-compiler-plugin` 3.16.0, `maven-surefire-plugin`/`maven-failsafe-plugin` 3.6.0, `maven-jar-plugin` 3.5.1, `maven-enforcer-plugin` 3.6.3, `maven-source-plugin` 3.4.0 and `maven-javadoc-plugin` 3.12.0 (library only), `versions-maven-plugin` 2.22.0 (the `upgrade` report).
498
+
499
+ **The enforcer.** `maven-enforcer-plugin` fails the build at the start when the JDK or Maven running it is older than the project needs. Without it you get confusing compiler errors later, or a jar built for the wrong runtime. Its Java rule always follows `javaVersion`. The Maven rule defaults to `[3.9,)`; change it with `minMavenVersion`, or drop the plugin entirely with `enforcer: false`. CI installs the matching JDK through `setup-java`, so the rule only fires on a developer machine with the wrong JDK. A Java 1.8 project builds on any newer JDK (the rule is a minimum), but the JDK 8 runtime API is guaranteed only when you build on JDK 8.
500
+
501
+ **Overriding a version.** `pluginVersions` replaces any default in the table, keyed by `groupId/artifactId`, with an exact version:
502
+
503
+ ```typescript
504
+ new JavaMavenProject({
505
+ name: 'svc',
506
+ groupId: 'org.xpertss',
507
+ artifactId: 'svc',
508
+ pluginVersions: {
509
+ 'org.apache.maven.plugins/maven-surefire-plugin': '3.5.6',
510
+ 'org.junit/junit-bom': '5.14.4',
511
+ },
512
+ });
513
+ ```
514
+
515
+ `project.pinnedVersion('org.apache.maven.plugins/maven-surefire-plugin')` returns the version in effect, for reuse in your own plugin config.
516
+
517
+ **New Java lines** are one new row in this package's version table and a release. Until a line is listed, `javaVersion` rejects it rather than guessing.
518
+
519
+ ## Adding CI jobs to a Java project
520
+
521
+ `build.yml` is exposed as `project.buildVerifyWorkflow`, so jobs are added through projen's `addJob` rather than `addOverride`. `project.ciSetupSteps` holds the steps every Maven job here needs: pinned Node, `npm ci`, and the project's JDK with a Maven cache. Every job in `build.yml` can then be made a required check on `main`.
522
+
523
+ ```typescript
524
+ import { github } from 'projen';
525
+
526
+ project.buildVerifyWorkflow.addJob('integration', {
527
+ name: 'Container integration tests',
528
+ runsOn: ['self-hosted', 'linux', 'fedora', 'podman'],
529
+ permissions: { contents: github.workflows.JobPermission.READ },
530
+ steps: [
531
+ { name: 'Checkout', uses: 'actions/checkout@v7' },
532
+ ...project.ciSetupSteps,
533
+ { name: 'Integration tests', run: 'mvn -B verify -Pcontainer-its' },
534
+ ],
535
+ });
536
+ ```
537
+
315
538
  ## Common options
316
539
 
317
540
  CDK project types (`CdkInfraProjectOptions` / `CdkAppProjectOptions`):
@@ -328,16 +551,30 @@ CDK project types (`CdkInfraProjectOptions` / `CdkAppProjectOptions`):
328
551
  | `database` | - (app only) | `DatabaseOptions` - `engine` (`postgres`/`mysql`/`dynamodb`, default `postgres`), `migrationTool` |
329
552
  | `appEntryPoint` | `src/app.ts` (app only) | Path of the generated application entrypoint |
330
553
 
331
- Java project types (`JavaLibraryProjectOptions` / `JavaServiceProjectOptions` / `JavaAppProjectOptions`):
554
+ Java project types (`JavaMavenProjectOptions` and everything built on it - `JavaLibraryProjectOptions`, `JavaAppProjectOptions`, `JavaSpringBootProjectOptions`, `JavaServiceProjectOptions`):
332
555
 
333
556
  | Option | Default | Description |
334
557
  | --- | --- | --- |
335
558
  | `name` | - (required) | Project name |
336
559
  | `groupId` | - (required) | Maven group id |
337
- | `artifactId` | - (required) | Maven artifact id |
338
- | `version` | `0.1.0` | Maven version |
560
+ | `artifactId` | - (required) | Maven artifact id (of the reactor parent, in a multi-module project) |
561
+ | `version` | `0.1.0` | Maven version; must be exact |
562
+ | `description` / `url` | - | Written to the root pom |
563
+ | `javaVersion` | `21` | Java line: `1.8`, `17`, `21`, `25` - see [Java version support](#java-version-support) |
564
+ | `javaDistribution` | `temurin` | `actions/setup-java` distribution for CI |
565
+ | `packaging` | `jar` | Root packaging while the project has no modules; a project with modules is always `pom` |
566
+ | `sample` | `false` | Starter `Main` + test under the `groupId` package (single-module only) |
567
+ | `enforcer` | `true` | `maven-enforcer-plugin` with Maven and Java version rules |
568
+ | `minMavenVersion` | `3.9` | The enforcer's `requireMavenVersion` minimum |
569
+ | `pluginVersions` | - | Exact-version overrides for this package's defaults, keyed by `groupId/artifactId` |
570
+ | `licensed` | `true` | Write a `LICENSE` |
571
+ | `license` | `MIT` | SPDX identifier for the `LICENSE` |
572
+ | `copyrightOwner` / `copyrightPeriod` | `xpertss` / current year | Named in the `LICENSE` |
573
+ | `editorconfig` | `true` | Write a projen-managed `.editorconfig` (also on the CDK and action types) |
574
+ | `upgradeWorkflow` | `true` | Generate the nightly update report (`upgrade.yml`) |
339
575
  | `sonarProjectKey` | - | SonarQube project key; the sonar step is skipped when unset |
340
576
  | `gheTokenSecret` | `PROJEN_GITHUB_TOKEN` | GitHub secret holding projen's PAT |
577
+ | `springBootVersion` | newest Boot for `javaVersion` (Spring Boot types only) | Exact Spring Boot version: the BOM and `spring-boot-maven-plugin` |
341
578
  | `cdkDeployTargetRepo` | - (service only; `deploy-cdk.yml` fails until set) | Companion CDK repo (`owner/repo`) whose `deploy.yml` the deploy hook dispatches |
342
579
  | `cdkDeployHook` | `true` (service only) | Whether to generate `deploy-cdk.yml` at all |
343
580
  | `dockerRegistry` | `docker.io` (service only) | Registry the Docker image is pushed to |
@@ -400,7 +637,7 @@ Most actions need exactly one `scenario` step. Actions with a re-run/no-op/idemp
400
637
 
401
638
  ## Customizing `.gitignore`
402
639
 
403
- Every project type already ignores JetBrains IDE state (`/.idea/*`). To ignore more, call the inherited `addGitIgnore()` method after constructing the project in your `.projenrc.ts`:
640
+ Every project type already ignores JetBrains IDE state (`/.idea/*`) and the `/spec/` directory with all of its subdirectories (local plans and specs, never committed). The Java types also ignore Maven `target/` output and Eclipse files. To ignore more, call the inherited `addGitIgnore()` method after constructing the project in your `.projenrc.ts`:
404
641
 
405
642
  ```typescript
406
643
  // .projenrc.ts
@@ -431,23 +668,25 @@ The project types are composed from smaller components you can also attach to yo
431
668
  | `DatabaseComponent` | `NodeProject` | Database construct stub + migration tool wiring |
432
669
  | `EcrEcsConstructs` | `Project` | ECR + Fargate ECS construct helper |
433
670
  | `EdgeNetworkingConstructs` | `Project` | Per-resource edge networking construct helpers |
434
- | `MavenCentralPublish` | `JavaProject` | Manual-dispatch Maven Central publish workflow |
435
- | `DockerPublish` | `JavaProject` | Manual-dispatch Docker build+push workflow |
436
- | `GitHubPackagesPublish` | `JavaProject` | Manual-dispatch GitHub Packages publish workflow |
437
- | `FlywayMigration` | `JavaProject` | Flyway plugin/dependency + migrations directory |
438
- | `CdkDeployHook` | `JavaProject` | Manual-dispatch workflow that triggers `deploy.yml` in a companion CDK repo |
439
- | `CodeIndexWorkflow` | `JavaProject` | Code index generation on push to `main` |
671
+ | `MavenPom` | `Project` | A `pom.xml` with modules, BOM imports, dependency/plugin management, and exact versions only |
672
+ | `MavenModule` | `JavaMavenProject` | One module of a reactor (created by `addModule()`) |
673
+ | `MavenUpgradeReport` | `GitHubProject` | Nightly report-only `upgrade.yml` |
674
+ | `MavenCentralPublish` | `JavaMavenProject` | Manual-dispatch Maven Central publish workflow |
675
+ | `DockerPublish` | `JavaMavenProject` | Manual-dispatch Docker build+push workflow |
676
+ | `GitHubPackagesPublish` | `JavaMavenProject` | Manual-dispatch GitHub Packages publish workflow |
677
+ | `FlywayMigration` | `JavaSpringBootProject` | Flyway plugin/dependency + migrations directory |
678
+ | `CdkDeployHook` | `JavaMavenProject` | Manual-dispatch workflow that triggers `deploy.yml` in a companion CDK repo |
679
+ | `CodeIndexWorkflow` | `JavaMavenProject` | Code index generation on push to `main` |
440
680
  | `ActionBuildWorkflow` | `GitHubProject` | The `lint` task (shellcheck/yamllint/pinned actionlint) + `build.yml` |
441
681
  | `ActionDogfoodWorkflow` | `GitHubProject` | `test-dogfood.yml` from an `ActionDogfoodOptions` scenario |
442
682
  | `ActionSonarWorkflow` | `GitHubProject` | `sonar.yml` (SonarCloud scan via the Scanner CLI) |
443
683
 
444
- Example - adding a Docker publish to a plain projen `JavaProject`:
684
+ Example - adding a Docker publish to a `JavaMavenProject` (`JavaServiceProject` is the packaged version of this, with Spring Boot):
445
685
 
446
686
  ```typescript
447
- import { java } from 'projen';
448
- import { DockerPublish } from '@xpertss/projen-types';
687
+ import { DockerPublish, JavaMavenProject } from '@xpertss/projen-types';
449
688
 
450
- const project = new java.JavaProject({
689
+ const project = new JavaMavenProject({
451
690
  name: 'my-service',
452
691
  groupId: 'org.xpertss',
453
692
  artifactId: 'my-service',
@@ -20,7 +20,7 @@ const ACTIONLINT_SHA256 = '8aca8db96f1b94770f1b0d72b6dddcb1ebb8123cb3712530b08cc
20
20
  * the release build job, so the lint commands exist in exactly one place.
21
21
  */
22
22
  class ActionBuildWorkflow extends projen_1.Component {
23
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionBuildWorkflow", version: "0.0.13" };
23
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionBuildWorkflow", version: "0.0.14" };
24
24
  task;
25
25
  workflow;
26
26
  constructor(scope) {
@@ -41,7 +41,7 @@ const UNCONFIGURED_STEPS = [
41
41
  * error: if you wrote a scenario by hand, you can write its cleanup too.
42
42
  */
43
43
  class ActionDogfoodWorkflow extends projen_1.Component {
44
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionDogfoodWorkflow", version: "0.0.13" };
44
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionDogfoodWorkflow", version: "0.0.14" };
45
45
  workflow;
46
46
  constructor(scope, options) {
47
47
  super(scope, 'ActionDogfoodWorkflow');
@@ -15,7 +15,7 @@ const SONAR_SCANNER_SHA256 = 'bb8f709f9cb73352f8d1260a3b3c506c0f41146754bc630762
15
15
  * inclusions may skip `action.yml` outside `.github/`.
16
16
  */
17
17
  class ActionSonarWorkflow extends projen_1.Component {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionSonarWorkflow", version: "0.0.13" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionSonarWorkflow", version: "0.0.14" };
19
19
  workflow;
20
20
  constructor(scope, options) {
21
21
  super(scope, 'ActionSonarWorkflow');
@@ -49,6 +49,11 @@ export interface GitHubActionProjectOptions extends github.GitHubProjectOptions
49
49
  * @default "MIT"
50
50
  */
51
51
  readonly license?: string;
52
+ /**
53
+ * Write a projen-managed `.editorconfig`.
54
+ * @default true
55
+ */
56
+ readonly editorconfig?: boolean;
52
57
  }
53
58
  /**
54
59
  * Scaffolds the repo lifecycle (AD-001) around a hand-committed, composite
@@ -7,6 +7,7 @@ const action_build_workflow_1 = require("./action-build-workflow");
7
7
  const action_dogfood_workflow_1 = require("./action-dogfood-workflow");
8
8
  const action_sonar_workflow_1 = require("./action-sonar-workflow");
9
9
  const constants_1 = require("../common/constants");
10
+ const editorconfig_1 = require("../common/editorconfig");
10
11
  const internal_actions_1 = require("../common/internal-actions");
11
12
  const projen_drift_check_workflow_1 = require("../common/projen-drift-check-workflow");
12
13
  const projenrc_ts_1 = require("../common/projenrc-ts");
@@ -62,7 +63,7 @@ hand-committed.
62
63
  * per the action's own F### spec - this type only lints it.
63
64
  */
64
65
  class GitHubActionProject extends projen_1.github.GitHubProject {
65
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.GitHubActionProject", version: "0.0.13" };
66
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.GitHubActionProject", version: "0.0.14" };
66
67
  buildWorkflow;
67
68
  dogfoodWorkflow;
68
69
  sonarWorkflow;
@@ -88,8 +89,14 @@ class GitHubActionProject extends projen_1.github.GitHubProject {
88
89
  throw new Error('GitHubActionProject requires GitHub integration to be enabled');
89
90
  }
90
91
  (0, internal_actions_1.applyInternalActionOverrides)(gh);
91
- // JetBrains IDE state (.idea/) is never tracked in generated repos.
92
+ // JetBrains IDE state (.idea/) is never tracked in generated repos, and
93
+ // neither is /spec/ (local plans and specs; the pattern covers every
94
+ // subdirectory).
92
95
  this.addGitIgnore('/.idea/*');
96
+ this.addGitIgnore('/spec/');
97
+ if (options.editorconfig ?? true) {
98
+ (0, editorconfig_1.addEditorConfig)(this);
99
+ }
93
100
  new projen_drift_check_workflow_1.ProjenDriftCheckWorkflow(this, {
94
101
  gheTokenSecret: options.gheTokenSecret ?? constants_1.DEFAULT_GHE_TOKEN_SECRET,
95
102
  });
@@ -161,4 +168,4 @@ class GitHubActionProject extends projen_1.github.GitHubProject {
161
168
  }
162
169
  }
163
170
  exports.GitHubActionProject = GitHubActionProject;
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWFjdGlvbi1wcm9qZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbnMvZ2l0aHViLWFjdGlvbi1wcm9qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FPZ0I7QUFDaEIsbUVBQThEO0FBQzlELHVFQUF3RjtBQUN4RixtRUFBOEQ7QUFDOUQsbURBQStEO0FBQy9ELGlFQUEwRTtBQUMxRSx1RkFBaUY7QUFDakYsdURBQWlFO0FBQ2pFLCtGQUF5RjtBQUN6RixpRUFBaUU7QUFFakUsMkVBQTJFO0FBQzNFLHlFQUF5RTtBQUN6RSwrREFBK0Q7QUFDL0QseUVBQXlFO0FBQ3pFLG9FQUFvRTtBQUNwRSxrRUFBa0U7QUFDbEUsaUVBQWlFO0FBQ2pFLE1BQU0sY0FBYyxHQUFXLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUN0RSxpRUFBaUU7QUFDakUsTUFBTSxvQkFBb0IsR0FBVyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxPQUFPLENBQUM7QUFFM0Usd0VBQXdFO0FBQ3hFLDRFQUE0RTtBQUM1RSxtQ0FBbUM7QUFDbkMsTUFBTSxzQkFBc0IsR0FBRyxRQUFRLENBQUM7QUEwRHhDLFNBQVMscUJBQXFCLENBQUMsT0FBbUM7SUFDaEUsT0FBTyxLQUFLLE9BQU8sQ0FBQyxJQUFJOztFQUV4QixPQUFPLENBQUMsV0FBVyxJQUFJLEVBQUU7Ozs7O2tCQUtULE9BQU8sQ0FBQyxJQUFJOzs7Ozs7Ozs7Ozs7Ozs7Q0FlN0IsQ0FBQztBQUNGLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFhLG1CQUFvQixTQUFRLGVBQU0sQ0FBQyxhQUFhOztJQUMzQyxhQUFhLENBQXNCO0lBQ25DLGVBQWUsQ0FBd0I7SUFDdkMsYUFBYSxDQUFzQjtJQUNuQyxPQUFPLENBQWtCO0lBRXpDLFlBQVksT0FBbUM7UUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELDREQUE0RDtRQUM1RCwwREFBMEQ7UUFDMUQsNkJBQTZCO1FBRTdCLEtBQUssQ0FBQztZQUNKLEdBQUcsT0FBTztZQUNWLHlFQUF5RTtZQUN6RSxxRUFBcUU7WUFDckUsdUVBQXVFO1lBQ3ZFLHdFQUF3RTtZQUN4RSxhQUFhLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRTtZQUNuRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtTQUN2RSxDQUFDLENBQUM7UUFFSCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNSLE1BQU0sSUFBSSxLQUFLLENBQ2IsK0RBQStELENBQ2hFLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBQSwrQ0FBNEIsRUFBQyxFQUFFLENBQUMsQ0FBQztRQUVqQyxvRUFBb0U7UUFDcEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU5QixJQUFJLHNEQUF3QixDQUFDLElBQUksRUFBRTtZQUNqQyxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWMsSUFBSSxvQ0FBd0I7U0FDbkUsQ0FBQyxDQUFDO1FBQ0gsSUFBSSw4REFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2QyxJQUFJLGdCQUFPLENBQUMsSUFBSSxFQUFFO1lBQ2hCLElBQUksRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLEtBQUs7WUFDOUIsY0FBYyxFQUFFLFNBQVM7U0FDMUIsQ0FBQyxDQUFDO1FBRUgsdUVBQXVFO1FBQ3ZFLHdFQUF3RTtRQUN4RSxxRUFBcUU7UUFDckUsSUFBQSxzQ0FBd0IsRUFBQyxJQUFJLENBQUMsQ0FBQztRQUUvQix3RUFBd0U7UUFDeEUsZ0VBQWdFO1FBQ2hFLHFFQUFxRTtRQUNyRSxzRUFBc0U7UUFDdEUsbUJBQW1CO1FBQ25CLElBQUksaUJBQVEsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO1lBQ2pDLEdBQUcsRUFBRTtnQkFDSCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7Z0JBQ2xCLE9BQU8sRUFBRSxPQUFPO2dCQUNoQixPQUFPLEVBQUUsSUFBSTtnQkFDYixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7Z0JBQ2hDLGVBQWUsRUFBRTtvQkFDZixRQUFRLEVBQUUsY0FBYztvQkFDeEIsdUJBQXVCLEVBQUUsb0JBQW9CO29CQUM3Qyx3QkFBd0IsRUFBRSxzQkFBc0I7aUJBQ2pEO2FBQ0Y7WUFDRCxRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDLENBQUM7UUFFSCxJQUFJLGlCQUFRLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUM5QixHQUFHLEVBQUU7Z0JBQ0gsT0FBTyxFQUFFLFNBQVM7Z0JBQ2xCLEtBQUssRUFBRSxFQUFFLGFBQWEsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTthQUN2QztTQUNGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSwyQ0FBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksK0NBQXFCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV4RSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksMkNBQW1CLENBQUMsSUFBSSxFQUFFO1lBQ2pELFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtZQUNsQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO1lBQzFDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxvQkFBb0I7U0FDbkQsQ0FBQyxDQUFDO1FBRUgscURBQXFEO1FBQ3JELGtFQUFrRTtRQUNsRSxrRUFBa0U7UUFDbEUscUVBQXFFO1FBQ3JFLDhEQUE4RDtRQUM5RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksZ0JBQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ3ZDLE1BQU0sRUFBRSxNQUFNO1lBQ2QsbUVBQW1FO1lBQ25FLHdEQUF3RDtZQUN4RCxrQkFBa0IsRUFBRSxNQUFNO1lBQzFCLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQ2hDLFdBQVcsRUFBRSxjQUFjO1lBQzNCLGlCQUFpQixFQUFFLDBCQUFpQixDQUFDLGdCQUFnQixFQUFFO1lBQ3ZELGNBQWMsRUFBRSxnQkFBTyxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUU7WUFDbkQsV0FBVyxFQUFFLDBCQUEwQixzQkFBc0IsRUFBRTtZQUMvRCx5QkFBeUIsRUFBRTtnQkFDekIsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRTthQUNoRDtTQUNGLENBQUMsQ0FBQztRQUVILG1FQUFtRTtRQUNuRSxzRUFBc0U7UUFDdEUsa0VBQWtFO1FBQ2xFLDZDQUE2QztRQUM3QyxJQUFBLHNDQUFtQixFQUNqQixJQUFJLENBQUMsV0FBVyxDQUFDLCtCQUErQixDQUFDLEVBQ2pELHFGQUFxRixDQUN0RixDQUFDO0lBQ0osQ0FBQzs7QUFuSEgsa0RBb0hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSnNvbkZpbGUsXG4gIExpY2Vuc2UsXG4gIFJlbGVhc2FibGVDb21taXRzLFxuICBZYW1sRmlsZSxcbiAgZ2l0aHViLFxuICByZWxlYXNlLFxufSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQWN0aW9uQnVpbGRXb3JrZmxvdyB9IGZyb20gJy4vYWN0aW9uLWJ1aWxkLXdvcmtmbG93JztcbmltcG9ydCB7IEFjdGlvbkRvZ2Zvb2RPcHRpb25zLCBBY3Rpb25Eb2dmb29kV29ya2Zsb3cgfSBmcm9tICcuL2FjdGlvbi1kb2dmb29kLXdvcmtmbG93JztcbmltcG9ydCB7IEFjdGlvblNvbmFyV29ya2Zsb3cgfSBmcm9tICcuL2FjdGlvbi1zb25hci13b3JrZmxvdyc7XG5pbXBvcnQgeyBERUZBVUxUX0dIRV9UT0tFTl9TRUNSRVQgfSBmcm9tICcuLi9jb21tb24vY29uc3RhbnRzJztcbmltcG9ydCB7IGFwcGx5SW50ZXJuYWxBY3Rpb25PdmVycmlkZXMgfSBmcm9tICcuLi9jb21tb24vaW50ZXJuYWwtYWN0aW9ucyc7XG5pbXBvcnQgeyBQcm9qZW5EcmlmdENoZWNrV29ya2Zsb3cgfSBmcm9tICcuLi9jb21tb24vcHJvamVuLWRyaWZ0LWNoZWNrLXdvcmtmbG93JztcbmltcG9ydCB7IGF0dGFjaFR5cGVTY3JpcHRQcm9qZW5yYyB9IGZyb20gJy4uL2NvbW1vbi9wcm9qZW5yYy10cyc7XG5pbXBvcnQgeyBXb3JrZmxvd0NoYW5nZU5vdGljZVdvcmtmbG93IH0gZnJvbSAnLi4vY29tbW9uL3dvcmtmbG93LWNoYW5nZS1ub3RpY2Utd29ya2Zsb3cnO1xuaW1wb3J0IHsgbm90ZVdvcmtmbG93UHVycG9zZSB9IGZyb20gJy4uL2NvbW1vbi93b3JrZmxvdy1wdXJwb3NlJztcblxuLy8gYHJlcXVpcmUoJ3Byb2plbi9wYWNrYWdlLmpzb24nKWAvYHJlcXVpcmUoJy4uLy4uL3BhY2thZ2UuanNvbicpYCByZXNvbHZlXG4vLyB2aWEgTm9kZSdzIG5vcm1hbCBtb2R1bGUgcmVzb2x1dGlvbiwgc28gaW4gYSAqcHVibGlzaGVkKiBwYWNrYWdlIHRoZXNlXG4vLyByZWFkIHRoZSB2ZXJzaW9ucyBhY3R1YWxseSBpbnN0YWxsZWQgaW4gdGhlIGNvbnN1bWluZyByZXBvJ3Ncbi8vIG5vZGVfbW9kdWxlcyAtIGV4YWN0bHkgdGhlIFwiUFJPSkVOX1ZFUlNJT04gb2YgdGhlIHN5bnRoXCIgLyBcInZlcnNpb24gb2Zcbi8vIHRoaXMgcGFja2FnZSB0aGF0IHNjYWZmb2xkZWQgdGhlIHJlcG9cIiB0aGUgcHJpdmF0ZSBwYWNrYWdlLmpzb24nc1xuLy8gZGV2RGVwZW5kZW5jaWVzIG5lZWQgdG8gcGluIChzZWUgRjAxMCBDSS1kZXBlbmRlbmNpZXMgc2VjdGlvbikuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3QgUFJPSkVOX1ZFUlNJT046IHN0cmluZyA9IHJlcXVpcmUoJ3Byb2plbi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IFBST0pFTl9UWVBFU19WRVJTSU9OOiBzdHJpbmcgPSByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uO1xuXG4vLyBFeGFjdCBwaW4sIHJlY29yZGVkIGFzIGEgY29tcG9uZW50IGNvbnN0YW50IChBRC0wMDE6IG5vIGxhdGVzdC9tb3Zpbmdcbi8vIHRhZy9zZW12ZXIgcmFuZ2UgaW4gYW55dGhpbmcgYSBnZW5lcmF0ZWQgcmVwbyBkZXBlbmRzIG9uKS4gVXBncmFkaW5nIHRoaXNcbi8vIGlzIGEgcmV2aWV3ZWQgZGlmZiBvZiB0aGlzIGZpbGUuXG5jb25zdCBDT01NSVRfQU5EX1RBR19WRVJTSU9OID0gJzEzLjIuMSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0SHViQWN0aW9uUHJvamVjdE9wdGlvbnNcbiAgZXh0ZW5kcyBnaXRodWIuR2l0SHViUHJvamVjdE9wdGlvbnMge1xuICAvKipcbiAgICogT25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIGFjdGlvbi4gVXNlZCBpbiB0aGUgZGVmYXVsdCBSRUFETUVcbiAgICogdGVtcGxhdGUgYW5kIHJlY29yZGVkIGluIHRoZSBwcml2YXRlIGBwYWNrYWdlLmpzb25gLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIEdpdEh1YiBBY3Rpb25zIHNlY3JldCBob2xkaW5nIHRoZSBQQVQgdXNlZCBmb3JcbiAgICogcHJvamVuLWF1dG9tYXRpb24gUFIgY29tbWVudHMgKEYwMDMpIGFuZCwgd2hlbiB0aGUgYWN0aW9uIGhhcyBhXG4gICAqIGB0b2tlbmAgaW5wdXQsIHRoZSBkb2dmb29kJ3MgaW52b2NhdGlvbiBvZiBpdC5cbiAgICogQGRlZmF1bHQgXCJQUk9KRU5fR0lUSFVCX1RPS0VOXCJcbiAgICovXG4gIHJlYWRvbmx5IGdoZVRva2VuU2VjcmV0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVUkwgb2YgdGhlIG9yZydzIFNvbmFyQ2xvdWQgaW5zdGFuY2UgKGUuZy4gYGh0dHBzOi8vc29uYXJjbG91ZC5pb2ApLlxuICAgKiBNVVNUIGJlIHJlYWNoYWJsZSBmcm9tIGdpdGh1Yi5jb20taG9zdGVkIChwdWJsaWMpIHJ1bm5lcnMgKEFELTAwMSkuXG4gICAqIFJlcXVpcmVkLCBubyBkZWZhdWx0OiBhIGd1ZXNzZWQgc2VydmVyIGlzIHdvcnNlIHRoYW4gYSBsb3VkIGZhaWx1cmUuXG4gICAqL1xuICByZWFkb25seSBzb25hckhvc3RVcmw6IHN0cmluZztcblxuICAvKiogQGRlZmF1bHQgXCJTT05BUl9UT0tFTlwiICovXG4gIHJlYWRvbmx5IHNvbmFyVG9rZW5TZWNyZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYHNvbmFyLnltbGAgYWxzbyBydW5zIG9uIGBwdWxsX3JlcXVlc3RgIGFzIGEgcGFzcy9mYWlsIGdhdGUuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHNvbmFyUHVsbFJlcXVlc3RHYXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGRvZ2Zvb2Qgc2NlbmFyaW8gKEFELTAwMSkuIFdoYXQgZml4dHVyZSBzdGF0ZSwgd2hhdCB0byBhc3NlcnQsIGFuZFxuICAgKiBob3cgdG8gY2xlYW4gdXAgYXJlIHNwZWNpZmllZCBieSB0aGUgYWN0aW9uJ3Mgb3duIEYjIyMgc3BlYyAtIHRoZVxuICAgKiBoaWdoZXN0LXJpc2sgYmVoYXZpb3Igb2YgdGhhdCBhY3Rpb24uXG4gICAqXG4gICAqIEl0cyB0eXBlIGlzIGEgc3RydWN0LCB3aGljaCBwcm9qZW4ncyBDTEkgY2Fubm90IHJlbmRlciBpbnRvIGEgcHJvamVucmMsXG4gICAqIHNvIGl0IGNhbiBvbmx5IGJlIHdyaXR0ZW4gYnkgaGFuZCAtIGl0IGlzIHRoZXJlZm9yZSBvcHRpb25hbCwgYmVjYXVzZSBhXG4gICAqICpyZXF1aXJlZCogb3B0aW9uIGBwcm9qZW4gbmV3YCBjYW5ub3Qgc3VwcGx5IHdvdWxkIG1ha2UgdGhpcyBwcm9qZWN0XG4gICAqIHR5cGUgaW1wb3NzaWJsZSB0byBzY2FmZm9sZC4gQUQtMDAxJ3MgXCJuZXZlciBhIHNpbGVudCBuby1vcCBkb2dmb29kXCJcbiAgICogcnVsZSBpcyBlbmZvcmNlZCBpbnN0ZWFkIGJ5IHRoZSB3b3JrZmxvdyBpdCBnZW5lcmF0ZXMgaW4gdGhhdCBjYXNlOiBhXG4gICAqIHNpbmdsZSBzdGVwIHRoYXQgZmFpbHMgb24gZXZlcnkgUFIgdW50aWwgYSBzY2VuYXJpbyBpcyBkZWNsYXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgdGVzdC1kb2dmb29kLnltbGAgcnVucyBvbmUgZmFpbGluZyBzdGVwIHRoYXQgdGVsbHMgeW91IHRvXG4gICAqIGRlY2xhcmUgYSBzY2VuYXJpb1xuICAgKi9cbiAgcmVhZG9ubHkgZG9nZm9vZD86IEFjdGlvbkRvZ2Zvb2RPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBTUERYIGlkZW50aWZpZXIgZm9yIHRoZSBnZW5lcmF0ZWQgYExJQ0VOU0VgLlxuICAgKiBAZGVmYXVsdCBcIk1JVFwiXG4gICAqL1xuICByZWFkb25seSBsaWNlbnNlPzogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0UmVhZG1lQ29udGVudHMob3B0aW9uczogR2l0SHViQWN0aW9uUHJvamVjdE9wdGlvbnMpOiBzdHJpbmcge1xuICByZXR1cm4gYCMgJHtvcHRpb25zLm5hbWV9XG5cbiR7b3B0aW9ucy5kZXNjcmlwdGlvbiA/PyAnJ31cblxuIyMgVXNhZ2VcblxuXFxgXFxgXFxgeWFtbFxuLSB1c2VzOiB4cGVydHNzLyR7b3B0aW9ucy5uYW1lfUA8cmVmPlxuXFxgXFxgXFxgXG5cbiMjIEJ1bXBpbmdcblxuQSBcXGBmZWF0OlxcYC9cXGBmaXg6XFxgIGNvbW1pdCBwdXNoZWQgdG8gXFxgbWFpblxcYCBpcyByZWxlYXNlZCBhdXRvbWF0aWNhbGx5OiBidW1wLFxudGFnIFxcYHZYLlkuWlxcYCwgR2l0SHViIFJlbGVhc2UuIFNlZSBcXGAuZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLnltbFxcYC5cblxuIyMgVHJ1c3QgY29udHJhY3RcblxuVGhpcyBpcyBhIGNvbXBvc2l0ZSAoc2hlbGwpIGFjdGlvbiAtIG5vIE5vZGUvbnBtIGF0IHJ1bnRpbWUsIG5vIERvY2tlci4gSXRzXG5DSSBsaW50IGdhdGUgKFxcYGJ1aWxkLnltbFxcYCksIGRvZ2Zvb2QgdGVzdCAoXFxgdGVzdC1kb2dmb29kLnltbFxcYCksIGFuZCBTb25hclxuc2NhbiAoXFxgc29uYXIueW1sXFxgKSBhcmUgc2NhZmZvbGRlZCBieSBcXGBAeHBlcnRzcy9wcm9qZW4tdHlwZXNcXGAnXG5cXGBHaXRIdWJBY3Rpb25Qcm9qZWN0XFxgOyBvbmx5IFxcYGFjdGlvbi55bWxcXGAgYW5kIGl0cyBzaGVsbCBzY3JpcHRzIGFyZVxuaGFuZC1jb21taXR0ZWQuXG5gO1xufVxuXG4vKipcbiAqIFNjYWZmb2xkcyB0aGUgcmVwbyBsaWZlY3ljbGUgKEFELTAwMSkgYXJvdW5kIGEgaGFuZC1jb21taXR0ZWQsIGNvbXBvc2l0ZVxuICogKHNoZWxsKSBHaXRIdWIgQWN0aW9uOiB0aGUgYGJ1aWxkYC9gdGVzdC1kb2dmb29kYC9gc29uYXJgL2ByZWxlYXNlYFxuICAqIHdvcmtmbG93cywgdmVyc2lvbmluZyBhbmQgcmVsZWFzZSBkaXNjaXBsaW5lLCB0aGUgRjAwMyB2ZXJpZnkgY29tcG9uZW50cyxcbiAgKiBhbmQgcmVwbyBib2lsZXJwbGF0ZSAoYSBwcml2YXRlIHZlcnNpb24tc291cmNlIGBwYWNrYWdlLmpzb25gLCBgLnlhbWxsaW50YCxcbiAgKiBgTElDRU5TRWAsIGFuZCBhIGBSRUFETUUubWRgIHRlbXBsYXRlKS4gVGhlXG4gKiBhY3Rpb24ncyBvd24gY29udGVudFxuICogKGBhY3Rpb24ueW1sYCwgaXRzIHNoZWxsIHNjcmlwdHMsIGB0ZXN0L2AgZml4dHVyZXMpIGlzIGF1dGhvcmVkIGJ5IGhhbmRcbiAqIHBlciB0aGUgYWN0aW9uJ3Mgb3duIEYjIyMgc3BlYyAtIHRoaXMgdHlwZSBvbmx5IGxpbnRzIGl0LlxuICovXG5leHBvcnQgY2xhc3MgR2l0SHViQWN0aW9uUHJvamVjdCBleHRlbmRzIGdpdGh1Yi5HaXRIdWJQcm9qZWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGJ1aWxkV29ya2Zsb3c6IEFjdGlvbkJ1aWxkV29ya2Zsb3c7XG4gIHB1YmxpYyByZWFkb25seSBkb2dmb29kV29ya2Zsb3c6IEFjdGlvbkRvZ2Zvb2RXb3JrZmxvdztcbiAgcHVibGljIHJlYWRvbmx5IHNvbmFyV29ya2Zsb3c6IEFjdGlvblNvbmFyV29ya2Zsb3c7XG4gIHB1YmxpYyByZWFkb25seSByZWxlYXNlOiByZWxlYXNlLlJlbGVhc2U7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogR2l0SHViQWN0aW9uUHJvamVjdE9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMuc29uYXJIb3N0VXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdEh1YkFjdGlvblByb2plY3QgcmVxdWlyZXMgc29uYXJIb3N0VXJsJyk7XG4gICAgfVxuICAgIC8vIEEgZGVjbGFyZWQtYnV0LWluY29tcGxldGUgZG9nZm9vZCBpcyBzdGlsbCBhbiBlcnJvciAtIHNlZVxuICAgIC8vIGBBY3Rpb25Eb2dmb29kV29ya2Zsb3dgLCB3aGljaCBvd25zIHRoYXQgY2hlY2sgKGFuZCB0aGVcbiAgICAvLyBuby1kb2dmb29kLWRlY2xhcmVkIGNhc2UpLlxuXG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIC8vIFBSIHRpdGxlcyBhcmUgbm90IGdhdGVkOiBgZmVhdDpgL2BmaXg6YCBtYXR0ZXIgb25seSBiZWNhdXNlIHRoZXkgZHJpdmVcbiAgICAgIC8vIHRoZSByZWxlYXNlIHdvcmtmbG93ICh2aWEgYHJlbGVhc2FibGVDb21taXRzYCksIG5vdCBQUiBjaGVja3MuIFRoZVxuICAgICAgLy8gY29udmVudGlvbmFsLWNvbW1pdCBQUi10aXRsZSBsaW50IGlzIGFkZGVkIGJ5IHRoZSBgR2l0SHViYCBjb21wb25lbnRcbiAgICAgIC8vIHVubGVzcyBgZ2l0aHViT3B0aW9ucy5wdWxsUmVxdWVzdExpbnRgIGlzIGBmYWxzZWAgKGl0IGRlZmF1bHRzIHRydWUpLlxuICAgICAgZ2l0aHViT3B0aW9uczogeyAuLi5vcHRpb25zLmdpdGh1Yk9wdGlvbnMsIHB1bGxSZXF1ZXN0TGludDogZmFsc2UgfSxcbiAgICAgIHJlYWRtZTogb3B0aW9ucy5yZWFkbWUgPz8geyBjb250ZW50czogZGVmYXVsdFJlYWRtZUNvbnRlbnRzKG9wdGlvbnMpIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBnaCA9IHRoaXMuZ2l0aHViO1xuICAgIGlmICghZ2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0dpdEh1YkFjdGlvblByb2plY3QgcmVxdWlyZXMgR2l0SHViIGludGVncmF0aW9uIHRvIGJlIGVuYWJsZWQnLFxuICAgICAgKTtcbiAgICB9XG4gICAgYXBwbHlJbnRlcm5hbEFjdGlvbk92ZXJyaWRlcyhnaCk7XG5cbiAgICAvLyBKZXRCcmFpbnMgSURFIHN0YXRlICguaWRlYS8pIGlzIG5ldmVyIHRyYWNrZWQgaW4gZ2VuZXJhdGVkIHJlcG9zLlxuICAgIHRoaXMuYWRkR2l0SWdub3JlKCcvLmlkZWEvKicpO1xuXG4gICAgbmV3IFByb2plbkRyaWZ0Q2hlY2tXb3JrZmxvdyh0aGlzLCB7XG4gICAgICBnaGVUb2tlblNlY3JldDogb3B0aW9ucy5naGVUb2tlblNlY3JldCA/PyBERUZBVUxUX0dIRV9UT0tFTl9TRUNSRVQsXG4gICAgfSk7XG4gICAgbmV3IFdvcmtmbG93Q2hhbmdlTm90aWNlV29ya2Zsb3codGhpcyk7XG5cbiAgICBuZXcgTGljZW5zZSh0aGlzLCB7XG4gICAgICBzcGR4OiBvcHRpb25zLmxpY2Vuc2UgPz8gJ01JVCcsXG4gICAgICBjb3B5cmlnaHRPd25lcjogJ3hwZXJ0c3MnLFxuICAgIH0pO1xuXG4gICAgLy8gYC5wcm9qZW5yYy50c2AgKyBgbnB4IHByb2plbmAsIHNhbWUgYXMgZXZlcnkgb3RoZXIgdHlwZSBoZXJlLiBBIGJhcmVcbiAgICAvLyBHaXRIdWJQcm9qZWN0IGhhcyBubyBkZWZhdWx0IHRhc2sgdGhhdCBydW5zIGEgcHJvamVucmMgb24gaXRzIG93biwgc29cbiAgICAvLyB0aGlzIGlzIHdoYXQgbWFrZXMgYG5weCBwcm9qZW5gIHdvcmsgaW4gdGhlIGdlbmVyYXRlZCByZXBvIGF0IGFsbC5cbiAgICBhdHRhY2hUeXBlU2NyaXB0UHJvamVucmModGhpcyk7XG5cbiAgICAvLyBwcm9qZW4gbWFya3MgZ2VuZXJhdGVkIGZpbGVzIHJlYWQtb25seSAoMDQ0NCkgb24gZGlzayBieSBkZWZhdWx0LCBidXRcbiAgICAvLyB0aGlzIG9uZSBtdXN0IHN0YXkgb3duZXItd3JpdGFibGU6IHRoZSBkb2N1bWVudGVkIHVwZGF0ZSBmbG93XG4gICAgLy8gKGBucG0gaSAtRCBAeHBlcnRzcy9wcm9qZW4tdHlwZXNAbGF0ZXN0YCkgbmVlZHMgbnBtIHRvIHJld3JpdGUgdGhlXG4gICAgLy8gcGlubmVkIHZlcnNpb25zIGluIGFuIGV4aXN0aW5nIHJlcG8uIEhhbmQtZWRpdHMgYXJlIHN0aWxsIGNhdWdodCBieVxuICAgIC8vIHRoZSBkcmlmdCBjaGVjay5cbiAgICBuZXcgSnNvbkZpbGUodGhpcywgJ3BhY2thZ2UuanNvbicsIHtcbiAgICAgIG9iajoge1xuICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgIHZlcnNpb246ICcwLjAuMCcsXG4gICAgICAgIHByaXZhdGU6IHRydWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgICBkZXZEZXBlbmRlbmNpZXM6IHtcbiAgICAgICAgICAncHJvamVuJzogUFJPSkVOX1ZFUlNJT04sXG4gICAgICAgICAgJ0B4cGVydHNzL3Byb2plbi10eXBlcyc6IFBST0pFTl9UWVBFU19WRVJTSU9OLFxuICAgICAgICAgICdjb21taXQtYW5kLXRhZy12ZXJzaW9uJzogQ09NTUlUX0FORF9UQUdfVkVSU0lPTixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZWFkb25seTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBuZXcgWWFtbEZpbGUodGhpcywgJy55YW1sbGludCcsIHtcbiAgICAgIG9iajoge1xuICAgICAgICBleHRlbmRzOiAnZGVmYXVsdCcsXG4gICAgICAgIHJ1bGVzOiB7ICdsaW5lLWxlbmd0aCc6IHsgbWF4OiAxMjAgfSB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuYnVpbGRXb3JrZmxvdyA9IG5ldyBBY3Rpb25CdWlsZFdvcmtmbG93KHRoaXMpO1xuXG4gICAgdGhpcy5kb2dmb29kV29ya2Zsb3cgPSBuZXcgQWN0aW9uRG9nZm9vZFdvcmtmbG93KHRoaXMsIG9wdGlvbnMuZG9nZm9vZCk7XG5cbiAgICB0aGlzLnNvbmFyV29ya2Zsb3cgPSBuZXcgQWN0aW9uU29uYXJXb3JrZmxvdyh0aGlzLCB7XG4gICAgICBzb25hckhvc3RVcmw6IG9wdGlvbnMuc29uYXJIb3N0VXJsLFxuICAgICAgc29uYXJUb2tlblNlY3JldDogb3B0aW9ucy5zb25hclRva2VuU2VjcmV0LFxuICAgICAgc29uYXJQdWxsUmVxdWVzdEdhdGU6IG9wdGlvbnMuc29uYXJQdWxsUmVxdWVzdEdhdGUsXG4gICAgfSk7XG5cbiAgICAvLyBgZ2l0aHViUmVsZWFzZWAgZGVmYXVsdHMgdG8gdHJ1ZSwgd2hpY2ggYXV0by13aXJlc1xuICAgIC8vIGBwdWJsaXNoVG9HaXRIdWJSZWxlYXNlc2AgLSBpdHMgYGdoIHJlbGVhc2UgY3JlYXRlIC4uLiAtLXRhcmdldFxuICAgIC8vICRHSVRIVUJfU0hBYCBjcmVhdGVzIHRoZSB0YWcgKmFuZCogdGhlIHJlbGVhc2UgdG9nZXRoZXIgZm9yIG91clxuICAgIC8vIGNvbnRpbnVvdXMgKHB1c2gtdG8tbWFpbikgdHJpZ2dlci4gTm8gc2VwYXJhdGUgYHB1Ymxpc2hUb0dpdGAgY2FsbFxuICAgIC8vIG5lZWRlZCAodGhhdCBwYXRoIG9ubHkgZmlyZXMgZm9yIGEgbWFudWFsIHJlbGVhc2UgdHJpZ2dlcikuXG4gICAgdGhpcy5yZWxlYXNlID0gbmV3IHJlbGVhc2UuUmVsZWFzZSh0aGlzLCB7XG4gICAgICBicmFuY2g6ICdtYWluJyxcbiAgICAgIC8vIE5vIGJ1aWxkIGFydGlmYWN0IGZvciBhIGNvbXBvc2l0ZSBhY3Rpb24gKEFELTAwMSkgLSB0aGlzIGlzIG9ubHlcbiAgICAgIC8vIHdoZXJlIFJlbGVhc2Ugc3RhZ2VzIGl0cyBvd24gdmVyc2lvbi9jaGFuZ2Vsb2cgZmlsZXMuXG4gICAgICBhcnRpZmFjdHNEaXJlY3Rvcnk6ICdkaXN0JyxcbiAgICAgIHRhc2tzOiBbdGhpcy5idWlsZFdvcmtmbG93LnRhc2tdLFxuICAgICAgdmVyc2lvbkZpbGU6ICdwYWNrYWdlLmpzb24nLFxuICAgICAgcmVsZWFzYWJsZUNvbW1pdHM6IFJlbGVhc2FibGVDb21taXRzLmZlYXR1cmVzQW5kRml4ZXMoKSxcbiAgICAgIHJlbGVhc2VUcmlnZ2VyOiByZWxlYXNlLlJlbGVhc2VUcmlnZ2VyLmNvbnRpbnVvdXMoKSxcbiAgICAgIGJ1bXBQYWNrYWdlOiBgY29tbWl0LWFuZC10YWctdmVyc2lvbkAke0NPTU1JVF9BTkRfVEFHX1ZFUlNJT059YCxcbiAgICAgIHJlbGVhc2VXb3JrZmxvd1NldHVwU3RlcHM6IFtcbiAgICAgICAgeyBuYW1lOiAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLCBydW46ICducG0gY2knIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgLy8gVGhlIHJlbGVhc2Ugd29ya2Zsb3cgaXMgY3JlYXRlZCBpbnNpZGUgYHJlbGVhc2UuUmVsZWFzZWAgKHByb2plblxuICAgIC8vIGludGVybmFsKSwgbm90IGJ5IHRoaXMgdHlwZSAtIHJlYWNoIGl0cyBmaWxlIGJ5IHBhdGggdG8gYW5ub3RhdGUgaXRcbiAgICAvLyBsaWtlIGV2ZXJ5IG90aGVyIGdlbmVyYXRlZCB3b3JrZmxvdy4gVGhpcyB0eXBlIGlzIGFsd2F5cyBhIHJvb3RcbiAgICAvLyBwcm9qZWN0LCBzbyBwcm9qZW4gbmFtZXMgaXQgYHJlbGVhc2UueW1sYC5cbiAgICBub3RlV29ya2Zsb3dQdXJwb3NlKFxuICAgICAgdGhpcy50cnlGaW5kRmlsZSgnLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWwnKSxcbiAgICAgICdDb250aW51b3VzIHJlbGVhc2Ugb24gcHVzaCB0byBtYWluOiBidW1wIHZlcnNpb24sIHRhZywgYW5kIGNyZWF0ZSBhIEdpdEh1YiBSZWxlYXNlLicsXG4gICAgKTtcbiAgfVxufVxuIl19
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWFjdGlvbi1wcm9qZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbnMvZ2l0aHViLWFjdGlvbi1wcm9qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FPZ0I7QUFDaEIsbUVBQThEO0FBQzlELHVFQUF3RjtBQUN4RixtRUFBOEQ7QUFDOUQsbURBQStEO0FBQy9ELHlEQUF5RDtBQUN6RCxpRUFBMEU7QUFDMUUsdUZBQWlGO0FBQ2pGLHVEQUFpRTtBQUNqRSwrRkFBeUY7QUFDekYsaUVBQWlFO0FBRWpFLDJFQUEyRTtBQUMzRSx5RUFBeUU7QUFDekUsK0RBQStEO0FBQy9ELHlFQUF5RTtBQUN6RSxvRUFBb0U7QUFDcEUsa0VBQWtFO0FBQ2xFLGlFQUFpRTtBQUNqRSxNQUFNLGNBQWMsR0FBVyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxPQUFPLENBQUM7QUFDdEUsaUVBQWlFO0FBQ2pFLE1BQU0sb0JBQW9CLEdBQVcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsT0FBTyxDQUFDO0FBRTNFLHdFQUF3RTtBQUN4RSw0RUFBNEU7QUFDNUUsbUNBQW1DO0FBQ25DLE1BQU0sc0JBQXNCLEdBQUcsUUFBUSxDQUFDO0FBZ0V4QyxTQUFTLHFCQUFxQixDQUFDLE9BQW1DO0lBQ2hFLE9BQU8sS0FBSyxPQUFPLENBQUMsSUFBSTs7RUFFeEIsT0FBTyxDQUFDLFdBQVcsSUFBSSxFQUFFOzs7OztrQkFLVCxPQUFPLENBQUMsSUFBSTs7Ozs7Ozs7Ozs7Ozs7O0NBZTdCLENBQUM7QUFDRixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxlQUFNLENBQUMsYUFBYTs7SUFDM0MsYUFBYSxDQUFzQjtJQUNuQyxlQUFlLENBQXdCO0lBQ3ZDLGFBQWEsQ0FBc0I7SUFDbkMsT0FBTyxDQUFrQjtJQUV6QyxZQUFZLE9BQW1DO1FBQzdDLElBQUksQ0FBQyxPQUFPLENB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QixFQUFFLE9BQU8sQ0FBQyxnQkFBZ0I7WUFDMUMsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLG9CQUFvQjtTQUNuRCxDQUFDLENBQUM7UUFFSCxxREFBcUQ7UUFDckQsa0VBQWtFO1FBQ2xFLGtFQUFrRTtRQUNsRSxxRUFBcUU7UUFDckUsOERBQThEO1FBQzlELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxnQkFBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDdkMsTUFBTSxFQUFFLE1BQU07WUFDZCxtRUFBbUU7WUFDbkUsd0RBQXdEO1lBQ3hELGtCQUFrQixFQUFFLE1BQU07WUFDMUIsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDaEMsV0FBVyxFQUFFLGNBQWM7WUFDM0IsaUJBQWlCLEVBQUUsMEJBQWlCLENBQUMsZ0JBQWdCLEVBQUU7WUFDdkQsY0FBYyxFQUFFLGdCQUFPLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRTtZQUNuRCxXQUFXLEVBQUUsMEJBQTBCLHNCQUFzQixFQUFFO1lBQy9ELHlCQUF5QixFQUFFO2dCQUN6QixFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFO2FBQ2hEO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsbUVBQW1FO1FBQ25FLHNFQUFzRTtRQUN0RSxrRUFBa0U7UUFDbEUsNkNBQTZDO1FBQzdDLElBQUEsc0NBQW1CLEVBQ2pCLElBQUksQ0FBQyxXQUFXLENBQUMsK0JBQStCLENBQUMsRUFDakQscUZBQXFGLENBQ3RGLENBQUM7SUFDSixDQUFDOztBQTFISCxrREEySEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBKc29uRmlsZSxcbiAgTGljZW5zZSxcbiAgUmVsZWFzYWJsZUNvbW1pdHMsXG4gIFlhbWxGaWxlLFxuICBnaXRodWIsXG4gIHJlbGVhc2UsXG59IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBY3Rpb25CdWlsZFdvcmtmbG93IH0gZnJvbSAnLi9hY3Rpb24tYnVpbGQtd29ya2Zsb3cnO1xuaW1wb3J0IHsgQWN0aW9uRG9nZm9vZE9wdGlvbnMsIEFjdGlvbkRvZ2Zvb2RXb3JrZmxvdyB9IGZyb20gJy4vYWN0aW9uLWRvZ2Zvb2Qtd29ya2Zsb3cnO1xuaW1wb3J0IHsgQWN0aW9uU29uYXJXb3JrZmxvdyB9IGZyb20gJy4vYWN0aW9uLXNvbmFyLXdvcmtmbG93JztcbmltcG9ydCB7IERFRkFVTFRfR0hFX1RPS0VOX1NFQ1JFVCB9IGZyb20gJy4uL2NvbW1vbi9jb25zdGFudHMnO1xuaW1wb3J0IHsgYWRkRWRpdG9yQ29uZmlnIH0gZnJvbSAnLi4vY29tbW9uL2VkaXRvcmNvbmZpZyc7XG5pbXBvcnQgeyBhcHBseUludGVybmFsQWN0aW9uT3ZlcnJpZGVzIH0gZnJvbSAnLi4vY29tbW9uL2ludGVybmFsLWFjdGlvbnMnO1xuaW1wb3J0IHsgUHJvamVuRHJpZnRDaGVja1dvcmtmbG93IH0gZnJvbSAnLi4vY29tbW9uL3Byb2plbi1kcmlmdC1jaGVjay13b3JrZmxvdyc7XG5pbXBvcnQgeyBhdHRhY2hUeXBlU2NyaXB0UHJvamVucmMgfSBmcm9tICcuLi9jb21tb24vcHJvamVucmMtdHMnO1xuaW1wb3J0IHsgV29ya2Zsb3dDaGFuZ2VOb3RpY2VXb3JrZmxvdyB9IGZyb20gJy4uL2NvbW1vbi93b3JrZmxvdy1jaGFuZ2Utbm90aWNlLXdvcmtmbG93JztcbmltcG9ydCB7IG5vdGVXb3JrZmxvd1B1cnBvc2UgfSBmcm9tICcuLi9jb21tb24vd29ya2Zsb3ctcHVycG9zZSc7XG5cbi8vIGByZXF1aXJlKCdwcm9qZW4vcGFja2FnZS5qc29uJylgL2ByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKWAgcmVzb2x2ZVxuLy8gdmlhIE5vZGUncyBub3JtYWwgbW9kdWxlIHJlc29sdXRpb24sIHNvIGluIGEgKnB1Ymxpc2hlZCogcGFja2FnZSB0aGVzZVxuLy8gcmVhZCB0aGUgdmVyc2lvbnMgYWN0dWFsbHkgaW5zdGFsbGVkIGluIHRoZSBjb25zdW1pbmcgcmVwbydzXG4vLyBub2RlX21vZHVsZXMgLSBleGFjdGx5IHRoZSBcIlBST0pFTl9WRVJTSU9OIG9mIHRoZSBzeW50aFwiIC8gXCJ2ZXJzaW9uIG9mXG4vLyB0aGlzIHBhY2thZ2UgdGhhdCBzY2FmZm9sZGVkIHRoZSByZXBvXCIgdGhlIHByaXZhdGUgcGFja2FnZS5qc29uJ3Ncbi8vIGRldkRlcGVuZGVuY2llcyBuZWVkIHRvIHBpbiAoc2VlIEYwMTAgQ0ktZGVwZW5kZW5jaWVzIHNlY3Rpb24pLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IFBST0pFTl9WRVJTSU9OOiBzdHJpbmcgPSByZXF1aXJlKCdwcm9qZW4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5jb25zdCBQUk9KRU5fVFlQRVNfVkVSU0lPTjogc3RyaW5nID0gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcblxuLy8gRXhhY3QgcGluLCByZWNvcmRlZCBhcyBhIGNvbXBvbmVudCBjb25zdGFudCAoQUQtMDAxOiBubyBsYXRlc3QvbW92aW5nXG4vLyB0YWcvc2VtdmVyIHJhbmdlIGluIGFueXRoaW5nIGEgZ2VuZXJhdGVkIHJlcG8gZGVwZW5kcyBvbikuIFVwZ3JhZGluZyB0aGlzXG4vLyBpcyBhIHJldmlld2VkIGRpZmYgb2YgdGhpcyBmaWxlLlxuY29uc3QgQ09NTUlUX0FORF9UQUdfVkVSU0lPTiA9ICcxMy4yLjEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YkFjdGlvblByb2plY3RPcHRpb25zXG4gIGV4dGVuZHMgZ2l0aHViLkdpdEh1YlByb2plY3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIE9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoZSBhY3Rpb24uIFVzZWQgaW4gdGhlIGRlZmF1bHQgUkVBRE1FXG4gICAqIHRlbXBsYXRlIGFuZCByZWNvcmRlZCBpbiB0aGUgcHJpdmF0ZSBgcGFja2FnZS5qc29uYC5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBHaXRIdWIgQWN0aW9ucyBzZWNyZXQgaG9sZGluZyB0aGUgUEFUIHVzZWQgZm9yXG4gICAqIHByb2plbi1hdXRvbWF0aW9uIFBSIGNvbW1lbnRzIChGMDAzKSBhbmQsIHdoZW4gdGhlIGFjdGlvbiBoYXMgYVxuICAgKiBgdG9rZW5gIGlucHV0LCB0aGUgZG9nZm9vZCdzIGludm9jYXRpb24gb2YgaXQuXG4gICAqIEBkZWZhdWx0IFwiUFJPSkVOX0dJVEhVQl9UT0tFTlwiXG4gICAqL1xuICByZWFkb25seSBnaGVUb2tlblNlY3JldD86IHN0cmluZztcblxuICAvKipcbiAgICogVVJMIG9mIHRoZSBvcmcncyBTb25hckNsb3VkIGluc3RhbmNlIChlLmcuIGBodHRwczovL3NvbmFyY2xvdWQuaW9gKS5cbiAgICogTVVTVCBiZSByZWFjaGFibGUgZnJvbSBnaXRodWIuY29tLWhvc3RlZCAocHVibGljKSBydW5uZXJzIChBRC0wMDEpLlxuICAgKiBSZXF1aXJlZCwgbm8gZGVmYXVsdDogYSBndWVzc2VkIHNlcnZlciBpcyB3b3JzZSB0aGFuIGEgbG91ZCBmYWlsdXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgc29uYXJIb3N0VXJsOiBzdHJpbmc7XG5cbiAgLyoqIEBkZWZhdWx0IFwiU09OQVJfVE9LRU5cIiAqL1xuICByZWFkb25seSBzb25hclRva2VuU2VjcmV0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGBzb25hci55bWxgIGFsc28gcnVucyBvbiBgcHVsbF9yZXF1ZXN0YCBhcyBhIHBhc3MvZmFpbCBnYXRlLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBzb25hclB1bGxSZXF1ZXN0R2F0ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBkb2dmb29kIHNjZW5hcmlvIChBRC0wMDEpLiBXaGF0IGZpeHR1cmUgc3RhdGUsIHdoYXQgdG8gYXNzZXJ0LCBhbmRcbiAgICogaG93IHRvIGNsZWFuIHVwIGFyZSBzcGVjaWZpZWQgYnkgdGhlIGFjdGlvbidzIG93biBGIyMjIHNwZWMgLSB0aGVcbiAgICogaGlnaGVzdC1yaXNrIGJlaGF2aW9yIG9mIHRoYXQgYWN0aW9uLlxuICAgKlxuICAgKiBJdHMgdHlwZSBpcyBhIHN0cnVjdCwgd2hpY2ggcHJvamVuJ3MgQ0xJIGNhbm5vdCByZW5kZXIgaW50byBhIHByb2plbnJjLFxuICAgKiBzbyBpdCBjYW4gb25seSBiZSB3cml0dGVuIGJ5IGhhbmQgLSBpdCBpcyB0aGVyZWZvcmUgb3B0aW9uYWwsIGJlY2F1c2UgYVxuICAgKiAqcmVxdWlyZWQqIG9wdGlvbiBgcHJvamVuIG5ld2AgY2Fubm90IHN1cHBseSB3b3VsZCBtYWtlIHRoaXMgcHJvamVjdFxuICAgKiB0eXBlIGltcG9zc2libGUgdG8gc2NhZmZvbGQuIEFELTAwMSdzIFwibmV2ZXIgYSBzaWxlbnQgbm8tb3AgZG9nZm9vZFwiXG4gICAqIHJ1bGUgaXMgZW5mb3JjZWQgaW5zdGVhZCBieSB0aGUgd29ya2Zsb3cgaXQgZ2VuZXJhdGVzIGluIHRoYXQgY2FzZTogYVxuICAgKiBzaW5nbGUgc3RlcCB0aGF0IGZhaWxzIG9uIGV2ZXJ5IFBSIHVudGlsIGEgc2NlbmFyaW8gaXMgZGVjbGFyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYHRlc3QtZG9nZm9vZC55bWxgIHJ1bnMgb25lIGZhaWxpbmcgc3RlcCB0aGF0IHRlbGxzIHlvdSB0b1xuICAgKiBkZWNsYXJlIGEgc2NlbmFyaW9cbiAgICovXG4gIHJlYWRvbmx5IGRvZ2Zvb2Q/OiBBY3Rpb25Eb2dmb29kT3B0aW9ucztcblxuICAvKipcbiAgICogU1BEWCBpZGVudGlmaWVyIGZvciB0aGUgZ2VuZXJhdGVkIGBMSUNFTlNFYC5cbiAgICogQGRlZmF1bHQgXCJNSVRcIlxuICAgKi9cbiAgcmVhZG9ubHkgbGljZW5zZT86IHN0cmluZztcblxuICAvKipcbiAgICogV3JpdGUgYSBwcm9qZW4tbWFuYWdlZCBgLmVkaXRvcmNvbmZpZ2AuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVkaXRvcmNvbmZpZz86IGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRSZWFkbWVDb250ZW50cyhvcHRpb25zOiBHaXRIdWJBY3Rpb25Qcm9qZWN0T3B0aW9ucyk6IHN0cmluZyB7XG4gIHJldHVybiBgIyAke29wdGlvbnMubmFtZX1cblxuJHtvcHRpb25zLmRlc2NyaXB0aW9uID8/ICcnfVxuXG4jIyBVc2FnZVxuXG5cXGBcXGBcXGB5YW1sXG4tIHVzZXM6IHhwZXJ0c3MvJHtvcHRpb25zLm5hbWV9QDxyZWY+XG5cXGBcXGBcXGBcblxuIyMgQnVtcGluZ1xuXG5BIFxcYGZlYXQ6XFxgL1xcYGZpeDpcXGAgY29tbWl0IHB1c2hlZCB0byBcXGBtYWluXFxgIGlzIHJlbGVhc2VkIGF1dG9tYXRpY2FsbHk6IGJ1bXAsXG50YWcgXFxgdlguWS5aXFxgLCBHaXRIdWIgUmVsZWFzZS4gU2VlIFxcYC5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sXFxgLlxuXG4jIyBUcnVzdCBjb250cmFjdFxuXG5UaGlzIGlzIGEgY29tcG9zaXRlIChzaGVsbCkgYWN0aW9uIC0gbm8gTm9kZS9ucG0gYXQgcnVudGltZSwgbm8gRG9ja2VyLiBJdHNcbkNJIGxpbnQgZ2F0ZSAoXFxgYnVpbGQueW1sXFxgKSwgZG9nZm9vZCB0ZXN0IChcXGB0ZXN0LWRvZ2Zvb2QueW1sXFxgKSwgYW5kIFNvbmFyXG5zY2FuIChcXGBzb25hci55bWxcXGApIGFyZSBzY2FmZm9sZGVkIGJ5IFxcYEB4cGVydHNzL3Byb2plbi10eXBlc1xcYCdcblxcYEdpdEh1YkFjdGlvblByb2plY3RcXGA7IG9ubHkgXFxgYWN0aW9uLnltbFxcYCBhbmQgaXRzIHNoZWxsIHNjcmlwdHMgYXJlXG5oYW5kLWNvbW1pdHRlZC5cbmA7XG59XG5cbi8qKlxuICogU2NhZmZvbGRzIHRoZSByZXBvIGxpZmVjeWNsZSAoQUQtMDAxKSBhcm91bmQgYSBoYW5kLWNvbW1pdHRlZCwgY29tcG9zaXRlXG4gKiAoc2hlbGwpIEdpdEh1YiBBY3Rpb246IHRoZSBgYnVpbGRgL2B0ZXN0LWRvZ2Zvb2RgL2Bzb25hcmAvYHJlbGVhc2VgXG4gICogd29ya2Zsb3dzLCB2ZXJzaW9uaW5nIGFuZCByZWxlYXNlIGRpc2NpcGxpbmUsIHRoZSBGMDAzIHZlcmlmeSBjb21wb25lbnRzLFxuICAqIGFuZCByZXBvIGJvaWxlcnBsYXRlIChhIHByaXZhdGUgdmVyc2lvbi1zb3VyY2UgYHBhY2thZ2UuanNvbmAsIGAueWFtbGxpbnRgLFxuICAqIGBMSUNFTlNFYCwgYW5kIGEgYFJFQURNRS5tZGAgdGVtcGxhdGUpLiBUaGVcbiAqIGFjdGlvbidzIG93biBjb250ZW50XG4gKiAoYGFjdGlvbi55bWxgLCBpdHMgc2hlbGwgc2NyaXB0cywgYHRlc3QvYCBmaXh0dXJlcykgaXMgYXV0aG9yZWQgYnkgaGFuZFxuICogcGVyIHRoZSBhY3Rpb24ncyBvd24gRiMjIyBzcGVjIC0gdGhpcyB0eXBlIG9ubHkgbGludHMgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBHaXRIdWJBY3Rpb25Qcm9qZWN0IGV4dGVuZHMgZ2l0aHViLkdpdEh1YlByb2plY3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgYnVpbGRXb3JrZmxvdzogQWN0aW9uQnVpbGRXb3JrZmxvdztcbiAgcHVibGljIHJlYWRvbmx5IGRvZ2Zvb2RXb3JrZmxvdzogQWN0aW9uRG9nZm9vZFdvcmtmbG93O1xuICBwdWJsaWMgcmVhZG9ubHkgc29uYXJXb3JrZmxvdzogQWN0aW9uU29uYXJXb3JrZmxvdztcbiAgcHVibGljIHJlYWRvbmx5IHJlbGVhc2U6IHJlbGVhc2UuUmVsZWFzZTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBHaXRIdWJBY3Rpb25Qcm9qZWN0T3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucy5zb25hckhvc3RVcmwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2l0SHViQWN0aW9uUHJvamVjdCByZXF1aXJlcyBzb25hckhvc3RVcmwnKTtcbiAgICB9XG4gICAgLy8gQSBkZWNsYXJlZC1idXQtaW5jb21wbGV0ZSBkb2dmb29kIGlzIHN0aWxsIGFuIGVycm9yIC0gc2VlXG4gICAgLy8gYEFjdGlvbkRvZ2Zvb2RXb3JrZmxvd2AsIHdoaWNoIG93bnMgdGhhdCBjaGVjayAoYW5kIHRoZVxuICAgIC8vIG5vLWRvZ2Zvb2QtZGVjbGFyZWQgY2FzZSkuXG5cbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgLy8gUFIgdGl0bGVzIGFyZSBub3QgZ2F0ZWQ6IGBmZWF0OmAvYGZpeDpgIG1hdHRlciBvbmx5IGJlY2F1c2UgdGhleSBkcml2ZVxuICAgICAgLy8gdGhlIHJlbGVhc2Ugd29ya2Zsb3cgKHZpYSBgcmVsZWFzYWJsZUNvbW1pdHNgKSwgbm90IFBSIGNoZWNrcy4gVGhlXG4gICAgICAvLyBjb252ZW50aW9uYWwtY29tbWl0IFBSLXRpdGxlIGxpbnQgaXMgYWRkZWQgYnkgdGhlIGBHaXRIdWJgIGNvbXBvbmVudFxuICAgICAgLy8gdW5sZXNzIGBnaXRodWJPcHRpb25zLnB1bGxSZXF1ZXN0TGludGAgaXMgYGZhbHNlYCAoaXQgZGVmYXVsdHMgdHJ1ZSkuXG4gICAgICBnaXRodWJPcHRpb25zOiB7IC4uLm9wdGlvbnMuZ2l0aHViT3B0aW9ucywgcHVsbFJlcXVlc3RMaW50OiBmYWxzZSB9LFxuICAgICAgcmVhZG1lOiBvcHRpb25zLnJlYWRtZSA/PyB7IGNvbnRlbnRzOiBkZWZhdWx0UmVhZG1lQ29udGVudHMob3B0aW9ucykgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGdoID0gdGhpcy5naXRodWI7XG4gICAgaWYgKCFnaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnR2l0SHViQWN0aW9uUHJvamVjdCByZXF1aXJlcyBHaXRIdWIgaW50ZWdyYXRpb24gdG8gYmUgZW5hYmxlZCcsXG4gICAgICApO1xuICAgIH1cbiAgICBhcHBseUludGVybmFsQWN0aW9uT3ZlcnJpZGVzKGdoKTtcblxuICAgIC8vIEpldEJyYWlucyBJREUgc3RhdGUgKC5pZGVhLykgaXMgbmV2ZXIgdHJhY2tlZCBpbiBnZW5lcmF0ZWQgcmVwb3MsIGFuZFxuICAgIC8vIG5laXRoZXIgaXMgL3NwZWMvIChsb2NhbCBwbGFucyBhbmQgc3BlY3M7IHRoZSBwYXR0ZXJuIGNvdmVycyBldmVyeVxuICAgIC8vIHN1YmRpcmVjdG9yeSkuXG4gICAgdGhpcy5hZGRHaXRJZ25vcmUoJy8uaWRlYS8qJyk7XG4gICAgdGhpcy5hZGRHaXRJZ25vcmUoJy9zcGVjLycpO1xuXG4gICAgaWYgKG9wdGlvbnMuZWRpdG9yY29uZmlnID8/IHRydWUpIHtcbiAgICAgIGFkZEVkaXRvckNvbmZpZyh0aGlzKTtcbiAgICB9XG5cbiAgICBuZXcgUHJvamVuRHJpZnRDaGVja1dvcmtmbG93KHRoaXMsIHtcbiAgICAgIGdoZVRva2VuU2VjcmV0OiBvcHRpb25zLmdoZVRva2VuU2VjcmV0ID8/IERFRkFVTFRfR0hFX1RPS0VOX1NFQ1JFVCxcbiAgICB9KTtcbiAgICBuZXcgV29ya2Zsb3dDaGFuZ2VOb3RpY2VXb3JrZmxvdyh0aGlzKTtcblxuICAgIG5ldyBMaWNlbnNlKHRoaXMsIHtcbiAgICAgIHNwZHg6IG9wdGlvbnMubGljZW5zZSA/PyAnTUlUJyxcbiAgICAgIGNvcHlyaWdodE93bmVyOiAneHBlcnRzcycsXG4gICAgfSk7XG5cbiAgICAvLyBgLnByb2plbnJjLnRzYCArIGBucHggcHJvamVuYCwgc2FtZSBhcyBldmVyeSBvdGhlciB0eXBlIGhlcmUuIEEgYmFyZVxuICAgIC8vIEdpdEh1YlByb2plY3QgaGFzIG5vIGRlZmF1bHQgdGFzayB0aGF0IHJ1bnMgYSBwcm9qZW5yYyBvbiBpdHMgb3duLCBzb1xuICAgIC8vIHRoaXMgaXMgd2hhdCBtYWtlcyBgbnB4IHByb2plbmAgd29yayBpbiB0aGUgZ2VuZXJhdGVkIHJlcG8gYXQgYWxsLlxuICAgIGF0dGFjaFR5cGVTY3JpcHRQcm9qZW5yYyh0aGlzKTtcblxuICAgIC8vIHByb2plbiBtYXJrcyBnZW5lcmF0ZWQgZmlsZXMgcmVhZC1vbmx5ICgwNDQ0KSBvbiBkaXNrIGJ5IGRlZmF1bHQsIGJ1dFxuICAgIC8vIHRoaXMgb25lIG11c3Qgc3RheSBvd25lci13cml0YWJsZTogdGhlIGRvY3VtZW50ZWQgdXBkYXRlIGZsb3dcbiAgICAvLyAoYG5wbSBpIC1EIEB4cGVydHNzL3Byb2plbi10eXBlc0BsYXRlc3RgKSBuZWVkcyBucG0gdG8gcmV3cml0ZSB0aGVcbiAgICAvLyBwaW5uZWQgdmVyc2lvbnMgaW4gYW4gZXhpc3RpbmcgcmVwby4gSGFuZC1lZGl0cyBhcmUgc3RpbGwgY2F1Z2h0IGJ5XG4gICAgLy8gdGhlIGRyaWZ0IGNoZWNrLlxuICAgIG5ldyBKc29uRmlsZSh0aGlzLCAncGFja2FnZS5qc29uJywge1xuICAgICAgb2JqOiB7XG4gICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgdmVyc2lvbjogJzAuMC4wJyxcbiAgICAgICAgcHJpdmF0ZTogdHJ1ZSxcbiAgICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgICAgIGRldkRlcGVuZGVuY2llczoge1xuICAgICAgICAgICdwcm9qZW4nOiBQUk9KRU5fVkVSU0lPTixcbiAgICAgICAgICAnQHhwZXJ0c3MvcHJvamVuLXR5cGVzJzogUFJPSkVOX1RZUEVTX1ZFUlNJT04sXG4gICAgICAgICAgJ2NvbW1pdC1hbmQtdGFnLXZlcnNpb24nOiBDT01NSVRfQU5EX1RBR19WRVJTSU9OLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlYWRvbmx5OiBmYWxzZSxcbiAgICB9KTtcblxuICAgIG5ldyBZYW1sRmlsZSh0aGlzLCAnLnlhbWxsaW50Jywge1xuICAgICAgb2JqOiB7XG4gICAgICAgIGV4dGVuZHM6ICdkZWZhdWx0JyxcbiAgICAgICAgcnVsZXM6IHsgJ2xpbmUtbGVuZ3RoJzogeyBtYXg6IDEyMCB9IH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5idWlsZFdvcmtmbG93ID0gbmV3IEFjdGlvbkJ1aWxkV29ya2Zsb3codGhpcyk7XG5cbiAgICB0aGlzLmRvZ2Zvb2RXb3JrZmxvdyA9IG5ldyBBY3Rpb25Eb2dmb29kV29ya2Zsb3codGhpcywgb3B0aW9ucy5kb2dmb29kKTtcblxuICAgIHRoaXMuc29uYXJXb3JrZmxvdyA9IG5ldyBBY3Rpb25Tb25hcldvcmtmbG93KHRoaXMsIHtcbiAgICAgIHNvbmFySG9zdFVybDogb3B0aW9ucy5zb25hckhvc3RVcmwsXG4gICAgICBzb25hclRva2VuU2VjcmV0OiBvcHRpb25zLnNvbmFyVG9rZW5TZWNyZXQsXG4gICAgICBzb25hclB1bGxSZXF1ZXN0R2F0ZTogb3B0aW9ucy5zb25hclB1bGxSZXF1ZXN0R2F0ZSxcbiAgICB9KTtcblxuICAgIC8vIGBnaXRodWJSZWxlYXNlYCBkZWZhdWx0cyB0byB0cnVlLCB3aGljaCBhdXRvLXdpcmVzXG4gICAgLy8gYHB1Ymxpc2hUb0dpdEh1YlJlbGVhc2VzYCAtIGl0cyBgZ2ggcmVsZWFzZSBjcmVhdGUgLi4uIC0tdGFyZ2V0XG4gICAgLy8gJEdJVEhVQl9TSEFgIGNyZWF0ZXMgdGhlIHRhZyAqYW5kKiB0aGUgcmVsZWFzZSB0b2dldGhlciBmb3Igb3VyXG4gICAgLy8gY29udGludW91cyAocHVzaC10by1tYWluKSB0cmlnZ2VyLiBObyBzZXBhcmF0ZSBgcHVibGlzaFRvR2l0YCBjYWxsXG4gICAgLy8gbmVlZGVkICh0aGF0IHBhdGggb25seSBmaXJlcyBmb3IgYSBtYW51YWwgcmVsZWFzZSB0cmlnZ2VyKS5cbiAgICB0aGlzLnJlbGVhc2UgPSBuZXcgcmVsZWFzZS5SZWxlYXNlKHRoaXMsIHtcbiAgICAgIGJyYW5jaDogJ21haW4nLFxuICAgICAgLy8gTm8gYnVpbGQgYXJ0aWZhY3QgZm9yIGEgY29tcG9zaXRlIGFjdGlvbiAoQUQtMDAxKSAtIHRoaXMgaXMgb25seVxuICAgICAgLy8gd2hlcmUgUmVsZWFzZSBzdGFnZXMgaXRzIG93biB2ZXJzaW9uL2NoYW5nZWxvZyBmaWxlcy5cbiAgICAgIGFydGlmYWN0c0RpcmVjdG9yeTogJ2Rpc3QnLFxuICAgICAgdGFza3M6IFt0aGlzLmJ1aWxkV29ya2Zsb3cudGFza10sXG4gICAgICB2ZXJzaW9uRmlsZTogJ3BhY2thZ2UuanNvbicsXG4gICAgICByZWxlYXNhYmxlQ29tbWl0czogUmVsZWFzYWJsZUNvbW1pdHMuZmVhdHVyZXNBbmRGaXhlcygpLFxuICAgICAgcmVsZWFzZVRyaWdnZXI6IHJlbGVhc2UuUmVsZWFzZVRyaWdnZXIuY29udGludW91cygpLFxuICAgICAgYnVtcFBhY2thZ2U6IGBjb21taXQtYW5kLXRhZy12ZXJzaW9uQCR7Q09NTUlUX0FORF9UQUdfVkVSU0lPTn1gLFxuICAgICAgcmVsZWFzZVdvcmtmbG93U2V0dXBTdGVwczogW1xuICAgICAgICB7IG5hbWU6ICdJbnN0YWxsIGRlcGVuZGVuY2llcycsIHJ1bjogJ25wbSBjaScgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgcmVsZWFzZSB3b3JrZmxvdyBpcyBjcmVhdGVkIGluc2lkZSBgcmVsZWFzZS5SZWxlYXNlYCAocHJvamVuXG4gICAgLy8gaW50ZXJuYWwpLCBub3QgYnkgdGhpcyB0eXBlIC0gcmVhY2ggaXRzIGZpbGUgYnkgcGF0aCB0byBhbm5vdGF0ZSBpdFxuICAgIC8vIGxpa2UgZXZlcnkgb3RoZXIgZ2VuZXJhdGVkIHdvcmtmbG93LiBUaGlzIHR5cGUgaXMgYWx3YXlzIGEgcm9vdFxuICAgIC8vIHByb2plY3QsIHNvIHByb2plbiBuYW1lcyBpdCBgcmVsZWFzZS55bWxgLlxuICAgIG5vdGVXb3JrZmxvd1B1cnBvc2UoXG4gICAgICB0aGlzLnRyeUZpbmRGaWxlKCcuZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLnltbCcpLFxuICAgICAgJ0NvbnRpbnVvdXMgcmVsZWFzZSBvbiBwdXNoIHRvIG1haW46IGJ1bXAgdmVyc2lvbiwgdGFnLCBhbmQgY3JlYXRlIGEgR2l0SHViIFJlbGVhc2UuJyxcbiAgICApO1xuICB9XG59XG4iXX0=
@@ -8,7 +8,7 @@ const projen_1 = require("projen");
8
8
  * layered on top of `CdkTypescriptProject`'s pure-infra scaffold.
9
9
  */
10
10
  class AppRuntimeScaffold extends projen_1.Component {
11
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.AppRuntimeScaffold", version: "0.0.13" };
11
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.AppRuntimeScaffold", version: "0.0.14" };
12
12
  constructor(project, appEntryPoint = 'src/app.ts') {
13
13
  super(project, 'AppRuntimeScaffold');
14
14
  const app = new projen_1.SourceCode(project, appEntryPoint);
@@ -13,7 +13,7 @@ const workflow_purpose_1 = require("../common/workflow-purpose");
13
13
  * application source, a database, and an app-level build/test workflow.
14
14
  */
15
15
  class CdkAppProject extends cdk_infra_project_1.CdkInfraProject {
16
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.CdkAppProject", version: "0.0.13" };
16
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.CdkAppProject", version: "0.0.14" };
17
17
  constructor(options) {
18
18
  super(options);
19
19
  new app_runtime_scaffold_1.AppRuntimeScaffold(this, options.appEntryPoint ?? 'src/app.ts');
@@ -11,7 +11,7 @@ const edge_networking_constructs_1 = require("./components/edge-networking-const
11
11
  * externally-built images). Reference example: SimulcastAVDelivery.
12
12
  */
13
13
  class CdkInfraProject extends cdk_typescript_base_1.CdkTypescriptProject {
14
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.CdkInfraProject", version: "0.0.13" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.CdkInfraProject", version: "0.0.14" };
15
15
  constructor(options) {
16
16
  super(options);
17
17
  if (options.ecrEcs?.enabled) {