@xpertss/projen-types 0.0.6 → 0.0.8

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 (39) hide show
  1. package/.jsii +62 -174
  2. package/API.md +20 -329
  3. package/README.md +20 -5
  4. package/lib/actions/action-build-workflow.js +4 -2
  5. package/lib/actions/action-dogfood-workflow.js +4 -2
  6. package/lib/actions/action-sonar-workflow.d.ts +6 -6
  7. package/lib/actions/action-sonar-workflow.js +8 -6
  8. package/lib/actions/github-action-project.d.ts +7 -7
  9. package/lib/actions/github-action-project.js +13 -7
  10. package/lib/cdk/app-runtime-scaffold.js +1 -1
  11. package/lib/cdk/cdk-app-project.js +5 -3
  12. package/lib/cdk/cdk-infra-project.js +1 -1
  13. package/lib/cdk/cdk-typescript-base.js +19 -4
  14. package/lib/cdk/components/ecr-ecs-constructs.js +1 -1
  15. package/lib/cdk/components/edge-networking-constructs.js +1 -1
  16. package/lib/cdk/database-component.js +1 -1
  17. package/lib/common/manual-deploy-workflow.js +3 -1
  18. package/lib/common/projen-drift-check-workflow.js +4 -2
  19. package/lib/common/upgrade-workflow.js +3 -1
  20. package/lib/common/workflow-change-notice-workflow.js +4 -2
  21. package/lib/common/workflow-purpose.d.ts +21 -0
  22. package/lib/common/workflow-purpose.js +51 -0
  23. package/lib/index.d.ts +0 -1
  24. package/lib/index.js +1 -2
  25. package/lib/java/components/cdk-deploy-hook.js +1 -1
  26. package/lib/java/components/code-index-workflow.js +5 -3
  27. package/lib/java/components/docker-publish.js +5 -3
  28. package/lib/java/components/flyway-migration.js +1 -1
  29. package/lib/java/components/github-packages-publish.js +5 -3
  30. package/lib/java/components/maven-central-publish.js +5 -3
  31. package/lib/java/java-app-project.js +1 -1
  32. package/lib/java/java-library-project.js +1 -1
  33. package/lib/java/java-maven-base.js +7 -4
  34. package/lib/java/java-service-project.js +1 -1
  35. package/lib/java/options.d.ts +1 -1
  36. package/lib/java/options.js +1 -1
  37. package/package.json +1 -1
  38. package/lib/common/actions-allowlist-guard.d.ts +0 -37
  39. package/lib/common/actions-allowlist-guard.js +0 -70
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qYXZhL29wdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudmlyb25tZW50T3B0aW9ucyB9IGZyb20gJy4uL2NvbW1vbi9lbnZpcm9ubWVudC1vcHRpb25zJztcblxuZXhwb3J0IGludGVyZmFjZSBDb21tb25KYXZhT3B0aW9ucyB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZ3JvdXBJZDogc3RyaW5nO1xuICByZWFkb25seSBhcnRpZmFjdElkOiBzdHJpbmc7XG5cbiAgLyoqIEBkZWZhdWx0IFwiMC4xLjBcIiAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKiBTb25hclF1YmUgcHJvamVjdCBrZXkuIElmIHVuc2V0LCB0aGUgc29uYXIgc2NhbiBzdGVwIGlzIHNraXBwZWQuICovXG4gIHJlYWRvbmx5IHNvbmFyUHJvamVjdEtleT86IHN0cmluZztcblxuICAvKiogQGRlZmF1bHQgXCJQUk9KRU5fR0lUSFVCX1RPS0VOXCIgKi9cbiAgcmVhZG9ubHkgZ2hlVG9rZW5TZWNyZXQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSmF2YUxpYnJhcnlQcm9qZWN0T3B0aW9ucyBleHRlbmRzIENvbW1vbkphdmFPcHRpb25zIHtcbiAgLyoqIFVzZSBNYXZlbiBDZW50cmFsJ3MgT0lEQyB0cnVzdGVkLXB1Ymxpc2hpbmcgZmxvdyBpbnN0ZWFkIG9mIHNlY3JldC1iYXNlZCBHUEcgc2lnbmluZy4gKi9cbiAgcmVhZG9ubHkgbWF2ZW5DZW50cmFsT2lkYz86IGJvb2xlYW47XG5cbiAgLyoqIEBkZWZhdWx0IHRydWUgKi9cbiAgcmVhZG9ubHkgcHVibGlzaENvZGVJbmRleD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrRGVwbG95SG9va09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGNvbXBhbmlvbiBDREsgaW5mcmEvYXBwIHJlcG8gKG93bmVyL3JlcG8pIHRoYXQgb3ducyB0aGUgYWN0dWFsXG4gICAqIGluZnJhc3RydWN0dXJlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSB3b3JrZmxvdyBpcyBzdGlsbCBnZW5lcmF0ZWQsIGJ1dCBpdHMgb25seSBzdGVwIGZhaWxzIHdpdGhcbiAgICogaW5zdHJ1Y3Rpb25zIChzZWUgYENka0RlcGxveUhvb2tgKVxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UmVwbz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBKYXZhU2VydmljZVByb2plY3RPcHRpb25zIGV4dGVuZHMgQ29tbW9uSmF2YU9wdGlvbnMge1xuICAvKiogQGRlZmF1bHQgXCJkb2NrZXIuaW9cIiAqL1xuICByZWFkb25seSBkb2NrZXJSZWdpc3RyeT86IHN0cmluZztcblxuICAvKiogQGRlZmF1bHQgdHJ1ZSAqL1xuICByZWFkb25seSB1c2VGbHl3YXk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgY29tcGFuaW9uIENESyBpbmZyYS9hcHAgcmVwbyAoYG93bmVyL3JlcG9gKSB3aG9zZSBgZGVwbG95LnltbGAgdGhlXG4gICAqIGBkZXBsb3ktY2RrYCB3b3JrZmxvdyBkaXNwYXRjaGVzLlxuICAgKlxuICAgKiBBIHBsYWluIHN0cmluZyByYXRoZXIgdGhhbiBhIG5lc3RlZCBzdHJ1Y3Qgc28gdGhhdFxuICAgKiBgcHJvamVuIG5ldyAtLWZyb20gQHhwZXJ0c3MvcHJvamVuLXR5cGVzIGphdmFfc2VydmljZWAgY2FuIHBhc3MgaXRcbiAgICogKGAtLWNkay1kZXBsb3ktdGFyZ2V0LXJlcG8gb3duZXIvcmVwb2ApOiBwcm9qZW4ncyBDTEkgY2FuIG9ubHkgcmVuZGVyXG4gICAqIG9wdGlvbnMgd2hvc2UgdHlwZSBpcyBhIHN0cmluZy9udW1iZXIvYm9vbGVhbi9hcnJheS9lbnVtLCBzbyBhXG4gICAqIHN0cnVjdC10eXBlZCBvcHRpb24gaXMgaW52aXNpYmxlIHRvIGl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGBkZXBsb3ktY2RrLnltbGAgaXMgZ2VuZXJhdGVkIHdpdGggYSBzaW5nbGUgZmFpbGluZyBzdGVwIHRoYXRcbiAgICogdGVsbHMgeW91IHRvIHNldCB0aGlzXG4gICAqL1xuICByZWFkb25seSBjZGtEZXBsb3lUYXJnZXRSZXBvPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIHRoZSBgZGVwbG95LWNka2Agd29ya2Zsb3cgYXQgYWxsLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBjZGtEZXBsb3lIb29rPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGVwbG95IHRhcmdldHMgdG8gb2ZmZXIgb24gdGhlIGBDZGtEZXBsb3lIb29rYCdzIG1hbnVhbC1kaXNwYXRjaFxuICAgKiB3b3JrZmxvdywgd2hlbiB0aGUgaG9vayBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbXCJwcm9kXCJdXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudHM/OiAoc3RyaW5nIHwgRW52aXJvbm1lbnRPcHRpb25zKVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEphdmFBcHBQcm9qZWN0T3B0aW9ucyBleHRlbmRzIENvbW1vbkphdmFPcHRpb25zIHtcbiAgLyoqIEBkZWZhdWx0IFwiaHR0cHM6Ly9tYXZlbi5wa2cuZ2l0aHViLmNvbS9PV05FUi9SRVBPXCIgKGRlcml2ZWQgZnJvbSB0aGUgcmVwb3NpdG9yeSBVUkwpICovXG4gIHJlYWRvbmx5IGdoUGFja2FnZXNSZWdpc3RyeT86IHN0cmluZztcbn1cbiJdfQ==
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qYXZhL29wdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudmlyb25tZW50T3B0aW9ucyB9IGZyb20gJy4uL2NvbW1vbi9lbnZpcm9ubWVudC1vcHRpb25zJztcblxuZXhwb3J0IGludGVyZmFjZSBDb21tb25KYXZhT3B0aW9ucyB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZ3JvdXBJZDogc3RyaW5nO1xuICByZWFkb25seSBhcnRpZmFjdElkOiBzdHJpbmc7XG5cbiAgLyoqIEBkZWZhdWx0IFwiMC4xLjBcIiAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKiBTb25hckNsb3VkIHByb2plY3Qga2V5LiBJZiB1bnNldCwgdGhlIHNvbmFyIHNjYW4gc3RlcCBpcyBza2lwcGVkLiAqL1xuICByZWFkb25seSBzb25hclByb2plY3RLZXk/OiBzdHJpbmc7XG5cbiAgLyoqIEBkZWZhdWx0IFwiUFJPSkVOX0dJVEhVQl9UT0tFTlwiICovXG4gIHJlYWRvbmx5IGdoZVRva2VuU2VjcmV0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEphdmFMaWJyYXJ5UHJvamVjdE9wdGlvbnMgZXh0ZW5kcyBDb21tb25KYXZhT3B0aW9ucyB7XG4gIC8qKiBVc2UgTWF2ZW4gQ2VudHJhbCdzIE9JREMgdHJ1c3RlZC1wdWJsaXNoaW5nIGZsb3cgaW5zdGVhZCBvZiBzZWNyZXQtYmFzZWQgR1BHIHNpZ25pbmcuICovXG4gIHJlYWRvbmx5IG1hdmVuQ2VudHJhbE9pZGM/OiBib29sZWFuO1xuXG4gIC8qKiBAZGVmYXVsdCB0cnVlICovXG4gIHJlYWRvbmx5IHB1Ymxpc2hDb2RlSW5kZXg/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENka0RlcGxveUhvb2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21wYW5pb24gQ0RLIGluZnJhL2FwcCByZXBvIChvd25lci9yZXBvKSB0aGF0IG93bnMgdGhlIGFjdHVhbFxuICAgKiBpbmZyYXN0cnVjdHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgd29ya2Zsb3cgaXMgc3RpbGwgZ2VuZXJhdGVkLCBidXQgaXRzIG9ubHkgc3RlcCBmYWlscyB3aXRoXG4gICAqIGluc3RydWN0aW9ucyAoc2VlIGBDZGtEZXBsb3lIb29rYClcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFJlcG8/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSmF2YVNlcnZpY2VQcm9qZWN0T3B0aW9ucyBleHRlbmRzIENvbW1vbkphdmFPcHRpb25zIHtcbiAgLyoqIEBkZWZhdWx0IFwiZG9ja2VyLmlvXCIgKi9cbiAgcmVhZG9ubHkgZG9ja2VyUmVnaXN0cnk/OiBzdHJpbmc7XG5cbiAgLyoqIEBkZWZhdWx0IHRydWUgKi9cbiAgcmVhZG9ubHkgdXNlRmx5d2F5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGNvbXBhbmlvbiBDREsgaW5mcmEvYXBwIHJlcG8gKGBvd25lci9yZXBvYCkgd2hvc2UgYGRlcGxveS55bWxgIHRoZVxuICAgKiBgZGVwbG95LWNka2Agd29ya2Zsb3cgZGlzcGF0Y2hlcy5cbiAgICpcbiAgICogQSBwbGFpbiBzdHJpbmcgcmF0aGVyIHRoYW4gYSBuZXN0ZWQgc3RydWN0IHNvIHRoYXRcbiAgICogYHByb2plbiBuZXcgLS1mcm9tIEB4cGVydHNzL3Byb2plbi10eXBlcyBqYXZhX3NlcnZpY2VgIGNhbiBwYXNzIGl0XG4gICAqIChgLS1jZGstZGVwbG95LXRhcmdldC1yZXBvIG93bmVyL3JlcG9gKTogcHJvamVuJ3MgQ0xJIGNhbiBvbmx5IHJlbmRlclxuICAgKiBvcHRpb25zIHdob3NlIHR5cGUgaXMgYSBzdHJpbmcvbnVtYmVyL2Jvb2xlYW4vYXJyYXkvZW51bSwgc28gYVxuICAgKiBzdHJ1Y3QtdHlwZWQgb3B0aW9uIGlzIGludmlzaWJsZSB0byBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgZGVwbG95LWNkay55bWxgIGlzIGdlbmVyYXRlZCB3aXRoIGEgc2luZ2xlIGZhaWxpbmcgc3RlcCB0aGF0XG4gICAqIHRlbGxzIHlvdSB0byBzZXQgdGhpc1xuICAgKi9cbiAgcmVhZG9ubHkgY2RrRGVwbG95VGFyZ2V0UmVwbz86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBnZW5lcmF0ZSB0aGUgYGRlcGxveS1jZGtgIHdvcmtmbG93IGF0IGFsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgY2RrRGVwbG95SG9vaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERlcGxveSB0YXJnZXRzIHRvIG9mZmVyIG9uIHRoZSBgQ2RrRGVwbG95SG9va2AncyBtYW51YWwtZGlzcGF0Y2hcbiAgICogd29ya2Zsb3csIHdoZW4gdGhlIGhvb2sgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgW1wicHJvZFwiXVxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnRzPzogKHN0cmluZyB8IEVudmlyb25tZW50T3B0aW9ucylbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBKYXZhQXBwUHJvamVjdE9wdGlvbnMgZXh0ZW5kcyBDb21tb25KYXZhT3B0aW9ucyB7XG4gIC8qKiBAZGVmYXVsdCBcImh0dHBzOi8vbWF2ZW4ucGtnLmdpdGh1Yi5jb20vT1dORVIvUkVQT1wiIChkZXJpdmVkIGZyb20gdGhlIHJlcG9zaXRvcnkgVVJMKSAqL1xuICByZWFkb25seSBnaFBhY2thZ2VzUmVnaXN0cnk/OiBzdHJpbmc7XG59XG4iXX0=
package/package.json CHANGED
@@ -82,7 +82,7 @@
82
82
  "publishConfig": {
83
83
  "access": "public"
84
84
  },
85
- "version": "0.0.6",
85
+ "version": "0.0.8",
86
86
  "jest": {
87
87
  "coverageProvider": "v8",
88
88
  "testMatch": [
@@ -1,37 +0,0 @@
1
- import { Component, github } from 'projen';
2
- /**
3
- * Blocking, tamper-proof PR check that stops a disallowed GitHub Action
4
- * reference from ever (re)appearing in a repo's workflow or composite-action
5
- * files.
6
- *
7
- * Runs on `pull_request_target` so it always executes the copy of this
8
- * workflow committed on the base branch - a PR cannot edit this file to
9
- * disable or weaken the check. It checks out and executes nothing from the
10
- * PR; it only reads the PR head's file content via the GitHub API. Because
11
- * `pull_request_target` runs with the base repo's token even for
12
- * fork-originated PRs, the failure comment posts reliably.
13
- *
14
- * It performs a flat, unconditional scan of the PR's head ref (no
15
- * base-vs-head comparison): fetch the content of every GitHub workflow and
16
- * composite-action file, extract every `uses:` value, and fail if any does
17
- * not start with one of the three trusted namespaces from AD-001
18
- * (`actions/`, `docker/`, `xpertss/`). The single
19
- * exemption is a local same-repo reference (`uses: .` or
20
- * `uses: ./.github/actions/<name>`) - the repo's own hand-committed action,
21
- * to which the org policy's "allow select actions" setting does not apply.
22
- */
23
- export interface ActionsAllowlistGuardOptions {
24
- /**
25
- * GitHub secret holding a token with permission to comment on PRs, used
26
- * for the failure comment. The check still fails without it, so fork PRs -
27
- * which get no secrets - are only missing the extra comment.
28
- * @default "PROJEN_GITHUB_TOKEN"
29
- */
30
- readonly gheTokenSecret?: string;
31
- /** @default "actions-allowlist-guard" */
32
- readonly workflowName?: string;
33
- }
34
- export declare class ActionsAllowlistGuard extends Component {
35
- readonly workflow: github.GithubWorkflow;
36
- constructor(scope: github.GitHubProject, options?: ActionsAllowlistGuardOptions);
37
- }
@@ -1,70 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ActionsAllowlistGuard = void 0;
4
- const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
- const projen_1 = require("projen");
6
- const constants_1 = require("./constants");
7
- class ActionsAllowlistGuard extends projen_1.Component {
8
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionsAllowlistGuard", version: "0.0.6" };
9
- workflow;
10
- constructor(scope, options = {}) {
11
- super(scope, 'ActionsAllowlistGuard');
12
- const gh = scope.github;
13
- if (!gh) {
14
- throw new Error('ActionsAllowlistGuard requires GitHub integration to be enabled');
15
- }
16
- const gheTokenSecret = options.gheTokenSecret ?? constants_1.DEFAULT_GHE_TOKEN_SECRET;
17
- this.workflow = new projen_1.github.GithubWorkflow(gh, options.workflowName ?? 'actions-allowlist-guard');
18
- this.workflow.on({ pullRequestTarget: {} });
19
- this.workflow.addJob('check', {
20
- runsOn: ['ubuntu-latest'],
21
- permissions: {
22
- contents: projen_1.github.workflows.JobPermission.READ,
23
- pullRequests: projen_1.github.workflows.JobPermission.WRITE,
24
- },
25
- env: { GH_TOKEN: `\${{ secrets.${gheTokenSecret} }}` },
26
- steps: [
27
- {
28
- name: 'Enforce action allow-list',
29
- run: `set -uo pipefail
30
- head_sha="\${{ github.event.pull_request.head.sha }}"
31
- pr_number="\${{ github.event.number }}"
32
- repo="\${GITHUB_REPOSITORY}"
33
- # All files at the PR head (recursive tree), narrowed to workflow and
34
- # composite-action files.
35
- files="$(gh api "repos/$repo/git/trees/$head_sha?recursive=1" --jq '.tree[] | select(.type=="blob") | .path' | grep -E '^\\.github/(workflows/[^/]+\\.(yml|yaml)|actions/[^/]+/action\\.(yml|yaml))$' || true)"
36
- violations=()
37
- while IFS= read -r path; do
38
- [ -z "$path" ] && continue
39
- content="$(gh api "repos/$repo/contents/$path?ref=$head_sha" --jq -r '.content' 2>/dev/null | base64 -d 2>/dev/null || true)"
40
- lineno=0
41
- while IFS= read -r line; do
42
- lineno=$((lineno + 1))
43
- value="$(printf '%s\\n' "$line" | sed -n 's/^[[:space:]]*uses:[[:space:]]*//p' | tr -d '\\\"')"
44
- [ -z "$value" ] && continue
45
- case "$value" in
46
- actions/*|docker/*|xpertss/*|.|./*) ;;
47
- *) violations+=(" - $path:$lineno — uses: $value") ;;
48
- esac
49
- done <<< "$content"
50
- done <<< "$files"
51
- if [ "\${#violations[@]}" -gt 0 ]; then
52
- {
53
- echo "❌ Disallowed GitHub Action reference"
54
- echo ""
55
- echo "This PR references an action outside the allow-list:"
56
- echo ""
57
- printf '%s\\n' "\${violations[@]}"
58
- echo ""
59
- echo "Org policy trusts only actions/*, docker/*, and xpertss/*. Use an equivalent internal action, or ask its maintainers to add one."
60
- } | gh pr comment "$pr_number" --body-file - || echo "::warning::could not post PR comment (fork PR or missing token)"
61
- exit 1
62
- fi
63
- `,
64
- },
65
- ],
66
- });
67
- }
68
- }
69
- exports.ActionsAllowlistGuard = ActionsAllowlistGuard;
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9ucy1hbGxvd2xpc3QtZ3VhcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbW9uL2FjdGlvbnMtYWxsb3dsaXN0LWd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FBMkM7QUFDM0MsMkNBQXVEO0FBb0N2RCxNQUFhLHFCQUFzQixTQUFRLGtCQUFTOztJQUNsQyxRQUFRLENBQXdCO0lBRWhELFlBQ0UsS0FBMkIsRUFDM0IsVUFBd0MsRUFBRTtRQUUxQyxLQUFLLENBQUMsS0FBSyxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFFdEMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUN4QixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDUixNQUFNLElBQUksS0FBSyxDQUNiLGlFQUFpRSxDQUNsRSxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sY0FBYyxHQUNsQixPQUFPLENBQUMsY0FBYyxJQUFJLG9DQUF3QixDQUFDO1FBRXJELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxlQUFNLENBQUMsY0FBYyxDQUN2QyxFQUFFLEVBQ0YsT0FBTyxDQUFDLFlBQVksSUFBSSx5QkFBeUIsQ0FDbEQsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFDNUIsTUFBTSxFQUFFLENBQUMsZUFBZSxDQUFDO1lBQ3pCLFdBQVcsRUFBRTtnQkFDWCxRQUFRLEVBQUUsZUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSTtnQkFDN0MsWUFBWSxFQUFFLGVBQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUs7YUFDbkQ7WUFDRCxHQUFHLEVBQUUsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLGNBQWMsS0FBSyxFQUFFO1lBQ3RELEtBQUssRUFBRTtnQkFDTDtvQkFDRSxJQUFJLEVBQUUsMkJBQTJCO29CQUNqQyxHQUFHLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FrQ2Q7aUJBQ1E7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBeEVILHNEQXlFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZ2l0aHViIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IERFRkFVTFRfR0hFX1RPS0VOX1NFQ1JFVCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBCbG9ja2luZywgdGFtcGVyLXByb29mIFBSIGNoZWNrIHRoYXQgc3RvcHMgYSBkaXNhbGxvd2VkIEdpdEh1YiBBY3Rpb25cbiAqIHJlZmVyZW5jZSBmcm9tIGV2ZXIgKHJlKWFwcGVhcmluZyBpbiBhIHJlcG8ncyB3b3JrZmxvdyBvciBjb21wb3NpdGUtYWN0aW9uXG4gKiBmaWxlcy5cbiAqXG4gKiBSdW5zIG9uIGBwdWxsX3JlcXVlc3RfdGFyZ2V0YCBzbyBpdCBhbHdheXMgZXhlY3V0ZXMgdGhlIGNvcHkgb2YgdGhpc1xuICogd29ya2Zsb3cgY29tbWl0dGVkIG9uIHRoZSBiYXNlIGJyYW5jaCAtIGEgUFIgY2Fubm90IGVkaXQgdGhpcyBmaWxlIHRvXG4gKiBkaXNhYmxlIG9yIHdlYWtlbiB0aGUgY2hlY2suIEl0IGNoZWNrcyBvdXQgYW5kIGV4ZWN1dGVzIG5vdGhpbmcgZnJvbSB0aGVcbiAqIFBSOyBpdCBvbmx5IHJlYWRzIHRoZSBQUiBoZWFkJ3MgZmlsZSBjb250ZW50IHZpYSB0aGUgR2l0SHViIEFQSS4gQmVjYXVzZVxuICogYHB1bGxfcmVxdWVzdF90YXJnZXRgIHJ1bnMgd2l0aCB0aGUgYmFzZSByZXBvJ3MgdG9rZW4gZXZlbiBmb3JcbiAqIGZvcmstb3JpZ2luYXRlZCBQUnMsIHRoZSBmYWlsdXJlIGNvbW1lbnQgcG9zdHMgcmVsaWFibHkuXG4gKlxuICAqIEl0IHBlcmZvcm1zIGEgZmxhdCwgdW5jb25kaXRpb25hbCBzY2FuIG9mIHRoZSBQUidzIGhlYWQgcmVmIChub1xuICAqIGJhc2UtdnMtaGVhZCBjb21wYXJpc29uKTogZmV0Y2ggdGhlIGNvbnRlbnQgb2YgZXZlcnkgR2l0SHViIHdvcmtmbG93IGFuZFxuICAqIGNvbXBvc2l0ZS1hY3Rpb24gZmlsZSwgZXh0cmFjdCBldmVyeSBgdXNlczpgIHZhbHVlLCBhbmQgZmFpbCBpZiBhbnkgZG9lc1xuICAqIG5vdCBzdGFydCB3aXRoIG9uZSBvZiB0aGUgdGhyZWUgdHJ1c3RlZCBuYW1lc3BhY2VzIGZyb20gQUQtMDAxXG4gICogKGBhY3Rpb25zL2AsIGBkb2NrZXIvYCwgYHhwZXJ0c3MvYCkuIFRoZSBzaW5nbGVcbiAqIGV4ZW1wdGlvbiBpcyBhIGxvY2FsIHNhbWUtcmVwbyByZWZlcmVuY2UgKGB1c2VzOiAuYCBvclxuICogYHVzZXM6IC4vLmdpdGh1Yi9hY3Rpb25zLzxuYW1lPmApIC0gdGhlIHJlcG8ncyBvd24gaGFuZC1jb21taXR0ZWQgYWN0aW9uLFxuICogdG8gd2hpY2ggdGhlIG9yZyBwb2xpY3kncyBcImFsbG93IHNlbGVjdCBhY3Rpb25zXCIgc2V0dGluZyBkb2VzIG5vdCBhcHBseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25zQWxsb3dsaXN0R3VhcmRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEdpdEh1YiBzZWNyZXQgaG9sZGluZyBhIHRva2VuIHdpdGggcGVybWlzc2lvbiB0byBjb21tZW50IG9uIFBScywgdXNlZFxuICAgKiBmb3IgdGhlIGZhaWx1cmUgY29tbWVudC4gVGhlIGNoZWNrIHN0aWxsIGZhaWxzIHdpdGhvdXQgaXQsIHNvIGZvcmsgUFJzIC1cbiAgICogd2hpY2ggZ2V0IG5vIHNlY3JldHMgLSBhcmUgb25seSBtaXNzaW5nIHRoZSBleHRyYSBjb21tZW50LlxuICAgKiBAZGVmYXVsdCBcIlBST0pFTl9HSVRIVUJfVE9LRU5cIlxuICAgKi9cbiAgcmVhZG9ubHkgZ2hlVG9rZW5TZWNyZXQ/OiBzdHJpbmc7XG5cbiAgLyoqIEBkZWZhdWx0IFwiYWN0aW9ucy1hbGxvd2xpc3QtZ3VhcmRcIiAqL1xuICByZWFkb25seSB3b3JrZmxvd05hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25zQWxsb3dsaXN0R3VhcmQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3c6IGdpdGh1Yi5HaXRodWJXb3JrZmxvdztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogZ2l0aHViLkdpdEh1YlByb2plY3QsXG4gICAgb3B0aW9uczogQWN0aW9uc0FsbG93bGlzdEd1YXJkT3B0aW9ucyA9IHt9LFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgJ0FjdGlvbnNBbGxvd2xpc3RHdWFyZCcpO1xuXG4gICAgY29uc3QgZ2ggPSBzY29wZS5naXRodWI7XG4gICAgaWYgKCFnaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQWN0aW9uc0FsbG93bGlzdEd1YXJkIHJlcXVpcmVzIEdpdEh1YiBpbnRlZ3JhdGlvbiB0byBiZSBlbmFibGVkJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2hlVG9rZW5TZWNyZXQgPVxuICAgICAgb3B0aW9ucy5naGVUb2tlblNlY3JldCA/PyBERUZBVUxUX0dIRV9UT0tFTl9TRUNSRVQ7XG5cbiAgICB0aGlzLndvcmtmbG93ID0gbmV3IGdpdGh1Yi5HaXRodWJXb3JrZmxvdyhcbiAgICAgIGdoLFxuICAgICAgb3B0aW9ucy53b3JrZmxvd05hbWUgPz8gJ2FjdGlvbnMtYWxsb3dsaXN0LWd1YXJkJyxcbiAgICApO1xuICAgIHRoaXMud29ya2Zsb3cub24oeyBwdWxsUmVxdWVzdFRhcmdldDoge30gfSk7XG4gICAgdGhpcy53b3JrZmxvdy5hZGRKb2IoJ2NoZWNrJywge1xuICAgICAgcnVuc09uOiBbJ3VidW50dS1sYXRlc3QnXSxcbiAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIGNvbnRlbnRzOiBnaXRodWIud29ya2Zsb3dzLkpvYlBlcm1pc3Npb24uUkVBRCxcbiAgICAgICAgcHVsbFJlcXVlc3RzOiBnaXRodWIud29ya2Zsb3dzLkpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICB9LFxuICAgICAgZW52OiB7IEdIX1RPS0VOOiBgXFwke3sgc2VjcmV0cy4ke2doZVRva2VuU2VjcmV0fSB9fWAgfSxcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnRW5mb3JjZSBhY3Rpb24gYWxsb3ctbGlzdCcsXG4gICAgICAgICAgcnVuOiBgc2V0IC11byBwaXBlZmFpbFxuaGVhZF9zaGE9XCJcXCR7eyBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmhlYWQuc2hhIH19XCJcbnByX251bWJlcj1cIlxcJHt7IGdpdGh1Yi5ldmVudC5udW1iZXIgfX1cIlxucmVwbz1cIlxcJHtHSVRIVUJfUkVQT1NJVE9SWX1cIlxuIyBBbGwgZmlsZXMgYXQgdGhlIFBSIGhlYWQgKHJlY3Vyc2l2ZSB0cmVlKSwgbmFycm93ZWQgdG8gd29ya2Zsb3cgYW5kXG4jIGNvbXBvc2l0ZS1hY3Rpb24gZmlsZXMuXG5maWxlcz1cIiQoZ2ggYXBpIFwicmVwb3MvJHJlcG8vZ2l0L3RyZWVzLyRoZWFkX3NoYT9yZWN1cnNpdmU9MVwiIC0tanEgJy50cmVlW10gfCBzZWxlY3QoLnR5cGU9PVwiYmxvYlwiKSB8IC5wYXRoJyB8IGdyZXAgLUUgJ15cXFxcLmdpdGh1Yi8od29ya2Zsb3dzL1teL10rXFxcXC4oeW1sfHlhbWwpfGFjdGlvbnMvW14vXSsvYWN0aW9uXFxcXC4oeW1sfHlhbWwpKSQnIHx8IHRydWUpXCJcbnZpb2xhdGlvbnM9KClcbndoaWxlIElGUz0gcmVhZCAtciBwYXRoOyBkb1xuICBbIC16IFwiJHBhdGhcIiBdICYmIGNvbnRpbnVlXG4gIGNvbnRlbnQ9XCIkKGdoIGFwaSBcInJlcG9zLyRyZXBvL2NvbnRlbnRzLyRwYXRoP3JlZj0kaGVhZF9zaGFcIiAtLWpxIC1yICcuY29udGVudCcgMj4vZGV2L251bGwgfCBiYXNlNjQgLWQgMj4vZGV2L251bGwgfHwgdHJ1ZSlcIlxuICBsaW5lbm89MFxuICB3aGlsZSBJRlM9IHJlYWQgLXIgbGluZTsgZG9cbiAgICBsaW5lbm89JCgobGluZW5vICsgMSkpXG4gICAgdmFsdWU9XCIkKHByaW50ZiAnJXNcXFxcbicgXCIkbGluZVwiIHwgc2VkIC1uICdzL15bWzpzcGFjZTpdXSp1c2VzOltbOnNwYWNlOl1dKi8vcCcgfCB0ciAtZCAnXFxcXFxcXCInKVwiXG4gICAgWyAteiBcIiR2YWx1ZVwiIF0gJiYgY29udGludWVcbiAgICBjYXNlIFwiJHZhbHVlXCIgaW5cbiAgICAgIGFjdGlvbnMvKnxkb2NrZXIvKnx4cGVydHNzLyp8LnwuLyopIDs7XG4gICAgICAqKSB2aW9sYXRpb25zKz0oXCIgIC0gJHBhdGg6JGxpbmVubyDigJQgdXNlczogJHZhbHVlXCIpIDs7XG4gICAgZXNhY1xuICBkb25lIDw8PCBcIiRjb250ZW50XCJcbmRvbmUgPDw8IFwiJGZpbGVzXCJcbmlmIFsgXCJcXCR7I3Zpb2xhdGlvbnNbQF19XCIgLWd0IDAgXTsgdGhlblxuICB7XG4gICAgZWNobyBcIuKdjCBEaXNhbGxvd2VkIEdpdEh1YiBBY3Rpb24gcmVmZXJlbmNlXCJcbiAgICBlY2hvIFwiXCJcbiAgICBlY2hvIFwiVGhpcyBQUiByZWZlcmVuY2VzIGFuIGFjdGlvbiBvdXRzaWRlIHRoZSBhbGxvdy1saXN0OlwiXG4gICAgZWNobyBcIlwiXG4gICAgcHJpbnRmICclc1xcXFxuJyBcIlxcJHt2aW9sYXRpb25zW0BdfVwiXG4gICAgZWNobyBcIlwiXG4gICAgZWNobyBcIk9yZyBwb2xpY3kgdHJ1c3RzIG9ubHkgYWN0aW9ucy8qLCBkb2NrZXIvKiwgYW5kIHhwZXJ0c3MvKi4gVXNlIGFuIGVxdWl2YWxlbnQgaW50ZXJuYWwgYWN0aW9uLCBvciBhc2sgaXRzIG1haW50YWluZXJzIHRvIGFkZCBvbmUuXCJcbiAgfSB8IGdoIHByIGNvbW1lbnQgXCIkcHJfbnVtYmVyXCIgLS1ib2R5LWZpbGUgLSB8fCBlY2hvIFwiOjp3YXJuaW5nOjpjb3VsZCBub3QgcG9zdCBQUiBjb21tZW50IChmb3JrIFBSIG9yIG1pc3NpbmcgdG9rZW4pXCJcbiAgZXhpdCAxXG5maVxuYCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==