@jjrawlins/cdk-diff-pr-github-action 1.7.2 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +46 -8
- package/API.md +38 -0
- package/README.md +40 -0
- package/cdkdiffprgithubaction/jsii/jsii.go +2 -2
- package/cdkdiffprgithubaction/version +1 -1
- package/lib/CdkDiffIamTemplate.js +2 -2
- package/lib/CdkDiffIamTemplateStackSet.js +2 -2
- package/lib/CdkDiffStackWorkflow.d.ts +10 -0
- package/lib/CdkDiffStackWorkflow.js +16 -5
- package/lib/CdkDriftDetectionWorkflow.d.ts +10 -0
- package/lib/CdkDriftDetectionWorkflow.js +11 -4
- package/lib/CdkDriftIamTemplate.js +2 -2
- package/package.json +1 -1
package/.jsii
CHANGED
|
@@ -3507,7 +3507,7 @@
|
|
|
3507
3507
|
},
|
|
3508
3508
|
"name": "@jjrawlins/cdk-diff-pr-github-action",
|
|
3509
3509
|
"readme": {
|
|
3510
|
-
"markdown": "# cdk-diff-pr-github-action\n\nA [Projen](https://projen.io/) construct library that surfaces **CloudFormation change set diffs and drift status directly on your pull requests** so reviewers can see exactly what will change before merging.\n\n## Why this exists\n\n`cdk diff` output disappears into CI logs that nobody reads. Meanwhile, a single property change on an RDS instance or EC2 \"pet\" server can trigger a **resource replacement** — destroying the database or instance and recreating it from scratch. If that replacement slips through code review unnoticed, the result is data loss and downtime.\n\nThis construct was built to make those dangerous changes impossible to miss:\n\n- **Replacement column front and center** — Every change set row shows whether CloudFormation will modify the resource in place or **replace** it, with before/after property values so reviewers can understand *why*.\n- **Comment appears on the PR itself** — No digging through workflow logs. The diff table is posted (and updated in place) as a PR comment and in the GitHub Step Summary.\n- **Drift banner** — If the stack has drifted from its template, a warning banner is prepended to the comment so reviewers know the baseline is already out of sync.\n\nIf you have ever lost an EC2 instance, an RDS database, or an ElastiCache cluster to an unexpected CloudFormation replacement, this tool is for you.\n\n---\n\nA library that provides GitHub workflows and IAM templates for:\n- Creating CloudFormation Change Sets for your CDK stacks on pull requests and commenting a formatted diff back on the PR.\n- Detecting CloudFormation drift on a schedule or manual trigger and producing a consolidated summary (optionally creating an issue).\n- Deploying IAM roles across AWS Organizations using StackSets.\n\nIt also provides ready-to-deploy IAM templates with the minimal permissions required for each workflow.\n\n**Works with or without Projen** -- The StackSet generator can be used standalone in any Node.js project.\n\nThis package exposes five constructs:\n\n- `CdkDiffStackWorkflow` — Generates one GitHub Actions workflow per stack to create a change set and render the diff back to the PR and Step Summary.\n- `CdkDiffIamTemplate` — Emits a CloudFormation template file with minimal permissions for the Change Set workflow.\n- `CdkDriftDetectionWorkflow` — Generates a GitHub Actions workflow to detect CloudFormation drift per stack, upload machine‑readable results, and aggregate a summary.\n- `CdkDriftIamTemplate` — Emits a CloudFormation template file with minimal permissions for the Drift Detection workflow.\n- `CdkDiffIamTemplateStackSet` — Creates a CloudFormation StackSet template for org-wide deployment of GitHub OIDC and IAM roles (Projen integration).\n- `CdkDiffIamTemplateStackSetGenerator` — Pure generator class for StackSet templates (no Projen dependency).\n\n## Quick start\n\n1) Add the constructs to your Projen project (in `.projenrc.ts`).\n2) Synthesize with `npx projen`.\n3) Commit the generated files.\n4) Open a pull request or run the drift detection workflow.\n\n## End-to-end example\n\nA realistic setup for a CDK Pipelines project with multiple stages and accounts. This generates one diff workflow per stack, a shared IAM template, and a scheduled drift detection workflow.\n\n```ts\n// .projenrc.ts\nimport { awscdk } from 'projen';\nimport {\n CdkDiffStackWorkflow,\n CdkDiffIamTemplate,\n CdkDriftDetectionWorkflow,\n} from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkTypeScriptApp({\n name: 'my-data-platform',\n defaultReleaseBranch: 'main',\n cdkVersion: '2.170.0',\n github: true,\n});\n\n// --- Change Set Diff Workflows (one per stack) ---\n// stackName is the CDK construct path used with `cdk deploy <target>`.\n// For CDK Pipelines, this is typically: pipeline/Stage/Stack\n// The construct automatically resolves the real CloudFormation stack name\n// from cdk.out at runtime (e.g., \"my-stage-dev-my-stack\").\n\nnew CdkDiffStackWorkflow({\n project,\n oidcRoleArn: 'arn:aws:iam::111111111111:role/GitHubOIDCRole',\n oidcRegion: 'us-east-1',\n stacks: [\n {\n stackName: 'my-pipeline/dev/DatabaseStack',\n changesetRoleToAssumeArn: 'arn:aws:iam::111111111111:role/CdkChangesetRole',\n changesetRoleToAssumeRegion: 'us-east-1',\n },\n {\n stackName: 'my-pipeline/dev/ComputeStack',\n changesetRoleToAssumeArn: 'arn:aws:iam::111111111111:role/CdkChangesetRole',\n changesetRoleToAssumeRegion: 'us-east-1',\n },\n {\n // Cross-account: prod stacks can use a different OIDC role and region\n stackName: 'my-pipeline/prod/DatabaseStack',\n changesetRoleToAssumeArn: 'arn:aws:iam::222222222222:role/CdkChangesetRole',\n changesetRoleToAssumeRegion: 'us-east-1',\n oidcRoleArn: 'arn:aws:iam::222222222222:role/GitHubOIDCRole',\n oidcRegion: 'us-east-1',\n },\n ],\n});\n\n// --- IAM Template (deploy once per account) ---\nnew CdkDiffIamTemplate({\n project,\n roleName: 'CdkChangesetRole',\n createOidcRole: true,\n githubOidc: {\n owner: 'my-org',\n repositories: ['my-data-platform'],\n branches: ['main'],\n },\n});\n\n// --- Drift Detection (scheduled + manual) ---\nnew CdkDriftDetectionWorkflow({\n project,\n schedule: '0 6 * * 1', // Every Monday at 6 AM UTC\n oidcRoleArn: 'arn:aws:iam::111111111111:role/GitHubOIDCRole',\n oidcRegion: 'us-east-1',\n stacks: [\n {\n stackName: 'dev-DatabaseStack',\n driftDetectionRoleToAssumeArn: 'arn:aws:iam::111111111111:role/CdkDriftRole',\n driftDetectionRoleToAssumeRegion: 'us-east-1',\n },\n ],\n});\n\nproject.synth();\n```\n\nAfter `npx projen`, this generates:\n- `.github/workflows/diff-my-pipeline-dev-databasestack.yml`\n- `.github/workflows/diff-my-pipeline-dev-computestack.yml`\n- `.github/workflows/diff-my-pipeline-prod-databasestack.yml`\n- `.github/workflows/scripts/describe-cfn-changeset.ts`\n- `.github/workflows/drift-detection.yml`\n- `.github/workflows/scripts/detect-drift.ts`\n- `cdk-diff-workflow-iam-template.yaml`\n\nWhen a pull request is opened, each diff workflow runs automatically and posts a comment like this:\n\n| Action | ID | Type | Replacement | Details |\n|--------|-----|------|-------------|---------|\n| 🔵 Modify | MyDatabase | AWS::RDS::DBInstance | **True** | 🔵 **DBInstanceClass**: `db.t3.medium` -> `db.t3.large` |\n| 🔵 Modify | MyFunction | AWS::Lambda::Function | False | 🔵 **Runtime**: `nodejs18.x` -> `nodejs20.x` |\n\nThe **Replacement: True** on the RDS instance is exactly the kind of change this tool is designed to catch before it reaches production.\n\n## Usage: CdkDiffStackWorkflow\n\n`CdkDiffStackWorkflow` renders a workflow per stack named `diff-<StackName>.yml` under `.github/workflows/`. It also generates a helper script at `.github/workflows/scripts/describe-cfn-changeset.ts` that formats the change set output and takes care of posting the PR comment and Step Summary.\n\nExample `.projenrc.ts`:\n\n```ts\nimport { awscdk } from 'projen';\nimport { CdkDiffStackWorkflow } from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkConstructLibrary({\n // ... your usual settings ...\n workflowName: 'my-lib',\n defaultReleaseBranch: 'main',\n cdkVersion: '2.85.0',\n github: true,\n});\n\nnew CdkDiffStackWorkflow({\n project,\n stacks: [\n {\n stackName: 'MyAppStack',\n changesetRoleToAssumeArn: 'arn:aws:iam::123456789012:role/cdk-diff-role',\n changesetRoleToAssumeRegion: 'us-east-1',\n // Optional per‑stack OIDC override (if not using the defaults below)\n // oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n // oidcRegion: 'us-east-1',\n },\n ],\n // Default OIDC role/region used by all stacks unless overridden per‑stack\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n // Optional: Node version used in the workflow (default: '24.x')\n // nodeVersion: '24.x',\n // Optional: Yarn command to run CDK (default: 'cdk')\n // cdkYarnCommand: 'cdk',\n // Optional: Where to place the helper script (default: '.github/workflows/scripts/describe-cfn-changeset.ts')\n // scriptOutputPath: '.github/workflows/scripts/describe-cfn-changeset.ts',\n});\n\nproject.synth();\n```\n\n### CdkDiffStackWorkflow props\n- `project` (required) — Your Projen project instance.\n- `stacks` (required) — Array of stack entries.\n- `oidcRoleArn` (required unless provided per‑stack) — Default OIDC role ARN.\n- `oidcRegion` (required unless provided per‑stack) — Default OIDC region.\n- `nodeVersion` (optional, default `'24.x'`) — Node.js version for the workflow runner.\n- `cdkYarnCommand` (optional, default `'cdk'`) — Yarn script/command to invoke CDK.\n- `scriptOutputPath` (optional, default `'.github/workflows/scripts/describe-cfn-changeset.ts'`) — Where to write the helper script.\n\nIf neither top‑level OIDC defaults nor all per‑stack values are supplied, the construct throws a helpful error.\n\n### Stack item fields\n- `stackName` (required) — The CDK stack name to create the change set for.\n- `changesetRoleToAssumeArn` (required) — The ARN of the role used to create the change set (role chaining after OIDC).\n- `changesetRoleToAssumeRegion` (required) — The region for that role.\n- `oidcRoleArn` (optional) — Per‑stack override for the OIDC role.\n- `oidcRegion` (optional) — Per‑stack override for the OIDC region.\n\n### What gets generated\n- `.github/workflows/diff-<StackName>.yml` — One workflow per stack, triggered on PR open/sync/reopen.\n- `.github/workflows/scripts/describe-cfn-changeset.ts` — A helper script that:\n - Polls `DescribeChangeSet` until terminal\n - Filters out ignorable logical IDs or resource types using environment variables `IGNORE_LOGICAL_IDS` and `IGNORE_RESOURCE_TYPES`\n - Renders an HTML table with actions, logical IDs, types, replacements, and changed properties\n - **Checks cached drift status** via `DescribeStacks` — if the stack has drifted, a warning banner with drifted resource details is prepended to the output (non-fatal; degrades gracefully if IAM permissions are missing)\n - Prints the HTML and appends to the GitHub Step Summary\n - **Upserts the PR comment** — uses an HTML marker (`<!-- cdk-diff:stack:STACK_NAME -->`) to find and update an existing comment instead of creating duplicates on every push\n\n### Change Set Output Format\n\nThe change set script uses the CloudFormation `IncludePropertyValues` API feature to show **actual before/after values** for changed properties, not just property names.\n\n**Example PR comment:**\n\n> **Warning: Stack has drifted (2 resources out of sync)**\n>\n> Last drift check: 2025-01-15T10:30:00.000Z\n>\n> <details><summary>View drifted resources</summary>\n>\n> | Resource | Type | Drift Status |\n> |----------|------|-------------|\n> | MySecurityGroup | AWS::EC2::SecurityGroup | MODIFIED |\n> | OldBucket | AWS::S3::Bucket | DELETED |\n> </details>\n\n| Action | ID | Type | Replacement | Details |\n|--------|-----|------|-------------|---------|\n| 🔵 Modify | MyDatabase | AWS::RDS::DBInstance | **True** | 🔵 **DBInstanceClass**: `db.t3.medium` -> `db.t3.large` |\n| 🔵 Modify | MyLambdaFunction | AWS::Lambda::Function | False | 🔵 **Runtime**: `nodejs18.x` -> `nodejs20.x` |\n| 🟢 Add | NewSecurityGroup | AWS::EC2::SecurityGroup | - | |\n| 🔴 Remove | OldRole | AWS::IAM::Role | - | |\n\n**Features:**\n- **Replacement column** highlights when CloudFormation will **destroy and recreate** a resource — critical for stateful resources like databases, EC2 instances, and file systems\n- **Drift banner** — if the stack has drifted, a warning with drifted resource details appears above the change set table so reviewers know the baseline state\n- **Comment upsert** — each stack's comment is updated in place on subsequent pushes instead of creating duplicates; uses an HTML marker for reliable find-and-replace\n- **Color-coded indicators**: 🟢 Added, 🔵 Modified, 🔴 Removed\n- **Inline values for small changes**: Shows `before -> after` directly in the table\n- **Collapsible details for large values**: IAM policies, tags, and other large JSON values are wrapped in expandable `<details>` elements to keep the table readable\n- **All attribute types supported**: Properties, Tags, Metadata, etc.\n- **HTML-escaped values**: Prevents XSS from property values\n\n### Environment variables used by the change set script\n- `STACK_NAME` (required) — Stack name to describe.\n- `CHANGE_SET_NAME` (default: same as `STACK_NAME`).\n- `AWS_REGION` — Region for CloudFormation API calls. The workflow sets this via the credentials action(s).\n- `GITHUB_TOKEN` (optional) — If set with `GITHUB_COMMENT_URL`, posts a PR comment.\n- `GITHUB_COMMENT_URL` (optional) — PR comments URL.\n- `GITHUB_STEP_SUMMARY` (optional) — When present, appends the HTML to the step summary file.\n- `IGNORE_LOGICAL_IDS` (optional) — Comma‑separated logical IDs to ignore (default includes `CDKMetadata`).\n- `IGNORE_RESOURCE_TYPES` (optional) — Comma‑separated resource types to ignore (e.g., `AWS::CDK::Metadata`).\n\n## Usage: CdkDiffIamTemplate\n\nEmit an IAM template you can deploy in your account for the Change Set workflow. Supports two modes:\n\n1. **External OIDC Role** — Reference an existing GitHub OIDC role (original behavior)\n2. **Self-Contained** — Create the GitHub OIDC provider and role within the same template (new)\n\n### Option 1: Using an Existing OIDC Role (External)\n\nUse this when you already have a GitHub OIDC provider and role set up in your account.\n\n#### With Projen\n\n```ts\nimport { awscdk } from 'projen';\nimport { CdkDiffIamTemplate } from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkConstructLibrary({\n // ...\n});\n\nnew CdkDiffIamTemplate({\n project,\n roleName: 'cdk-diff-role',\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n // Optional: custom output path (default: 'cdk-diff-workflow-iam-template.yaml')\n // outputPath: 'infra/cdk-diff-iam.yaml',\n});\n\nproject.synth();\n```\n\n#### Without Projen (Standalone Generator)\n\n```ts\nimport { CdkDiffIamTemplateGenerator } from '@jjrawlins/cdk-diff-pr-github-action';\nimport * as fs from 'fs';\n\nconst template = CdkDiffIamTemplateGenerator.generateTemplate({\n roleName: 'cdk-diff-role',\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n});\n\nfs.writeFileSync('cdk-diff-iam-template.yaml', template);\n```\n\n### Option 2: Self-Contained Template (Create OIDC Role)\n\nUse this when you want a single template that creates everything needed — the GitHub OIDC provider, OIDC role, and changeset role. This simplifies deployment and pairs well with the `CdkDiffStackWorkflow`.\n\n#### With Projen\n\n```ts\nimport { awscdk } from 'projen';\nimport { CdkDiffIamTemplate } from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkConstructLibrary({\n // ...\n});\n\nnew CdkDiffIamTemplate({\n project,\n roleName: 'CdkChangesetRole',\n createOidcRole: true,\n oidcRoleName: 'GitHubOIDCRole', // Optional, default: 'GitHubOIDCRole'\n githubOidc: {\n owner: 'my-org', // GitHub org or username\n repositories: ['infra-repo', 'app-repo'], // Repos allowed to assume roles\n branches: ['main', 'release/*'], // Branch patterns (default: ['*'])\n },\n // Optional: Skip OIDC provider creation if it already exists\n // skipOidcProviderCreation: true,\n});\n\nproject.synth();\n```\n\n#### Without Projen (Standalone Generator)\n\n```ts\nimport { CdkDiffIamTemplateGenerator } from '@jjrawlins/cdk-diff-pr-github-action';\nimport * as fs from 'fs';\n\nconst template = CdkDiffIamTemplateGenerator.generateTemplate({\n roleName: 'CdkChangesetRole',\n createOidcRole: true,\n oidcRoleName: 'GitHubOIDCRole',\n githubOidc: {\n owner: 'my-org',\n repositories: ['infra-repo'],\n branches: ['main'],\n },\n});\n\nfs.writeFileSync('cdk-diff-iam-template.yaml', template);\n```\n\n#### With Existing OIDC Provider (Skip Creation)\n\nIf your account already has a GitHub OIDC provider but you want the template to create the roles:\n\n```ts\nnew CdkDiffIamTemplate({\n project,\n roleName: 'CdkChangesetRole',\n createOidcRole: true,\n skipOidcProviderCreation: true, // Account already has OIDC provider\n githubOidc: {\n owner: 'my-org',\n repositories: ['*'], // All repos in org\n },\n});\n```\n\n### Deploy Task\n\nA Projen task is added for easy deployment:\n\n```bash\nnpx projen deploy-cdkdiff-iam-template -- --parameter-overrides GitHubOIDCRoleArn=... # plus any extra AWS CLI args\n```\n\n### CdkDiffIamTemplate Props\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `roleName` | `string` | Name for the changeset IAM role (required) |\n| `oidcRoleArn` | `string?` | ARN of existing GitHub OIDC role. Required when `createOidcRole` is false. |\n| `oidcRegion` | `string?` | Region for OIDC trust condition. Required when `createOidcRole` is false. |\n| `createOidcRole` | `boolean?` | Create OIDC role within template (default: false) |\n| `oidcRoleName` | `string?` | Name of OIDC role to create (default: 'GitHubOIDCRole') |\n| `githubOidc` | `GitHubOidcConfig?` | GitHub OIDC config. Required when `createOidcRole` is true. |\n| `skipOidcProviderCreation` | `boolean?` | Skip OIDC provider if it exists (default: false) |\n| `outputPath` | `string?` | Template output path (default: 'cdk-diff-workflow-iam-template.yaml') |\n\n### What the Template Creates\n\n**External OIDC Role mode:**\n- Parameter `GitHubOIDCRoleArn` — ARN of your existing GitHub OIDC role\n- IAM role `CdkChangesetRole` with minimal permissions for change set operations\n- Outputs: `CdkChangesetRoleArn`, `CdkChangesetRoleName`\n\n**Self-Contained mode (`createOidcRole: true`):**\n- GitHub OIDC Provider (unless `skipOidcProviderCreation: true`)\n- IAM role `GitHubOIDCRole` with trust policy for GitHub Actions\n- IAM role `CdkChangesetRole` with minimal permissions (trusts the OIDC role)\n- Outputs: `GitHubOIDCProviderArn`, `GitHubOIDCRoleArn`, `GitHubOIDCRoleName`, `CdkChangesetRoleArn`, `CdkChangesetRoleName`\n\n**Changeset Role Permissions:**\n- CloudFormation Change Set operations\n- Access to CDK bootstrap S3 buckets and SSM parameters\n- `iam:PassRole` to `cloudformation.amazonaws.com`\n\nUse the created changeset role ARN as `changesetRoleToAssumeArn` in `CdkDiffStackWorkflow`.\n\n---\n\n## Usage: CdkDriftDetectionWorkflow\n\n`CdkDriftDetectionWorkflow` creates a single workflow file (default `drift-detection.yml`) that can run on a schedule and via manual dispatch. It generates a helper script at `.github/workflows/scripts/detect-drift.ts` (by default) that uses AWS SDK v3 to run drift detection, write optional machine‑readable JSON, and print an HTML report for the Step Summary.\n\nExample `.projenrc.ts`:\n\n```ts\nimport { awscdk } from 'projen';\nimport { CdkDriftDetectionWorkflow } from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkConstructLibrary({ github: true, /* ... */ });\n\nnew CdkDriftDetectionWorkflow({\n project,\n workflowName: 'Drift Detection', // optional; file name derived as 'drift-detection.yml'\n schedule: '0 1 * * *', // optional cron\n createIssues: true, // default true; create/update issue when drift detected on schedule\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n // Optional: Node version (default '24.x')\n // nodeVersion: '24.x',\n // Optional: Where to place the helper script (default '.github/workflows/scripts/detect-drift.ts')\n // scriptOutputPath: '.github/workflows/scripts/detect-drift.ts',\n stacks: [\n {\n stackName: 'MyAppStack-Prod',\n driftDetectionRoleToAssumeArn: 'arn:aws:iam::123456789012:role/cdk-drift-role',\n driftDetectionRoleToAssumeRegion: 'us-east-1',\n // failOnDrift: true, // optional (default true)\n },\n ],\n});\n\nproject.synth();\n```\n\n### CdkDriftDetectionWorkflow props\n- `project` (required) — Your Projen project instance.\n- `stacks` (required) — Array of stacks to check.\n- `oidcRoleArn` (required) — Default OIDC role ARN used before chaining into per‑stack drift roles.\n- `oidcRegion` (required) — Default OIDC region.\n- `workflowName` (optional, default `'drift-detection'`) — Human‑friendly workflow name; the file name is derived in kebab‑case.\n- `schedule` (optional) — Cron expression for automatic runs.\n- `createIssues` (optional, default `true`) — When true, scheduled runs will create/update a GitHub issue if drift is detected.\n- `nodeVersion` (optional, default `'24.x'`) — Node.js version for the runner.\n- `scriptOutputPath` (optional, default `'.github/workflows/scripts/detect-drift.ts'`) — Where to write the helper script.\n\n### Per‑stack fields\n- `stackName` (required) — The full CloudFormation stack name.\n- `driftDetectionRoleToAssumeArn` (required) — Role to assume (after OIDC) for making drift API calls.\n- `driftDetectionRoleToAssumeRegion` (required) — Region for that role and API calls.\n- `failOnDrift` (optional, default `true`) — Intended to fail the detection step on drift. The provided script exits with non‑zero when drift is found; the job continues to allow artifact upload and issue creation.\n\n### What gets generated\n- `.github/workflows/<kebab(workflowName)>.yml` — A workflow with one job per stack plus a final summary job.\n- `.github/workflows/scripts/detect-drift.ts` — Helper script that:\n - Starts drift detection and polls until completion\n - Lists non‑`IN_SYNC` resources and builds an HTML report\n - Writes optional JSON to `DRIFT_DETECTION_OUTPUT` when set\n - Prints to stdout and appends to the GitHub Step Summary when available\n\n### Artifacts and summary\n- Each stack job uploads `drift-results-<stack>.json` (if produced).\n- A final `Drift Detection Summary` job downloads all artifacts and prints a consolidated summary.\n\n### Manual dispatch\n- The workflow exposes an input named `stack` with choices including each configured stack and an `all` option.\n- Choose a specific stack to run drift detection for that stack only, or select `all` (or leave the input empty) to run all stacks.\n\nNote: The default workflow does not post PR comments for drift. It can create/update an Issue on scheduled runs when `createIssues` is `true`.\n\n### Post-notification steps (e.g., Slack)\n\nYou can add your own GitHub Action steps to run after the drift detection step for each stack using `postGitHubSteps`.\nProvide your own Slack payload/markdown (this library no longer generates a payload step for you).\n\nOption A: slackapi/slack-github-action (Incoming Webhook, official syntax)\n\n```ts\nnew CdkDriftDetectionWorkflow({\n project,\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n stacks: [/* ... */],\n postGitHubSteps: ({ stack }) => {\n // Build a descriptive name per stack\n const name = `Notify Slack (${stack} post-drift)`;\n const step = {\n name,\n uses: 'slackapi/slack-github-action@v2.1.1',\n // by default, post steps run only when drift is detected; you can override `if`\n if: \"always() && steps.drift.outcome == 'failure'\",\n // Use official inputs: webhook + webhook-type, and a YAML payload with blocks\n with: {\n webhook: '${{ secrets.CDK_NOTIFICATIONS_SLACK_WEBHOOK }}',\n 'webhook-type': 'incoming-webhook',\n payload: [\n 'text: \"** ${{ env.STACK_NAME }} ** has drifted!\"',\n 'blocks:',\n ' - type: \"section\"',\n ' text:',\n ' type: \"mrkdwn\"',\n ' text: \"*Stack:* ${{ env.STACK_NAME }} (region ${{ env.AWS_REGION }}) has drifted:exclamation:\"',\n ' - type: \"section\"',\n ' fields:',\n ' - type: \"mrkdwn\"',\n ' text: \"*Stack ARN*\\\\n${{ steps.drift.outputs.stack-arn }}\"',\n ' - type: \"mrkdwn\"',\n ' text: \"*Issue*\\\\n<${{ github.server_url }}/${{ github.repository }}/issues/${{ steps.issue.outputs.result }}|#${{ steps.issue.outputs.result }}>\"',\n ].join('\\n'),\n },\n };\n return [step];\n },\n});\n```\n\nNote: The Issue link requires `createIssues: true` (default) so that the `Create Issue on Drift` step runs before this Slack step and exposes `steps.issue.outputs.result`. This library orders the steps accordingly.\n\nDetails:\n- `postGitHubSteps` can be:\n - an array of step objects, or\n - a factory function `({ stack }) => step | step[]`.\n- Each step you provide is inserted after the results are uploaded.\n- Default condition: if you do not set `if` on your step, it will default to `always() && steps.drift.outcome == 'failure'`.\n- Available context/env you can use:\n - `${{ env.STACK_NAME }}`, `${{ env.DRIFT_DETECTION_OUTPUT }}`\n - `${{ steps.drift.outcome }}` — success/failure of the detect step\n - `${{ steps.drift.outputs.stack-arn }}` — Stack ARN resolved at runtime\n - `${{ steps.issue.outputs.result }}` — Issue number if the workflow created/found one (empty when not applicable)\n```\n\n## Usage: CdkDriftIamTemplate\n\nEmit an example IAM template you can deploy in your account for the Drift Detection workflow.\n\n### With Projen\n\n```ts\nimport { awscdk } from 'projen';\nimport { CdkDriftIamTemplate } from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkConstructLibrary({\n // ...\n});\n\nnew CdkDriftIamTemplate({\n project,\n roleName: 'cdk-drift-role',\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n // Optional: custom output path (default: 'cdk-drift-workflow-iam-template.yaml')\n // outputPath: 'infra/cdk-drift-iam.yaml',\n});\n\nproject.synth();\n```\n\nA Projen task is also added:\n\n```bash\nnpx projen deploy-cdkdrift-iam-template -- --parameter-overrides GitHubOIDCRoleArn=... # plus any extra AWS CLI args\n```\n\n### Without Projen (Standalone Generator)\n\n```ts\nimport { CdkDriftIamTemplateGenerator } from '@jjrawlins/cdk-diff-pr-github-action';\nimport * as fs from 'fs';\n\nconst template = CdkDriftIamTemplateGenerator.generateTemplate({\n roleName: 'cdk-drift-role',\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n});\n\nfs.writeFileSync('cdk-drift-iam-template.yaml', template);\n\n// Get the deploy command\nconst deployCmd = CdkDriftIamTemplateGenerator.generateDeployCommand('cdk-drift-iam-template.yaml');\nconsole.log('Deploy with:', deployCmd);\n```\n\n### What the template defines\n\n- Parameter `GitHubOIDCRoleArn` with a default from `oidcRoleArn` — the ARN of your existing GitHub OIDC role allowed to assume this drift role.\n- IAM role `CdkDriftRole` with minimal permissions for CloudFormation drift detection operations.\n- Outputs exporting the role name and ARN.\n\n---\n\n## Usage: CdkDiffIamTemplateStackSet (Org-Wide Deployment)\n\n`CdkDiffIamTemplateStackSet` creates a CloudFormation StackSet template for deploying GitHub OIDC provider, OIDC role, and CDK diff/drift IAM roles across an entire AWS Organization. This is the recommended approach for organizations that want to enable CDK diff/drift workflows across multiple accounts.\n\n### Architecture\n\nEach account in your organization gets:\n- **GitHub OIDC Provider** — Authenticates GitHub Actions workflows\n- **GitHubOIDCRole** — Trusts the OIDC provider with repo/branch restrictions\n- **CdkChangesetRole** — For PR change set previews (trusts GitHubOIDCRole)\n- **CdkDriftRole** — For drift detection (trusts GitHubOIDCRole)\n\nThis is a self-contained deployment with **no role chaining required**.\n\n### With Projen\n\n```ts\nimport { awscdk } from 'projen';\nimport { CdkDiffIamTemplateStackSet } from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkConstructLibrary({ /* ... */ });\n\nnew CdkDiffIamTemplateStackSet({\n project,\n githubOidc: {\n owner: 'my-org', // GitHub org or username\n repositories: ['infra-repo', 'app-repo'], // Repos allowed to assume roles\n branches: ['main', 'release/*'], // Branch patterns (default: ['*'])\n },\n targetOrganizationalUnitIds: ['ou-xxxx-xxxxxxxx'], // Target OUs\n regions: ['us-east-1', 'eu-west-1'], // Target regions\n // Optional settings:\n // oidcRoleName: 'GitHubOIDCRole', // default\n // changesetRoleName: 'CdkChangesetRole', // default\n // driftRoleName: 'CdkDriftRole', // default\n // roleSelection: StackSetRoleSelection.BOTH, // BOTH, CHANGESET_ONLY, or DRIFT_ONLY\n // delegatedAdmin: true, // Use --call-as DELEGATED_ADMIN (default: true)\n});\n\nproject.synth();\n```\n\nThis creates:\n- `cdk-diff-workflow-stackset-template.yaml` — CloudFormation template\n- Projen tasks for StackSet management\n\n**Projen tasks:**\n```bash\nnpx projen stackset-create # Create the StackSet\nnpx projen stackset-update # Update the StackSet template\nnpx projen stackset-deploy-instances # Deploy to target OUs/regions\nnpx projen stackset-delete-instances # Remove stack instances\nnpx projen stackset-delete # Delete the StackSet\nnpx projen stackset-describe # Show StackSet status\nnpx projen stackset-list-instances # List all instances\n```\n\n### Without Projen (Standalone Generator)\n\nFor non-Projen projects, use `CdkDiffIamTemplateStackSetGenerator` directly:\n\n```ts\nimport {\n CdkDiffIamTemplateStackSetGenerator\n} from '@jjrawlins/cdk-diff-pr-github-action';\nimport * as fs from 'fs';\n\n// Generate the CloudFormation template\nconst template = CdkDiffIamTemplateStackSetGenerator.generateTemplate({\n githubOidc: {\n owner: 'my-org',\n repositories: ['infra-repo'],\n branches: ['main'],\n },\n});\n\n// Write to file\nfs.writeFileSync('stackset-template.yaml', template);\n\n// Get AWS CLI commands for StackSet operations\nconst commands = CdkDiffIamTemplateStackSetGenerator.generateCommands({\n stackSetName: 'cdk-diff-workflow-iam-stackset',\n templatePath: 'stackset-template.yaml',\n targetOrganizationalUnitIds: ['ou-xxxx-xxxxxxxx'],\n regions: ['us-east-1'],\n});\n\nconsole.log('Create StackSet:', commands['stackset-create']);\nconsole.log('Deploy instances:', commands['stackset-deploy-instances']);\n```\n\n### GitHub Actions Workflow (Simplified)\n\nWith per-account OIDC, your workflow is simplified — no role chaining needed:\n\n```yaml\njobs:\n diff:\n runs-on: ubuntu-latest\n permissions:\n id-token: write\n contents: read\n steps:\n - uses: actions/checkout@v4\n\n - uses: aws-actions/configure-aws-credentials@v4\n with:\n role-to-assume: arn:aws:iam::${{ env.ACCOUNT_ID }}:role/GitHubOIDCRole\n aws-region: us-east-1\n\n - name: Assume Changeset Role\n run: |\n CREDS=$(aws sts assume-role \\\n --role-arn arn:aws:iam::${{ env.ACCOUNT_ID }}:role/CdkChangesetRole \\\n --role-session-name changeset-session)\n # Export credentials...\n```\n\n### GitHubOidcConfig options\n\n| Property | Description |\n|----------|-------------|\n| `owner` | GitHub organization or username (required) |\n| `repositories` | Array of repo names, or `['*']` for all repos (required) |\n| `branches` | Array of branch patterns (default: `['*']`) |\n| `additionalClaims` | Extra OIDC claims like `['pull_request', 'environment:production']` |\n\n---\n\n## Testing\n\nThis repository includes Jest tests that snapshot the synthesized outputs from Projen and assert that:\n- Diff workflows are created per stack and contain all expected steps.\n- Drift detection workflow produces one job per stack and a summary job.\n- Only one helper script file is generated per workflow type.\n- Per‑stack OIDC overrides (where supported) are respected.\n- Helpful validation errors are thrown for missing OIDC settings.\n- The IAM template files contain the expected resources and outputs.\n\nRun tests with:\n\n```bash\nyarn test\n```\n\n## Notes\n- This package assumes your repository is configured with GitHub Actions and that you have a GitHub OIDC role configured in AWS.\n- The generated scripts use the AWS SDK v3 for CloudFormation and, where applicable, the GitHub REST API.\n"
|
|
3510
|
+
"markdown": "# cdk-diff-pr-github-action\n\nA [Projen](https://projen.io/) construct library that surfaces **CloudFormation change set diffs and drift status directly on your pull requests** so reviewers can see exactly what will change before merging.\n\n## Why this exists\n\n`cdk diff` output disappears into CI logs that nobody reads. Meanwhile, a single property change on an RDS instance or EC2 \"pet\" server can trigger a **resource replacement** — destroying the database or instance and recreating it from scratch. If that replacement slips through code review unnoticed, the result is data loss and downtime.\n\nThis construct was built to make those dangerous changes impossible to miss:\n\n- **Replacement column front and center** — Every change set row shows whether CloudFormation will modify the resource in place or **replace** it, with before/after property values so reviewers can understand *why*.\n- **Comment appears on the PR itself** — No digging through workflow logs. The diff table is posted (and updated in place) as a PR comment and in the GitHub Step Summary.\n- **Drift banner** — If the stack has drifted from its template, a warning banner is prepended to the comment so reviewers know the baseline is already out of sync.\n\nIf you have ever lost an EC2 instance, an RDS database, or an ElastiCache cluster to an unexpected CloudFormation replacement, this tool is for you.\n\n---\n\nA library that provides GitHub workflows and IAM templates for:\n- Creating CloudFormation Change Sets for your CDK stacks on pull requests and commenting a formatted diff back on the PR.\n- Detecting CloudFormation drift on a schedule or manual trigger and producing a consolidated summary (optionally creating an issue).\n- Deploying IAM roles across AWS Organizations using StackSets.\n\nIt also provides ready-to-deploy IAM templates with the minimal permissions required for each workflow.\n\n**Works with or without Projen** -- The StackSet generator can be used standalone in any Node.js project.\n\nThis package exposes five constructs:\n\n- `CdkDiffStackWorkflow` — Generates one GitHub Actions workflow per stack to create a change set and render the diff back to the PR and Step Summary.\n- `CdkDiffIamTemplate` — Emits a CloudFormation template file with minimal permissions for the Change Set workflow.\n- `CdkDriftDetectionWorkflow` — Generates a GitHub Actions workflow to detect CloudFormation drift per stack, upload machine‑readable results, and aggregate a summary.\n- `CdkDriftIamTemplate` — Emits a CloudFormation template file with minimal permissions for the Drift Detection workflow.\n- `CdkDiffIamTemplateStackSet` — Creates a CloudFormation StackSet template for org-wide deployment of GitHub OIDC and IAM roles (Projen integration).\n- `CdkDiffIamTemplateStackSetGenerator` — Pure generator class for StackSet templates (no Projen dependency).\n\n## Quick start\n\n1) Add the constructs to your Projen project (in `.projenrc.ts`).\n2) Synthesize with `npx projen`.\n3) Commit the generated files.\n4) Open a pull request or run the drift detection workflow.\n\n## End-to-end example\n\nA realistic setup for a CDK Pipelines project with multiple stages and accounts. This generates one diff workflow per stack, a shared IAM template, and a scheduled drift detection workflow.\n\n```ts\n// .projenrc.ts\nimport { awscdk } from 'projen';\nimport {\n CdkDiffStackWorkflow,\n CdkDiffIamTemplate,\n CdkDriftDetectionWorkflow,\n} from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkTypeScriptApp({\n name: 'my-data-platform',\n defaultReleaseBranch: 'main',\n cdkVersion: '2.170.0',\n github: true,\n});\n\n// --- Change Set Diff Workflows (one per stack) ---\n// stackName is the CDK construct path used with `cdk deploy <target>`.\n// For CDK Pipelines, this is typically: pipeline/Stage/Stack\n// The construct automatically resolves the real CloudFormation stack name\n// from cdk.out at runtime (e.g., \"my-stage-dev-my-stack\").\n\nnew CdkDiffStackWorkflow({\n project,\n oidcRoleArn: 'arn:aws:iam::111111111111:role/GitHubOIDCRole',\n oidcRegion: 'us-east-1',\n stacks: [\n {\n stackName: 'my-pipeline/dev/DatabaseStack',\n changesetRoleToAssumeArn: 'arn:aws:iam::111111111111:role/CdkChangesetRole',\n changesetRoleToAssumeRegion: 'us-east-1',\n },\n {\n stackName: 'my-pipeline/dev/ComputeStack',\n changesetRoleToAssumeArn: 'arn:aws:iam::111111111111:role/CdkChangesetRole',\n changesetRoleToAssumeRegion: 'us-east-1',\n },\n {\n // Cross-account: prod stacks can use a different OIDC role and region\n stackName: 'my-pipeline/prod/DatabaseStack',\n changesetRoleToAssumeArn: 'arn:aws:iam::222222222222:role/CdkChangesetRole',\n changesetRoleToAssumeRegion: 'us-east-1',\n oidcRoleArn: 'arn:aws:iam::222222222222:role/GitHubOIDCRole',\n oidcRegion: 'us-east-1',\n },\n ],\n});\n\n// --- IAM Template (deploy once per account) ---\nnew CdkDiffIamTemplate({\n project,\n roleName: 'CdkChangesetRole',\n createOidcRole: true,\n githubOidc: {\n owner: 'my-org',\n repositories: ['my-data-platform'],\n branches: ['main'],\n },\n});\n\n// --- Drift Detection (scheduled + manual) ---\nnew CdkDriftDetectionWorkflow({\n project,\n schedule: '0 6 * * 1', // Every Monday at 6 AM UTC\n oidcRoleArn: 'arn:aws:iam::111111111111:role/GitHubOIDCRole',\n oidcRegion: 'us-east-1',\n stacks: [\n {\n stackName: 'dev-DatabaseStack',\n driftDetectionRoleToAssumeArn: 'arn:aws:iam::111111111111:role/CdkDriftRole',\n driftDetectionRoleToAssumeRegion: 'us-east-1',\n },\n ],\n});\n\nproject.synth();\n```\n\nAfter `npx projen`, this generates:\n- `.github/workflows/diff-my-pipeline-dev-databasestack.yml`\n- `.github/workflows/diff-my-pipeline-dev-computestack.yml`\n- `.github/workflows/diff-my-pipeline-prod-databasestack.yml`\n- `.github/workflows/scripts/describe-cfn-changeset.ts`\n- `.github/workflows/drift-detection.yml`\n- `.github/workflows/scripts/detect-drift.ts`\n- `cdk-diff-workflow-iam-template.yaml`\n\nWhen a pull request is opened, each diff workflow runs automatically and posts a comment like this:\n\n| Action | ID | Type | Replacement | Details |\n|--------|-----|------|-------------|---------|\n| 🔵 Modify | MyDatabase | AWS::RDS::DBInstance | **True** | 🔵 **DBInstanceClass**: `db.t3.medium` -> `db.t3.large` |\n| 🔵 Modify | MyFunction | AWS::Lambda::Function | False | 🔵 **Runtime**: `nodejs18.x` -> `nodejs20.x` |\n\nThe **Replacement: True** on the RDS instance is exactly the kind of change this tool is designed to catch before it reaches production.\n\n## Usage: CdkDiffStackWorkflow\n\n`CdkDiffStackWorkflow` renders a workflow per stack named `diff-<StackName>.yml` under `.github/workflows/`. It also generates a helper script at `.github/workflows/scripts/describe-cfn-changeset.ts` that formats the change set output and takes care of posting the PR comment and Step Summary.\n\nExample `.projenrc.ts`:\n\n```ts\nimport { awscdk } from 'projen';\nimport { CdkDiffStackWorkflow } from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkConstructLibrary({\n // ... your usual settings ...\n workflowName: 'my-lib',\n defaultReleaseBranch: 'main',\n cdkVersion: '2.85.0',\n github: true,\n});\n\nnew CdkDiffStackWorkflow({\n project,\n stacks: [\n {\n stackName: 'MyAppStack',\n changesetRoleToAssumeArn: 'arn:aws:iam::123456789012:role/cdk-diff-role',\n changesetRoleToAssumeRegion: 'us-east-1',\n // Optional per‑stack OIDC override (if not using the defaults below)\n // oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n // oidcRegion: 'us-east-1',\n },\n ],\n // Default OIDC role/region used by all stacks unless overridden per‑stack\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n // Optional: Node version used in the workflow (default: '24.x')\n // nodeVersion: '24.x',\n // Optional: Yarn command to run CDK (default: 'cdk')\n // cdkYarnCommand: 'cdk',\n // Optional: Where to place the helper script (default: '.github/workflows/scripts/describe-cfn-changeset.ts')\n // scriptOutputPath: '.github/workflows/scripts/describe-cfn-changeset.ts',\n});\n\nproject.synth();\n```\n\n### CdkDiffStackWorkflow props\n- `project` (required) — Your Projen project instance.\n- `stacks` (required) — Array of stack entries.\n- `oidcRoleArn` (required unless provided per‑stack) — Default OIDC role ARN.\n- `oidcRegion` (required unless provided per‑stack) — Default OIDC region.\n- `nodeVersion` (optional, default `'24.x'`) — Node.js version for the workflow runner.\n- `cdkYarnCommand` (optional, default `'cdk'`) — Yarn script/command to invoke CDK.\n- `scriptOutputPath` (optional, default `'.github/workflows/scripts/describe-cfn-changeset.ts'`) — Where to write the helper script.\n- `workingDirectory` (optional) — Subdirectory where the CDK app lives (e.g., `'infra'`). Sets `defaults.run.working-directory` on all jobs so `install`, `synth`, and `deploy` steps run in that directory. The describe-changeset script path is automatically prefixed with `$GITHUB_WORKSPACE/` and `NODE_PATH` is set to resolve modules from the working directory.\n\nIf neither top‑level OIDC defaults nor all per‑stack values are supplied, the construct throws a helpful error.\n\n### Stack item fields\n- `stackName` (required) — The CDK stack name to create the change set for.\n- `changesetRoleToAssumeArn` (required) — The ARN of the role used to create the change set (role chaining after OIDC).\n- `changesetRoleToAssumeRegion` (required) — The region for that role.\n- `oidcRoleArn` (optional) — Per‑stack override for the OIDC role.\n- `oidcRegion` (optional) — Per‑stack override for the OIDC region.\n\n### What gets generated\n- `.github/workflows/diff-<StackName>.yml` — One workflow per stack, triggered on PR open/sync/reopen.\n- `.github/workflows/scripts/describe-cfn-changeset.ts` — A helper script that:\n - Polls `DescribeChangeSet` until terminal\n - Filters out ignorable logical IDs or resource types using environment variables `IGNORE_LOGICAL_IDS` and `IGNORE_RESOURCE_TYPES`\n - Renders an HTML table with actions, logical IDs, types, replacements, and changed properties\n - **Checks cached drift status** via `DescribeStacks` — if the stack has drifted, a warning banner with drifted resource details is prepended to the output (non-fatal; degrades gracefully if IAM permissions are missing)\n - Prints the HTML and appends to the GitHub Step Summary\n - **Upserts the PR comment** — uses an HTML marker (`<!-- cdk-diff:stack:STACK_NAME -->`) to find and update an existing comment instead of creating duplicates on every push\n\n### Change Set Output Format\n\nThe change set script uses the CloudFormation `IncludePropertyValues` API feature to show **actual before/after values** for changed properties, not just property names.\n\n**Example PR comment:**\n\n> **Warning: Stack has drifted (2 resources out of sync)**\n>\n> Last drift check: 2025-01-15T10:30:00.000Z\n>\n> <details><summary>View drifted resources</summary>\n>\n> | Resource | Type | Drift Status |\n> |----------|------|-------------|\n> | MySecurityGroup | AWS::EC2::SecurityGroup | MODIFIED |\n> | OldBucket | AWS::S3::Bucket | DELETED |\n> </details>\n\n| Action | ID | Type | Replacement | Details |\n|--------|-----|------|-------------|---------|\n| 🔵 Modify | MyDatabase | AWS::RDS::DBInstance | **True** | 🔵 **DBInstanceClass**: `db.t3.medium` -> `db.t3.large` |\n| 🔵 Modify | MyLambdaFunction | AWS::Lambda::Function | False | 🔵 **Runtime**: `nodejs18.x` -> `nodejs20.x` |\n| 🟢 Add | NewSecurityGroup | AWS::EC2::SecurityGroup | - | |\n| 🔴 Remove | OldRole | AWS::IAM::Role | - | |\n\n**Features:**\n- **Replacement column** highlights when CloudFormation will **destroy and recreate** a resource — critical for stateful resources like databases, EC2 instances, and file systems\n- **Drift banner** — if the stack has drifted, a warning with drifted resource details appears above the change set table so reviewers know the baseline state\n- **Comment upsert** — each stack's comment is updated in place on subsequent pushes instead of creating duplicates; uses an HTML marker for reliable find-and-replace\n- **Color-coded indicators**: 🟢 Added, 🔵 Modified, 🔴 Removed\n- **Inline values for small changes**: Shows `before -> after` directly in the table\n- **Collapsible details for large values**: IAM policies, tags, and other large JSON values are wrapped in expandable `<details>` elements to keep the table readable\n- **All attribute types supported**: Properties, Tags, Metadata, etc.\n- **HTML-escaped values**: Prevents XSS from property values\n\n### Environment variables used by the change set script\n- `STACK_NAME` (required) — Stack name to describe.\n- `CHANGE_SET_NAME` (default: same as `STACK_NAME`).\n- `AWS_REGION` — Region for CloudFormation API calls. The workflow sets this via the credentials action(s).\n- `GITHUB_TOKEN` (optional) — If set with `GITHUB_COMMENT_URL`, posts a PR comment.\n- `GITHUB_COMMENT_URL` (optional) — PR comments URL.\n- `GITHUB_STEP_SUMMARY` (optional) — When present, appends the HTML to the step summary file.\n- `IGNORE_LOGICAL_IDS` (optional) — Comma‑separated logical IDs to ignore (default includes `CDKMetadata`).\n- `IGNORE_RESOURCE_TYPES` (optional) — Comma‑separated resource types to ignore (e.g., `AWS::CDK::Metadata`).\n\n## Usage: CdkDiffIamTemplate\n\nEmit an IAM template you can deploy in your account for the Change Set workflow. Supports two modes:\n\n1. **External OIDC Role** — Reference an existing GitHub OIDC role (original behavior)\n2. **Self-Contained** — Create the GitHub OIDC provider and role within the same template (new)\n\n### Option 1: Using an Existing OIDC Role (External)\n\nUse this when you already have a GitHub OIDC provider and role set up in your account.\n\n#### With Projen\n\n```ts\nimport { awscdk } from 'projen';\nimport { CdkDiffIamTemplate } from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkConstructLibrary({\n // ...\n});\n\nnew CdkDiffIamTemplate({\n project,\n roleName: 'cdk-diff-role',\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n // Optional: custom output path (default: 'cdk-diff-workflow-iam-template.yaml')\n // outputPath: 'infra/cdk-diff-iam.yaml',\n});\n\nproject.synth();\n```\n\n#### Without Projen (Standalone Generator)\n\n```ts\nimport { CdkDiffIamTemplateGenerator } from '@jjrawlins/cdk-diff-pr-github-action';\nimport * as fs from 'fs';\n\nconst template = CdkDiffIamTemplateGenerator.generateTemplate({\n roleName: 'cdk-diff-role',\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n});\n\nfs.writeFileSync('cdk-diff-iam-template.yaml', template);\n```\n\n### Option 2: Self-Contained Template (Create OIDC Role)\n\nUse this when you want a single template that creates everything needed — the GitHub OIDC provider, OIDC role, and changeset role. This simplifies deployment and pairs well with the `CdkDiffStackWorkflow`.\n\n#### With Projen\n\n```ts\nimport { awscdk } from 'projen';\nimport { CdkDiffIamTemplate } from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkConstructLibrary({\n // ...\n});\n\nnew CdkDiffIamTemplate({\n project,\n roleName: 'CdkChangesetRole',\n createOidcRole: true,\n oidcRoleName: 'GitHubOIDCRole', // Optional, default: 'GitHubOIDCRole'\n githubOidc: {\n owner: 'my-org', // GitHub org or username\n repositories: ['infra-repo', 'app-repo'], // Repos allowed to assume roles\n branches: ['main', 'release/*'], // Branch patterns (default: ['*'])\n },\n // Optional: Skip OIDC provider creation if it already exists\n // skipOidcProviderCreation: true,\n});\n\nproject.synth();\n```\n\n#### Without Projen (Standalone Generator)\n\n```ts\nimport { CdkDiffIamTemplateGenerator } from '@jjrawlins/cdk-diff-pr-github-action';\nimport * as fs from 'fs';\n\nconst template = CdkDiffIamTemplateGenerator.generateTemplate({\n roleName: 'CdkChangesetRole',\n createOidcRole: true,\n oidcRoleName: 'GitHubOIDCRole',\n githubOidc: {\n owner: 'my-org',\n repositories: ['infra-repo'],\n branches: ['main'],\n },\n});\n\nfs.writeFileSync('cdk-diff-iam-template.yaml', template);\n```\n\n#### With Existing OIDC Provider (Skip Creation)\n\nIf your account already has a GitHub OIDC provider but you want the template to create the roles:\n\n```ts\nnew CdkDiffIamTemplate({\n project,\n roleName: 'CdkChangesetRole',\n createOidcRole: true,\n skipOidcProviderCreation: true, // Account already has OIDC provider\n githubOidc: {\n owner: 'my-org',\n repositories: ['*'], // All repos in org\n },\n});\n```\n\n### Deploy Task\n\nA Projen task is added for easy deployment:\n\n```bash\nnpx projen deploy-cdkdiff-iam-template -- --parameter-overrides GitHubOIDCRoleArn=... # plus any extra AWS CLI args\n```\n\n### CdkDiffIamTemplate Props\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `roleName` | `string` | Name for the changeset IAM role (required) |\n| `oidcRoleArn` | `string?` | ARN of existing GitHub OIDC role. Required when `createOidcRole` is false. |\n| `oidcRegion` | `string?` | Region for OIDC trust condition. Required when `createOidcRole` is false. |\n| `createOidcRole` | `boolean?` | Create OIDC role within template (default: false) |\n| `oidcRoleName` | `string?` | Name of OIDC role to create (default: 'GitHubOIDCRole') |\n| `githubOidc` | `GitHubOidcConfig?` | GitHub OIDC config. Required when `createOidcRole` is true. |\n| `skipOidcProviderCreation` | `boolean?` | Skip OIDC provider if it exists (default: false) |\n| `outputPath` | `string?` | Template output path (default: 'cdk-diff-workflow-iam-template.yaml') |\n\n### What the Template Creates\n\n**External OIDC Role mode:**\n- Parameter `GitHubOIDCRoleArn` — ARN of your existing GitHub OIDC role\n- IAM role `CdkChangesetRole` with minimal permissions for change set operations\n- Outputs: `CdkChangesetRoleArn`, `CdkChangesetRoleName`\n\n**Self-Contained mode (`createOidcRole: true`):**\n- GitHub OIDC Provider (unless `skipOidcProviderCreation: true`)\n- IAM role `GitHubOIDCRole` with trust policy for GitHub Actions\n- IAM role `CdkChangesetRole` with minimal permissions (trusts the OIDC role)\n- Outputs: `GitHubOIDCProviderArn`, `GitHubOIDCRoleArn`, `GitHubOIDCRoleName`, `CdkChangesetRoleArn`, `CdkChangesetRoleName`\n\n**Changeset Role Permissions:**\n- CloudFormation Change Set operations\n- Access to CDK bootstrap S3 buckets and SSM parameters\n- `iam:PassRole` to `cloudformation.amazonaws.com`\n\nUse the created changeset role ARN as `changesetRoleToAssumeArn` in `CdkDiffStackWorkflow`.\n\n---\n\n## Usage: CdkDriftDetectionWorkflow\n\n`CdkDriftDetectionWorkflow` creates a single workflow file (default `drift-detection.yml`) that can run on a schedule and via manual dispatch. It generates a helper script at `.github/workflows/scripts/detect-drift.ts` (by default) that uses AWS SDK v3 to run drift detection, write optional machine‑readable JSON, and print an HTML report for the Step Summary.\n\nExample `.projenrc.ts`:\n\n```ts\nimport { awscdk } from 'projen';\nimport { CdkDriftDetectionWorkflow } from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkConstructLibrary({ github: true, /* ... */ });\n\nnew CdkDriftDetectionWorkflow({\n project,\n workflowName: 'Drift Detection', // optional; file name derived as 'drift-detection.yml'\n schedule: '0 1 * * *', // optional cron\n createIssues: true, // default true; create/update issue when drift detected on schedule\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n // Optional: Node version (default '24.x')\n // nodeVersion: '24.x',\n // Optional: Where to place the helper script (default '.github/workflows/scripts/detect-drift.ts')\n // scriptOutputPath: '.github/workflows/scripts/detect-drift.ts',\n stacks: [\n {\n stackName: 'MyAppStack-Prod',\n driftDetectionRoleToAssumeArn: 'arn:aws:iam::123456789012:role/cdk-drift-role',\n driftDetectionRoleToAssumeRegion: 'us-east-1',\n // failOnDrift: true, // optional (default true)\n },\n ],\n});\n\nproject.synth();\n```\n\n### CdkDriftDetectionWorkflow props\n- `project` (required) — Your Projen project instance.\n- `stacks` (required) — Array of stacks to check.\n- `oidcRoleArn` (required) — Default OIDC role ARN used before chaining into per‑stack drift roles.\n- `oidcRegion` (required) — Default OIDC region.\n- `workflowName` (optional, default `'drift-detection'`) — Human‑friendly workflow name; the file name is derived in kebab‑case.\n- `schedule` (optional) — Cron expression for automatic runs.\n- `createIssues` (optional, default `true`) — When true, scheduled runs will create/update a GitHub issue if drift is detected.\n- `nodeVersion` (optional, default `'24.x'`) — Node.js version for the runner.\n- `scriptOutputPath` (optional, default `'.github/workflows/scripts/detect-drift.ts'`) — Where to write the helper script.\n- `workingDirectory` (optional) — Subdirectory where the CDK app lives (e.g., `'infra'`). Sets `defaults.run.working-directory` on all jobs. Artifact upload and issue-script paths are automatically prefixed.\n\n### Per‑stack fields\n- `stackName` (required) — The full CloudFormation stack name.\n- `driftDetectionRoleToAssumeArn` (required) — Role to assume (after OIDC) for making drift API calls.\n- `driftDetectionRoleToAssumeRegion` (required) — Region for that role and API calls.\n- `failOnDrift` (optional, default `true`) — Intended to fail the detection step on drift. The provided script exits with non‑zero when drift is found; the job continues to allow artifact upload and issue creation.\n\n### What gets generated\n- `.github/workflows/<kebab(workflowName)>.yml` — A workflow with one job per stack plus a final summary job.\n- `.github/workflows/scripts/detect-drift.ts` — Helper script that:\n - Starts drift detection and polls until completion\n - Lists non‑`IN_SYNC` resources and builds an HTML report\n - Writes optional JSON to `DRIFT_DETECTION_OUTPUT` when set\n - Prints to stdout and appends to the GitHub Step Summary when available\n\n### Artifacts and summary\n- Each stack job uploads `drift-results-<stack>.json` (if produced).\n- A final `Drift Detection Summary` job downloads all artifacts and prints a consolidated summary.\n\n### Manual dispatch\n- The workflow exposes an input named `stack` with choices including each configured stack and an `all` option.\n- Choose a specific stack to run drift detection for that stack only, or select `all` (or leave the input empty) to run all stacks.\n\nNote: The default workflow does not post PR comments for drift. It can create/update an Issue on scheduled runs when `createIssues` is `true`.\n\n### Post-notification steps (e.g., Slack)\n\nYou can add your own GitHub Action steps to run after the drift detection step for each stack using `postGitHubSteps`.\nProvide your own Slack payload/markdown (this library no longer generates a payload step for you).\n\nOption A: slackapi/slack-github-action (Incoming Webhook, official syntax)\n\n```ts\nnew CdkDriftDetectionWorkflow({\n project,\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n stacks: [/* ... */],\n postGitHubSteps: ({ stack }) => {\n // Build a descriptive name per stack\n const name = `Notify Slack (${stack} post-drift)`;\n const step = {\n name,\n uses: 'slackapi/slack-github-action@v2.1.1',\n // by default, post steps run only when drift is detected; you can override `if`\n if: \"always() && steps.drift.outcome == 'failure'\",\n // Use official inputs: webhook + webhook-type, and a YAML payload with blocks\n with: {\n webhook: '${{ secrets.CDK_NOTIFICATIONS_SLACK_WEBHOOK }}',\n 'webhook-type': 'incoming-webhook',\n payload: [\n 'text: \"** ${{ env.STACK_NAME }} ** has drifted!\"',\n 'blocks:',\n ' - type: \"section\"',\n ' text:',\n ' type: \"mrkdwn\"',\n ' text: \"*Stack:* ${{ env.STACK_NAME }} (region ${{ env.AWS_REGION }}) has drifted:exclamation:\"',\n ' - type: \"section\"',\n ' fields:',\n ' - type: \"mrkdwn\"',\n ' text: \"*Stack ARN*\\\\n${{ steps.drift.outputs.stack-arn }}\"',\n ' - type: \"mrkdwn\"',\n ' text: \"*Issue*\\\\n<${{ github.server_url }}/${{ github.repository }}/issues/${{ steps.issue.outputs.result }}|#${{ steps.issue.outputs.result }}>\"',\n ].join('\\n'),\n },\n };\n return [step];\n },\n});\n```\n\nNote: The Issue link requires `createIssues: true` (default) so that the `Create Issue on Drift` step runs before this Slack step and exposes `steps.issue.outputs.result`. This library orders the steps accordingly.\n\nDetails:\n- `postGitHubSteps` can be:\n - an array of step objects, or\n - a factory function `({ stack }) => step | step[]`.\n- Each step you provide is inserted after the results are uploaded.\n- Default condition: if you do not set `if` on your step, it will default to `always() && steps.drift.outcome == 'failure'`.\n- Available context/env you can use:\n - `${{ env.STACK_NAME }}`, `${{ env.DRIFT_DETECTION_OUTPUT }}`\n - `${{ steps.drift.outcome }}` — success/failure of the detect step\n - `${{ steps.drift.outputs.stack-arn }}` — Stack ARN resolved at runtime\n - `${{ steps.issue.outputs.result }}` — Issue number if the workflow created/found one (empty when not applicable)\n```\n\n## Usage: CdkDriftIamTemplate\n\nEmit an example IAM template you can deploy in your account for the Drift Detection workflow.\n\n### With Projen\n\n```ts\nimport { awscdk } from 'projen';\nimport { CdkDriftIamTemplate } from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkConstructLibrary({\n // ...\n});\n\nnew CdkDriftIamTemplate({\n project,\n roleName: 'cdk-drift-role',\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n // Optional: custom output path (default: 'cdk-drift-workflow-iam-template.yaml')\n // outputPath: 'infra/cdk-drift-iam.yaml',\n});\n\nproject.synth();\n```\n\nA Projen task is also added:\n\n```bash\nnpx projen deploy-cdkdrift-iam-template -- --parameter-overrides GitHubOIDCRoleArn=... # plus any extra AWS CLI args\n```\n\n### Without Projen (Standalone Generator)\n\n```ts\nimport { CdkDriftIamTemplateGenerator } from '@jjrawlins/cdk-diff-pr-github-action';\nimport * as fs from 'fs';\n\nconst template = CdkDriftIamTemplateGenerator.generateTemplate({\n roleName: 'cdk-drift-role',\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n});\n\nfs.writeFileSync('cdk-drift-iam-template.yaml', template);\n\n// Get the deploy command\nconst deployCmd = CdkDriftIamTemplateGenerator.generateDeployCommand('cdk-drift-iam-template.yaml');\nconsole.log('Deploy with:', deployCmd);\n```\n\n### What the template defines\n\n- Parameter `GitHubOIDCRoleArn` with a default from `oidcRoleArn` — the ARN of your existing GitHub OIDC role allowed to assume this drift role.\n- IAM role `CdkDriftRole` with minimal permissions for CloudFormation drift detection operations.\n- Outputs exporting the role name and ARN.\n\n---\n\n## Usage: CdkDiffIamTemplateStackSet (Org-Wide Deployment)\n\n`CdkDiffIamTemplateStackSet` creates a CloudFormation StackSet template for deploying GitHub OIDC provider, OIDC role, and CDK diff/drift IAM roles across an entire AWS Organization. This is the recommended approach for organizations that want to enable CDK diff/drift workflows across multiple accounts.\n\n### Architecture\n\nEach account in your organization gets:\n- **GitHub OIDC Provider** — Authenticates GitHub Actions workflows\n- **GitHubOIDCRole** — Trusts the OIDC provider with repo/branch restrictions\n- **CdkChangesetRole** — For PR change set previews (trusts GitHubOIDCRole)\n- **CdkDriftRole** — For drift detection (trusts GitHubOIDCRole)\n\nThis is a self-contained deployment with **no role chaining required**.\n\n### With Projen\n\n```ts\nimport { awscdk } from 'projen';\nimport { CdkDiffIamTemplateStackSet } from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkConstructLibrary({ /* ... */ });\n\nnew CdkDiffIamTemplateStackSet({\n project,\n githubOidc: {\n owner: 'my-org', // GitHub org or username\n repositories: ['infra-repo', 'app-repo'], // Repos allowed to assume roles\n branches: ['main', 'release/*'], // Branch patterns (default: ['*'])\n },\n targetOrganizationalUnitIds: ['ou-xxxx-xxxxxxxx'], // Target OUs\n regions: ['us-east-1', 'eu-west-1'], // Target regions\n // Optional settings:\n // oidcRoleName: 'GitHubOIDCRole', // default\n // changesetRoleName: 'CdkChangesetRole', // default\n // driftRoleName: 'CdkDriftRole', // default\n // roleSelection: StackSetRoleSelection.BOTH, // BOTH, CHANGESET_ONLY, or DRIFT_ONLY\n // delegatedAdmin: true, // Use --call-as DELEGATED_ADMIN (default: true)\n});\n\nproject.synth();\n```\n\nThis creates:\n- `cdk-diff-workflow-stackset-template.yaml` — CloudFormation template\n- Projen tasks for StackSet management\n\n**Projen tasks:**\n```bash\nnpx projen stackset-create # Create the StackSet\nnpx projen stackset-update # Update the StackSet template\nnpx projen stackset-deploy-instances # Deploy to target OUs/regions\nnpx projen stackset-delete-instances # Remove stack instances\nnpx projen stackset-delete # Delete the StackSet\nnpx projen stackset-describe # Show StackSet status\nnpx projen stackset-list-instances # List all instances\n```\n\n### Without Projen (Standalone Generator)\n\nFor non-Projen projects, use `CdkDiffIamTemplateStackSetGenerator` directly:\n\n```ts\nimport {\n CdkDiffIamTemplateStackSetGenerator\n} from '@jjrawlins/cdk-diff-pr-github-action';\nimport * as fs from 'fs';\n\n// Generate the CloudFormation template\nconst template = CdkDiffIamTemplateStackSetGenerator.generateTemplate({\n githubOidc: {\n owner: 'my-org',\n repositories: ['infra-repo'],\n branches: ['main'],\n },\n});\n\n// Write to file\nfs.writeFileSync('stackset-template.yaml', template);\n\n// Get AWS CLI commands for StackSet operations\nconst commands = CdkDiffIamTemplateStackSetGenerator.generateCommands({\n stackSetName: 'cdk-diff-workflow-iam-stackset',\n templatePath: 'stackset-template.yaml',\n targetOrganizationalUnitIds: ['ou-xxxx-xxxxxxxx'],\n regions: ['us-east-1'],\n});\n\nconsole.log('Create StackSet:', commands['stackset-create']);\nconsole.log('Deploy instances:', commands['stackset-deploy-instances']);\n```\n\n### GitHub Actions Workflow (Simplified)\n\nWith per-account OIDC, your workflow is simplified — no role chaining needed:\n\n```yaml\njobs:\n diff:\n runs-on: ubuntu-latest\n permissions:\n id-token: write\n contents: read\n steps:\n - uses: actions/checkout@v4\n\n - uses: aws-actions/configure-aws-credentials@v4\n with:\n role-to-assume: arn:aws:iam::${{ env.ACCOUNT_ID }}:role/GitHubOIDCRole\n aws-region: us-east-1\n\n - name: Assume Changeset Role\n run: |\n CREDS=$(aws sts assume-role \\\n --role-arn arn:aws:iam::${{ env.ACCOUNT_ID }}:role/CdkChangesetRole \\\n --role-session-name changeset-session)\n # Export credentials...\n```\n\n### GitHubOidcConfig options\n\n| Property | Description |\n|----------|-------------|\n| `owner` | GitHub organization or username (required) |\n| `repositories` | Array of repo names, or `['*']` for all repos (required) |\n| `branches` | Array of branch patterns (default: `['*']`) |\n| `additionalClaims` | Extra OIDC claims like `['pull_request', 'environment:production']` |\n\n---\n\n## Testing\n\nThis repository includes Jest tests that snapshot the synthesized outputs from Projen and assert that:\n- Diff workflows are created per stack and contain all expected steps.\n- Drift detection workflow produces one job per stack and a summary job.\n- Only one helper script file is generated per workflow type.\n- Per‑stack OIDC overrides (where supported) are respected.\n- Helpful validation errors are thrown for missing OIDC settings.\n- The IAM template files contain the expected resources and outputs.\n\nRun tests with:\n\n```bash\nyarn test\n```\n\n## Monorepo support\n\nIf your CDK app lives in a subdirectory (e.g., `infra/`), use the `workingDirectory` option:\n\n```ts\nnew CdkDiffStackWorkflow({\n project,\n workingDirectory: 'infra',\n oidcRoleArn: 'arn:aws:iam::111111111111:role/GitHubOIDCRole',\n oidcRegion: 'us-east-1',\n stacks: [\n {\n stackName: 'MyStack-dev',\n changesetRoleToAssumeArn: 'arn:aws:iam::222222222222:role/CdkChangesetRole',\n changesetRoleToAssumeRegion: 'us-east-1',\n },\n ],\n});\n\nnew CdkDriftDetectionWorkflow({\n project,\n workingDirectory: 'infra',\n oidcRoleArn: 'arn:aws:iam::111111111111:role/GitHubOIDCRole',\n oidcRegion: 'us-east-1',\n stacks: [\n {\n stackName: 'MyStack-dev',\n driftDetectionRoleToAssumeArn: 'arn:aws:iam::222222222222:role/CdkDriftRole',\n driftDetectionRoleToAssumeRegion: 'us-east-1',\n },\n ],\n});\n```\n\nThis sets `defaults.run.working-directory: infra` on all workflow jobs so that `install`, `synth`, and `deploy` steps run in the correct directory. The describe-changeset and detect-drift scripts are referenced with absolute paths so they resolve correctly from the subdirectory.\n\n**Note:** Your `infra/package.json` must include `@aws-sdk/client-cloudformation` as a dependency for the describe-changeset script to resolve modules at runtime.\n\n## Notes\n- This package assumes your repository is configured with GitHub Actions and that you have a GitHub OIDC role configured in AWS.\n- The generated scripts use the AWS SDK v3 for CloudFormation and, where applicable, the GitHub REST API.\n"
|
|
3511
3511
|
},
|
|
3512
3512
|
"repository": {
|
|
3513
3513
|
"type": "git",
|
|
@@ -4472,7 +4472,7 @@
|
|
|
4472
4472
|
},
|
|
4473
4473
|
"locationInModule": {
|
|
4474
4474
|
"filename": "src/CdkDiffStackWorkflow.ts",
|
|
4475
|
-
"line":
|
|
4475
|
+
"line": 41
|
|
4476
4476
|
},
|
|
4477
4477
|
"parameters": [
|
|
4478
4478
|
{
|
|
@@ -4486,7 +4486,7 @@
|
|
|
4486
4486
|
"kind": "class",
|
|
4487
4487
|
"locationInModule": {
|
|
4488
4488
|
"filename": "src/CdkDiffStackWorkflow.ts",
|
|
4489
|
-
"line":
|
|
4489
|
+
"line": 38
|
|
4490
4490
|
},
|
|
4491
4491
|
"name": "CdkDiffStackWorkflow",
|
|
4492
4492
|
"symbolId": "src/CdkDiffStackWorkflow:CdkDiffStackWorkflow"
|
|
@@ -4619,6 +4619,25 @@
|
|
|
4619
4619
|
"type": {
|
|
4620
4620
|
"primitive": "string"
|
|
4621
4621
|
}
|
|
4622
|
+
},
|
|
4623
|
+
{
|
|
4624
|
+
"abstract": true,
|
|
4625
|
+
"docs": {
|
|
4626
|
+
"default": "- repository root",
|
|
4627
|
+
"remarks": "Useful for monorepos where infrastructure lives in a subdirectory (e.g., 'infra').\n\nWhen set, all workflow run steps will use `defaults.run.working-directory`\nand script paths will be adjusted to use absolute references.",
|
|
4628
|
+
"stability": "experimental",
|
|
4629
|
+
"summary": "Working directory for the CDK app, relative to the repository root."
|
|
4630
|
+
},
|
|
4631
|
+
"immutable": true,
|
|
4632
|
+
"locationInModule": {
|
|
4633
|
+
"filename": "src/CdkDiffStackWorkflow.ts",
|
|
4634
|
+
"line": 36
|
|
4635
|
+
},
|
|
4636
|
+
"name": "workingDirectory",
|
|
4637
|
+
"optional": true,
|
|
4638
|
+
"type": {
|
|
4639
|
+
"primitive": "string"
|
|
4640
|
+
}
|
|
4622
4641
|
}
|
|
4623
4642
|
],
|
|
4624
4643
|
"symbolId": "src/CdkDiffStackWorkflow:CdkDiffStackWorkflowProps"
|
|
@@ -4635,7 +4654,7 @@
|
|
|
4635
4654
|
},
|
|
4636
4655
|
"locationInModule": {
|
|
4637
4656
|
"filename": "src/CdkDriftDetectionWorkflow.ts",
|
|
4638
|
-
"line":
|
|
4657
|
+
"line": 75
|
|
4639
4658
|
},
|
|
4640
4659
|
"parameters": [
|
|
4641
4660
|
{
|
|
@@ -4649,7 +4668,7 @@
|
|
|
4649
4668
|
"kind": "class",
|
|
4650
4669
|
"locationInModule": {
|
|
4651
4670
|
"filename": "src/CdkDriftDetectionWorkflow.ts",
|
|
4652
|
-
"line":
|
|
4671
|
+
"line": 72
|
|
4653
4672
|
},
|
|
4654
4673
|
"name": "CdkDriftDetectionWorkflow",
|
|
4655
4674
|
"symbolId": "src/CdkDriftDetectionWorkflow:CdkDriftDetectionWorkflow"
|
|
@@ -4777,7 +4796,7 @@
|
|
|
4777
4796
|
"immutable": true,
|
|
4778
4797
|
"locationInModule": {
|
|
4779
4798
|
"filename": "src/CdkDriftDetectionWorkflow.ts",
|
|
4780
|
-
"line":
|
|
4799
|
+
"line": 57
|
|
4781
4800
|
},
|
|
4782
4801
|
"name": "postGitHubSteps",
|
|
4783
4802
|
"optional": true,
|
|
@@ -4832,6 +4851,25 @@
|
|
|
4832
4851
|
"type": {
|
|
4833
4852
|
"primitive": "string"
|
|
4834
4853
|
}
|
|
4854
|
+
},
|
|
4855
|
+
{
|
|
4856
|
+
"abstract": true,
|
|
4857
|
+
"docs": {
|
|
4858
|
+
"default": "- repository root",
|
|
4859
|
+
"remarks": "Useful for monorepos where infrastructure lives in a subdirectory (e.g., 'infra').\n\nWhen set, all workflow run steps will use `defaults.run.working-directory`\nand artifact/script paths will be adjusted accordingly.",
|
|
4860
|
+
"stability": "experimental",
|
|
4861
|
+
"summary": "Working directory for the CDK app, relative to the repository root."
|
|
4862
|
+
},
|
|
4863
|
+
"immutable": true,
|
|
4864
|
+
"locationInModule": {
|
|
4865
|
+
"filename": "src/CdkDriftDetectionWorkflow.ts",
|
|
4866
|
+
"line": 42
|
|
4867
|
+
},
|
|
4868
|
+
"name": "workingDirectory",
|
|
4869
|
+
"optional": true,
|
|
4870
|
+
"type": {
|
|
4871
|
+
"primitive": "string"
|
|
4872
|
+
}
|
|
4835
4873
|
}
|
|
4836
4874
|
],
|
|
4837
4875
|
"symbolId": "src/CdkDriftDetectionWorkflow:CdkDriftDetectionWorkflowProps"
|
|
@@ -5363,6 +5401,6 @@
|
|
|
5363
5401
|
"symbolId": "src/CdkDiffIamTemplateStackSet:StackSetRoleSelection"
|
|
5364
5402
|
}
|
|
5365
5403
|
},
|
|
5366
|
-
"version": "1.
|
|
5367
|
-
"fingerprint": "
|
|
5404
|
+
"version": "1.8.0",
|
|
5405
|
+
"fingerprint": "gOPm1rvgC24rKxRefMcHRBmTZTxskniMczkswaBzoY4="
|
|
5368
5406
|
}
|
package/API.md
CHANGED
|
@@ -797,6 +797,7 @@ const cdkDiffStackWorkflowProps: CdkDiffStackWorkflowProps = { ... }
|
|
|
797
797
|
| <code><a href="#@jjrawlins/cdk-diff-pr-github-action.CdkDiffStackWorkflowProps.property.oidcRegion">oidcRegion</a></code> | <code>string</code> | *No description.* |
|
|
798
798
|
| <code><a href="#@jjrawlins/cdk-diff-pr-github-action.CdkDiffStackWorkflowProps.property.oidcRoleArn">oidcRoleArn</a></code> | <code>string</code> | *No description.* |
|
|
799
799
|
| <code><a href="#@jjrawlins/cdk-diff-pr-github-action.CdkDiffStackWorkflowProps.property.scriptOutputPath">scriptOutputPath</a></code> | <code>string</code> | *No description.* |
|
|
800
|
+
| <code><a href="#@jjrawlins/cdk-diff-pr-github-action.CdkDiffStackWorkflowProps.property.workingDirectory">workingDirectory</a></code> | <code>string</code> | Working directory for the CDK app, relative to the repository root. |
|
|
800
801
|
|
|
801
802
|
---
|
|
802
803
|
|
|
@@ -870,6 +871,24 @@ public readonly scriptOutputPath: string;
|
|
|
870
871
|
|
|
871
872
|
---
|
|
872
873
|
|
|
874
|
+
##### `workingDirectory`<sup>Optional</sup> <a name="workingDirectory" id="@jjrawlins/cdk-diff-pr-github-action.CdkDiffStackWorkflowProps.property.workingDirectory"></a>
|
|
875
|
+
|
|
876
|
+
```typescript
|
|
877
|
+
public readonly workingDirectory: string;
|
|
878
|
+
```
|
|
879
|
+
|
|
880
|
+
- *Type:* string
|
|
881
|
+
- *Default:* repository root
|
|
882
|
+
|
|
883
|
+
Working directory for the CDK app, relative to the repository root.
|
|
884
|
+
|
|
885
|
+
Useful for monorepos where infrastructure lives in a subdirectory (e.g., 'infra').
|
|
886
|
+
|
|
887
|
+
When set, all workflow run steps will use `defaults.run.working-directory`
|
|
888
|
+
and script paths will be adjusted to use absolute references.
|
|
889
|
+
|
|
890
|
+
---
|
|
891
|
+
|
|
873
892
|
### CdkDriftDetectionWorkflowProps <a name="CdkDriftDetectionWorkflowProps" id="@jjrawlins/cdk-diff-pr-github-action.CdkDriftDetectionWorkflowProps"></a>
|
|
874
893
|
|
|
875
894
|
#### Initializer <a name="Initializer" id="@jjrawlins/cdk-diff-pr-github-action.CdkDriftDetectionWorkflowProps.Initializer"></a>
|
|
@@ -894,6 +913,7 @@ const cdkDriftDetectionWorkflowProps: CdkDriftDetectionWorkflowProps = { ... }
|
|
|
894
913
|
| <code><a href="#@jjrawlins/cdk-diff-pr-github-action.CdkDriftDetectionWorkflowProps.property.schedule">schedule</a></code> | <code>string</code> | *No description.* |
|
|
895
914
|
| <code><a href="#@jjrawlins/cdk-diff-pr-github-action.CdkDriftDetectionWorkflowProps.property.scriptOutputPath">scriptOutputPath</a></code> | <code>string</code> | *No description.* |
|
|
896
915
|
| <code><a href="#@jjrawlins/cdk-diff-pr-github-action.CdkDriftDetectionWorkflowProps.property.workflowName">workflowName</a></code> | <code>string</code> | *No description.* |
|
|
916
|
+
| <code><a href="#@jjrawlins/cdk-diff-pr-github-action.CdkDriftDetectionWorkflowProps.property.workingDirectory">workingDirectory</a></code> | <code>string</code> | Working directory for the CDK app, relative to the repository root. |
|
|
897
917
|
|
|
898
918
|
---
|
|
899
919
|
|
|
@@ -1003,6 +1023,24 @@ public readonly workflowName: string;
|
|
|
1003
1023
|
|
|
1004
1024
|
---
|
|
1005
1025
|
|
|
1026
|
+
##### `workingDirectory`<sup>Optional</sup> <a name="workingDirectory" id="@jjrawlins/cdk-diff-pr-github-action.CdkDriftDetectionWorkflowProps.property.workingDirectory"></a>
|
|
1027
|
+
|
|
1028
|
+
```typescript
|
|
1029
|
+
public readonly workingDirectory: string;
|
|
1030
|
+
```
|
|
1031
|
+
|
|
1032
|
+
- *Type:* string
|
|
1033
|
+
- *Default:* repository root
|
|
1034
|
+
|
|
1035
|
+
Working directory for the CDK app, relative to the repository root.
|
|
1036
|
+
|
|
1037
|
+
Useful for monorepos where infrastructure lives in a subdirectory (e.g., 'infra').
|
|
1038
|
+
|
|
1039
|
+
When set, all workflow run steps will use `defaults.run.working-directory`
|
|
1040
|
+
and artifact/script paths will be adjusted accordingly.
|
|
1041
|
+
|
|
1042
|
+
---
|
|
1043
|
+
|
|
1006
1044
|
### CdkDriftIamTemplateGeneratorProps <a name="CdkDriftIamTemplateGeneratorProps" id="@jjrawlins/cdk-diff-pr-github-action.CdkDriftIamTemplateGeneratorProps"></a>
|
|
1007
1045
|
|
|
1008
1046
|
Props for generating CDK Drift IAM templates (no Projen dependency).
|
package/README.md
CHANGED
|
@@ -193,6 +193,7 @@ project.synth();
|
|
|
193
193
|
- `nodeVersion` (optional, default `'24.x'`) — Node.js version for the workflow runner.
|
|
194
194
|
- `cdkYarnCommand` (optional, default `'cdk'`) — Yarn script/command to invoke CDK.
|
|
195
195
|
- `scriptOutputPath` (optional, default `'.github/workflows/scripts/describe-cfn-changeset.ts'`) — Where to write the helper script.
|
|
196
|
+
- `workingDirectory` (optional) — Subdirectory where the CDK app lives (e.g., `'infra'`). Sets `defaults.run.working-directory` on all jobs so `install`, `synth`, and `deploy` steps run in that directory. The describe-changeset script path is automatically prefixed with `$GITHUB_WORKSPACE/` and `NODE_PATH` is set to resolve modules from the working directory.
|
|
196
197
|
|
|
197
198
|
If neither top‑level OIDC defaults nor all per‑stack values are supplied, the construct throws a helpful error.
|
|
198
199
|
|
|
@@ -463,6 +464,7 @@ project.synth();
|
|
|
463
464
|
- `createIssues` (optional, default `true`) — When true, scheduled runs will create/update a GitHub issue if drift is detected.
|
|
464
465
|
- `nodeVersion` (optional, default `'24.x'`) — Node.js version for the runner.
|
|
465
466
|
- `scriptOutputPath` (optional, default `'.github/workflows/scripts/detect-drift.ts'`) — Where to write the helper script.
|
|
467
|
+
- `workingDirectory` (optional) — Subdirectory where the CDK app lives (e.g., `'infra'`). Sets `defaults.run.working-directory` on all jobs. Artifact upload and issue-script paths are automatically prefixed.
|
|
466
468
|
|
|
467
469
|
### Per‑stack fields
|
|
468
470
|
- `stackName` (required) — The full CloudFormation stack name.
|
|
@@ -753,6 +755,44 @@ Run tests with:
|
|
|
753
755
|
yarn test
|
|
754
756
|
```
|
|
755
757
|
|
|
758
|
+
## Monorepo support
|
|
759
|
+
|
|
760
|
+
If your CDK app lives in a subdirectory (e.g., `infra/`), use the `workingDirectory` option:
|
|
761
|
+
|
|
762
|
+
```ts
|
|
763
|
+
new CdkDiffStackWorkflow({
|
|
764
|
+
project,
|
|
765
|
+
workingDirectory: 'infra',
|
|
766
|
+
oidcRoleArn: 'arn:aws:iam::111111111111:role/GitHubOIDCRole',
|
|
767
|
+
oidcRegion: 'us-east-1',
|
|
768
|
+
stacks: [
|
|
769
|
+
{
|
|
770
|
+
stackName: 'MyStack-dev',
|
|
771
|
+
changesetRoleToAssumeArn: 'arn:aws:iam::222222222222:role/CdkChangesetRole',
|
|
772
|
+
changesetRoleToAssumeRegion: 'us-east-1',
|
|
773
|
+
},
|
|
774
|
+
],
|
|
775
|
+
});
|
|
776
|
+
|
|
777
|
+
new CdkDriftDetectionWorkflow({
|
|
778
|
+
project,
|
|
779
|
+
workingDirectory: 'infra',
|
|
780
|
+
oidcRoleArn: 'arn:aws:iam::111111111111:role/GitHubOIDCRole',
|
|
781
|
+
oidcRegion: 'us-east-1',
|
|
782
|
+
stacks: [
|
|
783
|
+
{
|
|
784
|
+
stackName: 'MyStack-dev',
|
|
785
|
+
driftDetectionRoleToAssumeArn: 'arn:aws:iam::222222222222:role/CdkDriftRole',
|
|
786
|
+
driftDetectionRoleToAssumeRegion: 'us-east-1',
|
|
787
|
+
},
|
|
788
|
+
],
|
|
789
|
+
});
|
|
790
|
+
```
|
|
791
|
+
|
|
792
|
+
This sets `defaults.run.working-directory: infra` on all workflow jobs so that `install`, `synth`, and `deploy` steps run in the correct directory. The describe-changeset and detect-drift scripts are referenced with absolute paths so they resolve correctly from the subdirectory.
|
|
793
|
+
|
|
794
|
+
**Note:** Your `infra/package.json` must include `@aws-sdk/client-cloudformation` as a dependency for the describe-changeset script to resolve modules at runtime.
|
|
795
|
+
|
|
756
796
|
## Notes
|
|
757
797
|
- This package assumes your repository is configured with GitHub Actions and that you have a GitHub OIDC role configured in AWS.
|
|
758
798
|
- The generated scripts use the AWS SDK v3 for CloudFormation and, where applicable, the GitHub REST API.
|
|
@@ -13,7 +13,7 @@ import (
|
|
|
13
13
|
constructs "github.com/aws/constructs-go/constructs/v10/jsii"
|
|
14
14
|
)
|
|
15
15
|
|
|
16
|
-
//go:embed jjrawlins-cdk-diff-pr-github-action-1.7.
|
|
16
|
+
//go:embed jjrawlins-cdk-diff-pr-github-action-1.7.2.tgz
|
|
17
17
|
var tarball []byte
|
|
18
18
|
|
|
19
19
|
// Initialize loads the necessary packages in the @jsii/kernel to support the enclosing module.
|
|
@@ -24,5 +24,5 @@ func Initialize() {
|
|
|
24
24
|
constructs.Initialize()
|
|
25
25
|
|
|
26
26
|
// Load this library into the kernel
|
|
27
|
-
_jsii_.Load("@jjrawlins/cdk-diff-pr-github-action", "1.7.
|
|
27
|
+
_jsii_.Load("@jjrawlins/cdk-diff-pr-github-action", "1.7.2", tarball)
|
|
28
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
1.7.
|
|
1
|
+
1.7.2
|
|
@@ -397,7 +397,7 @@ class CdkDiffIamTemplateGenerator {
|
|
|
397
397
|
}
|
|
398
398
|
exports.CdkDiffIamTemplateGenerator = CdkDiffIamTemplateGenerator;
|
|
399
399
|
_a = JSII_RTTI_SYMBOL_1;
|
|
400
|
-
CdkDiffIamTemplateGenerator[_a] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDiffIamTemplateGenerator", version: "1.
|
|
400
|
+
CdkDiffIamTemplateGenerator[_a] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDiffIamTemplateGenerator", version: "1.8.0" };
|
|
401
401
|
/**
|
|
402
402
|
* Projen construct that emits a CloudFormation template with minimal IAM permissions
|
|
403
403
|
* for the CDK Diff Stack Workflow.
|
|
@@ -420,5 +420,5 @@ class CdkDiffIamTemplate {
|
|
|
420
420
|
}
|
|
421
421
|
exports.CdkDiffIamTemplate = CdkDiffIamTemplate;
|
|
422
422
|
_b = JSII_RTTI_SYMBOL_1;
|
|
423
|
-
CdkDiffIamTemplate[_b] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDiffIamTemplate", version: "1.
|
|
423
|
+
CdkDiffIamTemplate[_b] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDiffIamTemplate", version: "1.8.0" };
|
|
424
424
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2RrRGlmZklhbVRlbXBsYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0Nka0RpZmZJYW1UZW1wbGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFrQztBQW1EbEM7OztHQUdHO0FBQ0gsTUFBYSwyQkFBMkI7SUFDdEM7O09BRUc7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBdUM7UUFDN0QsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUM7UUFFckQsaUJBQWlCO1FBQ2pCLElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO1lBQ3RGLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztZQUMxRSxDQUFDO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1lBQ3pFLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixPQUFPLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sSUFBSSxDQUFDLG9DQUFvQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMscUJBQXFCLENBQUMsZUFBdUIscUNBQXFDO1FBQ3ZGLE9BQU8sNkNBQTZDLFlBQVksOEVBQThFLENBQUM7SUFDakosQ0FBQztJQUVEOztPQUVHO0lBQ0ss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QUM3QixZQUFZLEtBQThCO1FBQ3hDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLElBQUkscUNBQXFDLENBQUM7UUFFN0Usd0NBQXdDO1FBQ3hDLE1BQU0sUUFBUSxHQUFHLDJCQUEyQixDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JFLElBQUksaUJBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV6RSxrQkFBa0I7UUFDbEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsNkJBQTZCLEVBQUU7WUFDbkQsV0FBVyxFQUNULDRIQUE0SDtZQUM5SCxXQUFXLEVBQUUsSUFBSTtZQUNqQixJQUFJLEVBQUUsMkJBQTJCLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDO1NBQ3BFLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBZkgsZ0RBZ0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGV4dEZpbGUgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgR2l0SHViT2lkY0NvbmZpZyB9IGZyb20gJy4vQ2RrRGlmZklhbVRlbXBsYXRlU3RhY2tTZXQnO1xuXG4vKipcbiAqIFByb3BzIGZvciBnZW5lcmF0aW5nIENESyBEaWZmIElBTSB0ZW1wbGF0ZXMgKG5vIFByb2plbiBkZXBlbmRlbmN5KVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENka0RpZmZJYW1UZW1wbGF0ZUdlbmVyYXRvclByb3BzIHtcbiAgLyoqIE5hbWUgZm9yIHRoZSBjaGFuZ2VzZXQgSUFNIHJvbGUgKi9cbiAgcmVhZG9ubHkgcm9sZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQVJOIG9mIHRoZSBleGlzdGluZyBHaXRIdWIgT0lEQyByb2xlIHRoYXQgY2FuIGFzc3VtZSB0aGlzIGNoYW5nZXNldCByb2xlLlxuICAgKiBSZXF1aXJlZCB3aGVuIGNyZWF0ZU9pZGNSb2xlIGlzIGZhbHNlIG9yIHVuZGVmaW5lZC5cbiAgICovXG4gIHJlYWRvbmx5IG9pZGNSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZWdpb24gZm9yIHRoZSBPSURDIHRydXN0IGNvbmRpdGlvbi5cbiAgICogT25seSB1c2VkIHdoZW4gb2lkY1JvbGVBcm4gaXMgcHJvdmlkZWQgKGV4dGVybmFsIE9JREMgcm9sZSkuXG4gICAqL1xuICByZWFkb25seSBvaWRjUmVnaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBHaXRIdWIgT0lEQyByb2xlIHdpdGhpbiB0aGlzIHRlbXBsYXRlIGluc3RlYWQgb2YgdXNpbmcgYW4gZXhpc3Rpbmcgb25lLlxuICAgKiBXaGVuIHRydWUsIGdpdGh1Yk9pZGMgY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZCBhbmQgb2lkY1JvbGVBcm4gaXMgaWdub3JlZC5cbiAgICogRGVmYXVsdDogZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZU9pZGNSb2xlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgR2l0SHViIE9JREMgcm9sZSB0byBjcmVhdGUuXG4gICAqIE9ubHkgdXNlZCB3aGVuIGNyZWF0ZU9pZGNSb2xlIGlzIHRydWUuXG4gICAqIERlZmF1bHQ6ICdHaXRIdWJPSURDUm9sZSdcbiAgICovXG4gIHJlYWRvbmx5IG9pZGNSb2xlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogR2l0SHViIE9JREMgY29uZmlndXJhdGlvbiBmb3IgcmVwby9icmFuY2ggcmVzdHJpY3Rpb25zLlxuICAgKiBSZXF1aXJlZCB3aGVuIGNyZWF0ZU9pZGNSb2xlIGlzIHRydWUuXG4gICAqL1xuICByZWFkb25seSBnaXRodWJPaWRjPzogR2l0SHViT2lkY0NvbmZpZztcblxuICAvKipcbiAgICogU2tpcCBjcmVhdGluZyB0aGUgT0lEQyBwcm92aWRlciAodXNlIGV4aXN0aW5nIG9uZSkuXG4gICAqIFNldCB0byB0cnVlIGlmIHRoZSBhY2NvdW50IGFscmVhZHkgaGFzIGEgR2l0SHViIE9JREMgcHJvdmlkZXIuXG4gICAqIE9ubHkgdXNlZCB3aGVuIGNyZWF0ZU9pZGNSb2xlIGlzIHRydWUuXG4gICAqIERlZmF1bHQ6IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBza2lwT2lkY1Byb3ZpZGVyQ3JlYXRpb24/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFB1cmUgZ2VuZXJhdG9yIGNsYXNzIGZvciBDREsgRGlmZiBJQU0gdGVtcGxhdGVzLlxuICogTm8gUHJvamVuIGRlcGVuZGVuY3kgLSBjYW4gYmUgdXNlZCBpbiBhbnkgcHJvamVjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIENka0RpZmZJYW1UZW1wbGF0ZUdlbmVyYXRvciB7XG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0aGUgQ2xvdWRGb3JtYXRpb24gSUFNIHRlbXBsYXRlIGFzIGEgWUFNTCBzdHJpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2VuZXJhdGVUZW1wbGF0ZShwcm9wczogQ2RrRGlmZklhbVRlbXBsYXRlR2VuZXJhdG9yUHJvcHMpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNyZWF0ZU9pZGNSb2xlID0gcHJvcHMuY3JlYXRlT2lkY1JvbGUgPz8gZmFsc2U7XG5cbiAgICAvLyBWYWxpZGF0ZSBwcm9wc1xuICAgIGlmIChjcmVhdGVPaWRjUm9sZSkge1xuICAgICAgaWYgKCFwcm9wcy5naXRodWJPaWRjKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZ2l0aHViT2lkYyBjb25maWd1cmF0aW9uIGlzIHJlcXVpcmVkIHdoZW4gY3JlYXRlT2lkY1JvbGUgaXMgdHJ1ZScpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXByb3BzLm9pZGNSb2xlQXJuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb2lkY1JvbGVBcm4gaXMgcmVxdWlyZWQgd2hlbiBjcmVhdGVPaWRjUm9sZSBpcyBmYWxzZScpO1xuICAgICAgfVxuICAgICAgaWYgKCFwcm9wcy5vaWRjUmVnaW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb2lkY1JlZ2lvbiBpcyByZXF1aXJlZCB3aGVuIGNyZWF0ZU9pZGNSb2xlIGlzIGZhbHNlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZU9pZGNSb2xlKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVRlbXBsYXRlV2l0aE9pZGNSb2xlKHByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVUZW1wbGF0ZVdpdGhFeHRlcm5hbE9pZGNSb2xlKHByb3BzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdGhlIEFXUyBDTEkgZGVwbG95IGNvbW1hbmQgZm9yIHRoZSBJQU0gdGVtcGxhdGUuXG4gICAqL1xuICBzdGF0aWMgZ2VuZXJhdGVEZXBsb3lDb21tYW5kKHRlbXBsYXRlUGF0aDogc3RyaW5nID0gJ2Nkay1kaWZmLXdvcmtmbG93LWlhbS10ZW1wbGF0ZS55YW1sJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBhd3MgY2xvdWRmb3JtYXRpb24gZGVwbG95IC0tdGVtcGxhdGUtZmlsZSAke3RlbXBsYXRlUGF0aH0gLS1zdGFjay1uYW1lIGNkay1kaWZmLXdvcmtmbG93LWlhbS1yb2xlIC0tY2FwYWJpbGl0aWVzIENBUEFCSUxJVFlfTkFNRURfSUFNYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0ZW1wbGF0ZSB0aGF0IGNyZWF0ZXMgT0lEQyBwcm92aWRlciBhbmQgcm9sZSAoc2VsZi1jb250YWluZWQpXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZVRlbXBsYXRlV2l0aE9pZGNSb2xlKHByb3BzOiBDZGtEaWZmSWFtVGVtcGxhdGVHZW5lcmF0b3JQcm9wcyk6IHN0cmluZyB7XG4gICAgY29uc3Qgb2lkY1JvbGVOYW1lID0gcHJvcHMub2lkY1JvbGVOYW1lID8/ICdHaXRIdWJPSURDUm9sZSc7XG4gICAgY29uc3Qgc2tpcE9pZGNQcm92aWRlciA9IHByb3BzLnNraXBPaWRjUHJvdmlkZXJDcmVhdGlvbiA/PyBmYWxzZTtcbiAgICBjb25zdCBnaXRodWJPaWRjID0gcHJvcHMuZ2l0aHViT2lkYyE7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgICBcIkFXU1RlbXBsYXRlRm9ybWF0VmVyc2lvbjogJzIwMTAtMDktMDknXCIsXG4gICAgICBcIkRlc2NyaXB0aW9uOiAnR2l0SHViIE9JREMgYW5kIElBTSByb2xlcyBmb3IgQ0RLIERpZmYgU3RhY2sgV29ya2Zsb3cgY29uc3RydWN0J1wiLFxuICAgICAgJycsXG4gICAgICAnUmVzb3VyY2VzOicsXG4gICAgXTtcblxuICAgIC8vIE9JREMgUHJvdmlkZXIgKG9ubHkgaWYgbm90IHNraXBwaW5nKVxuICAgIGlmICghc2tpcE9pZGNQcm92aWRlcikge1xuICAgICAgbGluZXMucHVzaCguLi50aGlzLmdlbmVyYXRlT2lkY1Byb3ZpZGVyTGluZXMoKSk7XG4gICAgfVxuXG4gICAgLy8gT0lEQyBSb2xlIChuZWVkcyBwZXJtaXNzaW9uIHRvIGFzc3VtZSB0aGUgY2hhbmdlc2V0IHJvbGUpXG4gICAgbGluZXMucHVzaCguLi50aGlzLmdlbmVyYXRlT2lkY1JvbGVMaW5lcyhvaWRjUm9sZU5hbWUsIGdpdGh1Yk9pZGMsIHNraXBPaWRjUHJvdmlkZXIsIHByb3BzLnJvbGVOYW1lKSk7XG5cbiAgICAvLyBDaGFuZ2VzZXQgUm9sZSAodHJ1c3RzIHRoZSBjcmVhdGVkIE9JREMgcm9sZSlcbiAgICBsaW5lcy5wdXNoKC4uLnRoaXMuZ2VuZXJhdGVDaGFuZ2VzZXRSb2xlV2l0aE9pZGNSZWYocHJvcHMucm9sZU5hbWUpKTtcblxuICAgIC8vIE91dHB1dHNcbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICBsaW5lcy5wdXNoKCdPdXRwdXRzOicpO1xuXG4gICAgaWYgKCFza2lwT2lkY1Byb3ZpZGVyKSB7XG4gICAgICBsaW5lcy5wdXNoKC4uLnRoaXMuZ2VuZXJhdGVPaWRjUHJvdmlkZXJPdXRwdXRMaW5lcygpKTtcbiAgICB9XG5cbiAgICBsaW5lcy5wdXNoKC4uLnRoaXMuZ2VuZXJhdGVPaWRjUm9sZU91dHB1dExpbmVzKCkpO1xuICAgIGxpbmVzLnB1c2goLi4udGhpcy5nZW5lcmF0ZUNoYW5nZXNldE91dHB1dExpbmVzKCkpO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHRlbXBsYXRlIHRoYXQgdXNlcyBhbiBleHRlcm5hbCBPSURDIHJvbGUgKG9yaWdpbmFsIGJlaGF2aW9yKVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVUZW1wbGF0ZVdpdGhFeHRlcm5hbE9pZGNSb2xlKHByb3BzOiBDZGtEaWZmSWFtVGVtcGxhdGVHZW5lcmF0b3JQcm9wcyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXMgPSBbXG4gICAgICBcIkFXU1RlbXBsYXRlRm9ybWF0VmVyc2lvbjogJzIwMTAtMDktMDknXCIsXG4gICAgICBcIkRlc2NyaXB0aW9uOiAnSUFNIHJvbGUgZm9yIENESyBEaWZmIFN0YWNrIFdvcmtmbG93IGNvbnN0cnVjdCdcIixcbiAgICAgICcnLFxuICAgICAgJ1BhcmFtZXRlcnM6JyxcbiAgICAgICcgIEdpdEh1Yk9JRENSb2xlQXJuOicsXG4gICAgICAnICAgIFR5cGU6IFN0cmluZycsXG4gICAgICBcIiAgICBEZXNjcmlwdGlvbjogJ0FSTiBvZiB0aGUgZXhpc3RpbmcgR2l0SHViIE9JREMgcm9sZSB0aGF0IGNhbiBhc3N1bWUgdGhpcyBjaGFuZ2VzZXQgcm9sZSdcIixcbiAgICAgIGAgICAgRGVmYXVsdDogJyR7cHJvcHMub2lkY1JvbGVBcm59J2AsXG4gICAgICAnJyxcbiAgICAgICdSZXNvdXJjZXM6JyxcbiAgICAgICcgICMgQ2xvdWRGb3JtYXRpb24gQ2hhbmdlU2V0IFJvbGUgLSBtaW5pbWFsIHBlcm1pc3Npb25zIGZvciBjaGFuZ2VzZXQgb3BlcmF0aW9ucycsXG4gICAgICAnICBDZGtDaGFuZ2VzZXRSb2xlOicsXG4gICAgICAnICAgIFR5cGU6IEFXUzo6SUFNOjpSb2xlJyxcbiAgICAgICcgICAgUHJvcGVydGllczonLFxuICAgICAgXCIgICAgICBSb2xlTmFtZTogJ1wiICsgcHJvcHMucm9sZU5hbWUgKyBcIidcIixcbiAgICAgICcgICAgICBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQ6JyxcbiAgICAgIFwiICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNydcIixcbiAgICAgICcgICAgICAgIFN0YXRlbWVudDonLFxuICAgICAgJyAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnLFxuICAgICAgJyAgICAgICAgICAgIFByaW5jaXBhbDonLFxuICAgICAgJyAgICAgICAgICAgICAgQVdTOiAhUmVmIEdpdEh1Yk9JRENSb2xlQXJuJyxcbiAgICAgICcgICAgICAgICAgICBBY3Rpb246IHN0czpBc3N1bWVSb2xlJyxcbiAgICAgICcgICAgICAgICAgICBDb25kaXRpb246JyxcbiAgICAgICcgICAgICAgICAgICAgIFN0cmluZ0VxdWFsczonLFxuICAgICAgXCIgICAgICAgICAgICAgICAgYXdzOlJlcXVlc3RlZFJlZ2lvbjogJ1wiICsgcHJvcHMub2lkY1JlZ2lvbiArIFwiJ1wiLFxuICAgICAgJyAgICAgIFBvbGljaWVzOicsXG4gICAgICAnICAgICAgICAtIFBvbGljeU5hbWU6IENsb3VkRm9ybWF0aW9uQ2hhbmdlU2V0QWNjZXNzJyxcbiAgICAgICcgICAgICAgICAgUG9saWN5RG9jdW1lbnQ6JyxcbiAgICAgIFwiICAgICAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnXCIsXG4gICAgICAnICAgICAgICAgICAgU3RhdGVtZW50OicsXG4gICAgICAnICAgICAgICAgICAgICAjIENsb3VkRm9ybWF0aW9uIGNoYW5nZXNldCBvcGVyYXRpb25zJyxcbiAgICAgICcgICAgICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycsXG4gICAgICAnICAgICAgICAgICAgICAgIEFjdGlvbjonLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246Q3JlYXRlQ2hhbmdlU2V0JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkRlc2NyaWJlQ2hhbmdlU2V0JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkRlbGV0ZUNoYW5nZVNldCcsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpMaXN0Q2hhbmdlU2V0cycsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpEZXNjcmliZVN0YWNrcycsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpEZXNjcmliZVN0YWNrUmVzb3VyY2VEcmlmdHMnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246R2V0VGVtcGxhdGUnLFxuICAgICAgXCIgICAgICAgICAgICAgICAgUmVzb3VyY2U6ICcqJ1wiLFxuICAgICAgJyAgICAgICAgICAgICAgIyBDREsgYm9vdHN0cmFwIGJ1Y2tldCBhY2Nlc3MgKGZvciBjaGFuZ2VzZXQgY3JlYXRpb24pJyxcbiAgICAgICcgICAgICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycsXG4gICAgICAnICAgICAgICAgICAgICAgIEFjdGlvbjonLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gczM6R2V0T2JqZWN0JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIHMzOlB1dE9iamVjdCcsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBzMzpEZWxldGVPYmplY3QnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gczM6TGlzdEJ1Y2tldCcsXG4gICAgICAnICAgICAgICAgICAgICAgIFJlc291cmNlOicsXG4gICAgICBcIiAgICAgICAgICAgICAgICAgIC0gIVN1YiAnYXJuOmF3czpzMzo6OmNkay0ke0FXUzo6QWNjb3VudElkfS0ke0FXUzo6UmVnaW9ufS0qJ1wiLFxuICAgICAgXCIgICAgICAgICAgICAgICAgICAtICFTdWIgJ2Fybjphd3M6czM6OjpjZGstJHtBV1M6OkFjY291bnRJZH0tJHtBV1M6OlJlZ2lvbn0tKi8qJ1wiLFxuICAgICAgJyAgICAgICAgICAgICAgIyBDREsgYm9vdHN0cmFwIHBhcmFtZXRlciBhY2Nlc3MnLFxuICAgICAgJyAgICAgICAgICAgICAgLSBFZmZlY3Q6IEFsbG93JyxcbiAgICAgICcgICAgICAgICAgICAgICAgQWN0aW9uOicsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBzc206R2V0UGFyYW1ldGVyJyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIHNzbTpHZXRQYXJhbWV0ZXJzJyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIHNzbTpHZXRQYXJhbWV0ZXJzQnlQYXRoJyxcbiAgICAgIFwiICAgICAgICAgICAgICAgIFJlc291cmNlOiAhU3ViICdhcm46YXdzOnNzbToke0FXUzo6UmVnaW9ufToke0FXUzo6QWNjb3VudElkfTpwYXJhbWV0ZXIvY2RrLWJvb3RzdHJhcC8qJ1wiLFxuICAgICAgJyAgICAgICAgICAgICAgIyBJQU0gUGFzc1JvbGUgZm9yIENESyBvcGVyYXRpb25zJyxcbiAgICAgICcgICAgICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycsXG4gICAgICAnICAgICAgICAgICAgICAgIEFjdGlvbjonLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gaWFtOlBhc3NSb2xlJyxcbiAgICAgIFwiICAgICAgICAgICAgICAgIFJlc291cmNlOiAnKidcIixcbiAgICAgICcgICAgICAgICAgICAgICAgQ29uZGl0aW9uOicsXG4gICAgICAnICAgICAgICAgICAgICAgICAgU3RyaW5nRXF1YWxzOicsXG4gICAgICBcIiAgICAgICAgICAgICAgICAgICAgJ2lhbTpQYXNzZWRUb1NlcnZpY2UnOiAnY2xvdWRmb3JtYXRpb24uYW1hem9uYXdzLmNvbSdcIixcbiAgICAgICcnLFxuICAgICAgJ091dHB1dHM6JyxcbiAgICAgICcgIENka0NoYW5nZXNldFJvbGVBcm46JyxcbiAgICAgIFwiICAgIERlc2NyaXB0aW9uOiAnQVJOIG9mIHRoZSBDREsgY2hhbmdlc2V0IHJvbGUnXCIsXG4gICAgICAnICAgIFZhbHVlOiAhR2V0QXR0IENka0NoYW5nZXNldFJvbGUuQXJuJyxcbiAgICAgICcgICAgRXhwb3J0OicsXG4gICAgICBcIiAgICAgIE5hbWU6ICFTdWIgJyR7QVdTOjpTdGFja05hbWV9LUNka0NoYW5nZXNldFJvbGVBcm4nXCIsXG4gICAgICAnJyxcbiAgICAgICcgIENka0NoYW5nZXNldFJvbGVOYW1lOicsXG4gICAgICBcIiAgICBEZXNjcmlwdGlvbjogJ05hbWUgb2YgdGhlIENESyBjaGFuZ2VzZXQgcm9sZSdcIixcbiAgICAgICcgICAgVmFsdWU6ICFSZWYgQ2RrQ2hhbmdlc2V0Um9sZScsXG4gICAgICAnICAgIEV4cG9ydDonLFxuICAgICAgXCIgICAgICBOYW1lOiAhU3ViICcke0FXUzo6U3RhY2tOYW1lfS1DZGtDaGFuZ2VzZXRSb2xlTmFtZSdcIixcbiAgICBdO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVPaWRjUHJvdmlkZXJMaW5lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICcgICMgR2l0SHViIE9JREMgUHJvdmlkZXInLFxuICAgICAgJyAgR2l0SHViT0lEQ1Byb3ZpZGVyOicsXG4gICAgICAnICAgIFR5cGU6IEFXUzo6SUFNOjpPSURDUHJvdmlkZXInLFxuICAgICAgJyAgICBQcm9wZXJ0aWVzOicsXG4gICAgICAnICAgICAgVXJsOiBodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tJyxcbiAgICAgICcgICAgICBDbGllbnRJZExpc3Q6JyxcbiAgICAgICcgICAgICAgIC0gc3RzLmFtYXpvbmF3cy5jb20nLFxuICAgICAgJyAgICAgIFRodW1icHJpbnRMaXN0OicsXG4gICAgICAnICAgICAgICAtIDY5MzhmZDRkOThiYWIwM2ZhYWRiOTdiMzQzOTY4MzFlMzc4MGFlYTEnLFxuICAgICAgJyAgICAgICAgLSAxYzU4YTNhODUxOGU4NzU5YmYwNzViNzZiNzUwZDRmMmRmMjY0ZmNkJyxcbiAgICAgICcnLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZU9pZGNSb2xlTGluZXMoXG4gICAgcm9sZU5hbWU6IHN0cmluZyxcbiAgICBnaXRodWJPaWRjOiBHaXRIdWJPaWRjQ29uZmlnLFxuICAgIHNraXBPaWRjUHJvdmlkZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBjaGFuZ2VzZXRSb2xlTmFtZT86IHN0cmluZyxcbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN1YmplY3RDbGFpbXMgPSB0aGlzLmJ1aWxkU3ViamVjdENsYWltcyhnaXRodWJPaWRjKTtcblxuICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgJyAgIyBHaXRIdWIgT0lEQyBSb2xlIC0gYXV0aGVudGljYXRlcyBHaXRIdWIgQWN0aW9ucyB3b3JrZmxvd3MnLFxuICAgICAgJyAgR2l0SHViT0lEQ1JvbGU6JyxcbiAgICAgICcgICAgVHlwZTogQVdTOjpJQU06OlJvbGUnLFxuICAgIF07XG5cbiAgICAvLyBPbmx5IGFkZCBEZXBlbmRzT24gaWYgd2UncmUgY3JlYXRpbmcgdGhlIHByb3ZpZGVyXG4gICAgaWYgKCFza2lwT2lkY1Byb3ZpZGVyKSB7XG4gICAgICBsaW5lcy5wdXNoKCcgICAgRGVwZW5kc09uOiBHaXRIdWJPSURDUHJvdmlkZXInKTtcbiAgICB9XG5cbiAgICBsaW5lcy5wdXNoKFxuICAgICAgJyAgICBQcm9wZXJ0aWVzOicsXG4gICAgICBcIiAgICAgIFJvbGVOYW1lOiAnXCIgKyByb2xlTmFtZSArIFwiJ1wiLFxuICAgICAgJyAgICAgIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudDonLFxuICAgICAgXCIgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3J1wiLFxuICAgICAgJyAgICAgICAgU3RhdGVtZW50OicsXG4gICAgICAnICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycsXG4gICAgICAnICAgICAgICAgICAgUHJpbmNpcGFsOicsXG4gICAgICBcIiAgICAgICAgICAgICAgRmVkZXJhdGVkOiAhU3ViICdhcm46YXdzOmlhbTo6JHtBV1M6OkFjY291bnRJZH06b2lkYy1wcm92aWRlci90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbSdcIixcbiAgICAgICcgICAgICAgICAgICBBY3Rpb246IHN0czpBc3N1bWVSb2xlV2l0aFdlYklkZW50aXR5JyxcbiAgICAgICcgICAgICAgICAgICBDb25kaXRpb246JyxcbiAgICAgICcgICAgICAgICAgICAgIFN0cmluZ0VxdWFsczonLFxuICAgICAgXCIgICAgICAgICAgICAgICAgJ3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tOmF1ZCc6ICdzdHMuYW1hem9uYXdzLmNvbSdcIixcbiAgICAgICcgICAgICAgICAgICAgIFN0cmluZ0xpa2U6JyxcbiAgICAgIFwiICAgICAgICAgICAgICAgICd0b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTpzdWInOlwiLFxuICAgICk7XG5cbiAgICAvLyBBZGQgc3ViamVjdCBjbGFpbXNcbiAgICBmb3IgKGNvbnN0IGNsYWltIG9mIHN1YmplY3RDbGFpbXMpIHtcbiAgICAgIGxpbmVzLnB1c2goYCAgICAgICAgICAgICAgICAgIC0gJyR7Y2xhaW19J2ApO1xuICAgIH1cblxuICAgIC8vIEFkZCBwb2xpY2llcyBmb3IgYXNzdW1pbmcgY2hhbmdlc2V0IHJvbGUgYW5kIENESyBib290c3RyYXAgcm9sZXMsIHBsdXMgQ0RLIGRpZmYgcGVybWlzc2lvbnNcbiAgICBsaW5lcy5wdXNoKCcgICAgICBQb2xpY2llczonKTtcblxuICAgIC8vIFBvbGljeSAxOiBBc3N1bWVDaGFuZ2VzZXRSb2xlIC0gYWxsb3dzIGFzc3VtaW5nIGNoYW5nZXNldCByb2xlIGFuZCBDREsgYm9vdHN0cmFwIHJvbGVzXG4gICAgbGluZXMucHVzaCgnICAgICAgICAtIFBvbGljeU5hbWU6IEFzc3VtZUNoYW5nZXNldFJvbGUnKTtcbiAgICBsaW5lcy5wdXNoKCcgICAgICAgICAgUG9saWN5RG9jdW1lbnQ6Jyk7XG4gICAgbGluZXMucHVzaChcIiAgICAgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3J1wiKTtcbiAgICBsaW5lcy5wdXNoKCcgICAgICAgICAgICBTdGF0ZW1lbnQ6Jyk7XG4gICAgbGluZXMucHVzaCgnICAgICAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnKTtcbiAgICBsaW5lcy5wdXNoKCcgICAgICAgICAgICAgICAgQWN0aW9uOiBzdHM6QXNzdW1lUm9sZScpO1xuICAgIGxpbmVzLnB1c2goJyAgICAgICAgICAgICAgICBSZXNvdXJjZTonKTtcbiAgICBpZiAoY2hhbmdlc2V0Um9sZU5hbWUpIHtcbiAgICAgIGxpbmVzLnB1c2goYCAgICAgICAgICAgICAgICAgIC0gIVN1YiAnYXJuOmF3czppYW06OlxcJHtBV1M6OkFjY291bnRJZH06cm9sZS8ke2NoYW5nZXNldFJvbGVOYW1lfSdgKTtcbiAgICB9XG4gICAgLy8gQ0RLIGJvb3RzdHJhcCByb2xlc1xuICAgIGxpbmVzLnB1c2goJyAgICAgICAgICAgICAgICAgICMgQ0RLIGJvb3RzdHJhcCByb2xlcycpO1xuICAgIGxpbmVzLnB1c2goXCIgICAgICAgICAgICAgICAgICAtICFTdWIgJ2Fybjphd3M6aWFtOjoke0FXUzo6QWNjb3VudElkfTpyb2xlL2Nkay1obmI2NTlmZHMtZGVwbG95LXJvbGUtJHtBV1M6OkFjY291bnRJZH0tJHtBV1M6OlJlZ2lvbn0nXCIpO1xuICAgIGxpbmVzLnB1c2goXCIgICAgICAgICAgICAgICAgICAtICFTdWIgJ2Fybjphd3M6aWFtOjoke0FXUzo6QWNjb3VudElkfTpyb2xlL2Nkay1obmI2NTlmZHMtZmlsZS1wdWJsaXNoaW5nLXJvbGUtJHtBV1M6OkFjY291bnRJZH0tJHtBV1M6OlJlZ2lvbn0nXCIpO1xuICAgIGxpbmVzLnB1c2goXCIgICAgICAgICAgICAgICAgICAtICFTdWIgJ2Fybjphd3M6aWFtOjoke0FXUzo6QWNjb3VudElkfTpyb2xlL2Nkay1obmI2NTlmZHMtaW1hZ2UtcHVibGlzaGluZy1yb2xlLSR7QVdTOjpBY2NvdW50SWR9LSR7QVdTOjpSZWdpb259J1wiKTtcbiAgICBsaW5lcy5wdXNoKFwiICAgICAgICAgICAgICAgICAgLSAhU3ViICdhcm46YXdzOmlhbTo6JHtBV1M6OkFjY291bnRJZH06cm9sZS9jZGstaG5iNjU5ZmRzLWxvb2t1cC1yb2xlLSR7QVdTOjpBY2NvdW50SWR9LSR7QVdTOjpSZWdpb259J1wiKTtcblxuICAgIC8vIFBvbGljeSAyOiBDZGtEaWZmUGVybWlzc2lvbnMgLSBkaXJlY3QgcGVybWlzc2lvbnMgZm9yIENESyBkaWZmIG9wZXJhdGlvbnNcbiAgICBsaW5lcy5wdXNoKCcgICAgICAgIC0gUG9saWN5TmFtZTogQ2RrRGlmZlBlcm1pc3Npb25zJyk7XG4gICAgbGluZXMucHVzaCgnICAgICAgICAgIFBvbGljeURvY3VtZW50OicpO1xuICAgIGxpbmVzLnB1c2goXCIgICAgICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNydcIik7XG4gICAgbGluZXMucHVzaCgnICAgICAgICAgICAgU3RhdGVtZW50OicpO1xuICAgIGxpbmVzLnB1c2goJyAgICAgICAgICAgICAgIyBDREsgYm9vdHN0cmFwIHBhcmFtZXRlciBhY2Nlc3MgKG5lZWRlZCBmb3IgY2RrIGRlcGxveS9kaWZmKScpO1xuICAgIGxpbmVzLnB1c2goJyAgICAgICAgICAgICAgLSBFZmZlY3Q6IEFsbG93Jyk7XG4gICAgbGluZXMucHVzaCgnICAgICAgICAgICAgICAgIEFjdGlvbjonKTtcbiAgICBsaW5lcy5wdXNoKCcgICAgICAgICAgICAgICAgICAtIHNzbTpHZXRQYXJhbWV0ZXInKTtcbiAgICBsaW5lcy5wdXNoKCcgICAgICAgICAgICAgICAgICAtIHNzbTpHZXRQYXJhbWV0ZXJzJyk7XG4gICAgbGluZXMucHVzaChcIiAgICAgICAgICAgICAgICBSZXNvdXJjZTogIVN1YiAnYXJuOmF3czpzc206JHtBV1M6OlJlZ2lvbn06JHtBV1M6OkFjY291bnRJZH06cGFyYW1ldGVyL2Nkay1ib290c3RyYXAvKidcIik7XG4gICAgbGluZXMucHVzaCgnICAgICAgICAgICAgICAjIENsb3VkRm9ybWF0aW9uIG9wZXJhdGlvbnMgZm9yIGNoYW5nZXNldCBjcmVhdGlvbicpO1xuICAgIGxpbmVzLnB1c2goJyAgICAgICAgICAgICAgLSBFZmZlY3Q6IEFsbG93Jyk7XG4gICAgbGluZXMucHVzaCgnICAgICAgICAgICAgICAgIEFjdGlvbjonKTtcbiAgICBsaW5lcy5wdXNoKCcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkNyZWF0ZUNoYW5nZVNldCcpO1xuICAgIGxpbmVzLnB1c2goJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246RGVzY3JpYmVDaGFuZ2VTZXQnKTtcbiAgICBsaW5lcy5wdXNoKCcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkRlbGV0ZUNoYW5nZVNldCcpO1xuICAgIGxpbmVzLnB1c2goJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246TGlzdENoYW5nZVNldHMnKTtcbiAgICBsaW5lcy5wdXNoKCcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkRlc2NyaWJlU3RhY2tzJyk7XG4gICAgbGluZXMucHVzaCgnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpEZXNjcmliZVN0YWNrUmVzb3VyY2VEcmlmdHMnKTtcbiAgICBsaW5lcy5wdXNoKCcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkdldFRlbXBsYXRlJyk7XG4gICAgbGluZXMucHVzaChcIiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJyonXCIpO1xuICAgIGxpbmVzLnB1c2goJyAgICAgICAgICAgICAgIyBDREsgYm9vdHN0cmFwIGJ1Y2tldCBhY2Nlc3MnKTtcbiAgICBsaW5lcy5wdXNoKCcgICAgICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycpO1xuICAgIGxpbmVzLnB1c2goJyAgICAgICAgICAgICAgICBBY3Rpb246Jyk7XG4gICAgbGluZXMucHVzaCgnICAgICAgICAgICAgICAgICAgLSBzMzpHZXRPYmplY3QnKTtcbiAgICBsaW5lcy5wdXNoKCcgICAgICAgICAgICAgICAgICAtIHMzOlB1dE9iamVjdCcpO1xuICAgIGxpbmVzLnB1c2goJyAgICAgICAgICAgICAgICAgIC0gczM6TGlzdEJ1Y2tldCcpO1xuICAgIGxpbmVzLnB1c2goJyAgICAgICAgICAgICAgICAgIC0gczM6R2V0QnVja2V0TG9jYXRpb24nKTtcbiAgICBsaW5lcy5wdXNoKCcgICAgICAgICAgICAgICAgUmVzb3VyY2U6Jyk7XG4gICAgbGluZXMucHVzaChcIiAgICAgICAgICAgICAgICAgIC0gIVN1YiAnYXJuOmF3czpzMzo6OmNkay1obmI2NTlmZHMtYXNzZXRzLSR7QVdTOjpBY2NvdW50SWR9LSR7QVdTOjpSZWdpb259J1wiKTtcbiAgICBsaW5lcy5wdXNoKFwiICAgICAgICAgICAgICAgICAgLSAhU3ViICdhcm46YXdzOnMzOjo6Y2RrLWhuYjY1OWZkcy1hc3NldHMtJHtBV1M6OkFjY291bnRJZH0tJHtBV1M6OlJlZ2lvbn0vKidcIik7XG4gICAgbGluZXMucHVzaCgnICAgICAgICAgICAgICAjIElBTSBQYXNzUm9sZSBmb3IgQ0RLIG9wZXJhdGlvbnMnKTtcbiAgICBsaW5lcy5wdXNoKCcgICAgICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycpO1xuICAgIGxpbmVzLnB1c2goJyAgICAgICAgICAgICAgICBBY3Rpb246Jyk7XG4gICAgbGluZXMucHVzaCgnICAgICAgICAgICAgICAgICAgLSBpYW06UGFzc1JvbGUnKTtcbiAgICBsaW5lcy5wdXNoKFwiICAgICAgICAgICAgICAgIFJlc291cmNlOiAhU3ViICdhcm46YXdzOmlhbTo6JHtBV1M6OkFjY291bnRJZH06cm9sZS9jZGstaG5iNjU5ZmRzLSonXCIpO1xuICAgIGxpbmVzLnB1c2goJyAgICAgICAgICAgICAgICBDb25kaXRpb246Jyk7XG4gICAgbGluZXMucHVzaCgnICAgICAgICAgICAgICAgICAgU3RyaW5nRXF1YWxzOicpO1xuICAgIGxpbmVzLnB1c2goXCIgICAgICAgICAgICAgICAgICAgICdpYW06UGFzc2VkVG9TZXJ2aWNlJzogJ2Nsb3VkZm9ybWF0aW9uLmFtYXpvbmF3cy5jb20nXCIpO1xuXG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRTdWJqZWN0Q2xhaW1zKGdpdGh1Yk9pZGM6IEdpdEh1Yk9pZGNDb25maWcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY2xhaW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGJyYW5jaGVzID0gZ2l0aHViT2lkYy5icmFuY2hlcyA/PyBbJyonXTtcblxuICAgIGZvciAoY29uc3QgcmVwbyBvZiBnaXRodWJPaWRjLnJlcG9zaXRvcmllcykge1xuICAgICAgaWYgKHJlcG8gPT09ICcqJykge1xuICAgICAgICAvLyBXaWxkY2FyZCByZXBvIC0gYWxsb3cgYWxsIHJlcG9zIHdpdGggYnJhbmNoIHJlc3RyaWN0aW9uc1xuICAgICAgICBmb3IgKGNvbnN0IGJyYW5jaCBvZiBicmFuY2hlcykge1xuICAgICAgICAgIGlmIChicmFuY2ggPT09ICcqJykge1xuICAgICAgICAgICAgY2xhaW1zLnB1c2goYHJlcG86JHtnaXRodWJPaWRjLm93bmVyfS8qYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsYWltcy5wdXNoKGByZXBvOiR7Z2l0aHViT2lkYy5vd25lcn0vKjpyZWY6cmVmcy9oZWFkcy8ke2JyYW5jaH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNwZWNpZmljIHJlcG9cbiAgICAgICAgZm9yIChjb25zdCBicmFuY2ggb2YgYnJhbmNoZXMpIHtcbiAgICAgICAgICBpZiAoYnJhbmNoID09PSAnKicpIHtcbiAgICAgICAgICAgIGNsYWltcy5wdXNoKGByZXBvOiR7Z2l0aHViT2lkYy5vd25lcn0vJHtyZXBvfToqYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsYWltcy5wdXNoKGByZXBvOiR7Z2l0aHViT2lkYy5vd25lcn0vJHtyZXBvfTpyZWY6cmVmcy9oZWFkcy8ke2JyYW5jaH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgYW55IGFkZGl0aW9uYWwgY2xhaW1zXG4gICAgaWYgKGdpdGh1Yk9pZGMuYWRkaXRpb25hbENsYWltcykge1xuICAgICAgZm9yIChjb25zdCBjbGFpbSBvZiBnaXRodWJPaWRjLmFkZGl0aW9uYWxDbGFpbXMpIHtcbiAgICAgICAgZm9yIChjb25zdCByZXBvIG9mIGdpdGh1Yk9pZGMucmVwb3NpdG9yaWVzKSB7XG4gICAgICAgICAgaWYgKHJlcG8gPT09ICcqJykge1xuICAgICAgICAgICAgY2xhaW1zLnB1c2goYHJlcG86JHtnaXRodWJPaWRjLm93bmVyfS8qOiR7Y2xhaW19YCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsYWltcy5wdXNoKGByZXBvOiR7Z2l0aHViT2lkYy5vd25lcn0vJHtyZXBvfToke2NsYWltfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbGFpbXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUNoYW5nZXNldFJvbGVXaXRoT2lkY1JlZihyb2xlTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAnICAjIENsb3VkRm9ybWF0aW9uIENoYW5nZVNldCBSb2xlIC0gbWluaW1hbCBwZXJtaXNzaW9ucyBmb3IgY2hhbmdlc2V0IG9wZXJhdGlvbnMnLFxuICAgICAgJyAgQ2RrQ2hhbmdlc2V0Um9sZTonLFxuICAgICAgJyAgICBUeXBlOiBBV1M6OklBTTo6Um9sZScsXG4gICAgICAnICAgIERlcGVuZHNPbjogR2l0SHViT0lEQ1JvbGUnLFxuICAgICAgJyAgICBQcm9wZXJ0aWVzOicsXG4gICAgICBcIiAgICAgIFJvbGVOYW1lOiAnXCIgKyByb2xlTmFtZSArIFwiJ1wiLFxuICAgICAgJyAgICAgIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudDonLFxuICAgICAgXCIgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3J1wiLFxuICAgICAgJyAgICAgICAgU3RhdGVtZW50OicsXG4gICAgICAnICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycsXG4gICAgICAnICAgICAgICAgICAgUHJpbmNpcGFsOicsXG4gICAgICAnICAgICAgICAgICAgICBBV1M6ICFHZXRBdHQgR2l0SHViT0lEQ1JvbGUuQXJuJyxcbiAgICAgICcgICAgICAgICAgICBBY3Rpb246IHN0czpBc3N1bWVSb2xlJyxcbiAgICAgICcgICAgICBQb2xpY2llczonLFxuICAgICAgJyAgICAgICAgLSBQb2xpY3lOYW1lOiBDbG91ZEZvcm1hdGlvbkNoYW5nZVNldEFjY2VzcycsXG4gICAgICAnICAgICAgICAgIFBvbGljeURvY3VtZW50OicsXG4gICAgICBcIiAgICAgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3J1wiLFxuICAgICAgJyAgICAgICAgICAgIFN0YXRlbWVudDonLFxuICAgICAgJyAgICAgICAgICAgICAgIyBDbG91ZEZvcm1hdGlvbiBjaGFuZ2VzZXQgb3BlcmF0aW9ucycsXG4gICAgICAnICAgICAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnLFxuICAgICAgJyAgICAgICAgICAgICAgICBBY3Rpb246JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkNyZWF0ZUNoYW5nZVNldCcsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpEZXNjcmliZUNoYW5nZVNldCcsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpEZWxldGVDaGFuZ2VTZXQnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246TGlzdENoYW5nZVNldHMnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246RGVzY3JpYmVTdGFja3MnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246RGVzY3JpYmVTdGFja1Jlc291cmNlRHJpZnRzJyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkdldFRlbXBsYXRlJyxcbiAgICAgIFwiICAgICAgICAgICAgICAgIFJlc291cmNlOiAnKidcIixcbiAgICAgICcgICAgICAgICAgICAgICMgQ0RLIGJvb3RzdHJhcCBidWNrZXQgYWNjZXNzIChmb3IgY2hhbmdlc2V0IGNyZWF0aW9uKScsXG4gICAgICAnICAgICAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnLFxuICAgICAgJyAgICAgICAgICAgICAgICBBY3Rpb246JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIHMzOkdldE9iamVjdCcsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBzMzpQdXRPYmplY3QnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gczM6RGVsZXRlT2JqZWN0JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIHMzOkxpc3RCdWNrZXQnLFxuICAgICAgJyAgICAgICAgICAgICAgICBSZXNvdXJjZTonLFxuICAgICAgXCIgICAgICAgICAgICAgICAgICAtICFTdWIgJ2Fybjphd3M6czM6OjpjZGstJHtBV1M6OkFjY291bnRJZH0tJHtBV1M6OlJlZ2lvbn0tKidcIixcbiAgICAgIFwiICAgICAgICAgICAgICAgICAgLSAhU3ViICdhcm46YXdzOnMzOjo6Y2RrLSR7QVdTOjpBY2NvdW50SWR9LSR7QVdTOjpSZWdpb259LSovKidcIixcbiAgICAgICcgICAgICAgICAgICAgICMgQ0RLIGJvb3RzdHJhcCBwYXJhbWV0ZXIgYWNjZXNzJyxcbiAgICAgICcgICAgICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycsXG4gICAgICAnICAgICAgICAgICAgICAgIEFjdGlvbjonLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gc3NtOkdldFBhcmFtZXRlcicsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBzc206R2V0UGFyYW1ldGVycycsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBzc206R2V0UGFyYW1ldGVyc0J5UGF0aCcsXG4gICAgICBcIiAgICAgICAgICAgICAgICBSZXNvdXJjZTogIVN1YiAnYXJuOmF3czpzc206JHtBV1M6OlJlZ2lvbn06JHtBV1M6OkFjY291bnRJZH06cGFyYW1ldGVyL2Nkay1ib290c3RyYXAvKidcIixcbiAgICAgICcgICAgICAgICAgICAgICMgSUFNIFBhc3NSb2xlIGZvciBDREsgb3BlcmF0aW9ucycsXG4gICAgICAnICAgICAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnLFxuICAgICAgJyAgICAgICAgICAgICAgICBBY3Rpb246JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIGlhbTpQYXNzUm9sZScsXG4gICAgICBcIiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJyonXCIsXG4gICAgICAnICAgICAgICAgICAgICAgIENvbmRpdGlvbjonLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIFN0cmluZ0VxdWFsczonLFxuICAgICAgXCIgICAgICAgICAgICAgICAgICAgICdpYW06UGFzc2VkVG9TZXJ2aWNlJzogJ2Nsb3VkZm9ybWF0aW9uLmFtYXpvbmF3cy5jb20nXCIsXG4gICAgICAnJyxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVPaWRjUHJvdmlkZXJPdXRwdXRMaW5lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICcgIEdpdEh1Yk9JRENQcm92aWRlckFybjonLFxuICAgICAgXCIgICAgRGVzY3JpcHRpb246ICdBUk4gb2YgdGhlIEdpdEh1YiBPSURDIHByb3ZpZGVyJ1wiLFxuICAgICAgJyAgICBWYWx1ZTogIUdldEF0dCBHaXRIdWJPSURDUHJvdmlkZXIuQXJuJyxcbiAgICAgICcgICAgRXhwb3J0OicsXG4gICAgICBcIiAgICAgIE5hbWU6ICFTdWIgJyR7QVdTOjpTdGFja05hbWV9LUdpdEh1Yk9JRENQcm92aWRlckFybidcIixcbiAgICAgICcnLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZU9pZGNSb2xlT3V0cHV0TGluZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAnICBHaXRIdWJPSURDUm9sZUFybjonLFxuICAgICAgXCIgICAgRGVzY3JpcHRpb246ICdBUk4gb2YgdGhlIEdpdEh1YiBPSURDIHJvbGUnXCIsXG4gICAgICAnICAgIFZhbHVlOiAhR2V0QXR0IEdpdEh1Yk9JRENSb2xlLkFybicsXG4gICAgICAnICAgIEV4cG9ydDonLFxuICAgICAgXCIgICAgICBOYW1lOiAhU3ViICcke0FXUzo6U3RhY2tOYW1lfS1HaXRIdWJPSURDUm9sZUFybidcIixcbiAgICAgICcnLFxuICAgICAgJyAgR2l0SHViT0lEQ1JvbGVOYW1lOicsXG4gICAgICBcIiAgICBEZXNjcmlwdGlvbjogJ05hbWUgb2YgdGhlIEdpdEh1YiBPSURDIHJvbGUnXCIsXG4gICAgICAnICAgIFZhbHVlOiAhUmVmIEdpdEh1Yk9JRENSb2xlJyxcbiAgICAgICcgICAgRXhwb3J0OicsXG4gICAgICBcIiAgICAgIE5hbWU6ICFTdWIgJyR7QVdTOjpTdGFja05hbWV9LUdpdEh1Yk9JRENSb2xlTmFtZSdcIixcbiAgICAgICcnLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUNoYW5nZXNldE91dHB1dExpbmVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgJyAgQ2RrQ2hhbmdlc2V0Um9sZUFybjonLFxuICAgICAgXCIgICAgRGVzY3JpcHRpb246ICdBUk4gb2YgdGhlIENESyBjaGFuZ2VzZXQgcm9sZSdcIixcbiAgICAgICcgICAgVmFsdWU6ICFHZXRBdHQgQ2RrQ2hhbmdlc2V0Um9sZS5Bcm4nLFxuICAgICAgJyAgICBFeHBvcnQ6JyxcbiAgICAgIFwiICAgICAgTmFtZTogIVN1YiAnJHtBV1M6OlN0YWNrTmFtZX0tQ2RrQ2hhbmdlc2V0Um9sZUFybidcIixcbiAgICAgICcnLFxuICAgICAgJyAgQ2RrQ2hhbmdlc2V0Um9sZU5hbWU6JyxcbiAgICAgIFwiICAgIERlc2NyaXB0aW9uOiAnTmFtZSBvZiB0aGUgQ0RLIGNoYW5nZXNldCByb2xlJ1wiLFxuICAgICAgJyAgICBWYWx1ZTogIVJlZiBDZGtDaGFuZ2VzZXRSb2xlJyxcbiAgICAgICcgICAgRXhwb3J0OicsXG4gICAgICBcIiAgICAgIE5hbWU6ICFTdWIgJyR7QVdTOjpTdGFja05hbWV9LUNka0NoYW5nZXNldFJvbGVOYW1lJ1wiLFxuICAgIF07XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFByb2plbi1pbnRlZ3JhdGVkIENESyBEaWZmIElBTSB0ZW1wbGF0ZSBjb25zdHJ1Y3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZGtEaWZmSWFtVGVtcGxhdGVQcm9wcyBleHRlbmRzIENka0RpZmZJYW1UZW1wbGF0ZUdlbmVyYXRvclByb3BzIHtcbiAgLyoqIFByb2plbiBwcm9qZWN0IGluc3RhbmNlICovXG4gIHJlYWRvbmx5IHByb2plY3Q6IGFueTtcbiAgLyoqIE91dHB1dCBwYXRoIGZvciB0aGUgdGVtcGxhdGUgZmlsZSAoZGVmYXVsdDogJ2Nkay1kaWZmLXdvcmtmbG93LWlhbS10ZW1wbGF0ZS55YW1sJykgKi9cbiAgcmVhZG9ubHkgb3V0cHV0UGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9qZW4gY29uc3RydWN0IHRoYXQgZW1pdHMgYSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZSB3aXRoIG1pbmltYWwgSUFNIHBlcm1pc3Npb25zXG4gKiBmb3IgdGhlIENESyBEaWZmIFN0YWNrIFdvcmtmbG93LlxuICpcbiAqIEZvciBub24tUHJvamVuIHByb2plY3RzLCB1c2UgYENka0RpZmZJYW1UZW1wbGF0ZUdlbmVyYXRvcmAgZGlyZWN0bHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDZGtEaWZmSWFtVGVtcGxhdGUge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogQ2RrRGlmZklhbVRlbXBsYXRlUHJvcHMpIHtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcHJvcHMub3V0cHV0UGF0aCA/PyAnY2RrLWRpZmYtd29ya2Zsb3ctaWFtLXRlbXBsYXRlLnlhbWwnO1xuXG4gICAgLy8gR2VuZXJhdGUgdGVtcGxhdGUgdXNpbmcgdGhlIGdlbmVyYXRvclxuICAgIGNvbnN0IHRlbXBsYXRlID0gQ2RrRGlmZklhbVRlbXBsYXRlR2VuZXJhdG9yLmdlbmVyYXRlVGVtcGxhdGUocHJvcHMpO1xuICAgIG5ldyBUZXh0RmlsZShwcm9wcy5wcm9qZWN0LCBvdXRwdXRQYXRoLCB7IGxpbmVzOiB0ZW1wbGF0ZS5zcGxpdCgnXFxuJykgfSk7XG5cbiAgICAvLyBBZGQgZGVwbG95IHRhc2tcbiAgICBwcm9wcy5wcm9qZWN0LmFkZFRhc2soJ2RlcGxveS1jZGtkaWZmLWlhbS10ZW1wbGF0ZScsIHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnRGVwbG95IHRoZSBDREsgRGlmZiBJQU0gdGVtcGxhdGUgdmlhIENsb3VkRm9ybWF0aW9uIChhY2NlcHRzIGV4dHJhIEFXUyBDTEkgYXJncywgZS5nLiwgLS1wYXJhbWV0ZXItb3ZlcnJpZGVzIEtleT1WYWx1ZS4uLiknLFxuICAgICAgcmVjZWl2ZUFyZ3M6IHRydWUsXG4gICAgICBleGVjOiBDZGtEaWZmSWFtVGVtcGxhdGVHZW5lcmF0b3IuZ2VuZXJhdGVEZXBsb3lDb21tYW5kKG91dHB1dFBhdGgpLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -344,7 +344,7 @@ class CdkDiffIamTemplateStackSetGenerator {
|
|
|
344
344
|
}
|
|
345
345
|
exports.CdkDiffIamTemplateStackSetGenerator = CdkDiffIamTemplateStackSetGenerator;
|
|
346
346
|
_a = JSII_RTTI_SYMBOL_1;
|
|
347
|
-
CdkDiffIamTemplateStackSetGenerator[_a] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDiffIamTemplateStackSetGenerator", version: "1.
|
|
347
|
+
CdkDiffIamTemplateStackSetGenerator[_a] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDiffIamTemplateStackSetGenerator", version: "1.8.0" };
|
|
348
348
|
/**
|
|
349
349
|
* Projen construct that creates a CloudFormation StackSet template for org-wide deployment of
|
|
350
350
|
* GitHub OIDC provider, OIDC role, and CDK Diff/Drift IAM roles.
|
|
@@ -389,5 +389,5 @@ class CdkDiffIamTemplateStackSet {
|
|
|
389
389
|
}
|
|
390
390
|
exports.CdkDiffIamTemplateStackSet = CdkDiffIamTemplateStackSet;
|
|
391
391
|
_b = JSII_RTTI_SYMBOL_1;
|
|
392
|
-
CdkDiffIamTemplateStackSet[_b] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDiffIamTemplateStackSet", version: "1.
|
|
392
|
+
CdkDiffIamTemplateStackSet[_b] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDiffIamTemplateStackSet", version: "1.8.0" };
|
|
393
393
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2RrRGlmZklhbVRlbXBsYXRlU3RhY2tTZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQ2RrRGlmZklhbVRlbXBsYXRlU3RhY2tTZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FBa0M7QUFFbEM7O0dBRUc7QUFDSCxJQUFZLHFCQU9YO0FBUEQsV0FBWSxxQkFBcUI7SUFDL0IseURBQXlEO0lBQ3pELDBEQUFpQyxDQUFBO0lBQ2pDLGlEQUFpRDtJQUNqRCxrREFBeUIsQ0FBQTtJQUN6QixtQ0FBbUM7SUFDbkMsc0NBQWEsQ0FBQTtBQUNmLENBQUMsRUFQVyxxQkFBcUIscUNBQXJCLHFCQUFxQixRQU9oQztBQWtHRDs7O0dBR0c7QUFDSCxNQUFhLG1DQUFtQztJQUM5Qzs7T0FFRztJQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUErQztRQUNyRSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLGdCQUFnQixDQUFDO1FBQzVELE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixJQUFJLGtCQUFrQixDQUFDO1FBQ3hFLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLElBQUksY0FBYyxDQUFDO1FBQzVELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDO1FBQ3hFLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLHdCQUF3QixJQUFJLEtBQUssQ0FBQztRQUVqRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQ3RDLEtBQUssQ0FBQyxVQUFVLEVBQ2hCLFlBQVksRUFDWixpQkFBaUIsRUFDakIsYUFBYSxFQUNiLGFBQWEsRUFDYixLQUFLLENBQUMsV0FBVyxFQUNqQixnQkFBZ0IsQ0FDakIsQ0FBQztRQUVGLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7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QUN6RSxpQkFBaUIsRUFBRSw4QkFBOEI7WUFDakQsMkJBQTJCLEVBQ3pCLHlIQUF5SDtZQUMzSCwyQkFBMkIsRUFBRSxvREFBb0Q7WUFDakYsaUJBQWlCLEVBQUUsa0VBQWtFO1lBQ3JGLG1CQUFtQixFQUFFLGdEQUFnRDtZQUNyRSx5QkFBeUIsRUFBRSw2Q0FBNkM7U0FDekUsQ0FBQztRQUVGLEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDM0QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO2dCQUM5QixXQUFXLEVBQUUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO2dCQUN2QyxXQUFXLEVBQUUsUUFBUSxLQUFLLGlCQUFpQjtnQkFDM0MsSUFBSSxFQUFFLE9BQU87YUFDZCxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQzs7QUFyQ0gsZ0VBc0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGV4dEZpbGUgfSBmcm9tICdwcm9qZW4nO1xuXG4vKipcbiAqIFdoaWNoIHJvbGVzIHRvIGluY2x1ZGUgaW4gdGhlIFN0YWNrU2V0XG4gKi9cbmV4cG9ydCBlbnVtIFN0YWNrU2V0Um9sZVNlbGVjdGlvbiB7XG4gIC8qKiBJbmNsdWRlIG9ubHkgdGhlIGNoYW5nZXNldCByb2xlIChDZGtDaGFuZ2VzZXRSb2xlKSAqL1xuICBDSEFOR0VTRVRfT05MWSA9ICdDSEFOR0VTRVRfT05MWScsXG4gIC8qKiBJbmNsdWRlIG9ubHkgdGhlIGRyaWZ0IHJvbGUgKENka0RyaWZ0Um9sZSkgKi9cbiAgRFJJRlRfT05MWSA9ICdEUklGVF9PTkxZJyxcbiAgLyoqIEluY2x1ZGUgYm90aCByb2xlcyAoZGVmYXVsdCkgKi9cbiAgQk9USCA9ICdCT1RIJyxcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBTdGFja1NldCBhdXRvLWRlcGxveW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFja1NldEF1dG9EZXBsb3ltZW50IHtcbiAgLyoqIEVuYWJsZSBhdXRvLWRlcGxveW1lbnQgdG8gbmV3IGFjY291bnRzIGluIHRhcmdldCBPVXMgKGRlZmF1bHQ6IHRydWUpICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuICAvKiogUmV0YWluIHN0YWNrcyB3aGVuIGFjY291bnQgbGVhdmVzIE9VIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgcmVhZG9ubHkgcmV0YWluU3RhY2tzT25BY2NvdW50UmVtb3ZhbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogR2l0SHViIHJlcG9zaXRvcnkgcmVzdHJpY3Rpb25zIGZvciBPSURDIGF1dGhlbnRpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2l0SHViT2lkY0NvbmZpZyB7XG4gIC8qKlxuICAgKiBHaXRIdWIgb3JnYW5pemF0aW9uIG9yIHVzZXJuYW1lIChlLmcuLCAnbXktb3JnJyBvciAnbXktdXNlcm5hbWUnKVxuICAgKi9cbiAgcmVhZG9ubHkgb3duZXI6IHN0cmluZztcblxuICAvKipcbiAgICogUmVwb3NpdG9yeSBuYW1lcyBhbGxvd2VkIHRvIGFzc3VtZSB0aGUgcm9sZSAoZS5nLiwgWydyZXBvMScsICdyZXBvMiddKVxuICAgKiBVc2UgWycqJ10gdG8gYWxsb3cgYWxsIHJlcG9zIGluIHRoZSBvcmdhbml6YXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlcG9zaXRvcmllczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEJyYW5jaCBwYXR0ZXJucyBhbGxvd2VkIChlLmcuLCBbJ21haW4nLCAncmVsZWFzZS8qJ10pXG4gICAqIERlZmF1bHQ6IFsnKiddIChhbGwgYnJhbmNoZXMpXG4gICAqL1xuICByZWFkb25seSBicmFuY2hlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHN1YmplY3QgY2xhaW1zIGZvciBmaW5lLWdyYWluZWQgYWNjZXNzXG4gICAqIGUuZy4sIFsncHVsbF9yZXF1ZXN0JywgJ2Vudmlyb25tZW50OnByb2R1Y3Rpb24nXVxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbENsYWltcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciBnZW5lcmF0aW5nIFN0YWNrU2V0IHRlbXBsYXRlcyAobm8gUHJvamVuIGRlcGVuZGVuY3kpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrRGlmZklhbVRlbXBsYXRlU3RhY2tTZXRHZW5lcmF0b3JQcm9wcyB7XG4gIC8qKiBHaXRIdWIgT0lEQyBjb25maWd1cmF0aW9uIGZvciByZXBvL2JyYW5jaCByZXN0cmljdGlvbnMgKi9cbiAgcmVhZG9ubHkgZ2l0aHViT2lkYzogR2l0SHViT2lkY0NvbmZpZztcblxuICAvKiogTmFtZSBvZiB0aGUgR2l0SHViIE9JREMgcm9sZSAoZGVmYXVsdDogJ0dpdEh1Yk9JRENSb2xlJykgKi9cbiAgcmVhZG9ubHkgb2lkY1JvbGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKiBOYW1lIG9mIHRoZSBDZGtDaGFuZ2VzZXRSb2xlIChkZWZhdWx0OiAnQ2RrQ2hhbmdlc2V0Um9sZScpICovXG4gIHJlYWRvbmx5IGNoYW5nZXNldFJvbGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKiBOYW1lIG9mIHRoZSBDZGtEcmlmdFJvbGUgKGRlZmF1bHQ6ICdDZGtEcmlmdFJvbGUnKSAqL1xuICByZWFkb25seSBkcmlmdFJvbGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKiBXaGljaCByb2xlcyB0byBpbmNsdWRlIChkZWZhdWx0OiBCT1RIKSAqL1xuICByZWFkb25seSByb2xlU2VsZWN0aW9uPzogU3RhY2tTZXRSb2xlU2VsZWN0aW9uO1xuXG4gIC8qKiBEZXNjcmlwdGlvbiBmb3IgdGhlIFN0YWNrU2V0ICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTa2lwIGNyZWF0aW5nIHRoZSBPSURDIHByb3ZpZGVyICh1c2UgZXhpc3Rpbmcgb25lKS5cbiAgICogU2V0IHRvIHRydWUgaWYgYWNjb3VudHMgYWxyZWFkeSBoYXZlIGEgR2l0SHViIE9JREMgcHJvdmlkZXIuXG4gICAqIFRoZSB0ZW1wbGF0ZSB3aWxsIHJlZmVyZW5jZSB0aGUgZXhpc3RpbmcgcHJvdmlkZXIgYnkgQVJOLlxuICAgKiBEZWZhdWx0OiBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcE9pZGNQcm92aWRlckNyZWF0aW9uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm9wcyBmb3IgZ2VuZXJhdGluZyBTdGFja1NldCBDTEkgY29tbWFuZHMgKG5vIFByb2plbiBkZXBlbmRlbmN5KVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENka0RpZmZJYW1UZW1wbGF0ZVN0YWNrU2V0Q29tbWFuZHNQcm9wcyB7XG4gIC8qKiBOYW1lIG9mIHRoZSBTdGFja1NldCAoZGVmYXVsdDogJ2Nkay1kaWZmLXdvcmtmbG93LWlhbS1zdGFja3NldCcpICovXG4gIHJlYWRvbmx5IHN0YWNrU2V0TmFtZT86IHN0cmluZztcblxuICAvKiogUGF0aCB0byB0aGUgdGVtcGxhdGUgZmlsZSAoZGVmYXVsdDogJ2Nkay1kaWZmLXdvcmtmbG93LXN0YWNrc2V0LXRlbXBsYXRlLnlhbWwnKSAqL1xuICByZWFkb25seSB0ZW1wbGF0ZVBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqIFRhcmdldCBPVXMgZm9yIGRlcGxveW1lbnQgKGUuZy4sIFsnb3UteHh4eC14eHh4eHh4eCcsICdyLXh4eHgnXSkgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0T3JnYW5pemF0aW9uYWxVbml0SWRzPzogc3RyaW5nW107XG5cbiAgLyoqIFRhcmdldCByZWdpb25zIGZvciBkZXBsb3ltZW50IChlLmcuLCBbJ3VzLWVhc3QtMScsICdldS13ZXN0LTEnXSkgKi9cbiAgcmVhZG9ubHkgcmVnaW9ucz86IHN0cmluZ1tdO1xuXG4gIC8qKiBBdXRvLWRlcGxveW1lbnQgY29uZmlndXJhdGlvbiAqL1xuICByZWFkb25seSBhdXRvRGVwbG95bWVudD86IFN0YWNrU2V0QXV0b0RlcGxveW1lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXNlIGRlbGVnYXRlZCBhZG1pbiBtb2RlIGZvciBTdGFja1NldCBvcGVyYXRpb25zLlxuICAgKiBJZiB0cnVlLCBhZGRzIC0tY2FsbC1hcyBERUxFR0FURURfQURNSU4gdG8gY29tbWFuZHMuXG4gICAqIERlZmF1bHQ6IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGRlbGVnYXRlZEFkbWluPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQdXJlIGdlbmVyYXRvciBjbGFzcyBmb3IgU3RhY2tTZXQgdGVtcGxhdGVzIGFuZCBjb21tYW5kcy5cbiAqIE5vIFByb2plbiBkZXBlbmRlbmN5IC0gY2FuIGJlIHVzZWQgaW4gYW55IHByb2plY3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBDZGtEaWZmSWFtVGVtcGxhdGVTdGFja1NldEdlbmVyYXRvciB7XG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0aGUgQ2xvdWRGb3JtYXRpb24gU3RhY2tTZXQgdGVtcGxhdGUgYXMgYSBZQU1MIHN0cmluZy5cbiAgICovXG4gIHN0YXRpYyBnZW5lcmF0ZVRlbXBsYXRlKHByb3BzOiBDZGtEaWZmSWFtVGVtcGxhdGVTdGFja1NldEdlbmVyYXRvclByb3BzKTogc3RyaW5nIHtcbiAgICBjb25zdCBvaWRjUm9sZU5hbWUgPSBwcm9wcy5vaWRjUm9sZU5hbWUgPz8gJ0dpdEh1Yk9JRENSb2xlJztcbiAgICBjb25zdCBjaGFuZ2VzZXRSb2xlTmFtZSA9IHByb3BzLmNoYW5nZXNldFJvbGVOYW1lID8/ICdDZGtDaGFuZ2VzZXRSb2xlJztcbiAgICBjb25zdCBkcmlmdFJvbGVOYW1lID0gcHJvcHMuZHJpZnRSb2xlTmFtZSA/PyAnQ2RrRHJpZnRSb2xlJztcbiAgICBjb25zdCByb2xlU2VsZWN0aW9uID0gcHJvcHMucm9sZVNlbGVjdGlvbiA/PyBTdGFja1NldFJvbGVTZWxlY3Rpb24uQk9USDtcbiAgICBjb25zdCBza2lwT2lkY1Byb3ZpZGVyID0gcHJvcHMuc2tpcE9pZGNQcm92aWRlckNyZWF0aW9uID8/IGZhbHNlO1xuXG4gICAgY29uc3QgbGluZXMgPSB0aGlzLmdlbmVyYXRlVGVtcGxhdGVMaW5lcyhcbiAgICAgIHByb3BzLmdpdGh1Yk9pZGMsXG4gICAgICBvaWRjUm9sZU5hbWUsXG4gICAgICBjaGFuZ2VzZXRSb2xlTmFtZSxcbiAgICAgIGRyaWZ0Um9sZU5hbWUsXG4gICAgICByb2xlU2VsZWN0aW9uLFxuICAgICAgcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBza2lwT2lkY1Byb3ZpZGVyLFxuICAgICk7XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgQVdTIENMSSBjb21tYW5kcyBmb3IgU3RhY2tTZXQgb3BlcmF0aW9ucy5cbiAgICogUmV0dXJucyBhIG1hcCBvZiBjb21tYW5kIG5hbWVzIHRvIHNoZWxsIGNvbW1hbmRzLlxuICAgKi9cbiAgc3RhdGljIGdlbmVyYXRlQ29tbWFuZHMocHJvcHM6IENka0RpZmZJYW1UZW1wbGF0ZVN0YWNrU2V0Q29tbWFuZHNQcm9wcyA9IHt9KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3Qgc3RhY2tTZXROYW1lID0gcHJvcHMuc3RhY2tTZXROYW1lID8/ICdjZGstZGlmZi13b3JrZmxvdy1pYW0tc3RhY2tzZXQnO1xuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHByb3BzLnRlbXBsYXRlUGF0aCA/PyAnY2RrLWRpZmYtd29ya2Zsb3ctc3RhY2tzZXQtdGVtcGxhdGUueWFtbCc7XG4gICAgY29uc3QgcmVnaW9ucyA9IHByb3BzLnJlZ2lvbnMgPz8gWyd1cy1lYXN0LTEnXTtcbiAgICBjb25zdCB0YXJnZXRPVXMgPSBwcm9wcy50YXJnZXRPcmdhbml6YXRpb25hbFVuaXRJZHMgPz8gW107XG4gICAgY29uc3QgYXV0b0RlcGxveUVuYWJsZWQgPSBwcm9wcy5hdXRvRGVwbG95bWVudD8uZW5hYmxlZCA/PyB0cnVlO1xuICAgIGNvbnN0IHJldGFpblN0YWNrcyA9IHByb3BzLmF1dG9EZXBsb3ltZW50Py5yZXRhaW5TdGFja3NPbkFjY291bnRSZW1vdmFsID8/IGZhbHNlO1xuICAgIGNvbnN0IGRlbGVnYXRlZEFkbWluID0gcHJvcHMuZGVsZWdhdGVkQWRtaW4gPz8gdHJ1ZTtcbiAgICBjb25zdCBjYWxsQXMgPSBkZWxlZ2F0ZWRBZG1pbiA/ICcgLS1jYWxsLWFzIERFTEVHQVRFRF9BRE1JTicgOiAnJztcblxuICAgIGNvbnN0IG91TGlzdCA9IHRhcmdldE9Vcy5sZW5ndGggPiAwID8gdGFyZ2V0T1VzLmpvaW4oJywnKSA6ICc8T1VfSURTPic7XG4gICAgY29uc3QgcmVnaW9uTGlzdCA9IHJlZ2lvbnMuam9pbignICcpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICdzdGFja3NldC1jcmVhdGUnOiBgYXdzIGNsb3VkZm9ybWF0aW9uIGNyZWF0ZS1zdGFjay1zZXQgLS1zdGFjay1zZXQtbmFtZSAke3N0YWNrU2V0TmFtZX0gLS10ZW1wbGF0ZS1ib2R5IGZpbGU6Ly8ke3RlbXBsYXRlUGF0aH0gLS1jYXBhYmlsaXRpZXMgQ0FQQUJJTElUWV9OQU1FRF9JQU0gLS1wZXJtaXNzaW9uLW1vZGVsIFNFUlZJQ0VfTUFOQUdFRCAtLWF1dG8tZGVwbG95bWVudCBFbmFibGVkPSR7YXV0b0RlcGxveUVuYWJsZWR9LFJldGFpblN0YWNrc09uQWNjb3VudFJlbW92YWw9JHtyZXRhaW5TdGFja3N9JHtjYWxsQXN9YCxcbiAgICAgICdzdGFja3NldC11cGRhdGUnOiBgYXdzIGNsb3VkZm9ybWF0aW9uIHVwZGF0ZS1zdGFjay1zZXQgLS1zdGFjay1zZXQtbmFtZSAke3N0YWNrU2V0TmFtZX0gLS10ZW1wbGF0ZS1ib2R5IGZpbGU6Ly8ke3RlbXBsYXRlUGF0aH0gLS1jYXBhYmlsaXRpZXMgQ0FQQUJJTElUWV9OQU1FRF9JQU0ke2NhbGxBc31gLFxuICAgICAgJ3N0YWNrc2V0LWRlcGxveS1pbnN0YW5jZXMnOiBgYXdzIGNsb3VkZm9ybWF0aW9uIGNyZWF0ZS1zdGFjay1pbnN0YW5jZXMgLS1zdGFjay1zZXQtbmFtZSAke3N0YWNrU2V0TmFtZX0gLS1kZXBsb3ltZW50LXRhcmdldHMgT3JnYW5pemF0aW9uYWxVbml0SWRzPSR7b3VMaXN0fSAtLXJlZ2lvbnMgJHtyZWdpb25MaXN0fSR7Y2FsbEFzfWAsXG4gICAgICAnc3RhY2tzZXQtZGVsZXRlLWluc3RhbmNlcyc6IGBhd3MgY2xvdWRmb3JtYXRpb24gZGVsZXRlLXN0YWNrLWluc3RhbmNlcyAtLXN0YWNrLXNldC1uYW1lICR7c3RhY2tTZXROYW1lfSAtLWRlcGxveW1lbnQtdGFyZ2V0cyBPcmdhbml6YXRpb25hbFVuaXRJZHM9JHtvdUxpc3R9IC0tcmVnaW9ucyAke3JlZ2lvbkxpc3R9IC0tbm8tcmV0YWluLXN0YWNrcyR7Y2FsbEFzfWAsXG4gICAgICAnc3RhY2tzZXQtZGVsZXRlJzogYGF3cyBjbG91ZGZvcm1hdGlvbiBkZWxldGUtc3RhY2stc2V0IC0tc3RhY2stc2V0LW5hbWUgJHtzdGFja1NldE5hbWV9JHtjYWxsQXN9YCxcbiAgICAgICdzdGFja3NldC1kZXNjcmliZSc6IGBhd3MgY2xvdWRmb3JtYXRpb24gZGVzY3JpYmUtc3RhY2stc2V0IC0tc3RhY2stc2V0LW5hbWUgJHtzdGFja1NldE5hbWV9JHtjYWxsQXN9YCxcbiAgICAgICdzdGFja3NldC1saXN0LWluc3RhbmNlcyc6IGBhd3MgY2xvdWRmb3JtYXRpb24gbGlzdC1zdGFjay1pbnN0YW5jZXMgLS1zdGFjay1zZXQtbmFtZSAke3N0YWNrU2V0TmFtZX0ke2NhbGxBc31gLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZVRlbXBsYXRlTGluZXMoXG4gICAgZ2l0aHViT2lkYzogR2l0SHViT2lkY0NvbmZpZyxcbiAgICBvaWRjUm9sZU5hbWU6IHN0cmluZyxcbiAgICBjaGFuZ2VzZXRSb2xlTmFtZTogc3RyaW5nLFxuICAgIGRyaWZ0Um9sZU5hbWU6IHN0cmluZyxcbiAgICByb2xlU2VsZWN0aW9uOiBTdGFja1NldFJvbGVTZWxlY3Rpb24sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgc2tpcE9pZGNQcm92aWRlcjogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZGVzYyA9IGRlc2NyaXB0aW9uID8/ICdHaXRIdWIgT0lEQyBhbmQgSUFNIHJvbGVzIGZvciBDREsgRGlmZi9EcmlmdCB3b3JrZmxvd3MgKFN0YWNrU2V0IGRlcGxveW1lbnQpJztcblxuICAgIGNvbnN0IGluY2x1ZGVDaGFuZ2VzZXQgPVxuICAgICAgcm9sZVNlbGVjdGlvbiA9PT0gU3RhY2tTZXRSb2xlU2VsZWN0aW9uLkJPVEggfHwgcm9sZVNlbGVjdGlvbiA9PT0gU3RhY2tTZXRSb2xlU2VsZWN0aW9uLkNIQU5HRVNFVF9PTkxZO1xuICAgIGNvbnN0IGluY2x1ZGVEcmlmdCA9XG4gICAgICByb2xlU2VsZWN0aW9uID09PSBTdGFja1NldFJvbGVTZWxlY3Rpb24uQk9USCB8fCByb2xlU2VsZWN0aW9uID09PSBTdGFja1NldFJvbGVTZWxlY3Rpb24uRFJJRlRfT05MWTtcblxuICAgIC8vIEhlYWRlclxuICAgIGxpbmVzLnB1c2goXCJBV1NUZW1wbGF0ZUZvcm1hdFZlcnNpb246ICcyMDEwLTA5LTA5J1wiKTtcbiAgICBsaW5lcy5wdXNoKGBEZXNjcmlwdGlvbjogJyR7ZGVzY30nYCk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICAvLyBSZXNvdXJjZXNcbiAgICBsaW5lcy5wdXNoKCdSZXNvdXJjZXM6Jyk7XG5cbiAgICAvLyBPSURDIFByb3ZpZGVyIChvbmx5IGlmIG5vdCBza2lwcGluZylcbiAgICBpZiAoIXNraXBPaWRjUHJvdmlkZXIpIHtcbiAgICAgIGxpbmVzLnB1c2goLi4udGhpcy5nZW5lcmF0ZU9pZGNQcm92aWRlckxpbmVzKCkpO1xuICAgIH1cblxuICAgIC8vIE9JREMgUm9sZSAobmVlZHMgcGVybWlzc2lvbnMgdG8gYXNzdW1lIGNoYW5nZXNldC9kcmlmdCByb2xlcylcbiAgICBjb25zdCB0YXJnZXRSb2xlTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKGluY2x1ZGVDaGFuZ2VzZXQpIHRhcmdldFJvbGVOYW1lcy5wdXNoKGNoYW5nZXNldFJvbGVOYW1lKTtcbiAgICBpZiAoaW5jbHVkZURyaWZ0KSB0YXJnZXRSb2xlTmFtZXMucHVzaChkcmlmdFJvbGVOYW1lKTtcbiAgICBsaW5lcy5wdXNoKC4uLnRoaXMuZ2VuZXJhdGVPaWRjUm9sZUxpbmVzKG9pZGNSb2xlTmFtZSwgZ2l0aHViT2lkYywgc2tpcE9pZGNQcm92aWRlciwgdGFyZ2V0Um9sZU5hbWVzKSk7XG5cbiAgICAvLyBDaGFuZ2VzZXQvRHJpZnQgcm9sZXNcbiAgICBpZiAoaW5jbHVkZUNoYW5nZXNldCkge1xuICAgICAgbGluZXMucHVzaCguLi50aGlzLmdlbmVyYXRlQ2hhbmdlc2V0Um9sZUxpbmVzKGNoYW5nZXNldFJvbGVOYW1lKSk7XG4gICAgfVxuXG4gICAgaWYgKGluY2x1ZGVEcmlmdCkge1xuICAgICAgbGluZXMucHVzaCguLi50aGlzLmdlbmVyYXRlRHJpZnRSb2xlTGluZXMoZHJpZnRSb2xlTmFtZSkpO1xuICAgIH1cblxuICAgIC8vIE91dHB1dHNcbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICBsaW5lcy5wdXNoKCdPdXRwdXRzOicpO1xuICAgIGlmICghc2tpcE9pZGNQcm92aWRlcikge1xuICAgICAgbGluZXMucHVzaCguLi50aGlzLmdlbmVyYXRlT2lkY091dHB1dExpbmVzKCkpO1xuICAgIH1cblxuICAgIC8vIEFsd2F5cyBvdXRwdXQgdGhlIE9JREMgcm9sZSBBUk5cbiAgICBsaW5lcy5wdXNoKC4uLnRoaXMuZ2VuZXJhdGVPaWRjUm9sZU91dHB1dExpbmVzKCkpO1xuXG4gICAgaWYgKGluY2x1ZGVDaGFuZ2VzZXQpIHtcbiAgICAgIGxpbmVzLnB1c2goLi4udGhpcy5nZW5lcmF0ZUNoYW5nZXNldE91dHB1dExpbmVzKCkpO1xuICAgIH1cblxuICAgIGlmIChpbmNsdWRlRHJpZnQpIHtcbiAgICAgIGxpbmVzLnB1c2goLi4udGhpcy5nZW5lcmF0ZURyaWZ0T3V0cHV0TGluZXMoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVPaWRjUHJvdmlkZXJMaW5lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICcgICMgR2l0SHViIE9JREMgUHJvdmlkZXInLFxuICAgICAgJyAgR2l0SHViT0lEQ1Byb3ZpZGVyOicsXG4gICAgICAnICAgIFR5cGU6IEFXUzo6SUFNOjpPSURDUHJvdmlkZXInLFxuICAgICAgJyAgICBQcm9wZXJ0aWVzOicsXG4gICAgICAnICAgICAgVXJsOiBodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tJyxcbiAgICAgICcgICAgICBDbGllbnRJZExpc3Q6JyxcbiAgICAgICcgICAgICAgIC0gc3RzLmFtYXpvbmF3cy5jb20nLFxuICAgICAgJyAgICAgIFRodW1icHJpbnRMaXN0OicsXG4gICAgICAnICAgICAgICAtIDY5MzhmZDRkOThiYWIwM2ZhYWRiOTdiMzQzOTY4MzFlMzc4MGFlYTEnLFxuICAgICAgJyAgICAgICAgLSAxYzU4YTNhODUxOGU4NzU5YmYwNzViNzZiNzUwZDRmMmRmMjY0ZmNkJyxcbiAgICAgICcnLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZU9pZGNSb2xlTGluZXMoXG4gICAgcm9sZU5hbWU6IHN0cmluZyxcbiAgICBnaXRodWJPaWRjOiBHaXRIdWJPaWRjQ29uZmlnLFxuICAgIHNraXBPaWRjUHJvdmlkZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICB0YXJnZXRSb2xlTmFtZXM6IHN0cmluZ1tdID0gW10sXG4gICk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzdWJqZWN0Q2xhaW1zID0gdGhpcy5idWlsZFN1YmplY3RDbGFpbXMoZ2l0aHViT2lkYyk7XG5cbiAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgICcgICMgR2l0SHViIE9JREMgUm9sZSAtIGF1dGhlbnRpY2F0ZXMgR2l0SHViIEFjdGlvbnMgd29ya2Zsb3dzJyxcbiAgICAgICcgIEdpdEh1Yk9JRENSb2xlOicsXG4gICAgICAnICAgIFR5cGU6IEFXUzo6SUFNOjpSb2xlJyxcbiAgICBdO1xuXG4gICAgLy8gT25seSBhZGQgRGVwZW5kc09uIGlmIHdlJ3JlIGNyZWF0aW5nIHRoZSBwcm92aWRlclxuICAgIGlmICghc2tpcE9pZGNQcm92aWRlcikge1xuICAgICAgbGluZXMucHVzaCgnICAgIERlcGVuZHNPbjogR2l0SHViT0lEQ1Byb3ZpZGVyJyk7XG4gICAgfVxuXG4gICAgbGluZXMucHVzaChcbiAgICAgICcgICAgUHJvcGVydGllczonLFxuICAgICAgXCIgICAgICBSb2xlTmFtZTogJ1wiICsgcm9sZU5hbWUgKyBcIidcIixcbiAgICAgICcgICAgICBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQ6JyxcbiAgICAgIFwiICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNydcIixcbiAgICAgICcgICAgICAgIFN0YXRlbWVudDonLFxuICAgICAgJyAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnLFxuICAgICAgJyAgICAgICAgICAgIFByaW5jaXBhbDonLFxuICAgICAgXCIgICAgICAgICAgICAgIEZlZGVyYXRlZDogIVN1YiAnYXJuOmF3czppYW06OiR7QVdTOjpBY2NvdW50SWR9Om9pZGMtcHJvdmlkZXIvdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20nXCIsXG4gICAgICAnICAgICAgICAgICAgQWN0aW9uOiBzdHM6QXNzdW1lUm9sZVdpdGhXZWJJZGVudGl0eScsXG4gICAgICAnICAgICAgICAgICAgQ29uZGl0aW9uOicsXG4gICAgICAnICAgICAgICAgICAgICBTdHJpbmdFcXVhbHM6JyxcbiAgICAgIFwiICAgICAgICAgICAgICAgICd0b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTphdWQnOiAnc3RzLmFtYXpvbmF3cy5jb20nXCIsXG4gICAgICAnICAgICAgICAgICAgICBTdHJpbmdMaWtlOicsXG4gICAgICBcIiAgICAgICAgICAgICAgICAndG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb206c3ViJzpcIixcbiAgICApO1xuXG4gICAgLy8gQWRkIHN1YmplY3QgY2xhaW1zXG4gICAgZm9yIChjb25zdCBjbGFpbSBvZiBzdWJqZWN0Q2xhaW1zKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgICAgICAgICAgICAgICAgICAtICcke2NsYWltfSdgKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgcG9saWN5IHRvIGFsbG93IGFzc3VtaW5nIHRoZSB0YXJnZXQgcm9sZXMgKGNoYW5nZXNldC9kcmlmdClcbiAgICBpZiAodGFyZ2V0Um9sZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxpbmVzLnB1c2goJyAgICAgIFBvbGljaWVzOicpO1xuICAgICAgbGluZXMucHVzaCgnICAgICAgICAtIFBvbGljeU5hbWU6IEFzc3VtZVRhcmdldFJvbGVzJyk7XG4gICAgICBsaW5lcy5wdXNoKCcgICAgICAgICAgUG9saWN5RG9jdW1lbnQ6Jyk7XG4gICAgICBsaW5lcy5wdXNoKFwiICAgICAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnXCIpO1xuICAgICAgbGluZXMucHVzaCgnICAgICAgICAgICAgU3RhdGVtZW50OicpO1xuICAgICAgbGluZXMucHVzaCgnICAgICAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnKTtcbiAgICAgIGxpbmVzLnB1c2goJyAgICAgICAgICAgICAgICBBY3Rpb246IHN0czpBc3N1bWVSb2xlJyk7XG4gICAgICBsaW5lcy5wdXNoKCcgICAgICAgICAgICAgICAgUmVzb3VyY2U6Jyk7XG4gICAgICBmb3IgKGNvbnN0IHRhcmdldFJvbGVOYW1lIG9mIHRhcmdldFJvbGVOYW1lcykge1xuICAgICAgICBsaW5lcy5wdXNoKGAgICAgICAgICAgICAgICAgICAtICFTdWIgJ2Fybjphd3M6aWFtOjpcXCR7QVdTOjpBY2NvdW50SWR9OnJvbGUvJHt0YXJnZXRSb2xlTmFtZX0nYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRTdWJqZWN0Q2xhaW1zKGdpdGh1Yk9pZGM6IEdpdEh1Yk9pZGNDb25maWcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY2xhaW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGJyYW5jaGVzID0gZ2l0aHViT2lkYy5icmFuY2hlcyA/PyBbJyonXTtcblxuICAgIGZvciAoY29uc3QgcmVwbyBvZiBnaXRodWJPaWRjLnJlcG9zaXRvcmllcykge1xuICAgICAgaWYgKHJlcG8gPT09ICcqJykge1xuICAgICAgICAvLyBXaWxkY2FyZCByZXBvIC0gYWxsb3cgYWxsIHJlcG9zIHdpdGggYnJhbmNoIHJlc3RyaWN0aW9uc1xuICAgICAgICBmb3IgKGNvbnN0IGJyYW5jaCBvZiBicmFuY2hlcykge1xuICAgICAgICAgIGlmIChicmFuY2ggPT09ICcqJykge1xuICAgICAgICAgICAgY2xhaW1zLnB1c2goYHJlcG86JHtnaXRodWJPaWRjLm93bmVyfS8qYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsYWltcy5wdXNoKGByZXBvOiR7Z2l0aHViT2lkYy5vd25lcn0vKjpyZWY6cmVmcy9oZWFkcy8ke2JyYW5jaH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNwZWNpZmljIHJlcG9cbiAgICAgICAgZm9yIChjb25zdCBicmFuY2ggb2YgYnJhbmNoZXMpIHtcbiAgICAgICAgICBpZiAoYnJhbmNoID09PSAnKicpIHtcbiAgICAgICAgICAgIGNsYWltcy5wdXNoKGByZXBvOiR7Z2l0aHViT2lkYy5vd25lcn0vJHtyZXBvfToqYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsYWltcy5wdXNoKGByZXBvOiR7Z2l0aHViT2lkYy5vd25lcn0vJHtyZXBvfTpyZWY6cmVmcy9oZWFkcy8ke2JyYW5jaH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgYW55IGFkZGl0aW9uYWwgY2xhaW1zXG4gICAgaWYgKGdpdGh1Yk9pZGMuYWRkaXRpb25hbENsYWltcykge1xuICAgICAgZm9yIChjb25zdCBjbGFpbSBvZiBnaXRodWJPaWRjLmFkZGl0aW9uYWxDbGFpbXMpIHtcbiAgICAgICAgZm9yIChjb25zdCByZXBvIG9mIGdpdGh1Yk9pZGMucmVwb3NpdG9yaWVzKSB7XG4gICAgICAgICAgaWYgKHJlcG8gPT09ICcqJykge1xuICAgICAgICAgICAgY2xhaW1zLnB1c2goYHJlcG86JHtnaXRodWJPaWRjLm93bmVyfS8qOiR7Y2xhaW19YCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsYWltcy5wdXNoKGByZXBvOiR7Z2l0aHViT2lkYy5vd25lcn0vJHtyZXBvfToke2NsYWltfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbGFpbXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUNoYW5nZXNldFJvbGVMaW5lcyhyb2xlTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAnICAjIENsb3VkRm9ybWF0aW9uIENoYW5nZVNldCBSb2xlIC0gbWluaW1hbCBwZXJtaXNzaW9ucyBmb3IgY2hhbmdlc2V0IG9wZXJhdGlvbnMnLFxuICAgICAgJyAgQ2RrQ2hhbmdlc2V0Um9sZTonLFxuICAgICAgJyAgICBUeXBlOiBBV1M6OklBTTo6Um9sZScsXG4gICAgICAnICAgIERlcGVuZHNPbjogR2l0SHViT0lEQ1JvbGUnLFxuICAgICAgJyAgICBQcm9wZXJ0aWVzOicsXG4gICAgICBcIiAgICAgIFJvbGVOYW1lOiAnXCIgKyByb2xlTmFtZSArIFwiJ1wiLFxuICAgICAgJyAgICAgIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudDonLFxuICAgICAgXCIgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3J1wiLFxuICAgICAgJyAgICAgICAgU3RhdGVtZW50OicsXG4gICAgICAnICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycsXG4gICAgICAnICAgICAgICAgICAgUHJpbmNpcGFsOicsXG4gICAgICAnICAgICAgICAgICAgICBBV1M6ICFHZXRBdHQgR2l0SHViT0lEQ1JvbGUuQXJuJyxcbiAgICAgICcgICAgICAgICAgICBBY3Rpb246IHN0czpBc3N1bWVSb2xlJyxcbiAgICAgICcgICAgICBQb2xpY2llczonLFxuICAgICAgJyAgICAgICAgLSBQb2xpY3lOYW1lOiBDbG91ZEZvcm1hdGlvbkNoYW5nZVNldEFjY2VzcycsXG4gICAgICAnICAgICAgICAgIFBvbGljeURvY3VtZW50OicsXG4gICAgICBcIiAgICAgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3J1wiLFxuICAgICAgJyAgICAgICAgICAgIFN0YXRlbWVudDonLFxuICAgICAgJyAgICAgICAgICAgICAgIyBDbG91ZEZvcm1hdGlvbiBjaGFuZ2VzZXQgb3BlcmF0aW9ucycsXG4gICAgICAnICAgICAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnLFxuICAgICAgJyAgICAgICAgICAgICAgICBBY3Rpb246JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkNyZWF0ZUNoYW5nZVNldCcsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpEZXNjcmliZUNoYW5nZVNldCcsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpEZWxldGVDaGFuZ2VTZXQnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246TGlzdENoYW5nZVNldHMnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246RGVzY3JpYmVTdGFja3MnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246RGVzY3JpYmVTdGFja1Jlc291cmNlRHJpZnRzJyxcbiAgICAgIFwiICAgICAgICAgICAgICAgIFJlc291cmNlOiAnKidcIixcbiAgICAgICcgICAgICAgICAgICAgICMgQ0RLIGJvb3RzdHJhcCBidWNrZXQgYWNjZXNzIChmb3IgY2hhbmdlc2V0IGNyZWF0aW9uKScsXG4gICAgICAnICAgICAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnLFxuICAgICAgJyAgICAgICAgICAgICAgICBBY3Rpb246JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIHMzOkdldE9iamVjdCcsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBzMzpQdXRPYmplY3QnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gczM6RGVsZXRlT2JqZWN0JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIHMzOkxpc3RCdWNrZXQnLFxuICAgICAgJyAgICAgICAgICAgICAgICBSZXNvdXJjZTonLFxuICAgICAgXCIgICAgICAgICAgICAgICAgICAtICFTdWIgJ2Fybjphd3M6czM6OjpjZGstJHtBV1M6OkFjY291bnRJZH0tJHtBV1M6OlJlZ2lvbn0tKidcIixcbiAgICAgIFwiICAgICAgICAgICAgICAgICAgLSAhU3ViICdhcm46YXdzOnMzOjo6Y2RrLSR7QVdTOjpBY2NvdW50SWR9LSR7QVdTOjpSZWdpb259LSovKidcIixcbiAgICAgICcgICAgICAgICAgICAgICMgQ0RLIGJvb3RzdHJhcCBwYXJhbWV0ZXIgYWNjZXNzJyxcbiAgICAgICcgICAgICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycsXG4gICAgICAnICAgICAgICAgICAgICAgIEFjdGlvbjonLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gc3NtOkdldFBhcmFtZXRlcicsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBzc206R2V0UGFyYW1ldGVycycsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBzc206R2V0UGFyYW1ldGVyc0J5UGF0aCcsXG4gICAgICBcIiAgICAgICAgICAgICAgICBSZXNvdXJjZTogIVN1YiAnYXJuOmF3czpzc206JHtBV1M6OlJlZ2lvbn06JHtBV1M6OkFjY291bnRJZH06cGFyYW1ldGVyL2Nkay1ib290c3RyYXAvKidcIixcbiAgICAgICcgICAgICAgICAgICAgICMgSUFNIFBhc3NSb2xlIGZvciBDREsgb3BlcmF0aW9ucycsXG4gICAgICAnICAgICAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnLFxuICAgICAgJyAgICAgICAgICAgICAgICBBY3Rpb246JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIGlhbTpQYXNzUm9sZScsXG4gICAgICBcIiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJyonXCIsXG4gICAgICAnICAgICAgICAgICAgICAgIENvbmRpdGlvbjonLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIFN0cmluZ0VxdWFsczonLFxuICAgICAgXCIgICAgICAgICAgICAgICAgICAgICdpYW06UGFzc2VkVG9TZXJ2aWNlJzogJ2Nsb3VkZm9ybWF0aW9uLmFtYXpvbmF3cy5jb20nXCIsXG4gICAgICAnJyxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVEcmlmdFJvbGVMaW5lcyhyb2xlTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAnICAjIENsb3VkRm9ybWF0aW9uIERyaWZ0IERldGVjdGlvbiBSb2xlIC0gbWluaW1hbCBwZXJtaXNzaW9ucyBmb3IgZHJpZnQgZGV0ZWN0aW9uIG9wZXJhdGlvbnMnLFxuICAgICAgJyAgQ2RrRHJpZnRSb2xlOicsXG4gICAgICAnICAgIFR5cGU6IEFXUzo6SUFNOjpSb2xlJyxcbiAgICAgICcgICAgRGVwZW5kc09uOiBHaXRIdWJPSURDUm9sZScsXG4gICAgICAnICAgIFByb3BlcnRpZXM6JyxcbiAgICAgIFwiICAgICAgUm9sZU5hbWU6ICdcIiArIHJvbGVOYW1lICsgXCInXCIsXG4gICAgICAnICAgICAgQXNzdW1lUm9sZVBvbGljeURvY3VtZW50OicsXG4gICAgICBcIiAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnXCIsXG4gICAgICAnICAgICAgICBTdGF0ZW1lbnQ6JyxcbiAgICAgICcgICAgICAgICAgLSBFZmZlY3Q6IEFsbG93JyxcbiAgICAgICcgICAgICAgICAgICBQcmluY2lwYWw6JyxcbiAgICAgICcgICAgICAgICAgICAgIEFXUzogIUdldEF0dCBHaXRIdWJPSURDUm9sZS5Bcm4nLFxuICAgICAgJyAgICAgICAgICAgIEFjdGlvbjogc3RzOkFzc3VtZVJvbGUnLFxuICAgICAgJyAgICAgIFBvbGljaWVzOicsXG4gICAgICAnICAgICAgICAtIFBvbGljeU5hbWU6IENsb3VkRm9ybWF0aW9uRHJpZnRBY2Nlc3MnLFxuICAgICAgJyAgICAgICAgICBQb2xpY3lEb2N1bWVudDonLFxuICAgICAgXCIgICAgICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNydcIixcbiAgICAgICcgICAgICAgICAgICBTdGF0ZW1lbnQ6JyxcbiAgICAgICcgICAgICAgICAgICAgICMgQ2xvdWRGb3JtYXRpb24gZHJpZnQgZGV0ZWN0aW9uIG9wZXJhdGlvbnMnLFxuICAgICAgJyAgICAgICAgICAgICAgLSBFZmZlY3Q6IEFsbG93JyxcbiAgICAgICcgICAgICAgICAgICAgICAgQWN0aW9uOicsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpEZXRlY3RTdGFja0RyaWZ0JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkRlc2NyaWJlU3RhY2tEcmlmdERldGVjdGlvblN0YXR1cycsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpEZXNjcmliZVN0YWNrUmVzb3VyY2VEcmlmdHMnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246RGVzY3JpYmVTdGFja3MnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246TGlzdFN0YWNrUmVzb3VyY2VzJyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkRldGVjdFN0YWNrUmVzb3VyY2VEcmlmdCcsXG4gICAgICBcIiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJyonXCIsXG4gICAgICAnJyxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVPaWRjT3V0cHV0TGluZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAnICBHaXRIdWJPSURDUHJvdmlkZXJBcm46JyxcbiAgICAgIFwiICAgIERlc2NyaXB0aW9uOiAnQVJOIG9mIHRoZSBHaXRIdWIgT0lEQyBwcm92aWRlcidcIixcbiAgICAgICcgICAgVmFsdWU6ICFHZXRBdHQgR2l0SHViT0lEQ1Byb3ZpZGVyLkFybicsXG4gICAgICAnICAgIEV4cG9ydDonLFxuICAgICAgXCIgICAgICBOYW1lOiAhU3ViICcke0FXUzo6U3RhY2tOYW1lfS1HaXRIdWJPSURDUHJvdmlkZXJBcm4nXCIsXG4gICAgICAnJyxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVPaWRjUm9sZU91dHB1dExpbmVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgJyAgR2l0SHViT0lEQ1JvbGVBcm46JyxcbiAgICAgIFwiICAgIERlc2NyaXB0aW9uOiAnQVJOIG9mIHRoZSBHaXRIdWIgT0lEQyByb2xlJ1wiLFxuICAgICAgJyAgICBWYWx1ZTogIUdldEF0dCBHaXRIdWJPSURDUm9sZS5Bcm4nLFxuICAgICAgJyAgICBFeHBvcnQ6JyxcbiAgICAgIFwiICAgICAgTmFtZTogIVN1YiAnJHtBV1M6OlN0YWNrTmFtZX0tR2l0SHViT0lEQ1JvbGVBcm4nXCIsXG4gICAgICAnJyxcbiAgICAgICcgIEdpdEh1Yk9JRENSb2xlTmFtZTonLFxuICAgICAgXCIgICAgRGVzY3JpcHRpb246ICdOYW1lIG9mIHRoZSBHaXRIdWIgT0lEQyByb2xlJ1wiLFxuICAgICAgJyAgICBWYWx1ZTogIVJlZiBHaXRIdWJPSURDUm9sZScsXG4gICAgICAnICAgIEV4cG9ydDonLFxuICAgICAgXCIgICAgICBOYW1lOiAhU3ViICcke0FXUzo6U3RhY2tOYW1lfS1HaXRIdWJPSURDUm9sZU5hbWUnXCIsXG4gICAgICAnJyxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVDaGFuZ2VzZXRPdXRwdXRMaW5lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICcgIENka0NoYW5nZXNldFJvbGVBcm46JyxcbiAgICAgIFwiICAgIERlc2NyaXB0aW9uOiAnQVJOIG9mIHRoZSBDREsgY2hhbmdlc2V0IHJvbGUnXCIsXG4gICAgICAnICAgIFZhbHVlOiAhR2V0QXR0IENka0NoYW5nZXNldFJvbGUuQXJuJyxcbiAgICAgICcgICAgRXhwb3J0OicsXG4gICAgICBcIiAgICAgIE5hbWU6ICFTdWIgJyR7QVdTOjpTdGFja05hbWV9LUNka0NoYW5nZXNldFJvbGVBcm4nXCIsXG4gICAgICAnJyxcbiAgICAgICcgIENka0NoYW5nZXNldFJvbGVOYW1lOicsXG4gICAgICBcIiAgICBEZXNjcmlwdGlvbjogJ05hbWUgb2YgdGhlIENESyBjaGFuZ2VzZXQgcm9sZSdcIixcbiAgICAgICcgICAgVmFsdWU6ICFSZWYgQ2RrQ2hhbmdlc2V0Um9sZScsXG4gICAgICAnICAgIEV4cG9ydDonLFxuICAgICAgXCIgICAgICBOYW1lOiAhU3ViICcke0FXUzo6U3RhY2tOYW1lfS1DZGtDaGFuZ2VzZXRSb2xlTmFtZSdcIixcbiAgICAgICcnLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZURyaWZ0T3V0cHV0TGluZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAnICBDZGtEcmlmdFJvbGVBcm46JyxcbiAgICAgIFwiICAgIERlc2NyaXB0aW9uOiAnQVJOIG9mIHRoZSBDREsgZHJpZnQgZGV0ZWN0aW9uIHJvbGUnXCIsXG4gICAgICAnICAgIFZhbHVlOiAhR2V0QXR0IENka0RyaWZ0Um9sZS5Bcm4nLFxuICAgICAgJyAgICBFeHBvcnQ6JyxcbiAgICAgIFwiICAgICAgTmFtZTogIVN1YiAnJHtBV1M6OlN0YWNrTmFtZX0tQ2RrRHJpZnRSb2xlQXJuJ1wiLFxuICAgICAgJycsXG4gICAgICAnICBDZGtEcmlmdFJvbGVOYW1lOicsXG4gICAgICBcIiAgICBEZXNjcmlwdGlvbjogJ05hbWUgb2YgdGhlIENESyBkcmlmdCBkZXRlY3Rpb24gcm9sZSdcIixcbiAgICAgICcgICAgVmFsdWU6ICFSZWYgQ2RrRHJpZnRSb2xlJyxcbiAgICAgICcgICAgRXhwb3J0OicsXG4gICAgICBcIiAgICAgIE5hbWU6ICFTdWIgJyR7QVdTOjpTdGFja05hbWV9LUNka0RyaWZ0Um9sZU5hbWUnXCIsXG4gICAgXTtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgUHJvamVuLWludGVncmF0ZWQgU3RhY2tTZXQgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrRGlmZklhbVRlbXBsYXRlU3RhY2tTZXRQcm9wcyBleHRlbmRzIENka0RpZmZJYW1UZW1wbGF0ZVN0YWNrU2V0R2VuZXJhdG9yUHJvcHMge1xuICAvKiogUHJvamVuIHByb2plY3QgaW5zdGFuY2UgKi9cbiAgcmVhZG9ubHkgcHJvamVjdDogYW55O1xuXG4gIC8qKiBOYW1lIG9mIHRoZSBTdGFja1NldCAoZGVmYXVsdDogJ2Nkay1kaWZmLXdvcmtmbG93LWlhbS1zdGFja3NldCcpICovXG4gIHJlYWRvbmx5IHN0YWNrU2V0TmFtZT86IHN0cmluZztcblxuICAvKiogT3V0cHV0IHBhdGggZm9yIHRoZSB0ZW1wbGF0ZSBmaWxlIChkZWZhdWx0OiAnY2RrLWRpZmYtd29ya2Zsb3ctc3RhY2tzZXQtdGVtcGxhdGUueWFtbCcpICovXG4gIHJlYWRvbmx5IG91dHB1dFBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqIFRhcmdldCBPVXMgZm9yIGRlcGxveW1lbnQgKGUuZy4sIFsnb3UteHh4eC14eHh4eHh4eCcsICdyLXh4eHgnXSkgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0T3JnYW5pemF0aW9uYWxVbml0SWRzPzogc3RyaW5nW107XG5cbiAgLyoqIFRhcmdldCByZWdpb25zIGZvciBkZXBsb3ltZW50IChlLmcuLCBbJ3VzLWVhc3QtMScsICdldS13ZXN0LTEnXSkgKi9cbiAgcmVhZG9ubHkgcmVnaW9ucz86IHN0cmluZ1tdO1xuXG4gIC8qKiBBdXRvLWRlcGxveW1lbnQgY29uZmlndXJhdGlvbiAqL1xuICByZWFkb25seSBhdXRvRGVwbG95bWVudD86IFN0YWNrU2V0QXV0b0RlcGxveW1lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXNlIGRlbGVnYXRlZCBhZG1pbiBtb2RlIGZvciBTdGFja1NldCBvcGVyYXRpb25zLlxuICAgKiBJZiB0cnVlLCBhZGRzIC0tY2FsbC1hcyBERUxFR0FURURfQURNSU4gdG8gY29tbWFuZHMuXG4gICAqIElmIGZhbHNlLCBhc3N1bWVzIHJ1bm5pbmcgZnJvbSB0aGUgbWFuYWdlbWVudCBhY2NvdW50LlxuICAgKiBEZWZhdWx0OiB0cnVlXG4gICAqL1xuICByZWFkb25seSBkZWxlZ2F0ZWRBZG1pbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvamVuIGNvbnN0cnVjdCB0aGF0IGNyZWF0ZXMgYSBDbG91ZEZvcm1hdGlvbiBTdGFja1NldCB0ZW1wbGF0ZSBmb3Igb3JnLXdpZGUgZGVwbG95bWVudCBvZlxuICogR2l0SHViIE9JREMgcHJvdmlkZXIsIE9JREMgcm9sZSwgYW5kIENESyBEaWZmL0RyaWZ0IElBTSByb2xlcy5cbiAqXG4gKiBUaGlzIHByb3ZpZGVzIGEgc2VsZi1jb250YWluZWQgcGVyLWFjY291bnQgZGVwbG95bWVudCB3aXRoIG5vIHJvbGUgY2hhaW5pbmcgcmVxdWlyZWQuXG4gKlxuICogRm9yIG5vbi1Qcm9qZW4gcHJvamVjdHMsIHVzZSBgQ2RrRGlmZklhbVRlbXBsYXRlU3RhY2tTZXRHZW5lcmF0b3JgIGRpcmVjdGx5LlxuICovXG5leHBvcnQgY2xhc3MgQ2RrRGlmZklhbVRlbXBsYXRlU3RhY2tTZXQge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogQ2RrRGlmZklhbVRlbXBsYXRlU3RhY2tTZXRQcm9wcykge1xuICAgIGNvbnN0IG91dHB1dFBhdGggPSBwcm9wcy5vdXRwdXRQYXRoID8/ICdjZGstZGlmZi13b3JrZmxvdy1zdGFja3NldC10ZW1wbGF0ZS55YW1sJztcbiAgICBjb25zdCBzdGFja1NldE5hbWUgPSBwcm9wcy5zdGFja1NldE5hbWUgPz8gJ2Nkay1kaWZmLXdvcmtmbG93LWlhbS1zdGFja3NldCc7XG5cbiAgICAvLyBHZW5lcmF0ZSB0ZW1wbGF0ZSB1c2luZyB0aGUgZ2VuZXJhdG9yXG4gICAgY29uc3QgdGVtcGxhdGUgPSBDZGtEaWZmSWFtVGVtcGxhdGVTdGFja1NldEdlbmVyYXRvci5nZW5lcmF0ZVRlbXBsYXRlKHByb3BzKTtcbiAgICBuZXcgVGV4dEZpbGUocHJvcHMucHJvamVjdCwgb3V0cHV0UGF0aCwgeyBsaW5lczogdGVtcGxhdGUuc3BsaXQoJ1xcbicpIH0pO1xuXG4gICAgLy8gR2VuZXJhdGUgY29tbWFuZHMgYW5kIGFkZCBhcyBQcm9qZW4gdGFza3NcbiAgICBjb25zdCBjb21tYW5kcyA9IENka0RpZmZJYW1UZW1wbGF0ZVN0YWNrU2V0R2VuZXJhdG9yLmdlbmVyYXRlQ29tbWFuZHMoe1xuICAgICAgc3RhY2tTZXROYW1lLFxuICAgICAgdGVtcGxhdGVQYXRoOiBvdXRwdXRQYXRoLFxuICAgICAgdGFyZ2V0T3JnYW5pemF0aW9uYWxVbml0SWRzOiBwcm9wcy50YXJnZXRPcmdhbml6YXRpb25hbFVuaXRJZHMsXG4gICAgICByZWdpb25zOiBwcm9wcy5yZWdpb25zLFxuICAgICAgYXV0b0RlcGxveW1lbnQ6IHByb3BzLmF1dG9EZXBsb3ltZW50LFxuICAgICAgZGVsZWdhdGVkQWRtaW46IHByb3BzLmRlbGVnYXRlZEFkbWluLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGFza0Rlc2NyaXB0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdzdGFja3NldC1jcmVhdGUnOiAnQ3JlYXRlIHRoZSBTdGFja1NldCBmb3Igb3JnLXdpZGUgSUFNIHJvbGUgZGVwbG95bWVudCcsXG4gICAgICAnc3RhY2tzZXQtdXBkYXRlJzogJ1VwZGF0ZSB0aGUgU3RhY2tTZXQgdGVtcGxhdGUnLFxuICAgICAgJ3N0YWNrc2V0LWRlcGxveS1pbnN0YW5jZXMnOlxuICAgICAgICAnRGVwbG95IHN0YWNrIGluc3RhbmNlcyB0byB0YXJnZXQgT1VzIGFuZCByZWdpb25zIChwYXNzIC0tZGVwbG95bWVudC10YXJnZXRzIE9yZ2FuaXphdGlvbmFsVW5pdElkcz08b3UtaWRzPiB0byBvdmVycmlkZSknLFxuICAgICAgJ3N0YWNrc2V0LWRlbGV0ZS1pbnN0YW5jZXMnOiAnRGVsZXRlIHN0YWNrIGluc3RhbmNlcyBmcm9tIHRhcmdldCBPVXMgYW5kIHJlZ2lvbnMnLFxuICAgICAgJ3N0YWNrc2V0LWRlbGV0ZSc6ICdEZWxldGUgdGhlIFN0YWNrU2V0IChyZXF1aXJlcyBhbGwgaW5zdGFuY2VzIHRvIGJlIGRlbGV0ZWQgZmlyc3QpJyxcbiAgICAgICdzdGFja3NldC1kZXNjcmliZSc6ICdEZXNjcmliZSB0aGUgU3RhY2tTZXQgc3RhdHVzIGFuZCBjb25maWd1cmF0aW9uJyxcbiAgICAgICdzdGFja3NldC1saXN0LWluc3RhbmNlcyc6ICdMaXN0IGFsbCBzdGFjayBpbnN0YW5jZXMgYW5kIHRoZWlyIHN0YXR1c2VzJyxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBbdGFza05hbWUsIGNvbW1hbmRdIG9mIE9iamVjdC5lbnRyaWVzKGNvbW1hbmRzKSkge1xuICAgICAgcHJvcHMucHJvamVjdC5hZGRUYXNrKHRhc2tOYW1lLCB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiB0YXNrRGVzY3JpcHRpb25zW3Rhc2tOYW1lXSxcbiAgICAgICAgcmVjZWl2ZUFyZ3M6IHRhc2tOYW1lICE9PSAnc3RhY2tzZXQtZGVsZXRlJyxcbiAgICAgICAgZXhlYzogY29tbWFuZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -13,6 +13,16 @@ export interface CdkDiffStackWorkflowProps {
|
|
|
13
13
|
readonly nodeVersion?: string;
|
|
14
14
|
readonly cdkYarnCommand?: string;
|
|
15
15
|
readonly scriptOutputPath?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Working directory for the CDK app, relative to the repository root.
|
|
18
|
+
* Useful for monorepos where infrastructure lives in a subdirectory (e.g., 'infra').
|
|
19
|
+
*
|
|
20
|
+
* When set, all workflow run steps will use `defaults.run.working-directory`
|
|
21
|
+
* and script paths will be adjusted to use absolute references.
|
|
22
|
+
*
|
|
23
|
+
* @default - repository root
|
|
24
|
+
*/
|
|
25
|
+
readonly workingDirectory?: string;
|
|
16
26
|
}
|
|
17
27
|
export declare class CdkDiffStackWorkflow {
|
|
18
28
|
private static scriptCreated;
|
|
@@ -17,6 +17,9 @@ class CdkDiffStackWorkflow {
|
|
|
17
17
|
const cdkYarnCommand = props.cdkYarnCommand ?? 'cdk';
|
|
18
18
|
const nodeVersion = props.nodeVersion ?? '24.x';
|
|
19
19
|
const scriptOutputPath = props.scriptOutputPath ?? '.github/workflows/scripts/describe-cfn-changeset.ts';
|
|
20
|
+
// Normalize working directory: strip trailing slashes
|
|
21
|
+
const wd = props.workingDirectory?.replace(/\/+$/, '');
|
|
22
|
+
const defaults = wd ? { run: { workingDirectory: wd } } : undefined;
|
|
20
23
|
// Validate OIDC configuration
|
|
21
24
|
this.validateOidcConfiguration(props);
|
|
22
25
|
// Only create the changeset script once to avoid collisions
|
|
@@ -34,7 +37,7 @@ class CdkDiffStackWorkflow {
|
|
|
34
37
|
const fileName = `${workflowName}.yml`;
|
|
35
38
|
const gh = props.project.github ?? new github_1.GitHub(props.project);
|
|
36
39
|
const diffDeployWorkflow = new github_1.GithubWorkflow(gh, workflowName, { fileName });
|
|
37
|
-
this.createWorkflowForStack(diffDeployWorkflow, stack, cdkYarnCommand, nodeVersion, scriptOutputPath, props.oidcRoleArn, props.oidcRegion);
|
|
40
|
+
this.createWorkflowForStack(diffDeployWorkflow, stack, cdkYarnCommand, nodeVersion, scriptOutputPath, defaults, props.oidcRoleArn, props.oidcRegion);
|
|
38
41
|
}
|
|
39
42
|
}
|
|
40
43
|
validateOidcConfiguration(props) {
|
|
@@ -51,10 +54,12 @@ class CdkDiffStackWorkflow {
|
|
|
51
54
|
throw new Error('Either provide default oidcRegion or specify oidcRegion for each stack');
|
|
52
55
|
}
|
|
53
56
|
}
|
|
54
|
-
createWorkflowForStack(workflow, stack, cdkYarnCommand, nodeVersion, scriptOutputPath, defaultOidcRoleArn, defaultOidcRegion) {
|
|
57
|
+
createWorkflowForStack(workflow, stack, cdkYarnCommand, nodeVersion, scriptOutputPath, defaults, defaultOidcRoleArn, defaultOidcRegion) {
|
|
55
58
|
// Sanitize stack name for CloudFormation API calls (must match [a-zA-Z][-a-zA-Z0-9]*, max 128 chars)
|
|
56
59
|
// Original stack.stackName is preserved only for the CDK deploy target and step display names
|
|
57
60
|
const sanitizedStackName = sanitizeForCloudFormation(stack.stackName);
|
|
61
|
+
// When working directory is set, the describe-changeset step overrides back to repo root
|
|
62
|
+
// because the script needs root-level ts-node, tsconfig.json, and node_modules (e.g. @aws-sdk)
|
|
58
63
|
workflow.on({
|
|
59
64
|
pullRequest: {
|
|
60
65
|
types: ['opened', 'synchronize', 'reopened'],
|
|
@@ -63,6 +68,7 @@ class CdkDiffStackWorkflow {
|
|
|
63
68
|
workflow.addJobs({
|
|
64
69
|
diff: {
|
|
65
70
|
runsOn: ['ubuntu-latest'],
|
|
71
|
+
...(defaults && { defaults }),
|
|
66
72
|
permissions: {
|
|
67
73
|
idToken: workflows_model_1.JobPermission.WRITE,
|
|
68
74
|
contents: workflows_model_1.JobPermission.READ,
|
|
@@ -158,8 +164,13 @@ class CdkDiffStackWorkflow {
|
|
|
158
164
|
},
|
|
159
165
|
{
|
|
160
166
|
name: `Describe change set for ${stack.stackName}`,
|
|
161
|
-
run:
|
|
167
|
+
run: defaults
|
|
168
|
+
? `npx ts-node --transpile-only \$GITHUB_WORKSPACE/${scriptOutputPath}`
|
|
169
|
+
: `npx ts-node ${scriptOutputPath}`,
|
|
162
170
|
env: {
|
|
171
|
+
...(defaults && {
|
|
172
|
+
NODE_PATH: `\${{ github.workspace }}/${defaults.run.workingDirectory}/node_modules`,
|
|
173
|
+
}),
|
|
163
174
|
STACK_NAME: '${{ steps.create-changeset.outputs.cf-stack-name }}',
|
|
164
175
|
CHANGE_SET_NAME: sanitizedStackName,
|
|
165
176
|
GITHUB_COMMENT_URL: '${{ github.event.pull_request.comments_url }}',
|
|
@@ -177,7 +188,7 @@ class CdkDiffStackWorkflow {
|
|
|
177
188
|
}
|
|
178
189
|
exports.CdkDiffStackWorkflow = CdkDiffStackWorkflow;
|
|
179
190
|
_a = JSII_RTTI_SYMBOL_1;
|
|
180
|
-
CdkDiffStackWorkflow[_a] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDiffStackWorkflow", version: "1.
|
|
191
|
+
CdkDiffStackWorkflow[_a] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDiffStackWorkflow", version: "1.8.0" };
|
|
181
192
|
CdkDiffStackWorkflow.scriptCreated = false;
|
|
182
193
|
function sanitizeForFileName(name) {
|
|
183
194
|
return name.replace(/[^a-zA-Z0-9]+/g, '-').replace(/^-+|-+$/g, '').toLowerCase();
|
|
@@ -213,4 +224,4 @@ function buildWorkflowName(prefix, sanitizedName, maxLength = MAX_WORKFLOW_FILEN
|
|
|
213
224
|
// Truncate from the beginning to keep the stack name (end) intact
|
|
214
225
|
return `${prefix}${sanitizedName.slice(-available).replace(/^-+/, '')}`;
|
|
215
226
|
}
|
|
216
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2RrRGlmZlN0YWNrV29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQ2RrRGlmZlN0YWNrV29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQW1OQSxrREFFQztBQUlELDhEQWdCQzs7QUF6T0QsOENBQTJEO0FBQzNELHVFQUFrRTtBQUNsRSxxRUFBZ0U7QUFFaEUsTUFBTSxrQ0FBa0MsR0FBRyxJQUFJLENBQUM7QUFDaEQsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLENBQUM7QUFDMUMsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLENBQUM7QUFFM0MsTUFBTSw0QkFBNEIsR0FBRyxHQUFHLENBQUM7QUFtQnpDLE1BQWEsb0JBQW9CO0lBRy9CLFlBQVksS0FBZ0M7UUFDMUMsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUM7UUFDckQsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUM7UUFDaEQsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLElBQUkscURBQXFELENBQUM7UUFFekcsOEJBQThCO1FBQzlCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0Qyw0REFBNEQ7UUFDNUQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hDLElBQUkseUNBQWtCLENBQUM7Z0JBQ3JCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztnQkFDdEIsVUFBVSxFQUFFLGdCQUFnQjthQUM3QixDQUFDLENBQUM7WUFDSCxvQkFBb0IsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzVDLENBQUM7UUFFRCw0Q0FBNEM7UUFDNUMsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENB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QU0sSUFBSSxHQUFHLEdBQUcsTUFBTSxHQUFHLGFBQWEsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUMvQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksU0FBUyxFQUFFLENBQUM7UUFDN0IsT0FBTyxHQUFHLE1BQU0sR0FBRyxhQUFhLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUN6RCxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLG1FQUFtRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFDRCxrRUFBa0U7SUFDbEUsT0FBTyxHQUFHLE1BQU0sR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQzFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHaXRIdWIsIEdpdGh1YldvcmtmbG93IH0gZnJvbSAncHJvamVuL2xpYi9naXRodWInO1xuaW1wb3J0IHsgSm9iUGVybWlzc2lvbiB9IGZyb20gJ3Byb2plbi9saWIvZ2l0aHViL3dvcmtmbG93cy1tb2RlbCc7XG5pbXBvcnQgeyBDZGtDaGFuZ2VzZXRTY3JpcHQgfSBmcm9tICcuL2Jpbi9jZGstY2hhbmdlc2V0LXNjcmlwdCc7XG5cbmNvbnN0IGdpdGh1YkFjdGlvbnNBd3NDcmVkZW50aWFsc1ZlcnNpb24gPSAndjQnO1xuY29uc3QgZ2l0aHViQWN0aW9uc0NoZWNrb3V0VmVyc2lvbiA9ICd2NCc7XG5jb25zdCBnaXRodWJBY3Rpb25zU2V0dXBOb2RlVmVyc2lvbiA9ICd2NCc7XG5cbmNvbnN0IE1BWF9XT1JLRkxPV19GSUxFTkFNRV9MRU5HVEggPSAyNTU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrRGlmZlN0YWNrIHtcbiAgcmVhZG9ubHkgc3RhY2tOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNoYW5nZXNldFJvbGVUb0Fzc3VtZUFybjogc3RyaW5nO1xuICByZWFkb25seSBjaGFuZ2VzZXRSb2xlVG9Bc3N1bWVSZWdpb246IHN0cmluZztcbiAgcmVhZG9ubHkgb2lkY1JvbGVBcm4/OiBzdHJpbmc7IC8vIE9wdGlvbmFsIG92ZXJyaWRlIGZvciBPSURDIHJvbGVcbiAgcmVhZG9ubHkgb2lkY1JlZ2lvbj86IHN0cmluZzsgLy8gT3B0aW9uYWwgb3ZlcnJpZGUgZm9yIE9JREMgcmVnaW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrRGlmZlN0YWNrV29ya2Zsb3dQcm9wcyB7XG4gIHJlYWRvbmx5IHByb2plY3Q6IGFueTsgLy8gYXZvaWQgZXhwb3J0aW5nIHByb2plbiB0eXBlcyBpbiBwdWJsaWMgQVBJXG4gIHJlYWRvbmx5IHN0YWNrczogQ2RrRGlmZlN0YWNrW107XG4gIHJlYWRvbmx5IG9pZGNSb2xlQXJuPzogc3RyaW5nOyAvLyBEZWZhdWx0IE9JREMgcm9sZSBBUk4gZm9yIGFsbCBzdGFja3MgKG9yIGVhY2ggc3RhY2sgbXVzdCBoYXZlIGl0cyBvd24pXG4gIHJlYWRvbmx5IG9pZGNSZWdpb24/OiBzdHJpbmc7IC8vIERlZmF1bHQgT0lEQyByZWdpb24gZm9yIGFsbCBzdGFja3MgKG9yIGVhY2ggc3RhY2sgbXVzdCBoYXZlIGl0cyBvd24pXG4gIHJlYWRvbmx5IG5vZGVWZXJzaW9uPzogc3RyaW5nO1xuICByZWFkb25seSBjZGtZYXJuQ29tbWFuZD86IHN0cmluZztcbiAgcmVhZG9ubHkgc2NyaXB0T3V0cHV0UGF0aD86IHN0cmluZztcbn1cbmV4cG9ydCBjbGFzcyBDZGtEaWZmU3RhY2tXb3JrZmxvdyB7XG4gIHByaXZhdGUgc3RhdGljIHNjcmlwdENyZWF0ZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQ2RrRGlmZlN0YWNrV29ya2Zsb3dQcm9wcykge1xuICAgIGNvbnN0IGNka1lhcm5Db21tYW5kID0gcHJvcHMuY2RrWWFybkNvbW1hbmQgPz8gJ2Nkayc7XG4gICAgY29uc3Qgbm9kZVZlcnNpb24gPSBwcm9wcy5ub2RlVmVyc2lvbiA/PyAnMjQueCc7XG4gICAgY29uc3Qgc2NyaXB0T3V0cHV0UGF0aCA9IHByb3BzLnNjcmlwdE91dHB1dFBhdGggPz8gJy5naXRodWIvd29ya2Zsb3dzL3NjcmlwdHMvZGVzY3JpYmUtY2ZuLWNoYW5nZXNldC50cyc7XG5cbiAgICAvLyBWYWxpZGF0ZSBPSURDIGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLnZhbGlkYXRlT2lkY0NvbmZpZ3VyYXRpb24ocHJvcHMpO1xuXG4gICAgLy8gT25seSBjcmVhdGUgdGhlIGNoYW5nZXNldCBzY3JpcHQgb25jZSB0byBhdm9pZCBjb2xsaXNpb25zXG4gICAgaWYgKCFDZGtEaWZmU3RhY2tXb3JrZmxvdy5zY3JpcHRDcmVhdGVkKSB7XG4gICAgICBuZXcgQ2RrQ2hhbmdlc2V0U2NyaXB0KHtcbiAgICAgICAgcHJvamVjdDogcHJvcHMucHJvamVjdCxcbiAgICAgICAgb3V0cHV0UGF0aDogc2NyaXB0T3V0cHV0UGF0aCxcbiAgICAgIH0pO1xuICAgICAgQ2RrRGlmZlN0YWNrV29ya2Zsb3cuc2NyaXB0Q3JlYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgc2VwYXJhdGUgd29ya2Zsb3cgZm9yIGVhY2ggc3RhY2tcbiAgICBmb3IgKGNvbnN0IHN0YWNrIG9mIHByb3BzLnN0YWNrcykge1xuICAgICAgY29uc3Qgc2FuaXRpemVkU3RhY2tOYW1lID0gc2FuaXRpemVGb3JGaWxlTmFtZShzdGFjay5zdGFja05hbWUpO1xuICAgICAgY29uc3Qgd29ya2Zsb3dOYW1lID0gYnVpbGRXb3JrZmxvd05hbWUoJ2RpZmYtJywgc2FuaXRpemVkU3RhY2tOYW1lKTtcbiAgICAgIGNvbnN0IGZpbGVOYW1lID0gYCR7d29ya2Zsb3dOYW1lfS55bWxgO1xuICAgICAgY29uc3QgZ2ggPSAocHJvcHMgYXMgYW55KS5wcm9qZWN0LmdpdGh1YiA/PyBuZXcgR2l0SHViKChwcm9wcyBhcyBhbnkpLnByb2plY3QpO1xuICAgICAgY29uc3QgZGlmZkRlcGxveVdvcmtmbG93ID0gbmV3IEdpdGh1YldvcmtmbG93KGdoLCB3b3JrZmxvd05hbWUsIHsgZmlsZU5hbWUgfSk7XG5cbiAgICAgIHRoaXMuY3JlYXRlV29ya2Zsb3dGb3JTdGFjayhkaWZmRGVwbG95V29ya2Zsb3csIHN0YWNrLCBjZGtZYXJuQ29tbWFuZCwgbm9kZVZlcnNpb24sIHNjcmlwdE91dHB1dFBhdGgsIHByb3BzLm9pZGNSb2xlQXJuLCBwcm9wcy5vaWRjUmVnaW9uKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlT2lkY0NvbmZpZ3VyYXRpb24ocHJvcHM6IENka0RpZmZTdGFja1dvcmtmbG93UHJvcHMpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNEZWZhdWx0T2lkY1JvbGUgPSAhIXByb3BzLm9pZGNSb2xlQXJuO1xuICAgIGNvbnN0IGhhc0RlZmF1bHRPaWRjUmVnaW9uID0gISFwcm9wcy5vaWRjUmVnaW9uO1xuXG4gICAgLy8gQ2hlY2sgaWYgYWxsIHN0YWNrcyBoYXZlIHRoZWlyIG93biBPSURDIGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBhbGxTdGFja3NIYXZlT2lkY1JvbGUgPSBwcm9wcy5zdGFja3MuZXZlcnkoc3RhY2sgPT4gISFzdGFjay5vaWRjUm9sZUFybik7XG4gICAgY29uc3QgYWxsU3RhY2tzSGF2ZU9pZGNSZWdpb24gPSBwcm9wcy5zdGFja3MuZXZlcnkoc3RhY2sgPT4gISFzdGFjay5vaWRjUmVnaW9uKTtcblxuICAgIC8vIEVpdGhlciBkZWZhdWx0cyBtdXN0IGJlIHByb3ZpZGVkIE9SIGFsbCBzdGFja3MgbXVzdCBoYXZlIHRoZWlyIG93biBPSURDIGNvbmZpZ1xuICAgIGlmICghaGFzRGVmYXVsdE9pZGNSb2xlICYmICFhbGxTdGFja3NIYXZlT2lkY1JvbGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRWl0aGVyIHByb3ZpZGUgZGVmYXVsdCBvaWRjUm9sZUFybiBvciBzcGVjaWZ5IG9pZGNSb2xlQXJuIGZvciBlYWNoIHN0YWNrJyk7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNEZWZhdWx0T2lkY1JlZ2lvbiAmJiAhYWxsU3RhY2tzSGF2ZU9pZGNSZWdpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRWl0aGVyIHByb3ZpZGUgZGVmYXVsdCBvaWRjUmVnaW9uIG9yIHNwZWNpZnkgb2lkY1JlZ2lvbiBmb3IgZWFjaCBzdGFjaycpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlV29ya2Zsb3dGb3JTdGFjayhcbiAgICB3b3JrZmxvdzogR2l0aHViV29ya2Zsb3csXG4gICAgc3RhY2s6IENka0RpZmZTdGFjayxcbiAgICBjZGtZYXJuQ29tbWFuZDogc3RyaW5nLFxuICAgIG5vZGVWZXJzaW9uOiBzdHJpbmcsXG4gICAgc2NyaXB0T3V0cHV0UGF0aDogc3RyaW5nLFxuICAgIGRlZmF1bHRPaWRjUm9sZUFybj86IHN0cmluZyxcbiAgICBkZWZhdWx0T2lkY1JlZ2lvbj86IHN0cmluZyxcbiAgKSB7XG4gICAgLy8gU2FuaXRpemUgc3RhY2sgbmFtZSBmb3IgQ2xvdWRGb3JtYXRpb24gQVBJIGNhbGxzIChtdXN0IG1hdGNoIFthLXpBLVpdWy1hLXpBLVowLTldKiwgbWF4IDEyOCBjaGFycylcbiAgICAvLyBPcmlnaW5hbCBzdGFjay5zdGFja05hbWUgaXMgcHJlc2VydmVkIG9ubHkgZm9yIHRoZSBDREsgZGVwbG95IHRhcmdldCBhbmQgc3RlcCBkaXNwbGF5IG5hbWVzXG4gICAgY29uc3Qgc2FuaXRpemVkU3RhY2tOYW1lID0gc2FuaXRpemVGb3JDbG91ZEZvcm1hdGlvbihzdGFjay5zdGFja05hbWUpO1xuXG4gICAgd29ya2Zsb3cub24oe1xuICAgICAgcHVsbFJlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ3N5bmNocm9uaXplJywgJ3Jlb3BlbmVkJ10sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHdvcmtmbG93LmFkZEpvYnMoe1xuICAgICAgZGlmZjoge1xuICAgICAgICBydW5zT246IFsndWJ1bnR1LWxhdGVzdCddLFxuICAgICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICAgIGlkVG9rZW46IEpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICAgICAgY29udGVudHM6IEpvYlBlcm1pc3Npb24uUkVBRCxcbiAgICAgICAgICBpc3N1ZXM6IEpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICAgICAgcHVsbFJlcXVlc3RzOiBKb2JQZXJtaXNzaW9uLldSSVRFLFxuICAgICAgICAgIHBhY2thZ2VzOiBKb2JQZXJtaXNzaW9uLlJFQUQsXG4gICAgICAgIH0sXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScsXG4gICAgICAgIH0sXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXNlczogYGFjdGlvbnMvY2hlY2tvdXRAJHtnaXRodWJBY3Rpb25zQ2hlY2tvdXRWZXJzaW9ufWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VzOiBgYWN0aW9ucy9zZXR1cC1ub2RlQCR7Z2l0aHViQWN0aW9uc1NldHVwTm9kZVZlcnNpb259YCxcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgJ25vZGUtdmVyc2lvbic6IG5vZGVWZXJzaW9uLFxuICAgICAgICAgICAgICAncmVnaXN0cnktdXJsJzogJ2h0dHBzOi8vbnBtLnBrZy5naXRodWIuY29tJyxcbiAgICAgICAgICAgICAgJ3Njb3BlJzogJ0Ake3sgZ2l0aHViLnJlcG9zaXRvcnlfb3duZXIgfX0nLFxuICAgICAgICAgICAgICAndG9rZW4nOiAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICAgICdpZiBbIC1mIHlhcm4ubG9jayBdOyB0aGVuJyxcbiAgICAgICAgICAgICAgJyAgeWFybiBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlJyxcbiAgICAgICAgICAgICAgJ2VsaWYgWyAtZiBwYWNrYWdlLWxvY2suanNvbiBdOyB0aGVuJyxcbiAgICAgICAgICAgICAgJyAgbnBtIGNpJyxcbiAgICAgICAgICAgICAgJ2Vsc2UnLFxuICAgICAgICAgICAgICAnICBlY2hvIFwiTm8gbG9jayBmaWxlIGZvdW5kICh5YXJuLmxvY2sgb3IgcGFja2FnZS1sb2NrLmpzb24pXCIgJiYgZXhpdCAxJyxcbiAgICAgICAgICAgICAgJ2ZpJyxcbiAgICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgTk9ERV9BVVRIX1RPS0VOOiAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VzOiBgYXdzLWFjdGlvbnMvY29uZmlndXJlLWF3cy1jcmVkZW50aWFsc0Ake2dpdGh1YkFjdGlvbnNBd3NDcmVkZW50aWFsc1ZlcnNpb259YCxcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgJ3JvbGUtdG8tYXNzdW1lJzogc3RhY2sub2lkY1JvbGVBcm4gPz8gZGVmYXVsdE9pZGNSb2xlQXJuLFxuICAgICAgICAgICAgICAnYXdzLXJlZ2lvbic6IHN0YWNrLm9pZGNSZWdpb24gPz8gZGVmYXVsdE9pZGNSZWdpb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogYENyZWF0ZSBDaGFuZ2VzZXQgZm9yICR7c3RhY2suc3RhY2tOYW1lfWAsXG4gICAgICAgICAgICBpZDogJ2NyZWF0ZS1jaGFuZ2VzZXQnLFxuICAgICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICAgICdzZXQgLW8gcGlwZWZhaWwnLFxuICAgICAgICAgICAgICBgeWFybiAke2Nka1lhcm5Db21tYW5kfSBkZXBsb3kgJHtzdGFjay5zdGFja05hbWV9IC0tbm8tZXhlY3V0ZSAtLWNoYW5nZS1zZXQtbmFtZSAke3Nhbml0aXplZFN0YWNrTmFtZX0gLS1yZXF1aXJlLWFwcHJvdmFsIG5ldmVyYCxcbiAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICcjIExvb2sgdXAgcmVhbCBDRiBzdGFjayBuYW1lIGZyb20gY2RrLm91dCBtYW5pZmVzdCAoYXV0aG9yaXRhdGl2ZSBzb3VyY2UpJyxcbiAgICAgICAgICAgICAgJ0NGX1NUQUNLX05BTUU9XCJcIicsXG4gICAgICAgICAgICAgICdmb3IgbWFuaWZlc3QgaW4gY2RrLm91dC8qL21hbmlmZXN0Lmpzb24gY2RrLm91dC9tYW5pZmVzdC5qc29uOyBkbycsXG4gICAgICAgICAgICAgICcgIFsgLWYgXCIkbWFuaWZlc3RcIiBdIHx8IGNvbnRpbnVlJyxcbiAgICAgICAgICAgICAgYCAgbmFtZT0kKGpxIC1yIC0tYXJnIGRwIFwiJHtzdGFjay5zdGFja05hbWV9XCIgXFxcXGAsXG4gICAgICAgICAgICAgICcgICAgXFwnLmFydGlmYWN0cyB8IHRvX2VudHJpZXNbXSB8IHNlbGVjdCgudmFsdWUudHlwZSA9PSBcImF3czpjbG91ZGZvcm1hdGlvbjpzdGFja1wiIGFuZCAudmFsdWUuZGlzcGxheU5hbWUgPT0gJGRwKSB8ICgudmFsdWUucHJvcGVydGllcy5zdGFja05hbWUgLy8gLmtleSlcXCcgXFxcXCcsXG4gICAgICAgICAgICAgICcgICAgXCIkbWFuaWZlc3RcIiknLFxuICAgICAgICAgICAgICAnICBpZiBbIC1uIFwiJG5hbWVcIiBdICYmIFsgXCIkbmFtZVwiICE9IFwibnVsbFwiIF07IHRoZW4nLFxuICAgICAgICAgICAgICAnICAgIENGX1NUQUNLX05BTUU9XCIkbmFtZVwiJyxcbiAgICAgICAgICAgICAgJyAgICBicmVhaycsXG4gICAgICAgICAgICAgICcgIGZpJyxcbiAgICAgICAgICAgICAgJ2RvbmUnLFxuICAgICAgICAgICAgICAnaWYgWyAteiBcIiRDRl9TVEFDS19OQU1FXCIgXTsgdGhlbicsXG4gICAgICAgICAgICAgICcgIGVjaG8gXCJXYXJuaW5nOiBDb3VsZCBub3QgcmVzb2x2ZSBDRiBzdGFjayBuYW1lIGZyb20gY2RrLm91dCwgZmFsbGluZyBiYWNrIHRvIHNhbml0aXplZCBuYW1lXCInLFxuICAgICAgICAgICAgICBgICBDRl9TVEFDS19OQU1FPVwiJHtzYW5pdGl6ZWRTdGFja05hbWV9XCJgLFxuICAgICAgICAgICAgICAnZmknLFxuICAgICAgICAgICAgICAnZWNobyBcImNmLXN0YWNrLW5hbWU9JHtDRl9TVEFDS19OQU1FfVwiID4+IFwiJEdJVEhVQl9PVVRQVVRcIicsXG4gICAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdjcmVkcycsXG4gICAgICAgICAgICB1c2VzOiBgYXdzLWFjdGlvbnMvY29uZmlndXJlLWF3cy1jcmVkZW50aWFsc0Ake2dpdGh1YkFjdGlvbnNBd3NDcmVkZW50aWFsc1ZlcnNpb259YCxcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgJ3JvbGUtdG8tYXNzdW1lJzogc3RhY2sub2lkY1JvbGVBcm4gPz8gZGVmYXVsdE9pZGNSb2xlQXJuLFxuICAgICAgICAgICAgICAnYXdzLXJlZ2lvbic6IHN0YWNrLm9pZGNSZWdpb24gPz8gZGVmYXVsdE9pZGNSZWdpb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0Fzc3VtZSBDbG91ZEZvcm1hdGlvbiBDaGFuZ2VzZXQgUm9sZScsXG4gICAgICAgICAgICBpZDogJ2NoYW5nZXNldC1yb2xlJyxcbiAgICAgICAgICAgIHVzZXM6IGBhd3MtYWN0aW9ucy9jb25maWd1cmUtYXdzLWNyZWRlbnRpYWxzQCR7Z2l0aHViQWN0aW9uc0F3c0NyZWRlbnRpYWxzVmVyc2lvbn1gLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICAncm9sZS10by1hc3N1bWUnOiBzdGFjay5jaGFuZ2VzZXRSb2xlVG9Bc3N1bWVBcm4sXG4gICAgICAgICAgICAgICdyb2xlLWNoYWluaW5nJzogdHJ1ZSxcbiAgICAgICAgICAgICAgJ3JvbGUtc2tpcC1zZXNzaW9uLXRhZ2dpbmcnOiB0cnVlLFxuICAgICAgICAgICAgICAnYXdzLXJlZ2lvbic6IHN0YWNrLmNoYW5nZXNldFJvbGVUb0Fzc3VtZVJlZ2lvbixcbiAgICAgICAgICAgICAgJ2F3cy1hY2Nlc3Mta2V5LWlkJzogJyR7eyBzdGVwcy5jcmVkcy5vdXRwdXRzLmF3cy1hY2Nlc3Mta2V5LWlkIH19JyxcbiAgICAgICAgICAgICAgJ2F3cy1zZWNyZXQtYWNjZXNzLWtleSc6ICcke3sgc3RlcHMuY3JlZHMub3V0cHV0cy5hd3Mtc2VjcmV0LWFjY2Vzcy1rZXkgfX0nLFxuICAgICAgICAgICAgICAnYXdzLXNlc3Npb24tdG9rZW4nOiAnJHt7IHN0ZXBzLmNyZWRzLm91dHB1dHMuYXdzLXNlc3Npb24tdG9rZW4gfX0nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IGBEZXNjcmliZSBjaGFuZ2Ugc2V0IGZvciAke3N0YWNrLnN0YWNrTmFtZX1gLFxuICAgICAgICAgICAgcnVuOiBgbnB4IHRzLW5vZGUgJHtzY3JpcHRPdXRwdXRQYXRofWAsXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgU1RBQ0tfTkFNRTogJyR7eyBzdGVwcy5jcmVhdGUtY2hhbmdlc2V0Lm91dHB1dHMuY2Ytc3RhY2stbmFtZSB9fScsXG4gICAgICAgICAgICAgIENIQU5HRV9TRVRfTkFNRTogc2FuaXRpemVkU3RhY2tOYW1lLFxuICAgICAgICAgICAgICBHSVRIVUJfQ09NTUVOVF9VUkw6ICcke3sgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5jb21tZW50c191cmwgfX0nLFxuICAgICAgICAgICAgICBHSVRIVUJfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IGBEZWxldGUgY2hhbmdlc2V0IGZvciAke3N0YWNrLnN0YWNrTmFtZX1gLFxuICAgICAgICAgICAgcnVuOiBgYXdzIGNsb3VkZm9ybWF0aW9uIGRlbGV0ZS1jaGFuZ2Utc2V0IC0tY2hhbmdlLXNldC1uYW1lICR7c2FuaXRpemVkU3RhY2tOYW1lfSAtLXN0YWNrLW5hbWUgXCJcXCR7eyBzdGVwcy5jcmVhdGUtY2hhbmdlc2V0Lm91dHB1dHMuY2Ytc3RhY2stbmFtZSB9fVwiIC0tcmVnaW9uICR7c3RhY2suY2hhbmdlc2V0Um9sZVRvQXNzdW1lUmVnaW9ufWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplRm9yRmlsZU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5hbWUucmVwbGFjZSgvW15hLXpBLVowLTldKy9nLCAnLScpLnJlcGxhY2UoL14tK3wtKyQvZywgJycpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmV4cG9ydCBjb25zdCBNQVhfQ0ZfSURFTlRJRklFUl9MRU5HVEggPSAxMjg7XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUZvckNsb3VkRm9ybWF0aW9uKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIENsb3VkRm9ybWF0aW9uIHN0YWNrL2NoYW5nZXNldCBuYW1lczogW2EtekEtWl1bLWEtekEtWjAtOV0qLCBtYXggMTI4IGNoYXJzXG4gIGxldCBzYW5pdGl6ZWQgPSBuYW1lLnJlcGxhY2UoL1teYS16QS1aMC05XSsvZywgJy0nKS5yZXBsYWNlKC9eLSt8LSskL2csICcnKTtcbiAgLy8gRW5zdXJlIGl0IHN0YXJ0cyB3aXRoIGEgbGV0dGVyXG4gIGlmICghc2FuaXRpemVkIHx8ICEvXlthLXpBLVpdLy50ZXN0KHNhbml0aXplZCkpIHtcbiAgICBzYW5pdGl6ZWQgPSBgY3MtJHtzYW5pdGl6ZWR9YDtcbiAgfVxuICAvLyBUcnVuY2F0ZSBmcm9tIHRoZSBiZWdpbm5pbmcgdG8ga2VlcCB0aGUgc3RhY2sgbmFtZSAoZW5kKSBpbnRhY3RcbiAgaWYgKHNhbml0aXplZC5sZW5ndGggPiBNQVhfQ0ZfSURFTlRJRklFUl9MRU5HVEgpIHtcbiAgICBzYW5pdGl6ZWQgPSBzYW5pdGl6ZWQuc2xpY2UoLU1BWF9DRl9JREVOVElGSUVSX0xFTkdUSCkucmVwbGFjZSgvXi0rLywgJycpO1xuICAgIC8vIFJlLWNoZWNrIHN0YXJ0cyB3aXRoIGEgbGV0dGVyIGFmdGVyIHRydW5jYXRpb25cbiAgICBpZiAoIS9eW2EtekEtWl0vLnRlc3Qoc2FuaXRpemVkKSkge1xuICAgICAgc2FuaXRpemVkID0gYGNzLSR7c2FuaXRpemVkLnNsaWNlKDAsIE1BWF9DRl9JREVOVElGSUVSX0xFTkdUSCAtIDMpfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBzYW5pdGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkV29ya2Zsb3dOYW1lKHByZWZpeDogc3RyaW5nLCBzYW5pdGl6ZWROYW1lOiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyID0gTUFYX1dPUktGTE9XX0ZJTEVOQU1FX0xFTkdUSCk6IHN0cmluZyB7XG4gIGNvbnN0IGV4dCA9ICcueW1sJztcbiAgY29uc3QgZnVsbCA9IGAke3ByZWZpeH0ke3Nhbml0aXplZE5hbWV9JHtleHR9YDtcbiAgaWYgKGZ1bGwubGVuZ3RoIDw9IG1heExlbmd0aCkge1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHtzYW5pdGl6ZWROYW1lfWA7XG4gIH1cbiAgY29uc3QgYXZhaWxhYmxlID0gbWF4TGVuZ3RoIC0gcHJlZml4Lmxlbmd0aCAtIGV4dC5sZW5ndGg7XG4gIGlmIChhdmFpbGFibGUgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgV29ya2Zsb3cgcHJlZml4IGFuZCBleHRlbnNpb24gZXhjZWVkIG1heGltdW0gZmlsZW5hbWUgbGVuZ3RoIG9mICR7bWF4TGVuZ3RofWApO1xuICB9XG4gIC8vIFRydW5jYXRlIGZyb20gdGhlIGJlZ2lubmluZyB0byBrZWVwIHRoZSBzdGFjayBuYW1lIChlbmQpIGludGFjdFxuICByZXR1cm4gYCR7cHJlZml4fSR7c2FuaXRpemVkTmFtZS5zbGljZSgtYXZhaWxhYmxlKS5yZXBsYWNlKC9eLSsvLCAnJyl9YDtcbn1cbiJdfQ==
|
|
227
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2RrRGlmZlN0YWNrV29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQ2RrRGlmZlN0YWNrV29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQThPQSxrREFFQztBQUlELDhEQWdCQzs7QUFwUUQsOENBQTJEO0FBQzNELHVFQUFrRTtBQUNsRSxxRUFBZ0U7QUFFaEUsTUFBTSxrQ0FBa0MsR0FBRyxJQUFJLENBQUM7QUFDaEQsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLENBQUM7QUFDMUMsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLENBQUM7QUFFM0MsTUFBTSw0QkFBNEIsR0FBRyxHQUFHLENBQUM7QUE2QnpDLE1BQWEsb0JBQW9CO0lBRy9CLFlBQVksS0FBZ0M7UUFDMUMsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUM7UUFDckQsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUM7UUFDaEQsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLElBQUkscURBQXFELENBQUM7UUFFekcsc0RBQXNEO1FBQ3RELE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFcEUsOEJBQThCO1FBQzlCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0Qyw0REFBNEQ7UUFDNUQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hDLElBQUkseUNBQWtCLENBQUM7Z0JBQ3JCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztnQkFD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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2l0SHViLCBHaXRodWJXb3JrZmxvdyB9IGZyb20gJ3Byb2plbi9saWIvZ2l0aHViJztcbmltcG9ydCB7IEpvYlBlcm1pc3Npb24gfSBmcm9tICdwcm9qZW4vbGliL2dpdGh1Yi93b3JrZmxvd3MtbW9kZWwnO1xuaW1wb3J0IHsgQ2RrQ2hhbmdlc2V0U2NyaXB0IH0gZnJvbSAnLi9iaW4vY2RrLWNoYW5nZXNldC1zY3JpcHQnO1xuXG5jb25zdCBnaXRodWJBY3Rpb25zQXdzQ3JlZGVudGlhbHNWZXJzaW9uID0gJ3Y0JztcbmNvbnN0IGdpdGh1YkFjdGlvbnNDaGVja291dFZlcnNpb24gPSAndjQnO1xuY29uc3QgZ2l0aHViQWN0aW9uc1NldHVwTm9kZVZlcnNpb24gPSAndjQnO1xuXG5jb25zdCBNQVhfV09SS0ZMT1dfRklMRU5BTUVfTEVOR1RIID0gMjU1O1xuXG5leHBvcnQgaW50ZXJmYWNlIENka0RpZmZTdGFjayB7XG4gIHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBjaGFuZ2VzZXRSb2xlVG9Bc3N1bWVBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgY2hhbmdlc2V0Um9sZVRvQXNzdW1lUmVnaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9pZGNSb2xlQXJuPzogc3RyaW5nOyAvLyBPcHRpb25hbCBvdmVycmlkZSBmb3IgT0lEQyByb2xlXG4gIHJlYWRvbmx5IG9pZGNSZWdpb24/OiBzdHJpbmc7IC8vIE9wdGlvbmFsIG92ZXJyaWRlIGZvciBPSURDIHJlZ2lvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENka0RpZmZTdGFja1dvcmtmbG93UHJvcHMge1xuICByZWFkb25seSBwcm9qZWN0OiBhbnk7IC8vIGF2b2lkIGV4cG9ydGluZyBwcm9qZW4gdHlwZXMgaW4gcHVibGljIEFQSVxuICByZWFkb25seSBzdGFja3M6IENka0RpZmZTdGFja1tdO1xuICByZWFkb25seSBvaWRjUm9sZUFybj86IHN0cmluZzsgLy8gRGVmYXVsdCBPSURDIHJvbGUgQVJOIGZvciBhbGwgc3RhY2tzIChvciBlYWNoIHN0YWNrIG11c3QgaGF2ZSBpdHMgb3duKVxuICByZWFkb25seSBvaWRjUmVnaW9uPzogc3RyaW5nOyAvLyBEZWZhdWx0IE9JREMgcmVnaW9uIGZvciBhbGwgc3RhY2tzIChvciBlYWNoIHN0YWNrIG11c3QgaGF2ZSBpdHMgb3duKVxuICByZWFkb25seSBub2RlVmVyc2lvbj86IHN0cmluZztcbiAgcmVhZG9ubHkgY2RrWWFybkNvbW1hbmQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNjcmlwdE91dHB1dFBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXb3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIENESyBhcHAsIHJlbGF0aXZlIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QuXG4gICAqIFVzZWZ1bCBmb3IgbW9ub3JlcG9zIHdoZXJlIGluZnJhc3RydWN0dXJlIGxpdmVzIGluIGEgc3ViZGlyZWN0b3J5IChlLmcuLCAnaW5mcmEnKS5cbiAgICpcbiAgICogV2hlbiBzZXQsIGFsbCB3b3JrZmxvdyBydW4gc3RlcHMgd2lsbCB1c2UgYGRlZmF1bHRzLnJ1bi53b3JraW5nLWRpcmVjdG9yeWBcbiAgICogYW5kIHNjcmlwdCBwYXRocyB3aWxsIGJlIGFkanVzdGVkIHRvIHVzZSBhYnNvbHV0ZSByZWZlcmVuY2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHJlcG9zaXRvcnkgcm9vdFxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2luZ0RpcmVjdG9yeT86IHN0cmluZztcbn1cbmV4cG9ydCBjbGFzcyBDZGtEaWZmU3RhY2tXb3JrZmxvdyB7XG4gIHByaXZhdGUgc3RhdGljIHNjcmlwdENyZWF0ZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQ2RrRGlmZlN0YWNrV29ya2Zsb3dQcm9wcykge1xuICAgIGNvbnN0IGNka1lhcm5Db21tYW5kID0gcHJvcHMuY2RrWWFybkNvbW1hbmQgPz8gJ2Nkayc7XG4gICAgY29uc3Qgbm9kZVZlcnNpb24gPSBwcm9wcy5ub2RlVmVyc2lvbiA/PyAnMjQueCc7XG4gICAgY29uc3Qgc2NyaXB0T3V0cHV0UGF0aCA9IHByb3BzLnNjcmlwdE91dHB1dFBhdGggPz8gJy5naXRodWIvd29ya2Zsb3dzL3NjcmlwdHMvZGVzY3JpYmUtY2ZuLWNoYW5nZXNldC50cyc7XG5cbiAgICAvLyBOb3JtYWxpemUgd29ya2luZyBkaXJlY3Rvcnk6IHN0cmlwIHRyYWlsaW5nIHNsYXNoZXNcbiAgICBjb25zdCB3ZCA9IHByb3BzLndvcmtpbmdEaXJlY3Rvcnk/LnJlcGxhY2UoL1xcLyskLywgJycpO1xuICAgIGNvbnN0IGRlZmF1bHRzID0gd2QgPyB7IHJ1bjogeyB3b3JraW5nRGlyZWN0b3J5OiB3ZCB9IH0gOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBWYWxpZGF0ZSBPSURDIGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLnZhbGlkYXRlT2lkY0NvbmZpZ3VyYXRpb24ocHJvcHMpO1xuXG4gICAgLy8gT25seSBjcmVhdGUgdGhlIGNoYW5nZXNldCBzY3JpcHQgb25jZSB0byBhdm9pZCBjb2xsaXNpb25zXG4gICAgaWYgKCFDZGtEaWZmU3RhY2tXb3JrZmxvdy5zY3JpcHRDcmVhdGVkKSB7XG4gICAgICBuZXcgQ2RrQ2hhbmdlc2V0U2NyaXB0KHtcbiAgICAgICAgcHJvamVjdDogcHJvcHMucHJvamVjdCxcbiAgICAgICAgb3V0cHV0UGF0aDogc2NyaXB0T3V0cHV0UGF0aCxcbiAgICAgIH0pO1xuICAgICAgQ2RrRGlmZlN0YWNrV29ya2Zsb3cuc2NyaXB0Q3JlYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgc2VwYXJhdGUgd29ya2Zsb3cgZm9yIGVhY2ggc3RhY2tcbiAgICBmb3IgKGNvbnN0IHN0YWNrIG9mIHByb3BzLnN0YWNrcykge1xuICAgICAgY29uc3Qgc2FuaXRpemVkU3RhY2tOYW1lID0gc2FuaXRpemVGb3JGaWxlTmFtZShzdGFjay5zdGFja05hbWUpO1xuICAgICAgY29uc3Qgd29ya2Zsb3dOYW1lID0gYnVpbGRXb3JrZmxvd05hbWUoJ2RpZmYtJywgc2FuaXRpemVkU3RhY2tOYW1lKTtcbiAgICAgIGNvbnN0IGZpbGVOYW1lID0gYCR7d29ya2Zsb3dOYW1lfS55bWxgO1xuICAgICAgY29uc3QgZ2ggPSAocHJvcHMgYXMgYW55KS5wcm9qZWN0LmdpdGh1YiA/PyBuZXcgR2l0SHViKChwcm9wcyBhcyBhbnkpLnByb2plY3QpO1xuICAgICAgY29uc3QgZGlmZkRlcGxveVdvcmtmbG93ID0gbmV3IEdpdGh1YldvcmtmbG93KGdoLCB3b3JrZmxvd05hbWUsIHsgZmlsZU5hbWUgfSk7XG5cbiAgICAgIHRoaXMuY3JlYXRlV29ya2Zsb3dGb3JTdGFjayhcbiAgICAgICAgZGlmZkRlcGxveVdvcmtmbG93LCBzdGFjaywgY2RrWWFybkNvbW1hbmQsIG5vZGVWZXJzaW9uLFxuICAgICAgICBzY3JpcHRPdXRwdXRQYXRoLCBkZWZhdWx0cywgcHJvcHMub2lkY1JvbGVBcm4sIHByb3BzLm9pZGNSZWdpb24sXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVPaWRjQ29uZmlndXJhdGlvbihwcm9wczogQ2RrRGlmZlN0YWNrV29ya2Zsb3dQcm9wcyk6IHZvaWQge1xuICAgIGNvbnN0IGhhc0RlZmF1bHRPaWRjUm9sZSA9ICEhcHJvcHMub2lkY1JvbGVBcm47XG4gICAgY29uc3QgaGFzRGVmYXVsdE9pZGNSZWdpb24gPSAhIXByb3BzLm9pZGNSZWdpb247XG5cbiAgICAvLyBDaGVjayBpZiBhbGwgc3RhY2tzIGhhdmUgdGhlaXIgb3duIE9JREMgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGFsbFN0YWNrc0hhdmVPaWRjUm9sZSA9IHByb3BzLnN0YWNrcy5ldmVyeShzdGFjayA9PiAhIXN0YWNrLm9pZGNSb2xlQXJuKTtcbiAgICBjb25zdCBhbGxTdGFja3NIYXZlT2lkY1JlZ2lvbiA9IHByb3BzLnN0YWNrcy5ldmVyeShzdGFjayA9PiAhIXN0YWNrLm9pZGNSZWdpb24pO1xuXG4gICAgLy8gRWl0aGVyIGRlZmF1bHRzIG11c3QgYmUgcHJvdmlkZWQgT1IgYWxsIHN0YWNrcyBtdXN0IGhhdmUgdGhlaXIgb3duIE9JREMgY29uZmlnXG4gICAgaWYgKCFoYXNEZWZhdWx0T2lkY1JvbGUgJiYgIWFsbFN0YWNrc0hhdmVPaWRjUm9sZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFaXRoZXIgcHJvdmlkZSBkZWZhdWx0IG9pZGNSb2xlQXJuIG9yIHNwZWNpZnkgb2lkY1JvbGVBcm4gZm9yIGVhY2ggc3RhY2snKTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0RlZmF1bHRPaWRjUmVnaW9uICYmICFhbGxTdGFja3NIYXZlT2lkY1JlZ2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFaXRoZXIgcHJvdmlkZSBkZWZhdWx0IG9pZGNSZWdpb24gb3Igc3BlY2lmeSBvaWRjUmVnaW9uIGZvciBlYWNoIHN0YWNrJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVXb3JrZmxvd0ZvclN0YWNrKFxuICAgIHdvcmtmbG93OiBHaXRodWJXb3JrZmxvdyxcbiAgICBzdGFjazogQ2RrRGlmZlN0YWNrLFxuICAgIGNka1lhcm5Db21tYW5kOiBzdHJpbmcsXG4gICAgbm9kZVZlcnNpb246IHN0cmluZyxcbiAgICBzY3JpcHRPdXRwdXRQYXRoOiBzdHJpbmcsXG4gICAgZGVmYXVsdHM6IHsgcnVuOiB7IHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZyB9IH0gfCB1bmRlZmluZWQsXG4gICAgZGVmYXVsdE9pZGNSb2xlQXJuPzogc3RyaW5nLFxuICAgIGRlZmF1bHRPaWRjUmVnaW9uPzogc3RyaW5nLFxuICApIHtcbiAgICAvLyBTYW5pdGl6ZSBzdGFjayBuYW1lIGZvciBDbG91ZEZvcm1hdGlvbiBBUEkgY2FsbHMgKG11c3QgbWF0Y2ggW2EtekEtWl1bLWEtekEtWjAtOV0qLCBtYXggMTI4IGNoYXJzKVxuICAgIC8vIE9yaWdpbmFsIHN0YWNrLnN0YWNrTmFtZSBpcyBwcmVzZXJ2ZWQgb25seSBmb3IgdGhlIENESyBkZXBsb3kgdGFyZ2V0IGFuZCBzdGVwIGRpc3BsYXkgbmFtZXNcbiAgICBjb25zdCBzYW5pdGl6ZWRTdGFja05hbWUgPSBzYW5pdGl6ZUZvckNsb3VkRm9ybWF0aW9uKHN0YWNrLnN0YWNrTmFtZSk7XG5cbiAgICAvLyBXaGVuIHdvcmtpbmcgZGlyZWN0b3J5IGlzIHNldCwgdGhlIGRlc2NyaWJlLWNoYW5nZXNldCBzdGVwIG92ZXJyaWRlcyBiYWNrIHRvIHJlcG8gcm9vdFxuICAgIC8vIGJlY2F1c2UgdGhlIHNjcmlwdCBuZWVkcyByb290LWxldmVsIHRzLW5vZGUsIHRzY29uZmlnLmpzb24sIGFuZCBub2RlX21vZHVsZXMgKGUuZy4gQGF3cy1zZGspXG5cbiAgICB3b3JrZmxvdy5vbih7XG4gICAgICBwdWxsUmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnc3luY2hyb25pemUnLCAncmVvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgd29ya2Zsb3cuYWRkSm9icyh7XG4gICAgICBkaWZmOiB7XG4gICAgICAgIHJ1bnNPbjogWyd1YnVudHUtbGF0ZXN0J10sXG4gICAgICAgIC4uLihkZWZhdWx0cyAmJiB7IGRlZmF1bHRzIH0pLFxuICAgICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICAgIGlkVG9rZW46IEpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICAgICAgY29udGVudHM6IEpvYlBlcm1pc3Npb24uUkVBRCxcbiAgICAgICAgICBpc3N1ZXM6IEpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICAgICAgcHVsbFJlcXVlc3RzOiBKb2JQZXJtaXNzaW9uLldSSVRFLFxuICAgICAgICAgIHBhY2thZ2VzOiBKb2JQZXJtaXNzaW9uLlJFQUQsXG4gICAgICAgIH0sXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScsXG4gICAgICAgIH0sXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXNlczogYGFjdGlvbnMvY2hlY2tvdXRAJHtnaXRodWJBY3Rpb25zQ2hlY2tvdXRWZXJzaW9ufWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VzOiBgYWN0aW9ucy9zZXR1cC1ub2RlQCR7Z2l0aHViQWN0aW9uc1NldHVwTm9kZVZlcnNpb259YCxcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgJ25vZGUtdmVyc2lvbic6IG5vZGVWZXJzaW9uLFxuICAgICAgICAgICAgICAncmVnaXN0cnktdXJsJzogJ2h0dHBzOi8vbnBtLnBrZy5naXRodWIuY29tJyxcbiAgICAgICAgICAgICAgJ3Njb3BlJzogJ0Ake3sgZ2l0aHViLnJlcG9zaXRvcnlfb3duZXIgfX0nLFxuICAgICAgICAgICAgICAndG9rZW4nOiAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICAgICdpZiBbIC1mIHlhcm4ubG9jayBdOyB0aGVuJyxcbiAgICAgICAgICAgICAgJyAgeWFybiBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlJyxcbiAgICAgICAgICAgICAgJ2VsaWYgWyAtZiBwYWNrYWdlLWxvY2suanNvbiBdOyB0aGVuJyxcbiAgICAgICAgICAgICAgJyAgbnBtIGNpJyxcbiAgICAgICAgICAgICAgJ2Vsc2UnLFxuICAgICAgICAgICAgICAnICBlY2hvIFwiTm8gbG9jayBmaWxlIGZvdW5kICh5YXJuLmxvY2sgb3IgcGFja2FnZS1sb2NrLmpzb24pXCIgJiYgZXhpdCAxJyxcbiAgICAgICAgICAgICAgJ2ZpJyxcbiAgICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgTk9ERV9BVVRIX1RPS0VOOiAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VzOiBgYXdzLWFjdGlvbnMvY29uZmlndXJlLWF3cy1jcmVkZW50aWFsc0Ake2dpdGh1YkFjdGlvbnNBd3NDcmVkZW50aWFsc1ZlcnNpb259YCxcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgJ3JvbGUtdG8tYXNzdW1lJzogc3RhY2sub2lkY1JvbGVBcm4gPz8gZGVmYXVsdE9pZGNSb2xlQXJuLFxuICAgICAgICAgICAgICAnYXdzLXJlZ2lvbic6IHN0YWNrLm9pZGNSZWdpb24gPz8gZGVmYXVsdE9pZGNSZWdpb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogYENyZWF0ZSBDaGFuZ2VzZXQgZm9yICR7c3RhY2suc3RhY2tOYW1lfWAsXG4gICAgICAgICAgICBpZDogJ2NyZWF0ZS1jaGFuZ2VzZXQnLFxuICAgICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICAgICdzZXQgLW8gcGlwZWZhaWwnLFxuICAgICAgICAgICAgICBgeWFybiAke2Nka1lhcm5Db21tYW5kfSBkZXBsb3kgJHtzdGFjay5zdGFja05hbWV9IC0tbm8tZXhlY3V0ZSAtLWNoYW5nZS1zZXQtbmFtZSAke3Nhbml0aXplZFN0YWNrTmFtZX0gLS1yZXF1aXJlLWFwcHJvdmFsIG5ldmVyYCxcbiAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICcjIExvb2sgdXAgcmVhbCBDRiBzdGFjayBuYW1lIGZyb20gY2RrLm91dCBtYW5pZmVzdCAoYXV0aG9yaXRhdGl2ZSBzb3VyY2UpJyxcbiAgICAgICAgICAgICAgJ0NGX1NUQUNLX05BTUU9XCJcIicsXG4gICAgICAgICAgICAgICdmb3IgbWFuaWZlc3QgaW4gY2RrLm91dC8qL21hbmlmZXN0Lmpzb24gY2RrLm91dC9tYW5pZmVzdC5qc29uOyBkbycsXG4gICAgICAgICAgICAgICcgIFsgLWYgXCIkbWFuaWZlc3RcIiBdIHx8IGNvbnRpbnVlJyxcbiAgICAgICAgICAgICAgYCAgbmFtZT0kKGpxIC1yIC0tYXJnIGRwIFwiJHtzdGFjay5zdGFja05hbWV9XCIgXFxcXGAsXG4gICAgICAgICAgICAgICcgICAgXFwnLmFydGlmYWN0cyB8IHRvX2VudHJpZXNbXSB8IHNlbGVjdCgudmFsdWUudHlwZSA9PSBcImF3czpjbG91ZGZvcm1hdGlvbjpzdGFja1wiIGFuZCAudmFsdWUuZGlzcGxheU5hbWUgPT0gJGRwKSB8ICgudmFsdWUucHJvcGVydGllcy5zdGFja05hbWUgLy8gLmtleSlcXCcgXFxcXCcsXG4gICAgICAgICAgICAgICcgICAgXCIkbWFuaWZlc3RcIiknLFxuICAgICAgICAgICAgICAnICBpZiBbIC1uIFwiJG5hbWVcIiBdICYmIFsgXCIkbmFtZVwiICE9IFwibnVsbFwiIF07IHRoZW4nLFxuICAgICAgICAgICAgICAnICAgIENGX1NUQUNLX05BTUU9XCIkbmFtZVwiJyxcbiAgICAgICAgICAgICAgJyAgICBicmVhaycsXG4gICAgICAgICAgICAgICcgIGZpJyxcbiAgICAgICAgICAgICAgJ2RvbmUnLFxuICAgICAgICAgICAgICAnaWYgWyAteiBcIiRDRl9TVEFDS19OQU1FXCIgXTsgdGhlbicsXG4gICAgICAgICAgICAgICcgIGVjaG8gXCJXYXJuaW5nOiBDb3VsZCBub3QgcmVzb2x2ZSBDRiBzdGFjayBuYW1lIGZyb20gY2RrLm91dCwgZmFsbGluZyBiYWNrIHRvIHNhbml0aXplZCBuYW1lXCInLFxuICAgICAgICAgICAgICBgICBDRl9TVEFDS19OQU1FPVwiJHtzYW5pdGl6ZWRTdGFja05hbWV9XCJgLFxuICAgICAgICAgICAgICAnZmknLFxuICAgICAgICAgICAgICAnZWNobyBcImNmLXN0YWNrLW5hbWU9JHtDRl9TVEFDS19OQU1FfVwiID4+IFwiJEdJVEhVQl9PVVRQVVRcIicsXG4gICAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdjcmVkcycsXG4gICAgICAgICAgICB1c2VzOiBgYXdzLWFjdGlvbnMvY29uZmlndXJlLWF3cy1jcmVkZW50aWFsc0Ake2dpdGh1YkFjdGlvbnNBd3NDcmVkZW50aWFsc1ZlcnNpb259YCxcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgJ3JvbGUtdG8tYXNzdW1lJzogc3RhY2sub2lkY1JvbGVBcm4gPz8gZGVmYXVsdE9pZGNSb2xlQXJuLFxuICAgICAgICAgICAgICAnYXdzLXJlZ2lvbic6IHN0YWNrLm9pZGNSZWdpb24gPz8gZGVmYXVsdE9pZGNSZWdpb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0Fzc3VtZSBDbG91ZEZvcm1hdGlvbiBDaGFuZ2VzZXQgUm9sZScsXG4gICAgICAgICAgICBpZDogJ2NoYW5nZXNldC1yb2xlJyxcbiAgICAgICAgICAgIHVzZXM6IGBhd3MtYWN0aW9ucy9jb25maWd1cmUtYXdzLWNyZWRlbnRpYWxzQCR7Z2l0aHViQWN0aW9uc0F3c0NyZWRlbnRpYWxzVmVyc2lvbn1gLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICAncm9sZS10by1hc3N1bWUnOiBzdGFjay5jaGFuZ2VzZXRSb2xlVG9Bc3N1bWVBcm4sXG4gICAgICAgICAgICAgICdyb2xlLWNoYWluaW5nJzogdHJ1ZSxcbiAgICAgICAgICAgICAgJ3JvbGUtc2tpcC1zZXNzaW9uLXRhZ2dpbmcnOiB0cnVlLFxuICAgICAgICAgICAgICAnYXdzLXJlZ2lvbic6IHN0YWNrLmNoYW5nZXNldFJvbGVUb0Fzc3VtZVJlZ2lvbixcbiAgICAgICAgICAgICAgJ2F3cy1hY2Nlc3Mta2V5LWlkJzogJyR7eyBzdGVwcy5jcmVkcy5vdXRwdXRzLmF3cy1hY2Nlc3Mta2V5LWlkIH19JyxcbiAgICAgICAgICAgICAgJ2F3cy1zZWNyZXQtYWNjZXNzLWtleSc6ICcke3sgc3RlcHMuY3JlZHMub3V0cHV0cy5hd3Mtc2VjcmV0LWFjY2Vzcy1rZXkgfX0nLFxuICAgICAgICAgICAgICAnYXdzLXNlc3Npb24tdG9rZW4nOiAnJHt7IHN0ZXBzLmNyZWRzLm91dHB1dHMuYXdzLXNlc3Npb24tdG9rZW4gfX0nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IGBEZXNjcmliZSBjaGFuZ2Ugc2V0IGZvciAke3N0YWNrLnN0YWNrTmFtZX1gLFxuICAgICAgICAgICAgcnVuOiBkZWZhdWx0c1xuICAgICAgICAgICAgICA/IGBucHggdHMtbm9kZSAtLXRyYW5zcGlsZS1vbmx5IFxcJEdJVEhVQl9XT1JLU1BBQ0UvJHtzY3JpcHRPdXRwdXRQYXRofWBcbiAgICAgICAgICAgICAgOiBgbnB4IHRzLW5vZGUgJHtzY3JpcHRPdXRwdXRQYXRofWAsXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgLi4uKGRlZmF1bHRzICYmIHtcbiAgICAgICAgICAgICAgICBOT0RFX1BBVEg6IGBcXCR7eyBnaXRodWIud29ya3NwYWNlIH19LyR7ZGVmYXVsdHMucnVuLndvcmtpbmdEaXJlY3Rvcnl9L25vZGVfbW9kdWxlc2AsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBTVEFDS19OQU1FOiAnJHt7IHN0ZXBzLmNyZWF0ZS1jaGFuZ2VzZXQub3V0cHV0cy5jZi1zdGFjay1uYW1lIH19JyxcbiAgICAgICAgICAgICAgQ0hBTkdFX1NFVF9OQU1FOiBzYW5pdGl6ZWRTdGFja05hbWUsXG4gICAgICAgICAgICAgIEdJVEhVQl9DT01NRU5UX1VSTDogJyR7eyBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmNvbW1lbnRzX3VybCB9fScsXG4gICAgICAgICAgICAgIEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogYERlbGV0ZSBjaGFuZ2VzZXQgZm9yICR7c3RhY2suc3RhY2tOYW1lfWAsXG4gICAgICAgICAgICBydW46IGBhd3MgY2xvdWRmb3JtYXRpb24gZGVsZXRlLWNoYW5nZS1zZXQgLS1jaGFuZ2Utc2V0LW5hbWUgJHtzYW5pdGl6ZWRTdGFja05hbWV9IC0tc3RhY2stbmFtZSBcIlxcJHt7IHN0ZXBzLmNyZWF0ZS1jaGFuZ2VzZXQub3V0cHV0cy5jZi1zdGFjay1uYW1lIH19XCIgLS1yZWdpb24gJHtzdGFjay5jaGFuZ2VzZXRSb2xlVG9Bc3N1bWVSZWdpb259YCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVGb3JGaWxlTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOV0rL2csICctJykucmVwbGFjZSgvXi0rfC0rJC9nLCAnJykudG9Mb3dlckNhc2UoKTtcbn1cblxuZXhwb3J0IGNvbnN0IE1BWF9DRl9JREVOVElGSUVSX0xFTkdUSCA9IDEyODtcblxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplRm9yQ2xvdWRGb3JtYXRpb24obmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQ2xvdWRGb3JtYXRpb24gc3RhY2svY2hhbmdlc2V0IG5hbWVzOiBbYS16QS1aXVstYS16QS1aMC05XSosIG1heCAxMjggY2hhcnNcbiAgbGV0IHNhbml0aXplZCA9IG5hbWUucmVwbGFjZSgvW15hLXpBLVowLTldKy9nLCAnLScpLnJlcGxhY2UoL14tK3wtKyQvZywgJycpO1xuICAvLyBFbnN1cmUgaXQgc3RhcnRzIHdpdGggYSBsZXR0ZXJcbiAgaWYgKCFzYW5pdGl6ZWQgfHwgIS9eW2EtekEtWl0vLnRlc3Qoc2FuaXRpemVkKSkge1xuICAgIHNhbml0aXplZCA9IGBjcy0ke3Nhbml0aXplZH1gO1xuICB9XG4gIC8vIFRydW5jYXRlIGZyb20gdGhlIGJlZ2lubmluZyB0byBrZWVwIHRoZSBzdGFjayBuYW1lIChlbmQpIGludGFjdFxuICBpZiAoc2FuaXRpemVkLmxlbmd0aCA+IE1BWF9DRl9JREVOVElGSUVSX0xFTkdUSCkge1xuICAgIHNhbml0aXplZCA9IHNhbml0aXplZC5zbGljZSgtTUFYX0NGX0lERU5USUZJRVJfTEVOR1RIKS5yZXBsYWNlKC9eLSsvLCAnJyk7XG4gICAgLy8gUmUtY2hlY2sgc3RhcnRzIHdpdGggYSBsZXR0ZXIgYWZ0ZXIgdHJ1bmNhdGlvblxuICAgIGlmICghL15bYS16QS1aXS8udGVzdChzYW5pdGl6ZWQpKSB7XG4gICAgICBzYW5pdGl6ZWQgPSBgY3MtJHtzYW5pdGl6ZWQuc2xpY2UoMCwgTUFYX0NGX0lERU5USUZJRVJfTEVOR1RIIC0gMyl9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNhbml0aXplZDtcbn1cblxuZnVuY3Rpb24gYnVpbGRXb3JrZmxvd05hbWUocHJlZml4OiBzdHJpbmcsIHNhbml0aXplZE5hbWU6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIgPSBNQVhfV09SS0ZMT1dfRklMRU5BTUVfTEVOR1RIKTogc3RyaW5nIHtcbiAgY29uc3QgZXh0ID0gJy55bWwnO1xuICBjb25zdCBmdWxsID0gYCR7cHJlZml4fSR7c2FuaXRpemVkTmFtZX0ke2V4dH1gO1xuICBpZiAoZnVsbC5sZW5ndGggPD0gbWF4TGVuZ3RoKSB7XG4gICAgcmV0dXJuIGAke3ByZWZpeH0ke3Nhbml0aXplZE5hbWV9YDtcbiAgfVxuICBjb25zdCBhdmFpbGFibGUgPSBtYXhMZW5ndGggLSBwcmVmaXgubGVuZ3RoIC0gZXh0Lmxlbmd0aDtcbiAgaWYgKGF2YWlsYWJsZSA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBXb3JrZmxvdyBwcmVmaXggYW5kIGV4dGVuc2lvbiBleGNlZWQgbWF4aW11bSBmaWxlbmFtZSBsZW5ndGggb2YgJHttYXhMZW5ndGh9YCk7XG4gIH1cbiAgLy8gVHJ1bmNhdGUgZnJvbSB0aGUgYmVnaW5uaW5nIHRvIGtlZXAgdGhlIHN0YWNrIG5hbWUgKGVuZCkgaW50YWN0XG4gIHJldHVybiBgJHtwcmVmaXh9JHtzYW5pdGl6ZWROYW1lLnNsaWNlKC1hdmFpbGFibGUpLnJlcGxhY2UoL14tKy8sICcnKX1gO1xufVxuIl19
|
|
@@ -16,6 +16,16 @@ export interface CdkDriftDetectionWorkflowProps {
|
|
|
16
16
|
readonly oidcRegion?: string;
|
|
17
17
|
readonly stacks: Stack[];
|
|
18
18
|
readonly nodeVersion?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Working directory for the CDK app, relative to the repository root.
|
|
21
|
+
* Useful for monorepos where infrastructure lives in a subdirectory (e.g., 'infra').
|
|
22
|
+
*
|
|
23
|
+
* When set, all workflow run steps will use `defaults.run.working-directory`
|
|
24
|
+
* and artifact/script paths will be adjusted accordingly.
|
|
25
|
+
*
|
|
26
|
+
* @default - repository root
|
|
27
|
+
*/
|
|
28
|
+
readonly workingDirectory?: string;
|
|
19
29
|
/**
|
|
20
30
|
* Optional hook to append additional GitHub Actions steps after drift detection per stack.
|
|
21
31
|
* You can supply a static array of steps, or a factory that receives context and returns steps.
|
|
@@ -23,6 +23,9 @@ class CdkDriftDetectionWorkflow {
|
|
|
23
23
|
const createIssues = props.createIssues ?? true;
|
|
24
24
|
const project = props.project;
|
|
25
25
|
const scriptOutputPath = props.scriptOutputPath ?? '.github/workflows/scripts/detect-drift.ts';
|
|
26
|
+
// Normalize working directory: strip trailing slashes
|
|
27
|
+
const wd = props.workingDirectory?.replace(/\/+$/, '');
|
|
28
|
+
const defaults = wd ? { run: { workingDirectory: wd } } : undefined;
|
|
26
29
|
// Only create the drift detection script once to avoid collisions
|
|
27
30
|
if (!CdkDriftDetectionWorkflow.scriptCreated) {
|
|
28
31
|
new cdk_drift_detection_script_1.CdkDriftDetectionScript({
|
|
@@ -60,9 +63,13 @@ class CdkDriftDetectionWorkflow {
|
|
|
60
63
|
const notCondExpr = '${{ !(' + innerCond + ') }}';
|
|
61
64
|
const rawPost = props.postGitHubSteps;
|
|
62
65
|
const postSteps = typeof rawPost === 'function' ? rawPost({ stack: sanitizedStackName }) : (rawPost ?? []);
|
|
66
|
+
// Prefix results file path for uses: steps (which ignore defaults.run.working-directory)
|
|
67
|
+
const artifactResultsPath = wd ? `${wd}/${resultsFile}` : resultsFile;
|
|
68
|
+
const issueResultsPath = wd ? `${wd}/${resultsFile}` : resultsFile;
|
|
63
69
|
jobs[jobId] = {
|
|
64
70
|
name: `Drift Detection - ${sanitizedStackName}`,
|
|
65
71
|
runsOn: ['ubuntu-latest'],
|
|
72
|
+
...(defaults && { defaults }),
|
|
66
73
|
permissions: {
|
|
67
74
|
contents: workflows_model_1.JobPermission.READ,
|
|
68
75
|
idToken: workflows_model_1.JobPermission.WRITE,
|
|
@@ -137,7 +144,7 @@ class CdkDriftDetectionWorkflow {
|
|
|
137
144
|
name: 'Upload results',
|
|
138
145
|
if: condExpr,
|
|
139
146
|
uses: `actions/upload-artifact@${githubActionsUploadArtifactVersion}`,
|
|
140
|
-
with: { 'name': `drift-results-${sanitizedStackName}`, 'path':
|
|
147
|
+
with: { 'name': `drift-results-${sanitizedStackName}`, 'path': artifactResultsPath, 'if-no-files-found': 'ignore' },
|
|
141
148
|
},
|
|
142
149
|
...(createIssues
|
|
143
150
|
? [
|
|
@@ -146,7 +153,7 @@ class CdkDriftDetectionWorkflow {
|
|
|
146
153
|
if: "always() && steps.drift.outcome == 'failure'",
|
|
147
154
|
id: 'issue',
|
|
148
155
|
uses: `actions/github-script@${githubActionsGithubScriptVersion}`,
|
|
149
|
-
with: { 'result-encoding': 'string', 'script': issueScript(sanitizedStackName, stack.driftDetectionRoleToAssumeRegion,
|
|
156
|
+
with: { 'result-encoding': 'string', 'script': issueScript(sanitizedStackName, stack.driftDetectionRoleToAssumeRegion, issueResultsPath) },
|
|
150
157
|
},
|
|
151
158
|
]
|
|
152
159
|
: []),
|
|
@@ -193,7 +200,7 @@ class CdkDriftDetectionWorkflow {
|
|
|
193
200
|
}
|
|
194
201
|
exports.CdkDriftDetectionWorkflow = CdkDriftDetectionWorkflow;
|
|
195
202
|
_a = JSII_RTTI_SYMBOL_1;
|
|
196
|
-
CdkDriftDetectionWorkflow[_a] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDriftDetectionWorkflow", version: "1.
|
|
203
|
+
CdkDriftDetectionWorkflow[_a] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDriftDetectionWorkflow", version: "1.8.0" };
|
|
197
204
|
CdkDriftDetectionWorkflow.scriptCreated = false;
|
|
198
205
|
function issueScript(stack, region, resultsFile) {
|
|
199
206
|
// Construct a plain JS script string (no template string nesting mishaps)
|
|
@@ -307,4 +314,4 @@ function toGithubJobId(s) {
|
|
|
307
314
|
}
|
|
308
315
|
return out;
|
|
309
316
|
}
|
|
310
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2RrRHJpZnREZXRlY3Rpb25Xb3JrZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9DZGtEcmlmdERldGVjdGlvbldvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOENBQTJEO0FBQzNELHVFQUFrRTtBQUNsRSxpRkFBMkU7QUFFM0UsTUFBTSxrQ0FBa0MsR0FBRyxJQUFJLENBQUM7QUFDaEQsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLENBQUM7QUFDMUMsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLENBQUM7QUFDM0MsTUFBTSxrQ0FBa0MsR0FBRyxJQUFJLENBQUM7QUFDaEQsTUFBTSxvQ0FBb0MsR0FBRyxJQUFJLENBQUM7QUFDbEQsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFJLENBQUM7QUFFOUMsTUFBTSw0QkFBNEIsR0FBRyxHQUFHLENBQUM7QUFrRHpDLE1BQWEseUJBQXlCO0lBR3BDLFlBQVksS0FBcUM7UUFDL0MsOEJBQThCO1FBQzlCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLGlCQUFpQixDQUFDO1FBQ3JELE1BQU0sUUFBUSxHQUFHLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzFELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDO1FBQ2hELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDO1FBQ2hELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDOUIsTUFBTSxnQkFBZ0IsR0FBRSxLQUFLLENBQUMsZ0JBQWdCLElBQUksMkNBQTJDLENBQUM7UUFFOUYsa0VBQWtFO1FBQ2xFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM3QyxJQUFJLG9EQUF1QixDQUFD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a0Q7SUFDbEQsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxHQUFHLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2l0SHViLCBHaXRodWJXb3JrZmxvdyB9IGZyb20gJ3Byb2plbi9saWIvZ2l0aHViJztcbmltcG9ydCB7IEpvYlBlcm1pc3Npb24gfSBmcm9tICdwcm9qZW4vbGliL2dpdGh1Yi93b3JrZmxvd3MtbW9kZWwnO1xuaW1wb3J0IHsgQ2RrRHJpZnREZXRlY3Rpb25TY3JpcHQgfSBmcm9tICcuL2Jpbi9jZGstZHJpZnQtZGV0ZWN0aW9uLXNjcmlwdCc7XG5cbmNvbnN0IGdpdGh1YkFjdGlvbnNBd3NDcmVkZW50aWFsc1ZlcnNpb24gPSAndjUnO1xuY29uc3QgZ2l0aHViQWN0aW9uc0NoZWNrb3V0VmVyc2lvbiA9ICd2NSc7XG5jb25zdCBnaXRodWJBY3Rpb25zU2V0dXBOb2RlVmVyc2lvbiA9ICd2NSc7XG5jb25zdCBnaXRodWJBY3Rpb25zVXBsb2FkQXJ0aWZhY3RWZXJzaW9uID0gJ3Y0JztcbmNvbnN0IGdpdGh1YkFjdGlvbnNEb3dubG9hZEFydGlmYWN0VmVyc2lvbiA9ICd2NSc7XG5jb25zdCBnaXRodWJBY3Rpb25zR2l0aHViU2NyaXB0VmVyc2lvbiA9ICd2OCc7XG5cbmNvbnN0IE1BWF9XT1JLRkxPV19GSUxFTkFNRV9MRU5HVEggPSAyNTU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2sge1xuICByZWFkb25seSBzdGFja05hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZHJpZnREZXRlY3Rpb25Sb2xlVG9Bc3N1bWVSZWdpb246IHN0cmluZztcbiAgcmVhZG9ubHkgZHJpZnREZXRlY3Rpb25Sb2xlVG9Bc3N1bWVBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgZmFpbE9uRHJpZnQ/OiBib29sZWFuOyAvLyBpZiB0cnVlLCBmYWlsIGpvYiB3aGVuIGRyaWZ0IGRldGVjdGVkIChkZWZhdWx0IHRydWUpXG4gIHJlYWRvbmx5IG9pZGNSb2xlQXJuPzogc3RyaW5nOyAvLyBPcHRpb25hbCBvdmVycmlkZSBmb3IgT0lEQyByb2xlXG4gIHJlYWRvbmx5IG9pZGNSZWdpb24/OiBzdHJpbmc7IC8vIE9wdGlvbmFsIG92ZXJyaWRlIGZvciBPSURDIHJlZ2lvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENka0RyaWZ0RGV0ZWN0aW9uV29ya2Zsb3dQcm9wcyB7XG4gIHJlYWRvbmx5IHNjcmlwdE91dHB1dFBhdGg/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByb2plY3Q6IGFueTsgLy8gYXZvaWQgZXhwb3J0aW5nIHByb2plbiB0eXBlcyBpbiBwdWJsaWMgQVBJXG4gIHJlYWRvbmx5IHdvcmtmbG93TmFtZT86IHN0cmluZzsgLy8gd29ya2Zsb3cgd29ya2Zsb3dOYW1lIChhbHNvIHVzZWQgdG8gZGVyaXZlIGZpbGUgd29ya2Zsb3dOYW1lKVxuICByZWFkb25seSBzY2hlZHVsZT86IHN0cmluZzsgLy8gY3JvbiBleHByZXNzaW9uLCBlLmcuICcwIDAgKiAqIConXG4gIHJlYWRvbmx5IGNyZWF0ZUlzc3Vlcz86IGJvb2xlYW47IC8vIGNyZWF0ZS91cGRhdGUgaXNzdWUgd2hlbiBkcmlmdCBkZXRlY3RlZCBvbiBzY2hlZHVsZSAoZGVmYXVsdCB0cnVlKVxuICByZWFkb25seSBvaWRjUm9sZUFybj86IHN0cmluZzsgLy8gZGVmYXVsdCBPSURDIHJvbGUgQVJOIHRvIGFzc3VtZSBmb3IgYWxsIHN0YWNrcyAob3IgZWFjaCBzdGFjayBtdXN0IGhhdmUgaXRzIG93bilcbiAgcmVhZG9ubHkgb2lkY1JlZ2lvbj86IHN0cmluZzsgLy8gZGVmYXVsdCBPSURDIHJlZ2lvbiB0byBhc3N1bWUgZm9yIGFsbCBzdGFja3MgKG9yIGVhY2ggc3RhY2sgbXVzdCBoYXZlIGl0cyBvd24pXG4gIHJlYWRvbmx5IHN0YWNrczogU3RhY2tbXTtcbiAgcmVhZG9ubHkgbm9kZVZlcnNpb24/OiBzdHJpbmc7IC8vIGUuZy4sICcyNC54J1xuICAvKipcbiAgICogT3B0aW9uYWwgaG9vayB0byBhcHBlbmQgYWRkaXRpb25hbCBHaXRIdWIgQWN0aW9ucyBzdGVwcyBhZnRlciBkcmlmdCBkZXRlY3Rpb24gcGVyIHN0YWNrLlxuICAgKiBZb3UgY2FuIHN1cHBseSBhIHN0YXRpYyBhcnJheSBvZiBzdGVwcywgb3IgYSBmYWN0b3J5IHRoYXQgcmVjZWl2ZXMgY29udGV4dCBhbmQgcmV0dXJucyBzdGVwcy5cbiAgICovXG4gIC8qKlxuICAgKiBPcHRpb25hbCBhZGRpdGlvbmFsIEdpdEh1YiBBY3Rpb24gc3RlcHMgdG8gcnVuIGFmdGVyIGRyaWZ0IGRldGVjdGlvbiBmb3IgZWFjaCBzdGFjay5cbiAgICogVGhlc2Ugc3RlcHMgcnVuIGFmdGVyIHJlc3VsdHMgYXJlIHVwbG9hZGVkIGZvciBlYWNoIHN0YWNrLiBZb3UgY2FuIGluY2x1ZGVcbiAgICogYW55IG5vdGlmaWNhdGlvbnMgeW91IGxpa2UgKGUuZy4sIFNsYWNrKS4gUHJvdmlkZSBleHBsaWNpdCBpbnB1dHMgKGUuZy4sIHBheWxvYWQvbWFya2Rvd24pXG4gICAqIGRpcmVjdGx5IGluIHlvdXIgc3RlcCB3aXRob3V0IHJlbHlpbmcgb24gYSBwcmUtZ2VuZXJhdGVkIHBheWxvYWQuXG4gICAqL1xuICAvLyBOT1RFOiBqc2lpIGRvZXMgbm90IHN1cHBvcnQgZnVuY3Rpb24gdHlwZXMgaW4gcHVibGljIEFQSXM7IHVzZSAnYW55JyBoZXJlIGFuZCBhY2NlcHQgZWl0aGVyOlxuICAvLyAtIEFuIGFycmF5IG9mIEdpdEh1YiBzdGVwcywgb3JcbiAgLy8gLSBBIGZ1bmN0aW9uIChjdHg6IHsgc3RhY2s6IHN0cmluZyB9KSA9PiBHaXRIdWJTdGVwW11cbiAgLy8gVGhlIGNvbnN0cnVjdG9yIGhhbmRsZXMgYm90aCBhdCBydW50aW1lLlxuICByZWFkb25seSBwb3N0R2l0SHViU3RlcHM/OiBhbnk7XG59XG5cbnR5cGUgR2l0SHViU3RlcCA9IHtcbiAgbmFtZT86IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICB1c2VzPzogc3RyaW5nO1xuICBydW4/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb250aW51ZU9uRXJyb3I/OiBib29sZWFuO1xuICBzaGVsbD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBDZGtEcmlmdERldGVjdGlvbldvcmtmbG93IHtcbiAgcHJpdmF0ZSBzdGF0aWMgc2NyaXB0Q3JlYXRlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBDZGtEcmlmdERldGVjdGlvbldvcmtmbG93UHJvcHMpIHtcbiAgICAvLyBWYWxpZGF0ZSBPSURDIGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLnZhbGlkYXRlT2lkY0NvbmZpZ3VyYXRpb24ocHJvcHMpO1xuXG4gICAgY29uc3QgbmFtZSA9IHByb3BzLndvcmtmbG93TmFtZSA/PyAnZHJpZnQtZGV0ZWN0aW9uJztcbiAgICBjb25zdCBmaWxlTmFtZSA9IGJ1aWxkV29ya2Zsb3dGaWxlTmFtZSh0b0tlYmFiQ2FzZShuYW1lKSk7XG4gICAgY29uc3Qgbm9kZVZlcnNpb24gPSBwcm9wcy5ub2RlVmVyc2lvbiA/PyAnMjQueCc7XG4gICAgY29uc3QgY3JlYXRlSXNzdWVzID0gcHJvcHMuY3JlYXRlSXNzdWVzID8/IHRydWU7XG4gICAgY29uc3QgcHJvamVjdCA9IHByb3BzLnByb2plY3Q7XG4gICAgY29uc3Qgc2NyaXB0T3V0cHV0UGF0aD0gcHJvcHMuc2NyaXB0T3V0cHV0UGF0aCA/PyAnLmdpdGh1Yi93b3JrZmxvd3Mvc2NyaXB0cy9kZXRlY3QtZHJpZnQudHMnO1xuXG4gICAgLy8gT25seSBjcmVhdGUgdGhlIGRyaWZ0IGRldGVjdGlvbiBzY3JpcHQgb25jZSB0byBhdm9pZCBjb2xsaXNpb25zXG4gICAgaWYgKCFDZGtEcmlmdERldGVjdGlvbldvcmtmbG93LnNjcmlwdENyZWF0ZWQpIHtcbiAgICAgIG5ldyBDZGtEcmlmdERldGVjdGlvblNjcmlwdCh7XG4gICAgICAgIHByb2plY3Q6IHByb3BzLnByb2plY3QsXG4gICAgICAgIG91dHB1dFBhdGg6IHNjcmlwdE91dHB1dFBhdGgsXG4gICAgICB9KTtcbiAgICAgIENka0RyaWZ0RGV0ZWN0aW9uV29ya2Zsb3cuc2NyaXB0Q3JlYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZ2ggPSAocHJvamVjdCBhcyBhbnkpLmdpdGh1YiA/PyBuZXcgR2l0SHViKHByb2plY3QpO1xuICAgIGNvbnN0IHdvcmtmbG93ID0gbmV3IEdpdGh1YldvcmtmbG93KGdoLCBuYW1lLCB7IGZpbGVOYW1lIH0pO1xuXG4gICAgLy8gdHJpZ2dlcnM6IHNjaGVkdWxlICsgbWFudWFsIGRpc3BhdGNoIHdpdGggc3RhY2sgY2hvaWNlXG4gICAgY29uc3Qgc3RhY2tDaG9pY2VzID0gWydhbGwnLCAuLi5wcm9wcy5zdGFja3MubWFwKChzKSA9PiBzLnN0YWNrTmFtZSldO1xuICAgIHdvcmtmbG93Lm9uKHtcbiAgICAgIHNjaGVkdWxlOiBwcm9wcy5zY2hlZHVsZSA/IFt7IGNyb246IHByb3BzLnNjaGVkdWxlIH1dIDogdW5kZWZpbmVkLFxuICAgICAgd29ya2Zsb3dEaXNwYXRjaDoge1xuICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICBzdGFjazoge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiU3RhY2sgdG8gY2hlY2sgZm9yIGRyaWZ0ICgnYWxsJyB0byBydW4gZXZlcnkgc3RhY2spXCIsXG4gICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICB0eXBlOiAnY2hvaWNlJyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHN0YWNrQ2hvaWNlcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIE9uZSBqb2IgcGVyIHN0YWNrXG4gICAgY29uc3Qgam9iczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBzdGFjayBvZiBwcm9wcy5zdGFja3MpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZFN0YWNrTmFtZSA9IHRvS2ViYWJDYXNlKHRvR2l0aHViSm9iSWQoc3RhY2suc3RhY2tOYW1lKSk7XG4gICAgICBjb25zdCBvcmlnaW5hbFN0YWNrTmFtZSA9IHN0YWNrLnN0YWNrTmFtZTtcbiAgICAgIGNvbnN0IGpvYklkID0gYGRyaWZ0LSR7c2FuaXRpemVkU3RhY2tOYW1lfWA7XG4gICAgICBjb25zdCByZXN1bHRzRmlsZSA9IGBkcmlmdC1yZXN1bHRzLSR7c2FuaXRpemVkU3RhY2tOYW1lfS5qc29uYDtcbiAgICAgIGNvbnN0IGlubmVyQ29uZCA9IFwiZ2l0aHViLmV2ZW50X25hbWUgPT0gJ3NjaGVkdWxlJyB8fCAhZ2l0aHViLmV2ZW50LmlucHV0cy5zdGFjayB8fCBnaXRodWIuZXZlbnQuaW5wdXRzLnN0YWNrID09ICdhbGwnIHx8IGdpdGh1Yi5ldmVudC5pbnB1dHMuc3RhY2sgPT0gJ1wiICsgc2FuaXRpemVkU3RhY2tOYW1lICsgXCInIHx8IGdpdGh1Yi5ldmVudC5pbnB1dHMuc3RhY2sgPT0gJ1wiICsgb3JpZ2luYWxTdGFja05hbWUgKyBcIidcIjtcbiAgICAgIGNvbnN0IGNvbmRFeHByID0gJyR7eyAnICsgaW5uZXJDb25kICsgJyB9fSc7XG4gICAgICBjb25zdCBub3RDb25kRXhwciA9ICcke3sgISgnICsgaW5uZXJDb25kICsgJykgfX0nO1xuXG4gICAgICBjb25zdCByYXdQb3N0ID0gcHJvcHMucG9zdEdpdEh1YlN0ZXBzO1xuICAgICAgY29uc3QgcG9zdFN0ZXBzOiBHaXRIdWJTdGVwW10gPSB0eXBlb2YgcmF3UG9zdCA9PT0gJ2Z1bmN0aW9uJyA/IChyYXdQb3N0IGFzIChjdHg6IHsgc3RhY2s6IHN0cmluZyB9KSA9PiBHaXRIdWJTdGVwW10pKHsgc3RhY2s6IHNhbml0aXplZFN0YWNrTmFtZSB9KSA6IChyYXdQb3N0ID8/IFtdKTtcblxuICAgICAgam9ic1tqb2JJZF0gPSB7XG4gICAgICAgIG5hbWU6IGBEcmlmdCBEZXRlY3Rpb24gLSAke3Nhbml0aXplZFN0YWNrTmFtZX1gLFxuICAgICAgICBydW5zT246IFsndWJ1bnR1LWxhdGVzdCddLFxuICAgICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICAgIGNvbnRlbnRzOiBKb2JQZXJtaXNzaW9uLlJFQUQsXG4gICAgICAgICAgaWRUb2tlbjogSm9iUGVybWlzc2lvbi5XUklURSxcbiAgICAgICAgICBpc3N1ZXM6IEpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICAgIH0sXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIEFXU19ERUZBVUxUX1JFR0lPTjogc3RhY2suZHJpZnREZXRlY3Rpb25Sb2xlVG9Bc3N1bWVSZWdpb24sXG4gICAgICAgICAgQVdTX1JFR0lPTjogc3RhY2suZHJpZnREZXRlY3Rpb25Sb2xlVG9Bc3N1bWVSZWdpb24sXG4gICAgICAgICAgRFJJRlRfREVURUNUSU9OX09VVFBVVDogcmVzdWx0c0ZpbGUsXG4gICAgICAgICAgU1RBQ0tfSUQ6IHNhbml0aXplZFN0YWNrTmFtZSxcbiAgICAgICAgICBTVEFDS19OQU1FOiBzdGFjay5zdGFja05hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIE5vIGpvYi1sZXZlbCBjb25kaXRpb247IHdlIGdhdGUgc3RlcHMgc28gdGhlIGpvYiBhbHdheXMgY29tcGxldGVzIGFuZCBzdW1tYXJ5IGNhbiBydW5cbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICB7IG5hbWU6ICdTa2lwIChzdGFjayBub3Qgc2VsZWN0ZWQpJywgaWY6IG5vdENvbmRFeHByLCBydW46ICdlY2hvIFwiU3RhY2sgbm90IHNlbGVjdGVkOyBza2lwcGluZyBkcmlmdCBkZXRlY3Rpb24gZm9yIHRoaXMgam9iLlwiJyB9LFxuICAgICAgICAgIHsgbmFtZTogJ0NoZWNrb3V0JywgaWY6IGNvbmRFeHByLCB1c2VzOiBgYWN0aW9ucy9jaGVja291dEAke2dpdGh1YkFjdGlvbnNDaGVja291dFZlcnNpb259YCB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdTZXR1cCBOb2RlLmpzJyxcbiAgICAgICAgICAgIGlmOiBjb25kRXhwcixcbiAgICAgICAgICAgIHVzZXM6IGBhY3Rpb25zL3NldHVwLW5vZGVAJHtnaXRodWJBY3Rpb25zU2V0dXBOb2RlVmVyc2lvbn1gLFxuICAgICAgICAgICAgd2l0aDogeyAnbm9kZS12ZXJzaW9uJzogbm9kZVZlcnNpb24gfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgbmFtZTogJ0luc3RhbGwgZGVwZW5kZW5jaWVzJywgaWY6IGNvbmRFeHByLCBydW46ICd5YXJuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUgfHwgbnBtIGNpJywgZW52OiB7IEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScgfSB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdBV1MgQ3JlZGVudGlhbHMnLFxuICAgICAgICAgICAgaWY6IGNvbmRFeHByLFxuICAgICAgICAgICAgaWQ6ICdjcmVkcycsXG4gICAgICAgICAgICB1c2VzOiBgYXdzLWFjdGlvbnMvY29uZmlndXJlLWF3cy1jcmVkZW50aWFsc0Ake2dpdGh1YkFjdGlvbnNBd3NDcmVkZW50aWFsc1ZlcnNpb259YCxcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgJ3JvbGUtdG8tYXNzdW1lJzogc3RhY2sub2lkY1JvbGVBcm4gPz8gcHJvcHMub2lkY1JvbGVBcm4sXG4gICAgICAgICAgICAgICdyb2xlLXNlc3Npb24tbmFtZSc6ICdHaXRIdWJBY3Rpb24nLFxuICAgICAgICAgICAgICAnYXdzLXJlZ2lvbic6IHN0YWNrLm9pZGNSZWdpb24gPz8gcHJvcHMub2lkY1JlZ2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnQXNzdW1lIERyaWZ0IERldGVjdGlvbiBSb2xlJyxcbiAgICAgICAgICAgIGlmOiBjb25kRXhwcixcbiAgICAgICAgICAgIHVzZXM6IGBhd3MtYWN0aW9ucy9jb25maWd1cmUtYXdzLWNyZWRlbnRpYWxzQCR7Z2l0aHViQWN0aW9uc0F3c0NyZWRlbnRpYWxzVmVyc2lvbn1gLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICAncm9sZS10by1hc3N1bWUnOiBzdGFjay5kcmlmdERldGVjdGlvblJvbGVUb0Fzc3VtZUFybixcbiAgICAgICAgICAgICAgJ3JvbGUtY2hhaW5pbmcnOiB0cnVlLFxuICAgICAgICAgICAgICAncm9sZS1za2lwLXNlc3Npb24tdGFnZ2luZyc6IHRydWUsXG4gICAgICAgICAgICAgICdhd3MtcmVnaW9uJzogc3RhY2suZHJpZnREZXRlY3Rpb25Sb2xlVG9Bc3N1bWVSZWdpb24sXG4gICAgICAgICAgICAgICdhd3MtYWNjZXNzLWtleS1pZCc6ICcke3sgc3RlcHMuY3JlZHMub3V0cHV0cy5hd3MtYWNjZXNzLWtleS1pZCB9fScsXG4gICAgICAgICAgICAgICdhd3Mtc2VjcmV0LWFjY2Vzcy1rZXknOiAnJHt7IHN0ZXBzLmNyZWRzLm91dHB1dHMuYXdzLXNlY3JldC1hY2Nlc3Mta2V5IH19JyxcbiAgICAgICAgICAgICAgJ2F3cy1zZXNzaW9uLXRva2VuJzogJyR7eyBzdGVwcy5jcmVkcy5vdXRwdXRzLmF3cy1zZXNzaW9uLXRva2VuIH19JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnRGV0ZWN0IGRyaWZ0JyxcbiAgICAgICAgICAgIGlmOiBjb25kRXhwcixcbiAgICAgICAgICAgIGlkOiAnZHJpZnQnLFxuICAgICAgICAgICAgY29udGludWVPbkVycm9yOiB0cnVlLCAvLyBhbGxvdyBhcnRpZmFjdCB1cGxvYWQgYW5kIGlzc3VlIGNyZWF0aW9uIGV2ZW4gd2hlbiBkcmlmdCBpcyBkZXRlY3RlZFxuICAgICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICAgICdzZXQgK2UnLFxuICAgICAgICAgICAgICAvLyBVc2UgdGhlIGJ1bmRsZWQgc2NyaXB0IGZyb20gdGhpcyBwYWNrYWdlXG4gICAgICAgICAgICAgICdub2RlIC4vbm9kZV9tb2R1bGVzL0BqanJhd2xpbnMvY2RrLWRpZmYtcHItZ2l0aHViLWFjdGlvbi9saWIvYmluL2RldGVjdC1kcmlmdC5qcycsXG4gICAgICAgICAgICAgICdzdGF0dXM9JD8nLFxuICAgICAgICAgICAgICAnaWYgWyAtZiBcIiREUklGVF9ERVRFQ1RJT05fT1VUUFVUXCIgXTsgdGhlbiBlY2hvIFwiUmVzdWx0cyBmaWxlIGNyZWF0ZWQ6ICREUklGVF9ERVRFQ1RJT05fT1VUUFVUXCI7IGZpJyxcbiAgICAgICAgICAgICAgLy8gRXhwb3NlIHVzZWZ1bCBvdXRwdXRzIGZvciBkb3duc3RyZWFtIHN0ZXBzXG4gICAgICAgICAgICAgIFwiU1RBQ0tfQVJOPSQoYXdzIGNsb3VkZm9ybWF0aW9uIGRlc2NyaWJlLXN0YWNrcyAtLXN0YWNrLW5hbWUgXFxcIiRTVEFDS19OQU1FXFxcIiAtLXF1ZXJ5ICdTdGFja3NbMF0uU3RhY2tJZCcgLS1vdXRwdXQgdGV4dCAyPi9kZXYvbnVsbCB8fCB0cnVlKVwiLFxuICAgICAgICAgICAgICAnZWNobyBcInN0YWNrLWFybj0kU1RBQ0tfQVJOXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiJyxcbiAgICAgICAgICAgICAgJ2V4aXQgJHN0YXR1cycsXG4gICAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAgIFNUQUNLX05BTUU6IHN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgICAgICAgQVdTX1JFR0lPTjogc3RhY2suZHJpZnREZXRlY3Rpb25Sb2xlVG9Bc3N1bWVSZWdpb24sXG4gICAgICAgICAgICAgIERSSUZUX0RFVEVDVElPTl9PVVRQVVQ6IHJlc3VsdHNGaWxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdVcGxvYWQgcmVzdWx0cycsXG4gICAgICAgICAgICBpZjogY29uZEV4cHIsXG4gICAgICAgICAgICB1c2VzOiBgYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RAJHtnaXRodWJBY3Rpb25zVXBsb2FkQXJ0aWZhY3RWZXJzaW9ufWAsXG4gICAgICAgICAgICB3aXRoOiB7ICduYW1lJzogYGRyaWZ0LXJlc3VsdHMtJHtzYW5pdGl6ZWRTdGFja05hbWV9YCwgJ3BhdGgnOiByZXN1bHRzRmlsZSwgJ2lmLW5vLWZpbGVzLWZvdW5kJzogJ2lnbm9yZScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLihcbiAgICAgICAgICAgIGNyZWF0ZUlzc3Vlc1xuICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnQ3JlYXRlIElzc3VlIG9uIERyaWZ0JyxcbiAgICAgICAgICAgICAgICAgIGlmOiBcImFsd2F5cygpICYmIHN0ZXBzLmRyaWZ0Lm91dGNvbWUgPT0gJ2ZhaWx1cmUnXCIsXG4gICAgICAgICAgICAgICAgICBpZDogJ2lzc3VlJyxcbiAgICAgICAgICAgICAgICAgIHVzZXM6IGBhY3Rpb25zL2dpdGh1Yi1zY3JpcHRAJHtnaXRodWJBY3Rpb25zR2l0aHViU2NyaXB0VmVyc2lvbn1gLFxuICAgICAgICAgICAgICAgICAgd2l0aDogeyAncmVzdWx0LWVuY29kaW5nJzogJ3N0cmluZycsICdzY3JpcHQnOiBpc3N1ZVNjcmlwdChzYW5pdGl6ZWRTdGFja05hbWUsIHN0YWNrLmRyaWZ0RGV0ZWN0aW9uUm9sZVRvQXNzdW1lUmVnaW9uLCByZXN1bHRzRmlsZSkgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIDogW11cbiAgICAgICAgICApLFxuICAgICAgICAgIC4uLnBvc3RTdGVwcy5tYXAoKHN0ZXApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHM6IGFueSA9IHsgLi4uKHN0ZXAgYXMgYW55KSB9O1xuICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgb25seSBydW4gZXh0cmEgbm90aWZpY2F0aW9uIHN0ZXBzIHdoZW4gZHJpZnQgb2NjdXJzXG4gICAgICAgICAgICBzLmlmID0gcy5pZiA/PyBcImFsd2F5cygpICYmIHN0ZXBzLmRyaWZ0Lm91dGNvbWUgPT0gJ2ZhaWx1cmUnXCI7XG4gICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gc3VtbWFyeSBhZ2dyZWdhdG9yIGpvYlxuICAgIGpvYnNbJ2RyaWZ0LXN1bW1hcnknXSA9IHtcbiAgICAgIG5hbWU6ICdEcmlmdCBEZXRlY3Rpb24gU3VtbWFyeScsXG4gICAgICBuZWVkczogT2JqZWN0LmtleXMoam9icykuZmlsdGVyKChqKSA9PiBqLnN0YXJ0c1dpdGgoJ2RyaWZ0LScpICYmIGogIT09ICdkcmlmdC1zdW1tYXJ5JyksXG4gICAgICBydW5zT246IFsndWJ1bnR1LWxhdGVzdCddLFxuICAgICAgcGVybWlzc2lvbnM6IHsgY29udGVudHM6IEpvYlBlcm1pc3Npb24uUkVBRCB9LFxuICAgICAgc3RlcHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdEb3dubG9hZCBhbGwgYXJ0aWZhY3RzJyxcbiAgICAgICAgICB1c2VzOiBgYWN0aW9ucy9kb3dubG9hZC1hcnRpZmFjdEAke2dpdGh1YkFjdGlvbnNEb3dubG9hZEFydGlmYWN0VmVyc2lvbn1gLFxuICAgICAgICAgIHdpdGg6IHsgcGF0aDogJ2RyaWZ0LXJlc3VsdHMnIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgbmFtZTogJ0dlbmVyYXRlIHN1bW1hcnknLCBzaGVsbDogJ2Jhc2gnLCBydW46IHN1bW1hcnlTY3JpcHQoKSB9LFxuICAgICAgXSxcbiAgICB9O1xuXG4gICAgd29ya2Zsb3cuYWRkSm9icyhqb2JzKTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVPaWRjQ29uZmlndXJhdGlvbihwcm9wczogQ2RrRHJpZnREZXRlY3Rpb25Xb3JrZmxvd1Byb3BzKTogdm9pZCB7XG4gICAgY29uc3QgaGFzRGVmYXVsdE9pZGNSb2xlID0gISFwcm9wcy5vaWRjUm9sZUFybjtcbiAgICBjb25zdCBoYXNEZWZhdWx0T2lkY1JlZ2lvbiA9ICEhcHJvcHMub2lkY1JlZ2lvbjtcblxuICAgIC8vIENoZWNrIGlmIGFsbCBzdGFja3MgaGF2ZSB0aGVpciBvd24gT0lEQyBjb25maWd1cmF0aW9uXG4gICAgY29uc3QgYWxsU3RhY2tzSGF2ZU9pZGNSb2xlID0gcHJvcHMuc3RhY2tzLmV2ZXJ5KHN0YWNrID0+ICEhc3RhY2sub2lkY1JvbGVBcm4pO1xuICAgIGNvbnN0IGFsbFN0YWNrc0hhdmVPaWRjUmVnaW9uID0gcHJvcHMuc3RhY2tzLmV2ZXJ5KHN0YWNrID0+ICEhc3RhY2sub2lkY1JlZ2lvbik7XG5cbiAgICAvLyBFaXRoZXIgZGVmYXVsdHMgbXVzdCBiZSBwcm92aWRlZCBPUiBhbGwgc3RhY2tzIG11c3QgaGF2ZSB0aGVpciBvd24gT0lEQyBjb25maWdcbiAgICBpZiAoIWhhc0RlZmF1bHRPaWRjUm9sZSAmJiAhYWxsU3RhY2tzSGF2ZU9pZGNSb2xlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VpdGhlciBwcm92aWRlIGRlZmF1bHQgb2lkY1JvbGVBcm4gb3Igc3BlY2lmeSBvaWRjUm9sZUFybiBmb3IgZWFjaCBzdGFjaycpO1xuICAgIH1cblxuICAgIGlmICghaGFzRGVmYXVsdE9pZGNSZWdpb24gJiYgIWFsbFN0YWNrc0hhdmVPaWRjUmVnaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VpdGhlciBwcm92aWRlIGRlZmF1bHQgb2lkY1JlZ2lvbiBvciBzcGVjaWZ5IG9pZGNSZWdpb24gZm9yIGVhY2ggc3RhY2snKTtcbiAgICB9XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBpc3N1ZVNjcmlwdChzdGFjazogc3RyaW5nLCByZWdpb246IHN0cmluZywgcmVzdWx0c0ZpbGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIENvbnN0cnVjdCBhIHBsYWluIEpTIHNjcmlwdCBzdHJpbmcgKG5vIHRlbXBsYXRlIHN0cmluZyBuZXN0aW5nIG1pc2hhcHMpXG4gIGNvbnN0IGxpbmVzID0gW1xuICAgIFwiY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1wiLFxuICAgIGBjb25zdCByZXN1bHRzRmlsZSA9ICcke3Jlc3VsdHNGaWxlfSc7YCxcbiAgICBcImlmICghZnMuZXhpc3RzU3luYyhyZXN1bHRzRmlsZSkpIHsgY29uc29sZS5sb2coJ05vIHJlc3VsdHMgZmlsZSBmb3VuZCcpOyByZXR1cm4gJ05PX1JFU1VMVFMnOyB9XCIsXG4gICAgXCJjb25zdCByZXN1bHRzID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocmVzdWx0c0ZpbGUsICd1dGY4JykpO1wiLFxuICAgIFwiY29uc3QgZHJpZnRlZFN0YWNrcyA9IHJlc3VsdHMuZmlsdGVyKHIgPT4gci5kcmlmdFN0YXR1cyA9PT0gJ0RSSUZURUQnKTtcIixcbiAgICBcImlmIChkcmlmdGVkU3RhY2tzLmxlbmd0aCA9PT0gMCkgeyBjb25zb2xlLmxvZygnTm8gZHJpZnQgZGV0ZWN0ZWQnKTsgcmV0dXJuICdOT19EUklGVCc7IH1cIixcbiAgICBgY29uc3QgdGl0bGUgPSAnRHJpZnQgRGV0ZWN0ZWQgaW4gJHtzdGFja30nO2AsXG4gICAgYGxldCBib2R5ID0gJyMjIERyaWZ0IERldGVjdGlvbiBSZXBvcnRcXFxcblxcXFxuJyArICcqKlN0YWNrOioqICR7c3RhY2t9XFxcXG4nICsgJyoqUmVnaW9uOioqICR7cmVnaW9ufVxcXFxuJyArICcqKlRpbWU6KiogJyArIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSArICdcXFxcblxcXFxuJztgLFxuICAgIFwiYm9keSArPSAnIyMjIFN1bW1hcnlcXFxcbic7XCIsXG4gICAgXCJib2R5ICs9ICctIFRvdGFsIHN0YWNrcyBjaGVja2VkOiAnICsgcmVzdWx0cy5sZW5ndGggKyAnXFxcXG4nO1wiLFxuICAgIFwiYm9keSArPSAnLSBEcmlmdGVkIHN0YWNrczogJyArIGRyaWZ0ZWRTdGFja3MubGVuZ3RoICsgJ1xcXFxuXFxcXG4nO1wiLFxuICAgIFwiYm9keSArPSAnIyMjIERyaWZ0ZWQgU3RhY2tzXFxcXG4nO1wiLFxuICAgICdmb3IgKGNvbnN0IHMgb2YgZHJpZnRlZFN0YWNrcykgeycsXG4gICAgJyAgY29uc3QgcmVzb3VyY2VzID0gcy5kcmlmdGVkUmVzb3VyY2VzIHx8IFtdOycsXG4gICAgXCIgIGJvZHkgKz0gJyMjIyMgJyArIHMuc3RhY2tOYW1lICsgJ1xcXFxuJztcIixcbiAgICBcIiAgYm9keSArPSAnLSBEcmlmdGVkIHJlc291cmNlczogJyArIHJlc291cmNlcy5sZW5ndGggKyAnXFxcXG4nO1wiLFxuICAgIFwiICBmb3IgKGNvbnN0IHIgb2YgcmVzb3VyY2VzKSB7IGJvZHkgKz0gJyAgLSAnICsgci5sb2dpY2FsUmVzb3VyY2VJZCArICcgKCcgKyByLnJlc291cmNlVHlwZSArICcpXFxcXG4nOyB9XCIsXG4gICAgXCIgIGJvZHkgKz0gJ1xcXFxuJztcIixcbiAgICAnfScsXG4gICAgXCJib2R5ICs9ICcjIyMgQWN0aW9uIFJlcXVpcmVkXFxcXG4nICsgJ1BsZWFzZSByZXZpZXcgdGhlIGRyaWZ0ZWQgcmVzb3VyY2VzIGFuZCBlaXRoZXI6XFxcXG4xLiBVcGRhdGUgdGhlIGluZnJhc3RydWN0dXJlIGNvZGUgdG8gbWF0Y2ggdGhlIGFjdHVhbCBzdGF0ZVxcXFxuMi4gUmVzdG9yZSB0aGUgcmVzb3VyY2VzIHRvIG1hdGNoIHRoZSBleHBlY3RlZCBzdGF0ZVxcXFxuXFxcXG4nO1wiLFxuICAgICdib2R5ICs9IGBbVmlldyB3b3JrZmxvdyBydW5dKCR7Y29udGV4dC5zZXJ2ZXJVcmx9LyR7Y29udGV4dC5yZXBvLm93bmVyfS8ke2NvbnRleHQucmVwby5yZXBvfS9hY3Rpb25zL3J1bnMvJHtjb250ZXh0LnJ1bklkfSlgOycsXG4gICAgLy8gTGlzdCBvciB1cGRhdGUgYW4gaXNzdWUgd2l0aCBsYWJlbHNcbiAgICBgY29uc3QgaXNzdWVzID0gYXdhaXQgZ2l0aHViLnJlc3QuaXNzdWVzLmxpc3RGb3JSZXBvKHsgb3duZXI6IGNvbnRleHQucmVwby5vd25lciwgcmVwbzogY29udGV4dC5yZXBvLnJlcG8sIHN0YXRlOiAnb3BlbicsIGxhYmVsczogWydkcmlmdC1kZXRlY3Rpb24nLCAnJHtzdGFja30nXSB9KTtgLFxuICAgICdsZXQgaXNzdWVOdW1iZXI7JyxcbiAgICAnaWYgKGlzc3Vlcy5kYXRhLmxlbmd0aCA9PT0gMCkgeycsXG4gICAgYCAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IGdpdGh1Yi5yZXN0Lmlzc3Vlcy5jcmVhdGUoeyBvd25lcjogY29udGV4dC5yZXBvLm93bmVyLCByZXBvOiBjb250ZXh0LnJlcG8ucmVwbywgdGl0bGUsIGJvZHksIGxhYmVsczogWydkcmlmdC1kZXRlY3Rpb24nLCAnJHtzdGFja30nXSB9KTtgLFxuICAgICcgIGlzc3VlTnVtYmVyID0gY3JlYXRlZC5kYXRhLm51bWJlcjsnLFxuICAgICd9IGVsc2UgeycsXG4gICAgJyAgY29uc3QgaXNzdWUgPSBpc3N1ZXMuZGF0YVswXTsnLFxuICAgICcgIGlzc3VlTnVtYmVyID0gaXNzdWUubnVtYmVyOycsXG4gICAgJyAgYXdhaXQgZ2l0aHViLnJlc3QuaXNzdWVzLmNyZWF0ZUNvbW1lbnQoeyBvd25lcjogY29udGV4dC5yZXBvLm93bmVyLCByZXBvOiBjb250ZXh0LnJlcG8ucmVwbywgaXNzdWVfbnVtYmVyOiBpc3N1ZS5udW1iZXIsIGJvZHkgfSk7JyxcbiAgICAnfScsXG4gICAgJ3JldHVybiBTdHJpbmcoaXNzdWVOdW1iZXIgPz8gXCJcIik7JyxcbiAgXTtcbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG5cbmZ1bmN0aW9uIHN1bW1hcnlTY3JpcHQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIFtcbiAgICAnIyEvYmluL2Jhc2gnLFxuICAgICdzZXQgLWUnLFxuICAgICdlY2hvIFwiIyMgRHJpZnQgRGV0ZWN0aW9uIFN1bW1hcnlcIiA+PiAkR0lUSFVCX1NURVBfU1VNTUFSWScsXG4gICAgJ2VjaG8gXCJcIiA+PiAkR0lUSFVCX1NURVBfU1VNTUFSWScsXG4gICAgJycsXG4gICAgJ3RvdGFsX3N0YWNrcz0wJyxcbiAgICAndG90YWxfZHJpZnRlZD0wJyxcbiAgICAndG90YWxfZXJyb3JzPTAnLFxuICAgICcnLFxuICAgICdzaG9wdCAtcyBudWxsZ2xvYicsXG4gICAgJ2ZvciBmaWxlIGluIGRyaWZ0LXJlc3VsdHMtKi5qc29uIGRyaWZ0LXJlc3VsdHMvKi9kcmlmdC1yZXN1bHRzLSouanNvbjsgZG8nLFxuICAgICcgIGlmIFtbIC1mIFwiJGZpbGVcIiBdXTsgdGhlbicsXG4gICAgJyAgICBzdGFjaz0kKGJhc2VuYW1lIFwiJGZpbGVcIiB8IHNlZCAtRSBcXFwicy9eZHJpZnQtcmVzdWx0cy0oW14uXSspXFxcXC5qc29uJC9cXFxcMS9cXFwiKScsXG4gICAgJyAgICBlY2hvIFwiIyMjIFN0YWNrOiAkc3RhY2tcIiA+PiAkR0lUSFVCX1NURVBfU1VNTUFSWScsXG4gICAgJyAgICBqcSAtciBcXCcnICtcbiAgICAgICcuIGFzICRyZXN1bHRzIHxcXG4nICtcbiAgICAgICdcIi0gVG90YWwgc3RhY2tzOiBcIiArICgkcmVzdWx0cyB8IGxlbmd0aCB8IHRvc3RyaW5nKSArIFwiXFxcXG5cIiArXFxuJyArXG4gICAgICAnXCItIERyaWZ0ZWQ6IFwiICsgKFsuW10gfCBzZWxlY3QoLmRyaWZ0U3RhdHVzID09IFwiRFJJRlRFRFwiKV0gfCBsZW5ndGggfCB0b3N0cmluZykgKyBcIlxcXFxuXCIgK1xcbicgK1xuICAgICAgJ1wiLSBFcnJvcnM6IFwiICsgKFsuW10gfCBzZWxlY3QoLmVycm9yKV0gfCBsZW5ndGggfCB0b3N0cmluZykgKyBcIlxcXFxuXCIgK1xcbicgK1xuICAgICAgJyhbLltdIHwgc2VsZWN0KC5kcmlmdFN0YXR1cyA9PSBcIkRSSUZURURcIildIHwgaWYgbGVuZ3RoID4gMCB0aGVuIFwiXFxcXG4qKkRyaWZ0ZWQgc3RhY2tzOioqXFxcXG5cIiArIChtYXAoXCIgIC0gXCIgKyAuc3RhY2tOYW1lICsgXCIgKFwiICsgKCguZHJpZnRlZFJlc291cmNlcyAvLyBbXSkgfCBsZW5ndGggfCB0b3N0cmluZykgKyBcIiByZXNvdXJjZXMpXCIpIHwgam9pbihcIlxcXFxuXCIpKSBlbHNlIFwiXCIgZW5kKVxcbicgK1xuICAgICdcXCcnICtcbiAgICAnIFwiJGZpbGVcIiA+PiAkR0lUSFVCX1NURVBfU1VNTUFSWScsXG4gICAgJyAgICBlY2hvIFwiXCIgPj4gJEdJVEhVQl9TVEVQX1NVTU1BUlknLFxuICAgICcgICAgdG90YWxfc3RhY2tzPSQoKHRvdGFsX3N0YWNrcyArICQoanEgXFxcImxlbmd0aFxcXCIgXFxcIiRmaWxlXFxcIikpKScsXG4gICAgJyAgICB0b3RhbF9kcmlmdGVkPSQoKHRvdGFsX2RyaWZ0ZWQgKyAkKGpxIFxcXCJbLltdIHwgc2VsZWN0KC5kcmlmdFN0YXR1cyA9PSBcXFxcXFxcIkRSSUZURURcXFxcXFxcIildIHwgbGVuZ3RoXFxcIiBcXFwiJGZpbGVcXFwiKSkpJyxcbiAgICAnICAgIHRvdGFsX2Vycm9ycz0kKCh0b3RhbF9lcnJvcnMgKyAkKGpxIFxcXCJbLltdIHwgc2VsZWN0KC5lcnJvcildIHwgbGVuZ3RoXFxcIiBcXFwiJGZpbGVcXFwiKSkpJyxcbiAgICAnICBmaScsXG4gICAgJ2RvbmUnLFxuICAgICcnLFxuICAgICdlY2hvIFwiIyMjIE92ZXJhbGwgU3VtbWFyeVwiID4+ICRHSVRIVUJfU1RFUF9TVU1NQVJZJyxcbiAgICAnZWNobyBcIi0gVG90YWwgc3RhY2tzIGNoZWNrZWQ6ICR0b3RhbF9zdGFja3NcIiA+PiAkR0lUSFVCX1NURVBfU1VNTUFSWScsXG4gICAgJ2VjaG8gXCItIFRvdGFsIGRyaWZ0ZWQgc3RhY2tzOiAkdG90YWxfZHJpZnRlZFwiID4+ICRHSVRIVUJfU1RFUF9TVU1NQVJZJyxcbiAgICAnZWNobyBcIi0gVG90YWwgZXJyb3JzOiAkdG90YWxfZXJyb3JzXCIgPj4gJEdJVEhVQl9TVEVQX1NVTU1BUlknLFxuICAgICcnLFxuICAgICdpZiBbWyAkdG90YWxfZHJpZnRlZCAtZ3QgMCBdXTsgdGhlbicsXG4gICAgJyAgZWNobyBcIlwiID4+ICRHSVRIVUJfU1RFUF9TVU1NQVJZJyxcbiAgICAnICBlY2hvIFwi4pqg77iPICoqQWN0aW9uIHJlcXVpcmVkOioqIERyaWZ0IGRldGVjdGVkIGluICR0b3RhbF9kcmlmdGVkIHN0YWNrc1wiID4+ICRHSVRIVUJfU1RFUF9TVU1NQVJZJyxcbiAgICAnZmknLFxuICBdLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiB0b0tlYmFiQ2FzZShzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcy5yZXBsYWNlKC9bXmEtekEtWjAtOV0rL2csICctJykucmVwbGFjZSgvXi0rfC0rJC9nLCAnJykudG9Mb3dlckNhc2UoKTtcbn1cblxuXG5mdW5jdGlvbiBidWlsZFdvcmtmbG93RmlsZU5hbWUoYmFzZU5hbWU6IHN0cmluZywgZXh0OiBzdHJpbmcgPSAnLnltbCcsIG1heExlbmd0aDogbnVtYmVyID0gTUFYX1dPUktGTE9XX0ZJTEVOQU1FX0xFTkdUSCk6IHN0cmluZyB7XG4gIGNvbnN0IGZ1bGwgPSBgJHtiYXNlTmFtZX0ke2V4dH1gO1xuICBpZiAoZnVsbC5sZW5ndGggPD0gbWF4TGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZ1bGw7XG4gIH1cbiAgY29uc3QgYXZhaWxhYmxlID0gbWF4TGVuZ3RoIC0gZXh0Lmxlbmd0aDtcbiAgaWYgKGF2YWlsYWJsZSA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBXb3JrZmxvdyBleHRlbnNpb24gZXhjZWVkcyBtYXhpbXVtIGZpbGVuYW1lIGxlbmd0aCBvZiAke21heExlbmd0aH1gKTtcbiAgfVxuICAvLyBUcnVuY2F0ZSBmcm9tIHRoZSBiZWdpbm5pbmcgdG8ga2VlcCB0aGUgZW5kIGludGFjdFxuICByZXR1cm4gYmFzZU5hbWUuc2xpY2UoLWF2YWlsYWJsZSkucmVwbGFjZSgvXi0rLywgJycpICsgZXh0O1xufVxuXG5mdW5jdGlvbiB0b0dpdGh1YkpvYklkKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEdpdEh1YiBqb2JfaWQgbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIG9yIHVuZGVyc2NvcmUgYW5kIGNvbnRhaW4gb25seSBBLVphLXowLTksICctJywgJ18nXG4gIC8vIDEpIFJlcGxhY2UgYW55IGRpc2FsbG93ZWQgY2hhcnMgd2l0aCAnLSdcbiAgbGV0IG91dCA9IHMucmVwbGFjZSgvW15BLVphLXowLTlfLV0rL2csICctJyk7XG4gIC8vIDIpIENvbGxhcHNlIGNvbnNlY3V0aXZlIGRhc2hlc1xuICBvdXQgPSBvdXQucmVwbGFjZSgvLSsvZywgJy0nKTtcbiAgLy8gMykgVHJpbSBsZWFkaW5nL3RyYWlsaW5nIGRhc2hlcyAodW5kZXJzY29yZXMgYXJlIGFsbG93ZWQgYXQgc3RhcnQpXG4gIG91dCA9IG91dC5yZXBsYWNlKC9eLSt8LSskL2csICcnKTtcbiAgLy8gNCkgTG93ZXJjYXNlIGZvciBjb25zaXN0ZW5jeSAobm90IHJlcXVpcmVkIGJ5IEdpdEh1YiBidXQga2VlcHMgdGhpbmdzIHN0YWJsZSlcbiAgb3V0ID0gb3V0LnRvTG93ZXJDYXNlKCk7XG4gIC8vIDUpIEVuc3VyZSBpdCBzdGFydHMgd2l0aCBhIGxldHRlciBvciB1bmRlcnNjb3JlXG4gIGlmICghb3V0IHx8ICEvXlthLXpfXS9pLnRlc3Qob3V0KSkge1xuICAgIG91dCA9IGBzLSR7b3V0fWA7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==
|
|
317
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2RrRHJpZnREZXRlY3Rpb25Xb3JrZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9DZGtEcmlmdERldGVjdGlvbldvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOENBQTJEO0FBQzNELHVFQUFrRTtBQUNsRSxpRkFBMkU7QUFFM0UsTUFBTSxrQ0FBa0MsR0FBRyxJQUFJLENBQUM7QUFDaEQsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLENBQUM7QUFDMUMsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLENBQUM7QUFDM0MsTUFBTSxrQ0FBa0MsR0FBRyxJQUFJLENBQUM7QUFDaEQsTUFBTSxvQ0FBb0MsR0FBRyxJQUFJLENBQUM7QUFDbEQsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFJLENBQUM7QUFFOUMsTUFBTSw0QkFBNEIsR0FBRyxHQUFHLENBQUM7QUE0RHpDLE1BQWEseUJBQXlCO0lBR3BDLFlBQVksS0FBcUM7UUFDL0MsOEJBQThCO1FBQzlCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLGlCQUFpQixDQUFDO1FBQ3JELE1BQU0sUUFBUSxHQUFHLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzFELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDO1FBQ2hELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDO1FBQ2hELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDOUIsTUFBTSxnQkFBZ0IsR0FBRSxLQUFLLENBQUMsZ0JBQWdCLElBQUksMkNBQTJDLENBQUM7UUFFOUYsc0RBQXNEO1FBQ3RELE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFcEUsa0VBQWtFO1FBQ2xFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM3QyxJQUFJLG9EQUF1QixDQUFDO2dCQUMxQixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87Z0JBQ3RCLFVBQVUsRUFBRSxnQkFBZ0I7YUFDN0IsQ0FBQyxDQUFDO1lBQ0gseUJBQXlCLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUNqRCxDQUFDO1FBRUQsTUFBTSxFQUFFLEdBQUksT0FBZSxDQUFDLE1BQU0sSUFBSSxJQUFJLGVBQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRCxNQUFNLFFBQVEsR0FBRyxJQUFJLHVCQUFjLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFNUQseURBQXlEO1FBQ3pELE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDVixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNqRSxnQkFBZ0IsRUFBRTtnQkFDaEIsTUFBTSxFQUFFO29CQUNOLEtBQUssRUFBRTt3QkFDTCxXQUFXLEVBQUUscURBQXFEO3dCQUNsRSxRQUFRLEVBQUUsS0FBSzt3QkFDZixJQUFJLEVBQUUsUUFBUTt3QkFDZCxPQUFPLEVBQUUsWUFBWTtxQkFDdEI7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUVILG9CQUFvQjtRQUNwQixNQUFNLElBQUksR0FBd0IsRUFBRSxDQUFDO1FBRXJDLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN2RSxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7WUFDMUMsTUFBTSxLQUFLLEdBQUcsU0FBUyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVDLE1BQU0sV0FBVyxHQUFHLGlCQUFpQixrQkFBa0IsT0FBTyxDQUFDO1lBQy9ELE1BQU0sU0FBUyxHQUFHLHVJQUF1SSxHQUFHLGtCQUFrQixHQUFHLHFDQUFxQyxHQUFHLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztZQUNqUCxNQUFNLFFBQVEsR0FBRyxNQUFNLEdBQUcsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUM1QyxNQUFNLFdBQVcsR0FBRyxRQUFRLEdBQUcsU0FBUyxHQUFHLE1BQU0sQ0FBQztZQUVsRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDO1lBQ3RDLE1BQU0sU0FBUyxHQUFpQixPQUFPLE9BQU8sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFFLE9BQW9ELENBQUMsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztZQUV2Syx5RkFBeUY7WUFDekYsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7WUFDdEUsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7WUFFbkUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHO2dCQUNaLElBQUksRUFBRSxxQkFBcUIsa0JBQWtCLEVBQUU7Z0JBQy9DLE1BQU0sRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDekIsR0FBRyxDQUFDLFFBQVEsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUM3QixXQUFXLEVBQUU7b0JBQ1gsUUFBUSxFQUFFLCtCQUFhLENBQUMsSUFBSTtvQkFDNUIsT0FBTyxFQUFFLCtCQUFhLENBQUMsS0FBSztvQkFDNUIsTUFBTSxFQUFFLCtCQUFhLENBQUMsS0FBSztpQkFDNUI7Z0JBQ0QsR0FBRyxFQUFFO29CQUNILGtCQUFrQixFQUFFLEtBQUssQ0FBQyxnQ0FBZ0M7b0JBQzFELFVBQVUsRUFBRSxLQUFLLENBQUMsZ0NBQWdDO29CQUNsRCxzQkFBc0IsRUFBRSxXQUFXO29CQUNuQyxRQUFRLEVBQUUsa0JBQWtCO29CQUM1QixVQUFVLEVBQUUsS0FBSyxDQUFDLFNBQVM7aUJBQzVCO2dCQUNELHdGQUF3RjtnQkFDeEYsS0FBSyxFQUFFO29CQUNMLEVBQUUsSUFBSSxFQUFFLDJCQUEyQixFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLG1FQUFtRSxFQUFFO29CQUNoSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLDRCQUE0QixFQUFFLEVBQUU7b0JBQzVGO3dCQUNFLElBQUksRUFBRSxlQUFlO3dCQUNyQixFQUFFLEVBQUUsUUFBUTt3QkFDWixJQUFJLEVBQUUsc0JBQXNCLDZCQUE2QixFQUFFO3dCQUMzRCxJQUFJLEVBQUUsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFO3FCQUN0QztvQkFDRCxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSwwQ0FBMEMsRUFBRSxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsNkJBQTZCLEVBQUUsRUFBRTtvQkFDcko7d0JBQ0UsSUFBSSxFQUFFLGlCQUFpQjt3QkFDdkIsRUFBRSxFQUFFLFFBQVE7d0JBQ1osRUFBRSxFQUFFLE9BQU87d0JBQ1gsSUFBSSxFQUFFLHlDQUF5QyxrQ0FBa0MsRUFBRTt3QkFDbkYsSUFBSSxFQUFFOzRCQUNKLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFdBQVc7NEJBQ3hELG1CQUFtQixFQUFFLGNBQWM7NEJBQ25DLFlBQVksRUFBRSxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVO3lCQUNuRDtxQkFDRjtvQkFDRDt3QkFDRSxJQUFJLEVBQUUsNkJBQTZCO3dCQUNuQyxFQUFFLEVBQUUsUUFBUTt3QkFDWixJQUFJLEVBQUUseUNBQXlDLGtDQUFrQyxFQUFFO3dCQUNuRixJQUFJLEVBQUU7NEJBQ0osZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLDZCQUE2Qjs0QkFDckQsZUFBZSxFQUFFLElBQUk7NEJBQ3JCLDJCQUEyQixFQUFFLElBQUk7NEJBQ2pDLFlBQVksRUFBRSxLQUFLLENBQUMsZ0NBQWdDOzRCQUNwRCxtQkFBbUIsRUFBRSw4Q0FBOEM7NEJBQ25FLHVCQUF1QixFQUFFLGtEQUFrRDs0QkFDM0UsbUJBQW1CLEVBQUUsOENBQThDO3lCQUNwRTtxQkFDRjtvQkFDRDt3QkFDRSxJQUFJLEVBQUUsY0FBYzt3QkFDcEIsRUFBRSxFQUFFLFFBQVE7d0JBQ1osRUFBRSxFQUFFLE9BQU87d0JBQ1gsZUFBZSxFQUFFLElBQUksRUFBRSx1RUFBdUU7d0JBQzlGLEdBQUcsRUFBRTs0QkFDSCxRQUFROzRCQUNSLDJDQUEyQzs0QkFDM0Msa0ZBQWtGOzRCQUNsRixXQUFXOzRCQUNYLG9HQUFvRzs0QkFDcEcsNkNBQTZDOzRCQUM3Qyw0SUFBNEk7NEJBQzVJLGlEQUFpRDs0QkFDakQsY0FBYzt5QkFDZixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7d0JBQ1osR0FBRyxFQUFFOzRCQUNILFVBQVUsRUFBRSxLQUFLLENBQUMsU0FBUzs0QkFDM0IsVUFBVSxFQUFFLEtBQUssQ0FBQyxnQ0FBZ0M7NEJBQ2xELHNCQUFzQixFQUFFLFdBQVc7eUJBQ3BDO3FCQUNGO29CQUNEO3dCQUNFLElBQUksRUFBRSxnQkFBZ0I7d0JBQ3RCLEVBQUUsRUFBRSxRQUFRO3dCQUNaLElBQUksRUFBRSwyQkFBMkIsa0NBQWtDLEVBQUU7d0JBQ3JFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFO3FCQUNwSDtvQkFDRCxHQUFHLENBQ0QsWUFBWTt3QkFDVixDQUFDLENBQUM7NEJBQ0E7Z0NBQ0UsSUFBSSxFQUFFLHVCQUF1QjtnQ0FDN0IsRUFBRSxFQUFFLDhDQUE4QztnQ0FDbEQsRUFBRSxFQUFFLE9BQU87Z0NBQ1gsSUFBSSxFQUFFLHlCQUF5QixnQ0FBZ0MsRUFBRTtnQ0FDakUsSUFBSSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLGdDQUFnQyxFQUFFLGdCQUFnQixDQUFDLEVBQUU7NkJBQzNJO3lCQUNGO3dCQUNELENBQUMsQ0FBQyxFQUFFLENBQ1A7b0JBQ0QsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ3hCLE1BQU0sQ0FBQyxHQUFRLEVBQUUsR0FBSSxJQUFZLEVBQUUsQ0FBQzt3QkFDcEMsa0VBQWtFO3dCQUNsRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksOENBQThDLENBQUM7d0JBQzlELE9BQU8sQ0FBQyxDQUFDO29CQUNYLENBQUMsQ0FBQztpQkFDSDthQUNGLENBQUM7UUFDSixDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRztZQUN0QixJQUFJLEVBQUUseUJBQXlCO1lBQy9CLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssZUFBZSxDQUFDO1lBQ3ZGLE1BQU0sRUFBRSxDQUFDLGVBQWUsQ0FBQztZQUN6QixXQUFXLEVBQUUsRUFBRSxRQUFRLEVBQUUsK0JBQWEsQ0FBQyxJQUFJLEVBQUU7WUFDN0MsS0FBSyxFQUFFO2dCQUNMO29CQUNFLElBQUksRUFBRSx3QkFBd0I7b0JBQzlCLElBQUksRUFBRSw2QkFBNkIsb0NBQW9DLEVBQUU7b0JBQ3pFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUU7aUJBQ2hDO2dCQUNELEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxFQUFFO2FBQ2xFO1NBQ0YsQ0FBQztRQUVGLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVPLHlCQUF5QixDQUFDLEtBQXFDO1FBQ3JFLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDL0MsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUVoRCx3REFBd0Q7UUFDeEQsTUFBTSxxQkFBcUIsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDL0UsTUFBTSx1QkFBdUIsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFaEYsaUZBQWlGO1FBQ2pGLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLEtBQUssQ0FBQywwRUFBMEUsQ0FBQyxDQUFDO1FBQzlGLENBQUM7UUFFRCxJQUFJLENBQUMsb0JBQW9CLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ3RELE1BQU0sSUFBSSxLQUFLLENBQUMsd0VBQXdFLENBQUMsQ0FBQztRQUM1RixDQUFDO0lBQ0gsQ0FBQzs7QUEzTUgsOERBNE1DOzs7QUEzTWdCLHVDQUFhLEdBQUcsS0FBSyxDQUFDO0FBOE12QyxTQUFTLFdBQVcsQ0FBQyxLQUFhLEVBQUUsTUFBYyxFQUFFLFdBQW1CO0lBQ3JFLDBFQUEwRTtJQUMxRSxNQUFNLEtBQUssR0FBRztRQUNaLDJCQUEyQjtRQUMzQix3QkFBd0IsV0FBVyxJQUFJO1FBQ3ZDLGlHQUFpRztRQUNqRyxtRUFBbUU7UUFDbkUseUVBQXlFO1FBQ3pFLDBGQUEwRjtRQUMxRixvQ0FBb0MsS0FBSyxJQUFJO1FBQzdDLDhEQUE4RCxLQUFLLHVCQUF1QixNQUFNLDREQUE0RDtRQUM1SiwyQkFBMkI7UUFDM0IsOERBQThEO1FBQzlELGlFQUFpRTtRQUNqRSxrQ0FBa0M7UUFDbEMsa0NBQWtDO1FBQ2xDLCtDQUErQztRQUMvQywwQ0FBMEM7UUFDMUMsK0RBQStEO1FBQy9ELHlHQUF5RztRQUN6RyxrQkFBa0I7UUFDbEIsR0FBRztRQUNILGtOQUFrTjtRQUNsTiwrSEFBK0g7UUFDL0gsc0NBQXNDO1FBQ3RDLHlKQUF5SixLQUFLLFFBQVE7UUFDdEssa0JBQWtCO1FBQ2xCLGlDQUFpQztRQUNqQyxxSkFBcUosS0FBSyxRQUFRO1FBQ2xLLHNDQUFzQztRQUN0QyxVQUFVO1FBQ1YsaUNBQWlDO1FBQ2pDLCtCQUErQjtRQUMvQixxSUFBcUk7UUFDckksR0FBRztRQUNILG1DQUFtQztLQUNwQyxDQUFDO0lBQ0YsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFHRCxTQUFTLGFBQWE7SUFDcEIsT0FBTztRQUNMLGFBQWE7UUFDYixRQUFRO1FBQ1IsMkRBQTJEO1FBQzNELGlDQUFpQztRQUNqQyxFQUFFO1FBQ0YsZ0JBQWdCO1FBQ2hCLGlCQUFpQjtRQUNqQixnQkFBZ0I7UUFDaEIsRUFBRTtRQUNGLG1CQUFtQjtRQUNuQiwyRUFBMkU7UUFDM0UsNkJBQTZCO1FBQzdCLGtGQUFrRjtRQUNsRixzREFBc0Q7UUFDdEQsY0FBYztZQUNaLG1CQUFtQjtZQUNuQixpRUFBaUU7WUFDakUsNkZBQTZGO1lBQzdGLHlFQUF5RTtZQUN6RSxnT0FBZ087WUFDbE8sSUFBSTtZQUNKLGtDQUFrQztRQUNsQyxxQ0FBcUM7UUFDckMsaUVBQWlFO1FBQ2pFLHFIQUFxSDtRQUNySCwwRkFBMEY7UUFDMUYsTUFBTTtRQUNOLE1BQU07UUFDTixFQUFFO1FBQ0Ysb0RBQW9EO1FBQ3BELHNFQUFzRTtRQUN0RSx1RUFBdUU7UUFDdkUsOERBQThEO1FBQzlELEVBQUU7UUFDRixxQ0FBcUM7UUFDckMsbUNBQW1DO1FBQ25DLGtHQUFrRztRQUNsRyxJQUFJO0tBQ0wsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsQ0FBUztJQUM1QixPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNoRixDQUFDO0FBR0QsU0FBUyxxQkFBcUIsQ0FBQyxRQUFnQixFQUFFLE1BQWMsTUFBTSxFQUFFLFlBQW9CLDRCQUE0QjtJQUNySCxNQUFNLElBQUksR0FBRyxHQUFHLFFBQVEsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNqQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksU0FBUyxFQUFFLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsU0FBUyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFDekMsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBQ0QscURBQXFEO0lBQ3JELE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzdELENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxDQUFTO0lBQzlCLDRGQUE0RjtJQUM1RiwyQ0FBMkM7SUFDM0MsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM3QyxpQ0FBaUM7SUFDakMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLHFFQUFxRTtJQUNyRSxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEMsZ0ZBQWdGO0lBQ2hGLEdBQUcsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDeEIsa0RBQWtEO0lBQ2xELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbEMsR0FBRyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdpdEh1YiwgR2l0aHViV29ya2Zsb3cgfSBmcm9tICdwcm9qZW4vbGliL2dpdGh1Yic7XG5pbXBvcnQgeyBKb2JQZXJtaXNzaW9uIH0gZnJvbSAncHJvamVuL2xpYi9naXRodWIvd29ya2Zsb3dzLW1vZGVsJztcbmltcG9ydCB7IENka0RyaWZ0RGV0ZWN0aW9uU2NyaXB0IH0gZnJvbSAnLi9iaW4vY2RrLWRyaWZ0LWRldGVjdGlvbi1zY3JpcHQnO1xuXG5jb25zdCBnaXRodWJBY3Rpb25zQXdzQ3JlZGVudGlhbHNWZXJzaW9uID0gJ3Y1JztcbmNvbnN0IGdpdGh1YkFjdGlvbnNDaGVja291dFZlcnNpb24gPSAndjUnO1xuY29uc3QgZ2l0aHViQWN0aW9uc1NldHVwTm9kZVZlcnNpb24gPSAndjUnO1xuY29uc3QgZ2l0aHViQWN0aW9uc1VwbG9hZEFydGlmYWN0VmVyc2lvbiA9ICd2NCc7XG5jb25zdCBnaXRodWJBY3Rpb25zRG93bmxvYWRBcnRpZmFjdFZlcnNpb24gPSAndjUnO1xuY29uc3QgZ2l0aHViQWN0aW9uc0dpdGh1YlNjcmlwdFZlcnNpb24gPSAndjgnO1xuXG5jb25zdCBNQVhfV09SS0ZMT1dfRklMRU5BTUVfTEVOR1RIID0gMjU1O1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrIHtcbiAgcmVhZG9ubHkgc3RhY2tOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRyaWZ0RGV0ZWN0aW9uUm9sZVRvQXNzdW1lUmVnaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRyaWZ0RGV0ZWN0aW9uUm9sZVRvQXNzdW1lQXJuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGZhaWxPbkRyaWZ0PzogYm9vbGVhbjsgLy8gaWYgdHJ1ZSwgZmFpbCBqb2Igd2hlbiBkcmlmdCBkZXRlY3RlZCAoZGVmYXVsdCB0cnVlKVxuICByZWFkb25seSBvaWRjUm9sZUFybj86IHN0cmluZzsgLy8gT3B0aW9uYWwgb3ZlcnJpZGUgZm9yIE9JREMgcm9sZVxuICByZWFkb25seSBvaWRjUmVnaW9uPzogc3RyaW5nOyAvLyBPcHRpb25hbCBvdmVycmlkZSBmb3IgT0lEQyByZWdpb25cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDZGtEcmlmdERldGVjdGlvbldvcmtmbG93UHJvcHMge1xuICByZWFkb25seSBzY3JpcHRPdXRwdXRQYXRoPzogc3RyaW5nO1xuICByZWFkb25seSBwcm9qZWN0OiBhbnk7IC8vIGF2b2lkIGV4cG9ydGluZyBwcm9qZW4gdHlwZXMgaW4gcHVibGljIEFQSVxuICByZWFkb25seSB3b3JrZmxvd05hbWU/OiBzdHJpbmc7IC8vIHdvcmtmbG93IHdvcmtmbG93TmFtZSAoYWxzbyB1c2VkIHRvIGRlcml2ZSBmaWxlIHdvcmtmbG93TmFtZSlcbiAgcmVhZG9ubHkgc2NoZWR1bGU/OiBzdHJpbmc7IC8vIGNyb24gZXhwcmVzc2lvbiwgZS5nLiAnMCAwICogKiAqJ1xuICByZWFkb25seSBjcmVhdGVJc3N1ZXM/OiBib29sZWFuOyAvLyBjcmVhdGUvdXBkYXRlIGlzc3VlIHdoZW4gZHJpZnQgZGV0ZWN0ZWQgb24gc2NoZWR1bGUgKGRlZmF1bHQgdHJ1ZSlcbiAgcmVhZG9ubHkgb2lkY1JvbGVBcm4/OiBzdHJpbmc7IC8vIGRlZmF1bHQgT0lEQyByb2xlIEFSTiB0byBhc3N1bWUgZm9yIGFsbCBzdGFja3MgKG9yIGVhY2ggc3RhY2sgbXVzdCBoYXZlIGl0cyBvd24pXG4gIHJlYWRvbmx5IG9pZGNSZWdpb24/OiBzdHJpbmc7IC8vIGRlZmF1bHQgT0lEQyByZWdpb24gdG8gYXNzdW1lIGZvciBhbGwgc3RhY2tzIChvciBlYWNoIHN0YWNrIG11c3QgaGF2ZSBpdHMgb3duKVxuICByZWFkb25seSBzdGFja3M6IFN0YWNrW107XG4gIHJlYWRvbmx5IG5vZGVWZXJzaW9uPzogc3RyaW5nOyAvLyBlLmcuLCAnMjQueCdcbiAgLyoqXG4gICAqIFdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgQ0RLIGFwcCwgcmVsYXRpdmUgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdC5cbiAgICogVXNlZnVsIGZvciBtb25vcmVwb3Mgd2hlcmUgaW5mcmFzdHJ1Y3R1cmUgbGl2ZXMgaW4gYSBzdWJkaXJlY3RvcnkgKGUuZy4sICdpbmZyYScpLlxuICAgKlxuICAgKiBXaGVuIHNldCwgYWxsIHdvcmtmbG93IHJ1biBzdGVwcyB3aWxsIHVzZSBgZGVmYXVsdHMucnVuLndvcmtpbmctZGlyZWN0b3J5YFxuICAgKiBhbmQgYXJ0aWZhY3Qvc2NyaXB0IHBhdGhzIHdpbGwgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcmVwb3NpdG9yeSByb290XG4gICAqL1xuICByZWFkb25seSB3b3JraW5nRGlyZWN0b3J5Pzogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgaG9vayB0byBhcHBlbmQgYWRkaXRpb25hbCBHaXRIdWIgQWN0aW9ucyBzdGVwcyBhZnRlciBkcmlmdCBkZXRlY3Rpb24gcGVyIHN0YWNrLlxuICAgKiBZb3UgY2FuIHN1cHBseSBhIHN0YXRpYyBhcnJheSBvZiBzdGVwcywgb3IgYSBmYWN0b3J5IHRoYXQgcmVjZWl2ZXMgY29udGV4dCBhbmQgcmV0dXJucyBzdGVwcy5cbiAgICovXG4gIC8qKlxuICAgKiBPcHRpb25hbCBhZGRpdGlvbmFsIEdpdEh1YiBBY3Rpb24gc3RlcHMgdG8gcnVuIGFmdGVyIGRyaWZ0IGRldGVjdGlvbiBmb3IgZWFjaCBzdGFjay5cbiAgICogVGhlc2Ugc3RlcHMgcnVuIGFmdGVyIHJlc3VsdHMgYXJlIHVwbG9hZGVkIGZvciBlYWNoIHN0YWNrLiBZb3UgY2FuIGluY2x1ZGVcbiAgICogYW55IG5vdGlmaWNhdGlvbnMgeW91IGxpa2UgKGUuZy4sIFNsYWNrKS4gUHJvdmlkZSBleHBsaWNpdCBpbnB1dHMgKGUuZy4sIHBheWxvYWQvbWFya2Rvd24pXG4gICAqIGRpcmVjdGx5IGluIHlvdXIgc3RlcCB3aXRob3V0IHJlbHlpbmcgb24gYSBwcmUtZ2VuZXJhdGVkIHBheWxvYWQuXG4gICAqL1xuICAvLyBOT1RFOiBqc2lpIGRvZXMgbm90IHN1cHBvcnQgZnVuY3Rpb24gdHlwZXMgaW4gcHVibGljIEFQSXM7IHVzZSAnYW55JyBoZXJlIGFuZCBhY2NlcHQgZWl0aGVyOlxuICAvLyAtIEFuIGFycmF5IG9mIEdpdEh1YiBzdGVwcywgb3JcbiAgLy8gLSBBIGZ1bmN0aW9uIChjdHg6IHsgc3RhY2s6IHN0cmluZyB9KSA9PiBHaXRIdWJTdGVwW11cbiAgLy8gVGhlIGNvbnN0cnVjdG9yIGhhbmRsZXMgYm90aCBhdCBydW50aW1lLlxuICByZWFkb25seSBwb3N0R2l0SHViU3RlcHM/OiBhbnk7XG59XG5cbnR5cGUgR2l0SHViU3RlcCA9IHtcbiAgbmFtZT86IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICB1c2VzPzogc3RyaW5nO1xuICBydW4/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb250aW51ZU9uRXJyb3I/OiBib29sZWFuO1xuICBzaGVsbD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBDZGtEcmlmdERldGVjdGlvbldvcmtmbG93IHtcbiAgcHJpdmF0ZSBzdGF0aWMgc2NyaXB0Q3JlYXRlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBDZGtEcmlmdERldGVjdGlvbldvcmtmbG93UHJvcHMpIHtcbiAgICAvLyBWYWxpZGF0ZSBPSURDIGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLnZhbGlkYXRlT2lkY0NvbmZpZ3VyYXRpb24ocHJvcHMpO1xuXG4gICAgY29uc3QgbmFtZSA9IHByb3BzLndvcmtmbG93TmFtZSA/PyAnZHJpZnQtZGV0ZWN0aW9uJztcbiAgICBjb25zdCBmaWxlTmFtZSA9IGJ1aWxkV29ya2Zsb3dGaWxlTmFtZSh0b0tlYmFiQ2FzZShuYW1lKSk7XG4gICAgY29uc3Qgbm9kZVZlcnNpb24gPSBwcm9wcy5ub2RlVmVyc2lvbiA/PyAnMjQueCc7XG4gICAgY29uc3QgY3JlYXRlSXNzdWVzID0gcHJvcHMuY3JlYXRlSXNzdWVzID8/IHRydWU7XG4gICAgY29uc3QgcHJvamVjdCA9IHByb3BzLnByb2plY3Q7XG4gICAgY29uc3Qgc2NyaXB0T3V0cHV0UGF0aD0gcHJvcHMuc2NyaXB0T3V0cHV0UGF0aCA/PyAnLmdpdGh1Yi93b3JrZmxvd3Mvc2NyaXB0cy9kZXRlY3QtZHJpZnQudHMnO1xuXG4gICAgLy8gTm9ybWFsaXplIHdvcmtpbmcgZGlyZWN0b3J5OiBzdHJpcCB0cmFpbGluZyBzbGFzaGVzXG4gICAgY29uc3Qgd2QgPSBwcm9wcy53b3JraW5nRGlyZWN0b3J5Py5yZXBsYWNlKC9cXC8rJC8sICcnKTtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHdkID8geyBydW46IHsgd29ya2luZ0RpcmVjdG9yeTogd2QgfSB9IDogdW5kZWZpbmVkO1xuXG4gICAgLy8gT25seSBjcmVhdGUgdGhlIGRyaWZ0IGRldGVjdGlvbiBzY3JpcHQgb25jZSB0byBhdm9pZCBjb2xsaXNpb25zXG4gICAgaWYgKCFDZGtEcmlmdERldGVjdGlvbldvcmtmbG93LnNjcmlwdENyZWF0ZWQpIHtcbiAgICAgIG5ldyBDZGtEcmlmdERldGVjdGlvblNjcmlwdCh7XG4gICAgICAgIHByb2plY3Q6IHByb3BzLnByb2plY3QsXG4gICAgICAgIG91dHB1dFBhdGg6IHNjcmlwdE91dHB1dFBhdGgsXG4gICAgICB9KTtcbiAgICAgIENka0RyaWZ0RGV0ZWN0aW9uV29ya2Zsb3cuc2NyaXB0Q3JlYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZ2ggPSAocHJvamVjdCBhcyBhbnkpLmdpdGh1YiA/PyBuZXcgR2l0SHViKHByb2plY3QpO1xuICAgIGNvbnN0IHdvcmtmbG93ID0gbmV3IEdpdGh1YldvcmtmbG93KGdoLCBuYW1lLCB7IGZpbGVOYW1lIH0pO1xuXG4gICAgLy8gdHJpZ2dlcnM6IHNjaGVkdWxlICsgbWFudWFsIGRpc3BhdGNoIHdpdGggc3RhY2sgY2hvaWNlXG4gICAgY29uc3Qgc3RhY2tDaG9pY2VzID0gWydhbGwnLCAuLi5wcm9wcy5zdGFja3MubWFwKChzKSA9PiBzLnN0YWNrTmFtZSldO1xuICAgIHdvcmtmbG93Lm9uKHtcbiAgICAgIHNjaGVkdWxlOiBwcm9wcy5zY2hlZHVsZSA/IFt7IGNyb246IHByb3BzLnNjaGVkdWxlIH1dIDogdW5kZWZpbmVkLFxuICAgICAgd29ya2Zsb3dEaXNwYXRjaDoge1xuICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICBzdGFjazoge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiU3RhY2sgdG8gY2hlY2sgZm9yIGRyaWZ0ICgnYWxsJyB0byBydW4gZXZlcnkgc3RhY2spXCIsXG4gICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICB0eXBlOiAnY2hvaWNlJyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHN0YWNrQ2hvaWNlcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIE9uZSBqb2IgcGVyIHN0YWNrXG4gICAgY29uc3Qgam9iczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBzdGFjayBvZiBwcm9wcy5zdGFja3MpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZFN0YWNrTmFtZSA9IHRvS2ViYWJDYXNlKHRvR2l0aHViSm9iSWQoc3RhY2suc3RhY2tOYW1lKSk7XG4gICAgICBjb25zdCBvcmlnaW5hbFN0YWNrTmFtZSA9IHN0YWNrLnN0YWNrTmFtZTtcbiAgICAgIGNvbnN0IGpvYklkID0gYGRyaWZ0LSR7c2FuaXRpemVkU3RhY2tOYW1lfWA7XG4gICAgICBjb25zdCByZXN1bHRzRmlsZSA9IGBkcmlmdC1yZXN1bHRzLSR7c2FuaXRpemVkU3RhY2tOYW1lfS5qc29uYDtcbiAgICAgIGNvbnN0IGlubmVyQ29uZCA9IFwiZ2l0aHViLmV2ZW50X25hbWUgPT0gJ3NjaGVkdWxlJyB8fCAhZ2l0aHViLmV2ZW50LmlucHV0cy5zdGFjayB8fCBnaXRodWIuZXZlbnQuaW5wdXRzLnN0YWNrID09ICdhbGwnIHx8IGdpdGh1Yi5ldmVudC5pbnB1dHMuc3RhY2sgPT0gJ1wiICsgc2FuaXRpemVkU3RhY2tOYW1lICsgXCInIHx8IGdpdGh1Yi5ldmVudC5pbnB1dHMuc3RhY2sgPT0gJ1wiICsgb3JpZ2luYWxTdGFja05hbWUgKyBcIidcIjtcbiAgICAgIGNvbnN0IGNvbmRFeHByID0gJyR7eyAnICsgaW5uZXJDb25kICsgJyB9fSc7XG4gICAgICBjb25zdCBub3RDb25kRXhwciA9ICcke3sgISgnICsgaW5uZXJDb25kICsgJykgfX0nO1xuXG4gICAgICBjb25zdCByYXdQb3N0ID0gcHJvcHMucG9zdEdpdEh1YlN0ZXBzO1xuICAgICAgY29uc3QgcG9zdFN0ZXBzOiBHaXRIdWJTdGVwW10gPSB0eXBlb2YgcmF3UG9zdCA9PT0gJ2Z1bmN0aW9uJyA/IChyYXdQb3N0IGFzIChjdHg6IHsgc3RhY2s6IHN0cmluZyB9KSA9PiBHaXRIdWJTdGVwW10pKHsgc3RhY2s6IHNhbml0aXplZFN0YWNrTmFtZSB9KSA6IChyYXdQb3N0ID8/IFtdKTtcblxuICAgICAgLy8gUHJlZml4IHJlc3VsdHMgZmlsZSBwYXRoIGZvciB1c2VzOiBzdGVwcyAod2hpY2ggaWdub3JlIGRlZmF1bHRzLnJ1bi53b3JraW5nLWRpcmVjdG9yeSlcbiAgICAgIGNvbnN0IGFydGlmYWN0UmVzdWx0c1BhdGggPSB3ZCA/IGAke3dkfS8ke3Jlc3VsdHNGaWxlfWAgOiByZXN1bHRzRmlsZTtcbiAgICAgIGNvbnN0IGlzc3VlUmVzdWx0c1BhdGggPSB3ZCA/IGAke3dkfS8ke3Jlc3VsdHNGaWxlfWAgOiByZXN1bHRzRmlsZTtcblxuICAgICAgam9ic1tqb2JJZF0gPSB7XG4gICAgICAgIG5hbWU6IGBEcmlmdCBEZXRlY3Rpb24gLSAke3Nhbml0aXplZFN0YWNrTmFtZX1gLFxuICAgICAgICBydW5zT246IFsndWJ1bnR1LWxhdGVzdCddLFxuICAgICAgICAuLi4oZGVmYXVsdHMgJiYgeyBkZWZhdWx0cyB9KSxcbiAgICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgICBjb250ZW50czogSm9iUGVybWlzc2lvbi5SRUFELFxuICAgICAgICAgIGlkVG9rZW46IEpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICAgICAgaXNzdWVzOiBKb2JQZXJtaXNzaW9uLldSSVRFLFxuICAgICAgICB9LFxuICAgICAgICBlbnY6IHtcbiAgICAgICAgICBBV1NfREVGQVVMVF9SRUdJT046IHN0YWNrLmRyaWZ0RGV0ZWN0aW9uUm9sZVRvQXNzdW1lUmVnaW9uLFxuICAgICAgICAgIEFXU19SRUdJT046IHN0YWNrLmRyaWZ0RGV0ZWN0aW9uUm9sZVRvQXNzdW1lUmVnaW9uLFxuICAgICAgICAgIERSSUZUX0RFVEVDVElPTl9PVVRQVVQ6IHJlc3VsdHNGaWxlLFxuICAgICAgICAgIFNUQUNLX0lEOiBzYW5pdGl6ZWRTdGFja05hbWUsXG4gICAgICAgICAgU1RBQ0tfTkFNRTogc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICB9LFxuICAgICAgICAvLyBObyBqb2ItbGV2ZWwgY29uZGl0aW9uOyB3ZSBnYXRlIHN0ZXBzIHNvIHRoZSBqb2IgYWx3YXlzIGNvbXBsZXRlcyBhbmQgc3VtbWFyeSBjYW4gcnVuXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAgeyBuYW1lOiAnU2tpcCAoc3RhY2sgbm90IHNlbGVjdGVkKScsIGlmOiBub3RDb25kRXhwciwgcnVuOiAnZWNobyBcIlN0YWNrIG5vdCBzZWxlY3RlZDsgc2tpcHBpbmcgZHJpZnQgZGV0ZWN0aW9uIGZvciB0aGlzIGpvYi5cIicgfSxcbiAgICAgICAgICB7IG5hbWU6ICdDaGVja291dCcsIGlmOiBjb25kRXhwciwgdXNlczogYGFjdGlvbnMvY2hlY2tvdXRAJHtnaXRodWJBY3Rpb25zQ2hlY2tvdXRWZXJzaW9ufWAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnU2V0dXAgTm9kZS5qcycsXG4gICAgICAgICAgICBpZjogY29uZEV4cHIsXG4gICAgICAgICAgICB1c2VzOiBgYWN0aW9ucy9zZXR1cC1ub2RlQCR7Z2l0aHViQWN0aW9uc1NldHVwTm9kZVZlcnNpb259YCxcbiAgICAgICAgICAgIHdpdGg6IHsgJ25vZGUtdmVyc2lvbic6IG5vZGVWZXJzaW9uIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IG5hbWU6ICdJbnN0YWxsIGRlcGVuZGVuY2llcycsIGlmOiBjb25kRXhwciwgcnVuOiAneWFybiBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlIHx8IG5wbSBjaScsIGVudjogeyBHSVRIVUJfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nIH0gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnQVdTIENyZWRlbnRpYWxzJyxcbiAgICAgICAgICAgIGlmOiBjb25kRXhwcixcbiAgICAgICAgICAgIGlkOiAnY3JlZHMnLFxuICAgICAgICAgICAgdXNlczogYGF3cy1hY3Rpb25zL2NvbmZpZ3VyZS1hd3MtY3JlZGVudGlhbHNAJHtnaXRodWJBY3Rpb25zQXdzQ3JlZGVudGlhbHNWZXJzaW9ufWAsXG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgICdyb2xlLXRvLWFzc3VtZSc6IHN0YWNrLm9pZGNSb2xlQXJuID8/IHByb3BzLm9pZGNSb2xlQXJuLFxuICAgICAgICAgICAgICAncm9sZS1zZXNzaW9uLW5hbWUnOiAnR2l0SHViQWN0aW9uJyxcbiAgICAgICAgICAgICAgJ2F3cy1yZWdpb24nOiBzdGFjay5vaWRjUmVnaW9uID8/IHByb3BzLm9pZGNSZWdpb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0Fzc3VtZSBEcmlmdCBEZXRlY3Rpb24gUm9sZScsXG4gICAgICAgICAgICBpZjogY29uZEV4cHIsXG4gICAgICAgICAgICB1c2VzOiBgYXdzLWFjdGlvbnMvY29uZmlndXJlLWF3cy1jcmVkZW50aWFsc0Ake2dpdGh1YkFjdGlvbnNBd3NDcmVkZW50aWFsc1ZlcnNpb259YCxcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgJ3JvbGUtdG8tYXNzdW1lJzogc3RhY2suZHJpZnREZXRlY3Rpb25Sb2xlVG9Bc3N1bWVBcm4sXG4gICAgICAgICAgICAgICdyb2xlLWNoYWluaW5nJzogdHJ1ZSxcbiAgICAgICAgICAgICAgJ3JvbGUtc2tpcC1zZXNzaW9uLXRhZ2dpbmcnOiB0cnVlLFxuICAgICAgICAgICAgICAnYXdzLXJlZ2lvbic6IHN0YWNrLmRyaWZ0RGV0ZWN0aW9uUm9sZVRvQXNzdW1lUmVnaW9uLFxuICAgICAgICAgICAgICAnYXdzLWFjY2Vzcy1rZXktaWQnOiAnJHt7IHN0ZXBzLmNyZWRzLm91dHB1dHMuYXdzLWFjY2Vzcy1rZXktaWQgfX0nLFxuICAgICAgICAgICAgICAnYXdzLXNlY3JldC1hY2Nlc3Mta2V5JzogJyR7eyBzdGVwcy5jcmVkcy5vdXRwdXRzLmF3cy1zZWNyZXQtYWNjZXNzLWtleSB9fScsXG4gICAgICAgICAgICAgICdhd3Mtc2Vzc2lvbi10b2tlbic6ICcke3sgc3RlcHMuY3JlZHMub3V0cHV0cy5hd3Mtc2Vzc2lvbi10b2tlbiB9fScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0RldGVjdCBkcmlmdCcsXG4gICAgICAgICAgICBpZjogY29uZEV4cHIsXG4gICAgICAgICAgICBpZDogJ2RyaWZ0JyxcbiAgICAgICAgICAgIGNvbnRpbnVlT25FcnJvcjogdHJ1ZSwgLy8gYWxsb3cgYXJ0aWZhY3QgdXBsb2FkIGFuZCBpc3N1ZSBjcmVhdGlvbiBldmVuIHdoZW4gZHJpZnQgaXMgZGV0ZWN0ZWRcbiAgICAgICAgICAgIHJ1bjogW1xuICAgICAgICAgICAgICAnc2V0ICtlJyxcbiAgICAgICAgICAgICAgLy8gVXNlIHRoZSBidW5kbGVkIHNjcmlwdCBmcm9tIHRoaXMgcGFja2FnZVxuICAgICAgICAgICAgICAnbm9kZSAuL25vZGVfbW9kdWxlcy9AampyYXdsaW5zL2Nkay1kaWZmLXByLWdpdGh1Yi1hY3Rpb24vbGliL2Jpbi9kZXRlY3QtZHJpZnQuanMnLFxuICAgICAgICAgICAgICAnc3RhdHVzPSQ/JyxcbiAgICAgICAgICAgICAgJ2lmIFsgLWYgXCIkRFJJRlRfREVURUNUSU9OX09VVFBVVFwiIF07IHRoZW4gZWNobyBcIlJlc3VsdHMgZmlsZSBjcmVhdGVkOiAkRFJJRlRfREVURUNUSU9OX09VVFBVVFwiOyBmaScsXG4gICAgICAgICAgICAgIC8vIEV4cG9zZSB1c2VmdWwgb3V0cHV0cyBmb3IgZG93bnN0cmVhbSBzdGVwc1xuICAgICAgICAgICAgICBcIlNUQUNLX0FSTj0kKGF3cyBjbG91ZGZvcm1hdGlvbiBkZXNjcmliZS1zdGFja3MgLS1zdGFjay1uYW1lIFxcXCIkU1RBQ0tfTkFNRVxcXCIgLS1xdWVyeSAnU3RhY2tzWzBdLlN0YWNrSWQnIC0tb3V0cHV0IHRleHQgMj4vZGV2L251bGwgfHwgdHJ1ZSlcIixcbiAgICAgICAgICAgICAgJ2VjaG8gXCJzdGFjay1hcm49JFNUQUNLX0FSTlwiID4+IFwiJEdJVEhVQl9PVVRQVVRcIicsXG4gICAgICAgICAgICAgICdleGl0ICRzdGF0dXMnLFxuICAgICAgICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICBTVEFDS19OQU1FOiBzdGFjay5zdGFja05hbWUsXG4gICAgICAgICAgICAgIEFXU19SRUdJT046IHN0YWNrLmRyaWZ0RGV0ZWN0aW9uUm9sZVRvQXNzdW1lUmVnaW9uLFxuICAgICAgICAgICAgICBEUklGVF9ERVRFQ1RJT05fT1VUUFVUOiByZXN1bHRzRmlsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnVXBsb2FkIHJlc3VsdHMnLFxuICAgICAgICAgICAgaWY6IGNvbmRFeHByLFxuICAgICAgICAgICAgdXNlczogYGFjdGlvbnMvdXBsb2FkLWFydGlmYWN0QCR7Z2l0aHViQWN0aW9uc1VwbG9hZEFydGlmYWN0VmVyc2lvbn1gLFxuICAgICAgICAgICAgd2l0aDogeyAnbmFtZSc6IGBkcmlmdC1yZXN1bHRzLSR7c2FuaXRpemVkU3RhY2tOYW1lfWAsICdwYXRoJzogYXJ0aWZhY3RSZXN1bHRzUGF0aCwgJ2lmLW5vLWZpbGVzLWZvdW5kJzogJ2lnbm9yZScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLihcbiAgICAgICAgICAgIGNyZWF0ZUlzc3Vlc1xuICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnQ3JlYXRlIElzc3VlIG9uIERyaWZ0JyxcbiAgICAgICAgICAgICAgICAgIGlmOiBcImFsd2F5cygpICYmIHN0ZXBzLmRyaWZ0Lm91dGNvbWUgPT0gJ2ZhaWx1cmUnXCIsXG4gICAgICAgICAgICAgICAgICBpZDogJ2lzc3VlJyxcbiAgICAgICAgICAgICAgICAgIHVzZXM6IGBhY3Rpb25zL2dpdGh1Yi1zY3JpcHRAJHtnaXRodWJBY3Rpb25zR2l0aHViU2NyaXB0VmVyc2lvbn1gLFxuICAgICAgICAgICAgICAgICAgd2l0aDogeyAncmVzdWx0LWVuY29kaW5nJzogJ3N0cmluZycsICdzY3JpcHQnOiBpc3N1ZVNjcmlwdChzYW5pdGl6ZWRTdGFja05hbWUsIHN0YWNrLmRyaWZ0RGV0ZWN0aW9uUm9sZVRvQXNzdW1lUmVnaW9uLCBpc3N1ZVJlc3VsdHNQYXRoKSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgOiBbXVxuICAgICAgICAgICksXG4gICAgICAgICAgLi4ucG9zdFN0ZXBzLm1hcCgoc3RlcCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgczogYW55ID0geyAuLi4oc3RlcCBhcyBhbnkpIH07XG4gICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBvbmx5IHJ1biBleHRyYSBub3RpZmljYXRpb24gc3RlcHMgd2hlbiBkcmlmdCBvY2N1cnNcbiAgICAgICAgICAgIHMuaWYgPSBzLmlmID8/IFwiYWx3YXlzKCkgJiYgc3RlcHMuZHJpZnQub3V0Y29tZSA9PSAnZmFpbHVyZSdcIjtcbiAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBzdW1tYXJ5IGFnZ3JlZ2F0b3Igam9iXG4gICAgam9ic1snZHJpZnQtc3VtbWFyeSddID0ge1xuICAgICAgbmFtZTogJ0RyaWZ0IERldGVjdGlvbiBTdW1tYXJ5JyxcbiAgICAgIG5lZWRzOiBPYmplY3Qua2V5cyhqb2JzKS5maWx0ZXIoKGopID0+IGouc3RhcnRzV2l0aCgnZHJpZnQtJykgJiYgaiAhPT0gJ2RyaWZ0LXN1bW1hcnknKSxcbiAgICAgIHJ1bnNPbjogWyd1YnVudHUtbGF0ZXN0J10sXG4gICAgICBwZXJtaXNzaW9uczogeyBjb250ZW50czogSm9iUGVybWlzc2lvbi5SRUFEIH0sXG4gICAgICBzdGVwczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0Rvd25sb2FkIGFsbCBhcnRpZmFjdHMnLFxuICAgICAgICAgIHVzZXM6IGBhY3Rpb25zL2Rvd25sb2FkLWFydGlmYWN0QCR7Z2l0aHViQWN0aW9uc0Rvd25sb2FkQXJ0aWZhY3RWZXJzaW9ufWAsXG4gICAgICAgICAgd2l0aDogeyBwYXRoOiAnZHJpZnQtcmVzdWx0cycgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBuYW1lOiAnR2VuZXJhdGUgc3VtbWFyeScsIHNoZWxsOiAnYmFzaCcsIHJ1bjogc3VtbWFyeVNjcmlwdCgpIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICB3b3JrZmxvdy5hZGRKb2JzKGpvYnMpO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZU9pZGNDb25maWd1cmF0aW9uKHByb3BzOiBDZGtEcmlmdERldGVjdGlvbldvcmtmbG93UHJvcHMpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNEZWZhdWx0T2lkY1JvbGUgPSAhIXByb3BzLm9pZGNSb2xlQXJuO1xuICAgIGNvbnN0IGhhc0RlZmF1bHRPaWRjUmVnaW9uID0gISFwcm9wcy5vaWRjUmVnaW9uO1xuXG4gICAgLy8gQ2hlY2sgaWYgYWxsIHN0YWNrcyBoYXZlIHRoZWlyIG93biBPSURDIGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBhbGxTdGFja3NIYXZlT2lkY1JvbGUgPSBwcm9wcy5zdGFja3MuZXZlcnkoc3RhY2sgPT4gISFzdGFjay5vaWRjUm9sZUFybik7XG4gICAgY29uc3QgYWxsU3RhY2tzSGF2ZU9pZGNSZWdpb24gPSBwcm9wcy5zdGFja3MuZXZlcnkoc3RhY2sgPT4gISFzdGFjay5vaWRjUmVnaW9uKTtcblxuICAgIC8vIEVpdGhlciBkZWZhdWx0cyBtdXN0IGJlIHByb3ZpZGVkIE9SIGFsbCBzdGFja3MgbXVzdCBoYXZlIHRoZWlyIG93biBPSURDIGNvbmZpZ1xuICAgIGlmICghaGFzRGVmYXVsdE9pZGNSb2xlICYmICFhbGxTdGFja3NIYXZlT2lkY1JvbGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRWl0aGVyIHByb3ZpZGUgZGVmYXVsdCBvaWRjUm9sZUFybiBvciBzcGVjaWZ5IG9pZGNSb2xlQXJuIGZvciBlYWNoIHN0YWNrJyk7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNEZWZhdWx0T2lkY1JlZ2lvbiAmJiAhYWxsU3RhY2tzSGF2ZU9pZGNSZWdpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRWl0aGVyIHByb3ZpZGUgZGVmYXVsdCBvaWRjUmVnaW9uIG9yIHNwZWNpZnkgb2lkY1JlZ2lvbiBmb3IgZWFjaCBzdGFjaycpO1xuICAgIH1cbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGlzc3VlU2NyaXB0KHN0YWNrOiBzdHJpbmcsIHJlZ2lvbjogc3RyaW5nLCByZXN1bHRzRmlsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQ29uc3RydWN0IGEgcGxhaW4gSlMgc2NyaXB0IHN0cmluZyAobm8gdGVtcGxhdGUgc3RyaW5nIG5lc3RpbmcgbWlzaGFwcylcbiAgY29uc3QgbGluZXMgPSBbXG4gICAgXCJjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XCIsXG4gICAgYGNvbnN0IHJlc3VsdHNGaWxlID0gJyR7cmVzdWx0c0ZpbGV9JztgLFxuICAgIFwiaWYgKCFmcy5leGlzdHNTeW5jKHJlc3VsdHNGaWxlKSkgeyBjb25zb2xlLmxvZygnTm8gcmVzdWx0cyBmaWxlIGZvdW5kJyk7IHJldHVybiAnTk9fUkVTVUxUUyc7IH1cIixcbiAgICBcImNvbnN0IHJlc3VsdHMgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhyZXN1bHRzRmlsZSwgJ3V0ZjgnKSk7XCIsXG4gICAgXCJjb25zdCBkcmlmdGVkU3RhY2tzID0gcmVzdWx0cy5maWx0ZXIociA9PiByLmRyaWZ0U3RhdHVzID09PSAnRFJJRlRFRCcpO1wiLFxuICAgIFwiaWYgKGRyaWZ0ZWRTdGFja3MubGVuZ3RoID09PSAwKSB7IGNvbnNvbGUubG9nKCdObyBkcmlmdCBkZXRlY3RlZCcpOyByZXR1cm4gJ05PX0RSSUZUJzsgfVwiLFxuICAgIGBjb25zdCB0aXRsZSA9ICdEcmlmdCBEZXRlY3RlZCBpbiAke3N0YWNrfSc7YCxcbiAgICBgbGV0IGJvZHkgPSAnIyMgRHJpZnQgRGV0ZWN0aW9uIFJlcG9ydFxcXFxuXFxcXG4nICsgJyoqU3RhY2s6KiogJHtzdGFja31cXFxcbicgKyAnKipSZWdpb246KiogJHtyZWdpb259XFxcXG4nICsgJyoqVGltZToqKiAnICsgbmV3IERhdGUoKS50b0lTT1N0cmluZygpICsgJ1xcXFxuXFxcXG4nO2AsXG4gICAgXCJib2R5ICs9ICcjIyMgU3VtbWFyeVxcXFxuJztcIixcbiAgICBcImJvZHkgKz0gJy0gVG90YWwgc3RhY2tzIGNoZWNrZWQ6ICcgKyByZXN1bHRzLmxlbmd0aCArICdcXFxcbic7XCIsXG4gICAgXCJib2R5ICs9ICctIERyaWZ0ZWQgc3RhY2tzOiAnICsgZHJpZnRlZFN0YWNrcy5sZW5ndGggKyAnXFxcXG5cXFxcbic7XCIsXG4gICAgXCJib2R5ICs9ICcjIyMgRHJpZnRlZCBTdGFja3NcXFxcbic7XCIsXG4gICAgJ2ZvciAoY29uc3QgcyBvZiBkcmlmdGVkU3RhY2tzKSB7JyxcbiAgICAnICBjb25zdCByZXNvdXJjZXMgPSBzLmRyaWZ0ZWRSZXNvdXJjZXMgfHwgW107JyxcbiAgICBcIiAgYm9keSArPSAnIyMjIyAnICsgcy5zdGFja05hbWUgKyAnXFxcXG4nO1wiLFxuICAgIFwiICBib2R5ICs9ICctIERyaWZ0ZWQgcmVzb3VyY2VzOiAnICsgcmVzb3VyY2VzLmxlbmd0aCArICdcXFxcbic7XCIsXG4gICAgXCIgIGZvciAoY29uc3QgciBvZiByZXNvdXJjZXMpIHsgYm9keSArPSAnICAtICcgKyByLmxvZ2ljYWxSZXNvdXJjZUlkICsgJyAoJyArIHIucmVzb3VyY2VUeXBlICsgJylcXFxcbic7IH1cIixcbiAgICBcIiAgYm9keSArPSAnXFxcXG4nO1wiLFxuICAgICd9JyxcbiAgICBcImJvZHkgKz0gJyMjIyBBY3Rpb24gUmVxdWlyZWRcXFxcbicgKyAnUGxlYXNlIHJldmlldyB0aGUgZHJpZnRlZCByZXNvdXJjZXMgYW5kIGVpdGhlcjpcXFxcbjEuIFVwZGF0ZSB0aGUgaW5mcmFzdHJ1Y3R1cmUgY29kZSB0byBtYXRjaCB0aGUgYWN0dWFsIHN0YXRlXFxcXG4yLiBSZXN0b3JlIHRoZSByZXNvdXJjZXMgdG8gbWF0Y2ggdGhlIGV4cGVjdGVkIHN0YXRlXFxcXG5cXFxcbic7XCIsXG4gICAgJ2JvZHkgKz0gYFtWaWV3IHdvcmtmbG93IHJ1bl0oJHtjb250ZXh0LnNlcnZlclVybH0vJHtjb250ZXh0LnJlcG8ub3duZXJ9LyR7Y29udGV4dC5yZXBvLnJlcG99L2FjdGlvbnMvcnVucy8ke2NvbnRleHQucnVuSWR9KWA7JyxcbiAgICAvLyBMaXN0IG9yIHVwZGF0ZSBhbiBpc3N1ZSB3aXRoIGxhYmVsc1xuICAgIGBjb25zdCBpc3N1ZXMgPSBhd2FpdCBnaXRodWIucmVzdC5pc3N1ZXMubGlzdEZvclJlcG8oeyBvd25lcjogY29udGV4dC5yZXBvLm93bmVyLCByZXBvOiBjb250ZXh0LnJlcG8ucmVwbywgc3RhdGU6ICdvcGVuJywgbGFiZWxzOiBbJ2RyaWZ0LWRldGVjdGlvbicsICcke3N0YWNrfSddIH0pO2AsXG4gICAgJ2xldCBpc3N1ZU51bWJlcjsnLFxuICAgICdpZiAoaXNzdWVzLmRhdGEubGVuZ3RoID09PSAwKSB7JyxcbiAgICBgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgZ2l0aHViLnJlc3QuaXNzdWVzLmNyZWF0ZSh7IG93bmVyOiBjb250ZXh0LnJlcG8ub3duZXIsIHJlcG86IGNvbnRleHQucmVwby5yZXBvLCB0aXRsZSwgYm9keSwgbGFiZWxzOiBbJ2RyaWZ0LWRldGVjdGlvbicsICcke3N0YWNrfSddIH0pO2AsXG4gICAgJyAgaXNzdWVOdW1iZXIgPSBjcmVhdGVkLmRhdGEubnVtYmVyOycsXG4gICAgJ30gZWxzZSB7JyxcbiAgICAnICBjb25zdCBpc3N1ZSA9IGlzc3Vlcy5kYXRhWzBdOycsXG4gICAgJyAgaXNzdWVOdW1iZXIgPSBpc3N1ZS5udW1iZXI7JyxcbiAgICAnICBhd2FpdCBnaXRodWIucmVzdC5pc3N1ZXMuY3JlYXRlQ29tbWVudCh7IG93bmVyOiBjb250ZXh0LnJlcG8ub3duZXIsIHJlcG86IGNvbnRleHQucmVwby5yZXBvLCBpc3N1ZV9udW1iZXI6IGlzc3VlLm51bWJlciwgYm9keSB9KTsnLFxuICAgICd9JyxcbiAgICAncmV0dXJuIFN0cmluZyhpc3N1ZU51bWJlciA/PyBcIlwiKTsnLFxuICBdO1xuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cblxuZnVuY3Rpb24gc3VtbWFyeVNjcmlwdCgpOiBzdHJpbmcge1xuICByZXR1cm4gW1xuICAgICcjIS9iaW4vYmFzaCcsXG4gICAgJ3NldCAtZScsXG4gICAgJ2VjaG8gXCIjIyBEcmlmdCBEZXRlY3Rpb24gU3VtbWFyeVwiID4+ICRHSVRIVUJfU1RFUF9TVU1NQVJZJyxcbiAgICAnZWNobyBcIlwiID4+ICRHSVRIVUJfU1RFUF9TVU1NQVJZJyxcbiAgICAnJyxcbiAgICAndG90YWxfc3RhY2tzPTAnLFxuICAgICd0b3RhbF9kcmlmdGVkPTAnLFxuICAgICd0b3RhbF9lcnJvcnM9MCcsXG4gICAgJycsXG4gICAgJ3Nob3B0IC1zIG51bGxnbG9iJyxcbiAgICAnZm9yIGZpbGUgaW4gZHJpZnQtcmVzdWx0cy0qLmpzb24gZHJpZnQtcmVzdWx0cy8qL2RyaWZ0LXJlc3VsdHMtKi5qc29uOyBkbycsXG4gICAgJyAgaWYgW1sgLWYgXCIkZmlsZVwiIF1dOyB0aGVuJyxcbiAgICAnICAgIHN0YWNrPSQoYmFzZW5hbWUgXCIkZmlsZVwiIHwgc2VkIC1FIFxcXCJzL15kcmlmdC1yZXN1bHRzLShbXi5dKylcXFxcLmpzb24kL1xcXFwxL1xcXCIpJyxcbiAgICAnICAgIGVjaG8gXCIjIyMgU3RhY2s6ICRzdGFja1wiID4+ICRHSVRIVUJfU1RFUF9TVU1NQVJZJyxcbiAgICAnICAgIGpxIC1yIFxcJycgK1xuICAgICAgJy4gYXMgJHJlc3VsdHMgfFxcbicgK1xuICAgICAgJ1wiLSBUb3RhbCBzdGFja3M6IFwiICsgKCRyZXN1bHRzIHwgbGVuZ3RoIHwgdG9zdHJpbmcpICsgXCJcXFxcblwiICtcXG4nICtcbiAgICAgICdcIi0gRHJpZnRlZDogXCIgKyAoWy5bXSB8IHNlbGVjdCguZHJpZnRTdGF0dXMgPT0gXCJEUklGVEVEXCIpXSB8IGxlbmd0aCB8IHRvc3RyaW5nKSArIFwiXFxcXG5cIiArXFxuJyArXG4gICAgICAnXCItIEVycm9yczogXCIgKyAoWy5bXSB8IHNlbGVjdCguZXJyb3IpXSB8IGxlbmd0aCB8IHRvc3RyaW5nKSArIFwiXFxcXG5cIiArXFxuJyArXG4gICAgICAnKFsuW10gfCBzZWxlY3QoLmRyaWZ0U3RhdHVzID09IFwiRFJJRlRFRFwiKV0gfCBpZiBsZW5ndGggPiAwIHRoZW4gXCJcXFxcbioqRHJpZnRlZCBzdGFja3M6KipcXFxcblwiICsgKG1hcChcIiAgLSBcIiArIC5zdGFja05hbWUgKyBcIiAoXCIgKyAoKC5kcmlmdGVkUmVzb3VyY2VzIC8vIFtdKSB8IGxlbmd0aCB8IHRvc3RyaW5nKSArIFwiIHJlc291cmNlcylcIikgfCBqb2luKFwiXFxcXG5cIikpIGVsc2UgXCJcIiBlbmQpXFxuJyArXG4gICAgJ1xcJycgK1xuICAgICcgXCIkZmlsZVwiID4+ICRHSVRIVUJfU1RFUF9TVU1NQVJZJyxcbiAgICAnICAgIGVjaG8gXCJcIiA+PiAkR0lUSFVCX1NURVBfU1VNTUFSWScsXG4gICAgJyAgICB0b3RhbF9zdGFja3M9JCgodG90YWxfc3RhY2tzICsgJChqcSBcXFwibGVuZ3RoXFxcIiBcXFwiJGZpbGVcXFwiKSkpJyxcbiAgICAnICAgIHRvdGFsX2RyaWZ0ZWQ9JCgodG90YWxfZHJpZnRlZCArICQoanEgXFxcIlsuW10gfCBzZWxlY3QoLmRyaWZ0U3RhdHVzID09IFxcXFxcXFwiRFJJRlRFRFxcXFxcXFwiKV0gfCBsZW5ndGhcXFwiIFxcXCIkZmlsZVxcXCIpKSknLFxuICAgICcgICAgdG90YWxfZXJyb3JzPSQoKHRvdGFsX2Vycm9ycyArICQoanEgXFxcIlsuW10gfCBzZWxlY3QoLmVycm9yKV0gfCBsZW5ndGhcXFwiIFxcXCIkZmlsZVxcXCIpKSknLFxuICAgICcgIGZpJyxcbiAgICAnZG9uZScsXG4gICAgJycsXG4gICAgJ2VjaG8gXCIjIyMgT3ZlcmFsbCBTdW1tYXJ5XCIgPj4gJEdJVEhVQl9TVEVQX1NVTU1BUlknLFxuICAgICdlY2hvIFwiLSBUb3RhbCBzdGFja3MgY2hlY2tlZDogJHRvdGFsX3N0YWNrc1wiID4+ICRHSVRIVUJfU1RFUF9TVU1NQVJZJyxcbiAgICAnZWNobyBcIi0gVG90YWwgZHJpZnRlZCBzdGFja3M6ICR0b3RhbF9kcmlmdGVkXCIgPj4gJEdJVEhVQl9TVEVQX1NVTU1BUlknLFxuICAgICdlY2hvIFwiLSBUb3RhbCBlcnJvcnM6ICR0b3RhbF9lcnJvcnNcIiA+PiAkR0lUSFVCX1NURVBfU1VNTUFSWScsXG4gICAgJycsXG4gICAgJ2lmIFtbICR0b3RhbF9kcmlmdGVkIC1ndCAwIF1dOyB0aGVuJyxcbiAgICAnICBlY2hvIFwiXCIgPj4gJEdJVEhVQl9TVEVQX1NVTU1BUlknLFxuICAgICcgIGVjaG8gXCLimqDvuI8gKipBY3Rpb24gcmVxdWlyZWQ6KiogRHJpZnQgZGV0ZWN0ZWQgaW4gJHRvdGFsX2RyaWZ0ZWQgc3RhY2tzXCIgPj4gJEdJVEhVQl9TVEVQX1NVTU1BUlknLFxuICAgICdmaScsXG4gIF0uam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIHRvS2ViYWJDYXNlKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzLnJlcGxhY2UoL1teYS16QS1aMC05XSsvZywgJy0nKS5yZXBsYWNlKC9eLSt8LSskL2csICcnKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5cbmZ1bmN0aW9uIGJ1aWxkV29ya2Zsb3dGaWxlTmFtZShiYXNlTmFtZTogc3RyaW5nLCBleHQ6IHN0cmluZyA9ICcueW1sJywgbWF4TGVuZ3RoOiBudW1iZXIgPSBNQVhfV09SS0ZMT1dfRklMRU5BTUVfTEVOR1RIKTogc3RyaW5nIHtcbiAgY29uc3QgZnVsbCA9IGAke2Jhc2VOYW1lfSR7ZXh0fWA7XG4gIGlmIChmdWxsLmxlbmd0aCA8PSBtYXhMZW5ndGgpIHtcbiAgICByZXR1cm4gZnVsbDtcbiAgfVxuICBjb25zdCBhdmFpbGFibGUgPSBtYXhMZW5ndGggLSBleHQubGVuZ3RoO1xuICBpZiAoYXZhaWxhYmxlIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFdvcmtmbG93IGV4dGVuc2lvbiBleGNlZWRzIG1heGltdW0gZmlsZW5hbWUgbGVuZ3RoIG9mICR7bWF4TGVuZ3RofWApO1xuICB9XG4gIC8vIFRydW5jYXRlIGZyb20gdGhlIGJlZ2lubmluZyB0byBrZWVwIHRoZSBlbmQgaW50YWN0XG4gIHJldHVybiBiYXNlTmFtZS5zbGljZSgtYXZhaWxhYmxlKS5yZXBsYWNlKC9eLSsvLCAnJykgKyBleHQ7XG59XG5cbmZ1bmN0aW9uIHRvR2l0aHViSm9iSWQoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gR2l0SHViIGpvYl9pZCBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgb3IgdW5kZXJzY29yZSBhbmQgY29udGFpbiBvbmx5IEEtWmEtejAtOSwgJy0nLCAnXydcbiAgLy8gMSkgUmVwbGFjZSBhbnkgZGlzYWxsb3dlZCBjaGFycyB3aXRoICctJ1xuICBsZXQgb3V0ID0gcy5yZXBsYWNlKC9bXkEtWmEtejAtOV8tXSsvZywgJy0nKTtcbiAgLy8gMikgQ29sbGFwc2UgY29uc2VjdXRpdmUgZGFzaGVzXG4gIG91dCA9IG91dC5yZXBsYWNlKC8tKy9nLCAnLScpO1xuICAvLyAzKSBUcmltIGxlYWRpbmcvdHJhaWxpbmcgZGFzaGVzICh1bmRlcnNjb3JlcyBhcmUgYWxsb3dlZCBhdCBzdGFydClcbiAgb3V0ID0gb3V0LnJlcGxhY2UoL14tK3wtKyQvZywgJycpO1xuICAvLyA0KSBMb3dlcmNhc2UgZm9yIGNvbnNpc3RlbmN5IChub3QgcmVxdWlyZWQgYnkgR2l0SHViIGJ1dCBrZWVwcyB0aGluZ3Mgc3RhYmxlKVxuICBvdXQgPSBvdXQudG9Mb3dlckNhc2UoKTtcbiAgLy8gNSkgRW5zdXJlIGl0IHN0YXJ0cyB3aXRoIGEgbGV0dGVyIG9yIHVuZGVyc2NvcmVcbiAgaWYgKCFvdXQgfHwgIS9eW2Etel9dL2kudGVzdChvdXQpKSB7XG4gICAgb3V0ID0gYHMtJHtvdXR9YDtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIl19
|
|
@@ -79,7 +79,7 @@ class CdkDriftIamTemplateGenerator {
|
|
|
79
79
|
}
|
|
80
80
|
exports.CdkDriftIamTemplateGenerator = CdkDriftIamTemplateGenerator;
|
|
81
81
|
_a = JSII_RTTI_SYMBOL_1;
|
|
82
|
-
CdkDriftIamTemplateGenerator[_a] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDriftIamTemplateGenerator", version: "1.
|
|
82
|
+
CdkDriftIamTemplateGenerator[_a] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDriftIamTemplateGenerator", version: "1.8.0" };
|
|
83
83
|
/**
|
|
84
84
|
* Projen construct that emits a CloudFormation template with minimal IAM permissions
|
|
85
85
|
* for the CDK Drift Detection Workflow.
|
|
@@ -102,5 +102,5 @@ class CdkDriftIamTemplate {
|
|
|
102
102
|
}
|
|
103
103
|
exports.CdkDriftIamTemplate = CdkDriftIamTemplate;
|
|
104
104
|
_b = JSII_RTTI_SYMBOL_1;
|
|
105
|
-
CdkDriftIamTemplate[_b] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDriftIamTemplate", version: "1.
|
|
105
|
+
CdkDriftIamTemplate[_b] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDriftIamTemplate", version: "1.8.0" };
|
|
106
106
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2RrRHJpZnRJYW1UZW1wbGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9DZGtEcmlmdElhbVRlbXBsYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQWtDO0FBY2xDOzs7R0FHRztBQUNILE1BQWEsNEJBQTRCO0lBQ3ZDOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQXdDO1FBQzlELE1BQU0sS0FBSyxHQUFHO1lBQ1osd0NBQXdDO1lBQ3hDLDBEQUEwRDtZQUMxRCxFQUFFO1lBQ0YsYUFBYTtZQUNiLHNCQUFzQjtZQUN0QixrQkFBa0I7WUFDbEIseUZBQXlGO1lBQ3pGLGlCQUFpQixLQUFLLENBQUMsV0FBVyxHQUFHO1lBQ3JDLEVBQUU7WUFDRixZQUFZO1lBQ1osOEZBQThGO1lBQzlGLGlCQUFpQjtZQUNqQiwwQkFBMEI7WUFDMUIsaUJBQWlCO1lBQ2pCLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxRQUFRLEdBQUcsR0FBRztZQUMxQyxpQ0FBaUM7WUFDakMsK0JBQStCO1lBQy9CLG9CQUFvQjtZQUNwQiwyQkFBMkI7WUFDM0Isd0JBQXdCO1lBQ3hCLDJDQUEyQztZQUMzQyxvQ0FBb0M7WUFDcEMsd0JBQXdCO1lBQ3hCLDZCQUE2QjtZQUM3Qix3Q0FBd0MsR0FBRyxLQUFLLENBQUMsVUFBVSxHQUFHLEdBQUc7WUFDakUsaUJBQWlCO1lBQ2pCLGlEQUFpRDtZQUNqRCwyQkFBMkI7WUFDM0IsbUNBQW1DO1lBQ25DLHdCQUF3QjtZQUN4QiwyREFBMkQ7WUFDM0QsK0JBQStCO1lBQy9CLHlCQUF5QjtZQUN6QixxREFBcUQ7WUFDckQsc0VBQXNFO1lBQ3RFLGdFQUFnRTtZQUNoRSxtREFBbUQ7WUFDbkQsdURBQXVEO1lBQ3ZELDZEQUE2RDtZQUM3RCwrQkFBK0I7WUFDL0IsRUFBRTtZQUNGLFVBQVU7WUFDVixvQkFBb0I7WUFDcEIsd0RBQXdEO1lBQ3hELHFDQUFxQztZQUNyQyxhQUFhO1lBQ2Isc0RBQXNEO1lBQ3RELEVBQUU7WUFDRixxQkFBcUI7WUFDckIseURBQXlEO1lBQ3pELDhCQUE4QjtZQUM5QixhQUFhO1lBQ2IsdURBQXVEO1NBQ3hELENBQUM7UUFFRixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLHFCQUFxQixDQUFDLGVBQXVCLHNDQUFzQztRQUN4RixPQUFPLDZDQUE2QyxZQUFZLCtFQUErRSxDQUFDO0lBQ2xKLENBQUM7O0FBckVILG9FQXNFQzs7O0FBWUQ7Ozs7O0dBS0c7QUFDSCxNQUFhLG1CQUFtQjtJQUM5QixZQUFZLEtBQStCO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLElBQUksc0NBQXNDLENBQUM7UUFFOUUsd0NBQXdDO1FBQ3hDLE1BQU0sUUFBUSxHQUFHLDRCQUE0QixDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RFLElBQUksaUJBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV6RSxrQkFBa0I7UUFDbEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsOEJBQThCLEVBQUU7WUFDcEQsV0FBVyxFQUNULHVJQUF1STtZQUN6SSxXQUFXLEVBQUUsSUFBSTtZQUNqQixJQUFJLEVBQUUsNEJBQTRCLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDO1NBQ3JFLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBZkgsa0RBZ0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGV4dEZpbGUgfSBmcm9tICdwcm9qZW4nO1xuXG4vKipcbiAqIFByb3BzIGZvciBnZW5lcmF0aW5nIENESyBEcmlmdCBJQU0gdGVtcGxhdGVzIChubyBQcm9qZW4gZGVwZW5kZW5jeSlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZGtEcmlmdElhbVRlbXBsYXRlR2VuZXJhdG9yUHJvcHMge1xuICAvKiogTmFtZSBmb3IgdGhlIElBTSByb2xlICovXG4gIHJlYWRvbmx5IHJvbGVOYW1lOiBzdHJpbmc7XG4gIC8qKiBBUk4gb2YgdGhlIGV4aXN0aW5nIEdpdEh1YiBPSURDIHJvbGUgdGhhdCBjYW4gYXNzdW1lIHRoaXMgZHJpZnQgcm9sZSAqL1xuICByZWFkb25seSBvaWRjUm9sZUFybjogc3RyaW5nO1xuICAvKiogUmVnaW9uIGZvciB0aGUgT0lEQyB0cnVzdCBjb25kaXRpb24gKi9cbiAgcmVhZG9ubHkgb2lkY1JlZ2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFB1cmUgZ2VuZXJhdG9yIGNsYXNzIGZvciBDREsgRHJpZnQgSUFNIHRlbXBsYXRlcy5cbiAqIE5vIFByb2plbiBkZXBlbmRlbmN5IC0gY2FuIGJlIHVzZWQgaW4gYW55IHByb2plY3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBDZGtEcmlmdElhbVRlbXBsYXRlR2VuZXJhdG9yIHtcbiAgLyoqXG4gICAqIEdlbmVyYXRlIHRoZSBDbG91ZEZvcm1hdGlvbiBJQU0gdGVtcGxhdGUgYXMgYSBZQU1MIHN0cmluZy5cbiAgICovXG4gIHN0YXRpYyBnZW5lcmF0ZVRlbXBsYXRlKHByb3BzOiBDZGtEcmlmdElhbVRlbXBsYXRlR2VuZXJhdG9yUHJvcHMpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgXCJBV1NUZW1wbGF0ZUZvcm1hdFZlcnNpb246ICcyMDEwLTA5LTA5J1wiLFxuICAgICAgXCJEZXNjcmlwdGlvbjogJ0lBTSByb2xlIGZvciBDREsgRHJpZnQgRGV0ZWN0aW9uIFdvcmtmbG93J1wiLFxuICAgICAgJycsXG4gICAgICAnUGFyYW1ldGVyczonLFxuICAgICAgJyAgR2l0SHViT0lEQ1JvbGVBcm46JyxcbiAgICAgICcgICAgVHlwZTogU3RyaW5nJyxcbiAgICAgIFwiICAgIERlc2NyaXB0aW9uOiAnQVJOIG9mIHRoZSBleGlzdGluZyBHaXRIdWIgT0lEQyByb2xlIHRoYXQgY2FuIGFzc3VtZSB0aGlzIGRyaWZ0IHJvbGUnXCIsXG4gICAgICBgICAgIERlZmF1bHQ6ICcke3Byb3BzLm9pZGNSb2xlQXJufSdgLFxuICAgICAgJycsXG4gICAgICAnUmVzb3VyY2VzOicsXG4gICAgICAnICAjIENsb3VkRm9ybWF0aW9uIERyaWZ0IERldGVjdGlvbiBSb2xlIC0gbWluaW1hbCBwZXJtaXNzaW9ucyBmb3IgZHJpZnQgZGV0ZWN0aW9uIG9wZXJhdGlvbnMnLFxuICAgICAgJyAgQ2RrRHJpZnRSb2xlOicsXG4gICAgICAnICAgIFR5cGU6IEFXUzo6SUFNOjpSb2xlJyxcbiAgICAgICcgICAgUHJvcGVydGllczonLFxuICAgICAgXCIgICAgICBSb2xlTmFtZTogJ1wiICsgcHJvcHMucm9sZU5hbWUgKyBcIidcIixcbiAgICAgICcgICAgICBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQ6JyxcbiAgICAgIFwiICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNydcIixcbiAgICAgICcgICAgICAgIFN0YXRlbWVudDonLFxuICAgICAgJyAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnLFxuICAgICAgJyAgICAgICAgICAgIFByaW5jaXBhbDonLFxuICAgICAgJyAgICAgICAgICAgICAgQVdTOiAhUmVmIEdpdEh1Yk9JRENSb2xlQXJuJyxcbiAgICAgICcgICAgICAgICAgICBBY3Rpb246IHN0czpBc3N1bWVSb2xlJyxcbiAgICAgICcgICAgICAgICAgICBDb25kaXRpb246JyxcbiAgICAgICcgICAgICAgICAgICAgIFN0cmluZ0VxdWFsczonLFxuICAgICAgXCIgICAgICAgICAgICAgICAgYXdzOlJlcXVlc3RlZFJlZ2lvbjogJ1wiICsgcHJvcHMub2lkY1JlZ2lvbiArIFwiJ1wiLFxuICAgICAgJyAgICAgIFBvbGljaWVzOicsXG4gICAgICAnICAgICAgICAtIFBvbGljeU5hbWU6IENsb3VkRm9ybWF0aW9uRHJpZnRBY2Nlc3MnLFxuICAgICAgJyAgICAgICAgICBQb2xpY3lEb2N1bWVudDonLFxuICAgICAgXCIgICAgICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNydcIixcbiAgICAgICcgICAgICAgICAgICBTdGF0ZW1lbnQ6JyxcbiAgICAgICcgICAgICAgICAgICAgICMgQ2xvdWRGb3JtYXRpb24gZHJpZnQgZGV0ZWN0aW9uIG9wZXJhdGlvbnMnLFxuICAgICAgJyAgICAgICAgICAgICAgLSBFZmZlY3Q6IEFsbG93JyxcbiAgICAgICcgICAgICAgICAgICAgICAgQWN0aW9uOicsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpEZXRlY3RTdGFja0RyaWZ0JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkRlc2NyaWJlU3RhY2tEcmlmdERldGVjdGlvblN0YXR1cycsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpEZXNjcmliZVN0YWNrUmVzb3VyY2VEcmlmdHMnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246RGVzY3JpYmVTdGFja3MnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246TGlzdFN0YWNrUmVzb3VyY2VzJyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkRldGVjdFN0YWNrUmVzb3VyY2VEcmlmdCcsXG4gICAgICBcIiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJyonXCIsXG4gICAgICAnJyxcbiAgICAgICdPdXRwdXRzOicsXG4gICAgICAnICBDZGtEcmlmdFJvbGVBcm46JyxcbiAgICAgIFwiICAgIERlc2NyaXB0aW9uOiAnQVJOIG9mIHRoZSBDREsgZHJpZnQgZGV0ZWN0aW9uIHJvbGUnXCIsXG4gICAgICAnICAgIFZhbHVlOiAhR2V0QXR0IENka0RyaWZ0Um9sZS5Bcm4nLFxuICAgICAgJyAgICBFeHBvcnQ6JyxcbiAgICAgIFwiICAgICAgTmFtZTogIVN1YiAnJHtBV1M6OlN0YWNrTmFtZX0tQ2RrRHJpZnRSb2xlQXJuJ1wiLFxuICAgICAgJycsXG4gICAgICAnICBDZGtEcmlmdFJvbGVOYW1lOicsXG4gICAgICBcIiAgICBEZXNjcmlwdGlvbjogJ05hbWUgb2YgdGhlIENESyBkcmlmdCBkZXRlY3Rpb24gcm9sZSdcIixcbiAgICAgICcgICAgVmFsdWU6ICFSZWYgQ2RrRHJpZnRSb2xlJyxcbiAgICAgICcgICAgRXhwb3J0OicsXG4gICAgICBcIiAgICAgIE5hbWU6ICFTdWIgJyR7QVdTOjpTdGFja05hbWV9LUNka0RyaWZ0Um9sZU5hbWUnXCIsXG4gICAgXTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0aGUgQVdTIENMSSBkZXBsb3kgY29tbWFuZCBmb3IgdGhlIElBTSB0ZW1wbGF0ZS5cbiAgICovXG4gIHN0YXRpYyBnZW5lcmF0ZURlcGxveUNvbW1hbmQodGVtcGxhdGVQYXRoOiBzdHJpbmcgPSAnY2RrLWRyaWZ0LXdvcmtmbG93LWlhbS10ZW1wbGF0ZS55YW1sJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBhd3MgY2xvdWRmb3JtYXRpb24gZGVwbG95IC0tdGVtcGxhdGUtZmlsZSAke3RlbXBsYXRlUGF0aH0gLS1zdGFjay1uYW1lIGNkay1kcmlmdC13b3JrZmxvdy1pYW0tcm9sZSAtLWNhcGFiaWxpdGllcyBDQVBBQklMSVRZX05BTUVEX0lBTWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFByb2plbi1pbnRlZ3JhdGVkIENESyBEcmlmdCBJQU0gdGVtcGxhdGUgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrRHJpZnRJYW1UZW1wbGF0ZVByb3BzIGV4dGVuZHMgQ2RrRHJpZnRJYW1UZW1wbGF0ZUdlbmVyYXRvclByb3BzIHtcbiAgLyoqIFByb2plbiBwcm9qZWN0IGluc3RhbmNlICovXG4gIHJlYWRvbmx5IHByb2plY3Q6IGFueTtcbiAgLyoqIE91dHB1dCBwYXRoIGZvciB0aGUgdGVtcGxhdGUgZmlsZSAoZGVmYXVsdDogJ2Nkay1kcmlmdC13b3JrZmxvdy1pYW0tdGVtcGxhdGUueWFtbCcpICovXG4gIHJlYWRvbmx5IG91dHB1dFBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvamVuIGNvbnN0cnVjdCB0aGF0IGVtaXRzIGEgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgd2l0aCBtaW5pbWFsIElBTSBwZXJtaXNzaW9uc1xuICogZm9yIHRoZSBDREsgRHJpZnQgRGV0ZWN0aW9uIFdvcmtmbG93LlxuICpcbiAqIEZvciBub24tUHJvamVuIHByb2plY3RzLCB1c2UgYENka0RyaWZ0SWFtVGVtcGxhdGVHZW5lcmF0b3JgIGRpcmVjdGx5LlxuICovXG5leHBvcnQgY2xhc3MgQ2RrRHJpZnRJYW1UZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBDZGtEcmlmdElhbVRlbXBsYXRlUHJvcHMpIHtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcHJvcHMub3V0cHV0UGF0aCA/PyAnY2RrLWRyaWZ0LXdvcmtmbG93LWlhbS10ZW1wbGF0ZS55YW1sJztcblxuICAgIC8vIEdlbmVyYXRlIHRlbXBsYXRlIHVzaW5nIHRoZSBnZW5lcmF0b3JcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IENka0RyaWZ0SWFtVGVtcGxhdGVHZW5lcmF0b3IuZ2VuZXJhdGVUZW1wbGF0ZShwcm9wcyk7XG4gICAgbmV3IFRleHRGaWxlKHByb3BzLnByb2plY3QsIG91dHB1dFBhdGgsIHsgbGluZXM6IHRlbXBsYXRlLnNwbGl0KCdcXG4nKSB9KTtcblxuICAgIC8vIEFkZCBkZXBsb3kgdGFza1xuICAgIHByb3BzLnByb2plY3QuYWRkVGFzaygnZGVwbG95LWNka2RyaWZ0LWlhbS10ZW1wbGF0ZScsIHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnRGVwbG95IHRoZSBDREsgRHJpZnQgRGV0ZWN0aW9uIElBTSB0ZW1wbGF0ZSB2aWEgQ2xvdWRGb3JtYXRpb24gKGFjY2VwdHMgZXh0cmEgQVdTIENMSSBhcmdzLCBlLmcuLCAtLXBhcmFtZXRlci1vdmVycmlkZXMgS2V5PVZhbHVlLi4uKScsXG4gICAgICByZWNlaXZlQXJnczogdHJ1ZSxcbiAgICAgIGV4ZWM6IENka0RyaWZ0SWFtVGVtcGxhdGVHZW5lcmF0b3IuZ2VuZXJhdGVEZXBsb3lDb21tYW5kKG91dHB1dFBhdGgpLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|